ZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9DSEFOR0VMT0cgYi9zb3VuZC9vc3MvQ0hBTkdFTE9HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDZjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvQ0hBTkdFTE9HCkBAIC0wLDAgKzEsMzY5IEBACitOb3RlIHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIEhhbm51J3MgY29kZSBhbmQgZG9uJ3QgaW5jbHVkZSB0aGUgY2hhbmdlcworbWFkZSBvdXRzaWRlIG9mIHRoaXMgZm9yIG1vZHVsYXJpc2luZyB0aGUgc291bmQKKworQ2hhbmdlbG9nIGZvciB2ZXJzaW9uIDMuOG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NpbmNlIDMuOGgKKy0gSW5jbHVkZWQgc3VwcG9ydCBmb3IgT1BMMy1TQTEgYW5kIFNvZnRPU1MKKworU2luY2UgMy44CistIEZpeGVkIFNORENUTF9EU1BfR0VUT1NQQUNFCistIENvbXBhdGliaWxpdHkgZml4ZXMgZm9yIExpbnV4IDIuMS40NworCitTaW5jZSAzLjgtYmV0YTIxCistIEZpeGVkIGFsbCBrbm93biBidWdzIChJIHRoaW5rKS4KKworU2luY2UgMy44LWJldGE4CistIExvdCBvZiBmaXhlcyB0byBhdWRpbyBwbGF5YmFjayBjb2RlIGluIGRtYWJ1Zi5jCisKK1NpbmNlIDMuOC1iZXRhNgorLSBGaXhlZCB0aGUgZmFtb3VzIFF1YWtlIGRlbGF5IGJ1Zy4KKworU2luY2UgMy44LWJldGE1CistIEZpeGVkIG1hbnkgYnVncyBpbiBhdWRpbyBwbGF5YmFjay4KKworU2luY2UgMy44LWJldGE0CistIEp1c3QgbWlub3IgY2hhbmdlcy4KKworU2luY2UgMy44LWJldGExCistIE1ham9yIHJld3JpdGUgb2YgYXVkaW8gcGxheWJhY2sgaGFuZGxpbmcuCistIEFkZGVkIEFXRTMyIHN1cHBvcnQgYnkgVGFrYXNoaSBJd2FpIChpbiAuL2xvd2xldmVsLykuCisKK1NpbmNlIDMuNy1iZXRhIworLSBQYXNzaW5nIG9mIGlvY3RsKCkgcGFyYW1ldGVycyBiZXR3ZWVuIHNvdW5kY2FyZC5jIGFuZCBvdGhlciBtb2R1bGVzIGhhcyBiZWVuCitjaGFuZ2VkIHNvIHRoYXQgYXJnIGFsd2F5cyBwb2ludHMgdG8ga2VybmVsIHNwYWNlLgorLSBTb21lIGJ1Z2ZpeGVzLgorCitTaW5jZSAzLjctYmV0YTUKKy0gRGlzYWJsZWQgTUlESSBpbnB1dCB3aXRoIEdVUyBQblAgKEludGVyd2F2ZSkuIFRoZXJlIHNlZW1zIHRvIGJlIGNvbnN0YW50CitzdHJlYW0gb2YgcmVjZWl2ZWQgMHgwMCBieXRlcyB3aGVuIHRoZSBNSURJIHJlY2VpdmVyIGlzIGVuYWJsZWQuCisKK1NpbmNlIDMuNQorLSBDaGFuZ2VzIGFsbW9zdCBldmVyeXdoZXJlLgorLSBTdXBwb3J0IGZvciBPUFRpIDgyQzkyNC1iYXNlZCBzb3VuZCBjYXJkcy4KKworU2luY2UgMy41LjQtYmV0YTgKKy0gRml4ZWQgYSBidWcgaW4gaGFuZGxpbmcgb2Ygbm9uLWZyYWdtZW50IHNpemVkIHdyaXRlcyBpbiAxNiBiaXQvc3RlcmVvIG1vZGUKKyAgd2l0aCBHVVMuCistIExpbWl0ZWQgbWluaW11bSBmcmFnbWVudCBzaXplIHdpdGggc29tZSBhdWRpbyBkZXZpY2VzIChHVVM9NTEyIGFuZAorICBTQj0zMikuIFRoZXNlIGRldmljZXMgcmVxdWlyZSBtb3JlIHRpbWUgdG8gInJlY292ZXIiIGZyb20gcHJvY2Vzc2luZworICBvZiBlYWNoIGZyYWdtZW50LiAKKworU2luY2UgMy41LjQtYmV0YTYvNworLSBUaGVyZSBzZWVtcyB0byBiZSBwcm9ibGVtcyBpbiB0aGUgT1BUaSA4MkM5MzAgc28gY2FyZHMgYmFzZWQgb24gdGhpcworICBjaGlwIGRvbid0IG5lY2Vzc2FyaWx5IHdvcmsgeWV0LiBUaGVyZSBhcmUgcHJvYmxlbXMgaW4gZGV0ZWN0aW5nIHRoZSAKKyAgTUlESSBpbnRlcmZhY2UuIEFsc28gbWl4ZXIgdm9sdW1lcyBtYXkgYmUgc2VyaW91c2x5IHdyb25nIG9uIHNvbWUgc3lzdGVtcy4KKyAgWW91IGNhbiBzYWZlbHkgdXNlIHRoaXMgZHJpdmVyIHZlcnNpb24gd2l0aCBDOTMwIGlmIGl0IGxvb2tzIHRvIHdvcmsuCisgIEhvd2V2ZXIgcGxlYXNlIGRvbid0IGNvbXBsYWluIGlmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggaXQuIEM5MzAgc3VwcG9ydAorICBzaG91bGQgYmUgZml4ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLgorLSBHb3QgaW5pdGlhbGl6YXRpb24gb2YgR1VTIFBuUCB0byB3b3JrLiBXaXRoIHRoaXMgdmVyc2lvbiBHVVMgUG5QIHNob3VsZAorICB3b3JrIGluIEdVUyBjb21wYXRpYmxlIG1vZGUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdXNpbmcgaXNhcG5wdG9vbHMuCistIEZpeGVkIGEgYnVnIGluIGhhbmRsaW5nIG9mIGZ1bGwgZHVwbGV4IGNhcmRzIGluIHdyaXRlIG9ubHkgbW9kZS4gVGhpcyBoYXMKKyAgYmVlbiBjYXVzaW5nICJhdWRpbyBkZXZpY2Ugb3BlbmluZyIgZXJyb3JzIHdpdGggUmVhbEF1ZGlvIHBsYXllci4KKworU2luY2UgMy41LjQuYmV0YTUKKy0gQ2hhbmdlcyB0byBPUFRpIDgyQzkzMCBkcml2ZXIuCistIE1ham9yIGNoYW5nZXMgdG8gdGhlIFNvdW5kc2NhcGUgZHJpdmVyLiBUaGUgZHJpdmVyIHJlcXVpcmVzIG5vdyBqdXN0IG9uZQorICBETUEgY2hhbm5lbC4gVGhlIGV4dHJhIGF1ZGlvL2RzcCBkZXZpY2UgKHRoZSAiTm90IGZ1bmN0aW9uYWwiIG9uZSkgdXNlZAorICBmb3IgY29kZSBkb3dubG9hZCBpbiB0aGUgZWFybGllciB2ZXJzaW9ucyBoYXMgYmVlbiBlbGltaW5hdGVkLiBUaGVyZSBpcyBub3cKKyAganVzdCBvbmUgL2Rldi9kc3AjIGRldmljZSB3aGljaCBpcyB1c2VkIGJvdGggZm9yIGNvZGUgZG93bmxvYWQgYW5kIGF1ZGlvLgorCitTaW5jZSAzLjUuNC5iZXRhNAorLSBNaW5vciBjaGFuZ2VzLgorCitTaW5jZSAzLjUuNC1iZXRhMgorLSBGaXhlZCBzaWxlbnQgcGxheWJhY2sgd2l0aCBFU1MgNjg4LzE2ODguCistIEdvdCBTQjE2IHRvIHdvcmsgd2l0aG91dCB0aGUgMTYgYml0IERNQSBjaGFubmVsIChvbmx5IHRoZSA4IGJpdCBvbmUKKyAgaXMgcmVxdWlyZWQgZm9yIDggYW5kIDE2IGJpdCBtb2RlcykuCistIEFkZGVkIHRoZSAibG93bGV2ZWwiIHN1YmRpcmVjdG9yeSBmb3IgYWRkaXRpb25hbCBsb3cgbGV2ZWwgZHJpdmVycyB0aGF0CisgIGFyZSBub3QgcGFydCBvZiBVU1MgY29yZS4gU2VlIGxvd2xldmVsL1JFQURNRSBmb3IgbW9yZSBpbmZvLgorLSBJbmNsdWRlZCBzdXBwb3J0IGZvciBBQ0kgbWl4ZXIgKGJ5IE1hcmt1cyBLdWhuKS4gQUNJIGlzIGEgbWl4ZXIgdXNlZCBpbgorICBtaXJvUENNIHNvdW5kIGNhcmRzLiBTZWUgbG93bGV2ZWwvYWNpLnJlYWRtZSBmb3IgbW9yZSBpbmZvLgorLSBTdXBwb3J0IGZvciBBenRlY2ggV2FzaGluZ3RvbiBjaGlwc2V0IChBWlQyMzE2IEFTSUMpLgorCitTaW5jZSAzLjUuNC1iZXRhMQorLSBSZWR1Y2VkIGNsaWNraW5nIHdpdGggQUQxODQ4LgorLSBTdXBwb3J0IGZvciBPUFRpIDgyQzkzMC4gT25seSBoYWxmIGR1cGxleCBhdCB0aGlzIHRpbWUuIDE2IGJpdCBwbGF5YmFjaworICBpcyBzb21ldGltZXMganVzdCB3aGl0ZSBub2lzZSAob2NjdXJzIHJhbmRvbWx5KS4KKworU2luY2UgMy41LjIKKy0gTWFqb3IgY2hhbmdlcyB0byB0aGUgU0IvSmF6ejE2L0VTUyBkcml2ZXIgKG1vc3QgcGFydHMgcmV3cml0dGVuKS4KKyAgVGhlIG1vc3Qgbm90aWNlYWJsZSBuZXcgZmVhdHVyZSBpcyBzdXBwb3J0IGZvciBtdWx0aXBsZSBTQiBjYXJkcyBhdCB0aGUgc2FtZQorICB0aW1lLgorLSBSZW5hbWVkIHNiMTZfbWlkaS5jIHRvIHVhcnQ0MDEuYy4gQWxzbyBtb2RpZmllZCBpdCB0byB3b3JrIGFsc28gd2l0aAorICBvdGhlciBNUFU0MDEgVUFSVCBjb21wYXRpYmxlIGNhcmRzIHRoYW4gU0IxNi9FU1MvSmF6ei4KKy0gU29tZSBjaGFuZ2VzIHdoaWNoIHJlZHVjZSBjbGlja2luZyBpbiBhdWRpbyBwbGF5YmFjay4KKy0gQ29weWluZyBwb2xpY3kgaXMgbm93IEdQTC4KKworU2luY2UgMy41LjEKKy0gVEIgTWF1aSBpbml0aWFsaXphdGlvbiBzdXBwb3J0CitTaW5jZSAzLjUKKy0gSW1wcm92ZWQgaGFuZGxpbmcgb2YgcGxheWJhY2sgdW5kZXJydW4gc2l0dWF0aW9ucy4KKworU2luY2UgMy41LWJldGExMAorLSBCdWcgZml4aW5nCisKK1NpbmNlIDMuNS1iZXRhOQorLSBGaXhlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIExpbnV4IDEuMy43MCBhbmQgbGF0ZXIuCistIENoYW5nZWQgYm9vdCB0aW1lIHBhc3Npbmcgb2YgMTYgYml0IERNQSBjaGFubmVsIG51bWJlciB0byBTQiBkcml2ZXIuCisKK1NpbmNlIDMuNS1iZXRhOAorLSBNaW5vciBjaGFuZ2VzCisKK1NpbmNlIDMuNS1iZXRhNworLSBlbmhhbmNlbWVudHMgdG8gY29uZmlndXJlIHByb2dyYW0gKGJ5IEplZmYgVHJhbnRlcik6CisgIC0gcHJvbXB0cyBhcmUgaW4gc2FtZSBmb3JtYXQgYXMgMS4zLnggTGludXgga2VybmVsIGNvbmZpZyBwcm9ncmFtCisgIC0gb24tbGluZSBoZWxwIGZvciBlYWNoIHF1ZXN0aW9uCisgIC0gZml4ZWQgc29tZSBjb21waWxlIHdhcm5pbmdzIGRldGVjdGVkIGJ5IGdjYy9nKysgLVdhbGwKKyAgLSBtaW5vciBncmFtbWF0aWNhbCBjaGFuZ2VzIHRvIHByb21wdHMKKworU2luY2UgMy41LWJldGE2CistIEZpeGVkIGJ1Z3MgaW4gbW1hcCgpIHN1cHBvcnQuCistIE1pbm9yIGNoYW5nZXMgdG8gTWF1aSBkcml2ZXIuCisKK1NpbmNlIDMuNS1iZXRhNQorLSBGaXhlZCBjcmFzaCBhZnRlciByZWNvcmRpbmcgd2l0aCBFU1M2ODguIEl0J3MgZ2VuZXJhbGx5IGEgZ29vZAorICBpZGVhIHRvIHN0b3AgaW5ib3VuZCBETUEgdHJhbnNmZXJzIGJlZm9yZSBmcmVlaW5nIHRoZSBtZW1vcnkKKyAgYnVmZmVyLiAKKy0gRml4ZWQgaGFuZGxpbmcgb2YgQUQxODQ1IGNvZGVjIChmb3IgZXhhbXBsZSBTaHV0dGxlIFNvdW5kIFN5c3RlbSkuCistIEZldyBvdGhlciBmaXhlcy4KKworU2luY2UgMy41LWJldGE0CistIEZpeGVkIGJ1ZyBpbiBoYW5kbGluZyBvZiB1bmluaXRpYWxpemVkIGluc3RydW1lbnRzIHdpdGggR1VTLgorCitTaW5jZSAzLjUtYmV0YTMKKy0gRmV3IGNoYW5nZXMgd2hpY2ggZGVjcmVhc2UgcG9wcGluZyBhdCBlbmQvYmVnaW5uaW5nIG9mIGF1ZGlvIHBsYXliYWNrLgorCitTaW5jZSAzLjUtYmV0YTIKKy0gUmVtb3ZlZCBNQUQxNitDUzQyMzEgaGFjayBtYWRlIGluIHByZXZpb3VzIHZlcnNpb24gc2luY2UgaXQgZGlkbid0CisgIGhlbHAuCistIEZpeGVkIHRoZSBhYm92ZSBidWcgaW4gcHJvcGVyIHdheSBhbmQgaW4gcHJvcGVyIHBsYWNlLiBNYW55IHRoYW5rcworICB0byBKYW1lcyBIaWdodG93ZXIuCisKK1NpbmNlIDMuNS1iZXRhMQorLSBCdWcgZml4ZXMuCistIEZ1bGwgZHVwbGV4IGF1ZGlvIHdpdGggTUFEMTYrQ1M0MjMxIG1heSB3b3JrIG5vdy4gVGhlIGRyaXZlciBjb25maWd1cmVzCisgIFNCIERNQSBvZiBNQUQxNiBzbyB0aGF0IGl0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCBjb2RlYydzIERNQSBjaGFubmVscy4KKyAgVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgYWxsIDggYml0IERNQSBjaGFubmVscyAoMCwxLDMpIGFyZSBwb3B1bGF0ZWQgaW4gCisgIGR1cGxleCBtb2RlLgorCitTaW5jZSAzLjUtYWxwaGE5CistIEJ1ZyBmaXhlcyAobW9zdGx5IGluIEphenoxNiBhbmQgRVNTMTY4OC82ODggc3VwcG9ydHMpLgorLSBUZW1wb3JhcmlseSBkaXNhYmxlZCByZWNvcmRpbmcgd2l0aCBFU1MxNjg4LzY4OCBzaW5jZSBpdCBjYXVzZXMgY3Jhc2guCistIENoYW5nZWQgYXVkaW8gYnVmZmVyIHBhcnRpdGlvbmluZyBhbGdvcml0aG0gc28gdGhhdCBpdCBzZWxlY3RzCisgIHNtYWxsZXIgZnJhZ21lbnQgc2l6ZSB0aGFuIGVhcmxpZXIuIFRoaXMgaW1wcm92ZXMgcmVhbCB0aW1lIGNhcGFiaWxpdGllcworICBvZiB0aGUgZHJpdmVyIGFuZCBtYWtlcyByZWNvcmRpbmcgdG8gZGlzayB0byB3b3JrIGJldHRlci4gVW5mb3J0dW5hdGVseQorICB0aGlzIGNoYW5nZSBicmVha3Mgc29tZSBwcm9ncmFtcyB3aGljaCBhc3N1bWUgdGhhdCBmcmFnbWVudHMgY2Fubm90IGJlCisgIHNob3J0ZXIgdGhhbiA0MDk2IGJ5dGVzLgorCitTaW5jZSAzLjUtYWxwaGE4CistIEJ1ZyBmaXhlcworCitTaW5jZSAzLjUtYWxwaGE3CistIExpbnV4IGtlcm5lbCBjb21wYXRpYmxlIGNvbmZpZ3VyYXRpb24gKF9FWFBFUklNRU5UQUxfKS4gRW5hYmxlCisgIHVzaW5nIGNvbW1hbmQgImNkIC9saW51eC9kcml2ZXJzL3NvdW5kO21ha2Ugc2NyaXB0IiBhbmQgdGhlbgorICBqdXN0IHJ1biBrZXJuZWwncyBtYWtlIGNvbmZpZyBub3JtYWxseS4KKy0gTWlub3IgZml4ZXMgdG8gdGhlIFNCIHN1cHBvcnQuIEhvcGVmdWxseSB0aGUgZHJpdmVyIHdvcmtzIHdpdGgKKyAgYWxsIFNCIG1vZGVscyBub3cuCistIEFkZGVkIHN1cHBvcnQgZm9yIEVTUyBFUzE2ODggIkF1ZGlvRHJpdmUiIGJhc2VkIGNhcmRzLgorCitTaW5jZSAzLjUtYWxwaGE2CistIFNCIFBybyBhbmQgU0IxNiBzdXBwb3J0cyBhcmUgbm8gbG9uZ2VyIHNlcGFyYXRlbHkgc2VsZWN0YWJsZSBvcHRpb25zLgorICBFbmFibGluZyBTQiBlbmFibGVzIHRoZW0gdG9vLgorLSBDaGFuZ2VkIGFsbCAjaWZuZGVmIEVYQ0xVREVfeHggc3R1ZmYgdG8gI2lmZGVmIENPTkZJR194eC4gTW9kaWZpZWQKK2NvbmZpZ3VyZSB0byBoYW5kbGUgdGhpcy4gCistIFJlbW92ZWQgaW5pdGlhbGl6YXRpb24gbWVzc2FnZXMgZnJvbSB0aGUKK21vZHVsYXJpemVkIHZlcnNpb24uIFRoZXkgY2FuIGJlIGVuYWJsZWQgYnkgdXNpbmcgaW5pdF90cmFjZT0xIGluCit0aGUgaW5zbW9kIGNvbW1hbmQgbGluZSAoaW5zbW9kIHNvdW5kIGluaXRfdHJhY2U9MSkuCistIE1vcmUgQUlYIHN0dWZmLgorLSBBZGRlZCBzdXBwb3J0IGZvciBzeW5jaHJvbml6aW5nIGRzcC9hdWRpbyBkZXZpY2VzIHdpdGggL2Rldi9zZXF1ZW5jZXIuCistIG1tYXAoKSBzdXBwb3J0IGZvciBkc3AvYXVkaW8gZGV2aWNlcy4KKworU2luY2UgMy41LWFscGhhNQorLSBBSVggcG9ydC4KKy0gQ2hhbmdlZCBzb21lIHh4eF9QQVRDSCBtYWNyb3MgaW4gc291bmRjYXJkLmggdG8gd29yayB3aXRoCisgIGJpZyBlbmRpYW4gbWFjaGluZXMuCisKK1NpbmNlIDMuNS1hbHBoYTQKKy0gUmVtb3ZlZCB0aGUgJ3NldGZ4JyBzdHVmZiBmcm9tIHRoZSB2ZXJzaW9uIGRpc3RyaWJ1dGVkIHdpdGgga2VybmVsCisgIHNvdXJjZXMuIFJ1bm5pbmcgJ3NldGZ4JyBpcyByZXF1aXJlZCBhZ2Fpbi4KKworU2luY2UgMy41LWFscGhhMworLSBNb3ZlZCBzdHVmZiBmcm9tIHRoZSAnc2V0ZngnIHByb2dyYW0gdG8gdGhlIEF1ZGlvVHJpeCBQcm8gZHJpdmVyLgorCitTaW5jZSAzLjUtYWxwaGEyCistIE1vZGlmaWNhdGlvbnMgdG8gbWFrZWZpbGUgYW5kIGNvbmZpZ3VyZS5jLiBVbm5lY2Vzc2FyeSBzb3VyY2VzCisgIGFyZSBubyBsb25nZXIgY29tcGlsZWQuIE5ld2x5IGNyZWF0ZWQgbG9jYWwuaCBpcyBhbHNvIGNvcGllZCB0bworICAvZXRjL3NvdW5kY29uZi4gIm1ha2Ugb2xkY29uZmlnIiByZWFkcyAvZXRjL3NvdW5kY29uZiBhbmQgcHJvZHVjZXMKKyAgbmV3IGxvY2FsLmggd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZHJpdmVyLgorLSBTb21lIGZpeGVzIHRvIHRoZSBTQjE2IHN1cHBvcnQuCistIEZpeGVkIHJhbmRvbSBwcm90ZWN0aW9uIGZhdWx0IGluIGd1c193YXZlLmMKKworU2luY2UgMy41LWFscGhhMQorLSBNb2RpZmllZCB0byB3b3JrIHdpdGggTGludXgtMS4zLjMzIGFuZCBsYXRlcgorLSBTb21lIG1pbm9yIGNoYW5nZXMKKworU2luY2UgMy4wLjIKKy0gU3VwcG9ydCBmb3IgQ1M0MjMyIGJhc2VkIFBuUCBjYXJkcyAoQWNlck1hZ2ljIFMyMyBldGMpLgorLSBGdWxsIGR1cGxleCBzdXBwb3J0IGZvciBzb21lIENTNDIzMSwgQ1M0MjMyIGFuZCBBRDE4NDUgYmFzZWQgY2FyZHMKKyhHVVMgTUFYLCBBdWRpb1RyaXggUHJvLCBBY2VyTWFnaWMgUzIzIGFuZCBtYW55IE1BRDE2L01vemFydCBjYXJkcworaGF2aW5nIGEgY29kZWMgbWVudGlvbmVkIGFib3ZlKS4KKy0gQWxtb3N0IGZ1bGx5IHJld3JpdHRlbiBsb2FkYWJsZSBtb2R1bGVzIHN1cHBvcnQuCistIEZpeGVkIHNvbWUgYnVncy4KKy0gSHVnZSBhbW91bnQgb2YgdGVzdGluZyAobW9yZSB0ZXN0aW5nIGlzIHN0aWxsIHJlcXVpcmVkKS4KKy0gbW1hcCgpIHN1cHBvcnQgKHdvcmtzIHdpdGggc29tZSBjYXJkcykuIFJlcXVpcmVzIG11Y2ggbW9yZSB0ZXN0aW5nLgorLSBTYW1wbGUvcGF0Y2gvcHJvZ3JhbSBsb2FkaW5nIGZvciBUQiBNYXVpL1Ryb3Blei4gTm8gaW5pdGlhbGl6YXRpb24KK3NpbmNlIFRCIGRvZXNuJ3QgYWxsb3cgbWUgdG8gcmVsZWFzZSB0aGF0IGNvZGUuCistIFVzaW5nIENTNDIzMSBjb21wYXRpYmxlIGNvZGVjcyBhcyB0aW1lciBmb3IgL2Rldi9tdXNpYy4KKworU2luY2UgMy4wLjEKKy0gQWRkZWQgYWxsb2NhdGlvbiBvZiBJL08gcG9ydHMsIERNQSBjaGFubmVscyBhbmQgaW50ZXJydXB0cwordG8gdGhlIGluaXRpYWxpemF0aW9uIGNvZGUuIFRoaXMgbWF5IGJyZWFrIG1vZHVsZXMgc3VwcG9ydCBzaW5jZQordGhlIGRyaXZlciBtYXkgbm90IGZyZWUgc29tZSByZXNvdXJjZXMgb24gdW5sb2FkLiBTaG91bGQgYmUgZml4ZWQgc29vbi4KKworU2luY2UgMy4wCistIFNvbWUgaW1wb3J0YW50IGJ1ZyBmaXhlcy4gCistIHNlbGVjdCgpIGZvciAvZGV2L2RzcCBhbmQgL2Rldi9hdWRpbyAoTGludXggb25seSkuCisoVG8gdXNlIHNlbGVjdCgpIHdpdGggcmVhZCwgeW91IGhhdmUgdG8gY2FsbCByZWFkKCkgdG8gc3RhcnQKK3RoZSByZWNvcmRpbmcuIENhbGxpbmcgd3JpdGUoKSBraWxscyByZWNvcmRpbmcgaW1tZWRpYXRlbHkgc28KK3VzZSBzZWxlY3QoKSBjYXJlZnVsbHkgd2hlbiB5b3UgYXJlIHdyaXRpbmcgYSBoYWxmIGR1cGxleCBhcHAuCitGdWxsIGR1cGxleCBtb2RlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuKSBTZWxlY3Qgd29ya3MgYWxzbyB3aXRoCisvZGV2L3NlcXVlbmNlciBhbmQgL2Rldi9tdXNpYy4gTWF5YmUgd2l0aCAvZGV2L21pZGkjIyB0b28uCisKK1NpbmNlIDMuMC1iZXRhMgorLSBNaW5vciBmaXhlcy4KKy0gQWRkZWQgUmVhZG1lLmNhcmRzCisKK1NpbmNlIDMuMC1iZXRhMQorLSBNaW5vciBmaXhlcyB0byB0aGUgbW9kdWxlcyBzdXBwb3J0LgorLSBFbGltaW5hdGVkIGNhbGwgdG8gc2JfZnJlZV9pcnEoKSBpbiBhZDE4NDguYworLSBSZXdyaXR0ZW4gTUFEMTYmTW96YXJ0IHN1cHBvcnQgKG5vdCB0ZXN0ZWQgd2l0aCBNQUQxNiBQcm8pLgorLSBGaXggdG8gRE1BIGluaXRpYWxpemF0aW9uIG9mIFBTUyBjYXJkcy4KKy0gU29tZSBmaXhlcyB0byBhZDE4NDgvY3M0Mnh4IG1peGVyIHN1cHBvcnQgKEdVUyBNQVgsIE1TUywgZXRjLikKKy0gRml4ZWQgc29tZSBidWdzIGluIHRoZSBQU1MgZHJpdmVyIHdoaWNoIGNhdXNlZCBJL08gZXJyb3JzIHdpdGgKKyAgdGhlIE1TUyBtb2RlICgvZGV2L2RzcCkuCisKK1NpbmNlIDMuMC05NTA1MDYKKy0gUmVjb3JkaW5nIHdpdGggR1VTIE1BWCBmaXhlZC4gSXQgd29ya3Mgd2hlbiB0aGUgZHJpdmVyIGlzIGNvbmZpZ3VyZWQKKyAgdG8gdXNlIHR3byBETUEgY2hhbm5lbHMgd2l0aCBHVVMgTUFYICgxNiBiaXQgb25lcyByZWNvbW1lbmRlZCkuCisKK1NpbmNlIDMuMC05NHh4eHgKKy0gVG9vIG1hbnkgY2hhbmdlcworCitTaW5jZSAzLjAtOTQwODE4CistIEZpeGVzIGZvciBMaW51eCAxLjEuNHguCistIERpc2FibGVzIERpc25leSBTb3VuZCBTeXN0ZW0gd2l0aCBTRyBOWCBQcm8gMTYgKGxlc3Mgbm9pc2UpLgorCitTaW5jZSAyLjkwLTIKKy0gRml4ZXMgdG8gc291bmRjYXJkLmgKKy0gTm9uIGJsb2NraW5nIG1vZGUgdG8gL2Rldi9zZXF1ZW5jZXIKKy0gRXhwZXJpbWVudGFsIGRldGVjdGlvbiBjb2RlIGZvciBFbnNvbmlxIFNvdW5kc2NhcGUuCisKK1NpbmNlIDIuOTAKKy0gTWlub3IgYW5kIG1ham9yIGJ1ZyBmaXhlcworCitTaW5jZSBwcmUtMy4wLTk0MDcxMgorLSBHVVMgTUFYIHN1cHBvcnQKKy0gUGFydGlhbGx5IHdvcmtpbmcgTVNTL1dTUyBzdXBwb3J0IChjb3VsZCB3b3JrIHdpdGggc29tZSBjYXJkcykuCistIEhhcmR3YXJlIHUtTGF3IGFuZCBBLUxhdyBzdXBwb3J0IHdpdGggQUQxODQ4L0NTNDI0OCBhbmQgQ1M0MjMxIGNvZGVjcworICAoR1VTIE1BWCwgR1VTMTYsIFdTUyBldGMpLiBIYXJkd2FyZSBBRFBDTSBpcyBwb3NzaWJsZSB3aXRoIEdVUzE2IGFuZAorICBHVVMgTUFYLCBidXQgaXQgZG9lc24ndCB3b3JrIHlldC4KK1NpbmNlIHByZS0zLjAtOTQwNDI2CistIEFEMTg0OC9DUzQyNDgvQ1M0MjMxIGNvZGVjIHN1cHBvcnQgKE1TUywgR1VTIE1BWCwgQXp0ZWMsIE9yY2hpZCBldGMpLgorVGhpcyBjb2RlYyBjaGlwIGlzIHVzZWQgaW4gdmFyaW91cyBzb3VuZCBjYXJkcy4gVGhpcyB2ZXJzaW9uIGlzIGRldmVsb3BlZAorZm9yIHRoZSAxNiBiaXQgZGF1Z2h0ZXJjYXJkIG9mIEdVUy4gSXQgc2hvdWxkIHdvcmsgd2l0aCBvdGhlciBjYXJkcyBhbHNvCitpZiB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBhcmUgbWV0OgorCS0gVGhlIEkvTywgSVJRIGFuZCBETUEgc2V0dGluZ3MgYXJlIGp1bXBlciBzZWxlY3RhYmxlIG9yCisJdGhlIGNhcmQgaXMgaW5pdGlhbGl6ZWQgYnkgYm9vdGluZyBET1MgYmVmb3JlIGJvb3RpbmcgTGludXggKGV0Yy4pLgorCS0gWW91IGFkZCB0aGUgSU8sIElSUSBhbmQgRE1BIHNldHRpbmdzIG1hbnVhbGx5IHRvIHRoZSBsb2NhbC5oLgorCSAgKEp1c3QgZGVmaW5lIEdVUzE2X0JBU0UsIEdVUzE2X0lSUSBhbmQgR1VTMTZfRE1BKS4gTm90ZSB0aGF0CisJdGhlIGJhc2UgYWRkcmVzcyBidXN0IGJlIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvZGVjIGNoaXAgbm90IHRoZQorCWNhcmQgaXRzZWxmLiBGb3IgdGhlIEdVUzE2IHRoZXNlIGFyZSB0aGUgc2FtZSBidXQgbW9zdCBNU1MgY29tcGF0aWJsZQorCWNhcmRzIGhhdmUgdGhlIGNvZGVjIGxvY2F0ZWQgYXQgY2FyZF9iYXNlKzQuCistIFNvbWUgbWlub3IgY2hhbmdlcworCitTaW5jZSAyLjUgKCoqKioqKiogTUFKT1IgUkVXUklURSAqKioqKioqKioqKikKKworVGhpcyB2ZXJzaW9uIGlzIGJhc2VkIG9uIHYyLjMuIEkgaGF2ZSB0cmllZCB0byBtYWludGFpbiB0d28gdmVyc2lvbnMKK3RvZ2V0aGVyIHNvIHRoYXQgdGhpcyBvbmUgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZmVhdHVyZXMgdGhhbiB2Mi41LgorU29tZXRoaW5nIG1heSBzdGlsbCBiZSBtaXNzaW5nLiBJZiB5b3Ugbm90aWNlIHN1Y2ggdGhpbmdzLCBwbGVhc2UgbGV0IG1lCitrbm93LgorCitUaGUgUmVhZG1lLnYzMCBjb250YWlucyBtb3JlIGRldGFpbHMuCisKKy0gL2Rldi9taWRpIyMgZGV2aWNlcy4KKy0gL2Rldi9zZXF1ZW5jZXIyCisKK1NpbmNlIDIuNS1iZXRhMgorLSBTb21lIGZpbmUgdHVuaW5nIHRvIHRoZSBHVVMgdjMuNyBtaXhlciBjb2RlLgorLSBGaXhlZCBzcGVlZCBsaW1pdHMgZm9yIHRoZSBwbGFpbiBTQiAoMS4wIHRvIDIuMCkuCisKK1NpbmNlIDIuNS1iZXRhCistIEZpeGVkIE9QTC0zIGRldGVjdGlvbiB3aXRoIFNCLiBDYXVzZWQgcHJvYmxlbXMgd2l0aCBQQVMxNi4KKy0gR1VTIHYzLjcgbWl4ZXIgc3VwcG9ydC4KKworU2luY2UgMi40CistIE1peGVyIHN1cHBvcnQgZm9yIFNvdW5kIEdhbGF4eSBOWCBQcm8gKGRlZmluZSBfX1NHTlhQUk9fXyBvbiB5b3VyIGxvY2FsLmgpLgorLSBGaXhlZCB0cnVuY2F0ZWQgc291bmQgb24gL2Rldi9kc3Agd2hlbiB0aGUgZGV2aWNlIGlzIGNsb3NlZC4KKy0gTGluZWFyIHZvbHVtZSBtb2RlIGZvciBHVVMKKy0gUGl0Y2ggYmVuZHMgbGFyZ2VyIHRoYW4gKy8tIDIgb2N0YXZlcy4KKy0gTUlESSByZWNvcmRpbmcgZm9yIFNCIGFuZCBTQiBQcm8uIChVbnRlc3RlZCkuCistIFNvbWUgb3RoZXIgZml4ZXMuCistIFNCMTYgTUlESSBhbmQgRFNQIGRyaXZlcnMgb25seSBpbml0aWFsaXplZCBpZiBTQjE2IGFjdHVhbGx5IGluc3RhbGxlZC4KKy0gSW1wbGVtZW50ZWQgYmV0dGVyIGRldGVjdGlvbiBmb3IgT1BMLTMuIFRoaXMgc2hvdWxkIGJlIHVzZWZ1bCBpZiB5b3UKKyAgaGF2ZSBhbiBvbGQgU0IgUHJvICh0aGUgbm9uLU9QTC0zIG9uZSkgb3IgYSBTQiAyLjAgY2xvbmUgd2hpY2ggaGFzIGEgT1BMLTMuCistIFNWUjQuMiBzdXBwb3J0IGJ5IElhbiBIYXJ0YXMuIEluaXRpYWwgQUxQSEEgVEVTVCB2ZXJzaW9uICh1bnRlc3RlZCkuCisKK1NpbmNlIDIuM2IKKy0gRml4ZWQgYnVnIHdoaWNoIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBtYWtlIGxvbmcgcmVjb3JkaW5ncyB0byBkaXNrLgorICBSZWNvcmRpbmcgd2FzIG5vdCByZXN0YXJ0ZWQgYWZ0ZXIgYSBidWZmZXIgb3ZlcmZsb3cgc2l0dWF0aW9uLgorLSBMaW1pdGVkIG1peGVyIHN1cHBvcnQgZm9yIEdVUy4KKy0gTnVtZXJvdXMgaW1wcm92ZW1lbnRzIHRvIHRoZSBHVVMgZHJpdmVyIGJ5IEFuZHJldyBSb2JpbnNvbi4gSW5jbHVkaW5nCisgIHNvbWUgY2xpY2sgcmVtb3ZhbCBldGMuCisKK1NpbmNlIDIuMworLSBGaXhlZCBzb21lIG1pbm9yIGJ1Z3MgaW4gdGhlIFNCMTYgZHJpdmVyLgorCitTaW5jZSAyLjJiCistIEZ1bGwgU0IxNiBEU1Agc3VwcG9ydC4gOC8xNiBiaXQsIG1vbm8vc3RlcmVvCistIFRoZSBTQ08gYW5kIEZyZWVCU0QgdmVyc2lvbnMgc2hvdWxkIGJlIGluIHN5bmMgbm93LiBUaGVyZSBhcmUgc29tZQorICBwcm9ibGVtcyB3aXRoIFNCMTYgYW5kIEdVUyBpbiB0aGUgRnJlZUJTRCB2ZXJzaW9ucy4KKyAgVGhlIERNQSBidWZmZXIgYWxsb2NhdGlvbiBvZiB0aGUgU0NPIHZlcnNpb24gaGFzIGJlZW4gcG9saXNoZWQgYnV0CisgIHRoZXJlIGNvdWxkIHN0aWxsIGJlIHNvbWUgcHJvYmxlbXMuIEF0IGxlYXN0IGl0IGhvZ3MgbWVtb3J5LgorICBUaGUgRE1BIGNoYW5uZWwKKyAgY29uZmlndXJhdGlvbiBtZXRob2QgdXNlZCBpbiB0aGUgU0NPL1N5c3RlbSBpcyBhIGhhY2suCistIFN1cHBvcnQgZm9yIHRoZSBNUFUgZW11bGF0aW9uIG9mIHRoZSBTQjE2LgorLSBTb21lIGJpZyBhcnJheXMgYXJlIG5vdyBhbGxvY2F0ZWQgYm9vdCB0aW1lLiBUaGlzIG1ha2VzIHRoZSBCU1Mgc2VnbWVudAorICBzbWFsbGVyIHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgZnVsbCBkcml2ZXIgd2l0aAorICBOZXRCU0QuIFRoZXNlIGFycmF5cyBhcmUgbm90IGFsbG9jYXRlZCBpZiBubyBzdWl0YWJsZSBzb3VuZCBjYXJkIGlzIGF2YWlsYWJsZS4KKy0gRml4ZWQgYSBidWcgaW4gdGhlIGNvbXB1dGVfYW5kX3NldF92b2x1bWUgaW4gZ3VzX3dhdmUuYworLSBGaXhlZCB0aGUgdG9vIGZhc3QgbW9ubyBwbGF5YmFjayBwcm9ibGVtIG9mIFNCIFBybyBhbmQgUEFTMTYuCisKK1NpbmNlIDIuMgorLSBTdGVyZW8gcmVjb3JkaW5nIGZvciBTQiBQcm8uIFNvbWVob3cgaXQgd2FzIG1pc3NpbmcgYW5kIG5vYm9keQorICBoYWQgbm90aWNlZCBpdCBlYXJsaWVyLgorLSBNaW5vciBwb2xpc2hpbmcuCistIEludGVycHJldGluZyBvZiBib290IHRpbWUgYXJndW1lbnRzIChzb3VuZD0pIGZvciBMaW51eC4KKy0gQnJlYWt1cCBvZiBzYl9kc3AuYy4gUGFydHMgb2YgdGhlIGNvZGUgaGFzIGJlZW4gbW92ZWQgdG8KKyAgc2JfbWl4ZXIuYyBhbmQgc2JfbWlkaS5jCisKK1NpbmNlIDIuMQorLSBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBTQjE2LiAKKyAgLSBUaGUgU0IxNiBtaXhlciBpcyBzdXBwb3J0ZWQgaW4gaXRzIG5hdGl2ZSBtb2RlLgorICAtIERpZ2l0aXplZCB2b2ljZSBjYXBhYmlsaXR5IHVwIHRvIDQ0LjEga0h6LzggYml0L21vbm8KKyAgICAoMTYgYml0IGFuZCBzdGVyZW8gc3VwcG9ydCBjb21pbmcgaW4gdGhlIG5leHQgcmVsZWFzZSkuCistIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgZGlnaXRpemVkIHZvaWNlIGRyaXZlciBmb3IgUEFTMTYuCistIFByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGUgU0IgZW11bGF0aW9uIG9mIGxhdGVzdCBQQVMxNiBtb2RlbHMuCisKKy0gU2lnbmlmaWNhbnRseSBpbXByb3ZlZCAvZGV2L2RzcCBhbmQgL2Rldi9hdWRpbyBzdXBwb3J0LgorICAtIE5vdyBzdXBwb3J0cyBoYWxmIGR1cGxleCBtb2RlLiBJdCdzIG5vdyBwb3NzaWJsZSB0byByZWNvcmQgYW5kCisgICAgcGxheWJhY2sgd2l0aG91dCBjbG9zaW5nIGFuZCByZW9wZW5pbmcgdGhlIGRldmljZS4KKyAgLSBJdCdzIHBvc3NpYmxlIHRvIHVzZSBzbWFsbGVyIGJ1ZmZlcnMgdGhhbiBlYXJsaWVyLiBUaGVyZSBpcyBhIG5ldworICAgIGlvY3RsKGZkLCBTTkRDVExfRFNQX1NVQkRJVklERSwgJm4pIHdoZXJlIG4gc2hvdWxkIGJlIDEsIDIgb3IgNC4KKyAgICBUaGlzIGNhbGwgaW5zdHJ1Y3RzIHRoZSBkcml2ZXIgdG8gdXNlIHNtYWxsZXIgYnVmZmVycy4gVGhlIGRlZmF1bHQKKyAgICBidWZmZXIgc2l6ZSAoMC41IHRvIDEuMCBzZWNvbmRzKSBpcyBkaXZpZGVkIGJ5IG4uIFNob3VsZCBiZSBjYWxsZWQKKyAgICBpbW1lZGlhdGVseSBhZnRlciBvcGVuaW5nIHRoZSBkZXZpY2UuCisKK1NpbmNlIDIuMAorSnVzdCBjb3NtZXRpYyBjaGFuZ2VzLiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9DT1BZSU5HIGIvc291bmQvb3NzL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2ZDFmMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9DT1BZSU5HCkBAIC0wLDAgKzEsMzM5IEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCUFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9LY29uZmlnIGIvc291bmQvb3NzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwM2MyZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9LY29uZmlnCkBAIC0wLDAgKzEsMTEyMCBAQAorIyBkcml2ZXJzL3NvdW5kL0NvbmZpZy5pbgorIworIyAxOCBBcHIgMTk5OCwgTWljaGFlbCBFbGl6YWJldGggQ2hhc3RhaW4sIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4KKyMgTW9yZSBoYWNraW5nIGZvciBtb2R1bGFyaXNhdGlvbi4KKyMKKyMgUHJvbXB0IHVzZXIgZm9yIHByaW1hcnkgZHJpdmVycy4KK2NvbmZpZyBTT1VORF9CVDg3OAorCXRyaXN0YXRlICJCVDg3OCBhdWRpbyBkbWEiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORAorCS0tLWhlbHAtLS0KKwkgIEF1ZGlvIERNQSBzdXBwb3J0IGZvciBidDg3OCBiYXNlZCBncmFiYmVyIGJvYXJkcy4gIEFzIHlvdSBtaWdodCBoYXZlCisJICBhbHJlYWR5IG5vdGljZWQsIGJ0ODc4IGlzIGxpc3RlZCB3aXRoIHR3byBmdW5jdGlvbnMgaW4gL3Byb2MvcGNpLgorCSAgRnVuY3Rpb24gMCBkb2VzIHRoZSB2aWRlbyBzdHVmZiAoYnQ4NDggY29tcGF0aWJsZSksIGZ1bmN0aW9uIDEgZG9lcworCSAgdGhlIHNhbWUgZm9yIGF1ZGlvIGRhdGEuICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgYXVkaW8gcGFydCBvZgorCSAgdGhlIGNoaXAuICBJZiB5b3Ugc2F5ICdZJyBoZXJlIHlvdSBnZXQgYSBvc3MtY29tcGF0aWJsZSBkc3AgZGV2aWNlCisJICB3aGVyZSB5b3UgY2FuIHJlY29yZCBmcm9tLiAgSWYgeW91IHdhbnQganVzdCB3YXRjaCBUViB5b3UgcHJvYmFibHkKKwkgIGRvbid0IG5lZWQgdGhpcyBkcml2ZXIgYXMgbW9zdCBUViBjYXJkcyBoYW5kbGUgc291bmQgd2l0aCBhIHNob3J0CisJICBjYWJsZSBmcm9tIHRoZSBUViBjYXJkIHRvIHlvdXIgc291bmQgY2FyZCdzIGxpbmUtaW4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGJ0YXVkaW8uCisKK2NvbmZpZyBTT1VORF9DTVBDSQorCXRyaXN0YXRlICJDLU1lZGlhIFBDSSAoQ01JODMzOC84NzM4KSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBQQ0kgc291bmQgY2FyZCB1c2luZyB0aGUgQ01JODMzOAorCSAgb3IgdGhlIENNSTg3MzggY2hpcHNldC4gIERhdGEgb24gdGhlc2UgY2hpcHMgYXJlIGF2YWlsYWJsZSBhdAorCSAgPGh0dHA6Ly93d3cuY21lZGlhLmNvbS50dy8+LgorCisJICBBIHVzZXJzcGFjZSB1dGlsaXR5IHRvIGNvbnRyb2wgc29tZSBpbnRlcm5hbCByZWdpc3RlcnMgb2YgdGhlc2UKKwkgIGNoaXBzIGlzIGF2YWlsYWJsZSBhdAorCSAgPGh0dHA6Ly9tZW1iZXIubmlmdHkubmUuanAvQnJlZXplL3NvZnR3YXJlcy91bml4L2NtaWN0bC1lLmh0bWw+LgorCitjb25maWcgU09VTkRfQ01QQ0lfRk0KKwlib29sICJFbmFibGUgbGVnYWN5IEZNIgorCWRlcGVuZHMgb24gU09VTkRfQ01QQ0kgJiYgWDg2CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIGxlZ2FjeSBGTSAoZnJlcXVlbmN5LW1vZHVsYXRpb24pIHN5bnRoZXNpemVyCisJICBzdXBwb3J0IG9uIGEgY2FyZCB1c2luZyB0aGUgQ01JODMzOCBvciBDTUk4Mzc4IGNoaXBzZXQuIEV2ZW4gaXQgaXMKKwkgIGVuYWJsZWQsIHlvdSBuZWVkIHRvIHNldCBmbWlvIGFzIHByb3BlciB2YWx1ZSB0byBlbmFibGUgaXQuCisJICBTYXkgTiBoZXJlIGlmIHlvdSBkb24ndCBuZWVkIHRoaXMuCisKK2NvbmZpZyBTT1VORF9DTVBDSV9NSURJCisJYm9vbCAiRW5hYmxlIGxlZ2FjeSBNUFUtNDAxIgorCWRlcGVuZHMgb24gU09VTkRfQ01QQ0kgJiYgWDg2CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIGxlZ2FjeSBNUFU0MDEgTUlESSBzeW50aGVzaXplciBzdXBwb3J0IG9uIGEKKwkgIGNhcmQgdXNpbmcgdGhlIENNSTgzMzggb3IgQ01JODM3OCBjaGlwc2V0LiBFdmVuIGl0IGlzIGVuYWJsZWQsCisJICB5b3UgbmVlZCB0byBzZXQgbXB1aW8gYXMgcHJvcGVyIHZhbHVlIHRvIGVuYWJsZSBpdC4KKwkgIFNheSBOIGhlcmUgaWYgeW91IGRvbid0IG5lZWQgdGhpcy4KKworY29uZmlnIFNPVU5EX0NNUENJX0pPWVNUSUNLCisJYm9vbCAiRW5hYmxlIGpveXN0aWNrIgorCWRlcGVuZHMgb24gU09VTkRfQ01QQ0kgJiYgWDg2CisJaGVscAorCSAgU2F5IFkgaGVyZSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGpveXN0aWNrIHBvcnQgb24gYSBzb3VuZCBjYXJkIHVzaW5nCisJICB0aGUgQ01JODMzOCBvciB0aGUgQ01JODczOCBjaGlwc2V0LiAgWW91IG5lZWQgdG8gY29uZmlnIHRoZQorCSAgZ2FtZXBvcnQgc3VwcG9ydCBhbmQgc2V0IGpveXN0aWNrIHBhcmFtZXRlciBhcyAxIHRvIHVzZSBpdC4KKwkgIFNheSBOIGhlcmUgaWYgeW91IGRvbid0IG5lZWQgdGhpcy4KKworY29uZmlnIFNPVU5EX0VNVTEwSzEKKwl0cmlzdGF0ZSAiQ3JlYXRpdmUgU0JMaXZlISAoRU1VMTBLMSkiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgUENJIHNvdW5kIGNhcmQgdXNpbmcgdGhlIEVNVTEwSzEgY2hpcHNldCwKKwkgIHN1Y2ggYXMgdGhlIENyZWF0aXZlIFNCTGl2ZSEsIFNCIFBDSTUxMiBvciBFbXUtQVBTLgorCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciBhbmQgdGhlIGRlZ3JlZSBvZiBzdXBwb3J0IGZvcgorCSAgdGhlIGRpZmZlcmVudCBjYXJkIG1vZGVscyBwbGVhc2UgY2hlY2s6CisKKwkgICAgICAgIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2VtdTEwazEvPgorCisJICBJdCBpcyBub3cgcG9zc2libGUgdG8gbG9hZCBkc3AgbWljcm9jb2RlIHBhdGNoZXMgaW50byB0aGUgRU1VMTBLMQorCSAgY2hpcC4gIFRoZXNlIHBhdGNoZXMgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHJlYWwgdGltZSBzb3VuZAorCSAgcHJvY2Vzc2luZyBlZmZlY3RzIHdoaWNoIGluY2x1ZGUgZm9yIGV4YW1wbGU6IHNpZ25hbCByb3V0aW5nLAorCSAgYmFzcy90cmVibGUgY29udHJvbCwgQUMzIHBhc3N0aHJvdWdoLCAuLi4KKwkgIFVzZXJzcGFjZSB0b29scyB0byBjcmVhdGUgbmV3IHBhdGNoZXMgYW5kIGxvYWQvdW5sb2FkIHRoZW0gY2FuIGJlCisJICBmb3VuZCBpbiB0aGUgZW11LXRvb2xzIHBhY2thZ2UgYXQgdGhlIGFib3ZlIFVSTC4KKworY29uZmlnIE1JRElfRU1VMTBLMQorCWJvb2wgIkNyZWF0aXZlIFNCTGl2ZSEgTUlESSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFNPVU5EX0VNVTEwSzEgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgdGhlIE9TUyAvZGV2L3NlcXVlbmNlcgorCSAgaW50ZXJmYWNlLiAgVGhpcyBjb2RlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC4KKworY29uZmlnIFNPVU5EX0ZVU0lPTgorCXRyaXN0YXRlICJDcnlzdGFsIFNvdW5kRnVzaW9uIChDUzQyODAvNDYxeCkiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORAorCWhlbHAKKwkgIFRoaXMgbW9kdWxlIGRyaXZlcyB0aGUgQ3J5c3RhbCBTb3VuZEZ1c2lvbiBkZXZpY2VzIChDUzQyODAvNDZ4eAorCSAgc2VyaWVzKSB3aGVuIHdpcmVkIGFzIG5hdGl2ZSBzb3VuZCBkcml2ZXJzIHdpdGggQUM5NyBjb2RlY3MuICBJZgorCSAgdGhpcyBkcml2ZXIgZG9lcyBub3Qgd29yayB0cnkgdGhlIENTNDIzMiBkcml2ZXIuCisKK2NvbmZpZyBTT1VORF9DUzQyODEKKwl0cmlzdGF0ZSAiQ3J5c3RhbCBTb3VuZCBDUzQyODEiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORAorCWhlbHAKKwkgIFBpY3R1cmUgYW5kIGZlYXR1cmUgbGlzdCBhdAorCSAgPGh0dHA6Ly93d3cucGNicm9rZXIuY29tL2NyeXN0YWw0MjgxLmh0bWw+LgorCitjb25maWcgU09VTkRfQkNNX0NTNDI5N0EKKwl0cmlzdGF0ZSAiQ3J5c3RhbCBTb3VuZCBDUzQyOTdhIChmb3IgU3dhcm0pIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU0lCWVRFX1NXQVJNICYmIFNPVU5ECisJaGVscAorCSAgVGhlIEJDTTkxMjUwQSBoYXMgYSBDcnlzdGFsIENTNDI5N2Egb24gc3luY2hyb25vdXMgc2VyaWFsCisJICBwb3J0IEIgKGluIGFkZGl0aW9uIHRvIHRoZSBEQi05IHNlcmlhbCBwb3J0KS4gIFNheSBZIG9yIE0KKwkgIGhlcmUgdG8gZW5hYmxlIHRoZSBzb3VuZCBjaGlwIGluc3RlYWQgb2YgdGhlIFVBUlQuICBBbHNvCisJICBub3RlIHRoYXQgQ09ORklHX0tHREIgc2hvdWxkIG5vdCBiZSBlbmFibGVkIGF0IHRoZSBzYW1lCisJICB0aW1lLCBzaW5jZSBpdCBhbHNvIGF0dGVtcHRzIHRvIHVzZSB0aGlzIFVBUlQgcG9ydC4KKworY29uZmlnIFNPVU5EX0VTMTM3MAorCXRyaXN0YXRlICJFbnNvbmlxIEF1ZGlvUENJIChFUzEzNzApIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQgJiYgUENJICYmIFNPVU5EX0dBTUVQT1JUCisJaGVscAorCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhIFBDSSBzb3VuZCBjYXJkIHV0aWxpemluZyB0aGUgRW5zb25pcQorCSAgRVMxMzcwIGNoaXBzZXQsIHN1Y2ggYXMgRW5zb25pcSdzIEF1ZGlvUENJIChub24tOTcpLiBUbyBmaW5kCisJICBvdXQgaWYgeW91ciBzb3VuZCBjYXJkIHVzZXMgYW4gRVMxMzcwIHdpdGhvdXQgcmVtb3ZpbmcgeW91cgorCSAgY29tcHV0ZXIncyBjb3ZlciwgdXNlIGxzcGNpIC1uIGFuZCBsb29rIGZvciB0aGUgUENJIElECisJICAxMjc0OjUwMDAuIFNpbmNlIEVuc29uaXEgd2FzIGJvdWdodCBieSBDcmVhdGl2ZSBMYWJzLAorCSAgU291bmQgQmxhc3RlciA2NC9QQ0kgbW9kZWxzIGFyZSBlaXRoZXIgRVMxMzcwIG9yIEVTMTM3MSBiYXNlZC4KKwkgIFRoaXMgZHJpdmVyIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSBPU1MvRnJlZSwgc28gUExFQVNFIFJFQUQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL2VzMTM3MD4uCisKK2NvbmZpZyBTT1VORF9FUzEzNzEKKwl0cmlzdGF0ZSAiQ3JlYXRpdmUgRW5zb25pcSBBdWRpb1BDSSA5NyAoRVMxMzcxKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSSAmJiBTT1VORF9HQU1FUE9SVAorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBQQ0kgc291bmQgY2FyZCB1dGlsaXppbmcgdGhlIEVuc29uaXEKKwkgIEVTMTM3MSBjaGlwc2V0LCBzdWNoIGFzIEVuc29uaXEncyBBdWRpb1BDSTk3LiBUbyBmaW5kIG91dCBpZgorCSAgeW91ciBzb3VuZCBjYXJkIHVzZXMgYW4gRVMxMzcxIHdpdGhvdXQgcmVtb3ZpbmcgeW91ciBjb21wdXRlcidzCisJICBjb3ZlciwgdXNlIGxzcGNpIC1uIGFuZCBsb29rIGZvciB0aGUgUENJIElEIDEyNzQ6MTM3MS4gU2luY2UKKwkgIEVuc29uaXEgd2FzIGJvdWdodCBieSBDcmVhdGl2ZSBMYWJzLCBTb3VuZCBCbGFzdGVyIDY0L1BDSQorCSAgbW9kZWxzIGFyZSBlaXRoZXIgRVMxMzcwIG9yIEVTMTM3MSBiYXNlZC4gVGhpcyBkcml2ZXIgZGlmZmVycworCSAgc2xpZ2h0bHkgZnJvbSBPU1MvRnJlZSwgc28gUExFQVNFIFJFQUQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL2VzMTM3MT4uCisKK2NvbmZpZyBTT1VORF9FU1NTT0xPMQorCXRyaXN0YXRlICJFU1MgVGVjaG5vbG9neSBTb2xvMSIgCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiBTT1VORF9HQU1FUE9SVCAmJiBQQ0kKKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgUENJIHNvdW5kIGNhcmQgdXRpbGl6aW5nIHRoZSBFU1MgVGVjaG5vbG9neQorCSAgU29sbzEgY2hpcC4gVG8gZmluZCBvdXQgaWYgeW91ciBzb3VuZCBjYXJkIHVzZXMgYQorCSAgU29sbzEgY2hpcCB3aXRob3V0IHJlbW92aW5nIHlvdXIgY29tcHV0ZXIncyBjb3ZlciwgdXNlCisJICBsc3BjaSAtbiBhbmQgbG9vayBmb3IgdGhlIFBDSSBJRCAxMjVEOjE5NjkuIFRoaXMgZHJpdmVyCisJICBkaWZmZXJzIHNsaWdodGx5IGZyb20gT1NTL0ZyZWUsIHNvIFBMRUFTRSBSRUFECisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9zb2xvMT4uCisKK2NvbmZpZyBTT1VORF9NQUVTVFJPCisJdHJpc3RhdGUgIkVTUyBNYWVzdHJvLCBNYWVzdHJvMiwgTWFlc3RybzJFIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBzb3VuZCBzeXN0ZW0gZHJpdmVuIGJ5IEVTUydzIE1hZXN0cm8gbGluZQorCSAgb2YgUENJIHNvdW5kIGNoaXBzLiAgVGhlc2UgaW5jbHVkZSB0aGUgTWFlc3RybyAxLCBNYWVzdHJvIDIsIGFuZAorCSAgTWFlc3RybyAyRS4gIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9NYWVzdHJvPiBmb3IgbW9yZQorCSAgZGV0YWlscy4KKworY29uZmlnIFNPVU5EX01BRVNUUk8zCisJdHJpc3RhdGUgIkVTUyBNYWVzdHJvMy9BbGxlZ3JvIGRyaXZlciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgc291bmQgc3lzdGVtIGRyaXZlbiBieSBFU1MncyBNYWVzdHJvIDMKKwkgIFBDSSBzb3VuZCBjaGlwLgorCitjb25maWcgU09VTkRfSUNICisJdHJpc3RhdGUgIkludGVsIElDSCAoaTh4eCkgYXVkaW8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFBDSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGludGVncmFsIGF1ZGlvIGluIEludGVsJ3MgSS9PIENvbnRyb2xsZXIgSHViIChJQ0gpCisJICBjaGlwc2V0LCBhcyB1c2VkIG9uIHRoZSA4MTAvODIwLzg0MCBtb3RoZXJib2FyZHMuCisKK2NvbmZpZyBTT1VORF9IQVJNT05ZCisJdHJpc3RhdGUgIlBBIEhhcm1vbnkgYXVkaW8gZHJpdmVyIgorCWRlcGVuZHMgb24gR1NDX0xBU0kgJiYgU09VTkRfUFJJTUUhPW4KKwloZWxwCisJICBTYXkgJ1knIG9yICdNJyB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEhhcm1vbnkgc291bmRjaGlwCisJICBvbiBIUCA3MTIsIDcxNS9uZXcgYW5kIG1hbnkgb3RoZXIgR1NDIGJhc2VkIG1hY2hpbmVzLgorCitjb25maWcgU09VTkRfU09OSUNWSUJFUworCXRyaXN0YXRlICJTMyBTb25pY1ZpYmVzIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQgJiYgU09VTkRfR0FNRVBPUlQKKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgUENJIHNvdW5kIGNhcmQgdXRpbGl6aW5nIHRoZSBTMworCSAgU29uaWNWaWJlcyBjaGlwc2V0LiBUbyBmaW5kIG91dCBpZiB5b3VyIHNvdW5kIGNhcmQgdXNlcyBhCisJICBTb25pY1ZpYmVzIGNoaXAgd2l0aG91dCByZW1vdmluZyB5b3VyIGNvbXB1dGVyJ3MgY292ZXIsIHVzZQorCSAgbHNwY2kgLW4gYW5kIGxvb2sgZm9yIHRoZSBQQ0kgSUQgNTMzMzpDQTAwLiBUaGlzIGRyaXZlcgorCSAgZGlmZmVycyBzbGlnaHRseSBmcm9tIE9TUy9GcmVlLCBzbyBQTEVBU0UgUkVBRAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3Mvc29uaWN2aWJlcz4uCisKK2NvbmZpZyBTT1VORF9WV1NORAorCXRyaXN0YXRlICJTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIFNvdW5kIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgWDg2X1ZJU1dTICYmIFNPVU5ECisJaGVscAorCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhbiBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIGFuZCB5b3Ugd2FudCB0byBiZQorCSAgYWJsZSB0byB1c2UgaXRzIG9uLWJvYXJkIGF1ZGlvLiAgUmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvdndzbmQ+IGZvciBtb3JlIGluZm8gb24gdGhpcyBkcml2ZXIncworCSAgY2FwYWJpbGl0aWVzLgorCitjb25maWcgU09VTkRfSEFMMgorCXRyaXN0YXRlICJTR0kgSEFMMiBzb3VuZCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFNHSV9JUDIyICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYW4gU0dJIEluZHkgc3lzdGVtIGFuZCB3YW50IHRvIGJlIGFibGUgdG8KKwkgIHVzZSBpdCdzIG9uLWJvYXJkIEEyIGF1ZGlvIHN5c3RlbS4KKworY29uZmlnIFNPVU5EX0lUODE3MgorCXRyaXN0YXRlICJJVDgxNzJHIFNvdW5kIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgKE1JUFNfSVRFODE3MiB8fCBNSVBTX0lWUikgJiYgU09VTkQKKworY29uZmlnIFNPVU5EX1ZSQzU0NzcKKwl0cmlzdGF0ZSAiTkVDIFZyYzU0NzcgQUM5NyBzb3VuZCIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIEREQjU0NzcgJiYgU09VTkQKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzb3VuZCBzdXBwb3J0IGZvciB0aGUgTkVDIFZyYzU0NzcgY2hpcCwgYW4KKwkgIGludGVncmF0ZWQsIG11bHRpLWZ1bmN0aW9uIGNvbnRyb2xsZXIgY2hpcCBmb3IgTUlQUyBDUFVzLiAgV29ya3MKKwkgIHdpdGggdGhlIEFDOTcgY29kZWMuCisKK2NvbmZpZyBTT1VORF9BVTEwMDAKKwl0cmlzdGF0ZSAiQXUxMDAwIFNvdW5kIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgKFNPQ19BVTEwMDAgfHwgU09DX0FVMTEwMCB8fCBTT0NfQVUxNTAwKSAmJiBTT1VORAorCitjb25maWcgU09VTkRfQVUxNTUwX0FDOTcKKwl0cmlzdGF0ZSAiQXUxNTUwIEFDOTcgU291bmQiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT0NfQVUxNTUwICYmIFNPVU5ECisKK2NvbmZpZyBTT1VORF9UUklERU5UCisJdHJpc3RhdGUgIlRyaWRlbnQgNERXYXZlIERYL05YLCBTaVMgNzAxOCBvciBBTGkgNTQ1MSBQQ0kgQXVkaW8gQ29yZSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFNPVU5EX0dBTUVQT1JUCisJLS0taGVscC0tLQorCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhIFBDSSBzb3VuZCBjYXJkIHV0aWxpemluZyB0aGUgVHJpZGVudAorCSAgNERXYXZlLURYL05YIGNoaXBzZXQgb3IgeW91ciBtb3RoZXIgYm9hcmQgY2hpcHNldCBoYXMgU2lTIDcwMTgKKwkgIG9yIEFMaSA1NDUxIGJ1aWx0LWluLiBUaGUgU2lTIDcwMTggUENJIEF1ZGlvIENvcmUgaXMgZW1iZWRkZWQKKwkgIGluIFNpUzk2MCBTdXBlciBTb3V0aCBCcmlkZ2UgYW5kIFNpUzU0MC82MzAgU2luZ2xlIENoaXBzZXQuCisJICBUaGUgQUxpIDU0NTEgUENJIEF1ZGlvIENvcmUgaXMgZW1iZWRkZWQgaW4gQUxpIE0xNTM1LCBNMTUzNUQsCisJICBNMTUzNSsgb3IgTTE1MzVEKyBTb3V0aCBCcmlkZ2UuCisKKwkgIFVzZSBsc3BjaSAtbiB0byBmaW5kIG91dCBpZiB5b3VyIHNvdW5kIGNhcmQgb3IgY2hpcHNldCB1c2VzCisJICBUcmlkZW50IDREV2F2ZSBvciBTaVMgNzAxOC4gUENJIElEIDEwMjM6MjAwMCBvciAxMDIzOjIwMDEgc3RhbmRzCisJICBmb3IgVHJpZGVudCA0RHdhdmUuIFBDSSBJRCAxMDM5OjcwMTggc3RhbmRzIGZvciBTaVM3MDE4LiBQQ0kgSUQKKwkgIDEwQjk6NTQ1MSBzdGFuZHMgZm9yIEFMaTU0NTEuCisKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFMvUERJRiBpbi9vdXQgKHJlY29yZC9wbGF5YmFjaykgZm9yIEFMaSA1NDUxCisJICBlbWJlZGRlZCBpbiBBTGkgTTE1MzUrIGFuZCBNMTUzNUQrLiBOb3RlIHRoYXQgdGhleSBhcmVuJ3QgYWxsCisJICBlbmFibGVkIGJ5IGRlZmF1bHQ7IHlvdSBjYW4gZW5hYmxlIHRoZW0gYnkgc2F5aW5nIFkgdG8gIi9wcm9jIGZpbGUKKwkgIHN5c3RlbSBzdXBwb3J0IiBhbmQgIlN5c2N0bCBzdXBwb3J0IiwgYW5kIGFmdGVyIHRoZSAvcHJvYyBmaWxlCisJICBzeXN0ZW0gaGFzIGJlZW4gbW91bnRlZCwgZXhlY3V0aW5nIHRoZSBjb21tYW5kCisKKwkgIAljb21tYW5kCQkJd2hhdCBpcyBlbmFibGVkCisKKwkgIGVjaG8gMD4vcHJvYy9BTGk1NDUxCXBjbSBvdXQgaXMgYWxzbyBzZXQgdG8gUy9QRElGIG91dC4gKERlZmF1bHQpLgorCisJICBlY2hvIDE+L3Byb2MvQUxpNTQ1MQl1c2UgUy9QRElGIG91dCB0byBvdXRwdXQgcGNtIGRhdGEuCisKKwkgIGVjaG8gMj4vcHJvYy9BTGk1NDUxCXVzZSBTL1BESUYgb3V0IHRvIG91dHB1dCBub24tcGNtIGRhdGEuCisJICAoQUMzLi4uKS4KKworCSAgZWNobyAzPi9wcm9jL0FMaTU0NTEJcmVjb3JkIGZyb20gQWM5NyBpbihNSUMsIExpbmUgaW4uLi4pLgorCSAgKERlZmF1bHQpLgorCisJICBlY2hvIDQ+L3Byb2MvQUxpNTQ1MQlubyBtYXR0ZXIgQWM5NyBzZXR0aW5ncywgcmVjb3JkIGZyb20gUy9QRElGCisJICBpbi4KKworCisJICBUaGlzIGRyaXZlciBkaWZmZXJzIHNsaWdodGx5IGZyb20gT1NTL0ZyZWUsIHNvIFBMRUFTRSBSRUFEIHRoZQorCSAgY29tbWVudHMgYXQgdGhlIHRvcCBvZiA8ZmlsZTpkcml2ZXJzL3NvdW5kL3RyaWRlbnQuYz4uCisKK2NvbmZpZyBTT1VORF9NU05EQ0xBUworCXRyaXN0YXRlICJTdXBwb3J0IGZvciBUdXJ0bGUgQmVhY2ggTXVsdGlTb3VuZCBDbGFzc2ljLCBUYWhpdGksIE1vbnRlcmV5IgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQgJiYgKG0gfHwgIVNUQU5EQUxPTkUpCisJaGVscAorCSAgU2F5IE0gaGVyZSBpZiB5b3UgaGF2ZSBhIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kIENsYXNzaWMsIFRhaGl0aSBvcgorCSAgTW9udGVyZXkgKG5vdCBmb3IgdGhlIFBpbm5hY2xlIG9yIEZpamkpLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvTXVsdGlTb3VuZD4gZm9yIGltcG9ydGFudCBpbmZvcm1hdGlvbgorCSAgYWJvdXQgdGhpcyBkcml2ZXIuICBOb3RlIHRoYXQgaXQgaGFzIGJlZW4gZGlzY29udGludWVkLCBidXQgdGhlCisJICBWb3lldHJhIFR1cnRsZSBCZWFjaCBrbm93bGVkZ2UgYmFzZSBlbnRyeSBmb3IgaXQgaXMgc3RpbGwgYXZhaWxhYmxlCisJICBhdCA8aHR0cDovL3d3dy50dXJ0bGViZWFjaC5jb20vc2l0ZS9rYl9mdHAvNzkwLmFzcD4uCisKK2NvbW1lbnQgIkNvbXBpbGVkLWluIE1TTkQgQ2xhc3NpYyBzdXBwb3J0IHJlcXVpcmVzIGZpcm13YXJlIGR1cmluZyBjb21waWxhdGlvbi4iCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBTT1VORF9NU05EQ0xBUz15CisKK2NvbmZpZyBNU05EQ0xBU19IQVZFX0JPT1QKKwlib29sCisJZGVwZW5kcyBvbiBTT1VORF9NU05EQ0xBUz15ICYmICFTVEFOREFMT05FCisJZGVmYXVsdCB5CisKK2NvbmZpZyBNU05EQ0xBU19JTklUX0ZJTEUKKwlzdHJpbmcgIkZ1bGwgcGF0aG5hbWUgb2YgTVNORElOSVQuQklOIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBTT1VORF9NU05EQ0xBUworCWRlZmF1bHQgIi9ldGMvc291bmQvbXNuZGluaXQuYmluIgorCWhlbHAKKwkgIFRoZSBNdWx0aVNvdW5kIGNhcmRzIGhhdmUgdHdvIGZpcm13YXJlIGZpbGVzIHdoaWNoIGFyZSByZXF1aXJlZCBmb3IKKwkgIG9wZXJhdGlvbiwgYW5kIGFyZSBub3QgY3VycmVudGx5IGluY2x1ZGVkLiBUaGVzZSBmaWxlcyBjYW4gYmUKKwkgIG9idGFpbmVkIGZyb20gVHVydGxlIEJlYWNoLiBTZWUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL011bHRpU291bmQ+IGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8KKwkgIG9idGFpbiB0aGlzLgorCitjb25maWcgTVNORENMQVNfUEVSTV9GSUxFCisJc3RyaW5nICJGdWxsIHBhdGhuYW1lIG9mIE1TTkRQRVJNLkJJTiBmaXJtd2FyZSBmaWxlIgorCWRlcGVuZHMgb24gU09VTkRfTVNORENMQVMKKwlkZWZhdWx0ICIvZXRjL3NvdW5kL21zbmRwZXJtLmJpbiIKKwloZWxwCisJICBUaGUgTXVsdGlTb3VuZCBjYXJkcyBoYXZlIHR3byBmaXJtd2FyZSBmaWxlcyB3aGljaCBhcmUgcmVxdWlyZWQgZm9yCisJICBvcGVyYXRpb24sIGFuZCBhcmUgbm90IGN1cnJlbnRseSBpbmNsdWRlZC4gVGhlc2UgZmlsZXMgY2FuIGJlCisJICBvYnRhaW5lZCBmcm9tIFR1cnRsZSBCZWFjaC4gU2VlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9NdWx0aVNvdW5kPiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvCisJICBvYnRhaW4gdGhpcy4KKworY29uZmlnIE1TTkRDTEFTX0lSUQorCWludCAiTVNORCBDbGFzc2ljIElSUSA1LCA3LCA5LCAxMCwgMTEsIDEyIgorCWRlcGVuZHMgb24gU09VTkRfTVNORENMQVM9eQorCWRlZmF1bHQgIjUiCisJaGVscAorCSAgSW50ZXJydXB0IFJlcXVlc3QgbGluZSBmb3IgdGhlIE11bHRpU291bmQgQ2xhc3NpYyBhbmQgcmVsYXRlZCBjYXJkcy4KKworY29uZmlnIE1TTkRDTEFTX01FTQorCWhleCAiTVNORCBDbGFzc2ljIG1lbW9yeSBCMDAwMCwgQzgwMDAsIEQwMDAwLCBEODAwMCwgRTAwMDAsIEU4MDAwIgorCWRlcGVuZHMgb24gU09VTkRfTVNORENMQVM9eQorCWRlZmF1bHQgIkQwMDAwIgorCWhlbHAKKwkgIE1lbW9yeS1tYXBwZWQgSS9PIGJhc2UgYWRkcmVzcyBmb3IgdGhlIE11bHRpU291bmQgQ2xhc3NpYyBhbmQKKwkgIHJlbGF0ZWQgY2FyZHMuCisKK2NvbmZpZyBNU05EQ0xBU19JTworCWhleCAiTVNORCBDbGFzc2ljIEkvTyAyMTAsIDIyMCwgMjMwLCAyNDAsIDI1MCwgMjYwLCAyOTAsIDNFMCIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRDTEFTPXkKKwlkZWZhdWx0ICIyOTAiCisJaGVscAorCSAgSS9PIHBvcnQgYWRkcmVzcyBmb3IgdGhlIE11bHRpU291bmQgQ2xhc3NpYyBhbmQgcmVsYXRlZCBjYXJkcy4KKworY29uZmlnIFNPVU5EX01TTkRQSU4KKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgVHVydGxlIEJlYWNoIE11bHRpU291bmQgUGlubmFjbGUsIEZpamkiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiAobSB8fCAhU1RBTkRBTE9ORSkKKwloZWxwCisJICBTYXkgTSBoZXJlIGlmIHlvdSBoYXZlIGEgVHVydGxlIEJlYWNoIE11bHRpU291bmQgUGlubmFjbGUgb3IgRmlqaS4KKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9NdWx0aVNvdW5kPiBmb3IgaW1wb3J0YW50IGluZm9ybWF0aW9uCisJICBhYm91dCB0aGlzIGRyaXZlci4gTm90ZSB0aGF0IGl0IGhhcyBiZWVuIGRpc2NvbnRpbnVlZCwgYnV0IHRoZQorCSAgVm95ZXRyYSBUdXJ0bGUgQmVhY2gga25vd2xlZGdlIGJhc2UgZW50cnkgZm9yIGl0IGlzIHN0aWxsIGF2YWlsYWJsZQorCSAgYXQgPGh0dHA6Ly93d3cudHVydGxlYmVhY2guY29tL3NpdGUva2JfZnRwLzYwMC5hc3A+LgorCitjb21tZW50ICJDb21waWxlZC1pbiBNU05EIFBpbm5hY2xlIHN1cHBvcnQgcmVxdWlyZXMgZmlybXdhcmUgZHVyaW5nIGNvbXBpbGF0aW9uLiIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFNPVU5EX01TTkRQSU49eQorCitjb25maWcgTVNORFBJTl9IQVZFX0JPT1QKKwlib29sCisJZGVwZW5kcyBvbiBTT1VORF9NU05EUElOPXkKKwlkZWZhdWx0IHkKKworY29uZmlnIE1TTkRQSU5fSU5JVF9GSUxFCisJc3RyaW5nICJGdWxsIHBhdGhuYW1lIG9mIFBORFNQSU5JLkJJTiBmaXJtd2FyZSBmaWxlIgorCWRlcGVuZHMgb24gU09VTkRfTVNORFBJTgorCWRlZmF1bHQgIi9ldGMvc291bmQvcG5kc3BpbmkuYmluIgorCWhlbHAKKwkgIFRoZSBNdWx0aVNvdW5kIGNhcmRzIGhhdmUgdHdvIGZpcm13YXJlIGZpbGVzIHdoaWNoIGFyZSByZXF1aXJlZAorCSAgZm9yIG9wZXJhdGlvbiwgYW5kIGFyZSBub3QgY3VycmVudGx5IGluY2x1ZGVkLiBUaGVzZSBmaWxlcyBjYW4gYmUKKwkgIG9idGFpbmVkIGZyb20gVHVydGxlIEJlYWNoLiBTZWUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL011bHRpU291bmQ+IGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8KKwkgIG9idGFpbiB0aGlzLgorCitjb25maWcgTVNORFBJTl9QRVJNX0ZJTEUKKwlzdHJpbmcgIkZ1bGwgcGF0aG5hbWUgb2YgUE5EU1BFUk0uQklOIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBTT1VORF9NU05EUElOCisJZGVmYXVsdCAiL2V0Yy9zb3VuZC9wbmRzcGVybS5iaW4iCisJaGVscAorCSAgVGhlIE11bHRpU291bmQgY2FyZHMgaGF2ZSB0d28gZmlybXdhcmUgZmlsZXMgd2hpY2ggYXJlIHJlcXVpcmVkIGZvcgorCSAgb3BlcmF0aW9uLCBhbmQgYXJlIG5vdCBjdXJyZW50bHkgaW5jbHVkZWQuIFRoZXNlIGZpbGVzIGNhbiBiZQorCSAgb2J0YWluZWQgZnJvbSBUdXJ0bGUgQmVhY2guIFNlZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvTXVsdGlTb3VuZD4gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0bworCSAgb2J0YWluIHRoaXMuCisKK2NvbmZpZyBNU05EUElOX0lSUQorCWludCAiTVNORCBQaW5uYWNsZSBJUlEgNSwgNywgOSwgMTAsIDExLCAxMiIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRQSU49eQorCWRlZmF1bHQgIjUiCisJaGVscAorCSAgSW50ZXJydXB0IHJlcXVlc3QgbGluZSBmb3IgdGhlIHByaW1hcnkgc3ludGhlc2l6ZXIgb24gTXVsdGlTb3VuZAorCSAgUGlubmFjbGUgYW5kIEZpamkgc291bmQgY2FyZHMuCisKK2NvbmZpZyBNU05EUElOX01FTQorCWhleCAiTVNORCBQaW5uYWNsZSBtZW1vcnkgQjAwMDAsIEM4MDAwLCBEMDAwMCwgRDgwMDAsIEUwMDAwLCBFODAwMCIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRQSU49eQorCWRlZmF1bHQgIkQwMDAwIgorCWhlbHAKKwkgIE1lbW9yeS1tYXBwZWQgSS9PIGJhc2UgYWRkcmVzcyBmb3IgdGhlIHByaW1hcnkgc3ludGhlc2l6ZXIgb24KKwkgIE11bHRpU291bmQgUGlubmFjbGUgYW5kIEZpamkgc291bmQgY2FyZHMuCisKK2NvbmZpZyBNU05EUElOX0lPCisJaGV4ICJNU05EIFBpbm5hY2xlIEkvTyAyMTAsIDIyMCwgMjMwLCAyNDAsIDI1MCwgMjYwLCAyOTAsIDNFMCIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRQSU49eQorCWRlZmF1bHQgIjI5MCIKKwloZWxwCisJICBNZW1vcnktbWFwcGVkIEkvTyBiYXNlIGFkZHJlc3MgZm9yIHRoZSBwcmltYXJ5IHN5bnRoZXNpemVyIG9uCisJICBNdWx0aVNvdW5kIFBpbm5hY2xlIGFuZCBGaWppIHNvdW5kIGNhcmRzLgorCitjb25maWcgTVNORFBJTl9ESUdJVEFMCisJYm9vbCAiTVNORCBQaW5uYWNsZSBoYXMgUy9QRElGIEkvTyIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRQSU49eQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIHRoZSBTL1BESUYgZGF1Z2h0ZXIgYm9hcmQgZm9yIHRoZSBQaW5uYWNsZSBvciBGaWppLAorCSAgYW5zd2VyIFkgaGVyZTsgb3RoZXJ3aXNlLCBzYXkgTi4gSWYgeW91IGhhdmUgdGhpcywgeW91IHdpbGwgYmUgYWJsZQorCSAgdG8gcGxheSBhbmQgcmVjb3JkIGZyb20gdGhlIFMvUERJRiBwb3J0IChkaWdpdGFsIHNpZ25hbCkuIFNlZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvTXVsdGlTb3VuZD4gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBtYWtlCisJICB1c2Ugb2YgdGhpcyBjYXBhYmlsaXR5LgorCitjb25maWcgTVNORFBJTl9OT05QTlAKKwlib29sICJNU05EIFBpbm5hY2xlIG5vbi1QblAgTW9kZSIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRQSU49eQorCWhlbHAKKwkgIFRoZSBQaW5uYWNsZSBhbmQgRmlqaSBjYXJkIHJlc291cmNlcyBjYW4gYmUgY29uZmlndXJlZCBlaXRoZXIgd2l0aAorCSAgUG5QLCBvciB0aHJvdWdoIGEgY29uZmlndXJhdGlvbiBwb3J0LiBTYXkgWSBoZXJlIGlmIHlvdXIgY2FyZCBpcyBOT1QKKwkgIGluIFBuUCBtb2RlLiBGb3IgdGhlIFBpbm5hY2xlLCBjb25maWd1cmF0aW9uIGluIG5vbi1QblAgbW9kZSBhbGxvd3MKKwkgIHVzZSBvZiB0aGUgSURFIGFuZCBqb3lzdGljayBwZXJpcGhlcmFscyBvbiB0aGUgY2FyZCBhcyB3ZWxsOyB0aGVzZQorCSAgZG8gbm90IHNob3cgdXAgd2hlbiB0aGUgY2FyZCBpcyBpbiBQblAgbW9kZS4gU3BlY2lmeWluZyB6ZXJvIGZvciBhbnkKKwkgIHJlc291cmNlIG9mIGEgZGV2aWNlIHdpbGwgZGlzYWJsZSB0aGUgZGV2aWNlLiBJZiB5b3UgYXJlIHJ1bm5pbmcgdGhlCisJICBjYXJkIGluIFBuUCBtb2RlLCB5b3UgbXVzdCBzYXkgTiBoZXJlIGFuZCB1c2UgaXNhcG5wdG9vbHMgdG8KKwkgIGNvbmZpZ3VyZSB0aGUgY2FyZCdzIHJlc291cmNlcy4KKworY29tbWVudCAiTVNORCBQaW5uYWNsZSBEU1Agc2VjdGlvbiB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gYWJvdmUgcGFyYW1ldGVycy4iCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBTT1VORF9NU05EUElOPXkgJiYgTVNORFBJTl9OT05QTlAKKworY29uZmlnIE1TTkRQSU5fQ0ZHCisJaGV4ICJNU05EIFBpbm5hY2xlIGNvbmZpZyBwb3J0IDI1MCwyNjAsMjcwIgorCWRlcGVuZHMgb24gTVNORFBJTl9OT05QTlAKKwlkZWZhdWx0ICIyNTAiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgcG9ydCB3aGljaCB0aGUgUGlubmFjbGUgYW5kIEZpamkgdXNlcyB0byBjb25maWd1cmUgdGhlCisJICBjYXJkJ3MgcmVzb3VyY2VzIHdoZW4gbm90IGluIFBuUCBtb2RlLiBJZiB5b3VyIGNhcmQgaXMgaW4gUG5QIG1vZGUsCisJICB0aGVuIGJlIHN1cmUgdG8gc2F5IE4gdG8gdGhlIHByZXZpb3VzIG9wdGlvbiwgIk1TTkQgUGlubmFjbGUgTm9uLVBuUAorCSAgTW9kZSIuCisKK2NvbW1lbnQgIlBpbm5hY2xlLXNwZWNpZmljIERldmljZSBDb25maWd1cmF0aW9uICgwIGRpc2FibGVzKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFNPVU5EX01TTkRQSU49eSAmJiBNU05EUElOX05PTlBOUAorCitjb25maWcgTVNORFBJTl9NUFVfSU8KKwloZXggIk1TTkQgUGlubmFjbGUgTVBVIEkvTyAoZS5nLiAzMzApIgorCWRlcGVuZHMgb24gTVNORFBJTl9OT05QTlAKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIE1lbW9yeS1tYXBwZWQgSS9PIGJhc2UgYWRkcmVzcyBmb3IgdGhlIEt1cnp3ZWlsIGRhdWdodGVyYm9hcmQKKwkgIHN5bnRoZXNpemVyIG9uIE11bHRpU291bmQgUGlubmFjbGUgYW5kIEZpamkgc291bmQgY2FyZHMuCisKK2NvbmZpZyBNU05EUElOX01QVV9JUlEKKwlpbnQgIk1TTkQgUGlubmFjbGUgTVBVIElSUSAoZS5nLiA5KSIKKwlkZXBlbmRzIG9uIE1TTkRQSU5fTk9OUE5QCisJZGVmYXVsdCAiMCIKKwloZWxwCisJICBJbnRlcnJ1cHQgcmVxdWVzdCBudW1iZXIgZm9yIHRoZSBLdXJ6d2VpbCBkYXVnaHRlcmJvYXJkCisJICBzeW50aGVzaXplciBvbiBNdWx0aVNvdW5kIFBpbm5hY2xlIGFuZCBGaWppIHNvdW5kIGNhcmRzLgorCitjb25maWcgTVNORFBJTl9JREVfSU8wCisJaGV4ICJNU05EIFBpbm5hY2xlIElERSBJL08gMCAoZS5nLiAxNzApIgorCWRlcGVuZHMgb24gTVNORFBJTl9OT05QTlAKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIENELVJPTSBkcml2ZSAwIG1lbW9yeS1tYXBwZWQgSS9PIGJhc2UgYWRkcmVzcyBmb3IgdGhlIE11bHRpU291bmQKKwkgIFBpbm5hY2xlIGFuZCBGaWppIHNvdW5kIGNhcmRzLgorCitjb25maWcgTVNORFBJTl9JREVfSU8xCisJaGV4ICJNU05EIFBpbm5hY2xlIElERSBJL08gMSAoZS5nLiAzNzYpIgorCWRlcGVuZHMgb24gTVNORFBJTl9OT05QTlAKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIENELVJPTSBkcml2ZSAxIG1lbW9yeS1tYXBwZWQgSS9PIGJhc2UgYWRkcmVzcyBmb3IgdGhlIE11bHRpU291bmQKKwkgIFBpbm5hY2xlIGFuZCBGaWppIHNvdW5kIGNhcmRzLgorCitjb25maWcgTVNORFBJTl9JREVfSVJRCisJaW50ICJNU05EIFBpbm5hY2xlIElERSBJUlEgKGUuZy4gMTUpIgorCWRlcGVuZHMgb24gTVNORFBJTl9OT05QTlAKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIEludGVycnVwdCByZXF1ZXN0IG51bWJlciBmb3IgdGhlIElERSBDRC1ST00gaW50ZXJmYWNlIG9uIHRoZQorCSAgTXVsdGlTb3VuZCBQaW5uYWNsZSBhbmQgRmlqaSBzb3VuZCBjYXJkcy4KKworY29uZmlnIE1TTkRQSU5fSk9ZU1RJQ0tfSU8KKwloZXggIk1TTkQgUGlubmFjbGUgam95c3RpY2sgSS9PIChlLmcuIDIwMCkiCisJZGVwZW5kcyBvbiBNU05EUElOX05PTlBOUAorCWRlZmF1bHQgIjAiCisJaGVscAorCSAgTWVtb3J5LW1hcHBlZCBJL08gYmFzZSBhZGRyZXNzIGZvciB0aGUgam95c3RpY2sgcG9ydCBvbiBNdWx0aVNvdW5kCisJICBQaW5uYWNsZSBhbmQgRmlqaSBzb3VuZCBjYXJkcy4KKworY29uZmlnIE1TTkRfRklGT1NJWkUKKwlpbnQgIk1TTkQgYnVmZmVyIHNpemUgKGtCKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIChTT1VORF9NU05EUElOPXkgfHwgU09VTkRfTVNORENMQVM9eSkKKwlkZWZhdWx0ICIxMjgiCisJaGVscAorCSAgQ29uZmlndXJlcyB0aGUgc2l6ZSBvZiBlYWNoIGF1ZGlvIGJ1ZmZlciwgaW4ga2lsb2J5dGVzLCBmb3IKKwkgIHJlY29yZGluZyBhbmQgcGxheWluZyBpbiB0aGUgTXVsdGlTb3VuZCBkcml2ZXJzIChib3RoIHRoZSBDbGFzc2ljCisJICBhbmQgUGlubmFjbGUpLiBMYXJnZXIgdmFsdWVzIHJlZHVjZSB0aGUgY2hhbmNlIG9mIGRhdGEgb3ZlcnJ1bnMgYXQKKwkgIHRoZSBleHBlbnNlIG9mIG92ZXJhbGwgbGF0ZW5jeS4gSWYgdW5zdXJlLCB1c2UgdGhlIGRlZmF1bHQuCisKK2NvbmZpZyBTT1VORF9WSUE4MkNYWFgKKwl0cmlzdGF0ZSAiVklBIDgyQzY4NiBBdWRpbyBDb2RlYyIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgYXVkaW8gY29kZWMgZm91bmQgb24gVklBCisJICA4MkN4eHgtYmFzZWQgY2hpcHMuIFR5cGljYWxseSB0aGVzZSBhcmUgYnVpbHQgaW50byBhIG1vdGhlcmJvYXJkLgorCisJICBETyBOT1Qgc2VsZWN0IFNvdW5kIEJsYXN0ZXIgb3IgQWRsaWIgd2l0aCB0aGlzIGRyaXZlciwgdW5sZXNzCisJICB5b3UgaGF2ZSBhIFNvdW5kIEJsYXN0ZXIgb3IgQWRsaWIgY2FyZCBpbiBhZGRpdGlvbiB0byB5b3VyIFZJQQorCSAgYXVkaW8gY2hpcC4KKworY29uZmlnIE1JRElfVklBODJDWFhYCisJYm9vbCAiVklBIDgyQzY4NiBNSURJIgorCWRlcGVuZHMgb24gU09VTkRfVklBODJDWFhYCisJaGVscAorCSAgQW5zd2VyIFkgdG8gdXNlIHRoZSBNSURJIGludGVyZmFjZSBvZiB0aGUgVmlhNjg2LiBZb3UgbWF5IG5lZWQgdG8KKwkgIGVuYWJsZSB0aGlzIGluIHRoZSBCSU9TIGJlZm9yZSBpdCB3aWxsIHdvcmsuIFRoaXMgaXMgZm9yIGNvbm5lY3Rpb24KKwkgIHRvIGV4dGVybmFsIE1JREkgaGFyZHdhcmUsIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHNvZnR3YXJlIHBsYXliYWNrCisJICBvZiBNSURJIGZpbGVzLgorCitjb25maWcgU09VTkRfT1NTCisJdHJpc3RhdGUgIk9TUyBzb3VuZCBtb2R1bGVzIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQKKwloZWxwCisJICBPU1MgaXMgdGhlIE9wZW4gU291bmQgU3lzdGVtIHN1aXRlIG9mIHNvdW5kIGNhcmQgZHJpdmVycy4gIFRoZXkgbWFrZQorCSAgc291bmQgcHJvZ3JhbW1pbmcgZWFzaWVyIHNpbmNlIHRoZXkgcHJvdmlkZSBhIGNvbW1vbiBBUEkuICBTYXkgWSBvcgorCSAgTSBoZXJlICh0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNvdW5kKSBpZiB5b3UgaGF2ZW4ndCBmb3VuZCBhCisJICBkcml2ZXIgZm9yIHlvdXIgc291bmQgY2FyZCBhYm92ZSwgdGhlbiBwaWNrIHlvdXIgZHJpdmVyIGZyb20gdGhlCisJICBsaXN0IGJlbG93LgorCitjb25maWcgU09VTkRfVFJBQ0VJTklUCisJYm9vbCAiVmVyYm9zZSBpbml0aWFsaXNhdGlvbiIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCWhlbHAKKwkgIFZlcmJvc2Ugc291bmRjYXJkIGluaXRpYWxpemF0aW9uIC0tIGFmZmVjdHMgdGhlIGZvcm1hdCBvZiBhdXRvcHJvYmUKKwkgIGFuZCBpbml0aWFsaXphdGlvbiBtZXNzYWdlcyBhdCBib290IHRpbWUuCisKK2NvbmZpZyBTT1VORF9ETUFQCisJYm9vbCAiUGVyc2lzdGVudCBETUEgYnVmZmVycyIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCS0tLWhlbHAtLS0KKwkgIExpbnV4IGNhbiBvZnRlbiBoYXZlIHByb2JsZW1zIGFsbG9jYXRpbmcgRE1BIGJ1ZmZlcnMgZm9yIElTQSBzb3VuZAorCSAgY2FyZHMgb24gbWFjaGluZXMgd2l0aCBtb3JlIHRoYW4gMTZNQiBvZiBSQU0uIFRoaXMgaXMgYmVjYXVzZSBJU0EKKwkgIERNQSBidWZmZXJzIG11c3QgZXhpc3QgYmVsb3cgdGhlIDE2TUIgYm91bmRhcnkgYW5kIGl0IGlzIHF1aXRlCisJICBwb3NzaWJsZSB0aGF0IGEgbGFyZ2UgZW5vdWdoIGZyZWUgYmxvY2sgaW4gdGhpcyByZWdpb24gY2Fubm90IGJlCisJICBmb3VuZCBhZnRlciB0aGUgbWFjaGluZSBoYXMgYmVlbiBydW5uaW5nIGZvciBhIHdoaWxlLiBJZiB5b3Ugc2F5IFkKKwkgIGhlcmUgdGhlIERNQSBidWZmZXJzICg2NEtiKSB3aWxsIGJlIGFsbG9jYXRlZCBhdCBib290IHRpbWUgYW5kIGtlcHQKKwkgIHVudGlsIHRoZSBzaHV0ZG93bi4gVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IHNhaWQgWSB0bworCSAgIk9TUyBzb3VuZCBtb2R1bGVzIiwgYWJvdmUuIElmIHlvdSBzYWlkIE0gdG8gIk9TUyBzb3VuZCBtb2R1bGVzIgorCSAgdGhlbiB5b3UgY2FuIGdldCB0aGUgcGVyc2lzdGVudCBETUEgYnVmZmVyIGZ1bmN0aW9uYWxpdHkgYnkgcGFzc2luZworCSAgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudCAiZG1hYnVmPTEiIHRvIHRoZSBzb3VuZCBtb2R1bGUuCisKKwkgIFNheSBZIHVubGVzcyB5b3UgaGF2ZSAxNk1CIG9yIG1vcmUgUkFNIG9yIGEgUENJIHNvdW5kIGNhcmQuCisKK2NvbmZpZyBTT1VORF9BRDE4MTYKKwl0cmlzdGF0ZSAiQUQxODE2KEEpIGJhc2VkIGNhcmRzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFNPVU5EX09TUworCWhlbHAKKwkgIFNheSBNIGhlcmUgaWYgeW91IGhhdmUgYSBzb3VuZCBjYXJkIGJhc2VkIG9uIHRoZSBBbmFsb2cgRGV2aWNlcworCSAgQUQxODE2KEEpIGNoaXAuCisKKwkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsLCB5b3UgaGF2ZSB0byBhZGQKKwkgICJhZDE4MTY9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4iIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCitjb25maWcgU09VTkRfQUQxODg5CisJdHJpc3RhdGUgIkFEMTg4OSBiYXNlZCBjYXJkcyAoQUQxODE5IGNvZGVjKSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBTT1VORF9PU1MKKwloZWxwCisJICBTYXkgTSBoZXJlIGlmIHlvdSBoYXZlIGEgc291bmQgY2FyZCBiYXNlZCBvbiB0aGUgQW5hbG9nIERldmljZXMKKwkgIEFEMTg4OSBjaGlwLgorCitjb25maWcgU09VTkRfU0dBTEFYWQorCXRyaXN0YXRlICJBenRlY2ggU291bmQgR2FsYXh5IChub24tUG5QKSBjYXJkcyIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCWhlbHAKKwkgIFRoaXMgbW9kdWxlIGluaXRpYWxpemVzIHRoZSBvbGRlciBub24gUGx1ZyBhbmQgUGxheSBzb3VuZCBnYWxheHkKKwkgIGNhcmRzIGZyb20gQXp0ZWNoLiBJdCBzdXBwb3J0cyB0aGUgV2F2ZXJpZGVyIFBybyAzMiAtIDNEIGFuZCB0aGUKKwkgIEdhbGF4eSBXYXNoaW5ndG9uIDE2LgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAic2dhbGF4eT08aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8c2diYXNlPiIgdG8gdGhlIGtlcm5lbCBjb21tYW5kCisJICBsaW5lLgorCitjb25maWcgU09VTkRfQURMSUIKKwl0cmlzdGF0ZSAiQWRsaWIgQ2FyZHMiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBJbmNsdWRlcyBBU0IgNjQgNEQuIEluZm9ybWF0aW9uIG9uIHByb2dyYW1taW5nIEFkTGliIGNhcmRzIGlzCisJICBhdmFpbGFibGUgYXQgPGh0dHA6Ly93d3cuaXRzbmV0LmNvbS9ob21lL2xkcmFnb24vU3BlY3MvYWRsaWIuaHRtbD4uCisKK2NvbmZpZyBTT1VORF9BQ0lfTUlYRVIKKwl0cmlzdGF0ZSAiQUNJIG1peGVyIChtaXJvU09VTkQgUENNMS1wcm8vUENNMTIvUENNMjApIgorCWRlcGVuZHMgb24gU09VTkRfT1NTCisJLS0taGVscC0tLQorCSAgQUNJIChBdWRpbyBDb21tYW5kIEludGVyZmFjZSkgaXMgYSBwcm90b2NvbCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGgKKwkgIHRoZSBtaWNyb2NvbnRyb2xsZXIgb24gc29tZSBzb3VuZCBjYXJkcyBwcm9kdWNlZCBieSBtaXJvIGFuZAorCSAgQ2FyZGluYWwgVGVjaG5vbG9naWVzLiAgVGhlIG1haW4gZnVuY3Rpb24gb2YgdGhlIEFDSSBpcyB0byBjb250cm9sCisJICB0aGUgbWl4ZXIgYW5kIHRvIGdldCBhIHByb2R1Y3QgaWRlbnRpZmljYXRpb24uCisKKwkgIFRoaXMgVm94V2FyZSBBQ0kgZHJpdmVyIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQUNJIGZ1bmN0aW9ucyBvbiB0aGUKKwkgIG1pcm9TT1VORCBQQ00xLXBybywgUENNMTIgYW5kIFBDTTIwIHJhZGlvLiBPbiB0aGUgUENNMjAgcmFkaW8sIEFDSQorCSAgYWxzbyBjb250cm9scyB0aGUgcmFkaW8gdHVuZXIuIFRoaXMgaXMgc3VwcG9ydGVkIGluIHRoZSB2aWRlbzRsaW51eAorCSAgbWlyb3BjbTIwIGRyaXZlciAoc2F5IE0gb3IgWSBoZXJlIGFuZCBnbyBiYWNrIHRvICJNdWx0aW1lZGlhCisJICBkZXZpY2VzIiAtPiAiUmFkaW8gQWRhcHRlcnMiKS4KKworCSAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgYW5kIHdpbGwgYmUgY2FsbGVkIGFjaS4KKworY29uZmlnIFNPVU5EX0NTNDIzMgorCXRyaXN0YXRlICJDcnlzdGFsIENTNDIzMiBiYXNlZCAoUG5QKSBjYXJkcyIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBjYXJkIGJhc2VkIG9uIHRoZSBDcnlzdGFsIENTNDIzMiBjaGlwIHNldCwKKwkgIHdoaWNoIHVzZXMgaXRzIG93biBQbHVnIGFuZCBQbGF5IHByb3RvY29sLgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAiY3M0MjMyPTxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDxtcHVpbz4sPG1wdWlycT4iIHRvIHRoZSBrZXJuZWwKKwkgIGNvbW1hbmQgbGluZS4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL0NTNDIzMj4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKwkgIGNvbmZpZ3VyaW5nIHRoaXMgY2FyZC4KKworY29uZmlnIFNPVU5EX1NTQ0FQRQorCXRyaXN0YXRlICJFbnNvbmlxIFNvdW5kU2NhcGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCWhlbHAKKwkgIEFuc3dlciBZIGlmIHlvdSBoYXZlIGEgc291bmQgY2FyZCBiYXNlZCBvbiB0aGUgRW5zb25pcSBTb3VuZFNjYXBlCisJICBjaGlwc2V0LiBTdWNoIGNhcmRzIGFyZSBiZWluZyBtYW51ZmFjdHVyZWQgYXQgbGVhc3QgYnkgRW5zb25pcSwgU3BlYQorCSAgYW5kIFJldmVhbCAoUmV2ZWFsIG1ha2VzIGFsc28gb3RoZXIgY2FyZHMpLgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAic3NjYXBlPTxpbz4sPGlycT4sPGRtYT4sPG1wdWlvPiw8bXB1aXJxPiIgdG8gdGhlIGtlcm5lbCBjb21tYW5kCisJICBsaW5lLgorCitjb25maWcgU09VTkRfR1VTCisJdHJpc3RhdGUgIkdyYXZpcyBVbHRyYXNvdW5kIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBTYXkgWSBoZXJlIGZvciBhbnkgdHlwZSBvZiBHcmF2aXMgVWx0cmFzb3VuZCBjYXJkLCBpbmNsdWRpbmcgdGhlIEdVUworCSAgb3IgR1VTIE1BWC4gIFNlZSBhbHNvIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL3VsdHJhc291bmQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZyB0aGlzIGNhcmQgd2l0aCBtb2R1bGVzLgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAiZ3VzPTxpbz4sPGlycT4sPGRtYT4sPGRtYTI+IiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKworY29uZmlnIFNPVU5EX0dVUzE2CisJYm9vbCAiMTYgYml0IHNhbXBsaW5nIG9wdGlvbiBvZiBHVVMgKF9OT1RfIEdVUyBNQVgpIgorCWRlcGVuZHMgb24gU09VTkRfR1VTCisJaGVscAorCSAgU3VwcG9ydCBmb3IgR3JhdmlzIFVsc3RyYXNvdW5kIChHVVMpIGNhcmRzIChvdGhlciB0aGFuIHRoZSBHVVMpLAorCSAgc2FtcGxpbmcgYXQgMTYtYml0IHdpZHRoLgorCitjb25maWcgU09VTkRfR1VTTUFYCisJYm9vbCAiR1VTIE1BWCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkRfR1VTCisJaGVscAorCSAgU3VwcG9ydCBmb3IgR3JhdmlzIFVsc3RyYXNvdW5kIE1BWC4KKworY29uZmlnIFNPVU5EX1ZNSURJCisJdHJpc3RhdGUgIkxvb3BiYWNrIE1JREkgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBTdXBwb3J0IGZvciBNSURJIGxvb3BiYWNrIG9uIHBvcnQgMSBvciAyLgorCitjb25maWcgU09VTkRfVFJJWAorCXRyaXN0YXRlICJNZWRpYVRyaXggQXVkaW9Ucml4IFBybyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkRfT1NTCisJaGVscAorCSAgQW5zd2VyIFkgaWYgeW91IGhhdmUgdGhlIEF1ZGlvVHJpWCBQcm8gc291bmQgY2FyZCBtYW51ZmFjdHVyZWQKKwkgIGJ5IE1lZGlhVHJpeC4KKworY29uZmlnIFRSSVhfSEFWRV9CT09UCisJYm9vbCAiSGF2ZSBUUlhQUk8uSEVYIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBTT1VORF9UUklYPXkgJiYgIVNUQU5EQUxPTkUKKwloZWxwCisJICBUaGUgTWVkaWFUcml4IEF1ZGlvVHJpeCBQcm8gaGFzIGFuIG9uLWJvYXJkIG1pY3JvY29udHJvbGxlciB3aGljaAorCSAgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgZG93bmxvYWRpbmcgdGhlIGNvZGUgZnJvbSB0aGUgZmlsZQorCSAgVFJYUFJPLkhFWCBpbiB0aGUgRE9TIGRyaXZlciBkaXJlY3RvcnkuIElmIHlvdSBkb24ndCBoYXZlIHRoZQorCSAgVFJYUFJPLkhFWCBmaWxlIGhhbmR5IHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAuIEhvd2V2ZXIsIHRoZSBTQiBhbmQKKwkgIE1QVS00MDEgbW9kZXMgb2YgQXVkaW9Ucml4IFBybyB3aWxsIG5vdCB3b3JrIHdpdGhvdXQgdGhpcyBmaWxlIQorCitjb25maWcgVFJJWF9CT09UX0ZJTEUKKwlzdHJpbmcgIkZ1bGwgcGF0aG5hbWUgb2YgVFJYUFJPLkhFWCBmaXJtd2FyZSBmaWxlIgorCWRlcGVuZHMgb24gVFJJWF9IQVZFX0JPT1QKKwlkZWZhdWx0ICIvZXRjL3NvdW5kL3RyeHByby5oZXgiCisJaGVscAorCSAgRW50ZXIgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgeW91ciBUUlhQUk8uSEVYIGZpbGUsIHN0YXJ0aW5nIGZyb20gLy4KKworY29uZmlnIFNPVU5EX01TUworCXRyaXN0YXRlICJNaWNyb3NvZnQgU291bmQgU3lzdGVtIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwktLS1oZWxwLS0tCisJICBBZ2FpbiB0aGluayBjYXJlZnVsbHkgYmVmb3JlIGFuc3dlcmluZyBZIHRvIHRoaXMgcXVlc3Rpb24uICBJdCdzCisJICBzYWZlIHRvIGFuc3dlciBZIGlmIHlvdSBoYXZlIHRoZSBvcmlnaW5hbCBXaW5kb3dzIFNvdW5kIFN5c3RlbSBjYXJkCisJICBtYWRlIGJ5IE1pY3Jvc29mdCBvciBBenRlY2ggU0cgMTYgUHJvIChvciBOWDE2IFBybykuICBBbHNvIHlvdSBtYXkKKwkgIHNheSBZIGluIGNhc2UgeW91ciBjYXJkIGlzIE5PVCBhbW9uZyB0aGVzZToKKworCSAgQVRJIFN0ZXJlbyBGL1gsIEFkTGliLCBBdWRpbyBFeGNlbGwgRFNQMTYsIENhcmRpbmFsIERTUDE2LAorCSAgRW5zb25pcSBTb3VuZFNjYXBlIChhbmQgY29tcGF0aWJsZXMgbWFkZSBieSBSZXZlYWwgYW5kIFNwZWEpLAorCSAgR3JhdmlzIFVsdHJhc291bmQsIEdyYXZpcyBVbHRyYXNvdW5kIEFDRSwgR3JhdmlzIFVsdHJhc291bmQgTWF4LAorCSAgR3JhdmlzIFVsdHJhc291bmQgd2l0aCAxNiBiaXQgb3B0aW9uLCBMb2dpdGVjaCBTb3VuZCBNYW4gMTYsCisJICBMb2dpdGVjaCBTb3VuZE1hbiBHYW1lcywgTG9naXRlY2ggU291bmRNYW4gV2F2ZSwgTUFEMTYgUHJvIChPUFRpCisJICA4MkM5MjkpLCBNZWRpYSBWaXNpb24gSmF6ejE2LCBNZWRpYVRyaVggQXVkaW9UcmlYIFBybywgTWljcm9zb2Z0CisJICBXaW5kb3dzIFNvdW5kIFN5c3RlbSAoTVNTL1dTUyksIE1vemFydCAoT0FLIE9USS02MDEpLCBPcmNoaWQKKwkgIFNXMzIsIFBlcnNvbmFsIFNvdW5kIFN5c3RlbSAoUFNTKSwgUHJvIEF1ZGlvIFNwZWN0cnVtIDE2LCBQcm8KKwkgIEF1ZGlvIFN0dWRpbyAxNiwgUHJvIFNvbmljIDE2LCBSb2xhbmQgTVBVLTQwMSBNSURJIGludGVyZmFjZSwKKwkgIFNvdW5kIEJsYXN0ZXIgMS4wLCBTb3VuZCBCbGFzdGVyIDE2LCBTb3VuZCBCbGFzdGVyIDE2QVNQLCBTb3VuZAorCSAgQmxhc3RlciAyLjAsIFNvdW5kIEJsYXN0ZXIgQVdFMzIsIFNvdW5kIEJsYXN0ZXIgUHJvLCBUSSBUTTQwMDBNCisJICBub3RlYm9vaywgVGh1bmRlckJvYXJkLCBUdXJ0bGUgQmVhY2ggVHJvcGV6LCBZYW1haGEgRk0KKwkgIHN5bnRoZXNpemVycyAoT1BMMiwgT1BMMyBhbmQgT1BMNCksIDY4NTAgVUFSVCBNSURJIEludGVyZmFjZS4KKworCSAgRm9yIGNhcmRzIGhhdmluZyBuYXRpdmUgc3VwcG9ydCBpbiBWb3hXYXJlLCBjb25zdWx0IHRoZSBjYXJkCisJICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvUkVBRE1FLk9TUz4uCisJICBTb21lIGRyaXZlcnMgaGF2ZSB0aGVpciBvd24gTVNTIHN1cHBvcnQgYW5kIHNheWluZyBZIHRvIHRoaXMgb3B0aW9uCisJICB3aWxsIGNhdXNlIGEgY29uZmxpY3QuCisKKwkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsLCB5b3UgaGF2ZSB0byBhZGQKKwkgICJhZDE4NDg9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj5bLDx0eXBlPl0iIHRvIHRoZSBrZXJuZWwgY29tbWFuZAorCSAgbGluZS4KKworY29uZmlnIFNPVU5EX01QVTQwMQorCXRyaXN0YXRlICJNUFUtNDAxIHN1cHBvcnQgKE5PVCBmb3IgU0IxNikiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwktLS1oZWxwLS0tCisJICBCZSBjYXJlZnVsIHdpdGggdGhpcyBxdWVzdGlvbi4gIFRoZSBNUFU0MDEgaW50ZXJmYWNlIGlzIHN1cHBvcnRlZCBieQorCSAgYWxsIHNvdW5kIGNhcmRzLiAgSG93ZXZlciwgc29tZSBuYXRpdmVseSBzdXBwb3J0ZWQgY2FyZHMgaGF2ZSB0aGVpcgorCSAgb3duIGRyaXZlciBmb3IgTVBVNDAxLiAgRW5hYmxpbmcgdGhpcyBNUFU0MDEgb3B0aW9uIHdpdGggdGhlc2UgY2FyZHMKKwkgIHdpbGwgY2F1c2UgYSBjb25mbGljdC4gIEFsc28sIGVuYWJsaW5nIE1QVTQwMSBvbiBhIHN5c3RlbSB0aGF0CisJICBkb2Vzbid0IHJlYWxseSBoYXZlIGEgTVBVNDAxIGNvdWxkIGNhdXNlIHNvbWUgdHJvdWJsZS4gIElmIHlvdXIgY2FyZAorCSAgd2FzIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjYXJkcywgbG9vayBhdCB0aGUgY2FyZCBzcGVjaWZpYworCSAgaW5zdHJ1Y3Rpb25zIGluIHRoZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9SRUFETUUuT1NTPiBmaWxlLiAgSXQKKwkgIGlzIHNhZmUgdG8gYW5zd2VyIFkgaWYgeW91IGhhdmUgYSB0cnVlIE1QVTQwMSBNSURJIGludGVyZmFjZSBjYXJkLgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAibXB1NDAxPTxpbz4sPGlycT4iIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCitjb25maWcgU09VTkRfTk0yNTYKKwl0cmlzdGF0ZSAiTk0yNTZBVi9OTTI1NlpYIGF1ZGlvIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBTYXkgTSBoZXJlIHRvIGluY2x1ZGUgYXVkaW8gc3VwcG9ydCBmb3IgdGhlIE5lb01hZ2ljIDI1NkFWLzI1NlpYCisJICBjaGlwc2V0cy4gVGhlc2UgYXJlIHRoZSBhdWRpbyBjaGlwc2V0cyBmb3VuZCBpbiB0aGUgU29ueQorCSAgWjUwNVMvU1gvRFgsIHNvbWUgU29ueSBGLXNlcmllcywgYW5kIHRoZSBEZWxsIExhdGl0dWRlIENQaSBhbmQgQ1B0CisJICBsYXB0b3BzLiBJdCBpbmNsdWRlcyBzdXBwb3J0IGZvciBhbiBBQzk3LWNvbXBhdGlibGUgbWl4ZXIgYW5kIGFuCisJICBhcHBhcmVudGx5IHByb3ByaWV0YXJ5IHNvdW5kIGVuZ2luZS4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL05NMjU2PiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKworY29uZmlnIFNPVU5EX01BRDE2CisJdHJpc3RhdGUgIk9QVGkgTUFEMTYgYW5kL29yIE1vemFydCBiYXNlZCBjYXJkcyIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUyAmJiBTT1VORF9HQU1FUE9SVAorCS0tLWhlbHAtLS0KKwkgIEFuc3dlciBZIGlmIHlvdXIgY2FyZCBoYXMgYSBNb3phcnQgKE9BSyBPVEktNjAxKSBvciBNQUQxNiAoT1BUaQorCSAgODJDOTI4IG9yIDgyQzkyOSBvciA4MkM5MzEpIGF1ZGlvIGludGVyZmFjZSBjaGlwLiBUaGVzZSBjaGlwcyBhcmUKKwkgIHF1aXRlIGNvbW1vbiBzbyBpdCdzIHBvc3NpYmxlIHRoYXQgbWFueSBuby1uYW1lIGNhcmRzIGhhdmUgb25lIG9mCisJICB0aGVtLiBJbiBhZGRpdGlvbiB0aGUgTUFEMTYgY2hpcCBpcyB1c2VkIGluIHNvbWUgY2FyZHMgbWFkZSBieSBrbm93bgorCSAgbWFudWZhY3R1cmVycyBzdWNoIGFzIFR1cnRsZSBCZWFjaCAoVHJvcGV6KSwgUmV2ZWFsIChzb21lIG1vZGVscykKKwkgIGFuZCBEaWFtb25kIChsYXRlc3Qgb25lcykuIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBUcm9wZXogc291bmQgY2FyZHMKKwkgIGhhdmUgdGhlaXIgb3duIGRyaXZlcjsgaWYgeW91IGhhdmUgb25lIG9mIHRob3NlLCBzYXkgTiBoZXJlIGFuZCBZIG9yCisJICBNIHRvICJGdWxsIHN1cHBvcnQgZm9yIFR1cnRsZSBCZWFjaCBXYXZlRnJvbnQiLCBiZWxvdy4KKworCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAorCSAgIm1hZDE2PTxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDxtcHVpbz4sPG1wdWlycT4iIHRvIHRoZQorCSAga2VybmVsIGNvbW1hbmQgbGluZS4KKworCSAgU2VlIGFsc28gPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvT3B0aT4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9NQUQxNj4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2V0dGluZworCSAgdGhlc2UgY2FyZHMgdXAgYXMgbW9kdWxlcy4KKworY29uZmlnIE1BRDE2X09MRENBUkQKKwlib29sICJTdXBwb3J0IE1JREkgaW4gb2xkZXIgTUFEMTYgYmFzZWQgY2FyZHMgKHJlcXVpcmVzIFNCKSIKKwlkZXBlbmRzIG9uIFNPVU5EX01BRDE2CisJaGVscAorCSAgQW5zd2VyIFkgKG9yIE0pIGlmIHlvdSBoYXZlIGFuIG9sZGVyIGNhcmQgYmFzZWQgb24gdGhlIEM5Mjggb3IKKwkgIE1vemFydCBjaGlwc2V0IGFuZCB5b3Ugd2FudCB0byBoYXZlIE1JREkgc3VwcG9ydC4gSWYgeW91IGVuYWJsZSB0aGlzCisJICBvcHRpb24geW91IGFsc28gbmVlZCB0byBlbmFibGUgc3VwcG9ydCBmb3IgU291bmQgQmxhc3Rlci4KKworY29uZmlnIFNPVU5EX1BBUworCXRyaXN0YXRlICJQcm9BdWRpb1NwZWN0cnVtIDE2IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwktLS1oZWxwLS0tCisJICBBbnN3ZXIgWSBvbmx5IGlmIHlvdSBoYXZlIGEgUHJvIEF1ZGlvIFNwZWN0cnVtIDE2LCBQcm9BdWRpbyBTdHVkaW8KKwkgIDE2IG9yIExvZ2l0ZWNoIFNvdW5kTWFuIDE2IHNvdW5kIGNhcmQuIEFuc3dlciBOIGlmIHlvdSBoYXZlIHNvbWUKKwkgIG90aGVyIGNhcmQgbWFkZSBieSBNZWRpYSBWaXNpb24gb3IgTG9naXRlY2ggc2luY2UgdGhvc2UgYXJlIG5vdAorCSAgUEFTMTYgY29tcGF0aWJsZS4gUGxlYXNlIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvUEFTMTY+LgorCSAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBhZGQgU291bmQgQmxhc3RlciBzdXBwb3J0IHNlcGFyYXRlbHk7IGl0CisJICBpcyBpbmNsdWRlZCBpbiBQQVMgc3VwcG9ydC4KKworCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAorCSAgInBhczI9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4sPHNiaW8+LDxzYmlycT4sPHNiZG1hPiw8c2JkbWEyPgorCSAgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCisKK2NvbmZpZyBQQVNfSk9ZU1RJQ0sKKwlib29sICJFbmFibGUgUEFTMTYgam95c3RpY2sgcG9ydCIKKwlkZXBlbmRzIG9uIFNPVU5EX1BBUz15CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIFBybyBBdWRpbyBTcGVjdHJ1bSAxNidzIGF1eGlsaWFyeSBqb3lzdGljaworCSAgcG9ydC4KKworY29uZmlnIFNPVU5EX1BTUworCXRyaXN0YXRlICJQU1MgKEFEMTg0OCwgQURTUC0yMTE1LCBFU0M2MTQpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBBbnN3ZXIgWSBvciBNIGlmIHlvdSBoYXZlIGFuIE9yY2hpZCBTVzMyLCBDYXJkaW5hbCBEU1AxNiwgQmVldGhvdmVuCisJICBBRFNQLTE2IG9yIHNvbWUgb3RoZXIgY2FyZCBiYXNlZCBvbiB0aGUgUFNTIGNoaXBzZXQgKEFEMTg0OCBjb2RlYyArCisJICBBRFNQLTIxMTUgRFNQIGNoaXAgKyBFY2hvIEVTQzYxNCBBU0lDIENISVApLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgorCSAgaG93IHRvIGNvbXBpbGUgaXQgaW50byB0aGUga2VybmVsIG9yIGFzIGEgbW9kdWxlIHNlZSB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvUFNTPi4KKworCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAorCSAgInBzcz08aW8+LDxtc3Npbz4sPG1zc2lycT4sPG1zc2RtYT4sPG1wdWlvPiw8bXB1aXJxPiIgdG8gdGhlIGtlcm5lbAorCSAgY29tbWFuZCBsaW5lLgorCitjb25maWcgUFNTX01JWEVSCisJYm9vbCAiRW5hYmxlIFBTUyBtaXhlciAoQmVldGhvdmVuIEFEU1AtMTYgYW5kIG90aGVyIGNvbXBhdGliaWxlKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BTUworCWhlbHAKKwkgIEFuc3dlciBZIGZvciBCZWV0aG92ZW4gQURTUC0xNi4gWW91IG1heSB0cnkgdG8gc2F5IFkgYWxzbyBmb3Igb3RoZXIKKwkgIGNhcmRzIGlmIHRoZXkgaGF2ZSBtYXN0ZXIgdm9sdW1lLCBiYXNzLCB0cmVibGUsIGFuZCB5b3UgY2FuJ3QKKwkgIGNvbnRyb2wgaXQgdW5kZXIgTGludXguIElmIHlvdSBhbnN3ZXIgTiBmb3IgQmVldGhvdmVuIEFEU1AtMTYsIHlvdQorCSAgY2FuJ3QgY29udHJvbCBtYXN0ZXIgdm9sdW1lLCBiYXNzLCB0cmVibGUgYW5kIHN5bnRoIHZvbHVtZS4KKworCSAgSWYgeW91IHNhaWQgTSB0byAiUFNTIHN1cHBvcnQiIGFib3ZlLCB5b3UgbWF5IGVuYWJsZSBvciBkaXNhYmxlIHRoaXMKKwkgIFBTUyBtaXhlciB3aXRoIHRoZSBtb2R1bGUgcGFyYW1ldGVyIHBzc19taXhlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24KKwkgIHNlZSB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9QU1M+LgorCitjb25maWcgUFNTX0hBVkVfQk9PVAorCWJvb2wgIkhhdmUgRFNQeHh4LkxEIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBTT1VORF9QU1MgJiYgIVNUQU5EQUxPTkUKKwloZWxwCisJICBJZiB5b3UgaGF2ZSB0aGUgRFNQeHh4LkxEIGZpbGUgb3IgU1lOVEguTEQgZmlsZSBmb3IgeW91IGNhcmQsIHNheSBZCisJICB0byBpbmNsdWRlIHRoaXMgZmlsZS4gV2l0aG91dCB0aGlzIGZpbGUgdGhlIHN5bnRoIGRldmljZSAoT1BMKSBtYXkKKwkgIG5vdCB3b3JrLgorCitjb25maWcgUFNTX0JPT1RfRklMRQorCXN0cmluZyAiRnVsbCBwYXRobmFtZSBvZiBEU1B4eHguTEQgZmlybXdhcmUgZmlsZSIKKwlkZXBlbmRzIG9uIFBTU19IQVZFX0JPT1QKKwlkZWZhdWx0ICIvZXRjL3NvdW5kL2RzcDAwMS5sZCIKKwloZWxwCisJICBFbnRlciB0aGUgZnVsbCBwYXRobmFtZSBvZiB5b3VyIERTUHh4eC5MRCBmaWxlIG9yIFNZTlRILkxEIGZpbGUsCisJICBzdGFydGluZyBmcm9tIC8uCisKK2NvbmZpZyBTT1VORF9TQgorCXRyaXN0YXRlICIxMDAlIFNvdW5kIEJsYXN0ZXIgY29tcGF0aWJsZXMgKFNCMTYvMzIvNjQsIEVTUywgSmF6ejE2KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkRfT1NTCisJLS0taGVscC0tLQorCSAgQW5zd2VyIFkgaWYgeW91IGhhdmUgYW4gb3JpZ2luYWwgU291bmQgQmxhc3RlciBjYXJkIG1hZGUgYnkgQ3JlYXRpdmUKKwkgIExhYnMgb3IgYSAxMDAlIGhhcmR3YXJlIGNvbXBhdGlibGUgY2xvbmUgKGxpa2UgdGhlIFRodW5kZXJib2FyZCBvcgorCSAgU00gR2FtZXMpLiBGb3IgYW4gdW5rbm93biBjYXJkIHlvdSBtYXkgYW5zd2VyIFkgaWYgdGhlIGNhcmQgY2xhaW1zCisJICB0byBiZSBTb3VuZCBCbGFzdGVyLWNvbXBhdGlibGUuCisKKwkgIFBsZWFzZSByZWFkIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL1NvdW5kYmxhc3Rlcj4uCisKKwkgIFlvdSBzaG91bGQgYWxzbyBzYXkgWSBoZXJlIGZvciBjYXJkcyBiYXNlZCBvbiB0aGUgQXZhbmNlIExvZ2ljCisJICBBTFMtMDA3IGFuZCBBTFMtMVgwIGNoaXBzIChyZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL0FMUz4pIGFuZAorCSAgZm9yIGNhcmRzIGJhc2VkIG9uIEVTUyBjaGlwcyAocmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvRVNTMTg2OD4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9FU1M+KS4gSWYgeW91IGhhdmUgYW4gU0IgQVdFIDMyIG9yIFNCIEFXRQorCSAgNjQsIHNheSBZIGhlcmUgYW5kIGFsc28gdG8gIkFXRTMyIHN5bnRoIiBiZWxvdyBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvSU5TVEFMTC5hd2U+LiBJZiB5b3UgaGF2ZSBhbiBJQk0gTXdhdmUKKwkgIGNhcmQsIHNheSBZIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvbXdhdmU+LgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UKKwkgIGlzYXBucCwgeW91IGhhdmUgdG8gYWRkICJzYj08aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiIgdG8gdGhlIGtlcm5lbAorCSAgY29tbWFuZCBsaW5lLgorCisJICBZb3UgY2FuIHNheSBNIGhlcmUgdG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZTsgdGhlIG1vZHVsZSBpcworCSAgY2FsbGVkIHNiLgorCitjb25maWcgU09VTkRfQVdFMzJfU1lOVEgKKwl0cmlzdGF0ZSAiQVdFMzIgc3ludGgiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgU291bmQgQmxhc3RlciBTQjMyLCBBV0UzMi1QblAsIFNCIEFXRTY0IG9yCisJICBzaW1pbGFyIHNvdW5kIGNhcmQuIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9SRUFETUUuYXdlPiwKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL0FXRTMyPiBhbmQgdGhlIFNvdW5kYmxhc3Rlci1BV0UKKwkgIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4KKwkgIGZvciBtb3JlIGluZm8uCisKK2NvbmZpZyBTT1VORF9XQVZFRlJPTlQKKwl0cmlzdGF0ZSAiRnVsbCBzdXBwb3J0IGZvciBUdXJ0bGUgQmVhY2ggV2F2ZUZyb250IChUcm9wZXogUGx1cywgVHJvcGV6LCBNYXVpKSBzeW50aC9zb3VuZGNhcmRzIgorCWRlcGVuZHMgb24gU09VTkRfT1NTICYmIG0KKwloZWxwCisJICBBbnN3ZXIgWSBvciBNIGlmIHlvdSBoYXZlIGEgVHJvcGV6IFBsdXMsIFRyb3BleiBvciBNYXVpIHNvdW5kIGNhcmQKKwkgIGFuZCByZWFkIHRoZSBmaWxlcyA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9XYXZlZnJvbnQ+IGFuZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvVHJvcGV6Kz4uCisKK2NvbmZpZyBTT1VORF9NQVVJCisJdHJpc3RhdGUgIkxpbWl0ZWQgc3VwcG9ydCBmb3IgVHVydGxlIEJlYWNoIFdhdmUgRnJvbnQgKE1hdWksIFRyb3Bleikgc3ludGhlc2l6ZXJzIgorCWRlcGVuZHMgb24gU09VTkRfT1NTCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFR1cnRsZSBCZWFjaCBXYXZlIEZyb250LCBNYXVpLCBvciBUcm9wZXoKKwkgIHNvdW5kIGNhcmQuCisKKwkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsLCB5b3UgaGF2ZSB0byBhZGQKKwkgICJtYXVpPTxpbz4sPGlycT4iIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCitjb25maWcgTUFVSV9IQVZFX0JPT1QKKwlib29sICJIYXZlIE9TV0YuTU9UIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBTT1VORF9NQVVJPXkgJiYgIVNUQU5EQUxPTkUKKwloZWxwCisJICBUdXJ0bGUgQmVhY2ggTWF1aSBhbmQgVHJvcGV6IHNvdW5kIGNhcmRzIGhhdmUgYSBtaWNyb2NvbnRyb2xsZXIKKwkgIHdoaWNoIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIHByaW9yIHRvIHVzZS4gT1NXRi5NT1QgaXMgYSBmaWxlCisJICBkaXN0cmlidXRlZCB3aXRoIHRoZSBjYXJkJ3MgRE9TL1dpbmRvd3MgZHJpdmVycy4gQW5zd2VyIFkgaWYgeW91CisJICBoYXZlIHRoaXMgZmlsZS4KKworY29uZmlnIE1BVUlfQk9PVF9GSUxFCisJc3RyaW5nICJGdWxsIHBhdGhuYW1lIG9mIE9TV0YuTU9UIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBNQVVJX0hBVkVfQk9PVAorCWRlZmF1bHQgIi9ldGMvc291bmQvb3N3Zi5tb3QiCisJaGVscAorCSAgRW50ZXIgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgeW91ciBPU1dGLk1PVCBmaWxlLCBzdGFydGluZyBmcm9tIC8uCisKK2NvbmZpZyBTT1VORF9ZTTM4MTIKKwl0cmlzdGF0ZSAiWWFtYWhhIEZNIHN5bnRoZXNpemVyIChZTTM4MTIvT1BMLTMpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwktLS1oZWxwLS0tCisJICBBbnN3ZXIgWSBpZiB5b3VyIGNhcmQgaGFzIGEgRk0gY2hpcCBtYWRlIGJ5IFlhbWFoYSAoT1BMMi9PUEwzL09QTDQpLgorCSAgQW5zd2VyaW5nIFkgaXMgdXN1YWxseSBhIHNhZmUgYW5kIHJlY29tbWVuZGVkIGNob2ljZSwgaG93ZXZlciBzb21lCisJICBjYXJkcyBtYXkgaGF2ZSBzb2Z0d2FyZSAoVFNSKSBGTSBlbXVsYXRpb24uIEVuYWJsaW5nIEZNIHN1cHBvcnQgd2l0aAorCSAgdGhlc2UgY2FyZHMgbWF5IGNhdXNlIHRyb3VibGUgKEkgZG9uJ3QgY3VycmVudGx5IGtub3cgb2YgYW55IHN1Y2gKKwkgIGNhcmRzLCBob3dldmVyKS4gUGxlYXNlIHJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL09QTDM+IGlmIHlvdXIgY2FyZCBoYXMgYW4gT1BMMyBjaGlwLgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAib3BsMz08aW8+IiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIFNPVU5EX09QTDNTQTEKKwl0cmlzdGF0ZSAiWWFtYWhhIE9QTDMtU0ExIGF1ZGlvIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgWWFtYWhhIE9QTDMtU0ExIHNvdW5kIGNoaXAsIHdoaWNoIGlzCisJICB1c3VhbGx5IGJ1aWx0IGludG8gbW90aGVyYm9hcmRzLiBSZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9PUEwzLVNBPiBmb3IgZGV0YWlscy4KKworCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAorCSAgIm9wbDNzYT08aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8bXB1aW8+LDxtcHVpcnE+IiB0byB0aGUga2VybmVsCisJICBjb21tYW5kIGxpbmUuCisKK2NvbmZpZyBTT1VORF9PUEwzU0EyCisJdHJpc3RhdGUgIllhbWFoYSBPUEwzLVNBMiBhbmQgU0EzIGJhc2VkIFBuUCBjYXJkcyIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBjYXJkIGJhc2VkIG9uIG9uZSBvZiB0aGVzZSBZYW1haGEgc291bmQKKwkgIGNoaXBzZXRzIG9yIHRoZSAiU0F4Iiwgd2hpY2ggaXMgYWN0dWFsbHkgYSBTQTMuIFJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL09QTDMtU0EyPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgorCSAgY29uZmlndXJpbmcgdGhlc2UgY2FyZHMuCisKKwkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsIGFuZCBkbyBub3QgYWxzbworCSAgY29uZmlndXJlIGluIHRoZSBvcHRpb25hbCBJU0EgUG5QIHN1cHBvcnQsIHlvdSB3aWxsIGhhdmUgdG8gYWRkCisJICAib3BsM3NhMj08aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8bXNzaW8+LDxtcHVpbz4iIHRvIHRoZSBrZXJuZWwKKwkgIGNvbW1hbmQgbGluZS4KKworY29uZmlnIFNPVU5EX1lNRlBDSQorCXRyaXN0YXRlICJZYW1haGEgWU1GN3h4IFBDSSBhdWRpbyAobmF0aXZlIG1vZGUpIgorCWRlcGVuZHMgb24gU09VTkRfT1NTICYmIFBDSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFlhbWFoYSBjYXJkcyBpbmNsdWRpbmcgdGhlIFlNRjcxMSwgWU1GNzE1LCBZTUY3MTgsCisJICBZTUY3MTksIFlNRjcyNCwgV2F2ZWZvcmNlIDE5MlhHLCBhbmQgV2F2ZWZvcmNlIDE5MiBEaWdpdGFsLgorCitjb25maWcgU09VTkRfWU1GUENJX0xFR0FDWQorCWJvb2wgIllhbWFoYSBQQ0kgbGVnYWN5IHBvcnRzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9ZTUZQQ0kKKwloZWxwCisJICBTdXBwb3J0IGZvciBZTUY3eHggUENJIGNhcmRzIGVtdWxhdGluZyBhbiBNUDQwMS4KKworY29uZmlnIFNPVU5EX1VBUlQ2ODUwCisJdHJpc3RhdGUgIjY4NTAgVUFSVCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkRfT1NTCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBNSURJIGludGVyZmFjZXMgYmFzZWQgb24gdGhlIDY4NTAKKwkgIFVBUlQgY2hpcC4gVGhpcyBpbnRlcmZhY2UgaXMgcmFyZWx5IGZvdW5kIG9uIHNvdW5kIGNhcmRzLiBJdCdzIHNhZmUKKwkgIHRvIGFuc3dlciBOIHRvIHRoaXMgcXVlc3Rpb24uCisKKwkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsLCB5b3UgaGF2ZSB0byBhZGQKKwkgICJ1YXJ0Njg1MD08aW8+LDxpcnE+IiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKworY29uZmlnIFNPVU5EX0FFRFNQMTYKKwl0cmlzdGF0ZSAiR2FsbGFudCBBdWRpbyBDYXJkcyAoU0MtNjAwMCBhbmQgU0MtNjYwMCBiYXNlZCkiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwktLS1oZWxwLS0tCisJICBBbnN3ZXIgWSBpZiB5b3UgaGF2ZSBhIEdhbGxhbnQncyBBdWRpbyBFeGNlbCBEU1AgMTYgY2FyZC4gVGhpcworCSAgZHJpdmVyIHN1cHBvcnRzIEF1ZGlvIEV4Y2VsIERTUCAxNiBidXQgbm90IHRoZSBJSUkgbm9yIFBuUCB2ZXJzaW9ucworCSAgb2YgdGhpcyBjYXJkLgorCisJICBUaGUgR2FsbGFudCdzIEF1ZGlvIEV4Y2VsIERTUCAxNiBjYXJkIGNhbiBlbXVsYXRlIGVpdGhlciBhbiBTQlBybyBvcgorCSAgYSBNaWNyb3NvZnQgU291bmQgU3lzdGVtIGNhcmQsIHNvIHlvdSBzaG91bGQgaGF2ZSBzYWlkIFkgdG8gZWl0aGVyCisJICAiMTAwJSBTb3VuZCBCbGFzdGVyIGNvbXBhdGlibGVzIChTQjE2LzMyLzY0LCBFU1MsIEphenoxNikgc3VwcG9ydCIKKwkgIG9yICJNaWNyb3NvZnQgU291bmQgU3lzdGVtIHN1cHBvcnQiLCBhYm92ZSwgYW5kIHlvdSBuZWVkIHRvIGFuc3dlcgorCSAgdGhlICJNU1MgZW11bGF0aW9uIiBhbmQgIlNCUHJvIGVtdWxhdGlvbiIgcXVlc3Rpb25zIGJlbG93CisJICBhY2NvcmRpbmdseS4gWW91IHNob3VsZCBzYXkgWSB0byBvbmUgYW5kIG9ubHkgb25lIG9mIHRoZXNlIHR3bworCSAgcXVlc3Rpb25zLgorCisJICBSZWFkIHRoZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9SRUFETUUuT1NTPiBmaWxlIGFuZCB0aGUgaGVhZCBvZgorCSAgPGZpbGU6ZHJpdmVycy9zb3VuZC9hZWRzcDE2LmM+IGFzIHdlbGwgYXMKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL0F1ZGlvRXhjZWxEU1AxNj4gdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24KKwkgIGFib3V0IHRoaXMgZHJpdmVyIGFuZCBpdHMgY29uZmlndXJhdGlvbi4KKworY29uZmlnIFNDNjYwMAorCWJvb2wgIlNDLTY2MDAgYmFzZWQgYXVkaW8gY2FyZHMgKG5ldyBBdWRpbyBFeGNlbCBEU1AgMTYpIgorCWRlcGVuZHMgb24gU09VTkRfQUVEU1AxNgorCWhlbHAKKwkgIFRoZSBTQzY2MDAgaXMgdGhlIG5ldyB2ZXJzaW9uIG9mIERTUCBtb3VudGVkIG9uIHRoZSBBdWRpbyBFeGNlbCBEU1AKKwkgIDE2IGNhcmRzLiBGaW5kIGluIHRoZSBtYW51YWwgdGhlIEZDQyBJRCBvZiB5b3VyIGF1ZGlvIGNhcmQgYW5kCisJICBhbnN3ZXIgWSBpZiB5b3UgaGF2ZSBhbiBTQzY2MDAgRFNQLgorCitjb25maWcgU0M2NjAwX0pPWQorCWJvb2wgIkFjdGl2YXRlIFNDLTY2MDAgSm95c3RpY2sgSW50ZXJmYWNlIgorCWRlcGVuZHMgb24gU0M2NjAwCisJaGVscAorCSAgU2F5IFkgaGVyZSBpbiBvcmRlciB0byB1c2UgdGhlIGpveXN0aWNrIGludGVyZmFjZSBvZiB0aGUgQXVkaW8gRXhjZWwKKwkgIERTUCAxNiBjYXJkLgorCitjb25maWcgU0M2NjAwX0NEUk9NCisJaW50ICJTQy02NjAwIENEUk9NIEludGVyZmFjZSAoND1Ob25lLCAzPUlERSwgMT1QYW5hc29uaWMsIDA9P1Nvbnk/KSIKKwlkZXBlbmRzIG9uIFNDNjYwMAorCWRlZmF1bHQgIjQiCisJaGVscAorCSAgVGhpcyBpcyB1c2VkIHRvIGFjdGl2YXRlIHRoZSBDRC1ST00gaW50ZXJmYWNlIG9mIHRoZSBBdWRpbyBFeGNlbAorCSAgRFNQIDE2IGNhcmQuIEVudGVyOiAwIGZvciBTb255LCAxIGZvciBQYW5hc29uaWMsIDIgZm9yIElERSwgNCBmb3Igbm8KKwkgIENELVJPTSBwcmVzZW50LgorCitjb25maWcgU0M2NjAwX0NEUk9NQkFTRQorCWhleCAiU0MtNjYwMCBDRFJPTSBJbnRlcmZhY2UgSS9PIEFkZHJlc3MiCisJZGVwZW5kcyBvbiBTQzY2MDAKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIEJhc2UgSS9PIHBvcnQgYWRkcmVzcyBmb3IgdGhlIENELVJPTSBpbnRlcmZhY2Ugb2YgdGhlIEF1ZGlvIEV4Y2VsCisJICBEU1AgMTYgY2FyZC4KKworY2hvaWNlCisJcHJvbXB0ICJBdWRpbyBFeGNlbCBEU1AgMTYiCisJb3B0aW9uYWwKKwlkZXBlbmRzIG9uIFNPVU5EX0FFRFNQMTYKKworY29uZmlnIEFFRFNQMTZfTVNTCisJYm9vbCAiTVNTIGVtdWxhdGlvbiIKKwlkZXBlbmRzIG9uIFNPVU5EX01TUworCWhlbHAKKwkgIEFuc3dlciBZIGlmIHlvdSB3YW50IHlvdXIgYXVkaW8gY2FyZCB0byBlbXVsYXRlIE1pY3Jvc29mdCBTb3VuZAorCSAgU3lzdGVtLiBZb3Ugc2hvdWxkIHRoZW4gc2F5IFkgdG8gIk1pY3Jvc29mdCBTb3VuZCBTeXN0ZW0gc3VwcG9ydCIKKwkgIGFuZCBzYXkgTiB0byAiQXVkaW8gRXhjZWwgRFNQIDE2IChTQlBybyBlbXVsYXRpb24pIi4KKworY29uZmlnIEFFRFNQMTZfU0JQUk8KKwlib29sICJTQlBybyBlbXVsYXRpb24iCisJZGVwZW5kcyBvbiBTT1VORF9TQgorCWhlbHAKKwkgIEFuc3dlciBZIGlmIHlvdSB3YW50IHlvdXIgYXVkaW8gY2FyZCB0byBlbXVsYXRlIFNvdW5kIEJsYXN0ZXIgUHJvLgorCSAgWW91IHNob3VsZCB0aGVuIHNheSBZIHRvICIxMDAlIFNvdW5kIEJsYXN0ZXIgY29tcGF0aWJsZXMKKwkgIChTQjE2LzMyLzY0LCBFU1MsIEphenoxNikgc3VwcG9ydCIgYW5kIE4gdG8gIkF1ZGlvIEV4Y2VsIERTUCAxNiAoTVNTCisJICBlbXVsYXRpb24pIi4KKworCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAorCSAgImFlZHNwMTY9PGlvPiw8aXJxPiw8ZG1hPiw8bXNzaW8+LDxtcHVpbz4sPG1vdWlycT4iIHRvIHRoZSBrZXJuZWwKKwkgIGNvbW1hbmQgbGluZS4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBBRURTUDE2X01QVTQwMQorCWJvb2wgIkF1ZGlvIEV4Y2VsIERTUCAxNiAoTVBVNDAxIGVtdWxhdGlvbikiCisJZGVwZW5kcyBvbiBTT1VORF9BRURTUDE2ICYmIFNPVU5EX01QVTQwMQorCWhlbHAKKwkgIEFuc3dlciBZIGlmIHlvdSB3YW50IHlvdXIgYXVkaW8gY2FyZCB0byBlbXVsYXRlIHRoZSBNUFUtNDAxIG1pZGkKKwkgIGludGVyZmFjZS4gWW91IHNob3VsZCB0aGVuIGFsc28gc2F5IFkgdG8gIk1QVS00MDEgc3VwcG9ydCIuCisKKwkgIE5vdGUgdGhhdCB0aGUgSS9PIGJhc2UgZm9yIE1QVS00MDEgc3VwcG9ydCBvZiBhZWRzcDE2IGlzIHRoZSBzYW1lCisJICB5b3UgaGF2ZSBzZWxlY3RlZCBmb3IgIk1QVS00MDEgc3VwcG9ydCIuIElmIHlvdSBhcmUgdXNpbmcgdGhpcworCSAgZHJpdmVyIGFzIGEgbW9kdWxlIHlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIE1QVSBJL08gYmFzZSBhZGRyZXNzIHdpdGgKKwkgIHRoZSBwYXJhbWV0ZXIgJ21wdV9iYXNlPTB4Tk5OJy4KKworY29uZmlnIFNPVU5EX1ZJREMKKwl0cmlzdGF0ZSAiVklEQyAxNi1iaXQgc291bmQiCisJZGVwZW5kcyBvbiBBUk0gJiYgKEFSQ0hfQUNPUk4gfHwgQVJDSF9DTFBTNzUwMCkgJiYgU09VTkRfT1NTCisJaGVscAorCSAgMTYtYml0IHN1cHBvcnQgZm9yIHRoZSBWSURDIG9uYm9hcmQgc291bmQgaGFyZHdhcmUgZm91bmQgb24gQWNvcm4KKwkgIG1hY2hpbmVzLgorCitjb25maWcgU09VTkRfV0FWRUFSVElTVAorCXRyaXN0YXRlICJOZXR3aW5kZXIgV2F2ZUFydGlzdCIKKwlkZXBlbmRzIG9uIEFSTSAmJiBTT1VORF9PU1MgJiYgQVJDSF9ORVRXSU5ERVIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFJvY2t3ZWxsIFdhdmVBcnRpc3Qgc291bmQKKwkgIHN5c3RlbS4gIFRoaXMgZHJpdmVyIGlzIG1haW5seSBmb3IgdGhlIE5ldFdpbmRlci4KKworY29uZmlnIFNPVU5EX1RWTUlYRVIKKwl0cmlzdGF0ZSAiVFYgY2FyZCAoYnQ4NDgpIG1peGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiBJMkMKKwloZWxwCisJICBTdXBwb3J0IGZvciBhdWRpbyBtaXhlciBmYWNpbGl0aWVzIG9uIHRoZSBCVDg0OCBUViBmcmFtZS1ncmFiYmVyCisJICBjYXJkLgorCitjb25maWcgU09VTkRfS0FITFVBCisJdHJpc3RhdGUgIlhwcmVzc0F1ZGlvIFNvdW5kIEJsYXN0ZXIgZW11bGF0aW9uIgorCWRlcGVuZHMgb24gU09VTkRfU0IKKworY29uZmlnIFNPVU5EX0FMSTU0NTUKKwl0cmlzdGF0ZSAiQUxpNTQ1NSBhdWRpbyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgUENJCisKK2NvbmZpZyBTT1VORF9GT1JURQorCXRyaXN0YXRlICJGb3J0ZU1lZGlhIEZNODAxIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgZHJpdmVyIHN1cHBvcnQgZm9yIHRoZSBGb3J0ZU1lZGlhIEZNODAxIFBDSQorCSAgYXVkaW8gY29udHJvbGxlciAoQWJpdCBBVTEwLCBHZW5pdXMgU291bmQgTWFrZXIsIEhQIFdvcmtzdGF0aW9uCisJICB6eDIwMDAsIGFuZCBvdGhlcnMpLgorCitjb25maWcgU09VTkRfUk1FOTZYWAorCXRyaXN0YXRlICJSTUUgSGFtbWVyZmFsbCAoUk1FOTZYWCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBIYW1tZXJmYWxsIG9yIEhhbW1lcmZhbGwgbGlnaHQKKwkgIG11bHRpY2hhbm5lbCBjYXJkIGZyb20gUk1FLiBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgYWR2YW5jZWQKKwkgIGZlYXR1cmVzIG9mIHRoZSBjYXJkLCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL3JtZTk2eHg+LgorCitjb25maWcgU09VTkRfQUQxOTgwCisJdHJpc3RhdGUgIkFEMTk4MCBmcm9udC9iYWNrIHN3aXRjaCBwbHVnaW4iCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9bgorCitjb25maWcgU09VTkRfU0hfREFDX0FVRElPCisJdHJpc3RhdGUgIlN1cGVySCBEQUMgYXVkaW8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIENQVV9TSDMKKworY29uZmlnIFNPVU5EX1NIX0RBQ19BVURJT19DSEFOTkVMCisJaW50ICIgICAgREFDIGNoYW5uZWwiCisJZGVmYXVsdCAiMSIKKwlkZXBlbmRzIG9uIFNPVU5EX1NIX0RBQ19BVURJTwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL01ha2VmaWxlIGIvc291bmQvb3NzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOWFmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvTWFrZWZpbGUKQEAgLTAsMCArMSwxODcgQEAKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBzb3VuZCBjYXJkIGRyaXZlcgorIworIyAxOCBBcHIgMTk5OCwgTWljaGFlbCBFbGl6YWJldGggQ2hhc3RhaW4sIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4KKyMgUmV3cml0dGVuIHRvIHVzZSBsaXN0cyBpbnN0ZWFkIG9mIGlmLXN0YXRlbWVudHMuCisKKyMgRWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBlbmFibGVzIGEgbGlzdCBvZiBmaWxlcy4KKworb2JqLSQoQ09ORklHX1NPVU5EX09TUykJCSs9IHNvdW5kLm8KK29iai0kKENPTkZJR19TT1VORF9DUzQyMzIpCSs9IGNzNDIzMi5vIGFkMTg0OC5vIAorCisjIFBsZWFzZSBsZWF2ZSBpdCBhcyBpcywgY2F1c2UgdGhlIGxpbmsgb3JkZXIgaXMgc2lnbmlmaWNhbnQgIQorCitvYmotJChDT05GSUdfU09VTkRfU0hfREFDX0FVRElPKQkrPSBzaF9kYWNfYXVkaW8ubworb2JqLSQoQ09ORklHX1NPVU5EX0hBTDIpCSs9IGhhbDIubworb2JqLSQoQ09ORklHX1NPVU5EX0FFRFNQMTYpCSs9IGFlZHNwMTYubworb2JqLSQoQ09ORklHX1NPVU5EX1BTUykJCSs9IHBzcy5vIGFkMTg0OC5vIG1wdTQwMS5vCitvYmotJChDT05GSUdfU09VTkRfVFJJWCkJKz0gdHJpeC5vIGFkMTg0OC5vIHNiX2xpYi5vIHVhcnQ0MDEubworb2JqLSQoQ09ORklHX1NPVU5EX09QTDNTQTEpCSs9IG9wbDNzYS5vIGFkMTg0OC5vIHVhcnQ0MDEubworb2JqLSQoQ09ORklHX1NPVU5EX1NTQ0FQRSkJKz0gc3NjYXBlLm8gYWQxODQ4Lm8gbXB1NDAxLm8KK29iai0kKENPTkZJR19TT1VORF9NQUQxNikJKz0gbWFkMTYubyBhZDE4NDgubyBzYl9saWIubyB1YXJ0NDAxLm8KK29iai0kKENPTkZJR19TT1VORF9DUzQyMzIpCSs9IGNzNDIzMi5vIHVhcnQ0MDEubworb2JqLSQoQ09ORklHX1NPVU5EX01TUykJCSs9IGFkMTg0OC5vCitvYmotJChDT05GSUdfU09VTkRfT1BMM1NBMikJKz0gb3BsM3NhMi5vIGFkMTg0OC5vIG1wdTQwMS5vCitvYmotJChDT05GSUdfU09VTkRfUEFTKQkJKz0gcGFzMi5vIHNiLm8gc2JfbGliLm8gdWFydDQwMS5vCitvYmotJChDT05GSUdfU09VTkRfU0IpCQkrPSBzYi5vIHNiX2xpYi5vIHVhcnQ0MDEubworb2JqLSQoQ09ORklHX1NPVU5EX0tBSExVQSkJKz0ga2FobHVhLm8KK29iai0kKENPTkZJR19TT1VORF9XQVZFRlJPTlQpCSs9IHdhdmVmcm9udC5vCitvYmotJChDT05GSUdfU09VTkRfTUFVSSkJKz0gbWF1aS5vIG1wdTQwMS5vCitvYmotJChDT05GSUdfU09VTkRfTVBVNDAxKQkrPSBtcHU0MDEubworb2JqLSQoQ09ORklHX1NPVU5EX1VBUlQ2ODUwKQkrPSB1YXJ0Njg1MC5vCitvYmotJChDT05GSUdfU09VTkRfR1VTKQkJKz0gZ3VzLm8gYWQxODQ4Lm8KK29iai0kKENPTkZJR19TT1VORF9BRExJQikJKz0gYWRsaWJfY2FyZC5vIG9wbDMubworb2JqLSQoQ09ORklHX1NPVU5EX1lNMzgxMikJKz0gb3BsMy5vCitvYmotJChDT05GSUdfU09VTkRfVk1JREkpCSs9IHZfbWlkaS5vCitvYmotJChDT05GSUdfU09VTkRfVklEQykJKz0gdmlkY19tb2Qubworb2JqLSQoQ09ORklHX1NPVU5EX1dBVkVBUlRJU1QpCSs9IHdhdmVhcnRpc3Qubworb2JqLSQoQ09ORklHX1NPVU5EX1NHQUxBWFkpCSs9IHNnYWxheHkubyBhZDE4NDgubworb2JqLSQoQ09ORklHX1NPVU5EX0FEMTgxNikJKz0gYWQxODE2Lm8KK29iai0kKENPTkZJR19TT1VORF9BRDE4ODkpCSs9IGFkMTg4OS5vIGFjOTdfY29kZWMubworb2JqLSQoQ09ORklHX1NPVU5EX0FDSV9NSVhFUikJKz0gYWNpLm8KK29iai0kKENPTkZJR19TT1VORF9BV0UzMl9TWU5USCkJKz0gYXdlX3dhdmUubworCitvYmotJChDT05GSUdfU09VTkRfVklBODJDWFhYKQkrPSB2aWE4MmN4eHhfYXVkaW8ubyBhYzk3X2NvZGVjLm8KK2lmZXEgKCQoQ09ORklHX01JRElfVklBODJDWFhYKSx5KQorICBvYmotJChDT05GSUdfU09VTkRfVklBODJDWFhYKSArPSBzb3VuZC5vIHVhcnQ0MDEubworZW5kaWYKK29iai0kKENPTkZJR19TT1VORF9ZTUZQQ0kpCSs9IHltZnBjaS5vIGFjOTdfY29kZWMubworaWZlcSAoJChDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWSkseSkKKyAgb2JqLSQoQ09ORklHX1NPVU5EX1lNRlBDSSkgICAgKz0gb3BsMy5vIHVhcnQ0MDEubworZW5kaWYKK29iai0kKENPTkZJR19TT1VORF9NU05EQ0xBUykJKz0gbXNuZC5vIG1zbmRfY2xhc3NpYy5vCitvYmotJChDT05GSUdfU09VTkRfTVNORFBJTikJKz0gbXNuZC5vIG1zbmRfcGlubmFjbGUubworb2JqLSQoQ09ORklHX1NPVU5EX1ZXU05EKQkrPSB2d3NuZC5vCitvYmotJChDT05GSUdfU09VTkRfTk0yNTYpCSs9IG5tMjU2X2F1ZGlvLm8gYWM5Ny5vCitvYmotJChDT05GSUdfU09VTkRfSUNIKQkJKz0gaTgxMF9hdWRpby5vIGFjOTdfY29kZWMubworb2JqLSQoQ09ORklHX1NPVU5EX1NPTklDVklCRVMpCSs9IHNvbmljdmliZXMubworb2JqLSQoQ09ORklHX1NPVU5EX0NNUENJKQkrPSBjbXBjaS5vCitpZmVxICgkKENPTkZJR19TT1VORF9DTVBDSV9GTSkseSkKKyAgb2JqLSQoQ09ORklHX1NPVU5EX0NNUENJKSAgICAgKz0gc291bmQubyBvcGwzLm8KK2VuZGlmCitpZmVxICgkKENPTkZJR19TT1VORF9DTVBDSV9NSURJKSx5KQorICBvYmotJChDT05GSUdfU09VTkRfQ01QQ0kpICAgICArPSBzb3VuZC5vIG1wdTQwMS5vCitlbmRpZgorb2JqLSQoQ09ORklHX1NPVU5EX0VTMTM3MCkJKz0gZXMxMzcwLm8KK29iai0kKENPTkZJR19TT1VORF9FUzEzNzEpCSs9IGVzMTM3MS5vIGFjOTdfY29kZWMubworb2JqLSQoQ09ORklHX1NPVU5EX1ZSQzU0NzcpCSs9IG5lY192cmM1NDc3Lm8gYWM5N19jb2RlYy5vCitvYmotJChDT05GSUdfU09VTkRfQVUxMDAwKQkrPSBhdTEwMDAubyBhYzk3X2NvZGVjLm8KK29iai0kKENPTkZJR19TT1VORF9BVTE1NTBfQUM5NykJKz0gYXUxNTUwX2FjOTcubyBhYzk3X2NvZGVjLm8KK29iai0kKENPTkZJR19TT1VORF9FU1NTT0xPMSkJKz0gZXNzc29sbzEubworb2JqLSQoQ09ORklHX1NPVU5EX0ZVU0lPTikJKz0gY3M0Nnh4Lm8gYWM5N19jb2RlYy5vCitvYmotJChDT05GSUdfU09VTkRfTUFFU1RSTykJKz0gbWFlc3Ryby5vCitvYmotJChDT05GSUdfU09VTkRfTUFFU1RSTzMpCSs9IG1hZXN0cm8zLm8gYWM5N19jb2RlYy5vCitvYmotJChDT05GSUdfU09VTkRfVFJJREVOVCkJKz0gdHJpZGVudC5vIGFjOTdfY29kZWMubworb2JqLSQoQ09ORklHX1NPVU5EX0hBUk1PTlkpCSs9IGhhcm1vbnkubworb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpCSs9IGFjOTdfY29kZWMubworb2JqLSQoQ09ORklHX1NPVU5EX0JDTV9DUzQyOTdBKQkrPSBzd2FybV9jczQyOTdhLm8KK29iai0kKENPTkZJR19TT1VORF9STUU5NlhYKSAgICAgKz0gcm1lOTZ4eC5vCitvYmotJChDT05GSUdfU09VTkRfQlQ4NzgpCSs9IGJ0YXVkaW8ubworb2JqLSQoQ09ORklHX1NPVU5EX0FMSTU0NTUpCSs9IGFsaTU0NTUubyBhYzk3X2NvZGVjLm8KK29iai0kKENPTkZJR19TT1VORF9JVDgxNzIpCSs9IGl0ZTgxNzIubyBhYzk3X2NvZGVjLm8KK29iai0kKENPTkZJR19TT1VORF9GT1JURSkJKz0gZm9ydGUubyBhYzk3X2NvZGVjLm8KKworb2JqLSQoQ09ORklHX1NPVU5EX0FEMTk4MCkJKz0gYWM5N19wbHVnaW5fYWQxOTgwLm8KK29iai0kKENPTkZJR19TT1VORF9XTTk3WFgpCSs9IGFjOTdfcGx1Z2luX3dtOTd4eC5vCisKK2lmZXEgKCQoQ09ORklHX01JRElfRU1VMTBLMSkseSkKKyAgb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpCSs9IHNvdW5kLm8KK2VuZGlmCisKK29iai0kKENPTkZJR19TT1VORF9FTVUxMEsxKQkrPSBlbXUxMGsxLworb2JqLSQoQ09ORklHX1NPVU5EX0NTNDI4MSkJKz0gY3M0MjgxLworb2JqLSQoQ09ORklHX0RNQVNPVU5EKQkJKz0gZG1hc291bmQvCisKKyMgRGVjbGFyZSBtdWx0aS1wYXJ0IGRyaXZlcnMuCisKK3NvdW5kLW9ianMJOj0gCQkJCQkJCVwKKyAgICBkZXZfdGFibGUubyBzb3VuZGNhcmQubyBzb3VuZF9zeW1zLm8JCVwKKyAgICBhdWRpby5vIGF1ZGlvX3N5bXMubyBkbWFidWYubwkJCQkJXAorICAgIG1pZGlfc3ltcy5vIG1pZGlfc3ludGgubyBtaWRpYnVmLm8JCQkJCVwKKyAgICBzZXF1ZW5jZXIubyBzZXF1ZW5jZXJfc3ltcy5vIHNvdW5kX3RpbWVyLm8gc3lzX3RpbWVyLm8KKworZ3VzLW9ianMJOj0gZ3VzX2NhcmQubyBndXNfbWlkaS5vIGd1c192b2wubyBndXNfd2F2ZS5vIGljczIxMDEubworcGFzMi1vYmpzCTo9IHBhczJfY2FyZC5vIHBhczJfbWlkaS5vIHBhczJfbWl4ZXIubyBwYXMyX3BjbS5vCitzYi1vYmpzCQk6PSBzYl9jYXJkLm8KK3NiX2xpYi1vYmpzCTo9IHNiX2NvbW1vbi5vIHNiX2F1ZGlvLm8gc2JfbWlkaS5vIHNiX21peGVyLm8gc2JfZXNzLm8KK3ZpZGNfbW9kLW9ianMJOj0gdmlkYy5vIHZpZGNfZmlsbC5vCit3YXZlZnJvbnQtb2JqcyAgOj0gd2F2ZnJvbnQubyB3Zl9taWRpLm8geXNzMjI1Lm8KKworaG9zdHByb2dzLXkJOj0gYmluMmhleCBoZXgyaGV4CisKKyMgRmlsZXMgZ2VuZXJhdGVkIHRoYXQgc2hhbGwgYmUgcmVtb3ZlZCB1cG9uIG1ha2UgY2xlYW4KK2NsZWFuLWZpbGVzIDo9IG1hdWlfYm9vdC5oIG1zbmRwZXJtLmMgbXNuZGluaXQuYyBwbmRzcGVybS5jIHBuZHNwaW5pLmMgXAorICAgICAgICAgICAgICAgcHNzX2Jvb3QuaCB0cml4X2Jvb3QuaAorCisjIEZpcm13YXJlIGZpbGVzIHRoYXQgbmVlZCB0cmFuc2xhdGlvbgorIworIyBUaGUgdHJhbnNsYXRlZCBmaWxlcyBhcmUgcHJvdGVjdGVkIGJ5IGEgZmlsZSB0aGF0IGtlZXBzIHRyYWNrCisjIG9mIHdoYXQgbmFtZSB3YXMgdXNlZCB0byBidWlsZCB0aGVtLiAgSWYgdGhlIG5hbWUgY2hhbmdlcywgdGhleQorIyB3aWxsIGJlIGZvcmNlZCB0byBiZSByZW1hZGUuCisjCisKKyMgVHVydGxlIEJlYWNoIE1hdWkgLyBUcm9wZXoKKworJChvYmopL21hdWkubzogJChvYmopL21hdWlfYm9vdC5oCisKK2lmZXEgKCQoQ09ORklHX01BVUlfSEFWRV9CT09UKSx5KQorICAgICQob2JqKS9tYXVpX2Jvb3QuaDogJChwYXRzdWJzdCAiJSIsICUsICQoQ09ORklHX01BVUlfQk9PVF9GSUxFKSkgJChvYmopL2JpbjJoZXgKKwkkKG9iaikvYmluMmhleCAtaSBtYXVpX29zIDwgJDwgPiAkQAorZWxzZQorICAgICQob2JqKS9tYXVpX2Jvb3QuaDoKKwkoCQkJCQkJCVwKKwkgICAgZWNobyAnc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBtYXVpX29zID0gTlVMTDsnOwlcCisJICAgIGVjaG8gJ3N0YXRpYyBpbnQgbWF1aV9vc0xlbiA9IDA7JzsJCQlcCisJKSA+ICRACitlbmRpZgorCisjIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kCisKK2lmZXEgKCQoQ09ORklHX01TTkRDTEFTX0hBVkVfQk9PVCkseSkKKyAgICAkKG9iaikvbXNuZF9jbGFzc2ljLm86ICQob2JqKS9tc25kcGVybS5jICQob2JqKS9tc25kaW5pdC5jCisKKyAgICAkKG9iaikvbXNuZHBlcm0uYzogJChwYXRzdWJzdCAiJSIsICUsICQoQ09ORklHX01TTkRDTEFTX1BFUk1fRklMRSkpICQob2JqKS9iaW4yaGV4CisJJChvYmopL2JpbjJoZXggbXNuZHBlcm0gPCAkPCA+ICRACisKKyAgICAkKG9iaikvbXNuZGluaXQuYzogJChwYXRzdWJzdCAiJSIsICUsICQoQ09ORklHX01TTkRDTEFTX0lOSVRfRklMRSkpICQob2JqKS9iaW4yaGV4CisJJChvYmopL2JpbjJoZXggbXNuZGluaXQgPCAkPCA+ICRACitlbmRpZgorCitpZmVxICgkKENPTkZJR19NU05EUElOX0hBVkVfQk9PVCkseSkKKyAgICAkKG9iaikvbXNuZF9waW5uYWNsZS5vOiAkKG9iaikvcG5kc3Blcm0uYyAkKG9iaikvcG5kc3BpbmkuYworCisgICAgJChvYmopL3BuZHNwZXJtLmM6ICQocGF0c3Vic3QgIiUiLCAlLCAkKENPTkZJR19NU05EUElOX1BFUk1fRklMRSkpICQob2JqKS9iaW4yaGV4CisJJChvYmopL2JpbjJoZXggcG5kc3Blcm0gPCAkPCA+ICRACisKKyAgICAkKG9iaikvcG5kc3BpbmkuYzogJChwYXRzdWJzdCAiJSIsICUsICQoQ09ORklHX01TTkRQSU5fSU5JVF9GSUxFKSkgJChvYmopL2JpbjJoZXgKKwkkKG9iaikvYmluMmhleCBwbmRzcGluaSA8ICQ8ID4gJEAKK2VuZGlmCisKKyMgUFNTIChFQ0hPLUFESTIxMTEpCisKKyQob2JqKS9wc3MubzogJChvYmopL3Bzc19ib290LmgKKworaWZlcSAoJChDT05GSUdfUFNTX0hBVkVfQk9PVCkseSkKKyAgICAkKG9iaikvcHNzX2Jvb3QuaDogJChwYXRzdWJzdCAiJSIsICUsICQoQ09ORklHX1BTU19CT09UX0ZJTEUpKSAkKG9iaikvYmluMmhleAorCSQob2JqKS9iaW4yaGV4IHBzc19zeW50aCA8ICQ8ID4gJEAKK2Vsc2UKKyAgICAkKG9iaikvcHNzX2Jvb3QuaDoKKwkoCQkJCQkJCVwKKwkgICAgZWNobyAnc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBwc3Nfc3ludGggPSBOVUxMOyc7CVwKKwkgICAgZWNobyAnc3RhdGljIGludCBwc3Nfc3ludGhMZW4gPSAwOyc7CQlcCisJKSA+ICRACitlbmRpZgorCisjIE1lZGlhVHJpeCBBdWRpb1RyaXggUHJvCisKKyQob2JqKS90cml4Lm86ICQob2JqKS90cml4X2Jvb3QuaAorCitpZmVxICgkKENPTkZJR19UUklYX0hBVkVfQk9PVCkseSkKKyAgICAkKG9iaikvdHJpeF9ib290Lmg6ICQocGF0c3Vic3QgIiUiLCAlLCAkKENPTkZJR19UUklYX0JPT1RfRklMRSkpICQob2JqKS9oZXgyaGV4CisJJChvYmopL2hleDJoZXggLWkgdHJpeF9ib290IDwgJDwgPiAkQAorZWxzZQorICAgICQob2JqKS90cml4X2Jvb3QuaDoKKwkoCQkJCQkJCVwKKwkgICAgZWNobyAnc3RhdGljIHVuc2lnbmVkIGNoYXIgKiB0cml4X2Jvb3QgPSBOVUxMOyc7CVwKKwkgICAgZWNobyAnc3RhdGljIGludCB0cml4X2Jvb3RfbGVuID0gMDsnOwkJXAorCSkgPiAkQAorZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9SRUFETUUuRklSU1QgYi9zb3VuZC9vc3MvUkVBRE1FLkZJUlNUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZmRjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvUkVBRE1FLkZJUlNUCkBAIC0wLDAgKzEsNiBAQAorVGhlIG1vZHVsYXIgc291bmQgZHJpdmVyIHBhdGNoZXMgd2VyZSBmdW5kZWQgYnkgUmVkIEhhdCBTb2Z0d2FyZSAKKyh3d3cucmVkaGF0LmNvbSkuIFRoZSBzb3VuZCBkcml2ZXIgaGVyZSBpcyB0aHVzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiAKK0hhbm51J3MgY29kZS4gUGxlYXNlIGJlYXIgdGhhdCBpbiBtaW5kIHdoZW4gY29uc2lkZXJpbmcgdGhlIGFwcHJvcHJpYXRlCitmb3J1bXMgZm9yIGJ1ZyByZXBvcnRpbmcuIAorCitBbGFuIENveApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjOTcuYyBiL3NvdW5kL29zcy9hYzk3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhNmQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hYzk3LmMKQEAgLTAsMCArMSw0NTIgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAiYWM5Ny5oIgorCisvKiBGbGFnIGZvciBtb25vIGNvbnRyb2xzLiAqLworI2RlZmluZSBNTyAwCisvKiBBbmQgZm9yIHN0ZXJlby4gKi8KKyNkZWZpbmUgU1QgMQorCisvKiBXaGV0aGVyIG9yIG5vdCB0aGUgYml0cyBpbiB0aGUgY2hhbm5lbCBhcmUgaW52ZXJ0ZWQuICovCisjZGVmaW5lIElOViAxCisjZGVmaW5lIE5JTlYgMAorCitzdGF0aWMgc3RydWN0IGFjOTdfY2huX2Rlc2MgeworICAgIGludCBhYzk3X3JlZ251bTsKKyAgICBpbnQgb3NzX2NoYW5uZWw7CisgICAgaW50IG1heHZhbDsKKyAgICBpbnQgaXNfc3RlcmVvOworICAgIGludCBvc3NfbWFzazsKKyAgICBpbnQgcmVjb3JkTnVtOworICAgIHUxNiByZWdtYXNrOworICAgIGludCBpc19pbnZlcnRlZDsKK30gbWl4ZXJSZWdzW10gPSB7CisgICAgeyBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCBTT1VORF9NSVhFUl9WT0xVTUUsICAgMHgzZiwgU1QsIFNPVU5EX01BU0tfVk9MVU1FLCAgIDUsIDB4MDAwMCwgSU5WICB9LAorICAgIHsgQUM5N19NQVNURVJfVk9MX01PTk8sICAgU09VTkRfTUlYRVJfUEhPTkVPVVQsIDB4M2YsIE1PLCBTT1VORF9NQVNLX1BIT05FT1VULCA2LCAweDAwMDAsIElOViAgfSwKKyAgICB7IEFDOTdfTUFTVEVSX1RPTkUsICAgICAgIFNPVU5EX01JWEVSX1RSRUJMRSwgICAweDBmLCBNTywgU09VTkRfTUFTS19UUkVCTEUsICAtMSwgMHgwMGZmLCBJTlYgIH0sCisgICAgeyBBQzk3X01BU1RFUl9UT05FLCAgICAgICBTT1VORF9NSVhFUl9CQVNTLCAgICAgMHgwZiwgTU8sIFNPVU5EX01BU0tfQkFTUywgICAgLTEsIDB4ZmYwMCwgSU5WICB9LAorICAgIHsgQUM5N19QQ0JFRVBfVk9MLCAgICAgICAgU09VTkRfTUlYRVJfU1BFQUtFUiwgIDB4MGYsIE1PLCBTT1VORF9NQVNLX1NQRUFLRVIsIC0xLCAweDAwMWUsIElOViAgfSwKKyAgICB7IEFDOTdfUEhPTkVfVk9MLCAgICAgICAgIFNPVU5EX01JWEVSX1BIT05FSU4sICAweDFmLCBNTywgU09VTkRfTUFTS19QSE9ORUlOLCAgNywgMHgwMDAwLCBJTlYgIH0sCisgICAgeyBBQzk3X01JQ19WT0wsICAgICAgICAgICBTT1VORF9NSVhFUl9NSUMsICAgICAgMHgxZiwgTU8sIFNPVU5EX01BU0tfTUlDLCAgICAgIDAsIDB4MDAwMCwgSU5WICB9LAorICAgIHsgQUM5N19MSU5FSU5fVk9MLCAgICAgICAgU09VTkRfTUlYRVJfTElORSwgICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX0xJTkUsICAgICA0LCAweDAwMDAsIElOViAgfSwKKyAgICB7IEFDOTdfQ0RfVk9MLCAgICAgICAgICAgIFNPVU5EX01JWEVSX0NELCAgICAgICAweDFmLCBTVCwgU09VTkRfTUFTS19DRCwgICAgICAgMSwgMHgwMDAwLCBJTlYgIH0sCisgICAgeyBBQzk3X1ZJREVPX1ZPTCwgICAgICAgICBTT1VORF9NSVhFUl9WSURFTywgICAgMHgxZiwgU1QsIFNPVU5EX01BU0tfVklERU8sICAgIDIsIDB4MDAwMCwgSU5WICB9LAorICAgIHsgQUM5N19BVVhfVk9MLCAgICAgICAgICAgU09VTkRfTUlYRVJfTElORTEsICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX0xJTkUxLAkgICAzLCAweDAwMDAsIElOViAgfSwKKyAgICB7IEFDOTdfUENNT1VUX1ZPTCwgICAgICAgIFNPVU5EX01JWEVSX1BDTSwgICAgICAweDFmLCBTVCwgU09VTkRfTUFTS19QQ00sICAgICAtMSwgMHgwMDAwLCBJTlYgIH0sCisgICAgeyBBQzk3X1JFQ09SRF9HQUlOLCAgICAgICBTT1VORF9NSVhFUl9JR0FJTiwgICAgMHgwZiwgU1QsIFNPVU5EX01BU0tfSUdBSU4sICAgLTEsIDB4MDAwMCwgTklOViB9LAorICAgIHsgLTEsCQkgICAgICAtMSwJCSAgICAweGZmLCAwLCAgMCwgICAgICAgICAgICAgICAgICAtMSwgMHgwMDAwLCAwICAgIH0sCit9OworCitzdGF0aWMgc3RydWN0IGFjOTdfY2huX2Rlc2MgKgorYWM5N19maW5kX2NobmRlc2MgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCkKK3sKKyAgICBpbnQgeDsKKworICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5vc3NfY2hhbm5lbCAhPSAtMTsgeCsrKSB7CisJaWYgKG1peGVyUmVnc1t4XS5vc3NfY2hhbm5lbCA9PSBvc3NfY2hhbm5lbCkKKwkgICAgcmV0dXJuIG1peGVyUmVncyArIHg7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithYzk3X2lzX3ZhbGlkX2NoYW5uZWwgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaG4pCit7CisgICAgcmV0dXJuIChkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbY2huLT5hYzk3X3JlZ251bSAvIDJdCisJICAgICE9IEFDOTdfUkVHX1VOU1VQUE9SVEVEKTsKK30KKworaW50CithYzk3X2luaXQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpCit7CisgICAgaW50IHg7CisgICAgaW50IHJlZzA7CisKKyAgICAvKiBDbGVhciBvdXQgdGhlIGFycmF5cyBvZiBjYWNoZWQgdmFsdWVzLiAqLworICAgIGZvciAoeCA9IDA7IHggPCBBQzk3X1JFR19DTlQ7IHgrKykKKwlkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbeF0gPSBBQzk3X1JFR1ZBTF9VTktOT1dOOworCisgICAgZm9yICh4ID0gMDsgeCA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgeCsrKQorCWRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbeF0gPSBBQzk3X1JFR1ZBTF9VTktOT1dOOworCisgICAgLyogQ2xlYXIgdGhlIGRldmljZSBtYXNrcy4gICovCisgICAgZGV2LT5taXhlcl9kZXZtYXNrID0gMDsKKyAgICBkZXYtPm1peGVyX3N0ZXJlb21hc2sgPSAwOworICAgIGRldi0+bWl4ZXJfcmVjbWFzayA9IDA7CisKKyAgICAvKiA/Pz8gRG8gYSAic3RhbmRhcmQgcmVzZXQiIHZpYSByZWdpc3RlciAwPyAqLworCisgICAgLyogSGFyZHdhcmUtZGVwZW5kZW50IHJlc2V0LiAgKi8KKyAgICBpZiAoZGV2LT5yZXNldF9kZXZpY2UgKGRldikpCisJcmV0dXJuIC0xOworCisgICAgLyogQ2hlY2sgdGhlIG1peGVyIGRldmljZSBjYXBhYmlsaXRpZXMuICAqLworICAgIHJlZzAgPSBkZXYtPnJlYWRfcmVnIChkZXYsIEFDOTdfUkVTRVQpOworCisgICAgaWYgKHJlZzAgPCAwKQorCXJldHVybiAtMTsKKworICAgIC8qIENoZWNrIGZvciBzdXBwb3J0IGZvciB0cmVibGUvYmFzcyBjb250cm9scy4gICovCisgICAgaWYgKCEgKHJlZzAgJiA0KSkgeworCWRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tBQzk3X01BU1RFUl9UT05FIC8gMl0gCisJICAgID0gQUM5N19SRUdfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLyogPz8/IFRoZXJlIG1heSBiZSBvdGhlciB0ZXN0cyBoZXJlPyAqLworCisgICAgLyogRmlsbCBpbiB0aGUgZGV2aWNlIG1hc2tzLiAgKi8KKyAgICBmb3IgKHggPSAwOyBtaXhlclJlZ3NbeF0uYWM5N19yZWdudW0gIT0gLTE7IHgrKykgeworCWlmIChhYzk3X2lzX3ZhbGlkX2NoYW5uZWwgKGRldiwgbWl4ZXJSZWdzICsgeCkpIHsKKwkgICAgZGV2LT5taXhlcl9kZXZtYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKKworCSAgICBpZiAobWl4ZXJSZWdzW3hdLmlzX3N0ZXJlbykKKwkJZGV2LT5taXhlcl9zdGVyZW9tYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKKworCSAgICBpZiAobWl4ZXJSZWdzW3hdLnJlY29yZE51bSAhPSAtMSkKKwkJZGV2LT5taXhlcl9yZWNtYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFJlc2V0IHRoZSBtaXhlciB0byB0aGUgY3VycmVudGx5IHNhdmVkIHNldHRpbmdzLiAgKi8KK2ludAorYWM5N19yZXNldCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldikKK3sKKyAgICBpbnQgeDsKKworICAgIGlmIChkZXYtPnJlc2V0X2RldmljZSAoZGV2KSkKKwlyZXR1cm4gLTE7CisKKyAgICAvKiBOb3cgc2V0IHRoZSByZWdpc3RlcnMgYmFjayB0byB0aGVpciBsYXN0LXdyaXR0ZW4gdmFsdWVzLiAqLworICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSAhPSAtMTsgeCsrKSB7CisJaW50IHJlZ251bSA9IG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bTsKKwlpbnQgdmFsdWUgPSBkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXMgW3JlZ251bSAvIDJdOworCWlmICh2YWx1ZSA+PSAwKQorCSAgICBhYzk3X3B1dF9yZWdpc3RlciAoZGV2LCByZWdudW0sIHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB0aGUgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHOyB1c2UgdGhlIGNhY2hlIGlmIHRoZSB2YWx1ZSBpbiBpdAorICAgaXMgdmFsaWQuICBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiAqLworc3RhdGljIGludAorYWM5N19nZXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZykgCit7CisgICAgaWYgKHJlZyA+IDEyNyB8fCAocmVnICYgMSkpCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvKiBTZWUgaWYgaXQncyBpbiB0aGUgY2FjaGUsIG9yIGlmIGl0J3MganVzdCBwbGFpbiBpbnZhbGlkLiAgKi8KKyAgICBzd2l0Y2ggKGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSkgeworICAgIGNhc2UgQUM5N19SRUdfVU5TVVBQT1JURUQ6CisJcmV0dXJuIC1FSU5WQUw7CisJYnJlYWs7CisgICAgY2FzZSBBQzk3X1JFR1ZBTF9VTktOT1dOOgorCWRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9IGRldi0+cmVhZF9yZWcgKGRldiwgcmVnKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW3JlZyAvIDJdOworfQorCisvKiBXcml0ZSBWQUxVRSB0byBBQzk3IHJlZ2lzdGVyIFJFRywgYW5kIGNhY2hlIGl0cyB2YWx1ZSBpbiB0aGUgbGFzdC13cml0dGVuCisgICBjYWNoZS4gIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUsIG9yIDAgb24gc3VjY2Vzcy4gKi8KK2ludAorYWM5N19wdXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKQoreworICAgIGlmIChyZWcgPiAxMjcgfHwgKHJlZyAmIDEpKQorCXJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9PSBBQzk3X1JFR19VTlNVUFBPUlRFRCkKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICBlbHNlIHsKKwlpbnQgcmVzID0gZGV2LT53cml0ZV9yZWcgKGRldiwgcmVnLCB2YWx1ZSk7CisJaWYgKHJlcyA+PSAwKSB7CisJICAgIGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9IHZhbHVlOworCSAgICByZXR1cm4gMDsKKwl9CisJZWxzZQorCSAgICByZXR1cm4gcmVzOworICAgIH0KK30KKworLyogU2NhbGUgVkFMVUUgKGEgdmFsdWUgZnJvIDAgdG8gTUFYVkFMKSB0byBhIHZhbHVlIGZyb20gMC0xMDAuICBJZgorICAgSVNfU1RFUkVPIGlzIHNldCwgVkFMVUUgaXMgYSBzdGVyZW8gdmFsdWU7IHRoZSBsZWZ0IGNoYW5uZWwgdmFsdWUKKyAgIGlzIGluIHRoZSBsb3dlciA4IGJpdHMsIGFuZCB0aGUgcmlnaHQgY2hhbm5lbCB2YWx1ZSBpcyBpbiB0aGUgdXBwZXIKKyAgIDggYml0cy4KKworICAgQSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlzIHJldHVybmVkIG9uIGZhaWx1cmUsIG9yIHRoZSB1bnNpZ25lZAorICAgc2NhbGVkIHZhbHVlIG9uIHN1Y2Nlc3MuICAqLworCitzdGF0aWMgaW50CithYzk3X3NjYWxlX3RvX29zc192YWwgKGludCB2YWx1ZSwgaW50IG1heHZhbCwgaW50IGlzX3N0ZXJlbywgaW50IGludikKK3sKKyAgICAvKiBNdXRlZD8gICovCisgICAgaWYgKHZhbHVlICYgQUM5N19NVVRFKQorCXJldHVybiAwOworCisgICAgaWYgKGlzX3N0ZXJlbykKKwlyZXR1cm4gKGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAodmFsdWUgJiAyNTUsIG1heHZhbCwgMCwgaW52KSA8PCA4KQorCXwgKGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAoKHZhbHVlID4+IDgpICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgMCk7CisgICAgZWxzZSB7CisJaW50IGk7CisJCisJLyogSW52ZXJ0ZWQuICovCisJaWYgKGludikKKwkgICAgdmFsdWUgPSBtYXh2YWwgLSB2YWx1ZTsKKworCWkgPSAodmFsdWUgKiAxMDAgKyAobWF4dmFsIC8gMikpIC8gbWF4dmFsOworCWlmIChpID4gMTAwKQorCSAgICAgaSA9IDEwMDsKKwlpZiAoaSA8IDApCisJICAgIGkgPSAwOworCXJldHVybiBpOworICAgIH0KK30KKworc3RhdGljIGludAorYWM5N19zY2FsZV9mcm9tX29zc192YWwgKGludCB2YWx1ZSwgaW50IG1heHZhbCwgaW50IGlzX3N0ZXJlbywgaW50IGludikKK3sKKyAgICBpZiAoaXNfc3RlcmVvKQorCXJldHVybiAoYWM5N19zY2FsZV9mcm9tX29zc192YWwgKHZhbHVlICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgOCkKKwl8IChhYzk3X3NjYWxlX2Zyb21fb3NzX3ZhbCAoKHZhbHVlID4+IDgpICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgMCk7CisgICAgZWxzZSB7CisJaW50IGkgPSAoKHZhbHVlICYgMjU1KSAqIG1heHZhbCArIDUwKSAvIDEwMDsKKwlpZiAoaW52KQorCSAgICBpID0gbWF4dmFsIC0gaTsKKwlpZiAoaSA8IDApCisJICAgIGkgPSAwOworCWlmIChpID4gbWF4dmFsKQorCSAgICBpID0gbWF4dmFsOworCXJldHVybiBpOworICAgIH0KK30KKworc3RhdGljIGludAorYWM5N19zZXRfbWl4ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCwgdTE2IG9zc192YWx1ZSkKK3sKKyAgICBpbnQgc2NhbGVkX3ZhbHVlOworICAgIHN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaGFubmVsID0gYWM5N19maW5kX2NobmRlc2MgKGRldiwgb3NzX2NoYW5uZWwpOworICAgIGludCByZXN1bHQ7CisKKyAgICBpZiAoY2hhbm5lbCA9PSBOVUxMKQorCXJldHVybiAtRU5PREVWOworICAgIGlmICghIGFjOTdfaXNfdmFsaWRfY2hhbm5lbCAoZGV2LCBjaGFubmVsKSkKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICBzY2FsZWRfdmFsdWUgPSBhYzk3X3NjYWxlX2Zyb21fb3NzX3ZhbCAob3NzX3ZhbHVlLCBjaGFubmVsLT5tYXh2YWwsCisJCQkJCSAgICBjaGFubmVsLT5pc19zdGVyZW8sIAorCQkJCQkgICAgY2hhbm5lbC0+aXNfaW52ZXJ0ZWQpOworICAgIGlmIChzY2FsZWRfdmFsdWUgPCAwKQorCXJldHVybiBzY2FsZWRfdmFsdWU7CisKKyAgICBpZiAoY2hhbm5lbC0+cmVnbWFzayAhPSAwKSB7CisJaW50IG12OworCisJaW50IG9sZHZhbCA9IGFjOTdfZ2V0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtKTsKKwlpZiAob2xkdmFsIDwgMCkKKwkgICAgcmV0dXJuIG9sZHZhbDsKKworCWZvciAobXYgPSBjaGFubmVsLT5yZWdtYXNrOyAhIChtdiAmIDEpOyBtdiA+Pj0gMSkKKwkgICAgc2NhbGVkX3ZhbHVlIDw8PSAxOworCisJc2NhbGVkX3ZhbHVlICY9IGNoYW5uZWwtPnJlZ21hc2s7CisJc2NhbGVkX3ZhbHVlIHw9IChvbGR2YWwgJiB+Y2hhbm5lbC0+cmVnbWFzayk7CisgICAgfQorICAgIHJlc3VsdCA9IGFjOTdfcHV0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtLCBzY2FsZWRfdmFsdWUpOworICAgIGlmIChyZXN1bHQgPT0gMCkKKwlkZXYtPmxhc3Rfd3JpdHRlbl9PU1NfdmFsdWVzW29zc19jaGFubmVsXSA9IG9zc192YWx1ZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CithYzk3X2dldF9taXhlcl9zY2FsZWQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCkKK3sKKyAgICBzdHJ1Y3QgYWM5N19jaG5fZGVzYyAqY2hhbm5lbCA9IGFjOTdfZmluZF9jaG5kZXNjIChkZXYsIG9zc19jaGFubmVsKTsKKyAgICBpbnQgcmVndmFsOworCisgICAgaWYgKGNoYW5uZWwgPT0gTlVMTCkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGlmICghIGFjOTdfaXNfdmFsaWRfY2hhbm5lbCAoZGV2LCBjaGFubmVsKSkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIHJlZ3ZhbCA9IGFjOTdfZ2V0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtKTsKKworICAgIGlmIChyZWd2YWwgPCAwKQorCXJldHVybiByZWd2YWw7CisKKyAgICBpZiAoY2hhbm5lbC0+cmVnbWFzayAhPSAwKSB7CisJaW50IG12OworCisJcmVndmFsICY9IGNoYW5uZWwtPnJlZ21hc2s7CisKKwlmb3IgKG12ID0gY2hhbm5lbC0+cmVnbWFzazsgISAobXYgJiAxKTsgbXYgPj49IDEpCisJICAgIHJlZ3ZhbCA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAocmVndmFsLCBjaGFubmVsLT5tYXh2YWwsCisJCQkJICBjaGFubmVsLT5pc19zdGVyZW8sIAorCQkJCSAgY2hhbm5lbC0+aXNfaW52ZXJ0ZWQpOworfQorCitzdGF0aWMgaW50CithYzk3X2dldF9yZWNtYXNrIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KQoreworICAgIGludCByZWNSZWcgPSBhYzk3X2dldF9yZWdpc3RlciAoZGV2LCBBQzk3X1JFQ09SRF9TRUxFQ1QpOworCisgICAgaWYgKHJlY1JlZyA8IDApCisJcmV0dXJuIHJlY1JlZzsKKyAgICBlbHNlIHsKKwlpbnQgeDsKKwlmb3IgKHggPSAwOyBtaXhlclJlZ3NbeF0uYWM5N19yZWdudW0gPj0gMDsgeCsrKSB7CisJICAgIGlmIChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtID09IChyZWNSZWcgJiA3KSkKKwkJcmV0dXJuIG1peGVyUmVnc1t4XS5vc3NfbWFzazsKKwl9CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorfQorCitzdGF0aWMgaW50CithYzk3X3NldF9yZWNtYXNrIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCBpbnQgb3NzX3JlY21hc2spCit7CisgICAgaW50IHg7CisKKyAgICBpZiAob3NzX3JlY21hc2sgPT0gMCkKKwlvc3NfcmVjbWFzayA9IFNPVU5EX01JWEVSX01JQzsKKworICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSA+PSAwOyB4KyspIHsgCisJaWYgKChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtID49IDApCisJICAgICAmJiAob3NzX3JlY21hc2sgJiBtaXhlclJlZ3NbeF0ub3NzX21hc2spKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSA8IDApCisJcmV0dXJuIC1FTk9ERVY7CisgICAgZWxzZSB7CisJaW50IHJlZ3ZhbCA9IChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtIDw8IDgpIHwgbWl4ZXJSZWdzW3hdLnJlY29yZE51bTsKKwlpbnQgcmVzID0gYWM5N19wdXRfcmVnaXN0ZXIgKGRldiwgQUM5N19SRUNPUkRfU0VMRUNULCByZWd2YWwpOworCWlmIChyZXMgPT0gMCkKKwkgICAgcmV0dXJuIGFjOTdfZ2V0X3JlY21hc2sgKGRldik7CisJZWxzZQorCSAgICByZXR1cm4gcmVzOworICAgIH0KK30KKworLyogU2V0IHRoZSBtaXhlciBERVYgdG8gdGhlIGxpc3Qgb2YgdmFsdWVzIGluIFZBTFVFX0xJU1QuICBSZXR1cm4gMCBvbgorICAgc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgKi8KK2ludAorYWM5N19zZXRfdmFsdWVzIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCAKKwkJIHN0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QgKnZhbHVlX2xpc3QpCit7CisgICAgaW50IHg7CisKKyAgICBmb3IgKHggPSAwOyB2YWx1ZV9saXN0W3hdLm9zc19jaGFubmVsICE9IC0xOyB4KyspIHsKKwlpbnQgY2hudW0gPSB2YWx1ZV9saXN0W3hdLm9zc19jaGFubmVsOworCXN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaGVudCA9IGFjOTdfZmluZF9jaG5kZXNjIChkZXYsIGNobnVtKTsKKwlpZiAoY2hlbnQgIT0gTlVMTCkgeworCSAgICB1MTYgdmFsOworCSAgICBpbnQgcmVzOworCisJICAgIGlmIChjaGVudC0+aXNfc3RlcmVvKQorCQl2YWwgPSAodmFsdWVfbGlzdFt4XS52YWx1ZS5zdGVyZW8ucmlnaHQgPDwgOCkgCisJCSAgICAgIHwgdmFsdWVfbGlzdFt4XS52YWx1ZS5zdGVyZW8ubGVmdDsKKwkgICAgZWxzZSB7CisJCS8qIFdlIGRvIHRoaXMgc28gdGhlIHJldHVybmVkIHZhbHVlIGxvb2tzIE9LIGluIHRoZQorCQkgICBtaXhlciBhcHAuICBJdCdzIG5vdCBuZWNlc3Nhcnkgb3RoZXJ3aXNlLiAgKi8KKwkJdmFsID0gKHZhbHVlX2xpc3RbeF0udmFsdWUubW9ubyA8PCA4KSAKKwkJICAgICAgfCB2YWx1ZV9saXN0W3hdLnZhbHVlLm1vbm87CisJICAgIH0KKwkgICAgcmVzID0gYWM5N19zZXRfbWl4ZXIgKGRldiwgY2hudW0sIHZhbCk7CisJICAgIGlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCX0KKwllbHNlCisJICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50CithYzk3X21peGVyX2lvY3RsIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworICAgIGludCByZXQ7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkM6CisJcmV0ID0gYWM5N19nZXRfcmVjbWFzayAoZGV2KTsKKwlicmVhazsKKworICAgIGNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDOgorCXsKKwkgICAgaWYgKGdldF91c2VyIChyZXQsIChpbnQgX191c2VyICopIGFyZykpCisJCXJldCA9IC1FRkFVTFQ7CisJICAgIGVsc2UKKwkJcmV0ID0gYWM5N19zZXRfcmVjbWFzayAoZGV2LCByZXQpOworCX0KKwlicmVhazsKKworICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9DQVBTOgorCXJldCA9IFNPVU5EX0NBUF9FWENMX0lOUFVUOworCWJyZWFrOworCisgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0s6CisJcmV0ID0gZGV2LT5taXhlcl9kZXZtYXNrOworCWJyZWFrOworCisgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6CisJcmV0ID0gZGV2LT5taXhlcl9yZWNtYXNrOworCWJyZWFrOworCisgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlM6CisJcmV0ID0gZGV2LT5taXhlcl9zdGVyZW9tYXNrOworCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwkvKiBSZWFkIG9yIHdyaXRlIHJlcXVlc3QuICovCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoX0lPQ19UWVBFIChjbWQpID09ICdNJykgeworCSAgICBpbnQgZGlyID0gX1NJT0NfRElSIChjbWQpOworCSAgICBpbnQgY2hhbm5lbCA9IF9JT0NfTlIgKGNtZCk7CisKKwkgICAgaWYgKGNoYW5uZWwgPj0gMCAmJiBjaGFubmVsIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTKSB7CisJCXJldCA9IDA7CisJCWlmIChkaXIgJiBfU0lPQ19XUklURSkgeworCQkgICAgaW50IHZhbDsKKwkJICAgIGlmIChnZXRfdXNlciAodmFsLCAoaW50IF9fdXNlciAqKSBhcmcpID09IDApCisJCQlyZXQgPSBhYzk3X3NldF9taXhlciAoZGV2LCBjaGFubmVsLCB2YWwpOworCQkgICAgZWxzZQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJfQorCQlpZiAocmV0ID49IDAgJiYgKGRpciAmIF9TSU9DX1JFQUQpKSB7CisJCSAgICBpZiAoZGV2LT5sYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tjaGFubmVsXQorCQkJPT0gQUM5N19SRUdWQUxfVU5LTk9XTikKKwkJCWRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbY2hhbm5lbF0KKwkJCSAgICA9IGFjOTdfZ2V0X21peGVyX3NjYWxlZCAoZGV2LCBjaGFubmVsKTsKKwkJICAgIHJldCA9IGRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbY2hhbm5lbF07CisJCX0KKwkgICAgfQorCX0KKwlicmVhazsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkKKwlyZXR1cm4gcmV0OworICAgIGVsc2UKKwlyZXR1cm4gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpOworfQorCitFWFBPUlRfU1lNQk9MKGFjOTdfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGFjOTdfc2V0X3ZhbHVlcyk7CitFWFBPUlRfU1lNQk9MKGFjOTdfcHV0X3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYWM5N19taXhlcl9pb2N0bCk7CitFWFBPUlRfU1lNQk9MKGFjOTdfcmVzZXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hYzk3LmggYi9zb3VuZC9vc3MvYWM5Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDQ1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYWM5Ny5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogYWM5Ny5oIAorICogCisgKiBkZWZpbml0aW9ucyBmb3IgdGhlIEFDOTcsIEludGVsJ3MgQXVkaW8gQ29kZWMgOTcgU3BlYworICogYWxzbyBpbmNsdWRlcyBzdXBwb3J0IGZvciBhIGdlbmVyaWMgQUM5NyBpbnRlcmZhY2UKKyAqLworCisjaWZuZGVmIF9BQzk3X0hfCisjZGVmaW5lIF9BQzk3X0hfCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAic291bmRfY2FsbHMuaCIKKworI2RlZmluZSAgQUM5N19SRVNFVCAgICAgICAgICAgICAgMHgwMDAwICAgICAgLy8KKyNkZWZpbmUgIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8gIDB4MDAwMiAgICAgIC8vIExpbmUgT3V0CisjZGVmaW5lICBBQzk3X0hFQURQSE9ORV9WT0wgICAgICAweDAwMDQgICAgICAvLyAKKyNkZWZpbmUgIEFDOTdfTUFTVEVSX1ZPTF9NT05PICAgIDB4MDAwNiAgICAgIC8vIFRBRCBPdXRwdXQKKyNkZWZpbmUgIEFDOTdfTUFTVEVSX1RPTkUgICAgICAgIDB4MDAwOCAgICAgIC8vCisjZGVmaW5lICBBQzk3X1BDQkVFUF9WT0wgICAgICAgICAweDAwMGEgICAgICAvLyBub25lCisjZGVmaW5lICBBQzk3X1BIT05FX1ZPTCAgICAgICAgICAweDAwMGMgICAgICAvLyBUQUQgSW5wdXQgKG1vbm8pCisjZGVmaW5lICBBQzk3X01JQ19WT0wgICAgICAgICAgICAweDAwMGUgICAgICAvLyBNSUMgSW5wdXQgKG1vbm8pCisjZGVmaW5lICBBQzk3X0xJTkVJTl9WT0wgICAgICAgICAweDAwMTAgICAgICAvLyBMaW5lIElucHV0IChzdGVyZW8pCisjZGVmaW5lICBBQzk3X0NEX1ZPTCAgICAgICAgICAgICAweDAwMTIgICAgICAvLyBDRCBJbnB1dCAoc3RlcmVvKQorI2RlZmluZSAgQUM5N19WSURFT19WT0wgICAgICAgICAgMHgwMDE0ICAgICAgLy8gbm9uZQorI2RlZmluZSAgQUM5N19BVVhfVk9MICAgICAgICAgICAgMHgwMDE2ICAgICAgLy8gQXV4IElucHV0IChzdGVyZW8pCisjZGVmaW5lICBBQzk3X1BDTU9VVF9WT0wgICAgICAgICAweDAwMTggICAgICAvLyBXYXZlIE91dHB1dCAoc3RlcmVvKQorI2RlZmluZSAgQUM5N19SRUNPUkRfU0VMRUNUICAgICAgMHgwMDFhICAgICAgLy8KKyNkZWZpbmUgIEFDOTdfUkVDT1JEX0dBSU4gICAgICAgIDB4MDAxYworI2RlZmluZSAgQUM5N19SRUNPUkRfR0FJTl9NSUMgICAgMHgwMDFlCisjZGVmaW5lICBBQzk3X0dFTkVSQUxfUFVSUE9TRSAgICAweDAwMjAKKyNkZWZpbmUgIEFDOTdfM0RfQ09OVFJPTCAgICAgICAgIDB4MDAyMgorI2RlZmluZSAgQUM5N19NT0RFTV9SQVRFICAgICAgICAgMHgwMDI0CisjZGVmaW5lICBBQzk3X1BPV0VSX0NPTlRST0wgICAgICAweDAwMjYKKworLyogcmVnaXN0ZXJzIDB4MDAyOCAtIDB4MDA1OCBhcmUgcmVzZXJ2ZWQgKi8KKworLyogQUMnOTcgMi4wICovCisjZGVmaW5lIEFDOTdfRVhURU5ERURfSUQJMHgwMDI4CS8qIEV4dGVuZGVkIEF1ZGlvIElEICovCisjZGVmaW5lIEFDOTdfRVhURU5ERURfU1RBVFVTCTB4MDAyQQkvKiBFeHRlbmRlZCBBdWRpbyBTdGF0dXMgKi8KKyNkZWZpbmUgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUgMHgwMDJDICAvKiBQQ00gRnJvbnQgREFDIFJhdGUgKi8KKyNkZWZpbmUgQUM5N19QQ01fU1VSUl9EQUNfUkFURSAgMHgwMDJFICAvKiBQQ00gU3Vycm91bmQgREFDIFJhdGUgKi8KKyNkZWZpbmUgQUM5N19QQ01fTEZFX0RBQ19SQVRFICAgMHgwMDMwICAvKiBQQ00gTEZFIERBQyBSYXRlICovCisjZGVmaW5lIEFDOTdfUENNX0xSX0FEQ19SQVRFCTB4MDAzMgkvKiBQQ00gTFIgREFDIFJhdGUgKi8KKyNkZWZpbmUgQUM5N19QQ01fTUlDX0FEQ19SQVRFICAgMHgwMDM0ICAvKiBQQ00gTUlDIEFEQyBSYXRlICovCisjZGVmaW5lIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIgIDB4MDAzNiAgLyogQ2VudGVyICsgTEZFIE1hc3RlciBWb2x1bWUgKi8KKyNkZWZpbmUgQUM5N19TVVJST1VORF9NQVNURVIgICAgMHgwMDM4ICAvKiBTdXJyb3VuZCAoUmVhcikgTWFzdGVyIFZvbHVtZSAqLworI2RlZmluZSBBQzk3X1JFU0VSVkVEXzNBCTB4MDAzQQkvKiBSZXNlcnZlZCAqLworLyogcmFuZ2UgMHgzYy0weDU4IC0gTU9ERU0gKi8KKworLyogcmVnaXN0ZXJzIDB4MDA1YSAtIDB4MDA3YSBhcmUgdmVuZG9yIHJlc2VydmVkICovCisKKyNkZWZpbmUgIEFDOTdfVkVORE9SX0lEMSAgICAgICAgIDB4MDA3YworI2RlZmluZSAgQUM5N19WRU5ET1JfSUQyICAgICAgICAgMHgwMDdlCisKKy8qIHZvbHVtZSBjb250cm9sIGJpdCBkZWZpbmVzICovCisKKyNkZWZpbmUgQUM5N19NVVRFICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBBQzk3X01JQ0JPT1NUICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEFDOTdfTEVGVFZPTCAgICAgICAgICAgICAweDNmMDAKKyNkZWZpbmUgQUM5N19SSUdIVFZPTCAgICAgICAgICAgIDB4MDAzZgorCisvKiByZWNvcmQgbXV4IGRlZmluZXMgKi8KKworI2RlZmluZSBBQzk3X1JFQ01VWF9NSUMgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFDOTdfUkVDTVVYX0NEICAgICAgICAgICAweDAxMDEKKyNkZWZpbmUgQUM5N19SRUNNVVhfVklERU8gICAgICAgIDB4MDIwMiAgICAgIC8qIG5vdCB1c2VkICovCisjZGVmaW5lIEFDOTdfUkVDTVVYX0FVWCAgICAgICAgICAweDAzMDMgICAgICAKKyNkZWZpbmUgQUM5N19SRUNNVVhfTElORSAgICAgICAgIDB4MDQwNCAgICAgIAorI2RlZmluZSBBQzk3X1JFQ01VWF9TVEVSRU9fTUlYICAgMHgwNTA1CisjZGVmaW5lIEFDOTdfUkVDTVVYX01PTk9fTUlYICAgICAweDA2MDYKKyNkZWZpbmUgQUM5N19SRUNNVVhfUEhPTkUgICAgICAgIDB4MDcwNworCisKKy8qIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBiaXQgZGVmaW5lcyAqLworCisjZGVmaW5lIEFDOTdfR1BfTFBCSyAgICAgICAgICAgICAweDAwODAgICAgICAvKiBMb29wYmFjayBtb2RlICovCisjZGVmaW5lIEFDOTdfR1BfTVMgICAgICAgICAgICAgICAweDAxMDAgICAgICAvKiBNaWMgU2VsZWN0IDA9TWljMSwgMT1NaWMyICovCisjZGVmaW5lIEFDOTdfR1BfTUlYICAgICAgICAgICAgICAweDAyMDAgICAgICAvKiBNb25vIG91dHB1dCBzZWxlY3QgMD1NaXgsIDE9TWljICovCisjZGVmaW5lIEFDOTdfR1BfUkxCSyAgICAgICAgICAgICAweDA0MDAgICAgICAvKiBSZW1vdGUgTG9vcGJhY2sgLSBNb2RlbSBsaW5lIGNvZGVjICovCisjZGVmaW5lIEFDOTdfR1BfTExCSyAgICAgICAgICAgICAweDA4MDAgICAgICAvKiBMb2NhbCBMb29wYmFjayAtIE1vZGVtIExpbmUgY29kZWMgKi8KKyNkZWZpbmUgQUM5N19HUF9MRCAgICAgICAgICAgICAgIDB4MTAwMCAgICAgIC8qIExvdWRuZXNzIDE9b24gKi8KKyNkZWZpbmUgQUM5N19HUF8zRCAgICAgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIDNEIEVuaGFuY2VtZW50IDE9b24gKi8KKyNkZWZpbmUgQUM5N19HUF9TVCAgICAgICAgICAgICAgIDB4NDAwMCAgICAgIC8qIFN0ZXJlbyBFbmhhbmNlbWVudCAxPW9uICovCisjZGVmaW5lIEFDOTdfR1BfUE9QICAgICAgICAgICAgICAweDgwMDAgICAgICAvKiBQY20gT3V0IFBhdGgsIDA9cHJlIDNELCAxPXBvc3QgM0QgKi8KKworCisvKiBwb3dlcmRvd24gY29udHJvbCBhbmQgc3RhdHVzIGJpdCBkZWZpbmVzICovCisKKy8qIHN0YXR1cyAqLworI2RlZmluZSBBQzk3X1BXUl9NRE0gICAgICAgICAgICAgMHgwMDEwICAgICAgLyogTW9kZW0gc2VjdGlvbiByZWFkeSAqLworI2RlZmluZSBBQzk3X1BXUl9SRUYgICAgICAgICAgICAgMHgwMDA4ICAgICAgLyogVnJlZiBub21pbmFsICovCisjZGVmaW5lIEFDOTdfUFdSX0FOTCAgICAgICAgICAgICAweDAwMDQgICAgICAvKiBBbmFsb2cgc2VjdGlvbiByZWFkeSAqLworI2RlZmluZSBBQzk3X1BXUl9EQUMgICAgICAgICAgICAgMHgwMDAyICAgICAgLyogREFDIHNlY3Rpb24gcmVhZHkgKi8KKyNkZWZpbmUgQUM5N19QV1JfQURDICAgICAgICAgICAgIDB4MDAwMSAgICAgIC8qIEFEQyBzZWN0aW9uIHJlYWR5ICovCisKKy8qIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUM5N19QV1JfUFIwICAgICAgICAgICAgIDB4MDEwMCAgICAgIC8qIEFEQyBhbmQgTXV4IHBvd2VyZG93biAqLworI2RlZmluZSBBQzk3X1BXUl9QUjEgICAgICAgICAgICAgMHgwMjAwICAgICAgLyogREFDIHBvd2VyZG93biAqLworI2RlZmluZSBBQzk3X1BXUl9QUjIgICAgICAgICAgICAgMHgwNDAwICAgICAgLyogT3V0cHV0IG1peGVyIHBvd2VyZG93biAoVnJlZiBvbikgKi8KKyNkZWZpbmUgQUM5N19QV1JfUFIzICAgICAgICAgICAgIDB4MDgwMCAgICAgIC8qIE91dHB1dCBtaXhlciBwb3dlcmRvd24gKFZyZWYgb2ZmKSAqLworI2RlZmluZSBBQzk3X1BXUl9QUjQgICAgICAgICAgICAgMHgxMDAwICAgICAgLyogQUMtbGluayBwb3dlcmRvd24gKi8KKyNkZWZpbmUgQUM5N19QV1JfUFI1ICAgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIEludGVybmFsIENsayBkaXNhYmxlICovCisjZGVmaW5lIEFDOTdfUFdSX1BSNiAgICAgICAgICAgICAweDQwMDAgICAgICAvKiBIUCBhbXAgcG93ZXJkb3duICovCisjZGVmaW5lIEFDOTdfUFdSX1BSNyAgICAgICAgICAgICAweDgwMDAgICAgICAvKiBNb2RlbSBvZmYgLSBpZiBzdXBwb3J0ZWQgKi8KKworLyogdXNlZnVsIHBvd2VyIHN0YXRlcyAqLworI2RlZmluZSBBQzk3X1BXUl9EMCAgICAgICAgICAgICAgMHgwMDAwICAgICAgLyogZXZlcnl0aGluZyBvbiAqLworI2RlZmluZSBBQzk3X1BXUl9EMSAgICAgICAgICAgICAgQUM5N19QV1JfUFIwfEFDOTdfUFdSX1BSMXxBQzk3X1BXUl9QUjQKKyNkZWZpbmUgQUM5N19QV1JfRDIgICAgICAgICAgICAgIEFDOTdfUFdSX1BSMHxBQzk3X1BXUl9QUjF8QUM5N19QV1JfUFIyfEFDOTdfUFdSX1BSM3xBQzk3X1BXUl9QUjQKKyNkZWZpbmUgQUM5N19QV1JfRDMgICAgICAgICAgICAgIEFDOTdfUFdSX1BSMHxBQzk3X1BXUl9QUjF8QUM5N19QV1JfUFIyfEFDOTdfUFdSX1BSM3xBQzk3X1BXUl9QUjQKKyNkZWZpbmUgQUM5N19QV1JfQU5MT0ZGICAgICAgICAgIEFDOTdfUFdSX1BSMnxBQzk3X1BXUl9QUjMgIC8qIGFuYWxvZyBzZWN0aW9uIG9mZiAqLworCisvKiBUb3RhbCBudW1iZXIgb2YgZGVmaW5lZCByZWdpc3RlcnMuICAqLworI2RlZmluZSBBQzk3X1JFR19DTlQgNjQKKworLyogR2VuZXJpYyBBQzk3IG1peGVyIGludGVyZmFjZS4gKi8KKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZS4gKi8KK3N0cnVjdCBhYzk3X2h3aW50Cit7CisgICAgLyogUGVyZm9ybSBhbnkgaGFyZHdhcmUtc3BlY2lmaWMgcmVzZXQgYW5kIGluaXRpYWxpemF0aW9uLiAgUmV0dXJucworICAgICAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gICovCisgICAgaW50ICgqcmVzZXRfZGV2aWNlKSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldik7CisKKyAgICAvKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIFJFRy4gIFRoZSBjYWxsZXIKKyAgICAgICBzaG91bGQgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXNpcmVkIGNvbnRlbnRzIGFyZSBhdmFpbGFibGUgaW4KKyAgICAgICB0aGUgY2FjaGUgZmlyc3QsIGlmIGFwcGxpY2FibGUuIFJldHVybnMgYSBwb3NpdGl2ZSB1bnNpZ25lZCB2YWx1ZQorICAgICAgIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgdGhlIHJlZ2lzdGVyLCBvciBhIG5lZ2F0aXZlIGVycm9yCisgICAgICAgY29kZS4gICovCisgICAgaW50ICgqcmVhZF9yZWcpIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcpOworCisgICAgLyogV3JpdGVzIFZBTFVFIHRvIHJlZ2lzdGVyIFJFRy4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhCisgICAgICAgbmVnYXRpdmUgZXJyb3IgY29kZS4gICovCisgICAgaW50ICgqd3JpdGVfcmVnKSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnLCB1MTYgdmFsdWUpOworCisgICAgLyogSGFyZHdhcmUtc3BlY2lmaWMgaW5mb3JtYXRpb24uICovCisgICAgdm9pZCAqZHJpdmVyX3ByaXZhdGU7CisKKyAgICAvKiBUaHJlZSBPU1MgbWFza3MuICovCisgICAgaW50IG1peGVyX2Rldm1hc2s7CisgICAgaW50IG1peGVyX3N0ZXJlb21hc2s7CisgICAgaW50IG1peGVyX3JlY21hc2s7CisKKyAgICAvKiBUaGUgbWl4ZXIgY2FjaGUuIFRoZSBpbmRpY2VzIGNvcnJlc3BvbmQgdG8gdGhlIEFDOTcgaGFyZHdhcmUgcmVnaXN0ZXIKKyAgICAgICBudW1iZXIgLyAyLCBzaW5jZSB0aGUgcmVnaXN0ZXIgbnVtYmVycyBhcmUgYWx3YXlzIGFuIGV2ZW4gbnVtYmVyLgorCisgICAgICAgVW5rbm93biB2YWx1ZXMgYXJlIHNldCB0byAtMTsgdW5zdXBwb3J0ZWQgcmVnaXN0ZXJzIGNvbnRhaW4gYQorICAgICAgIC0yLiAgKi8KKyAgICBpbnQgbGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tBQzk3X1JFR19DTlRdOworCisgICAgLyogQSBjYWNoZSBvZiB2YWx1ZXMgd3JpdHRlbiB2aWEgT1NTOyB3ZSBuZWVkIHRoZXNlIHNvIHdlIGNhbiByZXR1cm4KKyAgICAgICB0aGUgdmFsdWVzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSB0aGUgdXNlci4KKworICAgICAgIFdoeSB0aGUgb3JpZ2luYWwgdXNlciB2YWx1ZXM/ICBCZWNhdXNlIHRoZSByZWFsLXdvcmxkIGhhcmR3YXJlCisgICAgICAgaGFzIGxlc3MgcHJlY2lzaW9uLCBhbmQgc29tZSBleGlzdGluZyBhcHBsaWNhdGlvbnMgYXNzdW1lIHRoYXQKKyAgICAgICB0aGV5IHdpbGwgZ2V0IGJhY2sgdGhlIGV4YWN0IHZhbHVlIHRoYXQgdGhleSB3cm90ZSAoYXVtaXgpLgorCisgICAgICAgQSAtMSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBubyB2YWx1ZSBoYXMgYmVlbiB3cml0dGVuIHRvIHRoaXMgbWl4ZXIKKyAgICAgICBjaGFubmVsIHZpYSBPU1MuICAqLworICAgIGludCBsYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdOworfTsKKworLyogVmFsdWVzIHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXIgY2FjaGUuICAqLworI2RlZmluZSBBQzk3X1JFR1ZBTF9VTktOT1dOIC0xCisjZGVmaW5lIEFDOTdfUkVHX1VOU1VQUE9SVEVEIC0yCisKK3N0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QKK3sKKyAgICAvKiBNaXhlciBjaGFubmVsIHRvIHNldC4gIExpc3QgaXMgdGVybWluYXRlZCBieSBhIHZhbHVlIG9mIC0xLiAgKi8KKyAgICBpbnQgb3NzX2NoYW5uZWw7CisgICAgLyogVGhlIHNjYWxlZCB2YWx1ZSB0byBzZXQgaXQgdG87IHZhbHVlcyBnZW5lcmFsbHkgcmFuZ2UgZnJvbSAwLTEwMC4gKi8KKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdTggbGVmdCwgcmlnaHQ7CisJfSBzdGVyZW87CisJdTggbW9ubzsKKyAgICB9IHZhbHVlOworfTsKKworLyogSW5pdGlhbGl6ZSB0aGUgYWM5NyBtaXhlciBieSByZXNldHRpbmcgaXQuICAqLworZXh0ZXJuIGludCBhYzk3X2luaXQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpOworCisvKiBTZXRzIHRoZSBtaXhlciBERVYgdG8gdGhlIHZhbHVlcyBpbiBWQUxVRV9MSVNULiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsCisgICBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuICAqLworZXh0ZXJuIGludCBhYzk3X3NldF92YWx1ZXMgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsCisJCQkgICAgc3RydWN0IGFjOTdfbWl4ZXJfdmFsdWVfbGlzdCAqdmFsdWVfbGlzdCk7CisKKy8qIFdyaXRlcyB0aGUgc3BlY2lmaWVkIFZBTFVFIHRvIHRoZSBBQzk3IHJlZ2lzdGVyIFJFRyBpbiB0aGUgbWl4ZXIuCisgICBUYWtlcyBjYXJlIG9mIHNldHRpbmcgdGhlIGxhc3Qtd3JpdHRlbiBjYWNoZSBhcyB3ZWxsLiAgKi8KK2V4dGVybiBpbnQgYWM5N19wdXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKTsKKworLyogRGVmYXVsdCBpb2N0bC4gKi8KK2V4dGVybiBpbnQgYWM5N19taXhlcl9pb2N0bCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgdm9pZCBfX3VzZXIgKiBhcmcpOworCisvKiBEbyBhIGNvbXBsZXRlIHJlc2V0IG9uIHRoZSBBQzk3IG1peGVyLCByZXN0b3JpbmcgYWxsIG1peGVyIHJlZ2lzdGVycyB0bworICAgdGhlIGN1cnJlbnQgdmFsdWVzLiAgTm9ybWFsbHkgdXNlZCBhZnRlciBhbiBBUE0gcmVzdW1lIGV2ZW50LiAgKi8KK2V4dGVybiBpbnQgYWM5N19yZXNldCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldik7CisjZW5kaWYKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjOTdfY29kZWMuYyBiL3NvdW5kL29zcy9hYzk3X2NvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0YjFlMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hYzk3X2NvZGVjLmMKQEAgLTAsMCArMSwxNTc2IEBACisvKgorICogYWM5N19jb2RlYy5jOiBHZW5lcmljIEFDOTcgbWl4ZXIvbW9kZW0gbW9kdWxlCisgKgorICogRGVyaXZlZCBmcm9tIGFjOTcgbWl4ZXIgaW4gbWFlc3RybyBhbmQgdHJpZGVudCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMDAgU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbSBDb3Jwb3JhdGlvbgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBJbnRlbCBBdWRpbyBDb2RlYyAnOTcgc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUgYXQgdGhlIEludGVsCisgKiBhdWRpbyBob21lcGFnZTogaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vaWFsL3NjYWxhYmxlcGxhdGZvcm1zL2F1ZGlvLworICoKKyAqIFRoZSBzcGVjaWZpY2F0aW9uIGl0c2VsZiBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGF0OgorICogZnRwOi8vZG93bmxvYWQuaW50ZWwuY29tL2lhbC9zY2FsYWJsZXBsYXRmb3Jtcy9hYzk3cjIyLnBkZgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEhpc3RvcnkKKyAqIE1heSAwMiwgMjAwMyBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKglSZW1vdmVkIG5vbiBleGlzdGFudCBXTTk3MDAKKyAqCUFkZGVkIHN1cHBvcnQgZm9yIFdNOTcwNSwgV005NzA4LCBXTTk3MDksIFdNOTcxMCwgV005NzExCisgKglXTTk3MTIgYW5kIFdNOTcxNworICogTWFyIDI4LCAyMDAyIFJhbmRvbHBoIEJlbnRzb24gPGJlbnRzb25AaG9sbXNqb2VuLmNvbT4KKyAqCWNvcnJlY3Rpb25zIHRvIHN1cHBvcnQgV005NzA3IGluIFZpZXdQYWQgMTAwMAorICogdjAuNCBNYXIgMTUgMjAwMCBPbGxpZSBMaG8KKyAqCWR1YWwgY29kZWNzIHN1cHBvcnQgdmVyaWZpZWQgd2l0aCA0IGNoYW5uZWxzIG91dHB1dAorICogdjAuMyBGZWIgMjIgMjAwMCBPbGxpZSBMaG8KKyAqCWJ1ZyBmaXggZm9yIHJlY29yZCBtYXNrIHNldHRpbmcKKyAqIHYwLjIgRmViIDEwIDIwMDAgT2xsaWUgTGhvCisgKglhZGQgYWM5N19yZWFkX3Byb2MgZm9yIC9wcm9jL2RyaXZlci97dmVuZG9yfS9hYzk3CisgKiB2MC4xIEphbiAxNCAyMDAwIE9sbGllIExobyA8b2xsaWVAc2lzLmNvbS50dz4gCisgKglJc29sYXRlZCBmcm9tIHRyaWRlbnQuYyB0byBzdXBwb3J0IG11bHRpcGxlIGFjOTcgY29kZWMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgQ09ERUNfSURfQlVGU1ogMTQKKworc3RhdGljIGludCBhYzk3X3JlYWRfbWl4ZXIoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCBpbnQgb3NzX2NoYW5uZWwpOworc3RhdGljIHZvaWQgYWM5N193cml0ZV9taXhlcihzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCBvc3NfY2hhbm5lbCwgCisJCQkgICAgIHVuc2lnbmVkIGludCBsZWZ0LCB1bnNpZ25lZCBpbnQgcmlnaHQpOworc3RhdGljIHZvaWQgYWM5N19zZXRfbWl4ZXIoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgb3NzX21peGVyLCB1bnNpZ25lZCBpbnQgdmFsICk7CitzdGF0aWMgaW50IGFjOTdfcmVjbWFza19pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCBydywgaW50IG1hc2spOworc3RhdGljIGludCBhYzk3X21peGVyX2lvY3RsKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCitzdGF0aWMgaW50IGFjOTdfaW5pdF9taXhlcihzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpOworCitzdGF0aWMgaW50IHdvbGZzb25faW5pdDAzKHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpOworc3RhdGljIGludCB3b2xmc29uX2luaXQwNChzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKTsKK3N0YXRpYyBpbnQgd29sZnNvbl9pbml0MDUoc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYyk7CitzdGF0aWMgaW50IHdvbGZzb25faW5pdDExKHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpOworc3RhdGljIGludCB3b2xmc29uX2luaXQxMyhzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKTsKK3N0YXRpYyBpbnQgdHJpdGVjaF9pbml0KHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpOworc3RhdGljIGludCB0cml0ZWNoX21hZXN0cm9faW5pdChzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKTsKK3N0YXRpYyBpbnQgc2lnbWF0ZWxfOTcwOF9pbml0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyk7CitzdGF0aWMgaW50IHNpZ21hdGVsXzk3MjFfaW5pdChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpOworc3RhdGljIGludCBzaWdtYXRlbF85NzQ0X2luaXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKTsKK3N0YXRpYyBpbnQgYWQxODg2X2luaXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKTsKK3N0YXRpYyBpbnQgZWFwZF9jb250cm9sKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50KTsKK3N0YXRpYyBpbnQgY3J5c3RhbF9kaWdpdGFsX2NvbnRyb2woc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCBpbnQgc2xvdHMsIGludCByYXRlLCBpbnQgbW9kZSk7CitzdGF0aWMgaW50IGNtZWRpYV9pbml0KHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpOworc3RhdGljIGludCBjbWVkaWFfZGlnaXRhbF9jb250cm9sKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50IHNsb3RzLCBpbnQgcmF0ZSwgaW50IG1vZGUpOworc3RhdGljIGludCBnZW5lcmljX2RpZ2l0YWxfY29udHJvbChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCBzbG90cywgaW50IHJhdGUsIGludCBtb2RlKTsKKworCisvKgorICoJQUM5NyBvcGVyYXRpb25zLgorICoKKyAqCUlmIHlvdSBhcmUgYWRkaW5nIGEgY29kZWMgdGhlbiB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlCisgKgkJZWFwZF9vcHMgLSBhbnkgY29kZWMgdGhhdCBzdXBwb3J0cyBFQVBEIGFtcCBjb250cm9sIChtb3N0KQorICoJCW51bGxfb3BzIC0gYW55IGFuY2llbnQgY29kZWMgdGhhdCBzdXBwb3J0cyBub3RoaW5nCisgKgorICoJVGhlIHRocmVlIGZ1bmN0aW9ucyBhcmUKKyAqCQlpbml0IC0gdXNlZCBmb3Igbm9uIEFDOTcgc3RhbmRhcmQgaW5pdGlhbGlzYXRpb24KKyAqCQlhbXBsaWZpZXIgLSB1c2VkIHRvIGRvIGFtcGxpZmllciBjb250cm9sICgxPW9uIDA9b2ZmKQorICoJCWRpZ2l0YWwgLSBzd2l0Y2ggdG8gZGlnaXRhbCBtb2RlcyAoMCA9IGFuYWxvZykKKyAqCisgKglOb3QgYWxsIGNvZGVjcyBzdXBwb3J0IGFsbCBmZWF0dXJlcywgbm90IGFsbCBkcml2ZXJzIHVzZSBhbGwgdGhlCisgKglvcGVyYXRpb25zIHlldAorICovCisgCitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIG51bGxfb3BzID0geyBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIGRlZmF1bHRfb3BzID0geyBOVUxMLCBlYXBkX2NvbnRyb2wsIE5VTEwgfTsKK3N0YXRpYyBzdHJ1Y3QgYWM5N19vcHMgZGVmYXVsdF9kaWdpdGFsX29wcyA9IHsgTlVMTCwgZWFwZF9jb250cm9sLCBnZW5lcmljX2RpZ2l0YWxfY29udHJvbH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHdvbGZzb25fb3BzMDMgPSB7IHdvbGZzb25faW5pdDAzLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHdvbGZzb25fb3BzMDQgPSB7IHdvbGZzb25faW5pdDA0LCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHdvbGZzb25fb3BzMDUgPSB7IHdvbGZzb25faW5pdDA1LCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHdvbGZzb25fb3BzMTEgPSB7IHdvbGZzb25faW5pdDExLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHdvbGZzb25fb3BzMTMgPSB7IHdvbGZzb25faW5pdDEzLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHRyaXRlY2hfb3BzID0geyB0cml0ZWNoX2luaXQsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBzdHJ1Y3QgYWM5N19vcHMgdHJpdGVjaF9tX29wcyA9IHsgdHJpdGVjaF9tYWVzdHJvX2luaXQsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBzdHJ1Y3QgYWM5N19vcHMgc2lnbWF0ZWxfOTcwOF9vcHMgPSB7IHNpZ21hdGVsXzk3MDhfaW5pdCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIHN0cnVjdCBhYzk3X29wcyBzaWdtYXRlbF85NzIxX29wcyA9IHsgc2lnbWF0ZWxfOTcyMV9pbml0LCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHNpZ21hdGVsXzk3NDRfb3BzID0geyBzaWdtYXRlbF85NzQ0X2luaXQsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBzdHJ1Y3QgYWM5N19vcHMgY3J5c3RhbF9kaWdpdGFsX29wcyA9IHsgTlVMTCwgZWFwZF9jb250cm9sLCBjcnlzdGFsX2RpZ2l0YWxfY29udHJvbCB9Oworc3RhdGljIHN0cnVjdCBhYzk3X29wcyBhZDE4ODZfb3BzID0geyBhZDE4ODZfaW5pdCwgZWFwZF9jb250cm9sLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIGNtZWRpYV9vcHMgPSB7IE5VTEwsIGVhcGRfY29udHJvbCwgTlVMTH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIGNtZWRpYV9kaWdpdGFsX29wcyA9IHsgY21lZGlhX2luaXQsIGVhcGRfY29udHJvbCwgY21lZGlhX2RpZ2l0YWxfY29udHJvbH07CisKKy8qIHNvcnRlZCBieSB2ZW5kb3IvZGV2aWNlIGlkICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1MzIgaWQ7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgYWM5N19vcHMgKm9wczsKKwlpbnQgZmxhZ3M7Cit9IGFjOTdfY29kZWNfaWRzW10gPSB7CisJezB4NDE0NDUzMDMsICJBbmFsb2cgRGV2aWNlcyBBRDE4MTkiLAkmbnVsbF9vcHN9LAorCXsweDQxNDQ1MzQwLCAiQW5hbG9nIERldmljZXMgQUQxODgxIiwJJm51bGxfb3BzfSwKKwl7MHg0MTQ0NTM0OCwgIkFuYWxvZyBEZXZpY2VzIEFEMTg4MUEiLAkmbnVsbF9vcHN9LAorCXsweDQxNDQ1MzYwLCAiQW5hbG9nIERldmljZXMgQUQxODg1IiwJJmRlZmF1bHRfb3BzfSwKKwl7MHg0MTQ0NTM2MSwgIkFuYWxvZyBEZXZpY2VzIEFEMTg4NiIsCSZhZDE4ODZfb3BzfSwKKwl7MHg0MTQ0NTM3MCwgIkFuYWxvZyBEZXZpY2VzIEFEMTk4MSIsCSZudWxsX29wc30sCisJezB4NDE0NDUzNzIsICJBbmFsb2cgRGV2aWNlcyBBRDE5ODFBIiwJJm51bGxfb3BzfSwKKwl7MHg0MTQ0NTM3NCwgIkFuYWxvZyBEZXZpY2VzIEFEMTk4MUIiLAkmbnVsbF9vcHN9LAorCXsweDQxNDQ1NDYwLCAiQW5hbG9nIERldmljZXMgQUQxODg1IiwJJmRlZmF1bHRfb3BzfSwKKwl7MHg0MTQ0NTQ2MSwgIkFuYWxvZyBEZXZpY2VzIEFEMTg4NiIsCSZhZDE4ODZfb3BzfSwKKwl7MHg0MTRCNEQwMCwgIkFzYWhpIEthc2VpIEFLNDU0MCIsCSZudWxsX29wc30sCisJezB4NDE0QjREMDEsICJBc2FoaSBLYXNlaSBBSzQ1NDIiLAkmbnVsbF9vcHN9LAorCXsweDQxNEI0RDAyLCAiQXNhaGkgS2FzZWkgQUs0NTQzIiwJJm51bGxfb3BzfSwKKwl7MHg0MTRDNDMyNiwgIkFMQzEwMFAiLAkJCSZudWxsX29wc30sCisJezB4NDE0QzQ3MTAsICJBTEMyMDAvMjAwUCIsCQkmbnVsbF9vcHN9LAorCXsweDQxNEM0NzIwLCAiQUxDNjUwIiwJCQkmZGVmYXVsdF9kaWdpdGFsX29wc30sCisJezB4NDM0RDQ5NDEsICJDTWVkaWEiLAkJCSZjbWVkaWFfb3BzLAkJQUM5N19OT19QQ01fVk9MVU1FIH0sCisJezB4NDM0RDQ5NDIsICJDTWVkaWEiLAkJCSZjbWVkaWFfb3BzLAkJQUM5N19OT19QQ01fVk9MVU1FIH0sCisJezB4NDM0RDQ5NjEsICJDTWVkaWEiLAkJCSZjbWVkaWFfZGlnaXRhbF9vcHMsCUFDOTdfTk9fUENNX1ZPTFVNRSB9LAorCXsweDQzNTI1OTAwLCAiQ2lycnVzIExvZ2ljIENTNDI5NyIsCSZkZWZhdWx0X29wc30sCisJezB4NDM1MjU5MDMsICJDaXJydXMgTG9naWMgQ1M0Mjk3IiwJJmRlZmF1bHRfb3BzfSwKKwl7MHg0MzUyNTkxMywgIkNpcnJ1cyBMb2dpYyBDUzQyOTdBIHJldiBBIiwgJmRlZmF1bHRfb3BzfSwKKwl7MHg0MzUyNTkxNCwgIkNpcnJ1cyBMb2dpYyBDUzQyOTdBIHJldiBCIiwgJmRlZmF1bHRfb3BzfSwKKwl7MHg0MzUyNTkyMywgIkNpcnJ1cyBMb2dpYyBDUzQyOTgiLAkmbnVsbF9vcHN9LAorCXsweDQzNTI1OTJCLCAiQ2lycnVzIExvZ2ljIENTNDI5NCIsCSZudWxsX29wc30sCisJezB4NDM1MjU5MkQsICJDaXJydXMgTG9naWMgQ1M0Mjk0IiwJJm51bGxfb3BzfSwKKwl7MHg0MzUyNTkzMSwgIkNpcnJ1cyBMb2dpYyBDUzQyOTkgcmV2IEEiLCAmY3J5c3RhbF9kaWdpdGFsX29wc30sCisJezB4NDM1MjU5MzMsICJDaXJydXMgTG9naWMgQ1M0Mjk5IHJldiBDIiwgJmNyeXN0YWxfZGlnaXRhbF9vcHN9LAorCXsweDQzNTI1OTM0LCAiQ2lycnVzIExvZ2ljIENTNDI5OSByZXYgRCIsICZjcnlzdGFsX2RpZ2l0YWxfb3BzfSwKKwl7MHg0MzU4NTQ0MiwgIkNYVDY2IiwJCQkmZGVmYXVsdF9vcHMsCQlBQzk3X0RFTFVERURfTU9ERU0gfSwKKwl7MHg0NDU0MzAzMSwgIkRpYW1vbmQgVGVjaG5vbG9neSBEVDA4OTMiLCAmZGVmYXVsdF9vcHN9LAorCXsweDQ1ODM4MzA4LCAiRVNTIEFsbGVncm8gRVMxOTg4IiwJJm51bGxfb3BzfSwKKwl7MHg0OTQzNDUxMSwgIklDRTEyMzIiLAkJCSZudWxsX29wc30sIC8qIEkgaG9wZSAtLWprICovCisJezB4NGU1MzQzMzEsICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNDU0OSIsICZudWxsX29wc30sCisJezB4NTM0OTRjMjIsICJTaWxpY29uIExhYm9yYXRvcnkgU2kzMDM2IiwgJm51bGxfb3BzfSwKKwl7MHg1MzQ5NGMyMywgIlNpbGljb24gTGFib3JhdG9yeSBTaTMwMzgiLCAmbnVsbF9vcHN9LAorCXsweDU0NTIwMEZGLCAiVHJpVGVjaCBUUj8/Pz8/IiwJCSZ0cml0ZWNoX21fb3BzfSwKKwl7MHg1NDUyNDEwMiwgIlRyaVRlY2ggVFIyODAyMiIsCQkmbnVsbF9vcHN9LAorCXsweDU0NTI0MTAzLCAiVHJpVGVjaCBUUjI4MDIzIiwJCSZudWxsX29wc30sCisJezB4NTQ1MjQxMDYsICJUcmlUZWNoIFRSMjgwMjYiLAkJJm51bGxfb3BzfSwKKwl7MHg1NDUyNDEwOCwgIlRyaVRlY2ggVFIyODAyOCIsCQkmdHJpdGVjaF9vcHN9LAorCXsweDU0NTI0MTIzLCAiVHJpVGVjaCBUUiBBNSIsCQkmbnVsbF9vcHN9LAorCXsweDU3NEQ0QzAzLCAiV29sZnNvbiBXTTk3MDMvMDcvMDgvMTciLAkmd29sZnNvbl9vcHMwM30sCisJezB4NTc0RDRDMDQsICJXb2xmc29uIFdNOTcwNE0vV005NzA0USIsCSZ3b2xmc29uX29wczA0fSwKKwl7MHg1NzRENEMwNSwgIldvbGZzb24gV005NzA1L1dNOTcxMCIsICAgJndvbGZzb25fb3BzMDV9LAorCXsweDU3NEQ0QzA5LCAiV29sZnNvbiBXTTk3MDkiLAkJJm51bGxfb3BzfSwKKwl7MHg1NzRENEMxMiwgIldvbGZzb24gV005NzExLzk3MTIiLAkmd29sZnNvbl9vcHMxMX0sCisJezB4NTc0RDRDMTMsICJXb2xmc29uIFdNOTcxMyIsCSZ3b2xmc29uX29wczEzLCBBQzk3X0RFRkFVTFRfUE9XRVJfT0ZGfSwKKwl7MHg4Mzg0NzYwMCwgIlNpZ21hVGVsIFNUQUM/Pz8/IiwJJm51bGxfb3BzfSwKKwl7MHg4Mzg0NzYwNCwgIlNpZ21hVGVsIFNUQUM5NzAxLzMvNC81IiwgJm51bGxfb3BzfSwKKwl7MHg4Mzg0NzYwNSwgIlNpZ21hVGVsIFNUQUM5NzA0IiwJJm51bGxfb3BzfSwKKwl7MHg4Mzg0NzYwOCwgIlNpZ21hVGVsIFNUQUM5NzA4IiwJJnNpZ21hdGVsXzk3MDhfb3BzfSwKKwl7MHg4Mzg0NzYwOSwgIlNpZ21hVGVsIFNUQUM5NzIxLzIzIiwJJnNpZ21hdGVsXzk3MjFfb3BzfSwKKwl7MHg4Mzg0NzY0NCwgIlNpZ21hVGVsIFNUQUM5NzQ0LzQ1IiwJJnNpZ21hdGVsXzk3NDRfb3BzfSwKKwl7MHg4Mzg0NzY1MiwgIlNpZ21hVGVsIFNUQUM5NzUyLzUzIiwJJmRlZmF1bHRfb3BzfSwKKwl7MHg4Mzg0NzY1NiwgIlNpZ21hVGVsIFNUQUM5NzU2LzU3IiwJJnNpZ21hdGVsXzk3NDRfb3BzfSwKKwl7MHg4Mzg0NzY2NiwgIlNpZ21hVGVsIFNUQUM5NzUwVCIsCSZzaWdtYXRlbF85NzQ0X29wc30sCisJezB4ODM4NDc2ODQsICJTaWdtYVRlbCBTVEFDOTc4My84ND8iLAkmbnVsbF9vcHN9LAorCXsweDU3NDU0MzAxLCAiV2luYm9uZCA4Mzk3MUQiLAkJJm51bGxfb3BzfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphYzk3X3N0ZXJlb19lbmhhbmNlbWVudHNbXSA9Cit7CisJLyogICAwICovICJObyAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorCS8qICAgMSAqLyAiQW5hbG9nIERldmljZXMgUGhhdCBTdGVyZW8iLAorCS8qICAgMiAqLyAiQ3JlYXRpdmUgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgIDMgKi8gIk5hdGlvbmFsIFNlbWkgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgIDQgKi8gIllBTUFIQSBZbWVyc2lvbiIsCisJLyogICA1ICovICJCQkUgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgIDYgKi8gIkNyeXN0YWwgU2VtaSAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorCS8qICAgNyAqLyAiUXNvdW5kIFFYcGFuZGVyIiwKKwkvKiAgIDggKi8gIlNwYXRpYWxpemVyIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisJLyogICA5ICovICJTUlMgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMTAgKi8gIlBsYXRmb3JtIFRlY2ggM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMTEgKi8gIkFLTSAzRCBBdWRpbyIsCisJLyogIDEyICovICJBdXJlYWwgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMTMgKi8gIkF6dGVjaCAzRCBFbmhhbmNlbWVudCIsCisJLyogIDE0ICovICJCaW5hdXJhIDNEIEF1ZGlvIEVuaGFuY2VtZW50IiwKKwkvKiAgMTUgKi8gIkVTUyBUZWNobm9sb2d5IFN0ZXJlbyBFbmhhbmNlbWVudCIsCisJLyogIDE2ICovICJIYXJtYW4gSW50ZXJuYXRpb25hbCBWTUF4IiwKKwkvKiAgMTcgKi8gIk52aWRlYSAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorCS8qICAxOCAqLyAiUGhpbGlwcyBJbmNyZWRpYmxlIFNvdW5kIiwKKwkvKiAgMTkgKi8gIlRleGFzIEluc3RydW1lbnRzIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisJLyogIDIwICovICJWTFNJIFRlY2hub2xvZ3kgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMjEgKi8gIlRyaVRlY2ggM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMjIgKi8gIlJlYWx0ZWsgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMjMgKi8gIlNhbXN1bmcgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMjQgKi8gIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyAzRCBFbmhhbmNlbWVudCIsCisJLyogIDI1ICovICJEZWx0YSBJbnRlZ3JhdGlvbiAzRCBFbmhhbmNlbWVudCIsCisJLyogIDI2ICovICJTaWdtYVRlbCAzRCBFbmhhbmNlbWVudCIsCisJLyogIDI3ICovICJXaW5ib25kIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisJLyogIDI4ICovICJSb2Nrd2VsbCAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorCS8qICAyOSAqLyAiUmVzZXJ2ZWQgMjkiLAorCS8qICAzMCAqLyAiUmVzZXJ2ZWQgMzAiLAorCS8qICAzMSAqLyAiUmVzZXJ2ZWQgMzEiCit9OworCisvKiB0aGlzIHRhYmxlIGhhcyBkZWZhdWx0IG1peGVyIHZhbHVlcyBmb3IgYWxsIE9TUyBtaXhlcnMuICovCitzdGF0aWMgc3RydWN0IG1peGVyX2RlZmF1bHRzIHsKKwlpbnQgbWl4ZXI7CisJdW5zaWduZWQgaW50IHZhbHVlOworfSBtaXhlcl9kZWZhdWx0c1tTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCS8qIGFsbCB2YWx1ZXMgMCAtPiAxMDAgaW4gYnl0ZXMgKi8KKwl7U09VTkRfTUlYRVJfVk9MVU1FLAkweDQzNDN9LAorCXtTT1VORF9NSVhFUl9CQVNTLAkweDQzNDN9LAorCXtTT1VORF9NSVhFUl9UUkVCTEUsCTB4NDM0M30sCisJe1NPVU5EX01JWEVSX1BDTSwJMHg0MzQzfSwKKwl7U09VTkRfTUlYRVJfU1BFQUtFUiwJMHg0MzQzfSwKKwl7U09VTkRfTUlYRVJfTElORSwJMHg0MzQzfSwKKwl7U09VTkRfTUlYRVJfTUlDLAkweDAwMDB9LAorCXtTT1VORF9NSVhFUl9DRCwJMHg0MzQzfSwKKwl7U09VTkRfTUlYRVJfQUxUUENNLAkweDQzNDN9LAorCXtTT1VORF9NSVhFUl9JR0FJTiwJMHg0MzQzfSwKKwl7U09VTkRfTUlYRVJfTElORTEsCTB4NDM0M30sCisJe1NPVU5EX01JWEVSX1BIT05FSU4sCTB4NDM0M30sCisJe1NPVU5EX01JWEVSX1BIT05FT1VULAkweDQzNDN9LAorCXtTT1VORF9NSVhFUl9WSURFTywJMHg0MzQzfSwKKwl7LTEsMH0KK307CisKKy8qIHRhYmxlIHRvIHNjYWxlIHNjYWxlIGZyb20gT1NTIG1peGVyIHZhbHVlIHRvIEFDOTcgbWl4ZXIgcmVnaXN0ZXIgdmFsdWUgKi8JCitzdGF0aWMgc3RydWN0IGFjOTdfbWl4ZXJfaHcgeworCXVuc2lnbmVkIGNoYXIgb2Zmc2V0OworCWludCBzY2FsZTsKK30gYWM5N19od1tTT1VORF9NSVhFUl9OUkRFVklDRVNdPSB7CisJW1NPVU5EX01JWEVSX1ZPTFVNRV0JPQl7QUM5N19NQVNURVJfVk9MX1NURVJFTyw2NH0sCisJW1NPVU5EX01JWEVSX0JBU1NdCT0Je0FDOTdfTUFTVEVSX1RPTkUsCTE2fSwKKwlbU09VTkRfTUlYRVJfVFJFQkxFXQk9CXtBQzk3X01BU1RFUl9UT05FLAkxNn0sCisJW1NPVU5EX01JWEVSX1BDTV0JPQl7QUM5N19QQ01PVVRfVk9MLAkzMn0sCisJW1NPVU5EX01JWEVSX1NQRUFLRVJdCT0Je0FDOTdfUENCRUVQX1ZPTCwJMTZ9LAorCVtTT1VORF9NSVhFUl9MSU5FXQk9CXtBQzk3X0xJTkVJTl9WT0wsCTMyfSwKKwlbU09VTkRfTUlYRVJfTUlDXQk9CXtBQzk3X01JQ19WT0wsCQkzMn0sCisJW1NPVU5EX01JWEVSX0NEXQk9CXtBQzk3X0NEX1ZPTCwJCTMyfSwKKwlbU09VTkRfTUlYRVJfQUxUUENNXQk9CXtBQzk3X0hFQURQSE9ORV9WT0wsCTY0fSwKKwlbU09VTkRfTUlYRVJfSUdBSU5dCT0Je0FDOTdfUkVDT1JEX0dBSU4sCTE2fSwKKwlbU09VTkRfTUlYRVJfTElORTFdCT0Je0FDOTdfQVVYX1ZPTCwJCTMyfSwKKwlbU09VTkRfTUlYRVJfUEhPTkVJTl0JPSAJe0FDOTdfUEhPTkVfVk9MLAkzMn0sCisJW1NPVU5EX01JWEVSX1BIT05FT1VUXQk9IAl7QUM5N19NQVNURVJfVk9MX01PTk8sCTY0fSwKKwlbU09VTkRfTUlYRVJfVklERU9dCT0Je0FDOTdfVklERU9fVk9MLAkzMn0sCit9OworCisvKiB0aGUgZm9sbG93aW5nIHRhYmxlcyBhbGxvdyB1cyB0byBnbyBmcm9tIE9TUyA8LT4gYWM5NyBxdWlja2x5LiAqLworZW51bSBhYzk3X3JlY3NldHRpbmdzIHsKKwlBQzk3X1JFQ19NSUM9MCwKKwlBQzk3X1JFQ19DRCwKKwlBQzk3X1JFQ19WSURFTywKKwlBQzk3X1JFQ19BVVgsCisJQUM5N19SRUNfTElORSwKKwlBQzk3X1JFQ19TVEVSRU8sIC8qIGNvbWJpbmF0aW9uIG9mIGFsbCBlbmFibGVkIG91dHB1dHMuLiAgKi8KKwlBQzk3X1JFQ19NT05PLAkgICAgICAvKi4uIG9yIHRoZSBtb25vIGVxdWl2YWxlbnQgKi8KKwlBQzk3X1JFQ19QSE9ORQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhYzk3X3JtMm9zc1tdID0geworCVtBQzk3X1JFQ19NSUNdIAkgPSBTT1VORF9NSVhFUl9NSUMsCisJW0FDOTdfUkVDX0NEXSAJID0gU09VTkRfTUlYRVJfQ0QsCisJW0FDOTdfUkVDX1ZJREVPXSA9IFNPVU5EX01JWEVSX1ZJREVPLAorCVtBQzk3X1JFQ19BVVhdIAkgPSBTT1VORF9NSVhFUl9MSU5FMSwKKwlbQUM5N19SRUNfTElORV0gID0gU09VTkRfTUlYRVJfTElORSwKKwlbQUM5N19SRUNfU1RFUkVPXT0gU09VTkRfTUlYRVJfSUdBSU4sCisJW0FDOTdfUkVDX1BIT05FXSA9IFNPVU5EX01JWEVSX1BIT05FSU4KK307CisKKy8qIGluZGV4ZWQgYnkgYml0IHBvc2l0aW9uICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFjOTdfb3NzX3JtW10gPSB7CisJW1NPVU5EX01JWEVSX01JQ10gCT0gQUM5N19SRUNfTUlDLAorCVtTT1VORF9NSVhFUl9DRF0gCT0gQUM5N19SRUNfQ0QsCisJW1NPVU5EX01JWEVSX1ZJREVPXSAJPSBBQzk3X1JFQ19WSURFTywKKwlbU09VTkRfTUlYRVJfTElORTFdIAk9IEFDOTdfUkVDX0FVWCwKKwlbU09VTkRfTUlYRVJfTElORV0gCT0gQUM5N19SRUNfTElORSwKKwlbU09VTkRfTUlYRVJfSUdBSU5dCT0gQUM5N19SRUNfU1RFUkVPLAorCVtTT1VORF9NSVhFUl9QSE9ORUlOXSAJPSBBQzk3X1JFQ19QSE9ORQorfTsKKworc3RhdGljIExJU1RfSEVBRChjb2RlY3MpOworc3RhdGljIExJU1RfSEVBRChjb2RlY19kcml2ZXJzKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGNvZGVjX3NlbSk7CisKKy8qIHJlYWRzIHRoZSBnaXZlbiBPU1MgbWl4ZXIgZnJvbSB0aGUgYWM5NyB0aGUgY2FsbGVyIG11c3QgaGF2ZSBpbnN1cmVkIHRoYXQgdGhlIGFjOTcga25vd3MKKyAgIGFib3V0IHRoYXQgZ2l2ZW4gbWl4ZXIsIGFuZCBzaG91bGQgYmUgaG9sZGluZyBhIHNwaW5sb2NrIGZvciB0aGUgY2FyZCAqLworc3RhdGljIGludCBhYzk3X3JlYWRfbWl4ZXIoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCBpbnQgb3NzX2NoYW5uZWwpIAoreworCXUxNiB2YWw7CisJaW50IHJldCA9IDA7CisJaW50IHNjYWxlOworCXN0cnVjdCBhYzk3X21peGVyX2h3ICptaCA9ICZhYzk3X2h3W29zc19jaGFubmVsXTsKKworCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjICwgbWgtPm9mZnNldCk7CisKKwlpZiAodmFsICYgQUM5N19NVVRFKSB7CisJCXJldCA9IDA7CisJfSBlbHNlIGlmIChBQzk3X1NURVJFT19NQVNLICYgKDEgPDwgb3NzX2NoYW5uZWwpKSB7CisJCS8qIG5pY2Ugc3RlcmVvIG1peGVycyAuLiAqLworCQlpbnQgbGVmdCxyaWdodDsKKworCQlsZWZ0ID0gKHZhbCA+PiA4KSAgJiAweDdmOworCQlyaWdodCA9IHZhbCAgJiAweDdmOworCisJCWlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9JR0FJTikgeworCQkJcmlnaHQgPSAocmlnaHQgKiAxMDApIC8gbWgtPnNjYWxlOworCQkJbGVmdCA9IChsZWZ0ICogMTAwKSAvIG1oLT5zY2FsZTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoZXNlIG1heSBoYXZlIDUgb3IgNiBiaXQgcmVzb2x1dGlvbiAqLworCQkJaWYob3NzX2NoYW5uZWwgPT0gU09VTkRfTUlYRVJfVk9MVU1FIHx8IG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX0FMVFBDTSkKKwkJCQlzY2FsZSA9ICgxIDw8IGNvZGVjLT5iaXRfcmVzb2x1dGlvbik7CisJCQllbHNlCisJCQkJc2NhbGUgPSBtaC0+c2NhbGU7CisKKwkJCXJpZ2h0ID0gMTAwIC0gKChyaWdodCAqIDEwMCkgLyBzY2FsZSk7CisJCQlsZWZ0ID0gMTAwIC0gKChsZWZ0ICogMTAwKSAvIHNjYWxlKTsKKwkJfQorCQlyZXQgPSBsZWZ0IHwgKHJpZ2h0IDw8IDgpOworCX0gZWxzZSBpZiAob3NzX2NoYW5uZWwgPT0gU09VTkRfTUlYRVJfU1BFQUtFUikgeworCQlyZXQgPSAxMDAgLSAoKCgodmFsICYgMHgxZSk+PjEpICogMTAwKSAvIG1oLT5zY2FsZSk7CisJfSBlbHNlIGlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9QSE9ORUlOKSB7CisJCXJldCA9IDEwMCAtICgoKHZhbCAmIDB4MWYpICogMTAwKSAvIG1oLT5zY2FsZSk7CisJfSBlbHNlIGlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9QSE9ORU9VVCkgeworCQlzY2FsZSA9ICgxIDw8IGNvZGVjLT5iaXRfcmVzb2x1dGlvbik7CisJCXJldCA9IDEwMCAtICgoKHZhbCAmIDB4MWYpICogMTAwKSAvIHNjYWxlKTsKKwl9IGVsc2UgaWYgKG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX01JQykgeworCQlyZXQgPSAxMDAgLSAoKCh2YWwgJiAweDFmKSAqIDEwMCkgLyBtaC0+c2NhbGUpOworCQkvKiAgdGhlIGxvdyBiaXQgaXMgb3B0aW9uYWwgaW4gdGhlIHRvbmUgc2xpZGVycyBhbmQgbWFza2luZworCQkgICAgaXQgbGV0cyB1cyBhdm9pZCB0aGUgMHhmICdieXBhc3MnLi4gKi8KKwl9IGVsc2UgaWYgKG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX0JBU1MpIHsKKwkJcmV0ID0gMTAwIC0gKCgoKHZhbCA+PiA4KSAmIDB4ZSkgKiAxMDApIC8gbWgtPnNjYWxlKTsKKwl9IGVsc2UgaWYgKG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX1RSRUJMRSkgeworCQlyZXQgPSAxMDAgLSAoKCh2YWwgJiAweGUpICogMTAwKSAvIG1oLT5zY2FsZSk7CisJfQorCisjaWZkZWYgREVCVUcKKwlwcmludGsoImFjOTdfY29kZWM6IHJlYWQgT1NTIG1peGVyICUyZCAoJXMgYWM5NyByZWdpc3RlciAweCUwMngpLCAiCisJICAgICAgICIweCUwNHggLT4gMHglMDR4XG4iLAorCSAgICAgICBvc3NfY2hhbm5lbCwgY29kZWMtPmlkID8gIlNlY29uZGFyeSIgOiAiUHJpbWFyeSIsCisJICAgICAgIG1oLT5vZmZzZXQsIHZhbCwgcmV0KTsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworLyogd3JpdGUgdGhlIE9TUyBlbmNvZGVkIHZvbHVtZSB0byB0aGUgZ2l2ZW4gT1NTIGVuY29kZWQgbWl4ZXIsIGFnYWluIGNhbGxlcidzIGpvYiB0bworICAgbWFrZSBzdXJlIGFsbCBpcyB3ZWxsIGluIGFyZyBsYW5kLCBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgYWM5N193cml0ZV9taXhlcihzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCBvc3NfY2hhbm5lbCwKKwkJICAgICAgdW5zaWduZWQgaW50IGxlZnQsIHVuc2lnbmVkIGludCByaWdodCkKK3sKKwl1MTYgdmFsID0gMDsKKwlpbnQgc2NhbGU7CisJc3RydWN0IGFjOTdfbWl4ZXJfaHcgKm1oID0gJmFjOTdfaHdbb3NzX2NoYW5uZWxdOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImFjOTdfY29kZWM6IHdyb3RlIE9TUyBtaXhlciAlMmQgKCVzIGFjOTcgcmVnaXN0ZXIgMHglMDJ4KSwgIgorCSAgICAgICAibGVmdCB2b2w6JTJkLCByaWdodCB2b2w6JTJkOiIsCisJICAgICAgIG9zc19jaGFubmVsLCBjb2RlYy0+aWQgPyAiU2Vjb25kYXJ5IiA6ICJQcmltYXJ5IiwKKwkgICAgICAgbWgtPm9mZnNldCwgbGVmdCwgcmlnaHQpOworI2VuZGlmCisKKwlpZiAoQUM5N19TVEVSRU9fTUFTSyAmICgxIDw8IG9zc19jaGFubmVsKSkgeworCQkvKiBzdGVyZW8gbWl4ZXJzICovCisJCWlmIChsZWZ0ID09IDAgJiYgcmlnaHQgPT0gMCkgeworCQkJdmFsID0gQUM5N19NVVRFOworCQl9IGVsc2UgeworCQkJaWYgKG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX0lHQUlOKSB7CisJCQkJcmlnaHQgPSAocmlnaHQgKiBtaC0+c2NhbGUpIC8gMTAwOworCQkJCWxlZnQgPSAobGVmdCAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCQkJaWYgKHJpZ2h0ID49IG1oLT5zY2FsZSkKKwkJCQkJcmlnaHQgPSBtaC0+c2NhbGUtMTsKKwkJCQlpZiAobGVmdCA+PSBtaC0+c2NhbGUpCisJCQkJCWxlZnQgPSBtaC0+c2NhbGUtMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogdGhlc2UgbWF5IGhhdmUgNSBvciA2IGJpdCByZXNvbHV0aW9uICovCisJCQkJaWYgKG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX1ZPTFVNRSB8fAorCQkJCSAgICBvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9BTFRQQ00pCisJCQkJCXNjYWxlID0gKDEgPDwgY29kZWMtPmJpdF9yZXNvbHV0aW9uKTsKKwkJCQllbHNlCisJCQkJCXNjYWxlID0gbWgtPnNjYWxlOworCisJCQkJcmlnaHQgPSAoKDEwMCAtIHJpZ2h0KSAqIHNjYWxlKSAvIDEwMDsKKwkJCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIHNjYWxlKSAvIDEwMDsKKwkJCQlpZiAocmlnaHQgPj0gc2NhbGUpCisJCQkJCXJpZ2h0ID0gc2NhbGUtMTsKKwkJCQlpZiAobGVmdCA+PSBzY2FsZSkKKwkJCQkJbGVmdCA9IHNjYWxlLTE7CisJCQl9CisJCQl2YWwgPSAobGVmdCA8PCA4KSB8IHJpZ2h0OworCQl9CisJfSBlbHNlIGlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9CQVNTKSB7CisJCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjICwgbWgtPm9mZnNldCkgJiB+MHgwZjAwOworCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCWlmIChsZWZ0ID49IG1oLT5zY2FsZSkKKwkJCWxlZnQgPSBtaC0+c2NhbGUtMTsKKwkJdmFsIHw9IChsZWZ0IDw8IDgpICYgMHgwZTAwOworCX0gZWxzZSBpZiAob3NzX2NoYW5uZWwgPT0gU09VTkRfTUlYRVJfVFJFQkxFKSB7CisJCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjICwgbWgtPm9mZnNldCkgJiB+MHgwMDBmOworCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCWlmIChsZWZ0ID49IG1oLT5zY2FsZSkKKwkJCWxlZnQgPSBtaC0+c2NhbGUtMTsKKwkJdmFsIHw9IGxlZnQgJiAweDAwMGU7CisJfSBlbHNlIGlmKGxlZnQgPT0gMCkgeworCQl2YWwgPSBBQzk3X01VVEU7CisJfSBlbHNlIGlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9TUEVBS0VSKSB7CisJCWxlZnQgPSAoKDEwMCAtIGxlZnQpICogbWgtPnNjYWxlKSAvIDEwMDsKKwkJaWYgKGxlZnQgPj0gbWgtPnNjYWxlKQorCQkJbGVmdCA9IG1oLT5zY2FsZS0xOworCQl2YWwgPSBsZWZ0IDw8IDE7CisJfSBlbHNlIGlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9QSE9ORUlOKSB7CisJCWxlZnQgPSAoKDEwMCAtIGxlZnQpICogbWgtPnNjYWxlKSAvIDEwMDsKKwkJaWYgKGxlZnQgPj0gbWgtPnNjYWxlKQorCQkJbGVmdCA9IG1oLT5zY2FsZS0xOworCQl2YWwgPSBsZWZ0OworCX0gZWxzZSBpZiAob3NzX2NoYW5uZWwgPT0gU09VTkRfTUlYRVJfUEhPTkVPVVQpIHsKKwkJc2NhbGUgPSAoMSA8PCBjb2RlYy0+Yml0X3Jlc29sdXRpb24pOworCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIHNjYWxlKSAvIDEwMDsKKwkJaWYgKGxlZnQgPj0gbWgtPnNjYWxlKQorCQkJbGVmdCA9IG1oLT5zY2FsZS0xOworCQl2YWwgPSBsZWZ0OworCX0gZWxzZSBpZiAob3NzX2NoYW5uZWwgPT0gU09VTkRfTUlYRVJfTUlDKSB7CisJCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjICwgbWgtPm9mZnNldCkgJiB+MHg4MDFmOworCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCWlmIChsZWZ0ID49IG1oLT5zY2FsZSkKKwkJCWxlZnQgPSBtaC0+c2NhbGUtMTsKKwkJdmFsIHw9IGxlZnQ7CisJCS8qICB0aGUgbG93IGJpdCBpcyBvcHRpb25hbCBpbiB0aGUgdG9uZSBzbGlkZXJzIGFuZCBtYXNraW5nCisJCSAgICBpdCBsZXRzIHVzIGF2b2lkIHRoZSAweGYgJ2J5cGFzcycuLiAqLworCX0KKyNpZmRlZiBERUJVRworCXByaW50aygiIDB4JTA0eCIsIHZhbCk7CisjZW5kaWYKKworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgbWgtPm9mZnNldCwgdmFsKTsKKworI2lmZGVmIERFQlVHCisJdmFsID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIG1oLT5vZmZzZXQpOworCXByaW50aygiIC0+IDB4JTA0eFxuIiwgdmFsKTsKKyNlbmRpZgorfQorCisvKiBhIHRoaW4gd3JhcHBlciBmb3Igd3JpdGVfbWl4ZXIgKi8KK3N0YXRpYyB2b2lkIGFjOTdfc2V0X21peGVyKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IG9zc19taXhlciwgdW5zaWduZWQgaW50IHZhbCApIAoreworCXVuc2lnbmVkIGludCBsZWZ0LHJpZ2h0OworCisJLyogY2xlYW5zZSBpbnB1dCBhIGxpdHRsZSAqLworCXJpZ2h0ID0gKCh2YWwgPj4gOCkgICYgMHhmZikgOworCWxlZnQgPSAodmFsICAmIDB4ZmYpIDsKKworCWlmIChyaWdodCA+IDEwMCkgcmlnaHQgPSAxMDA7CisJaWYgKGxlZnQgPiAxMDApIGxlZnQgPSAxMDA7CisKKwljb2RlYy0+bWl4ZXJfc3RhdGVbb3NzX21peGVyXSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7CisJY29kZWMtPndyaXRlX21peGVyKGNvZGVjLCBvc3NfbWl4ZXIsIGxlZnQsIHJpZ2h0KTsKK30KKworLyogcmVhZCBvciB3cml0ZSB0aGUgcmVjbWFzaywgdGhlIGFjOTcgY2FuIHJlYWxseSBoYXZlIGxlZnQgYW5kIHJpZ2h0IHJlY29yZGluZworICAgaW5wdXRzIGluZGVwZW5kYW50bHkgc2V0LCBidXQgT1NTIGRvZXNuJ3Qgc2VlbSB0byB3YW50IHVzIHRvIGV4cHJlc3MgdGhhdCB0bworICAgdGhlIHVzZXIuIHRoZSBjYWxsZXIgZ3VhcmFudGVlcyB0aGF0IHdlIGhhdmUgYSBzdXBwb3J0ZWQgYml0IHNldCwgYW5kIHRoZXkKKyAgIG11c3QgYmUgaG9sZGluZyB0aGUgY2FyZCdzIHNwaW5sb2NrICovCitzdGF0aWMgaW50IGFjOTdfcmVjbWFza19pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCBydywgaW50IG1hc2spIAoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAocncpIHsKKwkJLyogcmVhZCBpdCBmcm9tIHRoZSBjYXJkICovCisJCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1JFQ09SRF9TRUxFQ1QpOworI2lmZGVmIERFQlVHCisJCXByaW50aygiYWM5N19jb2RlYzogYWM5NyByZWNtYXNrIHRvIHNldCB0byAweCUwNHhcbiIsIHZhbCk7CisjZW5kaWYKKwkJcmV0dXJuICgxIDw8IGFjOTdfcm0yb3NzW3ZhbCAmIDB4MDddKTsKKwl9CisKKwkvKiBlbHNlLCB3cml0ZSB0aGUgZmlyc3Qgc2V0IGluIHRoZSBtYXNrIGFzIHRoZQorCSAgIG91dHB1dCAqLwkKKwkvKiBjbGVhciBvdXQgY3VycmVudCBzZXQgdmFsdWUgZmlyc3QgKEFDOTcgc3VwcG9ydHMgb25seSAxIGlucHV0ISkgKi8KKwl2YWwgPSAoMSA8PCBhYzk3X3JtMm9zc1tjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19SRUNPUkRfU0VMRUNUKSAmIDB4MDddKTsKKwlpZiAobWFzayAhPSB2YWwpCisJICAgIG1hc2sgJj0gfnZhbDsKKyAgICAgICAKKwl2YWwgPSBmZnMobWFzayk7IAorCXZhbCA9IGFjOTdfb3NzX3JtW3ZhbC0xXTsKKwl2YWwgfD0gdmFsIDw8IDg7ICAvKiBzZXQgYm90aCBjaGFubmVscyAqLworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImFjOTdfY29kZWM6IHNldHRpbmcgYWM5NyByZWNtYXNrIHRvIDB4JTA0eFxuIiwgdmFsKTsKKyNlbmRpZgorCisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1JFQ09SRF9TRUxFQ1QsIHZhbCk7CisKKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyBpbnQgYWM5N19taXhlcl9pb2N0bChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBpLCB2YWwgPSAwOworCisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCW1peGVyX2luZm8gaW5mbzsKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQlzdHJsY3B5KGluZm8uaWQsIGNvZGVjLT5uYW1lLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgY29kZWMtPm5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaW5mby5tb2RpZnlfY291bnRlciA9IGNvZGVjLT5tb2RjbnQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9PTERfTUlYRVJfSU5GTykgeworCQlfb2xkX21peGVyX2luZm8gaW5mbzsKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQlzdHJsY3B5KGluZm8uaWQsIGNvZGVjLT5uYW1lLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgY29kZWMtPm5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCWlmIChfSU9DX1RZUEUoY21kKSAhPSAnTScgfHwgX1NJT0NfU0laRShjbWQpICE9IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjbWQgPT0gT1NTX0dFVFZFUlNJT04pCisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCAoaW50IF9fdXNlciAqKWFyZyk7CisKKwlpZiAoX1NJT0NfRElSKGNtZCkgPT0gX1NJT0NfUkVBRCkgeworCQlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzogLyogZ2l2ZSB0aGVtIHRoZSBjdXJyZW50IHJlY29yZCBzb3VyY2UgKi8KKwkJCWlmICghY29kZWMtPnJlY21hc2tfaW8pIHsKKwkJCQl2YWwgPSAwOworCQkJfSBlbHNlIHsKKwkJCQl2YWwgPSBjb2RlYy0+cmVjbWFza19pbyhjb2RlYywgMSwgMCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6IC8qIGdpdmUgdGhlbSB0aGUgc3VwcG9ydGVkIG1peGVycyAqLworCQkJdmFsID0gY29kZWMtPnN1cHBvcnRlZF9taXhlcnM7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJdmFsID0gY29kZWMtPnJlY29yZF9zb3VyY2VzOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOiAvKiBNaXhlciBjaGFubmVscyBzdXBwb3J0aW5nIHN0ZXJlbyAqLworCQkJdmFsID0gY29kZWMtPnN0ZXJlb19taXhlcnM7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQl2YWwgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6IC8qIHJlYWQgYSBzcGVjaWZpYyBtaXhlciAqLworCQkJaSA9IF9JT0NfTlIoY21kKTsKKworCQkJaWYgKCFzdXBwb3J0ZWRfbWl4ZXIoY29kZWMsIGkpKSAKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogZG8gd2UgZXZlciB3YW50IHRvIHRvdWNoIHRoZSBoYXJkd2FyZT8gKi8KKwkJICAgICAgICAvKiB2YWwgPSBjb2RlYy0+cmVhZF9taXhlcihjb2RlYywgaSk7ICovCisJCQl2YWwgPSBjb2RlYy0+bWl4ZXJfc3RhdGVbaV07CisgCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOworCX0KKworCWlmIChfU0lPQ19ESVIoY21kKSA9PSAoX1NJT0NfV1JJVEV8X1NJT0NfUkVBRCkpIHsKKwkJY29kZWMtPm1vZGNudCsrOworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzogLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHJlY29yZGluZyBzb3VyY2UgKi8KKwkJCWlmICghY29kZWMtPnJlY21hc2tfaW8pIHJldHVybiAtRUlOVkFMOworCQkJaWYgKCF2YWwpIHJldHVybiAwOworCQkJaWYgKCEodmFsICY9IGNvZGVjLT5yZWNvcmRfc291cmNlcykpIHJldHVybiAtRUlOVkFMOworCisJCQljb2RlYy0+cmVjbWFza19pbyhjb2RlYywgMCwgdmFsKTsKKworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6IC8qIHdyaXRlIGEgc3BlY2lmaWMgbWl4ZXIgKi8KKwkJCWkgPSBfSU9DX05SKGNtZCk7CisKKwkJCWlmICghc3VwcG9ydGVkX21peGVyKGNvZGVjLCBpKSkgCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWFjOTdfc2V0X21peGVyKGNvZGVjLCBpLCB2YWwpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogZW50cnkgcG9pbnQgZm9yIC9wcm9jL2RyaXZlci9jb250cm9sbGVyX3ZlbmRvci9hYzk3LyVkICovCitpbnQgYWM5N19yZWFkX3Byb2MgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMCwgY2FwLCBleHRpZCwgdmFsLCBpZDEsIGlkMjsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CisJaW50IGlzX2FjOTdfMjAgPSAwOworCisJaWYgKChjb2RlYyA9IGRhdGEpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWQxID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfVkVORE9SX0lEMSk7CisJaWQyID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfVkVORE9SX0lEMik7CisJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCAiVmVuZG9yIG5hbWUgICAgICA6ICVzXG4iLCBjb2RlYy0+bmFtZSk7CisJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCAiVmVuZG9yIGlkICAgICAgICA6ICUwNFggJTA0WFxuIiwgaWQxLCBpZDIpOworCisJZXh0aWQgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCk7CisJZXh0aWQgJj0gfigoMTw8Mil8KDE8PDQpfCgxPDw1KXwoMTw8MTApfCgxPDwxMSl8KDE8PDEyKXwoMTw8MTMpKTsKKwlsZW4gKz0gc3ByaW50ZiAocGFnZStsZW4sICJBQzk3IFZlcnNpb24gICAgIDogJXNcbiIsCisJCQlleHRpZCA/ICIyLjAgb3IgbGF0ZXIiIDogIjEuMCIpOworCWlmIChleHRpZCkgaXNfYWM5N18yMCA9IDE7CisKKwljYXAgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19SRVNFVCk7CisJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCAiQ2FwYWJpbGl0aWVzICAgICA6JXMlcyVzJXMlcyVzXG4iLAorCQkJY2FwICYgMHgwMDAxID8gIiAtZGVkaWNhdGVkIE1JQyBQQ00gSU4gY2hhbm5lbC0iIDogIiIsCisJCQljYXAgJiAweDAwMDIgPyAiIC1yZXNlcnZlZDEtIiA6ICIiLAorCQkJY2FwICYgMHgwMDA0ID8gIiAtYmFzcyAmIHRyZWJsZS0iIDogIiIsCisJCQljYXAgJiAweDAwMDggPyAiIC1zaW11bGF0ZWQgc3RlcmVvLSIgOiAiIiwKKwkJCWNhcCAmIDB4MDAxMCA/ICIgLWhlYWRwaG9uZSBvdXQtIiA6ICIiLAorCQkJY2FwICYgMHgwMDIwID8gIiAtbG91ZG5lc3MtIiA6ICIiKTsKKwl2YWwgPSBjYXAgJiAweDAwYzA7CisJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCAiREFDIHJlc29sdXRpb25zICA6JXMlcyVzXG4iLAorCQkJIiAtMTYtYml0LSIsCisJCQl2YWwgJiAweDAwNDAgPyAiIC0xOC1iaXQtIiA6ICIiLAorCQkJdmFsICYgMHgwMDgwID8gIiAtMjAtYml0LSIgOiAiIik7CisJdmFsID0gY2FwICYgMHgwMzAwOworCWxlbiArPSBzcHJpbnRmIChwYWdlK2xlbiwgIkFEQyByZXNvbHV0aW9ucyAgOiVzJXMlc1xuIiwKKwkJCSIgLTE2LWJpdC0iLAorCQkJdmFsICYgMHgwMTAwID8gIiAtMTgtYml0LSIgOiAiIiwKKwkJCXZhbCAmIDB4MDIwMCA/ICIgLTIwLWJpdC0iIDogIiIpOworCWxlbiArPSBzcHJpbnRmIChwYWdlK2xlbiwgIjNEIGVuaGFuY2VtZW50ICAgOiAlc1xuIiwKKwkJCWFjOTdfc3RlcmVvX2VuaGFuY2VtZW50c1soY2FwID4+IDEwKSAmIDB4MWZdKTsKKworCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X0dFTkVSQUxfUFVSUE9TRSk7CisJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCAiUE9QIHBhdGggICAgICAgICA6ICVzIDNEXG4iCisJCQkiU2ltLiBzdGVyZW8gICAgICA6ICVzXG4iCisJCQkiM0QgZW5oYW5jZW1lbnQgICA6ICVzXG4iCisJCQkiTG91ZG5lc3MgICAgICAgICA6ICVzXG4iCisJCQkiTW9ubyBvdXRwdXQgICAgICA6ICVzXG4iCisJCQkiTUlDIHNlbGVjdCAgICAgICA6ICVzXG4iCisJCQkiQURDL0RBQyBsb29wYmFjayA6ICVzXG4iLAorCQkJdmFsICYgMHg4MDAwID8gInBvc3QiIDogInByZSIsCisJCQl2YWwgJiAweDQwMDAgPyAib24iIDogIm9mZiIsCisJCQl2YWwgJiAweDIwMDAgPyAib24iIDogIm9mZiIsCisJCQl2YWwgJiAweDEwMDAgPyAib24iIDogIm9mZiIsCisJCQl2YWwgJiAweDAyMDAgPyAiTUlDIiA6ICJNSVgiLAorCQkJdmFsICYgMHgwMTAwID8gIk1JQzIiIDogIk1JQzEiLAorCQkJdmFsICYgMHgwMDgwID8gIm9uIiA6ICJvZmYiKTsKKworCWV4dGlkID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfRVhURU5ERURfSUQpOworCWNhcCA9IGV4dGlkOworCWxlbiArPSBzcHJpbnRmIChwYWdlK2xlbiwgIkV4dCBDYXBhYmlsaXRpZXMgOiVzJXMlcyVzJXMlcyVzXG4iLAorCQkJY2FwICYgMHgwMDAxID8gIiAtdmFyIHJhdGUgUENNIGF1ZGlvLSIgOiAiIiwKKwkJCWNhcCAmIDB4MDAwMiA/ICIgLTJ4IFBDTSBhdWRpbyBvdXQtIiA6ICIiLAorCQkJY2FwICYgMHgwMDA4ID8gIiAtdmFyIHJhdGUgTUlDIGluLSIgOiAiIiwKKwkJCWNhcCAmIDB4MDA0MCA/ICIgLVBDTSBjZW50ZXIgREFDLSIgOiAiIiwKKwkJCWNhcCAmIDB4MDA4MCA/ICIgLVBDTSBzdXJyb3VuZCBEQUMtIiA6ICIiLAorCQkJY2FwICYgMHgwMTAwID8gIiAtUENNIExGRSBEQUMtIiA6ICIiLAorCQkJY2FwICYgMHgwMjAwID8gIiAtc2xvdC9EQUMgbWFwcGluZ3MtIiA6ICIiKTsKKwlpZiAoaXNfYWM5N18yMCkgeworCQlsZW4gKz0gc3ByaW50ZiAocGFnZStsZW4sICJGcm9udCBEQUMgcmF0ZSAgIDogJWRcbiIsCisJCQkJY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKSk7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKgljb2RlY19pZAktICBUdXJuIGlkMS9pZDIgaW50byBhIFBuUCBzdHJpbmcKKyAqCUBpZDE6IFZlbmRvciBJRDEKKyAqCUBpZDI6IFZlbmRvciBJRDIKKyAqCUBidWY6IENPREVDX0lEX0JVRlNaIGJ5dGUgYnVmZmVyCisgKgorICoJRmlsbHMgYnVmIHdpdGggYSB6ZXJvIHRlcm1pbmF0ZWQgUG5QIGlkZW50IHN0cmluZyBmb3IgdGhlIGlkMS9pZDIKKyAqCXBhaXIuIEZvciBjb252ZW5pZW5jZSB0aGUgcmV0dXJuIGlzIHRoZSBwYXNzZWQgaW4gYnVmZmVyIHBvaW50ZXIuCisgKi8KKyAKK3N0YXRpYyBjaGFyICpjb2RlY19pZCh1MTYgaWQxLCB1MTYgaWQyLCBjaGFyICpidWYpCit7CisJaWYoaWQxJjB4ODA4MCkgeworCQlzbnByaW50ZihidWYsIENPREVDX0lEX0JVRlNaLCAiMHglMDR4OjB4JTA0eCIsIGlkMSwgaWQyKTsKKwl9IGVsc2UgeworCQlidWZbMF0gPSAoaWQxID4+IDgpOworCQlidWZbMV0gPSAoaWQxICYgMHhGRik7CisJCWJ1ZlsyXSA9IChpZDIgPj4gOCk7CisJCXNucHJpbnRmKGJ1ZiszLCBDT0RFQ19JRF9CVUZTWiAtIDMsICIlZCIsIGlkMiYweEZGKTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKyAKKy8qKgorICoJYWM5N19jaGVja19tb2RlbSAtIENoZWNrIGlmIHRoZSBDb2RlYyBpcyBhIG1vZGVtCisgKglAY29kZWM6IGNvZGVjIHRvIGNoZWNrCisgKgorICoJUmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyBhbiBBQzk3IDEuMCBvciBBQzk3IDIuMCBtb2RlbQorICovCisgCitzdGF0aWMgaW50IGFjOTdfY2hlY2tfbW9kZW0oc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCS8qIENoZWNrIGZvciBhbiBBQzk3IDEuMCBzb2Z0IG1vZGVtIChJRDEpICovCisJaWYoY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfUkVTRVQpICYgMikKKwkJcmV0dXJuIDE7CisJLyogQ2hlY2sgZm9yIGFuIEFDOTcgMi54IHNvZnQgbW9kZW0gKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfTU9ERU1fSUQsIDBMKTsKKwlpZihjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9NT0RFTV9JRCkgJiAxKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCWFjOTdfYWxsb2NfY29kZWMgLSBBbGxvY2F0ZSBhbiBBQzk3IGNvZGVjCisgKgorICoJUmV0dXJucyBhIG5ldyBBQzk3IGNvZGVjIHN0cnVjdHVyZS4gQUM5NyBjb2RlY3MgbWF5IGJlY29tZQorICoJcmVmY291bnRlZCBzb29uIHNvIHRoaXMgaW50ZXJmYWNlIGlzIG5lZWRlZC4gUmV0dXJucyB3aXRoCisgKglvbmUgcmVmZXJlbmNlIHRha2VuLgorICovCisgCitzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19hbGxvY19jb2RlYyh2b2lkKQoreworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhYzk3X2NvZGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYoIWNvZGVjKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChjb2RlYywgMCwgc2l6ZW9mKCpjb2RlYykpOworCXNwaW5fbG9ja19pbml0KCZjb2RlYy0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5saXN0KTsKKwlyZXR1cm4gY29kZWM7Cit9CisKK0VYUE9SVF9TWU1CT0woYWM5N19hbGxvY19jb2RlYyk7CisKKy8qKgorICoJYWM5N19yZWxlYXNlX2NvZGVjIC0JUmVsZWFzZSBhbiBBQzk3IGNvZGVjCisgKglAY29kZWM6IGNvZGVjIHRvIHJlbGVhc2UKKyAqCisgKglSZWxlYXNlIGFuIGFsbG9jYXRlZCBBQzk3IGNvZGVjLiBUaGlzIHdpbGwgYmUgcmVmY291bnRlZCBpbgorICoJdGltZSBidXQgZm9yIHRoZSBtb21lbnQgaXMgdHJpdmlhbC4gQ2FsbHMgdGhlIHVucmVnaXN0ZXIKKyAqCWhhbmRsZXIgaWYgdGhlIGNvZGVjIGlzIG5vdyBkZWZ1bmN0LgorICovCisgCit2b2lkIGFjOTdfcmVsZWFzZV9jb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJLyogUmVtb3ZlIGZyb20gdGhlIGxpc3QgZmlyc3QsIHdlIGRvbid0IHdhbnQgdG8gYmUKKwkgICAicmVkaXNjb3ZlcmVkIiAqLworCWRvd24oJmNvZGVjX3NlbSk7CisJbGlzdF9kZWwoJmNvZGVjLT5saXN0KTsKKwl1cCgmY29kZWNfc2VtKTsKKwkvKgorCSAqCVRoZSBkcml2ZXIgbmVlZHMgdG8gZGVhbCB3aXRoIGludGVybmFsCisJICoJbG9ja2luZyB0byBhdm9pZCBhY2NpZGVudHMgaGVyZS4gCisJICovCisJaWYoY29kZWMtPmRyaXZlcikKKwkJY29kZWMtPmRyaXZlci0+cmVtb3ZlKGNvZGVjLCBjb2RlYy0+ZHJpdmVyKTsKKwlrZnJlZShjb2RlYyk7Cit9CisKK0VYUE9SVF9TWU1CT0woYWM5N19yZWxlYXNlX2NvZGVjKTsKKworLyoqCisgKglhYzk3X3Byb2JlX2NvZGVjIC0gSW5pdGlhbGl6ZSBhbmQgc2V0dXAgQUM5Ny1jb21wYXRpYmxlIGNvZGVjCisgKglAY29kZWM6IChpbi9vdXQpIEtlcm5lbCBpbmZvIGZvciBhIHNpbmdsZSBBQzk3IGNvZGVjCisgKgorICoJUmVzZXQgdGhlIEFDOTcgY29kZWMsIHRoZW4gaW5pdGlhbGl6ZSB0aGUgbWl4ZXIgYW5kCisgKgl0aGUgcmVzdCBvZiB0aGUgQGNvZGVjIHN0cnVjdHVyZS4KKyAqCisgKglUaGUgY29kZWNfcmVhZCBhbmQgY29kZWNfd3JpdGUgZmllbGRzIG9mIEBjb2RlYyBhcmUKKyAqCXJlcXVpcmVkIHRvIGJlIHNldHVwIGFuZCB3b3JraW5nIHdoZW4gdGhpcyBmdW5jdGlvbgorICoJaXMgY2FsbGVkLiAgQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24uCisgKgorICoJY29kZWNfd2FpdCBmaWVsZCBvZiBAY29kZWMgY2FuIG9wdGlvbmFsbHkgYmUgcHJvdmlkZWQKKyAqCXdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgSWYgY29kZWNfd2FpdCBpcyBub3QgJU5VTEwsCisgKgl0aGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCBjb2RlY193YWl0IGFueSB0aW1lIGl0IGlzCisgKgluZWNlc3NhcnkgdG8gd2FpdCBmb3IgdGhlIGF1ZGlvIGNoaXAgdG8gcmVhY2ggdGhlCisgKgljb2RlYy1yZWFkeSBzdGF0ZS4gIElmIGNvZGVjX3dhaXQgaXMgJU5VTEwsIHRoZW4KKyAqCXRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGNhbGwgc2NoZWR1bGVfdGltZW91dC4KKyAqCUN1cnJlbnRseSBjb2RlY193YWl0IGlzIHVzZWQgdG8gd2FpdCBmb3IgQUM5NyBjb2RlYworICoJcmVzZXQgdG8gY29tcGxldGUuIAorICoKKyAqICAgICBTb21lIGNvZGVjcyB3aWxsIHBvd2VyIGRvd24gd2hlbiBhIHJlZ2lzdGVyIHJlc2V0IGlzCisgKiAgICAgcGVyZm9ybWVkLiBXZSBub3cgY2hlY2sgZm9yIHN1Y2ggY29kZWNzLgorICoKKyAqCVJldHVybnMgMSAodHJ1ZSkgb24gc3VjY2Vzcywgb3IgMCAoZmFsc2UpIG9uIGZhaWx1cmUuCisgKi8KKyAKK2ludCBhYzk3X3Byb2JlX2NvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwl1MTYgaWQxLCBpZDI7CisJdTE2IGF1ZGlvOworCWludCBpOworCWNoYXIgY2lkYnVmW0NPREVDX0lEX0JVRlNaXTsKKwl1MTYgZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBhYzk3X2RyaXZlciAqZDsKKwkKKwkvKiB3YWl0IGZvciBjb2RlYy1yZWFkeSBzdGF0ZSAqLworCWlmIChjb2RlYy0+Y29kZWNfd2FpdCkKKwkJY29kZWMtPmNvZGVjX3dhaXQoY29kZWMpOworCWVsc2UKKwkJdWRlbGF5KDEwKTsKKworCS8qIHdpbGwgdGhlIGNvZGVjIHBvd2VyIGRvd24gaWYgcmVnaXN0ZXIgcmVzZXQgPyAqLworCWlkMSA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1ZFTkRPUl9JRDEpOworCWlkMiA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1ZFTkRPUl9JRDIpOworCWNvZGVjLT5uYW1lID0gTlVMTDsKKwljb2RlYy0+Y29kZWNfb3BzID0gJm51bGxfb3BzOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFjOTdfY29kZWNfaWRzKTsgaSsrKSB7CisJCWlmIChhYzk3X2NvZGVjX2lkc1tpXS5pZCA9PSAoKGlkMSA8PCAxNikgfCBpZDIpKSB7CisJCQljb2RlYy0+dHlwZSA9IGFjOTdfY29kZWNfaWRzW2ldLmlkOworCQkJY29kZWMtPm5hbWUgPSBhYzk3X2NvZGVjX2lkc1tpXS5uYW1lOworCQkJY29kZWMtPmNvZGVjX29wcyA9IGFjOTdfY29kZWNfaWRzW2ldLm9wczsKKwkJCWNvZGVjLT5mbGFncyA9IGFjOTdfY29kZWNfaWRzW2ldLmZsYWdzOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwljb2RlYy0+bW9kZWwgPSAoaWQxIDw8IDE2KSB8IGlkMjsKKwlpZiAoKGNvZGVjLT5mbGFncyAmIEFDOTdfREVGQVVMVF9QT1dFUl9PRkYpID09IDApIHsKKwkJLyogcmVzZXQgY29kZWMgYW5kIHdhaXQgZm9yIHRoZSByZWFkeSBiaXQgYmVmb3JlIHdlIGNvbnRpbnVlICovCisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19SRVNFVCwgMEwpOworCQlpZiAoY29kZWMtPmNvZGVjX3dhaXQpCisJCQljb2RlYy0+Y29kZWNfd2FpdChjb2RlYyk7CisJCWVsc2UKKwkJCXVkZWxheSgxMCk7CisJfQorCisJLyogcHJvYmluZyBBQzk3IGNvZGVjLCBBQzk3IDIuMCBzYXlzIHRoYXQgYml0IDE1IG9mIHJlZ2lzdGVyIDB4MDAgKHJlc2V0KSBzaG91bGQKKwkgKiBiZSByZWFkIHplcm8uCisJICoKKwkgKiBGSVhNRTogaXMgdGhlIGZvbGxvd2luZyBjb21tZW50IG91dGRhdGVkPyAgLWpnYXJ6aWsKKwkgKiBQcm9iaW5nIG9mIEFDOTcgaW4gdGhpcyB3YXkgaXMgbm90IHJlbGlhYmxlLCBpdCBpcyBub3QgZXZlbiBTQUZFICEhCisJICovCisJaWYgKChhdWRpbyA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1JFU0VUKSkgJiAweDgwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhYzk3X2NvZGVjOiAlcyBhYzk3IGNvZGVjIG5vdCBwcmVzZW50XG4iLAorCQkgICAgICAgKGNvZGVjLT5pZCAmIDB4MikgPyAoY29kZWMtPmlkJjEgPyAiNHRoIiA6ICJUZXJ0aWFyeSIpCisJCSAgICAgICA6IChjb2RlYy0+aWQmMSA/ICJTZWNvbmRhcnkiOiAgIlByaW1hcnkiKSk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBwcm9iZSBmb3IgTW9kZW0gQ29kZWMgKi8KKwljb2RlYy0+bW9kZW0gPSBhYzk3X2NoZWNrX21vZGVtKGNvZGVjKTsKKworCS8qIGVuYWJsZSBTUERJRiAqLworCWYgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCWlmKChjb2RlYy0+Y29kZWNfb3BzID09ICZudWxsX29wcykgJiYgKGYgJiA0KSkKKwkJY29kZWMtPmNvZGVjX29wcyA9ICZkZWZhdWx0X2RpZ2l0YWxfb3BzOworCQorCS8qIEEgZGV2aWNlIHdoaWNoIHRoaW5rcyBpdHMgYSBtb2RlbSBidXQgaXNudCAqLworCWlmKGNvZGVjLT5mbGFncyAmIEFDOTdfREVMVURFRF9NT0RFTSkKKwkJY29kZWMtPm1vZGVtID0gMDsKKwkJCisJaWYgKGNvZGVjLT5uYW1lID09IE5VTEwpCisJCWNvZGVjLT5uYW1lID0gIlVua25vd24iOworCXByaW50ayhLRVJOX0lORk8gImFjOTdfY29kZWM6IEFDOTcgJXMgY29kZWMsIGlkOiAlcyAoJXMpXG4iLCAKKwkJY29kZWMtPm1vZGVtID8gIk1vZGVtIiA6IChhdWRpbyA/ICJBdWRpbyIgOiAiIiksCisJICAgICAgIGNvZGVjX2lkKGlkMSwgaWQyLCBjaWRidWYpLCBjb2RlYy0+bmFtZSk7CisKKwlpZighYWM5N19pbml0X21peGVyKGNvZGVjKSkKKwkJcmV0dXJuIDA7CisJCQorCS8qIAorCSAqCUF0dGFjaCBsYXN0IHNvIHRoZSBjYWxsZXIgY2FuIG92ZXJyaWRlIHRoZSBtaXhlcgorCSAqCWNhbGxiYWNrcy4KKwkgKi8KKwkgCisJZG93bigmY29kZWNfc2VtKTsKKwlsaXN0X2FkZCgmY29kZWMtPmxpc3QsICZjb2RlY3MpOworCisJbGlzdF9mb3JfZWFjaChsLCAmY29kZWNfZHJpdmVycykgeworCQlkID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWM5N19kcml2ZXIsIGxpc3QpOworCQlpZiAoKGNvZGVjLT5tb2RlbCBeIGQtPmNvZGVjX2lkKSAmIGQtPmNvZGVjX21hc2spCisJCQljb250aW51ZTsKKwkJaWYoZC0+cHJvYmUoY29kZWMsIGQpID09IDApCisJCXsKKwkJCWNvZGVjLT5kcml2ZXIgPSBkOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl1cCgmY29kZWNfc2VtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhYzk3X2luaXRfbWl4ZXIoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCXUxNiBjYXA7CisJaW50IGk7CisKKwljYXAgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19SRVNFVCk7CisKKwkvKiBtaXhlciBtYXNrcyAqLworCWNvZGVjLT5zdXBwb3J0ZWRfbWl4ZXJzID0gQUM5N19TVVBQT1JURURfTUFTSzsKKwljb2RlYy0+c3RlcmVvX21peGVycyA9IEFDOTdfU1RFUkVPX01BU0s7CisJY29kZWMtPnJlY29yZF9zb3VyY2VzID0gQUM5N19SRUNPUkRfTUFTSzsKKwlpZiAoIShjYXAgJiAweDA0KSkKKwkJY29kZWMtPnN1cHBvcnRlZF9taXhlcnMgJj0gfihTT1VORF9NQVNLX0JBU1N8U09VTkRfTUFTS19UUkVCTEUpOworCWlmICghKGNhcCAmIDB4MTApKQorCQljb2RlYy0+c3VwcG9ydGVkX21peGVycyAmPSB+U09VTkRfTUFTS19BTFRQQ007CisKKworCS8qIGRldGVjdCBiaXQgcmVzb2x1dGlvbiAqLworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTywgMHgyMDIwKTsKKwlpZihjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTykgPT0gMHgyMDIwKQorCQljb2RlYy0+Yml0X3Jlc29sdXRpb24gPSA2OworCWVsc2UKKwkJY29kZWMtPmJpdF9yZXNvbHV0aW9uID0gNTsKKworCS8qIGdlbmVyaWMgT1NTIHRvIEFDOTcgd3JhcHBlciAqLworCWNvZGVjLT5yZWFkX21peGVyID0gYWM5N19yZWFkX21peGVyOworCWNvZGVjLT53cml0ZV9taXhlciA9IGFjOTdfd3JpdGVfbWl4ZXI7CisJY29kZWMtPnJlY21hc2tfaW8gPSBhYzk3X3JlY21hc2tfaW87CisJY29kZWMtPm1peGVyX2lvY3RsID0gYWM5N19taXhlcl9pb2N0bDsKKworCS8qIGluaXRpYWxpemUgbWl4ZXIgY2hhbm5lbCB2b2x1bWVzICovCisJZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7CisJCXN0cnVjdCBtaXhlcl9kZWZhdWx0cyAqbWQgPSAmbWl4ZXJfZGVmYXVsdHNbaV07CisJCWlmIChtZC0+bWl4ZXIgPT0gLTEpIAorCQkJYnJlYWs7CisJCWlmICghc3VwcG9ydGVkX21peGVyKGNvZGVjLCBtZC0+bWl4ZXIpKSAKKwkJCWNvbnRpbnVlOworCQlhYzk3X3NldF9taXhlcihjb2RlYywgbWQtPm1peGVyLCBtZC0+dmFsdWUpOworCX0KKworCS8qIGNvZGVjIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZvciA0LTYgY2hhbm5lbCBvdXRwdXQgb3Igc2Vjb25kYXJ5IGNvZGVjIHN0dWZmICovCisJaWYgKGNvZGVjLT5jb2RlY19vcHMtPmluaXQgIT0gTlVMTCkgeworCQljb2RlYy0+Y29kZWNfb3BzLT5pbml0KGNvZGVjKTsKKwl9CisKKwkvKgorCSAqCVZvbHVtZSBpcyBNVVRFIG9ubHkgb24gdGhpcyBkZXZpY2UuIFdlIGhhdmUgdG8gaW5pdGlhbGlzZQorCSAqCWl0IGJ1dCBpdHMgdXNlbGVzcyBiZXlvbmQgdGhhdC4KKwkgKi8KKwlpZihjb2RlYy0+ZmxhZ3MgJiBBQzk3X05PX1BDTV9WT0xVTUUpCisJeworCQljb2RlYy0+c3VwcG9ydGVkX21peGVycyAmPSB+U09VTkRfTUFTS19QQ007CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFDOTcgY29kZWMgZG9lcyBub3QgaGF2ZSBwcm9wZXIgdm9sdW1lIHN1cHBvcnQuXG4iKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgQUM5N19TSUdNQVRFTF9BTkFMT0cgICAgMHg2YwkvKiBBbmFsb2cgU3BlY2lhbCAqLworI2RlZmluZSBBQzk3X1NJR01BVEVMX0RBQzJJTlZFUlQgMHg2ZQorI2RlZmluZSBBQzk3X1NJR01BVEVMX0JJQVMxICAgICAweDcwCisjZGVmaW5lIEFDOTdfU0lHTUFURUxfQklBUzIgICAgIDB4NzIKKyNkZWZpbmUgQUM5N19TSUdNQVRFTF9NVUxUSUNITiAgMHg3NAkvKiBNdWx0aS1DaGFubmVsIHByb2dyYW1taW5nICovCisjZGVmaW5lIEFDOTdfU0lHTUFURUxfQ0lDMSAgICAgIDB4NzYKKyNkZWZpbmUgQUM5N19TSUdNQVRFTF9DSUMyICAgICAgMHg3OAorCisKK3N0YXRpYyBpbnQgc2lnbWF0ZWxfOTcwOF9pbml0KHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpCit7CisJdTE2IGNvZGVjNzIsIGNvZGVjNmM7CisKKwljb2RlYzcyID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfU0lHTUFURUxfQklBUzIpICYgMHg4MDAwOworCWNvZGVjNmMgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19TSUdNQVRFTF9BTkFMT0cpOworCisJaWYgKChjb2RlYzcyPT0wKSAmJiAoY29kZWM2Yz09MCkpIHsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NJR01BVEVMX0NJQzEsIDB4YWJiYSk7CisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9DSUMyLCAweDEwMDApOworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU0lHTUFURUxfQklBUzEsIDB4YWJiYSk7CisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9CSUFTMiwgMHgwMDA3KTsKKwl9IGVsc2UgaWYgKChjb2RlYzcyPT0weDgwMDApICYmIChjb2RlYzZjPT0wKSkgeworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU0lHTUFURUxfQ0lDMSwgMHhhYmJhKTsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NJR01BVEVMX0NJQzIsIDB4MTAwMSk7CisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9EQUMySU5WRVJULCAweDAwMDgpOworCX0gZWxzZSBpZiAoKGNvZGVjNzI9PTB4ODAwMCkgJiYgKGNvZGVjNmM9PTB4MDA4MCkpIHsKKwkJLyogbm90aGluZyAqLworCX0KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU0lHTUFURUxfTVVMVElDSE4sIDB4MDAwMCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzaWdtYXRlbF85NzIxX2luaXQoc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYykKK3sKKwkvKiBPbmx5IHNldCB1cCBzZWNvbmRhcnkgY29kZWMgKi8KKwlpZiAoY29kZWMtPmlkID09IDApCisJCXJldHVybiAwOworCisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NVUlJPVU5EX01BU1RFUiwgMEwpOworCisJLyogaW5pdGlhbGl6ZSBTaWdtYVRlbCBTVEFDOTcyMS8yMyBhcyBzZWNvbmRhcnkgY29kZWMsIGRlY29kaW5nIEFDIGxpbmsKKwkgICBzbG9jIDMsNCA9IDB4MDEsIHNsb3QgNyw4ID0gMHgwMCwgKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU0lHTUFURUxfTVVMVElDSE4sIDB4MDApOworCisJLyogd2UgZG9uJ3QgaGF2ZSB0aGUgY3J5c3RhbCB3aGVuIHdlIGFyZSBvbiBhbiBBTVIgY2FyZCwgc28gdXNlCisJICAgQklUX0NMSyBhcyBvdXIgY2xvY2sgc291cmNlLiBXcml0ZSB0aGUgbWFnaWMgd29yZCBBQkJBIGFuZCByZWFkCisJICAgYmFjayB0byBlbmFibGUgcmVnaXN0ZXIgMHg3OCAqLworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9DSUMxLCAweGFiYmEpOworCWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1NJR01BVEVMX0NJQzEpOworCisJLyogc3luYyBhbGwgdGhlIGNsb2NrcyovCisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NJR01BVEVMX0NJQzIsIDB4MzgwMik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNpZ21hdGVsXzk3NDRfaW5pdChzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKQoreworCS8vIHBhdGNoIGZvciBTaWdtYVRlbAorCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9DSUMxLCAweGFiYmEpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9DSUMyLCAweDAwMDApOyAvLyBpcyB0aGlzIGNvcnJlY3Q/IC0tamsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU0lHTUFURUxfQklBUzEsIDB4YWJiYSk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NJR01BVEVMX0JJQVMyLCAweDAwMDIpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9NVUxUSUNITiwgMHgwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbWVkaWFfaW5pdChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJLyogSW5pdGlhbGlzZSB0aGUgQ01lZGlhIDk3MzkgKi8KKwkvKgorCQlXZSBjb3VsZCBzZXQgdmFyaW91cyBvcHRpb25zIGhlcmUKKwkJUmVnaXN0ZXIgMHgyMCBiaXQgMHgxMDAgc2V0cyBtaWMgYXMgY2VudGVyIGJhc3MKKwkJQWxzbyBkbyBtdWx0aV9jaGFubmVsX2N0cmwgJj1+MHgzMDAwIHw9MHgxMDAwCisJCQorCQlGb3Igbm93IHdlIHNldCB1cCB0aGUgR1BJTyBhbmQgUEMgYmVlcCAKKwkqLworCQorCXUxNiB2OworCQorCS8qIE1JQyAqLworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHg2NCwgMHgzMDAwKTsKKwl2ID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIDB4NjQpOworCXYgJj0gfjB4ODAwMDsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4NjQsIHYpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHg3MCwgMHgwMTAwKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4NzIsIDB4MDAyMCk7CisJcmV0dXJuIDA7Cit9CisJCisjZGVmaW5lIEFDOTdfV005N1hYX0ZNSVhFUl9WT0wgMHg3MgorI2RlZmluZSBBQzk3X1dNOTdYWF9STUlYRVJfVk9MIDB4NzQKKyNkZWZpbmUgQUM5N19XTTk3WFhfVEVTVCAweDVhCisjZGVmaW5lIEFDOTdfV005NzA0X1JQQ01fVk9MIDB4NzAKKyNkZWZpbmUgQUM5N19XTTk3MTFfT1VUM1ZPTCAweDE2CisKK3N0YXRpYyBpbnQgd29sZnNvbl9pbml0MDMoc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYykKK3sKKwkvKiB0aGlzIGlzIGtub3duIHRvIHdvcmsgZm9yIHRoZSBWaWV3U29uaWMgVmlld1BhZCAxMDAwICovCisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1dNOTdYWF9GTUlYRVJfVk9MLCAweDA4MDgpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDB4ODAwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd29sZnNvbl9pbml0MDQoc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYykKK3sKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfV005N1hYX0ZNSVhFUl9WT0wsIDB4MDgwOCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1dNOTdYWF9STUlYRVJfVk9MLCAweDA4MDgpOworCisJLy8gcGF0Y2ggZm9yIERWRCBub2lzZQorCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19XTTk3WFhfVEVTVCwgMHgwMjAwKTsKKworCS8vIGluaXQgdm9sIGFzIFBDTSB2b2wKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfV005NzA0X1JQQ01fVk9MLAorCQljb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19QQ01PVVRfVk9MKSk7CisKKwkvKiBzZXQgcmVhciBzdXJyb3VuZCB2b2x1bWUgKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU1VSUk9VTkRfTUFTVEVSLCAweDAwMDApOworCXJldHVybiAwOworfQorCisvKiBXTTk3MDUsIFdNOTcxMCAqLworc3RhdGljIGludCB3b2xmc29uX2luaXQwNShzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKQoreworCS8qIHNldCBmcm9udCBtaXhlciB2b2x1bWUgKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfV005N1hYX0ZNSVhFUl9WT0wsIDB4MDgwOCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdNOTcxMSwgV005NzEyICovCitzdGF0aWMgaW50IHdvbGZzb25faW5pdDExKHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpCit7CisJLyogc3RvcCBwb3AncyBkdXJpbmcgc3VzcGVuZC9yZXN1bWUgKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfV005N1hYX1RFU1QsCisJCWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1dNOTdYWF9URVNUKSAmIDB4ZmZiZik7CisKKwkvKiBzZXQgb3V0MyB2b2x1bWUgKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfV005NzExX09VVDNWT0wsIDB4MDgwOCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdNOTcxMyAqLworc3RhdGljIGludCB3b2xmc29uX2luaXQxMyhzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKQoreworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19SRUNPUkRfR0FJTiwgMHgwMGEwKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgMHgwMDAwKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfTU9ERU1fSUQsIDB4REEwMCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X0VYVEVORF9NT0RFTV9TVEFULCAweDM4MTApOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19QSE9ORV9WT0wsIDB4MDgwOCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BDQkVFUF9WT0wsIDB4MDgwOCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cml0ZWNoX2luaXQoc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYykKK3sKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MjYsIDB4MDMwMCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDI2LCAweDAwMDApOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TVVJST1VORF9NQVNURVIsIDB4MDAwMCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1JFU0VSVkVEXzNBLCAweDAwMDApOworCXJldHVybiAwOworfQorCisKKy8qIGNvcGllZCBmcm9tIGRyaXZlcnMvc291bmQvbWFlc3Ryby5jICovCitzdGF0aWMgaW50IHRyaXRlY2hfbWFlc3Ryb19pbml0KHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpCit7CisJLyogbm8gaWRlYSB3aGF0IHRoaXMgZG9lcyAqLworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgyQSwgMHgwMDAxKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MkMsIDB4MDAwMCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDJDLCAwWEZGRkYpOworCXJldHVybiAwOworfQorCisKKworLyogCisgKglQcmVzYXJpbzcwMCB3b3JrYXJvdW5kIAorICogCWZvciBKYWNrIFNlbnNlL1NQRElGIFJlZ2lzdGVyIG1pcy1zZXR0aW5nIGNhdXNpbmcKKyAqCW5vIGF1ZGlibGUgb3V0cHV0CisgKglieSBTYW50aWFnbyBOdWxsbyAwNC8wNS8yMDAyCisgKi8KKworI2RlZmluZSBBQzk3X0FEMTg4Nl9KQUNLX1NFTlNFIDB4NzIKKworc3RhdGljIGludCBhZDE4ODZfaW5pdChzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKQoreworCS8qIGZyb20gQUQxODg2IFNwZWNzICovCisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X0FEMTg4Nl9KQUNLX1NFTlNFLCAweDAwMTApOworCXJldHVybiAwOworfQorCisKKworCisvKgorICoJVGhpcyBpcyBiYXNpY2FsbHkgc3RhbmRhcmQgQUM5Ny4gSXQgc2hvdWxkIHdvcmsgYXMgYSBkZWZhdWx0IGZvcgorICoJYWxtb3N0IGFsbCBtb2Rlcm4gY29kZWNzLiBOb3RlIHRoYXQgc29tZSBjYXJkcyB3aXJlIEVBUEQgKmJhY2t3YXJkcyoKKyAqCVRoYXQgc2lkZSBvZiBpdCBpcyB1cCB0byB0aGUgY2FyZCBkcml2ZXIgbm90IHVzIHRvIGNvcGUgd2l0aC4KKyAqCisgKi8KKworc3RhdGljIGludCBlYXBkX2NvbnRyb2woc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYywgaW50IG9uKQoreworCWlmKG9uKQorCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwKKwkJCWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wpfDB4ODAwMCk7CisJZWxzZQorCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwKKwkJCWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wpJn4weDgwMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNfZGlnaXRhbF9jb250cm9sKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50IHNsb3RzLCBpbnQgcmF0ZSwgaW50IG1vZGUpCit7CisJdTE2IHJlZzsKKwkKKwlyZWcgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19TUERJRl9DT05UUk9MKTsKKwkKKwlzd2l0Y2gocmF0ZSkKKwl7CisJCS8qIE9mZiBieSBkZWZhdWx0ICovCisJCWRlZmF1bHQ6CisJCWNhc2UgMDoKKwkJCXJlZyA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCAocmVnICYgfkFDOTdfRUFfU1BESUYpKTsKKwkJCWlmKHJhdGUgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIDE6CisJCQlyZWcgPSAocmVnICYgQUM5N19TQ19TUFNSX01BU0spIHwgQUM5N19TQ19TUFNSXzQ4SzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlyZWcgPSAocmVnICYgQUM5N19TQ19TUFNSX01BU0spIHwgQUM5N19TQ19TUFNSXzQ0SzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlyZWcgPSAocmVnICYgQUM5N19TQ19TUFNSX01BU0spIHwgQUM5N19TQ19TUFNSXzMySzsKKwkJCWJyZWFrOworCX0KKwkKKwlyZWcgJj0gfkFDOTdfU0NfQ0NfTUFTSzsKKwlyZWcgfD0gKG1vZGUgJiBBVURJT19DQ01BU0spIDw8IDY7CisJCisJaWYobW9kZSAmIEFVRElPX0RJR0lUQUwpCisJCXJlZyB8PSAyOworCWlmKG1vZGUgJiBBVURJT19QUk8pCisJCXJlZyB8PSAxOworCWlmKG1vZGUgJiBBVURJT19EUlMpCisJCXJlZyB8PSAweDQwMDA7CisKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU1BESUZfQ09OVFJPTCwgcmVnKTsKKworCXJlZyA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJcmVnICY9IChBQzk3X0VBX1NMT1RfTUFTSyk7CisJcmVnIHw9IEFDOTdfRUFfVlJBIHwgQUM5N19FQV9TUERJRiB8IHNsb3RzOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIHJlZyk7CisJCisJcmVnID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwlpZighKHJlZyAmIDB4MDQwMCkpCisJeworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCByZWcgJiB+IEFDOTdfRUFfU1BESUYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglDcnlzdGFsIGRpZ2l0YWwgYXVkaW8gY29udHJvbCAoQ1M0Mjk5KQorICovCisgCitzdGF0aWMgaW50IGNyeXN0YWxfZGlnaXRhbF9jb250cm9sKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50IHNsb3RzLCBpbnQgcmF0ZSwgaW50IG1vZGUpCit7CisJdTE2IGN2OworCisJaWYobW9kZSAmIEFVRElPX0RJR0lUQUwpCisJCXJldHVybiAtRUlOVkFMOworCQkKKwlzd2l0Y2gocmF0ZSkKKwl7CisJCWNhc2UgMDogY3YgPSAweDA7IGJyZWFrOwkvKiBTUEVOIG9mZiAqLworCQljYXNlIDQ4MDAwOiBjdiA9IDB4ODAwNDsgYnJlYWs7CS8qIDQ4S0h6IGRpZ2l0YWwgKi8KKwkJY2FzZSA0NDEwMDogY3YgPSAweDgxMDQ7IGJyZWFrOwkvKiA0NC4xS0h6IGRpZ2l0YWwgKi8KKwkJY2FzZSAzMjc2ODogCQkJLyogMzJLaHogKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4NjgsIGN2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUNNZWRpYSBkaWdpdGFsIGF1ZGlvIGNvbnRyb2wKKyAqCU5lZWRzIG1vcmUgd29yay4KKyAqLworIAorc3RhdGljIGludCBjbWVkaWFfZGlnaXRhbF9jb250cm9sKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50IHNsb3RzLCBpbnQgcmF0ZSwgaW50IG1vZGUpCit7CisJdTE2IGN2OworCisJaWYobW9kZSAmIEFVRElPX0RJR0lUQUwpCisJCXJldHVybiAtRUlOVkFMOworCQkKKwlzd2l0Y2gocmF0ZSkKKwl7CisJCWNhc2UgMDoJCWN2ID0gMHgwMDAxOyBicmVhazsJLyogU1BFTiBvZmYgKi8KKwkJY2FzZSA0ODAwMDoJY3YgPSAweDAwMDk7IGJyZWFrOwkvKiA0OEtIeiBkaWdpdGFsICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDJBLCAweDA1YzQpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHg2QywgY3YpOworCQorCS8qIFN3aXRjaCBvbiBtaXggdG8gc3Vycm91bmQgKi8KKwljdiA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCAweDY0KTsKKwljdiAmPSB+MHgwMjAwOworCWlmKG1vZGUpCisJCWN2IHw9IDB4MDIwMDsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4NjQsIGN2KTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBjb3BpZWQgZnJvbSBkcml2ZXJzL3NvdW5kL21hZXN0cm8uYyAqLworI2lmIDAgIC8qIHRoZXJlIGhhcyBiZWVuIDEgcGVyc29uIG9uIHRoZSBwbGFuZXQgd2l0aCBhIHB0MTAxIHRoYXQgd2UKKyAgICAgICAga25vdyBvZi4gIElmIHRoZXkgY2FyZSwgdGhleSBjYW4gcHV0IHRoaXMgYmFjayBpbiA6KSAqLworc3RhdGljIGludCBwdDEwMV9pbml0KHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiYWM5N19jb2RlYzogUFQxMDEgQ29kZWMgZGV0ZWN0ZWQsIGluaXRpYWxpemluZyBidXQgX25vdF8gaW5zdGFsbGluZyBtaXhlciBkZXZpY2UuXG4iKTsKKwkvKiB3aG8ga25vd3MuLiAqLworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgyQSwgMHgwMDAxKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MkMsIDB4MDAwMCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDJDLCAweEZGRkYpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgxMCwgMHg5RjFGKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MTIsIDB4MDgwOCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDE0LCAweDlGMUYpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgxNiwgMHg5RjFGKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MTgsIDB4MDQwNCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDFBLCAweDAwMDApOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgxQywgMHgwMDAwKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MDIsIDB4MDQwNCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDA0LCAweDA4MDgpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgwQywgMHg4MDFGKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MEUsIDB4ODAxRik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwkKKworRVhQT1JUX1NZTUJPTChhYzk3X3JlYWRfcHJvYyk7CitFWFBPUlRfU1lNQk9MKGFjOTdfcHJvYmVfY29kZWMpOworCisvKgorICoJQUM5NyBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMKKyAqLwkKKyAKKy8qKgorICoJYWM5N19zZXRfZGFjX3JhdGUJLQlzZXQgY29kZWMgcmF0ZSBhZGFwdGlvbgorICoJQGNvZGVjOiBhYzk3IGNvZGUKKyAqCUByYXRlOiByYXRlIGluIGhlcnR6CisgKgorICoJU2V0IHRoZSBEQUMgcmF0ZS4gQXNzdW1lcyB0aGUgY29kZWMgc3VwcG9ydHMgVlJBLiBUaGUgY2FsbGVyIGlzCisgKglleHBlY3RlZCB0byBoYXZlIGNoZWNrZWQgdGhpcyBsaXR0bGUgZGV0YWlsLgorICovCisgCit1bnNpZ25lZCBpbnQgYWM5N19zZXRfZGFjX3JhdGUoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbmV3X3JhdGUgPSByYXRlOworCXUzMiBkYWNwOworCXUzMiBtYXN0X3ZvbCwgcGhvbmVfdm9sLCBtb25vX3ZvbCwgcGNtX3ZvbDsKKwl1MzIgbXV0ZV92b2wgPSAweDgwMDA7CS8qIFRoZSBtdXRlIHZvbHVtZT8gKi8KKworCWlmKHJhdGUgIT0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKSkKKwl7CisJCS8qIE11dGUgc2V2ZXJhbCByZWdpc3RlcnMgKi8KKwkJbWFzdF92b2wgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTyk7CisJCW1vbm9fdm9sID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfTUFTVEVSX1ZPTF9NT05PKTsKKwkJcGhvbmVfdm9sID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfSEVBRFBIT05FX1ZPTCk7CisJCXBjbV92b2wgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19QQ01PVVRfVk9MKTsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCBtdXRlX3ZvbCk7CisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19NQVNURVJfVk9MX01PTk8sIG11dGVfdm9sKTsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X0hFQURQSE9ORV9WT0wsIG11dGVfdm9sKTsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BDTU9VVF9WT0wsIG11dGVfdm9sKTsKKwkJCisJCS8qIFBvd2VyIGRvd24gdGhlIERBQyAqLworCQlkYWNwPWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wpOworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgZGFjcHwweDAyMDApOworCQkvKiBMb2FkIHRoZSByYXRlIGFuZCByZWFkIHRoZSBlZmZlY3RpdmUgcmF0ZSAqLworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFLCByYXRlKTsKKwkJbmV3X3JhdGU9Y29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKTsKKwkJLyogUG93ZXIgaXQgYmFjayB1cCAqLworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgZGFjcCk7CisKKwkJLyogUmVzdG9yZSB2b2x1bWVzICovCisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTywgbWFzdF92b2wpOworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfTUFTVEVSX1ZPTF9NT05PLCBtb25vX3ZvbCk7CisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19IRUFEUEhPTkVfVk9MLCBwaG9uZV92b2wpOworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUENNT1VUX1ZPTCwgcGNtX3ZvbCk7CisJfQorCXJldHVybiBuZXdfcmF0ZTsKK30KKworRVhQT1JUX1NZTUJPTChhYzk3X3NldF9kYWNfcmF0ZSk7CisKKy8qKgorICoJYWM5N19zZXRfYWRjX3JhdGUJLQlzZXQgY29kZWMgcmF0ZSBhZGFwdGlvbgorICoJQGNvZGVjOiBhYzk3IGNvZGUKKyAqCUByYXRlOiByYXRlIGluIGhlcnR6CisgKgorICoJU2V0IHRoZSBBREMgcmF0ZS4gQXNzdW1lcyB0aGUgY29kZWMgc3VwcG9ydHMgVlJBLiBUaGUgY2FsbGVyIGlzCisgKglleHBlY3RlZCB0byBoYXZlIGNoZWNrZWQgdGhpcyBsaXR0bGUgZGV0YWlsLgorICovCisKK3Vuc2lnbmVkIGludCBhYzk3X3NldF9hZGNfcmF0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIGludCBuZXdfcmF0ZSA9IHJhdGU7CisJdTMyIGRhY3A7CisKKwlpZihyYXRlICE9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BDTV9MUl9BRENfUkFURSkpCisJeworCQkvKiBQb3dlciBkb3duIHRoZSBBREMgKi8KKwkJZGFjcD1jb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsIGRhY3B8MHgwMTAwKTsKKwkJLyogTG9hZCB0aGUgcmF0ZSBhbmQgcmVhZCB0aGUgZWZmZWN0aXZlIHJhdGUgKi8KKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BDTV9MUl9BRENfUkFURSwgcmF0ZSk7CisJCW5ld19yYXRlPWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BDTV9MUl9BRENfUkFURSk7CisJCS8qIFBvd2VyIGl0IGJhY2sgdXAgKi8KKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsIGRhY3ApOworCX0KKwlyZXR1cm4gbmV3X3JhdGU7Cit9CisKK0VYUE9SVF9TWU1CT0woYWM5N19zZXRfYWRjX3JhdGUpOworCitpbnQgYWM5N19zYXZlX3N0YXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gMDsJCit9CisKK0VYUE9SVF9TWU1CT0woYWM5N19zYXZlX3N0YXRlKTsKKworaW50IGFjOTdfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGxlZnQsIHJpZ2h0LCB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspIHsKKwkJaWYgKCFzdXBwb3J0ZWRfbWl4ZXIoY29kZWMsIGkpKSAKKwkJCWNvbnRpbnVlOworCisJCXZhbCA9IGNvZGVjLT5taXhlcl9zdGF0ZVtpXTsKKwkJcmlnaHQgPSB2YWwgPj4gODsKKwkJbGVmdCA9IHZhbCAgJiAweGZmOworCQljb2RlYy0+d3JpdGVfbWl4ZXIoY29kZWMsIGksIGxlZnQsIHJpZ2h0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woYWM5N19yZXN0b3JlX3N0YXRlKTsKKworLyoqCisgKglhYzk3X3JlZ2lzdGVyX2RyaXZlcgktCXJlZ2lzdGVyIGEgY29kZWMgaGVscGVyCisgKglAZHJpdmVyOiBEcml2ZXIgaGFuZGxlcgorICoKKyAqCVJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgY29kZWNzIG1hdGNoaW5nIHRoZSBjb2RlYyBpZC4gVGhlIGhhbmRsZXIKKyAqCWF0dGFjaCBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGFsbCBwcmVzZW50IGNvZGVjcyBhbmQgd2lsbCBiZSAKKyAqCWNhbGxlZCB3aGVuIG5ldyBjb2RlY3MgYXJlIGRpc2NvdmVyZWQuCisgKi8KKyAKK2ludCBhYzk3X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWM5N19kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBhYzk3X2NvZGVjICpjOworCQorCWRvd24oJmNvZGVjX3NlbSk7CisJSU5JVF9MSVNUX0hFQUQoJmRyaXZlci0+bGlzdCk7CisJbGlzdF9hZGQoJmRyaXZlci0+bGlzdCwgJmNvZGVjX2RyaXZlcnMpOworCQorCWxpc3RfZm9yX2VhY2gobCwgJmNvZGVjcykKKwl7CisJCWMgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBhYzk3X2NvZGVjLCBsaXN0KTsKKwkJaWYoYy0+ZHJpdmVyICE9IE5VTEwgfHwgKChjLT5tb2RlbCBeIGRyaXZlci0+Y29kZWNfaWQpICYgZHJpdmVyLT5jb2RlY19tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlpZihkcml2ZXItPnByb2JlKGMsIGRyaXZlcikpCisJCQljb250aW51ZTsKKwkJYy0+ZHJpdmVyID0gZHJpdmVyOworCX0KKwl1cCgmY29kZWNfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoYWM5N19yZWdpc3Rlcl9kcml2ZXIpOworCisvKioKKyAqCWFjOTdfdW5yZWdpc3Rlcl9kcml2ZXIJLQl1bnJlZ2lzdGVyIGEgY29kZWMgaGVscGVyCisgKglAZHJpdmVyOiBEcml2ZXIgaGFuZGxlcgorICoKKyAqCVVucmVnaXN0ZXIgYSBoYW5kbGVyIGZvciBjb2RlY3MgbWF0Y2hpbmcgdGhlIGNvZGVjIGlkLiBUaGUgaGFuZGxlcgorICoJcmVtb3ZlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgYWxsIG1hdGNoaW5nIGNvZGVjcy4KKyAqLworIAordm9pZCBhYzk3X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBhYzk3X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IGFjOTdfY29kZWMgKmM7CisJCisJZG93bigmY29kZWNfc2VtKTsKKwlsaXN0X2RlbF9pbml0KCZkcml2ZXItPmxpc3QpOworCisJbGlzdF9mb3JfZWFjaChsLCAmY29kZWNzKQorCXsKKwkJYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IGFjOTdfY29kZWMsIGxpc3QpOworCQlpZiAoYy0+ZHJpdmVyID09IGRyaXZlcikgeworCQkJZHJpdmVyLT5yZW1vdmUoYywgZHJpdmVyKTsKKwkJCWMtPmRyaXZlciA9IE5VTEw7CisJCX0KKwl9CisJCisJdXAoJmNvZGVjX3NlbSk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGFjOTdfdW5yZWdpc3Rlcl9kcml2ZXIpOworCitzdGF0aWMgaW50IHN3YXBfaGVhZHBob25lKGludCByZW1vdmVfbWFzdGVyKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IGFjOTdfY29kZWMgKmM7CisJCisJaWYgKHJlbW92ZV9tYXN0ZXIpIHsKKwkJZG93bigmY29kZWNfc2VtKTsKKwkJbGlzdF9mb3JfZWFjaChsLCAmY29kZWNzKQorCQl7CisJCQljID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWM5N19jb2RlYywgbGlzdCk7CisJCQlpZiAoc3VwcG9ydGVkX21peGVyKGMsIFNPVU5EX01JWEVSX1BIT05FT1VUKSkKKwkJCQljLT5zdXBwb3J0ZWRfbWl4ZXJzICY9IH5TT1VORF9NQVNLX1BIT05FT1VUOworCQl9CisJCXVwKCZjb2RlY19zZW0pOworCX0gZWxzZQorCQlhYzk3X2h3W1NPVU5EX01JWEVSX1BIT05FT1VUXS5vZmZzZXQgPSBBQzk3X01BU1RFUl9WT0xfU1RFUkVPOworCisJLyogU2NhbGUgdmFsdWVzIGFscmVhZHkgbWF0Y2ggKi8KKwlhYzk3X2h3W1NPVU5EX01JWEVSX1ZPTFVNRV0ub2Zmc2V0ID0gQUM5N19NQVNURVJfVk9MX01PTk87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfcXVpcmsoaW50IHF1aXJrKQoreworCXN3aXRjaCAocXVpcmspIHsKKwljYXNlIEFDOTdfVFVORV9OT05FOgorCQlyZXR1cm4gMDsKKwljYXNlIEFDOTdfVFVORV9IUF9PTkxZOgorCQlyZXR1cm4gc3dhcF9oZWFkcGhvbmUoMSk7CisJY2FzZSBBQzk3X1RVTkVfU1dBUF9IUDoKKwkJcmV0dXJuIHN3YXBfaGVhZHBob25lKDApOworCWNhc2UgQUM5N19UVU5FX1NXQVBfU1VSUk9VTkQ6CisJCXJldHVybiAtRU5PU1lTOyAvKiBub3QgeWV0IGltcGxlbWVudGVkICovCisJY2FzZSBBQzk3X1RVTkVfQURfU0hBUklORzoKKwkJcmV0dXJuIC1FTk9TWVM7IC8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwljYXNlIEFDOTdfVFVORV9BTENfSkFDSzoKKwkJcmV0dXJuIC1FTk9TWVM7IC8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICoJYWM5N190dW5lX2hhcmR3YXJlIC0gdHVuZSB1cCB0aGUgaGFyZHdhcmUKKyAqCUBwZGV2OiBwY2lfZGV2IHBvaW50ZXIKKyAqCUBxdWlyazogcXVpcmsgbGlzdAorICoJQG92ZXJyaWRlOiBleHBsaWNpdCBxdWlyayB2YWx1ZSAob3ZlcnJpZGVzIGlmIG5vdCBBQzk3X1RVTkVfREVGQVVMVCkKKyAqCisgKglEbyBzb21lIHdvcmthcm91bmQgZm9yIGVhY2ggcGNpIGRldmljZSwgc3VjaCBhcyByZW5hbWluZyBvZiB0aGUKKyAqCWhlYWRwaG9uZSAodHJ1ZSBsaW5lLW91dCkgY29udHJvbCBhcyAiTWFzdGVyIi4KKyAqCVRoZSBxdWlyay1saXN0IG11c3QgYmUgdGVybWluYXRlZCB3aXRoIGEgemVyby1maWxsZWQgZW50cnkuCisgKgorICoJUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCisKK2ludCBhYzk3X3R1bmVfaGFyZHdhcmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBhYzk3X3F1aXJrICpxdWlyaywgaW50IG92ZXJyaWRlKQoreworCWludCByZXN1bHQ7CisKKwlpZiAoIXF1aXJrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvdmVycmlkZSAhPSBBQzk3X1RVTkVfREVGQVVMVCkgeworCQlyZXN1bHQgPSBhcHBseV9xdWlyayhvdmVycmlkZSk7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJhcHBseWluZyBxdWlyayB0eXBlICVkIGZhaWxlZCAoJWQpXG4iLCBvdmVycmlkZSwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlmb3IgKDsgcXVpcmstPnZlbmRvcjsgcXVpcmsrKykgeworCQlpZiAocXVpcmstPnZlbmRvciAhPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yKQorCQkJY29udGludWU7CisJCWlmICgoISBxdWlyay0+bWFzayAmJiBxdWlyay0+ZGV2aWNlID09IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHx8CisJCSAgICBxdWlyay0+ZGV2aWNlID09IChxdWlyay0+bWFzayAmIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpKSB7CisjaWZkZWYgREVCVUcKKwkJCXByaW50aygiYWM5NyBxdWlyayBmb3IgJXMgKCUwNHg6JTA0eClcbiIsIHF1aXJrLT5uYW1lLCBhYzk3LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKKyNlbmRpZgorCQkJcmVzdWx0ID0gYXBwbHlfcXVpcmsocXVpcmstPnR5cGUpOworCQkJaWYgKHJlc3VsdCA8IDApCisJCQkJcHJpbnRrKEtFUk5fRVJSICJhcHBseWluZyBxdWlyayB0eXBlICVkIGZvciAlcyBmYWlsZWQgKCVkKVxuIiwgcXVpcmstPnR5cGUsIHF1aXJrLT5uYW1lLCByZXN1bHQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoYWM5N190dW5lX2hhcmR3YXJlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjOTdfcGx1Z2luX2FkMTk4MC5jIGIvc291bmQvb3NzL2FjOTdfcGx1Z2luX2FkMTk4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTlhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYWM5N19wbHVnaW5fYWQxOTgwLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgICAgYWM5N19wbHVnaW5fYWQxOTgwLmMgIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMQorICAgdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgCisgICBpbmNsdWRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLiAKKyAgIAorICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAgIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgCisgICBkaXN0cmlidXRlZCBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoCisgICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQorICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCisgICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCisgICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcworICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorICAgCisgICBBdXRob3JzOiAJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKworICAgVGhpcyBpcyBhbiBleGFtcGxlIGNvZGVjIHBsdWdpbi4gVGhpcyBvbmUgc3dpdGNoZXMgdGhlIGNvbm5lY3Rpb25zCisgICBhcm91bmQgdG8gbWF0Y2ggdGhlIHNldHVwcyBzb21lIHZlbmRvcnMgdXNlIHdpdGggYXVkaW8gc3dpdGNoZWQgdG8KKyAgIG5vbiBzdGFuZGFyZCBmcm9udCBjb25uZWN0b3JzIG5vdCB0aGUgbm9ybWFsIHJlYXIgb25lcworCisgICBUaGlzIGNvZGUgcHJpbWFyaWx5IGV4aXN0cyB0byBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIHRoZSBjb2RlYworICAgaW50ZXJmYWNlCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorCisvKioKKyAqCWFkMTk4MF9yZW1vdmUJCS0JY29kZWMgcmVtb3ZlIGNhbGxiYWNrCisgKglAY29kZWM6IFRoZSBjb2RlYyB0aGF0IGlzIGJlaW5nIHJlbW92ZWQKKyAqCisgKglUaGlzIGNhbGxiYWNrIG9jY3VycyB3aGVuIGFuIEFDOTcgY29kZWMgaXMgYmVpbmcgcmVtb3ZlZC4gQQorICoJY29kZWMgcmVtb3ZlIGNhbGwgd2lsbCBub3Qgb2NjdXIgZm9yIGEgY29kZWMgZHVyaW5nIHRoYXQgY29kZWMKKyAqCXByb2JlIGNhbGxiYWNrLgorICoKKyAqCU1vc3QgZHJpdmVycyB3aWxsIG5lZWQgdG8gbG9jayB0aGVpciByZW1vdmUgdmVyc3VzIHRoZWlyIAorICoJdXNlIG9mIHRoZSBjb2RlYyBhZnRlciB0aGUgcHJvYmUgZnVuY3Rpb24uCisgKi8KKyAKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZDE5ODBfcmVtb3ZlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgc3RydWN0IGFjOTdfZHJpdmVyICpkcml2ZXIpCit7CisJLyogTm90aGluZyB0byBkbyBpbiB0aGUgc2ltcGxlIGV4YW1wbGUgKi8KK30KKworCisvKioKKyAqCWFkMTk4MF9wcm9iZQkJLQljb2RlYyBmb3VuZCBjYWxsYmFjaworICoJQGNvZGVjOiBhYzk3IGNvZGVjIG1hdGNoaW5nIHRoZSBpZGVudHMKKyAqCUBkcml2ZXI6IGFjOTdfZHJpdmVyIGl0IG1hdGNoZWQKKyAqCisgKglUaGlzIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGEgY29kZWMgaXMgZm91bmQgd2hpY2ggbWF0Y2hlcworICoJdGhlIGRyaXZlci4gQXQgdGhlIHBvaW50IGl0IGlzIGNhbGxlZCB0aGUgY29kZWMgaXMgYmFzaWNhbGx5CisgKglvcGVyYXRpb25hbCwgbWl4ZXIgb3BlcmF0aW9ucyBoYXZlIGJlZW4gaW5pdGlhbGlzZWQgYW5kIGNhbgorICoJYmUgb3ZlcnJpZGVuLiBDYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0LiBUaGUgZmllbGQgZHJpdmVyX3ByaXZhdGUKKyAqCWlzIGF2YWlsYWJsZSBmb3IgdGhlIGRyaXZlciB0byB1c2UgdG8gc3RvcmUgc3R1ZmYuCisgKgorICoJVGhlIGNhbGxlciBjYW4gY2xhaW0gdGhlIGRldmljZSBieSByZXR1cm5pbmcgemVybywgb3IgcmV0dXJuCisgKglhIG5lZ2F0aXZlIGVycm9yIGNvZGUuIAorICovCisgCitzdGF0aWMgaW50IGFkMTk4MF9wcm9iZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHN0cnVjdCBhYzk3X2RyaXZlciAqZHJpdmVyKQoreworCXUxNiBjb250cm9sOworCisjZGVmaW5lIEFDOTdfQURfTUlTQwkweDc2CisKKwkvKiBTd2l0Y2ggdGhlIGlucHV0cy9vdXRwdXRzIG92ZXIgKGZyb20gRGVsbCBjb2RlKSAqLworCWNvbnRyb2wgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19BRF9NSVNDKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfQURfTUlTQywgY29udHJvbCB8IDB4NDQyMCk7CisJCisJLyogV2UgY291bGQgcmVmdXNlIHRoZSBkZXZpY2Ugc2luY2Ugd2UgZG9udCBuZWVkIHRvIGhhbmcgYXJvdW5kLAorCSAgIGJ1dCB3ZSB3aWxsIGNsYWltIGl0ICovCisJcmV0dXJuIDA7Cit9CisJCisgCitzdGF0aWMgc3RydWN0IGFjOTdfZHJpdmVyIGFkMTk4MF9kcml2ZXIgPSB7CisJLmNvZGVjX2lkCT0gMHg0MTQ0NTM3MCwKKwkuY29kZWNfbWFzawk9IDB4RkZGRkZGRkYsCisJLm5hbWUJCT0gIkFEMTk4MCBleGFtcGxlIiwKKwkucHJvYmUJCT0gYWQxOTgwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQxOTgwX3JlbW92ZSksCit9OworCisvKioKKyAqCWFkMTk4MF9leGl0CQktCW1vZHVsZSBleGl0IHBhdGgKKyAqCisgKglPdXIgbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkLiBBdCB0aGlzIHBvaW50IHVucmVnaXN0ZXJfZHJpdmVyCisgKgl3aWxsIGNhbGwgYmFjayBvdXIgcmVtb3ZlIGhhbmRsZXIgZm9yIGFueSBleGlzdGluZyBjb2RlY3MuIFlvdQorICoJbWF5IG5vdCB1bnJlZ2lzdGVyX2RyaXZlciBmcm9tIGludGVycnVwdCBjb250ZXh0IG9yIGZyb20gYSAKKyAqCXByb2JlL3JlbW92ZSBjYWxsYmFjay4KKyAqLworCitzdGF0aWMgdm9pZCBhZDE5ODBfZXhpdCh2b2lkKQoreworCWFjOTdfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkMTk4MF9kcml2ZXIpOworfQorCisvKioKKyAqCWFkMTk4MF9pbml0CQktCXNldCB1cCBhZDE5ODAgaGFuZGxlcnMKKyAqCisgKglBZnRlciB3ZSBjYWxsIHRoZSByZWdpc3RlciBmdW5jdGlvbiBpdCB3aWxsIGNhbGwgb3VyIHByb2JlCisgKglmdW5jdGlvbiBmb3IgZWFjaCBleGlzdGluZyBtYXRjaGluZyBkZXZpY2UgYmVmb3JlIHJldHVybmluZyB0byB1cy4KKyAqCUFueSBkZXZpY2VzIGFwcGVhcmluZyBhZnRlcndhcmRzIHdob3NlIGlkJ3MgbWF0Y2ggdGhlIGNvZGVjX2lkCisgKgl3aWxsIGFsc28gY2F1c2UgdGhlIHByb2JlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KKyAqCVlvdSBtYXkgbm90IHJlZ2lzdGVyX2RyaXZlciBmcm9tIGludGVycnVwdCBjb250ZXh0IG9yIGZyb20gYSAKKyAqCXByb2JlL3JlbW92ZSBjYWxsYmFjay4KKyAqLworIAorc3RhdGljIGludCBhZDE5ODBfaW5pdCh2b2lkKQoreworCXJldHVybiBhYzk3X3JlZ2lzdGVyX2RyaXZlcigmYWQxOTgwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFkMTk4MF9pbml0KTsKK21vZHVsZV9leGl0KGFkMTk4MF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hY2kuYyBiL3NvdW5kL29zcy9hY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTI4YzI4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2FjaS5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogQXVkaW8gQ29tbWFuZCBJbnRlcmZhY2UgKEFDSSkgZHJpdmVyIChzb3VuZC9hY2kuYykKKyAqCisgKiBBQ0kgaXMgYSBwcm90b2NvbCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1pY3JvY29udHJvbGxlciBvbgorICogc29tZSBzb3VuZCBjYXJkcyBwcm9kdWNlZCBieSBtaXJvLCBlLmcuIHRoZSBtaXJvU09VTkQgUENNMTIgYW5kCisgKiBQQ00yMC4gVGhlIEFDSSBoYXMgYmVlbiBkZXZlbG9wZWQgZm9yIG1pcm8gYnkgTm9yYmVydG8gUGVsbGljY2kKKyAqIDxwZWxsaWNjaUBob21lLmNvbT4uIFNwZWNpYWwgdGhhbmtzIHRvIGJvdGggaGltIGFuZCBtaXJvIGZvcgorICogcHJvdmlkaW5nIHRoZSBBQ0kgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBUaGUgbWFpbiBmdW5jdGlvbiBvZiB0aGUgQUNJIGlzIHRvIGNvbnRyb2wgdGhlIG1peGVyIGFuZCB0byBnZXQgYQorICogcHJvZHVjdCBpZGVudGlmaWNhdGlvbi4gT24gdGhlIFBDTTIwLCBBQ0kgYWxzbyBjb250cm9scyB0aGUgcmFkaW8KKyAqIHR1bmVyIG9uIHRoaXMgY2FyZCwgdGhpcyBpcyBzdXBwb3J0ZWQgaW4gdGhlIFZpZGVvIGZvciBMaW51eCAKKyAqIG1pcm9wY20yMCBkcml2ZXIuCisgKiAtCisgKiBUaGlzIGlzIGEgZnVsbGZlYXR1cmVkIGltcGxlbWVudGF0aW9uLiBVbnN1cHBvcnRlZCBmZWF0dXJlcworICogYXJlIGJ1Z3MuLi4gKDoKKyAqCisgKiBJdCBpcyBub3QgbG9uZ2VyIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBtYWQxNiBtb2R1bGUgZmlyc3QuIFRoZQorICogdXNlciBpcyBjdXJyZW50bHkgcmVzcG9uc2libGUgdG8gc2V0IHRoZSBtYWQxNiBtaXhlciBjb3JyZWN0bHkuCisgKgorICogVG8gdG9nZ2xlIHRoZSBzb2xvIG1vZGUgZm9yIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbiBqdXN0IHVzZSB0aGUgT1NTCisgKiByZWNvcmQgc3dpdGNoIGZvciB0aGUgcGNtICgnd2F2ZScpIGNvbnRyb2xsZXIuICAgICAgICAgICBSb2JlcnQKKyAqIC0KKyAqCisgKiBSZXZpc2lvbiBoaXN0b3J5OgorICoKKyAqICAgMTk5NS0xMS0xMCAgTWFya3VzIEt1aG4gPG1za3VobkBjaXAuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisgKiAgICAgICAgRmlyc3QgdmVyc2lvbiB3cml0dGVuLgorICogICAxOTk1LTEyLTMxICBNYXJrdXMgS3VobgorICogICAgICAgIFNlY29uZCByZXZpc2lvbiwgZ2VuZXJhbCBjb2RlIGNsZWFudXAuCisgKiAgIDE5OTYtMDUtMTYJIEhhbm51IFNhdm9sYWluZW4KKyAqCSAgSW50ZWdyYXRlZCB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBkcml2ZXIuCisgKiAgIDE5OTYtMDUtMjggIE1hcmt1cyBLdWhuCisgKiAgICAgICAgSW5pdGlhbGl6ZSBDUzQyMzFBIG1peGVyLCBtYWtlIEFDSSBmaXJzdCBtaXhlciwKKyAqICAgICAgICB1c2UgbmV3IHByaXZhdGUgbWl4ZXIgQVBJIGZvciBzb2xvIG1vZGUuCisgKiAgIDE5OTgtMDgtMTggIFJ1dXJkIFJlaXRzbWEgPFIuQS5SZWl0c21hQHdibXQudHVkZWxmdC5ubD4KKyAqCSAgU21hbGwgbW9kaWZpY2F0aW9uIHRvIGV4cG9ydCBBQ0kgZnVuY3Rpb25zIGFuZCAKKyAqCSAgY29tcGxldGUgbW9kdWxhcmlzYXRpb24uCisgKiAgIDIwMDAtMDYtMjAgIFJvYmVydCBTaWVtZXIgPFJvYmVydC5TaWVtZXJAZ214LmRlPgorICogICAgICAgIERvbid0IGluaXRpYWxpemUgdGhlIENTNDIzMUEgbWl4ZXIgYW55bW9yZSwgc28gdGhlIGNvZGUgaXMKKyAqICAgICAgICB3b3JraW5nIGFnYWluLCBhbmQgb3RoZXIgc21hbGwgY2hhbmdlcyB0byBmaXQgaW4gdG9kYXlzCisgKiAgICAgICAga2VybmVscy4KKyAqICAgMjAwMC0wOC0yNiAgUm9iZXJ0IFNpZW1lcgorICogICAgICAgIENsZWFuIHVwIGFuZCByZXdyaXRlIGZvciAyLjQueC4gTWF5YmUgaXQncyBTTVAgc2FmZSBub3cuLi4gKDoKKyAqICAgICAgICBpb2N0bCBidWdmaXgsIGFuZCBpbnRlZ3JhdGlvbiBvZiBzb2xvLW1vZGUgaW50byBPU1MtQVBJLAorICogICAgICAgIGFkZGVkIChPU1MtbGltaXRlZCkgZXF1YWxpemVyIHN1cHBvcnQsIHJldHVybiB2YWx1ZSBidWdmaXgsCisgKiAgICAgICAgY2hhbmdlZCBwYXJhbSBhY2lfcmVzZXQgdG8gcmVzZXQsIG5ldyBwYXJhbXM6IGlkZSwgd3NzLgorICogICAyMDAxLTA0LTIwICBSb2JlcnQgU2llbWVyCisgKiAgICAgICAgZXZlbiBtb3JlIGNsZWFudXBzLi4uCisgKiAgIDIwMDEtMTAtMDggIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICogICAJICBHZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbiwgLmJzcyBvcHRpbWl6YXRpb25zLCB1c2Ugc2V0X2N1cnJlbnRfc3RhdGUKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCitpbnQgYWNpX3BvcnQ7CS8qIGFzIGRldGVybWluZWQgYnkgYml0IDQgaW4gdGhlIE9QVGkgOTI5IE1DNCByZWdpc3RlciAqLworc3RhdGljIGludCBhY2lfaWRjb2RlWzJdOwkvKiBtYW51ZmFjdHVyZXIgYW5kIHByb2R1Y3QgSUQgKi8KK2ludCBhY2lfdmVyc2lvbjsJLyogQUNJIGZpcm13YXJlIHZlcnNpb24JKi8KKworRVhQT1JUX1NZTUJPTChhY2lfcG9ydCk7CitFWFBPUlRfU1lNQk9MKGFjaV92ZXJzaW9uKTsKKworI2luY2x1ZGUgImFjaS5oIgorCisKK3N0YXRpYyBpbnQgYWNpX3NvbG87CS8qIHN0YXR1cyBiaXQgb2YgdGhlIGNhcmQgdGhhdCBjYW4ndCBiZQkJKgorCQkJICogY2hlY2tlZCB3aXRoIEFDSSB2ZXJzaW9ucyBwcmlvciB0byAweGIwCSovCitzdGF0aWMgaW50IGFjaV9hbXA7ICAgLyogc3RhdHVzIGJpdCBmb3IgcG93ZXItYW1wL2xpbmUtb3V0IGxldmVsCisJCQkgICBidXQgSSBoYXZlIG5vIGRvY3MgYWJvdXQgd2hhdCBpcyB3aGF0Li4uICovCitzdGF0aWMgaW50IGFjaV9taWNwcmVhbXA9MzsgLyogbWljcm9waG9uZSBwcmVhbXAtbGV2ZWwgdGhhdCBjYW4ndCBiZSAgICAqCisJCQkgKiBjaGVja2VkIHdpdGggQUNJIHZlcnNpb25zIHByaW9yIHRvIDB4YjAJKi8KKworc3RhdGljIGludCBtaXhlcl9kZXZpY2U7CitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBhY2lfc2VtOworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IHJlc2V0OworbW9kdWxlX3BhcmFtKHJlc2V0LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVzZXQsIldoZW4gc2V0IHRvIDEsIHJlc2V0IGFjaSBtaXhlci4iKTsKKyNlbHNlCitzdGF0aWMgaW50IHJlc2V0ID0gMTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGlkZT0tMTsKK21vZHVsZV9wYXJhbShpZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkZSwiMSBlbmFibGUsIDAgZGlzYWJsZSBpZGUtcG9ydCAtIHVudGVzdGVkIgorCQkgIiBkZWZhdWx0OiBkbyBub3RoaW5nIik7CitzdGF0aWMgaW50IHdzcz0tMTsKK21vZHVsZV9wYXJhbSh3c3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdzcywiY2hhbmdlIGJldHdlZW4gQUNJL1dTUy1taXhlcjsgdXNlIDAgYW5kIDEgLSB1bnRlc3RlZCIKKwkJICIgZGVmYXVsdDogZG8gbm90aGluZzsgZm9yIFBDTTEtcHJvIG9ubHkiKTsKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBwcmludF9iaXRzKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpbnQgajsKKwlwcmludGsoS0VSTl9ERUJVRyAiYWNpOiAiKTsKKworCWZvciAoaj03OyBqPj0wOyBqLS0pIHsKKwkJcHJpbnRrKCIlZCIsIChjID4+IGopICYgMHgxKTsKKwl9CisKKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgYnVzeSB3YWl0IGNvZGUgbm9ybWFsbHkgcmVxdWlyZXMgbGVzcyB0aGFuIDE1IGxvb3BzIGFuZAorICogcHJhY3RpY2FsbHkgYWx3YXlzIGxlc3MgdGhhbiAxMDAgbG9vcHMgb24gbXkgaTQ4Ni9EWDIgNjYgTUh6LgorICoKKyAqIFdhcm5pbmc6IFdhaXRpbmcgb24gdGhlIGdlbmVyYWwgc3RhdHVzIGZsYWcgYWZ0ZXIgcmVzZXRpbmcgdGhlIE1VVEUKKyAqIGZ1bmN0aW9uIGNhbiB0YWtlIGEgVkVSWSBsb25nIHRpbWUsIGJlY2F1c2UgdGhlIFBDTTEyIGRvZXMgc29tZSBraW5kCisgKiBvZiBmYWRlLWluIGVmZmVjdC4gRm9yIHRoaXMgcmVhc29uLCBhY2Nlc3MgdG8gdGhlIE1VVEUgZnVuY3Rpb24gaGFzCisgKiBub3QgYmVlbiBpbXBsZW1lbnRlZCBhdCBhbGwuCisgKgorICogLSBUaGUgT1NTIGludGVyZmFjZSBoYXMgbm8gbXV0ZSBvcHRpb24uIEl0IHRha2VzIGFib3V0IDMgc2Vjb25kcyB0bworICogZmFkZS1pbiBvbiBteSBQQ00yMC4gYnVzeV93YWl0KCkgaGFuZGxlcyBpdCBncmVhdCBub3cuLi4gICAgIFJvYmVydAorICovCisKK3N0YXRpYyBpbnQgYnVzeV93YWl0KHZvaWQpCit7CisJI2RlZmluZSBNSU5USU1FIDUwMAorCWxvbmcgdGltZW91dDsKKwl1bnNpZ25lZCBjaGFyIGJ5dGU7CisKKwlmb3IgKHRpbWVvdXQgPSAxOyB0aW1lb3V0IDw9IE1JTlRJTUUrMzA7IHRpbWVvdXQrKykgeworCQlpZiAoKChieXRlPWluYihCVVNZX1JFR0lTVEVSKSkgJiAxKSA9PSAwKSB7CisJCQlpZiAodGltZW91dCA+PSBNSU5USU1FKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJhY2k6IEdvdCBSRUFEWUZMQUcgaW4gcm91bmQgJWxkLlxuIiwgdGltZW91dC1NSU5USU1FKTsKKwkJCXJldHVybiBieXRlOworCQl9CisJCWlmICh0aW1lb3V0ID49IE1JTlRJTUUpIHsKKwkJCWxvbmcgb3V0PTEwKkhaOworCQkJc3dpdGNoICh0aW1lb3V0LU1JTlRJTUUpIHsKKwkJCWNhc2UgMCAuLi4gOToKKwkJCQlvdXQgLz0gMTA7CisJCQljYXNlIDEwIC4uLiAxOToKKwkJCQlvdXQgLz0gMTA7CisJCQljYXNlIDIwIC4uLiAzMDoKKwkJCQlvdXQgLz0gMTA7CisJCQlkZWZhdWx0OgorCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KG91dCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWNpOiBidXN5X3dhaXQoKSB0aW1lIG91dC5cbiIpOworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qIFRoZSBmb3VyIEFDSSBjb21tYW5kIHR5cGVzIGFyZSBmdWNrZWQgdXAuIFstOgorICogaW1wbGllZCBpczogMXcgICAgICAtIHNwZWNpYWwgY2FzZSBmb3IgSU5JVAorICogd3JpdGUgICBpczogMncxcgorICogcmVhZCAgICBpczogeCgxdzFyKSB3aGVyZSB4IGlzIDEgb3IgMiAoMSBDSEVDS19TSUcsIDEgQ0hFQ0tfU1RFUiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgVkVSU0lPTiwgMiBJRENPREUpCisgKiAgdGhlIGNvbW1hbmQgaXMgb25seSBpbiB0aGUgZmlyc3Qgd3JpdGUsIHJlc3QgaXMgcHJvdG9jb2wgb3ZlcmhlYWQKKyAqCisgKiBpbmRleGVkIGlzIHRlY2huaWNhbGx5IGEgd3JpdGUgYW5kIHVzZWQgZm9yIFNUQVRVUworICogYW5kIHRoZSBzcGVjaWFsIGNhc2UgZm9yIFRVTkUgaXM6IDN3MXIKKyAqIAorICogSGVyZSB0aGUgbmV3IGdlbmVyYWwgc2hlbWU6IFRVTkUgLS0+IGFjaV9yd19jbWQoeCwgIHksICB6KQorICogICAgICAgICAgICAgICAgaW5kZXhlZCBhbmQgd3JpdGUgLS0+IGFjaV9yd19jbWQoeCwgIHksIC0xKQorICogICAgICAgICAgIGltcGxpZWQgYW5kIHJlYWQgKHg9MSkgLS0+IGFjaV9yd19jbWQoeCwgLTEsIC0xKQorICoKKyAqIFJlYWQgKHg+PTIpIGlzIG5vdCBpbXBsZW1lbnRlZCAob25seSB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbikuCisgKiBVc2UgYWNpX2lkY29kZVsyXSBhbmQgYWNpX3ZlcnNpb24uLi4gICAgICAgICAgICAgICAgICAgIFJvYmVydAorICovCisKKy8qIFNvbWUgbm90ZXMgZm9yIGVycm9yIGRldGVjdGlvbjogdGhlb3JldGljYWxseSBpdCBpcyBwb3NzaWJsZS4KKyAqIEJ1dCBpdCBkb3VibGVzIHRoZSBJL08tdHJhZmZpYyBmcm9tIHd3KHIpIHRvIHd3d3J3KHIpIGluIHRoZSBub3JtYWwgCisgKiBjYXNlIGFuZCBkb2Vzbid0IHNlZW0gdG8gYmUgZGVzaWduZWQgZm9yIHRoYXQuLi4gICAgICAgIFJvYmVydAorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGFjaV9yYXd3cml0ZSh1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJaWYgKGJ1c3lfd2FpdCgpID49IDApIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiYWNpX3Jhd3dyaXRlKCVkKVxuIiwgYnl0ZSk7CisjZW5kaWYKKwkJb3V0YihieXRlLCBDT01NQU5EX1JFR0lTVEVSKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFjaV9yYXdyZWFkKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBieXRlOworCisJaWYgKGJ1c3lfd2FpdCgpID49IDApIHsKKwkJYnl0ZT1pbmIoU1RBVFVTX1JFR0lTVEVSKTsKKyNpZmRlZiBERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiJWQgPSBhY2lfcmF3cmVhZCgpXG4iLCBieXRlKTsKKyNlbmRpZgorCQlyZXR1cm4gYnl0ZTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FQlVTWTsKK30KKworCitpbnQgYWNpX3J3X2NtZChpbnQgd3JpdGUxLCBpbnQgd3JpdGUyLCBpbnQgd3JpdGUzKQoreworCWludCB3cml0ZVtdID0ge3dyaXRlMSwgd3JpdGUyLCB3cml0ZTN9OworCWludCByZWFkID0gLUVJTlRSLCBpOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWNpX3NlbSkpCisJCWdvdG8gb3V0OworCisJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCWlmICh3cml0ZVtpXTwgMCB8fCB3cml0ZVtpXSA+IDI1NSkKKwkJCWJyZWFrOworCQllbHNlIHsKKwkJCXJlYWQgPSBhY2lfcmF3d3JpdGUod3JpdGVbaV0pOworCQkJaWYgKHJlYWQgPCAwKQorCQkJCWdvdG8gb3V0X3VwOworCQl9CisJCQorCX0KKwkKKwlyZWFkID0gYWNpX3Jhd3JlYWQoKTsKK291dF91cDoJdXAoJmFjaV9zZW0pOworb3V0OglyZXR1cm4gcmVhZDsKK30KKworRVhQT1JUX1NZTUJPTChhY2lfcndfY21kKTsKKworc3RhdGljIGludCBzZXR2b2x1bWUoaW50IF9fdXNlciAqYXJnLCAKKwkJICAgICB1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCit7CisJaW50IHZvbCwgcmV0LCB1c2Vydm9sLCBidWY7CisKKwlfX2dldF91c2VyKHVzZXJ2b2wsIGFyZyk7CisKKwkvKiBsZWZ0IGNoYW5uZWwgKi8KKwl2b2wgPSB1c2Vydm9sICYgMHhmZjsKKwlpZiAodm9sID4gMTAwKQorCQl2b2wgPSAxMDA7CisJdm9sID0gU0NBTEUoMTAwLCAweDIwLCB2b2wpOworCWlmICgoYnVmPWFjaV93cml0ZV9jbWQobGVmdF9pbmRleCwgMHgyMCAtIHZvbCkpPDApCisJCXJldHVybiBidWY7CisJcmV0ID0gU0NBTEUoMHgyMCwgMTAwLCB2b2wpOworCisKKwkvKiByaWdodCBjaGFubmVsICovCisJdm9sID0gKHVzZXJ2b2wgPj4gOCkgJiAweGZmOworCWlmICh2b2wgPiAxMDApCisJCXZvbCA9IDEwMDsKKwl2b2wgPSBTQ0FMRSgxMDAsIDB4MjAsIHZvbCk7CisJaWYgKChidWY9YWNpX3dyaXRlX2NtZChyaWdodF9pbmRleCwgMHgyMCAtIHZvbCkpPDApCisJCXJldHVybiBidWY7CisJcmV0IHw9IFNDQUxFKDB4MjAsIDEwMCwgdm9sKSA8PCA4OworIAorCV9fcHV0X3VzZXIocmV0LCBhcmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0dm9sdW1lKGludCBfX3VzZXIgKmFyZywKKwkJICAgICB1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCit7CisJaW50IHZvbDsKKwlpbnQgYnVmOworCisJLyogbGVmdCBjaGFubmVsICovCisJaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIGxlZnRfaW5kZXgpKTwwKQorCQlyZXR1cm4gYnVmOworCXZvbCA9IFNDQUxFKDB4MjAsIDEwMCwgYnVmIDwgMHgyMCA/IDB4MjAtYnVmIDogMCk7CisJCisJLyogcmlnaHQgY2hhbm5lbCAqLworCWlmICgoYnVmPWFjaV9pbmRleGVkX2NtZChBQ0lfU1RBVFVTLCByaWdodF9pbmRleCkpPDApCisJCXJldHVybiBidWY7CisJdm9sIHw9IFNDQUxFKDB4MjAsIDEwMCwgYnVmIDwgMHgyMCA/IDB4MjAtYnVmIDogMCkgPDwgODsKKworCV9fcHV0X3VzZXIodm9sLCBhcmcpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogVGhlIGVxdWFsaXplciBpcyBzb21ld2hhdCBzdHJhbmdlIG9uIHRoZSBBQ0kuIEZyb20gLTEyZEIgdG8gKzEyZEIKKyAqIHdyaXRlOiAgMHhmZi4uZG93bi50by4uMHg4MD09MHgwMC4udXAudG8uLjB4N2YKKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlcV9vc3MyYWNpKHVuc2lnbmVkIGludCB2b2wpCit7CisJaW50IGJvb3N0PTA7CisJdW5zaWduZWQgaW50IHJldDsKKworCWlmICh2b2wgPiAxMDApCisJCXZvbCA9IDEwMDsKKwlpZiAodm9sID4gNTApIHsKKwkJdm9sIC09IDUxOworCQlib29zdD0xOworCX0KKwlpZiAoYm9vc3QpCisJCXJldD1TQ0FMRSg0OSwgMHg3ZSwgdm9sKSsxOworCWVsc2UKKwkJcmV0PTB4ZmYgLSBTQ0FMRSg1MCwgMHg3Ziwgdm9sKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlcV9hY2kyb3NzKHVuc2lnbmVkIGludCB2b2wpCit7CisJaWYgKHZvbCA8IDB4ODApCisJCXJldHVybiBTQ0FMRSgweDdmLCA1MCwgdm9sKSArIDUwOworCWVsc2UKKwkJcmV0dXJuIFNDQUxFKDB4N2YsIDUwLCAweGZmLXZvbCk7Cit9CisKKworc3RhdGljIGludCBzZXRlcXVhbGl6ZXIoaW50IF9fdXNlciAqYXJnLCAKKwkJCXVuc2lnbmVkIGNoYXIgbGVmdF9pbmRleCwgdW5zaWduZWQgY2hhciByaWdodF9pbmRleCkKK3sKKwlpbnQgYnVmOworCXVuc2lnbmVkIGludCB2b2w7CisKKwlfX2dldF91c2VyKHZvbCwgYXJnKTsKKworCS8qIGxlZnQgY2hhbm5lbCAqLworCWlmICgoYnVmPWFjaV93cml0ZV9jbWQobGVmdF9pbmRleCwgZXFfb3NzMmFjaSh2b2wgJiAweGZmKSkpPDApCisJCXJldHVybiBidWY7CisKKwkvKiByaWdodCBjaGFubmVsICovCisJaWYgKChidWY9YWNpX3dyaXRlX2NtZChyaWdodF9pbmRleCwgZXFfb3NzMmFjaSgodm9sPj44KSAmIDB4ZmYpKSk8MCkKKwkJcmV0dXJuIGJ1ZjsKKworCS8qIHRoZSBBQ0kgZXF1YWxpemVyIGlzIG1vcmUgcHJlY2lzZSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldGVxdWFsaXplcihpbnQgX191c2VyICphcmcsCisJCQl1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCit7CisJaW50IGJ1ZjsKKwl1bnNpZ25lZCBpbnQgdm9sOworCisJLyogbGVmdCBjaGFubmVsICovCisJaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIGxlZnRfaW5kZXgpKTwwKQorCQlyZXR1cm4gYnVmOworCXZvbCA9IGVxX2FjaTJvc3MoYnVmKTsKKwkKKwkvKiByaWdodCBjaGFubmVsICovCisJaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIHJpZ2h0X2luZGV4KSk8MCkKKwkJcmV0dXJuIGJ1ZjsKKwl2b2wgfD0gZXFfYWNpMm9zcyhidWYpIDw8IDg7CisKKwlfX3B1dF91c2VyKHZvbCwgYXJnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjaV9taXhlcl9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCit7CisJaW50IHZvbCwgYnVmOworCWludCBfX3VzZXIgKnAgPSBhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgorCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4MDEsIDB4MDApOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfQ0Q6CisJCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYywgMHgzNCk7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9NSUM6CisJCXJldHVybiBzZXR2b2x1bWUocCwgMHgzOCwgMHgzMCk7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9MSU5FOgorCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4MzksIDB4MzEpOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfU1lOVEg6CisJCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYiwgMHgzMyk7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9QQ006CisJCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYSwgMHgzMik7CisJY2FzZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl9SQURJTyk6IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTElORTE6ICAvKiBBVVgxIG9yIHJhZGlvICovCisJCXJldHVybiBzZXR2b2x1bWUocCwgMHgzZCwgMHgzNSk7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9MSU5FMjogIC8qIEFVWDIgKi8KKwkJcmV0dXJuIHNldHZvbHVtZShwLCAweDNlLCAweDM2KTsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0JBU1M6ICAgLyogc2V0IGJhbmQgb25lIGFuZCB0d28gKi8KKwkJaWYgKGFjaV9pZGNvZGVbMV09PSdDJykgeworCQkJaWYgKChidWY9c2V0ZXF1YWxpemVyKHAsIDB4NDgsIDB4NDApKSB8fCAKKwkJCSAgICAoYnVmPXNldGVxdWFsaXplcihwLCAweDQ5LCAweDQxKSkpOworCQkJcmV0dXJuIGJ1ZjsKKwkJfQorCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1RSRUJMRTogLyogc2V0IGJhbmQgc2l4IGFuZCBzZXZlbiAqLworCQlpZiAoYWNpX2lkY29kZVsxXT09J0MnKSB7CisJCQlpZiAoKGJ1Zj1zZXRlcXVhbGl6ZXIocCwgMHg0ZCwgMHg0NSkpIHx8IAorCQkJICAgIChidWY9c2V0ZXF1YWxpemVyKHAsIDB4NGUsIDB4NDYpKSk7CisJCQlyZXR1cm4gYnVmOworCQl9CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfSUdBSU46ICAvKiBNSUMgcHJlLWFtcCAqLworCQlpZiAoYWNpX2lkY29kZVsxXT09J0InIHx8IGFjaV9pZGNvZGVbMV09PSdDJykgeworCQkJX19nZXRfdXNlcih2b2wsIHApOworCQkJdm9sID0gdm9sICYgMHhmZjsKKwkJCWlmICh2b2wgPiAxMDApCisJCQkJdm9sID0gMTAwOworCQkJdm9sID0gU0NBTEUoMTAwLCAzLCB2b2wpOworCQkJaWYgKChidWY9YWNpX3dyaXRlX2NtZChBQ0lfV1JJVEVfSUdBSU4sIHZvbCkpPDApCisJCQkJcmV0dXJuIGJ1ZjsKKwkJCWFjaV9taWNwcmVhbXAgPSB2b2w7CisJCQl2b2wgPSBTQ0FMRSgzLCAxMDAsIHZvbCk7CisJCQl2b2wgfD0gKHZvbCA8PCA4KTsKKwkJCV9fcHV0X3VzZXIodm9sLCBwKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU46ICAvKiBQb3dlci1hbXAvbGluZS1vdXQgbGV2ZWwgKi8KKwkJaWYgKGFjaV9pZGNvZGVbMV09PSdBJyB8fCBhY2lfaWRjb2RlWzFdPT0nQicpIHsKKwkJCV9fZ2V0X3VzZXIoYnVmLCBwKTsKKwkJCWJ1ZiA9IGJ1ZiAmIDB4ZmY7CisJCQlpZiAoYnVmID4gNTApCisJCQkJdm9sID0gMTsKKwkJCWVsc2UKKwkJCQl2b2wgPSAwOworCQkJaWYgKChidWY9YWNpX3dyaXRlX2NtZChBQ0lfU0VUX1BPV0VSQU1QLCB2b2wpKTwwKQorCQkJCXJldHVybiBidWY7CisJCQlhY2lfYW1wID0gdm9sOworCQkJaWYgKGFjaV9hbXApCisJCQkJYnVmID0gKDEwMCB8fCAxMDA8PDgpOworCQkJZWxzZQorCQkJCWJ1ZiA9IDA7CisJCQlfX3B1dF91c2VyKGJ1ZiwgcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQzoKKwkJLyogaGFuZGxlIHNvbG8gbW9kZSBjb250cm9sICovCisJCV9fZ2V0X3VzZXIoYnVmLCBwKTsKKwkJLyogdW5zZXQgc29sbyB3aGVuIFJFQ1NSQyBmb3IgUENNIGlzIHJlcXVlc3RlZCAqLworCQlpZiAoYWNpX2lkY29kZVsxXT09J0InIHx8IGFjaV9pZGNvZGVbMV09PSdDJykgeworCQkJdm9sID0gIShidWYgJiBTT1VORF9NQVNLX1BDTSk7CisJCQlpZiAoKGJ1Zj1hY2lfd3JpdGVfY21kKEFDSV9TRVRfU09MT01PREUsIHZvbCkpPDApCisJCQkJcmV0dXJuIGJ1ZjsKKwkJCWFjaV9zb2xvID0gdm9sOworCQl9CisJCWJ1ZiA9IChTT1VORF9NQVNLX0NEfCBTT1VORF9NQVNLX01JQ3wgU09VTkRfTUFTS19MSU5FfAorCQkgICAgICAgU09VTkRfTUFTS19TWU5USHwgU09VTkRfTUFTS19MSU5FMik7CisJCWlmIChhY2lfaWRjb2RlWzFdID09ICdDJykgLyogUENNMjAgcmFkaW8gKi8KKwkJCWJ1ZiB8PSBTT1VORF9NQVNLX1JBRElPOworCQllbHNlCisJCQlidWYgfD0gU09VTkRfTUFTS19MSU5FMTsKKwkJaWYgKCFhY2lfc29sbykKKwkJCWJ1ZiB8PSBTT1VORF9NQVNLX1BDTTsKKwkJX19wdXRfdXNlcihidWYsIHApOworCQlyZXR1cm4gMDsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSzoKKwkJYnVmID0gKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19DRCAgICB8CisJCSAgICAgICBTT1VORF9NQVNLX01JQyAgICB8IFNPVU5EX01BU0tfTElORSAgfAorCQkgICAgICAgU09VTkRfTUFTS19TWU5USCAgfCBTT1VORF9NQVNLX1BDTSAgIHwKKwkJICAgICAgIFNPVU5EX01BU0tfTElORTIpOworCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKKwkJY2FzZSAnQyc6IC8qIFBDTTIwIHJhZGlvICovCisJCQlidWYgfD0gKFNPVU5EX01BU0tfUkFESU8gfCBTT1VORF9NQVNLX0lHQUlOIHwKKwkJCQlTT1VORF9NQVNLX0JBU1MgIHwgU09VTkRfTUFTS19UUkVCTEUpOworCQkJYnJlYWs7CisJCWNhc2UgJ0InOiAvKiBQQ00xMiAqLworCQkJYnVmIHw9IChTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19JR0FJTiB8CisJCQkJU09VTkRfTUFTS19PR0FJTik7CisJCQlicmVhazsKKwkJY2FzZSAnQSc6IC8qIFBDTTEtcHJvICovCisJCQlidWYgfD0gKFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX09HQUlOKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7CisJCX0KKwkJX19wdXRfdXNlcihidWYsIHApOworCQlyZXR1cm4gMDsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUzoKKwkJYnVmID0gKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19DRCAgICB8CisJCSAgICAgICBTT1VORF9NQVNLX01JQyAgICB8IFNPVU5EX01BU0tfTElORSAgfAorCQkgICAgICAgU09VTkRfTUFTS19TWU5USCAgfCBTT1VORF9NQVNLX1BDTSAgIHwKKwkJICAgICAgIFNPVU5EX01BU0tfTElORTIpOworCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKKwkJY2FzZSAnQyc6IC8qIFBDTTIwIHJhZGlvICovCisJCQlidWYgfD0gKFNPVU5EX01BU0tfUkFESU8gfAorCQkJCVNPVU5EX01BU0tfQkFTUyAgfCBTT1VORF9NQVNLX1RSRUJMRSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOworCQl9CisJCV9fcHV0X3VzZXIoYnVmLCBwKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6CisJCWJ1ZiA9IChTT1VORF9NQVNLX0NEfCBTT1VORF9NQVNLX01JQ3wgU09VTkRfTUFTS19MSU5FfAorCQkgICAgICAgU09VTkRfTUFTS19TWU5USHwgU09VTkRfTUFTS19MSU5FMnwgU09VTkRfTUFTS19QQ00pOworCQlpZiAoYWNpX2lkY29kZVsxXSA9PSAnQycpIC8qIFBDTTIwIHJhZGlvICovCisJCQlidWYgfD0gU09VTkRfTUFTS19SQURJTzsKKwkJZWxzZQorCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7CisKKwkJX19wdXRfdXNlcihidWYsIHApOworCQlyZXR1cm4gMDsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDU1JDOgorCQlidWYgPSAoU09VTkRfTUFTS19DRCAgICB8IFNPVU5EX01BU0tfTUlDICAgfCBTT1VORF9NQVNLX0xJTkUgIHwKKwkJICAgICAgIFNPVU5EX01BU0tfU1lOVEggfCBTT1VORF9NQVNLX0xJTkUyKTsKKwkJLyogZG8gd2UgbmVlZCBhY2lfc29sbyBvciBjYW4gSSBnZXQgaXQgZnJvbSB0aGUgQUNJPyAqLworCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKKwkJY2FzZSAnQic6IC8qIFBDTTEyICovCisJCWNhc2UgJ0MnOiAvKiBQQ00yMCByYWRpbyAqLworCQkJaWYgKGFjaV92ZXJzaW9uID49IDB4YjApIHsKKwkJCQlpZiAoKHZvbD1hY2lfcndfY21kKEFDSV9TVEFUVVMsCisJCQkJCQkgICAgQUNJX1NfR0VORVJBTCwgLTEpKTwwKQorCQkJCQlyZXR1cm4gdm9sOworCQkJCWlmICh2b2wgJiAweDIwKQorCQkJCQlidWYgfD0gU09VTkRfTUFTS19QQ007CisJCQl9CisJCQllbHNlCisJCQkJaWYgKCFhY2lfc29sbykKKwkJCQkJYnVmIHw9IFNPVU5EX01BU0tfUENNOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlidWYgfD0gU09VTkRfTUFTS19QQ007CisJCX0KKwkJaWYgKGFjaV9pZGNvZGVbMV0gPT0gJ0MnKSAvKiBQQ00yMCByYWRpbyAqLworCQkJYnVmIHw9IFNPVU5EX01BU0tfUkFESU87CisJCWVsc2UKKwkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOworCisJCV9fcHV0X3VzZXIoYnVmLCBwKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NBUFM6CisJCV9fcHV0X3VzZXIoMCwgcCk7CisJCXJldHVybiAwOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU6CisJCXJldHVybiBnZXR2b2x1bWUocCwgMHgwNCwgMHgwMyk7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NEOgorCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MGEsIDB4MDkpOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9NSUM6CisJCXJldHVybiBnZXR2b2x1bWUocCwgMHgwNiwgMHgwNSk7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkU6CisJCXJldHVybiBnZXR2b2x1bWUocCwgMHgwOCwgMHgwNyk7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NZTlRIOgorCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MGMsIDB4MGIpOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9QQ006CisJCXJldHVybiBnZXR2b2x1bWUocCwgMHgwZSwgMHgwZCk7CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JBRElPKTogLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUxOiAgLyogQVVYMSAqLworCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MTEsIDB4MTApOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9MSU5FMjogIC8qIEFVWDIgKi8KKwkJcmV0dXJuIGdldHZvbHVtZShwLCAweDEzLCAweDEyKTsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfQkFTUzogICAvKiBnZXQgYmFuZCBvbmUgKi8KKwkJaWYgKGFjaV9pZGNvZGVbMV09PSdDJykgeworCQkJcmV0dXJuIGdldGVxdWFsaXplcihwLCAweDIzLCAweDIyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfVFJFQkxFOiAvKiBnZXQgYmFuZCBzZXZlbiAqLworCQlpZiAoYWNpX2lkY29kZVsxXT09J0MnKSB7CisJCQlyZXR1cm4gZ2V0ZXF1YWxpemVyKHAsIDB4MmYsIDB4MmUpOworCQl9CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9JR0FJTjogIC8qIE1JQyBwcmUtYW1wICovCisJCWlmIChhY2lfaWRjb2RlWzFdPT0nQicgfHwgYWNpX2lkY29kZVsxXT09J0MnKSB7CisJCQkvKiBhY2lfbWljcHJlYW1wIG9yIEFDST8gKi8KKwkJCWlmIChhY2lfdmVyc2lvbiA+PSAweGIwKSB7CisJCQkJaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsCisJCQkJCQkJIEFDSV9TX1JFQURfSUdBSU4pKTwwKQorCQkJCQlyZXR1cm4gYnVmOworCQkJfQorCQkJZWxzZQorCQkJCWJ1Zj1hY2lfbWljcHJlYW1wOworCQkJdm9sID0gU0NBTEUoMywgMTAwLCBidWYgPD0gMyA/IGJ1ZiA6IDMpOworCQkJdm9sIHw9IHZvbCA8PCA4OworCQkJX19wdXRfdXNlcih2b2wsIHApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX09HQUlOOgorCQlpZiAoYWNpX2FtcCkKKwkJCWJ1ZiA9ICgxMDAgfHwgMTAwPDw4KTsKKwkJZWxzZQorCQkJYnVmID0gMDsKKwkJX19wdXRfdXNlcihidWYsIHApOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBhY2lfbWl4ZXJfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmlkICAgID0gIkFDSSIsCisJLmlvY3RsID0gYWNpX21peGVyX2lvY3RsCit9OworCisvKgorICogVGhlcmUgaXMgYWxzbyBhbiBpbnRlcm5hbCBtaXhlciBpbiB0aGUgY29kZWMgKENTNDIzMUEgb3IgQUQxODQ1KSwKKyAqIHRoYXQgZGVzZXJ2ZXMgbm8gcHVycG9zZSBpbiBhbiBBQ0kgYmFzZWQgc3lzdGVtIHdoaWNoIHVzZXMgYW4KKyAqIGV4dGVybmFsIEFDSSBjb250cm9sbGVkIHN0ZXJlbyBtaXhlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBjb2RlYworICogbWl4ZXIgaGFzIHRoZSBBVVgxIGlucHV0IHNlbGVjdGVkIGFzIHRoZSByZWNvcmRpbmcgc291cmNlLCB0aGF0IHRoZQorICogaW5wdXQgZ2FpbiBpcyBzZXQgbmVhciBtYXhpbXVtIGFuZCB0aGF0IHRoZSBvdGhlciBjaGFubmVscyBnb2luZworICogZnJvbSB0aGUgaW5wdXRzIHRvIHRoZSBjb2RlYyBvdXRwdXQgYXJlIG11dGVkLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGF0dGFjaF9hY2kodm9pZCkKK3sKKwljaGFyICpib2FyZG5hbWU7CisJaW50IGksIHJjID0gLUVCVVNZOworCisJaW5pdF9NVVRFWCgmYWNpX3NlbSk7CisKKwlvdXRiKDB4RTMsIDB4ZjhmKTsgLyogV3JpdGUgTUFEMTYgcGFzc3dvcmQgKi8KKwlhY2lfcG9ydCA9IChpbmIoMHhmOTApICYgMHgxMCkgPworCQkweDM0NDogMHgzNTQ7IC8qIEdldCBhY2lfcG9ydCBmcm9tIE1DNF9QT1JUICovCisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFjaV9wb3J0LCAzLCAic291bmQgbWl4ZXIgKEFDSSkiKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJICAgICAgICJhY2k6IEkvTyBhcmVhIDB4JTAzeC0weCUwM3ggYWxyZWFkeSB1c2VkLlxuIiwKKwkJICAgICAgIGFjaV9wb3J0LCBhY2lfcG9ydCsyKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZm9yY2UgQUNJIGludG8gYSBrbm93biBzdGF0ZSAqLworCXJjID0gLUVGQVVMVDsKKwlmb3IgKGk9MDsgaTwzOyBpKyspCisJCWlmIChhY2lfcndfY21kKEFDSV9FUlJPUl9PUCwgLTEsIC0xKTwwKQorCQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisKKwkvKiBvZmZpY2lhbCB0aGlzIGlzIG9uZSBhY2kgcmVhZCBjYWxsOiAqLworCXJjID0gLUVGQVVMVDsKKwlpZiAoKGFjaV9pZGNvZGVbMF09YWNpX3J3X2NtZChBQ0lfUkVBRF9JRENPREUsIC0xLCAtMSkpPDAgfHwKKwkgICAgKGFjaV9pZGNvZGVbMV09YWNpX3J3X2NtZChBQ0lfUkVBRF9JRENPREUsIC0xLCAtMSkpPDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhY2k6IEZhaWxlZCB0byByZWFkIGlkY29kZSBvbiAweCUwM3guXG4iLAorCQkgICAgICAgYWNpX3BvcnQpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwlpZiAoKGFjaV92ZXJzaW9uPWFjaV9yd19jbWQoQUNJX1JFQURfVkVSU0lPTiwgLTEsIC0xKSk8MCkgeworCQlwcmludGsoS0VSTl9FUlIgImFjaTogRmFpbGVkIHRvIHJlYWQgdmVyc2lvbiBvbiAweCUwM3guXG4iLAorCQkgICAgICAgYWNpX3BvcnQpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwlpZiAoYWNpX2lkY29kZVswXSA9PSAnbScpIHsKKwkJLyogSXQgbG9va3MgbGlrZSBhIG1pcm8gc291bmQgY2FyZC4gKi8KKwkJc3dpdGNoIChhY2lfaWRjb2RlWzFdKSB7CisJCWNhc2UgJ0EnOgorCQkJYm9hcmRuYW1lID0gIlBDTTEgcHJvIC8gZWFybHkgUENNMTIiOworCQkJYnJlYWs7CisJCWNhc2UgJ0InOgorCQkJYm9hcmRuYW1lID0gIlBDTTEyIjsKKwkJCWJyZWFrOworCQljYXNlICdDJzoKKwkJCWJvYXJkbmFtZSA9ICJQQ00yMCByYWRpbyI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJvYXJkbmFtZSA9ICJ1bmtub3duIG1pcm8iOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWNpOiBXYXJuaW5nOiB1bnN1cHBvcnRlZCBjYXJkISAtICIKKwkJICAgICAgICJubyBoYXJkd2FyZSwgbm8gc3BlY3MuLi5cbiIpOworCQlib2FyZG5hbWUgPSAidW5rbm93biBDYXJkaW5hbCBUZWNobm9sb2dpZXMiOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIjxBQ0kgMHglMDJ4LCBpZCAlMDJ4LyUwMnggXCIlYy8lY1wiLCAoJXMpPiBhdCAweCUwM3hcbiIsCisJICAgICAgIGFjaV92ZXJzaW9uLAorCSAgICAgICBhY2lfaWRjb2RlWzBdLCBhY2lfaWRjb2RlWzFdLAorCSAgICAgICBhY2lfaWRjb2RlWzBdLCBhY2lfaWRjb2RlWzFdLAorCSAgICAgICBib2FyZG5hbWUsIGFjaV9wb3J0KTsKKworCXJjID0gLUVCVVNZOworCWlmIChyZXNldCkgeworCQkvKiBmaXJzdCB3cml0ZSgpcyBhZnRlciByZXNldCBmYWlsIHdpdGggbXkgUENNMjAgKi8KKwkJaWYgKGFjaV9yd19jbWQoQUNJX0lOSVQsIC0xLCAtMSk8MCB8fAorCQkgICAgYWNpX3J3X2NtZChBQ0lfRVJST1JfT1AsIEFDSV9FUlJPUl9PUCwgQUNJX0VSUk9SX09QKTwwIHx8CisJCSAgICBhY2lfcndfY21kKEFDSV9FUlJPUl9PUCwgQUNJX0VSUk9SX09QLCBBQ0lfRVJST1JfT1ApPDApCisJCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwkvKiB0aGUgUENNMjAgaXMgbXV0ZWQgYWZ0ZXIgcmVzZXQgKGFuZCByZWJvb3QpICovCisJaWYgKGFjaV9yd19jbWQoQUNJX1NFVF9NVVRFLCAweDAwLCAtMSk8MCkKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisKKwlpZiAoaWRlPj0wKQorCQlpZiAoYWNpX3J3X2NtZChBQ0lfU0VUX0lERSwgIWlkZSwgLTEpPDApCisJCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwkKKwlpZiAod3NzPj0wICYmIGFjaV9pZGNvZGVbMV09PSdBJykKKwkJaWYgKGFjaV9yd19jbWQoQUNJX1NFVF9XU1MsICEhd3NzLCAtMSk8MCkKKwkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCisJbWl4ZXJfZGV2aWNlID0gc291bmRfaW5zdGFsbF9taXhlcihNSVhFUl9EUklWRVJfVkVSU0lPTiwgYm9hcmRuYW1lLAorCQkJCQkgICAmYWNpX21peGVyX29wZXJhdGlvbnMsCisJCQkJCSAgIHNpemVvZihhY2lfbWl4ZXJfb3BlcmF0aW9ucyksIE5VTEwpOworCXJjID0gMDsKKwlpZiAobWl4ZXJfZGV2aWNlIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFjaTogRmFpbGVkIHRvIGluc3RhbGwgbWl4ZXIuXG4iKTsKKwkJcmMgPSBtaXhlcl9kZXZpY2U7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0gLyogZWxzZSBNYXliZSBpbml0aWFsaXplIHRoZSBDUzQyMzFBIG1peGVyIGhlcmUuLi4gKi8KK291dDoJcmV0dXJuIHJjOworb3V0X3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKGFjaV9wb3J0LCAzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9hY2kodm9pZCkKK3sKKwlzb3VuZF91bmxvYWRfbWl4ZXJkZXYobWl4ZXJfZGV2aWNlKTsKKwlyZWxlYXNlX3JlZ2lvbihhY2lfcG9ydCwgMyk7Cit9CisKK21vZHVsZV9pbml0KGF0dGFjaF9hY2kpOworbW9kdWxlX2V4aXQodW5sb2FkX2FjaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWNpLmggYi9zb3VuZC9vc3MvYWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxMDJlZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hY2kuaApAQCAtMCwwICsxLDU3IEBACisjaWZuZGVmIF9BQ0lfSF8KKyNkZWZpbmUgX0FDSV9IXworCitleHRlcm4gaW50IGFjaV9wb3J0OworZXh0ZXJuIGludCBhY2lfdmVyc2lvbjsJCS8qIEFDSSBmaXJtd2FyZSB2ZXJzaW9uCSovCitleHRlcm4gaW50IGFjaV9yd19jbWQoaW50IHdyaXRlMSwgaW50IHdyaXRlMiwgaW50IHdyaXRlMyk7CisKKyNkZWZpbmUgYWNpX2luZGV4ZWRfY21kKGEsIGIpIGFjaV9yd19jbWQoYSwgYiwgLTEpCisjZGVmaW5lIGFjaV93cml0ZV9jbWQoYSwgYikgICBhY2lfcndfY21kKGEsIGIsIC0xKQorI2RlZmluZSBhY2lfcmVhZF9jbWQoYSkgICAgICAgYWNpX3J3X2NtZChhLC0xLCAtMSkKKworI2RlZmluZSBDT01NQU5EX1JFR0lTVEVSICAgIChhY2lfcG9ydCkgICAgICAvKiB3cml0ZSByZWdpc3RlciAqLworI2RlZmluZSBTVEFUVVNfUkVHSVNURVIgICAgIChhY2lfcG9ydCArIDEpICAvKiByZWFkIHJlZ2lzdGVyICovCisjZGVmaW5lIEJVU1lfUkVHSVNURVIgICAgICAgKGFjaV9wb3J0ICsgMikgIC8qIGFsc28gdXNlZCBmb3IgcmRzICovCisKKyNkZWZpbmUgUkRTX1JFR0lTVEVSICAgICAgICBCVVNZX1JFR0lTVEVSCisKKyNkZWZpbmUgQUNJX1NFVF9NVVRFICAgICAgICAgIDB4MGQKKyNkZWZpbmUgQUNJX1NFVF9QT1dFUkFNUCAgICAgIDB4MGYKKyNkZWZpbmUgQUNJX1NFVF9UVU5FUk1VVEUgICAgIDB4YTMKKyNkZWZpbmUgQUNJX1NFVF9UVU5FUk1PTk8gICAgIDB4YTQKKyNkZWZpbmUgQUNJX1NFVF9JREUgICAgICAgICAgIDB4ZDAKKyNkZWZpbmUgQUNJX1NFVF9XU1MgICAgICAgICAgIDB4ZDEKKyNkZWZpbmUgQUNJX1NFVF9TT0xPTU9ERSAgICAgIDB4ZDIKKyNkZWZpbmUgQUNJX1dSSVRFX0lHQUlOICAgICAgIDB4MDMKKyNkZWZpbmUgQUNJX1dSSVRFX1RVTkUgICAgICAgIDB4YTcKKyNkZWZpbmUgQUNJX1JFQURfVFVORVJTVEVSRU8gIDB4YTgKKyNkZWZpbmUgQUNJX1JFQURfVFVORVJTVEFUSU9OIDB4YTkKKyNkZWZpbmUgQUNJX1JFQURfVkVSU0lPTiAgICAgIDB4ZjEKKyNkZWZpbmUgQUNJX1JFQURfSURDT0RFICAgICAgIDB4ZjIKKyNkZWZpbmUgQUNJX0lOSVQgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgQUNJX1NUQVRVUyAgICAgICAgICAgIDB4ZjAKKyNkZWZpbmUgICAgIEFDSV9TX0dFTkVSQUwgICAgIDB4MDAKKyNkZWZpbmUgICAgIEFDSV9TX1JFQURfSUdBSU4gIDB4MjEKKyNkZWZpbmUgQUNJX0VSUk9SX09QICAgICAgICAgIDB4ZGYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm8gU0NBTEUgY2FuIGJlIHVzZWQgdG8gc2NhbGUgb25lIGludGVnZXIgdm9sdW1lCisgKiB2YWx1ZSBpbnRvIGFub3RoZXIgb25lIHVzaW5nIG9ubHkgaW50ZWdlciBhcml0aG1ldGljLiBJZiB0aGUgaW5wdXQKKyAqIHZhbHVlIHggaXMgaW4gdGhlIHJhbmdlIDAgPD0geCA8PSB4bWF4LCB0aGVuIHRoZSByZXN1bHQgd2lsbCBiZSBpbgorICogdGhlIHJhbmdlIDAgPD0gU0NBTEUoeG1heCx5bWF4LHgpIDw9IHltYXguCisgKgorICogVGhpcyBtYWNybyBoYXMgZm9yIGFsbCB4bWF4LCB5bWF4ID4gMCBhbmQgYWxsIDAgPD0geCA8PSB4bWF4IHRoZQorICogZm9sbG93aW5nIG5pY2UgcHJvcGVydGllczoKKyAqCisgKiAtIFNDQUxFKHhtYXgseW1heCx4bWF4KSA9IHltYXgKKyAqIC0gU0NBTEUoeG1heCx5bWF4LDApID0gMAorICogLSBTQ0FMRSh4bWF4LHltYXgsU0NBTEUoeW1heCx4bWF4LFNDQUxFKHhtYXgseW1heCx4KSkpID0gU0NBTEUoeG1heCx5bWF4LHgpCisgKgorICogSW4gYWRkaXRpb24sIHRoZSByb3VuZGluZyBlcnJvciBpcyBtaW5pbWFsIGFuZCBuaWNlbHkgZGlzdHJpYnV0ZWQuCisgKiBUaGUgcHJvb2ZzIGFyZSBsZWZ0IGFzIGFuIGV4ZXJjaXNlIHRvIHRoZSByZWFkZXIuCisgKi8KKworI2RlZmluZSBTQ0FMRSh4bWF4LHltYXgseCkgKCgoeCkqKHltYXgpKyh4bWF4KS8yKS8oeG1heCkpCisKKworI2VuZGlmICAvKiBfQUNJX0hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODE2LmMgYi9zb3VuZC9vc3MvYWQxODE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkYWU1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hZDE4MTYuYwpAQCAtMCwwICsxLDEzNjkgQEAKKy8qCisgKgorICogQUQxODE2IGxvd2xldmVsIHNvdW5kIGRyaXZlciBmb3IgTGludXggMi42LjAgYW5kIGFib3ZlCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDMgYnkgVGhvcnN0ZW4gS25hYmUgPGxpbnV4QHRob3JzdGVuLWtuYWJlLmRlPgorICoKKyAqIEJhc2VkIG9uIHRoZSBDUzQyMzIvQUQxODQ4IGRyaXZlciBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk2CisgKgorICoKKyAqIHZlcnNpb246IDEuNQorICogc3RhdHVzOiBiZXRhCisgKiBkYXRlOiAyMDAzLzA3LzE1CisgKgorICogQ2hhbmdlczoKKyAqCU9sZWcgRHJva2luOiBTb21lIGNsZWFudXAgb2YgbG9hZC91bmxvYWQgZnVuY3Rpb25zLgkxOTk4LzExLzI0CisgKgkKKyAqCVRob3JzdGVuIEtuYWJlOiBhdHRhY2ggYW5kIHVubG9hZCByZXdyaXR0ZW4sIAorICoJc29tZSBhcmd1bWVudCBjaGVja3MgYWRkZWQJCQkJMTk5OC8xMS8zMAorICoKKyAqCVRob3JzdGVuIEtuYWJlOiBCdWdneSBpc2EgYnJpZGdlIHdvcmthcm91bmQgYWRkZWQJMTk5OS8wMS8xNgorICoJCisgKglEYXZpZCBNb2V3cy9UaG9yc3RlbiBLbmFiZTogSW50cm9kdWNlZCBvcHRpb25zIAorICoJcGFyYW1ldGVyLiBBZGRlZCBzbGlnaHRseSBtb2RpZmllZCBwYXRjaCBmcm9tIAorICoJRGF2aWQgTW9ld3MgdG8gZGlzYWJsZSBkc3AgYXVkaW8gc291cmNlcyBieSBzZXR0aW5nIAorICoJYml0IDAgb2Ygb3B0aW9ucyBwYXJhbWV0ZXIuIFRoaXMgc2VlbXMgdG8gYmUKKyAqCXJlcXVpcmVkIGJ5IHNvbWUgQXp0ZWNoL05ld2NvbSBTQy0xNiBjYXJkcy4JCTE5OTkvMDQvMTgKKyAqCisgKglDaHJpc3RvcGggSGVsbHdpZzogQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdC4JMjAwMC8wMy8wMworICoKKyAqCUNocmlzdG9waCBIZWxsd2lnOiBBZGRlZCBpc2FwbnAgc3VwcG9ydAkJCTIwMDAvMDMvMTUKKyAqCisgKglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG86IGdldCByaWQgb2YgY2hlY2tfcmVnaW9uCTIwMDEvMTAvMDcKKyAqICAgICAgCisgKiAgICAgIFRob3JzdGVuIEtuYWJlOiBDb21waWxpbmcgd2l0aCBDT05GSUdfUE5QIGVuYWJsZWQKKyAqCXdvcmtzIGFnYWluLiBJdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIG1vcmUgdGhhbiBvbmUgCisgKglBRDE4MTYgc291bmQgY2FyZC4gU2FtcGxlIHJhdGUgbm93IG1heSBiZSBjaGFuZ2VkIGR1cmluZworICoJcGxheWJhY2svY2FwdHVyZS4gcHJpbnRrKCkgdXNlcyBsb2cgbGV2ZWxzIGV2ZXJ5d2hlcmUuCisgKglTTVAgZml4ZXMuIERNQSBoYW5kbGluZyBmaXhlcy4KKyAqCU90aGVyIG1pbm9yIGNvZGUgY2xlYW51cC4JCQkJMjAwMy8wNy8xNQorICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2RlZmluZSBERUJVR05PSVNFKHgpCisKKyNkZWZpbmUgQ0hFQ0tfRk9SX1BPV0VSIHsgaW50IHRpbWVvdXQ9MTAwOyBcCisgIHdoaWxlICh0aW1lb3V0ID4gMCAmJiAoaW5iKGRldmMtPmJhc2UpJjB4ODApIT0gMHg4MCkge1wKKyAgICAgICAgICB0aW1lb3V0LS07IFwKKyAgfSBcCisgIGlmICh0aW1lb3V0PT0wKSB7XAorICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogQ2hlY2sgZm9yIHBvd2VyIGZhaWxlZCBpbiAlcyBsaW5lOiAlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7IFwKKyAgfSBcCit9CisKKy8qIHN0cnVjdHVyZSB0byBob2xkIGRldmljZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgICAgaW50ICAgICAgICAgICAgYmFzZTsgICAgICAgICAgLyogc2V0IGluIGF0dGFjaCAqLworCWludCAgICAgICAgICAgIGlycTsKKwlpbnQgICAgICAgICAgICBkbWFfcGxheWJhY2s7CisgICAgICAgIGludCAgICAgICAgICAgIGRtYV9jYXB0dXJlOworICAKKwlpbnQgICAgICAgICAgICBvcGVuZWQ7ICAgICAgICAgLyogb3BlbiAqLworICAgICAgICBpbnQgICAgICAgICAgICBzcGVlZDsJCisJaW50ICAgICAgICAgICAgY2hhbm5lbHM7CisJaW50ICAgICAgICAgICAgYXVkaW9fZm9ybWF0OworICAgICAgICBpbnQgICAgICAgICAgICBhdWRpb19tb2RlOyAKKyAgCisgICAgICAgIGludCAgICAgICAgICAgIHJlY21hc2s7ICAgICAgICAvKiBzZXR1cCAqLworCXVuc2lnbmVkIGNoYXIgIGZvcm1hdF9iaXRzOworCWludCAgICAgICAgICAgIHN1cHBvcnRlZF9kZXZpY2VzOworCWludCAgICAgICAgICAgIHN1cHBvcnRlZF9yZWNfZGV2aWNlczsKKwl1bnNpZ25lZCBzaG9ydCBsZXZlbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXTsKKwkJCQkJLyogbWlzYyAqLworCXN0cnVjdCBwbnBfZGV2ICpwbnBkZXY7CSAvKiBjb25maWd1cmVkIHZpYSBwbnAgKi8KKyAgICAgICAgaW50ICAgICAgICAgICAgZGV2X25vOyAgIC8qIHRoaXMgaXMgdGhlICMgaW4gYXVkaW9fZGV2cyBhbmQgTk9UIAorCQkJCSAgICBpbiBhZDE4MTZfaW5mbyAqLworCXNwaW5sb2NrX3QJbG9jazsgIAorfSBhZDE4MTZfaW5mbzsKKworc3RhdGljIGludCBucl9hZDE4MTZfZGV2czsKK3N0YXRpYyBpbnQgYWQxODE2X2Nsb2NrZnJlcSA9IDMzMDAwOworc3RhdGljIGludCBvcHRpb25zOworCisvKiBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0cyAqLworc3RhdGljIGludCAgYWRfZm9ybWF0X21hc2sgPQorQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9TMTZfQkUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVc7CisKKy8qIGFycmF5IG9mIGRldmljZSBpbmZvIHN0cnVjdHVyZXMgKi8KK3N0YXRpYyBhZDE4MTZfaW5mbyBkZXZfaW5mb1tNQVhfQVVESU9fREVWXTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGZ1bmN0aW9ucyBmb3IgZWFzaWVyIGFjY2VzcyB0byBpbmRlcmVjdCByZWdpc3RlcnMgKi8KKworc3RhdGljIGludCBhZF9yZWFkIChhZDE4MTZfaW5mbyAqIGRldmMsIGludCByZWcpCit7CisJaW50IHJlc3VsdDsKKwkKKwlDSEVDS19GT1JfUE9XRVI7CisJb3V0YiAoKHVuc2lnbmVkIGNoYXIpIChyZWcgJiAweDNmKSwgZGV2Yy0+YmFzZSswKTsKKwlyZXN1bHQgPSBpbmIoZGV2Yy0+YmFzZSsyKTsKKwlyZXN1bHQrPSBpbmIoZGV2Yy0+YmFzZSszKTw8ODsKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKKworc3RhdGljIHZvaWQgYWRfd3JpdGUgKGFkMTgxNl9pbmZvICogZGV2YywgaW50IHJlZywgaW50IGRhdGEpCit7CisJQ0hFQ0tfRk9SX1BPV0VSOworCW91dGIgKCh1bnNpZ25lZCBjaGFyKSAocmVnICYgMHhmZiksIGRldmMtPmJhc2UrMCk7CisJb3V0YiAoKHVuc2lnbmVkIGNoYXIpIChkYXRhICYgMHhmZiksZGV2Yy0+YmFzZSsyKTsKKwlvdXRiICgodW5zaWduZWQgY2hhcikgKChkYXRhPj44KSYweGZmKSxkZXZjLT5iYXNlKzMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGZ1bmN0aW9uIGludGVyZmFjZSByZXF1aXJlZCBieSBzdHJ1Y3QgYXVkaW9fZHJpdmVyICovCisKK3N0YXRpYyB2b2lkIGFkMTgxNl9oYWx0X2lucHV0IChpbnQgZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyOworCQorCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogaGFsdF9pbnB1dCBjYWxsZWRcbiIpKTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7IAorCQorCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkgeworCSAgICAgICAgZGlzYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEpOworCX0KKwkKKwlidWZmZXI9aW5iKGRldmMtPmJhc2UrOSk7CisJaWYgKGJ1ZmZlciAmIDB4MDEpIHsKKwkJLyogZGlzYWJsZSBjYXB0dXJlICovCisJCW91dGIoYnVmZmVyICYgfjB4MDEsZGV2Yy0+YmFzZSs5KTsgCisJfQorCisJaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KSB7CisJICAgICAgICBlbmFibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hKTsKKwl9CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJb3V0YiAofjB4NDAsIGRldmMtPmJhc2UrMSk7CQorCQorCWRldmMtPmF1ZGlvX21vZGUgJj0gflBDTV9FTkFCTEVfSU5QVVQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTgxNl9oYWx0X291dHB1dCAoaW50IGRldikKK3sKKwl1bnNpZ25lZCBsb25nICBmbGFnczsKKwlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJCisJdW5zaWduZWQgY2hhciBidWZmZXI7CisKKwlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IGhhbHRfb3V0cHV0IGNhbGxlZCFcbiIpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsgCisJLyogTXV0ZSBwY20gb3V0cHV0ICovCisJYWRfd3JpdGUoZGV2YywgNCwgYWRfcmVhZChkZXZjLDQpfDB4ODA4MCk7CisKKwlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpIHsKKwkgICAgICAgIGRpc2FibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSk7CisJfQorCisJYnVmZmVyPWluYihkZXZjLT5iYXNlKzgpOworCWlmIChidWZmZXIgJiAweDAxKSB7CisJCS8qIGRpc2FibGUgY2FwdHVyZSAqLworCQlvdXRiKGJ1ZmZlciAmIH4weDAxLGRldmMtPmJhc2UrOCk7IAorCX0KKworCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkgeworCSAgICAgICAgZW5hYmxlX2RtYShhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEpOworCX0KKworCS8qIENsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwlvdXRiICgodW5zaWduZWQgY2hhcil+MHg4MCwgZGV2Yy0+YmFzZSsxKTsJCisKKwlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWQxODE2X291dHB1dF9ibG9jayAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIAorCQkJCSBpbnQgY291bnQsIGludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgY250OworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwkKKwlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IG91dHB1dF9ibG9jayBjYWxsZWQgYnVmPSVsZCBjb3VudD0lZCBmbGFncz0lZFxuIixidWYsY291bnQsaW50cmZsYWcpKTsKKyAgCisJY250ID0gY291bnQvNCAtIDE7CisgIAorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkKKwkvKiBzZXQgdHJhbnNmZXIgY291bnQgKi8KKwlhZF93cml0ZSAoZGV2YywgOCwgY250ICYgMHhmZmZmKTsgCisJCisJZGV2Yy0+YXVkaW9fbW9kZSB8PSBQQ01fRU5BQkxFX09VVFBVVDsgCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgYWQxODE2X3N0YXJ0X2lucHV0IChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IGNvdW50LAorCQkJCWludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgIGNudDsKKwlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJCisJREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBzdGFydF9pbnB1dCBjYWxsZWQgYnVmPSVsZCBjb3VudD0lZCBmbGFncz0lZFxuIixidWYsY291bnQsaW50cmZsYWcpKTsKKworCWNudCA9IGNvdW50LzQgLSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCisJLyogc2V0IHRyYW5zZmVyIGNvdW50ICovCisJYWRfd3JpdGUgKGRldmMsIDEwLCBjbnQgJiAweGZmZmYpOyAKKwlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYWQxODE2X3ByZXBhcmVfZm9yX2lucHV0IChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZnJlcTsKKwlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJdW5zaWduZWQgY2hhciBmbXRfYml0czsKKwkKKwlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IHByZXBhcmVfZm9yX2lucHV0IGNhbGxlZDogYnNpemU9JWQgYmNvdW50PSVkXG4iLGJzaXplLGJjb3VudCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWZtdF9iaXRzPSAoZGV2Yy0+Zm9ybWF0X2JpdHMmMHg3KTw8MzsKKwkKKwkvKiBzZXQgbW9uby9zdGVyZW8gbW9kZSAqLworCWlmIChkZXZjLT5jaGFubmVscyA+IDEpIHsKKwkJZm10X2JpdHMgfD0weDQ7CisJfQorCS8qIHNldCBNb25vL1N0ZXJlbyBpbiBwbGF5YmFjay9jYXB0dXJlIHJlZ2lzdGVyICovCisJb3V0YiggKGluYihkZXZjLT5iYXNlKzgpICYgfjB4M0MpfGZtdF9iaXRzLCBkZXZjLT5iYXNlKzgpOyAKKwlvdXRiKCAoaW5iKGRldmMtPmJhc2UrOSkgJiB+MHgzQyl8Zm10X2JpdHMsIGRldmMtPmJhc2UrOSk7CisKKwlmcmVxPSgodW5zaWduZWQgaW50KWRldmMtPnNwZWVkKjMzMDAwKS9hZDE4MTZfY2xvY2tmcmVxOyAKKworCS8qIHdyaXRlIHBsYXliYWNrL2NhcHR1cmUgc3BlZWRzICovCisJYWRfd3JpdGUgKGRldmMsIDIsIGZyZXEgJiAweGZmZmYpOwkKKwlhZF93cml0ZSAoZGV2YywgMywgZnJlcSAmIDB4ZmZmZik7CQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwlhZDE4MTZfaGFsdF9pbnB1dChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkMTgxNl9wcmVwYXJlX2Zvcl9vdXRwdXQgKGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBmcmVxOworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBjaGFyIGZtdF9iaXRzOworCisJREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBwcmVwYXJlX2Zvcl9vdXRwdXQgY2FsbGVkOiBic2l6ZT0lZCBiY291bnQ9JWRcbiIsYnNpemUsYmNvdW50KSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwlmbXRfYml0cz0gKGRldmMtPmZvcm1hdF9iaXRzJjB4Nyk8PDM7CisJLyogc2V0IG1vbm8vc3RlcmVvIG1vZGUgKi8KKwlpZiAoZGV2Yy0+Y2hhbm5lbHMgPiAxKSB7CisJCWZtdF9iaXRzIHw9MHg0OworCX0KKworCS8qIHdyaXRlIGZvcm1hdCBiaXRzIHRvIHBsYXliYWNrL2NhcHR1cmUgcmVnaXN0ZXJzICovCisJb3V0YiggKGluYihkZXZjLT5iYXNlKzgpICYgfjB4M0MpfGZtdF9iaXRzLCBkZXZjLT5iYXNlKzgpOyAKKwlvdXRiKCAoaW5iKGRldmMtPmJhc2UrOSkgJiB+MHgzQyl8Zm10X2JpdHMsIGRldmMtPmJhc2UrOSk7CisgIAorCWZyZXE9KCh1bnNpZ25lZCBpbnQpZGV2Yy0+c3BlZWQqMzMwMDApL2FkMTgxNl9jbG9ja2ZyZXE7IAorCQorCS8qIHdyaXRlIHBsYXliYWNrL2NhcHR1cmUgc3BlZWRzICovCisJYWRfd3JpdGUgKGRldmMsIDIsIGZyZXEgJiAweGZmZmYpOworCWFkX3dyaXRlIChkZXZjLCAzLCBmcmVxICYgMHhmZmZmKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQorCWFkMTgxNl9oYWx0X291dHB1dChkZXYpOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIGFkMTgxNl90cmlnZ2VyIChpbnQgZGV2LCBpbnQgc3RhdGUpIAoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiB0cmlnZ2VyIGNhbGxlZCEgKGRldmM9JWQsZGV2Yy0+YmFzZT0lZFxuIiwgZGV2YywgZGV2Yy0+YmFzZSkpOworCisJLyogbW9kZSBtYXkgaGF2ZSBjaGFuZ2VkICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwkvKiBtYXNrIG91dCBtb2RlcyBub3Qgc3BlY2lmaWVkIG9uIG9wZW4gY2FsbCAqLworCXN0YXRlICY9IGRldmMtPmF1ZGlvX21vZGU7IAorCQkJCQorCS8qIHNldHVwIHNvdW5kY2hpcCB0byBuZXcgaW8tbW9kZSAqLworCWlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJLyogZW5hYmxlIGNhcHR1cmUgKi8KKwkJb3V0YihpbmIoZGV2Yy0+YmFzZSs5KXwweDAxLCBkZXZjLT5iYXNlKzkpOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgY2FwdHVyZSAqLworCQlvdXRiKGluYihkZXZjLT5iYXNlKzkpJn4weDAxLCBkZXZjLT5iYXNlKzkpOworCX0KKworCWlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCS8qIGVuYWJsZSBwbGF5YmFjayAqLworCQlvdXRiKGluYihkZXZjLT5iYXNlKzgpfDB4MDEsIGRldmMtPmJhc2UrOCk7CisJCS8qIHVubXV0ZSBwY20gb3V0cHV0ICovCisJCWFkX3dyaXRlKGRldmMsIDQsIGFkX3JlYWQoZGV2Yyw0KSZ+MHg4MDgwKTsKKwl9IGVsc2UgeworCQkvKiBtdXRlIHBjbSBvdXRwdXQgKi8KKwkJYWRfd3JpdGUoZGV2YywgNCwgYWRfcmVhZChkZXZjLDQpfDB4ODA4MCk7CisJCS8qIGRpc2FibGUgY2FwdHVyZSAqLworCQlvdXRiKGluYihkZXZjLT5iYXNlKzgpJn4weDAxLCBkZXZjLT5iYXNlKzgpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworCisvKiBoYWx0IGlucHV0ICYgb3V0cHV0ICovCitzdGF0aWMgdm9pZCBhZDE4MTZfaGFsdCAoaW50IGRldikKK3sKKwlhZDE4MTZfaGFsdF9pbnB1dChkZXYpOworCWFkMTgxNl9oYWx0X291dHB1dChkZXYpOworfQorCitzdGF0aWMgdm9pZCBhZDE4MTZfcmVzZXQgKGludCBkZXYpCit7CisJYWQxODE2X2hhbHQgKGRldik7Cit9CisKKy8qIHNldCBwbGF5YmFjayBzcGVlZCAqLworc3RhdGljIGludCBhZDE4MTZfc2V0X3NwZWVkIChpbnQgZGV2LCBpbnQgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGZyZXE7CisJaW50IHJldDsKKworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWlmIChhcmcgPT0gMCkgeworCQlyZXQgPSBkZXZjLT5zcGVlZDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiByYW5nZSBjaGVja2luZyAqLworCWlmIChhcmcgPCA0MDAwKSB7CisJCWFyZyA9IDQwMDA7CisJfQorCWlmIChhcmcgPiA1NTAwMCkgeworCQlhcmcgPSA1NTAwMDsKKwl9CisJZGV2Yy0+c3BlZWQgPSBhcmc7CisKKwkvKiBjaGFuZ2Ugc3BlZWQgZHVyaW5nIHBsYXliYWNrICovCisJZnJlcT0oKHVuc2lnbmVkIGludClkZXZjLT5zcGVlZCozMzAwMCkvYWQxODE2X2Nsb2NrZnJlcTsgCisJLyogd3JpdGUgcGxheWJhY2svY2FwdHVyZSBzcGVlZHMgKi8KKwlhZF93cml0ZSAoZGV2YywgMiwgZnJlcSAmIDB4ZmZmZik7CQorCWFkX3dyaXRlIChkZXZjLCAzLCBmcmVxICYgMHhmZmZmKTsJCisKKwlyZXQgPSBkZXZjLT5zcGVlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFkMTgxNl9zZXRfYml0cyAoaW50IGRldiwgdW5zaWduZWQgaW50IGFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwkKKwlzdGF0aWMgc3RydWN0IGZvcm1hdF90YmwgeworCQlpbnQgICAgICAgICAgICAgZm9ybWF0OworCQl1bnNpZ25lZCBjaGFyICAgYml0czsKKwl9IGZvcm1hdDJiaXRzW10gPSB7CisJCXsgMCwgMCB9LAorCQl7IEFGTVRfTVVfTEFXLCAxIH0sCisJCXsgQUZNVF9BX0xBVywgMyB9LAorCQl7IEFGTVRfSU1BX0FEUENNLCAwIH0sCisJCXsgQUZNVF9VOCwgMCB9LAorCQl7IEFGTVRfUzE2X0xFLCAyIH0sCisJCXsgQUZNVF9TMTZfQkUsIDYgfSwKKwkJeyBBRk1UX1M4LCAwIH0sCisJCXsgQUZNVF9VMTZfTEUsIDAgfSwKKwkJeyBBRk1UX1UxNl9CRSwgMCB9CisgIAl9OworCisJaW50ICBpLCBuID0gc2l6ZW9mIChmb3JtYXQyYml0cykgLyBzaXplb2YgKHN0cnVjdCBmb3JtYXRfdGJsKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJLyogcmV0dXJuIGN1cnJlbnQgZm9ybWF0ICovCisJaWYgKGFyZyA9PSAwKSB7CisJICAJYXJnID0gZGV2Yy0+YXVkaW9fZm9ybWF0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBhcmc7CisJfQorCWRldmMtPmF1ZGlvX2Zvcm1hdCA9IGFyZzsKKworCS8qIHNlYXJjaCBtYXRjaGluZyBmb3JtYXQgYml0cyAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWlmIChmb3JtYXQyYml0c1tpXS5mb3JtYXQgPT0gYXJnKSB7CisJCQlkZXZjLT5mb3JtYXRfYml0cyA9IGZvcm1hdDJiaXRzW2ldLmJpdHM7CisJCQlkZXZjLT5hdWRpb19mb3JtYXQgPSBhcmc7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gYXJnOworCQl9CisKKwkvKiBTdGlsbCBoYW5naW5nIGhlcmUuIFNvbWV0aGluZyBtdXN0IGJlIHRlcnJpYmx5IHdyb25nICovCisJZGV2Yy0+Zm9ybWF0X2JpdHMgPSAwOworCWRldmMtPmF1ZGlvX2Zvcm1hdCA9IEFGTVRfVTg7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCXJldHVybihBRk1UX1U4KTsgCit9CisKK3N0YXRpYyBzaG9ydCBhZDE4MTZfc2V0X2NoYW5uZWxzIChpbnQgZGV2LCBzaG9ydCBhcmcpCit7CisJYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGFyZyAhPSAxICYmIGFyZyAhPSAyKQorCQlyZXR1cm4gZGV2Yy0+Y2hhbm5lbHM7CisKKwlkZXZjLT5jaGFubmVscyA9IGFyZzsKKwlyZXR1cm4gYXJnOworfQorCisvKiBvcGVuIGRldmljZSAqLworc3RhdGljIGludCBhZDE4MTZfb3BlbiAoaW50IGRldiwgaW50IG1vZGUpIAoreworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwkvKiBpcyBkZXZpY2UgbnVtYmVyIHZhbGlkID8gKi8KKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX2F1ZGlvZGV2cykKKwkJcmV0dXJuIC0oRU5YSU8pOworCisJLyogZ2V0IGRldmljZSBpbmZvIG9mIHRoaXMgZGV2ICovCisJZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7IAorCisJLyogbWFrZSBjaGVjayBpZiBkZXZpY2UgYWxyZWFkeSBvcGVuIGF0b21pYyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWlmIChkZXZjLT5vcGVuZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCXJldHVybiAtKEVCVVNZKTsKKwl9CisKKwkvKiBtYXJrIGRldmljZSBhcyBvcGVuICovCisJZGV2Yy0+b3BlbmVkID0gMTsgCisKKwlkZXZjLT5hdWRpb19tb2RlID0gMDsKKwlkZXZjLT5zcGVlZCA9IDgwMDA7CisJZGV2Yy0+YXVkaW9fZm9ybWF0PUFGTVRfVTg7CisJZGV2Yy0+Y2hhbm5lbHM9MTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlhZDE4MTZfcmVzZXQoZGV2Yy0+ZGV2X25vKTsgLyogaGFsdCBhbGwgcGVuZGluZyBvdXRwdXQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWQxODE2X2Nsb3NlIChpbnQgZGV2KSAvKiBjbG9zZSBkZXZpY2UgKi8KK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCS8qIGhhbHQgYWxsIHBlbmRpbmcgb3V0cHV0ICovCisJYWQxODE2X3Jlc2V0KGRldmMtPmRldl9ubyk7IAorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWRldmMtPm9wZW5lZCA9IDA7CisJZGV2Yy0+YXVkaW9fbW9kZSA9IDA7CisJZGV2Yy0+c3BlZWQgPSA4MDAwOworCWRldmMtPmF1ZGlvX2Zvcm1hdD1BRk1UX1U4OworCWRldmMtPmZvcm1hdF9iaXRzID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEF1ZGlvIGRyaXZlciBzdHJ1Y3R1cmUgKi8KKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgYWQxODE2X2F1ZGlvX2RyaXZlciA9Cit7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gYWQxODE2X29wZW4sCisJLmNsb3NlCQkJPSBhZDE4MTZfY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBhZDE4MTZfb3V0cHV0X2Jsb2NrLAorCS5zdGFydF9pbnB1dAkJPSBhZDE4MTZfc3RhcnRfaW5wdXQsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gYWQxODE2X3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBhZDE4MTZfcHJlcGFyZV9mb3Jfb3V0cHV0LAorCS5oYWx0X2lvCQk9IGFkMTgxNl9oYWx0LAorCS5oYWx0X2lucHV0CQk9IGFkMTgxNl9oYWx0X2lucHV0LAorCS5oYWx0X291dHB1dAkJPSBhZDE4MTZfaGFsdF9vdXRwdXQsCisJLnRyaWdnZXIJCT0gYWQxODE2X3RyaWdnZXIsCisJLnNldF9zcGVlZAkJPSBhZDE4MTZfc2V0X3NwZWVkLAorCS5zZXRfYml0cwkJPSBhZDE4MTZfc2V0X2JpdHMsCisJLnNldF9jaGFubmVscwkJPSBhZDE4MTZfc2V0X2NoYW5uZWxzLAorfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEludGVycnVwdCBoYW5kbGVyICovCisKKworc3RhdGljIGlycXJldHVybl90IGFkMTgxNl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KQoreworCXVuc2lnbmVkIGNoYXIJc3RhdHVzOworCWFkMTgxNl9pbmZvCSpkZXZjID0gKGFkMTgxNl9pbmZvICopZGV2X2lkOworCQorCWlmIChpcnEgPCAwIHx8IGlycSA+IDE1KSB7CisJICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IEdvdCBib2d1cyBpbnRlcnJ1cHQgJWRcbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzcGluX2xvY2soJmRldmMtPmxvY2spOworCisJLyogcmVhZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKwlzdGF0dXMgPSBpbmIgKGRldmMtPmJhc2UrMSk7IAorCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHQgICovCisJb3V0YiAofnN0YXR1cywgZGV2Yy0+YmFzZSsxKTsJCisKKwlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IEdvdCBpbnRlcnJ1cHQgc3ViY2xhc3MgJWRcbiIsc3RhdHVzKSk7CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBpbnRlcnJ1cHQ6IEdvdCBpbnRlcnJ1cHQsIGJ1dCBubyBzb3VyY2UuXG4iKSk7CisJCXNwaW5fdW5sb2NrKCZkZXZjLT5sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChkZXZjLT5vcGVuZWQgJiYgKGRldmMtPmF1ZGlvX21vZGUgJiBQQ01fRU5BQkxFX0lOUFVUKSAmJiAoc3RhdHVzJjY0KSkKKwkJRE1BYnVmX2lucHV0aW50ciAoZGV2Yy0+ZGV2X25vKTsKKworCWlmIChkZXZjLT5vcGVuZWQgJiYgKGRldmMtPmF1ZGlvX21vZGUgJiBQQ01fRU5BQkxFX09VVFBVVCkgJiYgKHN0YXR1cyAmIDEyOCkpCisJCURNQWJ1Zl9vdXRwdXRpbnRyIChkZXZjLT5kZXZfbm8sIDEpOworCisJc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBNaXhlciBzdHVmZiAqLworCitzdHJ1Y3QgbWl4ZXJfZGVmIHsKKwl1bnNpZ25lZCBpbnQgcmVnbm86IDc7CisJdW5zaWduZWQgaW50IHBvbGFyaXR5OjE7CS8qIDA9bm9ybWFsLCAxPXJldmVyc2VkICovCisJdW5zaWduZWQgaW50IGJpdHBvczo0OworCXVuc2lnbmVkIGludCBuYml0czo0OworfTsKKworc3RhdGljIGNoYXIgbWl4X2N2dFsxMDFdID0geworCSAwLCAwLCAzLCA3LDEwLDEzLDE2LDE5LDIxLDIzLDI2LDI4LDMwLDMyLDM0LDM1LDM3LDM5LDQwLDQyLAorCTQzLDQ1LDQ2LDQ3LDQ5LDUwLDUxLDUyLDUzLDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LAorCTY1LDY2LDY3LDY4LDY5LDcwLDcwLDcxLDcyLDczLDczLDc0LDc1LDc1LDc2LDc3LDc3LDc4LDc5LDc5LAorCTgwLDgxLDgxLDgyLDgyLDgzLDg0LDg0LDg1LDg1LDg2LDg2LDg3LDg3LDg4LDg4LDg5LDg5LDkwLDkwLAorCTkxLDkxLDkyLDkyLDkzLDkzLDk0LDk0LDk1LDk1LDk2LDk2LDk2LDk3LDk3LDk4LDk4LDk4LDk5LDk5LAorCTEwMAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4ZXJfZGVmIG1peGVyX2VudDsKKworLyoKKyAqIE1vc3Qgb2YgdGhlIG1peGVyIGVudHJpZXMgd29yayBpbiBiYWNrd2FyZHMuIFNldHRpbmcgdGhlIHBvbGFyaXR5IGZpZWxkCisgKiBtYWtlcyB0aGVtIHRvIHdvcmsgY29ycmVjdGx5LgorICoKKyAqIFRoZSBjaGFubmVsIG51bWJlcmluZyB1c2VkIGJ5IGluZGl2aWR1YWwgc291bmRjYXJkcyBpcyBub3QgZml4ZWQuIFNvbWUKKyAqIGNhcmRzIGhhdmUgYXNzaWduZWQgZGlmZmVyZW50IG1lYW5pbmdzIGZvciB0aGUgQVVYMSwgQVVYMiBhbmQgTElORSBpbnB1dHMuCisgKiBUaGUgY3VycmVudCB2ZXJzaW9uIGRvZXNuJ3QgdHJ5IHRvIGNvbXBlbnNhdGUgdGhpcy4KKyAqLworCisjZGVmaW5lIE1JWF9FTlQobmFtZSwgcmVnX2wsIHBvbGFfbCwgcG9zX2wsIGxlbl9sLCByZWdfciwgcG9sYV9yLCBwb3NfciwgbGVuX3IpCVwKKyAge3tyZWdfbCwgcG9sYV9sLCBwb3NfbCwgbGVuX2x9LCB7cmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yfX0KKworCittaXhlcl9lbnQgbWl4X2RldmljZXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXVsyXSA9IHsKK01JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkxNCwgMSwgOCwgNSwJMTQsIDEsIDAsIDUpLAorTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9UUkVCTEUsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkgNSwgMSwgOCwgNiwJIDUsIDEsIDAsIDYpLAorTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCSA0LCAxLCA4LCA2LAkgNCwgMSwgMCwgNiksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NQRUFLRVIsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTE4LCAxLCA4LCA1LAkxOCwgMSwgMCwgNSksCitNSVhfRU5UKFNPVU5EX01JWEVSX01JQywJMTksIDEsIDgsIDUsCTE5LCAxLCAwLCA1KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQ0QsCSAJMTUsIDEsIDgsIDUsCTE1LCAxLCAwLCA1KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQUxUUENNLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCTIwLCAwLCA4LCA0LAkyMCwgMCwgMCwgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9PR0FJTiwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsIAkxNywgMSwgOCwgNSwJMTcsIDEsIDAsIDUpLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMiwJMTYsIDEsIDgsIDUsCTE2LCAxLCAwLCA1KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsICAgICAgMzksIDAsIDksIDQsICAgIDM5LCAxLCAwLCA1KQorfTsKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZGVmYXVsdF9taXhlcl9sZXZlbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9Cit7CisJMHg0MzQzLAkJLyogTWFzdGVyIFZvbHVtZSAqLworCTB4MzIzMiwJCS8qIEJhc3MgKi8KKwkweDMyMzIsCQkvKiBUcmVibGUgKi8KKwkweDAwMDAsCQkvKiBGTSAqLworCTB4NDM0MywJCS8qIFBDTSAqLworCTB4MDAwMCwJCS8qIFBDIFNwZWFrZXIgKi8KKwkweDAwMDAsCQkvKiBFeHQgTGluZSAqLworCTB4MDAwMCwJCS8qIE1pYyAqLworCTB4MDAwMCwJCS8qIENEICovCisJMHgwMDAwLAkJLyogUmVjb3JkaW5nIG1vbml0b3IgKi8KKwkweDAwMDAsCQkvKiBTQiBQQ00gKi8KKwkweDAwMDAsCQkvKiBSZWNvcmRpbmcgbGV2ZWwgKi8KKwkweDAwMDAsCQkvKiBJbnB1dCBnYWluICovCisJMHgwMDAwLAkJLyogT3V0cHV0IGdhaW4gKi8KKwkweDAwMDAsCQkvKiBMaW5lMSAqLworCTB4MDAwMCwJCS8qIExpbmUyICovCisJMHgwMDAwCQkvKiBMaW5lMyAodXN1YWxseSBsaW5lIGluKSovCit9OworCisjZGVmaW5lIExFRlRfQ0hOCTAKKyNkZWZpbmUgUklHSFRfQ0hOCTEKKworCisKK3N0YXRpYyBpbnQKK2FkMTgxNl9zZXRfcmVjbWFzayAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgbWFzaykKK3sKKyAgCXVuc2lnbmVkIGxvbmcgCWZsYWdzOworCXVuc2lnbmVkIGNoYXIgICByZWNkZXY7CisJaW50ICAgICAgICAgICAgIGksIG47CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwltYXNrICY9IGRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlczsKKwkKKwluID0gMDsKKwkvKiBDb3VudCBzZWxlY3RlZCBkZXZpY2UgYml0cyAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlpZiAobWFzayAmICgxIDw8IGkpKQorCQkJbisrOworCQorCWlmIChuID09IDApCisJCW1hc2sgPSBTT1VORF9NQVNLX01JQzsKKwllbHNlIGlmIChuICE9IDEpIHsgLyogVG9vIG1hbnkgZGV2aWNlcyBzZWxlY3RlZCAqLworCQkvKiBGaWx0ZXIgb3V0IGFjdGl2ZSBzZXR0aW5ncyAqLworCQltYXNrICY9IH5kZXZjLT5yZWNtYXNrOwkKKwkJCisJCW4gPSAwOworCQkvKiBDb3VudCBzZWxlY3RlZCBkZXZpY2UgYml0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgCisJCQlpZiAobWFzayAmICgxIDw8IGkpKQorCQkJCW4rKzsKKwkJCisJCWlmIChuICE9IDEpCisJCQltYXNrID0gU09VTkRfTUFTS19NSUM7CisJfQorCQorCXN3aXRjaCAobWFzaykgeworCWNhc2UgU09VTkRfTUFTS19NSUM6CisJCXJlY2RldiA9IDU7CisJCWJyZWFrOworCQkKKwljYXNlIFNPVU5EX01BU0tfTElORToKKwkJcmVjZGV2ID0gMDsKKwkJYnJlYWs7CisJCQorCWNhc2UgU09VTkRfTUFTS19DRDoKKwkJcmVjZGV2ID0gMjsKKwkJYnJlYWs7CisJCQorCWNhc2UgU09VTkRfTUFTS19MSU5FMToKKwkJcmVjZGV2ID0gNDsKKwkJYnJlYWs7CisJCQorCWNhc2UgU09VTkRfTUFTS19MSU5FMjoKKwkJcmVjZGV2ID0gMzsKKwkJYnJlYWs7CisJCQorCWNhc2UgU09VTkRfTUFTS19WT0xVTUU6CisJCXJlY2RldiA9IDE7CisJCWJyZWFrOworCQkKKwlkZWZhdWx0OgorCQltYXNrID0gU09VTkRfTUFTS19NSUM7CisJCXJlY2RldiA9IDU7CisJfQorCQorCXJlY2RldiA8PD0gNDsKKwlhZF93cml0ZSAoZGV2YywgMjAsIAorCQkgIChhZF9yZWFkIChkZXZjLCAyMCkgJiAweDhmOGYpIHwgcmVjZGV2IHwgKHJlY2Rldjw8OCkpOworCisJZGV2Yy0+cmVjbWFzayA9IG1hc2s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgdm9pZAorY2hhbmdlX2JpdHMgKGludCAqcmVndmFsLCBpbnQgZGV2LCBpbnQgY2huLCBpbnQgbmV3dmFsKQoreworCXVuc2lnbmVkIGNoYXIgICBtYXNrOworCWludCAgICAgICAgICAgICBzaGlmdDsKKyAgCisJLyogUmV2ZXJzZSBwb2xhcml0eSovCisKKwlpZiAobWl4X2RldmljZXNbZGV2XVtjaG5dLnBvbGFyaXR5ID09IDEpIAorCQluZXd2YWwgPSAxMDAgLSBuZXd2YWw7CisKKwltYXNrID0gKDEgPDwgbWl4X2RldmljZXNbZGV2XVtjaG5dLm5iaXRzKSAtIDE7CisJc2hpZnQgPSBtaXhfZGV2aWNlc1tkZXZdW2Nobl0uYml0cG9zOworCS8qIFNjYWxlIGl0ICovCisJbmV3dmFsID0gKGludCkgKChuZXd2YWwgKiBtYXNrKSArIDUwKSAvIDEwMDsJCisJLyogQ2xlYXIgYml0cyAqLworCSpyZWd2YWwgJj0gfihtYXNrIDw8IHNoaWZ0KTsJCisJLyogU2V0IG5ldyB2YWx1ZSAqLworCSpyZWd2YWwgfD0gKG5ld3ZhbCAmIG1hc2spIDw8IHNoaWZ0OwkKK30KKworc3RhdGljIGludAorYWQxODE2X21peGVyX2dldCAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgZGV2KQoreworCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogbWl4ZXJfZ2V0IGNhbGxlZCFcbiIpKTsKKwkKKwkvKiByYW5nZSBjaGVjayArIHN1cHBvcnRlZCBtaXhlciBjaGVjayAqLworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgKQorCSAgICAgICAgcmV0dXJuICgtKEVJTlZBTCkpOworCWlmICghKCgxIDw8IGRldikgJiBkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcykpCisJCXJldHVybiAtKEVJTlZBTCk7CisJCisJcmV0dXJuIGRldmMtPmxldmVsc1tkZXZdOworfQorCitzdGF0aWMgaW50CithZDE4MTZfbWl4ZXJfc2V0IChhZDE4MTZfaW5mbyAqIGRldmMsIGludCBkZXYsIGludCB2YWx1ZSkKK3sKKwlpbnQgICBsZWZ0ID0gdmFsdWUgJiAweDAwMDAwMGZmOworCWludCAgIHJpZ2h0ID0gKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4gODsKKwlpbnQgICByZXR2b2w7CisKKwlpbnQgICByZWdvZmZzOworCWludCAgIHZhbDsKKwlpbnQgICB2YWxtdXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IG1peGVyX3NldCBjYWxsZWQhXG4iKSk7CisJCisJaWYgKGRldiA8IDAgfHwgZGV2ID49IFNPVU5EX01JWEVSX05SREVWSUNFUyApCisJCXJldHVybiAtKEVJTlZBTCk7CisKKwlpZiAobGVmdCA+IDEwMCkKKwkJbGVmdCA9IDEwMDsKKwlpZiAobGVmdCA8IDApCisJCWxlZnQgPSAwOworCWlmIChyaWdodCA+IDEwMCkKKwkJcmlnaHQgPSAxMDA7CisJaWYgKHJpZ2h0IDwgMCkKKwkJcmlnaHQgPSAwOworCQorCS8qIE1vbm8gY29udHJvbCAqLworCWlmIChtaXhfZGV2aWNlc1tkZXZdW1JJR0hUX0NITl0ubmJpdHMgPT0gMCkgCisJCXJpZ2h0ID0gbGVmdDsKKwlyZXR2b2wgPSBsZWZ0IHwgKHJpZ2h0IDw8IDgpOworCQorCS8qIFNjYWxlIGl0ICovCisJCisJbGVmdCA9IG1peF9jdnRbbGVmdF07CisJcmlnaHQgPSBtaXhfY3Z0W3JpZ2h0XTsKKworCS8qIHJlamVjdCBhbGwgbWl4ZXJzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoIShkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmICgxIDw8IGRldikpKQorCQlyZXR1cm4gLShFSU5WQUwpOworCQorCS8qIHNhbml0eSBjaGVjayAqLworCWlmIChtaXhfZGV2aWNlc1tkZXZdW0xFRlRfQ0hOXS5uYml0cyA9PSAwKQorCQlyZXR1cm4gLShFSU5WQUwpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisKKwkvKiBrZWVwIHByZWNpc2Ugdm9sdW1lIGludGVybmFsICovCisJZGV2Yy0+bGV2ZWxzW2Rldl0gPSByZXR2b2w7CisKKwkvKiBTZXQgdGhlIGxlZnQgY2hhbm5lbCAqLworCXJlZ29mZnMgPSBtaXhfZGV2aWNlc1tkZXZdW0xFRlRfQ0hOXS5yZWdubzsKKwl2YWwgPSBhZF9yZWFkIChkZXZjLCByZWdvZmZzKTsKKwljaGFuZ2VfYml0cyAoJnZhbCwgZGV2LCBMRUZUX0NITiwgbGVmdCk7CisKKwl2YWxtdXRlPXZhbDsKKworCS8qIE11dGUgYml0IG1hc2tpbmcgb24gc29tZSByZWdpc3RlcnMgKi8KKwlpZiAoIHJlZ29mZnM9PTUgfHwgcmVnb2Zmcz09MTQgfHwgcmVnb2Zmcz09MTUgfHwKKwkgICAgIHJlZ29mZnM9PTE2IHx8IHJlZ29mZnM9PTE3IHx8IHJlZ29mZnM9PTE4IHx8IAorCSAgICAgcmVnb2Zmcz09MTkgfHwgcmVnb2Zmcz09MzkpIHsKKwkJaWYgKGxlZnQ9PTApCisJCQl2YWxtdXRlIHw9IDB4ODAwMDsKKwkJZWxzZQorCQkJdmFsbXV0ZSAmPSB+MHg4MDAwOworCX0KKwlhZF93cml0ZSAoZGV2YywgcmVnb2ZmcywgdmFsbXV0ZSk7IC8qIG11dGUgKi8KKworCS8qCisJICogU2V0IHRoZSByaWdodCBjaGFubmVsCisJICovCisgCisJLyogV2FzIGp1c3QgYSBtb25vIGNoYW5uZWwgKi8KKwlpZiAobWl4X2RldmljZXNbZGV2XVtSSUdIVF9DSE5dLm5iaXRzID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0dm9sOwkJCisJfQorCisJcmVnb2ZmcyA9IG1peF9kZXZpY2VzW2Rldl1bUklHSFRfQ0hOXS5yZWdubzsKKwl2YWwgPSBhZF9yZWFkIChkZXZjLCByZWdvZmZzKTsKKwljaGFuZ2VfYml0cyAoJnZhbCwgZGV2LCBSSUdIVF9DSE4sIHJpZ2h0KTsKKworCXZhbG11dGU9dmFsOworCWlmICggcmVnb2Zmcz09NSB8fCByZWdvZmZzPT0xNCB8fCByZWdvZmZzPT0xNSB8fAorCSAgICAgcmVnb2Zmcz09MTYgfHwgcmVnb2Zmcz09MTcgfHwgcmVnb2Zmcz09MTggfHwgCisJICAgICByZWdvZmZzPT0xOSB8fCByZWdvZmZzPT0zOSkgeworCQlpZiAocmlnaHQ9PTApCisJCQl2YWxtdXRlIHw9IDB4ODA7CisJCWVsc2UKKwkJCXZhbG11dGUgJj0gfjB4ODA7CisJfQorCWFkX3dyaXRlIChkZXZjLCByZWdvZmZzLCB2YWxtdXRlKTsgLyogbXV0ZSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAJcmV0dXJuIHJldHZvbDsKK30KKworI2RlZmluZSBNSVhFUl9ERVZJQ0VTICggU09VTkRfTUFTS19WT0xVTUUgfCBcCisJCQlTT1VORF9NQVNLX1NZTlRIIHwgXAorCQkJU09VTkRfTUFTS19QQ00gfCBcCisJCQlTT1VORF9NQVNLX0xJTkUgfCBcCisJCQlTT1VORF9NQVNLX0xJTkUxIHwgXAorCQkJU09VTkRfTUFTS19MSU5FMiB8IFwKKwkJCVNPVU5EX01BU0tfTElORTMgfCBcCisJCQlTT1VORF9NQVNLX01JQyB8IFwKKwkJCVNPVU5EX01BU0tfQ0QgfCBcCisJCQlTT1VORF9NQVNLX1JFQ0xFViAgXAorCQkJKQorI2RlZmluZSBSRUNfREVWSUNFUyAoIFNPVU5EX01BU0tfTElORTIgfFwKKwkJICAgICAgU09VTkRfTUFTS19MSU5FIHxcCisJCSAgICAgIFNPVU5EX01BU0tfTElORTEgfFwKKwkJICAgICAgU09VTkRfTUFTS19NSUMgfFwKKwkJICAgICAgU09VTkRfTUFTS19DRCB8XAorCQkgICAgICBTT1VORF9NQVNLX1ZPTFVNRSBcCisJCSAgICAgICkKKyAgICAgCitzdGF0aWMgdm9pZAorYWQxODE2X21peGVyX3Jlc2V0IChhZDE4MTZfaW5mbyAqIGRldmMpCit7CisJaW50ICBpOworCisJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSBNSVhFUl9ERVZJQ0VTOworCQorCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyA9IFJFQ19ERVZJQ0VTOworCisJZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQlpZiAoZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJiAoMSA8PCBpKSkKKwkJCWFkMTgxNl9taXhlcl9zZXQgKGRldmMsIGksIGRlZmF1bHRfbWl4ZXJfbGV2ZWxzW2ldKTsKKwlhZDE4MTZfc2V0X3JlY21hc2sgKGRldmMsIFNPVU5EX01BU0tfTUlDKTsKK30KKworc3RhdGljIGludAorYWQxODE2X21peGVyX2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKK3sKKwlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IG1peGVyX2RldnNbZGV2XS0+ZGV2YzsKKwlpbnQgdmFsOworCWludCBfX3VzZXIgKnAgPSBhcmc7CisgIAorCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogbWl4ZXJfaW9jdGwgY2FsbGVkIVxuIikpOworICAKKwkvKiBNaXhlciBpb2N0bCAqLworCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpID09ICdNJykgeyAKKwkJCisJCS8qIHNldCBpb2N0bCAqLworCQlpZiAoX1NJT0NfRElSIChjbWQpICYgX1NJT0NfV1JJVEUpIHsgCisJCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpeworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQkJCisJCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXZhbD1hZDE4MTZfc2V0X3JlY21hc2sgKGRldmMsIHZhbCk7CisJCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQkJYnJlYWs7CisJCQkJCisJCQlkZWZhdWx0OgorCQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoKHZhbD1hZDE4MTZfbWl4ZXJfc2V0IChkZXZjLCBjbWQgJiAweGZmLCB2YWwpKTwwKQorCQkJCSAgICAgICAgcmV0dXJuIHZhbDsKKwkJCQllbHNlCisJCQkJICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCX0KKwkJfSBlbHNlIHsgCisJCQkvKiByZWFkIGlvY3RsICovCisJCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpIHsKKwkJCQkKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCXZhbD1kZXZjLT5yZWNtYXNrOworCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJCXZhbD1kZXZjLT5zdXBwb3J0ZWRfZGV2aWNlczsKKwkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJCXZhbD1kZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmIH4oU09VTkRfTUFTS19TUEVBS0VSIHwgU09VTkRfTUFTS19JTUlYKTsKKwkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJCQl2YWw9ZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOworCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJCXZhbD1TT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWRlZmF1bHQ6CisJCQkgICAgICAgIGlmICgodmFsPWFkMTgxNl9taXhlcl9nZXQgKGRldmMsIGNtZCAmIDB4ZmYpKTwwKQorCQkJCSAgICAgICAgcmV0dXJuIHZhbDsKKwkJCQllbHNlCisJCQkJICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQkvKiBub3QgZm9yIG1peGVyICovCisJCXJldHVybiAtKEVJTlZBTCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTWl4ZXIgc3RydWN0dXJlICovCisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBhZDE4MTZfbWl4ZXJfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWQJPSAiQUQxODE2IiwKKwkubmFtZQk9ICJBRDE4MTYgTWl4ZXIiLAorCS5pb2N0bAk9IGFkMTgxNl9taXhlcl9pb2N0bAorfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHN0dWZmIGZvciBjYXJkIHJlY29nbml0aW9uLCBpbml0IGFuZCB1bmxvYWRpbmcgUE5QIC4uLiovCisKKworLyogY2hlY2sgaWYgQUQxODE2IHByZXNlbnQgYXQgc3BlY2lmaWVkIGh3X2NvbmZpZyBhbmQgcmVnaXN0ZXIgZGV2aWNlIHdpdGggT1MgCisgKiByZXR1cm4gMSBpZiBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBfX2luaXQgYWQxODE2X2luaXRfY2FyZCAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCAKKwlzdHJ1Y3QgcG5wX2RldiAqcG5wKQoreworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gTlVMTDsKKwlpbnQgdG1wOworCWludCBvc3NfZGV2bm8gPSAtMTsKKworCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogaW5pdGlhbGl6aW5nIGNhcmQ6IGlvPTB4JXgsIGlycT0lZCwgZG1hPSVkLCAiCisJCQkgImRtYTI9JWQsIGNsb2NrZnJlcT0lZCwgb3B0aW9ucz0lZCBpc2FkbWFidWc9JWQgIgorCQkJICIlc1xuIiwKKwkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlLAorCSAgICAgICBod19jb25maWctPmlycSwKKwkgICAgICAgaHdfY29uZmlnLT5kbWEsCisJICAgICAgIGh3X2NvbmZpZy0+ZG1hMiwKKwkgICAgICAgYWQxODE2X2Nsb2NrZnJlcSwKKwkgICAgICAgb3B0aW9ucywKKwkgICAgICAgaXNhX2RtYV9icmlkZ2VfYnVnZ3ksCisJICAgICAgIHBucD8iKFBOUCkiOiIiKTsKKworCS8qIGFkMTgxNl9pbmZvIHN0cnVjdHVyZSByZW1haW5pbmcgPyAqLworCWlmIChucl9hZDE4MTZfZGV2cyA+PSBNQVhfQVVESU9fREVWKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogbm8gbW9yZSBhZDE4MTZfaW5mbyBzdHJ1Y3R1cmVzICIKKwkJCSJsZWZ0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2YyA9ICZkZXZfaW5mb1tucl9hZDE4MTZfZGV2c107CisJZGV2Yy0+YmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKwlkZXZjLT5pcnEgPSBod19jb25maWctPmlycTsKKwlkZXZjLT5kbWFfcGxheWJhY2s9aHdfY29uZmlnLT5kbWE7CisJZGV2Yy0+ZG1hX2NhcHR1cmU9aHdfY29uZmlnLT5kbWEyOworCWRldmMtPm9wZW5lZCA9IDA7CisJZGV2Yy0+cG5wZGV2ID0gcG5wOworCXNwaW5fbG9ja19pbml0KCZkZXZjLT5sb2NrKTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oZGV2Yy0+YmFzZSwgMTYsICJBRDE4MTYgU291bmQiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IEkvTyBwb3J0IDB4JTAzeCBub3QgZnJlZVxuIiwKKwkJCQkgICAgZGV2Yy0+YmFzZSk7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogRXhhbWluaW5nIEFEMTgxNiBhdCBhZGRyZXNzIDB4JTAzeC5cbiIsIAorCQlkZXZjLT5iYXNlKTsKKwkKKworCS8qIHRlc3RzIGZvciBhZDE4MTYgKi8KKwkvKiBiYXNlKzA6IGJpdCAxIG11c3QgYmUgc2V0IGJ1dCBub3QgMjU1ICovCisJdG1wPWluYihkZXZjLT5iYXNlKTsKKwlpZiAoICh0bXAmMHg4MCk9PTAgfHwgdG1wPT0yNTUgKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiBvciBjaGlwICIKKwkJCSJpcyBub3QgYWN0aXZlIChUZXN0IDApXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJfQorCisJLyogd3JpdGVzIHRvIGlyZWcgOCBhcmUgY29waWVkIHRvIGlyZWcgOSAqLworCWFkX3dyaXRlKGRldmMsOCwxMjM0NSk7IAorCWlmIChhZF9yZWFkKGRldmMsOSkhPTEyMzQ1KSB7CisJCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDEpXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJfQorICAKKwkvKiB3cml0ZXMgdG8gaXJlZyA4IGFyZSBjb3BpZWQgdG8gaXJlZyA5ICovCisJYWRfd3JpdGUoZGV2Yyw4LDU0MzIxKTsgCisJaWYgKGFkX3JlYWQoZGV2Yyw5KSE9NTQzMjEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBDaGlwIGlzIG5vdCBhbiBBRDE4MTYgKFRlc3QgMilcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwkvKiB3cml0ZXMgdG8gaXJlZyAxMCBhcmUgY29waWVkIHRvIGlyZWcgMTEgKi8KKwlhZF93cml0ZShkZXZjLDEwLDU0MzIxKTsgCisJaWYgKGFkX3JlYWQoZGV2YywxMSkhPTU0MzIxKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCAzKVxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0KKworCS8qIHdyaXRlcyB0byBpcmVnIDEwIGFyZSBjb3BpZWQgdG8gaXJlZyAxMSAqLworCWFkX3dyaXRlKGRldmMsMTAsMTIzNDUpOyAKKwlpZiAoYWRfcmVhZChkZXZjLDExKSE9MTIzNDUpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDQpXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJfQorCisJLyogYml0IGluIGJhc2UgKzEgY2Fubm90IGJlIHNldCB0byAxICovCisJdG1wPWluYihkZXZjLT5iYXNlKzEpOworCW91dGIoMHhmZixkZXZjLT5iYXNlKzEpOyAKKwlpZiAoaW5iKGRldmMtPmJhc2UrMSkhPXRtcCkgeworCQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCA1KVxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0KKyAgCisJcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBBRDE4MTYgKHZlcnNpb24gJWQpIHN1Y2Nlc3NmdWxseSBkZXRlY3RlZCFcbiIsCisJCWFkX3JlYWQoZGV2Yyw0NSkpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWFkX3dyaXRlKGRldmMsMSwwKTsgICAgIAorCisJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJb3V0YiAoMCwgZGV2Yy0+YmFzZSsxKTsJCisKKwkvKiBhbGxvY2F0ZSBpcnEgKi8KKwlpZiAoZGV2Yy0+aXJxIDwgMCB8fCBkZXZjLT5pcnEgPiAxNSkKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJaWYgKHJlcXVlc3RfaXJxKGRldmMtPmlycSwgYWQxODE2X2ludGVycnVwdCwwLAorCQkJIlNvdW5kUG9ydCIsIGRldmMpIDwgMCkJeworCSAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBJUlEgaW4gdXNlXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJfQorCisJLyogRE1BIHN0dWZmICovCisJaWYgKHNvdW5kX2FsbG9jX2RtYSAoZGV2Yy0+ZG1hX3BsYXliYWNrLCAiU291bmQgU3lzdGVtIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBDYW4ndCBhbGxvY2F0ZSBETUElZFxuIiwKKwkJCQkgICAgZGV2Yy0+ZG1hX3BsYXliYWNrKTsKKwkJZ290byBvdXRfZnJlZV9pcnE7CisJfQorCQorCWlmICggZGV2Yy0+ZG1hX2NhcHR1cmUgPj0gMCAmJiAKKwkgIAlkZXZjLT5kbWFfY2FwdHVyZSAhPSBkZXZjLT5kbWFfcGxheWJhY2spIHsKKwkJaWYgKHNvdW5kX2FsbG9jX2RtYShkZXZjLT5kbWFfY2FwdHVyZSwKKwkJCQkgICAgIlNvdW5kIFN5c3RlbSAoY2FwdHVyZSkiKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBDYW4ndCBhbGxvY2F0ZSBETUElZFxuIiwKKwkJCQkJICAgIGRldmMtPmRtYV9jYXB0dXJlKTsKKwkJCWdvdG8gb3V0X2ZyZWVfZG1hOworCQl9CisJCWRldmMtPmF1ZGlvX21vZGU9RE1BX0FVVE9NT0RFfERNQV9EVVBMRVg7CisJfSBlbHNlIHsKKwkgIAlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IE9ubHkgb25lIERNQSBjaGFubmVsICIKKwkJCSJhdmFpbGFibGUvY29uZmlndXJlZC4gTm8gZHVwbGV4IG9wZXJhdGlvbiBwb3NzaWJsZVxuIik7CisJCWRldmMtPmF1ZGlvX21vZGU9RE1BX0FVVE9NT0RFOworCX0KKworCWNvbmZfcHJpbnRmMiAoIkFEMTgxNiBhdWRpbyBkcml2ZXIiLAorCQkgICAgICBkZXZjLT5iYXNlLCBkZXZjLT5pcnEsIGRldmMtPmRtYV9wbGF5YmFjaywgCisJCSAgICAgIGRldmMtPmRtYV9jYXB0dXJlKTsKKworCS8qIHJlZ2lzdGVyIGRldmljZSAqLworCWlmICgob3NzX2Rldm5vID0gc291bmRfaW5zdGFsbF9hdWRpb2RydiAoQVVESU9fRFJJVkVSX1ZFUlNJT04sCisJCQkJCSAgICAgICJBRDE4MTYgYXVkaW8gZHJpdmVyIiwKKwkJCQkJICAgICAgJmFkMTgxNl9hdWRpb19kcml2ZXIsCisJCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGF1ZGlvX2RyaXZlciksCisJCQkJCSAgICAgIGRldmMtPmF1ZGlvX21vZGUsCisJCQkJCSAgICAgIGFkX2Zvcm1hdF9tYXNrLAorCQkJCQkgICAgICBkZXZjLAorCQkJCQkgICAgICBkZXZjLT5kbWFfcGxheWJhY2ssIAorCQkJCQkgICAgICBkZXZjLT5kbWFfY2FwdHVyZSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IENhbid0IGluc3RhbGwgc291bmQgZHJpdmVyXG4iKTsKKwkJZ290byBvdXRfZnJlZV9kbWFfMjsKKwl9CisKKworCWFkX3dyaXRlKGRldmMsMzIsMHg4MGYwKTsgLyogc291bmQgc3lzdGVtIG1vZGUgKi8KKwlpZiAob3B0aW9ucyYxKSB7CisJICAgICAgICBhZF93cml0ZShkZXZjLDMzLDApOyAvKiBkaXNhYmxlIGFsbCBhdWRpb3NvdXJjZXMgZm9yIGRzcCAqLworCX0gZWxzZSB7CisJICAgICAgICBhZF93cml0ZShkZXZjLDMzLDB4MDNmOCk7IC8qIGVuYWJsZSBhbGwgYXVkaW9zb3VyY2VzIGZvciBkc3AgKi8KKwl9CisJYWRfd3JpdGUoZGV2Yyw0LDB4ODA4MCk7ICAvKiBkZWZhdWx0IHZhbHVlcyBmb3Igdm9sdW1lcyAobXV0ZWQpKi8KKwlhZF93cml0ZShkZXZjLDUsMHg4MDgwKTsKKwlhZF93cml0ZShkZXZjLDYsMHg4MDgwKTsKKwlhZF93cml0ZShkZXZjLDcsMHg4MDgwKTsKKwlhZF93cml0ZShkZXZjLDE1LDB4ODg4OCk7CisJYWRfd3JpdGUoZGV2YywxNiwweDg4ODgpOworCWFkX3dyaXRlKGRldmMsMTcsMHg4ODg4KTsKKwlhZF93cml0ZShkZXZjLDE4LDB4ODg4OCk7CisJYWRfd3JpdGUoZGV2YywxOSwweGM4ODgpOyAvKiArMjBkYiBtaWMgYWN0aXZlICovCisJYWRfd3JpdGUoZGV2YywxNCwweDAwMDApOyAvKiBNYXN0ZXIgdm9sdW1lIHVubXV0ZWQgKi8KKwlhZF93cml0ZShkZXZjLDM5LDB4MDA5Zik7IC8qIDNEIGVmZmVjdCBvbiAwJSBwaG9uZSBvdXQgbXV0ZWQgKi8KKwlhZF93cml0ZShkZXZjLDQ0LDB4MDA4MCk7IC8qIGV2ZXJ5dGhpbmcgb24gcG93ZXIsIDNkIGVuYWJsZWQgZm9yIGQvYSAqLworCW91dGIoMHgxMCxkZXZjLT5iYXNlKzgpOyAvKiBzZXQgZG1hIG1vZGUgKi8KKwlvdXRiKDB4MTAsZGV2Yy0+YmFzZSs5KTsKKyAgCisJLyogZW5hYmxlIGNhcHR1cmUgKyBwbGF5YmFjayBpbnRlcnJ1cHQgKi8KKwlhZF93cml0ZShkZXZjLDEsMHhjMDAwKTsgCisJCisJLyogc2V0IG1peGVyIGRlZmF1bHRzICovCisJYWQxODE2X21peGVyX3Jlc2V0IChkZXZjKTsgCisgIAorCS8qIHJlZ2lzdGVyIG1peGVyICovCisJaWYgKChhdWRpb19kZXZzW29zc19kZXZub10tPm1peGVyX2Rldj1zb3VuZF9pbnN0YWxsX21peGVyKAorCQkJCSAgICAgICBNSVhFUl9EUklWRVJfVkVSU0lPTiwKKwkJCQkgICAgICAgIkFEMTgxNiBhdWRpbyBkcml2ZXIiLAorCQkJCSAgICAgICAmYWQxODE2X21peGVyX29wZXJhdGlvbnMsCisJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLAorCQkJCSAgICAgICBkZXZjKSkgPCAwKSB7CisJICAJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgaW5zdGFsbCBtaXhlclxuIik7CisJfQorCS8qIG1ha2UgYWQxODE2X2luZm8gYWN0aXZlICovCisJbnJfYWQxODE2X2RldnMrKzsKKwlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IGNhcmQgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCFcbiIpOworCXJldHVybiAxOworCS8qIGVycm9yIGhhbmRsaW5nICovCitvdXRfZnJlZV9kbWFfMjoKKwlpZiAoZGV2Yy0+ZG1hX2NhcHR1cmUgPj0gMCAmJiBkZXZjLT5kbWFfY2FwdHVyZSAhPSBkZXZjLT5kbWFfcGxheWJhY2spCisJICAgICAgICBzb3VuZF9mcmVlX2RtYShkZXZjLT5kbWFfY2FwdHVyZSk7CitvdXRfZnJlZV9kbWE6CisJc291bmRfZnJlZV9kbWEoZGV2Yy0+ZG1hX3BsYXliYWNrKTsKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShkZXZjLT5pcnEsIGRldmMpOworb3V0X3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDE2KTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9jYXJkKGFkMTgxNl9pbmZvICpkZXZjKQoreworCWludCAgbWl4ZXIsIGRldiA9IDA7CisJCisJaWYgKGRldmMgIT0gTlVMTCkgeworCQlwcmludGsoImFkMTgxNjogVW5sb2FkaW5nIGNhcmQgYXQgYWRkcmVzcyAweCUwM3hcbiIsZGV2Yy0+YmFzZSk7CisJCQorCQlkZXYgPSBkZXZjLT5kZXZfbm87CisJCW1peGVyID0gYXVkaW9fZGV2c1tkZXZdLT5taXhlcl9kZXY7CisKKwkJLyogdW5yZWcgbWl4ZXIqLworCQlpZihtaXhlcj49MCkgeworCQkJc291bmRfdW5sb2FkX21peGVyZGV2KG1peGVyKTsKKwkJfQorCQkvKiB1bnJlZyBhdWRpb2RldiAqLworCQlzb3VuZF91bmxvYWRfYXVkaW9kZXYoZGV2KTsKKwkJCisJCS8qIGZyZWUgZG1hIGNoYW5uZWxzICovCisJCWlmIChkZXZjLT5kbWFfY2FwdHVyZT49MCAmJiAKKwkJICAJZGV2Yy0+ZG1hX2NhcHR1cmUgIT0gZGV2Yy0+ZG1hX3BsYXliYWNrKSB7CisJCQlzb3VuZF9mcmVlX2RtYShkZXZjLT5kbWFfY2FwdHVyZSk7CisJCX0KKwkJc291bmRfZnJlZV9kbWEgKGRldmMtPmRtYV9wbGF5YmFjayk7CisJCS8qIGZyZWUgaXJxICovCisJCWZyZWVfaXJxKGRldmMtPmlycSwgZGV2Yyk7CisJCS8qIGZyZWUgaW8gKi8KKwkJcmVsZWFzZV9yZWdpb24gKGRldmMtPmJhc2UsIDE2KTsKKyNpZmRlZiBfX0lTQVBOUF9fCisJCWlmIChkZXZjLT5wbnBkZXYpIHsKKwkJICAJcG5wX2Rpc2FibGVfZGV2KGRldmMtPnBucGRldik7CisJCQlwbnBfZGV2aWNlX2RldGFjaChkZXZjLT5wbnBkZXYpOworCQl9CisjZW5kaWYKKwkJCisJfSBlbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogbm8gZGV2aWNlL2NhcmQgc3BlY2lmaWVkXG4iKTsKK30KKworc3RhdGljIGludCBfX2luaXRkYXRhIGlvID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMiA9IC0xOworCisjaWZkZWYgX19JU0FQTlBfXworLyogdXNlIGlzYXBucCBmb3IgY29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCBpc2FwbnAJPSAxOworc3RhdGljIGludCBpc2FwbnBqdW1wOworbW9kdWxlX3BhcmFtKGlzYXBucCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oaXNhcG5wanVtcCwgaW50LCAwKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGFkMTgxNl9jbG9ja2ZyZXEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ob3B0aW9ucywgaW50LCAwKTsKKworI2lmZGVmIF9fSVNBUE5QX18KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IGNhcmRfdmVuZG9yLCBjYXJkX2RldmljZTsKKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7CisJdW5zaWduZWQgc2hvcnQgZnVuY3Rpb247CisJc3RydWN0IGFkMTgxNl9kYXRhICpkYXRhOworfSBpc2FwbnBfYWQxODE2X2xpc3RbXSBfX2luaXRkYXRhID0geworCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdTJyksIElTQVBOUF9GVU5DVElPTigweDcxNTApLCAKKwkJTlVMTCB9LAorCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdTJyksIElTQVBOUF9GVU5DVElPTigweDcxODApLAorCQlOVUxMIH0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGlzYXBucCwgaXNhcG5wX2FkMTgxNl9saXN0KTsKKworCitzdGF0aWMgdm9pZCBfX2luaXQgYWQxODE2X2NvbmZpZ19wbnBfY2FyZChzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQsCisJCQkJCSAgdW5zaWduZWQgc2hvcnQgdmVuZG9yLAorCQkJCQkgIHVuc2lnbmVkIHNob3J0IGZ1bmN0aW9uKQoreworCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworICAJc3RydWN0IHBucF9kZXYgKmNhcmRfZGV2ID0gcG5wX2ZpbmRfZGV2KGNhcmQsIHZlbmRvciwgZnVuY3Rpb24sIE5VTEwpOworCWlmICghY2FyZF9kZXYpIHJldHVybjsKKwlpZiAocG5wX2RldmljZV9hdHRhY2goY2FyZF9kZXYpIDwgMCkgeworCSAgCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogRmFpbGVkIHRvIGF0dGFjaCBQblAgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocG5wX2FjdGl2YXRlX2RldihjYXJkX2RldikgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogRmFpbGVkIHRvIGFjdGl2YXRlIFBuUCBkZXZpY2VcbiIpOworCQlwbnBfZGV2aWNlX2RldGFjaChjYXJkX2Rldik7CisJCXJldHVybjsKKwl9CisJY2ZnLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChjYXJkX2RldiwgMik7CisJY2ZnLmlycSA9IHBucF9pcnEoY2FyZF9kZXYsIDApOworCWNmZy5kbWEgPSBwbnBfaXJxKGNhcmRfZGV2LCAwKTsKKwljZmcuZG1hMiA9IHBucF9pcnEoY2FyZF9kZXYsIDEpOworCWlmICghYWQxODE2X2luaXRfY2FyZCgmY2ZnLCBjYXJkX2RldikpIHsKKwkgIAlwbnBfZGlzYWJsZV9kZXYoY2FyZF9kZXYpOworCQlwbnBfZGV2aWNlX2RldGFjaChjYXJkX2Rldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYWQxODE2X2NvbmZpZ19wbnBfY2FyZHModm9pZCkKK3sKKwlpbnQgbnJfcG5wX2NmZzsKKwlpbnQgaTsKKwkKKwkvKiBDb3VudCBlbnRyaWVzIGluIGlzYXBucF9hZDE4MTZfbGlzdCAqLworCWZvciAobnJfcG5wX2NmZyA9IDA7IGlzYXBucF9hZDE4MTZfbGlzdFtucl9wbnBfY2ZnXS5jYXJkX3ZlbmRvciAhPSAwOyAKKwkJbnJfcG5wX2NmZysrKTsKKwkvKiBDaGVjayBhbmQgYWRqdXN0IGlzYXBucGp1bXAgKi8KKwlpZiggaXNhcG5wanVtcCA8IDAgfHwgaXNhcG5wanVtcCA+PSBucl9wbnBfY2ZnKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkiYWQxODE2OiBWYWxpZCByYW5nZSBmb3IgaXNhcG5wanVtcCBpcyAwLSVkLiAiCisJCQkiQWRqdXN0ZWQgdG8gMC5cbiIsIG5yX3BucF9jZmctMSk7CisJCWlzYXBucGp1bXAgPSAwOworCX0KKwlmb3IgKGkgPSBpc2FwbnBqdW1wOyBpc2FwbnBfYWQxODE2X2xpc3RbaV0uY2FyZF92ZW5kb3IgIT0gMDsgaSsrKSB7CisJIAlzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQgPSBOVUxMOworCQkvKiBpdGVyYXRlIG92ZXIgYWxsIHBucCBjYXJkcyAqLwkJCisJCXdoaWxlICgoY2FyZCA9IHBucF9maW5kX2NhcmQoaXNhcG5wX2FkMTgxNl9saXN0W2ldLmNhcmRfdmVuZG9yLAorCQkgICAgICAgICAgICAgIAlpc2FwbnBfYWQxODE2X2xpc3RbaV0uY2FyZF9kZXZpY2UsIGNhcmQpKSkgCisJCQlhZDE4MTZfY29uZmlnX3BucF9jYXJkKGNhcmQsIAorCQkJCWlzYXBucF9hZDE4MTZfbGlzdFtpXS52ZW5kb3IsCisJCQkJaXNhcG5wX2FkMTgxNl9saXN0W2ldLmZ1bmN0aW9uKTsKKwl9Cit9CisjZW5kaWYKKworLyogbW9kdWxlIGluaXRpYWxpemF0aW9uICovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2FkMTgxNih2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQUQxODE2IHNvdW5kZHJpdmVyICIKKwkJCSAiQ29weXJpZ2h0IChDKSAxOTk4LTIwMDMgYnkgVGhvcnN0ZW4gS25hYmUgYW5kICIKKwkJCSAib3RoZXJzXG4iKTsKKyNpZmRlZiBBRDE4MTZfQ0xPQ0sgCisJLyogc2V0IGFkMTgxNl9jbG9ja2ZyZXEgaWYgc2V0IGR1cmluZyBjb21waWxhdGlvbiAqLworCWFkMTgxNl9jbG9ja2ZyZXE9QUQxODE2X0NMT0NLOworI2VuZGlmCisJaWYgKGFkMTgxNl9jbG9ja2ZyZXE8NTAwMCB8fCBhZDE4MTZfY2xvY2tmcmVxPjEwMDAwMCkgeworCQlhZDE4MTZfY2xvY2tmcmVxPTMzMDAwOworCX0KKworI2lmZGVmIF9fSVNBUE5QX18KKwkvKiBjb25maWd1cmUgUG5QIGNhcmRzICovCisJaWYoaXNhcG5wKSBhZDE4MTZfY29uZmlnX3BucF9jYXJkcygpOworI2VuZGlmCisJLyogY29uZmlndXJlIGNhcmQgYnkgbW9kdWxlIHBhcmFtcyAqLworCWlmIChpbyAhPSAtMSAmJiBpcnEgIT0gLTEgJiYgZG1hICE9IC0xKSB7CisJCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworCQljZmcuaW9fYmFzZSA9IGlvOworCQljZmcuaXJxID0gaXJxOworCQljZmcuZG1hID0gZG1hOworCQljZmcuZG1hMiA9IGRtYTI7CisJCWFkMTgxNl9pbml0X2NhcmQoJmNmZywgTlVMTCk7CisJfQorCWlmIChucl9hZDE4MTZfZGV2cyA8PSAwKQorCSAgCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCisvKiBtb2R1bGUgY2xlYW51cCAqLworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYWQxODE2ICh2b2lkKQoreworCWludCAgICAgICAgICBpOworCWFkMTgxNl9pbmZvICAqZGV2YyA9IE5VTEw7CisgIAorCS8qIHJlbW92ZSBhbnkgc291bmRjYXJkICovCisJZm9yIChpID0gMDsgIGkgPCBucl9hZDE4MTZfZGV2czsgaSsrKSB7CisJCWRldmMgPSAmZGV2X2luZm9baV07CisJCXVubG9hZF9jYXJkKGRldmMpOworCX0gICAgIAorCW5yX2FkMTgxNl9kZXZzPTA7CisJcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBkcml2ZXIgdW5sb2FkZWQhXG4iKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9hZDE4MTYpOworbW9kdWxlX2V4aXQoY2xlYW51cF9hZDE4MTYpOworCisjaWZuZGVmIE1PRFVMRQorLyoga2VybmVsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgZXZhbHVhdGlvbiAqLworc3RhdGljIGludCBfX2luaXQgc2V0dXBfYWQxODE2KGNoYXIgKnN0cikKK3sKKwkvKiBpbywgaXJxLCBkbWEsIGRtYTIgKi8KKwlpbnQgaW50c1s1XTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvCT0gaW50c1sxXTsKKwlpcnEJPSBpbnRzWzJdOworCWRtYQk9IGludHNbM107CisJZG1hMgk9IGludHNbNF07CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFkMTgxNj0iLCBzZXR1cF9hZDE4MTYpOworI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODQ4LmMgYi9zb3VuZC9vc3MvYWQxODQ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4NGRhYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hZDE4NDguYwpAQCAtMCwwICsxLDMxNTkgQEAKKy8qCisgKiBzb3VuZC9hZDE4NDguYworICoKKyAqIFRoZSBsb3cgbGV2ZWwgZHJpdmVyIGZvciB0aGUgQUQxODQ4L0NTNDI0OCBjb2RlYyBjaGlwIHdoaWNoCisgKiBpcyB1c2VkIGZvciBleGFtcGxlIGluIHRoZSBNUyBTb3VuZCBTeXN0ZW0uCisgKgorICogVGhlIENTNDIzMSB3aGljaCBpcyB1c2VkIGluIHRoZSBHVVMgTUFYIGFuZCBzb21lIG90aGVyIGNhcmRzIGlzCisgKiB1cHdhcmRzIGNvbXBhdGlibGUgd2l0aCBBRDE4NDggYW5kIHRoaXMgZHJpdmVyIGlzIGFibGUgdG8gZHJpdmUgaXQuCisgKgorICogQ1M0MjMxQSBhbmQgQUQxODQ1IGFyZSB1cHdhcmQgY29tcGF0aWJsZSB3aXRoIENTNDIzMS4gSG93ZXZlcgorICogdGhlIG5ldyBmZWF0dXJlcyBvZiB0aGVzZSBjaGlwcyBhcmUgZGlmZmVyZW50LgorICoKKyAqIENTNDIzMiBpcyBhIFBuUCBhdWRpbyBjaGlwIHdoaWNoIGNvbnRhaW5zIGEgQ1M0MjMxQSAoYW5kIFNCLCBNUFUpLgorICogQ1M0MjMyQSBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIENTNDIzMi4KKyAqCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBUaG9tYXMgU2FpbGVyCTogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICoJCQkgIGdlbmVyYWwgc2xlZXAvd2FrZXVwIGNsZWFuIHVwLgorICogQWxhbiBDb3gJCTogcmVmb3JtYXR0ZWQuIEZpeGVkIFNNUCBidWdzLiBNb3ZlZCB0byBrZXJuZWwgYWxsb2MvZnJlZQorICoJCSAgICAgICAgICBvZiBpcnFzLiBVc2UgZGV2X2lkLgorICogQ2hyaXN0b3BoIEhlbGx3aWcJOiBhZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKiBBa2kgTGF1a2thbmVuCTogYWRkZWQgcG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0CisgKiBBcm5hbGRvIEMuIGRlIE1lbG8JOiBhZGRlZCBtaXNzaW5nIHJlc3RvcmVfZmxhZ3MgaW4gYWQxODQ4X3Jlc3VtZQorICogTWlndWVsIEZyZWl0YXMgICAgICAgOiBhZGRlZCBJU0EgUG5QIHN1cHBvcnQKKyAqIEFsYW4gQ294CQk6IEFkZGVkIENTNDIzNi0+NDIzOSBpZGVudGlmaWNhdGlvbgorICogRGFuaWVsIFQuIENvYnJhCTogQWxlcm5hdGUgY29uZmlnL21peGVyIGZvciBsYXRlciBjaGlwcworICogQWxhbiBDb3gJCTogTWVyZ2VkIGNoaXAgaWRlbnRzIGFuZCBjb25maWcgY29kZQorICoKKyAqIFRPRE8KKyAqCQlBUE0gc2F2ZSByZXN0b3JlIGFzc2lzdCBjb2RlIG9uIElCTSB0aGlua3BhZAorICoKKyAqIFN0YXR1czoKKyAqCQlUZXN0ZWQuIEJlbGlldmVkIGZ1bGx5IGZ1bmN0aW9uYWwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgREVCKHgpCisjZGVmaW5lIERFQjEoeCkKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgImFkMTg0OC5oIgorI2luY2x1ZGUgImFkMTg0OF9taXhlci5oIgorCit0eXBlZGVmIHN0cnVjdAoreworCXNwaW5sb2NrX3QJbG9jazsKKwlpbnQgICAgICAgICAgICAgYmFzZTsKKwlpbnQgICAgICAgICAgICAgaXJxOworCWludCAgICAgICAgICAgICBkbWExLCBkbWEyOworCWludCAgICAgICAgICAgICBkdWFsX2RtYTsJLyogMSwgd2hlbiB0d28gRE1BIGNoYW5uZWxzIGFsbG9jYXRlZCAqLworCWludCAJCXN1YnR5cGU7CisJdW5zaWduZWQgY2hhciAgIE1DRV9iaXQ7CisJdW5zaWduZWQgY2hhciAgIHNhdmVkX3JlZ3NbNjRdOwkvKiBJbmNsdWRlcyBleHRlbmRlZCByZWdpc3RlciBzcGFjZSAqLworCWludCAgICAgICAgICAgICBkZWJ1Z19mbGFnOworCisJaW50ICAgICAgICAgICAgIGF1ZGlvX2ZsYWdzOworCWludCAgICAgICAgICAgICByZWNvcmRfZGV2LCBwbGF5YmFja19kZXY7CisKKwlpbnQgICAgICAgICAgICAgeGZlcl9jb3VudDsKKwlpbnQgICAgICAgICAgICAgYXVkaW9fbW9kZTsKKwlpbnQgICAgICAgICAgICAgb3Blbl9tb2RlOworCWludCAgICAgICAgICAgICBpbnRyX2FjdGl2ZTsKKwljaGFyICAgICAgICAgICAqY2hpcF9uYW1lLCAqbmFtZTsKKwlpbnQgICAgICAgICAgICAgbW9kZWw7CisjZGVmaW5lIE1EXzE4NDgJCTEKKyNkZWZpbmUgTURfNDIzMQkJMgorI2RlZmluZSBNRF80MjMxQQkzCisjZGVmaW5lIE1EXzE4NDUJCTQKKyNkZWZpbmUgTURfNDIzMgkJNQorI2RlZmluZSBNRF9DOTMwCQk2CisjZGVmaW5lIE1EX0lXQVZFCTcKKyNkZWZpbmUgTURfNDIzNSAgICAgICAgIDggLyogQ3J5c3RhbCBBdWRpbyBDUzQyMzUgICovCisjZGVmaW5lIE1EXzE4NDVfU1NDQVBFICA5IC8qIEVuc29uaXEgU291bmRzY2FwZSBQTlAqLworI2RlZmluZSBNRF80MjM2CQkxMCAvKiA0MjM2IGFuZCBoaWdoZXIgKi8KKyNkZWZpbmUgTURfNDJ4QgkJMTEgLyogQ1MgNDJ4QiAqLworI2RlZmluZSBNRF80MjM5CQkxMiAvKiBDUzQyMzkgKi8KKworCS8qIE1peGVyIHBhcmFtZXRlcnMgKi8KKwlpbnQgICAgICAgICAgICAgcmVjbWFzazsKKwlpbnQgICAgICAgICAgICAgc3VwcG9ydGVkX2RldmljZXMsIG9yaWdfZGV2aWNlczsKKwlpbnQgICAgICAgICAgICAgc3VwcG9ydGVkX3JlY19kZXZpY2VzLCBvcmlnX3JlY19kZXZpY2VzOworCWludCAgICAgICAgICAgICpsZXZlbHM7CisJc2hvcnQgICAgICAgICAgIG1peGVyX3Jlcm91dGVbMzJdOworCWludCAgICAgICAgICAgICBkZXZfbm87CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0aW1lcl90aWNrczsKKwlpbnQgICAgICAgICAgICAgdGltZXJfcnVubmluZzsKKwlpbnQgICAgICAgICAgICAgaXJxX29rOworCW1peGVyX2VudHMgICAgICptaXhfZGV2aWNlczsKKwlpbnQgICAgICAgICAgICAgbWl4ZXJfb3V0cHV0X3BvcnQ7CisKKwkvKiBQb3dlciBtYW5hZ2VtZW50ICovCisJc3RydWN0CQlwbV9kZXYgKnBtZGV2OworfSBhZDE4NDhfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgYWQxODQ4X3BvcnRfaW5mbworeworCWludCAgICAgICAgICAgICBvcGVuX21vZGU7CisJaW50ICAgICAgICAgICAgIHNwZWVkOworCXVuc2lnbmVkIGNoYXIgICBzcGVlZF9iaXRzOworCWludCAgICAgICAgICAgICBjaGFubmVsczsKKwlpbnQgICAgICAgICAgICAgYXVkaW9fZm9ybWF0OworCXVuc2lnbmVkIGNoYXIgICBmb3JtYXRfYml0czsKK30KK2FkMTg0OF9wb3J0X2luZm87CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKK3N0YXRpYyBpbnQgbnJfYWQxODQ4X2RldnM7CisKK3N0YXRpYyBpbnQgZGVza3Byb194bDsKK3N0YXRpYyBpbnQgZGVza3Byb19tOworc3RhdGljIGludCBzb3VuZHBybzsKKworc3RhdGljIHZvbGF0aWxlIHNpZ25lZCBjaGFyIGlycTJkZXZbMTddID0geworCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCit9OworCisjaWZuZGVmIEVYQ0xVREVfVElNRVJTCitzdGF0aWMgaW50IHRpbWVyX2luc3RhbGxlZCA9IC0xOworI2VuZGlmCisKK3N0YXRpYyBpbnQgbG9hZGVkOworCitzdGF0aWMgaW50IGFkX2Zvcm1hdF9tYXNrWzEzIC8qZGV2Yy0+bW9kZWwgKi8gXSA9Cit7CisJMCwKKwlBRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcsCisJQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9NVV9MQVcgfCBBRk1UX0FfTEFXIHwgQUZNVF9TMTZfQkUgfCBBRk1UX0lNQV9BRFBDTSwKKwlBRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcgfCBBRk1UX1MxNl9CRSB8IEFGTVRfSU1BX0FEUENNLAorCUFGTVRfVTggfCBBRk1UX1MxNl9MRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVywJLyogQUQxODQ1ICovCisJQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9NVV9MQVcgfCBBRk1UX0FfTEFXIHwgQUZNVF9TMTZfQkUgfCBBRk1UX0lNQV9BRFBDTSwKKwlBRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcgfCBBRk1UX1MxNl9CRSB8IEFGTVRfSU1BX0FEUENNLAorCUFGTVRfVTggfCBBRk1UX1MxNl9MRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVyB8IEFGTVRfUzE2X0JFIHwgQUZNVF9JTUFfQURQQ00sCisJQUZNVF9VOCB8IEFGTVRfUzE2X0xFIC8qIENTNDIzNSAqLywKKwlBRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcJLyogRW5zb25pcSBTb3VuZHNjYXBlKi8sCisJQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9NVV9MQVcgfCBBRk1UX0FfTEFXIHwgQUZNVF9TMTZfQkUgfCBBRk1UX0lNQV9BRFBDTSwKKwlBRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcgfCBBRk1UX1MxNl9CRSB8IEFGTVRfSU1BX0FEUENNLAorCUFGTVRfVTggfCBBRk1UX1MxNl9MRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVyB8IEFGTVRfUzE2X0JFIHwgQUZNVF9JTUFfQURQQ00KK307CisKK3N0YXRpYyBhZDE4NDhfaW5mbyBhZGV2X2luZm9bTUFYX0FVRElPX0RFVl07CisKKyNkZWZpbmUgaW9fSW5kZXhfQWRkcihkKQkoKGQpLT5iYXNlKQorI2RlZmluZSBpb19JbmRleGVkX0RhdGEoZCkJKChkKS0+YmFzZSsxKQorI2RlZmluZSBpb19TdGF0dXMoZCkJCSgoZCktPmJhc2UrMikKKyNkZWZpbmUgaW9fUG9sbGVkX0lPKGQpCQkoKGQpLT5iYXNlKzMpCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgICB1bnNpZ25lZCBjaGFyIGZsYWdzOworI2RlZmluZSBDQVBfRl9USU1FUiAweDAxICAgICAKK30gY2FwYWJpbGl0aWVzIFsxMCAvKmRldmMtPm1vZGVsICovIF0gPSB7CisgICAgIHswfQorICAgICx7MH0gICAgICAgICAgIC8qIE1EXzE4NDggICovCisgICAgLHtDQVBfRl9USU1FUn0gLyogTURfNDIzMSAgKi8KKyAgICAse0NBUF9GX1RJTUVSfSAvKiBNRF80MjMxQSAqLworICAgICx7Q0FQX0ZfVElNRVJ9IC8qIE1EXzE4NDUgICovCisgICAgLHtDQVBfRl9USU1FUn0gLyogTURfNDIzMiAgKi8KKyAgICAsezB9ICAgICAgICAgICAvKiBNRF9DOTMwICAqLworICAgICx7Q0FQX0ZfVElNRVJ9IC8qIE1EX0lXQVZFICovCisgICAgLHswfSAgICAgICAgICAgLyogTURfNDIzNSAgKi8KKyAgICAse0NBUF9GX1RJTUVSfSAvKiBNRF8xODQ1X1NTQ0FQRSAqLworfTsKKworI2lmZGVmIENPTkZJR19QTlAKK3N0YXRpYyBpbnQgaXNhcG5wCT0gMTsKK3N0YXRpYyBpbnQgaXNhcG5wanVtcDsKK3N0YXRpYyBpbnQgcmV2ZXJzZTsKKworc3RhdGljIGludCBhdWRpb19hY3RpdmF0ZWQ7CisjZWxzZQorc3RhdGljIGludCBpc2FwbnA7CisjZW5kaWYKKworCisKK3N0YXRpYyBpbnQgICAgICBhZDE4NDhfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCAgICAgYWQxODQ4X2Nsb3NlKGludCBkZXYpOworc3RhdGljIHZvaWQgICAgIGFkMTg0OF9vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwgaW50IGludHJmbGFnKTsKK3N0YXRpYyB2b2lkICAgICBhZDE4NDhfc3RhcnRfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwgaW50IGludHJmbGFnKTsKK3N0YXRpYyBpbnQgICAgICBhZDE4NDhfcHJlcGFyZV9mb3Jfb3V0cHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCk7CitzdGF0aWMgaW50ICAgICAgYWQxODQ4X3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCk7CitzdGF0aWMgdm9pZCAgICAgYWQxODQ4X2hhbHQoaW50IGRldik7CitzdGF0aWMgdm9pZCAgICAgYWQxODQ4X2hhbHRfaW5wdXQoaW50IGRldik7CitzdGF0aWMgdm9pZCAgICAgYWQxODQ4X2hhbHRfb3V0cHV0KGludCBkZXYpOworc3RhdGljIHZvaWQgICAgIGFkMTg0OF90cmlnZ2VyKGludCBkZXYsIGludCBiaXRzKTsKK3N0YXRpYyBpbnQJYWQxODQ4X3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpOworCisjaWZuZGVmIEVYQ0xVREVfVElNRVJTCitzdGF0aWMgaW50IGFkMTg0OF90bXJfaW5zdGFsbChpbnQgZGV2KTsKK3N0YXRpYyB2b2lkIGFkMTg0OF90bXJfcmVwcm9ncmFtKGludCBkZXYpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgYWRfcmVhZChhZDE4NDhfaW5mbyAqIGRldmMsIGludCByZWcpCit7CisJaW50IHg7CisJaW50IHRpbWVvdXQgPSA5MDAwMDA7CisKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCS8qQXJlIHdlIGluaXRpYWxpemluZyAqLworCQl0aW1lb3V0LS07CisKKwlpZihyZWcgPCAzMikKKwl7CisJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAocmVnICYgMHhmZikgfCBkZXZjLT5NQ0VfYml0KSwgaW9fSW5kZXhfQWRkcihkZXZjKSk7CisJCXggPSBpbmIoaW9fSW5kZXhlZF9EYXRhKGRldmMpKTsKKwl9CisJZWxzZQorCXsKKwkJaW50IHhyZWcsIHhyYTsKKworCQl4cmVnID0gKHJlZyAmIDB4ZmYpIC0gMzI7CisJCXhyYSA9ICgoKHhyZWcgJiAweDBmKSA8PCA0KSAmIDB4ZjApIHwgMHgwOCB8ICgoeHJlZyAmIDB4MTApID4+IDIpOworCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKDIzICYgMHhmZikgfCBkZXZjLT5NQ0VfYml0KSwgaW9fSW5kZXhfQWRkcihkZXZjKSk7CisJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAoeHJhICYgMHhmZikpLCBpb19JbmRleGVkX0RhdGEoZGV2YykpOworCQl4ID0gaW5iKGlvX0luZGV4ZWRfRGF0YShkZXZjKSk7CisJfQorCisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyB2b2lkIGFkX3dyaXRlKGFkMTg0OF9pbmZvICogZGV2YywgaW50IHJlZywgaW50IGRhdGEpCit7CisJaW50IHRpbWVvdXQgPSA5MDAwMDA7CisKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCS8qIEFyZSB3ZSBpbml0aWFsaXppbmcgKi8KKwkJdGltZW91dC0tOworCisJaWYocmVnIDwgMzIpCisJeworCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKHJlZyAmIDB4ZmYpIHwgZGV2Yy0+TUNFX2JpdCksIGlvX0luZGV4X0FkZHIoZGV2YykpOworCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKGRhdGEgJiAweGZmKSksIGlvX0luZGV4ZWRfRGF0YShkZXZjKSk7CisJfQorCWVsc2UKKwl7CisJCWludCB4cmVnLCB4cmE7CisJCQorCQl4cmVnID0gKHJlZyAmIDB4ZmYpIC0gMzI7CisJCXhyYSA9ICgoKHhyZWcgJiAweDBmKSA8PCA0KSAmIDB4ZjApIHwgMHgwOCB8ICgoeHJlZyAmIDB4MTApID4+IDIpOworCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKDIzICYgMHhmZikgfCBkZXZjLT5NQ0VfYml0KSwgaW9fSW5kZXhfQWRkcihkZXZjKSk7CisJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAoeHJhICYgMHhmZikpLCBpb19JbmRleGVkX0RhdGEoZGV2YykpOworCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoZGF0YSAmIDB4ZmYpLCBpb19JbmRleGVkX0RhdGEoZGV2YykpOworCX0KK30KKworc3RhdGljIHZvaWQgd2FpdF9mb3JfY2FsaWJyYXRpb24oYWQxODQ4X2luZm8gKiBkZXZjKQoreworCWludCB0aW1lb3V0ID0gMDsKKworCS8qCisJICogV2FpdCB1bnRpbCB0aGUgYXV0byBjYWxpYnJhdGlvbiBwcm9jZXNzIGhhcyBmaW5pc2hlZC4KKwkgKgorCSAqIDEpICAgICAgIFdhaXQgdW50aWwgdGhlIGNoaXAgYmVjb21lcyByZWFkeSAocmVhZHMgZG9uJ3QgcmV0dXJuIDB4ODApLgorCSAqIDIpICAgICAgIFdhaXQgdW50aWwgdGhlIEFDSSBiaXQgb2YgSTExIGdldHMgb24gYW5kIHRoZW4gb2ZmLgorCSAqLworCisJdGltZW91dCA9IDEwMDAwMDsKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCisJCXRpbWVvdXQtLTsKKwlpZiAoaW5iKGRldmMtPmJhc2UpICYgMHg4MCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODQ4OiBBdXRvIGNhbGlicmF0aW9uIHRpbWVkIG91dCgxKS5cbiIpOworCisJdGltZW91dCA9IDEwMDsKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgIShhZF9yZWFkKGRldmMsIDExKSAmIDB4MjApKQorCQl0aW1lb3V0LS07CisJaWYgKCEoYWRfcmVhZChkZXZjLCAxMSkgJiAweDIwKSkKKwkJcmV0dXJuOworCisJdGltZW91dCA9IDgwMDAwOworCXdoaWxlICh0aW1lb3V0ID4gMCAmJiAoYWRfcmVhZChkZXZjLCAxMSkgJiAweDIwKSkKKwkJdGltZW91dC0tOworCWlmIChhZF9yZWFkKGRldmMsIDExKSAmIDB4MjApCisJCWlmICggKGRldmMtPm1vZGVsICE9IE1EXzE4NDUpIHx8IChkZXZjLT5tb2RlbCAhPSBNRF8xODQ1X1NTQ0FQRSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4NDg6IEF1dG8gY2FsaWJyYXRpb24gdGltZWQgb3V0KDMpLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGFkX211dGUoYWQxODQ4X2luZm8gKiBkZXZjKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgcHJldjsKKworCS8qCisJICogU2F2ZSBvbGQgcmVnaXN0ZXIgc2V0dGluZ3MgYW5kIG11dGUgb3V0cHV0IGNoYW5uZWxzCisJICovCisJIAorCWZvciAoaSA9IDY7IGkgPCA4OyBpKyspCisJeworCQlwcmV2ID0gZGV2Yy0+c2F2ZWRfcmVnc1tpXSA9IGFkX3JlYWQoZGV2YywgaSk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIGFkX3VubXV0ZShhZDE4NDhfaW5mbyAqIGRldmMpCit7Cit9CisKK3N0YXRpYyB2b2lkIGFkX2VudGVyX01DRShhZDE4NDhfaW5mbyAqIGRldmMpCit7CisJaW50IHRpbWVvdXQgPSAxMDAwOworCXVuc2lnbmVkIHNob3J0IHByZXY7CisKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCS8qQXJlIHdlIGluaXRpYWxpemluZyAqLworCQl0aW1lb3V0LS07CisKKwlkZXZjLT5NQ0VfYml0ID0gMHg0MDsKKwlwcmV2ID0gaW5iKGlvX0luZGV4X0FkZHIoZGV2YykpOworCWlmIChwcmV2ICYgMHg0MCkKKwl7CisJCXJldHVybjsKKwl9CisJb3V0YigoZGV2Yy0+TUNFX2JpdCksIGlvX0luZGV4X0FkZHIoZGV2YykpOworfQorCitzdGF0aWMgdm9pZCBhZF9sZWF2ZV9NQ0UoYWQxODQ4X2luZm8gKiBkZXZjKQoreworCXVuc2lnbmVkIGNoYXIgcHJldiwgYWNhbDsKKwlpbnQgdGltZW91dCA9IDEwMDA7CisKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCS8qQXJlIHdlIGluaXRpYWxpemluZyAqLworCQl0aW1lb3V0LS07CisKKwlhY2FsID0gYWRfcmVhZChkZXZjLCA5KTsKKworCWRldmMtPk1DRV9iaXQgPSAweDAwOworCXByZXYgPSBpbmIoaW9fSW5kZXhfQWRkcihkZXZjKSk7CisJb3V0YigoMHgwMCksIGlvX0luZGV4X0FkZHIoZGV2YykpOwkvKiBDbGVhciB0aGUgTUNFIGJpdCAqLworCisJaWYgKChwcmV2ICYgMHg0MCkgPT0gMCkJLyogTm90IGluIE1DRSBtb2RlICovCisJeworCQlyZXR1cm47CisJfQorCW91dGIoKDB4MDApLCBpb19JbmRleF9BZGRyKGRldmMpKTsJLyogQ2xlYXIgdGhlIE1DRSBiaXQgKi8KKwlpZiAoYWNhbCAmIDB4MDgpCS8qIEF1dG8gY2FsaWJyYXRpb24gaXMgZW5hYmxlZCAqLworCQl3YWl0X2Zvcl9jYWxpYnJhdGlvbihkZXZjKTsKK30KKworc3RhdGljIGludCBhZDE4NDhfc2V0X3JlY21hc2soYWQxODQ4X2luZm8gKiBkZXZjLCBpbnQgbWFzaykKK3sKKwl1bnNpZ25lZCBjaGFyICAgcmVjZGV2OworCWludCAgICAgICAgICAgICBpLCBuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltYXNrICY9IGRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlczsKKworCS8qIFJlbmFtZSB0aGUgbWl4ZXIgYml0cyBpZiBuZWNlc3NhcnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwl7CisJCWlmIChkZXZjLT5taXhlcl9yZXJvdXRlW2ldICE9IGkpCisJCXsKKwkJCWlmIChtYXNrICYgKDEgPDwgaSkpCisJCQl7CisJCQkJbWFzayAmPSB+KDEgPDwgaSk7CisJCQkJbWFzayB8PSAoMSA8PCBkZXZjLT5taXhlcl9yZXJvdXRlW2ldKTsKKwkJCX0KKwkJfQorCX0KKwkKKwluID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykJLyogQ291bnQgc2VsZWN0ZWQgZGV2aWNlIGJpdHMgKi8KKwkJaWYgKG1hc2sgJiAoMSA8PCBpKSkKKwkJCW4rKzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlpZiAoIXNvdW5kcHJvKSB7CisJCWlmIChuID09IDApCisJCQltYXNrID0gU09VTkRfTUFTS19NSUM7CisJCWVsc2UgaWYgKG4gIT0gMSkgewkvKiBUb28gbWFueSBkZXZpY2VzIHNlbGVjdGVkICovCisJCQltYXNrICY9IH5kZXZjLT5yZWNtYXNrOwkvKiBGaWx0ZXIgb3V0IGFjdGl2ZSBzZXR0aW5ncyAqLworCisJCQluID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQkvKiBDb3VudCBzZWxlY3RlZCBkZXZpY2UgYml0cyAqLworCQkJCWlmIChtYXNrICYgKDEgPDwgaSkpCisJCQkJCW4rKzsKKworCQkJaWYgKG4gIT0gMSkKKwkJCQltYXNrID0gU09VTkRfTUFTS19NSUM7CisJCX0KKwkJc3dpdGNoIChtYXNrKSB7CisJCWNhc2UgU09VTkRfTUFTS19NSUM6CisJCQlyZWNkZXYgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NQVNLX0xJTkU6CisJCWNhc2UgU09VTkRfTUFTS19MSU5FMzoKKwkJCXJlY2RldiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01BU0tfQ0Q6CisJCWNhc2UgU09VTkRfTUFTS19MSU5FMToKKwkJCXJlY2RldiA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01BU0tfSU1JWDoKKwkJCXJlY2RldiA9IDM7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbWFzayA9IFNPVU5EX01BU0tfTUlDOworCQkJcmVjZGV2ID0gMjsKKwkJfQorCisJCXJlY2RldiA8PD0gNjsKKwkJYWRfd3JpdGUoZGV2YywgMCwgKGFkX3JlYWQoZGV2YywgMCkgJiAweDNmKSB8IHJlY2Rldik7CisJCWFkX3dyaXRlKGRldmMsIDEsIChhZF9yZWFkKGRldmMsIDEpICYgMHgzZikgfCByZWNkZXYpOworCX0gZWxzZSB7IC8qIHNvdW5kcHJvICovCisJCXVuc2lnbmVkIGNoYXIgdmFsOworCQlpbnQgc2V0X3JlY19iaXQ7CisJCWludCBqOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CS8qIEZvciBlYWNoIGJpdCAqLworCQkJaWYgKChkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMgJiAoMSA8PCBpKSkgPT0gMCkKKwkJCQljb250aW51ZTsJLyogRGV2aWNlIG5vdCBzdXBwb3J0ZWQgKi8KKworCQkJZm9yIChqID0gTEVGVF9DSE47IGogPD0gUklHSFRfQ0hOOyBqKyspIHsKKwkJCQlpZiAoZGV2Yy0+bWl4X2RldmljZXNbaV1bal0ubmJpdHMgPT0gMCkgLyogSW5leGlzdGVudCBjaGFubmVsICovCisJCQkJCWNvbnRpbnVlOworCisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIHRyaWNreToKKwkJCQkgKiBzZXRfcmVjX2JpdCBiZWNvbWVzIDEgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIG1hc2sgaXMgc2V0CisJCQkJICogdGhlbiBpdCBnZXRzIGZsaXBwZWQgaWYgdGhlIHBvbGFyaXR5IGlzIGludmVyc2UKKwkJCQkgKi8KKwkJCQlzZXRfcmVjX2JpdCA9ICgobWFzayAmICgxIDw8IGkpKSAhPSAwKSBeIGRldmMtPm1peF9kZXZpY2VzW2ldW2pdLnJlY3BvbDsKKworCQkJCXZhbCA9IGFkX3JlYWQoZGV2YywgZGV2Yy0+bWl4X2RldmljZXNbaV1bal0ucmVjcmVnKTsKKwkJCQl2YWwgJj0gfigxIDw8IGRldmMtPm1peF9kZXZpY2VzW2ldW2pdLnJlY3Bvcyk7CisJCQkJdmFsIHw9IChzZXRfcmVjX2JpdCA8PCBkZXZjLT5taXhfZGV2aWNlc1tpXVtqXS5yZWNwb3MpOworCQkJCWFkX3dyaXRlKGRldmMsIGRldmMtPm1peF9kZXZpY2VzW2ldW2pdLnJlY3JlZywgdmFsKTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCS8qIFJlbmFtZSB0aGUgbWl4ZXIgYml0cyBiYWNrIGlmIG5lY2Vzc2FyeSAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCXsKKwkJaWYgKGRldmMtPm1peGVyX3Jlcm91dGVbaV0gIT0gaSkKKwkJeworCQkJaWYgKG1hc2sgJiAoMSA8PCBkZXZjLT5taXhlcl9yZXJvdXRlW2ldKSkKKwkJCXsKKwkJCQltYXNrICY9IH4oMSA8PCBkZXZjLT5taXhlcl9yZXJvdXRlW2ldKTsKKwkJCQltYXNrIHw9ICgxIDw8IGkpOworCQkJfQorCQl9CisJfQorCWRldmMtPnJlY21hc2sgPSBtYXNrOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfYml0cyhhZDE4NDhfaW5mbyAqIGRldmMsIHVuc2lnbmVkIGNoYXIgKnJlZ3ZhbCwKKwkJCXVuc2lnbmVkIGNoYXIgKm11dGV2YWwsIGludCBkZXYsIGludCBjaG4sIGludCBuZXd2YWwpCit7CisJdW5zaWduZWQgY2hhciBtYXNrOworCWludCBzaGlmdDsKKwlpbnQgbXV0ZTsKKwlpbnQgbXV0ZW1hc2s7CisJaW50IHNldF9tdXRlX2JpdDsKKworCXNldF9tdXRlX2JpdCA9IChuZXd2YWwgPT0gMCkgXiBkZXZjLT5taXhfZGV2aWNlc1tkZXZdW2Nobl0ubXV0ZXBvbDsKKworCWlmIChkZXZjLT5taXhfZGV2aWNlc1tkZXZdW2Nobl0ucG9sYXJpdHkgPT0gMSkJLyogUmV2ZXJzZSAqLworCQluZXd2YWwgPSAxMDAgLSBuZXd2YWw7CisKKwltYXNrID0gKDEgPDwgZGV2Yy0+bWl4X2RldmljZXNbZGV2XVtjaG5dLm5iaXRzKSAtIDE7CisJc2hpZnQgPSBkZXZjLT5taXhfZGV2aWNlc1tkZXZdW2Nobl0uYml0cG9zOworCisJaWYgKGRldmMtPm1peF9kZXZpY2VzW2Rldl1bY2huXS5tdXRlcG9zID09IDgpCisJewkJCS8qIGlmIHRoZXJlIGlzIG5vIG11dGUgYml0ICovCisJCW11dGUgPSAwOwkvKiBObyBtdXRlIGJpdDsgZG8gbm90aGluZyBzcGVjaWFsICovCisJCW11dGVtYXNrID0gfjA7CS8qIE5vIG11dGUgYml0OyBkbyBub3RoaW5nIHNwZWNpYWwgKi8KKwl9CisJZWxzZQorCXsKKwkJbXV0ZSA9IChzZXRfbXV0ZV9iaXQgPDwgZGV2Yy0+bWl4X2RldmljZXNbZGV2XVtjaG5dLm11dGVwb3MpOworCQltdXRlbWFzayA9IH4oMSA8PCBkZXZjLT5taXhfZGV2aWNlc1tkZXZdW2Nobl0ubXV0ZXBvcyk7CisJfQorCisJbmV3dmFsID0gKGludCkgKChuZXd2YWwgKiBtYXNrKSArIDUwKSAvIDEwMDsJLyogU2NhbGUgaXQgKi8KKwkqcmVndmFsICY9IH4obWFzayA8PCBzaGlmdCk7CQkJLyogQ2xlYXIgYml0cyAqLworCSpyZWd2YWwgfD0gKG5ld3ZhbCAmIG1hc2spIDw8IHNoaWZ0OwkJLyogU2V0IG5ldyB2YWx1ZSAqLworCisJKm11dGV2YWwgJj0gbXV0ZW1hc2s7CisJKm11dGV2YWwgfD0gbXV0ZTsKK30KKworc3RhdGljIGludCBhZDE4NDhfbWl4ZXJfZ2V0KGFkMTg0OF9pbmZvICogZGV2YywgaW50IGRldikKK3sKKwlpZiAoISgoMSA8PCBkZXYpICYgZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9IGRldmMtPm1peGVyX3Jlcm91dGVbZGV2XTsKKworCXJldHVybiBkZXZjLT5sZXZlbHNbZGV2XTsKK30KKworc3RhdGljIHZvaWQgYWQxODQ4X21peGVyX3NldF9jaGFubmVsKGFkMTg0OF9pbmZvICpkZXZjLCBpbnQgZGV2LCBpbnQgdmFsdWUsIGludCBjaGFubmVsKQoreworCWludCByZWdvZmZzLCBtdXRlcmVnb2ZmczsKKwl1bnNpZ25lZCBjaGFyIHZhbCwgbXV0ZXZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmVnb2ZmcyA9IGRldmMtPm1peF9kZXZpY2VzW2Rldl1bY2hhbm5lbF0ucmVnbm87CisJbXV0ZXJlZ29mZnMgPSBkZXZjLT5taXhfZGV2aWNlc1tkZXZdW2NoYW5uZWxdLm11dGVyZWc7CisJdmFsID0gYWRfcmVhZChkZXZjLCByZWdvZmZzKTsKKworCWlmIChtdXRlcmVnb2ZmcyAhPSByZWdvZmZzKSB7CisJCW11dGV2YWwgPSBhZF9yZWFkKGRldmMsIG11dGVyZWdvZmZzKTsKKwkJY2hhbmdlX2JpdHMoZGV2YywgJnZhbCwgJm11dGV2YWwsIGRldiwgY2hhbm5lbCwgdmFsdWUpOworCX0KKwllbHNlCisJCWNoYW5nZV9iaXRzKGRldmMsICZ2YWwsICZ2YWwsIGRldiwgY2hhbm5lbCwgdmFsdWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWFkX3dyaXRlKGRldmMsIHJlZ29mZnMsIHZhbCk7CisJZGV2Yy0+c2F2ZWRfcmVnc1tyZWdvZmZzXSA9IHZhbDsKKwlpZiAobXV0ZXJlZ29mZnMgIT0gcmVnb2ZmcykgeworCQlhZF93cml0ZShkZXZjLCBtdXRlcmVnb2ZmcywgbXV0ZXZhbCk7CisJCWRldmMtPnNhdmVkX3JlZ3NbbXV0ZXJlZ29mZnNdID0gbXV0ZXZhbDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYWQxODQ4X21peGVyX3NldChhZDE4NDhfaW5mbyAqIGRldmMsIGludCBkZXYsIGludCB2YWx1ZSkKK3sKKwlpbnQgbGVmdCA9IHZhbHVlICYgMHgwMDAwMDBmZjsKKwlpbnQgcmlnaHQgPSAodmFsdWUgJiAweDAwMDBmZjAwKSA+PiA4OworCWludCByZXR2b2w7CisKKwlpZiAoZGV2ID4gMzEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEoZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJiAoMSA8PCBkZXYpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYgPSBkZXZjLT5taXhlcl9yZXJvdXRlW2Rldl07CisKKwlpZiAoZGV2Yy0+bWl4X2RldmljZXNbZGV2XVtMRUZUX0NITl0ubmJpdHMgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGVmdCA+IDEwMCkKKwkJbGVmdCA9IDEwMDsKKwlpZiAocmlnaHQgPiAxMDApCisJCXJpZ2h0ID0gMTAwOworCisJaWYgKGRldmMtPm1peF9kZXZpY2VzW2Rldl1bUklHSFRfQ0hOXS5uYml0cyA9PSAwKQkvKiBNb25vIGNvbnRyb2wgKi8KKwkJcmlnaHQgPSBsZWZ0OworCisJcmV0dm9sID0gbGVmdCB8IChyaWdodCA8PCA4KTsKKworCS8qIFNjYWxlIHZvbHVtZXMgKi8KKwlsZWZ0ID0gbWl4X2N2dFtsZWZ0XTsKKwlyaWdodCA9IG1peF9jdnRbcmlnaHRdOworCisJZGV2Yy0+bGV2ZWxzW2Rldl0gPSByZXR2b2w7CisKKwkvKgorCSAqIFNldCB0aGUgbGVmdCBjaGFubmVsCisJICovCisJYWQxODQ4X21peGVyX3NldF9jaGFubmVsKGRldmMsIGRldiwgbGVmdCwgTEVGVF9DSE4pOworCisJLyoKKwkgKiBTZXQgdGhlIHJpZ2h0IGNoYW5uZWwKKwkgKi8KKwlpZiAoZGV2Yy0+bWl4X2RldmljZXNbZGV2XVtSSUdIVF9DSE5dLm5iaXRzID09IDApCisJCWdvdG8gb3V0OworCWFkMTg0OF9taXhlcl9zZXRfY2hhbm5lbChkZXZjLCBkZXYsIHJpZ2h0LCBSSUdIVF9DSE4pOworCisgb3V0OgorCXJldHVybiByZXR2b2w7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0OF9taXhlcl9yZXNldChhZDE4NDhfaW5mbyAqIGRldmMpCit7CisJaW50IGk7CisJY2hhciBuYW1lWzMyXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2Yy0+bWl4X2RldmljZXMgPSAmKGFkMTg0OF9taXhfZGV2aWNlc1swXSk7CisKKwlzcHJpbnRmKG5hbWUsICIlc18lZCIsIGRldmMtPmNoaXBfbmFtZSwgbnJfYWQxODQ4X2RldnMpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCWRldmMtPm1peGVyX3Jlcm91dGVbaV0gPSBpOworCisJZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzID0gTU9ERTFfUkVDX0RFVklDRVM7CisKKwlzd2l0Y2ggKGRldmMtPm1vZGVsKQorCXsKKwkJY2FzZSBNRF80MjMxOgorCQljYXNlIE1EXzQyMzFBOgorCQljYXNlIE1EXzE4NDU6CisJCWNhc2UgTURfMTg0NV9TU0NBUEU6CisJCQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IE1PREUyX01JWEVSX0RFVklDRVM7CisJCQlicmVhazsKKworCQljYXNlIE1EX0M5MzA6CisJCQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IEM5MzBfTUlYRVJfREVWSUNFUzsKKwkJCWRldmMtPm1peF9kZXZpY2VzID0gJihjOTMwX21peF9kZXZpY2VzWzBdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTURfSVdBVkU6CisJCQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IE1PREUzX01JWEVSX0RFVklDRVM7CisJCQlkZXZjLT5taXhfZGV2aWNlcyA9ICYoaXdhdmVfbWl4X2RldmljZXNbMF0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRF80MnhCOgorCQljYXNlIE1EXzQyMzk6CisJCQlkZXZjLT5taXhfZGV2aWNlcyA9ICYoY3M0MnhiX21peF9kZXZpY2VzWzBdKTsKKwkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzID0gTU9ERTNfTUlYRVJfREVWSUNFUzsKKwkJCWJyZWFrOworCQljYXNlIE1EXzQyMzI6CisJCWNhc2UgTURfNDIzNToKKwkJY2FzZSBNRF80MjM2OgorCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSBNT0RFM19NSVhFUl9ERVZJQ0VTOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRF8xODQ4OgorCQkJaWYgKHNvdW5kcHJvKSB7CisJCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSBTUFJPX01JWEVSX0RFVklDRVM7CisJCQkJZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzID0gU1BST19SRUNfREVWSUNFUzsKKwkJCQlkZXZjLT5taXhfZGV2aWNlcyA9ICYoc3Byb19taXhfZGV2aWNlc1swXSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJZGVmYXVsdDoKKwkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzID0gTU9ERTFfTUlYRVJfREVWSUNFUzsKKwl9CisKKwlkZXZjLT5vcmlnX2RldmljZXMgPSBkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlczsKKwlkZXZjLT5vcmlnX3JlY19kZXZpY2VzID0gZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOworCisJZGV2Yy0+bGV2ZWxzID0gbG9hZF9taXhlcl92b2x1bWVzKG5hbWUsIGRlZmF1bHRfbWl4ZXJfbGV2ZWxzLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwl7CisJCWlmIChkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmICgxIDw8IGkpKQorCQkJYWQxODQ4X21peGVyX3NldChkZXZjLCBpLCBkZXZjLT5sZXZlbHNbaV0pOworCX0KKwkKKwlhZDE4NDhfc2V0X3JlY21hc2soZGV2YywgU09VTkRfTUFTS19NSUMpOworCQorCWRldmMtPm1peGVyX291dHB1dF9wb3J0ID0gZGV2Yy0+bGV2ZWxzWzMxXSB8IEFVRElPX0hFQURQSE9ORSB8IEFVRElPX0xJTkVfT1VUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWlmICghc291bmRwcm8pIHsKKwkJaWYgKGRldmMtPm1peGVyX291dHB1dF9wb3J0ICYgQVVESU9fU1BFQUtFUikKKwkJCWFkX3dyaXRlKGRldmMsIDI2LCBhZF9yZWFkKGRldmMsIDI2KSAmIH4weDQwKTsJLyogVW5tdXRlIG1vbm8gb3V0ICovCisJCWVsc2UKKwkJCWFkX3dyaXRlKGRldmMsIDI2LCBhZF9yZWFkKGRldmMsIDI2KSB8IDB4NDApOwkvKiBNdXRlIG1vbm8gb3V0ICovCisJfSBlbHNlIHsKKwkJLyoKKwkJICogRnJvbSB0aGUgIndvdWxkbid0IGl0IGJlIG5pY2UgaWYgdGhlIG1peGVyIEFQSSBoYWQgKGJldHRlcikKKwkJICogc3VwcG9ydCBmb3IgY3VzdG9tIHN0dWZmIiBjYXRlZ29yeQorCQkgKi8KKwkJLyogRW5hYmxlIHN1cnJvdW5kIG1vZGUgYW5kIFNCMTYgbWl4ZXIgKi8KKwkJYWRfd3JpdGUoZGV2YywgMTYsIDB4NjApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCBhZDE4NDhfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlhZDE4NDhfaW5mbyAqZGV2YyA9IG1peGVyX2RldnNbZGV2XS0+ZGV2YzsKKwlpbnQgdmFsOworCisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMSkgCisJeworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodmFsICE9IDB4ZmZmZikgCisJCXsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQl2YWwgJj0gKEFVRElPX1NQRUFLRVIgfCBBVURJT19IRUFEUEhPTkUgfCBBVURJT19MSU5FX09VVCk7CisJCQlkZXZjLT5taXhlcl9vdXRwdXRfcG9ydCA9IHZhbDsKKwkJCXZhbCB8PSBBVURJT19IRUFEUEhPTkUgfCBBVURJT19MSU5FX09VVDsJLyogQWx3YXlzIG9uICovCisJCQlkZXZjLT5taXhlcl9vdXRwdXRfcG9ydCA9IHZhbDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJCWlmICh2YWwgJiBBVURJT19TUEVBS0VSKQorCQkJCWFkX3dyaXRlKGRldmMsIDI2LCBhZF9yZWFkKGRldmMsIDI2KSAmIH4weDQwKTsJLyogVW5tdXRlIG1vbm8gb3V0ICovCisJCQllbHNlCisJCQkJYWRfd3JpdGUoZGV2YywgMjYsIGFkX3JlYWQoZGV2YywgMjYpIHwgMHg0MCk7CQkvKiBNdXRlIG1vbm8gb3V0ICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJfQorCQl2YWwgPSBkZXZjLT5taXhlcl9vdXRwdXRfcG9ydDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUyKQorCXsKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybihhZDE4NDhfY29udHJvbChBRDE4NDhfTUlYRVJfUkVST1VURSwgdmFsKSk7CisJfQorCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpID09ICdNJykgCisJeworCQlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkKKwkJeworCQkJc3dpdGNoIChjbWQgJiAweGZmKSAKKwkJCXsKKwkJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXZhbCA9IGFkMTg0OF9zZXRfcmVjbWFzayhkZXZjLCB2YWwpOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQlkZWZhdWx0OgorCQkJCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl2YWwgPSBhZDE4NDhfbWl4ZXJfc2V0KGRldmMsIGNtZCAmIDB4ZmYsIHZhbCk7CisJCQkJCWJyZWFrOworCQkJfSAKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN3aXRjaCAoY21kICYgMHhmZikgCisJCQl7CisJCQkJLyoKKwkJCQkgKiBSZXR1cm4gcGFyYW1ldGVycworCQkJCSAqLworCQkJICAgIAorCQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCQl2YWwgPSBkZXZjLT5yZWNtYXNrOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCQkJCXZhbCA9IGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6CisJCQkJCXZhbCA9IGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzOworCQkJCQlpZiAoZGV2Yy0+bW9kZWwgIT0gTURfQzkzMCkKKwkJCQkJCXZhbCAmPSB+KFNPVU5EX01BU0tfU1BFQUtFUiB8IFNPVU5EX01BU0tfSU1JWCk7CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJCQkJdmFsID0gZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCQkJdmFsPVNPVU5EX0NBUF9FWENMX0lOUFVUOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXZhbCA9IGFkMTg0OF9taXhlcl9nZXQoZGV2YywgY21kICYgMHhmZik7CisJCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOworCQl9CisJfQorCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYWQxODQ4X3NldF9zcGVlZChpbnQgZGV2LCBpbnQgYXJnKQoreworCWFkMTg0OF9pbmZvICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwkvKgorCSAqIFRoZSBzYW1wbGluZyBzcGVlZCBpcyBlbmNvZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBuaWJibGUgb2YgSTguIFRoZQorCSAqIExTQiBzZWxlY3RzIHRoZSBjbG9jayBzb3VyY2UgKDA9MjQuNTc2IE1IeiwgMT0xNi45MzQ0IE1IeikgYW5kIG90aGVyCisJICogdGhyZWUgYml0cyBzZWxlY3QgdGhlIGRpdmlzb3IgKGluZGlyZWN0bHkpOgorCSAqCisJICogVGhlIGF2YWlsYWJsZSBzcGVlZHMgYXJlIGluIHRoZSBmb2xsb3dpbmcgdGFibGUuIEtlZXAgdGhlIHNwZWVkcyBpbgorCSAqIHRoZSBpbmNyZWFzaW5nIG9yZGVyLgorCSAqLworCXR5cGVkZWYgc3RydWN0CisJeworCQlpbnQgICAgICAgICAgICAgc3BlZWQ7CisJCXVuc2lnbmVkIGNoYXIgICBiaXRzOworCX0KKwlzcGVlZF9zdHJ1Y3Q7CisKKwlzdGF0aWMgc3BlZWRfc3RydWN0IHNwZWVkX3RhYmxlW10gPQorCXsKKwkJezU1MTAsICgwIDw8IDEpIHwgMX0sCisJCXs1NTEwLCAoMCA8PCAxKSB8IDF9LAorCQl7NjYyMCwgKDcgPDwgMSkgfCAxfSwKKwkJezgwMDAsICgwIDw8IDEpIHwgMH0sCisJCXs5NjAwLCAoNyA8PCAxKSB8IDB9LAorCQl7MTEwMjUsICgxIDw8IDEpIHwgMX0sCisJCXsxNjAwMCwgKDEgPDwgMSkgfCAwfSwKKwkJezE4OTAwLCAoMiA8PCAxKSB8IDF9LAorCQl7MjIwNTAsICgzIDw8IDEpIHwgMX0sCisJCXsyNzQyMCwgKDIgPDwgMSkgfCAwfSwKKwkJezMyMDAwLCAoMyA8PCAxKSB8IDB9LAorCQl7MzMwNzUsICg2IDw8IDEpIHwgMX0sCisJCXszNzgwMCwgKDQgPDwgMSkgfCAxfSwKKwkJezQ0MTAwLCAoNSA8PCAxKSB8IDF9LAorCQl7NDgwMDAsICg2IDw8IDEpIHwgMH0KKwl9OworCisJaW50IGksIG4sIHNlbGVjdGVkID0gLTE7CisKKwluID0gc2l6ZW9mKHNwZWVkX3RhYmxlKSAvIHNpemVvZihzcGVlZF9zdHJ1Y3QpOworCisJaWYgKGFyZyA8PSAwKQorCQlyZXR1cm4gcG9ydGMtPnNwZWVkOworCisJaWYgKGRldmMtPm1vZGVsID09IE1EXzE4NDUgfHwgZGV2Yy0+bW9kZWwgPT0gTURfMTg0NV9TU0NBUEUpCS8qIEFEMTg0NSBoYXMgZGlmZmVyZW50IHRpbWVyIHRoYW4gb3RoZXJzICovCisJeworCQlpZiAoYXJnIDwgNDAwMCkKKwkJCWFyZyA9IDQwMDA7CisJCWlmIChhcmcgPiA1MDAwMCkKKwkJCWFyZyA9IDUwMDAwOworCisJCXBvcnRjLT5zcGVlZCA9IGFyZzsKKwkJcG9ydGMtPnNwZWVkX2JpdHMgPSBzcGVlZF90YWJsZVszXS5iaXRzOworCQlyZXR1cm4gcG9ydGMtPnNwZWVkOworCX0KKwlpZiAoYXJnIDwgc3BlZWRfdGFibGVbMF0uc3BlZWQpCisJCXNlbGVjdGVkID0gMDsKKwlpZiAoYXJnID4gc3BlZWRfdGFibGVbbiAtIDFdLnNwZWVkKQorCQlzZWxlY3RlZCA9IG4gLSAxOworCisJZm9yIChpID0gMSAvKnJlYWxseSAqLyA7IHNlbGVjdGVkID09IC0xICYmIGkgPCBuOyBpKyspCisJeworCQlpZiAoc3BlZWRfdGFibGVbaV0uc3BlZWQgPT0gYXJnKQorCQkJc2VsZWN0ZWQgPSBpOworCQllbHNlIGlmIChzcGVlZF90YWJsZVtpXS5zcGVlZCA+IGFyZykKKwkJeworCQkJaW50IGRpZmYxLCBkaWZmMjsKKworCQkJZGlmZjEgPSBhcmcgLSBzcGVlZF90YWJsZVtpIC0gMV0uc3BlZWQ7CisJCQlkaWZmMiA9IHNwZWVkX3RhYmxlW2ldLnNwZWVkIC0gYXJnOworCisJCQlpZiAoZGlmZjEgPCBkaWZmMikKKwkJCQlzZWxlY3RlZCA9IGkgLSAxOworCQkJZWxzZQorCQkJCXNlbGVjdGVkID0gaTsKKwkJfQorCX0KKwlpZiAoc2VsZWN0ZWQgPT0gLTEpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4NDg6IENhbid0IGZpbmQgc3BlZWQ/Pz9cbiIpOworCQlzZWxlY3RlZCA9IDM7CisJfQorCXBvcnRjLT5zcGVlZCA9IHNwZWVkX3RhYmxlW3NlbGVjdGVkXS5zcGVlZDsKKwlwb3J0Yy0+c3BlZWRfYml0cyA9IHNwZWVkX3RhYmxlW3NlbGVjdGVkXS5iaXRzOworCXJldHVybiBwb3J0Yy0+c3BlZWQ7Cit9CisKK3N0YXRpYyBzaG9ydCBhZDE4NDhfc2V0X2NoYW5uZWxzKGludCBkZXYsIHNob3J0IGFyZykKK3sKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwlpZiAoYXJnICE9IDEgJiYgYXJnICE9IDIpCisJCXJldHVybiBwb3J0Yy0+Y2hhbm5lbHM7CisKKwlwb3J0Yy0+Y2hhbm5lbHMgPSBhcmc7CisJcmV0dXJuIGFyZzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhZDE4NDhfc2V0X2JpdHMoaW50IGRldiwgdW5zaWduZWQgaW50IGFyZykKK3sKKwlhZDE4NDhfaW5mbyAgICAqZGV2YyA9IChhZDE4NDhfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJYWQxODQ4X3BvcnRfaW5mbyAqcG9ydGMgPSAoYWQxODQ4X3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCisJc3RhdGljIHN0cnVjdCBmb3JtYXRfdGJsCisJeworCQkgIGludCAgICAgICAgICAgICBmb3JtYXQ7CisJCSAgdW5zaWduZWQgY2hhciAgIGJpdHM7CisJfQorCWZvcm1hdDJiaXRzW10gPQorCXsKKwkJeworCQkJMCwgMAorCQl9CisJCSwKKwkJeworCQkJQUZNVF9NVV9MQVcsIDEKKwkJfQorCQksCisJCXsKKwkJCUFGTVRfQV9MQVcsIDMKKwkJfQorCQksCisJCXsKKwkJCUFGTVRfSU1BX0FEUENNLCA1CisJCX0KKwkJLAorCQl7CisJCQlBRk1UX1U4LCAwCisJCX0KKwkJLAorCQl7CisJCQlBRk1UX1MxNl9MRSwgMgorCQl9CisJCSwKKwkJeworCQkJQUZNVF9TMTZfQkUsIDYKKwkJfQorCQksCisJCXsKKwkJCUFGTVRfUzgsIDAKKwkJfQorCQksCisJCXsKKwkJCUFGTVRfVTE2X0xFLCAwCisJCX0KKwkJLAorCQl7CisJCQlBRk1UX1UxNl9CRSwgMAorCQl9CisJfTsKKwlpbnQgaSwgbiA9IHNpemVvZihmb3JtYXQyYml0cykgLyBzaXplb2Yoc3RydWN0IGZvcm1hdF90YmwpOworCisJaWYgKGFyZyA9PSAwKQorCQlyZXR1cm4gcG9ydGMtPmF1ZGlvX2Zvcm1hdDsKKworCWlmICghKGFyZyAmIGFkX2Zvcm1hdF9tYXNrW2RldmMtPm1vZGVsXSkpCisJCWFyZyA9IEFGTVRfVTg7CisKKwlwb3J0Yy0+YXVkaW9fZm9ybWF0ID0gYXJnOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJaWYgKGZvcm1hdDJiaXRzW2ldLmZvcm1hdCA9PSBhcmcpCisJCXsKKwkJCWlmICgocG9ydGMtPmZvcm1hdF9iaXRzID0gZm9ybWF0MmJpdHNbaV0uYml0cykgPT0gMCkKKwkJCQlyZXR1cm4gcG9ydGMtPmF1ZGlvX2Zvcm1hdCA9IEFGTVRfVTg7CQkvKiBXYXMgbm90IHN1cHBvcnRlZCAqLworCisJCQlyZXR1cm4gYXJnOworCQl9CisJLyogU3RpbGwgaGFuZ2luZyBoZXJlLiBTb21ldGhpbmcgbXVzdCBiZSB0ZXJyaWJseSB3cm9uZyAqLworCXBvcnRjLT5mb3JtYXRfYml0cyA9IDA7CisJcmV0dXJuIHBvcnRjLT5hdWRpb19mb3JtYXQgPSBBRk1UX1U4OworfQorCitzdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBhZDE4NDhfYXVkaW9fZHJpdmVyID0KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBhZDE4NDhfb3BlbiwKKwkuY2xvc2UJCQk9IGFkMTg0OF9jbG9zZSwKKwkub3V0cHV0X2Jsb2NrCQk9IGFkMTg0OF9vdXRwdXRfYmxvY2ssCisJLnN0YXJ0X2lucHV0CQk9IGFkMTg0OF9zdGFydF9pbnB1dCwKKwkucHJlcGFyZV9mb3JfaW5wdXQJPSBhZDE4NDhfcHJlcGFyZV9mb3JfaW5wdXQsCisJLnByZXBhcmVfZm9yX291dHB1dAk9IGFkMTg0OF9wcmVwYXJlX2Zvcl9vdXRwdXQsCisJLmhhbHRfaW8JCT0gYWQxODQ4X2hhbHQsCisJLmhhbHRfaW5wdXQJCT0gYWQxODQ4X2hhbHRfaW5wdXQsCisJLmhhbHRfb3V0cHV0CQk9IGFkMTg0OF9oYWx0X291dHB1dCwKKwkudHJpZ2dlcgkJPSBhZDE4NDhfdHJpZ2dlciwKKwkuc2V0X3NwZWVkCQk9IGFkMTg0OF9zZXRfc3BlZWQsCisJLnNldF9iaXRzCQk9IGFkMTg0OF9zZXRfYml0cywKKwkuc2V0X2NoYW5uZWxzCQk9IGFkMTg0OF9zZXRfY2hhbm5lbHMKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBhZDE4NDhfbWl4ZXJfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmlkCT0gIlNPVU5EUE9SVCIsCisJLm5hbWUJPSAiQUQxODQ4L0NTNDI0OC9DUzQyMzEiLAorCS5pb2N0bAk9IGFkMTg0OF9taXhlcl9pb2N0bAorfTsKKworc3RhdGljIGludCBhZDE4NDhfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlhZDE4NDhfaW5mbyAgICAqZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YzsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX2F1ZGlvZGV2cykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRldmMgPSAoYWQxODQ4X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXBvcnRjID0gKGFkMTg0OF9wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKworCS8qIGhlcmUgd2UgZG9uJ3QgaGF2ZSB0byBwcm90ZWN0IGFnYWluc3QgaW50ciAqLworCXNwaW5fbG9jaygmZGV2Yy0+bG9jayk7CisJaWYgKHBvcnRjLT5vcGVuX21vZGUgfHwgKGRldmMtPm9wZW5fbW9kZSAmIG1vZGUpKQorCXsKKwkJc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlkZXZjLT5kdWFsX2RtYSA9IDA7CisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9EVVBMRVgpCisJeworCQlkZXZjLT5kdWFsX2RtYSA9IDE7CisJfQorCWRldmMtPmludHJfYWN0aXZlID0gMDsKKwlkZXZjLT5hdWRpb19tb2RlID0gMDsKKwlkZXZjLT5vcGVuX21vZGUgfD0gbW9kZTsKKwlwb3J0Yy0+b3Blbl9tb2RlID0gbW9kZTsKKwlzcGluX3VubG9jaygmZGV2Yy0+bG9jayk7CisJYWQxODQ4X3RyaWdnZXIoZGV2LCAwKTsKKworCWlmIChtb2RlICYgT1BFTl9SRUFEKQorCQlkZXZjLT5yZWNvcmRfZGV2ID0gZGV2OworCWlmIChtb2RlICYgT1BFTl9XUklURSkKKwkJZGV2Yy0+cGxheWJhY2tfZGV2ID0gZGV2OworLyoKKyAqIE11dGUgb3V0cHV0IHVudGlsIHRoZSBwbGF5YmFjayByZWFsbHkgc3RhcnRzLiBUaGlzIGRlY3JlYXNlcyBjbGlja2luZyAoaG9wZSBzbykuCisgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJYWRfbXV0ZShkZXZjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfY2xvc2UoaW50IGRldikKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJYWQxODQ4X2luZm8gICAgKmRldmMgPSAoYWQxODQ4X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCWFkMTg0OF9wb3J0X2luZm8gKnBvcnRjID0gKGFkMTg0OF9wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKworCURFQihwcmludGsoImFkMTg0OF9jbG9zZSh2b2lkKVxuIikpOworCisJZGV2Yy0+aW50cl9hY3RpdmUgPSAwOworCWFkMTg0OF9oYWx0KGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwlkZXZjLT5hdWRpb19tb2RlID0gMDsKKwlkZXZjLT5vcGVuX21vZGUgJj0gfnBvcnRjLT5vcGVuX21vZGU7CisJcG9ydGMtPm9wZW5fbW9kZSA9IDA7CisKKwlhZF91bm11dGUoZGV2Yyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0OF9vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwgaW50IGludHJmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFncywgY250OworCWFkMTg0OF9pbmZvICAgICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwljbnQgPSBjb3VudDsKKworCWlmIChwb3J0Yy0+YXVkaW9fZm9ybWF0ID09IEFGTVRfSU1BX0FEUENNKQorCXsKKwkJY250IC89IDQ7CisJfQorCWVsc2UKKwl7CisJCWlmIChwb3J0Yy0+YXVkaW9fZm9ybWF0ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9TMTZfQkUpKQkvKiAxNiBiaXQgZGF0YSAqLworCQkJY250ID4+PSAxOworCX0KKwlpZiAocG9ydGMtPmNoYW5uZWxzID4gMSkKKwkJY250ID4+PSAxOworCWNudC0tOworCisJaWYgKChkZXZjLT5hdWRpb19tb2RlICYgUENNX0VOQUJMRV9PVVRQVVQpICYmIChhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0FVVE9NT0RFKSAmJgorCSAgICBpbnRyZmxhZyAmJgorCSAgICBjbnQgPT0gZGV2Yy0+eGZlcl9jb3VudCkKKwl7CisJCWRldmMtPmF1ZGlvX21vZGUgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCWRldmMtPmludHJfYWN0aXZlID0gMTsKKwkJcmV0dXJuOwkvKgorCQkJICogQXV0byBETUEgbW9kZSBvbi4gTm8gbmVlZCB0byByZWFjdAorCQkJICovCisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWFkX3dyaXRlKGRldmMsIDE1LCAodW5zaWduZWQgY2hhcikgKGNudCAmIDB4ZmYpKTsKKwlhZF93cml0ZShkZXZjLCAxNCwgKHVuc2lnbmVkIGNoYXIpICgoY250ID4+IDgpICYgMHhmZikpOworCisJZGV2Yy0+eGZlcl9jb3VudCA9IGNudDsKKwlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCWRldmMtPmludHJfYWN0aXZlID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWQxODQ4X3N0YXJ0X2lucHV0KGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgY291bnQsIGludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3MsIGNudDsKKwlhZDE4NDhfaW5mbyAgICAqZGV2YyA9IChhZDE4NDhfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJYWQxODQ4X3BvcnRfaW5mbyAqcG9ydGMgPSAoYWQxODQ4X3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCisJY250ID0gY291bnQ7CisJaWYgKHBvcnRjLT5hdWRpb19mb3JtYXQgPT0gQUZNVF9JTUFfQURQQ00pCisJeworCQljbnQgLz0gNDsKKwl9CisJZWxzZQorCXsKKwkJaWYgKHBvcnRjLT5hdWRpb19mb3JtYXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1MxNl9CRSkpCS8qIDE2IGJpdCBkYXRhICovCisJCQljbnQgPj49IDE7CisJfQorCWlmIChwb3J0Yy0+Y2hhbm5lbHMgPiAxKQorCQljbnQgPj49IDE7CisJY250LS07CisKKwlpZiAoKGRldmMtPmF1ZGlvX21vZGUgJiBQQ01fRU5BQkxFX0lOUFVUKSAmJiAoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9BVVRPTU9ERSkgJiYKKwkJaW50cmZsYWcgJiYKKwkJY250ID09IGRldmMtPnhmZXJfY291bnQpCisJeworCQlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWRldmMtPmludHJfYWN0aXZlID0gMTsKKwkJcmV0dXJuOwkvKgorCQkJICogQXV0byBETUEgbW9kZSBvbi4gTm8gbmVlZCB0byByZWFjdAorCQkJICovCisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWlmIChkZXZjLT5tb2RlbCA9PSBNRF8xODQ4KQorCXsKKwkJICBhZF93cml0ZShkZXZjLCAxNSwgKHVuc2lnbmVkIGNoYXIpIChjbnQgJiAweGZmKSk7CisJCSAgYWRfd3JpdGUoZGV2YywgMTQsICh1bnNpZ25lZCBjaGFyKSAoKGNudCA+PiA4KSAmIDB4ZmYpKTsKKwl9CisJZWxzZQorCXsKKwkJICBhZF93cml0ZShkZXZjLCAzMSwgKHVuc2lnbmVkIGNoYXIpIChjbnQgJiAweGZmKSk7CisJCSAgYWRfd3JpdGUoZGV2YywgMzAsICh1bnNpZ25lZCBjaGFyKSAoKGNudCA+PiA4KSAmIDB4ZmYpKTsKKwl9CisKKwlhZF91bm11dGUoZGV2Yyk7CisKKwlkZXZjLT54ZmVyX2NvdW50ID0gY250OworCWRldmMtPmF1ZGlvX21vZGUgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYWQxODQ4X3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJaW50ICAgICAgICAgICAgIHRpbWVvdXQ7CisJdW5zaWduZWQgY2hhciAgIGZzLCBvbGRfZnMsIHRtcCA9IDA7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCWFkMTg0OF9pbmZvICAgICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwlhZF9tdXRlKGRldmMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWZzID0gcG9ydGMtPnNwZWVkX2JpdHMgfCAocG9ydGMtPmZvcm1hdF9iaXRzIDw8IDUpOworCisJaWYgKHBvcnRjLT5jaGFubmVscyA+IDEpCisJCWZzIHw9IDB4MTA7CisKKwlhZF9lbnRlcl9NQ0UoZGV2Yyk7CS8qIEVuYWJsZXMgY2hhbmdlcyB0byB0aGUgZm9ybWF0IHNlbGVjdCByZWcgKi8KKworCWlmIChkZXZjLT5tb2RlbCA9PSBNRF8xODQ1IHx8IGRldmMtPm1vZGVsID09IE1EXzE4NDVfU1NDQVBFKSAvKiBVc2UgYWx0ZXJuYXRlIHNwZWVkIHNlbGVjdCByZWdpc3RlcnMgKi8KKwl7CisJCWZzICY9IDB4ZjA7CS8qIE1hc2sgb2ZmIHRoZSByYXRlIHNlbGVjdCBiaXRzICovCisKKwkJYWRfd3JpdGUoZGV2YywgMjIsIChwb3J0Yy0+c3BlZWQgPj4gOCkgJiAweGZmKTsJLyogU3BlZWQgTVNCICovCisJCWFkX3dyaXRlKGRldmMsIDIzLCBwb3J0Yy0+c3BlZWQgJiAweGZmKTsJLyogU3BlZWQgTFNCICovCisJfQorCW9sZF9mcyA9IGFkX3JlYWQoZGV2YywgOCk7CisKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURfNDIzMiB8fCBkZXZjLT5tb2RlbCA+PSBNRF80MjM2KQorCXsKKwkJdG1wID0gYWRfcmVhZChkZXZjLCAxNik7CisJCWFkX3dyaXRlKGRldmMsIDE2LCB0bXAgfCAweDMwKTsKKwl9CisJaWYgKGRldmMtPm1vZGVsID09IE1EX0lXQVZFKQorCQlhZF93cml0ZShkZXZjLCAxNywgMHhjMik7CS8qIERpc2FibGUgdmFyaWFibGUgZnJlcXVlbmN5IHNlbGVjdCAqLworCisJYWRfd3JpdGUoZGV2YywgOCwgZnMpOworCisJLyoKKwkgKiBXcml0ZSB0byBJOCBzdGFydHMgcmVzeW5jaHJvbml6YXRpb24uIFdhaXQgdW50aWwgaXQgY29tcGxldGVzLgorCSAqLworCisJdGltZW91dCA9IDA7CisJd2hpbGUgKHRpbWVvdXQgPCAxMDAgJiYgaW5iKGRldmMtPmJhc2UpICE9IDB4ODApCisJCXRpbWVvdXQrKzsKKwl0aW1lb3V0ID0gMDsKKwl3aGlsZSAodGltZW91dCA8IDEwMDAwICYmIGluYihkZXZjLT5iYXNlKSA9PSAweDgwKQorCQl0aW1lb3V0Kys7CisKKwlpZiAoZGV2Yy0+bW9kZWwgPj0gTURfNDIzMikKKwkJYWRfd3JpdGUoZGV2YywgMTYsIHRtcCAmIH4weDMwKTsKKworCWFkX2xlYXZlX01DRShkZXZjKTsJLyoKKwkJCQkgKiBTdGFydHMgdGhlIGNhbGlicmF0aW9uIHByb2Nlc3MuCisJCQkJICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJZGV2Yy0+eGZlcl9jb3VudCA9IDA7CisKKyNpZm5kZWYgRVhDTFVERV9USU1FUlMKKwlpZiAoZGV2ID09IHRpbWVyX2luc3RhbGxlZCAmJiBkZXZjLT50aW1lcl9ydW5uaW5nKQorCQlpZiAoKGZzICYgMHgwMSkgIT0gKG9sZF9mcyAmIDB4MDEpKQorCQl7CisJCQlhZDE4NDhfdG1yX3JlcHJvZ3JhbShkZXYpOworCQl9CisjZW5kaWYKKwlhZDE4NDhfaGFsdF9vdXRwdXQoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE4NDhfcHJlcGFyZV9mb3JfaW5wdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworCWludCB0aW1lb3V0OworCXVuc2lnbmVkIGNoYXIgZnMsIG9sZF9mcywgdG1wID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWFkMTg0OF9pbmZvICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwlpZiAoZGV2Yy0+YXVkaW9fbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJZnMgPSBwb3J0Yy0+c3BlZWRfYml0cyB8IChwb3J0Yy0+Zm9ybWF0X2JpdHMgPDwgNSk7CisKKwlpZiAocG9ydGMtPmNoYW5uZWxzID4gMSkKKwkJZnMgfD0gMHgxMDsKKworCWFkX2VudGVyX01DRShkZXZjKTsJLyogRW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBmb3JtYXQgc2VsZWN0IHJlZyAqLworCisJaWYgKChkZXZjLT5tb2RlbCA9PSBNRF8xODQ1KSB8fCAoZGV2Yy0+bW9kZWwgPT0gTURfMTg0NV9TU0NBUEUpKQkvKiBVc2UgYWx0ZXJuYXRlIHNwZWVkIHNlbGVjdCByZWdpc3RlcnMgKi8KKwl7CisJCWZzICY9IDB4ZjA7CS8qIE1hc2sgb2ZmIHRoZSByYXRlIHNlbGVjdCBiaXRzICovCisKKwkJYWRfd3JpdGUoZGV2YywgMjIsIChwb3J0Yy0+c3BlZWQgPj4gOCkgJiAweGZmKTsJLyogU3BlZWQgTVNCICovCisJCWFkX3dyaXRlKGRldmMsIDIzLCBwb3J0Yy0+c3BlZWQgJiAweGZmKTsJLyogU3BlZWQgTFNCICovCisJfQorCWlmIChkZXZjLT5tb2RlbCA9PSBNRF80MjMyKQorCXsKKwkJdG1wID0gYWRfcmVhZChkZXZjLCAxNik7CisJCWFkX3dyaXRlKGRldmMsIDE2LCB0bXAgfCAweDMwKTsKKwl9CisJaWYgKGRldmMtPm1vZGVsID09IE1EX0lXQVZFKQorCQlhZF93cml0ZShkZXZjLCAxNywgMHhjMik7CS8qIERpc2FibGUgdmFyaWFibGUgZnJlcXVlbmN5IHNlbGVjdCAqLworCisJLyoKKwkgKiBJZiBtb2RlID49IDIgKENTNDIzMSksIHNldCBJMjguIEl0J3MgdGhlIGNhcHR1cmUgZm9ybWF0IHJlZ2lzdGVyLgorCSAqLworCQorCWlmIChkZXZjLT5tb2RlbCAhPSBNRF8xODQ4KQorCXsKKwkJb2xkX2ZzID0gYWRfcmVhZChkZXZjLCAyOCk7CisJCWFkX3dyaXRlKGRldmMsIDI4LCBmcyk7CisKKwkJLyoKKwkJICogV3JpdGUgdG8gSTI4IHN0YXJ0cyByZXN5bmNocm9uaXphdGlvbi4gV2FpdCB1bnRpbCBpdCBjb21wbGV0ZXMuCisJCSAqLworCQkKKwkJdGltZW91dCA9IDA7CisJCXdoaWxlICh0aW1lb3V0IDwgMTAwICYmIGluYihkZXZjLT5iYXNlKSAhPSAweDgwKQorCQkJdGltZW91dCsrOworCisJCXRpbWVvdXQgPSAwOworCQl3aGlsZSAodGltZW91dCA8IDEwMDAwICYmIGluYihkZXZjLT5iYXNlKSA9PSAweDgwKQorCQkJdGltZW91dCsrOworCisJCWlmIChkZXZjLT5tb2RlbCAhPSBNRF8xODQ4ICYmIGRldmMtPm1vZGVsICE9IE1EXzE4NDUgJiYgZGV2Yy0+bW9kZWwgIT0gTURfMTg0NV9TU0NBUEUpCisJCXsKKwkJCS8qCisJCQkgKiBDUzQyMzEgY29tcGF0aWJsZSBkZXZpY2VzIGRvbid0IGhhdmUgc2VwYXJhdGUgc2FtcGxpbmcgcmF0ZSBzZWxlY3Rpb24KKwkJCSAqIHJlZ2lzdGVyIGZvciByZWNvcmRpbmcgYW4gcGxheWJhY2suIFRoZSBJOCByZWdpc3RlciBpcyBzaGFyZWQgc28gd2UgaGF2ZSB0bworCQkJICogc2V0IHRoZSBzcGVlZCBlbmNvZGluZyBiaXRzIG9mIGl0IHRvby4KKwkJCSAqLworCQkJdW5zaWduZWQgY2hhciAgIHRtcCA9IHBvcnRjLT5zcGVlZF9iaXRzIHwgKGFkX3JlYWQoZGV2YywgOCkgJiAweGYwKTsKKworCQkJYWRfd3JpdGUoZGV2YywgOCwgdG1wKTsKKwkJCS8qCisJCQkgKiBXcml0ZSB0byBJOCBzdGFydHMgcmVzeW5jaHJvbml6YXRpb24uIFdhaXQgdW50aWwgaXQgY29tcGxldGVzLgorCQkJICovCisJCQl0aW1lb3V0ID0gMDsKKwkJCXdoaWxlICh0aW1lb3V0IDwgMTAwICYmIGluYihkZXZjLT5iYXNlKSAhPSAweDgwKQorCQkJCXRpbWVvdXQrKzsKKworCQkJdGltZW91dCA9IDA7CisJCQl3aGlsZSAodGltZW91dCA8IDEwMDAwICYmIGluYihkZXZjLT5iYXNlKSA9PSAweDgwKQorCQkJCXRpbWVvdXQrKzsKKwkJfQorCX0KKwllbHNlCisJewkJCS8qIEZvciBBRDE4NDggc2V0IEk4LiAqLworCisJCW9sZF9mcyA9IGFkX3JlYWQoZGV2YywgOCk7CisJCWFkX3dyaXRlKGRldmMsIDgsIGZzKTsKKwkJLyoKKwkJICogV3JpdGUgdG8gSTggc3RhcnRzIHJlc3luY2hyb25pemF0aW9uLiBXYWl0IHVudGlsIGl0IGNvbXBsZXRlcy4KKwkJICovCisJCXRpbWVvdXQgPSAwOworCQl3aGlsZSAodGltZW91dCA8IDEwMCAmJiBpbmIoZGV2Yy0+YmFzZSkgIT0gMHg4MCkKKwkJCXRpbWVvdXQrKzsKKwkJdGltZW91dCA9IDA7CisJCXdoaWxlICh0aW1lb3V0IDwgMTAwMDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCisJCQl0aW1lb3V0Kys7CisJfQorCisJaWYgKGRldmMtPm1vZGVsID09IE1EXzQyMzIpCisJCWFkX3dyaXRlKGRldmMsIDE2LCB0bXAgJiB+MHgzMCk7CisKKwlhZF9sZWF2ZV9NQ0UoZGV2Yyk7CS8qCisJCQkJICogU3RhcnRzIHRoZSBjYWxpYnJhdGlvbiBwcm9jZXNzLgorCQkJCSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWRldmMtPnhmZXJfY291bnQgPSAwOworCisjaWZuZGVmIEVYQ0xVREVfVElNRVJTCisJaWYgKGRldiA9PSB0aW1lcl9pbnN0YWxsZWQgJiYgZGV2Yy0+dGltZXJfcnVubmluZykKKwl7CisJCWlmICgoZnMgJiAweDAxKSAhPSAob2xkX2ZzICYgMHgwMSkpCisJCXsKKwkJCWFkMTg0OF90bXJfcmVwcm9ncmFtKGRldik7CisJCX0KKwl9CisjZW5kaWYKKwlhZDE4NDhfaGFsdF9pbnB1dChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfaGFsdChpbnQgZGV2KQoreworCWFkMTg0OF9pbmZvICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwl1bnNpZ25lZCBjaGFyICAgYml0cyA9IGFkX3JlYWQoZGV2YywgOSk7CisKKwlpZiAoYml0cyAmIDB4MDEgJiYgKHBvcnRjLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKSkKKwkJYWQxODQ4X2hhbHRfb3V0cHV0KGRldik7CisKKwlpZiAoYml0cyAmIDB4MDIgJiYgKHBvcnRjLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpKQorCQlhZDE4NDhfaGFsdF9pbnB1dChkZXYpOworCWRldmMtPmF1ZGlvX21vZGUgPSAwOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfaGFsdF9pbnB1dChpbnQgZGV2KQoreworCWFkMTg0OF9pbmZvICAgICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlpZiAoIShhZF9yZWFkKGRldmMsIDkpICYgMHgwMikpCisJCXJldHVybjsJCS8qIENhcHR1cmUgbm90IGVuYWJsZWQgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWFkX211dGUoZGV2Yyk7CisKKwl7CisJCWludCAgICAgICAgICAgICB0bW91dDsKKwkJCisJCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkKKwkJICAgICAgICBkaXNhYmxlX2RtYShhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSk7CisKKwkJZm9yICh0bW91dCA9IDA7IHRtb3V0IDwgMTAwMDAwOyB0bW91dCsrKQorCQkJaWYgKGFkX3JlYWQoZGV2YywgMTEpICYgMHgxMCkKKwkJCQlicmVhazsKKwkJYWRfd3JpdGUoZGV2YywgOSwgYWRfcmVhZChkZXZjLCA5KSAmIH4weDAyKTsJLyogU3RvcCBjYXB0dXJlICovCisKKwkJaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KQorCQkgICAgICAgIGVuYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEpOworCQlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX0lOUFVUOworCX0KKworCW91dGIoMCwgaW9fU3RhdHVzKGRldmMpKTsJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCW91dGIoMCwgaW9fU3RhdHVzKGRldmMpKTsJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCisJZGV2Yy0+YXVkaW9fbW9kZSAmPSB+UENNX0VOQUJMRV9JTlBVVDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfaGFsdF9vdXRwdXQoaW50IGRldikKK3sKKwlhZDE4NDhfaW5mbyAqZGV2YyA9IChhZDE4NDhfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghKGFkX3JlYWQoZGV2YywgOSkgJiAweDAxKSkKKwkJcmV0dXJuOwkJLyogUGxheWJhY2sgbm90IGVuYWJsZWQgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWFkX211dGUoZGV2Yyk7CisJeworCQlpbnQgICAgICAgICAgICAgdG1vdXQ7CisKKwkJaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KQorCQkgICAgICAgIGRpc2FibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSk7CisKKwkJZm9yICh0bW91dCA9IDA7IHRtb3V0IDwgMTAwMDAwOyB0bW91dCsrKQorCQkJaWYgKGFkX3JlYWQoZGV2YywgMTEpICYgMHgxMCkKKwkJCQlicmVhazsKKwkJYWRfd3JpdGUoZGV2YywgOSwgYWRfcmVhZChkZXZjLCA5KSAmIH4weDAxKTsJLyogU3RvcCBwbGF5YmFjayAqLworCisJCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkKKwkJICAgICAgIGVuYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hKTsKKworCQlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKKwl9CisKKwlvdXRiKCgwKSwgaW9fU3RhdHVzKGRldmMpKTsJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCW91dGIoKDApLCBpb19TdGF0dXMoZGV2YykpOwkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisKKwlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfdHJpZ2dlcihpbnQgZGV2LCBpbnQgc3RhdGUpCit7CisJYWQxODQ4X2luZm8gICAgKmRldmMgPSAoYWQxODQ4X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCWFkMTg0OF9wb3J0X2luZm8gKnBvcnRjID0gKGFkMTg0OF9wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJdW5zaWduZWQgY2hhciAgIHRtcCwgb2xkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCXN0YXRlICY9IGRldmMtPmF1ZGlvX21vZGU7CisKKwl0bXAgPSBvbGQgPSBhZF9yZWFkKGRldmMsIDkpOworCisJaWYgKHBvcnRjLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpCisJeworCQkgIGlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfSU5QVVQpCisJCQkgIHRtcCB8PSAweDAyOworCQkgIGVsc2UKKwkJCSAgdG1wICY9IH4weDAyOworCX0KKwlpZiAocG9ydGMtPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpCisJeworCQlpZiAoc3RhdGUgJiBQQ01fRU5BQkxFX09VVFBVVCkKKwkJCXRtcCB8PSAweDAxOworCQllbHNlCisJCQl0bXAgJj0gfjB4MDE7CisJfQorCS8qIGFkX211dGUoZGV2Yyk7ICovCisJaWYgKHRtcCAhPSBvbGQpCisJeworCQkgIGFkX3dyaXRlKGRldmMsIDksIHRtcCk7CisJCSAgYWRfdW5tdXRlKGRldmMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWQxODQ4X2luaXRfaHcoYWQxODQ4X2luZm8gKiBkZXZjKQoreworCWludCBpOworCWludCAqaW5pdF92YWx1ZXM7CisKKwkvKgorCSAqIEluaXRpYWwgdmFsdWVzIGZvciB0aGUgaW5kaXJlY3QgcmVnaXN0ZXJzIG9mIENTNDI0OC9BRDE4NDguCisJICovCisJc3RhdGljIGludCAgICAgIGluaXRfdmFsdWVzX2FbXSA9CisJeworCQkweGE4LCAweGE4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDAwLCAweDAwLAorCQkweDAwLCAweDBjLCAweDAyLCAweDAwLCAweDhhLCAweDAxLCAweDAwLCAweDAwLAorCisJLyogUG9zaXRpb25zIDE2IHRvIDMxIGp1c3QgZm9yIENTNDIzMS8yIGFuZCBhZDE4NDUgKi8KKwkJMHg4MCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgxZiwgMHg0MCwKKwkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorCX07CisKKwlzdGF0aWMgaW50ICAgICAgaW5pdF92YWx1ZXNfYltdID0KKwl7CisJCS8qIAorCQkgICBWYWx1ZXMgZm9yIHRoZSBuZXdlciBjaGlwcworCQkgICBTb21lIG9mIHRoZSByZWdpc3RlciBpbml0aWFsaXphdGlvbiB2YWx1ZXMgd2VyZSBjaGFuZ2VkLiBJbgorCQkgICBvcmRlciB0byBnZXQgcmlkIG9mIHRoZSBjbGljayB0aGF0IHByZWNlZGVkIFBDTSBwbGF5YmFjaywKKwkJICAgY2FsaWJyYXRpb24gd2FzIGRpc2FibGVkIG9uIHRoZSAxMHRoIGJ5dGUuIE9uIHRoYXQgc2FtZSBieXRlLAorCQkgICBkdWFsIERNQSB3YXMgZW5hYmxlZDsgb24gdGhlIDExdGggYnl0ZSwgQURDIGRpdGhlcmluZyB3YXMKKwkJICAgZW5hYmxlZCwgc2luY2UgdGhhdCBpcyB0aGVvcmV0aWNhbGx5IGRlc2lyYWJsZTsgb24gdGhlIDEzdGgKKwkJICAgYnl0ZSwgTW9kZSAzIHdhcyBzZWxlY3RlZCwgdG8gZW5hYmxlIGFjY2VzcyB0byBleHRlbmRlZAorCQkgICByZWdpc3RlcnMuCisJCSAqLworCQkweGE4LCAweGE4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDAwLCAweDAwLAorCQkweDAwLCAweDAwLCAweDA2LCAweDAwLCAweGUwLCAweDAxLCAweDAwLCAweDAwLAorIAkJMHg4MCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgxZiwgMHg0MCwKKyAJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCisJLyoKKwkgKglTZWxlY3QgaW5pdGlhbGlzYXRpb24gZGF0YQorCSAqLworCSAKKwlpbml0X3ZhbHVlcyA9IGluaXRfdmFsdWVzX2E7CisJaWYoZGV2Yy0+bW9kZWwgPj0gTURfNDIzNikKKwkJaW5pdF92YWx1ZXMgPSBpbml0X3ZhbHVlc19iOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWFkX3dyaXRlKGRldmMsIGksIGluaXRfdmFsdWVzW2ldKTsKKworCisJYWRfbXV0ZShkZXZjKTsJCS8qIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgKi8KKwlhZF91bm11dGUoZGV2Yyk7CS8qIExlYXZlIGl0IHVubXV0ZWQgbm93ICovCisKKwlpZiAoZGV2Yy0+bW9kZWwgPiBNRF8xODQ4KQorCXsKKwkJaWYgKGRldmMtPm1vZGVsID09IE1EXzE4NDVfU1NDQVBFKQorCQkJYWRfd3JpdGUoZGV2YywgMTIsIGFkX3JlYWQoZGV2YywgMTIpIHwgMHg1MCk7CisJCWVsc2UgCisJCQlhZF93cml0ZShkZXZjLCAxMiwgYWRfcmVhZChkZXZjLCAxMikgfCAweDQwKTsJCS8qIE1vZGUyID0gZW5hYmxlZCAqLworCisJCWlmIChkZXZjLT5tb2RlbCA9PSBNRF9JV0FWRSkKKwkJCWFkX3dyaXRlKGRldmMsIDEyLCAweDZjKTsJLyogU2VsZWN0IGNvZGVjIG1vZGUgMyAqLworCisJCWlmIChkZXZjLT5tb2RlbCAhPSBNRF8xODQ1X1NTQ0FQRSkKKwkJCWZvciAoaSA9IDE2OyBpIDwgMzI7IGkrKykKKwkJCQlhZF93cml0ZShkZXZjLCBpLCBpbml0X3ZhbHVlc1tpXSk7CisKKwkJaWYgKGRldmMtPm1vZGVsID09IE1EX0lXQVZFKQorCQkJYWRfd3JpdGUoZGV2YywgMTYsIDB4MzApOwkvKiBQbGF5YmFjayBhbmQgY2FwdHVyZSBjb3VudGVycyBlbmFibGVkICovCisJfQorCWlmIChkZXZjLT5tb2RlbCA+IE1EXzE4NDgpCisJeworCQlpZiAoZGV2Yy0+YXVkaW9fZmxhZ3MgJiBETUFfRFVQTEVYKQorCQkJYWRfd3JpdGUoZGV2YywgOSwgYWRfcmVhZChkZXZjLCA5KSAmIH4weDA0KTsJLyogRHVhbCBETUEgbW9kZSAqLworCQllbHNlCisJCQlhZF93cml0ZShkZXZjLCA5LCBhZF9yZWFkKGRldmMsIDkpIHwgMHgwNCk7CS8qIFNpbmdsZSBETUEgbW9kZSAqLworCisJCWlmIChkZXZjLT5tb2RlbCA9PSBNRF8xODQ1IHx8IGRldmMtPm1vZGVsID09IE1EXzE4NDVfU1NDQVBFKQorCQkJYWRfd3JpdGUoZGV2YywgMjcsIGFkX3JlYWQoZGV2YywgMjcpIHwgMHgwOCk7CQkvKiBBbHRlcm5hdGUgZnJlcSBzZWxlY3QgZW5hYmxlZCAqLworCisJCWlmIChkZXZjLT5tb2RlbCA9PSBNRF9JV0FWRSkKKwkJewkJLyogU29tZSBtYWdpYyBJbnRlcndhdmUgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKwkJCWFkX3dyaXRlKGRldmMsIDEyLCAweDZjKTsJLyogU2VsZWN0IGNvZGVjIG1vZGUgMyAqLworCQkJYWRfd3JpdGUoZGV2YywgMTYsIDB4MzApOwkvKiBQbGF5YmFjayBhbmQgY2FwdHVyZSBjb3VudGVycyBlbmFibGVkICovCisJCQlhZF93cml0ZShkZXZjLCAxNywgMHhjMik7CS8qIEFsdGVybmF0ZSBmZWF0dXJlIGVuYWJsZSAqLworCQl9CisJfQorCWVsc2UKKwl7CisJCSAgZGV2Yy0+YXVkaW9fZmxhZ3MgJj0gfkRNQV9EVVBMRVg7CisJCSAgYWRfd3JpdGUoZGV2YywgOSwgYWRfcmVhZChkZXZjLCA5KSB8IDB4MDQpOwkvKiBTaW5nbGUgRE1BIG1vZGUgKi8KKwkJICBpZiAoc291bmRwcm8pCisJCQkgIGFkX3dyaXRlKGRldmMsIDEyLCBhZF9yZWFkKGRldmMsIDEyKSB8IDB4NDApOwkvKiBNb2RlMiA9IGVuYWJsZWQgKi8KKwl9CisKKwlvdXRiKCgwKSwgaW9fU3RhdHVzKGRldmMpKTsJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisKKwkvKgorCSAqIFRvZ2dsZSB0aGUgTUNFIGJpdC4gSXQgY29tcGxldGVzIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZS4KKwkgKi8KKworCWFkX2VudGVyX01DRShkZXZjKTsJLyogSW4gY2FzZSB0aGUgYml0IHdhcyBvZmYgKi8KKwlhZF9sZWF2ZV9NQ0UoZGV2Yyk7CisKKwlhZDE4NDhfbWl4ZXJfcmVzZXQoZGV2Yyk7Cit9CisKK2ludCBhZDE4NDhfZGV0ZWN0KHN0cnVjdCByZXNvdXJjZSAqcG9ydHMsIGludCAqYWRfZmxhZ3MsIGludCAqb3NwKQoreworCXVuc2lnbmVkIGNoYXIgdG1wOworCWFkMTg0OF9pbmZvICpkZXZjID0gJmFkZXZfaW5mb1tucl9hZDE4NDhfZGV2c107CisJdW5zaWduZWQgY2hhciB0bXAxID0gMHhmZiwgdG1wMiA9IDB4ZmY7CisJaW50IG9wdGlDOTMwID0gMDsJLyogT1BUaSA4MkM5MzAgZmxhZyAqLworCWludCBpbnRlcndhdmUgPSAwOworCWludCBhZDE4NDdfZmxhZyA9IDA7CisJaW50IGNzNDI0OF9mbGFnID0gMDsKKwlpbnQgc3NjYXBlX2ZsYWcgPSAwOworCWludCBpb19iYXNlID0gcG9ydHMtPnN0YXJ0OworCisJaW50IGk7CisKKwlEREIocHJpbnRrKCJhZDE4NDhfZGV0ZWN0KCV4KVxuIiwgaW9fYmFzZSkpOworCisJaWYgKGFkX2ZsYWdzKQorCXsKKwkJaWYgKCphZF9mbGFncyA9PSAweDEyMzQ1Njc4KQorCQl7CisJCQlpbnRlcndhdmUgPSAxOworCQkJKmFkX2ZsYWdzID0gMDsKKwkJfQorCQkKKwkJaWYgKCphZF9mbGFncyA9PSAweDg3NjU0MzIxKQorCQl7CisJCQlzc2NhcGVfZmxhZyA9IDE7CisJCQkqYWRfZmxhZ3MgPSAwOworCQl9CisJCQorCQlpZiAoKmFkX2ZsYWdzID09IDB4MTIzNDU2NzcpCisJCXsKKwkJICAgIGNzNDI0OF9mbGFnID0gMTsKKwkJICAgICphZF9mbGFncyA9IDA7CisJCX0KKwl9CisJaWYgKG5yX2FkMTg0OF9kZXZzID49IE1BWF9BVURJT19ERVYpCisJeworCQlwcmludGsoS0VSTl9FUlIgImFkMTg0OCAtIFRvbyBtYW55IGF1ZGlvIGRldmljZXNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmRldmMtPmxvY2spOworCWRldmMtPmJhc2UgPSBpb19iYXNlOworCWRldmMtPmlycV9vayA9IDA7CisJZGV2Yy0+dGltZXJfcnVubmluZyA9IDA7CisJZGV2Yy0+TUNFX2JpdCA9IDB4NDA7CisJZGV2Yy0+aXJxID0gMDsKKwlkZXZjLT5vcGVuX21vZGUgPSAwOworCWRldmMtPmNoaXBfbmFtZSA9IGRldmMtPm5hbWUgPSAiQUQxODQ4IjsKKwlkZXZjLT5tb2RlbCA9IE1EXzE4NDg7CS8qIEFEMTg0OCBvciBDUzQyNDggKi8KKwlkZXZjLT5sZXZlbHMgPSBOVUxMOworCWRldmMtPmRlYnVnX2ZsYWcgPSAwOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBJL08gYWRkcmVzcyBpcyBpbiB1c2UuCisJICoKKwkgKiBUaGUgYml0IDB4ODAgb2YgdGhlIGJhc2UgSS9PIHBvcnQgaXMga25vd24gdG8gYmUgMCBhZnRlciB0aGUKKwkgKiBjaGlwIGhhcyBwZXJmb3JtZWQgaXRzIHBvd2VyIG9uIGluaXRpYWxpemF0aW9uLiBKdXN0IGFzc3VtZQorCSAqIHRoaXMgaGFzIGhhcHBlbmVkIGJlZm9yZSB0aGUgT1MgaXMgc3RhcnRpbmcuCisJICoKKwkgKiBJZiB0aGUgSS9PIGFkZHJlc3MgaXMgdW51c2VkLCBpdCB0eXBpY2FsbHkgcmV0dXJucyAweGZmLgorCSAqLworCisJaWYgKGluYihkZXZjLT5iYXNlKSA9PSAweGZmKQorCXsKKwkJRERCKHByaW50aygiYWQxODQ4X2RldGVjdDogVGhlIGJhc2UgSS9PIGFkZHJlc3MgYXBwZWFycyB0byBiZSBkZWFkXG4iKSk7CisJfQorCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgZGV2aWNlIHRvIHN0b3AgaW5pdGlhbGl6YXRpb24KKwkgKi8KKwkKKwlEREIocHJpbnRrKCJhZDE4NDhfZGV0ZWN0KCkgLSBzdGVwIDBcbiIpKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDAwMDsgaSsrKQorCXsKKwkJdW5zaWduZWQgY2hhciAgIHggPSBpbmIoZGV2Yy0+YmFzZSk7CisKKwkJaWYgKHggPT0gMHhmZiB8fCAhKHggJiAweDgwKSkKKwkJCWJyZWFrOworCX0KKworCUREQihwcmludGsoImFkMTg0OF9kZXRlY3QoKSAtIHN0ZXAgQVxuIikpOworCisJaWYgKGluYihkZXZjLT5iYXNlKSA9PSAweDgwKQkvKiBOb3QgcmVhZHkuIExldCdzIHdhaXQgKi8KKwkJYWRfbGVhdmVfTUNFKGRldmMpOworCisJaWYgKChpbmIoZGV2Yy0+YmFzZSkgJiAweDgwKSAhPSAweDAwKQkvKiBOb3QgYSBBRDE4NDggKi8KKwl7CisJCUREQihwcmludGsoImFkMTg0OCBkZXRlY3QgZXJyb3IgLSBzdGVwIEEgKCUwMngpXG4iLCAoaW50KSBpbmIoZGV2Yy0+YmFzZSkpKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qCisJICogVGVzdCBpZiBpdCdzIHBvc3NpYmxlIHRvIGNoYW5nZSBjb250ZW50cyBvZiB0aGUgaW5kaXJlY3QgcmVnaXN0ZXJzLgorCSAqIFJlZ2lzdGVycyAwIGFuZCAxIGFyZSBBREMgdm9sdW1lIHJlZ2lzdGVycy4gVGhlIGJpdCAweDEwIGlzIHJlYWQgb25seQorCSAqIHNvIHRyeSB0byBhdm9pZCB1c2luZyBpdC4KKwkgKi8KKworCUREQihwcmludGsoImFkMTg0OF9kZXRlY3QoKSAtIHN0ZXAgQlxuIikpOworCWFkX3dyaXRlKGRldmMsIDAsIDB4YWEpOworCWFkX3dyaXRlKGRldmMsIDEsIDB4NDUpOwkvKiAweDU1IHdpdGggYml0IDB4MTAgY2xlYXIgKi8KKworCWlmICgodG1wMSA9IGFkX3JlYWQoZGV2YywgMCkpICE9IDB4YWEgfHwgKHRtcDIgPSBhZF9yZWFkKGRldmMsIDEpKSAhPSAweDQ1KQorCXsKKwkJaWYgKHRtcDIgPT0gMHg2NSkJLyogQUQxODQ3IGhhcyBjb3VwbGUgb2YgYml0cyBoYXJkY29kZWQgdG8gMSAqLworCQkJYWQxODQ3X2ZsYWcgPSAxOworCQllbHNlCisJCXsKKwkJCUREQihwcmludGsoImFkMTg0OCBkZXRlY3QgZXJyb3IgLSBzdGVwIEIgKCV4LyV4KVxuIiwgdG1wMSwgdG1wMikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJRERCKHByaW50aygiYWQxODQ4X2RldGVjdCgpIC0gc3RlcCBDXG4iKSk7CisJYWRfd3JpdGUoZGV2YywgMCwgMHg0NSk7CisJYWRfd3JpdGUoZGV2YywgMSwgMHhhYSk7CisKKwlpZiAoKHRtcDEgPSBhZF9yZWFkKGRldmMsIDApKSAhPSAweDQ1IHx8ICh0bXAyID0gYWRfcmVhZChkZXZjLCAxKSkgIT0gMHhhYSkKKwl7CisJCWlmICh0bXAyID09IDB4OGEpCS8qIEFEMTg0NyBoYXMgZmV3IGJpdHMgaGFyZGNvZGVkIHRvIDEgKi8KKwkJCWFkMTg0N19mbGFnID0gMTsKKwkJZWxzZQorCQl7CisJCQlEREIocHJpbnRrKCJhZDE4NDggZGV0ZWN0IGVycm9yIC0gc3RlcCBDICgleC8leClcbiIsIHRtcDEsIHRtcDIpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoKKwkgKiBUaGUgaW5kaXJlY3QgcmVnaXN0ZXIgSTEyIGhhcyBzb21lIHJlYWQgb25seSBiaXRzLiBMZXQncworCSAqIHRyeSB0byBjaGFuZ2UgdGhlbS4KKwkgKi8KKworCUREQihwcmludGsoImFkMTg0OF9kZXRlY3QoKSAtIHN0ZXAgRFxuIikpOworCXRtcCA9IGFkX3JlYWQoZGV2YywgMTIpOworCWFkX3dyaXRlKGRldmMsIDEyLCAofnRtcCkgJiAweDBmKTsKKworCWlmICgodG1wICYgMHgwZikgIT0gKCh0bXAxID0gYWRfcmVhZChkZXZjLCAxMikpICYgMHgwZikpCisJeworCQlEREIocHJpbnRrKCJhZDE4NDggZGV0ZWN0IGVycm9yIC0gc3RlcCBEICgleClcbiIsIHRtcDEpKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qCisJICogTk9URSEgTGFzdCA0IGJpdHMgb2YgdGhlIHJlZyBJMTIgdGVsbCB0aGUgY2hpcCByZXZpc2lvbi4KKwkgKiAgIDB4MDE9UmV2QiBhbmQgMHgwQT1SZXZDLgorCSAqLworCisJLyoKKwkgKiBUaGUgb3JpZ2luYWwgQUQxODQ4L0NTNDI0OCBoYXMganVzdCAxNSBpbmRpcmVjdCByZWdpc3RlcnMuIFRoaXMgbWVhbnMKKwkgKiB0aGF0IEkwIGFuZCBJMTYgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZSAoZXRjLikuCisJICogSG93ZXZlciB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoIENTNDI0OC4gQWN0dWFsbHkgaXQgc2VlbXMgdG8gYmUgaW1wb3NzaWJsZQorCSAqIHRvIGRldGVjdCBpZiB0aGUgY2hpcCBpcyBhIENTNDIzMSBvciBDUzQyNDguCisJICogRW5zdXJlIHRoYXQgdGhlIE1vZGUyIGVuYWJsZSBiaXQgb2YgSTEyIGlzIDAuIE90aGVyd2lzZSB0aGlzIHRlc3QgZmFpbHMKKwkgKiB3aXRoIENTNDIzMS4KKwkgKi8KKworCS8qCisJICogT1BUaSA4MkM5MzAgaGFzIG1vZGUyIGNvbnRyb2wgYml0IGluIGFub3RoZXIgcGxhY2UuIFRoaXMgdGVzdCB3aWxsIGZhaWwKKwkgKiB3aXRoIGl0LiBBY2NlcHQgdGhpcyBzaXR1YXRpb24gYXMgYSBwb3NzaWJsZSBpbmRpY2F0aW9uIG9mIHRoaXMgY2hpcC4KKwkgKi8KKworCUREQihwcmludGsoImFkMTg0OF9kZXRlY3QoKSAtIHN0ZXAgRlxuIikpOworCWFkX3dyaXRlKGRldmMsIDEyLCAwKTsJLyogTW9kZTI9ZGlzYWJsZWQgKi8KKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkJaWYgKCh0bXAxID0gYWRfcmVhZChkZXZjLCBpKSkgIT0gKHRtcDIgPSBhZF9yZWFkKGRldmMsIGkgKyAxNikpKQorCQl7CisJCQlEREIocHJpbnRrKCJhZDE4NDggZGV0ZWN0IHN0ZXAgRiglZC8leC8leCkgLSBPUFRpIGNoaXA/Pz9cbiIsIGksIHRtcDEsIHRtcDIpKTsKKwkJCWlmICghYWQxODQ3X2ZsYWcpCisJCQkJb3B0aUM5MzAgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIFRyeSB0byBzd2l0Y2ggdGhlIGNoaXAgdG8gbW9kZTIgKENTNDIzMSkgYnkgc2V0dGluZyB0aGUgTU9ERTIgYml0ICgweDQwKS4KKwkgKiBUaGUgYml0IDB4ODAgaXMgYWx3YXlzIDEgaW4gQ1M0MjQ4IGFuZCBDUzQyMzEuCisJICovCisKKwlEREIocHJpbnRrKCJhZDE4NDhfZGV0ZWN0KCkgLSBzdGVwIEdcbiIpKTsKKworCWlmIChhZF9mbGFncyAmJiAqYWRfZmxhZ3MgPT0gNDAwKQorCQkqYWRfZmxhZ3MgPSAwOworCWVsc2UKKwkJYWRfd3JpdGUoZGV2YywgMTIsIDB4NDApOwkvKiBTZXQgbW9kZTIsIGNsZWFyIDB4ODAgKi8KKworCisJaWYgKGFkX2ZsYWdzKQorCQkqYWRfZmxhZ3MgPSAwOworCisJdG1wMSA9IGFkX3JlYWQoZGV2YywgMTIpOworCWlmICh0bXAxICYgMHg4MCkKKwl7CisJCWlmIChhZF9mbGFncykKKwkJCSphZF9mbGFncyB8PSBBRF9GX0NTNDI0ODsKKworCQlkZXZjLT5jaGlwX25hbWUgPSAiQ1M0MjQ4IjsJLyogT3VyIGJlc3Qga25vd2xlZGdlIGp1c3Qgbm93ICovCisJfQorCWlmIChvcHRpQzkzMCB8fCAodG1wMSAmIDB4YzApID09ICgweDgwIHwgMHg0MCkpCisJeworCQkvKgorCQkgKiAgICAgIENTNDIzMSBkZXRlY3RlZCAtIGlzIGl0PworCQkgKgorCQkgKiAgICAgIFZlcmlmeSB0aGF0IHNldHRpbmcgSTAgZG9lc24ndCBjaGFuZ2UgSTE2LgorCQkgKi8KKwkJCisJCUREQihwcmludGsoImFkMTg0OF9kZXRlY3QoKSAtIHN0ZXAgSFxuIikpOworCQlhZF93cml0ZShkZXZjLCAxNiwgMCk7CS8qIFNldCBJMTYgdG8ga25vd24gdmFsdWUgKi8KKworCQlhZF93cml0ZShkZXZjLCAwLCAweDQ1KTsKKwkJaWYgKCh0bXAxID0gYWRfcmVhZChkZXZjLCAxNikpICE9IDB4NDUpCS8qIE5vIGNoYW5nZSAtPiBDUzQyMzE/ICovCisJCXsKKwkJCWFkX3dyaXRlKGRldmMsIDAsIDB4YWEpOworCQkJaWYgKCh0bXAxID0gYWRfcmVhZChkZXZjLCAxNikpID09IDB4YWEpCS8qIFJvdHRlbiBiaXRzPyAqLworCQkJeworCQkJCUREQihwcmludGsoImFkMTg0OCBkZXRlY3QgZXJyb3IgLSBzdGVwIEgoJXgpXG4iLCB0bXAxKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkKKwkJCS8qCisJCQkgKiBWZXJpZnkgdGhhdCBzb21lIGJpdHMgb2YgSTI1IGFyZSByZWFkIG9ubHkuCisJCQkgKi8KKworCQkJRERCKHByaW50aygiYWQxODQ4X2RldGVjdCgpIC0gc3RlcCBJXG4iKSk7CisJCQl0bXAxID0gYWRfcmVhZChkZXZjLCAyNSk7CS8qIE9yaWdpbmFsIGJpdHMgKi8KKwkJCWFkX3dyaXRlKGRldmMsIDI1LCB+dG1wMSk7CS8qIEludmVydCBhbGwgYml0cyAqLworCQkJaWYgKChhZF9yZWFkKGRldmMsIDI1KSAmIDB4ZTcpID09ICh0bXAxICYgMHhlNykpCisJCQl7CisJCQkJaW50IGlkOworCisJCQkJLyoKKwkJCQkgKiAgICAgIEl0J3MgYXQgbGVhc3QgQ1M0MjMxCisJCQkJICovCisKKwkJCQlkZXZjLT5jaGlwX25hbWUgPSAiQ1M0MjMxIjsKKwkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyMzE7CisJCQkJCisJCQkJLyoKKwkJCQkgKiBJdCBjb3VsZCBiZSBhbiBBRDE4NDUgb3IgQ1M0MjMxQSBhcyB3ZWxsLgorCQkJCSAqIENTNDIzMSBhbmQgQUQxODQ1IHJlcG9ydCB0aGUgc2FtZSByZXZpc2lvbiBpbmZvIGluIEkyNQorCQkJCSAqIHdoaWxlIHRoZSBDUzQyMzFBIHJlcG9ydHMgZGlmZmVyZW50LgorCQkJCSAqLworCisJCQkJaWQgPSBhZF9yZWFkKGRldmMsIDI1KTsKKwkJCQlpZiAoKGlkICYgMHhlNykgPT0gMHg4MCkJLyogRGV2aWNlIGJ1c3k/Pz8gKi8KKwkJCQkJaWQgPSBhZF9yZWFkKGRldmMsIDI1KTsKKwkJCQlpZiAoKGlkICYgMHhlNykgPT0gMHg4MCkJLyogRGV2aWNlIHN0aWxsIGJ1c3k/Pz8gKi8KKwkJCQkJaWQgPSBhZF9yZWFkKGRldmMsIDI1KTsKKwkJCQlEREIocHJpbnRrKCJhZDE4NDhfZGV0ZWN0KCkgLSBzdGVwIEogKCUwMngvJTAyeClcbiIsIGlkLCBhZF9yZWFkKGRldmMsIDI1KSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaWQgJiAweGU3KSA9PSAweDgwKSB7CisJCQkJCS8qIAorCQkJCQkgKiBJdCBtdXN0IGJlIGEgQ1M0MjMxIG9yIEFEMTg0NS4gVGhlIHJlZ2lzdGVyIEkyMyBvZgorCQkJCQkgKiBDUzQyMzEgaXMgdW5kZWZpbmVkIGFuZCBpdCBhcHBlYXJzIHRvIGJlIHJlYWQgb25seS4KKwkJCQkJICogQUQxODQ1IHVzZXMgSTIzIGZvciBzZXR0aW5nIHNhbXBsZSByYXRlLiBBc3N1bWUKKwkJCQkJICogdGhlIGNoaXAgaXMgQUQxODQ1IGlmIEkyMyBpcyBjaGFuZ2VhYmxlLgorCQkJCQkgKi8KKworCQkJCQl1bnNpZ25lZCBjaGFyICAgdG1wID0gYWRfcmVhZChkZXZjLCAyMyk7CisJCQkJCWFkX3dyaXRlKGRldmMsIDIzLCB+dG1wKTsKKworCQkJCQlpZiAoaW50ZXJ3YXZlKQorCQkJCQl7CisJCQkJCQlkZXZjLT5tb2RlbCA9IE1EX0lXQVZFOworCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIklXYXZlIjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChhZF9yZWFkKGRldmMsIDIzKSAhPSB0bXApCS8qIEFEMTg0NSA/ICovCisJCQkJCXsKKwkJCQkJCWRldmMtPmNoaXBfbmFtZSA9ICJBRDE4NDUiOworCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF8xODQ1OworCQkJCQl9CisJCQkJCWVsc2UgaWYgKGNzNDI0OF9mbGFnKQorCQkJCQl7CisJCQkJCQlpZiAoYWRfZmxhZ3MpCisJCQkJCQkJICAqYWRfZmxhZ3MgfD0gQURfRl9DUzQyNDg7CisJCQkJCQlkZXZjLT5jaGlwX25hbWUgPSAiQ1M0MjQ4IjsKKwkJCQkJCWRldmMtPm1vZGVsID0gTURfMTg0ODsKKwkJCQkJCWFkX3dyaXRlKGRldmMsIDEyLCBhZF9yZWFkKGRldmMsIDEyKSAmIH4weDQwKTsJLyogTW9kZTIgb2ZmICovCisJCQkJCX0KKwkJCQkJYWRfd3JpdGUoZGV2YywgMjMsIHRtcCk7CS8qIFJlc3RvcmUgKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJc3dpdGNoIChpZCAmIDB4MWYpIHsKKwkJCQkJY2FzZSAzOiAvKiBDUzQyMzYvQ1M0MjM1L0NTNDJ4Qi9DUzQyMzkgKi8KKwkJCQkJCXsKKwkJCQkJCQlpbnQgeGlkOworCQkJCQkJCWFkX3dyaXRlKGRldmMsIDEyLCBhZF9yZWFkKGRldmMsIDEyKSB8IDB4NjApOyAvKiBzd2l0Y2ggdG8gbW9kZSAzICovCisJCQkJCQkJYWRfd3JpdGUoZGV2YywgMjMsIDB4OWMpOyAvKiBzZWxlY3QgZXh0ZW5kZWQgcmVnaXN0ZXIgMjUgKi8KKwkJCQkJCQl4aWQgPSBpbmIoaW9fSW5kZXhlZF9EYXRhKGRldmMpKTsKKwkJCQkJCQlhZF93cml0ZShkZXZjLCAxMiwgYWRfcmVhZChkZXZjLCAxMikgJiB+MHg2MCk7IC8qIGJhY2sgdG8gbW9kZSAwICovCisJCQkJCQkJc3dpdGNoICh4aWQgJiAweDFmKQorCQkJCQkJCXsKKwkJCQkJCQkJY2FzZSAweDAwOgorCQkJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzN0IoQikiOworCQkJCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF80MnhCOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgMHgwODoKKwkJCQkJCQkJCS8qIFNlZW1zIHRvIGJlIGEgNDIzOCA/PyAqLworCQkJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzOCI7CisJCQkJCQkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyeEI7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSAweDA5OgorCQkJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzOEIiOworCQkJCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF80MnhCOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgMHgwYjoKKwkJCQkJCQkJCWRldmMtPmNoaXBfbmFtZSA9ICJDUzQyMzZCIjsKKwkJCQkJCQkJCWRldmMtPm1vZGVsID0gTURfNDIzNjsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIDB4MTA6CisJCQkJCQkJCQlkZXZjLT5jaGlwX25hbWUgPSAiQ1M0MjM3QiI7CisJCQkJCQkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyeEI7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSAweDFkOgorCQkJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzNSI7CisJCQkJCQkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyMzU7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSAweDFlOgorCQkJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzOSI7CisJCQkJCQkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyMzk7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXByaW50aygiQ2hpcCBpZGVudCBpcyAlWC5cbiIsIHhpZCYweDFGKTsKKwkJCQkJCQkJCWRldmMtPmNoaXBfbmFtZSA9ICJDUzQyeHgiOworCQkJCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF80MjMyOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAyOiAvKiBDUzQyMzIvQ1M0MjMyQSAqLworCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzMiI7CisJCQkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyMzI7CisJCQkJCQlicmVhazsKKwkJCQkKKwkJCQkJY2FzZSAwOgorCQkJCQkJaWYgKChpZCAmIDB4ZTApID09IDB4YTApCisJCQkJCQl7CisJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzMUEiOworCQkJCQkJCWRldmMtPm1vZGVsID0gTURfNDIzMUE7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDMyMSI7CisJCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF80MjMxOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDogLyogbWF5YmUgKi8KKwkJCQkJCUREQihwcmludGsoImFkMTg0ODogSTI1ID0gJTAyeC8lMDJ4XG4iLCBhZF9yZWFkKGRldmMsIDI1KSwgYWRfcmVhZChkZXZjLCAyNSkgJiAweGU3KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aUM5MzApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmMtPmNoaXBfbmFtZSA9ICI4MkM5MzAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZjLT5tb2RlbCA9IE1EX0M5MzA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzMSI7CisJCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF80MjMxOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYWRfd3JpdGUoZGV2YywgMjUsIHRtcDEpOwkvKiBSZXN0b3JlIGJpdHMgKi8KKworCQkJRERCKHByaW50aygiYWQxODQ4X2RldGVjdCgpIC0gc3RlcCBLXG4iKSk7CisJCX0KKwl9IGVsc2UgaWYgKHRtcDEgPT0gMHgwYSkgeworCQkvKgorCQkgKiBJcyBpdCBwZXJoYXBzIGEgU291bmRQcm8gQ01JODMzMD8KKwkJICogSWYgc28sIHRoZW4gd2Ugc2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIGluZGlyZWN0IHJlZ2lzdGVycworCQkgKiBncmVhdGVyIHRoYW4gSTE1IGFmdGVyIGFjdGl2YXRpbmcgTU9ERTIsIGV2ZW4gdGhvdWdoIHJlYWRpbmcKKwkJICogYmFjayBJMTIgZG9lcyBub3Qgc2hvdyBpdC4KKwkJICovCisKKwkJLyoKKwkJICogTGV0J3MgdHJ5IGNvbXBhcmluZyByZWdpc3RlciB2YWx1ZXMKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlpZiAoKHRtcDEgPSBhZF9yZWFkKGRldmMsIGkpKSAhPSAodG1wMiA9IGFkX3JlYWQoZGV2YywgaSArIDE2KSkpIHsKKwkJCQlEREIocHJpbnRrKCJhZDE4NDggZGV0ZWN0IHN0ZXAgSCglZC8leC8leCkgLSBTb3VuZFBybyBjaGlwP1xuIiwgaSwgdG1wMSwgdG1wMikpOworCQkJCXNvdW5kcHJvID0gMTsKKwkJCQlkZXZjLT5jaGlwX25hbWUgPSAiU291bmRQcm8gQ01JIDgzMzAiOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJRERCKHByaW50aygiYWQxODQ4X2RldGVjdCgpIC0gc3RlcCBMXG4iKSk7CisJaWYgKGFkX2ZsYWdzKQorCXsKKwkJICBpZiAoZGV2Yy0+bW9kZWwgIT0gTURfMTg0OCkKKwkJCSAgKmFkX2ZsYWdzIHw9IEFEX0ZfQ1M0MjMxOworCX0KKwlEREIocHJpbnRrKCJhZDE4NDhfZGV0ZWN0KCkgLSBEZXRlY3RlZCBPS1xuIikpOworCisJaWYgKGRldmMtPm1vZGVsID09IE1EXzE4NDggJiYgYWQxODQ3X2ZsYWcpCisJCWRldmMtPmNoaXBfbmFtZSA9ICJBRDE4NDciOworCisKKwlpZiAoc3NjYXBlX2ZsYWcgPT0gMSkKKwkJZGV2Yy0+bW9kZWwgPSBNRF8xODQ1X1NTQ0FQRTsKKworCXJldHVybiAxOworfQorCitpbnQgYWQxODQ4X2luaXQgKGNoYXIgKm5hbWUsIHN0cnVjdCByZXNvdXJjZSAqcG9ydHMsIGludCBpcnEsIGludCBkbWFfcGxheWJhY2ssCisJCWludCBkbWFfY2FwdHVyZSwgaW50IHNoYXJlX2RtYSwgaW50ICpvc3AsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCS8qCisJICogTk9URSEgSWYgaXJxIDwgMCwgdGhlcmUgaXMgYW5vdGhlciBkcml2ZXIgd2hpY2ggaGFzIGFsbG9jYXRlZCB0aGUgSVJRCisJICogICBzbyB0aGF0IHRoaXMgZHJpdmVyIGRvZXNuJ3QgbmVlZCB0byBhbGxvY2F0ZS9kZWFsbG9jYXRlIGl0LgorCSAqICAgVGhlIGFjdHVhbGx5IHVzZWQgSVJRIGlzIEFCUyhpcnEpLgorCSAqLworCisJaW50IG15X2RldjsKKwljaGFyIGRldl9uYW1lWzEwMF07CisJaW50IGU7CisKKwlhZDE4NDhfaW5mbyAgKmRldmMgPSAmYWRldl9pbmZvW25yX2FkMTg0OF9kZXZzXTsKKworCWFkMTg0OF9wb3J0X2luZm8gKnBvcnRjID0gTlVMTDsKKworCWRldmMtPmlycSA9IChpcnEgPiAwKSA/IGlycSA6IDA7CisJZGV2Yy0+b3Blbl9tb2RlID0gMDsKKwlkZXZjLT50aW1lcl90aWNrcyA9IDA7CisJZGV2Yy0+ZG1hMSA9IGRtYV9wbGF5YmFjazsKKwlkZXZjLT5kbWEyID0gZG1hX2NhcHR1cmU7CisJZGV2Yy0+c3VidHlwZSA9IGNmZy5jYXJkX3N1YnR5cGU7CisJZGV2Yy0+YXVkaW9fZmxhZ3MgPSBETUFfQVVUT01PREU7CisJZGV2Yy0+cGxheWJhY2tfZGV2ID0gZGV2Yy0+cmVjb3JkX2RldiA9IDA7CisJaWYgKG5hbWUgIT0gTlVMTCkKKwkJZGV2Yy0+bmFtZSA9IG5hbWU7CisKKwlpZiAobmFtZSAhPSBOVUxMICYmIG5hbWVbMF0gIT0gMCkKKwkJc3ByaW50ZihkZXZfbmFtZSwKKwkJCSIlcyAoJXMpIiwgbmFtZSwgZGV2Yy0+Y2hpcF9uYW1lKTsKKwllbHNlCisJCXNwcmludGYoZGV2X25hbWUsCisJCQkiR2VuZXJpYyBhdWRpbyBjb2RlYyAoJXMpIiwgZGV2Yy0+Y2hpcF9uYW1lKTsKKworCXJlbmFtZV9yZWdpb24ocG9ydHMsIGRldmMtPm5hbWUpOworCisJY29uZl9wcmludGYyKGRldl9uYW1lLCBkZXZjLT5iYXNlLCBkZXZjLT5pcnEsIGRtYV9wbGF5YmFjaywgZG1hX2NhcHR1cmUpOworCisJaWYgKGRldmMtPm1vZGVsID09IE1EXzE4NDggfHwgZGV2Yy0+bW9kZWwgPT0gTURfQzkzMCkKKwkJZGV2Yy0+YXVkaW9fZmxhZ3MgfD0gRE1BX0hBUkRTVE9QOworCisJaWYgKGRldmMtPm1vZGVsID4gTURfMTg0OCkKKwl7CisJCWlmIChkZXZjLT5kbWExID09IGRldmMtPmRtYTIgfHwgZGV2Yy0+ZG1hMiA9PSAtMSB8fCBkZXZjLT5kbWExID09IC0xKQorCQkJZGV2Yy0+YXVkaW9fZmxhZ3MgJj0gfkRNQV9EVVBMRVg7CisJCWVsc2UKKwkJCWRldmMtPmF1ZGlvX2ZsYWdzIHw9IERNQV9EVVBMRVg7CisJfQorCisJcG9ydGMgPSAoYWQxODQ4X3BvcnRfaW5mbyAqKSBrbWFsbG9jKHNpemVvZihhZDE4NDhfcG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYocG9ydGM9PU5VTEwpIHsKKwkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSwgNCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKG15X2RldiA9IHNvdW5kX2luc3RhbGxfYXVkaW9kcnYoQVVESU9fRFJJVkVSX1ZFUlNJT04sCisJCQkJCSAgICAgZGV2X25hbWUsCisJCQkJCSAgICAgJmFkMTg0OF9hdWRpb19kcml2ZXIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19kcml2ZXIpLAorCQkJCQkgICAgIGRldmMtPmF1ZGlvX2ZsYWdzLAorCQkJCQkgICAgIGFkX2Zvcm1hdF9tYXNrW2RldmMtPm1vZGVsXSwKKwkJCQkJICAgICBkZXZjLAorCQkJCQkgICAgIGRtYV9wbGF5YmFjaywKKwkJCQkJICAgICBkbWFfY2FwdHVyZSkpIDwgMCkKKwl7CisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDQpOworCQlrZnJlZShwb3J0Yyk7CisJCXJldHVybiAtMTsKKwl9CisJCisJYXVkaW9fZGV2c1tteV9kZXZdLT5wb3J0YyA9IHBvcnRjOworCWF1ZGlvX2RldnNbbXlfZGV2XS0+bWl4ZXJfZGV2ID0gLTE7CisJaWYgKG93bmVyKQorCQlhdWRpb19kZXZzW215X2Rldl0tPmQtPm93bmVyID0gb3duZXI7CisJbWVtc2V0KChjaGFyICopIHBvcnRjLCAwLCBzaXplb2YoKnBvcnRjKSk7CisKKwlucl9hZDE4NDhfZGV2cysrOworCisJZGV2Yy0+cG1kZXYgPSBwbV9yZWdpc3RlcihQTV9JU0FfREVWLCBteV9kZXYsIGFkMTg0OF9wbV9jYWxsYmFjayk7CisJaWYgKGRldmMtPnBtZGV2KQorCQlkZXZjLT5wbWRldi0+ZGF0YSA9IGRldmM7CisKKwlhZDE4NDhfaW5pdF9odyhkZXZjKTsKKworCWlmIChpcnEgPiAwKQorCXsKKwkJZGV2Yy0+ZGV2X25vID0gbXlfZGV2OworCQlpZiAocmVxdWVzdF9pcnEoZGV2Yy0+aXJxLCBhZGludHIsIDAsIGRldmMtPm5hbWUsICh2b2lkICopbXlfZGV2KSA8IDApCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTg0ODogVW5hYmxlIHRvIGFsbG9jYXRlIElSUVxuIik7CisJCQkvKiBEb24ndCBmcmVlIGl0IGVpdGhlciB0aGVuLi4gKi8KKwkJCWRldmMtPmlycSA9IDA7CisJCX0KKwkJaWYgKGNhcGFiaWxpdGllc1tkZXZjLT5tb2RlbF0uZmxhZ3MgJiBDQVBfRl9USU1FUikKKwkJeworI2lmbmRlZiBDT05GSUdfU01QCisJCQlpbnQgeDsKKwkJCXVuc2lnbmVkIGNoYXIgdG1wID0gYWRfcmVhZChkZXZjLCAxNik7CisjZW5kaWYJCQkKKworCQkJZGV2Yy0+dGltZXJfdGlja3MgPSAwOworCisJCQlhZF93cml0ZShkZXZjLCAyMSwgMHgwMCk7CS8qIFRpbWVyIE1TQiAqLworCQkJYWRfd3JpdGUoZGV2YywgMjAsIDB4MTApOwkvKiBUaW1lciBMU0IgKi8KKyNpZm5kZWYgQ09ORklHX1NNUAorCQkJYWRfd3JpdGUoZGV2YywgMTYsIHRtcCB8IDB4NDApOwkvKiBFbmFibGUgdGltZXIgKi8KKwkJCWZvciAoeCA9IDA7IHggPCAxMDAwMDAgJiYgZGV2Yy0+dGltZXJfdGlja3MgPT0gMDsgeCsrKTsKKwkJCWFkX3dyaXRlKGRldmMsIDE2LCB0bXAgJiB+MHg0MCk7CS8qIERpc2FibGUgdGltZXIgKi8KKworCQkJaWYgKGRldmMtPnRpbWVyX3RpY2tzID09IDApCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODQ4OiBJbnRlcnJ1cHQgdGVzdCBmYWlsZWQgKElSUSVkKVxuIiwgaXJxKTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlEREIocHJpbnRrKCJJbnRlcnJ1cHQgdGVzdCBPS1xuIikpOworCQkJCWRldmMtPmlycV9vayA9IDE7CisJCQl9CisjZWxzZQorCQkJZGV2Yy0+aXJxX29rID0gMTsKKyNlbmRpZgkJCQorCQl9CisJCWVsc2UKKwkJCWRldmMtPmlycV9vayA9IDE7CS8qIENvdWxkbid0IHRlc3QuIGFzc3VtZSBpdCdzIE9LICovCisJfSBlbHNlIGlmIChpcnEgPCAwKQorCQlpcnEyZGV2Wy1pcnFdID0gZGV2Yy0+ZGV2X25vID0gbXlfZGV2OworCisjaWZuZGVmIEVYQ0xVREVfVElNRVJTCisJaWYgKChjYXBhYmlsaXRpZXNbZGV2Yy0+bW9kZWxdLmZsYWdzICYgQ0FQX0ZfVElNRVIpICYmCisJICAgIGRldmMtPmlycV9vaykKKwkJYWQxODQ4X3Rtcl9pbnN0YWxsKG15X2Rldik7CisjZW5kaWYKKworCWlmICghc2hhcmVfZG1hKQorCXsKKwkJaWYgKHNvdW5kX2FsbG9jX2RtYShkbWFfcGxheWJhY2ssIGRldmMtPm5hbWUpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODQ4LmM6IENhbid0IGFsbG9jYXRlIERNQSVkXG4iLCBkbWFfcGxheWJhY2spOworCisJCWlmIChkbWFfY2FwdHVyZSAhPSBkbWFfcGxheWJhY2spCisJCQlpZiAoc291bmRfYWxsb2NfZG1hKGRtYV9jYXB0dXJlLCBkZXZjLT5uYW1lKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4NDguYzogQ2FuJ3QgYWxsb2NhdGUgRE1BJWRcbiIsIGRtYV9jYXB0dXJlKTsKKwl9CisKKwlpZiAoKGUgPSBzb3VuZF9pbnN0YWxsX21peGVyKE1JWEVSX0RSSVZFUl9WRVJTSU9OLAorCQkJCSAgICAgZGV2X25hbWUsCisJCQkJICAgICAmYWQxODQ4X21peGVyX29wZXJhdGlvbnMsCisJCQkJICAgICBzaXplb2Yoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLAorCQkJCSAgICAgZGV2YykpID49IDApCisJeworCQlhdWRpb19kZXZzW215X2Rldl0tPm1peGVyX2RldiA9IGU7CisJCWlmIChvd25lcikKKwkJCW1peGVyX2RldnNbZV0tPm93bmVyID0gb3duZXI7CisJfQorCXJldHVybiBteV9kZXY7Cit9CisKK2ludCBhZDE4NDhfY29udHJvbChpbnQgY21kLCBpbnQgYXJnKQoreworCWFkMTg0OF9pbmZvICpkZXZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobnJfYWQxODQ4X2RldnMgPCAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldmMgPSAmYWRldl9pbmZvW25yX2FkMTg0OF9kZXZzIC0gMV07CisKKwlzd2l0Y2ggKGNtZCkKKwl7CisJCWNhc2UgQUQxODQ4X1NFVF9YVEFMOgkvKiBDaGFuZ2UgY2xvY2sgZnJlcXVlbmN5IG9mIEFEMTg0NSAob25seSApICovCisJCQlpZiAoZGV2Yy0+bW9kZWwgIT0gTURfMTg0NSB8fCBkZXZjLT5tb2RlbCAhPSBNRF8xODQ1X1NTQ0FQRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJCWFkX2VudGVyX01DRShkZXZjKTsKKwkJCWFkX3dyaXRlKGRldmMsIDI5LCAoYWRfcmVhZChkZXZjLCAyOSkgJiAweDFmKSB8IChhcmcgPDwgNSkpOworCQkJYWRfbGVhdmVfTUNFKGRldmMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIEFEMTg0OF9NSVhFUl9SRVJPVVRFOgorCQl7CisJCQlpbnQgbyA9IChhcmcgPj4gOCkgJiAweGZmOworCQkJaW50IG4gPSBhcmcgJiAweGZmOworCisJCQlpZiAobyA8IDAgfHwgbyA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmICghKGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzICYgKDEgPDwgbykpICYmCisJCQkgICAgIShkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMgJiAoMSA8PCBvKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmIChuID09IFNPVU5EX01JWEVSX05PTkUpCisJCQl7CS8qIEp1c3QgaGlkZSB0aGlzIGNvbnRyb2wgKi8KKwkJCQlhZDE4NDhfbWl4ZXJfc2V0KGRldmMsIG8sIDApOwkvKiBTaHV0IHVwIGl0ICovCisJCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJj0gfigxIDw8IG8pOworCQkJCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyAmPSB+KDEgPDwgbyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIE1ha2UgdGhlIG1peGVyIGNvbnRyb2wgaWRlbnRpZmllZCBieSBvIHRvIGFwcGVhciBhcyBuICovCisJCQlpZiAobiA8IDAgfHwgbiA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWRldmMtPm1peGVyX3Jlcm91dGVbbl0gPSBvOwkvKiBSZW5hbWUgdGhlIGNvbnRyb2wgKi8KKwkJCWlmIChkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmICgxIDw8IG8pKQorCQkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzIHw9ICgxIDw8IG4pOworCQkJaWYgKGRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyAmICgxIDw8IG8pKQorCQkJCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyB8PSAoMSA8PCBuKTsKKworCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJj0gfigxIDw8IG8pOworCQkJZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzICY9IH4oMSA8PCBvKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWQxODQ4X3VubG9hZChpbnQgaW9fYmFzZSwgaW50IGlycSwgaW50IGRtYV9wbGF5YmFjaywgaW50IGRtYV9jYXB0dXJlLCBpbnQgc2hhcmVfZG1hKQoreworCWludCBpLCBtaXhlciwgZGV2ID0gMDsKKwlhZDE4NDhfaW5mbyAqZGV2YyA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBkZXZjID09IE5VTEwgJiYgaSA8IG5yX2FkMTg0OF9kZXZzOyBpKyspCisJeworCQlpZiAoYWRldl9pbmZvW2ldLmJhc2UgPT0gaW9fYmFzZSkKKwkJeworCQkJZGV2YyA9ICZhZGV2X2luZm9baV07CisJCQlkZXYgPSBkZXZjLT5kZXZfbm87CisJCX0KKwl9CisJCQorCWlmIChkZXZjICE9IE5VTEwpCisJeworCQlpZihhdWRpb19kZXZzW2Rldl0tPnBvcnRjIT1OVUxMKQorCQkJa2ZyZWUoYXVkaW9fZGV2c1tkZXZdLT5wb3J0Yyk7CisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDQpOworCisJCWlmICghc2hhcmVfZG1hKQorCQl7CisJCQlpZiAoZGV2Yy0+aXJxID4gMCkgLyogVGhlcmUgaXMgbm8gcG9pbnQgaW4gZnJlZWluZyBpcnEsIGlmIGl0IHdhc24ndCBhbGxvY2F0ZWQgKi8KKwkJCQlmcmVlX2lycShkZXZjLT5pcnEsICh2b2lkICopZGV2Yy0+ZGV2X25vKTsKKworCQkJc291bmRfZnJlZV9kbWEoZG1hX3BsYXliYWNrKTsKKworCQkJaWYgKGRtYV9wbGF5YmFjayAhPSBkbWFfY2FwdHVyZSkKKwkJCQlzb3VuZF9mcmVlX2RtYShkbWFfY2FwdHVyZSk7CisKKwkJfQorCQltaXhlciA9IGF1ZGlvX2RldnNbZGV2Yy0+ZGV2X25vXS0+bWl4ZXJfZGV2OworCQlpZihtaXhlcj49MCkKKwkJCXNvdW5kX3VubG9hZF9taXhlcmRldihtaXhlcik7CisKKwkJaWYgKGRldmMtPnBtZGV2KQorCQkJcG1fdW5yZWdpc3RlcihkZXZjLT5wbWRldik7CisKKwkJbnJfYWQxODQ4X2RldnMtLTsKKwkJZm9yICggOyBpIDwgbnJfYWQxODQ4X2RldnMgOyBpKyspCisJCQlhZGV2X2luZm9baV0gPSBhZGV2X2luZm9baSsxXTsKKwl9CisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIgImFkMTg0ODogQ2FuJ3QgZmluZCBkZXZpY2UgdG8gYmUgdW5sb2FkZWQuIEJhc2U9JXhcbiIsIGlvX2Jhc2UpOworfQorCitpcnFyZXR1cm5fdCBhZGludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJYWQxODQ4X2luZm8gKmRldmM7CisJaW50IGRldjsKKwlpbnQgYWx0X3N0YXQgPSAweGZmOworCXVuc2lnbmVkIGNoYXIgYzkzMF9zdGF0ID0gMDsKKwlpbnQgY250ID0gMDsKKworCWRldiA9IChpbnQpZGV2X2lkOworCWRldmMgPSAoYWQxODQ4X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCitpbnRlcnJ1cHRfYWdhaW46CQkvKiBKdW1wIGJhY2sgaGVyZSBpZiBpbnQgc3RhdHVzIGRvZXNuJ3QgcmVzZXQgKi8KKworCXN0YXR1cyA9IGluYihpb19TdGF0dXMoZGV2YykpOworCisJaWYgKHN0YXR1cyA9PSAweDgwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiYWRpbnRyOiBXaHk/XG4iKTsKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURfMTg0OCkKKwkJb3V0YigoMCksIGlvX1N0YXR1cyhkZXZjKSk7CS8qIENsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKworCWlmIChzdGF0dXMgJiAweDAxKQorCXsKKwkJaWYgKGRldmMtPm1vZGVsID09IE1EX0M5MzApCisJCXsJCS8qIDgyQzkzMCBoYXMgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBpbiBNQUQxNiByZWdpc3RlciBNQzExICovCisKKwkJCXNwaW5fbG9jaygmZGV2Yy0+bG9jayk7CisKKwkJCS8qIDB4ZTBlIGlzIEM5MzAgYWRkcmVzcyBwb3J0CisJCQkgKiAweGUwZiBpcyBDOTMwIGRhdGEgcG9ydAorCQkJICovCisJCQlvdXRiKDExLCAweGUwZSk7CisJCQljOTMwX3N0YXQgPSBpbmIoMHhlMGYpOworCQkJb3V0YigofmM5MzBfc3RhdCksIDB4ZTBmKTsKKworCQkJc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOworCisJCQlhbHRfc3RhdCA9IChjOTMwX3N0YXQgPDwgMikgJiAweDMwOworCQl9CisJCWVsc2UgaWYgKGRldmMtPm1vZGVsICE9IE1EXzE4NDgpCisJCXsKKwkJCXNwaW5fbG9jaygmZGV2Yy0+bG9jayk7CisJCQlhbHRfc3RhdCA9IGFkX3JlYWQoZGV2YywgMjQpOworCQkJYWRfd3JpdGUoZGV2YywgMjQsIGFkX3JlYWQoZGV2YywgMjQpICYgfmFsdF9zdGF0KTsJLyogU2VsZWN0aXZlIGFjayAqLworCQkJc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOworCQl9CisKKwkJaWYgKChkZXZjLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpICYmIChkZXZjLT5hdWRpb19tb2RlICYgUENNX0VOQUJMRV9JTlBVVCkgJiYgKGFsdF9zdGF0ICYgMHgyMCkpCisJCXsKKwkJCURNQWJ1Zl9pbnB1dGludHIoZGV2Yy0+cmVjb3JkX2Rldik7CisJCX0KKwkJaWYgKChkZXZjLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKSAmJiAoZGV2Yy0+YXVkaW9fbW9kZSAmIFBDTV9FTkFCTEVfT1VUUFVUKSAmJgorCQkgICAgICAoYWx0X3N0YXQgJiAweDEwKSkKKwkJeworCQkJRE1BYnVmX291dHB1dGludHIoZGV2Yy0+cGxheWJhY2tfZGV2LCAxKTsKKwkJfQorCQlpZiAoZGV2Yy0+bW9kZWwgIT0gTURfMTg0OCAmJiAoYWx0X3N0YXQgJiAweDQwKSkJLyogVGltZXIgaW50ZXJydXB0ICovCisJCXsKKwkJCWRldmMtPnRpbWVyX3RpY2tzKys7CisjaWZuZGVmIEVYQ0xVREVfVElNRVJTCisJCQlpZiAodGltZXJfaW5zdGFsbGVkID09IGRldiAmJiBkZXZjLT50aW1lcl9ydW5uaW5nKQorCQkJCXNvdW5kX3RpbWVyX2ludGVycnVwdCgpOworI2VuZGlmCisJCX0KKwl9CisvKgorICogU29tZXRpbWVzIHBsYXliYWNrIG9yIGNhcHR1cmUgaW50ZXJydXB0cyBvY2N1ciB3aGlsZSBhIHRpbWVyIGludGVycnVwdAorICogaXMgYmVpbmcgaGFuZGxlZC4gVGhlIGludGVycnVwdCB3aWxsIG5vdCBiZSByZXRyaWdnZXJlZCBpZiB3ZSBkb24ndAorICogaGFuZGxlIGl0IG5vdy4gQ2hlY2sgaWYgYW4gaW50ZXJydXB0IGlzIHN0aWxsIHBlbmRpbmcgYW5kIHJlc3RhcnQKKyAqIHRoZSBoYW5kbGVyIGluIHRoaXMgY2FzZS4KKyAqLworCWlmIChpbmIoaW9fU3RhdHVzKGRldmMpKSAmIDB4MDEgJiYgY250KysgPCA0KQorCXsKKwkJICBnb3RvIGludGVycnVwdF9hZ2FpbjsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICoJRXhwZXJpbWVudGFsIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGZvciB0aGUgaW50ZWdyYXRlZCBzb3VuZCBzeXN0ZW0KKyAqCW9mIHRoZSBDb21wYXEgRGVza3BybyBNLgorICovCisKK3N0YXRpYyBpbnQgaW5pdF9kZXNrcHJvX20oc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIGNoYXIgICB0bXA7CisKKwlpZiAoKHRtcCA9IGluYigweGM0NCkpID09IDB4ZmYpCisJeworCQlEREIocHJpbnRrKCJpbml0X2Rlc2twcm9fbTogRGVhZCBwb3J0IDB4YzQ0XG4iKSk7CisJCXJldHVybiAwOworCX0KKworCW91dGIoMHgxMCwgMHhjNDQpOworCW91dGIoMHg0MCwgMHhjNDUpOworCW91dGIoMHgwMCwgMHhjNDYpOworCW91dGIoMHhlOCwgMHhjNDcpOworCW91dGIoMHgxNCwgMHhjNDQpOworCW91dGIoMHg0MCwgMHhjNDUpOworCW91dGIoMHgwMCwgMHhjNDYpOworCW91dGIoMHhlOCwgMHhjNDcpOworCW91dGIoMHgxMCwgMHhjNDQpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKglFeHBlcmltZW50YWwgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgZm9yIHRoZSBpbnRlZ3JhdGVkIHNvdW5kIHN5c3RlbQorICoJb2YgQ29tcGFxIERlc2twcm8gWEwuCisgKi8KKworc3RhdGljIGludCBpbml0X2Rlc2twcm8oc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIGNoYXIgICB0bXA7CisKKwlpZiAoKHRtcCA9IGluYigweGM0NCkpID09IDB4ZmYpCisJeworCQlEREIocHJpbnRrKCJpbml0X2Rlc2twcm86IERlYWQgcG9ydCAweGM0NFxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0YigodG1wIHwgMHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbmsgMSAqLworCWlmIChpbmIoMHhjNDQpICE9IDB4MDQpCisJeworCQlEREIocHJpbnRrKCJpbml0X2Rlc2twcm86IEludmFsaWQgYmFuazEgc2lnbmF0dXJlIGluIHBvcnQgMHhjNDRcbiIpKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogT0suIEl0IGxvb2tzIGxpa2UgYSBEZXNrcHJvIHNvIGxldCdzIHByb2NlZWQuCisJICovCisKKwkvKgorCSAqIEkvTyBwb3J0IDB4YzQ0IEF1ZGlvIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCisJICoKKwkgKiBiaXRzIDB4YzA6ICAgQXVkaW8gcmV2aXNpb24gYml0cworCSAqICAgICAgICAgICAgICAweDAwID0gQ29tcGFxIEJ1c2luZXNzIEF1ZGlvCisJICogICAgICAgICAgICAgIDB4NDAgPSBNUyBTb3VuZCBTeXN0ZW0gQ29tcGF0aWJsZSAocmVzZXQgZGVmYXVsdCkKKwkgKiAgICAgICAgICAgICAgMHg4MCA9IFJlc2VydmVkCisJICogICAgICAgICAgICAgIDB4YzAgPSBSZXNlcnZlZAorCSAqIGJpdCAweDIwOiAgICBObyBXYWl0IFN0YXRlIEVuYWJsZQorCSAqICAgICAgICAgICAgICAweDAwID0gRGlzYWJsZWQgKHJlc2V0IGRlZmF1bHQsIERNQSBtb2RlKQorCSAqICAgICAgICAgICAgICAweDIwID0gRW5hYmxlZCAocHJvZ3JhbW1lZCBJL08gbW9kZSkKKwkgKiBiaXQgMHgxMDogICAgTVMgU291bmQgU3lzdGVtIERlY29kZSBFbmFibGUKKwkgKiAgICAgICAgICAgICAgMHgwMCA9IERlY29kaW5nIGRpc2FibGVkIChyZXNldCBkZWZhdWx0KQorCSAqICAgICAgICAgICAgICAweDEwID0gRGVjb2RpbmcgZW5hYmxlZAorCSAqIGJpdCAweDA4OiAgICBGTSBTeW50aGVzaXMgRGVjb2RlIEVuYWJsZQorCSAqICAgICAgICAgICAgICAweDAwID0gRGVjb2RpbmcgRGlzYWJsZWQgKHJlc2V0IGRlZmF1bHQpCisJICogICAgICAgICAgICAgIDB4MDggPSBEZWNvZGluZyBlbmFibGVkCisJICogYml0IDB4MDQgICAgIEJhbmsgc2VsZWN0CisJICogICAgICAgICAgICAgIDB4MDAgPSBCYW5rIDAKKwkgKiAgICAgICAgICAgICAgMHgwNCA9IEJhbmsgMQorCSAqIGJpdHMgMHgwMyAgICBNU1MgQmFzZSBhZGRyZXNzCisJICogICAgICAgICAgICAgIDB4MDAgPSAweDUzMCAocmVzZXQgZGVmYXVsdCkKKwkgKiAgICAgICAgICAgICAgMHgwMSA9IDB4NjA0CisJICogICAgICAgICAgICAgIDB4MDIgPSAweGY0MAorCSAqICAgICAgICAgICAgICAweDAzID0gMHhlODAKKwkgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NCAoYmVmb3JlKTogIik7CisJb3V0YigodG1wICYgfjB4MDQpLCAweGM0NCk7CisJcHJpbnRrKCIlMDJ4ICIsIGluYigweGM0NCkpOworCW91dGIoKHRtcCB8IDB4MDQpLCAweGM0NCk7CisJcHJpbnRrKCIlMDJ4XG4iLCBpbmIoMHhjNDQpKTsKKyNlbmRpZgorCisJLyogU2V0IGJhbmsgMSBvZiB0aGUgcmVnaXN0ZXIgKi8KKwl0bXAgPSAweDU4OwkJLyogTVNTIE1vZGUsIE1TUyZGTSBkZWNvZGUgZW5hYmxlZCAqLworCisJc3dpdGNoIChod19jb25maWctPmlvX2Jhc2UpCisJeworCQljYXNlIDB4NTMwOgorCQkJdG1wIHw9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAweDYwNDoKKwkJCXRtcCB8PSAweDAxOworCQkJYnJlYWs7CisJCWNhc2UgMHhmNDA6CisJCQl0bXAgfD0gMHgwMjsKKwkJCWJyZWFrOworCQljYXNlIDB4ZTgwOgorCQkJdG1wIHw9IDB4MDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUREQihwcmludGsoImluaXRfZGVza3BybzogSW52YWxpZCBNU1MgcG9ydCAleFxuIiwgaHdfY29uZmlnLT5pb19iYXNlKSk7CisJCQlyZXR1cm4gMDsKKwl9CisJb3V0YigodG1wICYgfjB4MDQpLCAweGM0NCk7CS8qIFdyaXRlIHRvIGJhbms9MCAqLworCisjaWZkZWYgREVCVUdYTAorCS8qIERlYnVnIHByaW50aW5nICovCisJcHJpbnRrKCJQb3J0IDB4YzQ0IChhZnRlcik6ICIpOworCW91dGIoKHRtcCAmIH4weDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0wICovCisJcHJpbnRrKCIlMDJ4ICIsIGluYigweGM0NCkpOworCW91dGIoKHRtcCB8IDB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTEgKi8KKwlwcmludGsoIiUwMnhcbiIsIGluYigweGM0NCkpOworI2VuZGlmCisKKwkvKgorCSAqIEkvTyBwb3J0IDB4YzQ1IEZNIEFkZHJlc3MgRGVjb2RlL01TUyBJRCBSZWdpc3Rlci4KKwkgKgorCSAqIGJhbms9MCwgYml0cyAweGZlOiAgIEZNIHN5bnRoZXNpcyBEZWNvZGUgQ29tcGFyZSBiaXRzIDc6MSAoZGVmYXVsdD0weDg4KQorCSAqIGJhbms9MCwgYml0IDB4MDE6ICAgIFNCSUMgUG93ZXIgQ29udHJvbCBCaXQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAweDAwID0gUG93ZXJlZCB1cAorCSAqICAgICAgICAgICAgICAgICAgICAgIDB4MDEgPSBQb3dlcmVkIGRvd24KKwkgKiBiYW5rPTEsIGJpdHMgMHhmYzogICBNU1MgSUQgKGRlZmF1bHQ9MHg0MCkKKwkgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NSAoYmVmb3JlKTogIik7CisJb3V0YigodG1wICYgfjB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTAgKi8KKwlwcmludGsoIiUwMnggIiwgaW5iKDB4YzQ1KSk7CisJb3V0YigodG1wIHwgMHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MSAqLworCXByaW50aygiJTAyeFxuIiwgaW5iKDB4YzQ1KSk7CisjZW5kaWYKKworCW91dGIoKHRtcCAmIH4weDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0wICovCisJb3V0YigoMHg4OCksIDB4YzQ1KTsJLyogRk0gYmFzZSA3OjAgPSAweDg4ICovCisJb3V0YigodG1wIHwgMHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MSAqLworCW91dGIoKDB4MTApLCAweGM0NSk7CS8qIE1TUyBJRCA9IDB4MTAgKE1TUyBwb3J0IHJldHVybnMgMHgwNCkgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NSAoYWZ0ZXIpOiAiKTsKKwlvdXRiKCh0bXAgJiB+MHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MCAqLworCXByaW50aygiJTAyeCAiLCBpbmIoMHhjNDUpKTsKKwlvdXRiKCh0bXAgfCAweDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0xICovCisJcHJpbnRrKCIlMDJ4XG4iLCBpbmIoMHhjNDUpKTsKKyNlbmRpZgorCisKKwkvKgorCSAqIEkvTyBwb3J0IDB4YzQ2IEZNIEFkZHJlc3MgRGVjb2RlL0FkZHJlc3MgQVNJQyBSZXZpc2lvbiBSZWdpc3Rlci4KKwkgKgorCSAqIGJhbms9MCwgYml0cyAweGZmOiAgIEZNIHN5bnRoZXNpcyBEZWNvZGUgQ29tcGFyZSBiaXRzIDE1OjggKGRlZmF1bHQ9MHgwMykKKwkgKiBiYW5rPTEsIGJpdHMgMHhmZjogICBBdWRpbyBhZGRyZXNzaW5nIEFTSUMgaWQKKwkgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NiAoYmVmb3JlKTogIik7CisJb3V0YigodG1wICYgfjB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTAgKi8KKwlwcmludGsoIiUwMnggIiwgaW5iKDB4YzQ2KSk7CisJb3V0YigodG1wIHwgMHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MSAqLworCXByaW50aygiJTAyeFxuIiwgaW5iKDB4YzQ2KSk7CisjZW5kaWYKKworCW91dGIoKHRtcCAmIH4weDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0wICovCisJb3V0YigoMHgwMyksIDB4YzQ2KTsJLyogRk0gYmFzZSAxNTo4ID0gMHgwMyAqLworCW91dGIoKHRtcCB8IDB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTEgKi8KKwlvdXRiKCgweDExKSwgMHhjNDYpOwkvKiBBU0lDIElEID0gMHgxMSAqLworCisjaWZkZWYgREVCVUdYTAorCS8qIERlYnVnIHByaW50aW5nICovCisJcHJpbnRrKCJQb3J0IDB4YzQ2IChhZnRlcik6ICIpOworCW91dGIoKHRtcCAmIH4weDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0wICovCisJcHJpbnRrKCIlMDJ4ICIsIGluYigweGM0NikpOworCW91dGIoKHRtcCB8IDB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTEgKi8KKwlwcmludGsoIiUwMnhcbiIsIGluYigweGM0NikpOworI2VuZGlmCisKKwkvKgorCSAqIEkvTyBwb3J0IDB4YzQ3IEZNIEFkZHJlc3MgRGVjb2RlIFJlZ2lzdGVyLgorCSAqCisJICogYmFuaz0wLCBiaXRzIDB4ZmY6ICAgRGVjb2RlIGVuYWJsZSBzZWxlY3Rpb24gZm9yIHZhcmlvdXMgRk0gYWRkcmVzcyBiaXRzCisJICogYmFuaz0xLCBiaXRzIDB4ZmY6ICAgUmVzZXJ2ZWQKKwkgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NyAoYmVmb3JlKTogIik7CisJb3V0YigodG1wICYgfjB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTAgKi8KKwlwcmludGsoIiUwMnggIiwgaW5iKDB4YzQ3KSk7CisJb3V0YigodG1wIHwgMHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MSAqLworCXByaW50aygiJTAyeFxuIiwgaW5iKDB4YzQ3KSk7CisjZW5kaWYKKworCW91dGIoKHRtcCAmIH4weDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0wICovCisJb3V0YigoMHg3YyksIDB4YzQ3KTsJLyogRk0gZGVjb2RlIGVuYWJsZSBiaXRzID0gMHg3YyAqLworCW91dGIoKHRtcCB8IDB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTEgKi8KKwlvdXRiKCgweDAwKSwgMHhjNDcpOwkvKiBSZXNlcnZlZCBiYW5rMSA9IDB4MDAgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NyAoYWZ0ZXIpOiAiKTsKKwlvdXRiKCh0bXAgJiB+MHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MCAqLworCXByaW50aygiJTAyeCAiLCBpbmIoMHhjNDcpKTsKKwlvdXRiKCh0bXAgfCAweDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0xICovCisJcHJpbnRrKCIlMDJ4XG4iLCBpbmIoMHhjNDcpKTsKKyNlbmRpZgorCisJLyoKKwkgKiBJL08gcG9ydCAweGM2ZiA9IEF1ZGlvIERpc2FibGUgRnVuY3Rpb24gUmVnaXN0ZXIKKwkgKi8KKworI2lmZGVmIERFQlVHWEwKKwlwcmludGsoIlBvcnQgMHhjNmYgKGJlZm9yZSkgPSAlMDJ4XG4iLCBpbmIoMHhjNmYpKTsKKyNlbmRpZgorCisJb3V0YigoMHg4MCksIDB4YzZmKTsKKworI2lmZGVmIERFQlVHWEwKKwlwcmludGsoIlBvcnQgMHhjNmYgKGFmdGVyKSA9ICUwMnhcbiIsIGluYigweGM2ZikpOworI2VuZGlmCisKKwlyZXR1cm4gMTsKK30KKworaW50IHByb2JlX21zX3NvdW5kKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IHJlc291cmNlICpwb3J0cykKK3sKKwl1bnNpZ25lZCBjaGFyICAgdG1wOworCisJRERCKHByaW50aygiRW50ZXJlZCBwcm9iZV9tc19zb3VuZCgleCwgJWQpXG4iLCBod19jb25maWctPmlvX2Jhc2UsIGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlKSk7CisKKwlpZiAoaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUgPT0gMSkJLyogSGFzIG5vIElSUS9ETUEgcmVnaXN0ZXJzICovCisJeworCQkvKiBjaGVja19vcGwzKDB4Mzg4LCBod19jb25maWcpOyAqLworCQlyZXR1cm4gYWQxODQ4X2RldGVjdChwb3J0cywgTlVMTCwgaHdfY29uZmlnLT5vc3ApOworCX0KKworCWlmIChkZXNrcHJvX3hsICYmIGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlID09IDIpCS8qIENvbXBhcSBEZXNrcHJvIFhMICovCisJeworCQlpZiAoIWluaXRfZGVza3Bybyhod19jb25maWcpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRlc2twcm9fbSkJLyogQ29tcGFxIERlc2twcm8gTSAqLworCXsKKwkJaWYgKCFpbml0X2Rlc2twcm9fbShod19jb25maWcpKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgICAqIENoZWNrIGlmIHRoZSBJTyBwb3J0IHJldHVybnMgdmFsaWQgc2lnbmF0dXJlLiBUaGUgb3JpZ2luYWwgTVMgU291bmQKKwkgICAqIHN5c3RlbSByZXR1cm5zIDB4MDQgd2hpbGUgc29tZSBjYXJkcyAoQXVkaW9Ucml4IFBybyBmb3IgZXhhbXBsZSkKKwkgICAqIHJldHVybiAweDAwIG9yIDB4MGYuCisJICovCisKKwlpZiAoKHRtcCA9IGluYihod19jb25maWctPmlvX2Jhc2UgKyAzKSkgPT0gMHhmZikJLyogQnVzIGZsb2F0ICovCisJeworCQkgIGludCAgICAgICAgICAgICByZXQ7CisKKwkJICBEREIocHJpbnRrKCJJL08gYWRkcmVzcyBpcyBpbmFjdGl2ZSAoJXgpXG4iLCB0bXApKTsKKwkJICBpZiAoIShyZXQgPSBhZDE4NDhfZGV0ZWN0KHBvcnRzLCBOVUxMLCBod19jb25maWctPm9zcCkpKQorCQkJICByZXR1cm4gMDsKKwkJICByZXR1cm4gMTsKKwl9CisJRERCKHByaW50aygiTVNTIHNpZ25hdHVyZSA9ICV4XG4iLCB0bXAgJiAweDNmKSk7CisJaWYgKCh0bXAgJiAweDNmKSAhPSAweDA0ICYmCisJICAgICh0bXAgJiAweDNmKSAhPSAweDBmICYmCisJICAgICh0bXAgJiAweDNmKSAhPSAweDAwKQorCXsKKwkJaW50IHJldDsKKworCQlNREIocHJpbnRrKEtFUk5fRVJSICJObyBNU1Mgc2lnbmF0dXJlIGRldGVjdGVkIG9uIHBvcnQgMHgleCAoMHgleClcbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSwgKGludCkgaW5iKGh3X2NvbmZpZy0+aW9fYmFzZSArIDMpKSk7CisJCUREQihwcmludGsoIlRyeWluZyB0byBkZXRlY3QgY29kZWMgYW55d2F5IGJ1dCBJUlEvRE1BIG1heSBub3Qgd29ya1xuIikpOworCQlpZiAoIShyZXQgPSBhZDE4NDhfZGV0ZWN0KHBvcnRzLCBOVUxMLCBod19jb25maWctPm9zcCkpKQorCQkJcmV0dXJuIDA7CisKKwkJaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUgPSAxOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKChod19jb25maWctPmlycSAhPSA1KSAgJiYKKwkgICAgKGh3X2NvbmZpZy0+aXJxICE9IDcpICAmJgorCSAgICAoaHdfY29uZmlnLT5pcnEgIT0gOSkgICYmCisJICAgIChod19jb25maWctPmlycSAhPSAxMCkgJiYKKwkgICAgKGh3X2NvbmZpZy0+aXJxICE9IDExKSAmJgorCSAgICAoaHdfY29uZmlnLT5pcnEgIT0gMTIpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJNU1M6IEJhZCBJUlEgJWRcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChod19jb25maWctPmRtYSAhPSAwICYmIGh3X2NvbmZpZy0+ZG1hICE9IDEgJiYgaHdfY29uZmlnLT5kbWEgIT0gMykKKwl7CisJCSAgcHJpbnRrKEtFUk5fRVJSICJNU1M6IEJhZCBETUEgJWRcbiIsIGh3X2NvbmZpZy0+ZG1hKTsKKwkJICByZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBDaGVjayB0aGF0IERNQTAgaXMgbm90IGluIHVzZSB3aXRoIGEgOCBiaXQgYm9hcmQuCisJICovCisKKwlpZiAoaHdfY29uZmlnLT5kbWEgPT0gMCAmJiBpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgMykgJiAweDgwKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJNU1M6IENhbid0IHVzZSBETUEwIHdpdGggYSA4IGJpdCBjYXJkL3Nsb3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGh3X2NvbmZpZy0+aXJxID4gNyAmJiBod19jb25maWctPmlycSAhPSA5ICYmIGluYihod19jb25maWctPmlvX2Jhc2UgKyAzKSAmIDB4ODApCisJeworCQlwcmludGsoS0VSTl9FUlIgIk1TUzogQ2FuJ3QgdXNlIElSUSVkIHdpdGggYSA4IGJpdCBjYXJkL3Nsb3RcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBhZDE4NDhfZGV0ZWN0KHBvcnRzLCBOVUxMLCBod19jb25maWctPm9zcCk7Cit9CisKK3ZvaWQgYXR0YWNoX21zX3NvdW5kKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IHJlc291cmNlICpwb3J0cywgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJc3RhdGljIHNpZ25lZCBjaGFyIGludGVycnVwdF9iaXRzWzEyXSA9CisJeworCQktMSwgLTEsIC0xLCAtMSwgLTEsIDB4MDAsIC0xLCAweDA4LCAtMSwgMHgxMCwgMHgxOCwgMHgyMAorCX07CisJc2lnbmVkIGNoYXIgICAgIGJpdHM7CisJY2hhciAgICAgICAgICAgIGRtYTJfYml0ID0gMDsKKworCXN0YXRpYyBjaGFyICAgICBkbWFfYml0c1s0XSA9CisJeworCQkxLCAyLCAwLCAzCisJfTsKKworCWludCBjb25maWdfcG9ydCA9IGh3X2NvbmZpZy0+aW9fYmFzZSArIDA7CisJaW50IHZlcnNpb25fcG9ydCA9IGh3X2NvbmZpZy0+aW9fYmFzZSArIDM7CisJaW50IGRtYSA9IGh3X2NvbmZpZy0+ZG1hOworCWludCBkbWEyID0gaHdfY29uZmlnLT5kbWEyOworCisJaWYgKGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlID09IDEpCS8qIEhhcyBubyBJUlEvRE1BIHJlZ2lzdGVycyAqLworCXsKKwkJaHdfY29uZmlnLT5zbG90c1swXSA9IGFkMTg0OF9pbml0KCJNUyBTb3VuZCBTeXN0ZW0iLCBwb3J0cywKKwkJCQkJCSAgICBod19jb25maWctPmlycSwKKwkJCQkJCSAgICBod19jb25maWctPmRtYSwKKwkJCQkJCSAgICBod19jb25maWctPmRtYTIsIDAsIAorCQkJCQkJICAgIGh3X2NvbmZpZy0+b3NwLAorCQkJCQkJICAgIG93bmVyKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIFNldCB0aGUgSVJRIGFuZCBETUEgYWRkcmVzc2VzLgorCSAqLworCisJYml0cyA9IGludGVycnVwdF9iaXRzW2h3X2NvbmZpZy0+aXJxXTsKKwlpZiAoYml0cyA9PSAtMSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiTVNTOiBCYWQgSVJRICVkXG4iLCBod19jb25maWctPmlycSk7CisJCXJlbGVhc2VfcmVnaW9uKHBvcnRzLT5zdGFydCwgNCk7CisJCXJlbGVhc2VfcmVnaW9uKHBvcnRzLT5zdGFydCAtIDQsIDQpOworCQlyZXR1cm47CisJfQorCW91dGIoKGJpdHMgfCAweDQwKSwgY29uZmlnX3BvcnQpOworCWlmICgoaW5iKHZlcnNpb25fcG9ydCkgJiAweDQwKSA9PSAwKQorCQlwcmludGsoS0VSTl9FUlIgIltNU1M6IElSUSBDb25mbGljdD9dXG4iKTsKKworLyoKKyAqIEhhbmRsZSB0aGUgY2FwdHVyZSBETUEgY2hhbm5lbAorICovCisKKwlpZiAoZG1hMiAhPSAtMSAmJiBkbWEyICE9IGRtYSkKKwl7CisJCWlmICghKChkbWEgPT0gMCAmJiBkbWEyID09IDEpIHx8CisJCQkoZG1hID09IDEgJiYgZG1hMiA9PSAwKSB8fAorCQkJKGRtYSA9PSAzICYmIGRtYTIgPT0gMCkpKQorCQl7CS8qIFVuc3VwcG9ydGVkIGNvbWJpbmF0aW9uLiBUcnkgdG8gc3dhcCBjaGFubmVscyAqLworCQkJaW50IHRtcCA9IGRtYTsKKworCQkJZG1hID0gZG1hMjsKKwkJCWRtYTIgPSB0bXA7CisJCX0KKwkJaWYgKChkbWEgPT0gMCAmJiBkbWEyID09IDEpIHx8CisJCQkoZG1hID09IDEgJiYgZG1hMiA9PSAwKSB8fAorCQkJKGRtYSA9PSAzICYmIGRtYTIgPT0gMCkpCisJCXsKKwkJCWRtYTJfYml0ID0gMHgwNDsJLyogRW5hYmxlIGNhcHR1cmUgRE1BICovCisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJNU1M6IEludmFsaWQgY2FwdHVyZSBETUFcbiIpOworCQkJZG1hMiA9IGRtYTsKKwkJfQorCX0KKwllbHNlCisJeworCQlkbWEyID0gZG1hOworCX0KKworCWh3X2NvbmZpZy0+ZG1hID0gZG1hOworCWh3X2NvbmZpZy0+ZG1hMiA9IGRtYTI7CisKKwlvdXRiKChiaXRzIHwgZG1hX2JpdHNbZG1hXSB8IGRtYTJfYml0KSwgY29uZmlnX3BvcnQpOwkvKiBXcml0ZSBJUlErRE1BIHNldHVwICovCisKKwlod19jb25maWctPnNsb3RzWzBdID0gYWQxODQ4X2luaXQoIk1TIFNvdW5kIFN5c3RlbSIsIHBvcnRzLAorCQkJCQkgIGh3X2NvbmZpZy0+aXJxLAorCQkJCQkgIGRtYSwgZG1hMiwgMCwKKwkJCQkJICBod19jb25maWctPm9zcCwKKwkJCQkJICBUSElTX01PRFVMRSk7Cit9CisKK3ZvaWQgdW5sb2FkX21zX3NvdW5kKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlhZDE4NDhfdW5sb2FkKGh3X2NvbmZpZy0+aW9fYmFzZSArIDQsCisJCSAgICAgIGh3X2NvbmZpZy0+aXJxLAorCQkgICAgICBod19jb25maWctPmRtYSwKKwkJICAgICAgaHdfY29uZmlnLT5kbWEyLCAwKTsKKwlzb3VuZF91bmxvYWRfYXVkaW9kZXYoaHdfY29uZmlnLT5zbG90c1swXSk7CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKK30KKworI2lmbmRlZiBFWENMVURFX1RJTUVSUworCisvKgorICogVGltZXIgc3R1ZmYgKGZvciAvZGV2L211c2ljKS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGN1cnJlbnRfaW50ZXJ2YWw7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWQxODQ4X3Rtcl9zdGFydChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgdXNlY3MpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCWFkMTg0OF9pbmZvICAgICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nICAgeHRhbF9uc2VjczsJLyogbmFub3NlY29uZHMgcGVyIHh0YWwgb3NjaWxsYXRvciB0aWNrICovCisJdW5zaWduZWQgbG9uZyAgIGRpdmlkZXI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwkvKgorCSAqIExlbmd0aCBvZiB0aGUgdGltZXIgaW50ZXJ2YWwgKGluIG5hbm9zZWNvbmRzKSBkZXBlbmRzIG9uIHRoZQorCSAqIHNlbGVjdGVkIGNyeXN0YWwgb3NjaWxsYXRvci4gQ2hlY2sgdGhpcyBmcm9tIGJpdCAweDAxIG9mIEk4LgorCSAqCisJICogQUQxODQ1IGhhcyBqdXN0IG9uZSBvc2NpbGxhdG9yIHdoaWNoIGhhcyBjeWNsZSB0aW1lIG9mIDEwLjA1MCB1cworCSAqICh3aGVuIGEgMjQuNTc2IE1IeiB4dGFsIG9zY2lsbGF0b3IgaXMgdXNlZCkuCisJICoKKwkgKiBDb252ZXJ0IHJlcXVlc3RlZCBpbnRlcnZhbCB0byBuYW5vc2Vjb25kcyBiZWZvcmUgY29tcHV0aW5nCisJICogdGhlIHRpbWVyIGRpdmlkZXIuCisJICovCisKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURfMTg0NSB8fCBkZXZjLT5tb2RlbCA9PSBNRF8xODQ1X1NTQ0FQRSkKKwkJeHRhbF9uc2VjcyA9IDEwMDUwOworCWVsc2UgaWYgKGFkX3JlYWQoZGV2YywgOCkgJiAweDAxKQorCQl4dGFsX25zZWNzID0gOTkyMDsKKwllbHNlCisJCXh0YWxfbnNlY3MgPSA5OTY5OworCisJZGl2aWRlciA9ICh1c2VjcyAqIDEwMDAgKyB4dGFsX25zZWNzIC8gMikgLyB4dGFsX25zZWNzOworCisJaWYgKGRpdmlkZXIgPCAxMDApCS8qIERvbid0IGFsbG93IHNob3J0ZXIgaW50ZXJ2YWxzIHRoYW4gYWJvdXQgMW1zICovCisJCWRpdmlkZXIgPSAxMDA7CisKKwlpZiAoZGl2aWRlciA+IDY1NTM1KQkvKiBPdmVyZmxvdyBjaGVjayAqLworCQlkaXZpZGVyID0gNjU1MzU7CisKKwlhZF93cml0ZShkZXZjLCAyMSwgKGRpdmlkZXIgPj4gOCkgJiAweGZmKTsJLyogU2V0IHVwcGVyIGJpdHMgKi8KKwlhZF93cml0ZShkZXZjLCAyMCwgZGl2aWRlciAmIDB4ZmYpOwkvKiBTZXQgbG93ZXIgYml0cyAqLworCWFkX3dyaXRlKGRldmMsIDE2LCBhZF9yZWFkKGRldmMsIDE2KSB8IDB4NDApOwkvKiBTdGFydCB0aGUgdGltZXIgKi8KKwlkZXZjLT50aW1lcl9ydW5uaW5nID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCXJldHVybiBjdXJyZW50X2ludGVydmFsID0gKGRpdmlkZXIgKiB4dGFsX25zZWNzICsgNTAwKSAvIDEwMDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0OF90bXJfcmVwcm9ncmFtKGludCBkZXYpCit7CisJLyoKKwkgKiAgICBBdWRpbyBkcml2ZXIgaGFzIGNoYW5nZWQgc2FtcGxpbmcgcmF0ZSBzbyB0aGF0IGEgZGlmZmVyZW50IHh0YWwKKwkgKiAgICAgIG9zY2lsbGF0b3Igd2FzIHNlbGVjdGVkLiBXZSBoYXZlIHRvIHJlcHJvZ3JhbSB0aGUgdGltZXIgcmF0ZS4KKwkgKi8KKworCWFkMTg0OF90bXJfc3RhcnQoZGV2LCBjdXJyZW50X2ludGVydmFsKTsKKwlzb3VuZF90aW1lcl9zeW5jaW50ZXJ2YWwoY3VycmVudF9pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0OF90bXJfZGlzYWJsZShpbnQgZGV2KQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlhZDE4NDhfaW5mbyAgICAqZGV2YyA9IChhZDE4NDhfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJYWRfd3JpdGUoZGV2YywgMTYsIGFkX3JlYWQoZGV2YywgMTYpICYgfjB4NDApOworCWRldmMtPnRpbWVyX3J1bm5pbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfdG1yX3Jlc3RhcnQoaW50IGRldikKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJYWQxODQ4X2luZm8gICAgKmRldmMgPSAoYWQxODQ4X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGN1cnJlbnRfaW50ZXJ2YWwgPT0gMCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWFkX3dyaXRlKGRldmMsIDE2LCBhZF9yZWFkKGRldmMsIDE2KSB8IDB4NDApOworCWRldmMtPnRpbWVyX3J1bm5pbmcgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHNvdW5kX2xvd2xldl90aW1lciBhZDE4NDhfdG1yID0KK3sKKwkwLAorCTIsCisJYWQxODQ4X3Rtcl9zdGFydCwKKwlhZDE4NDhfdG1yX2Rpc2FibGUsCisJYWQxODQ4X3Rtcl9yZXN0YXJ0Cit9OworCitzdGF0aWMgaW50IGFkMTg0OF90bXJfaW5zdGFsbChpbnQgZGV2KQoreworCWlmICh0aW1lcl9pbnN0YWxsZWQgIT0gLTEpCisJCXJldHVybiAwOwkvKiBEb24ndCBpbnN0YWxsIGFub3RoZXIgdGltZXIgKi8KKworCXRpbWVyX2luc3RhbGxlZCA9IGFkMTg0OF90bXIuZGV2ID0gZGV2OworCXNvdW5kX3RpbWVyX2luaXQoJmFkMTg0OF90bXIsIGF1ZGlvX2RldnNbZGV2XS0+bmFtZSk7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBFWENMVURFX1RJTUVSUyAqLworCitzdGF0aWMgaW50IGFkMTg0OF9zdXNwZW5kKGFkMTg0OF9pbmZvICpkZXZjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwlhZF9tdXRlKGRldmMpOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkMTg0OF9yZXN1bWUoYWQxODQ4X2luZm8gKmRldmMpCit7CisJaW50IG1peGVyX2xldmVsc1szMl0sIGk7CisKKwkvKiBUaGlua3BhZCBpcyBhIGJpdCBtb3JlIG9mIFBJVEEgdGhhbiBub3JtYWwuIFRoZSBCSU9TIHRlbmRzIHRvCisJICAgcmVzdG9yZSBpdCBpbiBhIGRpZmZlcmVudCBjb25maWcgdG8gdGhlIG9uZSB3ZSB1c2UuICBOZWVkIHRvCisJICAgZml4IHRoaXMgc29tZWhvdyAqLworCisJLyogc3RvcmUgb2xkIG1peGVyIGxldmVscyAqLworCW1lbWNweShtaXhlcl9sZXZlbHMsIGRldmMtPmxldmVscywgc2l6ZW9mIChtaXhlcl9sZXZlbHMpKTsgIAorCWFkMTg0OF9pbml0X2h3KGRldmMpOworCisJLyogcmVzdG9yZSBtaXhlciBsZXZlbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJYWQxODQ4X21peGVyX3NldChkZXZjLCBkZXZjLT5kZXZfbm8sIG1peGVyX2xldmVsc1tpXSk7CisKKwlpZiAoIWRldmMtPnN1YnR5cGUpIHsKKwkJc3RhdGljIHNpZ25lZCBjaGFyIGludGVycnVwdF9iaXRzWzEyXSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAweDAwLCAtMSwgMHgwOCwgLTEsIDB4MTAsIDB4MTgsIDB4MjAgfTsKKwkJc3RhdGljIGNoYXIgZG1hX2JpdHNbNF0gPSB7IDEsIDIsIDAsIDMgfTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc2lnbmVkIGNoYXIgYml0czsKKwkJY2hhciBkbWEyX2JpdCA9IDA7CisKKwkJaW50IGNvbmZpZ19wb3J0ID0gZGV2Yy0+YmFzZSArIDA7CisKKwkJYml0cyA9IGludGVycnVwdF9iaXRzW2RldmMtPmlycV07CisJCWlmIChiaXRzID09IC0xKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk1TUzogQmFkIElSUSAlZFxuIiwgZGV2Yy0+aXJxKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkKKwkJb3V0YigoYml0cyB8IDB4NDApLCBjb25maWdfcG9ydCk7IAorCisJCWlmIChkZXZjLT5kbWEyICE9IC0xICYmIGRldmMtPmRtYTIgIT0gZGV2Yy0+ZG1hMSkKKwkJCWlmICggKGRldmMtPmRtYTEgPT0gMCAmJiBkZXZjLT5kbWEyID09IDEpIHx8CisJCQkgICAgIChkZXZjLT5kbWExID09IDEgJiYgZGV2Yy0+ZG1hMiA9PSAwKSB8fAorCQkJICAgICAoZGV2Yy0+ZG1hMSA9PSAzICYmIGRldmMtPmRtYTIgPT0gMCkpCisJCQkJZG1hMl9iaXQgPSAweDA0OworCisJCW91dGIoKGJpdHMgfCBkbWFfYml0c1tkZXZjLT5kbWExXSB8IGRtYTJfYml0KSwgY29uZmlnX3BvcnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE4NDhfcG1fY2FsbGJhY2soc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSkgCit7CisJYWQxODQ4X2luZm8gKmRldmMgPSBkZXYtPmRhdGE7CisJaWYgKGRldmMpIHsKKwkJREVCKHByaW50aygiYWQxODQ4OiBwbSBldmVudCByZWNlaXZlZDogMHgleFxuIiwgcnFzdCkpOworCisJCXN3aXRjaCAocnFzdCkgeworCQljYXNlIFBNX1NVU1BFTkQ6CisJCQlhZDE4NDhfc3VzcGVuZChkZXZjKTsKKwkJCWJyZWFrOworCQljYXNlIFBNX1JFU1VNRToKKwkJCWFkMTg0OF9yZXN1bWUoZGV2Yyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCitFWFBPUlRfU1lNQk9MKGFkMTg0OF9kZXRlY3QpOworRVhQT1JUX1NZTUJPTChhZDE4NDhfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGFkMTg0OF91bmxvYWQpOworRVhQT1JUX1NZTUJPTChhZDE4NDhfY29udHJvbCk7CitFWFBPUlRfU1lNQk9MKGFkaW50cik7CitFWFBPUlRfU1lNQk9MKHByb2JlX21zX3NvdW5kKTsKK0VYUE9SVF9TWU1CT0woYXR0YWNoX21zX3NvdW5kKTsKK0VYUE9SVF9TWU1CT0wodW5sb2FkX21zX3NvdW5kKTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGlvID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMiA9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIHR5cGUgPSAwOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CQkvKiBJL08gZm9yIGEgcmF3IEFEMTg0OCBjYXJkICovCittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOwkJLyogSVJRIHRvIHVzZSAqLworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsJCS8qIEZpcnN0IERNQSBjaGFubmVsICovCittb2R1bGVfcGFyYW0oZG1hMiwgaW50LCAwKTsJCS8qIFNlY29uZCBETUEgY2hhbm5lbCAqLworbW9kdWxlX3BhcmFtKHR5cGUsIGludCwgMCk7CQkvKiBDYXJkIHR5cGUgKi8KK21vZHVsZV9wYXJhbShkZXNrcHJvX3hsLCBib29sLCAwKTsJLyogU3BlY2lhbCBtYWdpYyBmb3IgRGVza3BybyBYTCBib3hlbiAqLworbW9kdWxlX3BhcmFtKGRlc2twcm9fbSwgYm9vbCwgMCk7CS8qIFNwZWNpYWwgbWFnaWMgZm9yIERlc2twcm8gTSBib3ggKi8KK21vZHVsZV9wYXJhbShzb3VuZHBybywgYm9vbCwgMCk7CS8qIE1vcmUgc3BlY2lhbCBtYWdpYyBmb3IgU291bmRQcm8gY2hpcHMgKi8KKworI2lmZGVmIENPTkZJR19QTlAKK21vZHVsZV9wYXJhbShpc2FwbnAsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXNhcG5wanVtcCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyZXZlcnNlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXNhcG5wLAkiV2hlbiBzZXQgdG8gMCwgUGx1ZyAmIFBsYXkgc3VwcG9ydCB3aWxsIGJlIGRpc2FibGVkIik7CitNT0RVTEVfUEFSTV9ERVNDKGlzYXBucGp1bXAsCSJKdW1wcyB0byBhIHNwZWNpZmljIHNsb3QgaW4gdGhlIGRyaXZlcidzIFBuUCB0YWJsZS4gVXNlIHRoZSBzb3VyY2UsIEx1a2UuIik7CitNT0RVTEVfUEFSTV9ERVNDKHJldmVyc2UsCSJXaGVuIHNldCB0byAxLCB3aWxsIHJldmVyc2UgSVNBUG5QIHNlYXJjaCBvcmRlciIpOworCitzdGF0aWMgc3RydWN0IHBucF9kZXYJKmFkMTg0OF9kZXYgID0gTlVMTDsKKworLyogUGxlYXNlIGFkZCBuZXcgZW50cmllcyBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSAqLworc3RhdGljIHN0cnVjdCB7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBzaG9ydAljYXJkX3ZlbmRvciwgY2FyZF9kZXZpY2UsCisJCQl2ZW5kb3IsIGZ1bmN0aW9uOworCXNob3J0IG1zc19pbywgaXJxLCBkbWEsIGRtYTI7ICAgLyogaW5kZXggaW50byBpc2FwbnAgdGFibGUgKi8KKyAgICAgICAgaW50IHR5cGU7Cit9IGFkMTg0OF9pc2FwbnBfbGlzdFtdIF9faW5pdGRhdGEgPSB7CisJeyJDTUkgODMzMCBTb3VuZFBSTyIsCisJCUlTQVBOUF9WRU5ET1IoJ0MnLCdNJywnSScpLCBJU0FQTlBfREVWSUNFKDB4MDAwMSksCisJCUlTQVBOUF9WRU5ET1IoJ0AnLCdAJywnQCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMDAxKSwKKwkJMCwgMCwgMCwtMSwgMH0sCisgICAgICAgIHsiQ1M0MjMyIGJhc2VkIGNhcmQiLAorICAgICAgICAgICAgICAgIElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ0MnLCdTJywnQycpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMDAwKSwKKwkJMCwgMCwgMCwgMSwgMH0sCisgICAgICAgIHsiQ1M0MjMyIGJhc2VkIGNhcmQiLAorICAgICAgICAgICAgICAgIElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ0MnLCdTJywnQycpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMTAwKSwKKwkJMCwgMCwgMCwgMSwgMH0sCisgICAgICAgIHsiT1BMMy1TQTIgV1NTIG1vZGUiLAorICAgICAgICAJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignWScsJ00nLCdIJyksIElTQVBOUF9GVU5DVElPTigweDAwMjEpLAorICAgICAgICAgICAgICAgIDEsIDAsIDAsIDEsIDF9LAorCXsiQWR2YW5jZWQgR3JhdmlzIEludGVyV2F2ZSBBdWRpbyIsCisJCUlTQVBOUF9WRU5ET1IoJ0cnLCdSJywnVicpLCBJU0FQTlBfREVWSUNFKDB4MDAwMSksCisJCUlTQVBOUF9WRU5ET1IoJ0cnLCdSJywnVicpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMDAwKSwKKwkJMCwgMCwgMCwgMSwgMH0sCisJe05VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsJSVNBUE5QX1ZFTkRPUignQycsJ00nLCdJJyksIElTQVBOUF9ERVZJQ0UoMHgwMDAxKSwKKwkJSVNBUE5QX1ZFTkRPUignQCcsJ0AnLCdAJyksIElTQVBOUF9GVU5DVElPTigweDAwMDEpLCAwIH0sCisgICAgICAgIHsgICAgICAgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQycsJ1MnLCdDJyksIElTQVBOUF9GVU5DVElPTigweDAwMDApLCAwIH0sCisgICAgICAgIHsgICAgICAgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQycsJ1MnLCdDJyksIElTQVBOUF9GVU5DVElPTigweDAxMDApLCAwIH0sCisJLyogVGhlIG1haW4gZHJpdmVyIGZvciB0aGlzIGNhcmQgaXMgb3BsM3NhMgorICAgICAgICB7ICAgICAgIElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1knLCdNJywnSCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMDIxKSwgMCB9LAorCSovCisJewlJU0FQTlBfVkVORE9SKCdHJywnUicsJ1YnKSwgSVNBUE5QX0RFVklDRSgweDAwMDEpLAorCQlJU0FQTlBfVkVORE9SKCdHJywnUicsJ1YnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDAwMCksIDAgfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaXNhcG5wLCBpZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RldiAqYWN0aXZhdGVfZGV2KGNoYXIgKmRldm5hbWUsIGNoYXIgKnJlc25hbWUsIHN0cnVjdCBwbnBfZGV2ICpkZXYpCit7CisJaW50IGVycjsKKworCWVyciA9IHBucF9kZXZpY2VfYXR0YWNoKGRldik7CisJaWYgKGVyciA8IDApCisJCXJldHVybihOVUxMKTsKKworCWlmKChlcnIgPSBwbnBfYWN0aXZhdGVfZGV2KGRldikpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFkMTg0ODogJXMgJXMgY29uZmlnIGZhaWxlZCAob3V0IG9mIHJlc291cmNlcz8pWyVkXVxuIiwgZGV2bmFtZSwgcmVzbmFtZSwgZXJyKTsKKworCQlwbnBfZGV2aWNlX2RldGFjaChkZXYpOworCisJCXJldHVybihOVUxMKTsKKwl9CisJYXVkaW9fYWN0aXZhdGVkID0gMTsKKwlyZXR1cm4oZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwbnBfZGV2ICphZDE4NDhfaW5pdF9nZW5lcmljKHN0cnVjdCBwbnBfY2FyZCAqYnVzLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIGludCBzbG90KQoreworCisJLyogQ29uZmlndXJlIEF1ZGlvIGRldmljZSAqLworCWlmKChhZDE4NDhfZGV2ID0gcG5wX2ZpbmRfZGV2KGJ1cywgYWQxODQ4X2lzYXBucF9saXN0W3Nsb3RdLnZlbmRvciwgYWQxODQ4X2lzYXBucF9saXN0W3Nsb3RdLmZ1bmN0aW9uLCBOVUxMKSkpCisJeworCQlpZigoYWQxODQ4X2RldiA9IGFjdGl2YXRlX2RldihhZDE4NDhfaXNhcG5wX2xpc3Rbc2xvdF0ubmFtZSwgImFkMTg0OCIsIGFkMTg0OF9kZXYpKSkKKwkJeworCQkJaHdfY29uZmlnLT5pb19iYXNlIAk9IHBucF9wb3J0X3N0YXJ0KGFkMTg0OF9kZXYsIGFkMTg0OF9pc2FwbnBfbGlzdFtzbG90XS5tc3NfaW8pOworCQkJaHdfY29uZmlnLT5pcnEgCQk9IHBucF9pcnEoYWQxODQ4X2RldiwgYWQxODQ4X2lzYXBucF9saXN0W3Nsb3RdLmlycSk7CisJCQlod19jb25maWctPmRtYSAJCT0gcG5wX2RtYShhZDE4NDhfZGV2LCBhZDE4NDhfaXNhcG5wX2xpc3Rbc2xvdF0uZG1hKTsKKwkJCWlmKGFkMTg0OF9pc2FwbnBfbGlzdFtzbG90XS5kbWEyICE9IC0xKQorCQkJCWh3X2NvbmZpZy0+ZG1hMiA9IHBucF9kbWEoYWQxODQ4X2RldiwgYWQxODQ4X2lzYXBucF9saXN0W3Nsb3RdLmRtYTIpOworCQkJZWxzZQorCQkJCWh3X2NvbmZpZy0+ZG1hMiA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUgPSBhZDE4NDhfaXNhcG5wX2xpc3Rbc2xvdF0udHlwZTsKKwkJfSBlbHNlCisJCQlyZXR1cm4oTlVMTCk7CisJfSBlbHNlCisJCXJldHVybihOVUxMKTsKKworCXJldHVybihhZDE4NDhfZGV2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgYWQxODQ4X2lzYXBucF9pbml0KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IHBucF9jYXJkICpidXMsIGludCBzbG90KQoreworCWNoYXIgKmJ1c25hbWUgPSBidXMtPm5hbWVbMF0gPyBidXMtPm5hbWUgOiBhZDE4NDhfaXNhcG5wX2xpc3Rbc2xvdF0ubmFtZTsKKworCS8qIEluaXRpYWxpemUgdGhpcyBiYWJ5LiAqLworCisJaWYoYWQxODQ4X2luaXRfZ2VuZXJpYyhidXMsIGh3X2NvbmZpZywgc2xvdCkpIHsKKwkJLyogV2UgZ290IGl0LiAqLworCisJCXByaW50ayhLRVJOX05PVElDRSAiYWQxODQ4OiBQblAgcmVwb3J0cyAnJXMnIGF0IGkvbyAlI3gsIGlycSAlZCwgZG1hICVkLCAlZFxuIiwKKwkJICAgICAgIGJ1c25hbWUsCisJCSAgICAgICBod19jb25maWctPmlvX2Jhc2UsIGh3X2NvbmZpZy0+aXJxLCBod19jb25maWctPmRtYSwKKwkJICAgICAgIGh3X2NvbmZpZy0+ZG1hMik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgYWQxODQ4X2lzYXBucF9wcm9iZShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJc3RhdGljIGludCBmaXJzdCA9IDE7CisJaW50IGk7CisKKwkvKiBDb3VudCBlbnRyaWVzIGluIHNiX2lzYXBucF9saXN0ICovCisJZm9yIChpID0gMDsgYWQxODQ4X2lzYXBucF9saXN0W2ldLmNhcmRfdmVuZG9yICE9IDA7IGkrKyk7CisJaS0tOworCisJLyogQ2hlY2sgYW5kIGFkanVzdCBpc2FwbnBqdW1wICovCisJaWYoIGlzYXBucGp1bXAgPCAwIHx8IGlzYXBucGp1bXAgPiBpKSB7CisJCWlzYXBucGp1bXAgPSByZXZlcnNlID8gaSA6IDA7CisJCXByaW50ayhLRVJOX0VSUiAiYWQxODQ4OiBWYWxpZCByYW5nZSBmb3IgaXNhcG5wanVtcCBpcyAwLSVkLiBBZGp1c3RlZCB0byAlZC5cbiIsIGksIGlzYXBucGp1bXApOworCX0KKworCWlmKCFmaXJzdCB8fCAhcmV2ZXJzZSkKKwkJaSA9IGlzYXBucGp1bXA7CisJZmlyc3QgPSAwOworCXdoaWxlKGFkMTg0OF9pc2FwbnBfbGlzdFtpXS5jYXJkX3ZlbmRvciAhPSAwKSB7CisJCXN0YXRpYyBzdHJ1Y3QgcG5wX2NhcmQgKmJ1cyA9IE5VTEw7CisKKwkJd2hpbGUgKChidXMgPSBwbnBfZmluZF9jYXJkKAorCQkJCWFkMTg0OF9pc2FwbnBfbGlzdFtpXS5jYXJkX3ZlbmRvciwKKwkJCQlhZDE4NDhfaXNhcG5wX2xpc3RbaV0uY2FyZF9kZXZpY2UsCisJCQkJYnVzKSkpIHsKKworCQkJaWYoYWQxODQ4X2lzYXBucF9pbml0KGh3X2NvbmZpZywgYnVzLCBpKSkgeworCQkJCWlzYXBucGp1bXAgPSBpOyAvKiBzdGFydCBuZXh0IHNlYXJjaCBmcm9tIGhlcmUgKi8KKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpICs9IHJldmVyc2UgPyAtMSA6IDE7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2FkMTg0OCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImFkMTg0OC9jczQyNDggY29kZWMgZHJpdmVyIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTZcbiIpOworCisjaWZkZWYgQ09ORklHX1BOUAorCWlmKGlzYXBucCAmJiAoYWQxODQ4X2lzYXBucF9wcm9iZSgmY2ZnKSA8IDApICkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImFkMTg0ODogTm8gSVNBUG5QIGNhcmRzIGZvdW5kLCB0cnlpbmcgc3RhbmRhcmQgb25lcy4uLlxuIik7CisJCWlzYXBucCA9IDA7CisJfQorI2VuZGlmCisKKwlpZihpbyAhPSAtMSkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCSAgICAgICAgaWYoIGlzYXBucCA9PSAwICkKKwkgICAgICAgIHsKKwkJCWlmKGlycSA9PSAtMSB8fCBkbWEgPT0gLTEpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4NDg6IG11c3QgZ2l2ZSBJL08gLCBJUlEgYW5kIERNQS5cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQljZmcuaXJxID0gaXJxOworCQkJY2ZnLmlvX2Jhc2UgPSBpbzsKKwkJCWNmZy5kbWEgPSBkbWE7CisJCQljZmcuZG1hMiA9IGRtYTI7CisJCQljZmcuY2FyZF9zdWJ0eXBlID0gdHlwZTsKKwkgICAgICAgIH0KKworCQlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGlvICsgNCwgNCwgImFkMTg0OCIpOworCisJCWlmICghcG9ydHMpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDQsICJXU1MgY29uZmlnIikpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGlvICsgNCwgNCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJaWYgKCFwcm9iZV9tc19zb3VuZCgmY2ZnLCBwb3J0cykpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGlvICsgNCwgNCk7CisJCQlyZWxlYXNlX3JlZ2lvbihpbywgNCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlhdHRhY2hfbXNfc291bmQoJmNmZywgcG9ydHMsIFRISVNfTU9EVUxFKTsKKwkJbG9hZGVkID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2FkMTg0OCh2b2lkKQoreworCWlmKGxvYWRlZCkKKwkJdW5sb2FkX21zX3NvdW5kKCZjZmcpOworCisjaWZkZWYgQ09ORklHX1BOUAorCWlmKGFkMTg0OF9kZXYpeworCQlpZihhdWRpb19hY3RpdmF0ZWQpCisJCQlwbnBfZGV2aWNlX2RldGFjaChhZDE4NDhfZGV2KTsKKwl9CisjZW5kaWYKK30KKworbW9kdWxlX2luaXQoaW5pdF9hZDE4NDgpOworbW9kdWxlX2V4aXQoY2xlYW51cF9hZDE4NDgpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfYWQxODQ4KGNoYXIgKnN0cikKK3sKKyAgICAgICAgLyogaW8sIGlycSwgZG1hLCBkbWEyLCB0eXBlICovCisJaW50IGludHNbNl07CisJCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCWlvCT0gaW50c1sxXTsKKwlpcnEJPSBpbnRzWzJdOworCWRtYQk9IGludHNbM107CisJZG1hMgk9IGludHNbNF07CisJdHlwZQk9IGludHNbNV07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYWQxODQ4PSIsIHNldHVwX2FkMTg0OCk7CQorI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODQ4LmggYi9zb3VuZC9vc3MvYWQxODQ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1NzNiMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hZDE4NDguaApAQCAtMCwwICsxLDI1IEBACisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2RlZmluZSBBRF9GX0NTNDIzMSAgICAgMHgwMDAxICAvKiBSZXR1cm5lZCBpZiBhIENTNDIzMiAob3IgY29tcGF0aWJsZSkgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgQURfRl9DUzQyNDggICAgIDB4MDAwMSAgLyogUmV0dXJuZWQgaWYgYSBDUzQyNDggKG9yIGNvbXBhdGlibGUpIGRldGVjdGVkICovCisKKyNkZWZpbmUgICAgICAgICBBRDE4NDhfU0VUX1hUQUwgICAgICAgICAxCisjZGVmaW5lICAgICAgICAgQUQxODQ4X01JWEVSX1JFUk9VVEUgICAgMgorCisjZGVmaW5lIEFEMTg0OF9SRVJPVVRFKG9sZGN0bCwgbmV3Y3RsKSBcCisgICAgICAgICAgICAgICAgYWQxODQ4X2NvbnRyb2woQUQxODQ4X01JWEVSX1JFUk9VVEUsICgob2xkY3RsKTw8OCl8KG5ld2N0bCkpCisJCQorCitpbnQgYWQxODQ4X2luaXQoY2hhciAqbmFtZSwgc3RydWN0IHJlc291cmNlICpwb3J0cywgaW50IGlycSwgaW50IGRtYV9wbGF5YmFjaywKKwlpbnQgZG1hX2NhcHR1cmUsIGludCBzaGFyZV9kbWEsIGludCAqb3NwLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7Cit2b2lkIGFkMTg0OF91bmxvYWQgKGludCBpb19iYXNlLCBpbnQgaXJxLCBpbnQgZG1hX3BsYXliYWNrLCBpbnQgZG1hX2NhcHR1cmUsIGludCBzaGFyZV9kbWEpOworCitpbnQgYWQxODQ4X2RldGVjdCAoc3RydWN0IHJlc291cmNlICpwb3J0cywgaW50ICpmbGFncywgaW50ICpvc3ApOworaW50IGFkMTg0OF9jb250cm9sKGludCBjbWQsIGludCBhcmcpOworCitpcnFyZXR1cm5fdCBhZGludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIGR1bW15KTsKK3ZvaWQgYXR0YWNoX21zX3NvdW5kKHN0cnVjdCBhZGRyZXNzX2luZm8gKiBod19jb25maWcsIHN0cnVjdCByZXNvdXJjZSAqcG9ydHMsIHN0cnVjdCBtb2R1bGUgKiBvd25lcik7CisKK2ludCBwcm9iZV9tc19zb3VuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCByZXNvdXJjZSAqcG9ydHMpOwordm9pZCB1bmxvYWRfbXNfc291bmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfaW5mbyk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODQ4X21peGVyLmggYi9zb3VuZC9vc3MvYWQxODQ4X21peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyMzFjNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hZDE4NDhfbWl4ZXIuaApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIHNvdW5kL2FkMTg0OF9taXhlci5oCisgKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBtaXhlciBvZiBBRDE4NDggYW5kIGNvbXBhdGlibGUgY29kZWNzLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqLworCisKKy8qCisgKiBUaGUgQUQxODQ4IGNvZGVjIGhhcyBnZW5lcmljIGlucHV0IGxpbmVzIGNhbGxlZCBMaW5lLCBBdXgxIGFuZCBBdXgyLgorICogU291bmQgY2FyZCBtYW51ZmFjdHVyZXJzIGhhdmUgY29ubmVjdGVkIGFjdHVhbCBpbnB1dHMgKENELCBzeW50aCwgbGluZSwKKyAqIGV0YykgdG8gdGhlc2UgaW5wdXRzIGluIGRpZmZlcmVudCBvcmRlci4gVGhlcmVmb3JlIGl0J3MgZGlmZmljdWx0CisgKiB0byBhc3NpZ24gbWl4ZXIgY2hhbm5lbHMgdG8gdGhlc2UgaW5wdXRzIGNvcnJlY3RseS4gVGhlIGZvbGxvd2luZworICogY29udGFpbnMgdHdvIGFsdGVybmF0aXZlIG1hcHBpbmdzLiBUaGUgZmlyc3Qgb25lIGlzIGZvciBHVVMgTUFYIGFuZAorICogdGhlIHNlY29uZCBpcyBqdXN0IGEgZ2VuZXJpYyBvbmUgKGxpbmUxLCBsaW5lMiBhbmQgbGluZTMpLgorICogKEFjdHVhbGx5IHRoaXMgaXMgbm90IGEgbWFwcGluZyBidXQgcmF0aGVyIHNvbWUga2luZCBvZiBpbnRlcmxlYXZpbmcKKyAqIHNvbHV0aW9uKS4KKyAqLworI2RlZmluZSBNT0RFMV9SRUNfREVWSUNFUwkJKFNPVU5EX01BU0tfTElORTMgfCBTT1VORF9NQVNLX01JQyB8IFwKKwkJCQkJIFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX0lNSVgpCisKKyNkZWZpbmUgU1BST19SRUNfREVWSUNFUwkJKFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgXAorCQkJCQkgU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfTElORTEpCisKKyNkZWZpbmUgTU9ERTFfTUlYRVJfREVWSUNFUwkJKFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX01JQyB8IFwKKwkJCQkJIFNPVU5EX01BU0tfTElORTIgfCBcCisJCQkJCSBTT1VORF9NQVNLX0lHQUlOIHwgXAorCQkJCQkgU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0lNSVgpCisKKyNkZWZpbmUgTU9ERTJfTUlYRVJfREVWSUNFUwkJKFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX0xJTkUyIHwgXAorCQkJCQkgU09VTkRfTUFTS19NSUMgfCBcCisJCQkJCSBTT1VORF9NQVNLX0xJTkUzIHwgU09VTkRfTUFTS19TUEVBS0VSIHwgXAorCQkJCQkgU09VTkRfTUFTS19JR0FJTiB8IFwKKwkJCQkJIFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19JTUlYKQorCisjZGVmaW5lIE1PREUzX01JWEVSX0RFVklDRVMJCShNT0RFMl9NSVhFUl9ERVZJQ0VTIHwgU09VTkRfTUFTS19WT0xVTUUpCisKKy8qIE9QVGkgODJDOTMwIGhhcyBubyBJTUlYIGxldmVsIGNvbnRyb2wsIGJ1dCBpdCBjYW4gc3RpbGwgYmUgc2VsZWN0ZWQgYXMgYW4KKyAqIGlucHV0CisgKi8KKyNkZWZpbmUgQzkzMF9NSVhFUl9ERVZJQ0VTCShTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19MSU5FMiB8IFwKKwkJCQkgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX1ZPTFVNRSB8IFwKKwkJCQkgU09VTkRfTUFTS19MSU5FMyB8IFwKKwkJCQkgU09VTkRfTUFTS19JR0FJTiB8IFNPVU5EX01BU0tfUENNKQorCisjZGVmaW5lIFNQUk9fTUlYRVJfREVWSUNFUwkoU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX1BDTSB8IFwKKwkJCQkgU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19TWU5USCB8IFwKKwkJCQkgU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfTUlDIHwgXAorCQkJCSBTT1VORF9NQVNLX1NQRUFLRVIgfCBTT1VORF9NQVNLX0xJTkUxIHwgXAorCQkJCSBTT1VORF9NQVNLX09HQUlOKQorCitzdHJ1Y3QgbWl4ZXJfZGVmIHsKKwl1bnNpZ25lZCBpbnQgcmVnbm86NjsJCS8qIHJlZ2lzdGVyIG51bWJlciBmb3Igdm9sdW1lICovCisJdW5zaWduZWQgaW50IHBvbGFyaXR5OjE7CS8qIHZvbHVtZSBwb2xhcml0eTogMD1ub3JtYWwsIDE9cmV2ZXJzZWQgKi8KKwl1bnNpZ25lZCBpbnQgYml0cG9zOjM7CQkvKiBwb3NpdGlvbiBvZiBiaXRzIGluIHJlZ2lzdGVyIGZvciB2b2x1bWUgKi8KKwl1bnNpZ25lZCBpbnQgbmJpdHM6MzsJCS8qIG51bWJlciBvZiBiaXRzIGluIHJlZ2lzdGVyIGZvciB2b2x1bWUgKi8KKwl1bnNpZ25lZCBpbnQgbXV0ZXJlZzo2OwkJLyogcmVnaXN0ZXIgbnVtYmVyIGZvciBtdXRlIGJpdCAqLworCXVuc2lnbmVkIGludCBtdXRlcG9sOjE7CQkvKiBtdXRlIHBvbGFyaXR5OiAwPW5vcm1hbCwgMT1yZXZlcnNlZCAqLworCXVuc2lnbmVkIGludCBtdXRlcG9zOjQ7CQkvKiBwb3NpdGlvbiBvZiBtdXRlIGJpdCBpbiByZWdpc3RlciAqLworCXVuc2lnbmVkIGludCByZWNyZWc6NjsJCS8qIHJlZ2lzdGVyIG51bWJlciBmb3IgcmVjb3JkaW5nIGJpdCAqLworCXVuc2lnbmVkIGludCByZWNwb2w6MTsJCS8qIHJlY29yZGluZyBwb2xhcml0eTogMD1ub3JtYWwsIDE9cmV2ZXJzZWQgKi8KKwl1bnNpZ25lZCBpbnQgcmVjcG9zOjQ7CQkvKiBwb3NpdGlvbiBvZiByZWNvcmRpbmcgYml0IGluIHJlZ2lzdGVyICovCit9OworCitzdGF0aWMgY2hhciBtaXhfY3Z0WzEwMV0gPSB7CisJIDAsIDAsIDMsIDcsMTAsMTMsMTYsMTksMjEsMjMsMjYsMjgsMzAsMzIsMzQsMzUsMzcsMzksNDAsNDIsCisJNDMsNDUsNDYsNDcsNDksNTAsNTEsNTIsNTMsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsCisJNjUsNjYsNjcsNjgsNjksNzAsNzAsNzEsNzIsNzMsNzMsNzQsNzUsNzUsNzYsNzcsNzcsNzgsNzksNzksCisJODAsODEsODEsODIsODIsODMsODQsODQsODUsODUsODYsODYsODcsODcsODgsODgsODksODksOTAsOTAsCisJOTEsOTEsOTIsOTIsOTMsOTMsOTQsOTQsOTUsOTUsOTYsOTYsOTYsOTcsOTcsOTgsOTgsOTgsOTksOTksCisJMTAwCit9OworCit0eXBlZGVmIHN0cnVjdCBtaXhlcl9kZWYgbWl4ZXJfZW50OwordHlwZWRlZiBtaXhlcl9lbnQgbWl4ZXJfZW50c1syXTsKKworLyoKKyAqIE1vc3Qgb2YgdGhlIG1peGVyIGVudHJpZXMgd29yayBpbiBiYWNrd2FyZHMuIFNldHRpbmcgdGhlIHBvbGFyaXR5IGZpZWxkCisgKiBtYWtlcyB0aGVtIHRvIHdvcmsgY29ycmVjdGx5LgorICoKKyAqIFRoZSBjaGFubmVsIG51bWJlcmluZyB1c2VkIGJ5IGluZGl2aWR1YWwgc291bmQgY2FyZHMgaXMgbm90IGZpeGVkLiBTb21lCisgKiBjYXJkcyBoYXZlIGFzc2lnbmVkIGRpZmZlcmVudCBtZWFuaW5ncyBmb3IgdGhlIEFVWDEsIEFVWDIgYW5kIExJTkUgaW5wdXRzLgorICogVGhlIGN1cnJlbnQgdmVyc2lvbiBkb2Vzbid0IHRyeSB0byBjb21wZW5zYXRlIHRoaXMuCisgKi8KKworI2RlZmluZSBNSVhfRU5UKG5hbWUsIHJlZ19sLCBwb2xhX2wsIHBvc19sLCBsZW5fbCwgcmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yLCBtdXRlX2JpdCkJXAorCVtuYW1lXSA9IHt7cmVnX2wsIHBvbGFfbCwgcG9zX2wsIGxlbl9sLCByZWdfbCwgMCwgbXV0ZV9iaXQsIDAsIDAsIDh9LAkJCVwKKwkJICB7cmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yLCByZWdfciwgMCwgbXV0ZV9iaXQsIDAsIDAsIDh9fQorCisjZGVmaW5lIE1JWF9FTlQyKG5hbWUsIHJlZ19sLCBwb2xhX2wsIHBvc19sLCBsZW5fbCwgbXV0ZV9yZWdfbCwgbXV0ZV9wb2xhX2wsIG11dGVfcG9zX2wsIFwKKwkJICAgIHJlY19yZWdfbCwgcmVjX3BvbGFfbCwgcmVjX3Bvc19sLAkJCQkJIFwKKwkJIHJlZ19yLCBwb2xhX3IsIHBvc19yLCBsZW5fciwgbXV0ZV9yZWdfciwgbXV0ZV9wb2xhX3IsIG11dGVfcG9zX3IsCSBcCisJCSAgICByZWNfcmVnX3IsIHJlY19wb2xhX3IsIHJlY19wb3NfcikJCQkJCSBcCisJW25hbWVdID0ge3tyZWdfbCwgcG9sYV9sLCBwb3NfbCwgbGVuX2wsIG11dGVfcmVnX2wsIG11dGVfcG9sYV9sLCBtdXRlX3Bvc19sLAkgXAorCQkgICAgcmVjX3JlZ19sLCByZWNfcG9sYV9sLCByZWNfcG9zX2x9LAkJCQkJIFwKKwkJICB7cmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yLCBtdXRlX3JlZ19yLCBtdXRlX3BvbGFfciwgbXV0ZV9wb3NfciwJIFwKKwkJICAgIHJlY19yZWdfciwgcmVjX3BvbGFfciwgcmVjX3Bvc19yfX0KKworc3RhdGljIG1peGVyX2VudHMgYWQxODQ4X21peF9kZXZpY2VzWzMyXSA9IHsKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1ZPTFVNRSwJMjcsIDEsIDAsIDQsCTI5LCAxLCAwLCA0LCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1RSRUJMRSwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9TWU5USCwJIDQsIDEsIDAsIDUsCSA1LCAxLCAwLCA1LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCSA2LCAxLCAwLCA2LAkgNywgMSwgMCwgNiwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfU1BFQUtFUiwJMjYsIDEsIDAsIDQsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FLAkxOCwgMSwgMCwgNSwJMTksIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX01JQywJIDAsIDAsIDUsIDEsCSAxLCAwLCA1LCAxLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9DRCwJCSAyLCAxLCAwLCA1LAkgMywgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJMTMsIDEsIDIsIDYsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9BTFRQQ00sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfUkVDTEVWLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkgMCwgMCwgMCwgNCwJIDEsIDAsIDAsIDQsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX09HQUlOLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUxLAkgMiwgMSwgMCwgNSwJIDMsIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUyLAkgNCwgMSwgMCwgNSwJIDUsIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUzLAkxOCwgMSwgMCwgNSwJMTksIDEsIDAsIDUsICA3KQorfTsKKworc3RhdGljIG1peGVyX2VudHMgaXdhdmVfbWl4X2RldmljZXNbMzJdID0geworCU1JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkyNSwgMSwgMCwgNSwJMjcsIDEsIDAsIDUsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkgNCwgMSwgMCwgNSwJIDUsIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJIDYsIDEsIDAsIDYsCSA3LCAxLCAwLCA2LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkyNiwgMSwgMCwgNCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTE4LCAxLCAwLCA1LAkxOSwgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkgMCwgMCwgNSwgMSwJIDEsIDAsIDUsIDEsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJIDIsIDEsIDAsIDUsCSAzLCAxLCAwLCA1LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9JTUlYLAkxNiwgMSwgMCwgNSwJMTcsIDEsIDAsIDUsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCSAwLCAwLCAwLCA0LAkgMSwgMCwgMCwgNCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsCSAyLCAxLCAwLCA1LAkgMywgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTIsCSA0LCAxLCAwLCA1LAkgNSwgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsCTE4LCAxLCAwLCA1LAkxOSwgMSwgMCwgNSwgIDcpCit9OworCitzdGF0aWMgbWl4ZXJfZW50cyBjczQyeGJfbWl4X2RldmljZXNbMzJdID0geworCS8qIERpZ2l0YWwgbWFzdGVyIHZvbHVtZSBhY3R1YWxseSBoYXMgc2V2ZW4gYml0cywgYnV0IHdlIG9ubHkgdXNlCisJICAgc2l4IHRvIGF2b2lkIHRoZSBkaXNjb250aW51aXR5IHdoZW4gdGhlIGFuYWxvZyBnYWluIGtpY2tzIGluLiAqLworCU1JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAk0NiwgMSwgMCwgNiwJNDcsIDEsIDAsIDYsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkgNCwgMSwgMCwgNSwJIDUsIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJIDYsIDEsIDAsIDYsCSA3LCAxLCAwLCA2LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkyNiwgMSwgMCwgNCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTE4LCAxLCAwLCA1LAkxOSwgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkzNCwgMSwgMCwgNSwJMzUsIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJIDIsIDEsIDAsIDUsCSAzLCAxLCAwLCA1LCAgNyksCisJLyogRm9yIHRoZSBJTUlYIGVudHJ5LCBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgTUlYX0VOVCBtYWNybworCSAgIGJlY2F1c2UgdGhlIG11dGUgYml0IGlzIGluIGRpZmZlcmVudCBwb3NpdGlvbnMgZm9yIHRoZSB0d28KKwkgICBjaGFubmVscyBhbmQgcmVxdWlyZXMgcmV2ZXJzZSBwb2xhcml0eS4gKi8KKwlbU09VTkRfTUlYRVJfSU1JWF0gPSB7ezEzLCAxLCAyLCA2LCAxMywgMSwgMCwgMCwgMCwgOH0sCisJCSAgICAgIHs0MiwgMSwgMCwgNiwgNDIsIDEsIDcsIDAsIDAsIDh9fSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCSAwLCAwLCAwLCA0LAkgMSwgMCwgMCwgNCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsCSAyLCAxLCAwLCA1LAkgMywgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTIsCSA0LCAxLCAwLCA1LAkgNSwgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsCTM4LCAxLCAwLCA2LAkzOSwgMSwgMCwgNiwgIDcpCit9OworCisvKiBPUFRpIDgyQzkzMCBoYXMgc29tZXdoYXQgZGlmZmVyZW50IHBvcnQgYWRkcmVzc2VzLgorICogTm90ZTogVk9MVU1FID09IFNQRUFLRVIsIFNZTlRIID09IExJTkUyLCBMSU5FID09IExJTkUzLCBDRCA9PSBMSU5FMQorICogVk9MVU1FLCBTWU5USCwgTElORSwgQ0QgYXJlIG5vdCBlbmFibGVkIGFib3ZlLgorICogTUlDIGlzIGxldmVsIG9mIG1pYyBtb25pdG9yaW5nIGRpcmVjdCB0byBvdXRwdXQuIFNhbWUgZm9yIENELCBMSU5FLCBldGMuCisgKi8KK3N0YXRpYyBtaXhlcl9lbnRzIGM5MzBfbWl4X2RldmljZXNbMzJdID0geworCU1JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkyMiwgMSwgMSwgNSwJMjMsIDEsIDEsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkgNCwgMSwgMSwgNCwJIDUsIDEsIDEsIDQsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJIDYsIDEsIDAsIDUsCSA3LCAxLCAwLCA1LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkyMiwgMSwgMSwgNSwJMjMsIDEsIDEsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTE4LCAxLCAxLCA0LAkxOSwgMSwgMSwgNCwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkyMCwgMSwgMSwgNCwJMjEsIDEsIDEsIDQsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJIDIsIDEsIDEsIDQsCSAzLCAxLCAxLCA0LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9JTUlYLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCSAwLCAwLCAwLCA0LAkgMSwgMCwgMCwgNCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsCSAyLCAxLCAxLCA0LAkgMywgMSwgMSwgNCwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTIsCSA0LCAxLCAxLCA0LAkgNSwgMSwgMSwgNCwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsCTE4LCAxLCAxLCA0LAkxOSwgMSwgMSwgNCwgIDcpCit9OworCitzdGF0aWMgbWl4ZXJfZW50cyBzcHJvX21peF9kZXZpY2VzWzMyXSA9IHsKKwlNSVhfRU5UIChTT1VORF9NSVhFUl9WT0xVTUUsCTE5LCAwLCA0LCA0LAkJCSAxOSwgMCwgMCwgNCwgIDgpLAorCU1JWF9FTlQgKFNPVU5EX01JWEVSX0JBU1MsCSAwLCAwLCAwLCAwLAkJCSAgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQgKFNPVU5EX01JWEVSX1RSRUJMRSwJIDAsIDAsIDAsIDAsCQkJICAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVDIoU09VTkRfTUlYRVJfU1lOVEgsCSA0LCAxLCAxLCA0LCAyMywgMCwgMywgIDAsIDAsIDgsCisJCSAJCQkgNSwgMSwgMSwgNCwgMjMsIDAsIDMsIDAsIDAsIDgpLAorCU1JWF9FTlQgKFNPVU5EX01JWEVSX1BDTSwJIDYsIDEsIDEsIDQsCQkJICA3LCAxLCAxLCA0LCAgOCksCisJTUlYX0VOVCAoU09VTkRfTUlYRVJfU1BFQUtFUiwJMTgsIDAsIDMsIDIsCQkJICAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVDIoU09VTkRfTUlYRVJfTElORSwJMjAsIDAsIDQsIDQsIDE3LCAxLCA0LCAxNiwgMCwgMiwKKwkJIAkJCTIwLCAwLCAwLCA0LCAxNywgMSwgMywgMTYsIDAsIDEpLAorCU1JWF9FTlQyKFNPVU5EX01JWEVSX01JQywJMTgsIDAsIDAsIDMsIDE3LCAxLCAwLCAxNiwgMCwgMCwKKwkJIAkJCSAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgIDAsIDAsIDApLAorCU1JWF9FTlQyKFNPVU5EX01JWEVSX0NELAkyMSwgMCwgNCwgNCwgMTcsIDEsIDIsIDE2LCAwLCA0LAorCQkJCQkyMSwgMCwgMCwgNCwgMTcsIDEsIDEsIDE2LCAwLCAzKSwKKwlNSVhfRU5UIChTT1VORF9NSVhFUl9JTUlYLAkgMCwgMCwgMCwgMCwJCQkgIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UIChTT1VORF9NSVhFUl9BTFRQQ00sCSAwLCAwLCAwLCAwLAkJCSAgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQgKFNPVU5EX01JWEVSX1JFQ0xFViwJIDAsIDAsIDAsIDAsCQkJICAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVCAoU09VTkRfTUlYRVJfSUdBSU4sCSAwLCAwLCAwLCAwLAkJCSAgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQgKFNPVU5EX01JWEVSX09HQUlOLAkxNywgMSwgNiwgMSwJCQkgIDAsIDAsIDAsIDAsICA4KSwKKwkvKiBUaGlzIGlzIGV4dGVybmFsIHdhdmV0YWJsZSAqLworCU1JWF9FTlQyKFNPVU5EX01JWEVSX0xJTkUxLAkyMiwgMCwgNCwgNCwgMjMsIDEsIDEsIDIzLCAwLCA0LAorCQkgCQkJMjIsIDAsIDAsIDQsIDIzLCAxLCAwLCAyMywgMCwgNSksCit9OworCitzdGF0aWMgaW50IGRlZmF1bHRfbWl4ZXJfbGV2ZWxzWzMyXSA9Cit7CisJMHgzMjMyLAkJCS8qIE1hc3RlciBWb2x1bWUgKi8KKwkweDMyMzIsCQkJLyogQmFzcyAqLworCTB4MzIzMiwJCQkvKiBUcmVibGUgKi8KKwkweDRiNGIsCQkJLyogRk0gKi8KKwkweDMyMzIsCQkJLyogUENNICovCisJMHgxNTE1LAkJCS8qIFBDIFNwZWFrZXIgKi8KKwkweDIwMjAsCQkJLyogRXh0IExpbmUgKi8KKwkweDEwMTAsCQkJLyogTWljICovCisJMHg0YjRiLAkJCS8qIENEICovCisJMHgwMDAwLAkJCS8qIFJlY29yZGluZyBtb25pdG9yICovCisJMHg0YjRiLAkJCS8qIFNlY29uZCBQQ00gKi8KKwkweDRiNGIsCQkJLyogUmVjb3JkaW5nIGxldmVsICovCisJMHg0YjRiLAkJCS8qIElucHV0IGdhaW4gKi8KKwkweDRiNGIsCQkJLyogT3V0cHV0IGdhaW4gKi8KKwkweDIwMjAsCQkJLyogTGluZTEgKi8KKwkweDIwMjAsCQkJLyogTGluZTIgKi8KKwkweDE1MTUJCQkvKiBMaW5lMyAodXN1YWxseSBsaW5lIGluKSovCit9OworCisjZGVmaW5lIExFRlRfQ0hOCTAKKyNkZWZpbmUgUklHSFRfQ0hOCTEKKworLyoKKyAqIENoYW5uZWwgZW5hYmxlIGJpdHMgZm9yIGlvY3RsKFNPVU5EX01JWEVSX1BSSVZBVEUxKQorICovCisKKyNpZm5kZWYgQVVESU9fU1BFQUtFUgorI2RlZmluZQlBVURJT19TUEVBS0VSCQkweDAxCS8qIEVuYWJsZSBtb25vIG91dHB1dCAqLworI2RlZmluZQlBVURJT19IRUFEUEhPTkUJCTB4MDIJLyogU3BhcmMgb25seSAqLworI2RlZmluZQlBVURJT19MSU5FX09VVAkJMHgwNAkvKiBTcGFyYyBvbmx5ICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZDE4ODkuYyBiL3NvdW5kL29zcy9hZDE4ODkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY3YzYyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2FkMTg4OS5jCkBAIC0wLDAgKzEsMTEwMyBAQAorLyoKKyAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICoKKyAqICBBbmFsb2cgRGV2aWNlcyAxODg5IFBDSSBhdWRpbyBkcml2ZXIgKEFEMTgxOSBBQzk3LWNvbXBhdGlibGUgY29kZWMpCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICAgTm90ZXM6CisgKiAgIDEuIE9ubHkgZmxhdCBETUEgaXMgc3VwcG9ydGVkOyBzLWcgaXMgbm90IHN1cHBvcnRlZCByaWdodCBub3cKKyAqCisgKgorPGpzbT4gdGF1c3E6IEFueXdheSwgdG8gc2V0IHVwIHNhbXBsZSByYXRlcyBmb3IgRCB0byBBLCB5b3UganVzdCB1c2UgdGhlIHNhbXBsZSByYXRlIG9uIHRoZSBjb2RlYy4gRm9yIEEgdG8gRCwgeW91IG5lZWQgdG8gc2V0IHRoZSBjb2RlYyBhbHdheXMgdG8gNDhLICh1c2luZyB0aGUgc3BsaXQgc2FtcGxlIHJhdGUgZmVhdHVyZSBvbiB0aGUgY29kZWMpIGFuZCB0aGVuIHNldCB0aGUgcmVzYW1wbGVyIG9uIHRoZSBBRDE4ODkgdG8gdGhlIHNhbXBsZSByYXRlIHlvdSB3YW50LgorPGpzbT4gQWxzbywgd2hlbiBjaGFuZ2luZyB0aGUgc2FtcGxlIHJhdGUgb24gdGhlIGNvZGVjIHlvdSBuZWVkIHRvIHBvd2VyIGl0IGRvd24gYW5kIHJlIHBvd2VyIGl0IHVwIGZvciB0aGUgY2hhbmdlIHRvIHRha2UgZWZmZWN0IQorICoKKyAqICRJZDogYWQxODg5LmMsdiAxLjMgMjAwMi8xMC8xOSAyMTozMTo0NCBncnVuZGxlciBFeHAgJAorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJhZDE4ODkuaCIKKworI2RlZmluZSBEQkcoZm10LCBhcmcuLi4pIHByaW50ayhmbXQsICMjYXJnKQorI2RlZmluZSBERVZOQU1FICJhZDE4ODkiCisKKyNkZWZpbmUgTlJfSFdfQ0gJNAorI2RlZmluZSBEQUNfUlVOTklORwkxCisjZGVmaW5lIEFEQ19SVU5OSU5HCTIKKworI2RlZmluZSBVTkRFUlJVTihkZXYpCSgwKQorCisjZGVmaW5lIEFEMTg4OV9SRUFEVyhkZXYscmVnKSByZWFkdyhkZXYtPnJlZ2Jhc2UgKyByZWcpCisjZGVmaW5lIEFEMTg4OV9XUklURVcoZGV2LHJlZyx2YWwpIHdyaXRldygodmFsKSwgZGV2LT5yZWdiYXNlICsgcmVnKQorI2RlZmluZSBBRDE4ODlfUkVBREwoZGV2LHJlZykgcmVhZGwoZGV2LT5yZWdiYXNlICsgcmVnKQorI2RlZmluZSBBRDE4ODlfV1JJVEVMKGRldixyZWcsdmFsKSB3cml0ZWwoKHZhbCksIGRldi0+cmVnYmFzZSArIHJlZykKKworLy9ub3cgMTAwbXMKKy8qICNkZWZpbmUgV0FJVF8xME1TKCkJc2NoZWR1bGVfdGltZW91dChIWi8xMCkgKi8KKyNkZWZpbmUgV0FJVF8xME1TKCkJZG8geyBpbnQgX19pOyBmb3IgKF9faSA9IDA7IF9faSA8IDEwMDsgX19pKyspIHVkZWxheSgxMDAwKTsgfSB3aGlsZSgwKQorCisvKiBjdXJyZW50bHkgb25seSBzdXBwb3J0IGEgc2luZ2xlIGRldmljZSAqLworc3RhdGljIGFkMTg4OV9kZXZfdCAqYWQxODg5X2RldiA9IE5VTEw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIGhlbHBlciByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIGlubGluZSB2b2lkIGFkMTg4OV9zZXRfd2F2X3JhdGUoYWQxODg5X2Rldl90ICpkZXYsIGludCByYXRlKQoreworCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3X2NvZGVjID0gZGV2LT5hYzk3X2NvZGVjOworCisJREJHKCJTZXR0aW5nIFdBViByYXRlIHRvICVkXG4iLCByYXRlKTsKKwlkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV0uZG1hYnVmLnJhdGUgPSByYXRlOworCUFEMTg4OV9XUklURVcoZGV2LCBBRF9EU1dBUywgcmF0ZSk7CisKKwkvKiBDeWNsZSB0aGUgREFDIHRvIGVuYWJsZSB0aGUgbmV3IHJhdGUgKi8KKwlhYzk3X2NvZGVjLT5jb2RlY193cml0ZShkZXYtPmFjOTdfY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgMHgwMjAwKTsKKwlXQUlUXzEwTVMoKTsKKwlhYzk3X2NvZGVjLT5jb2RlY193cml0ZShkZXYtPmFjOTdfY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZDE4ODlfc2V0X3dhdl9mbXQoYWQxODg5X2Rldl90ICpkZXYsIGludCBmbXQpCit7CisJdTE2IHRtcDsKKworCURCRygiU2V0dGluZyBXQVYgZm9ybWF0IHRvIDB4JXhcbiIsIGZtdCk7CisKKwl0bXAgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNXU01DKTsKKwlpZiAoZm10ICYgQUZNVF9TMTZfTEUpIHsKKwkJLy90bXAgfD0gMHgwMTAwOyAvKiBzZXQgV0ExNiAqLworCQl0bXAgfD0gMHgwMzAwOyAvKiBzZXQgV0ExNiBzdGVyZW8gKi8KKwl9IGVsc2UgaWYgKGZtdCAmIEFGTVRfVTgpIHsKKwkJdG1wICY9IH4weDAxMDA7IC8qIGNsZWFyIFdBMTYgKi8KKwl9IAorCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNXU01DLCB0bXApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWQxODg5X3NldF9hZGNfZm10KGFkMTg4OV9kZXZfdCAqZGV2LCBpbnQgZm10KQoreworCXUxNiB0bXA7CisKKwlEQkcoIlNldHRpbmcgQURDIGZvcm1hdCB0byAweCV4XG4iLCBmbXQpOworCisJdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTUkFNQyk7CisJaWYgKGZtdCAmIEFGTVRfUzE2X0xFKSB7CisJCXRtcCB8PSAweDAxMDA7IC8qIHNldCBXQTE2ICovCisJfSBlbHNlIGlmIChmbXQgJiBBRk1UX1U4KSB7CisJCXRtcCAmPSB+MHgwMTAwOyAvKiBjbGVhciBXQTE2ICovCisJfSAKKwlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTUkFNQywgdG1wKTsKK30KKworc3RhdGljIHZvaWQgYWQxODg5X3N0YXJ0X3dhdihhZDE4ODlfc3RhdGVfdCAqc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlpbnQgY250OworCXUxNiB0bXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkbWFidWYtPmRtYV9sZW4pCS8qIERNQSBhbHJlYWR5IGluIGZsaWdodCAqLworCQlnb3RvIHNraXBfZG1hOworCisJLyogc2V0dXAgZG1hICovCisJY250ID0gZG1hYnVmLT53cl9wdHIgLSBkbWFidWYtPnJkX3B0cjsKKwlpZiAoY250ID09IDApCQkvKiBkb25lIC0gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLworCQlnb3RvIHNraXBfZG1hOworCisJLyogSWYgdGhlIHdyX3B0ciBoYXMgd3JhcHBlZCwgb25seSBtYXAgdG8gdGhlIGVuZCAqLworCWlmIChjbnQgPCAwKQorCQljbnQgPSBETUFfU0laRSAtIGRtYWJ1Zi0+cmRfcHRyOworCisJZG1hYnVmLT5kbWFfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUoYWQxODg5X2Rldi0+cGNpLAorCQkJCQlkbWFidWYtPnJhd2J1ZiArIGRtYWJ1Zi0+cmRfcHRyLAorCQkJCQljbnQsIFBDSV9ETUFfVE9ERVZJQ0UpOworCWRtYWJ1Zi0+ZG1hX2xlbiA9IGNudDsKKwlkbWFidWYtPnJlYWR5ID0gMTsKKworCURCRygiU3RhcnRpbmcgcGxheWJhY2sgYXQgMHglcCBmb3IgJWxkIGJ5dGVzXG4iLCBkbWFidWYtPnJhd2J1ZiArCisJICAgIGRtYWJ1Zi0+cmRfcHRyLCBkbWFidWYtPmRtYV9sZW4pOworCisgICAgICAgIC8qIGxvYWQgdXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgc2V0ICovCisJQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFXQVZDQywgY250KTsKKwlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQVdBVklDQywgY250KTsKKwlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQVdBVkNBLCBkbWFidWYtPmRtYV9oYW5kbGUpOworCisJLyogVE9ETzogZm9yIG5vdyB3ZSBsb2FkIHRoZSBiYXNlIHJlZ2lzdGVycyB3aXRoIHRoZSBzYW1lIHRoaW5nICovCisJQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFXQVZCQywgY250KTsKKwlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQVdBVklCQywgY250KTsKKwlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQVdBVkJBLCBkbWFidWYtPmRtYV9oYW5kbGUpOworCisJLyogYW5kIHdlJ3JlIG9mZiB0byB0aGUgcmFjZXMuLi4gKi8KKwlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQUNIU1MsIDB4OCk7CisJdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTV1NNQyk7CisJdG1wIHw9IDB4MDQwMDsgLyogc2V0IFdBRU4gKi8KKwlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTV1NNQywgdG1wKTsKKwkodm9pZCkgQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTV1NNQyk7IC8qIGZsdXNoIHBvc3RlZCBQQ0kgd3JpdGUgKi8KKworCWRtYWJ1Zi0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOworCitza2lwX2RtYToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIGFkMTg4OV9zdG9wX3dhdihhZDE4ODlfc3RhdGVfdCAqc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpIHsKKwkJdTE2IHRtcDsKKwkJdW5zaWduZWQgbG9uZyBjbnQgPSBkbWFidWYtPmRtYV9sZW47CisKKwkJdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTV1NNQyk7CisJCXRtcCAmPSB+MHgwNDAwOyAvKiBjbGVhciBXQUVOICovCisJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNXU01DLCB0bXApOworCQkodm9pZCkgQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTV1NNQyk7IC8qIGZsdXNoIHBvc3RlZCBQQ0kgd3JpdGUgKi8KKwkJcGNpX3VubWFwX3NpbmdsZShhZDE4ODlfZGV2LT5wY2ksIGRtYWJ1Zi0+ZG1hX2hhbmRsZSwgCisJCQkJY250LCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7CisKKwkJLyogdXBkYXRlIGRtYSBwb2ludGVycyAqLworCQlkbWFidWYtPnJkX3B0ciArPSBjbnQ7CisJCWRtYWJ1Zi0+cmRfcHRyICY9IChETUFfU0laRSAtIDEpOworCisJCWRtYWJ1Zi0+ZG1hX2hhbmRsZSA9IDA7CisJCWRtYWJ1Zi0+ZG1hX2xlbiA9IDA7CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCisJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworCisjaWYgMAorc3RhdGljIHZvaWQgYWQxODg5X3N0YXJ0c3RvcF9hZGMoYWQxODg5X3N0YXRlX3QgKnN0YXRlLCBpbnQgc3RhcnQpCit7CisJdTE2IHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCisJdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTUkFNQyk7CisJaWYgKHN0YXJ0KSB7CisJCXN0YXRlLT5kbWFidWYuZW5hYmxlIHw9IEFEQ19SVU5OSU5HOworCQl0bXAgfD0gMHgwMDA0OyAvKiBzZXQgQURFTiAqLworCX0gZWxzZSB7CisJCXN0YXRlLT5kbWFidWYuZW5hYmxlICY9IH5BRENfUlVOTklORzsKKwkJdG1wICY9IH4weDAwMDQ7IC8qIGNsZWFyIEFERU4gKi8KKwl9CisJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU1JBTUMsIHRtcCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKK3N0YXRpYyBhZDE4ODlfZGV2X3QgKmFkMTg4OV9hbGxvY19kZXYoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlhZDE4ODlfZGV2X3QgKmRldjsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJaW50IGk7CisKKwlpZiAoKGRldiA9IGttYWxsb2Moc2l6ZW9mKGFkMTg4OV9kZXZfdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSAKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKGFkMTg4OV9kZXZfdCkpOworCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOworCWRldi0+cGNpID0gcGNpOworCisJZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgeworCQlkZXYtPnN0YXRlW2ldLmNhcmQgPSBkZXY7CisJCWluaXRfTVVURVgoJmRldi0+c3RhdGVbaV0uc2VtKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5zdGF0ZVtpXS5kbWFidWYud2FpdCk7CisJfQorCisJLyogYWxsb2NhdGUgZG1hIGJ1ZmZlciAqLworCisJZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgeworCQlkbWFidWYgPSAmZGV2LT5zdGF0ZVtpXS5kbWFidWY7CisJCWRtYWJ1Zi0+cmF3YnVmID0ga21hbGxvYyhETUFfU0laRSwgR0ZQX0tFUk5FTHxHRlBfRE1BKTsKKwkJaWYgKCFkbWFidWYtPnJhd2J1ZikKKwkJCWdvdG8gZXJyX2ZyZWVfZG1hYnVmOworCQlkbWFidWYtPnJhd2J1Zl9zaXplID0gRE1BX1NJWkU7CisJCWRtYWJ1Zi0+ZG1hX2hhbmRsZSA9IDA7CisJCWRtYWJ1Zi0+cmRfcHRyID0gZG1hYnVmLT53cl9wdHIgPSBkbWFidWYtPmRtYV9sZW4gPSAwVUw7CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQlkbWFidWYtPnJhdGUgPSA0ODAwMDsKKwl9CisJcmV0dXJuIGRldjsKKworZXJyX2ZyZWVfZG1hYnVmOgorCXdoaWxlICgtLWkgPj0gMCkKKwkJa2ZyZWUoZGV2LT5zdGF0ZVtpXS5kbWFidWYucmF3YnVmKTsKKwlrZnJlZShkZXYpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBhZDE4ODlfZnJlZV9kZXYoYWQxODg5X2Rldl90ICpkZXYpCit7CisJaW50IGo7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOworCisJaWYgKGRldiA9PSBOVUxMKSAKKwkJcmV0dXJuOworCisJaWYgKGRldi0+YWM5N19jb2RlYykKKwkJYWM5N19yZWxlYXNlX2NvZGVjKGRldi0+YWM5N19jb2RlYyk7CisKKwlmb3IgKGogPSAwOyBqIDwgQURfTUFYX1NUQVRFUzsgaisrKSB7CisJCWRtYWJ1ZiA9ICZkZXYtPnN0YXRlW2pdLmRtYWJ1ZjsKKwkJaWYgKGRtYWJ1Zi0+cmF3YnVmICE9IE5VTEwpIAorCQkJa2ZyZWUoZG1hYnVmLT5yYXdidWYpOworCX0KKworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZDE4ODlfdHJpZ2dlcl9wbGF5YmFjayhhZDE4ODlfZGV2X3QgKmRldikKK3sKKyNpZiAwCisJdTMyIHZhbDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdLmRtYWJ1ZjsKKyNlbmRpZgorCisJYWQxODg5X3N0YXJ0X3dhdigmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdKTsKK30KKworc3RhdGljIGludCBhZDE4ODlfcmVhZF9wcm9jIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpvdXQgPSBwYWdlOworCWludCBsZW4sIGk7CisJYWQxODg5X2Rldl90ICpkZXYgPSBkYXRhOworCWFkMTg4OV9yZWdfdCByZWdzW10gPSB7CisJCXsgIldTTUMiLCBBRF9EU1dTTUMsIDE2IH0sCisJCXsgIlJBTUMiLCBBRF9EU1JBTUMsIDE2IH0sCisJCXsgIldBREEiLCBBRF9EU1dBREEsIDE2IH0sCisJCXsgIlNZREEiLCBBRF9EU1NZREEsIDE2IH0sCisJCXsgIldBUyIsIEFEX0RTV0FTLCAxNiB9LAorCQl7ICJSRVMiLCBBRF9EU1JFUywgMTYgfSwKKwkJeyAiQ0NTIiwgQURfRFNDQ1MsIDE2IH0sCisJCXsgIkFEQ0JBIiwgQURfRE1BQURDQkEsIDMyIH0sCisJCXsgIkFEQ0NBIiwgQURfRE1BQURDQ0EsIDMyIH0sCisJCXsgIkFEQ0JDIiwgQURfRE1BQURDQkMsIDMyIH0sCisJCXsgIkFEQ0NDIiwgQURfRE1BQURDQ0MsIDMyIH0sCisJCXsgIkFEQ0lCQyIsIEFEX0RNQUFEQ0lCQywgMzIgfSwKKwkJeyAiQURDSUNDIiwgQURfRE1BQURDSUNDLCAzMiB9LAorCQl7ICJBRENDVFJMIiwgQURfRE1BQURDQ1RSTCwgMTYgfSwKKwkJeyAiV0FWQkEiLCBBRF9ETUFXQVZCQSwgMzIgfSwKKwkJeyAiV0FWQ0EiLCBBRF9ETUFXQVZDQSwgMzIgfSwKKwkJeyAiV0FWQkMiLCBBRF9ETUFXQVZCQywgMzIgfSwKKwkJeyAiV0FWQ0MiLCBBRF9ETUFXQVZDQywgMzIgfSwKKwkJeyAiV0FWSUJDIiwgQURfRE1BV0FWSUJDLCAzMiB9LAorCQl7ICJXQVZJQ0MiLCBBRF9ETUFXQVZJQ0MsIDMyIH0sCisJCXsgIldBVkNUUkwiLCBBRF9ETUFXQVZDVFJMLCAxNiB9LAorCQl7ICJESVNSIiwgQURfRE1BRElTUiwgMzIgfSwKKwkJeyAiQ0hTUyIsIEFEX0RNQUNIU1MsIDMyIH0sCisJCXsgIklQQyIsIEFEX0dQSU9JUEMsIDE2IH0sCisJCXsgIk9QIiwgQURfR1BJT09QLCAxNiB9LAorCQl7ICJJUCIsIEFEX0dQSU9JUCwgMTYgfSwKKwkJeyAiQUNJQyIsIEFEX0FDSUMsIDE2IH0sCisJCXsgIkFDOTdfUkVTRVQiLCAweDEwMCArIEFDOTdfUkVTRVQsIDE2IH0sCisJCXsgIkFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8iLCAweDEwMCArIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIDE2IH0sCisJCXsgIkFDOTdfSEVBRFBIT05FX1ZPTCIsIDB4MTAwICsgQUM5N19IRUFEUEhPTkVfVk9MLCAxNiB9LAorCQl7ICJBQzk3X01BU1RFUl9WT0xfTU9OTyIsIDB4MTAwICsgQUM5N19NQVNURVJfVk9MX01PTk8sIDE2IH0sCisJCXsgIkFDOTdfTUFTVEVSX1RPTkUiLCAweDEwMCArIEFDOTdfTUFTVEVSX1RPTkUsIDE2IH0sCisJCXsgIkFDOTdfUENCRUVQX1ZPTCIsIDB4MTAwICsgQUM5N19QQ0JFRVBfVk9MLCAxNiB9LAorCQl7ICJBQzk3X1BIT05FX1ZPTCIsIDB4MTAwICsgQUM5N19QSE9ORV9WT0wsIDE2IH0sCisJCXsgIkFDOTdfTUlDX1ZPTCIsIDB4MTAwICsgQUM5N19NSUNfVk9MLCAxNiB9LAorCQl7ICJBQzk3X0xJTkVJTl9WT0wiLCAweDEwMCArIEFDOTdfTElORUlOX1ZPTCwgMTYgfSwKKwkJeyAiQUM5N19DRF9WT0wiLCAweDEwMCArIEFDOTdfQ0RfVk9MLCAxNiB9LAorCQl7ICJBQzk3X1ZJREVPX1ZPTCIsIDB4MTAwICsgQUM5N19WSURFT19WT0wsIDE2IH0sCisJCXsgIkFDOTdfQVVYX1ZPTCIsIDB4MTAwICsgQUM5N19BVVhfVk9MLCAxNiB9LAorCQl7ICJBQzk3X1BDTU9VVF9WT0wiLCAweDEwMCArIEFDOTdfUENNT1VUX1ZPTCwgMTYgfSwKKwkJeyAiQUM5N19SRUNPUkRfU0VMRUNUIiwgMHgxMDAgKyBBQzk3X1JFQ09SRF9TRUxFQ1QsIDE2IH0sCisJCXsgIkFDOTdfUkVDT1JEX0dBSU4iLCAweDEwMCArIEFDOTdfUkVDT1JEX0dBSU4sIDE2IH0sCisJCXsgIkFDOTdfUkVDT1JEX0dBSU5fTUlDIiwgMHgxMDAgKyBBQzk3X1JFQ09SRF9HQUlOX01JQywgMTYgfSwKKwkJeyAiQUM5N19HRU5FUkFMX1BVUlBPU0UiLCAweDEwMCArIEFDOTdfR0VORVJBTF9QVVJQT1NFLCAxNiB9LAorCQl7ICJBQzk3XzNEX0NPTlRST0wiLCAweDEwMCArIEFDOTdfM0RfQ09OVFJPTCwgMTYgfSwKKwkJeyAiQUM5N19NT0RFTV9SQVRFIiwgMHgxMDAgKyBBQzk3X01PREVNX1JBVEUsIDE2IH0sCisJCXsgIkFDOTdfUE9XRVJfQ09OVFJPTCIsIDB4MTAwICsgQUM5N19QT1dFUl9DT05UUk9MLCAxNiB9LAorCQl7IE5VTEwgfQorCX07CisKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJZm9yIChpID0gMDsgcmVnc1tpXS5uYW1lICE9IDA7IGkrKykKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJXM6IDB4JTAqeFxuIiwgcmVnc1tpXS5uYW1lLCAKKwkJCXJlZ3NbaV0ud2lkdGggPj4gMiwgCisJCQkocmVnc1tpXS53aWR0aCA9PSAxNiAKKwkJCSAJPyBBRDE4ODlfUkVBRFcoZGV2LCByZWdzW2ldLm9mZnNldCkKKwkJCQk6IEFEMTg4OV9SRUFETChkZXYsIHJlZ3NbaV0ub2Zmc2V0KSkpOworCisJZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICJETUEgc3RhdHVzIGZvciAlczpcbiIsIAorCQkJKGkgPT0gQURfV0FWX1NUQVRFID8gIldBViIgOiAiQURDIikpOyAKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiXHRcdDB4JXAgKElPVkE6IDB4JWxsdSlcbiIsCisJCQlkZXYtPnN0YXRlW2ldLmRtYWJ1Zi5yYXdidWYsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWRldi0+c3RhdGVbaV0uZG1hYnVmLmRtYV9oYW5kbGUpOworCisJCW91dCArPSBzcHJpbnRmKG91dCwgIlx0cmVhZCBwdHI6IG9mZnNldCAldVxuIiwgCisJCQkodW5zaWduZWQgaW50KWRldi0+c3RhdGVbaV0uZG1hYnVmLnJkX3B0cik7CisJCW91dCArPSBzcHJpbnRmKG91dCwgIlx0d3JpdGUgcHRyOiBvZmZzZXQgJXVcbiIsIAorCQkJKHVuc2lnbmVkIGludClkZXYtPnN0YXRlW2ldLmRtYWJ1Zi53cl9wdHIpOworCQlvdXQgKz0gc3ByaW50ZihvdXQsICJcdGRtYSBsZW46IG9mZnNldCAldVxuIiwgCisJCQkodW5zaWduZWQgaW50KWRldi0+c3RhdGVbaV0uZG1hYnVmLmRtYV9sZW4pOworCX0KKworCWxlbiA9IG91dCAtIHBhZ2UgLSBvZmY7CisJaWYgKGxlbiA8IGNvdW50KSB7CisJCSplb2YgPSAxOworCQlpZiAobGVuIDw9IDApIHJldHVybiAwOworCX0gZWxzZSB7CisJCWxlbiA9IGNvdW50OworCX0KKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCXJldHVybiBsZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2lmIDAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhZDE4ODlfZ2V0X2RtYV9hZGRyKGFkMTg4OV9zdGF0ZV90ICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1MzIgb2Zmc2V0OworCisJaWYgKCEoZG1hYnVmLT5lbmFibGUgJiAoREFDX1JVTk5JTkcgfCBBRENfUlVOTklORykpKSB7CisJCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IGdldF9kbWFfYWRkciBjYWxsZWQgd2l0aG91dCBkbWEgZW5hYmxlZFxuIik7CisJCXJldHVybiAwOworCX0KKwkKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKKwkJb2Zmc2V0ID0gbGUzMl90b19jcHUoQUQxODg5X1JFQURMKHN0YXRlLT5jYXJkLCBBRF9ETUFXQVZCQSkpOworCWVsc2UKKwkJb2Zmc2V0ID0gbGUzMl90b19jcHUoQUQxODg5X1JFQURMKHN0YXRlLT5jYXJkLCBBRF9ETUFBRENCQSkpOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKW9mZnNldCkgLSAodW5zaWduZWQgbG9uZylkbWFidWYtPnJhd2J1ZjsKK30KKworc3RhdGljIHZvaWQgYWQxODg5X3VwZGF0ZV9wdHIoYWQxODg5X2Rldl90ICpkZXYsIGludCB3YWtlKQoreworCWFkMTg4OV9zdGF0ZV90ICpzdGF0ZTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJdW5zaWduZWQgbG9uZyBod3B0cjsKKwlpbnQgZGlmZjsKKworCS8qIGNoZWNrIEFEQyBmaXJzdCAqLworCXN0YXRlID0gJmRldi0+YWRjX3N0YXRlOworCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7CisJCWh3cHRyID0gYWQxODg5X2dldF9kbWFfYWRkcihzdGF0ZSk7CisJCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKworCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJZG1hYnVmLT5jb3VudCArPSBkaWZmOworCQlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKKwkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CisKKwkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CisJCQlpZiAod2FrZSAmIGRtYWJ1Zi0+Y291bnQgPj0gZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9IGVsc2UgeworCQkJaWYgKHdha2UgJiBkbWFidWYtPmNvdW50ID4gMCkKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9CisJfQorCisJLyogY2hlY2sgREFDICovCisJc3RhdGUgPSAmZGV2LT53YXZfc3RhdGU7CisJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpIHsKK1hYWAorCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogL2Rldi9kc3AgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBzc2l6ZV90IGFkMTg4OV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsCisJbG9mZl90ICpwcG9zKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhZDE4ODlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwKKwlsb2ZmX3QgKnBwb3MpCit7CisJYWQxODg5X2Rldl90ICpkZXYgPSAoYWQxODg5X2Rldl90ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWFkMTg4OV9zdGF0ZV90ICpzdGF0ZSA9ICZkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV07CisJdm9sYXRpbGUgc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3NpemVfdCByZXQgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJZG93bigmc3RhdGUtPnNlbSk7CisjaWYgMAorCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyMTsKKwl9CisjZW5kaWYKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnIxOworCX0KKworCWFkZF93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKKworCS8qIHN0YXJ0IGZpbGxpbmcgZG1hIGJ1ZmZlci4uLi4gKi8KKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWxvbmcgcmVtOworCQlsb25nIGNudCA9IGNvdW50OworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWZvciAoOzspIHsKKwkJCWxvbmcgdXNlZF9ieXRlczsKKwkJCWxvbmcgdGltZW91dDsJLyogbWF4IHRpbWUgZm9yIERNQSBpbiBqaWZmaWVzICovCisKKwkJCS8qIGJ1ZmZlciBpcyBmdWxsIGlmIHdyIGNhdGNoZXMgdXAgdG8gcmQgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJdXNlZF9ieXRlcyA9IGRtYWJ1Zi0+d3JfcHRyIC0gZG1hYnVmLT5yZF9wdHI7CisJCQl0aW1lb3V0ID0gKGRtYWJ1Zi0+ZG1hX2xlbiAqIEhaKSAvIGRtYWJ1Zi0+cmF0ZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJCS8qIGFkanVzdCBmb3IgYnVmZmVyIHdyYXAgYXJvdW5kICovCisJCQl1c2VkX2J5dGVzID0gKHVzZWRfYnl0ZXMgKyBETUFfU0laRSkgJiAoRE1BX1NJWkUgLSAxKTsKKworCQkJLyogSWYgYXQgbGVhc3Qgb25lIHBhZ2UgdW51c2VkICovCisJCQlpZiAodXNlZF9ieXRlcyA8IChETUFfU0laRSAtIDB4MTAwMCkpCisJCQkJYnJlYWs7CisKKwkJCS8qIGRtYSBidWZmZXIgZnVsbCAqLworCisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gZXJyMjsKKwkJCX0KKworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCArIDEpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gZXJyMjsKKwkJCX0KKwkJfQorCisJCS8qIHdhdGNoIG91dCBmb3Igd3JhcHBpbmcgYXJvdW5kIHN0YXRpYyBidWZmZXIgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCXJlbSA9IERNQV9TSVpFIC0gZG1hYnVmLT53cl9wdHI7CisJCWlmIChjbnQgPiByZW0pCisJCQljbnQgPSByZW07CisKKwkJcmVtID0gZG1hYnVmLT53cl9wdHI7CisKKwkJLyogdXBkYXRlIGRtYSBwb2ludGVycyAqLworCQlkbWFidWYtPndyX3B0ciArPSBjbnQ7CisJCWRtYWJ1Zi0+d3JfcHRyICY9IERNQV9TSVpFIC0gMTsJLyogd3JhcCBwdHIgaWYgbmVjZXNzYXJ5ICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJLyogdHJhbnNmZXIgdW53cmFwcGVkIGNodW5rICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHJlbSwgYnVmZmVyLCBjbnQpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBlcnIyOworCQl9CisKKwkJREJHKCJXcml0aW5nIDB4JWx4IGJ5dGVzIHRvICsweCVseFxuIiwgY250LCByZW0pOworCisJCS8qIHVwZGF0ZSBjb3VudGVycyAqLworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisKKwkJLyogd2UgaGF2ZSBzb21ldGhpbmcgdG8gcGxheSAtIGdvIHBsYXkgaXQhICovCisJCWFkMTg4OV90cmlnZ2VyX3BsYXliYWNrKGRldik7CisJfQorCitlcnIyOgorCXJlbW92ZV93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKK2VycjE6CisJdXAoJnN0YXRlLT5zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWQxODg5X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisjaWYgMAorCWFkMTg4OV9kZXZfdCAqZGV2ID0gKGFkMTg4OV9kZXZfdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlhZDE4ODlfc3RhdGVfdCAqc3RhdGUgPSBOVUxMOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmICghKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RhdGUgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdOworCQlpZiAoIXN0YXRlKSByZXR1cm4gMDsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdGF0ZSA9ICZkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV07CisJCWlmICghc3RhdGUpIHJldHVybiAwOworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlhZDE4ODlfdXBkYXRlX3B0cihkZXYsIDApOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0YXRlID0gJmRldi0+c3RhdGVbV0FWX1NUQVRFXTsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKGludClkbWFidWYtPmZyYWdzaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0gZWxzZSB7CisJCQlpZiAoKGludClkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArIAorCQkJCShpbnQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9CisJfQorCisJaWYgKGZpbGUgLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0YXRlID0gJmRldi0+c3RhdGVbQURfQURDX1NUQVRFXTsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWlmIChkbWFidWYtPmNvdW50ID49IChpbnQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKyNlbmRpZgorCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGFkMTg4OV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE4ODlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHZhbCA9IDA7CisJYWQxODg5X2Rldl90ICpkZXYgPSAoYWQxODg5X2Rldl90ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwlhdWRpb19idWZfaW5mbyBhYmluZm87CisJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOworCisJREJHKCJhZDE4ODlfaW9jdGwgY21kIDB4JXggYXJnICVsdVxuIiwgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpCisJeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCS8qIHNldCBzYW1wbGluZyByYXRlICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPiA1NDAwICYmIHZhbCA8IDQ4MDAwKQorCQl7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQkJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU1dBUywgdmFsKTsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNSRVMsIHZhbCk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOiAvKiB1bmRvY3VtZW50ZWQ/ICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQl2YWwgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNXU01DKTsKKwkJCWlmICh2YWwpIHsKKwkJCQl2YWwgfD0gMHgwMjAwOyAgLyogc2V0IFdBU1QgKi8KKwkJCX0gZWxzZSB7CisJCQkJdmFsICY9IH4weDAyMDA7IC8qIGNsZWFyIFdBU1QgKi8KKwkJCX0KKwkJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNXU01DLCB2YWwpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJdmFsID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTUkFNQyk7CisJCQlpZiAodmFsKSB7CisJCQkJdmFsIHw9IDB4MDAwMjsgIC8qIHNldCBBRFNUICovCisJCQl9IGVsc2UgeworCQkJCXZhbCAmPSB+MHgwMDAyOyAvKiBjbGVhciBBRFNUICovCisJCQl9CisJCQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTUkFNQywgdmFsKTsKKwkJfQorCisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCXJldHVybiBwdXRfdXNlcihETUFfU0laRSwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFfEFGTVRfVTgsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodmFsID09IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAKKwkJCQlhZDE4ODlfc2V0X2FkY19mbXQoZGV2LCB2YWwpOworCisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIAorCQkJCWFkMTg4OV9zZXRfd2F2X2ZtdChkZXYsIHZhbCk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBBRk1UX1MxNl9MRSB8IEFGTVRfVTg7CisJCX0KKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJLyogc2VuZCBhbGwgZGF0YSB0byBkZXZpY2UgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJLyogbm90IHN1cHBvcnRlZDsgdXNlcyBmaXhlZCBmcmFnbWVudCBzaXplcyAqLworCQlyZXR1cm4gcHV0X3VzZXIoRE1BX1NJWkUsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQkvKiBzcGFjZSBsZWZ0IGluIGRtYSBidWZmZXJzICovCisJCWlmIChjbWQgPT0gU05EQ1RMX0RTUF9HRVRPU1BBQ0UpCisJCQlkbWFidWYgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdLmRtYWJ1ZjsKKwkJZWxzZQorCQkJZG1hYnVmID0gJmRldi0+c3RhdGVbQURfQURDX1NUQVRFXS5kbWFidWY7CisJCWFiaW5mby5mcmFnbWVudHMgPSAxOworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IDE7CisJCWFiaW5mby5mcmFnc2l6ZSA9IERNQV9TSVpFOworCQlhYmluZm8uYnl0ZXMgPSBETUFfU0laRTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJYnJlYWs7CisJCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcihBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNXQVMpLCBwKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKKwljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRU5PVFRZOworfQorCitzdGF0aWMgaW50IGFkMTg4OV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIGNoZWNrIG1pbm9yOyBvbmx5IHN1cHBvcnQgL2Rldi9kc3AgYXRtICovCisJaWYgKGltaW5vcihpbm9kZSkgIT0gMykKKwkJcmV0dXJuIC1FTlhJTzsKKwkKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBhZDE4ODlfZGV2OworCisJYWQxODg5X3NldF93YXZfcmF0ZShhZDE4ODlfZGV2LCA0ODAwMCk7CisJYWQxODg5X3NldF93YXZfZm10KGFkMTg4OV9kZXYsIEFGTVRfUzE2X0xFKTsKKwlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTV0FEQSwgMHgwNDA0KTsgLyogYXR0ZW51YXRpb24gKi8KKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgYWQxODg5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogaWYgd2UgaGF2ZSBzdGF0ZSBmcmVlIGl0IGhlcmUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWQxODg5X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGFkMTg4OV9yZWFkLAorCS53cml0ZQkJPSBhZDE4ODlfd3JpdGUsCisJLnBvbGwJCT0gYWQxODg5X3BvbGwsCisJLmlvY3RsCQk9IGFkMTg4OV9pb2N0bCwKKwkubW1hcAkJPSBhZDE4ODlfbW1hcCwKKwkub3BlbgkJPSBhZDE4ODlfb3BlbiwKKwkucmVsZWFzZQk9IGFkMTg4OV9yZWxlYXNlLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogL2Rldi9taXhlciBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoYWQxODg5X2Rldi0+YWM5N19jb2RlYy0+ZGV2X21peGVyICE9IGltaW5vcihpbm9kZSkpCisJCXJldHVybiAtRU5PREVWOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYWQxODg5X2Rldi0+YWM5N19jb2RlYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWQxODg5X21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBhZDE4ODlfbWl4ZXJfaW9jdGwsCisJLm9wZW4JCT0gYWQxODg5X21peGVyX29wZW4sCisJLnJlbGVhc2UJPSBhZDE4ODlfbWl4ZXJfcmVsZWFzZSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEFDOTcgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyB2b2lkIGFkMTg4OV9jb2RlY193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NywgdTggcmVnLCB1MTYgdmFsKQoreworCWFkMTg4OV9kZXZfdCAqZGV2ID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCisJLy9EQkcoIldyaXRpbmcgMHgleCB0byAweCVseFxuIiwgdmFsLCBkZXYtPnJlZ2Jhc2UgKyAweDEwMCArIHJlZyk7CisJQUQxODg5X1dSSVRFVyhkZXYsIDB4MTAwICsgcmVnLCB2YWwpOworfQorCitzdGF0aWMgdTE2IGFkMTg4OV9jb2RlY19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICphYzk3LCB1OCByZWcpCit7CisJYWQxODg5X2Rldl90ICpkZXYgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJLy9EQkcoIlJlYWRpbmcgZnJvbSAweCVseFxuIiwgZGV2LT5yZWdiYXNlICsgMHgxMDAgKyByZWcpOworCXJldHVybiBBRDE4ODlfUkVBRFcoZGV2LCAweDEwMCArIHJlZyk7Cit9CQorCitzdGF0aWMgaW50IGFkMTg4OV9hYzk3X2luaXQoYWQxODg5X2Rldl90ICpkZXYsIGludCBpZCkKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NzsKKwl1MTYgZWlkOworCisJaWYgKChhYzk3ID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKSAKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhYzk3LT5wcml2YXRlX2RhdGEgPSBkZXY7CisJYWM5Ny0+aWQgPSBpZDsKKworCWFjOTctPmNvZGVjX3JlYWQgPSBhZDE4ODlfY29kZWNfcmVhZDsKKwlhYzk3LT5jb2RlY193cml0ZSA9IGFkMTg4OV9jb2RlY193cml0ZTsKKworCWlmIChhYzk3X3Byb2JlX2NvZGVjKGFjOTcpID09IDApIHsKKwkJcHJpbnRrKERFVk5BTUUgIjogYWM5N19wcm9iZV9jb2RlYyBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWVpZCA9IGFkMTg4OV9jb2RlY19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfSUQpOworCWlmIChlaWQgPT0gMHhmZmZmKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgREVWTkFNRSAiOiBubyBjb2RlYyBhdHRhY2hlZD9cbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRldi0+YWM5N19mZWF0dXJlcyA9IGVpZDsKKworCWlmICgoYWM5Ny0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmFkMTg4OV9taXhlcl9mb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBjYW5ub3QgcmVnaXN0ZXIgbWl4ZXJcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRldi0+YWM5N19jb2RlYyA9IGFjOTc7CisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCWFjOTdfcmVsZWFzZV9jb2RlYyhhYzk3KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBhZDE4ODlfYWNsaW5rX3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICogcGNpZGV2KQoreworCXUxNiBzdGF0OworCWludCByZXRyeSA9IDIwMDsKKwlhZDE4ODlfZGV2X3QgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOworCisJQUQxODg5X1dSSVRFVyhkZXYsIEFEX0RTQ0NTLCAweDgwMDApOyAvKiB0dXJuIG9uIGNsb2NrICovCisJQUQxODg5X1JFQURXKGRldiwgQURfRFNDQ1MpOyAKKworCVdBSVRfMTBNUygpOworCisJc3RhdCA9IEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDSUMpOworCXN0YXQgfD0gMHgwMDAyOwkJCQkvKiBSZXNldCBEaXNhYmxlICovCisJQUQxODg5X1dSSVRFVyhkZXYsIEFEX0FDSUMsIHN0YXQpOworCSh2b2lkKSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQ0lDKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCisKKwl1ZGVsYXkoMTApOworCisJc3RhdCA9IEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDSUMpOworCXN0YXQgfD0gMHgwMDAxOwkJCQkvKiBJbnRlcmZhY2UgRW5hYmxlICovCisJQUQxODg5X1dSSVRFVyhkZXYsIEFEX0FDSUMsIHN0YXQpOworCisJZG8geworCQlpZiAoQUQxODg5X1JFQURXKGRldiwgQURfQUNJQykgJiAweDgwMDApCS8qIFJlYWR5ICovCisJCQlicmVhazsKKwkJV0FJVF8xME1TKCk7CisJCXJldHJ5LS07CisJfSB3aGlsZSAocmV0cnkgPiAwKTsKKworCWlmICghcmV0cnkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhZDE4ODlfYWNsaW5rX3Jlc2V0OiBjb2RlYyBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAorCQkJICAgIEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDSUMpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBUT0RPIHJlc2V0IEFDOTcgY29kZWMgKi8KKwkvKiBUT0RPIHNldCB3YXZlL2FkYyBwY2kgY3RybCBzdGF0dXMgKi8KKworCXN0YXQgPSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQ0lDKTsKKwlzdGF0IHw9IDB4MDAwNDsJCQkJLyogQXVkaW8gU3RyZWFtIE91dHB1dCBFbmFibGUgKi8KKwlBRDE4ODlfV1JJVEVXKGRldiwgQURfQUNJQywgc3RhdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogUENJIGRldmljZSB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFkMTg4OV9pZF90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQU5BTE9HX0RFVklDRVMsIFBDSV9ERVZJQ0VfSURfQUQxODg5SlMsIFBDSV9BTllfSUQsIAorCSAgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpREVWTkFNRSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWQxODg5X2lkX3RibCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhZDE4ODlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIHN0YXQ7CisJYWQxODg5X2Rldl90ICpkZXYgPSAoYWQxODg5X2Rldl90ICopZGV2X2lkOworCisJc3RhdCA9IEFEMTg4OV9SRUFETChkZXYsIEFEX0RNQURJU1IpOworCisJLyogY2xlYXIgSVNSICovCisJQUQxODg5X1dSSVRFTChkZXYsIEFEX0RNQURJU1IsIHN0YXQpOworCisJaWYgKHN0YXQgJiAweDgpIHsJCS8qIFdBVkkgKi8KKwkJREJHKCJXQVYgaW50ZXJydXB0XG4iKTsKKwkJZGV2LT5zdGF0cy53YXZfaW50cnMrKzsKKwkJaWYgKGRldi0+c3RhdGVbQURfV0FWX1NUQVRFXS5kbWFidWYucmVhZHkpIHsKKwkJCWFkMTg4OV9zdG9wX3dhdigmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdKTsJLyogY2xlYW4gdXAgKi8KKwkJCWFkMTg4OV9zdGFydF93YXYoJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXSk7CS8qIHN0YXJ0IG5ldyAqLworCQl9CisJfQorCisJaWYgKChzdGF0ICYgMHgyKSAmJiBkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV0uZG1hYnVmLnJlYWR5KSB7IC8qIEFEQ0kgKi8KKwkJREJHKCJBREMgaW50ZXJydXB0XG4iKTsKKwkJZGV2LT5zdGF0cy5hZGNfaW50cnMrKzsKKwl9CisJaWYoc3RhdCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIHZvaWQgYWQxODg5X2luaXRjZmcoYWQxODg5X2Rldl90ICpkZXYpCit7CisJdTE2IHRtcDE2OworCXUzMiB0bXAzMjsKKworCS8qIG1ha2Ugc3VyZSB0aGUgaW50ZXJydXB0IGJpdHMgYXJlIHNldHVwIHRoZSB3YXkgd2Ugd2FudCAqLworCXRtcDMyID0gQUQxODg5X1JFQURMKGRldiwgQURfRE1BV0FWQ1RSTCk7CisJdG1wMzIgJj0gfjB4ZmY7IC8qIGZsYXQgZG1hLCBubyBzZywgbWFzayBvdXQgdGhlIGludHIgYml0cyAqLworCXRtcDMyIHw9IDB4NjsgIC8qIGludHIgb24gY291bnQsIGxvb3AgKi8KKwlBRDE4ODlfV1JJVEVMKGRldiwgQURfRE1BV0FWQ1RSTCwgdG1wMzIpOworCisJLyogdW5tdXRlLi4uICovCisJdG1wMTYgPSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9EU1dBREEpOworCXRtcDE2ICY9IH4weDgwODA7CisJQUQxODg5X1dSSVRFVyhkZXYsIEFEX0RTV0FEQSwgdG1wMTYpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDE4ODlfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyOworCWFkMTg4OV9kZXZfdCAqZGV2OworCXVuc2lnbmVkIGxvbmcgYmFyOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19yb290ID0gTlVMTDsKKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CisJaWYgKChkZXYgPSBhZDE4ODlfYWxsb2NfZGV2KHBjaWRldikpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIGRldik7CisJYmFyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CisJCisgICAgICAgIGlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IG1lbW9yeSByZWdpb24gbm90IGFzc2lnbmVkXG4iKTsKKwkJZ290byBvdXQxOworCX0KKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb24ocGNpZGV2LCAwLCBERVZOQU1FKSkgeworCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiB1bmFibGUgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJZ290byBvdXQxOworCX0KKworCWRldi0+cmVnYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShiYXIsIEFEX0RTSU9NRU1TSVpFKTsKKwlpZiAoIWRldi0+cmVnYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiB1bmFibGUgdG8gcmVtYXAgaW9tZW1cbiIpOworCQlnb3RvIG91dDI7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKHBjaWRldi0+aXJxLCBhZDE4ODlfaW50ZXJydXB0LCBTQV9TSElSUSwgREVWTkFNRSwgZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IHVuYWJsZSB0byByZXF1ZXN0IGludGVycnVwdFxuIik7CisJCWdvdG8gb3V0MzsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjogJXMgYXQgJXAgSVJRICVkXG4iLAorCQkoY2hhciAqKWVudC0+ZHJpdmVyX2RhdGEsIGRldi0+cmVnYmFzZSwgcGNpZGV2LT5pcnEpOworCisJaWYgKGFkMTg4OV9hY2xpbmtfcmVzZXQocGNpZGV2KSAhPSAwKQorCQlnb3RvIG91dDQ7CisKKwkvKiByZWdpc3RlciAvZGV2L2RzcCAqLworCWlmICgoZGV2LT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmFkMTg4OV9mb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBjYW5ub3QgcmVnaXN0ZXIgL2Rldi9kc3BcbiIpOworCQlnb3RvIG91dDQ7CisJfQorCisJaWYgKChlcnIgPSBhZDE4ODlfYWM5N19pbml0KGRldiwgMCkpICE9IDApCisJCWdvdG8gb3V0NTsKKworCS8qIFhYWDogY2xlYW51cHMgKi8KKwlpZiAoKChwcm9jX3Jvb3QgPSBwcm9jX21rZGlyKCJkcml2ZXIvYWQxODg5IiwgTlVMTCkpID09IE5VTEwpIHx8CisJICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImFjOTciLCBTX0lGUkVHfFNfSVJVR08sIHByb2Nfcm9vdCwgYWM5N19yZWFkX3Byb2MsIGRldi0+YWM5N19jb2RlYykgPT0gTlVMTCB8fAorCSAgICBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJpbmZvIiwgU19JRlJFR3xTX0lSVUdPLCBwcm9jX3Jvb3QsIGFkMTg4OV9yZWFkX3Byb2MsIGRldikgPT0gTlVMTCkgCisJCWdvdG8gb3V0NTsKKwkKKwlhZDE4ODlfaW5pdGNmZyhkZXYpOworCisJLy9EQkcoREVWTkFNRSAiOiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gZG9uZSFcbiIpOworCisJYWQxODg5X2RldiA9IGRldjsKKworCXJldHVybiAwOworCitvdXQ1OgorCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldi0+ZGV2X2F1ZGlvKTsKK291dDQ6CisJZnJlZV9pcnEocGNpZGV2LT5pcnEsIGRldik7CitvdXQzOgorCWlvdW5tYXAoZGV2LT5yZWdiYXNlKTsKK291dDI6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBjaWRldiwgMCk7CitvdXQxOgorCWFkMTg4OV9mcmVlX2RldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIE5VTEwpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZDE4ODlfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJYWQxODg5X2Rldl90ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKKworCWlmIChkZXYgPT0gTlVMTCkgcmV0dXJuOworCQorCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoZGV2LT5hYzk3X2NvZGVjLT5kZXZfbWl4ZXIpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldi0+ZGV2X2F1ZGlvKTsKKwlmcmVlX2lycShwY2lkZXYtPmlycSwgZGV2KTsKKwlpb3VubWFwKGRldi0+cmVnYmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBjaWRldiwgMCk7CisKKwkvKiBhbnkgaHcgcHJvZ3JhbW1pbmcgbmVlZGVkPyAqLworCWFkMTg4OV9mcmVlX2RldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIE5VTEwpOworfQorCitNT0RVTEVfQVVUSE9SKCJSYW5kb2xwaCBDaHVuZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDE4ODkgUENJIEF1ZGlvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZDE4ODlfZHJpdmVyID0geworCS5uYW1lCQk9IERFVk5BTUUsCisJLmlkX3RhYmxlCT0gYWQxODg5X2lkX3RibCwKKwkucHJvYmUJCT0gYWQxODg5X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQxODg5X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZDE4ODlfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhZDE4ODlfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgYWQxODg5X2V4aXRfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDE4ODlfZHJpdmVyKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KGFkMTg4OV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhZDE4ODlfZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FkMTg4OS5oIGIvc291bmQvb3NzL2FkMTg4OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNGFmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYWQxODg5LmgKQEAgLTAsMCArMSwxMzQgQEAKKyNpZm5kZWYgX0FEMTg4OV9IXworI2RlZmluZSBfQUQxODg5X0hfCisKKyNkZWZpbmUgQURfRFNXU01DCTB4MDAJLyogRE1BIGlucHV0IHdhdmUvc3luIG1peGVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURfRFNSQU1DCTB4MDIJLyogRE1BIG91dHB1dCByZXNhbXAvQURDIG1peGVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURfRFNXQURBCTB4MDQJLyogRE1BIGlucHV0IHdhdmUgYXR0ZW51YXRpb24gKi8KKyNkZWZpbmUgQURfRFNTWURBCTB4MDYJLyogRE1BIGlucHV0IHN5biBhdHRlbnR1YXRpb24gKi8KKyNkZWZpbmUgQURfRFNXQVMJMHgwOAkvKiB3YXZlIGlucHV0IHNhbXBsZSByYXRlICovCisjZGVmaW5lIEFEX0RTUkVTCTB4MGEJLyogcmVzYW1wbGVyIG91dHB1dCBzYW1wbGUgcmF0ZSAqLworI2RlZmluZSBBRF9EU0NDUwkweDBjCS8qIGNoaXAgY29udHJvbC9zdGF0dXMgKi8KKworI2RlZmluZSBBRF9ETUFSRVNCQQkweDQwCS8qIFJFUyBiYXNlIGFkZHIgKi8KKyNkZWZpbmUgQURfRE1BUkVTQ0EJMHg0NAkvKiBSRVMgY3VycmVudCBhZGRyICovCisjZGVmaW5lIEFEX0RNQVJFU0JDCTB4NDgJLyogUkVTIGJhc2UgY250ICovCisjZGVmaW5lIEFEX0RNQVJFU0NDCTB4NGMJLyogUkVTIGN1cnJlbnQgY291bnQgKi8KKyNkZWZpbmUgQURfRE1BQURDQkEJMHg1MAkvKiBBREMgKi8KKyNkZWZpbmUgQURfRE1BQURDQ0EJMHg1NAorI2RlZmluZSBBRF9ETUFBRENCQwkweDU4CisjZGVmaW5lIEFEX0RNQUFEQ0NDCTB4NWMKKyNkZWZpbmUgQURfRE1BU1lOQkEJMHg2MAkvKiBTWU4gKi8KKyNkZWZpbmUgQURfRE1BU1lOQ0EJMHg2NAorI2RlZmluZSBBRF9ETUFTWU5CQwkweDY4CisjZGVmaW5lIEFEX0RNQVNZTkNDCTB4NmMKKyNkZWZpbmUgQURfRE1BV0FWQkEJMHg3MAkvKiBXQVYgKi8KKyNkZWZpbmUgQURfRE1BV0FWQ0EJMHg3NAorI2RlZmluZSBBRF9ETUFXQVZCQwkweDc4CisjZGVmaW5lIEFEX0RNQVdBVkNDCTB4N2MKKyNkZWZpbmUgQURfRE1BUkVTSUNDCTB4ODAJLyogUkVTIGludGVycnVwdCBjdXJyZW50IGNvdW50ICovCisjZGVmaW5lIEFEX0RNQVJFU0lCQwkweDg0CS8qIFJFUyBpbnRlcnJ1cHQgYmFzZSBjb3VudCAqLworI2RlZmluZSBBRF9ETUFBRENJQ0MJMHg4OAkvKiBBREMgaW50ZXJydXB0IGN1cnJlbnQgY291bnQgKi8KKyNkZWZpbmUgQURfRE1BQURDSUJDCTB4OGMJLyogQURDIGludGVycnVwdCBiYXNlIGNvdW50ICovCisjZGVmaW5lIEFEX0RNQVNZTklDQwkweDkwCS8qIFNZTiBpbnRlcnJ1cHQgY3VycmVudCBjb3VudCAqLworI2RlZmluZSBBRF9ETUFTWU5JQkMJMHg5NAkvKiBTWU4gaW50ZXJydXB0IGJhc2UgY291bnQgKi8KKyNkZWZpbmUgQURfRE1BV0FWSUNDCTB4OTgJLyogV0FWIGludGVycnVwdCBjdXJyZW50IGNvdW50ICovCisjZGVmaW5lIEFEX0RNQVdBVklCQwkweDljCS8qIFdBViBpbnRlcnJ1cHQgYmFzZSBjb3VudCAqLworI2RlZmluZSBBRF9ETUFSRVNDVFJMCTB4YTAJLyogUkVTIFBDSSBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBBRF9ETUFBRENDVFJMCTB4YTgJLyogQURDIFBDSSBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBBRF9ETUFTWU5DVFJMCTB4YjAJLyogU1lOIFBDSSBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBBRF9ETUFXQVZDVFJMCTB4YjgJLyogV0FWIFBDSSBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBBRF9ETUFESVNSCTB4YzAJLyogUENJIERNQSBpbnRyIHN0YXR1cyAqLworI2RlZmluZSBBRF9ETUFDSFNTCTB4YzQJLyogUENJIERNQSBjaGFubmVsIHN0b3Agc3RhdHVzICovCisKKyNkZWZpbmUgQURfR1BJT0lQQwkweGM4CS8qIElPIHBvcnQgY3RybCAqLworI2RlZmluZSBBRF9HUElPT1AJMHhjYQkvKiBJTyBvdXRwdXQgc3RhdHVzICovCisjZGVmaW5lIEFEX0dQSU9JUAkweGNjCS8qIElPIGlucHV0IHN0YXR1cyAqLworCisvKiBBQzk3IHJlZ2lzdGVycywgMHgxMDAgLSAweDE3Zjsgc2VlIGFjOTcuaCAqLworI2RlZmluZSBBRF9BQ0lDCQkweDE4MAkvKiBBQyBMaW5rIGludGVyZmFjZSBjdHJsICovCisKKy8qIE9QTDM7IEJBUjEgKi8KKyNkZWZpbmUgQURfT1BMTTBBUwkweDAwCS8qIE11c2ljMCBhZGRyZXNzL3N0YXR1cyAqLworI2RlZmluZSBBRF9PUExNMERBVEEJMHgwMQkvKiBNdXNpYzAgZGF0YSAqLworI2RlZmluZSBBRF9PUExNMUEJMHgwMgkvKiBNdXNpYzEgYWRkcmVzcyAqLworI2RlZmluZSBBRF9PUExNMURBVEEJMHgwMwkvKiBNdXNpYzEgZGF0YSAqLworLyogMHgwNC0weDBmIHJlc2VydmVkICovCisKKy8qIE1JREk7IEJBUjIgKi8KKyNkZWZpbmUgQURfTUlEQQkJMHgwMAkvKiBNSURJIGRhdGEgKi8KKyNkZWZpbmUgQURfTUlTQwkJMHgwMQkvKiBNSURJIHN0YXR1cy9jbWQgKi8KKy8qIDB4MDItMHhmZiByZXNlcnZlZCAqLworCisjZGVmaW5lIEFEX0RTSU9NRU1TSVpFCTUxMgorI2RlZmluZSBBRF9PUExNRU1TSVpFCTE2CisjZGVmaW5lIEFEX01JRElNRU1TSVpFCTE2CisKKyNkZWZpbmUgQURfV0FWX1NUQVRFCTAKKyNkZWZpbmUgQURfQURDX1NUQVRFCTEKKyNkZWZpbmUgQURfTUFYX1NUQVRFUwkyCisKKyNkZWZpbmUgRE1BX1NJWkUJKDEyOCoxMDI0KQorCisjZGVmaW5lIERNQV9GTEFHX01BUFBFRAkxCisKK3N0cnVjdCBhZDE4ODlfZGV2OworCit0eXBlZGVmIHN0cnVjdCBhZDE4ODlfc3RhdGUgeworCXN0cnVjdCBhZDE4ODlfZGV2ICpjYXJkOworCisJbW9kZV90IG9wZW5fbW9kZTsKKwlzdHJ1Y3QgZG1hYnVmIHsKKwkJdW5zaWduZWQgaW50IHJhdGU7CisJCXVuc2lnbmVkIGNoYXIgZm10LCBlbmFibGU7CisKKwkJLyogYnVmIG1hbmFnZW1lbnQgKi8KKwkJc2l6ZV90IHJhd2J1Zl9zaXplOworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsJLyogbWFwcGVkIGFkZHJlc3MgKi8KKwkJdW5zaWduZWQgbG9uZyBkbWFfbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgbWFwcGVkICovCisKKwkJLyogaW5kZXhlcyBpbnRvIHJhd2J1ZiBmb3Igc2V0dGluZyB1cCBETUEgZW5naW5lICovCisJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcmRfcHRyLCB3cl9wdHI7CisKKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsgLyogdG8gd2FpdCBmb3IgYnVmIHNlcnZpY2luZyAqLworCisJCS8qIE9TUyBiaXRzICovCisJCXVuc2lnbmVkIGludCBtYXBwZWQ6MTsKKwkJdW5zaWduZWQgaW50IHJlYWR5OjE7CisJCXVuc2lnbmVkIGludCBvc3NmcmFnc2hpZnQ7CisJCWludCBvc3NtYXhmcmFnczsKKwkJdW5zaWduZWQgaW50IHN1YmRpdmlzaW9uOworCX0gZG1hYnVmOworCisJc3RydWN0IHNlbWFwaG9yZSBzZW07Cit9IGFkMTg4OV9zdGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCBhZDE4ODlfZGV2IHsKKwl2b2lkIF9faW9tZW0gKnJlZ2Jhc2U7CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwkKKwlzcGlubG9ja190IGxvY2s7CisKKwlpbnQgZGV2X2F1ZGlvOworCisJLyogc3RhdGVzOyBvbmUgcGVyIGNoYW5uZWw7IHJpZ2h0IG5vdyBvbmx5IFdBViBhbmQgQURDICovCisJc3RydWN0IGFkMTg4OV9zdGF0ZSBzdGF0ZVtBRF9NQVhfU1RBVEVTXTsKKworCS8qIEFDOTcgY29kZWMgKi8KKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlYzsKKwl1MTYgYWM5N19mZWF0dXJlczsKKworCS8qIGRlYnVnZ2luZyBzdHVmZiAqLworCXN0cnVjdCBzdGF0cyB7CisJCXVuc2lnbmVkIGludCB3YXZfaW50cnMsIGFkY19pbnRyczsKKwkJdW5zaWduZWQgaW50IGJsb2NrcywgdW5kZXJydW4sIGVycm9yOworCX0gc3RhdHM7Cit9IGFkMTg4OV9kZXZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYWQxODg5X3JlZyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgb2Zmc2V0OworCWludCB3aWR0aDsKK30gYWQxODg5X3JlZ190OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZGxpYl9jYXJkLmMgYi9zb3VuZC9vc3MvYWRsaWJfY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MTRjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYWRsaWJfY2FyZC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBzb3VuZC9hZGxpYl9jYXJkLmMKKyAqCisgKiBEZXRlY3Rpb24gcm91dGluZSBmb3IgdGhlIEFkTGliIGNhcmQuCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAib3BsMy5oIgorCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX2FkbGliX2NhcmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWh3X2NvbmZpZy0+c2xvdHNbMF0gPSBvcGwzX2luaXQoaHdfY29uZmlnLT5pb19iYXNlLCBod19jb25maWctPm9zcCwgVEhJU19NT0RVTEUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV9hZGxpYihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJcmV0dXJuIG9wbDNfZGV0ZWN0KGh3X2NvbmZpZy0+aW9fYmFzZSwgaHdfY29uZmlnLT5vc3ApOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpbyA9IC0xOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYWRsaWIodm9pZCkKK3sKKwljZmcuaW9fYmFzZSA9IGlvOworCisJaWYgKGNmZy5pb19iYXNlID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWRsaWI6IG11c3Qgc3BlY2lmeSBJL08gYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHByb2JlX2FkbGliKCZjZmcpID09IDApCisJCXJldHVybiAtRU5PREVWOworCWF0dGFjaF9hZGxpYl9jYXJkKCZjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2FkbGliKHZvaWQpCit7CisJc291bmRfdW5sb2FkX3N5bnRoZGV2KGNmZy5zbG90c1swXSk7CisJCit9CisKK21vZHVsZV9pbml0KGluaXRfYWRsaWIpOworbW9kdWxlX2V4aXQoY2xlYW51cF9hZGxpYik7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hZGxpYihjaGFyICpzdHIpCit7CisgICAgICAgIC8qIGlvICovCisJaW50IGludHNbMl07CisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKwkKKwlpbyA9IGludHNbMV07CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImFkbGliPSIsIHNldHVwX2FkbGliKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FlZHNwMTYuYyBiL3NvdW5kL29zcy9hZWRzcDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NjI2MwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hZWRzcDE2LmMKQEAgLTAsMCArMSwxMzgxIEBACisvKgorICAgc291bmQvb3NzL2FlZHNwMTYuYworCisgICBBdWRpbyBFeGNlbCBEU1AgMTYgc29mdHdhcmUgY29uZmlndXJhdGlvbiByb3V0aW5lcworICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk4ICBSaWNjYXJkbyBGYWNjaGV0dGkgKGZpemJhbkB0aW4uaXQpCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqLworLyoKKyAqIEluY2x1ZGUgdGhlIG1haW4gT1NTIExpdGUgaGVhZGVyIGZpbGUuIEl0IGluY2x1ZGUgYWxsIHRoZSBvcywgT1NTIExpdGUsIGV0YworICogaGVhZGVycyBuZWVkZWQgYnkgdGhpcyBzb3VyY2UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworLyoKKyAqIFNhbml0eSBjaGVja3MKKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU09VTkRfQUVEU1AxNl9TQlBSTykgJiYgZGVmaW5lZChDT05GSUdfU09VTkRfQUVEU1AxNl9NU1MpCisjZXJyb3IgWW91IGhhdmUgdG8gZW5hYmxlIG9ubHkgb25lIG9mIHRoZSBNU1MgYW5kIFNCUFJPIGVtdWxhdGlvbnMuCisjZW5kaWYKKworLyoKKworICAgUkVBRCBUSElTCisKKyAgIFRoaXMgbW9kdWxlIHN0YXJ0ZWQgdG8gY29uZmlndXJlIHRoZSBBdWRpbyBFeGNlbCBEU1AgMTYgU291bmQgQ2FyZC4KKyAgIE5vdyB3b3JrcyB3aXRoIHRoZSBTQy02MDAwIChvbGQgYWVkc3AxNikgYW5kIG5ldyBTQy02NjAwIGJhc2VkIGNhcmRzLgorCisgICBOT1RFOiBJIGhhdmUgTk8gaWRlYSBhYm91dCBBdWRpbyBFeGNlbCBEU1AgMTYgSUlJLiBJZiBzb21lb25lIG93bnMgdGhpcworICAgYXVkaW8gY2FyZCBhbmQgd2FudCB0byBzZWUgdGhlIGtlcm5lbCBzdXBwb3J0IGZvciBpdCwgcGxlYXNlIGNvbnRhY3QgbWUuCisKKyAgIEF1ZGlvIEV4Y2VsIERTUCAxNiBpcyBhbiBTQiBwcm8gSUksIE1pY3Jvc29mdCBTb3VuZCBTeXN0ZW0gYW5kIE1QVS00MDEKKyAgIGNvbXBhdGlibGUgY2FyZC4KKyAgIEl0IGlzIHNvZnR3YXJlLW9ubHkgY29uZmlndXJhYmxlIChubyBqdW1wZXJzIHRvIGhhcmQtc2V0IGlycS9kbWEvbXB1LWlycSksCisgICBzbyBiZWZvcmUgdGhpcyBtb2R1bGUsIHRoZSBvbmx5IHdheSB0byBjb25maWd1cmUgdGhlIERTUCB1bmRlciBsaW51eCB3YXMKKyAgIGJvb3QgdGhlIE1TLURPUyBsb2FkaW5nIHRoZSBzb3VuZC5zeXMgZGV2aWNlIGRyaXZlciAodGhpcyBkcml2ZXIgc29mdC0KKyAgIGNvbmZpZ3VyZSB0aGUgc291bmQgYm9hcmQgaGFyZHdhcmUgYnkgbWFzc2FnaW5nIHNvbWVvbmUgb2YgaXRzIHJlZ2lzdGVycyksCisgICBhbmQgdGhlbiBjdHJsLWFsdC1kZWwgdG8gYm9vdCBsaW51eCB3aXRoIHRoZSBEU1AgY29uZmlndXJlZCBieSB0aGUgRE9TCisgICBkcml2ZXIuCisKKyAgIFRoaXMgbW9kdWxlIHdvcmtzIGNvbmZpZ3VyaW5nIHlvdXIgQXVkaW8gRXhjZWwgRFNQIDE2J3MgaXJxLCBkbWEgYW5kCisgICBtcHUtNDAxLWlycS4gVGhlIE9TUyBMaXRlIHJvdXRpbmVzIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBpZiB0aGUKKyAgIGhhcmR3YXJlIGlzIHRoZXJlLCB0aGV5IGNhbiBkZXRlY3QgaXQuIFRoZSBwcm9ibGVtIHdpdGggQUVEU1AxNiBpcworICAgdGhhdCBubyBoYXJkd2FyZSBjYW4gYmUgZm91bmQgYnkgdGhlIHByb2JlIHJvdXRpbmVzIGlmIHRoZSBzb3VuZCBjYXJkCisgICBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gU29tZXRpbWVzIHRoZSBrZXJuZWwgcHJvYmUgcm91dGluZXMgY2FuIGZpbmQKKyAgIGFuIFNCUFJPIGV2ZW4gd2hlbiB0aGUgY2FyZCBpcyBub3QgY29uZmlndXJlZCAodGhpcyBpcyB0aGUgc3RhbmRhcmQgc2V0dXAKKyAgIG9mIHRoZSBjYXJkKSwgYnV0IHRoZSBTQlBSTyBlbXVsYXRpb24gZG9uJ3Qgd29yayB3ZWxsIGlmIHRoZSBjYXJkIGlzIG5vdAorICAgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEZvciB0aGlzIHJlYXNvbgorCisgICBhZWRzcDE2X2luaXRfYm9hcmQoKQorCisgICByb3V0aW5lIGlzIGNhbGxlZCBiZWZvcmUgdGhlIE9TUyBMaXRlIHByb2JlIHJvdXRpbmVzIHRyeSB0byBkZXRlY3QgdGhlCisgICBoYXJkd2FyZS4KKworICAgTk9URSAoUkVBRCBUSEUgTk9URSBUT08sIElUIENPTlRBSU4gVVNFRlVMIElORk9STUFUSU9OUykKKworICAgTk9URTogTm93IGl0IHdvcmtzIHdpdGggU0MtNjAwMCBhbmQgU0MtNjYwMCBiYXNlZCBhdWRpbyBjYXJkcy4gVGhlIG5ldyBjYXJkcworICAgaGF2ZSBubyBqdW1wZXIgc3dpdGNoIGF0IGFsbC4gTm8gbW9yZSBXU1Mgb3IgTVBVLTQwMSBJL08gcG9ydCBzd2l0Y2hlcy4gVGhleQorICAgaGF2ZSB0byBiZSBjb25maWd1cmVkIGJ5IHNvZnR3YXJlLgorCisgICBOT1RFOiBUaGUgZHJpdmVyIGlzIG1lcmdlZCB3aXRoIHRoZSBuZXcgT1NTIExpdGUgc291bmQgZHJpdmVyLiBJdCB3b3JrcworICAgYXMgYSBsb3dsZXZlbCBkcml2ZXIuCisKKyAgIFRoZSBBdWRpbyBFeGNlbCBEU1AgMTYgU291bmQgQ2FyZCBlbXVsYXRlcyBib3RoIFNCUFJPIGFuZCBNU1M7CisgICB0aGUgT1NTIExpdGUgc291bmQgZHJpdmVyIGNhbiBiZSBjb25maWd1cmVkIGZvciBTQlBSTyBhbmQgTVNTIGNhcmRzCisgICBhdCB0aGUgc2FtZSB0aW1lLCBidXQgdGhlIGFlZHNwMTYgY2FuJ3QgYmUgdHdvIGNhcmRzISEKKyAgIFdoZW4gd2UgY29uZmlndXJlIGl0LCB3ZSBoYXZlIHRvIGNob29zZSB0aGUgU0JQUk8gb3IgdGhlIE1TUyBlbXVsYXRpb24KKyAgIGZvciBBRURTUDE2LiBXZSBhbHNvIGNhbiBpbnN0YWxsIGEgKlJFQUwqIGNhcmQgb2YgdGhlIG90aGVyIHR5cGUgKHNlZSBbMV0pLgorCisgICBOT1RFOiBJZiBzb21lb25lIGNhbiB0ZXN0IHRoZSBjb21iaW5hdGlvbiBBRURTUDE2K01TUyBvciBBRURTUDE2K1NCUFJPCisgICBwbGVhc2UgbGV0IG1lIGtub3cgaWYgaXQgd29ya3MuCisKKyAgIFRoZSBNUFUtNDAxIHN1cHBvcnQgY2FuIGJlIGNvbXBpbGVkIGluIHRvZ2V0aGVyIHdpdGggb25lIG9mIHRoZSBvdGhlcgorICAgdHdvIG9wZXJhdGluZyBtb2Rlcy4KKworICAgTk9URTogVGhpcyBpcyBzb21ldGhpbmcgbGlrZSBwbHVnLWFuZC1wbGF5OiB3ZSBoYXZlIG9ubHkgdG8gcGx1ZworICAgdGhlIEFFRFNQMTYgYm9hcmQgaW4gdGhlIHNvY2tldCwgYW5kIHRoZW4gY29uZmlndXJlIGFuZCBjb21waWxlCisgICBhIGtlcm5lbCB0aGF0IHVzZXMgdGhlIEFFRFNQMTYgc29mdHdhcmUgY29uZmlndXJhdGlvbiBjYXBhYmlsaXR5LgorICAgTm8ganVtcGVyIHNldHRpbmcgaXMgbmVlZGVkIQorCisgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgQUVEU1AxNiB0byBiZSBhbiBTQlBybywgb24gaXJxIDEwLCBkbWEgMworICAgeW91IGhhdmUganVzdCB0byBtYWtlIGNvbmZpZyB0aGUgT1NTIExpdGUgcGFja2FnZSwgY29uZmlndXJpbmcKKyAgIHRoZSBBRURTUDE2IHNvdW5kIGNhcmQsIHRoZW4gYWN0aXZhdGluZyB0aGUgU0JQcm8gZW11bGF0aW9uIG1vZGUKKyAgIGFuZCBhdCBsYXN0IGNvbmZpZ3VyaW5nIElSUSBhbmQgRE1BLgorICAgQ29tcGlsZSB0aGUga2VybmVsIGFuZCBydW4gaXQuCisKKyAgIE5PVEU6IFRoaXMgbWVhbnMgZm9yIFNDLTYwMDAgY2FyZHMgdGhhdCB5b3UgY2FuIGNob29zZSBpcnEgYW5kIGRtYSwKKyAgIGJ1dCBub3QgdGhlIEkvTyBhZGRyZXNzZXMuIFRvIGNoYW5nZSBJL08gYWRkcmVzc2VzIHlvdSBoYXZlIHRvIHNldAorICAgdGhlbSB3aXRoIGp1bXBlcnMuIEZvciBTQy02NjAwIGNhcmRzIHlvdSBoYXZlIG5vIGp1bXBlcnMgc28geW91IGhhdmUKKyAgIHRvIHNldCB1cCB5b3VyIGZ1bGwgY2FyZCBjb25maWd1cmF0aW9uIGluIHRoZSBtYWtlIGNvbmZpZy4KKworICAgWW91IGNhbiBjaGFuZ2UgdGhlIGlycS9kbWEvbWlycSBzZXR0aW5ncyBXSVRIT1VUIFRIRSBORUVEIHRvIG9wZW4KKyAgIHlvdXIgY29tcHV0ZXIgYW5kIG1hc3NhZ2UgdGhlIGp1bXBlcnMgKHRoZXJlIGFyZSBubyBpcnEvZG1hL21pcnEKKyAgIGp1bXBlcnMgdG8gYmUgY29uZmlndXJlZCBhbnl3YXksIG9ubHkgSS9PIEJBU0UgdmFsdWVzIGhhdmUgdG8gYmUKKyAgIGNvbmZpZ3VyZWQgd2l0aCBqdW1wZXJzKQorCisgICBGb3Igc29tZSB1bnVuZGVyc3RhbmRhYmxlIHJlYXNvbiwgdGhlIGNhcmQgZGVmYXVsdCBvZiBpcnEgNywgZG1hIDEsCisgICBkb24ndCB3b3JrIGZvciBtZS4gU2VlbXMgdG8gYmUgYW4gSVJRIG9yIERNQSBjb25mbGljdC4gVW5kZXIgaGVhdnkKKyAgIEhERCB3b3JrLCB0aGUga2VybmVsIHN0YXJ0IHRvIGVydXB0IG91dCBhIGxvdCBvZiBtZXNzYWdlcyBsaWtlOgorCisgICAnU291bmQ6IERNQSB0aW1lZCBvdXQgLSBJUlEvRFJRIGNvbmZpZyBlcnJvcj8nCisKKyAgIEZvciB3aGF0IEkgY2FuIHNheSwgSSBoYXZlIE5PVCBhbnkgY29uZmxpY3QgYXQgaXJxIDcgKHVuZGVyIGxpbnV4IEknbQorICAgdXNpbmcgdGhlIGxwIHBvbGxpbmcgZHJpdmVyKSwgYW5kIGRtYSBsaW5lIDEgaXMgdW51c2VkIGFzIHN0YXRlZCBieQorICAgL3Byb2MvZG1hLiBJIGNhbiBzdXBwb3NlIHRoaXMgaXMgYSBidWcgb2YgQUVEU1AxNi4gSSBrbm93IG15IGhhcmR3YXJlIHNvCisgICBJJ20gcHJldHR5IHN1cmUgSSBoYXZlIG5vdCBhbnkgY29uZmxpY3QsIGJ1dCBtYXkgYmUgSSdtIHdyb25nLiBXaG8ga25vd3MhCisgICBBbnl3YXkgYSBzZXR0aW5nIG9mIGlycSAxMCwgZG1hIDMgd29ya3MgcmVhbGx5IGZpbmUuCisKKyAgIE5PVEU6IGlmIHNvbWVvbmUgY2FuIHVzZSBBRURTUDE2IHdpdGggaXJxIDcsIGRtYSAxLCBwbGVhc2UgbGV0IG1lIGtub3cKKyAgIHRoZSBlbXVsYXRpb24gbW9kZSwgYWxsIHRoZSBpbnN0YWxsZWQgaGFyZHdhcmUgYW5kIHRoZSBoYXJkd2FyZQorICAgY29uZmlndXJhdGlvbiAoaXJxIGFuZCBkbWEgc2V0dGluZ3Mgb2YgYWxsIHRoZSBoYXJkd2FyZSkuCisKKyAgIFRoaXMgaW5pdCBtb2R1bGUgc2hvdWxkIHdvcmsgd2l0aCBTQlBSTytNU1MsIHdoZW4gb25lIG9mIHRoZSB0d28gaXMKKyAgIHRoZSBBRURTUDE2IGVtdWxhdGlvbiBhbmQgdGhlIG90aGVyIHRoZSByZWFsIGNhcmQuIChzZWUgWzFdKQorICAgRm9yIGV4YW1wbGU6CisKKyAgIEFFRFNQMTYgKDB4MjIwKSBpbiBTQlBSTyBlbXUgKDB4MjIwKSArIHJlYWwgTVNTICsgb3RoZXIKKyAgIEFFRFNQMTYgKDB4MjIwKSBpbiBNU1MgZW11ICsgcmVhbCBTQlBSTyAoMHgyNDApICsgb3RoZXIKKworICAgTVBVNDAxIHNob3VsZCB3b3JrLiAoc2VlIFsyXSkKKworICAgWzFdCisgICAgICAgLS0tCisgICAgICAgRGF0ZTogTW9uLCAyOSBKdWwgMTk5NyAwODozNTo0MCArMDEwMAorICAgICAgIEZyb206IE1yIFMgSiBHcmVlbmF3YXkgPHNqZzk1QHVuaXhmZS5ybC5hYy51az4KKworICAgICAgIFsuLi5dCisgICAgICAgSnVzdCB0byBsZXQgeW91IGtub3cgZ290IG15IEF1ZGlvIEV4Y2VsIChlbXVsYXRpbmcgYSBNU1MpIHdvcmtpbmcKKyAgICAgICB3aXRoIG15IG9yaWdpbmFsIFNCMTYsIHRoYW5rcyBmb3IgdGhlIGRyaXZlciEKKyAgICAgICBbLi4uXQorICAgICAgIC0tLQorCisgICBbMl0gTm90IHRlc3RlZCBieSBtZSBmb3IgbGFjayBvZiBoYXJkd2FyZS4KKworICAgVE9ETywgV0lTSEVTIEFORCBURUNICisKKyAgIC0gQWJvdXQgSS9PIHBvcnRzIGFsbG9jYXRpb24gLQorCisgICBSZXF1ZXN0IHRoZSAyeDBoIHJlZ2lvbiAocG9ydCBiYXNlKSBpbiBhbnkgY2FzZSBpZiB3ZSBhcmUgdXNpbmcgdGhpcyBjYXJkLgorCisgICBOT1RFOiB0aGUgImFlZHNwMTYgKGJhc2UpIiBzdHJpbmcgd2l0aCB3aGljaCB3ZSBhcmUgcmVxdWVzdGluZyB0aGUgYWVkc3AxNgorICAgcG9ydCBiYXNlIHJlZ2lvbiAoc2VlIGNvZGUpIGRvZXMgbm90IG1lYW4gbmVjZXNzYXJpbHkgdGhhdCB3ZSBhcmUgZW11bGF0aW5nCisgICBzYnByby4gIEV2ZW4gaWYgdGhpcyByZWdpb24gaXMgdGhlIHNicHJvIEkvTyBwb3J0cyByZWdpb24sIHdlIHVzZSB0aGlzCisgICByZWdpb24gdG8gYWNjZXNzIHRoZSBjb250cm9sIHJlZ2lzdGVycyBvZiB0aGUgY2FyZCwgYW5kIGlmIGVtdWxhdGluZworICAgc2Jwcm8sIEkvTyBzYnBybyByZWdpc3RlcnMgdG9vLiBJZiB3ZSBhcmUgZW11bGF0aW5nIE1TUywgdGhlIHNicHJvCisgICByZWdpc3RlcnMgYXJlIG5vdCB1c2VkLCBpbiBubyB3YXksIHRvIGVtdWxhdGUgYW4gc2Jwcm86IHRoZXkgYXJlCisgICB1c2VkIG9ubHkgZm9yIGNvbmZpZ3VyYXRpb24gcHVycG9zZXMuCisKKyAgIFN0YXJ0ZWQgRnJpIE1hciAxNyAxNjoxMzoxOCBNRVQgMTk5NQorCisgICB2MC4xIChBTFBIQSwgd2FzIGFuIHVzZXItbGV2ZWwgcHJvZ3JhbSBjYWxsZWQgQXVkaW9FeGNlbERTUDE2LmMpCisgICAtIEluaXRpYWwgY29kZS4KKyAgIHYwLjIgKEFMUEhBKQorICAgLSBDbGVhbnVwcy4KKyAgIC0gSW50ZWdyYXRlZCB3aXRoIExpbnV4IHZveHdhcmUgdiAyLjkwLTIga2VybmVsIHNvdW5kIGRyaXZlci4KKyAgIC0gU291bmRCbGFzdGVyIFBybyBtb2RlIGNvbmZpZ3VyYXRpb24uCisgICAtIE1pY3Jvc29mdCBTb3VuZCBTeXN0ZW0gbW9kZSBjb25maWd1cmF0aW9uLgorICAgLSBNUFUtNDAxIG1vZGUgY29uZmlndXJhdGlvbi4KKyAgIHYwLjMgKEFMUEhBKQorICAgLSBDbGVhbnVwcy4KKyAgIC0gUmVhcnJhbmdlZCB0aGUgY29kZSB0byBsZXQgYWVkc3AxNl9pbml0X2JvYXJkIGJlIG1vcmUgZ2VuZXJhbC4KKyAgIC0gRXJhc2VkIHRoZSBSRUFMTFlfU0xPV19JTy4gV2UgZG9uJ3QgbmVlZCBpdC4gRXJhc2VkIHRoZSBsaW51eC9pby5oCisgICBpbmNsdXNpb24gdG9vLiBXZSByZWx5IG9uIG9zLmgKKyAgIC0gVXNlZCB0aGUgIHRvIGdldCBhIHZhcmlhYmxlCisgICBsZW4gc3RyaW5nICh3ZSBhcmUgbm90IHN1cmUgYWJvdXQgdGhlIGxlbiBvZiBDb3B5cmlnaHQgc3RyaW5nKS4KKyAgIFRoaXMgd29ya3Mgd2l0aCBhbnkgU0IgYW5kIGNvbXBhdGlibGUuCisgICAtIEFkZGVkIHRoZSBjb2RlIHRvIHJlcXVlc3RfcmVnaW9uIGF0IGRldmljZSBpbml0IChzaG91bGQgZ28gaW4KKyAgIHRoZSBtYWluIGJvZHkgb2Ygdm94d2FyZSkuCisgICB2MC40IChCRVRBKQorICAgLSBCZXR0ZXIgY29uZmlndXJlLmMgcGF0Y2ggZm9yIGFlZHNwMTYgY29uZmlndXJhdGlvbiAoYmV0dGVyCisgICBsb2dpYyBvZiBpbmNsdXNpb24gb2YgQUVEU1AxNiBzdXBwb3J0KQorICAgLSBNb2RpZmllZCB0aGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gYmV0dGVyIHN1cHBvcnQgbW9yZSB0aGFuCisgICBvbmUgc291bmQgY2FyZCBvZiB0aGUgZW11bGF0ZWQgdHlwZSAocmVhZCB0aGUgTk9URVMgYWJvdmUpCisgICAtIE1vdmVkIHRoZSBzYiBpbml0IHJvdXRpbmUgZnJvbSB0aGUgYXR0YWNoIHRvIHRoZSB2ZXJ5IGZpcnN0CisgICBwcm9iZSBpbiBzYl9jYXJkLmMKKyAgIC0gUmVhcnJhbmdlbWVudHMgYW5kIGNsZWFudXBzCisgICAtIFdpcGVkIG91dCBzb21lIHVubmVjZXNzYXJ5IGNvZGUgYW5kIHZhcmlhYmxlczogdGhpcyBpcyBrZXJuZWwKKyAgIGNvZGUgc28gaXQgaXMgYmV0dGVyIHNhdmUgc29tZSBURVhUIGFuZCBEQVRBCisgICAtIEZpeGVkIHRoZSByZXF1ZXN0X3JlZ2lvbiBjb2RlLiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBhZWRzcDE2IChzYnBybykKKyAgIEkvTyBwb3J0cyBpbiBhbnkgY2FzZSBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgdG8gYWNjZXNzIHRoZSBEU1AKKyAgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGFuZCB3ZSBjYW4gbm90IGFsbG93IGFueW9uZSB0byBnZXQgdGhlbS4KKyAgIHYwLjUKKyAgIC0gY2xlYW51cHMgb24gY29tbWVudHMKKyAgIC0gcHJlcCBmb3IgZGlmZnMgYWdhaW5zdCB2My4wLXByb3RvLTk1MDQwMgorICAgdjAuNgorICAgLSByZW1vdmVkIHRoZSByZXF1ZXN0X3JlZ2lvbigpcyB3aGVuIGNvbXBpbGluZyB0aGUgTU9EVUxFIHNvdW5kLm8KKyAgIGJlY2F1c2Ugd2UgYXJlIG5vdCBhbGxvd2VkIChieSB0aGUgYWN0dWFsIHZveHdhcmUgc3RydWN0dXJlKSB0bworICAgcmVsZWFzZV9yZWdpb24oKQorICAgdjAuNyAocHJlIEFMUEhBLCBub3QgZGlzdHJpYnV0ZWQpCisgICAtIHN0YXJ0ZWQgcG9ydGluZyB0aGlzIG1vZHVsZSB0byBrZXJuZWwgMS4zLjg0LiBEdW1teSBwcm9iZS9hdHRhY2gKKyAgIHJvdXRpbmVzLgorICAgdjAuOCAoQUxQSEEpCisgICAtIGF0dGFjaGVkIGFsbCB0aGUgaW5pdCByb3V0aW5lcy4KKyAgIHYwLjkgKEJFVEEpCisgICAtIEludGVncmF0ZWQgd2l0aCBsaW51eC1wcmUyLjAuNworICAgLSBJbnRlZ3JhdGVkIHdpdGggY29uZmlndXJhdGlvbiBzY3JpcHRzLgorICAgLSBDbGVhbmVkIHVwIGFuZCBiZWF1dHlmaWVkIHRoZSBjb2RlLgorICAgdjAuOS45IChCRVRBKQorICAgLSBUaGFua3MgdG8gUGllcmNhcmxvIEdyYW5kaTogY29ycmVjdGVkIHRoZSBjb25kaXRvbmFsIGNvbXBpbGF0aW9uIGNvZGUuCisgICAgIE5vdyBvbmx5IHRoZSBjb2RlIGNvbmZpZ3VyZWQgaXMgY29tcGlsZWQgaW4sIHdpdGggc29tZSBtZW1vcnkgc2F2aW5nLgorICAgdjAuOS4xMAorICAgLSBJbnRlZ3JhdGlvbiBpbnRvIHRoZSBzb3VuZC9sb3dsZXZlbC8gc2VjdGlvbiBvZiB0aGUgc291bmQgZHJpdmVyLgorICAgLSBSZS1vcmdhbml6ZWQgdGhlIGNvZGUuCisgICB2MC45LjExIChub3QgZGlzdHJpYnV0ZWQpCisgICAtIFJld3JpdHRlbiB0aGUgaW5pdCBpbnRlcmZhY2Utcm91dGluZXMgdG8gaW5pdGlhbGl6ZSB0aGUgQUVEU1AxNiBpbgorICAgICBvbmUgc2hvdC4KKyAgIC0gTW9yZSBjb3NtZXRpY3MuCisgICAtIFNDLTY2MDAgc3VwcG9ydC4KKyAgIC0gTW9yZSBzb2Z0L2hhcmQgY29uZmlndXJhdGlvbi4KKyAgIHYwLjkuMTIKKyAgIC0gUmVmaW5lZCB0aGUgdjAuOS4xMSBjb2RlIHdpdGggY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gZGlzdGluZ3Vpc2gKKyAgICAgYmV0d2VlbiBTQy02MDAwIGFuZCBTQy02NjAwIGNvZGUuCisgICB2MS4wLjAKKyAgIC0gUHJlcCBmb3IgbWVyZ2luZyB3aXRoIE9TUyBMaXRlIGFuZCBMaW51eCBrZXJuZWwgMi4xLjEzCisgICAtIENvcnJlY3RlZCBhIGJ1ZyBpbiByZXF1ZXN0L2NoZWNrL3JlbGVhc2UgcmVnaW9uIGNhbGxzICh0aGFua3MgdG8gdGhlCisgICAgIG5ldyBrZXJuZWwgZXhjZXB0aW9uIGhhbmRsaW5nKS4KKyAgIHYxLjEKKyAgIC0gUmV2YW1wZWQgZm9yIGludGVncmF0aW9uIHdpdGggbmV3IG1vZHVsYXJpemVkIHNvdW5kIGRyaXZlcnM6IHRvIGVuaGFuY2UKKyAgICAgdGhlIGZsZXhpYmlsaXR5IG9mIG1vZHVsYXIgdmVyc2lvbiwgSSBoYXZlIHJlbW92ZWQgYWxsIHRoZSBjb25kaXRpb25hbAorICAgICBjb21waWxhdGlvbiBmb3IgU0JQUk8sIE1QVSBhbmQgTVNTIGNvZGUuIE5vdyBpdCBpcyBhbGwgbWFuYWdlZCB3aXRoCisgICAgIHRoZSBhZV9jb25maWcgc3RydWN0dXJlLgorICAgdjEuMgorICAgLSBNb2R1bGUgaW5mb3JtYXRpb25zIGFkZGVkLgorICAgLSBSZW1vdmVkIGFlZHNwMTZfZGVsYXlfMTBtc2VjKCksIG5vdyB1c2luZyBtZGVsYXkoMTApCisgICAtIEFsbCBkYXRhIGFuZCBmdW5jcyBtb3ZlZCB0byAuKi5pbml0IHNlY3Rpb24uCisgICB2MS4zCisgICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAyMDAwLzA5LzI3CisgICAtIGdvdCByaWQgb2YgY2hlY2tfcmVnaW9uCisKKyAgIEtub3duIFByb2JsZW1zOgorICAgLSBBdWRpbyBFeGNlbCBEU1AgMTYgSUlJIGRvbid0IHdvcmsgd2l0aCB0aGlzIGRyaXZlci4KKworICAgQ3JlZGl0czoKKyAgIE1hbnkgdGhhbmtzIHRvIEdlcmFsZCBCcml0dG9uIDxnYnJpdHRvbkBDYXBBY2Nlc3Mub3JnPi4gSGUgaGVscGVkIG1lIGEKKyAgIGxvdCBpbiB0ZXN0aW5nIHRoZSAwLjkuMTEgYW5kIDAuOS4xMiB2ZXJzaW9ucyBvZiB0aGlzIGRyaXZlci4KKworICovCisKKworI2RlZmluZSBWRVJTSU9OICIxLjMiCQkvKiBWZXJzaW9uIG9mIEF1ZGlvIEV4Y2VsIERTUCAxNiBkcml2ZXIgKi8KKworI3VuZGVmCUFFRFNQMTZfREVCVUcgCQkvKiBEZWZpbmUgdGhpcyB0byAxIHRvIGVuYWJsZSBkZWJ1ZyBjb2RlICAgICAqLworI3VuZGVmCUFFRFNQMTZfREVCVUdfTU9SRSAJLyogRGVmaW5lIHRoaXMgdG8gMSB0byBlbmFibGUgbW9yZSBkZWJ1ZyAgICAgKi8KKyN1bmRlZglBRURTUDE2X0lORk8gCQkvKiBEZWZpbmUgdGhpcyB0byAxIHRvIGVuYWJsZSBpbmZvIGNvZGUgICAgICAqLworCisjaWYgZGVmaW5lZChBRURTUDE2X0RFQlVHKQorIyBkZWZpbmUgREJHKHgpICBwcmludGsgeAorIyBpZiBkZWZpbmVkKEFFRFNQMTZfREVCVUdfTU9SRSkKKyMgIGRlZmluZSBEQkcxKHgpIHByaW50ayB4CisjIGVsc2UKKyMgIGRlZmluZSBEQkcxKHgpCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgREJHKHgpCisjIGRlZmluZSBEQkcxKHgpCisjZW5kaWYKKworLyoKKyAqIE1pc2MgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBUUlVFCTEKKyNkZWZpbmUgRkFMU0UJMAorCisvKgorICogUmVnaW9uIFNpemUgZm9yIHJlcXVlc3QvY2hlY2svcmVsZWFzZSByZWdpb24uCisgKi8KKyNkZWZpbmUgSU9CQVNFX1JFR0lPTl9TSVpFCTB4MTAKKworLyoKKyAqIEhhcmR3YXJlIHJlbGF0ZWQgZGVmYXVsdHMKKyAqLworI2RlZmluZSBERUZfQUVEU1AxNl9JT0IgMHgyMjAgICAvKiAweDIyMChkZWZhdWx0KSAweDI0MCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgREVGX0FFRFNQMTZfSVJRIDcJLyogNSA3KGRlZmF1bHQpIDkgMTAgMTEgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERFRl9BRURTUDE2X01SUSAwCS8qIDUgNyA5IDEwIDAoZGVmYXVsdCksIDAgbWVhbnMgZGlzYWJsZSAqLworI2RlZmluZSBERUZfQUVEU1AxNl9ETUEgMQkvKiAwIDEoZGVmYXVsdCkgMyAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyAqIENvbW1hbmRzIG9mIEFFRFNQMTYncyBEU1AgKFNCUFJPK3NwZWNpYWwpLgorICogU29tZSBvZiB0aGVtIGFyZSBDT01NQU5EX3h4LCBpbiB0aGUgZnV0dXJlIHRoZXkgbWF5IGNoYW5nZS4KKyAqLworI2RlZmluZSBXUklURV9NRElSUV9DRkcgICAweDUwCS8qIFNldCBNJkkmRFJRIG1hc2sgKHRoZSByZWFsIGNvbmZpZykgICAqLworI2RlZmluZSBDT01NQU5EXzUyICAgICAgICAweDUyCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSRUFEX0hBUkRfQ0ZHICAgICAweDU4CS8qIFJlYWQgSGFyZHdhcmUgQ29uZmlnIChJL08gYmFzZSBldGMpICAqLworI2RlZmluZSBDT01NQU5EXzVDICAgICAgICAweDVjCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EXzYwICAgICAgICAweDYwCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EXzY2ICAgICAgICAweDY2CS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EXzZDICAgICAgICAweDZjCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EXzZFICAgICAgICAweDZlCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EXzg4ICAgICAgICAweDg4CS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEU1BfSU5JVF9NU1MgICAgICAweDhjCS8qIEVuYWJsZSBNaWNyb3NvZnQgU291bmQgU3lzdGVtIG1vZGUgICAqLworI2RlZmluZSBDT01NQU5EX0M1ICAgICAgICAweGM1CS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHRVRfRFNQX1ZFUlNJT04gICAweGUxCS8qIEdldCBEU1AgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHRVRfRFNQX0NPUFlSSUdIVCAweGUzCS8qIEdldCBEU1AgQ29weXJpZ2h0ICAgICAgICAgICAgICAgICAgICAqLworCisvKgorICogT2Zmc2V0cyBvZiBBRURTUDE2IERTUCBJL08gcG9ydHMuIFRoZSBvZmZzZXQgaXMgYWRkZWQgdG8gYmFzZSBJL08gcG9ydAorICogdG8gaGF2ZSB0aGUgYWN0dWFsIEkvTyBwb3J0LgorICogUmVnaXN0ZXIgcGVybWlzc2lvbnMgYXJlOgorICogKHdvKSA9PSBXcml0ZSBPbmx5CisgKiAocm8pID09IFJlYWQgIE9ubHkKKyAqICh3LSkgPT0gV3JpdGUKKyAqIChyLSkgPT0gUmVhZAorICovCisjZGVmaW5lIERTUF9SRVNFVCAgICAweDA2CS8qIG9mZnNldCBvZiBEU1AgUkVTRVQgICAgICAgICAgICAgKHdvKSAqLworI2RlZmluZSBEU1BfUkVBRCAgICAgMHgwYQkvKiBvZmZzZXQgb2YgRFNQIFJFQUQgICAgICAgICAgICAgIChybykgKi8KKyNkZWZpbmUgRFNQX1dSSVRFICAgIDB4MGMJLyogb2Zmc2V0IG9mIERTUCBXUklURSAgICAgICAgICAgICAody0pICovCisjZGVmaW5lIERTUF9DT01NQU5EICAweDBjCS8qIG9mZnNldCBvZiBEU1AgQ09NTUFORCAgICAgICAgICAgKHctKSAqLworI2RlZmluZSBEU1BfU1RBVFVTICAgMHgwYwkvKiBvZmZzZXQgb2YgRFNQIFNUQVRVUyAgICAgICAgICAgIChyLSkgKi8KKyNkZWZpbmUgRFNQX0RBVEFWQUlMIDB4MGUJLyogb2Zmc2V0IG9mIERTUCBEQVRBIEFWQUlMQUJMRSAgICAocm8pICovCisKKworI2RlZmluZSBSRVRSWSAgICAgICAgICAgMTAJLyogVmFyaW91cyByZXRyeSB2YWx1ZXMgb24gSS9PIG9wZXJhLSAgICovCisjZGVmaW5lIFNUQVRVU1JFVFJZICAgMTAwMAkvKiB0aW9ucy4gU29tZXRpbWVzIHdlIGhhdmUgdG8gICAgICAgICAgKi8KKyNkZWZpbmUgSEFSRFJFVFJZICAgNTAwMDAwCS8qIHdhaXQgZm9yIHByZXZpb3VzIGNtZCB0byBjb21wbGV0ZSAgICAqLworCisvKgorICogU2l6ZSBvZiBjaGFyYWN0ZXIgYXJyYXlzIHRoYXQgc3RvcmUgbmFtZSBhbmQgdmVyc2lvbiBvZiBzb3VuZCBjYXJkCisgKi8KKyNkZWZpbmUgQ0FSRE5BTUVMRU4gMTUJCS8qIFNpemUgb2YgdGhlIGNhcmQncyBuYW1lIGluIGNoYXJzICAgICAqLworI2RlZmluZSBDQVJEVkVSTEVOICAyCQkvKiBTaXplIG9mIHRoZSBjYXJkJ3MgdmVyc2lvbiBpbiBjaGFycyAgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMCkKKy8qCisgKiBCaXRtYXBwZWQgZmxhZ3Mgb2YgaGFyZCBjb25maWd1cmF0aW9uCisgKi8KKy8qCisgKiBEZWNvZGUgbWFjcm9zICh4bCA9PSBsb3cgYnl0ZSwgeGggPSBoaWdoIGJ5dGUpCisgKi8KKyNkZWZpbmUgSU9CQVNFKHhsKQkJKCh4bCAmIDB4MDEpPzB4MjQwOjB4MjIwKQorI2RlZmluZSBKT1koeGwpICAJCSh4bCAmIDB4MDIpCisjZGVmaW5lIE1QVUFERFIoeGwpCQkoIAkJCVwKKwkJCQkoeGwgJiAweDBDKT8weDMzMDoJXAorCQkJCSh4bCAmIDB4MDgpPzB4MzIwOglcCisJCQkJKHhsICYgMHgwNCk/MHgzMTA6CVwKKwkJCQkJCTB4MzAwKQorI2RlZmluZSBXU1NBRERSKHhsKQkJKCh4bCAmIDB4MTApPzB4RTgwOjB4NTMwKQorI2RlZmluZSBDRFJPTSh4aCkJCSh4aCAmIDB4MjApCisjZGVmaW5lIENEUk9NQUREUih4aCkJCSgoKHhoICYgMHgxRikgPDwgNCkgKyAweDIwMCkKKy8qCisgKiBFbmNvZGUgbWFjcm9zCisgKi8KKyNkZWZpbmUgQkxESU9CQVNFKHhsLCB2YWwpIHsJCVwKKwl4bCAmPSB+MHgwMTsgCQkJXAorCWlmICh2YWwgPT0gMHgyNDApCQlcCisJCXhsIHw9IDB4MDE7CQlcCisJfQorI2RlZmluZSBCTERKT1koeGwsIHZhbCkgewkJXAorCXhsICY9IH4weDAyOyAJCQlcCisJaWYgKHZhbCA9PSAxKQkJCVwKKwkJeGwgfD0gMHgwMjsJCVwKKwl9CisjZGVmaW5lIEJMRE1QVUFERFIoeGwsIHZhbCkgewkJXAorCXhsICY9IH4weDBDOwkJCVwKKwlzd2l0Y2ggKHZhbCkgewkJCVwKKwkJY2FzZSAweDMzMDoJCVwKKwkJCXhsIHw9IDB4MEM7CVwKKwkJCWJyZWFrOwkJXAorCQljYXNlIDB4MzIwOgkJXAorCQkJeGwgfD0gMHgwODsJXAorCQkJYnJlYWs7CQlcCisJCWNhc2UgMHgzMTA6CQlcCisJCQl4bCB8PSAweDA0OwlcCisJCQlicmVhazsJCVwKKwkJY2FzZSAweDMwMDoJCVwKKwkJCXhsIHw9IDB4MDA7CVwKKwkJCWJyZWFrOwkJXAorCQlkZWZhdWx0OgkJXAorCQkJeGwgfD0gMHgwMDsJXAorCQkJYnJlYWs7CQlcCisJCX0JCQlcCisJfQorI2RlZmluZSBCTERXU1NBRERSKHhsLCB2YWwpIHsJCVwKKwl4bCAmPSB+MHgxMDsgCQkJXAorCWlmICh2YWwgPT0gMHhFODApCQlcCisJCXhsIHw9IDB4MTA7CQlcCisJfQorI2RlZmluZSBCTERDRFJPTSh4aCwgdmFsKSB7CQlcCisJeGggJj0gfjB4MjA7IAkJCVwKKwlpZiAodmFsID09IDEpCQkJXAorCQl4aCB8PSAweDIwOwkJXAorCX0KKyNkZWZpbmUgQkxEQ0RST01BRERSKHhoLCB2YWwpIHsJCVwKKwlpbnQgdG1wID0gdmFsOwkJCVwKKwl0bXAgLT0gMHgyMDA7CQkJXAorCXRtcCA+Pj0gNDsJCQlcCisJdG1wICY9IDB4MUY7CQkJXAorCXhoIHw9IHRtcDsJCQlcCisJeGggJj0gMHg3RjsJCQlcCisJeGggfD0gMHg0MDsJCQlcCisJfQorI2VuZGlmIC8qIENPTkZJR19TQzY2MDAgKi8KKworLyoKKyAqIEJpdCBtYXBwZWQgZmxhZ3MgZm9yIGNhbGxpbmcgYWVkc3AxNl9pbml0X2JvYXJkKCksIGFuZCBzYXZpbmcgdGhlIGN1cnJlbnQKKyAqIGVtdWxhdGlvbiBtb2RlLgorICovCisjZGVmaW5lIElOSVRfTk9ORSAgICgwICAgKQorI2RlZmluZSBJTklUX1NCUFJPICAoMTw8MCkKKyNkZWZpbmUgSU5JVF9NU1MgICAgKDE8PDEpCisjZGVmaW5lIElOSVRfTVBVNDAxICgxPDwyKQorCitzdGF0aWMgaW50ICAgICAgc29mdF9jZmcgX19pbml0ZGF0YSA9IDA7CS8qIGJpdG1hcHBlZCBjb25maWcgKi8KK3N0YXRpYyBpbnQgICAgICBzb2Z0X2NmZ19tc3MgX19pbml0ZGF0YSA9IDA7CS8qIGJpdG1hcHBlZCBtc3MgY29uZmlnICovCitzdGF0aWMgaW50ICAgICAgdmVyW0NBUkRWRVJMRU5dIF9faW5pdGRhdGEgPSB7MCwgMH07CS8qIERTUCBWZXI6CisJCQkJCQkgICBoaS0+dmVyWzBdIGxvLT52ZXJbMV0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMCkKK3N0YXRpYyBpbnQJaGFyZF9jZmdbMl0gICAgIC8qIGxvPC1oYXJkX2NmZ1swXSBoaTwtaGFyZF9jZmdbMV0gICAgICAqLworICAgICAgICAgICAgICAgICAgICAgX19pbml0ZGF0YSA9IHsgMCwgMH07CisjZW5kaWYgLyogQ09ORklHX1NDNjYwMCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0M2NjAwKQorLyogRGVjb2RlZCBoYXJkIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdAlkX2hjZmcgeworCWludCBpb2Jhc2U7CisJaW50IGpveXN0aWNrOworCWludCBtcHViYXNlOworCWludCB3c3NiYXNlOworCWludCBjZHJvbTsKKwlpbnQgY2Ryb21iYXNlOworfTsKKworc3RhdGljIHN0cnVjdCBkX2hjZmcgZGVjb2RlZF9oY2ZnIF9faW5pdGRhdGEgPSB7MCwgfTsKKworI2VuZGlmIC8qIENPTkZJR19TQzY2MDAgKi8KKworLyogb3JWYWxzIGNvbnRhaW4gdGhlIHZhbHVlcyB0byBiZSBvcidlZCAgICAgICAJCQkJKi8KK3N0cnVjdCBvclZhbHMgeworCWludAl2YWw7CQkvKiBpcnF8bWlycXxkbWEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbnQJb3I7CQkvKiBzb2Z0X2NmZyB8PSBUaGVTdHJ1Y3Qub3IgICAgICAgICAgICAgKi8KK307CisKKy8qIGFlZHNwMTZfaW5mbyBjb250YWluIHRoZSBhdWRpbyBjYXJkIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAqLworc3RydWN0IGFlZHNwMTZfaW5mbyB7CisJaW50IGJhc2VfaW87ICAgICAgICAgICAgLyogYmFzZSBJL08gYWRkcmVzcyBmb3IgYWNjZXNzaW5nIGNhcmQgICovCisJaW50IGlycTsgICAgICAgICAgICAgICAgLyogaXJxIHZhbHVlIGZvciBEU1AgSS9PICAgICAgICAgICAgICAgICovCisJaW50IG1wdV9pcnE7ICAgICAgICAgICAgLyogaXJxIGZvciBtcHU0MDEgaW50ZXJmYWNlIEkvTyAgICAgICAgICovCisJaW50IGRtYTsgICAgICAgICAgICAgICAgLyogZG1hIHZhbHVlIGZvciBEU1AgSS9PICAgICAgICAgICAgICAgICovCisJaW50IG1zc19iYXNlOyAgICAgICAgICAgLyogYmFzZSBJL08gZm9yIE1pY3Jvc29mdCBTb3VuZCBTeXN0ZW0gICovCisJaW50IG1wdV9iYXNlOyAgICAgICAgICAgLyogYmFzZSBJL08gZm9yIE1QVS00MDEgZW11bGF0aW9uICAgICAgICovCisJaW50IGluaXQ7ICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gc3RhdHVzIG9mIHRoZSBjYXJkICAgICovCit9OworCisvKgorICogTWFnaWMgdmFsdWVzIHRoYXQgdGhlIERTUCB3aWxsIGVhdCB3aGVuIGNvbmZpZ3VyaW5nIGlycS9taXJxL2RtYQorICovCisvKiBEU1AgSVJRIGNvbnZlcnNpb24gYXJyYXkgICAgICAgICAgICAgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3JWYWxzIG9ySVJRW10gX19pbml0ZGF0YSA9IHsKKwl7MHgwNSwgMHgyOH0sCisJezB4MDcsIDB4MDh9LAorCXsweDA5LCAweDEwfSwKKwl7MHgwYSwgMHgxOH0sCisJezB4MGIsIDB4MjB9LAorCXsweDAwLCAweDAwfQorfTsKKworLyogTVBVLTQwMSBJUlEgY29udmVyc2lvbiBhcnJheSAgICAgICAgICovCitzdGF0aWMgc3RydWN0IG9yVmFscyBvck1JUlFbXSBfX2luaXRkYXRhID0geworCXsweDA1LCAweDA0fSwKKwl7MHgwNywgMHg0NH0sCisJezB4MDksIDB4ODR9LAorCXsweDBhLCAweGM0fSwKKwl7MHgwMCwgMHgwMH0KK307CisKKy8qIERNQSBDaGFubmVscyBjb252ZXJzaW9uIGFycmF5ICAgICAgICAqLworc3RhdGljIHN0cnVjdCBvclZhbHMgb3JETUFbXSBfX2luaXRkYXRhID0geworCXsweDAwLCAweDAxfSwKKwl7MHgwMSwgMHgwMn0sCisJezB4MDMsIDB4MDN9LAorCXsweDAwLCAweDAwfQorfTsKKworc3RhdGljIHN0cnVjdCBhZWRzcDE2X2luZm8gYWVfY29uZmlnID0geworCURFRl9BRURTUDE2X0lPQiwKKwlERUZfQUVEU1AxNl9JUlEsCisJREVGX0FFRFNQMTZfTVJRLAorCURFRl9BRURTUDE2X0RNQSwKKwktMSwKKwktMSwKKwlJTklUX05PTkUKK307CisKKy8qCisgKiBCdWZmZXJzIHRvIHN0b3JlIGF1ZGlvIGNhcmQgaW5mb3JtYXRpb25zCisgKi8KK3N0YXRpYyBjaGFyICAgICBEU1BDb3B5cmlnaHRbQ0FSRE5BTUVMRU4gKyAxXSBfX2luaXRkYXRhID0gezAsIH07CitzdGF0aWMgY2hhciAgICAgRFNQVmVyc2lvbltDQVJEVkVSTEVOICsgMV0gX19pbml0ZGF0YSA9IHswLCB9OworCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X3dhaXRfZGF0YShpbnQgcG9ydCkKK3sKKwlpbnQgICAgICAgICAgICAgbG9vcCA9IFNUQVRVU1JFVFJZOworCXVuc2lnbmVkIGNoYXIgICByZXQgPSAwOworCisJREJHMSgoImFlZHNwMTZfd2FpdF9kYXRhICgweCV4KTogIiwgcG9ydCkpOworCisJZG8geworCQkgIHJldCA9IGluYihwb3J0ICsgRFNQX0RBVEFWQUlMKTsKKwkvKgorCSAqIFdhaXQgZm9yIGRhdGEgYXZhaWxhYmxlIChiaXQgNyBvZiByZXQgPT0gMSkKKwkgKi8KKwkgIH0gd2hpbGUgKCEocmV0ICYgMHg4MCkgJiYgbG9vcC0tKTsKKworCWlmIChyZXQgJiAweDgwKSB7CisJCURCRzEoKCJzdWNjZXNzLlxuIikpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlEQkcxKCgiZmFpbHVyZS5cbiIpKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFlZHNwMTZfcmVhZChpbnQgcG9ydCkKK3sKKwlpbnQgaW5ieXRlOworCisJREJHKCgiICAgIFJlYWQgRFNQIEJ5dGUgKDB4JXgpOiAiLCBwb3J0KSk7CisKKwlpZiAoYWVkc3AxNl93YWl0X2RhdGEocG9ydCkgPT0gRkFMU0UpIHsKKwkJREJHKCgiZmFpbHVyZS5cbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWluYnl0ZSA9IGluYihwb3J0ICsgRFNQX1JFQUQpOworCisJREJHKCgicmVhZCBbMHgleF0veyVjfS5cbiIsIGluYnl0ZSwgaW5ieXRlKSk7CisKKwlyZXR1cm4gaW5ieXRlOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X3Rlc3RfZHNwKGludCBwb3J0KQoreworCXJldHVybiAoKGFlZHNwMTZfcmVhZChwb3J0KSA9PSAweGFhKSA/IFRSVUUgOiBGQUxTRSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFlZHNwMTZfZHNwX3Jlc2V0KGludCBwb3J0KQoreworCS8qCisJICogUmVzZXQgRFNQCisJICovCisKKwlEQkcoKCJSZXNldCBEU1A6XG4iKSk7CisKKwlvdXRiKDEsIChwb3J0ICsgRFNQX1JFU0VUKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKDAsIChwb3J0ICsgRFNQX1JFU0VUKSk7CisJdWRlbGF5KDEwKTsKKwl1ZGVsYXkoMTApOworCWlmIChhZWRzcDE2X3Rlc3RfZHNwKHBvcnQpID09IFRSVUUpIHsKKwkJREJHKCgic3VjY2Vzcy5cbiIpKTsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlCisJCURCRygoImZhaWx1cmUuXG4iKSk7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X3dyaXRlKGludCBwb3J0LCBpbnQgY21kKQoreworCXVuc2lnbmVkIGNoYXIgICByZXQ7CisJaW50ICAgICAgICAgICAgIGxvb3AgPSBIQVJEUkVUUlk7CisKKwlEQkcoKCIgICAgV3JpdGUgRFNQIEJ5dGUgKDB4JXgpIFsweCV4XTogIiwgcG9ydCwgY21kKSk7CisKKwlkbyB7CisJCXJldCA9IGluYihwb3J0ICsgRFNQX1NUQVRVUyk7CisJCS8qCisJCSAqIERTUCByZWFkeSB0byByZWNlaXZlIGRhdGEgaWYgYml0IDcgb2YgcmV0ID09IDAKKwkJICovCisJCWlmICghKHJldCAmIDB4ODApKSB7CisJCQlvdXRiKGNtZCwgcG9ydCArIERTUF9DT01NQU5EKTsKKwkJCURCRygoInN1Y2Nlc3MuXG4iKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gd2hpbGUgKGxvb3AtLSk7CisKKwlEQkcoKCJ0aW1lb3V0LlxuIikpOworCXByaW50aygiW0FFRFNQMTZdIERTUCBDb21tYW5kICgweCV4KSB0aW1lb3V0LlxuIiwgY21kKTsKKworCXJldHVybiAtMTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMCkKKworI2lmIGRlZmluZWQoQUVEU1AxNl9JTkZPKSB8fCBkZWZpbmVkKEFFRFNQMTZfREVCVUcpCit2b2lkIF9faW5pdCBhZWRzcDE2X3BpbmZvKHZvaWQpIHsKKwlEQkcoKCJcbiBCYXNlIGFkZHJlc3M6ICAleFxuIiwgZGVjb2RlZF9oY2ZnLmlvYmFzZSkpOworCURCRygoIiBKb3lzdGljayAgICA6ICVzIHByZXNlbnRcbiIsIGRlY29kZWRfaGNmZy5qb3lzdGljaz8iIjoiIG5vdCIpKTsKKwlEQkcoKCIgV1NTIGFkZHIgICAgOiAgJXhcbiIsIGRlY29kZWRfaGNmZy53c3NiYXNlKSk7CisJREJHKCgiIE1QVS00MDEgYWRkcjogICV4XG4iLCBkZWNvZGVkX2hjZmcubXB1YmFzZSkpOworCURCRygoIiBDRFJPTSAgICAgICA6ICVzIHByZXNlbnRcbiIsIChkZWNvZGVkX2hjZmcuY2Ryb20hPTQpPyIiOiIgbm90IikpOworCURCRygoIiBDRFJPTUFERFIgICA6ICAleFxuXG4iLCBkZWNvZGVkX2hjZmcuY2Ryb21iYXNlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IGFlZHNwMTZfaGFyZF9kZWNvZGUodm9pZCkgeworCisJREJHKCgiIGFlZHNwMTZfaGFyZF9kZWNvZGU6IDB4JXgsIDB4JXhcbiIsIGhhcmRfY2ZnWzBdLCBoYXJkX2NmZ1sxXSkpOworCisvKgorICogRGVjb2RlIENmZyBCeXRlcy4KKyAqLworCWRlY29kZWRfaGNmZy5pb2Jhc2UJPSBJT0JBU0UoaGFyZF9jZmdbMF0pOworCWRlY29kZWRfaGNmZy5qb3lzdGljawk9IEpPWShoYXJkX2NmZ1swXSk7CisJZGVjb2RlZF9oY2ZnLndzc2Jhc2UJPSBXU1NBRERSKGhhcmRfY2ZnWzBdKTsKKwlkZWNvZGVkX2hjZmcubXB1YmFzZQk9IE1QVUFERFIoaGFyZF9jZmdbMF0pOworCWRlY29kZWRfaGNmZy5jZHJvbQk9IENEUk9NKGhhcmRfY2ZnWzFdKTsKKwlkZWNvZGVkX2hjZmcuY2Ryb21iYXNlCT0gQ0RST01BRERSKGhhcmRfY2ZnWzFdKTsKKworI2lmIGRlZmluZWQoQUVEU1AxNl9JTkZPKSB8fCBkZWZpbmVkKEFFRFNQMTZfREVCVUcpCisJcHJpbnRrKCIgT3JpZ2luYWwgc291bmQgY2FyZCBjb25maWd1cmF0aW9uOlxuIik7CisJYWVkc3AxNl9waW5mbygpOworI2VuZGlmCisKKy8qCisgKiBOb3cgc2V0IHVwIHRoZSByZWFsIGtlcm5lbCBjb25maWd1cmF0aW9uLgorICovCisJZGVjb2RlZF9oY2ZnLmlvYmFzZQk9IGFlX2NvbmZpZy5iYXNlX2lvOworCWRlY29kZWRfaGNmZy53c3NiYXNlCT0gYWVfY29uZmlnLm1zc19iYXNlOworCWRlY29kZWRfaGNmZy5tcHViYXNlCT0gYWVfY29uZmlnLm1wdV9iYXNlOworCisjaWYgZGVmaW5lZChDT05GSUdfU0M2NjAwX0pPWSkKKyAJZGVjb2RlZF9oY2ZnLmpveXN0aWNrCT0gQ09ORklHX1NDNjYwMF9KT1k7IC8qIEVuYWJsZSAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU0M2NjAwX0NEUk9NKQorCWRlY29kZWRfaGNmZy5jZHJvbQk9IENPTkZJR19TQzY2MDBfQ0RST007IC8qIDQ6Ti0zOkktMjpHLTE6UC0wOlMgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMF9DRFJPTUJBU0UpCisJZGVjb2RlZF9oY2ZnLmNkcm9tYmFzZQk9IENPTkZJR19TQzY2MDBfQ0RST01CQVNFOyAvKiAwIERpc2FibGUgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChBRURTUDE2X0RFQlVHKQorCURCRygoIiBOZXcgVmFsdWVzOlxuIikpOworCWFlZHNwMTZfcGluZm8oKTsKKyNlbmRpZgorCisJREJHKCgic3VjY2Vzcy5cbiIpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFlZHNwMTZfaGFyZF9lbmNvZGUodm9pZCkgeworCisJREJHKCgiIGFlZHNwMTZfaGFyZF9lbmNvZGU6IDB4JXgsIDB4JXhcbiIsIGhhcmRfY2ZnWzBdLCBoYXJkX2NmZ1sxXSkpOworCisJaGFyZF9jZmdbMF0gPSAwOworCWhhcmRfY2ZnWzFdID0gMDsKKworCWhhcmRfY2ZnWzBdIHw9IDB4MjA7CisKKwlCTERJT0JBU0UgKGhhcmRfY2ZnWzBdLCBkZWNvZGVkX2hjZmcuaW9iYXNlKTsKKwlCTERXU1NBRERSKGhhcmRfY2ZnWzBdLCBkZWNvZGVkX2hjZmcud3NzYmFzZSk7CisJQkxETVBVQUREUihoYXJkX2NmZ1swXSwgZGVjb2RlZF9oY2ZnLm1wdWJhc2UpOworCUJMREpPWShoYXJkX2NmZ1swXSwgZGVjb2RlZF9oY2ZnLmpveXN0aWNrKTsKKwlCTERDRFJPTShoYXJkX2NmZ1sxXSwgZGVjb2RlZF9oY2ZnLmNkcm9tKTsKKwlCTERDRFJPTUFERFIoaGFyZF9jZmdbMV0sIGRlY29kZWRfaGNmZy5jZHJvbWJhc2UpOworCisjaWYgZGVmaW5lZChBRURTUDE2X0RFQlVHKQorCWFlZHNwMTZfcGluZm8oKTsKKyNlbmRpZgorCisJREJHKCgiIGFlZHNwMTZfaGFyZF9lbmNvZGU6IDB4JXgsIDB4JXhcbiIsIGhhcmRfY2ZnWzBdLCBoYXJkX2NmZ1sxXSkpOworCURCRygoInN1Y2Nlc3MuXG4iKSk7CisKK30KKworc3RhdGljIGludCBfX2luaXQgYWVkc3AxNl9oYXJkX3dyaXRlKGludCBwb3J0KSB7CisKKwlEQkcoKCJhZWRzcDE2X2hhcmRfd3JpdGU6XG4iKSk7CisKKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBDT01NQU5EXzZDKSkgeworCQlwcmludGsoIltBRURTUDE2XSBDTUQgMHgleDogZmFpbGVkIVxuIiwgQ09NTUFORF82Qyk7CisJCURCRygoImZhaWx1cmUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgQ09NTUFORF81QykpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gQ01EIDB4JXg6IGZhaWxlZCFcbiIsIENPTU1BTkRfNUMpOworCQlEQkcoKCJmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIGhhcmRfY2ZnWzBdKSkgeworCQlwcmludGsoIltBRURTUDE2XSBEQVRBIDB4JXg6IGZhaWxlZCFcbiIsIGhhcmRfY2ZnWzBdKTsKKwkJREJHKCgiZmFpbHVyZS5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBoYXJkX2NmZ1sxXSkpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gREFUQSAweCV4OiBmYWlsZWQhXG4iLCBoYXJkX2NmZ1sxXSk7CisJCURCRygoImZhaWx1cmUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgQ09NTUFORF9DNSkpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gQ01EIDB4JXg6IGZhaWxlZCFcbiIsIENPTU1BTkRfQzUpOworCQlEQkcoKCJmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJREJHKCgic3VjY2Vzcy5cbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X2hhcmRfcmVhZChpbnQgcG9ydCkgeworCisJREJHKCgiYWVkc3AxNl9oYXJkX3JlYWQ6XG4iKSk7CisKKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBSRUFEX0hBUkRfQ0ZHKSkgeworCQlwcmludGsoIltBRURTUDE2XSBDTUQgMHgleDogZmFpbGVkIVxuIiwgUkVBRF9IQVJEX0NGRyk7CisJCURCRygoImZhaWx1cmUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoKGhhcmRfY2ZnWzBdID0gYWVkc3AxNl9yZWFkKHBvcnQpKSA9PSAtMSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X3JlYWQgYWZ0ZXIgQ01EIDB4JXg6IGZhaWxlZFxuIiwKKwkJCVJFQURfSEFSRF9DRkcpOworCQlEQkcoKCJmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmICgoaGFyZF9jZmdbMV0gPSBhZWRzcDE2X3JlYWQocG9ydCkpID09IC0xKSB7CisJCXByaW50aygiW0FFRFNQMTZdIGFlZHNwMTZfcmVhZCBhZnRlciBDTUQgMHgleDogZmFpbGVkXG4iLAorCQkJUkVBRF9IQVJEX0NGRyk7CisJCURCRygoImZhaWx1cmUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKGFlZHNwMTZfcmVhZChwb3J0KSA9PSAtMSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X3JlYWQgYWZ0ZXIgQ01EIDB4JXg6IGZhaWxlZFxuIiwKKwkJCVJFQURfSEFSRF9DRkcpOworCQlEQkcoKCJmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJREJHKCgic3VjY2Vzcy5cbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X2V4dF9jZmdfd3JpdGUoaW50IHBvcnQpIHsKKworCWludCBleHRjZmcsIHZhbDsKKworCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIENPTU1BTkRfNjYpKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzY2KTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWV4dGNmZyA9IDc7CisJaWYgKGRlY29kZWRfaGNmZy5jZHJvbSAhPSAyKQorCQlleHRjZmcgPSAweDBGOworCWlmICgoZGVjb2RlZF9oY2ZnLmNkcm9tID09IDQpIHx8CisJICAgIChkZWNvZGVkX2hjZmcuY2Ryb20gPT0gMykpCisJCWV4dGNmZyAmPSB+MjsKKwlpZiAoZGVjb2RlZF9oY2ZnLmNkcm9tYmFzZSA9PSAwKQorCQlleHRjZmcgJj0gfjI7CisJaWYgKGRlY29kZWRfaGNmZy5tcHViYXNlID09IDApCisJCWV4dGNmZyAmPSB+MTsKKworCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIGV4dGNmZykpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gV3JpdGUgZXh0Y2ZnOiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCAwKSkgeworCQlwcmludGsoIltBRURTUDE2XSBXcml0ZSBleHRjZmc6IGZhaWxlZCFcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmIChkZWNvZGVkX2hjZmcuY2Ryb20gPT0gMykgeworCQlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBDT01NQU5EXzUyKSkgeworCQkJcHJpbnRrKCJbQUVEU1AxNl0gQ01EIDB4JXg6IGZhaWxlZCFcbiIsIENPTU1BTkRfNTIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCWlmICgodmFsID0gYWVkc3AxNl9yZWFkKHBvcnQpKSA9PSAtMSkgeworCQkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9yZWFkIGFmdGVyIENNRCAweCV4OiBmYWlsZWRcbiIKKwkJCQkJLCBDT01NQU5EXzUyKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQl2YWwgJj0gMHg3RjsKKwkJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgQ09NTUFORF82MCkpIHsKKwkJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzYwKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCB2YWwpKSB7CisJCQlwcmludGsoIltBRURTUDE2XSBXcml0ZSB2YWw6IGZhaWxlZCFcbiIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU0M2NjAwICovCisKK3N0YXRpYyBpbnQgX19pbml0IGFlZHNwMTZfY2ZnX3dyaXRlKGludCBwb3J0KSB7CisJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgV1JJVEVfTURJUlFfQ0ZHKSkgeworCQlwcmludGsoIltBRURTUDE2XSBDTUQgMHgleDogZmFpbGVkIVxuIiwgV1JJVEVfTURJUlFfQ0ZHKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBzb2Z0X2NmZykpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gSW5pdGlhbGl6YXRpb24gb2YgKE0pSVJRIGFuZCBETUE6IGZhaWxlZCFcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X2luaXRfbXNzKGludCBwb3J0KQoreworCURCRygoImFlZHNwMTZfaW5pdF9tc3M6XG4iKSk7CisKKwltZGVsYXkoMTApOworCisJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgRFNQX0lOSVRfTVNTKSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X2luaXRfbXNzIFsweCV4XTogZmFpbGVkIVxuIiwKKwkJCQlEU1BfSU5JVF9NU1MpOworCQlEQkcoKCJmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCQorCW1kZWxheSgxMCk7CisKKwlpZiAoYWVkc3AxNl9jZmdfd3JpdGUocG9ydCkgPT0gRkFMU0UpCisJCXJldHVybiBGQUxTRTsKKworCW91dGIoc29mdF9jZmdfbXNzLCBhZV9jb25maWcubXNzX2Jhc2UpOworCisJREJHKCgic3VjY2Vzcy5cbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X3NldHVwX2JvYXJkKGludCBwb3J0KSB7CisJaW50CWxvb3AgPSBSRVRSWTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMCkKKwlpbnQJdmFsID0gMDsKKworCWlmIChhZWRzcDE2X2hhcmRfcmVhZChwb3J0KSA9PSBGQUxTRSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X2hhcmRfcmVhZDogZmFpbGVkIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBDT01NQU5EXzUyKSkgeworCQlwcmludGsoIltBRURTUDE2XSBDTUQgMHgleDogZmFpbGVkIVxuIiwgQ09NTUFORF81Mik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoKHZhbCA9IGFlZHNwMTZfcmVhZChwb3J0KSkgPT0gLTEpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9yZWFkIGFmdGVyIENNRCAweCV4OiBmYWlsZWRcbiIsCisJCQkJQ09NTUFORF81Mik7CisJCXJldHVybiBGQUxTRTsKKwl9CisjZW5kaWYKKworCWRvIHsKKwkJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgQ09NTUFORF84OCkpIHsKKwkJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzg4KTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQltZGVsYXkoMTApOworCX0gd2hpbGUgKChhZWRzcDE2X3dhaXRfZGF0YShwb3J0KSA9PSBGQUxTRSkgJiYgbG9vcC0tKTsKKworCWlmIChhZWRzcDE2X3JlYWQocG9ydCkgPT0gLTEpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9yZWFkIGFmdGVyIENNRCAweCV4OiBmYWlsZWRcbiIsCisJCQkJQ09NTUFORF84OCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZiAhZGVmaW5lZChDT05GSUdfU0M2NjAwKQorCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIENPTU1BTkRfNUMpKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzVDKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKyNlbmRpZgorCisJaWYgKGFlZHNwMTZfY2ZnX3dyaXRlKHBvcnQpID09IEZBTFNFKQorCQlyZXR1cm4gRkFMU0U7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TQzY2MDApCisJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgQ09NTUFORF82MCkpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gQ01EIDB4JXg6IGZhaWxlZCFcbiIsIENPTU1BTkRfNjApOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIHZhbCkpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gREFUQSAweCV4OiBmYWlsZWQhXG4iLCB2YWwpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIENPTU1BTkRfNkUpKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzZFKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCB2ZXJbMF0pKSB7CisJCXByaW50aygiW0FFRFNQMTZdIERBVEEgMHgleDogZmFpbGVkIVxuIiwgdmVyWzBdKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCB2ZXJbMV0pKSB7CisJCXByaW50aygiW0FFRFNQMTZdIERBVEEgMHgleDogZmFpbGVkIVxuIiwgdmVyWzFdKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChhZWRzcDE2X2hhcmRfd3JpdGUocG9ydCkgPT0gRkFMU0UpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9oYXJkX3dyaXRlOiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIENPTU1BTkRfNUMpKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzVDKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmIGRlZmluZWQoVEhJU19JU19BX1RISU5HX0lfSEFWRV9OT1RfVEVTVEVEX1lFVCkKKwlpZiAoYWVkc3AxNl9jZmdfd3JpdGUocG9ydCkgPT0gRkFMU0UpCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZgorCisjZW5kaWYKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X3N0ZGNmZyhpbnQgcG9ydCkgeworCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIFdSSVRFX01ESVJRX0NGRykpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gQ01EIDB4JXg6IGZhaWxlZCFcbiIsIFdSSVRFX01ESVJRX0NGRyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiAweDBBID09IChJUlEgNywgRE1BIDEsIE1JUlEgMCkKKwkgKi8KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCAweDBBKSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X3N0ZGNmZzogZmFpbGVkIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFlZHNwMTZfZHNwX3ZlcnNpb24oaW50IHBvcnQpCit7CisJaW50ICAgICAgICAgICAgIGxlbiA9IDA7CisJaW50ICAgICAgICAgICAgIHJldDsKKworCURCRygoIkdldCBEU1AgVmVyc2lvbjpcbiIpKTsKKworCWlmIChhZWRzcDE2X3dyaXRlKGFlX2NvbmZpZy5iYXNlX2lvLCBHRVRfRFNQX1ZFUlNJT04pKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBHRVRfRFNQX1ZFUlNJT04pOworCQlEQkcoKCJmYWlsZWQuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlkbyB7CisJCWlmICgocmV0ID0gYWVkc3AxNl9yZWFkKHBvcnQpKSA9PSAtMSkgeworCQkJREJHKCgiZmFpbGVkLlxuIikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJLyoKKwkgKiBXZSBhbHJlYWR5IGtub3cgaG93IG1hbnkgaW50IGFyZSBzdG9yZWQgKDIpLCBzbyB3ZSBrbm93IHdoZW4gdGhlCisJICogc3RyaW5nIGlzIGZpbmlzaGVkLgorCSAqLworCQl2ZXJbbGVuKytdID0gcmV0OworCSAgfSB3aGlsZSAobGVuIDwgQ0FSRFZFUkxFTik7CisJc3ByaW50ZihEU1BWZXJzaW9uLCAiJWQuJWQiLCB2ZXJbMF0sIHZlclsxXSk7CisKKwlEQkcoKCJzdWNjZXNzLlxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFlZHNwMTZfZHNwX2NvcHlyaWdodChpbnQgcG9ydCkKK3sKKwlpbnQgICAgICAgICAgICAgbGVuID0gMDsKKwlpbnQgICAgICAgICAgICAgcmV0OworCisJREJHKCgiR2V0IERTUCBDb3B5cmlnaHQ6XG4iKSk7CisKKwlpZiAoYWVkc3AxNl93cml0ZShhZV9jb25maWcuYmFzZV9pbywgR0VUX0RTUF9DT1BZUklHSFQpKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBHRVRfRFNQX0NPUFlSSUdIVCk7CisJCURCRygoImZhaWxlZC5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWRvIHsKKwkJaWYgKChyZXQgPSBhZWRzcDE2X3JlYWQocG9ydCkpID09IC0xKSB7CisJLyoKKwkgKiBJZiBubyBtb3JlIGRhdGEgYXZhaWxhYmxlLCByZXR1cm4gdG8gdGhlIGNhbGxlciwgbm8gZXJyb3IgaWYgbGVuPjAuCisJICogV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8ga25vdyB3aGVuIHRoZSBzdHJpbmcgaXMgZmluaXNoZWQuCisJICovCisJCQlpZiAobGVuKQorCQkJCWJyZWFrOworCQkJZWxzZSB7CisJCQkJREJHKCgiZmFpbGVkLlxuIikpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCisJCURTUENvcHlyaWdodFtsZW4rK10gPSByZXQ7CisKKwkgIH0gd2hpbGUgKGxlbiA8IENBUkROQU1FTEVOKTsKKworCURCRygoInN1Y2Nlc3MuXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFlZHNwMTZfaW5pdF90YWJsZXModm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwltZW1zZXQoRFNQQ29weXJpZ2h0LCAwLCBDQVJETkFNRUxFTiArIDEpOworCW1lbXNldChEU1BWZXJzaW9uLCAwLCBDQVJEVkVSTEVOICsgMSk7CisKKwlmb3IgKGkgPSAwOyBvcklSUVtpXS5vcjsgaSsrKQorCQlpZiAob3JJUlFbaV0udmFsID09IGFlX2NvbmZpZy5pcnEpIHsKKwkJCXNvZnRfY2ZnIHw9IG9ySVJRW2ldLm9yOworCQkJc29mdF9jZmdfbXNzIHw9IG9ySVJRW2ldLm9yOworCQl9CisKKwlmb3IgKGkgPSAwOyBvck1JUlFbaV0ub3I7IGkrKykKKwkJaWYgKG9yTUlSUVtpXS5vciA9PSBhZV9jb25maWcubXB1X2lycSkKKwkJCXNvZnRfY2ZnIHw9IG9yTUlSUVtpXS5vcjsKKworCWZvciAoaSA9IDA7IG9yRE1BW2ldLm9yOyBpKyspCisJCWlmIChvckRNQVtpXS52YWwgPT0gYWVfY29uZmlnLmRtYSkgeworCQkJc29mdF9jZmcgfD0gb3JETUFbaV0ub3I7CisJCQlzb2Z0X2NmZ19tc3MgfD0gb3JETUFbaV0ub3I7CisJCX0KK30KKworc3RhdGljIGludCBfX2luaXQgYWVkc3AxNl9pbml0X2JvYXJkKHZvaWQpCit7CisJYWVkc3AxNl9pbml0X3RhYmxlcygpOworCisJaWYgKGFlZHNwMTZfZHNwX3Jlc2V0KGFlX2NvbmZpZy5iYXNlX2lvKSA9PSBGQUxTRSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X2RzcF9yZXNldDogZmFpbGVkIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKGFlZHNwMTZfZHNwX2NvcHlyaWdodChhZV9jb25maWcuYmFzZV9pbykgPT0gRkFMU0UpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9kc3BfY29weXJpZ2h0OiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qCisJICogTXkgQUVEU1AxNiBjYXJkIHJldHVybiBTQy02MDAwIGluIERTUENvcHlyaWdodCwgc28KKwkgKiBpZiB3ZSBoYXZlIHNvbWV0aGluZyBkaWZmZXJlbnQsIHdlIGhhdmUgdG8gYmUgd2FybmVkLgorCSAqLworCWlmIChzdHJjbXAoIlNDLTYwMDAiLCBEU1BDb3B5cmlnaHQpKQorCQlwcmludGsoIltBRURTUDE2XSBXYXJuaW5nOiBub24gU0MtNjAwMCBhdWRpbyBjYXJkIVxuIik7CisKKwlpZiAoYWVkc3AxNl9kc3BfdmVyc2lvbihhZV9jb25maWcuYmFzZV9pbykgPT0gRkFMU0UpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9kc3BfdmVyc2lvbjogZmFpbGVkIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoYWVkc3AxNl9zdGRjZmcoYWVfY29uZmlnLmJhc2VfaW8pID09IEZBTFNFKSB7CisJCXByaW50aygiW0FFRFNQMTZdIGFlZHNwMTZfc3RkY2ZnOiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMCkKKwlpZiAoYWVkc3AxNl9oYXJkX3JlYWQoYWVfY29uZmlnLmJhc2VfaW8pID09IEZBTFNFKSB7CisJCXByaW50aygiW0FFRFNQMTZdIGFlZHNwMTZfaGFyZF9yZWFkOiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWFlZHNwMTZfaGFyZF9kZWNvZGUoKTsKKworCWFlZHNwMTZfaGFyZF9lbmNvZGUoKTsKKworCWlmIChhZWRzcDE2X2hhcmRfd3JpdGUoYWVfY29uZmlnLmJhc2VfaW8pID09IEZBTFNFKSB7CisJCXByaW50aygiW0FFRFNQMTZdIGFlZHNwMTZfaGFyZF93cml0ZTogZmFpbGVkIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoYWVkc3AxNl9leHRfY2ZnX3dyaXRlKGFlX2NvbmZpZy5iYXNlX2lvKSA9PSBGQUxTRSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X2V4dF9jZmdfd3JpdGU6IGZhaWxlZCFcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorI2VuZGlmIC8qIENPTkZJR19TQzY2MDAgKi8KKworCWlmIChhZWRzcDE2X3NldHVwX2JvYXJkKGFlX2NvbmZpZy5iYXNlX2lvKSA9PSBGQUxTRSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X3NldHVwX2JvYXJkOiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChhZV9jb25maWcubXNzX2Jhc2UgIT0gLTEpIHsKKwkJaWYgKGFlX2NvbmZpZy5pbml0ICYgSU5JVF9NU1MpIHsKKwkJCWlmIChhZWRzcDE2X2luaXRfbXNzKGFlX2NvbmZpZy5iYXNlX2lvKSA9PSBGQUxTRSkgeworCQkJCXByaW50aygiW0FFRFNQMTZdIENhbiBub3QgaW5pdGlhbGl6ZSIKKwkJCQkgICAgICAgIk1pY3Jvc29mdCBTb3VuZCBTeXN0ZW0gbW9kZS5cbiIpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworI2lmICFkZWZpbmVkKE1PRFVMRSkgfHwgZGVmaW5lZChBRURTUDE2X0lORk8pIHx8IGRlZmluZWQoQUVEU1AxNl9ERUJVRykKKworCXByaW50aygiQXVkaW8gRXhjZWwgRFNQIDE2IGluaXQgdiVzICglcyAlcykgWyIsCisJCVZFUlNJT04sIERTUENvcHlyaWdodCwKKwkJRFNQVmVyc2lvbik7CisKKwlpZiAoYWVfY29uZmlnLm1wdV9iYXNlICE9IC0xKSB7CisJCWlmIChhZV9jb25maWcuaW5pdCAmIElOSVRfTVBVNDAxKSB7CisJCQlwcmludGsoIk1QVTQwMSIpOworCQkJaWYgKChhZV9jb25maWcuaW5pdCAmIElOSVRfTVNTKSB8fAorCQkJICAgIChhZV9jb25maWcuaW5pdCAmIElOSVRfU0JQUk8pKQorCQkJCXByaW50aygiICIpOworCQl9CisJfQorCisJaWYgKGFlX2NvbmZpZy5tc3NfYmFzZSA9PSAtMSkgeworCQlpZiAoYWVfY29uZmlnLmluaXQgJiBJTklUX1NCUFJPKSB7CisJCQlwcmludGsoIlNCUHJvIik7CisJCQlpZiAoYWVfY29uZmlnLmluaXQgJiBJTklUX01TUykKKwkJCQlwcmludGsoIiAiKTsKKwkJfQorCX0KKworCWlmIChhZV9jb25maWcubXNzX2Jhc2UgIT0gLTEpCisJCWlmIChhZV9jb25maWcuaW5pdCAmIElOSVRfTVNTKQorCQkJcHJpbnRrKCJNU1MiKTsKKworCXByaW50aygiXVxuIik7CisjZW5kaWYgLyogTU9EVUxFIHx8IEFFRFNQMTZfSU5GTyB8fCBBRURTUDE2X0RFQlVHICovCisKKwltZGVsYXkoMTApOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYWVkc3AxNl9zYih2b2lkKQoreworCURCRygoImluaXRfYWVkc3AxNl9zYjogIikpOworCisvKgorICogSWYgdGhlIGNhcmQgaXMgYWxyZWFkeSBpbml0J2VkIE1TUywgd2UgY2FuIG5vdCBpbml0IGl0IHRvIFNCUFJPIHRvbworICogYmVjYXVzZSB0aGUgYm9hcmQgY2FuIG5vdCBlbXVsYXRlIHNpbXVsdGFuZW91c2x5IE1TUyBhbmQgU0JQUk8uCisgKi8KKwlpZiAoYWVfY29uZmlnLmluaXQgJiBJTklUX01TUykKKwkJcmV0dXJuIEZBTFNFOworCWlmIChhZV9jb25maWcuaW5pdCAmIElOSVRfU0JQUk8pCisJCXJldHVybiBGQUxTRTsKKworCWFlX2NvbmZpZy5pbml0IHw9IElOSVRfU0JQUk87CisKKwlEQkcoKCJkb25lLlxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdF9hZWRzcDE2X3NiKHZvaWQpCit7CisJREJHKCgidW5pbml0X2FlZHNwMTZfc2I6ICIpKTsKKworCWFlX2NvbmZpZy5pbml0ICY9IH5JTklUX1NCUFJPOworCisJREJHKCgiZG9uZS5cbiIpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9hZWRzcDE2X21zcyh2b2lkKQoreworCURCRygoImluaXRfYWVkc3AxNl9tc3M6ICIpKTsKKworLyoKKyAqIElmIHRoZSBjYXJkIGlzIGFscmVhZHkgaW5pdCdlZCBTQlBSTywgd2UgY2FuIG5vdCBpbml0IGl0IHRvIE1TUyB0b28KKyAqIGJlY2F1c2UgdGhlIGJvYXJkIGNhbiBub3QgZW11bGF0ZSBzaW11bHRhbmVvdXNseSBNU1MgYW5kIFNCUFJPLgorICovCisJaWYgKGFlX2NvbmZpZy5pbml0ICYgSU5JVF9TQlBSTykKKwkJcmV0dXJuIEZBTFNFOworCWlmIChhZV9jb25maWcuaW5pdCAmIElOSVRfTVNTKQorCQlyZXR1cm4gRkFMU0U7CisvKgorICogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgQ09ORklHX0FFRFNQMTZfQkFTRSByZWdpb24gdG9vIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSAKKyAqIEkvTyBwb3J0cyB0byBhY2Nlc3MgY2FyZCdzIGNvbnRyb2wgcmVnaXN0ZXJzLgorICovCisJaWYgKCEoYWVfY29uZmlnLmluaXQgJiBJTklUX01QVTQwMSkpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZV9jb25maWcuYmFzZV9pbywgSU9CQVNFX1JFR0lPTl9TSVpFLAorCQkJCSJhZWRzcDE2IChiYXNlKSIpKSB7CisJCQlwcmludGsoCisJCQkiQUVEU1AxNiBCQVNFIEkvTyBwb3J0IHJlZ2lvbiBpcyBhbHJlYWR5IGluIHVzZS5cbiIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJYWVfY29uZmlnLmluaXQgfD0gSU5JVF9NU1M7CisKKwlEQkcoKCJkb25lLlxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdF9hZWRzcDE2X21zcyh2b2lkKQoreworCURCRygoInVuaW5pdF9hZWRzcDE2X21zczogIikpOworCisJaWYgKCghKGFlX2NvbmZpZy5pbml0ICYgSU5JVF9NUFU0MDEpKSAmJgorCSAgIChhZV9jb25maWcuaW5pdCAmIElOSVRfTVNTKSkgeworCQlyZWxlYXNlX3JlZ2lvbihhZV9jb25maWcuYmFzZV9pbywgSU9CQVNFX1JFR0lPTl9TSVpFKTsKKwkJREJHKCgiQUVEU1AxNiBiYXNlIHJlZ2lvbiByZWxlYXNlZC5cbiIpKTsKKwl9CisKKwlhZV9jb25maWcuaW5pdCAmPSB+SU5JVF9NU1M7CisJREJHKCgiZG9uZS5cbiIpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9hZWRzcDE2X21wdSh2b2lkKQoreworCURCRygoImluaXRfYWVkc3AxNl9tcHU6ICIpKTsKKworCWlmIChhZV9jb25maWcuaW5pdCAmIElOSVRfTVBVNDAxKQorCQlyZXR1cm4gRkFMU0U7CisKKy8qCisgKiBXZSBtdXN0IHJlcXVlc3QgdGhlIENPTkZJR19BRURTUDE2X0JBU0UgcmVnaW9uIHRvbyBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgSS9PIAorICogcG9ydHMgdG8gYWNjZXNzIGNhcmQncyBjb250cm9sIHJlZ2lzdGVycy4KKyAqLworCWlmICghKGFlX2NvbmZpZy5pbml0ICYgKElOSVRfTVNTIHwgSU5JVF9TQlBSTykpKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oYWVfY29uZmlnLmJhc2VfaW8sIElPQkFTRV9SRUdJT05fU0laRSwKKwkJCQkJImFlZHNwMTYgKGJhc2UpIikpIHsKKwkJCXByaW50aygKKwkJCSJBRURTUDE2IEJBU0UgSS9PIHBvcnQgcmVnaW9uIGlzIGFscmVhZHkgaW4gdXNlLlxuIik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlhZV9jb25maWcuaW5pdCB8PSBJTklUX01QVTQwMTsKKworCURCRygoImRvbmUuXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgdW5pbml0X2FlZHNwMTZfbXB1KHZvaWQpCit7CisJREJHKCgidW5pbml0X2FlZHNwMTZfbXB1OiAiKSk7CisKKwlpZiAoKCEoYWVfY29uZmlnLmluaXQgJiAoSU5JVF9NU1MgfCBJTklUX1NCUFJPKSkpICYmCisJICAgKGFlX2NvbmZpZy5pbml0ICYgSU5JVF9NUFU0MDEpKSB7CisJCXJlbGVhc2VfcmVnaW9uKGFlX2NvbmZpZy5iYXNlX2lvLCBJT0JBU0VfUkVHSU9OX1NJWkUpOworCQlEQkcoKCJBRURTUDE2IGJhc2UgcmVnaW9uIHJlbGVhc2VkLlxuIikpOworCX0KKworCWFlX2NvbmZpZy5pbml0ICY9IH5JTklUX01QVTQwMTsKKworCURCRygoImRvbmUuXG4iKSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYWVkc3AxNih2b2lkKQoreworCWludCBpbml0aWFsaXplZCA9IEZBTFNFOworCisJREJHKCgiSW5pdGlhbGl6aW5nIEJBU0VbMHgleF0gSVJRWyVkXSBETUFbJWRdIE1JUlFbJWRdXG4iLAorCSAgICAgYWVfY29uZmlnLmJhc2VfaW8sYWVfY29uZmlnLmlycSxhZV9jb25maWcuZG1hLGFlX2NvbmZpZy5tcHVfaXJxKSk7CisKKwlpZiAoYWVfY29uZmlnLm1zc19iYXNlID09IC0xKSB7CisJCWlmIChpbml0X2FlZHNwMTZfc2IoKSA9PSBGQUxTRSkgeworCQkJdW5pbml0X2FlZHNwMTZfc2IoKTsKKwkJfSBlbHNlIHsKKwkJCWluaXRpYWxpemVkID0gVFJVRTsKKwkJfQorCX0KKworCWlmIChhZV9jb25maWcubXB1X2Jhc2UgIT0gLTEpIHsKKwkJaWYgKGluaXRfYWVkc3AxNl9tcHUoKSA9PSBGQUxTRSkgeworCQkJdW5pbml0X2FlZHNwMTZfbXB1KCk7CisJCX0gZWxzZSB7CisJCQlpbml0aWFsaXplZCA9IFRSVUU7CisJCX0KKwl9CisKKy8qCisgKiBJbiB0aGUgc2VxdWVuY2Ugb2YgaW5pdCByb3V0aW5lcywgdGhlIE1TUyBpbml0IE1VU1QgYmUgdGhlIGxhc3QhCisgKiBUaGlzIGJlY2F1c2Ugb2YgdGhlIHNwZWNpYWwgcmVnaXN0ZXIgcHJvZ3JhbW1pbmcgdGhlIE1TUyBtb2RlIG5lZWRzLgorICogQSBib2FyZCByZXNldCB3b3VsZCBkaXNhYmxlIHRoZSBNU1MgbW9kZSByZXN0b3JpbmcgdGhlIGRlZmF1bHQgU0JQUk8KKyAqIG1vZGUuCisgKi8KKwlpZiAoYWVfY29uZmlnLm1zc19iYXNlICE9IC0xKSB7CisJCWlmIChpbml0X2FlZHNwMTZfbXNzKCkgPT0gRkFMU0UpIHsKKwkJCXVuaW5pdF9hZWRzcDE2X21zcygpOworCQl9IGVsc2UgeworCQkJaW5pdGlhbGl6ZWQgPSBUUlVFOworCQl9CisJfQorCisJaWYgKGluaXRpYWxpemVkKQorCQlpbml0aWFsaXplZCA9IGFlZHNwMTZfaW5pdF9ib2FyZCgpOworCXJldHVybiBpbml0aWFsaXplZDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVuaW5pdF9hZWRzcDE2KHZvaWQpCit7CisJaWYgKGFlX2NvbmZpZy5tc3NfYmFzZSAhPSAtMSkKKwkJdW5pbml0X2FlZHNwMTZfbXNzKCk7CisJZWxzZQorCQl1bmluaXRfYWVkc3AxNl9zYigpOworCWlmIChhZV9jb25maWcubXB1X2Jhc2UgIT0gLTEpCisJCXVuaW5pdF9hZWRzcDE2X21wdSgpOworfQorCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8gPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfaXJxID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXNzX2Jhc2UgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfYmFzZSA9IC0xOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGJhc2UgYWRkcmVzcyAoMHgyMjAgMHgyNDApIik7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbGluZSAoNSA3IDkgMTAgMTEpIik7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJkbWEgbGluZSAoMCAxIDMpIik7Cittb2R1bGVfcGFyYW0obXB1X2lycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXB1X2lycSwgIk1QVS00MDEgSVJRIGxpbmUgKDUgNyA5IDEwIDApIik7Cittb2R1bGVfcGFyYW0obXNzX2Jhc2UsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1zc19iYXNlLCAiTVNTIGVtdWxhdGlvbiBJL08gYmFzZSBhZGRyZXNzICgweDUzMCAweEU4MCkiKTsKK21vZHVsZV9wYXJhbShtcHVfYmFzZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXB1X2Jhc2UsIk1QVS00MDEgSS9PIGJhc2UgYWRkcmVzcyAoMHgzMDAgMHgzMTAgMHgzMjAgMHgzMzApIik7CitNT0RVTEVfQVVUSE9SKCJSaWNjYXJkbyBGYWNjaGV0dGkgPGZpemJhbkB0aW4uaXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF1ZGlvIEV4Y2VsIERTUCAxNiBEcml2ZXIgVmVyc2lvbiAiIFZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBkb19pbml0X2FlZHNwMTYodm9pZCkgeworCXByaW50aygiQXVkaW8gRXhjZWwgRFNQIDE2IGluaXQgZHJpdmVyIENvcHlyaWdodCAoQykgUmljY2FyZG8gRmFjY2hldHRpIDE5OTUtOThcbiIpOworCWlmIChpbyA9PSAtMSB8fCBkbWEgPT0gLTEgfHwgaXJxID09IC0xKSB7CisJCXByaW50ayhLRVJOX0lORk8gImFlZHNwMTY6IEkvTywgSVJRIGFuZCBETUEgYXJlIG1hbmRhdG9yeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFlX2NvbmZpZy5iYXNlX2lvID0gaW87CisJYWVfY29uZmlnLmlycSA9IGlycTsKKwlhZV9jb25maWcuZG1hID0gZG1hOworCisJYWVfY29uZmlnLm1zc19iYXNlID0gbXNzX2Jhc2U7CisJYWVfY29uZmlnLm1wdV9iYXNlID0gbXB1X2Jhc2U7CisJYWVfY29uZmlnLm1wdV9pcnEgPSBtcHVfaXJxOworCisJaWYgKGluaXRfYWVkc3AxNigpID09IEZBTFNFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWVkc3AxNjogaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJLyoKKwkJICogWFhYCisJCSAqIFdoYXQgZXJyb3Igc2hvdWxkIHdlIHJldHVybiBoZXJlID8KKwkJICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYWVkc3AxNih2b2lkKSB7CisJdW5pbml0X2FlZHNwMTYoKTsKK30KKworbW9kdWxlX2luaXQoZG9faW5pdF9hZWRzcDE2KTsKK21vZHVsZV9leGl0KGNsZWFudXBfYWVkc3AxNik7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hZWRzcDE2KGNoYXIgKnN0cikKK3sKKwkvKiBpbywgaXJxLCBkbWEsIG1zc19pbywgbXB1X2lvLCBtcHVfaXJxICovCisJaW50IGludHNbN107CisJCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCWlvCSA9IGludHNbMV07CisJaXJxCSA9IGludHNbMl07CisJZG1hCSA9IGludHNbM107CisJbXNzX2Jhc2UgPSBpbnRzWzRdOworCW1wdV9iYXNlID0gaW50c1s1XTsKKwltcHVfaXJxCSA9IGludHNbNl07CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFlZHNwMTY9Iiwgc2V0dXBfYWVkc3AxNik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hbGk1NDU1LmMgYi9zb3VuZC9vc3MvYWxpNTQ1NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOWU2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYWxpNTQ1NS5jCkBAIC0wLDAgKzEsMzczMyBAQAorLyoKKyAqCUFMSSAgYWxpNTQ1NSBhbmQgZnJpZW5kcyBJQ0ggZHJpdmVyIGZvciBMaW51eAorICoJTEVJIEhVIDxMZWlfSHVAYWxpLmNvbS50dz4KKyAqCisgKiAgQnVpbHQgZnJvbToKKyAqCWRyaXZlcnMvc291bmQvaTgxMF9hdWRpbworICoKKyAqICAJVGhlIEFMaSA1NDU1IGlzIHNpbWlsYXIgYnV0IG5vdCBxdWl0ZSBpZGVudGljYWwgdG8gdGhlIEludGVsIElDSAorICoJc2VyaWVzIG9mIGNvbnRyb2xsZXJzLiBJdHMgZWFzaWVyIHRvIGtlZXAgdGhlIGRyaXZlciBzZXBhcmF0ZWQgZnJvbQorICoJdGhlIGk4MTAgZHJpdmVyLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqCisgKglBTGkgNTQ1NSB0aGVvcnkgb2Ygb3BlcmF0aW9uCisgKgorICoJVGhlIGNoaXBzZXQgcHJvdmlkZXMgdGhyZWUgRE1BIGNoYW5uZWxzIHRoYXQgdGFsayB0byBhbiBBQzk3CisgKglDT0RFQyAoQUM5NyBpcyBhIGRpZ2l0YWwvYW5hbG9nIG1peGVyIHN0YW5kYXJkKS4gQXQgaXRzIHNpbXBsZXN0CisgKgl5b3UgZ2V0IDQ4S2h6IGF1ZGlvIHdpdGggYmFzaWMgdm9sdW1lIGFuZCBtaXhlciBjb250cm9scy4gQXQgdGhlCisgKgliZXN0IHlvdSBnZXQgcmF0ZSBhZGFwdGlvbiBpbiB0aGUgY29kZWMuIFdlIHNldCB0aGUgY2FyZCB1cCBzbworICoJdGhhdCB3ZSBuZXZlciB0YWtlIGNvbXBsZXRpb24gaW50ZXJydXB0cyBidXQgaW5zdGVhZCBrZWVwIHRoZSBjYXJkCisgKgljaGFzaW5nIGl0cyB0YWlsIGFyb3VuZCBhIHJpbmcgYnVmZmVyLiBUaGlzIGlzIG5lZWRlZCBmb3IgbW1hcAorICoJbW9kZSBhdWRpbyBhbmQgaGFwcGVucyB0byB3b3JrIHJhdGhlciB3ZWxsIGZvciBub24tbW1hcCBtb2RlcyB0b28uCisgKgorICoJVGhlIGJvYXJkIGhhcyBvbmUgb3V0cHV0IGNoYW5uZWwgZm9yIFBDTSBhdWRpbyAoc3VwcG9ydGVkKSBhbmQKKyAqCWEgc3RlcmVvIGxpbmUgaW4gYW5kIG1vbm8gbWljcm9waG9uZSBpbnB1dC4gQWdhaW4gdGhlc2UgYXJlIG5vcm1hbGx5CisgKglsb2NrZWQgdG8gNDhLaHogb25seS4gUmlnaHQgbm93IHJlY29yZGluZyBpcyBub3QgZmluaXNoZWQuCisgKgorICoJVGhlcmUgaXMgbm8gbWlkaSBzdXBwb3J0LCBubyBzeW50aCBzdXBwb3J0LiBVc2UgdGltaWRpdHkuIFRvIGdldAorICoJZXNkIHdvcmtpbmcgeW91IG5lZWQgdG8gdXNlIGVzZCAtciA0ODAwMCBhcyBpdCB3b24ndCBwcm9iZSA0OEtIegorICoJYnkgZGVmYXVsdC4gbXBnMTIzIGNhbid0IGhhbmRsZSA0OEtoeiBvbmx5IGF1ZGlvIHNvIHVzZSB4bW1zLgorICoKKyAqCUlmIHlvdSBuZWVkIHRvIGZvcmNlIGEgc3BlY2lmaWMgcmF0ZSBzZXQgdGhlIGNsb2NraW5nPSBvcHRpb24KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0FMSV81NDU1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTUJMHg1NDU1CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0FMSQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FMSQkweDEwYjkKKyNlbmRpZgorCitzdGF0aWMgaW50IHN0cmljdF9jbG9ja2luZyA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNsb2NraW5nID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29kZWNfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvbnRyb2xsZXJfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2xvYmVsID0gMDsKKworI2RlZmluZSBBRENfUlVOTklORwkxCisjZGVmaW5lIERBQ19SVU5OSU5HCTIKKyNkZWZpbmUgQ09ERUNfU1BESUZPVVRfUlVOTklORyA4CisjZGVmaW5lIENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORyA0CisKKyNkZWZpbmUgU1BESUZfRU5BQkxFX09VVFBVVAk0CS8qIGJpdHMgMCwxIGFyZSBQQ00gKi8KKworI2RlZmluZSBBTEk1NDU1X0ZNVF8xNkJJVAkxCisjZGVmaW5lIEFMSTU0NTVfRk1UX1NURVJFTwkyCisjZGVmaW5lIEFMSTU0NTVfRk1UX01BU0sJMworCisjZGVmaW5lIFNQRElGX09OCTB4MDAwNAorI2RlZmluZSBTVVJSX09OCQkweDAwMTAKKyNkZWZpbmUgQ0VOVEVSX0xGRV9PTgkweDAwMjAKKyNkZWZpbmUgVk9MX01VVEVECTB4ODAwMAorCisKKyNkZWZpbmUgQUxJX1NQRElGX09VVF9DSF9TVEFUVVMgMHhiZgorLyogdGhlIDgxMCdzIGFycmF5IG9mIHBvaW50ZXJzIHRvIGRhdGEgYnVmZmVycyAqLworCitzdHJ1Y3Qgc2dfaXRlbSB7CisjZGVmaW5lIEJVU0FERFJfTUFTSwkweEZGRkZGRkZFCisJdTMyIGJ1c2FkZHI7CisjZGVmaW5lIENPTl9JT0MgCTB4ODAwMDAwMDAJLyogaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgQ09OX0JVRlBBRAkweDQwMDAwMDAwCS8qIHBhZCB1bmRlcnJ1biB3aXRoIGxhc3Qgc2FtcGxlLCBlbHNlIDAgKi8KKyNkZWZpbmUgQ09OX0JVRkxFTl9NQVNLCTB4MDAwMGZmZmYJLyogYnVmZmVyIGxlbmd0aCBpbiBzYW1wbGVzICovCisJdTMyIGNvbnRyb2w7Cit9OworCisvKiBhbiBpbnN0YW5jZSBvZiB0aGUgYWxpIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0dfTEVOIDMyCitzdHJ1Y3QgYWxpX2NoYW5uZWwgeworCS8qIHRoZXNlIHNnIGd1eXMgc2hvdWxkIHByb2JhYmx5IGJlIGFsbG9jYXRlZAorCSAgIHNlcGFyYXRlbHkgYXMgbm9jYWNoZS4gTXVzdCBiZSA4IGJ5dGUgYWxpZ25lZCAqLworCXN0cnVjdCBzZ19pdGVtIHNnW1NHX0xFTl07CS8qIDMyKjggKi8KKwl1MzIgb2Zmc2V0OwkJLyogNCAqLworCXUzMiBwb3J0OwkJLyogNCAqLworCXUzMiB1c2VkOworCXUzMiBudW07Cit9OworCisvKgorICogd2UgaGF2ZSAzIHNlcGFyYXRlIGRtYSBlbmdpbmVzLiAgcGNtIGluLCBwY20gb3V0LCBhbmQgbWljLgorICogZWFjaCBkbWEgZW5naW5lIGhhcyBjb250cm9sbGluZyByZWdpc3RlcnMuICBUaGVzZSBnb29meQorICogbmFtZXMgYXJlIGZyb20gdGhlIGRhdGFzaGVldCwgYnV0IG1ha2UgaXQgZWFzeSB0byB3cml0ZQorICogY29kZSB3aGlsZSBsZWFmaW5nIHRocm91Z2ggaXQuCisgKi8KKworI2RlZmluZSBFTlVNX0VOR0lORShQUkUsRElHKSAJCQkJCQkJCQlcCitlbnVtIHsJCQkJCQkJCQkJCQlcCisJUFJFIyNfQkRCQVIgPQkweCMjRElHIyMwLAkJLyogQnVmZmVyIERlc2NyaXB0b3IgbGlzdCBCYXNlIEFkZHJlc3MgKi8JXAorCVBSRSMjX0NJViA9CTB4IyNESUcjIzQsCQkvKiBDdXJyZW50IEluZGV4IFZhbHVlICovCQkJXAorCVBSRSMjX0xWSSA9CTB4IyNESUcjIzUsCQkvKiBMYXN0IFZhbGlkIEluZGV4ICovCQkJCVwKKwlQUkUjI19TUiA9CTB4IyNESUcjIzYsCQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8JCQkJXAorCVBSRSMjX1BJQ0IgPQkweCMjRElHIyM4LAkJLyogUG9zaXRpb24gSW4gQ3VycmVudCBCdWZmZXIgKi8JCVwKKwlQUkUjI19DUiA9CTB4IyNESUcjI2IJCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8JCQkJXAorfQorCitFTlVNX0VOR0lORShPRkYsIDApOwkJLyogT2Zmc2V0cyAqLworRU5VTV9FTkdJTkUoUEksIDQpOwkJLyogUENNIEluICovCitFTlVNX0VOR0lORShQTywgNSk7CQkvKiBQQ00gT3V0ICovCitFTlVNX0VOR0lORShNQywgNik7CQkvKiBNaWMgSW4gKi8KK0VOVU1fRU5HSU5FKENPREVDU1BESUZPVVQsIDcpOwkvKiBDT0RFQyBTUERJRiBPVVQgICovCitFTlVNX0VOR0lORShDT05UUk9MTEVSU1BESUZJTiwgQSk7CS8qIENPTlRST0xMRVIgU1BESUYgSW4gKi8KK0VOVU1fRU5HSU5FKENPTlRST0xMRVJTUERJRk9VVCwgQik7CS8qIENPTlRST0xMRVIgU1BESUYgT1VUICovCisKKworZW51bSB7CisJQUxJX1NDUiA9IDB4MDAsCQkvKiBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworCUFMSV9TU1IgPSAweDA0LAkJLyogU3lzdGVtIFN0YXR1cyBSZWdpc3RlciAgKi8KKwlBTElfRE1BQ1IgPSAweDA4LAkvKiBETUEgQ29udHJvbCBSZWdpc3RlciAgICAqLworCUFMSV9GSUZPQ1IxID0gMHgwYywJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyIDEgICovCisJQUxJX0lOVEVSRkFDRUNSID0gMHgxMCwJLyogSW50ZXJmYWNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlBTElfSU5URVJSVVBUQ1IgPSAweDE0LAkvKiBJbnRlcnJ1cHQgY29udHJvbCBSZWdpc3RlciAqLworCUFMSV9JTlRFUlJVUFRTUiA9IDB4MTgsCS8qIEludGVycnVwdCAgU3RhdHVzIFJlZ2lzdGVyICovCisJQUxJX0ZJRk9DUjIgPSAweDFjLAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgMiAgICovCisJQUxJX0NQUiA9IDB4MjAsCQkvKiBDb21tYW5kIFBvcnQgUmVnaXN0ZXIgICAgICovCisJQUxJX1NQUiA9IDB4MjQsCQkvKiBTdGF0dXMgUG9ydCBSZWdpc3RlciAgICAgICovCisJQUxJX0ZJRk9DUjMgPSAweDJjLAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgMyAgKi8KKwlBTElfVFRTUiA9IDB4MzAsCS8qIFRyYW5zbWl0IFRhZyBTbG90IFJlZ2lzdGVyICovCisJQUxJX1JUU1IgPSAweDM0LAkvKiBSZWNlaXZlIFRhZyBTbG90ICBSZWdpc3RlciAqLworCUFMSV9DU1BTUiA9IDB4MzgsCS8qIENvbW1hbmQvU3RhdHVzIFBvcnQgU3RhdHVzIFJlZ2lzdGVyICovCisJQUxJX0NBUyA9IDB4M2MsCQkvKiBDb2RlYyBXcml0ZSBTZW1hcGhvcmUgUmVnaXN0ZXIgKi8KKwlBTElfU1BESUZDU1IgPSAweGY4LAkvKiBzcGRpZiBjaGFubmVsIHN0YXR1cyByZWdpc3RlciAgKi8KKwlBTElfU1BESUZJQ1MgPSAweGZjCS8qIHNwZGlmIGludGVyZmFjZSBjb250cm9sL3N0YXR1cyAgKi8KK307CisKKy8vIHgtc3RhdHVzIHJlZ2lzdGVyKHg6cGNtIGluICxwY20gb3V0LCBtaWMgaW4sKQorLyogaW50ZXJydXB0cyBmb3IgYSBkbWEgZW5naW5lICovCisjZGVmaW5lIERNQV9JTlRfRklGTwkJKDE8PDQpCS8qIGZpZm8gdW5kZXIvb3ZlciBmbG93ICovCisjZGVmaW5lIERNQV9JTlRfQ09NUExFVEUJKDE8PDMpCS8qIGJ1ZmZlciByZWFkL3dyaXRlIGNvbXBsZXRlIGFuZCBpb2Mgc2V0ICovCisjZGVmaW5lIERNQV9JTlRfTFZJCQkoMTw8MikJLyogbGFzdCB2YWxpZCBkb25lICovCisjZGVmaW5lIERNQV9JTlRfQ0VMVgkJKDE8PDEpCS8qIGxhc3QgdmFsaWQgaXMgY3VycmVudCAqLworI2RlZmluZSBETUFfSU5UX0RDSAkJKDEpCS8qIERNQSBDb250cm9sbGVyIEhhbHRlZCAoaGFwcGVucyBvbiBMVkkgaW50ZXJydXB0cykgKi8JLy9ub3QgZXF1bHQgaW50ZWwKKyNkZWZpbmUgRE1BX0lOVF9NQVNLIChETUFfSU5UX0ZJRk98RE1BX0lOVF9DT01QTEVURXxETUFfSU5UX0xWSSkKKworLyogaW50ZXJydXB0cyBmb3IgdGhlIHdob2xlIGNoaXAgKi8vLyBieSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIGZpbmlzaAorCisjZGVmaW5lIElOVF9TUERJRk9VVCAgICgxPDwyMykJLyogY29udHJvbGxlciBzcGRpZiBvdXQgSU5URVJSVVBUICovCisjZGVmaW5lIElOVF9TUERJRklOICAgKDE8PDIyKQorI2RlZmluZSBJTlRfQ09ERUNTUERJRk9VVCAgICgxPDwxOSkKKyNkZWZpbmUgSU5UX01JQ0lOICAgKDE8PDE4KQorI2RlZmluZSBJTlRfUENNT1VUICAgKDE8PDE3KQorI2RlZmluZSBJTlRfUENNSU4gICAoMTw8MTYpCisjZGVmaW5lIElOVF9DUFJBSVMgICAoMTw8NykKKyNkZWZpbmUgSU5UX1NQUkFJUyAgICgxPDw1KQorI2RlZmluZSBJTlRfR1BJTyAgICAoMTw8MSkKKyNkZWZpbmUgSU5UX01BU0sgICAoSU5UX1NQRElGT1VUfElOVF9DT0RFQ1NQRElGT1VUfElOVF9NSUNJTnxJTlRfUENNT1VUfElOVF9QQ01JTikKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4wMmFjIgorCisvKiBtYWdpYyBudW1iZXJzIHRvIHByb3RlY3Qgb3VyIGRhdGEgc3RydWN0dXJlcyAqLworI2RlZmluZSBBTEk1NDU1X0NBUkRfTUFHSUMJCTB4NTA3MjY5NkUJLyogIlByaW4iICovCisjZGVmaW5lIEFMSTU0NTVfU1RBVEVfTUFHSUMJCTB4NjM2NTczNzMJLyogImNlc3MiICovCisjZGVmaW5lIEFMSTU0NTVfRE1BX01BU0sJCTB4ZmZmZmZmZmYJLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLworI2RlZmluZSBOUl9IV19DSAkJCTUJLy9JIHRoaW5rIDUgY2hhbm5lbAorCisvKiBtYXhpbnVtIG51bWJlciBvZiBBQzk3IGNvZGVjcyBjb25uZWN0ZWQsIEFDOTcgMi4wIGRlZmluZWQgNCAqLworI2RlZmluZSBOUl9BQzk3CQkyCisKKy8qIFBsZWFzZSBub3RlIHRoYXQgYW4gOGJpdCBtb25vIHN0cmVhbSBpcyBub3QgdmFsaWQgb24gdGhpcyBjYXJkLCB5b3UgbXVzdCBoYXZlIGEgMTZiaXQgKi8KKy8qIHN0cmVhbSBhdCBhIG1pbmltdW0gZm9yIHRoaXMgY2FyZCB0byBiZSBoYXBweSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaXplW10gPSB7IDEsIDIsIDIsIDQgfTsKKy8qIFNhbXBsZXMgYXJlIDE2Yml0IHZhbHVlcywgc28gd2UgYXJlIHNoaWZ0aW5nIHRvIGEgd29yZCwgbm90IHRvIGEgYnl0ZSwgaGVuY2Ugc2hpZnQgKi8KKy8qIHZhbHVlcyBhcmUgb25lIGxlc3MgdGhhbiBtaWdodCBiZSBleHBlY3RlZCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAtMSwgMCwgMCwgMSB9OworCisjZGVmaW5lIEFMSTU0NTUKK3N0YXRpYyBjaGFyICpjYXJkX25hbWVzW10gPSB7CisJIkFMSSA1NDU1IgorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFsaV9wY2lfdGJsW10gPSB7CisJe1BDSV9WRU5ET1JfSURfQUxJLCBQQ0lfREVWSUNFX0lEX0FMSV81NDU1LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBTEk1NDU1fSwKKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWxpX3BjaV90YmwpOworCisjaWZkZWYgQ09ORklHX1BNCisjZGVmaW5lIFBNX1NVU1BFTkRFRChjYXJkKSAoY2FyZC0+cG1fc3VzcGVuZGVkKQorI2Vsc2UKKyNkZWZpbmUgUE1fU1VTUEVOREVEKGNhcmQpICgwKQorI2VuZGlmCisKKy8qICJzb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AgKi8KK3N0cnVjdCBhbGlfc3RhdGUgeworCXVuc2lnbmVkIGludCBtYWdpYzsKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQ7CS8qIENhcmQgaW5mbyAqLworCisJLyogc2luZ2xlIG9wZW4gbG9jayBtZWNoYW5pc20sIG9ubHkgdXNlZCBmb3IgcmVjb3JkaW5nICovCisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwkvKiBmaWxlIG1vZGUgKi8KKwltb2RlX3Qgb3Blbl9tb2RlOworCisJLyogdmlydHVhbCBjaGFubmVsIG51bWJlciAqLworCWludCB2aXJ0OworCisjaWZkZWYgQ09ORklHX1BNCisJdW5zaWduZWQgaW50IHBtX3NhdmVkX2RhY19yYXRlLCBwbV9zYXZlZF9hZGNfcmF0ZTsKKyNlbmRpZgorCXN0cnVjdCBkbWFidWYgeworCQkvKiB3YXZlIHNhbXBsZSBzdHVmZiAqLworCQl1bnNpZ25lZCBpbnQgcmF0ZTsKKwkJdW5zaWduZWQgY2hhciBmbXQsIGVuYWJsZSwgdHJpZ2dlcjsKKworCQkvKiBoYXJkd2FyZSBjaGFubmVsICovCisJCXN0cnVjdCBhbGlfY2hhbm5lbCAqcmVhZF9jaGFubmVsOworCQlzdHJ1Y3QgYWxpX2NoYW5uZWwgKndyaXRlX2NoYW5uZWw7CisJCXN0cnVjdCBhbGlfY2hhbm5lbCAqY29kZWNfc3BkaWZvdXRfY2hhbm5lbDsKKwkJc3RydWN0IGFsaV9jaGFubmVsICpjb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWw7CisKKwkJLyogT1NTIGJ1ZmZlciBtYW5hZ2VtZW50IHN0dWZmICovCisJCXZvaWQgKnJhd2J1ZjsKKwkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCQl1bnNpZ25lZCBidWZvcmRlcjsKKwkJdW5zaWduZWQgbnVtZnJhZzsKKwkJdW5zaWduZWQgZnJhZ3NoaWZ0OworCisJCS8qIG91ciBidWZmZXIgYWN0cyBsaWtlIGEgY2lyY3VsYXIgcmluZyAqLworCQl1bnNpZ25lZCBod3B0cjsJLyogd2hlcmUgZG1hIGxhc3Qgc3RhcnRlZCwgdXBkYXRlZCBieSB1cGRhdGVfcHRyICovCisJCXVuc2lnbmVkIHN3cHRyOwkvKiB3aGVyZSBkcml2ZXIgbGFzdCBjbGVhci9maWxsZWQsIHVwZGF0ZWQgYnkgcmVhZC93cml0ZSAqLworCQlpbnQgY291bnQ7CS8qIGJ5dGVzIHRvIGJlIGNvbnN1bWVkIG9yIGJlZW4gZ2VuZXJhdGVkIGJ5IGRtYSBtYWNoaW5lICovCisJCXVuc2lnbmVkIHRvdGFsX2J5dGVzOwkvKiB0b3RhbCBieXRlcyBkbWFlZCBieSBoYXJkd2FyZSAqLworCisJCXVuc2lnbmVkIGVycm9yOwkvKiBudW1iZXIgb2Ygb3Zlci91bmRlcnJ1bnMgKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsJLyogcHV0IHByb2Nlc3Mgb24gd2FpdCBxdWV1ZSB3aGVuIG5vIG1vcmUgc3BhY2UgaW4gYnVmZmVyICovCisKKwkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQkvKiB3aGF0IHRoZSBoYXJkd2FyZSB1c2VzICovCisJCXVuc2lnbmVkIGRtYXNpemU7CisJCXVuc2lnbmVkIGZyYWdzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKworCQkvKiB3aGF0IHdlIHRlbGwgdGhlIHVzZXIgdG8gZXhwZWN0ICovCisJCXVuc2lnbmVkIHVzZXJmcmFnczsKKwkJdW5zaWduZWQgdXNlcmZyYWdzaXplOworCisJCS8qIE9TUyBzdHVmZiAqLworCQl1bnNpZ25lZCBtYXBwZWQ6MTsKKwkJdW5zaWduZWQgcmVhZHk6MTsKKwkJdW5zaWduZWQgdXBkYXRlX2ZsYWc7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaXplOworCQl1bnNpZ25lZCBvc3NtYXhmcmFnczsKKwkJdW5zaWduZWQgc3ViZGl2aXNpb247CisJfSBkbWFidWY7Cit9OworCisKK3N0cnVjdCBhbGlfY2FyZCB7CisJc3RydWN0IGFsaV9jaGFubmVsIGNoYW5uZWxbNV07CisJdW5zaWduZWQgaW50IG1hZ2ljOworCisJLyogV2Uga2VlcCBhbGk1NDU1IGNhcmRzIGluIGEgbGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3QgYWxpX2NhcmQgKm5leHQ7CisKKwkvKiBUaGUgYWxpIGhhcyBhIGNlcnRhaW4gYW1vdW50IG9mIGNyb3NzIGNoYW5uZWwgaW50ZXJhY3Rpb24KKwkgICBzbyB3ZSB1c2UgYSBzaW5nbGUgcGVyIGNhcmQgbG9jayAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IGFjOTdfbG9jazsKKworCS8qIFBDSSBkZXZpY2Ugc3R1ZmYgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwl1MTYgcGNpX2lkOworI2lmZGVmIENPTkZJR19QTQorCXUxNiBwbV9zdXNwZW5kZWQ7CisJaW50IHBtX3NhdmVkX21peGVyX3NldHRpbmdzW1NPVU5EX01JWEVSX05SREVWSUNFU11bTlJfQUM5N107CisjZW5kaWYKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgZGV2X2F1ZGlvOworCisJLyogc3RydWN0dXJlcyBmb3IgYWJzdHJhY3Rpb24gb2YgaGFyZHdhcmUgZmFjaWxpdGllcywgY29kZWNzLCBiYW5rcyBhbmQgY2hhbm5lbHMgKi8KKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKKwlzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZXNbTlJfSFdfQ0hdOworCisJdTE2IGFjOTdfZmVhdHVyZXM7CisJdTE2IGFjOTdfc3RhdHVzOworCXUxNiBjaGFubmVsczsKKworCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXVuc2lnbmVkIGxvbmcgaW9iYXNlOworCisJdTMyIGlycTsKKworCS8qIEZ1bmN0aW9uIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgYWxpX2NoYW5uZWwgKigqYWxsb2NfcGNtX2NoYW5uZWwpIChzdHJ1Y3QgYWxpX2NhcmQgKik7CisJc3RydWN0IGFsaV9jaGFubmVsICooKmFsbG9jX3JlY19wY21fY2hhbm5lbCkgKHN0cnVjdCBhbGlfY2FyZCAqKTsKKwlzdHJ1Y3QgYWxpX2NoYW5uZWwgKigqYWxsb2NfcmVjX21pY19jaGFubmVsKSAoc3RydWN0IGFsaV9jYXJkICopOworCXN0cnVjdCBhbGlfY2hhbm5lbCAqKCphbGxvY19jb2RlY19zcGRpZm91dF9jaGFubmVsKSAoc3RydWN0IGFsaV9jYXJkICopOworCXN0cnVjdCBhbGlfY2hhbm5lbCAqKCphbGxvY19jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwpIChzdHJ1Y3QgIGFsaV9jYXJkICopOworCXZvaWQgKCpmcmVlX3BjbV9jaGFubmVsKSAoc3RydWN0IGFsaV9jYXJkICosIGludCBjaGFuKTsKKworCS8qIFdlIGhhdmUgYSAqdmVyeSogbG9uZyBpbml0IHRpbWUgcG9zc2libHksIHNvIHVzZSB0aGlzIHRvIGJsb2NrICovCisJLyogYXR0ZW1wdHMgdG8gb3BlbiBvdXIgZGV2aWNlcyBiZWZvcmUgd2UgYXJlIHJlYWR5IChzdG9wcyBvb3BzJ2VzKSAqLworCWludCBpbml0aWFsaXppbmc7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYWxpX2NhcmQgKmRldnMgPSBOVUxMOworCitzdGF0aWMgaW50IGFsaV9vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFsaV9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHUxNiBhbGlfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKTsKK3N0YXRpYyB2b2lkIGFsaV9hYzk3X3NldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiBkYXRhKTsKKworc3RhdGljIHN0cnVjdCBhbGlfY2hhbm5lbCAqYWxpX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+Y2hhbm5lbFsxXS51c2VkID09IDEpCisJCXJldHVybiBOVUxMOworCWNhcmQtPmNoYW5uZWxbMV0udXNlZCA9IDE7CisJcmV0dXJuICZjYXJkLT5jaGFubmVsWzFdOworfQorCitzdGF0aWMgc3RydWN0IGFsaV9jaGFubmVsICphbGlfYWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+Y2hhbm5lbFswXS51c2VkID09IDEpCisJCXJldHVybiBOVUxMOworCWNhcmQtPmNoYW5uZWxbMF0udXNlZCA9IDE7CisJcmV0dXJuICZjYXJkLT5jaGFubmVsWzBdOworfQorCitzdGF0aWMgc3RydWN0IGFsaV9jaGFubmVsICphbGlfYWxsb2NfcmVjX21pY19jaGFubmVsKHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+Y2hhbm5lbFsyXS51c2VkID09IDEpCisJCXJldHVybiBOVUxMOworCWNhcmQtPmNoYW5uZWxbMl0udXNlZCA9IDE7CisJcmV0dXJuICZjYXJkLT5jaGFubmVsWzJdOworfQorCitzdGF0aWMgc3RydWN0IGFsaV9jaGFubmVsICphbGlfYWxsb2NfY29kZWNfc3BkaWZvdXRfY2hhbm5lbChzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQpCit7CisJaWYgKGNhcmQtPmNoYW5uZWxbM10udXNlZCA9PSAxKQorCQlyZXR1cm4gTlVMTDsKKwljYXJkLT5jaGFubmVsWzNdLnVzZWQgPSAxOworCXJldHVybiAmY2FyZC0+Y2hhbm5lbFszXTsKK30KKworc3RhdGljIHN0cnVjdCBhbGlfY2hhbm5lbCAqYWxpX2FsbG9jX2NvbnRyb2xsZXJfc3BkaWZvdXRfY2hhbm5lbChzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQpCit7CisJaWYgKGNhcmQtPmNoYW5uZWxbNF0udXNlZCA9PSAxKQorCQlyZXR1cm4gTlVMTDsKKwljYXJkLT5jaGFubmVsWzRdLnVzZWQgPSAxOworCXJldHVybiAmY2FyZC0+Y2hhbm5lbFs0XTsKK30KK3N0YXRpYyB2b2lkIGFsaV9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCBhbGlfY2FyZCAqY2FyZCwgaW50IGNoYW5uZWwpCit7CisJY2FyZC0+Y2hhbm5lbFtjaGFubmVsXS51c2VkID0gMDsKK30KKworCisvL2FkZCBzdXBwb3J0ICBjb2RlYyBzcGRpZiBvdXQgCitzdGF0aWMgaW50IGFsaV92YWxpZF9zcGRpZl9yYXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50IHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBpZCA9IDBMOworCisJaWQgPSAoYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1ZFTkRPUl9JRDEpIDw8IDE2KTsKKwlpZCB8PSBhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfVkVORE9SX0lEMikgJiAweGZmZmY7CisJc3dpdGNoIChpZCkgeworCWNhc2UgMHg0MTQ0NTM2MToJLyogQUQxODg2ICovCisJCWlmIChyYXRlID09IDQ4MDAwKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4NDE0YzQ3MjA6CS8qIEFMQzY1MCAqLworCQlpZiAocmF0ZSA9PSA0ODAwMCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIGFsbCBvdGhlciBjb2RlY3MsIHVudGlsIHdlIGtub3cgb3RoZXJ3aWFlICovCisJCWlmIChyYXRlID09IDQ4MDAwIHx8IHJhdGUgPT0gNDQxMDAgfHwgcmF0ZSA9PSAzMjAwMCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qIGFsaV9zZXRfc3BkaWZfb3V0cHV0CisgKiAKKyAqICBDb25maWd1cmUgdGhlIFMvUERJRiBvdXRwdXQgdHJhbnNtaXR0ZXIuIFdoZW4gd2UgdHVybiBvbgorICogIFMvUERJRiwgd2UgdHVybiBvZmYgdGhlIGFuYWxvZyBvdXRwdXQuIFRoaXMgbWF5IG5vdCBiZQorICogIHRoZSByaWdodCB0aGluZyB0byBkby4KKyAqCisgKiAgQXNzdW1wdGlvbnM6CisgKiAgICAgVGhlIERTUCBzYW1wbGUgcmF0ZSBtdXN0IGFscmVhZHkgYmUgc2V0IHRvIGEgc3VwcG9ydGVkCisgKiAgICAgUy9QRElGIHJhdGUgKDMya0h6LCA0NC4xa0h6LCBvciA0OGtIeikgb3Igd2UgYWJvcnQuCisgKi8KK3N0YXRpYyB2b2lkIGFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlLCBpbnQgc2xvdHMsCisJCQkJIGludCByYXRlKQoreworCWludCB2b2w7CisJaW50IGF1ZF9yZWc7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gc3RhdGUtPmNhcmQtPmFjOTdfY29kZWNbMF07CisKKwlpZiAoIShzdGF0ZS0+Y2FyZC0+YWM5N19mZWF0dXJlcyAmIDQpKSB7CisJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmPSB+U1BESUZfT047CisJfSBlbHNlIHsKKwkJaWYgKHNsb3RzID09IC0xKSB7CS8qIFR1cm4gb2ZmIFMvUERJRiAqLworCQkJYXVkX3JlZyA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCQkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUywgKGF1ZF9yZWcgJiB+QUM5N19FQV9TUERJRikpOworCisJCQkvKiBJZiB0aGUgdm9sdW1lIHdhc24ndCBtdXRlZCBiZWZvcmUgd2UgdHVybmVkIG9uIFMvUERJRiwgdW5tdXRlIGl0ICovCisJCQlpZiAoIShzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBWT0xfTVVURUQpKSB7CisJCQkJYXVkX3JlZyA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTyk7CisJCQkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLAorCQkJCQkgICAgIChhdWRfcmVnICYgflZPTF9NVVRFRCkpOworCQkJfQorCQkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICY9IH4oVk9MX01VVEVEIHwgU1BESUZfT04pOworCQkJcmV0dXJuOworCQl9CisKKwkJdm9sID0gYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPKTsKKwkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzID0gdm9sICYgVk9MX01VVEVEOworCisJCS8qIFNldCBTL1BESUYgdHJhbnNtaXR0ZXIgc2FtcGxlIHJhdGUgKi8KKwkJYXVkX3JlZyA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19TUERJRl9DT05UUk9MKTsKKwkJc3dpdGNoIChyYXRlKSB7CisJCWNhc2UgMzIwMDA6CisJCQlhdWRfcmVnID0gKGF1ZF9yZWcgJiBBQzk3X1NDX1NQU1JfTUFTSykgfCBBQzk3X1NDX1NQU1JfMzJLOworCQkJYnJlYWs7CisJCWNhc2UgNDQxMDA6CisJCQlhdWRfcmVnID0gKGF1ZF9yZWcgJiBBQzk3X1NDX1NQU1JfTUFTSykgfCBBQzk3X1NDX1NQU1JfNDRLOworCQkJYnJlYWs7CisJCWNhc2UgNDgwMDA6CisJCQlhdWRfcmVnID0gKGF1ZF9yZWcgJiBBQzk3X1NDX1NQU1JfTUFTSykgfCBBQzk3X1NDX1NQU1JfNDhLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiB0dXJuIG9mZiBTL1BESUYgKi8KKwkJCWF1ZF9yZWcgPSBhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIChhdWRfcmVnICYgfkFDOTdfRUFfU1BESUYpKTsKKwkJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmPSB+U1BESUZfT047CisJCQlyZXR1cm47CisJCX0KKworCQlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfU1BESUZfQ09OVFJPTCwgYXVkX3JlZyk7CisKKwkJYXVkX3JlZyA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCQlhdWRfcmVnID0gKGF1ZF9yZWcgJiBBQzk3X0VBX1NMT1RfTUFTSykgfCBzbG90cyB8IEFDOTdfRUFfU1BESUY7CisJCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIGF1ZF9yZWcpOworCisJCWF1ZF9yZWcgPSBhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJCWF1ZF9yZWcgfD0gMHgwMDAyOworCQlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgYXVkX3JlZyk7CisJCXVkZWxheSgxKTsKKworCQlzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgfD0gU1BESUZfT047CisKKwkJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHZhbGlkICovCisJCWF1ZF9yZWcgPSBhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJaWYgKCEoYXVkX3JlZyAmIDB4MDQwMCkpIHsKKwkJCS8qIHR1cm4gb2ZmIFMvUERJRiAqLworCQkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUywgKGF1ZF9yZWcgJiB+QUM5N19FQV9TUERJRikpOworCQkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICY9IH5TUERJRl9PTjsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJYXVkX3JlZyA9IGFsaV9hYzk3X2dldChjb2RlYywgMHg2YSk7CisJCQlhbGlfYWM5N19zZXQoY29kZWMsIDB4NmEsIChhdWRfcmVnICYgMHhlZmZmKSk7CisJCX0KKwkJLyogTXV0ZSB0aGUgYW5hbG9nIG91dHB1dCAqLworCQkvKiBTaG91bGQgdGhpcyBvbmx5IG11dGUgdGhlIFBDTSB2b2x1bWU/Pz8gKi8KKwl9Cit9CisKKy8qIGFsaV9zZXRfZGFjX2NoYW5uZWxzCisgKgorICogIENvbmZpZ3VyZSB0aGUgY29kZWMncyBtdWx0aS1jaGFubmVsIERBQ3MKKyAqCisgKiAgVGhlIGxvZ2ljIGlzIGJhY2t3YXJkcy4gU2V0dGluZyB0aGUgYml0IHRvIDEgdHVybnMgb2ZmIHRoZSBEQUMuIAorICoKKyAqICBXaGF0IGFib3V0IHRoZSBJQ0g/IFdlIGN1cnJlbnRseSBjb25maWd1cmUgaXQgdXNpbmcgdGhlCisgKiAgU05EQ1RMX0RTUF9DSEFOTkVMUyBpb2N0bC4gIElmIHdlJ3JlIHR1cm5uaW5nIG9uIHRoZSBEQUMsIAorICogIGRvZXMgdGhhdCBpbXBseSB0aGF0IHdlIHdhbnQgdGhlIElDSCBzZXQgdG8gc3VwcG9ydAorICogIHRoZXNlIGNoYW5uZWxzPworICogIAorICogIFRPRE86CisgKiAgICB2YWlsaWRhdGUgdGhhdCB0aGUgY29kZWMgcmVhbGx5IHN1cHBvcnRzIHRoZXNlIERBQ3MKKyAqICAgIGJlZm9yZSB0dXJuaW5nIHRoZW0gb24uIAorICovCitzdGF0aWMgdm9pZCBhbGlfc2V0X2RhY19jaGFubmVscyhzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSwgaW50IGNoYW5uZWwpCit7CisJaW50IGF1ZF9yZWc7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gc3RhdGUtPmNhcmQtPmFjOTdfY29kZWNbMF07CisKKwlhdWRfcmVnID0gYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJYXVkX3JlZyB8PSBBQzk3X0VBX1BSSSB8IEFDOTdfRUFfUFJKIHwgQUM5N19FQV9QUks7CisJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICY9IH4oU1VSUl9PTiB8IENFTlRFUl9MRkVfT04pOworCisJc3dpdGNoIChjaGFubmVsKSB7CisJY2FzZSAyOgkJLyogYWx3YXlzIGVuYWJsZWQgKi8KKwkJYnJlYWs7CisJY2FzZSA0OgorCQlhdWRfcmVnICY9IH5BQzk3X0VBX1BSSjsKKwkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzIHw9IFNVUlJfT047CisJCWJyZWFrOworCWNhc2UgNjoKKwkJYXVkX3JlZyAmPSB+KEFDOTdfRUFfUFJKIHwgQUM5N19FQV9QUkkgfCBBQzk3X0VBX1BSSyk7CisJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyB8PSBTVVJSX09OIHwgQ0VOVEVSX0xGRV9PTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIGF1ZF9yZWcpOworCit9CisKKy8qIHNldCBwbGF5YmFjayBzYW1wbGUgcmF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBhbGlfc2V0X2RhY19yYXRlKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdTMyIG5ld19yYXRlOworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IHN0YXRlLT5jYXJkLT5hYzk3X2NvZGVjWzBdOworCisJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiAweDAwMDEpKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IGNsb2NraW5nOworCQlyZXR1cm4gY2xvY2tpbmc7CisJfQorCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgODAwMCkKKwkJcmF0ZSA9IDgwMDA7CisJZG1hYnVmLT5yYXRlID0gcmF0ZTsKKworCS8qCisJICogICAgICBBZGp1c3QgZm9yIG1pc2Nsb2NrZWQgY3JhcAorCSAqLworCisJcmF0ZSA9IChyYXRlICogY2xvY2tpbmcpIC8gNDgwMDA7CisKKwlpZiAoc3RyaWN0X2Nsb2NraW5nICYmIHJhdGUgPCA4MDAwKSB7CisJCXJhdGUgPSA4MDAwOworCQlkbWFidWYtPnJhdGUgPSAocmF0ZSAqIDQ4MDAwKSAvIGNsb2NraW5nOworCX0KKworCW5ld19yYXRlID0gYWM5N19zZXRfZGFjX3JhdGUoY29kZWMsIHJhdGUpOworCWlmIChuZXdfcmF0ZSAhPSByYXRlKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IChuZXdfcmF0ZSAqIDQ4MDAwKSAvIGNsb2NraW5nOworCX0KKwlyYXRlID0gbmV3X3JhdGU7CisJcmV0dXJuIGRtYWJ1Zi0+cmF0ZTsKK30KKworLyogc2V0IHJlY29yZGluZyBzYW1wbGUgcmF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBhbGlfc2V0X2FkY19yYXRlKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdTMyIG5ld19yYXRlOworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IHN0YXRlLT5jYXJkLT5hYzk3X2NvZGVjWzBdOworCisJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiAweDAwMDEpKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IGNsb2NraW5nOworCQlyZXR1cm4gY2xvY2tpbmc7CisJfQorCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgODAwMCkKKwkJcmF0ZSA9IDgwMDA7CisJZG1hYnVmLT5yYXRlID0gcmF0ZTsKKworCS8qCisJICogICAgICBBZGp1c3QgZm9yIG1pc2Nsb2NrZWQgY3JhcAorCSAqLworCisJcmF0ZSA9IChyYXRlICogY2xvY2tpbmcpIC8gNDgwMDA7CisJaWYgKHN0cmljdF9jbG9ja2luZyAmJiByYXRlIDwgODAwMCkgeworCQlyYXRlID0gODAwMDsKKwkJZG1hYnVmLT5yYXRlID0gKHJhdGUgKiA0ODAwMCkgLyBjbG9ja2luZzsKKwl9CisKKwluZXdfcmF0ZSA9IGFjOTdfc2V0X2FkY19yYXRlKGNvZGVjLCByYXRlKTsKKworCWlmIChuZXdfcmF0ZSAhPSByYXRlKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IChuZXdfcmF0ZSAqIDQ4MDAwKSAvIGNsb2NraW5nOworCQlyYXRlID0gbmV3X3JhdGU7CisJfQorCXJldHVybiBkbWFidWYtPnJhdGU7Cit9CisKKy8qIHNldCBjb2RlYyBpbmRlcGVuZGVudCBzcGRpZm91dCBzYW1wbGUgcmF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBhbGlfc2V0X2NvZGVjc3BkaWZvdXRfcmF0ZShzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCByYXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCisJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiAweDAwMDEpKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IGNsb2NraW5nOworCQlyZXR1cm4gY2xvY2tpbmc7CisJfQorCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgODAwMCkKKwkJcmF0ZSA9IDgwMDA7CisJZG1hYnVmLT5yYXRlID0gcmF0ZTsKKworCXJldHVybiBkbWFidWYtPnJhdGU7Cit9CisKKy8qIHNldCAgY29udHJvbGxlciBpbmRlcGVuZGVudCBzcGRpZiBvdXQgZnVuY3Rpb24gc2FtcGxlIHJhdGUgKi8KK3N0YXRpYyB2b2lkIGFsaV9zZXRfc3BkaWZvdXRfcmF0ZShzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSwKKwkJCQkgIHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIGNoYXIgY2hfc3Rfc2VsOworCXVuc2lnbmVkIHNob3J0IHN0YXR1c19yYXRlOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSA0NDEwMDoKKwkJc3RhdHVzX3JhdGUgPSAwOworCQlicmVhazsKKwljYXNlIDMyMDAwOgorCQlzdGF0dXNfcmF0ZSA9IDB4MzAwOworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCWRlZmF1bHQ6CisJCXN0YXR1c19yYXRlID0gMHgyMDA7CisJCWJyZWFrOworCX0KKworCWNoX3N0X3NlbCA9IGluYihzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX1NQRElGSUNTKSAmIEFMSV9TUERJRl9PVVRfQ0hfU1RBVFVTOwkvL3NlbGVjdCBzcGRpZl9vdXQKKworCWNoX3N0X3NlbCB8PSAweDgwOwkvL3NlbGVjdCByaWdodAorCW91dGIoY2hfc3Rfc2VsLCAoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TUERJRklDUykpOworCW91dGIoc3RhdHVzX3JhdGUgfCAweDIwLCAoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TUERJRkNTUiArIDIpKTsKKworCWNoX3N0X3NlbCAmPSAofjB4ODApOwkvL3NlbGVjdCBsZWZ0CisJb3V0YihjaF9zdF9zZWwsIChzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX1NQRElGSUNTKSk7CisJb3V0dyhzdGF0dXNfcmF0ZSB8IDB4MTAsIChzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX1NQRElGQ1NSICsgMikpOworfQorCisvKiBnZXQgY3VycmVudCBwbGF5YmFjay9yZWNvcmRpbmcgZG1hIGJ1ZmZlciBwb2ludGVyIChieXRlIG9mZnNldCBmcm9tIExCQSksCisgICBjYWxsZWQgd2l0aCBzcGlubG9jayBoZWxkISAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGFsaV9nZXRfZG1hX2FkZHIoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUsIGludCByZWMpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgaW50IGNpdiwgb2Zmc2V0LCBwb3J0LCBwb3J0X3BpY2I7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlpZiAoIWRtYWJ1Zi0+ZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCWlmIChyZWMgPT0gMSkKKwkJcG9ydCA9IHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBkbWFidWYtPnJlYWRfY2hhbm5lbC0+cG9ydDsKKwllbHNlIGlmIChyZWMgPT0gMikKKwkJcG9ydCA9IHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBkbWFidWYtPmNvZGVjX3NwZGlmb3V0X2NoYW5uZWwtPnBvcnQ7CisJZWxzZSBpZiAocmVjID09IDMpCisJCXBvcnQgPSBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgZG1hYnVmLT5jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwtPnBvcnQ7CisJZWxzZQorCQlwb3J0ID0gc3RhdGUtPmNhcmQtPmlvYmFzZSArIGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbC0+cG9ydDsKKworCXBvcnRfcGljYiA9IHBvcnQgKyBPRkZfUElDQjsKKworCWRvIHsKKwkJY2l2ID0gaW5iKHBvcnQgKyBPRkZfQ0lWKSAmIDMxOworCQlvZmZzZXQgPSBpbncocG9ydF9waWNiKTsKKwkJLyogTXVzdCBoYXZlIGEgZGVsYXkgaGVyZSEgKi8KKwkJaWYgKG9mZnNldCA9PSAwKQorCQkJdWRlbGF5KDEpOworCisJCS8qIFJlcmVhZCBib3RoIHJlZ2lzdGVycyBhbmQgbWFrZSBzdXJlIHRoYXQgdGhhdCB0b3RhbAorCQkgKiBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgcmVhZGluZyB0byB0aGUgc2Vjb25kIGlzIDAuCisJCSAqIFRoZXJlIGlzIGFuIGlzc3VlIHdpdGggU2lTIGhhcmR3YXJlIHdoZXJlIGl0IHdpbGwgY291bnQKKwkJICogcGljYiBkb3duIHRvIDAsIHRoZW4gdXBkYXRlIGNpdiB0byB0aGUgbmV4dCB2YWx1ZSwKKwkJICogdGhlbiBzZXQgdGhlIG5ldyBwaWNiIHRvIGZyYWdzaXplIGJ5dGVzLiAgV2UgY2FuIGNhdGNoCisJCSAqIGl0IGJldHdlZW4gdGhlIGNpdiB1cGRhdGUgYW5kIHRoZSBwaWNiIHVwZGF0ZSwgbWFraW5nCisJCSAqIGl0IGxvb2sgYXMgdGhvdWdoIHdlIGFyZSAxIGZyYWdzaXplIGFoZWFkIG9mIHdoZXJlIHdlCisJCSAqIGFyZS4gIFRoZSBuZXh0IHRvIHdlIGdldCB0aGUgYWRkcmVzcyB0aG91Z2gsIGl0IHdpbGwKKwkJICogYmUgYmFjayBpbiB0aGRlbGF5IGlzIG1vcmUgdGhhbiBsb25nIGVub3VnaAorCQkgKiB0aGF0IHdlIHdvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGNoaXAgc3RpbGwgYmVpbmcKKwkJICogb3V0IG9mIHN5bmMgd2l0aCByZWFsaXR5IDstKQorCQkgKi8KKwl9IHdoaWxlIChjaXYgIT0gKGluYihwb3J0ICsgT0ZGX0NJVikgJiAzMSkgfHwgb2Zmc2V0ICE9IGludyhwb3J0X3BpY2IpKTsKKworCWRhdGEgPSAoKGNpdiArIDEpICogZG1hYnVmLT5mcmFnc2l6ZSAtICgyICogb2Zmc2V0KSkgJSBkbWFidWYtPmRtYXNpemU7CisJaWYgKGludyhwb3J0X3BpY2IpID09IDApCisJCWRhdGEgLT0gMjA0ODsKKworCXJldHVybiBkYXRhOworfQorCisvKiBTdG9wIHJlY29yZGluZyAobG9jayBoZWxkKSAqLworc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF9hZGMoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisKKwlkbWFidWYtPmVuYWJsZSAmPSB+QURDX1JVTk5JTkc7CisKKwlvdXRsKCgxIDw8IDE4KSB8ICgxIDw8IDE2KSwgY2FyZC0+aW9iYXNlICsgQUxJX0RNQUNSKTsKKwl1ZGVsYXkoMSk7CisKKwlvdXRiKDAsIGNhcmQtPmlvYmFzZSArIFBJX0NSKTsKKwl3aGlsZSAoaW5iKGNhcmQtPmlvYmFzZSArIFBJX0NSKSAhPSAwKTsKKworCS8vIG5vdyBjbGVhciBhbnkgbGF0ZW50IGludGVycnVwdCBiaXRzIChsaWtlIHRoZSBoYWx0IGJpdCkKKwlvdXRiKGluYihjYXJkLT5pb2Jhc2UgKyBQSV9TUikgfCAweDAwMWUsIGNhcmQtPmlvYmFzZSArIFBJX1NSKTsKKwlvdXRsKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpICYgSU5UX1BDTUlOLCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJX19zdG9wX2FkYyhzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdGFydF9hZGMoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisKKwlpZiAoZG1hYnVmLT5jb3VudCA8IGRtYWJ1Zi0+ZG1hc2l6ZSAmJiBkbWFidWYtPnJlYWR5CisJICAgICYmICFkbWFidWYtPmVuYWJsZSAmJiAoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9JTlBVVCkpIHsKKwkJZG1hYnVmLT5lbmFibGUgfD0gQURDX1JVTk5JTkc7CisJCW91dGIoKDEgPDwgNCkgfCAoMSA8PCAyKSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIFBJX0NSKTsKKwkJaWYgKHN0YXRlLT5jYXJkLT5jaGFubmVsWzBdLnVzZWQgPT0gMSkKKwkJCW91dGwoMSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9ETUFDUik7CS8vIERNQSBDT05UUk9MIFJFR0lTVFJFUgorCQl1ZGVsYXkoMTAwKTsKKwkJaWYgKHN0YXRlLT5jYXJkLT5jaGFubmVsWzJdLnVzZWQgPT0gMSkKKwkJCW91dGwoKDEgPDwgMiksIHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfRE1BQ1IpOwkvL0RNQSBDT05UUk9MIFJFR0lTVEVSCisJCXVkZWxheSgxMDApOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RhcnRfYWRjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIHN0b3AgcGxheWJhY2sgKGxvY2sgaGVsZCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3BfZGFjKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCisJZG1hYnVmLT5lbmFibGUgJj0gfkRBQ19SVU5OSU5HOworCW91dGwoMHgwMDAyMDAwMCwgY2FyZC0+aW9iYXNlICsgMHgwOCk7CisJb3V0YigwLCBjYXJkLT5pb2Jhc2UgKyBQT19DUik7CisJd2hpbGUgKGluYihjYXJkLT5pb2Jhc2UgKyBQT19DUikgIT0gMCkKKwkJY3B1X3JlbGF4KCk7CisKKwlvdXRiKGluYihjYXJkLT5pb2Jhc2UgKyBQT19TUikgfCAweDAwMWUsIGNhcmQtPmlvYmFzZSArIFBPX1NSKTsKKworCW91dGwoaW5sKGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUlJVUFRTUikgJiBJTlRfUENNT1VULCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJX19zdG9wX2RhYyhzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdGFydF9kYWMoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJaWYgKGRtYWJ1Zi0+Y291bnQgPiAwICYmIGRtYWJ1Zi0+cmVhZHkgJiYgIWRtYWJ1Zi0+ZW5hYmxlICYmCisJICAgIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX09VVFBVVCkpIHsKKwkJZG1hYnVmLT5lbmFibGUgfD0gREFDX1JVTk5JTkc7CisJCW91dGIoKDEgPDwgNCkgfCAoMSA8PCAyKSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIFBPX0NSKTsKKwkJb3V0bCgoMSA8PCAxKSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIDB4MDgpOwkvL2RtYSBjb250cm9sIHJlZ2lzdGVyCisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RhcnRfZGFjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIHN0b3AgY29kZWMgYW5kIGNvbnRyb2xsZXIgc3BkaWYgb3V0ICAobG9jayBoZWxkKSAqLworc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF9zcGRpZm91dChzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKworCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCWRtYWJ1Zi0+ZW5hYmxlICY9IH5DT0RFQ19TUERJRk9VVF9SVU5OSU5HOworCQlvdXRsKCgxIDw8IDE5KSwgY2FyZC0+aW9iYXNlICsgMHgwOCk7CisJCW91dGIoMCwgY2FyZC0+aW9iYXNlICsgQ09ERUNTUERJRk9VVF9DUik7CisKKwkJd2hpbGUgKGluYihjYXJkLT5pb2Jhc2UgKyBDT0RFQ1NQRElGT1VUX0NSKSAhPSAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJb3V0YihpbmIoY2FyZC0+aW9iYXNlICsgQ09ERUNTUERJRk9VVF9TUikgfCAweDAwMWUsIGNhcmQtPmlvYmFzZSArIENPREVDU1BESUZPVVRfU1IpOworCQlvdXRsKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpICYgSU5UX0NPREVDU1BESUZPVVQsIGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUlJVUFRTUik7CisJfSBlbHNlIHsKKwkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJZG1hYnVmLT5lbmFibGUgJj0gfkNPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORzsKKwkJCW91dGwoKDEgPDwgMjMpLCBjYXJkLT5pb2Jhc2UgKyAweDA4KTsKKwkJCW91dGIoMCwgY2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX0NSKTsKKwkJCXdoaWxlIChpbmIoY2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX0NSKSAhPSAwKQorCQkJCWNwdV9yZWxheCgpOworCQkJb3V0YihpbmIoY2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX1NSKSB8IDB4MDAxZSwgY2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX1NSKTsKKwkJCW91dGwoaW5sKGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUlJVUFRTUikgJiBJTlRfU1BESUZPVVQsIGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUlJVUFRTUik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0b3Bfc3BkaWZvdXQoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdGFydF9zcGRpZm91dChzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlpZiAoZG1hYnVmLT5jb3VudCA+IDAgJiYgZG1hYnVmLT5yZWFkeSAmJiAhZG1hYnVmLT5lbmFibGUgJiYKKwkgICAgKGRtYWJ1Zi0+dHJpZ2dlciAmIFNQRElGX0VOQUJMRV9PVVRQVVQpKSB7CisJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlkbWFidWYtPmVuYWJsZSB8PSBDT0RFQ19TUERJRk9VVF9SVU5OSU5HOworCQkJb3V0YigoMSA8PCA0KSB8ICgxIDw8IDIpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQ09ERUNTUERJRk9VVF9DUik7CisJCQlvdXRsKCgxIDw8IDMpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgMHgwOCk7CS8vZG1hIGNvbnRyb2wgcmVnaXN0ZXIKKwkJfSBlbHNlIHsKKwkJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQlkbWFidWYtPmVuYWJsZSB8PSBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkc7CisJCQkJb3V0YigoMSA8PCA0KSB8ICgxIDw8IDIpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX0NSKTsKKwkJCQlvdXRsKCgxIDw8IDcpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgMHgwOCk7CS8vZG1hIGNvbnRyb2wgcmVnaXN0ZXIKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfc3BkaWZvdXQoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RhcnRfc3BkaWZvdXQoc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNi1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCisvKiBhbGxvY2F0ZSBETUEgYnVmZmVyLCBwbGF5YmFjayAsIHJlY29yZGluZyxzcGRpZiBvdXQgIGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIHNlcGFyYXRlbHkgKi8KK3N0YXRpYyBpbnQgYWxsb2NfZG1hYnVmKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXZvaWQgKnJhd2J1ZiA9IE5VTEw7CisJaW50IG9yZGVyLCBzaXplOworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgYW55IG9zcyBmcmFnIHBhcmFtcywgdGhlbiB1c2Ugb3VyIGRlZmF1bHQgb25lcyAqLworCWlmIChkbWFidWYtPm9zc21heGZyYWdzID09IDApCisJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSA0OworCWlmIChkbWFidWYtPm9zc2ZyYWdzaXplID09IDApCisJCWRtYWJ1Zi0+b3NzZnJhZ3NpemUgPSAoUEFHRV9TSVpFIDw8IERNQUJVRl9ERUZBVUxUT1JERVIpIC8gZG1hYnVmLT5vc3NtYXhmcmFnczsKKwlzaXplID0gZG1hYnVmLT5vc3NmcmFnc2l6ZSAqIGRtYWJ1Zi0+b3NzbWF4ZnJhZ3M7CisKKwlpZiAoZG1hYnVmLT5yYXdidWYgJiYgKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSA9PSBzaXplKQorCQlyZXR1cm4gMDsKKwkvKiBhbGxvYyBlbm91Z2ggdG8gc2F0aXNmeSB0aGUgb3NzIHBhcmFtcyAqLworCWZvciAob3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pIHsKKwkJaWYgKChQQUdFX1NJWkUgPDwgb3JkZXIpID4gc2l6ZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKHJhd2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHN0YXRlLT5jYXJkLT5wY2lfZGV2LAorCQkJCQkJICAgUEFHRV9TSVpFIDw8IG9yZGVyLAorCQkJCQkJICAgJmRtYWJ1Zi0+ZG1hX2hhbmRsZSkpKQorCQkJYnJlYWs7CisJfQorCWlmICghcmF3YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRtYWJ1Zi0+cmVhZHkgPSBkbWFidWYtPm1hcHBlZCA9IDA7CisJZG1hYnVmLT5yYXdidWYgPSByYXdidWY7CisJZG1hYnVmLT5idWZvcmRlciA9IG9yZGVyOworCisJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCisJcGVuZCA9IHZpcnRfdG9fcGFnZShyYXdidWYgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpOworCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShyYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCXJldHVybiAwOworfQorCisvKiBmcmVlIERNQSBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWlmIChkbWFidWYtPnJhd2J1ZikgeworCQkvKiB1bmRvIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoc3RhdGUtPmNhcmQtPnBjaV9kZXYsCisJCQkJICAgIFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyLAorCQkJCSAgICBkbWFidWYtPnJhd2J1ZiwgZG1hYnVmLT5kbWFfaGFuZGxlKTsKKwl9CisJZG1hYnVmLT5yYXdidWYgPSBOVUxMOworCWRtYWJ1Zi0+bWFwcGVkID0gZG1hYnVmLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgYWxpX2NoYW5uZWwgKmMgPSBOVUxMOworCXN0cnVjdCBzZ19pdGVtICpzZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisJdW5zaWduZWQgZnJhZ2ludDsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQlfX3N0b3BfZGFjKHN0YXRlKTsKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKKwkJX19zdG9wX2FkYyhzdGF0ZSk7CisJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09ERUNfU1BESUZPVVRfUlVOTklORykKKwkJX19zdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkcpCisJCV9fc3RvcF9zcGRpZm91dChzdGF0ZSk7CisKKwlkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5lcnJvciA9IDA7CisJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyLCBsZXQgYWxsb2NfZG1hYnVmIGRldGVybWluZSBpZiB3ZSBhcmUgYWxyZWFkeQorCSAqIGFsbG9jYXRlZCB3ZWxsIGVub3VnaCBvciBpZiB3ZSBzaG91bGQgcmVwbGFjZSB0aGUgY3VycmVudCBidWZmZXIKKwkgKiAoYXNzdW1pbmcgb25lIGlzIGFscmVhZHkgYWxsb2NhdGVkLCBpZiBpdCBpc24ndCwgdGhlbiBhbGxvY2F0ZSBpdCkuCisJICovCisJaWYgKChyZXQgPSBhbGxvY19kbWFidWYoc3RhdGUpKSkKKwkJcmV0dXJuIHJldDsKKworCS8qIEZJWE1FOiBmaWd1cmUgb3V0IGFsbCB0aGlzIE9TUyBmcmFnbWVudCBzdHVmZiAqLworCS8qIEkgZGlkLCBpdCBub3cgZG9lcyB3aGF0IGl0IHNob3VsZCBhY2NvcmRpbmcgdG8gdGhlIE9TUyBBUEkuICBETCAqLworCS8qIFdlIG1heSBub3QgaGF2ZSByZWFsbG9jZWQgb3VyIGRtYWJ1ZiwgYnV0IHRoZSBmcmFnbWVudCBzaXplIHRvCisJICogZnJhZ21lbnQgbnVtYmVyIHJhdGlvIG1heSBoYXZlIGNoYW5nZWQsIHNvIGdvIGFoZWFkIGFuZCByZXByb2dyYW0KKwkgKiB0aGluZ3MKKwkgKi8KKworCWRtYWJ1Zi0+ZG1hc2l6ZSA9IFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyOworCWRtYWJ1Zi0+bnVtZnJhZyA9IFNHX0xFTjsKKwlkbWFidWYtPmZyYWdzaXplID0gZG1hYnVmLT5kbWFzaXplIC8gZG1hYnVmLT5udW1mcmFnOworCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSBkbWFidWYtPmZyYWdzaXplID4+IDE7CisJZG1hYnVmLT51c2VyZnJhZ3NpemUgPSBkbWFidWYtPm9zc2ZyYWdzaXplOworCWRtYWJ1Zi0+dXNlcmZyYWdzID0gZG1hYnVmLT5kbWFzaXplIC8gZG1hYnVmLT5vc3NmcmFnc2l6ZTsKKworCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgMCwgZG1hYnVmLT5kbWFzaXplKTsKKworCWlmIChkbWFidWYtPm9zc21heGZyYWdzID09IDQpIHsKKwkJZnJhZ2ludCA9IDg7CisJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gMjsKKwl9IGVsc2UgaWYgKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPT0gOCkgeworCQlmcmFnaW50ID0gNDsKKwkJZG1hYnVmLT5mcmFnc2hpZnQgPSAzOworCX0gZWxzZSBpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA9PSAxNikgeworCQlmcmFnaW50ID0gMjsKKwkJZG1hYnVmLT5mcmFnc2hpZnQgPSA0OworCX0gZWxzZSB7CisJCWZyYWdpbnQgPSAxOworCQlkbWFidWYtPmZyYWdzaGlmdCA9IDU7CisJfQorCS8qCisJICogICAgICBOb3cgc2V0IHVwIHRoZSByaW5nIAorCSAqLworCisJaWYgKHJlYyA9PSAxKQorCQljID0gZG1hYnVmLT5yZWFkX2NoYW5uZWw7CisJZWxzZSBpZiAocmVjID09IDIpCisJCWMgPSBkbWFidWYtPmNvZGVjX3NwZGlmb3V0X2NoYW5uZWw7CisJZWxzZSBpZiAocmVjID09IDMpCisJCWMgPSBkbWFidWYtPmNvbnRyb2xsZXJfc3BkaWZvdXRfY2hhbm5lbDsKKwllbHNlIGlmIChyZWMgPT0gMCkKKwkJYyA9IGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbDsKKwlpZiAoYyAhPSBOVUxMKSB7CisJCXNnID0gJmMtPnNnWzBdOworCQkvKgorCQkgKiAgICAgIExvYWQgdXAgMzIgc2cgZW50cmllcyBhbmQgdGFrZSBhbiBpbnRlcnJ1cHQgYXQgaGFsZgorCQkgKiAgICAgIHdheSAod2UgbWlnaHQgd2FudCBtb3JlIGludGVycnVwdHMgbGF0ZXIuLikgCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgZG1hYnVmLT5udW1mcmFnOyBpKyspIHsKKwkJCXNnLT5idXNhZGRyID0KKwkJCSAgICB2aXJ0X3RvX2J1cyhkbWFidWYtPnJhd2J1ZiArCisJCQkJCWRtYWJ1Zi0+ZnJhZ3NpemUgKiBpKTsKKwkJCS8vIHRoZSBjYXJkIHdpbGwgYWx3YXlzIGJlIGRvaW5nIDE2Yml0IHN0ZXJlbworCQkJc2ctPmNvbnRyb2wgPSBkbWFidWYtPmZyYWdzYW1wbGVzOworCQkJc2ctPmNvbnRyb2wgfD0gQ09OX0JVRlBBRDsJLy9JIG1vZGlmeQorCQkJLy8gc2V0IHVzIHVwIHRvIGdldCBJT0MgaW50ZXJydXB0cyBhcyBvZnRlbiBhcyBuZWVkZWQgdG8KKwkJCS8vIHNhdGlzZnkgbnVtZnJhZyByZXF1aXJlbWVudHMsIG5vIG1vcmUKKwkJCWlmICgoKGkgKyAxKSAlIGZyYWdpbnQpID09IDApIHsKKwkJCQlzZy0+Y29udHJvbCB8PSBDT05fSU9DOworCQkJfQorCQkJc2crKzsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJb3V0YigyLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgYy0+cG9ydCArIE9GRl9DUik7CS8qIHJlc2V0IERNQSBtYWNoaW5lICovCisJCW91dGwodmlydF90b19idXMoJmMtPnNnWzBdKSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIGMtPnBvcnQgKyBPRkZfQkRCQVIpOworCQlvdXRiKDAsIHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBjLT5wb3J0ICsgT0ZGX0NJVik7CisJCW91dGIoMCwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIGMtPnBvcnQgKyBPRkZfTFZJKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl9CisJLyogc2V0IHRoZSByZWFkeSBmbGFnIGZvciB0aGUgZG1hIGJ1ZmZlciAqLworCWRtYWJ1Zi0+cmVhZHkgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2FsaV91cGRhdGVfbHZpKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlLCBpbnQgcmVjKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCB4LCBwb3J0OworCXBvcnQgPSBzdGF0ZS0+Y2FyZC0+aW9iYXNlOworCWlmIChyZWMgPT0gMSkKKwkJcG9ydCArPSBkbWFidWYtPnJlYWRfY2hhbm5lbC0+cG9ydDsKKwllbHNlIGlmIChyZWMgPT0gMikKKwkJcG9ydCArPSBkbWFidWYtPmNvZGVjX3NwZGlmb3V0X2NoYW5uZWwtPnBvcnQ7CisJZWxzZSBpZiAocmVjID09IDMpCisJCXBvcnQgKz0gZG1hYnVmLT5jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwtPnBvcnQ7CisJZWxzZSBpZiAocmVjID09IDApCisJCXBvcnQgKz0gZG1hYnVmLT53cml0ZV9jaGFubmVsLT5wb3J0OworCS8qIGlmIHdlIGFyZSBjdXJyZW50bHkgc3RvcHBlZCwgdGhlbiBvdXIgQ0lWIGlzIGFjdHVhbGx5IHNldCB0byBvdXIKKwkgKiAqbGFzdCogc2cgc2VnbWVudCBhbmQgd2UgYXJlIHJlYWR5IHRvIHdyYXAgdG8gdGhlIG5leHQuICBIb3dldmVyLAorCSAqIGlmIHdlIHNldCBvdXIgTFZJIHRvIHRoZSBsYXN0IHNnIHNlZ21lbnQsIHRoZW4gaXQgd29uJ3Qgd3JhcCB0bworCSAqIHRoZSBuZXh0IHNnIHNlZ21lbnQsIGl0IHdvbid0IGV2ZW4gZ2V0IGEgc3RhcnQuICBTbywgaW5zdGVhZCwgd2hlbgorCSAqIHdlIGFyZSBzdG9wcGVkLCB3ZSBzZXQgYm90aCB0aGUgTFZJIHZhbHVlIGFuZCBhbHNvIHdlIGluY3JlbWVudAorCSAqIHRoZSBDSVYgdmFsdWUgdG8gdGhlIG5leHQgc2cgc2VnbWVudCB0byBiZSBwbGF5ZWQgc28gdGhhdCB3aGVuCisJICogd2UgY2FsbCBzdGFydF97ZGFjLGFkY30sIHRoaW5ncyB3aWxsIG9wZXJhdGUgcHJvcGVybHkKKwkgKi8KKwlpZiAoIWRtYWJ1Zi0+ZW5hYmxlICYmIGRtYWJ1Zi0+cmVhZHkpIHsKKwkJaWYgKHJlYyAmJiBkbWFidWYtPmNvdW50IDwgZG1hYnVmLT5kbWFzaXplICYmIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX0lOUFVUKSkgeworCQkJb3V0YigoaW5iKHBvcnQgKyBPRkZfQ0lWKSArIDEpICYgMzEsIHBvcnQgKyBPRkZfTFZJKTsKKwkJCV9fc3RhcnRfYWRjKHN0YXRlKTsKKwkJCXdoaWxlICghIChpbmIocG9ydCArIE9GRl9DUikgJiAoKDEgPDwgNCkgfCAoMSA8PCAyKSkpKQorCQkJCWNwdV9yZWxheCgpOworCQl9IGVsc2UgaWYgKCFyZWMgJiYgZG1hYnVmLT5jb3VudCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9PVVRQVVQpKSB7CisJCQlvdXRiKChpbmIocG9ydCArIE9GRl9DSVYpICsgMSkgJiAzMSwgcG9ydCArIE9GRl9MVkkpOworCQkJX19zdGFydF9kYWMoc3RhdGUpOworCQkJd2hpbGUgKCEoaW5iKHBvcnQgKyBPRkZfQ1IpICYgKCgxIDw8IDQpIHwgKDEgPDwgMikpKSkKKwkJCQljcHVfcmVsYXgoKTsKKwkJfSBlbHNlIGlmIChyZWMgJiYgZG1hYnVmLT5jb3VudCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgU1BESUZfRU5BQkxFX09VVFBVVCkpIHsKKwkJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQkJLy8gb3V0YigoaW5iKHBvcnQrT0ZGX0NJVikpJjMxLCBwb3J0K09GRl9MVkkpOworCQkJCW91dGIoKGluYihwb3J0ICsgT0ZGX0NJVikgKyAxKSAmIDMxLCBwb3J0ICsgT0ZGX0xWSSk7CisJCQkJX19zdGFydF9zcGRpZm91dChzdGF0ZSk7CisJCQkJd2hpbGUgKCEoaW5iKHBvcnQgKyBPRkZfQ1IpICYgKCgxIDw8IDQpIHwgKDEgPDwgMikpKSkKKwkJCQkJY3B1X3JlbGF4KCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQkJb3V0YigoaW5iKHBvcnQgKyBPRkZfQ0lWKSArIDEpICYgMzEsIHBvcnQgKyBPRkZfTFZJKTsKKwkJCQkJX19zdGFydF9zcGRpZm91dChzdGF0ZSk7CisJCQkJCXdoaWxlICghKGluYihwb3J0ICsgT0ZGX0NSKSAmICgoMSA8PCA0KSB8ICgxIDw8IDIpKSkpCisJCQkJCQljcHVfcmVsYXgoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiBzd3B0ciAtIDEgaXMgdGhlIHRhaWwgb2Ygb3VyIHRyYW5zZmVyICovCisJeCA9IChkbWFidWYtPmRtYXNpemUgKyBkbWFidWYtPnN3cHRyIC0gMSkgJSBkbWFidWYtPmRtYXNpemU7CisJeCAvPSBkbWFidWYtPmZyYWdzaXplOworCW91dGIoeCwgcG9ydCArIE9GRl9MVkkpOworfQorCitzdGF0aWMgdm9pZCBhbGlfdXBkYXRlX2x2aShzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSwgaW50IHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmICghZG1hYnVmLT5yZWFkeSkKKwkJcmV0dXJuOworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCV9fYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIHJlYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyogdXBkYXRlIGJ1ZmZlciBtYW5hbmdlbWVudCBwb2ludGVycywgZXNwZWNpYWxseSwgZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLworc3RhdGljIHZvaWQgYWxpX3VwZGF0ZV9wdHIoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgaHdwdHI7CisJaW50IGRpZmY7CisJCisJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgREFDICovCisJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CisJCS8qIHVwZGF0ZSBoYXJkd2FyZSBwb2ludGVyICovCisJCWh3cHRyID0gYWxpX2dldF9kbWFfYWRkcihzdGF0ZSwgMSk7CisJCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJZG1hYnVmLT5od3B0ciA9IGh3cHRyOworCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biAqLworCQkJLyogdGhpcyBpcyBub3JtYWwgZm9yIHRoZSBlbmQgb2YgYSByZWFkICovCisJCQkvKiBvbmx5IGdpdmUgYW4gZXJyb3IgaWYgd2Ugd2VudCBwYXN0IHRoZSAqLworCQkJLyogbGFzdCB2YWxpZCBzZyBlbnRyeSAqLworCQkJaWYgKChpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIFBJX0NJVikgJiAzMSkgIT0gKGluYihzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgUElfTFZJKSAmIDMxKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFsaV9hdWRpbzogRE1BIG92ZXJydW4gb24gcmVhZFxuIik7CisJCQkJZG1hYnVmLT5lcnJvcisrOworCQkJfQorCQl9CisJCWlmIChkbWFidWYtPmNvdW50ID4gZG1hYnVmLT51c2VyZnJhZ3NpemUpCisJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCX0KKwkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBEQUMgKi8KKwlpZiAoZG1hYnVmLT5lbmFibGUgPT0gREFDX1JVTk5JTkcpIHsKKwkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KKwkJaHdwdHIgPSBhbGlfZ2V0X2RtYV9hZGRyKHN0YXRlLCAwKTsKKwkJZGlmZiA9CisJCSAgICAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLQorCQkgICAgIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOworI2lmIGRlZmluZWQoREVCVUdfSU5URVJSVVBUUykgfHwgZGVmaW5lZChERUJVR19NTUFQKQorCQlwcmludGsoIkRBQyBIV1AgJWQsJWQsJWRcbiIsIGh3cHRyLCBkbWFidWYtPmh3cHRyLCBkaWZmKTsKKyNlbmRpZgorCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApIHsKKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biAqLworCQkJLyogdGhpcyBpcyBub3JtYWwgZm9yIHRoZSBlbmQgb2YgYSB3cml0ZSAqLworCQkJLyogb25seSBnaXZlIGFuIGVycm9yIGlmIHdlIHdlbnQgcGFzdCB0aGUgKi8KKwkJCS8qIGxhc3QgdmFsaWQgc2cgZW50cnkgKi8KKwkJCWlmICgoaW5iKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBQT19DSVYpICYgMzEpICE9IChpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIFBPX0xWSSkgJiAzMSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGlfYXVkaW86IERNQSBvdmVycnVuIG9uIHdyaXRlXG4iKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiYWxpX2F1ZGlvOiBDSVYgJWQsIExWSSAlZCwgaHdwdHIgJXgsIGNvdW50ICVkXG4iLAorCQkJCSAgICAgCQkJaW5iKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBQT19DSVYpICYgMzEsCisJCQkJICAgICAJCQlpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIFBPX0xWSSkgJiAzMSwgCisJCQkJCQkJZG1hYnVmLT5od3B0ciwKKwkJCQkJCQlkbWFidWYtPmNvdW50KTsKKwkJCQlkbWFidWYtPmVycm9yKys7CisJCQl9CisJCX0KKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAoZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT51c2VyZnJhZ3NpemUpKQorCQkgICAgCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJfQorCisJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgQ09ERUMgU1BESUYgT1VUICovCisJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IENPREVDX1NQRElGT1VUX1JVTk5JTkcpIHsKKwkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KKwkJaHdwdHIgPSBhbGlfZ2V0X2RtYV9hZGRyKHN0YXRlLCAyKTsKKwkJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOworCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApIHsKKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biAqLworCQkJLyogdGhpcyBpcyBub3JtYWwgZm9yIHRoZSBlbmQgb2YgYSB3cml0ZSAqLworCQkJLyogb25seSBnaXZlIGFuIGVycm9yIGlmIHdlIHdlbnQgcGFzdCB0aGUgKi8KKwkJCS8qIGxhc3QgdmFsaWQgc2cgZW50cnkgKi8KKwkJCWlmICgoaW5iKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBDT0RFQ1NQRElGT1VUX0NJVikgJiAzMSkgIT0gKGluYihzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQ09ERUNTUERJRk9VVF9MVkkpICYgMzEpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxpX2F1ZGlvOiBETUEgb3ZlcnJ1biBvbiB3cml0ZVxuIik7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImFsaV9hdWRpbzogQ0lWICVkLCBMVkkgJWQsIGh3cHRyICV4LCBjb3VudCAlZFxuIiwgCisJCQkJICAgICAgICBpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIENPREVDU1BESUZPVVRfQ0lWKSAmIDMxLAorCQkJCQlpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIENPREVDU1BESUZPVVRfTFZJKSAmIDMxLAorCQkJCQlkbWFidWYtPmh3cHRyLCBkbWFidWYtPmNvdW50KTsKKwkJCQlkbWFidWYtPmVycm9yKys7CisJCQl9CisJCX0KKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAoZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT51c2VyZnJhZ3NpemUpKQorCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwl9CisJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgQ09OVFJPTExFUiBTUERJRiBPVVQgKi8KKwlpZiAoZG1hYnVmLT5lbmFibGUgPT0gQ09OVFJPTExFUl9TUERJRk9VVF9SVU5OSU5HKSB7CisJCS8qIHVwZGF0ZSBoYXJkd2FyZSBwb2ludGVyICovCisJCWh3cHRyID0gYWxpX2dldF9kbWFfYWRkcihzdGF0ZSwgMyk7CisJCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJZG1hYnVmLT5od3B0ciA9IGh3cHRyOworCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CisJCQkvKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4gKi8KKwkJCS8qIHRoaXMgaXMgbm9ybWFsIGZvciB0aGUgZW5kIG9mIGEgd3JpdGUgKi8KKwkJCS8qIG9ubHkgZ2l2ZSBhbiBlcnJvciBpZiB3ZSB3ZW50IHBhc3QgdGhlICovCisJCQkvKiBsYXN0IHZhbGlkIHNnIGVudHJ5ICovCisJCQlpZiAoKGluYihzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX0NJVikgJiAzMSkgIT0gKGluYihzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX0xWSSkgJiAzMSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJhbGlfYXVkaW86IERNQSBvdmVycnVuIG9uIHdyaXRlXG4iKTsKKwkJCQlwcmludGsoImFsaV9hdWRpbzogQ0lWICVkLCBMVkkgJWQsIGh3cHRyICV4LCAiCisJCQkJCSJjb3VudCAlZFxuIiwKKwkJCQkgICAgIAkJaW5iKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBDT05UUk9MTEVSU1BESUZPVVRfQ0lWKSAmIDMxLAorCQkJCSAgICAgCQlpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIENPTlRST0xMRVJTUERJRk9VVF9MVkkpICYgMzEsCisJCQkJICAgICAJCWRtYWJ1Zi0+aHdwdHIsIGRtYWJ1Zi0+Y291bnQpOworCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKKwkJCX0KKwkJfQorCQlpZiAoZG1hYnVmLT5jb3VudCA8IChkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPnVzZXJmcmFnc2l6ZSkpCisJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgYWxpX2dldF9mcmVlX3dyaXRlX3NwYWNlKHN0cnVjdAorCQkJCQkgICBhbGlfc3RhdGUKKwkJCQkJICAgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCBmcmVlOworCisJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CisJCWRtYWJ1Zi0+Y291bnQgPSAwOworCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwl9CisJZnJlZSA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIGRtYWJ1Zi0+c3dwdHI7CisJaWYgKChkbWFidWYtPmNvdW50ICsgZnJlZSkgPiBkbWFidWYtPmRtYXNpemUpeworCQlmcmVlID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKwl9CisJcmV0dXJuIGZyZWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFsaV9nZXRfYXZhaWxhYmxlX3JlYWRfZGF0YShzdHJ1Y3QKKwkJCQkJICAgICAgYWxpX3N0YXRlCisJCQkJCSAgICAgICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlpbnQgYXZhaWw7CisJYWxpX3VwZGF0ZV9wdHIoc3RhdGUpOworCS8vIGNhdGNoIG92ZXJydW5zIGR1cmluZyByZWNvcmQKKwlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5kbWFzaXplOworCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwl9CisJYXZhaWwgPSBkbWFidWYtPmNvdW50OworCWF2YWlsIC09IChkbWFidWYtPmh3cHRyICUgZG1hYnVmLT5mcmFnc2l6ZSk7CisJaWYgKGF2YWlsIDwgMCkKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKGF2YWlsKTsKK30KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUsIGludCBzaWduYWxzX2FsbG93ZWQpCit7CisKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdG1vOworCWludCBjb3VudDsKKwlpZiAoIWRtYWJ1Zi0+cmVhZHkpCisJCXJldHVybiAwOworCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQlzdG9wX2RhYyhzdGF0ZSk7CisJCXJldHVybiAwOworCX0KKwlhZGRfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CisJZm9yICg7OykgeworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDw9IDApCisJCQlicmVhazsKKwkJLyogCisJCSAqIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCBvdXIgTFZJIGlzIGNvcnJlY3QsIHRoYXQgb3VyCisJCSAqIHBvaW50ZXIgaXMgdXBkYXRlZCwgYW5kIHRoYXQgdGhlIERBQyBpcyBydW5uaW5nLiAgV2UKKwkJICogaGF2ZSB0byBmb3JjZSB0aGUgc2V0dGluZyBvZiBkbWFidWYtPnRyaWdnZXIgdG8gYXZvaWQKKwkJICogYW55IHBvc3NpYmxlIGRlYWRsb2Nrcy4KKwkJICovCisJCWlmICghZG1hYnVmLT5lbmFibGUpIHsKKwkJCWRtYWJ1Zi0+dHJpZ2dlciA9IFBDTV9FTkFCTEVfT1VUUFVUOworCQkJYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDApOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBzaWduYWxzX2FsbG93ZWQpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSXQgc2VlbXMgdGhhdCB3ZSBoYXZlIHRvIHNldCB0aGUgY3VycmVudCBzdGF0ZSB0bworCQkgKiBUQVNLX0lOVEVSUlVQVElCTEUgZXZlcnkgdGltZSB0byBtYWtlIHRoZSBwcm9jZXNzCisJCSAqIHJlYWxseSBnbyB0byBzbGVlcC4gIFRoaXMgYWxzbyBoYXMgdG8gYmUgKmFmdGVyKiB0aGUKKwkJICogdXBkYXRlX3B0cigpIGNhbGwgYmVjYXVzZSB1cGRhdGVfcHRyIGlzIGxpa2VseSB0bworCQkgKiBkbyBhIHdha2VfdXAoKSB3aGljaCB3aWxsIHVuc2V0IHRoaXMgYmVmb3JlIHdlIGV2ZXIKKwkJICogdHJ5IHRvIHNsZWVwLCByZXN1bGluZyBpbiBhIHRpZ2h0IGxvb3AgaW4gdGhpcyBjb2RlCisJCSAqIGluc3RlYWQgb2YgYWN0dWFsbHkgc2xlZXBpbmcgYW5kIHdhaXRpbmcgZm9yIGFuCisJCSAqIGludGVycnVwdCB0byB3YWtlIHVzIHVwIQorCQkgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJLyoKKwkJICogc2V0IHRoZSB0aW1lb3V0IHRvIHNpZ25pZmljYW50bHkgbG9uZ2VyIHRoYW4gaXQgKnNob3VsZCoKKwkJICogdGFrZSBmb3IgdGhlIERBQyB0byBkcmFpbiB0aGUgRE1BIGJ1ZmZlcgorCQkgKi8KKwkJdG1vID0gKGNvdW50ICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSk7CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPj0gMiA/IHRtbyA6IDIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogZHJhaW5fZGFjLCBkbWEgdGltZW91dD9cbiIpOworCQkJY291bnQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CisJaWYgKGNvdW50ID4gMCAmJiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBzaWduYWxzX2FsbG93ZWQpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJc3RvcF9kYWMoc3RhdGUpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZHJhaW5fc3BkaWZvdXQoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUsIGludCBzaWduYWxzX2FsbG93ZWQpCit7CisKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdG1vOworCWludCBjb3VudDsKKwlpZiAoIWRtYWJ1Zi0+cmVhZHkpCisJCXJldHVybiAwOworCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQlzdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwkJcmV0dXJuIDA7CisJfQorCWFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWFsaV91cGRhdGVfcHRyKHN0YXRlKTsKKwkJY291bnQgPSBkbWFidWYtPmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQkvKiAKKwkJICogVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGF0IG91ciBMVkkgaXMgY29ycmVjdCwgdGhhdCBvdXIKKwkJICogcG9pbnRlciBpcyB1cGRhdGVkLCBhbmQgdGhhdCB0aGUgREFDIGlzIHJ1bm5pbmcuICBXZQorCQkgKiBoYXZlIHRvIGZvcmNlIHRoZSBzZXR0aW5nIG9mIGRtYWJ1Zi0+dHJpZ2dlciB0byBhdm9pZAorCQkgKiBhbnkgcG9zc2libGUgZGVhZGxvY2tzLgorCQkgKi8KKwkJaWYgKCFkbWFidWYtPmVuYWJsZSkgeworCQkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQlkbWFidWYtPnRyaWdnZXIgPSBTUERJRl9FTkFCTEVfT1VUUFVUOworCQkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAyKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCQlkbWFidWYtPnRyaWdnZXIgPSBTUERJRl9FTkFCTEVfT1VUUFVUOworCQkJCQlhbGlfdXBkYXRlX2x2aShzdGF0ZSwgMyk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBzaWduYWxzX2FsbG93ZWQpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSXQgc2VlbXMgdGhhdCB3ZSBoYXZlIHRvIHNldCB0aGUgY3VycmVudCBzdGF0ZSB0bworCQkgKiBUQVNLX0lOVEVSUlVQVElCTEUgZXZlcnkgdGltZSB0byBtYWtlIHRoZSBwcm9jZXNzCisJCSAqIHJlYWxseSBnbyB0byBzbGVlcC4gIFRoaXMgYWxzbyBoYXMgdG8gYmUgKmFmdGVyKiB0aGUKKwkJICogdXBkYXRlX3B0cigpIGNhbGwgYmVjYXVzZSB1cGRhdGVfcHRyIGlzIGxpa2VseSB0bworCQkgKiBkbyBhIHdha2VfdXAoKSB3aGljaCB3aWxsIHVuc2V0IHRoaXMgYmVmb3JlIHdlIGV2ZXIKKwkJICogdHJ5IHRvIHNsZWVwLCByZXN1bGluZyBpbiBhIHRpZ2h0IGxvb3AgaW4gdGhpcyBjb2RlCisJCSAqIGluc3RlYWQgb2YgYWN0dWFsbHkgc2xlZXBpbmcgYW5kIHdhaXRpbmcgZm9yIGFuCisJCSAqIGludGVycnVwdCB0byB3YWtlIHVzIHVwIQorCQkgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJLyoKKwkJICogc2V0IHRoZSB0aW1lb3V0IHRvIHNpZ25pZmljYW50bHkgbG9uZ2VyIHRoYW4gaXQgKnNob3VsZCoKKwkJICogdGFrZSBmb3IgdGhlIERBQyB0byBkcmFpbiB0aGUgRE1BIGJ1ZmZlcgorCQkgKi8KKwkJdG1vID0gKGNvdW50ICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSk7CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPj0gMiA/IHRtbyA6IDIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogZHJhaW5fc3BkaWZvdXQsIGRtYSB0aW1lb3V0P1xuIik7CisJCQljb3VudCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKKwlpZiAoY291bnQgPiAwICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIHNpZ25hbHNfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlzdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWxpX2NoYW5uZWxfaW50ZXJydXB0KHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlpbnQgaSwgY291bnQ7CisJCisJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV07CisJCXN0cnVjdCBhbGlfY2hhbm5lbCAqYyA9IE5VTEw7CisJCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwkJdW5zaWduZWQgbG9uZyBwb3J0ID0gY2FyZC0+aW9iYXNlOworCQl1MTYgc3RhdHVzOworCQlpZiAoIXN0YXRlKQorCQkJY29udGludWU7CisJCWlmICghc3RhdGUtPmRtYWJ1Zi5yZWFkeSkKKwkJCWNvbnRpbnVlOworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCWlmIChkbWFidWYtPmVuYWJsZSAmIENPREVDX1NQRElGT1VUX1JVTk5JTkcpIHsKKwkJCQljID0gZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykKKwkJCQkJYyA9IGRtYWJ1Zi0+Y29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgeworCQkJCQljID0gZG1hYnVmLT53cml0ZV9jaGFubmVsOworCQkJCX0gZWxzZSBpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgeworCQkJCQljID0gZG1hYnVmLT5yZWFkX2NoYW5uZWw7CisJCQkJfSBlbHNlCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXBvcnQgKz0gYy0+cG9ydDsKKworCQlzdGF0dXMgPSBpbncocG9ydCArIE9GRl9TUik7CisKKwkJaWYgKHN0YXR1cyAmIERNQV9JTlRfQ09NUExFVEUpIHsKKwkJCS8qIG9ubHkgd2FrZV91cCgpIHdhaXRlcnMgaWYgdGhpcyBpbnRlcnJ1cHQgc2lnbmFscworCQkJICogdXMgYmVpbmcgYmV5b25kIGEgdXNlcmZyYWdzaXplIG9mIGRhdGEgb3BlbiBvcgorCQkJICogYXZhaWxhYmxlLCBhbmQgYWxpX3VwZGF0ZV9wdHIoKSBkb2VzIHRoYXQgZm9yCisJCQkgKiB1cworCQkJICovCisJCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCX0KKworCQlpZiAoc3RhdHVzICYgRE1BX0lOVF9MVkkpIHsKKwkJCWFsaV91cGRhdGVfcHRyKHN0YXRlKTsKKwkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisKKwkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCisJCQkJY291bnQgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OworCQkJZWxzZSBpZiAoZG1hYnVmLT5lbmFibGUgJiBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09OVFJPTExFUl9TUERJRk9VVF9SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UgY291bnQgPSAwOworCisJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCisJCQkJCW91dGwoKDEgPDwgMSksIHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfRE1BQ1IpOworCQkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09ERUNfU1BESUZPVVRfUlVOTklORykKKwkJCQkJCW91dGwoKDEgPDwgMyksIHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfRE1BQ1IpOworCQkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09OVFJPTExFUl9TUERJRk9VVF9SVU5OSU5HKQorCQkJCQlvdXRsKCgxIDw8IDcpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX0RNQUNSKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCisJCQkJCV9fc3RvcF9kYWMoc3RhdGUpOworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKQorCQkJCQlfX3N0b3BfYWRjKHN0YXRlKTsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKQorCQkJCQlfX3N0b3Bfc3BkaWZvdXQoc3RhdGUpOworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykKKwkJCQkJX19zdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwkJCQlkbWFidWYtPmVuYWJsZSA9IDA7CisJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwkJCX0KKworCQl9CisJCWlmICghKHN0YXR1cyAmIERNQV9JTlRfRENIKSkgeworCQkJYWxpX3VwZGF0ZV9wdHIoc3RhdGUpOworCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCisJCQkJY291bnQgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OworCQkJZWxzZSBpZiAoZG1hYnVmLT5lbmFibGUgJiBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09OVFJPTExFUl9TUERJRk9VVF9SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UKKwkJCQljb3VudCA9IDA7CisKKwkJCWlmIChjb3VudCA+IDApIHsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKKwkJCQkJb3V0bCgoMSA8PCAxKSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9ETUFDUik7CisJCQkJZWxzZSBpZiAoZG1hYnVmLT5lbmFibGUgJiBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKQorCQkJCQlvdXRsKCgxIDw8IDMpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX0RNQUNSKTsKKwkJCQllbHNlIGlmIChkbWFidWYtPmVuYWJsZSAmIENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykKKwkJCQkJb3V0bCgoMSA8PCA3KSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9ETUFDUik7CisJCQl9IGVsc2UgeworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQkJCQlfX3N0b3BfZGFjKHN0YXRlKTsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKKwkJCQkJX19zdG9wX2FkYyhzdGF0ZSk7CisJCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09ERUNfU1BESUZPVVRfUlVOTklORykKKwkJCQkJX19zdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkcpCisJCQkJCV9fc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJCQkJZG1hYnVmLT5lbmFibGUgPSAwOworCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJCQl9CisJCX0KKwkJb3V0dyhzdGF0dXMgJiBETUFfSU5UX01BU0ssIHBvcnQgKyBPRkZfU1IpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IGFsaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSAoc3RydWN0IGFsaV9jYXJkICopIGRldl9pZDsKKwl1MzIgc3RhdHVzOworCXUxNiBzdGF0dXMyOworCisJc3Bpbl9sb2NrKCZjYXJkLT5sb2NrKTsKKwlzdGF0dXMgPSBpbmwoY2FyZC0+aW9iYXNlICsgQUxJX0lOVEVSUlVQVFNSKTsKKwlpZiAoIShzdGF0dXMgJiBJTlRfTUFTSykpIHsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CQkvKiBub3QgZm9yIHVzICovCisJfQorCisJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJaWYgKGdsb2JlbCA9PSAwKSB7CisJCQlnbG9iZWwgKz0gMTsKKwkJCXN0YXR1czIgPSBpbncoY2FyZC0+aW9iYXNlICsgMHg3Nik7CisJCQlvdXR3KHN0YXR1czIgfCAweDAwMGMsIGNhcmQtPmlvYmFzZSArIDB4NzYpOworCQl9IGVsc2UgeworCQkJaWYgKHN0YXR1cyAmIChJTlRfUENNT1VUIHwgSU5UX1BDTUlOIHwgSU5UX01JQ0lOIHwgSU5UX1NQRElGT1VUIHwgSU5UX0NPREVDU1BESUZPVVQpKQorCQkJCWFsaV9jaGFubmVsX2ludGVycnVwdChjYXJkKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzdGF0dXMgJiAoSU5UX1BDTU9VVCB8IElOVF9QQ01JTiB8IElOVF9NSUNJTiB8IElOVF9TUERJRk9VVCB8IElOVF9DT0RFQ1NQRElGT1VUKSkKKwkJCWFsaV9jaGFubmVsX2ludGVycnVwdChjYXJkKTsKKwl9CisKKwkvKiBjbGVhciAnZW0gKi8KKwlvdXRsKHN0YXR1cyAmIElOVF9NQVNLLCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpOworCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcworICAgd2FpdGluZyB0byBiZSBjb3BpZWQgdG8gdGhlIHVzZXIncyBidWZmZXIuICBJdCBpcyBmaWxsZWQgYnkgdGhlIGRtYQorICAgbWFjaGluZSBhbmQgZHJhaW5lZCBieSB0aGlzIGxvb3AuICovCisKK3N0YXRpYyBzc2l6ZV90IGFsaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBhbGlfc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IHN0YXRlID8gc3RhdGUtPmNhcmQgOiBOVUxMOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN3cHRyOworCWludCBjbnQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdGEsIGN1cnJlbnQpOworI2lmZGVmIERFQlVHMgorCXByaW50aygiYWxpX2F1ZGlvOiBhbGlfcmVhZCBjYWxsZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKKyNlbmRpZgorCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFkbWFidWYtPnJlYWRfY2hhbm5lbCkgeworCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJZG1hYnVmLT5yZWFkX2NoYW5uZWwgPSBjYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwoY2FyZCk7CisJCWlmICghZG1hYnVmLT5yZWFkX2NoYW5uZWwpIHsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpKQorCQlyZXR1cm4gcmV0OworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXRhKTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCWlmIChQTV9TVVNQRU5ERUQoY2FyZCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJY250ID0gYWxpX2dldF9hdmFpbGFibGVfcmVhZF9kYXRhKHN0YXRlKTsKKwkJLy8gdGhpcyBpcyB0byBtYWtlIHRoZSBjb3B5X3RvX3VzZXIgc2ltcGxlciBiZWxvdworCQlpZiAoY250ID4gKGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyKSkKKwkJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQkvKiBMb3Agb2ZmIHRoZSBsYXN0IHR3byBiaXRzIHRvIGZvcmNlIHRoZSBjb2RlIHRvIGFsd2F5cworCQkgKiB3cml0ZSBpbiBmdWxsIHNhbXBsZXMuICBUaGlzIGtlZXBzIHNvZnR3YXJlIHRoYXQgc2V0cworCQkgKiBPX05PTkJMT0NLIGJ1dCBkb2Vzbid0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlCisJCSAqIHdyaXRlIGNhbGwgZnJvbSBnZXR0aW5nIHRoaW5ncyBvdXQgb2Ygc3RhdGUgd2hlcmUgdGhleQorCQkgKiB0aGluayBhIGZ1bGwgNCBieXRlIHNhbXBsZSB3YXMgd3JpdHRlbiB3aGVuIHJlYWxseSBvbmx5CisJCSAqIGEgcG9ydGlvbiB3YXMsIHJlc3VsdGluZyBpbiBvZGQgc291bmQgYW5kIHN0ZXJlbworCQkgKiBoeXN0ZXJlc2lzLgorCQkgKi8KKwkJY250ICY9IH4weDM7CisJCWlmIChjbnQgPD0gMCkgeworCQkJdW5zaWduZWQgbG9uZyB0bW87CisJCQkvKgorCQkJICogRG9uJ3QgbGV0IHVzIGRlYWRsb2NrLiAgVGhlIEFEQyB3b24ndCBzdGFydCBpZgorCQkJICogZG1hYnVmLT50cmlnZ2VyIGlzbid0IHNldC4gIEEgY2FsbCB0byBTRVRUUklHR0VSCisJCQkgKiBjb3VsZCBoYXZlIHR1cm5lZCBpdCBvZmYgYWZ0ZXIgd2Ugc2V0IGl0IHRvIG9uCisJCQkgKiBwcmV2aW91c2x5LgorCQkJICovCisJCQlkbWFidWYtPnRyaWdnZXIgPSBQQ01fRU5BQkxFX0lOUFVUOworCQkJLyoKKwkJCSAqIFRoaXMgZG9lcyB0aHJlZSB0aGluZ3MuICBVcGRhdGVzIExWSSB0byBiZSBjb3JyZWN0LAorCQkJICogbWFrZXMgc3VyZSB0aGUgQURDIGlzIHJ1bm5pbmcsIGFuZCB1cGRhdGVzIHRoZQorCQkJICogaHdwdHIuCisJCQkgKi8KKwkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAxKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCS8qIFNldCB0aGUgdGltZW91dCB0byBob3cgbG9uZyBpdCB3b3VsZCB0YWtlIHRvIGZpbGwKKwkJCSAqIHR3byBvZiBvdXIgYnVmZmVycy4gIElmIHdlIGhhdmVuJ3QgYmVlbiB3b2tlIHVwCisJCQkgKiBieSB0aGVuLCB0aGVuIHdlIGtub3cgc29tZXRoaW5nIGlzIHdyb25nLgorCQkJICovCisJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFogKiAyKSAvIChkbWFidWYtPnJhdGUgKiA0KTsKKwkJCSAgICAKKwkJCS8qIFRoZXJlIGFyZSB0d28gc2l0dWF0aW9ucyB3aGVuIHNsZWVwX29uX3RpbWVvdXQgcmV0dXJucywgb25lIGlzIHdoZW4KKwkJCSAgIHRoZSBpbnRlcnJ1cHQgaXMgc2VydmljZWQgY29ycmVjdGx5IGFuZCB0aGUgcHJvY2VzcyBpcyB3YWtlZCB1cCBieQorCQkJICAgSVNSIE9OIFRJTUUuIEFub3RoZXIgaXMgd2hlbiB0aW1lb3V0IGlzIGV4cGlyZWQsIHdoaWNoIG1lYW5zIHRoYXQKKwkJCSAgIGVpdGhlciBpbnRlcnJ1cHQgaXMgTk9UIHNlcnZpY2VkIGNvcnJlY3RseSAocGVuZGluZyBpbnRlcnJ1cHQpIG9yIGl0CisJCQkgICBpcyBUT08gTEFURSBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAoc2NoZWR1bGVyIGxhdGVuY3kpCisJCQkgICB3aGljaCByZXN1bHRzIGluIGEgKHBvdGVudGlhbCkgYnVmZmVyIG92ZXJydW4uIEFuZCB3b3JzZSwgdGhlcmUgaXMKKwkJCSAgIE5PVEhJTkcgd2UgY2FuIGRvIHRvIHByZXZlbnQgaXQuICovCisJCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID49IDIgPyB0bW8gOiAyKSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiYWxpX2F1ZGlvOiByZWNvcmRpbmcgc2NoZWR1bGUgdGltZW91dCwgIgorCQkJCSAgICAgICAiZG1hc3ogJXUgZnJhZ3N6ICV1IGNvdW50ICVpIGh3cHRyICV1IHN3cHRyICV1XG4iLAorCQkJCSAgICAgICBkbWFidWYtPmRtYXNpemUsIGRtYWJ1Zi0+ZnJhZ3NpemUsCisJCQkJICAgICAgIGRtYWJ1Zi0+Y291bnQsIGRtYWJ1Zi0+aHdwdHIsCisJCQkJICAgICAgIGRtYWJ1Zi0+c3dwdHIpOworCQkJCS8qIGEgYnVmZmVyIG92ZXJydW4sIHdlIGRlbGF5IHRoZSByZWNvdmVyeSB1bnRpbCBuZXh0IHRpbWUgdGhlCisJCQkJICAgd2hpbGUgbG9vcCBiZWdpbiBhbmQgd2UgUkVBTExZIGhhdmUgc3BhY2UgdG8gcmVjb3JkICovCisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXQgPSByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKFBNX1NVU1BFTkRFRChjYXJkKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQkJY29udGludWU7CisJCX0KKwkJZG1hYnVmLT5zd3B0ciA9IHN3cHRyOworCQlkbWFidWYtPmNvdW50IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJfQorZG9uZToKKwlhbGlfdXBkYXRlX2x2aShzdGF0ZSwgMSk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB3YWl0aW5nIHRvIGJlIGRtYSB0bworICAgdGhlIHNvdW5kY2FyZC4gIGl0IGlzIGRyYWluZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCBmaWxsZWQgYnkgdGhpcyBsb29wLiAqLworc3RhdGljIHNzaXplX3QgYWxpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgYWxpX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBzdGF0ZSA/IHN0YXRlLT5jYXJkIDogTlVMTDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBzd3B0ciA9IDA7CisJaW50IGNudCwgeDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0YSwgY3VycmVudCk7CisjaWZkZWYgREVCVUcyCisJcHJpbnRrKCJhbGlfYXVkaW86IGFsaV93cml0ZSBjYWxsZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKKyNlbmRpZgorCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJaWYgKCFkbWFidWYtPmNvZGVjX3NwZGlmb3V0X2NoYW5uZWwpIHsKKwkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsID0gY2FyZC0+YWxsb2NfY29kZWNfc3BkaWZvdXRfY2hhbm5lbChjYXJkKTsKKwkJCWlmICghZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsKQorCQkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY29udHJvbGxlcl9pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlpZiAoIWRtYWJ1Zi0+Y29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwgPSBjYXJkLT5hbGxvY19jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwoY2FyZCk7CisJCQkJaWYgKCFkbWFidWYtPmNvbnRyb2xsZXJfc3BkaWZvdXRfY2hhbm5lbCkKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghZG1hYnVmLT53cml0ZV9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT53cml0ZV9jaGFubmVsID0KKwkJCQkgICAgY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCk7CisJCQkJaWYgKCFkbWFidWYtPndyaXRlX2NoYW5uZWwpCisJCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlLCAyKSkpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgeworCisJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXRhKTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlpZiAoUE1fU1VTUEVOREVEKGNhcmQpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJY250ID0gYWxpX2dldF9mcmVlX3dyaXRlX3NwYWNlKHN0YXRlKTsKKwkJLyogQm91bmQgdGhlIG1heGltdW0gc2l6ZSB0byBob3cgbXVjaCB3ZSBjYW4gY29weSB0byB0aGUKKwkJICogZG1hIGJ1ZmZlciBiZWZvcmUgd2UgaGl0IHRoZSBlbmQuICBJZiB3ZSBoYXZlIG1vcmUgdG8KKwkJICogY29weSB0aGVuIGl0IHdpbGwgZ2V0IGRvbmUgaW4gYSBzZWNvbmQgcGFzcyBvZiB0aGlzCisJCSAqIGxvb3Agc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuCisJCSAqLworCQlpZiAoY250ID4gKGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyKSkKKwkJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworI2lmZGVmIERFQlVHMgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiYWxpX2F1ZGlvOiBhbGlfd3JpdGU6ICVkIGJ5dGVzIGF2YWlsYWJsZSBzcGFjZVxuIiwKKwkJICAgICAgIGNudCk7CisjZW5kaWYKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCS8qIExvcCBvZmYgdGhlIGxhc3QgdHdvIGJpdHMgdG8gZm9yY2UgdGhlIGNvZGUgdG8gYWx3YXlzCisJCSAqIHdyaXRlIGluIGZ1bGwgc2FtcGxlcy4gIFRoaXMga2VlcHMgc29mdHdhcmUgdGhhdCBzZXRzCisJCSAqIE9fTk9OQkxPQ0sgYnV0IGRvZXNuJ3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUKKwkJICogd3JpdGUgY2FsbCBmcm9tIGdldHRpbmcgdGhpbmdzIG91dCBvZiBzdGF0ZSB3aGVyZSB0aGV5CisJCSAqIHRoaW5rIGEgZnVsbCA0IGJ5dGUgc2FtcGxlIHdhcyB3cml0dGVuIHdoZW4gcmVhbGx5IG9ubHkKKwkJICogYSBwb3J0aW9uIHdhcywgcmVzdWx0aW5nIGluIG9kZCBzb3VuZCBhbmQgc3RlcmVvCisJCSAqIGh5c3RlcmVzaXMuCisJCSAqLworCQljbnQgJj0gfjB4MzsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQl1bnNpZ25lZCBsb25nIHRtbzsKKwkJCS8vIFRoZXJlIGlzIGRhdGEgd2FpdGluZyB0byBiZSBwbGF5ZWQKKwkJCS8qCisJCQkgKiBGb3JjZSB0aGUgdHJpZ2dlciBzZXR0aW5nIHNpbmNlIHdlIHdvdWxkCisJCQkgKiBkZWFkbG9jayB3aXRoIGl0IHNldCBhbnkgb3RoZXIgd2F5CisJCQkgKi8KKwkJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQkJZG1hYnVmLT50cmlnZ2VyID0gU1BESUZfRU5BQkxFX09VVFBVVDsKKwkJCQlhbGlfdXBkYXRlX2x2aShzdGF0ZSwgMik7CisJCQl9IGVsc2UgeworCQkJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQkJZG1hYnVmLT50cmlnZ2VyID0gU1BESUZfRU5BQkxFX09VVFBVVDsKKwkJCQkJYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDMpOworCQkJCX0gZWxzZSB7CisKKwkJCQkJZG1hYnVmLT50cmlnZ2VyID0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCQkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAwKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJCS8qIE5vdCBzdHJpY3RseSBjb3JyZWN0IGJ1dCB3b3JrcyAqLworCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaICogMikgLyAoZG1hYnVmLT5yYXRlICogNCk7CisJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0IHJldHVybnMsIG9uZSBpcyB3aGVuCisJCQkgICB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkKKwkJCSAgIElTUiBPTiBUSU1FLiBBbm90aGVyIGlzIHdoZW4gdGltZW91dCBpcyBleHBpcmVkLCB3aGljaCBtZWFucyB0aGF0CisJCQkgICBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdAorCQkJICAgaXMgVE9PIExBVEUgZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKHNjaGVkdWxlciBsYXRlbmN5KQorCQkJICAgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpIGJ1ZmZlciB1bmRlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcworCQkJICAgTk9USElORyB3ZSBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KKwkJCSAgIAorCQkJLyogRklYTUUgLSBkbyB0aW1lb3V0IGhhbmRsaW5nIGhlcmUgISEgKi8KKwkJCXNjaGVkdWxlX3RpbWVvdXQodG1vID49IDIgPyB0bW8gOiAyKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIHJldDsKKwkJfQorCisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWlmIChQTV9TVVNQRU5ERUQoY2FyZCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZG1hYnVmLT5zd3B0ciA9IHN3cHRyOworCQlkbWFidWYtPmNvdW50ICs9IGNudDsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCX0KKwlpZiAoc3dwdHIgJSBkbWFidWYtPmZyYWdzaXplKSB7CisJCXggPSBkbWFidWYtPmZyYWdzaXplIC0gKHN3cHRyICUgZG1hYnVmLT5mcmFnc2l6ZSk7CisJCW1lbXNldChkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCAnXDAnLCB4KTsKKwl9CityZXQ6CisJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDIpOworCX0gZWxzZSB7CisJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAzKTsKKwkJfSBlbHNlIHsKKwkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAwKTsKKwkJfQorCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0YSk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWxpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdAorCQkJICAgICAqd2FpdCkKK3sKKwlzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgYWxpX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwlpZiAoIWRtYWJ1Zi0+cmVhZHkpCisJCXJldHVybiAwOworCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgeworCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgICYmIChkbWFidWYtPmVuYWJsZSAmIChEQUNfUlVOTklOR3xDT0RFQ19TUERJRk9VVF9SVU5OSU5HfENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykpKSB7CisJCWlmICgoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArIChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGFsaV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgYWxpX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICghZG1hYnVmLT53cml0ZV9jaGFubmVsICYmIChkbWFidWYtPndyaXRlX2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQpKSA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKKwkJaWYgKCFkbWFidWYtPnJlYWRfY2hhbm5lbCAmJiAoZG1hYnVmLT5yZWFkX2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkKSkgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpICE9IDApCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikpCisJCWdvdG8gb3V0OworCXJldCA9IC1FQUdBSU47CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJdmlydF90b19waHlzKGRtYWJ1Zi0+cmF3YnVmKSA+PiBQQUdFX1NISUZULAorCQkJCXNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJZ290byBvdXQ7CisJZG1hYnVmLT5tYXBwZWQgPSAxOworCWRtYWJ1Zi0+dHJpZ2dlciA9IDA7CisJcmV0ID0gMDsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbGlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBhbGlfc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhbGlfY2hhbm5lbCAqYyA9IE5VTEw7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhdWRpb19idWZfaW5mbyBhYmluZm87CisJY291bnRfaW5mbyBjaW5mbzsKKwl1bnNpZ25lZCBpbnQgaV9zY3I7CisJaW50IHZhbCA9IDAsIHJldDsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBzdGF0ZS0+Y2FyZC0+YWM5N19jb2RlY1swXTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJhbGlfYXVkaW86IGFsaV9pb2N0bCwgYXJnPTB4JXgsIGNtZD0iLAorCSAgICAgICBhcmcgPyAqcCA6IDApOworI2VuZGlmCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiT1NTX0dFVFZFUlNJT05cbiIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1JFU0VUXG4iKTsKKyNlbmRpZgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IERBQ19SVU5OSU5HKSB7CisJCQljID0gZG1hYnVmLT53cml0ZV9jaGFubmVsOworCQkJX19zdG9wX2RhYyhzdGF0ZSk7CisJCX0KKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CisJCQljID0gZG1hYnVmLT5yZWFkX2NoYW5uZWw7CisJCQlfX3N0b3BfYWRjKHN0YXRlKTsKKwkJfQorCQlpZiAoZG1hYnVmLT5lbmFibGUgPT0gQ09ERUNfU1BESUZPVVRfUlVOTklORykgeworCQkJYyA9IGRtYWJ1Zi0+Y29kZWNfc3BkaWZvdXRfY2hhbm5lbDsKKwkJCV9fc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJCX0KKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykgeworCQkJYyA9IGRtYWJ1Zi0+Y29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsOworCQkJX19zdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwkJfQorCQlpZiAoYyAhPSBOVUxMKSB7CisJCQlvdXRiKDIsIHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBjLT5wb3J0ICsgT0ZGX0NSKTsJLyogcmVzZXQgRE1BIG1hY2hpbmUgKi8KKwkJCW91dGwodmlydF90b19idXMoJmMtPnNnWzBdKSwKKwkJCSAgICAgc3RhdGUtPmNhcmQtPmlvYmFzZSArIGMtPnBvcnQgKyBPRkZfQkRCQVIpOworCQkJb3V0YigwLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgYy0+cG9ydCArIE9GRl9DSVYpOworCQkJb3V0YigwLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgYy0+cG9ydCArIE9GRl9MVkkpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJc3luY2hyb25pemVfaXJxKHN0YXRlLT5jYXJkLT5wY2lfZGV2LT5pcnEpOworCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOworCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7CisJCXJldHVybiAwOworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TWU5DXG4iKTsKKyNlbmRpZgorCQlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICE9IENPREVDX1NQRElGT1VUX1JVTk5JTkcKKwkJCSAgICB8fCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlyZXR1cm4gMDsKKwkJCWlmICgodmFsID0gZHJhaW5fc3BkaWZvdXQoc3RhdGUsIDEpKSkKKwkJCQlyZXR1cm4gdmFsOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAhPQorCQkJCSAgICBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkcKKwkJCQkgICAgfHwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJCXJldHVybiAwOworCQkJCWlmICgodmFsID0gZHJhaW5fc3BkaWZvdXQoc3RhdGUsIDEpKSkKKwkJCQkJcmV0dXJuIHZhbDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICE9IERBQ19SVU5OSU5HCisJCQkJICAgIHx8IGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlpZiAoKHZhbCA9IGRyYWluX2RhYyhzdGF0ZSwgMSkpKQorCQkJCQlyZXR1cm4gdmFsOworCQkJfQorCQl9CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCQlyZXR1cm4gMDsKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CS8qIHNldCBzbWFwbGUgcmF0ZSAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TUEVFRFxuIik7CisjZW5kaWYKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlpZiAoKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OKSkgewkvKiBTL1BESUYgRW5hYmxlZCAqLworCQkJCQkvKiBSRUxURUsgQUxDNjUwIG9ubHkgc3VwcG9ydCA0ODAwMCwgbmVlZCB0byBjaGVjayB0aGF0ICovCisJCQkJCWlmIChhbGlfdmFsaWRfc3BkaWZfcmF0ZShjb2RlYywgdmFsKSkgeworCQkJCQkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgLTEsIDApOworCQkJCQkJCXN0b3Bfc3BkaWZvdXQoc3RhdGUpOworCQkJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCQkJCS8qIEkgYWRkIHRlc3QgY29kZWMgaW5kZXBlbmRlbnQgc3BkaWYgb3V0ICovCisJCQkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQkJCQkJYWxpX3NldF9jb2RlY3NwZGlmb3V0X3JhdGUoc3RhdGUsIHZhbCk7CS8vIEkgbW9kaWZpZWQKKwkJCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQkJCS8qIFNldCBTL1BESUYgdHJhbnNtaXR0ZXIgcmF0ZS4gKi8KKwkJCQkJCQlpX3NjciA9IGlubChzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX1NDUik7CisJCQkJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAxMDAwMDApIHsKKwkJCQkJCQkJYWxpX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV83XzgsIGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaWYgKChpX3NjciYweDAwMzAwMDAwKSAgPT0gMHgwMDIwMDAwMCkKKwkJCQkJCQkJeworCQkJCQkJCQkJYWxpX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV82XzksIGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpZiAoKGlfc2NyICYgMHgwMDMwMDAwMCkgPT0gMHgwMDMwMDAwMCkgeworCQkJCQkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCBBQzk3X0VBX1NQU0FfMTBfMTEsIGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCBBQzk3X0VBX1NQU0FfN184LCBjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICYgU1BESUZfT04pKSB7CisJCQkJCQkJCXZhbCA9IGRtYWJ1Zi0+cmF0ZTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIAorCQkJCQkJCXsKKwkJCQkJCQkJc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJCQkJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQkJCQkJYWxpX3NldF9zcGRpZm91dF9yYXRlKHN0YXRlLCBjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLyogU2V0IERBQyByYXRlICovCisJCQkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCAtMSwgMCk7CisJCQkJCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQkJCQlhbGlfc2V0X2RhY19yYXRlKHN0YXRlLCB2YWwpOworCQkJCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQkJCQkvKiBTZXQgUy9QRElGIHRyYW5zbWl0dGVyIHJhdGUuICovCisJCQkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCBBQzk3X0VBX1NQU0FfM180LCB2YWwpOworCQkJCQkJCQlpZiAoIShzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTUERJRl9PTikpCisJCQkJCQkJCXsKKwkJCQkJCQkJCXZhbCA9IGRtYWJ1Zi0+cmF0ZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsJLyogTm90IGEgdmFsaWQgcmF0ZSBmb3IgUy9QRElGLCBpZ25vcmUgaXQgKi8KKwkJCQkJCXZhbCA9IGRtYWJ1Zi0+cmF0ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQlhbGlfc2V0X2RhY19yYXRlKHN0YXRlLCB2YWwpOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCX0KKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCWFsaV9zZXRfYWRjX3JhdGUoc3RhdGUsIHZhbCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOgkvKiBzZXQgc3RlcmVvIG9yIG1vbm8gY2hhbm5lbCAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TVEVSRU9cbiIpOworI2VuZGlmCisJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSB7CisJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCX0KKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpIHsKKwkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJfQorCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKSB7CisJCQlzdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwkJfQorCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkcpIHsKKwkJCXN0b3Bfc3BkaWZvdXQoc3RhdGUpOworCQl9CisJCXJldHVybiBwdXRfdXNlcigxLCBwKTsKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDIpKSkKKwkJCQkJcmV0dXJuIHZhbDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAzKSkpCisJCQkJCQlyZXR1cm4gdmFsOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSkKKwkJCQkJCXJldHVybiB2YWw7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDEpKSkKKwkJCQlyZXR1cm4gdmFsOworCQl9CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVEJMS1NJWkUgJWRcbiIsIGRtYWJ1Zi0+dXNlcmZyYWdzaXplKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT51c2VyZnJhZ3NpemUsIHApOworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgkvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRGTVRTXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEUsIHApOworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CS8qIFNlbGVjdCBzYW1wbGUgZm9ybWF0ICovCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZNVFxuIik7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFLCBwKTsKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CS8vIGFkZCBzdXBwb3J0IDQsNiBjaGFubmVsIAorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9DSEFOTkVMU1xuIik7CisjZW5kaWYKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+IDApIHsKKwkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSB7CisJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJfQorCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09ERUNfU1BESUZPVVRfUlVOTklORykgeworCQkJCXN0b3Bfc3BkaWZvdXQoc3RhdGUpOworCQkJfQorCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09OVFJPTExFUl9TUERJRk9VVF9SVU5OSU5HKSB7CisJCQkJc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJCQl9CisJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgeworCQkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBwdXRfdXNlcihzdGF0ZS0+Y2FyZC0+Y2hhbm5lbHMsIHApOworCQl9CisKKwkJaV9zY3IgPSBpbmwoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpOworCQkvKiBDdXJyZW50ICMgb2YgY2hhbm5lbHMgZW5hYmxlZCAqLworCQlpZiAoaV9zY3IgJiAweDAwMDAwMTAwKQorCQkJcmV0ID0gNDsKKwkJZWxzZSBpZiAoaV9zY3IgJiAweDAwMDAwMjAwKQorCQkJcmV0ID0gNjsKKwkJZWxzZQorCQkJcmV0ID0gMjsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSAyOgkvKiAyIGNoYW5uZWxzIGlzIGFsd2F5cyBzdXBwb3J0ZWQgKi8KKwkJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQkJb3V0bCgoKGlfc2NyICYgMHhmZmZmZmNmZikgfCAweDAwMTAwMDAwKSwgKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfU0NSKSk7CisJCQl9IGVsc2UKKwkJCQlvdXRsKChpX3NjciAmIDB4ZmZmZmZjZmYpLCAoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpKTsKKwkJCS8qIERvIHdlIG5lZWQgdG8gY2hhbmdlIG1peGVyIHNldHRpbmdzPz8/PyAgKi8KKwkJCWJyZWFrOworCQljYXNlIDQ6CS8qIFN1cHBvcnRlZCBvbiBzb21lIGNoaXBzZXRzLCBiZXR0ZXIgY2hlY2sgZmlyc3QgKi8KKwkJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQkJb3V0bCgoKGlfc2NyICYgMHhmZmZmZmNmZikgfCAweDAwMDAwMTAwIHwgMHgwMDIwMDAwMCksIChzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX1NDUikpOworCQkJfSBlbHNlCisJCQkJb3V0bCgoKGlfc2NyICYgMHhmZmZmZmNmZikgfCAweDAwMDAwMTAwKSwgKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfU0NSKSk7CisJCQlicmVhazsKKwkJY2FzZSA2OgkvKiBTdXBwb3J0ZWQgb24gc29tZSBjaGlwc2V0cywgYmV0dGVyIGNoZWNrIGZpcnN0ICovCisJCQlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCW91dGwoKChpX3NjciAmIDB4ZmZmZmZjZmYpIHwgMHgwMDAwMDIwMCB8IDB4MDAwMDgwMDAgfCAweDAwMzAwMDAwKSwgKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfU0NSKSk7CisJCQl9IGVsc2UKKwkJCQlvdXRsKCgoaV9zY3IgJiAweGZmZmZmY2ZmKSB8IDB4MDAwMDAyMDAgfCAweDAwMDA4MDAwKSwgKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfU0NSKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogbm90aGluZyBlbHNlIGlzIGV2ZXIgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwc2V0ICovCisJCQl2YWwgPSByZXQ7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwljYXNlIFNORENUTF9EU1BfUE9TVDoJLyogdGhlIHVzZXIgaGFzIHNlbnQgYWxsIGRhdGEgYW5kIGlzIG5vdGlmeWluZyB1cyAqLworCQkvKiB3ZSB1cGRhdGUgdGhlIHN3cHRyIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3Qgc2cgc2VnbWVudCB0aGVuIHJldHVybiAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9QT1NUXG4iKTsKKyNlbmRpZgorCQlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJaWYgKCFkbWFidWYtPnJlYWR5IHx8IChkbWFidWYtPmVuYWJsZSAhPSBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKSkKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgfHwgKGRtYWJ1Zi0+ZW5hYmxlICE9IENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykpCisJCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgfHwgKGRtYWJ1Zi0+ZW5hYmxlICE9IERBQ19SVU5OSU5HKSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJaWYgKChkbWFidWYtPnN3cHRyICUgZG1hYnVmLT5mcmFnc2l6ZSkgIT0gMCkgeworCQkJdmFsID0gZG1hYnVmLT5mcmFnc2l6ZSAtIChkbWFidWYtPnN3cHRyICUgZG1hYnVmLT5mcmFnc2l6ZSk7CisJCQlkbWFidWYtPnN3cHRyICs9IHZhbDsKKwkJCWRtYWJ1Zi0+Y291bnQgKz0gdmFsOworCQl9CisJCXJldHVybiAwOworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmIChkbWFidWYtPnN1YmRpdmlzaW9uKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMiAmJiB2YWwgIT0gNCkKKwkJCXJldHVybiAtRUlOVkFMOworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TVUJESVZJREUgJWRcbiIsIHZhbCk7CisjZW5kaWYKKwkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCXJldHVybiAwOworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZG1hYnVmLT5vc3NmcmFnc2l6ZSA9IDEgPDwgKHZhbCAmIDB4ZmZmZik7CisJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJaWYgKCFkbWFidWYtPm9zc2ZyYWdzaXplIHx8ICFkbWFidWYtPm9zc21heGZyYWdzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qCisJCSAqIEJvdW5kIHRoZSBmcmFnIHNpemUgaW50byBvdXIgYWxsb3dlZCByYW5nZSBvZiAyNTYgLSA0MDk2CisJCSAqLworCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2l6ZSA8IDI1NikKKwkJCWRtYWJ1Zi0+b3NzZnJhZ3NpemUgPSAyNTY7CisJCWVsc2UgaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NpemUgPiA0MDk2KQorCQkJZG1hYnVmLT5vc3NmcmFnc2l6ZSA9IDQwOTY7CisJCS8qCisJCSAqIFRoZSBudW1mcmFncyBjb3VsZCBiZSBzb21ldGhpbmcgcmVhc29uYWJsZSwgb3IgaXQgY291bGQKKwkJICogYmUgMHhmZmZmIG1lYW5pbmcgIkdpdmUgbWUgYXMgbXVjaCBhcyBwb3NzaWJsZSIuICBTbywKKwkJICogd2UgY2hlY2sgdGhlIG51bWZyYWdzICogZnJhZ3NpemUgZG9lc24ndCBleGNlZWQgb3VyCisJCSAqIDY0ayBidWZmZXIgbGltaXQsIG5vciBpcyBpdCBsZXNzIHRoYW4gb3VyIDhrIG1pbmltdW0uCisJCSAqIElmIGl0IGZhaWxzIGVpdGhlciBvbmUgb2YgdGhlc2UgY2hlY2tzLCB0aGVuIGFkanVzdCB0aGUKKwkJICogbnVtYmVyIG9mIGZyYWdtZW50cywgbm90IHRoZSBzaXplIG9mIHRoZW0uICBJdCdzIE9LIGlmCisJCSAqIG91ciBudW1iZXIgb2YgZnJhZ21lbnRzIGRvZXNuJ3QgZXF1YWwgMzIgb3IgYW55dGhpbmcKKwkJICogbGlrZSBvdXIgaGFyZHdhcmUgYmFzZWQgbnVtYmVyIG5vdyBzaW5jZSB3ZSBhcmUgdXNpbmcKKwkJICogYSBkaWZmZXJlbnQgZnJhZyBjb3VudCBmb3IgdGhlIGhhcmR3YXJlLiAgQmVmb3JlIHdlIGdldAorCQkgKiBpbnRvIHRoaXMgdGhvdWdoLCBib3VuZCB0aGUgbWF4ZnJhZ3MgdG8gYXZvaWQgb3ZlcmZsb3cKKwkJICogaXNzdWVzLiAgQSByZWFzb25hYmxlIGJvdW5kIHdvdWxkIGJlIDY0ayAvIDI1NiBzaW5jZSBvdXIKKwkJICogbWF4aW11bSBidWZmZXIgc2l6ZSBpcyA2NGsgYW5kIG91ciBtaW5pbXVtIGZyYWcgc2l6ZSBpcworCQkgKiAyNTYuICBPbiB0aGUgb3RoZXIgZW5kLCBvdXIgbWluaW11bSBidWZmZXIgc2l6ZSBpcyA4ayBhbmQKKwkJICogb3VyIG1heGltdW0gZnJhZyBzaXplIGlzIDRrLCBzbyB0aGUgbG93ZXIgYm91bmQgc2hvdWxkCisJCSAqIGJlIDIuCisJCSAqLworCQlpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA+IDI1NikKKwkJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAyNTY7CisJCWVsc2UgaWYgKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPCAyKQorCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA9IDI7CisJCXZhbCA9IGRtYWJ1Zi0+b3NzZnJhZ3NpemUgKiBkbWFidWYtPm9zc21heGZyYWdzOworCQl3aGlsZSAodmFsIDwgODE5MikgeworCQkJdmFsIDw8PSAxOworCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA8PD0gMTsKKwkJfQorCQl3aGlsZSAodmFsID4gNjU1MzYpIHsKKwkJCXZhbCA+Pj0gMTsKKwkJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPj49IDE7CisJCX0KKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZSQUdNRU5UIDB4JXgsICVkLCAlZFxuIiwgdmFsLAorCQkgICAgICAgZG1hYnVmLT5vc3NmcmFnc2l6ZSwgZG1hYnVmLT5vc3NtYXhmcmFncyk7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAyKSkgIT0gMCkKKwkJCQlyZXR1cm4gdmFsOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDMpKSAhPSAwKQorCQkJCQlyZXR1cm4gdmFsOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkgIT0gMCkKKwkJCQkJcmV0dXJuIHZhbDsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJYWxpX3VwZGF0ZV9wdHIoc3RhdGUpOworCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPnVzZXJmcmFnc2l6ZTsKKwkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPnVzZXJmcmFnczsKKwkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplOworCQllbHNlCisJCQlhYmluZm8uYnl0ZXMgPSBhbGlfZ2V0X2ZyZWVfd3JpdGVfc3BhY2Uoc3RhdGUpOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzIC8gZG1hYnVmLT51c2VyZnJhZ3NpemU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChERUJVR19NTUFQKQorCQlwcmludGsoIlNORENUTF9EU1BfR0VUT1NQQUNFICVkLCAlZCwgJWQsICVkXG4iLAorCQkgICAgICAgYWJpbmZvLmJ5dGVzLCBhYmluZm8uZnJhZ3NpemUsIGFiaW5mby5mcmFnbWVudHMsCisJCSAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCk7CisjZW5kaWYKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLAorCQkJCSAgICBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAyKSkgIT0gMCkKKwkJCQlyZXR1cm4gdmFsOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDMpKSAhPSAwKQorCQkJCQlyZXR1cm4gdmFsOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkgIT0gMCkKKwkJCQkJcmV0dXJuIHZhbDsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJdmFsID0gYWxpX2dldF9mcmVlX3dyaXRlX3NwYWNlKHN0YXRlKTsKKwkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOworCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCQljaW5mby5ibG9ja3MgPSB2YWwgLyBkbWFidWYtPnVzZXJmcmFnc2l6ZTsKKwkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCWlmIChkbWFidWYtPm1hcHBlZCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgU1BESUZfRU5BQkxFX09VVFBVVCkpIHsKKwkJCQlkbWFidWYtPmNvdW50ICs9IHZhbDsKKwkJCQlkbWFidWYtPnN3cHRyID0gKGRtYWJ1Zi0+c3dwdHIgKyB2YWwpICUgZG1hYnVmLT5kbWFzaXplOworCQkJCV9fYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmIChkbWFidWYtPm1hcHBlZCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgU1BESUZfRU5BQkxFX09VVFBVVCkpIHsKKwkJCQkJZG1hYnVmLT5jb3VudCArPSB2YWw7CisJCQkJCWRtYWJ1Zi0+c3dwdHIgPSAoZG1hYnVmLT5zd3B0ciArIHZhbCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJCV9fYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkICYmIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX09VVFBVVCkpIHsKKwkJCQkJZG1hYnVmLT5jb3VudCArPSB2YWw7CisJCQkJCWRtYWJ1Zi0+c3dwdHIgPSAoZG1hYnVmLT5zd3B0ciArIHZhbCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJCV9fYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDApOworCQkJCX0KKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9QVFIgJWQsICVkLCAlZCwgJWRcbiIsIGNpbmZvLmJ5dGVzLAorCQkgICAgICAgY2luZm8uYmxvY2tzLCBjaW5mby5wdHIsIGRtYWJ1Zi0+Y291bnQpOworI2VuZGlmCisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKT8gLUVGQVVMVCA6IDA7CisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJYWJpbmZvLmJ5dGVzID0gYWxpX2dldF9hdmFpbGFibGVfcmVhZF9kYXRhKHN0YXRlKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT51c2VyZnJhZ3NpemU7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT51c2VyZnJhZ3M7CisJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgLyBkbWFidWYtPnVzZXJmcmFnc2l6ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX01NQVApCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRJU1BBQ0UgJWQsICVkLCAlZCwgJWRcbiIsCisJCSAgICAgICBhYmluZm8uYnl0ZXMsIGFiaW5mby5mcmFnc2l6ZSwgYWJpbmZvLmZyYWdtZW50cywKKwkJICAgICAgIGFiaW5mby5mcmFnc3RvdGFsKTsKKyNlbmRpZgorCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sCisJCQkJICAgIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQl2YWwgPSBhbGlfZ2V0X2F2YWlsYWJsZV9yZWFkX2RhdGEoc3RhdGUpOworCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXM7CisJCWNpbmZvLmJsb2NrcyA9IHZhbCAvIGRtYWJ1Zi0+dXNlcmZyYWdzaXplOworCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCQlpZiAoZG1hYnVmLT5tYXBwZWQgJiYgKGRtYWJ1Zi0+dHJpZ2dlciAmIFBDTV9FTkFCTEVfSU5QVVQpKSB7CisJCQlkbWFidWYtPmNvdW50IC09IHZhbDsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSAoZG1hYnVmLT5zd3B0ciArIHZhbCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQlfX2FsaV91cGRhdGVfbHZpKHN0YXRlLCAxKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVElQVFIgJWQsICVkLCAlZCwgJWRcbiIsIGNpbmZvLmJ5dGVzLAorCQkgICAgICAgY2luZm8uYmxvY2tzLCBjaW5mby5wdHIsIGRtYWJ1Zi0+Y291bnQpOworI2VuZGlmCisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKT8gLUVGQVVMVDogMDsKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX05PTkJMT0NLXG4iKTsKKyNlbmRpZgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRDQVBTXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8CisJCQkJRFNQX0NBUF9NTUFQIHwgRFNQX0NBUF9CSU5ELCBwKTsKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfR0VUVFJJR0dFUiAweCV4XG4iLCBkbWFidWYtPnRyaWdnZXIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnRyaWdnZXIsIHApOworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NFVFRSSUdHRVIgMHgleFxuIiwgdmFsKTsKKyNlbmRpZgorCQlpZiAoISh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSAmJiBkbWFidWYtPmVuYWJsZSA9PSBBRENfUlVOTklORykgeworCQkJc3RvcF9hZGMoc3RhdGUpOworCQl9CisJCWlmICghKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSAmJiBkbWFidWYtPmVuYWJsZSA9PSBEQUNfUlVOTklORykgeworCQkJc3RvcF9kYWMoc3RhdGUpOworCQl9CisJCWlmICghKHZhbCAmIFNQRElGX0VOQUJMRV9PVVRQVVQpICYmIGRtYWJ1Zi0+ZW5hYmxlID09IENPREVDX1NQRElGT1VUX1JVTk5JTkcpIHsKKwkJCXN0b3Bfc3BkaWZvdXQoc3RhdGUpOworCQl9CisJCWlmICghKHZhbCAmIFNQRElGX0VOQUJMRV9PVVRQVVQpICYmIGRtYWJ1Zi0+ZW5hYmxlID09IENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykgeworCQkJc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJCX0KKwkJZG1hYnVmLT50cmlnZ2VyID0gdmFsOworCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQgJiYgIShkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSkgeworCQkJaWYgKCFkbWFidWYtPndyaXRlX2NoYW5uZWwpIHsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQlkbWFidWYtPndyaXRlX2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQpOworCQkJCWlmICghZG1hYnVmLT53cml0ZV9jaGFubmVsKQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQkJZG1hYnVmLT5jb3VudCA9IGFsaV9nZXRfZnJlZV93cml0ZV9zcGFjZShzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IChkbWFidWYtPnN3cHRyICsgZG1hYnVmLT5jb3VudCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJX19hbGlfdXBkYXRlX2x2aShzdGF0ZSwgMCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssCisJCQkJCQkgICAgICAgZmxhZ3MpOworCQkJfSBlbHNlCisJCQkJc3RhcnRfZGFjKHN0YXRlKTsKKwkJfQorCQlpZiAodmFsICYgU1BESUZfRU5BQkxFX09VVFBVVCAmJiAhKGRtYWJ1Zi0+ZW5hYmxlICYgQ09ERUNfU1BESUZPVVRfUlVOTklORykpIHsKKwkJCWlmICghZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsID0gc3RhdGUtPmNhcmQtPmFsbG9jX2NvZGVjX3NwZGlmb3V0X2NoYW5uZWwoc3RhdGUtPmNhcmQpOworCQkJCWlmICghZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsKQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMikpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQkJZG1hYnVmLT5jb3VudCA9IGFsaV9nZXRfZnJlZV93cml0ZV9zcGFjZShzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IChkbWFidWYtPnN3cHRyICsgZG1hYnVmLT5jb3VudCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJX19hbGlfdXBkYXRlX2x2aShzdGF0ZSwgMik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssCisJCQkJCQkgICAgICAgZmxhZ3MpOworCQkJfSBlbHNlCisJCQkJc3RhcnRfc3BkaWZvdXQoc3RhdGUpOworCQl9CisJCWlmICh2YWwgJiBTUERJRl9FTkFCTEVfT1VUUFVUICYmICEoZG1hYnVmLT5lbmFibGUgJiBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkcpKSB7CisJCQlpZiAoIWRtYWJ1Zi0+Y29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfY29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsKHN0YXRlLT5jYXJkKTsKKwkJCQlpZiAoIWRtYWJ1Zi0+Y29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsKQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMykpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQkJZG1hYnVmLT5jb3VudCA9IGFsaV9nZXRfZnJlZV93cml0ZV9zcGFjZShzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IChkbWFidWYtPnN3cHRyICsgZG1hYnVmLT5jb3VudCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJX19hbGlfdXBkYXRlX2x2aShzdGF0ZSwgMyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCX0gZWxzZQorCQkJCXN0YXJ0X3NwZGlmb3V0KHN0YXRlKTsKKwkJfQorCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCAmJiAhKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpKSB7CisJCQlpZiAoIWRtYWJ1Zi0+cmVhZF9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5yZWFkX2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkKTsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZF9jaGFubmVsKQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssCisJCQkJCQkgIGZsYWdzKTsKKwkJCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAxKTsKKwkJCXN0YXJ0X2FkYyhzdGF0ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfU0VURFVQTEVYXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWFsaV91cGRhdGVfcHRyKHN0YXRlKTsKKwkJdmFsID0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfR0VUT0RFTEFZICVkXG4iLCBkbWFidWYtPmNvdW50KTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9SQVRFICVkXG4iLCBkbWFidWYtPnJhdGUpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnJhdGUsIHApOworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9DSEFOTkVMU1xuIik7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKDIsIHApOworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNPVU5EX1BDTV9SRUFEX0JJVFNcbiIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSwgcCk7CisJY2FzZSBTTkRDVExfRFNQX1NFVFNQRElGOgkvKiBTZXQgUy9QRElGIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfU0VUU1BESUZcbiIpOworI2VuZGlmCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29kZWMgc3VwcG9ydHMgUy9QRElGIHRyYW5zbWl0dGVyICovCisJCWlmICgoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiA0KSkgeworCQkJLyogbWFzayBvdXQgdGhlIHRyYW5zbWl0dGVyIHNwZWVkIGJpdHMgc28gdGhlIHVzZXIgY2FuJ3Qgc2V0IHRoZW0gKi8KKwkJCXZhbCAmPSB+MHgzMDAwOworCQkJLyogQWRkIHRoZSBjdXJyZW50IHRyYW5zbWl0dGVyIHNwZWVkIGJpdHMgdG8gdGhlIHBhc3NlZCB2YWx1ZSAqLworCQkJcmV0ID0gYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1NQRElGX0NPTlRST0wpOworCQkJdmFsIHw9IChyZXQgJiAweDMwMDApOworCQkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1NQRElGX0NPTlRST0wsIHZhbCk7CisJCQlpZiAoYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1NQRElGX0NPTlRST0wpICE9IHZhbCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYWxpX2F1ZGlvOiBVbmFibGUgdG8gc2V0IFMvUERJRiBjb25maWd1cmF0aW9uIHRvIDB4JTA0eC5cbiIsIHZhbCk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKyNpZmRlZiBERUJVRworCQllbHNlCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGlfYXVkaW86IFMvUERJRiB0cmFuc21pdHRlciBub3QgYXZhbGlibGUuXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwljYXNlIFNORENUTF9EU1BfR0VUU1BESUY6CS8qIEdldCBTL1BESUYgQ29udHJvbCByZWdpc3RlciAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRTUERJRlxuIik7CisjZW5kaWYKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb2RlYyBzdXBwb3J0cyBTL1BESUYgdHJhbnNtaXR0ZXIgKi8KKwkJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiA0KSkgeworI2lmZGVmIERFQlVHCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGlfYXVkaW86IFMvUERJRiB0cmFuc21pdHRlciBub3QgYXZhbGlibGUuXG4iKTsKKyNlbmRpZgorCQkJdmFsID0gMDsKKwkJfSBlbHNlIHsKKwkJCXZhbCA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19TUERJRl9DT05UUk9MKTsKKwkJfQorCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworLy9lbmQgYWRkIHN1cHBvcnQgc3BkaWYgb3V0CisvL2FkZCBzdXBwb3J0IDQsNiBjaGFubmVsCisJY2FzZSBTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTS1xuIik7CisjZW5kaWYKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJLyogQmFzZWQgb24gQUMnOTcgREFDIHN1cHBvcnQsIG5vdCBJQ0ggaGFyZHdhcmUgKi8KKwkJdmFsID0gRFNQX0JJTkRfRlJPTlQ7CisJCWlmIChzdGF0ZS0+Y2FyZC0+YWM5N19mZWF0dXJlcyAmIDB4MDAwNCkKKwkJCXZhbCB8PSBEU1BfQklORF9TUERJRjsKKwkJaWYgKHN0YXRlLT5jYXJkLT5hYzk3X2ZlYXR1cmVzICYgMHgwMDgwKQorCQkJdmFsIHw9IERTUF9CSU5EX1NVUlI7CisJCWlmIChzdGF0ZS0+Y2FyZC0+YWM5N19mZWF0dXJlcyAmIDB4MDE0MCkKKwkJCXZhbCB8PSBEU1BfQklORF9DRU5URVJfTEZFOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwljYXNlIFNORENUTF9EU1BfQklORF9DSEFOTkVMOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9CSU5EX0NIQU5ORUxcbiIpOworI2VuZGlmCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPT0gRFNQX0JJTkRfUVVFUlkpIHsKKwkJCXZhbCA9IERTUF9CSU5EX0ZST05UOwkvKiBBbHdheXMgcmVwb3J0IHRoaXMgYXMgYmVpbmcgZW5hYmxlZCAqLworCQkJaWYgKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OKQorCQkJCXZhbCB8PSBEU1BfQklORF9TUERJRjsKKwkJCWVsc2UgeworCQkJCWlmIChzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTVVJSX09OKQorCQkJCQl2YWwgfD0gRFNQX0JJTkRfU1VSUjsKKwkJCQlpZiAoc3RhdGUtPmNhcmQtPgorCQkJCSAgICBhYzk3X3N0YXR1cyAmIENFTlRFUl9MRkVfT04pCisJCQkJCXZhbCB8PSBEU1BfQklORF9DRU5URVJfTEZFOworCQkJfQorCQl9IGVsc2UgewkvKiBOb3QgYSBxdWVyeSwgc2V0IGl0ICovCisJCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZG1hYnVmLT5lbmFibGUgPT0gREFDX1JVTk5JTkcpIHsKKwkJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQl9CisJCQlpZiAodmFsICYgRFNQX0JJTkRfU1BESUYpIHsJLyogVHVybiBvbiBTUERJRiAqLworCQkJCS8qICBPaywgdGhpcyBzaG91bGQgcHJvYmFibHkgZGVmaW5lIHdoYXQgc2xvdHMKKwkJCQkgKiAgdG8gdXNlLiBGb3Igbm93LCB3ZSdsbCBvbmx5IHNldCBpdCB0byB0aGUKKwkJCQkgKiAgZGVmYXVsdHM6CisJCQkJICogCisJCQkJICogICBub24gbXVsdGljaGFubmVsIGNvZGVjIG1hcHMgdG8gc2xvdHMgMyY0CisJCQkJICogICAyIGNoYW5uZWwgY29kZWMgbWFwcyB0byBzbG90cyA3JjgKKwkJCQkgKiAgIDQgY2hhbm5lbCBjb2RlYyBtYXBzIHRvIHNsb3RzIDYmOQorCQkJCSAqICAgNiBjaGFubmVsIGNvZGVjIG1hcHMgdG8gc2xvdHMgMTAmMTEKKwkJCQkgKgorCQkJCSAqICB0aGVyZSBzaG91bGQgYmUgc29tZSB3YXkgZm9yIHRoZSBhcHAgdG8KKwkJCQkgKiAgc2VsZWN0IHRoZSBzbG90IGFzc2lnbm1lbnQuCisJCQkJICovCisJCQkJaV9zY3IgPSBpbmwoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpOworCQkJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisKKwkJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAxMDAwMDApIHsKKwkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCBBQzk3X0VBX1NQU0FfN184LCBjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAyMDAwMDApIHsKKwkJCQkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgQUM5N19FQV9TUFNBXzZfOSwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAzMDAwMDApIHsKKwkJCQkJCQkJYWxpX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV8xMF8xMSwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgewkvKiBjb2RlYyBzcGRpZiBvdXQgKHBjbSBvdXQgc2hhcmUgKSAqLworCQkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgQUM5N19FQV9TUFNBXzNfNCwgZG1hYnVmLT5yYXRlKTsJLy9JIGRvIG5vdCBtb2RpZnkKKwkJCQl9CisKKwkJCQlpZiAoIShzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTUERJRl9PTikpCisJCQkJCXZhbCAmPSB+RFNQX0JJTkRfU1BESUY7CisJCQl9IGVsc2UgeworCQkJCWludCBtYXNrOworCQkJCWludCBjaGFubmVsczsKKwkJCQkvKiBUdXJuIG9mZiBTL1BESUYgaWYgaXQgd2FzIG9uICovCisJCQkJaWYgKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OKQorCQkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgLTEsIDApOworCQkJCW1hc2sgPQorCQkJCSAgICB2YWwgJiAoRFNQX0JJTkRfRlJPTlQgfCBEU1BfQklORF9TVVJSIHwKKwkJCQkJICAgRFNQX0JJTkRfQ0VOVEVSX0xGRSk7CisJCQkJc3dpdGNoIChtYXNrKSB7CisJCQkJY2FzZSBEU1BfQklORF9GUk9OVDoKKwkJCQkJY2hhbm5lbHMgPSAyOworCQkJCQlicmVhazsKKwkJCQljYXNlIERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUjoKKwkJCQkJY2hhbm5lbHMgPSA0OworCQkJCQlicmVhazsKKwkJCQljYXNlIERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUiB8IERTUF9CSU5EX0NFTlRFUl9MRkU6CisJCQkJCWNoYW5uZWxzID0gNjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdmFsID0gRFNQX0JJTkRfRlJPTlQ7CisJCQkJCWNoYW5uZWxzID0gMjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWFsaV9zZXRfZGFjX2NoYW5uZWxzKHN0YXRlLCBjaGFubmVscyk7CisJCQkJLyogY2hlY2sgdGhhdCB0aGV5IHJlYWxseSBnb3QgdHVybmVkIG9uICovCisJCQkJaWYgKCFzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTVVJSX09OKQorCQkJCQl2YWwgJj0gfkRTUF9CSU5EX1NVUlI7CisJCQkJaWYgKCFzdGF0ZS0+Y2FyZC0+CisJCQkJICAgIGFjOTdfc3RhdHVzICYgQ0VOVEVSX0xGRV9PTikKKwkJCQkJdmFsICY9IH5EU1BfQklORF9DRU5URVJfTEZFOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKKwljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYWxpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IGRldnM7CisJc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUgPSBOVUxMOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgaW50IGlfc2NyOworCQorCS8qIGZpbmQgYW4gYXZhaWxhYmxlIHZpcnR1YWwgY2hhbm5lbCAoaW5zdGFuY2Ugb2YgL2Rldi9kc3ApICovCisJCisJd2hpbGUgKGNhcmQgIT0gTlVMTCkgeworCisJCS8qCisJCSAqIElmIHdlIGFyZSBpbml0aWFsaXppbmcgYW5kIHRoZW4gZmFpbCwgY2FyZCBjb3VsZCBnbworCQkgKiBhd2F5IHVudWV4cGVjdGVkbHkgd2hpbGUgd2UgYXJlIGluIHRoZSBmb3IoKSBsb29wLgorCQkgKiBTbywgY2hlY2sgZm9yIGNhcmQgb24gZWFjaCBpdGVyYXRpb24gYmVmb3JlIHdlIGNoZWNrCisJCSAqIGZvciBjYXJkLT5pbml0aWFsaXppbmcgdG8gYXZvaWQgYSBwb3NzaWJsZSBvb3BzLgorCQkgKiBUaGlzIHVzdWFsbHkgb25seSBtYXR0ZXJzIGZvciB0aW1lcyB3aGVuIHRoZSBkcml2ZXIgaXMKKwkJICogYXV0b2xvYWRlZCBieSBrbW9kLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDUwICYmIGNhcmQgJiYgY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAyMCk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0ggJiYgY2FyZCAmJiAhY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspIHsKKwkJCWlmIChjYXJkLT5zdGF0ZXNbaV0gPT0gTlVMTCkgeworCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzW2ldID0gKHN0cnVjdCBhbGlfc3RhdGUgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGFsaV9zdGF0ZSksIEdGUF9LRVJORUwpOworCQkJCWlmIChzdGF0ZSA9PSBOVUxMKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgYWxpX3N0YXRlKSk7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJZ290byBmb3VuZF92aXJ0OworCQkJfQorCQl9CisJCWNhcmQgPSBjYXJkLT5uZXh0OworCX0KKworCS8qIG5vIG1vcmUgdmlydHVhbCBjaGFubmVsIGF2YWlhYmxlICovCisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIC1FTk9ERVY7Citmb3VuZF92aXJ0OgorCS8qIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgY2hhbm5lbCAqLworCisJc3RhdGUtPnZpcnQgPSBpOworCXN0YXRlLT5jYXJkID0gY2FyZDsKKwlzdGF0ZS0+bWFnaWMgPSBBTEk1NDU1X1NUQVRFX01BR0lDOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7CisJaW5pdF9NVVRFWCgmc3RhdGUtPm9wZW5fc2VtKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzdGF0ZTsKKwlkbWFidWYtPnRyaWdnZXIgPSAwOworCS8qIGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWxzICovCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKChkbWFidWYtPnJlYWRfY2hhbm5lbCA9CisJCSAgICAgY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKGNhcmQpKSA9PSBOVUxMKSB7CisJCQlrZnJlZShjYXJkLT5zdGF0ZXNbaV0pOworCQkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJZG1hYnVmLT50cmlnZ2VyIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWFsaV9zZXRfYWRjX3JhdGUoc3RhdGUsIDgwMDApOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCWlmICgoZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsID0gY2FyZC0+YWxsb2NfY29kZWNfc3BkaWZvdXRfY2hhbm5lbChjYXJkKSkgPT0gTlVMTCkgeworCQkJCWtmcmVlKGNhcmQtPnN0YXRlc1tpXSk7CisJCQkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJZG1hYnVmLT50cmlnZ2VyIHw9IFNQRElGX0VOQUJMRV9PVVRQVVQ7CisJCQlhbGlfc2V0X2NvZGVjc3BkaWZvdXRfcmF0ZShzdGF0ZSwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkKTsJLy9JdCBtdXN0IGFkZAorCQkJaV9zY3IgPSBpbmwoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpOworCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAxMDAwMDApIHsKKwkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgQUM5N19FQV9TUFNBXzdfOCwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAyMDAwMDApIHsKKwkJCQkJYWxpX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV82XzksIGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAzMDAwMDApIHsKKwkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCBBQzk3X0VBX1NQU0FfMTBfMTEsIGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgQUM5N19FQV9TUFNBXzdfOCwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmICgoZG1hYnVmLT5jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwgPSBjYXJkLT5hbGxvY19jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwoY2FyZCkpID09IE5VTEwpIHsKKwkJCQkJa2ZyZWUoY2FyZC0+c3RhdGVzW2ldKTsKKwkJCQkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisJCQkJZG1hYnVmLT50cmlnZ2VyIHw9IFNQRElGX0VOQUJMRV9PVVRQVVQ7CisJCQkJYWxpX3NldF9zcGRpZm91dF9yYXRlKHN0YXRlLCBjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQl9IGVsc2UgeworCQkJCWlmICgoZG1hYnVmLT53cml0ZV9jaGFubmVsID0gY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCkpID09IE5VTEwpIHsKKwkJCQkJa2ZyZWUoY2FyZC0+c3RhdGVzW2ldKTsKKwkJCQkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisJCQkJLyogSW5pdGlhbGl6ZSB0byA4a0h6PyAgV2hhdCBpZiB3ZSBkb24ndCBzdXBwb3J0IDhrSHo/ICovCisJCQkJLyogIExldCdzIGNoYW5nZSB0aGlzIHRvIGNoZWNrIGZvciBTL1BESUYgc3R1ZmYgKi8KKworCQkJCWRtYWJ1Zi0+dHJpZ2dlciB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJCQlpZiAoY29kZWNfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCkgeworCQkJCQlhbGlfc2V0X2RhY19yYXRlKHN0YXRlLCBjb2RlY19wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkKTsKKwkJCQkJYWxpX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV8zXzQsIGNvZGVjX3BjbW91dF9zaGFyZV9zcGRpZl9sb2NrZWQpOworCQkJCX0gZWxzZSB7CisJCQkJCWFsaV9zZXRfZGFjX3JhdGUoc3RhdGUsIDgwMDApOworCQkJCX0KKwkJCX0KKworCQl9CisJfQorCisJLyogc2V0IGRlZmF1bHQgc2FtcGxlIGZvcm1hdC4gQWNjb3JkaW5nIHRvIE9TUyBQcm9ncmFtbWVyJ3MgR3VpZGUgIC9kZXYvZHNwCisJICAgc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kCisJICAgL2Rldi9kc3BXIHdpbGwgYWNjZXB0IDE2LWJpdHMgc2FtcGxlLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aG9zZSBzbyB3ZQorCSAgIHNldCBpdCBpbW1lZGlhdGVseSB0byBzdGVyZW8gYW5kIDE2Yml0LCB3aGljaCBpcyBhbGwgd2UgZG8gc3VwcG9ydCAqLworCWRtYWJ1Zi0+Zm10IHw9IEFMSTU0NTVfRk1UXzE2QklUIHwgQUxJNTQ1NV9GTVRfU1RFUkVPOworCWRtYWJ1Zi0+b3NzZnJhZ3NpemUgPSAwOworCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAwOworCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSAwOworCXN0YXRlLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJb3V0bCgweDAwMDAwMDAwLCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUQ1IpOworCW91dGwoMHgwMDAwMDAwMCwgY2FyZC0+aW9iYXNlICsgQUxJX0lOVEVSUlVQVFNSKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgYWxpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGFsaV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb2NrX2tlcm5lbCgpOworCQorCS8qIHN0b3AgRE1BIHN0YXRlIG1hY2hpbmUgYW5kIGZyZWUgRE1BIGJ1ZmZlcnMvY2hhbm5lbHMgKi8KKwlpZiAoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9PVVRQVVQpCisJCWRyYWluX2RhYyhzdGF0ZSwgMCk7CisKKwlpZiAoZG1hYnVmLT50cmlnZ2VyICYgU1BESUZfRU5BQkxFX09VVFBVVCkKKwkJZHJhaW5fc3BkaWZvdXQoc3RhdGUsIDApOworCQorCWlmIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQlzdG9wX2FkYyhzdGF0ZSk7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlkZWFsbG9jX2RtYWJ1ZihzdGF0ZSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsLT5udW0pOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkKKwkJCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwKKwkJCQkJCQkgICAgICBkbWFidWYtPmNvbnRyb2xsZXJfc3BkaWZvdXRfY2hhbm5lbC0+bnVtKTsKKwkJCWVsc2Ugc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsCisJCQkJCQkJICAgICAgZG1hYnVmLT53cml0ZV9jaGFubmVsLT5udW0pOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5yZWFkX2NoYW5uZWwtPm51bSk7CisKKwlzdGF0ZS0+Y2FyZC0+c3RhdGVzW3N0YXRlLT52aXJ0XSA9IE5VTEw7CisJa2ZyZWUoc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWxpX2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLCAKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywgCisJLnJlYWQJCT0gYWxpX3JlYWQsCisJLndyaXRlCQk9IGFsaV93cml0ZSwgCisJLnBvbGwJCT0gYWxpX3BvbGwsCisJLmlvY3RsCQk9IGFsaV9pb2N0bCwKKwkubW1hcAkJPSBhbGlfbW1hcCwKKwkub3BlbgkJPSBhbGlfb3BlbiwKKwkucmVsZWFzZQk9IGFsaV9yZWxlYXNlLAorfTsKKworLyogUmVhZCBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLworc3RhdGljIHUxNiBhbGlfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKQoreworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IGRldi0+cHJpdmF0ZV9kYXRhOworCWludCBjb3VudDEgPSAxMDA7CisJY2hhciB2YWw7CisJdW5zaWduZWQgc2hvcnQgaW50IGRhdGEgPSAwLCBjb3VudCwgYWRkcjEsIGFkZHIyID0gMDsKKworCXNwaW5fbG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwl3aGlsZSAoY291bnQxLS0gJiYgKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfQ0FTKSAmIDB4ODAwMDAwMDApKQorCQl1ZGVsYXkoMSk7CisKKwlhZGRyMSA9IHJlZzsKKwlyZWcgfD0gMHgwMDgwOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDB4N2Y7IGNvdW50KyspIHsKKwkJdmFsID0gaW5iKGNhcmQtPmlvYmFzZSArIEFMSV9DU1BTUik7CisJCWlmICh2YWwgJiAweDA4KQorCQkJYnJlYWs7CisJfQorCWlmIChjb3VudCA9PSAweDdmKQorCXsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJb3V0dyhyZWcsIChjYXJkLT5pb2Jhc2UgKyBBTElfQ1BSKSArIDIpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDB4N2Y7IGNvdW50KyspIHsKKwkJdmFsID0gaW5iKGNhcmQtPmlvYmFzZSArIEFMSV9DU1BTUik7CisJCWlmICh2YWwgJiAweDAyKSB7CisJCQlkYXRhID0gaW53KGNhcmQtPmlvYmFzZSArIEFMSV9TUFIpOworCQkJYWRkcjIgPSBpbncoKGNhcmQtPmlvYmFzZSArIEFMSV9TUFIpICsgMik7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwlpZiAoY291bnQgPT0gMHg3ZikKKwkJcmV0dXJuIC0xOworCWlmIChhZGRyMiAhPSBhZGRyMSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAoKHUxNikgZGF0YSk7Cit9CisKKy8qIHdyaXRlIGFjOTcgY29kZWMgcmVnaXN0ZXIgICAqLworCitzdGF0aWMgdm9pZCBhbGlfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKKwlpbnQgY291bnQxID0gMTAwOworCWNoYXIgdmFsOworCXVuc2lnbmVkIHNob3J0IGludCBjb3VudDsKKworCXNwaW5fbG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwl3aGlsZSAoY291bnQxLS0gJiYgKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfQ0FTKSAmIDB4ODAwMDAwMDApKQorCQl1ZGVsYXkoMSk7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAweDdmOyBjb3VudCsrKSB7CisJCXZhbCA9IGluYihjYXJkLT5pb2Jhc2UgKyBBTElfQ1NQU1IpOworCQlpZiAodmFsICYgMHgwOCkKKwkJCWJyZWFrOworCX0KKwlpZiAoY291bnQgPT0gMHg3ZikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGlfYWM5N19zZXQ6IEFDOTcgY29kZWMgcmVnaXN0ZXIgYWNjZXNzIHRpbWVkIG91dC4gXG4iKTsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJCXJldHVybjsKKwl9CisJb3V0dyhkYXRhLCAoY2FyZC0+aW9iYXNlICsgQUxJX0NQUikpOworCW91dGIocmVnLCAoY2FyZC0+aW9iYXNlICsgQUxJX0NQUikgKyAyKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAweDdmOyBjb3VudCsrKSB7CisJCXZhbCA9IGluYihjYXJkLT5pb2Jhc2UgKyBBTElfQ1NQU1IpOworCQlpZiAodmFsICYgMHgwMSkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwlpZiAoY291bnQgPT0gMHg3ZikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxpX2FjOTdfc2V0OiBBQzk3IGNvZGVjIHJlZ2lzdGVyIGFjY2VzcyB0aW1lZCBvdXQuIFxuIik7CisJcmV0dXJuOworfQorCisvKiBPU1MgL2Rldi9taXhlciBmaWxlIG9wZXJhdGlvbiBtZXRob2RzICovCisKK3N0YXRpYyBpbnQgYWxpX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gZGV2czsKKwlmb3IgKGNhcmQgPSBkZXZzOyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0KSB7CisJCS8qCisJCSAqIElmIHdlIGFyZSBpbml0aWFsaXppbmcgYW5kIHRoZW4gZmFpbCwgY2FyZCBjb3VsZCBnbworCQkgKiBhd2F5IHVudWV4cGVjdGVkbHkgd2hpbGUgd2UgYXJlIGluIHRoZSBmb3IoKSBsb29wLgorCQkgKiBTbywgY2hlY2sgZm9yIGNhcmQgb24gZWFjaCBpdGVyYXRpb24gYmVmb3JlIHdlIGNoZWNrCisJCSAqIGZvciBjYXJkLT5pbml0aWFsaXppbmcgdG8gYXZvaWQgYSBwb3NzaWJsZSBvb3BzLgorCQkgKiBUaGlzIHVzdWFsbHkgb25seSBtYXR0ZXJzIGZvciB0aW1lcyB3aGVuIHRoZSBkcml2ZXIgaXMKKwkJICogYXV0b2xvYWRlZCBieSBrbW9kLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDUwICYmIGNhcmQgJiYgY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAyMCk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTcgJiYgY2FyZCAmJiAhY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspCisJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMCisJCQkgICAgJiYgY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyID09IG1pbm9yKSB7CisJCQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZC0+YWM5N19jb2RlY1tpXTsKKwkJCQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisJCQl9CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGFsaV9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhbGlfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwgCisJLmxsc2Vlawk9IG5vX2xsc2VlaywgCisJLmlvY3RsCT0gYWxpX2lvY3RsX21peGRldiwKKwkub3Blbgk9IGFsaV9vcGVuX21peGRldiwKK307CisKKy8qIEFDOTcgY29kZWMgaW5pdGlhbGlzYXRpb24uICBUaGVzZSBzbWFsbCBmdW5jdGlvbnMgZXhpc3Qgc28gd2UgZG9uJ3QKKyAgIGR1cGxpY2F0ZSBjb2RlIGJldHdlZW4gbW9kdWxlIGluaXQgYW5kIGFwbSByZXN1bWUgKi8KKworc3RhdGljIGlubGluZSBpbnQgYWxpX2FjOTdfZXhpc3RzKHN0cnVjdCBhbGlfY2FyZCAqY2FyZCwgaW50IGFjOTdfbnVtYmVyKQoreworCXVuc2lnbmVkIGludCBpID0gMTsKKwl1MzIgcmVnID0gaW5sKGNhcmQtPmlvYmFzZSArIEFMSV9SVFNSKTsKKwlpZiAoYWM5N19udW1iZXIpIHsKKwkJd2hpbGUgKGkgPCAxMDApIHsKKworCQkJcmVnID0gaW5sKGNhcmQtPmlvYmFzZSArIEFMSV9SVFNSKTsKKwkJCWlmIChyZWcgJiAweDQwKSB7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCW91dGwocmVnIHwgMHgwMDAwMDA0MCwKKwkJCQkgICAgIGNhcmQtPmlvYmFzZSArIDB4MzQpOworCQkJCXVkZWxheSgxKTsKKwkJCX0KKwkJCWkrKzsKKwkJfQorCisJfSBlbHNlIHsKKwkJd2hpbGUgKGkgPCAxMDApIHsKKwkJCXJlZyA9IGlubChjYXJkLT5pb2Jhc2UgKyBBTElfUlRTUik7CisJCQlpZiAocmVnICYgMHg4MCkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlvdXRsKHJlZyB8IDB4MDAwMDAwODAsCisJCQkJICAgICBjYXJkLT5pb2Jhc2UgKyAweDM0KTsKKwkJCQl1ZGVsYXkoMSk7CisJCQl9CisJCQlpKys7CisJCX0KKwl9CisKKwlpZiAoYWM5N19udW1iZXIpCisJCXJldHVybiByZWcgJiAweDQwOworCWVsc2UKKwkJcmV0dXJuIHJlZyAmIDB4ODA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFsaV9hYzk3X2VuYWJsZV92YXJpYWJsZV9yYXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCA5KTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCBhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKSB8IDB4RTgwMCk7CisJcmV0dXJuIChhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKSAmIDEpOworfQorCisKK3N0YXRpYyBpbnQgYWxpX2FjOTdfcHJvYmVfYW5kX3Bvd2VydXAoc3RydWN0IGFsaV9jYXJkICpjYXJkLCBzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJLyogUmV0dXJucyAwIG9uIGZhaWx1cmUgKi8KKwlpbnQgaTsKKwl1MTYgYWRkcjsKKwlpZiAoYWM5N19wcm9iZV9jb2RlYyhjb2RlYykgPT0gMCkKKwkJcmV0dXJuIDA7CisJLyogYWM5N19wcm9iZV9jb2RlYyBpcyBzdWNjZXNzICx0aGVuIGJlZ2luIHRvIGluaXQgY29kZWMgKi8KKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfUkVTRVQsIDB4ZmZmZik7CisJaWYgKGNhcmQtPmNoYW5uZWxbMF0udXNlZCA9PSAxKSB7CisJCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19SRUNPUkRfU0VMRUNULCAweDAwMDApOworCQlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfTElORUlOX1ZPTCwgMHgwODA4KTsKKwkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1JFQ09SRF9HQUlOLCAweDBGMEYpOworCX0KKworCWlmIChjYXJkLT5jaGFubmVsWzJdLnVzZWQgPT0gMSkJLy9pZiBNSUNpbiB0aGVuIGluaXQgY29kZWMKKwl7CisJCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19SRUNPUkRfU0VMRUNULCAweDAwMDApOworCQlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfTUlDX1ZPTCwgMHg4ODA4KTsKKwkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1JFQ09SRF9HQUlOLCAweDBGMEYpOworCQlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfUkVDT1JEX0dBSU5fTUlDLCAweDAwMDApOworCX0KKworCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTywgMHgwMDAwKTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfSEVBRFBIT05FX1ZPTCwgMHgwMDAwKTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfUENNT1VUX1ZPTCwgMHgwMDAwKTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfQ0RfVk9MLCAweDA4MDgpOworCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19WSURFT19WT0wsIDB4MDgwOCk7CisJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X0FVWF9WT0wsIDB4MDgwOCk7CisJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1BIT05FX1ZPTCwgMHg4MDQ4KTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfUENCRUVQX1ZPTCwgMHgwMDAwKTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCBBQzk3X0dQX01JWCk7CisJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfTU9OTywgMHgwMDAwKTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIDB4MzgsIDB4MDAwMCk7CisJYWRkciA9IGFsaV9hYzk3X2dldChjb2RlYywgMHgyYSk7CisJYWxpX2FjOTdfc2V0KGNvZGVjLCAweDJhLCBhZGRyIHwgMHgwMDAxKTsKKwlhZGRyID0gYWxpX2FjOTdfZ2V0KGNvZGVjLCAweDJhKTsKKwlhZGRyID0gYWxpX2FjOTdfZ2V0KGNvZGVjLCAweDI4KTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIDB4MmMsIDB4YmI4MCk7CisJYWRkciA9IGFsaV9hYzk3X2dldChjb2RlYywgMHgyYyk7CisJLyogcG93ZXIgaXQgYWxsIHVwICovCisJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsCisJCSAgICAgYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgfjB4N2YwMCk7CisJLyogd2FpdCBmb3IgYW5hbG9nIHJlYWR5ICovCisJZm9yIChpID0gMTA7IGkgJiYgKChhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAweGYpICE9IDB4Zik7IGktLSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAyMCk7CisJfQorCS8qIEZJWE1FICEhICovCisJaSsrOworCXJldHVybiBpOworfQorCisKKy8qIEkgY2xvbmUgYWxpNTQ1NSgyLjQuNyApICBub3QgY2xvbmUgaTgxMF9hdWRpbygyLjQuMTgpICAqLworCitzdGF0aWMgaW50IGFsaV9yZXNldF81NDU1KHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlvdXRsKDB4ODAwMDAwMDMsIGNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpOworCW91dGwoMHg4MzgzODM4MywgY2FyZC0+aW9iYXNlICsgQUxJX0ZJRk9DUjEpOworCW91dGwoMHg4MzgzODM4MywgY2FyZC0+aW9iYXNlICsgQUxJX0ZJRk9DUjIpOworCWlmIChjb250cm9sbGVyX3BjbW91dF9zaGFyZV9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCW91dGwoKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfU1BESUZJQ1MpIHwgMHgwMDAwMDAwMSksCisJCSAgICAgY2FyZC0+aW9iYXNlICsgQUxJX1NQRElGSUNTKTsKKwkJb3V0bCgweDA0MDgwMDBhLCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJGQUNFQ1IpOworCX0gZWxzZSB7CisJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlvdXRsKChpbmwoY2FyZC0+aW9iYXNlICsgQUxJX1NDUikgfCAweDAwMTAwMDAwKSwgY2FyZC0+aW9iYXNlICsgQUxJX1NDUik7CS8vIG5vdyBJIHNlbGVjdCBzbG90IDcgJiA4CisJCQlvdXRsKDB4MDAyMDAwMDAsIGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUkZBQ0VDUik7CS8vZW5hYmxlIGNvZGVjIGluZGVwZW5kZW50IHNwZGlmb3V0IAorCQl9IGVsc2UKKwkJCW91dGwoMHgwNDA4MDAwMiwgY2FyZC0+aW9iYXNlICsgQUxJX0lOVEVSRkFDRUNSKTsKKwl9CisKKwlvdXRsKDB4MDAwMDAwMDAsIGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUlJVUFRDUik7CisJb3V0bCgweDAwMDAwMDAwLCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpOworCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApCisJCW91dGwoKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfU1BESUZJQ1MpIHwgMHgwMDAwMDAwMSksCisJCSAgICAgY2FyZC0+aW9iYXNlICsgQUxJX1NQRElGSUNTKTsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGFsaV9hYzk3X3JhbmRvbV9pbml0X3N0dWZmKHN0cnVjdCBhbGlfY2FyZAorCQkJCSAgICAgICpjYXJkKQoreworCXUzMiByZWcgPSBpbmwoY2FyZC0+aW9iYXNlICsgQUxJX1NDUik7CisJaW50IGkgPSAwOworCXJlZyA9IGlubChjYXJkLT5pb2Jhc2UgKyBBTElfU0NSKTsKKwlpZiAoKHJlZyAmIDIpID09IDApCS8qIENvbGQgcmVxdWlyZWQgKi8KKwkJcmVnIHw9IDI7CisJZWxzZQorCQlyZWcgfD0gMTsJLyogV2FybSAqLworCXJlZyAmPSB+MHg4MDAwMDAwMDsJLyogQUNMaW5rIG9uICovCisJb3V0bChyZWcsIGNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpOworCisJd2hpbGUgKGkgPCAxMCkgeworCQlpZiAoKGlubChjYXJkLT5pb2Jhc2UgKyAweDE4KSAmICgxIDw8IDEpKSA9PSAwKQorCQkJYnJlYWs7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAyMCk7CisJCWkrKzsKKwl9CisJaWYgKGkgPT0gMTApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGlfYXVkaW86IEFDJzk3IHJlc2V0IGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWiAvIDIpOworCXJldHVybiAxOworfQorCisvKiBBQzk3IGNvZGVjIGluaXRpYWxpc2F0aW9uLiAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhbGlfYWM5N19pbml0KHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlpbnQgbnVtX2FjOTcgPSAwOworCWludCB0b3RhbF9jaGFubmVscyA9IDA7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCXUxNiBlaWQ7CisKKwlpZiAoIWFsaV9hYzk3X3JhbmRvbV9pbml0X3N0dWZmKGNhcmQpKQorCQlyZXR1cm4gMDsKKworCS8qIE51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgKi8KKwkvKiBXaGF0IGFib3V0IHRoZSBjb2RlYz8gIEp1c3QgYmVjYXVzZSB0aGUgSUNIIHN1cHBvcnRzICovCisJLyogbXVsdGlwbGUgY2hhbm5lbHMgZG9lc24ndCBtZWFuIHRoZSBjb2RlYyBkb2VzLiAgICAgICAqLworCS8qIHdlJ2xsIGhhdmUgdG8gbW9kaWZ5IHRoaXMgaW4gdGhlIGNvZGVjIHNlY3Rpb24gYmVsb3cgKi8KKwkvKiB0byByZWZsZWN0IHdoYXQgdGhlIGNvZGVjIGhhcy4gICAgICAgICAgICAgICAgICAgICAgICovCisJLyogSUNIIGFuZCBJQ0gwIG9ubHkgc3VwcG9ydCAyIGNoYW5uZWxzIHNvIGRvbid0IGJvdGhlciAqLworCS8qIHRvIGNoZWNrLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbmwoY2FyZC0+aW9iYXNlICsgQUxJX0NQUik7CisJY2FyZC0+Y2hhbm5lbHMgPSAyOworCisJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgeworCisJCS8qIEFzc3VtZSBjb2RlYyBpc24ndCBhdmFpbGFibGUgdW50aWwgd2UgZ28gdGhyb3VnaCB0aGUKKwkJICogZ2F1bnRsZXQgYmVsb3cgKi8KKwkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBOVUxMOworCQkvKiBUaGUgSUNIIHByb2dyYW1tZXIncyByZWZlcmVuY2Ugc2F5cyB5b3Ugc2hvdWxkICAgKi8KKwkJLyogY2hlY2sgdGhlIHJlYWR5IHN0YXR1cyBiZWZvcmUgcHJvYmluZy4gU28gd2UgY2hrICovCisJCS8qICAgV2hhdCBkbyB3ZSBkbyBpZiBpdCdzIG5vdCByZWFkeT8gIFdhaXQgYW5kIHRyeSAqLworCQkvKiAgIGFnYWluLCBvciBhYm9ydD8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJaWYgKCFhbGlfYWM5N19leGlzdHMoY2FyZCwgbnVtX2FjOTcpKSB7CisJCQlpZiAobnVtX2FjOTcgPT0gMCkKKwkJCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogUHJpbWFyeSBjb2RlYyBub3QgcmVhZHkuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChjb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyB3aWxsIGJlIGZpbGxlZAorCQkgICBpbiBhYzk3X3Byb2JlX2NvZGVjICovCisJCWNvZGVjLT5wcml2YXRlX2RhdGEgPSBjYXJkOworCQljb2RlYy0+aWQgPSBudW1fYWM5NzsKKwkJY29kZWMtPmNvZGVjX3JlYWQgPSBhbGlfYWM5N19nZXQ7CisJCWNvZGVjLT5jb2RlY193cml0ZSA9IGFsaV9hYzk3X3NldDsKKwkJaWYgKCFhbGlfYWM5N19wcm9iZV9hbmRfcG93ZXJ1cChjYXJkLCBjb2RlYykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWxpX2F1ZGlvOiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgY29kZWMgJWQgYW5hbG9nIHJlYWR5IiwKKwkJCSAgICAgbnVtX2FjOTcpOworCQkJa2ZyZWUoY29kZWMpOworCQkJYnJlYWs7CS8qIGl0IGRpZG4ndCB3b3JrICovCisJCX0KKwkJCisJCS8qIFN0b3JlIHN0YXRlIGluZm9ybWF0aW9uIGFib3V0IFMvUERJRiB0cmFuc21pdHRlciAqLworCQljYXJkLT5hYzk3X3N0YXR1cyA9IDA7CisJCS8qIERvbid0IGF0dGVtcHQgdG8gZ2V0IGVpZCB1bnRpbCBwb3dlcnVwIGlzIGNvbXBsZXRlICovCisJCWVpZCA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCk7CisJCWlmIChlaWQgPT0gMHhGRkZGKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogbm8gY29kZWMgYXR0YWNoZWQgP1xuIik7CisJCQlrZnJlZShjb2RlYyk7CisJCQlicmVhazsKKwkJfQorCisJCWNhcmQtPmFjOTdfZmVhdHVyZXMgPSBlaWQ7CisJCS8qIE5vdyBjaGVjayB0aGUgY29kZWMgZm9yIHVzZWZ1bCBmZWF0dXJlcyB0byBtYWtlIHVwIGZvcgorCQkgICB0aGUgZHVtYm5lc3Mgb2YgdGhlIGFsaTU0NTUgaGFyZHdhcmUgZW5naW5lICovCisJCWlmICghKGVpZCAmIDB4MDAwMSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImFsaV9hdWRpbzogb25seSA0OEtoeiBwbGF5YmFjayBhdmFpbGFibGUuXG4iKTsKKwkJZWxzZSB7CisJCQlpZiAoIWFsaV9hYzk3X2VuYWJsZV92YXJpYWJsZV9yYXRlKGNvZGVjKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgImFsaV9hdWRpbzogQ29kZWMgcmVmdXNlZCB0byBhbGxvdyBWUkEsIHVzaW5nIDQ4S2h6IG9ubHkuXG4iKTsKKwkJCQljYXJkLT5hYzk3X2ZlYXR1cmVzICY9IH4xOworCQkJfQorCQl9CisKKwkJLyogRGV0ZXJtaW5lIGhvdyBtYW55IGNoYW5uZWxzIHRoZSBjb2RlYyhzKSBzdXBwb3J0ICAgKi8KKwkJLyogICAtIFRoZSBwcmltYXJ5IGNvZGVjIGFsd2F5cyBzdXBwb3J0cyAyICAgICAgICAgICAgKi8KKwkJLyogICAtIElmIHRoZSBjb2RlYyBzdXBwb3J0cyBBTUFQLCBzdXJyb3VuZCBEQUNzIHdpbGwgKi8KKwkJLyogICAgIGF1dG9tYXRpY2xseSBnZXQgYXNzaWduZWQgdG8gc2xvdHMuICAgICAgICAgICAgKi8KKwkJLyogICAgICogQ2hlY2sgZm9yIHN1cnJvdW5kIERBQ3MgYW5kIGluY3JlbWVudCBpZiAgICAgKi8KKwkJLyogICAgICAgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJLyogICAtIEVsc2UgY2hlY2sgaWYgdGhlIGNvZGVjIGlzIHJldmlzaW9uIDIuMiAgICAgICAgKi8KKwkJLyogICAgICogSWYgc3Vycm91bmQgREFDcyBleGlzdCwgYXNzaWduIHRoZW0gdG8gc2xvdHMgKi8KKwkJLyogICAgICAgYW5kIGluY3JlbWVudCBjaGFubmVsIGNvdW50LiAgICAgICAgICAgICAgICAgKi8KKworCQkvKiBBbGwgb2YgdGhpcyBvbmx5IGFwcGxpZXMgdG8gSUNIMiBhbmQgYWJvdmUuIElDSCAgICAqLworCQkvKiBhbmQgSUNIMCBvbmx5IHN1cHBvcnQgMiBjaGFubmVscy4gIElDSDIgd2lsbCBvbmx5ICAqLworCQkvKiBzdXBwb3J0IG11bHRpcGxlIGNvZGVjcyBpbiBhICJzcGxpdCBhdWRpbyIgY29uZmlnLiAqLworCQkvKiBhcyBkZXNjcmliZWQgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJCS8qIFRPRE86IFJlbW92ZSBhbGwgdGhlIGRlYnVnZ2luZyBtZXNzYWdlcyEgICAgICAgICAgICovCisKKwkJaWYgKChlaWQgJiAweGMwMDApID09IDApCS8qIHByaW1hcnkgY29kZWMgKi8KKwkJCXRvdGFsX2NoYW5uZWxzICs9IDI7CisJCWlmICgoY29kZWMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZhbGlfbWl4ZXJfZm9wcywgLTEpKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWxpX2F1ZGlvOiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOworCQkJa2ZyZWUoY29kZWMpOworCQkJYnJlYWs7CisJCX0KKwkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBjb2RlYzsKKwl9CisJLyogcGljayB0aGUgbWluaW11bSBvZiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgSUNIeCBvciBjb2RlYyhzKSAqLworCWNhcmQtPmNoYW5uZWxzID0gKGNhcmQtPmNoYW5uZWxzID4gdG90YWxfY2hhbm5lbHMpID8gdG90YWxfY2hhbm5lbHMgOiBjYXJkLT5jaGFubmVsczsKKwlyZXR1cm4gbnVtX2FjOTc7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhbGlfY29uZmlndXJlX2Nsb2NraW5nKHZvaWQpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkOworCXN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwl1bnNpZ25lZCBpbnQgaSwgb2Zmc2V0LCBuZXdfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2FyZCA9IGRldnM7CisKKwkvKiBXZSBjb3VsZCB0cnkgdG8gc2V0IHRoZSBjbG9ja2luZyBmb3IgbXVsdGlwbGUgY2FyZHMsIGJ1dCBjYW4geW91IGV2ZW4gaGF2ZQorCSAqIG1vcmUgdGhhbiBvbmUgYWxpIGluIGEgbWFjaGluZT8gIEJlc2lkZXMsIGNsb2NraW5nIGlzIGdsb2JhbCwgc28gdW5sZXNzCisJICogc29tZW9uZSBhY3R1YWxseSB0aGlua3MgbW9yZSB0aGFuIG9uZSBhbGkgaW4gYSBtYWNoaW5lIGlzIHBvc3NpYmxlIGFuZAorCSAqIGRlY2lkZXMgdG8gcmV3cml0ZSB0aGF0IGxpdHRsZSBiaXQsIHNldHRpbmcgdGhlIHJhdGUgZm9yIG1vcmUgdGhhbiBvbmUgY2FyZAorCSAqIGlzIGEgd2FzdGUgb2YgdGltZS4KKwkgKi8KKwlpZiAoY2FyZCAhPSBOVUxMKSB7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdID0gKHN0cnVjdCBhbGlfc3RhdGUgKikKKwkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbGlfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHN0YXRlID09IE5VTEwpCisJCQlyZXR1cm47CisJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhbGlfc3RhdGUpKTsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWRtYWJ1Zi0+d3JpdGVfY2hhbm5lbCA9IGNhcmQtPmFsbG9jX3BjbV9jaGFubmVsKGNhcmQpOworCQlzdGF0ZS0+dmlydCA9IDA7CisJCXN0YXRlLT5jYXJkID0gY2FyZDsKKwkJc3RhdGUtPm1hZ2ljID0gQUxJNTQ1NV9TVEFURV9NQUdJQzsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKKwkJaW5pdF9NVVRFWCgmc3RhdGUtPm9wZW5fc2VtKTsKKwkJZG1hYnVmLT5mbXQgPSBBTEk1NDU1X0ZNVF9TVEVSRU8gfCBBTEk1NDU1X0ZNVF8xNkJJVDsKKwkJZG1hYnVmLT50cmlnZ2VyID0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCWFsaV9zZXRfZGFjX3JhdGUoc3RhdGUsIDQ4MDAwKTsKKwkJaWYgKHByb2dfZG1hYnVmKHN0YXRlLCAwKSAhPSAwKQorCQkJZ290byBjb25maWdfb3V0X25vZG1hYnVmOworCQkKKwkJaWYgKGRtYWJ1Zi0+ZG1hc2l6ZSA8IDE2Mzg0KQorCQkJZ290byBjb25maWdfb3V0OworCQkKKwkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJb3V0YigzMSwgY2FyZC0+aW9iYXNlICsgZG1hYnVmLT53cml0ZV9jaGFubmVsLT5wb3J0ICsgT0ZGX0xWSSk7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlzdGFydF9kYWMoc3RhdGUpOworCQlvZmZzZXQgPSBhbGlfZ2V0X2RtYV9hZGRyKHN0YXRlLCAwKTsKKwkJbWRlbGF5KDUwKTsKKwkJbmV3X29mZnNldCA9IGFsaV9nZXRfZG1hX2FkZHIoc3RhdGUsIDApOworCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQorCQlvdXRiKDIsIGNhcmQtPmlvYmFzZSArIGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbC0+cG9ydCArIE9GRl9DUik7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQlpID0gbmV3X29mZnNldCAtIG9mZnNldDsKKworCQlpZiAoaSA9PSAwKQorCQkJZ290byBjb25maWdfb3V0OworCQlpID0gaSAvIDQgKiAyMDsKKwkJaWYgKGkgPiA0ODUwMCB8fCBpIDwgNDc1MDApIHsKKwkJCWNsb2NraW5nID0gY2xvY2tpbmcgKiBjbG9ja2luZyAvIGk7CisJCX0KK2NvbmZpZ19vdXQ6CisJCWRlYWxsb2NfZG1hYnVmKHN0YXRlKTsKK2NvbmZpZ19vdXRfbm9kbWFidWY6CisJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkLCBzdGF0ZS0+ZG1hYnVmLiB3cml0ZV9jaGFubmVsLT5udW0pOworCQlrZnJlZShzdGF0ZSk7CisJCWNhcmQtPnN0YXRlc1swXSA9IE5VTEw7CisJfQorfQorCisvKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyIG5vdywgdGhleSBhcmUgZGVmZXJlZCAKKyAgIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSBvcGVuL3JlYWQvd3JpdGUvaW9jdGwvbW1hcCkgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWxpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgQUxJNTQ1NV9ETUFfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGk1NDU1OiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCIKKwkJICAgICAgICIgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKGNhcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWxpX2NhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKCpjYXJkKSk7CisJY2FyZC0+aW5pdGlhbGl6aW5nID0gMTsKKwljYXJkLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCk7CisJY2FyZC0+cGNpX2RldiA9IHBjaV9kZXY7CisJY2FyZC0+cGNpX2lkID0gcGNpX2lkLT5kZXZpY2U7CisJY2FyZC0+aXJxID0gcGNpX2Rldi0+aXJxOworCWNhcmQtPm5leHQgPSBkZXZzOworCWNhcmQtPm1hZ2ljID0gQUxJNTQ1NV9DQVJEX01BR0lDOworI2lmZGVmIENPTkZJR19QTQorCWNhcmQtPnBtX3N1c3BlbmRlZCA9IDA7CisjZW5kaWYKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmFjOTdfbG9jayk7CisJZGV2cyA9IGNhcmQ7CisJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiYWxpOiAlcyBmb3VuZCBhdCBJTyAweCUwNGx4LCBJUlEgJWRcbiIsCisJICAgICAgIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQtPmlvYmFzZSwgY2FyZC0+aXJxKTsKKwljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGFsaV9hbGxvY19wY21fY2hhbm5lbDsKKwljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBhbGlfYWxsb2NfcmVjX3BjbV9jaGFubmVsOworCWNhcmQtPmFsbG9jX3JlY19taWNfY2hhbm5lbCA9IGFsaV9hbGxvY19yZWNfbWljX2NoYW5uZWw7CisJY2FyZC0+YWxsb2NfY29kZWNfc3BkaWZvdXRfY2hhbm5lbCA9IGFsaV9hbGxvY19jb2RlY19zcGRpZm91dF9jaGFubmVsOworCWNhcmQtPmFsbG9jX2NvbnRyb2xsZXJfc3BkaWZvdXRfY2hhbm5lbCA9IGFsaV9hbGxvY19jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWw7CisJY2FyZC0+ZnJlZV9wY21fY2hhbm5lbCA9IGFsaV9mcmVlX3BjbV9jaGFubmVsOworCWNhcmQtPmNoYW5uZWxbMF0ub2Zmc2V0ID0gMDsKKwljYXJkLT5jaGFubmVsWzBdLnBvcnQgPSAweDQwOworCWNhcmQtPmNoYW5uZWxbMF0ubnVtID0gMDsKKwljYXJkLT5jaGFubmVsWzFdLm9mZnNldCA9IDA7CisJY2FyZC0+Y2hhbm5lbFsxXS5wb3J0ID0gMHg1MDsKKwljYXJkLT5jaGFubmVsWzFdLm51bSA9IDE7CisJY2FyZC0+Y2hhbm5lbFsyXS5vZmZzZXQgPSAwOworCWNhcmQtPmNoYW5uZWxbMl0ucG9ydCA9IDB4NjA7CisJY2FyZC0+Y2hhbm5lbFsyXS5udW0gPSAyOworCWNhcmQtPmNoYW5uZWxbM10ub2Zmc2V0ID0gMDsKKwljYXJkLT5jaGFubmVsWzNdLnBvcnQgPSAweDcwOworCWNhcmQtPmNoYW5uZWxbM10ubnVtID0gMzsKKwljYXJkLT5jaGFubmVsWzRdLm9mZnNldCA9IDA7CisJY2FyZC0+Y2hhbm5lbFs0XS5wb3J0ID0gMHhiMDsKKwljYXJkLT5jaGFubmVsWzRdLm51bSA9IDQ7CisJLyogY2xhaW0gb3VyIGlvc3BhY2UgYW5kIGlycSAqLworCXJlcXVlc3RfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2LCBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdKTsKKwlpZiAocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCAmYWxpX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQljYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCBjYXJkKSkgeworCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogdW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwKKwkJICAgICAgIGNhcmQtPmlycSk7CisJCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2KTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChhbGlfcmVzZXRfNTQ1NShjYXJkKSA8PSAwKSB7CisJCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7CisJCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2KTsKKwkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGluaXRpYWxpemUgQUM5NyBjb2RlYyBhbmQgcmVnaXN0ZXIgL2Rldi9taXhlciAqLworCWlmIChhbGlfYWM5N19pbml0KGNhcmQpIDwgMCkgeworCQlyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIDI1Nik7CisJCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisJCWtmcmVlKGNhcmQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIGNhcmQpOworCQorCWlmIChjbG9ja2luZyA9PSAwKSB7CisJCWNsb2NraW5nID0gNDgwMDA7CisJCWFsaV9jb25maWd1cmVfY2xvY2tpbmcoKTsKKwl9CisKKwkvKiByZWdpc3RlciAvZGV2L2RzcCAqLworCWlmICgoY2FyZC0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZhbGlfYXVkaW9fZm9wcywgLTEpKSA8IDApIHsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX0VSUiJhbGlfYXVkaW86IGNvdWxkbid0IHJlZ2lzdGVyIERTUCBkZXZpY2UhXG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCAyNTYpOworCQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQorCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCkgeworCQkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKKwkJCQlrZnJlZShjYXJkLT5hYzk3X2NvZGVjW2ldKTsKKwkJCX0KKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwljYXJkLT5pbml0aWFsaXppbmcgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWxpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJLyogZnJlZSBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwlmcmVlX2lycShjYXJkLT5pcnEsIGRldnMpOworCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2KTsKKwkvKiB1bnJlZ2lzdGVyIGF1ZGlvIGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQorCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMKSB7CisJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTdfY29kZWNbaV0tPgorCQkJCQkgICAgICAgZGV2X21peGVyKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2ldKTsKKwkJCWNhcmQtPmFjOTdfY29kZWNbaV0gPSBOVUxMOworCQl9CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKKwlrZnJlZShjYXJkKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhbGlfcG1fc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3QgcG1fc3RhdGUpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJaW50IGksIG51bV9hYzk3OworCisJaWYgKCFjYXJkKQorCQlyZXR1cm4gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCWNhcmQtPnBtX3N1c3BlbmRlZCA9IDE7CisJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV07CisJCWlmICghc3RhdGUpCisJCQljb250aW51ZTsKKwkJLyogdGhpcyBoYXBwZW5zIG9ubHkgaWYgdGhlcmUgYXJlIG9wZW4gZmlsZXMgKi8KKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HIHx8CisJCSAgICAoZG1hYnVmLT5jb3VudAorCQkgICAgICYmIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX09VVFBVVCkpKSB7CisJCQlzdGF0ZS0+cG1fc2F2ZWRfZGFjX3JhdGUgPSBkbWFidWYtPnJhdGU7CisJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0ZS0+cG1fc2F2ZWRfZGFjX3JhdGUgPSAwOworCQl9CisJCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7CisJCQlzdGF0ZS0+cG1fc2F2ZWRfYWRjX3JhdGUgPSBkbWFidWYtPnJhdGU7CisJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0ZS0+cG1fc2F2ZWRfYWRjX3JhdGUgPSAwOworCQl9CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciA9IDA7CisJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJLyogc2F2ZSBtaXhlciBzZXR0aW5ncyAqLworCWZvciAobnVtX2FjOTcgPSAwOyBudW1fYWM5NyA8IE5SX0FDOTc7IG51bV9hYzk3KyspIHsKKwkJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N107CisJCWlmICghY29kZWMpCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7CisJCQlpZiAoKHN1cHBvcnRlZF9taXhlcihjb2RlYywgaSkpICYmIChjb2RlYy0+cmVhZF9taXhlcikpIHsKKwkJCQljYXJkLT5wbV9zYXZlZF9taXhlcl9zZXR0aW5nc1tpXVtudW1fYWM5N10gPSBjb2RlYy0+cmVhZF9taXhlcihjb2RlYywgaSk7CisJCQl9CisJCX0KKwl9CisJcGNpX3NhdmVfc3RhdGUoZGV2KTsJLyogWFhYIGRvIHdlIG5lZWQgdGhpcz8gKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsJLyogZGlzYWJsZSBidXNtYXN0ZXJpbmcgKi8KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgMyk7CS8qIFp6ei4gKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFsaV9wbV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgbnVtX2FjOTcsIGkgPSAwOworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKKwkvKiBvYnNlcnZhdGlvbiBvZiBhIHRvc2hpYmEgcG9ydGVnZSAzNDQwY3Qgc3VnZ2VzdHMgdGhhdCB0aGUgCisJICAgaGFyZHdhcmUgaGFzIHRvIGJlIG1vcmUgb3IgbGVzcyBjb21wbGV0ZWx5IHJlaW5pdGlhbGl6ZWQgZnJvbQorCSAgIHNjcmF0Y2ggYWZ0ZXIgYW4gYXBtIHN1c3BlbmQuICBXb3JrcyBGb3IgTWUuICAgLWRhbiAqLworCWFsaV9hYzk3X3JhbmRvbV9pbml0X3N0dWZmKGNhcmQpOworCWZvciAobnVtX2FjOTcgPSAwOyBudW1fYWM5NyA8IE5SX0FDOTc7IG51bV9hYzk3KyspIHsKKwkJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N107CisJCS8qIGNoZWNrIHRoZXkgaGF2ZW4ndCBzdG9sZW4gdGhlIGhhcmR3YXJlIHdoaWxlIHdlIHdlcmUKKwkJICAgYXdheSAqLworCQlpZiAoIWNvZGVjIHx8ICFhbGlfYWM5N19leGlzdHMoY2FyZCwgbnVtX2FjOTcpKSB7CisJCQlpZiAobnVtX2FjOTcpCisJCQkJY29udGludWU7CisJCQllbHNlCisJCQkJQlVHKCk7CisJCX0KKwkJaWYgKCFhbGlfYWM5N19wcm9iZV9hbmRfcG93ZXJ1cChjYXJkLCBjb2RlYykpCisJCQlCVUcoKTsKKwkJaWYgKChjYXJkLT5hYzk3X2ZlYXR1cmVzICYgMHgwMDAxKSkgeworCQkJLyogYXQgcHJvYmUgdGltZSB3ZSBmb3VuZCB3ZSBjb3VsZCBkbyB2YXJpYWJsZQorCQkJICAgcmF0ZXMsIGJ1dCBBUE0gc3VzcGVuZCBoYXMgbWFkZSBpdCBmb3JnZXQKKwkJCSAgIGl0cyBtYWdpY2FsIHBvd2VycyAqLworCQkJaWYgKCFhbGlfYWM5N19lbmFibGVfdmFyaWFibGVfcmF0ZShjb2RlYykpCisJCQkJQlVHKCk7CisJCX0KKwkJLyogd2UgbG9zdCBvdXIgbWl4ZXIgc2V0dGluZ3MsIHNvIHJlc3RvcmUgdGhlbSAqLworCQlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspIHsKKwkJCWlmIChzdXBwb3J0ZWRfbWl4ZXIoY29kZWMsIGkpKSB7CisJCQkJaW50IHZhbCA9IGNhcmQtPnBtX3NhdmVkX21peGVyX3NldHRpbmdzW2ldW251bV9hYzk3XTsKKwkJCQljb2RlYy0+bWl4ZXJfc3RhdGVbaV0gPSB2YWw7CisJCQkJY29kZWMtPndyaXRlX21peGVyKGNvZGVjLCBpLAorCQkJCQkJICAgKHZhbCAmIDB4ZmYpLAorCQkJCQkJICAgKCh2YWwgPj4gOCkgJiAweGZmKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHNhbXBsZSByYXRlIGZyb20gd2hhdGV2ZXIgaXQgd2FzICovCisJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV07CisJCWlmIChzdGF0ZSkgeworCQkJaWYgKHN0YXRlLT5wbV9zYXZlZF9hZGNfcmF0ZSkKKwkJCQlhbGlfc2V0X2FkY19yYXRlKHN0YXRlLCBzdGF0ZS0+cG1fc2F2ZWRfYWRjX3JhdGUpOworCQkJaWYgKHN0YXRlLT5wbV9zYXZlZF9kYWNfcmF0ZSkKKwkJCQlhbGlfc2V0X2RhY19yYXRlKHN0YXRlLCBzdGF0ZS0+cG1fc2F2ZWRfZGFjX3JhdGUpOworCQl9CisJfQorCisJY2FyZC0+cG1fc3VzcGVuZGVkID0gMDsKKwkvKiBhbnkgcHJvY2Vzc2VzIHRoYXQgd2VyZSByZWFkaW5nL3dyaXRpbmcgZHVyaW5nIHRoZSBzdXNwZW5kCisJICAgcHJvYmFibHkgZW5kZWQgdXAgaGVyZSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9IV19DSDsgaSsrKSB7CisJCXN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlID0gY2FyZC0+c3RhdGVzW2ldOworCQlpZiAoc3RhdGUpCisJCQl3YWtlX3VwKCZzdGF0ZS0+ZG1hYnVmLndhaXQpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkJCQkvKiBDT05GSUdfUE0gKi8KKworTU9EVUxFX0FVVEhPUigiIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMSSA1NDU1IGF1ZGlvIHN1cHBvcnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShjbG9ja2luZywgaW50LCAwKTsKKy8qIEZJWE1FOiBib29sPyAqLworbW9kdWxlX3BhcmFtKHN0cmljdF9jbG9ja2luZywgdWludCwgMCk7Cittb2R1bGVfcGFyYW0oY29kZWNfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCwgdWludCwgMCk7Cittb2R1bGVfcGFyYW0oY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbShjb250cm9sbGVyX3BjbW91dF9zaGFyZV9zcGRpZl9sb2NrZWQsIHVpbnQsIDApOworbW9kdWxlX3BhcmFtKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkLCB1aW50LCAwKTsKKyNkZWZpbmUgQUxJNTQ1NV9NT0RVTEVfTkFNRSAiYWxpNTQ1NSIKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhbGlfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBBTEk1NDU1X01PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IGFsaV9wY2lfdGJsLAorCS5wcm9iZQkJPSBhbGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhbGlfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGFsaV9wbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWxpX3BtX3Jlc3VtZSwKKyNlbmRpZgkJCQkvKiBDT05GSUdfUE0gKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsaV9pbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkFMSSA1NDU1ICsgQUM5NyBBdWRpbywgdmVyc2lvbiAiCisJICAgICAgIERSSVZFUl9WRVJTSU9OICIsICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOworCisJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA9PSAzMjAwMAorCQkgICAgfHwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID09IDQ0MTAwCisJCSAgICB8fCBjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPT0gNDgwMDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImFsaV9hdWRpbzogRW5hYmxpbmcgUy9QRElGIGF0IHNhbXBsZSByYXRlICVkSHouXG4iLCBjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWxpX2F1ZGlvOiBTL1BESUYgY2FuIG9ubHkgYmUgbG9ja2VkIHRvIDMyMDAwLCA0NDEwMCwgb3IgNDgwMDBIei5cbiIpOworCQkJY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID0gMDsKKwkJfQorCX0KKwlpZiAoY29udHJvbGxlcl9pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA9PSAzMjAwMAorCQkgICAgfHwgY29udHJvbGxlcl9pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPT0gNDQxMDAKKwkJICAgIHx8IGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID09IDQ4MDAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJhbGlfYXVkaW86IEVuYWJsaW5nIFMvUERJRiBhdCBzYW1wbGUgcmF0ZSAlZEh6LlxuIiwgY29udHJvbGxlcl9pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWxpX2F1ZGlvOiBTL1BESUYgY2FuIG9ubHkgYmUgbG9ja2VkIHRvIDMyMDAwLCA0NDEwMCwgb3IgNDgwMDBIei5cbiIpOworCQkJY29udHJvbGxlcl9pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPSAwOworCQl9CisJfQorCisJaWYgKGNvZGVjX3BjbW91dF9zaGFyZV9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCWlmIChjb2RlY19wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID09IDMyMDAwCisJCSAgICB8fCBjb2RlY19wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID09IDQ0MTAwCisJCSAgICB8fCBjb2RlY19wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID09IDQ4MDAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJhbGlfYXVkaW86IEVuYWJsaW5nIFMvUERJRiBhdCBzYW1wbGUgcmF0ZSAlZEh6LlxuIiwgY29kZWNfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJhbGlfYXVkaW86IFMvUERJRiBjYW4gb25seSBiZSBsb2NrZWQgdG8gMzIwMDAsIDQ0MTAwLCBvciA0ODAwMEh6LlxuIik7CisJCQljb2RlY19wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID0gMDsKKwkJfQorCX0KKwlpZiAoY29udHJvbGxlcl9wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID4gMCkgeworCQlpZiAoY29udHJvbGxlcl9wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID09IDMyMDAwCisJCSAgICB8fCBjb250cm9sbGVyX3BjbW91dF9zaGFyZV9zcGRpZl9sb2NrZWQgPT0gNDQxMDAKKwkJICAgIHx8IGNvbnRyb2xsZXJfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCA9PSA0ODAwMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWxpX2F1ZGlvOiBFbmFibGluZyBjb250cm9sbGVyIFMvUERJRiBhdCBzYW1wbGUgcmF0ZSAlZEh6LlxuIiwgY29udHJvbGxlcl9wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImFsaV9hdWRpbzogUy9QRElGIGNhbiBvbmx5IGJlIGxvY2tlZCB0byAzMjAwMCwgNDQxMDAsIG9yIDQ4MDAwSHouXG4iKTsKKwkJCWNvbnRyb2xsZXJfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFsaV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsaV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWxpX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbGlfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYWxpX2NsZWFudXBfbW9kdWxlKTsKKy8qCitMb2NhbCBWYXJpYWJsZXM6CitjLWJhc2ljLW9mZnNldDogOAorRW5kOgorKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hdTEwMDAuYyBiL3NvdW5kL29zcy9hdTEwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDkxNzMzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2F1MTAwMC5jCkBAIC0wLDAgKzEsMjIxNCBAQAorLyoKKyAqICAgICAgYXUxMDAwLmMgIC0tICBTb3VuZCBkcml2ZXIgZm9yIEFsY2hlbXkgQXUxMDAwIE1JUFMgSW50ZXJuZXQgRWRnZQorICogICAgICAgICAgICAgICAgICAgIFByb2Nlc3Nvci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICAJc3RldmVsQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqIE1vZHVsZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyczoKKyAqCisgKiAgU3VwcG9ydGVkIGRldmljZXM6CisgKiAgL2Rldi9kc3AgICAgc3RhbmRhcmQgT1NTIC9kZXYvZHNwIGRldmljZQorICogIC9kZXYvbWl4ZXIgIHN0YW5kYXJkIE9TUyAvZGV2L21peGVyIGRldmljZQorICoKKyAqIE5vdGVzOgorICoKKyAqICAxLiBNdWNoIG9mIHRoZSBPU1MgYnVmZmVyIGFsbG9jYXRpb24sIGlvY3RsJ3MsIGFuZCBtbWFwJ2luZyBhcmUKKyAqICAgICB0YWtlbiwgc2xpZ2h0bHkgbW9kaWZpZWQgb3Igbm90IGF0IGFsbCwgZnJvbSB0aGUgRVMxMzcxIGRyaXZlciwKKyAqICAgICBzbyByZWZlciB0byB0aGUgY3JlZGl0cyBpbiBlczEzNzEuYyBmb3IgdGhvc2UuIFRoZSByZXN0IG9mIHRoZQorICogICAgIGNvZGUgKHByb2JlLCBvcGVuLCByZWFkLCB3cml0ZSwgdGhlIElTUiwgZXRjLikgaXMgbmV3LgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAwNi4yNy4yMDAxICBJbml0aWFsIHZlcnNpb24KKyAqICAgIDAzLjIwLjIwMDIgIEFkZGVkIG11dGV4IGxvY2tzIGFyb3VuZCByZWFkL3dyaXRlIG1ldGhvZHMsIHRvIHByZXZlbnQKKyAqICAgICAgICAgICAgICAgIHNpbXVsdGFuZW91cyBhY2Nlc3Mgb24gU01QIG9yIHByZWVtcHRpYmxlIGtlcm5lbHMuIEFsc28KKyAqICAgICAgICAgICAgICAgIHJlbW92ZWQgdGhlIGNvdW50ZXIvcG9pbnRlciBmcmFnbWVudCBhbGlnbmluZyBhdCB0aGUgZW5kCisgKiAgICAgICAgICAgICAgICBvZiByZWFkL3dyaXRlIG1ldGhvZHMgW3N0ZXZlbF0uCisgKiAgICAwMy4yMS4yMDAyICBBZGQgc3VwcG9ydCBmb3IgY29oZXJlbnQgRE1BIG9uIHRoZSBhdWRpbyByZWFkL3dyaXRlIERNQQorICogICAgICAgICAgICAgICAgY2hhbm5lbHMgW3N0ZXZlbF0uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDBfZG1hLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisjdW5kZWYgQVUxMDAwX0RFQlVHCisjdW5kZWYgQVUxMDAwX1ZFUkJPU0VfREVCVUcKKworI2RlZmluZSBBVTEwMDBfTU9EVUxFX05BTUUgIkF1MTAwMCBhdWRpbyIKKyNkZWZpbmUgUEZYIEFVMTAwMF9NT0RVTEVfTkFNRQorCisjaWZkZWYgQVUxMDAwX0RFQlVHCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fREVCVUcgUEZYICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI2RlZmluZSB3YXJuKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCisKKy8qIG1pc2Mgc3R1ZmYgKi8KKyNkZWZpbmUgUE9MTF9DT1VOVCAgIDB4NTAwMAorI2RlZmluZSBBQzk3X0VYVF9EQUNTIChBQzk3X0VYVElEX1NEQUMgfCBBQzk3X0VYVElEX0NEQUMgfCBBQzk3X0VYVElEX0xEQUMpCisKKy8qIEJvb3Qgb3B0aW9ucyAqLworc3RhdGljIGludCAgICAgIHZyYSA9IDA7CS8vIDAgPSBubyBWUkEsIDEgPSB1c2UgVlJBIGlmIGNvZGVjIHN1cHBvcnRzIGl0CitNT0RVTEVfUEFSTSh2cmEsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKHZyYSwgImlmIDEgdXNlIFZSQSBpZiBjb2RlYyBzdXBwb3J0cyBpdCIpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgYXUxMDAwX3N0YXRlIHsKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgICAgICAgICAgICAgZGV2X2F1ZGlvOworCisjaWZkZWYgQVUxMDAwX0RFQlVHCisJLyogZGVidWcgL3Byb2MgZW50cnkgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBzOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWM5N19wczsKKyNlbmRpZgkJCQkvKiBBVTEwMDBfREVCVUcgKi8KKworCXN0cnVjdCBhYzk3X2NvZGVjIGNvZGVjOworCXVuc2lnbmVkICAgICAgICBjb2RlY19iYXNlX2NhcHM7Ly8gQUMnOTcgcmVnIDAwaCwgIlJlc2V0IFJlZ2lzdGVyIgorCXVuc2lnbmVkICAgICAgICBjb2RlY19leHRfY2FwczsJLy8gQUMnOTcgcmVnIDI4aCwgIkV4dGVuZGVkIEF1ZGlvIElEIgorCWludCAgICAgICAgICAgICBub192cmE7CS8vIGRvIG5vdCB1c2UgVlJBCisKKwlzcGlubG9ja190ICAgICAgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCW1vZGVfdCAgICAgICAgICBvcGVuX21vZGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCisJc3RydWN0IGRtYWJ1ZiB7CisJCXVuc2lnbmVkIGludCAgICBkbWFucjsJLy8gRE1BIENoYW5uZWwgbnVtYmVyCisJCXVuc2lnbmVkICAgICAgICBzYW1wbGVfcmF0ZTsJLy8gSHoKKwkJdW5zaWduZWQgc3JjX2ZhY3RvcjsgICAgIC8vIFNSQyBpbnRlcnAvZGVjaW1hdGlvbiAobm8gdnJhKQorCQl1bnNpZ25lZCAgICAgICAgc2FtcGxlX3NpemU7CS8vIDggb3IgMTYKKwkJaW50ICAgICAgICAgICAgIG51bV9jaGFubmVsczsJLy8gMSA9IG1vbm8sIDIgPSBzdGVyZW8sIDQsIDYKKwkJaW50IGRtYV9ieXRlc19wZXJfc2FtcGxlOy8vIERNQSBieXRlcyBwZXIgYXVkaW8gc2FtcGxlIGZyYW1lCisJCWludCB1c2VyX2J5dGVzX3Blcl9zYW1wbGU7Ly8gVXNlciBieXRlcyBwZXIgYXVkaW8gc2FtcGxlIGZyYW1lCisJCWludCBjbnRfZmFjdG9yOyAgICAgICAgICAvLyB1c2VyLXRvLURNQSBieXRlcyBwZXIgYXVkaW8KKwkJLy8gIHNhbXBsZSBmcmFtZQorCQl2b2lkICAgICAgICAgICAqcmF3YnVmOworCQlkbWFfYWRkcl90ICAgICAgZG1hYWRkcjsKKwkJdW5zaWduZWQgICAgICAgIGJ1Zm9yZGVyOworCQl1bnNpZ25lZCBudW1mcmFnOyAgICAgICAgLy8gIyBvZiBETUEgZnJhZ21lbnRzIGluIERNQSBidWZmZXIKKwkJdW5zaWduZWQgICAgICAgIGZyYWdzaGlmdDsKKwkJdm9pZCAgICAgICAgICAgKm5leHRJbjsJLy8gcHRyIHRvIG5leHQtaW4gdG8gRE1BIGJ1ZmZlcgorCQl2b2lkICAgICAgICAgICAqbmV4dE91dDsvLyBwdHIgdG8gbmV4dC1vdXQgZnJvbSBETUEgYnVmZmVyCisJCWludCAgICAgICAgICAgICBjb3VudDsJLy8gY3VycmVudCBieXRlIGNvdW50IGluIERNQSBidWZmZXIKKwkJdW5zaWduZWQgICAgICAgIHRvdGFsX2J5dGVzOwkvLyB0b3RhbCBieXRlcyB3cml0dGVuIG9yIHJlYWQKKwkJdW5zaWduZWQgICAgICAgIGVycm9yOwkvLyBvdmVyL3VuZGVycnVuCisJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJCS8qIHJlZHVuZGFudCwgYnV0IG1ha2VzIGNhbGN1bGF0aW9ucyBlYXNpZXIgKi8KKwkJdW5zaWduZWQgZnJhZ3NpemU7ICAgICAgIC8vIHVzZXIgcGVyY2VwdGlvbiBvZiBmcmFnbWVudCBzaXplCisJCXVuc2lnbmVkIGRtYV9mcmFnc2l6ZTsgICAvLyBETUEgKHJlYWwpIGZyYWdtZW50IHNpemUKKwkJdW5zaWduZWQgZG1hc2l6ZTsgICAgICAgIC8vIFRvdGFsIERNQSBidWZmZXIgc2l6ZQorCQkvLyAgIChtdWx0LiBvZiBETUEgZnJhZ3NpemUpCisJCS8qIE9TUyBzdHVmZiAqLworCQl1bnNpZ25lZCAgICAgICAgbWFwcGVkOjE7CisJCXVuc2lnbmVkICAgICAgICByZWFkeToxOworCQl1bnNpZ25lZCAgICAgICAgc3RvcHBlZDoxOworCQl1bnNpZ25lZCAgICAgICAgb3NzZnJhZ3NoaWZ0OworCQlpbnQgICAgICAgICAgICAgb3NzbWF4ZnJhZ3M7CisJCXVuc2lnbmVkICAgICAgICBzdWJkaXZpc2lvbjsKKwl9IGRtYV9kYWMgICAgICAsIGRtYV9hZGM7Cit9IGF1MTAwMF9zdGF0ZTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsZDIodW5zaWduZWQgaW50IHgpCit7CisJdW5zaWduZWQgICAgICAgIHIgPSAwOworCisJaWYgKHggPj0gMHgxMDAwMCkgeworCQl4ID4+PSAxNjsKKwkJciArPSAxNjsKKwl9CisJaWYgKHggPj0gMHgxMDApIHsKKwkJeCA+Pj0gODsKKwkJciArPSA4OworCX0KKwlpZiAoeCA+PSAweDEwKSB7CisJCXggPj49IDQ7CisJCXIgKz0gNDsKKwl9CisJaWYgKHggPj0gNCkgeworCQl4ID4+PSAyOworCQlyICs9IDI7CisJfQorCWlmICh4ID49IDIpCisJCXIrKzsKKwlyZXR1cm4gcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGF1MTAwMF9kZWxheShpbnQgbXNlYykKK3sKKwl1bnNpZ25lZCBsb25nICAgdG1vOworCXNpZ25lZCBsb25nICAgICB0bW8yOworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CisKKwl0bW8gPSBqaWZmaWVzICsgKG1zZWMgKiBIWikgLyAxMDAwOworCWZvciAoOzspIHsKKwkJdG1vMiA9IHRtbyAtIGppZmZpZXM7CisJCWlmICh0bW8yIDw9IDApCisJCQlicmVhazsKKwkJc2NoZWR1bGVfdGltZW91dCh0bW8yKTsKKwl9Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1MTYgcmRjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IGFkZHIpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJdTMyICAgICAgICAgICAgIGNtZDsKKwl1MTYgICAgICAgICAgICAgZGF0YTsKKwlpbnQgICAgICAgICAgICAgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKQorCQlpZiAoIShhdV9yZWFkbChBQzk3Q19TVEFUVVMpICYgQUM5N0NfQ1ApKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJyZGNvZGVjOiBjb2RlYyBjbWQgcGVuZGluZyBleHBpcmVkISIpOworCisJY21kID0gKHUzMikgYWRkciAmIEFDOTdDX0lOREVYX01BU0s7CisJY21kIHw9IEFDOTdDX1JFQUQ7CS8vIHJlYWQgY29tbWFuZAorCWF1X3dyaXRlbChjbWQsIEFDOTdDX0NNRCk7CisKKwkvKiBub3cgd2FpdCBmb3IgdGhlIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKQorCQlpZiAoIShhdV9yZWFkbChBQzk3Q19TVEFUVVMpICYgQUM5N0NfQ1ApKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkgeworCQllcnIoInJkY29kZWM6IHJlYWQgcG9sbCBleHBpcmVkISIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkYXRhID0gYXVfcmVhZGwoQUM5N0NfQ01EKSAmIDB4ZmZmZjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBkYXRhOworfQorCisKK3N0YXRpYyB2b2lkIHdyY29kZWMoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCBhZGRyLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzID0gKHN0cnVjdCBhdTEwMDBfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1MzIgICAgICAgICAgICAgY21kOworCWludCAgICAgICAgICAgICBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBQT0xMX0NPVU5UOyBpKyspCisJCWlmICghKGF1X3JlYWRsKEFDOTdDX1NUQVRVUykgJiBBQzk3Q19DUCkpCisJCQlicmVhazsKKwlpZiAoaSA9PSBQT0xMX0NPVU5UKQorCQllcnIoIndyY29kZWM6IGNvZGVjIGNtZCBwZW5kaW5nIGV4cGlyZWQhIik7CisKKwljbWQgPSAodTMyKSBhZGRyICYgQUM5N0NfSU5ERVhfTUFTSzsKKwljbWQgJj0gfkFDOTdDX1JFQUQ7CS8vIHdyaXRlIGNvbW1hbmQKKwljbWQgfD0gKCh1MzIpIGRhdGEgPDwgQUM5N0NfV0RfQklUKTsJLy8gT1IgaW4gdGhlIGRhdGEgd29yZAorCWF1X3dyaXRlbChjbWQsIEFDOTdDX0NNRCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJdTE2ICAgICAgICAgICAgIHRlbXA7CisJaW50ICAgICAgICAgICAgIGk7CisKKwkvKiBjb2RlY193YWl0IGlzIHVzZWQgdG8gd2FpdCBmb3IgYSByZWFkeSBzdGF0ZSBhZnRlcgorCSAgIGFuIEFDOTdDX1JFU0VULiAqLworCWF1MTAwMF9kZWxheSgxMCk7CisKKwkvLyBmaXJzdCBwb2xsIHRoZSBDT0RFQ19SRUFEWSB0YWcgYml0CisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykKKwkJaWYgKGF1X3JlYWRsKEFDOTdDX1NUQVRVUykgJiBBQzk3Q19SRUFEWSkKKwkJCWJyZWFrOworCWlmIChpID09IFBPTExfQ09VTlQpIHsKKwkJZXJyKCJ3YWl0Y29kZWM6IENPREVDX1JFQURZIHBvbGwgZXhwaXJlZCEiKTsKKwkJcmV0dXJuOworCX0KKwkvLyBnZXQgQUMnOTcgcG93ZXJkb3duIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyCisJdGVtcCA9IHJkY29kZWMoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisKKwkvLyBJZiBhbnl0aGluZyBpcyBwb3dlcmVkIGRvd24sIHBvd2VyJ2VtIHVwCisJaWYgKHRlbXAgJiAweDdmMDApIHsKKwkJLy8gUG93ZXIgb24KKwkJd3Jjb2RlYyhjb2RlYywgQUM5N19QT1dFUl9DT05UUk9MLCAwKTsKKwkJYXUxMDAwX2RlbGF5KDEwMCk7CisJCS8vIFJlcmVhZAorCQl0ZW1wID0gcmRjb2RlYyhjb2RlYywgQUM5N19QT1dFUl9DT05UUk9MKTsKKwl9CisgICAgCisJLy8gQ2hlY2sgaWYgQ29kZWMgUkVGLEFOTCxEQUMsQURDIHJlYWR5CisJaWYgKCh0ZW1wICYgMHg3ZjBmKSAhPSAweDAwMGYpCisJCWVycigiY29kZWMgcmVnIDI2IHN0YXR1cyAoMHgleCkgbm90IHJlYWR5ISEiLCB0ZW1wKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogc3RvcCB0aGUgQURDIGJlZm9yZSBjYWxsaW5nICovCitzdGF0aWMgdm9pZCBzZXRfYWRjX3JhdGUoc3RydWN0IGF1MTAwMF9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICAqYWRjID0gJnMtPmRtYV9hZGM7CisJc3RydWN0IGRtYWJ1ZiAgKmRhYyA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkICAgICAgICBhZGNfcmF0ZSwgZGFjX3JhdGU7CisJdTE2ICAgICAgICAgICAgIGFjOTdfZXh0c3RhdDsKKworCWlmIChzLT5ub192cmEpIHsKKwkJLy8gY2FsYyBTUkMgZmFjdG9yCisJCWFkYy0+c3JjX2ZhY3RvciA9ICgoOTYwMDAgLyByYXRlKSArIDEpID4+IDE7CisJCWFkYy0+c2FtcGxlX3JhdGUgPSA0ODAwMCAvIGFkYy0+c3JjX2ZhY3RvcjsKKwkJcmV0dXJuOworCX0KKworCWFkYy0+c3JjX2ZhY3RvciA9IDE7CisKKwlhYzk3X2V4dHN0YXQgPSByZGNvZGVjKCZzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCisJcmF0ZSA9IHJhdGUgPiA0ODAwMCA/IDQ4MDAwIDogcmF0ZTsKKworCS8vIGVuYWJsZSBWUkEKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCWFjOTdfZXh0c3RhdCB8IEFDOTdfRVhUU1RBVF9WUkEpOworCS8vIG5vdyB3cml0ZSB0aGUgc2FtcGxlIHJhdGUKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01fTFJfQURDX1JBVEUsICh1MTYpIHJhdGUpOworCS8vIHJlYWQgaXQgYmFjayBmb3IgYWN0dWFsIHN1cHBvcnRlZCByYXRlCisJYWRjX3JhdGUgPSByZGNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01fTFJfQURDX1JBVEUpOworCisjaWZkZWYgQVUxMDAwX1ZFUkJPU0VfREVCVUcKKwlkYmcoIiVzOiBzZXQgdG8gJWQgSHoiLCBfX0ZVTkNUSU9OX18sIGFkY19yYXRlKTsKKyNlbmRpZgorCisJLy8gc29tZSBjb2RlYydzIGRvbid0IGFsbG93IHVuZXF1YWwgREFDIGFuZCBBREMgcmF0ZXMsIGluIHdoaWNoIGNhc2UKKwkvLyB3cml0aW5nIG9uZSByYXRlIHJlZyBhY3R1YWxseSBjaGFuZ2VzIGJvdGguCisJZGFjX3JhdGUgPSByZGNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpOworCWlmIChkYWMtPm51bV9jaGFubmVscyA+IDIpCisJCXdyY29kZWMoJnMtPmNvZGVjLCBBQzk3X1BDTV9TVVJSX0RBQ19SQVRFLCBkYWNfcmF0ZSk7CisJaWYgKGRhYy0+bnVtX2NoYW5uZWxzID4gNCkKKwkJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfUENNX0xGRV9EQUNfUkFURSwgZGFjX3JhdGUpOworCisJYWRjLT5zYW1wbGVfcmF0ZSA9IGFkY19yYXRlOworCWRhYy0+c2FtcGxlX3JhdGUgPSBkYWNfcmF0ZTsKK30KKworLyogc3RvcCB0aGUgREFDIGJlZm9yZSBjYWxsaW5nICovCitzdGF0aWMgdm9pZCBzZXRfZGFjX3JhdGUoc3RydWN0IGF1MTAwMF9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICAqZGFjID0gJnMtPmRtYV9kYWM7CisJc3RydWN0IGRtYWJ1ZiAgKmFkYyA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkICAgICAgICBhZGNfcmF0ZSwgZGFjX3JhdGU7CisJdTE2ICAgICAgICAgICAgIGFjOTdfZXh0c3RhdDsKKworCWlmIChzLT5ub192cmEpIHsKKwkJLy8gY2FsYyBTUkMgZmFjdG9yCisJCWRhYy0+c3JjX2ZhY3RvciA9ICgoOTYwMDAgLyByYXRlKSArIDEpID4+IDE7CisJCWRhYy0+c2FtcGxlX3JhdGUgPSA0ODAwMCAvIGRhYy0+c3JjX2ZhY3RvcjsKKwkJcmV0dXJuOworCX0KKworCWRhYy0+c3JjX2ZhY3RvciA9IDE7CisKKwlhYzk3X2V4dHN0YXQgPSByZGNvZGVjKCZzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCisJcmF0ZSA9IHJhdGUgPiA0ODAwMCA/IDQ4MDAwIDogcmF0ZTsKKworCS8vIGVuYWJsZSBWUkEKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCWFjOTdfZXh0c3RhdCB8IEFDOTdfRVhUU1RBVF9WUkEpOworCS8vIG5vdyB3cml0ZSB0aGUgc2FtcGxlIHJhdGUKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsICh1MTYpIHJhdGUpOworCS8vIEkgZG9uJ3Qgc3VwcG9ydCBkaWZmZXJlbnQgc2FtcGxlIHJhdGVzIGZvciBtdWx0aWNoYW5uZWwsCisJLy8gc28gbWFrZSB0aGVzZSBjaGFubmVscyB0aGUgc2FtZS4KKwlpZiAoZGFjLT5udW1fY2hhbm5lbHMgPiAyKQorCQl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01fU1VSUl9EQUNfUkFURSwgKHUxNikgcmF0ZSk7CisJaWYgKGRhYy0+bnVtX2NoYW5uZWxzID4gNCkKKwkJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfUENNX0xGRV9EQUNfUkFURSwgKHUxNikgcmF0ZSk7CisJLy8gcmVhZCBpdCBiYWNrIGZvciBhY3R1YWwgc3VwcG9ydGVkIHJhdGUKKwlkYWNfcmF0ZSA9IHJkY29kZWMoJnMtPmNvZGVjLCBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSk7CisKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWRiZygiJXM6IHNldCB0byAlZCBIeiIsIF9fRlVOQ1RJT05fXywgZGFjX3JhdGUpOworI2VuZGlmCisKKwkvLyBzb21lIGNvZGVjJ3MgZG9uJ3QgYWxsb3cgdW5lcXVhbCBEQUMgYW5kIEFEQyByYXRlcywgaW4gd2hpY2ggY2FzZQorCS8vIHdyaXRpbmcgb25lIHJhdGUgcmVnIGFjdHVhbGx5IGNoYW5nZXMgYm90aC4KKwlhZGNfcmF0ZSA9IHJkY29kZWMoJnMtPmNvZGVjLCBBQzk3X1BDTV9MUl9BRENfUkFURSk7CisKKwlkYWMtPnNhbXBsZV9yYXRlID0gZGFjX3JhdGU7CisJYWRjLT5zYW1wbGVfcmF0ZSA9IGFkY19yYXRlOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCWlmIChkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWRpc2FibGVfZG1hKGRiLT5kbWFucik7CisKKwlkYi0+c3RvcHBlZCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkICBzdG9wX2FkYyhzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCWlmIChkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWRpc2FibGVfZG1hKGRiLT5kbWFucik7CisKKwlkYi0+c3RvcHBlZCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgc2V0X3htaXRfc2xvdHMoaW50IG51bV9jaGFubmVscykKK3sKKwl1MzIgYWM5N19jb25maWcgPSBhdV9yZWFkbChBQzk3Q19DT05GSUcpICYgfkFDOTdDX1hNSVRfU0xPVFNfTUFTSzsKKworCXN3aXRjaCAobnVtX2NoYW5uZWxzKSB7CisJY2FzZSAxOgkJLy8gbW9ubworCWNhc2UgMjoJCS8vIHN0ZXJlbywgc2xvdHMgMyw0CisJCWFjOTdfY29uZmlnIHw9ICgweDMgPDwgQUM5N0NfWE1JVF9TTE9UU19CSVQpOworCQlicmVhazsKKwljYXNlIDQ6CQkvLyBzdGVyZW8gd2l0aCBzdXJyb3VuZCwgc2xvdHMgMyw0LDcsOAorCQlhYzk3X2NvbmZpZyB8PSAoMHgzMyA8PCBBQzk3Q19YTUlUX1NMT1RTX0JJVCk7CisJCWJyZWFrOworCWNhc2UgNjoJCS8vIHN0ZXJlbyB3aXRoIHN1cnJvdW5kIGFuZCBjZW50ZXIvTEZFLCBzbG90cyAzLDQsNiw3LDgsOQorCQlhYzk3X2NvbmZpZyB8PSAoMHg3YiA8PCBBQzk3Q19YTUlUX1NMT1RTX0JJVCk7CisJCWJyZWFrOworCX0KKworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgQUM5N0NfQ09ORklHKTsKK30KKworc3RhdGljIHZvaWQgICAgIHNldF9yZWN2X3Nsb3RzKGludCBudW1fY2hhbm5lbHMpCit7CisJdTMyIGFjOTdfY29uZmlnID0gYXVfcmVhZGwoQUM5N0NfQ09ORklHKSAmIH5BQzk3Q19SRUNWX1NMT1RTX01BU0s7CisKKwkvKgorCSAqIEFsd2F5cyBlbmFibGUgc2xvdHMgMyBhbmQgNCAoc3RlcmVvKS4gU2xvdCA2IGlzCisJICogb3B0aW9uYWwgTWljIEFEQywgd2hpY2ggSSBkb24ndCBzdXBwb3J0IHlldC4KKwkgKi8KKwlhYzk3X2NvbmZpZyB8PSAoMHgzIDw8IEFDOTdDX1JFQ1ZfU0xPVFNfQklUKTsKKworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgQUM5N0NfQ09ORklHKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBhdTEwMDBfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiAgKmRiID0gJnMtPmRtYV9kYWM7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgICBidWYxLCBidWYyOworCisJaWYgKCFkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWF1X3JlYWRsKEFDOTdDX1NUQVRVUyk7CS8vIHJlYWQgc3RhdHVzIHRvIGNsZWFyIHN0aWNreSBiaXRzCisKKwkvLyByZXNldCBCdWZmZXIgMSBhbmQgMiBwb2ludGVycyB0byBuZXh0T3V0IGFuZCBuZXh0T3V0K2RtYV9mcmFnc2l6ZQorCWJ1ZjEgPSB2aXJ0X3RvX3BoeXMoZGItPm5leHRPdXQpOworCWJ1ZjIgPSBidWYxICsgZGItPmRtYV9mcmFnc2l6ZTsKKwlpZiAoYnVmMiA+PSBkYi0+ZG1hYWRkciArIGRiLT5kbWFzaXplKQorCQlidWYyIC09IGRiLT5kbWFzaXplOworCisJc2V0X3htaXRfc2xvdHMoZGItPm51bV9jaGFubmVscyk7CisKKwlpbml0X2RtYShkYi0+ZG1hbnIpOworCWlmIChnZXRfZG1hX2FjdGl2ZV9idWZmZXIoZGItPmRtYW5yKSA9PSAwKSB7CisJCWNsZWFyX2RtYV9kb25lMChkYi0+ZG1hbnIpOwkvLyBjbGVhciBETUEgZG9uZSBiaXQKKwkJc2V0X2RtYV9hZGRyMChkYi0+ZG1hbnIsIGJ1ZjEpOworCQlzZXRfZG1hX2FkZHIxKGRiLT5kbWFuciwgYnVmMik7CisJfSBlbHNlIHsKKwkJY2xlYXJfZG1hX2RvbmUxKGRiLT5kbWFucik7CS8vIGNsZWFyIERNQSBkb25lIGJpdAorCQlzZXRfZG1hX2FkZHIxKGRiLT5kbWFuciwgYnVmMSk7CisJCXNldF9kbWFfYWRkcjAoZGItPmRtYW5yLCBidWYyKTsKKwl9CisJc2V0X2RtYV9jb3VudChkYi0+ZG1hbnIsIGRiLT5kbWFfZnJhZ3NpemU+PjEpOworCWVuYWJsZV9kbWFfYnVmZmVycyhkYi0+ZG1hbnIpOworCisJc3RhcnRfZG1hKGRiLT5kbWFucik7CisKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWR1bXBfYXUxMDAwX2RtYV9jaGFubmVsKGRiLT5kbWFucik7CisjZW5kaWYKKworCWRiLT5zdG9wcGVkID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBhdTEwMDBfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiAgKmRiID0gJnMtPmRtYV9hZGM7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgICBidWYxLCBidWYyOworCisJaWYgKCFkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWF1X3JlYWRsKEFDOTdDX1NUQVRVUyk7CS8vIHJlYWQgc3RhdHVzIHRvIGNsZWFyIHN0aWNreSBiaXRzCisKKwkvLyByZXNldCBCdWZmZXIgMSBhbmQgMiBwb2ludGVycyB0byBuZXh0SW4gYW5kIG5leHRJbitkbWFfZnJhZ3NpemUKKwlidWYxID0gdmlydF90b19waHlzKGRiLT5uZXh0SW4pOworCWJ1ZjIgPSBidWYxICsgZGItPmRtYV9mcmFnc2l6ZTsKKwlpZiAoYnVmMiA+PSBkYi0+ZG1hYWRkciArIGRiLT5kbWFzaXplKQorCQlidWYyIC09IGRiLT5kbWFzaXplOworCisJc2V0X3JlY3Zfc2xvdHMoZGItPm51bV9jaGFubmVscyk7CisKKwlpbml0X2RtYShkYi0+ZG1hbnIpOworCWlmIChnZXRfZG1hX2FjdGl2ZV9idWZmZXIoZGItPmRtYW5yKSA9PSAwKSB7CisJCWNsZWFyX2RtYV9kb25lMChkYi0+ZG1hbnIpOwkvLyBjbGVhciBETUEgZG9uZSBiaXQKKwkJc2V0X2RtYV9hZGRyMChkYi0+ZG1hbnIsIGJ1ZjEpOworCQlzZXRfZG1hX2FkZHIxKGRiLT5kbWFuciwgYnVmMik7CisJfSBlbHNlIHsKKwkJY2xlYXJfZG1hX2RvbmUxKGRiLT5kbWFucik7CS8vIGNsZWFyIERNQSBkb25lIGJpdAorCQlzZXRfZG1hX2FkZHIxKGRiLT5kbWFuciwgYnVmMSk7CisJCXNldF9kbWFfYWRkcjAoZGItPmRtYW5yLCBidWYyKTsKKwl9CisJc2V0X2RtYV9jb3VudChkYi0+ZG1hbnIsIGRiLT5kbWFfZnJhZ3NpemU+PjEpOworCWVuYWJsZV9kbWFfYnVmZmVycyhkYi0+ZG1hbnIpOworCisJc3RhcnRfZG1hKGRiLT5kbWFucik7CisKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWR1bXBfYXUxMDAwX2RtYV9jaGFubmVsKGRiLT5kbWFucik7CisjZW5kaWYKKworCWRiLT5zdG9wcGVkID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAoMTctUEFHRV9TSElGVCkKKyNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKKworZXh0ZXJuIGlubGluZSB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBhdTEwMDBfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXN0cnVjdCBwYWdlICAgICpwYWdlLCAqcGVuZDsKKworCWlmIChkYi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsKKwkJCQkgICAgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJZG1hX2ZyZWVfbm9uY29oZXJlbnQoTlVMTCwKKwkJCQlQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyLAorCQkJCWRiLT5yYXdidWYsCisJCQkJZGItPmRtYWFkZHIpOworCX0KKwlkYi0+cmF3YnVmID0gZGItPm5leHRJbiA9IGRiLT5uZXh0T3V0ID0gTlVMTDsKKwlkYi0+bWFwcGVkID0gZGItPnJlYWR5ID0gMDsKK30KKworc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlpbnQgICAgICAgICAgICAgb3JkZXI7CisJdW5zaWduZWQgdXNlcl9ieXRlc19wZXJfc2VjOworCXVuc2lnbmVkICAgICAgICBidWZzOworCXN0cnVjdCBwYWdlICAgICpwYWdlLCAqcGVuZDsKKwl1bnNpZ25lZCAgICAgICAgcmF0ZSA9IGRiLT5zYW1wbGVfcmF0ZTsKKworCWlmICghZGItPnJhd2J1ZikgeworCQlkYi0+cmVhZHkgPSBkYi0+bWFwcGVkID0gMDsKKwkJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7CisJCSAgICAgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKQorCQkJaWYgKChkYi0+cmF3YnVmID0gZG1hX2FsbG9jX25vbmNvaGVyZW50KE5VTEwsCisJCQkJCQlQQUdFX1NJWkUgPDwgb3JkZXIsCisJCQkJCQkmZGItPmRtYWFkZHIsCisJCQkJCQkwKSkpCisJCQkJYnJlYWs7CisJCWlmICghZGItPnJhd2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlkYi0+YnVmb3JkZXIgPSBvcmRlcjsKKwkJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOworCQkgICBvdGhlcndpc2UgcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArCisJCQkJICAgIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCX0KKworCWRiLT5jbnRfZmFjdG9yID0gMTsKKwlpZiAoZGItPnNhbXBsZV9zaXplID09IDgpCisJCWRiLT5jbnRfZmFjdG9yICo9IDI7CisJaWYgKGRiLT5udW1fY2hhbm5lbHMgPT0gMSkKKwkJZGItPmNudF9mYWN0b3IgKj0gMjsKKwlkYi0+Y250X2ZhY3RvciAqPSBkYi0+c3JjX2ZhY3RvcjsKKworCWRiLT5jb3VudCA9IDA7CisJZGItPm5leHRJbiA9IGRiLT5uZXh0T3V0ID0gZGItPnJhd2J1ZjsKKworCWRiLT51c2VyX2J5dGVzX3Blcl9zYW1wbGUgPSAoZGItPnNhbXBsZV9zaXplPj4zKSAqIGRiLT5udW1fY2hhbm5lbHM7CisJZGItPmRtYV9ieXRlc19wZXJfc2FtcGxlID0gMiAqICgoZGItPm51bV9jaGFubmVscyA9PSAxKSA/CisJCQkJCTIgOiBkYi0+bnVtX2NoYW5uZWxzKTsKKworCXVzZXJfYnl0ZXNfcGVyX3NlYyA9IHJhdGUgKiBkYi0+dXNlcl9ieXRlc19wZXJfc2FtcGxlOworCWJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworCWlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IHVzZXJfYnl0ZXNfcGVyX3NlYykKKwkJCWRiLT5mcmFnc2hpZnQgPSBsZDIodXNlcl9ieXRlc19wZXJfc2VjLzEwMDApOworCQllbHNlCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gZGItPm9zc2ZyYWdzaGlmdDsKKwl9IGVsc2UgeworCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKHVzZXJfYnl0ZXNfcGVyX3NlYyAvIDEwMCAvCisJCQkJICAgIChkYi0+c3ViZGl2aXNpb24gPyBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CisJCWlmIChkYi0+ZnJhZ3NoaWZ0IDwgMykKKwkJCWRiLT5mcmFnc2hpZnQgPSAzOworCX0KKworCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKwlkYi0+ZG1hX2ZyYWdzaXplID0gZGItPmZyYWdzaXplICogZGItPmNudF9mYWN0b3I7CisJZGItPm51bWZyYWcgPSBidWZzIC8gZGItPmRtYV9mcmFnc2l6ZTsKKworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+ZnJhZ3NpemUgPSAxIDw8IGRiLT5mcmFnc2hpZnQ7CisJCWRiLT5kbWFfZnJhZ3NpemUgPSBkYi0+ZnJhZ3NpemUgKiBkYi0+Y250X2ZhY3RvcjsKKwkJZGItPm51bWZyYWcgPSBidWZzIC8gZGItPmRtYV9mcmFnc2l6ZTsKKwl9CisKKwlpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisJCWRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworCisJZGItPmRtYXNpemUgPSBkYi0+ZG1hX2ZyYWdzaXplICogZGItPm51bWZyYWc7CisJbWVtc2V0KGRiLT5yYXdidWYsIDAsIGJ1ZnMpOworCisjaWZkZWYgQVUxMDAwX1ZFUkJPU0VfREVCVUcKKwlkYmcoInJhdGU9JWQsIHNhbXBsZXNpemU9JWQsIGNoYW5uZWxzPSVkIiwKKwkgICAgcmF0ZSwgZGItPnNhbXBsZV9zaXplLCBkYi0+bnVtX2NoYW5uZWxzKTsKKwlkYmcoImZyYWdzaXplPSVkLCBjbnRfZmFjdG9yPSVkLCBkbWFfZnJhZ3NpemU9JWQiLAorCSAgICBkYi0+ZnJhZ3NpemUsIGRiLT5jbnRfZmFjdG9yLCBkYi0+ZG1hX2ZyYWdzaXplKTsKKwlkYmcoIm51bWZyYWc9JWQsIGRtYXNpemU9JWQiLCBkYi0+bnVtZnJhZywgZGItPmRtYXNpemUpOworI2VuZGlmCisKKwlkYi0+cmVhZHkgPSAxOworCXJldHVybiAwOworfQorCitleHRlcm4gaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9hZGMoc3RydWN0IGF1MTAwMF9zdGF0ZSAqcykKK3sKKwlzdG9wX2FkYyhzKTsKKwlyZXR1cm4gcHJvZ19kbWFidWYocywgJnMtPmRtYV9hZGMpOworCit9CisKK2V4dGVybiBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2RhYyhzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzKQoreworCXN0b3BfZGFjKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYyk7Cit9CisKKworLyogaG9sZCBzcGlubG9jayBmb3IgdGhlIGZvbGxvd2luZyAqLworc3RhdGljIGlycXJldHVybl90IGRhY19kbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopIGRldl9pZDsKKwlzdHJ1Y3QgZG1hYnVmICAqZGFjID0gJnMtPmRtYV9kYWM7CisJdW5zaWduZWQgbG9uZyAgIG5ld3B0cjsKKwl1MzIgYWM5N2Nfc3RhdCwgYnVmZl9kb25lOworCisJYWM5N2Nfc3RhdCA9IGF1X3JlYWRsKEFDOTdDX1NUQVRVUyk7CisjaWZkZWYgQVUxMDAwX1ZFUkJPU0VfREVCVUcKKwlpZiAoYWM5N2Nfc3RhdCAmIChBQzk3Q19YVSB8IEFDOTdDX1hPIHwgQUM5N0NfVEUpKQorCQlkYmcoIkFDOTdDIHN0YXR1cyA9IDB4JTA4eCIsIGFjOTdjX3N0YXQpOworI2VuZGlmCisKKwlpZiAoKGJ1ZmZfZG9uZSA9IGdldF9kbWFfYnVmZmVyX2RvbmUoZGFjLT5kbWFucikpID09IDApIHsKKwkJLyogZmFzdHBhdGggb3V0LCB0byBlYXNlIGludGVycnVwdCBzaGFyaW5nICovCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlzcGluX2xvY2soJnMtPmxvY2spOworCQorCWlmIChidWZmX2RvbmUgIT0gKERNQV9EMCB8IERNQV9EMSkpIHsKKwkJZGFjLT5uZXh0T3V0ICs9IGRhYy0+ZG1hX2ZyYWdzaXplOworCQlpZiAoZGFjLT5uZXh0T3V0ID49IGRhYy0+cmF3YnVmICsgZGFjLT5kbWFzaXplKQorCQkJZGFjLT5uZXh0T3V0IC09IGRhYy0+ZG1hc2l6ZTsKKworCQkvKiB1cGRhdGUgcGxheWJhY2sgcG9pbnRlcnMgKi8KKwkJbmV3cHRyID0gdmlydF90b19waHlzKGRhYy0+bmV4dE91dCkgKyBkYWMtPmRtYV9mcmFnc2l6ZTsKKwkJaWYgKG5ld3B0ciA+PSBkYWMtPmRtYWFkZHIgKyBkYWMtPmRtYXNpemUpCisJCQluZXdwdHIgLT0gZGFjLT5kbWFzaXplOworCisJCWRhYy0+Y291bnQgLT0gZGFjLT5kbWFfZnJhZ3NpemU7CisJCWRhYy0+dG90YWxfYnl0ZXMgKz0gZGFjLT5kbWFfZnJhZ3NpemU7CisKKwkJaWYgKGRhYy0+Y291bnQgPD0gMCkgeworI2lmZGVmIEFVMTAwMF9WRVJCT1NFX0RFQlVHCisJCQlkYmcoImRhYyB1bmRlcnJ1biIpOworI2VuZGlmCisJCQlzcGluX3VubG9jaygmcy0+bG9jayk7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXNwaW5fbG9jaygmcy0+bG9jayk7CisJCQlkYWMtPmNvdW50ID0gMDsKKwkJCWRhYy0+bmV4dEluID0gZGFjLT5uZXh0T3V0OworCQl9IGVsc2UgaWYgKGJ1ZmZfZG9uZSA9PSBETUFfRDApIHsKKwkJCWNsZWFyX2RtYV9kb25lMChkYWMtPmRtYW5yKTsJLy8gY2xlYXIgRE1BIGRvbmUgYml0CisJCQlzZXRfZG1hX2NvdW50MChkYWMtPmRtYW5yLCBkYWMtPmRtYV9mcmFnc2l6ZT4+MSk7CisJCQlzZXRfZG1hX2FkZHIwKGRhYy0+ZG1hbnIsIG5ld3B0cik7CisJCQllbmFibGVfZG1hX2J1ZmZlcjAoZGFjLT5kbWFucik7CS8vIHJlZW5hYmxlCisJCX0gZWxzZSB7CisJCQljbGVhcl9kbWFfZG9uZTEoZGFjLT5kbWFucik7CS8vIGNsZWFyIERNQSBkb25lIGJpdAorCQkJc2V0X2RtYV9jb3VudDEoZGFjLT5kbWFuciwgZGFjLT5kbWFfZnJhZ3NpemU+PjEpOworCQkJc2V0X2RtYV9hZGRyMShkYWMtPmRtYW5yLCBuZXdwdHIpOworCQkJZW5hYmxlX2RtYV9idWZmZXIxKGRhYy0+ZG1hbnIpOwkvLyByZWVuYWJsZQorCQl9CisJfSBlbHNlIHsKKwkJLy8gYm90aCBkb25lIGJpdHMgc2V0LCB3ZSBtaXNzZWQgYW4gaW50ZXJydXB0CisJCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwkJc3RvcF9kYWMocyk7CisJCXNwaW5fbG9jaygmcy0+bG9jayk7CisKKwkJZGFjLT5uZXh0T3V0ICs9IDIqZGFjLT5kbWFfZnJhZ3NpemU7CisJCWlmIChkYWMtPm5leHRPdXQgPj0gZGFjLT5yYXdidWYgKyBkYWMtPmRtYXNpemUpCisJCQlkYWMtPm5leHRPdXQgLT0gZGFjLT5kbWFzaXplOworCisJCWRhYy0+Y291bnQgLT0gMipkYWMtPmRtYV9mcmFnc2l6ZTsKKwkJZGFjLT50b3RhbF9ieXRlcyArPSAyKmRhYy0+ZG1hX2ZyYWdzaXplOworCisJCWlmIChkYWMtPmNvdW50ID4gMCkgeworCQkJc3Bpbl91bmxvY2soJnMtPmxvY2spOworCQkJc3RhcnRfZGFjKHMpOworCQkJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwkJfQorCX0KKworCS8qIHdha2UgdXAgYW55Ym9keSBsaXN0ZW5pbmcgKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZGFjLT53YWl0KSkKKwkJd2FrZV91cCgmZGFjLT53YWl0KTsKKworCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgYWRjX2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzID0gKHN0cnVjdCBhdTEwMDBfc3RhdGUgKikgZGV2X2lkOworCXN0cnVjdCBkbWFidWYgICphZGMgPSAmcy0+ZG1hX2FkYzsKKwl1bnNpZ25lZCBsb25nICAgbmV3cHRyOworCXUzMiBhYzk3Y19zdGF0LCBidWZmX2RvbmU7CisKKwlhYzk3Y19zdGF0ID0gYXVfcmVhZGwoQUM5N0NfU1RBVFVTKTsKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWlmIChhYzk3Y19zdGF0ICYgKEFDOTdDX1JVIHwgQUM5N0NfUk8pKQorCQlkYmcoIkFDOTdDIHN0YXR1cyA9IDB4JTA4eCIsIGFjOTdjX3N0YXQpOworI2VuZGlmCisKKwlpZiAoKGJ1ZmZfZG9uZSA9IGdldF9kbWFfYnVmZmVyX2RvbmUoYWRjLT5kbWFucikpID09IDApIHsKKwkJLyogZmFzdHBhdGggb3V0LCB0byBlYXNlIGludGVycnVwdCBzaGFyaW5nICovCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlzcGluX2xvY2soJnMtPmxvY2spOworCQorCWlmIChidWZmX2RvbmUgIT0gKERNQV9EMCB8IERNQV9EMSkpIHsKKwkJaWYgKGFkYy0+Y291bnQgKyBhZGMtPmRtYV9mcmFnc2l6ZSA+IGFkYy0+ZG1hc2l6ZSkgeworCQkJLy8gT3ZlcnJ1bi4gU3RvcCBBREMgYW5kIGxvZyB0aGUgZXJyb3IKKwkJCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwkJCXN0b3BfYWRjKHMpOworCQkJYWRjLT5lcnJvcisrOworCQkJZXJyKCJhZGMgb3ZlcnJ1biIpOworCQkJcmV0dXJuIElSUV9OT05FOworCQl9CisKKwkJYWRjLT5uZXh0SW4gKz0gYWRjLT5kbWFfZnJhZ3NpemU7CisJCWlmIChhZGMtPm5leHRJbiA+PSBhZGMtPnJhd2J1ZiArIGFkYy0+ZG1hc2l6ZSkKKwkJCWFkYy0+bmV4dEluIC09IGFkYy0+ZG1hc2l6ZTsKKworCQkvKiB1cGRhdGUgY2FwdHVyZSBwb2ludGVycyAqLworCQluZXdwdHIgPSB2aXJ0X3RvX3BoeXMoYWRjLT5uZXh0SW4pICsgYWRjLT5kbWFfZnJhZ3NpemU7CisJCWlmIChuZXdwdHIgPj0gYWRjLT5kbWFhZGRyICsgYWRjLT5kbWFzaXplKQorCQkJbmV3cHRyIC09IGFkYy0+ZG1hc2l6ZTsKKworCQlhZGMtPmNvdW50ICs9IGFkYy0+ZG1hX2ZyYWdzaXplOworCQlhZGMtPnRvdGFsX2J5dGVzICs9IGFkYy0+ZG1hX2ZyYWdzaXplOworCisJCWlmIChidWZmX2RvbmUgPT0gRE1BX0QwKSB7CisJCQljbGVhcl9kbWFfZG9uZTAoYWRjLT5kbWFucik7CS8vIGNsZWFyIERNQSBkb25lIGJpdAorCQkJc2V0X2RtYV9jb3VudDAoYWRjLT5kbWFuciwgYWRjLT5kbWFfZnJhZ3NpemU+PjEpOworCQkJc2V0X2RtYV9hZGRyMChhZGMtPmRtYW5yLCBuZXdwdHIpOworCQkJZW5hYmxlX2RtYV9idWZmZXIwKGFkYy0+ZG1hbnIpOwkvLyByZWVuYWJsZQorCQl9IGVsc2UgeworCQkJY2xlYXJfZG1hX2RvbmUxKGFkYy0+ZG1hbnIpOwkvLyBjbGVhciBETUEgZG9uZSBiaXQKKwkJCXNldF9kbWFfY291bnQxKGFkYy0+ZG1hbnIsIGFkYy0+ZG1hX2ZyYWdzaXplPj4xKTsKKwkJCXNldF9kbWFfYWRkcjEoYWRjLT5kbWFuciwgbmV3cHRyKTsKKwkJCWVuYWJsZV9kbWFfYnVmZmVyMShhZGMtPmRtYW5yKTsJLy8gcmVlbmFibGUKKwkJfQorCX0gZWxzZSB7CisJCS8vIGJvdGggZG9uZSBiaXRzIHNldCwgd2UgbWlzc2VkIGFuIGludGVycnVwdAorCQlzcGluX3VubG9jaygmcy0+bG9jayk7CisJCXN0b3BfYWRjKHMpOworCQlzcGluX2xvY2soJnMtPmxvY2spOworCQkKKwkJaWYgKGFkYy0+Y291bnQgKyAyKmFkYy0+ZG1hX2ZyYWdzaXplID4gYWRjLT5kbWFzaXplKSB7CisJCQkvLyBPdmVycnVuLiBMb2cgdGhlIGVycm9yCisJCQlhZGMtPmVycm9yKys7CisJCQllcnIoImFkYyBvdmVycnVuIik7CisJCQlzcGluX3VubG9jaygmcy0+bG9jayk7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KKworCQlhZGMtPm5leHRJbiArPSAyKmFkYy0+ZG1hX2ZyYWdzaXplOworCQlpZiAoYWRjLT5uZXh0SW4gPj0gYWRjLT5yYXdidWYgKyBhZGMtPmRtYXNpemUpCisJCQlhZGMtPm5leHRJbiAtPSBhZGMtPmRtYXNpemU7CisKKwkJYWRjLT5jb3VudCArPSAyKmFkYy0+ZG1hX2ZyYWdzaXplOworCQlhZGMtPnRvdGFsX2J5dGVzICs9IDIqYWRjLT5kbWFfZnJhZ3NpemU7CisJCQorCQlzcGluX3VubG9jaygmcy0+bG9jayk7CisJCXN0YXJ0X2FkYyhzKTsKKwkJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwl9CisKKwkvKiB3YWtlIHVwIGFueWJvZHkgbGlzdGVuaW5nICovCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmFkYy0+d2FpdCkpCisJCXdha2VfdXAoJmFkYy0+d2FpdCk7CisKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgbG9mZl90IGF1MTAwMF9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJcmV0dXJuIC1FU1BJUEU7Cit9CisKKworc3RhdGljIGludCBhdTEwMDBfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJmF1MTAwMF9zdGF0ZTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgYXUxMDAwX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1peGRldl9pb2N0bChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgYXUxMDAwX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzID0gKHN0cnVjdCBhdTEwMDBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gJnMtPmNvZGVjOworCisJcmV0dXJuIG1peGRldl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworfQorCitzdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1MTAwMF9taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IGF1MTAwMF9sbHNlZWssCisJLmlvY3RsCQk9IGF1MTAwMF9pb2N0bF9taXhkZXYsCisJLm9wZW4JCT0gYXUxMDAwX29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlCT0gYXUxMDAwX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBhdTEwMDBfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgIGNvdW50LCB0bW87CisKKwlpZiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwgIXMtPmRtYV9kYWMucmVhZHkgfHwgcy0+ZG1hX2RhYy5zdG9wcGVkKQorCQlyZXR1cm4gMDsKKworCWZvciAoOzspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlpZiAobm9uYmxvY2spCisJCQlyZXR1cm4gLUVCVVNZOworCQl0bW8gPSAxMDAwICogY291bnQgLyAocy0+bm9fdnJhID8KKwkJCQkgICAgICA0ODAwMCA6IHMtPmRtYV9kYWMuc2FtcGxlX3JhdGUpOworCQl0bW8gLz0gcy0+ZG1hX2RhYy5kbWFfYnl0ZXNfcGVyX3NhbXBsZTsKKwkJYXUxMDAwX2RlbGF5KHRtbyk7CisJfQorCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdTggUzE2X1RPX1U4KHMxNiBjaCkKK3sKKwlyZXR1cm4gKHU4KSAoY2ggPj4gOCkgKyAweDgwOworfQorc3RhdGljIGlubGluZSBzMTYgVThfVE9fUzE2KHU4IGNoKQoreworCXJldHVybiAoczE2KSAoY2ggLSAweDgwKSA8PCA4OworfQorCisvKgorICogVHJhbnNsYXRlcyB1c2VyIHNhbXBsZXMgdG8gZG1hIGJ1ZmZlciBzdWl0YWJsZSBmb3IgQUMnOTcgREFDIGRhdGE6CisgKiAgICAgSWYgbW9ubywgY29weSBsZWZ0IGNoYW5uZWwgdG8gcmlnaHQgY2hhbm5lbCBpbiBkbWEgYnVmZmVyLgorICogICAgIElmIDggYml0IHNhbXBsZXMsIGN2dCB0byAxNi1iaXQgYmVmb3JlIHdyaXRpbmcgdG8gZG1hIGJ1ZmZlci4KKyAqICAgICBJZiBpbnRlcnBvbGF0aW5nIChubyBWUkEpLCBkdXBsaWNhdGUgZXZlcnkgYXVkaW8gZnJhbWUgc3JjX2ZhY3RvciB0aW1lcy4KKyAqLworc3RhdGljIGludCB0cmFuc2xhdGVfZnJvbV91c2VyKHN0cnVjdCBkbWFidWYgKmRiLAorCQkJICAgICAgIGNoYXIqIGRtYWJ1ZiwKKwkJCSAgICAgICBjaGFyKiB1c2VyYnVmLAorCQkJICAgICAgIGludCBkbWFjb3VudCkKK3sKKwlpbnQgICAgICAgICAgICAgc2FtcGxlLCBpOworCWludCAgICAgICAgICAgICBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKwlpbnQgICAgICAgICAgICAgbnVtX3NhbXBsZXM7CisJaW50ICAgICAgICAgICAgIG1vbm8gPSAoZGItPm51bV9jaGFubmVscyA9PSAxKTsKKwljaGFyICAgICAgICAgICAgdXNlcnNhbXBsZVsxMl07CisJczE2ICAgICAgICAgICAgIGNoLCBkbWFzYW1wbGVbNl07CisKKwlpZiAoZGItPnNhbXBsZV9zaXplID09IDE2ICYmICFtb25vICYmIGRiLT5zcmNfZmFjdG9yID09IDEpIHsKKwkJLy8gbm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5LCBqdXN0IGNvcHkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1ZiwgdXNlcmJ1ZiwgZG1hY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBkbWFjb3VudDsKKwl9CisKKwlpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZSA9IGRiLT5kbWFfYnl0ZXNfcGVyX3NhbXBsZSAqIGRiLT5zcmNfZmFjdG9yOworCW51bV9zYW1wbGVzID0gZG1hY291bnQgLyBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKworCWZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgbnVtX3NhbXBsZXM7IHNhbXBsZSsrKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcih1c2Vyc2FtcGxlLCB1c2VyYnVmLAorCQkJCSAgIGRiLT51c2VyX2J5dGVzX3Blcl9zYW1wbGUpKSB7CisJCQlkYmcoIiVzOiBmYXVsdCIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBkYi0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChkYi0+c2FtcGxlX3NpemUgPT0gOCkKKwkJCQljaCA9IFU4X1RPX1MxNih1c2Vyc2FtcGxlW2ldKTsKKwkJCWVsc2UKKwkJCQljaCA9ICooKHMxNiAqKSAoJnVzZXJzYW1wbGVbaSAqIDJdKSk7CisJCQlkbWFzYW1wbGVbaV0gPSBjaDsKKwkJCWlmIChtb25vKQorCQkJCWRtYXNhbXBsZVtpICsgMV0gPSBjaDsJLy8gcmlnaHQgY2hhbm5lbAorCQl9CisKKwkJLy8gZHVwbGljYXRlIGV2ZXJ5IGF1ZGlvIGZyYW1lIHNyY19mYWN0b3IgdGltZXMKKwkJZm9yIChpID0gMDsgaSA8IGRiLT5zcmNfZmFjdG9yOyBpKyspCisJCQltZW1jcHkoZG1hYnVmLCBkbWFzYW1wbGUsIGRiLT5kbWFfYnl0ZXNfcGVyX3NhbXBsZSk7CisKKwkJdXNlcmJ1ZiArPSBkYi0+dXNlcl9ieXRlc19wZXJfc2FtcGxlOworCQlkbWFidWYgKz0gaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7CisJfQorCisJcmV0dXJuIG51bV9zYW1wbGVzICogaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7Cit9CisKKy8qCisgKiBUcmFuc2xhdGVzIEFDJzk3IEFEQyBzYW1wbGVzIHRvIHVzZXIgYnVmZmVyOgorICogICAgIElmIG1vbm8sIHNlbmQgb25seSBsZWZ0IGNoYW5uZWwgdG8gdXNlciBidWZmZXIuCisgKiAgICAgSWYgOCBiaXQgc2FtcGxlcywgY3Z0IGZyb20gMTYgdG8gOCBiaXQgYmVmb3JlIHdyaXRpbmcgdG8gdXNlciBidWZmZXIuCisgKiAgICAgSWYgZGVjaW1hdGluZyAobm8gVlJBKSwgc2tpcCBvdmVyIHNyY19mYWN0b3IgYXVkaW8gZnJhbWVzLgorICovCitzdGF0aWMgaW50IHRyYW5zbGF0ZV90b191c2VyKHN0cnVjdCBkbWFidWYgKmRiLAorCQkJICAgICBjaGFyKiB1c2VyYnVmLAorCQkJICAgICBjaGFyKiBkbWFidWYsCisJCQkgICAgIGludCBkbWFjb3VudCkKK3sKKwlpbnQgICAgICAgICAgICAgc2FtcGxlLCBpOworCWludCAgICAgICAgICAgICBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKwlpbnQgICAgICAgICAgICAgbnVtX3NhbXBsZXM7CisJaW50ICAgICAgICAgICAgIG1vbm8gPSAoZGItPm51bV9jaGFubmVscyA9PSAxKTsKKwljaGFyICAgICAgICAgICAgdXNlcnNhbXBsZVsxMl07CisKKwlpZiAoZGItPnNhbXBsZV9zaXplID09IDE2ICYmICFtb25vICYmIGRiLT5zcmNfZmFjdG9yID09IDEpIHsKKwkJLy8gbm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5LCBqdXN0IGNvcHkKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VyYnVmLCBkbWFidWYsIGRtYWNvdW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gZG1hY291bnQ7CisJfQorCisJaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGUgPSBkYi0+ZG1hX2J5dGVzX3Blcl9zYW1wbGUgKiBkYi0+c3JjX2ZhY3RvcjsKKwludW1fc2FtcGxlcyA9IGRtYWNvdW50IC8gaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7CisKKwlmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IG51bV9zYW1wbGVzOyBzYW1wbGUrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgZGItPm51bV9jaGFubmVsczsgaSsrKSB7CisJCQlpZiAoZGItPnNhbXBsZV9zaXplID09IDgpCisJCQkJdXNlcnNhbXBsZVtpXSA9CisJCQkJCVMxNl9UT19VOCgqKChzMTYgKikgKCZkbWFidWZbaSAqIDJdKSkpOworCQkJZWxzZQorCQkJCSooKHMxNiAqKSAoJnVzZXJzYW1wbGVbaSAqIDJdKSkgPQorCQkJCQkqKChzMTYgKikgKCZkbWFidWZbaSAqIDJdKSk7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKHVzZXJidWYsIHVzZXJzYW1wbGUsCisJCQkJIGRiLT51c2VyX2J5dGVzX3Blcl9zYW1wbGUpKSB7CisJCQlkYmcoIiVzOiBmYXVsdCIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXVzZXJidWYgKz0gZGItPnVzZXJfYnl0ZXNfcGVyX3NhbXBsZTsKKwkJZG1hYnVmICs9IGludGVycF9ieXRlc19wZXJfc2FtcGxlOworCX0KKworCXJldHVybiBudW1fc2FtcGxlcyAqIGludGVycF9ieXRlc19wZXJfc2FtcGxlOworfQorCisvKgorICogQ29weSBhdWRpbyBkYXRhIHRvL2Zyb20gdXNlciBidWZmZXIgZnJvbS90byBkbWEgYnVmZmVyLCB0YWtpbmcgY2FyZQorICogdGhhdCB3ZSB3cmFwIHdoZW4gcmVhZGluZy93cml0aW5nIHRoZSBkbWEgYnVmZmVyLiBSZXR1cm5zIGFjdHVhbCBieXRlCisgKiBjb3VudCB3cml0dGVuIHRvIG9yIHJlYWQgZnJvbSB0aGUgZG1hIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBjb3B5X2RtYWJ1Zl91c2VyKHN0cnVjdCBkbWFidWYgKmRiLCBjaGFyKiB1c2VyYnVmLAorCQkJICAgIGludCBjb3VudCwgaW50IHRvX3VzZXIpCit7CisJY2hhciAgICAgICAgICAgKmJ1ZnB0ciA9IHRvX3VzZXIgPyBkYi0+bmV4dE91dCA6IGRiLT5uZXh0SW47CisJY2hhciAgICAgICAgICAgKmJ1ZmVuZCA9IGRiLT5yYXdidWYgKyBkYi0+ZG1hc2l6ZTsKKwlpbnQgICAgICAgICAgICAgY250LCByZXQ7CisKKwlpZiAoYnVmcHRyICsgY291bnQgPiBidWZlbmQpIHsKKwkJaW50ICAgICAgICAgICAgIHBhcnRpYWwgPSAoaW50KSAoYnVmZW5kIC0gYnVmcHRyKTsKKwkJaWYgKHRvX3VzZXIpIHsKKwkJCWlmICgoY250ID0gdHJhbnNsYXRlX3RvX3VzZXIoZGIsIHVzZXJidWYsCisJCQkJCQkgICAgIGJ1ZnB0ciwgcGFydGlhbCkpIDwgMCkKKwkJCQlyZXR1cm4gY250OworCQkJcmV0ID0gY250OworCQkJaWYgKChjbnQgPSB0cmFuc2xhdGVfdG9fdXNlcihkYiwgdXNlcmJ1ZiArIHBhcnRpYWwsCisJCQkJCQkgICAgIGRiLT5yYXdidWYsCisJCQkJCQkgICAgIGNvdW50IC0gcGFydGlhbCkpIDwgMCkKKwkJCQlyZXR1cm4gY250OworCQkJcmV0ICs9IGNudDsKKwkJfSBlbHNlIHsKKwkJCWlmICgoY250ID0gdHJhbnNsYXRlX2Zyb21fdXNlcihkYiwgYnVmcHRyLCB1c2VyYnVmLAorCQkJCQkJICAgICAgIHBhcnRpYWwpKSA8IDApCisJCQkJcmV0dXJuIGNudDsKKwkJCXJldCA9IGNudDsKKwkJCWlmICgoY250ID0gdHJhbnNsYXRlX2Zyb21fdXNlcihkYiwgZGItPnJhd2J1ZiwKKwkJCQkJCSAgICAgICB1c2VyYnVmICsgcGFydGlhbCwKKwkJCQkJCSAgICAgICBjb3VudCAtIHBhcnRpYWwpKSA8IDApCisJCQkJcmV0dXJuIGNudDsKKwkJCXJldCArPSBjbnQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodG9fdXNlcikKKwkJCXJldCA9IHRyYW5zbGF0ZV90b191c2VyKGRiLCB1c2VyYnVmLCBidWZwdHIsIGNvdW50KTsKKwkJZWxzZQorCQkJcmV0ID0gdHJhbnNsYXRlX2Zyb21fdXNlcihkYiwgYnVmcHRyLCB1c2VyYnVmLCBjb3VudCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdTEwMDBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmZmVyLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfYWRjOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgICAgICAgICByZXQ7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCWludCAgICAgICAgICAgICBjbnQsIHVzZXJjbnQsIGF2YWlsOworCisJaWYgKGRiLT5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKworCWNvdW50ICo9IGRiLT5jbnRfZmFjdG9yOworCisJZG93bigmcy0+c2VtKTsKKwlhZGRfd2FpdF9xdWV1ZSgmZGItPndhaXQsICZ3YWl0KTsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLy8gd2FpdCBmb3Igc2FtcGxlcyBpbiBBREMgZG1hIGJ1ZmZlcgorCQlkbyB7CisJCQlpZiAoZGItPnN0b3BwZWQpCisJCQkJc3RhcnRfYWRjKHMpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWF2YWlsID0gZGItPmNvdW50OworCQkJaWYgKGF2YWlsIDw9IDApCisJCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGF2YWlsIDw9IDApIHsKKwkJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJdXAoJnMtPnNlbSk7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJCWdvdG8gb3V0MjsKKwkJCQl9CisJCQkJZG93bigmcy0+c2VtKTsKKwkJCX0KKwkJfSB3aGlsZSAoYXZhaWwgPD0gMCk7CisKKwkJLy8gY29weSBmcm9tIG5leHRPdXQgdG8gdXNlcgorCQlpZiAoKGNudCA9IGNvcHlfZG1hYnVmX3VzZXIoZGIsIGJ1ZmZlciwKKwkJCQkJICAgIGNvdW50ID4gYXZhaWwgPworCQkJCQkgICAgYXZhaWwgOiBjb3VudCwgMSkpIDwgMCkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZGItPmNvdW50IC09IGNudDsKKwkJZGItPm5leHRPdXQgKz0gY250OworCQlpZiAoZGItPm5leHRPdXQgPj0gZGItPnJhd2J1ZiArIGRiLT5kbWFzaXplKQorCQkJZGItPm5leHRPdXQgLT0gZGItPmRtYXNpemU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCQljb3VudCAtPSBjbnQ7CisJCXVzZXJjbnQgPSBjbnQgLyBkYi0+Y250X2ZhY3RvcjsKKwkJYnVmZmVyICs9IHVzZXJjbnQ7CisJCXJldCArPSB1c2VyY250OworCX0JCQkvLyB3aGlsZSAoY291bnQgPiAwKQorCitvdXQ6CisJdXAoJnMtPnNlbSk7CitvdXQyOgorCXJlbW92ZV93YWl0X3F1ZXVlKCZkYi0+d2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYXUxMDAwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJICAgICAJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfZGFjOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgICAgICAgICByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlpbnQgICAgICAgICAgICAgY250LCB1c2VyY250LCBhdmFpbDsKKworI2lmZGVmIEFVMTAwMF9WRVJCT1NFX0RFQlVHCisJZGJnKCJ3cml0ZTogY291bnQ9JWQiLCBjb3VudCk7CisjZW5kaWYKKworCWlmIChkYi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljb3VudCAqPSBkYi0+Y250X2ZhY3RvcjsKKworCWRvd24oJnMtPnNlbSk7CQorCWFkZF93YWl0X3F1ZXVlKCZkYi0+d2FpdCwgJndhaXQpOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkvLyB3YWl0IGZvciBzcGFjZSBpbiBwbGF5YmFjayBidWZmZXIKKwkJZG8geworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWF2YWlsID0gKGludCkgZGItPmRtYXNpemUgLSBkYi0+Y291bnQ7CisJCQlpZiAoYXZhaWwgPD0gMCkKKwkJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoYXZhaWwgPD0gMCkgeworCQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQl1cCgmcy0+c2VtKTsKKwkJCQlzY2hlZHVsZSgpOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQkJZ290byBvdXQyOworCQkJCX0KKwkJCQlkb3duKCZzLT5zZW0pOworCQkJfQorCQl9IHdoaWxlIChhdmFpbCA8PSAwKTsKKworCQkvLyBjb3B5IGZyb20gdXNlciB0byBuZXh0SW4KKwkJaWYgKChjbnQgPSBjb3B5X2RtYWJ1Zl91c2VyKGRiLCAoY2hhciAqKSBidWZmZXIsCisJCQkJCSAgICBjb3VudCA+IGF2YWlsID8KKwkJCQkJICAgIGF2YWlsIDogY291bnQsIDApKSA8IDApIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWRiLT5jb3VudCArPSBjbnQ7CisJCWRiLT5uZXh0SW4gKz0gY250OworCQlpZiAoZGItPm5leHRJbiA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQlkYi0+bmV4dEluIC09IGRiLT5kbWFzaXplOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChkYi0+c3RvcHBlZCkKKwkJCXN0YXJ0X2RhYyhzKTsKKworCQljb3VudCAtPSBjbnQ7CisJCXVzZXJjbnQgPSBjbnQgLyBkYi0+Y250X2ZhY3RvcjsKKwkJYnVmZmVyICs9IHVzZXJjbnQ7CisJCXJldCArPSB1c2VyY250OworCX0JCQkvLyB3aGlsZSAoY291bnQgPiAwKQorCitvdXQ6CisJdXAoJnMtPnNlbSk7CitvdXQyOgorCXJlbW92ZV93YWl0X3F1ZXVlKCZkYi0+d2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCBhdTEwMDBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1bnNpZ25lZCBpbnQgICAgbWFzayA9IDA7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5KQorCQkJcmV0dXJuIDA7CisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2RhYy53YWl0LCB3YWl0KTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5KQorCQkJcmV0dXJuIDA7CisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2FkYy53YWl0LCB3YWl0KTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5kbWFfZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49CisJCQkgICAgKHNpZ25lZClzLT5kbWFfZGFjLmRtYV9mcmFnc2l6ZSkgCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2lnbmVkKSBzLT5kbWFfZGFjLmRtYXNpemUgPj0KKwkJCSAgICBzLT5kbWFfZGFjLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjLmRtYV9mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBhdTEwMDBfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgICpkYjsKKwl1bnNpZ25lZCBsb25nICAgc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWRiZyhfX0ZVTkNUSU9OX18pOworICAgIAorCWxvY2tfa2VybmVsKCk7CisJZG93bigmcy0+c2VtKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQorCQlkYiA9ICZzLT5kbWFfZGFjOworCWVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKQorCQlkYiA9ICZzLT5kbWFfYWRjOworCWVsc2UgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZpcnRfdG9fcGh5cyhkYi0+cmF3YnVmKSwKKwkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKwl2bWEtPnZtX2ZsYWdzICY9IH5WTV9JTzsKKwlkYi0+bWFwcGVkID0gMTsKK291dDoKKwl1cCgmcy0+c2VtKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworCisjaWZkZWYgQVUxMDAwX1ZFUkJPU0VfREVCVUcKK3N0YXRpYyBzdHJ1Y3QgaW9jdGxfc3RyX3QgeworCXVuc2lnbmVkIGludCAgICBjbWQ7CisJY29uc3QgY2hhciAgICAgKnN0cjsKK30gaW9jdGxfc3RyW10gPSB7CisJe1NORENUTF9EU1BfUkVTRVQsICJTTkRDVExfRFNQX1JFU0VUIn0sCisJe1NORENUTF9EU1BfU1lOQywgIlNORENUTF9EU1BfU1lOQyJ9LAorCXtTTkRDVExfRFNQX1NQRUVELCAiU05EQ1RMX0RTUF9TUEVFRCJ9LAorCXtTTkRDVExfRFNQX1NURVJFTywgIlNORENUTF9EU1BfU1RFUkVPIn0sCisJe1NORENUTF9EU1BfR0VUQkxLU0laRSwgIlNORENUTF9EU1BfR0VUQkxLU0laRSJ9LAorCXtTTkRDVExfRFNQX1NBTVBMRVNJWkUsICJTTkRDVExfRFNQX1NBTVBMRVNJWkUifSwKKwl7U05EQ1RMX0RTUF9DSEFOTkVMUywgIlNORENUTF9EU1BfQ0hBTk5FTFMifSwKKwl7U09VTkRfUENNX1dSSVRFX0NIQU5ORUxTLCAiU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTIn0sCisJe1NPVU5EX1BDTV9XUklURV9GSUxURVIsICJTT1VORF9QQ01fV1JJVEVfRklMVEVSIn0sCisJe1NORENUTF9EU1BfUE9TVCwgIlNORENUTF9EU1BfUE9TVCJ9LAorCXtTTkRDVExfRFNQX1NVQkRJVklERSwgIlNORENUTF9EU1BfU1VCRElWSURFIn0sCisJe1NORENUTF9EU1BfU0VURlJBR01FTlQsICJTTkRDVExfRFNQX1NFVEZSQUdNRU5UIn0sCisJe1NORENUTF9EU1BfR0VURk1UUywgIlNORENUTF9EU1BfR0VURk1UUyJ9LAorCXtTTkRDVExfRFNQX1NFVEZNVCwgIlNORENUTF9EU1BfU0VURk1UIn0sCisJe1NORENUTF9EU1BfR0VUT1NQQUNFLCAiU05EQ1RMX0RTUF9HRVRPU1BBQ0UifSwKKwl7U05EQ1RMX0RTUF9HRVRJU1BBQ0UsICJTTkRDVExfRFNQX0dFVElTUEFDRSJ9LAorCXtTTkRDVExfRFNQX05PTkJMT0NLLCAiU05EQ1RMX0RTUF9OT05CTE9DSyJ9LAorCXtTTkRDVExfRFNQX0dFVENBUFMsICJTTkRDVExfRFNQX0dFVENBUFMifSwKKwl7U05EQ1RMX0RTUF9HRVRUUklHR0VSLCAiU05EQ1RMX0RTUF9HRVRUUklHR0VSIn0sCisJe1NORENUTF9EU1BfU0VUVFJJR0dFUiwgIlNORENUTF9EU1BfU0VUVFJJR0dFUiJ9LAorCXtTTkRDVExfRFNQX0dFVElQVFIsICJTTkRDVExfRFNQX0dFVElQVFIifSwKKwl7U05EQ1RMX0RTUF9HRVRPUFRSLCAiU05EQ1RMX0RTUF9HRVRPUFRSIn0sCisJe1NORENUTF9EU1BfTUFQSU5CVUYsICJTTkRDVExfRFNQX01BUElOQlVGIn0sCisJe1NORENUTF9EU1BfTUFQT1VUQlVGLCAiU05EQ1RMX0RTUF9NQVBPVVRCVUYifSwKKwl7U05EQ1RMX0RTUF9TRVRTWU5DUk8sICJTTkRDVExfRFNQX1NFVFNZTkNSTyJ9LAorCXtTTkRDVExfRFNQX1NFVERVUExFWCwgIlNORENUTF9EU1BfU0VURFVQTEVYIn0sCisJe1NORENUTF9EU1BfR0VUT0RFTEFZLCAiU05EQ1RMX0RTUF9HRVRPREVMQVkifSwKKwl7U05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSywgIlNORENUTF9EU1BfR0VUQ0hBTk5FTE1BU0sifSwKKwl7U05EQ1RMX0RTUF9CSU5EX0NIQU5ORUwsICJTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTCJ9LAorCXtPU1NfR0VUVkVSU0lPTiwgIk9TU19HRVRWRVJTSU9OIn0sCisJe1NPVU5EX1BDTV9SRUFEX1JBVEUsICJTT1VORF9QQ01fUkVBRF9SQVRFIn0sCisJe1NPVU5EX1BDTV9SRUFEX0NIQU5ORUxTLCAiU09VTkRfUENNX1JFQURfQ0hBTk5FTFMifSwKKwl7U09VTkRfUENNX1JFQURfQklUUywgIlNPVU5EX1BDTV9SRUFEX0JJVFMifSwKKwl7U09VTkRfUENNX1JFQURfRklMVEVSLCAiU09VTkRfUENNX1JFQURfRklMVEVSIn0KK307CisjZW5kaWYKKworLy8gTmVlZCB0byBob2xkIGEgc3Bpbi1sb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMhCitzdGF0aWMgaW50IGRtYV9jb3VudF9kb25lKHN0cnVjdCBkbWFidWYgKmRiKQoreworCWlmIChkYi0+c3RvcHBlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZGItPmRtYV9mcmFnc2l6ZSAtIGdldF9kbWFfcmVzaWR1ZShkYi0+ZG1hbnIpOworfQorCisKK3N0YXRpYyBpbnQgYXUxMDAwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlhdWRpb19idWZfaW5mbyAgYWJpbmZvOworCWNvdW50X2luZm8gICAgICBjaW5mbzsKKwlpbnQgICAgICAgICAgICAgY291bnQ7CisJaW50ICAgICAgICAgICAgIHZhbCwgbWFwcGVkLCByZXQsIGRpZmY7CisKKwltYXBwZWQgPSAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiBzLT5kbWFfZGFjLm1hcHBlZCkgfHwKKwkJKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiBzLT5kbWFfYWRjLm1hcHBlZCk7CisKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWZvciAoY291bnQ9MDsgY291bnQ8c2l6ZW9mKGlvY3RsX3N0cikvc2l6ZW9mKGlvY3RsX3N0clswXSk7IGNvdW50KyspIHsKKwkJaWYgKGlvY3RsX3N0cltjb3VudF0uY21kID09IGNtZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoY291bnQgPCBzaXplb2YoaW9jdGxfc3RyKSAvIHNpemVvZihpb2N0bF9zdHJbMF0pKQorCQlkYmcoImlvY3RsICVzLCBhcmc9MHglbHgiLCBpb2N0bF9zdHJbY291bnRdLnN0ciwgYXJnKTsKKwllbHNlCisJCWRiZygiaW9jdGwgMHgleCB1bmtub3duLCBhcmc9MHglbHgiLCBjbWQsIGFyZyk7CisjZW5kaWYKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gZHJhaW5fZGFjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwKKwkJCQlEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJc3luY2hyb25pemVfaXJxKCk7CisJCQlzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9IDA7CisJCQlzLT5kbWFfZGFjLm5leHRJbiA9IHMtPmRtYV9kYWMubmV4dE91dCA9CisJCQkJcy0+ZG1hX2RhYy5yYXdidWY7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3luY2hyb25pemVfaXJxKCk7CisJCQlzLT5kbWFfYWRjLmNvdW50ID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9IDA7CisJCQlzLT5kbWFfYWRjLm5leHRJbiA9IHMtPmRtYV9hZGMubmV4dE91dCA9CisJCQkJcy0+ZG1hX2FkYy5yYXdidWY7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJc2V0X2FkY19yYXRlKHMsIHZhbCk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzZXRfZGFjX3JhdGUocywgdmFsKTsKKwkJCX0KKwkJCWlmIChzLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCWlmIChzLT5vcGVuX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/CisJCQkJcy0+ZG1hX2FkYy5zYW1wbGVfcmF0ZSA6CisJCQkJcy0+ZG1hX2RhYy5zYW1wbGVfcmF0ZSwKKwkJCQkoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzLT5kbWFfYWRjLm51bV9jaGFubmVscyA9IHZhbCA/IDIgOiAxOworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXMtPmRtYV9kYWMubnVtX2NoYW5uZWxzID0gdmFsID8gMiA6IDE7CisJCQlpZiAocy0+Y29kZWNfZXh0X2NhcHMgJiBBQzk3X0VYVF9EQUNTKSB7CisJCQkJLy8gZGlzYWJsZSBzdXJyb3VuZCBhbmQgY2VudGVyL2xmZSBpbiBBQyc5NworCQkJCXUxNiBleHRfc3RhdCA9IHJkY29kZWMoJnMtPmNvZGVjLAorCQkJCQkJICAgICAgIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJCQl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCQkJCWV4dF9zdGF0IHwgKEFDOTdfRVhUU1RBVF9QUkkgfAorCQkJCQkJICAgIEFDOTdfRVhUU1RBVF9QUkogfAorCQkJCQkJICAgIEFDOTdfRVhUU1RBVF9QUkspKTsKKwkJCX0KKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDIpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMubnVtX2NoYW5uZWxzID0gdmFsOworCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN3aXRjaCAodmFsKSB7CisJCQkJY2FzZSAxOgorCQkJCWNhc2UgMjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOgorCQkJCWNhc2UgNToKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJY2FzZSA0OgorCQkJCQlpZiAoIShzLT5jb2RlY19leHRfY2FwcyAmCisJCQkJCSAgICAgIEFDOTdfRVhUSURfU0RBQykpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA2OgorCQkJCQlpZiAoKHMtPmNvZGVjX2V4dF9jYXBzICYKKwkJCQkJICAgICBBQzk3X0VYVF9EQUNTKSAhPSBBQzk3X0VYVF9EQUNTKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCXN0b3BfZGFjKHMpOworCQkJCWlmICh2YWwgPD0gMiAmJgorCQkJCSAgICAocy0+Y29kZWNfZXh0X2NhcHMgJiBBQzk3X0VYVF9EQUNTKSkgeworCQkJCQkvLyBkaXNhYmxlIHN1cnJvdW5kIGFuZCBjZW50ZXIvbGZlCisJCQkJCS8vIGNoYW5uZWxzIGluIEFDJzk3CisJCQkJCXUxNiAgICAgICAgICAgICBleHRfc3RhdCA9CisJCQkJCQlyZGNvZGVjKCZzLT5jb2RlYywKKwkJCQkJCQlBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJCQkJCXdyY29kZWMoJnMtPmNvZGVjLAorCQkJCQkJQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCQkJCQlleHRfc3RhdCB8IChBQzk3X0VYVFNUQVRfUFJJIHwKKwkJCQkJCQkgICAgQUM5N19FWFRTVEFUX1BSSiB8CisJCQkJCQkJICAgIEFDOTdfRVhUU1RBVF9QUkspKTsKKwkJCQl9IGVsc2UgaWYgKHZhbCA+PSA0KSB7CisJCQkJCS8vIGVuYWJsZSBzdXJyb3VuZCwgY2VudGVyL2xmZQorCQkJCQkvLyBjaGFubmVscyBpbiBBQyc5NworCQkJCQl1MTYgICAgICAgICAgICAgZXh0X3N0YXQgPQorCQkJCQkJcmRjb2RlYygmcy0+Y29kZWMsCisJCQkJCQkJQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCQkJCQlleHRfc3RhdCAmPSB+QUM5N19FWFRTVEFUX1BSSjsKKwkJCQkJaWYgKHZhbCA9PSA2KQorCQkJCQkJZXh0X3N0YXQgJj0KKwkJCQkJCQl+KEFDOTdfRVhUU1RBVF9QUkkgfAorCQkJCQkJCSAgQUM5N19FWFRTVEFUX1BSSyk7CisJCQkJCXdyY29kZWMoJnMtPmNvZGVjLAorCQkJCQkJQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCQkJCQlleHRfc3RhdCk7CisJCQkJfQorCisJCQkJcy0+ZG1hX2RhYy5udW1fY2hhbm5lbHMgPSB2YWw7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgkvKiBSZXR1cm5zIGEgbWFzayAqLworCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEUgfCBBRk1UX1U4LCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOgkvKiBTZWxlY3RzIE9ORSBmbXQgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5kbWFfYWRjLnNhbXBsZV9zaXplID0gMTY7CisJCQkJZWxzZSB7CisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJCXMtPmRtYV9hZGMuc2FtcGxlX3NpemUgPSA4OworCQkJCX0KKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5kbWFfZGFjLnNhbXBsZV9zaXplID0gMTY7CisJCQkJZWxzZSB7CisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJCXMtPmRtYV9kYWMuc2FtcGxlX3NpemUgPSA4OworCQkJCX0KKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQl2YWwgPSAocy0+ZG1hX2FkYy5zYW1wbGVfc2l6ZSA9PSAxNikgPworCQkJCQlBRk1UX1MxNl9MRSA6IEFGTVRfVTg7CisJCQllbHNlCisJCQkJdmFsID0gKHMtPmRtYV9kYWMuc2FtcGxlX3NpemUgPT0gMTYpID8KKwkJCQkJQUZNVF9TMTZfTEUgOiBBRk1UX1U4OworCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiAhcy0+ZG1hX2FkYy5zdG9wcGVkKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiAhcy0+ZG1hX2RhYy5zdG9wcGVkKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCWVsc2UKKwkJCQlzdG9wX2FkYyhzKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkKKwkJCQlzdGFydF9kYWMocyk7CisJCQllbHNlCisJCQkJc3RvcF9kYWMocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQljb3VudCAtPSBkbWFfY291bnRfZG9uZSgmcy0+ZG1hX2RhYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJYWJpbmZvLmJ5dGVzID0gKHMtPmRtYV9kYWMuZG1hc2l6ZSAtIGNvdW50KSAvCisJCQlzLT5kbWFfZGFjLmNudF9mYWN0b3I7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYy5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworI2lmZGVmIEFVMTAwMF9WRVJCT1NFX0RFQlVHCisJCWRiZygiYnl0ZXM9JWQsIGZyYWdtZW50cz0lZCIsIGFiaW5mby5ieXRlcywgYWJpbmZvLmZyYWdtZW50cyk7CisjZW5kaWYKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhYmluZm8sCisJCQkJICAgIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQljb3VudCArPSBkbWFfY291bnRfZG9uZSgmcy0+ZG1hX2FkYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJYWJpbmZvLmJ5dGVzID0gY291bnQgLyBzLT5kbWFfYWRjLmNudF9mYWN0b3I7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmFiaW5mbywKKwkJCQkgICAgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQljb3VudCAtPSBkbWFfY291bnRfZG9uZSgmcy0+ZG1hX2RhYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJY291bnQgLz0gcy0+ZG1hX2RhYy5jbnRfZmFjdG9yOworCQlyZXR1cm4gcHV0X3VzZXIoY291bnQsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljaW5mby5ieXRlcyA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXM7CisJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJaWYgKCFzLT5kbWFfYWRjLnN0b3BwZWQpIHsKKwkJCWRpZmYgPSBkbWFfY291bnRfZG9uZSgmcy0+ZG1hX2FkYyk7CisJCQljb3VudCArPSBkaWZmOworCQkJY2luZm8uYnl0ZXMgKz0gZGlmZjsKKwkJCWNpbmZvLnB0ciA9ICB2aXJ0X3RvX3BoeXMocy0+ZG1hX2FkYy5uZXh0SW4pICsgZGlmZiAtCisJCQkJcy0+ZG1hX2FkYy5kbWFhZGRyOworCQl9IGVsc2UKKwkJCWNpbmZvLnB0ciA9IHZpcnRfdG9fcGh5cyhzLT5kbWFfYWRjLm5leHRJbikgLQorCQkJCXMtPmRtYV9hZGMuZG1hYWRkcjsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSAocy0+ZG1hX2FkYy5kbWFfZnJhZ3NpemUtMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY2luZm8sIHNpemVvZihjaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9kYWMuY291bnQ7CisJCWlmICghcy0+ZG1hX2RhYy5zdG9wcGVkKSB7CisJCQlkaWZmID0gZG1hX2NvdW50X2RvbmUoJnMtPmRtYV9kYWMpOworCQkJY291bnQgLT0gZGlmZjsKKwkJCWNpbmZvLmJ5dGVzICs9IGRpZmY7CisJCQljaW5mby5wdHIgPSB2aXJ0X3RvX3BoeXMocy0+ZG1hX2RhYy5uZXh0T3V0KSArIGRpZmYgLQorCQkJCXMtPmRtYV9kYWMuZG1hYWRkcjsKKwkJfSBlbHNlCisJCQljaW5mby5wdHIgPSB2aXJ0X3RvX3BoeXMocy0+ZG1hX2RhYy5uZXh0T3V0KSAtCisJCQkJcy0+ZG1hX2RhYy5kbWFhZGRyOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCQlzLT5kbWFfZGFjLmNvdW50ICY9IChzLT5kbWFfZGFjLmRtYV9mcmFnc2l6ZS0xKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworCQljaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgKGludCAqKSBhcmcpOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IDQ7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9IDQ7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKSB8fAorCQkgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMocyk7CisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gdmFsOworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPworCQkJCXMtPmRtYV9hZGMuc2FtcGxlX3JhdGUgOgorCQkJCXMtPmRtYV9kYWMuc2FtcGxlX3JhdGUsCisJCQkJKGludCAqKWFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLm51bV9jaGFubmVscywgKGludCAqKWFyZyk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfZGFjLm51bV9jaGFubmVscywgKGludCAqKWFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9hZGMuc2FtcGxlX3NpemUsIChpbnQgKilhcmcpOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5zYW1wbGVfc2l6ZSwgKGludCAqKWFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIG1peGRldl9pb2N0bCgmcy0+Y29kZWMsIGNtZCwgYXJnKTsKK30KKworCitzdGF0aWMgaW50ICBhdTEwMDBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgICAgICAgICAgICAgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBhdTEwMDBfc3RhdGUgKnMgPSAmYXUxMDAwX3N0YXRlOworCWludCAgICAgICAgICAgICByZXQ7CisKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJZGJnKCIlczogbm9uLWJsb2NraW5nIiwgX19GVU5DVElPTl9fKTsKKwllbHNlCisJCWRiZygiJXM6IGJsb2NraW5nIiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorCQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBmaWxlLT5mX21vZGUpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCisJc3RvcF9kYWMocyk7CisJc3RvcF9hZGMocyk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPSAwOworCQlzLT5kbWFfYWRjLm51bV9jaGFubmVscyA9IDE7CisJCXMtPmRtYV9hZGMuc2FtcGxlX3NpemUgPSA4OworCQlzZXRfYWRjX3JhdGUocywgODAwMCk7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlzLT5kbWFfYWRjLnNhbXBsZV9zaXplID0gMTY7CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9CisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9IDA7CisJCXMtPmRtYV9kYWMubnVtX2NoYW5uZWxzID0gMTsKKwkJcy0+ZG1hX2RhYy5zYW1wbGVfc2l6ZSA9IDg7CisJCXNldF9kYWNfcmF0ZShzLCA4MDAwKTsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCXMtPmRtYV9kYWMuc2FtcGxlX3NpemUgPSAxNjsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlpbml0X01VVEVYKCZzLT5zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBhdTEwMDBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzID0gKHN0cnVjdCBhdTEwMDBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlsb2NrX2tlcm5lbCgpOworCQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWRyYWluX2RhYyhzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJCWxvY2tfa2VybmVsKCk7CisJfQorCisJZG93bigmcy0+b3Blbl9zZW0pOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdG9wX2RhYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9kYWMpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdG9wX2FkYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9hZGMpOworCX0KKwlzLT5vcGVuX21vZGUgJj0gKCh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdTEwMDBfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBhdTEwMDBfbGxzZWVrLAorCS5yZWFkCQk9IGF1MTAwMF9yZWFkLAorCS53cml0ZQkJPSBhdTEwMDBfd3JpdGUsCisJLnBvbGwJCT0gYXUxMDAwX3BvbGwsCisJLmlvY3RsCQk9IGF1MTAwMF9pb2N0bCwKKwkubW1hcAkJPSBhdTEwMDBfbW1hcCwKKwkub3BlbgkJPSBhdTEwMDBfb3BlbiwKKwkucmVsZWFzZQk9IGF1MTAwMF9yZWxlYXNlLAorfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHdlJ2xsIGNyZWF0ZSBhIHByb2MgZGV2aWNlIHRoYXQgZHVtcHMgdGhlCisgKiBDT0RFQyBjaGlwc3RhdGUKKyAqLworCisjaWZkZWYgQVUxMDAwX0RFQlVHCitzdGF0aWMgaW50IHByb2NfYXUxMDAwX2R1bXAoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsCisJCQkgICAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9ICZhdTEwMDBfc3RhdGU7CisJaW50ICAgICAgICAgICAgIGNudCwgbGVuID0gMDsKKworCS8qIHByaW50IG91dCBoZWFkZXIgKi8KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcblx0XHRBVTEwMDAgQXVkaW8gRGVidWdcblxuIik7CisKKwkvLyBwcmludCBvdXQgZGlnaXRhbCBjb250cm9sbGVyIHN0YXRlCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiQVUxMDAwIEF1ZGlvIENvbnRyb2xsZXIgcmVnaXN0ZXJzXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJBQzk3Q19DT05GSUcgPSAlMDh4XG4iLAorCQkJYXVfcmVhZGwoQUM5N0NfQ09ORklHKSk7CisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgIkFDOTdDX1NUQVRVUyA9ICUwOHhcbiIsCisJCQlhdV9yZWFkbChBQzk3Q19TVEFUVVMpKTsKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiQUM5N0NfQ05UUkwgID0gJTA4eFxuIiwKKwkJCWF1X3JlYWRsKEFDOTdDX0NOVFJMKSk7CisKKwkvKiBwcmludCBvdXQgQ09ERUMgc3RhdGUgKi8KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbkFDOTcgQ09ERUMgcmVnaXN0ZXJzXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8PSAweDdlOyBjbnQgKz0gMikKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAicmVnICUwMnggPSAlMDR4XG4iLAorCQkJICAgICAgIGNudCwgcmRjb2RlYygmcy0+Y29kZWMsIGNudCkpOworCisJaWYgKGZwb3MgPj0gbGVuKSB7CisJCSpzdGFydCA9IGJ1ZjsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKwkqc3RhcnQgPSBidWYgKyBmcG9zOworCWlmICgobGVuIC09IGZwb3MpID4gbGVuZ3RoKQorCQlyZXR1cm4gbGVuZ3RoOworCSplb2YgPSAxOworCXJldHVybiBsZW47CisKK30KKyNlbmRpZiAvKiBBVTEwMDBfREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK01PRFVMRV9BVVRIT1IoIk1vbnRhIFZpc3RhIFNvZnR3YXJlLCBzdGV2ZWxAbXZpc3RhLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTEwMDAgQXVkaW8gRHJpdmVyIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdTEwMDBfcHJvYmUodm9pZCkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzID0gJmF1MTAwMF9zdGF0ZTsKKwlpbnQgICAgICAgICAgICAgdmFsOworI2lmZGVmIEFVMTAwMF9ERUJVRworCWNoYXIgICAgICAgICAgICBwcm9jX3N0cls4MF07CisjZW5kaWYKKworCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IGF1MTAwMF9zdGF0ZSkpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5jb2RlYy5wcml2YXRlX2RhdGEgPSBzOworCXMtPmNvZGVjLmlkID0gMDsKKwlzLT5jb2RlYy5jb2RlY19yZWFkID0gcmRjb2RlYzsKKwlzLT5jb2RlYy5jb2RlY193cml0ZSA9IHdyY29kZWM7CisJcy0+Y29kZWMuY29kZWNfd2FpdCA9IHdhaXRjb2RlYzsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKENQSFlTQUREUihBQzk3Q19DT05GSUcpLAorCQkJICAgIDB4MTQsIEFVMTAwMF9NT0RVTEVfTkFNRSkpIHsKKwkJZXJyKCJBQyc5NyBwb3J0cyBpbiB1c2UiKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvLyBBbGxvY2F0ZSB0aGUgRE1BIENoYW5uZWxzCisJaWYgKChzLT5kbWFfZGFjLmRtYW5yID0gcmVxdWVzdF9hdTEwMDBfZG1hKERNQV9JRF9BQzk3Q19UWCwKKwkJCQkJCSAgICJhdWRpbyBEQUMiLAorCQkJCQkJICAgZGFjX2RtYV9pbnRlcnJ1cHQsCisJCQkJCQkgICBTQV9JTlRFUlJVUFQsIHMpKSA8IDApIHsKKwkJZXJyKCJDYW4ndCBnZXQgREFDIERNQSIpOworCQlnb3RvIGVycl9kbWExOworCX0KKwlpZiAoKHMtPmRtYV9hZGMuZG1hbnIgPSByZXF1ZXN0X2F1MTAwMF9kbWEoRE1BX0lEX0FDOTdDX1JYLAorCQkJCQkJICAgImF1ZGlvIEFEQyIsCisJCQkJCQkgICBhZGNfZG1hX2ludGVycnVwdCwKKwkJCQkJCSAgIFNBX0lOVEVSUlVQVCwgcykpIDwgMCkgeworCQllcnIoIkNhbid0IGdldCBBREMgRE1BIik7CisJCWdvdG8gZXJyX2RtYTI7CisJfQorCisJaW5mbygiREFDOiBETUElZC9JUlElZCwgQURDOiBETUElZC9JUlElZCIsCisJICAgICBzLT5kbWFfZGFjLmRtYW5yLCBnZXRfZG1hX2RvbmVfaXJxKHMtPmRtYV9kYWMuZG1hbnIpLAorCSAgICAgcy0+ZG1hX2FkYy5kbWFuciwgZ2V0X2RtYV9kb25lX2lycShzLT5kbWFfYWRjLmRtYW5yKSk7CisKKwkvLyBlbmFibGUgRE1BIGNvaGVyZW5jeSBpbiByZWFkL3dyaXRlIERNQSBjaGFubmVscworCXNldF9kbWFfbW9kZShzLT5kbWFfZGFjLmRtYW5yLAorCQkgICAgIGdldF9kbWFfbW9kZShzLT5kbWFfZGFjLmRtYW5yKSAmIH5ETUFfTkMpOworCXNldF9kbWFfbW9kZShzLT5kbWFfYWRjLmRtYW5yLAorCQkgICAgIGdldF9kbWFfbW9kZShzLT5kbWFfYWRjLmRtYW5yKSAmIH5ETUFfTkMpOworCisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCisJaWYgKChzLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmF1MTAwMF9hdWRpb19mb3BzLCAtMSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MTsKKwlpZiAoKHMtPmNvZGVjLmRldl9taXhlciA9CisJICAgICByZWdpc3Rlcl9zb3VuZF9taXhlcigmYXUxMDAwX21peGVyX2ZvcHMsIC0xKSkgPCAwKQorCQlnb3RvIGVycl9kZXYyOworCisjaWZkZWYgQVUxMDAwX0RFQlVHCisJLyogaW50aWFsaXplIHRoZSBkZWJ1ZyBwcm9jIGRldmljZSAqLworCXMtPnBzID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShBVTEwMDBfTU9EVUxFX05BTUUsIDAsIE5VTEwsCisJCQkJICAgICAgIHByb2NfYXUxMDAwX2R1bXAsIE5VTEwpOworI2VuZGlmIC8qIEFVMTAwMF9ERUJVRyAqLworCisJLy8gY29uZmlndXJlIHBpbnMgZm9yIEFDJzk3CisJYXVfd3JpdGVsKGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmIH4weDAyLCBTWVNfUElORlVOQyk7CisKKwkvLyBBc3NlcnQgcmVzZXQgZm9yIDEwbXNlYyB0byB0aGUgQUMnOTcgY29udHJvbGxlciwgYW5kIGVuYWJsZSBjbG9jaworCWF1X3dyaXRlbChBQzk3Q19SUyB8IEFDOTdDX0NFLCBBQzk3Q19DTlRSTCk7CisJYXUxMDAwX2RlbGF5KDEwKTsKKwlhdV93cml0ZWwoQUM5N0NfQ0UsIEFDOTdDX0NOVFJMKTsKKwlhdTEwMDBfZGVsYXkoMTApOwkvLyB3YWl0IGZvciBjbG9jayB0byBzdGFiaWxpemUKKworCS8qIGNvbGQgcmVzZXQgdGhlIEFDJzk3ICovCisJYXVfd3JpdGVsKEFDOTdDX1JFU0VULCBBQzk3Q19DT05GSUcpOworCWF1MTAwMF9kZWxheSgxMCk7CisJYXVfd3JpdGVsKDAsIEFDOTdDX0NPTkZJRyk7CisJLyogbmVlZCB0byBkZWxheSBhcm91bmQgNTAwbXNlYyhibGVlY2gpIHRvIGdpdmUKKwkgICBzb21lIENPREVDcyBlbm91Z2ggdGltZSB0byB3YWtldXAgKi8KKwlhdTEwMDBfZGVsYXkoNTAwKTsKKworCS8qIHdhcm0gcmVzZXQgdGhlIEFDJzk3IHRvIHN0YXJ0IHRoZSBiaXRjbGsgKi8KKwlhdV93cml0ZWwoQUM5N0NfU0cgfCBBQzk3Q19TWU5DLCBBQzk3Q19DT05GSUcpOworCXVkZWxheSgxMDApOworCWF1X3dyaXRlbCgwLCBBQzk3Q19DT05GSUcpOworCisJLyogY29kZWMgaW5pdCAqLworCWlmICghYWM5N19wcm9iZV9jb2RlYygmcy0+Y29kZWMpKQorCQlnb3RvIGVycl9kZXYzOworCisJcy0+Y29kZWNfYmFzZV9jYXBzID0gcmRjb2RlYygmcy0+Y29kZWMsIEFDOTdfUkVTRVQpOworCXMtPmNvZGVjX2V4dF9jYXBzID0gcmRjb2RlYygmcy0+Y29kZWMsIEFDOTdfRVhURU5ERURfSUQpOworCWluZm8oIkFDJzk3IEJhc2UvRXh0ZW5kZWQgSUQgPSAlMDR4LyUwNHgiLAorCSAgICAgcy0+Y29kZWNfYmFzZV9jYXBzLCBzLT5jb2RlY19leHRfY2Fwcyk7CisKKwkvKgorCSAqIE9uIHRoZSBQYjEwMDAsIGF1ZGlvIHBsYXliYWNrIGlzIG9uIHRoZSBBVVhfT1VUCisJICogY2hhbm5lbCAod2hpY2ggZGVmYXVsdHMgdG8gTE5MVkxfT1VUIGluIEFDJzk3CisJICogcmV2IDIuMikgc28gbWFrZSBzdXJlIHRoaXMgY2hhbm5lbCBpcyBsaXN0ZWQKKwkgKiBhcyBzdXBwb3J0ZWQgKHNvdW5kY2FyZC5oIGNhbGxzIHRoaXMgY2hhbm5lbAorCSAqIEFMVFBDTSkuIGFjOTdfY29kZWMuYyBkb2VzIG5vdCBoYW5kbGUgZGV0ZWN0aW9uCisJICogb2YgdGhpcyBjaGFubmVsIGNvcnJlY3RseS4KKwkgKi8KKwlzLT5jb2RlYy5zdXBwb3J0ZWRfbWl4ZXJzIHw9IFNPVU5EX01BU0tfQUxUUENNOworCS8qCisJICogTm93IHNldCBBVVhfT1VUJ3MgZGVmYXVsdCB2b2x1bWUuCisJICovCisJdmFsID0gMHg0MzQzOworCW1peGRldl9pb2N0bCgmcy0+Y29kZWMsIFNPVU5EX01JWEVSX1dSSVRFX0FMVFBDTSwKKwkJICAgICAodW5zaWduZWQgbG9uZykgJnZhbCk7CisJCisJaWYgKCEocy0+Y29kZWNfZXh0X2NhcHMgJiBBQzk3X0VYVElEX1ZSQSkpIHsKKwkJLy8gY29kZWMgZG9lcyBub3Qgc3VwcG9ydCBWUkEKKwkJcy0+bm9fdnJhID0gMTsKKwl9IGVsc2UgaWYgKCF2cmEpIHsKKwkJLy8gQm9vdCBvcHRpb24gc2F5cyBkaXNhYmxlIFZSQQorCQl1MTYgYWM5N19leHRzdGF0ID0gcmRjb2RlYygmcy0+Y29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLAorCQkJYWM5N19leHRzdGF0ICYgfkFDOTdfRVhUU1RBVF9WUkEpOworCQlzLT5ub192cmEgPSAxOworCX0KKwlpZiAocy0+bm9fdnJhKQorCQlpbmZvKCJubyBWUkEsIGludGVycG9sYXRpbmcgYW5kIGRlY2ltYXRpbmciKTsKKworCS8qIHNldCBtaWMgdG8gYmUgdGhlIHJlY29yZGluZyBzb3VyY2UgKi8KKwl2YWwgPSBTT1VORF9NQVNLX01JQzsKKwltaXhkZXZfaW9jdGwoJnMtPmNvZGVjLCBTT1VORF9NSVhFUl9XUklURV9SRUNTUkMsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpICZ2YWwpOworCisjaWZkZWYgQVUxMDAwX0RFQlVHCisJc3ByaW50Zihwcm9jX3N0ciwgImRyaXZlci8lcy8lZC9hYzk3IiwgQVUxMDAwX01PRFVMRV9OQU1FLAorCQlzLT5jb2RlYy5pZCk7CisJcy0+YWM5N19wcyA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKHByb2Nfc3RyLCAwLCBOVUxMLAorCQkJCQkgICAgIGFjOTdfcmVhZF9wcm9jLCAmcy0+Y29kZWMpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19YWFMxNTAwCisJLyogZGVhc3NlcnQgZWFwZCAqLworCXdyY29kZWMoJnMtPmNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsCisJCQlyZGNvZGVjKCZzLT5jb2RlYywgQUM5N19QT1dFUl9DT05UUk9MKSAmIH4weDgwMDApOworCS8qIG11dGUgYSBudW1iZXIgb2Ygc2lnbmFscyB3aGljaCBzZWVtIHRvIGJlIGNhdXNpbmcgcHJvYmxlbXMKKwkgKiBpZiBub3QgbXV0ZWQuCisJICovCisJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfUENCRUVQX1ZPTCwgMHg4MDAwKTsKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19QSE9ORV9WT0wsIDB4ODAwOCk7CisJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfTUlDX1ZPTCwgMHg4MDA4KTsKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19MSU5FSU5fVk9MLCAweDg4MDgpOworCXdyY29kZWMoJnMtPmNvZGVjLCBBQzk3X0NEX1ZPTCwgMHg4ODA4KTsKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19WSURFT19WT0wsIDB4ODgwOCk7CisJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfQVVYX1ZPTCwgMHg4ODA4KTsKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01PVVRfVk9MLCAweDA4MDgpOworCXdyY29kZWMoJnMtPmNvZGVjLCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMHgyMDAwKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7CisKKyBlcnJfZGV2MzoKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLmRldl9taXhlcik7CisgZXJyX2RldjI6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKyBlcnJfZGV2MToKKwlmcmVlX2F1MTAwMF9kbWEocy0+ZG1hX2FkYy5kbWFucik7CisgZXJyX2RtYTI6CisJZnJlZV9hdTEwMDBfZG1hKHMtPmRtYV9kYWMuZG1hbnIpOworIGVycl9kbWExOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihDUEhZU0FERFIoQUM5N0NfQ09ORklHKSwgMHgxNCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBhdTEwMDBfcmVtb3ZlKHZvaWQpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9ICZhdTEwMDBfc3RhdGU7CisKKwlpZiAoIXMpCisJCXJldHVybjsKKyNpZmRlZiBBVTEwMDBfREVCVUcKKwlpZiAocy0+cHMpCisJCXJlbW92ZV9wcm9jX2VudHJ5KEFVMTAwMF9NT0RVTEVfTkFNRSwgTlVMTCk7CisjZW5kaWYgLyogQVUxMDAwX0RFQlVHICovCisJc3luY2hyb25pemVfaXJxKCk7CisJZnJlZV9hdTEwMDBfZG1hKHMtPmRtYV9hZGMuZG1hbnIpOworCWZyZWVfYXUxMDAwX2RtYShzLT5kbWFfZGFjLmRtYW5yKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oQ1BIWVNBRERSKEFDOTdDX0NPTkZJRyksIDB4MTQpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5jb2RlYy5kZXZfbWl4ZXIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2F1MTAwMCh2b2lkKQoreworCWluZm8oInN0ZXZlbEBtdmlzdGEuY29tLCBidWlsdCAiIF9fVElNRV9fICIgb24gIiBfX0RBVEVfXyk7CisJcmV0dXJuIGF1MTAwMF9wcm9iZSgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9hdTEwMDAodm9pZCkKK3sKKwlpbmZvKCJ1bmxvYWRpbmciKTsKKwlhdTEwMDBfcmVtb3ZlKCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYXUxMDAwKTsKK21vZHVsZV9leGl0KGNsZWFudXBfYXUxMDAwKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTU9EVUxFCisKK3N0YXRpYyBpbnQgX19pbml0IGF1MTAwMF9zZXR1cChjaGFyICpvcHRpb25zKQoreworCWNoYXIgICAgICAgICAgICp0aGlzX29wdDsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkpIHsKKwkJaWYgKCEqdGhpc19vcHQpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidnJhIiwgMykpIHsKKwkJCXZyYSA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYXUxMDAwX2F1ZGlvPSIsIGF1MTAwMF9zZXR1cCk7CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hdTE1NTBfYWM5Ny5jIGIvc291bmQvb3NzL2F1MTU1MF9hYzk3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4ZTQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hdTE1NTBfYWM5Ny5jCkBAIC0wLDAgKzEsMjExOSBAQAorLyoKKyAqIGF1MTU1MF9hYzk3LmMgIC0tICBTb3VuZCBkcml2ZXIgZm9yIEFsY2hlbXkgQXUxNTUwIE1JUFMgSW50ZXJuZXQgRWRnZQorICogICAgICAgICAgICAgICAgICAgIFByb2Nlc3Nvci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBFbWJlZGRlZCBFZGdlLCBMTEMKKyAqCWRhbkBlbWJlZGRlZGVkZ2UuY29tCisgKgorICogTW9zdGx5IGNvcGllZCBmcm9tIHRoZSBhdTEwMDAuYyBkcml2ZXIgYW5kIHNvbWUgZnJvbSB0aGUKKyAqIFBvd2VyTWFjIGRiZG1hIGRyaXZlci4KKyAqIFdlIGFzc3VtZSB0aGUgcHJvY2Vzc29yIGNhbiBkbyBtZW1vcnkgY29oZXJlbnQgRE1BLgorICoKKyAqIFBvcnRlZCB0byAyLjYgYnkgTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaD4KKworI3VuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCisvKiBtaXNjIHN0dWZmICovCisjZGVmaW5lIFBPTExfQ09VTlQgICAweDUwMDAwCisjZGVmaW5lIEFDOTdfRVhUX0RBQ1MgKEFDOTdfRVhUSURfU0RBQyB8IEFDOTdfRVhUSURfQ0RBQyB8IEFDOTdfRVhUSURfTERBQykKKworLyogVGhlIG51bWJlciBvZiBEQkRNQSByaW5nIGRlc2NyaXB0b3JzIHRvIGFsbG9jYXRlLiAgTm8gc2Vuc2UgbWFraW5nCisgKiB0aGlzIHRvbyBsYXJnZS4uLi5pZiB5b3UgY2FuJ3Qga2VlcCB1cCB3aXRoIGEgZmV3IHlvdSBhcmVuJ3QgbGlrZWx5CisgKiB0byBiZSBhYmxlIHRvIHdpdGggbG90cyBvZiB0aGVtLCBlaXRoZXIuCisgKi8KKyNkZWZpbmUgTlVNX0RCRE1BX0RFU0NSSVBUT1JTIDQKKworI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKworLyogQm9vdCBvcHRpb25zCisgKiAwID0gbm8gVlJBLCAxID0gdXNlIFZSQSBpZiBjb2RlYyBzdXBwb3J0cyBpdAorICovCitzdGF0aWMgaW50ICAgICAgdnJhID0gMTsKK01PRFVMRV9QQVJNKHZyYSwgImkiKTsKK01PRFVMRV9QQVJNX0RFU0ModnJhLCAiaWYgMSB1c2UgVlJBIGlmIGNvZGVjIHN1cHBvcnRzIGl0Iik7CisKK3N0YXRpYyBzdHJ1Y3QgYXUxNTUwX3N0YXRlIHsKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgICAgICAgICAgICAgZGV2X2F1ZGlvOworCisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCXVuc2lnbmVkICAgICAgICBjb2RlY19iYXNlX2NhcHM7IC8qIEFDJzk3IHJlZyAwMGgsICJSZXNldCBSZWdpc3RlciIgKi8KKwl1bnNpZ25lZCAgICAgICAgY29kZWNfZXh0X2NhcHM7ICAvKiBBQyc5NyByZWcgMjhoLCAiRXh0ZW5kZWQgQXVkaW8gSUQiICovCisJaW50ICAgICAgICAgICAgIG5vX3ZyYTsJCS8qIGRvIG5vdCB1c2UgVlJBICovCisKKwlzcGlubG9ja190ICAgICAgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCW1vZGVfdCAgICAgICAgICBvcGVuX21vZGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCisJc3RydWN0IGRtYWJ1ZiB7CisJCXUzMgkJZG1hbnI7CisJCXVuc2lnbmVkICAgICAgICBzYW1wbGVfcmF0ZTsKKwkJdW5zaWduZWQJc3JjX2ZhY3RvcjsKKwkJdW5zaWduZWQgICAgICAgIHNhbXBsZV9zaXplOworCQlpbnQgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOworCQlpbnQJCWRtYV9ieXRlc19wZXJfc2FtcGxlOworCQlpbnQJCXVzZXJfYnl0ZXNfcGVyX3NhbXBsZTsKKwkJaW50CQljbnRfZmFjdG9yOworCisJCXZvaWQJCSpyYXdidWY7CisJCXVuc2lnbmVkICAgICAgICBidWZvcmRlcjsKKwkJdW5zaWduZWQJbnVtZnJhZzsKKwkJdW5zaWduZWQgICAgICAgIGZyYWdzaGlmdDsKKwkJdm9pZAkJKm5leHRJbjsKKwkJdm9pZAkJKm5leHRPdXQ7CisJCWludAkJY291bnQ7CisJCXVuc2lnbmVkICAgICAgICB0b3RhbF9ieXRlczsKKwkJdW5zaWduZWQgICAgICAgIGVycm9yOworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCisJCS8qIHJlZHVuZGFudCwgYnV0IG1ha2VzIGNhbGN1bGF0aW9ucyBlYXNpZXIgKi8KKwkJdW5zaWduZWQJZnJhZ3NpemU7CisJCXVuc2lnbmVkCWRtYV9mcmFnc2l6ZTsKKwkJdW5zaWduZWQJZG1hc2l6ZTsKKwkJdW5zaWduZWQJZG1hX3Fjb3VudDsKKworCQkvKiBPU1Mgc3R1ZmYgKi8KKwkJdW5zaWduZWQgICAgICAgIG1hcHBlZDoxOworCQl1bnNpZ25lZCAgICAgICAgcmVhZHk6MTsKKwkJdW5zaWduZWQgICAgICAgIHN0b3BwZWQ6MTsKKwkJdW5zaWduZWQgICAgICAgIG9zc2ZyYWdzaGlmdDsKKwkJaW50ICAgICAgICAgICAgIG9zc21heGZyYWdzOworCQl1bnNpZ25lZCAgICAgICAgc3ViZGl2aXNpb247CisJfSBkbWFfZGFjLCBkbWFfYWRjOworfSBhdTE1NTBfc3RhdGU7CisKK3N0YXRpYyB1bnNpZ25lZAorbGQyKHVuc2lnbmVkIGludCB4KQoreworCXVuc2lnbmVkICAgICAgICByID0gMDsKKworCWlmICh4ID49IDB4MTAwMDApIHsKKwkJeCA+Pj0gMTY7CisJCXIgKz0gMTY7CisJfQorCWlmICh4ID49IDB4MTAwKSB7CisJCXggPj49IDg7CisJCXIgKz0gODsKKwl9CisJaWYgKHggPj0gMHgxMCkgeworCQl4ID4+PSA0OworCQlyICs9IDQ7CisJfQorCWlmICh4ID49IDQpIHsKKwkJeCA+Pj0gMjsKKwkJciArPSAyOworCX0KKwlpZiAoeCA+PSAyKQorCQlyKys7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkCithdTE1NTBfZGVsYXkoaW50IG1zZWMpCit7CisJdW5zaWduZWQgbG9uZyAgIHRtbzsKKwlzaWduZWQgbG9uZyAgICAgdG1vMjsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJcmV0dXJuOworCisJdG1vID0gamlmZmllcyArIChtc2VjICogSFopIC8gMTAwMDsKKwlmb3IgKDs7KSB7CisJCXRtbzIgPSB0bW8gLSBqaWZmaWVzOworCQlpZiAodG1vMiA8PSAwKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlX3RpbWVvdXQodG1vMik7CisJfQorfQorCitzdGF0aWMgdTE2CityZGNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggYWRkcikKK3sKKwlzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzID0gKHN0cnVjdCBhdTE1NTBfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1MzIgICAgICAgICAgICAgY21kLCB2YWw7CisJdTE2ICAgICAgICAgICAgIGRhdGE7CisJaW50ICAgICAgICAgICAgIGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykgeworCQl2YWwgPSBhdV9yZWFkbChQU0NfQUM5N1NUQVQpOworCQlhdV9zeW5jKCk7CisJCWlmICghKHZhbCAmIFBTQ19BQzk3U1RBVF9DUCkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJyZGNvZGVjOiBjb2RlYyBjbWQgcGVuZGluZyBleHBpcmVkISIpOworCisJY21kID0gKHUzMilQU0NfQUM5N0NEQ19JTkRYKGFkZHIpOworCWNtZCB8PSBQU0NfQUM5N0NEQ19SRDsJLyogcmVhZCBjb21tYW5kICovCisJYXVfd3JpdGVsKGNtZCwgUFNDX0FDOTdDREMpOworCWF1X3N5bmMoKTsKKworCS8qIG5vdyB3YWl0IGZvciB0aGUgZGF0YQorCSovCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykgeworCQl2YWwgPSBhdV9yZWFkbChQU0NfQUM5N1NUQVQpOworCQlhdV9zeW5jKCk7CisJCWlmICghKHZhbCAmIFBTQ19BQzk3U1RBVF9DUCkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkgeworCQllcnIoInJkY29kZWM6IHJlYWQgcG9sbCBleHBpcmVkISIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB3YWl0IGZvciBjb21tYW5kIGRvbmU/CisJKi8KKwlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKSB7CisJCXZhbCA9IGF1X3JlYWRsKFBTQ19BQzk3RVZOVCk7CisJCWF1X3N5bmMoKTsKKwkJaWYgKHZhbCAmIFBTQ19BQzk3RVZOVF9DRCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBQT0xMX0NPVU5UKSB7CisJCWVycigicmRjb2RlYzogcmVhZCBjbWR3YWl0IGV4cGlyZWQhIik7CisJCXJldHVybiAwOworCX0KKworCWRhdGEgPSBhdV9yZWFkbChQU0NfQUM5N0NEQykgJiAweGZmZmY7CisJYXVfc3luYygpOworCisJLyogQ2xlYXIgY29tbWFuZCBkb25lIGV2ZW50LgorCSovCisJYXVfd3JpdGVsKFBTQ19BQzk3RVZOVF9DRCwgUFNDX0FDOTdFVk5UKTsKKwlhdV9zeW5jKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworCitzdGF0aWMgdm9pZAord3Jjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IGFkZHIsIHUxNiBkYXRhKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXUzMiAgICAgICAgICAgICBjbWQsIHZhbDsKKwlpbnQgICAgICAgICAgICAgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKSB7CisJCXZhbCA9IGF1X3JlYWRsKFBTQ19BQzk3U1RBVCk7CisJCWF1X3N5bmMoKTsKKwkJaWYgKCEodmFsICYgUFNDX0FDOTdTVEFUX0NQKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBQT0xMX0NPVU5UKQorCQllcnIoIndyY29kZWM6IGNvZGVjIGNtZCBwZW5kaW5nIGV4cGlyZWQhIik7CisKKwljbWQgPSAodTMyKVBTQ19BQzk3Q0RDX0lORFgoYWRkcik7CisJY21kIHw9ICh1MzIpZGF0YTsKKwlhdV93cml0ZWwoY21kLCBQU0NfQUM5N0NEQyk7CisJYXVfc3luYygpOworCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykgeworCQl2YWwgPSBhdV9yZWFkbChQU0NfQUM5N1NUQVQpOworCQlhdV9zeW5jKCk7CisJCWlmICghKHZhbCAmIFBTQ19BQzk3U1RBVF9DUCkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJ3cmNvZGVjOiBjb2RlYyBjbWQgcGVuZGluZyBleHBpcmVkISIpOworCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykgeworCQl2YWwgPSBhdV9yZWFkbChQU0NfQUM5N0VWTlQpOworCQlhdV9zeW5jKCk7CisJCWlmICh2YWwgJiBQU0NfQUM5N0VWTlRfQ0QpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJ3cmNvZGVjOiByZWFkIGNtZHdhaXQgZXhwaXJlZCEiKTsKKworCS8qIENsZWFyIGNvbW1hbmQgZG9uZSBldmVudC4KKwkqLworCWF1X3dyaXRlbChQU0NfQUM5N0VWTlRfQ0QsIFBTQ19BQzk3RVZOVCk7CisJYXVfc3luYygpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAord2FpdGNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwl1MTYJdGVtcDsKKwl1MzIJdmFsOworCWludAlpOworCisJLyogY29kZWNfd2FpdCBpcyB1c2VkIHRvIHdhaXQgZm9yIGEgcmVhZHkgc3RhdGUgYWZ0ZXIKKwkgKiBhbiBBQzk3Q19SRVNFVC4KKwkgKi8KKwlhdTE1NTBfZGVsYXkoMTApOworCisJLyogZmlyc3QgcG9sbCB0aGUgQ09ERUNfUkVBRFkgdGFnIGJpdAorCSovCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykgeworCQl2YWwgPSBhdV9yZWFkbChQU0NfQUM5N1NUQVQpOworCQlhdV9zeW5jKCk7CisJCWlmICh2YWwgJiBQU0NfQUM5N1NUQVRfQ1IpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkgeworCQllcnIoIndhaXRjb2RlYzogQ09ERUNfUkVBRFkgcG9sbCBleHBpcmVkISIpOworCQlyZXR1cm47CisJfQorCisJLyogZ2V0IEFDJzk3IHBvd2VyZG93biBjb250cm9sL3N0YXR1cyByZWdpc3RlcgorCSovCisJdGVtcCA9IHJkY29kZWMoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisKKwkvKiBJZiBhbnl0aGluZyBpcyBwb3dlcmVkIGRvd24sIHBvd2VyJ2VtIHVwCisJKi8KKwlpZiAodGVtcCAmIDB4N2YwMCkgeworCQkvKiBQb3dlciBvbgorCQkqLworCQl3cmNvZGVjKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsIDApOworCQlhdTE1NTBfZGVsYXkoMTAwKTsKKworCQkvKiBSZXJlYWQKKwkJKi8KKwkJdGVtcCA9IHJkY29kZWMoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJfQorCisJLyogQ2hlY2sgaWYgQ29kZWMgUkVGLEFOTCxEQUMsQURDIHJlYWR5CisJKi8KKwlpZiAoKHRlbXAgJiAweDdmMGYpICE9IDB4MDAwZikKKwkJZXJyKCJjb2RlYyByZWcgMjYgc3RhdHVzICgweCV4KSBub3QgcmVhZHkhISIsIHRlbXApOworfQorCisvKiBzdG9wIHRoZSBBREMgYmVmb3JlIGNhbGxpbmcgKi8KK3N0YXRpYyB2b2lkCitzZXRfYWRjX3JhdGUoc3RydWN0IGF1MTU1MF9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICAqYWRjID0gJnMtPmRtYV9hZGM7CisJc3RydWN0IGRtYWJ1ZiAgKmRhYyA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkICAgICAgICBhZGNfcmF0ZSwgZGFjX3JhdGU7CisJdTE2ICAgICAgICAgICAgIGFjOTdfZXh0c3RhdDsKKworCWlmIChzLT5ub192cmEpIHsKKwkJLyogY2FsYyBTUkMgZmFjdG9yCisJCSovCisJCWFkYy0+c3JjX2ZhY3RvciA9ICgoOTYwMDAgLyByYXRlKSArIDEpID4+IDE7CisJCWFkYy0+c2FtcGxlX3JhdGUgPSA0ODAwMCAvIGFkYy0+c3JjX2ZhY3RvcjsKKwkJcmV0dXJuOworCX0KKworCWFkYy0+c3JjX2ZhY3RvciA9IDE7CisKKwlhYzk3X2V4dHN0YXQgPSByZGNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisKKwlyYXRlID0gcmF0ZSA+IDQ4MDAwID8gNDgwMDAgOiByYXRlOworCisJLyogZW5hYmxlIFZSQQorCSovCisJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCWFjOTdfZXh0c3RhdCB8IEFDOTdfRVhUU1RBVF9WUkEpOworCisJLyogbm93IHdyaXRlIHRoZSBzYW1wbGUgcmF0ZQorCSovCisJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fTFJfQURDX1JBVEUsICh1MTYpIHJhdGUpOworCisJLyogcmVhZCBpdCBiYWNrIGZvciBhY3R1YWwgc3VwcG9ydGVkIHJhdGUKKwkqLworCWFkY19yYXRlID0gcmRjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fTFJfQURDX1JBVEUpOworCisJcHJfZGVidWcoInNldF9hZGNfcmF0ZTogc2V0IHRvICVkIEh6XG4iLCBhZGNfcmF0ZSk7CisKKwkvKiBzb21lIGNvZGVjJ3MgZG9uJ3QgYWxsb3cgdW5lcXVhbCBEQUMgYW5kIEFEQyByYXRlcywgaW4gd2hpY2ggY2FzZQorCSAqIHdyaXRpbmcgb25lIHJhdGUgcmVnIGFjdHVhbGx5IGNoYW5nZXMgYm90aC4KKwkgKi8KKwlkYWNfcmF0ZSA9IHJkY29kZWMocy0+Y29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKTsKKwlpZiAoZGFjLT5udW1fY2hhbm5lbHMgPiAyKQorCQl3cmNvZGVjKHMtPmNvZGVjLCBBQzk3X1BDTV9TVVJSX0RBQ19SQVRFLCBkYWNfcmF0ZSk7CisJaWYgKGRhYy0+bnVtX2NoYW5uZWxzID4gNCkKKwkJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fTEZFX0RBQ19SQVRFLCBkYWNfcmF0ZSk7CisKKwlhZGMtPnNhbXBsZV9yYXRlID0gYWRjX3JhdGU7CisJZGFjLT5zYW1wbGVfcmF0ZSA9IGRhY19yYXRlOworfQorCisvKiBzdG9wIHRoZSBEQUMgYmVmb3JlIGNhbGxpbmcgKi8KK3N0YXRpYyB2b2lkCitzZXRfZGFjX3JhdGUoc3RydWN0IGF1MTU1MF9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICAqZGFjID0gJnMtPmRtYV9kYWM7CisJc3RydWN0IGRtYWJ1ZiAgKmFkYyA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkICAgICAgICBhZGNfcmF0ZSwgZGFjX3JhdGU7CisJdTE2ICAgICAgICAgICAgIGFjOTdfZXh0c3RhdDsKKworCWlmIChzLT5ub192cmEpIHsKKwkJLyogY2FsYyBTUkMgZmFjdG9yCisJCSovCisJCWRhYy0+c3JjX2ZhY3RvciA9ICgoOTYwMDAgLyByYXRlKSArIDEpID4+IDE7CisJCWRhYy0+c2FtcGxlX3JhdGUgPSA0ODAwMCAvIGRhYy0+c3JjX2ZhY3RvcjsKKwkJcmV0dXJuOworCX0KKworCWRhYy0+c3JjX2ZhY3RvciA9IDE7CisKKwlhYzk3X2V4dHN0YXQgPSByZGNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisKKwlyYXRlID0gcmF0ZSA+IDQ4MDAwID8gNDgwMDAgOiByYXRlOworCisJLyogZW5hYmxlIFZSQQorCSovCisJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCWFjOTdfZXh0c3RhdCB8IEFDOTdfRVhUU1RBVF9WUkEpOworCisJLyogbm93IHdyaXRlIHRoZSBzYW1wbGUgcmF0ZQorCSovCisJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsICh1MTYpIHJhdGUpOworCisJLyogSSBkb24ndCBzdXBwb3J0IGRpZmZlcmVudCBzYW1wbGUgcmF0ZXMgZm9yIG11bHRpY2hhbm5lbCwKKwkgKiBzbyBtYWtlIHRoZXNlIGNoYW5uZWxzIHRoZSBzYW1lLgorCSAqLworCWlmIChkYWMtPm51bV9jaGFubmVscyA+IDIpCisJCXdyY29kZWMocy0+Y29kZWMsIEFDOTdfUENNX1NVUlJfREFDX1JBVEUsICh1MTYpIHJhdGUpOworCWlmIChkYWMtPm51bV9jaGFubmVscyA+IDQpCisJCXdyY29kZWMocy0+Y29kZWMsIEFDOTdfUENNX0xGRV9EQUNfUkFURSwgKHUxNikgcmF0ZSk7CisJLyogcmVhZCBpdCBiYWNrIGZvciBhY3R1YWwgc3VwcG9ydGVkIHJhdGUKKwkqLworCWRhY19yYXRlID0gcmRjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpOworCisJcHJfZGVidWcoInNldF9kYWNfcmF0ZTogc2V0IHRvICVkIEh6XG4iLCBkYWNfcmF0ZSk7CisKKwkvKiBzb21lIGNvZGVjJ3MgZG9uJ3QgYWxsb3cgdW5lcXVhbCBEQUMgYW5kIEFEQyByYXRlcywgaW4gd2hpY2ggY2FzZQorCSAqIHdyaXRpbmcgb25lIHJhdGUgcmVnIGFjdHVhbGx5IGNoYW5nZXMgYm90aC4KKwkgKi8KKwlhZGNfcmF0ZSA9IHJkY29kZWMocy0+Y29kZWMsIEFDOTdfUENNX0xSX0FEQ19SQVRFKTsKKworCWRhYy0+c2FtcGxlX3JhdGUgPSBkYWNfcmF0ZTsKKwlhZGMtPnNhbXBsZV9yYXRlID0gYWRjX3JhdGU7Cit9CisKK3N0YXRpYyB2b2lkCitzdG9wX2RhYyhzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfZGFjOworCXUzMgkJc3RhdDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlpZiAoZGItPnN0b3BwZWQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlhdV93cml0ZWwoUFNDX0FDOTdQQ1JfVFAsIFBTQ19BQzk3UENSKTsKKwlhdV9zeW5jKCk7CisKKwkvKiBXYWl0IGZvciBUcmFuc21pdCBCdXN5IHRvIHNob3cgZGlzYWJsZWQuCisJKi8KKwlkbyB7CisJCXN0YXQgPSByZWFkbCgodm9pZCAqKVBTQ19BQzk3U1RBVCk7CisJCWF1X3N5bmMoKTsKKwl9IHdoaWxlICgoc3RhdCAmIFBTQ19BQzk3U1RBVF9UQikgIT0gMCk7CisKKwlhdTF4eHhfZGJkbWFfcmVzZXQoZGItPmRtYW5yKTsKKworCWRiLT5zdG9wcGVkID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK3N0b3BfYWRjKHN0cnVjdCBhdTE1NTBfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiAgKmRiID0gJnMtPmRtYV9hZGM7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXUzMgkJc3RhdDsKKworCWlmIChkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWF1X3dyaXRlbChQU0NfQUM5N1BDUl9SUCwgUFNDX0FDOTdQQ1IpOworCWF1X3N5bmMoKTsKKworCS8qIFdhaXQgZm9yIFJlY2VpdmUgQnVzeSB0byBzaG93IGRpc2FibGVkLgorCSovCisJZG8geworCQlzdGF0ID0gcmVhZGwoKHZvaWQgKilQU0NfQUM5N1NUQVQpOworCQlhdV9zeW5jKCk7CisJfSB3aGlsZSAoKHN0YXQgJiBQU0NfQUM5N1NUQVRfUkIpICE9IDApOworCisJYXUxeHh4X2RiZG1hX3Jlc2V0KGRiLT5kbWFucik7CisKKwlkYi0+c3RvcHBlZCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQKK3NldF94bWl0X3Nsb3RzKGludCBudW1fY2hhbm5lbHMpCit7CisJdTMyCWFjOTdfY29uZmlnLCBzdGF0OworCisJYWM5N19jb25maWcgPSBhdV9yZWFkbChQU0NfQUM5N0NGRyk7CisJYXVfc3luYygpOworCWFjOTdfY29uZmlnICY9IH4oUFNDX0FDOTdDRkdfVFhTTE9UX01BU0sgfCBQU0NfQUM5N0NGR19ERV9FTkFCTEUpOworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgUFNDX0FDOTdDRkcpOworCWF1X3N5bmMoKTsKKworCXN3aXRjaCAobnVtX2NoYW5uZWxzKSB7CisJY2FzZSA2OgkJLyogc3RlcmVvIHdpdGggc3Vycm91bmQgYW5kIGNlbnRlci9MRkUsCisJCQkgKiBzbG90cyAzLDQsNiw3LDgsOQorCQkJICovCisJCWFjOTdfY29uZmlnIHw9IFBTQ19BQzk3Q0ZHX1RYU0xPVF9FTkEoNik7CisJCWFjOTdfY29uZmlnIHw9IFBTQ19BQzk3Q0ZHX1RYU0xPVF9FTkEoOSk7CisKKwljYXNlIDQ6CQkvKiBzdGVyZW8gd2l0aCBzdXJyb3VuZCwgc2xvdHMgMyw0LDcsOCAqLworCQlhYzk3X2NvbmZpZyB8PSBQU0NfQUM5N0NGR19UWFNMT1RfRU5BKDcpOworCQlhYzk3X2NvbmZpZyB8PSBQU0NfQUM5N0NGR19UWFNMT1RfRU5BKDgpOworCisJY2FzZSAyOgkJLyogc3RlcmVvLCBzbG90cyAzLDQgKi8KKwljYXNlIDE6CQkvKiBtb25vICovCisJCWFjOTdfY29uZmlnIHw9IFBTQ19BQzk3Q0ZHX1RYU0xPVF9FTkEoMyk7CisJCWFjOTdfY29uZmlnIHw9IFBTQ19BQzk3Q0ZHX1RYU0xPVF9FTkEoNCk7CisJfQorCisJYXVfd3JpdGVsKGFjOTdfY29uZmlnLCBQU0NfQUM5N0NGRyk7CisJYXVfc3luYygpOworCisJYWM5N19jb25maWcgfD0gUFNDX0FDOTdDRkdfREVfRU5BQkxFOworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgUFNDX0FDOTdDRkcpOworCWF1X3N5bmMoKTsKKworCS8qIFdhaXQgZm9yIERldmljZSByZWFkeS4KKwkqLworCWRvIHsKKwkJc3RhdCA9IHJlYWRsKCh2b2lkICopUFNDX0FDOTdTVEFUKTsKKwkJYXVfc3luYygpOworCX0gd2hpbGUgKChzdGF0ICYgUFNDX0FDOTdTVEFUX0RSKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQKK3NldF9yZWN2X3Nsb3RzKGludCBudW1fY2hhbm5lbHMpCit7CisJdTMyCWFjOTdfY29uZmlnLCBzdGF0OworCisJYWM5N19jb25maWcgPSBhdV9yZWFkbChQU0NfQUM5N0NGRyk7CisJYXVfc3luYygpOworCWFjOTdfY29uZmlnICY9IH4oUFNDX0FDOTdDRkdfUlhTTE9UX01BU0sgfCBQU0NfQUM5N0NGR19ERV9FTkFCTEUpOworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgUFNDX0FDOTdDRkcpOworCWF1X3N5bmMoKTsKKworCS8qIEFsd2F5cyBlbmFibGUgc2xvdHMgMyBhbmQgNCAoc3RlcmVvKS4gU2xvdCA2IGlzCisJICogb3B0aW9uYWwgTWljIEFEQywgd2hpY2ggd2UgZG9uJ3Qgc3VwcG9ydCB5ZXQuCisJICovCisJYWM5N19jb25maWcgfD0gUFNDX0FDOTdDRkdfUlhTTE9UX0VOQSgzKTsKKwlhYzk3X2NvbmZpZyB8PSBQU0NfQUM5N0NGR19SWFNMT1RfRU5BKDQpOworCisJYXVfd3JpdGVsKGFjOTdfY29uZmlnLCBQU0NfQUM5N0NGRyk7CisJYXVfc3luYygpOworCisJYWM5N19jb25maWcgfD0gUFNDX0FDOTdDRkdfREVfRU5BQkxFOworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgUFNDX0FDOTdDRkcpOworCWF1X3N5bmMoKTsKKworCS8qIFdhaXQgZm9yIERldmljZSByZWFkeS4KKwkqLworCWRvIHsKKwkJc3RhdCA9IHJlYWRsKCh2b2lkICopUFNDX0FDOTdTVEFUKTsKKwkJYXVfc3luYygpOworCX0gd2hpbGUgKChzdGF0ICYgUFNDX0FDOTdTVEFUX0RSKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQKK3N0YXJ0X2RhYyhzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCWlmICghZGItPnN0b3BwZWQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlzZXRfeG1pdF9zbG90cyhkYi0+bnVtX2NoYW5uZWxzKTsKKwlhdV93cml0ZWwoUFNDX0FDOTdQQ1JfVEMsIFBTQ19BQzk3UENSKTsKKwlhdV9zeW5jKCk7CisJYXVfd3JpdGVsKFBTQ19BQzk3UENSX1RTLCBQU0NfQUM5N1BDUik7CisJYXVfc3luYygpOworCisJYXUxeHh4X2RiZG1hX3N0YXJ0KGRiLT5kbWFucik7CisKKwlkYi0+c3RvcHBlZCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitzdGFydF9hZGMoc3RydWN0IGF1MTU1MF9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1hYnVmICAqZGIgPSAmcy0+ZG1hX2FkYzsKKwlpbnQJaTsKKworCWlmICghZGItPnN0b3BwZWQpCisJCXJldHVybjsKKworCS8qIFB1dCB0d28gYnVmZmVycyBvbiB0aGUgcmluZyB0byBnZXQgdGhpbmdzIHN0YXJ0ZWQuCisJKi8KKwlmb3IgKGk9MDsgaTwyOyBpKyspIHsKKwkJYXUxeHh4X2RiZG1hX3B1dF9kZXN0KGRiLT5kbWFuciwgZGItPm5leHRJbiwgZGItPmRtYV9mcmFnc2l6ZSk7CisKKwkJZGItPm5leHRJbiArPSBkYi0+ZG1hX2ZyYWdzaXplOworCQlpZiAoZGItPm5leHRJbiA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQlkYi0+bmV4dEluIC09IGRiLT5kbWFzaXplOworCX0KKworCXNldF9yZWN2X3Nsb3RzKGRiLT5udW1fY2hhbm5lbHMpOworCWF1MXh4eF9kYmRtYV9zdGFydChkYi0+ZG1hbnIpOworCWF1X3dyaXRlbChQU0NfQUM5N1BDUl9SQywgUFNDX0FDOTdQQ1IpOworCWF1X3N5bmMoKTsKKwlhdV93cml0ZWwoUFNDX0FDOTdQQ1JfUlMsIFBTQ19BQzk3UENSKTsKKwlhdV9zeW5jKCk7CisKKwlkYi0+c3RvcHBlZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2dfZG1hYnVmKHN0cnVjdCBhdTE1NTBfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXVuc2lnbmVkIHVzZXJfYnl0ZXNfcGVyX3NlYzsKKwl1bnNpZ25lZCAgICAgICAgYnVmczsKKwl1bnNpZ25lZCAgICAgICAgcmF0ZSA9IGRiLT5zYW1wbGVfcmF0ZTsKKworCWlmICghZGItPnJhd2J1ZikgeworCQlkYi0+cmVhZHkgPSBkYi0+bWFwcGVkID0gMDsKKwkJZGItPmJ1Zm9yZGVyID0gNTsJLyogMzIgKiBQQUdFX1NJWkUgKi8KKwkJZGItPnJhd2J1ZiA9IGttYWxsb2MoKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkYi0+cmF3YnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGItPmNudF9mYWN0b3IgPSAxOworCWlmIChkYi0+c2FtcGxlX3NpemUgPT0gOCkKKwkJZGItPmNudF9mYWN0b3IgKj0gMjsKKwlpZiAoZGItPm51bV9jaGFubmVscyA9PSAxKQorCQlkYi0+Y250X2ZhY3RvciAqPSAyOworCWRiLT5jbnRfZmFjdG9yICo9IGRiLT5zcmNfZmFjdG9yOworCisJZGItPmNvdW50ID0gMDsKKwlkYi0+ZG1hX3Fjb3VudCA9IDA7CisJZGItPm5leHRJbiA9IGRiLT5uZXh0T3V0ID0gZGItPnJhd2J1ZjsKKworCWRiLT51c2VyX2J5dGVzX3Blcl9zYW1wbGUgPSAoZGItPnNhbXBsZV9zaXplPj4zKSAqIGRiLT5udW1fY2hhbm5lbHM7CisJZGItPmRtYV9ieXRlc19wZXJfc2FtcGxlID0gMiAqICgoZGItPm51bV9jaGFubmVscyA9PSAxKSA/CisJCQkJCTIgOiBkYi0+bnVtX2NoYW5uZWxzKTsKKworCXVzZXJfYnl0ZXNfcGVyX3NlYyA9IHJhdGUgKiBkYi0+dXNlcl9ieXRlc19wZXJfc2FtcGxlOworCWJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworCWlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IHVzZXJfYnl0ZXNfcGVyX3NlYykKKwkJCWRiLT5mcmFnc2hpZnQgPSBsZDIodXNlcl9ieXRlc19wZXJfc2VjLzEwMDApOworCQllbHNlCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gZGItPm9zc2ZyYWdzaGlmdDsKKwl9IGVsc2UgeworCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKHVzZXJfYnl0ZXNfcGVyX3NlYyAvIDEwMCAvCisJCQkJICAgIChkYi0+c3ViZGl2aXNpb24gPyBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CisJCWlmIChkYi0+ZnJhZ3NoaWZ0IDwgMykKKwkJCWRiLT5mcmFnc2hpZnQgPSAzOworCX0KKworCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKwlkYi0+ZG1hX2ZyYWdzaXplID0gZGItPmZyYWdzaXplICogZGItPmNudF9mYWN0b3I7CisJZGItPm51bWZyYWcgPSBidWZzIC8gZGItPmRtYV9mcmFnc2l6ZTsKKworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+ZnJhZ3NpemUgPSAxIDw8IGRiLT5mcmFnc2hpZnQ7CisJCWRiLT5kbWFfZnJhZ3NpemUgPSBkYi0+ZnJhZ3NpemUgKiBkYi0+Y250X2ZhY3RvcjsKKwkJZGItPm51bWZyYWcgPSBidWZzIC8gZGItPmRtYV9mcmFnc2l6ZTsKKwl9CisKKwlpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisJCWRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworCisJZGItPmRtYXNpemUgPSBkYi0+ZG1hX2ZyYWdzaXplICogZGItPm51bWZyYWc7CisJbWVtc2V0KGRiLT5yYXdidWYsIDAsIGJ1ZnMpOworCisJcHJfZGVidWcoInByb2dfZG1hYnVmOiByYXRlPSVkLCBzYW1wbGVzaXplPSVkLCBjaGFubmVscz0lZFxuIiwKKwkgICAgcmF0ZSwgZGItPnNhbXBsZV9zaXplLCBkYi0+bnVtX2NoYW5uZWxzKTsKKwlwcl9kZWJ1ZygicHJvZ19kbWFidWY6IGZyYWdzaXplPSVkLCBjbnRfZmFjdG9yPSVkLCBkbWFfZnJhZ3NpemU9JWRcbiIsCisJICAgIGRiLT5mcmFnc2l6ZSwgZGItPmNudF9mYWN0b3IsIGRiLT5kbWFfZnJhZ3NpemUpOworCXByX2RlYnVnKCJwcm9nX2RtYWJ1ZjogbnVtZnJhZz0lZCwgZG1hc2l6ZT0lZFxuIiwgZGItPm51bWZyYWcsIGRiLT5kbWFzaXplKTsKKworCWRiLT5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2dfZG1hYnVmX2FkYyhzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzKQoreworCXN0b3BfYWRjKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYyk7CisKK30KKworc3RhdGljIGludAorcHJvZ19kbWFidWZfZGFjKHN0cnVjdCBhdTE1NTBfc3RhdGUgKnMpCit7CisJc3RvcF9kYWMocyk7CisJcmV0dXJuIHByb2dfZG1hYnVmKHMsICZzLT5kbWFfZGFjKTsKK30KKworCisvKiBob2xkIHNwaW5sb2NrIGZvciB0aGUgZm9sbG93aW5nICovCitzdGF0aWMgdm9pZAorZGFjX2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzID0gKHN0cnVjdCBhdTE1NTBfc3RhdGUgKikgZGV2X2lkOworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfZGFjOworCXUzMglhYzk3Y19zdGF0OworCisJYWM5N2Nfc3RhdCA9IGF1X3JlYWRsKFBTQ19BQzk3U1RBVCk7CisJaWYgKGFjOTdjX3N0YXQgJiAoQUM5N0NfWFUgfCBBQzk3Q19YTyB8IEFDOTdDX1RFKSkKKwkJcHJfZGVidWcoIkFDOTdDIHN0YXR1cyA9IDB4JTA4eFxuIiwgYWM5N2Nfc3RhdCk7CisJZGItPmRtYV9xY291bnQtLTsKKworCWlmIChkYi0+Y291bnQgPj0gZGItPmZyYWdzaXplKSB7CisJCWlmIChhdTF4eHhfZGJkbWFfcHV0X3NvdXJjZShkYi0+ZG1hbnIsIGRiLT5uZXh0T3V0LAorCQkJCQkJCWRiLT5mcmFnc2l6ZSkgPT0gMCkgeworCQkJZXJyKCJxY291bnQgPCAyIGFuZCBubyByaW5nIHJvb20hIik7CisJCX0KKwkJZGItPm5leHRPdXQgKz0gZGItPmZyYWdzaXplOworCQlpZiAoZGItPm5leHRPdXQgPj0gZGItPnJhd2J1ZiArIGRiLT5kbWFzaXplKQorCQkJZGItPm5leHRPdXQgLT0gZGItPmRtYXNpemU7CisJCWRiLT5jb3VudCAtPSBkYi0+ZnJhZ3NpemU7CisJCWRiLT50b3RhbF9ieXRlcyArPSBkYi0+ZG1hX2ZyYWdzaXplOworCQlkYi0+ZG1hX3Fjb3VudCsrOworCX0KKworCS8qIHdha2UgdXAgYW55Ym9keSBsaXN0ZW5pbmcgKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZGItPndhaXQpKQorCQl3YWtlX3VwKCZkYi0+d2FpdCk7Cit9CisKKworc3RhdGljIHZvaWQKK2FkY19kbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0CWF1MTU1MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxNTUwX3N0YXRlICopZGV2X2lkOworCXN0cnVjdAlkbWFidWYgICpkcCA9ICZzLT5kbWFfYWRjOworCXUzMglvYnl0ZXM7CisJY2hhcgkqb2J1ZjsKKworCS8qIFB1bGwgdGhlIGJ1ZmZlciBmcm9tIHRoZSBkbWEgcXVldWUuCisJKi8KKwlhdTF4eHhfZGJkbWFfZ2V0X2Rlc3QoZHAtPmRtYW5yLCAodm9pZCAqKSgmb2J1ZiksICZvYnl0ZXMpOworCisJaWYgKChkcC0+Y291bnQgKyBvYnl0ZXMpID4gZHAtPmRtYXNpemUpIHsKKwkJLyogT3ZlcnJ1bi4gU3RvcCBBREMgYW5kIGxvZyB0aGUgZXJyb3IKKwkJKi8KKwkJc3RvcF9hZGMocyk7CisJCWRwLT5lcnJvcisrOworCQllcnIoImFkYyBvdmVycnVuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBQdXQgYSBuZXcgZW1wdHkgYnVmZmVyIG9uIHRoZSBkZXN0aW5hdGlvbiBETUEuCisJKi8KKwlhdTF4eHhfZGJkbWFfcHV0X2Rlc3QoZHAtPmRtYW5yLCBkcC0+bmV4dEluLCBkcC0+ZG1hX2ZyYWdzaXplKTsKKworCWRwLT5uZXh0SW4gKz0gZHAtPmRtYV9mcmFnc2l6ZTsKKwlpZiAoZHAtPm5leHRJbiA+PSBkcC0+cmF3YnVmICsgZHAtPmRtYXNpemUpCisJCWRwLT5uZXh0SW4gLT0gZHAtPmRtYXNpemU7CisKKwlkcC0+Y291bnQgKz0gb2J5dGVzOworCWRwLT50b3RhbF9ieXRlcyArPSBvYnl0ZXM7CisKKwkvKiB3YWtlIHVwIGFueWJvZHkgbGlzdGVuaW5nCisJKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZHAtPndhaXQpKQorCQl3YWtlX3VwKCZkcC0+d2FpdCk7CisKK30KKworc3RhdGljIGxvZmZfdAorYXUxNTUwX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlyZXR1cm4gLUVTUElQRTsKK30KKworCitzdGF0aWMgaW50CithdTE1NTBfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJmF1MTU1MF9zdGF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYXUxNTUwX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittaXhkZXZfaW9jdGwoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50CithdTE1NTBfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBzLT5jb2RlYzsKKworCXJldHVybiBtaXhkZXZfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdTE1NTBfbWl4ZXJfZm9wcyA9IHsKKwlvd25lcjpUSElTX01PRFVMRSwKKwlsbHNlZWs6YXUxNTUwX2xsc2VlaywKKwlpb2N0bDphdTE1NTBfaW9jdGxfbWl4ZGV2LAorCW9wZW46YXUxNTUwX29wZW5fbWl4ZGV2LAorCXJlbGVhc2U6YXUxNTUwX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworc3RhdGljIGludAorZHJhaW5fZGFjKHN0cnVjdCBhdTE1NTBfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgIGNvdW50LCB0bW87CisKKwlpZiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwgIXMtPmRtYV9kYWMucmVhZHkgfHwgcy0+ZG1hX2RhYy5zdG9wcGVkKQorCQlyZXR1cm4gMDsKKworCWZvciAoOzspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSBzLT5kbWFfZGFjLmZyYWdzaXplKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlpZiAobm9uYmxvY2spCisJCQlyZXR1cm4gLUVCVVNZOworCQl0bW8gPSAxMDAwICogY291bnQgLyAocy0+bm9fdnJhID8KKwkJCQkgICAgICA0ODAwMCA6IHMtPmRtYV9kYWMuc2FtcGxlX3JhdGUpOworCQl0bW8gLz0gcy0+ZG1hX2RhYy5kbWFfYnl0ZXNfcGVyX3NhbXBsZTsKKwkJYXUxNTUwX2RlbGF5KHRtbyk7CisJfQorCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1OCBTMTZfVE9fVTgoczE2IGNoKQoreworCXJldHVybiAodTgpIChjaCA+PiA4KSArIDB4ODA7Cit9CitzdGF0aWMgaW5saW5lIHMxNiBVOF9UT19TMTYodTggY2gpCit7CisJcmV0dXJuIChzMTYpIChjaCAtIDB4ODApIDw8IDg7Cit9CisKKy8qCisgKiBUcmFuc2xhdGVzIHVzZXIgc2FtcGxlcyB0byBkbWEgYnVmZmVyIHN1aXRhYmxlIGZvciBBQyc5NyBEQUMgZGF0YToKKyAqICAgICBJZiBtb25vLCBjb3B5IGxlZnQgY2hhbm5lbCB0byByaWdodCBjaGFubmVsIGluIGRtYSBidWZmZXIuCisgKiAgICAgSWYgOCBiaXQgc2FtcGxlcywgY3Z0IHRvIDE2LWJpdCBiZWZvcmUgd3JpdGluZyB0byBkbWEgYnVmZmVyLgorICogICAgIElmIGludGVycG9sYXRpbmcgKG5vIFZSQSksIGR1cGxpY2F0ZSBldmVyeSBhdWRpbyBmcmFtZSBzcmNfZmFjdG9yIHRpbWVzLgorICovCitzdGF0aWMgaW50Cit0cmFuc2xhdGVfZnJvbV91c2VyKHN0cnVjdCBkbWFidWYgKmRiLCBjaGFyKiBkbWFidWYsIGNoYXIqIHVzZXJidWYsCisJCQkJCQkJICAgICAgIGludCBkbWFjb3VudCkKK3sKKwlpbnQgICAgICAgICAgICAgc2FtcGxlLCBpOworCWludCAgICAgICAgICAgICBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKwlpbnQgICAgICAgICAgICAgbnVtX3NhbXBsZXM7CisJaW50ICAgICAgICAgICAgIG1vbm8gPSAoZGItPm51bV9jaGFubmVscyA9PSAxKTsKKwljaGFyICAgICAgICAgICAgdXNlcnNhbXBsZVsxMl07CisJczE2ICAgICAgICAgICAgIGNoLCBkbWFzYW1wbGVbNl07CisKKwlpZiAoZGItPnNhbXBsZV9zaXplID09IDE2ICYmICFtb25vICYmIGRiLT5zcmNfZmFjdG9yID09IDEpIHsKKwkJLyogbm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5LCBqdXN0IGNvcHkKKwkJKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1ZiwgdXNlcmJ1ZiwgZG1hY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBkbWFjb3VudDsKKwl9CisKKwlpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZSA9IGRiLT5kbWFfYnl0ZXNfcGVyX3NhbXBsZSAqIGRiLT5zcmNfZmFjdG9yOworCW51bV9zYW1wbGVzID0gZG1hY291bnQgLyBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKworCWZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgbnVtX3NhbXBsZXM7IHNhbXBsZSsrKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcih1c2Vyc2FtcGxlLCB1c2VyYnVmLAorCQkJCSAgIGRiLT51c2VyX2J5dGVzX3Blcl9zYW1wbGUpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBkYi0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChkYi0+c2FtcGxlX3NpemUgPT0gOCkKKwkJCQljaCA9IFU4X1RPX1MxNih1c2Vyc2FtcGxlW2ldKTsKKwkJCWVsc2UKKwkJCQljaCA9ICooKHMxNiAqKSAoJnVzZXJzYW1wbGVbaSAqIDJdKSk7CisJCQlkbWFzYW1wbGVbaV0gPSBjaDsKKwkJCWlmIChtb25vKQorCQkJCWRtYXNhbXBsZVtpICsgMV0gPSBjaDsJLyogcmlnaHQgY2hhbm5lbCAqLworCQl9CisKKwkJLyogZHVwbGljYXRlIGV2ZXJ5IGF1ZGlvIGZyYW1lIHNyY19mYWN0b3IgdGltZXMKKwkJKi8KKwkJZm9yIChpID0gMDsgaSA8IGRiLT5zcmNfZmFjdG9yOyBpKyspCisJCQltZW1jcHkoZG1hYnVmLCBkbWFzYW1wbGUsIGRiLT5kbWFfYnl0ZXNfcGVyX3NhbXBsZSk7CisKKwkJdXNlcmJ1ZiArPSBkYi0+dXNlcl9ieXRlc19wZXJfc2FtcGxlOworCQlkbWFidWYgKz0gaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7CisJfQorCisJcmV0dXJuIG51bV9zYW1wbGVzICogaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7Cit9CisKKy8qCisgKiBUcmFuc2xhdGVzIEFDJzk3IEFEQyBzYW1wbGVzIHRvIHVzZXIgYnVmZmVyOgorICogICAgIElmIG1vbm8sIHNlbmQgb25seSBsZWZ0IGNoYW5uZWwgdG8gdXNlciBidWZmZXIuCisgKiAgICAgSWYgOCBiaXQgc2FtcGxlcywgY3Z0IGZyb20gMTYgdG8gOCBiaXQgYmVmb3JlIHdyaXRpbmcgdG8gdXNlciBidWZmZXIuCisgKiAgICAgSWYgZGVjaW1hdGluZyAobm8gVlJBKSwgc2tpcCBvdmVyIHNyY19mYWN0b3IgYXVkaW8gZnJhbWVzLgorICovCitzdGF0aWMgaW50Cit0cmFuc2xhdGVfdG9fdXNlcihzdHJ1Y3QgZG1hYnVmICpkYiwgY2hhciogdXNlcmJ1ZiwgY2hhciogZG1hYnVmLAorCQkJCQkJCSAgICAgaW50IGRtYWNvdW50KQoreworCWludCAgICAgICAgICAgICBzYW1wbGUsIGk7CisJaW50ICAgICAgICAgICAgIGludGVycF9ieXRlc19wZXJfc2FtcGxlOworCWludCAgICAgICAgICAgICBudW1fc2FtcGxlczsKKwlpbnQgICAgICAgICAgICAgbW9ubyA9IChkYi0+bnVtX2NoYW5uZWxzID09IDEpOworCWNoYXIgICAgICAgICAgICB1c2Vyc2FtcGxlWzEyXTsKKworCWlmIChkYi0+c2FtcGxlX3NpemUgPT0gMTYgJiYgIW1vbm8gJiYgZGItPnNyY19mYWN0b3IgPT0gMSkgeworCQkvKiBubyB0cmFuc2xhdGlvbiBuZWNlc3NhcnksIGp1c3QgY29weQorCQkqLworCQlpZiAoY29weV90b191c2VyKHVzZXJidWYsIGRtYWJ1ZiwgZG1hY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBkbWFjb3VudDsKKwl9CisKKwlpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZSA9IGRiLT5kbWFfYnl0ZXNfcGVyX3NhbXBsZSAqIGRiLT5zcmNfZmFjdG9yOworCW51bV9zYW1wbGVzID0gZG1hY291bnQgLyBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKworCWZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgbnVtX3NhbXBsZXM7IHNhbXBsZSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkYi0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChkYi0+c2FtcGxlX3NpemUgPT0gOCkKKwkJCQl1c2Vyc2FtcGxlW2ldID0KKwkJCQkJUzE2X1RPX1U4KCooKHMxNiAqKSAoJmRtYWJ1ZltpICogMl0pKSk7CisJCQllbHNlCisJCQkJKigoczE2ICopICgmdXNlcnNhbXBsZVtpICogMl0pKSA9CisJCQkJCSooKHMxNiAqKSAoJmRtYWJ1ZltpICogMl0pKTsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIodXNlcmJ1ZiwgdXNlcnNhbXBsZSwKKwkJCQkgZGItPnVzZXJfYnl0ZXNfcGVyX3NhbXBsZSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJdXNlcmJ1ZiArPSBkYi0+dXNlcl9ieXRlc19wZXJfc2FtcGxlOworCQlkbWFidWYgKz0gaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7CisJfQorCisJcmV0dXJuIG51bV9zYW1wbGVzICogaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7Cit9CisKKy8qCisgKiBDb3B5IGF1ZGlvIGRhdGEgdG8vZnJvbSB1c2VyIGJ1ZmZlciBmcm9tL3RvIGRtYSBidWZmZXIsIHRha2luZyBjYXJlCisgKiB0aGF0IHdlIHdyYXAgd2hlbiByZWFkaW5nL3dyaXRpbmcgdGhlIGRtYSBidWZmZXIuIFJldHVybnMgYWN0dWFsIGJ5dGUKKyAqIGNvdW50IHdyaXR0ZW4gdG8gb3IgcmVhZCBmcm9tIHRoZSBkbWEgYnVmZmVyLgorICovCitzdGF0aWMgaW50Citjb3B5X2RtYWJ1Zl91c2VyKHN0cnVjdCBkbWFidWYgKmRiLCBjaGFyKiB1c2VyYnVmLCBpbnQgY291bnQsIGludCB0b191c2VyKQoreworCWNoYXIgICAgICAgICAgICpidWZwdHIgPSB0b191c2VyID8gZGItPm5leHRPdXQgOiBkYi0+bmV4dEluOworCWNoYXIgICAgICAgICAgICpidWZlbmQgPSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemU7CisJaW50ICAgICAgICAgICAgIGNudCwgcmV0OworCisJaWYgKGJ1ZnB0ciArIGNvdW50ID4gYnVmZW5kKSB7CisJCWludCAgICAgICAgICAgICBwYXJ0aWFsID0gKGludCkgKGJ1ZmVuZCAtIGJ1ZnB0cik7CisJCWlmICh0b191c2VyKSB7CisJCQlpZiAoKGNudCA9IHRyYW5zbGF0ZV90b191c2VyKGRiLCB1c2VyYnVmLAorCQkJCQkJICAgICBidWZwdHIsIHBhcnRpYWwpKSA8IDApCisJCQkJcmV0dXJuIGNudDsKKwkJCXJldCA9IGNudDsKKwkJCWlmICgoY250ID0gdHJhbnNsYXRlX3RvX3VzZXIoZGIsIHVzZXJidWYgKyBwYXJ0aWFsLAorCQkJCQkJICAgICBkYi0+cmF3YnVmLAorCQkJCQkJICAgICBjb3VudCAtIHBhcnRpYWwpKSA8IDApCisJCQkJcmV0dXJuIGNudDsKKwkJCXJldCArPSBjbnQ7CisJCX0gZWxzZSB7CisJCQlpZiAoKGNudCA9IHRyYW5zbGF0ZV9mcm9tX3VzZXIoZGIsIGJ1ZnB0ciwgdXNlcmJ1ZiwKKwkJCQkJCSAgICAgICBwYXJ0aWFsKSkgPCAwKQorCQkJCXJldHVybiBjbnQ7CisJCQlyZXQgPSBjbnQ7CisJCQlpZiAoKGNudCA9IHRyYW5zbGF0ZV9mcm9tX3VzZXIoZGIsIGRiLT5yYXdidWYsCisJCQkJCQkgICAgICAgdXNlcmJ1ZiArIHBhcnRpYWwsCisJCQkJCQkgICAgICAgY291bnQgLSBwYXJ0aWFsKSkgPCAwKQorCQkJCXJldHVybiBjbnQ7CisJCQlyZXQgKz0gY250OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHRvX3VzZXIpCisJCQlyZXQgPSB0cmFuc2xhdGVfdG9fdXNlcihkYiwgdXNlcmJ1ZiwgYnVmcHRyLCBjb3VudCk7CisJCWVsc2UKKwkJCXJldCA9IHRyYW5zbGF0ZV9mcm9tX3VzZXIoZGIsIGJ1ZnB0ciwgdXNlcmJ1ZiwgY291bnQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHNzaXplX3QKK2F1MTU1MF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICAqZGIgPSAmcy0+ZG1hX2FkYzsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90ICAgICAgICAgcmV0OworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlpbnQgICAgICAgICAgICAgY250LCB1c2VyY250LCBhdmFpbDsKKworCWlmIChkYi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisKKwljb3VudCAqPSBkYi0+Y250X2ZhY3RvcjsKKworCWRvd24oJnMtPnNlbSk7CisJYWRkX3dhaXRfcXVldWUoJmRiLT53YWl0LCAmd2FpdCk7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8qIHdhaXQgZm9yIHNhbXBsZXMgaW4gQURDIGRtYSBidWZmZXIKKwkJKi8KKwkJZG8geworCQkJaWYgKGRiLT5zdG9wcGVkKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlhdmFpbCA9IGRiLT5jb3VudDsKKwkJCWlmIChhdmFpbCA8PSAwKQorCQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChhdmFpbCA8PSAwKSB7CisJCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJCWlmICghcmV0KQorCQkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCXVwKCZzLT5zZW0pOworCQkJCXNjaGVkdWxlKCk7CisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCWlmICghcmV0KQorCQkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCQlnb3RvIG91dDI7CisJCQkJfQorCQkJCWRvd24oJnMtPnNlbSk7CisJCQl9CisJCX0gd2hpbGUgKGF2YWlsIDw9IDApOworCisJCS8qIGNvcHkgZnJvbSBuZXh0T3V0IHRvIHVzZXIKKwkJKi8KKwkJaWYgKChjbnQgPSBjb3B5X2RtYWJ1Zl91c2VyKGRiLCBidWZmZXIsCisJCQkJCSAgICBjb3VudCA+IGF2YWlsID8KKwkJCQkJICAgIGF2YWlsIDogY291bnQsIDEpKSA8IDApIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWRiLT5jb3VudCAtPSBjbnQ7CisJCWRiLT5uZXh0T3V0ICs9IGNudDsKKwkJaWYgKGRiLT5uZXh0T3V0ID49IGRiLT5yYXdidWYgKyBkYi0+ZG1hc2l6ZSkKKwkJCWRiLT5uZXh0T3V0IC09IGRiLT5kbWFzaXplOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkJY291bnQgLT0gY250OworCQl1c2VyY250ID0gY250IC8gZGItPmNudF9mYWN0b3I7CisJCWJ1ZmZlciArPSB1c2VyY250OworCQlyZXQgKz0gdXNlcmNudDsKKwl9CQkJLyogd2hpbGUgKGNvdW50ID4gMCkgKi8KKworb3V0OgorCXVwKCZzLT5zZW0pOworb3V0MjoKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZGItPndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CithdTE1NTBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICAqZGIgPSAmcy0+ZG1hX2RhYzsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90ICAgICAgICAgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgIGNudCwgdXNlcmNudCwgYXZhaWw7CisKKwlwcl9kZWJ1Zygid3JpdGU6IGNvdW50PSVkXG4iLCBjb3VudCk7CisKKwlpZiAoZGItPm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJY291bnQgKj0gZGItPmNudF9mYWN0b3I7CisKKwlkb3duKCZzLT5zZW0pOworCWFkZF93YWl0X3F1ZXVlKCZkYi0+d2FpdCwgJndhaXQpOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkvKiB3YWl0IGZvciBzcGFjZSBpbiBwbGF5YmFjayBidWZmZXIKKwkJKi8KKwkJZG8geworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWF2YWlsID0gKGludCkgZGItPmRtYXNpemUgLSBkYi0+Y291bnQ7CisJCQlpZiAoYXZhaWwgPD0gMCkKKwkJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoYXZhaWwgPD0gMCkgeworCQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQl1cCgmcy0+c2VtKTsKKwkJCQlzY2hlZHVsZSgpOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQkJZ290byBvdXQyOworCQkJCX0KKwkJCQlkb3duKCZzLT5zZW0pOworCQkJfQorCQl9IHdoaWxlIChhdmFpbCA8PSAwKTsKKworCQkvKiBjb3B5IGZyb20gdXNlciB0byBuZXh0SW4KKwkJKi8KKwkJaWYgKChjbnQgPSBjb3B5X2RtYWJ1Zl91c2VyKGRiLCAoY2hhciAqKSBidWZmZXIsCisJCQkJCSAgICBjb3VudCA+IGF2YWlsID8KKwkJCQkJICAgIGF2YWlsIDogY291bnQsIDApKSA8IDApIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWRiLT5jb3VudCArPSBjbnQ7CisJCWRiLT5uZXh0SW4gKz0gY250OworCQlpZiAoZGItPm5leHRJbiA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQlkYi0+bmV4dEluIC09IGRiLT5kbWFzaXplOworCisJCS8qIElmIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSwgd2Ugd2FudCB0byBrZWVwIHR3byBidWZmZXJzCisJCSAqIG9uIHRoZSBkbWEgcXVldWUuICBJZiB0aGUgcXVldWUgY291bnQgcmVhY2hlcyB6ZXJvLAorCQkgKiB3ZSBrbm93IHRoZSBkbWEgaGFzIHN0b3BwZWQuCisJCSAqLworCQl3aGlsZSAoKGRiLT5kbWFfcWNvdW50IDwgMikgJiYgKGRiLT5jb3VudCA+PSBkYi0+ZnJhZ3NpemUpKSB7CisJCQlpZiAoYXUxeHh4X2RiZG1hX3B1dF9zb3VyY2UoZGItPmRtYW5yLCBkYi0+bmV4dE91dCwKKwkJCQkJCQlkYi0+ZnJhZ3NpemUpID09IDApIHsKKwkJCQllcnIoInFjb3VudCA8IDIgYW5kIG5vIHJpbmcgcm9vbSEiKTsKKwkJCX0KKwkJCWRiLT5uZXh0T3V0ICs9IGRiLT5mcmFnc2l6ZTsKKwkJCWlmIChkYi0+bmV4dE91dCA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQkJZGItPm5leHRPdXQgLT0gZGItPmRtYXNpemU7CisJCQlkYi0+dG90YWxfYnl0ZXMgKz0gZGItPmRtYV9mcmFnc2l6ZTsKKwkJCWlmIChkYi0+ZG1hX3Fjb3VudCA9PSAwKQorCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCWRiLT5kbWFfcWNvdW50Kys7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJCWNvdW50IC09IGNudDsKKwkJdXNlcmNudCA9IGNudCAvIGRiLT5jbnRfZmFjdG9yOworCQlidWZmZXIgKz0gdXNlcmNudDsKKwkJcmV0ICs9IHVzZXJjbnQ7CisJfQkJCS8qIHdoaWxlIChjb3VudCA+IDApICovCisKK291dDoKKwl1cCgmcy0+c2VtKTsKK291dDI6CisJcmVtb3ZlX3dhaXRfcXVldWUoJmRiLT53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50CithdTE1NTBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJdW5zaWduZWQgaW50ICAgIG1hc2sgPSAwOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5kbWFfZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49CisJCQkgICAgKHNpZ25lZClzLT5kbWFfZGFjLmRtYV9mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9IGVsc2UgeworCQkJaWYgKChzaWduZWQpIHMtPmRtYV9kYWMuZG1hc2l6ZSA+PQorCQkJICAgIHMtPmRtYV9kYWMuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMuZG1hX2ZyYWdzaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50CithdTE1NTBfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGF1MTU1MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxNTUwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgICpkYjsKKwl1bnNpZ25lZCBsb25nICAgc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisJZG93bigmcy0+c2VtKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQorCQlkYiA9ICZzLT5kbWFfZGFjOworCWVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKQorCQlkYiA9ICZzLT5kbWFfYWRjOworCWVsc2UgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHBhZ2VfdG9fcGZuKHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKSksCisJCQkgICAgIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisJdm1hLT52bV9mbGFncyAmPSB+Vk1fSU87CisJZGItPm1hcHBlZCA9IDE7CitvdXQ6CisJdXAoJnMtPnNlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHN0cnVjdCBpb2N0bF9zdHJfdCB7CisJdW5zaWduZWQgaW50ICAgIGNtZDsKKwljb25zdCBjaGFyICAgICAqc3RyOworfSBpb2N0bF9zdHJbXSA9IHsKKwl7U05EQ1RMX0RTUF9SRVNFVCwgIlNORENUTF9EU1BfUkVTRVQifSwKKwl7U05EQ1RMX0RTUF9TWU5DLCAiU05EQ1RMX0RTUF9TWU5DIn0sCisJe1NORENUTF9EU1BfU1BFRUQsICJTTkRDVExfRFNQX1NQRUVEIn0sCisJe1NORENUTF9EU1BfU1RFUkVPLCAiU05EQ1RMX0RTUF9TVEVSRU8ifSwKKwl7U05EQ1RMX0RTUF9HRVRCTEtTSVpFLCAiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIn0sCisJe1NORENUTF9EU1BfU0FNUExFU0laRSwgIlNORENUTF9EU1BfU0FNUExFU0laRSJ9LAorCXtTTkRDVExfRFNQX0NIQU5ORUxTLCAiU05EQ1RMX0RTUF9DSEFOTkVMUyJ9LAorCXtTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFMsICJTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFMifSwKKwl7U09VTkRfUENNX1dSSVRFX0ZJTFRFUiwgIlNPVU5EX1BDTV9XUklURV9GSUxURVIifSwKKwl7U05EQ1RMX0RTUF9QT1NULCAiU05EQ1RMX0RTUF9QT1NUIn0sCisJe1NORENUTF9EU1BfU1VCRElWSURFLCAiU05EQ1RMX0RTUF9TVUJESVZJREUifSwKKwl7U05EQ1RMX0RTUF9TRVRGUkFHTUVOVCwgIlNORENUTF9EU1BfU0VURlJBR01FTlQifSwKKwl7U05EQ1RMX0RTUF9HRVRGTVRTLCAiU05EQ1RMX0RTUF9HRVRGTVRTIn0sCisJe1NORENUTF9EU1BfU0VURk1ULCAiU05EQ1RMX0RTUF9TRVRGTVQifSwKKwl7U05EQ1RMX0RTUF9HRVRPU1BBQ0UsICJTTkRDVExfRFNQX0dFVE9TUEFDRSJ9LAorCXtTTkRDVExfRFNQX0dFVElTUEFDRSwgIlNORENUTF9EU1BfR0VUSVNQQUNFIn0sCisJe1NORENUTF9EU1BfTk9OQkxPQ0ssICJTTkRDVExfRFNQX05PTkJMT0NLIn0sCisJe1NORENUTF9EU1BfR0VUQ0FQUywgIlNORENUTF9EU1BfR0VUQ0FQUyJ9LAorCXtTTkRDVExfRFNQX0dFVFRSSUdHRVIsICJTTkRDVExfRFNQX0dFVFRSSUdHRVIifSwKKwl7U05EQ1RMX0RTUF9TRVRUUklHR0VSLCAiU05EQ1RMX0RTUF9TRVRUUklHR0VSIn0sCisJe1NORENUTF9EU1BfR0VUSVBUUiwgIlNORENUTF9EU1BfR0VUSVBUUiJ9LAorCXtTTkRDVExfRFNQX0dFVE9QVFIsICJTTkRDVExfRFNQX0dFVE9QVFIifSwKKwl7U05EQ1RMX0RTUF9NQVBJTkJVRiwgIlNORENUTF9EU1BfTUFQSU5CVUYifSwKKwl7U05EQ1RMX0RTUF9NQVBPVVRCVUYsICJTTkRDVExfRFNQX01BUE9VVEJVRiJ9LAorCXtTTkRDVExfRFNQX1NFVFNZTkNSTywgIlNORENUTF9EU1BfU0VUU1lOQ1JPIn0sCisJe1NORENUTF9EU1BfU0VURFVQTEVYLCAiU05EQ1RMX0RTUF9TRVREVVBMRVgifSwKKwl7U05EQ1RMX0RTUF9HRVRPREVMQVksICJTTkRDVExfRFNQX0dFVE9ERUxBWSJ9LAorCXtTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLLCAiU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSyJ9LAorCXtTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTCwgIlNORENUTF9EU1BfQklORF9DSEFOTkVMIn0sCisJe09TU19HRVRWRVJTSU9OLCAiT1NTX0dFVFZFUlNJT04ifSwKKwl7U09VTkRfUENNX1JFQURfUkFURSwgIlNPVU5EX1BDTV9SRUFEX1JBVEUifSwKKwl7U09VTkRfUENNX1JFQURfQ0hBTk5FTFMsICJTT1VORF9QQ01fUkVBRF9DSEFOTkVMUyJ9LAorCXtTT1VORF9QQ01fUkVBRF9CSVRTLCAiU09VTkRfUENNX1JFQURfQklUUyJ9LAorCXtTT1VORF9QQ01fUkVBRF9GSUxURVIsICJTT1VORF9QQ01fUkVBRF9GSUxURVIifQorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50CitkbWFfY291bnRfZG9uZShzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlpZiAoZGItPnN0b3BwZWQpCisJCXJldHVybiAwOworCisJcmV0dXJuIGRiLT5kbWFfZnJhZ3NpemUgLSBhdTF4eHhfZ2V0X2RtYV9yZXNpZHVlKGRiLT5kbWFucik7Cit9CisKKworc3RhdGljIGludAorYXUxNTUwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJYXVkaW9fYnVmX2luZm8gIGFiaW5mbzsKKwljb3VudF9pbmZvICAgICAgY2luZm87CisJaW50ICAgICAgICAgICAgIGNvdW50OworCWludCAgICAgICAgICAgICB2YWwsIG1hcHBlZCwgcmV0LCBkaWZmOworCisJbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYy5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCisjaWZkZWYgREVCVUcKKwlmb3IgKGNvdW50PTA7IGNvdW50PHNpemVvZihpb2N0bF9zdHIpL3NpemVvZihpb2N0bF9zdHJbMF0pOyBjb3VudCsrKSB7CisJCWlmIChpb2N0bF9zdHJbY291bnRdLmNtZCA9PSBjbWQpCisJCQlicmVhazsKKwl9CisJaWYgKGNvdW50IDwgc2l6ZW9mKGlvY3RsX3N0cikgLyBzaXplb2YoaW9jdGxfc3RyWzBdKSkKKwkJcHJfZGVidWcoImlvY3RsICVzLCBhcmc9MHglbHhuIiwgaW9jdGxfc3RyW2NvdW50XS5zdHIsIGFyZyk7CisJZWxzZQorCQlwcl9kZWJ1ZygiaW9jdGwgMHgleCB1bmtub3duLCBhcmc9MHglbHhcbiIsIGNtZCwgYXJnKTsKKyNlbmRpZgorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfUkVBTFRJTUUgfAorCQkJCURTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEoKTsKKwkJCXMtPmRtYV9kYWMuY291bnQgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzID0gMDsKKwkJCXMtPmRtYV9kYWMubmV4dEluID0gcy0+ZG1hX2RhYy5uZXh0T3V0ID0KKwkJCQlzLT5kbWFfZGFjLnJhd2J1ZjsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEoKTsKKwkJCXMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKKwkJCXMtPmRtYV9hZGMubmV4dEluID0gcy0+ZG1hX2FkYy5uZXh0T3V0ID0KKwkJCQlzLT5kbWFfYWRjLnJhd2J1ZjsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPj0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzZXRfYWRjX3JhdGUocywgdmFsKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXNldF9kYWNfcmF0ZShzLCB2YWwpOworCQkJfQorCQkJaWYgKHMtPm9wZW5fbW9kZSAmIEZNT0RFX1JFQUQpCisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJaWYgKHMtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KKwkJCQlzLT5kbWFfYWRjLnNhbXBsZV9yYXRlIDoKKwkJCQlzLT5kbWFfZGFjLnNhbXBsZV9yYXRlLAorCQkJCShpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXMtPmRtYV9hZGMubnVtX2NoYW5uZWxzID0gdmFsID8gMiA6IDE7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5udW1fY2hhbm5lbHMgPSB2YWwgPyAyIDogMTsKKwkJCWlmIChzLT5jb2RlY19leHRfY2FwcyAmIEFDOTdfRVhUX0RBQ1MpIHsKKwkJCQkvKiBkaXNhYmxlIHN1cnJvdW5kIGFuZCBjZW50ZXIvbGZlIGluIEFDJzk3CisJCQkJKi8KKwkJCQl1MTYgZXh0X3N0YXQgPSByZGNvZGVjKHMtPmNvZGVjLAorCQkJCQkJICAgICAgIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJCQl3cmNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUywKKwkJCQkJZXh0X3N0YXQgfCAoQUM5N19FWFRTVEFUX1BSSSB8CisJCQkJCQkgICAgQUM5N19FWFRTVEFUX1BSSiB8CisJCQkJCQkgICAgQUM5N19FWFRTVEFUX1BSSykpOworCQkJfQorCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMikKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5udW1fY2hhbm5lbHMgPSB2YWw7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3dpdGNoICh2YWwpIHsKKwkJCQljYXNlIDE6CisJCQkJY2FzZSAyOgorCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJY2FzZSA1OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQljYXNlIDQ6CisJCQkJCWlmICghKHMtPmNvZGVjX2V4dF9jYXBzICYKKwkJCQkJICAgICAgQUM5N19FWFRJRF9TREFDKSkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlicmVhazsKKwkJCQljYXNlIDY6CisJCQkJCWlmICgocy0+Y29kZWNfZXh0X2NhcHMgJgorCQkJCQkgICAgIEFDOTdfRVhUX0RBQ1MpICE9IEFDOTdfRVhUX0RBQ1MpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJc3RvcF9kYWMocyk7CisJCQkJaWYgKHZhbCA8PSAyICYmCisJCQkJICAgIChzLT5jb2RlY19leHRfY2FwcyAmIEFDOTdfRVhUX0RBQ1MpKSB7CisJCQkJCS8qIGRpc2FibGUgc3Vycm91bmQgYW5kIGNlbnRlci9sZmUKKwkJCQkJICogY2hhbm5lbHMgaW4gQUMnOTcKKwkJCQkJICovCisJCQkJCXUxNiAgICAgICAgICAgICBleHRfc3RhdCA9CisJCQkJCQlyZGNvZGVjKHMtPmNvZGVjLAorCQkJCQkJCUFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJCQkJd3Jjb2RlYyhzLT5jb2RlYywKKwkJCQkJCUFDOTdfRVhURU5ERURfU1RBVFVTLAorCQkJCQkJZXh0X3N0YXQgfCAoQUM5N19FWFRTVEFUX1BSSSB8CisJCQkJCQkJICAgIEFDOTdfRVhUU1RBVF9QUkogfAorCQkJCQkJCSAgICBBQzk3X0VYVFNUQVRfUFJLKSk7CisJCQkJfSBlbHNlIGlmICh2YWwgPj0gNCkgeworCQkJCQkvKiBlbmFibGUgc3Vycm91bmQsIGNlbnRlci9sZmUKKwkJCQkJICogY2hhbm5lbHMgaW4gQUMnOTcKKwkJCQkJICovCisJCQkJCXUxNiAgICAgICAgICAgICBleHRfc3RhdCA9CisJCQkJCQlyZGNvZGVjKHMtPmNvZGVjLAorCQkJCQkJCUFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJCQkJZXh0X3N0YXQgJj0gfkFDOTdfRVhUU1RBVF9QUko7CisJCQkJCWlmICh2YWwgPT0gNikKKwkJCQkJCWV4dF9zdGF0ICY9CisJCQkJCQkJfihBQzk3X0VYVFNUQVRfUFJJIHwKKwkJCQkJCQkgIEFDOTdfRVhUU1RBVF9QUkspOworCQkJCQl3cmNvZGVjKHMtPmNvZGVjLAorCQkJCQkJQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCQkJCQlleHRfc3RhdCk7CisJCQkJfQorCisJCQkJcy0+ZG1hX2RhYy5udW1fY2hhbm5lbHMgPSB2YWw7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgkvKiBSZXR1cm5zIGEgbWFzayAqLworCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEUgfCBBRk1UX1U4LCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOgkvKiBTZWxlY3RzIE9ORSBmbXQgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5kbWFfYWRjLnNhbXBsZV9zaXplID0gMTY7CisJCQkJZWxzZSB7CisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJCXMtPmRtYV9hZGMuc2FtcGxlX3NpemUgPSA4OworCQkJCX0KKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5kbWFfZGFjLnNhbXBsZV9zaXplID0gMTY7CisJCQkJZWxzZSB7CisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJCXMtPmRtYV9kYWMuc2FtcGxlX3NpemUgPSA4OworCQkJCX0KKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQl2YWwgPSAocy0+ZG1hX2FkYy5zYW1wbGVfc2l6ZSA9PSAxNikgPworCQkJCQlBRk1UX1MxNl9MRSA6IEFGTVRfVTg7CisJCQllbHNlCisJCQkJdmFsID0gKHMtPmRtYV9kYWMuc2FtcGxlX3NpemUgPT0gMTYpID8KKwkJCQkJQUZNVF9TMTZfTEUgOiBBRk1UX1U4OworCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiAhcy0+ZG1hX2FkYy5zdG9wcGVkKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiAhcy0+ZG1hX2RhYy5zdG9wcGVkKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCWVsc2UKKwkJCQlzdG9wX2FkYyhzKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkKKwkJCQlzdGFydF9kYWMocyk7CisJCQllbHNlCisJCQkJc3RvcF9kYWMocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQljb3VudCAtPSBkbWFfY291bnRfZG9uZSgmcy0+ZG1hX2RhYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJYWJpbmZvLmJ5dGVzID0gKHMtPmRtYV9kYWMuZG1hc2l6ZSAtIGNvdW50KSAvCisJCQlzLT5kbWFfZGFjLmNudF9mYWN0b3I7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYy5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworCQlwcl9kZWJ1ZygiaW9jdGwgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6IGJ5dGVzPSVkLCBmcmFnbWVudHM9JWRcbiIsIGFiaW5mby5ieXRlcywgYWJpbmZvLmZyYWdtZW50cyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYWJpbmZvLAorCQkJCSAgICBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ3NpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJY291bnQgKz0gZG1hX2NvdW50X2RvbmUoJnMtPmRtYV9hZGMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCWFiaW5mby5ieXRlcyA9IGNvdW50IC8gcy0+ZG1hX2FkYy5jbnRfZmFjdG9yOworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9hZGMubnVtZnJhZzsKKwkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhYmluZm8sCisJCQkJICAgIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJY291bnQgLT0gZG1hX2NvdW50X2RvbmUoJnMtPmRtYV9kYWMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCWNvdW50IC89IHMtPmRtYV9kYWMuY250X2ZhY3RvcjsKKwkJcmV0dXJuIHB1dF91c2VyKGNvdW50LCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY2luZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmICghcy0+ZG1hX2FkYy5zdG9wcGVkKSB7CisJCQlkaWZmID0gZG1hX2NvdW50X2RvbmUoJnMtPmRtYV9hZGMpOworCQkJY291bnQgKz0gZGlmZjsKKwkJCWNpbmZvLmJ5dGVzICs9IGRpZmY7CisJCQljaW5mby5wdHIgPSAgdmlydF90b19waHlzKHMtPmRtYV9hZGMubmV4dEluKSArIGRpZmYgLQorCQkJCXZpcnRfdG9fcGh5cyhzLT5kbWFfYWRjLnJhd2J1Zik7CisJCX0gZWxzZQorCQkJY2luZm8ucHRyID0gdmlydF90b19waHlzKHMtPmRtYV9hZGMubmV4dEluKSAtCisJCQkJdmlydF90b19waHlzKHMtPmRtYV9hZGMucmF3YnVmKTsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSAocy0+ZG1hX2FkYy5kbWFfZnJhZ3NpemUtMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY2luZm8sIHNpemVvZihjaW5mbykpOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlpZiAoIXMtPmRtYV9kYWMuc3RvcHBlZCkgeworCQkJZGlmZiA9IGRtYV9jb3VudF9kb25lKCZzLT5kbWFfZGFjKTsKKwkJCWNvdW50IC09IGRpZmY7CisJCQljaW5mby5ieXRlcyArPSBkaWZmOworCQkJY2luZm8ucHRyID0gdmlydF90b19waHlzKHMtPmRtYV9kYWMubmV4dE91dCkgKyBkaWZmIC0KKwkJCQl2aXJ0X3RvX3BoeXMocy0+ZG1hX2RhYy5yYXdidWYpOworCQl9IGVsc2UKKwkJCWNpbmZvLnB0ciA9IHZpcnRfdG9fcGh5cyhzLT5kbWFfZGFjLm5leHRPdXQpIC0KKwkJCQl2aXJ0X3RvX3BoeXMocy0+ZG1hX2RhYy5yYXdidWYpOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCQlzLT5kbWFfZGFjLmNvdW50ICY9IChzLT5kbWFfZGFjLmRtYV9mcmFnc2l6ZS0xKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworCQljaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMuZnJhZ3NpemUsIChpbnQgKikgYXJnKTsKKwkJZWxzZQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9hZGMuZnJhZ3NpemUsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSA0OworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSA0OworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbikgfHwKKwkJICAgIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5kbWFfZGFjLnN1YmRpdmlzaW9uKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSB2YWw7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KKwkJCQlzLT5kbWFfYWRjLnNhbXBsZV9yYXRlIDoKKwkJCQlzLT5kbWFfZGFjLnNhbXBsZV9yYXRlLAorCQkJCShpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5udW1fY2hhbm5lbHMsIChpbnQgKilhcmcpOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5udW1fY2hhbm5lbHMsIChpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLnNhbXBsZV9zaXplLCAoaW50ICopYXJnKTsKKwkJZWxzZQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMuc2FtcGxlX3NpemUsIChpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBtaXhkZXZfaW9jdGwocy0+Y29kZWMsIGNtZCwgYXJnKTsKK30KKworCitzdGF0aWMgaW50CithdTE1NTBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgICAgICAgICAgICAgbWlub3IgPSBNSU5PUihpbm9kZS0+aV9yZGV2KTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzID0gJmF1MTU1MF9zdGF0ZTsKKwlpbnQgICAgICAgICAgICAgcmV0OworCisjaWZkZWYgREVCVUcKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCXByX2RlYnVnKCJvcGVuOiBub24tYmxvY2tpbmdcbiIpOworCWVsc2UKKwkJcHJfZGVidWcoIm9wZW46IGJsb2NraW5nXG4iKTsKKyNlbmRpZgorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisKKwlzdG9wX2RhYyhzKTsKKwlzdG9wX2FkYyhzKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9CisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9IDA7CisJCXMtPmRtYV9hZGMubnVtX2NoYW5uZWxzID0gMTsKKwkJcy0+ZG1hX2FkYy5zYW1wbGVfc2l6ZSA9IDg7CisJCXNldF9hZGNfcmF0ZShzLCA4MDAwKTsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCXMtPmRtYV9hZGMuc2FtcGxlX3NpemUgPSAxNjsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjLm9zc21heGZyYWdzID0KKwkJCXMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzID0gMDsKKwkJcy0+ZG1hX2RhYy5udW1fY2hhbm5lbHMgPSAxOworCQlzLT5kbWFfZGFjLnNhbXBsZV9zaXplID0gODsKKwkJc2V0X2RhY19yYXRlKHMsIDgwMDApOworCQlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQkJcy0+ZG1hX2RhYy5zYW1wbGVfc2l6ZSA9IDE2OworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCXJldHVybiByZXQ7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCWluaXRfTVVURVgoJnMtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2F1MTU1MF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCWxvY2tfa2VybmVsKCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQlsb2NrX2tlcm5lbCgpOworCX0KKworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RvcF9kYWMocyk7CisJCWtmcmVlKHMtPmRtYV9kYWMucmF3YnVmKTsKKwkJcy0+ZG1hX2RhYy5yYXdidWYgPSBOVUxMOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdG9wX2FkYyhzKTsKKwkJa2ZyZWUocy0+ZG1hX2FkYy5yYXdidWYpOworCQlzLT5kbWFfYWRjLnJhd2J1ZiA9IE5VTEw7CisJfQorCXMtPm9wZW5fbW9kZSAmPSAoKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1MTU1MF9hdWRpb19mb3BzID0geworCW93bmVyOgkJVEhJU19NT0RVTEUsCisJbGxzZWVrOgkJYXUxNTUwX2xsc2VlaywKKwlyZWFkOgkJYXUxNTUwX3JlYWQsCisJd3JpdGU6CQlhdTE1NTBfd3JpdGUsCisJcG9sbDoJCWF1MTU1MF9wb2xsLAorCWlvY3RsOgkJYXUxNTUwX2lvY3RsLAorCW1tYXA6CQlhdTE1NTBfbW1hcCwKKwlvcGVuOgkJYXUxNTUwX29wZW4sCisJcmVsZWFzZToJYXUxNTUwX3JlbGVhc2UsCit9OworCitNT0RVTEVfQVVUSE9SKCJBZHZhbmNlZCBNaWNybyBEZXZpY2VzIChBTUQpLCBkYW5AZW1iZWRkZWRlZGdlLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTE1NTAgQUM5NyBBdWRpbyBEcml2ZXIiKTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2F1MTU1MF9wcm9iZSh2b2lkKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAmYXUxNTUwX3N0YXRlOworCWludCAgICAgICAgICAgICB2YWw7CisKKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBhdTE1NTBfc3RhdGUpKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9hZGMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXQpOworCWluaXRfTVVURVgoJnMtPm9wZW5fc2VtKTsKKwlzcGluX2xvY2tfaW5pdCgmcy0+bG9jayk7CisKKwlzLT5jb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKTsKKwlpZihzLT5jb2RlYyA9PSBOVUxMKSB7CisJCWVycigiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4gLTE7CisJfQorCXMtPmNvZGVjLT5wcml2YXRlX2RhdGEgPSBzOworCXMtPmNvZGVjLT5pZCA9IDA7CisJcy0+Y29kZWMtPmNvZGVjX3JlYWQgPSByZGNvZGVjOworCXMtPmNvZGVjLT5jb2RlY193cml0ZSA9IHdyY29kZWM7CisJcy0+Y29kZWMtPmNvZGVjX3dhaXQgPSB3YWl0Y29kZWM7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihDUEhZU0FERFIoQUM5N19QU0NfU0VMKSwKKwkJCSAgICAweDMwLCAiQXUxNTUwIEFDOTciKSkgeworCQllcnIoIkFDJzk3IHBvcnRzIGluIHVzZSIpOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBETUEgQ2hhbm5lbHMKKwkqLworCWlmICgocy0+ZG1hX2RhYy5kbWFuciA9IGF1MXh4eF9kYmRtYV9jaGFuX2FsbG9jKERCRE1BX01FTV9DSEFOLAorCSAgICBEQkRNQV9BQzk3X1RYX0NIQU4sIGRhY19kbWFfaW50ZXJydXB0LCAodm9pZCAqKXMpKSA9PSAwKSB7CisJCWVycigiQ2FuJ3QgZ2V0IERBQyBETUEiKTsKKwkJZ290byBlcnJfZG1hMTsKKwl9CisJYXUxeHh4X2RiZG1hX3NldF9kZXZ3aWR0aChzLT5kbWFfZGFjLmRtYW5yLCAxNik7CisJaWYgKGF1MXh4eF9kYmRtYV9yaW5nX2FsbG9jKHMtPmRtYV9kYWMuZG1hbnIsCisJCQkJCU5VTV9EQkRNQV9ERVNDUklQVE9SUykgPT0gMCkgeworCQllcnIoIkNhbid0IGdldCBEQUMgRE1BIGRlc2NyaXB0b3JzIik7CisJCWdvdG8gZXJyX2RtYTE7CisJfQorCisJaWYgKChzLT5kbWFfYWRjLmRtYW5yID0gYXUxeHh4X2RiZG1hX2NoYW5fYWxsb2MoREJETUFfQUM5N19SWF9DSEFOLAorCSAgICBEQkRNQV9NRU1fQ0hBTiwgYWRjX2RtYV9pbnRlcnJ1cHQsICh2b2lkICopcykpID09IDApIHsKKwkJZXJyKCJDYW4ndCBnZXQgQURDIERNQSIpOworCQlnb3RvIGVycl9kbWEyOworCX0KKwlhdTF4eHhfZGJkbWFfc2V0X2RldndpZHRoKHMtPmRtYV9hZGMuZG1hbnIsIDE2KTsKKwlpZiAoYXUxeHh4X2RiZG1hX3JpbmdfYWxsb2Mocy0+ZG1hX2FkYy5kbWFuciwKKwkJCQkJTlVNX0RCRE1BX0RFU0NSSVBUT1JTKSA9PSAwKSB7CisJCWVycigiQ2FuJ3QgZ2V0IEFEQyBETUEgZGVzY3JpcHRvcnMiKTsKKwkJZ290byBlcnJfZG1hMjsKKwl9CisKKwlwcl9pbmZvKCJEQUM6IERNQSVkLCBBREM6IERNQSVkIiwgREJETUFfQUM5N19UWF9DSEFOLCBEQkRNQV9BQzk3X1JYX0NIQU4pOworCisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCisJaWYgKChzLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmF1MTU1MF9hdWRpb19mb3BzLCAtMSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MTsKKwlpZiAoKHMtPmNvZGVjLT5kZXZfbWl4ZXIgPQorCSAgICAgcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmF1MTU1MF9taXhlcl9mb3BzLCAtMSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MjsKKworCS8qIFRoZSBHUElPIGZvciB0aGUgYXBwcm9wcmlhdGUgUFNDIHdhcyBjb25maWd1cmVkIGJ5IHRoZQorCSAqIGJvYXJkIHNwZWNpZmljIHN0YXJ0IHVwLgorCSAqCisJICogY29uZmlndXJlIFBTQyBmb3IgQUMnOTcKKwkgKi8KKwlhdV93cml0ZWwoMCwgQUM5N19QU0NfQ1RSTCk7CS8qIERpc2FibGUgUFNDICovCisJYXVfc3luYygpOworCWF1X3dyaXRlbCgoUFNDX1NFTF9DTEtfU0VSQ0xLIHwgUFNDX1NFTF9QU19BQzk3TU9ERSksIEFDOTdfUFNDX1NFTCk7CisJYXVfc3luYygpOworCisJLyogY29sZCByZXNldCB0aGUgQUMnOTcKKwkqLworCWF1X3dyaXRlbChQU0NfQUM5N1JTVF9SU1QsIFBTQ19BQzk3UlNUKTsKKwlhdV9zeW5jKCk7CisJYXUxNTUwX2RlbGF5KDEwKTsKKwlhdV93cml0ZWwoMCwgUFNDX0FDOTdSU1QpOworCWF1X3N5bmMoKTsKKworCS8qIG5lZWQgdG8gZGVsYXkgYXJvdW5kIDUwMG1zZWMoYmxlZWNoKSB0byBnaXZlCisJICAgc29tZSBDT0RFQ3MgZW5vdWdoIHRpbWUgdG8gd2FrZXVwICovCisJYXUxNTUwX2RlbGF5KDUwMCk7CisKKwkvKiB3YXJtIHJlc2V0IHRoZSBBQyc5NyB0byBzdGFydCB0aGUgYml0Y2xrCisJKi8KKwlhdV93cml0ZWwoUFNDX0FDOTdSU1RfU05DLCBQU0NfQUM5N1JTVCk7CisJYXVfc3luYygpOworCXVkZWxheSgxMDApOworCWF1X3dyaXRlbCgwLCBQU0NfQUM5N1JTVCk7CisJYXVfc3luYygpOworCisJLyogRW5hYmxlIFBTQworCSovCisJYXVfd3JpdGVsKFBTQ19DVFJMX0VOQUJMRSwgQUM5N19QU0NfQ1RSTCk7CisJYXVfc3luYygpOworCisJLyogV2FpdCBmb3IgUFNDIHJlYWR5LgorCSovCisJZG8geworCQl2YWwgPSByZWFkbCgodm9pZCAqKVBTQ19BQzk3U1RBVCk7CisJCWF1X3N5bmMoKTsKKwl9IHdoaWxlICgodmFsICYgUFNDX0FDOTdTVEFUX1NSKSA9PSAwKTsKKworCS8qIENvbmZpZ3VyZSBBQzk3IGNvbnRyb2xsZXIuCisJICogRGVlcCBGSUZPLCAxNi1iaXQgc2FtcGxlLCBETUEsIG1ha2Ugc3VyZSBETUEgbWF0Y2hlcyBmaWZvIHNpemUuCisJICovCisJdmFsID0gUFNDX0FDOTdDRkdfU0VUX0xFTigxNik7CisJdmFsIHw9IFBTQ19BQzk3Q0ZHX1JUX0ZJRk84IHwgUFNDX0FDOTdDRkdfVFRfRklGTzg7CisKKwkvKiBFbmFibGUgZGV2aWNlIHNvIHdlIGNhbiBhdCBsZWFzdAorCSAqIHRhbGsgb3ZlciB0aGUgQUMtbGluay4KKwkgKi8KKwlhdV93cml0ZWwodmFsLCBQU0NfQUM5N0NGRyk7CisJYXVfd3JpdGVsKFBTQ19BQzk3TVNLX0FMTE1BU0ssIFBTQ19BQzk3TVNLKTsKKwlhdV9zeW5jKCk7CisJdmFsIHw9IFBTQ19BQzk3Q0ZHX0RFX0VOQUJMRTsKKwlhdV93cml0ZWwodmFsLCBQU0NfQUM5N0NGRyk7CisJYXVfc3luYygpOworCisJLyogV2FpdCBmb3IgRGV2aWNlIHJlYWR5LgorCSovCisJZG8geworCQl2YWwgPSByZWFkbCgodm9pZCAqKVBTQ19BQzk3U1RBVCk7CisJCWF1X3N5bmMoKTsKKwl9IHdoaWxlICgodmFsICYgUFNDX0FDOTdTVEFUX0RSKSA9PSAwKTsKKworCS8qIGNvZGVjIGluaXQgKi8KKwlpZiAoIWFjOTdfcHJvYmVfY29kZWMocy0+Y29kZWMpKQorCQlnb3RvIGVycl9kZXYzOworCisJcy0+Y29kZWNfYmFzZV9jYXBzID0gcmRjb2RlYyhzLT5jb2RlYywgQUM5N19SRVNFVCk7CisJcy0+Y29kZWNfZXh0X2NhcHMgPSByZGNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX0lEKTsKKwlwcl9pbmZvKCJBQyc5NyBCYXNlL0V4dGVuZGVkIElEID0gJTA0eC8lMDR4IiwKKwkgICAgIHMtPmNvZGVjX2Jhc2VfY2Fwcywgcy0+Y29kZWNfZXh0X2NhcHMpOworCisJaWYgKCEocy0+Y29kZWNfZXh0X2NhcHMgJiBBQzk3X0VYVElEX1ZSQSkpIHsKKwkJLyogY29kZWMgZG9lcyBub3Qgc3VwcG9ydCBWUkEKKwkJKi8KKwkJcy0+bm9fdnJhID0gMTsKKwl9IGVsc2UgaWYgKCF2cmEpIHsKKwkJLyogQm9vdCBvcHRpb24gc2F5cyBkaXNhYmxlIFZSQQorCQkqLworCQl1MTYgYWM5N19leHRzdGF0ID0gcmRjb2RlYyhzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCQl3cmNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUywKKwkJCWFjOTdfZXh0c3RhdCAmIH5BQzk3X0VYVFNUQVRfVlJBKTsKKwkJcy0+bm9fdnJhID0gMTsKKwl9CisJaWYgKHMtPm5vX3ZyYSkKKwkJcHJfaW5mbygibm8gVlJBLCBpbnRlcnBvbGF0aW5nIGFuZCBkZWNpbWF0aW5nIik7CisKKwkvKiBzZXQgbWljIHRvIGJlIHRoZSByZWNvcmRpbmcgc291cmNlICovCisJdmFsID0gU09VTkRfTUFTS19NSUM7CisJbWl4ZGV2X2lvY3RsKHMtPmNvZGVjLCBTT1VORF9NSVhFUl9XUklURV9SRUNTUkMsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpICZ2YWwpOworCisJcmV0dXJuIDA7CisKKyBlcnJfZGV2MzoKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLT5kZXZfbWl4ZXIpOworIGVycl9kZXYyOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisgZXJyX2RldjE6CisJYXUxeHh4X2RiZG1hX2NoYW5fZnJlZShzLT5kbWFfYWRjLmRtYW5yKTsKKyBlcnJfZG1hMjoKKwlhdTF4eHhfZGJkbWFfY2hhbl9mcmVlKHMtPmRtYV9kYWMuZG1hbnIpOworIGVycl9kbWExOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihDUEhZU0FERFIoQUM5N19QU0NfU0VMKSwgMHgzMCk7CisKKwlhYzk3X3JlbGVhc2VfY29kZWMocy0+Y29kZWMpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CithdTE1NTBfcmVtb3ZlKHZvaWQpCit7CisJc3RydWN0IGF1MTU1MF9zdGF0ZSAqcyA9ICZhdTE1NTBfc3RhdGU7CisKKwlpZiAoIXMpCisJCXJldHVybjsKKwlzeW5jaHJvbml6ZV9pcnEoKTsKKwlhdTF4eHhfZGJkbWFfY2hhbl9mcmVlKHMtPmRtYV9hZGMuZG1hbnIpOworCWF1MXh4eF9kYmRtYV9jaGFuX2ZyZWUocy0+ZG1hX2RhYy5kbWFucik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKENQSFlTQUREUihBQzk3X1BTQ19TRUwpLCAweDMwKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+Y29kZWMtPmRldl9taXhlcik7CisJYWM5N19yZWxlYXNlX2NvZGVjKHMtPmNvZGVjKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK2luaXRfYXUxNTUwKHZvaWQpCit7CisJcmV0dXJuIGF1MTU1MF9wcm9iZSgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2NsZWFudXBfYXUxNTUwKHZvaWQpCit7CisJYXUxNTUwX3JlbW92ZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X2F1MTU1MCk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2F1MTU1MCk7CisKKyNpZm5kZWYgTU9EVUxFCisKK3N0YXRpYyBpbnQgX19pbml0CithdTE1NTBfc2V0dXAoY2hhciAqb3B0aW9ucykKK3sKKwljaGFyICAgICAgICAgICAqdGhpc19vcHQ7CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpKSB7CisJCWlmICghKnRoaXNfb3B0KQorCQkJY29udGludWU7CisJCWlmICghc3RybmNtcCh0aGlzX29wdCwgInZyYSIsIDMpKSB7CisJCQl2cmEgPSAxOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImF1MTU1MF9hdWRpbz0iLCBhdTE1NTBfc2V0dXApOworCisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYXVkaW8uYyBiL3NvdW5kL29zcy9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZGQ2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYXVkaW8uYwpAQCAtMCwwICsxLDk4MyBAQAorLyoKKyAqIHNvdW5kL2F1ZGlvLmMKKyAqCisgKiBEZXZpY2UgZmlsZSBtYW5hZ2VyIGZvciAvZGV2L2F1ZGlvCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisvKgorICogVGhvbWFzIFNhaWxlciAgIDogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICogVGhvbWFzIFNhaWxlciAgIDogbW92ZWQgc2V2ZXJhbCBzdGF0aWMgdmFyaWFibGVzIGludG8gc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMKKyAqICAgICAgICAgICAgICAgICAgICh3aGljaCBpcyBncm9zc2x5IG1pc25hbWVkIGJ0dy4pIGJlY2F1c2UgdGhleSBoYXZlIHRoZSBzYW1lCisgKiAgICAgICAgICAgICAgICAgICBsaWZldGltZSBhcyB0aGUgcmVzdCBpbiB0aGVyZSBhbmQgZHluYW1pYyBhbGxvY2F0aW9uIHNhdmVzCisgKiAgICAgICAgICAgICAgICAgICAxMmsgb3Igc28KKyAqIFRob21hcyBTYWlsZXIgICA6IHVzZSBtb3JlIGxvZ2ljYWwgT19OT05CTE9DSyBzZW1hbnRpY3MKKyAqIERhbmllbCBSb2RyaWtzc29uOiByZXdvcmtlZCB0aGUgdXNlIG9mIHRoZSBkZXZpY2Ugc3BlY2lmaWMgY29weV91c2VyCisgKiAgICAgICAgICAgICAgICAgICAgc3RpbGwgZ2VuZXJpYworICogSG9yc3Qgdm9uIEJyYW5kOiAgQWRkIG1pc3NpbmcgI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorICogQ2hyaXMgUmFua2luICAgIDogVXBkYXRlIHRoZSBtb2R1bGUtdXNhZ2UgY291bnRlciBmb3IgdGhlIGNvcHJvY2Vzc29yLAorICogICAgICAgICAgICAgICAgICAgYW5kIGRlY3JlbWVudCB0aGUgY291bnRlcnMgYWdhaW4gaWYgd2UgY2Fubm90IG9wZW4KKyAqICAgICAgICAgICAgICAgICAgIHRoZSBhdWRpbyBkZXZpY2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInVsYXcuaCIKKyNpbmNsdWRlICJjb3Byb2MuaCIKKworI2RlZmluZSBORVVUUkFMOAkweDgwCisjZGVmaW5lIE5FVVRSQUwxNgkweDAwCisKKworc3RhdGljIGludCAgICAgICAgICAgICBkbWFfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZyk7CisKK3N0YXRpYyBpbnQgc2V0X2Zvcm1hdChpbnQgZGV2LCBpbnQgZm10KQoreworCWlmIChmbXQgIT0gQUZNVF9RVUVSWSkKKwl7CisJCWF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbiA9IDA7CisKKwkJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5mb3JtYXRfbWFzayAmIGZtdCkpCS8qIE5vdCBzdXBwb3J0ZWQgKi8KKwkJeworCQkJaWYgKGZtdCA9PSBBRk1UX01VX0xBVykKKwkJCXsKKwkJCQlmbXQgPSBBRk1UX1U4OworCQkJCWF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbiA9IENOVl9NVV9MQVc7CisJCQl9CisJCQllbHNlCisJCQkJZm10ID0gQUZNVF9VODsJLyogVGhpcyBpcyBhbHdheXMgc3VwcG9ydGVkICovCisJCX0KKwkJYXVkaW9fZGV2c1tkZXZdLT5hdWRpb19mb3JtYXQgPSBhdWRpb19kZXZzW2Rldl0tPmQtPnNldF9iaXRzKGRldiwgZm10KTsKKwkJYXVkaW9fZGV2c1tkZXZdLT5sb2NhbF9mb3JtYXQgPSBmbXQ7CisJfQorCWVsc2UKKwkJcmV0dXJuIGF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfZm9ybWF0OworCisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbikKKwkJcmV0dXJuIGF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbjsKKwllbHNlIAorCQlyZXR1cm4gYXVkaW9fZGV2c1tkZXZdLT5sb2NhbF9mb3JtYXQ7Cit9CisKK2ludCBhdWRpb19vcGVuKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByZXQ7CisJaW50IGJpdHM7CisJaW50IGRldl90eXBlID0gZGV2ICYgMHgwZjsKKwlpbnQgbW9kZSA9IHRyYW5zbGF0ZV9tb2RlKGZpbGUpOworCWNvbnN0IHN0cnVjdCBhdWRpb19kcml2ZXIgKmRyaXZlcjsKKwljb25zdCBzdHJ1Y3QgY29wcm9jX29wZXJhdGlvbnMgKmNvcHJvY2Vzc29yOworCisJZGV2ID0gZGV2ID4+IDQ7CisKKwlpZiAoZGV2X3R5cGUgPT0gU05EX0RFVl9EU1AxNikKKwkJYml0cyA9IDE2OworCWVsc2UKKwkJYml0cyA9IDg7CisKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX2F1ZGlvZGV2cykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRyaXZlciA9IGF1ZGlvX2RldnNbZGV2XS0+ZDsKKworCWlmICghdHJ5X21vZHVsZV9nZXQoZHJpdmVyLT5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChyZXQgPSBETUFidWZfb3BlbihkZXYsIG1vZGUpKSA8IDApCisJCWdvdG8gZXJyb3JfMTsKKworCWlmICggKGNvcHJvY2Vzc29yID0gYXVkaW9fZGV2c1tkZXZdLT5jb3Byb2MpICE9IE5VTEwgKSB7CisJCWlmICghdHJ5X21vZHVsZV9nZXQoY29wcm9jZXNzb3ItPm93bmVyKSkKKwkJCWdvdG8gZXJyb3JfMjsKKworCQlpZiAoKHJldCA9IGNvcHJvY2Vzc29yLT5vcGVuKGNvcHJvY2Vzc29yLT5kZXZjLCBDT1BSX1BDTSkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQ6IENhbid0IGFjY2VzcyBjb3Byb2Nlc3NvciBkZXZpY2VcbiIpOworCQkJZ290byBlcnJvcl8zOworCQl9CisJfQorCQorCWF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbiA9IDA7CisKKwlpZiAoZGV2X3R5cGUgPT0gU05EX0RFVl9BVURJTykKKwkJc2V0X2Zvcm1hdChkZXYsIEFGTVRfTVVfTEFXKTsKKwllbHNlIAorCQlzZXRfZm9ybWF0KGRldiwgYml0cyk7CisKKwlhdWRpb19kZXZzW2Rldl0tPmF1ZGlvX21vZGUgPSBBTV9OT05FOworCisJcmV0dXJuIDA7CisKKwkvKgorCSAqIENsZWFuLXVwIHN0YWNrOiB0aGlzIGlzIHdoYXQgbmVlZHMgKHVuKWRvaW5nIGlmCisJICogd2UgY2FuJ3Qgb3BlbiB0aGUgYXVkaW8gZGV2aWNlIC4uLgorCSAqLworCWVycm9yXzM6CisJbW9kdWxlX3B1dChjb3Byb2Nlc3Nvci0+b3duZXIpOworCisJZXJyb3JfMjoKKwlETUFidWZfcmVsZWFzZShkZXYsIG1vZGUpOworCisJZXJyb3JfMToKKwltb2R1bGVfcHV0KGRyaXZlci0+b3duZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc3luY19vdXRwdXQoaW50IGRldikKK3sKKwlpbnQgICAgICAgICAgICAgcCwgaTsKKwlpbnQgICAgICAgICAgICAgbDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQ7CisKKwlpZiAoZG1hcC0+ZnJhZ21lbnRfc2l6ZSA8PSAwKQorCQlyZXR1cm47CisJZG1hcC0+ZmxhZ3MgfD0gRE1BX1BPU1Q7CisKKwkvKiBBbGlnbiB0aGUgd3JpdGUgcG9pbnRlciB3aXRoIGZyYWdtZW50IGJvdW5kYXJpZXMgKi8KKwkKKwlpZiAoKGwgPSBkbWFwLT51c2VyX2NvdW50ZXIgJSBkbWFwLT5mcmFnbWVudF9zaXplKSA+IDApCisJeworCQlpbnQgbGVuOworCQl1bnNpZ25lZCBsb25nIG9mZnMgPSBkbWFwLT51c2VyX2NvdW50ZXIgJSBkbWFwLT5ieXRlc19pbl91c2U7CisKKwkJbGVuID0gZG1hcC0+ZnJhZ21lbnRfc2l6ZSAtIGw7CisJCW1lbXNldChkbWFwLT5yYXdfYnVmICsgb2ZmcywgZG1hcC0+bmV1dHJhbF9ieXRlLCBsZW4pOworCQlETUFidWZfbW92ZV93cnBvaW50ZXIoZGV2LCBsZW4pOworCX0KKwkKKwkvKgorCSAqIENsZWFuIGFsbCB1bnVzZWQgYnVmZmVyIGZyYWdtZW50cy4KKwkgKi8KKworCXAgPSBkbWFwLT5xdGFpbDsKKwlkbWFwLT5mbGFncyB8PSBETUFfUE9TVDsKKworCWZvciAoaSA9IGRtYXAtPnFsZW4gKyAxOyBpIDwgZG1hcC0+bmJ1ZnM7IGkrKykKKwl7CisJCXAgPSAocCArIDEpICUgZG1hcC0+bmJ1ZnM7CisJCWlmICgoKGRtYXAtPnJhd19idWYgKyBwICogZG1hcC0+ZnJhZ21lbnRfc2l6ZSkgKyBkbWFwLT5mcmFnbWVudF9zaXplKSA+CisJCQkoZG1hcC0+cmF3X2J1ZiArIGRtYXAtPmJ1ZmZzaXplKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgImF1ZGlvOiBCdWZmZXIgZXJyb3IgMlxuIik7CisKKwkJbWVtc2V0KGRtYXAtPnJhd19idWYgKyBwICogZG1hcC0+ZnJhZ21lbnRfc2l6ZSwKKwkJCWRtYXAtPm5ldXRyYWxfYnl0ZSwKKwkJCWRtYXAtPmZyYWdtZW50X3NpemUpOworCX0KKworCWRtYXAtPmZsYWdzIHw9IERNQV9ESVJUWTsKK30KKwordm9pZCBhdWRpb19yZWxlYXNlKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNvbnN0IHN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAqY29wcm9jZXNzb3I7CisJaW50IG1vZGUgPSB0cmFuc2xhdGVfbW9kZShmaWxlKTsKKworCWRldiA9IGRldiA+PiA0OworCisJLyoKKwkgKiBXZSBkbyB0aGlzIGluIERNQWJ1Zl9yZWxlYXNlKCkuIFdoeSBhcmUgd2UgZG9pbmcgaXQKKwkgKiBoZXJlPyBXaHkgZG9uJ3Qgd2UgdGVzdCB0aGUgZmlsZSBtb2RlIGJlZm9yZSBzZXR0aW5nCisJICogYm90aCBmbGFncz8gRE1BYnVmX3JlbGVhc2UoKSBkb2VzLgorCSAqIC4uLnBlc3Rlci4uLnBlc3Rlci4uLnBlc3Rlci4uLgorCSAqLworCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmNsb3NpbmcgPSAxOworCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+Y2xvc2luZyA9IDE7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGFsbG9jYXRlZCB0aGUgZG1hcF9vdXQgYnVmZmVyCisJICogYmVmb3JlIHdlIGdvIG11Y2tpbmcgYXJvdW5kIHdpdGggaXQgaW4gc3luY19vdXRwdXQoKS4KKwkgKi8KKwlpZiAobW9kZSAmIE9QRU5fV1JJVEUpCisJCXN5bmNfb3V0cHV0KGRldik7CisKKwlpZiAoIChjb3Byb2Nlc3NvciA9IGF1ZGlvX2RldnNbZGV2XS0+Y29wcm9jKSAhPSBOVUxMICkgeworCQljb3Byb2Nlc3Nvci0+Y2xvc2UoY29wcm9jZXNzb3ItPmRldmMsIENPUFJfUENNKTsKKwkJbW9kdWxlX3B1dChjb3Byb2Nlc3Nvci0+b3duZXIpOworCX0KKwlETUFidWZfcmVsZWFzZShkZXYsIG1vZGUpOworCisJbW9kdWxlX3B1dChhdWRpb19kZXZzW2Rldl0tPmQtPm93bmVyKTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNsYXRlX2J5dGVzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhYmxlLCB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgbikKK3sKKwl1bnNpZ25lZCBsb25nICAgaTsKKworCWlmIChuIDw9IDApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisJCWJ1ZmZbaV0gPSB0YWJsZVtidWZmW2ldXTsKK30KKworaW50IGF1ZGlvX3dyaXRlKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IGMsIHAsIGwsIGJ1Zl9zaXplLCB1c2VkLCByZXR1cm5lZDsKKwlpbnQgZXJyOworCWNoYXIgKmRtYV9idWY7CisKKwlkZXYgPSBkZXYgPj4gNDsKKworCXAgPSAwOworCWMgPSBjb3VudDsKKwkKKwlpZihjb3VudCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0RVUExFWCkKKwkJYXVkaW9fZGV2c1tkZXZdLT5hdWRpb19tb2RlIHw9IEFNX1dSSVRFOworCWVsc2UKKwkJYXVkaW9fZGV2c1tkZXZdLT5hdWRpb19tb2RlID0gQU1fV1JJVEU7CisKKwlpZiAoIWNvdW50KQkJLyogRmx1c2ggb3V0cHV0ICovCisJeworCQkgIHN5bmNfb3V0cHV0KGRldik7CisJCSAgcmV0dXJuIDA7CisJfQorCQorCXdoaWxlIChjKQorCXsKKwkJaWYgKChlcnIgPSBETUFidWZfZ2V0d3JidWZmZXIoZGV2LCAmZG1hX2J1ZiwgJmJ1Zl9zaXplLCAhIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpKSA8IDApCisJCXsKKwkJCSAgICAvKiBIYW5kbGUgbm9uYmxvY2tpbmcgbW9kZSAqLworCQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgZXJyID09IC1FQUdBSU4pCisJCQkJcmV0dXJuIHA/IHAgOiAtRUFHQUlOOwkvKiBObyBtb3JlIHNwYWNlLiBSZXR1cm4gIyBvZiBhY2NlcHRlZCBieXRlcyAqLworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlsID0gYzsKKworCQlpZiAobCA+IGJ1Zl9zaXplKQorCQkJbCA9IGJ1Zl9zaXplOworCisJCXJldHVybmVkID0gbDsKKwkJdXNlZCA9IGw7CisJCWlmICghYXVkaW9fZGV2c1tkZXZdLT5kLT5jb3B5X3VzZXIpCisJCXsKKwkJCWlmICgoZG1hX2J1ZiArIGwpID4KKwkJCQkoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+cmF3X2J1ZiArIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmJ1ZmZzaXplKSkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgImF1ZGlvOiBCdWZmZXIgZXJyb3IgMyAoJWx4LCVkKSwgKCVseCwgJWQpXG4iLCAobG9uZykgZG1hX2J1ZiwgbCwgKGxvbmcpIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPnJhd19idWYsIChpbnQpIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmJ1ZmZzaXplKTsKKwkJCQlyZXR1cm4gLUVET007CisJCQl9CisJCQlpZiAoZG1hX2J1ZiA8IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPnJhd19idWYpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhdWRpbzogQnVmZmVyIGVycm9yIDEzICglbHg8JWx4KVxuIiwgKGxvbmcpIGRtYV9idWYsIChsb25nKSBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5yYXdfYnVmKTsKKwkJCQlyZXR1cm4gLUVET007CisJCQl9CisJCQlpZihjb3B5X2Zyb21fdXNlcihkbWFfYnVmLCAmKGJ1ZilbcF0sIGwpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9IAorCQllbHNlIGF1ZGlvX2RldnNbZGV2XS0+ZC0+Y29weV91c2VyIChkZXYsCisJCQkJCQlkbWFfYnVmLCAwLAorCQkJCQkJYnVmLCBwLAorCQkJCQkJYywgYnVmX3NpemUsCisJCQkJCQkmdXNlZCwgJnJldHVybmVkLAorCQkJCQkJbCk7CisJCWwgPSByZXR1cm5lZDsKKworCQlpZiAoYXVkaW9fZGV2c1tkZXZdLT5sb2NhbF9jb252ZXJzaW9uICYgQ05WX01VX0xBVykKKwkJeworCQkJdHJhbnNsYXRlX2J5dGVzKHVsYXdfZHNwLCAodW5zaWduZWQgY2hhciAqKSBkbWFfYnVmLCBsKTsKKwkJfQorCQljIC09IHVzZWQ7CisJCXAgKz0gdXNlZDsKKwkJRE1BYnVmX21vdmVfd3Jwb2ludGVyKGRldiwgbCk7CisKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBhdWRpb19yZWFkKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50ICAgICAgICAgICAgIGMsIHAsIGw7CisJY2hhciAgICAgICAgICAgKmRtYWJ1ZjsKKwlpbnQgICAgICAgICAgICAgYnVmX25vOworCisJZGV2ID0gZGV2ID4+IDQ7CisJcCA9IDA7CisJYyA9IGNvdW50OworCisJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKChhdWRpb19kZXZzW2Rldl0tPmF1ZGlvX21vZGUgJiBBTV9XUklURSkgJiYgIShhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0RVUExFWCkpCisJCXN5bmNfb3V0cHV0KGRldik7CisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9EVVBMRVgpCisJCWF1ZGlvX2RldnNbZGV2XS0+YXVkaW9fbW9kZSB8PSBBTV9SRUFEOworCWVsc2UKKwkJYXVkaW9fZGV2c1tkZXZdLT5hdWRpb19tb2RlID0gQU1fUkVBRDsKKworCXdoaWxlKGMpCisJeworCQlpZiAoKGJ1Zl9ubyA9IERNQWJ1Zl9nZXRyZGJ1ZmZlcihkZXYsICZkbWFidWYsICZsLCAhIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpKSA8IDApCisJCXsKKwkJCS8qCisJCQkgKglOb25ibG9ja2luZyBtb2RlIGhhbmRsaW5nLiBSZXR1cm4gY3VycmVudCAjIG9mIGJ5dGVzCisJCQkgKi8KKworCQkJaWYgKHAgPiAwKSAJCS8qIEF2b2lkIHRocm93aW5nIGF3YXkgZGF0YSAqLworCQkJCXJldHVybiBwOwkvKiBSZXR1cm4gaXQgaW5zdGVhZCAqLworCisJCQlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJiBidWZfbm8gPT0gLUVBR0FJTikKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKworCQkJcmV0dXJuIGJ1Zl9ubzsKKwkJfQorCQlpZiAobCA+IGMpCisJCQlsID0gYzsKKworCQkvKgorCQkgKiBJbnNlcnQgYW55IGxvY2FsIHByb2Nlc3NpbmcgaGVyZS4KKwkJICovCisKKwkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbiAmIENOVl9NVV9MQVcpCisJCXsKKwkJCXRyYW5zbGF0ZV9ieXRlcyhkc3BfdWxhdywgKHVuc2lnbmVkIGNoYXIgKikgZG1hYnVmLCBsKTsKKwkJfQorCQkKKwkJeworCQkJY2hhciAgICAgICAgICAgKmZpeGl0ID0gZG1hYnVmOworCisJCQlpZihjb3B5X3RvX3VzZXIoJihidWYpW3BdLCBmaXhpdCwgbCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX07CisKKwkJRE1BYnVmX3JtY2hhcnMoZGV2LCBidWZfbm8sIGwpOworCisJCXAgKz0gbDsKKwkJYyAtPSBsOworCX0KKworCXJldHVybiBjb3VudCAtIGM7Cit9CisKK2ludCBhdWRpb19pb2N0bChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgdmFsLCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwOworCWludCBfX3VzZXIgKnAgPSBhcmc7CisKKwlkZXYgPSBkZXYgPj4gNDsKKworCWlmIChfSU9DX1RZUEUoY21kKSA9PSAnQycpCXsKKwkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+Y29wcm9jKQkvKiBDb3Byb2Nlc3NvciBpb2N0bCAqLworCQkJcmV0dXJuIGF1ZGlvX2RldnNbZGV2XS0+Y29wcm9jLT5pb2N0bChhdWRpb19kZXZzW2Rldl0tPmNvcHJvYy0+ZGV2YywgY21kLCBhcmcsIDApOworCQkvKiBlbHNlCisJCSAgICAgICAgcHJpbnRrKEtFUk5fREVCVUciL2Rldi9kc3AlZDogTm8gY29wcm9jZXNzb3IgZm9yIHRoaXMgZGV2aWNlXG4iLCBkZXYpOyAqLworCQlyZXR1cm4gLUVOWElPOworCX0KKwllbHNlIHN3aXRjaCAoY21kKSAKKwl7CisJCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQkJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5mcmFnbWVudF9zaXplID09IDApCisJCQkJcmV0dXJuIDA7CisJCQlzeW5jX291dHB1dChkZXYpOworCQkJRE1BYnVmX3N5bmMoZGV2KTsKKwkJCURNQWJ1Zl9yZXNldChkZXYpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCQlpZiAoIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpKQorCQkJCXJldHVybiAwOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmZyYWdtZW50X3NpemUgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmZsYWdzIHw9IERNQV9QT1NUIHwgRE1BX0RJUlRZOworCQkJc3luY19vdXRwdXQoZGV2KTsKKwkJCWRtYV9pb2N0bChkZXYsIFNORENUTF9EU1BfUE9TVCwgTlVMTCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCQlhdWRpb19kZXZzW2Rldl0tPmF1ZGlvX21vZGUgPSBBTV9OT05FOworCQkJRE1BYnVmX3Jlc2V0KGRldik7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKKwkJCXZhbCA9IGF1ZGlvX2RldnNbZGV2XS0+Zm9ybWF0X21hc2sgfCBBRk1UX01VX0xBVzsKKwkJCWJyZWFrOworCQorCQljYXNlIFNORENUTF9EU1BfU0VURk1UOgorCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl2YWwgPSBzZXRfZm9ybWF0KGRldiwgdmFsKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCQlpZiAoIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCkpCisJCQkJcmV0dXJuIDA7CisgIAkJCWlmICgoYXVkaW9fZGV2c1tkZXZdLT5hdWRpb19tb2RlICYgQU1fV1JJVEUpICYmICEoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9EVVBMRVgpKQorICAJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCXJldHVybiBkbWFfaW9jdGwoZGV2LCBjbWQsIGFyZyk7CisKKwkJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJCWlmICghKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9XUklURSkpCisJCQkJcmV0dXJuIC1FUEVSTTsKKyAgCQkJaWYgKChhdWRpb19kZXZzW2Rldl0tPmF1ZGlvX21vZGUgJiBBTV9SRUFEKSAmJiAhKGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfRFVQTEVYKSkKKyAgCQkJCXJldHVybiAtRUJVU1k7CisJCQlyZXR1cm4gZG1hX2lvY3RsKGRldiwgY21kLCBhcmcpOworCQkKKwkJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQkJZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCQkJdmFsID0gMSB8IERTUF9DQVBfTU1BUDsJLyogUmV2aXNpb24gbGV2ZWwgb2YgdGhpcyBpb2N0bCgpICovCisJCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfRFVQTEVYICYmCisJCQkJCWF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlID09IE9QRU5fUkVBRFdSSVRFKQorCQkJCQl2YWwgfD0gRFNQX0NBUF9EVVBMRVg7CisJCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+Y29wcm9jKQorCQkJCQl2YWwgfD0gRFNQX0NBUF9DT1BST0M7CisJCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZC0+bG9jYWxfcWxlbikJLyogRGV2aWNlIGhhcyBoaWRkZW4gYnVmZmVycyAqLworCQkJCQl2YWwgfD0gRFNQX0NBUF9CQVRDSDsKKwkJCQlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kLT50cmlnZ2VyKQkvKiBTdXBwb3J0cyBTRVRUUklHR0VSICovCisJCQkJCXZhbCB8PSBEU1BfQ0FQX1RSSUdHRVI7CisJCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBTT1VORF9QQ01fV1JJVEVfUkFURToKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdmFsID0gYXVkaW9fZGV2c1tkZXZdLT5kLT5zZXRfc3BlZWQoZGV2LCB2YWwpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQkJdmFsID0gYXVkaW9fZGV2c1tkZXZdLT5kLT5zZXRfc3BlZWQoZGV2LCAwKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh2YWwgPiAxIHx8IHZhbCA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl2YWwgPSBhdWRpb19kZXZzW2Rldl0tPmQtPnNldF9jaGFubmVscyhkZXYsIHZhbCArIDEpIC0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTOgorCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl2YWwgPSBhdWRpb19kZXZzW2Rldl0tPmQtPnNldF9jaGFubmVscyhkZXYsIHZhbCk7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQkJdmFsID0gYXVkaW9fZGV2c1tkZXZdLT5kLT5zZXRfY2hhbm5lbHMoZGV2LCAwKTsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQkJdmFsID0gYXVkaW9fZGV2c1tkZXZdLT5kLT5zZXRfYml0cyhkZXYsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJCWlmIChhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAhPSBPUEVOX1JFQURXUklURSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJcmV0dXJuIChhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0RVUExFWCkgPyAwIDogLUVJTzsKKworCQljYXNlIFNORENUTF9EU1BfUFJPRklMRToKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9XUklURSkKKwkJCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5hcHBsaWNfcHJvZmlsZSA9IHZhbDsKKwkJCWlmIChhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCkKKwkJCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmFwcGxpY19wcm9maWxlID0gdmFsOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQkJZG1hcCA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQ7CisJCQlpZiAoIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfQUxMT0NfRE9ORSkpCisJCQl7CisJCQkJdmFsPTA7CisJCQkJYnJlYWs7CisJCQl9CisJCQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQkJLyogQ29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcGxheWVkICovCisJCQljb3VudCA9IERNQWJ1Zl9nZXRfYnVmZmVyX3BvaW50ZXIgKGRldiwgZG1hcCwgRE1PREVfT1VUUFVUKTsKKwkJCWlmIChjb3VudCA8IGRtYXAtPmZyYWdtZW50X3NpemUgJiYgZG1hcC0+cWhlYWQgIT0gMCkKKwkJCQljb3VudCArPSBkbWFwLT5ieXRlc19pbl91c2U7CS8qIFBvaW50ZXIgd3JhcCBub3QgaGFuZGxlZCB5ZXQgKi8KKwkJCWNvdW50ICs9IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCisJCQkvKiBTdWJzdHJhY3QgY3VycmVudCBjb3VudCBmcm9tIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieSBhcHAgKi8KKwkJCWNvdW50ID0gZG1hcC0+dXNlcl9jb3VudGVyIC0gY291bnQ7CisJCQlpZiAoY291bnQgPCAwKQorCQkJCWNvdW50ID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQkJdmFsID0gY291bnQ7CisJCQlicmVhazsKKwkJCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZG1hX2lvY3RsKGRldiwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKK30KKwordm9pZCBhdWRpb19pbml0X2RldmljZXModm9pZCkKK3sKKwkvKgorCSAqIE5PVEUhIFRoaXMgcm91dGluZSBjb3VsZCBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBkdXJpbmcgYm9vdC4KKwkgKi8KK30KKwordm9pZCByZW9yZ2FuaXplX2J1ZmZlcnMoaW50IGRldiwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAsIGludCByZWNvcmRpbmcpCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgYnJlYWtzIHRoZSBwaHlzaWNhbCBkZXZpY2UgYnVmZmVycyB0byBsb2dpY2FsIG9uZXMuCisJICovCisKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqZHNwX2RldiA9IGF1ZGlvX2RldnNbZGV2XTsKKworCXVuc2lnbmVkIGksIG47CisJdW5zaWduZWQgc3IsIG5jLCBzeiwgYnN6OworCisJc3IgPSBkc3BfZGV2LT5kLT5zZXRfc3BlZWQoZGV2LCAwKTsKKwluYyA9IGRzcF9kZXYtPmQtPnNldF9jaGFubmVscyhkZXYsIDApOworCXN6ID0gZHNwX2Rldi0+ZC0+c2V0X2JpdHMoZGV2LCAwKTsKKworCWlmIChzeiA9PSA4KQorCQlkbWFwLT5uZXV0cmFsX2J5dGUgPSBORVVUUkFMODsKKwllbHNlCisJCWRtYXAtPm5ldXRyYWxfYnl0ZSA9IE5FVVRSQUwxNjsKKworCWlmIChzciA8IDEgfHwgbmMgPCAxIHx8IHN6IDwgMSkKKwl7CisvKgkJcHJpbnRrKEtFUk5fREVCVUcgIldhcm5pbmc6IEludmFsaWQgUENNIHBhcmFtZXRlcnNbJWRdIHNyPSVkLCBuYz0lZCwgc3o9JWRcbiIsIGRldiwgc3IsIG5jLCBzeik7Ki8KKwkJc3IgPSBEU1BfREVGQVVMVF9TUEVFRDsKKwkJbmMgPSAxOworCQlzeiA9IDg7CisJfQorCQorCXN6ID0gc3IgKiBuYyAqIHN6OworCisJc3ogLz0gODsJCS8qICNiaXRzIC0+ICNieXRlcyAqLworCWRtYXAtPmRhdGFfcmF0ZSA9IHN6OworCisJaWYgKCFkbWFwLT5uZWVkc19yZW9yZykKKwkJcmV0dXJuOworCWRtYXAtPm5lZWRzX3Jlb3JnID0gMDsKKworCWlmIChkbWFwLT5mcmFnbWVudF9zaXplID09IDApCisJewkKKwkJLyogQ29tcHV0ZSB0aGUgZnJhZ21lbnQgc2l6ZSB1c2luZyB0aGUgZGVmYXVsdCBhbGdvcml0aG0gKi8KKworCQkvKgorCQkgKiBDb21wdXRlIGEgYnVmZmVyIHNpemUgZm9yIHRpbWUgbm90IGV4Y2VlZGluZyAxIHNlY29uZC4KKwkJICogVXN1YWxseSB0aGlzIGFsZ29yaXRobSBnaXZlcyBhIGJ1ZmZlciBzaXplIGZvciAwLjUgdG8gMS4wIHNlY29uZHMKKwkJICogb2Ygc291bmQgKHVzaW5nIHRoZSBjdXJyZW50IHNwZWVkLCBzYW1wbGUgc2l6ZSBhbmQgI2NoYW5uZWxzKS4KKwkJICovCisKKwkJYnN6ID0gZG1hcC0+YnVmZnNpemU7CisJCXdoaWxlIChic3ogPiBzeikKKwkJCWJzeiAvPSAyOworCisJCWlmIChic3ogPT0gZG1hcC0+YnVmZnNpemUpCisJCQlic3ogLz0gMjsJLyogTmVlZHMgYXQgbGVhc3QgMiBidWZmZXJzICovCisKKwkJLyoKKwkJICogICAgU3BsaXQgdGhlIGNvbXB1dGVkIGZyYWdtZW50IHRvIHNtYWxsZXIgcGFydHMuIEFmdGVyIDMuNWE5CisJCSAqICAgICAgdGhlIGRlZmF1bHQgc3ViZGl2aXNpb24gaXMgNCB3aGljaCBzaG91bGQgZ2l2ZSBiZXR0ZXIKKwkJICogICAgICByZXN1bHRzIHdoZW4gcmVjb3JkaW5nLgorCQkgKi8KKworCQlpZiAoZG1hcC0+c3ViZGl2aXNpb24gPT0gMCkJLyogTm90IGFscmVhZHkgc2V0ICovCisJCXsKKwkJCWRtYXAtPnN1YmRpdmlzaW9uID0gNDsJLyogSW5pdCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAqLworCisJCQlpZiAoKGJzeiAvIGRtYXAtPnN1YmRpdmlzaW9uKSA+IDQwOTYpCisJCQkJZG1hcC0+c3ViZGl2aXNpb24gKj0gMjsKKwkJCWlmICgoYnN6IC8gZG1hcC0+c3ViZGl2aXNpb24pIDwgNDA5NikKKwkJCQlkbWFwLT5zdWJkaXZpc2lvbiA9IDE7CisJCX0KKwkJYnN6IC89IGRtYXAtPnN1YmRpdmlzaW9uOworCisJCWlmIChic3ogPCAxNikKKwkJCWJzeiA9IDE2OwkvKiBKdXN0IGEgc2FuaXR5IGNoZWNrICovCisKKwkJZG1hcC0+ZnJhZ21lbnRfc2l6ZSA9IGJzejsKKwl9CisJZWxzZQorCXsKKwkJLyoKKwkJICogVGhlIHByb2Nlc3MgaGFzIHNwZWNpZmllZCB0aGUgYnVmZmVyIHNpemUgd2l0aCBTTkRDVExfRFNQX1NFVEZSQUdNRU5UIG9yCisJCSAqIHRoZSBidWZmZXIgc2l6ZSBjb21wdXRhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuCisJCSAqLworCQlpZiAoZG1hcC0+ZnJhZ21lbnRfc2l6ZSA+IChkbWFwLT5idWZmc2l6ZSAvIDIpKQorCQkJZG1hcC0+ZnJhZ21lbnRfc2l6ZSA9IChkbWFwLT5idWZmc2l6ZSAvIDIpOworCQlic3ogPSBkbWFwLT5mcmFnbWVudF9zaXplOworCX0KKworCWlmIChhdWRpb19kZXZzW2Rldl0tPm1pbl9mcmFnbWVudCkKKwkJaWYgKGJzeiA8ICgxIDw8IGF1ZGlvX2RldnNbZGV2XS0+bWluX2ZyYWdtZW50KSkKKwkJCWJzeiA9IDEgPDwgYXVkaW9fZGV2c1tkZXZdLT5taW5fZnJhZ21lbnQ7CisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+bWF4X2ZyYWdtZW50KQorCQlpZiAoYnN6ID4gKDEgPDwgYXVkaW9fZGV2c1tkZXZdLT5tYXhfZnJhZ21lbnQpKQorCQkJYnN6ID0gMSA8PCBhdWRpb19kZXZzW2Rldl0tPm1heF9mcmFnbWVudDsKKwlic3ogJj0gfjB4MDc7CQkvKiBGb3JjZSBzaXplIHdoaWNoIGlzIG11bHRpcGxlIG9mIDggYnl0ZXMgKi8KKyNpZmRlZiBPU19ETUFfQUxJR05fQ0hFQ0sKKwlPU19ETUFfQUxJR05fQ0hFQ0soYnN6KTsKKyNlbmRpZgorCisJbiA9IGRtYXAtPmJ1ZmZzaXplIC8gYnN6OworCWlmIChuID4gTUFYX1NVQl9CVUZGRVJTKQorCQluID0gTUFYX1NVQl9CVUZGRVJTOworCWlmIChuID4gZG1hcC0+bWF4X2ZyYWdtZW50cykKKwkJbiA9IGRtYXAtPm1heF9mcmFnbWVudHM7CisKKwlpZiAobiA8IDIpCisJeworCQluID0gMjsKKwkJYnN6IC89IDI7CisJfQorCWRtYXAtPm5idWZzID0gbjsKKwlkbWFwLT5ieXRlc19pbl91c2UgPSBuICogYnN6OworCWRtYXAtPmZyYWdtZW50X3NpemUgPSBic3o7CisJZG1hcC0+bWF4X2J5dGVfY291bnRlciA9IChkbWFwLT5kYXRhX3JhdGUgKiA2MCAqIDYwKSArCisJCQlkbWFwLT5ieXRlc19pbl91c2U7CS8qIEFwcHJveGltYXRlbHkgb25lIGhvdXIgKi8KKworCWlmIChkbWFwLT5yYXdfYnVmKQorCXsKKwkJbWVtc2V0KGRtYXAtPnJhd19idWYsIGRtYXAtPm5ldXRyYWxfYnl0ZSwgZG1hcC0+Ynl0ZXNfaW5fdXNlKTsKKwl9CisJCisJZm9yIChpID0gMDsgaSA8IGRtYXAtPm5idWZzOyBpKyspCisJeworCQlkbWFwLT5jb3VudHNbaV0gPSAwOworCX0KKworCWRtYXAtPmZsYWdzIHw9IERNQV9BTExPQ19ET05FIHwgRE1BX0VNUFRZOworfQorCitzdGF0aWMgaW50IGRtYV9zdWJkaXZpZGUoaW50IGRldiwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAsIGludCBmYWN0KQoreworCWlmIChmYWN0ID09IDApIAorCXsKKwkJZmFjdCA9IGRtYXAtPnN1YmRpdmlzaW9uOworCQlpZiAoZmFjdCA9PSAwKQorCQkJZmFjdCA9IDE7CisJCXJldHVybiBmYWN0OworCX0KKwlpZiAoZG1hcC0+c3ViZGl2aXNpb24gIT0gMCB8fCBkbWFwLT5mcmFnbWVudF9zaXplKQkvKiBUb28gbGF0ZSB0byBjaGFuZ2UgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZmFjdCA+IE1BWF9SRUFMVElNRV9GQUNUT1IpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZhY3QgIT0gMSAmJiBmYWN0ICE9IDIgJiYgZmFjdCAhPSA0ICYmIGZhY3QgIT0gOCAmJiBmYWN0ICE9IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRtYXAtPnN1YmRpdmlzaW9uID0gZmFjdDsKKwlyZXR1cm4gZmFjdDsKK30KKworc3RhdGljIGludCBkbWFfc2V0X2ZyYWdtZW50KGludCBkZXYsIHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwLCBpbnQgZmFjdCkKK3sKKwlpbnQgYnl0ZXMsIGNvdW50OworCisJaWYgKGZhY3QgPT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoZG1hcC0+c3ViZGl2aXNpb24gIT0gMCB8fAorCSAgICBkbWFwLT5mcmFnbWVudF9zaXplKQkvKiBUb28gbGF0ZSB0byBjaGFuZ2UgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlieXRlcyA9IGZhY3QgJiAweGZmZmY7CisJY291bnQgPSAoZmFjdCA+PiAxNikgJiAweDdmZmY7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJY291bnQgPSBNQVhfU1VCX0JVRkZFUlM7CisJZWxzZSBpZiAoY291bnQgPCBNQVhfU1VCX0JVRkZFUlMpCisJCWNvdW50Kys7CisKKwlpZiAoYnl0ZXMgPCA0IHx8IGJ5dGVzID4gMTcpCS8qIDwxNiB8fCA+IDUxMmsgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY291bnQgPCAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhdWRpb19kZXZzW2Rldl0tPm1pbl9mcmFnbWVudCA+IDApCisJCWlmIChieXRlcyA8IGF1ZGlvX2RldnNbZGV2XS0+bWluX2ZyYWdtZW50KQorCQkJYnl0ZXMgPSBhdWRpb19kZXZzW2Rldl0tPm1pbl9mcmFnbWVudDsKKworCWlmIChhdWRpb19kZXZzW2Rldl0tPm1heF9mcmFnbWVudCA+IDApCisJCWlmIChieXRlcyA+IGF1ZGlvX2RldnNbZGV2XS0+bWF4X2ZyYWdtZW50KQorCQkJYnl0ZXMgPSBhdWRpb19kZXZzW2Rldl0tPm1heF9mcmFnbWVudDsKKworI2lmZGVmIE9TX0RNQV9NSU5CSVRTCisJaWYgKGJ5dGVzIDwgT1NfRE1BX01JTkJJVFMpCisJCWJ5dGVzID0gT1NfRE1BX01JTkJJVFM7CisjZW5kaWYKKworCWRtYXAtPmZyYWdtZW50X3NpemUgPSAoMSA8PCBieXRlcyk7CisJZG1hcC0+bWF4X2ZyYWdtZW50cyA9IGNvdW50OworCisJaWYgKGRtYXAtPmZyYWdtZW50X3NpemUgPiBkbWFwLT5idWZmc2l6ZSkKKwkJZG1hcC0+ZnJhZ21lbnRfc2l6ZSA9IGRtYXAtPmJ1ZmZzaXplOworCisJaWYgKGRtYXAtPmZyYWdtZW50X3NpemUgPT0gZG1hcC0+YnVmZnNpemUgJiYKKwkgICAgYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9BVVRPTU9ERSkKKwkJZG1hcC0+ZnJhZ21lbnRfc2l6ZSAvPSAyOwkvKiBOZWVkcyBhdCBsZWFzdCAyIGJ1ZmZlcnMgKi8KKworCWRtYXAtPnN1YmRpdmlzaW9uID0gMTsJLyogRGlzYWJsZSBTTkRDVExfRFNQX1NVQkRJVklERSAqLworCXJldHVybiBieXRlcyB8ICgoY291bnQgLSAxKSA8PCAxNik7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXBfb3V0ID0gYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcF9pbiA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbjsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcDsKKwlhdWRpb19idWZfaW5mbyBpbmZvOworCWNvdW50X2luZm8gY2luZm87CisJaW50IGZhY3QsIHJldCwgY2hhbmdlZCwgYml0cywgY291bnQsIGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChjbWQpIAorCXsKKwkJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJCXJldCA9IDA7CisJCQlpZiAoZ2V0X3VzZXIoZmFjdCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9XUklURSkKKwkJCQlyZXQgPSBkbWFfc3ViZGl2aWRlKGRldiwgZG1hcF9vdXQsIGZhY3QpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCWlmIChhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAhPSBPUEVOX1dSSVRFIHx8CisJCQkJKGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfRFVQTEVYICYmCisJCQkJCWF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9SRUFEKSkKKwkJCQlyZXQgPSBkbWFfc3ViZGl2aWRlKGRldiwgZG1hcF9pbiwgZmFjdCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJCWRtYXAgPSBkbWFwX291dDsKKwkJCWlmIChjbWQgPT0gU05EQ1RMX0RTUF9HRVRJU1BBQ0UgJiYgIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY21kID09IFNORENUTF9EU1BfR0VUT1NQQUNFICYmICEoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChjbWQgPT0gU05EQ1RMX0RTUF9HRVRJU1BBQ0UgJiYgYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9EVVBMRVgpCisJCQkJZG1hcCA9IGRtYXBfaW47CisJCQlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfQUxMT0NfRE9ORSkpCisJCQkJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgZG1hcCwgKGNtZCA9PSBTTkRDVExfRFNQX0dFVElTUEFDRSkpOworCQkJaW5mby5mcmFnc3RvdGFsID0gZG1hcC0+bmJ1ZnM7CisJCQlpZiAoY21kID09IFNORENUTF9EU1BfR0VUSVNQQUNFKQorCQkJCWluZm8uZnJhZ21lbnRzID0gZG1hcC0+cWxlbjsKKwkJCWVsc2UgCisJCQl7CisJCQkJaWYgKCFETUFidWZfc3BhY2VfaW5fcXVldWUoZGV2KSkKKwkJCQkJaW5mby5mcmFnbWVudHMgPSAwOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWluZm8uZnJhZ21lbnRzID0gRE1BYnVmX3NwYWNlX2luX3F1ZXVlKGRldik7CisJCQkJCWlmIChhdWRpb19kZXZzW2Rldl0tPmQtPmxvY2FsX3FsZW4pIAorCQkJCQl7CisJCQkJCQlpbnQgdG1wID0gYXVkaW9fZGV2c1tkZXZdLT5kLT5sb2NhbF9xbGVuKGRldik7CisJCQkJCQlpZiAodG1wICYmIGluZm8uZnJhZ21lbnRzKQorCQkJCQkJCXRtcC0tOwkvKgorCQkJCQkJCQkgKiBUaGlzIGJ1ZmZlciBoYXMgYmVlbiBjb3VudGVkIHR3aWNlCisJCQkJCQkJCSAqLworCQkJCQkJaW5mby5mcmFnbWVudHMgLT0gdG1wOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGluZm8uZnJhZ21lbnRzIDwgMCkKKwkJCQlpbmZvLmZyYWdtZW50cyA9IDA7CisJCQllbHNlIGlmIChpbmZvLmZyYWdtZW50cyA+IGRtYXAtPm5idWZzKQorCQkJCWluZm8uZnJhZ21lbnRzID0gZG1hcC0+bmJ1ZnM7CisKKwkJCWluZm8uZnJhZ3NpemUgPSBkbWFwLT5mcmFnbWVudF9zaXplOworCQkJaW5mby5ieXRlcyA9IGluZm8uZnJhZ21lbnRzICogZG1hcC0+ZnJhZ21lbnRfc2l6ZTsKKworCQkJaWYgKGNtZCA9PSBTTkRDVExfRFNQX0dFVElTUEFDRSAmJiBkbWFwLT5xbGVuKQorCQkJCWluZm8uYnl0ZXMgLT0gZG1hcC0+Y291bnRzW2RtYXAtPnFoZWFkXTsKKwkJCWVsc2UgCisJCQl7CisJCQkJaW5mby5mcmFnbWVudHMgPSBpbmZvLmJ5dGVzIC8gZG1hcC0+ZnJhZ21lbnRfc2l6ZTsKKwkJCQlpbmZvLmJ5dGVzIC09IGRtYXAtPnVzZXJfY291bnRlciAlIGRtYXAtPmZyYWdtZW50X3NpemU7CisJCQl9CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJCWlmIChnZXRfdXNlcihiaXRzLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQliaXRzICY9IGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZC0+dHJpZ2dlciA9PSBOVUxMKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9EVVBMRVgpICYmIChiaXRzICYgUENNX0VOQUJMRV9JTlBVVCkgJiYKKwkJCQkoYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKGJpdHMgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQkJeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwX2luLT5sb2NrLGZsYWdzKTsKKwkJCQljaGFuZ2VkID0gKGF1ZGlvX2RldnNbZGV2XS0+ZW5hYmxlX2JpdHMgXiBiaXRzKSAmIFBDTV9FTkFCTEVfSU5QVVQ7CisJCQkJaWYgKGNoYW5nZWQgJiYgYXVkaW9fZGV2c1tkZXZdLT5nbykgCisJCQkJeworCQkJCQlyZW9yZ2FuaXplX2J1ZmZlcnMoZGV2LCBkbWFwX2luLCAxKTsKKwkJCQkJaWYgKChlcnIgPSBhdWRpb19kZXZzW2Rldl0tPmQtPnByZXBhcmVfZm9yX2lucHV0KGRldiwKKwkJCQkJCSAgICAgZG1hcF9pbi0+ZnJhZ21lbnRfc2l6ZSwgZG1hcF9pbi0+bmJ1ZnMpKSA8IDApIHsKKwkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXBfaW4tPmxvY2ssZmxhZ3MpOworCQkJCQkJcmV0dXJuIC1lcnI7CisJCQkJCX0KKwkJCQkJZG1hcF9pbi0+ZG1hX21vZGUgPSBETU9ERV9JTlBVVDsKKwkJCQkJYXVkaW9fZGV2c1tkZXZdLT5lbmFibGVfYml0cyB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQkJCQlETUFidWZfYWN0aXZhdGVfcmVjb3JkaW5nKGRldiwgZG1hcF9pbik7CisJCQkJfSBlbHNlCisJCQkJCWF1ZGlvX2RldnNbZGV2XS0+ZW5hYmxlX2JpdHMgJj0gflBDTV9FTkFCTEVfSU5QVVQ7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcF9pbi0+bG9jayxmbGFncyk7CisJCQl9CisJCQlpZiAoYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKQorCQkJeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwX291dC0+bG9jayxmbGFncyk7CisJCQkJY2hhbmdlZCA9IChhdWRpb19kZXZzW2Rldl0tPmVuYWJsZV9iaXRzIF4gYml0cykgJiBQQ01fRU5BQkxFX09VVFBVVDsKKwkJCQlpZiAoY2hhbmdlZCAmJgorCQkJCSAgICAoZG1hcF9vdXQtPm1hcHBpbmdfZmxhZ3MgJiBETUFfTUFQX01BUFBFRCB8fCBkbWFwX291dC0+cWxlbiA+IDApICYmCisJCQkJICAgIGF1ZGlvX2RldnNbZGV2XS0+Z28pIAorCQkJCXsKKwkJCQkJaWYgKCEoZG1hcF9vdXQtPmZsYWdzICYgRE1BX0FMTE9DX0RPTkUpKQorCQkJCQkJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgZG1hcF9vdXQsIDApOworCQkJCQlkbWFwX291dC0+ZG1hX21vZGUgPSBETU9ERV9PVVRQVVQ7CisJCQkJCWF1ZGlvX2RldnNbZGV2XS0+ZW5hYmxlX2JpdHMgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCQkJCWRtYXBfb3V0LT5jb3VudHNbZG1hcF9vdXQtPnFoZWFkXSA9IGRtYXBfb3V0LT5mcmFnbWVudF9zaXplOworCQkJCQlETUFidWZfbGF1bmNoX291dHB1dChkZXYsIGRtYXBfb3V0KTsKKwkJCQl9IGVsc2UKKwkJCQkJYXVkaW9fZGV2c1tkZXZdLT5lbmFibGVfYml0cyAmPSB+UENNX0VOQUJMRV9PVVRQVVQ7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcF9vdXQtPmxvY2ssZmxhZ3MpOworCQkJfQorI2lmIDAKKwkJCWlmIChjaGFuZ2VkICYmIGF1ZGlvX2RldnNbZGV2XS0+ZC0+dHJpZ2dlcikKKwkJCQlhdWRpb19kZXZzW2Rldl0tPmQtPnRyaWdnZXIoZGV2LCBiaXRzICogYXVkaW9fZGV2c1tkZXZdLT5nbyk7CisjZW5kaWYJCQkJCisJCQkvKiBGYWxscyB0aHJvdWdoLi4uICovCisKKwkJY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCQlyZXQgPSBhdWRpb19kZXZzW2Rldl0tPmVuYWJsZV9iaXRzOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwkJCWlmICghYXVkaW9fZGV2c1tkZXZdLT5kLT50cmlnZ2VyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYXVkaW9fZGV2c1tkZXZdLT5kLT50cmlnZ2VyKGRldiwgMCk7CisJCQlhdWRpb19kZXZzW2Rldl0tPmdvID0gMDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQkJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXBfaW4tPmxvY2ssZmxhZ3MpOworCQkJY2luZm8uYnl0ZXMgPSBkbWFwX2luLT5ieXRlX2NvdW50ZXI7CisJCQljaW5mby5wdHIgPSBETUFidWZfZ2V0X2J1ZmZlcl9wb2ludGVyKGRldiwgZG1hcF9pbiwgRE1PREVfSU5QVVQpICYgfjM7CisJCQlpZiAoY2luZm8ucHRyIDwgZG1hcF9pbi0+ZnJhZ21lbnRfc2l6ZSAmJiBkbWFwX2luLT5xdGFpbCAhPSAwKQorCQkJCWNpbmZvLmJ5dGVzICs9IGRtYXBfaW4tPmJ5dGVzX2luX3VzZTsJLyogUG9pbnRlciB3cmFwIG5vdCBoYW5kbGVkIHlldCAqLworCQkJY2luZm8uYmxvY2tzID0gZG1hcF9pbi0+cWxlbjsKKwkJCWNpbmZvLmJ5dGVzICs9IGNpbmZvLnB0cjsKKwkJCWlmIChkbWFwX2luLT5tYXBwaW5nX2ZsYWdzICYgRE1BX01BUF9NQVBQRUQpCisJCQkJZG1hcF9pbi0+cWxlbiA9IDA7CS8qIFJlc2V0IGludGVycnVwdCBjb3VudGVyICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwX2luLT5sb2NrLGZsYWdzKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCQlpZiAoIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hcF9vdXQtPmxvY2ssZmxhZ3MpOworCQkJY2luZm8uYnl0ZXMgPSBkbWFwX291dC0+Ynl0ZV9jb3VudGVyOworCQkJY2luZm8ucHRyID0gRE1BYnVmX2dldF9idWZmZXJfcG9pbnRlcihkZXYsIGRtYXBfb3V0LCBETU9ERV9PVVRQVVQpICYgfjM7CisJCQlpZiAoY2luZm8ucHRyIDwgZG1hcF9vdXQtPmZyYWdtZW50X3NpemUgJiYgZG1hcF9vdXQtPnFoZWFkICE9IDApCisJCQkJY2luZm8uYnl0ZXMgKz0gZG1hcF9vdXQtPmJ5dGVzX2luX3VzZTsJLyogUG9pbnRlciB3cmFwIG5vdCBoYW5kbGVkIHlldCAqLworCQkJY2luZm8uYmxvY2tzID0gZG1hcF9vdXQtPnFsZW47CisJCQljaW5mby5ieXRlcyArPSBjaW5mby5wdHI7CisJCQlpZiAoZG1hcF9vdXQtPm1hcHBpbmdfZmxhZ3MgJiBETUFfTUFQX01BUFBFRCkKKwkJCQlkbWFwX291dC0+cWxlbiA9IDA7CS8qIFJlc2V0IGludGVycnVwdCBjb3VudGVyICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwX291dC0+bG9jayxmbGFncyk7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCQlpZiAoIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCEoZG1hcF9vdXQtPmZsYWdzICYgRE1BX0FMTE9DX0RPTkUpKQorCQkJeworCQkJCXJldD0wOworCQkJCWJyZWFrOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXBfb3V0LT5sb2NrLGZsYWdzKTsKKwkJCS8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHBsYXllZCAqLworCQkJY291bnQgPSBETUFidWZfZ2V0X2J1ZmZlcl9wb2ludGVyIChkZXYsIGRtYXBfb3V0LCBETU9ERV9PVVRQVVQpOworCQkJaWYgKGNvdW50IDwgZG1hcF9vdXQtPmZyYWdtZW50X3NpemUgJiYgZG1hcF9vdXQtPnFoZWFkICE9IDApCisJCQkJY291bnQgKz0gZG1hcF9vdXQtPmJ5dGVzX2luX3VzZTsJLyogUG9pbnRlciB3cmFwIG5vdCBoYW5kbGVkIHlldCAqLworCQkJY291bnQgKz0gZG1hcF9vdXQtPmJ5dGVfY291bnRlcjsKKwkJCS8qIFN1YnN0cmFjdCBjdXJyZW50IGNvdW50IGZyb20gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGJ5IGFwcCAqLworCQkJY291bnQgPSBkbWFwX291dC0+dXNlcl9jb3VudGVyIC0gY291bnQ7CisJCQlpZiAoY291bnQgPCAwKQorCQkJCWNvdW50ID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXBfb3V0LT5sb2NrLGZsYWdzKTsKKwkJCXJldCA9IGNvdW50OworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCQlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+cWxlbiA+IDApCisJCQkJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZmxhZ3MgJiBETUFfQUNUSVZFKSkKKwkJCQkJRE1BYnVmX2xhdW5jaF9vdXRwdXQoZGV2LCBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0KTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQkJZG1hcCA9IGRtYXBfb3V0OworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9XUklURSkKKwkJCQlyZW9yZ2FuaXplX2J1ZmZlcnMoZGV2LCBkbWFwX291dCwgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlID09IE9QRU5fUkVBRCkpOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlID09IE9QRU5fUkVBRCB8fAorCQkJICAgIChhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0RVUExFWCAmJgorCQkJICAgICBhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCkpCisJCQkJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgZG1hcF9pbiwgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlID09IE9QRU5fUkVBRCkpOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlID09IE9QRU5fUkVBRCkKKwkJCQlkbWFwID0gZG1hcF9pbjsKKwkJCXJldCA9IGRtYXAtPmZyYWdtZW50X3NpemU7CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCQlyZXQgPSAwOworCQkJaWYgKGdldF91c2VyKGZhY3QsIChpbnQgX191c2VyICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpCisJCQkJcmV0ID0gZG1hX3NldF9mcmFnbWVudChkZXYsIGRtYXBfb3V0LCBmYWN0KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgPT0gT1BFTl9SRUFEIHx8CisJCQkgICAgKGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfRFVQTEVYICYmCisJCQkgICAgIGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9SRUFEKSkKKwkJCQlyZXQgPSBkbWFfc2V0X2ZyYWdtZW50KGRldiwgZG1hcF9pbiwgZmFjdCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKCFhcmcpIC8qIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGdvb2QgZm9yLCBidXQgcHJlc2VydmUgb2xkIHNlbWFudGljcyAqLworCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmICghYXVkaW9fZGV2c1tkZXZdLT5kLT5pb2N0bCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBhdWRpb19kZXZzW2Rldl0tPmQtPmlvY3RsKGRldiwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKWFyZyk7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYXVkaW9fc3ltcy5jIGIvc291bmQvb3NzL2F1ZGlvX3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGEyMTdmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2F1ZGlvX3N5bXMuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogRXhwb3J0ZWQgc3ltYm9scyBmb3IgYXVkaW8gZHJpdmVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworY2hhciBhdWRpb19zeW1zX3N5bWJvbDsKKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInNvdW5kX2NhbGxzLmgiCisKK0VYUE9SVF9TWU1CT0woRE1BYnVmX3N0YXJ0X2RtYSk7CitFWFBPUlRfU1lNQk9MKERNQWJ1Zl9vcGVuX2RtYSk7CitFWFBPUlRfU1lNQk9MKERNQWJ1Zl9jbG9zZV9kbWEpOworRVhQT1JUX1NZTUJPTChETUFidWZfaW5wdXRpbnRyKTsKK0VYUE9SVF9TWU1CT0woRE1BYnVmX291dHB1dGludHIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2F3ZV9ody5oIGIvc291bmQvb3NzL2F3ZV9ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDAzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYXdlX2h3LmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIHNvdW5kL2F3ZV9ody5oCisgKgorICogQWNjZXNzIHJvdXRpbmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgdGhlIGxvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSAKKyAqIENyZWF0aXZlIEFXRTMyL1NCMzIvQVdFNjQgd2F2ZSB0YWJsZSBzeW50aC4KKyAqICAgdmVyc2lvbiAwLjQuNDsgSmFuLiA0LCAyMDAwCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAgVGFrYXNoaSBJd2FpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBBV0VfSFdfSF9ERUYKKyNkZWZpbmUgQVdFX0hXX0hfREVGCisKKy8qCisgKiBFbXUtODAwMCBjb250cm9sIHJlZ2lzdGVycworICogbmFtZShjaGFubmVsKQlyZWcsIHBvcnQKKyAqLworCisjZGVmaW5lIGF3ZV9jbWRfaWR4KHJlZyxjaCkJKCgocmVnKTw8IDUpIHwgKGNoKSkKKworI2RlZmluZSBEYXRhMCAgICAwCQkvKiAweDYyMDogZG91Ymxld29yZCByL3cgKi8KKyNkZWZpbmUgRGF0YTEgICAgMQkJLyogMHhBMjA6IGRvdWJsZXdvcmQgci93ICovCisjZGVmaW5lIERhdGEyICAgIDIJCS8qIDB4QTIyOiB3b3JkIHIvdyAqLworI2RlZmluZSBEYXRhMyAgICAzCQkvKiAweEUyMDogd29yZCByL3cgKi8KKyNkZWZpbmUgUG9pbnRlciAgNAkJLyogMHhFMjIgcmVnaXN0ZXIgcG9pbnRlciByL3cgKi8KKworI2RlZmluZSBBV0VfQ1BGKGNoKQlhd2VfY21kX2lkeCgwLGNoKSwgRGF0YTAJLyogRFc6IGN1cnJlbnQgcGl0Y2ggYW5kIGZyYWN0aW9uYWwgYWRkcmVzcyAqLworI2RlZmluZSBBV0VfUFRSWChjaCkJYXdlX2NtZF9pZHgoMSxjaCksIERhdGEwCS8qIERXOiBwaXRjaCB0YXJnZXQgYW5kIHJldmVyYiBzZW5kICovCisjZGVmaW5lIEFXRV9DVkNGKGNoKQlhd2VfY21kX2lkeCgyLGNoKSwgRGF0YTAJLyogRFc6IGN1cnJlbnQgdm9sdW1lIGFuZCBmaWx0ZXIgY3V0b2ZmICovCisjZGVmaW5lIEFXRV9WVEZUKGNoKQlhd2VfY21kX2lkeCgzLGNoKSwgRGF0YTAJLyogRFc6IHZvbHVtZSBhbmQgZmlsdGVyIGN1dG9mZiB0YXJnZXRzICovCisjZGVmaW5lIEFXRV8wMDgwKGNoKQlhd2VfY21kX2lkeCg0LGNoKSwgRGF0YTAJLyogRFc6ID8/ICovCisjZGVmaW5lIEFXRV8wMEEwKGNoKQlhd2VfY21kX2lkeCg1LGNoKSwgRGF0YTAJLyogRFc6ID8/ICovCisjZGVmaW5lIEFXRV9QU1NUKGNoKQlhd2VfY21kX2lkeCg2LGNoKSwgRGF0YTAJLyogRFc6IHBhbiBzZW5kIGFuZCBsb29wIHN0YXJ0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQVdFX0NTTChjaCkJYXdlX2NtZF9pZHgoNyxjaCksIERhdGEwCS8qIERXOiBjaG9ydXMgc2VuZCBhbmQgbG9vcCBlbmQgYWRkcmVzcyAqLworI2RlZmluZSBBV0VfQ0NDQShjaCkJYXdlX2NtZF9pZHgoMCxjaCksIERhdGExCS8qIERXOiBRLCBjb250cm9sIGJpdHMsIGFuZCBjdXJyZW50IGFkZHJlc3MgKi8KKyNkZWZpbmUgQVdFX0hXQ0Y0CWF3ZV9jbWRfaWR4KDEsOSksICBEYXRhMQkvKiBEVzogY29uZmlnIGR3IDQgKi8KKyNkZWZpbmUgQVdFX0hXQ0Y1CWF3ZV9jbWRfaWR4KDEsMTApLCBEYXRhMQkvKiBEVzogY29uZmlnIGR3IDUgKi8KKyNkZWZpbmUgQVdFX0hXQ0Y2CWF3ZV9jbWRfaWR4KDEsMTMpLCBEYXRhMQkvKiBEVzogY29uZmlnIGR3IDYgKi8KKyNkZWZpbmUgQVdFX0hXQ0Y3CWF3ZV9jbWRfaWR4KDEsMTQpLCBEYXRhMQkvKiBEVzogY29uZmlnIGR3IDc/IChub3QgZG9jdW1lbnRlZCkgKi8KKyNkZWZpbmUgQVdFX1NNQUxSCWF3ZV9jbWRfaWR4KDEsMjApLCBEYXRhMQkvKiBEVzogc291bmQgbWVtb3J5IGFkZHJlc3MgZm9yIGxlZnQgcmVhZCAqLworI2RlZmluZSBBV0VfU01BUlIJYXdlX2NtZF9pZHgoMSwyMSksIERhdGExCS8qIERXOiAgICBmb3IgcmlnaHQgcmVhZCAqLworI2RlZmluZSBBV0VfU01BTFcJYXdlX2NtZF9pZHgoMSwyMiksIERhdGExCS8qIERXOiBzb3VuZCBtZW1vcnkgYWRkcmVzcyBmb3IgbGVmdCB3cml0ZSAqLworI2RlZmluZSBBV0VfU01BUlcJYXdlX2NtZF9pZHgoMSwyMyksIERhdGExCS8qIERXOiAgICBmb3IgcmlnaHQgd3JpdGUgKi8KKyNkZWZpbmUgQVdFX1NNTEQJYXdlX2NtZF9pZHgoMSwyNiksIERhdGExCS8qIFc6IHNvdW5kIG1lbW9yeSBsZWZ0IGRhdGEgKi8KKyNkZWZpbmUgQVdFX1NNUkQJYXdlX2NtZF9pZHgoMSwyNiksIERhdGEyCS8qIFc6ICAgIHJpZ2h0IGRhdGEgKi8KKyNkZWZpbmUgQVdFX1dDCQlhd2VfY21kX2lkeCgxLDI3KSwgRGF0YTIJLyogVzogc2FtcGxlIGNvdW50ZXIgKi8KKyNkZWZpbmUgQVdFX1dDX0NtZAlhd2VfY21kX2lkeCgxLDI3KQorI2RlZmluZSBBV0VfV0NfUG9ydAlEYXRhMgorI2RlZmluZSBBV0VfSFdDRjEJYXdlX2NtZF9pZHgoMSwyOSksIERhdGExCS8qIFc6IGNvbmZpZyB3IDEgKi8KKyNkZWZpbmUgQVdFX0hXQ0YyCWF3ZV9jbWRfaWR4KDEsMzApLCBEYXRhMQkvKiBXOiBjb25maWcgdyAyICovCisjZGVmaW5lIEFXRV9IV0NGMwlhd2VfY21kX2lkeCgxLDMxKSwgRGF0YTEJLyogVzogY29uZmlnIHcgMyAqLworI2RlZmluZSBBV0VfSU5JVDEoY2gpCWF3ZV9jbWRfaWR4KDIsY2gpLCBEYXRhMQkvKiBXOiBpbml0IGFycmF5IDEgKi8KKyNkZWZpbmUgQVdFX0lOSVQyKGNoKQlhd2VfY21kX2lkeCgyLGNoKSwgRGF0YTIJLyogVzogaW5pdCBhcnJheSAyICovCisjZGVmaW5lIEFXRV9JTklUMyhjaCkJYXdlX2NtZF9pZHgoMyxjaCksIERhdGExCS8qIFc6IGluaXQgYXJyYXkgMyAqLworI2RlZmluZSBBV0VfSU5JVDQoY2gpCWF3ZV9jbWRfaWR4KDMsY2gpLCBEYXRhMgkvKiBXOiBpbml0IGFycmF5IDQgKi8KKyNkZWZpbmUgQVdFX0VOVlZPTChjaCkJYXdlX2NtZF9pZHgoNCxjaCksIERhdGExCS8qIFc6IHZvbHVtZSBlbnZlbG9wZSBkZWxheSAqLworI2RlZmluZSBBV0VfRENZU1VTVihjaCkJYXdlX2NtZF9pZHgoNSxjaCksIERhdGExCS8qIFc6IHZvbHVtZSBlbnZlbG9wZSBzdXN0YWluIGFuZCBkZWNheSAqLworI2RlZmluZSBBV0VfRU5WVkFMKGNoKQlhd2VfY21kX2lkeCg2LGNoKSwgRGF0YTEJLyogVzogbW9kdWxhdGlvbiBlbnZlbG9wZSBkZWxheSAqLworI2RlZmluZSBBV0VfRENZU1VTKGNoKQlhd2VfY21kX2lkeCg3LGNoKSwgRGF0YTEJLyogVzogbW9kdWxhdGlvbiBlbnZlbG9wZSBzdXN0YWluIGFuZCBkZWNheSAqLworI2RlZmluZSBBV0VfQVRLSExEVihjaCkJYXdlX2NtZF9pZHgoNCxjaCksIERhdGEyCS8qIFc6IHZvbHVtZSBlbnZlbG9wZSBhdHRhY2sgYW5kIGhvbGQgKi8KKyNkZWZpbmUgQVdFX0xGTzFWQUwoY2gpCWF3ZV9jbWRfaWR4KDUsY2gpLCBEYXRhMgkvKiBXOiBMRk8jMSBEZWxheSAqLworI2RlZmluZSBBV0VfQVRLSExEKGNoKQlhd2VfY21kX2lkeCg2LGNoKSwgRGF0YTIJLyogVzogbW9kdWxhdGlvbiBlbnZlbG9wZSBhdHRhY2sgYW5kIGhvbGQgKi8KKyNkZWZpbmUgQVdFX0xGTzJWQUwoY2gpCWF3ZV9jbWRfaWR4KDcsY2gpLCBEYXRhMgkvKiBXOiBMRk8jMiBEZWxheSAqLworI2RlZmluZSBBV0VfSVAoY2gpCWF3ZV9jbWRfaWR4KDAsY2gpLCBEYXRhMwkvKiBXOiBpbml0aWFsIHBpdGNoICovCisjZGVmaW5lIEFXRV9JRkFUTihjaCkJYXdlX2NtZF9pZHgoMSxjaCksIERhdGEzCS8qIFc6IGluaXRpYWwgZmlsdGVyIGN1dG9mZiBhbmQgYXR0ZW51YXRpb24gKi8KKyNkZWZpbmUgQVdFX1BFRkUoY2gpCWF3ZV9jbWRfaWR4KDIsY2gpLCBEYXRhMwkvKiBXOiBwaXRjaCBhbmQgZmlsdGVyIGVudmVsb3BlIGhlaWdodHMgKi8KKyNkZWZpbmUgQVdFX0ZNTU9EKGNoKQlhd2VfY21kX2lkeCgzLGNoKSwgRGF0YTMJLyogVzogdmlicmF0byBhbmQgZmlsdGVyIG1vZHVsYXRpb24gZnJlcSAqLworI2RlZmluZSBBV0VfVFJFTUZSUShjaCkJYXdlX2NtZF9pZHgoNCxjaCksIERhdGEzCS8qIFc6IExGTyMxIHRyZW1vbG8gYW1vdW50IGFuZCBmcmVxICovCisjZGVmaW5lIEFXRV9GTTJGUlEyKGNoKQlhd2VfY21kX2lkeCg1LGNoKSwgRGF0YTMJLyogVzogTEZPIzIgdmlicmF0byBhbW91bnQgYW5kIGZyZXEgKi8KKworLyogdXNlZCBkdXJpbmcgZGV0ZWN0aW9uIChyZXR1cm5zIFJPTSB2ZXJzaW9uPzsgbm90IGRvY3VtZW50ZWQgaW4gQURJUCkgKi8KKyNkZWZpbmUgQVdFX1UxCQkweEUwLCBEYXRhMwkgIC8qIChSKShXKSB1c2VkIGluIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIEFXRV9VMihjaCkJMHhDMCsoY2gpLCBEYXRhMyAgLyogKFcpKFcpIHVzZWQgaW4gaW5pdCBlbnZlbG9wZSAgKi8KKworCisjZGVmaW5lIEFXRV9NQVhfVk9JQ0VTCQkzMgorI2RlZmluZSBBV0VfTk9STUFMX1ZPSUNFUwkzMAkvKjMwJjMxIGFyZSByZXNlcnZlZCBmb3IgRFJBTSByZWZyZXNoKi8KKworI2RlZmluZSBBV0VfTUFYX0NIQU5ORUxTCTMyCS8qIG1heCBtaWRpIGNoYW5uZWxzIChtdXN0ID49IHZvaWNlcykgKi8KKyNkZWZpbmUgQVdFX01BWF9MQVlFUlMJQVdFX01BWF9WT0lDRVMJLyogbWF4aW11bSBudW1iZXIgb2YgbXVsdGlwbGUgbGF5ZXJzICovCisKKyNkZWZpbmUgQVdFX0RSQU1fT0ZGU0VUCQkweDIwMDAwMAorI2RlZmluZSBBV0VfTUFYX0RSQU1fU0laRQkoMjggKiAxMDI0KQkvKiAyOCBNQiBpcyBtYXggb25ib2FyZCBtZW1vcnkgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYXdlX3dhdmUuYyBiL3NvdW5kL29zcy9hd2Vfd2F2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjliZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYXdlX3dhdmUuYwpAQCAtMCwwICsxLDYxNDcgQEAKKy8qCisgKiBzb3VuZC9hd2Vfd2F2ZS5jCisgKgorICogVGhlIGxvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSBBV0UzMi9TQjMyL0FXRTY0IHdhdmUgdGFibGUgc3ludGguCisgKiAgIHZlcnNpb24gMC40LjQ7IEphbi4gNCwgMjAwMAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwIFRha2FzaGkgSXdhaQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiBDaGFuZ2Vsb2c6CisgKiBBdWcgMTgsIDIwMDMsIEFkYW0gQmVsYXkgPGFtYngxQG5lby5yci5jb20+CisgKiAtIGRldGVjdGlvbiBjb2RlIHJld3JpdGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvYXdlX3ZvaWNlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJhd2Vfd2F2ZS5oIgorI2luY2x1ZGUgImF3ZV9ody5oIgorCisjaWZkZWYgQVdFX0hBU19HVVNfQ09NUEFUSUJJTElUWQorI2luY2x1ZGUgInR1bmluZy5oIgorI2luY2x1ZGUgPGxpbnV4L3VsdHJhc291bmQuaD4KKyNlbmRpZgorCisvKgorICogZGVidWcgbWVzc2FnZQorICovCisKKyNpZmRlZiBBV0VfREVCVUdfT04KKyNkZWZpbmUgREVCVUcoTFZMLFhYWCkJe2lmIChjdHJsc1tBV0VfTURfREVCVUdfTU9ERV0gPiBMVkwpIHsgWFhYOyB9fQorI2RlZmluZSBFUlJNU0coWFhYKQl7aWYgKGN0cmxzW0FXRV9NRF9ERUJVR19NT0RFXSkgeyBYWFg7IH19CisjZGVmaW5lIEZBVEFMRVJSKFhYWCkJWFhYCisjZWxzZQorI2RlZmluZSBERUJVRyhMVkwsWFhYKSAvKiovCisjZGVmaW5lIEVSUk1TRyhYWFgpCVhYWAorI2RlZmluZSBGQVRBTEVSUihYWFgpCVhYWAorI2VuZGlmCisKKy8qCisgKiBiYW5rIGFuZCB2b2ljZSByZWNvcmQKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfc2ZfbGlzdCBzZl9saXN0OwordHlwZWRlZiBzdHJ1Y3QgX2F3ZV92b2ljZV9saXN0IGF3ZV92b2ljZV9saXN0OwordHlwZWRlZiBzdHJ1Y3QgX2F3ZV9zYW1wbGVfbGlzdCBhd2Vfc2FtcGxlX2xpc3Q7CisKKy8qIHNvdW5kZm9udCByZWNvcmQgKi8KK3N0cnVjdCBfc2ZfbGlzdCB7CisJdW5zaWduZWQgc2hvcnQgc2ZfaWQ7CS8qIGlkIG51bWJlciAqLworCXVuc2lnbmVkIHNob3J0IHR5cGU7CS8qIGxvY2sgJiBzaGFyZWQgZmxhZ3MgKi8KKwlpbnQgbnVtX2luZm87CQkvKiBjdXJyZW50IGluZm8gdGFibGUgaW5kZXggKi8KKwlpbnQgbnVtX3NhbXBsZTsJCS8qIGN1cnJlbnQgc2FtcGxlIHRhYmxlIGluZGV4ICovCisJaW50IG1lbV9wdHI7CQkvKiBjdXJyZW50IHdvcmQgYnl0ZSBwb2ludGVyICovCisJYXdlX3ZvaWNlX2xpc3QgKmluZm9zLCAqbGFzdF9pbmZvczsJLyogaW5zdHJ1bWVudHMgKi8KKwlhd2Vfc2FtcGxlX2xpc3QgKnNhbXBsZXMsICpsYXN0X3NhbXBsZXM7CS8qIHNhbXBsZXMgKi8KKyNpZmRlZiBBV0VfQUxMT1dfU0FNUExFX1NIQVJJTkcKKwlzZl9saXN0ICpzaGFyZWQ7CS8qIHNoYXJlZCBsaXN0ICovCisJdW5zaWduZWQgY2hhciBuYW1lW0FXRV9QQVRDSF9OQU1FX0xFTl07CS8qIHNoYXJpbmcgaWQgKi8KKyNlbmRpZgorCXNmX2xpc3QgKm5leHQsICpwcmV2OworfTsKKworLyogaW5zdHJ1bWVudCBsaXN0ICovCitzdHJ1Y3QgX2F3ZV92b2ljZV9saXN0IHsKKwlhd2Vfdm9pY2VfaW5mbyB2OwkvKiBpbnN0cnVtZW50IGluZm9ybWF0aW9uICovCisJc2ZfbGlzdCAqaG9sZGVyOwkvKiBwYXJlbnQgc2ZfbGlzdCBvZiB0aGlzIHJlY29yZCAqLworCXVuc2lnbmVkIGNoYXIgYmFuaywgaW5zdHI7CS8qIHByZXNldCBudW1iZXIgaW5mb3JtYXRpb24gKi8KKwljaGFyIHR5cGUsIGRpc2FibGVkOwkvKiB0eXBlPW5vcm1hbC9tYXBwZWQsIGRpc2FibGVkPWJvb2xlYW4gKi8KKwlhd2Vfdm9pY2VfbGlzdCAqbmV4dDsJLyogbGlua2VkIGxpc3Qgd2l0aCBzYW1lIHNmX2lkICovCisJYXdlX3ZvaWNlX2xpc3QgKm5leHRfaW5zdHI7CS8qIGluc3RydW1lbnQgbGlzdCAqLworCWF3ZV92b2ljZV9saXN0ICpuZXh0X2Jhbms7CS8qIGhhc2ggdGFibGUgbGlzdCAqLworfTsKKworLyogdm9pY2UgbGlzdCB0eXBlICovCisjZGVmaW5lIFZfU1RfTk9STUFMCTAKKyNkZWZpbmUgVl9TVF9NQVBQRUQJMQorCisvKiBzYW1wbGUgbGlzdCAqLworc3RydWN0IF9hd2Vfc2FtcGxlX2xpc3QgeworCWF3ZV9zYW1wbGVfaW5mbyB2OwkvKiBzYW1wbGUgaW5mb3JtYXRpb24gKi8KKwlzZl9saXN0ICpob2xkZXI7CS8qIHBhcmVudCBzZl9saXN0IG9mIHRoaXMgcmVjb3JkICovCisJYXdlX3NhbXBsZV9saXN0ICpuZXh0OwkvKiBsaW5rZWQgbGlzdCB3aXRoIHNhbWUgc2ZfaWQgKi8KK307CisKKy8qIHNhbXBsZSBhbmQgaW5mb3JtYXRpb24gdGFibGUgKi8KK3N0YXRpYyBpbnQgY3VycmVudF9zZl9pZDsJLyogY3VycmVudCBudW1iZXIgb2YgZm9udHMgKi8KK3N0YXRpYyBpbnQgbG9ja2VkX3NmX2lkOwkvKiBsb2NrZWQgcG9zaXRpb24gKi8KK3N0YXRpYyBzZl9saXN0ICpzZmhlYWQsICpzZnRhaWw7CS8qIGxpbmtlZC1saXN0cyAqLworCisjZGVmaW5lIGF3ZV9mcmVlX21lbV9wdHIoKSAoc2Z0YWlsID8gc2Z0YWlsLT5tZW1fcHRyIDogMCkKKyNkZWZpbmUgYXdlX2ZyZWVfaW5mbygpIChzZnRhaWwgPyBzZnRhaWwtPm51bV9pbmZvIDogMCkKKyNkZWZpbmUgYXdlX2ZyZWVfc2FtcGxlKCkgKHNmdGFpbCA/IHNmdGFpbC0+bnVtX3NhbXBsZSA6IDApCisKKyNkZWZpbmUgQVdFX01BWF9QUkVTRVRTCQkyNTYKKyNkZWZpbmUgQVdFX0RFRkFVTFRfUFJFU0VUCTAKKyNkZWZpbmUgQVdFX0RFRkFVTFRfQkFOSwkwCisjZGVmaW5lIEFXRV9ERUZBVUxUX0RSVU0JMAorI2RlZmluZSBBV0VfRFJVTV9CQU5LCQkxMjgKKworI2RlZmluZSBNQVhfTEFZRVJTCUFXRV9NQVhfVk9JQ0VTCisKKy8qIHByZXNldCB0YWJsZSBpbmRleCAqLworc3RhdGljIGF3ZV92b2ljZV9saXN0ICpwcmVzZXRfdGFibGVbQVdFX01BWF9QUkVTRVRTXTsKKworLyoKKyAqIHZvaWNlIHRhYmxlCisgKi8KKworLyogZWZmZWN0cyB0YWJsZSAqLwordHlwZWRlZglzdHJ1Y3QgRlhfUmVjIHsgLyogY2hhbm5lbCBlZmZlY3RzICovCisJdW5zaWduZWQgY2hhciBmbGFnc1tBV0VfRlhfRU5EXTsKKwlzaG9ydCB2YWxbQVdFX0ZYX0VORF07Cit9IEZYX1JlYzsKKworCisvKiBjaGFubmVsIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IF9hd2VfY2hhbl9pbmZvIHsKKwlpbnQgY2hhbm5lbDsJCS8qIGNoYW5uZWwgbnVtYmVyICovCisJaW50IGJhbms7CQkvKiBjdXJyZW50IHRvbmUgYmFuayAqLworCWludCBpbnN0cjsJCS8qIGN1cnJlbnQgcHJvZ3JhbSAqLworCWludCBiZW5kZXI7CQkvKiBtaWRpIHBpdGNoYmVuZCAoLTgxOTIgLSA4MTkyKSAqLworCWludCBiZW5kZXJfcmFuZ2U7CS8qIG1pZGkgYmVuZGVyIHJhbmdlICh4MTAwKSAqLworCWludCBwYW5uaW5nOwkJLyogcGFubmluZyAoMC0xMjcpICovCisJaW50IG1haW5fdm9sOwkJLyogY2hhbm5lbCB2b2x1bWUgKDAtMTI3KSAqLworCWludCBleHByZXNzaW9uX3ZvbDsJLyogbWlkaSBleHByZXNzaW9uICgwLTEyNykgKi8KKwlpbnQgY2hhbl9wcmVzczsJCS8qIGNoYW5uZWwgcHJlc3N1cmUgKi8KKwlpbnQgc3VzdGFpbmVkOwkJLyogc3VzdGFpbiBzdGF0dXMgaW4gTUlESSAqLworCUZYX1JlYyBmeDsJCS8qIGVmZmVjdHMgKi8KKwlGWF9SZWMgZnhfbGF5ZXJbTUFYX0xBWUVSU107IC8qIGxheWVyIGVmZmVjdHMgKi8KK30gYXdlX2NoYW5faW5mbzsKKworLyogdm9pY2UgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgX3ZvaWNlX2luZm8geworCWludCBzdGF0ZTsKKyNkZWZpbmUgQVdFX1NUX09GRgkJKDE8PDApCS8qIG5vIHNvdW5kICovCisjZGVmaW5lIEFXRV9TVF9PTgkJKDE8PDEpCS8qIHBsYXlpbmcgKi8KKyNkZWZpbmUgQVdFX1NUX1NUQU5EQlkJCSgxPDwyKQkvKiBzdGFuZCBieSBmb3IgcGxheWluZyAqLworI2RlZmluZSBBV0VfU1RfU1VTVEFJTkVECSgxPDwzKQkvKiBzdXN0YWluZWQgKi8KKyNkZWZpbmUgQVdFX1NUX01BUksJCSgxPDw0KQkvKiBtYXJrZWQgZm9yIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgQVdFX1NUX0RSQU0JCSgxPDw1KQkvKiBEUkFNIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgQVdFX1NUX0ZNCQkoMTw8NikJLyogcmVzZXJ2ZWQgZm9yIEZNICovCisjZGVmaW5lIEFXRV9TVF9SRUxFQVNFRAkJKDE8PDcpCS8qIHJlbGVhc2VkICovCisKKwlpbnQgY2g7CQkJLyogbWlkaSBjaGFubmVsICovCisJaW50IGtleTsJCS8qIGludGVybmFsIGtleSBmb3Igc2VhcmNoICovCisJaW50IGxheWVyOwkJLyogbGF5ZXIgbnVtYmVyIChmb3IgY2hhbm5lbCBtb2RlIG9ubHkpICovCisJaW50IHRpbWU7CQkvKiBhbGxvY2F0ZWQgdGltZSAqLworCWF3ZV9jaGFuX2luZm8JKmNpbmZvOwkvKiBjaGFubmVsIGluZm8gKi8KKworCWludCBub3RlOwkJLyogbWlkaSBrZXkgKDAtMTI3KSAqLworCWludCB2ZWxvY2l0eTsJCS8qIG1pZGkgdmVsb2NpdHkgKDAtMTI3KSAqLworCWludCBzb3N0ZW51dG87CQkvKiBzb3N0ZW51dG8gb24vb2ZmICovCisJYXdlX3ZvaWNlX2luZm8gKnNhbXBsZTsJLyogYXNzaWduZWQgdm9pY2UgKi8KKworCS8qIEVNVTgwMDAgcGFyYW1ldGVycyAqLworCWludCBhcGl0Y2g7CQkvKiBwaXRjaCBwYXJhbWV0ZXIgKi8KKwlpbnQgYXZvbDsJCS8qIHZvbHVtZSBwYXJhbWV0ZXIgKi8KKwlpbnQgYXBhbjsJCS8qIHBhbm5pbmcgcGFyYW1ldGVyICovCisJaW50IGFjdXRvZmY7CQkvKiBjdXRvZmYgcGFyYW1ldGVyICovCisJc2hvcnQgYWF1eDsJCS8qIGF1eCB3b3JkICovCit9IHZvaWNlX2luZm87CisKKy8qIHZvaWNlIGluZm9ybWF0aW9uICovCitzdGF0aWMgdm9pY2VfaW5mbyB2b2ljZXNbQVdFX01BWF9WT0lDRVNdOworCisjZGVmaW5lIElTX05PX1NPVU5EKHYpCSh2b2ljZXNbdl0uc3RhdGUgJiAoQVdFX1NUX09GRnxBV0VfU1RfUkVMRUFTRUR8QVdFX1NUX1NUQU5EQll8QVdFX1NUX1NVU1RBSU5FRCkpCisjZGVmaW5lIElTX05PX0VGRkVDVCh2KQkodm9pY2VzW3ZdLnN0YXRlICE9IEFXRV9TVF9PTikKKyNkZWZpbmUgSVNfUExBWUlORyh2KQkodm9pY2VzW3ZdLnN0YXRlICYgKEFXRV9TVF9PTnxBV0VfU1RfU1VTVEFJTkVEfEFXRV9TVF9SRUxFQVNFRCkpCisjZGVmaW5lIElTX0VNUFRZKHYpCSh2b2ljZXNbdl0uc3RhdGUgJiAoQVdFX1NUX09GRnxBV0VfU1RfTUFSS3xBV0VfU1RfRFJBTXxBV0VfU1RfRk0pKQorCisKKy8qIE1JREkgY2hhbm5lbCBlZmZlY3RzIGluZm9ybWF0aW9uIChmb3IgaHcgY29udHJvbCkgKi8KK3N0YXRpYyBhd2VfY2hhbl9pbmZvIGNoYW5uZWxzW0FXRV9NQVhfQ0hBTk5FTFNdOworCisKKy8qCisgKiBnbG9iYWwgdmFyaWFibGVzCisgKi8KKworI2lmbmRlZiBBV0VfREVGQVVMVF9CQVNFX0FERFIKKyNkZWZpbmUgQVdFX0RFRkFVTFRfQkFTRV9BRERSCTAJLyogYXV0b2RldGVjdCAqLworI2VuZGlmCisKKyNpZm5kZWYgQVdFX0RFRkFVTFRfTUVNX1NJWkUKKyNkZWZpbmUgQVdFX0RFRkFVTFRfTUVNX1NJWkUJLTEJLyogYXV0b2RldGVjdCAqLworI2VuZGlmCisKK3N0YXRpYyBpbnQgaW8gPSBBV0VfREVGQVVMVF9CQVNFX0FERFI7IC8qIEVtdTgwMDAgYmFzZSBhZGRyZXNzICovCitzdGF0aWMgaW50IG1lbXNpemUgPSBBV0VfREVGQVVMVF9NRU1fU0laRTsgLyogbWVtb3J5IHNpemUgaW4gS2J5dGVzICovCisjaWZkZWYgQ09ORklHX1BOUAorc3RhdGljIGludCBpc2FwbnAgPSAtMTsKKyNlbHNlCitzdGF0aWMgaW50IGlzYXBucDsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJUYWthc2hpIEl3YWkgPGl3YWlAd3cudW5pLWVybGFuZ2VuLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQiBBV0UzMi82NCBXYXZlVGFibGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJiYXNlIGkvbyBwb3J0IG9mIEVtdTgwMDAiKTsKK21vZHVsZV9wYXJhbShtZW1zaXplLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtZW1zaXplLCAib25ib2FyZCBEUkFNIHNpemUgaW4gS2J5dGVzIik7Cittb2R1bGVfcGFyYW0oaXNhcG5wLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXNhcG5wLCAidXNlIElTQVBuUCBkZXRlY3Rpb24iKTsKKworLyogRFJBTSBzdGFydCBvZmZzZXQgKi8KK3N0YXRpYyBpbnQgYXdlX21lbV9zdGFydCA9IEFXRV9EUkFNX09GRlNFVDsKKworLyogbWF4aW11bSBjaGFubmVscyBmb3IgcGxheWluZyAqLworc3RhdGljIGludCBhd2VfbWF4X3ZvaWNlcyA9IEFXRV9NQVhfVk9JQ0VTOworCitzdGF0aWMgaW50IHBhdGNoX29wZW5lZDsJCS8qIHNhbXBsZSBhbHJlYWR5IGxvYWRlZD8gKi8KKworc3RhdGljIGNoYXIgYXR0ZW5fcmVsYXRpdmUgPSBGQUxTRTsKK3N0YXRpYyBzaG9ydCBhdHRlbl9vZmZzZXQ7CisKK3N0YXRpYyBpbnQgYXdlX3ByZXNlbnQgPSBGQUxTRTsJCS8qIGF3ZSBkZXZpY2UgcHJlc2VudD8gKi8KK3N0YXRpYyBpbnQgYXdlX2J1c3kgPSBGQUxTRTsJCS8qIGF3ZSBkZXZpY2Ugb3BlbmVkPyAqLworCitzdGF0aWMgaW50IG15X2RldiA9IC0xOworCisjZGVmaW5lIERFRkFVTFRfRFJVTV9GTEFHUwkoKDEgPDwgOSkgfCAoMSA8PCAyNSkpCisjZGVmaW5lIElTX0RSVU1fQ0hBTk5FTChjKQkoZHJ1bV9mbGFncyAmICgxIDw8IChjKSkpCisjZGVmaW5lIERSVU1fQ0hBTk5FTF9PTihjKQkoZHJ1bV9mbGFncyB8PSAoMSA8PCAoYykpKQorI2RlZmluZSBEUlVNX0NIQU5ORUxfT0ZGKGMpCShkcnVtX2ZsYWdzICY9IH4oMSA8PCAoYykpKQorc3RhdGljIHVuc2lnbmVkIGludCBkcnVtX2ZsYWdzID0gREVGQVVMVF9EUlVNX0ZMQUdTOyAvKiBjaGFubmVsIGZsYWdzICovCisKK3N0YXRpYyBpbnQgcGxheWluZ19tb2RlID0gQVdFX1BMQVlfSU5ESVJFQ1Q7CisjZGVmaW5lIFNJTkdMRV9MQVlFUl9NT0RFKCkJKHBsYXlpbmdfbW9kZSA9PSBBV0VfUExBWV9JTkRJUkVDVCB8fCBwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfRElSRUNUKQorI2RlZmluZSBNVUxUSV9MQVlFUl9NT0RFKCkJKHBsYXlpbmdfbW9kZSA9PSBBV0VfUExBWV9NVUxUSSB8fCBwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfTVVMVEkyKQorCitzdGF0aWMgaW50IGN1cnJlbnRfYWxsb2NfdGltZTsgIAkvKiB2b2ljZSBhbGxvY2F0aW9uIGluZGV4IGZvciBjaGFubmVsIG1vZGUgKi8KKworc3RhdGljIHN0cnVjdCBzeW50aF9pbmZvIGF3ZV9pbmZvID0geworCSJBV0UzMiBTeW50aCIsCQkvKiBuYW1lICovCisJMCwJCQkvKiBkZXZpY2UgKi8KKwlTWU5USF9UWVBFX1NBTVBMRSwJLyogc3ludGhfdHlwZSAqLworCVNBTVBMRV9UWVBFX0FXRTMyLAkvKiBzeW50aF9zdWJ0eXBlICovCisJMCwJCQkvKiBwZXJjX21vZGUgKG9ic29sZXRlKSAqLworCUFXRV9NQVhfVk9JQ0VTLAkJLyogbnJfdm9pY2VzICovCisJMCwJCQkvKiBucl9kcnVtcyAob2Jzb2xldGUpICovCisJNDAwCQkJLyogaW5zdHJfYmFua19zaXplICovCit9OworCisKK3N0YXRpYyBzdHJ1Y3Qgdm9pY2VfYWxsb2NfaW5mbyAqdm9pY2VfYWxsb2M7CS8qIHNldCBhdCBpbml0aWFsaXphdGlvbiAqLworCisKKy8qCisgKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKworc3RhdGljIGludCBhd2VfcmVxdWVzdF9yZWdpb24odm9pZCk7CitzdGF0aWMgdm9pZCBhd2VfcmVsZWFzZV9yZWdpb24odm9pZCk7CisKK3N0YXRpYyB2b2lkIGF3ZV9yZXNldF9zYW1wbGVzKHZvaWQpOworLyogZW11ODAwMCBjaGlwIGkvbyBhY2Nlc3MgKi8KK3N0YXRpYyB2b2lkIHNldHVwX3BvcnRzKGludCBwMSwgaW50IHAyLCBpbnQgcDMpOworc3RhdGljIHZvaWQgYXdlX3Bva2UodW5zaWduZWQgc2hvcnQgY21kLCB1bnNpZ25lZCBzaG9ydCBwb3J0LCB1bnNpZ25lZCBzaG9ydCBkYXRhKTsKK3N0YXRpYyB2b2lkIGF3ZV9wb2tlX2R3KHVuc2lnbmVkIHNob3J0IGNtZCwgdW5zaWduZWQgc2hvcnQgcG9ydCwgdW5zaWduZWQgaW50IGRhdGEpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGF3ZV9wZWVrKHVuc2lnbmVkIHNob3J0IGNtZCwgdW5zaWduZWQgc2hvcnQgcG9ydCk7CitzdGF0aWMgdW5zaWduZWQgaW50IGF3ZV9wZWVrX2R3KHVuc2lnbmVkIHNob3J0IGNtZCwgdW5zaWduZWQgc2hvcnQgcG9ydCk7CitzdGF0aWMgdm9pZCBhd2Vfd2FpdCh1bnNpZ25lZCBzaG9ydCBkZWxheSk7CisKKy8qIGluaXRpYWxpemUgZW11ODAwMCBjaGlwICovCitzdGF0aWMgdm9pZCBhd2VfaW5pdGlhbGl6ZSh2b2lkKTsKKworLyogc2V0IHZvaWNlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyB2b2lkIGF3ZV9pbml0X2N0cmxfcGFybXMoaW50IGluaXRfYWxsKTsKK3N0YXRpYyB2b2lkIGF3ZV9pbml0X3ZvaWNlX2luZm8oYXdlX3ZvaWNlX2luZm8gKnZwKTsKK3N0YXRpYyB2b2lkIGF3ZV9pbml0X3ZvaWNlX3Bhcm0oYXdlX3ZvaWNlX3Bhcm0gKnBwKTsKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCitzdGF0aWMgaW50IGZyZXFfdG9fbm90ZShpbnQgZnJlcSk7CitzdGF0aWMgaW50IGNhbGNfcmF0ZV9vZmZzZXQoaW50IEh6KTsKKy8qc3RhdGljIGludCBjYWxjX3Bhcm1fZGVsYXkoaW50IG1zZWMpOyovCitzdGF0aWMgaW50IGNhbGNfcGFybV9ob2xkKGludCBtc2VjKTsKK3N0YXRpYyBpbnQgY2FsY19wYXJtX2F0dGFjayhpbnQgbXNlYyk7CitzdGF0aWMgaW50IGNhbGNfcGFybV9kZWNheShpbnQgbXNlYyk7CitzdGF0aWMgaW50IGNhbGNfcGFybV9zZWFyY2goaW50IG1zZWMsIHNob3J0ICp0YWJsZSk7CisjZW5kaWYgLyogZ3VzIGNvbXBhdCAqLworCisvKiB0dXJuIG9uL29mZiBub3RlICovCitzdGF0aWMgdm9pZCBhd2Vfbm90ZV9vbihpbnQgdm9pY2UpOworc3RhdGljIHZvaWQgYXdlX25vdGVfb2ZmKGludCB2b2ljZSk7CitzdGF0aWMgdm9pZCBhd2VfdGVybWluYXRlKGludCB2b2ljZSk7CitzdGF0aWMgdm9pZCBhd2VfZXhjbHVzaXZlX29mZihpbnQgdm9pY2UpOworc3RhdGljIHZvaWQgYXdlX25vdGVfb2ZmX2FsbChpbnQgZG9fc3VzdGFpbik7CisKKy8qIGNhbGN1bGF0ZSB2b2ljZSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHZvaWQgKCpmeF9hZmZlY3RfZnVuYykoaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV9zZXRfcGl0Y2goaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV9zZXRfdm9pY2VfcGl0Y2goaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV9zZXRfdm9sdW1lKGludCB2b2ljZSwgaW50IGZvcmNlZCk7CitzdGF0aWMgdm9pZCBhd2Vfc2V0X3ZvaWNlX3ZvbChpbnQgdm9pY2UsIGludCBmb3JjZWQpOworc3RhdGljIHZvaWQgYXdlX3NldF9wYW4oaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV9meF9mbW1vZChpbnQgdm9pY2UsIGludCBmb3JjZWQpOworc3RhdGljIHZvaWQgYXdlX2Z4X3RyZW1mcnEoaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV9meF9mbTJmcnEyKGludCB2b2ljZSwgaW50IGZvcmNlZCk7CitzdGF0aWMgdm9pZCBhd2VfZnhfZmlsdGVyUShpbnQgdm9pY2UsIGludCBmb3JjZWQpOworc3RhdGljIHZvaWQgYXdlX2NhbGNfcGl0Y2goaW50IHZvaWNlKTsKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCitzdGF0aWMgdm9pZCBhd2VfY2FsY19waXRjaF9mcm9tX2ZyZXEoaW50IHZvaWNlLCBpbnQgZnJlcSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGF3ZV9jYWxjX3ZvbHVtZShpbnQgdm9pY2UpOworc3RhdGljIHZvaWQgYXdlX3VwZGF0ZV92b2x1bWUodm9pZCk7CitzdGF0aWMgdm9pZCBhd2VfY2hhbmdlX21hc3Rlcl92b2x1bWUoc2hvcnQgdmFsKTsKK3N0YXRpYyB2b2lkIGF3ZV92b2ljZV9pbml0KGludCB2b2ljZSwgaW50IGluaXRfYWxsKTsKK3N0YXRpYyB2b2lkIGF3ZV9jaGFubmVsX2luaXQoaW50IGNoLCBpbnQgaW5pdF9hbGwpOworc3RhdGljIHZvaWQgYXdlX2Z4X2luaXQoaW50IGNoKTsKK3N0YXRpYyB2b2lkIGF3ZV9zZW5kX2VmZmVjdChpbnQgdm9pY2UsIGludCBsYXllciwgaW50IHR5cGUsIGludCB2YWwpOworc3RhdGljIHZvaWQgYXdlX21vZHdoZWVsX2NoYW5nZShpbnQgdm9pY2UsIGludCB2YWx1ZSk7CisKKy8qIHNlcXVlbmNlciBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgYXdlX29wZW4oaW50IGRldiwgaW50IG1vZGUpOworc3RhdGljIHZvaWQgYXdlX2Nsb3NlKGludCBkZXYpOworc3RhdGljIGludCBhd2VfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpOworc3RhdGljIGludCBhd2Vfa2lsbF9ub3RlKGludCBkZXYsIGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSk7CitzdGF0aWMgaW50IGF3ZV9zdGFydF9ub3RlKGludCBkZXYsIGludCB2LCBpbnQgbm90ZV9udW0sIGludCB2b2x1bWUpOworc3RhdGljIGludCBhd2Vfc2V0X2luc3RyKGludCBkZXYsIGludCB2b2ljZSwgaW50IGluc3RyX25vKTsKK3N0YXRpYyBpbnQgYXdlX3NldF9pbnN0cl8yKGludCBkZXYsIGludCB2b2ljZSwgaW50IGluc3RyX25vKTsKK3N0YXRpYyB2b2lkIGF3ZV9yZXNldChpbnQgZGV2KTsKK3N0YXRpYyB2b2lkIGF3ZV9od19jb250cm9sKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KTsKK3N0YXRpYyBpbnQgYXdlX2xvYWRfcGF0Y2goaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJCQkgIGludCBvZmZzLCBpbnQgY291bnQsIGludCBwbWdyX2ZsYWcpOworc3RhdGljIHZvaWQgYXdlX2FmdGVydG91Y2goaW50IGRldiwgaW50IHZvaWNlLCBpbnQgcHJlc3N1cmUpOworc3RhdGljIHZvaWQgYXdlX2NvbnRyb2xsZXIoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgY3RybF9udW0sIGludCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBhd2VfcGFubmluZyhpbnQgZGV2LCBpbnQgdm9pY2UsIGludCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBhd2Vfdm9sdW1lX21ldGhvZChpbnQgZGV2LCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCBhd2VfYmVuZGVyKGludCBkZXYsIGludCB2b2ljZSwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgYXdlX2FsbG9jKGludCBkZXYsIGludCBjaG4sIGludCBub3RlLCBzdHJ1Y3Qgdm9pY2VfYWxsb2NfaW5mbyAqYWxsb2MpOworc3RhdGljIHZvaWQgYXdlX3NldHVwX3ZvaWNlKGludCBkZXYsIGludCB2b2ljZSwgaW50IGNobik7CisKKyNkZWZpbmUgYXdlX2tleV9wcmVzc3VyZShkZXYsdm9pY2Usa2V5LHByZXNzKSBhd2Vfc3RhcnRfbm90ZShkZXYsdm9pY2UsKGtleSkrMTI4LHByZXNzKQorCisvKiBoYXJkd2FyZSBjb250cm9scyAqLworI2lmZGVmIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkKK3N0YXRpYyB2b2lkIGF3ZV9od19ndXNfY29udHJvbChpbnQgZGV2LCBpbnQgY21kLCB1bnNpZ25lZCBjaGFyICpldmVudCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGF3ZV9od19hd2VfY29udHJvbChpbnQgZGV2LCBpbnQgY21kLCB1bnNpZ25lZCBjaGFyICpldmVudCk7CitzdGF0aWMgdm9pZCBhd2Vfdm9pY2VfY2hhbmdlKGludCB2b2ljZSwgZnhfYWZmZWN0X2Z1bmMgZnVuYyk7CitzdGF0aWMgdm9pZCBhd2Vfc29zdGVudXRvX29uKGludCB2b2ljZSwgaW50IGZvcmNlZCk7CitzdGF0aWMgdm9pZCBhd2Vfc3VzdGFpbl9vZmYoaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV90ZXJtaW5hdGVfYW5kX2luaXQoaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKKworLyogdm9pY2Ugc2VhcmNoICovCitzdGF0aWMgaW50IGF3ZV9zZWFyY2hfa2V5KGludCBiYW5rLCBpbnQgcHJlc2V0LCBpbnQgbm90ZSk7CitzdGF0aWMgYXdlX3ZvaWNlX2xpc3QgKmF3ZV9zZWFyY2hfaW5zdHIoaW50IGJhbmssIGludCBwcmVzZXQsIGludCBub3RlKTsKK3N0YXRpYyBpbnQgYXdlX3NlYXJjaF9tdWx0aV92b2ljZXMoYXdlX3ZvaWNlX2xpc3QgKnJlYywgaW50IG5vdGUsIGludCB2ZWxvY2l0eSwgYXdlX3ZvaWNlX2luZm8gKip2bGlzdCk7CitzdGF0aWMgdm9pZCBhd2VfYWxsb2NfbXVsdGlfdm9pY2VzKGludCBjaCwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSwgaW50IGtleSk7CitzdGF0aWMgdm9pZCBhd2VfYWxsb2Nfb25lX3ZvaWNlKGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSk7CitzdGF0aWMgaW50IGF3ZV9jbGVhcl92b2ljZSh2b2lkKTsKKworLyogbG9hZCAvIHJlbW92ZSBwYXRjaGVzICovCitzdGF0aWMgaW50IGF3ZV9vcGVuX3BhdGNoKGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCk7CitzdGF0aWMgaW50IGF3ZV9jbG9zZV9wYXRjaChhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpOworc3RhdGljIGludCBhd2VfdW5sb2FkX3BhdGNoKGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCk7CitzdGF0aWMgaW50IGF3ZV9sb2FkX2luZm8oYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgYXdlX3JlbW92ZV9pbmZvKGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCk7CitzdGF0aWMgaW50IGF3ZV9sb2FkX2RhdGEoYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgYXdlX3JlcGxhY2VfZGF0YShhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpOworc3RhdGljIGludCBhd2VfbG9hZF9tYXAoYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KTsKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCitzdGF0aWMgaW50IGF3ZV9sb2FkX2d1c3BhdGNoKGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgb2ZmcywgaW50IHNpemUsIGludCBwbWdyX2ZsYWcpOworI2VuZGlmCisvKnN0YXRpYyBpbnQgYXdlX3Byb2JlX2luZm8oYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KTsqLworc3RhdGljIGludCBhd2VfcHJvYmVfZGF0YShhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpOworc3RhdGljIHNmX2xpc3QgKmNoZWNrX3BhdGNoX29wZW5lZChpbnQgdHlwZSwgY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IGF3ZV93cml0ZV93YXZlX2RhdGEoY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBvZmZzZXQsIGF3ZV9zYW1wbGVfbGlzdCAqc3AsIGludCBjaGFubmVscyk7CitzdGF0aWMgaW50IGF3ZV9jcmVhdGVfc2YoaW50IHR5cGUsIGNoYXIgKm5hbWUpOworc3RhdGljIHZvaWQgYXdlX2ZyZWVfc2Yoc2ZfbGlzdCAqc2YpOworc3RhdGljIHZvaWQgYWRkX3NmX2luZm8oc2ZfbGlzdCAqc2YsIGF3ZV92b2ljZV9saXN0ICpyZWMpOworc3RhdGljIHZvaWQgYWRkX3NmX3NhbXBsZShzZl9saXN0ICpzZiwgYXdlX3NhbXBsZV9saXN0ICpzbXApOworc3RhdGljIHZvaWQgcHVyZ2Vfb2xkX2xpc3QoYXdlX3ZvaWNlX2xpc3QgKnJlYywgYXdlX3ZvaWNlX2xpc3QgKm5leHQpOworc3RhdGljIHZvaWQgYWRkX2luZm9fbGlzdChhd2Vfdm9pY2VfbGlzdCAqcmVjKTsKK3N0YXRpYyB2b2lkIGF3ZV9yZW1vdmVfc2FtcGxlcyhpbnQgc2ZfaWQpOworc3RhdGljIHZvaWQgcmVidWlsZF9wcmVzZXRfbGlzdCh2b2lkKTsKK3N0YXRpYyBzaG9ydCBhd2Vfc2V0X3NhbXBsZShhd2Vfdm9pY2VfbGlzdCAqcmVjKTsKK3N0YXRpYyBhd2Vfc2FtcGxlX2xpc3QgKnNlYXJjaF9zYW1wbGVfaW5kZXgoc2ZfbGlzdCAqc2YsIGludCBzYW1wbGUpOworCitzdGF0aWMgaW50IGlzX2lkZW50aWNhbF9ob2xkZXIoc2ZfbGlzdCAqc2YxLCBzZl9saXN0ICpzZjIpOworI2lmZGVmIEFXRV9BTExPV19TQU1QTEVfU0hBUklORworc3RhdGljIGludCBpc19pZGVudGljYWxfbmFtZSh1bnNpZ25lZCBjaGFyICpuYW1lLCBzZl9saXN0ICpwKTsKK3N0YXRpYyBpbnQgaXNfc2hhcmVkX3NmKHVuc2lnbmVkIGNoYXIgKm5hbWUpOworc3RhdGljIGludCBpbmZvX2R1cGxpY2F0ZWQoc2ZfbGlzdCAqc2YsIGF3ZV92b2ljZV9saXN0ICpyZWMpOworI2VuZGlmIC8qIGFsbG93IHNoYXJpbmcgKi8KKworLyogbG93bGV2ZWwgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBhd2VfaW5pdF9hdWRpbyh2b2lkKTsKK3N0YXRpYyB2b2lkIGF3ZV9pbml0X2RtYSh2b2lkKTsKK3N0YXRpYyB2b2lkIGF3ZV9pbml0X2FycmF5KHZvaWQpOworc3RhdGljIHZvaWQgYXdlX3NlbmRfYXJyYXkodW5zaWduZWQgc2hvcnQgKmRhdGEpOworc3RhdGljIHZvaWQgYXdlX3R3ZWFrX3ZvaWNlKGludCB2b2ljZSk7CitzdGF0aWMgdm9pZCBhd2VfdHdlYWsodm9pZCk7CitzdGF0aWMgdm9pZCBhd2VfaW5pdF9mbSh2b2lkKTsKK3N0YXRpYyBpbnQgYXdlX29wZW5fZHJhbV9mb3Jfd3JpdGUoaW50IG9mZnNldCwgaW50IGNoYW5uZWxzKTsKK3N0YXRpYyB2b2lkIGF3ZV9vcGVuX2RyYW1fZm9yX2NoZWNrKHZvaWQpOworc3RhdGljIHZvaWQgYXdlX2Nsb3NlX2RyYW0odm9pZCk7CisvKnN0YXRpYyB2b2lkIGF3ZV93cml0ZV9kcmFtKHVuc2lnbmVkIHNob3J0IGMpOyovCitzdGF0aWMgaW50IGF3ZV9kZXRlY3RfYmFzZShpbnQgYWRkcik7CitzdGF0aWMgaW50IGF3ZV9kZXRlY3Qodm9pZCk7CitzdGF0aWMgdm9pZCBhd2VfY2hlY2tfZHJhbSh2b2lkKTsKK3N0YXRpYyBpbnQgYXdlX2xvYWRfY2hvcnVzX2Z4KGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCBhd2Vfc2V0X2Nob3J1c19tb2RlKGludCBtb2RlKTsKK3N0YXRpYyB2b2lkIGF3ZV91cGRhdGVfY2hvcnVzX21vZGUodm9pZCk7CitzdGF0aWMgaW50IGF3ZV9sb2FkX3JldmVyYl9meChhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgYXdlX3NldF9yZXZlcmJfbW9kZShpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCBhd2VfdXBkYXRlX3JldmVyYl9tb2RlKHZvaWQpOworc3RhdGljIHZvaWQgYXdlX2VxdWFsaXplcihpbnQgYmFzcywgaW50IHRyZWJsZSk7CitzdGF0aWMgdm9pZCBhd2VfdXBkYXRlX2VxdWFsaXplcih2b2lkKTsKKworI2lmZGVmIENPTkZJR19BV0UzMl9NSVhFUgorc3RhdGljIHZvaWQgYXR0YWNoX21peGVyKHZvaWQpOworc3RhdGljIHZvaWQgdW5sb2FkX21peGVyKHZvaWQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVdFMzJfTUlESUVNVQorc3RhdGljIHZvaWQgYXR0YWNoX21pZGllbXUodm9pZCk7CitzdGF0aWMgdm9pZCB1bmxvYWRfbWlkaWVtdSh2b2lkKTsKKyNlbmRpZgorCisjZGVmaW5lIGxpbWl0dmFsdWUoeCwgYSwgYikgaWYgKCh4KSA8IChhKSkgKHgpID0gKGEpOyBlbHNlIGlmICgoeCkgPiAoYikpICh4KSA9IChiKQorCisvKgorICogY29udHJvbCBwYXJhbWV0ZXJzCisgKi8KKworCisjaWZkZWYgQVdFX1VTRV9ORVdfVk9MVU1FX0NBTEMKKyNkZWZpbmUgREVGX1ZPTFVNRV9DQUxDCVRSVUUKKyNlbHNlCisjZGVmaW5lIERFRl9WT0xVTUVfQ0FMQwlGQUxTRQorI2VuZGlmIC8qIG5ldyB2b2x1bWUgKi8KKworI2RlZmluZSBERUZfWkVST19BVFRFTgkJMzIJLyogMTJkQiBiZWxvdyAqLworI2RlZmluZSBERUZfTU9EX1NFTlNFCQkxOAorI2RlZmluZSBERUZfQ0hPUlVTX01PREUJCTIKKyNkZWZpbmUgREVGX1JFVkVSQl9NT0RFCQk0CisjZGVmaW5lIERFRl9CQVNTX0xFVkVMCQk1CisjZGVmaW5lIERFRl9UUkVCTEVfTEVWRUwJOQorCitzdGF0aWMgc3RydWN0IEN0cmxQYXJtc0RlZiB7CisJaW50IHZhbHVlOworCWludCBpbml0X2VhY2hfdGltZTsKKwl2b2lkICgqdXBkYXRlKSh2b2lkKTsKK30gY3RybF9wYXJtc1tBV0VfTURfRU5EXSA9IHsKKwl7MCwwLCBOVUxMfSwgezAsMCwgTlVMTH0sIC8qIDwtLSBub3QgdXNlZCAqLworCXtBV0VfVkVSU0lPTl9OVU1CRVIsIEZBTFNFLCBOVUxMfSwKKwl7VFJVRSwgRkFMU0UsIE5VTEx9LCAvKiBleGNsdXNpdmUgKi8KKwl7VFJVRSwgRkFMU0UsIE5VTEx9LCAvKiByZWFscGFuICovCisJe0FXRV9ERUZBVUxUX0JBTkssIEZBTFNFLCBOVUxMfSwgLyogZ3VzYmFuayAqLworCXtGQUxTRSwgVFJVRSwgTlVMTH0sIC8qIGtlZXAgZWZmZWN0ICovCisJe0RFRl9aRVJPX0FUVEVOLCBGQUxTRSwgYXdlX3VwZGF0ZV92b2x1bWV9LCAvKiB6ZXJvX2F0dGVuICovCisJe0ZBTFNFLCBGQUxTRSwgTlVMTH0sIC8qIGNobl9wcmlvciAqLworCXtERUZfTU9EX1NFTlNFLCBGQUxTRSwgTlVMTH0sIC8qIG1vZHdoZWVsIHNlbnNlICovCisJe0FXRV9ERUZBVUxUX1BSRVNFVCwgRkFMU0UsIE5VTEx9LCAvKiBkZWZfcHJlc2V0ICovCisJe0FXRV9ERUZBVUxUX0JBTkssIEZBTFNFLCBOVUxMfSwgLyogZGVmX2JhbmsgKi8KKwl7QVdFX0RFRkFVTFRfRFJVTSwgRkFMU0UsIE5VTEx9LCAvKiBkZWZfZHJ1bSAqLworCXtGQUxTRSwgRkFMU0UsIE5VTEx9LCAvKiB0b2dnbGVfZHJ1bV9iYW5rICovCisJe0RFRl9WT0xVTUVfQ0FMQywgRkFMU0UsIGF3ZV91cGRhdGVfdm9sdW1lfSwgLyogbmV3X3ZvbHVtZV9jYWxjICovCisJe0RFRl9DSE9SVVNfTU9ERSwgRkFMU0UsIGF3ZV91cGRhdGVfY2hvcnVzX21vZGV9LCAvKiBjaG9ydXMgbW9kZSAqLworCXtERUZfUkVWRVJCX01PREUsIEZBTFNFLCBhd2VfdXBkYXRlX3JldmVyYl9tb2RlfSwgLyogcmV2ZXJiIG1vZGUgKi8KKwl7REVGX0JBU1NfTEVWRUwsIEZBTFNFLCBhd2VfdXBkYXRlX2VxdWFsaXplcn0sIC8qIGJhc3MgbGV2ZWwgKi8KKwl7REVGX1RSRUJMRV9MRVZFTCwgRkFMU0UsIGF3ZV91cGRhdGVfZXF1YWxpemVyfSwgLyogdHJlYmxlIGxldmVsICovCisJezAsIEZBTFNFLCBOVUxMfSwJLyogZGVidWcgbW9kZSAqLworCXtGQUxTRSwgRkFMU0UsIE5VTEx9LCAvKiBwYW4gZXhjaGFuZ2UgKi8KK307CisKK3N0YXRpYyBpbnQgY3RybHNbQVdFX01EX0VORF07CisKKworLyoKKyAqIHN5bnRoIG9wZXJhdGlvbiB0YWJsZQorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyBhd2Vfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pZAkJPSAiRU1VOEsiLAorCS5pbmZvCQk9ICZhd2VfaW5mbywKKwkubWlkaV9kZXYJPSAwLAorCS5zeW50aF90eXBlCT0gU1lOVEhfVFlQRV9TQU1QTEUsCisJLnN5bnRoX3N1YnR5cGUJPSBTQU1QTEVfVFlQRV9BV0UzMiwKKwkub3BlbgkJPSBhd2Vfb3BlbiwKKwkuY2xvc2UJCT0gYXdlX2Nsb3NlLAorCS5pb2N0bAkJPSBhd2VfaW9jdGwsCisJLmtpbGxfbm90ZQk9IGF3ZV9raWxsX25vdGUsCisJLnN0YXJ0X25vdGUJPSBhd2Vfc3RhcnRfbm90ZSwKKwkuc2V0X2luc3RyCT0gYXdlX3NldF9pbnN0cl8yLAorCS5yZXNldAkJPSBhd2VfcmVzZXQsCisJLmh3X2NvbnRyb2wJPSBhd2VfaHdfY29udHJvbCwKKwkubG9hZF9wYXRjaAk9IGF3ZV9sb2FkX3BhdGNoLAorCS5hZnRlcnRvdWNoCT0gYXdlX2FmdGVydG91Y2gsCisJLmNvbnRyb2xsZXIJPSBhd2VfY29udHJvbGxlciwKKwkucGFubmluZwk9IGF3ZV9wYW5uaW5nLAorCS52b2x1bWVfbWV0aG9kCT0gYXdlX3ZvbHVtZV9tZXRob2QsCisJLmJlbmRlcgkJPSBhd2VfYmVuZGVyLAorCS5hbGxvY192b2ljZQk9IGF3ZV9hbGxvYywKKwkuc2V0dXBfdm9pY2UJPSBhd2Vfc2V0dXBfdm9pY2UKK307CisKK3N0YXRpYyB2b2lkIGZyZWVfdGFibGVzKHZvaWQpCit7CisJaWYgKHNmdGFpbCkgeworCQlzZl9saXN0ICpwLCAqcHJldjsKKwkJZm9yIChwID0gc2Z0YWlsOyBwOyBwID0gcHJldikgeworCQkJcHJldiA9IHAtPnByZXY7CisJCQlhd2VfZnJlZV9zZihwKTsKKwkJfQorCX0KKwlzZmhlYWQgPSBzZnRhaWwgPSBOVUxMOworfQorCisvKgorICogY2xlYXIgc2FtcGxlIHRhYmxlcyAKKyAqLworCitzdGF0aWMgdm9pZAorYXdlX3Jlc2V0X3NhbXBsZXModm9pZCkKK3sKKwkvKiBmcmVlIGFsbCBiYW5rIHRhYmxlcyAqLworCW1lbXNldChwcmVzZXRfdGFibGUsIDAsIHNpemVvZihwcmVzZXRfdGFibGUpKTsKKwlmcmVlX3RhYmxlcygpOworCisJY3VycmVudF9zZl9pZCA9IDA7CisJbG9ja2VkX3NmX2lkID0gMDsKKwlwYXRjaF9vcGVuZWQgPSAwOworfQorCisKKy8qCisgKiBFTVUgcmVnaXN0ZXIgYWNjZXNzCisgKi8KKworLyogc2VsZWN0IGEgZ2l2ZW4gQVdFMzIgcG9pbnRlciAqLworc3RhdGljIGludCBhd2VfcG9ydHNbNV07CitzdGF0aWMgaW50IHBvcnRfc2V0dXBlZCA9IEZBTFNFOworc3RhdGljIGludCBhd2VfY3VyX2NtZCA9IC0xOworI2RlZmluZSBhd2Vfc2V0X2NtZChjbWQpIFwKK2lmIChhd2VfY3VyX2NtZCAhPSBjbWQpIHsgb3V0dyhjbWQsIGF3ZV9wb3J0c1tQb2ludGVyXSk7IGF3ZV9jdXJfY21kID0gY21kOyB9CisKKy8qIHdyaXRlIDE2Yml0IGRhdGEgKi8KK3N0YXRpYyB2b2lkCithd2VfcG9rZSh1bnNpZ25lZCBzaG9ydCBjbWQsIHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIHNob3J0IGRhdGEpCit7CisJYXdlX3NldF9jbWQoY21kKTsKKwlvdXR3KGRhdGEsIGF3ZV9wb3J0c1twb3J0XSk7Cit9CisKKy8qIHdyaXRlIDMyYml0IGRhdGEgKi8KK3N0YXRpYyB2b2lkCithd2VfcG9rZV9kdyh1bnNpZ25lZCBzaG9ydCBjbWQsIHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIGludCBkYXRhKQoreworCXVuc2lnbmVkIHNob3J0IGFkZHIgPSBhd2VfcG9ydHNbcG9ydF07CisJYXdlX3NldF9jbWQoY21kKTsKKwlvdXR3KGRhdGEsIGFkZHIpOwkJLyogd3JpdGUgbG93ZXIgMTYgYml0cyAqLworCW91dHcoZGF0YSA+PiAxNiwgYWRkciArIDIpOwkvKiB3cml0ZSBoaWdoZXIgMTYgYml0cyAqLworfQorCisvKiByZWFkIDE2Yml0IGRhdGEgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorYXdlX3BlZWsodW5zaWduZWQgc2hvcnQgY21kLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXVuc2lnbmVkIHNob3J0IGs7CisJYXdlX3NldF9jbWQoY21kKTsKKwlrID0gaW53KGF3ZV9wb3J0c1twb3J0XSk7CisJcmV0dXJuIGs7Cit9CisKKy8qIHJlYWQgMzJiaXQgZGF0YSAqLworc3RhdGljIHVuc2lnbmVkIGludAorYXdlX3BlZWtfZHcodW5zaWduZWQgc2hvcnQgY21kLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXVuc2lnbmVkIGludCBrMSwgazI7CisJdW5zaWduZWQgc2hvcnQgYWRkciA9IGF3ZV9wb3J0c1twb3J0XTsKKwlhd2Vfc2V0X2NtZChjbWQpOworCWsxID0gaW53KGFkZHIpOworCWsyID0gaW53KGFkZHIgKyAyKTsKKwlrMSB8PSBrMiA8PCAxNjsKKwlyZXR1cm4gazE7Cit9CisKKy8qIHdhaXQgZGVsYXkgbnVtYmVyIG9mIEFXRTMyIDQ0MTAwSHogY2xvY2tzICovCisjaWZkZWYgV0FJVF9CWV9MT09QIC8qIHdhaXQgYnkgbG9vcCAtLSB0aGF0J3Mgbm90IGdvb2QuLiAqLworc3RhdGljIHZvaWQKK2F3ZV93YWl0KHVuc2lnbmVkIHNob3J0IGRlbGF5KQoreworCXVuc2lnbmVkIHNob3J0IGNsb2NrLCB0YXJnZXQ7CisJdW5zaWduZWQgc2hvcnQgcG9ydCA9IGF3ZV9wb3J0c1tBV0VfV0NfUG9ydF07CisJaW50IGNvdW50ZXI7CisgIAorCS8qIHNhbXBsZSBjb3VudGVyICovCisJYXdlX3NldF9jbWQoQVdFX1dDX0NtZCk7CisJY2xvY2sgPSAodW5zaWduZWQgc2hvcnQpaW53KHBvcnQpOworCXRhcmdldCA9IGNsb2NrICsgZGVsYXk7CisJY291bnRlciA9IDA7CisJaWYgKHRhcmdldCA8IGNsb2NrKSB7CisJCWZvciAoOyAodW5zaWduZWQgc2hvcnQpaW53KHBvcnQpID4gdGFyZ2V0OyBjb3VudGVyKyspCisJCQlpZiAoY291bnRlciA+IDY1NTM2KQorCQkJCWJyZWFrOworCX0KKwlmb3IgKDsgKHVuc2lnbmVkIHNob3J0KWludyhwb3J0KSA8IHRhcmdldDsgY291bnRlcisrKQorCQlpZiAoY291bnRlciA+IDY1NTM2KQorCQkJYnJlYWs7Cit9CisjZWxzZQorCitzdGF0aWMgdm9pZCBhd2Vfd2FpdCh1bnNpZ25lZCBzaG9ydCBkZWxheSkKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KChIWioodW5zaWduZWQgbG9uZylkZWxheSArIDQ0MDk5KS80NDEwMCk7Cit9CisvKgorc3RhdGljIHZvaWQgYXdlX3dhaXQodW5zaWduZWQgc2hvcnQgZGVsYXkpCit7CisJdWRlbGF5KCgodW5zaWduZWQgbG9uZylkZWxheSAqIDEwMDAwMDBMICsgNDQwOTkpIC8gNDQxMDApOworfQorKi8KKyNlbmRpZiAvKiB3YWl0IGJ5IGxvb3AgKi8KKworLyogd3JpdGUgYSB3b3JkIGRhdGEgKi8KKyNkZWZpbmUgYXdlX3dyaXRlX2RyYW0oYykJYXdlX3Bva2UoQVdFX1NNTEQsIGMpCisKKy8qCisgKiBBV0UzMiB2b2ljZSBwYXJhbWV0ZXJzCisgKi8KKworLyogaW5pdGlhbGl6ZSB2b2ljZV9pbmZvIHJlY29yZCAqLworc3RhdGljIHZvaWQKK2F3ZV9pbml0X3ZvaWNlX2luZm8oYXdlX3ZvaWNlX2luZm8gKnZwKQoreworCXZwLT5zYW1wbGUgPSAwOworCXZwLT5yYXRlX29mZnNldCA9IDA7CisKKwl2cC0+c3RhcnQgPSAwOworCXZwLT5lbmQgPSAwOworCXZwLT5sb29wc3RhcnQgPSAwOworCXZwLT5sb29wZW5kID0gMDsKKwl2cC0+bW9kZSA9IDA7CisJdnAtPnJvb3QgPSA2MDsKKwl2cC0+dHVuZSA9IDA7CisJdnAtPmxvdyA9IDA7CisJdnAtPmhpZ2ggPSAxMjc7CisJdnAtPnZlbGxvdyA9IDA7CisJdnAtPnZlbGhpZ2ggPSAxMjc7CisKKwl2cC0+Zml4a2V5ID0gLTE7CisJdnAtPmZpeHZlbCA9IC0xOworCXZwLT5maXhwYW4gPSAtMTsKKwl2cC0+cGFuID0gLTE7CisKKwl2cC0+ZXhjbHVzaXZlQ2xhc3MgPSAwOworCXZwLT5hbXBsaXR1ZGUgPSAxMjc7CisJdnAtPmF0dGVudWF0aW9uID0gMDsKKwl2cC0+c2NhbGVUdW5pbmcgPSAxMDA7CisKKwlhd2VfaW5pdF92b2ljZV9wYXJtKCZ2cC0+cGFybSk7Cit9CisKKy8qIGluaXRpYWxpemUgdm9pY2VfcGFybSByZWNvcmQ6CisgKiBFbnYxLzI6IGRlbGF5PTAsIGF0dGFjaz0wLCBob2xkPTAsIHN1c3RhaW49MCwgZGVjYXk9MCwgcmVsZWFzZT0wLgorICogVmlicmF0byBhbmQgVHJlbW9sbyBlZmZlY3RzIGFyZSB6ZXJvLgorICogQ3V0b2ZmIGlzIG1heGltdW0uCisgKiBDaG9ydXMgYW5kIFJldmVyYiBlZmZlY3RzIGFyZSB6ZXJvLgorICovCitzdGF0aWMgdm9pZAorYXdlX2luaXRfdm9pY2VfcGFybShhd2Vfdm9pY2VfcGFybSAqcHApCit7CisJcHAtPm1vZGRlbGF5ID0gMHg4MDAwOworCXBwLT5tb2RhdGtobGQgPSAweDdmN2Y7CisJcHAtPm1vZGRjeXN1cyA9IDB4N2Y3ZjsKKwlwcC0+bW9kcmVsZWFzZSA9IDB4ODA3ZjsKKwlwcC0+bW9ka2V5aG9sZCA9IDA7CisJcHAtPm1vZGtleWRlY2F5ID0gMDsKKworCXBwLT52b2xkZWxheSA9IDB4ODAwMDsKKwlwcC0+dm9sYXRraGxkID0gMHg3ZjdmOworCXBwLT52b2xkY3lzdXMgPSAweDdmN2Y7CisJcHAtPnZvbHJlbGVhc2UgPSAweDgwN2Y7CisJcHAtPnZvbGtleWhvbGQgPSAwOworCXBwLT52b2xrZXlkZWNheSA9IDA7CisKKwlwcC0+bGZvMWRlbGF5ID0gMHg4MDAwOworCXBwLT5sZm8yZGVsYXkgPSAweDgwMDA7CisJcHAtPnBlZmUgPSAwOworCisJcHAtPmZtbW9kID0gMDsKKwlwcC0+dHJlbWZycSA9IDA7CisJcHAtPmZtMmZycTIgPSAwOworCisJcHAtPmN1dG9mZiA9IDB4ZmY7CisJcHAtPmZpbHRlclEgPSAwOworCisJcHAtPmNob3J1cyA9IDA7CisJcHAtPnJldmVyYiA9IDA7Cit9CQorCisKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCisKKy8qIGNvbnZlcnQgZnJlcXVlbmN5IG1IeiB0byBhYnN0cmFjdCBjZW50cyAoPSBtaWRpIGtleSAqIDEwMCkgKi8KK3N0YXRpYyBpbnQKK2ZyZXFfdG9fbm90ZShpbnQgbUh6KQoreworCS8qIGFic2NlbnRzID0gbG9nKG1Iei84MTc2KSAvIGxvZygyKSAqIDEyMDAgKi8KKwl1bnNpZ25lZCBpbnQgbWF4X3ZhbCA9ICh1bnNpZ25lZCBpbnQpMHhmZmZmZmZmZiAvIDEwMDAwOworCWludCBpLCB0aW1lczsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKKwl1bnNpZ25lZCBpbnQgZnJlcTsKKwlpbnQgbm90ZSwgdHVuZTsKKworCWlmIChtSHogPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKG1IeiA8IDApCisJCXJldHVybiAxMjc5OTsgLyogbWF4aW11bSAqLworCisJZnJlcSA9IG1IejsKKwlub3RlID0gMDsKKwlmb3IgKGJhc2UgPSA4MTc2ICogMjsgZnJlcSA+PSBiYXNlOyBiYXNlICo9IDIpIHsKKwkJbm90ZSArPSAxMjsKKwkJaWYgKG5vdGUgPj0gMTI4KSAvKiBvdmVyIG1heGltdW0gKi8KKwkJCXJldHVybiAxMjc5OTsKKwl9CisJYmFzZSAvPSAyOworCisJLyogdG8gYXZvaWQgb3ZlcmZsb3cuLi4gKi8KKwl0aW1lcyA9IDEwMDAwOworCXdoaWxlIChmcmVxID4gbWF4X3ZhbCkgeworCQltYXhfdmFsICo9IDEwOworCQl0aW1lcyAvPSAxMDsKKwkJYmFzZSAvPSAxMDsKKwl9CisKKwlmcmVxID0gZnJlcSAqIHRpbWVzIC8gYmFzZTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQlpZiAoZnJlcSA8IHNlbWl0b25lX3R1bmluZ1tpKzFdKQorCQkJYnJlYWs7CisJCW5vdGUrKzsKKwl9CisKKwl0dW5lID0gMDsKKwlmcmVxID0gZnJlcSAqIDEwMDAwIC8gc2VtaXRvbmVfdHVuaW5nW2ldOworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoZnJlcSA8IGNlbnRfdHVuaW5nW2krMV0pCisJCQlicmVhazsKKwkJdHVuZSsrOworCX0KKworCXJldHVybiBub3RlICogMTAwICsgdHVuZTsKK30KKworCisvKiBjb252ZXJ0IEh6IHRvIEFXRTMyIHJhdGUgb2Zmc2V0OgorICogc2FtcGxlIHBpdGNoIG9mZnNldCBmb3IgdGhlIHNwZWNpZmllZCBzYW1wbGUgcmF0ZQorICogcmF0ZT00NDEwMCBpcyBubyBvZmZzZXQsIGVhY2ggNDA5NiBpcyAxIG9jdGF2ZSAodHdpY2UpLgorICogZWcsIHdoZW4gcmF0ZSBpcyAyMjA1MCwgdGhpcyBvZmZzZXQgYmVjb21lcyAtNDA5Ni4KKyAqLworc3RhdGljIGludAorY2FsY19yYXRlX29mZnNldChpbnQgSHopCit7CisJLyogb2Zmc2V0ID0gbG9nKEh6IC8gNDQxMDApIC8gbG9nKDIpICogNDA5NiAqLworCWludCBmcmVxLCBiYXNlLCBpOworCisJLyogbWF5YmUgc21hbGxlciB0aGFuIG1heCAoNDQxMDBIeikgKi8KKwlpZiAoSHogPD0gMCB8fCBIeiA+PSA0NDEwMCkgcmV0dXJuIDA7CisKKwliYXNlID0gMDsKKwlmb3IgKGZyZXEgPSBIeiAqIDI7IGZyZXEgPCA0NDEwMDsgZnJlcSAqPSAyKQorCQliYXNlKys7CisJYmFzZSAqPSAxMjAwOworCisJZnJlcSA9IDQ0MTAwICogMTAwMDAgLyAoZnJlcS8yKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQlpZiAoZnJlcSA8IHNlbWl0b25lX3R1bmluZ1tpKzFdKQorCQkJYnJlYWs7CisJCWJhc2UgKz0gMTAwOworCX0KKwlmcmVxID0gZnJlcSAqIDEwMDAwIC8gc2VtaXRvbmVfdHVuaW5nW2ldOworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoZnJlcSA8IGNlbnRfdHVuaW5nW2krMV0pCisJCQlicmVhazsKKwkJYmFzZSsrOworCX0KKwlyZXR1cm4gLWJhc2UgKiA0MDk2IC8gMTIwMDsKK30KKworCisvKgorICogY29udmVydCBlbnZlbG9wZSB0aW1lIHBhcmFtZXRlciB0byBBV0UzMiByYXcgcGFyYW1ldGVyCisgKi8KKworLyogYXR0YWNrICYgZGVjYXkvcmVsZWFzZSB0aW1lIHRhYmxlIChtc2VjKSAqLworc3RhdGljIHNob3J0IGF0dGFja190aW1lX3RibFsxMjhdID0geworMzI3NjcsIDMyNzY3LCA1OTg5LCA0MjM1LCAyOTk0LCAyNTE4LCAyMTE3LCAxNzgwLCAxNDk3LCAxMzczLCAxMjU5LCAxMTU0LCAxMDU4LCA5NzAsIDg5MCwgODE2LAorNzA3LCA2OTEsIDY2MiwgNjM0LCA2MDcsIDU4MSwgNTU3LCA1MzMsIDUxMCwgNDg5LCA0NjgsIDQ0OCwgNDI5LCA0MTEsIDM5MywgMzc3LAorMzYxLCAzNDUsIDMzMSwgMzE3LCAzMDMsIDI5MCwgMjc4LCAyNjYsIDI1NSwgMjQ0LCAyMzQsIDIyNCwgMjE0LCAyMDUsIDE5NiwgMTg4LAorMTgwLCAxNzIsIDE2NSwgMTU4LCAxNTEsIDE0NSwgMTM5LCAxMzMsIDEyNywgMTIyLCAxMTcsIDExMiwgMTA3LCAxMDIsIDk4LCA5NCwKKzkwLCA4NiwgODIsIDc5LCA3NSwgNzIsIDY5LCA2NiwgNjMsIDYxLCA1OCwgNTYsIDUzLCA1MSwgNDksIDQ3LAorNDUsIDQzLCA0MSwgMzksIDM3LCAzNiwgMzQsIDMzLCAzMSwgMzAsIDI5LCAyOCwgMjYsIDI1LCAyNCwgMjMsCisyMiwgMjEsIDIwLCAxOSwgMTksIDE4LCAxNywgMTYsIDE2LCAxNSwgMTUsIDE0LCAxMywgMTMsIDEyLCAxMiwKKzExLCAxMSwgMTAsIDEwLCAxMCwgOSwgOSwgOCwgOCwgOCwgOCwgNywgNywgNywgNiwgMCwKK307CisKK3N0YXRpYyBzaG9ydCBkZWNheV90aW1lX3RibFsxMjhdID0geworMzI3NjcsIDMyNzY3LCAyMjYxNCwgMTU5OTAsIDExMzA3LCA5NTA4LCA3OTk1LCA2NzIzLCA1NjUzLCA1MTg0LCA0NzU0LCA0MzU5LCAzOTk3LCAzNjY1LCAzMzYxLCAzMDgyLAorMjgyOCwgMjc2NSwgMjY0OCwgMjUzNSwgMjQyOCwgMjMyNSwgMjIyNiwgMjEzMiwgMjA0MiwgMTk1NSwgMTg3MiwgMTc5MywgMTcxNywgMTY0NCwgMTU3NCwgMTUwNywKKzE0NDMsIDEzODIsIDEzMjQsIDEyNjcsIDEyMTQsIDExNjIsIDExMTMsIDEwNjYsIDk3OCwgOTM2LCA4OTcsIDg1OSwgODIyLCA3ODcsIDc1NCwgNzIyLAorNjkxLCA2NjIsIDYzNCwgNjA3LCA1ODEsIDU1NywgNTMzLCA1MTAsIDQ4OSwgNDY4LCA0NDgsIDQyOSwgNDExLCAzOTMsIDM3NywgMzYxLAorMzQ1LCAzMzEsIDMxNywgMzAzLCAyOTAsIDI3OCwgMjY2LCAyNTUsIDI0NCwgMjM0LCAyMjQsIDIxNCwgMjA1LCAxOTYsIDE4OCwgMTgwLAorMTcyLCAxNjUsIDE1OCwgMTUxLCAxNDUsIDEzOSwgMTMzLCAxMjcsIDEyMiwgMTE3LCAxMTIsIDEwNywgMTAyLCA5OCwgOTQsIDkwLAorODYsIDgyLCA3OSwgNzUsIDcyLCA2OSwgNjYsIDYzLCA2MSwgNTgsIDU2LCA1MywgNTEsIDQ5LCA0NywgNDUsCis0MywgNDEsIDM5LCAzNywgMzYsIDM0LCAzMywgMzEsIDMwLCAyOSwgMjgsIDI2LCAyNSwgMjQsIDIzLCAyMiwKK307CisKKyNkZWZpbmUgY2FsY19wYXJtX2RlbGF5KG1zZWMpICgweDgwMDAgLSAobXNlYykgKiAxMDAwIC8gNzI1KTsKKworLyogZGVsYXkgdGltZSA9IDB4ODAwMCAtIG1zZWMvOTIgKi8KK3N0YXRpYyBpbnQKK2NhbGNfcGFybV9ob2xkKGludCBtc2VjKQoreworCWludCB2YWwgPSAoMHg3ZiAqIDkyIC0gbXNlYykgLyA5MjsKKwlpZiAodmFsIDwgMSkgdmFsID0gMTsKKwlpZiAodmFsID4gMTI3KSB2YWwgPSAxMjc7CisJcmV0dXJuIHZhbDsKK30KKworLyogYXR0YWNrIHRpbWU6IHNlYXJjaCBmcm9tIHRpbWUgdGFibGUgKi8KK3N0YXRpYyBpbnQKK2NhbGNfcGFybV9hdHRhY2soaW50IG1zZWMpCit7CisJcmV0dXJuIGNhbGNfcGFybV9zZWFyY2gobXNlYywgYXR0YWNrX3RpbWVfdGJsKTsKK30KKworLyogZGVjYXkvcmVsZWFzZSB0aW1lOiBzZWFyY2ggZnJvbSB0aW1lIHRhYmxlICovCitzdGF0aWMgaW50CitjYWxjX3Bhcm1fZGVjYXkoaW50IG1zZWMpCit7CisJcmV0dXJuIGNhbGNfcGFybV9zZWFyY2gobXNlYywgZGVjYXlfdGltZV90YmwpOworfQorCisvKiBzZWFyY2ggYW4gaW5kZXggZm9yIHNwZWNpZmllZCB0aW1lIGZyb20gZ2l2ZW4gdGltZSB0YWJsZSAqLworc3RhdGljIGludAorY2FsY19wYXJtX3NlYXJjaChpbnQgbXNlYywgc2hvcnQgKnRhYmxlKQoreworCWludCBsZWZ0ID0gMSwgcmlnaHQgPSAxMjcsIG1pZDsKKwl3aGlsZSAobGVmdCA8IHJpZ2h0KSB7CisJCW1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKwkJaWYgKG1zZWMgPCAoaW50KXRhYmxlW21pZF0pCisJCQlsZWZ0ID0gbWlkICsgMTsKKwkJZWxzZQorCQkJcmlnaHQgPSBtaWQ7CisJfQorCXJldHVybiBsZWZ0OworfQorI2VuZGlmIC8qIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkgKi8KKworCisvKgorICogZWZmZWN0cyB0YWJsZQorICovCisKKy8qIHNldCBhbiBlZmZlY3QgdmFsdWUgKi8KKyNkZWZpbmUgRlhfRkxBR19PRkYJMAorI2RlZmluZSBGWF9GTEFHX1NFVAkxCisjZGVmaW5lIEZYX0ZMQUdfQURECTIKKworI2RlZmluZSBGWF9TRVQocmVjLHR5cGUsdmFsdWUpIFwKKwkoKHJlYyktPmZsYWdzW3R5cGVdID0gRlhfRkxBR19TRVQsIChyZWMpLT52YWxbdHlwZV0gPSAodmFsdWUpKQorI2RlZmluZSBGWF9BREQocmVjLHR5cGUsdmFsdWUpIFwKKwkoKHJlYyktPmZsYWdzW3R5cGVdID0gRlhfRkxBR19BREQsIChyZWMpLT52YWxbdHlwZV0gPSAodmFsdWUpKQorI2RlZmluZSBGWF9VTlNFVChyZWMsdHlwZSkgXAorCSgocmVjKS0+ZmxhZ3NbdHlwZV0gPSBGWF9GTEFHX09GRiwgKHJlYyktPnZhbFt0eXBlXSA9IDApCisKKy8qIGNoZWNrIHRoZSBlZmZlY3QgdmFsdWUgaXMgc2V0ICovCisjZGVmaW5lIEZYX09OKHJlYyx0eXBlKQkoKHJlYyktPmZsYWdzW3R5cGVdKQorCisjZGVmaW5lIFBBUk1fQllURQkwCisjZGVmaW5lIFBBUk1fV09SRAkxCisjZGVmaW5lIFBBUk1fU0lHTgkyCisKK3N0YXRpYyBzdHJ1Y3QgUEFSTV9ERUZTIHsKKwlpbnQgdHlwZTsJLyogYnl0ZSBvciB3b3JkICovCisJaW50IGxvdywgaGlnaDsJLyogdmFsdWUgcmFuZ2UgKi8KKwlmeF9hZmZlY3RfZnVuYyByZWFsdGltZTsJLyogcmVhbHRpbWUgcGFyYW1hdGVyIGNoYW5nZSAqLworfSBwYXJtX2RlZnNbXSA9IHsKKwl7UEFSTV9XT1JELCAwLCAweDgwMDAsIE5VTEx9LAkvKiBlbnYxIGRlbGF5ICovCisJe1BBUk1fQllURSwgMSwgMHg3ZiwgTlVMTH0sCS8qIGVudjEgYXR0YWNrICovCisJe1BBUk1fQllURSwgMCwgMHg3ZSwgTlVMTH0sCS8qIGVudjEgaG9sZCAqLworCXtQQVJNX0JZVEUsIDEsIDB4N2YsIE5VTEx9LAkvKiBlbnYxIGRlY2F5ICovCisJe1BBUk1fQllURSwgMSwgMHg3ZiwgTlVMTH0sCS8qIGVudjEgcmVsZWFzZSAqLworCXtQQVJNX0JZVEUsIDAsIDB4N2YsIE5VTEx9LAkvKiBlbnYxIHN1c3RhaW4gKi8KKwl7UEFSTV9CWVRFLCAwLCAweGZmLCBOVUxMfSwJLyogZW52MSBwaXRjaCAqLworCXtQQVJNX0JZVEUsIDAsIDB4ZmYsIE5VTEx9LAkvKiBlbnYxIGN1dG9mZiAqLworCisJe1BBUk1fV09SRCwgMCwgMHg4MDAwLCBOVUxMfSwJLyogZW52MiBkZWxheSAqLworCXtQQVJNX0JZVEUsIDEsIDB4N2YsIE5VTEx9LAkvKiBlbnYyIGF0dGFjayAqLworCXtQQVJNX0JZVEUsIDAsIDB4N2UsIE5VTEx9LAkvKiBlbnYyIGhvbGQgKi8KKwl7UEFSTV9CWVRFLCAxLCAweDdmLCBOVUxMfSwJLyogZW52MiBkZWNheSAqLworCXtQQVJNX0JZVEUsIDEsIDB4N2YsIE5VTEx9LAkvKiBlbnYyIHJlbGVhc2UgKi8KKwl7UEFSTV9CWVRFLCAwLCAweDdmLCBOVUxMfSwJLyogZW52MiBzdXN0YWluICovCisKKwl7UEFSTV9XT1JELCAwLCAweDgwMDAsIE5VTEx9LAkvKiBsZm8xIGRlbGF5ICovCisJe1BBUk1fQllURSwgMCwgMHhmZiwgYXdlX2Z4X3RyZW1mcnF9LAkvKiBsZm8xIGZyZXEgKi8KKwl7UEFSTV9TSUdOLCAtMTI4LCAxMjcsIGF3ZV9meF90cmVtZnJxfSwJLyogbGZvMSB2b2x1bWUgKi8KKwl7UEFSTV9TSUdOLCAtMTI4LCAxMjcsIGF3ZV9meF9mbW1vZH0sCS8qIGxmbzEgcGl0Y2ggKi8KKwl7UEFSTV9CWVRFLCAwLCAweGZmLCBhd2VfZnhfZm1tb2R9LAkvKiBsZm8xIGN1dG9mZiAqLworCisJe1BBUk1fV09SRCwgMCwgMHg4MDAwLCBOVUxMfSwJLyogbGZvMiBkZWxheSAqLworCXtQQVJNX0JZVEUsIDAsIDB4ZmYsIGF3ZV9meF9mbTJmcnEyfSwJLyogbGZvMiBmcmVxICovCisJe1BBUk1fU0lHTiwgLTEyOCwgMTI3LCBhd2VfZnhfZm0yZnJxMn0sCS8qIGxmbzIgcGl0Y2ggKi8KKworCXtQQVJNX1dPUkQsIDAsIDB4ZmZmZiwgYXdlX3NldF92b2ljZV9waXRjaH0sCS8qIGluaXRpYWwgcGl0Y2ggKi8KKwl7UEFSTV9CWVRFLCAwLCAweGZmLCBOVUxMfSwJLyogY2hvcnVzICovCisJe1BBUk1fQllURSwgMCwgMHhmZiwgTlVMTH0sCS8qIHJldmVyYiAqLworCXtQQVJNX0JZVEUsIDAsIDB4ZmYsIGF3ZV9zZXRfdm9sdW1lfSwJLyogaW5pdGlhbCBjdXRvZmYgKi8KKwl7UEFSTV9CWVRFLCAwLCAxNSwgYXdlX2Z4X2ZpbHRlclF9LAkvKiBpbml0aWFsIHJlc29uYW5jZSAqLworCisJe1BBUk1fV09SRCwgMCwgMHhmZmZmLCBOVUxMfSwJLyogc2FtcGxlIHN0YXJ0ICovCisJe1BBUk1fV09SRCwgMCwgMHhmZmZmLCBOVUxMfSwJLyogbG9vcCBzdGFydCAqLworCXtQQVJNX1dPUkQsIDAsIDB4ZmZmZiwgTlVMTH0sCS8qIGxvb3AgZW5kICovCisJe1BBUk1fV09SRCwgMCwgMHhmZmZmLCBOVUxMfSwJLyogY29hcnNlIHNhbXBsZSBzdGFydCAqLworCXtQQVJNX1dPUkQsIDAsIDB4ZmZmZiwgTlVMTH0sCS8qIGNvYXJzZSBsb29wIHN0YXJ0ICovCisJe1BBUk1fV09SRCwgMCwgMHhmZmZmLCBOVUxMfSwJLyogY29hcnNlIGxvb3AgZW5kICovCisJe1BBUk1fQllURSwgMCwgMHhmZiwgYXdlX3NldF92b2x1bWV9LAkvKiBpbml0aWFsIGF0dGVudWF0aW9uICovCit9OworCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitGWF9CWVRFKEZYX1JlYyAqcmVjLCBGWF9SZWMgKmxheSwgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJaW50IGVmZmVjdCA9IDA7CisJaW50IG9uID0gMDsKKwlpZiAobGF5ICYmIChvbiA9IEZYX09OKGxheSwgdHlwZSkpICE9IDApCisJCWVmZmVjdCA9IGxheS0+dmFsW3R5cGVdOworCWlmICghb24gJiYgKG9uID0gRlhfT04ocmVjLCB0eXBlKSkgIT0gMCkKKwkJZWZmZWN0ID0gcmVjLT52YWxbdHlwZV07CisJaWYgKG9uID09IEZYX0ZMQUdfQUREKSB7CisJCWlmIChwYXJtX2RlZnNbdHlwZV0udHlwZSA9PSBQQVJNX1NJR04pIHsKKwkJCWlmICh2YWx1ZSA+IDB4N2YpCisJCQkJZWZmZWN0ICs9IChpbnQpdmFsdWUgLSAweDEwMDsKKwkJCWVsc2UKKwkJCQllZmZlY3QgKz0gKGludCl2YWx1ZTsKKwkJfSBlbHNlIHsKKwkJCWVmZmVjdCArPSAoaW50KXZhbHVlOworCQl9CisJfQorCWlmIChvbikgeworCQlpZiAoZWZmZWN0IDwgcGFybV9kZWZzW3R5cGVdLmxvdykKKwkJCWVmZmVjdCA9IHBhcm1fZGVmc1t0eXBlXS5sb3c7CisJCWVsc2UgaWYgKGVmZmVjdCA+IHBhcm1fZGVmc1t0eXBlXS5oaWdoKQorCQkJZWZmZWN0ID0gcGFybV9kZWZzW3R5cGVdLmhpZ2g7CisJCXJldHVybiAodW5zaWduZWQgY2hhcillZmZlY3Q7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworLyogZ2V0IHdvcmQgZWZmZWN0IHZhbHVlICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK0ZYX1dPUkQoRlhfUmVjICpyZWMsIEZYX1JlYyAqbGF5LCBpbnQgdHlwZSwgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJaW50IGVmZmVjdCA9IDA7CisJaW50IG9uID0gMDsKKwlpZiAobGF5ICYmIChvbiA9IEZYX09OKGxheSwgdHlwZSkpICE9IDApCisJCWVmZmVjdCA9IGxheS0+dmFsW3R5cGVdOworCWlmICghb24gJiYgKG9uID0gRlhfT04ocmVjLCB0eXBlKSkgIT0gMCkKKwkJZWZmZWN0ID0gcmVjLT52YWxbdHlwZV07CisJaWYgKG9uID09IEZYX0ZMQUdfQUREKQorCQllZmZlY3QgKz0gKGludCl2YWx1ZTsKKwlpZiAob24pIHsKKwkJaWYgKGVmZmVjdCA8IHBhcm1fZGVmc1t0eXBlXS5sb3cpCisJCQllZmZlY3QgPSBwYXJtX2RlZnNbdHlwZV0ubG93OworCQllbHNlIGlmIChlZmZlY3QgPiBwYXJtX2RlZnNbdHlwZV0uaGlnaCkKKwkJCWVmZmVjdCA9IHBhcm1fZGVmc1t0eXBlXS5oaWdoOworCQlyZXR1cm4gKHVuc2lnbmVkIHNob3J0KWVmZmVjdDsKKwl9CisJcmV0dXJuIHZhbHVlOworfQorCisvKiBnZXQgd29yZCAodXBwZXI9dHlwZTEvbG93ZXI9dHlwZTIpIGVmZmVjdCB2YWx1ZSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0CitGWF9DT01CKEZYX1JlYyAqcmVjLCBGWF9SZWMgKmxheSwgaW50IHR5cGUxLCBpbnQgdHlwZTIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCXVuc2lnbmVkIHNob3J0IHRtcDsKKwl0bXAgPSBGWF9CWVRFKHJlYywgbGF5LCB0eXBlMSwgKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDgpKTsKKwl0bXAgPDw9IDg7CisJdG1wIHw9IEZYX0JZVEUocmVjLCBsYXksIHR5cGUyLCAodW5zaWduZWQgY2hhcikodmFsdWUgJiAweGZmKSk7CisJcmV0dXJuIHRtcDsKK30KKworLyogYWRkcmVzcyBvZmZzZXQgKi8KK3N0YXRpYyBpbnQKK0ZYX09GRlNFVChGWF9SZWMgKnJlYywgRlhfUmVjICpsYXksIGludCBsbywgaW50IGhpLCBpbnQgbW9kZSkKK3sKKwlpbnQgYWRkciA9IDA7CisJaWYgKGxheSAmJiBGWF9PTihsYXksIGhpKSkKKwkJYWRkciA9IChzaG9ydClsYXktPnZhbFtoaV07CisJZWxzZSBpZiAoRlhfT04ocmVjLCBoaSkpCisJCWFkZHIgPSAoc2hvcnQpcmVjLT52YWxbaGldOworCWFkZHIgPSBhZGRyIDw8IDE1OworCWlmIChsYXkgJiYgRlhfT04obGF5LCBsbykpCisJCWFkZHIgKz0gKHNob3J0KWxheS0+dmFsW2xvXTsKKwllbHNlIGlmIChGWF9PTihyZWMsIGxvKSkKKwkJYWRkciArPSAoc2hvcnQpcmVjLT52YWxbbG9dOworCWlmICghKG1vZGUgJiBBV0VfU0FNUExFXzhCSVRTKSkKKwkJYWRkciAvPSAyOworCXJldHVybiBhZGRyOworfQorCisKKy8qCisgKiB0dXJuIG9uL29mZiBzYW1wbGUKKyAqLworCisvKiB0YWJsZSBmb3Igdm9sdW1lIHRhcmdldCBjYWxjdWxhdGlvbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHZvbHRhcmdldFsxNl0gPSB7IAorICAgMHhFQUMwLCAwWEUwQzgsIDBYRDc0MCwgMFhDRTIwLCAwWEM1NjAsIDBYQkQwOCwgMFhCNTAwLCAwWEFENTgsCisgICAwWEE1RjgsIDBYOUVGMCwgMFg5ODMwLCAwWDkxQzAsIDBYOEI5MCwgMFg4NUE4LCAwWDgwMDAsIDBYN0E5MAorfTsKKworc3RhdGljIHZvaWQKK2F3ZV9ub3RlX29uKGludCB2b2ljZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKwlpbnQgYWRkcjsKKwlpbnQgdnRhcmdldCwgZnRhcmdldCwgcHRhcmdldCwgcGl0Y2g7CisJYXdlX3ZvaWNlX2luZm8gKnZwOworCWF3ZV92b2ljZV9wYXJtX2Jsb2NrICpwYXJtOworCUZYX1JlYyAqZnggPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+Zng7CisJRlhfUmVjICpmeF9sYXkgPSBOVUxMOworCWlmICh2b2ljZXNbdm9pY2VdLmxheWVyIDwgTUFYX0xBWUVSUykKKwkJZnhfbGF5ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4X2xheWVyW3ZvaWNlc1t2b2ljZV0ubGF5ZXJdOworCisJLyogQSB2b2ljZSBzYW1wbGUgbXVzdCBhc3NpZ25lZCBiZWZvcmUgY2FsbGluZyAqLworCWlmICgodnAgPSB2b2ljZXNbdm9pY2VdLnNhbXBsZSkgPT0gTlVMTCB8fCB2cC0+aW5kZXggPT0gMCkKKwkJcmV0dXJuOworCisJcGFybSA9IChhd2Vfdm9pY2VfcGFybV9ibG9jayopJnZwLT5wYXJtOworCisJLyogY2hhbm5lbCB0byBiZSBzaWxlbnQgYW5kIGlkbGUgKi8KKwlhd2VfcG9rZShBV0VfRENZU1VTVih2b2ljZSksIDB4MDA4MCk7CisJYXdlX3Bva2UoQVdFX1ZURlQodm9pY2UpLCAweDAwMDBGRkZGKTsKKwlhd2VfcG9rZShBV0VfQ1ZDRih2b2ljZSksIDB4MDAwMEZGRkYpOworCWF3ZV9wb2tlKEFXRV9QVFJYKHZvaWNlKSwgMCk7CisJYXdlX3Bva2UoQVdFX0NQRih2b2ljZSksIDApOworCisJLyogc2V0IHBpdGNoIG9mZnNldCAqLworCWF3ZV9zZXRfcGl0Y2godm9pY2UsIFRSVUUpOworCisJLyogbW9kdWxhdGlvbiAmIHZvbHVtZSBlbnZlbG9wZSAqLworCWlmIChwYXJtLT5tb2RhdGsgPj0gMHg4MCAmJiBwYXJtLT5tb2RkZWxheSA+PSAweDgwMDApIHsKKwkJYXdlX3Bva2UoQVdFX0VOVlZBTCh2b2ljZSksIDB4QkZGRik7CisJCXBpdGNoID0gKHBhcm0tPmVudjFwaXQ8PDQpICsgdm9pY2VzW3ZvaWNlXS5hcGl0Y2g7CisJCWlmIChwaXRjaCA+IDB4ZmZmZikgcGl0Y2ggPSAweGZmZmY7CisJCS8qIGNhbGN1bGF0ZSBmaWx0ZXIgdGFyZ2V0ICovCisJCWZ0YXJnZXQgPSBwYXJtLT5jdXRvZmYgKyBwYXJtLT5lbnYxZmM7CisJCWxpbWl0dmFsdWUoZnRhcmdldCwgMCwgMjU1KTsKKwkJZnRhcmdldCA8PD0gODsKKwl9IGVsc2UgeworCQlhd2VfcG9rZShBV0VfRU5WVkFMKHZvaWNlKSwKKwkJCSBGWF9XT1JEKGZ4LCBmeF9sYXksIEFXRV9GWF9FTlYxX0RFTEFZLCBwYXJtLT5tb2RkZWxheSkpOworCQlmdGFyZ2V0ID0gcGFybS0+Y3V0b2ZmOworCQlmdGFyZ2V0IDw8PSA4OworCQlwaXRjaCA9IHZvaWNlc1t2b2ljZV0uYXBpdGNoOworCX0KKworCS8qIGNhbGN1YWx0ZSBwaXRjaCB0YXJnZXQgKi8KKwlpZiAocGl0Y2ggIT0gMHhmZmZmKSB7CisJCXB0YXJnZXQgPSAxIDw8IChwaXRjaCA+PiAxMik7CisJCWlmIChwaXRjaCAmIDB4ODAwKSBwdGFyZ2V0ICs9IChwdGFyZ2V0KjB4MTAyZSkvMHgyNzEwOworCQlpZiAocGl0Y2ggJiAweDQwMCkgcHRhcmdldCArPSAocHRhcmdldCoweDc2NCkvMHgyNzEwOworCQlpZiAocGl0Y2ggJiAweDIwMCkgcHRhcmdldCArPSAocHRhcmdldCoweDM4OSkvMHgyNzEwOworCQlwdGFyZ2V0ICs9IChwdGFyZ2V0Pj4xKTsKKwkJaWYgKHB0YXJnZXQgPiAweGZmZmYpIHB0YXJnZXQgPSAweGZmZmY7CisKKwl9IGVsc2UgcHRhcmdldCA9IDB4ZmZmZjsKKwlpZiAocGFybS0+bW9kYXRrID49IDB4ODApCisJCWF3ZV9wb2tlKEFXRV9BVEtITEQodm9pY2UpLAorCQkJIEZYX0JZVEUoZngsIGZ4X2xheSwgQVdFX0ZYX0VOVjFfSE9MRCwgcGFybS0+bW9kaGxkKSA8PCA4IHwgMHg3Zik7CisJZWxzZQorCQlhd2VfcG9rZShBV0VfQVRLSExEKHZvaWNlKSwKKwkJCSBGWF9DT01CKGZ4LCBmeF9sYXksIEFXRV9GWF9FTlYxX0hPTEQsIEFXRV9GWF9FTlYxX0FUVEFDSywKKwkJCQkgdnAtPnBhcm0ubW9kYXRraGxkKSk7CisJYXdlX3Bva2UoQVdFX0RDWVNVUyh2b2ljZSksCisJCSBGWF9DT01CKGZ4LCBmeF9sYXksIEFXRV9GWF9FTlYxX1NVU1RBSU4sIEFXRV9GWF9FTlYxX0RFQ0FZLAorCQkJICB2cC0+cGFybS5tb2RkY3lzdXMpKTsKKworCWlmIChwYXJtLT52b2xhdGsgPj0gMHg4MCAmJiBwYXJtLT52b2xkZWxheSA+PSAweDgwMDApIHsKKwkJYXdlX3Bva2UoQVdFX0VOVlZPTCh2b2ljZSksIDB4QkZGRik7CisJCXZ0YXJnZXQgPSB2b2x0YXJnZXRbdm9pY2VzW3ZvaWNlXS5hdm9sJTB4MTBdPj4odm9pY2VzW3ZvaWNlXS5hdm9sPj40KTsKKwl9IGVsc2UgeworCQlhd2VfcG9rZShBV0VfRU5WVk9MKHZvaWNlKSwKKwkJCSBGWF9XT1JEKGZ4LCBmeF9sYXksIEFXRV9GWF9FTlYyX0RFTEFZLCB2cC0+cGFybS52b2xkZWxheSkpOworCQl2dGFyZ2V0ID0gMDsKKwl9CisJaWYgKHBhcm0tPnZvbGF0ayA+PSAweDgwKQorCQlhd2VfcG9rZShBV0VfQVRLSExEVih2b2ljZSksCisJCQkgRlhfQllURShmeCwgZnhfbGF5LCBBV0VfRlhfRU5WMl9IT0xELCBwYXJtLT52b2xobGQpIDw8IDggfCAweDdmKTsKKwllbHNlCisJCWF3ZV9wb2tlKEFXRV9BVEtITERWKHZvaWNlKSwKKwkJCSBGWF9DT01CKGZ4LCBmeF9sYXksIEFXRV9GWF9FTlYyX0hPTEQsIEFXRV9GWF9FTlYyX0FUVEFDSywKKwkJCSB2cC0+cGFybS52b2xhdGtobGQpKTsKKwkvKiBkZWNheS9zdXN0YWluIHBhcmFtZXRlciBmb3Igdm9sdW1lIGVudmVsb3BlIG11c3QgYmUgc2V0IGF0IGxhc3QgKi8KKworCS8qIGN1dG9mZiBhbmQgdm9sdW1lICovCisJYXdlX3NldF92b2x1bWUodm9pY2UsIFRSVUUpOworCisJLyogbW9kdWxhdGlvbiBlbnZlbG9wZSBoZWlnaHRzICovCisJYXdlX3Bva2UoQVdFX1BFRkUodm9pY2UpLAorCQkgRlhfQ09NQihmeCwgZnhfbGF5LCBBV0VfRlhfRU5WMV9QSVRDSCwgQVdFX0ZYX0VOVjFfQ1VUT0ZGLAorCQkJIHZwLT5wYXJtLnBlZmUpKTsKKworCS8qIGxmbzEvMiBkZWxheSAqLworCWF3ZV9wb2tlKEFXRV9MRk8xVkFMKHZvaWNlKSwKKwkJIEZYX1dPUkQoZngsIGZ4X2xheSwgQVdFX0ZYX0xGTzFfREVMQVksIHZwLT5wYXJtLmxmbzFkZWxheSkpOworCWF3ZV9wb2tlKEFXRV9MRk8yVkFMKHZvaWNlKSwKKwkJIEZYX1dPUkQoZngsIGZ4X2xheSwgQVdFX0ZYX0xGTzJfREVMQVksIHZwLT5wYXJtLmxmbzJkZWxheSkpOworCisJLyogbGZvMSBwaXRjaCAmIGN1dG9mZiBzaGlmdCAqLworCWF3ZV9meF9mbW1vZCh2b2ljZSwgVFJVRSk7CisJLyogbGZvMSB2b2x1bWUgJiBmcmVxICovCisJYXdlX2Z4X3RyZW1mcnEodm9pY2UsIFRSVUUpOworCS8qIGxmbzIgcGl0Y2ggJiBmcmVxICovCisJYXdlX2Z4X2ZtMmZycTIodm9pY2UsIFRSVUUpOworCS8qIHBhbiAmIGxvb3Agc3RhcnQgKi8KKwlhd2Vfc2V0X3Bhbih2b2ljZSwgVFJVRSk7CisKKwkvKiBjaG9ydXMgJiBsb29wIGVuZCAoY2hvcnVzIDhiaXQsIE1TQikgKi8KKwlhZGRyID0gdnAtPmxvb3BlbmQgLSAxOworCWFkZHIgKz0gRlhfT0ZGU0VUKGZ4LCBmeF9sYXksIEFXRV9GWF9MT09QX0VORCwKKwkJCSAgQVdFX0ZYX0NPQVJTRV9MT09QX0VORCwgdnAtPm1vZGUpOworCXRlbXAgPSBGWF9CWVRFKGZ4LCBmeF9sYXksIEFXRV9GWF9DSE9SVVMsIHZwLT5wYXJtLmNob3J1cyk7CisJdGVtcCA9ICh0ZW1wIDw8MjQpIHwgKHVuc2lnbmVkIGludClhZGRyOworCWF3ZV9wb2tlX2R3KEFXRV9DU0wodm9pY2UpLCB0ZW1wKTsKKwlERUJVRyg0LHByaW50aygiQVdFMzI6IFstLSBsb29wZW5kPSV4LyV4XVxuIiwgdnAtPmxvb3BlbmQsIGFkZHIpKTsKKworCS8qIFEgJiBjdXJyZW50IGFkZHJlc3MgKFEgNGJpdCB2YWx1ZSwgTVNCKSAqLworCWFkZHIgPSB2cC0+c3RhcnQgLSAxOworCWFkZHIgKz0gRlhfT0ZGU0VUKGZ4LCBmeF9sYXksIEFXRV9GWF9TQU1QTEVfU1RBUlQsCisJCQkgIEFXRV9GWF9DT0FSU0VfU0FNUExFX1NUQVJULCB2cC0+bW9kZSk7CisJdGVtcCA9IEZYX0JZVEUoZngsIGZ4X2xheSwgQVdFX0ZYX0ZJTFRFUlEsIHZwLT5wYXJtLmZpbHRlclEpOworCXRlbXAgPSAodGVtcDw8MjgpIHwgKHVuc2lnbmVkIGludClhZGRyOworCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKHZvaWNlKSwgdGVtcCk7CisJREVCVUcoNCxwcmludGsoIkFXRTMyOiBbLS0gc3RhcnRhZGRyPSV4LyV4XVxuIiwgdnAtPnN0YXJ0LCBhZGRyKSk7CisKKwkvKiBjbGVhciB1bmtub3duIHJlZ2lzdGVycyAqLworCWF3ZV9wb2tlX2R3KEFXRV8wMEEwKHZvaWNlKSwgMCk7CisJYXdlX3Bva2VfZHcoQVdFXzAwODAodm9pY2UpLCAwKTsKKworCS8qIHJlc2V0IHZvbHVtZSAqLworCWF3ZV9wb2tlX2R3KEFXRV9WVEZUKHZvaWNlKSwgKHZ0YXJnZXQ8PDE2KXxmdGFyZ2V0KTsKKwlhd2VfcG9rZV9kdyhBV0VfQ1ZDRih2b2ljZSksICh2dGFyZ2V0PDwxNil8ZnRhcmdldCk7CisKKwkvKiBzZXQgcmV2ZXJiICovCisJdGVtcCA9IEZYX0JZVEUoZngsIGZ4X2xheSwgQVdFX0ZYX1JFVkVSQiwgdnAtPnBhcm0ucmV2ZXJiKTsKKwl0ZW1wID0gKHRlbXAgPDwgOCkgfCAocHRhcmdldCA8PCAxNikgfCB2b2ljZXNbdm9pY2VdLmFhdXg7CisJYXdlX3Bva2VfZHcoQVdFX1BUUlgodm9pY2UpLCB0ZW1wKTsKKwlhd2VfcG9rZV9kdyhBV0VfQ1BGKHZvaWNlKSwgcHRhcmdldCA8PCAxNik7CisJLyogdHVybiBvbiBlbnZlbG9wZSAqLworCWF3ZV9wb2tlKEFXRV9EQ1lTVVNWKHZvaWNlKSwKKwkJIEZYX0NPTUIoZngsIGZ4X2xheSwgQVdFX0ZYX0VOVjJfU1VTVEFJTiwgQVdFX0ZYX0VOVjJfREVDQVksCisJCQkgIHZwLT5wYXJtLnZvbGRjeXN1cykpOworCisJdm9pY2VzW3ZvaWNlXS5zdGF0ZSA9IEFXRV9TVF9PTjsKKworCS8qIGNsZWFyIHZvaWNlIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBub3RlIG9uIHRoaXMgY2hhbm5lbCAqLworCWlmIChTSU5HTEVfTEFZRVJfTU9ERSgpKSB7CisJCUZYX1VOU0VUKGZ4LCBBV0VfRlhfU0FNUExFX1NUQVJUKTsKKwkJRlhfVU5TRVQoZngsIEFXRV9GWF9DT0FSU0VfU0FNUExFX1NUQVJUKTsKKwl9Cit9CisKKworLyogdHVybiBvZmYgdGhlIHZvaWNlICovCitzdGF0aWMgdm9pZAorYXdlX25vdGVfb2ZmKGludCB2b2ljZSkKK3sKKwlhd2Vfdm9pY2VfaW5mbyAqdnA7CisJdW5zaWduZWQgc2hvcnQgdG1wOworCUZYX1JlYyAqZnggPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+Zng7CisJRlhfUmVjICpmeF9sYXkgPSBOVUxMOworCWlmICh2b2ljZXNbdm9pY2VdLmxheWVyIDwgTUFYX0xBWUVSUykKKwkJZnhfbGF5ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4X2xheWVyW3ZvaWNlc1t2b2ljZV0ubGF5ZXJdOworCisJaWYgKCh2cCA9IHZvaWNlc1t2b2ljZV0uc2FtcGxlKSA9PSBOVUxMKSB7CisJCXZvaWNlc1t2b2ljZV0uc3RhdGUgPSBBV0VfU1RfT0ZGOworCQlyZXR1cm47CisJfQorCisJdG1wID0gMHg4MDAwIHwgRlhfQllURShmeCwgZnhfbGF5LCBBV0VfRlhfRU5WMV9SRUxFQVNFLAorCQkJICAgICAgICh1bnNpZ25lZCBjaGFyKXZwLT5wYXJtLm1vZHJlbGVhc2UpOworCWF3ZV9wb2tlKEFXRV9EQ1lTVVModm9pY2UpLCB0bXApOworCXRtcCA9IDB4ODAwMCB8IEZYX0JZVEUoZngsIGZ4X2xheSwgQVdFX0ZYX0VOVjJfUkVMRUFTRSwKKwkJCSAgICAgICAodW5zaWduZWQgY2hhcil2cC0+cGFybS52b2xyZWxlYXNlKTsKKwlhd2VfcG9rZShBV0VfRENZU1VTVih2b2ljZSksIHRtcCk7CisJdm9pY2VzW3ZvaWNlXS5zdGF0ZSA9IEFXRV9TVF9SRUxFQVNFRDsKK30KKworLyogZm9yY2UgdG8gdGVybWluYXRlIHRoZSB2b2ljZSAobm8gcmVsZWFzaW5nIGVjaG8pICovCitzdGF0aWMgdm9pZAorYXdlX3Rlcm1pbmF0ZShpbnQgdm9pY2UpCit7CisJYXdlX3Bva2UoQVdFX0RDWVNVU1Yodm9pY2UpLCAweDgwN0YpOworCWF3ZV90d2Vha192b2ljZSh2b2ljZSk7CisJdm9pY2VzW3ZvaWNlXS5zdGF0ZSA9IEFXRV9TVF9PRkY7Cit9CisKKy8qIHR1cm4gb2ZmIG90aGVyIHZvaWNlcyB3aXRoIHRoZSBzYW1lIGV4Y2x1c2l2ZSBjbGFzcyAoZm9yIGRydW1zKSAqLworc3RhdGljIHZvaWQKK2F3ZV9leGNsdXNpdmVfb2ZmKGludCB2b2ljZSkKK3sKKwlpbnQgaSwgZXhjbGFzczsKKworCWlmICh2b2ljZXNbdm9pY2VdLnNhbXBsZSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChleGNsYXNzID0gdm9pY2VzW3ZvaWNlXS5zYW1wbGUtPmV4Y2x1c2l2ZUNsYXNzKSA9PSAwKQorCQlyZXR1cm47CS8qIG5vdCBleGNsdXNpdmUgKi8KKworCS8qIHR1cm4gb2ZmIHZvaWNlcyB3aXRoIHRoZSBzYW1lIGNsYXNzICovCisJZm9yIChpID0gMDsgaSA8IGF3ZV9tYXhfdm9pY2VzOyBpKyspIHsKKwkJaWYgKGkgIT0gdm9pY2UgJiYgSVNfUExBWUlORyhpKSAmJgorCQkgICAgdm9pY2VzW2ldLnNhbXBsZSAmJiB2b2ljZXNbaV0uY2ggPT0gdm9pY2VzW3ZvaWNlXS5jaCAmJgorCQkgICAgdm9pY2VzW2ldLnNhbXBsZS0+ZXhjbHVzaXZlQ2xhc3MgPT0gZXhjbGFzcykgeworCQkJREVCVUcoNCxwcmludGsoIkFXRTMyOiBbZXhvZmYoJWQpXVxuIiwgaSkpOworCQkJYXdlX3Rlcm1pbmF0ZShpKTsKKwkJCWF3ZV92b2ljZV9pbml0KGksIFRSVUUpOworCQl9CisJfQorfQorCisKKy8qCisgKiBjaGFuZ2UgdGhlIHBhcmFtZXRlcnMgb2YgYW4gYXVkaWJsZSB2b2ljZQorICovCisKKy8qIGNoYW5nZSBwaXRjaCAqLworc3RhdGljIHZvaWQKK2F3ZV9zZXRfcGl0Y2goaW50IHZvaWNlLCBpbnQgZm9yY2VkKQoreworCWlmIChJU19OT19FRkZFQ1Qodm9pY2UpICYmICFmb3JjZWQpIHJldHVybjsKKwlhd2VfcG9rZShBV0VfSVAodm9pY2UpLCB2b2ljZXNbdm9pY2VdLmFwaXRjaCk7CisJREVCVUcoMyxwcmludGsoIkFXRTMyOiBbLS0gcGl0Y2g9JXhdXG4iLCB2b2ljZXNbdm9pY2VdLmFwaXRjaCkpOworfQorCisvKiBjYWxjdWxhdGUgJiBjaGFuZ2UgcGl0Y2ggKi8KK3N0YXRpYyB2b2lkCithd2Vfc2V0X3ZvaWNlX3BpdGNoKGludCB2b2ljZSwgaW50IGZvcmNlZCkKK3sKKwlhd2VfY2FsY19waXRjaCh2b2ljZSk7CisJYXdlX3NldF9waXRjaCh2b2ljZSwgZm9yY2VkKTsKK30KKworLyogY2hhbmdlIHZvbHVtZSAmIGN1dG9mZiAqLworc3RhdGljIHZvaWQKK2F3ZV9zZXRfdm9sdW1lKGludCB2b2ljZSwgaW50IGZvcmNlZCkKK3sKKwlhd2Vfdm9pY2VfaW5mbyAqdnA7CisJdW5zaWduZWQgc2hvcnQgdG1wMjsKKwlGWF9SZWMgKmZ4ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4OworCUZYX1JlYyAqZnhfbGF5ID0gTlVMTDsKKwlpZiAodm9pY2VzW3ZvaWNlXS5sYXllciA8IE1BWF9MQVlFUlMpCisJCWZ4X2xheSA9ICZ2b2ljZXNbdm9pY2VdLmNpbmZvLT5meF9sYXllclt2b2ljZXNbdm9pY2VdLmxheWVyXTsKKworCWlmICghSVNfUExBWUlORyh2b2ljZSkgJiYgIWZvcmNlZCkgcmV0dXJuOworCWlmICgodnAgPSB2b2ljZXNbdm9pY2VdLnNhbXBsZSkgPT0gTlVMTCB8fCB2cC0+aW5kZXggPT0gMCkKKwkJcmV0dXJuOworCisJdG1wMiA9IEZYX0JZVEUoZngsIGZ4X2xheSwgQVdFX0ZYX0NVVE9GRiwKKwkJICAgICAgICh1bnNpZ25lZCBjaGFyKXZvaWNlc1t2b2ljZV0uYWN1dG9mZik7CisJdG1wMiA9ICh0bXAyIDw8IDgpOworCXRtcDIgfD0gRlhfQllURShmeCwgZnhfbGF5LCBBV0VfRlhfQVRURU4sCisJCQkodW5zaWduZWQgY2hhcil2b2ljZXNbdm9pY2VdLmF2b2wpOworCWF3ZV9wb2tlKEFXRV9JRkFUTih2b2ljZSksIHRtcDIpOworfQorCisvKiBjYWxjdWxhdGUgJiBjaGFuZ2Ugdm9sdW1lICovCitzdGF0aWMgdm9pZAorYXdlX3NldF92b2ljZV92b2woaW50IHZvaWNlLCBpbnQgZm9yY2VkKQoreworCWlmIChJU19FTVBUWSh2b2ljZSkpCisJCXJldHVybjsKKwlhd2VfY2FsY192b2x1bWUodm9pY2UpOworCWF3ZV9zZXRfdm9sdW1lKHZvaWNlLCBmb3JjZWQpOworfQorCisKKy8qIGNoYW5nZSBwYW47IHRoaXMgY291bGQgbWFrZSBhIGNsaWNrIG5vaXNlLi4gKi8KK3N0YXRpYyB2b2lkCithd2Vfc2V0X3BhbihpbnQgdm9pY2UsIGludCBmb3JjZWQpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisJaW50IGFkZHI7CisJYXdlX3ZvaWNlX2luZm8gKnZwOworCUZYX1JlYyAqZnggPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+Zng7CisJRlhfUmVjICpmeF9sYXkgPSBOVUxMOworCWlmICh2b2ljZXNbdm9pY2VdLmxheWVyIDwgTUFYX0xBWUVSUykKKwkJZnhfbGF5ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4X2xheWVyW3ZvaWNlc1t2b2ljZV0ubGF5ZXJdOworCisJaWYgKElTX05PX0VGRkVDVCh2b2ljZSkgJiYgIWZvcmNlZCkgcmV0dXJuOworCWlmICgodnAgPSB2b2ljZXNbdm9pY2VdLnNhbXBsZSkgPT0gTlVMTCB8fCB2cC0+aW5kZXggPT0gMCkKKwkJcmV0dXJuOworCisJLyogcGFuICYgbG9vcCBzdGFydCAocGFuIDhiaXQsIE1TQiwgMDpyaWdodCwgMHhmZjpsZWZ0KSAqLworCWlmICh2cC0+Zml4cGFuID4gMCkJLyogMC0xMjcgKi8KKwkJdGVtcCA9IDI1NSAtIChpbnQpdnAtPmZpeHBhbiAqIDI7CisJZWxzZSB7CisJCWludCBwb3MgPSAwOworCQlpZiAodnAtPnBhbiA+PSAwKSAvKiAwLTEyNyAqLworCQkJcG9zID0gKGludCl2cC0+cGFuICogMiAtIDEyODsKKwkJcG9zICs9IHZvaWNlc1t2b2ljZV0uY2luZm8tPnBhbm5pbmc7IC8qIC0xMjggLSAxMjcgKi8KKwkJdGVtcCA9IDEyNyAtIHBvczsKKwl9CisJbGltaXR2YWx1ZSh0ZW1wLCAwLCAyNTUpOworCWlmIChjdHJsc1tBV0VfTURfUEFOX0VYQ0hBTkdFXSkgeworCQl0ZW1wID0gMjU1IC0gdGVtcDsKKwl9CisJaWYgKGZvcmNlZCB8fCB0ZW1wICE9IHZvaWNlc1t2b2ljZV0uYXBhbikgeworCQl2b2ljZXNbdm9pY2VdLmFwYW4gPSB0ZW1wOworCQlpZiAodGVtcCA9PSAwKQorCQkJdm9pY2VzW3ZvaWNlXS5hYXV4ID0gMHhmZjsKKwkJZWxzZQorCQkJdm9pY2VzW3ZvaWNlXS5hYXV4ID0gKC10ZW1wKSAmIDB4ZmY7CisJCWFkZHIgPSB2cC0+bG9vcHN0YXJ0IC0gMTsKKwkJYWRkciArPSBGWF9PRkZTRVQoZngsIGZ4X2xheSwgQVdFX0ZYX0xPT1BfU1RBUlQsCisJCQkJICBBV0VfRlhfQ09BUlNFX0xPT1BfU1RBUlQsIHZwLT5tb2RlKTsKKwkJdGVtcCA9ICh0ZW1wPDwyNCkgfCAodW5zaWduZWQgaW50KWFkZHI7CisJCWF3ZV9wb2tlX2R3KEFXRV9QU1NUKHZvaWNlKSwgdGVtcCk7CisJCURFQlVHKDQscHJpbnRrKCJBV0UzMjogWy0tIGxvb3BzdGFydD0leC8leF1cbiIsIHZwLT5sb29wc3RhcnQsIGFkZHIpKTsKKwl9Cit9CisKKy8qIGVmZmVjdHMgY2hhbmdlIGR1cmluZyBwbGF5aW5nICovCitzdGF0aWMgdm9pZAorYXdlX2Z4X2ZtbW9kKGludCB2b2ljZSwgaW50IGZvcmNlZCkKK3sKKwlhd2Vfdm9pY2VfaW5mbyAqdnA7CisJRlhfUmVjICpmeCA9ICZ2b2ljZXNbdm9pY2VdLmNpbmZvLT5meDsKKwlGWF9SZWMgKmZ4X2xheSA9IE5VTEw7CisJaWYgKHZvaWNlc1t2b2ljZV0ubGF5ZXIgPCBNQVhfTEFZRVJTKQorCQlmeF9sYXkgPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+ZnhfbGF5ZXJbdm9pY2VzW3ZvaWNlXS5sYXllcl07CisKKwlpZiAoSVNfTk9fRUZGRUNUKHZvaWNlKSAmJiAhZm9yY2VkKSByZXR1cm47CisJaWYgKCh2cCA9IHZvaWNlc1t2b2ljZV0uc2FtcGxlKSA9PSBOVUxMIHx8IHZwLT5pbmRleCA9PSAwKQorCQlyZXR1cm47CisJYXdlX3Bva2UoQVdFX0ZNTU9EKHZvaWNlKSwKKwkJIEZYX0NPTUIoZngsIGZ4X2xheSwgQVdFX0ZYX0xGTzFfUElUQ0gsIEFXRV9GWF9MRk8xX0NVVE9GRiwKKwkJCSB2cC0+cGFybS5mbW1vZCkpOworfQorCisvKiBzZXQgdHJlbW9sbyAobGZvMSkgdm9sdW1lICYgZnJlcXVlbmN5ICovCitzdGF0aWMgdm9pZAorYXdlX2Z4X3RyZW1mcnEoaW50IHZvaWNlLCBpbnQgZm9yY2VkKQoreworCWF3ZV92b2ljZV9pbmZvICp2cDsKKwlGWF9SZWMgKmZ4ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4OworCUZYX1JlYyAqZnhfbGF5ID0gTlVMTDsKKwlpZiAodm9pY2VzW3ZvaWNlXS5sYXllciA8IE1BWF9MQVlFUlMpCisJCWZ4X2xheSA9ICZ2b2ljZXNbdm9pY2VdLmNpbmZvLT5meF9sYXllclt2b2ljZXNbdm9pY2VdLmxheWVyXTsKKworCWlmIChJU19OT19FRkZFQ1Qodm9pY2UpICYmICFmb3JjZWQpIHJldHVybjsKKwlpZiAoKHZwID0gdm9pY2VzW3ZvaWNlXS5zYW1wbGUpID09IE5VTEwgfHwgdnAtPmluZGV4ID09IDApCisJCXJldHVybjsKKwlhd2VfcG9rZShBV0VfVFJFTUZSUSh2b2ljZSksCisJCSBGWF9DT01CKGZ4LCBmeF9sYXksIEFXRV9GWF9MRk8xX1ZPTFVNRSwgQVdFX0ZYX0xGTzFfRlJFUSwKKwkJCSB2cC0+cGFybS50cmVtZnJxKSk7Cit9CisKKy8qIHNldCBsZm8yIHBpdGNoICYgZnJlcXVlbmN5ICovCitzdGF0aWMgdm9pZAorYXdlX2Z4X2ZtMmZycTIoaW50IHZvaWNlLCBpbnQgZm9yY2VkKQoreworCWF3ZV92b2ljZV9pbmZvICp2cDsKKwlGWF9SZWMgKmZ4ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4OworCUZYX1JlYyAqZnhfbGF5ID0gTlVMTDsKKwlpZiAodm9pY2VzW3ZvaWNlXS5sYXllciA8IE1BWF9MQVlFUlMpCisJCWZ4X2xheSA9ICZ2b2ljZXNbdm9pY2VdLmNpbmZvLT5meF9sYXllclt2b2ljZXNbdm9pY2VdLmxheWVyXTsKKworCWlmIChJU19OT19FRkZFQ1Qodm9pY2UpICYmICFmb3JjZWQpIHJldHVybjsKKwlpZiAoKHZwID0gdm9pY2VzW3ZvaWNlXS5zYW1wbGUpID09IE5VTEwgfHwgdnAtPmluZGV4ID09IDApCisJCXJldHVybjsKKwlhd2VfcG9rZShBV0VfRk0yRlJRMih2b2ljZSksCisJCSBGWF9DT01CKGZ4LCBmeF9sYXksIEFXRV9GWF9MRk8yX1BJVENILCBBV0VfRlhfTEZPMl9GUkVRLAorCQkJIHZwLT5wYXJtLmZtMmZycTIpKTsKK30KKworCisvKiBRICYgY3VycmVudCBhZGRyZXNzIChRIDRiaXQgdmFsdWUsIE1TQikgKi8KK3N0YXRpYyB2b2lkCithd2VfZnhfZmlsdGVyUShpbnQgdm9pY2UsIGludCBmb3JjZWQpCit7CisJdW5zaWduZWQgaW50IGFkZHI7CisJYXdlX3ZvaWNlX2luZm8gKnZwOworCUZYX1JlYyAqZnggPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+Zng7CisJRlhfUmVjICpmeF9sYXkgPSBOVUxMOworCWlmICh2b2ljZXNbdm9pY2VdLmxheWVyIDwgTUFYX0xBWUVSUykKKwkJZnhfbGF5ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4X2xheWVyW3ZvaWNlc1t2b2ljZV0ubGF5ZXJdOworCisJaWYgKElTX05PX0VGRkVDVCh2b2ljZSkgJiYgIWZvcmNlZCkgcmV0dXJuOworCWlmICgodnAgPSB2b2ljZXNbdm9pY2VdLnNhbXBsZSkgPT0gTlVMTCB8fCB2cC0+aW5kZXggPT0gMCkKKwkJcmV0dXJuOworCisJYWRkciA9IGF3ZV9wZWVrX2R3KEFXRV9DQ0NBKHZvaWNlKSkgJiAweGZmZmZmZjsKKwlhZGRyIHw9IChGWF9CWVRFKGZ4LCBmeF9sYXksIEFXRV9GWF9GSUxURVJRLCB2cC0+cGFybS5maWx0ZXJRKSA8PCAyOCk7CisJYXdlX3Bva2VfZHcoQVdFX0NDQ0Eodm9pY2UpLCBhZGRyKTsKK30KKworLyoKKyAqIGNhbGN1bGF0ZSBwaXRjaCBvZmZzZXQKKyAqCisgKiAweEUwMDAgaXMgbm8gcGl0Y2ggb2Zmc2V0IGF0IDQ0MTAwSHogc2FtcGxlLgorICogRXZlcnkgNDA5NiBpcyBvbmUgb2N0YXZlLgorICovCisKK3N0YXRpYyB2b2lkCithd2VfY2FsY19waXRjaChpbnQgdm9pY2UpCit7CisJdm9pY2VfaW5mbyAqdnAgPSAmdm9pY2VzW3ZvaWNlXTsKKwlhd2Vfdm9pY2VfaW5mbyAqYXA7CisJYXdlX2NoYW5faW5mbyAqY3AgPSB2b2ljZXNbdm9pY2VdLmNpbmZvOworCWludCBvZmZzZXQ7CisKKwkvKiBzZWFyY2ggdm9pY2UgaW5mb3JtYXRpb24gKi8KKwlpZiAoKGFwID0gdnAtPnNhbXBsZSkgPT0gTlVMTCkKKwkJCXJldHVybjsKKwlpZiAoYXAtPmluZGV4ID09IDApIHsKKwkJREVCVUcoMyxwcmludGsoIkFXRTMyOiBzZXQgc2FtcGxlICglZClcbiIsIGFwLT5zYW1wbGUpKTsKKwkJaWYgKGF3ZV9zZXRfc2FtcGxlKChhd2Vfdm9pY2VfbGlzdCopYXApID09IDApCisJCQlyZXR1cm47CisJfQorCisJLyogY2FsY3VsYXRlIG9mZnNldCAqLworCWlmIChhcC0+Zml4a2V5ID49IDApIHsKKwkJREVCVUcoMyxwcmludGsoIkFXRTMyOiBwLT4gZml4a2V5KCVkKSB0dW5lKCVkKVxuIiwgYXAtPmZpeGtleSwgYXAtPnR1bmUpKTsKKwkJb2Zmc2V0ID0gKGFwLT5maXhrZXkgLSBhcC0+cm9vdCkgKiA0MDk2IC8gMTI7CisJfSBlbHNlIHsKKwkJREVCVUcoMyxwcmludGsoIkFXRTMyOiBwKCVkKS0+IHJvb3QoJWQpIHR1bmUoJWQpXG4iLCB2cC0+bm90ZSwgYXAtPnJvb3QsIGFwLT50dW5lKSk7CisJCW9mZnNldCA9ICh2cC0+bm90ZSAtIGFwLT5yb290KSAqIDQwOTYgLyAxMjsKKwkJREVCVUcoNCxwcmludGsoIkFXRTMyOiBwLT4gb2ZzPSVkXG4iLCBvZmZzZXQpKTsKKwl9CisJb2Zmc2V0ID0gKG9mZnNldCAqIGFwLT5zY2FsZVR1bmluZykgLyAxMDA7CisJREVCVUcoNCxwcmludGsoIkFXRTMyOiBwLT4gc2NhbGUqIG9mcz0lZFxuIiwgb2Zmc2V0KSk7CisJb2Zmc2V0ICs9IGFwLT50dW5lICogNDA5NiAvIDEyMDA7CisJREVCVUcoNCxwcmludGsoIkFXRTMyOiBwLT4gdHVuZSsgb2ZzPSVkXG4iLCBvZmZzZXQpKTsKKwlpZiAoY3AtPmJlbmRlciAhPSAwKSB7CisJCURFQlVHKDMscHJpbnRrKCJBV0UzMjogcC0+IGJlbmQoJWQpICVkXG4iLCB2b2ljZSwgY3AtPmJlbmRlcikpOworCQkvKiAoODE5MjAwOiAxIHNlbWl0b25lKSA9PT4gKDQwOTY6IDEyIHNlbWl0b25lcykgKi8KKwkJb2Zmc2V0ICs9IGNwLT5iZW5kZXIgKiBjcC0+YmVuZGVyX3JhbmdlIC8gMjQwMDsKKwl9CisKKwkvKiBhZGQgaW5pdGlhbCBwaXRjaCBjb3JyZWN0aW9uICovCisJaWYgKEZYX09OKCZjcC0+ZnhfbGF5ZXJbdnAtPmxheWVyXSwgQVdFX0ZYX0lOSVRfUElUQ0gpKQorCQlvZmZzZXQgKz0gY3AtPmZ4X2xheWVyW3ZwLT5sYXllcl0udmFsW0FXRV9GWF9JTklUX1BJVENIXTsKKwllbHNlIGlmIChGWF9PTigmY3AtPmZ4LCBBV0VfRlhfSU5JVF9QSVRDSCkpCisJCW9mZnNldCArPSBjcC0+ZngudmFsW0FXRV9GWF9JTklUX1BJVENIXTsKKworCS8qIDB4ZTAwMDogcm9vdCBwaXRjaCAqLworCXZwLT5hcGl0Y2ggPSAweGUwMDAgKyBhcC0+cmF0ZV9vZmZzZXQgKyBvZmZzZXQ7CisJREVCVUcoNCxwcmludGsoIkFXRTMyOiBwLT4gc3VtIGFvZnM9JXgsIHJhdGVfb2ZzPSVkXG4iLCB2cC0+YXBpdGNoLCBhcC0+cmF0ZV9vZmZzZXQpKTsKKwlpZiAodnAtPmFwaXRjaCA+IDB4ZmZmZikKKwkJdnAtPmFwaXRjaCA9IDB4ZmZmZjsKKwlpZiAodnAtPmFwaXRjaCA8IDApCisJCXZwLT5hcGl0Y2ggPSAwOworfQorCisKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCisvKiBjYWxjdWxhdGUgTUlESSBrZXkgYW5kIHNlbWl0b25lIGZyb20gdGhlIHNwZWNpZmllZCBmcmVxdWVuY3kgKi8KK3N0YXRpYyB2b2lkCithd2VfY2FsY19waXRjaF9mcm9tX2ZyZXEoaW50IHZvaWNlLCBpbnQgZnJlcSkKK3sKKwl2b2ljZV9pbmZvICp2cCA9ICZ2b2ljZXNbdm9pY2VdOworCWF3ZV92b2ljZV9pbmZvICphcDsKKwlGWF9SZWMgKmZ4ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4OworCUZYX1JlYyAqZnhfbGF5ID0gTlVMTDsKKwlpbnQgb2Zmc2V0OworCWludCBub3RlOworCisJaWYgKHZvaWNlc1t2b2ljZV0ubGF5ZXIgPCBNQVhfTEFZRVJTKQorCQlmeF9sYXkgPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+ZnhfbGF5ZXJbdm9pY2VzW3ZvaWNlXS5sYXllcl07CisKKwkvKiBzZWFyY2ggdm9pY2UgaW5mb3JtYXRpb24gKi8KKwlpZiAoKGFwID0gdnAtPnNhbXBsZSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChhcC0+aW5kZXggPT0gMCkgeworCQlERUJVRygzLHByaW50aygiQVdFMzI6IHNldCBzYW1wbGUgKCVkKVxuIiwgYXAtPnNhbXBsZSkpOworCQlpZiAoYXdlX3NldF9zYW1wbGUoKGF3ZV92b2ljZV9saXN0KilhcCkgPT0gMCkKKwkJCXJldHVybjsKKwl9CisJbm90ZSA9IGZyZXFfdG9fbm90ZShmcmVxKTsKKwlvZmZzZXQgPSAobm90ZSAtIGFwLT5yb290ICogMTAwICsgYXAtPnR1bmUpICogNDA5NiAvIDEyMDA7CisJb2Zmc2V0ID0gKG9mZnNldCAqIGFwLT5zY2FsZVR1bmluZykgLyAxMDA7CisJaWYgKGZ4X2xheSAmJiBGWF9PTihmeF9sYXksIEFXRV9GWF9JTklUX1BJVENIKSkKKwkJb2Zmc2V0ICs9IGZ4X2xheS0+dmFsW0FXRV9GWF9JTklUX1BJVENIXTsKKwllbHNlIGlmIChGWF9PTihmeCwgQVdFX0ZYX0lOSVRfUElUQ0gpKQorCQlvZmZzZXQgKz0gZngtPnZhbFtBV0VfRlhfSU5JVF9QSVRDSF07CisJdnAtPmFwaXRjaCA9IDB4ZTAwMCArIGFwLT5yYXRlX29mZnNldCArIG9mZnNldDsKKwlpZiAodnAtPmFwaXRjaCA+IDB4ZmZmZikKKwkJdnAtPmFwaXRjaCA9IDB4ZmZmZjsKKwlpZiAodnAtPmFwaXRjaCA8IDApCisJCXZwLT5hcGl0Y2ggPSAwOworfQorI2VuZGlmIC8qIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkgKi8KKworCisvKgorICogY2FsY3VsYXRlIHZvbHVtZSBhdHRlbnVhdGlvbgorICoKKyAqIFZvaWNlIHZvbHVtZSBpcyBjb250cm9sbGVkIGJ5IHZvbHVtZSBhdHRlbnVhdGlvbiBwYXJhbWV0ZXIuCisgKiBTbyB2b2x1bWUgYmVjb21lcyBtYXhpbXVtIHdoZW4gYXZvbCBpcyAwIChubyBhdHRlbnVhdGlvbiksIGFuZAorICogbWluaW11bSB3aGVuIDI1NSAoLTk2ZEIgb3Igc2lsZW5jZSkuCisgKi8KKworc3RhdGljIGludCB2b2xfdGFibGVbMTI4XSA9IHsKKwkyNTUsMTExLDk1LDg2LDc5LDc0LDcwLDY2LDYzLDYxLDU4LDU2LDU0LDUyLDUwLDQ5LAorCTQ3LDQ2LDQ1LDQzLDQyLDQxLDQwLDM5LDM4LDM3LDM2LDM1LDM0LDM0LDMzLDMyLAorCTMxLDMxLDMwLDI5LDI5LDI4LDI3LDI3LDI2LDI2LDI1LDI0LDI0LDIzLDIzLDIyLAorCTIyLDIxLDIxLDIxLDIwLDIwLDE5LDE5LDE4LDE4LDE4LDE3LDE3LDE2LDE2LDE2LAorCTE1LDE1LDE1LDE0LDE0LDE0LDEzLDEzLDEzLDEyLDEyLDEyLDExLDExLDExLDEwLAorCTEwLDEwLDEwLDksOSw5LDgsOCw4LDgsNyw3LDcsNyw2LDYsCisJNiw2LDUsNSw1LDUsNSw0LDQsNCw0LDMsMywzLDMsMywKKwkyLDIsMiwyLDIsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLAorfTsKKworLyogdGFibGVzIGZvciB2b2x1bWUtPmF0dGVudWF0aW9uIGNhbGN1bGF0aW9uICovCitzdGF0aWMgdW5zaWduZWQgY2hhciB2b2x0YWIxWzEyOF0gPSB7CisgICAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorICAgMHg2MywgMHgyYiwgMHgyOSwgMHgyOCwgMHgyNywgMHgyNiwgMHgyNSwgMHgyNCwgMHgyMywgMHgyMiwKKyAgIDB4MjEsIDB4MjAsIDB4MWYsIDB4MWUsIDB4MWUsIDB4MWQsIDB4MWMsIDB4MWIsIDB4MWIsIDB4MWEsCisgICAweDE5LCAweDE5LCAweDE4LCAweDE3LCAweDE3LCAweDE2LCAweDE2LCAweDE1LCAweDE1LCAweDE0LAorICAgMHgxNCwgMHgxMywgMHgxMywgMHgxMywgMHgxMiwgMHgxMiwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMCwKKyAgIDB4MTAsIDB4MTAsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGQsCisgICAweDBkLCAweDBkLCAweDBjLCAweDBjLCAweDBjLCAweDBjLCAweDBjLCAweDBiLCAweDBiLCAweDBiLAorICAgMHgwYiwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwKKyAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDYsCisgICAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA0LAorICAgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMiwKKyAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB2b2x0YWIyWzEyOF0gPSB7CisgICAweDMyLCAweDMxLCAweDMwLCAweDJmLCAweDJlLCAweDJkLCAweDJjLCAweDJiLCAweDJhLCAweDJhLAorICAgMHgyOSwgMHgyOCwgMHgyNywgMHgyNiwgMHgyNSwgMHgyNCwgMHgyNCwgMHgyMywgMHgyMiwgMHgyMSwKKyAgIDB4MjEsIDB4MjAsIDB4MWYsIDB4MWUsIDB4MWUsIDB4MWQsIDB4MWMsIDB4MWMsIDB4MWIsIDB4MWEsCisgICAweDFhLCAweDE5LCAweDE5LCAweDE4LCAweDE4LCAweDE3LCAweDE2LCAweDE2LCAweDE1LCAweDE1LAorICAgMHgxNCwgMHgxNCwgMHgxMywgMHgxMywgMHgxMywgMHgxMiwgMHgxMiwgMHgxMSwgMHgxMSwgMHgxMCwKKyAgIDB4MTAsIDB4MTAsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGQsIDB4MGQsCisgICAweDBkLCAweDBjLCAweDBjLCAweDBjLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBhLCAweDBhLAorICAgMHgwYSwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwKKyAgIDB4MDgsIDB4MDgsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDYsIDB4MDYsIDB4MDYsCisgICAweDA2LCAweDA2LCAweDA2LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LAorICAgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHgwMywKKyAgIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MDEsCisgICAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBleHByZXNzaW9udGFiWzEyOF0gPSB7CisgICAweDdmLCAweDZjLCAweDYyLCAweDVhLCAweDU0LCAweDUwLCAweDRiLCAweDQ4LCAweDQ1LCAweDQyLAorICAgMHg0MCwgMHgzZCwgMHgzYiwgMHgzOSwgMHgzOCwgMHgzNiwgMHgzNCwgMHgzMywgMHgzMSwgMHgzMCwKKyAgIDB4MmYsIDB4MmQsIDB4MmMsIDB4MmIsIDB4MmEsIDB4MjksIDB4MjgsIDB4MjcsIDB4MjYsIDB4MjUsCisgICAweDI0LCAweDI0LCAweDIzLCAweDIyLCAweDIxLCAweDIxLCAweDIwLCAweDFmLCAweDFlLCAweDFlLAorICAgMHgxZCwgMHgxZCwgMHgxYywgMHgxYiwgMHgxYiwgMHgxYSwgMHgxYSwgMHgxOSwgMHgxOCwgMHgxOCwKKyAgIDB4MTcsIDB4MTcsIDB4MTYsIDB4MTYsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTQsIDB4MTQsIDB4MTMsCisgICAweDEzLCAweDEyLCAweDEyLCAweDExLCAweDExLCAweDExLCAweDEwLCAweDEwLCAweDBmLCAweDBmLAorICAgMHgwZiwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwYywgMHgwYywgMHgwYywKKyAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDksIDB4MDksIDB4MDksIDB4MDksCisgICAweDA4LCAweDA4LCAweDA4LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA2LCAweDA2LCAweDA2LAorICAgMHgwNiwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwMywKKyAgIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgdm9pZAorYXdlX2NhbGNfdm9sdW1lKGludCB2b2ljZSkKK3sKKwl2b2ljZV9pbmZvICp2cCA9ICZ2b2ljZXNbdm9pY2VdOworCWF3ZV92b2ljZV9pbmZvICphcDsKKwlhd2VfY2hhbl9pbmZvICpjcCA9IHZvaWNlc1t2b2ljZV0uY2luZm87CisJaW50IHZvbDsKKworCS8qIHNlYXJjaCB2b2ljZSBpbmZvcm1hdGlvbiAqLworCWlmICgoYXAgPSB2cC0+c2FtcGxlKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlhcCA9IHZwLT5zYW1wbGU7CisJaWYgKGFwLT5pbmRleCA9PSAwKSB7CisJCURFQlVHKDMscHJpbnRrKCJBV0UzMjogc2V0IHNhbXBsZSAoJWQpXG4iLCBhcC0+c2FtcGxlKSk7CisJCWlmIChhd2Vfc2V0X3NhbXBsZSgoYXdlX3ZvaWNlX2xpc3QqKWFwKSA9PSAwKQorCQkJcmV0dXJuOworCX0KKwkKKwlpZiAoY3RybHNbQVdFX01EX05FV19WT0xVTUVfQ0FMQ10pIHsKKwkJaW50IG1haW5fdm9sID0gY3AtPm1haW5fdm9sICogYXAtPmFtcGxpdHVkZSAvIDEyNzsKKwkJbGltaXR2YWx1ZSh2cC0+dmVsb2NpdHksIDAsIDEyNyk7CisJCWxpbWl0dmFsdWUobWFpbl92b2wsIDAsIDEyNyk7CisJCWxpbWl0dmFsdWUoY3AtPmV4cHJlc3Npb25fdm9sLCAwLCAxMjcpOworCisJCXZvbCA9IHZvbHRhYjFbbWFpbl92b2xdICsgdm9sdGFiMlt2cC0+dmVsb2NpdHldOworCQl2b2wgPSAodm9sICogOCkgLyAzOworCQl2b2wgKz0gYXAtPmF0dGVudWF0aW9uOworCQlpZiAoY3AtPmV4cHJlc3Npb25fdm9sIDwgMTI3KQorCQkJdm9sICs9ICgoMHgxMDAgLSB2b2wpICogZXhwcmVzc2lvbnRhYltjcC0+ZXhwcmVzc2lvbl92b2xdKS8xMjg7CisJCXZvbCArPSBhdHRlbl9vZmZzZXQ7CisJCWlmIChhdHRlbl9yZWxhdGl2ZSkKKwkJCXZvbCArPSBjdHJsc1tBV0VfTURfWkVST19BVFRFTl07CisJCWxpbWl0dmFsdWUodm9sLCAwLCAyNTUpOworCQl2cC0+YXZvbCA9IHZvbDsKKwkJCisJfSBlbHNlIHsKKwkJLyogMCAtIDEyNyAqLworCQl2b2wgPSAodnAtPnZlbG9jaXR5ICogY3AtPm1haW5fdm9sICogY3AtPmV4cHJlc3Npb25fdm9sKSAvICgxMjcqMTI3KTsKKwkJdm9sID0gdm9sICogYXAtPmFtcGxpdHVkZSAvIDEyNzsKKworCQlpZiAodm9sIDwgMCkgdm9sID0gMDsKKwkJaWYgKHZvbCA+IDEyNykgdm9sID0gMTI3OworCisJCS8qIGNhbGMgdG8gYXR0ZW51YXRpb24gKi8KKwkJdm9sID0gdm9sX3RhYmxlW3ZvbF07CisJCXZvbCArPSAoaW50KWFwLT5hdHRlbnVhdGlvbjsKKwkJdm9sICs9IGF0dGVuX29mZnNldDsKKwkJaWYgKGF0dGVuX3JlbGF0aXZlKQorCQkJdm9sICs9IGN0cmxzW0FXRV9NRF9aRVJPX0FUVEVOXTsKKwkJaWYgKHZvbCA+IDI1NSkgdm9sID0gMjU1OworCisJCXZwLT5hdm9sID0gdm9sOworCX0KKwlpZiAoY3AtPmJhbmsgIT0gIEFXRV9EUlVNX0JBTksgJiYgKChhd2Vfdm9pY2VfcGFybV9ibG9jayopKCZhcC0+cGFybSkpLT52b2xhdGsgPCAweDdkKSB7CisJCWludCBhdHRlbjsKKwkJaWYgKHZwLT52ZWxvY2l0eSA8IDcwKSBhdHRlbiA9IDcwOworCQllbHNlIGF0dGVuID0gdnAtPnZlbG9jaXR5OworCQl2cC0+YWN1dG9mZiA9IChhdHRlbiAqIGFwLT5wYXJtLmN1dG9mZiArIDB4YTApID4+IDc7CisJfSBlbHNlIHsKKwkJdnAtPmFjdXRvZmYgPSBhcC0+cGFybS5jdXRvZmY7CisJfQorCURFQlVHKDMscHJpbnRrKCJBV0UzMjogWy0tIHZvaWNlKCVkKSB2b2w9JXhdXG4iLCB2b2ljZSwgdm9sKSk7Cit9CisKKy8qIGNoYW5nZSBtYXN0ZXIgdm9sdW1lICovCitzdGF0aWMgdm9pZAorYXdlX2NoYW5nZV9tYXN0ZXJfdm9sdW1lKHNob3J0IHZhbCkKK3sKKwlsaW1pdHZhbHVlKHZhbCwgMCwgMTI3KTsKKwlhdHRlbl9vZmZzZXQgPSB2b2xfdGFibGVbdmFsXTsKKwlhdHRlbl9yZWxhdGl2ZSA9IFRSVUU7CisJYXdlX3VwZGF0ZV92b2x1bWUoKTsKK30KKworLyogdXBkYXRlIHZvbHVtZXMgb2YgYWxsIGF2YWlsYWJsZSBjaGFubmVscyAqLworc3RhdGljIHZvaWQgYXdlX3VwZGF0ZV92b2x1bWUodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYXdlX21heF92b2ljZXM7IGkrKykKKwkJYXdlX3NldF92b2ljZV92b2woaSwgVFJVRSk7Cit9CisKKy8qIHNldCBzb3N0ZW51dG8gb24gKi8KK3N0YXRpYyB2b2lkIGF3ZV9zb3N0ZW51dG9fb24oaW50IHZvaWNlLCBpbnQgZm9yY2VkKQoreworCWlmIChJU19OT19FRkZFQ1Qodm9pY2UpICYmICFmb3JjZWQpIHJldHVybjsKKwl2b2ljZXNbdm9pY2VdLnNvc3RlbnV0byA9IDEyNzsKK30KKworCisvKiBkcm9wIHN1c3RhaW4gKi8KK3N0YXRpYyB2b2lkIGF3ZV9zdXN0YWluX29mZihpbnQgdm9pY2UsIGludCBmb3JjZWQpCit7CisJaWYgKHZvaWNlc1t2b2ljZV0uc3RhdGUgPT0gQVdFX1NUX1NVU1RBSU5FRCkgeworCQlhd2Vfbm90ZV9vZmYodm9pY2UpOworCQlhd2VfZnhfaW5pdCh2b2ljZXNbdm9pY2VdLmNoKTsKKwkJYXdlX3ZvaWNlX2luaXQodm9pY2UsIEZBTFNFKTsKKwl9Cit9CisKKworLyogdGVybWluYXRlIGFuZCBpbml0aWFsaXplIHZvaWNlICovCitzdGF0aWMgdm9pZCBhd2VfdGVybWluYXRlX2FuZF9pbml0KGludCB2b2ljZSwgaW50IGZvcmNlZCkKK3sKKwlhd2VfdGVybWluYXRlKHZvaWNlKTsKKwlhd2VfZnhfaW5pdCh2b2ljZXNbdm9pY2VdLmNoKTsKKwlhd2Vfdm9pY2VfaW5pdCh2b2ljZSwgVFJVRSk7Cit9CisKKworLyoKKyAqIHN5bnRoIG9wZXJhdGlvbiByb3V0aW5lcworICovCisKKyNkZWZpbmUgQVdFX1ZPSUNFX0tFWSh2KQkoMHg4MDAwIHwgKHYpKQorI2RlZmluZSBBV0VfQ0hBTl9LRVkoYyxuKQkoKChjKSA8PCA4KSB8ICgobikgKyAxKSkKKyNkZWZpbmUgS0VZX0NIQU5fTUFUQ0goa2V5LGMpCSgoKGtleSkgPj4gOCkgPT0gKGMpKQorCisvKiBpbml0aWFsaXplIHRoZSB2b2ljZSAqLworc3RhdGljIHZvaWQKK2F3ZV92b2ljZV9pbml0KGludCB2b2ljZSwgaW50IGluaXRfYWxsKQoreworCXZvaWNlX2luZm8gKnZwID0gJnZvaWNlc1t2b2ljZV07CisKKwkvKiByZXNldCB2b2ljZSBzZWFyY2gga2V5ICovCisJaWYgKHBsYXlpbmdfbW9kZSA9PSBBV0VfUExBWV9ESVJFQ1QpCisJCXZwLT5rZXkgPSBBV0VfVk9JQ0VfS0VZKHZvaWNlKTsKKwllbHNlCisJCXZwLT5rZXkgPSAwOworCisJLyogY2xlYXIgdm9pY2UgbWFwcGluZyAqLworCXZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdID0gMDsKKworCS8qIHRvdWNoIHRoZSB0aW1pbmcgZmxhZyAqLworCXZwLT50aW1lID0gY3VycmVudF9hbGxvY190aW1lOworCisJLyogaW5pdGlhbGl6ZSBvdGhlciBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeSAqLworCWlmIChpbml0X2FsbCkgeworCQl2cC0+bm90ZSA9IC0xOworCQl2cC0+dmVsb2NpdHkgPSAwOworCQl2cC0+c29zdGVudXRvID0gMDsKKworCQl2cC0+c2FtcGxlID0gTlVMTDsKKwkJdnAtPmNpbmZvID0gJmNoYW5uZWxzW3ZvaWNlXTsKKwkJdnAtPmNoID0gdm9pY2U7CisJCXZwLT5zdGF0ZSA9IEFXRV9TVF9PRkY7CisKKwkJLyogZW11ODAwMCBwYXJhbWV0ZXJzICovCisJCXZwLT5hcGl0Y2ggPSAwOworCQl2cC0+YXZvbCA9IDI1NTsKKwkJdnAtPmFwYW4gPSAtMTsKKwl9Cit9CisKKy8qIGNsZWFyIGVmZmVjdHMgKi8KK3N0YXRpYyB2b2lkIGF3ZV9meF9pbml0KGludCBjaCkKK3sKKwlpZiAoU0lOR0xFX0xBWUVSX01PREUoKSAmJiAhY3RybHNbQVdFX01EX0tFRVBfRUZGRUNUXSkgeworCQltZW1zZXQoJmNoYW5uZWxzW2NoXS5meCwgMCwgc2l6ZW9mKGNoYW5uZWxzW2NoXS5meCkpOworCQltZW1zZXQoJmNoYW5uZWxzW2NoXS5meF9sYXllciwgMCwgc2l6ZW9mKCZjaGFubmVsc1tjaF0uZnhfbGF5ZXIpKTsKKwl9Cit9CisKKy8qIGluaXRpYWxpemUgY2hhbm5lbCBpbmZvICovCitzdGF0aWMgdm9pZCBhd2VfY2hhbm5lbF9pbml0KGludCBjaCwgaW50IGluaXRfYWxsKQoreworCWF3ZV9jaGFuX2luZm8gKmNwID0gJmNoYW5uZWxzW2NoXTsKKwljcC0+Y2hhbm5lbCA9IGNoOworCWlmIChpbml0X2FsbCkgeworCQljcC0+cGFubmluZyA9IDA7IC8qIHplcm8gY2VudGVyICovCisJCWNwLT5iZW5kZXJfcmFuZ2UgPSAyMDA7IC8qIHNlbnNlICogMTAwICovCisJCWNwLT5tYWluX3ZvbCA9IDEyNzsKKwkJaWYgKE1VTFRJX0xBWUVSX01PREUoKSAmJiBJU19EUlVNX0NIQU5ORUwoY2gpKSB7CisJCQljcC0+aW5zdHIgPSBjdHJsc1tBV0VfTURfREVGX0RSVU1dOworCQkJY3AtPmJhbmsgPSBBV0VfRFJVTV9CQU5LOworCQl9IGVsc2UgeworCQkJY3AtPmluc3RyID0gY3RybHNbQVdFX01EX0RFRl9QUkVTRVRdOworCQkJY3AtPmJhbmsgPSBjdHJsc1tBV0VfTURfREVGX0JBTktdOworCQl9CisJfQorCisJY3AtPmJlbmRlciA9IDA7IC8qIHplcm8gdHVuZSBza2V3ICovCisJY3AtPmV4cHJlc3Npb25fdm9sID0gMTI3OworCWNwLT5jaGFuX3ByZXNzID0gMDsKKwljcC0+c3VzdGFpbmVkID0gMDsKKworCWlmICghIGN0cmxzW0FXRV9NRF9LRUVQX0VGRkVDVF0pIHsKKwkJbWVtc2V0KCZjcC0+ZngsIDAsIHNpemVvZihjcC0+ZngpKTsKKwkJbWVtc2V0KCZjcC0+ZnhfbGF5ZXIsIDAsIHNpemVvZihjcC0+ZnhfbGF5ZXIpKTsKKwl9Cit9CisKKworLyogY2hhbmdlIHRoZSB2b2ljZSBwYXJhbWV0ZXJzOyB2b2ljZSA9IGNoYW5uZWwgKi8KK3N0YXRpYyB2b2lkIGF3ZV92b2ljZV9jaGFuZ2UoaW50IHZvaWNlLCBmeF9hZmZlY3RfZnVuYyBmdW5jKQoreworCWludCBpOyAKKwlzd2l0Y2ggKHBsYXlpbmdfbW9kZSkgeworCWNhc2UgQVdFX1BMQVlfRElSRUNUOgorCQlmdW5jKHZvaWNlLCBGQUxTRSk7CisJCWJyZWFrOworCWNhc2UgQVdFX1BMQVlfSU5ESVJFQ1Q6CisJCWZvciAoaSA9IDA7IGkgPCBhd2VfbWF4X3ZvaWNlczsgaSsrKQorCQkJaWYgKHZvaWNlc1tpXS5rZXkgPT0gQVdFX1ZPSUNFX0tFWSh2b2ljZSkpCisJCQkJZnVuYyhpLCBGQUxTRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZvciAoaSA9IDA7IGkgPCBhd2VfbWF4X3ZvaWNlczsgaSsrKQorCQkJaWYgKEtFWV9DSEFOX01BVENIKHZvaWNlc1tpXS5rZXksIHZvaWNlKSkKKwkJCQlmdW5jKGksIEZBTFNFKTsKKwkJYnJlYWs7CisJfQorfQorCisKKy8qCisgKiBkZXZpY2Ugb3BlbiAvIGNsb3NlCisgKi8KKworLyogb3BlbiBkZXZpY2U6CisgKiAgIHJlc2V0IHN0YXR1cyBvZiBhbGwgdm9pY2VzLCBhbmQgY2xlYXIgc2FtcGxlIHBvc2l0aW9uIGZsYWcKKyAqLworc3RhdGljIGludAorYXdlX29wZW4oaW50IGRldiwgaW50IG1vZGUpCit7CisJaWYgKGF3ZV9idXN5KQorCQlyZXR1cm4gLUVCVVNZOworCisJYXdlX2J1c3kgPSBUUlVFOworCisJLyogc2V0IGRlZmF1bHQgbW9kZSAqLworCWF3ZV9pbml0X2N0cmxfcGFybXMoRkFMU0UpOworCWF0dGVuX3JlbGF0aXZlID0gVFJVRTsKKwlhdHRlbl9vZmZzZXQgPSAwOworCWRydW1fZmxhZ3MgPSBERUZBVUxUX0RSVU1fRkxBR1M7CisJcGxheWluZ19tb2RlID0gQVdFX1BMQVlfSU5ESVJFQ1Q7CisKKwkvKiByZXNldCB2b2ljZXMgJiBjaGFubmVscyAqLworCWF3ZV9yZXNldChkZXYpOworCisJcGF0Y2hfb3BlbmVkID0gMDsKKworCXJldHVybiAwOworfQorCisKKy8qIGNsb3NlIGRldmljZToKKyAqICAgcmVzZXQgYWxsIHZvaWNlcyBhZ2FpbiAodGVybWluYXRlIHNvdW5kcykKKyAqLworc3RhdGljIHZvaWQKK2F3ZV9jbG9zZShpbnQgZGV2KQoreworCWF3ZV9yZXNldChkZXYpOworCWF3ZV9idXN5ID0gRkFMU0U7Cit9CisKKworLyogc2V0IG1pc2NlbGxhbmVvdXMgbW9kZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkCithd2VfaW5pdF9jdHJsX3Bhcm1zKGludCBpbml0X2FsbCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVdFX01EX0VORDsgaSsrKSB7CisJCWlmIChpbml0X2FsbCB8fCBjdHJsX3Bhcm1zW2ldLmluaXRfZWFjaF90aW1lKQorCQkJY3RybHNbaV0gPSBjdHJsX3Bhcm1zW2ldLnZhbHVlOworCX0KK30KKworCisvKiBzZXF1ZW5jZXIgSS9PIGNvbnRyb2w6CisgKi8KK3N0YXRpYyBpbnQKK2F3ZV9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRDVExfU1lOVEhfSU5GTzoKKwkJaWYgKHBsYXlpbmdfbW9kZSA9PSBBV0VfUExBWV9ESVJFQ1QpCisJCQlhd2VfaW5mby5ucl92b2ljZXMgPSBhd2VfbWF4X3ZvaWNlczsKKwkJZWxzZQorCQkJYXdlX2luZm8ubnJfdm9pY2VzID0gQVdFX01BWF9DSEFOTkVMUzsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZhd2VfaW5mbywgc2l6ZW9mKGF3ZV9pbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfU0VRX1JFU0VUU0FNUExFUzoKKwkJYXdlX3Jlc2V0KGRldik7CisJCWF3ZV9yZXNldF9zYW1wbGVzKCk7CisJCXJldHVybiAwOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX1NFUV9QRVJDTU9ERToKKwkJLyogd2hhdCdzIHRoaXM/ICovCisJCXJldHVybiAwOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX1NZTlRIX01FTUFWTDoKKwkJcmV0dXJuIG1lbXNpemUgLSBhd2VfZnJlZV9tZW1fcHRyKCkgKiAyOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyOiB1bnN1cHBvcnRlZCBpb2N0bCAlZFxuIiwgY21kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KK30KKworCitzdGF0aWMgaW50IHZvaWNlX2luX3JhbmdlKGludCB2b2ljZSkKK3sKKwlpZiAocGxheWluZ19tb2RlID09IEFXRV9QTEFZX0RJUkVDVCkgeworCQlpZiAodm9pY2UgPCAwIHx8IHZvaWNlID49IGF3ZV9tYXhfdm9pY2VzKQorCQkJcmV0dXJuIEZBTFNFOworCX0gZWxzZSB7CisJCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gQVdFX01BWF9DSEFOTkVMUykKKwkJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2Vfdm9pY2UoaW50IHZvaWNlLCBpbnQgZG9fc3VzdGFpbikKK3sKKwlpZiAoSVNfTk9fU09VTkQodm9pY2UpKQorCQlyZXR1cm47CisJaWYgKGRvX3N1c3RhaW4gJiYgKHZvaWNlc1t2b2ljZV0uY2luZm8tPnN1c3RhaW5lZCA9PSAxMjcgfHwKKwkJCSAgICB2b2ljZXNbdm9pY2VdLnNvc3RlbnV0byA9PSAxMjcpKQorCQl2b2ljZXNbdm9pY2VdLnN0YXRlID0gQVdFX1NUX1NVU1RBSU5FRDsKKwllbHNlIHsKKwkJYXdlX25vdGVfb2ZmKHZvaWNlKTsKKwkJYXdlX2Z4X2luaXQodm9pY2VzW3ZvaWNlXS5jaCk7CisJCWF3ZV92b2ljZV9pbml0KHZvaWNlLCBGQUxTRSk7CisJfQorfQorCisvKiByZWxlYXNlIGFsbCBub3RlcyAqLworc3RhdGljIHZvaWQgYXdlX25vdGVfb2ZmX2FsbChpbnQgZG9fc3VzdGFpbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYXdlX21heF92b2ljZXM7IGkrKykKKwkJcmVsZWFzZV92b2ljZShpLCBkb19zdXN0YWluKTsKK30KKworLyoga2lsbCBhIHZvaWNlOgorICogICBub3QgdGVybWluYXRlLCBqdXN0IHJlbGVhc2UgdGhlIHZvaWNlLgorICovCitzdGF0aWMgaW50Cithd2Vfa2lsbF9ub3RlKGludCBkZXYsIGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSkKK3sKKwlpbnQgaSwgdjIsIGtleTsKKworCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW29mZiglZCkgbnQ9JWQgdmw9JWRdXG4iLCB2b2ljZSwgbm90ZSwgdmVsb2NpdHkpKTsKKwlpZiAoISB2b2ljZV9pbl9yYW5nZSh2b2ljZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChwbGF5aW5nX21vZGUpIHsKKwljYXNlIEFXRV9QTEFZX0RJUkVDVDoKKwljYXNlIEFXRV9QTEFZX0lORElSRUNUOgorCQlrZXkgPSBBV0VfVk9JQ0VfS0VZKHZvaWNlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFXRV9QTEFZX01VTFRJMjoKKwkJdjIgPSB2b2ljZV9hbGxvYy0+bWFwW3ZvaWNlXSA+PiA4OworCQl2b2ljZV9hbGxvYy0+bWFwW3ZvaWNlXSA9IDA7CisJCXZvaWNlID0gdjI7CisJCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gQVdFX01BWF9DSEFOTkVMUykKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKiBjb250aW51ZSB0byBiZWxvdyAqLworCWRlZmF1bHQ6CisJCWtleSA9IEFXRV9DSEFOX0tFWSh2b2ljZSwgbm90ZSk7CisJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBhd2VfbWF4X3ZvaWNlczsgaSsrKSB7CisJCWlmICh2b2ljZXNbaV0ua2V5ID09IGtleSkKKwkJCXJlbGVhc2Vfdm9pY2UoaSwgVFJVRSk7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0X29yX3ZvbHVtZV9jaGFuZ2UoaW50IHZvaWNlLCBpbnQgdmVsb2NpdHkpCit7CisJdm9pY2VzW3ZvaWNlXS52ZWxvY2l0eSA9IHZlbG9jaXR5OworCWF3ZV9jYWxjX3ZvbHVtZSh2b2ljZSk7CisJaWYgKHZvaWNlc1t2b2ljZV0uc3RhdGUgPT0gQVdFX1NUX1NUQU5EQlkpCisJCWF3ZV9ub3RlX29uKHZvaWNlKTsKKwllbHNlIGlmICh2b2ljZXNbdm9pY2VdLnN0YXRlID09IEFXRV9TVF9PTikKKwkJYXdlX3NldF92b2x1bWUodm9pY2UsIEZBTFNFKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2FuZF9zdGFydF92b2ljZShpbnQgdm9pY2UsIGludCBzdGF0ZSkKK3sKKwkvKiBjYWxjdWxhdGUgcGl0Y2ggJiB2b2x1bWUgcGFyYW1ldGVycyAqLworCXZvaWNlc1t2b2ljZV0uc3RhdGUgPSBzdGF0ZTsKKwlhd2VfY2FsY19waXRjaCh2b2ljZSk7CisJYXdlX2NhbGNfdm9sdW1lKHZvaWNlKTsKKwlpZiAoc3RhdGUgPT0gQVdFX1NUX09OKQorCQlhd2Vfbm90ZV9vbih2b2ljZSk7Cit9CisKKy8qIHN0YXJ0IGEgdm9pY2U6CisgKiAgIGlmIG5vdGUgaXMgMjU1LCBpZGVudGljYWwgd2l0aCBhZnRlcnRvdWNoIGZ1bmN0aW9uLgorICogICBPdGhlcndpc2UsIHN0YXJ0IGEgdm9pY2Ugd2l0aCBzcGVjaWZpZWQgbm90IGFuZCB2b2x1bWUuCisgKi8KK3N0YXRpYyBpbnQKK2F3ZV9zdGFydF9ub3RlKGludCBkZXYsIGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSkKK3sKKwlpbnQgaSwga2V5LCBzdGF0ZSwgdm9sb25seTsKKworCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW29uKCVkKSBudD0lZCB2bD0lZF1cbiIsIHZvaWNlLCBub3RlLCB2ZWxvY2l0eSkpOworCWlmICghIHZvaWNlX2luX3JhbmdlKHZvaWNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJICAgIAorCWlmICh2ZWxvY2l0eSA9PSAwKQorCQlzdGF0ZSA9IEFXRV9TVF9TVEFOREJZOyAvKiBzdGFuZCBieSBmb3IgcGxheWluZyAqLworCWVsc2UKKwkJc3RhdGUgPSBBV0VfU1RfT047CS8qIHJlYWxseSBwbGF5ICovCisJdm9sb25seSA9IEZBTFNFOworCisJc3dpdGNoIChwbGF5aW5nX21vZGUpIHsKKwljYXNlIEFXRV9QTEFZX0RJUkVDVDoKKwljYXNlIEFXRV9QTEFZX0lORElSRUNUOgorCQlrZXkgPSBBV0VfVk9JQ0VfS0VZKHZvaWNlKTsKKwkJaWYgKG5vdGUgPT0gMjU1KQorCQkJdm9sb25seSA9IFRSVUU7CisJCWJyZWFrOworCisJY2FzZSBBV0VfUExBWV9NVUxUSTI6CisJCXZvaWNlID0gdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPj4gODsKKwkJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBBV0VfTUFYX0NIQU5ORUxTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIGNvbnRpbnVlIHRvIGJlbG93ICovCisJZGVmYXVsdDoKKwkJaWYgKG5vdGUgPj0gMTI4KSB7IC8qIGtleSB2b2x1bWUgbW9kZSAqLworCQkJbm90ZSAtPSAxMjg7CisJCQl2b2xvbmx5ID0gVFJVRTsKKwkJfQorCQlrZXkgPSBBV0VfQ0hBTl9LRVkodm9pY2UsIG5vdGUpOworCQlicmVhazsKKwl9CisKKwkvKiBkeW5hbWljIHZvbHVtZSBjaGFuZ2UgKi8KKwlpZiAodm9sb25seSkgeworCQlmb3IgKGkgPSAwOyBpIDwgYXdlX21heF92b2ljZXM7IGkrKykgeworCQkJaWYgKHZvaWNlc1tpXS5rZXkgPT0ga2V5KQorCQkJCXN0YXJ0X29yX3ZvbHVtZV9jaGFuZ2UoaSwgdmVsb2NpdHkpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIGlmIHRoZSBzYW1lIG5vdGUgc3RpbGwgcGxheWluZywgc3RvcCBpdCAqLworCWlmIChwbGF5aW5nX21vZGUgIT0gQVdFX1BMQVlfRElSRUNUIHx8IGN0cmxzW0FXRV9NRF9FWENMVVNJVkVfU09VTkRdKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhd2VfbWF4X3ZvaWNlczsgaSsrKQorCQkJaWYgKHZvaWNlc1tpXS5rZXkgPT0ga2V5KSB7CisJCQkJaWYgKHZvaWNlc1tpXS5zdGF0ZSA9PSBBV0VfU1RfT04pIHsKKwkJCQkJYXdlX25vdGVfb2ZmKGkpOworCQkJCQlhd2Vfdm9pY2VfaW5pdChpLCBGQUxTRSk7CisJCQkJfSBlbHNlIGlmICh2b2ljZXNbaV0uc3RhdGUgPT0gQVdFX1NUX1NUQU5EQlkpCisJCQkJCWF3ZV92b2ljZV9pbml0KGksIFRSVUUpOworCQkJfQorCX0KKworCS8qIGFsbG9jYXRlIHZvaWNlcyAqLworCWlmIChwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfRElSRUNUKQorCQlhd2VfYWxsb2Nfb25lX3ZvaWNlKHZvaWNlLCBub3RlLCB2ZWxvY2l0eSk7CisJZWxzZQorCQlhd2VfYWxsb2NfbXVsdGlfdm9pY2VzKHZvaWNlLCBub3RlLCB2ZWxvY2l0eSwga2V5KTsKKworCS8qIHR1cm4gb2ZmIG90aGVyIHZvaWNlcyBleGx1c2l2ZWx5IChmb3IgZHJ1bXMpICovCisJZm9yIChpID0gMDsgaSA8IGF3ZV9tYXhfdm9pY2VzOyBpKyspCisJCWlmICh2b2ljZXNbaV0ua2V5ID09IGtleSkKKwkJCWF3ZV9leGNsdXNpdmVfb2ZmKGkpOworCisJLyogc2V0IHVwIHBpdGNoIGFuZCB2b2x1bWUgcGFyYW1ldGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBhd2VfbWF4X3ZvaWNlczsgaSsrKSB7CisJCWlmICh2b2ljZXNbaV0ua2V5ID09IGtleSAmJiB2b2ljZXNbaV0uc3RhdGUgPT0gQVdFX1NUX09GRikKKwkJCXNldF9hbmRfc3RhcnRfdm9pY2UoaSwgc3RhdGUpOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIGNhbGN1bGF0ZSBoYXNoIGtleSAqLworc3RhdGljIGludAorYXdlX3NlYXJjaF9rZXkoaW50IGJhbmssIGludCBwcmVzZXQsIGludCBub3RlKQoreworCXVuc2lnbmVkIGludCBrZXk7CisKKyNpZiAxIC8qIG5ldyBoYXNoIHRhYmxlICovCisJaWYgKGJhbmsgPT0gQVdFX0RSVU1fQkFOSykKKwkJa2V5ID0gcHJlc2V0ICsgbm90ZSArIDEyODsKKwllbHNlCisJCWtleSA9IGJhbmsgKyBwcmVzZXQ7CisjZWxzZQorCWtleSA9IHByZXNldDsKKyNlbmRpZgorCWtleSAlPSBBV0VfTUFYX1BSRVNFVFM7CisKKwlyZXR1cm4gKGludClrZXk7Cit9CisKKworLyogc2VhcmNoIGluc3RydW1lbnQgZnJvbSBoYXNoIHRhYmxlICovCitzdGF0aWMgYXdlX3ZvaWNlX2xpc3QgKgorYXdlX3NlYXJjaF9pbnN0cihpbnQgYmFuaywgaW50IHByZXNldCwgaW50IG5vdGUpCit7CisJYXdlX3ZvaWNlX2xpc3QgKnA7CisJaW50IGtleSwga2V5MjsKKworCWtleSA9IGF3ZV9zZWFyY2hfa2V5KGJhbmssIHByZXNldCwgbm90ZSk7CisJZm9yIChwID0gcHJlc2V0X3RhYmxlW2tleV07IHA7IHAgPSBwLT5uZXh0X2JhbmspIHsKKwkJaWYgKHAtPmluc3RyID09IHByZXNldCAmJiBwLT5iYW5rID09IGJhbmspCisJCQlyZXR1cm4gcDsKKwl9CisJa2V5MiA9IGF3ZV9zZWFyY2hfa2V5KGJhbmssIHByZXNldCwgMCk7IC8qIHNlYXJjaCBkZWZhdWx0ICovCisJaWYgKGtleSA9PSBrZXkyKQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKHAgPSBwcmVzZXRfdGFibGVba2V5Ml07IHA7IHAgPSBwLT5uZXh0X2JhbmspIHsKKwkJaWYgKHAtPmluc3RyID09IHByZXNldCAmJiBwLT5iYW5rID09IGJhbmspCisJCQlyZXR1cm4gcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogYXNzaWduIHRoZSBpbnN0cnVtZW50IHRvIGEgdm9pY2UgKi8KK3N0YXRpYyBpbnQKK2F3ZV9zZXRfaW5zdHJfMihpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBpbnN0cl9ubykKK3sKKwlpZiAocGxheWluZ19tb2RlID09IEFXRV9QTEFZX01VTFRJMikgeworCQl2b2ljZSA9IHZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdID4+IDg7CisJCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gQVdFX01BWF9DSEFOTkVMUykKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gYXdlX3NldF9pbnN0cihkZXYsIHZvaWNlLCBpbnN0cl9ubyk7Cit9CisKKy8qIGFzc2lnbiB0aGUgaW5zdHJ1bWVudCB0byBhIGNoYW5uZWw7IHZvaWNlIGlzIHRoZSBjaGFubmVsIG51bWJlciAqLworc3RhdGljIGludAorYXdlX3NldF9pbnN0cihpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBpbnN0cl9ubykKK3sKKwlhd2VfY2hhbl9pbmZvICpjaW5mbzsKKworCWlmICghIHZvaWNlX2luX3JhbmdlKHZvaWNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaW5zdHJfbm8gPCAwIHx8IGluc3RyX25vID49IEFXRV9NQVhfUFJFU0VUUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljaW5mbyA9ICZjaGFubmVsc1t2b2ljZV07CisJY2luZm8tPmluc3RyID0gaW5zdHJfbm87CisJREVCVUcoMixwcmludGsoIkFXRTMyOiBbcHJvZ3JhbSglZCkgJWRdXG4iLCB2b2ljZSwgaW5zdHJfbm8pKTsKKworCXJldHVybiAwOworfQorCisKKy8qIHJlc2V0IGFsbCB2b2ljZXM7IHRlcm1pbmF0ZSBzb3VuZHMgYW5kIGluaXRpYWxpemUgcGFyYW1ldGVycyAqLworc3RhdGljIHZvaWQKK2F3ZV9yZXNldChpbnQgZGV2KQoreworCWludCBpOworCWN1cnJlbnRfYWxsb2NfdGltZSA9IDA7CisJLyogZG9uJ3QgdHVybiBvZmYgdm9pY2UgMzEgYW5kIDMyLiAgdGhleSBhcmUgdXNlZCBhbHNvIGZvciBGTSB2b2ljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYXdlX21heF92b2ljZXM7IGkrKykgeworCQlhd2VfdGVybWluYXRlKGkpOworCQlhd2Vfdm9pY2VfaW5pdChpLCBUUlVFKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFXRV9NQVhfQ0hBTk5FTFM7IGkrKykKKwkJYXdlX2NoYW5uZWxfaW5pdChpLCBUUlVFKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlhd2Vfb3BlcmF0aW9ucy5jaG5faW5mb1tpXS5jb250cm9sbGVyc1tDVExfTUFJTl9WT0xVTUVdID0gMTI3OworCQlhd2Vfb3BlcmF0aW9ucy5jaG5faW5mb1tpXS5jb250cm9sbGVyc1tDVExfRVhQUkVTU0lPTl0gPSAxMjc7CisJfQorCWF3ZV9pbml0X2ZtKCk7CisJYXdlX3R3ZWFrKCk7Cit9CisKKworLyogaGFyZHdhcmUgc3BlY2lmaWMgY29udHJvbDoKKyAqICAgR1VTIHNwZWNpZmljIGFuZCBBV0UzMiBzcGVjaWZpYyBjb250cm9scyBhcmUgYXZhaWxhYmxlLgorICovCitzdGF0aWMgdm9pZAorYXdlX2h3X2NvbnRyb2woaW50IGRldiwgdW5zaWduZWQgY2hhciAqZXZlbnQpCit7CisJaW50IGNtZCA9IGV2ZW50WzJdOworCWlmIChjbWQgJiBfQVdFX01PREVfRkxBRykKKwkJYXdlX2h3X2F3ZV9jb250cm9sKGRldiwgY21kICYgX0FXRV9NT0RFX1ZBTFVFX01BU0ssIGV2ZW50KTsKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCisJZWxzZQorCQlhd2VfaHdfZ3VzX2NvbnRyb2woZGV2LCBjbWQgJiBfQVdFX01PREVfVkFMVUVfTUFTSywgZXZlbnQpOworI2VuZGlmCit9CisKKworI2lmZGVmIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkKKworLyogR1VTIGNvbXBhdGlibGUgY29udHJvbHMgKi8KK3N0YXRpYyB2b2lkCithd2VfaHdfZ3VzX2NvbnRyb2woaW50IGRldiwgaW50IGNtZCwgdW5zaWduZWQgY2hhciAqZXZlbnQpCit7CisJaW50IHZvaWNlLCBpLCBrZXk7CisJdW5zaWduZWQgc2hvcnQgcDE7CisJc2hvcnQgcDI7CisJaW50IHBsb25nOworCisJaWYgKE1VTFRJX0xBWUVSX01PREUoKSkKKwkJcmV0dXJuOworCWlmIChjbWQgPT0gX0dVU19OVU1WT0lDRVMpCisJCXJldHVybjsKKworCXZvaWNlID0gZXZlbnRbM107CisJaWYgKCEgdm9pY2VfaW5fcmFuZ2Uodm9pY2UpKQorCQlyZXR1cm47CisKKwlwMSA9ICoodW5zaWduZWQgc2hvcnQgKikgJmV2ZW50WzRdOworCXAyID0gKihzaG9ydCAqKSAmZXZlbnRbNl07CisJcGxvbmcgPSAqKGludCopICZldmVudFs0XTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBfR1VTX1ZPSUNFU0FNUExFOgorCQlhd2Vfc2V0X2luc3RyKGRldiwgdm9pY2UsIHAxKTsKKwkJcmV0dXJuOworCisJY2FzZSBfR1VTX1ZPSUNFQkFMQToKKwkJLyogMCB0byAxNSAtLT4gLTEyOCB0byAxMjcgKi8KKwkJYXdlX3Bhbm5pbmcoZGV2LCB2b2ljZSwgKChpbnQpcDEgPDwgNCkgLSAxMjgpOworCQlyZXR1cm47CisKKwljYXNlIF9HVVNfVk9JQ0VWT0w6CisJY2FzZSBfR1VTX1ZPSUNFVk9MMjoKKwkJLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKwkJcmV0dXJuOworCisJY2FzZSBfR1VTX1JBTVBSQU5HRToKKwljYXNlIF9HVVNfUkFNUFJBVEU6CisJY2FzZSBfR1VTX1JBTVBNT0RFOgorCWNhc2UgX0dVU19SQU1QT046CisJY2FzZSBfR1VTX1JBTVBPRkY6CisJCS8qIHZvbHVtZSByYW1waW5nIG5vdCBzdXBwb3J0ZWQgKi8KKwkJcmV0dXJuOworCisJY2FzZSBfR1VTX1ZPTFVNRV9TQ0FMRToKKwkJcmV0dXJuOworCisJY2FzZSBfR1VTX1ZPSUNFX1BPUzoKKwkJRlhfU0VUKCZjaGFubmVsc1t2b2ljZV0uZngsIEFXRV9GWF9TQU1QTEVfU1RBUlQsCisJCSAgICAgICAoc2hvcnQpKHBsb25nICYgMHg3ZmZmKSk7CisJCUZYX1NFVCgmY2hhbm5lbHNbdm9pY2VdLmZ4LCBBV0VfRlhfQ09BUlNFX1NBTVBMRV9TVEFSVCwKKwkJICAgICAgIChwbG9uZyA+PiAxNSkgJiAweGZmZmYpOworCQlyZXR1cm47CisJfQorCisJa2V5ID0gQVdFX1ZPSUNFX0tFWSh2b2ljZSk7CisJZm9yIChpID0gMDsgaSA8IGF3ZV9tYXhfdm9pY2VzOyBpKyspIHsKKwkJaWYgKHZvaWNlc1tpXS5rZXkgPT0ga2V5KSB7CisJCQlzd2l0Y2ggKGNtZCkgeworCQkJY2FzZSBfR1VTX1ZPSUNFT046CisJCQkJYXdlX25vdGVfb24oaSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgX0dVU19WT0lDRU9GRjoKKwkJCQlhd2VfdGVybWluYXRlKGkpOworCQkJCWF3ZV9meF9pbml0KHZvaWNlc1tpXS5jaCk7CisJCQkJYXdlX3ZvaWNlX2luaXQoaSwgVFJVRSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgX0dVU19WT0lDRUZBREU6CisJCQkJYXdlX25vdGVfb2ZmKGkpOworCQkJCWF3ZV9meF9pbml0KHZvaWNlc1tpXS5jaCk7CisJCQkJYXdlX3ZvaWNlX2luaXQoaSwgRkFMU0UpOworCQkJCWJyZWFrOworCisJCQljYXNlIF9HVVNfVk9JQ0VGUkVROgorCQkJCWF3ZV9jYWxjX3BpdGNoX2Zyb21fZnJlcShpLCBwbG9uZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKyNlbmRpZiAvKiBndXNfY29tcGF0ICovCisKKworLyogQVdFMzIgc3BlY2lmaWMgY29udHJvbHMgKi8KK3N0YXRpYyB2b2lkCithd2VfaHdfYXdlX2NvbnRyb2woaW50IGRldiwgaW50IGNtZCwgdW5zaWduZWQgY2hhciAqZXZlbnQpCit7CisJaW50IHZvaWNlOworCXVuc2lnbmVkIHNob3J0IHAxOworCXNob3J0IHAyOworCWludCBpOworCisJdm9pY2UgPSBldmVudFszXTsKKwlpZiAoISB2b2ljZV9pbl9yYW5nZSh2b2ljZSkpCisJCXJldHVybjsKKworCWlmIChwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfTVVMVEkyKSB7CisJCXZvaWNlID0gdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPj4gODsKKwkJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBBV0VfTUFYX0NIQU5ORUxTKQorCQkJcmV0dXJuOworCX0KKworCXAxID0gKih1bnNpZ25lZCBzaG9ydCAqKSAmZXZlbnRbNF07CisJcDIgPSAqKHNob3J0ICopICZldmVudFs2XTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBfQVdFX0RFQlVHX01PREU6CisJCWN0cmxzW0FXRV9NRF9ERUJVR19NT0RFXSA9IHAxOworCQlwcmludGsoS0VSTl9ERUJVRyAiQVdFMzI6IGRlYnVnIG1vZGUgPSAlZFxuIiwgY3RybHNbQVdFX01EX0RFQlVHX01PREVdKTsKKwkJYnJlYWs7CisJY2FzZSBfQVdFX1JFVkVSQl9NT0RFOgorCQljdHJsc1tBV0VfTURfUkVWRVJCX01PREVdID0gcDE7CisJCWF3ZV91cGRhdGVfcmV2ZXJiX21vZGUoKTsKKwkJYnJlYWs7CisKKwljYXNlIF9BV0VfQ0hPUlVTX01PREU6CisJCWN0cmxzW0FXRV9NRF9DSE9SVVNfTU9ERV0gPSBwMTsKKwkJYXdlX3VwZGF0ZV9jaG9ydXNfbW9kZSgpOworCQlicmVhazsKKwkJICAgICAgCisJY2FzZSBfQVdFX1JFTU9WRV9MQVNUX1NBTVBMRVM6CisJCURFQlVHKDAscHJpbnRrKCJBV0UzMjogcmVtb3ZlIGxhc3Qgc2FtcGxlc1xuIikpOworCQlhd2VfcmVzZXQoMCk7CisJCWlmIChsb2NrZWRfc2ZfaWQgPiAwKQorCQkJYXdlX3JlbW92ZV9zYW1wbGVzKGxvY2tlZF9zZl9pZCk7CisJCWJyZWFrOworCisJY2FzZSBfQVdFX0lOSVRJQUxJWkVfQ0hJUDoKKwkJYXdlX2luaXRpYWxpemUoKTsKKwkJYnJlYWs7CisKKwljYXNlIF9BV0VfU0VORF9FRkZFQ1Q6CisJCWkgPSAtMTsKKwkJaWYgKHAxID49IDB4MTAwKSB7CisJCQlpID0gKHAxID4+IDgpOworCQkJaWYgKGkgPCAwIHx8IGkgPj0gTUFYX0xBWUVSUykKKwkJCQlicmVhazsKKwkJfQorCQlhd2Vfc2VuZF9lZmZlY3Qodm9pY2UsIGksIHAxLCBwMik7CisJCWJyZWFrOworCisJY2FzZSBfQVdFX1JFU0VUX0NIQU5ORUw6CisJCWF3ZV9jaGFubmVsX2luaXQodm9pY2UsICFwMSk7CisJCWJyZWFrOworCQkKKwljYXNlIF9BV0VfVEVSTUlOQVRFX0FMTDoKKwkJYXdlX3Jlc2V0KDApOworCQlicmVhazsKKworCWNhc2UgX0FXRV9URVJNSU5BVEVfQ0hBTk5FTDoKKwkJYXdlX3ZvaWNlX2NoYW5nZSh2b2ljZSwgYXdlX3Rlcm1pbmF0ZV9hbmRfaW5pdCk7CisJCWJyZWFrOworCisJY2FzZSBfQVdFX1JFTEVBU0VfQUxMOgorCQlhd2Vfbm90ZV9vZmZfYWxsKEZBTFNFKTsKKwkJYnJlYWs7CisJY2FzZSBfQVdFX05PVEVPRkZfQUxMOgorCQlhd2Vfbm90ZV9vZmZfYWxsKFRSVUUpOworCQlicmVhazsKKworCWNhc2UgX0FXRV9JTklUSUFMX1ZPTFVNRToKKwkJREVCVUcoMCxwcmludGsoIkFXRTMyOiBpbml0IGF0dGVudWF0aW9uICVkXG4iLCBwMSkpOworCQlhdHRlbl9yZWxhdGl2ZSA9IChjaGFyKXAyOworCQlhdHRlbl9vZmZzZXQgPSAoc2hvcnQpcDE7CisJCWF3ZV91cGRhdGVfdm9sdW1lKCk7CisJCWJyZWFrOworCisJY2FzZSBfQVdFX0NITl9QUkVTU1VSRToKKwkJY2hhbm5lbHNbdm9pY2VdLmNoYW5fcHJlc3MgPSBwMTsKKwkJYXdlX21vZHdoZWVsX2NoYW5nZSh2b2ljZSwgcDEpOworCQlicmVhazsKKworCWNhc2UgX0FXRV9DSEFOTkVMX01PREU6CisJCURFQlVHKDAscHJpbnRrKCJBV0UzMjogY2hhbm5lbCBtb2RlID0gJWRcbiIsIHAxKSk7CisJCXBsYXlpbmdfbW9kZSA9IHAxOworCQlhd2VfcmVzZXQoMCk7CisJCWJyZWFrOworCisJY2FzZSBfQVdFX0RSVU1fQ0hBTk5FTFM6CisJCURFQlVHKDAscHJpbnRrKCJBV0UzMjogZHJ1bSBmbGFncyA9ICV4XG4iLCBwMSkpOworCQlkcnVtX2ZsYWdzID0gKih1bnNpZ25lZCBpbnQqKSZldmVudFs0XTsKKwkJYnJlYWs7CisKKwljYXNlIF9BV0VfTUlTQ19NT0RFOgorCQlERUJVRygwLHByaW50aygiQVdFMzI6IGN0cmwgcGFybXMgPSAlZCAlZFxuIiwgcDEsIHAyKSk7CisJCWlmIChwMSA+IEFXRV9NRF9WRVJTSU9OICYmIHAxIDwgQVdFX01EX0VORCkgeworCQkJY3RybHNbcDFdID0gcDI7CisJCQlpZiAoY3RybF9wYXJtc1twMV0udXBkYXRlKQorCQkJCWN0cmxfcGFybXNbcDFdLnVwZGF0ZSgpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBfQVdFX0VRVUFMSVpFUjoKKwkJY3RybHNbQVdFX01EX0JBU1NfTEVWRUxdID0gcDE7CisJCWN0cmxzW0FXRV9NRF9UUkVCTEVfTEVWRUxdID0gcDI7CisJCWF3ZV91cGRhdGVfZXF1YWxpemVyKCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREVCVUcoMCxwcmludGsoIkFXRTMyOiBodyBjb250cm9sIGNtZD0lZCB2b2ljZT0lZFxuIiwgY21kLCB2b2ljZSkpOworCQlicmVhazsKKwl9Cit9CisKKworLyogY2hhbmdlIGVmZmVjdHMgKi8KK3N0YXRpYyB2b2lkCithd2Vfc2VuZF9lZmZlY3QoaW50IHZvaWNlLCBpbnQgbGF5ZXIsIGludCB0eXBlLCBpbnQgdmFsKQoreworCWF3ZV9jaGFuX2luZm8gKmNpbmZvOworCUZYX1JlYyAqZng7CisJaW50IG1vZGU7CisKKwljaW5mbyA9ICZjaGFubmVsc1t2b2ljZV07CisJaWYgKGxheWVyID49IDAgJiYgbGF5ZXIgPCBNQVhfTEFZRVJTKQorCQlmeCA9ICZjaW5mby0+ZnhfbGF5ZXJbbGF5ZXJdOworCWVsc2UKKwkJZnggPSAmY2luZm8tPmZ4OworCisJaWYgKHR5cGUgJiAweDQwKQorCQltb2RlID0gRlhfRkxBR19PRkY7CisJZWxzZSBpZiAodHlwZSAmIDB4ODApCisJCW1vZGUgPSBGWF9GTEFHX0FERDsKKwllbHNlCisJCW1vZGUgPSBGWF9GTEFHX1NFVDsKKwl0eXBlICY9IDB4M2Y7CisKKwlpZiAodHlwZSA+PSAwICYmIHR5cGUgPCBBV0VfRlhfRU5EKSB7CisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogZWZmZWN0cyAoJWQpICVkICVkXG4iLCB2b2ljZSwgdHlwZSwgdmFsKSk7CisJCWlmIChtb2RlID09IEZYX0ZMQUdfU0VUKQorCQkJRlhfU0VUKGZ4LCB0eXBlLCB2YWwpOworCQllbHNlIGlmIChtb2RlID09IEZYX0ZMQUdfQUREKQorCQkJRlhfQUREKGZ4LCB0eXBlLCB2YWwpOworCQllbHNlCisJCQlGWF9VTlNFVChmeCwgdHlwZSk7CisJCWlmIChtb2RlICE9IEZYX0ZMQUdfT0ZGICYmIHBhcm1fZGVmc1t0eXBlXS5yZWFsdGltZSkgeworCQkJREVCVUcoMixwcmludGsoIkFXRTMyOiBmeF9yZWFsdGltZSAoJWQpXG4iLCB2b2ljZSkpOworCQkJYXdlX3ZvaWNlX2NoYW5nZSh2b2ljZSwgcGFybV9kZWZzW3R5cGVdLnJlYWx0aW1lKTsKKwkJfQorCX0KK30KKworCisvKiBjaGFuZ2UgbW9kdWxhdGlvbiB3aGVlbDsgdm9pY2UgaXMgYWxyZWFkeSBtYXBwZWQgb24gbXVsdGkyIG1vZGUgKi8KK3N0YXRpYyB2b2lkCithd2VfbW9kd2hlZWxfY2hhbmdlKGludCB2b2ljZSwgaW50IHZhbHVlKQoreworCWludCBpOworCWF3ZV9jaGFuX2luZm8gKmNpbmZvOworCisJY2luZm8gPSAmY2hhbm5lbHNbdm9pY2VdOworCWkgPSB2YWx1ZSAqIGN0cmxzW0FXRV9NRF9NT0RfU0VOU0VdIC8gMTIwMDsKKwlGWF9BREQoJmNpbmZvLT5meCwgQVdFX0ZYX0xGTzFfUElUQ0gsIGkpOworCWF3ZV92b2ljZV9jaGFuZ2Uodm9pY2UsIGF3ZV9meF9mbW1vZCk7CisJRlhfQUREKCZjaW5mby0+ZngsIEFXRV9GWF9MRk8yX1BJVENILCBpKTsKKwlhd2Vfdm9pY2VfY2hhbmdlKHZvaWNlLCBhd2VfZnhfZm0yZnJxMik7Cit9CisKKworLyogdm9pY2UgcHJlc3N1cmUgY2hhbmdlICovCitzdGF0aWMgdm9pZAorYXdlX2FmdGVydG91Y2goaW50IGRldiwgaW50IHZvaWNlLCBpbnQgcHJlc3N1cmUpCit7CisJaW50IG5vdGU7CisKKwlERUJVRygyLHByaW50aygiQVdFMzI6IFthZnRlciglZCkgJWRdXG4iLCB2b2ljZSwgcHJlc3N1cmUpKTsKKwlpZiAoISB2b2ljZV9pbl9yYW5nZSh2b2ljZSkpCisJCXJldHVybjsKKworCXN3aXRjaCAocGxheWluZ19tb2RlKSB7CisJY2FzZSBBV0VfUExBWV9ESVJFQ1Q6CisJY2FzZSBBV0VfUExBWV9JTkRJUkVDVDoKKwkJYXdlX3N0YXJ0X25vdGUoZGV2LCB2b2ljZSwgMjU1LCBwcmVzc3VyZSk7CisJCWJyZWFrOworCWNhc2UgQVdFX1BMQVlfTVVMVEkyOgorCQlub3RlID0gKHZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdICYgMHhmZikgLSAxOworCQlhd2Vfa2V5X3ByZXNzdXJlKGRldiwgdm9pY2UsIG5vdGUgKyAweDgwLCBwcmVzc3VyZSk7CisJCWJyZWFrOworCX0KK30KKworCisvKiB2b2ljZSBjb250cm9sIGNoYW5nZSAqLworc3RhdGljIHZvaWQKK2F3ZV9jb250cm9sbGVyKGludCBkZXYsIGludCB2b2ljZSwgaW50IGN0cmxfbnVtLCBpbnQgdmFsdWUpCit7CisJYXdlX2NoYW5faW5mbyAqY2luZm87CisKKwlpZiAoISB2b2ljZV9pbl9yYW5nZSh2b2ljZSkpCisJCXJldHVybjsKKworCWlmIChwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfTVVMVEkyKSB7CisJCXZvaWNlID0gdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPj4gODsKKwkJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBBV0VfTUFYX0NIQU5ORUxTKQorCQkJcmV0dXJuOworCX0KKworCWNpbmZvID0gJmNoYW5uZWxzW3ZvaWNlXTsKKworCXN3aXRjaCAoY3RybF9udW0pIHsKKwljYXNlIENUTF9CQU5LX1NFTEVDVDogLyogTUlESSBjb250cm9sICMwICovCisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW2JhbmsoJWQpICVkXVxuIiwgdm9pY2UsIHZhbHVlKSk7CisJCWlmIChNVUxUSV9MQVlFUl9NT0RFKCkgJiYgSVNfRFJVTV9DSEFOTkVMKHZvaWNlKSAmJgorCQkgICAgIWN0cmxzW0FXRV9NRF9UT0dHTEVfRFJVTV9CQU5LXSkKKwkJCWJyZWFrOworCQlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KQorCQkJYnJlYWs7CisJCWNpbmZvLT5iYW5rID0gdmFsdWU7CisJCWlmIChjaW5mby0+YmFuayA9PSBBV0VfRFJVTV9CQU5LKQorCQkJRFJVTV9DSEFOTkVMX09OKGNpbmZvLT5jaGFubmVsKTsKKwkJZWxzZQorCQkJRFJVTV9DSEFOTkVMX09GRihjaW5mby0+Y2hhbm5lbCk7CisJCWF3ZV9zZXRfaW5zdHIoZGV2LCB2b2ljZSwgY2luZm8tPmluc3RyKTsKKwkJYnJlYWs7CisKKwljYXNlIENUTF9NT0RXSEVFTDogLyogTUlESSBjb250cm9sICMxICovCisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW21vZHdoZWVsKCVkKSAlZF1cbiIsIHZvaWNlLCB2YWx1ZSkpOworCQlhd2VfbW9kd2hlZWxfY2hhbmdlKHZvaWNlLCB2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBDVFJMX1BJVENIX0JFTkRFUjogLyogU0VRMSBWMiBjb250b3JsICovCisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW2JlbmQoJWQpICVkXVxuIiwgdm9pY2UsIHZhbHVlKSk7CisJCS8qIHplcm8gY2VudGVyZWQgKi8KKwkJY2luZm8tPmJlbmRlciA9IHZhbHVlOworCQlhd2Vfdm9pY2VfY2hhbmdlKHZvaWNlLCBhd2Vfc2V0X3ZvaWNlX3BpdGNoKTsKKwkJYnJlYWs7CisKKwljYXNlIENUUkxfUElUQ0hfQkVOREVSX1JBTkdFOiAvKiBTRVExIFYyIGNvbnRyb2wgKi8KKwkJREVCVUcoMixwcmludGsoIkFXRTMyOiBbcmFuZ2UoJWQpICVkXVxuIiwgdm9pY2UsIHZhbHVlKSk7CisJCS8qIHZhbHVlID0gc2Vuc2UgeCAxMDAgKi8KKwkJY2luZm8tPmJlbmRlcl9yYW5nZSA9IHZhbHVlOworCQkvKiBubyBhdWRpYmxlIHBpdGNoIGNoYW5nZSB5ZXQuLiAqLworCQlicmVhazsKKworCWNhc2UgQ1RMX0VYUFJFU1NJT046IC8qIE1JREkgY29udHJvbCAjMTEgKi8KKwkJaWYgKFNJTkdMRV9MQVlFUl9NT0RFKCkpCisJCQl2YWx1ZSAvPSAxMjg7CisJY2FzZSBDVFJMX0VYUFJFU1NJT046IC8qIFNFUTEgVjIgY29udHJvbCAqLworCQlERUJVRygyLHByaW50aygiQVdFMzI6IFtleHByKCVkKSAlZF1cbiIsIHZvaWNlLCB2YWx1ZSkpOworCQkvKiAwIC0gMTI3ICovCisJCWNpbmZvLT5leHByZXNzaW9uX3ZvbCA9IHZhbHVlOworCQlhd2Vfdm9pY2VfY2hhbmdlKHZvaWNlLCBhd2Vfc2V0X3ZvaWNlX3ZvbCk7CisJCWJyZWFrOworCisJY2FzZSBDVExfUEFOOgkvKiBNSURJIGNvbnRyb2wgIzEwICovCisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW3BhbiglZCkgJWRdXG4iLCB2b2ljZSwgdmFsdWUpKTsKKwkJLyogKDAtMTI3KSAtPiBzaWduZWQgOGJpdCAqLworCQljaW5mby0+cGFubmluZyA9IHZhbHVlICogMiAtIDEyODsKKwkJaWYgKGN0cmxzW0FXRV9NRF9SRUFMVElNRV9QQU5dKQorCQkJYXdlX3ZvaWNlX2NoYW5nZSh2b2ljZSwgYXdlX3NldF9wYW4pOworCQlicmVhazsKKworCWNhc2UgQ1RMX01BSU5fVk9MVU1FOgkvKiBNSURJIGNvbnRyb2wgIzcgKi8KKwkJaWYgKFNJTkdMRV9MQVlFUl9NT0RFKCkpCisJCQl2YWx1ZSA9ICh2YWx1ZSAqIDEwMCkgLyAxNjM4MzsKKwljYXNlIENUUkxfTUFJTl9WT0xVTUU6CS8qIFNFUTEgVjIgY29udHJvbCAqLworCQlERUJVRygyLHByaW50aygiQVdFMzI6IFttYWludm9sKCVkKSAlZF1cbiIsIHZvaWNlLCB2YWx1ZSkpOworCQkvKiAwIC0gMTI3ICovCisJCWNpbmZvLT5tYWluX3ZvbCA9IHZhbHVlOworCQlhd2Vfdm9pY2VfY2hhbmdlKHZvaWNlLCBhd2Vfc2V0X3ZvaWNlX3ZvbCk7CisJCWJyZWFrOworCisJY2FzZSBDVExfRVhUX0VGRl9ERVBUSDogLyogcmV2ZXJiIGVmZmVjdHM6IDAtMTI3ICovCisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW3JldmVyYiglZCkgJWRdXG4iLCB2b2ljZSwgdmFsdWUpKTsKKwkJRlhfU0VUKCZjaW5mby0+ZngsIEFXRV9GWF9SRVZFUkIsIHZhbHVlICogMik7CisJCWJyZWFrOworCisJY2FzZSBDVExfQ0hPUlVTX0RFUFRIOiAvKiBjaG9ydXMgZWZmZWN0czogMC0xMjcgKi8KKwkJREVCVUcoMixwcmludGsoIkFXRTMyOiBbY2hvcnVzKCVkKSAlZF1cbiIsIHZvaWNlLCB2YWx1ZSkpOworCQlGWF9TRVQoJmNpbmZvLT5meCwgQVdFX0ZYX0NIT1JVUywgdmFsdWUgKiAyKTsKKwkJYnJlYWs7CisKKwljYXNlIDEyMDogIC8qIGFsbCBzb3VuZHMgb2ZmICovCisJCWF3ZV9ub3RlX29mZl9hbGwoRkFMU0UpOworCQlicmVhazsKKwljYXNlIDEyMzogIC8qIGFsbCBub3RlcyBvZmYgKi8KKwkJYXdlX25vdGVfb2ZmX2FsbChUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIENUTF9TVVNUQUlOOiAvKiBNSURJIGNvbnRyb2wgIzY0ICovCisJCWNpbmZvLT5zdXN0YWluZWQgPSB2YWx1ZTsKKwkJaWYgKHZhbHVlICE9IDEyNykKKwkJCWF3ZV92b2ljZV9jaGFuZ2Uodm9pY2UsIGF3ZV9zdXN0YWluX29mZik7CisJCWJyZWFrOworCisJY2FzZSBDVExfU09TVEVOVVRPOiAvKiBNSURJIGNvbnRyb2wgIzY2ICovCisJCWlmICh2YWx1ZSA9PSAxMjcpCisJCQlhd2Vfdm9pY2VfY2hhbmdlKHZvaWNlLCBhd2Vfc29zdGVudXRvX29uKTsKKwkJZWxzZQorCQkJYXdlX3ZvaWNlX2NoYW5nZSh2b2ljZSwgYXdlX3N1c3RhaW5fb2ZmKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlERUJVRygwLHByaW50aygiQVdFMzI6IFtjb250cm9sKCVkKSBjdHJsPSVkIHZhbD0lZF1cbiIsCisJCQkgICB2b2ljZSwgY3RybF9udW0sIHZhbHVlKSk7CisJCWJyZWFrOworCX0KK30KKworCisvKiB2b2ljZSBwYW4gY2hhbmdlICh2YWx1ZSA9IC0xMjggLSAxMjcpICovCitzdGF0aWMgdm9pZAorYXdlX3Bhbm5pbmcoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgdmFsdWUpCit7CisJYXdlX2NoYW5faW5mbyAqY2luZm87CisKKwlpZiAoISB2b2ljZV9pbl9yYW5nZSh2b2ljZSkpCisJCXJldHVybjsKKworCWlmIChwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfTVVMVEkyKSB7CisJCXZvaWNlID0gdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPj4gODsKKwkJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBBV0VfTUFYX0NIQU5ORUxTKQorCQkJcmV0dXJuOworCX0KKworCWNpbmZvID0gJmNoYW5uZWxzW3ZvaWNlXTsKKwljaW5mby0+cGFubmluZyA9IHZhbHVlOworCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW3BhbiglZCkgJWRdXG4iLCB2b2ljZSwgY2luZm8tPnBhbm5pbmcpKTsKKwlpZiAoY3RybHNbQVdFX01EX1JFQUxUSU1FX1BBTl0pCisJCWF3ZV92b2ljZV9jaGFuZ2Uodm9pY2UsIGF3ZV9zZXRfcGFuKTsKK30KKworCisvKiB2b2x1bWUgbW9kZSBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkCithd2Vfdm9sdW1lX21ldGhvZChpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwkvKiBub3QgaW1wcmVtZW50ZWQgKi8KKwlERUJVRygwLHByaW50aygiQVdFMzI6IFt2b2xtZXRob2QgbW9kZT0lZF1cbiIsIG1vZGUpKTsKK30KKworCisvKiBwaXRjaCB3aGVlbCBjaGFuZ2U6IDAtMTYzODQgKi8KK3N0YXRpYyB2b2lkCithd2VfYmVuZGVyKGludCBkZXYsIGludCB2b2ljZSwgaW50IHZhbHVlKQoreworCWF3ZV9jaGFuX2luZm8gKmNpbmZvOworCisJaWYgKCEgdm9pY2VfaW5fcmFuZ2Uodm9pY2UpKQorCQlyZXR1cm47CisKKwlpZiAocGxheWluZ19tb2RlID09IEFXRV9QTEFZX01VTFRJMikgeworCQl2b2ljZSA9IHZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdID4+IDg7CisJCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gQVdFX01BWF9DSEFOTkVMUykKKwkJCXJldHVybjsKKwl9CisKKwkvKiBjb252ZXJ0IHRvIHplcm8gY2VudGVyZWQgdmFsdWUgKi8KKwljaW5mbyA9ICZjaGFubmVsc1t2b2ljZV07CisJY2luZm8tPmJlbmRlciA9IHZhbHVlIC0gODE5MjsKKwlERUJVRygyLHByaW50aygiQVdFMzI6IFtiZW5kKCVkKSAlZF1cbiIsIHZvaWNlLCBjaW5mby0+YmVuZGVyKSk7CisJYXdlX3ZvaWNlX2NoYW5nZSh2b2ljZSwgYXdlX3NldF92b2ljZV9waXRjaCk7Cit9CisKKworLyoKKyAqIGxvYWQgYSBzb3VuZCBwYXRjaDoKKyAqICAgdGhyZWUgdHlwZXMgb2YgcGF0Y2hlcyBhcmUgYWNjZXB0ZWQ6IEFXRSwgR1VTLCBhbmQgU1lTRVguCisgKi8KKworc3RhdGljIGludAorYXdlX2xvYWRfcGF0Y2goaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJICAgICAgIGludCBvZmZzLCBpbnQgY291bnQsIGludCBwbWdyX2ZsYWcpCit7CisJYXdlX3BhdGNoX2luZm8gcGF0Y2g7CisJaW50IHJjID0gMDsKKworI2lmZGVmIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkKKwlpZiAoZm9ybWF0ID09IEdVU19QQVRDSCkgeworCQlyZXR1cm4gYXdlX2xvYWRfZ3VzcGF0Y2goYWRkciwgb2ZmcywgY291bnQsIHBtZ3JfZmxhZyk7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoZm9ybWF0ID09IFNZU0VYX1BBVENIKSB7CisJCS8qIG5vIHN5c3RlbSBleGNsdXNpdmUgbWVzc2FnZSBzdXBwb3J0ZWQgeWV0ICovCisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoZm9ybWF0ICE9IEFXRV9QQVRDSCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMiBFcnJvcjogSW52YWxpZCBwYXRjaCBmb3JtYXQgKGtleSkgMHgleFxuIiwgZm9ybWF0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCWlmIChjb3VudCA8IEFXRV9QQVRDSF9JTkZPX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IFBhdGNoIGhlYWRlciB0b28gc2hvcnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCgoY2hhciopJnBhdGNoKSArIG9mZnMsIGFkZHIgKyBvZmZzLCAKKwkJCSAgIEFXRV9QQVRDSF9JTkZPX1NJWkUgLSBvZmZzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljb3VudCAtPSBBV0VfUEFUQ0hfSU5GT19TSVpFOworCWlmIChjb3VudCA8IHBhdGNoLmxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMjogc2FtcGxlOiBQYXRjaCByZWNvcmQgdG9vIHNob3J0ICglZDwlZClcbiIsCisJCSAgICAgICBjb3VudCwgcGF0Y2gubGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCXN3aXRjaCAocGF0Y2gudHlwZSkgeworCWNhc2UgQVdFX0xPQURfSU5GTzoKKwkJcmMgPSBhd2VfbG9hZF9pbmZvKCZwYXRjaCwgYWRkciwgY291bnQpOworCQlicmVhazsKKwljYXNlIEFXRV9MT0FEX0RBVEE6CisJCXJjID0gYXdlX2xvYWRfZGF0YSgmcGF0Y2gsIGFkZHIsIGNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBBV0VfT1BFTl9QQVRDSDoKKwkJcmMgPSBhd2Vfb3Blbl9wYXRjaCgmcGF0Y2gsIGFkZHIsIGNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBBV0VfQ0xPU0VfUEFUQ0g6CisJCXJjID0gYXdlX2Nsb3NlX3BhdGNoKCZwYXRjaCwgYWRkciwgY291bnQpOworCQlicmVhazsKKwljYXNlIEFXRV9VTkxPQURfUEFUQ0g6CisJCXJjID0gYXdlX3VubG9hZF9wYXRjaCgmcGF0Y2gsIGFkZHIsIGNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBBV0VfUkVQTEFDRV9EQVRBOgorCQlyYyA9IGF3ZV9yZXBsYWNlX2RhdGEoJnBhdGNoLCBhZGRyLCBjb3VudCk7CisJCWJyZWFrOworCWNhc2UgQVdFX01BUF9QUkVTRVQ6CisJCXJjID0gYXdlX2xvYWRfbWFwKCZwYXRjaCwgYWRkciwgY291bnQpOworCQlicmVhazsKKwkvKiBjYXNlIEFXRV9QUk9CRV9JTkZPOgorCQlyYyA9IGF3ZV9wcm9iZV9pbmZvKCZwYXRjaCwgYWRkciwgY291bnQpOworCQlicmVhazsqLworCWNhc2UgQVdFX1BST0JFX0RBVEE6CisJCXJjID0gYXdlX3Byb2JlX2RhdGEoJnBhdGNoLCBhZGRyLCBjb3VudCk7CisJCWJyZWFrOworCWNhc2UgQVdFX1JFTU9WRV9JTkZPOgorCQlyYyA9IGF3ZV9yZW1vdmVfaW5mbygmcGF0Y2gsIGFkZHIsIGNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBBV0VfTE9BRF9DSE9SVVNfRlg6CisJCXJjID0gYXdlX2xvYWRfY2hvcnVzX2Z4KCZwYXRjaCwgYWRkciwgY291bnQpOworCQlicmVhazsKKwljYXNlIEFXRV9MT0FEX1JFVkVSQl9GWDoKKwkJcmMgPSBhd2VfbG9hZF9yZXZlcmJfZngoJnBhdGNoLCBhZGRyLCBjb3VudCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IHVua25vd24gcGF0Y2ggZm9ybWF0IHR5cGUgJWRcbiIsCisJCSAgICAgICBwYXRjaC50eXBlKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworCisvKiBjcmVhdGUgYW4gc2YgbGlzdCByZWNvcmQgKi8KK3N0YXRpYyBpbnQKK2F3ZV9jcmVhdGVfc2YoaW50IHR5cGUsIGNoYXIgKm5hbWUpCit7CisJc2ZfbGlzdCAqcmVjOworCisJLyogdGVybWluYXRlIHNvdW5kcyAqLworCWF3ZV9yZXNldCgwKTsKKwlyZWMgPSAoc2ZfbGlzdCAqKWttYWxsb2Moc2l6ZW9mKCpyZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVjID09IE5VTEwpCisJCXJldHVybiAxOyAvKiBubyBtZW1vcnkgKi8KKwlyZWMtPnNmX2lkID0gY3VycmVudF9zZl9pZCArIDE7CisJcmVjLT50eXBlID0gdHlwZTsKKwlpZiAoLypjdXJyZW50X3NmX2lkID09IDAgfHwqLyAodHlwZSAmIEFXRV9QQVRfTE9DS0VEKSAhPSAwKQorCQlsb2NrZWRfc2ZfaWQgPSBjdXJyZW50X3NmX2lkICsgMTsKKwlyZWMtPm51bV9pbmZvID0gYXdlX2ZyZWVfaW5mbygpOworCXJlYy0+bnVtX3NhbXBsZSA9IGF3ZV9mcmVlX3NhbXBsZSgpOworCXJlYy0+bWVtX3B0ciA9IGF3ZV9mcmVlX21lbV9wdHIoKTsKKwlyZWMtPmluZm9zID0gcmVjLT5sYXN0X2luZm9zID0gTlVMTDsKKwlyZWMtPnNhbXBsZXMgPSByZWMtPmxhc3Rfc2FtcGxlcyA9IE5VTEw7CisKKwkvKiBhZGQgdG8gbGlua2VkLWxpc3QgKi8KKwlyZWMtPm5leHQgPSBOVUxMOworCXJlYy0+cHJldiA9IHNmdGFpbDsKKwlpZiAoc2Z0YWlsKQorCQlzZnRhaWwtPm5leHQgPSByZWM7CisJZWxzZQorCQlzZmhlYWQgPSByZWM7CisJc2Z0YWlsID0gcmVjOworCWN1cnJlbnRfc2ZfaWQrKzsKKworI2lmZGVmIEFXRV9BTExPV19TQU1QTEVfU0hBUklORworCXJlYy0+c2hhcmVkID0gTlVMTDsKKwlpZiAobmFtZSkKKwkJbWVtY3B5KHJlYy0+bmFtZSwgbmFtZSwgQVdFX1BBVENIX05BTUVfTEVOKTsKKwllbHNlCisJCXN0cmNweShyZWMtPm5hbWUsICIqVEVNUE9SQVJZKiIpOworCWlmIChjdXJyZW50X3NmX2lkID4gMSAmJiBuYW1lICYmICh0eXBlICYgQVdFX1BBVF9TSEFSRUQpICE9IDApIHsKKwkJLyogaXMgdGhlIGN1cnJlbnQgZm9udCByZWFsbHkgYSBzaGFyZWQgZm9udD8gKi8KKwkJaWYgKGlzX3NoYXJlZF9zZihyZWMtPm5hbWUpKSB7CisJCQkvKiBjaGVjayBpZiB0aGUgc2hhcmVkIGZvbnQgaXMgYWxyZWFkeSBpbnN0YWxsZWQgKi8KKwkJCXNmX2xpc3QgKnA7CisJCQlmb3IgKHAgPSByZWMtPnByZXY7IHA7IHAgPSBwLT5wcmV2KSB7CisJCQkJaWYgKGlzX2lkZW50aWNhbF9uYW1lKHJlYy0+bmFtZSwgcCkpIHsKKwkJCQkJcmVjLT5zaGFyZWQgPSBwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogYWxsb3cgc2hhcmluZyAqLworCisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIEFXRV9BTExPV19TQU1QTEVfU0hBUklORworCisvKiBjaGVjayBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhIHZhbGlkIHNoYXJlZCBuYW1lICovCisjZGVmaW5lIEFTQ19UT19LRVkoYykgKChjKSAtICdBJyArIDEpCitzdGF0aWMgaW50IGlzX3NoYXJlZF9zZih1bnNpZ25lZCBjaGFyICpuYW1lKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGlkX2hlYWRbNF0gPSB7CisJCUFTQ19UT19LRVkoJ0EnKSwgQVNDX1RPX0tFWSgnVycpLCBBU0NfVE9fS0VZKCdFJyksCisJCUFXRV9NQUpPUl9WRVJTSU9OLAorCX07CisJaWYgKG1lbWNtcChuYW1lLCBpZF9oZWFkLCA0KSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qIGNoZWNrIGlmIHRoZSBnaXZlbiBuYW1lIG1hdGNoZXMgdG8gdGhlIGV4aXN0aW5nIGxpc3QgKi8KK3N0YXRpYyBpbnQgaXNfaWRlbnRpY2FsX25hbWUodW5zaWduZWQgY2hhciAqbmFtZSwgc2ZfbGlzdCAqcCkgCit7CisJY2hhciAqaWQgPSBwLT5uYW1lOworCWlmIChpc19zaGFyZWRfc2YoaWQpICYmIG1lbWNtcChpZCwgbmFtZSwgQVdFX1BBVENIX05BTUVfTEVOKSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qIGNoZWNrIGlmIHRoZSBnaXZlbiB2b2ljZSBpbmZvIGV4aXN0cyAqLworc3RhdGljIGludCBpbmZvX2R1cGxpY2F0ZWQoc2ZfbGlzdCAqc2YsIGF3ZV92b2ljZV9saXN0ICpyZWMpCit7CisJLyogc2VhcmNoIGZvciBhbGwgc2hhcmluZyBsaXN0cyAqLworCWZvciAoOyBzZjsgc2YgPSBzZi0+c2hhcmVkKSB7CisJCWF3ZV92b2ljZV9saXN0ICpwOworCQlmb3IgKHAgPSBzZi0+aW5mb3M7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlpZiAocC0+dHlwZSA9PSBWX1NUX05PUk1BTCAmJgorCQkJICAgIHAtPmJhbmsgPT0gcmVjLT5iYW5rICYmCisJCQkgICAgcC0+aW5zdHIgPT0gcmVjLT5pbnN0ciAmJgorCQkJICAgIHAtPnYubG93ID09IHJlYy0+di5sb3cgJiYKKwkJCSAgICBwLT52LmhpZ2ggPT0gcmVjLT52LmhpZ2ggJiYKKwkJCSAgICBwLT52LnNhbXBsZSA9PSByZWMtPnYuc2FtcGxlKQorCQkJCXJldHVybiBUUlVFOworCQl9CisJfQorCXJldHVybiBGQUxTRTsKK30KKworI2VuZGlmIC8qIEFXRV9BTExPV19TQU1QTEVfU0hBUklORyAqLworCisKKy8qIGZyZWUgc2ZfbGlzdCByZWNvcmQgKi8KKy8qIGxpbmtlZC1saXN0IGluIHRoaXMgZnVuY3Rpb24gaXMgbm90IGNhcmVkICovCitzdGF0aWMgdm9pZAorYXdlX2ZyZWVfc2Yoc2ZfbGlzdCAqc2YpCit7CisJaWYgKHNmLT5pbmZvcykgeworCQlhd2Vfdm9pY2VfbGlzdCAqcCwgKm5leHQ7CisJCWZvciAocCA9IHNmLT5pbmZvczsgcDsgcCA9IG5leHQpIHsKKwkJCW5leHQgPSBwLT5uZXh0OworCQkJa2ZyZWUocCk7CisJCX0KKwl9CisJaWYgKHNmLT5zYW1wbGVzKSB7CisJCWF3ZV9zYW1wbGVfbGlzdCAqcCwgKm5leHQ7CisJCWZvciAocCA9IHNmLT5zYW1wbGVzOyBwOyBwID0gbmV4dCkgeworCQkJbmV4dCA9IHAtPm5leHQ7CisJCQlrZnJlZShwKTsKKwkJfQorCX0KKwlrZnJlZShzZik7Cit9CisKKworLyogb3BlbiBwYXRjaDsgY3JlYXRlIHNmIGxpc3QgYW5kIHNldCBvcGVuZWQgZmxhZyAqLworc3RhdGljIGludAorYXdlX29wZW5fcGF0Y2goYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KQoreworCWF3ZV9vcGVuX3Bhcm0gcGFybTsKKwlpbnQgc2hhcmVkOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJtLCBhZGRyICsgQVdFX1BBVENIX0lORk9fU0laRSwgc2l6ZW9mKHBhcm0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2hhcmVkID0gRkFMU0U7CisKKyNpZmRlZiBBV0VfQUxMT1dfU0FNUExFX1NIQVJJTkcKKwlpZiAoc2Z0YWlsICYmIChwYXJtLnR5cGUgJiBBV0VfUEFUX1NIQVJFRCkgIT0gMCkgeworCQkvKiBpcyB0aGUgcHJldmlvdXMgZm9udCB0aGUgc2FtZSBmb250PyAqLworCQlpZiAoaXNfaWRlbnRpY2FsX25hbWUocGFybS5uYW1lLCBzZnRhaWwpKSB7CisJCQkvKiB0aGVuIGFwcGVuZCB0byB0aGUgcHJldmlvdXMgKi8KKwkJCXNoYXJlZCA9IFRSVUU7CisJCQlhd2VfcmVzZXQoMCk7CisJCQlpZiAocGFybS50eXBlICYgQVdFX1BBVF9MT0NLRUQpCisJCQkJbG9ja2VkX3NmX2lkID0gY3VycmVudF9zZl9pZDsKKwkJfQorCX0KKyNlbmRpZiAvKiBhbGxvdyBzaGFyaW5nICovCisJaWYgKCEgc2hhcmVkKSB7CisJCWlmIChhd2VfY3JlYXRlX3NmKHBhcm0udHlwZSwgcGFybS5uYW1lKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJBV0UzMjogY2FuJ3Qgb3BlbjogZmFpbGVkIHRvIGFsbG9jIG5ldyBsaXN0XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXBhdGNoX29wZW5lZCA9IFRSVUU7CisJcmV0dXJuIGN1cnJlbnRfc2ZfaWQ7Cit9CisKKy8qIGNoZWNrIGlmIHRoZSBwYXRjaCBpcyBhbHJlYWR5IG9wZW5lZCAqLworc3RhdGljIHNmX2xpc3QgKgorY2hlY2tfcGF0Y2hfb3BlbmVkKGludCB0eXBlLCBjaGFyICpuYW1lKQoreworCWlmICghIHBhdGNoX29wZW5lZCkgeworCQlpZiAoYXdlX2NyZWF0ZV9zZih0eXBlLCBuYW1lKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJBV0UzMjogZmFpbGVkIHRvIGFsbG9jIG5ldyBsaXN0XG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXBhdGNoX29wZW5lZCA9IFRSVUU7CisJCXJldHVybiBzZnRhaWw7CisJfQorCXJldHVybiBzZnRhaWw7Cit9CisKKy8qIGNsb3NlIHRoZSBwYXRjaDsgaWYgbm8gdm9pY2UgaXMgbG9hZGVkLCByZW1vdmUgdGhlIHBhdGNoICovCitzdGF0aWMgaW50Cithd2VfY2xvc2VfcGF0Y2goYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KQoreworCWlmIChwYXRjaF9vcGVuZWQgJiYgc2Z0YWlsKSB7CisJCS8qIGlmIG5vIHZvaWNlIGlzIGxvYWRlZCwgcmVsZWFzZSB0aGUgY3VycmVudCBwYXRjaCAqLworCQlpZiAoc2Z0YWlsLT5pbmZvcyA9PSBOVUxMKSB7CisJCQlhd2VfcmVzZXQoMCk7CisJCQlhd2VfcmVtb3ZlX3NhbXBsZXMoY3VycmVudF9zZl9pZCAtIDEpOworCQl9CisJfQorCXBhdGNoX29wZW5lZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKworLyogcmVtb3ZlIHRoZSBsYXRlc3QgcGF0Y2ggKi8KK3N0YXRpYyBpbnQKK2F3ZV91bmxvYWRfcGF0Y2goYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KQoreworCWlmIChjdXJyZW50X3NmX2lkID4gMCAmJiBjdXJyZW50X3NmX2lkID4gbG9ja2VkX3NmX2lkKSB7CisJCWF3ZV9yZXNldCgwKTsKKwkJYXdlX3JlbW92ZV9zYW1wbGVzKGN1cnJlbnRfc2ZfaWQgLSAxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGFsbG9jYXRlIHZvaWNlIGluZm8gbGlzdCByZWNvcmRzICovCitzdGF0aWMgYXdlX3ZvaWNlX2xpc3QgKgorYWxsb2NfbmV3X2luZm8odm9pZCkKK3sKKwlhd2Vfdm9pY2VfbGlzdCAqbmV3bGlzdDsKKwkKKwluZXdsaXN0ID0gKGF3ZV92b2ljZV9saXN0ICopa21hbGxvYyhzaXplb2YoKm5ld2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3bGlzdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQVdFMzI6IGNhbid0IGFsbG9jIGluZm8gdGFibGVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG5ld2xpc3Q7Cit9CisKKy8qIGFsbG9jYXRlIHNhbXBsZSBpbmZvIGxpc3QgcmVjb3JkcyAqLworc3RhdGljIGF3ZV9zYW1wbGVfbGlzdCAqCithbGxvY19uZXdfc2FtcGxlKHZvaWQpCit7CisJYXdlX3NhbXBsZV9saXN0ICpuZXdsaXN0OworCQorCW5ld2xpc3QgPSAoYXdlX3NhbXBsZV9saXN0ICopa21hbGxvYyhzaXplb2YoKm5ld2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3bGlzdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQVdFMzI6IGNhbid0IGFsbG9jIHNhbXBsZSB0YWJsZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbmV3bGlzdDsKK30KKworLyogbG9hZCB2b2ljZSBtYXAgKi8KK3N0YXRpYyBpbnQKK2F3ZV9sb2FkX21hcChhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisJYXdlX3ZvaWNlX21hcCBtYXA7CisJYXdlX3ZvaWNlX2xpc3QgKnJlYywgKnA7CisJc2ZfbGlzdCAqc2Y7CisKKwkvKiBnZXQgdGhlIGxpbmsgaW5mbyAqLworCWlmIChjb3VudCA8IHNpemVvZihtYXApKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyIEVycm9yOiBpbnZhbGlkIHBhdGNoIGluZm8gbGVuZ3RoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcigmbWFwLCBhZGRyICsgQVdFX1BBVENIX0lORk9fU0laRSwgc2l6ZW9mKG1hcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwkvKiBjaGVjayBpZiB0aGUgaWRlbnRpY2FsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgKi8KKwlwID0gYXdlX3NlYXJjaF9pbnN0cihtYXAubWFwX2JhbmssIG1hcC5tYXBfaW5zdHIsIG1hcC5tYXBfa2V5KTsKKwlmb3IgKDsgcDsgcCA9IHAtPm5leHRfaW5zdHIpIHsKKwkJaWYgKHAtPnR5cGUgPT0gVl9TVF9NQVBQRUQgJiYKKwkJICAgIHAtPnYuc3RhcnQgPT0gbWFwLnNyY19pbnN0ciAmJgorCQkgICAgcC0+di5lbmQgPT0gbWFwLnNyY19iYW5rICYmCisJCSAgICBwLT52LmZpeGtleSA9PSBtYXAuc3JjX2tleSkKKwkJCXJldHVybiAwOyAvKiBhbHJlYWR5IHByZXNlbnQhICovCisJfQorCisJaWYgKChzZiA9IGNoZWNrX3BhdGNoX29wZW5lZChBV0VfUEFUX1RZUEVfTUFQLCBOVUxMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKHJlYyA9IGFsbG9jX25ld19pbmZvKCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVjLT5iYW5rID0gbWFwLm1hcF9iYW5rOworCXJlYy0+aW5zdHIgPSBtYXAubWFwX2luc3RyOworCXJlYy0+dHlwZSA9IFZfU1RfTUFQUEVEOworCXJlYy0+ZGlzYWJsZWQgPSBGQUxTRTsKKwlhd2VfaW5pdF92b2ljZV9pbmZvKCZyZWMtPnYpOworCWlmIChtYXAubWFwX2tleSA+PSAwKSB7CisJCXJlYy0+di5sb3cgPSBtYXAubWFwX2tleTsKKwkJcmVjLT52LmhpZ2ggPSBtYXAubWFwX2tleTsKKwl9CisJcmVjLT52LnN0YXJ0ID0gbWFwLnNyY19pbnN0cjsKKwlyZWMtPnYuZW5kID0gbWFwLnNyY19iYW5rOworCXJlYy0+di5maXhrZXkgPSBtYXAuc3JjX2tleTsKKwlhZGRfc2ZfaW5mbyhzZiwgcmVjKTsKKwlhZGRfaW5mb19saXN0KHJlYyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKy8qIHByb2JlIHByZXNldCBpbiB0aGUgY3VycmVudCBsaXN0IC0tIG5vdGhpbmcgdG8gYmUgbG9hZGVkICovCitzdGF0aWMgaW50Cithd2VfcHJvYmVfaW5mbyhhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisjaWZkZWYgQVdFX0FMTE9XX1NBTVBMRV9TSEFSSU5HCisJYXdlX3ZvaWNlX21hcCBtYXA7CisJYXdlX3ZvaWNlX2xpc3QgKnA7CisKKwlpZiAoISBwYXRjaF9vcGVuZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZ2V0IHRoZSBsaW5rIGluZm8gKi8KKwlpZiAoY291bnQgPCBzaXplb2YobWFwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMiBFcnJvcjogaW52YWxpZCBwYXRjaCBpbmZvIGxlbmd0aFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJm1hcCwgYWRkciArIEFXRV9QQVRDSF9JTkZPX1NJWkUsIHNpemVvZihtYXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJLyogY2hlY2sgaWYgdGhlIGlkZW50aWNhbCBtYXBwaW5nIGFscmVhZHkgZXhpc3RzICovCisJaWYgKHNmdGFpbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwID0gYXdlX3NlYXJjaF9pbnN0cihtYXAuc3JjX2JhbmssIG1hcC5zcmNfaW5zdHIsIG1hcC5zcmNfa2V5KTsKKwlmb3IgKDsgcDsgcCA9IHAtPm5leHRfaW5zdHIpIHsKKwkJaWYgKHAtPnR5cGUgPT0gVl9TVF9OT1JNQUwgJiYKKwkJICAgIGlzX2lkZW50aWNhbF9ob2xkZXIocC0+aG9sZGVyLCBzZnRhaWwpICYmCisJCSAgICBwLT52LmxvdyA8PSBtYXAuc3JjX2tleSAmJgorCQkgICAgcC0+di5oaWdoID49IG1hcC5zcmNfa2V5KQorCQkJcmV0dXJuIDA7IC8qIGFscmVhZHkgcHJlc2VudCEgKi8KKwl9CisjZW5kaWYgLyogYWxsb3cgc2hhcmluZyAqLworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKKy8qIHByb2JlIHNhbXBsZSBpbiB0aGUgY3VycmVudCBsaXN0IC0tIG5vdGhpbmcgdG8gYmUgbG9hZGVkICovCitzdGF0aWMgaW50Cithd2VfcHJvYmVfZGF0YShhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisjaWZkZWYgQVdFX0FMTE9XX1NBTVBMRV9TSEFSSU5HCisJaWYgKCEgcGF0Y2hfb3BlbmVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHNlYXJjaCB0aGUgc3BlY2lmaWVkIHNhbXBsZSBieSBvcHRhcmcgKi8KKwlpZiAoc2VhcmNoX3NhbXBsZV9pbmRleChzZnRhaWwsIHBhdGNoLT5vcHRhcmcpICE9IE5VTEwpCisJCXJldHVybiAwOworI2VuZGlmIC8qIGFsbG93IHNoYXJpbmcgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCQkKKy8qIHJlbW92ZSB0aGUgcHJlc2VudCBpbnN0cnVtZW50IGxheWVycyAqLworc3RhdGljIGludAorcmVtb3ZlX2luZm8oc2ZfbGlzdCAqc2YsIGludCBiYW5rLCBpbnQgaW5zdHIpCit7CisJYXdlX3ZvaWNlX2xpc3QgKnByZXYsICpuZXh0LCAqcDsKKwlpbnQgcmVtb3ZlZCA9IDA7CisKKwlwcmV2ID0gTlVMTDsKKwlmb3IgKHAgPSBzZi0+aW5mb3M7IHA7IHAgPSBuZXh0KSB7CisJCW5leHQgPSBwLT5uZXh0OworCQlpZiAocC0+dHlwZSA9PSBWX1NUX05PUk1BTCAmJgorCQkgICAgcC0+YmFuayA9PSBiYW5rICYmIHAtPmluc3RyID09IGluc3RyKSB7CisJCQkvKiByZW1vdmUgdGhpcyBsYXllciAqLworCQkJaWYgKHByZXYpCisJCQkJcHJldi0+bmV4dCA9IG5leHQ7CisJCQllbHNlCisJCQkJc2YtPmluZm9zID0gbmV4dDsKKwkJCWlmIChwID09IHNmLT5sYXN0X2luZm9zKQorCQkJCXNmLT5sYXN0X2luZm9zID0gcHJldjsKKwkJCXNmLT5udW1faW5mby0tOworCQkJcmVtb3ZlZCsrOworCQkJa2ZyZWUocCk7CisJCX0gZWxzZQorCQkJcHJldiA9IHA7CisJfQorCWlmIChyZW1vdmVkKQorCQlyZWJ1aWxkX3ByZXNldF9saXN0KCk7CisJcmV0dXJuIHJlbW92ZWQ7Cit9CisKKy8qIGxvYWQgdm9pY2UgaW5mb3JtYXRpb24gZGF0YSAqLworc3RhdGljIGludAorYXdlX2xvYWRfaW5mbyhhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisJaW50IG9mZnNldDsKKwlhd2Vfdm9pY2VfcmVjX2hkciBoZHI7CisJaW50IGk7CisJaW50IHRvdGFsX3NpemU7CisJc2ZfbGlzdCAqc2Y7CisJYXdlX3ZvaWNlX2xpc3QgKnJlYzsKKworCWlmIChjb3VudCA8IEFXRV9WT0lDRV9SRUNfU0laRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMiBFcnJvcjogaW52YWxpZCBwYXRjaCBpbmZvIGxlbmd0aFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9mZnNldCA9IEFXRV9QQVRDSF9JTkZPX1NJWkU7CisJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyKikmaGRyLCBhZGRyICsgb2Zmc2V0LCBBV0VfVk9JQ0VfUkVDX1NJWkUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlvZmZzZXQgKz0gQVdFX1ZPSUNFX1JFQ19TSVpFOworCisJaWYgKGhkci5udm9pY2VzIDw9IDAgfHwgaGRyLm52b2ljZXMgPj0gMTAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyIEVycm9yOiBJbnZhbGlkIHZvaWNlIG51bWJlciAlZFxuIiwgaGRyLm52b2ljZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdG90YWxfc2l6ZSA9IEFXRV9WT0lDRV9SRUNfU0laRSArIEFXRV9WT0lDRV9JTkZPX1NJWkUgKiBoZHIubnZvaWNlczsKKwlpZiAoY291bnQgPCB0b3RhbF9zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyIEVycm9yOiBwYXRjaCBsZW5ndGgoJWQpIGlzIHNtYWxsZXIgdGhhbiBudm9pY2VzKCVkKVxuIiwKKwkJICAgICAgIGNvdW50LCBoZHIubnZvaWNlcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoc2YgPSBjaGVja19wYXRjaF9vcGVuZWQoQVdFX1BBVF9UWVBFX01JU0MsIE5VTEwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAoaGRyLndyaXRlX21vZGUpIHsKKwljYXNlIEFXRV9XUl9FWENMVVNJVkU6CisJCS8qIGV4Y2x1c2l2ZSBtb2RlIC0gaWYgdGhlIGluc3RydW1lbnQgYWxyZWFkeSBleGlzdHMsCisJCSAgIHJldHVybiBlcnJvciAqLworCQlmb3IgKHJlYyA9IHNmLT5pbmZvczsgcmVjOyByZWMgPSByZWMtPm5leHQpIHsKKwkJCWlmIChyZWMtPnR5cGUgPT0gVl9TVF9OT1JNQUwgJiYKKwkJCSAgICByZWMtPmJhbmsgPT0gaGRyLmJhbmsgJiYKKwkJCSAgICByZWMtPmluc3RyID09IGhkci5pbnN0cikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIEFXRV9XUl9SRVBMQUNFOgorCQkvKiByZXBsYWNlIG1vZGUgLSByZW1vdmUgdGhlIGluc3RydW1lbnQgaWYgaXQgYWxyZWFkeSBleGlzdHMgKi8KKwkJcmVtb3ZlX2luZm8oc2YsIGhkci5iYW5rLCBoZHIuaW5zdHIpOworCQlicmVhazsKKwl9CisKKwkvKiBhcHBlbmQgbmV3IGxheWVycyAqLworCWZvciAoaSA9IDA7IGkgPCBoZHIubnZvaWNlczsgaSsrKSB7CisJCXJlYyA9IGFsbG9jX25ld19pbmZvKCk7CisJCWlmIChyZWMgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXJlYy0+YmFuayA9IGhkci5iYW5rOworCQlyZWMtPmluc3RyID0gaGRyLmluc3RyOworCQlyZWMtPnR5cGUgPSBWX1NUX05PUk1BTDsKKwkJcmVjLT5kaXNhYmxlZCA9IEZBTFNFOworCisJCS8qIGNvcHkgYXdlX3ZvaWNlX2luZm8gcGFyYW1ldGVycyAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJlYy0+diwgYWRkciArIG9mZnNldCwgQVdFX1ZPSUNFX0lORk9fU0laRSkpIHsKKwkJCWtmcmVlKHJlYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlvZmZzZXQgKz0gQVdFX1ZPSUNFX0lORk9fU0laRTsKKyNpZmRlZiBBV0VfQUxMT1dfU0FNUExFX1NIQVJJTkcKKwkJaWYgKHNmICYmIHNmLT5zaGFyZWQpIHsKKwkJCWlmIChpbmZvX2R1cGxpY2F0ZWQoc2YsIHJlYykpIHsKKwkJCQlrZnJlZShyZWMpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisjZW5kaWYgLyogYWxsb3cgc2hhcmluZyAqLworCQlpZiAocmVjLT52Lm1vZGUgJiBBV0VfTU9ERV9JTklUX1BBUk0pCisJCQlhd2VfaW5pdF92b2ljZV9wYXJtKCZyZWMtPnYucGFybSk7CisJCWFkZF9zZl9pbmZvKHNmLCByZWMpOworCQlhd2Vfc2V0X3NhbXBsZShyZWMpOworCQlhZGRfaW5mb19saXN0KHJlYyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogcmVtb3ZlIGluc3RydW1lbnQgbGF5ZXJzICovCitzdGF0aWMgaW50Cithd2VfcmVtb3ZlX2luZm8oYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGNoYXIgYmFuaywgaW5zdHI7CisJc2ZfbGlzdCAqc2Y7CisKKwlpZiAoISBwYXRjaF9vcGVuZWQgfHwgKHNmID0gc2Z0YWlsKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyOiByZW1vdmVfaW5mbzogcGF0Y2ggbm90IG9wZW5lZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJhbmsgPSAoKHVuc2lnbmVkIHNob3J0KXBhdGNoLT5vcHRhcmcgPj4gOCkgJiAweGZmOworCWluc3RyID0gKHVuc2lnbmVkIHNob3J0KXBhdGNoLT5vcHRhcmcgJiAweGZmOworCWlmICghIHJlbW92ZV9pbmZvKHNmLCBiYW5rLCBpbnN0cikpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisKKy8qIGxvYWQgd2F2ZSBzYW1wbGUgZGF0YSAqLworc3RhdGljIGludAorYXdlX2xvYWRfZGF0YShhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisJaW50IG9mZnNldCwgc2l6ZTsKKwlpbnQgcmM7CisJYXdlX3NhbXBsZV9pbmZvIHRtcHJlYzsKKwlhd2Vfc2FtcGxlX2xpc3QgKnJlYzsKKwlzZl9saXN0ICpzZjsKKworCWlmICgoc2YgPSBjaGVja19wYXRjaF9vcGVuZWQoQVdFX1BBVF9UWVBFX01JU0MsIE5VTEwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSAoY291bnQgLSBBV0VfU0FNUExFX0lORk9fU0laRSkgLyAyOworCW9mZnNldCA9IEFXRV9QQVRDSF9JTkZPX1NJWkU7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXByZWMsIGFkZHIgKyBvZmZzZXQsIEFXRV9TQU1QTEVfSU5GT19TSVpFKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJb2Zmc2V0ICs9IEFXRV9TQU1QTEVfSU5GT19TSVpFOworCWlmIChzaXplICE9IHRtcHJlYy5zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyOiBsb2FkOiBzYW1wbGUgc2l6ZSBkaWZmZXJlZCAoJWQgIT0gJWQpXG4iLAorCQkgICAgICAgdG1wcmVjLnNpemUsIHNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc2VhcmNoX3NhbXBsZV9pbmRleChzZiwgdG1wcmVjLnNhbXBsZSkgIT0gTlVMTCkgeworI2lmZGVmIEFXRV9BTExPV19TQU1QTEVfU0hBUklORworCQkvKiBpZiBzaGFyZWQgc2FtcGxlLCBza2lwIHRoaXMgZGF0YSAqLworCQlpZiAoc2YtPnR5cGUgJiBBV0VfUEFUX1NIQVJFRCkKKwkJCXJldHVybiAwOworI2VuZGlmIC8qIGFsbG93IHNoYXJpbmcgKi8KKwkJREVCVUcoMSxwcmludGsoIkFXRTMyOiBzYW1wbGUgZGF0YSAlZCBhbHJlYWR5IHByZXNlbnRcbiIsIHRtcHJlYy5zYW1wbGUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChyZWMgPSBhbGxvY19uZXdfc2FtcGxlKCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KCZyZWMtPnYsICZ0bXByZWMsIHNpemVvZih0bXByZWMpKTsKKworCWlmIChyZWMtPnYuc2l6ZSA+IDApIHsKKwkJaWYgKChyYyA9IGF3ZV93cml0ZV93YXZlX2RhdGEoYWRkciwgb2Zmc2V0LCByZWMsIC0xKSkgPCAwKSB7CisJCQlrZnJlZShyZWMpOworCQkJcmV0dXJuIHJjOworCQl9CisJCXNmLT5tZW1fcHRyICs9IHJjOworCX0KKworCWFkZF9zZl9zYW1wbGUoc2YsIHJlYyk7CisJcmV0dXJuIDA7Cit9CisKKworLyogcmVwbGFjZSB3YXZlIHNhbXBsZSBkYXRhICovCitzdGF0aWMgaW50Cithd2VfcmVwbGFjZV9kYXRhKGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCkKK3sKKwlpbnQgb2Zmc2V0OworCWludCBzaXplOworCWludCByYzsKKwlpbnQgY2hhbm5lbHM7CisJYXdlX3NhbXBsZV9pbmZvIGN1cnNtcDsKKwlpbnQgc2F2ZV9tZW1fcHRyOworCXNmX2xpc3QgKnNmOworCWF3ZV9zYW1wbGVfbGlzdCAqcmVjOworCisJaWYgKCEgcGF0Y2hfb3BlbmVkIHx8IChzZiA9IHNmdGFpbCkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMjogcmVwbGFjZTogcGF0Y2ggbm90IG9wZW5lZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNpemUgPSAoY291bnQgLSBBV0VfU0FNUExFX0lORk9fU0laRSkgLyAyOworCW9mZnNldCA9IEFXRV9QQVRDSF9JTkZPX1NJWkU7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdXJzbXAsIGFkZHIgKyBvZmZzZXQsIEFXRV9TQU1QTEVfSU5GT19TSVpFKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJb2Zmc2V0ICs9IEFXRV9TQU1QTEVfSU5GT19TSVpFOworCWlmIChjdXJzbXAuc2l6ZSA9PSAwIHx8IHNpemUgIT0gY3Vyc21wLnNpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzI6IHJlcGxhY2U6IGludmFsaWQgc2FtcGxlIHNpemUgKCVkIT0lZClcbiIsCisJCSAgICAgICBjdXJzbXAuc2l6ZSwgc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljaGFubmVscyA9IHBhdGNoLT5vcHRhcmc7CisJaWYgKGNoYW5uZWxzIDw9IDAgfHwgY2hhbm5lbHMgPiBBV0VfTk9STUFMX1ZPSUNFUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMjogcmVwbGFjZTogaW52YWxpZCBjaGFubmVscyAlZFxuIiwgY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKHJlYyA9IHNmLT5zYW1wbGVzOyByZWM7IHJlYyA9IHJlYy0+bmV4dCkgeworCQlpZiAocmVjLT52LnNhbXBsZSA9PSBjdXJzbXAuc2FtcGxlKQorCQkJYnJlYWs7CisJfQorCWlmIChyZWMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMjogcmVwbGFjZTogY2Fubm90IGZpbmQgZXhpc3Rpbmcgc2FtcGxlIGRhdGEgJWRcbiIsCisJCSAgICAgICBjdXJzbXAuc2FtcGxlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQkKKwlpZiAocmVjLT52LnNpemUgIT0gY3Vyc21wLnNpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzI6IHJlcGxhY2U6IGV4aXRpbmcgc2l6ZSBkaWZmZXJlZCAoJWQhPSVkKVxuIiwKKwkJICAgICAgIHJlYy0+di5zaXplLCBjdXJzbXAuc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNhdmVfbWVtX3B0ciA9IGF3ZV9mcmVlX21lbV9wdHIoKTsKKwlzZnRhaWwtPm1lbV9wdHIgPSByZWMtPnYuc3RhcnQgLSBhd2VfbWVtX3N0YXJ0OworCW1lbWNweSgmcmVjLT52LCAmY3Vyc21wLCBzaXplb2YoY3Vyc21wKSk7CisJcmVjLT52LnNmX2lkID0gY3VycmVudF9zZl9pZDsKKwlpZiAoKHJjID0gYXdlX3dyaXRlX3dhdmVfZGF0YShhZGRyLCBvZmZzZXQsIHJlYywgY2hhbm5lbHMpKSA8IDApCisJCXJldHVybiByYzsKKwlzZnRhaWwtPm1lbV9wdHIgPSBzYXZlX21lbV9wdHI7CisKKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgY2hhciBfX3VzZXIgKnJlYWRidWZfYWRkcjsKK3N0YXRpYyBpbnQgcmVhZGJ1Zl9vZmZzOworc3RhdGljIGludCByZWFkYnVmX2ZsYWdzOworCisvKiBpbml0aWFsaXplIHJlYWQgYnVmZmVyICovCitzdGF0aWMgaW50CityZWFkYnVmX2luaXQoY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBvZmZzZXQsIGF3ZV9zYW1wbGVfaW5mbyAqc3ApCit7CisJcmVhZGJ1Zl9hZGRyID0gYWRkcjsKKwlyZWFkYnVmX29mZnMgPSBvZmZzZXQ7CisJcmVhZGJ1Zl9mbGFncyA9IHNwLT5tb2RlX2ZsYWdzOworCXJldHVybiAwOworfQorCisvKiByZWFkIGRpcmVjdGx5IGZyb20gdXNlciBidWZmZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorcmVhZGJ1Zl93b3JkKGludCBwb3MpCit7CisJdW5zaWduZWQgc2hvcnQgYzsKKwkvKiByZWFkIGZyb20gdXNlciBidWZmZXIgKi8KKwlpZiAocmVhZGJ1Zl9mbGFncyAmIEFXRV9TQU1QTEVfOEJJVFMpIHsKKwkJdW5zaWduZWQgY2hhciBjYzsKKwkJZ2V0X3VzZXIoY2MsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKShyZWFkYnVmX2FkZHIgKyByZWFkYnVmX29mZnMgKyBwb3MpKTsKKwkJYyA9ICh1bnNpZ25lZCBzaG9ydCljYyA8PCA4OyAvKiBjb252ZXJ0IDhiaXQgLT4gMTZiaXQgKi8KKwl9IGVsc2UgeworCQlnZXRfdXNlcihjLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopKHJlYWRidWZfYWRkciArIHJlYWRidWZfb2ZmcyArIHBvcyAqIDIpKTsKKwl9CisJaWYgKHJlYWRidWZfZmxhZ3MgJiBBV0VfU0FNUExFX1VOU0lHTkVEKQorCQljIF49IDB4ODAwMDsgLyogdW5zaWduZWQgLT4gc2lnbmVkICovCisJcmV0dXJuIGM7Cit9CisKKyNkZWZpbmUgcmVhZGJ1Zl93b3JkX2NhY2hlCXJlYWRidWZfd29yZAorI2RlZmluZSByZWFkYnVmX2VuZCgpCQkvKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgQkxBTktfTE9PUF9TVEFSVAk4CisjZGVmaW5lIEJMQU5LX0xPT1BfRU5ECQk0MAorI2RlZmluZSBCTEFOS19MT09QX1NJWkUJCTQ4CisKKy8qIGxvYWRpbmcgb250byBtZW1vcnkgLSByZXR1cm4gdGhlIGFjdHVhbCB3cml0dGVuIHNpemUgKi8KK3N0YXRpYyBpbnQgCithd2Vfd3JpdGVfd2F2ZV9kYXRhKGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgb2Zmc2V0LCBhd2Vfc2FtcGxlX2xpc3QgKmxpc3QsIGludCBjaGFubmVscykKK3sKKwlpbnQgaSwgdHJ1ZXNpemUsIGRyYW1fb2Zmc2V0OworCWF3ZV9zYW1wbGVfaW5mbyAqc3AgPSAmbGlzdC0+djsKKwlpbnQgcmM7CisKKwkvKiBiZSBzdXJlIGxvb3AgcG9pbnRzIHN0YXJ0IDwgZW5kICovCisJaWYgKHNwLT5sb29wc3RhcnQgPiBzcC0+bG9vcGVuZCkgeworCQlpbnQgdG1wID0gc3AtPmxvb3BzdGFydDsKKwkJc3AtPmxvb3BzdGFydCA9IHNwLT5sb29wZW5kOworCQlzcC0+bG9vcGVuZCA9IHRtcDsKKwl9CisKKwkvKiBjb21wdXRlIHRydWUgZGF0YSBzaXplIHRvIGJlIGxvYWRlZCAqLworCXRydWVzaXplID0gc3AtPnNpemU7CisJaWYgKHNwLT5tb2RlX2ZsYWdzICYgKEFXRV9TQU1QTEVfQklESVJfTE9PUHxBV0VfU0FNUExFX1JFVkVSU0VfTE9PUCkpCisJCXRydWVzaXplICs9IHNwLT5sb29wZW5kIC0gc3AtPmxvb3BzdGFydDsKKwlpZiAoc3AtPm1vZGVfZmxhZ3MgJiBBV0VfU0FNUExFX05PX0JMQU5LKQorCQl0cnVlc2l6ZSArPSBCTEFOS19MT09QX1NJWkU7CisJaWYgKGF3ZV9mcmVlX21lbV9wdHIoKSArIHRydWVzaXplID49IG1lbXNpemUvMikgeworCQlERUJVRygtMSxwcmludGsoIkFXRTMyIEVycm9yOiBTYW1wbGUgbWVtb3J5IGZ1bGxcbiIpKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJLyogcmVjYWxjdWxhdGUgYWRkcmVzcyBvZmZzZXQgKi8KKwlzcC0+ZW5kIC09IHNwLT5zdGFydDsKKwlzcC0+bG9vcHN0YXJ0IC09IHNwLT5zdGFydDsKKwlzcC0+bG9vcGVuZCAtPSBzcC0+c3RhcnQ7CisKKwlkcmFtX29mZnNldCA9IGF3ZV9mcmVlX21lbV9wdHIoKSArIGF3ZV9tZW1fc3RhcnQ7CisJc3AtPnN0YXJ0ID0gZHJhbV9vZmZzZXQ7CisJc3AtPmVuZCArPSBkcmFtX29mZnNldDsKKwlzcC0+bG9vcHN0YXJ0ICs9IGRyYW1fb2Zmc2V0OworCXNwLT5sb29wZW5kICs9IGRyYW1fb2Zmc2V0OworCisJLyogc2V0IHRoZSB0b3RhbCBzaXplIChzdG9yZSBvbnRvIG9ic29sZXRlIGNoZWNrc3VtIHZhbHVlKSAqLworCWlmIChzcC0+c2l6ZSA9PSAwKQorCQlzcC0+Y2hlY2tzdW0gPSAwOworCWVsc2UKKwkJc3AtPmNoZWNrc3VtID0gdHJ1ZXNpemU7CisKKwlpZiAoKHJjID0gYXdlX29wZW5fZHJhbV9mb3Jfd3JpdGUoZHJhbV9vZmZzZXQsIGNoYW5uZWxzKSkgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKHJlYWRidWZfaW5pdChhZGRyLCBvZmZzZXQsIHNwKSA8IDApCisJCXJldHVybiAtRU5PU1BDOworCisJZm9yIChpID0gMDsgaSA8IHNwLT5zaXplOyBpKyspIHsKKwkJdW5zaWduZWQgc2hvcnQgYzsKKwkJYyA9IHJlYWRidWZfd29yZChpKTsKKwkJYXdlX3dyaXRlX2RyYW0oYyk7CisJCWlmIChpID09IHNwLT5sb29wZW5kICYmCisJCSAgICAoc3AtPm1vZGVfZmxhZ3MgJiAoQVdFX1NBTVBMRV9CSURJUl9MT09QfEFXRV9TQU1QTEVfUkVWRVJTRV9MT09QKSkpIHsKKwkJCWludCBsb29wbGVuID0gc3AtPmxvb3BlbmQgLSBzcC0+bG9vcHN0YXJ0OworCQkJLyogY29weSByZXZlcnNlIGxvb3AgKi8KKwkJCWludCBrOworCQkJZm9yIChrID0gMTsgayA8PSBsb29wbGVuOyBrKyspIHsKKwkJCQljID0gcmVhZGJ1Zl93b3JkX2NhY2hlKGkgLSBrKTsKKwkJCQlhd2Vfd3JpdGVfZHJhbShjKTsKKwkJCX0KKwkJCWlmIChzcC0+bW9kZV9mbGFncyAmIEFXRV9TQU1QTEVfQklESVJfTE9PUCkgeworCQkJCXNwLT5lbmQgKz0gbG9vcGxlbjsKKwkJCX0gZWxzZSB7CisJCQkJc3AtPnN0YXJ0ICs9IGxvb3BsZW47CisJCQkJc3AtPmVuZCArPSBsb29wbGVuOworCQkJfQorCQl9CisJfQorCXJlYWRidWZfZW5kKCk7CisKKwkvKiBpZiBubyBibGFuayBsb29wIGlzIGF0dGFjaGVkIGluIHRoZSBzYW1wbGUsIGFkZCBpdCAqLworCWlmIChzcC0+bW9kZV9mbGFncyAmIEFXRV9TQU1QTEVfTk9fQkxBTkspIHsKKwkJZm9yIChpID0gMDsgaSA8IEJMQU5LX0xPT1BfU0laRTsgaSsrKQorCQkJYXdlX3dyaXRlX2RyYW0oMCk7CisJCWlmIChzcC0+bW9kZV9mbGFncyAmIEFXRV9TQU1QTEVfU0lOR0xFU0hPVCkgeworCQkJc3AtPmxvb3BzdGFydCA9IHNwLT5lbmQgKyBCTEFOS19MT09QX1NUQVJUOworCQkJc3AtPmxvb3BlbmQgPSBzcC0+ZW5kICsgQkxBTktfTE9PUF9FTkQ7CisJCX0KKwl9CisKKwlhd2VfY2xvc2VfZHJhbSgpOworCisJLyogaW5pdGlhbGl6ZSBGTSAqLworCWF3ZV9pbml0X2ZtKCk7CisKKwlyZXR1cm4gdHJ1ZXNpemU7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkKKworLyogY2FsY3VsYXRlIEdVUyBlbnZlbG9wZSB0aW1lOgorICogaXMgdGhpcyBjb3JyZWN0PyAgaSBoYXZlIG5vIGlkZWEuLgorICovCitzdGF0aWMgaW50CitjYWxjX2d1c19lbnZlbG9wZV90aW1lKGludCByYXRlLCBpbnQgc3RhcnQsIGludCBlbmQpCit7CisJaW50IHIsIHAsIHQ7CisJciA9ICgzIC0gKChyYXRlID4+IDYpICYgMykpICogMzsKKwlwID0gcmF0ZSAmIDB4M2Y7CisJdCA9IGVuZCAtIHN0YXJ0OworCWlmICh0IDwgMCkgdCA9IC10OworCWlmICgxMyA+IHIpCisJCXQgPSB0IDw8ICgxMyAtIHIpOworCWVsc2UKKwkJdCA9IHQgPj4gKHIgLSAxMyk7CisJcmV0dXJuICh0ICogMTApIC8gKHAgKiA0NDEpOworfQorCisjZGVmaW5lIGNhbGNfZ3VzX3N1c3RhaW4odmFsKSAgKDB4N2YgLSB2b2xfdGFibGVbKHZhbCkvMl0pCisjZGVmaW5lIGNhbGNfZ3VzX2F0dGVudWF0aW9uKHZhbCkJdm9sX3RhYmxlWyh2YWwpLzJdCisKKy8qIGxvYWQgR1VTIHBhdGNoICovCitzdGF0aWMgaW50Cithd2VfbG9hZF9ndXNwYXRjaChjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IG9mZnMsIGludCBzaXplLCBpbnQgcG1ncl9mbGFnKQoreworCXN0cnVjdCBwYXRjaF9pbmZvIHBhdGNoOworCWF3ZV92b2ljZV9pbmZvICpyZWM7CisJYXdlX3NhbXBsZV9pbmZvICpzbXA7CisJYXdlX3ZvaWNlX2xpc3QgKnZyZWM7CisJYXdlX3NhbXBsZV9saXN0ICpzbXByZWM7CisJaW50IHNpemVvZl9wYXRjaDsKKwlpbnQgbm90ZSwgcmM7CisJc2ZfbGlzdCAqc2Y7CisKKwlzaXplb2ZfcGF0Y2ggPSAoaW50KSgobG9uZykmcGF0Y2guZGF0YVswXSAtIChsb25nKSZwYXRjaCk7IC8qIGhlYWRlciBzaXplICovCisJaWYgKHNpemUgPCBzaXplb2ZfcGF0Y2gpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IFBhdGNoIGhlYWRlciB0b28gc2hvcnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCgoY2hhciopJnBhdGNoKSArIG9mZnMsIGFkZHIgKyBvZmZzLCBzaXplb2ZfcGF0Y2ggLSBvZmZzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2l6ZSAtPSBzaXplb2ZfcGF0Y2g7CisJaWYgKHNpemUgPCBwYXRjaC5sZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IFBhdGNoIHJlY29yZCB0b28gc2hvcnQgKCVkPCVkKVxuIiwKKwkJICAgICAgIHNpemUsIHBhdGNoLmxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoKHNmID0gY2hlY2tfcGF0Y2hfb3BlbmVkKEFXRV9QQVRfVFlQRV9HVVMsIE5VTEwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoKHNtcHJlYyA9IGFsbG9jX25ld19zYW1wbGUoKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCh2cmVjID0gYWxsb2NfbmV3X2luZm8oKSkgPT0gTlVMTCkgeworCQlrZnJlZShzbXByZWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzbXAgPSAmc21wcmVjLT52OworCXNtcC0+c2FtcGxlID0gc2YtPm51bV9zYW1wbGU7CisJc21wLT5zdGFydCA9IDA7CisJc21wLT5lbmQgPSBwYXRjaC5sZW47CisJc21wLT5sb29wc3RhcnQgPSBwYXRjaC5sb29wX3N0YXJ0OworCXNtcC0+bG9vcGVuZCA9IHBhdGNoLmxvb3BfZW5kOworCXNtcC0+c2l6ZSA9IHBhdGNoLmxlbjsKKworCS8qIHNldCB1cCBtb2RlIGZsYWdzICovCisJc21wLT5tb2RlX2ZsYWdzID0gMDsKKwlpZiAoIShwYXRjaC5tb2RlICYgV0FWRV8xNl9CSVRTKSkKKwkJc21wLT5tb2RlX2ZsYWdzIHw9IEFXRV9TQU1QTEVfOEJJVFM7CisJaWYgKHBhdGNoLm1vZGUgJiBXQVZFX1VOU0lHTkVEKQorCQlzbXAtPm1vZGVfZmxhZ3MgfD0gQVdFX1NBTVBMRV9VTlNJR05FRDsKKwlzbXAtPm1vZGVfZmxhZ3MgfD0gQVdFX1NBTVBMRV9OT19CTEFOSzsKKwlpZiAoIShwYXRjaC5tb2RlICYgKFdBVkVfTE9PUElOR3xXQVZFX0JJRElSX0xPT1B8V0FWRV9MT09QX0JBQ0spKSkKKwkJc21wLT5tb2RlX2ZsYWdzIHw9IEFXRV9TQU1QTEVfU0lOR0xFU0hPVDsKKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfQklESVJfTE9PUCkKKwkJc21wLT5tb2RlX2ZsYWdzIHw9IEFXRV9TQU1QTEVfQklESVJfTE9PUDsKKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfTE9PUF9CQUNLKQorCQlzbXAtPm1vZGVfZmxhZ3MgfD0gQVdFX1NBTVBMRV9SRVZFUlNFX0xPT1A7CisKKwlERUJVRygwLHByaW50aygiQVdFMzI6IFtzYW1wbGUgJWQgbW9kZSAleF1cbiIsIHBhdGNoLmluc3RyX25vLCBzbXAtPm1vZGVfZmxhZ3MpKTsKKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfMTZfQklUUykgeworCQkvKiBjb252ZXJ0IHRvIHdvcmQgb2Zmc2V0cyAqLworCQlzbXAtPnNpemUgLz0gMjsKKwkJc21wLT5lbmQgLz0gMjsKKwkJc21wLT5sb29wc3RhcnQgLz0gMjsKKwkJc21wLT5sb29wZW5kIC89IDI7CisJfQorCXNtcC0+Y2hlY2tzdW1fZmxhZyA9IDA7CisJc21wLT5jaGVja3N1bSA9IDA7CisKKwlpZiAoKHJjID0gYXdlX3dyaXRlX3dhdmVfZGF0YShhZGRyLCBzaXplb2ZfcGF0Y2gsIHNtcHJlYywgLTEpKSA8IDApCisJCXJldHVybiByYzsKKwlzZi0+bWVtX3B0ciArPSByYzsKKwlhZGRfc2Zfc2FtcGxlKHNmLCBzbXByZWMpOworCisJLyogc2V0IHVwIHZvaWNlIGluZm8gKi8KKwlyZWMgPSAmdnJlYy0+djsKKwlhd2VfaW5pdF92b2ljZV9pbmZvKHJlYyk7CisJcmVjLT5zYW1wbGUgPSBzZi0+bnVtX2luZm87IC8qIHRoZSBsYXN0IHNhbXBsZSAqLworCXJlYy0+cmF0ZV9vZmZzZXQgPSBjYWxjX3JhdGVfb2Zmc2V0KHBhdGNoLmJhc2VfZnJlcSk7CisJbm90ZSA9IGZyZXFfdG9fbm90ZShwYXRjaC5iYXNlX25vdGUpOworCXJlYy0+cm9vdCA9IG5vdGUgLyAxMDA7CisJcmVjLT50dW5lID0gLShub3RlICUgMTAwKTsKKwlyZWMtPmxvdyA9IGZyZXFfdG9fbm90ZShwYXRjaC5sb3dfbm90ZSkgLyAxMDA7CisJcmVjLT5oaWdoID0gZnJlcV90b19ub3RlKHBhdGNoLmhpZ2hfbm90ZSkgLyAxMDA7CisJREVCVUcoMSxwcmludGsoIkFXRTMyOiBbZ3VzIGJhc2Ugb2Zmc2V0PSVkLCBub3RlPSVkLCByYW5nZT0lZC0lZCglZC0lZCldXG4iLAorCQkgICAgICAgcmVjLT5yYXRlX29mZnNldCwgbm90ZSwKKwkJICAgICAgIHJlYy0+bG93LCByZWMtPmhpZ2gsCisJICAgICAgcGF0Y2gubG93X25vdGUsIHBhdGNoLmhpZ2hfbm90ZSkpOworCS8qIHBhbm5pbmcgcG9zaXRpb247IC0xMjggLSAxMjcgPT4gMC0xMjcgKi8KKwlyZWMtPnBhbiA9IChwYXRjaC5wYW5uaW5nICsgMTI4KSAvIDI7CisKKwkvKiBkZXR1bmluZyBpcyBpZ25vcmVkICovCisJLyogNnBvaW50cyB2b2x1bWUgZW52ZWxvcGUgKi8KKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfRU5WRUxPUEVTKSB7CisJCWludCBhdHRhY2ssIGhvbGQsIGRlY2F5LCByZWxlYXNlOworCQlhdHRhY2sgPSBjYWxjX2d1c19lbnZlbG9wZV90aW1lCisJCQkocGF0Y2guZW52X3JhdGVbMF0sIDAsIHBhdGNoLmVudl9vZmZzZXRbMF0pOworCQlob2xkID0gY2FsY19ndXNfZW52ZWxvcGVfdGltZQorCQkJKHBhdGNoLmVudl9yYXRlWzFdLCBwYXRjaC5lbnZfb2Zmc2V0WzBdLAorCQkJIHBhdGNoLmVudl9vZmZzZXRbMV0pOworCQlkZWNheSA9IGNhbGNfZ3VzX2VudmVsb3BlX3RpbWUKKwkJCShwYXRjaC5lbnZfcmF0ZVsyXSwgcGF0Y2guZW52X29mZnNldFsxXSwKKwkJCSBwYXRjaC5lbnZfb2Zmc2V0WzJdKTsKKwkJcmVsZWFzZSA9IGNhbGNfZ3VzX2VudmVsb3BlX3RpbWUKKwkJCShwYXRjaC5lbnZfcmF0ZVszXSwgcGF0Y2guZW52X29mZnNldFsxXSwKKwkJCSBwYXRjaC5lbnZfb2Zmc2V0WzRdKTsKKwkJcmVsZWFzZSArPSBjYWxjX2d1c19lbnZlbG9wZV90aW1lCisJCQkocGF0Y2guZW52X3JhdGVbNF0sIHBhdGNoLmVudl9vZmZzZXRbM10sCisJCQkgcGF0Y2guZW52X29mZnNldFs0XSk7CisJCXJlbGVhc2UgKz0gY2FsY19ndXNfZW52ZWxvcGVfdGltZQorCQkJKHBhdGNoLmVudl9yYXRlWzVdLCBwYXRjaC5lbnZfb2Zmc2V0WzRdLAorCQkJIHBhdGNoLmVudl9vZmZzZXRbNV0pOworCQlyZWMtPnBhcm0udm9sYXRraGxkID0gKGNhbGNfcGFybV9ob2xkKGhvbGQpIDw8IDgpIHwKKwkJCWNhbGNfcGFybV9hdHRhY2soYXR0YWNrKTsKKwkJcmVjLT5wYXJtLnZvbGRjeXN1cyA9IChjYWxjX2d1c19zdXN0YWluKHBhdGNoLmVudl9vZmZzZXRbMl0pIDw8IDgpIHwKKwkJCWNhbGNfcGFybV9kZWNheShkZWNheSk7CisJCXJlYy0+cGFybS52b2xyZWxlYXNlID0gMHg4MDAwIHwgY2FsY19wYXJtX2RlY2F5KHJlbGVhc2UpOworCQlERUJVRygyLHByaW50aygiQVdFMzI6IFtndXNlbnYgYXRrPSVkLCBobGQ9JWQsIGRjeT0lZCwgcmVsPSVkXVxuIiwgYXR0YWNrLCBob2xkLCBkZWNheSwgcmVsZWFzZSkpOworCQlyZWMtPmF0dGVudWF0aW9uID0gY2FsY19ndXNfYXR0ZW51YXRpb24ocGF0Y2guZW52X29mZnNldFswXSk7CisJfQorCisJLyogdHJlbW9sbyBlZmZlY3QgKi8KKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfVFJFTU9MTykgeworCQlpbnQgcmF0ZSA9IChwYXRjaC50cmVtb2xvX3JhdGUgKiAxMDAwIC8gMzgpIC8gNDI7CisJCXJlYy0+cGFybS50cmVtZnJxID0gKChwYXRjaC50cmVtb2xvX2RlcHRoIC8gMikgPDwgOCkgfCByYXRlOworCQlERUJVRygyLHByaW50aygiQVdFMzI6IFtndXNlbnYgdHJlbW9sbyByYXRlPSVkLCBkZXA9JWQsIHRyZW1mcnE9JXhdXG4iLAorCQkJICAgICAgIHBhdGNoLnRyZW1vbG9fcmF0ZSwgcGF0Y2gudHJlbW9sb19kZXB0aCwKKwkJCSAgICAgICByZWMtPnBhcm0udHJlbWZycSkpOworCX0KKwkvKiB2aWJyYXRvIGVmZmVjdCAqLworCWlmIChwYXRjaC5tb2RlICYgV0FWRV9WSUJSQVRPKSB7CisJCWludCByYXRlID0gKHBhdGNoLnZpYnJhdG9fcmF0ZSAqIDEwMDAgLyAzOCkgLyA0MjsKKwkJcmVjLT5wYXJtLmZtMmZycTIgPSAoKHBhdGNoLnZpYnJhdG9fZGVwdGggLyA2KSA8PCA4KSB8IHJhdGU7CisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW2d1c2VudiB2aWJyYXRvIHJhdGU9JWQsIGRlcD0lZCwgdHJlbWZycT0leF1cbiIsCisJCQkgICAgICAgcGF0Y2gudHJlbW9sb19yYXRlLCBwYXRjaC50cmVtb2xvX2RlcHRoLAorCQkJICAgICAgIHJlYy0+cGFybS50cmVtZnJxKSk7CisJfQorCQorCS8qIHNjYWxlX2ZyZXEsIHNjYWxlX2ZhY3Rvciwgdm9sdW1lLCBhbmQgZnJhY3Rpb25zIG5vdCBpbXBsZW1lbnRlZCAqLworCisJLyogYXBwZW5kIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0ICovCisJdnJlYy0+YmFuayA9IGN0cmxzW0FXRV9NRF9HVVNfQkFOS107CisJdnJlYy0+aW5zdHIgPSBwYXRjaC5pbnN0cl9ubzsKKwl2cmVjLT5kaXNhYmxlZCA9IEZBTFNFOworCXZyZWMtPnR5cGUgPSBWX1NUX05PUk1BTDsKKworCWFkZF9zZl9pbmZvKHNmLCB2cmVjKTsKKwlhZGRfaW5mb19saXN0KHZyZWMpOworCisJLyogc2V0IHRoZSB2b2ljZSBpbmRleCAqLworCWF3ZV9zZXRfc2FtcGxlKHZyZWMpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLyogQVdFX0hBU19HVVNfQ09NUEFUSUJJTElUWSAqLworCisvKgorICogc2FtcGxlIGFuZCB2b2ljZSBsaXN0IGhhbmRsZXJzCisgKi8KKworLyogYXBwZW5kIHRoaXMgdG8gdGhlIGN1cnJlbnQgc2YgbGlzdCAqLworc3RhdGljIHZvaWQgYWRkX3NmX2luZm8oc2ZfbGlzdCAqc2YsIGF3ZV92b2ljZV9saXN0ICpyZWMpCit7CisJaWYgKHNmID09IE5VTEwpCisJCXJldHVybjsKKwlyZWMtPmhvbGRlciA9IHNmOworCXJlYy0+di5zZl9pZCA9IHNmLT5zZl9pZDsKKwlpZiAoc2YtPmxhc3RfaW5mb3MpCisJCXNmLT5sYXN0X2luZm9zLT5uZXh0ID0gcmVjOworCWVsc2UKKwkJc2YtPmluZm9zID0gcmVjOworCXNmLT5sYXN0X2luZm9zID0gcmVjOworCXJlYy0+bmV4dCA9IE5VTEw7CisJc2YtPm51bV9pbmZvKys7Cit9CisKKy8qIHByZXBlbmQgdGhpcyBzYW1wbGUgdG8gc2YgbGlzdCAqLworc3RhdGljIHZvaWQgYWRkX3NmX3NhbXBsZShzZl9saXN0ICpzZiwgYXdlX3NhbXBsZV9saXN0ICpyZWMpCit7CisJaWYgKHNmID09IE5VTEwpCisJCXJldHVybjsKKwlyZWMtPmhvbGRlciA9IHNmOworCXJlYy0+di5zZl9pZCA9IHNmLT5zZl9pZDsKKwlpZiAoc2YtPmxhc3Rfc2FtcGxlcykKKwkJc2YtPmxhc3Rfc2FtcGxlcy0+bmV4dCA9IHJlYzsKKwllbHNlCisJCXNmLT5zYW1wbGVzID0gcmVjOworCXNmLT5sYXN0X3NhbXBsZXMgPSByZWM7CisJcmVjLT5uZXh0ID0gTlVMTDsKKwlzZi0+bnVtX3NhbXBsZSsrOworfQorCisvKiBwdXJnZSB0aGUgb2xkIHJlY29yZHMgd2hpY2ggZG9uJ3QgYmVsb25nIHdpdGggdGhlIHNhbWUgZmlsZSBpZCAqLworc3RhdGljIHZvaWQgcHVyZ2Vfb2xkX2xpc3QoYXdlX3ZvaWNlX2xpc3QgKnJlYywgYXdlX3ZvaWNlX2xpc3QgKm5leHQpCit7CisJcmVjLT5uZXh0X2luc3RyID0gbmV4dDsKKwlpZiAocmVjLT5iYW5rID09IEFXRV9EUlVNX0JBTkspIHsKKwkJLyogcmVtb3ZlIHNhbXBsZXMgd2l0aCB0aGUgc2FtZSBub3RlIHJhbmdlICovCisJCWF3ZV92b2ljZV9saXN0ICpjdXIsICpwcmV2ID0gcmVjOworCQlpbnQgbG93ID0gcmVjLT52LmxvdzsKKwkJaW50IGhpZ2ggPSByZWMtPnYuaGlnaDsKKwkJZm9yIChjdXIgPSBuZXh0OyBjdXI7IGN1ciA9IGN1ci0+bmV4dF9pbnN0cikgeworCQkJaWYgKGN1ci0+di5sb3cgPT0gbG93ICYmCisJCQkgICAgY3VyLT52LmhpZ2ggPT0gaGlnaCAmJgorCQkJICAgICEgaXNfaWRlbnRpY2FsX2hvbGRlcihjdXItPmhvbGRlciwgcmVjLT5ob2xkZXIpKQorCQkJCXByZXYtPm5leHRfaW5zdHIgPSBjdXItPm5leHRfaW5zdHI7CisJCQllbHNlCisJCQkJcHJldiA9IGN1cjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghIGlzX2lkZW50aWNhbF9ob2xkZXIobmV4dC0+aG9sZGVyLCByZWMtPmhvbGRlcikpCisJCQkvKiByZW1vdmUgYWxsIHNhbXBsZXMgKi8KKwkJCXJlYy0+bmV4dF9pbnN0ciA9IE5VTEw7CisJfQorfQorCisvKiBwcmVwZW5kIHRvIHRvcCBvZiB0aGUgcHJlc2V0IHRhYmxlICovCitzdGF0aWMgdm9pZCBhZGRfaW5mb19saXN0KGF3ZV92b2ljZV9saXN0ICpyZWMpCit7CisJYXdlX3ZvaWNlX2xpc3QgKnByZXYsICpjdXI7CisJaW50IGtleTsKKworCWlmIChyZWMtPmRpc2FibGVkKQorCQlyZXR1cm47CisKKwlrZXkgPSBhd2Vfc2VhcmNoX2tleShyZWMtPmJhbmssIHJlYy0+aW5zdHIsIHJlYy0+di5sb3cpOworCXByZXYgPSBOVUxMOworCWZvciAoY3VyID0gcHJlc2V0X3RhYmxlW2tleV07IGN1cjsgY3VyID0gY3VyLT5uZXh0X2JhbmspIHsKKwkJLyogc2VhcmNoIHRoZSBmaXJzdCByZWNvcmQgd2l0aCB0aGUgc2FtZSBiYW5rIG51bWJlciAqLworCQlpZiAoY3VyLT5pbnN0ciA9PSByZWMtPmluc3RyICYmIGN1ci0+YmFuayA9PSByZWMtPmJhbmspIHsKKwkJCS8qIHJlcGxhY2UgdGhlIGxpc3Qgd2l0aCB0aGUgbmV3IHJlY29yZCAqLworCQkJcmVjLT5uZXh0X2JhbmsgPSBjdXItPm5leHRfYmFuazsKKwkJCWlmIChwcmV2KQorCQkJCXByZXYtPm5leHRfYmFuayA9IHJlYzsKKwkJCWVsc2UKKwkJCQlwcmVzZXRfdGFibGVba2V5XSA9IHJlYzsKKwkJCXB1cmdlX29sZF9saXN0KHJlYywgY3VyKTsKKwkJCXJldHVybjsKKwkJfQorCQlwcmV2ID0gY3VyOworCX0KKworCS8qIHRoaXMgaXMgdGhlIGZpcnN0IGJhbmsgcmVjb3JkLi4ganVzdCBhZGQgdGhpcyAqLworCXJlYy0+bmV4dF9pbnN0ciA9IE5VTEw7CisJcmVjLT5uZXh0X2JhbmsgPSBwcmVzZXRfdGFibGVba2V5XTsKKwlwcmVzZXRfdGFibGVba2V5XSA9IHJlYzsKK30KKworLyogcmVtb3ZlIHNhbXBsZXMgbGF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHNmX2lkICovCitzdGF0aWMgdm9pZAorYXdlX3JlbW92ZV9zYW1wbGVzKGludCBzZl9pZCkKK3sKKwlzZl9saXN0ICpwLCAqcHJldjsKKworCWlmIChzZl9pZCA8PSAwKSB7CisJCWF3ZV9yZXNldF9zYW1wbGVzKCk7CisJCXJldHVybjsKKwl9CisJLyogYWxyZWFkeSByZW1vdmVkPyAqLworCWlmIChjdXJyZW50X3NmX2lkIDw9IHNmX2lkKQorCQlyZXR1cm47CisKKwlmb3IgKHAgPSBzZnRhaWw7IHA7IHAgPSBwcmV2KSB7CisJCWlmIChwLT5zZl9pZCA8PSBzZl9pZCkKKwkJCWJyZWFrOworCQlwcmV2ID0gcC0+cHJldjsKKwkJYXdlX2ZyZWVfc2YocCk7CisJfQorCXNmdGFpbCA9IHA7CisJaWYgKHNmdGFpbCkgeworCQlzZl9pZCA9IHNmdGFpbC0+c2ZfaWQ7CisJCXNmdGFpbC0+bmV4dCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJc2ZfaWQgPSAwOworCQlzZmhlYWQgPSBOVUxMOworCX0KKwljdXJyZW50X3NmX2lkID0gc2ZfaWQ7CisJaWYgKGxvY2tlZF9zZl9pZCA+IHNmX2lkKQorCQlsb2NrZWRfc2ZfaWQgPSBzZl9pZDsKKworCXJlYnVpbGRfcHJlc2V0X2xpc3QoKTsKK30KKworLyogcmVidWlsZCBwcmVzZXQgc2VhcmNoIGxpc3QgKi8KK3N0YXRpYyB2b2lkIHJlYnVpbGRfcHJlc2V0X2xpc3Qodm9pZCkKK3sKKwlzZl9saXN0ICpwOworCWF3ZV92b2ljZV9saXN0ICpyZWM7CisKKwltZW1zZXQocHJlc2V0X3RhYmxlLCAwLCBzaXplb2YocHJlc2V0X3RhYmxlKSk7CisKKwlmb3IgKHAgPSBzZmhlYWQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWZvciAocmVjID0gcC0+aW5mb3M7IHJlYzsgcmVjID0gcmVjLT5uZXh0KQorCQkJYWRkX2luZm9fbGlzdChyZWMpOworCX0KK30KKworLyogY29tcGFyZSB0aGUgZ2l2ZW4gc2ZfaWQgcGFpciAqLworc3RhdGljIGludCBpc19pZGVudGljYWxfaG9sZGVyKHNmX2xpc3QgKnNmMSwgc2ZfbGlzdCAqc2YyKQoreworCWlmIChzZjEgPT0gTlVMTCB8fCBzZjIgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCWlmIChzZjEgPT0gc2YyKQorCQlyZXR1cm4gVFJVRTsKKyNpZmRlZiBBV0VfQUxMT1dfU0FNUExFX1NIQVJJTkcKKwl7CisJCS8qIGNvbXBhcmUgd2l0aCB0aGUgc2hhcmluZyBpZCAqLworCQlzZl9saXN0ICpwOworCQlpbnQgY291bnRlciA9IDA7CisJCWlmIChzZjEtPnNmX2lkIDwgc2YyLT5zZl9pZCkgeyAvKiBtYWtlIHN1cmUgaWQxID4gaWQyICovCisJCQlzZl9saXN0ICp0bXA7IHRtcCA9IHNmMTsgc2YxID0gc2YyOyBzZjIgPSB0bXA7CisJCX0KKwkJZm9yIChwID0gc2YxLT5zaGFyZWQ7IHA7IHAgPSBwLT5zaGFyZWQpIHsKKwkJCWlmIChjb3VudGVyKysgPiBjdXJyZW50X3NmX2lkKQorCQkJCWJyZWFrOyAvKiBzdHJhbmdlIHNoYXJpbmcgbG9vcC4uIHF1aXQgKi8KKwkJCWlmIChwID09IHNmMikKKwkJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKyNlbmRpZiAvKiBhbGxvdyBzaGFyaW5nICovCisJcmV0dXJuIEZBTFNFOworfQorCisvKiBzZWFyY2ggdGhlIHNhbXBsZSBpbmRleCBtYXRjaGluZyB3aXRoIHRoZSBnaXZlbiBzYW1wbGUgaWQgKi8KK3N0YXRpYyBhd2Vfc2FtcGxlX2xpc3QgKgorc2VhcmNoX3NhbXBsZV9pbmRleChzZl9saXN0ICpzZiwgaW50IHNhbXBsZSkKK3sKKwlhd2Vfc2FtcGxlX2xpc3QgKnA7CisjaWZkZWYgQVdFX0FMTE9XX1NBTVBMRV9TSEFSSU5HCisJaW50IGNvdW50ZXIgPSAwOworCXdoaWxlIChzZikgeworCQlmb3IgKHAgPSBzZi0+c2FtcGxlczsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCWlmIChwLT52LnNhbXBsZSA9PSBzYW1wbGUpCisJCQkJcmV0dXJuIHA7CisJCX0KKwkJc2YgPSBzZi0+c2hhcmVkOworCQlpZiAoY291bnRlcisrID4gY3VycmVudF9zZl9pZCkKKwkJCWJyZWFrOyAvKiBzdHJhbmdlIHNoYXJpbmcgbG9vcC4uIHF1aXQgKi8KKwl9CisjZWxzZQorCWlmIChzZikgeworCQlmb3IgKHAgPSBzZi0+c2FtcGxlczsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCWlmIChwLT52LnNhbXBsZSA9PSBzYW1wbGUpCisJCQkJcmV0dXJuIHA7CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm4gTlVMTDsKK30KKworLyogc2VhcmNoIHRoZSBzcGVjaWZpZWQgc2FtcGxlICovCisvKiBub24temVybyA9IGZvdW5kICovCitzdGF0aWMgc2hvcnQKK2F3ZV9zZXRfc2FtcGxlKGF3ZV92b2ljZV9saXN0ICpyZWMpCit7CisJYXdlX3NhbXBsZV9saXN0ICpzbXA7CisJYXdlX3ZvaWNlX2luZm8gKnZwID0gJnJlYy0+djsKKworCXZwLT5pbmRleCA9IDA7CisJaWYgKChzbXAgPSBzZWFyY2hfc2FtcGxlX2luZGV4KHJlYy0+aG9sZGVyLCB2cC0+c2FtcGxlKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBzZXQgdGhlIGFjdHVhbCBzYW1wbGUgb2Zmc2V0cyAqLworCXZwLT5zdGFydCArPSBzbXAtPnYuc3RhcnQ7CisJdnAtPmVuZCArPSBzbXAtPnYuZW5kOworCXZwLT5sb29wc3RhcnQgKz0gc21wLT52Lmxvb3BzdGFydDsKKwl2cC0+bG9vcGVuZCArPSBzbXAtPnYubG9vcGVuZDsKKwkvKiBjb3B5IG1vZGUgZmxhZ3MgKi8KKwl2cC0+bW9kZSA9IHNtcC0+di5tb2RlX2ZsYWdzOworCS8qIHNldCBmbGFnICovCisJdnAtPmluZGV4ID0gMTsKKworCXJldHVybiAxOworfQorCisKKy8qCisgKiB2b2ljZSBhbGxvY2F0aW9uCisgKi8KKworLyogbG9vayBmb3IgYWxsIHZvaWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBub3RlICYgdmVsb2NpdHkgKi8KK3N0YXRpYyBpbnQKK2F3ZV9zZWFyY2hfbXVsdGlfdm9pY2VzKGF3ZV92b2ljZV9saXN0ICpyZWMsIGludCBub3RlLCBpbnQgdmVsb2NpdHksCisJCQlhd2Vfdm9pY2VfaW5mbyAqKnZsaXN0KQoreworCWludCBudm9pY2VzOworCisJbnZvaWNlcyA9IDA7CisJZm9yICg7IHJlYzsgcmVjID0gcmVjLT5uZXh0X2luc3RyKSB7CisJCWlmIChub3RlID49IHJlYy0+di5sb3cgJiYKKwkJICAgIG5vdGUgPD0gcmVjLT52LmhpZ2ggJiYKKwkJICAgIHZlbG9jaXR5ID49IHJlYy0+di52ZWxsb3cgJiYKKwkJICAgIHZlbG9jaXR5IDw9IHJlYy0+di52ZWxoaWdoKSB7CisJCQlpZiAocmVjLT50eXBlID09IFZfU1RfTUFQUEVEKSB7CisJCQkJLyogbWFwcGVyICovCisJCQkJdmxpc3RbMF0gPSAmcmVjLT52OworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXZsaXN0W252b2ljZXMrK10gPSAmcmVjLT52OworCQkJaWYgKG52b2ljZXMgPj0gQVdFX01BWF9WT0lDRVMpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIG52b2ljZXM7CQorfQorCisvKiBzdG9yZSB0aGUgdm9pY2UgbGlzdCBmcm9tIHRoZSBzcGVjaWZpZWQgbm90ZSBhbmQgdmVsb2NpdHkuCisgICBpZiB0aGUgcHJlc2V0IGlzIG1hcHBlZCwgc2VlayBmb3IgdGhlIGRlc3RpbmF0aW9uIHByZXNldCwgYW5kIHJld3JpdGUKKyAgIHRoZSBub3RlIG51bWJlciBpZiBuZWNlc3NhcnkuCisgICAqLworc3RhdGljIGludAorcmVhbGx5X2FsbG9jX3ZvaWNlcyhpbnQgYmFuaywgaW50IGluc3RyLCBpbnQgKm5vdGUsIGludCB2ZWxvY2l0eSwgYXdlX3ZvaWNlX2luZm8gKip2bGlzdCkKK3sKKwlpbnQgbnZvaWNlczsKKwlhd2Vfdm9pY2VfbGlzdCAqdnJlYzsKKwlpbnQgbGV2ZWwgPSAwOworCisJZm9yICg7OykgeworCQl2cmVjID0gYXdlX3NlYXJjaF9pbnN0cihiYW5rLCBpbnN0ciwgKm5vdGUpOworCQludm9pY2VzID0gYXdlX3NlYXJjaF9tdWx0aV92b2ljZXModnJlYywgKm5vdGUsIHZlbG9jaXR5LCB2bGlzdCk7CisJCWlmIChudm9pY2VzID09IDApIHsKKwkJCWlmIChiYW5rID09IEFXRV9EUlVNX0JBTkspCisJCQkJLyogc2VhcmNoIGRlZmF1bHQgZHJ1bXNldCAqLworCQkJCXZyZWMgPSBhd2Vfc2VhcmNoX2luc3RyKGJhbmssIGN0cmxzW0FXRV9NRF9ERUZfRFJVTV0sICpub3RlKTsKKwkJCWVsc2UKKwkJCQkvKiBzZWFyY2ggZGVmYXVsdCBwcmVzZXQgKi8KKwkJCQl2cmVjID0gYXdlX3NlYXJjaF9pbnN0cihjdHJsc1tBV0VfTURfREVGX0JBTktdLCBpbnN0ciwgKm5vdGUpOworCQkJbnZvaWNlcyA9IGF3ZV9zZWFyY2hfbXVsdGlfdm9pY2VzKHZyZWMsICpub3RlLCB2ZWxvY2l0eSwgdmxpc3QpOworCQl9CisJCWlmIChudm9pY2VzID09IDApIHsKKwkJCWlmIChiYW5rID09IEFXRV9EUlVNX0JBTksgJiYgY3RybHNbQVdFX01EX0RFRl9EUlVNXSAhPSAwKQorCQkJCS8qIHNlYXJjaCBkZWZhdWx0IGRydW1zZXQgKi8KKwkJCQl2cmVjID0gYXdlX3NlYXJjaF9pbnN0cihiYW5rLCAwLCAqbm90ZSk7CisJCQllbHNlIGlmIChiYW5rICE9IEFXRV9EUlVNX0JBTksgJiYgY3RybHNbQVdFX01EX0RFRl9CQU5LXSAhPSAwKQorCQkJCS8qIHNlYXJjaCBkZWZhdWx0IHByZXNldCAqLworCQkJCXZyZWMgPSBhd2Vfc2VhcmNoX2luc3RyKDAsIGluc3RyLCAqbm90ZSk7CisJCQludm9pY2VzID0gYXdlX3NlYXJjaF9tdWx0aV92b2ljZXModnJlYywgKm5vdGUsIHZlbG9jaXR5LCB2bGlzdCk7CisJCX0KKwkJaWYgKG52b2ljZXMgPCAwKSB7IC8qIG1hcHBpbmcgKi8KKwkJCWludCBrZXkgPSB2bGlzdFswXS0+Zml4a2V5OworCQkJaW5zdHIgPSB2bGlzdFswXS0+c3RhcnQ7CisJCQliYW5rID0gdmxpc3RbMF0tPmVuZDsKKwkJCWlmIChsZXZlbCsrID4gNSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiQVdFMzI6IHRvbyBkZWVwIG1hcHBpbmcgbGV2ZWxcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKGtleSA+PSAwKQorCQkJCSpub3RlID0ga2V5OworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBudm9pY2VzOworfQorCisvKiBhbGxvY2F0ZSB2b2ljZXMgY29ycmVzcG9uZGluZyBub3RlIGFuZCB2ZWxvY2l0eTsgc3VwcG9ydHMgbXVsdGlwbGUgaW5zdHMuICovCitzdGF0aWMgdm9pZAorYXdlX2FsbG9jX211bHRpX3ZvaWNlcyhpbnQgY2gsIGludCBub3RlLCBpbnQgdmVsb2NpdHksIGludCBrZXkpCit7CisJaW50IGksIHYsIG52b2ljZXMsIGJhbms7CisJYXdlX3ZvaWNlX2luZm8gKnZsaXN0W0FXRV9NQVhfVk9JQ0VTXTsKKworCWlmIChNVUxUSV9MQVlFUl9NT0RFKCkgJiYgSVNfRFJVTV9DSEFOTkVMKGNoKSkKKwkJYmFuayA9IEFXRV9EUlVNX0JBTks7IC8qIGFsd2F5cyBzZWFyY2ggZHJ1bXNldCAqLworCWVsc2UKKwkJYmFuayA9IGNoYW5uZWxzW2NoXS5iYW5rOworCisJLyogY2hlY2sgdGhlIHBvc3NpYmxlIHZvaWNlczsgbm90ZSBtYXkgYmUgY2hhbmdlYWJsZSBpZiBtYXBwZWQgKi8KKwludm9pY2VzID0gcmVhbGx5X2FsbG9jX3ZvaWNlcyhiYW5rLCBjaGFubmVsc1tjaF0uaW5zdHIsCisJCQkJICAgICAgJm5vdGUsIHZlbG9jaXR5LCB2bGlzdCk7CisKKwkvKiBzZXQgdGhlIHZvaWNlcyAqLworCWN1cnJlbnRfYWxsb2NfdGltZSsrOworCWZvciAoaSA9IDA7IGkgPCBudm9pY2VzOyBpKyspIHsKKwkJdiA9IGF3ZV9jbGVhcl92b2ljZSgpOworCQl2b2ljZXNbdl0ua2V5ID0ga2V5OworCQl2b2ljZXNbdl0uY2ggPSBjaDsKKwkJdm9pY2VzW3ZdLm5vdGUgPSBub3RlOworCQl2b2ljZXNbdl0udmVsb2NpdHkgPSB2ZWxvY2l0eTsKKwkJdm9pY2VzW3ZdLnRpbWUgPSBjdXJyZW50X2FsbG9jX3RpbWU7CisJCXZvaWNlc1t2XS5jaW5mbyA9ICZjaGFubmVsc1tjaF07CisJCXZvaWNlc1t2XS5zYW1wbGUgPSB2bGlzdFtpXTsKKwkJdm9pY2VzW3ZdLnN0YXRlID0gQVdFX1NUX01BUks7CisJCXZvaWNlc1t2XS5sYXllciA9IG52b2ljZXMgLSBpIC0gMTsgIC8qIGluIHJldmVyc2Ugb3JkZXIgKi8KKwl9CisKKwkvKiBjbGVhciB0aGUgbWFyayBpbiBhbGxvY2F0ZWQgdm9pY2VzICovCisJZm9yIChpID0gMDsgaSA8IGF3ZV9tYXhfdm9pY2VzOyBpKyspIHsKKwkJaWYgKHZvaWNlc1tpXS5zdGF0ZSA9PSBBV0VfU1RfTUFSSykKKwkJCXZvaWNlc1tpXS5zdGF0ZSA9IEFXRV9TVF9PRkY7CisJCQkKKwl9Cit9CisKKworLyogc2VhcmNoIGFuIGVtcHR5IHZvaWNlLgorICAgaWYgbm8gZW1wdHkgdm9pY2UgaXMgZm91bmQsIGF0IGxlYXN0IHRlcm1pbmF0ZSBhIHZvaWNlCisgICAqLworc3RhdGljIGludAorYXdlX2NsZWFyX3ZvaWNlKHZvaWQpCit7CisJZW51bSB7CisJCU9GRj0wLCBSRUxFQVNFRCwgU1VTVEFJTkVELCBQTEFZSU5HLCBFTkQKKwl9OworCXN0cnVjdCB2b2ljZV9jYW5kaWRhdGVfdCB7CisJCWludCBiZXN0OworCQlpbnQgdGltZTsKKwkJaW50IHZ0YXJnZXQ7CisJfSBjYW5kaWRhdGVbRU5EXTsKKwlpbnQgaSwgdHlwZSwgdnRhcmdldDsKKworCXZ0YXJnZXQgPSAweGZmZmY7CisJZm9yICh0eXBlID0gT0ZGOyB0eXBlIDwgRU5EOyB0eXBlKyspIHsKKwkJY2FuZGlkYXRlW3R5cGVdLmJlc3QgPSAtMTsKKwkJY2FuZGlkYXRlW3R5cGVdLnRpbWUgPSBjdXJyZW50X2FsbG9jX3RpbWUgKyAxOworCQljYW5kaWRhdGVbdHlwZV0udnRhcmdldCA9IHZ0YXJnZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGF3ZV9tYXhfdm9pY2VzOyBpKyspIHsKKwkJaWYgKHZvaWNlc1tpXS5zdGF0ZSAmIEFXRV9TVF9PRkYpCisJCQl0eXBlID0gT0ZGOworCQllbHNlIGlmICh2b2ljZXNbaV0uc3RhdGUgJiBBV0VfU1RfUkVMRUFTRUQpCisJCQl0eXBlID0gUkVMRUFTRUQ7CisJCWVsc2UgaWYgKHZvaWNlc1tpXS5zdGF0ZSAmIEFXRV9TVF9TVVNUQUlORUQpCisJCQl0eXBlID0gU1VTVEFJTkVEOworCQllbHNlIGlmICh2b2ljZXNbaV0uc3RhdGUgJiB+QVdFX1NUX01BUkspCisJCQl0eXBlID0gUExBWUlORzsKKwkJZWxzZQorCQkJY29udGludWU7CisjaWZkZWYgQVdFX0NIRUNLX1ZUQVJHRVQKKwkJLyogZ2V0IGN1cnJlbnQgdm9sdW1lICovCisJCXZ0YXJnZXQgPSAoYXdlX3BlZWtfZHcoQVdFX1ZURlQoaSkpID4+IDE2KSAmIDB4ZmZmZjsKKyNlbmRpZgorCQlpZiAoY2FuZGlkYXRlW3R5cGVdLmJlc3QgPCAwIHx8CisJCSAgICB2dGFyZ2V0IDwgY2FuZGlkYXRlW3R5cGVdLnZ0YXJnZXQgfHwKKwkJICAgICh2dGFyZ2V0ID09IGNhbmRpZGF0ZVt0eXBlXS52dGFyZ2V0ICYmCisJCSAgICAgdm9pY2VzW2ldLnRpbWUgPCBjYW5kaWRhdGVbdHlwZV0udGltZSkpIHsKKwkJCWNhbmRpZGF0ZVt0eXBlXS5iZXN0ID0gaTsKKwkJCWNhbmRpZGF0ZVt0eXBlXS50aW1lID0gdm9pY2VzW2ldLnRpbWU7CisJCQljYW5kaWRhdGVbdHlwZV0udnRhcmdldCA9IHZ0YXJnZXQ7CisJCX0KKwl9CisKKwlmb3IgKHR5cGUgPSBPRkY7IHR5cGUgPCBFTkQ7IHR5cGUrKykgeworCQlpZiAoKGkgPSBjYW5kaWRhdGVbdHlwZV0uYmVzdCkgPj0gMCkgeworCQkJaWYgKHZvaWNlc1tpXS5zdGF0ZSAhPSBBV0VfU1RfT0ZGKQorCQkJCWF3ZV90ZXJtaW5hdGUoaSk7CisJCQlhd2Vfdm9pY2VfaW5pdChpLCBUUlVFKTsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKy8qIHNlYXJjaCBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgbm90ZSAmIHZlbG9jaXR5IGFuZCBzZXQgaXQgb24gdGhlIHZvaWNlOworICogbm90ZSB0aGF0IHZvaWNlIGlzIHRoZSB2b2ljZSBpbmRleCAobm90IGNoYW5uZWwgaW5kZXgpCisgKi8KK3N0YXRpYyB2b2lkCithd2VfYWxsb2Nfb25lX3ZvaWNlKGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSkKK3sKKwlpbnQgY2gsIG52b2ljZXMsIGJhbms7CisJYXdlX3ZvaWNlX2luZm8gKnZsaXN0W0FXRV9NQVhfVk9JQ0VTXTsKKworCWNoID0gdm9pY2VzW3ZvaWNlXS5jaDsKKwlpZiAoTVVMVElfTEFZRVJfTU9ERSgpICYmIElTX0RSVU1fQ0hBTk5FTCh2b2ljZSkpCisJCWJhbmsgPSBBV0VfRFJVTV9CQU5LOyAvKiBhbHdheXMgc2VhcmNoIGRydW1zZXQgKi8KKwllbHNlCisJCWJhbmsgPSB2b2ljZXNbdm9pY2VdLmNpbmZvLT5iYW5rOworCisJbnZvaWNlcyA9IHJlYWxseV9hbGxvY192b2ljZXMoYmFuaywgdm9pY2VzW3ZvaWNlXS5jaW5mby0+aW5zdHIsCisJCQkJICAgICAgJm5vdGUsIHZlbG9jaXR5LCB2bGlzdCk7CisJaWYgKG52b2ljZXMgPiAwKSB7CisJCXZvaWNlc1t2b2ljZV0udGltZSA9ICsrY3VycmVudF9hbGxvY190aW1lOworCQl2b2ljZXNbdm9pY2VdLnNhbXBsZSA9IHZsaXN0WzBdOyAvKiB1c2UgdGhlIGZpcnN0IG9uZSAqLworCQl2b2ljZXNbdm9pY2VdLmxheWVyID0gMDsKKwkJdm9pY2VzW3ZvaWNlXS5ub3RlID0gbm90ZTsKKwkJdm9pY2VzW3ZvaWNlXS52ZWxvY2l0eSA9IHZlbG9jaXR5OworCX0KK30KKworCisvKgorICogc2VxdWVuY2VyMiBmdW5jdGlvbnMKKyAqLworCisvKiBzZWFyY2ggYW4gZW1wdHkgdm9pY2U7IHVzZWQgYnkgc2VxdWVuY2VyMiAqLworc3RhdGljIGludAorYXdlX2FsbG9jKGludCBkZXYsIGludCBjaG4sIGludCBub3RlLCBzdHJ1Y3Qgdm9pY2VfYWxsb2NfaW5mbyAqYWxsb2MpCit7CisJcGxheWluZ19tb2RlID0gQVdFX1BMQVlfTVVMVEkyOworCWF3ZV9pbmZvLm5yX3ZvaWNlcyA9IEFXRV9NQVhfQ0hBTk5FTFM7CisJcmV0dXJuIGF3ZV9jbGVhcl92b2ljZSgpOworfQorCisKKy8qIHNldCB1cCB2b2ljZTsgdXNlZCBieSBzZXF1ZW5jZXIyICovCitzdGF0aWMgdm9pZAorYXdlX3NldHVwX3ZvaWNlKGludCBkZXYsIGludCB2b2ljZSwgaW50IGNobikKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9pbmZvICppbmZvOworCWlmIChzeW50aF9kZXZzW2Rldl0gPT0gTlVMTCB8fAorCSAgICAoaW5mbyA9ICZzeW50aF9kZXZzW2Rldl0tPmNobl9pbmZvW2Nobl0pID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gYXdlX21heF92b2ljZXMpCisJCXJldHVybjsKKworCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW3NldHVwKCVkKSBjaD0lZF1cbiIsIHZvaWNlLCBjaG4pKTsKKwljaGFubmVsc1tjaG5dLmV4cHJlc3Npb25fdm9sID0gaW5mby0+Y29udHJvbGxlcnNbQ1RMX0VYUFJFU1NJT05dOworCWNoYW5uZWxzW2Nobl0ubWFpbl92b2wgPSBpbmZvLT5jb250cm9sbGVyc1tDVExfTUFJTl9WT0xVTUVdOworCWNoYW5uZWxzW2Nobl0ucGFubmluZyA9CisJCWluZm8tPmNvbnRyb2xsZXJzW0NUTF9QQU5dICogMiAtIDEyODsgLyogc2lnbmVkIDhiaXQgKi8KKwljaGFubmVsc1tjaG5dLmJlbmRlciA9IGluZm8tPmJlbmRlcl92YWx1ZTsgLyogemVybyBjZW50ZXIgKi8KKwljaGFubmVsc1tjaG5dLmJhbmsgPSBpbmZvLT5jb250cm9sbGVyc1tDVExfQkFOS19TRUxFQ1RdOworCWNoYW5uZWxzW2Nobl0uc3VzdGFpbmVkID0gaW5mby0+Y29udHJvbGxlcnNbQ1RMX1NVU1RBSU5dOworCWlmIChpbmZvLT5jb250cm9sbGVyc1tDVExfRVhUX0VGRl9ERVBUSF0pIHsKKwkJRlhfU0VUKCZjaGFubmVsc1tjaG5dLmZ4LCBBV0VfRlhfUkVWRVJCLAorCQkgICAgICAgaW5mby0+Y29udHJvbGxlcnNbQ1RMX0VYVF9FRkZfREVQVEhdICogMik7CisJfQorCWlmIChpbmZvLT5jb250cm9sbGVyc1tDVExfQ0hPUlVTX0RFUFRIXSkgeworCQlGWF9TRVQoJmNoYW5uZWxzW2Nobl0uZngsIEFXRV9GWF9DSE9SVVMsCisJCSAgICAgICBpbmZvLT5jb250cm9sbGVyc1tDVExfQ0hPUlVTX0RFUFRIXSAqIDIpOworCX0KKwlhd2Vfc2V0X2luc3RyKGRldiwgY2huLCBpbmZvLT5wZ21fbnVtKTsKK30KKworCisjaWZkZWYgQ09ORklHX0FXRTMyX01JWEVSCisvKgorICogQVdFMzIgbWl4ZXIgZGV2aWNlIGNvbnRyb2wKKyAqLworCitzdGF0aWMgaW50IGF3ZV9taXhlcl9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKKworc3RhdGljIGludCBteV9taXhlcmRldiA9IC0xOworCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgYXdlX21peGVyX29wZXJhdGlvbnMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmlkCT0gIkFXRSIsCisJLm5hbWUJPSAiQVdFMzIgRXF1YWxpemVyIiwKKwkuaW9jdGwJPSBhd2VfbWl4ZXJfaW9jdGwsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX21peGVyKHZvaWQpCit7CisJaWYgKChteV9taXhlcmRldiA9IHNvdW5kX2FsbG9jX21peGVyZGV2KCkpID49IDApIHsKKwkJbWl4ZXJfZGV2c1tteV9taXhlcmRldl0gPSAmYXdlX21peGVyX29wZXJhdGlvbnM7CisJfQorfQorCitzdGF0aWMgdm9pZCB1bmxvYWRfbWl4ZXIodm9pZCkKK3sKKwlpZiAobXlfbWl4ZXJkZXYgPj0gMCkKKwkJc291bmRfdW5sb2FkX21peGVyZGV2KG15X21peGVyZGV2KTsKK30KKworc3RhdGljIGludAorYXdlX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQoreworCWludCBpLCBsZXZlbCwgdmFsdWU7CisKKwlpZiAoKChjbWQgPj4gOCkgJiAweGZmKSAhPSAnTScpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdldF91c2VyKGxldmVsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCXJldHVybiAtRUZBVUxUOworCWxldmVsID0gKChsZXZlbCAmIDB4ZmYpICsgKGxldmVsID4+IDgpKSAvIDI7CisJREVCVUcoMCxwcmludGsoIkFXRU1peDogY21kPSV4IHZhbD0lZFxuIiwgY21kICYgMHhmZiwgbGV2ZWwpKTsKKworCWlmIChfU0lPQ19ESVIoY21kKSAmIF9TSU9DX1dSSVRFKSB7CisJCXN3aXRjaCAoY21kICYgMHhmZikgeworCQljYXNlIFNPVU5EX01JWEVSX0JBU1M6CisJCQl2YWx1ZSA9IGxldmVsICogMTIgLyAxMDA7CisJCQlpZiAodmFsdWUgPj0gMTIpCisJCQkJdmFsdWUgPSAxMTsKKwkJCWN0cmxzW0FXRV9NRF9CQVNTX0xFVkVMXSA9IHZhbHVlOworCQkJYXdlX3VwZGF0ZV9lcXVhbGl6ZXIoKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1RSRUJMRToKKwkJCXZhbHVlID0gbGV2ZWwgKiAxMiAvIDEwMDsKKwkJCWlmICh2YWx1ZSA+PSAxMikKKwkJCQl2YWx1ZSA9IDExOworCQkJY3RybHNbQVdFX01EX1RSRUJMRV9MRVZFTF0gPSB2YWx1ZTsKKwkJCWF3ZV91cGRhdGVfZXF1YWxpemVyKCk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCQlsZXZlbCA9IGxldmVsICogMTI3IC8gMTAwOworCQkJaWYgKGxldmVsID49IDEyOCkgbGV2ZWwgPSAxMjc7CisJCQlhdHRlbl9yZWxhdGl2ZSA9IEZBTFNFOworCQkJYXR0ZW5fb2Zmc2V0ID0gdm9sX3RhYmxlW2xldmVsXTsKKwkJCWF3ZV91cGRhdGVfdm9sdW1lKCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzd2l0Y2ggKGNtZCAmIDB4ZmYpIHsKKwljYXNlIFNPVU5EX01JWEVSX0JBU1M6CisJCWxldmVsID0gY3RybHNbQVdFX01EX0JBU1NfTEVWRUxdICogMTAwIC8gMjQ7CisJCWxldmVsID0gKGxldmVsIDw8IDgpIHwgbGV2ZWw7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfVFJFQkxFOgorCQlsZXZlbCA9IGN0cmxzW0FXRV9NRF9UUkVCTEVfTEVWRUxdICogMTAwIC8gMjQ7CisJCWxldmVsID0gKGxldmVsIDw8IDgpIHwgbGV2ZWw7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQl2YWx1ZSA9IGF0dGVuX29mZnNldDsKKwkJaWYgKGF0dGVuX3JlbGF0aXZlKQorCQkJdmFsdWUgKz0gY3RybHNbQVdFX01EX1pFUk9fQVRURU5dOworCQlmb3IgKGkgPSAxMjc7IGkgPiAwOyBpLS0pIHsKKwkJCWlmICh2YWx1ZSA8PSB2b2xfdGFibGVbaV0pCisJCQkJYnJlYWs7CisJCX0KKwkJbGV2ZWwgPSBpICogMTAwIC8gMTI3OworCQlsZXZlbCA9IChsZXZlbCA8PCA4KSB8IGxldmVsOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCWxldmVsID0gU09VTkRfTUFTS19CQVNTfFNPVU5EX01BU0tfVFJFQkxFfFNPVU5EX01BU0tfVk9MVU1FOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsZXZlbCA9IDA7CisJCWJyZWFrOworCX0KKwlpZiAocHV0X3VzZXIobGV2ZWwsIChpbnQgX191c2VyICopYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGxldmVsOworfQorI2VuZGlmIC8qIENPTkZJR19BV0UzMl9NSVhFUiAqLworCisKKy8qCisgKiBpbml0aWFsaXphdGlvbiBvZiBFbXU4MDAwCisgKi8KKworLyogaW50aWFpbGl6ZSBhdWRpbyBjaGFubmVscyAqLworc3RhdGljIHZvaWQKK2F3ZV9pbml0X2F1ZGlvKHZvaWQpCit7CisJaW50IGNoOworCisJLyogdHVybiBvZmYgZW52ZWxvcGUgZW5naW5lcyAqLworCWZvciAoY2ggPSAwOyBjaCA8IEFXRV9NQVhfVk9JQ0VTOyBjaCsrKSB7CisJCWF3ZV9wb2tlKEFXRV9EQ1lTVVNWKGNoKSwgMHg4MCk7CisJfQorICAKKwkvKiByZXNldCBhbGwgb3RoZXIgcGFyYW1ldGVycyB0byB6ZXJvICovCisJZm9yIChjaCA9IDA7IGNoIDwgQVdFX01BWF9WT0lDRVM7IGNoKyspIHsKKwkJYXdlX3Bva2UoQVdFX0VOVlZPTChjaCksIDApOworCQlhd2VfcG9rZShBV0VfRU5WVkFMKGNoKSwgMCk7CisJCWF3ZV9wb2tlKEFXRV9EQ1lTVVMoY2gpLCAwKTsKKwkJYXdlX3Bva2UoQVdFX0FUS0hMRFYoY2gpLCAwKTsKKwkJYXdlX3Bva2UoQVdFX0xGTzFWQUwoY2gpLCAwKTsKKwkJYXdlX3Bva2UoQVdFX0FUS0hMRChjaCksIDApOworCQlhd2VfcG9rZShBV0VfTEZPMlZBTChjaCksIDApOworCQlhd2VfcG9rZShBV0VfSVAoY2gpLCAwKTsKKwkJYXdlX3Bva2UoQVdFX0lGQVROKGNoKSwgMCk7CisJCWF3ZV9wb2tlKEFXRV9QRUZFKGNoKSwgMCk7CisJCWF3ZV9wb2tlKEFXRV9GTU1PRChjaCksIDApOworCQlhd2VfcG9rZShBV0VfVFJFTUZSUShjaCksIDApOworCQlhd2VfcG9rZShBV0VfRk0yRlJRMihjaCksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfUFRSWChjaCksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfVlRGVChjaCksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfUFNTVChjaCksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfQ1NMKGNoKSwgMCk7CisJCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKGNoKSwgMCk7CisJfQorCisJZm9yIChjaCA9IDA7IGNoIDwgQVdFX01BWF9WT0lDRVM7IGNoKyspIHsKKwkJYXdlX3Bva2VfZHcoQVdFX0NQRihjaCksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfQ1ZDRihjaCksIDApOworCX0KK30KKworCisvKiBpbml0aWFsaXplIERNQSBhZGRyZXNzICovCitzdGF0aWMgdm9pZAorYXdlX2luaXRfZG1hKHZvaWQpCit7CisJYXdlX3Bva2VfZHcoQVdFX1NNQUxSLCAwKTsKKwlhd2VfcG9rZV9kdyhBV0VfU01BUlIsIDApOworCWF3ZV9wb2tlX2R3KEFXRV9TTUFMVywgMCk7CisJYXdlX3Bva2VfZHcoQVdFX1NNQVJXLCAwKTsKK30KKworCisvKiBpbml0aWFsaXphdGlvbiBhcnJheXM7IGZyb20gQURJUCAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW5pdDFbMTI4XSA9IHsKKwkweDAzZmYsIDB4MDAzMCwgIDB4MDdmZiwgMHgwMTMwLCAweDBiZmYsIDB4MDIzMCwgIDB4MGZmZiwgMHgwMzMwLAorCTB4MTNmZiwgMHgwNDMwLCAgMHgxN2ZmLCAweDA1MzAsIDB4MWJmZiwgMHgwNjMwLCAgMHgxZmZmLCAweDA3MzAsCisJMHgyM2ZmLCAweDA4MzAsICAweDI3ZmYsIDB4MDkzMCwgMHgyYmZmLCAweDBhMzAsICAweDJmZmYsIDB4MGIzMCwKKwkweDMzZmYsIDB4MGMzMCwgIDB4MzdmZiwgMHgwZDMwLCAweDNiZmYsIDB4MGUzMCwgIDB4M2ZmZiwgMHgwZjMwLAorCisJMHg0M2ZmLCAweDAwMzAsICAweDQ3ZmYsIDB4MDEzMCwgMHg0YmZmLCAweDAyMzAsICAweDRmZmYsIDB4MDMzMCwKKwkweDUzZmYsIDB4MDQzMCwgIDB4NTdmZiwgMHgwNTMwLCAweDViZmYsIDB4MDYzMCwgIDB4NWZmZiwgMHgwNzMwLAorCTB4NjNmZiwgMHgwODMwLCAgMHg2N2ZmLCAweDA5MzAsIDB4NmJmZiwgMHgwYTMwLCAgMHg2ZmZmLCAweDBiMzAsCisJMHg3M2ZmLCAweDBjMzAsICAweDc3ZmYsIDB4MGQzMCwgMHg3YmZmLCAweDBlMzAsICAweDdmZmYsIDB4MGYzMCwKKworCTB4ODNmZiwgMHgwMDMwLCAgMHg4N2ZmLCAweDAxMzAsIDB4OGJmZiwgMHgwMjMwLCAgMHg4ZmZmLCAweDAzMzAsCisJMHg5M2ZmLCAweDA0MzAsICAweDk3ZmYsIDB4MDUzMCwgMHg5YmZmLCAweDA2MzAsICAweDlmZmYsIDB4MDczMCwKKwkweGEzZmYsIDB4MDgzMCwgIDB4YTdmZiwgMHgwOTMwLCAweGFiZmYsIDB4MGEzMCwgIDB4YWZmZiwgMHgwYjMwLAorCTB4YjNmZiwgMHgwYzMwLCAgMHhiN2ZmLCAweDBkMzAsIDB4YmJmZiwgMHgwZTMwLCAgMHhiZmZmLCAweDBmMzAsCisKKwkweGMzZmYsIDB4MDAzMCwgIDB4YzdmZiwgMHgwMTMwLCAweGNiZmYsIDB4MDIzMCwgIDB4Y2ZmZiwgMHgwMzMwLAorCTB4ZDNmZiwgMHgwNDMwLCAgMHhkN2ZmLCAweDA1MzAsIDB4ZGJmZiwgMHgwNjMwLCAgMHhkZmZmLCAweDA3MzAsCisJMHhlM2ZmLCAweDA4MzAsICAweGU3ZmYsIDB4MDkzMCwgMHhlYmZmLCAweDBhMzAsICAweGVmZmYsIDB4MGIzMCwKKwkweGYzZmYsIDB4MGMzMCwgIDB4ZjdmZiwgMHgwZDMwLCAweGZiZmYsIDB4MGUzMCwgIDB4ZmZmZiwgMHgwZjMwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGluaXQyWzEyOF0gPSB7CisJMHgwM2ZmLCAweDgwMzAsIDB4MDdmZiwgMHg4MTMwLCAweDBiZmYsIDB4ODIzMCwgMHgwZmZmLCAweDgzMzAsCisJMHgxM2ZmLCAweDg0MzAsIDB4MTdmZiwgMHg4NTMwLCAweDFiZmYsIDB4ODYzMCwgMHgxZmZmLCAweDg3MzAsCisJMHgyM2ZmLCAweDg4MzAsIDB4MjdmZiwgMHg4OTMwLCAweDJiZmYsIDB4OGEzMCwgMHgyZmZmLCAweDhiMzAsCisJMHgzM2ZmLCAweDhjMzAsIDB4MzdmZiwgMHg4ZDMwLCAweDNiZmYsIDB4OGUzMCwgMHgzZmZmLCAweDhmMzAsCisKKwkweDQzZmYsIDB4ODAzMCwgMHg0N2ZmLCAweDgxMzAsIDB4NGJmZiwgMHg4MjMwLCAweDRmZmYsIDB4ODMzMCwKKwkweDUzZmYsIDB4ODQzMCwgMHg1N2ZmLCAweDg1MzAsIDB4NWJmZiwgMHg4NjMwLCAweDVmZmYsIDB4ODczMCwKKwkweDYzZmYsIDB4ODgzMCwgMHg2N2ZmLCAweDg5MzAsIDB4NmJmZiwgMHg4YTMwLCAweDZmZmYsIDB4OGIzMCwKKwkweDczZmYsIDB4OGMzMCwgMHg3N2ZmLCAweDhkMzAsIDB4N2JmZiwgMHg4ZTMwLCAweDdmZmYsIDB4OGYzMCwKKworCTB4ODNmZiwgMHg4MDMwLCAweDg3ZmYsIDB4ODEzMCwgMHg4YmZmLCAweDgyMzAsIDB4OGZmZiwgMHg4MzMwLAorCTB4OTNmZiwgMHg4NDMwLCAweDk3ZmYsIDB4ODUzMCwgMHg5YmZmLCAweDg2MzAsIDB4OWZmZiwgMHg4NzMwLAorCTB4YTNmZiwgMHg4ODMwLCAweGE3ZmYsIDB4ODkzMCwgMHhhYmZmLCAweDhhMzAsIDB4YWZmZiwgMHg4YjMwLAorCTB4YjNmZiwgMHg4YzMwLCAweGI3ZmYsIDB4OGQzMCwgMHhiYmZmLCAweDhlMzAsIDB4YmZmZiwgMHg4ZjMwLAorCisJMHhjM2ZmLCAweDgwMzAsIDB4YzdmZiwgMHg4MTMwLCAweGNiZmYsIDB4ODIzMCwgMHhjZmZmLCAweDgzMzAsCisJMHhkM2ZmLCAweDg0MzAsIDB4ZDdmZiwgMHg4NTMwLCAweGRiZmYsIDB4ODYzMCwgMHhkZmZmLCAweDg3MzAsCisJMHhlM2ZmLCAweDg4MzAsIDB4ZTdmZiwgMHg4OTMwLCAweGViZmYsIDB4OGEzMCwgMHhlZmZmLCAweDhiMzAsCisJMHhmM2ZmLCAweDhjMzAsIDB4ZjdmZiwgMHg4ZDMwLCAweGZiZmYsIDB4OGUzMCwgMHhmZmZmLCAweDhmMzAsCit9OworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW5pdDNbMTI4XSA9IHsKKwkweDBDMTAsIDB4ODQ3MCwgMHgxNEZFLCAweEI0ODgsIDB4MTY3RiwgMHhBNDcwLCAweDE4RTcsIDB4ODRCNSwKKwkweDFCNkUsIDB4ODQyQSwgMHgxRjFELCAweDg1MkEsIDB4MERBMywgMHg4RjdDLCAweDE2N0UsIDB4RjI1NCwKKwkweDAwMDAsIDB4ODQyQSwgMHgwMDAxLCAweDg1MkEsIDB4MThFNiwgMHg4QkFBLCAweDFCNkQsIDB4RjIzNCwKKwkweDIyOUYsIDB4ODQyOSwgMHgyNzQ2LCAweDg1MjksIDB4MUYxQywgMHg4NkU3LCAweDIyOUUsIDB4RjIyNCwKKworCTB4MERBNCwgMHg4NDI5LCAweDJDMjksIDB4ODUyOSwgMHgyNzQ1LCAweDg3RjYsIDB4MkMyOCwgMHhGMjU0LAorCTB4MzgzQiwgMHg4NDI4LCAweDMyMEYsIDB4ODUyOCwgMHgzMjBFLCAweDhGMDIsIDB4MTM0MSwgMHhGMjY0LAorCTB4M0VCNiwgMHg4NDI4LCAweDNFQjksIDB4ODUyOCwgMHgzODNBLCAweDhGQTksIDB4M0VCNSwgMHhGMjk0LAorCTB4M0VCNywgMHg4NDc0LCAweDNFQkEsIDB4ODU3NSwgMHgzRUI4LCAweEM0QzMsIDB4M0VCQiwgMHhDNUMzLAorCisJMHgwMDAwLCAweEE0MDQsIDB4MDAwMSwgMHhBNTA0LCAweDE0MUYsIDB4ODY3MSwgMHgxNEZELCAweDgyODcsCisJMHgzRUJDLCAweEU2MTAsIDB4M0VDOCwgMHg4QzdCLCAweDAzMUEsIDB4ODdFNiwgMHgzRUM4LCAweDg2RjcsCisJMHgzRUMwLCAweDgyMUUsIDB4M0VCRSwgMHhEMjA4LCAweDNFQkQsIDB4ODIxRiwgMHgzRUNBLCAweDgzODYsCisJMHgzRUMxLCAweDhDMDMsIDB4M0VDOSwgMHg4MzFFLCAweDNFQ0EsIDB4OEM0QywgMHgzRUJGLCAweDhDNTUsCisKKwkweDNFQzksIDB4QzIwOCwgMHgzRUM0LCAweEJDODQsIDB4M0VDOCwgMHg4RUFELCAweDNFQzgsIDB4RDMwOCwKKwkweDNFQzIsIDB4OEY3RSwgMHgzRUNCLCAweDgyMTksIDB4M0VDQiwgMHhEMjZFLCAweDNFQzUsIDB4ODMxRiwKKwkweDNFQzYsIDB4QzMwOCwgMHgzRUMzLCAweEIyRkYsIDB4M0VDOSwgMHg4MjY1LCAweDNFQzksIDB4ODMxOSwKKwkweDEzNDIsIDB4RDM2RSwgMHgzRUM3LCAweEIzRkYsIDB4MDAwMCwgMHg4MzY1LCAweDE0MjAsIDB4OTU3MCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbml0NFsxMjhdID0geworCTB4MEMxMCwgMHg4NDcwLCAweDE0RkUsIDB4QjQ4OCwgMHgxNjdGLCAweEE0NzAsIDB4MThFNywgMHg4NEI1LAorCTB4MUI2RSwgMHg4NDJBLCAweDFGMUQsIDB4ODUyQSwgMHgwREEzLCAweDBGN0MsIDB4MTY3RSwgMHg3MjU0LAorCTB4MDAwMCwgMHg4NDJBLCAweDAwMDEsIDB4ODUyQSwgMHgxOEU2LCAweDBCQUEsIDB4MUI2RCwgMHg3MjM0LAorCTB4MjI5RiwgMHg4NDI5LCAweDI3NDYsIDB4ODUyOSwgMHgxRjFDLCAweDA2RTcsIDB4MjI5RSwgMHg3MjI0LAorCisJMHgwREE0LCAweDg0MjksIDB4MkMyOSwgMHg4NTI5LCAweDI3NDUsIDB4MDdGNiwgMHgyQzI4LCAweDcyNTQsCisJMHgzODNCLCAweDg0MjgsIDB4MzIwRiwgMHg4NTI4LCAweDMyMEUsIDB4MEYwMiwgMHgxMzQxLCAweDcyNjQsCisJMHgzRUI2LCAweDg0MjgsIDB4M0VCOSwgMHg4NTI4LCAweDM4M0EsIDB4MEZBOSwgMHgzRUI1LCAweDcyOTQsCisJMHgzRUI3LCAweDg0NzQsIDB4M0VCQSwgMHg4NTc1LCAweDNFQjgsIDB4NDRDMywgMHgzRUJCLCAweDQ1QzMsCisKKwkweDAwMDAsIDB4QTQwNCwgMHgwMDAxLCAweEE1MDQsIDB4MTQxRiwgMHgwNjcxLCAweDE0RkQsIDB4MDI4NywKKwkweDNFQkMsIDB4RTYxMCwgMHgzRUM4LCAweDBDN0IsIDB4MDMxQSwgMHgwN0U2LCAweDNFQzgsIDB4ODZGNywKKwkweDNFQzAsIDB4ODIxRSwgMHgzRUJFLCAweEQyMDgsIDB4M0VCRCwgMHgwMjFGLCAweDNFQ0EsIDB4MDM4NiwKKwkweDNFQzEsIDB4MEMwMywgMHgzRUM5LCAweDAzMUUsIDB4M0VDQSwgMHg4QzRDLCAweDNFQkYsIDB4MEM1NSwKKworCTB4M0VDOSwgMHhDMjA4LCAweDNFQzQsIDB4QkM4NCwgMHgzRUM4LCAweDBFQUQsIDB4M0VDOCwgMHhEMzA4LAorCTB4M0VDMiwgMHg4RjdFLCAweDNFQ0IsIDB4MDIxOSwgMHgzRUNCLCAweEQyNkUsIDB4M0VDNSwgMHgwMzFGLAorCTB4M0VDNiwgMHhDMzA4LCAweDNFQzMsIDB4MzJGRiwgMHgzRUM5LCAweDAyNjUsIDB4M0VDOSwgMHg4MzE5LAorCTB4MTM0MiwgMHhEMzZFLCAweDNFQzcsIDB4MzNGRiwgMHgwMDAwLCAweDgzNjUsIDB4MTQyMCwgMHg5NTcwLAorfTsKKworCisvKiBzZW5kIGluaXRpYWxpemF0aW9uIGFycmF5cyB0byBzdGFydCB1cCAqLworc3RhdGljIHZvaWQKK2F3ZV9pbml0X2FycmF5KHZvaWQpCit7CisJYXdlX3NlbmRfYXJyYXkoaW5pdDEpOworCWF3ZV93YWl0KDEwMjQpOworCWF3ZV9zZW5kX2FycmF5KGluaXQyKTsKKwlhd2Vfc2VuZF9hcnJheShpbml0Myk7CisJYXdlX3Bva2VfZHcoQVdFX0hXQ0Y0LCAwKTsKKwlhd2VfcG9rZV9kdyhBV0VfSFdDRjUsIDB4ODMpOworCWF3ZV9wb2tlX2R3KEFXRV9IV0NGNiwgMHg4MDAwKTsKKwlhd2Vfc2VuZF9hcnJheShpbml0NCk7Cit9CisKKy8qIHNlbmQgYW4gaW5pdGlhbGl6YXRpb24gYXJyYXkgKi8KK3N0YXRpYyB2b2lkCithd2Vfc2VuZF9hcnJheSh1bnNpZ25lZCBzaG9ydCAqZGF0YSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCAqcDsKKworCXAgPSBkYXRhOworCWZvciAoaSA9IDA7IGkgPCBBV0VfTUFYX1ZPSUNFUzsgaSsrLCBwKyspCisJCWF3ZV9wb2tlKEFXRV9JTklUMShpKSwgKnApOworCWZvciAoaSA9IDA7IGkgPCBBV0VfTUFYX1ZPSUNFUzsgaSsrLCBwKyspCisJCWF3ZV9wb2tlKEFXRV9JTklUMihpKSwgKnApOworCWZvciAoaSA9IDA7IGkgPCBBV0VfTUFYX1ZPSUNFUzsgaSsrLCBwKyspCisJCWF3ZV9wb2tlKEFXRV9JTklUMyhpKSwgKnApOworCWZvciAoaSA9IDA7IGkgPCBBV0VfTUFYX1ZPSUNFUzsgaSsrLCBwKyspCisJCWF3ZV9wb2tlKEFXRV9JTklUNChpKSwgKnApOworfQorCisKKy8qCisgKiBzZXQgdXAgYXdlMzIgY2hhbm5lbHMgdG8gc29tZSBrbm93biBzdGF0ZS4KKyAqLworCisvKiBzZXQgdGhlIGVudmVsb3BlICYgTEZPIHBhcmFtZXRlcnMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzOyBzZWUgQURJUCAqLworc3RhdGljIHZvaWQKK2F3ZV90d2Vha192b2ljZShpbnQgaSkKK3sKKwkvKiBzZXQgYWxsIG1vZC92b2wgZW52ZWxvcGUgc2hhcGUgdG8gbWluaW11bSAqLworCWF3ZV9wb2tlKEFXRV9FTlZWT0woaSksIDB4ODAwMCk7CisJYXdlX3Bva2UoQVdFX0VOVlZBTChpKSwgMHg4MDAwKTsKKwlhd2VfcG9rZShBV0VfRENZU1VTKGkpLCAweDdGN0YpOworCWF3ZV9wb2tlKEFXRV9BVEtITERWKGkpLCAweDdGN0YpOworCWF3ZV9wb2tlKEFXRV9BVEtITEQoaSksIDB4N0Y3Rik7CisJYXdlX3Bva2UoQVdFX1BFRkUoaSksIDApOyAgLyogbW9kIGVudmVsb3BlIGhlaWdodCB0byB6ZXJvICovCisJYXdlX3Bva2UoQVdFX0xGTzFWQUwoaSksIDB4ODAwMCk7IC8qIG5vIGRlbGF5IGZvciBMRk8xICovCisJYXdlX3Bva2UoQVdFX0xGTzJWQUwoaSksIDB4ODAwMCk7CisJYXdlX3Bva2UoQVdFX0lQKGkpLCAweEUwMDApOwkvKiBubyBwaXRjaCBzaGlmdCAqLworCWF3ZV9wb2tlKEFXRV9JRkFUTihpKSwgMHhGRjAwKTsJLyogdm9sdW1lIHRvIG1pbmltdW0gKi8KKwlhd2VfcG9rZShBV0VfRk1NT0QoaSksIDApOworCWF3ZV9wb2tlKEFXRV9UUkVNRlJRKGkpLCAwKTsKKwlhd2VfcG9rZShBV0VfRk0yRlJRMihpKSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCithd2VfdHdlYWsodm9pZCkKK3sKKwlpbnQgaTsKKwkvKiByZXNldCBhbGwgY2hhbm5lbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYXdlX21heF92b2ljZXM7IGkrKykKKwkJYXdlX3R3ZWFrX3ZvaWNlKGkpOworfQorCisKKy8qCisgKiAgaW5pdGlhbGl6ZXMgdGhlIEZNIHNlY3Rpb24gb2YgQVdFMzI7CisgKiAgIHNlZSBWaW5jZSBWdSdzIHVub2ZmaWNpYWwgQVdFMzIgcHJvZ3JhbW1pbmcgZ3VpZGUKKyAqLworCitzdGF0aWMgdm9pZAorYXdlX2luaXRfZm0odm9pZCkKK3sKKyNpZm5kZWYgQVdFX0FMV0FZU19JTklUX0ZNCisJLyogaWYgbm8gZXh0ZW5kZWQgbWVtb3J5IGlzIG9uIGJvYXJkLi4gKi8KKwlpZiAobWVtc2l6ZSA8PSAwKQorCQlyZXR1cm47CisjZW5kaWYKKwlERUJVRygzLHByaW50aygiQVdFMzI6IGluaXRpYWxpemluZyBGTVxuIikpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbGFzdCB0d28gY2hhbm5lbHMgZm9yIERSQU0gcmVmcmVzaCBhbmQgcHJvZHVjaW5nCisJICAgdGhlIHJldmVyYiBhbmQgY2hvcnVzIGVmZmVjdHMgZm9yIFlhbWFoYSBPUEwtMyBzeW50aGVzaXplciAqLworCisJLyogMzE6IEZNIGxlZnQgY2hhbm5lbCwgMHhmZmZmZTAtMHhmZmZmZTggKi8KKwlhd2VfcG9rZShBV0VfRENZU1VTVigzMCksIDB4ODApOworCWF3ZV9wb2tlX2R3KEFXRV9QU1NUKDMwKSwgMHhGRkZGRkZFMCk7IC8qIGZ1bGwgbGVmdCAqLworCWF3ZV9wb2tlX2R3KEFXRV9DU0woMzApLCAweDAwRkZGRkU4IHwKKwkJICAgIChERUZfRk1fQ0hPUlVTX0RFUFRIIDw8IDI0KSk7CisJYXdlX3Bva2VfZHcoQVdFX1BUUlgoMzApLCAoREVGX0ZNX1JFVkVSQl9ERVBUSCA8PCA4KSk7CisJYXdlX3Bva2VfZHcoQVdFX0NQRigzMCksIDApOworCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKDMwKSwgMHgwMEZGRkZFMyk7CisKKwkvKiAzMjogRk0gcmlnaHQgY2hhbm5lbCwgMHhmZmZmZjAtMHhmZmZmZjggKi8KKwlhd2VfcG9rZShBV0VfRENZU1VTVigzMSksIDB4ODApOworCWF3ZV9wb2tlX2R3KEFXRV9QU1NUKDMxKSwgMHgwMEZGRkZGMCk7IC8qIGZ1bGwgcmlnaHQgKi8KKwlhd2VfcG9rZV9kdyhBV0VfQ1NMKDMxKSwgMHgwMEZGRkZGOCB8CisJCSAgICAoREVGX0ZNX0NIT1JVU19ERVBUSCA8PCAyNCkpOworCWF3ZV9wb2tlX2R3KEFXRV9QVFJYKDMxKSwgKERFRl9GTV9SRVZFUkJfREVQVEggPDwgOCkpOworCWF3ZV9wb2tlX2R3KEFXRV9DUEYoMzEpLCAweDgwMDApOworCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKDMxKSwgMHgwMEZGRkZGMyk7CisKKwkvKiBza2V3IHZvbHVtZSAmIGN1dG9mZiAqLworCWF3ZV9wb2tlX2R3KEFXRV9WVEZUKDMwKSwgMHg4MDAwRkZGRik7CisJYXdlX3Bva2VfZHcoQVdFX1ZURlQoMzEpLCAweDgwMDBGRkZGKTsKKworCXZvaWNlc1szMF0uc3RhdGUgPSBBV0VfU1RfRk07CisJdm9pY2VzWzMxXS5zdGF0ZSA9IEFXRV9TVF9GTTsKKworCS8qIGNoYW5nZSBtYXhpbXVtIGNoYW5uZWxzIHRvIDMwICovCisJYXdlX21heF92b2ljZXMgPSBBV0VfTk9STUFMX1ZPSUNFUzsKKwlpZiAocGxheWluZ19tb2RlID09IEFXRV9QTEFZX0RJUkVDVCkKKwkJYXdlX2luZm8ubnJfdm9pY2VzID0gYXdlX21heF92b2ljZXM7CisJZWxzZQorCQlhd2VfaW5mby5ucl92b2ljZXMgPSBBV0VfTUFYX0NIQU5ORUxTOworCXZvaWNlX2FsbG9jLT5tYXhfdm9pY2UgPSBhd2VfbWF4X3ZvaWNlczsKK30KKworLyoKKyAqICBBV0UzMiBEUkFNIGFjY2VzcyByb3V0aW5lcworICovCisKKy8qIG9wZW4gRFJBTSB3cml0ZSBhY2Nlc3NpbmcgbW9kZSAqLworc3RhdGljIGludAorYXdlX29wZW5fZHJhbV9mb3Jfd3JpdGUoaW50IG9mZnNldCwgaW50IGNoYW5uZWxzKQoreworCWludCB2aWR4W0FXRV9OT1JNQUxfVk9JQ0VTXTsKKwlpbnQgaTsKKworCWlmIChjaGFubmVscyA8IDAgfHwgY2hhbm5lbHMgPj0gQVdFX05PUk1BTF9WT0lDRVMpIHsKKwkJY2hhbm5lbHMgPSBBV0VfTk9STUFMX1ZPSUNFUzsKKwkJZm9yIChpID0gMDsgaSA8IEFXRV9OT1JNQUxfVk9JQ0VTOyBpKyspCisJCQl2aWR4W2ldID0gaTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworCQkJdmlkeFtpXSA9IGF3ZV9jbGVhcl92b2ljZSgpOworCQkJdm9pY2VzW3ZpZHhbaV1dLnN0YXRlID0gQVdFX1NUX01BUks7CisJCX0KKwl9CisKKwkvKiB1c2UgYWxsIGNoYW5uZWxzIGZvciBETUEgdHJhbnNmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworCQlpZiAodmlkeFtpXSA8IDApIGNvbnRpbnVlOworCQlhd2VfcG9rZShBV0VfRENZU1VTVih2aWR4W2ldKSwgMHg4MCk7CisJCWF3ZV9wb2tlX2R3KEFXRV9WVEZUKHZpZHhbaV0pLCAwKTsKKwkJYXdlX3Bva2VfZHcoQVdFX0NWQ0YodmlkeFtpXSksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfUFRSWCh2aWR4W2ldKSwgMHg0MDAwMDAwMCk7CisJCWF3ZV9wb2tlX2R3KEFXRV9DUEYodmlkeFtpXSksIDB4NDAwMDAwMDApOworCQlhd2VfcG9rZV9kdyhBV0VfUFNTVCh2aWR4W2ldKSwgMCk7CisJCWF3ZV9wb2tlX2R3KEFXRV9DU0wodmlkeFtpXSksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfQ0NDQSh2aWR4W2ldKSwgMHgwNjAwMDAwMCk7CisJCXZvaWNlc1t2aWR4W2ldXS5zdGF0ZSA9IEFXRV9TVF9EUkFNOworCX0KKwkvKiBwb2ludCBjaGFubmVscyAzMSAmIDMyIHRvIFJPTSBzYW1wbGVzIGZvciBEUkFNIHJlZnJlc2ggKi8KKwlhd2VfcG9rZV9kdyhBV0VfVlRGVCgzMCksIDApOworCWF3ZV9wb2tlX2R3KEFXRV9QU1NUKDMwKSwgMHgxZDgpOworCWF3ZV9wb2tlX2R3KEFXRV9DU0woMzApLCAweDFlMCk7CisJYXdlX3Bva2VfZHcoQVdFX0NDQ0EoMzApLCAweDFkOCk7CisJYXdlX3Bva2VfZHcoQVdFX1ZURlQoMzEpLCAwKTsKKwlhd2VfcG9rZV9kdyhBV0VfUFNTVCgzMSksIDB4MWQ4KTsKKwlhd2VfcG9rZV9kdyhBV0VfQ1NMKDMxKSwgMHgxZTApOworCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKDMxKSwgMHgxZDgpOworCXZvaWNlc1szMF0uc3RhdGUgPSBBV0VfU1RfRk07CisJdm9pY2VzWzMxXS5zdGF0ZSA9IEFXRV9TVF9GTTsKKworCS8qIGlmIGZ1bGwgYml0IGlzIG9uLCBub3QgcmVhZHkgdG8gd3JpdGUgb24gKi8KKwlpZiAoYXdlX3BlZWtfZHcoQVdFX1NNQUxXKSAmIDB4ODAwMDAwMDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKwkJCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKHZpZHhbaV0pLCAwKTsKKwkJCXZvaWNlc1t2aWR4W2ldXS5zdGF0ZSA9IEFXRV9TVF9PRkY7CisJCX0KKwkJcHJpbnRrKCJhd2U6IG5vdCByZWFkeSB0byB3cml0ZS4uXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBzZXQgYWRkcmVzcyB0byB3cml0ZSAqLworCWF3ZV9wb2tlX2R3KEFXRV9TTUFMVywgb2Zmc2V0KTsKKworCXJldHVybiAwOworfQorCisvKiBvcGVuIERSQU0gZm9yIFJBTSBzaXplIGRldGVjdGlvbiAqLworc3RhdGljIHZvaWQKK2F3ZV9vcGVuX2RyYW1fZm9yX2NoZWNrKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFXRV9OT1JNQUxfVk9JQ0VTOyBpKyspIHsKKwkJYXdlX3Bva2UoQVdFX0RDWVNVU1YoaSksIDB4ODApOworCQlhd2VfcG9rZV9kdyhBV0VfVlRGVChpKSwgMCk7CisJCWF3ZV9wb2tlX2R3KEFXRV9DVkNGKGkpLCAwKTsKKwkJYXdlX3Bva2VfZHcoQVdFX1BUUlgoaSksIDB4NDAwMDAwMDApOworCQlhd2VfcG9rZV9kdyhBV0VfQ1BGKGkpLCAweDQwMDAwMDAwKTsKKwkJYXdlX3Bva2VfZHcoQVdFX1BTU1QoaSksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfQ1NMKGkpLCAwKTsKKwkJaWYgKGkgJiAxKSAvKiBETUEgd3JpdGUgKi8KKwkJCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKGkpLCAweDA2MDAwMDAwKTsKKwkJZWxzZQkgICAvKiBETUEgcmVhZCAqLworCQkJYXdlX3Bva2VfZHcoQVdFX0NDQ0EoaSksIDB4MDQwMDAwMDApOworCQl2b2ljZXNbaV0uc3RhdGUgPSBBV0VfU1RfRFJBTTsKKwl9Cit9CisKKworLyogY2xvc2UgZHJhbSBhY2Nlc3MgKi8KK3N0YXRpYyB2b2lkCithd2VfY2xvc2VfZHJhbSh2b2lkKQoreworCWludCBpOworCS8qIHdhaXQgdW50aWwgRlVMTCBiaXQgaW4gU01BeFcgcmVnaXN0ZXIgYmUgZmFsc2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQlpZiAoIShhd2VfcGVla19kdyhBV0VfU01BTFcpICYgMHg4MDAwMDAwMCkpCisJCQlicmVhazsKKwkJYXdlX3dhaXQoMTApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBV0VfTk9STUFMX1ZPSUNFUzsgaSsrKSB7CisJCWlmICh2b2ljZXNbaV0uc3RhdGUgPT0gQVdFX1NUX0RSQU0pIHsKKwkJCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKGkpLCAwKTsKKwkJCWF3ZV9wb2tlKEFXRV9EQ1lTVVNWKGkpLCAweDgwN0YpOworCQkJdm9pY2VzW2ldLnN0YXRlID0gQVdFX1NUX09GRjsKKwkJfQorCX0KK30KKworCisvKgorICogY2hlY2sgZHJhbSBzaXplIG9uIEFXRSBib2FyZAorICovCisKKy8qIGFueSB0aHJlZSBudW1iZXJzIHlvdSBsaWtlICovCisjZGVmaW5lIFVOSVFVRV9JRDEJMHgxMjM0CisjZGVmaW5lIFVOSVFVRV9JRDIJMHg0MzIxCisjZGVmaW5lIFVOSVFVRV9JRDMJMHhBQkNECisKK3N0YXRpYyB2b2lkIF9faW5pdAorYXdlX2NoZWNrX2RyYW0odm9pZCkKK3sKKwlpZiAoYXdlX3ByZXNlbnQpIC8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKwkJcmV0dXJuOworCisJaWYgKG1lbXNpemUgPj0gMCkgeyAvKiBnaXZlbiBieSBjb25maWcgZmlsZSBvciBtb2R1bGUgb3B0aW9uICovCisJCW1lbXNpemUgKj0gMTAyNDsgLyogY29udmVydCB0byBLYnl0ZXMgKi8KKwkJcmV0dXJuOworCX0KKworCWF3ZV9vcGVuX2RyYW1fZm9yX2NoZWNrKCk7CisKKwltZW1zaXplID0gMDsKKworCS8qIHNldCB1cCB1bmlxdWUgdHdvIGlkIG51bWJlcnMgKi8KKwlhd2VfcG9rZV9kdyhBV0VfU01BTFcsIEFXRV9EUkFNX09GRlNFVCk7CisJYXdlX3Bva2UoQVdFX1NNTEQsIFVOSVFVRV9JRDEpOworCWF3ZV9wb2tlKEFXRV9TTUxELCBVTklRVUVfSUQyKTsKKworCXdoaWxlIChtZW1zaXplIDwgQVdFX01BWF9EUkFNX1NJWkUpIHsKKwkJYXdlX3dhaXQoNSk7CisJCS8qIHJlYWQgYSBkYXRhIG9uIHRoZSBEUkFNIHN0YXJ0IGFkZHJlc3MgKi8KKwkJYXdlX3Bva2VfZHcoQVdFX1NNQUxSLCBBV0VfRFJBTV9PRkZTRVQpOworCQlhd2VfcGVlayhBV0VfU01MRCk7IC8qIGRpc2NhcmQgc3RhbGUgZGF0YSAgKi8KKwkJaWYgKGF3ZV9wZWVrKEFXRV9TTUxEKSAhPSBVTklRVUVfSUQxKQorCQkJYnJlYWs7CisJCWlmIChhd2VfcGVlayhBV0VfU01MRCkgIT0gVU5JUVVFX0lEMikKKwkJCWJyZWFrOworCQltZW1zaXplICs9IDUxMjsgIC8qIGluY3JlbWVudCA1MTJrYnl0ZXMgKi8KKwkJLyogV3JpdGUgYSB1bmlxdWUgZGF0YSBvbiB0aGUgdGVzdCBhZGRyZXNzOworCQkgKiBpZiB0aGUgYWRkcmVzcyBpcyBvdXQgb2YgcmFuZ2UsIHRoZSBkYXRhIGlzIHdyaXR0ZW4gb24KKwkJICogMHgyMDAwMDAoPUFXRV9EUkFNX09GRlNFVCkuICBUaGVuIHRoZSB0d28gaWQgd29yZHMgYXJlCisJCSAqIGJyb2tlbiBieSB0aGlzIGRhdGEuCisJCSAqLworCQlhd2VfcG9rZV9kdyhBV0VfU01BTFcsIEFXRV9EUkFNX09GRlNFVCArIG1lbXNpemUqNTEyTCk7CisJCWF3ZV9wb2tlKEFXRV9TTUxELCBVTklRVUVfSUQzKTsKKwkJYXdlX3dhaXQoNSk7CisJCS8qIHJlYWQgYSBkYXRhIG9uIHRoZSBqdXN0IHdyaXR0ZW4gRFJBTSBhZGRyZXNzICovCisJCWF3ZV9wb2tlX2R3KEFXRV9TTUFMUiwgQVdFX0RSQU1fT0ZGU0VUICsgbWVtc2l6ZSo1MTJMKTsKKwkJYXdlX3BlZWsoQVdFX1NNTEQpOyAvKiBkaXNjYXJkIHN0YWxlIGRhdGEgICovCisJCWlmIChhd2VfcGVlayhBV0VfU01MRCkgIT0gVU5JUVVFX0lEMykKKwkJCWJyZWFrOworCX0KKwlhd2VfY2xvc2VfZHJhbSgpOworCisJREVCVUcoMCxwcmludGsoIkFXRTMyOiAlZCBLYnl0ZXMgbWVtb3J5IGRldGVjdGVkXG4iLCBtZW1zaXplKSk7CisKKwkvKiBjb252ZXJ0IHRvIEtieXRlcyAqLworCW1lbXNpemUgKj0gMTAyNDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogY2hvcnVzIGFuZCByZXZlcmIgY29udHJvbHM7IGZyb20gVlYncyBndWlkZQorICovCisKKy8qIDUgcGFyYW1ldGVycyBmb3IgZWFjaCBjaG9ydXMgbW9kZTsgMyB4IDE2Yml0LCAyIHggMzJiaXQgKi8KK3N0YXRpYyBjaGFyIGNob3J1c19kZWZpbmVkW0FXRV9DSE9SVVNfTlVNQkVSU107CitzdGF0aWMgYXdlX2Nob3J1c19meF9yZWMgY2hvcnVzX3Bhcm1bQVdFX0NIT1JVU19OVU1CRVJTXSA9IHsKKwl7MHhFNjAwLCAweDAzRjYsIDB4QkMyQyAsMHgwMDAwMDAwMCwgMHgwMDAwMDA2RH0sIC8qIGNob3J1cyAxICovCisJezB4RTYwOCwgMHgwMzFBLCAweEJDNkUsIDB4MDAwMDAwMDAsIDB4MDAwMDAxN0N9LCAvKiBjaG9ydXMgMiAqLworCXsweEU2MTAsIDB4MDMxQSwgMHhCQzg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDgzfSwgLyogY2hvcnVzIDMgKi8KKwl7MHhFNjIwLCAweDAyNjksIDB4QkM2RSwgMHgwMDAwMDAwMCwgMHgwMDAwMDE3Q30sIC8qIGNob3J1cyA0ICovCisJezB4RTY4MCwgMHgwNEQzLCAweEJDQTYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNUJ9LCAvKiBmZWVkYmFjayAqLworCXsweEU2RTAsIDB4MDQ0RSwgMHhCQzM3LCAweDAwMDAwMDAwLCAweDAwMDAwMDI2fSwgLyogZmxhbmdlciAqLworCXsweEU2MDAsIDB4MEIwNiwgMHhCQzAwLCAweDAwMDBFMDAwLCAweDAwMDAwMDgzfSwgLyogc2hvcnQgZGVsYXkgKi8KKwl7MHhFNkMwLCAweDBCMDYsIDB4QkMwMCwgMHgwMDAwRTAwMCwgMHgwMDAwMDA4M30sIC8qIHNob3J0IGRlbGF5ICsgZmVlZGJhY2sgKi8KK307CisKK3N0YXRpYyBpbnQKK2F3ZV9sb2FkX2Nob3J1c19meChhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisJaWYgKHBhdGNoLT5vcHRhcmcgPCBBV0VfQ0hPUlVTX1BSRURFRklORUQgfHwgcGF0Y2gtPm9wdGFyZyA+PSBBV0VfQ0hPUlVTX05VTUJFUlMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IGludmFsaWQgY2hvcnVzIG1vZGUgJWQgZm9yIHVwbG9hZGluZ1xuIiwgcGF0Y2gtPm9wdGFyZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY291bnQgPCBzaXplb2YoYXdlX2Nob3J1c19meF9yZWMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyIEVycm9yOiB0b28gc2hvcnQgY2hvcnVzIGZ4IHBhcmFtZXRlcnNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZjaG9ydXNfcGFybVtwYXRjaC0+b3B0YXJnXSwgYWRkciArIEFXRV9QQVRDSF9JTkZPX1NJWkUsCisJCQkgICBzaXplb2YoYXdlX2Nob3J1c19meF9yZWMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2hvcnVzX2RlZmluZWRbcGF0Y2gtPm9wdGFyZ10gPSBUUlVFOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYXdlX3NldF9jaG9ydXNfbW9kZShpbnQgZWZmZWN0KQoreworCWlmIChlZmZlY3QgPCAwIHx8IGVmZmVjdCA+PSBBV0VfQ0hPUlVTX05VTUJFUlMgfHwKKwkgICAgKGVmZmVjdCA+PSBBV0VfQ0hPUlVTX1BSRURFRklORUQgJiYgIWNob3J1c19kZWZpbmVkW2VmZmVjdF0pKQorCQlyZXR1cm47CisJYXdlX3Bva2UoQVdFX0lOSVQzKDkpLCBjaG9ydXNfcGFybVtlZmZlY3RdLmZlZWRiYWNrKTsKKwlhd2VfcG9rZShBV0VfSU5JVDMoMTIpLCBjaG9ydXNfcGFybVtlZmZlY3RdLmRlbGF5X29mZnNldCk7CisJYXdlX3Bva2UoQVdFX0lOSVQ0KDMpLCBjaG9ydXNfcGFybVtlZmZlY3RdLmxmb19kZXB0aCk7CisJYXdlX3Bva2VfZHcoQVdFX0hXQ0Y0LCBjaG9ydXNfcGFybVtlZmZlY3RdLmRlbGF5KTsKKwlhd2VfcG9rZV9kdyhBV0VfSFdDRjUsIGNob3J1c19wYXJtW2VmZmVjdF0ubGZvX2ZyZXEpOworCWF3ZV9wb2tlX2R3KEFXRV9IV0NGNiwgMHg4MDAwKTsKKwlhd2VfcG9rZV9kdyhBV0VfSFdDRjcsIDB4MDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCithd2VfdXBkYXRlX2Nob3J1c19tb2RlKHZvaWQpCit7CisJYXdlX3NldF9jaG9ydXNfbW9kZShjdHJsc1tBV0VfTURfQ0hPUlVTX01PREVdKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogcmV2ZXJiIG1vZGUgc2V0dGluZ3M7IHdyaXRlIHRoZSBmb2xsb3dpbmcgMjggZGF0YSBvZiAxNiBiaXQgbGVuZ3RoCisgKiAgIG9uIHRoZSBjb3JyZXNwb25kaW5nIHBvcnRzIGluIHRoZSByZXZlcmJfY21kcyBhcnJheQorICovCitzdGF0aWMgY2hhciByZXZlcmJfZGVmaW5lZFtBV0VfQ0hPUlVTX05VTUJFUlNdOworc3RhdGljIGF3ZV9yZXZlcmJfZnhfcmVjIHJldmVyYl9wYXJtW0FXRV9SRVZFUkJfTlVNQkVSU10gPSB7Cit7eyAgLyogcm9vbSAxICovCisJMHhCNDg4LCAweEE0NTAsIDB4OTU1MCwgMHg4NEI1LCAweDM4M0EsIDB4M0VCNSwgMHg3MkY0LAorCTB4NzJBNCwgMHg3MjU0LCAweDcyMDQsIDB4NzIwNCwgMHg3MjA0LCAweDQ0MTYsIDB4NDUxNiwKKwkweEE0OTAsIDB4QTU5MCwgMHg4NDJBLCAweDg1MkEsIDB4ODQyQSwgMHg4NTJBLCAweDg0MjksCisJMHg4NTI5LCAweDg0MjksIDB4ODUyOSwgMHg4NDI4LCAweDg1MjgsIDB4ODQyOCwgMHg4NTI4LAorfX0sCit7eyAgLyogcm9vbSAyICovCisJMHhCNDg4LCAweEE0NTgsIDB4OTU1OCwgMHg4NEI1LCAweDM4M0EsIDB4M0VCNSwgMHg3Mjg0LAorCTB4NzI1NCwgMHg3MjI0LCAweDcyMjQsIDB4NzI1NCwgMHg3Mjg0LCAweDQ0NDgsIDB4NDU0OCwKKwkweEE0NDAsIDB4QTU0MCwgMHg4NDJBLCAweDg1MkEsIDB4ODQyQSwgMHg4NTJBLCAweDg0MjksCisJMHg4NTI5LCAweDg0MjksIDB4ODUyOSwgMHg4NDI4LCAweDg1MjgsIDB4ODQyOCwgMHg4NTI4LAorfX0sCit7eyAgLyogcm9vbSAzICovCisJMHhCNDg4LCAweEE0NjAsIDB4OTU2MCwgMHg4NEI1LCAweDM4M0EsIDB4M0VCNSwgMHg3Mjg0LAorCTB4NzI1NCwgMHg3MjI0LCAweDcyMjQsIDB4NzI1NCwgMHg3Mjg0LCAweDQ0MTYsIDB4NDUxNiwKKwkweEE0OTAsIDB4QTU5MCwgMHg4NDJDLCAweDg1MkMsIDB4ODQyQywgMHg4NTJDLCAweDg0MkIsCisJMHg4NTJCLCAweDg0MkIsIDB4ODUyQiwgMHg4NDJBLCAweDg1MkEsIDB4ODQyQSwgMHg4NTJBLAorfX0sCit7eyAgLyogaGFsbCAxICovCisJMHhCNDg4LCAweEE0NzAsIDB4OTU3MCwgMHg4NEI1LCAweDM4M0EsIDB4M0VCNSwgMHg3Mjg0LAorCTB4NzI1NCwgMHg3MjI0LCAweDcyMjQsIDB4NzI1NCwgMHg3Mjg0LCAweDQ0NDgsIDB4NDU0OCwKKwkweEE0NDAsIDB4QTU0MCwgMHg4NDJCLCAweDg1MkIsIDB4ODQyQiwgMHg4NTJCLCAweDg0MkEsCisJMHg4NTJBLCAweDg0MkEsIDB4ODUyQSwgMHg4NDI5LCAweDg1MjksIDB4ODQyOSwgMHg4NTI5LAorfX0sCit7eyAgLyogaGFsbCAyICovCisJMHhCNDg4LCAweEE0NzAsIDB4OTU3MCwgMHg4NEI1LCAweDM4M0EsIDB4M0VCNSwgMHg3MjU0LAorCTB4NzIzNCwgMHg3MjI0LCAweDcyNTQsIDB4NzI2NCwgMHg3Mjk0LCAweDQ0QzMsIDB4NDVDMywKKwkweEE0MDQsIDB4QTUwNCwgMHg4NDJBLCAweDg1MkEsIDB4ODQyQSwgMHg4NTJBLCAweDg0MjksCisJMHg4NTI5LCAweDg0MjksIDB4ODUyOSwgMHg4NDI4LCAweDg1MjgsIDB4ODQyOCwgMHg4NTI4LAorfX0sCit7eyAgLyogcGxhdGUgKi8KKwkweEI0RkYsIDB4QTQ3MCwgMHg5NTcwLCAweDg0QjUsIDB4MzgzQSwgMHgzRUI1LCAweDcyMzQsCisJMHg3MjM0LCAweDcyMzQsIDB4NzIzNCwgMHg3MjM0LCAweDcyMzQsIDB4NDQ0OCwgMHg0NTQ4LAorCTB4QTQ0MCwgMHhBNTQwLCAweDg0MkEsIDB4ODUyQSwgMHg4NDJBLCAweDg1MkEsIDB4ODQyOSwKKwkweDg1MjksIDB4ODQyOSwgMHg4NTI5LCAweDg0MjgsIDB4ODUyOCwgMHg4NDI4LCAweDg1MjgsCit9fSwKK3t7ICAvKiBkZWxheSAqLworCTB4QjRGRiwgMHhBNDcwLCAweDk1MDAsIDB4ODRCNSwgMHgzMzNBLCAweDM5QjUsIDB4NzIwNCwKKwkweDcyMDQsIDB4NzIwNCwgMHg3MjA0LCAweDcyMDQsIDB4NzJGNCwgMHg0NDAwLCAweDQ1MDAsCisJMHhBNEZGLCAweEE1RkYsIDB4ODQyMCwgMHg4NTIwLCAweDg0MjAsIDB4ODUyMCwgMHg4NDIwLAorCTB4ODUyMCwgMHg4NDIwLCAweDg1MjAsIDB4ODQyMCwgMHg4NTIwLCAweDg0MjAsIDB4ODUyMCwKK319LAore3sgIC8qIHBhbm5pbmcgZGVsYXkgKi8KKwkweEI0RkYsIDB4QTQ5MCwgMHg5NTkwLCAweDg0NzQsIDB4MzMzQSwgMHgzOUI1LCAweDcyMDQsCisJMHg3MjA0LCAweDcyMDQsIDB4NzIwNCwgMHg3MjA0LCAweDcyRjQsIDB4NDQwMCwgMHg0NTAwLAorCTB4QTRGRiwgMHhBNUZGLCAweDg0MjAsIDB4ODUyMCwgMHg4NDIwLCAweDg1MjAsIDB4ODQyMCwKKwkweDg1MjAsIDB4ODQyMCwgMHg4NTIwLCAweDg0MjAsIDB4ODUyMCwgMHg4NDIwLCAweDg1MjAsCit9fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgUmV2ZXJiQ21kUGFpciB7CisJdW5zaWduZWQgc2hvcnQgY21kLCBwb3J0OworfSByZXZlcmJfY21kc1syOF0gPSB7CisgIHtBV0VfSU5JVDEoMHgwMyl9LCB7QVdFX0lOSVQxKDB4MDUpfSwge0FXRV9JTklUNCgweDFGKX0sIHtBV0VfSU5JVDEoMHgwNyl9LAorICB7QVdFX0lOSVQyKDB4MTQpfSwge0FXRV9JTklUMigweDE2KX0sIHtBV0VfSU5JVDEoMHgwRil9LCB7QVdFX0lOSVQxKDB4MTcpfSwKKyAge0FXRV9JTklUMSgweDFGKX0sIHtBV0VfSU5JVDIoMHgwNyl9LCB7QVdFX0lOSVQyKDB4MEYpfSwge0FXRV9JTklUMigweDE3KX0sCisgIHtBV0VfSU5JVDIoMHgxRCl9LCB7QVdFX0lOSVQyKDB4MUYpfSwge0FXRV9JTklUMygweDAxKX0sIHtBV0VfSU5JVDMoMHgwMyl9LAorICB7QVdFX0lOSVQxKDB4MDkpfSwge0FXRV9JTklUMSgweDBCKX0sIHtBV0VfSU5JVDEoMHgxMSl9LCB7QVdFX0lOSVQxKDB4MTMpfSwKKyAge0FXRV9JTklUMSgweDE5KX0sIHtBV0VfSU5JVDEoMHgxQil9LCB7QVdFX0lOSVQyKDB4MDEpfSwge0FXRV9JTklUMigweDAzKX0sCisgIHtBV0VfSU5JVDIoMHgwOSl9LCB7QVdFX0lOSVQyKDB4MEIpfSwge0FXRV9JTklUMigweDExKX0sIHtBV0VfSU5JVDIoMHgxMyl9LAorfTsKKworc3RhdGljIGludAorYXdlX2xvYWRfcmV2ZXJiX2Z4KGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCkKK3sKKwlpZiAocGF0Y2gtPm9wdGFyZyA8IEFXRV9SRVZFUkJfUFJFREVGSU5FRCB8fCBwYXRjaC0+b3B0YXJnID49IEFXRV9SRVZFUkJfTlVNQkVSUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMiBFcnJvcjogaW52YWxpZCByZXZlcmIgbW9kZSAlZCBmb3IgdXBsb2FkaW5nXG4iLCBwYXRjaC0+b3B0YXJnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb3VudCA8IHNpemVvZihhd2VfcmV2ZXJiX2Z4X3JlYykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IHRvbyBzaG9ydCByZXZlcmIgZnggcGFyYW1ldGVyc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJnJldmVyYl9wYXJtW3BhdGNoLT5vcHRhcmddLCBhZGRyICsgQVdFX1BBVENIX0lORk9fU0laRSwKKwkJCSAgIHNpemVvZihhd2VfcmV2ZXJiX2Z4X3JlYykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXZlcmJfZGVmaW5lZFtwYXRjaC0+b3B0YXJnXSA9IFRSVUU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithd2Vfc2V0X3JldmVyYl9tb2RlKGludCBlZmZlY3QpCit7CisJaW50IGk7CisJaWYgKGVmZmVjdCA8IDAgfHwgZWZmZWN0ID49IEFXRV9SRVZFUkJfTlVNQkVSUyB8fAorCSAgICAoZWZmZWN0ID49IEFXRV9SRVZFUkJfUFJFREVGSU5FRCAmJiAhcmV2ZXJiX2RlZmluZWRbZWZmZWN0XSkpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgMjg7IGkrKykKKwkJYXdlX3Bva2UocmV2ZXJiX2NtZHNbaV0uY21kLCByZXZlcmJfY21kc1tpXS5wb3J0LAorCQkJIHJldmVyYl9wYXJtW2VmZmVjdF0ucGFybXNbaV0pOworfQorCitzdGF0aWMgdm9pZAorYXdlX3VwZGF0ZV9yZXZlcmJfbW9kZSh2b2lkKQoreworCWF3ZV9zZXRfcmV2ZXJiX21vZGUoY3RybHNbQVdFX01EX1JFVkVSQl9NT0RFXSk7Cit9CisKKy8qCisgKiB0cmVibGUvYmFzcyBlcXVhbGl6ZXIgY29udHJvbAorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiYXNzX3Bhcm1bMTJdWzNdID0geworCXsweEQyNkEsIDB4RDM2QSwgMHgwMDAwfSwgLyogLTEyIGRCICovCisJezB4RDI1QiwgMHhEMzVCLCAweDAwMDB9LCAvKiAgLTggKi8KKwl7MHhEMjRDLCAweEQzNEMsIDB4MDAwMH0sIC8qICAtNiAqLworCXsweEQyM0QsIDB4RDMzRCwgMHgwMDAwfSwgLyogIC00ICovCisJezB4RDIxRiwgMHhEMzFGLCAweDAwMDB9LCAvKiAgLTIgKi8KKwl7MHhDMjA4LCAweEMzMDgsIDB4MDAwMX0sIC8qICAgMCAoSFcgZGVmYXVsdCkgKi8KKwl7MHhDMjE5LCAweEMzMTksIDB4MDAwMX0sIC8qICArMiAqLworCXsweEMyMkEsIDB4QzMyQSwgMHgwMDAxfSwgLyogICs0ICovCisJezB4QzI0QywgMHhDMzRDLCAweDAwMDF9LCAvKiAgKzYgKi8KKwl7MHhDMjZFLCAweEMzNkUsIDB4MDAwMX0sIC8qICArOCAqLworCXsweEMyNDgsIDB4QzM0OCwgMHgwMDAyfSwgLyogKzEwICovCisJezB4QzI2QSwgMHhDMzZBLCAweDAwMDJ9LCAvKiArMTIgZEIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0cmVibGVfcGFybVsxMl1bOV0gPSB7CisJezB4ODIxRSwgMHhDMjZBLCAweDAzMUUsIDB4QzM2QSwgMHgwMjFFLCAweEQyMDgsIDB4ODMxRSwgMHhEMzA4LCAweDAwMDF9LCAvKiAtMTIgZEIgKi8KKwl7MHg4MjFFLCAweEMyNUIsIDB4MDMxRSwgMHhDMzVCLCAweDAyMUUsIDB4RDIwOCwgMHg4MzFFLCAweEQzMDgsIDB4MDAwMX0sCisJezB4ODIxRSwgMHhDMjRDLCAweDAzMUUsIDB4QzM0QywgMHgwMjFFLCAweEQyMDgsIDB4ODMxRSwgMHhEMzA4LCAweDAwMDF9LAorCXsweDgyMUUsIDB4QzIzRCwgMHgwMzFFLCAweEMzM0QsIDB4MDIxRSwgMHhEMjA4LCAweDgzMUUsIDB4RDMwOCwgMHgwMDAxfSwKKwl7MHg4MjFFLCAweEMyMUYsIDB4MDMxRSwgMHhDMzFGLCAweDAyMUUsIDB4RDIwOCwgMHg4MzFFLCAweEQzMDgsIDB4MDAwMX0sCisJezB4ODIxRSwgMHhEMjA4LCAweDAzMUUsIDB4RDMwOCwgMHgwMjFFLCAweEQyMDgsIDB4ODMxRSwgMHhEMzA4LCAweDAwMDJ9LAorCXsweDgyMUUsIDB4RDIwOCwgMHgwMzFFLCAweEQzMDgsIDB4MDIxRCwgMHhEMjE5LCAweDgzMUQsIDB4RDMxOSwgMHgwMDAyfSwKKwl7MHg4MjFFLCAweEQyMDgsIDB4MDMxRSwgMHhEMzA4LCAweDAyMUMsIDB4RDIyQSwgMHg4MzFDLCAweEQzMkEsIDB4MDAwMn0sCisJezB4ODIxRSwgMHhEMjA4LCAweDAzMUUsIDB4RDMwOCwgMHgwMjFBLCAweEQyNEMsIDB4ODMxQSwgMHhEMzRDLCAweDAwMDJ9LAorCXsweDgyMUUsIDB4RDIwOCwgMHgwMzFFLCAweEQzMDgsIDB4MDIxOSwgMHhEMjZFLCAweDgzMTksIDB4RDM2RSwgMHgwMDAyfSwgLyogKzggKEhXIGRlZmF1bHQpICovCisJezB4ODIxRCwgMHhEMjE5LCAweDAzMUQsIDB4RDMxOSwgMHgwMjE5LCAweEQyNkUsIDB4ODMxOSwgMHhEMzZFLCAweDAwMDJ9LAorCXsweDgyMUMsIDB4RDIyQSwgMHgwMzFDLCAweEQzMkEsIDB4MDIxOSwgMHhEMjZFLCAweDgzMTksIDB4RDM2RSwgMHgwMDAyfSwgLyogKzEyIGRCICovCit9OworCisKKy8qCisgKiBzZXQgRW11ODAwMCBkaWdpdGFsIGVxdWFsaXplcjsgZnJvbSAwIHRvIDExIFstMTJkQiAtIDEyZEJdCisgKi8KK3N0YXRpYyB2b2lkCithd2VfZXF1YWxpemVyKGludCBiYXNzLCBpbnQgdHJlYmxlKQoreworCXVuc2lnbmVkIHNob3J0IHc7CisKKwlpZiAoYmFzcyA8IDAgfHwgYmFzcyA+IDExIHx8IHRyZWJsZSA8IDAgfHwgdHJlYmxlID4gMTEpCisJCXJldHVybjsKKwlhd2VfcG9rZShBV0VfSU5JVDQoMHgwMSksIGJhc3NfcGFybVtiYXNzXVswXSk7CisJYXdlX3Bva2UoQVdFX0lOSVQ0KDB4MTEpLCBiYXNzX3Bhcm1bYmFzc11bMV0pOworCWF3ZV9wb2tlKEFXRV9JTklUMygweDExKSwgdHJlYmxlX3Bhcm1bdHJlYmxlXVswXSk7CisJYXdlX3Bva2UoQVdFX0lOSVQzKDB4MTMpLCB0cmVibGVfcGFybVt0cmVibGVdWzFdKTsKKwlhd2VfcG9rZShBV0VfSU5JVDMoMHgxQiksIHRyZWJsZV9wYXJtW3RyZWJsZV1bMl0pOworCWF3ZV9wb2tlKEFXRV9JTklUNCgweDA3KSwgdHJlYmxlX3Bhcm1bdHJlYmxlXVszXSk7CisJYXdlX3Bva2UoQVdFX0lOSVQ0KDB4MEIpLCB0cmVibGVfcGFybVt0cmVibGVdWzRdKTsKKwlhd2VfcG9rZShBV0VfSU5JVDQoMHgwRCksIHRyZWJsZV9wYXJtW3RyZWJsZV1bNV0pOworCWF3ZV9wb2tlKEFXRV9JTklUNCgweDE3KSwgdHJlYmxlX3Bhcm1bdHJlYmxlXVs2XSk7CisJYXdlX3Bva2UoQVdFX0lOSVQ0KDB4MTkpLCB0cmVibGVfcGFybVt0cmVibGVdWzddKTsKKwl3ID0gYmFzc19wYXJtW2Jhc3NdWzJdICsgdHJlYmxlX3Bhcm1bdHJlYmxlXVs4XTsKKwlhd2VfcG9rZShBV0VfSU5JVDQoMHgxNSksICh1bnNpZ25lZCBzaG9ydCkodyArIDB4MDI2MikpOworCWF3ZV9wb2tlKEFXRV9JTklUNCgweDFEKSwgKHVuc2lnbmVkIHNob3J0KSh3ICsgMHg4MzYyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGF3ZV91cGRhdGVfZXF1YWxpemVyKHZvaWQpCit7CisJYXdlX2VxdWFsaXplcihjdHJsc1tBV0VfTURfQkFTU19MRVZFTF0sIGN0cmxzW0FXRV9NRF9UUkVCTEVfTEVWRUxdKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgQ09ORklHX0FXRTMyX01JRElFTVUKKworLyoKKyAqIEVtdTgwMDAgTUlESSBFbXVsYXRpb24KKyAqLworCisvKgorICogbWlkaSBxdWV1ZSByZWNvcmQKKyAqLworCisvKiBxdWV1ZSB0eXBlICovCitlbnVtIHsgUV9OT05FLCBRX1ZBUkxFTiwgUV9SRUFELCBRX1NZU0VYLCB9OworCisjZGVmaW5lIE1BWF9NSURJQlVGCTY0CisKKy8qIG1pZGkgc3RhdHVzICovCit0eXBlZGVmIHN0cnVjdCBNaWRpU3RhdHVzIHsKKwlpbnQgcXVldWU7CS8qIHF1ZXVlIHR5cGUgKi8KKwlpbnQgcWxlbjsJLyogcXVldWUgbGVuZ3RoICovCisJaW50IHJlYWQ7CS8qIGNoYXJzIHJlYWQgKi8KKwlpbnQgc3RhdHVzOwkvKiBjdXJyZW50IHN0YXR1cyAqLworCWludCBjaGFuOwkvKiBjdXJyZW50IGNoYW5uZWwgKi8KKwl1bnNpZ25lZCBjaGFyIGJ1ZltNQVhfTUlESUJVRl07Cit9IE1pZGlTdGF0dXM7CisKKy8qIE1JREkgbW9kZSB0eXBlICovCitlbnVtIHsgTU9ERV9HTSwgTU9ERV9HUywgTU9ERV9YRywgfTsKKworLyogTlJQTiAvIENDIC0+IEVtdTgwMDAgcGFyYW1ldGVyIGNvbnZlcnRlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBjb250cm9sOworCWludCBhd2VfZWZmZWN0OworCXVuc2lnbmVkIHNob3J0ICgqY29udmVydCkoaW50IHZhbCk7Cit9IENvbnZUYWJsZTsKKworCisvKgorICogcHJvdG90eXBlcworICovCisKK3N0YXRpYyBpbnQgYXdlX21pZGlfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSwgdm9pZCAoKmlucHV0KShpbnQsdW5zaWduZWQgY2hhciksIHZvaWQgKCpvdXRwdXQpKGludCkpOworc3RhdGljIHZvaWQgYXdlX21pZGlfY2xvc2UoaW50IGRldik7CitzdGF0aWMgaW50IGF3ZV9taWRpX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpOworc3RhdGljIGludCBhd2VfbWlkaV9vdXRwdXRjKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKTsKKworc3RhdGljIHZvaWQgaW5pdF9taWRpX3N0YXR1cyhNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgdm9pZCBjbGVhcl9ycG4odm9pZCk7CitzdGF0aWMgdm9pZCBnZXRfbWlkaV9jaGFyKE1pZGlTdGF0dXMgKnN0LCBpbnQgYyk7CisvKnN0YXRpYyB2b2lkIHF1ZXVlX3ZhcmxlbihNaWRpU3RhdHVzICpzdCwgaW50IGMpOyovCitzdGF0aWMgdm9pZCBzcGVjaWFsX2V2ZW50KE1pZGlTdGF0dXMgKnN0LCBpbnQgYyk7CitzdGF0aWMgdm9pZCBxdWV1ZV9yZWFkKE1pZGlTdGF0dXMgKnN0LCBpbnQgYyk7CitzdGF0aWMgdm9pZCBtaWRpX25vdGVfb24oTWlkaVN0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgbWlkaV9ub3RlX29mZihNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgdm9pZCBtaWRpX2tleV9wcmVzc3VyZShNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgdm9pZCBtaWRpX2NoYW5uZWxfcHJlc3N1cmUoTWlkaVN0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgbWlkaV9waXRjaF93aGVlbChNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgdm9pZCBtaWRpX3Byb2dyYW1fY2hhbmdlKE1pZGlTdGF0dXMgKnN0KTsKK3N0YXRpYyB2b2lkIG1pZGlfY29udHJvbF9jaGFuZ2UoTWlkaVN0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgbWlkaV9zZWxlY3RfYmFuayhNaWRpU3RhdHVzICpzdCwgaW50IHZhbCk7CitzdGF0aWMgdm9pZCBtaWRpX25ycG5fZXZlbnQoTWlkaVN0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgbWlkaV9ycG5fZXZlbnQoTWlkaVN0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgbWlkaV9kZXR1bmUoaW50IGNoYW4sIGludCBjb2Fyc2UsIGludCBmaW5lKTsKK3N0YXRpYyB2b2lkIG1pZGlfc3lzdGVtX2V4Y2x1c2l2ZShNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgaW50IHNlbmRfY29udmVydGVkX2VmZmVjdChDb252VGFibGUgKnRhYmxlLCBpbnQgbnVtX3RhYmxlcywgTWlkaVN0YXR1cyAqc3QsIGludCB0eXBlLCBpbnQgdmFsKTsKK3N0YXRpYyBpbnQgYWRkX2NvbnZlcnRlZF9lZmZlY3QoQ29udlRhYmxlICp0YWJsZSwgaW50IG51bV90YWJsZXMsIE1pZGlTdGF0dXMgKnN0LCBpbnQgdHlwZSwgaW50IHZhbCk7CitzdGF0aWMgaW50IHhnX2NvbnRyb2xfY2hhbmdlKE1pZGlTdGF0dXMgKnN0LCBpbnQgY21kLCBpbnQgdmFsKTsKKworI2RlZmluZSBudW1iZXJvZihhcnkpCShzaXplb2YoYXJ5KS9zaXplb2YoYXJ5WzBdKSkKKworCisvKgorICogT1NTIE1pZGkgZGV2aWNlIHJlY29yZAorICovCisKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIGF3ZV9taWRpX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7IkFXRSBNaWRpIEVtdSIsIDAsIDAsIFNORENBUkRfU0J9LAorCS5pbl9pbmZvCT0gezB9LAorCS5vcGVuCQk9IGF3ZV9taWRpX29wZW4sIC8qb3BlbiovCisJLmNsb3NlCQk9IGF3ZV9taWRpX2Nsb3NlLCAvKmNsb3NlKi8KKwkuaW9jdGwJCT0gYXdlX21pZGlfaW9jdGwsIC8qaW9jdGwqLworCS5vdXRwdXRjCT0gYXdlX21pZGlfb3V0cHV0YywgLypvdXRwdXRjKi8KK307CisKK3N0YXRpYyBpbnQgbXlfbWlkaWRldiA9IC0xOworCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX21pZGllbXUodm9pZCkKK3sKKwlpZiAoKG15X21pZGlkZXYgPSBzb3VuZF9hbGxvY19taWRpZGV2KCkpIDwgMCkKKwkJcHJpbnRrICgiU291bmQ6IFRvbyBtYW55IG1pZGkgZGV2aWNlcyBkZXRlY3RlZFxuIik7CisJZWxzZQorCQltaWRpX2RldnNbbXlfbWlkaWRldl0gPSAmYXdlX21pZGlfb3BlcmF0aW9uczsKK30KKworc3RhdGljIHZvaWQgdW5sb2FkX21pZGllbXUodm9pZCkKK3sKKwlpZiAobXlfbWlkaWRldiA+PSAwKQorCQlzb3VuZF91bmxvYWRfbWlkaWRldihteV9taWRpZGV2KTsKK30KKworCisvKgorICogb3Blbi9jbG9zZSBtaWRpIGRldmljZQorICovCisKK3N0YXRpYyBpbnQgbWlkaV9vcGVuZWQgPSBGQUxTRTsKKworc3RhdGljIGludCBtaWRpX21vZGU7CitzdGF0aWMgaW50IGNvYXJzZXR1bmUsIGZpbmV0dW5lOworCitzdGF0aWMgaW50IHhnX21hcHBpbmcgPSBUUlVFOworc3RhdGljIGludCB4Z19iYW5rbW9kZTsKKworLyogZWZmZWN0IHNlbnNpdGl2aXR5ICovCisKKyNkZWZpbmUgRlhfQ1VUT0ZGCTAKKyNkZWZpbmUgRlhfUkVTT05BTkNFCTEKKyNkZWZpbmUgRlhfQVRUQUNLCTIKKyNkZWZpbmUgRlhfUkVMRUFTRQkzCisjZGVmaW5lIEZYX1ZJQlJBVEUJNAorI2RlZmluZSBGWF9WSUJERVBUSAk1CisjZGVmaW5lIEZYX1ZJQkRFTEFZCTYKKyNkZWZpbmUgRlhfTlVNUwkJNworCisjZGVmaW5lIERFRl9GWF9DVVRPRkYJCTE3MAorI2RlZmluZSBERUZfRlhfUkVTT05BTkNFCTYKKyNkZWZpbmUgREVGX0ZYX0FUVEFDSwkJNTAKKyNkZWZpbmUgREVGX0ZYX1JFTEVBU0UJCTUwCisjZGVmaW5lIERFRl9GWF9WSUJSQVRFCQkzMAorI2RlZmluZSBERUZfRlhfVklCREVQVEgJCTQKKyNkZWZpbmUgREVGX0ZYX1ZJQkRFTEFZCQkxNTAwCisKKy8qIGVmZmVjdCBzZW5zZTogKi8KK3N0YXRpYyBpbnQgZ3Nfc2Vuc2VbXSA9IAoreworCURFRl9GWF9DVVRPRkYsIERFRl9GWF9SRVNPTkFOQ0UsIERFRl9GWF9BVFRBQ0ssIERFRl9GWF9SRUxFQVNFLAorCURFRl9GWF9WSUJSQVRFLCBERUZfRlhfVklCREVQVEgsIERFRl9GWF9WSUJERUxBWQorfTsKK3N0YXRpYyBpbnQgeGdfc2Vuc2VbXSA9IAoreworCURFRl9GWF9DVVRPRkYsIERFRl9GWF9SRVNPTkFOQ0UsIERFRl9GWF9BVFRBQ0ssIERFRl9GWF9SRUxFQVNFLAorCURFRl9GWF9WSUJSQVRFLCBERUZfRlhfVklCREVQVEgsIERFRl9GWF9WSUJERUxBWQorfTsKKworCisvKiBjdXJyZW50IHN0YXR1cyAqLworc3RhdGljIE1pZGlTdGF0dXMgY3Vyc3Q7CisKKworc3RhdGljIGludAorYXdlX21pZGlfb3BlbiAoaW50IGRldiwgaW50IG1vZGUsCisJICAgICAgIHZvaWQgKCppbnB1dCkoaW50LHVuc2lnbmVkIGNoYXIpLAorCSAgICAgICB2b2lkICgqb3V0cHV0KShpbnQpKQoreworCWlmIChtaWRpX29wZW5lZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1pZGlfb3BlbmVkID0gVFJVRTsKKworCW1pZGlfbW9kZSA9IE1PREVfR007CisKKwljdXJzdC5xdWV1ZSA9IFFfTk9ORTsKKwljdXJzdC5xbGVuID0gMDsKKwljdXJzdC5yZWFkID0gMDsKKwljdXJzdC5zdGF0dXMgPSAwOworCWN1cnN0LmNoYW4gPSAwOworCW1lbXNldChjdXJzdC5idWYsIDAsIHNpemVvZihjdXJzdC5idWYpKTsKKworCWluaXRfbWlkaV9zdGF0dXMoJmN1cnN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYXdlX21pZGlfY2xvc2UgKGludCBkZXYpCit7CisJbWlkaV9vcGVuZWQgPSBGQUxTRTsKK30KKworCitzdGF0aWMgaW50Cithd2VfbWlkaV9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXJldHVybiAtRVBFUk07Cit9CisKK3N0YXRpYyBpbnQKK2F3ZV9taWRpX291dHB1dGMgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKQoreworCWlmICghIG1pZGlfb3BlbmVkKQorCQlyZXR1cm4gMTsKKworCS8qIGZvcmNlIHRvIGNoYW5nZSBwbGF5aW5nIG1vZGUgKi8KKwlwbGF5aW5nX21vZGUgPSBBV0VfUExBWV9NVUxUSTsKKworCWdldF9taWRpX2NoYXIoJmN1cnN0LCBtaWRpX2J5dGUpOworCXJldHVybiAxOworfQorCisKKy8qCisgKiBpbml0aWFsaXplCisgKi8KKworc3RhdGljIHZvaWQgaW5pdF9taWRpX3N0YXR1cyhNaWRpU3RhdHVzICpzdCkKK3sKKwljbGVhcl9ycG4oKTsKKwljb2Fyc2V0dW5lID0gMDsKKwlmaW5ldHVuZSA9IDA7Cit9CisKKworLyoKKyAqIFJQTiAmIE5SUE4KKyAqLworCisjZGVmaW5lIE1BWF9NSURJX0NIQU5ORUxTCTE2CisKKy8qIFJQTiAmIE5SUE4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5ycG5bTUFYX01JRElfQ0hBTk5FTFNdOyAgLyogY3VycmVudCBldmVudCBpcyBOUlBOPyAqLworc3RhdGljIGludCBtc2JfYml0OyAgLyogY3VycmVudCBldmVudCBpcyBtc2IgZm9yIFJQTi9OUlBOICovCisvKiBSUE4gJiBOUlBOIGluZGVjZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJwbl9tc2JbTUFYX01JRElfQ0hBTk5FTFNdLCBycG5fbHNiW01BWF9NSURJX0NIQU5ORUxTXTsKKy8qIFJQTiAmIE5SUE4gdmFsdWVzICovCitzdGF0aWMgaW50IHJwbl92YWxbTUFYX01JRElfQ0hBTk5FTFNdOworCitzdGF0aWMgdm9pZCBjbGVhcl9ycG4odm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX01JRElfQ0hBTk5FTFM7IGkrKykgeworCQlucnBuW2ldID0gMDsKKwkJcnBuX21zYltpXSA9IDEyNzsKKwkJcnBuX2xzYltpXSA9IDEyNzsKKwkJcnBuX3ZhbFtpXSA9IDA7CisJfQorCW1zYl9iaXQgPSAwOworfQorCisKKy8qCisgKiBwcm9jZXNzIG1pZGkgcXVldWUKKyAqLworCisvKiBzdGF0dXMgZXZlbnQgdHlwZXMgKi8KK3R5cGVkZWYgdm9pZCAoKlN0YXR1c0V2ZW50KShNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgc3RydWN0IFN0YXR1c0V2ZW50TGlzdCB7CisJU3RhdHVzRXZlbnQgcHJvY2VzczsKKwlpbnQgcWxlbjsKK30gc3RhdHVzX2V2ZW50WzhdID0geworCXttaWRpX25vdGVfb2ZmLCAyfSwKKwl7bWlkaV9ub3RlX29uLCAyfSwKKwl7bWlkaV9rZXlfcHJlc3N1cmUsIDJ9LAorCXttaWRpX2NvbnRyb2xfY2hhbmdlLCAyfSwKKwl7bWlkaV9wcm9ncmFtX2NoYW5nZSwgMX0sCisJe21pZGlfY2hhbm5lbF9wcmVzc3VyZSwgMX0sCisJe21pZGlfcGl0Y2hfd2hlZWwsIDJ9LAorCXtOVUxMLCAwfSwKK307CisKKworLyogcmVhZCBhIGNoYXIgZnJvbSBmaWZvIGFuZCBwcm9jZXNzIGl0ICovCitzdGF0aWMgdm9pZCBnZXRfbWlkaV9jaGFyKE1pZGlTdGF0dXMgKnN0LCBpbnQgYykKK3sKKwlpZiAoYyA9PSAweGZlKSB7CisJCS8qIGlnbm9yZSBhY3RpdmUgc2Vuc2UgKi8KKwkJc3QtPnF1ZXVlID0gUV9OT05FOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChzdC0+cXVldWUpIHsKKwkvKiBjYXNlIFFfVkFSTEVOOiBxdWV1ZV92YXJsZW4oc3QsIGMpOyBicmVhazsqLworCWNhc2UgUV9SRUFEOgorCWNhc2UgUV9TWVNFWDoKKwkJcXVldWVfcmVhZChzdCwgYyk7CisJCWJyZWFrOworCWNhc2UgUV9OT05FOgorCQlzdC0+cmVhZCA9IDA7CisJCWlmICgoYyAmIDB4ZjApID09IDB4ZjApIHsKKwkJCXNwZWNpYWxfZXZlbnQoc3QsIGMpOworCQl9IGVsc2UgaWYgKGMgJiAweDgwKSB7IC8qIHN0YXR1cyBjaGFuZ2UgKi8KKwkJCXN0LT5zdGF0dXMgPSAoYyA+PiA0KSAmIDB4MDc7CisJCQlzdC0+Y2hhbiA9IGMgJiAweDBmOworCQkJc3QtPnF1ZXVlID0gUV9SRUFEOworCQkJc3QtPnFsZW4gPSBzdGF0dXNfZXZlbnRbc3QtPnN0YXR1c10ucWxlbjsKKwkJCWlmIChzdC0+cWxlbiA9PSAwKQorCQkJCXN0LT5xdWV1ZSA9IFFfTk9ORTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qIDB4ZnggZXZlbnRzICovCitzdGF0aWMgdm9pZCBzcGVjaWFsX2V2ZW50KE1pZGlTdGF0dXMgKnN0LCBpbnQgYykKK3sKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIDB4ZjA6IC8qIHN5c3RlbSBleGNsdXNpdmUgKi8KKwkJc3QtPnF1ZXVlID0gUV9TWVNFWDsKKwkJc3QtPnFsZW4gPSAwOworCQlicmVhazsKKwljYXNlIDB4ZjE6IC8qIE1UQyBxdWFydGVyIGZyYW1lICovCisJY2FzZSAweGYzOiAvKiBzb25nIHNlbGVjdCAqLworCQlzdC0+cXVldWUgPSBRX1JFQUQ7CisJCXN0LT5xbGVuID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweGYyOiAvKiBzb25nIHBvc2l0aW9uICovCisJCXN0LT5xdWV1ZSA9IFFfUkVBRDsKKwkJc3QtPnFsZW4gPSAyOworCQlicmVhazsKKwl9Cit9CisKKyNpZiAwCisvKiByZWFkIHZhcmlhYmxlIGxlbmd0aCB2YWx1ZSAqLworc3RhdGljIHZvaWQgcXVldWVfdmFybGVuKE1pZGlTdGF0dXMgKnN0LCBpbnQgYykKK3sKKwlzdC0+cWxlbiArPSAoYyAmIDB4N2YpOworCWlmIChjICYgMHg4MCkgeworCQlzdC0+cWxlbiA8PD0gNzsKKwkJcmV0dXJuOworCX0KKwlpZiAoc3QtPnFsZW4gPD0gMCkgeworCQlzdC0+cWxlbiA9IDA7CisJCXN0LT5xdWV1ZSA9IFFfTk9ORTsKKwl9CisJc3QtPnF1ZXVlID0gUV9SRUFEOworCXN0LT5yZWFkID0gMDsKK30KKyNlbmRpZgorCisKKy8qIHJlYWQgYSBjaGFyICovCitzdGF0aWMgdm9pZCBxdWV1ZV9yZWFkKE1pZGlTdGF0dXMgKnN0LCBpbnQgYykKK3sKKwlpZiAoc3QtPnJlYWQgPCBNQVhfTUlESUJVRikgeworCQlpZiAoc3QtPnF1ZXVlICE9IFFfU1lTRVgpCisJCQljICY9IDB4N2Y7CisJCXN0LT5idWZbc3QtPnJlYWRdID0gKHVuc2lnbmVkIGNoYXIpYzsKKwl9CisJc3QtPnJlYWQrKzsKKwlpZiAoc3QtPnF1ZXVlID09IFFfU1lTRVggJiYgYyA9PSAweGY3KSB7CisJCW1pZGlfc3lzdGVtX2V4Y2x1c2l2ZShzdCk7CisJCXN0LT5xdWV1ZSA9IFFfTk9ORTsKKwl9IGVsc2UgaWYgKHN0LT5xdWV1ZSA9PSBRX1JFQUQgJiYgc3QtPnJlYWQgPj0gc3QtPnFsZW4pIHsKKwkJaWYgKHN0YXR1c19ldmVudFtzdC0+c3RhdHVzXS5wcm9jZXNzKQorCQkJc3RhdHVzX2V2ZW50W3N0LT5zdGF0dXNdLnByb2Nlc3Moc3QpOworCQlzdC0+cXVldWUgPSBRX05PTkU7CisJfQorfQorCisKKy8qCisgKiBzdGF0dXMgZXZlbnRzCisgKi8KKworLyogbm90ZSBvbiAqLworc3RhdGljIHZvaWQgbWlkaV9ub3RlX29uKE1pZGlTdGF0dXMgKnN0KQoreworCURFQlVHKDIscHJpbnRrKCJtaWRpOiBub3RlX29uICglZCkgJWQgJWRcbiIsIHN0LT5jaGFuLCBzdC0+YnVmWzBdLCBzdC0+YnVmWzFdKSk7CisJaWYgKHN0LT5idWZbMV0gPT0gMCkKKwkJbWlkaV9ub3RlX29mZihzdCk7CisJZWxzZQorCQlhd2Vfc3RhcnRfbm90ZSgwLCBzdC0+Y2hhbiwgc3QtPmJ1ZlswXSwgc3QtPmJ1ZlsxXSk7Cit9CisKKy8qIG5vdGUgb2ZmICovCitzdGF0aWMgdm9pZCBtaWRpX25vdGVfb2ZmKE1pZGlTdGF0dXMgKnN0KQoreworCURFQlVHKDIscHJpbnRrKCJtaWRpOiBub3RlX29mZiAoJWQpICVkICVkXG4iLCBzdC0+Y2hhbiwgc3QtPmJ1ZlswXSwgc3QtPmJ1ZlsxXSkpOworCWF3ZV9raWxsX25vdGUoMCwgc3QtPmNoYW4sIHN0LT5idWZbMF0sIHN0LT5idWZbMV0pOworfQorCisvKiBrZXkgcHJlc3N1cmUgY2hhbmdlICovCitzdGF0aWMgdm9pZCBtaWRpX2tleV9wcmVzc3VyZShNaWRpU3RhdHVzICpzdCkKK3sKKwlhd2Vfa2V5X3ByZXNzdXJlKDAsIHN0LT5jaGFuLCBzdC0+YnVmWzBdLCBzdC0+YnVmWzFdKTsKK30KKworLyogY2hhbm5lbCBwcmVzc3VyZSBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIG1pZGlfY2hhbm5lbF9wcmVzc3VyZShNaWRpU3RhdHVzICpzdCkKK3sKKwljaGFubmVsc1tzdC0+Y2hhbl0uY2hhbl9wcmVzcyA9IHN0LT5idWZbMF07CisJYXdlX21vZHdoZWVsX2NoYW5nZShzdC0+Y2hhbiwgc3QtPmJ1ZlswXSk7Cit9CisKKy8qIHBpdGNoIHdoZWVsIGNoYW5nZSAqLworc3RhdGljIHZvaWQgbWlkaV9waXRjaF93aGVlbChNaWRpU3RhdHVzICpzdCkKK3sKKwlpbnQgdmFsID0gKGludClzdC0+YnVmWzFdICogMTI4ICsgc3QtPmJ1ZlswXTsKKwlhd2VfYmVuZGVyKDAsIHN0LT5jaGFuLCB2YWwpOworfQorCisvKiBwcm9ncmFtIGNoYW5nZSAqLworc3RhdGljIHZvaWQgbWlkaV9wcm9ncmFtX2NoYW5nZShNaWRpU3RhdHVzICpzdCkKK3sKKwlpbnQgcHJlc2V0OworCXByZXNldCA9IHN0LT5idWZbMF07CisJaWYgKG1pZGlfbW9kZSA9PSBNT0RFX0dTICYmIElTX0RSVU1fQ0hBTk5FTChzdC0+Y2hhbikgJiYgcHJlc2V0ID09IDEyNykKKwkJcHJlc2V0ID0gMDsKKwllbHNlIGlmIChtaWRpX21vZGUgPT0gTU9ERV9YRyAmJiB4Z19tYXBwaW5nICYmIElTX0RSVU1fQ0hBTk5FTChzdC0+Y2hhbikpCisJCXByZXNldCArPSA2NDsKKworCWF3ZV9zZXRfaW5zdHIoMCwgc3QtPmNoYW4sIHByZXNldCk7Cit9CisKKyNkZWZpbmUgc2VuZF9lZmZlY3QoY2hhbix0eXBlLHZhbCkgYXdlX3NlbmRfZWZmZWN0KGNoYW4sLTEsdHlwZSx2YWwpCisjZGVmaW5lIGFkZF9lZmZlY3QoY2hhbix0eXBlLHZhbCkgYXdlX3NlbmRfZWZmZWN0KGNoYW4sLTEsKHR5cGUpfDB4ODAsdmFsKQorI2RlZmluZSB1bnNldF9lZmZlY3QoY2hhbix0eXBlKSBhd2Vfc2VuZF9lZmZlY3QoY2hhbiwtMSwodHlwZSl8MHg0MCwwKQorCisvKiBtaWRpIGNvbnRyb2wgY2hhbmdlICovCitzdGF0aWMgdm9pZCBtaWRpX2NvbnRyb2xfY2hhbmdlKE1pZGlTdGF0dXMgKnN0KQoreworCWludCBjbWQgPSBzdC0+YnVmWzBdOworCWludCB2YWwgPSBzdC0+YnVmWzFdOworCisJREVCVUcoMixwcmludGsoIm1pZGk6IGNvbnRyb2wgKCVkKSAlZCAlZFxuIiwgc3QtPmNoYW4sIGNtZCwgdmFsKSk7CisJaWYgKG1pZGlfbW9kZSA9PSBNT0RFX1hHKSB7CisJCWlmICh4Z19jb250cm9sX2NoYW5nZShzdCwgY21kLCB2YWwpKQorCQkJcmV0dXJuOworCX0KKworCS8qIGNvbnRyb2xzICMzMSAtICM2NCBhcmUgTFNCIG9mICMwIC0gIzMxICovCisJbXNiX2JpdCA9IDE7CisJaWYgKGNtZCA+PSAweDIwICYmIGNtZCA8IDB4NDApIHsKKwkJbXNiX2JpdCA9IDA7CisJCWNtZCAtPSAweDIwOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDVExfU09GVF9QRURBTDoKKwkJaWYgKHZhbCA9PSAxMjcpCisJCQlhZGRfZWZmZWN0KHN0LT5jaGFuLCBBV0VfRlhfQ1VUT0ZGLCAtMTYwKTsKKwkJZWxzZQorCQkJdW5zZXRfZWZmZWN0KHN0LT5jaGFuLCBBV0VfRlhfQ1VUT0ZGKTsKKwkJYnJlYWs7CisKKwljYXNlIENUTF9CQU5LX1NFTEVDVDoKKwkJbWlkaV9zZWxlY3RfYmFuayhzdCwgdmFsKTsKKwkJYnJlYWs7CisJCQorCS8qIHNldCBSUE4vTlJQTiBwYXJhbWV0ZXIgKi8KKwljYXNlIENUTF9SRUdJU1RfUEFSTV9OVU1fTVNCOgorCQlucnBuW3N0LT5jaGFuXT0wOyBycG5fbXNiW3N0LT5jaGFuXT12YWw7CisJCWJyZWFrOworCWNhc2UgQ1RMX1JFR0lTVF9QQVJNX05VTV9MU0I6CisJCW5ycG5bc3QtPmNoYW5dPTA7IHJwbl9sc2Jbc3QtPmNoYW5dPXZhbDsKKwkJYnJlYWs7CisJY2FzZSBDVExfTk9OUkVHX1BBUk1fTlVNX01TQjoKKwkJbnJwbltzdC0+Y2hhbl09MTsgcnBuX21zYltzdC0+Y2hhbl09dmFsOworCQlicmVhazsKKwljYXNlIENUTF9OT05SRUdfUEFSTV9OVU1fTFNCOgorCQlucnBuW3N0LT5jaGFuXT0xOyBycG5fbHNiW3N0LT5jaGFuXT12YWw7CisJCWJyZWFrOworCisJLyogc2VuZCBSUE4vTlJQTiBlbnRyeSAqLworCWNhc2UgQ1RMX0RBVEFfRU5UUlk6CisJCWlmIChtc2JfYml0KQorCQkJcnBuX3ZhbFtzdC0+Y2hhbl0gPSB2YWwgKiAxMjg7CisJCWVsc2UKKwkJCXJwbl92YWxbc3QtPmNoYW5dIHw9IHZhbDsKKwkJaWYgKG5ycG5bc3QtPmNoYW5dKQorCQkJbWlkaV9ucnBuX2V2ZW50KHN0KTsKKwkJZWxzZQorCQkJbWlkaV9ycG5fZXZlbnQoc3QpOworCQlicmVhazsKKworCS8qIGluY3JlYXNlL2RlY3JlYXNlIGRhdGEgZW50cnkgKi8KKwljYXNlIENUTF9EQVRBX0lOQ1JFTUVOVDoKKwkJcnBuX3ZhbFtzdC0+Y2hhbl0rKzsKKwkJbWlkaV9ycG5fZXZlbnQoc3QpOworCQlicmVhazsKKwljYXNlIENUTF9EQVRBX0RFQ1JFTUVOVDoKKwkJcnBuX3ZhbFtzdC0+Y2hhbl0tLTsKKwkJbWlkaV9ycG5fZXZlbnQoc3QpOworCQlicmVhazsKKworCS8qIGRlZmF1bHQgKi8KKwlkZWZhdWx0OgorCQlhd2VfY29udHJvbGxlcigwLCBzdC0+Y2hhbiwgY21kLCB2YWwpOworCQlicmVhazsKKwl9Cit9CisKKy8qIHRvbmUgYmFuayBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIG1pZGlfc2VsZWN0X2JhbmsoTWlkaVN0YXR1cyAqc3QsIGludCB2YWwpCit7CisJaWYgKG1pZGlfbW9kZSA9PSBNT0RFX1hHICYmIG1zYl9iaXQpIHsKKwkJeGdfYmFua21vZGUgPSB2YWw7CisJCS8qIFhHIE1TQiB2YWx1ZTsgbm90IG5vcm1hbCBiYW5rIHNlbGVjdGlvbiAqLworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIDEyNzogLyogcmVtYXAgdG8gZHJ1bSBjaGFubmVsICovCisJCQlhd2VfY29udHJvbGxlcigwLCBzdC0+Y2hhbiwgQ1RMX0JBTktfU0VMRUNULCAxMjgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIHJlbWFwIHRvIG5vcm1hbCBjaGFubmVsICovCisJCQlhd2VfY29udHJvbGxlcigwLCBzdC0+Y2hhbiwgQ1RMX0JBTktfU0VMRUNULCB2YWwpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuOworCX0gZWxzZSBpZiAobWlkaV9tb2RlID09IE1PREVfR1MgJiYgIW1zYl9iaXQpCisJCS8qIGlnbm9yZSBMU0IgYmFuayBpbiBHUyBtb2RlICh1c2VkIGZvciBtYXBwaW5nKSAqLworCQlyZXR1cm47CisKKwkvKiBub3JtYWwgYmFuayBjb250cm9sczsgYWNjZXB0IGJvdGggTVNCIGFuZCBMU0IgKi8KKwlpZiAoISBJU19EUlVNX0NIQU5ORUwoc3QtPmNoYW4pKSB7CisJCWlmIChtaWRpX21vZGUgPT0gTU9ERV9YRykgeworCQkJaWYgKHhnX2Jhbmttb2RlKSByZXR1cm47CisJCQlpZiAodmFsID09IDY0IHx8IHZhbCA9PSAxMjYpCisJCQkJdmFsID0gMDsKKwkJfSBlbHNlIGlmIChtaWRpX21vZGUgPT0gTU9ERV9HUyAmJiB2YWwgPT0gMTI3KQorCQkJdmFsID0gMDsKKwkJYXdlX2NvbnRyb2xsZXIoMCwgc3QtPmNoYW4sIENUTF9CQU5LX1NFTEVDVCwgdmFsKTsKKwl9Cit9CisKKworLyoKKyAqIFJQTiBldmVudHMKKyAqLworCitzdGF0aWMgdm9pZCBtaWRpX3Jwbl9ldmVudChNaWRpU3RhdHVzICpzdCkKK3sKKwlpbnQgdHlwZTsKKwl0eXBlID0gKHJwbl9tc2Jbc3QtPmNoYW5dPDw4KSB8IHJwbl9sc2Jbc3QtPmNoYW5dOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMHgwMDAwOiAvKiBQaXRjaCBiZW5kIHNlbnNpdGl2aXR5ICovCisJCS8qIE1TQiBvbmx5IC8gMSBzZW1pdG9uZSBwZXIgMTI4ICovCisJCWlmIChtc2JfYml0KSB7CisJCQljaGFubmVsc1tzdC0+Y2hhbl0uYmVuZGVyX3JhbmdlID0gCisJCQkJcnBuX3ZhbFtzdC0+Y2hhbl0gKiAxMDAgLyAxMjg7CisJCX0KKwkJYnJlYWs7CisJCQkJCQorCWNhc2UgMHgwMDAxOiAvKiBmaW5lIHR1bmluZzogKi8KKwkJLyogTVNCL0xTQiwgODE5Mj1jZW50ZXIsIDEwMC84MTkyIGNlbnQgc3RlcCAqLworCQlmaW5ldHVuZSA9IHJwbl92YWxbc3QtPmNoYW5dIC0gODE5MjsKKwkJbWlkaV9kZXR1bmUoc3QtPmNoYW4sIGNvYXJzZXR1bmUsIGZpbmV0dW5lKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDAwMjogLyogY29hcnNlIHR1bmluZyAqLworCQkvKiBNU0Igb25seSAvIDgxOTI9Y2VudGVyLCAxIHNlbWl0b25lIHBlciAxMjggKi8KKwkJaWYgKG1zYl9iaXQpIHsKKwkJCWNvYXJzZXR1bmUgPSBycG5fdmFsW3N0LT5jaGFuXSAtIDgxOTI7CisJCQltaWRpX2RldHVuZShzdC0+Y2hhbiwgY29hcnNldHVuZSwgZmluZXR1bmUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSAweDdGN0Y6IC8qICJsb2NrLWluIiBSUE4gKi8KKwkJYnJlYWs7CisJfQorfQorCisKKy8qIHR1bmluZzoKKyAqICAgY29hcnNlID0gLTgxOTIgdG8gODE5MiAoMTAwIGNlbnQgcGVyIDEyOCkKKyAqICAgZmluZSA9IC04MTkyIHRvIDgxOTIgKG1heD0xMDBjZW50KQorICovCitzdGF0aWMgdm9pZCBtaWRpX2RldHVuZShpbnQgY2hhbiwgaW50IGNvYXJzZSwgaW50IGZpbmUpCit7CisJLyogNDA5NiA9IDEyMDAgY2VudHMgaW4gQVdFIHBhcmFtZXRlciAqLworCWludCB2YWw7CisJdmFsID0gY29hcnNlICogNDA5NiAvICgxMiAqIDEyOCk7CisJdmFsICs9IGZpbmUgLyAyNDsKKwlpZiAodmFsKQorCQlzZW5kX2VmZmVjdChjaGFuLCBBV0VfRlhfSU5JVF9QSVRDSCwgdmFsKTsKKwllbHNlCisJCXVuc2V0X2VmZmVjdChjaGFuLCBBV0VfRlhfSU5JVF9QSVRDSCk7Cit9CisKKworLyoKKyAqIHN5c3RlbSBleGNsdXNpdmUgbWVzc2FnZQorICogR00vR1MvWEcgbWFjcm9zIGFyZSBhY2NlcHRlZAorICovCisKK3N0YXRpYyB2b2lkIG1pZGlfc3lzdGVtX2V4Y2x1c2l2ZShNaWRpU3RhdHVzICpzdCkKK3sKKwkvKiBHTSBvbiAqLworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGdtX29uX21hY3JvW10gPSB7CisJCTB4N2UsMHg3ZiwweDA5LDB4MDEsCisJfTsKKwkvKiBYRyBvbiAqLworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHhnX29uX21hY3JvW10gPSB7CisJCTB4NDMsMHgxMCwweDRjLDB4MDAsMHgwMCwweDdlLDB4MDAsCisJfTsKKwkvKiBHUyBwcmVmaXgKKwkgKiBkcnVtIGNoYW5uZWw6IFhYPTB4MT8oY2hhbm5lbCksIFlZPTB4MTUsIFpaPW9uL29mZgorCSAqIHJldmVyYiBtb2RlOiBYWD0weDAxLCBZWT0weDMwLCBaWj0wLTcKKwkgKiBjaG9ydXMgbW9kZTogWFg9MHgwMSwgWVk9MHgzOCwgWlo9MC03CisJICovCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3NfcGZ4X21hY3JvW10gPSB7CisJCTB4NDEsMHgxMCwweDQyLDB4MTIsMHg0MCwvKlhYLFlZLFpaKi8KKwl9OworCisjaWYgMAorCS8qIFNDODggc3lzdGVtIG1vZGUgc2V0CisJICogc2luZ2xlIG1vZHVsZSBtb2RlOiBYWD0xCisJICogZG91YmxlIG1vZHVsZSBtb2RlOiBYWD0wCisJICovCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3NfbW9kZV9tYWNyb1tdID0geworCQkweDQxLDB4MTAsMHg0MiwweDEyLDB4MDAsMHgwMCwweDdGLC8qWloqLworCX07CisJLyogU0M4OCBkaXNwbGF5IG1hY3JvOiBYWD0wMTpiaXRtYXAsIDAwOnRleHQKKwkgKi8KKwlzdGF0aWMgdW5zaWduZWQgY2hhciBnc19kaXNwX21hY3JvW10gPSB7CisJCTB4NDEsMHgxMCwweDQ1LDB4MTIsMHgxMCwvKlhYLDAwKi8KKwl9OworI2VuZGlmCisKKwkvKiBHTSBvbiAqLworCWlmIChtZW1jbXAoc3QtPmJ1ZiwgZ21fb25fbWFjcm8sIHNpemVvZihnbV9vbl9tYWNybykpID09IDApIHsKKwkJaWYgKG1pZGlfbW9kZSAhPSBNT0RFX0dTICYmIG1pZGlfbW9kZSAhPSBNT0RFX1hHKQorCQkJbWlkaV9tb2RlID0gTU9ERV9HTTsKKwkJaW5pdF9taWRpX3N0YXR1cyhzdCk7CisJfQorCisJLyogR1MgbWFjcm9zICovCisJZWxzZSBpZiAobWVtY21wKHN0LT5idWYsIGdzX3BmeF9tYWNybywgc2l6ZW9mKGdzX3BmeF9tYWNybykpID09IDApIHsKKwkJaWYgKG1pZGlfbW9kZSAhPSBNT0RFX0dTICYmIG1pZGlfbW9kZSAhPSBNT0RFX1hHKQorCQkJbWlkaV9tb2RlID0gTU9ERV9HUzsKKworCQlpZiAoc3QtPmJ1Zls1XSA9PSAweDAwICYmIHN0LT5idWZbNl0gPT0gMHg3ZiAmJiBzdC0+YnVmWzddID09IDB4MDApIHsKKwkJCS8qIEdTIHJlc2V0ICovCisJCQlpbml0X21pZGlfc3RhdHVzKHN0KTsKKwkJfQorCisJCWVsc2UgaWYgKChzdC0+YnVmWzVdICYgMHhmMCkgPT0gMHgxMCAmJiBzdC0+YnVmWzZdID09IDB4MTUpIHsKKwkJCS8qIGRydW0gcGF0dGVybiAqLworCQkJaW50IHAgPSBzdC0+YnVmWzVdICYgMHgwZjsKKwkJCWlmIChwID09IDApIHAgPSA5OworCQkJZWxzZSBpZiAocCA8IDEwKSBwLS07CisJCQlpZiAoc3QtPmJ1Zls3XSA9PSAwKQorCQkJCURSVU1fQ0hBTk5FTF9PRkYocCk7CisJCQllbHNlCisJCQkJRFJVTV9DSEFOTkVMX09OKHApOworCisJCX0gZWxzZSBpZiAoKHN0LT5idWZbNV0gJiAweGYwKSA9PSAweDEwICYmIHN0LT5idWZbNl0gPT0gMHgyMSkgeworCQkJLyogcHJvZ3JhbSAqLworCQkJaW50IHAgPSBzdC0+YnVmWzVdICYgMHgwZjsKKwkJCWlmIChwID09IDApIHAgPSA5OworCQkJZWxzZSBpZiAocCA8IDEwKSBwLS07CisJCQlpZiAoISBJU19EUlVNX0NIQU5ORUwocCkpCisJCQkJYXdlX3NldF9pbnN0cigwLCBwLCBzdC0+YnVmWzddKTsKKworCQl9IGVsc2UgaWYgKHN0LT5idWZbNV0gPT0gMHgwMSAmJiBzdC0+YnVmWzZdID09IDB4MzApIHsKKwkJCS8qIHJldmVyYiBtb2RlICovCisJCQlhd2Vfc2V0X3JldmVyYl9tb2RlKHN0LT5idWZbN10pOworCisJCX0gZWxzZSBpZiAoc3QtPmJ1Zls1XSA9PSAweDAxICYmIHN0LT5idWZbNl0gPT0gMHgzOCkgeworCQkJLyogY2hvcnVzIG1vZGUgKi8KKwkJCWF3ZV9zZXRfY2hvcnVzX21vZGUoc3QtPmJ1Zls3XSk7CisKKwkJfSBlbHNlIGlmIChzdC0+YnVmWzVdID09IDB4MDAgJiYgc3QtPmJ1Zls2XSA9PSAweDA0KSB7CisJCQkvKiBtYXN0ZXIgdm9sdW1lICovCisJCQlhd2VfY2hhbmdlX21hc3Rlcl92b2x1bWUoc3QtPmJ1Zls3XSk7CisKKwkJfQorCX0KKworCS8qIFhHIG9uICovCisJZWxzZSBpZiAobWVtY21wKHN0LT5idWYsIHhnX29uX21hY3JvLCBzaXplb2YoeGdfb25fbWFjcm8pKSA9PSAwKSB7CisJCW1pZGlfbW9kZSA9IE1PREVfWEc7CisJCXhnX21hcHBpbmcgPSBUUlVFOworCQl4Z19iYW5rbW9kZSA9IDA7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBjb252ZXJ0IE5SUE4vY29udHJvbCB2YWx1ZXMKKyAqLworCitzdGF0aWMgaW50IHNlbmRfY29udmVydGVkX2VmZmVjdChDb252VGFibGUgKnRhYmxlLCBpbnQgbnVtX3RhYmxlcywgTWlkaVN0YXR1cyAqc3QsIGludCB0eXBlLCBpbnQgdmFsKQoreworCWludCBpLCBjdmFsOworCWZvciAoaSA9IDA7IGkgPCBudW1fdGFibGVzOyBpKyspIHsKKwkJaWYgKHRhYmxlW2ldLmNvbnRyb2wgPT0gdHlwZSkgeworCQkJY3ZhbCA9IHRhYmxlW2ldLmNvbnZlcnQodmFsKTsKKwkJCXNlbmRfZWZmZWN0KHN0LT5jaGFuLCB0YWJsZVtpXS5hd2VfZWZmZWN0LCBjdmFsKTsKKwkJCXJldHVybiBUUlVFOworCQl9CisJfQorCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCBhZGRfY29udmVydGVkX2VmZmVjdChDb252VGFibGUgKnRhYmxlLCBpbnQgbnVtX3RhYmxlcywgTWlkaVN0YXR1cyAqc3QsIGludCB0eXBlLCBpbnQgdmFsKQoreworCWludCBpLCBjdmFsOworCWZvciAoaSA9IDA7IGkgPCBudW1fdGFibGVzOyBpKyspIHsKKwkJaWYgKHRhYmxlW2ldLmNvbnRyb2wgPT0gdHlwZSkgeworCQkJY3ZhbCA9IHRhYmxlW2ldLmNvbnZlcnQodmFsKTsKKwkJCWFkZF9lZmZlY3Qoc3QtPmNoYW4sIHRhYmxlW2ldLmF3ZV9lZmZlY3R8MHg4MCwgY3ZhbCk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKyAqIEFXRTMyIE5SUE4gZWZmZWN0cworICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF9kZWxheShpbnQgdmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF9hdHRhY2soaW50IHZhbCk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZnhfaG9sZChpbnQgdmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF9kZWNheShpbnQgdmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF90aGVfdmFsdWUoaW50IHZhbCk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZnhfdHdpY2VfdmFsdWUoaW50IHZhbCk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZnhfY29udl9waXRjaChpbnQgdmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF9jb252X1EoaW50IHZhbCk7CisKKy8qIGZ1bmN0aW9uIGZvciBlYWNoIE5SUE4gKi8JCS8qIFtyYW5nZV0gIHVuaXRzICovCisjZGVmaW5lIGZ4X2VudjFfZGVsYXkJZnhfZGVsYXkJLyogWzAsNTkwMF0gNG1zZWMgKi8KKyNkZWZpbmUgZnhfZW52MV9hdHRhY2sJZnhfYXR0YWNrCS8qIFswLDU5NDBdIDFtc2VjICovCisjZGVmaW5lIGZ4X2VudjFfaG9sZAlmeF9ob2xkCQkvKiBbMCw4MTkxXSAxbXNlYyAqLworI2RlZmluZSBmeF9lbnYxX2RlY2F5CWZ4X2RlY2F5CS8qIFswLDU5NDBdIDRtc2VjICovCisjZGVmaW5lIGZ4X2VudjFfcmVsZWFzZQlmeF9kZWNheQkvKiBbMCw1OTQwXSA0bXNlYyAqLworI2RlZmluZSBmeF9lbnYxX3N1c3RhaW4JZnhfdGhlX3ZhbHVlCS8qIFswLDEyN10gMC43NWRCICovCisjZGVmaW5lIGZ4X2VudjFfcGl0Y2gJZnhfdGhlX3ZhbHVlCS8qIFstMTI3LDEyN10gOS4zNzVjZW50cyAqLworI2RlZmluZSBmeF9lbnYxX2N1dG9mZglmeF90aGVfdmFsdWUJLyogWy0xMjcsMTI3XSA1Ni4yNWNlbnRzICovCisKKyNkZWZpbmUgZnhfZW52Ml9kZWxheQlmeF9kZWxheQkvKiBbMCw1OTAwXSA0bXNlYyAqLworI2RlZmluZSBmeF9lbnYyX2F0dGFjawlmeF9hdHRhY2sJLyogWzAsNTk0MF0gMW1zZWMgKi8KKyNkZWZpbmUgZnhfZW52Ml9ob2xkCWZ4X2hvbGQJCS8qIFswLDgxOTFdIDFtc2VjICovCisjZGVmaW5lIGZ4X2VudjJfZGVjYXkJZnhfZGVjYXkJLyogWzAsNTk0MF0gNG1zZWMgKi8KKyNkZWZpbmUgZnhfZW52Ml9yZWxlYXNlCWZ4X2RlY2F5CS8qIFswLDU5NDBdIDRtc2VjICovCisjZGVmaW5lIGZ4X2VudjJfc3VzdGFpbglmeF90aGVfdmFsdWUJLyogWzAsMTI3XSAwLjc1ZEIgKi8KKworI2RlZmluZSBmeF9sZm8xX2RlbGF5CWZ4X2RlbGF5CS8qIFswLDU5MDBdIDRtc2VjICovCisjZGVmaW5lIGZ4X2xmbzFfZnJlcQlmeF90d2ljZV92YWx1ZQkvKiBbMCwxMjddIDg0bUh6ICovCisjZGVmaW5lIGZ4X2xmbzFfdm9sdW1lCWZ4X3R3aWNlX3ZhbHVlCS8qIFswLDEyN10gMC4xODc1ZEIgKi8KKyNkZWZpbmUgZnhfbGZvMV9waXRjaAlmeF90aGVfdmFsdWUJLyogWy0xMjcsMTI3XSA5LjM3NWNlbnRzICovCisjZGVmaW5lIGZ4X2xmbzFfY3V0b2ZmCWZ4X3R3aWNlX3ZhbHVlCS8qIFstNjQsNjNdIDU2LjI1Y2VudHMgKi8KKworI2RlZmluZSBmeF9sZm8yX2RlbGF5CWZ4X2RlbGF5CS8qIFswLDU5MDBdIDRtc2VjICovCisjZGVmaW5lIGZ4X2xmbzJfZnJlcQlmeF90d2ljZV92YWx1ZQkvKiBbMCwxMjddIDg0bUh6ICovCisjZGVmaW5lIGZ4X2xmbzJfcGl0Y2gJZnhfdGhlX3ZhbHVlCS8qIFstMTI3LDEyN10gOS4zNzVjZW50cyAqLworCisjZGVmaW5lIGZ4X2luaXRfcGl0Y2gJZnhfY29udl9waXRjaAkvKiBbLTgxOTIsODE5Ml0gY2VudHMgKi8KKyNkZWZpbmUgZnhfY2hvcnVzCWZ4X3RoZV92YWx1ZQkvKiBbMCwyNTVdIC0tICovCisjZGVmaW5lIGZ4X3JldmVyYglmeF90aGVfdmFsdWUJLyogWzAsMjU1XSAtLSAqLworI2RlZmluZSBmeF9jdXRvZmYJZnhfdHdpY2VfdmFsdWUJLyogWzAsMTI3XSA2Mkh6ICovCisjZGVmaW5lIGZ4X2ZpbHRlclEJZnhfY29udl9RCS8qIFswLDEyN10gLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ4X2RlbGF5KGludCB2YWwpCit7CisJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCljYWxjX3Bhcm1fZGVsYXkodmFsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ4X2F0dGFjayhpbnQgdmFsKQoreworCXJldHVybiAodW5zaWduZWQgc2hvcnQpY2FsY19wYXJtX2F0dGFjayh2YWwpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZnhfaG9sZChpbnQgdmFsKQoreworCXJldHVybiAodW5zaWduZWQgc2hvcnQpY2FsY19wYXJtX2hvbGQodmFsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ4X2RlY2F5KGludCB2YWwpCit7CisJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCljYWxjX3Bhcm1fZGVjYXkodmFsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ4X3RoZV92YWx1ZShpbnQgdmFsKQoreworCXJldHVybiAodW5zaWduZWQgc2hvcnQpKHZhbCAmIDB4ZmYpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZnhfdHdpY2VfdmFsdWUoaW50IHZhbCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIHNob3J0KSgodmFsICogMikgJiAweGZmKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ4X2NvbnZfcGl0Y2goaW50IHZhbCkKK3sKKwlyZXR1cm4gKHNob3J0KSh2YWwgKiA0MDk2IC8gMTIwMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF9jb252X1EoaW50IHZhbCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIHNob3J0KSgodmFsIC8gOCkgJiAweGZmKTsKK30KKworCitzdGF0aWMgQ29udlRhYmxlIGF3ZV9lZmZlY3RzW10gPQoreworCXsgMCwgQVdFX0ZYX0xGTzFfREVMQVksCWZ4X2xmbzFfZGVsYXl9LAorCXsgMSwgQVdFX0ZYX0xGTzFfRlJFUSwJZnhfbGZvMV9mcmVxfSwKKwl7IDIsIEFXRV9GWF9MRk8yX0RFTEFZLAlmeF9sZm8yX2RlbGF5fSwKKwl7IDMsIEFXRV9GWF9MRk8yX0ZSRVEsCWZ4X2xmbzJfZnJlcX0sCisKKwl7IDQsIEFXRV9GWF9FTlYxX0RFTEFZLAlmeF9lbnYxX2RlbGF5fSwKKwl7IDUsIEFXRV9GWF9FTlYxX0FUVEFDSyxmeF9lbnYxX2F0dGFja30sCisJeyA2LCBBV0VfRlhfRU5WMV9IT0xELAlmeF9lbnYxX2hvbGR9LAorCXsgNywgQVdFX0ZYX0VOVjFfREVDQVksCWZ4X2VudjFfZGVjYXl9LAorCXsgOCwgQVdFX0ZYX0VOVjFfU1VTVEFJTiwJZnhfZW52MV9zdXN0YWlufSwKKwl7IDksIEFXRV9GWF9FTlYxX1JFTEVBU0UsCWZ4X2VudjFfcmVsZWFzZX0sCisKKwl7MTAsIEFXRV9GWF9FTlYyX0RFTEFZLAlmeF9lbnYyX2RlbGF5fSwKKwl7MTEsIEFXRV9GWF9FTlYyX0FUVEFDSywJZnhfZW52Ml9hdHRhY2t9LAorCXsxMiwgQVdFX0ZYX0VOVjJfSE9MRCwJZnhfZW52Ml9ob2xkfSwKKwl7MTMsIEFXRV9GWF9FTlYyX0RFQ0FZLAlmeF9lbnYyX2RlY2F5fSwKKwl7MTQsIEFXRV9GWF9FTlYyX1NVU1RBSU4sCWZ4X2VudjJfc3VzdGFpbn0sCisJezE1LCBBV0VfRlhfRU5WMl9SRUxFQVNFLAlmeF9lbnYyX3JlbGVhc2V9LAorCisJezE2LCBBV0VfRlhfSU5JVF9QSVRDSCwJZnhfaW5pdF9waXRjaH0sCisJezE3LCBBV0VfRlhfTEZPMV9QSVRDSCwJZnhfbGZvMV9waXRjaH0sCisJezE4LCBBV0VfRlhfTEZPMl9QSVRDSCwJZnhfbGZvMl9waXRjaH0sCisJezE5LCBBV0VfRlhfRU5WMV9QSVRDSCwJZnhfZW52MV9waXRjaH0sCisJezIwLCBBV0VfRlhfTEZPMV9WT0xVTUUsCWZ4X2xmbzFfdm9sdW1lfSwKKwl7MjEsIEFXRV9GWF9DVVRPRkYsCQlmeF9jdXRvZmZ9LAorCXsyMiwgQVdFX0ZYX0ZJTFRFUlEsCWZ4X2ZpbHRlclF9LAorCXsyMywgQVdFX0ZYX0xGTzFfQ1VUT0ZGLAlmeF9sZm8xX2N1dG9mZn0sCisJezI0LCBBV0VfRlhfRU5WMV9DVVRPRkYsCWZ4X2VudjFfY3V0b2ZmfSwKKwl7MjUsIEFXRV9GWF9DSE9SVVMsCQlmeF9jaG9ydXN9LAorCXsyNiwgQVdFX0ZYX1JFVkVSQiwJCWZ4X3JldmVyYn0sCit9OworCitzdGF0aWMgaW50IG51bV9hd2VfZWZmZWN0cyA9IG51bWJlcm9mKGF3ZV9lZmZlY3RzKTsKKworCisvKgorICogR1MoU0M4OCkgTlJQTiBlZmZlY3RzOyBzdGlsbCBleHBlcmltZW50YWwKKyAqLworCisvKiBjdXRvZmY6IHF1YXJ0ZXIgc2VtaXRvbmUgc3RlcCwgbWF4PTI1NSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX2N1dG9mZihpbnQgdmFsKQoreworCXJldHVybiAodmFsIC0gNjQpICogZ3Nfc2Vuc2VbRlhfQ1VUT0ZGXSAvIDUwOworfQorCisvKiByZXNvbmFuY2U6IDAgdG8gMTUobWF4KSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX2ZpbHRlclEoaW50IHZhbCkKK3sKKwlyZXR1cm4gKHZhbCAtIDY0KSAqIGdzX3NlbnNlW0ZYX1JFU09OQU5DRV0gLyA1MDsKK30KKworLyogYXR0YWNrOiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX2F0dGFjayhpbnQgdmFsKQoreworCXJldHVybiAtKHZhbCAtIDY0KSAqIGdzX3NlbnNlW0ZYX0FUVEFDS10gLyA1MDsKK30KKworLyogZGVjYXk6ICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZ3NfZGVjYXkoaW50IHZhbCkKK3sKKwlyZXR1cm4gLSh2YWwgLSA2NCkgKiBnc19zZW5zZVtGWF9SRUxFQVNFXSAvIDUwOworfQorCisvKiByZWxlYXNlOiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX3JlbGVhc2UoaW50IHZhbCkKK3sKKwlyZXR1cm4gLSh2YWwgLSA2NCkgKiBnc19zZW5zZVtGWF9SRUxFQVNFXSAvIDUwOworfQorCisvKiB2aWJyYXRvIGZyZXE6IDAuMDQySHogc3RlcCwgbWF4PTI1NSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX3ZpYl9yYXRlKGludCB2YWwpCit7CisJcmV0dXJuICh2YWwgLSA2NCkgKiBnc19zZW5zZVtGWF9WSUJSQVRFXSAvIDUwOworfQorCisvKiB2aWJyYXRvIGRlcHRoOiBtYXg9MTI3LCAxIG9jdGF2ZSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX3ZpYl9kZXB0aChpbnQgdmFsKQoreworCXJldHVybiAodmFsIC0gNjQpICogZ3Nfc2Vuc2VbRlhfVklCREVQVEhdIC8gNTA7Cit9CisKKy8qIHZpYnJhdG8gZGVsYXk6IC0wLjcyNW1zZWMgc3RlcCAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX3ZpYl9kZWxheShpbnQgdmFsKQoreworCXJldHVybiAtKHZhbCAtIDY0KSAqIGdzX3NlbnNlW0ZYX1ZJQkRFTEFZXSAvIDUwOworfQorCitzdGF0aWMgQ29udlRhYmxlIGdzX2VmZmVjdHNbXSA9Cit7CisJezMyLCBBV0VfRlhfQ1VUT0ZGLAlnc19jdXRvZmZ9LAorCXszMywgQVdFX0ZYX0ZJTFRFUlEsCWdzX2ZpbHRlclF9LAorCXs5OSwgQVdFX0ZYX0VOVjJfQVRUQUNLLCBnc19hdHRhY2t9LAorCXsxMDAsIEFXRV9GWF9FTlYyX0RFQ0FZLCBnc19kZWNheX0sCisJezEwMiwgQVdFX0ZYX0VOVjJfUkVMRUFTRSwgZ3NfcmVsZWFzZX0sCisJezgsIEFXRV9GWF9MRk8xX0ZSRVEsIGdzX3ZpYl9yYXRlfSwKKwl7OSwgQVdFX0ZYX0xGTzFfVk9MVU1FLCBnc192aWJfZGVwdGh9LAorCXsxMCwgQVdFX0ZYX0xGTzFfREVMQVksIGdzX3ZpYl9kZWxheX0sCit9OworCitzdGF0aWMgaW50IG51bV9nc19lZmZlY3RzID0gbnVtYmVyb2YoZ3NfZWZmZWN0cyk7CisKKworLyoKKyAqIE5SUE4gZXZlbnRzOiBhY2NlcHQgYXMgQVdFMzIvU0M4OCBzcGVjaWZpYyBjb250cm9scworICovCisKK3N0YXRpYyB2b2lkIG1pZGlfbnJwbl9ldmVudChNaWRpU3RhdHVzICpzdCkKK3sKKwlpZiAocnBuX21zYltzdC0+Y2hhbl0gPT0gMTI3ICYmIHJwbl9sc2Jbc3QtPmNoYW5dIDw9IDI2KSB7CisJCWlmICghIG1zYl9iaXQpIC8qIGJvdGggTVNCL0xTQiBuZWNlc3NhcnkgKi8KKwkJCXNlbmRfY29udmVydGVkX2VmZmVjdChhd2VfZWZmZWN0cywgbnVtX2F3ZV9lZmZlY3RzLAorCQkJCQkgICAgICBzdCwgcnBuX2xzYltzdC0+Y2hhbl0sCisJCQkJCSAgICAgIHJwbl92YWxbc3QtPmNoYW5dIC0gODE5Mik7CisJfSBlbHNlIGlmIChycG5fbXNiW3N0LT5jaGFuXSA9PSAxKSB7CisJCWlmIChtc2JfYml0KSAvKiBvbmx5IE1TQiBpcyB2YWxpZCAqLworCQkJYWRkX2NvbnZlcnRlZF9lZmZlY3QoZ3NfZWZmZWN0cywgbnVtX2dzX2VmZmVjdHMsCisJCQkJCSAgICAgc3QsIHJwbl9sc2Jbc3QtPmNoYW5dLAorCQkJCQkgICAgIHJwbl92YWxbc3QtPmNoYW5dIC8gMTI4KTsKKwl9Cit9CisKKworLyoKKyAqIFhHIGNvbnRyb2wgZWZmZWN0czsgc3RpbGwgZXhwZXJpbWVudGFsCisgKi8KKworLyogY3V0b2ZmOiBxdWFydGVyIHNlbWl0b25lIHN0ZXAsIG1heD0yNTUgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB4Z19jdXRvZmYoaW50IHZhbCkKK3sKKwlyZXR1cm4gKHZhbCAtIDY0KSAqIHhnX3NlbnNlW0ZYX0NVVE9GRl0gLyA2NDsKK30KKworLyogcmVzb25hbmNlOiAwKG9wZW4pIHRvIDE1KG1vc3QgbmFzYWwpICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgeGdfZmlsdGVyUShpbnQgdmFsKQoreworCXJldHVybiAodmFsIC0gNjQpICogeGdfc2Vuc2VbRlhfUkVTT05BTkNFXSAvIDY0OworfQorCisvKiBhdHRhY2s6ICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgeGdfYXR0YWNrKGludCB2YWwpCit7CisJcmV0dXJuIC0odmFsIC0gNjQpICogeGdfc2Vuc2VbRlhfQVRUQUNLXSAvIDY0OworfQorCisvKiByZWxlYXNlOiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHhnX3JlbGVhc2UoaW50IHZhbCkKK3sKKwlyZXR1cm4gLSh2YWwgLSA2NCkgKiB4Z19zZW5zZVtGWF9SRUxFQVNFXSAvIDY0OworfQorCitzdGF0aWMgQ29udlRhYmxlIHhnX2VmZmVjdHNbXSA9Cit7CisJezcxLCBBV0VfRlhfQ1VUT0ZGLAl4Z19jdXRvZmZ9LAorCXs3NCwgQVdFX0ZYX0ZJTFRFUlEsCXhnX2ZpbHRlclF9LAorCXs3MiwgQVdFX0ZYX0VOVjJfUkVMRUFTRSwgeGdfcmVsZWFzZX0sCisJezczLCBBV0VfRlhfRU5WMl9BVFRBQ0ssIHhnX2F0dGFja30sCit9OworCitzdGF0aWMgaW50IG51bV94Z19lZmZlY3RzID0gbnVtYmVyb2YoeGdfZWZmZWN0cyk7CisKK3N0YXRpYyBpbnQgeGdfY29udHJvbF9jaGFuZ2UoTWlkaVN0YXR1cyAqc3QsIGludCBjbWQsIGludCB2YWwpCit7CisJcmV0dXJuIGFkZF9jb252ZXJ0ZWRfZWZmZWN0KHhnX2VmZmVjdHMsIG51bV94Z19lZmZlY3RzLCBzdCwgY21kLCB2YWwpOworfQorCisjZW5kaWYgLyogQ09ORklHX0FXRTMyX01JRElFTVUgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qCisgKiBpbml0aWFsaXphdGlvbiBvZiBBV0UgZHJpdmVyCisgKi8KKworc3RhdGljIHZvaWQKK2F3ZV9pbml0aWFsaXplKHZvaWQpCit7CisJREVCVUcoMCxwcmludGsoIkFXRTMyOiBpbml0aWFsaXppbmcuLlxuIikpOworCisJLyogaW5pdGlhbGl6ZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCisJYXdlX3Bva2UoQVdFX0hXQ0YxLCAweDAwNTkpOworCWF3ZV9wb2tlKEFXRV9IV0NGMiwgMHgwMDIwKTsKKworCS8qIGRpc2FibGUgYXVkaW87IHRoaXMgc2VlbXMgdG8gcmVkdWNlIGEgY2xpY2tpbmcgbm9pc2UgYSBiaXQuLiAqLworCWF3ZV9wb2tlKEFXRV9IV0NGMywgMCk7CisKKwkvKiBpbml0aWFsaXplIGF1ZGlvIGNoYW5uZWxzICovCisJYXdlX2luaXRfYXVkaW8oKTsKKworCS8qIGluaXRpYWxpemUgRE1BICovCisJYXdlX2luaXRfZG1hKCk7CisKKwkvKiBpbml0aWFsaXplIGluaXQgYXJyYXkgKi8KKwlhd2VfaW5pdF9hcnJheSgpOworCisJLyogY2hlY2sgRFJBTSBtZW1vcnkgc2l6ZSAqLworCWF3ZV9jaGVja19kcmFtKCk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBGTSBzZWN0aW9uIG9mIHRoZSBBV0UzMiAqLworCWF3ZV9pbml0X2ZtKCk7CisKKwkvKiBzZXQgdXAgdm9pY2UgZW52ZWxvcGVzICovCisJYXdlX3R3ZWFrKCk7CisKKwkvKiBlbmFibGUgYXVkaW8gKi8KKwlhd2VfcG9rZShBV0VfSFdDRjMsIDB4MDAwNCk7CisKKwkvKiBzZXQgZGVmYXVsdCB2YWx1ZXMgKi8KKwlhd2VfaW5pdF9jdHJsX3Bhcm1zKFRSVUUpOworCisJLyogc2V0IGVxdWFsaXplciAqLworCWF3ZV91cGRhdGVfZXF1YWxpemVyKCk7CisKKwkvKiBzZXQgcmV2ZXJiICYgY2hvcnVzIG1vZGVzICovCisJYXdlX3VwZGF0ZV9yZXZlcmJfbW9kZSgpOworCWF3ZV91cGRhdGVfY2hvcnVzX21vZGUoKTsKK30KKworCisvKgorICogQ29yZSBEZXZpY2UgTWFuYWdlbWVudCBGdW5jdGlvbnMKKyAqLworCisvKiBzdG9yZSB2YWx1ZXMgdG8gaS9vIHBvcnQgYXJyYXkgKi8KK3N0YXRpYyB2b2lkIHNldHVwX3BvcnRzKGludCBwb3J0MSwgaW50IHBvcnQyLCBpbnQgcG9ydDMpCit7CisJYXdlX3BvcnRzWzBdID0gcG9ydDE7CisJaWYgKHBvcnQyID09IDApCisJCXBvcnQyID0gcG9ydDEgKyAweDQwMDsKKwlhd2VfcG9ydHNbMV0gPSBwb3J0MjsKKwlhd2VfcG9ydHNbMl0gPSBwb3J0MiArIDI7CisJaWYgKHBvcnQzID09IDApCisJCXBvcnQzID0gcG9ydDEgKyAweDgwMDsKKwlhd2VfcG9ydHNbM10gPSBwb3J0MzsKKwlhd2VfcG9ydHNbNF0gPSBwb3J0MyArIDI7CisKKwlwb3J0X3NldHVwZWQgPSBUUlVFOworfQorCisvKgorICogcG9ydCByZXF1ZXN0CisgKiAgMHg2MjAtNjIzLCAweEEyMC1BMjMsIDB4RTIwLUUyMworICovCisKK3N0YXRpYyBpbnQKK2F3ZV9yZXF1ZXN0X3JlZ2lvbih2b2lkKQoreworCWlmICghIHBvcnRfc2V0dXBlZCkKKwkJcmV0dXJuIDA7CisJaWYgKCEgcmVxdWVzdF9yZWdpb24oYXdlX3BvcnRzWzBdLCA0LCAic291bmQgZHJpdmVyIChBV0UzMikiKSkKKwkJcmV0dXJuIDA7CisJaWYgKCEgcmVxdWVzdF9yZWdpb24oYXdlX3BvcnRzWzFdLCA0LCAic291bmQgZHJpdmVyIChBV0UzMikiKSkKKwkJZ290byBlcnJfb3V0OworCWlmICghIHJlcXVlc3RfcmVnaW9uKGF3ZV9wb3J0c1szXSwgNCwgInNvdW5kIGRyaXZlciAoQVdFMzIpIikpCisJCWdvdG8gZXJyX291dDE7CisJcmV0dXJuIDE7CitlcnJfb3V0MToKKwlyZWxlYXNlX3JlZ2lvbihhd2VfcG9ydHNbMV0sIDQpOworZXJyX291dDoKKwlyZWxlYXNlX3JlZ2lvbihhd2VfcG9ydHNbMF0sIDQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYXdlX3JlbGVhc2VfcmVnaW9uKHZvaWQpCit7CisJaWYgKCEgcG9ydF9zZXR1cGVkKSByZXR1cm47CisJcmVsZWFzZV9yZWdpb24oYXdlX3BvcnRzWzBdLCA0KTsKKwlyZWxlYXNlX3JlZ2lvbihhd2VfcG9ydHNbMV0sIDQpOworCXJlbGVhc2VfcmVnaW9uKGF3ZV9wb3J0c1szXSwgNCk7Cit9CisKK3N0YXRpYyBpbnQgYXdlX2F0dGFjaF9kZXZpY2Uodm9pZCkKK3sKKwlpZiAoYXdlX3ByZXNlbnQpIHJldHVybiAwOyAvKiBmb3IgT1NTMzguLiBjYWxsZWQgdHdpY2U/ICovCisKKwkvKiByZXNlcnZlIEkvTyBwb3J0cyBmb3IgYXdlZHJ2ICovCisJaWYgKCEgYXdlX3JlcXVlc3RfcmVnaW9uKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBV0UzMjogSS9PIGFyZWEgYWxyZWFkeSB1c2VkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIHNldCBidWZmZXJzIHRvIE5VTEwgKi8KKwlzZmhlYWQgPSBzZnRhaWwgPSBOVUxMOworCisJbXlfZGV2ID0gc291bmRfYWxsb2Nfc3ludGhkZXYoKTsKKwlpZiAobXlfZGV2ID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQVdFMzIgRXJyb3I6IHRvbyBtYW55IHN5bnRoZXNpemVyc1xuIik7CisJCWF3ZV9yZWxlYXNlX3JlZ2lvbigpOworCQlyZXR1cm4gMDsKKwl9CisKKwl2b2ljZV9hbGxvYyA9ICZhd2Vfb3BlcmF0aW9ucy5hbGxvYzsKKwl2b2ljZV9hbGxvYy0+bWF4X3ZvaWNlID0gYXdlX21heF92b2ljZXM7CisJc3ludGhfZGV2c1tteV9kZXZdID0gJmF3ZV9vcGVyYXRpb25zOworCisjaWZkZWYgQ09ORklHX0FXRTMyX01JWEVSCisJYXR0YWNoX21peGVyKCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVdFMzJfTUlESUVNVQorCWF0dGFjaF9taWRpZW11KCk7CisjZW5kaWYKKworCS8qIGNsZWFyIGFsbCBzYW1wbGVzICovCisJYXdlX3Jlc2V0X3NhbXBsZXMoKTsKKworCS8qIGluaXRpYWxpemUgQVdFMzIgaGFyZHdhcmUgKi8KKwlhd2VfaW5pdGlhbGl6ZSgpOworCisJc3ByaW50Zihhd2VfaW5mby5uYW1lLCAiQVdFMzItJXMgKFJBTSVkaykiLAorCQlBV0VEUlZfVkVSU0lPTiwgbWVtc2l6ZS8xMDI0KTsKKwlwcmludGsoS0VSTl9JTkZPICI8U291bmRCbGFzdGVyIEVNVTgwMDAgKFJBTSVkayk+XG4iLCBtZW1zaXplLzEwMjQpOworCisJYXdlX3ByZXNlbnQgPSBUUlVFOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGF3ZV9kZXR0YWNoX2RldmljZSh2b2lkKQoreworCWlmIChhd2VfcHJlc2VudCkgeworCQlhd2VfcmVzZXRfc2FtcGxlcygpOworCQlhd2VfcmVsZWFzZV9yZWdpb24oKTsKKwkJZnJlZV90YWJsZXMoKTsKKyNpZmRlZiBDT05GSUdfQVdFMzJfTUlYRVIKKwkJdW5sb2FkX21peGVyKCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVdFMzJfTUlESUVNVQorCQl1bmxvYWRfbWlkaWVtdSgpOworI2VuZGlmCisJCXNvdW5kX3VubG9hZF9zeW50aGRldihteV9kZXYpOworCQlhd2VfcHJlc2VudCA9IEZBTFNFOworCX0KK30KKworCisvKgorICogTGVnYWN5IGRldmljZSBQcm9iaW5nCisgKi8KKworLyogZGV0ZWN0IGVtdTgwMDAgY2hpcCBvbiB0aGUgc3BlY2lmaWVkIGFkZHJlc3M7IGZyb20gVlYncyBndWlkZSAqLworCitzdGF0aWMgaW50IF9faW5pdAorYXdlX2RldGVjdF9iYXNlKGludCBhZGRyKQoreworCXNldHVwX3BvcnRzKGFkZHIsIDAsIDApOworCWlmICgoYXdlX3BlZWsoQVdFX1UxKSAmIDB4MDAwRikgIT0gMHgwMDBDKQorCQlyZXR1cm4gMDsKKwlpZiAoKGF3ZV9wZWVrKEFXRV9IV0NGMSkgJiAweDAwN0UpICE9IDB4MDA1OCkKKwkJcmV0dXJuIDA7CisJaWYgKChhd2VfcGVlayhBV0VfSFdDRjIpICYgMHgwMDAzKSAhPSAweDAwMDMpCisJCXJldHVybiAwOworICAgICAgICBERUJVRygwLHByaW50aygiQVdFMzIgZm91bmQgYXQgJXhcbiIsIGFkZHIpKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXdlX2RldGVjdF9sZWdhY3lfZGV2aWNlcyh2b2lkKQoreworCWludCBiYXNlOworCWZvciAoYmFzZSA9IDB4NjIwOyBiYXNlIDw9IDB4NjgwOyBiYXNlICs9IDB4MjApCisJCWlmIChhd2VfZGV0ZWN0X2Jhc2UoYmFzZSkpIHsKKwkJCWF3ZV9hdHRhY2hfZGV2aWNlKCk7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwlERUJVRygwLHByaW50aygiQVdFMzIgTGVnYWN5IGRldGVjdGlvbiBmYWlsZWRcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUG5QIGRldmljZSBQcm9iaW5nCisgKi8KKworc3RhdGljIHN0cnVjdCBwbnBfZGV2aWNlX2lkIGF3ZV9wbnBfaWRzW10gPSB7CisJey5pZCA9ICJDVEwwMDIxIiwgLmRyaXZlcl9kYXRhID0gMH0sIC8qIEFXRTMyIFdhdmVUYWJsZSAqLworCXsuaWQgPSAiQ1RMMDAyMiIsIC5kcml2ZXJfZGF0YSA9IDB9LCAvKiBBV0U2NCBXYXZlVGFibGUgKi8KKwl7LmlkID0gIkNUTDAwMjMiLCAuZHJpdmVyX2RhdGEgPSAwfSwgLyogQVdFNjQgR29sZCBXYXZlVGFibGUgKi8KKwl7IH0gLyogdGVybWluYXRvciAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIGF3ZV9wbnBfaWRzKTsKKworc3RhdGljIGludCBhd2VfcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCit7CisJaW50IGlvMSwgaW8yLCBpbzM7CisKKwlpZiAoYXdlX3ByZXNlbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBV0UzMjogVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyBvbmUgQVdFMzIgZGV2aWNlLCBza2lwcGluZy5cbiIpOworCX0KKworCWlmICghcG5wX3BvcnRfdmFsaWQoZGV2LDApIHx8CisJICAgICFwbnBfcG9ydF92YWxpZChkZXYsMSkgfHwKKwkgICAgIXBucF9wb3J0X3ZhbGlkKGRldiwyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkFXRTMyOiBUaGUgUG5QIGRldmljZSBkb2VzIG5vdCBoYXZlIHRoZSByZXF1aXJlZCByZXNvdXJjZXMuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlvMSA9IHBucF9wb3J0X3N0YXJ0KGRldiwwKTsKKwlpbzIgPSBwbnBfcG9ydF9zdGFydChkZXYsMSk7CisJaW8zID0gcG5wX3BvcnRfc3RhcnQoZGV2LDIpOworCXByaW50ayhLRVJOX0lORk8gIkFXRTMyOiBBIFBuUCBXYXZlIFRhYmxlIHdhcyBkZXRlY3RlZCBhdCBJTydzICUjeCwlI3gsJSN4XG4uIiwKKwkgICAgICAgaW8xLCBpbzIsIGlvMyk7CisJc2V0dXBfcG9ydHMoaW8xLCBpbzIsIGlvMyk7CisKKwlhd2VfYXR0YWNoX2RldmljZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhd2VfcG5wX3JlbW92ZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQoreworCWF3ZV9kZXR0YWNoX2RldmljZSgpOworfQorCitzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgYXdlX3BucF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIkFXRTMyIiwKKwkuaWRfdGFibGUJPSBhd2VfcG5wX2lkcywKKwkucHJvYmUJCT0gYXdlX3BucF9wcm9iZSwKKwkucmVtb3ZlCQk9IGF3ZV9wbnBfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXdlX2RldGVjdF9wbnBfZGV2aWNlcyh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZhd2VfcG5wX2RyaXZlcik7CisJaWYgKHJldDwwKQorCQlwcmludGsoS0VSTl9FUlIgIkFXRTMyOiBQblAgc3VwcG9ydCBpcyB1bmF2YWlsYWJsZS5cbiIpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIGRldmljZSAvIGxvd2xldmVsIChtb2R1bGUpIGludGVyZmFjZQorICovCisKK3N0YXRpYyBpbnQgX19pbml0Cithd2VfZGV0ZWN0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiQVdFMzI6IFByb2JpbmcgZm9yIFdhdmVUYWJsZS4uLlxuIik7CisJaWYgKGlzYXBucCkgeworCQlpZiAoYXdlX2RldGVjdF9wbnBfZGV2aWNlcygpPj0wKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gIkFXRTMyOiBTa2lwcGluZyBQblAgZGV0ZWN0aW9uLlxuIik7CisKKwlpZiAoYXdlX2RldGVjdF9sZWdhY3lfZGV2aWNlcygpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhdHRhY2hfYXdlKHZvaWQpCit7CisJcmV0dXJuIGF3ZV9kZXRlY3QoKSA/IDAgOiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX2F3ZSh2b2lkKQoreworCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmYXdlX3BucF9kcml2ZXIpOworCWF3ZV9kZXR0YWNoX2RldmljZSgpOworfQorCisKK21vZHVsZV9pbml0KGF0dGFjaF9hd2UpOworbW9kdWxlX2V4aXQodW5sb2FkX2F3ZSk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hd2UoY2hhciAqc3RyKQoreworCS8qIGlvLCBtZW1zaXplLCBpc2FwbnAgKi8KKwlpbnQgaW50c1s0XTsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpbyA9IGludHNbMV07CisJbWVtc2l6ZSA9IGludHNbMl07CisJaXNhcG5wID0gaW50c1szXTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJhd2U9Iiwgc2V0dXBfYXdlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2F3ZV93YXZlLmggYi9zb3VuZC9vc3MvYXdlX3dhdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2FhMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2F3ZV93YXZlLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIHNvdW5kL2F3ZV9jb25maWcuaAorICoKKyAqIENvbmZpZ3VyYXRpb24gb2YgQVdFMzIvU0IzMi9BV0U2NCB3YXZlIHRhYmxlIHN5bnRoIGRyaXZlci4KKyAqICAgdmVyc2lvbiAwLjQuNDsgSmFuLiA0LCAyMDAwCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggVGFrYXNoaSBJd2FpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqIGNob3J1cyAmIHJldmVyYiBlZmZlY3RzIHNlbmQgZm9yIEZNIGNoaXA6IGZyb20gMCB0byAweGZmCisgKiBsYXJnZXIgbnVtYmVycyBvZnRlbiBjYXVzZSB3ZWlyZCBzb3VuZHMuCisgKi8KKworI2RlZmluZSBERUZfRk1fQ0hPUlVTX0RFUFRICTB4MTAKKyNkZWZpbmUgREVGX0ZNX1JFVkVSQl9ERVBUSAkweDEwCisKKworLyoKKyAqIG90aGVyIGNvbXBpbGUgY29uZGl0aW9ucworICovCisKKy8qIGluaXRpYWxpemUgRk0gcGFzc3Rocm91Z2ggZXZlbiB3aXRob3V0IGV4dGVuZGVkIFJBTSAqLworI3VuZGVmIEFXRV9BTFdBWVNfSU5JVF9GTQorCisvKiBkZWJ1ZyBvbiAqLworI2RlZmluZSBBV0VfREVCVUdfT04KKworLyogR1VTIGNvbXBhdGlibGUgbW9kZSAqLworI2RlZmluZSBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCisKKy8qIGFkZCBNSURJIGVtdWxhdGlvbiBieSB3YXZldGFibGUgKi8KKyNkZWZpbmUgQ09ORklHX0FXRTMyX01JRElFTVUKKworLyogYWRkIG1peGVyIGNvbnRyb2wgb2YgZW11ODAwMCBlcXVhbGl6ZXIgKi8KKyN1bmRlZiBDT05GSUdfQVdFMzJfTUlYRVIKKworLyogdXNlIG5ldyB2b2x1bWUgY2FsY3VsYXRpb24gbWV0aG9kIGFzIGRlZmF1bHQgKi8KKyNkZWZpbmUgQVdFX1VTRV9ORVdfVk9MVU1FX0NBTEMKKworLyogY2hlY2sgY3VycmVudCB2b2x1bWUgdGFyZ2V0IGZvciBzZWFyY2hpbmcgZW1wdHkgdm9pY2VzICovCisjZGVmaW5lIEFXRV9DSEVDS19WVEFSR0VUCisKKy8qIGFsbG93IHNhbXBsZSBzaGFyaW5nICovCisjZGVmaW5lIEFXRV9BTExPV19TQU1QTEVfU0hBUklORworCisvKgorICogQVdFMzIgY2FyZCBjb25maWd1cmF0aW9uOgorICogdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgKk9OTFkqIHdoZW4gYXV0byBkZXRlY3Rpb24gZG9lc24ndAorICogd29yayBwcm9wZXJseSBvbiB5b3VyIG1hY2hpbmUuCisgKi8KKworLyojZGVmaW5lIEFXRV9ERUZBVUxUX0JBU0VfQUREUgkweDYyMCovCS8qIGJhc2UgcG9ydCBhZGRyZXNzICovCisvKiNkZWZpbmUgQVdFX0RFRkFVTFRfTUVNX1NJWkUJNTEyKi8JLyoga2J5dGVzICovCisKKy8qCisgKiBBV0UgZHJpdmVyIHZlcnNpb24gbnVtYmVyCisgKi8KKyNkZWZpbmUgQVdFX01BSk9SX1ZFUlNJT04JMAorI2RlZmluZSBBV0VfTUlOT1JfVkVSU0lPTgk0CisjZGVmaW5lIEFXRV9USU5ZX1ZFUlNJT04JNAorI2RlZmluZSBBV0VfVkVSU0lPTl9OVU1CRVIJKChBV0VfTUFKT1JfVkVSU0lPTjw8MTYpfChBV0VfTUlOT1JfVkVSU0lPTjw8OCl8QVdFX1RJTllfVkVSU0lPTikKKyNkZWZpbmUgQVdFRFJWX1ZFUlNJT04JCSIwLjQuNCIKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9iaW4yaGV4LmMgYi9zb3VuZC9vc3MvYmluMmhleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTEwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYmluMmhleC5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2IFtdICkKK3sKKyAgICBjb25zdCBjaGFyICogdmFybmFtZTsKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGM7CisgICAgaW50IGlkID0gMDsKKworICAgIGlmKGFyZ3ZbMV0gJiYgc3RyY21wKGFyZ3ZbMV0sIi1pIik9PTApCisgICAgeworICAgIAlhcmd2Kys7CisgICAgCWFyZ2MtLTsKKyAgICAJaWQ9MTsKKyAgICB9CisgICAgCQorICAgIGlmKGFyZ2M9PTEpCisgICAgeworICAgIAlmcHJpbnRmKHN0ZGVyciwgImJpbjJoZXg6IFstaV0gZmlybXdhcmVcbiIpOworICAgIAlleGl0KDEpOworICAgIH0KKyAgICAKKyAgICB2YXJuYW1lID0gYXJndlsxXTsKKyAgICBwcmludGYoICIvKiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBiaW4yaGV4ICovXG4iICk7CisgICAgcHJpbnRmKCAic3RhdGljIHVuc2lnbmVkIGNoYXIgJXMgW10gJXMgPVxue1xuIiwgdmFybmFtZSAsIGlkPyJfX2luaXRkYXRhIjoiIik7CisKKyAgICB3aGlsZSAoICggYyA9IGdldGNoYXIoICkgKSAhPSBFT0YgKQorICAgIHsKKwlpZiAoIGkgIT0gMCAmJiBpICUgMTAgPT0gMCApCisJICAgIHByaW50ZiggIlxuIiApOworCXByaW50ZiggIjB4JTAybHgsIiwgYyAmIDB4RkZsICk7CisJaSsrOworICAgIH0KKworICAgIHByaW50ZiggIn07XG5zdGF0aWMgaW50ICVzTGVuID0gICVkO1xuIiwgdmFybmFtZSwgaSApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2J0YXVkaW8uYyBiL3NvdW5kL29zcy9idGF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1MDkzZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9idGF1ZGlvLmMKQEAgLTAsMCArMSwxMTM2IEBACisvKgorICAgIGJ0YXVkaW8gLSBidDg3OCBhdWRpbyBkbWEgZHJpdmVyIGZvciBsaW51eCAyLjQueAorCisgICAgKGMpIDIwMDAtMjAwMiBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCisvKiBtbWlvIGFjY2VzcyAqLworI2RlZmluZSBidHdyaXRlKGRhdCxhZHIpICAgIHdyaXRlbCgoZGF0KSwgKGJ0YS0+bW1pbysoYWRyKSkpCisjZGVmaW5lIGJ0cmVhZChhZHIpICAgICAgICAgcmVhZGwoYnRhLT5tbWlvKyhhZHIpKQorCisjZGVmaW5lIGJ0YW5kKGRhdCxhZHIpICAgICAgYnR3cml0ZSgoZGF0KSAmIGJ0cmVhZChhZHIpLCBhZHIpCisjZGVmaW5lIGJ0b3IoZGF0LGFkcikgICAgICAgYnR3cml0ZSgoZGF0KSB8IGJ0cmVhZChhZHIpLCBhZHIpCisjZGVmaW5lIGJ0YW9yKGRhdCxtYXNrLGFkcikgYnR3cml0ZSgoZGF0KSB8ICgobWFzaykgJiBidHJlYWQoYWRyKSksIGFkcikKKworLyogcmVnaXN0ZXJzIChzaGlmdGVkIGJlY2F1c2UgYnRhLT5tbWlvIGlzIGxvbmcpICovCisjZGVmaW5lIFJFR19JTlRfU1RBVCAgICAgICgweDEwMCA+PiAyKQorI2RlZmluZSBSRUdfSU5UX01BU0sgICAgICAoMHgxMDQgPj4gMikKKyNkZWZpbmUgUkVHX0dQSU9fRE1BX0NUTCAgKDB4MTBjID4+IDIpCisjZGVmaW5lIFJFR19QQUNLRVRfTEVOICAgICgweDExMCA+PiAyKQorI2RlZmluZSBSRUdfUklTQ19TVFJUX0FERCAoMHgxMTQgPj4gMikKKyNkZWZpbmUgUkVHX1JJU0NfQ09VTlQgICAgKDB4MTIwID4+IDIpCisKKy8qIElSUSBiaXRzIC0gUkVHX0lOVF8oU1RBVHxNQVNLKSAqLworI2RlZmluZSBJUlFfU0NFUlIgICAgICAgICAoMSA8PCAxOSkKKyNkZWZpbmUgSVJRX09DRVJSICAgICAgICAgKDEgPDwgMTgpCisjZGVmaW5lIElSUV9QQUJPUlQgICAgICAgICgxIDw8IDE3KQorI2RlZmluZSBJUlFfUklQRVJSICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgSVJRX1BQRVJSICAgICAgICAgKDEgPDwgMTUpCisjZGVmaW5lIElSUV9GRFNSICAgICAgICAgICgxIDw8IDE0KQorI2RlZmluZSBJUlFfRlRSR1QgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgSVJRX0ZCVVMgICAgICAgICAgKDEgPDwgMTIpCisjZGVmaW5lIElSUV9SSVNDSSAgICAgICAgICgxIDw8IDExKQorI2RlZmluZSBJUlFfT0ZMT1cgICAgICAgICAoMSA8PCAgMykKKworI2RlZmluZSBJUlFfQlRBVURJTyAgICAgICAoSVJRX1NDRVJSIHwgSVJRX09DRVJSIHwgSVJRX1BBQk9SVCB8IElSUV9SSVBFUlIgfFwKKwkJCSAgIElSUV9QUEVSUiB8IElSUV9GRFNSICB8IElSUV9GVFJHVCAgfCBJUlFfRkJVUyAgIHxcCisJCQkgICBJUlFfUklTQ0kpCisKKy8qIFJFR19HUElPX0RNQV9DVEwgYml0cyAqLworI2RlZmluZSBETUFfQ1RMX0FfUFdSRE4gICAoMSA8PCAyNikKKyNkZWZpbmUgRE1BX0NUTF9EQV9TQlIgICAgKDEgPDwgMTQpCisjZGVmaW5lIERNQV9DVExfREFfRVMyICAgICgxIDw8IDEzKQorI2RlZmluZSBETUFfQ1RMX0FDQVBfRU4gICAoMSA8PCAgNCkKKyNkZWZpbmUgRE1BX0NUTF9SSVNDX0VOICAgKDEgPDwgIDEpCisjZGVmaW5lIERNQV9DVExfRklGT19FTiAgICgxIDw8ICAwKQorCisvKiBSSVNDIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBSSVNDX1dSSVRFICAgICAgICAoMHgwMSA8PCAyOCkKKyNkZWZpbmUgUklTQ19KVU1QICAgICAgICAgKDB4MDcgPDwgMjgpCisjZGVmaW5lIFJJU0NfU1lOQyAgICAgICAgICgweDA4IDw8IDI4KQorCisvKiBSSVNDIGJpdHMgKi8KKyNkZWZpbmUgUklTQ19XUl9TT0wgICAgICAgKDEgPDwgMjcpCisjZGVmaW5lIFJJU0NfV1JfRU9MICAgICAgICgxIDw8IDI2KQorI2RlZmluZSBSSVNDX0lSUSAgICAgICAgICAoMSA8PCAyNCkKKyNkZWZpbmUgUklTQ19TWU5DX1JFU1lOQyAgKDEgPDwgMTUpCisjZGVmaW5lIFJJU0NfU1lOQ19GTTEgICAgIDB4MDYKKyNkZWZpbmUgUklTQ19TWU5DX1ZSTyAgICAgMHgwYworCisjZGVmaW5lIEhXQkFTRV9BRCAoNDQ4MDAwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgYnRhdWRpbyB7CisJLyogbGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3QgYnRhdWRpbyAqbmV4dDsKKworCS8qIGRldmljZSBpbmZvICovCisJaW50ICAgICAgICAgICAgZHNwX2RpZ2l0YWw7CisJaW50ICAgICAgICAgICAgZHNwX2FuYWxvZzsKKwlpbnQgICAgICAgICAgICBtaXhlcl9kZXY7CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwl1bnNpZ25lZCBpbnQgICBpcnE7CisJdW5zaWduZWQgbG9uZyAgbWVtOworCXVuc2lnbmVkIGxvbmcgIF9faW9tZW0gKm1taW87CisKKwkvKiBsb2NraW5nICovCisJaW50ICAgICAgICAgICAgdXNlcnM7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCisJLyogcmlzYyBpbnN0cnVjdGlvbnMgKi8KKwl1bnNpZ25lZCBpbnQgICByaXNjX3NpemU7CisJdW5zaWduZWQgbG9uZyAgKnJpc2NfY3B1OworCWRtYV9hZGRyX3QgICAgIHJpc2NfZG1hOworCisJLyogYXVkaW8gZGF0YSAqLworCXVuc2lnbmVkIGludCAgIGJ1Zl9zaXplOworCXVuc2lnbmVkIGNoYXIgICpidWZfY3B1OworCWRtYV9hZGRyX3QgICAgIGJ1Zl9kbWE7CisKKwkvKiBidWZmZXIgc2V0dXAgKi8KKwlpbnQgbGluZV9ieXRlczsKKwlpbnQgbGluZV9jb3VudDsKKwlpbnQgYmxvY2tfYnl0ZXM7CisJaW50IGJsb2NrX2NvdW50OworCisJLyogcmVhZCBmaWZvIG1hbmFnZW1lbnQgKi8KKwlpbnQgcmVjb3JkaW5nOworCWludCBkbWFfYmxvY2s7CisJaW50IHJlYWRfb2Zmc2V0OworCWludCByZWFkX2NvdW50OworCXdhaXRfcXVldWVfaGVhZF90IHJlYWRxOworCisJLyogc2V0dGluZ3MgKi8KKwlpbnQgZ2FpblszXTsKKwlpbnQgc291cmNlOworCWludCBiaXRzOworCWludCBkZWNpbWF0aW9uOworCWludCBtaXhjb3VudDsKKwlpbnQgc2FtcGxlc2hpZnQ7CisJaW50IGNoYW5uZWxzOworCWludCBhbmFsb2c7CisJaW50IHJhdGU7Cit9OworCitzdHJ1Y3QgY2FyZGluZm8geworCWNoYXIgKm5hbWU7CisJaW50IHJhdGU7Cit9OworCitzdGF0aWMgc3RydWN0IGJ0YXVkaW8gKmJ0YXVkaW9zOworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2RlYnVnOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEJVRl9ERUZBVUxUIDEyOCoxMDI0CisjZGVmaW5lIEJVRl9NSU4gICAgICAgICA4MTkyCisKK3N0YXRpYyBpbnQgYWxsb2NfYnVmZmVyKHN0cnVjdCBidGF1ZGlvICpidGEpCit7CisJaWYgKE5VTEwgPT0gYnRhLT5idWZfY3B1KSB7CisJCWZvciAoYnRhLT5idWZfc2l6ZSA9IEJVRl9ERUZBVUxUOyBidGEtPmJ1Zl9zaXplID49IEJVRl9NSU47CisJCSAgICAgYnRhLT5idWZfc2l6ZSA9IGJ0YS0+YnVmX3NpemUgPj4gMSkgeworCQkJYnRhLT5idWZfY3B1ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQKKwkJCQkoYnRhLT5wY2ksIGJ0YS0+YnVmX3NpemUsICZidGEtPmJ1Zl9kbWEpOworCQkJaWYgKE5VTEwgIT0gYnRhLT5idWZfY3B1KQorCQkJCWJyZWFrOworCQl9CisJCWlmIChOVUxMID09IGJ0YS0+YnVmX2NwdSkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQoYnRhLT5idWZfY3B1LDAsYnRhLT5idWZfc2l6ZSk7CisJfQorCWlmIChOVUxMID09IGJ0YS0+cmlzY19jcHUpIHsKKwkJYnRhLT5yaXNjX3NpemUgPSBQQUdFX1NJWkU7CisJCWJ0YS0+cmlzY19jcHUgPSBwY2lfYWxsb2NfY29uc2lzdGVudAorCQkJKGJ0YS0+cGNpLCBidGEtPnJpc2Nfc2l6ZSwgJmJ0YS0+cmlzY19kbWEpOworCQlpZiAoTlVMTCA9PSBidGEtPnJpc2NfY3B1KSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGJ0YS0+cGNpLCBidGEtPmJ1Zl9zaXplLCBidGEtPmJ1Zl9jcHUsIGJ0YS0+YnVmX2RtYSk7CisJCQlidGEtPmJ1Zl9jcHUgPSBOVUxMOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYnVmZmVyKHN0cnVjdCBidGF1ZGlvICpidGEpCit7CisJaWYgKE5VTEwgIT0gYnRhLT5idWZfY3B1KSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYnRhLT5wY2ksIGJ0YS0+YnVmX3NpemUsCisJCQkJICAgIGJ0YS0+YnVmX2NwdSwgYnRhLT5idWZfZG1hKTsKKwkJYnRhLT5idWZfY3B1ID0gTlVMTDsKKwl9CisJaWYgKE5VTEwgIT0gYnRhLT5yaXNjX2NwdSkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGJ0YS0+cGNpLCBidGEtPnJpc2Nfc2l6ZSwKKwkJCQkgICAgYnRhLT5yaXNjX2NwdSwgYnRhLT5yaXNjX2RtYSk7CisJCWJ0YS0+cmlzY19jcHUgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBtYWtlX3Jpc2Moc3RydWN0IGJ0YXVkaW8gKmJ0YSkKK3sKKwlpbnQgcnAsIGJwLCBsaW5lLCBibG9jazsKKwl1bnNpZ25lZCBsb25nIHJpc2M7CisKKwlidGEtPmJsb2NrX2J5dGVzID0gYnRhLT5idWZfc2l6ZSA+PiA0OworCWJ0YS0+YmxvY2tfY291bnQgPSAxIDw8IDQ7CisJYnRhLT5saW5lX2J5dGVzICA9IGJ0YS0+YmxvY2tfYnl0ZXM7CisJYnRhLT5saW5lX2NvdW50ICA9IGJ0YS0+YmxvY2tfY291bnQ7CisJd2hpbGUgKGJ0YS0+bGluZV9ieXRlcyA+IDQwOTUpIHsKKwkJYnRhLT5saW5lX2J5dGVzID4+PSAxOworCQlidGEtPmxpbmVfY291bnQgPDw9IDE7CisJfQorCWlmIChidGEtPmxpbmVfY291bnQgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJidGF1ZGlvOiBidWZzaXplPSVkIC0gYnM9JWQgYmM9JWQgLSBscz0lZCwgbGM9JWRcbiIsCisJCSAgICAgICBidGEtPmJ1Zl9zaXplLGJ0YS0+YmxvY2tfYnl0ZXMsYnRhLT5ibG9ja19jb3VudCwKKwkJICAgICAgIGJ0YS0+bGluZV9ieXRlcyxidGEtPmxpbmVfY291bnQpOworICAgICAgICBycCA9IDA7IGJwID0gMDsKKwlibG9jayA9IDA7CisJYnRhLT5yaXNjX2NwdVtycCsrXSA9IGNwdV90b19sZTMyKFJJU0NfU1lOQ3xSSVNDX1NZTkNfRk0xKTsKKwlidGEtPnJpc2NfY3B1W3JwKytdID0gY3B1X3RvX2xlMzIoMCk7CisJZm9yIChsaW5lID0gMDsgbGluZSA8IGJ0YS0+bGluZV9jb3VudDsgbGluZSsrKSB7CisJCXJpc2MgID0gUklTQ19XUklURSB8IFJJU0NfV1JfU09MIHwgUklTQ19XUl9FT0w7CisJCXJpc2MgfD0gYnRhLT5saW5lX2J5dGVzOworCQlpZiAoMCA9PSAoYnAgJiAoYnRhLT5ibG9ja19ieXRlcy0xKSkpIHsKKwkJCXJpc2MgfD0gUklTQ19JUlE7CisJCQlyaXNjIHw9IChibG9jayAgJiAweDBmKSA8PCAxNjsKKwkJCXJpc2MgfD0gKH5ibG9jayAmIDB4MGYpIDw8IDIwOworCQkJYmxvY2srKzsKKwkJfQorCQlidGEtPnJpc2NfY3B1W3JwKytdID0gY3B1X3RvX2xlMzIocmlzYyk7CisJCWJ0YS0+cmlzY19jcHVbcnArK10gPSBjcHVfdG9fbGUzMihidGEtPmJ1Zl9kbWEgKyBicCk7CisJCWJwICs9IGJ0YS0+bGluZV9ieXRlczsKKwl9CisJYnRhLT5yaXNjX2NwdVtycCsrXSA9IGNwdV90b19sZTMyKFJJU0NfU1lOQ3xSSVNDX1NZTkNfVlJPKTsKKwlidGEtPnJpc2NfY3B1W3JwKytdID0gY3B1X3RvX2xlMzIoMCk7CisJYnRhLT5yaXNjX2NwdVtycCsrXSA9IGNwdV90b19sZTMyKFJJU0NfSlVNUCk7IAorCWJ0YS0+cmlzY19jcHVbcnArK10gPSBjcHVfdG9fbGUzMihidGEtPnJpc2NfZG1hKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFydF9yZWNvcmRpbmcoc3RydWN0IGJ0YXVkaW8gKmJ0YSkKK3sKKwlpbnQgcmV0OworCisJaWYgKDAgIT0gKHJldCA9IGFsbG9jX2J1ZmZlcihidGEpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoMCAhPSAocmV0ID0gbWFrZV9yaXNjKGJ0YSkpKQorCQlyZXR1cm4gcmV0OworCisJYnR3cml0ZShidGEtPnJpc2NfZG1hLCBSRUdfUklTQ19TVFJUX0FERCk7CisJYnR3cml0ZSgoYnRhLT5saW5lX2NvdW50IDw8IDE2KSB8IGJ0YS0+bGluZV9ieXRlcywKKwkJUkVHX1BBQ0tFVF9MRU4pOworCWJ0d3JpdGUoSVJRX0JUQVVESU8sIFJFR19JTlRfTUFTSyk7CisJaWYgKGJ0YS0+YW5hbG9nKSB7CisJCWJ0d3JpdGUoRE1BX0NUTF9BQ0FQX0VOIHwKKwkJCURNQV9DVExfUklTQ19FTiB8CisJCQlETUFfQ1RMX0ZJRk9fRU4gfAorCQkJRE1BX0NUTF9EQV9FUzIgIHwKKwkJCSgoYnRhLT5iaXRzID09IDgpID8gRE1BX0NUTF9EQV9TQlIgOiAwKSB8CisJCQkoYnRhLT5nYWluW2J0YS0+c291cmNlXSA8PCAyOCkgfAorCQkJKGJ0YS0+c291cmNlICAgICAgICAgICAgPDwgMjQpIHwKKwkJCShidGEtPmRlY2ltYXRpb24gICAgICAgIDw8ICA4KSwKKwkJCVJFR19HUElPX0RNQV9DVEwpOworCX0gZWxzZSB7CisJCWJ0d3JpdGUoRE1BX0NUTF9BQ0FQX0VOIHwKKwkJCURNQV9DVExfUklTQ19FTiB8CisJCQlETUFfQ1RMX0ZJRk9fRU4gfAorCQkJRE1BX0NUTF9EQV9FUzIgIHwKKwkJCURNQV9DVExfQV9QV1JETiB8CisJCQkoMSA8PCA2KSAgIHwKKwkJCSgoYnRhLT5iaXRzID09IDgpID8gRE1BX0NUTF9EQV9TQlIgOiAwKSB8CisJCQkoYnRhLT5nYWluW2J0YS0+c291cmNlXSA8PCAyOCkgfAorCQkJKGJ0YS0+c291cmNlICAgICAgICAgICAgPDwgMjQpIHwKKwkJCShidGEtPmRlY2ltYXRpb24gICAgICAgIDw8ICA4KSwKKwkJCVJFR19HUElPX0RNQV9DVEwpOworCX0KKwlidGEtPmRtYV9ibG9jayA9IDA7CisJYnRhLT5yZWFkX29mZnNldCA9IDA7CisJYnRhLT5yZWFkX2NvdW50ID0gMDsKKwlidGEtPnJlY29yZGluZyA9IDE7CisJaWYgKGRlYnVnKQorCQlwcmludGsoS0VSTl9ERUJVRyAiYnRhdWRpbzogcmVjb3JkaW5nIHN0YXJ0ZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdG9wX3JlY29yZGluZyhzdHJ1Y3QgYnRhdWRpbyAqYnRhKQoreworICAgICAgICBidGFuZCh+MTUsIFJFR19HUElPX0RNQV9DVEwpOworCWJ0YS0+cmVjb3JkaW5nID0gMDsKKwlpZiAoZGVidWcpCisJCXByaW50ayhLRVJOX0RFQlVHICJidGF1ZGlvOiByZWNvcmRpbmcgc3RvcHBlZFxuIik7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBidGF1ZGlvX21peGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhOworCisJZm9yIChidGEgPSBidGF1ZGlvczsgYnRhICE9IE5VTEw7IGJ0YSA9IGJ0YS0+bmV4dCkKKwkJaWYgKGJ0YS0+bWl4ZXJfZGV2ID09IG1pbm9yKQorCQkJYnJlYWs7CisJaWYgKE5VTEwgPT0gYnRhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKCJidGF1ZGlvOiBvcGVuIG1peGVyIFslZF1cbiIsbWlub3IpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGJ0YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidGF1ZGlvX21peGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnRhdWRpb19taXhlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQsdmFsPTAsaT0wOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCW1peGVyX2luZm8gaW5mbzsKKwkJbWVtc2V0KCZpbmZvLDAsc2l6ZW9mKGluZm8pKTsKKyAgICAgICAgICAgICAgICBzdHJsY3B5KGluZm8uaWQsImJ0ODc4IixzaXplb2YoaW5mby5pZCkpOworICAgICAgICAgICAgICAgIHN0cmxjcHkoaW5mby5uYW1lLCJCcm9va3RyZWUgQnQ4NzggYXVkaW8iLHNpemVvZihpbmZvLm5hbWUpKTsKKyAgICAgICAgICAgICAgICBpbmZvLm1vZGlmeV9jb3VudGVyID0gYnRhLT5taXhjb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLCBzaXplb2YoaW5mbykpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CisJCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sMCxzaXplb2YoaW5mbykpOworICAgICAgICAgICAgICAgIHN0cmxjcHkoaW5mby5pZCwiYnQ4NzgiLHNpemVvZihpbmZvLmlkKS0xKTsKKyAgICAgICAgICAgICAgICBzdHJsY3B5KGluZm8ubmFtZSwiQnJvb2t0cmVlIEJ0ODc4IGF1ZGlvIixzaXplb2YoaW5mby5uYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgX191c2VyICopYXJncCk7CisKKwkvKiByZWFkICovCisJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpCisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0NBUFMpOgorCQlyZXQgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJYnJlYWs7CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1NURVJFT0RFVlMpOgorCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUkVDTUFTSyk6CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0RFVk1BU0spOgorCQlyZXQgPSBTT1VORF9NQVNLX0xJTkUxfFNPVU5EX01BU0tfTElORTJ8U09VTkRfTUFTS19MSU5FMzsKKwkJYnJlYWs7CisKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1JFQ1NSQyk6CisJCWlmICh2YWwgJiBTT1VORF9NQVNLX0xJTkUxICYmIGJ0YS0+c291cmNlICE9IDApCisJCQlidGEtPnNvdXJjZSA9IDA7CisJCWVsc2UgaWYgKHZhbCAmIFNPVU5EX01BU0tfTElORTIgJiYgYnRhLT5zb3VyY2UgIT0gMSkKKwkJCWJ0YS0+c291cmNlID0gMTsKKwkJZWxzZSBpZiAodmFsICYgU09VTkRfTUFTS19MSU5FMyAmJiBidGEtPnNvdXJjZSAhPSAyKQorCQkJYnRhLT5zb3VyY2UgPSAyOworCQlidGFvcigoYnRhLT5nYWluW2J0YS0+c291cmNlXSA8PCAyOCkgfAorCQkgICAgICAoYnRhLT5zb3VyY2UgICAgICAgICAgICA8PCAyNCksCisJCSAgICAgIDB4MGNmZmZmZmYsIFJFR19HUElPX0RNQV9DVEwpOworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9SRUNTUkMpOgorCQlzd2l0Y2ggKGJ0YS0+c291cmNlKSB7CisJCWNhc2UgMDogIHJldCA9IFNPVU5EX01BU0tfTElORTE7IGJyZWFrOworCQljYXNlIDE6ICByZXQgPSBTT1VORF9NQVNLX0xJTkUyOyBicmVhazsKKwkJY2FzZSAyOiAgcmV0ID0gU09VTkRfTUFTS19MSU5FMzsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUxKToKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUyKToKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUzKToKKwkJaWYgKE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUxKSA9PSBjbWQpCisJCQlpID0gMDsKKwkJaWYgKE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUyKSA9PSBjbWQpCisJCQlpID0gMTsKKwkJaWYgKE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUzKSA9PSBjbWQpCisJCQlpID0gMjsKKwkJYnRhLT5nYWluW2ldID0gKHZhbCAmIDB4ZmYpICogMTUgLyAxMDA7CisJCWlmIChidGEtPmdhaW5baV0gPiAxNSkgYnRhLT5nYWluW2ldID0gMTU7CisJCWlmIChidGEtPmdhaW5baV0gPCAgMCkgYnRhLT5nYWluW2ldID0gIDA7CisJCWlmIChpID09IGJ0YS0+c291cmNlKQorCQkJYnRhb3IoKGJ0YS0+Z2FpbltidGEtPnNvdXJjZV08PDI4KSwKKwkJCSAgICAgIDB4MGZmZmZmZmYsIFJFR19HUElPX0RNQV9DVEwpOworCQlyZXQgID0gYnRhLT5nYWluW2ldICogMTAwIC8gMTU7CisJCXJldCB8PSByZXQgPDwgODsKKwkJYnJlYWs7CisKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTElORTEpOgorCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMik6CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUzKToKKwkJaWYgKE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTElORTEpID09IGNtZCkKKwkJCWkgPSAwOworCQlpZiAoTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMikgPT0gY21kKQorCQkJaSA9IDE7CisJCWlmIChNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUzKSA9PSBjbWQpCisJCQlpID0gMjsKKwkJcmV0ICA9IGJ0YS0+Z2FpbltpXSAqIDEwMCAvIDE1OworCQlyZXQgfD0gcmV0IDw8IDg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChwdXRfdXNlcihyZXQsIChpbnQgX191c2VyICopYXJncCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidGF1ZGlvX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5vcGVuCQk9IGJ0YXVkaW9fbWl4ZXJfb3BlbiwKKwkucmVsZWFzZQk9IGJ0YXVkaW9fbWl4ZXJfcmVsZWFzZSwKKwkuaW9jdGwJCT0gYnRhdWRpb19taXhlcl9pb2N0bCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYnRhdWRpb19kc3Bfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICBzdHJ1Y3QgYnRhdWRpbyAqYnRhLCBpbnQgYW5hbG9nKQoreworCWRvd24oJmJ0YS0+bG9jayk7CisJaWYgKGJ0YS0+dXNlcnMpCisJCWdvdG8gYnVzeTsKKwlidGEtPnVzZXJzKys7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnRhOworCisJYnRhLT5hbmFsb2cgPSBhbmFsb2c7CisJYnRhLT5kbWFfYmxvY2sgPSAwOworCWJ0YS0+cmVhZF9vZmZzZXQgPSAwOworCWJ0YS0+cmVhZF9jb3VudCA9IDA7CisJYnRhLT5zYW1wbGVzaGlmdCA9IDA7CisKKwl1cCgmYnRhLT5sb2NrKTsKKwlyZXR1cm4gMDsKKworIGJ1c3k6CisJdXAoJmJ0YS0+bG9jayk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBidGF1ZGlvX2RzcF9vcGVuX2RpZ2l0YWwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhOworCisJZm9yIChidGEgPSBidGF1ZGlvczsgYnRhICE9IE5VTEw7IGJ0YSA9IGJ0YS0+bmV4dCkKKwkJaWYgKGJ0YS0+ZHNwX2RpZ2l0YWwgPT0gbWlub3IpCisJCQlicmVhazsKKwlpZiAoTlVMTCA9PSBidGEpCisJCXJldHVybiAtRU5PREVWOworCQorCWlmIChkZWJ1ZykKKwkJcHJpbnRrKCJidGF1ZGlvOiBvcGVuIGRpZ2l0YWwgZHNwIFslZF1cbiIsbWlub3IpOworCXJldHVybiBidGF1ZGlvX2RzcF9vcGVuKGlub2RlLGZpbGUsYnRhLDApOworfQorCitzdGF0aWMgaW50IGJ0YXVkaW9fZHNwX29wZW5fYW5hbG9nKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGJ0YXVkaW8gKmJ0YTsKKworCWZvciAoYnRhID0gYnRhdWRpb3M7IGJ0YSAhPSBOVUxMOyBidGEgPSBidGEtPm5leHQpCisJCWlmIChidGEtPmRzcF9hbmFsb2cgPT0gbWlub3IpCisJCQlicmVhazsKKwlpZiAoTlVMTCA9PSBidGEpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGRlYnVnKQorCQlwcmludGsoImJ0YXVkaW86IG9wZW4gYW5hbG9nIGRzcCBbJWRdXG4iLG1pbm9yKTsKKwlyZXR1cm4gYnRhdWRpb19kc3Bfb3Blbihpbm9kZSxmaWxlLGJ0YSwxKTsKK30KKworc3RhdGljIGludCBidGF1ZGlvX2RzcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBidGF1ZGlvICpidGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlkb3duKCZidGEtPmxvY2spOworCWlmIChidGEtPnJlY29yZGluZykKKwkJc3RvcF9yZWNvcmRpbmcoYnRhKTsKKwlidGEtPnVzZXJzLS07CisJdXAoJmJ0YS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJ0YXVkaW9fZHNwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJc2l6ZV90IHN3Y291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBod2NvdW50ID0gc3djb3VudCA8PCBidGEtPnNhbXBsZXNoaWZ0OworCWludCBuc3JjLCBuZHN0LCBlcnIsIHJldCA9IDA7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmYnRhLT5yZWFkcSwgJndhaXQpOworCWRvd24oJmJ0YS0+bG9jayk7CisJd2hpbGUgKHN3Y291bnQgPiAwKSB7CisJCWlmICgwID09IGJ0YS0+cmVhZF9jb3VudCkgeworCQkJaWYgKCFidGEtPnJlY29yZGluZykgeworCQkJCWlmICgwICE9IChlcnIgPSBzdGFydF9yZWNvcmRpbmcoYnRhKSkpIHsKKwkJCQkJaWYgKDAgPT0gcmV0KQorCQkJCQkJcmV0ID0gZXJyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoMCA9PSByZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQl1cCgmYnRhLT5sb2NrKTsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJc2NoZWR1bGUoKTsKKwkJCWRvd24oJmJ0YS0+bG9jayk7CisJCQlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICgwID09IHJldCkKKwkJCQkJcmV0ID0gLUVJTlRSOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW5zcmMgPSAoYnRhLT5yZWFkX2NvdW50IDwgaHdjb3VudCkgPyBidGEtPnJlYWRfY291bnQgOiBod2NvdW50OworCQlpZiAobnNyYyA+IGJ0YS0+YnVmX3NpemUgLSBidGEtPnJlYWRfb2Zmc2V0KQorCQkJbnNyYyA9IGJ0YS0+YnVmX3NpemUgLSBidGEtPnJlYWRfb2Zmc2V0OworCQluZHN0ID0gbnNyYyA+PiBidGEtPnNhbXBsZXNoaWZ0OworCQkKKwkJaWYgKChidGEtPmFuYWxvZyAgJiYgMCA9PSBidGEtPnNhbXBsZXNoaWZ0KSB8fAorCQkgICAgKCFidGEtPmFuYWxvZyAmJiAyID09IGJ0YS0+Y2hhbm5lbHMpKSB7CisJCQkvKiBqdXN0IGNvcHkgKi8KKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyICsgcmV0LCBidGEtPmJ1Zl9jcHUgKyBidGEtPnJlYWRfb2Zmc2V0LCBuc3JjKSkgeworCQkJCWlmICgwID09IHJldCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQl9IGVsc2UgaWYgKCFidGEtPmFuYWxvZykgeworCQkJLyogc3RlcmVvID0+IG1vbm8gKGRpZ2l0YWwgYXVkaW8pICovCisJCQlfX3MxNiAqc3JjID0gKF9fczE2KikoYnRhLT5idWZfY3B1ICsgYnRhLT5yZWFkX29mZnNldCk7CisJCQlfX3MxNiBfX3VzZXIgKmRzdCA9IChfX3MxNiBfX3VzZXIgKikoYnVmZmVyICsgcmV0KTsKKwkJCV9fczE2IGF2ZzsKKwkJCWludCBuID0gbmRzdD4+MTsKKwkJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCBuZHN0KSkgeworCQkJCWlmICgwID09IHJldCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZvciAoOyBuOyBuLS0sIGRzdCsrKSB7CisJCQkJYXZnICA9IChfX3MxNilsZTE2X3RvX2NwdSgqc3JjKSAvIDI7IHNyYysrOworCQkJCWF2ZyArPSAoX19zMTYpbGUxNl90b19jcHUoKnNyYykgLyAyOyBzcmMrKzsKKwkJCQlfX3B1dF91c2VyKGNwdV90b19sZTE2KGF2ZyksZHN0KTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKDggPT0gYnRhLT5iaXRzKSB7CisJCQkvKiBjb3B5ICsgYnl0ZSBkb3duc2FtcGxpbmcgKGF1ZGlvIEEvRCkgKi8KKwkJCV9fdTggKnNyYyA9IGJ0YS0+YnVmX2NwdSArIGJ0YS0+cmVhZF9vZmZzZXQ7CisJCQlfX3U4IF9fdXNlciAqZHN0ID0gYnVmZmVyICsgcmV0OworCQkJaW50IG4gPSBuZHN0OworCQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIG5kc3QpKSB7CisJCQkJaWYgKDAgPT0gcmV0KQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJZm9yICg7IG47IG4tLSwgc3JjICs9ICgxIDw8IGJ0YS0+c2FtcGxlc2hpZnQpLCBkc3QrKykKKwkJCQlfX3B1dF91c2VyKCpzcmMsIGRzdCk7CisKKwkJfSBlbHNlIHsKKwkJCS8qIGNvcHkgKyB3b3JkIGRvd25zYW1wbGluZyAoYXVkaW8gQS9EKSAqLworCQkJX191MTYgKnNyYyA9IChfX3UxNiopKGJ0YS0+YnVmX2NwdSArIGJ0YS0+cmVhZF9vZmZzZXQpOworCQkJX191MTYgX191c2VyICpkc3QgPSAoX191MTYgX191c2VyICopKGJ1ZmZlciArIHJldCk7CisJCQlpbnQgbiA9IG5kc3Q+PjE7CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsZHN0LG5kc3QpKSB7CisJCQkJaWYgKDAgPT0gcmV0KQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJZm9yICg7IG47IG4tLSwgc3JjICs9ICgxIDw8IGJ0YS0+c2FtcGxlc2hpZnQpLCBkc3QrKykKKwkJCQlfX3B1dF91c2VyKCpzcmMsIGRzdCk7CisJCX0KKworCQlyZXQgICAgICs9IG5kc3Q7CisJCXN3Y291bnQgLT0gbmRzdDsKKwkJaHdjb3VudCAtPSBuc3JjOworCQlidGEtPnJlYWRfY291bnQgIC09IG5zcmM7CisJCWJ0YS0+cmVhZF9vZmZzZXQgKz0gbnNyYzsKKwkJaWYgKGJ0YS0+cmVhZF9vZmZzZXQgPT0gYnRhLT5idWZfc2l6ZSkKKwkJCWJ0YS0+cmVhZF9vZmZzZXQgPSAwOworCX0KKwl1cCgmYnRhLT5sb2NrKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmYnRhLT5yZWFkcSwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJ0YXVkaW9fZHNwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBidGF1ZGlvX2RzcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJ0YXVkaW8gKmJ0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcywgaSwgcmV0LCB2YWwgPSAwOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCQorICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIE9TU19HRVRWRVJTSU9OOgorICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGJ0YS0+YW5hbG9nKSB7CisJCQlmb3IgKHMgPSAwOyBzIDwgMTY7IHMrKykKKwkJCQlpZiAodmFsIDw8IHMgPj0gSFdCQVNFX0FEKjQvMTUpCisJCQkJCWJyZWFrOworCQkJZm9yIChpID0gMTU7IGkgPj0gNTsgaS0tKQorCQkJCWlmICh2YWwgPDwgcyA8PSBIV0JBU0VfQUQqNC9pKQorCQkJCQlicmVhazsKKwkJCWJ0YS0+c2FtcGxlc2hpZnQgPSBzOworCQkJYnRhLT5kZWNpbWF0aW9uICA9IGk7CisJCQlpZiAoZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImJ0YXVkaW86IHJhdGU6IHJlcT0lZCAgIgorCQkJCSAgICAgICAiZGVjPSVkIHNoaWZ0PSVkIGh3cmF0ZT0lZCBzd3JhdGU9JWRcbiIsCisJCQkJICAgICAgIHZhbCxpLHMsKEhXQkFTRV9BRCo0L2kpLChIV0JBU0VfQUQqNC9pKT4+cyk7CisJCX0gZWxzZSB7CisJCQlidGEtPnNhbXBsZXNoaWZ0ID0gKGJ0YS0+Y2hhbm5lbHMgPT0gMikgPyAwIDogMTsKKwkJCWJ0YS0+ZGVjaW1hdGlvbiAgPSAwOworCQl9CisJCWlmIChidGEtPnJlY29yZGluZykgeworCQkJZG93bigmYnRhLT5sb2NrKTsKKwkJCXN0b3BfcmVjb3JkaW5nKGJ0YSk7CisJCQlzdGFydF9yZWNvcmRpbmcoYnRhKTsKKwkJCXVwKCZidGEtPmxvY2spOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCWlmIChidGEtPmFuYWxvZykgeworCQkJcmV0dXJuIHB1dF91c2VyKEhXQkFTRV9BRCo0L2J0YS0+ZGVjaW1hdGlvbj4+YnRhLT5zYW1wbGVzaGlmdCwgcCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcHV0X3VzZXIoYnRhLT5yYXRlLCBwKTsKKwkJfQorCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmICghYnRhLT5hbmFsb2cpIHsKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnRhLT5jaGFubmVscyAgICA9ICh2YWwgPiAwKSA/IDIgOiAxOworCQkJYnRhLT5zYW1wbGVzaGlmdCA9IChidGEtPmNoYW5uZWxzID09IDIpID8gMCA6IDE7CisJCQlpZiAoZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAiYnRhdWRpbzogc3RlcmVvPSVkIGNoYW5uZWxzPSVkXG4iLAorCQkJCSAgICAgICB2YWwsYnRhLT5jaGFubmVscyk7CisJCX0gZWxzZSB7CisJCQlpZiAodmFsID09IDEpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQllbHNlIHsKKwkJCQlidGEtPmNoYW5uZWxzID0gMTsKKwkJCQlpZiAoZGVidWcpCisJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJICAgICAgICJidGF1ZGlvOiBzdGVyZW89MCBjaGFubmVscz0xXG4iKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKGJ0YS0+Y2hhbm5lbHMpLTEsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKwkJaWYgKCFidGEtPmFuYWxvZykgeworCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlidGEtPmNoYW5uZWxzICAgID0gKHZhbCA+IDEpID8gMiA6IDE7CisJCQlidGEtPnNhbXBsZXNoaWZ0ID0gKGJ0YS0+Y2hhbm5lbHMgPT0gMikgPyAwIDogMTsKKwkJCWlmIChkZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiYnRhdWRpbzogdmFsPSVkIGNoYW5uZWxzPSVkXG4iLAorCQkJCSAgICAgICB2YWwsYnRhLT5jaGFubmVscyk7CisJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcihidGEtPmNoYW5uZWxzLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworCQlpZiAoYnRhLT5hbmFsb2cpCisJCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9TOCwgcCk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWlmIChidGEtPmFuYWxvZykKKwkJCQlidGEtPmJpdHMgPSAodmFsID09IEFGTVRfUzgpID8gOCA6IDE2OworCQkJZWxzZQorCQkJCWJ0YS0+Yml0cyA9IDE2OworCQkJaWYgKGJ0YS0+cmVjb3JkaW5nKSB7CisJCQkJZG93bigmYnRhLT5sb2NrKTsKKwkJCQlzdG9wX3JlY29yZGluZyhidGEpOworCQkJCXN0YXJ0X3JlY29yZGluZyhidGEpOworCQkJCXVwKCZidGEtPmxvY2spOworCQkJfQorCQl9CisJCWlmIChkZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICJidGF1ZGlvOiBmbXQ6IGJpdHM9JWRcbiIsYnRhLT5iaXRzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoKGJ0YS0+Yml0cz09MTYpID8gQUZNVF9TMTZfTEUgOiBBRk1UX1M4LAorCQkJCXApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlyZXR1cm4gcHV0X3VzZXIoYnRhLT5iaXRzLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisgICAgICAgICAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJaWYgKGJ0YS0+cmVjb3JkaW5nKSB7CisJCQlkb3duKCZidGEtPmxvY2spOworCQkJc3RvcF9yZWNvcmRpbmcoYnRhKTsKKwkJCXVwKCZidGEtPmxvY2spOworCQl9CisJCXJldHVybiAwOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKCFidGEtPnJlY29yZGluZykgeworCQkJaWYgKDAgIT0gKHJldCA9IGFsbG9jX2J1ZmZlcihidGEpKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKDAgIT0gKHJldCA9IG1ha2VfcmlzYyhidGEpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiBwdXRfdXNlcihidGEtPmJsb2NrX2J5dGVzPj5idGEtPnNhbXBsZXNoaWZ0LHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQkvKiBOT1AgKi8KKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwl7CisJCWF1ZGlvX2J1Zl9pbmZvIGluZm87CisJCWlmICghYnRhLT5yZWNvcmRpbmcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaW5mby5mcmFnc2l6ZSA9IGJ0YS0+YmxvY2tfYnl0ZXM+PmJ0YS0+c2FtcGxlc2hpZnQ7CisJCWluZm8uZnJhZ3N0b3RhbCA9IGJ0YS0+YmxvY2tfY291bnQ7CisJCWluZm8uYnl0ZXMgPSBidGEtPnJlYWRfY291bnQ7CisJCWluZm8uZnJhZ21lbnRzID0gaW5mby5ieXRlcyAvIGluZm8uZnJhZ3NpemU7CisJCWlmIChkZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICJidGF1ZGlvOiBTTkRDVExfRFNQX0dFVElTUEFDRSAiCisJCQkgICAgICAgInJldHVybnMgJWQvJWQvJWQvJWRcbiIsCisJCQkgICAgICAgaW5mby5mcmFnc2l6ZSwgaW5mby5mcmFnc3RvdGFsLAorCQkJICAgICAgIGluZm8uYnl0ZXMsIGluZm8uZnJhZ21lbnRzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisjaWYgMCAvKiBUT0RPICovCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJ0YXVkaW9fZHNwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCXBvbGxfd2FpdChmaWxlLCAmYnRhLT5yZWFkcSwgd2FpdCk7CisKKwlpZiAoMCAhPSBidGEtPnJlYWRfY291bnQpCisJCW1hc2sgfD0gKFBPTExJTiB8IFBPTExSRE5PUk0pOworCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ0YXVkaW9fZGlnaXRhbF9kc3BfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLm9wZW4JCT0gYnRhdWRpb19kc3Bfb3Blbl9kaWdpdGFsLAorCS5yZWxlYXNlCT0gYnRhdWRpb19kc3BfcmVsZWFzZSwKKwkucmVhZAkJPSBidGF1ZGlvX2RzcF9yZWFkLAorCS53cml0ZQkJPSBidGF1ZGlvX2RzcF93cml0ZSwKKwkuaW9jdGwJCT0gYnRhdWRpb19kc3BfaW9jdGwsCisJLnBvbGwJCT0gYnRhdWRpb19kc3BfcG9sbCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ0YXVkaW9fYW5hbG9nX2RzcF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkub3BlbgkJPSBidGF1ZGlvX2RzcF9vcGVuX2FuYWxvZywKKwkucmVsZWFzZQk9IGJ0YXVkaW9fZHNwX3JlbGVhc2UsCisJLnJlYWQJCT0gYnRhdWRpb19kc3BfcmVhZCwKKwkud3JpdGUJCT0gYnRhdWRpb19kc3Bfd3JpdGUsCisJLmlvY3RsCQk9IGJ0YXVkaW9fZHNwX2lvY3RsLAorCS5wb2xsCQk9IGJ0YXVkaW9fZHNwX3BvbGwsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY2hhciAqaXJxX25hbWVbXSA9IHsgIiIsICIiLCAiIiwgIk9GTE9XIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsCisJCQkgICAgIlJJU0NJIiwgIkZCVVMiLCAiRlRSR1QiLCAiRkRTUiIsICJQUEVSUiIsCisJCQkgICAgIlJJUEVSUiIsICJQQUJPUlQiLCAiT0NFUlIiLCAiU0NFUlIiIH07CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBidGF1ZGlvX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlpbnQgY291bnQgPSAwOworCXUzMiBzdGF0LGFzdGF0OworCXN0cnVjdCBidGF1ZGlvICpidGEgPSBkZXZfaWQ7CisJaW50IGhhbmRsZWQgPSAwOworCisJZm9yICg7OykgeworCQljb3VudCsrOworCQlzdGF0ICA9IGJ0cmVhZChSRUdfSU5UX1NUQVQpOworCQlhc3RhdCA9IHN0YXQgJiBidHJlYWQoUkVHX0lOVF9NQVNLKTsKKwkJaWYgKCFhc3RhdCkKKwkJCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworCQloYW5kbGVkID0gMTsKKwkJYnR3cml0ZShhc3RhdCxSRUdfSU5UX1NUQVQpOworCisJCWlmIChpcnFfZGVidWcpIHsKKwkJCWludCBpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImJ0YXVkaW86IGlycSBsb29wPSVkIHJpc2M9JXgsIGJpdHM6IiwKKwkJCSAgICAgICBjb3VudCwgc3RhdD4+MjgpOworCQkJZm9yIChpID0gMDsgaSA8IChzaXplb2YoaXJxX25hbWUpL3NpemVvZihjaGFyKikpOyBpKyspIHsKKwkJCQlpZiAoc3RhdCAmICgxIDw8IGkpKQorCQkJCQlwcmludGsoIiAlcyIsaXJxX25hbWVbaV0pOworCQkJCWlmIChhc3RhdCAmICgxIDw8IGkpKQorCQkJCQlwcmludGsoIioiKTsKKwkJCX0KKwkJCXByaW50aygiXG4iKTsKKwkJfQorCQlpZiAoc3RhdCAmIElSUV9SSVNDSSkgeworCQkJaW50IGJsb2NrczsKKwkJCWJsb2NrcyA9IChzdGF0ID4+IDI4KSAtIGJ0YS0+ZG1hX2Jsb2NrOworCQkJaWYgKGJsb2NrcyA8IDApCisJCQkJYmxvY2tzICs9IGJ0YS0+YmxvY2tfY291bnQ7CisJCQlidGEtPmRtYV9ibG9jayA9IHN0YXQgPj4gMjg7CisJCQlpZiAoYnRhLT5yZWFkX2NvdW50ICsgMipidGEtPmJsb2NrX2J5dGVzID4gYnRhLT5idWZfc2l6ZSkgeworCQkJCXN0b3BfcmVjb3JkaW5nKGJ0YSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRhdWRpbzogYnVmZmVyIG92ZXJydW5cbiIpOworCQkJfQorCQkJaWYgKGJsb2NrcyA+IDApIHsKKwkJCQlidGEtPnJlYWRfY291bnQgKz0gYmxvY2tzICogYnRhLT5ibG9ja19ieXRlczsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmJ0YS0+cmVhZHEpOworCQkJfQorCQl9CisJCWlmIChjb3VudCA+IDEwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImJ0YXVkaW86IE9vcHMgLSBpcnEgbWFzayBjbGVhcmVkXG4iKTsKKwkJCWJ0d3JpdGUoMCwgUkVHX0lOVF9NQVNLKTsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHNwMSA9IC0xOworc3RhdGljIHVuc2lnbmVkIGludCBkc3AyID0gLTE7CitzdGF0aWMgdW5zaWduZWQgaW50IG1peGVyID0gLTE7CitzdGF0aWMgaW50IGxhdGVuY3kgPSAtMTsKK3N0YXRpYyBpbnQgZGlnaXRhbCA9IDE7CitzdGF0aWMgaW50IGFuYWxvZyA9IDE7CitzdGF0aWMgaW50IHJhdGU7CisKKyNkZWZpbmUgQlRBX09TUFJFWTIwMCAxCisKK3N0YXRpYyBzdHJ1Y3QgY2FyZGluZm8gY2FyZHNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gImRlZmF1bHQiLAorCQkucmF0ZQk9IDMyMDAwLAorCX0sCisJW0JUQV9PU1BSRVkyMDBdID0geworCQkubmFtZQk9ICJPc3ByZXkgMjAwIiwKKwkJLnJhdGUJPSA0NDEwMCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYnRhdWRpb19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0cnVjdCBidGF1ZGlvICpidGE7CisJc3RydWN0IGNhcmRpbmZvICpjYXJkID0gJmNhcmRzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdOworCXVuc2lnbmVkIGNoYXIgcmV2aXNpb24sbGF0OworCWludCByYyA9IC1FQlVTWTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCksCisJCQkJcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LDApLAorCQkJCSJidGF1ZGlvIikpIHsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlidGEgPSBrbWFsbG9jKHNpemVvZigqYnRhKSxHRlBfQVRPTUlDKTsKKwlpZiAoIWJ0YSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDA7CisJfQorCW1lbXNldChidGEsMCxzaXplb2YoKmJ0YSkpOworCisJYnRhLT5wY2kgID0gcGNpX2RldjsKKwlidGEtPmlycSAgPSBwY2lfZGV2LT5pcnE7CisJYnRhLT5tZW0gID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCk7CisJYnRhLT5tbWlvID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwwKSwKKwkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsMCkpOworCisJYnRhLT5zb3VyY2UgICAgID0gMTsKKwlidGEtPmJpdHMgICAgICAgPSA4OworCWJ0YS0+Y2hhbm5lbHMgICA9IDE7CisJaWYgKGJ0YS0+YW5hbG9nKSB7CisJCWJ0YS0+ZGVjaW1hdGlvbiAgPSAxNTsKKwl9IGVsc2UgeworCQlidGEtPmRlY2ltYXRpb24gID0gMDsKKwkJYnRhLT5zYW1wbGVzaGlmdCA9IDE7CisJfQorCisJLyogc2FtcGxlIHJhdGUgKi8KKwlidGEtPnJhdGUgPSBjYXJkLT5yYXRlOworCWlmIChyYXRlKQorCQlidGEtPnJhdGUgPSByYXRlOworCQorCWluaXRfTVVURVgoJmJ0YS0+bG9jayk7CisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ0YS0+cmVhZHEpOworCisJaWYgKC0xICE9IGxhdGVuY3kpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnRhdWRpbzogc2V0dGluZyBwY2kgbGF0ZW5jeSB0aW1lciB0byAlZFxuIiwKKwkJICAgICAgIGxhdGVuY3kpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0xBVEVOQ1lfVElNRVIsIGxhdGVuY3kpOworCX0KKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2aXNpb24pOworICAgICAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJmxhdCk7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gImJ0YXVkaW86IEJ0JXggKHJldiAlZCkgYXQgJTAyeDolMDJ4LiV4LCAiLAorCSAgICAgICBwY2lfZGV2LT5kZXZpY2UscmV2aXNpb24scGNpX2Rldi0+YnVzLT5udW1iZXIsCisJICAgICAgIFBDSV9TTE9UKHBjaV9kZXYtPmRldmZuKSxQQ0lfRlVOQyhwY2lfZGV2LT5kZXZmbikpOworICAgICAgICBwcmludGsoImlycTogJWQsIGxhdGVuY3k6ICVkLCBtbWlvOiAweCVseFxuIiwKKwkgICAgICAgYnRhLT5pcnEsIGxhdCwgYnRhLT5tZW0pOworCXByaW50aygiYnRhdWRpbzogdXNpbmcgY2FyZCBjb25maWcgXCIlc1wiXG4iLCBjYXJkLT5uYW1lKTsKKworCS8qIGluaXQgaHcgKi8KKyAgICAgICAgYnR3cml0ZSgwLCBSRUdfR1BJT19ETUFfQ1RMKTsKKyAgICAgICAgYnR3cml0ZSgwLCBSRUdfSU5UX01BU0spOworICAgICAgICBidHdyaXRlKH4wVSwgUkVHX0lOVF9TVEFUKTsKKwlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKworCWlmICgocmMgPSByZXF1ZXN0X2lycShidGEtPmlycSwgYnRhdWRpb19pcnEsIFNBX1NISVJRfFNBX0lOVEVSUlVQVCwKKwkJCSAgICAgICJidGF1ZGlvIiwodm9pZCAqKWJ0YSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiYnRhdWRpbzogY2FuJ3QgcmVxdWVzdCBpcnEgKHJjPSVkKVxuIixyYyk7CisJCWdvdG8gZmFpbDE7CisJfQorCisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCWlmIChkaWdpdGFsKSB7CisJCXJjID0gYnRhLT5kc3BfZGlnaXRhbCA9CisJCQlyZWdpc3Rlcl9zb3VuZF9kc3AoJmJ0YXVkaW9fZGlnaXRhbF9kc3BfZm9wcyxkc3AxKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJidGF1ZGlvOiBjYW4ndCByZWdpc3RlciBkaWdpdGFsIGRzcCAocmM9JWQpXG4iLHJjKTsKKwkJCWdvdG8gZmFpbDI7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnRhdWRpbzogcmVnaXN0ZXJlZCBkZXZpY2UgZHNwJWQgW2RpZ2l0YWxdXG4iLAorCQkgICAgICAgYnRhLT5kc3BfZGlnaXRhbCA+PiA0KTsKKwl9CisJaWYgKGFuYWxvZykgeworCQlyYyA9IGJ0YS0+ZHNwX2FuYWxvZyA9CisJCQlyZWdpc3Rlcl9zb3VuZF9kc3AoJmJ0YXVkaW9fYW5hbG9nX2RzcF9mb3BzLGRzcDIpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImJ0YXVkaW86IGNhbid0IHJlZ2lzdGVyIGFuYWxvZyBkc3AgKHJjPSVkKVxuIixyYyk7CisJCQlnb3RvIGZhaWwzOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gImJ0YXVkaW86IHJlZ2lzdGVyZWQgZGV2aWNlIGRzcCVkIFthbmFsb2ddXG4iLAorCQkgICAgICAgYnRhLT5kc3BfYW5hbG9nID4+IDQpOworCQlyYyA9IGJ0YS0+bWl4ZXJfZGV2ID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmJ0YXVkaW9fbWl4ZXJfZm9wcyxtaXhlcik7CisJCWlmIChyYyA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiYnRhdWRpbzogY2FuJ3QgcmVnaXN0ZXIgbWl4ZXIgKHJjPSVkKVxuIixyYyk7CisJCQlnb3RvIGZhaWw0OworCQl9CisJCXByaW50ayhLRVJOX0lORk8gImJ0YXVkaW86IHJlZ2lzdGVyZWQgZGV2aWNlIG1peGVyJWRcbiIsCisJCSAgICAgICBidGEtPm1peGVyX2RldiA+PiA0KTsKKwl9CisKKwkvKiBob29rIGludG8gbGlua2VkIGxpc3QgKi8KKwlidGEtPm5leHQgPSBidGF1ZGlvczsKKwlidGF1ZGlvcyA9IGJ0YTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LGJ0YSk7CisgICAgICAgIHJldHVybiAwOworCisgZmFpbDQ6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoYnRhLT5kc3BfYW5hbG9nKTsKKyBmYWlsMzoKKwlpZiAoZGlnaXRhbCkKKwkJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoYnRhLT5kc3BfZGlnaXRhbCk7CisgZmFpbDI6CisgICAgICAgIGZyZWVfaXJxKGJ0YS0+aXJxLGJ0YSk7CQorIGZhaWwxOgorCWtmcmVlKGJ0YSk7CisgZmFpbDA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LDApLAorCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LDApKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBidGF1ZGlvX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBidGF1ZGlvICp3YWxrOworCisJLyogdHVybiBvZmYgYWxsIERNQSAvIElSUXMgKi8KKyAgICAgICAgYnRhbmQofjE1LCBSRUdfR1BJT19ETUFfQ1RMKTsKKyAgICAgICAgYnR3cml0ZSgwLCBSRUdfSU5UX01BU0spOworICAgICAgICBidHdyaXRlKH4wVSwgUkVHX0lOVF9TVEFUKTsKKworCS8qIHVucmVnaXN0ZXIgZGV2aWNlcyAqLworCWlmIChkaWdpdGFsKSB7CisJCXVucmVnaXN0ZXJfc291bmRfZHNwKGJ0YS0+ZHNwX2RpZ2l0YWwpOworCX0KKwlpZiAoYW5hbG9nKSB7CisJCXVucmVnaXN0ZXJfc291bmRfZHNwKGJ0YS0+ZHNwX2FuYWxvZyk7CisJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoYnRhLT5taXhlcl9kZXYpOworCX0KKworCS8qIGZyZWUgcmVzb3VyY2VzICovCisJZnJlZV9idWZmZXIoYnRhKTsKKyAgICAgICAgZnJlZV9pcnEoYnRhLT5pcnEsYnRhKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCksCisJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsMCkpOworCisJLyogcmVtb3ZlIGZyb20gbGlua2VkIGxpc3QgKi8KKwlpZiAoYnRhID09IGJ0YXVkaW9zKSB7CisJCWJ0YXVkaW9zID0gTlVMTDsKKwl9IGVsc2UgeworCQlmb3IgKHdhbGsgPSBidGF1ZGlvczsgd2Fsay0+bmV4dCAhPSBidGE7IHdhbGsgPSB3YWxrLT5uZXh0KQorCQkJOyAvKiBpZiAoTlVMTCA9PSB3YWxrLT5uZXh0KSBCVUcoKTsgKi8KKwkJd2Fsay0+bmV4dCA9IGJ0YS0+bmV4dDsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CisJa2ZyZWUoYnRhKTsKKwlyZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBidGF1ZGlvX3BjaV90YmxbXSA9IHsKKyAgICAgICAgeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQlJPT0tUUkVFLAorCQkuZGV2aWNlCQk9IDB4MDg3OCwKKwkJLnN1YnZlbmRvcgk9IDB4MDA3MCwKKwkJLnN1YmRldmljZQk9IDB4ZmYwMSwKKwkJLmRyaXZlcl9kYXRhCT0gQlRBX09TUFJFWTIwMCwKKwl9LHsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0JST09LVFJFRSwKKwkJLmRldmljZQkJPSAweDA4NzgsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LHsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0JST09LVFJFRSwKKwkJLmRldmljZQkJPSAweDA4NzgsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKyAgICAgICAgfSx7CisJCS8qIC0tLSBlbmQgb2YgbGlzdCAtLS0gKi8KKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYnRhdWRpb19wY2lfZHJpdmVyID0geworICAgICAgICAubmFtZQkJPSAiYnRhdWRpbyIsCisgICAgICAgIC5pZF90YWJsZQk9IGJ0YXVkaW9fcGNpX3RibCwKKyAgICAgICAgLnByb2JlCQk9IGJ0YXVkaW9fcHJvYmUsCisgICAgICAgIC5yZW1vdmUJCT0gIF9fZGV2ZXhpdF9wKGJ0YXVkaW9fcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgYnRhdWRpb19pbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImJ0YXVkaW86IGRyaXZlciB2ZXJzaW9uIDAuNyBsb2FkZWQgWyVzJXMlc11cbiIsCisJICAgICAgIGRpZ2l0YWwgPyAiZGlnaXRhbCIgOiAiIiwKKwkgICAgICAgYW5hbG9nICYmIGRpZ2l0YWwgPyAiKyIgOiAiIiwKKwkgICAgICAgYW5hbG9nID8gImFuYWxvZyIgOiAiIik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYnRhdWRpb19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgYnRhdWRpb19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYnRhdWRpb19wY2lfZHJpdmVyKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KGJ0YXVkaW9faW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYnRhdWRpb19jbGVhbnVwX21vZHVsZSk7CisKK21vZHVsZV9wYXJhbShkc3AxLCBpbnQsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKGRzcDIsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0obWl4ZXIsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGlycV9kZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oZGlnaXRhbCwgaW50LCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbShhbmFsb2csIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0ocmF0ZSwgaW50LCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbShsYXRlbmN5LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhsYXRlbmN5LCJwY2kgbGF0ZW5jeSB0aW1lciIpOworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYnRhdWRpb19wY2lfdGJsKTsKK01PRFVMRV9ERVNDUklQVElPTigiYnQ4NzggYXVkaW8gZG1hIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NtcGNpLmMgYi9zb3VuZC9vc3MvY21wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDcyMGU2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NtcGNpLmMKQEAgLTAsMCArMSwzMzc4IEBACisvKgorICogICAgICBjbXBjaS5jICAtLSAgQy1NZWRpYSBQQ0kgYXVkaW8gZHJpdmVyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk5ICBDLW1lZGlhIHN1cHBvcnQgKHN1cHBvcnRAY21lZGlhLmNvbS50dykKKyAqCisgKiAgICAgIEJhc2VkIG9uIHRoZSBQQ0kgZHJpdmVycyBieSBUaG9tYXMgU2FpbGVyIChzYWlsZXJAaWZlLmVlLmV0aHouY2gpCisgKgorICogCUZvciB1cGRhdGUsIHZpc2l0OgorICogCQlodHRwOi8vd3d3LmNtZWRpYS5jb20udHcKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gRGF2aWQgQy4gTmllbWksIEphbiBQZmVpZmVyCisgKgorICoKKyAqIE1vZHVsZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyczoKKyAqICAgbm9uZSBzbyBmYXIKKyAqCisgKgorICogIFN1cHBvcnRlZCBkZXZpY2VzOgorICogIC9kZXYvZHNwICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21peGVyICBzdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21pZGkgICBzaW1wbGUgTUlESSBVQVJUIGludGVyZmFjZSwgbm8gaW9jdGwKKyAqCisgKiAgVGhlIGNhcmQgaGFzIGJvdGggYW4gRk0gYW5kIGEgV2F2ZXRhYmxlIHN5bnRoLCBidXQgSSBoYXZlIHRvIGZpZ3VyZQorICogIG91dCBmaXJzdCBob3cgdG8gZHJpdmUgdGhlbS4uLgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAwNi4wNS45OCAgIDAuMSAgIEluaXRpYWwgcmVsZWFzZQorICogICAgMTAuMDUuOTggICAwLjIgICBGaXhlZCBtYW55IGJ1Z3MsIGVzcC4gQURDIHJhdGUgY2FsY3VsYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgRmlyc3Qgc3RhYiBhdCBhIHNpbXBsZSBtaWRpIGludGVyZmFjZSAobm8gYmVsbHMmd2hpc3RsZXMpCisgKiAgICAxMy4wNS45OCAgIDAuMyAgIEZpeCBzdHVwaWQgY3V0JnBhc3RlIGVycm9yOiBzZXRfYWRjX3JhdGUgd2FzIGNhbGxlZCBpbnN0ZWFkIG9mCisgKiAgICAgICAgICAgICAgICAgICAgIHNldF9kYWNfcmF0ZSBpbiB0aGUgRk1PREVfV1JJVEUgY2FzZSBpbiBjbV9vcGVuCisgKiAgICAgICAgICAgICAgICAgICAgIEZpeCBod3B0ciBvdXQgb2YgYm91bmRzIChub3cgbXBnMTIzIHdvcmtzKQorICogICAgMTQuMDUuOTggICAwLjQgICBEb24ndCBhbGxvdyBleGNlc3NpdmUgaW50ZXJydXB0IHJhdGVzCisgKiAgICAwOC4wNi45OCAgIDAuNSAgIEZpcnN0IHJlbGVhc2UgdXNpbmcgQWxhbiBDb3gnIHNvdW5kY29yZSBpbnN0ZWFkIG9mIG1pc2NkZXZpY2UKKyAqICAgIDAzLjA4Ljk4ICAgMC42ICAgRG8gbm90IGluY2x1ZGUgbW9kdmVyc2lvbnMuaAorICogICAgICAgICAgICAgICAgICAgICBOb3cgbWl4ZXIgYmVoYXZpb3VyIGNhbiBiYXNpY2FsbHkgYmUgc2VsZWN0ZWQgYmV0d2VlbgorICogICAgICAgICAgICAgICAgICAgICAiT1NTIGRvY3VtZW50ZWQiIGFuZCAiT1NTIGFjdHVhbCIgYmVoYXZpb3VyCisgKiAgICAzMS4wOC45OCAgIDAuNyAgIEZpeCByZWFscGxheWVyIHByb2JsZW1zIC0gZGFjLmNvdW50IGlzc3VlcworICogICAgMTAuMTIuOTggICAwLjggICBGaXggZHJhaW5fZGFjIHRyeWluZyB0byB3YWl0IG9uIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgRE1BCisgKiAgICAxNi4xMi45OCAgIDAuOSAgIEZpeCBhIGZldyBmX2ZpbGUgJiBGTU9ERV8gYnVncworICogICAgMDYuMDEuOTkgICAwLjEwICByZW1vdmUgdGhlIHNpbGx5IFNBX0lOVEVSUlVQVCBmbGFnLgorICogICAgICAgICAgICAgICAgICAgICBob3BlZnVsbHkga2lsbGVkIHRoZSBlZ2NzIHNlY3Rpb24gdHlwZSBjb25mbGljdAorICogICAgMTIuMDMuOTkgICAwLjExICBjaW5mby5ibG9ja3Mgc2hvdWxkIGJlIHJlc2V0IGFmdGVyIEdFVHhQVFIgaW9jdGwuCisgKiAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEpvaGFuIE1hZXMgPGpvbWFAdGVsaW5kdXMuYmU+CisgKiAgICAyMi4wMy45OSAgIDAuMTIgIHJldHVybiBFQUdBSU4gaW5zdGVhZCBvZiBFQlVTWSB3aGVuIE9fTk9OQkxPQ0sKKyAqICAgICAgICAgICAgICAgICAgICAgcmVhZC93cml0ZSBjYW5ub3QgYmUgZXhlY3V0ZWQKKyAqICAgIDE4LjA4Ljk5ICAgMS41ICAgT25seSBkZWFsbG9jYXRlIERNQSBidWZmZXIgd2hlbiB1bmxvYWRpbmcuCisgKiAgICAwMi4wOS45OSAgIDEuNiAgIEVuYWJsZSBTUERJRiBMT09QCisgKiAgICAgICAgICAgICAgICAgICAgIENoYW5nZSB0aGUgbWl4ZXIgcmVhZCBiYWNrCisgKiAgICAyMS4wOS45OSAgIDIuMzMgIFVzZSBSQ1MgdmVyc2lvbiBhcyBkcml2ZXIgdmVyc2lvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIG1vZGVtLCBTL1BESUYgbG9vcCBhbmQgNCBjaGFubmVscy4KKyAqICAgICAgICAgICAgICAgICAgICAgKDg3Mzggb25seSkKKyAqICAgICAgICAgICAgICAgICAgICAgRml4IGJ1ZyBjYXVzZSB4MTFhbXAgY2Fubm90IHBsYXkuCisgKgorICogICAgRml4ZXM6CisgKiAgICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqICAgIDE4LzA1LzIwMDEgLSAuYnNzIG5pdHBpY2tzLCBmaXggYSBidWcgaW4gc2V0X2RhY19jaGFubmVscyB3aGVyZSBpdAorICogICAgCQkgICB3YXMgY2FsbGluZyBwcm9nX2RtYWJ1ZiB3aXRoIHMtPmxvY2sgaGVsZCwgY2FsbCBtaXNzaW5nCisgKiAgICAJCSAgIHVubG9ja19rZXJuZWwgaW4gY21fbWlkaV9yZWxlYXNlCisgKiAgICAwOC8xMC8yMDAxIC0gdXNlIHNldF9jdXJyZW50X3N0YXRlIGluIHNvbWUgbW9yZSBwbGFjZXMKKyAqCisgKglDYXJsb3MgRWR1YXJkbyBHb3JnZXMgPGNhcmxvc0B0ZWNobGludXguY29tLmJyPgorICoJRnJpIE1heSAyNSAyMDAxCisgKgktIFNNUCBzdXBwb3J0ICggc3Bpblt1bl1sb2NrKiByZXZpc2lvbiApCisgKgktIHNwZWFrZXIgbWl4ZXIgc3VwcG9ydAorICoJTW9uIEF1ZyAxMyAyMDAxCisgKgktIG9wdGltaXphdGlvbnMgYW5kIGNsZWFudXBzCisgKgorICogICAgMDMvMDEvMjAwMyAtIG9wZW5fbW9kZSBmaXhlcyBmcm9tIEdlb3JnIEFjaGVyIDxhY2hlckBpbi50dW0uZGU+CisgKglTaW1vbiBCcmF1bnNjaG1pZHQgPGJyYXNpbW9uQHdlYi5kZT4KKyAqICAgICBTYXQgSmFuIDMxIDIwMDQKKyAqCS0gcHJvdmlkZSBzdXBwb3J0IGZvciBvcGwzIEZNIGJ5IHJlbGVhc2luZyBJTyByYW5nZSBhZnRlciBpbml0aWFsaXphdGlvbgorICoKKyAqICAgIENoZW5MaSBUaWVuIDxjbHRpZW5AY21lZGlhLmNvbS50dz4KKyAqICAgIE1hciA5IDIwMDQKKyAqCS0gRml4IFMvUERJRiBvdXQgaWYgc3BkaWZfbG9vcCBlbmFibGVkCisgKgktIExvYWQgb3BsMyBkcml2ZXIgaWYgZW5hYmxlZCAoZm1pbyBpbiBwcm9wZXIgcmFuZ2UpCisgKgktIExvYWQgbXB1NDAxIGlmIGVuYWJsZWQgKG1wdWlvIGluIHByb3BlciByYW5nZSkKKyAqICAgIEFwciA1IDIwMDQKKyAqCS0gRml4IERVQUxfREFDIGRtYSBzeW5jaHJvbml6YXRpb24gYnVnCisgKgktIENoZWNrIGV4aXN0IEZNL01QVTQwMSBJL08gYmVmb3JlIGFjdGl2YXRlLgorICoJLSBBZGQgQUZUTV9TMTZfQkUgZm9ybWF0IHN1cHBvcnQsIHNvIE1QbGF5ZXIvWGluZSBjYW4gcGxheSBBQzMvbXV0bGljaGFubmVsCisgKgkgIG9uIE1hYworICoJLSBDaGFuZ2UgdG8gc3VwcG9ydCBrZXJuZWwgMi42IHNvIG9ubHkgc21hbGwgcGF0Y2ggbmVlZGVkCisgKgktIEFsbCBwYXJhbWV0ZXJzIGRlZmF1bHQgdG8gMAorICoJLSBBZGQgc3BkaWZfb3V0IHRvIHNlbmQgUENNIHRocm91Z2ggUy9QRElGIG91dCBqYWNrCisgKgktIEFkZCBod19jb3B5IHRvIGdldCA0LXNwYWtlciBvdXRwdXQgZm9yIGdlbmVyYWwgUENNL2FuYWxvZyBvdXRwdXQKKyAqCisgKiAgICBTdGVmYW4gVGhhdGVyIDxzdGVmYW4udGhhZXRlckBnbXguZGU+CisgKiAgICBBcHIgNSAyMDA0CisgKgktIEZpeCBtdXRlIHNpbmdsZSBjaGFubmVsIGZvciBDRC9MaW5lLWluL0FVWC1pbgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX01JREkKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJtcHU0MDEuaCIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT1VORF9DTVBDSV9GTQorI2luY2x1ZGUgIm9wbDMuaCIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT1VORF9DTVBDSV9KT1lTVElDSworI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjdW5kZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisjdW5kZWYgRE1BQllURUlPCisjZGVmaW5lCURCRyh4KSB7fQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQ01fTUFHSUMgICgoUENJX1ZFTkRPUl9JRF9DTUVESUE8PDE2KXxQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTgzMzhBKQorCisvKiBDTTgzMzggcmVnaXN0ZXJzIGRlZmluaXRpb24gKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDT0RFQ19DTUlfRlVOQ1RSTDAJCSgweDAwKQorI2RlZmluZSBDT0RFQ19DTUlfRlVOQ1RSTDEJCSgweDA0KQorI2RlZmluZSBDT0RFQ19DTUlfQ0hGT1JNQVQJCSgweDA4KQorI2RlZmluZSBDT0RFQ19DTUlfSU5UX0hMRENMUgkJKDB4MEMpCisjZGVmaW5lIENPREVDX0NNSV9JTlRfU1RBVFVTCQkoMHgxMCkKKyNkZWZpbmUgQ09ERUNfQ01JX0xFR0FDWV9DVFJMCQkoMHgxNCkKKyNkZWZpbmUgQ09ERUNfQ01JX01JU0NfQ1RSTAkJKDB4MTgpCisjZGVmaW5lIENPREVDX0NNSV9URE1BX1BPUwkJKDB4MUMpCisjZGVmaW5lIENPREVDX0NNSV9NSVhFUgkJCSgweDIwKQorI2RlZmluZSBDT0RFQ19TQjE2X0RBVEEJCQkoMHgyMikKKyNkZWZpbmUgQ09ERUNfU0IxNl9BRERSCQkJKDB4MjMpCisjZGVmaW5lIENPREVDX0NNSV9NSVhFUjEJCSgweDI0KQorI2RlZmluZSBDT0RFQ19DTUlfTUlYRVIyCQkoMHgyNSkKKyNkZWZpbmUgQ09ERUNfQ01JX0FVWF9WT0wJCSgweDI2KQorI2RlZmluZSBDT0RFQ19DTUlfTUlTQwkJCSgweDI3KQorI2RlZmluZSBDT0RFQ19DTUlfQUM5NwkJCSgweDI4KQorCisjZGVmaW5lIENPREVDX0NNSV9DSDBfRlJBTUUxCQkoMHg4MCkKKyNkZWZpbmUgQ09ERUNfQ01JX0NIMF9GUkFNRTIJCSgweDg0KQorI2RlZmluZSBDT0RFQ19DTUlfQ0gxX0ZSQU1FMQkJKDB4ODgpCisjZGVmaW5lIENPREVDX0NNSV9DSDFfRlJBTUUyCQkoMHg4QykKKworI2RlZmluZSBDT0RFQ19DTUlfU1BESUZfQ1RSTAkJKDB4OTApCisjZGVmaW5lIENPREVDX0NNSV9NSVNDX0NUUkwyCQkoMHg5MikKKworI2RlZmluZSBDT0RFQ19DTUlfRVhUX1JFRwkJKDB4RjApCisKKy8qICBNaXhlciByZWdpc3RlcnMgZm9yIFNCMTYgKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERTUF9NSVhfREFUQVJFU0VUSURYCQkoKHVuc2lnbmVkIGNoYXIpKDB4MDApKQorCisjZGVmaW5lIERTUF9NSVhfTUFTVEVSVk9MSURYX0wJCSgodW5zaWduZWQgY2hhcikoMHgzMCkpCisjZGVmaW5lIERTUF9NSVhfTUFTVEVSVk9MSURYX1IJCSgodW5zaWduZWQgY2hhcikoMHgzMSkpCisjZGVmaW5lIERTUF9NSVhfVk9JQ0VWT0xJRFhfTAkJKCh1bnNpZ25lZCBjaGFyKSgweDMyKSkKKyNkZWZpbmUgRFNQX01JWF9WT0lDRVZPTElEWF9SCQkoKHVuc2lnbmVkIGNoYXIpKDB4MzMpKQorI2RlZmluZSBEU1BfTUlYX0ZNVk9MSURYX0wJCSgodW5zaWduZWQgY2hhcikoMHgzNCkpCisjZGVmaW5lIERTUF9NSVhfRk1WT0xJRFhfUgkJKCh1bnNpZ25lZCBjaGFyKSgweDM1KSkKKyNkZWZpbmUgRFNQX01JWF9DRFZPTElEWF9MCQkoKHVuc2lnbmVkIGNoYXIpKDB4MzYpKQorI2RlZmluZSBEU1BfTUlYX0NEVk9MSURYX1IJCSgodW5zaWduZWQgY2hhcikoMHgzNykpCisjZGVmaW5lIERTUF9NSVhfTElORVZPTElEWF9MCQkoKHVuc2lnbmVkIGNoYXIpKDB4MzgpKQorI2RlZmluZSBEU1BfTUlYX0xJTkVWT0xJRFhfUgkJKCh1bnNpZ25lZCBjaGFyKSgweDM5KSkKKworI2RlZmluZSBEU1BfTUlYX01JQ1ZPTElEWAkJKCh1bnNpZ25lZCBjaGFyKSgweDNBKSkKKyNkZWZpbmUgRFNQX01JWF9TUEtSVk9MSURYCQkoKHVuc2lnbmVkIGNoYXIpKDB4M0IpKQorCisjZGVmaW5lIERTUF9NSVhfT1VUTUlYSURYCQkoKHVuc2lnbmVkIGNoYXIpKDB4M0MpKQorCisjZGVmaW5lIERTUF9NSVhfQURDTUlYSURYX0wJCSgodW5zaWduZWQgY2hhcikoMHgzRCkpCisjZGVmaW5lIERTUF9NSVhfQURDTUlYSURYX1IJCSgodW5zaWduZWQgY2hhcikoMHgzRSkpCisKKyNkZWZpbmUgRFNQX01JWF9JTkdBSU5JRFhfTAkJKCh1bnNpZ25lZCBjaGFyKSgweDNGKSkKKyNkZWZpbmUgRFNQX01JWF9JTkdBSU5JRFhfUgkJKCh1bnNpZ25lZCBjaGFyKSgweDQwKSkKKyNkZWZpbmUgRFNQX01JWF9PVVRHQUlOSURYX0wJCSgodW5zaWduZWQgY2hhcikoMHg0MSkpCisjZGVmaW5lIERTUF9NSVhfT1VUR0FJTklEWF9SCQkoKHVuc2lnbmVkIGNoYXIpKDB4NDIpKQorCisjZGVmaW5lIERTUF9NSVhfQUdDSURYCQkJKCh1bnNpZ25lZCBjaGFyKSgweDQzKSkKKworI2RlZmluZSBEU1BfTUlYX1RSRUJMRUlEWF9MCQkoKHVuc2lnbmVkIGNoYXIpKDB4NDQpKQorI2RlZmluZSBEU1BfTUlYX1RSRUJMRUlEWF9SCQkoKHVuc2lnbmVkIGNoYXIpKDB4NDUpKQorI2RlZmluZSBEU1BfTUlYX0JBU1NJRFhfTAkJKCh1bnNpZ25lZCBjaGFyKSgweDQ2KSkKKyNkZWZpbmUgRFNQX01JWF9CQVNTSURYX1IJCSgodW5zaWduZWQgY2hhcikoMHg0NykpCisjZGVmaW5lIERTUF9NSVhfRVhURU5TSU9OCQkoKHVuc2lnbmVkIGNoYXIpKDB4ZjApKQorLy8gcHNldWRvIHJlZ2lzdGVyIGZvciBBVVgKKyNkZWZpbmUJRFNQX01JWF9BVVhWT0xfTAkJKCh1bnNpZ25lZCBjaGFyKSgweDUwKSkKKyNkZWZpbmUJRFNQX01JWF9BVVhWT0xfUgkJKCh1bnNpZ25lZCBjaGFyKSgweDUxKSkKKworLy8gSS9PIGxlbmd0aAorI2RlZmluZSBDTV9FWFRFTlRfQ09ERUMJICAweDEwMAorI2RlZmluZSBDTV9FWFRFTlRfTUlESQkgIDB4MgorI2RlZmluZSBDTV9FWFRFTlRfU1lOVEgJICAweDQKKyNkZWZpbmUgQ01fRVhURU5UX0dBTUUJICAweDgKKworLy8gRnVuY3Rpb24gQ29udHJvbCBSZWdpc3RlciAwICgwMGgpCisjZGVmaW5lIENIQURDMCAgICAJMHgwMQorI2RlZmluZSBDSEFEQzEgICAgCTB4MDIKKyNkZWZpbmUgUEFVU0UwCSAgCTB4MDQKKyNkZWZpbmUgUEFVU0UxCSAgCTB4MDgKKworLy8gRnVuY3Rpb24gQ29udHJvbCBSZWdpc3RlciAwKzIgKDAyaCkKKyNkZWZpbmUgQ0hFTjAgICAgIAkweDAxCisjZGVmaW5lIENIRU4xICAgICAJMHgwMgorI2RlZmluZSBSU1RfQ0gwCSAgCTB4MDQKKyNkZWZpbmUgUlNUX0NIMQkgIAkweDA4CisKKy8vIEZ1bmN0aW9uIENvbnRyb2wgUmVnaXN0ZXIgMSAoMDRoKQorI2RlZmluZSBKWVNUS19FTgkweDAyCisjZGVmaW5lIFVBUlRfRU4JCTB4MDQKKyNkZWZpbmUJU1BETzJEQUMJMHg0MAorI2RlZmluZQlTUERGTE9PUAkweDgwCisKKy8vIEZ1bmN0aW9uIENvbnRyb2wgUmVnaXN0ZXIgMSsxICgwNWgpCisjZGVmaW5lCVNQREZfMAkJMHgwMQorI2RlZmluZQlTUERGXzEJCTB4MDIKKyNkZWZpbmUJQVNGQwkJMHgxYworI2RlZmluZQlEU0ZDCQkweGUwCisjZGVmaW5lCVNQRElGMkRBQwkoU1BERl8xIDw8IDggfCBTUERPMkRBQykKKworLy8gQ2hhbm5lbCBGb3JtYXQgUmVnaXN0ZXIgKDA4aCkKKyNkZWZpbmUgQ01fQ0ZNVF9TVEVSRU8JMHgwMQorI2RlZmluZSBDTV9DRk1UXzE2QklUCTB4MDIKKyNkZWZpbmUgQ01fQ0ZNVF9NQVNLCTB4MDMKKyNkZWZpbmUJUE9MVkFMSUQJMHgyMAorI2RlZmluZQlJTlZTUERJRkkJMHg4MAorCisvLyBDaGFubmVsIEZvcm1hdCBSZWdpc3RlcisyICgwYWgpCisjZGVmaW5lIFNQRDI0U0VMCTB4MjAKKworLy8gQ2hhbm5lbCBGb3JtYXQgUmVnaXN0ZXIrMyAoMGJoKQorI2RlZmluZSBDSEIzRAkJMHgyMAorI2RlZmluZSBDSEIzRDVDCQkweDgwCisKKy8vIEludGVycnVwdCBIb2xkL0NsZWFyIFJlZ2lzdGVyKzIgKDBlaCkKKyNkZWZpbmUJQ0gwX0lOVF9FTgkweDAxCisjZGVmaW5lCUNIMV9JTlRfRU4JMHgwMgorCisvLyBJbnRlcnJ1cHQgUmVnaXN0ZXIgKDEwaCkKKyNkZWZpbmUgQ0hJTlQwCQkweDAxCisjZGVmaW5lIENISU5UMQkJMHgwMgorI2RlZmluZQlDSDBCVVNZCQkweDA0CisjZGVmaW5lCUNIMUJVU1kJCTB4MDgKKworLy8gTGVnYWN5IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyKzEgKDE1aCkKKyNkZWZpbmUJRVhCQVNFTgkJMHgxMAorI2RlZmluZQlCQVNFMkxJTgkweDIwCisjZGVmaW5lCUNFTlRSMkxJTgkweDQwCisjZGVmaW5lCUNCMkxJTgkJKEJBU0UyTElOIHwgQ0VOVFIyTElOKQorI2RlZmluZQlDSEIzRDZDCQkweDgwCisKKy8vIExlZ2FjeSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcisyICgxNmgpCisjZGVmaW5lCURBQzJTUERPCTB4MjAKKyNkZWZpbmUJU1BEQ09QWVJIVAkweDQwCisjZGVmaW5lCUVOU1BET1VUCTB4ODAKKworLy8gTGVnYWN5IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyKzMgKDE3aCkKKyNkZWZpbmUJRk1TRUwJCTB4MDMKKyNkZWZpbmUJVlNCU0VMCQkweDBjCisjZGVmaW5lCVZNUFUJCTB4NjAKKyNkZWZpbmUJTlhDSEcJCTB4ODAKKworLy8gTWlzY2VsbGFuZW91cyBDb250cm9sIFJlZ2lzdGVyICgxOGgpCisjZGVmaW5lCVJFQVIyTElOCTB4MjAKKyNkZWZpbmUJTVVURUNIMQkJMHg0MAorI2RlZmluZQlFTkNFTlRFUgkweDgwCisKKy8vIE1pc2NlbGxhbmVvdXMgQ29udHJvbCBSZWdpc3RlcisxICgxOWgpCisjZGVmaW5lCVNFTFNQRElGSTIJMHgwMQorI2RlZmluZQlTUERGX0FDOTcJMHg4MAorCisvLyBNaXNjZWxsYW5lb3VzIENvbnRyb2wgUmVnaXN0ZXIrMiAoMWFoKQorI2RlZmluZQlBQzNfRU4JCTB4MDQKKyNkZWZpbmUJRk1fRU4JCTB4MDgKKyNkZWZpbmUJU1BEMzJTRUwJMHgyMAorI2RlZmluZQlYQ0hHREFDCQkweDQwCisjZGVmaW5lCUVOREJEQUMJCTB4ODAKKworLy8gTWlzY2VsbGFuZW91cyBDb250cm9sIFJlZ2lzdGVyKzMgKDFiaCkKKyNkZWZpbmUJU1BESUZJNDhLCTB4MDEKKyNkZWZpbmUJU1BETzVWCQkweDAyCisjZGVmaW5lCU40U1BLM0QJCTB4MDQKKyNkZWZpbmUJUkVTRVQJCTB4NDAKKyNkZWZpbmUJUFdECQkweDgwCisjZGVmaW5lCVNQRElGNDhLCShTUERJRkk0OEsgPDwgMjQgfCBTUERGX0FDOTcgPDwgOCkKKworLy8gTWl4ZXIxICgyNGgpCisjZGVmaW5lCUNEUExBWQkJMHgwMQorI2RlZmluZQlYM0RFTgkJMHgwMgorI2RlZmluZQlSRUFSMkZST05UCTB4MTAKKyNkZWZpbmUJU1BLNAkJMHgyMAorI2RlZmluZQlXU01VVEUJCTB4NDAKKyNkZWZpbmUJRk1NVVRFCQkweDgwCisKKy8vIE1pc2NlbGxhbmVvdXMgUmVnaXN0ZXIgKDI3aCkKKyNkZWZpbmUJU1BEVkFMSUQJMHgwMgorI2RlZmluZQlDRU5UUjJNSUMJMHgwNAorCisvLyBNaXNjZWxsYW5lb3VzIFJlZ2lzdGVyMiAoOTJoKQorI2RlZmluZQlTUEQzMktGTVQJMHgxMAorCisjZGVmaW5lIENNX0NGTVRfREFDU0hJRlQgICAyCisjZGVmaW5lIENNX0NGTVRfQURDU0hJRlQgICAwCisjZGVmaW5lIENNX0ZSRVFfREFDU0hJRlQgICA1CisjZGVmaW5lIENNX0ZSRVFfQURDU0hJRlQgICAyCisjZGVmaW5lCVJTVERBQwlSU1RfQ0gxCisjZGVmaW5lCVJTVEFEQwlSU1RfQ0gwCisjZGVmaW5lCUVOREFDCUNIRU4xCisjZGVmaW5lCUVOQURDCUNIRU4wCisjZGVmaW5lCVBBVVNFREFDCVBBVVNFMQorI2RlZmluZQlQQVVTRUFEQwlQQVVTRTAKKyNkZWZpbmUgQ09ERUNfQ01JX0FEQ19GUkFNRTEJQ09ERUNfQ01JX0NIMF9GUkFNRTEKKyNkZWZpbmUgQ09ERUNfQ01JX0FEQ19GUkFNRTIJQ09ERUNfQ01JX0NIMF9GUkFNRTIKKyNkZWZpbmUgQ09ERUNfQ01JX0RBQ19GUkFNRTEJQ09ERUNfQ01JX0NIMV9GUkFNRTEKKyNkZWZpbmUgQ09ERUNfQ01JX0RBQ19GUkFNRTIJQ09ERUNfQ01JX0NIMV9GUkFNRTIKKyNkZWZpbmUJREFDSU5UCUNISU5UMQorI2RlZmluZQlBRENJTlQJQ0hJTlQwCisjZGVmaW5lCURBQ0JVU1kJQ0gxQlVTWQorI2RlZmluZQlBRENCVVNZCUNIMEJVU1kKKyNkZWZpbmUJRU5EQUNJTlQJQ0gxX0lOVF9FTgorI2RlZmluZQlFTkFEQ0lOVAlDSDBfSU5UX0VOCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10JPSB7IDAsIDEsIDEsIDIgfTsKKworI2RlZmluZSBTTkRfREVWX0RTUDE2ICAgNQorCisjZGVmaW5lIE5SX0RFVklDRSAzCQkvKiBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzICovCisKKyNkZWZpbmUJc2V0X2RhYzFfcmF0ZQlzZXRfYWRjX3JhdGUKKyNkZWZpbmUJc2V0X2RhYzFfcmF0ZV91bmxvY2tlZAlzZXRfYWRjX3JhdGVfdW5sb2NrZWQKKyNkZWZpbmUJc3RvcF9kYWMxCXN0b3BfYWRjCisjZGVmaW5lCXN0b3BfZGFjMV91bmxvY2tlZAlzdG9wX2FkY191bmxvY2tlZAorI2RlZmluZQlnZXRfZG1hZGFjMQlnZXRfZG1hYWRjCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGV2aW5kZXggPSAwOworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGNtX3N0YXRlIHsKKwkvKiBtYWdpYyAqLworCXVuc2lnbmVkIGludCBtYWdpYzsKKworCS8qIGxpc3Qgb2YgY21lZGlhIGRldmljZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldnM7CisKKwkvKiB0aGUgY29ycmVzcG9uZGluZyBwY2lfZGV2IHN0cnVjdHVyZSAqLworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlpbnQgZGV2X2F1ZGlvOwkJCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfbWl4ZXI7CisKKwl1bnNpZ25lZCBpbnQgaW9zYiwgaW9iYXNlLCBpb3N5bnRoLAorCQkJIGlvbWlkaSwgaW9nYW1lLCBpcnE7CS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXVuc2lnbmVkIHNob3J0IGRldmljZWlkOwkJLyogcGNpX2lkICovCisKKyAgICAgICAgc3RydWN0IHsJCQkJLyogbWl4ZXIgc3R1ZmYgKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kY250OworCQl1bnNpZ25lZCBzaG9ydCB2b2xbMTNdOworICAgICAgICB9IG1peDsKKworCXVuc2lnbmVkIGludCByYXRlYWRjLCByYXRlZGFjOwkJLyogd2F2ZSBzdHVmZiAqLworCXVuc2lnbmVkIGNoYXIgZm10LCBlbmFibGU7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwltb2RlX3Qgb3Blbl9tb2RlOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCXN0cnVjdCBkbWFidWYgeworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hYWRkcjsKKwkJdW5zaWduZWQgYnVmb3JkZXI7CisJCXVuc2lnbmVkIG51bWZyYWc7CisJCXVuc2lnbmVkIGZyYWdzaGlmdDsKKwkJdW5zaWduZWQgaHdwdHIsIHN3cHRyOworCQl1bnNpZ25lZCB0b3RhbF9ieXRlczsKKwkJaW50IGNvdW50OworCQl1bnNpZ25lZCBlcnJvcjsJCS8qIG92ZXIvdW5kZXJydW4gKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKworCQl1bnNpZ25lZCBmcmFnc2l6ZTsJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQl1bnNpZ25lZCBkbWFzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKwkJdW5zaWduZWQgZG1hc2FtcGxlczsKKworCQl1bnNpZ25lZCBtYXBwZWQ6MTsJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIHJlYWR5OjE7CisJCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKKwkJdW5zaWduZWQgZW5hYmxlZDoxOworCQl1bnNpZ25lZCBvc3NmcmFnc2hpZnQ7CisJCWludCBvc3NtYXhmcmFnczsKKwkJdW5zaWduZWQgc3ViZGl2aXNpb247CisJfSBkbWFfZGFjLCBkbWFfYWRjOworCisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX01JREkKKwlpbnQgbWlkaV9kZXZjOworCXN0cnVjdCBhZGRyZXNzX2luZm8gbXB1X2RhdGE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU09VTkRfQ01QQ0lfSk9ZU1RJQ0sKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworI2VuZGlmCisKKwlpbnQJY2hpcF92ZXJzaW9uOworCWludAltYXhfY2hhbm5lbHM7CisJaW50CWN1cnJfY2hhbm5lbHM7CisJaW50CWNhcGFiaWxpdHk7CQkvKiBIVyBjYXBhYmlsaXR5LCB2YXJpb3VzIGZvciBjaGlwIHZlcnNpb25zICovCisKKwlpbnQJc3RhdHVzOwkJCS8qIEhXIG9yIFNXIHN0YXRlICovCisKKwlpbnQJc3BkaWZfY291bnRlcjsJCS8qIHNwZGlmIGZyYW1lIGNvdW50ZXIgKi8KK307CisKKy8qIGZsYWdzIHVzZWQgZm9yIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUJQ0FOX0FDM19IVwkJMHgwMDAwMDAwMQkJLyogMDM3IG9yIGxhdGVyICovCisjZGVmaW5lCUNBTl9BQzNfU1cJCTB4MDAwMDAwMDIJCS8qIDAzMyBvciBsYXRlciAqLworI2RlZmluZQlDQU5fQUMzCQkJKENBTl9BQzNfSFcgfCBDQU5fQUMzX1NXKQorI2RlZmluZSBDQU5fRFVBTF9EQUMJCTB4MDAwMDAwMDQJCS8qIDAzMyBvciBsYXRlciAqLworI2RlZmluZQlDQU5fTVVMVElfQ0hfSFcJCTB4MDAwMDAwMDgJCS8qIDAzOSBvciBsYXRlciAqLworI2RlZmluZQlDQU5fTVVMVElfQ0gJCShDQU5fTVVMVElfQ0hfSFcgfCBDQU5fRFVBTF9EQUMpCisjZGVmaW5lCUNBTl9MSU5FX0FTX1JFQVIJMHgwMDAwMDAxMAkJLyogMDMzIG9yIGxhdGVyICovCisjZGVmaW5lCUNBTl9MSU5FX0FTX0JBU1MJMHgwMDAwMDAyMAkJLyogMDM5IG9yIGxhdGVyICovCisjZGVmaW5lCUNBTl9NSUNfQVNfQkFTUwkJMHgwMDAwMDA0MAkJLyogMDM5IG9yIGxhdGVyICovCisKKy8qIGZsYWdzIHVzZWQgZm9yIHN0YXR1cyAqLworI2RlZmluZQlET19BQzNfSFcJCTB4MDAwMDAwMDEKKyNkZWZpbmUJRE9fQUMzX1NXCQkweDAwMDAwMDAyCisjZGVmaW5lCURPX0FDMwkJCShET19BQzNfSFcgfCBET19BQzNfU1cpCisjZGVmaW5lCURPX0RVQUxfREFDCQkweDAwMDAwMDA0CisjZGVmaW5lCURPX01VTFRJX0NIX0hXCQkweDAwMDAwMDA4CisjZGVmaW5lCURPX01VTFRJX0NICQkoRE9fTVVMVElfQ0hfSFcgfCBET19EVUFMX0RBQykKKyNkZWZpbmUJRE9fTElORV9BU19SRUFSCQkweDAwMDAwMDEwCQkvKiAwMzMgb3IgbGF0ZXIgKi8KKyNkZWZpbmUJRE9fTElORV9BU19CQVNTCQkweDAwMDAwMDIwCQkvKiAwMzkgb3IgbGF0ZXIgKi8KKyNkZWZpbmUJRE9fTUlDX0FTX0JBU1MJCTB4MDAwMDAwNDAJCS8qIDAzOSBvciBsYXRlciAqLworI2RlZmluZQlET19TUERJRl9PVVQJCTB4MDAwMDAxMDAKKyNkZWZpbmUJRE9fU1BESUZfSU4JCTB4MDAwMDAyMDAKKyNkZWZpbmUJRE9fU1BESUZfTE9PUAkJMHgwMDAwMDQwMAorI2RlZmluZQlET19CSUdFTkRJQU5fVwkJMHgwMDAwMTAwMAkJLyogdXNlZCBpbiBQb3dlclBDICovCisjZGVmaW5lCURPX0JJR0VORElBTl9SCQkweDAwMDAyMDAwCQkvKiB1c2VkIGluIFBvd2VyUEMgKi8KKworc3RhdGljIExJU1RfSEVBRChkZXZzKTsKKworc3RhdGljCWludAltcHVpbzsKK3N0YXRpYwlpbnQJZm1pbzsKK3N0YXRpYwlpbnQJam95c3RpY2s7CitzdGF0aWMJaW50CXNwZGlmX2ludmVyc2U7CitzdGF0aWMJaW50CXNwZGlmX2xvb3A7CitzdGF0aWMJaW50CXNwZGlmX291dDsKK3N0YXRpYwlpbnQJdXNlX2xpbmVfYXNfcmVhcjsKK3N0YXRpYwlpbnQJdXNlX2xpbmVfYXNfYmFzczsKK3N0YXRpYwlpbnQJdXNlX21pY19hc19iYXNzOworc3RhdGljCWludAltaWNfYm9vc3Q7CitzdGF0aWMJaW50CWh3X2NvcHk7Cittb2R1bGVfcGFyYW0obXB1aW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZm1pbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShqb3lzdGljaywgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oc3BkaWZfaW52ZXJzZSwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oc3BkaWZfbG9vcCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oc3BkaWZfb3V0LCBib29sLCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfbGluZV9hc19yZWFyLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfbGluZV9hc19iYXNzLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfbWljX2FzX2Jhc3MsIGJvb2wsIDApOworbW9kdWxlX3BhcmFtKG1pY19ib29zdCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oaHdfY29weSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1wdWlvLCAiKDB4MzMwLCAweDMyMCwgMHgzMTAsIDB4MzAwKSBCYXNlIG9mIE1QVS00MDEsIDAgdG8gZGlzYWJsZSIpOworTU9EVUxFX1BBUk1fREVTQyhmbWlvLCAiKDB4Mzg4LCAweDNDOCwgMHgzRTApIEJhc2Ugb2YgT1BMMywgMCB0byBkaXNhYmxlIik7CitNT0RVTEVfUEFSTV9ERVNDKGpveXN0aWNrLCAiKDEvMCkgRW5hYmxlIGpveXN0aWNrIGludGVyZmFjZSwgc3RpbGwgbmVlZCBqb3lzdGljayBkcml2ZXIiKTsKK01PRFVMRV9QQVJNX0RFU0Moc3BkaWZfaW52ZXJzZSwgIigxLzApIEludmVydCBTL1BESUYtaW4gc2lnbmFsIik7CitNT0RVTEVfUEFSTV9ERVNDKHNwZGlmX2xvb3AsICIoMS8wKSBSb3V0ZSBTL1BESUYtaW4gdG8gUy9QRElGLW91dCBkaXJlY3RseSIpOworTU9EVUxFX1BBUk1fREVTQyhzcGRpZl9vdXQsICIoMS8wKSBTZW5kIFBDTSB0byBTL1BESUYtb3V0IChQQ00gdm9sdW1lIHdpbGwgbm90IGZ1bmN0aW9uKSIpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfbGluZV9hc19yZWFyLCAiKDEvMCkgVXNlIGxpbmUtaW4gamFjayBhcyByZWFyLW91dCIpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfbGluZV9hc19iYXNzLCAiKDEvMCkgVXNlIGxpbmUtaW4gamFjayBhcyBiYXNzL2NlbnRlciIpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfbWljX2FzX2Jhc3MsICIoMS8wKSBVc2UgbWljLWluIGphY2sgYXMgYmFzcy9jZW50ZXIiKTsKK01PRFVMRV9QQVJNX0RFU0MobWljX2Jvb3N0LCAiKDEvMCkgRW5hYmxlIG1pY3JvcGhvbmUgYm9vc3QiKTsKK01PRFVMRV9QQVJNX0RFU0MoaHdfY29weSwgIkNvcHkgZnJvbnQgY2hhbm5lbCB0byBzdXJyb3VuZCBjaGFubmVsIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxkMih1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCBleHA9MTYsbD01LHI9MDsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgbnVtW109ezB4MiwweDQsMHgxMCwweDEwMCwweDEwMDAwfTsKKworCS8qIG51bTogMiwgNCwgMTYsIDI1NiwgNjU1MzYgKi8KKwkvKiBleHA6IDEsIDIsICA0LCAgIDgsICAgIDE2ICovCisKKwl3aGlsZShsLS0pIHsKKwkJaWYoIHggPj0gbnVtW2xdICkgeworCQkJaWYobnVtW2xdPjIpIHggPj49IGV4cDsKKwkJCXIrPWV4cDsKKwkJfQorCQlleHA+Pj0xOworCX0KKworCXJldHVybiByOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbWFza2IodW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJb3V0YigoaW5iKGFkZHIpICYgbWFzaykgfCB2YWx1ZSwgYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2t3KHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCW91dHcoKGludyhhZGRyKSAmIG1hc2spIHwgdmFsdWUsIGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBtYXNrbCh1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlvdXRsKChpbmwoYWRkcikgJiBtYXNrKSB8IHZhbHVlLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2RtYWRhYzEoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQoreworCWlmIChhZGRyKQorCSAgICBvdXRsKGFkZHIsIHMtPmlvYmFzZSArIENPREVDX0NNSV9BRENfRlJBTUUxKTsKKwlvdXR3KGNvdW50IC0gMSwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0FEQ19GUkFNRTIpOworCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMCwgfkNIQURDMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kbWFhZGMoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQoreworCW91dGwoYWRkciwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0FEQ19GUkFNRTEpOworCW91dHcoY291bnQgLSAxLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQURDX0ZSQU1FMik7CisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwLCB+MCwgQ0hBREMwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2RtYWRhYyhzdHJ1Y3QgY21fc3RhdGUgKnMsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJb3V0bChhZGRyLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfREFDX0ZSQU1FMSk7CisJb3V0dyhjb3VudCAtIDEsIHMtPmlvYmFzZSArIENPREVDX0NNSV9EQUNfRlJBTUUyKTsKKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAsIH5DSEFEQzEsIDApOworCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJc2V0X2RtYWRhYzEocywgMCwgY291bnQpOworfQorCitzdGF0aWMgdm9pZCBzZXRfY291bnRhZGMoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlvdXR3KGNvdW50IC0gMSwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0FEQ19GUkFNRTIgKyAyKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2NvdW50ZGFjKHN0cnVjdCBjbV9zdGF0ZSAqcywgdW5zaWduZWQgY291bnQpCit7CisJb3V0dyhjb3VudCAtIDEsIHMtPmlvYmFzZSArIENPREVDX0NNSV9EQUNfRlJBTUUyICsgMik7CisJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCSAgICBzZXRfY291bnRhZGMocywgY291bnQpOworfQorCitzdGF0aWMgdW5zaWduZWQgZ2V0X2RtYWRhYyhzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJdW5zaWduZWQgaW50IGN1cnJfYWRkcjsKKworCWN1cnJfYWRkciA9IGludyhzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfREFDX0ZSQU1FMikgKyAxOworCWN1cnJfYWRkciA8PD0gc2FtcGxlX3NoaWZ0WyhzLT5mbXQgPj4gQ01fQ0ZNVF9EQUNTSElGVCkgJiBDTV9DRk1UX01BU0tdOworCWN1cnJfYWRkciA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIGN1cnJfYWRkcjsKKworCXJldHVybiBjdXJyX2FkZHI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBnZXRfZG1hYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgY3Vycl9hZGRyOworCisJY3Vycl9hZGRyID0gaW53KHMtPmlvYmFzZSArIENPREVDX0NNSV9BRENfRlJBTUUyKSArIDE7CisJY3Vycl9hZGRyIDw8PSBzYW1wbGVfc2hpZnRbKHMtPmZtdCA+PiBDTV9DRk1UX0FEQ1NISUZUKSAmIENNX0NGTVRfTUFTS107CisJY3Vycl9hZGRyID0gcy0+ZG1hX2FkYy5kbWFzaXplIC0gY3Vycl9hZGRyOworCisJcmV0dXJuIGN1cnJfYWRkcjsKK30KKworc3RhdGljIHZvaWQgd3JtaXhlcihzdHJ1Y3QgY21fc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgaWR4LCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgY2hhciByZWd2YWwsIHBzZXVkbzsKKworCS8vIHBzZXVkbyByZWdpc3RlcgorCWlmIChpZHggPT0gRFNQX01JWF9BVVhWT0xfTCkgeworCQlkYXRhID4+PSA0OworCQlkYXRhICY9IDB4MGY7CisJCXJlZ3ZhbCA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQVVYX1ZPTCkgJiB+MHgwZjsKKwkJb3V0YihyZWd2YWwgfCBkYXRhLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQVVYX1ZPTCk7CisJCXJldHVybjsKKwl9CisJaWYgKGlkeCA9PSBEU1BfTUlYX0FVWFZPTF9SKSB7CisJCWRhdGEgJj0gMHhmMDsKKwkJcmVndmFsID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9BVVhfVk9MKSAmIH4weGYwOworCQlvdXRiKHJlZ3ZhbCB8IGRhdGEsIHMtPmlvYmFzZSArIENPREVDX0NNSV9BVVhfVk9MKTsKKwkJcmV0dXJuOworCX0KKwlvdXRiKGlkeCwgcy0+aW9iYXNlICsgQ09ERUNfU0IxNl9BRERSKTsKKwl1ZGVsYXkoMTApOworCS8vIHBzZXVkbyBiaXRzCisJaWYgKGlkeCA9PSBEU1BfTUlYX09VVE1JWElEWCkgeworCQlwc2V1ZG8gPSBkYXRhICYgfjB4MWY7CisJCXBzZXVkbyA+Pj0gMTsKKwkJcmVndmFsID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjIpICYgfjB4MzA7CisJCW91dGIocmVndmFsIHwgcHNldWRvLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyKTsKKwl9CisJaWYgKGlkeCA9PSBEU1BfTUlYX0FEQ01JWElEWF9MKSB7CisJCXBzZXVkbyA9IGRhdGEgJiAweDgwOworCQlwc2V1ZG8gPj49IDE7CisJCXJlZ3ZhbCA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyKSAmIH4weDQwOworCQlvdXRiKHJlZ3ZhbCB8IHBzZXVkbywgcy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMik7CisJfQorCWlmIChpZHggPT0gRFNQX01JWF9BRENNSVhJRFhfUikgeworCQlwc2V1ZG8gPSBkYXRhICYgMHg4MDsKKwkJcmVndmFsID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjIpICYgfjB4ODA7CisJCW91dGIocmVndmFsIHwgcHNldWRvLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyKTsKKwl9CisJb3V0YihkYXRhLCBzLT5pb2Jhc2UgKyBDT0RFQ19TQjE2X0RBVEEpOworCXVkZWxheSgxMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJkbWl4ZXIoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyIGlkeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHYsIHBzZXVkbzsKKworCS8vIHBzZXVkbyByZWdpc3RlcgorCWlmIChpZHggPT0gRFNQX01JWF9BVVhWT0xfTCkgeworCQl2ID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9BVVhfVk9MKSAmIDB4MGY7CisJCXYgPDw9IDQ7CisJCXJldHVybiB2OworCX0KKwlpZiAoaWR4ID09IERTUF9NSVhfQVVYVk9MX0wpIHsKKwkJdiA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQVVYX1ZPTCkgJiAweGYwOworCQlyZXR1cm4gdjsKKwl9CisJb3V0YihpZHgsIHMtPmlvYmFzZSArIENPREVDX1NCMTZfQUREUik7CisJdWRlbGF5KDEwKTsKKwl2ID0gaW5iKHMtPmlvYmFzZSArIENPREVDX1NCMTZfREFUQSk7CisJdWRlbGF5KDEwKTsKKwkvLyBwc2V1ZG8gYml0cworCWlmIChpZHggPT0gRFNQX01JWF9PVVRNSVhJRFgpIHsKKwkJcHNldWRvID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjIpICYgMHgzMDsKKwkJcHNldWRvIDw8PSAxOworCQl2IHw9IHBzZXVkbzsKKwl9CisJaWYgKGlkeCA9PSBEU1BfTUlYX0FEQ01JWElEWF9MKSB7CisJCXBzZXVkbyA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyKSAmIDB4NDA7CisJCXBzZXVkbyA8PD0gMTsKKwkJdiB8PSBwc2V1ZG87CisJfQorCWlmIChpZHggPT0gRFNQX01JWF9BRENNSVhJRFhfUikgeworCQlwc2V1ZG8gPSBpbmIocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMikgJiAweDgwOworCQl2IHw9IHBzZXVkbzsKKwl9CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mbXRfdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyIG1hc2ssIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlpZiAobWFzayAmJiBzLT5jaGlwX3ZlcnNpb24gPiAwKSB7CS8qIDgzMzggY2Fubm90IGtlZXAgdGhpcyAqLworCQlzLT5mbXQgPSBpbmIocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUKTsKKwkJdWRlbGF5KDEwKTsKKwl9CisJcy0+Zm10ID0gKHMtPmZtdCAmIG1hc2spIHwgZGF0YTsKKwlvdXRiKHMtPmZtdCwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdm9pZCBzZXRfZm10KHN0cnVjdCBjbV9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciBtYXNrLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc2V0X2ZtdF91bmxvY2tlZChzLG1hc2ssZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBmcm9iaW5kaXIoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyIGlkeCwgdW5zaWduZWQgY2hhciBtYXNrLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJb3V0YihpZHgsIHMtPmlvYmFzZSArIENPREVDX1NCMTZfQUREUik7CisJdWRlbGF5KDEwKTsKKwlvdXRiKChpbmIocy0+aW9iYXNlICsgQ09ERUNfU0IxNl9EQVRBKSAmIG1hc2spIHwgZGF0YSwgcy0+aW9iYXNlICsgQ09ERUNfU0IxNl9EQVRBKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZAlyYXRlOworCXVuc2lnbmVkCWxvd2VyOworCXVuc2lnbmVkCXVwcGVyOworCXVuc2lnbmVkIGNoYXIJZnJlcTsKK30gcmF0ZV9sb29rdXBbXSA9Cit7CisJeyA1NTEyLAkJKDAgKyA1NTEyKSAvIDIsCQkoNTUxMiArIDgwMDApIC8gMiwJMCB9LAorCXsgODAwMCwJCSg1NTEyICsgODAwMCkgLyAyLAkoODAwMCArIDExMDI1KSAvIDIsCTQgfSwKKwl7IDExMDI1LAkoODAwMCArIDExMDI1KSAvIDIsCSgxMTAyNSArIDE2MDAwKSAvIDIsCTEgfSwKKwl7IDE2MDAwLAkoMTEwMjUgKyAxNjAwMCkgLyAyLAkoMTYwMDAgKyAyMjA1MCkgLyAyLAk1IH0sCisJeyAyMjA1MCwJKDE2MDAwICsgMjIwNTApIC8gMiwJKDIyMDUwICsgMzIwMDApIC8gMiwJMiB9LAorCXsgMzIwMDAsCSgyMjA1MCArIDMyMDAwKSAvIDIsCSgzMjAwMCArIDQ0MTAwKSAvIDIsCTYgfSwKKwl7IDQ0MTAwLAkoMzIwMDAgKyA0NDEwMCkgLyAyLAkoNDQxMDAgKyA0ODAwMCkgLyAyLAkzIH0sCisJeyA0ODAwMCwJKDQ0MTAwICsgNDgwMDApIC8gMiwJNDgwMDAsCQkJNyB9Cit9OworCitzdGF0aWMgdm9pZCBzZXRfc3BkaWZfY29weXJpZ2h0KHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IHNwZGlmX2NvcHlyaWdodCkKK3sKKwkvKiBlbmFibGUgU1BESUYtaW4gQ29weXJpZ2h0ICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0xFR0FDWV9DVFJMICsgMiwgflNQRENPUFlSSFQsIHNwZGlmX2NvcHlyaWdodCA/IFNQRENPUFlSSFQgOiAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3NwZGlmX2xvb3Aoc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgc3BkaWZfbG9vcCkKK3sKKwkvKiBlbmFibGUgU1BESUYgbG9vcCAqLworCWlmIChzcGRpZl9sb29wKSB7CisJCXMtPnN0YXR1cyB8PSBET19TUERJRl9MT09QOworCQkvKiB0dXJuIG9uIHNwZGlmLWluIHRvIHNwZGlmLW91dCAqLworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEsIH4wLCBTUERGTE9PUCk7CisJfSBlbHNlIHsKKwkJcy0+c3RhdHVzICY9IH5ET19TUERJRl9MT09QOworCQkvKiB0dXJuIG9mZiBzcGRpZi1pbiB0byBzcGRpZi1vdXQgKi8KKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+U1BERkxPT1AsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X3NwZGlmX21vbml0b3Ioc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgY2hhbm5lbCkKK3sKKwkvLyBTUERPMkRBQworCW1hc2t3KHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMSwgflNQRE8yREFDLCBjaGFubmVsID09IDIgPyBTUERPMkRBQyA6IDApOworCS8vIENEUExBWQorCWlmIChzLT5jaGlwX3ZlcnNpb24gPj0gMzkpCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjEsIH5DRFBMQVksIGNoYW5uZWwgPyBDRFBMQVkgOiAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3NwZGlmb3V0X2xldmVsKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IGxldmVsNXYpCit7CisJLyogU1BETzVWICovCisJaWYgKHMtPmNoaXBfdmVyc2lvbiA+IDApCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwgKyAzLCB+U1BETzVWLCBsZXZlbDV2ID8gU1BETzVWIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zcGRpZmluX2ludmVyc2Uoc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgc3BkaWZfaW52ZXJzZSkKK3sKKwlpZiAocy0+Y2hpcF92ZXJzaW9uID09IDApCS8qIDgzMzggaGFzIG5vdCB0aGlzIGZlYXR1cmUgKi8KKwkJcmV0dXJuOworCWlmIChzcGRpZl9pbnZlcnNlKSB7CisJCS8qIHR1cm4gb24gc3BkaWYtaW4gaW52ZXJzZSAqLworCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM5KQorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFULCB+MCwgSU5WU1BESUZJKTsKKwkJZWxzZQorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMiwgfjAsIDEpOworCX0gZWxzZSB7CisJCS8qIHR1cm4gb2ZmIHNwZGlmLWluaW52ZXJzZSAqLworCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM5KQorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFULCB+SU5WU1BESUZJLCAwKTsKKwkJZWxzZQorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMiwgfjEsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X3NwZGlmaW5fY2hhbm5lbDIoc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgY2hhbm5lbDIpCit7CisJLyogU0VMU1BESUZJMiAqLworCWlmIChzLT5jaGlwX3ZlcnNpb24gPj0gMzkpCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwgKyAxLCB+U0VMU1BESUZJMiwgY2hhbm5lbDIgPyBTRUxTUERJRkkyIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zcGRpZmluX3ZhbGlkKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IHZhbGlkKQoreworCS8qIFNQRFZBTElEICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0MsIH5TUERWQUxJRCwgdmFsaWQgPyBTUERWQUxJRCA6IDApOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3BkaWZvdXRfdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCWlmIChyYXRlICE9IDQ4MDAwICYmIHJhdGUgIT0gNDQxMDApCisJCXJhdGUgPSAwOworCWlmIChyYXRlID09IDQ4MDAwIHx8IHJhdGUgPT0gNDQxMDApIHsKKwkJc2V0X3NwZGlmX2xvb3AocywgMCk7CisJCS8vIFNQREZfMQorCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEgKyAxLCB+MCwgU1BERl8xKTsKKwkJLy8gU1BESUZJNDhLIFNQREZfQUM5NworCQltYXNrbChzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlTQ19DVFJMLCB+U1BESUY0OEssIHJhdGUgPT0gNDgwMDAgPyBTUERJRjQ4SyA6IDApOworCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDU1KQorCQkvLyBTUEQzMktGTVQKKwkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwyLCB+U1BEMzJLRk1ULCByYXRlID09IDQ4MDAwID8gU1BEMzJLRk1UIDogMCk7CisJCWlmIChzLT5jaGlwX3ZlcnNpb24gPiAwKQorCQkvLyBFTlNQRE9VVAorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0xFR0FDWV9DVFJMICsgMiwgfjAsIEVOU1BET1VUKTsKKwkJLy8gbW9uaXRvciBTUERJRiBvdXQKKwkJc2V0X3NwZGlmX21vbml0b3IocywgMik7CisJCXMtPnN0YXR1cyB8PSBET19TUERJRl9PVVQ7CisJfSBlbHNlIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxICsgMSwgflNQREZfMSwgMCk7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9MRUdBQ1lfQ1RSTCArIDIsIH5FTlNQRE9VVCwgMCk7CisJCS8vIG1vbml0b3Igbm9uZQorCQlzZXRfc3BkaWZfbW9uaXRvcihzLCAwKTsKKwkJcy0+c3RhdHVzICY9IH5ET19TUERJRl9PVVQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfc3BkaWZvdXQoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXNldF9zcGRpZm91dF91bmxvY2tlZChzLHJhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3NwZGlmaW5fdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCWlmIChyYXRlID09IDQ4MDAwIHx8IHJhdGUgPT0gNDQxMDApIHsKKwkJLy8gU1BERl8xCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMSArIDEsIH4wLCBTUERGXzEpOworCQkvLyBTUERJRkk0OEsgU1BERl9BQzk3CisJCW1hc2tsKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwsIH5TUERJRjQ4SywgcmF0ZSA9PSA0ODAwMCA/IFNQRElGNDhLIDogMCk7CisJCXMtPnN0YXR1cyB8PSBET19TUERJRl9JTjsKKwl9IGVsc2UgeworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEgKyAxLCB+U1BERl8xLCAwKTsKKwkJcy0+c3RhdHVzICY9IH5ET19TUERJRl9JTjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zcGRpZmluKHN0cnVjdCBjbV9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzZXRfc3BkaWZpbl91bmxvY2tlZChzLHJhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworLyogZmluZCBwYXJpdHkgZm9yIGJpdCA0fjMwICovCitzdGF0aWMgdW5zaWduZWQgcGFyaXR5KHVuc2lnbmVkIGRhdGEpCit7CisJdW5zaWduZWQgcGFyaXR5ID0gMDsKKwlpbnQgY291bnRlciA9IDQ7CisKKwlkYXRhID4+PSA0OwkvLyBzdGFydCBmcm9tIGJpdCA0CisJd2hpbGUgKGNvdW50ZXIgPD0gMzApIHsKKwkJaWYgKGRhdGEgJiAxKQorCQkJcGFyaXR5Kys7CisJCWRhdGEgPj49IDE7CisJCWNvdW50ZXIrKzsKKwl9CisJcmV0dXJuIHBhcml0eSAmIDE7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hYzNfdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCWlmICghKHMtPmNhcGFiaWxpdHkgJiBDQU5fQUMzKSkKKwkJcmV0dXJuOworCS8qIGVuYWJsZSBBQzMgKi8KKwlpZiAocmF0ZSAmJiByYXRlICE9IDQ0MTAwKQorCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPT0gNDgwMDAgfHwgcmF0ZSA9PSA0NDEwMCkgeworCQkvLyBtdXRlIERBQworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIxLCB+MCwgV1NNVVRFKTsKKwkJaWYgKHMtPmNoaXBfdmVyc2lvbiA+PSAzOSkKKwkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwsIH4wLCBNVVRFQ0gxKTsKKwkJLy8gQUMzRU4gZm9yIDAzOSwgMHgwNAorCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM5KSB7CisJCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlTQ19DVFJMICsgMiwgfjAsIEFDM19FTik7CisJCQlpZiAocy0+Y2hpcF92ZXJzaW9uID09IDU1KQorCQkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9TUERJRl9DVFJMLCB+MiwgMCk7CisJCS8vIEFDM0VOIGZvciAwMzcsIDB4MTAKKwkJfSBlbHNlIGlmIChzLT5jaGlwX3ZlcnNpb24gPT0gMzcpCisJCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQ0hGT1JNQVQgKyAyLCB+MCwgMHgxMCk7CisJCWlmIChzLT5jYXBhYmlsaXR5ICYgQ0FOX0FDM19IVykgeworCQkJLy8gU1BEMjRTRUwgZm9yIDAzOSwgMHgyMCwgYnV0IGNhbm5vdCBiZSBzZXQKKwkJCWlmIChzLT5jaGlwX3ZlcnNpb24gPT0gMzkpCisJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMiwgfjAsIFNQRDI0U0VMKTsKKwkJCS8vIFNQRDI0U0VMIGZvciAwMzcsIDB4MDIKKwkJCWVsc2UgaWYgKHMtPmNoaXBfdmVyc2lvbiA9PSAzNykKKwkJCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQ0hGT1JNQVQgKyAyLCB+MCwgMHgwMik7CisJCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM5KQorCQkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjEsIH5DRFBMQVksIDApOworCisJCQlzLT5zdGF0dXMgfD0gRE9fQUMzX0hXOworCQkgfSBlbHNlIHsKKwkJCS8vIFNQRDMyU0VMIGZvciAwMzcgJiAwMzkKKwkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwgKyAyLCB+MCwgU1BEMzJTRUwpOworCQkJLy8gc2V0IDE3Nksgc2FtcGxlIHJhdGUgdG8gZml4IDAzMyBIVyBidWcKKwkJCWlmIChzLT5jaGlwX3ZlcnNpb24gPT0gMzMpIHsKKwkJCQlpZiAocmF0ZSA9PSA0ODAwMCkKKwkJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMSwgfjAsIDB4MDgpOworCQkJCWVsc2UKKwkJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMSwgfjB4MDgsIDApOworCQkJfQorCQkJcy0+c3RhdHVzIHw9IERPX0FDM19TVzsKKwkJfQorCX0gZWxzZSB7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjEsIH5XU01VVEUsIDApOworCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM5KQorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCwgfk1VVEVDSDEsIDApOworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQ0hGT1JNQVQgKyAyLCB+KFNQRDI0U0VMfDB4MTIpLCAwKTsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCArIDIsIH4oU1BEMzJTRUx8QUMzX0VOKSwgMCk7CisJCWlmIChzLT5jaGlwX3ZlcnNpb24gPT0gMzMpCisJCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQ0hGT1JNQVQgKyAxLCB+MHgwOCwgMCk7CisJCWlmIChzLT5jaGlwX3ZlcnNpb24gPj0gMzkpCisJCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIxLCB+MCwgQ0RQTEFZKTsKKwkJcy0+c3RhdHVzICY9IH5ET19BQzM7CisJfQorCXMtPnNwZGlmX2NvdW50ZXIgPSAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfbGluZV9hc19yZWFyKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IHVzZV9saW5lX2FzX3JlYXIpCit7CisJaWYgKCEocy0+Y2FwYWJpbGl0eSAmIENBTl9MSU5FX0FTX1JFQVIpKQorCQlyZXR1cm47CisJaWYgKHVzZV9saW5lX2FzX3JlYXIpIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMSwgfjAsIFNQSzQpOworCQlzLT5zdGF0dXMgfD0gRE9fTElORV9BU19SRUFSOworCX0gZWxzZSB7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjEsIH5TUEs0LCAwKTsKKwkJcy0+c3RhdHVzICY9IH5ET19MSU5FX0FTX1JFQVI7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfbGluZV9hc19iYXNzKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IHVzZV9saW5lX2FzX2Jhc3MpCit7CisJaWYgKCEocy0+Y2FwYWJpbGl0eSAmIENBTl9MSU5FX0FTX0JBU1MpKQorCQlyZXR1cm47CisJaWYgKHVzZV9saW5lX2FzX2Jhc3MpIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0xFR0FDWV9DVFJMICsgMSwgfjAsIENCMkxJTik7CisJCXMtPnN0YXR1cyB8PSBET19MSU5FX0FTX0JBU1M7CisJfSBlbHNlIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0xFR0FDWV9DVFJMICsgMSwgfkNCMkxJTiwgMCk7CisJCXMtPnN0YXR1cyAmPSB+RE9fTElORV9BU19CQVNTOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X21pY19hc19iYXNzKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IHVzZV9taWNfYXNfYmFzcykKK3sKKwlpZiAoIShzLT5jYXBhYmlsaXR5ICYgQ0FOX01JQ19BU19CQVNTKSkKKwkJcmV0dXJuOworCWlmICh1c2VfbWljX2FzX2Jhc3MpIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0MsIH4wLCAweDA0KTsKKwkJcy0+c3RhdHVzIHw9IERPX01JQ19BU19CQVNTOworCX0gZWxzZSB7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDLCB+MHgwNCwgMCk7CisJCXMtPnN0YXR1cyAmPSB+RE9fTUlDX0FTX0JBU1M7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfaHdfY29weShzdHJ1Y3QgY21fc3RhdGUgKnMsIGludCBod19jb3B5KQoreworICAgIAlpZiAocy0+bWF4X2NoYW5uZWxzID4gMiAmJiBod19jb3B5KQorCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlTQ19DVFJMICsgMywgfjAsIE40U1BLM0QpOworICAgIAllbHNlCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwgKyAzLCB+TjRTUEszRCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hYzMoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXNldF9zcGRpZm91dF91bmxvY2tlZChzLCByYXRlKTsKKwlzZXRfYWMzX3VubG9ja2VkKHMsIHJhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0cmFuc19hYzMoc3RydWN0IGNtX3N0YXRlICpzLCB2b2lkICpkZXN0LCBjb25zdCBjaGFyIF9fdXNlciAqc291cmNlLCBpbnQgc2l6ZSkKK3sKKwlpbnQgICBpID0gc2l6ZSAvIDI7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXVuc2lnbmVkIHNob3J0IGRhdGExNjsKKwl1bnNpZ25lZCBsb25nICpkc3QgPSAodW5zaWduZWQgbG9uZyAqKSBkZXN0OworCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqc3JjID0gKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKXNvdXJjZTsKKwlpbnQgZXJyOworCisJZG8geworCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YTE2LCBzcmMrKykpKQorCQkJcmV0dXJuIGVycjsKKwkJZGF0YSA9ICh1bnNpZ25lZCBsb25nKWxlMTZfdG9fY3B1KGRhdGExNik7CisJCWRhdGEgPDw9IDEyOwkJCS8vIG9rIGZvciAxNi1iaXQgZGF0YQorCQlpZiAocy0+c3BkaWZfY291bnRlciA9PSAyIHx8IHMtPnNwZGlmX2NvdW50ZXIgPT0gMykKKwkJCWRhdGEgfD0gMHg0MDAwMDAwMDsJLy8gaW5kaWNhdGUgQUMtMyByYXcgZGF0YQorCQlpZiAocGFyaXR5KGRhdGEpKQorCQkJZGF0YSB8PSAweDgwMDAwMDAwOwkvLyBwYXJpdHkKKwkJaWYgKHMtPnNwZGlmX2NvdW50ZXIgPT0gMCkKKwkJCWRhdGEgfD0gMzsJCS8vIHByZWFtYmxlICdNJworCQllbHNlIGlmIChzLT5zcGRpZl9jb3VudGVyICYgMSkKKwkJCWRhdGEgfD0gNTsJCS8vIG9kZCwgJ1cnCisJCWVsc2UKKwkJCWRhdGEgfD0gOTsJCS8vIGV2ZW4sICdNJworCQkqZHN0KysgPSBjcHVfdG9fbGUzMihkYXRhKTsKKwkJcy0+c3BkaWZfY291bnRlcisrOworCQlpZiAocy0+c3BkaWZfY291bnRlciA9PSAzODQpCisJCQlzLT5zcGRpZl9jb3VudGVyID0gMDsKKwl9IHdoaWxlICgtLWkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hZGNfcmF0ZV91bmxvY2tlZChzdHJ1Y3QgY21fc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJdW5zaWduZWQgY2hhciBmcmVxID0gNDsKKwlpbnQJaTsKKworCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDgwMDApCisJCXJhdGUgPSA4MDAwOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmF0ZV9sb29rdXApIC8gc2l6ZW9mKHJhdGVfbG9va3VwWzBdKTsgaSsrKSB7CisJCWlmIChyYXRlID4gcmF0ZV9sb29rdXBbaV0ubG93ZXIgJiYgcmF0ZSA8PSByYXRlX2xvb2t1cFtpXS51cHBlcikgeworCQkJcmF0ZSA9IHJhdGVfbG9va3VwW2ldLnJhdGU7CisJCQlmcmVxID0gcmF0ZV9sb29rdXBbaV0uZnJlcTsKKwkJCWJyZWFrOworCSAgICAJfQorCX0KKwlzLT5yYXRlYWRjID0gcmF0ZTsKKwlmcmVxIDw8PSBDTV9GUkVRX0FEQ1NISUZUOworCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxICsgMSwgfkFTRkMsIGZyZXEpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYWRjX3JhdGUoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBmcmVxID0gNDsKKwlpbnQJaTsKKworCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDgwMDApCisJCXJhdGUgPSA4MDAwOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmF0ZV9sb29rdXApIC8gc2l6ZW9mKHJhdGVfbG9va3VwWzBdKTsgaSsrKSB7CisJCWlmIChyYXRlID4gcmF0ZV9sb29rdXBbaV0ubG93ZXIgJiYgcmF0ZSA8PSByYXRlX2xvb2t1cFtpXS51cHBlcikgeworCQkJcmF0ZSA9IHJhdGVfbG9va3VwW2ldLnJhdGU7CisJCQlmcmVxID0gcmF0ZV9sb29rdXBbaV0uZnJlcTsKKwkJCWJyZWFrOworCSAgICAJfQorCX0KKwlzLT5yYXRlYWRjID0gcmF0ZTsKKwlmcmVxIDw8PSBDTV9GUkVRX0FEQ1NISUZUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEgKyAxLCB+QVNGQywgZnJlcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGFjX3JhdGUoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBmcmVxID0gNDsKKwlpbnQJaTsKKworCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDgwMDApCisJCXJhdGUgPSA4MDAwOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmF0ZV9sb29rdXApIC8gc2l6ZW9mKHJhdGVfbG9va3VwWzBdKTsgaSsrKSB7CisJCWlmIChyYXRlID4gcmF0ZV9sb29rdXBbaV0ubG93ZXIgJiYgcmF0ZSA8PSByYXRlX2xvb2t1cFtpXS51cHBlcikgeworCQkJcmF0ZSA9IHJhdGVfbG9va3VwW2ldLnJhdGU7CisJCQlmcmVxID0gcmF0ZV9sb29rdXBbaV0uZnJlcTsKKwkJCWJyZWFrOworCSAgICAJfQorCX0KKwlzLT5yYXRlZGFjID0gcmF0ZTsKKwlmcmVxIDw8PSBDTV9GUkVRX0RBQ1NISUZUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEgKyAxLCB+RFNGQywgZnJlcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJaWYgKHMtPmN1cnJfY2hhbm5lbHMgPD0gMiAmJiBzcGRpZl9vdXQpCisJCXNldF9zcGRpZm91dChzLCByYXRlKTsKKwlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpCisJCXNldF9kYWMxX3JhdGUocywgcmF0ZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSB2b2lkIHJlc2V0X2FkYyhzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJLyogcmVzZXQgYnVzIG1hc3RlciAqLworCW91dGIocy0+ZW5hYmxlIHwgUlNUQURDLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAgKyAyKTsKKwl1ZGVsYXkoMTApOworCW91dGIocy0+ZW5hYmxlICYgflJTVEFEQywgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwICsgMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9kYWMoc3RydWN0IGNtX3N0YXRlICpzKQoreworCS8qIHJlc2V0IGJ1cyBtYXN0ZXIgKi8KKwlvdXRiKHMtPmVuYWJsZSB8IFJTVERBQywgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwICsgMik7CisJdWRlbGF5KDEwKTsKKwlvdXRiKHMtPmVuYWJsZSAmIH5SU1REQUMsIHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMCArIDIpOworCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJcmVzZXRfYWRjKHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGF1c2VfYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAsIH4wLCBQQVVTRUFEQyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXVzZV9kYWMoc3RydWN0IGNtX3N0YXRlICpzKQoreworCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMCwgfjAsIFBBVVNFREFDKTsKKwlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpCisJCXBhdXNlX2FkYyhzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwkvKiBkaXNhYmxlIGNoYW5uZWwgKi8KKwlzLT5lbmFibGUgJj0gfkVOQURDOworCW91dGIocy0+ZW5hYmxlLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAgKyAyKTsKKwlyZXNldF9hZGMocyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2RhYyhzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJLyogZGlzYWJsZSBjaGFubmVsICovCisJcy0+ZW5hYmxlICY9IH5FTkRBQzsKKwlvdXRiKHMtPmVuYWJsZSwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwICsgMik7CisJcmVzZXRfZGFjKHMpOworCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJZGlzYWJsZV9hZGMocyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwlpZiAoIShzLT5lbmFibGUgJiBFTkFEQykpIHsKKwkJLyogZW5hYmxlIGNoYW5uZWwgKi8KKwkJcy0+ZW5hYmxlIHw9IEVOQURDOworCQlvdXRiKHMtPmVuYWJsZSwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwICsgMik7CisJfQorCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMCwgflBBVVNFQURDLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9kYWNfdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzKQoreworCWlmICghKHMtPmVuYWJsZSAmIEVOREFDKSkgeworCQkvKiBlbmFibGUgY2hhbm5lbCAqLworCQlzLT5lbmFibGUgfD0gRU5EQUM7CisJCW91dGIocy0+ZW5hYmxlLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAgKyAyKTsKKwl9CisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwLCB+UEFVU0VEQUMsIDApOworCisJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQllbmFibGVfYWRjKHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9hZGNfdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzKQoreworCWlmIChzLT5lbmFibGUgJiBFTkFEQykgeworCQkvKiBkaXNhYmxlIGludGVycnVwdCAqLworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfSU5UX0hMRENMUiArIDIsIH5FTkFEQ0lOVCwgMCk7CisJCWRpc2FibGVfYWRjKHMpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzdG9wX2FkY191bmxvY2tlZChzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfZGFjX3VubG9ja2VkKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwlpZiAocy0+ZW5hYmxlICYgRU5EQUMpIHsKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0lOVF9ITERDTFIgKyAyLCB+RU5EQUNJTlQsIDApOworCQlkaXNhYmxlX2RhYyhzKTsKKwl9CisJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQlzdG9wX2RhYzFfdW5sb2NrZWQocyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc3RvcF9kYWNfdW5sb2NrZWQocyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfYWRjX3VubG9ja2VkKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwlpZiAoKHMtPmRtYV9hZGMubWFwcGVkIHx8IHMtPmRtYV9hZGMuY291bnQgPCAoc2lnbmVkKShzLT5kbWFfYWRjLmRtYXNpemUgLSAyKnMtPmRtYV9hZGMuZnJhZ3NpemUpKQorCSAgICAmJiBzLT5kbWFfYWRjLnJlYWR5KSB7CisJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0lOVF9ITERDTFIgKyAyLCB+MCwgRU5BRENJTlQpOworCQllbmFibGVfYWRjKHMpOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzdGFydF9hZGNfdW5sb2NrZWQocyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMxX3VubG9ja2VkKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwlpZiAoKHMtPmRtYV9hZGMubWFwcGVkIHx8IHMtPmRtYV9hZGMuY291bnQgPiAwKSAmJiBzLT5kbWFfYWRjLnJlYWR5KSB7CisJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0lOVF9ITERDTFIgKyAyLCB+MCwgRU5BRENJTlQpOworIAkJZW5hYmxlX2RhY191bmxvY2tlZChzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2RhY191bmxvY2tlZChzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJaWYgKChzLT5kbWFfZGFjLm1hcHBlZCB8fCBzLT5kbWFfZGFjLmNvdW50ID4gMCkgJiYgcy0+ZG1hX2RhYy5yZWFkeSkgeworCQkvKiBlbmFibGUgaW50ZXJydXB0ICovCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9JTlRfSExEQ0xSICsgMiwgfjAsIEVOREFDSU5UKTsKKwkJZW5hYmxlX2RhY191bmxvY2tlZChzKTsKKwl9CisJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQlzdGFydF9kYWMxX3VubG9ja2VkKHMpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGNtX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXN0YXJ0X2RhY191bmxvY2tlZChzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByZWMpOworCitzdGF0aWMgaW50IHNldF9kYWNfY2hhbm5lbHMoc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgY2hhbm5lbHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGZtbXV0ZSA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJaWYgKChjaGFubmVscyA+IDIpICYmIChjaGFubmVscyA8PSBzLT5tYXhfY2hhbm5lbHMpCisJICYmICgoKHMtPmZtdCA+PiBDTV9DRk1UX0RBQ1NISUZUKSAmIENNX0NGTVRfTUFTSykgPT0gKENNX0NGTVRfU1RFUkVPIHwgQ01fQ0ZNVF8xNkJJVCkpKSB7CisJICAgIHNldF9zcGRpZm91dF91bmxvY2tlZChzLCAwKTsKKwkgICAgaWYgKHMtPmNhcGFiaWxpdHkgJiBDQU5fTVVMVElfQ0hfSFcpIHsKKwkJLy8gTlhDSEcKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0xFR0FDWV9DVFJMICsgMywgfjAsIE5YQ0hHKTsKKwkJLy8gQ0hCM0Qgb3IgQ0hCM0Q1QworCSAgICAgICAJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMywgfihDSEIzRDVDfENIQjNEKSwgY2hhbm5lbHMgPiA0ID8gQ0hCM0Q1QyA6IENIQjNEKTsKKwkJLy8gQ0hCM0Q2QworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTEVHQUNZX0NUUkwgKyAxLCB+Q0hCM0Q2QywgY2hhbm5lbHMgPT0gNiA/IENIQjNENkMgOiAwKTsKKwkJLy8gRU5DRU5URVIKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCwgfkVOQ0VOVEVSLCBjaGFubmVscyA9PSA2ID8gRU5DRU5URVIgOiAwKTsKKwkJcy0+c3RhdHVzIHw9IERPX01VTFRJX0NIX0hXOworCSAgICB9IGVsc2UgaWYgKHMtPmNhcGFiaWxpdHkgJiBDQU5fRFVBTF9EQUMpIHsKKwkJdW5zaWduZWQgY2hhciBmbXRtID0gfjAsIGZtdHMgPSAwOworCQlzc2l6ZV90IHJldDsKKworCQkvLyBFTkRCREFDLCB0dXJuIG9uIGRvdWJsZSBEQUMgbW9kZQorCQkvLyBYQ0hHREFDLCBDSDAgLT4gYmFjaywgQ0gxLT5mcm9udAorCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlTQ19DVFJMICsgMiwgfjAsIEVOREJEQUN8WENIR0RBQyk7CisJCS8vIG11dGUgRk0KKwkJZm1tdXRlID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjEpICYgRk1NVVRFOworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIxLCB+MCwgRk1NVVRFKTsKKwkJcy0+c3RhdHVzIHw9IERPX0RVQUxfREFDOworCQkvLyBwcmVwYXJlIHNlY29uZGFyeSBidWZmZXIKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBwcm9nX2RtYWJ1ZihzLCAxKTsKKwkJaWYgKHJldCkgcmV0dXJuIHJldDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCQkvLyBjb3B5IHRoZSBodyBzdGF0ZQorCQlmbXRtICY9IH4oKENNX0NGTVRfU1RFUkVPIHwgQ01fQ0ZNVF8xNkJJVCkgPDwgQ01fQ0ZNVF9EQUNTSElGVCk7CisJCWZtdG0gJj0gfigoQ01fQ0ZNVF9TVEVSRU8gfCBDTV9DRk1UXzE2QklUKSA8PCBDTV9DRk1UX0FEQ1NISUZUKTsKKwkJLy8gdGhlIEhXIG9ubHkgc3VwcG9ydCAxNi1iaXQgc3RlcmVvCisJCWZtdHMgfD0gQ01fQ0ZNVF8xNkJJVCA8PCBDTV9DRk1UX0RBQ1NISUZUOworCQlmbXRzIHw9IENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9BRENTSElGVDsKKwkJZm10cyB8PSBDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0RBQ1NISUZUOworCQlmbXRzIHw9IENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfQURDU0hJRlQ7CisKKwkJc2V0X2ZtdF91bmxvY2tlZChzLCBmbXRtLCBmbXRzKTsKKwkJc2V0X2FkY19yYXRlX3VubG9ja2VkKHMsIHMtPnJhdGVkYWMpOworCSAgICB9CisJICAgIC8vIGRpc2FibGUgNCBzcGVha2VyIG1vZGUgKGFuYWxvZyBkdXBsaWNhdGUpCisJICAgIHNldF9od19jb3B5KHMsIDApOworCSAgICBzLT5jdXJyX2NoYW5uZWxzID0gY2hhbm5lbHM7CisKKwkgICAgLy8gZW5hYmxlIGphY2sgcmVkaXJlY3QKKwkgICAgc2V0X2xpbmVfYXNfcmVhcihzLCB1c2VfbGluZV9hc19yZWFyKTsKKwkgICAgaWYgKGNoYW5uZWxzID4gNCkgeworCQkgICAgc2V0X2xpbmVfYXNfYmFzcyhzLCB1c2VfbGluZV9hc19iYXNzKTsKKwkJICAgIHNldF9taWNfYXNfYmFzcyhzLCB1c2VfbWljX2FzX2Jhc3MpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYgKHMtPnN0YXR1cyAmIERPX01VTFRJX0NIX0hXKSB7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9MRUdBQ1lfQ1RSTCArIDMsIH5OWENIRywgMCk7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9DSEZPUk1BVCArIDMsIH4oQ0hCM0Q1Q3xDSEIzRCksIDApOworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTEVHQUNZX0NUUkwgKyAxLCB+Q0hCM0Q2QywgMCk7CisJICAgIH0gZWxzZSBpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCArIDIsIH5FTkRCREFDLCAwKTsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMSwgfkZNTVVURSwgZm1tdXRlKTsKKwkgICAgfQorCSAgICAvLyBlbmFibGUgNCBzcGVha2VyIG1vZGUgKGFuYWxvZyBkdXBsaWNhdGUpCisJICAgIHNldF9od19jb3B5KHMsIGh3X2NvcHkpOworCSAgICBzLT5zdGF0dXMgJj0gfkRPX01VTFRJX0NIOworCSAgICBzLT5jdXJyX2NoYW5uZWxzID0gcy0+Zm10ICYgKENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfREFDU0hJRlQpID8gMiA6IDE7CisJICAgIC8vIGRpc2FibGUgamFjayByZWRpcmVjdAorCSAgICBzZXRfbGluZV9hc19yZWFyKHMsIGh3X2NvcHkgPyB1c2VfbGluZV9hc19yZWFyIDogMCk7CisJICAgIHNldF9saW5lX2FzX2Jhc3MocywgMCk7CisJICAgIHNldF9taWNfYXNfYmFzcyhzLCAwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBzLT5jdXJyX2NoYW5uZWxzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNi1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCitzdGF0aWMgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgY21fc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXN0cnVjdCBwYWdlICpwc3RhcnQsICpwZW5kOworCisJaWYgKGRiLT5yYXdidWYpIHsKKwkJLyogdW5kbyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAqLworCQlwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwc3RhcnQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBzdGFydCA8PSBwZW5kOyBwc3RhcnQrKykKKwkJCUNsZWFyUGFnZVJlc2VydmVkKHBzdGFydCk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocy0+ZGV2LCBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyLCBkYi0+cmF3YnVmLCBkYi0+ZG1hYWRkcik7CisJfQorCWRiLT5yYXdidWYgPSBOVUxMOworCWRiLT5tYXBwZWQgPSBkYi0+cmVhZHkgPSAwOworfQorCisvKiBDaDEgaXMgdXNlZCBmb3IgcGxheWJhY2ssIENoMCBpcyB1c2VkIGZvciByZWNvcmRpbmcgKi8KKworc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3QgY21fc3RhdGUgKnMsIHVuc2lnbmVkIHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9IHJlYyA/ICZzLT5kbWFfYWRjIDogJnMtPmRtYV9kYWM7CisJdW5zaWduZWQgcmF0ZSA9IHJlYyA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjOworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBieXRlcGVyc2VjOworCXVuc2lnbmVkIGJ1ZnM7CisJc3RydWN0IHBhZ2UgKnBzdGFydCwgKnBlbmQ7CisJdW5zaWduZWQgY2hhciBmbXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZtdCA9IHMtPmZtdDsKKwlpZiAocmVjKSB7CisJCXN0b3BfYWRjKHMpOworCQlmbXQgPj49IENNX0NGTVRfQURDU0hJRlQ7CisJfSBlbHNlIHsKKwkJc3RvcF9kYWMocyk7CisJCWZtdCA+Pj0gQ01fQ0ZNVF9EQUNTSElGVDsKKwl9CisKKwlmbXQgJj0gQ01fQ0ZNVF9NQVNLOworCWRiLT5od3B0ciA9IGRiLT5zd3B0ciA9IGRiLT50b3RhbF9ieXRlcyA9IGRiLT5jb3VudCA9IGRiLT5lcnJvciA9IGRiLT5lbmRjbGVhcmVkID0gMDsKKwlpZiAoIWRiLT5yYXdidWYpIHsKKwkJZGItPnJlYWR5ID0gZGItPm1hcHBlZCA9IDA7CisJCWZvciAob3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pCisJCQlpZiAoKGRiLT5yYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRiLT5kbWFhZGRyKSkpCisJCQkJYnJlYWs7CisJCWlmICghZGItPnJhd2J1ZiB8fCAhZGItPmRtYWFkZHIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZGItPmJ1Zm9yZGVyID0gb3JkZXI7CisJCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLworCQlwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwc3RhcnQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBzdGFydCA8PSBwZW5kOyBwc3RhcnQrKykKKwkJCVNldFBhZ2VSZXNlcnZlZChwc3RhcnQpOworCX0KKwlieXRlcGVyc2VjID0gcmF0ZSA8PCBzYW1wbGVfc2hpZnRbZm10XTsKKwlidWZzID0gUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcjsKKwlpZiAoZGItPm9zc2ZyYWdzaGlmdCkgeworCQlpZiAoKDEwMDAgPDwgZGItPm9zc2ZyYWdzaGlmdCkgPCBieXRlcGVyc2VjKQorCQkJZGItPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjLzEwMDApOworCQllbHNlCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gZGItPm9zc2ZyYWdzaGlmdDsKKwl9IGVsc2UgeworCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwLyhkYi0+c3ViZGl2aXNpb24gPyBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CisJCWlmIChkYi0+ZnJhZ3NoaWZ0IDwgMykKKwkJCWRiLT5mcmFnc2hpZnQgPSAzOworCX0KKwlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl3aGlsZSAoZGItPm51bWZyYWcgPCA0ICYmIGRiLT5mcmFnc2hpZnQgPiAzKSB7CisJCWRiLT5mcmFnc2hpZnQtLTsKKwkJZGItPm51bWZyYWcgPSBidWZzID4+IGRiLT5mcmFnc2hpZnQ7CisJfQorCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKwlpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisJCWRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworIAkvKiB0byBtYWtlIGZyYWdzaXplID49IDQwOTYgKi8KKwlkYi0+ZnJhZ3NhbXBsZXMgPSBkYi0+ZnJhZ3NpemUgPj4gc2FtcGxlX3NoaWZ0W2ZtdF07CisJZGItPmRtYXNpemUgPSBkYi0+bnVtZnJhZyA8PCBkYi0+ZnJhZ3NoaWZ0OworCWRiLT5kbWFzYW1wbGVzID0gZGItPmRtYXNpemUgPj4gc2FtcGxlX3NoaWZ0W2ZtdF07CisJbWVtc2V0KGRiLT5yYXdidWYsIChmbXQgJiBDTV9DRk1UXzE2QklUKSA/IDAgOiAweDgwLCBkYi0+ZG1hc2l6ZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAocmVjKSB7CisJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJICAgIHNldF9kbWFkYWMxKHMsIGRiLT5kbWFhZGRyLCBkYi0+ZG1hc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZm10XSk7CisJCWVsc2UKKwkJICAgIHNldF9kbWFhZGMocywgZGItPmRtYWFkZHIsIGRiLT5kbWFzaXplID4+IHNhbXBsZV9zaGlmdFtmbXRdKTsKKwkJLyogcHJvZ3JhbSBzYW1wbGUgY291bnRzICovCisJCXNldF9jb3VudGRhYyhzLCBkYi0+ZnJhZ3NhbXBsZXMpOworCX0gZWxzZSB7CisJCXNldF9kbWFkYWMocywgZGItPmRtYWFkZHIsIGRiLT5kbWFzaXplID4+IHNhbXBsZV9zaGlmdFtmbXRdKTsKKwkJLyogcHJvZ3JhbSBzYW1wbGUgY291bnRzICovCisJCXNldF9jb3VudGRhYyhzLCBkYi0+ZnJhZ3NhbXBsZXMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJZGItPmVuYWJsZWQgPSAxOworCWRiLT5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9hZHZhbmNlKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBjaGFyIGMgPSAocy0+Zm10ICYgKENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9EQUNTSElGVCkpID8gMCA6IDB4ODA7CisJdW5zaWduZWQgY2hhciAqYnVmID0gcy0+ZG1hX2RhYy5yYXdidWY7CisJdW5zaWduZWQgY2hhciAqYnVmMSA9IHMtPmRtYV9hZGMucmF3YnVmOworCXVuc2lnbmVkIGJzaXplID0gcy0+ZG1hX2RhYy5kbWFzaXplOworCXVuc2lnbmVkIGJwdHIgPSBzLT5kbWFfZGFjLnN3cHRyOworCXVuc2lnbmVkIGxlbiA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisKKwlpZiAoYnB0ciArIGxlbiA+IGJzaXplKSB7CisJCXVuc2lnbmVkIHggPSBic2l6ZSAtIGJwdHI7CisJCW1lbXNldChidWYgKyBicHRyLCBjLCB4KTsKKwkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQkJbWVtc2V0KGJ1ZjEgKyBicHRyLCBjLCB4KTsKKwkJYnB0ciA9IDA7CisJCWxlbiAtPSB4OworCX0KKwltZW1zZXQoYnVmICsgYnB0ciwgYywgbGVuKTsKKwlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpCisJCW1lbXNldChidWYxICsgYnB0ciwgYywgbGVuKTsKK30KKworLyogY2FsbCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgdm9pZCBjbV91cGRhdGVfcHRyKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBod3B0cjsKKwlpbnQgZGlmZjsKKworCS8qIHVwZGF0ZSBBREMgcG9pbnRlciAqLworCWlmIChzLT5kbWFfYWRjLnJlYWR5KSB7CisJICAgIGlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkgICAgLyogdGhlIGRhYyBwYXJ0IHdpbGwgZmluaXNoIGZvciB0aGlzICovCisJICAgIH0gZWxzZSB7CisJCWh3cHRyID0gZ2V0X2RtYWFkYyhzKSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKwkJZGlmZiA9IChzLT5kbWFfYWRjLmRtYXNpemUgKyBod3B0ciAtIHMtPmRtYV9hZGMuaHdwdHIpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlzLT5kbWFfYWRjLmh3cHRyID0gaHdwdHI7CisJCXMtPmRtYV9hZGMudG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJcy0+ZG1hX2FkYy5jb3VudCArPSBkaWZmOworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQl3YWtlX3VwKCZzLT5kbWFfYWRjLndhaXQpOworCQlpZiAoIXMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtICgoMyAqIHMtPmRtYV9hZGMuZnJhZ3NpemUpID4+IDEpKSkgeworCQkJCXBhdXNlX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLmVycm9yKys7CisJCQl9CisJCX0KKwkgICAgfQorCX0KKwkvKiB1cGRhdGUgREFDIHBvaW50ZXIgKi8KKwlpZiAocy0+ZG1hX2RhYy5yZWFkeSkgeworCQlod3B0ciA9IGdldF9kbWFkYWMocykgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCWRpZmYgPSAocy0+ZG1hX2RhYy5kbWFzaXplICsgaHdwdHIgLSBzLT5kbWFfZGFjLmh3cHRyKSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJcy0+ZG1hX2RhYy5od3B0ciA9IGh3cHRyOworCQlzLT5kbWFfZGFjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkJcy0+ZG1hX2FkYy5od3B0ciA9IGh3cHRyOworCQkJcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQl9CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkgeworCQkJcy0+ZG1hX2RhYy5jb3VudCArPSBkaWZmOworCQkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQkJCXMtPmRtYV9hZGMuY291bnQgKz0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZzLT5kbWFfZGFjLndhaXQpOworCQl9IGVsc2UgeworCQkJcy0+ZG1hX2RhYy5jb3VudCAtPSBkaWZmOworCQkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQkJCXMtPmRtYV9hZGMuY291bnQgLT0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50IDw9IDApIHsKKwkJCQlwYXVzZV9kYWMocyk7CisJCQkJcy0+ZG1hX2RhYy5lcnJvcisrOworCQkJfSBlbHNlIGlmIChzLT5kbWFfZGFjLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSAmJiAhcy0+ZG1hX2RhYy5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzKTsKKwkJCQlzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAxOworCQkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJCQkJcy0+ZG1hX2FkYy5lbmRjbGVhcmVkID0gMTsKKwkJCX0KKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplIDw9IChzaWduZWQpcy0+ZG1hX2RhYy5kbWFzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMud2FpdCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IGNtX3N0YXRlICpzID0gKHN0cnVjdCBjbV9zdGF0ZSAqKWRldl9pZDsKKwl1bnNpZ25lZCBpbnQgaW50c3JjLCBpbnRzdGF0OworCXVuc2lnbmVkIGNoYXIgbWFzayA9IDA7CisKKwkvKiBmYXN0cGF0aCBvdXQsIHRvIGVhc2UgaW50ZXJydXB0IHNoYXJpbmcgKi8KKwlpbnRzcmMgPSBpbmwocy0+aW9iYXNlICsgQ09ERUNfQ01JX0lOVF9TVEFUVVMpOworCWlmICghKGludHNyYyAmIDB4ODAwMDAwMDApKQorCQlyZXR1cm4gSVJRX05PTkU7CisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwlpbnRzdGF0ID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9JTlRfSExEQ0xSICsgMik7CisJLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisJaWYgKGludHNyYyAmIEFEQ0lOVCkKKwkJbWFzayB8PSBFTkFEQ0lOVDsKKwlpZiAoaW50c3JjICYgREFDSU5UKQorCQltYXNrIHw9IEVOREFDSU5UOworCW91dGIoaW50c3RhdCAmIH5tYXNrLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfSU5UX0hMRENMUiArIDIpOworCW91dGIoaW50c3RhdCB8IG1hc2ssIHMtPmlvYmFzZSArIENPREVDX0NNSV9JTlRfSExEQ0xSICsgMik7CisJY21fdXBkYXRlX3B0cihzKTsKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX01JREkKKwlpZiAoaW50c3JjICYgMHgwMDAxMDAwMCkgewkvLyBVQVJUIGludGVycnVwdAorCQlpZiAocy0+bWlkaV9kZXZjICYmIGludGNoa19tcHU0MDEoKHZvaWQgKilzLT5taWRpX2RldmMpKQorCQkJbXB1aW50cihpcnEsICh2b2lkICopcy0+bWlkaV9kZXZjLCByZWdzKTsKKwkJZWxzZQorCQkJaW5iKHMtPmlvbWlkaSk7Ly8gZHVtbXkgcmVhZAorCX0KKyNlbmRpZgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfbWFnaWNbXSA9IEtFUk5fQ1JJVCAiY21wY2k6IGludmFsaWQgbWFnaWMgdmFsdWVcbiI7CisKKyNkZWZpbmUgVkFMSURBVEVfU1RBVEUocykgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKCEocykgfHwgKHMpLT5tYWdpYyAhPSBDTV9NQUdJQykgeyBcCisJCXByaW50ayhpbnZhbGlkX21hZ2ljKTsgICAgICAgICAgICBcCisJCXJldHVybiAtRU5YSU87ICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTVRfNCAgICAgICAgICAxCisjZGVmaW5lIE1UXzVNVVRFICAgICAgMgorI2RlZmluZSBNVF80TVVURU1PTk8gIDMKKyNkZWZpbmUgTVRfNk1VVEUgICAgICA0CisjZGVmaW5lIE1UXzVNVVRFTU9OTyAgNQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBsZWZ0OworCXVuc2lnbmVkIHJpZ2h0OworCXVuc2lnbmVkIHR5cGU7CisJdW5zaWduZWQgcmVjOworCXVuc2lnbmVkIHBsYXk7Cit9IG1peHRhYmxlW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7CisJW1NPVU5EX01JWEVSX0NEXSAgICAgPSB7IERTUF9NSVhfQ0RWT0xJRFhfTCwgICAgIERTUF9NSVhfQ0RWT0xJRFhfUiwgICAgIE1UXzVNVVRFLCAgICAgMHgwNCwgMHgwNiB9LAorCVtTT1VORF9NSVhFUl9MSU5FXSAgID0geyBEU1BfTUlYX0xJTkVWT0xJRFhfTCwgICBEU1BfTUlYX0xJTkVWT0xJRFhfUiwgICBNVF81TVVURSwgICAgIDB4MTAsIDB4MTggfSwKKwlbU09VTkRfTUlYRVJfTUlDXSAgICA9IHsgRFNQX01JWF9NSUNWT0xJRFgsICAgICAgRFNQX01JWF9NSUNWT0xJRFgsICAgICAgTVRfNU1VVEVNT05PLCAweDAxLCAweDAxIH0sCisJW1NPVU5EX01JWEVSX1NZTlRIXSAgPSB7IERTUF9NSVhfRk1WT0xJRFhfTCwgIAkgRFNQX01JWF9GTVZPTElEWF9SLCAgICAgTVRfNU1VVEUsICAgICAweDQwLCAweDAwIH0sCisJW1NPVU5EX01JWEVSX1ZPTFVNRV0gPSB7IERTUF9NSVhfTUFTVEVSVk9MSURYX0wsIERTUF9NSVhfTUFTVEVSVk9MSURYX1IsIE1UXzVNVVRFLCAgICAgMHgwMCwgMHgwMCB9LAorCVtTT1VORF9NSVhFUl9QQ01dICAgID0geyBEU1BfTUlYX1ZPSUNFVk9MSURYX0wsICBEU1BfTUlYX1ZPSUNFVk9MSURYX1IsICBNVF81TVVURSwgICAgIDB4MDAsIDB4MDAgfSwKKwlbU09VTkRfTUlYRVJfTElORTFdICA9IHsgRFNQX01JWF9BVVhWT0xfTCwgICAgICAgRFNQX01JWF9BVVhWT0xfUiwgICAgICAgTVRfNU1VVEUsICAgICAweDgwLCAweDYwIH0sCisJW1NPVU5EX01JWEVSX1NQRUFLRVJdPSB7IERTUF9NSVhfU1BLUlZPTElEWCwJIERTUF9NSVhfU1BLUlZPTElEWCwJIE1UXzVNVVRFTU9OTywgMHgwMCwgMHgwMSB9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB2b2xpZHhbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9Cit7CisJW1NPVU5EX01JWEVSX0NEXSAgICAgPSAxLAorCVtTT1VORF9NSVhFUl9MSU5FXSAgID0gMiwKKwlbU09VTkRfTUlYRVJfTUlDXSAgICA9IDMsCisJW1NPVU5EX01JWEVSX1NZTlRIXSAgPSA0LAorCVtTT1VORF9NSVhFUl9WT0xVTUVdID0gNSwKKwlbU09VTkRfTUlYRVJfUENNXSAgICA9IDYsCisJW1NPVU5EX01JWEVSX0xJTkUxXSAgPSA3LAorCVtTT1VORF9NSVhFUl9TUEVBS0VSXT0gOAorfTsKKworc3RhdGljIHVuc2lnbmVkIG1peGVyX291dG1hc2soc3RydWN0IGNtX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIGosIGs7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWogPSByZG1peGVyKHMsIERTUF9NSVhfT1VUTUlYSURYKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJZm9yIChrID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJaWYgKGogJiBtaXh0YWJsZVtpXS5wbGF5KQorCQkJayB8PSAxIDw8IGk7CisJcmV0dXJuIGs7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBtaXhlcl9yZWNtYXNrKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBqLCBrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlqID0gcmRtaXhlcihzLCBEU1BfTUlYX0FEQ01JWElEWF9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJZm9yIChrID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJaWYgKGogJiBtaXh0YWJsZVtpXS5yZWMpCisJCQlrIHw9IDEgPDwgaTsKKwlyZXR1cm4gazsKK30KKworc3RhdGljIGludCBtaXhlcl9pb2N0bChzdHJ1Y3QgY21fc3RhdGUgKnMsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIHZhbCwgajsKKwl1bnNpZ25lZCBjaGFyIGwsIHIsIHJsLCBycjsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworICAgICAgICBpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKKwkJbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCXN0cmxjcHkoaW5mby5pZCwgImNtcGNpIiwgc2l6ZW9mKGluZm8uaWQpKTsKKwkJc3RybGNweShpbmZvLm5hbWUsICJDLU1lZGlhIFBDSSIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaW5mby5tb2RpZnlfY291bnRlciA9IHMtPm1peC5tb2RjbnQ7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjbWQgPT0gU09VTkRfT0xEX01JWEVSX0lORk8pIHsKKwkJX29sZF9taXhlcl9pbmZvIGluZm87CisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJc3RybGNweShpbmZvLmlkLCAiY21wY2kiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgIkMtTWVkaWEgY21wY2kiLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjbWQgPT0gT1NTX0dFVFZFUlNJT04pCisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKwlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ00nIHx8IF9TSU9DX1NJWkUoY21kKSAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgaWYgKF9TSU9DX0RJUihjbWQpID09IF9TSU9DX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJdmFsID0gbWl4ZXJfcmVjbWFzayhzKTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlICovCisJCQl2YWwgPSBtaXhlcl9vdXRtYXNrKHMpOworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgZGV2aWNlICovCisJCQlmb3IgKHZhbCA9IGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspCisJCQkJaWYgKG1peHRhYmxlW2ldLnR5cGUpCisJCQkJCXZhbCB8PSAxIDw8IGk7CisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzogLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHN1cHBvcnRlZCByZWNvcmRpbmcgc291cmNlICovCisJCQlmb3IgKHZhbCA9IGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspCisJCQkJaWYgKG1peHRhYmxlW2ldLnJlYykKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9PVVRNQVNLOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgKi8KKwkJCWZvciAodmFsID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCQlpZiAobWl4dGFibGVbaV0ucGxheSkKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisgICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogLyogTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gKi8KKwkJCWZvciAodmFsID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCQlpZiAobWl4dGFibGVbaV0udHlwZSAmJiBtaXh0YWJsZVtpXS50eXBlICE9IE1UXzRNVVRFTU9OTykKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJCWRlZmF1bHQ6CisJCQlpID0gX0lPQ19OUihjbWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICFtaXh0YWJsZVtpXS50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghdm9saWR4W2ldKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbdm9saWR4W2ldLTFdLCBwKTsKKwkJfQorCX0KKyAgICAgICAgaWYgKF9TSU9DX0RJUihjbWQpICE9IChfU0lPQ19SRUFEfF9TSU9DX1dSSVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcy0+bWl4Lm1vZGNudCsrOworCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWkgPSBnZW5lcmljX2h3ZWlnaHQzMih2YWwpOworCQlmb3IgKGogPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7CisJCQlpZiAoISh2YWwgJiAoMSA8PCBpKSkpCisJCQkJY29udGludWU7CisJCQlpZiAoIW1peHRhYmxlW2ldLnJlYykgeworCQkJCXZhbCAmPSB+KDEgPDwgaSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlqIHw9IG1peHRhYmxlW2ldLnJlYzsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQl3cm1peGVyKHMsIERTUF9NSVhfQURDTUlYSURYX0wsIGopOworCQl3cm1peGVyKHMsIERTUF9NSVhfQURDTUlYSURYX1IsIChqICYgMSkgfCAoaj4+MSkgfCAoaiAmIDB4ODApKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlmb3IgKGogPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7CisJCQlpZiAoISh2YWwgJiAoMSA8PCBpKSkpCisJCQkJY29udGludWU7CisJCQlpZiAoIW1peHRhYmxlW2ldLnBsYXkpIHsKKwkJCQl2YWwgJj0gfigxIDw8IGkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaiB8PSBtaXh0YWJsZVtpXS5wbGF5OworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXdybWl4ZXIocywgRFNQX01JWF9PVVRNSVhJRFgsIGopOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJaSA9IF9JT0NfTlIoY21kKTsKKwkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICFtaXh0YWJsZVtpXS50eXBlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlyID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWlmIChsID4gMTAwKQorCQkJbCA9IDEwMDsKKwkJaWYgKHIgPiAxMDApCisJCQlyID0gMTAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzd2l0Y2ggKG1peHRhYmxlW2ldLnR5cGUpIHsKKwkJY2FzZSBNVF80OgorCQkJaWYgKGwgPj0gMTApCisJCQkJbCAtPSAxMDsKKwkJCWlmIChyID49IDEwKQorCQkJCXIgLT0gMTA7CisJCQlmcm9iaW5kaXIocywgbWl4dGFibGVbaV0ubGVmdCwgMHhmMCwgbCAvIDYpOworCQkJZnJvYmluZGlyKHMsIG1peHRhYmxlW2ldLnJpZ2h0LCAweGYwLCBsIC8gNik7CisJCQlicmVhazsKKworCQljYXNlIE1UXzRNVVRFTU9OTzoKKwkJCXJsID0gKGwgPCA0ID8gMCA6IChsIC0gNSkgLyAzKSAmIDMxOworCQkJcnIgPSAocmwgPj4gMikgJiA3OworCQkJd3JtaXhlcihzLCBtaXh0YWJsZVtpXS5sZWZ0LCBybDw8Myk7CisJCQlpZiAoaSA9PSBTT1VORF9NSVhFUl9NSUMpCisJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMiwgfjB4MGUsIHJyPDwxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVRfNU1VVEVNT05POgorCQkJcmwgPSBsIDwgNCA/IDAgOiAobCAtIDUpIC8gMzsKKyAJCQl3cm1peGVyKHMsIG1peHRhYmxlW2ldLmxlZnQsIHJsPDwzKTsKKwkJCWwgPSByZG1peGVyKHMsIERTUF9NSVhfT1VUTUlYSURYKSAmIH5taXh0YWJsZVtpXS5wbGF5OworCQkJciA9IHJsID8gbWl4dGFibGVbaV0ucGxheSA6IDA7CisJCQl3cm1peGVyKHMsIERTUF9NSVhfT1VUTUlYSURYLCBsIHwgcik7CisJCQkvKiBmb3IgcmVjb3JkaW5nICovCisJCQlpZiAoaSA9PSBTT1VORF9NSVhFUl9NSUMpIHsKKwkJCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM3KSB7CisJCQkJCXJyID0gcmwgPj4gMTsKKwkJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMiwgfjB4MGUsIChyciYweDA3KTw8MSk7CisJCQkJCWZyb2JpbmRpcihzLCBEU1BfTUlYX0VYVEVOU0lPTiwgfjB4MDEsIHJyPj4zKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyciA9IHJsID4+IDI7CisJCQkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjIsIH4weDBlLCBycjw8MSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNVF81TVVURToKKwkJCXJsID0gbCA8IDQgPyAwIDogKGwgLSA1KSAvIDM7CisJCQlyciA9IHIgPCA0ID8gMCA6IChyIC0gNSkgLyAzOworIAkJCXdybWl4ZXIocywgbWl4dGFibGVbaV0ubGVmdCwgcmw8PDMpOworCQkJd3JtaXhlcihzLCBtaXh0YWJsZVtpXS5yaWdodCwgcnI8PDMpOworCQkJbCA9IHJkbWl4ZXIocywgRFNQX01JWF9PVVRNSVhJRFgpOworCQkJbCAmPSB+bWl4dGFibGVbaV0ucGxheTsKKwkJCXIgPSAocmx8cnIpID8gbWl4dGFibGVbaV0ucGxheSA6IDA7CisJCQl3cm1peGVyKHMsIERTUF9NSVhfT1VUTUlYSURYLCBsIHwgcik7CisJCQlicmVhazsKKworCQljYXNlIE1UXzZNVVRFOgorCQkJaWYgKGwgPCA2KQorCQkJCXJsID0gMHgwMDsKKwkJCWVsc2UKKwkJCQlybCA9IGwgKiAyIC8gMzsKKwkJCWlmIChyIDwgNikKKwkJCQlyciA9IDB4MDA7CisJCQllbHNlCisJCQkJcnIgPSByICogMiAvIDM7CisJCQl3cm1peGVyKHMsIG1peHRhYmxlW2ldLmxlZnQsIHJsKTsKKwkJCXdybWl4ZXIocywgbWl4dGFibGVbaV0ucmlnaHQsIHJyKTsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoIXZvbGlkeFtpXSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzLT5taXgudm9sW3ZvbGlkeFtpXS0xXSA9IHZhbDsKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbdm9saWR4W2ldLTFdLCBwKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGNtX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgY21fc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNtX3N0YXRlLCBkZXZzKTsKKwkJaWYgKHMtPmRldl9taXhlciA9PSBtaW5vcikKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgY21fcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNtX3N0YXRlICpzID0gKHN0cnVjdCBjbV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIG1peGVyX2lvY3RsKChzdHJ1Y3QgY21fc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGEsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNtX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJID0gbm9fbGxzZWVrLAorCS5pb2N0bAkgPSBjbV9pb2N0bF9taXhkZXYsCisJLm9wZW4JID0gY21fb3Blbl9taXhkZXYsCisJLnJlbGVhc2UgPSBjbV9yZWxlYXNlX21peGRldiwKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50LCB0bW87CisKKwlpZiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwgIXMtPmRtYV9kYWMucmVhZHkpCisJCXJldHVybiAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9kYWMuY291bnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobm9uYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICAgICAgICAgIH0KKwkJdG1vID0gMyAqIEhaICogKGNvdW50ICsgcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgLyAyIC8gcy0+cmF0ZWRhYzsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPmZtdCA+PiBDTV9DRk1UX0RBQ1NISUZUKSAmIENNX0NGTVRfTUFTS107CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gKyAxKSkKKwkJCURCRyhwcmludGsoS0VSTl9ERUJVRyAiY21wY2k6IGRtYSB0aW1lZCBvdXQ/P1xuIik7KQorICAgICAgICB9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNzaXplX3QgY21fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGNtX3N0YXRlICpzID0gKHN0cnVjdCBjbV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2FkYy53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzd3B0ciA9IHMtPmRtYV9hZGMuc3dwdHI7CisJCWNudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZS1zd3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMuY291bnQgPCBjbnQpCisJCQljbnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoY250IDw9IDApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKKwkJCQlzdGFydF9hZGMocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmICghc2NoZWR1bGVfdGltZW91dChIWikpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiY21wY2k6IHJlYWQ6IGNoaXAgbG9ja3VwPyBkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCisJCQkJICAgICAgIHMtPmRtYV9hZGMuZG1hc2l6ZSwgcy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcy0+ZG1hX2FkYy5jb3VudCwKKwkJCQkgICAgICAgcy0+ZG1hX2FkYy5od3B0ciwgcy0+ZG1hX2FkYy5zd3B0cik7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlzdG9wX2FkY191bmxvY2tlZChzKTsKKwkJCQlzZXRfZG1hYWRjKHMsIHMtPmRtYV9hZGMuZG1hYWRkciwgcy0+ZG1hX2FkYy5kbWFzYW1wbGVzKTsKKwkJCQkvKiBwcm9ncmFtIHNhbXBsZSBjb3VudHMgKi8KKwkJCQlzZXRfY291bnRhZGMocywgcy0+ZG1hX2FkYy5mcmFnc2FtcGxlcyk7CisJCQkJcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMuaHdwdHIgPSBzLT5kbWFfYWRjLnN3cHRyID0gMDsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKHMtPnN0YXR1cyAmIERPX0JJR0VORElBTl9SKSB7CisJCQlpbnQJaSwgZXJyOworCQkJdW5zaWduZWQgY2hhciAqc3JjOworCQkJY2hhciBfX3VzZXIgKmRzdCA9IGJ1ZmZlcjsKKwkJCXVuc2lnbmVkIGNoYXIgZGF0YVsyXTsKKworCQkJc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgKHMtPmRtYV9hZGMucmF3YnVmICsgc3dwdHIpOworCQkJLy8gY29weSBsZWZ0L3JpZ2h0IHNhbXBsZSBhdCBvbmUgdGltZQorCQkJZm9yIChpID0gMDsgaSA8IGNudCAvIDI7IGkrKykgeworCQkJCWRhdGFbMF0gPSBzcmNbMV07CisJCQkJZGF0YVsxXSA9IHNyY1swXTsKKwkJCQlpZiAoKGVyciA9IF9fcHV0X3VzZXIoZGF0YVswXSwgZHN0KyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fcHV0X3VzZXIoZGF0YVsxXSwgZHN0KyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlzcmMgKz0gMjsKKwkJCX0KKwkJfSBlbHNlIGlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfYWRjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9hZGMuY291bnQgLT0gY250OworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWlmIChzLT5kbWFfYWRjLmVuYWJsZWQpCisJCQlzdGFydF9hZGNfdW5sb2NrZWQocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl9CitvdXQ6CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgY21fc3RhdGUgKnMgPSAoc3RydWN0IGNtX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCQlyZXR1cm4gLUVOWElPOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDEpKSkKKwkJCXJldHVybiByZXQ7CisJfQorCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA8IDApIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgPSAwOworCQkJcy0+ZG1hX2RhYy5zd3B0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCX0KKwkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSB7CisJCQlzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKwkJCXMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQkJcy0+ZG1hX2FkYy5lbmRjbGVhcmVkID0gcy0+ZG1hX2RhYy5lbmRjbGVhcmVkOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+c3RhdHVzICYgRE9fQUMzX1NXKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCArIDIgKiBjbnQgPiBzLT5kbWFfZGFjLmRtYXNpemUpCisJCQkJY250ID0gKHMtPmRtYV9kYWMuZG1hc2l6ZSAtIHMtPmRtYV9kYWMuY291bnQpIC8gMjsKKwkJfSBlbHNlIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ICsgY250ID4gcy0+ZG1hX2RhYy5kbWFzaXplKQorCQkJCWNudCA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIHMtPmRtYV9kYWMuY291bnQ7CisJCX0KKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSAmJiAoY250ID4gY291bnQgLyAyKSkKKwkJICAgIGNudCA9IGNvdW50IC8gMjsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5lbmFibGVkKQorCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KEhaKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJjbXBjaTogd3JpdGU6IGNoaXAgbG9ja3VwPyBkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCisJCQkJICAgICAgIHMtPmRtYV9kYWMuZG1hc2l6ZSwgcy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcy0+ZG1hX2RhYy5jb3VudCwKKwkJCQkgICAgICAgcy0+ZG1hX2RhYy5od3B0ciwgcy0+ZG1hX2RhYy5zd3B0cik7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlzdG9wX2RhY191bmxvY2tlZChzKTsKKwkJCQlzZXRfZG1hZGFjKHMsIHMtPmRtYV9kYWMuZG1hYWRkciwgcy0+ZG1hX2RhYy5kbWFzYW1wbGVzKTsKKwkJCQkvKiBwcm9ncmFtIHNhbXBsZSBjb3VudHMgKi8KKwkJCQlzZXRfY291bnRkYWMocywgcy0+ZG1hX2RhYy5mcmFnc2FtcGxlcyk7CisJCQkJcy0+ZG1hX2RhYy5jb3VudCA9IHMtPmRtYV9kYWMuaHdwdHIgPSBzLT5kbWFfZGFjLnN3cHRyID0gMDsKKwkJCQlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpICB7CisJCQkJCXNldF9kbWFkYWMxKHMsIHMtPmRtYV9hZGMuZG1hYWRkciwgcy0+ZG1hX2FkYy5kbWFzYW1wbGVzKTsKKwkJCQkJcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMuaHdwdHIgPSBzLT5kbWFfYWRjLnN3cHRyID0gMDsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzLT5zdGF0dXMgJiBET19BQzNfU1cpIHsKKwkJCWludCBlcnI7CisKKwkJCS8vIGNsaXAgZXhjZWVkZWQgZGF0YSwgY2F1Z2h0IGJ5IDAzMyBhbmQgMDM3CisJCQlpZiAoc3dwdHIgKyAyICogY250ID4gcy0+ZG1hX2RhYy5kbWFzaXplKQorCQkJCWNudCA9IChzLT5kbWFfZGFjLmRtYXNpemUgLSBzd3B0cikgLyAyOworCQkJaWYgKChlcnIgPSB0cmFuc19hYzMocywgcy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSkgeworCQkJCXJldCA9IGVycjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXN3cHRyID0gKHN3cHRyICsgMiAqIGNudCkgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCX0gZWxzZSBpZiAoKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSAmJiAocy0+c3RhdHVzICYgRE9fQklHRU5ESUFOX1cpKSB7CisJCQlpbnQJaSwgZXJyOworCQkJY29uc3QgY2hhciBfX3VzZXIgKnNyYyA9IGJ1ZmZlcjsKKwkJCXVuc2lnbmVkIGNoYXIgKmRzdDAsICpkc3QxOworCQkJdW5zaWduZWQgY2hhciBkYXRhWzhdOworCisJCQlkc3QwID0gKHVuc2lnbmVkIGNoYXIgKikgKHMtPmRtYV9kYWMucmF3YnVmICsgc3dwdHIpOworCQkJZHN0MSA9ICh1bnNpZ25lZCBjaGFyICopIChzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyKTsKKwkJCS8vIGNvcHkgbGVmdC9yaWdodCBzYW1wbGUgYXQgb25lIHRpbWUKKwkJCWZvciAoaSA9IDA7IGkgPCBjbnQgLyA0OyBpKyspIHsKKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVswXSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVsxXSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVsyXSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVszXSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVs0XSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVs1XSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVs2XSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVs3XSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlkc3QwWzBdID0gZGF0YVsxXTsKKwkJCQlkc3QwWzFdID0gZGF0YVswXTsKKwkJCQlkc3QwWzJdID0gZGF0YVszXTsKKwkJCQlkc3QwWzNdID0gZGF0YVsyXTsKKwkJCQlkc3QxWzBdID0gZGF0YVs1XTsKKwkJCQlkc3QxWzFdID0gZGF0YVs0XTsKKwkJCQlkc3QxWzJdID0gZGF0YVs3XTsKKwkJCQlkc3QxWzNdID0gZGF0YVs2XTsKKwkJCQlkc3QwICs9IDQ7CisJCQkJZHN0MSArPSA0OworCQkJfQorCQkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYy5kbWFzaXplOworCQl9IGVsc2UgaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSB7CisJCQlpbnQJaSwgZXJyOworCQkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnNyYyA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBidWZmZXI7CisJCQl1bnNpZ25lZCBsb25nICpkc3QwLCAqZHN0MTsKKworCQkJZHN0MCA9ICh1bnNpZ25lZCBsb25nICopIChzLT5kbWFfZGFjLnJhd2J1ZiArIHN3cHRyKTsKKwkJCWRzdDEgPSAodW5zaWduZWQgbG9uZyAqKSAocy0+ZG1hX2FkYy5yYXdidWYgKyBzd3B0cik7CisJCQkvLyBjb3B5IGxlZnQvcmlnaHQgc2FtcGxlIGF0IG9uZSB0aW1lCisJCQlmb3IgKGkgPSAwOyBpIDwgY250IC8gNDsgaSsrKSB7CisJCQkJaWYgKChlcnIgPSBfX2dldF91c2VyKCpkc3QwKyssIHNyYysrKSkpIHsKKwkJCQkJcmV0ID0gZXJyOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKChlcnIgPSBfX2dldF91c2VyKCpkc3QxKyssIHNyYysrKSkpIHsKKwkJCQkJcmV0ID0gZXJyOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCX0gZWxzZSBpZiAocy0+c3RhdHVzICYgRE9fQklHRU5ESUFOX1cpIHsKKwkJCWludAlpLCBlcnI7CisJCQljb25zdCBjaGFyIF9fdXNlciAqc3JjID0gYnVmZmVyOworCQkJdW5zaWduZWQgY2hhciAqZHN0OworCQkJdW5zaWduZWQgY2hhciBkYXRhWzJdOworCisJCQlkc3QgPSAodW5zaWduZWQgY2hhciAqKSAocy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0cik7CisJCQkvLyBzd2FwIGhpL2xvIGJ5dGVzIGZvciBlYWNoIHNhbXBsZQorCQkJZm9yIChpID0gMDsgaSA8IGNudCAvIDI7IGkrKykgeworCQkJCWlmICgoZXJyID0gX19nZXRfdXNlcihkYXRhWzBdLCBzcmMrKykpKSB7CisJCQkJCXJldCA9IGVycjsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWlmICgoZXJyID0gX19nZXRfdXNlcihkYXRhWzFdLCBzcmMrKykpKSB7CisJCQkJCXJldCA9IGVycjsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWRzdFswXSA9IGRhdGFbMV07CisJCQkJZHN0WzFdID0gZGF0YVswXTsKKwkJCQlkc3QgKz0gMjsKKwkJCX0KKwkJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihzLT5kbWFfZGFjLnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfZGFjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9kYWMuY291bnQgKz0gY250OworCQlpZiAocy0+c3RhdHVzICYgRE9fQUMzX1NXKQorCQkJcy0+ZG1hX2RhYy5jb3VudCArPSBjbnQ7CisJCXMtPmRtYV9kYWMuZW5kY2xlYXJlZCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpIHsKKwkJCWNvdW50IC09IGNudDsKKwkJCWJ1ZmZlciArPSBjbnQ7CisJCQlyZXQgKz0gY250OworCQl9CisJCWlmIChzLT5kbWFfZGFjLmVuYWJsZWQpCisJCQlzdGFydF9kYWMocyk7CisJfQorb3V0OgorICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNtX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgY21fc3RhdGUgKnMgPSAoc3RydWN0IGNtX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1ZihzLCAwKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1ZihzLCAxKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJY21fdXBkYXRlX3B0cihzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9IGVsc2UgeworCQkJaWYgKChzaWduZWQpcy0+ZG1hX2RhYy5kbWFzaXplID49IHMtPmRtYV9kYWMuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgY21fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGNtX3N0YXRlICpzID0gKHN0cnVjdCBjbV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAwKSkgIT0gMCkKKwkJCWdvdG8gb3V0OworCQlkYiA9ICZzLT5kbWFfZGFjOworCX0gZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAxKSkgIT0gMCkKKwkJCWdvdG8gb3V0OworCQlkYiA9ICZzLT5kbWFfYWRjOworCX0gZWxzZQorCQlnb3RvIG91dDsKKwlyZXQgPSAtRUlOVkFMOworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCisJCWdvdG8gb3V0OworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikpCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJdmlydF90b19waHlzKGRiLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlnb3RvIG91dDsKKwlkYi0+bWFwcGVkID0gMTsKKwlyZXQgPSAwOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFNORENUTF9TUERJRl9DT1BZUklHSFQJX1NJT1coJ1MnLCAgMCwgaW50KSAgICAgICAvLyBzZXQvcmVzZXQgUy9QRElGIGNvcHkgcHJvdGVjdGlvbgorI2RlZmluZSBTTkRDVExfU1BESUZfTE9PUAlfU0lPVygnUycsICAxLCBpbnQpICAgICAgIC8vIHNldC9yZXNldCBTL1BESUYgbG9vcAorI2RlZmluZSBTTkRDVExfU1BESUZfTU9OSVRPUglfU0lPVygnUycsICAyLCBpbnQpICAgICAgIC8vIHNldCBTL1BESUYgbW9uaXRvcgorI2RlZmluZSBTTkRDVExfU1BESUZfTEVWRUwJX1NJT1coJ1MnLCAgMywgaW50KSAgICAgICAvLyBzZXQvcmVzZXQgUy9QRElGIG91dCBsZXZlbAorI2RlZmluZSBTTkRDVExfU1BESUZfSU5WCV9TSU9XKCdTJywgIDQsIGludCkgICAgICAgLy8gc2V0L3Jlc2V0IFMvUERJRiBpbiBpbnZlcnNlCisjZGVmaW5lIFNORENUTF9TUERJRl9TRUwyCV9TSU9XKCdTJywgIDUsIGludCkgICAgICAgLy8gc2V0IFMvUERJRiBpbiAjMgorI2RlZmluZSBTTkRDVExfU1BESUZfVkFMSUQJX1NJT1coJ1MnLCAgNiwgaW50KSAgICAgICAvLyBzZXQgUy9QRElGIHZhbGlkCisjZGVmaW5lIFNORENUTF9TUERJRk9VVAkJX1NJT1coJ1MnLCAgNywgaW50KSAgICAgICAvLyBzZXQgUy9QRElGIG91dAorI2RlZmluZSBTTkRDVExfU1BESUZJTgkJX1NJT1coJ1MnLCAgOCwgaW50KSAgICAgICAvLyBzZXQgUy9QRElGIG91dAorCitzdGF0aWMgaW50IGNtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY21fc3RhdGUgKnMgPSAoc3RydWN0IGNtX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKyAgICAgICAgY291bnRfaW5mbyBjaW5mbzsKKwlpbnQgdmFsLCBtYXBwZWQsIHJldDsKKwl1bnNpZ25lZCBjaGFyIGZtdG0sIGZtdGQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAgbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYy5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywgMC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sqLyk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCB8IERTUF9DQVBfQklORCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfZGFjLnN3cHRyID0gcy0+ZG1hX2RhYy5od3B0ciA9IHMtPmRtYV9kYWMuY291bnQgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzID0gMDsKKwkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJCQlzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2FkYy5od3B0ciA9IHMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0gcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPSAwOworCQl9CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJIAlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCXN0b3BfYWRjX3VubG9ja2VkKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCXNldF9hZGNfcmF0ZV91bmxvY2tlZChzLCB2YWwpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJc2V0X2RhY19yYXRlKHMsIHZhbCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlmbXRkID0gMDsKKwkJZm10bSA9IH4wOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCWlmICh2YWwpCisJCQkJZm10ZCB8PSBDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUOworCQkJZWxzZQorCQkJCWZtdG0gJj0gfihDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQlpZiAodmFsKQorCQkJCWZtdGQgfD0gQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9EQUNTSElGVDsKKwkJCWVsc2UKKwkJCQlmbXRtICY9IH4oQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9EQUNTSElGVCk7CisJCQlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpIHsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsKQorCQkJCQlmbXRkIHw9IENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfQURDU0hJRlQ7CisJCQkJZWxzZQorCQkJCQlmbXRtICY9IH4oQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9BRENTSElGVCk7CisJCQl9CisJCX0KKwkJc2V0X2ZtdChzLCBmbXRtLCBmbXRkKTsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWZtdGQgPSAwOworCQkJZm10bSA9IH4wOworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsID49IDIpCisJCQkJCWZtdGQgfD0gQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9BRENTSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJZm10ZCB8PSBDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0RBQ1NISUZUOworCQkJCWVsc2UKKwkJCQkJZm10bSAmPSB+KENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfREFDU0hJRlQpOworCQkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQkJZm10ZCB8PSBDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUOworCQkJCQllbHNlCisJCQkJCQlmbXRtICY9IH4oQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9BRENTSElGVCk7CisJCQkJfQorCQkJfQorCQkJc2V0X2ZtdChzLCBmbXRtLCBmbXRkKTsKKwkJCWlmICgocy0+Y2FwYWJpbGl0eSAmIENBTl9NVUxUSV9DSCkKKwkJCSAgICAgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgeworCQkJCXZhbCA9IHNldF9kYWNfY2hhbm5lbHMocywgdmFsKTsKKwkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPmZtdCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyAoQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9BRENTSElGVCkKKwkJCQkJICAgOiAoQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9EQUNTSElGVCkpKSA/IDIgOiAxLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9CRXxBRk1UX1MxNl9MRXxBRk1UX1U4fAorCQkJKChzLT5jYXBhYmlsaXR5ICYgQ0FOX0FDMykgPyBBRk1UX0FDMyA6IDApLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJZm10ZCA9IDA7CisJCQlmbXRtID0gfjA7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfQkUgfHwgdmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlmbXRkIHw9IENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9BRENTSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihDTV9DRk1UXzE2QklUIDw8IENNX0NGTVRfQURDU0hJRlQpOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfQkUpCisJCQkJCXMtPnN0YXR1cyB8PSBET19CSUdFTkRJQU5fUjsKKwkJCQllbHNlCisJCQkJCXMtPnN0YXR1cyAmPSB+RE9fQklHRU5ESUFOX1I7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0JFIHx8IHZhbCA9PSBBRk1UX1MxNl9MRSB8fCB2YWwgPT0gQUZNVF9BQzMpCisJCQkJCWZtdGQgfD0gQ01fQ0ZNVF8xNkJJVCA8PCBDTV9DRk1UX0RBQ1NISUZUOworCQkJCWVsc2UKKwkJCQkJZm10bSAmPSB+KENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9EQUNTSElGVCk7CisJCQkJaWYgKHZhbCA9PSBBRk1UX0FDMykgeworCQkJCQlmbXRkIHw9IENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfREFDU0hJRlQ7CisJCQkJCXNldF9hYzMocywgNDgwMDApOworCQkJCX0gZWxzZQorCQkJCQlzZXRfYWMzKHMsIDApOworCQkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9CRSB8fCB2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCQlmbXRkIHw9IENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfQURDU0hJRlQ7CisJCQkJCWVsc2UKKwkJCQkJCWZtdG0gJj0gfihDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUKTsKKwkJCQl9CisJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9CRSkKKwkJCQkJcy0+c3RhdHVzIHw9IERPX0JJR0VORElBTl9XOworCQkJCWVsc2UKKwkJCQkJcy0+c3RhdHVzICY9IH5ET19CSUdFTkRJQU5fVzsKKwkJCX0KKwkJCXNldF9mbXQocywgZm10bSwgZm10ZCk7CisJCX0KKwkJaWYgKHMtPnN0YXR1cyAmIERPX0FDMykgcmV0dXJuIHB1dF91c2VyKEFGTVRfQUMzLCBwKTsKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9BRENTSElGVCkKKwkJCQkJICAgOiAoQ01fQ0ZNVF8xNkJJVCA8PCBDTV9DRk1UX0RBQ1NISUZUKSkpID8gdmFsIDogQUZNVF9VOCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKwkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYKKwkJCSAocy0+ZW5hYmxlICYgRU5EQUMpICYmCisJCQkgKHMtPmVuYWJsZSAmIEVOQURDKSkKKwkJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5lbmFibGUgJiBFTkFEQykKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZW5hYmxlICYgRU5EQUMpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMSkpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDE7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJfSBlbHNlIHsKKwkJCQlzLT5kbWFfYWRjLmVuYWJsZWQgPSAwOworCQkJCXN0b3BfYWRjKHMpOworCQkJfQorCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCQkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAwKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSB7CisJCQkJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMSkpKQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQkJcy0+ZG1hX2RhYy5lbmFibGVkID0gMTsKKwkJCQlzdGFydF9kYWMocyk7CisJCQl9IGVsc2UgeworCQkJCXMtPmRtYV9kYWMuZW5hYmxlZCA9IDA7CisJCQkJc3RvcF9kYWMocyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCEocy0+ZW5hYmxlICYgRU5EQUMpICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAwKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNtX3VwZGF0ZV9wdHIocyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gcy0+ZG1hX2RhYy5jb3VudDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMubnVtZnJhZzsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIShzLT5lbmFibGUgJiBFTkFEQykgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHMsIDEpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY21fdXBkYXRlX3B0cihzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZTsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLmNvdW50OworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisgICAgICAgICAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljbV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIHZhbCA9IHMtPmRtYV9kYWMuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNtX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IHMtPmRtYV9hZGMuY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSBzLT5kbWFfYWRjLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgID8gLUVGQVVMVCA6IDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljbV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlczsKKyAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBzLT5kbWFfZGFjLmNvdW50ID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJCXMtPmRtYV9kYWMuY291bnQgJj0gcy0+ZG1hX2RhYy5mcmFnc2l6ZS0xOworCQlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpIHsKKwkJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCQlzLT5kbWFfYWRjLmNvdW50ICY9IHMtPmRtYV9hZGMuZnJhZ3NpemUtMTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAwKSkpCisJCQkJcmV0dXJuIHZhbDsKKwkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkJCWlmICgodmFsID0gcHJvZ19kbWFidWYocywgMSkpKQorCQkJCQlyZXR1cm4gdmFsOworCQkJCXJldHVybiBwdXRfdXNlcigyICogcy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcCk7CisJCQl9CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcCk7CisJCX0KKwkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCQlyZXR1cm4gdmFsOworCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IDQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJCWlmIChzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSA0OworCQkJaWYgKHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJCWlmIChzLT5kbWFfZGFjLm9zc21heGZyYWdzIDwgNCkKKwkJCQlzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gNDsKKwkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQ7CisJCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3M7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24pIHx8CisJCSAgICAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gdmFsOworCQkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQkJCXMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSB2YWw7CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+cmF0ZWFkYyA6IHMtPnJhdGVkYWMsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUKSA6IChDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0RBQ1NISUZUKSkpID8gMiA6IDEsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9BRENTSElGVCkgOiAoQ01fQ0ZNVF8xNkJJVCA8PCBDTV9DRk1UX0RBQ1NISUZUKSkpID8gMTYgOiA4LCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9CSU5EX0ZST05UfERTUF9CSU5EX1NVUlJ8RFNQX0JJTkRfQ0VOVEVSX0xGRXxEU1BfQklORF9TUERJRiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfQklORF9DSEFOTkVMOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID09IERTUF9CSU5EX1FVRVJZKSB7CisJCQl2YWwgPSBEU1BfQklORF9GUk9OVDsKKwkJCWlmIChzLT5zdGF0dXMgJiBET19TUERJRl9PVVQpCisJCQkJdmFsIHw9IERTUF9CSU5EX1NQRElGOworCQkJZWxzZSB7CisJCQkJaWYgKHMtPmN1cnJfY2hhbm5lbHMgPT0gNCkKKwkJCQkJdmFsIHw9IERTUF9CSU5EX1NVUlI7CisJCQkJaWYgKHMtPmN1cnJfY2hhbm5lbHMgPiA0KQorCQkJCQl2YWwgfD0gRFNQX0JJTkRfQ0VOVEVSX0xGRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCAmIERTUF9CSU5EX1NQRElGKSB7CisJCQkJCXNldF9zcGRpZmluKHMsIHMtPnJhdGVhZGMpOworCQkJCQlpZiAoIShzLT5zdGF0dXMgJiBET19TUERJRl9PVVQpKQorCQkJCQkJdmFsICY9IH5EU1BfQklORF9TUERJRjsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsICYgRFNQX0JJTkRfU1BESUYpIHsKKwkJCQkJc2V0X3NwZGlmb3V0KHMsIHMtPnJhdGVkYWMpOworCQkJCQlzZXRfZGFjX2NoYW5uZWxzKHMsIHMtPmZtdCAmIChDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0RBQ1NISUZUKSA/IDIgOiAxKTsKKwkJCQkJaWYgKCEocy0+c3RhdHVzICYgRE9fU1BESUZfT1VUKSkKKwkJCQkJCXZhbCAmPSB+RFNQX0JJTkRfU1BESUY7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IGNoYW5uZWxzOworCQkJCQlpbnQgbWFzazsKKworCQkJCQltYXNrID0gdmFsICYgKERTUF9CSU5EX0ZST05UfERTUF9CSU5EX1NVUlJ8RFNQX0JJTkRfQ0VOVEVSX0xGRSk7CisJCQkJCXN3aXRjaCAobWFzaykgeworCQkJCQkgICAgY2FzZSBEU1BfQklORF9GUk9OVDoKKwkJCQkJCWNoYW5uZWxzID0gMjsKKwkJCQkJCWJyZWFrOworCQkJCQkgICAgY2FzZSBEU1BfQklORF9GUk9OVHxEU1BfQklORF9TVVJSOgorCQkJCQkJY2hhbm5lbHMgPSA0OworCQkJCQkJYnJlYWs7CisJCQkJCSAgICBjYXNlIERTUF9CSU5EX0ZST05UfERTUF9CSU5EX1NVUlJ8RFNQX0JJTkRfQ0VOVEVSX0xGRToKKwkJCQkJCWNoYW5uZWxzID0gNjsKKwkJCQkJCWJyZWFrOworCQkJCQkgICAgZGVmYXVsdDoKKwkJCQkJCWNoYW5uZWxzID0gcy0+Zm10ICYgKENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfREFDU0hJRlQpID8gMiA6IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlzZXRfZGFjX2NoYW5uZWxzKHMsIGNoYW5uZWxzKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBTTkRDVExfU1BESUZfQ09QWVJJR0hUOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZfY29weXJpZ2h0KHMsIHZhbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJY2FzZSBTTkRDVExfU1BESUZfTE9PUDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2V0X3NwZGlmX2xvb3AocywgdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwljYXNlIFNORENUTF9TUERJRl9NT05JVE9SOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZfbW9uaXRvcihzLCB2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCWNhc2UgU05EQ1RMX1NQRElGX0xFVkVMOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZvdXRfbGV2ZWwocywgdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwljYXNlIFNORENUTF9TUERJRl9JTlY6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXNldF9zcGRpZmluX2ludmVyc2UocywgdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwljYXNlIFNORENUTF9TUERJRl9TRUwyOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZpbl9jaGFubmVsMihzLCB2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCWNhc2UgU05EQ1RMX1NQRElGX1ZBTElEOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZpbl92YWxpZChzLCB2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCWNhc2UgU05EQ1RMX1NQRElGT1VUOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZvdXQocywgdmFsID8gcy0+cmF0ZWRhYyA6IDApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCWNhc2UgU05EQ1RMX1NQRElGSU46CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXNldF9zcGRpZmluKHMsIHZhbCA/IHMtPnJhdGVhZGMgOiAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisJcmV0dXJuIG1peGVyX2lvY3RsKHMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBjbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgY2hhciBmbXRtID0gfjAsIGZtdHMgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGNtX3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjbV9zdGF0ZSwgZGV2cyk7CisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcy0+c3RhdHVzICY9IH5ET19CSUdFTkRJQU5fUjsKKwkJZm10bSAmPSB+KChDTV9DRk1UX1NURVJFTyB8IENNX0NGTVRfMTZCSVQpIDw8IENNX0NGTVRfQURDU0hJRlQpOworCQlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQkJZm10cyB8PSBDTV9DRk1UXzE2QklUIDw8IENNX0NGTVRfQURDU0hJRlQ7CisJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSAwOworCQlzLT5kbWFfYWRjLmVuYWJsZWQgPSAxOworCQlzZXRfYWRjX3JhdGUocywgODAwMCk7CisJCS8vIHNwZGlmLWluIGlzIHR1cm5uZWQgb2ZmIGJ5IGRlZmF1bHQKKwkJc2V0X3NwZGlmaW4ocywgMCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzLT5zdGF0dXMgJj0gfkRPX0JJR0VORElBTl9XOworCQlmbXRtICY9IH4oKENNX0NGTVRfU1RFUkVPIHwgQ01fQ0ZNVF8xNkJJVCkgPDwgQ01fQ0ZNVF9EQUNTSElGVCk7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlmbXRzIHw9IENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9EQUNTSElGVDsKKwkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IDA7CisJCXMtPmRtYV9kYWMuZW5hYmxlZCA9IDE7CisJCXNldF9kYWNfcmF0ZShzLCA4MDAwKTsKKwkJLy8gY2xlYXIgcHJldmlvdXMgbXVsdGljaGFubmVsLCBzcGRpZiwgYWMzIHN0YXRlCisJCXNldF9zcGRpZm91dChzLCAwKTsKKwkJc2V0X2FjMyhzLCAwKTsKKwkJc2V0X2RhY19jaGFubmVscyhzLCAxKTsKKwl9CisJc2V0X2ZtdChzLCBmbXRtLCBmbXRzKTsKKwlzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgY21fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgY21fc3RhdGUgKnMgPSAoc3RydWN0IGNtX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWRyYWluX2RhYyhzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJZG93bigmcy0+b3Blbl9zZW0pOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdG9wX2RhYyhzKTsKKworCQlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYyk7CisJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKKworCQlpZiAocy0+c3RhdHVzICYgRE9fTVVMVElfQ0gpCisJCQlzZXRfZGFjX2NoYW5uZWxzKHMsIDEpOworCQlpZiAocy0+c3RhdHVzICYgRE9fQUMzKQorCQkJc2V0X2FjMyhzLCAwKTsKKwkJaWYgKHMtPnN0YXR1cyAmIERPX1NQRElGX09VVCkKKwkJCXNldF9zcGRpZm91dChzLCAwKTsKKwkJLyogZW5hYmxlIFNQRElGIGxvb3AgKi8KKwkJc2V0X3NwZGlmX2xvb3Aocywgc3BkaWZfbG9vcCk7CisJCXMtPnN0YXR1cyAmPSB+RE9fQklHRU5ESUFOX1c7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0b3BfYWRjKHMpOworCQlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYyk7CisJCXMtPnN0YXR1cyAmPSB+RE9fQklHRU5ESUFOX1I7CisJfQorCXMtPm9wZW5fbW9kZSAmPSB+KGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNtX2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJID0gbm9fbGxzZWVrLAorCS5yZWFkCSA9IGNtX3JlYWQsCisJLndyaXRlCSA9IGNtX3dyaXRlLAorCS5wb2xsCSA9IGNtX3BvbGwsCisJLmlvY3RsCSA9IGNtX2lvY3RsLAorCS5tbWFwCSA9IGNtX21tYXAsCisJLm9wZW4JID0gY21fb3BlbiwKKwkucmVsZWFzZSA9IGNtX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpbml0dm9sIHsKKwlpbnQgbWl4Y2g7CisJaW50IHZvbDsKK30gaW5pdHZvbFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBTT1VORF9NSVhFUl9XUklURV9DRCwgMHg0ZjRmIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FLCAweDRmNGYgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX01JQywgMHg0ZjRmIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9TWU5USCwgMHg0ZjRmIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsIDB4NGY0ZiB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfUENNLCAweDRmNGYgfQorfTsKKworLyogY2hlY2sgY2hpcCB2ZXJzaW9uIGFuZCBjYXBhYmlsaXR5ICovCitzdGF0aWMgaW50IHF1ZXJ5X2NoaXAoc3RydWN0IGNtX3N0YXRlICpzKQoreworCWludCBDaGlwVmVyc2lvbiA9IC0xOworCXVuc2lnbmVkIGNoYXIgUmVnVmFsdWU7CisKKwkvLyBjaGVjayByZWcgMENoLCBiaXQgMjQtMzEKKwlSZWdWYWx1ZSA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfSU5UX0hMRENMUiArIDMpOworCWlmIChSZWdWYWx1ZSA9PSAwKSB7CisJICAgIC8vIGNoZWNrIHJlZyAwOGgsIGJpdCAyNC0yOAorCSAgICBSZWdWYWx1ZSA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQ0hGT1JNQVQgKyAzKTsKKwkgICAgUmVnVmFsdWUgJj0gMHgxZjsKKwkgICAgaWYgKFJlZ1ZhbHVlID09IDApIHsKKwkJQ2hpcFZlcnNpb24gPSAzMzsKKwkJcy0+bWF4X2NoYW5uZWxzID0gNDsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fQUMzX1NXOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9EVUFMX0RBQzsKKwkgICAgfSBlbHNlIHsKKwkJQ2hpcFZlcnNpb24gPSAzNzsKKwkJcy0+bWF4X2NoYW5uZWxzID0gNDsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fQUMzX0hXOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9EVUFMX0RBQzsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIC8vIGNoZWNrIHJlZyAwQ2gsIGJpdCAyNgorCSAgICBpZiAoUmVnVmFsdWUgJiAoMSA8PCAoMjYtMjQpKSkgeworCQlDaGlwVmVyc2lvbiA9IDM5OworCSAgICAJaWYgKFJlZ1ZhbHVlICYgKDEgPDwgKDI0LTI0KSkpCisJCSAgICBzLT5tYXhfY2hhbm5lbHMgPSA2OworCSAgICAJZWxzZQorCQkgICAgcy0+bWF4X2NoYW5uZWxzID0gNDsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fQUMzX0hXOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9EVUFMX0RBQzsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fTVVMVElfQ0hfSFc7CisJCXMtPmNhcGFiaWxpdHkgfD0gQ0FOX0xJTkVfQVNfQkFTUzsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fTUlDX0FTX0JBU1M7CisJICAgIH0gZWxzZSB7CisJCUNoaXBWZXJzaW9uID0gNTU7IC8vIDQgb3IgNiBjaGFubmVscworCQlzLT5tYXhfY2hhbm5lbHMgPSA2OworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9BQzNfSFc7CisJCXMtPmNhcGFiaWxpdHkgfD0gQ0FOX0RVQUxfREFDOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9NVUxUSV9DSF9IVzsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fTElORV9BU19CQVNTOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9NSUNfQVNfQkFTUzsKKwkgICAgfQorCX0KKwlzLT5jYXBhYmlsaXR5IHw9IENBTl9MSU5FX0FTX1JFQVI7CisJcmV0dXJuIENoaXBWZXJzaW9uOworfQorCisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX0pPWVNUSUNLCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjbV9jcmVhdGVfZ2FtZXBvcnQoc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgaW9fcG9ydCkKK3sKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCBDTV9FWFRFTlRfR0FNRSwgImNtcGNpIEdBTUUiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNtcGNpOiBnYW1lcG9ydCBpbyBwb3J0cyAweCUjeCBpbiB1c2VcbiIsIGlvX3BvcnQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICghKHMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY21wY2k6IGNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGlvX3BvcnQsIENNX0VYVEVOVF9HQU1FKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJDLU1lZGlhIEdQIik7CisJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShzLT5kZXYpKTsKKwlncC0+ZGV2LnBhcmVudCA9ICZzLT5kZXYtPmRldjsKKwlncC0+aW8gPSBpb19wb3J0OworCisJLyogZW5hYmxlIGpveXN0aWNrICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+MCwgMHgwMik7CisKKwlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY21fZnJlZV9nYW1lcG9ydChzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJaWYgKHMtPmdhbWVwb3J0KSB7CisJCWludCBncGlvID0gcy0+Z2FtZXBvcnQtPmlvOworCisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7CisJCXMtPmdhbWVwb3J0ID0gTlVMTDsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+MHgwMiwgMCk7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIENNX0VYVEVOVF9HQU1FKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgY21fY3JlYXRlX2dhbWVwb3J0KHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IGlvX3BvcnQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbV9mcmVlX2dhbWVwb3J0KHN0cnVjdCBjbV9zdGF0ZSAqcykgeyB9CisjZW5kaWYKKworI2RlZmluZQllY2hvX29wdGlvbih4KVwKK2lmICh4KSBzdHJjYXQob3B0aW9ucywgIiIgI3ggIiAiKQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjbV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCit7CisJc3RydWN0IGNtX3N0YXRlICpzOworCW1tX3NlZ21lbnRfdCBmczsKKwlpbnQgaSwgdmFsLCByZXQ7CisJdW5zaWduZWQgY2hhciByZWdfbWFzazsKKwlpbnQgdGltZW91dDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0CWRldmljZWlkOworCQljaGFyCQkqZGV2aWNlbmFtZTsKKwl9IGRldmljZXRhYmxlW10gPSB7CisJCXsgUENJX0RFVklDRV9JRF9DTUVESUFfQ004MzM4QSwgIkNNODMzOEEiIH0sCisJCXsgUENJX0RFVklDRV9JRF9DTUVESUFfQ004MzM4QiwgIkNNODMzOEIiIH0sCisJCXsgUENJX0RFVklDRV9JRF9DTUVESUFfQ004NzM4LCAgIkNNODczOCIgfSwKKwkJeyBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzhCLCAiQ004NzM4QiIgfSwKKwl9OworCWNoYXIJKmRldmljZW5hbWUgPSAidW5rbm93biI7CisJY2hhcglvcHRpb25zWzI1Nl07CisKKwlpZiAoKHJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpKQorCQlyZXR1cm4gcmV0OworCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDApICYgSU9SRVNPVVJDRV9JTykpCisJCXJldHVybiAtRU5PREVWOworCWlmIChwY2lkZXYtPmlycSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpID0gcGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIDB4ZmZmZmZmZmYpOworCWlmIChpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNtcGNpOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCXJldHVybiBpOworCX0KKwlzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY21wY2k6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogc2VhcmNoIGRldmljZSBuYW1lICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihkZXZpY2V0YWJsZSkgLyBzaXplb2YoZGV2aWNldGFibGVbMF0pOyBpKyspIHsKKwkJaWYgKGRldmljZXRhYmxlW2ldLmRldmljZWlkID09IHBjaWRldi0+ZGV2aWNlKSB7CisJCQlkZXZpY2VuYW1lID0gZGV2aWNldGFibGVbaV0uZGV2aWNlbmFtZTsKKwkJCWJyZWFrOworCQl9CisJfQorCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IGNtX3N0YXRlKSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5tYWdpYyA9IENNX01BR0lDOworCXMtPmRldiA9IHBjaWRldjsKKwlzLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKKwlzLT5pb3N5bnRoID0gZm1pbzsKKwlzLT5pb21pZGkgPSBtcHVpbzsKKyNpZmRlZiBDT05GSUdfU09VTkRfQ01QQ0lfTUlESQorCXMtPm1pZGlfZGV2YyA9IDA7CisjZW5kaWYKKwlzLT5zdGF0dXMgPSAwOworCWlmIChzLT5pb2Jhc2UgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcy0+aXJxID0gcGNpZGV2LT5pcnE7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvYmFzZSwgQ01fRVhURU5UX0NPREVDLCAiY21wY2kiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNtcGNpOiBpbyBwb3J0cyAlI3gtJSN4IGluIHVzZVxuIiwgcy0+aW9iYXNlLCBzLT5pb2Jhc2UrQ01fRVhURU5UX0NPREVDLTEpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3JlZ2lvbjU7CisJfQorCS8qIGR1bXAgcGFyYW1ldGVycyAqLworCXN0cmNweShvcHRpb25zLCAiY21wY2k6ICIpOworCWVjaG9fb3B0aW9uKGpveXN0aWNrKTsKKwllY2hvX29wdGlvbihzcGRpZl9pbnZlcnNlKTsKKwllY2hvX29wdGlvbihzcGRpZl9sb29wKTsKKwllY2hvX29wdGlvbihzcGRpZl9vdXQpOworCWVjaG9fb3B0aW9uKHVzZV9saW5lX2FzX3JlYXIpOworCWVjaG9fb3B0aW9uKHVzZV9saW5lX2FzX2Jhc3MpOworCWVjaG9fb3B0aW9uKHVzZV9taWNfYXNfYmFzcyk7CisJZWNob19vcHRpb24obWljX2Jvb3N0KTsKKwllY2hvX29wdGlvbihod19jb3B5KTsKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgb3B0aW9ucyk7CisKKwkvKiBpbml0aWFsaXplIGNvZGVjIHJlZ2lzdGVycyAqLworCW91dGIoMCwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0lOVF9ITERDTFIgKyAyKTsgIC8qIGRpc2FibGUgaW50cyAqLworCW91dGIoMCwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwICsgMik7IC8qIGRpc2FibGUgY2hhbm5lbHMgKi8KKwkvKiByZXNldCBtaXhlciAqLworCXdybWl4ZXIocywgRFNQX01JWF9EQVRBUkVTRVRJRFgsIDApOworCisJLyogcmVxdWVzdCBpcnEgKi8KKwlpZiAoKHJldCA9IHJlcXVlc3RfaXJxKHMtPmlycSwgY21faW50ZXJydXB0LCBTQV9TSElSUSwgImNtcGNpIiwgcykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY21wY2k6IGlycSAldSBpbiB1c2VcbiIsIHMtPmlycSk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiY21wY2k6IGZvdW5kICVzIGFkYXB0ZXIgYXQgaW8gJSN4IGlycSAldVxuIiwKKwkgICAgICAgZGV2aWNlbmFtZSwgcy0+aW9iYXNlLCBzLT5pcnEpOworCS8qIHJlZ2lzdGVyIGRldmljZXMgKi8KKwlpZiAoKHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmY21fYXVkaW9fZm9wcywgLTEpKSA8IDApIHsKKwkJcmV0ID0gcy0+ZGV2X2F1ZGlvOworCQlnb3RvIGVycl9kZXYxOworCX0KKwlpZiAoKHMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZjbV9taXhlcl9mb3BzLCAtMSkpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfbWl4ZXI7CisJCWdvdG8gZXJyX2RldjI7CisJfQorCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CS8qIGVuYWJsZSBidXMgbWFzdGVyaW5nICovCisJLyogaW5pdGlhbGl6ZSB0aGUgY2hpcHMgKi8KKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCS8qIHNldCBtaXhlciBvdXRwdXQgKi8KKwlmcm9iaW5kaXIocywgRFNQX01JWF9PVVRNSVhJRFgsIDB4MWYsIDB4MWYpOworCS8qIHNldCBtaXhlciBpbnB1dCAqLworCXZhbCA9IFNPVU5EX01BU0tfTElORXxTT1VORF9NQVNLX1NZTlRIfFNPVU5EX01BU0tfQ0R8U09VTkRfTUFTS19NSUM7CisJbWl4ZXJfaW9jdGwocywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGluaXR2b2wpL3NpemVvZihpbml0dm9sWzBdKTsgaSsrKSB7CisJCXZhbCA9IGluaXR2b2xbaV0udm9sOworCQltaXhlcl9pb2N0bChzLCBpbml0dm9sW2ldLm1peGNoLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwl9CisJc2V0X2ZzKGZzKTsKKwkvKiB1c2UgY2hhbm5lbCAxIGZvciBwbGF5YmFjaywgY2hhbm5lbCAwIGZvciByZWNvcmQgKi8KKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAsIH5DSEFEQzEsIENIQURDMCk7CisJLyogdHVybiBvZmYgVk1JQzMgLSBtaWMgYm9vc3QgKi8KKwlpZiAobWljX2Jvb3N0KQorCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyLCB+MSwgMCk7CisJZWxzZQorCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyLCB+MCwgMSk7CisJcy0+ZGV2aWNlaWQgPSBwY2lkZXYtPmRldmljZTsKKworCWlmIChwY2lkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzgKKwkgfHwgcGNpZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DTUVESUFfQ004NzM4QikgeworCisJCS8qIGNoaXAgdmVyc2lvbiBhbmQgaHcgY2FwYWJpbGl0eSBjaGVjayAqLworCQlzLT5jaGlwX3ZlcnNpb24gPSBxdWVyeV9jaGlwKHMpOworCQlwcmludGsoS0VSTl9JTkZPICJjbXBjaTogY2hpcCB2ZXJzaW9uID0gMCVkXG4iLCBzLT5jaGlwX3ZlcnNpb24pOworCisJCS8qIHNldCBTUERJRi1pbiBpbnZlcnNlIGJlZm9yZSBlbmFibGUgU1BESUYgbG9vcCAqLworCQlzZXRfc3BkaWZpbl9pbnZlcnNlKHMsIHNwZGlmX2ludmVyc2UpOworCisJCS8qIHVzZSBTUERJRiBpbiAjMSAqLworCQlzZXRfc3BkaWZpbl9jaGFubmVsMihzLCAwKTsKKwl9IGVsc2UgeworCQlzLT5jaGlwX3ZlcnNpb24gPSAwOworCQkvKiA4MzM4IHdpbGwgZmFsbCBoZXJlICovCisJCXMtPm1heF9jaGFubmVscyA9IDQ7CisJCXMtPmNhcGFiaWxpdHkgfD0gQ0FOX0RVQUxfREFDOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9MSU5FX0FTX1JFQVI7CisJfQorCS8qIGVuYWJsZSBTUERJRiBsb29wICovCisJc2V0X3NwZGlmX2xvb3Aocywgc3BkaWZfbG9vcCk7CisKKwkvLyBlbmFibGUgNCBzcGVha2VyIG1vZGUgKGFuYWxvZyBkdXBsaWNhdGUpCisJc2V0X2h3X2NvcHkocywgaHdfY29weSk7CisKKwlyZWdfbWFzayA9IDA7CisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX0ZNCisJLyogZGlzYWJsZSBGTSAqLworCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwgKyAyLCB+OCwgMCk7CisJaWYgKHMtPmlvc3ludGgpIHsKKwkgICAgLyogZG9uJ3QgZW5hYmxlIE9QTDMgaWYgdGhlcmUgaXMgb25lICovCisJICAgIGlmIChvcGwzX2RldGVjdChzLT5pb3N5bnRoLCBOVUxMKSkgeworCSAgICAJcy0+aW9zeW50aCA9IDA7CisJICAgIH0gZWxzZSB7CisJCS8qIHNldCBJTyBiYXNlZCBhdCAweDM4OCAqLworCQlzd2l0Y2ggKHMtPmlvc3ludGgpIHsKKwkJICAgIGNhc2UgMHgzODg6CisJCQlyZWdfbWFzayA9IDA7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMHgzQzg6CisJCQlyZWdfbWFzayA9IDB4MDE7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMHgzRTA6CisJCQlyZWdfbWFzayA9IDB4MDI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMHgzRTg6CisJCQlyZWdfbWFzayA9IDB4MDM7CisJCQlicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCQlzLT5pb3N5bnRoID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9MRUdBQ1lfQ1RSTCArIDMsIH4weDAzLCByZWdfbWFzayk7CisJCS8qIGVuYWJsZSBGTSAqLworCQlpZiAocy0+aW9zeW50aCkgeworCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCArIDIsIH4wLCA4KTsKKwkJCWlmIChvcGwzX2RldGVjdChzLT5pb3N5bnRoLCBOVUxMKSkKKwkJCQlyZXQgPSBvcGwzX2luaXQocy0+aW9zeW50aCwgTlVMTCwgVEhJU19NT0RVTEUpOworCQkJZWxzZSB7CisJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCArIDIsIH44LCAwKTsKKwkJCQlzLT5pb3N5bnRoID0gMDsKKwkJCX0KKwkJfQorCSAgICB9CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX01JREkKKwlzd2l0Y2ggKHMtPmlvbWlkaSkgeworCSAgICBjYXNlIDB4MzMwOgorCQlyZWdfbWFzayA9IDA7CisJCWJyZWFrOworCSAgICBjYXNlIDB4MzIwOgorCQlyZWdfbWFzayA9IDB4MjA7CisJCWJyZWFrOworCSAgICBjYXNlIDB4MzEwOgorCQlyZWdfbWFzayA9IDB4NDA7CisJCWJyZWFrOworCSAgICBjYXNlIDB4MzAwOgorCQlyZWdfbWFzayA9IDB4NjA7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlzLT5pb21pZGkgPSAwOworCQlnb3RvIHNraXBfbXB1OworCX0KKwlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKHMtPmlvbWlkaSwgMiwgIm1wdTQwMSIpOworCWlmICghcG9ydHMpCisJCWdvdG8gc2tpcF9tcHU7CisJLyogZGlzYWJsZSBNUFUtNDAxICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+MHgwNCwgMCk7CisJcy0+bXB1X2RhdGEubmFtZSA9ICJjbXBjaSBtcHUiOworCXMtPm1wdV9kYXRhLmlvX2Jhc2UgPSBzLT5pb21pZGk7CisJcy0+bXB1X2RhdGEuaXJxID0gLXMtPmlycTsJLy8gdGVsbCBtcHU0MDEgdG8gc2hhcmUgaXJxCisJaWYgKHByb2JlX21wdTQwMSgmcy0+bXB1X2RhdGEsIHBvcnRzKSkgeworCQlyZWxlYXNlX3JlZ2lvbihzLT5pb21pZGksIDIpOworCQlzLT5pb21pZGkgPSAwOworCQlnb3RvIHNraXBfbXB1OworCX0KKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTEVHQUNZX0NUUkwgKyAzLCB+MHg2MCwgcmVnX21hc2spOworCS8qIGVuYWJsZSBNUFUtNDAxICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+MCwgMHgwNCk7CisJLyogY2xlYXIgYWxsIHByZXZpb3VzbHkgcmVjZWl2ZWQgaW50ZXJydXB0ICovCisJZm9yICh0aW1lb3V0ID0gOTAwMDAwOyB0aW1lb3V0ID4gMDsgdGltZW91dC0tKSB7CisJCWlmICgoaW5iKHMtPmlvbWlkaSArIDEpICYmIDB4ODApID09IDApCisJCQlpbmIocy0+aW9taWRpKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWlmICghcHJvYmVfbXB1NDAxKCZzLT5tcHVfZGF0YSwgcG9ydHMpKSB7CisJCXJlbGVhc2VfcmVnaW9uKHMtPmlvbWlkaSwgMik7CisJCXMtPmlvbWlkaSA9IDA7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMSwgfjAsIDB4MDQpOworCX0gZWxzZSB7CisJCWF0dGFjaF9tcHU0MDEoJnMtPm1wdV9kYXRhLCBUSElTX01PRFVMRSk7CisJCXMtPm1pZGlfZGV2YyA9IHMtPm1wdV9kYXRhLnNsb3RzWzFdOworCX0KK3NraXBfbXB1OgorI2VuZGlmCisJLyogZGlzYWJsZSBqb3lzdGljayBwb3J0ICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+MHgwMiwgMCk7CisJaWYgKGpveXN0aWNrKQorCQljbV9jcmVhdGVfZ2FtZXBvcnQocywgMHgyMDApOworCisJLyogc3RvcmUgaXQgaW4gdGhlIGRyaXZlciBmaWVsZCAqLworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHMpOworCS8qIHB1dCBpdCBpbnRvIGRyaXZlciBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmcy0+ZGV2cywgJmRldnMpOworCS8qIGluY3JlbWVudCBkZXZpbmRleCAqLworCWlmIChkZXZpbmRleCA8IE5SX0RFVklDRS0xKQorCQlkZXZpbmRleCsrOworCXJldHVybiAwOworCitlcnJfZGV2MjoKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworZXJyX2RldjE6CisJcHJpbnRrKEtFUk5fRVJSICJjbXBjaTogY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworZXJyX2lycToKKwlyZWxlYXNlX3JlZ2lvbihzLT5pb2Jhc2UsIENNX0VYVEVOVF9DT0RFQyk7CitlcnJfcmVnaW9uNToKKwlrZnJlZShzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTU9EVUxFX0FVVEhPUigiQ2hlbkxpIFRpZW4sIGNsdGllbkBjbWVkaWEuY29tLnR3Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNNOHgzOCBBdWRpbyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNtX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBjbV9zdGF0ZSAqcyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFzKQorCQlyZXR1cm47CisKKwljbV9mcmVlX2dhbWVwb3J0KHMpOworCisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX0ZNCisJaWYgKHMtPmlvc3ludGgpIHsKKwkJLyogZGlzYWJsZSBGTSAqLworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlTQ19DVFJMICsgMiwgfjgsIDApOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT1VORF9DTVBDSV9NSURJCisJaWYgKHMtPmlvbWlkaSkgeworCQl1bmxvYWRfbXB1NDAxKCZzLT5tcHVfZGF0YSk7CisJCS8qIGRpc2FibGUgTVBVLTQwMSAqLworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEsIH4weDA0LCAwKTsKKwl9CisjZW5kaWYKKwlzZXRfc3BkaWZfbG9vcChzLCAwKTsKKwlsaXN0X2RlbCgmcy0+ZGV2cyk7CisJb3V0YigwLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfSU5UX0hMRENMUiArIDIpOyAgLyogZGlzYWJsZSBpbnRzICovCisJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJb3V0YigwLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAgKyAyKTsgLyogZGlzYWJsZSBjaGFubmVscyAqLworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisKKwkvKiByZXNldCBtaXhlciAqLworCXdybWl4ZXIocywgRFNQX01JWF9EQVRBUkVTRVRJRFgsIDApOworCisJcmVsZWFzZV9yZWdpb24ocy0+aW9iYXNlLCBDTV9FWFRFTlRfQ09ERUMpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5kZXZfbWl4ZXIpOworCWtmcmVlKHMpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZFTkRPUl9JRF9DTUVESUEsIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODczOEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ01FRElBLCBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKyAJeyBQQ0lfVkVORE9SX0lEX0NNRURJQSwgUENJX0RFVklDRV9JRF9DTUVESUFfQ004MzM4QSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DTUVESUEsIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODMzOEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjbV9kcml2ZXIgPSB7CisgICAgICAgLm5hbWUJID0gImNtcGNpIiwKKyAgICAgICAuaWRfdGFibGUgPSBpZF90YWJsZSwKKyAgICAgICAucHJvYmUJID0gY21fcHJvYmUsCisgICAgICAgLnJlbW92ZQkgPSBfX2RldmV4aXRfcChjbV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2NtcGNpKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiY21wY2k6IHZlcnNpb24gJFJldmlzaW9uOiA2LjgyICQgdGltZSAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZjbV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9jbXBjaSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImNtcGNpOiB1bmxvYWRpbmdcbiIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY21fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9jbXBjaSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2NtcGNpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jb3Byb2MuaCBiL3NvdW5kL29zcy9jb3Byb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzA2MzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NvcHJvYy5oCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdmFyaW91cyBvbiBib2FyZCBwcm9jZXNzb3JzIG9uIHRoZSBzb3VuZCBjYXJkcy4gRm9yCisgKiBleGFtcGxlIERTUCBwcm9jZXNzb3JzLgorICovCisKKy8qCisgKiBDb3Byb2Nlc3NvciBhY2Nlc3MgdHlwZXMgCisgKi8KKyNkZWZpbmUgQ09QUl9DVVNUT00JCTB4MDAwMQkvKiBDdXN0b20gYXBwbGljYXRpb25zICovCisjZGVmaW5lIENPUFJfTUlESQkJMHgwMDAyCS8qIE1JREkgKE1QVS00MDEpIGVtdWxhdGlvbiAqLworI2RlZmluZSBDT1BSX1BDTQkJMHgwMDA0CS8qIERpZ2l0aXplZCB2b2ljZSBhcHBsaWNhdGlvbnMgKi8KKyNkZWZpbmUgQ09QUl9TWU5USAkJMHgwMDA4CS8qIE11c2ljIHN5bnRoZXNpcyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDIzMi5jIGIvc291bmQvb3NzL2NzNDIzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzMwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvY3M0MjMyLmMKQEAgLTAsMCArMSw1MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICoJY3M0MjMyLmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgQ3J5c3RhbCBDUzQyMzIgYmFzZWQgY2FyZHMuIFRoZSBDUzQyMzIgaXMKKyAqIGEgUG5QIGNvbXBhdGlibGUgY2hpcCB3aGljaCBjb250YWlucyBhIENTNDIzMUEgY29kZWMsIFNCIGVtdWxhdGlvbiwKKyAqIGEgTVBVNDAxIGNvbXBhdGlibGUgTUlESSBwb3J0LCBqb3lzdGljayBhbmQgc3ludGhlc2l6ZXIgYW5kIElERSBDRC1ST00gCisgKiBpbnRlcmZhY2VzLiBUaGlzIGlzIGp1c3QgYSB0ZW1wb3JhcnkgZHJpdmVyIHVudGlsIGZ1bGwgUG5QIHN1cHBvcnQKKyAqIGdldHMgaW1wbGVtZW50ZWQuIEp1c3QgdGhlIFdTUyBjb2RlYywgRk0gc3ludGggYW5kIHRoZSBNSURJIHBvcnRzIGFyZQorICogc3VwcG9ydGVkLiBPdGhlciBpbnRlcmZhY2VzIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQuCisgKgorICogaWZkZWYgLi4uV0FWRUZST05ULi4uCisgKiAKKyAqICAgU3VwcG9ydCBpcyBwcm92aWRlZCBmb3IgaW5pdGlhbGl6aW5nIHRoZSBXYXZlRnJvbnQgc3ludGgKKyAqICAgaW50ZXJmYWNlIGFzIHdlbGwsIHdoaWNoIGlzIGxvZ2ljYWwgZGV2aWNlICM0LiBOb3RlIHRoYXQgaWYKKyAqICAgeW91IGhhdmUgYSBUcm9wZXorIGNhcmQsIHlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIHNldHVwCisgKiAgIHRoZSBDUzQyMzItc3VwcG9ydGVkIE1JREkgaW50ZXJmYWNlLCBzaW5jZSBpdCBjb3JyZXNwb25kcyB0bworICogICB0aGUgaW50ZXJuYWwgMjYtcGluIGhlYWRlciB0aGF0J3MgaGFyZCB0byBhY2Nlc3MuIFVzaW5nIHRoaXMKKyAqICAgcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBJUlEsIGEgcmVzb3VyY2Ugbm9uZSB0b28gcGxlbnRpZnVsIGluCisgKiAgIHRoaXMgZW52aXJvbm1lbnQuIEp1c3QgZG9uJ3Qgc2V0IG1vZHVsZSBwYXJhbWV0ZXJzIG1wdWlvIGFuZAorICogICBtcHVpcnEsIGFuZCB0aGUgTUlESSBwb3J0IHdpbGwgYmUgbGVmdCB1bmluaXRpYWxpemVkLiBZb3UgY2FuCisgKiAgIHN0aWxsIHVzZSB0aGUgSUNTMjExNSBob3N0ZWQgTUlESSBpbnRlcmZhY2Ugd2hpY2ggY29ycmVzcG9uZHMKKyAqICAgdG8gdGhlIDktcGluIEQgY29ubmVjdG9yIG9uIHRoZSBiYWNrIG9mIHRoZSBjYXJkLgorICoKKyAqIGVuZGlmICAuLi5XQVZFRlJPTlQuLi4KKyAqCisgKiBTdXBwb3J0ZWQgY2hpcHMgYXJlOgorICogICAgICBDUzQyMzIKKyAqICAgICAgQ1M0MjM2CisgKiAgICAgIENTNDIzNkIKKyAqCisgKiBOb3RlOiBZb3Ugd2lsbCBuZWVkIGEgUG5QIGNvbmZpZyBzZXR1cCB0byBpbml0aWFsaXNlIHNvbWUgQ1M0MjMyIGJvYXJkcworICogYW55d2F5LgorICoKKyAqIENoYW5nZXMKKyAqICAgICAgSm9obiBSb29kICAgICAgICAgICAgICAgQWRkZWQgQm9zZSBTb3VuZCBTeXN0ZW0gU3VwcG9ydC4KKyAqICAgICAgVG9zaGlvIFNwb29yCisgKglBbGFuIENveAkJTW9kdWxhcmlzYXRpb24sIEJhc2ljIGNsZWFudXBzLgorICogICAgICBQYXVsIEJhcnRvbi1EYXZpcwlTZXBhcmF0ZWQgTVBVIGNvbmZpZ3VyYXRpb24sIGFkZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyb3BleisgKFdhdmVGcm9udCkgc3VwcG9ydAorICoJQ2hyaXN0b3BoIEhlbGx3aWcJQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdCwKKyAqIAkJCQkJc2ltcGxlIGNsZWFudXBzCisgKiAJQXJuYWxkbyBDLiBkZSBNZWxvCWdvdCByaWQgb2YgYXR0YWNoX3VhcnQ0MDEKKyAqCUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3oKKyAqCQkJCUFkZGVkIHNvbWUgX19pbml0L19faW5pdGRhdGEvX19leGl0CisgKglNYXJjdXMgTWVpc3NuZXIJCUFkZGVkIElTQSBQblAgc3VwcG9ydC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcG5wLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJhZDE4NDguaCIKKyNpbmNsdWRlICJtcHU0MDEuaCIKKworI2RlZmluZSBLRVlfUE9SVAkweDI3OQkvKiBTYW1lIGFzIExQVDEgc3RhdHVzIHBvcnQgKi8KKyNkZWZpbmUgQ1NOX05VTQkJMHg5OQkvKiBKdXN0IGEgcmFuZG9tIG51bWJlciAqLworI2RlZmluZSBJTkRFWF9BRERSRVNTICAgMHgwMCAgICAvKiAoUjApIEluZGV4IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5ERVhfREFUQSAgICAgIDB4MDEgICAgLyogKFIxKSBJbmRleGVkIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElOX0NPTlRST0wgICAgIDB4MGEgICAgLyogKEkxMCkgUGluIENvbnRyb2wgKi8KKyNkZWZpbmUgRU5BQkxFX1BJTlMgICAgIDB4YzAgICAgLyogWENUUkwwL1hDVFJMMSBlbmFibGUgKi8KKworc3RhdGljIHZvaWQgQ1NfT1VUKHVuc2lnbmVkIGNoYXIgYSkKK3sKKwlvdXRiKGEsIEtFWV9QT1JUKTsKK30KKworI2RlZmluZSBDU19PVVQyKGEsIGIpCQl7Q1NfT1VUKGEpO0NTX09VVChiKTt9CisjZGVmaW5lIENTX09VVDMoYSwgYiwgYykJe0NTX09VVChhKTtDU19PVVQoYik7Q1NfT1VUKGMpO30KKworc3RhdGljIGludCBfX2luaXRkYXRhIGJzcyAgICAgICA9IDA7CitzdGF0aWMgaW50IG1wdV9iYXNlLCBtcHVfaXJxOworc3RhdGljIGludCBzeW50aF9iYXNlLCBzeW50aF9pcnE7CitzdGF0aWMgaW50IG1wdV9kZXRlY3RlZDsKKworc3RhdGljIGludCBwcm9iZV9jczQyMzJfbXB1KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwkvKgorCSAqCUp1c3Qgd3JpdGUgZG93biB0aGUgY29uZmlnIHZhbHVlcy4KKwkgKi8KKworCW1wdV9iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCW1wdV9pcnEgPSBod19jb25maWctPmlycTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBjcnlzdGFsX2tleVtdID0JLyogQSAzMiBieXRlIG1hZ2ljIGtleSBzZXF1ZW5jZSAqLworeworCTB4OTYsIDB4MzUsIDB4OWEsIDB4Y2QsIDB4ZTYsIDB4ZjMsIDB4NzksIDB4YmMsCisJMHg1ZSwgMHhhZiwgMHg1NywgMHgyYiwgMHgxNSwgMHg4YSwgMHhjNSwgMHhlMiwKKwkweGYxLCAweGY4LCAweDdjLCAweDNlLCAweDlmLCAweDRmLCAweDI3LCAweDEzLAorCTB4MDksIDB4ODQsIDB4NDIsIDB4YTEsIDB4ZDAsIDB4NjgsIDB4MzQsIDB4MWEKK307CisKK3N0YXRpYyB2b2lkIHNsZWVwKHVuc2lnbmVkIGhvd2xvbmcpCit7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChob3dsb25nKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3hjdHJsKGludCBiYXNlaW8pCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgcmVnZDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogU29tZSBJQk0gQXB0aXZhJ3MgaGF2ZSB0aGUgQm9zZSBTb3VuZCBTeXN0ZW0uIEJ5IGRlZmF1bHQKKyAgICAgICAgICogdGhlIEJvc2UgQW1wbGlmaWVyIGlzIGRpc2FibGVkLiBUaGUgYW1wbGlmaWVyIHdpbGwgYmUgCisgICAgICAgICAqIGFjdGl2YXRlZCwgYnkgc2V0dGluZyB0aGUgWENUUkwwIGFuZCBYQ1RSTDEgYml0cy4KKyAgICAgICAgICogVm9sdW1lIG9mIHRoZSBtb25pdG9yIGJvc2Ugc3BlYWtlcnMvd29vZmVyLCBjYW4gdGhlbgorICAgICAgICAgKiBiZSBzZXQgYnkgY2hhbmdpbmcgdGhlIFBDTSB2b2x1bWUuCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICAgICAgICAgIAorICAgICAgICBwcmludGsoImNzNDIzMjogZW5hYmxpbmcgQm9zZSBTb3VuZCBTeXN0ZW0gQW1wbGlmaWVyLlxuIik7CisgICAgICAgIAorICAgICAgICAvKiBTd2l0Y2ggdG8gUGluIENvbnRyb2wgQWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgcmVnZCA9IGluYihiYXNlaW8gKyBJTkRFWF9BRERSRVNTKSAmIDB4ZTA7CisgICAgICAgIG91dGIoKCh1bnNpZ25lZCBjaGFyKSAoUElOX0NPTlRST0wgfCByZWdkKSksIGJhc2VpbyArIElOREVYX0FERFJFU1MgKTsKKyAgICAgICAgCisgICAgICAgIC8qIEFjdGl2YXRlIHRoZSBYQ1RSTDAgYW5kIFhDVFJMMSBQaW5zICovCisgICAgICAgIHJlZ2QgPSBpbmIoYmFzZWlvICsgSU5ERVhfREFUQSk7CisgICAgICAgIG91dGIoKCh1bnNpZ25lZCBjaGFyKSAoRU5BQkxFX1BJTlMgfCByZWdkKSksIGJhc2VpbyArIElOREVYX0RBVEEgKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfY3M0MjMyKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgaW50IGlzYXBucF9jb25maWd1cmVkKQoreworCWludCBpLCBuOworCWludCBiYXNlID0gaHdfY29uZmlnLT5pb19iYXNlLCBpcnEgPSBod19jb25maWctPmlycTsKKwlpbnQgZG1hMSA9IGh3X2NvbmZpZy0+ZG1hLCBkbWEyID0gaHdfY29uZmlnLT5kbWEyOworCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7CisKKwlpZiAoYmFzZSA9PSAtMSB8fCBpcnEgPT0gLTEgfHwgZG1hMSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgImNzNDIzMjogZG1hLCBpcnEgYW5kIGlvIG11c3QgYmUgc2V0LlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogVmVyaWZ5IHRoYXQgdGhlIEkvTyBwb3J0IHJhbmdlIGlzIGZyZWUuCisJICovCisKKwlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGJhc2UsIDQsICJhZDE4NDgiKTsKKwlpZiAoIXBvcnRzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3M0MjMyLmM6IEkvTyBwb3J0IDB4JTAzeCBub3QgZnJlZVxuIiwgYmFzZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoYWQxODQ4X2RldGVjdChwb3J0cywgTlVMTCwgaHdfY29uZmlnLT5vc3ApKSB7CisJCWdvdG8gZ290X2l0OwkvKiBUaGUgY2FyZCBpcyBhbHJlYWR5IGFjdGl2ZSAqLworCX0KKwlpZiAoaXNhcG5wX2NvbmZpZ3VyZWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczQyMzIuYzogSVNBIFBuUCBjb25maWd1cmVkLCBidXQgbm90IGRldGVjdGVkP1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGRvZXNuJ3QgdXNlIHRoZSBQblAgbWV0aG9kIHdoZW4gY29uZmlndXJpbmcKKwkgKiB0aGUgY2FyZCBidXQgYSBzaW1wbGlmaWVkIG1ldGhvZCBkZWZpbmVkIGJ5IENyeXN0YWwuIFRoaXMgbWVhbnMgdGhhdAorCSAqIGp1c3Qgb25lIENTNDIzMiBjb21wYXRpYmxlIGRldmljZSBjYW4gZXhpc3Qgb24gdGhlIHN5c3RlbS4gQWxzbyB0aGlzCisJICogbWV0aG9kIGNvbmZsaWN0cyB3aXRoIHBvc3NpYmxlIFBuUCBzdXBwb3J0IGluIHRoZSBPUy4gRm9yIHRoaXMgcmVhc29uIAorCSAqIGRyaXZlciBpcyBqdXN0IGEgdGVtcG9yYXJ5IGtsdWRnZS4KKwkgKgorCSAqIEFsc28gdGhlIENpcnJ1cy9DcnlzdGFsIG1ldGhvZCBkb2Vzbid0IGFsd2F5cyB3b3JrLiBUcnkgSVNBIFBuUCBmaXJzdCA7KQorCSAqLworCisJLyoKKwkgKiBSZXBlYXQgaW5pdGlhbGl6YXRpb24gZmV3IHRpbWVzIHNpbmNlIGl0IGRvZXNuJ3QgYWx3YXlzIHN1Y2NlZWQgaW4KKwkgKiBmaXJzdCB0aW1lLgorCSAqLworCisJZm9yIChuID0gMDsgbiA8IDQ7IG4rKykKKwl7CQorCQkvKgorCQkgKglXYWtlIHVwIHRoZSBjYXJkIGJ5IHNlbmRpbmcgYSAzMiBieXRlIENyeXN0YWwga2V5IHRvIHRoZSBrZXkgcG9ydC4KKwkJICovCisJCQorCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJCUNTX09VVChjcnlzdGFsX2tleVtpXSk7CisKKwkJc2xlZXAoSFogLyAxMCk7CisKKwkJLyoKKwkJICoJTm93IHNldCB0aGUgQ1NOIChDYXJkIFNlbGVjdCBOdW1iZXIpLgorCQkgKi8KKworCQlDU19PVVQyKDB4MDYsIENTTl9OVU0pOworCisJCS8qCisJCSAqCVRoZW4gc2V0IHNvbWUgY29uZmlnIGJ5dGVzLiBGaXJzdCBsb2dpY2FsIGRldmljZSAwIAorCQkgKi8KKworCQlDU19PVVQyKDB4MTUsIDB4MDApOwkvKiBTZWxlY3QgbG9naWNhbCBkZXZpY2UgMCAoV1NTL1NCL0ZNKSAqLworCQlDU19PVVQzKDB4NDcsIChiYXNlID4+IDgpICYgMHhmZiwgYmFzZSAmIDB4ZmYpOwkvKiBXU1MgYmFzZSAqLworCisJCWlmIChjaGVja19yZWdpb24oMHgzODgsIDQpKQkvKiBOb3QgZnJlZSAqLworCQkJQ1NfT1VUMygweDQ4LCAweDAwLCAweDAwKQkvKiBGTSBiYXNlIG9mZiAqLworCQllbHNlCisJCQlDU19PVVQzKDB4NDgsIDB4MDMsIDB4ODgpOwkvKiBGTSBiYXNlIDB4Mzg4ICovCisKKwkJQ1NfT1VUMygweDQyLCAweDAwLCAweDAwKTsJLyogU0IgYmFzZSBvZmYgKi8KKwkJQ1NfT1VUMigweDIyLCBpcnEpOwkJLyogU0IrV1NTIElSUSAqLworCQlDU19PVVQyKDB4MmEsIGRtYTEpOwkJLyogU0IrV1NTIERNQSAqLworCisJCWlmIChkbWEyICE9IC0xKQorCQkJQ1NfT1VUMigweDI1LCBkbWEyKQkvKiBXU1MgRE1BMiAqLworCQllbHNlCisJCQlDU19PVVQyKDB4MjUsIDQpOwkvKiBObyBXU1MgRE1BMiAqLworCisJCUNTX09VVDIoMHgzMywgMHgwMSk7CS8qIEFjdGl2YXRlIGxvZ2ljYWwgZGV2IDAgKi8KKworCQlzbGVlcChIWiAvIDEwKTsKKworCQkvKgorCQkgKiBJbml0aWFsaXplIGxvZ2ljYWwgZGV2aWNlIDMgKE1QVSkKKwkJICovCisKKwkJaWYgKG1wdV9iYXNlICE9IDAgJiYgbXB1X2lycSAhPSAwKQorCQl7CisJCQlDU19PVVQyKDB4MTUsIDB4MDMpOwkvKiBTZWxlY3QgbG9naWNhbCBkZXZpY2UgMyAoTVBVKSAqLworCQkJQ1NfT1VUMygweDQ3LCAobXB1X2Jhc2UgPj4gOCkgJiAweGZmLCBtcHVfYmFzZSAmIDB4ZmYpOwkvKiBNUFUgYmFzZSAqLworCQkJQ1NfT1VUMigweDIyLCBtcHVfaXJxKTsJLyogTVBVIElSUSAqLworCQkJQ1NfT1VUMigweDMzLCAweDAxKTsJLyogQWN0aXZhdGUgbG9naWNhbCBkZXYgMyAqLworCQl9CisKKwkJaWYoc3ludGhfYmFzZSAhPSAwKQorCQl7CisJCSAgICBDU19PVVQyICgweDE1LCAweDA0KTsJICAgICAgICAvKiBsb2dpY2FsIGRldmljZSA0IChXYXZlRnJvbnQpICovCisJCSAgICBDU19PVVQzICgweDQ3LCAoc3ludGhfYmFzZSA+PiA4KSAmIDB4ZmYsCisJCQkgICAgIHN5bnRoX2Jhc2UgJiAweGZmKTsJLyogYmFzZSAqLworCQkgICAgQ1NfT1VUMiAoMHgyMiwgc3ludGhfaXJxKTsgICAgIAkvKiBJUlEgKi8KKwkJICAgIENTX09VVDIgKDB4MzMsIDB4MDEpOwkgICAgICAgIC8qIEFjdGl2YXRlIGxvZ2ljYWwgZGV2IDQgKi8KKwkJfQorCisJCS8qCisJCSAqIEZpbmFsbHkgYWN0aXZhdGUgdGhlIGNoaXAKKwkJICovCisJCQorCQlDU19PVVQoMHg3OSk7CisKKwkJc2xlZXAoSFogLyA1KTsKKworCQkvKgorCQkgKiBUaGVuIHRyeSB0byBkZXRlY3QgdGhlIGNvZGVjIHBhcnQgb2YgdGhlIGNoaXAKKwkJICovCisKKwkJaWYgKGFkMTg0OF9kZXRlY3QocG9ydHMsIE5VTEwsIGh3X2NvbmZpZy0+b3NwKSkKKwkJCWdvdG8gZ290X2l0OworCQkKKwkJc2xlZXAoSFopOworCX0KK2ZhaWw6CisJcmVsZWFzZV9yZWdpb24oYmFzZSwgNCk7CisJcmV0dXJuIDA7CisKK2dvdF9pdDoKKwlpZiAoZG1hMiA9PSAtMSkKKwkJZG1hMiA9IGRtYTE7CisKKwlod19jb25maWctPnNsb3RzWzBdID0gYWQxODQ4X2luaXQoIkNyeXN0YWwgYXVkaW8gY29udHJvbGxlciIsIHBvcnRzLAorCQkJCQkgIGlycSwKKwkJCQkJICBkbWExLAkJLyogUGxheWJhY2sgRE1BICovCisJCQkJCSAgZG1hMiwJCS8qIENhcHR1cmUgRE1BICovCisJCQkJCSAgMCwKKwkJCQkJICBod19jb25maWctPm9zcCwKKwkJCQkJICBUSElTX01PRFVMRSk7CisKKwlpZiAoaHdfY29uZmlnLT5zbG90c1swXSAhPSAtMSAmJgorCQlhdWRpb19kZXZzW2h3X2NvbmZpZy0+c2xvdHNbMF1dLT5taXhlcl9kZXYhPS0xKQorCXsJCisJCS8qIEFzc3VtZSB0aGUgbWl4ZXIgbWFwIGlzIGFzIHN1Z2dlc3RlZCBpbiB0aGUgQ1M0MjMyIGRhdGFib29rICovCisJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUxLCBTT1VORF9NSVhFUl9MSU5FKTsKKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTIsIFNPVU5EX01JWEVSX0NEKTsKKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX1NZTlRIKTsJCS8qIEZNIHN5bnRoICovCisJfQorCWlmIChtcHVfYmFzZSAhPSAwICYmIG1wdV9pcnEgIT0gMCkKKwl7CisJCXN0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGh3X2NvbmZpZzIgPSB7CisJCQkwCisJCX07CQkvKiBFbnN1cmUgaXQncyBpbml0aWFsaXplZCAqLworCisJCWh3X2NvbmZpZzIuaW9fYmFzZSA9IG1wdV9iYXNlOworCQlod19jb25maWcyLmlycSA9IG1wdV9pcnE7CisJCWh3X2NvbmZpZzIuZG1hID0gLTE7CisJCWh3X2NvbmZpZzIuZG1hMiA9IC0xOworCQlod19jb25maWcyLmFsd2F5c19kZXRlY3QgPSAwOworCQlod19jb25maWcyLm5hbWUgPSBOVUxMOworCQlod19jb25maWcyLmRyaXZlcl91c2VfMSA9IDA7CisJCWh3X2NvbmZpZzIuZHJpdmVyX3VzZV8yID0gMDsKKwkJaHdfY29uZmlnMi5jYXJkX3N1YnR5cGUgPSAwOworCisJCWlmIChwcm9iZV91YXJ0NDAxKCZod19jb25maWcyLCBUSElTX01PRFVMRSkpCisJCXsKKwkJCW1wdV9kZXRlY3RlZCA9IDE7CisJCX0KKwkJZWxzZQorCQl7CisJCQltcHVfYmFzZSA9IG1wdV9pcnEgPSAwOworCQl9CisJCWh3X2NvbmZpZy0+c2xvdHNbMV0gPSBod19jb25maWcyLnNsb3RzWzFdOworCX0KKwkKKwlpZiAoYnNzKQorICAgICAgICAJZW5hYmxlX3hjdHJsKGJhc2UpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB1bmxvYWRfY3M0MjMyKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgYmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZSwgaXJxID0gaHdfY29uZmlnLT5pcnE7CisJaW50IGRtYTEgPSBod19jb25maWctPmRtYSwgZG1hMiA9IGh3X2NvbmZpZy0+ZG1hMjsKKworCWlmIChkbWEyID09IC0xKQorCQlkbWEyID0gZG1hMTsKKworCWFkMTg0OF91bmxvYWQoYmFzZSwKKwkJICAgICAgaXJxLAorCQkgICAgICBkbWExLAkvKiBQbGF5YmFjayBETUEgKi8KKwkJICAgICAgZG1hMiwJLyogQ2FwdHVyZSBETUEgKi8KKwkJICAgICAgMCk7CisKKwlzb3VuZF91bmxvYWRfYXVkaW9kZXYoaHdfY29uZmlnLT5zbG90c1swXSk7CisJaWYgKG1wdV9iYXNlICE9IDAgJiYgbXB1X2lycSAhPSAwICYmIG1wdV9kZXRlY3RlZCkKKwl7CisJCXN0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGh3X2NvbmZpZzIgPQorCQl7CisJCQkwCisJCX07CQkvKiBFbnN1cmUgaXQncyBpbml0aWFsaXplZCAqLworCisJCWh3X2NvbmZpZzIuaW9fYmFzZSA9IG1wdV9iYXNlOworCQlod19jb25maWcyLmlycSA9IG1wdV9pcnE7CisJCWh3X2NvbmZpZzIuZG1hID0gLTE7CisJCWh3X2NvbmZpZzIuZG1hMiA9IC0xOworCQlod19jb25maWcyLmFsd2F5c19kZXRlY3QgPSAwOworCQlod19jb25maWcyLm5hbWUgPSBOVUxMOworCQlod19jb25maWcyLmRyaXZlcl91c2VfMSA9IDA7CisJCWh3X2NvbmZpZzIuZHJpdmVyX3VzZV8yID0gMDsKKwkJaHdfY29uZmlnMi5jYXJkX3N1YnR5cGUgPSAwOworCQlod19jb25maWcyLnNsb3RzWzFdID0gaHdfY29uZmlnLT5zbG90c1sxXTsKKworCQl1bmxvYWRfdWFydDQwMSgmaHdfY29uZmlnMik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7CitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXB1OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8JPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEyCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXB1aW8JPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVpcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzeW50aGlvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgc3ludGhpcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpc2FwbnAJPSAxOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNTNDIzMiBiYXNlZCBzb3VuZGNhcmQgZHJpdmVyIik7IAorTU9EVUxFX0FVVEhPUigiSGFubnUgU2F2b2xhaW5lbiwgUGF1bCBCYXJ0b24tRGF2aXMiKTsgCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sImJhc2UgSS9PIHBvcnQgZm9yIEFEMTg0OCIpOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCJJUlEgZm9yIEFEMTg0OCBjaGlwIik7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsIjggYml0IERNQSBmb3IgQUQxODQ4IGNoaXAiKTsKK21vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEyLCIxNiBiaXQgRE1BIGZvciBBRDE4NDggY2hpcCIpOworbW9kdWxlX3BhcmFtKG1wdWlvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtcHVpbywiTVBVIDQwMSBiYXNlIGFkZHJlc3MiKTsKK21vZHVsZV9wYXJhbShtcHVpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1wdWlycSwiTVBVIDQwMSBJUlEiKTsKK21vZHVsZV9wYXJhbShzeW50aGlvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzeW50aGlvLCJNYXVpIFdhdmVUYWJsZSBiYXNlIEkvTyBwb3J0Iik7Cittb2R1bGVfcGFyYW0oc3ludGhpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHN5bnRoaXJxLCJNYXVpIFdhdmVUYWJsZSBJUlEiKTsKK21vZHVsZV9wYXJhbShpc2FwbnAsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhpc2FwbnAsIkVuYWJsZSBJU0FQblAgcHJvYmluZyAoZGVmYXVsdCAxKSIpOworbW9kdWxlX3BhcmFtKGJzcywgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJzcywiRW5hYmxlIEJvc2UgU291bmQgU3lzdGVtIFN1cHBvcnQgKGRlZmF1bHQgMCkiKTsKKworLyoKKyAqCUluc3RhbGwgYSBDUzQyMzIgYmFzZWQgY2FyZC4gTmVlZCB0byBoYXZlIGFkMTg0OCBhbmQgbXB1NDAxCisgKglsb2FkZWQgcmVhZHkuCisgKi8KKworLyogQWxsIGNzNDIzMiBiYXNlZCBjYXJkcyBoYXZlIHRoZSBtYWluIGFkMTg0OCBjYXJkIGVpdGhlciBhcyBDU0MwMDAwIG9yCisgKiBDU0MwMTAwLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkIGNzNDIzMl9wbnBfdGFibGVbXSA9IHsKKwl7IC5pZCA9ICJDU0MwMTAwIiwgLmRyaXZlcl9kYXRhID0gMCB9LAorCXsgLmlkID0gIkNTQzAwMDAiLCAuZHJpdmVyX2RhdGEgPSAwIH0sCisJLyogR3VpbGxlbW90IFR1cnRsZWJlYWNoIHNvbWV0aGluZyBhcHBlYXJzIHRvIGJlIGNzNDIzMiBjb21wYXRpYmxlCisJICogKHVudGVzdGVkKSAqLworCXsgLmlkID0gIkdJTTAxMDAiLCAuZHJpdmVyX2RhdGEgPSAwIH0sCisJeyAuaWQgPSAiIn0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCBjczQyMzJfcG5wX3RhYmxlKTsKKworc3RhdGljIGludCBjczQyMzJfcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCit7CisJc3RydWN0IGFkZHJlc3NfaW5mbyAqaXNhcG5wY2ZnOworCisJaXNhcG5wY2ZnPShzdHJ1Y3QgYWRkcmVzc19pbmZvKilrbWFsbG9jKHNpemVvZigqaXNhcG5wY2ZnKSxHRlBfS0VSTkVMKTsKKwlpZiAoIWlzYXBucGNmZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpc2FwbnBjZmctPmlycQkJPSBwbnBfaXJxKGRldiwgMCk7CisJaXNhcG5wY2ZnLT5kbWEJCT0gcG5wX2RtYShkZXYsIDApOworCWlzYXBucGNmZy0+ZG1hMgkJPSBwbnBfZG1hKGRldiwgMSk7CisJaXNhcG5wY2ZnLT5pb19iYXNlCT0gcG5wX3BvcnRfc3RhcnQoZGV2LCAwKTsKKwlpZiAocHJvYmVfY3M0MjMyKGlzYXBucGNmZyxUUlVFKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3M0MjMyOiBJU0EgUG5QIGNhcmQgZm91bmQsIGJ1dCBub3QgZGV0ZWN0ZWQ/XG4iKTsKKwkJa2ZyZWUoaXNhcG5wY2ZnKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXBucF9zZXRfZHJ2ZGF0YShkZXYsaXNhcG5wY2ZnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNzNDIzMl9wbnBfcmVtb3ZlKHN0cnVjdCBwbnBfZGV2ICpkZXYpCit7CisJc3RydWN0IGFkZHJlc3NfaW5mbyAqY2ZnID0gcG5wX2dldF9kcnZkYXRhKGRldik7CisJaWYgKGNmZykgeworCQl1bmxvYWRfY3M0MjMyKGNmZyk7CisJCWtmcmVlKGNmZyk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgY3M0MjMyX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiY3M0MjMyIiwKKwkuaWRfdGFibGUJPSBjczQyMzJfcG5wX3RhYmxlLAorCS5wcm9iZQkJPSBjczQyMzJfcG5wX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoY3M0MjMyX3BucF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9jczQyMzIodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU09VTkRfV0FWRUZST05UX01PRFVMRQorCWlmKHN5bnRoaW8gPT0gLTEpCisJCXByaW50ayhLRVJOX0lORk8gImNzNDIzMjogc2V0IHN5bnRoaW8gYW5kIHN5bnRoaXJxIHRvIHVzZSB0aGUgd2F2ZWZyb250IGZhY2lsaXRpZXMuXG4iKTsKKwllbHNlIHsKKwkJc3ludGhfYmFzZSA9IHN5bnRoaW87CisJCXN5bnRoX2lycSA9ICBzeW50aGlycTsKKwl9CisjZWxzZQorCWlmKHN5bnRoaW8gIT0gLTEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNzNDIzMjogd2F2ZWZyb250IHN1cHBvcnQgbm90IGVuYWJsZWQgaW4gdGhpcyBkcml2ZXIuXG4iKTsKKyNlbmRpZgorCWNmZy5pcnEgPSAtMTsKKworCWlmIChpc2FwbnAgJiYKKwkgICAgKHBucF9yZWdpc3Rlcl9kcml2ZXIoJmNzNDIzMl9kcml2ZXIpID4gMCkKKwkpCisJCXJldHVybiAwOworCisJaWYoaW89PS0xfHxpcnE9PS0xfHxkbWE9PS0xKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczQyMzI6IE11c3Qgc2V0IGlvLCBpcnEgYW5kIGRtYS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljZmcuaW9fYmFzZSA9IGlvOworCWNmZy5pcnEgPSBpcnE7CisJY2ZnLmRtYSA9IGRtYTsKKwljZmcuZG1hMiA9IGRtYTI7CisKKwljZmdfbXB1LmlvX2Jhc2UgPSAtMTsKKwljZmdfbXB1LmlycSA9IC0xOworCisJaWYgKG1wdWlvICE9IC0xICYmIG1wdWlycSAhPSAtMSkgeworCQljZmdfbXB1LmlvX2Jhc2UgPSBtcHVpbzsKKwkJY2ZnX21wdS5pcnEgPSBtcHVpcnE7CisJCXByb2JlX2NzNDIzMl9tcHUoJmNmZ19tcHUpOyAvKiBCdWcgYWx3YXlzIHJldHVybnMgMCBub3QgT0sgLS0gQUMgKi8KKwl9CisKKwlpZiAocHJvYmVfY3M0MjMyKCZjZmcsRkFMU0UpID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2NzNDIzMih2b2lkKQoreworCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmY3M0MjMyX2RyaXZlcik7CisgICAgICAgIGlmIChjZmcuaXJxICE9IC0xKQorCQl1bmxvYWRfY3M0MjMyKCZjZmcpOyAvKiBVbmxvYWRzIGdsb2JhbCBNUFUgYXMgd2VsbCwgaWYgbmVlZGVkICovCit9CisKK21vZHVsZV9pbml0KGluaXRfY3M0MjMyKTsKK21vZHVsZV9leGl0KGNsZWFudXBfY3M0MjMyKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2NzNDIzMihjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSwgZG1hLCBkbWEyIG1wdWlvLCBtcHVpcnEqLworCWludCBpbnRzWzddOworCisJLyogSWYgd2UgaGF2ZSBpc2FwbnAgY2FyZHMsIG5vIG5lZWQgZm9yIG9wdGlvbnMgKi8KKwlpZiAocG5wX3JlZ2lzdGVyX2RyaXZlcigmY3M0MjMyX2RyaXZlcikgPiAwKQorCQlyZXR1cm4gMTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvCT0gaW50c1sxXTsKKwlpcnEJPSBpbnRzWzJdOworCWRtYQk9IGludHNbM107CisJZG1hMgk9IGludHNbNF07CisJbXB1aW8JPSBpbnRzWzVdOworCW1wdWlycQk9IGludHNbNl07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiY3M0MjMyPSIsIHNldHVwX2NzNDIzMik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQyODEvTWFrZWZpbGUgYi9zb3VuZC9vc3MvY3M0MjgxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTI3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvY3M0MjgxL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIyBNYWtlZmlsZSBmb3IgQ2lycnVzIExvZ2ljLUNyeXN0YWwgQ1M0MjgxIAorIworCitvYmotJChDT05GSUdfU09VTkRfQ1M0MjgxKSArPSBjczQyODEubworCitjczQyODEtb2JqcyArPSBjczQyODFtLm8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQyODEvY3M0MjgxX2h3ZGVmcy5oIGIvc291bmQvb3NzL2NzNDI4MS9jczQyODFfaHdkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxZDU5NQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9jczQyODEvY3M0MjgxX2h3ZGVmcy5oCkBAIC0wLDAgKzEsMTIzNCBAQAorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gSFdERUZTLkggLSBEZWZpbml0aW9ucyBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBkYXRhIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUKKy8vICAgICAgICAgICAgQ1M0MjgxCisvLworLy8gQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSBDcnlzdGFsIFNlbWljb25kdWN0b3IgQ29ycC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworI2lmbmRlZiBfSF9IV0RFRlMKKyNkZWZpbmUgX0hfSFdERUZTCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBvZmZzZXRzIG9mIHRoZSByZWdpc3RlcnMgbG9jYXRlZCBpbiB0aGUgUENJCisvLyBjb25maWd1cmF0aW9uIHNwYWNlIG9mIHRoZSBDUzQyODEgcGFydC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUENJQ09ORklHX0RFVklEX1ZFTklEICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIFBDSUNPTkZJR19TVEFUVVNfQ09NTUFORCAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBQQ0lDT05GSUdfQ0xBU1NfUkVWSVNJT04gICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgUENJQ09ORklHX0xBVEVOQ1lfVElNRVIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMENMCisjZGVmaW5lIFBDSUNPTkZJR19CQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBQQ0lDT05GSUdfQkExICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNEwKKyNkZWZpbmUgUENJQ09ORklHX1NVQlNZU0lEX1NVQlNZU1ZFTklEICAgICAgICAgIDB4MDAwMDAwMkNMCisjZGVmaW5lIFBDSUNPTkZJR19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDNDTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgcmVnaXN0ZXJzIGFjY2Vzc2VkIHZpYSBiYXNlIGFkZHJlc3MKKy8vIHJlZ2lzdGVyIHplcm8gb24gdGhlIENTNDI4MSBwYXJ0LgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBCQTBfSElTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwKKyNkZWZpbmUgQkEwX0hJQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIEJBMF9ISU1SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBDTAorI2RlZmluZSBCQTBfSUlFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgQkEwX0hEU1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjBMCisjZGVmaW5lIEJBMF9IRFNSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEY0TAorI2RlZmluZSBCQTBfSERTUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGOEwKKyNkZWZpbmUgQkEwX0hEU1IzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkNMCisjZGVmaW5lIEJBMF9EQ0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEwTAorI2RlZmluZSBCQTBfRENDMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNEwKKyNkZWZpbmUgQkEwX0RCQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMThMCisjZGVmaW5lIEJBMF9EQkMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFDTAorI2RlZmluZSBCQTBfRENBMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEyMEwKKyNkZWZpbmUgQkEwX0RDQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMjRMCisjZGVmaW5lIEJBMF9EQkExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTI4TAorI2RlZmluZSBCQTBfREJDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEyQ0wKKyNkZWZpbmUgQkEwX0RDQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMzBMCisjZGVmaW5lIEJBMF9EQ0MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTM0TAorI2RlZmluZSBCQTBfREJBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEzOEwKKyNkZWZpbmUgQkEwX0RCQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxM0NMCisjZGVmaW5lIEJBMF9EQ0EzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTQwTAorI2RlZmluZSBCQTBfRENDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE0NEwKKyNkZWZpbmUgQkEwX0RCQTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxNDhMCisjZGVmaW5lIEJBMF9EQkMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTRDTAorI2RlZmluZSBCQTBfRE1SMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE1MEwKKyNkZWZpbmUgQkEwX0RDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxNTRMCisjZGVmaW5lIEJBMF9ETVIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTU4TAorI2RlZmluZSBCQTBfRENSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE1Q0wKKyNkZWZpbmUgQkEwX0RNUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxNjBMCisjZGVmaW5lIEJBMF9EQ1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTY0TAorI2RlZmluZSBCQTBfRE1SMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE2OEwKKyNkZWZpbmUgQkEwX0RDUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxNkNMCisjZGVmaW5lIEJBMF9ETE1SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTcwTAorI2RlZmluZSBCQTBfRExTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE3NEwKKyNkZWZpbmUgQkEwX0ZDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxODBMCisjZGVmaW5lIEJBMF9GQ1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTg0TAorI2RlZmluZSBCQTBfRkNSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE4OEwKKyNkZWZpbmUgQkEwX0ZDUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxOENMCisjZGVmaW5lIEJBMF9GUERSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTkwTAorI2RlZmluZSBCQTBfRlBEUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE5NEwKKyNkZWZpbmUgQkEwX0ZQRFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxOThMCisjZGVmaW5lIEJBMF9GUERSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTlDTAorI2RlZmluZSBCQTBfRkNIUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwQ0wKKyNkZWZpbmUgQkEwX0ZTSUMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTBMCisjZGVmaW5lIEJBMF9GU0lDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE0TAorI2RlZmluZSBCQTBfRlNJQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxOEwKKyNkZWZpbmUgQkEwX0ZTSUMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUNMCisjZGVmaW5lIEJBMF9QQ0lDRkcwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwTAorI2RlZmluZSBCQTBfUENJQ0ZHMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNEwKKyNkZWZpbmUgQkEwX1BDSUNGRzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDhMCisjZGVmaW5lIEJBMF9QQ0lDRkcwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzBDTAorI2RlZmluZSBCQTBfUENJQ0ZHMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxMEwKKyNkZWZpbmUgQkEwX1BDSUNGRzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMTRMCisjZGVmaW5lIEJBMF9QQ0lDRkcxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzE4TAorI2RlZmluZSBCQTBfUENJQ0ZHMUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxQ0wKKyNkZWZpbmUgQkEwX1BDSUNGRzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMjBMCisjZGVmaW5lIEJBMF9QQ0lDRkcyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzI0TAorI2RlZmluZSBCQTBfUENJQ0ZHMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyOEwKKyNkZWZpbmUgQkEwX1BDSUNGRzJDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMkNMCisjZGVmaW5lIEJBMF9QQ0lDRkczMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzMwTAorI2RlZmluZSBCQTBfUENJQ0ZHMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzNEwKKyNkZWZpbmUgQkEwX1BDSUNGRzM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMzhMCisjZGVmaW5lIEJBMF9QQ0lDRkczQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzNDTAorI2RlZmluZSBCQTBfUENJQ0ZHNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDM0MEwKKyNkZWZpbmUgQkEwX1BNQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzNDRMCisjZGVmaW5lIEJBMF9DV1BSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwM0UwTAorI2RlZmluZSBCQTBfRVBQTUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNFNEwKKyNkZWZpbmUgQkEwX0dQSU9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzRThMCisjZGVmaW5lIEJBMF9TUE1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwM0VDTAorI2RlZmluZSBCQTBfQ0ZMUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNGMEwKKyNkZWZpbmUgQkEwX0lJU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzRjRMCisjZGVmaW5lIEJBMF9UTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwM0Y4TAorI2RlZmluZSBCQTBfU1NWSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNGQ0wKKyNkZWZpbmUgQkEwX0NMS0NSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBMCisjZGVmaW5lIEJBMF9GUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDEwTAorI2RlZmluZSBCQTBfU0xUMTJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQxQ0wKKyNkZWZpbmUgQkEwX1NFUk1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjBMCisjZGVmaW5lIEJBMF9TRVJDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDI4TAorI2RlZmluZSBCQTBfU0VSQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyQ0wKKyNkZWZpbmUgQkEwX1NMVDEyTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NUNMCisjZGVmaW5lIEJBMF9BQ0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDYwTAorI2RlZmluZSBCQTBfQUNTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ2NEwKKyNkZWZpbmUgQkEwX0FDT1NWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjhMCisjZGVmaW5lIEJBMF9BQ0NBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDZDTAorI2RlZmluZSBCQTBfQUNDREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3MEwKKyNkZWZpbmUgQkEwX0FDSVNWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzRMCisjZGVmaW5lIEJBMF9BQ1NBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDc4TAorI2RlZmluZSBCQTBfQUNTREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3Q0wKKyNkZWZpbmUgQkEwX0pTUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODBMCisjZGVmaW5lIEJBMF9KU0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDg0TAorI2RlZmluZSBCQTBfTUlEQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5MEwKKyNkZWZpbmUgQkEwX01JRENNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTRMCisjZGVmaW5lIEJBMF9NSURTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDk0TAorI2RlZmluZSBCQTBfTUlEV1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5OEwKKyNkZWZpbmUgQkEwX01JRFJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OUNMCisjZGVmaW5lIEJBMF9BT0RTRDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEE4TAorI2RlZmluZSBCQTBfQU9EU0QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRBQ0wKKyNkZWZpbmUgQkEwX0NGR0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjBMCisjZGVmaW5lIEJBMF9TTFQxMk0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNERDTAorI2RlZmluZSBCQTBfQUNTVFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRFNEwKKyNkZWZpbmUgQkEwX0FDSVNWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RjRMCisjZGVmaW5lIEJBMF9BQ1NBRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEY4TAorI2RlZmluZSBCQTBfQUNTREEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRGQ0wKKyNkZWZpbmUgQkEwX0lPVEdQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDBMCisjZGVmaW5lIEJBMF9JT1RTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTA0TAorI2RlZmluZSBCQTBfSU9URk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwOEwKKyNkZWZpbmUgQkEwX0lPVERNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MENMCisjZGVmaW5lIEJBMF9JT1RBQzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTAwTAorI2RlZmluZSBCQTBfSU9UQUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNEwKKyNkZWZpbmUgQkEwX0lPVEFDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDhMCisjZGVmaW5lIEJBMF9JT1RBQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTBDTAorI2RlZmluZSBCQTBfSU9UUENQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUyQ0wKKyNkZWZpbmUgQkEwX0lPVENDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MzBMCisjZGVmaW5lIEJBMF9JT1RDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNThDTAorI2RlZmluZSBCQTBfUENQUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwMEwKKyNkZWZpbmUgQkEwX1BDUEdSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDRMCisjZGVmaW5lIEJBMF9QQ1BDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjA4TAorI2RlZmluZSBCQTBfUENQQ0lFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwOEwKKyNkZWZpbmUgQkEwX1NCTUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MDBMCisjZGVmaW5lIEJBMF9TQk1EUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzA0TAorI2RlZmluZSBCQTBfU0JSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDcwOEwKKyNkZWZpbmUgQkEwX1NCUkRQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MENMCisjZGVmaW5lIEJBMF9TQldEUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzEwTAorI2RlZmluZSBCQTBfU0JXQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDcxMEwKKyNkZWZpbmUgQkEwX1NCUkJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MTRMCisjZGVmaW5lIEJBMF9GTVNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzMwTAorI2RlZmluZSBCQTBfQjBBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDczMEwKKyNkZWZpbmUgQkEwX0ZNRFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MzRMCisjZGVmaW5lIEJBMF9CMUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzM4TAorI2RlZmluZSBCQTBfQjFEUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDczQ0wKKyNkZWZpbmUgQkEwX1NTUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3NDBMCisjZGVmaW5lIEJBMF9EQUNTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzQ0TAorI2RlZmluZSBCQTBfQURDU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDc0OEwKKyNkZWZpbmUgQkEwX1NTQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3NENMCisjZGVmaW5lIEJBMF9GTUxWQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzU0TAorI2RlZmluZSBCQTBfRk1SVkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDc1OEwKKyNkZWZpbmUgQkEwX1NSQ1NBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3NUNMCisjZGVmaW5lIEJBMF9QUExWQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzYwTAorI2RlZmluZSBCQTBfUFBSVkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDc2NEwKKyNkZWZpbmUgQkEwX1BBU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3NjhMCisjZGVmaW5lIEJBMF9DQVNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzZDTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgQUM5NyBzaGFkb3cgcmVnaXN0ZXJzLCB3aGljaCBhcHBlYXIKKy8vIGFzIGEgdmlydHVhbCBleHRlbnNpb24gdG8gdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciB6ZXJvIG1lbW9yeSByYW5nZS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQUM5N19SRUdfT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0VMCisjZGVmaW5lIEFDOTdfQ09ERUNfTlVNQkVSX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAzMDAwTAorCisjZGVmaW5lIEJBMF9BQzk3X1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwTAorI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVk9MVU1FICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMkwKKyNkZWZpbmUgQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSAgICAgICAgICAgICAgIDB4MDAwMDEwMDRMCisjZGVmaW5lIEJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyAgICAgICAgICAgICAweDAwMDAxMDA2TAorI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVE9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwOEwKKyNkZWZpbmUgQkEwX0FDOTdfUENfQkVFUF9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMEFMCisjZGVmaW5lIEJBMF9BQzk3X1BIT05FX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAweDAwMDAxMDBDTAorI2RlZmluZSBCQTBfQUM5N19NSUNfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwRUwKKyNkZWZpbmUgQkEwX0FDOTdfTElORV9JTl9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTBMCisjZGVmaW5lIEJBMF9BQzk3X0NEX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDEyTAorI2RlZmluZSBCQTBfQUM5N19WSURFT19WT0xVTUUgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxNEwKKyNkZWZpbmUgQkEwX0FDOTdfQVVYX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTZMCisjZGVmaW5lIEJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FICAgICAgICAgICAgICAgICAweDAwMDAxMDE4TAorI2RlZmluZSBCQTBfQUM5N19SRUNPUkRfU0VMRUNUICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxQUwKKyNkZWZpbmUgQkEwX0FDOTdfUkVDT1JEX0dBSU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMUNMCisjZGVmaW5lIEJBMF9BQzk3X1JFQ09SRF9HQUlOX01JQyAgICAgICAgICAgICAgICAweDAwMDAxMDFFTAorI2RlZmluZSBCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UgICAgICAgICAgICAgICAgMHgwMDAwMTAyMEwKKyNkZWZpbmUgQkEwX0FDOTdfM0RfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjJMCisjZGVmaW5lIEJBMF9BQzk3X01PREVNX1JBVEUgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDI0TAorI2RlZmluZSBCQTBfQUM5N19QT1dFUkRPV04gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAyNkwKKyNkZWZpbmUgQkEwX0FDOTdfRVhUX0FVRElPX0lEICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjhMCisjZGVmaW5lIEJBMF9BQzk3X0VYVF9BVURJT19QT1dFUiAgICAgICAgICAgICAgICAweDAwMDAxMDJBTAorI2RlZmluZSBCQTBfQUM5N19QQ01fRlJPTlRfREFDX1JBVEUgICAgICAgICAgICAgMHgwMDAwMTAyQ0wKKyNkZWZpbmUgQkEwX0FDOTdfUENNX1NVUlJfREFDX1JBVEUgICAgICAgICAgICAgIDB4MDAwMDEwMkVMCisjZGVmaW5lIEJBMF9BQzk3X1BDTV9MRkVfREFDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDMwTAorI2RlZmluZSBCQTBfQUM5N19QQ01fTFJfQURDX1JBVEUgICAgICAgICAgICAgICAgMHgwMDAwMTAzMkwKKyNkZWZpbmUgQkEwX0FDOTdfTUlDX0FEQ19SQVRFICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMzRMCisjZGVmaW5lIEJBMF9BQzk3XzZDSF9WT0xfQ19MRkUgICAgICAgICAgICAgICAgICAweDAwMDAxMDM2TAorI2RlZmluZSBCQTBfQUM5N182Q0hfVk9MX1NVUlJPVU5EICAgICAgICAgICAgICAgMHgwMDAwMTAzOEwKKyNkZWZpbmUgQkEwX0FDOTdfUkVTRVJWRURfM0EgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwM0FMCisjZGVmaW5lIEJBMF9BQzk3X0VYVF9NT0RFTV9JRCAgICAgICAgICAgICAgICAgICAweDAwMDAxMDNDTAorI2RlZmluZSBCQTBfQUM5N19FWFRfTU9ERU1fUE9XRVIgICAgICAgICAgICAgICAgMHgwMDAwMTAzRUwKKyNkZWZpbmUgQkEwX0FDOTdfTElORTFfQ09ERUNfUkFURSAgICAgICAgICAgICAgIDB4MDAwMDEwNDBMCisjZGVmaW5lIEJBMF9BQzk3X0xJTkUyX0NPREVDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDQyTAorI2RlZmluZSBCQTBfQUM5N19IQU5EU0VUX0NPREVDX1JBVEUgICAgICAgICAgICAgMHgwMDAwMTA0NEwKKyNkZWZpbmUgQkEwX0FDOTdfTElORTFfQ09ERUNfTEVWRUwgICAgICAgICAgICAgIDB4MDAwMDEwNDZMCisjZGVmaW5lIEJBMF9BQzk3X0xJTkUyX0NPREVDX0xFVkVMICAgICAgICAgICAgICAweDAwMDAxMDQ4TAorI2RlZmluZSBCQTBfQUM5N19IQU5EU0VUX0NPREVDX0xFVkVMICAgICAgICAgICAgMHgwMDAwMTA0QUwKKyNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fQ09ORklHICAgICAgICAgICAgICAgIDB4MDAwMDEwNENMCisjZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1RZUEUgICAgICAgICAgICAgICAgICAweDAwMDAxMDRFTAorI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9TVElDS1kgICAgICAgICAgICAgICAgMHgwMDAwMTA1MEwKKyNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fV0FLRVVQICAgICAgICAgICAgICAgIDB4MDAwMDEwNTJMCisjZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1NUQVRVUyAgICAgICAgICAgICAgICAweDAwMDAxMDU0TAorI2RlZmluZSBCQTBfQUM5N19NSVNDX01PREVNX0FGRV9TVEFUICAgICAgICAgICAgMHgwMDAwMTA1NkwKKyNkZWZpbmUgQkEwX0FDOTdfUkVTRVJWRURfNTggICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNThMCisjZGVmaW5lIEJBMF9BQzk3X0NSWVNUQUxfUkVWX05fRkFCX0lEICAgICAgICAgICAweDAwMDAxMDVBTAorI2RlZmluZSBCQTBfQUM5N19URVNUX0FORF9NSVNDX0NUUkwgICAgICAgICAgICAgMHgwMDAwMTA1Q0wKKyNkZWZpbmUgQkEwX0FDOTdfQUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNUVMCisjZGVmaW5lIEJBMF9BQzk3X01JU0NfQ1JZU1RBTF9DT05UUk9MICAgICAgICAgICAweDAwMDAxMDYwTAorI2RlZmluZSBCQTBfQUM5N19MSU5FMV9IWVBSSURfQ1RSTCAgICAgICAgICAgICAgMHgwMDAwMTA2MkwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzY0ICAgICAgICAgICAgIDB4MDAwMDEwNjRMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82NiAgICAgICAgICAgICAweDAwMDAxMDY2TAorI2RlZmluZSBCQTBfQUM5N19TUERJRl9DT05UUk9MICAgICAgICAgICAgICAgICAgMHgwMDAwMTA2OEwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzZBICAgICAgICAgICAgIDB4MDAwMDEwNkFMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82QyAgICAgICAgICAgICAweDAwMDAxMDZDTAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNkUgICAgICAgICAgICAgMHgwMDAwMTA2RUwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzcwICAgICAgICAgICAgIDB4MDAwMDEwNzBMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF83MiAgICAgICAgICAgICAweDAwMDAxMDcyTAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNzQgICAgICAgICAgICAgMHgwMDAwMTA3NEwKKyNkZWZpbmUgQkEwX0FDOTdfQ0FMX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNzZMCisjZGVmaW5lIEJBMF9BQzk3X0NBTF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDc4TAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfN0EgICAgICAgICAgICAgMHgwMDAwMTA3QUwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX0lEMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwN0NMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9JRDIgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDdFTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBtZW1vcmllcyBhY2Nlc3NlZCB2aWEKKy8vIGJhc2UgYWRkcmVzcyByZWdpc3RlciBvbmUgb24gdGhlIENTNDI4MSBwYXJ0LgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDSSBkZXZpY2UgSUQvdmVuZG9yIElECisvLyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUERWX1ZFTklEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIFBEVl9ERVZJRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwTAorI2RlZmluZSBQRFZfVkVOSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgUERWX0RFVklEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2TAorI2RlZmluZSBWRU5JRF9DSVJSVVNfTE9HSUMgICAgICAgICAgICAgICAgICAgICAgMHgxMDEzTAorI2RlZmluZSBERVZJRF9DUzQyODEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDA1TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDSSBzdGF0dXMgYW5kIGNvbW1hbmQKKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBQU0NfSU9fU1BBQ0VfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgUFNDX01FTU9SWV9TUEFDRV9FTkFCTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFBTQ19CVVNfTUFTVEVSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBQU0NfU1BFQ0lBTF9DWUNMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgUFNDX01XSV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIFBTQ19WR0FfUEFMRVRURV9TTk9PUCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBQU0NfUEFSSVRZX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgUFNDX1dBSVRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMCisjZGVmaW5lIFBTQ19TRVJSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwTAorI2RlZmluZSBQU0NfRkFTVF9CMkJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMEwKKyNkZWZpbmUgUFNDX1VERl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3RjAwMDBMCisjZGVmaW5lIFBTQ19GQVNUX0IyQl9DQVBBQkxFICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwTAorI2RlZmluZSBQU0NfUEFSSVRZX0VSUk9SX0RFVEVDVEVEICAgICAgICAgICAgICAgMHgwMTAwMDAwMEwKKyNkZWZpbmUgUFNDX0RFVlNFTF9USU1JTkdfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDBMCisjZGVmaW5lIFBTQ19UQVJHRVRfQUJPUlRfU0lHTkFMTEVEICAgICAgICAgICAgICAweDA4MDAwMDAwTAorI2RlZmluZSBQU0NfUkVDRUlWRURfVEFSR0VUX0FCT1JUICAgICAgICAgICAgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgUFNDX1JFQ0VJVkVEX01BU1RFUl9BQk9SVCAgICAgICAgICAgICAgIDB4MjAwMDAwMDBMCisjZGVmaW5lIFBTQ19TSUdOQUxMRURfU0VSUiAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwTAorI2RlZmluZSBQU0NfREVURUNURURfUEFSSVRZX0VSUk9SICAgICAgICAgICAgICAgMHg4MDAwMDAwMEwKKyNkZWZpbmUgUFNDX1VERl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2TAorI2RlZmluZSBQU0NfREVWU0VMX1RJTUlOR19TSElGVCAgICAgICAgICAgICAgICAgMjVMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUENJIGNsYXNzL3JldmlzaW9uIElECisvLyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUENSX1JFVklEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkZMCisjZGVmaW5lIFBDUl9JTlRFUkZBQ0VfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRjAwTAorI2RlZmluZSBQQ1JfU1VCQ0xBU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMEZGMDAwMEwKKyNkZWZpbmUgUENSX0NMQVNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYwMDAwMDBMCisjZGVmaW5lIFBDUl9SRVZJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwTAorI2RlZmluZSBQQ1JfSU5URVJGQUNFX1NISUZUICAgICAgICAgICAgICAgICAgICAgOEwKKyNkZWZpbmUgUENSX1NVQkNMQVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE2TAorI2RlZmluZSBQQ1JfQ0xBU1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMjRMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUENJIGxhdGVuY3kgdGltZXIgcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFBMVF9DQUNIRV9MSU5FX1NJWkVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMEZGTAorI2RlZmluZSBQTFRfTEFURU5DWV9USU1FUl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwRkYwMEwKKyNkZWZpbmUgUExUX0hFQURFUl9UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRjAwMDBMCisjZGVmaW5lIFBMVF9CSVNUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGMDAwMDAwTAorI2RlZmluZSBQTFRfQ0FDSEVfTElORV9TSVpFX1NISUZUICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgUExUX0xBVEVOQ1lfVElNRVJfU0hJRlQgICAgICAgICAgICAgICAgIDhMCisjZGVmaW5lIFBMVF9IRUFERVJfVFlQRV9TSElGVCAgICAgICAgICAgICAgICAgICAxNkwKKyNkZWZpbmUgUExUX0JJU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDI0TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBQQkFSX01FTU9SWV9TUEFDRV9JTkRJQ0FUT1IgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgUEJBUl9MT0NBVElPTl9UWVBFX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDZMCisjZGVmaW5lIFBCQVJfTk9UX1BSRUZFVENIQUJMRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TAorI2RlZmluZSBQQkFSX0FERFJFU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGMEwKKyNkZWZpbmUgUEJBUl9MT0NBVElPTl9UWVBFX1NISUZUICAgICAgICAgICAgICAgIDFMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUENJIHN1YnN5c3RlbSBJRC9zdWJzeXN0ZW0KKy8vIHZlbmRvciBJRCByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUFNTX1NVQlNZU1RFTV9WRU5ET1JfSURfTUFTSyAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIFBTU19TVUJTWVNURU1fSURfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwTAorI2RlZmluZSBQU1NfU1VCU1lTVEVNX1ZFTkRPUl9JRF9TSElGVCAgICAgICAgICAgMEwKKyNkZWZpbmUgUFNTX1NVQlNZU1RFTV9JRF9TSElGVCAgICAgICAgICAgICAgICAgIDE2TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDSSBpbnRlcnJ1cHQgcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFBJX0xJTkVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGTAorI2RlZmluZSBQSV9QSU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkYwMEwKKyNkZWZpbmUgUElfTUlOX0dSQU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDBGRjAwMDBMCisjZGVmaW5lIFBJX01BWF9MQVRFTkNZX01BU0sgICAgICAgICAgICAgICAgICAgICAweEZGMDAwMDAwTAorI2RlZmluZSBQSV9MSU5FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgUElfUElOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDhMCisjZGVmaW5lIFBJX01JTl9HUkFOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxNkwKKyNkZWZpbmUgUElfTUFYX0xBVEVOQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgIDI0TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgaW50ZXJydXB0IHN0YXR1cworLy8gcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEhJU1JfSFZPTE1BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgSElTUl9WRE5JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBISVNSX1ZVUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIEhJU1JfR1AxSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgSElTUl9HUDNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TAorI2RlZmluZSBISVNSX0dQU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIEhJU1JfR1BQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgSElTUl9ETUFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwTAorI2RlZmluZSBISVNSX0ZJRk9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDBMCisjZGVmaW5lIEhJU1JfSFZPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMEwKKyNkZWZpbmUgSElTUl9NSURJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwTAorI2RlZmluZSBISVNSX1NCSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDBMCisjZGVmaW5lIEhJU1JfSU5URU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMEwKKyNkZWZpbmUgSElTUl9ETUFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwRjAwTAorI2RlZmluZSBISVNSX0ZJRk9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEYwMDBMCisjZGVmaW5lIEhJU1JfRE1BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOEwKKyNkZWZpbmUgSElTUl9GSUZPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxMkwKKyNkZWZpbmUgSElTUl9GSUZPMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwTAorI2RlZmluZSBISVNSX0ZJRk8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDBMCisjZGVmaW5lIEhJU1JfRklGTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMEwKKyNkZWZpbmUgSElTUl9GSUZPMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwTAorI2RlZmluZSBISVNSX0RNQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIEhJU1JfRE1BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMEwKKyNkZWZpbmUgSElTUl9ETUEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwTAorI2RlZmluZSBISVNSX0RNQTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDBMCisjZGVmaW5lIEhJU1JfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IGludGVycnVwdCBjb250cm9sCisvLyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgSElDUl9JRVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBISUNSX0NIR00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgRE1BIE1vZGUgUmVnaXN0ZXIgbgorLy8gKERNUm4pCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIERNUm5fVFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQ0wKKyNkZWZpbmUgRE1Sbl9UUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyTAorI2RlZmluZSBETVJuX0FVVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIERNUm5fVFJfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgRE1Sbl9UUl9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBETVJuX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwQzBMCisjZGVmaW5lIERNUm5fVFlQRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNkwKKyNkZWZpbmUgRE1Sbl9TSVpFOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwTAorI2RlZmluZSBETVJuX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDBMCisjZGVmaW5lIERNUm5fQkVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMEwKKyNkZWZpbmUgRE1Sbl9VU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwTAorI2RlZmluZSBETVJuX1NJWkUyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDBMCisjZGVmaW5lIERNUm5fU1dBUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMEwKKyNkZWZpbmUgRE1Sbl9DQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwTAorI2RlZmluZSBETVJuX1RCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDBMCisjZGVmaW5lIERNUm5fUE9MTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgRE1Sbl9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwTAorI2RlZmluZSBETVJuX0ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAwMDAwMDBMCisjZGVmaW5lIERNUm5fRlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMzBMCisjZGVmaW5lIERNUm5fRlNFTDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwKKyNkZWZpbmUgRE1Sbl9GU0VMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwTAorI2RlZmluZSBETVJuX0ZTRUwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDBMCisjZGVmaW5lIERNUm5fRlNFTDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMDAwMDAwMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBETUEgQ29tbWFuZCBSZWdpc3RlciBuCisvLyAoRENSbikKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgRENSbl9IVENJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwTAorI2RlZmluZSBEQ1JuX1RDSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBMCisjZGVmaW5lIERDUm5fTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBGSUZPIENvbnRyb2wgCisvLyByZWdpc3RlciBuLihGQ1JuKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBGQ1JuX09GX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RkwKKyNkZWZpbmUgRkNSbl9PRl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisjZGVmaW5lIEZDUm5fU1pfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA3RjAwTAorI2RlZmluZSBGQ1JuX1NaX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOEwKKyNkZWZpbmUgRkNSbl9MU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRjAwMDBMCisjZGVmaW5lIEZDUm5fTFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAxNkwKKyNkZWZpbmUgRkNSbl9SU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMDAwMDBMCisjZGVmaW5lIEZDUm5fUlNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAyNEwKKyNkZWZpbmUgRkNSbl9GRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDBMCisjZGVmaW5lIEZDUm5fUFNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwTAorI2RlZmluZSBGQ1JuX0RBQ1ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBQb3dlciBNYW5hZ2VtZW50CisvLyBjb250cm9sIHJlZ2lzdGVyLihTUE1DKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBTUE1DX1JTVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgU1BNQ19BU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFNQTUNfV1VQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBTUE1DX1dVUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgU1BNQ19BU0RJMkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIFNQTUNfRVNTUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwTAorI2RlZmluZSBTUE1DX0dJU1BFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMEwKKyNkZWZpbmUgU1BNQ19HSVBQRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQ29uZmlndXJhdGlvbiBMb2FkIHJlZ2lzdGVyLgorLy8gKENGTFIpCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENGTFJfQ0xPQ0tfU09VUkNFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzTAorI2RlZmluZSBDRkxSX0NMT0NLX1NPVVJDRV9BQzk3ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKworI2RlZmluZSBDRkxSX0NCMF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkZMCisjZGVmaW5lIENGTFJfQ0IxX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkYwMEwKKyNkZWZpbmUgQ0ZMUl9DQjJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwRkYwMDAwTAorI2RlZmluZSBDRkxSX0NCM19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYwMDAwMDBMCisjZGVmaW5lIENGTFJfQ0IwX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgQ0ZMUl9DQjFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA4TAorI2RlZmluZSBDRkxSX0NCMl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2TAorI2RlZmluZSBDRkxSX0NCM19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0TAorCisjZGVmaW5lIElPVENSX0RNQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBJT1RDUl9ETUExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMEwKKyNkZWZpbmUgSU9UQ1JfRE1BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDBMCisjZGVmaW5lIElPVENSX0RNQTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwQzAwTAorI2RlZmluZSBJT1RDUl9DQ0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMEwKKyNkZWZpbmUgSU9UQ1JfUENQQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDBMCisjZGVmaW5lIElPVENSX0RETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwTAorCisjZGVmaW5lIFNCV0JTX1dCQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFNSQyBTbG90IEFzc2lnbm1lbnQgUmVnaXN0ZXIKKy8vIChTUkNTQSkKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgU1JDU0FfUExTU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUZMCisjZGVmaW5lIFNSQ1NBX1BMU1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwTAorI2RlZmluZSBTUkNTQV9QUlNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMUYwMEwKKyNkZWZpbmUgU1JDU0FfUFJTU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDhMCisjZGVmaW5lIFNSQ1NBX0NMU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMUYwMDAwTAorI2RlZmluZSBTUkNTQV9DTFNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTZMCisjZGVmaW5lIFNSQ1NBX0NSU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAwMDAwTAorI2RlZmluZSBTUkNTQV9DUlNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMjRMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU291bmQgU3lzdGVtIFBvd2VyIE1hbmFnZW1lbnQKKy8vIHJlZ2lzdGVyLihTU1BNKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBTU1BNX0ZQRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgU1NQTV9NSVhFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDBMCisjZGVmaW5lIFNTUE1fQ1NSQ0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBTU1BNX1BTUkNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgU1NQTV9KU0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIFNTUE1fQUNMRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBTU1BNX0ZNRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTb3VuZCBTeXN0ZW0gQ29udHJvbAorLy8gUmVnaXN0ZXIuIChTU0NSKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBTU0NSX1NCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgU1NDUl9IVkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIFNTQ1JfTFBGSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwTAorI2RlZmluZSBTU0NSX0xQU1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgU1NDUl9YTFBTUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIFNTQ1JfTVZNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwTAorI2RlZmluZSBTU0NSX01WQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMEwKKyNkZWZpbmUgU1NDUl9NVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDBMCisjZGVmaW5lIFNTQ1JfTVZDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgMS4gCisvLyAoQ0xLQ1IxKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDTEtDUjFfRExMU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQ0wKKyNkZWZpbmUgQ0xLQ1IxX0RMTFNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDJMCisjZGVmaW5lIENMS0NSMV9ETExQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBDTEtDUjFfU1dDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgQ0xLQ1IxX0RMTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDBMCisjZGVmaW5lIENMS0NSMV9DS1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwTAorI2RlZmluZSBDTEtDUjFfQ0tSTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMEwKKyNkZWZpbmUgQ0xLQ1IxX0RMTFJEWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDBMCisjZGVmaW5lIENMS0NSMV9DTEtPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFNvdW5kIEJsYXN0ZXIgUmVhZCBCdWZmZXIKKy8vIFN0YXR1cy4oU0JSQlMpCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFNCUkJTX1JEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGTAorI2RlZmluZSBTQlJCU19SRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgU0JSQlNfUkJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgbWFzdGVyIGNvbnRyb2wKKy8vIHJlZ2lzdGVyLihTRVJNQykKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgU0VSTUNfTVNQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIFNFUk1DX1BUQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFTAorI2RlZmluZSBTRVJNQ19QVENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMUwKKyNkZWZpbmUgU0VSTUNfUFRDX0FDOTcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFNFUk1DX1BMQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBTRVJNQ19QWExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgU0VSTUNfTE9GViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBMCisjZGVmaW5lIFNFUk1DX1NMQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwTAorI2RlZmluZSBTRVJNQ19TWExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMEwKKyNkZWZpbmUgU0VSTUNfT0RTRU4xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDBMCisjZGVmaW5lIFNFUk1DX09EU0VOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEdlbmVyYWwgUHVycG9zZSBJL08gUmVnaXN0ZXIuIAorLy8gKEdQSU9SKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBHUElPUl9WRE5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgR1BJT1JfVlVQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIEdQSU9SX0dQMVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBHUElPUl9HUDNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgR1BJT1JfR1BTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIEdQSU9SX0dQUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBHUElPUl9HUDFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMEwKKyNkZWZpbmUgR1BJT1JfR1AzRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDBMCisjZGVmaW5lIEdQSU9SX1ZETkxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwTAorI2RlZmluZSBHUElPUl9WRE5QTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMEwKKyNkZWZpbmUgR1BJT1JfVkROU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDBMCisjZGVmaW5lIEdQSU9SX1ZETlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwTAorI2RlZmluZSBHUElPUl9WVVBMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMEwKKyNkZWZpbmUgR1BJT1JfVlVQUE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBMCisjZGVmaW5lIEdQSU9SX1ZVUFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwTAorI2RlZmluZSBHUElPUl9WVVBXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMEwKKyNkZWZpbmUgR1BJT1JfR1AxT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDBMCisjZGVmaW5lIEdQSU9SX0dQMVBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTAorI2RlZmluZSBHUElPUl9HUDFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMEwKKyNkZWZpbmUgR1BJT1JfR1AxVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDBMCisjZGVmaW5lIEdQSU9SX0dQM09FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwTAorI2RlZmluZSBHUElPUl9HUDNQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMEwKKyNkZWZpbmUgR1BJT1JfR1AzU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDBMCisjZGVmaW5lIEdQSU9SX0dQM1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgMS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMENMCisjZGVmaW5lIENMS0NSMV9QTExTU19TRVJJQUwgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBDTEtDUjFfUExMU1NfQ1JZU1RBTCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1BDSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIENMS0NSMV9QTExTU19SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBDTAorI2RlZmluZSBDTEtDUjFfUExMUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgQ0xLQ1IxX1NXQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBMCisjZGVmaW5lIENMS0NSMV9QTExPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZlYXR1cmUgcmVwb3J0aW5nIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBGUlJfRkFCX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgRlJSX01BU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUNMCisjZGVmaW5lIEZSUl9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMDAwTAorI2RlZmluZSBGUlJfRkFCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgRlJSX01BU0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDJMCisjZGVmaW5lIEZSUl9JRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCAxIGNvbmZpZ3VyYXRpb24KKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBTRVJDMV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgU0VSQzFfU08xRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIFNFUkMxX1NPMUZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFTAorI2RlZmluZSBTRVJDMV9TTzFGX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwKKyNkZWZpbmUgU0VSQzFfU08xRl9BQzk3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFNFUkMxX1NPMUZfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBTRVJDMV9TTzFGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCAyIGNvbmZpZ3VyYXRpb24KKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBTRVJDMl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgU0VSQzJfU0kxRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIFNFUkMyX1NJMUZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFTAorI2RlZmluZSBTRVJDMl9TSTFGX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwKKyNkZWZpbmUgU0VSQzJfU0kxRl9BQzk3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFNFUkMyX1NJMUZfQURDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBTRVJDMl9TSTFGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDQ1RMX0VTWU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTAorI2RlZmluZSBBQ0NUTF9WRlJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgQUNDVExfRENWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIEFDQ1RMX0NSVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBBQ0NUTF9UQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQUNTVFNfQ1JEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIEFDU1RTX1ZTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgb3V0cHV0IHNsb3QgdmFsaWQKKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBBQ09TVl9TTFYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgQUNPU1ZfU0xWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIEFDT1NWX1NMVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBBQ09TVl9TTFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgQUNPU1ZfU0xWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIEFDT1NWX1NMVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBBQ09TVl9TTFY5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgQUNPU1ZfU0xWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMCisjZGVmaW5lIEFDT1NWX1NMVjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwTAorI2RlZmluZSBBQ09TVl9TTFYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbW1hbmQgYWRkcmVzcworLy8gcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDQ0FEX0NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGTAorI2RlZmluZSBBQ0NBRF9DSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbW1hbmQgZGF0YSByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQUNDREFfQ0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIEFDQ0RBX0NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgaW5wdXQgc2xvdCB2YWxpZAorLy8gcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDSVNWX0lTVjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBBQ0lTVl9JU1Y0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgQUNJU1ZfSVNWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIEFDSVNWX0lTVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TAorI2RlZmluZSBBQ0lTVl9JU1Y3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgQUNJU1ZfSVNWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBMCisjZGVmaW5lIEFDSVNWX0lTVjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwTAorI2RlZmluZSBBQ0lTVl9JU1YxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgQUNJU1ZfSVNWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIEFDSVNWX0lTVjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIGFkZHJlc3MKKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBBQ1NBRF9TSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RkwKKyNkZWZpbmUgQUNTQURfU0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgZGF0YSByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQUNTREFfU0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIEFDU0RBX1NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIGFkZHJlc3MgYW5kIGNvbnRyb2wKKy8vIHJlZ2lzdGVycyAoYWxsIDEyKS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgSU9UQUNfU0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIElPVEFDX01TS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwTAorI2RlZmluZSBJT1RBQ19JT0RDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMEwKKyNkZWZpbmUgSU9UQUNfSU9EQ18xNl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIElPVEFDX0lPRENfMTBfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTAorI2RlZmluZSBJT1RBQ19JT0RDXzEyX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMEwKKyNkZWZpbmUgSU9UQUNfV1NQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDBMCisjZGVmaW5lIElPVEFDX1JTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwTAorI2RlZmluZSBJT1RBQ19XU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMEwKKyNkZWZpbmUgSU9UQUNfV0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDBMCisjZGVmaW5lIElPVEFDX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwTAorI2RlZmluZSBJT1RBQ19TQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgSU9UQUNfTVNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDL1BDSSBtYXN0ZXIgZW5hYmxlCisvLyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUENQQ0lFTl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgcG9sbC90cmlnZ2VyCisvLyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgSlNQVF9DQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIEpTUFRfQ0FZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTAorI2RlZmluZSBKU1BUX0NCWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgSlNQVF9DQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIEpTUFRfQkExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBKU1BUX0JBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgSlNQVF9CQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDBMCisjZGVmaW5lIEpTUFRfQkIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGpveXN0aWNrIGNvbnRyb2wgcmVnaXN0ZXIuCisvLyBUaGUgVEJGIGJpdCBoYXMgYmVlbiBtb3ZlZCBmcm9tIE1JRFNSIHJlZ2lzdGVyIHRvIEpTQ1RMIHJlZ2lzdGVyIGJpdCA4LgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBKU0NUTF9TUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgSlNDVExfU1BfU0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIEpTQ1RMX1NQX01FRElVTV9TTE9XICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBKU0NUTF9TUF9NRURJVU1fRkFTVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgSlNDVExfU1BfRkFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDNMCisjZGVmaW5lIEpTQ1RMX0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBKU0NUTF9UQkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMEwKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgY29udHJvbCByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTUlEQ1JfVFhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIE1JRENSX1JYRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTAorI2RlZmluZSBNSURDUl9SSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUlEQ1JfVElFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIE1JRENSX01MQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBNSURDUl9NUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIHN0YXR1cyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTUlEU1JfUkJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMCisjZGVmaW5lIE1JRFNSX1JEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgd3JpdGUgcG9ydCByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTUlEV1BfTVdEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkZMCisjZGVmaW5lIE1JRFdQX01XRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgcmVhZCBwb3J0IHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBNSURSUF9NUkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRkwKKyNkZWZpbmUgTUlEUlBfTVJEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UKKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDRkdJX0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ0ZHSV9ET1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIENGR0lfRElOX0VFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBDRkdJX0VFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzdWJzeXN0ZW0gSUQgYW5kIHZlbmRvciBJRAorLy8gcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFNTVklEX1ZJRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGTAorI2RlZmluZSBTU1ZJRF9TSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMEwKKyNkZWZpbmUgU1NWSURfVklEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisjZGVmaW5lIFNTVklEX1NJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBHUElPIHBpbiBpbnRlcmZhY2UgcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEdQSU9SX1ZPTEROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBHUElPUl9WT0xVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgR1BJT1JfU0kyRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIEdQSU9SX1NJMk9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyIDIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDU1RTMl9DUkRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBBQ1NUUzJfVlNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGlucHV0IHNsb3QgdmFsaWQKKy8vIHJlZ2lzdGVyIDIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDSVNWMl9JU1YzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBBQ0lTVjJfSVNWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgQUNJU1YyX0lTVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIEFDSVNWMl9JU1Y2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TAorI2RlZmluZSBBQ0lTVjJfSVNWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgQUNJU1YyX0lTVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBMCisjZGVmaW5lIEFDSVNWMl9JU1Y5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwTAorI2RlZmluZSBBQ0lTVjJfSVNWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgQUNJU1YyX0lTVjExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIEFDSVNWMl9JU1YxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIGFkZHJlc3MKKy8vIHJlZ2lzdGVyIDIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDU0FEMl9TSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGTAorI2RlZmluZSBBQ1NBRDJfU0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBkYXRhIHJlZ2lzdGVyIDIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDU0RBMl9TRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGTAorI2RlZmluZSBBQ1NEQTJfU0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBjb250cm9sIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBJT1RDUl9JVEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgSU9UQ1JfSFJWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIElPVENSX1NSViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBJT1RDUl9EVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgSU9UQ1JfREZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIElPVENSX0REUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBJT1RDUl9KVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgSU9UQ1JfUFBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgYWRkcmVzcyBhbmQgY29udHJvbAorLy8gcmVnaXN0ZXJzIGZvciBIYXJkd2FyZSBNYXN0ZXIgVm9sdW1lLiAgCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIElPVEdQX1NBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGTAorI2RlZmluZSBJT1RHUF9NU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMEwKKyNkZWZpbmUgSU9UR1BfSU9EQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDBMCisjZGVmaW5lIElPVEdQX0lPRENfMTZfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBJT1RHUF9JT0RDXzEwX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMEwKKyNkZWZpbmUgSU9UR1BfSU9EQ18xMl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDBMCisjZGVmaW5lIElPVEdQX1dTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwTAorI2RlZmluZSBJT1RHUF9SU1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgSU9UR1BfV1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDBMCisjZGVmaW5lIElPVEdQX1dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwTAorI2RlZmluZSBJT1RHUF9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMEwKKyNkZWZpbmUgSU9UR1BfU0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisjZGVmaW5lIElPVEdQX01TS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBhZGRyZXNzIGFuZCBjb250cm9sCisvLyByZWdpc3RlcnMgZm9yIFNvdW5kIEJsYXN0ZXIKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgSU9UU0JfU0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIElPVFNCX01TS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwTAorI2RlZmluZSBJT1RTQl9JT0RDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMEwKKyNkZWZpbmUgSU9UU0JfSU9EQ18xNl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIElPVFNCX0lPRENfMTBfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTAorI2RlZmluZSBJT1RTQl9JT0RDXzEyX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMEwKKyNkZWZpbmUgSU9UU0JfV1NQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDBMCisjZGVmaW5lIElPVFNCX1JTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwTAorI2RlZmluZSBJT1RTQl9XU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMEwKKyNkZWZpbmUgSU9UU0JfV0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDBMCisjZGVmaW5lIElPVFNCX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwTAorI2RlZmluZSBJT1RTQl9TQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgSU9UU0JfTVNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIGFkZHJlc3MgYW5kIGNvbnRyb2wKKy8vIHJlZ2lzdGVycyBmb3IgRk0uCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIElPVEZNX1NBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGTAorI2RlZmluZSBJT1RGTV9NU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMEwKKyNkZWZpbmUgSU9URk1fSU9EQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDBMCisjZGVmaW5lIElPVEZNX0lPRENfMTZfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBJT1RGTV9JT0RDXzEwX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMEwKKyNkZWZpbmUgSU9URk1fSU9EQ18xMl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDBMCisjZGVmaW5lIElPVEZNX1dTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwTAorI2RlZmluZSBJT1RGTV9SU1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgSU9URk1fV1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDBMCisjZGVmaW5lIElPVEZNX1dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwTAorI2RlZmluZSBJT1RGTV9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMEwKKyNkZWZpbmUgSU9URk1fU0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisjZGVmaW5lIElPVEZNX01TS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQQy9QQ0kgcmVxdWVzdCByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUENQUlJfUkRDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwN0wKKyNkZWZpbmUgUENQUlJfUkVRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMEwKKyNkZWZpbmUgUENQUlJfUkRDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQQy9QQ0kgZ3JhbnQgcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFBDUEdSX0dEQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDdMCisjZGVmaW5lIFBDUEdSX1ZMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDBMCisjZGVmaW5lIFBDUEdSX0dEQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUEMvUENJIENvbnRyb2wgUmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFBDUENSX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGVidWcgaW5kZXggcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIERSRUdfUkVHSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGTAorI2RlZmluZSBEUkVHX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgRFJFR19SR0JLX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MDBMCisjZGVmaW5lIERSRUdfVFJBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwTAorI2lmICFkZWZpbmVkKE5PX0NTNDYxMikKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTUpCisjZGVmaW5lIERSRUdfVFJBUFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwTAorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgRFJFR19SRUdJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDBMCisjZGVmaW5lIERSRUdfUkdCS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA4TAorI2RlZmluZSBEUkVHX1JHQktfUkVHSURfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDc3RkwKKyNkZWZpbmUgRFJFR19SRUdJRF9SMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIERSRUdfUkVHSURfUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDExTAorI2RlZmluZSBEUkVHX1JFR0lEX1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMkwKKyNkZWZpbmUgRFJFR19SRUdJRF9SMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTNMCisjZGVmaW5lIERSRUdfUkVHSURfUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0TAorI2RlZmluZSBEUkVHX1JFR0lEX1I1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNUwKKyNkZWZpbmUgRFJFR19SRUdJRF9SNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTZMCisjZGVmaW5lIERSRUdfUkVHSURfUjcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE3TAorI2RlZmluZSBEUkVHX1JFR0lEX1I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOEwKKyNkZWZpbmUgRFJFR19SRUdJRF9SOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTlMCisjZGVmaW5lIERSRUdfUkVHSURfUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFBTAorI2RlZmluZSBEUkVHX1JFR0lEX1JCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQkwKKyNkZWZpbmUgRFJFR19SRUdJRF9SQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUNMCisjZGVmaW5lIERSRUdfUkVHSURfUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFETAorI2RlZmluZSBEUkVHX1JFR0lEX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRUwKKyNkZWZpbmUgRFJFR19SRUdJRF9SRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUZMCisjZGVmaW5lIERSRUdfUkVHSURfUkFfQlVTX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBEUkVHX1JFR0lEX1JBX0JVU19ISUdIICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzOEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ZQlVTX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTBMCisjZGVmaW5lIERSRUdfUkVHSURfWUJVU19ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDU4TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDFMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAyTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwM0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDRMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF81ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTA1TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfNiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNkwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzcgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDdMCisjZGVmaW5lIERSRUdfUkVHSURfSU5ESVJFQ1RfQUREUkVTUyAgICAgICAgICAgICAweDAwMDAwMTBFTAorI2RlZmluZSBEUkVHX1JFR0lEX1RPUF9PRl9TVEFDSyAgICAgICAgICAgICAgICAgMHgwMDAwMDEwRkwKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCisjaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfOCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzkgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTFMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEyTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExM0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzEyICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTRMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE1TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNkwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzE1ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTdMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xNiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE4TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOUwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzE4ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMUFMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xOSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFCTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQ0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzIxICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMURMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFFTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRkwKKyNlbmRpZgorI2VuZGlmCisjZGVmaW5lIERSRUdfUkVHSURfUlNBMF9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTQTBfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMUwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0ExX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDJMCisjZGVmaW5lIERSRUdfUkVHSURfUlNBMV9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAzTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTQTIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNEwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0EzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDVMCisjZGVmaW5lIERSRUdfUkVHSURfUlNJMF9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA2TAorI2RlZmluZSBEUkVHX1JFR0lEX1JTSTBfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwN0wKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0kxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDhMCisjZGVmaW5lIERSRUdfUkVHSURfUlNJMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA5TAorI2RlZmluZSBEUkVHX1JFR0lEX1NBR1VTVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwQUwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzAxX0xPVyAgICAgICAgICAgICAgIDB4MDAwMDAyMEJMCisjZGVmaW5lIERSRUdfUkVHSURfUlNDT05GSUcwMV9ISUdIICAgICAgICAgICAgICAweDAwMDAwMjBDTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTQ09ORklHMjNfTE9XICAgICAgICAgICAgICAgMHgwMDAwMDIwREwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzIzX0hJR0ggICAgICAgICAgICAgIDB4MDAwMDAyMEVMCisjZGVmaW5lIERSRUdfUkVHSURfUlNETUEwMUUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjBGTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTRE1BMjNFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTFMCisjZGVmaW5lIERSRUdfUkVHSURfUlNEMF9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjEyTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTRDFfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxM0wKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QxX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTRMCisjZGVmaW5lIERSRUdfUkVHSURfUlNEMl9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE1TAorI2RlZmluZSBEUkVHX1JFR0lEX1JTRDJfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNkwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QzX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTdMCisjZGVmaW5lIERSRUdfUkVHSURfUlNEM19ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE4TAorI2RlZmluZSBEUkVHX1JFR0lEX1NSQVJfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxQUwKKyNkZWZpbmUgRFJFR19SRUdJRF9TUkFSX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUJMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjFDTAorI2RlZmluZSBEUkVHX1JFR0lEX0NVUlJFTlRfRE1BX1NUUkVBTSAgICAgICAgICAgMHgwMDAwMDIxREwKKyNkZWZpbmUgRFJFR19SRUdJRF9ORVhUX0RNQV9TVFJFQU0gICAgICAgICAgICAgIDB4MDAwMDAyMUVMCisjZGVmaW5lIERSRUdfUkVHSURfQ1BVX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQ19NT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMUwKKyNkZWZpbmUgRFJFR19SRUdJRF9TVEFDS19BTkRfUkVQRUFUICAgICAgICAgICAgIDB4MDAwMDAzMDJMCisjZGVmaW5lIERSRUdfUkVHSURfSU5ERVgwICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzA0TAorI2RlZmluZSBEUkVHX1JFR0lEX0lOREVYMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNUwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMF8zICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzRfNyAgICAgICAgICAgICAgICAweDAwMDAwNDA0TAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84XzExICAgICAgICAgICAgICAgMHgwMDAwMDQwOEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMTJfMTUgICAgICAgICAgICAgIDB4MDAwMDA0MENMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzE2XzE5ICAgICAgICAgICAgICAweDAwMDAwNDEwTAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8yMF8yMyAgICAgICAgICAgICAgMHgwMDAwMDQxNEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjRfMjcgICAgICAgICAgICAgIDB4MDAwMDA0MThMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzI4XzMxICAgICAgICAgICAgICAweDAwMDAwNDFDTAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8zMl8zNSAgICAgICAgICAgICAgMHgwMDAwMDQyMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMzZfMzkgICAgICAgICAgICAgIDB4MDAwMDA0MjRMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzQwXzQzICAgICAgICAgICAgICAweDAwMDAwNDI4TAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV80NF80NyAgICAgICAgICAgICAgMHgwMDAwMDQyQ0wKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDhfNTEgICAgICAgICAgICAgIDB4MDAwMDA0MzBMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzUyXzU1ICAgICAgICAgICAgICAweDAwMDAwNDM0TAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV81Nl81OSAgICAgICAgICAgICAgMHgwMDAwMDQzOEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjBfNjMgICAgICAgICAgICAgIDB4MDAwMDA0M0NMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzY0XzY3ICAgICAgICAgICAgICAweDAwMDAwNDQwTAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV82OF83MSAgICAgICAgICAgICAgMHgwMDAwMDQ0NEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNzJfNzUgICAgICAgICAgICAgIDB4MDAwMDA0NDhMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzc2Xzc5ICAgICAgICAgICAgICAweDAwMDAwNDRDTAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84MF84MyAgICAgICAgICAgICAgMHgwMDAwMDQ1MEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODRfODcgICAgICAgICAgICAgIDB4MDAwMDA0NTRMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzg4XzkxICAgICAgICAgICAgICAweDAwMDAwNDU4TAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV85Ml85NSAgICAgICAgICAgICAgMHgwMDAwMDQ1Q0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1NFTEVDVCAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDBMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8wICAgICAgICAgICAgICAgICAweDAwMDAwNTAwTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMSAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMUwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDJMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8zICAgICAgICAgICAgICAgICAweDAwMDAwNTAzTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNCAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNEwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzUgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDVMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV82ICAgICAgICAgICAgICAgICAweDAwMDAwNTA2TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNyAgICAgICAgICAgICAgICAgMHgwMDAwMDUwN0wKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCisjaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfOCAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzkgICAgICAgICAgICAgICAgIDB4MDAwMDA1MTFMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMCAgICAgICAgICAgICAgICAweDAwMDAwNTEyTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTEgICAgICAgICAgICAgICAgMHgwMDAwMDUxM0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzEyICAgICAgICAgICAgICAgIDB4MDAwMDA1MTRMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMyAgICAgICAgICAgICAgICAweDAwMDAwNTE1TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTQgICAgICAgICAgICAgICAgMHgwMDAwMDUxNkwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzE1ICAgICAgICAgICAgICAgIDB4MDAwMDA1MTdMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xNiAgICAgICAgICAgICAgICAweDAwMDAwNTE4TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTcgICAgICAgICAgICAgICAgMHgwMDAwMDUxOUwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzE4ICAgICAgICAgICAgICAgIDB4MDAwMDA1MUFMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xOSAgICAgICAgICAgICAgICAweDAwMDAwNTFCTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjAgICAgICAgICAgICAgICAgMHgwMDAwMDUxQ0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIxICAgICAgICAgICAgICAgIDB4MDAwMDA1MURMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yMiAgICAgICAgICAgICAgICAweDAwMDAwNTFFTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjMgICAgICAgICAgICAgICAgMHgwMDAwMDUxRkwKKyNlbmRpZgorI2VuZGlmCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MwX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjAwTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMV9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwMUwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDJMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MzX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjAzTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMF9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwNEwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDVMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MyX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjA2TAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDM19MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwN0wKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MDhMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MxX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjA5TAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMl9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwQUwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEJMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MwX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjBDTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMV9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwREwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEVMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MzX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjBGTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMF9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTFMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MyX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjEyTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDM19ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxM0wKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTRMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MxX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjE1TAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMl9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxNkwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTdMCisjZGVmaW5lIERSRUdfUkVHSURfUlNIT1VUX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwNjIwTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTSE9VVF9NSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYyOEwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MzBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBTL1BESUYgQ29udHJvbCByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9TUERJRl9FTiAgICAgICAgICAgICAgICAgMHgwMDAwODAwMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9WQUwgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DT1BZICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9MICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMEwKKworI2VuZGlmIC8vIF9IX0hXREVGUwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDI4MS9jczQyODFfd3JhcHBlci0yNC5jIGIvc291bmQvb3NzL2NzNDI4MS9jczQyODFfd3JhcHBlci0yNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTlmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MV93cmFwcGVyLTI0LmMKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAiY3M0MjgxX3dyYXBwZXIuYyIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDI4MSBsaW51eCBhdWRpbyBkcml2ZXIuCisqCisqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCisqICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCisqICAgICAgICAgICAgICAgKGF1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbSkuCisqCisqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogMTIvMjAvMDAgdHJ3IC0gbmV3IGZpbGUuIAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKK3N0YXRpYyBpbnQgY3M0MjgxX3Jlc3VtZV9udWxsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbnQgY3M0MjgxX3N1c3BlbmRfbnVsbChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpIHsgcmV0dXJuIDA7IH0KKworI2RlZmluZSBmcmVlX2RtYWJ1ZihzdGF0ZSwgZG1hYnVmKSBcCisJcGNpX2ZyZWVfY29uc2lzdGVudChzdGF0ZS0+cGNpZGV2LCBcCisJCQkgICAgUEFHRV9TSVpFIDw8IChkbWFidWYpLT5idWZvcmRlciwgXAorCQkJICAgIChkbWFidWYpLT5yYXdidWYsIChkbWFidWYpLT5kbWFhZGRyKTsKKyNkZWZpbmUgZnJlZV9kbWFidWYyKHN0YXRlLCBkbWFidWYpIFwKKwlwY2lfZnJlZV9jb25zaXN0ZW50KChzdGF0ZSktPnBjaWRldiwgXAorCQkJCSAgICBQQUdFX1NJWkUgPDwgKHN0YXRlKS0+YnVmb3JkZXJfdG1wYnVmZiwgXAorCQkJCSAgICAoc3RhdGUpLT50bXBidWZmLCAoc3RhdGUpLT5kbWFhZGRyX3RtcGJ1ZmYpOworI2RlZmluZSBjczR4X3Bnb2ZmKHZtYSkgKCh2bWEpLT52bV9wZ29mZikKKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDI4MS9jczQyODFtLmMgYi9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQzOTYzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDI4MS9jczQyODFtLmMKQEAgLTAsMCArMSw0NTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICJjczQyODEuYyIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDI4MSBsaW51eCBhdWRpbyBkcml2ZXIuCisqCisqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCisqICAgICAgICAgICAgLS0gYWRhcHRlZCBmcm9tIGRyaXZlcnMgYnkgVGhvbWFzIFNhaWxlciwgCisqICAgICAgICAgICAgLS0gYnV0IGRvbid0IGJ1ZyBoaW07IFByb2JsZW1zIHNob3VsZCBnbyB0bzoKKyogICAgICAgICAgICAtLSB0b20gd29sbGVyICh0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbSkgb3IKKyogICAgICAgICAgICAgICAoYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiBNb2R1bGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnM6CisqICAgbm9uZQorKgorKiAgU3VwcG9ydGVkIGRldmljZXM6CisqICAvZGV2L2RzcCAgICBzdGFuZGFyZCAvZGV2L2RzcCBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCisqICAvZGV2L21peGVyICBzdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyogIC9kZXYvbWlkaSAgIHNpbXBsZSBNSURJIFVBUlQgaW50ZXJmYWNlLCBubyBpb2N0bAorKgorKiBNb2RpZmljYXRpb24gSGlzdG9yeQorKiAwOC8yMC8wMCB0cncgLSBzaWxlbmNlIGFuZCBubyBzdG9wcGluZyBEQUMgdW50aWwgcmVsZWFzZQorKiAwOC8yMy8wMCB0cncgLSBhZGRlZCBDU19EQkcgc3RhdGVtZW50cywgZml4IGludGVycnVwdCBoYW5nIGlzc3VlIG9uIERBQyBzdG9wLgorKiAwOS8xOC8wMCB0cncgLSBhZGRlZCAxNmJpdCBvbmx5IHJlY29yZCB3aXRoIGNvbnZlcnNpb24gCisqIDA5LzI0LzAwIHRydyAtIGFkZGVkIEVuaGFuY2VkIEZ1bGwgZHVwbGV4IChzZXBhcmF0ZSBzaW11bHRhbmVvdXMgCisqICAgICAgICAgICAgICAgIGNhcHR1cmUvcGxheWJhY2sgcmF0ZXMpCisqIDEwLzAzLzAwIHRydyAtIGZpeGVkIG1tYXAgKGZpeGVkIEdSRUNPUkQgYW5kIHRoZSBYTU1TIG1tYXAgdGVzdCBwbHVnaW4gIAorKiAgICAgICAgICAgICAgICBsaWJPU1NtLnNvKQorKiAxMC8xMS8wMCB0cncgLSBtb2RpZmllZCBmb3IgMi40LjAtdGVzdDkga2VybmVsIGVuaGFuY2VtZW50cyAoTlJfTUFQIHJlbW92YWwpCisqIDExLzAzLzAwIHRydyAtIGZpeGVkIGludGVycnVwdCBsb3NzL3N0dXR0ZXIsIGFkZGVkIGRlYnVnLgorKiAxMS8xMC8wMCBia3ogLSBhZGRlZCBfX2RldmluaXQgdG8gY3M0MjgxX2h3X2luaXQoKQorKiAxMS8xMC8wMCB0cncgLSBmaXhlZCBTTVAgYW5kIGNhcHR1cmUgc3BpbmxvY2sgaGFuZy4KKyogMTIvMDQvMDAgdHJ3IC0gY2xlYW5lZCB1cCBDU0RFQlVHIGZsYWdzIGFuZCBhZGRlZCAiZGVmYXVsdG9yZGVyIiBtb2R1bGVwYXJtLgorKiAxMi8wNS8wMCB0cncgLSBmaXhlZCBwb2xsaW5nIChteXRoMiksIGFuZCBhZGRlZCB1bmRlcnJ1biBzd3B0ciBmaXguCisqIDEyLzA4LzAwIHRydyAtIGFkZGVkIFBNIHN1cHBvcnQuIAorKiAxMi8xNC8wMCB0cncgLSBhZGRlZCB3cmFwcGVyIGNvZGUsIGJ1aWxkcyB1bmRlciAyLjQuMCwgMi4yLjE3LTIwLCAyLjIuMTctOCAKKyoJCSAoUkgvRGVsbCBiYXNlKSwgMi4yLjE4LCAyLjIuMTIuICBjbGVhbmVkIHVwIGNvZGUgbW9kcyBieSBpZGVudC4KKyogMTIvMTkvMDAgdHJ3IC0gYWRkZWQgUE0gc3VwcG9ydCBmb3IgMi4yIGJhc2UgKGFwbV9jYWxsYmFjaykuIG90aGVyIFBNIGNsZWFudXAuCisqIDEyLzIxLzAwIHRydyAtIGFkZGVkIGZyYWN0aW9uYWwgImRlZmF1bHRvcmRlciIgaW5wdXRzLiBpZiA+MTAwIHRoZW4gdXNlIAorKgkJIGRlZmF1bHRvcmRlci0xMDAgYXMgcG93ZXIgb2YgMiBmb3IgdGhlIGJ1ZmZlciBzaXplLiBleGFtcGxlOgorKgkJIDEwNiA9IDJeKDEwNi0xMDApID0gMl42ID0gNjQgYnl0ZXMgZm9yIHRoZSBidWZmZXIgc2l6ZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZGlzYWJsZSBidWlsZGluZyBQTSBzdXBwb3J0IGludG8gdGhlIGRyaXZlciAqLworLy8jZGVmaW5lIE5PVF9DUzQyODFfUE0gMSAKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLy8jaW5jbHVkZSAiY3NfZG0uaCIKKyNpbmNsdWRlICJjczQyODFfaHdkZWZzLmgiCisjaW5jbHVkZSAiY3M0MjgxcG0uaCIKKworc3RydWN0IGNzNDI4MV9zdGF0ZTsKKworc3RhdGljIHZvaWQgc3RvcF9kYWMoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKTsKK3N0YXRpYyB2b2lkIHN0YXJ0X2RhYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKTsKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKTsKKyN1bmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQ0lSUlVTCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ0lSUlVTICAgICAgICAgIDB4MTAxMworI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ1JZU1RBTF9DUzQyODEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DUllTVEFMX0NTNDI4MSAgMHg2MDA1CisjZW5kaWYKKworI2RlZmluZSBDUzQyODFfTUFHSUMgICgoUENJX0RFVklDRV9JRF9DUllTVEFMX0NTNDI4MTw8MTYpIHwgUENJX1ZFTkRPUl9JRF9DSVJSVVMpCisjZGVmaW5lCUNTNDI4MV9DRkxSX0RFRkFVTFQJMHgwMDAwMDAwMSAgLyogQ0ZMUiBtdXN0IGJlIGluIEFDOTcgbGluayBtb2RlICovCisKKy8vIGJ1ZmZlciBvcmRlciBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBkbWEgYnVmZmVyIGZvciB0aGUgZHJpdmVyLgorLy8gdW5kZXIgTGludXgsIGEgc21hbGxlciBidWZmZXIgYWxsb3dzIG1vcmUgcmVzcG9uc2l2ZW5lc3MgZnJvbSBtYW55IG9mIHRoZSAKKy8vIGFwcGxpY2F0aW9ucyAoZS5nLiBnYW1lcykuICBBIGxhcmdlciBidWZmZXIgYWxsb3dzIHNvbWUgb2YgdGhlIGFwcHMgKGVzb3VuZCkgCisvLyB0byBub3QgdW5kZXJydW4gdGhlIGRtYSBidWZmZXIgYXMgZWFzaWx5LiAgQXMgZGVmYXVsdCwgdXNlIDMyayAob3JkZXI9MykKKy8vIHJhdGhlciB0aGFuIDY0ayBhcyBzb21lIG9mIHRoZSBnYW1lcyB3b3JrIG1vcmUgcmVzcG9uc2l2ZWx5LgorLy8gbG9nIGJhc2UgMiggYnVmZiBzeiA9IDMyaykuCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0b3JkZXIgPSAzOworbW9kdWxlX3BhcmFtKGRlZmF1bHRvcmRlciwgdWxvbmcsIDApOworCisvLworLy8gVHVybiBvbi9vZmYgZGVidWdnaW5nIGNvbXBpbGF0aW9uIGJ5IGNvbW1lbnRpbmcgb3V0ICIjZGVmaW5lIENTREVCVUciCisvLworI2RlZmluZSBDU0RFQlVHIDEKKyNpZiBDU0RFQlVHCisjZGVmaW5lIENTREVCVUdfSU5URVJGQUNFIDEKKyNlbHNlCisjdW5kZWYgQ1NERUJVR19JTlRFUkZBQ0UKKyNlbmRpZgorLy8KKy8vIGNzX2RlYnVnbWFzayBhcmVhcworLy8KKyNkZWZpbmUgQ1NfSU5JVAkgCTB4MDAwMDAwMDEJLy8gaW5pdGlhbGl6YXRpb24gYW5kIHByb2JlIGZ1bmN0aW9ucworI2RlZmluZSBDU19FUlJPUiAJMHgwMDAwMDAwMgkvLyB0bXAgZGVidWdnaW5nIGJpdCBwbGFjZWhvbGRlcgorI2RlZmluZSBDU19JTlRFUlJVUFQJMHgwMDAwMDAwNAkvLyBpbnRlcnJ1cHQgaGFuZGxlciAoc2VwYXJhdGUgZnJvbSBhbGwgb3RoZXIpCisjZGVmaW5lIENTX0ZVTkNUSU9OIAkweDAwMDAwMDA4CS8vIGVudGVyL2xlYXZlIGZ1bmN0aW9ucworI2RlZmluZSBDU19XQVZFX1dSSVRFIAkweDAwMDAwMDEwCS8vIHdyaXRlIGluZm9ybWF0aW9uIGZvciB3YXZlCisjZGVmaW5lIENTX1dBVkVfUkVBRCAJMHgwMDAwMDAyMAkvLyByZWFkIGluZm9ybWF0aW9uIGZvciB3YXZlCisjZGVmaW5lIENTX01JRElfV1JJVEUgCTB4MDAwMDAwNDAJLy8gd3JpdGUgaW5mb3JtYXRpb24gZm9yIG1pZGkKKyNkZWZpbmUgQ1NfTUlESV9SRUFEIAkweDAwMDAwMDgwCS8vIHJlYWQgaW5mb3JtYXRpb24gZm9yIG1pZGkKKyNkZWZpbmUgQ1NfTVBVNDAxX1dSSVRFIDB4MDAwMDAxMDAJLy8gd3JpdGUgaW5mb3JtYXRpb24gZm9yIG1wdTQwMQorI2RlZmluZSBDU19NUFU0MDFfUkVBRCAJMHgwMDAwMDIwMAkvLyByZWFkIGluZm9ybWF0aW9uIGZvciBtcHU0MDEKKyNkZWZpbmUgQ1NfT1BFTgkJMHgwMDAwMDQwMAkvLyBhbGwgb3BlbiBmdW5jdGlvbnMgaW4gdGhlIGRyaXZlcgorI2RlZmluZSBDU19SRUxFQVNFCTB4MDAwMDA4MDAJLy8gYWxsIHJlbGVhc2UgZnVuY3Rpb25zIGluIHRoZSBkcml2ZXIKKyNkZWZpbmUgQ1NfUEFSTVMJMHgwMDAwMTAwMAkvLyBmdW5jdGlvbmFsIGFuZCBvcGVyYXRpb25hbCBwYXJhbWV0ZXJzCisjZGVmaW5lIENTX0lPQ1RMCTB4MDAwMDIwMDAJLy8gaW9jdGwgKG5vbi1taXhlcikKKyNkZWZpbmUgQ1NfUE0JCTB4MDAwMDQwMDAJLy8gcG93ZXIgbWFuYWdlbWVudCAKKyNkZWZpbmUgQ1NfVE1QCQkweDEwMDAwMDAwCS8vIHRtcCBkZWJ1ZyBtYXNrIGJpdAorCisjZGVmaW5lIENTX0lPQ1RMX0NNRF9TVVNQRU5ECTB4MQkvLyBzdXNwZW5kCisjZGVmaW5lIENTX0lPQ1RMX0NNRF9SRVNVTUUJMHgyCS8vIHJlc3VtZQorLy8KKy8vIENTREVCVUcgaXMgdXN1YWwgbW9kZSBpcyBzZXQgdG8gMSwgdGhlbiB1c2UgdGhlCisvLyBjc19kZWJ1Z2xldmVsIGFuZCBjc19kZWJ1Z21hc2sgdG8gdHVybiBvbiBvciBvZmYgZGVidWdnaW5nLgorLy8gRGVidWcgbGV2ZWwgb2YgMSBoYXMgYmVlbiBkZWZpbmVkIHRvIGJlIGtlcm5lbCBlcnJvcnMgYW5kIGluZm8KKy8vIHRoYXQgc2hvdWxkIGJlIHByaW50ZWQgb24gYW55IHJlbGVhc2VkIGRyaXZlci4KKy8vCisjaWYgQ1NERUJVRworI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KSBpZigoY3NfZGVidWdsZXZlbCA+PSAobGV2ZWwpKSAmJiAoKG1hc2spICYgY3NfZGVidWdtYXNrKSApIHt4O30KKyNlbHNlCisjZGVmaW5lIENTX0RCR09VVChtYXNrLGxldmVsLHgpCisjZW5kaWYKKworI2lmIENTREVCVUcKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNzX2RlYnVnbGV2ZWwgPSAxOwkvLyBsZXZlbHMgcmFuZ2UgZnJvbSAxLTkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNzX2RlYnVnbWFzayA9IENTX0lOSVQgfCBDU19FUlJPUjsJLy8gdXNlIENTX0RCR09VVCB3aXRoIHZhcmlvdXMgbWFzayB2YWx1ZXMKK21vZHVsZV9wYXJhbShjc19kZWJ1Z2xldmVsLCB1bG9uZywgMCk7Cittb2R1bGVfcGFyYW0oY3NfZGVidWdtYXNrLCB1bG9uZywgMCk7CisjZW5kaWYKKyNkZWZpbmUgQ1NfVFJVRSAJMQorI2RlZmluZSBDU19GQUxTRSAJMAorCisvLyBNSURJIGJ1ZmZlciBzaXplcyAKKyNkZWZpbmUgTUlESUlOQlVGICA1MDAKKyNkZWZpbmUgTUlESU9VVEJVRiA1MDAKKworI2RlZmluZSBGTU9ERV9NSURJX1NISUZUIDMKKyNkZWZpbmUgRk1PREVfTUlESV9SRUFEICAoRk1PREVfUkVBRCA8PCBGTU9ERV9NSURJX1NISUZUKQorI2RlZmluZSBGTU9ERV9NSURJX1dSSVRFIChGTU9ERV9XUklURSA8PCBGTU9ERV9NSURJX1NISUZUKQorCisjZGVmaW5lIENTNDI4MV9NQUpPUl9WRVJTSU9OIAkxCisjZGVmaW5lIENTNDI4MV9NSU5PUl9WRVJTSU9OIAkxMworI2lmZGVmIF9faWE2NF9fCisjZGVmaW5lIENTNDI4MV9BUkNICSAgICAgCTY0CS8vYXJjaGl0ZWN0dXJlIGtleQorI2Vsc2UKKyNkZWZpbmUgQ1M0MjgxX0FSQ0gJICAgICAJMzIJLy9hcmNoaXRlY3R1cmUga2V5CisjZW5kaWYKKworI2RlZmluZSBDU19UWVBFX0FEQyAwCisjZGVmaW5lIENTX1RZUEVfREFDIDEKKworCitzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPQorICAgIEtFUk5fQ1JJVCAiY3M0MjgxOiBpbnZhbGlkIG1hZ2ljIHZhbHVlXG4iOworCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShzKSB8fCAocyktPm1hZ2ljICE9IENTNDI4MV9NQUdJQykgeyBcCisgICAgICAgICAgICAgICAgcHJpbnRrKGludmFsaWRfbWFnaWMpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisvL0xJU1RfSEVBRChjczQyODFfZGV2cyk7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBjczQyODFfZGV2cyA9IHsgJmNzNDI4MV9kZXZzLCAmY3M0MjgxX2RldnMgfTsKKworc3RydWN0IGNzNDI4MV9zdGF0ZTsgCisKKyNpbmNsdWRlICJjczQyODFfd3JhcHBlci0yNC5jIgorCitzdHJ1Y3QgY3M0MjgxX3N0YXRlIHsKKwkvLyBtYWdpYyAKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisKKwkvLyB3ZSBrZWVwIHRoZSBjYXJkcyBpbiBhIGxpbmtlZCBsaXN0IAorCXN0cnVjdCBjczQyODFfc3RhdGUgKm5leHQ7CisKKwkvLyBwY2lkZXYgaXMgbmVlZGVkIHRvIHR1cm4gb2ZmIHRoZSBERE1BIGNvbnRyb2xsZXIgYXQgZHJpdmVyIHNodXRkb3duIAorCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLy8gc291bmRjb3JlIHN0dWZmIAorCWludCBkZXZfYXVkaW87CisJaW50IGRldl9taXhlcjsKKwlpbnQgZGV2X21pZGk7CisKKwkvLyBoYXJkd2FyZSByZXNvdXJjZXMgCisJdW5zaWduZWQgaW50IHBCQTBwaHlzLCBwQkExcGh5czsKKwljaGFyIF9faW9tZW0gKnBCQTA7CisJY2hhciBfX2lvbWVtICpwQkExOworCXVuc2lnbmVkIGludCBpcnE7CisKKwkvLyBtaXhlciByZWdpc3RlcnMgCisJc3RydWN0IHsKKwkJdW5zaWduZWQgc2hvcnQgdm9sWzEwXTsKKwkJdW5zaWduZWQgaW50IHJlY3NyYzsKKwkJdW5zaWduZWQgaW50IG1vZGNudDsKKwkJdW5zaWduZWQgc2hvcnQgbWljcHJlYW1wOworCX0gbWl4OworCisJLy8gd2F2ZSBzdHVmZiAgIAorCXN0cnVjdCBwcm9wZXJ0aWVzIHsKKwkJdW5zaWduZWQgZm10OworCQl1bnNpZ25lZCBmbXRfb3JpZ2luYWw7CS8vIG9yaWdpbmFsIHJlcXVlc3RlZCBmb3JtYXQKKwkJdW5zaWduZWQgY2hhbm5lbHM7CisJCXVuc2lnbmVkIHJhdGU7CisJCXVuc2lnbmVkIGNoYXIgY2xrZGl2OworCX0gcHJvcF9kYWMsIHByb3BfYWRjOworCXVuc2lnbmVkIGNvbnZlcnNpb246MTsJLy8gY29udmVyc2lvbiBmcm9tIDE2IHRvIDggYml0IGluIHByb2dyZXNzCisJdm9pZCAqdG1wYnVmZjsJCS8vIHRtcCBidWZmZXIgZm9yIHNhbXBsZSBjb252ZXJzaW9ucworCXVuc2lnbmVkIGVuYTsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtX2FkYzsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtX2RhYzsKKwltb2RlX3Qgb3Blbl9tb2RlOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXRfYWRjOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdF9kYWM7CisKKwlkbWFfYWRkcl90IGRtYWFkZHJfdG1wYnVmZjsKKwl1bnNpZ25lZCBidWZvcmRlcl90bXBidWZmOwkvLyBMb2cgYmFzZSAyIG9mICdyYXdidWYnIHNpemUgaW4gYnl0ZXMuLgorCXN0cnVjdCBkbWFidWYgeworCQl2b2lkICpyYXdidWY7CS8vIFBoeXNpY2FsIGFkZHJlc3Mgb2YgIAorCQlkbWFfYWRkcl90IGRtYWFkZHI7CisJCXVuc2lnbmVkIGJ1Zm9yZGVyOwkvLyBMb2cgYmFzZSAyIG9mICdyYXdidWYnIHNpemUgaW4gYnl0ZXMuLgorCQl1bnNpZ25lZCBudW1mcmFnOwkvLyAjIG9mICdmcmFnbWVudHMnIGluIHRoZSBidWZmZXIuCisJCXVuc2lnbmVkIGZyYWdzaGlmdDsJLy8gTG9nIGJhc2UgMiBvZiBmcmFnbWVudCBzaXplLgorCQl1bnNpZ25lZCBod3B0ciwgc3dwdHI7CisJCXVuc2lnbmVkIHRvdGFsX2J5dGVzOwkvLyAjIGJ5dGVzIHByb2Nlc3Mgc2luY2Ugb3Blbi4KKwkJdW5zaWduZWQgYmxvY2tzOwkvLyBsYXN0IHJldHVybmVkIGJsb2NrcyB2YWx1ZSBHRVRPUFRSCisJCXVuc2lnbmVkIHdha2V1cDsJLy8gaW50ZXJydXB0IG9jY3VycmVkIG9uIGJsb2NrIAorCQlpbnQgY291bnQ7CisJCXVuc2lnbmVkIHVuZGVycnVuOwkvLyB1bmRlcnJ1biBmbGFnCisJCXVuc2lnbmVkIGVycm9yOwkvLyBvdmVyL3VuZGVycnVuIAorCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCQkvLyByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyIAorCQl1bnNpZ25lZCBmcmFnc2l6ZTsJLy8gMioqZnJhZ3NoaWZ0Li4KKwkJdW5zaWduZWQgZG1hc2l6ZTsJLy8gMioqYnVmb3JkZXIuCisJCXVuc2lnbmVkIGZyYWdzYW1wbGVzOworCQkvLyBPU1Mgc3R1ZmYgCisJCXVuc2lnbmVkIG1hcHBlZDoxOwkvLyBCdWZmZXIgbWFwcGVkIGluIGNzNDI4MV9tbWFwKCk/CisJCXVuc2lnbmVkIHJlYWR5OjE7CS8vIHByb2dfZG1hYnVmX2RhYygpL2FkYygpIHN1Y2Nlc3NmdWw/CisJCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKKwkJdW5zaWduZWQgdHlwZToxOwkvLyBhZGMgb3IgZGFjIGJ1ZmZlciAoQ1NfVFlQRV9YWFgpCisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwl9IGRtYV9kYWMsIGRtYV9hZGM7CisKKwkvLyBtaWRpIHN0dWZmIAorCXN0cnVjdCB7CisJCXVuc2lnbmVkIGlyZCwgaXdyLCBpY250OworCQl1bnNpZ25lZCBvcmQsIG93ciwgb2NudDsKKwkJd2FpdF9xdWV1ZV9oZWFkX3QgaXdhaXQ7CisJCXdhaXRfcXVldWVfaGVhZF90IG93YWl0OworCQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwkJdW5zaWduZWQgY2hhciBpYnVmW01JRElJTkJVRl07CisJCXVuc2lnbmVkIGNoYXIgb2J1ZltNSURJT1VUQlVGXTsKKwl9IG1pZGk7CisKKwlzdHJ1Y3QgY3M0MjgxX3BtIHBtOworCXN0cnVjdCBjczQyODFfcGlwZWxpbmUgcGxbQ1M0MjgxX05VTUJFUl9PRl9QSVBFTElORVNdOworfTsKKworI2luY2x1ZGUgImNzNDI4MXBtLTI0LmMiCisKKyNpZiBDU0RFQlVHCisKKy8vIERFQlVHIFJPVVRJTkVTCisKKyNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUwgCV9TSU9XUignTScsMTIwLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMIAlfU0lPV1IoJ00nLDEyMSwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLIAlfU0lPV1IoJ00nLDEyMiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLIAlfU0lPV1IoJ00nLDEyMywgaW50KQorCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX0FQTQkgCV9TSU9XUignTScsMTI0LCBpbnQpCisKKworc3RhdGljIHZvaWQgY3NfcHJpbnRpb2N0bCh1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHZpZHg7CisJLy8gSW5kZXggb2YgbWl4dGFibGUxW10gbWVtYmVyIGlzIERldmljZSBJRCAKKwkvLyBhbmQgbXVzdCBiZSA8PSBTT1VORF9NSVhFUl9OUkRFVklDRVMuCisJLy8gVmFsdWUgb2YgYXJyYXkgbWVtYmVyIGlzIGluZGV4IGludG8gcy0+bWl4LnZvbFtdCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWl4dGFibGUxW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7CisJCVtTT1VORF9NSVhFUl9QQ01dID0gMSwJLy8gdm9pY2UgCisJCVtTT1VORF9NSVhFUl9MSU5FMV0gPSAyLAkvLyBBVVgKKwkJW1NPVU5EX01JWEVSX0NEXSA9IDMsCS8vIENEIAorCQlbU09VTkRfTUlYRVJfTElORV0gPSA0LAkvLyBMaW5lIAorCQlbU09VTkRfTUlYRVJfU1lOVEhdID0gNSwJLy8gRk0KKwkJW1NPVU5EX01JWEVSX01JQ10gPSA2LAkvLyBNaWMgCisJCVtTT1VORF9NSVhFUl9TUEVBS0VSXSA9IDcsCS8vIFNwZWFrZXIgCisJCVtTT1VORF9NSVhFUl9SRUNMRVZdID0gOCwJLy8gUmVjb3JkaW5nIGxldmVsIAorCQlbU09VTkRfTUlYRVJfVk9MVU1FXSA9IDkJLy8gTWFzdGVyIFZvbHVtZSAKKwl9OworCisJc3dpdGNoICh4KSB7CisJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJICBwcmludGsoIlNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUw6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJPU1NfR0VUVkVSU0lPTjpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NZTkM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVERVUExFWDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVENBUFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfUkVTRVQ6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1BFRUQ6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NURVJFTzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9DSEFOTkVMUzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVEZNVFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZNVDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1BPU1Q6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRUUklHR0VSOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VUVFJJR0dFUjpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT1NQQUNFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRJU1BBQ0U6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfTk9OQkxPQ0s6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9ERUxBWTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVElQVFI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRPUFRSOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUQkxLU0laRTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1VCRElWSURFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9SQVRFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX0JJVFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJICBwcmludGsoIlNPVU5EX1BDTV9XUklURV9GSUxURVI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVFNZTkNSTzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9GSUxURVI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTE6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFMTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEUyOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUzOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFNDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFNToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEU1OlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0lORk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9JTkZPOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX09MRF9NSVhFUl9JTkZPOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfT0xEX01JWEVSX0lORk86XG4iKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3dpdGNoIChfSU9DX05SKHgpKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9WT0xVTUU6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9TUEVBS0VSOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TUEVBS0VSOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDTEVWOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9SRUNMRVY6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkJICBwcmludGsoIlNPVU5EX01JWEVSX01JQzpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TWU5USDpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCQkgIHByaW50aygiU09VTkRfTUlYRVJfUkVDU1JDOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCQkgIHByaW50aygiU09VTkRfTUlYRVJfREVWTUFTSzpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkJICBwcmludGsoIlNPVU5EX01JWEVSX1JFQ01BU0s6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TVEVSRU9ERVZTOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DQVBTOlxuIikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpID0gX0lPQ19OUih4KTsKKwkJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUworCQkJICAgIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpIHsKKwkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aworCQkJCQkoIlVOS05PV04gSU9DVEw6IDB4JS44eCBOUj0lZFxuIiwKKwkJCQkJCXgsIGkpKTsKKwkJCX0gZWxzZSB7CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsKKwkJCQkJKCJTT1VORF9NSVhFUl9JT0NUTCBBQzl4OiAweCUuOHggTlI9JWRcbiIsCisJCQkJCQl4LCBpKSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKyNlbmRpZgorc3RhdGljIGludCBwcm9nX2RtYWJ1Zl9hZGMoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBwcm9nX2NvZGVjKHN0cnVjdCBjczQyODFfc3RhdGUgKnMsIHVuc2lnbmVkIHR5cGUpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLworLy8gICAgICAgICAgICAgIEhhcmR3YXJlIEludGVyZmFjZXMgRm9yIHRoZSBDUzQyODEKKy8vCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICJkZWxheXVzKCktLSBEZWxheSBmb3IgdGhlIHNwZWNpZmllZCAjIG9mIG1pY3Jvc2Vjb25kcy4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZCBkZWxheXVzKHN0cnVjdCBjczQyODFfc3RhdGUgKnMsIHUzMiBkZWxheSkKK3sKKwl1MzIgajsKKwlpZiAoKGRlbGF5ID4gOTk5OSkgJiYgKHMtPnBtLmZsYWdzICYgQ1M0MjgxX1BNX0lETEUpKSB7CisJCWogPSAoZGVsYXkgKiBIWikgLyAxMDAwMDAwOwkvKiBjYWxjdWxhdGUgZGVsYXkgaW4gamlmZmllcyAgKi8KKwkJaWYgKGogPCAxKQorCQkJaiA9IDE7CS8qIG1pbmltdW0gb25lIGppZmZ5LiAqLworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KGopOworCX0gZWxzZQorCQl1ZGVsYXkoZGVsYXkpOworCXJldHVybjsKK30KKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gImNzNDI4MV9yZWFkX2FjOTciIC0tIFJlYWRzIGEgd29yZCBmcm9tIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlCisvLyAgICAgICAgICAgICAgIENTNDI4MSdzIGFkZHJlc3Mgc3BhY2UoYmFzZWQgb24gdGhlIEJBMCByZWdpc3RlcikuCisvLworLy8gMS4gV3JpdGUgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoIGZvciBBQzk3IHJlZ2lzdGVyIGFkZHJlc3MKKy8vIDIuIFdyaXRlIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaCBmb3IgZGF0YSB0byB3cml0ZSB0byBBQzk3IHJlZ2lzdGVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBoIGZvciByZWFkcy4KKy8vIDMuIFdyaXRlIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGggZm9yIGluaXRpYXRpbmcgdGhlIHdyaXRlCisvLyA0LiBSZWFkIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAxN2gKKy8vIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgorLy8gNi4gUmVhZCBBQ1NUUyA9IFN0YXR1cyBSZWdpc3RlciA9IDQ2NGgsIGNoZWNrIFZTVFMgYml0CisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQgY3M0MjgxX3JlYWRfYWM5NyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpjYXJkLCB1MzIgb2Zmc2V0LAorCQkJICAgIHUzMiAqIHZhbHVlKQoreworCXUzMiBjb3VudCwgc3RhdHVzOworCisJLy8gTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgbm90IGRhdGEgc2l0dGluZworCS8vIGFyb3VuZCBmcm9tIGEgcHJldmlvdXMgdW5jb21wbGV0ZWQgYWNjZXNzLgorCS8vIEFDU0RBID0gU3RhdHVzIERhdGEgUmVnaXN0ZXIgPSA0N0NoCisJc3RhdHVzID0gcmVhZGwoY2FyZC0+cEJBMCArIEJBMF9BQ1NEQSk7CisKKwkvLyBTZXR1cCB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVycyBvbiB0aGUgQ1M0MjgxIHRvIHNlbmQgdGhlCisJLy8gYXBwcm9wcmlhdGUgY29tbWFuZCB0byB0aGUgQUM5NyB0byBwZXJmb3JtIHRoZSByZWFkLgorCS8vIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaAorCS8vIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaAorCS8vIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGgKKwkvLyBiaXQgRENWIC0gd2lsbCBjbGVhciB3aGVuIHByb2Nlc3MgY29tcGxldGVkCisJLy8gYml0IENSVyAtIFJlYWQgY29tbWFuZAorCS8vIGJpdCBWRlJNIC0gdmFsaWQgZnJhbWUgZW5hYmxlZAorCS8vIGJpdCBFU1lOIC0gQVNZTkMgZ2VuZXJhdGlvbiBlbmFibGVkCisKKwkvLyBHZXQgdGhlIGFjdHVhbCBBQzk3IHJlZ2lzdGVyIGZyb20gdGhlIG9mZnNldAorCXdyaXRlbChvZmZzZXQgLSBCQTBfQUM5N19SRVNFVCwgY2FyZC0+cEJBMCArIEJBMF9BQ0NBRCk7CisJd3JpdGVsKDAsIGNhcmQtPnBCQTAgKyBCQTBfQUNDREEpOworCXdyaXRlbChBQ0NUTF9EQ1YgfCBBQ0NUTF9DUlcgfCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiwKKwkgICAgICAgY2FyZC0+cEJBMCArIEJBMF9BQ0NUTCk7CisKKwkvLyBXYWl0IGZvciB0aGUgcmVhZCB0byBvY2N1ci4KKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDsgY291bnQrKykgeworCQkvLyBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCisJCXVkZWxheSgyNSk7CisKKwkJLy8gTm93LCBjaGVjayB0byBzZWUgaWYgdGhlIHJlYWQgaGFzIGNvbXBsZXRlZC4KKwkJLy8gQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDE3aAorCQlpZiAoIShyZWFkbChjYXJkLT5wQkEwICsgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikpCisJCQlicmVhazsKKwl9CisKKwkvLyBNYWtlIHN1cmUgdGhlIHJlYWQgY29tcGxldGVkLgorCWlmIChyZWFkbChjYXJkLT5wQkEwICsgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikKKwkJcmV0dXJuIDE7CisKKwkvLyBXYWl0IGZvciB0aGUgdmFsaWQgc3RhdHVzIGJpdCB0byBnbyBhY3RpdmUuCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTA7IGNvdW50KyspIHsKKwkJLy8gUmVhZCB0aGUgQUM5NyBzdGF0dXMgcmVnaXN0ZXIuCisJCS8vIEFDU1RTID0gU3RhdHVzIFJlZ2lzdGVyID0gNDY0aAorCQlzdGF0dXMgPSByZWFkbChjYXJkLT5wQkEwICsgQkEwX0FDU1RTKTsKKworCQkvLyBTZWUgaWYgd2UgaGF2ZSB2YWxpZCBzdGF0dXMuCisJCS8vIFZTVFMgLSBWYWxpZCBTdGF0dXMKKwkJaWYgKHN0YXR1cyAmIEFDU1RTX1ZTVFMpCisJCQlicmVhazsKKwkJLy8gV2FpdCBmb3IgYSBzaG9ydCB3aGlsZS4KKwkJdWRlbGF5KDI1KTsKKwl9CisKKwkvLyBNYWtlIHN1cmUgd2UgZ290IHZhbGlkIHN0YXR1cy4KKwlpZiAoIShzdGF0dXMgJiBBQ1NUU19WU1RTKSkKKwkJcmV0dXJuIDE7CisKKwkvLyBSZWFkIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIEFDOTcgcmVnaXN0ZXIuCisJLy8gQUNTREEgPSBTdGF0dXMgRGF0YSBSZWdpc3RlciA9IDQ3NGgKKwkqdmFsdWUgPSByZWFkbChjYXJkLT5wQkEwICsgQkEwX0FDU0RBKTsKKworCS8vIFN1Y2Nlc3MuCisJcmV0dXJuICgwKTsKK30KKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyAiY3M0MjgxX3dyaXRlX2FjOTcoKSItLSB3cml0ZXMgYSB3b3JkIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlCisvLyBDUzQ2MXgncyBhZGRyZXNzIHNwYWNlIChiYXNlZCBvbiB0aGUgcGFydCdzIGJhc2UgYWRkcmVzcyB6ZXJvIHJlZ2lzdGVyKS4KKy8vCisvLyAxLiBXcml0ZSBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2ggZm9yIEFDOTcgcmVnaXN0ZXIgYWRkcmVzcworLy8gMi4gV3JpdGUgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoIGZvciBkYXRhIHRvIHdyaXRlIHRvIEFDOTcgcmVnLgorLy8gMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGUKKy8vIDQuIFJlYWQgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDA3aAorLy8gNS4gaWYgRENWIG5vdCBjbGVhcmVkLCBicmVhayBhbmQgcmV0dXJuIGVycm9yCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50IGNzNDI4MV93cml0ZV9hYzk3KHN0cnVjdCBjczQyODFfc3RhdGUgKmNhcmQsIHUzMiBvZmZzZXQsCisJCQkgICAgIHUzMiB2YWx1ZSkKK3sKKwl1MzIgY291bnQsIHN0YXR1cz0wOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3NfNDI4MV93cml0ZV9hYzk3KCkrIFxuIikpOworCisJLy8gU2V0dXAgdGhlIEFDOTcgY29udHJvbCByZWdpc3RlcnMgb24gdGhlIENTNDI4MSB0byBzZW5kIHRoZQorCS8vIGFwcHJvcHJpYXRlIGNvbW1hbmQgdG8gdGhlIEFDOTcgdG8gcGVyZm9ybSB0aGUgcmVhZC4KKwkvLyBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2gKKwkvLyBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGgKKwkvLyBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoCisJLy8gc2V0IERDViAtIHdpbGwgY2xlYXIgd2hlbiBwcm9jZXNzIGNvbXBsZXRlZAorCS8vIHJlc2V0IENSVyAtIFdyaXRlIGNvbW1hbmQKKwkvLyBzZXQgVkZSTSAtIHZhbGlkIGZyYW1lIGVuYWJsZWQKKwkvLyBzZXQgRVNZTiAtIEFTWU5DIGdlbmVyYXRpb24gZW5hYmxlZAorCS8vIHNldCBSU1ROIC0gQVJTVCMgaW5hY3RpdmUsIEFDOTcgY29kZWMgbm90IHJlc2V0CisKKwkvLyBHZXQgdGhlIGFjdHVhbCBBQzk3IHJlZ2lzdGVyIGZyb20gdGhlIG9mZnNldAorCisJd3JpdGVsKG9mZnNldCAtIEJBMF9BQzk3X1JFU0VULCBjYXJkLT5wQkEwICsgQkEwX0FDQ0FEKTsKKwl3cml0ZWwodmFsdWUsIGNhcmQtPnBCQTAgKyBCQTBfQUNDREEpOworCXdyaXRlbChBQ0NUTF9EQ1YgfCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiwKKwkgICAgICAgY2FyZC0+cEJBMCArIEJBMF9BQ0NUTCk7CisKKwkvLyBXYWl0IGZvciB0aGUgd3JpdGUgdG8gb2NjdXIuCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrKSB7CisJCS8vIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KKwkJdWRlbGF5KDI1KTsKKwkJLy8gTm93LCBjaGVjayB0byBzZWUgaWYgdGhlIHdyaXRlIGhhcyBjb21wbGV0ZWQuCisJCS8vIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAwN2gKKwkJc3RhdHVzID0gcmVhZGwoY2FyZC0+cEJBMCArIEJBMF9BQ0NUTCk7CisJCWlmICghKHN0YXR1cyAmIEFDQ1RMX0RDVikpCisJCQlicmVhazsKKwl9CisKKwkvLyBNYWtlIHN1cmUgdGhlIHdyaXRlIGNvbXBsZXRlZC4KKwlpZiAoc3RhdHVzICYgQUNDVExfRENWKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTworCSAgICAgIAkJImNzNDI4MTogY3NfNDI4MV93cml0ZV9hYzk3KCktIHVuYWJsZSB0byB3cml0ZS4gQUNDVExfRENWIGFjdGl2ZVxuIikpOworCQlyZXR1cm4gMTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3NfNDI4MV93cml0ZV9hYzk3KCktIDBcbiIpKTsKKwkvLyBTdWNjZXNzLgorCXJldHVybiAwOworfQorCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAiSW5pdDQyODEoKSIgLS0gQnJpbmcgdXAgdGhlIHBhcnQuCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIF9fZGV2aW5pdCBpbnQgY3M0MjgxX2h3X2luaXQoc3RydWN0IGNzNDI4MV9zdGF0ZSAqY2FyZCkKK3sKKwl1MzIgYWM5N19zbG90aWQ7CisJdTMyIHRlbXAxLCB0ZW1wMjsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV9od19pbml0KCkrIFxuIikpOworI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisJaWYoIWNhcmQpCisJCXJldHVybiAxOworI2VuZGlmCisJdGVtcDIgPSByZWFkbChjYXJkLT5wQkEwICsgQkEwX0NGTFIpOworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IgfCBDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDI4MTogY3M0MjgxX2h3X2luaXQoKSBDRkxSIDB4JXhcbiIsIHRlbXAyKSk7CisJaWYodGVtcDIgIT0gQ1M0MjgxX0NGTFJfREVGQVVMVCkKKwl7CisJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkiY3M0MjgxOiBjczQyODFfaHdfaW5pdCgpIENGTFIgaW52YWxpZCAtIHJlc2V0dGluZyBmcm9tIDB4JXggdG8gMHgleFxuIiwKKwkJCQl0ZW1wMixDUzQyODFfQ0ZMUl9ERUZBVUxUKSk7CisJCXdyaXRlbChDUzQyODFfQ0ZMUl9ERUZBVUxULCBjYXJkLT5wQkEwICsgQkEwX0NGTFIpOworCQl0ZW1wMiA9IHJlYWRsKGNhcmQtPnBCQTAgKyBCQTBfQ0ZMUik7CisJCWlmKHRlbXAyICE9IENTNDI4MV9DRkxSX0RFRkFVTFQpCisJCXsKKwkJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkJImNzNDI4MTogY3M0MjgxX2h3X2luaXQoKSBJbnZhbGlkIGhhcmR3YXJlIC0gdW5hYmxlIHRvIGNvbmZpZ3VyZSBDRkxSXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqNworCS8vICBTZXQgdXAgdGhlIFNvdW5kIFN5c3RlbSBDb25maWd1cmF0aW9uCisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCS8vIFNldCB0aGUgJ0NvbmZpZ3VyYXRpb24gV3JpdGUgUHJvdGVjdCcgcmVnaXN0ZXIKKwkvLyB0byA0MjgxaC4gIEFsbG93cyB2ZW5kb3ItZGVmaW5lZCBjb25maWd1cmF0aW9uCisJLy8gc3BhY2UgYmV0d2VlbiAwZTRoIGFuZCAwZmZoIHRvIGJlIHdyaXR0ZW4uCisKKwl3cml0ZWwoMHg0MjgxLCBjYXJkLT5wQkEwICsgQkEwX0NXUFIpOwkvLyAoM2UwaCkKKworCS8vICgwKSwgQmxhc3QgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgdG8gemVybyBzbyB0aGF0IHRoZQorCS8vIFBMTCBzdGFydHMgb3V0IGluIGEga25vd24gc3RhdGUsIGFuZCBibGFzdCB0aGUgbWFzdGVyIHNlcmlhbAorCS8vIHBvcnQgY29udHJvbCByZWdpc3RlciB0byB6ZXJvIHNvIHRoYXQgdGhlIHNlcmlhbCBwb3J0cyBhbHNvCisJLy8gc3RhcnQgb3V0IGluIGEga25vd24gc3RhdGUuCisKKwl3cml0ZWwoMCwgY2FyZC0+cEJBMCArIEJBMF9DTEtDUjEpOwkvLyAoNDAwaCkKKwl3cml0ZWwoMCwgY2FyZC0+cEJBMCArIEJBMF9TRVJNQyk7CS8vICg0MjBoKQorCisKKwkvLyAoMSksIE1ha2UgRVNZTiBnbyB0byB6ZXJvIHRvIHR1cm4gb2ZmCisJLy8gdGhlIFN5bmMgcHVsc2Ugb24gdGhlIEFDOTcgbGluay4KKworCXdyaXRlbCgwLCBjYXJkLT5wQkEwICsgQkEwX0FDQ1RMKTsKKwl1ZGVsYXkoNTApOworCisKKwkvLyAoMikgRHJpdmUgdGhlIEFSU1QjIHBpbiBsb3cgZm9yIGEgbWluaW11bSBvZiAxdVMgKGFzIGRlZmluZWQgaW4KKwkvLyB0aGUgQUM5NyBzcGVjKSBhbmQgdGhlbiBkcml2ZSBpdCBoaWdoLiAgVGhpcyBpcyBkb25lIGZvciBub24KKwkvLyBBQzk3IG1vZGVzIHNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvZ2ljIGV4dGVybmFsIHRvIHRoZSBDUzQ2MXgKKwkvLyB0aGF0IHVzZXMgdGhlIEFSU1QjIGxpbmUgZm9yIGEgcmVzZXQuCisKKwl3cml0ZWwoMCwgY2FyZC0+cEJBMCArIEJBMF9TUE1DKTsJLy8gKDNlY2gpCisJdWRlbGF5KDEwMCk7CisJd3JpdGVsKFNQTUNfUlNUTiwgY2FyZC0+cEJBMCArIEJBMF9TUE1DKTsKKwlkZWxheXVzKGNhcmQsNTAwMDApOwkJLy8gV2FpdCA1MCBtcyBmb3IgQUJJVENMSyB0byBiZWNvbWUgc3RhYmxlLgorCisJLy8gKDMpIFR1cm4gb24gdGhlIFNvdW5kIFN5c3RlbSBDbG9ja3MuCisJd3JpdGVsKENMS0NSMV9QTExQLCBjYXJkLT5wQkEwICsgQkEwX0NMS0NSMSk7CS8vICg0MDBoKQorCWRlbGF5dXMoY2FyZCw1MDAwMCk7CQkvLyBXYWl0IGZvciB0aGUgUExMIHRvIHN0YWJpbGl6ZS4KKwkvLyBUdXJuIG9uIGNsb2NraW5nIG9mIHRoZSBjb3JlIChDTEtDUjEoNDAwaCkgPSAweDAwMDAwMDMwKQorCXdyaXRlbChDTEtDUjFfUExMUCB8IENMS0NSMV9TV0NFLCBjYXJkLT5wQkEwICsgQkEwX0NMS0NSMSk7CisKKwkvLyAoNCkgUG93ZXIgb24gZXZlcnl0aGluZyBmb3Igbm93Li4KKwl3cml0ZWwoMHg3RSwgY2FyZC0+cEJBMCArIEJBMF9TU1BNKTsJLy8gKDc0MGgpCisKKwkvLyAoNSkgV2FpdCBmb3IgY2xvY2sgc3RhYmlsaXphdGlvbi4KKwlmb3IgKHRlbXAxID0gMDsgdGVtcDEgPCAxMDAwOyB0ZW1wMSsrKSB7CisJCXVkZWxheSgxMDAwKTsKKwkJaWYgKHJlYWRsKGNhcmQtPnBCQTAgKyBCQTBfQ0xLQ1IxKSAmIENMS0NSMV9ETExSRFkpCisJCQlicmVhazsKKwl9CisJaWYgKCEocmVhZGwoY2FyZC0+cEJBMCArIEJBMF9DTEtDUjEpICYgQ0xLQ1IxX0RMTFJEWSkpIHsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIgCisJCQkiY3M0MjgxOiBETExSRFkgZmFpbGVkIVxuIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLy8gKDYpIEVuYWJsZSBBU1lOQyBnZW5lcmF0aW9uLgorCXdyaXRlbChBQ0NUTF9FU1lOLCBjYXJkLT5wQkEwICsgQkEwX0FDQ1RMKTsJLy8gKDQ2MGgpCisKKwkvLyBOb3cgd2FpdCAnZm9yIGEgc2hvcnQgd2hpbGUnIHRvIGFsbG93IHRoZSAgQUM5NworCS8vIHBhcnQgdG8gc3RhcnQgZ2VuZXJhdGluZyBiaXQgY2xvY2suIChzbyB3ZSBkb24ndAorCS8vIFRyeSB0byBzdGFydCB0aGUgUExMIHdpdGhvdXQgYW4gaW5wdXQgY2xvY2suKQorCWRlbGF5dXMoY2FyZCw1MDAwMCk7CisKKwkvLyBTZXQgdGhlIHNlcmlhbCBwb3J0IHRpbWluZyBjb25maWd1cmF0aW9uLCBzbyB0aGF0IHRoZQorCS8vIGNsb2NrIGNvbnRyb2wgY2lyY3VpdCBnZXRzIGl0cyBjbG9jayBmcm9tIHRoZSByaWdodCBwbGFjZS4KKwl3cml0ZWwoU0VSTUNfUFRDX0FDOTcsIGNhcmQtPnBCQTAgKyBCQTBfU0VSTUMpOwkvLyAoNDIwaCk9Mi4KKworCS8vICg3KSBXYWl0IGZvciB0aGUgY29kZWMgcmVhZHkgc2lnbmFsIGZyb20gdGhlIEFDOTcgY29kZWMuCisKKwlmb3IgKHRlbXAxID0gMDsgdGVtcDEgPCAxMDAwOyB0ZW1wMSsrKSB7CisJCS8vIERlbGF5IGEgbWlsIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhbmQKKwkJLy8gdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KKwkJdWRlbGF5KDEwMDApOworCQlpZiAocmVhZGwoY2FyZC0+cEJBMCArIEJBMF9BQ1NUUykgJiBBQ1NUU19DUkRZKQkvLyBJZiByZWFkeSwgICg0NjRoKQorCQkJYnJlYWs7CS8vICAgZXhpdCB0aGUgJ2ZvcicgbG9vcC4KKwl9CisJaWYgKCEocmVhZGwoY2FyZC0+cEJBMCArIEJBMF9BQ1NUUykgJiBBQ1NUU19DUkRZKSkJLy8gSWYgbmV2ZXIgY2FtZSByZWFkeSwKKwl7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI4MTogQUNTVFMgbmV2ZXIgY2FtZSByZWFkeSFcbiIpKTsKKwkJcmV0dXJuIC1FSU87CS8vICAgZXhpdCBpbml0aWFsaXphdGlvbi4KKwl9CisJLy8gKDgpIEFzc2VydCB0aGUgJ3ZhbGlkIGZyYW1lJyBzaWduYWwgc28gd2UgY2FuCisJLy8gYmVnaW4gc2VuZGluZyBjb21tYW5kcyB0byB0aGUgQUM5NyBjb2RlYy4KKwl3cml0ZWwoQUNDVExfVkZSTSB8IEFDQ1RMX0VTWU4sIGNhcmQtPnBCQTAgKyBCQTBfQUNDVEwpOwkvLyAoNDYwaCkKKworCS8vICg5KSwgV2FpdCB1bnRpbCBDT0RFQyBjYWxpYnJhdGlvbiBpcyBmaW5pc2hlZC4KKwkvLyBQcmludCBhbiBlcnJvciBtZXNzYWdlIGlmIGl0IGRvZXNuJ3QuCisJZm9yICh0ZW1wMSA9IDA7IHRlbXAxIDwgMTAwMDsgdGVtcDErKykgeworCQlkZWxheXVzKGNhcmQsMTAwMDApOworCQkvLyBSZWFkIHRoZSBBQzk3IFBvd2VyZG93biBDb250cm9sL1N0YXR1cyBSZWdpc3Rlci4KKwkJY3M0MjgxX3JlYWRfYWM5NyhjYXJkLCBCQTBfQUM5N19QT1dFUkRPV04sICZ0ZW1wMik7CisJCWlmICgodGVtcDIgJiAweDAwMDAwMDBGKSA9PSAweDAwMDAwMDBGKQorCQkJYnJlYWs7CisJfQorCWlmICgodGVtcDIgJiAweDAwMDAwMDBGKSAhPSAweDAwMDAwMDBGKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fRVJSCisJCQkiY3M0MjgxOiBDb2RlYyBmYWlsZWQgdG8gY2FsaWJyYXRlLiAgU3RhdHVzID0gJS44eC5cbiIsCisJCQkJdGVtcDIpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8vICgxMCksIFNldCB0aGUgc2VyaWFsIHBvcnQgdGltaW5nIGNvbmZpZ3VyYXRpb24sIHNvIHRoYXQgdGhlCisJLy8gY2xvY2sgY29udHJvbCBjaXJjdWl0IGdldHMgaXRzIGNsb2NrIGZyb20gdGhlIHJpZ2h0IHBsYWNlLgorCXdyaXRlbChTRVJNQ19QVENfQUM5NywgY2FyZC0+cEJBMCArIEJBMF9TRVJNQyk7CS8vICg0MjBoKT0yLgorCisKKwkvLyAoMTEpIFdhaXQgdW50aWwgd2UndmUgc2FtcGxlZCBpbnB1dCBzbG90cyAzICYgNCBhcyB2YWxpZCwgbWVhbmluZworCS8vIHRoYXQgdGhlIGNvZGVjIGlzIHB1bXBpbmcgQURDIGRhdGEgYWNyb3NzIHRoZSBBQyBsaW5rLgorCWZvciAodGVtcDEgPSAwOyB0ZW1wMSA8IDEwMDA7IHRlbXAxKyspIHsKKwkJLy8gRGVsYXkgYSBtaWwgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGFuZAorCQkvLyB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgorCQlkZWxheXVzKGNhcmQsMTAwMCk7CS8vKHRlc3QpCisKKwkJLy8gUmVhZCB0aGUgaW5wdXQgc2xvdCB2YWxpZCByZWdpc3RlcjsgIFNlZQorCQkvLyBpZiBpbnB1dCBzbG90cyAzIGFuZCA0IGFyZSB2YWxpZCB5ZXQuCisJCWlmICgKKwkJICAgIChyZWFkbChjYXJkLT5wQkEwICsgQkEwX0FDSVNWKSAmCisJCSAgICAgKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgPT0KKwkJICAgIChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpIGJyZWFrOwkvLyBFeGl0IHRoZSAnZm9yJyBpZiBzbG90cyBhcmUgdmFsaWQuCisJfQorCS8vIElmIHdlIG5ldmVyIGdvdCB2YWxpZCBkYXRhLCBleGl0IGluaXRpYWxpemF0aW9uLgorCWlmICgocmVhZGwoY2FyZC0+cEJBMCArIEJBMF9BQ0lTVikgJiAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKQorCSAgICAhPSAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwKKwkJCSAgcHJpbnRrKEtFUk5fRVJSCisJCQkJICJjczQyODE6IE5ldmVyIGdvdCB2YWxpZCBkYXRhIVxuIikpOworCQlyZXR1cm4gLUVJTzsJLy8gSWYgbm8gdmFsaWQgZGF0YSwgZXhpdCBpbml0aWFsaXphdGlvbi4KKwl9CisJLy8gKDEyKSwgU3RhcnQgZGlnaXRhbCBkYXRhIHRyYW5zZmVyIG9mIGF1ZGlvIGRhdGEgdG8gdGhlIGNvZGVjLgorCXdyaXRlbChBQ09TVl9TTFYzIHwgQUNPU1ZfU0xWNCwgY2FyZC0+cEJBMCArIEJBMF9BQ09TVik7CS8vICg0NjhoKQorCisKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gVW5tdXRlIHRoZSBNYXN0ZXIgYW5kIEFsdGVybmF0ZQorCS8vIChoZWFkcGhvbmUpIHZvbHVtZXMuICBTZXQgdG8gbWF4LgorCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwljczQyODFfd3JpdGVfYWM5NyhjYXJkLCBCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FLCAwKTsKKwljczQyODFfd3JpdGVfYWM5NyhjYXJkLCBCQTBfQUM5N19NQVNURVJfVk9MVU1FLCAwKTsKKworCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gUG93ZXIgb24gdGhlIERBQyhBZGREQUNVc2VyKClmcm9tIG1haW4oKSkKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCWNzNDI4MV9yZWFkX2FjOTcoY2FyZCwgQkEwX0FDOTdfUE9XRVJET1dOLCAmdGVtcDEpOworCWNzNDI4MV93cml0ZV9hYzk3KGNhcmQsIEJBMF9BQzk3X1BPV0VSRE9XTiwgdGVtcDEgJj0gMHhmZGZmKTsKKworCS8vIFdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgREFDIHJlYWR5IHN0YXRlLgorCWZvciAodGVtcDIgPSAwOyB0ZW1wMiA8IDMyOyB0ZW1wMisrKSB7CisJCS8vIExldCdzIHdhaXQgYSBtaWwgdG8gbGV0IHRoaW5ncyBzZXR0bGUuCisJCWRlbGF5dXMoY2FyZCwxMDAwKTsKKwkJLy8gUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWcuCisJCWNzNDI4MV9yZWFkX2FjOTcoY2FyZCwgQkEwX0FDOTdfUE9XRVJET1dOLCAmdGVtcDEpOworCQkvLyBJZiB0aGUgREFDIHJlYWR5IHN0YXRlIGJpdCBpcyBzZXQsIHN0b3Agd2FpdGluZy4KKwkJaWYgKHRlbXAxICYgMHgyKQorCQkJYnJlYWs7CisJfQorCisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyBQb3dlciBvbiB0aGUgQURDKEFkZEFEQ1VzZXIoKWZyb20gbWFpbigpKQorCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJY3M0MjgxX3JlYWRfYWM5NyhjYXJkLCBCQTBfQUM5N19QT1dFUkRPV04sICZ0ZW1wMSk7CisJY3M0MjgxX3dyaXRlX2FjOTcoY2FyZCwgQkEwX0FDOTdfUE9XRVJET1dOLCB0ZW1wMSAmPSAweGZlZmYpOworCisJLy8gV2FpdCB1bnRpbCB3ZSBzYW1wbGUgQURDIHJlYWR5IHN0YXRlLgorCWZvciAodGVtcDIgPSAwOyB0ZW1wMiA8IDMyOyB0ZW1wMisrKSB7CisJCS8vIExldCdzIHdhaXQgYSBtaWwgdG8gbGV0IHRoaW5ncyBzZXR0bGUuCisJCWRlbGF5dXMoY2FyZCwxMDAwKTsKKwkJLy8gUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWcuCisJCWNzNDI4MV9yZWFkX2FjOTcoY2FyZCwgQkEwX0FDOTdfUE9XRVJET1dOLCAmdGVtcDEpOworCQkvLyBJZiB0aGUgQURDIHJlYWR5IHN0YXRlIGJpdCBpcyBzZXQsIHN0b3Agd2FpdGluZy4KKwkJaWYgKHRlbXAxICYgMHgxKQorCQkJYnJlYWs7CisJfQorCS8vIFNldCB1cCA0MjgxIFJlZ2lzdGVyIGNvbnRlbnRzIHRoYXQKKwkvLyBkb24ndCBjaGFuZ2UgZm9yIGJvb3QgZHVyYXRpb24uCisKKwkvLyBGb3IgcGxheWJhY2ssIHdlIG1hcCBBQzk3IHNsb3QgMyBhbmQgNChMZWZ0CisJLy8gJiBSaWdodCBQQ00gcGxheWJhY2spIHRvIERNQSBDaGFubmVsIDAuCisJLy8gU2V0IHRoZSBmaWZvIHRvIGJlIDE1IGJ5dGVzIGF0IG9mZnNldCB6ZXJvLgorCisJYWM5N19zbG90aWQgPSAweDAxMDAwZjAwOwkvLyBGQ1IwLlJTWzQ6MF09MSg9PnNsb3Q0LCByaWdodCBQQ00gcGxheWJhY2spLgorCS8vIEZDUjAuTFNbNDowXT0wKD0+c2xvdDMsIGxlZnQgUENNIHBsYXliYWNrKS4KKwkvLyBGQ1IwLlNaWzYtMF09MTU7IEZDUjAuT0ZbNi0wXT0wLgorCXdyaXRlbChhYzk3X3Nsb3RpZCwgY2FyZC0+cEJBMCArIEJBMF9GQ1IwKTsJLy8gKDE4MGgpCisJd3JpdGVsKGFjOTdfc2xvdGlkIHwgRkNSbl9GRU4sIGNhcmQtPnBCQTAgKyBCQTBfRkNSMCk7CS8vIFR1cm4gb24gRklGTyBFbmFibGUuCisKKwkvLyBGb3IgY2FwdHVyZSwgd2UgbWFwIEFDOTcgc2xvdCAxMCBhbmQgMTEoTGVmdAorCS8vIGFuZCBSaWdodCBQQ00gUmVjb3JkKSB0byBETUEgQ2hhbm5lbCAxLgorCS8vIFNldCB0aGUgZmlmbyB0byBiZSAxNSBieXRlcyBhdCBvZmZzZXQgc2l4dGVlbi4KKwlhYzk3X3Nsb3RpZCA9IDB4MEIwQTBmMTA7CS8vIEZDUjEuUlNbNDowXT0xMSg9PnNsb3QxMSwgcmlnaHQgUENNIHJlY29yZCkuCisJLy8gRkNSMS5MU1s0OjBdPTEwKD0+c2xvdDEwLCBsZWZ0IFBDTSByZWNvcmQpLgorCS8vIEZDUjEuU1pbNi0wXT0xNTsgRkNSMS5PRls2LTBdPTE2LgorCXdyaXRlbChhYzk3X3Nsb3RpZCB8IEZDUm5fUFNILCBjYXJkLT5wQkEwICsgQkEwX0ZDUjEpOwkvLyAoMTg0aCkKKwl3cml0ZWwoYWM5N19zbG90aWQgfCBGQ1JuX0ZFTiwgY2FyZC0+cEJBMCArIEJBMF9GQ1IxKTsJLy8gVHVybiBvbiBGSUZPIEVuYWJsZS4KKworCS8vIE1hcCB0aGUgUGxheWJhY2sgU1JDIHRvIHRoZSBzYW1lIEFDOTcgc2xvdHMoMyAmIDQtLQorCS8vIC0tUGxheWJhY2sgbGVmdCAmIHJpZ2h0KWFzIERNQSBjaGFubmVsIDAuCisJLy8gTWFwIHRoZSByZWNvcmQgU1JDIHRvIHRoZSBzYW1lIEFDOTcgc2xvdHMoMTAgJiAxMS0tCisJLy8gLS0gUmVjb3JkIGxlZnQgJiByaWdodCkgYXMgRE1BIGNoYW5uZWwgMS4KKworCWFjOTdfc2xvdGlkID0gMHgwYjBhMDEwMDsJLy8gU0NSU0EuUFJTU1s0OjBdPTEoPT5zbG90NCwgcmlnaHQgUENNIHBsYXliYWNrKS4KKwkvLyBTQ1JTQS5QTFNTWzQ6MF09MCg9PnNsb3QzLCBsZWZ0IFBDTSBwbGF5YmFjaykuCisJLy8gU0NSU0EuQ1JTU1s0OjBdPTExKD0+c2xvdDExLCByaWdodCBQQ00gcmVjb3JkKQorCS8vIFNDUlNBLkNMU1NbNDowXT0xMCg9PnNsb3QxMCwgbGVmdCBQQ00gcmVjb3JkKS4KKwl3cml0ZWwoYWM5N19zbG90aWQsIGNhcmQtPnBCQTAgKyBCQTBfU1JDU0EpOwkvLyAoNzVjaCkKKworCS8vIFNldCAnSGFsZiBUZXJtaW5hbCBDb3VudCBJbnRlcnJ1cHQgRW5hYmxlJyBhbmQgJ1Rlcm1pbmFsCisJLy8gQ291bnQgSW50ZXJydXB0IEVuYWJsZScgaW4gRE1BIENvbnRyb2wgUmVnaXN0ZXJzIDAgJiAxLgorCS8vIFNldCAnTVNLJyBmbGFnIHRvIDEgdG8ga2VlcCB0aGUgRE1BIGVuZ2luZXMgcGF1c2VkLgorCXRlbXAxID0gKERDUm5fSFRDSUUgfCBEQ1JuX1RDSUUgfCBEQ1JuX01TSyk7CS8vICgwMDAzMDAwMWgpCisJd3JpdGVsKHRlbXAxLCBjYXJkLT5wQkEwICsgQkEwX0RDUjApOwkvLyAoMTU0aAorCXdyaXRlbCh0ZW1wMSwgY2FyZC0+cEJBMCArIEJBMF9EQ1IxKTsJLy8gKDE1Y2gpCisKKwkvLyBTZXQgJ0F1dG8tSW5pdGlhbGl6ZSBDb250cm9sJyB0byAnZW5hYmxlZCc7IEZvciBwbGF5YmFjaywKKwkvLyBzZXQgJ1RyYW5zZmVyIFR5cGUgQ29udHJvbCcoVFJbMTowXSkgdG8gJ3JlYWQgdHJhbnNmZXInLAorCS8vIGZvciByZWNvcmQsIHNldCBUcmFuc2ZlciBUeXBlIENvbnRyb2wgdG8gJ3dyaXRlIHRyYW5zZmVyJy4KKwkvLyBBbGwgb3RoZXIgYml0cyBzZXQgdG8gemVybzsgIFNvbWUgd2lsbCBiZSBjaGFuZ2VkIEAgdHJhbnNmZXIgc3RhcnQuCisJdGVtcDEgPSAoRE1Sbl9ETUEgfCBETVJuX0FVVE8gfCBETVJuX1RSX1JFQUQpOwkvLyAoMjAwMDAwMThoKQorCXdyaXRlbCh0ZW1wMSwgY2FyZC0+cEJBMCArIEJBMF9ETVIwKTsJLy8gKDE1MGgpCisJdGVtcDEgPSAoRE1Sbl9ETUEgfCBETVJuX0FVVE8gfCBETVJuX1RSX1dSSVRFKTsJLy8gKDIwMDAwMDE0aCkKKwl3cml0ZWwodGVtcDEsIGNhcmQtPnBCQTAgKyBCQTBfRE1SMSk7CS8vICgxNThoKQorCisJLy8gRW5hYmxlIERNQSBpbnRlcnJ1cHRzIGdlbmVyYWxseSwgYW5kCisJLy8gRE1BMCAmIERNQTEgaW50ZXJydXB0cyBzcGVjaWZpY2FsbHkuCisJdGVtcDEgPSByZWFkbChjYXJkLT5wQkEwICsgQkEwX0hJTVIpICYgMHhmZmZiZmNmZjsKKwl3cml0ZWwodGVtcDEsIGNhcmQtPnBCQTAgKyBCQTBfSElNUik7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjczQyODFfaHdfaW5pdCgpLSAwXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgTk9UX0NTNDI4MV9QTQorc3RhdGljIHZvaWQgcHJpbnRwbShzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJwbSBzdHJ1Y3Q6XG4iKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImZsYWdzOjB4JXggdTMyQ0xLQ1IxX1NBVkU6IDAleCB1MzJTU1BNVmFsdWU6IDB4JXhcbiIsCisJCSh1bnNpZ25lZClzLT5wbS5mbGFncyxzLT5wbS51MzJDTEtDUjFfU0FWRSxzLT5wbS51MzJTU1BNVmFsdWUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyUFBMVkN2YWx1ZTogMHgleCB1MzJQUFJWQ3ZhbHVlOiAweCV4XG4iLAorCQlzLT5wbS51MzJQUExWQ3ZhbHVlLHMtPnBtLnUzMlBQUlZDdmFsdWUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRk1MVkN2YWx1ZTogMHgleCB1MzJGTVJWQ3ZhbHVlOiAweCV4XG4iLAorCQlzLT5wbS51MzJGTUxWQ3ZhbHVlLHMtPnBtLnUzMkZNUlZDdmFsdWUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyR1BJT1J2YWx1ZTogMHgleCB1MzJKU0NUTHZhbHVlOiAweCV4XG4iLAorCQlzLT5wbS51MzJHUElPUnZhbHVlLHMtPnBtLnUzMkpTQ1RMdmFsdWUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyU1NDUjogMHgleCB1MzJTUkNTQTogMHgleFxuIiwKKwkJcy0+cG0udTMyU1NDUixzLT5wbS51MzJTUkNTQSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJEYWNBU1I6IDB4JXggdTMyQWRjQVNSOiAweCV4XG4iLAorCQlzLT5wbS51MzJEYWNBU1Iscy0+cG0udTMyQWRjQVNSKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkRhY1NSOiAweCV4IHUzMkFkY1NSOiAweCV4XG4iLAorCQlzLT5wbS51MzJEYWNTUixzLT5wbS51MzJBZGNTUikpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJNSURDUl9TYXZlOiAweCV4XG4iLAorCQlzLT5wbS51MzJNSURDUl9TYXZlKSk7CisKK30KK3N0YXRpYyB2b2lkIHByaW50cGlwZShzdHJ1Y3QgY3M0MjgxX3BpcGVsaW5lICpwbCkKK3sKKworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJwbSBzdHJ1Y3Q6XG4iKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImZsYWdzOjB4JXggbnVtYmVyOiAwJXhcbiIsCisJCSh1bnNpZ25lZClwbC0+ZmxhZ3MscGwtPm51bWJlcikpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJEQkFuVmFsdWU6IDAleCB1MzJEQkNuVmFsdWU6IDB4JXhcbiIsCisJCXBsLT51MzJEQkFuVmFsdWUscGwtPnUzMkRCQ25WYWx1ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJETVJuVmFsdWU6IDB4JXggdTMyRENSblZhbHVlOiAweCV4XG4iLAorCQlwbC0+dTMyRE1SblZhbHVlLHBsLT51MzJEQ1JuVmFsdWUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyREJBbkFkZHJlc3M6IDB4JXggdTMyREJDbkFkZHJlc3M6IDB4JXhcbiIsCisJCXBsLT51MzJEQkFuQWRkcmVzcyxwbC0+dTMyREJDbkFkZHJlc3MpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRENBbkFkZHJlc3M6IDB4JXggdTMyRENDbkFkZHJlc3M6IDB4JXhcbiIsCisJCXBsLT51MzJEQ0NuQWRkcmVzcyxwbC0+dTMyRENDbkFkZHJlc3MpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRE1SbkFkZHJlc3M6IDB4JXggdTMyRENSbkFkZHJlc3M6IDB4JXhcbiIsCisJCXBsLT51MzJETVJuQWRkcmVzcyxwbC0+dTMyRENSbkFkZHJlc3MpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMySERTUm5BZGRyZXNzOiAweCV4IHUzMkRCQW5fU2F2ZTogMHgleFxuIiwKKwkJcGwtPnUzMkhEU1JuQWRkcmVzcyxwbC0+dTMyREJBbl9TYXZlKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkRCQ25fU2F2ZTogMHgleCB1MzJETVJuX1NhdmU6IDB4JXhcbiIsCisJCXBsLT51MzJEQkNuX1NhdmUscGwtPnUzMkRNUm5fU2F2ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJEQ1JuX1NhdmU6IDB4JXggdTMyRENDbl9TYXZlOiAweCV4XG4iLAorCQlwbC0+dTMyRENSbl9TYXZlLHBsLT51MzJEQ0NuX1NhdmUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRENBbl9TYXZlOiAweCV4XG4iLAorCQlwbC0+dTMyRENBbl9TYXZlKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkZDUm5fU2F2ZTogMHgleCB1MzJGU0lDbl9TYXZlOiAweCV4XG4iLAorCQlwbC0+dTMyRkNSbl9TYXZlLHBsLT51MzJGU0lDbl9TYXZlKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkZDUm5WYWx1ZTogMHgleCB1MzJGU0lDblZhbHVlOiAweCV4XG4iLAorCQlwbC0+dTMyRkNSblZhbHVlLHBsLT51MzJGU0lDblZhbHVlKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkZDUm5BZGRyZXNzOiAweCV4IHUzMkZTSUNuQWRkcmVzczogMHgleFxuIiwKKwkJcGwtPnUzMkZDUm5BZGRyZXNzLHBsLT51MzJGU0lDbkFkZHJlc3MpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRlBEUm5WYWx1ZTogMHgleCB1MzJGUERSbkFkZHJlc3M6IDB4JXhcbiIsCisJCXBsLT51MzJGUERSblZhbHVlLHBsLT51MzJGUERSbkFkZHJlc3MpKTsKK30KK3N0YXRpYyB2b2lkIHByaW50cGlwZWxpbmVzKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpCit7CisJaW50IGk7CisJZm9yKGk9MDtpPENTNDI4MV9OVU1CRVJfT0ZfUElQRUxJTkVTO2krKykKKwl7CisJCWlmKHMtPnBsW2ldLmZsYWdzICYgQ1M0MjgxX1BJUEVMSU5FX1ZBTElEKQorCQl7CisJCQlwcmludHBpcGUoJnMtPnBsW2ldKTsKKwkJfQorCX0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICBTdXNwZW5kIC0gc2F2ZSB0aGUgYWM5NyByZWdzLCBtdXRlIHRoZSBvdXRwdXRzIGFuZCBwb3dlciBkb3duIHRoZSBwYXJ0LiAgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY3M0MjgxX2FjOTdfc3VzcGVuZChzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCWludCBDb3VudCxpOworCisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDI4MTogY3M0MjgxX2FjOTdfc3VzcGVuZCgpK1xuIikpOworLyoKKyogY2hhbmdlIHRoZSBzdGF0ZSwgc2F2ZSB0aGUgY3VycmVudCBod3B0ciwgdGhlbiBzdG9wIHRoZSBkYWMvYWRjCisqLworCXMtPnBtLmZsYWdzICY9IH5DUzQyODFfUE1fSURMRTsKKwlzLT5wbS5mbGFncyB8PSBDUzQyODFfUE1fU1VTUEVORElORzsKKwlzLT5wbS51MzJod3B0cl9wbGF5YmFjayA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfRENBMCk7CisJcy0+cG0udTMyaHdwdHJfY2FwdHVyZSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfRENBMSk7CisJc3RvcF9kYWMocyk7CisJc3RvcF9hZGMocyk7CisKKwlmb3IoQ291bnQgPSAweDIsIGk9MDsgKENvdW50IDw9IENTNDI4MV9BQzk3X0hJR0hFU1RSRUdUT1JFU1RPUkUpCisJCQkmJiAoaSA8IENTNDI4MV9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1MpOyAKKwkJQ291bnQgKz0gMiwgaSsrKQorCXsKKwkJY3M0MjgxX3JlYWRfYWM5NyhzLCBCQTBfQUM5N19SRVNFVCArIENvdW50LCAmcy0+cG0uYWM5N1tpXSk7CisJfQorLyoKKyogU2F2ZSB0aGUgYWM5NyB2b2x1bWUgcmVnaXN0ZXJzIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgcG93ZXJkb3duIHN0YXRlLgorKiBOb3csIG11dGUgdGhlIGFsbCB0aGUgb3V0cHV0cyAobWFzdGVyLCBoZWFkcGhvbmUsIGFuZCBtb25vKSwgYXMgd2VsbAorKiBhcyB0aGUgUENNIHZvbHVtZSwgaW4gcHJlcGFyYXRpb24gZm9yIHBvd2VyaW5nIGRvd24gdGhlIGVudGlyZSBwYXJ0LgorKi8gCisJY3M0MjgxX3JlYWRfYWM5NyhzLCBCQTBfQUM5N19NQVNURVJfVk9MVU1FLCAmcy0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lKTsKKwljczQyODFfcmVhZF9hYzk3KHMsIEJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUsICZzLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUpOworCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCAmcy0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8pOworCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfUENNX09VVF9WT0xVTUUsICZzLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lKTsKKwkJCisJY3M0MjgxX3dyaXRlX2FjOTcocywgQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgMHg4MDAwKTsKKwljczQyODFfd3JpdGVfYWM5NyhzLCBCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FLCAweDgwMDApOworCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTywgMHg4MDAwKTsKKwljczQyODFfd3JpdGVfYWM5NyhzLCBCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSwgMHg4MDAwKTsKKworCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfUE9XRVJET1dOLCAmcy0+cG0udTMyQUM5N19wb3dlcmRvd24pOworCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfR0VORVJBTF9QVVJQT1NFLCAmcy0+cG0udTMyQUM5N19nZW5lcmFsX3B1cnBvc2UpOworCisvKgorKiBBbmQgcG93ZXIgZG93biBldmVyeXRoaW5nIG9uIHRoZSBBQzk3IGNvZGVjLgorKi8KKwljczQyODFfd3JpdGVfYWM5NyhzLCBCQTBfQUM5N19QT1dFUkRPV04sIDB4ZmYwMCk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDI4MTogY3M0MjgxX2FjOTdfc3VzcGVuZCgpLVxuIikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgUmVzdW1lIC0gcG93ZXIgdXAgdGhlIHBhcnQgYW5kIHJlc3RvcmUgaXRzIHJlZ2lzdGVycy4uICAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjczQyODFfYWM5N19yZXN1bWUoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcykKK3sKKwlpbnQgQ291bnQsaTsKKworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQyODE6IGNzNDI4MV9hYzk3X3Jlc3VtZSgpK1xuIikpOworCisvKiBkbyBub3Qgc2F2ZSB0aGUgcG93ZXIgc3RhdGUgcmVnaXN0ZXJzIGF0IHRoaXMgdGltZQorICAgIC8vCisgICAgLy8gSWYgd2Ugc2F2ZWQgYXdheSB0aGUgcG93ZXIgY29udHJvbCByZWdpc3RlcnMsIHdyaXRlIHRoZW0gaW50byB0aGUKKyAgICAvLyBzaGFkb3dzIHNvIHRob3NlIHNhdmVkIHZhbHVlcyBnZXQgcmVzdG9yZWQgaW5zdGVhZCBvZiB0aGUgY3VycmVudAorICAgIC8vIHNoYWRvd2VkIHZhbHVlLgorICAgIC8vCisgICAgaWYoIGJQb3dlclN0YXRlU2F2ZWQgKQorICAgIHsKKyAgICAgICAgUG9rZVNoYWRvdyggMHgyNiwgdWxTYXZlUmVnMHgyNiApOworICAgICAgICBiUG93ZXJTdGF0ZVNhdmVkID0gRkFMU0U7CisgICAgfQorKi8KKworLy8KKy8vIEZpcnN0LCB3ZSByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiAgVGhpcworLy8gY29udGFpbnMgdGhlIG1pYyBzZWxlY3QgKG1pYzEgb3IgbWljMikgYW5kIGlmIHdlIHJlc3RvcmUgdGhpcyBhZnRlcgorLy8gd2UgcmVzdG9yZSB0aGUgbWljIHZvbHVtZS9ib29zdCBzdGF0ZSBhbmQgbWljMiB3YXMgc2VsZWN0ZWQgYXQKKy8vIHN1c3BlbmQgdGltZSwgd2Ugd2lsbCBlbmQgdXAgd2l0aCBhIGJyaWVmIHBlcmlvZCBvZiB0aW1lIHdoZXJlIG1pYzEKKy8vIGlzIHNlbGVjdGVkIHdpdGggdGhlIHZvbHVtZS9ib29zdCBzZXR0aW5ncyBmb3IgbWljMiwgY2F1c2luZworLy8gYWNvdXN0aWMgZmVlZGJhY2suICBTbyB3ZSByZXN0b3JlIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIKKy8vIGZpcnN0LCB0aGVyZWJ5IGdldHRpbmcgdGhlIGNvcnJlY3QgbWljIHNlbGVjdGVkIGJlZm9yZSB3ZSByZXN0b3JlCisvLyB0aGUgbWljIHZvbHVtZS9ib29zdC4KKy8vCisJY3M0MjgxX3dyaXRlX2FjOTcocywgQkEwX0FDOTdfR0VORVJBTF9QVVJQT1NFLCBzLT5wbS51MzJBQzk3X2dlbmVyYWxfcHVycG9zZSk7CisKKy8vCisvLyBOb3csIHdoaWxlIHRoZSBvdXRwdXRzIGFyZSBzdGlsbCBtdXRlZCwgcmVzdG9yZSB0aGUgc3RhdGUgb2YgcG93ZXIKKy8vIG9uIHRoZSBBQzk3IHBhcnQuCisvLworCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X1BPV0VSRE9XTiwgcy0+cG0udTMyQUM5N19wb3dlcmRvd24pOworCisvKgorKiBSZXN0b3JlIGp1c3QgdGhlIGZpcnN0IHNldCBvZiByZWdpc3RlcnMsIGZyb20gcmVnaXN0ZXIgbnVtYmVyCisqIDB4MDIgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciB0aGF0IHVsSGlnaGVzdFJlZ1RvUmVzdG9yZSBzcGVjaWZpZXMuCisqLworCWZvcigJQ291bnQgPSAweDIsIGk9MDsgCisJCShDb3VudCA8PSBDUzQyODFfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFKQorCQkJJiYgKGkgPCBDUzQyODFfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTKTsgCisJCUNvdW50ICs9IDIsIGkrKykKKwl7CisJCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X1JFU0VUICsgQ291bnQsIHMtPnBtLmFjOTdbaV0pOworCX0KKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiY3M0MjgxOiBjczQyODFfYWM5N19yZXN1bWUoKS1cbiIpKTsKK30KKworLyogZG8gbm90IHNhdmUgdGhlIHBvd2VyIHN0YXRlIHJlZ2lzdGVycyBhdCB0aGlzIHRpbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogIFNhdmVQb3dlclN0YXRlIC0gU2F2ZSB0aGUgcG93ZXIgcmVnaXN0ZXJzIGF3YXkuIAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordm9pZCAKK0hXQUM5N2NvZGVjOjpTYXZlUG93ZXJTdGF0ZSh2b2lkKQoreworICAgIEVOVFJZKFRNX09CSkVDVENBTExTLCAiSFdBQzk3Y29kZWM6OlNhdmVQb3dlclN0YXRlKClcclxuIik7CisKKyAgICB1bFNhdmVSZWcweDI2ID0gUGVla1NoYWRvdygweDI2KTsKKworICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHdlIGhhdmUgc2F2ZWQgcmVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSByZXN0b3JlZCBkdXJpbmcgYQorICAgIC8vIHJlc3VtZSBpbnN0ZWFkIG9mIHVsQUM5N1JlZ3NbXS4KKyAgICAvLworICAgIGJQb3dlclN0YXRlU2F2ZWQgPSBUUlVFOworCit9IC8vIFNhdmVQb3dlclN0YXRlCisqLworCitzdGF0aWMgdm9pZCBjczQyODFfU3VzcGVuZEZJRk8oc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgc3RydWN0IGNzNDI4MV9waXBlbGluZSAqcGwpCit7CisgLyoKKyAqIFdlIG5lZWQgdG8gc2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIEJBU0lDIEZJRk8gUmVnaXN0ZXJzLgorICovCisJcGwtPnUzMkZDUm5fU2F2ZSA9IHJlYWRsKHMtPnBCQTAgKyBwbC0+dTMyRkNSbkFkZHJlc3MpOworCXBsLT51MzJGU0lDbl9TYXZlID0gcmVhZGwocy0+cEJBMCArIHBsLT51MzJGU0lDbkFkZHJlc3MpOworfQorc3RhdGljIHZvaWQgY3M0MjgxX1Jlc3VtZUZJRk8oc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgc3RydWN0IGNzNDI4MV9waXBlbGluZSAqcGwpCit7CisgLyoKKyAqIFdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIEJBU0lDIEZJRk8gUmVnaXN0ZXJzLgorICovCisJd3JpdGVsKHBsLT51MzJGQ1JuX1NhdmUscy0+cEJBMCArIHBsLT51MzJGQ1JuQWRkcmVzcyk7CisJd3JpdGVsKHBsLT51MzJGU0lDbl9TYXZlLHMtPnBCQTAgKyBwbC0+dTMyRlNJQ25BZGRyZXNzKTsKK30KK3N0YXRpYyB2b2lkIGNzNDI4MV9TdXNwZW5kRE1BZW5naW5lKHN0cnVjdCBjczQyODFfc3RhdGUgKnMsIHN0cnVjdCBjczQyODFfcGlwZWxpbmUgKnBsKQoreworCS8vCisJLy8gV2UgbmVlZCB0byBzYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgQkFTSUMgRE1BIFJlZ2lzdGVycy4KKwkvLworCXBsLT51MzJEQkFuX1NhdmUgPSByZWFkbChzLT5wQkEwICsgcGwtPnUzMkRCQW5BZGRyZXNzKTsKKwlwbC0+dTMyREJDbl9TYXZlID0gcmVhZGwocy0+cEJBMCArIHBsLT51MzJEQkNuQWRkcmVzcyk7CisJcGwtPnUzMkRNUm5fU2F2ZSA9IHJlYWRsKHMtPnBCQTAgKyBwbC0+dTMyRE1SbkFkZHJlc3MpOworCXBsLT51MzJEQ1JuX1NhdmUgPSByZWFkbChzLT5wQkEwICsgcGwtPnUzMkRDUm5BZGRyZXNzKTsKKwlwbC0+dTMyRENDbl9TYXZlID0gcmVhZGwocy0+cEJBMCArIHBsLT51MzJEQ0NuQWRkcmVzcyk7CisJcGwtPnUzMkRDQW5fU2F2ZSA9IHJlYWRsKHMtPnBCQTAgKyBwbC0+dTMyRENBbkFkZHJlc3MpOworfQorc3RhdGljIHZvaWQgY3M0MjgxX1Jlc3VtZURNQWVuZ2luZShzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzLCBzdHJ1Y3QgY3M0MjgxX3BpcGVsaW5lICpwbCkKK3sKKwkvLworCS8vIFdlIG5lZWQgdG8gc2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIEJBU0lDIERNQSBSZWdpc3RlcnMuCisJLy8KKwl3cml0ZWwoIHBsLT51MzJEQkFuX1NhdmUsIHMtPnBCQTAgKyBwbC0+dTMyREJBbkFkZHJlc3MpOworCXdyaXRlbCggcGwtPnUzMkRCQ25fU2F2ZSwgcy0+cEJBMCArIHBsLT51MzJEQkNuQWRkcmVzcyk7CisJd3JpdGVsKCBwbC0+dTMyRE1Sbl9TYXZlLCBzLT5wQkEwICsgcGwtPnUzMkRNUm5BZGRyZXNzKTsKKwl3cml0ZWwoIHBsLT51MzJEQ1JuX1NhdmUsIHMtPnBCQTAgKyBwbC0+dTMyRENSbkFkZHJlc3MpOworCXdyaXRlbCggcGwtPnUzMkRDQ25fU2F2ZSwgcy0+cEJBMCArIHBsLT51MzJEQ0NuQWRkcmVzcyk7CisJd3JpdGVsKCBwbC0+dTMyRENBbl9TYXZlLCBzLT5wQkEwICsgcGwtPnUzMkRDQW5BZGRyZXNzKTsKK30KKworc3RhdGljIGludCBjczQyODFfc3VzcGVuZChzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCWludCBpOworCXUzMiB1MzJDTEtDUjE7CisJc3RydWN0IGNzNDI4MV9wbSAqcG0gPSAmcy0+cG07CisJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDksIAorCQlwcmludGsoImNzNDI4MTogY3M0MjgxX3N1c3BlbmQoKSsgZmxhZ3M9JWRcbiIsCisJCQkodW5zaWduZWQpcy0+cG0uZmxhZ3MpKTsKKy8qCisqIGNoZWNrIHRoZSBjdXJyZW50IHN0YXRlLCBvbmx5IHN1c3BlbmQgaWYgSURMRQorKi8KKwlpZighKHMtPnBtLmZsYWdzICYgQ1M0MjgxX1BNX0lETEUpKQorCXsKKwkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDIsIAorCQkJcHJpbnRrKCJjczQyODE6IGNzNDI4MV9zdXNwZW5kKCkgdW5hYmxlIHRvIHN1c3BlbmQsIG5vdCBJRExFXG4iKSk7CisJCXJldHVybiAxOworCX0KKwlzLT5wbS5mbGFncyAmPSB+Q1M0MjgxX1BNX0lETEU7CisJcy0+cG0uZmxhZ3MgfD0gQ1M0MjgxX1BNX1NVU1BFTkRJTkc7CisKKy8vCisvLyBHZXJzaHdpbiBDTEtSVU4gLSBTZXQgQ0tSQQorLy8KKwl1MzJDTEtDUjEgPSByZWFkbChzLT5wQkEwICsgQkEwX0NMS0NSMSk7CisKKwlwbS0+dTMyQ0xLQ1IxX1NBVkUgPSB1MzJDTEtDUjE7CisJaWYoISh1MzJDTEtDUjEgJiAweDAwMDEwMDAwICkgKQorCQl3cml0ZWwodTMyQ0xLQ1IxIHwgMHgwMDAxMDAwMCwgcy0+cEJBMCArIEJBMF9DTEtDUjEpOworCisvLworLy8gRmlyc3QsIHR1cm4gb24gdGhlIGNsb2NrcyAoeWlrZXMpIHRvIHRoZSBkZXZpY2VzLCBzbyB0aGF0IHRoZXkgd2lsbAorLy8gcmVzcG9uZCB3aGVuIHdlIHRyeSB0byBzYXZlIHRoZWlyIHN0YXRlLgorLy8KKwlpZighKHUzMkNMS0NSMSAmIENMS0NSMV9TV0NFKSkKKwl7CisJCXdyaXRlbCh1MzJDTEtDUjEgfCBDTEtDUjFfU1dDRSAsIHMtPnBCQTAgKyBCQTBfQ0xLQ1IxKTsKKwl9CisgICAgCisJLy8KKwkvLyBTYXZlIHRoZSBwb3dlciBzdGF0ZQorCS8vCisJcG0tPnUzMlNTUE1WYWx1ZSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfU1NQTSk7CisKKwkvLworCS8vIERpc2FibGUgaW50ZXJydXB0cy4KKwkvLworCXdyaXRlbChISUNSX0NIR00sIHMtPnBCQTAgKyBCQTBfSElDUik7CisKKwkvLworCS8vIFNhdmUgdGhlIFBDTSBQbGF5YmFjayBMZWZ0IGFuZCBSaWdodCBWb2x1bWUgQ29udHJvbC4KKwkvLworCXBtLT51MzJQUExWQ3ZhbHVlID0gcmVhZGwocy0+cEJBMCArIEJBMF9QUExWQyk7CisJcG0tPnUzMlBQUlZDdmFsdWUgPSByZWFkbChzLT5wQkEwICsgQkEwX1BQUlZDKTsKKworCS8vCisJLy8gU2F2ZSB0aGUgRk0gU3ludGhlc2lzIExlZnQgYW5kIFJpZ2h0IFZvbHVtZSBDb250cm9sLgorCS8vCisJcG0tPnUzMkZNTFZDdmFsdWUgPSByZWFkbChzLT5wQkEwICsgQkEwX0ZNTFZDKTsKKwlwbS0+dTMyRk1SVkN2YWx1ZSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfRk1SVkMpOworCisJLy8KKwkvLyBTYXZlIHRoZSBHUElPUiB2YWx1ZS4KKwkvLworCXBtLT51MzJHUElPUnZhbHVlID0gcmVhZGwocy0+cEJBMCArIEJBMF9HUElPUik7CisKKwkvLworCS8vIFNhdmUgdGhlIEpTQ1RMIHZhbHVlLgorCS8vCisJcG0tPnUzMkpTQ1RMdmFsdWUgPSByZWFkbChzLT5wQkEwICsgQkEwX0dQSU9SKTsKKworCS8vCisJLy8gU2F2ZSBTb3VuZCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlcgorCS8vCisJcG0tPnUzMlNTQ1IgPSByZWFkbChzLT5wQkEwICsgQkEwX1NTQ1IpOworCisJLy8KKwkvLyBTYXZlIFNSQyBTbG90IEFzc2lubWVudCByZWdpc3RlcgorCS8vCisJcG0tPnUzMlNSQ1NBID0gcmVhZGwocy0+cEJBMCArIEJBMF9TUkNTQSk7CisKKwkvLworCS8vIFNhdmUgc2FtcGxlIHJhdGUKKwkvLworCXBtLT51MzJEYWNBU1IgPSByZWFkbChzLT5wQkEwICsgQkEwX1BBU1IpOworCXBtLT51MzJBZGNBU1IgPSByZWFkbChzLT5wQkEwICsgQkEwX0NBU1IpOworCXBtLT51MzJEYWNTUiA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfREFDU1IpOworCXBtLT51MzJBZGNTUiA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfQURDU1IpOworCisJLy8KKwkvLyBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBQaXBlTGluZXMgCisJLy8KKwlmb3IoaSA9IDA7IGkgPCBDUzQyODFfTlVNQkVSX09GX1BJUEVMSU5FUzsgaSsrKQorICAgICAgICB7CisJCWlmKHMtPnBsW2ldLmZsYWdzICYgQ1M0MjgxX1BJUEVMSU5FX1ZBTElEKQorCQl7CisJCS8vCisJCS8vIEFzayB0aGUgRE1BZW5naW5lcyBhbmQgRklGT3MgdG8gU3VzcGVuZC4KKwkJLy8KKwkJCWNzNDI4MV9TdXNwZW5kRE1BZW5naW5lKHMsJnMtPnBsW2ldKTsKKwkJCWNzNDI4MV9TdXNwZW5kRklGTyhzLCZzLT5wbFtpXSk7CisJCX0KKwl9CisJLy8KKwkvLyBXZSBuZWVkIHRvIHNhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNaWRpIENvbnRyb2wgUmVnaXN0ZXIuCisJLy8KKwlwbS0+dTMyTUlEQ1JfU2F2ZSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfTUlEQ1IpOworLyoKKyogc2F2ZSBvZmYgdGhlIEFDOTcgcGFydCBpbmZvcm1hdGlvbgorKi8KKwljczQyODFfYWM5N19zdXNwZW5kKHMpOworICAgIAorCS8vCisJLy8gVHVybiBvZmYgdGhlIHNlcmlhbCBwb3J0cy4KKwkvLworCXdyaXRlbCgwLCBzLT5wQkEwICsgQkEwX1NFUk1DKTsKKworCS8vCisJLy8gUG93ZXIgb2ZmIEZNLCBKb3lzdGljaywgQUMgbGluaywgCisJLy8KKwl3cml0ZWwoMCwgcy0+cEJBMCArIEJBMF9TU1BNKTsKKworCS8vCisJLy8gRExMIG9mZi4KKwkvLworCXdyaXRlbCgwLCBzLT5wQkEwICsgQkEwX0NMS0NSMSk7CisKKwkvLworCS8vIEFDIGxpbmsgb2ZmLgorCS8vCisJd3JpdGVsKDAsIHMtPnBCQTAgKyBCQTBfU1BNQyk7CisKKwkvLworCS8vIFB1dCB0aGUgY2hpcCBpbnRvIEQzKGhvdCkgc3RhdGUuCisJLy8KKwkvLyBQb2tlQkEwKEJBMF9QTUNTLCAweDAwMDAwMDAzKTsKKworCS8vCisJLy8gR2Vyc2h3aW4gQ0xLUlVOIC0gQ2xlYXIgQ0tSQQorCS8vCisJdTMyQ0xLQ1IxID0gcmVhZGwocy0+cEJBMCArIEJBMF9DTEtDUjEpOworCXdyaXRlbCh1MzJDTEtDUjEgJiAweEZGRkVGRkZGLCBzLT5wQkEwICsgQkEwX0NMS0NSMSk7CisKKyNpZmRlZiBDU0RFQlVHCisJcHJpbnRwbShzKTsKKwlwcmludHBpcGVsaW5lcyhzKTsKKyNlbmRpZgorCisJcy0+cG0uZmxhZ3MgJj0gfkNTNDI4MV9QTV9TVVNQRU5ESU5HOworCXMtPnBtLmZsYWdzIHw9IENTNDI4MV9QTV9TVVNQRU5ERUQ7CisKKwlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgOSwgCisJCXByaW50aygiY3M0MjgxOiBjczQyODFfc3VzcGVuZCgpLSBmbGFncz0lZFxuIiwKKwkJCSh1bnNpZ25lZClzLT5wbS5mbGFncykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzNDI4MV9yZXN1bWUoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCB0ZW1wMTsKKwl1MzIgdTMyQ0xLQ1IxOworCXN0cnVjdCBjczQyODFfcG0gKnBtID0gJnMtPnBtOworCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKKwkJcHJpbnRrKCAiY3M0MjgxOiBjczQyODFfcmVzdW1lKCkrIGZsYWdzPSVkXG4iLAorCQkJKHVuc2lnbmVkKXMtPnBtLmZsYWdzKSk7CisJaWYoIShzLT5wbS5mbGFncyAmIENTNDI4MV9QTV9TVVNQRU5ERUQpKQorCXsKKwkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDIsIAorCQkJcHJpbnRrKCJjczQyODE6IGNzNDI4MV9yZXN1bWUoKSB1bmFibGUgdG8gcmVzdW1lLCBub3QgU1VTUEVOREVEXG4iKSk7CisJCXJldHVybiAxOworCX0KKwlzLT5wbS5mbGFncyAmPSB+Q1M0MjgxX1BNX1NVU1BFTkRFRDsKKwlzLT5wbS5mbGFncyB8PSBDUzQyODFfUE1fUkVTVU1JTkc7CisKKy8vCisvLyBHZXJzaHdpbiBDTEtSVU4gLSBTZXQgQ0tSQQorLy8KKwl1MzJDTEtDUjEgPSByZWFkbChzLT5wQkEwICsgQkEwX0NMS0NSMSk7CisJd3JpdGVsKHUzMkNMS0NSMSB8IDB4MDAwMTAwMDAsIHMtPnBCQTAgKyBCQTBfQ0xLQ1IxKTsKKworCS8vCisJLy8gc2V0IHRoZSBwb3dlciBzdGF0ZS4KKwkvLworCS8vb2xkIFBva2VCQTAoQkEwX1BNQ1MsIDApOworCisJLy8KKwkvLyBQcm9ncmFtIHRoZSBjbG9jayBjaXJjdWl0IGFuZCBzZXJpYWwgcG9ydHMuCisJLy8KKwl0ZW1wMSA9IGNzNDI4MV9od19pbml0KHMpOworCWlmICh0ZW1wMSkgeworCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLAorCQkgICAgcHJpbnRrKEtFUk5fRVJSCisJCQkiY3M0MjgxOiByZXN1bWUgY3M0MjgxX2h3X2luaXQoKSBlcnJvci5cbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8vCisJLy8gcmVzdG9yZSB0aGUgUG93ZXIgc3RhdGUKKwkvLworCXdyaXRlbChwbS0+dTMyU1NQTVZhbHVlLCBzLT5wQkEwICsgQkEwX1NTUE0pOworCisJLy8KKwkvLyBTZXQgcG9zdCBTUkMgbWl4IHNldHRpbmcgKEZNIG9yIEFMVDQ4SykKKwkvLworCXdyaXRlbChwbS0+dTMyU1NQTV9CSVRTLCBzLT5wQkEwICsgQkEwX1NTUE0pOworCisJLy8KKwkvLyBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBQaXBlTGluZXMgCisJLy8KKwlmb3IoaSA9IDA7IGkgPCBDUzQyODFfTlVNQkVSX09GX1BJUEVMSU5FUzsgaSsrKQorICAgICAgICB7CisJCWlmKHMtPnBsW2ldLmZsYWdzICYgQ1M0MjgxX1BJUEVMSU5FX1ZBTElEKQorCQl7CisJCS8vCisJCS8vIEFzayB0aGUgRE1BZW5naW5lcyBhbmQgRklGT3MgdG8gUmVzdW1lLgorCQkvLworCQkJY3M0MjgxX1Jlc3VtZURNQWVuZ2luZShzLCZzLT5wbFtpXSk7CisJCQljczQyODFfUmVzdW1lRklGTyhzLCZzLT5wbFtpXSk7CisJCX0KKwl9CisJLy8KKwkvLyBXZSBuZWVkIHRvIHJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNaWRpIENvbnRyb2wgUmVnaXN0ZXIuCisJLy8KKwl3cml0ZWwocG0tPnUzMk1JRENSX1NhdmUsIHMtPnBCQTAgKyBCQTBfTUlEQ1IpOworCisJY3M0MjgxX2FjOTdfcmVzdW1lKHMpOworCS8vCisJLy8gUmVzdG9yZSB0aGUgUENNIFBsYXliYWNrIExlZnQgYW5kIFJpZ2h0IFZvbHVtZSBDb250cm9sLgorCS8vCisJd3JpdGVsKHBtLT51MzJQUExWQ3ZhbHVlLCBzLT5wQkEwICsgQkEwX1BQTFZDKTsKKwl3cml0ZWwocG0tPnUzMlBQUlZDdmFsdWUsIHMtPnBCQTAgKyBCQTBfUFBSVkMpOworCisJLy8KKwkvLyBSZXN0b3JlIHRoZSBGTSBTeW50aGVzaXMgTGVmdCBhbmQgUmlnaHQgVm9sdW1lIENvbnRyb2wuCisJLy8KKwl3cml0ZWwocG0tPnUzMkZNTFZDdmFsdWUsIHMtPnBCQTAgKyBCQTBfRk1MVkMpOworCXdyaXRlbChwbS0+dTMyRk1SVkN2YWx1ZSwgcy0+cEJBMCArIEJBMF9GTVJWQyk7CisKKwkvLworCS8vIFJlc3RvcmUgdGhlIEpTQ1RMIHZhbHVlLgorCS8vCisJd3JpdGVsKHBtLT51MzJKU0NUTHZhbHVlLCBzLT5wQkEwICsgQkEwX0pTQ1RMKTsKKworCS8vCisJLy8gUmVzdG9yZSB0aGUgR1BJT1IgcmVnaXN0ZXIgdmFsdWUuCisJLy8KKwl3cml0ZWwocG0tPnUzMkdQSU9SdmFsdWUsIHMtPnBCQTAgKyBCQTBfR1BJT1IpOworCisJLy8KKwkvLyBSZXN0b3JlIFNvdW5kIFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyCisJLy8KKwl3cml0ZWwocG0tPnUzMlNTQ1IsIHMtPnBCQTAgKyBCQTBfU1NDUik7CisKKwkvLworCS8vIFJlc3RvcmUgU1JDIFNsb3QgQXNzaWdubWVudCByZWdpc3RlcgorCS8vCisJd3JpdGVsKHBtLT51MzJTUkNTQSwgcy0+cEJBMCArIEJBMF9TUkNTQSk7CisKKwkvLworCS8vIFJlc3RvcmUgc2FtcGxlIHJhdGUKKwkvLworCXdyaXRlbChwbS0+dTMyRGFjQVNSLCBzLT5wQkEwICsgQkEwX1BBU1IpOworCXdyaXRlbChwbS0+dTMyQWRjQVNSLCBzLT5wQkEwICsgQkEwX0NBU1IpOworCXdyaXRlbChwbS0+dTMyRGFjU1IsIHMtPnBCQTAgKyBCQTBfREFDU1IpOworCXdyaXRlbChwbS0+dTMyQWRjU1IsIHMtPnBCQTAgKyBCQTBfQURDU1IpOworCisJLy8gCisJLy8gUmVzdG9yZSBDRkwxLzIgcmVnaXN0ZXJzIHdlIHNhdmVkIHRvIGNvbXBlbnNhdGUgZm9yIE9FTSBidWdzLgorCS8vCisJLy8JUG9rZUJBMChCQTBfQ0ZMUiwgdWxDb25maWcpOworCisJLy8KKwkvLyBHZXJzaHdpbiBDTEtSVU4gLSBDbGVhciBDS1JBCisJLy8KKwl3cml0ZWwocG0tPnUzMkNMS0NSMV9TQVZFLCBzLT5wQkEwICsgQkEwX0NMS0NSMSk7CisKKwkvLworCS8vIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBwYXJ0LgorCS8vCisJd3JpdGVsKEhJQ1JfSUVWIHwgSElDUl9DSEdNLCBzLT5wQkEwICsgQkEwX0hJQ1IpOworCisjaWZkZWYgQ1NERUJVRworCXByaW50cG0ocyk7CisJcHJpbnRwaXBlbGluZXMocyk7CisjZW5kaWYKKy8qCisqIGNoYW5nZSB0aGUgc3RhdGUsIHJlc3RvcmUgdGhlIGN1cnJlbnQgaHdwdHJzLCB0aGVuIHN0b3AgdGhlIGRhYy9hZGMKKyovCisJcy0+cG0uZmxhZ3MgfD0gQ1M0MjgxX1BNX0lETEU7CisJcy0+cG0uZmxhZ3MgJj0gfihDUzQyODFfUE1fU1VTUEVORElORyB8IENTNDI4MV9QTV9TVVNQRU5ERUQgCisJCQl8IENTNDI4MV9QTV9SRVNVTUlORyB8IENTNDI4MV9QTV9SRVNVTUVEKTsKKworCXdyaXRlbChzLT5wbS51MzJod3B0cl9wbGF5YmFjaywgcy0+cEJBMCArIEJBMF9EQ0EwKTsKKwl3cml0ZWwocy0+cG0udTMyaHdwdHJfY2FwdHVyZSwgcy0+cEJBMCArIEJBMF9EQ0ExKTsKKwlzdGFydF9kYWMocyk7CisJc3RhcnRfYWRjKHMpOworCisJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDksIHByaW50aygiY3M0MjgxOiBjczQyODFfcmVzdW1lKCktIGZsYWdzPSVkXG4iLAorCQkodW5zaWduZWQpcy0+cG0uZmxhZ3MpKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAiY3M0MjgxX3BsYXlfcmF0ZSgpIiAtLQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkIGNzNDI4MV9wbGF5X3JhdGUoc3RydWN0IGNzNDI4MV9zdGF0ZSAqY2FyZCwgdTMyIHBsYXlyYXRlKQoreworCXUzMiBEQUNTUnZhbHVlID0gMTsKKworCS8vIEJhc2VkIG9uIHRoZSBzYW1wbGUgcmF0ZSwgcHJvZ3JhbSB0aGUgREFDU1IgcmVnaXN0ZXIuCisJaWYgKHBsYXlyYXRlID09IDgwMDApCisJCURBQ1NSdmFsdWUgPSA1OworCWlmIChwbGF5cmF0ZSA9PSAxMTAyNSkKKwkJREFDU1J2YWx1ZSA9IDQ7CisJZWxzZSBpZiAocGxheXJhdGUgPT0gMjIwNTApCisJCURBQ1NSdmFsdWUgPSAyOworCWVsc2UgaWYgKHBsYXlyYXRlID09IDQ0MTAwKQorCQlEQUNTUnZhbHVlID0gMTsKKwllbHNlIGlmICgocGxheXJhdGUgPD0gNDgwMDApICYmIChwbGF5cmF0ZSA+PSA2MDIzKSkKKwkJREFDU1J2YWx1ZSA9IDI0NTc2MDAwIC8gKHBsYXlyYXRlICogMTYpOworCWVsc2UgaWYgKHBsYXlyYXRlIDwgNjAyMykKKwkJLy8gTm90IGFsbG93ZWQgYnkgb3Blbi4KKwkJcmV0dXJuOworCWVsc2UgaWYgKHBsYXlyYXRlID4gNDgwMDApCisJCS8vIE5vdCBhbGxvd2VkIGJ5IG9wZW4uCisJCXJldHVybjsKKwlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSB8IENTX1BBUk1TLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQyODE6IGNzNDI4MV9wbGF5X3JhdGUoKTogREFDU1J2YWx1ZT0weCUuOHggcGxheXJhdGU9JWRcbiIsCisJCQlEQUNTUnZhbHVlLCBwbGF5cmF0ZSkpOworCS8vICBXcml0ZSB0aGUgJ3NhbXBsZSByYXRlIHNlbGVjdCBjb2RlJworCS8vICB0byB0aGUgJ0RBQyBTYW1wbGUgUmF0ZScgcmVnaXN0ZXIuCisJd3JpdGVsKERBQ1NSdmFsdWUsIGNhcmQtPnBCQTAgKyBCQTBfREFDU1IpOwkvLyAoNzQ0aCkKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICJjczQyODFfcmVjb3JkX3JhdGUoKSIgLS0gSW5pdGlhbGl6ZSB0aGUgcmVjb3JkIHNhbXBsZSByYXRlIGNvbnZlcnRlci4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZCBjczQyODFfcmVjb3JkX3JhdGUoc3RydWN0IGNzNDI4MV9zdGF0ZSAqY2FyZCwgdTMyIG91dHJhdGUpCit7CisJdTMyIEFEQ1NSdmFsdWUgPSAxOworCisJLy8KKwkvLyBCYXNlZCBvbiB0aGUgc2FtcGxlIHJhdGUsIHByb2dyYW0gdGhlIEFEQ1NSIHJlZ2lzdGVyCisJLy8KKwlpZiAob3V0cmF0ZSA9PSA4MDAwKQorCQlBRENTUnZhbHVlID0gNTsKKwlpZiAob3V0cmF0ZSA9PSAxMTAyNSkKKwkJQURDU1J2YWx1ZSA9IDQ7CisJZWxzZSBpZiAob3V0cmF0ZSA9PSAyMjA1MCkKKwkJQURDU1J2YWx1ZSA9IDI7CisJZWxzZSBpZiAob3V0cmF0ZSA9PSA0NDEwMCkKKwkJQURDU1J2YWx1ZSA9IDE7CisJZWxzZSBpZiAoKG91dHJhdGUgPD0gNDgwMDApICYmIChvdXRyYXRlID49IDYwMjMpKQorCQlBRENTUnZhbHVlID0gMjQ1NzYwMDAgLyAob3V0cmF0ZSAqIDE2KTsKKwllbHNlIGlmIChvdXRyYXRlIDwgNjAyMykgeworCQkvLyBOb3QgYWxsb3dlZCBieSBvcGVuLgorCQlyZXR1cm47CisJfSBlbHNlIGlmIChvdXRyYXRlID4gNDgwMDApIHsKKwkJLy8gTm90IGFsbG93ZWQgYnkgb3Blbi4KKwkJcmV0dXJuOworCX0KKwlDU19EQkdPVVQoQ1NfV0FWRV9SRUFEIHwgQ1NfUEFSTVMsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJImNzNDI4MTogY3M0MjgxX3JlY29yZF9yYXRlKCk6IEFEQ1NSdmFsdWU9MHglLjh4IG91dHJhdGU9JWRcbiIsCisJCQlBRENTUnZhbHVlLCBvdXRyYXRlKSk7CisJLy8gIFdyaXRlIHRoZSAnc2FtcGxlIHJhdGUgc2VsZWN0IGNvZGUKKwkvLyAgdG8gdGhlICdBREMgU2FtcGxlIFJhdGUnIHJlZ2lzdGVyLgorCXdyaXRlbChBRENTUnZhbHVlLCBjYXJkLT5wQkEwICsgQkEwX0FEQ1NSKTsJLy8gKDc0OGgpCit9CisKKworCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgdGVtcDE7CisKKwlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSwgMywgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBzdG9wX2RhYygpOlxuIikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+ZW5hICY9IH5GTU9ERV9XUklURTsKKwl0ZW1wMSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfRENSMCkgfCBEQ1JuX01TSzsKKwl3cml0ZWwodGVtcDEsIHMtPnBCQTAgKyBCQTBfRENSMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCB0ZW1wMTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBzdGFydF9kYWMoKStcbiIpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPmVuYSAmIEZNT0RFX1dSSVRFKSAmJiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwKKwkJCQkJKHMtPmRtYV9kYWMuY291bnQgPiAwCisJICAgIAkJCQkmJiBzLT5kbWFfZGFjLnJlYWR5KSkKKyNpZm5kZWYgTk9UX0NTNDI4MV9QTQorCSYmIChzLT5wbS5mbGFncyAmIENTNDI4MV9QTV9JRExFKSkKKyNlbHNlCispCisjZW5kaWYKKyB7CisJCXMtPmVuYSB8PSBGTU9ERV9XUklURTsKKwkJdGVtcDEgPSByZWFkbChzLT5wQkEwICsgQkEwX0RDUjApICYgfkRDUm5fTVNLOwkvLyBDbGVhciBETUEwIGNoYW5uZWwgbWFzay4KKwkJd3JpdGVsKHRlbXAxLCBzLT5wQkEwICsgQkEwX0RDUjApOwkvLyBTdGFydCBETUEnaW5nLgorCQl3cml0ZWwoSElDUl9JRVYgfCBISUNSX0NIR00sIHMtPnBCQTAgKyBCQTBfSElDUik7CS8vIEVuYWJsZSBpbnRlcnJ1cHRzLiAgICAgICAgICAgICAgCisKKwkJd3JpdGVsKDcsIHMtPnBCQTAgKyBCQTBfUFBSVkMpOworCQl3cml0ZWwoNywgcy0+cEJBMCArIEJBMF9QUExWQyk7CisJCUNTX0RCR09VVChDU19XQVZFX1dSSVRFIHwgQ1NfUEFSTVMsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyODE6IHN0YXJ0X2RhYygpOiB3cml0ZWwgMHgleCBzdGFydCBkbWFcbiIsIHRlbXAxKSk7CisKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IHN0YXJ0X2RhYygpLVxuIikpOworfQorCisKK3N0YXRpYyB2b2lkIHN0b3BfYWRjKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCB0ZW1wMTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IHN0b3BfYWRjKCkrXG4iKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmVuYSAmPSB+Rk1PREVfUkVBRDsKKworCWlmIChzLT5jb252ZXJzaW9uID09IDEpIHsKKwkJcy0+Y29udmVyc2lvbiA9IDA7CisJCXMtPnByb3BfYWRjLmZtdCA9IHMtPnByb3BfYWRjLmZtdF9vcmlnaW5hbDsKKwl9CisJdGVtcDEgPSByZWFkbChzLT5wQkEwICsgQkEwX0RDUjEpIHwgRENSbl9NU0s7CisJd3JpdGVsKHRlbXAxLCBzLT5wQkEwICsgQkEwX0RDUjEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDMsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBzdG9wX2FkYygpLVxuIikpOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgdGVtcDE7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBzdGFydF9hZGMoKStcbiIpKTsKKworCWlmICghKHMtPmVuYSAmIEZNT0RFX1JFQUQpICYmCisJICAgIChzLT5kbWFfYWRjLm1hcHBlZCB8fCBzLT5kbWFfYWRjLmNvdW50IDw9CisJICAgICAoc2lnbmVkKSAocy0+ZG1hX2FkYy5kbWFzaXplIC0gMiAqIHMtPmRtYV9hZGMuZnJhZ3NpemUpKQorCSAgICAmJiBzLT5kbWFfYWRjLnJlYWR5CisjaWZuZGVmIE5PVF9DUzQyODFfUE0KKwkmJiAocy0+cG0uZmxhZ3MgJiBDUzQyODFfUE1fSURMRSkpCisjZWxzZQorKSAKKyNlbmRpZgorCXsKKwkJaWYgKHMtPnByb3BfYWRjLmZtdCAmIEFGTVRfUzggfHwgcy0+cHJvcF9hZGMuZm10ICYgQUZNVF9VOCkgeworCQkJLy8gCisJCQkvLyBub3cgb25seSB1c2UgMTYgYml0IGNhcHR1cmUsIGR1ZSB0byB0cnVuY2F0aW9uIGlzc3VlCisJCQkvLyBpbiB0aGUgY2hpcCwgbm90aWNhYmxlIGRpc3RvcnRpb24gb2NjdXJzLgorCQkJLy8gYWxsb2NhdGUgYnVmZmVyIGFuZCB0aGVuIGNvbnZlcnQgZnJvbSAxNiBiaXQgdG8gCisJCQkvLyA4IGJpdCBmb3IgdGhlIHVzZXIgYnVmZmVyLgorCQkJLy8KKwkJCXMtPnByb3BfYWRjLmZtdF9vcmlnaW5hbCA9IHMtPnByb3BfYWRjLmZtdDsKKwkJCWlmIChzLT5wcm9wX2FkYy5mbXQgJiBBRk1UX1M4KSB7CisJCQkJcy0+cHJvcF9hZGMuZm10ICY9IH5BRk1UX1M4OworCQkJCXMtPnByb3BfYWRjLmZtdCB8PSBBRk1UX1MxNl9MRTsKKwkJCX0KKwkJCWlmIChzLT5wcm9wX2FkYy5mbXQgJiBBRk1UX1U4KSB7CisJCQkJcy0+cHJvcF9hZGMuZm10ICY9IH5BRk1UX1U4OworCQkJCXMtPnByb3BfYWRjLmZtdCB8PSBBRk1UX1UxNl9MRTsKKwkJCX0KKwkJCS8vCisJCQkvLyBwcm9nX2RtYWJ1Zl9hZGMgcGVyZm9ybXMgYSBzdG9wX2FkYygpIGJ1dCB0aGF0IGlzCisJCQkvLyBvayBzaW5jZSB3ZSByZWFsbHkgaGF2ZW4ndCBzdGFydGVkIHRoZSBETUEgeWV0LgorCQkJLy8KKwkJCXByb2dfY29kZWMocywgQ1NfVFlQRV9BREMpOworCisJCQlpZiAocHJvZ19kbWFidWZfYWRjKHMpICE9IDApIHsKKwkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCQkJICJjczQyODE6IHN0YXJ0X2FkYygpOiBlcnJvciBpbiBwcm9nX2RtYWJ1Zl9hZGNcbiIpKTsKKwkJCX0KKwkJCXMtPmNvbnZlcnNpb24gPSAxOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmVuYSB8PSBGTU9ERV9SRUFEOworCQl0ZW1wMSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfRENSMSkgJiB+RENSbl9NU0s7CS8vIENsZWFyIERNQTEgY2hhbm5lbCBtYXNrIGJpdC4KKwkJd3JpdGVsKHRlbXAxLCBzLT5wQkEwICsgQkEwX0RDUjEpOwkvLyBTdGFydCByZWNvcmRpbmcKKwkJd3JpdGVsKEhJQ1JfSUVWIHwgSElDUl9DSEdNLCBzLT5wQkEwICsgQkEwX0hJQ1IpOwkvLyBFbmFibGUgaW50ZXJydXB0cy4KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJCUNTX0RCR09VVChDU19QQVJNUywgNiwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyODE6IHN0YXJ0X2FkYygpOiB3cml0ZWwgMHgleCBcbiIsIHRlbXAxKSk7CisJfQorCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IHN0YXJ0X2FkYygpLVxuIikpOworCit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisjZGVmaW5lIERNQUJVRl9NSU5PUkRFUiAxCS8vID09PiBtaW4gYnVmZmVyIHNpemUgPSA4Sy4KKworCitzdGF0aWMgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlzdHJ1Y3QgcGFnZSAqbWFwLCAqbWFwZW5kOworCisJaWYgKGRiLT5yYXdidWYpIHsKKwkJLy8gVW5kbyBwcm9nX2RtYWJ1ZigpJ3MgbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgCisJCW1hcGVuZCA9CisJCSAgICB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtCisJCQkJIDEpOworCQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChtYXApOworCQlmcmVlX2RtYWJ1ZihzLCBkYik7CisJfQorCWlmIChzLT50bXBidWZmICYmIChkYi0+dHlwZSA9PSBDU19UWVBFX0FEQykpIHsKKwkJLy8gVW5kbyBwcm9nX2RtYWJ1ZigpJ3MgbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgCisJCW1hcGVuZCA9CisJCSAgICB2aXJ0X3RvX3BhZ2Uocy0+dG1wYnVmZiArCisJCQkJIChQQUdFX1NJWkUgPDwgcy0+YnVmb3JkZXJfdG1wYnVmZikgLSAxKTsKKwkJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2Uocy0+dG1wYnVmZik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQorCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQobWFwKTsKKwkJZnJlZV9kbWFidWYyKHMsIGRiKTsKKwl9CisJcy0+dG1wYnVmZiA9IE5VTEw7CisJZGItPnJhd2J1ZiA9IE5VTEw7CisJZGItPm1hcHBlZCA9IGRiLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIpCit7CisJaW50IG9yZGVyOworCXVuc2lnbmVkIGJ5dGVzcGVyc2VjLCB0ZW1wMTsKKwl1bnNpZ25lZCBidWZzLCBzYW1wbGVfc2hpZnQgPSAwOworCXN0cnVjdCBwYWdlICptYXAsICptYXBlbmQ7CisJdW5zaWduZWQgbG9uZyBkZjsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IHByb2dfZG1hYnVmKCkrXG4iKSk7CisJZGItPmh3cHRyID0gZGItPnN3cHRyID0gZGItPnRvdGFsX2J5dGVzID0gZGItPmNvdW50ID0gZGItPmVycm9yID0KKwkgICAgZGItPmVuZGNsZWFyZWQgPSBkYi0+YmxvY2tzID0gZGItPndha2V1cCA9IGRiLT51bmRlcnJ1biA9IDA7CisvKgorKiBjaGVjayBmb3Igb3JkZXIgd2l0aGluIGxpbWl0cywgYnV0IGRvIG5vdCBvdmVyd3JpdGUgdmFsdWUsIGNoZWNrCisqIGxhdGVyIGZvciBhIGZyYWN0aW9uYWwgZGVmYXVsdG9yZGVyIChpLmUuIDEwMCspLgorKi8KKwlpZigoZGVmYXVsdG9yZGVyID4gMCkgJiYgKGRlZmF1bHRvcmRlciA8IDEyKSkKKwkJZGYgPSBkZWZhdWx0b3JkZXI7CisJZWxzZQorCQlkZiA9IDE7CQorCisJaWYgKCFkYi0+cmF3YnVmKSB7CisJCWRiLT5yZWFkeSA9IGRiLT5tYXBwZWQgPSAwOworCQlmb3IgKG9yZGVyID0gZGY7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkKKwkJCWlmICggKGRiLT5yYXdidWYgPSAodm9pZCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudCgKKwkJCQlzLT5wY2lkZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRiLT4gZG1hYWRkcikpKQorCQkJCSAgICBicmVhazsKKwkJaWYgKCFkYi0+cmF3YnVmKSB7CisJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgorCQkJCSJjczQyODE6IHByb2dfZG1hYnVmKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSByYXdidWZcbiIpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWRiLT5idWZvcmRlciA9IG9yZGVyOworCQkvLyBOb3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSB0aGUgCisJCS8vIHJlbWFwX3Bmbl9yYW5nZSgpIGluIGNzNDI4MV9tbWFwIGRvZXNuJ3Qgd29yay4KKwkJLy8gMS4gZ2V0IGluZGV4IHRvIGxhc3QgcGFnZSBpbiBtZW1fbWFwIGFycmF5IGZvciByYXdidWYuCisJCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgCisJCQkoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKworCQkvLyAyLiBtYXJrIGVhY2ggcGh5c2ljYWwgcGFnZSBpbiByYW5nZSBhcyAncmVzZXJ2ZWQnLgorCQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCisJCQlTZXRQYWdlUmVzZXJ2ZWQobWFwKTsKKwl9CisJaWYgKCFzLT50bXBidWZmICYmIChkYi0+dHlwZSA9PSBDU19UWVBFX0FEQykpIHsKKwkJZm9yIChvcmRlciA9IGRmOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7CisJCSAgICAgb3JkZXItLSkKKwkJCWlmICggKHMtPnRtcGJ1ZmYgPSAodm9pZCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudCgKKwkJCQkJcy0+cGNpZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsIAorCQkJCQkmcy0+ZG1hYWRkcl90bXBidWZmKSkpCisJCQkJICAgIGJyZWFrOworCQlpZiAoIXMtPnRtcGJ1ZmYpIHsKKwkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkJImNzNDI4MTogcHJvZ19kbWFidWYoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHRtcGJ1ZmZcbiIpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXMtPmJ1Zm9yZGVyX3RtcGJ1ZmYgPSBvcmRlcjsKKwkJLy8gTm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgdGhlIAorCQkvLyByZW1hcF9wZm5fcmFuZ2UoKSBpbiBjczQyODFfbW1hcCBkb2Vzbid0IHdvcmsuCisJCS8vIDEuIGdldCBpbmRleCB0byBsYXN0IHBhZ2UgaW4gbWVtX21hcCBhcnJheSBmb3IgcmF3YnVmLgorCQltYXBlbmQgPSB2aXJ0X3RvX3BhZ2Uocy0+dG1wYnVmZiArIAorCQkJCShQQUdFX1NJWkUgPDwgcy0+YnVmb3JkZXJfdG1wYnVmZikgLSAxKTsKKworCQkvLyAyLiBtYXJrIGVhY2ggcGh5c2ljYWwgcGFnZSBpbiByYW5nZSBhcyAncmVzZXJ2ZWQnLgorCQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShzLT50bXBidWZmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCisJCQlTZXRQYWdlUmVzZXJ2ZWQobWFwKTsKKwl9CisJaWYgKGRiLT50eXBlID09IENTX1RZUEVfREFDKSB7CisJCWlmIChzLT5wcm9wX2RhYy5mbXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSkpCisJCQlzYW1wbGVfc2hpZnQrKzsKKwkJaWYgKHMtPnByb3BfZGFjLmNoYW5uZWxzID4gMSkKKwkJCXNhbXBsZV9zaGlmdCsrOworCQlieXRlc3BlcnNlYyA9IHMtPnByb3BfZGFjLnJhdGUgPDwgc2FtcGxlX3NoaWZ0OworCX0gZWxzZQkJCS8vIENTX1RZUEVfQURDCisJeworCQlpZiAocy0+cHJvcF9hZGMuZm10ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUpKQorCQkJc2FtcGxlX3NoaWZ0Kys7CisJCWlmIChzLT5wcm9wX2FkYy5jaGFubmVscyA+IDEpCisJCQlzYW1wbGVfc2hpZnQrKzsKKwkJYnl0ZXNwZXJzZWMgPSBzLT5wcm9wX2FkYy5yYXRlIDw8IHNhbXBsZV9zaGlmdDsKKwl9CisJYnVmcyA9IFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXI7CisKKy8qCisqIGFkZGVkIGZyYWN0aW9uYWwgImRlZmF1bHRvcmRlciIgaW5wdXRzLiBpZiA+MTAwIHRoZW4gdXNlIAorKiBkZWZhdWx0b3JkZXItMTAwIGFzIHBvd2VyIG9mIDIgZm9yIHRoZSBidWZmZXIgc2l6ZS4gZXhhbXBsZToKKyogMTA2ID0gMl4oMTA2LTEwMCkgPSAyXjYgPSA2NCBieXRlcyBmb3IgdGhlIGJ1ZmZlciBzaXplLgorKi8KKwlpZihkZWZhdWx0b3JkZXIgPj0gMTAwKQorCXsKKwkJYnVmcyA9IDEgPDwgKGRlZmF1bHRvcmRlci0xMDApOworCX0KKworI2RlZmluZSBJTlRFUlJVUFRfUkFURV9NUyAgICAgICAxMDAJLy8gSW50ZXJydXB0IHJhdGUgaW4gbWlsbGlzZWNvbmRzLgorCWRiLT5udW1mcmFnID0gMjsKKy8qIAorKiBOb21pbmFsIGZyYWcgc2l6ZShieXRlcy9pbnRlcnJ1cHQpCisqLworCXRlbXAxID0gYnl0ZXNwZXJzZWMgLyAoMTAwMCAvIElOVEVSUlVQVF9SQVRFX01TKTsKKwlkYi0+ZnJhZ3NoaWZ0ID0gODsJLy8gTWluIDI1NiBieXRlcy4KKwl3aGlsZSAoMSA8PCBkYi0+ZnJhZ3NoaWZ0IDwgdGVtcDEpCS8vIENhbGMgcG93ZXIgb2YgMiBmcmFnIHNpemUuCisJCWRiLT5mcmFnc2hpZnQgKz0gMTsKKwlkYi0+ZnJhZ3NpemUgPSAxIDw8IGRiLT5mcmFnc2hpZnQ7CisJZGItPmRtYXNpemUgPSBkYi0+ZnJhZ3NpemUgKiAyOworCWRiLT5mcmFnc2FtcGxlcyA9IGRiLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnQ7CS8vICMgc2FtcGxlcy9mcmFnbWVudC4KKworLy8gSWYgdGhlIGNhbGN1bGF0ZWQgc2l6ZSBpcyBsYXJnZXIgdGhhbiB0aGUgYWxsb2NhdGVkCisvLyAgYnVmZmVyLCBkaXZpZGUgdGhlIGFsbG9jYXRlZCBidWZmZXIgaW50byAyIGZyYWdtZW50cy4KKwlpZiAoZGItPmRtYXNpemUgPiBidWZzKSB7CisKKwkJZGItPm51bWZyYWcgPSAyOwkvLyBUd28gZnJhZ21lbnRzLgorCQlkYi0+ZnJhZ3NpemUgPSBidWZzID4+IDE7CS8vIEVhY2ggMS8yIHRoZSBhbGxvYydlZCBidWZmZXIuCisJCWRiLT5mcmFnc2FtcGxlcyA9IGRiLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnQ7CS8vICMgc2FtcGxlcy9mcmFnbWVudC4KKwkJZGItPmRtYXNpemUgPSBidWZzOwkvLyBVc2UgYWxsIHRoZSBhbGxvYydlZCBidWZmZXIuCisKKwkJZGItPmZyYWdzaGlmdCA9IDA7CS8vIENhbGN1bGF0ZSAnZnJhZ3NoaWZ0Jy4KKwkJdGVtcDEgPSBkYi0+ZnJhZ3NpemU7CS8vIHVwZGF0ZV9wdHIoKSB1c2VzIGl0IAorCQl3aGlsZSAoKHRlbXAxID4+PSAxKSA+IDEpCS8vIHRvIGNhbGMgJ3RvdGFsLWJ5dGVzJworCQkJZGItPmZyYWdzaGlmdCArPSAxOwkvLyByZXR1cm5lZCBpbiBEU1BfR0VUSS9PUFRSLiAKKwl9CisJQ1NfREJHT1VUKENTX1BBUk1TLCAzLCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQyODE6IHByb2dfZG1hYnVmKCk6IG51bWZyYWc9JWQgZnJhZ3NpemU9JWQgZnJhZ3NhbXBsZXM9JWQgZnJhZ3NoaWZ0PSVkIGJ1ZnM9JWQgZm10PTB4JXggY2g9JWRcbiIsCisJCQlkYi0+bnVtZnJhZywgZGItPmZyYWdzaXplLCBkYi0+ZnJhZ3NhbXBsZXMsIAorCQkJZGItPmZyYWdzaGlmdCwgYnVmcywgCisJCQkoZGItPnR5cGUgPT0gQ1NfVFlQRV9EQUMpID8gcy0+cHJvcF9kYWMuZm10IDogCisJCQkJcy0+cHJvcF9hZGMuZm10LCAKKwkJCShkYi0+dHlwZSA9PSBDU19UWVBFX0RBQykgPyBzLT5wcm9wX2RhYy5jaGFubmVscyA6IAorCQkJCXMtPnByb3BfYWRjLmNoYW5uZWxzKSk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogcHJvZ19kbWFidWYoKS1cbiIpKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByb2dfZG1hYnVmX2FkYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgdmE7CisJdW5zaWduZWQgY291bnQ7CisJaW50IGM7CisJc3RvcF9hZGMocyk7CisJcy0+ZG1hX2FkYy50eXBlID0gQ1NfVFlQRV9BREM7CisJaWYgKChjID0gcHJvZ19kbWFidWYocywgJnMtPmRtYV9hZGMpKSkKKwkJcmV0dXJuIGM7CisKKwlpZiAocy0+ZG1hX2FkYy5yYXdidWYpIHsKKwkJbWVtc2V0KHMtPmRtYV9hZGMucmF3YnVmLAorCQkgICAgICAgKHMtPnByb3BfYWRjLgorCQkJZm10ICYgKEFGTVRfVTggfCBBRk1UX1UxNl9MRSkpID8gMHg4MCA6IDAsCisJCSAgICAgICBzLT5kbWFfYWRjLmRtYXNpemUpOworCX0KKwlpZiAocy0+dG1wYnVmZikgeworCQltZW1zZXQocy0+dG1wYnVmZiwKKwkJICAgICAgIChzLT5wcm9wX2FkYy4KKwkJCWZtdCAmIChBRk1UX1U4IHwgQUZNVF9VMTZfTEUpKSA/IDB4ODAgOiAwLAorCQkgICAgICAgUEFHRV9TSVpFIDw8IHMtPmJ1Zm9yZGVyX3RtcGJ1ZmYpOworCX0KKworCXZhID0gdmlydF90b19idXMocy0+ZG1hX2FkYy5yYXdidWYpOworCisJY291bnQgPSBzLT5kbWFfYWRjLmRtYXNpemU7CisKKwlpZiAocy0+cHJvcF9hZGMuCisJICAgIGZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TMTZfQkUgfCBBRk1UX1UxNl9CRSkpCisJCSAgICBjb3VudCAvPSAyOwkvLyAxNi1iaXQuCisKKwlpZiAocy0+cHJvcF9hZGMuY2hhbm5lbHMgPiAxKQorCQljb3VudCAvPSAyOwkvLyBBc3N1bWUgc3RlcmVvLgorCisJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgMywgcHJpbnRrKEtFUk5fSU5GTworCQkiY3M0MjgxOiBwcm9nX2RtYWJ1Zl9hZGMoKTogY291bnQ9JWQgdmE9MHglLjh4XG4iLAorCQkJY291bnQsICh1bnNpZ25lZCkgdmEpKTsKKworCXdyaXRlbCh2YSwgcy0+cEJBMCArIEJBMF9EQkExKTsJLy8gU2V0IGJ1ZmZlciBzdGFydCBhZGRyZXNzLgorCXdyaXRlbChjb3VudCAtIDEsIHMtPnBCQTAgKyBCQTBfREJDMSk7CS8vIFNldCBjb3VudC4gCisJcy0+ZG1hX2FkYy5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcm9nX2RtYWJ1Zl9kYWMoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIHZhOworCXVuc2lnbmVkIGNvdW50OworCWludCBjOworCXN0b3BfZGFjKHMpOworCXMtPmRtYV9kYWMudHlwZSA9IENTX1RZUEVfREFDOworCWlmICgoYyA9IHByb2dfZG1hYnVmKHMsICZzLT5kbWFfZGFjKSkpCisJCXJldHVybiBjOworCW1lbXNldChzLT5kbWFfZGFjLnJhd2J1ZiwKKwkgICAgICAgKHMtPnByb3BfZGFjLmZtdCAmIChBRk1UX1U4IHwgQUZNVF9VMTZfTEUpKSA/IDB4ODAgOiAwLAorCSAgICAgICBzLT5kbWFfZGFjLmRtYXNpemUpOworCisJdmEgPSB2aXJ0X3RvX2J1cyhzLT5kbWFfZGFjLnJhd2J1Zik7CisKKwljb3VudCA9IHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwlpZiAocy0+cHJvcF9kYWMuCisJICAgIGZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TMTZfQkUgfCBBRk1UX1UxNl9CRSkpCisJCSAgICBjb3VudCAvPSAyOwkvLyAxNi1iaXQuCisKKwlpZiAocy0+cHJvcF9kYWMuY2hhbm5lbHMgPiAxKQorCQljb3VudCAvPSAyOwkvLyBBc3N1bWUgc3RlcmVvLgorCisJd3JpdGVsKHZhLCBzLT5wQkEwICsgQkEwX0RCQTApOwkvLyBTZXQgYnVmZmVyIHN0YXJ0IGFkZHJlc3MuCisJd3JpdGVsKGNvdW50IC0gMSwgcy0+cEJBMCArIEJBMF9EQkMwKTsJLy8gU2V0IGNvdW50LiAgICAgICAgICAgICAKKworCUNTX0RCR09VVChDU19XQVZFX1dSSVRFLCAzLCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQyODE6IHByb2dfZG1hYnVmX2RhYygpOiBjb3VudD0lZCB2YT0weCUuOHhcbiIsCisJCQljb3VudCwgKHVuc2lnbmVkKSB2YSkpOworCisJcy0+ZG1hX2RhYy5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgY2xlYXJfYWR2YW5jZSh2b2lkICpidWYsIHVuc2lnbmVkIGJzaXplLCB1bnNpZ25lZCBicHRyLAorCQkJICB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoYnB0ciArIGxlbiA+IGJzaXplKSB7CisJCXVuc2lnbmVkIHggPSBic2l6ZSAtIGJwdHI7CisJCW1lbXNldCgoKGNoYXIgKikgYnVmKSArIGJwdHIsIGMsIHgpOworCQlicHRyID0gMDsKKwkJbGVuIC09IHg7CisJfQorCUNTX0RCR09VVChDU19XQVZFX1dSSVRFLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQyODE6IGNsZWFyX2FkdmFuY2UoKTogbWVtc2V0ICVkIGF0ICVwIGZvciAlZCBzaXplIFxuIiwKKwkJCSh1bnNpZ25lZCljLCAoKGNoYXIgKikgYnVmKSArIGJwdHIsIGxlbikpOworCW1lbXNldCgoKGNoYXIgKikgYnVmKSArIGJwdHIsIGMsIGxlbik7Cit9CisKKworCisvLyBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCEgCitzdGF0aWMgdm9pZCBjczQyODFfdXBkYXRlX3B0cihzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzLCBpbnQgaW50ZmxhZykKK3sKKwlpbnQgZGlmZjsKKwl1bnNpZ25lZCBod3B0ciwgdmE7CisKKwkvLyB1cGRhdGUgQURDIHBvaW50ZXIgCisJaWYgKHMtPmVuYSAmIEZNT0RFX1JFQUQpIHsKKwkJaHdwdHIgPSByZWFkbChzLT5wQkEwICsgQkEwX0RDQTEpOwkvLyBSZWFkIGNhcHR1cmUgRE1BIGFkZHJlc3MuCisJCXZhID0gdmlydF90b19idXMocy0+ZG1hX2FkYy5yYXdidWYpOworCQlod3B0ciAtPSAodW5zaWduZWQpIHZhOworCQlkaWZmID0KKwkJICAgIChzLT5kbWFfYWRjLmRtYXNpemUgKyBod3B0ciAtCisJCSAgICAgcy0+ZG1hX2FkYy5od3B0cikgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisJCXMtPmRtYV9hZGMuaHdwdHIgPSBod3B0cjsKKwkJcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQlzLT5kbWFfYWRjLmNvdW50ICs9IGRpZmY7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID4gcy0+ZG1hX2FkYy5kbWFzaXplKQorCQkJcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZTsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PQorCQkJICAgIChzaWduZWQpIHMtPmRtYV9hZGMuZnJhZ3NpemUpIHdha2VfdXAoJnMtPgorCQkJCQkJCQkgIGRtYV9hZGMuCisJCQkJCQkJCSAgd2FpdCk7CisJCX0gZWxzZSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IDApCisJCQkJd2FrZV91cCgmcy0+ZG1hX2FkYy53YWl0KTsKKwkJfQorCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyODE6IGNzNDI4MV91cGRhdGVfcHRyKCk6IHM9JXAgaHdwdHI9JWQgdG90YWxfYnl0ZXM9JWQgY291bnQ9JWQgXG4iLAorCQkJCXMsIHMtPmRtYV9hZGMuaHdwdHIsIHMtPmRtYV9hZGMudG90YWxfYnl0ZXMsIHMtPmRtYV9hZGMuY291bnQpKTsKKwl9CisJLy8gdXBkYXRlIERBQyBwb2ludGVyIAorCS8vCisJLy8gY2hlY2sgZm9yIGVuZCBvZiBidWZmZXIsIG1lYW5zIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHdhaXQgZm9yIGFub3RoZXIgaW50ZXJydXB0CisJLy8gdG8gYWxsb3cgc2lsZW5jZSB0byBmaWxsIHRoZSBmaWZvcyBvbiB0aGUgcGFydCwgdG8ga2VlcCBwb3BzIGRvd24gdG8gYSBtaW5pbXVtLgorCS8vCisJaWYgKHMtPmVuYSAmIEZNT0RFX1dSSVRFKSB7CisJCWh3cHRyID0gcmVhZGwocy0+cEJBMCArIEJBMF9EQ0EwKTsJLy8gUmVhZCBwbGF5IERNQSBhZGRyZXNzLgorCQl2YSA9IHZpcnRfdG9fYnVzKHMtPmRtYV9kYWMucmF3YnVmKTsKKwkJaHdwdHIgLT0gKHVuc2lnbmVkKSB2YTsKKwkJZGlmZiA9IChzLT5kbWFfZGFjLmRtYXNpemUgKyBod3B0ciAtCisJCSAgICAgcy0+ZG1hX2RhYy5od3B0cikgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCXMtPmRtYV9kYWMuaHdwdHIgPSBod3B0cjsKKwkJcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgKz0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IHMtPmRtYV9kYWMuZnJhZ3NpemUpIHsKKwkJCQlzLT5kbWFfZGFjLndha2V1cCA9IDE7CisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYy53YWl0KTsKKwkJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA+IHMtPmRtYV9kYWMuZG1hc2l6ZSkKKwkJCQkJcy0+ZG1hX2RhYy5jb3VudCAmPQorCQkJCQkgICAgcy0+ZG1hX2RhYy5kbWFzaXplIC0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgLT0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50IDw9IDApIHsKKwkJCQkvLworCQkJCS8vIGZpbGwgd2l0aCBzaWxlbmNlLCBhbmQgZG8gbm90IHNodXQgZG93biB0aGUgREFDLgorCQkJCS8vIENvbnRpbnVlIHRvIHBsYXkgc2lsZW5jZSB1bnRpbCB0aGUgX3JlbGVhc2UuCisJCQkJLy8KKwkJCQlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSwgNiwgcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiY3M0MjgxOiBjczQyODFfdXBkYXRlX3B0cigpOiBtZW1zZXQgJWQgYXQgJXAgZm9yICVkIHNpemUgXG4iLAorCQkJCQkJKHVuc2lnbmVkKShzLT5wcm9wX2RhYy5mbXQgJiAKKwkJCQkJCShBRk1UX1U4IHwgQUZNVF9VMTZfTEUpKSA/IDB4ODAgOiAwLCAKKwkJCQkJCXMtPmRtYV9kYWMucmF3YnVmLCBzLT5kbWFfZGFjLmRtYXNpemUpKTsKKwkJCQltZW1zZXQocy0+ZG1hX2RhYy5yYXdidWYsCisJCQkJICAgICAgIChzLT5wcm9wX2RhYy4KKwkJCQkJZm10ICYgKEFGTVRfVTggfCBBRk1UX1UxNl9MRSkpID8KKwkJCQkgICAgICAgMHg4MCA6IDAsIHMtPmRtYV9kYWMuZG1hc2l6ZSk7CisJCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPCAwKSB7CisJCQkJCXMtPmRtYV9kYWMudW5kZXJydW4gPSAxOworCQkJCQlzLT5kbWFfZGFjLmNvdW50ID0gMDsKKwkJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCA5LCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSAiY3M0MjgxOiBjczQyODFfdXBkYXRlX3B0cigpOiB1bmRlcnJ1blxuIikpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocy0+ZG1hX2RhYy5jb3VudCA8PQorCQkJCSAgIChzaWduZWQpIHMtPmRtYV9kYWMuZnJhZ3NpemUKKwkJCQkgICAmJiAhcy0+ZG1hX2RhYy5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzLT5kbWFfZGFjLnJhd2J1ZiwKKwkJCQkJICAgICAgcy0+ZG1hX2RhYy5kbWFzaXplLAorCQkJCQkgICAgICBzLT5kbWFfZGFjLnN3cHRyLAorCQkJCQkgICAgICBzLT5kbWFfZGFjLmZyYWdzaXplLAorCQkJCQkgICAgICAocy0+cHJvcF9kYWMuCisJCQkJCSAgICAgICBmbXQgJiAoQUZNVF9VOCB8CisJCQkJCQkgICAgICBBRk1UX1UxNl9MRSkpID8gMHg4MAorCQkJCQkgICAgICA6IDApOworCQkJCXMtPmRtYV9kYWMuZW5kY2xlYXJlZCA9IDE7CisJCQl9CisJCQlpZiAoIChzLT5kbWFfZGFjLmNvdW50IDw9IChzaWduZWQpIHMtPmRtYV9kYWMuZG1hc2l6ZS8yKSB8fAorCQkJCWludGZsYWcpCisJCQl7CisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYy53YWl0KTsKKwkJCX0KKwkJfQorCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyODE6IGNzNDI4MV91cGRhdGVfcHRyKCk6IHM9JXAgaHdwdHI9JWQgdG90YWxfYnl0ZXM9JWQgY291bnQ9JWQgXG4iLAorCQkJCXMsIHMtPmRtYV9kYWMuaHdwdHIsIHMtPmRtYV9kYWMudG90YWxfYnl0ZXMsIHMtPmRtYV9kYWMuY291bnQpKTsKKwl9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCitzdGF0aWMgdm9pZCBwcm9nX2NvZGVjKHN0cnVjdCBjczQyODFfc3RhdGUgKnMsIHVuc2lnbmVkIHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCB0ZW1wMSwgZm9ybWF0OworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogcHJvZ19jb2RlYygpKyBcbiIpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKHR5cGUgPT0gQ1NfVFlQRV9BREMpIHsKKwkJdGVtcDEgPSByZWFkbChzLT5wQkEwICsgQkEwX0RDUjEpOworCQl3cml0ZWwodGVtcDEgfCBEQ1JuX01TSywgcy0+cEJBMCArIEJBMF9EQ1IxKTsJLy8gU3RvcCBjYXB0dXJlIERNQSwgaWYgYWN0aXZlLgorCisJCS8vIHByb2dyYW0gc2FtcGxpbmcgcmF0ZXMgIAorCQkvLyBOb3RlLCBmb3IgQ1M0MjgxLCBjYXB0dXJlICYgcGxheSByYXRlcyBjYW4gYmUgc2V0IGluZGVwZW5kZW50bHkuCisJCWNzNDI4MV9yZWNvcmRfcmF0ZShzLCBzLT5wcm9wX2FkYy5yYXRlKTsKKworCQkvLyBwcm9ncmFtIEFEQyBwYXJhbWV0ZXJzIAorCQlmb3JtYXQgPSBETVJuX0RNQSB8IERNUm5fQVVUTyB8IERNUm5fVFJfV1JJVEU7CisJCWlmIChzLT5wcm9wX2FkYy4KKwkJICAgIGZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TMTZfQkUgfCBBRk1UX1UxNl9CRSkpIHsJLy8gMTYtYml0CisJCQlpZiAocy0+cHJvcF9hZGMuZm10ICYgKEFGTVRfUzE2X0JFIHwgQUZNVF9VMTZfQkUpKQkvLyBCaWctZW5kaWFuPworCQkJCWZvcm1hdCB8PSBETVJuX0JFTkQ7CisJCQlpZiAocy0+cHJvcF9hZGMuZm10ICYgKEFGTVRfVTE2X0xFIHwgQUZNVF9VMTZfQkUpKQorCQkJCWZvcm1hdCB8PSBETVJuX1VTSUdOOwkvLyBVbnNpZ25lZC4gICAgICAKKwkJfSBlbHNlCisJCQlmb3JtYXQgfD0gRE1Sbl9TSVpFOCB8IERNUm5fVVNJR047CS8vIDgtYml0LCB1bnNpZ25lZAorCQlpZiAocy0+cHJvcF9hZGMuY2hhbm5lbHMgPCAyKQorCQkJZm9ybWF0IHw9IERNUm5fTU9OTzsKKworCQl3cml0ZWwoZm9ybWF0LCBzLT5wQkEwICsgQkEwX0RNUjEpOworCisJCUNTX0RCR09VVChDU19QQVJNUywgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI4MTogcHJvZ19jb2RlYygpOiBhZGMgJXMgJXMgJXMgcmF0ZT0lZCBETVIwIGZvcm1hdD0weCUuOHhcbiIsCisJCQkJKGZvcm1hdCAmIERNUm5fU0laRTgpID8gIjgiIDogIjE2IiwKKwkJCQkoZm9ybWF0ICYgRE1Sbl9VU0lHTikgPyAgIlVuc2lnbmVkIiA6ICJTaWduZWQiLCAKKwkJCQkoZm9ybWF0ICYgRE1Sbl9NT05PKSA/ICJNb25vIiA6ICJTdGVyZW8iLCAKKwkJCQlzLT5wcm9wX2FkYy5yYXRlLCBmb3JtYXQpKTsKKworCQlzLT5lbmEgJj0gfkZNT0RFX1JFQUQ7CS8vIG5vdCBjYXB0dXJpbmcgZGF0YSB5ZXQKKwl9CisKKworCWlmICh0eXBlID09IENTX1RZUEVfREFDKSB7CisJCXRlbXAxID0gcmVhZGwocy0+cEJBMCArIEJBMF9EQ1IwKTsKKwkJd3JpdGVsKHRlbXAxIHwgRENSbl9NU0ssIHMtPnBCQTAgKyBCQTBfRENSMCk7CS8vIFN0b3AgcGxheSBETUEsIGlmIGFjdGl2ZS4KKworCQkvLyBwcm9ncmFtIHNhbXBsaW5nIHJhdGVzICAKKwkJLy8gTm90ZSwgZm9yIENTNDI4MSwgY2FwdHVyZSAmIHBsYXkgcmF0ZXMgY2FuIGJlIHNldCBpbmRlcGVuZGVudGx5LgorCQljczQyODFfcGxheV9yYXRlKHMsIHMtPnByb3BfZGFjLnJhdGUpOworCisJCS8vIHByb2dyYW0gREFDIHBhcmFtZXRlcnMgCisJCWZvcm1hdCA9IERNUm5fRE1BIHwgRE1Sbl9BVVRPIHwgRE1Sbl9UUl9SRUFEOworCQlpZiAocy0+cHJvcF9kYWMuCisJCSAgICBmbXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSB8IEFGTVRfUzE2X0JFIHwgQUZNVF9VMTZfQkUpKSB7CS8vIDE2LWJpdAorCQkJaWYgKHMtPnByb3BfZGFjLmZtdCAmIChBRk1UX1MxNl9CRSB8IEFGTVRfVTE2X0JFKSkKKwkJCQlmb3JtYXQgfD0gRE1Sbl9CRU5EOwkvLyBCaWcgRW5kaWFuLgorCQkJaWYgKHMtPnByb3BfZGFjLmZtdCAmIChBRk1UX1UxNl9MRSB8IEFGTVRfVTE2X0JFKSkKKwkJCQlmb3JtYXQgfD0gRE1Sbl9VU0lHTjsJLy8gVW5zaWduZWQuICAgICAgCisJCX0gZWxzZQorCQkJZm9ybWF0IHw9IERNUm5fU0laRTggfCBETVJuX1VTSUdOOwkvLyA4LWJpdCwgdW5zaWduZWQKKworCQlpZiAocy0+cHJvcF9kYWMuY2hhbm5lbHMgPCAyKQorCQkJZm9ybWF0IHw9IERNUm5fTU9OTzsKKworCQl3cml0ZWwoZm9ybWF0LCBzLT5wQkEwICsgQkEwX0RNUjApOworCisKKwkJQ1NfREJHT1VUKENTX1BBUk1TLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0MjgxOiBwcm9nX2NvZGVjKCk6IGRhYyAlcyAlcyAlcyByYXRlPSVkIERNUjAgZm9ybWF0PTB4JS44eFxuIiwKKwkJCQkoZm9ybWF0ICYgRE1Sbl9TSVpFOCkgPyAiOCIgOiAiMTYiLAorCQkJCShmb3JtYXQgJiBETVJuX1VTSUdOKSA/ICAiVW5zaWduZWQiIDogIlNpZ25lZCIsCisJCQkJKGZvcm1hdCAmIERNUm5fTU9OTykgPyAiTW9ubyIgOiAiU3RlcmVvIiwgCisJCQkJcy0+cHJvcF9kYWMucmF0ZSwgZm9ybWF0KSk7CisKKwkJcy0+ZW5hICY9IH5GTU9ERV9XUklURTsJLy8gbm90IGNhcHR1cmluZyBkYXRhIHlldAorCisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBwcm9nX2NvZGVjKCktIFxuIikpOworfQorCisKK3N0YXRpYyBpbnQgbWl4ZXJfaW9jdGwoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCS8vIEluZGV4IHRvIG1peGVyX3NyY1tdIGlzIHZhbHVlIG9mIEFDOTcgSW5wdXQgTXV4IFNlbGVjdCBSZWcuCisJLy8gVmFsdWUgb2YgYXJyYXkgbWVtYmVyIGlzIHJlY29yZGluZyBzb3VyY2UgRGV2aWNlIElEIE1hc2suCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtaXhlcl9zcmNbOF0gPSB7CisJCVNPVU5EX01BU0tfTUlDLCBTT1VORF9NQVNLX0NELCAwLCBTT1VORF9NQVNLX0xJTkUxLAorCQlTT1VORF9NQVNLX0xJTkUsIFNPVU5EX01BU0tfVk9MVU1FLCAwLCAwCisJfTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCS8vIEluZGV4IG9mIG1peHRhYmxlMVtdIG1lbWJlciBpcyBEZXZpY2UgSUQgCisJLy8gYW5kIG11c3QgYmUgPD0gU09VTkRfTUlYRVJfTlJERVZJQ0VTLgorCS8vIFZhbHVlIG9mIGFycmF5IG1lbWJlciBpcyBpbmRleCBpbnRvIHMtPm1peC52b2xbXQorCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1peHRhYmxlMVtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCQlbU09VTkRfTUlYRVJfUENNXSA9IDEsCS8vIHZvaWNlIAorCQlbU09VTkRfTUlYRVJfTElORTFdID0gMiwJLy8gQVVYCisJCVtTT1VORF9NSVhFUl9DRF0gPSAzLAkvLyBDRCAKKwkJW1NPVU5EX01JWEVSX0xJTkVdID0gNCwJLy8gTGluZSAKKwkJW1NPVU5EX01JWEVSX1NZTlRIXSA9IDUsCS8vIEZNCisJCVtTT1VORF9NSVhFUl9NSUNdID0gNiwJLy8gTWljIAorCQlbU09VTkRfTUlYRVJfU1BFQUtFUl0gPSA3LAkvLyBTcGVha2VyIAorCQlbU09VTkRfTUlYRVJfUkVDTEVWXSA9IDgsCS8vIFJlY29yZGluZyBsZXZlbCAKKwkJW1NPVU5EX01JWEVSX1ZPTFVNRV0gPSA5CS8vIE1hc3RlciBWb2x1bWUgCisJfTsKKworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1peHJlZ1tdID0geworCQlCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSwKKwkJQkEwX0FDOTdfQVVYX1ZPTFVNRSwKKwkJQkEwX0FDOTdfQ0RfVk9MVU1FLAorCQlCQTBfQUM5N19MSU5FX0lOX1ZPTFVNRQorCX07CisJdW5zaWduZWQgY2hhciBsLCByLCBybCwgcnIsIHZpZHg7CisJdW5zaWduZWQgY2hhciBhdHRlbnRibFsxMV0gPQorCSAgICB7IDYzLCA0MiwgMjYsIDE3LCAxNCwgMTEsIDgsIDYsIDQsIDIsIDAgfTsKKwl1bnNpZ25lZCB0ZW1wMTsKKwlpbnQgaSwgdmFsOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCSAiY3M0MjgxOiBtaXhlcl9pb2N0bCgpOiBzPSVwIGNtZD0weCUuOHhcbiIsIHMsIGNtZCkpOworI2lmIENTREVCVUcKKwljc19wcmludGlvY3RsKGNtZCk7CisjZW5kaWYKKyNpZiBDU0RFQlVHX0lOVEVSRkFDRQorCisJaWYgKChjbWQgPT0gU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSykgfHwKKwkgICAgKGNtZCA9PSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLKSB8fAorCSAgICAoY21kID09IFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMKSB8fAorCSAgICAoY21kID09IFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMKSB8fAorCSAgICAoY21kID09IFNPVU5EX01JWEVSX0NTX0FQTSkpCisJeworCQlzd2l0Y2ggKGNtZCkgeworCisJCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzoKKwkJCXJldHVybiBwdXRfdXNlcihjc19kZWJ1Z21hc2ssCisJCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOgorCQkJcmV0dXJuIHB1dF91c2VyKGNzX2RlYnVnbGV2ZWwsCisJCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQljc19kZWJ1Z21hc2sgPSB2YWw7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOgorCQkJaWYgKGdldF91c2VyKHZhbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJY3NfZGVidWdsZXZlbCA9IHZhbDsKKwkJCXJldHVybiAwOworI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisJCWNhc2UgU09VTkRfTUlYRVJfQ1NfQVBNOgorCQkJaWYgKGdldF91c2VyKHZhbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYodmFsID09IENTX0lPQ1RMX0NNRF9TVVNQRU5EKQorCQkJCWNzNDI4MV9zdXNwZW5kKHMpOworCQkJZWxzZSBpZih2YWwgPT0gQ1NfSU9DVExfQ01EX1JFU1VNRSkKKwkJCQljczQyODFfcmVzdW1lKHMpOworCQkJZWxzZQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAiY3M0MjgxOiBtaXhlcl9pb2N0bCgpOiBpbnZhbGlkIEFQTSBjbWQgKCVkKVxuIiwKKwkJCQkJdmFsKSk7CisJCQl9CisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPCisJCQkJImNzNDI4MTogbWl4ZXJfaW9jdGwoKTogRVJST1IgdW5rbm93biBkZWJ1ZyBjbWRcbiIpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUxKSB7CisJCS8vIGVuYWJsZS9kaXNhYmxlL3F1ZXJ5IG1peGVyIHByZWFtcCAKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAtMSkgeworCQkJY3M0MjgxX3JlYWRfYWM5NyhzLCBCQTBfQUM5N19NSUNfVk9MVU1FLCAmdGVtcDEpOworCQkJdGVtcDEgPSB2YWwgPyAodGVtcDEgfCAweDQwKSA6ICh0ZW1wMSAmIDB4ZmZiZik7CisJCQljczQyODFfd3JpdGVfYWM5NyhzLCBCQTBfQUM5N19NSUNfVk9MVU1FLCB0ZW1wMSk7CisJCX0KKwkJY3M0MjgxX3JlYWRfYWM5NyhzLCBCQTBfQUM5N19NSUNfVk9MVU1FLCAmdGVtcDEpOworCQl2YWwgPSAodGVtcDEgJiAweDQwKSA/IDEgOiAwOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmdwKTsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMikgeworCQkvLyBlbmFibGUvZGlzYWJsZS9xdWVyeSBzcGF0aWFsaXplciAKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IC0xKSB7CisJCQl0ZW1wMSA9ICh2YWwgJiAweDNmKSA+PiAyOworCQkJY3M0MjgxX3dyaXRlX2FjOTcocywgQkEwX0FDOTdfM0RfQ09OVFJPTCwgdGVtcDEpOworCQkJY3M0MjgxX3JlYWRfYWM5NyhzLCBCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UsCisJCQkJCSAmdGVtcDEpOworCQkJY3M0MjgxX3dyaXRlX2FjOTcocywgQkEwX0FDOTdfR0VORVJBTF9QVVJQT1NFLAorCQkJCQkgIHRlbXAxIHwgMHgyMDAwKTsKKwkJfQorCQljczQyODFfcmVhZF9hYzk3KHMsIEJBMF9BQzk3XzNEX0NPTlRST0wsICZ0ZW1wMSk7CisJCXJldHVybiBwdXRfdXNlcigodGVtcDEgPDwgMikgfCAzLCAoaW50IF9fdXNlciAqKWFyZ3ApOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKKwkJbWl4ZXJfaW5mbyBpbmZvOworCQlzdHJsY3B5KGluZm8uaWQsICJDUzQyODEiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgIkNyeXN0YWwgQ1M0MjgxIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpbmZvLm1vZGlmeV9jb3VudGVyID0gcy0+bWl4Lm1vZGNudDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9PTERfTUlYRVJfSU5GTykgeworCQlfb2xkX21peGVyX2luZm8gaW5mbzsKKwkJc3RybGNweShpbmZvLmlkLCAiQ1M0MjgxIiwgc2l6ZW9mKGluZm8uaWQpKTsKKwkJc3RybGNweShpbmZvLm5hbWUsICJDcnlzdGFsIENTNDI4MSIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgX191c2VyICopIGFyZ3ApOworCisJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdNJyB8fCBfU0lPQ19TSVpFKGNtZCkgIT0gc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gSWYgaW9jdGwgaGFzIG9ubHkgdGhlIFNJT0NfUkVBRCBiaXQoYml0IDMxKQorCS8vIG9uLCBwcm9jZXNzIHRoZSBvbmx5LXJlYWQgY29tbWFuZHMuIAorCWlmIChfU0lPQ19ESVIoY21kKSA9PSBfU0lPQ19SRUFEKSB7CisJCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgkvLyBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAKKwkJCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfUkVDT1JEX1NFTEVDVCwgJnRlbXAxKTsKKwkJCXJldHVybiBwdXRfdXNlcihtaXhlcl9zcmNbdGVtcDEmN10sIChpbnQgX191c2VyICopYXJncCk7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgkvLyBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIGRldmljZSAKKwkJCXJldHVybiBwdXRfdXNlcihTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfU1lOVEggfAorCQkJCQlTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19MSU5FIHwKKwkJCQkJU09VTkRfTUFTS19MSU5FMSB8IFNPVU5EX01BU0tfTUlDIHwKKwkJCQkJU09VTkRfTUFTS19WT0xVTUUgfAorCQkJCQlTT1VORF9NQVNLX1JFQ0xFViB8CisJCQkJCVNPVU5EX01BU0tfU1BFQUtFUiwgKGludCBfX3VzZXIgKilhcmdwKTsKKworCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CS8vIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgcmVjb3JkaW5nIHNvdXJjZSAKKwkJCXJldHVybiBwdXRfdXNlcihTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX01JQyB8CisJCQkJCVNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX1ZPTFVNRSB8CisJCQkJCVNPVU5EX01BU0tfTElORTEsIChpbnQgX191c2VyICopIGFyZ3ApOworCisJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoJLy8gTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gCisJCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX1NZTlRIIHwKKwkJCQkJU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfTElORSB8CisJCQkJCVNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX01JQyB8CisJCQkJCVNPVU5EX01BU0tfVk9MVU1FIHwKKwkJCQkJU09VTkRfTUFTS19SRUNMRVYsIChpbnQgX191c2VyICopYXJncCk7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX0NBUF9FWENMX0lOUFVULCAoaW50IF9fdXNlciAqKWFyZ3ApOworCisJCWRlZmF1bHQ6CisJCQlpID0gX0lPQ19OUihjbWQpOworCQkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTCisJCQkgICAgfHwgISh2aWR4ID0gbWl4dGFibGUxW2ldKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sW3ZpZHggLSAxXSwgKGludCBfX3VzZXIgKilhcmdwKTsKKwkJfQorCX0KKwkvLyBJZiBpb2N0bCBkb2Vzbid0IGhhdmUgYm90aCB0aGUgU0lPQ19SRUFEIGFuZCAKKwkvLyB0aGUgU0lPQ19XUklURSBiaXQgc2V0LCByZXR1cm4gaW52YWxpZC4KKwlpZiAoX1NJT0NfRElSKGNtZCkgIT0gKF9TSU9DX1JFQUQgfCBfU0lPQ19XUklURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvZiB2b2x1bWUgd3JpdGVzLgorCXMtPm1peC5tb2RjbnQrKzsKKworCS8vIElzb2xhdGUgdGhlIGNvbW1hbmQ7IGl0IG11c3QgYmUgYSB3cml0ZS4KKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CS8vIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlIAorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWkgPSBod2VpZ2h0MzIodmFsKTsJLy8gaSA9ICMgYml0cyBvbiBpbiB2YWwuCisJCWlmIChpICE9IDEpCS8vIE9uZSAmIG9ubHkgMSBiaXQgbXVzdCBiZSBvbi4KKwkJCXJldHVybiAwOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1peGVyX3NyYykgLyBzaXplb2YoaW50KTsgaSsrKSB7CisJCQlpZiAodmFsID09IG1peGVyX3NyY1tpXSkgeworCQkJCXRlbXAxID0gKGkgPDwgOCkgfCBpOworCQkJCWNzNDI4MV93cml0ZV9hYzk3KHMsCisJCQkJCQkgIEJBMF9BQzk3X1JFQ09SRF9TRUxFQ1QsCisJCQkJCQkgIHRlbXAxKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CS8vIE1heCBzb3VuZGNhcmQuaCB2b2wgaXMgMTAwLgorCQlpZiAobCA8IDYpIHsKKwkJCXJsID0gNjM7CisJCQlsID0gMDsKKwkJfSBlbHNlCisJCQlybCA9IGF0dGVudGJsWygxMCAqIGwpIC8gMTAwXTsJLy8gQ29udmVydCAwLTEwMCB2b2wgdG8gNjMtMCBhdHRlbi4KKworCQlyID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWlmIChyID4gMTAwKQorCQkJciA9IDEwMDsJLy8gTWF4IHJpZ2h0IHZvbHVtZSBpcyAxMDAsIHRvbworCQlpZiAociA8IDYpIHsKKwkJCXJyID0gNjM7CisJCQlyID0gMDsKKwkJfSBlbHNlCisJCQlyciA9IGF0dGVudGJsWygxMCAqIHIpIC8gMTAwXTsJLy8gQ29udmVydCB2b2x1bWUgdG8gYXR0ZW51YXRpb24uCisKKwkJaWYgKChybCA+IDYwKSAmJiAocnIgPiA2MCkpCS8vIElmIGJvdGggbCAmIHIgYXJlICdsb3cnLCAgICAgICAgICAKKwkJCXRlbXAxID0gMHg4MDAwOwkvLyAgdHVybiBvbiB0aGUgbXV0ZSBiaXQuCisJCWVsc2UKKwkJCXRlbXAxID0gMDsKKworCQl0ZW1wMSB8PSAocmwgPDwgOCkgfCBycjsKKworCQljczQyODFfd3JpdGVfYWM5NyhzLCBCQTBfQUM5N19NQVNURVJfVk9MVU1FLCB0ZW1wMSk7CisJCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUsIHRlbXAxKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sWzhdID0gKCh1bnNpZ25lZCBpbnQpIHIgPDwgOCkgfCBsOworI2Vsc2UKKwkJcy0+bWl4LnZvbFs4XSA9IHZhbDsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFs4XSwgKGludCBfX3VzZXIgKilhcmdwKTsKKworCWNhc2UgU09VTkRfTUlYRVJfU1BFQUtFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOworCQlpZiAobCA8IDMpIHsKKwkJCXJsID0gMDsKKwkJCWwgPSAwOworCQl9IGVsc2UgeworCQkJcmwgPSAobCAqIDIgLSA1KSAvIDEzOwkvLyBDb252ZXJ0IDAtMTAwIHJhbmdlIHRvIDAtMTUuCisJCQlsID0gKHJsICogMTMgKyA1KSAvIDI7CisJCX0KKworCQlpZiAocmwgPCAzKSB7CisJCQl0ZW1wMSA9IDB4ODAwMDsKKwkJCXJsID0gMDsKKwkJfSBlbHNlCisJCQl0ZW1wMSA9IDA7CisJCXJsID0gMTUgLSBybDsJLy8gQ29udmVydCB2b2x1bWUgdG8gYXR0ZW51YXRpb24uCisJCXRlbXAxIHw9IHJsIDw8IDE7CisJCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X1BDX0JFRVBfVk9MVU1FLCB0ZW1wMSk7CisKKyNpZmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKwkJcy0+bWl4LnZvbFs2XSA9IGwgPDwgODsKKyNlbHNlCisJCXMtPm1peC52b2xbNl0gPSB2YWw7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbNl0sIChpbnQgX191c2VyICopYXJncCk7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOworCQlyID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWlmIChyID4gMTAwKQorCQkJciA9IDEwMDsKKwkJcmwgPSAobCAqIDIgLSA1KSAvIDEzOwkvLyBDb252ZXJ0IDAtMTAwIHNjYWxlIHRvIDAtMTUuCisJCXJyID0gKHIgKiAyIC0gNSkgLyAxMzsKKwkJaWYgKHJsIDwgMyAmJiByciA8IDMpCisJCQl0ZW1wMSA9IDB4ODAwMDsKKwkJZWxzZQorCQkJdGVtcDEgPSAwOworCisJCXRlbXAxID0gdGVtcDEgfCAocmwgPDwgOCkgfCBycjsKKwkJY3M0MjgxX3dyaXRlX2FjOTcocywgQkEwX0FDOTdfUkVDT1JEX0dBSU4sIHRlbXAxKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sWzddID0gKCh1bnNpZ25lZCBpbnQpIHIgPDwgOCkgfCBsOworI2Vsc2UKKwkJcy0+bWl4LnZvbFs3XSA9IHZhbDsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFs3XSwgKGludCBfX3VzZXIgKilhcmdwKTsKKworCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCWlmIChsIDwgMSkgeworCQkJbCA9IDA7CisJCQlybCA9IDA7CisJCX0gZWxzZSB7CisJCQlybCA9ICgodW5zaWduZWQpIGwgKiA1IC0gNCkgLyAxNjsJLy8gQ29udmVydCAwLTEwMCByYW5nZSB0byAwLTMxLgorCQkJbCA9IChybCAqIDE2ICsgNCkgLyA1OworCQl9CisJCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfTUlDX1ZPTFVNRSwgJnRlbXAxKTsKKwkJdGVtcDEgJj0gMHg0MDsJLy8gSXNvbGF0ZSAyMGRiIGdhaW4gYml0LgorCQlpZiAocmwgPCAzKSB7CisJCQl0ZW1wMSB8PSAweDgwMDA7CisJCQlybCA9IDA7CisJCX0KKwkJcmwgPSAzMSAtIHJsOwkvLyBDb252ZXJ0IHZvbHVtZSB0byBhdHRlbnVhdGlvbi4KKwkJdGVtcDEgfD0gcmw7CisJCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X01JQ19WT0xVTUUsIHRlbXAxKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sWzVdID0gdmFsIDw8IDg7CisjZWxzZQorCQlzLT5taXgudm9sWzVdID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzVdLCAoaW50IF9fdXNlciAqKWFyZ3ApOworCisKKwljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJciA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlpZiAociA+IDEwMCkKKwkJCXIgPSAxMDA7CisJCXJsID0gKGwgKiAyIC0gMTEpIC8gMzsJLy8gQ29udmVydCAwLTEwMCByYW5nZSB0byAwLTYzLgorCQlyciA9IChyICogMiAtIDExKSAvIDM7CisJCWlmIChybCA8IDMpCS8vIElmIGwgaXMgbG93LCB0dXJuIG9uCisJCQl0ZW1wMSA9IDB4MDA4MDsJLy8gIHRoZSBtdXRlIGJpdC4KKwkJZWxzZQorCQkJdGVtcDEgPSAwOworCisJCXJsID0gNjMgLSBybDsJLy8gQ29udmVydCB2b2wgdG8gYXR0ZW51YXRpb24uCisJCXdyaXRlbCh0ZW1wMSB8IHJsLCBzLT5wQkEwICsgQkEwX0ZNTFZDKTsKKwkJaWYgKHJyIDwgMykJLy8gIElmIHJyIGlzIGxvdywgdHVybiBvbgorCQkJdGVtcDEgPSAweDAwODA7CS8vICAgdGhlIG11dGUgYml0LgorCQllbHNlCisJCQl0ZW1wMSA9IDA7CisJCXJyID0gNjMgLSBycjsJLy8gQ29udmVydCB2b2wgdG8gYXR0ZW51YXRpb24uCisJCXdyaXRlbCh0ZW1wMSB8IHJyLCBzLT5wQkEwICsgQkEwX0ZNUlZDKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sWzRdID0gKHIgPDwgOCkgfCBsOworI2Vsc2UKKwkJcy0+bWl4LnZvbFs0XSA9IHZhbDsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFs0XSwgKGludCBfX3VzZXIgKilhcmdwKTsKKworCisJZGVmYXVsdDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0MjgxOiBtaXhlcl9pb2N0bCgpOiBkZWZhdWx0XG4iKSk7CisKKwkJaSA9IF9JT0NfTlIoY21kKTsKKwkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOworCQlpZiAobCA8IDEpIHsKKwkJCWwgPSAwOworCQkJcmwgPSAzMTsKKwkJfSBlbHNlCisJCQlybCA9IChhdHRlbnRibFsobCAqIDEwKSAvIDEwMF0pID4+IDE7CisKKwkJciA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlpZiAociA+IDEwMCkKKwkJCXIgPSAxMDA7CisJCWlmIChyIDwgMSkgeworCQkJciA9IDA7CisJCQlyciA9IDMxOworCQl9IGVsc2UKKwkJCXJyID0gKGF0dGVudGJsWyhyICogMTApIC8gMTAwXSkgPj4gMTsKKwkJaWYgKChybCA+IDMwKSAmJiAocnIgPiAzMCkpCisJCQl0ZW1wMSA9IDB4ODAwMDsKKwkJZWxzZQorCQkJdGVtcDEgPSAwOworCQl0ZW1wMSA9IHRlbXAxIHwgKHJsIDw8IDgpIHwgcnI7CisJCWNzNDI4MV93cml0ZV9hYzk3KHMsIG1peHJlZ1t2aWR4IC0gMV0sIHRlbXAxKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sW3ZpZHggLSAxXSA9ICgodW5zaWduZWQgaW50KSByIDw8IDgpIHwgbDsKKyNlbHNlCisJCXMtPm1peC52b2xbdmlkeCAtIDFdID0gdmFsOworI2VuZGlmCisjaWZuZGVmIE5PVF9DUzQyODFfUE0KKwkJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoS0VSTl9JTkZPIAorCQkJIndyaXRlIGFjOTcgbWl4cmVnWyVkXT0weCV4IG1peC52b2xbXT0weCV4XG4iLCAKKwkJCQl2aWR4LTEsdGVtcDEscy0+bWl4LnZvbFt2aWR4LTFdKSk7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbdmlkeCAtIDFdLCAoaW50IF9fdXNlciAqKWFyZ3ApOworCX0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKK3N0YXRpYyBpbnQgY3M0MjgxX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcz1OVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgNCwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV9vcGVuX21peGRldigpK1xuIikpOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDI4MV9kZXZzKQorCXsKKwkJcyA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjczQyODFfc3RhdGUsIGxpc3QpOworCQlpZihzLT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisJaWYgKCFzKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiB8IENTX0VSUk9SLCAyLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjczQyODFfb3Blbl9taXhkZXYoKS0gLUVOT0RFVlxuIikpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDQsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjczQyODFfb3Blbl9taXhkZXYoKS0gMFxuIikpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisKK3N0YXRpYyBpbnQgY3M0MjgxX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjczQyODFfc3RhdGUgKnMgPQorCSAgICAoc3RydWN0IGNzNDI4MV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNzNDI4MV9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIG1peGVyX2lvY3RsKChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YSwgY21kLAorCQkJICAgYXJnKTsKK30KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICAgTWl4ZXIgZmlsZSBvcGVyYXRpb25zIHN0cnVjdC4KKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjczQyODFfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkgPSBub19sbHNlZWssCisJLmlvY3RsCSA9IGNzNDI4MV9pb2N0bF9taXhkZXYsCisJLm9wZW4JID0gY3M0MjgxX29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlID0gY3M0MjgxX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisKK3N0YXRpYyBpbnQgZHJhaW5fYWRjKHN0cnVjdCBjczQyODFfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudDsKKwl1bnNpZ25lZCB0bW87CisKKwlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCXJldHVybiAwOworCWFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGRyYWluX2FkYygpICVkXG4iLCBjb3VudCkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKSB7CisJCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCQkgImNzNDI4MTogZHJhaW5fYWRjKCkgY291bnQ8MFxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWlmIChub25ibG9jaykgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9hZGMud2FpdCwgJndhaXQpOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXRtbyA9CisJCSAgICAzICogSFogKiAoY291bnQgKworCQkJICAgICAgcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgLyAyIC8gcy0+cHJvcF9hZGMucmF0ZTsKKwkJaWYgKHMtPnByb3BfYWRjLmZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFKSkKKwkJCXRtbyA+Pj0gMTsKKwkJaWYgKHMtPnByb3BfYWRjLmNoYW5uZWxzID4gMSkKKwkJCXRtbyA+Pj0gMTsKKwkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyArIDEpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImNzNDI4MTogZG1hIHRpbWVkIG91dD8/XG4iKTsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9hZGMud2FpdCwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50OworCXVuc2lnbmVkIHRtbzsKKworCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJcmV0dXJuIDA7CisJYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlpZiAobm9uYmxvY2spIHsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQl0bW8gPQorCQkgICAgMyAqIEhaICogKGNvdW50ICsKKwkJCSAgICAgIHMtPmRtYV9kYWMuZnJhZ3NpemUpIC8gMiAvIHMtPnByb3BfZGFjLnJhdGU7CisJCWlmIChzLT5wcm9wX2RhYy5mbXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSkpCisJCQl0bW8gPj49IDE7CisJCWlmIChzLT5wcm9wX2RhYy5jaGFubmVscyA+IDEpCisJCQl0bW8gPj49IDE7CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gKyAxKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJjczQyODE6IGRtYSB0aW1lZCBvdXQ/P1xuIik7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJcmV0dXJuIDA7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIENvcHlTYW1wbGVzIGNvcGllcyAxNi1iaXQgc3RlcmVvIHNhbXBsZXMgZnJvbSB0aGUgc291cmNlIHRvIHRoZQorLy8gZGVzdGluYXRpb24sIHBvc3NpYmx5IGNvbnZlcnRpbmcgZG93biB0byBlaXRoZXIgOC1iaXQgb3IgbW9ubyBvciBib3RoLgorLy8gY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIHRvIHdyaXRlLgorLy8KKy8vICBBcmd1bWVudHM6CisvLworLy8gIGRzdCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gYSBkZXN0aW5hdGlvbiBidWZmZXIuCisvLyAgc3JjICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhIHNvdXJjZSBidWZmZXIKKy8vICBjb3VudCAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorLy8gIGlDaGFubmVscyAgICAgICAtIFN0ZXJlbyAtIDIKKy8vICAgICAgICAgICAgICAgICAgICBNb25vICAgLSAxCisvLyAgZm10ICAgICAgICAgICAgIC0gQUZNVF94eHggKHNvdW5kY2FyZC5oIGZvcm1hdHMpCisvLworLy8gTk9URVM6IG9ubHkgY2FsbCB0aGlzIHJvdXRpbmUgZm9yIGNvbnZlcnNpb24gdG8gOGJpdCBmcm9tIDE2Yml0CisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZCBDb3B5U2FtcGxlcyhjaGFyICpkc3QsIGNoYXIgKnNyYywgaW50IGNvdW50LCBpbnQgaUNoYW5uZWxzLAorCQkJdW5zaWduZWQgZm10KQoreworCisJdW5zaWduZWQgc2hvcnQgKnBzU3JjOworCWxvbmcgbEF1ZGlvU2FtcGxlOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogQ29weVNhbXBsZXMoKSsgIikpOworCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJICIgZHN0PSVwIHNyYz0lcCBjb3VudD0lZCBpQ2hhbm5lbHM9JWQgZm10PTB4JXhcbiIsCisJCQkgZHN0LCBzcmMsICh1bnNpZ25lZCkgY291bnQsICh1bnNpZ25lZCkgaUNoYW5uZWxzLCAodW5zaWduZWQpIGZtdCkpOworCisJLy8gR2Vyc2h3aW4gZG9lcyBmb3JtYXQgY29udmVyc2lvbiBpbiBoYXJkd2FyZSBzbyBub3JtYWxseQorCS8vIHdlIGRvbid0IGRvIGFueSBob3N0IGJhc2VkIGNvdmVyc2lvbi4gVGhlIGRhdGEgZm9ybWF0dGVyCisJLy8gdHJ1bmNhdGVzIDE2IGJpdCBkYXRhIHRvIDggYml0IGFuZCB0aGF0IGNhdXNlcyBzb21lIGhpc3MuCisJLy8gV2UgaGF2ZSBhbHJlYWR5IGZvcmNlZCB0aGUgSFcgdG8gZG8gMTYgYml0IHNhbXBsaW5nIGFuZCAKKwkvLyAyIGNoYW5uZWwgc28gdGhhdCB3ZSBjYW4gdXNlIHNvZnR3YXJlIHRvIHJvdW5kIGluc3RlYWQgCisJLy8gb2YgdHJ1bmNhdGUKKworCS8vCisJLy8gU2VlIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXMgOC1iaXQgdW5zaWduZWQgc3RlcmVvLgorCS8vIG9yIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXQgOC1iaXQgdW5zaWduZWQgbW9uby4KKwkvLworCWlmICggKChpQ2hhbm5lbHMgPT0gMikgJiYgKGZtdCAmIEFGTVRfVTgpKSB8fAorCQkoKGlDaGFubmVscyA9PSAxKSAmJiAoZm10ICYgQUZNVF9VOCkpICkgeworCQkvLworCQkvLyBDb252ZXJ0IGVhY2ggMTYtYml0IHVuc2lnbmVkIHN0ZXJlbyBzYW1wbGUgdG8gOC1iaXQgdW5zaWduZWQgCisJCS8vIHN0ZXJlbyB1c2luZyByb3VuZGluZy4KKwkJLy8KKwkJcHNTcmMgPSAodW5zaWduZWQgc2hvcnQgKikgc3JjOworCQljb3VudCA9IGNvdW50IC8gMjsKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCWxBdWRpb1NhbXBsZSA9IChsb25nKSBwc1NyY1tjb3VudF0gKyAobG9uZykgMHg4MDsKKwkJCWlmIChsQXVkaW9TYW1wbGUgPiAweGZmZmYpIHsKKwkJCQlsQXVkaW9TYW1wbGUgPSAweGZmZmY7CisJCQl9CisJCQlkc3RbY291bnRdID0gKGNoYXIpIChsQXVkaW9TYW1wbGUgPj4gOCk7CisJCX0KKwl9CisJLy8KKwkvLyBjaGVjayBmb3IgOC1iaXQgc2lnbmVkIHN0ZXJlby4KKwkvLworCWVsc2UgaWYgKChpQ2hhbm5lbHMgPT0gMikgJiYgKGZtdCAmIEFGTVRfUzgpKSB7CisJCS8vCisJCS8vIENvbnZlcnQgZWFjaCAxNi1iaXQgc3RlcmVvIHNhbXBsZSB0byA4LWJpdCBzdGVyZW8gdXNpbmcgcm91bmRpbmcuCisJCS8vCisJCXBzU3JjID0gKHNob3J0ICopIHNyYzsKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCWxBdWRpb1NhbXBsZSA9CisJCQkgICAgKCgobG9uZykgcHNTcmNbMF0gKyAobG9uZykgcHNTcmNbMV0pIC8gMik7CisJCQlwc1NyYyArPSAyOworCQkJKmRzdCsrID0gKGNoYXIpICgoc2hvcnQpIGxBdWRpb1NhbXBsZSA+PiA4KTsKKwkJfQorCX0KKwkvLworCS8vIE90aGVyd2lzZSwgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhcyA4LWJpdCBzaWduZWQgbW9uby4KKwkvLworCWVsc2UgaWYgKChpQ2hhbm5lbHMgPT0gMSkgJiYgKGZtdCAmIEFGTVRfUzgpKSB7CisJCS8vCisJCS8vIENvbnZlcnQgZWFjaCAxNi1iaXQgc2lnbmVkIG1vbm8gc2FtcGxlIHRvIDgtYml0IHNpZ25lZCBtb25vIAorCQkvLyB1c2luZyByb3VuZGluZy4KKwkJLy8KKwkJcHNTcmMgPSAoc2hvcnQgKikgc3JjOworCQljb3VudCA9IGNvdW50IC8gMjsKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCWxBdWRpb1NhbXBsZSA9CisJCQkgICAgKCgobG9uZykgcHNTcmNbMF0gKyAobG9uZykgcHNTcmNbMV0pIC8gMik7CisJCQlpZiAobEF1ZGlvU2FtcGxlID4gMHg3ZmZmKSB7CisJCQkJbEF1ZGlvU2FtcGxlID0gMHg3ZmZmOworCQkJfQorCQkJcHNTcmMgKz0gMjsKKwkJCSpkc3QrKyA9IChjaGFyKSAoKHNob3J0KSBsQXVkaW9TYW1wbGUgPj4gOCk7CisJCX0KKwl9Cit9CisKKy8vCisvLyBjc19jb3B5X3RvX3VzZXIoKQorLy8gcmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZCBjb3B5X3RvX3VzZXIsIHRvIGFsbG93IGZvciBhIGNvbnZlcnNpb24gZnJvbQorLy8gMTYgYml0IHRvIDggYml0IGlmIHRoZSByZWNvcmQgY29udmVyc2lvbiBpcyBhY3RpdmUuICB0aGUgY3M0MjgxIGhhcyBzb21lCisvLyBpc3N1ZXMgd2l0aCA4IGJpdCBjYXB0dXJlLCBzbyB0aGUgZHJpdmVyIGFsd2F5cyBjYXB0dXJlcyBkYXRhIGluIDE2IGJpdAorLy8gYW5kIHRoZW4gaWYgdGhlIHVzZXIgcmVxdWVzdGVkIDggYml0LCBjb252ZXJ0cyBmcm9tIDE2IHRvIDggYml0LgorLy8KK3N0YXRpYyB1bnNpZ25lZCBjc19jb3B5X3RvX3VzZXIoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgdm9pZCBfX3VzZXIgKmRlc3QsCisJCQkJdW5zaWduZWQgKmh3c3JjLCB1bnNpZ25lZCBjbnQsCisJCQkJdW5zaWduZWQgKmNvcGllZCkKK3sKKwl2b2lkICpzcmMgPSBod3NyYzsJLy9kZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBkZXN0aW5hdGlvbiBidWZmZXIgYWRkcgorCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA2LCBwcmludGsoS0VSTl9JTkZPCisJCSJjc19jb3B5X3RvX3VzZXIoKSsgZm10PTB4JXggZm10X289MHgleCBjbnQ9JWQgZGVzdD0lcFxuIiwKKwkJCXMtPnByb3BfYWRjLmZtdCwgcy0+cHJvcF9hZGMuZm10X29yaWdpbmFsLAorCQkJKHVuc2lnbmVkKSBjbnQsIGRlc3QpKTsKKworCWlmIChjbnQgPiBzLT5kbWFfYWRjLmRtYXNpemUpIHsKKwkJY250ID0gcy0+ZG1hX2FkYy5kbWFzaXplOworCX0KKwlpZiAoIWNudCkgeworCQkqY29waWVkID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzLT5jb252ZXJzaW9uKSB7CisJCWlmICghcy0+dG1wYnVmZikgeworCQkJKmNvcGllZCA9IGNudCAvIDI7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlDb3B5U2FtcGxlcyhzLT50bXBidWZmLCAodm9pZCAqKSBod3NyYywgY250LAorCQkJICAgICh1bnNpZ25lZCkgcy0+cHJvcF9hZGMuY2hhbm5lbHMsCisJCQkgICAgcy0+cHJvcF9hZGMuZm10X29yaWdpbmFsKTsKKwkJc3JjID0gcy0+dG1wYnVmZjsKKwkJY250ID0gY250IC8gMjsKKwl9CisKKwlpZiAoY29weV90b191c2VyKGRlc3QsIHNyYywgY250KSkgeworCQkqY29waWVkID0gMDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCSpjb3BpZWQgPSBjbnQ7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQyODE6IGNzX2NvcHlfdG9fdXNlcigpLSBjb3BpZWQgYnl0ZXMgaXMgJWQgXG4iLCBjbnQpKTsKKwlyZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCitzdGF0aWMgc3NpemVfdCBjczQyODFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICogcHBvcykKK3sKKwlzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzID0KKwkgICAgKHN0cnVjdCBjczQyODFfc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKwl1bnNpZ25lZCBjb3BpZWQgPSAwOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9SRUFELCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3M0MjgxX3JlYWQoKSsgJVp1IFxuIiwgY291bnQpKTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKy8vCisvLyAiY291bnQiIGlzIHRoZSBhbW91bnQgb2YgYnl0ZXMgdG8gcmVhZCAoZnJvbSBhcHApLCBpcyBkZWNyZW1lbnRlZCBlYWNoIGxvb3AKKy8vICAgICAgYnkgdGhlIGFtb3VudCBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiByZXR1cm5lZCB0byB0aGUgdXNlciBidWZmZXIuCisvLyAiY250IiBpcyB0aGUgcnVubmluZyB0b3RhbCBvZiBlYWNoIHJlYWQgZnJvbSB0aGUgYnVmZmVyIChjaGFuZ2VzIGVhY2ggbG9vcCkKKy8vICJidWZmZXIiIHBvaW50cyB0byB0aGUgYXBwJ3MgYnVmZmVyCisvLyAicmV0IiBrZWVwcyBhIHJ1bm5pbmcgdG90YWwgb2YgdGhlIGFtb3VudCBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiBjb3BpZWQKKy8vICAgICAgdG8gdGhlIHVzZXIgYnVmZmVyLgorLy8gImNvcGllZCIgaXMgdGhlIHRvdGFsIGJ5dGVzIGNvcGllZCBpbnRvIHRoZSB1c2VyIGJ1ZmZlciBmb3IgZWFjaCBsb29wLgorLy8KKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJCSJfcmVhZCgpIGNvdW50PjAgY291bnQ9JVp1IC5jb3VudD0lZCAuc3dwdHI9JWQgLmh3cHRyPSVkIFxuIiwKKwkJCQljb3VudCwgcy0+ZG1hX2FkYy5jb3VudCwKKwkJCQlzLT5kbWFfYWRjLnN3cHRyLCBzLT5kbWFfYWRjLmh3cHRyKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkJLy8gZ2V0IHRoZSBjdXJyZW50IGNvcHkgcG9pbnQgb2YgdGhlIHN3IGJ1ZmZlcgorCQlzd3B0ciA9IHMtPmRtYV9hZGMuc3dwdHI7CisKKwkJLy8gY250IGlzIHRoZSBhbW91bnQgb2YgdW5yZWFkIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiB0aGUgCisJCS8vIGh3IGJ1ZmZlciB0byB0aGUgY3VycmVudCBzdyBwb2ludGVyCisJCWNudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZSAtIHN3cHRyOworCisJCS8vIGRtYV9hZGMuY291bnQgaXMgdGhlIGN1cnJlbnQgdG90YWwgYnl0ZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlYWQuCisJCS8vIGlmIHRoZSBhbW91bnQgb2YgdW5yZWFkIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgc3cgcG9pbnRlciB0byB0aGUKKwkJLy8gZW5kIG9mIHRoZSBidWZmZXIgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHRvdGFsIGJ5dGVzIHRoYXQKKwkJLy8gaGF2ZSBub3QgYmVlbiByZWFkLCB0aGVuIHNldCB0aGUgImNudCIgKHVucmVhZCBieXRlcykgdG8gdGhlCisJCS8vIGFtb3VudCBvZiB1bnJlYWQgYnl0ZXMuICAKKworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA8IGNudCkKKwkJCWNudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJLy8KKwkJLy8gaWYgd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSA4LzE2IHRoZW4gd2UgbmVlZCB0byBjb3B5CisJCS8vIHR3aWNlIHRoZSBudW1iZXIgb2YgMTYgYml0IGJ5dGVzIHRoZW4gOCBiaXQgYnl0ZXMuCisJCS8vIAorCQlpZiAocy0+Y29udmVyc2lvbikgeworCQkJaWYgKGNudCA+IChjb3VudCAqIDIpKQorCQkJCWNudCA9IChjb3VudCAqIDIpOworCQl9IGVsc2UgeworCQkJaWYgKGNudCA+IGNvdW50KQorCQkJCWNudCA9IGNvdW50OworCQl9CisJCS8vCisJCS8vICJjbnQiIE5PVyBpcyB0aGUgc21hbGxlciBvZiB0aGUgYW1vdW50IHRoYXQgd2lsbCBiZSByZWFkLAorCQkvLyBhbmQgdGhlIGFtb3VudCB0aGF0IGlzIHJlcXVlc3RlZCBpbiB0aGlzIHJlYWQgKG9yIHBhcnRpYWwpLgorCQkvLyBpZiB0aGVyZSBhcmUgbm8gYnl0ZXMgaW4gdGhlIGJ1ZmZlciB0byByZWFkLCB0aGVuIHN0YXJ0IHRoZQorCQkvLyBBREMgYW5kIHdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byB3YWtlIHVzIHVwLgorCQkvLworCQlpZiAoY250IDw9IDApIHsKKworCQkJLy8gc3RhcnQgdXAgdGhlIGRtYSBlbmdpbmUgYW5kIHRoZW4gY29udGludWUgYmFjayB0byB0aGUgdG9wIG9mCisJCQkvLyB0aGUgbG9vcCB3aGVuIHdha2UgdXAgb2NjdXJzLgorCQkJc3RhcnRfYWRjKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcy0+ZG1hX2FkYy53YWl0KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCQkJY29udGludWU7CisJCX0KKwkJLy8gdGhlcmUgYXJlIGJ5dGVzIGluIHRoZSBidWZmZXIgdG8gcmVhZC4KKwkJLy8gY29weSBmcm9tIHRoZSBodyBidWZmZXIgb3ZlciB0byB0aGUgdXNlciBidWZmZXIuCisJCS8vIHVzZXIgYnVmZmVyIGlzIGRlc2lnbmF0ZWQgYnkgImJ1ZmZlciIKKwkJLy8gdmlydHVhbCBhZGRyZXNzIHRvIGNvcHkgZnJvbSBpcyByYXdidWYrc3dwdHIKKwkJLy8gdGhlICJjbnQiIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKworCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkiX3JlYWQoKSBjb3B5X3RvIGNudD0lZCBjb3VudD0lWnUgIiwgY250LCBjb3VudCkpOworCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPCisJCQkgIiAuZG1hc2l6ZT0lZCAuY291bnQ9JWQgYnVmZmVyPSVwIHJldD0lWmRcbiIsCisJCQkJIHMtPmRtYV9hZGMuZG1hc2l6ZSwgcy0+ZG1hX2FkYy5jb3VudCwgYnVmZmVyLCByZXQpKTsKKworCQlpZiAoY3NfY29weV90b191c2VyCisJCSAgICAocywgYnVmZmVyLCBzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyLCBjbnQsICZjb3BpZWQpKQorCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+ZG1hX2FkYy5zd3B0ciA9IHN3cHRyOworCQlzLT5kbWFfYWRjLmNvdW50IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjb3BpZWQ7CisJCWJ1ZmZlciArPSBjb3BpZWQ7CisJCXJldCArPSBjb3BpZWQ7CisJCXN0YXJ0X2FkYyhzKTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9SRUFELCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3M0MjgxX3JlYWQoKS0gJVpkXG4iLCByZXQpKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzc2l6ZV90IGNzNDI4MV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyLCBod3B0ciwgYnVzYWRkcjsKKwlpbnQgY250OworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9XUklURSwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV93cml0ZSgpKyBjb3VudD0lWnVcbiIsCisJCQkgY291bnQpKTsKKwlWQUxJREFURV9TVEFURShzKTsKKworCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSAwOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHMtPmRtYV9kYWMuY291bnQgPCAwKSB7CisJCQlzLT5kbWFfZGFjLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyOworCQl9CisJCWlmIChzLT5kbWFfZGFjLnVuZGVycnVuKSB7CisJCQlzLT5kbWFfZGFjLnVuZGVycnVuID0gMDsKKwkJCWh3cHRyID0gcmVhZGwocy0+cEJBMCArIEJBMF9EQ0EwKTsKKwkJCWJ1c2FkZHIgPSB2aXJ0X3RvX2J1cyhzLT5kbWFfZGFjLnJhd2J1Zik7CisJCQlod3B0ciAtPSAodW5zaWduZWQpIGJ1c2FkZHI7CisJCQlzLT5kbWFfZGFjLnN3cHRyID0gcy0+ZG1hX2RhYy5od3B0ciA9IGh3cHRyOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gc3dwdHI7CisJCWlmIChzLT5kbWFfZGFjLmNvdW50ICsgY250ID4gcy0+ZG1hX2RhYy5kbWFzaXplKQorCQkJY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlzdGFydF9kYWMocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5kbWFfZGFjLndhaXQpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKQorCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+ZG1hX2RhYy5zd3B0ciA9IHN3cHRyOworCQlzLT5kbWFfZGFjLmNvdW50ICs9IGNudDsKKwkJcy0+ZG1hX2RhYy5lbmRjbGVhcmVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCXN0YXJ0X2RhYyhzKTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9XUklURSwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV93cml0ZSgpLSAlWmRcbiIsIHJldCkpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBjczQyODFfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1dBVkVfV1JJVEUgfCBDU19XQVZFX1JFQUQsIDQsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjczQyODFfcG9sbCgpK1xuIikpOworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19XQVZFX1dSSVRFIHwgQ1NfV0FWRV9SRUFELCA0LAorCQkJICBwcmludGsoS0VSTl9JTkZPCisJCQkJICJjczQyODE6IGNzNDI4MV9wb2xsKCkgd2FpdCBvbiBGTU9ERV9XUklURVxuIikpOworCQlpZighcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9kYWMocykpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfZGFjLndhaXQsIHdhaXQpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19XQVZFX1dSSVRFIHwgQ1NfV0FWRV9SRUFELCA0LAorCQkJICBwcmludGsoS0VSTl9JTkZPCisJCQkJICJjczQyODE6IGNzNDI4MV9wb2xsKCkgd2FpdCBvbiBGTU9ERV9SRUFEXG4iKSk7CisJCWlmKCFzLT5kbWFfZGFjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2FkYyhzKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJY3M0MjgxX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkgeworCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPj0KKwkJCSAgICAoc2lnbmVkKSBzLT5kbWFfZGFjLmZyYWdzaXplKSB7CisJCQkJaWYgKHMtPmRtYV9kYWMud2FrZXVwKQorCQkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQkJCWVsc2UKKwkJCQkJbWFzayA9IDA7CisJCQkJcy0+ZG1hX2RhYy53YWtldXAgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChzaWduZWQpIChzLT5kbWFfZGFjLmRtYXNpemUvMikgPj0gcy0+ZG1hX2RhYy5jb3VudCkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9CisJfSBlbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkgeworCQkJaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZCkgcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgCisJCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQl9IGVsc2UgeworCQkJaWYgKHMtPmRtYV9hZGMuY291bnQgPiAwKQorCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9XUklURSB8IENTX1dBVkVfUkVBRCwgNCwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV9wb2xsKCktIDB4JS44eFxuIiwKKwkJCSBtYXNrKSk7CisJcmV0dXJuIG1hc2s7Cit9CisKKworc3RhdGljIGludCBjczQyODFfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1BBUk1TIHwgQ1NfT1BFTiwgNCwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV9tbWFwKCkrXG4iKSk7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwkJZGIgPSAmcy0+ZG1hX2RhYzsKKwl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwkJZGIgPSAmcy0+ZG1hX2FkYzsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisvLworLy8gb25seSBzdXBwb3J0IFBMQVlCQUNLIGZvciBub3cKKy8vCisJZGIgPSAmcy0+ZG1hX2RhYzsKKworCWlmIChjczR4X3Bnb2ZmKHZtYSkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJdmlydF90b19waHlzKGRiLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlkYi0+bWFwcGVkID0gMTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1BBUk1TIHwgQ1NfT1BFTiwgNCwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV9tbWFwKCktIDAgc2l6ZT0lZFxuIiwKKwkJCSAodW5zaWduZWQpIHNpemUpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY3M0MjgxX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKwljb3VudF9pbmZvIGNpbmZvOworCWludCB2YWwsIG1hcHBlZCwgcmV0OworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkgImNzNDI4MTogY3M0MjgxX2lvY3RsKCk6IGZpbGU9JXAgY21kPTB4JS44eFxuIiwgZmlsZSwgY21kKSk7CisjaWYgQ1NERUJVRworCWNzX3ByaW50aW9jdGwoY21kKTsKKyNlbmRpZgorCVZBTElEQVRFX1NUQVRFKHMpOworCW1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIHMtPmRtYV9kYWMubWFwcGVkKSB8fAorCSAgICAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIHMtPmRtYV9hZGMubWFwcGVkKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogU09VTkRfVkVSU0lPTj0weCUuOHhcbiIsCisJCQkJIFNPVU5EX1ZFUlNJT04pKTsKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyODE6IGNzNDI4MV9pb2N0bCgpOiBEU1BfU1lOQ1xuIikpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gZHJhaW5fZGFjKHMsCisJCQkJCSAwIC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgKi8KKwkJCQkJICk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8CisJCQkJRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLAorCQkJCXApOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogRFNQX1JFU0VUXG4iKSk7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyID0KKwkJCSAgICBzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9CisJCQkgICAgcy0+ZG1hX2RhYy5ibG9ja3MgPSBzLT5kbWFfZGFjLndha2V1cCA9IDA7CisJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfREFDKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0KKwkJCSAgICBzLT5kbWFfYWRjLmNvdW50ID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9CisJCQkgICAgcy0+ZG1hX2FkYy5ibG9ja3MgPSBzLT5kbWFfZGFjLndha2V1cCA9IDA7CisJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfQURDKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogRFNQX1NQRUVEIHZhbD0lZFxuIiwgdmFsKSk7CisJCS8vCisJCS8vIHN1cHBvcnQgaW5kZXBlbmRlbnQgY2FwdHVyZSBhbmQgcGxheWJhY2sgY2hhbm5lbHMKKwkJLy8gYXNzdW1lIHRoYXQgdGhlIGZpbGUgbW9kZSBiaXQgZGV0ZXJtaW5lcyB0aGUgCisJCS8vIGRpcmVjdGlvbiBvZiB0aGUgZGF0YSBmbG93LgorCQkvLworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCA+PSAwKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJLy8gcHJvZ3JhbSBzYW1wbGluZyByYXRlcyAKKwkJCQlpZiAodmFsID4gNDgwMDApCisJCQkJCXZhbCA9IDQ4MDAwOworCQkJCWlmICh2YWwgPCA2MzAwKQorCQkJCQl2YWwgPSA2MzAwOworCQkJCXMtPnByb3BfYWRjLnJhdGUgPSB2YWw7CisJCQkJcHJvZ19jb2RlYyhzLCBDU19UWVBFX0FEQyk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsID49IDApIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQkvLyBwcm9ncmFtIHNhbXBsaW5nIHJhdGVzIAorCQkJCWlmICh2YWwgPiA0ODAwMCkKKwkJCQkJdmFsID0gNDgwMDA7CisJCQkJaWYgKHZhbCA8IDYzMDApCisJCQkJCXZhbCA9IDYzMDA7CisJCQkJcy0+cHJvcF9kYWMucmF0ZSA9IHZhbDsKKwkJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfREFDKTsKKwkJCX0KKwkJfQorCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXZhbCA9IHMtPnByb3BfZGFjLnJhdGU7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQl2YWwgPSBzLT5wcm9wX2FkYy5yYXRlOworCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogRFNQX1NURVJFTyB2YWw9JWRcbiIsIHZhbCkpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCXMtPnByb3BfYWRjLmNoYW5uZWxzID0gdmFsID8gMiA6IDE7CisJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfQURDKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IHZhbCA/IDIgOiAxOworCQkJcHJvZ19jb2RlYyhzLCBDU19UWVBFX0RBQyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDI4MTogY3M0MjgxX2lvY3RsKCk6IERTUF9DSEFOTkVMUyB2YWw9JWRcbiIsCisJCQkJIHZhbCkpOworCQlpZiAodmFsICE9IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlzLT5wcm9wX2FkYy5jaGFubmVscyA9IDI7CisJCQkJZWxzZQorCQkJCQlzLT5wcm9wX2FkYy5jaGFubmVscyA9IDE7CisJCQkJcHJvZ19jb2RlYyhzLCBDU19UWVBFX0FEQyk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsID49IDIpCisJCQkJCXMtPnByb3BfZGFjLmNoYW5uZWxzID0gMjsKKwkJCQllbHNlCisJCQkJCXMtPnByb3BfZGFjLmNoYW5uZWxzID0gMTsKKwkJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfREFDKTsKKwkJCX0KKwkJfQorCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXZhbCA9IHMtPnByb3BfZGFjLmNoYW5uZWxzOworCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJdmFsID0gcy0+cHJvcF9hZGMuY2hhbm5lbHM7CisKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzoJLy8gUmV0dXJucyBhIG1hc2sgCisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogRFNQX0dFVEZNVCB2YWw9MHglLjh4XG4iLAorCQkJCSBBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TOCB8CisJCQkJIEFGTVRfVTgpKTsKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUgfCBBRk1UX1M4IHwKKwkJCQlBRk1UX1U4LCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDI4MTogY3M0MjgxX2lvY3RsKCk6IERTUF9TRVRGTVQgdmFsPTB4JS44eFxuIiwKKwkJCQkgdmFsKSk7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsICE9IEFGTVRfUzE2X0xFCisJCQkJICAgICYmIHZhbCAhPSBBRk1UX1UxNl9MRSAmJiB2YWwgIT0gQUZNVF9TOAorCQkJCSAgICAmJiB2YWwgIT0gQUZNVF9VOCkKKwkJCQkJdmFsID0gQUZNVF9VODsKKwkJCQlzLT5wcm9wX2FkYy5mbXQgPSB2YWw7CisJCQkJcy0+cHJvcF9hZGMuZm10X29yaWdpbmFsID0gcy0+cHJvcF9hZGMuZm10OworCQkJCXByb2dfY29kZWMocywgQ1NfVFlQRV9BREMpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMocyk7CisJCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCAhPSBBRk1UX1MxNl9MRQorCQkJCSAgICAmJiB2YWwgIT0gQUZNVF9VMTZfTEUgJiYgdmFsICE9IEFGTVRfUzgKKwkJCQkgICAgJiYgdmFsICE9IEFGTVRfVTgpCisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJcy0+cHJvcF9kYWMuZm10ID0gdmFsOworCQkJCXMtPnByb3BfZGFjLmZtdF9vcmlnaW5hbCA9IHMtPnByb3BfZGFjLmZtdDsKKwkJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfREFDKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCQl2YWwgPSBzLT5wcm9wX2RhYy5mbXRfb3JpZ2luYWw7CisJCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCXZhbCA9IHMtPnByb3BfYWRjLmZtdF9vcmlnaW5hbDsKKwkJfQorCQlDU19EQkdPVVQoQ1NfSU9DVEwgfCBDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkgICJjczQyODE6IGNzNDI4MV9pb2N0bCgpOiBEU1BfU0VURk1UIHJldHVybiB2YWw9MHglLjh4XG4iLCAKKwkJCXZhbCkpOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogRFNQX1BPU1RcbiIpKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIHMtPmVuYSAmIEZNT0RFX1JFQUQpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIHMtPmVuYSAmIEZNT0RFX1dSSVRFKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkKKwkJCQkgICAgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9hZGMocyk7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkKKwkJCQkgICAgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJc3RhcnRfZGFjKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9kYWMocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY3M0MjgxX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJCWFiaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJZWxzZQorCQkJYWJpbmZvLmJ5dGVzID0KKwkJCSAgICBzLT5kbWFfZGFjLmRtYXNpemUgLSBzLT5kbWFfZGFjLmNvdW50OworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMubnVtZnJhZzsKKwkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyODE6IGNzNDI4MV9pb2N0bCgpOiBHRVRPU1BBQ0UgLmZyYWdzaXplPSVkIC5ieXRlcz0lZCAuZnJhZ3N0b3RhbD0lZCAuZnJhZ21lbnRzPSVkXG4iLAorCQkJCWFiaW5mby5mcmFnc2l6ZSxhYmluZm8uYnl0ZXMsYWJpbmZvLmZyYWdzdG90YWwsCisJCQkJYWJpbmZvLmZyYWdtZW50cykpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgJmFiaW5mbywKKwkJCQkgICAgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyODFfdXBkYXRlX3B0cihzLENTX0ZBTFNFKTsKKwkJaWYgKHMtPmNvbnZlcnNpb24pIHsKKwkJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ3NpemUgLyAyOworCQkJYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy5jb3VudCAvIDI7CisJCQlhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9hZGMubnVtZnJhZzsKKwkJCWFiaW5mby5mcmFnbWVudHMgPQorCQkJICAgIGFiaW5mby5ieXRlcyA+PiAocy0+ZG1hX2FkYy5mcmFnc2hpZnQgLSAxKTsKKwkJfSBlbHNlIHsKKwkJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ3NpemU7CisJCQlhYmluZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLmNvdW50OworCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bWZyYWc7CisJCQlhYmluZm8uZnJhZ21lbnRzID0KKwkJCSAgICBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKHAsICZhYmluZm8sCisJCQkJICAgIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmKCFzLT5kbWFfZGFjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYyhzKSkKKwkJCXJldHVybiAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyODFfdXBkYXRlX3B0cihzLENTX0ZBTFNFKTsKKwkJdmFsID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZighcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9hZGMocykpCisJCQlyZXR1cm4gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY3M0MjgxX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCWNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQljaW5mby5ibG9ja3MgPQorCQkJICAgIChjaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdCkgLQorCQkJICAgIHMtPmRtYV9hZGMuYmxvY2tzOworCQkJcy0+ZG1hX2FkYy5ibG9ja3MgPQorCQkJICAgIGNpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworCQl9IGVsc2UgeworCQkJaWYgKHMtPmNvbnZlcnNpb24pIHsKKwkJCQljaW5mby5ibG9ja3MgPQorCQkJCSAgICBzLT5kbWFfYWRjLmNvdW50IC8KKwkJCQkgICAgMiA+PiAocy0+ZG1hX2FkYy5mcmFnc2hpZnQgLSAxKTsKKwkJCX0gZWxzZQorCQkJCWNpbmZvLmJsb2NrcyA9CisJCQkJICAgIHMtPmRtYV9hZGMuY291bnQgPj4gcy0+ZG1hX2FkYy4KKwkJCQkgICAgZnJhZ3NoaWZ0OworCQl9CisJCWlmIChzLT5jb252ZXJzaW9uKQorCQkJY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0ciAvIDI7CisJCWVsc2UKKwkJCWNpbmZvLnB0ciA9IHMtPmRtYV9hZGMuaHdwdHI7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZSAtIDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZighcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9kYWMocykpCisJCQlyZXR1cm4gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY3M0MjgxX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCWNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlczsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKSB7CisJCQljaW5mby5ibG9ja3MgPQorCQkJICAgIChjaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdCkgLQorCQkJICAgIHMtPmRtYV9kYWMuYmxvY2tzOworCQkJcy0+ZG1hX2RhYy5ibG9ja3MgPQorCQkJICAgIGNpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworCQl9IGVsc2UgeworCQkJY2luZm8uYmxvY2tzID0KKwkJCSAgICBzLT5kbWFfZGFjLmNvdW50ID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworCQl9CisJCWNpbmZvLnB0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJCXMtPmRtYV9kYWMuY291bnQgJj0gcy0+ZG1hX2RhYy5mcmFnc2l6ZSAtIDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiB2YWw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcCk7CisJCX0KKwkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJcmV0dXJuIHZhbDsKKwkJaWYgKHMtPmNvbnZlcnNpb24pCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSAvIDIsIHApOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOwkvLyBTYXkgT0ssIGJ1dCBkbyBub3RoaW5nLgorCisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24pCisJCSAgICB8fCAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUKKwkJCSYmIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24pKSByZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gdmFsOworCQlyZXR1cm4gMDsKKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+cHJvcF9hZGMucmF0ZSwgcCk7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPnByb3BfZGFjLnJhdGUsIHApOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+cHJvcF9hZGMuY2hhbm5lbHMsIHApOworCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBwdXRfdXNlcihzLT5wcm9wX2RhYy5jaGFubmVscywgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcmV0dXJuCisJCQkgICAgcHV0X3VzZXIoCisJCQkJICAgICAocy0+cHJvcF9hZGMuCisJCQkJICAgICAgZm10ICYgKEFGTVRfUzggfCBBRk1UX1U4KSkgPyA4IDogMTYsCisJCQkJICAgICBwKTsKKwkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4KKwkJCSAgICBwdXRfdXNlcigKKwkJCQkgICAgIChzLT5wcm9wX2RhYy4KKwkJCQkgICAgICBmbXQgJiAoQUZNVF9TOCB8IEFGTVRfVTgpKSA/IDggOiAxNiwKKwkJCQkgICAgIHApOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gbWl4ZXJfaW9jdGwocywgY21kLCBhcmcpOworfQorCisKK3N0YXRpYyBpbnQgY3M0MjgxX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJICJjczQyODE6IGNzNDI4MV9yZWxlYXNlKCk6IGlub2RlPSVwIGZpbGU9JXAgZl9tb2RlPSVkXG4iLAorCQkJIGlub2RlLCBmaWxlLCBmaWxlLT5mX21vZGUpKTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWRyYWluX2RhYyhzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJCWRvd24oJnMtPm9wZW5fc2VtX2RhYyk7CisJCXN0b3BfZGFjKHMpOworCQlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYyk7CisJCXMtPm9wZW5fbW9kZSAmPSB+Rk1PREVfV1JJVEU7CisJCXVwKCZzLT5vcGVuX3NlbV9kYWMpOworCQl3YWtlX3VwKCZzLT5vcGVuX3dhaXRfZGFjKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJZHJhaW5fYWRjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJZG93bigmcy0+b3Blbl9zZW1fYWRjKTsKKwkJc3RvcF9hZGMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKKwkJcy0+b3Blbl9tb2RlICY9IH5GTU9ERV9SRUFEOworCQl1cCgmcy0+b3Blbl9zZW1fYWRjKTsKKwkJd2FrZV91cCgmcy0+b3Blbl93YWl0X2FkYyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzNDI4MV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcz1OVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkiY3M0MjgxOiBjczQyODFfb3BlbigpOiBpbm9kZT0lcCBmaWxlPSVwIGZfbW9kZT0weCV4XG4iLAorCQkJaW5vZGUsIGZpbGUsIGZpbGUtPmZfbW9kZSkpOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDI4MV9kZXZzKQorCXsKKwkJcyA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjczQyODFfc3RhdGUsIGxpc3QpOworCisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoZW50cnkgPT0gJmNzNDI4MV9kZXZzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIXMpIHsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI4MTogY3M0MjgxX29wZW4oKTogRXJyb3IgLSB1bmFibGUgdG8gZmluZCBhdWRpbyBzdGF0ZSBzdHJ1Y3RcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisKKwkvLyB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4gfCBDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyODE6IGNzNDI4MV9vcGVuKCk6IEVycm9yIC0gbXVzdCBvcGVuIFJFQUQgYW5kL29yIFdSSVRFXG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJZG93bigmcy0+b3Blbl9zZW1fZGFjKTsKKwkJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQl1cCgmcy0+b3Blbl9zZW1fZGFjKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJdXAoJnMtPm9wZW5fc2VtX2RhYyk7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5vcGVuX3dhaXRfZGFjKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQlkb3duKCZzLT5vcGVuX3NlbV9kYWMpOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWRvd24oJnMtPm9wZW5fc2VtX2FkYyk7CisJCXdoaWxlIChzLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQl1cCgmcy0+b3Blbl9zZW1fYWRjKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJdXAoJnMtPm9wZW5fc2VtX2FkYyk7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5vcGVuX3dhaXRfYWRjKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQlkb3duKCZzLT5vcGVuX3NlbV9hZGMpOworCQl9CisJfQorCXMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5wcm9wX2FkYy5mbXQgPSBBRk1UX1U4OworCQlzLT5wcm9wX2FkYy5mbXRfb3JpZ2luYWwgPSBzLT5wcm9wX2FkYy5mbXQ7CisJCXMtPnByb3BfYWRjLmNoYW5uZWxzID0gMTsKKwkJcy0+cHJvcF9hZGMucmF0ZSA9IDgwMDA7CisJCXMtPnByb3BfYWRjLmNsa2RpdiA9IDk2IHwgMHg4MDsKKwkJcy0+Y29udmVyc2lvbiA9IDA7CisJCXMtPmVuYSAmPSB+Rk1PREVfUkVBRDsKKwkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfYWRjLm9zc21heGZyYWdzID0KKwkJICAgIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSAwOworCQl1cCgmcy0+b3Blbl9zZW1fYWRjKTsKKworCQlpZiAocHJvZ19kbWFidWZfYWRjKHMpKSB7CisJCQlDU19EQkdPVVQoQ1NfT1BFTiB8IENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9FUlIKKwkJCQkiY3M0MjgxOiBhZGMgUHJvZ3JhbSBkbWFidWZzIGZhaWxlZC5cbiIpKTsKKwkJCWNzNDI4MV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXByb2dfY29kZWMocywgQ1NfVFlQRV9BREMpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+cHJvcF9kYWMuZm10ID0gQUZNVF9VODsKKwkJcy0+cHJvcF9kYWMuZm10X29yaWdpbmFsID0gcy0+cHJvcF9kYWMuZm10OworCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IDE7CisJCXMtPnByb3BfZGFjLnJhdGUgPSA4MDAwOworCQlzLT5wcm9wX2RhYy5jbGtkaXYgPSA5NiB8IDB4ODA7CisJCXMtPmNvbnZlcnNpb24gPSAwOworCQlzLT5lbmEgJj0gfkZNT0RFX1dSSVRFOworCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPQorCQkgICAgcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IDA7CisJCXVwKCZzLT5vcGVuX3NlbV9kYWMpOworCisJCWlmIChwcm9nX2RtYWJ1Zl9kYWMocykpIHsKKwkJCUNTX0RCR09VVChDU19PUEVOIHwgQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX0VSUgorCQkJCSJjczQyODE6IGRhYyBQcm9ncmFtIGRtYWJ1ZnMgZmFpbGVkLlxuIikpOworCQkJY3M0MjgxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcHJvZ19jb2RlYyhzLCBDU19UWVBFX0RBQyk7CisJfQorCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjczQyODFfb3BlbigpLSAwXG4iKSk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gICBXYXZlIChhdWRpbykgZmlsZSBvcGVyYXRpb25zIHN0cnVjdC4KKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjczQyODFfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkgPSBub19sbHNlZWssCisJLnJlYWQJID0gY3M0MjgxX3JlYWQsCisJLndyaXRlCSA9IGNzNDI4MV93cml0ZSwKKwkucG9sbAkgPSBjczQyODFfcG9sbCwKKwkuaW9jdGwJID0gY3M0MjgxX2lvY3RsLAorCS5tbWFwCSA9IGNzNDI4MV9tbWFwLAorCS5vcGVuCSA9IGNzNDI4MV9vcGVuLAorCS5yZWxlYXNlID0gY3M0MjgxX3JlbGVhc2UsCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKKy8vIGhvbGQgc3BpbmxvY2sgZm9yIHRoZSBmb2xsb3dpbmchIAorc3RhdGljIHZvaWQgY3M0MjgxX2hhbmRsZV9taWRpKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwlpbnQgd2FrZTsKKwl1bnNpZ25lZCB0ZW1wMTsKKworCXdha2UgPSAwOworCXdoaWxlICghKHJlYWRsKHMtPnBCQTAgKyBCQTBfTUlEU1IpICYgMHg4MCkpIHsKKwkJY2ggPSByZWFkbChzLT5wQkEwICsgQkEwX01JRFJQKTsKKwkJaWYgKHMtPm1pZGkuaWNudCA8IE1JRElJTkJVRikgeworCQkJcy0+bWlkaS5pYnVmW3MtPm1pZGkuaXdyXSA9IGNoOworCQkJcy0+bWlkaS5pd3IgPSAocy0+bWlkaS5pd3IgKyAxKSAlIE1JRElJTkJVRjsKKwkJCXMtPm1pZGkuaWNudCsrOworCQl9CisJCXdha2UgPSAxOworCX0KKwlpZiAod2FrZSkKKwkJd2FrZV91cCgmcy0+bWlkaS5pd2FpdCk7CisJd2FrZSA9IDA7CisJd2hpbGUgKCEocmVhZGwocy0+cEJBMCArIEJBMF9NSURTUikgJiAweDQwKSAmJiBzLT5taWRpLm9jbnQgPiAwKSB7CisJCXRlbXAxID0gKHMtPm1pZGkub2J1ZltzLT5taWRpLm9yZF0pICYgMHgwMDAwMDBmZjsKKwkJd3JpdGVsKHRlbXAxLCBzLT5wQkEwICsgQkEwX01JRFdQKTsKKwkJcy0+bWlkaS5vcmQgPSAocy0+bWlkaS5vcmQgKyAxKSAlIE1JRElPVVRCVUY7CisJCXMtPm1pZGkub2NudC0tOworCQlpZiAocy0+bWlkaS5vY250IDwgTUlESU9VVEJVRiAtIDE2KQorCQkJd2FrZSA9IDE7CisJfQorCWlmICh3YWtlKQorCQl3YWtlX3VwKCZzLT5taWRpLm93YWl0KTsKK30KKworCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjczQyODFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgdGVtcDE7CisKKwkvLyBmYXN0cGF0aCBvdXQsIHRvIGVhc2UgaW50ZXJydXB0IHNoYXJpbmcgCisJdGVtcDEgPSByZWFkbChzLT5wQkEwICsgQkEwX0hJU1IpOwkvLyBHZXQgSW50IFN0YXR1cyByZWcuCisKKwlDU19EQkdPVVQoQ1NfSU5URVJSVVBULCA2LCBwcmludGsoS0VSTl9JTkZPCisJCSAgImNzNDI4MTogY3M0MjgxX2ludGVycnVwdCgpIEJBMF9ISVNSPTB4JS44eFxuIiwgdGVtcDEpKTsKKy8qCisqIElmIG5vdCBETUEgb3IgTUlESSBpbnRlcnJ1cHQsIHRoZW4ganVzdCByZXR1cm4uCisqLworCWlmICghKHRlbXAxICYgKEhJU1JfRE1BMCB8IEhJU1JfRE1BMSB8IEhJU1JfTUlESSkpKSB7CisJCXdyaXRlbChISUNSX0lFViB8IEhJQ1JfQ0hHTSwgcy0+cEJBMCArIEJBMF9ISUNSKTsKKwkJQ1NfREJHT1VUKENTX0lOVEVSUlVQVCwgOSwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI4MTogY3M0MjgxX2ludGVycnVwdCgpOiByZXR1cm5pbmcgbm90IGNzNDI4MSBpbnRlcnJ1cHQuXG4iKSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAodGVtcDEgJiBISVNSX0RNQTApCS8vIElmIHBsYXkgaW50ZXJydXB0LAorCQlyZWFkbChzLT5wQkEwICsgQkEwX0hEU1IwKTsJLy8gICBjbGVhciB0aGUgc291cmNlLgorCisJaWYgKHRlbXAxICYgSElTUl9ETUExKQkvLyBTYW1lIGZvciBwbGF5LgorCQlyZWFkbChzLT5wQkEwICsgQkEwX0hEU1IxKTsKKwl3cml0ZWwoSElDUl9JRVYgfCBISUNSX0NIR00sIHMtPnBCQTAgKyBCQTBfSElDUik7CS8vIExvY2FsIEVPSQorCisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwljczQyODFfdXBkYXRlX3B0cihzLENTX1RSVUUpOworCWNzNDI4MV9oYW5kbGVfbWlkaShzKTsKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitzdGF0aWMgdm9pZCBjczQyODFfbWlkaV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJY3M0MjgxX2hhbmRsZV9taWRpKHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5taWRpLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKwlhZGRfdGltZXIoJnMtPm1pZGkudGltZXIpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworc3RhdGljIHNzaXplX3QgY3M0MjgxX21pZGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHB0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXB0ciA9IHMtPm1pZGkuaXJkOworCQljbnQgPSBNSURJSU5CVUYgLSBwdHI7CisJCWlmIChzLT5taWRpLmljbnQgPCBjbnQpCisJCQljbnQgPSBzLT5taWRpLmljbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcy0+bWlkaS5pd2FpdCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5taWRpLmlidWYgKyBwdHIsIGNudCkpCisJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVGQVVMVDsKKwkJcHRyID0gKHB0ciArIGNudCkgJSBNSURJSU5CVUY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPm1pZGkuaXJkID0gcHRyOworCQlzLT5taWRpLmljbnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCBjczQyODFfbWlkaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCBjczQyODFfc3RhdGUgKnMgPQorCSAgICAoc3RydWN0IGNzNDI4MV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXB0ciA9IHMtPm1pZGkub3dyOworCQljbnQgPSBNSURJT1VUQlVGIC0gcHRyOworCQlpZiAocy0+bWlkaS5vY250ICsgY250ID4gTUlESU9VVEJVRikKKwkJCWNudCA9IE1JRElPVVRCVUYgLSBzLT5taWRpLm9jbnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCWNzNDI4MV9oYW5kbGVfbWlkaShzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5taWRpLm93YWl0KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKHMtPm1pZGkub2J1ZiArIHB0ciwgYnVmZmVyLCBjbnQpKQorCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESU9VVEJVRjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+bWlkaS5vd3IgPSBwdHI7CisJCXMtPm1pZGkub2NudCArPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyODFfaGFuZGxlX21pZGkocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGNzNDI4MV9taWRpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX2ZsYWdzICYgRk1PREVfV1JJVEUpCisJCXBvbGxfd2FpdChmaWxlLCAmcy0+bWlkaS5vd2FpdCwgd2FpdCk7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9SRUFEKQorCQlwb2xsX3dhaXQoZmlsZSwgJnMtPm1pZGkuaXdhaXQsIHdhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5taWRpLmljbnQgPiAwKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChzLT5taWRpLm9jbnQgPCBNSURJT1VUQlVGKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCisKK3N0YXRpYyBpbnQgY3M0MjgxX21pZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0ZW1wMTsKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBjczQyODFfc3RhdGUgKnM9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0MjgxX2RldnMpCisJeworCQlzID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzNDI4MV9zdGF0ZSwgbGlzdCk7CisKKwkJaWYgKHMtPmRldl9taWRpID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGVudHJ5ID09ICZjczQyODFfZGV2cykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFzKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI4MTogY3M0MjgxX29wZW4oKTogRXJyb3IgLSB1bmFibGUgdG8gZmluZCBhdWRpbyBzdGF0ZSBzdHJ1Y3RcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLy8gd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlIAorCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnMtPm9wZW5fd2FpdCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCQlzLT5taWRpLm9yZCA9IHMtPm1pZGkub3dyID0gcy0+bWlkaS5vY250ID0gMDsKKwkJd3JpdGVsKDEsIHMtPnBCQTAgKyBCQTBfTUlEQ1IpOwkvLyBSZXNldCB0aGUgaW50ZXJmYWNlLgorCQl3cml0ZWwoMCwgcy0+cEJBMCArIEJBMF9NSURDUik7CS8vIFJldHVybiB0byBub3JtYWwgbW9kZS4KKwkJcy0+bWlkaS5pcmQgPSBzLT5taWRpLml3ciA9IHMtPm1pZGkuaWNudCA9IDA7CisJCXdyaXRlbCgweDAwMDAwMDBmLCBzLT5wQkEwICsgQkEwX01JRENSKTsJLy8gRW5hYmxlIHRyYW5zbWl0LCByZWNvcmQsIGludHMuCisJCXRlbXAxID0gcmVhZGwocy0+cEJBMCArIEJBMF9ISU1SKTsKKwkJd3JpdGVsKHRlbXAxICYgMHhmZmJmZmZmZiwgcy0+cEJBMCArIEJBMF9ISU1SKTsJLy8gRW5hYmxlIG1pZGkgaW50LiByZWNvZ25pdGlvbi4KKwkJd3JpdGVsKEhJQ1JfSUVWIHwgSElDUl9DSEdNLCBzLT5wQkEwICsgQkEwX0hJQ1IpOwkvLyBFbmFibGUgaW50ZXJydXB0cworCQlpbml0X3RpbWVyKCZzLT5taWRpLnRpbWVyKTsKKwkJcy0+bWlkaS50aW1lci5leHBpcmVzID0gamlmZmllcyArIDE7CisJCXMtPm1pZGkudGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzOworCQlzLT5taWRpLnRpbWVyLmZ1bmN0aW9uID0gY3M0MjgxX21pZGlfdGltZXI7CisJCWFkZF90aW1lcigmcy0+bWlkaS50aW1lcik7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+bWlkaS5vcmQgPSBzLT5taWRpLm93ciA9IHMtPm1pZGkub2NudCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5vcGVuX21vZGUgfD0KKwkgICAgKGZpbGUtPgorCSAgICAgZl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRCB8CisJCQkJCSAgICBGTU9ERV9NSURJX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworCitzdGF0aWMgaW50IGNzNDI4MV9taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNvdW50LCB0bW87CisKKwlWQUxJREFURV9TVEFURShzKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCQlmb3IgKDs7KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWNvdW50ID0gcy0+bWlkaS5vY250OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGNvdW50IDw9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJYnJlYWs7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQl0bW8gPSAoY291bnQgKiBIWikgLyAzMTAwOworCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IDogMSkgJiYgdG1vKQorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICJjczQyODE6IG1pZGkgdGltZWQgb3V0Pz9cbiIpOworCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCX0KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJcy0+b3Blbl9tb2RlICY9CisJICAgICh+KGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSkgJiAoRk1PREVfTUlESV9SRUFEIHwKKwkJCQkJCSAgICAgRk1PREVfTUlESV9XUklURSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCXdyaXRlbCgwLCBzLT5wQkEwICsgQkEwX01JRENSKTsJLy8gRGlzYWJsZSBNaWRpIGludGVycnVwdHMuICAKKwkJZGVsX3RpbWVyKCZzLT5taWRpLnRpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwlyZXR1cm4gMDsKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAgIE1pZGkgZmlsZSBvcGVyYXRpb25zIHN0cnVjdC4KKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjczQyODFfbWlkaV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCSA9IG5vX2xsc2VlaywKKwkucmVhZAkgPSBjczQyODFfbWlkaV9yZWFkLAorCS53cml0ZQkgPSBjczQyODFfbWlkaV93cml0ZSwKKwkucG9sbAkgPSBjczQyODFfbWlkaV9wb2xsLAorCS5vcGVuCSA9IGNzNDI4MV9taWRpX29wZW4sCisJLnJlbGVhc2UgPSBjczQyODFfbWlkaV9yZWxlYXNlLAorfTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKKy8vIG1heGltdW0gbnVtYmVyIG9mIGRldmljZXMgCisjZGVmaW5lIE5SX0RFVklDRSA4CQkvLyBPbmx5IGVpZ2h0IGRldmljZXMgc3VwcG9ydGVkIGN1cnJlbnRseS4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCitzdGF0aWMgc3RydWN0IGluaXR2b2wgeworCWludCBtaXhjaDsKKwlpbnQgdm9sOworfSBpbml0dm9sW10gX19kZXZpbml0ZGF0YSA9IHsKKworCXsKKwlTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsIDB4NDA0MH0sIHsKKwlTT1VORF9NSVhFUl9XUklURV9QQ00sIDB4NDA0MH0sIHsKKwlTT1VORF9NSVhFUl9XUklURV9TWU5USCwgMHg0MDQwfSwgeworCVNPVU5EX01JWEVSX1dSSVRFX0NELCAweDQwNDB9LCB7CisJU09VTkRfTUlYRVJfV1JJVEVfTElORSwgMHg0MDQwfSwgeworCVNPVU5EX01JWEVSX1dSSVRFX0xJTkUxLCAweDQwNDB9LCB7CisJU09VTkRfTUlYRVJfV1JJVEVfUkVDTEVWLCAweDAwMDB9LCB7CisJU09VTkRfTUlYRVJfV1JJVEVfU1BFQUtFUiwgMHg0MDQwfSwgeworCVNPVU5EX01JWEVSX1dSSVRFX01JQywgMHgwMDAwfQorfTsKKworCisjaWZuZGVmIE5PVF9DUzQyODFfUE0KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBjczQyODFfQnVpbGRGSUZPKAorCXN0cnVjdCBjczQyODFfcGlwZWxpbmUgKnAsIAorCXN0cnVjdCBjczQyODFfc3RhdGUgKnMpCit7CisJc3dpdGNoKHAtPm51bWJlcikKKwl7CisJCWNhc2UgMDogIC8qIHBsYXliYWNrICovCisJCXsKKwkJCXAtPnUzMkZDUm5BZGRyZXNzICA9ICBCQTBfRkNSMDsKKwkJCXAtPnUzMkZTSUNuQWRkcmVzcyA9IEJBMF9GU0lDMDsKKwkJCXAtPnUzMkZQRFJuQWRkcmVzcyA9IEJBMF9GUERSMDsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMTogIC8qIGNhcHR1cmUgKi8KKwkJeworCQkJcC0+dTMyRkNSbkFkZHJlc3MgID0gIEJBMF9GQ1IxOworCQkJcC0+dTMyRlNJQ25BZGRyZXNzID0gQkEwX0ZTSUMxOworCQkJcC0+dTMyRlBEUm5BZGRyZXNzID0gQkEwX0ZQRFIxOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIDI6IAorCQl7CisJCQlwLT51MzJGQ1JuQWRkcmVzcyAgPSAgQkEwX0ZDUjI7CisJCQlwLT51MzJGU0lDbkFkZHJlc3MgPSBCQTBfRlNJQzI7CisJCQlwLT51MzJGUERSbkFkZHJlc3MgPSBCQTBfRlBEUjI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDM6IAorCQl7CisJCQlwLT51MzJGQ1JuQWRkcmVzcyAgPSAgQkEwX0ZDUjM7CisJCQlwLT51MzJGU0lDbkFkZHJlc3MgPSBCQTBfRlNJQzM7CisJCQlwLT51MzJGUERSbkFkZHJlc3MgPSBCQTBfRlBEUjM7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCS8vCisJLy8gZmlyc3QgcmVhZCB0aGUgaGFyZHdhcmUgdG8gaW5pdGlhbGl6ZSB0aGUgbWVtYmVyIHZhcmlhYmxlcworCS8vCisJcC0+dTMyRkNSblZhbHVlID0gcmVhZGwocy0+cEJBMCArIHAtPnUzMkZDUm5BZGRyZXNzKTsKKwlwLT51MzJGU0lDblZhbHVlID0gcmVhZGwocy0+cEJBMCArIHAtPnUzMkZTSUNuQWRkcmVzcyk7CisJcC0+dTMyRlBEUm5WYWx1ZSA9IHJlYWRsKHMtPnBCQTAgKyBwLT51MzJGUERSbkFkZHJlc3MpOworCit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBjczQyODFfQnVpbGRETUFlbmdpbmUoCisJc3RydWN0IGNzNDI4MV9waXBlbGluZSAqcCwgCisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcykKK3sKKy8qCisqIGluaXRpYWxpemUgYWxsIHRoZSBhZGRyZXNzZXMgb2YgdGhpcyBwaXBlbGluZSBkbWEgaW5mby4KKyovCisJc3dpdGNoKHAtPm51bWJlcikKKwl7CisJCWNhc2UgMDogIC8qIHBsYXliYWNrICovCisJCXsKKwkJCXAtPnUzMkRCQW5BZGRyZXNzID0gQkEwX0RCQTA7CisJCQlwLT51MzJEQ0FuQWRkcmVzcyA9IEJBMF9EQ0EwOworCQkJcC0+dTMyREJDbkFkZHJlc3MgPSBCQTBfREJDMDsKKwkJCXAtPnUzMkRDQ25BZGRyZXNzID0gQkEwX0RDQzA7CisJCQlwLT51MzJETVJuQWRkcmVzcyA9IEJBMF9ETVIwOworCQkJcC0+dTMyRENSbkFkZHJlc3MgPSBCQTBfRENSMDsKKwkJCXAtPnUzMkhEU1JuQWRkcmVzcyA9IEJBMF9IRFNSMDsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSAxOiAvKiBjYXB0dXJlICovCisJCXsKKwkJCXAtPnUzMkRCQW5BZGRyZXNzID0gQkEwX0RCQTE7CisJCQlwLT51MzJEQ0FuQWRkcmVzcyA9IEJBMF9EQ0ExOworCQkJcC0+dTMyREJDbkFkZHJlc3MgPSBCQTBfREJDMTsKKwkJCXAtPnUzMkRDQ25BZGRyZXNzID0gQkEwX0RDQzE7CisJCQlwLT51MzJETVJuQWRkcmVzcyA9IEJBMF9ETVIxOworCQkJcC0+dTMyRENSbkFkZHJlc3MgPSBCQTBfRENSMTsKKwkJCXAtPnUzMkhEU1JuQWRkcmVzcyA9IEJBMF9IRFNSMTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSAyOgorCQl7CisJCQlwLT51MzJEQkFuQWRkcmVzcyA9IEJBMF9EQkEyOworCQkJcC0+dTMyRENBbkFkZHJlc3MgPSBCQTBfRENBMjsKKwkJCXAtPnUzMkRCQ25BZGRyZXNzID0gQkEwX0RCQzI7CisJCQlwLT51MzJEQ0NuQWRkcmVzcyA9IEJBMF9EQ0MyOworCQkJcC0+dTMyRE1SbkFkZHJlc3MgPSBCQTBfRE1SMjsKKwkJCXAtPnUzMkRDUm5BZGRyZXNzID0gQkEwX0RDUjI7CisJCQlwLT51MzJIRFNSbkFkZHJlc3MgPSBCQTBfSERTUjI7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgMzoKKwkJeworCQkJcC0+dTMyREJBbkFkZHJlc3MgPSBCQTBfREJBMzsKKwkJCXAtPnUzMkRDQW5BZGRyZXNzID0gQkEwX0RDQTM7CisJCQlwLT51MzJEQkNuQWRkcmVzcyA9IEJBMF9EQkMzOworCQkJcC0+dTMyRENDbkFkZHJlc3MgPSBCQTBfRENDMzsKKwkJCXAtPnUzMkRNUm5BZGRyZXNzID0gQkEwX0RNUjM7CisJCQlwLT51MzJEQ1JuQWRkcmVzcyA9IEJBMF9EQ1IzOworCQkJcC0+dTMySERTUm5BZGRyZXNzID0gQkEwX0hEU1IzOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworLy8KKy8vIEluaXRpYWxpemUgdGhlIGRtYSB2YWx1ZXMgZm9yIHRoaXMgcGlwZWxpbmUKKy8vCisJcC0+dTMyREJBblZhbHVlID0gcmVhZGwocy0+cEJBMCArIHAtPnUzMkRCQW5BZGRyZXNzKTsKKwlwLT51MzJEQkNuVmFsdWUgPSByZWFkbChzLT5wQkEwICsgcC0+dTMyREJDbkFkZHJlc3MpOworCXAtPnUzMkRNUm5WYWx1ZSA9IHJlYWRsKHMtPnBCQTAgKyBwLT51MzJETVJuQWRkcmVzcyk7CisJcC0+dTMyRENSblZhbHVlID0gcmVhZGwocy0+cEJBMCArIHAtPnUzMkRDUm5BZGRyZXNzKTsKKworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgY3M0MjgxX0luaXRQTShzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCWludCBpOworCXN0cnVjdCBjczQyODFfcGlwZWxpbmUgKnA7CisKKwlmb3IoaT0wO2k8Q1M0MjgxX05VTUJFUl9PRl9QSVBFTElORVM7aSsrKQorCXsKKwkJcCA9ICZzLT5wbFtpXTsKKwkJcC0+bnVtYmVyID0gaTsKKwkJY3M0MjgxX0J1aWxkRE1BZW5naW5lKHAscyk7CisJCWNzNDI4MV9CdWlsZEZJRk8ocCxzKTsKKwkvKgorCSogY3VycmVudGx5IG9ubHkgIDIgcGlwZWxpbmVzIGFyZSB1c2VkCisJKiBzbywgb25seSBzZXQgdGhlIHZhbGlkIGJpdCBvbiB0aGUgcGxheWJhY2sgYW5kIGNhcHR1cmUuCisJKi8KKwkJaWYoIChpID09IENTNDI4MV9QTEFZQkFDS19QSVBFTElORV9OVU1CRVIpIHx8IAorCQkJKGkgPT0gQ1M0MjgxX0NBUFRVUkVfUElQRUxJTkVfTlVNQkVSKSkKKwkJCXAtPmZsYWdzIHw9IENTNDI4MV9QSVBFTElORV9WQUxJRDsKKwl9CisJcy0+cG0udTMyU1NQTV9CSVRTID0gMHg3ZTsgIC8qIHJldiBjLCB1c2UgMHg3YyBmb3IgcmV2IGEgb3IgYiAqLworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNzNDI4MV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQoreworI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisJc3RydWN0IHBtX2RldiAqcG1kZXY7CisjZW5kaWYKKwlzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzOworCWRtYV9hZGRyX3QgZG1hX21hc2s7CisJbW1fc2VnbWVudF90IGZzOworCWludCBpLCB2YWw7CisJdW5zaWduZWQgaW50IHRlbXAxLCB0ZW1wMjsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBwcm9iZSgpK1xuIikpOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpIHsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI4MTogcGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSB8fAorCSAgICAhKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDEpICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI4MTogcHJvYmUoKS0gTWVtb3J5IHJlZ2lvbiBub3QgYXNzaWduZWRcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChwY2lkZXYtPmlycSA9PSAwKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI4MTogcHJvYmUoKSBJUlEgbm90IGFzc2lnbmVkXG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkbWFfbWFzayA9IDB4ZmZmZmZmZmY7CS8qIHRoaXMgZW5hYmxlcyBwbGF5YmFjayBhbmQgcmVjb3JkaW5nICovCisJaSA9IHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCBkbWFfbWFzayk7CisJaWYgKGkpIHsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKKwkJICAgICAgImNzNDI4MTogcHJvYmUoKSBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIikpOworCQlyZXR1cm4gaTsKKwl9CisJaWYgKCEocyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjczQyODFfc3RhdGUpLCBHRlBfS0VSTkVMKSkpIHsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKKwkJICAgICAgImNzNDI4MTogcHJvYmUoKSBubyBtZW1vcnkgZm9yIHN0YXRlIHN0cnVjdC5cbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBjczQyODFfc3RhdGUpKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfYWRjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXRfYWRjKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXRfZGFjKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5taWRpLml3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5taWRpLm93YWl0KTsKKwlpbml0X01VVEVYKCZzLT5vcGVuX3NlbSk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW1fYWRjKTsKKwlpbml0X01VVEVYKCZzLT5vcGVuX3NlbV9kYWMpOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5wQkEwcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOworCXMtPnBCQTFwaHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMSk7CisKKwkvKiBDb252ZXJ0IHBoeXMgdG8gbGluZWFyLiAqLworCXMtPnBCQTAgPSBpb3JlbWFwX25vY2FjaGUocy0+cEJBMHBoeXMsIDQwOTYpOworCWlmICghcy0+cEJBMCkgeworCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9FUlIKKwkJCSAiY3M0MjgxOiBCQTAgSS9PIG1hcHBpbmcgZmFpbGVkLiBTa2lwcGluZyBwYXJ0LlxuIikpOworCQlnb3RvIGVycl9mcmVlOworCX0KKwlzLT5wQkExID0gaW9yZW1hcF9ub2NhY2hlKHMtPnBCQTFwaHlzLCA2NTUzNik7CisJaWYgKCFzLT5wQkExKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0VSUgorCQkJICJjczQyODE6IEJBMSBJL08gbWFwcGluZyBmYWlsZWQuIFNraXBwaW5nIHBhcnQuXG4iKSk7CisJCWdvdG8gZXJyX3VubWFwOworCX0KKworCXRlbXAxID0gcmVhZGwocy0+cEJBMCArIEJBMF9QQ0lDRkcwMCk7CisJdGVtcDIgPSByZWFkbChzLT5wQkEwICsgQkEwX1BDSUNGRzA0KTsKKworCUNTX0RCR09VVChDU19JTklULCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0MjgxOiBwcm9iZSgpIEJBMD0weCUuOHggQkExPTB4JS44eCBwQkEwPSVwIHBCQTE9JXAgXG4iLAorCQkJICh1bnNpZ25lZCkgdGVtcDEsICh1bnNpZ25lZCkgdGVtcDIsIHMtPnBCQTAsIHMtPnBCQTEpKTsKKwlDU19EQkdPVVQoQ1NfSU5JVCwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDI4MTogcHJvYmUoKSBwQkEwcGh5cz0weCUuOHggcEJBMXBoeXM9MHglLjh4XG4iLAorCQkJICh1bnNpZ25lZCkgcy0+cEJBMHBoeXMsICh1bnNpZ25lZCkgcy0+cEJBMXBoeXMpKTsKKworI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisJcy0+cG0uZmxhZ3MgPSBDUzQyODFfUE1fSURMRTsKKyNlbmRpZgorCXRlbXAxID0gY3M0MjgxX2h3X2luaXQocyk7CisJaWYgKHRlbXAxKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0VSUgorCQkJICJjczQyODE6IGNzNDI4MV9od19pbml0KCkgZmFpbGVkLiBTa2lwcGluZyBwYXJ0LlxuIikpOworCQlnb3RvIGVycl9pcnE7CisJfQorCXMtPm1hZ2ljID0gQ1M0MjgxX01BR0lDOworCXMtPnBjaWRldiA9IHBjaWRldjsKKwlzLT5pcnEgPSBwY2lkZXYtPmlycTsKKwlpZiAocmVxdWVzdF9pcnEKKwkgICAgKHMtPmlycSwgY3M0MjgxX2ludGVycnVwdCwgU0FfU0hJUlEsICJDcnlzdGFsIENTNDI4MSIsIHMpKSB7CisJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsCisJCQkgIHByaW50ayhLRVJOX0VSUiAiY3M0MjgxOiBpcnEgJXUgaW4gdXNlXG4iLCBzLT5pcnEpKTsKKwkJZ290byBlcnJfaXJxOworCX0KKwlpZiAoKHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmY3M0MjgxX2F1ZGlvX2ZvcHMsIC0xKSkgPAorCSAgICAwKSB7CisJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgorCQkJICJjczQyODE6IHByb2JlKCkgcmVnaXN0ZXJfc291bmRfZHNwKCkgZmFpbGVkLlxuIikpOworCQlnb3RvIGVycl9kZXYxOworCX0KKwlpZiAoKHMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZjczQyODFfbWl4ZXJfZm9wcywgLTEpKSA8CisJICAgIDApIHsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI4MTogcHJvYmUoKSByZWdpc3Rlcl9zb3VuZF9taXhlcigpIGZhaWxlZC5cbiIpKTsKKwkJZ290byBlcnJfZGV2MjsKKwl9CisJaWYgKChzLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJmNzNDI4MV9taWRpX2ZvcHMsIC0xKSkgPCAwKSB7CisJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgorCQkJICJjczQyODE6IHByb2JlKCkgcmVnaXN0ZXJfc291bmRfbWlkaSgpIGZhaWxlZC5cbiIpKTsKKwkJZ290byBlcnJfZGV2MzsKKwl9CisjaWZuZGVmIE5PVF9DUzQyODFfUE0KKwljczQyODFfSW5pdFBNKHMpOworCXBtZGV2ID0gY3NfcG1fcmVnaXN0ZXIoUE1fUENJX0RFViwgUE1fUENJX0lEKHBjaWRldiksIGNzNDI4MV9wbV9jYWxsYmFjayk7CisJaWYgKHBtZGV2KQorCXsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19QTSwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyODE6IHByb2JlKCkgcG1fcmVnaXN0ZXIoKSBzdWNjZWVkZWQgKCVwKS5cbiIsIHBtZGV2KSk7CisJCXBtZGV2LT5kYXRhID0gczsKKwl9CisJZWxzZQorCXsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19QTSB8IENTX0VSUk9SLCAwLCBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDI4MTogcHJvYmUoKSBwbV9yZWdpc3RlcigpIGZhaWxlZCAoJXApLlxuIiwgcG1kZXYpKTsKKwkJcy0+cG0uZmxhZ3MgfD0gQ1M0MjgxX1BNX05PVF9SRUdJU1RFUkVEOworCX0KKyNlbmRpZgorCisJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsJLy8gZW5hYmxlIGJ1cyBtYXN0ZXJpbmcgCisKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCXZhbCA9IFNPVU5EX01BU0tfTElORTsKKwltaXhlcl9pb2N0bChzLCBTT1VORF9NSVhFUl9XUklURV9SRUNTUkMsICh1bnNpZ25lZCBsb25nKSAmdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGluaXR2b2wpIC8gc2l6ZW9mKGluaXR2b2xbMF0pOyBpKyspIHsKKwkJdmFsID0gaW5pdHZvbFtpXS52b2w7CisJCW1peGVyX2lvY3RsKHMsIGluaXR2b2xbaV0ubWl4Y2gsICh1bnNpZ25lZCBsb25nKSAmdmFsKTsKKwl9CisJdmFsID0gMTsJCS8vIGVuYWJsZSBtaWMgcHJlYW1wIAorCW1peGVyX2lvY3RsKHMsIFNPVU5EX01JWEVSX1BSSVZBVEUxLCAodW5zaWduZWQgbG9uZykgJnZhbCk7CisJc2V0X2ZzKGZzKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHMpOworCWxpc3RfYWRkKCZzLT5saXN0LCAmY3M0MjgxX2RldnMpOworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJImNzNDI4MTogcHJvYmUoKS0gZGV2aWNlIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHlcbiIpKTsKKwlyZXR1cm4gMDsKKworICAgICAgZXJyX2RldjM6CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5kZXZfbWl4ZXIpOworICAgICAgZXJyX2RldjI6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKyAgICAgIGVycl9kZXYxOgorCWZyZWVfaXJxKHMtPmlycSwgcyk7CisgICAgICBlcnJfaXJxOgorCWlvdW5tYXAocy0+cEJBMSk7CisgICAgICBlcnJfdW5tYXA6CisJaW91bm1hcChzLT5wQkEwKTsKKyAgICAgIGVycl9mcmVlOgorCWtmcmVlKHMpOworCisJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTworCQkiY3M0MjgxOiBwcm9iZSgpLSBubyBkZXZpY2UgYWxsb2NhdGVkXG4iKSk7CisJcmV0dXJuIC1FTk9ERVY7Cit9IC8vIHByb2JlX2NzNDI4MQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNzNDI4MV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwkvLyBzdG9wIERNQSBjb250cm9sbGVyIAorCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmRldl9taXhlcik7CisJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKHMtPmRldl9taWRpKTsKKwlpb3VubWFwKHMtPnBCQTEpOworCWlvdW5tYXAocy0+cEJBMCk7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsTlVMTCk7CisJbGlzdF9kZWwoJnMtPmxpc3QpOworCWtmcmVlKHMpOworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJICJjczQyODE6IGNzNDI4MV9yZW1vdmUoKS06IHJlbW92ZSBzdWNjZXNzZnVsXG4iKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczQyODFfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQ0lSUlVTLAorCQkuZGV2aWNlICAgID0gUENJX0RFVklDRV9JRF9DUllTVEFMX0NTNDI4MSwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCX0sCisJeyAwLCB9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNzNDI4MV9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNzNDI4MV9wY2lfZHJpdmVyID0geworCS5uYW1lCSAgPSAiY3M0MjgxIiwKKwkuaWRfdGFibGUgPSBjczQyODFfcGNpX3RibCwKKwkucHJvYmUJICA9IGNzNDI4MV9wcm9iZSwKKwkucmVtb3ZlCSAgPSBfX2RldmV4aXRfcChjczQyODFfcmVtb3ZlKSwKKwkuc3VzcGVuZCAgPSBDUzQyODFfU1VTUEVORF9UQkwsCisJLnJlc3VtZQkgID0gQ1M0MjgxX1JFU1VNRV9UQkwsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjczQyODFfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcnRuID0gMDsKKwlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0MjgxOiBjczQyODFfaW5pdF9tb2R1bGUoKSsgXG4iKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiB2ZXJzaW9uIHYlZC4lMDJkLiVkIHRpbWUgIiBfX1RJTUVfXyAiICIKKwkgICAgICAgX19EQVRFX18gIlxuIiwgQ1M0MjgxX01BSk9SX1ZFUlNJT04sIENTNDI4MV9NSU5PUl9WRVJTSU9OLAorCSAgICAgICBDUzQyODFfQVJDSCk7CisJcnRuID0gcGNpX21vZHVsZV9pbml0KCZjczQyODFfcGNpX2RyaXZlcik7CisKKwlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3M0MjgxX2luaXRfbW9kdWxlKCktICglZClcbiIscnRuKSk7CisJcmV0dXJuIHJ0bjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNzNDI4MV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3M0MjgxX3BjaV9kcml2ZXIpOworI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisJY3NfcG1fdW5yZWdpc3Rlcl9hbGwoY3M0MjgxX3BtX2NhbGxiYWNrKTsKKyNlbmRpZgorCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjbGVhbnVwX2NzNDI4MSgpIGZpbmlzaGVkXG4iKSk7Cit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKK01PRFVMRV9BVVRIT1IoImd3IGJveW50b24sIGF1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDaXJydXMgTG9naWMgQ1M0MjgxIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKK21vZHVsZV9pbml0KGNzNDI4MV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChjczQyODFfY2xlYW51cF9tb2R1bGUpOworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MXBtLTI0LmMgYi9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MXBtLTI0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNDUzYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9jczQyODEvY3M0MjgxcG0tMjQuYwpAQCAtMCwwICsxLDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICJjczQyODFwbS5jIiAtLSAgQ2lycnVzIExvZ2ljLUNyeXN0YWwgQ1M0MjgxIGxpbnV4IGF1ZGlvIGRyaXZlci4KKyoKKyogICAgICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgQ2lycnVzIExvZ2ljIENvcnAuICAKKyogICAgICAgICAgICAtLSB0b20gd29sbGVyICh0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbSkgb3IKKyogICAgICAgICAgICAgICAoYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAxMi8yMi8wMCB0cncgLSBuZXcgZmlsZS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIE5PVF9DUzQyODFfUE0KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjZGVmaW5lIGNzX3BtX3JlZ2lzdGVyKGEsIGIsIGMpIHBtX3JlZ2lzdGVyKChhKSwgKGIpLCAoYykpOworI2RlZmluZSBjc19wbV91bnJlZ2lzdGVyX2FsbChhKSBwbV91bnJlZ2lzdGVyX2FsbCgoYSkpOworCitzdGF0aWMgaW50IGNzNDI4MV9zdXNwZW5kKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpOworc3RhdGljIGludCBjczQyODFfcmVzdW1lKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpOworLyogCisqIGZvciBub3cgKDEyLzIyLzAwKSBvbmx5IGVuYWJsZSB0aGUgcG1fcmVnaXN0ZXIgUE0gc3VwcG9ydC4KKyogYWxsb3cgdGhlc2UgdGFibGUgZW50cmllcyB0byBiZSBudWxsLgorI2RlZmluZSBDUzQyODFfU1VTUEVORF9UQkwgY3M0MjgxX3N1c3BlbmRfdGJsCisjZGVmaW5lIENTNDI4MV9SRVNVTUVfVEJMIGNzNDI4MV9yZXN1bWVfdGJsCisqLworI2RlZmluZSBDUzQyODFfU1VTUEVORF9UQkwgY3M0MjgxX3N1c3BlbmRfbnVsbAorI2RlZmluZSBDUzQyODFfUkVTVU1FX1RCTCBjczQyODFfcmVzdW1lX251bGwKKworc3RhdGljIGludCBjczQyODFfcG1fY2FsbGJhY2soc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzdGF0ZTsKKworCUNTX0RCR09VVChDU19QTSwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDI4MTogY3M0MjgxX3BtX2NhbGxiYWNrIGRldj0lcCBycXN0PTB4JXggc3RhdGU9JXBcbiIsCisJCQlkZXYsKHVuc2lnbmVkKXJxc3QsZGF0YSkpOworCXN0YXRlID0gKHN0cnVjdCBjczQyODFfc3RhdGUgKikgZGV2LT5kYXRhOworCWlmIChzdGF0ZSkgeworCQlzd2l0Y2gocnFzdCkgeworCQkJY2FzZSBQTV9TVVNQRU5EOgorCQkJCUNTX0RCR09VVChDU19QTSwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiY3M0MjgxOiBQTSBzdXNwZW5kIHJlcXVlc3RcbiIpKTsKKwkJCQlpZihjczQyODFfc3VzcGVuZChzdGF0ZSkpCisJCQkJeworCQkJCSAgICBDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCQkJImNzNDI4MTogUE0gc3VzcGVuZCByZXF1ZXN0IHJlZnVzZWRcbiIpKTsKKwkJCQkJcmV0dXJuIDE7IAorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUE1fUkVTVU1FOgorCQkJCUNTX0RCR09VVChDU19QTSwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiY3M0MjgxOiBQTSByZXN1bWUgcmVxdWVzdFxuIikpOworCQkJCWlmKGNzNDI4MV9yZXN1bWUoc3RhdGUpKQorCQkJCXsKKwkJCQkgICAgQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSJjczQyODE6IFBNIHJlc3VtZSByZXF1ZXN0IHJlZnVzZWRcbiIpKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qIENTNDI4MV9QTSAqLworI2RlZmluZSBDUzQyODFfU1VTUEVORF9UQkwgY3M0MjgxX3N1c3BlbmRfbnVsbAorI2RlZmluZSBDUzQyODFfUkVTVU1FX1RCTCBjczQyODFfcmVzdW1lX251bGwKKyNlbmRpZiAvKiBDUzQyODFfUE0gKi8KKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDI4MS9jczQyODFwbS5oIGIvc291bmQvb3NzL2NzNDI4MS9jczQyODFwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NGZkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MXBtLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICJjczQyODFwbS5oIiAtLSAgQ2lycnVzIExvZ2ljLUNyeXN0YWwgQ1M0MjgxIGxpbnV4IGF1ZGlvIGRyaXZlci4KKyoKKyogICAgICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgQ2lycnVzIExvZ2ljIENvcnAuICAKKyogICAgICAgICAgICAtLSB0b20gd29sbGVyICh0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbSkgb3IKKyogICAgICAgICAgICAgICAoYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAxMi8yMi8wMCB0cncgLSBuZXcgZmlsZS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZ2VuZXJhbCBwbSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBDUzQyODFfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFIDB4MjYKKyNkZWZpbmUgQ1M0MjgxX0FDOTdfTlVNQkVSX1JFU1RPUkVfUkVHUyAoQ1M0MjgxX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRS8yLTEpCisKKy8qIHBpcGVsaW5lIGRlZmluaXRpb25zICovCisjZGVmaW5lIENTNDI4MV9OVU1CRVJfT0ZfUElQRUxJTkVTIAk0CisjZGVmaW5lIENTNDI4MV9QSVBFTElORV9WQUxJRCAJCTB4MDAwMQorI2RlZmluZSBDUzQyODFfUExBWUJBQ0tfUElQRUxJTkVfTlVNQkVSCTB4MDAwMAorI2RlZmluZSBDUzQyODFfQ0FQVFVSRV9QSVBFTElORV9OVU1CRVIgCTB4MDAwMQorCisvKiBQTSBzdGF0ZSBkZWZpbnRpb25zICovCisjZGVmaW5lIENTNDI4MV9QTV9OT1RfUkVHSVNURVJFRAkweDEwMDAKKyNkZWZpbmUgQ1M0MjgxX1BNX0lETEUJCQkweDAwMDEKKyNkZWZpbmUgQ1M0MjgxX1BNX1NVU1BFTkRJTkcJCTB4MDAwMgorI2RlZmluZSBDUzQyODFfUE1fU1VTUEVOREVECQkweDAwMDQKKyNkZWZpbmUgQ1M0MjgxX1BNX1JFU1VNSU5HCQkweDAwMDgKKyNkZWZpbmUgQ1M0MjgxX1BNX1JFU1VNRUQJCTB4MDAxMAorCitzdHJ1Y3QgY3M0MjgxX3BtIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB1MzJDTEtDUjFfU0FWRSx1MzJTU1BNVmFsdWUsdTMyUFBMVkN2YWx1ZSx1MzJQUFJWQ3ZhbHVlOworCXUzMiB1MzJGTUxWQ3ZhbHVlLHUzMkZNUlZDdmFsdWUsdTMyR1BJT1J2YWx1ZSx1MzJKU0NUTHZhbHVlLHUzMlNTQ1I7CisJdTMyIHUzMlNSQ1NBLHUzMkRhY0FTUix1MzJBZGNBU1IsdTMyRGFjU1IsdTMyQWRjU1IsdTMyTUlEQ1JfU2F2ZTsKKwl1MzIgdTMyU1NQTV9CSVRTOworCXUzMiBhYzk3W0NTNDI4MV9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1NdOworCXUzMiB1MzJBQzk3X21hc3Rlcl92b2x1bWUsIHUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZSwgdTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm87CisJdTMyIHUzMkFDOTdfcGNtX291dF92b2x1bWUsIHUzMkFDOTdfcG93ZXJkb3duLCB1MzJBQzk3X2dlbmVyYWxfcHVycG9zZTsKKwl1MzIgdTMyaHdwdHJfcGxheWJhY2ssdTMyaHdwdHJfY2FwdHVyZTsKK307CisKK3N0cnVjdCBjczQyODFfcGlwZWxpbmUgeworCXVuc2lnbmVkIGZsYWdzOworCXVuc2lnbmVkIG51bWJlcjsKKwl1MzIgdTMyREJBblZhbHVlLHUzMkRCQ25WYWx1ZSx1MzJETVJuVmFsdWUsdTMyRENSblZhbHVlOworCXUzMiB1MzJEQkFuQWRkcmVzcyx1MzJEQ0FuQWRkcmVzcyx1MzJEQkNuQWRkcmVzcyx1MzJEQ0NuQWRkcmVzczsKKwl1MzIgdTMyRE1SbkFkZHJlc3MsdTMyRENSbkFkZHJlc3MsdTMySERTUm5BZGRyZXNzOworCXUzMiB1MzJEQkFuX1NhdmUsdTMyREJDbl9TYXZlLHUzMkRNUm5fU2F2ZSx1MzJEQ1JuX1NhdmU7CisJdTMyIHUzMkRDQ25fU2F2ZSx1MzJEQ0FuX1NhdmU7CisvKiAKKyogdGVjaG5pY2FsbHksIHRoZXNlIGFyZSBmaWZvIHZhcmlhYmxlcywgYnV0IGp1c3QgbWFwIHRoZSAKKyogZmlyc3QgZmlmbyB3aXRoIHRoZSBmaXJzdCBwaXBlbGluZSBhbmQgdGhlbiB1c2UgdGhlIGZpZm8KKyogdmFyaWFibGVzIGluc2lkZSBvZiB0aGUgcGlwZWxpbmUgc3RydWN0LgorKi8KKwl1MzIgdTMyRkNSbl9TYXZlLHUzMkZTSUNuX1NhdmU7CisJdTMyIHUzMkZDUm5WYWx1ZSx1MzJGQ1JuQWRkcmVzcyx1MzJGU0lDblZhbHVlLHUzMkZTSUNuQWRkcmVzczsKKwl1MzIgdTMyRlBEUm5WYWx1ZSx1MzJGUERSbkFkZHJlc3M7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0NjF4LmggYi9zb3VuZC9vc3MvY3M0NjF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlNDEzMwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9jczQ2MXguaApAQCAtMCwwICsxLDE2OTEgQEAKKyNpZm5kZWYgX19DUzQ2MVhfSAorI2RlZmluZSBfX0NTNDYxWF9ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBDaXJydXMgTG9naWMgQ29ycG9yYXRpb24gPHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tPgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICogIERlZmluaXRpb25zIGZvciBDaXJydXMgTG9naWMgQ1M0NjF4IGNoaXBzCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0NJUlJVUworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NJUlJVUyAgICAgICAgICAgIDB4MTAxMworI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMCAgICAgICAweDYwMDEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTIgICAgICAgMHg2MDAzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjE1ICAgICAgIDB4NjAwNAorI2VuZGlmCisKKy8qCisgKiAgRGlyZWN0IHJlZ2lzdGVycworICovCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIG9mZnNldHMgb2YgdGhlIHJlZ2lzdGVycyBhY2Nlc3NlZCB2aWEgYmFzZSBhZGRyZXNzCisgKiAgcmVnaXN0ZXIgemVybyBvbiB0aGUgQ1M0NjF4IHBhcnQuCisgKi8KKyNkZWZpbmUgQkEwX0hJU1IJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBCQTBfSFNSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBCQTBfSElDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBCQTBfRE1TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBCQTBfSFNBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAorI2RlZmluZSBCQTBfSERBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNAorI2RlZmluZSBCQTBfSERNUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOAorI2RlZmluZSBCQTBfSERDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQworI2RlZmluZSBCQTBfUEZNQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBCQTBfUEZDVjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNAorI2RlZmluZSBCQTBfUEZDVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwOAorI2RlZmluZSBCQTBfUENJQ0ZHMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBCQTBfUENJQ0ZHMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNAorI2RlZmluZSBCQTBfUENJQ0ZHMDggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwOAorI2RlZmluZSBCQTBfUENJQ0ZHMEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwQworI2RlZmluZSBCQTBfUENJQ0ZHMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxMAorI2RlZmluZSBCQTBfUENJQ0ZHMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxNAorI2RlZmluZSBCQTBfUENJQ0ZHMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxOAorI2RlZmluZSBCQTBfUENJQ0ZHMUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxQworI2RlZmluZSBCQTBfUENJQ0ZHMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyMAorI2RlZmluZSBCQTBfUENJQ0ZHMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyNAorI2RlZmluZSBCQTBfUENJQ0ZHMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyOAorI2RlZmluZSBCQTBfUENJQ0ZHMkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyQworI2RlZmluZSBCQTBfUENJQ0ZHMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzMAorI2RlZmluZSBCQTBfUENJQ0ZHMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzNAorI2RlZmluZSBCQTBfUENJQ0ZHMzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzOAorI2RlZmluZSBCQTBfUENJQ0ZHM0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzQworI2RlZmluZSBCQTBfQ0xLQ1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBCQTBfQ0xLQ1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwNAorI2RlZmluZSBCQTBfUExMTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwOAorI2RlZmluZSBCQTBfUExMQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwQworI2RlZmluZSBCQTBfRlJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQxMCAKKyNkZWZpbmUgQkEwX0NGTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MTQKKyNkZWZpbmUgQkEwX0NGTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MTgKKyNkZWZpbmUgQkEwX1NFUk1DMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjAKKyNkZWZpbmUgQkEwX1NFUk1DMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjQKKyNkZWZpbmUgQkEwX1NFUkMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjgKKyNkZWZpbmUgQkEwX1NFUkMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MkMKKyNkZWZpbmUgQkEwX1NFUkMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MzAKKyNkZWZpbmUgQkEwX1NFUkM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MzQKKyNkZWZpbmUgQkEwX1NFUkM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MzgKKyNkZWZpbmUgQkEwX1NFUkJTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0M0MKKyNkZWZpbmUgQkEwX1NFUkJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NDAKKyNkZWZpbmUgQkEwX1NFUkJDTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NDQKKyNkZWZpbmUgQkEwX1NFUkJBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NDgKKyNkZWZpbmUgQkEwX1NFUkJDRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NEMKKyNkZWZpbmUgQkEwX1NFUkJXUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NTAKKyNkZWZpbmUgQkEwX1NFUkJSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NTQKKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEJBMF9BU0VSX0ZBRERSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDU4CisjZW5kaWYKKyNkZWZpbmUgQkEwX0FDQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjAKKyNkZWZpbmUgQkEwX0FDU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjQKKyNkZWZpbmUgQkEwX0FDT1NWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjgKKyNkZWZpbmUgQkEwX0FDQ0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NkMKKyNkZWZpbmUgQkEwX0FDQ0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzAKKyNkZWZpbmUgQkEwX0FDSVNWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzQKKyNkZWZpbmUgQkEwX0FDU0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzgKKyNkZWZpbmUgQkEwX0FDU0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0N0MKKyNkZWZpbmUgQkEwX0pTUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODAKKyNkZWZpbmUgQkEwX0pTQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODQKKyNkZWZpbmUgQkEwX0pTQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODgKKyNkZWZpbmUgQkEwX0pTQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OEMKKyNkZWZpbmUgQkEwX01JRENSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTAKKyNkZWZpbmUgQkEwX01JRFNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTQKKyNkZWZpbmUgQkEwX01JRFdQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTgKKyNkZWZpbmUgQkEwX01JRFJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OUMKKyNkZWZpbmUgQkEwX0pTSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QTAKKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEJBMF9BU0VSX01BU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEE0CisjZW5kaWYKKyNkZWZpbmUgQkEwX0NGR0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjAKKyNkZWZpbmUgQkEwX1NTVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjQKKyNkZWZpbmUgQkEwX0dQSU9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjgKKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEJBMF9FR1BJT0RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEJDCisjZGVmaW5lIEJBMF9FR1BJT1BUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEMwCisjZGVmaW5lIEJBMF9FR1BJT1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEM0CisjZGVmaW5lIEJBMF9FR1BJT1dSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEM4CisjZGVmaW5lIEJBMF9FR1BJT1NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNENDCisjZGVmaW5lIEJBMF9TRVJDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEQwCisjZGVmaW5lIEJBMF9TRVJDNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEQ0CisjZGVmaW5lIEJBMF9TRVJBQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEQ4CisjZGVmaW5lIEJBMF9BQ0NUTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEUwCisjZGVmaW5lIEJBMF9BQ1NUUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEU0CisjZGVmaW5lIEJBMF9BQ09TVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEU4CisjZGVmaW5lIEJBMF9BQ0NBRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEVDCisjZGVmaW5lIEJBMF9BQ0NEQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEYwCisjZGVmaW5lIEJBMF9BQ0lTVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEY0CisjZGVmaW5lIEJBMF9BQ1NBRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEY4CisjZGVmaW5lIEJBMF9BQ1NEQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEZDCisjZGVmaW5lIEJBMF9JT1RBQzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTAwCisjZGVmaW5lIEJBMF9JT1RBQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTA0CisjZGVmaW5lIEJBMF9JT1RBQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTA4CisjZGVmaW5lIEJBMF9JT1RBQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTBDCisjZGVmaW5lIEJBMF9JT1RBQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTEwCisjZGVmaW5lIEJBMF9JT1RBQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTE0CisjZGVmaW5lIEJBMF9JT1RBQzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTE4CisjZGVmaW5lIEJBMF9JT1RBQzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTFDCisjZGVmaW5lIEJBMF9JT1RBQzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTIwCisjZGVmaW5lIEJBMF9JT1RBQzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTI0CisjZGVmaW5lIEJBMF9JT1RBQzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTI4CisjZGVmaW5lIEJBMF9JT1RBQzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTJDCisjZGVmaW5lIEJBMF9JT1RGUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTQwCisjZGVmaW5lIEJBMF9JT1RGUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTQ0CisjZGVmaW5lIEJBMF9JT1RGUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTQ4CisjZGVmaW5lIEJBMF9JT1RGUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTRDCisjZGVmaW5lIEJBMF9JT1RGUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTUwCisjZGVmaW5lIEJBMF9JT1RGUjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTU0CisjZGVmaW5lIEJBMF9JT1RGUjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTU4CisjZGVmaW5lIEJBMF9JT1RGUjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTVDCisjZGVmaW5lIEJBMF9JT1RGSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTgwCisjZGVmaW5lIEJBMF9JT1RSUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTg0CisjZGVmaW5lIEJBMF9JT1RGUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTg4CisjZGVmaW5lIEJBMF9JT1RDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNThDCisjZGVmaW5lIEJBMF9EUENJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTkwCisjZGVmaW5lIEJBMF9EUENJQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTk0CisjZGVmaW5lIEJBMF9EUENJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTk4CisjZGVmaW5lIEJBMF9QQ1BDSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjAwCisjZGVmaW5lIEJBMF9QQ1BDSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjA0CisjZGVmaW5lIEJBMF9QQ1BDSUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjA4CisjZGVmaW5lIEJBMF9FUENJUE1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjEwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBtZW1vcmllcyBhY2Nlc3NlZCB2aWEKKyAqICBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgb25lIG9uIHRoZSBDUzQ2MXggcGFydC4KKyAqLworI2RlZmluZSBCQTFfU1BfRE1FTTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBCQTFfU1BfRE1FTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBCQTFfU1BfUE1FTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBCQTFfU1BfUkVHCQkJCTB4MDAwMzAwMDAKKyNkZWZpbmUgQkExX1NQQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgQkExX0RSRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDQKKyNkZWZpbmUgQkExX0RTUldQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDgKKyNkZWZpbmUgQkExX1RXUFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMEMKKyNkZWZpbmUgQkExX1NQV1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMTAKKyNkZWZpbmUgQkExX1NQSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMTQKKyNkZWZpbmUgQkExX0ZHUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMjAKKyNkZWZpbmUgQkExX1NQQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMjgKKyNkZWZpbmUgQkExX1NEU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMkMKKyNkZWZpbmUgQkExX0ZSTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMzAKKyNkZWZpbmUgQkExX0ZSQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMzQKKyNkZWZpbmUgQkExX0ZSU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMzgKKyNkZWZpbmUgQkExX09NTklfTUVNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTAwMDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgaW50ZXJydXB0IHN0YXR1cworICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEhJU1JfVkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEhJU1JfVkMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhJU1JfVkMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhJU1JfVkMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhJU1JfVkMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhJU1JfVkM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhJU1JfVkM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEhJU1JfVkM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhJU1JfVkM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhJU1JfVkM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEhJU1JfVkM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhJU1JfVkMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhJU1JfVkMxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEhJU1JfVkMxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEhJU1JfVkMxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhJU1JfVkMxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEhJU1JfVkMxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhJU1JfSU5UMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhJU1JfSU5UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEhJU1JfRE1BSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEhJU1JfRlJPVlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEhJU1JfTUlESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjaWZkZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEhJU1JfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGRTAwMDAwCisjZWxzZQorI2RlZmluZSBISVNSX1NCSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBISVNSX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRkMwMDAwMAorI2VuZGlmCisjZGVmaW5lIEhJU1JfSDBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEhJU1JfSU5URU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IHNpZ25hbCByZWdpc3RlciAwLgorICovCisjZGVmaW5lIEhTUjBfVkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIEhTUjBfVkMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhTUjBfVkMxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhTUjBfVkMxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhTUjBfVkMxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhTUjBfVkMyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhTUjBfVkMyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEhTUjBfVkMyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhTUjBfVkMyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhTUjBfVkMyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEhTUjBfVkMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhTUjBfVkMyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhTUjBfVkMyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEhTUjBfVkMyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEhTUjBfVkMyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhTUjBfVkMzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEhTUjBfVkMzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhTUjBfVkMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhTUjBfVkMzMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEhTUjBfVkMzNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEhTUjBfVkMzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEhTUjBfVkMzNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEhTUjBfVkMzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEhTUjBfVkMzOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEhTUjBfVkMzOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEhTUjBfVkM0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IGludGVycnVwdCBjb250cm9sCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgSElDUl9JRVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSElDUl9DSEdNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIERNQSBzdGF0dXMgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRE1TUl9IUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRE1TUl9IUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRE1TUl9TUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRE1TUl9TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgRE1BIHNvdXJjZSBhZGRyZXNzCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgSFNBUl9IT1NUX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgSFNBUl9EU1BfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgSFNBUl9NRU1JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgSFNBUl9NRU1JRF9TUF9ETUVNMCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSFNBUl9NRU1JRF9TUF9ETUVNMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgSFNBUl9NRU1JRF9TUF9QTUVNICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSFNBUl9NRU1JRF9TUF9ERUJVRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSFNBUl9NRU1JRF9PTU5JX01FTSAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTAwMDAKKyNkZWZpbmUgSFNBUl9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSFNBUl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgRE1BIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBIREFSX0hPU1RfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBIREFSX0RTUF9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBIREFSX01FTUlEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMAorI2RlZmluZSBIREFSX01FTUlEX1NQX0RNRU0wICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIREFSX01FTUlEX1NQX0RNRU0xICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIREFSX01FTUlEX1NQX1BNRU0gICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBIREFSX01FTUlEX1NQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIREFSX01FTUlEX09NTklfTUVNICAgICAgICAgICAgICAgICAgICAgMHgwMDBFMDAwMAorI2RlZmluZSBIREFSX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBIREFSX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBETUEgY29udHJvbCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBIRE1SX0FDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRjAwMAorI2RlZmluZSBIRE1SX0FDXzhfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBIRE1SX0FDX01fUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBIRE1SX0FDX0JfTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIRE1SX0FDX1NfVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBETUEgY29udHJvbCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBIRENSX0NPVU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNGRgorI2RlZmluZSBIRENSX0RPTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIRENSX09QVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBIRENSX1dCRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBIRENSX1dCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIRENSX0RNU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzAwMDAwMAorI2RlZmluZSBIRENSX0RNU19MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIRENSX0RNU18xNl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBIRENSX0RNU18zMl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBIRENSX0RNU182NF9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwMDAwMAorI2RlZmluZSBIRENSX0RNU18xMjhfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBIRENSX0RNU18yNTZfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHgwNTAwMDAwMAorI2RlZmluZSBIRENSX0RNU181MTJfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMAorI2RlZmluZSBIRENSX0RNU18xMDI0X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgMHgwNzAwMDAwMAorI2RlZmluZSBIRENSX0RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBIRENSX1NNU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAwMDAwMAorI2RlZmluZSBIRENSX1NNU19MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIRENSX1NNU18xNl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBIRENSX1NNU18zMl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBIRENSX1NNU182NF9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAorI2RlZmluZSBIRENSX1NNU18xMjhfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBIRENSX1NNU18yNTZfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHg1MDAwMDAwMAorI2RlZmluZSBIRENSX1NNU181MTJfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHg2MDAwMDAwMAorI2RlZmluZSBIRENSX1NNU18xMDI0X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgMHg3MDAwMDAwMAorI2RlZmluZSBIRENSX1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBIRENSX0NPVU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciBjb250cm9sCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgUEZNQ19DMVNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUYKKyNkZWZpbmUgUEZNQ19DMUVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgUEZNQ19DMVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgUEZNQ19DMlNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRjAwMDAKKyNkZWZpbmUgUEZNQ19DMkVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgUEZNQ19DMlJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgUEZNQ19DMVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEZNQ19DMlNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFBGTUNfQlVTX0dSQU5UICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBGTUNfR1JBTlRfQUZURVJfUkVRICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBGTUNfVFJBTlNBQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBGTUNfRFdPUkRfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFBGTUNfU0xBVkVfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBGTUNfU0xBVkVfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFBGTUNfUFJFRU1QVElPTiAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFBGTUNfRElTQ09OTkVDVF9SRVRSWSAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFBGTUNfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFBGTUNfQlVTX09XTkVSU0hJUCAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFBGTUNfVFJBTlNBQ1RJT05fTEFHICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBQRk1DX1BDSV9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgUEZNQ19TRVJJQUxfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFBGTUNfU1BfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAxMworCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgcGVyZm9ybWFuY2UgY291bnRlciB2YWx1ZSAxCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgUEZDVjFfUEMxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgUEZDVjFfUEMxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgdmFsdWUgMgorICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFBGQ1YyX1BDMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIFBGQ1YyX1BDMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyIDEuCisgKi8KKyNkZWZpbmUgQ0xLQ1IxX09TQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ0xLQ1IxX09TQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEMKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1NFUklBTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX0NSWVNUQUwgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1BDSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEMKKyNkZWZpbmUgQ0xLQ1IxX1BMTFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQ0xLQ1IxX1NXQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQ0xLQ1IxX1BMTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgMi4KKyAqLworI2RlZmluZSBDTEtDUjJfUERJVlNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgorI2RlZmluZSBDTEtDUjJfUERJVlNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBDTEtDUjJfUERJVlNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBDTEtDUjJfUERJVlNfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBDTEtDUjJfUERJVlNfNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBDTEtDUjJfUERJVlNfOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBDTEtDUjJfUERJVlNfMTYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUExMIG11bHRpcGxpZXIgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgUExMTV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgUExMTV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBMTCBjYXBhY2l0b3IgY29lZmZpY2llbnQKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBQTExDQ19DRFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2lmbmRlZiBOT19DUzQ2MTAKKyNkZWZpbmUgUExMQ0NfQ0RSXzI0MF8zNTBfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUExMQ0NfQ0RSXzE4NF8yNjVfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUExMQ0NfQ0RSXzE0NF8yMDVfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUExMQ0NfQ0RSXzExMV8xNjBfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgUExMQ0NfQ0RSXzg3XzEyM19NSFogICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUExMQ0NfQ0RSXzY3Xzk2X01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgUExMQ0NfQ0RSXzUyXzc0X01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgUExMQ0NfQ0RSXzQ1XzU4X01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNlbmRpZgorI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgUExMQ0NfQ0RSXzI3MV8zOThfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUExMQ0NfQ0RSXzIyN18zMzBfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUExMQ0NfQ0RSXzE2N18yMzlfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUExMQ0NfQ0RSXzE1MF8yMTVfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgUExMQ0NfQ0RSXzEwN18xNTRfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUExMQ0NfQ0RSXzk4XzE0MF9NSFogICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgUExMQ0NfQ0RSXzczXzEwNF9NSFogICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgUExMQ0NfQ0RSXzYzXzkwX01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNlbmRpZgorI2RlZmluZSBQTExDQ19MUEZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGOAorI2lmbmRlZiBOT19DUzQ2MTAKKyNkZWZpbmUgUExMQ0NfTFBGXzIzODUwXzYwMDAwX0tIWiAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUExMQ0NfTFBGXzc5NjBfMjYyOTBfS0haICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUExMQ0NfTFBGXzQxNjBfMTA5ODBfS0haICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgUExMQ0NfTFBGXzE3NDBfNDU4MF9LSFogICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKKyNkZWZpbmUgUExMQ0NfTFBGXzcyNF8xOTEwX0tIWiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNzgKKyNkZWZpbmUgUExMQ0NfTFBGXzMxN183OThfS0haICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjgKKyNlbmRpZgorI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgUExMQ0NfTFBGXzI1NTgwXzY0NTMwX0tIWiAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUExMQ0NfTFBGXzE0MzYwXzM3MjcwX0tIWiAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUExMQ0NfTFBGXzYxMDBfMTYwMjBfS0haICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgUExMQ0NfTFBGXzI1NDBfNjY5MF9LSFogICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKKyNkZWZpbmUgUExMQ0NfTFBGXzEwNTBfMjc4MF9LSFogICAgICAgICAgICAgICAgIDB4MDAwMDAwNzgKKyNkZWZpbmUgUExMQ0NfTFBGXzQ1MF8xMTYwX0tIWiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjgKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZmVhdHVyZSByZXBvcnRpbmcgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRlJSX0ZBQl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgRlJSX01BU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUMKKyNpZmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgRlJSX0NGT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRTAKKyNlbHNlCisjZGVmaW5lIEZSUl9DRk9QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwRkUwCisjZW5kaWYKKyNkZWZpbmUgRlJSX0NGT1BfTk9UX0RWRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRlJSX0NGT1BfQTNEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRlJSX0NGT1BfMTI4X1BJTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEZSUl9DRk9QX0NTNDI4MCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZW5kaWYKKyNkZWZpbmUgRlJSX0ZBQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRlJSX01BU0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRlJSX0NGT1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbG9hZCAxCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfQ1M0MjNYICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfQUM5NyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfQ1JZU1RBTCAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfRFVBTF9BQzk3ICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgQ0ZMMV9WQUxJRF9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbG9hZCAyCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQ0ZMMl9WQUxJRF9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IG1hc3RlciBjb250cm9sCisgKiAgcmVnaXN0ZXIgMS4KKyAqLworI2RlZmluZSBTRVJNQzFfTVNQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTRVJNQzFfUFRDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRQorI2RlZmluZSBTRVJNQzFfUFRDX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBTRVJNQzFfUFRDX0FDOTcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTRVJNQzFfUFRDX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTRVJNQzFfUExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBTRVJNQzFfWExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgbWFzdGVyIGNvbnRyb2wKKyAqICByZWdpc3RlciAyLgorICovCisjZGVmaW5lIFNFUk1DMl9MUk9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNFUk1DMl9NQ09FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNFUk1DMl9NQ0RJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCAxIGNvbmZpZ3VyYXRpb24KKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTRVJDMV9TTzFFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTRVJDMV9TTzFGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRQorI2RlZmluZSBTRVJDMV9TTzFGX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBTRVJDMV9TTzFGX0FDOTcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTRVJDMV9TTzFGX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTRVJDMV9TTzFGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgMiBjb25maWd1cmF0aW9uCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSQzJfU0kxRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VSQzJfU0kxRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEUKKyNkZWZpbmUgU0VSQzJfU0kxRl9DUzQyM1ggICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgU0VSQzJfU0kxRl9BQzk3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU0VSQzJfU0kxRl9BREMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU0VSQzJfU0kxRl9TUERJRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDMgY29uZmlndXJhdGlvbgorICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNFUkMzX1NPMkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNFUkMzX1NPMkZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIFNFUkMzX1NPMkZfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFNFUkMzX1NPMkZfU1BESUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCA0IGNvbmZpZ3VyYXRpb24KKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTRVJDNF9TTzNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTRVJDNF9TTzNGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBTRVJDNF9TTzNGX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBTRVJDNF9TTzNGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgNSBjb25maWd1cmF0aW9uCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSQzVfU0kyRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VSQzVfU0kyRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgU0VSQzVfU0kyRl9BREMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgU0VSQzVfU0kyRl9TUERJRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHNhbXBsZQorICogIHBvaW50ZXIgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSQlNQX0ZTUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgU0VSQlNQX0ZTUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHN0YXR1cworICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNFUkJTVF9SUkRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNFUkJTVF9XQlNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vciBjb21tYW5kCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSQkNNX1JEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VSQkNNX1dSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIGFkZHJlc3MKKyAqICByZWdpc3Rlci4KKyAqLworI2lmZGVmIE5PX0NTNDYxMgorI2RlZmluZSBTRVJCQURfRkFEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgorI2Vsc2UKKyNkZWZpbmUgU0VSQkFEX0ZBRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxRkYKKyNlbmRpZgorI2RlZmluZSBTRVJCQURfRkFEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3IKKyAqICBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNFUkJDRl9IQlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vciB3cml0ZQorICogIHBvcnQgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSQldQX0ZXRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRkZGRkYKKyNkZWZpbmUgU0VSQldQX0ZXRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHJlYWQKKyAqICBwb3J0IHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNFUkJSUF9GUkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEZGRkZGCisjZGVmaW5lIFNFUkJSUF9GUkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBhc3luYyBGSUZPIGFkZHJlc3MgcmVnaXN0ZXIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFTRVJfRkFERFJfQTFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMUZGCisjZGVmaW5lIEFTRVJfRkFERFJfRU4xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEFTRVJfRkFERFJfQTJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxRkYwMDAwCisjZGVmaW5lIEFTRVJfRkFERFJfRU4yICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEFTRVJfRkFERFJfQTFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFTRVJfRkFERFJfQTJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNgorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQUNDVExfUlNUTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQUNDVExfRVNZTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQUNDVExfVkZSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQUNDVExfRENWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQUNDVExfQ1JXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQUNDVExfQVNZTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFDQ1RMX1RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEFDU1RTX0NSRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFDU1RTX1ZTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBBQ1NUU19XS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IG91dHB1dCBzbG90IHZhbGlkCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQUNPU1ZfU0xWMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQUNPU1ZfU0xWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQUNPU1ZfU0xWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQUNPU1ZfU0xWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQUNPU1ZfU0xWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQUNPU1ZfU0xWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQUNPU1ZfU0xWOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQUNPU1ZfU0xWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQUNPU1ZfU0xWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQUNPU1ZfU0xWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBhZGRyZXNzCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQUNDQURfQ0lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKKyNkZWZpbmUgQUNDQURfQ0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBkYXRhIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEFDQ0RBX0NEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEFDQ0RBX0NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGlucHV0IHNsb3QgdmFsaWQKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBBQ0lTVl9JU1YzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBQ0lTVl9JU1Y0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBQ0lTVl9JU1Y1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBQ0lTVl9JU1Y2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBQ0lTVl9JU1Y3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBQ0lTVl9JU1Y4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBQ0lTVl9JU1Y5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBQ0lTVl9JU1YxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBQ0lTVl9JU1YxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBQ0lTVl9JU1YxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgYWRkcmVzcworICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEFDU0FEX1NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGCisjZGVmaW5lIEFDU0FEX1NJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBkYXRhIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEFDU0RBX1NEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEFDU0RBX1NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBqb3lzdGljayBwb2xsL3RyaWdnZXIKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBKU1BUX0NBWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBKU1BUX0NBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBKU1BUX0NCWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBKU1BUX0NCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBKU1BUX0JBMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBKU1BUX0JBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBKU1BUX0JCMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBKU1BUX0JCMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgY29udHJvbCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBKU0NUTF9TUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBKU0NUTF9TUF9TTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBKU0NUTF9TUF9NRURJVU1fU0xPVyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBKU0NUTF9TUF9NRURJVU1fRkFTVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBKU0NUTF9TUF9GQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBKU0NUTF9BUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgY29vcmRpbmF0ZSBwYWlyIDEKKyAqICByZWFkYmFjayByZWdpc3Rlci4KKyAqLworI2RlZmluZSBKU0MxX1kxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBKU0MxX1gxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSBKU0MxX1kxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBKU0MxX1gxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGpveXN0aWNrIGNvb3JkaW5hdGUgcGFpciAyCisgKiAgcmVhZGJhY2sgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgSlNDMl9ZMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgSlNDMl9YMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgSlNDMl9ZMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSlNDMl9YMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIGNvbnRyb2wgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgTUlEQ1JfVFhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogRW5hYmxlIHRyYW5zbWl0dGluZy4gKi8KKyNkZWZpbmUgTUlEQ1JfUlhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIJLyogRW5hYmxlIHJlY2VpdmluZy4gKi8KKyNkZWZpbmUgTUlEQ1JfUklFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQJLyogSW50ZXJydXB0IHVwb24gdHggcmVhZHkuICovCisjZGVmaW5lIE1JRENSX1RJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CS8qIEludGVycnVwdCB1cG9uIHJ4IHJlYWR5LiAqLworI2RlZmluZSBNSURDUl9NTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAkvKiBFbmFibGUgbWlkaSBsb29wYmFjay4gKi8KKyNkZWZpbmUgTUlEQ1JfTVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAJLyogUmVzZXQgaW50ZXJmYWNlLiAqLworCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgTUlESSBzdGF0dXMgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgTUlEU1JfVEJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogVHggRklGTyBpcyBmdWxsLiAqLworI2RlZmluZSBNSURTUl9SQkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgkvKiBSeCBGSUZPIGlzIGVtcHR5LiAqLworCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgTUlESSB3cml0ZSBwb3J0IHJlZ2lzdGVyLgorICovCisjZGVmaW5lIE1JRFdQX01XRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCisjZGVmaW5lIE1JRFdQX01XRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIHJlYWQgcG9ydCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBNSURSUF9NUkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgorI2RlZmluZSBNSURSUF9NUkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgR1BJTyByZWdpc3Rlci4KKyAqLworI2RlZmluZSBKU0lPX0RBWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBKU0lPX0RBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBKU0lPX0RCWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBKU0lPX0RCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBKU0lPX0FYT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBKU0lPX0FZT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBKU0lPX0JYT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBKU0lPX0JZT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgbWFzdGVyIGFzeW5jL3N5bmMgc2VyaWFsCisgKiAgcG9ydCBlbmFibGUgcmVnaXN0ZXIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFTRVJfTUFTVEVSX01FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQ0ZHSV9DTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ0ZHSV9ET1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0ZHSV9ESU5fRUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ0ZHSV9FRUxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHN1YnN5c3RlbSBJRCBhbmQgdmVuZG9yIElECisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU1NWSURfVklEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgU1NWSURfU0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgU1NWSURfVklEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1NWSURfU0lEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBHUElPIHBpbiBpbnRlcmZhY2UgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgR1BJT1JfVk9MRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR1BJT1JfVk9MVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR1BJT1JfU0kyRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR1BJT1JfU0kyT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIEdQSU8gcGluIGRpcmVjdGlvbgorICogIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBFR1BJT0RSX0dQT0UwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFR1BJT0RSX0dQT0UxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFR1BJT0RSX0dQT0UyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFR1BJT0RSX0dQT0UzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFR1BJT0RSX0dQT0U0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFR1BJT0RSX0dQT0U1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBFR1BJT0RSX0dQT0U2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFR1BJT0RSX0dQT0U3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFR1BJT0RSX0dQT0U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbiBwb2xhcml0eS8KKyAqICB0eXBlIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBFR1BJT1BUUl9HUFBUMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFR1BJT1BUUl9HUFBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFR1BJT1BUUl9HUFBUMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFR1BJT1BUUl9HUFBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFR1BJT1BUUl9HUFBUNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFR1BJT1BUUl9HUFBUNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBFR1BJT1BUUl9HUFBUNiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFR1BJT1BUUl9HUFBUNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFR1BJT1BUUl9HUFBUOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbiBzdGlja3kKKyAqICByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgRUdQSU9UUl9HUFMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUdQSU9UUl9HUFMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUdQSU9UUl9HUFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRUdQSU9UUl9HUFMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRUdQSU9UUl9HUFM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRUdQSU9UUl9HUFM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRUdQSU9UUl9HUFM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRUdQSU9UUl9HUFM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRUdQSU9UUl9HUFM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgR1BJTyBwaW5nIHdha2V1cAorICogIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBFR1BJT1dSX0dQVzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFR1BJT1dSX0dQVzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFR1BJT1dSX0dQVzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFR1BJT1dSX0dQVzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFR1BJT1dSX0dQVzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFR1BJT1dSX0dQVzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBFR1BJT1dSX0dQVzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFR1BJT1dSX0dQVzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFR1BJT1dSX0dQVzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbiBzdGF0dXMKKyAqICByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgRUdQSU9TUl9HUFMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUdQSU9TUl9HUFMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUdQSU9TUl9HUFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRUdQSU9TUl9HUFMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRUdQSU9TUl9HUFM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRUdQSU9TUl9HUFM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRUdQSU9TUl9HUFM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRUdQSU9TUl9HUFM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRUdQSU9TUl9HUFM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgNiBjb25maWd1cmF0aW9uCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIFNFUkM2X0FTRE8yRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDcgY29uZmlndXJhdGlvbgorICogIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBTRVJDN19BU0RJMkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTRVJDN19QT1NJTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTRVJDN19TSVBPTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTRVJDN19TT1NJTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTRVJDN19TSVNPTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBBQyBsaW5rCisgKiAgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgU0VSQUNDX0NPREVDX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VSQUNDX0NPREVDX1RZUEVfMV8wMyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgU0VSQUNDX0NPREVDX1RZUEVfMl8wICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VSQUNDX1RXT19DT0RFQ1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU0VSQUNDX01ETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU0VSQUNDX0hTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVyIDIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFDQ1RMMl9SU1ROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFDQ1RMMl9FU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFDQ1RMMl9WRlJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFDQ1RMMl9EQ1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFDQ1RMMl9DUlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFDQ1RMMl9BU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyIDIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFDU1RTMl9DUkRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFDU1RTMl9WU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgb3V0cHV0IHNsb3QgdmFsaWQKKyAqICByZWdpc3RlciAyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBBQ09TVjJfU0xWMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBQ09TVjJfU0xWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBQ09TVjJfU0xWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBQ09TVjJfU0xWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBQ09TVjJfU0xWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBQ09TVjJfU0xWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBQ09TVjJfU0xWOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBQ09TVjJfU0xWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBQ09TVjJfU0xWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBQ09TVjJfU0xWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbW1hbmQgYWRkcmVzcworICogIHJlZ2lzdGVyIDIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFDQ0FEMl9DSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGCisjZGVmaW5lIEFDQ0FEMl9DSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBkYXRhIHJlZ2lzdGVyCisgKiAgMi4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgQUNDREEyX0NEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgQUNDREEyX0NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGlucHV0IHNsb3QgdmFsaWQKKyAqICByZWdpc3RlciAyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBBQ0lTVjJfSVNWMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBQ0lTVjJfSVNWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBQ0lTVjJfSVNWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBQ0lTVjJfSVNWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBQ0lTVjJfSVNWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBQ0lTVjJfSVNWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBQ0lTVjJfSVNWOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBQ0lTVjJfSVNWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBQ0lTVjJfSVNWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBQ0lTVjJfSVNWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBhZGRyZXNzCisgKiAgcmVnaXN0ZXIgMi4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgQUNTQUQyX1NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKKyNkZWZpbmUgQUNTQUQyX1NJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgZGF0YSByZWdpc3RlciAyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBBQ1NEQTJfU0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBBQ1NEQTJfU0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBhZGRyZXNzIGFuZCBjb250cm9sCisgKiAgcmVnaXN0ZXJzIChhbGwgMTIpLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBJT1RBQ19TQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBJT1RBQ19NU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMAorI2RlZmluZSBJT1RBQ19JT0RDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMAorI2RlZmluZSBJT1RBQ19JT0RDXzE2X0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBJT1RBQ19JT0RDXzEwX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBJT1RBQ19JT0RDXzEyX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBJT1RBQ19XU1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBJT1RBQ19SU1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBJT1RBQ19XU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBJT1RBQ19XRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBJT1RBQ19SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBJT1RBQ19TQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJT1RBQ19NU0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgZmFzdCByZWFkIHJlZ2lzdGVycworICogIChhbGwgOCkuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIElPVEZSX0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIElPVEZSX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwCisjZGVmaW5lIElPVEZSX1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGMDAwMDAwCisjZGVmaW5lIElPVEZSX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIElPVEZSX1ZMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIElPVEZSX0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElPVEZSX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBJT1RGUl9SX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgRklGTyByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgSU9URklGT19CQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDNGRkYKKyNkZWZpbmUgSU9URklGT19TX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBGRjAwMDAKKyNkZWZpbmUgSU9URklGT19PRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSU9URklGT19TUElPRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgSU9URklGT19CQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU9URklGT19TX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIHJldHJ5IHJlYWQgZGF0YQorICogIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBJT1RSUkRfRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBJT1RSUkRfUkRWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBJT1RSUkRfRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBGSUZPIHBvaW50ZXIKKyAqICByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgSU9URlBfQ0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDNGRkYKKyNkZWZpbmUgSU9URlBfUEFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGRjAwMDAKKyNkZWZpbmUgSU9URlBfQ0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU9URlBfUEFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIGNvbnRyb2wgcmVnaXN0ZXIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIElPVENSX0lURCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIElPVENSX0hSViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIElPVENSX1NSViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIElPVENSX0RUSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIElPVENSX0RGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIElPVENSX0REUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIElPVENSX0pURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIElPVENSX1BQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGRpcmVjdCBQQ0kgZGF0YSByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgRFBDSURfRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgRFBDSURfRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGlyZWN0IFBDSSBhZGRyZXNzIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBEUENJQV9BX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBEUENJQV9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBkaXJlY3QgUENJIGNvbW1hbmQgcmVnaXN0ZXIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIERQQ0lDX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIERQQ0lDX0NfSU9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERQQ0lDX0NfSU9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIERQQ0lDX0JFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEYwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDL1BDSSByZXF1ZXN0IHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBQQ1BDSVJfUkRDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBQQ1BDSVJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNzAwMAorI2RlZmluZSBQQ1BDSVJfUkVRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBQQ1BDSVJfUkRDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQ1BDSVJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUEMvUENJIGdyYW50IHJlZ2lzdGVyLgorICovIAorI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgUENQQ0lHX0dEQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgUENQQ0lHX1ZMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgUENQQ0lHX0dEQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUEMvUENJIG1hc3RlciBlbmFibGUKKyAqICByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgUENQQ0lFTl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgUENJIHBvd2VyCisgKiAgbWFuYWdlbWVudCBjb250cm9sIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBFUENJUE1DX0dXVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFUENJUE1DX0ZTUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2VuZGlmIAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU1AgY29udHJvbCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTUENSX1JVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTUENSX1NUUEZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTUENSX1JVTkZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTUENSX1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTUENSX0RSUUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTUENSX1JTVFNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTUENSX09SRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgU1BDUl9QQ0lJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgU1BDUl9PSU5URCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgU1BDUl9DUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGVidWcgaW5kZXggcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRFJFR19SRUdJRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKKyNkZWZpbmUgRFJFR19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRFJFR19SR0JLX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgRFJFR19UUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCisjaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQorI2RlZmluZSBEUkVHX1RSQVBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgRFJFR19SRUdJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRFJFR19SR0JLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRFJFR19SR0JLX1JFR0lEX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3N0YKKyNkZWZpbmUgRFJFR19SRUdJRF9SMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRFJFR19SRUdJRF9SMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTEKKyNkZWZpbmUgRFJFR19SRUdJRF9SMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTIKKyNkZWZpbmUgRFJFR19SRUdJRF9SMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTMKKyNkZWZpbmUgRFJFR19SRUdJRF9SNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTQKKyNkZWZpbmUgRFJFR19SRUdJRF9SNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTUKKyNkZWZpbmUgRFJFR19SRUdJRF9SNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTYKKyNkZWZpbmUgRFJFR19SRUdJRF9SNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTcKKyNkZWZpbmUgRFJFR19SRUdJRF9SOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgRFJFR19SRUdJRF9SOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTkKKyNkZWZpbmUgRFJFR19SRUdJRF9SQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUEKKyNkZWZpbmUgRFJFR19SRUdJRF9SQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUIKKyNkZWZpbmUgRFJFR19SRUdJRF9SQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUMKKyNkZWZpbmUgRFJFR19SRUdJRF9SRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUQKKyNkZWZpbmUgRFJFR19SRUdJRF9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUUKKyNkZWZpbmUgRFJFR19SRUdJRF9SRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUYKKyNkZWZpbmUgRFJFR19SRUdJRF9SQV9CVVNfTE9XICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRFJFR19SRUdJRF9SQV9CVVNfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKKyNkZWZpbmUgRFJFR19SRUdJRF9ZQlVTX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTAKKyNkZWZpbmUgRFJFR19SRUdJRF9ZQlVTX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTgKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDEKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDIKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDMKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDQKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDUKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzYgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDYKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzcgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDcKKyNkZWZpbmUgRFJFR19SRUdJRF9JTkRJUkVDVF9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDAxMEUKKyNkZWZpbmUgRFJFR19SRUdJRF9UT1BfT0ZfU1RBQ0sgICAgICAgICAgICAgICAgIDB4MDAwMDAxMEYKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCisjaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfOCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfOSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTggICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTkgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRgorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0EwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0EwX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDEKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0ExX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDIKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0ExX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDMKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0EyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDQKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0EzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDUKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0kwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDYKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0kwX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDcKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0kxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDgKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0kyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDkKKyNkZWZpbmUgRFJFR19SRUdJRF9TQUdVU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMEEKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzAxX0xPVyAgICAgICAgICAgICAgIDB4MDAwMDAyMEIKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzAxX0hJR0ggICAgICAgICAgICAgIDB4MDAwMDAyMEMKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzIzX0xPVyAgICAgICAgICAgICAgIDB4MDAwMDAyMEQKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzIzX0hJR0ggICAgICAgICAgICAgIDB4MDAwMDAyMEUKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0RNQTAxRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMEYKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0RNQTIzRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTAKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTEKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QwX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTIKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QxX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTMKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QxX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTQKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QyX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTUKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QyX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTYKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QzX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTcKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QzX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTgKKyNkZWZpbmUgRFJFR19SRUdJRF9TUkFSX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUEKKyNkZWZpbmUgRFJFR19SRUdJRF9TUkFSX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUIKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUMKKyNkZWZpbmUgRFJFR19SRUdJRF9DVVJSRU5UX0RNQV9TVFJFQU0gICAgICAgICAgIDB4MDAwMDAyMUQKKyNkZWZpbmUgRFJFR19SRUdJRF9ORVhUX0RNQV9TVFJFQU0gICAgICAgICAgICAgIDB4MDAwMDAyMUUKKyNkZWZpbmUgRFJFR19SRUdJRF9DUFVfU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUNfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDEKKyNkZWZpbmUgRFJFR19SRUdJRF9TVEFDS19BTkRfUkVQRUFUICAgICAgICAgICAgIDB4MDAwMDAzMDIKKyNkZWZpbmUgRFJFR19SRUdJRF9JTkRFWDAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDQKKyNkZWZpbmUgRFJFR19SRUdJRF9JTkRFWDEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDUKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMF8zICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNF83ICAgICAgICAgICAgICAgIDB4MDAwMDA0MDQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfOF8xMSAgICAgICAgICAgICAgIDB4MDAwMDA0MDgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMTJfMTUgICAgICAgICAgICAgIDB4MDAwMDA0MEMKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMTZfMTkgICAgICAgICAgICAgIDB4MDAwMDA0MTAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjBfMjMgICAgICAgICAgICAgIDB4MDAwMDA0MTQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjRfMjcgICAgICAgICAgICAgIDB4MDAwMDA0MTgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjhfMzEgICAgICAgICAgICAgIDB4MDAwMDA0MUMKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMzJfMzUgICAgICAgICAgICAgIDB4MDAwMDA0MjAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMzZfMzkgICAgICAgICAgICAgIDB4MDAwMDA0MjQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDBfNDMgICAgICAgICAgICAgIDB4MDAwMDA0MjgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDRfNDcgICAgICAgICAgICAgIDB4MDAwMDA0MkMKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDhfNTEgICAgICAgICAgICAgIDB4MDAwMDA0MzAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNTJfNTUgICAgICAgICAgICAgIDB4MDAwMDA0MzQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNTZfNTkgICAgICAgICAgICAgIDB4MDAwMDA0MzgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjBfNjMgICAgICAgICAgICAgIDB4MDAwMDA0M0MKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjRfNjcgICAgICAgICAgICAgIDB4MDAwMDA0NDAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjhfNzEgICAgICAgICAgICAgIDB4MDAwMDA0NDQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNzJfNzUgICAgICAgICAgICAgIDB4MDAwMDA0NDgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNzZfNzkgICAgICAgICAgICAgIDB4MDAwMDA0NEMKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODBfODMgICAgICAgICAgICAgIDB4MDAwMDA0NTAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODRfODcgICAgICAgICAgICAgIDB4MDAwMDA0NTQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODhfOTEgICAgICAgICAgICAgIDB4MDAwMDA0NTgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfOTJfOTUgICAgICAgICAgICAgIDB4MDAwMDA0NUMKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1NFTEVDVCAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDAKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDAKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzEgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDEKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDIKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzMgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDMKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzQgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDQKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzUgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDUKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzYgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDYKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzcgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDcKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCisjaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfOCAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfOSAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTEgICAgICAgICAgICAgICAgMHgwMDAwMDUxMworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTIgICAgICAgICAgICAgICAgMHgwMDAwMDUxNAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTMgICAgICAgICAgICAgICAgMHgwMDAwMDUxNQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTQgICAgICAgICAgICAgICAgMHgwMDAwMDUxNgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTUgICAgICAgICAgICAgICAgMHgwMDAwMDUxNworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTYgICAgICAgICAgICAgICAgMHgwMDAwMDUxOAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTcgICAgICAgICAgICAgICAgMHgwMDAwMDUxOQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTggICAgICAgICAgICAgICAgMHgwMDAwMDUxQQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTkgICAgICAgICAgICAgICAgMHgwMDAwMDUxQgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjAgICAgICAgICAgICAgICAgMHgwMDAwMDUxQworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjEgICAgICAgICAgICAgICAgMHgwMDAwMDUxRAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjIgICAgICAgICAgICAgICAgMHgwMDAwMDUxRQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjMgICAgICAgICAgICAgICAgMHgwMDAwMDUxRgorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDAKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDEKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDIKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDMKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDQKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDUKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDYKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDcKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MDgKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MDkKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEEKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEIKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEMKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEQKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEUKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEYKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTAKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTEKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTIKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTMKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTQKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTUKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTYKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTcKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfTE9XICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MjAKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfTUlEICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MjgKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MzAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIERNQSBzdHJlYW0gcmVxdWVzdG9yIHdyaXRlCisgKi8KKyNkZWZpbmUgRFNSV1BfRFNSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgRFNSV1BfRFNSX0JHX1JRICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgRFNSV1BfRFNSX1JRX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHRyYXAgd3JpdGUgcG9ydCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBUV1BSX1RXX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBUV1BSX1RXX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc3RhY2sgcG9pbnRlciB3cml0ZQorICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNQV1JfU1RLUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIFNQV1JfU1RLUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTUCBpbnRlcnJ1cHQgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU1BJUl9GUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU1BJUl9ET0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU1BJUl9HUEkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU1BJUl9HUEkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgU1BJUl9JUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgU1BJUl9JUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgU1BJUl9JUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU1BJUl9JUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZ1bmN0aW9uYWwgZ3JvdXAgMSByZWdpc3Rlci4KKyAqLworI2RlZmluZSBGR1IxX0YxU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBGR1IxX0YxU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU1AgY2xvY2sgc3RhdHVzIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNQQ1NfRlJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNQQ1NfRE9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNQQ1NfR1BJMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFNQQ1NfR1BJMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFNQQ1NfSVAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFNQQ1NfSVAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNQQ1NfSVAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFNQQ1NfSVAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFNQQ1NfU1BSVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFNQQ1NfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFNQQ1NfRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFNQQ1NfT1JVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFNQQ1NfSVJRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFNQQ1NfRkdOX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBFMDAwCisjZGVmaW5lIFNQQ1NfRkdOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxMworCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU1AgRE1BIHJlcXVlc3RvciBzdGF0dXMKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTRFNSX0RDU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgorI2RlZmluZSBTRFNSX0RDU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTRFNSX0RDU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZnJhbWUgdGltZXIgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRlJNVF9GVFZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgRlJNVF9GVFZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZyYW1lIHRpbWVyIGN1cnJlbnQgY291bnQKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBGUkNDX0ZDQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBGUkNDX0ZDQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZnJhbWUgdGltZXIgc2F2ZSBjb3VudAorICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEZSU0NfRkNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEZSU0NfRkNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIHZhcmlvdXMgZmxhZ3Mgc3RvcmVkIGluIHRoZSBzY2F0dGVyL2dhdGhlcgorICogIGRlc2NyaXB0b3JzLgorICovCisjZGVmaW5lIERNQV9TR19ORVhUX0VOVFJZX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwRkY4CisjZGVmaW5lIERNQV9TR19TQU1QTEVfRU5EX01BU0sgICAgICAgICAgICAgICAgICAweDBGRkYwMDAwCisjZGVmaW5lIERNQV9TR19TQU1QTEVfRU5EX0ZMQUcgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIERNQV9TR19MT09QX0VORF9GTEFHICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIERNQV9TR19TSUdOQUxfRU5EX0ZMQUcgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIERNQV9TR19TSUdOQUxfUEFHRV9GTEFHICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIERNQV9TR19ORVhUX0VOVFJZX1NISUZUICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIERNQV9TR19TQU1QTEVfRU5EX1NISUZUICAgICAgICAgICAgICAgICAxNgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBvZmZzZXRzIG9mIHRoZSBmaWVsZHMgd2l0aGluIHRoZSBvbi1jaGlwIGdlbmVyaWMKKyAqICBETUEgcmVxdWVzdG9yLgorICovCisjZGVmaW5lIERNQV9SUV9DT05UUk9MMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIERNQV9SUV9DT05UUk9MMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIERNQV9SUV9TT1VSQ0VfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERNQV9SUV9ERVNUSU5BVElPTl9BRERSICAgICAgICAgICAgICAgICAweDAwMDAwMDBDCisjZGVmaW5lIERNQV9SUV9ORVhUX1BBR0VfQUREUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIERNQV9SUV9ORVhUX1BBR0VfU0dERVNDICAgICAgICAgICAgICAgICAweDAwMDAwMDE0CisjZGVmaW5lIERNQV9SUV9MT09QX1NUQVJUX0FERFIgICAgICAgICAgICAgICAgICAweDAwMDAwMDE4CisjZGVmaW5lIERNQV9SUV9QT1NUX0xPT1BfQUREUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFDCisjZGVmaW5lIERNQV9SUV9QQUdFX01BUF9BRERSICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmaXJzdCBjb250cm9sIHdvcmQgb2YgdGhlCisgKiAgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCisgKi8KKyNkZWZpbmUgRE1BX1JRX0MxX0NPVU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzRkYKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RJTkFUSU9OX1NDQVRURVIgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9HQVRIRVIgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RPTkVfRkxBRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX09QVElNSVpFX1NUQVRFICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NBTVBMRV9FTkRfU1RBVEVfTUFTSyAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0ZVTExfUEFHRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0JFRk9SRV9TQU1QTEVfRU5EICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BBR0VfTUFQX0VSUk9SICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0FUX1NBTVBMRV9FTkQgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0xPT1BfRU5EX1NUQVRFX01BU0sgICAgICAgICAgIDB4MDAwQzAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX05PVF9MT09QX0VORCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0JFRk9SRV9MT09QX0VORCAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxXzJQQUdFX0xPT1BfQkVHSU4gICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0xPT1BfQkVHSU4gICAgICAgICAgICAgICAgICAgIDB4MDAwQzAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BBR0VfTUFQX01BU0sgICAgICAgICAgICAgICAgIDB4MDAzMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BNX05PTkVfUEVORElORyAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BNX05FWFRfUEVORElORyAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BNX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BNX0xPT1BfTkVYVF9QRU5ESU5HICAgICAgICAgIDB4MDAzMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1dSSVRFQkFDS19ERVNUX0ZMQUcgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1dSSVRFQkFDS19TUkNfRkxBRyAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfU0laRV9NQVNLICAgICAgICAgICAgICAgIDB4MDcwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTElORUFSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMTYgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMzIgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9ENjQgICAgICAgICAgICAgICAgICAgIDB4MDMwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMTI4ICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMjU2ICAgICAgICAgICAgICAgICAgIDB4MDUwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9ENTEyICAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMTAyNCAgICAgICAgICAgICAgICAgIDB4MDcwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfT05fSE9TVCAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9TSVpFX01BU0sgICAgICAgICAgICAgIDB4NzAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9MSU5FQVIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QxNiAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QzMiAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0Q2NCAgICAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QxMjggICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QyNTYgICAgICAgICAgICAgICAgIDB4NTAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0Q1MTIgICAgICAgICAgICAgICAgIDB4NjAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QxMDI0ICAgICAgICAgICAgICAgIDB4NzAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9PTl9IT1NUICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0NPVU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlY29uZCBjb250cm9sIHdvcmQgb2YgdGhlCisgKiAgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCisgKi8KKyNkZWZpbmUgRE1BX1JRX0MyX1ZJUlRVQUxfQ0hBTk5FTF9NQVNLICAgICAgICAgIDB4MDAwMDAwM0YKKyNkZWZpbmUgRE1BX1JRX0MyX1ZJUlRVQUxfU0lHTkFMX01BU0sgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgRE1BX1JRX0MyX05PX1ZJUlRVQUxfU0lHTkFMICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9FVkVSWV9ETUEgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9TT1VSQ0VfUElOR1BPTkcgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9ERVNUX1BJTkdQT05HICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FVRElPX0NPTlZFUlRfTUFTSyAgICAgICAgICAgIDB4MDAwMEYwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FDX05PTkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FDXzhfVE9fMTZfQklUICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FDX01PTk9fVE9fU1RFUkVPICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FDX0VORElBTl9DT05WRVJUICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FDX1NJR05FRF9DT05WRVJUICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0xPT1BfRU5EX01BU0sgICAgICAgICAgICAgICAgIDB4MEZGRjAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0xPT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX05PX0xPT1AgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX09ORV9QQUdFX0xPT1AgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1RXT19QQUdFX0xPT1AgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX01VTFRJX1BBR0VfTE9PUCAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9MT09QX0JBQ0sgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9QT1NUX0JFR0lOX1BBR0UgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1ZJUlRVQUxfQ0hBTk5FTF9TSElGVCAgICAgICAgIDAKKyNkZWZpbmUgRE1BX1JRX0MyX0xPT1BfRU5EX1NISUZUICAgICAgICAgICAgICAgIDE2CisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHdvcmRzCisgKiAgb2YgdGhlIG9uLWNoaXAgZ2VuZXJpYyBETUEgcmVxdWVzdG9yLgorICovCisjZGVmaW5lIERNQV9SUV9TRF9BRERSRVNTX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIERNQV9SUV9TRF9NRU1PUllfSURfTUFTSyAgICAgICAgICAgICAgICAweDAwMEYwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9TUF9QQVJBTV9BRERSICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9TUF9TQU1QTEVfQUREUiAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9TUF9QUk9HUkFNX0FERFIgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9TUF9ERUJVR19BRERSICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9PTU5JTUVNX0FERFIgICAgICAgICAgICAgICAgICAweDAwMEUwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9FTkRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9FUlJPUl9GTEFHICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9BRERSRVNTX1NISUZUICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBwYWdlIG1hcCBhZGRyZXNzIHdvcmQgb2YgdGhlCisgKiAgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCisgKi8KKyNkZWZpbmUgRE1BX1JRX1BNQV9MT09QX1RISVJEX1BBR0VfRU5UUllfTUFTSyAgIDB4MDAwMDBGRjgKKyNkZWZpbmUgRE1BX1JRX1BNQV9QQUdFX1RBQkxFX01BU0sgICAgICAgICAgICAgIDB4RkZGRkYwMDAKKyNkZWZpbmUgRE1BX1JRX1BNQV9MT09QX1RISVJEX1BBR0VfRU5UUllfU0hJRlQgIDMKKyNkZWZpbmUgRE1BX1JRX1BNQV9QQUdFX1RBQkxFX1NISUZUICAgICAgICAgICAgIDEyCisKKyNkZWZpbmUgQkExX1ZBUklERUNfQlVGXzEgICAgICAgMHgwMDAKKworI2RlZmluZSBCQTFfUERUQyAgICAgICAgICAgICAgICAweDBjMCAgICAvKiBCQTFfUExBWV9ETUFfVFJBTlNBQ1RJT05fQ09VTlRfUkVHICovCisjZGVmaW5lIEJBMV9QRklFICAgICAgICAgICAgICAgIDB4MGM0ICAgIC8qIEJBMV9QTEFZX0ZPUk1BVF8mX0lOVEVSUlVQVF9FTkFCTEVfUkVHICovCisjZGVmaW5lIEJBMV9QQkEgICAgICAgICAgICAgICAgIDB4MGM4ICAgIC8qIEJBMV9QTEFZX0JVRkZFUl9BRERSRVNTICovCisjZGVmaW5lIEJBMV9QVk9MICAgICAgICAgICAgICAgIDB4MGY4ICAgIC8qIEJBMV9QTEFZX1ZPTFVNRV9SRUcgKi8KKyNkZWZpbmUgQkExX1BTUkMgICAgICAgICAgICAgICAgMHgyODggICAgLyogQkExX1BMQVlfU0FNUExFX1JBVEVfQ09SUkVDVElPTl9SRUcgKi8KKyNkZWZpbmUgQkExX1BDVEwgICAgICAgICAgICAgICAgMHgyYTQgICAgLyogQkExX1BMQVlfQ09OVFJPTF9SRUcgKi8KKyNkZWZpbmUgQkExX1BQSSAgICAgICAgICAgICAgICAgMHgyYjQgICAgLyogQkExX1BMQVlfUEhBU0VfSU5DUkVNRU5UX1JFRyAqLworCisjZGVmaW5lIEJBMV9DQ1RMICAgICAgICAgICAgICAgIDB4MDY0ICAgIC8qIEJBMV9DQVBUVVJFX0NPTlRST0xfUkVHICovCisjZGVmaW5lIEJBMV9DSUUgICAgICAgICAgICAgICAgIDB4MTA0ICAgIC8qIEJBMV9DQVBUVVJFX0lOVEVSUlVQVF9FTkFCTEVfUkVHICovCisjZGVmaW5lIEJBMV9DQkEgICAgICAgICAgICAgICAgIDB4MTBjICAgIC8qIEJBMV9DQVBUVVJFX0JVRkZFUl9BRERSRVNTICovCisjZGVmaW5lIEJBMV9DU1JDICAgICAgICAgICAgICAgIDB4MmM4ICAgIC8qIEJBMV9DQVBUVVJFX1NBTVBMRV9SQVRFX0NPUlJFQ1RJT05fUkVHICovCisjZGVmaW5lIEJBMV9DQ0kgICAgICAgICAgICAgICAgIDB4MmQ4ICAgIC8qIEJBMV9DQVBUVVJFX0NPRUZGSUNJRU5UX0lOQ1JFTUVOVF9SRUcgKi8KKyNkZWZpbmUgQkExX0NEICAgICAgICAgICAgICAgICAgMHgyZTAgICAgLyogQkExX0NBUFRVUkVfREVMQVlfUkVHICovCisjZGVmaW5lIEJBMV9DUEkgICAgICAgICAgICAgICAgIDB4MmY0ICAgIC8qIEJBMV9DQVBUVVJFX1BIQVNFX0lOQ1JFTUVOVF9SRUcgKi8KKyNkZWZpbmUgQkExX0NWT0wgICAgICAgICAgICAgICAgMHgyZjggICAgLyogQkExX0NBUFRVUkVfVk9MVU1FX1JFRyAqLworCisjZGVmaW5lIEJBMV9DRkcxICAgICAgICAgICAgICAgIDB4MTM0ICAgIC8qIEJBMV9DQVBUVVJFX0ZSQU1FX0dST1VQXzFfUkVHICovCisjZGVmaW5lIEJBMV9DRkcyICAgICAgICAgICAgICAgIDB4MTM4ICAgIC8qIEJBMV9DQVBUVVJFX0ZSQU1FX0dST1VQXzJfUkVHICovCisjZGVmaW5lIEJBMV9DQ1NUICAgICAgICAgICAgICAgIDB4MTNjICAgIC8qIEJBMV9DQVBUVVJFX0NPTlNUQU5UX1JFRyAqLworI2RlZmluZSBCQTFfQ1NQQiAgICAgICAgICAgICAgICAweDM0MCAgICAvKiBCQTFfQ0FQVFVSRV9TUEJfQUREUkVTUyAqLworCisvKgorICoKKyAqLworCisjZGVmaW5lIENTNDYxWF9NT0RFX09VVFBVVAkoMTw8MCkJIC8qIE1JREkgVUFSVCAtIG91dHB1dCAqLyAKKyNkZWZpbmUgQ1M0NjFYX01PREVfSU5QVVQJKDE8PDEpCSAvKiBNSURJIFVBUlQgLSBpbnB1dCAqLworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgQUM5NyBzaGFkb3cgcmVnaXN0ZXJzLCB3aGljaCBhcHBlYXIKKy8vIGFzIGEgdmlydHVhbCBleHRlbnNpb24gdG8gdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciB6ZXJvIG1lbW9yeSByYW5nZS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQUM5N19SRUdfT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0VMCisjZGVmaW5lIEFDOTdfQ09ERUNfTlVNQkVSX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAzMDAwTAorCisjZGVmaW5lIEJBMF9BQzk3X1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwTAorI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVk9MVU1FICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMkwKKyNkZWZpbmUgQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSAgICAgICAgICAgICAgIDB4MDAwMDEwMDRMCisjZGVmaW5lIEJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyAgICAgICAgICAgICAweDAwMDAxMDA2TAorI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVE9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwOEwKKyNkZWZpbmUgQkEwX0FDOTdfUENfQkVFUF9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMEFMCisjZGVmaW5lIEJBMF9BQzk3X1BIT05FX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAweDAwMDAxMDBDTAorI2RlZmluZSBCQTBfQUM5N19NSUNfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwRUwKKyNkZWZpbmUgQkEwX0FDOTdfTElORV9JTl9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTBMCisjZGVmaW5lIEJBMF9BQzk3X0NEX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDEyTAorI2RlZmluZSBCQTBfQUM5N19WSURFT19WT0xVTUUgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxNEwKKyNkZWZpbmUgQkEwX0FDOTdfQVVYX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTZMCisjZGVmaW5lIEJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FICAgICAgICAgICAgICAgICAweDAwMDAxMDE4TAorI2RlZmluZSBCQTBfQUM5N19SRUNPUkRfU0VMRUNUICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxQUwKKyNkZWZpbmUgQkEwX0FDOTdfUkVDT1JEX0dBSU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMUNMCisjZGVmaW5lIEJBMF9BQzk3X1JFQ09SRF9HQUlOX01JQyAgICAgICAgICAgICAgICAweDAwMDAxMDFFTAorI2RlZmluZSBCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UgICAgICAgICAgICAgICAgMHgwMDAwMTAyMEwKKyNkZWZpbmUgQkEwX0FDOTdfM0RfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjJMCisjZGVmaW5lIEJBMF9BQzk3X01PREVNX1JBVEUgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDI0TAorI2RlZmluZSBCQTBfQUM5N19QT1dFUkRPV04gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAyNkwKKyNkZWZpbmUgQkEwX0FDOTdfRVhUX0FVRElPX0lEICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjhMCisjZGVmaW5lIEJBMF9BQzk3X0VYVF9BVURJT19QT1dFUiAgICAgICAgICAgICAgICAweDAwMDAxMDJBTAorI2RlZmluZSBCQTBfQUM5N19QQ01fRlJPTlRfREFDX1JBVEUgICAgICAgICAgICAgMHgwMDAwMTAyQ0wKKyNkZWZpbmUgQkEwX0FDOTdfUENNX1NVUlJfREFDX1JBVEUgICAgICAgICAgICAgIDB4MDAwMDEwMkVMCisjZGVmaW5lIEJBMF9BQzk3X1BDTV9MRkVfREFDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDMwTAorI2RlZmluZSBCQTBfQUM5N19QQ01fTFJfQURDX1JBVEUgICAgICAgICAgICAgICAgMHgwMDAwMTAzMkwKKyNkZWZpbmUgQkEwX0FDOTdfTUlDX0FEQ19SQVRFICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMzRMCisjZGVmaW5lIEJBMF9BQzk3XzZDSF9WT0xfQ19MRkUgICAgICAgICAgICAgICAgICAweDAwMDAxMDM2TAorI2RlZmluZSBCQTBfQUM5N182Q0hfVk9MX1NVUlJPVU5EICAgICAgICAgICAgICAgMHgwMDAwMTAzOEwKKyNkZWZpbmUgQkEwX0FDOTdfUkVTRVJWRURfM0EgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwM0FMCisjZGVmaW5lIEJBMF9BQzk3X0VYVF9NT0RFTV9JRCAgICAgICAgICAgICAgICAgICAweDAwMDAxMDNDTAorI2RlZmluZSBCQTBfQUM5N19FWFRfTU9ERU1fUE9XRVIgICAgICAgICAgICAgICAgMHgwMDAwMTAzRUwKKyNkZWZpbmUgQkEwX0FDOTdfTElORTFfQ09ERUNfUkFURSAgICAgICAgICAgICAgIDB4MDAwMDEwNDBMCisjZGVmaW5lIEJBMF9BQzk3X0xJTkUyX0NPREVDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDQyTAorI2RlZmluZSBCQTBfQUM5N19IQU5EU0VUX0NPREVDX1JBVEUgICAgICAgICAgICAgMHgwMDAwMTA0NEwKKyNkZWZpbmUgQkEwX0FDOTdfTElORTFfQ09ERUNfTEVWRUwgICAgICAgICAgICAgIDB4MDAwMDEwNDZMCisjZGVmaW5lIEJBMF9BQzk3X0xJTkUyX0NPREVDX0xFVkVMICAgICAgICAgICAgICAweDAwMDAxMDQ4TAorI2RlZmluZSBCQTBfQUM5N19IQU5EU0VUX0NPREVDX0xFVkVMICAgICAgICAgICAgMHgwMDAwMTA0QUwKKyNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fQ09ORklHICAgICAgICAgICAgICAgIDB4MDAwMDEwNENMCisjZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1RZUEUgICAgICAgICAgICAgICAgICAweDAwMDAxMDRFTAorI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9TVElDS1kgICAgICAgICAgICAgICAgMHgwMDAwMTA1MEwKKyNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fV0FLRVVQICAgICAgICAgICAgICAgIDB4MDAwMDEwNTJMCisjZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1NUQVRVUyAgICAgICAgICAgICAgICAweDAwMDAxMDU0TAorI2RlZmluZSBCQTBfQUM5N19NSVNDX01PREVNX0FGRV9TVEFUICAgICAgICAgICAgMHgwMDAwMTA1NkwKKyNkZWZpbmUgQkEwX0FDOTdfUkVTRVJWRURfNTggICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNThMCisjZGVmaW5lIEJBMF9BQzk3X0NSWVNUQUxfUkVWX05fRkFCX0lEICAgICAgICAgICAweDAwMDAxMDVBTAorI2RlZmluZSBCQTBfQUM5N19URVNUX0FORF9NSVNDX0NUUkwgICAgICAgICAgICAgMHgwMDAwMTA1Q0wKKyNkZWZpbmUgQkEwX0FDOTdfQUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNUVMCisjZGVmaW5lIEJBMF9BQzk3X01JU0NfQ1JZU1RBTF9DT05UUk9MICAgICAgICAgICAweDAwMDAxMDYwTAorI2RlZmluZSBCQTBfQUM5N19MSU5FMV9IWVBSSURfQ1RSTCAgICAgICAgICAgICAgMHgwMDAwMTA2MkwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzY0ICAgICAgICAgICAgIDB4MDAwMDEwNjRMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82NiAgICAgICAgICAgICAweDAwMDAxMDY2TAorI2RlZmluZSBCQTBfQUM5N19TUERJRl9DT05UUk9MICAgICAgICAgICAgICAgICAgMHgwMDAwMTA2OEwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzZBICAgICAgICAgICAgIDB4MDAwMDEwNkFMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82QyAgICAgICAgICAgICAweDAwMDAxMDZDTAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNkUgICAgICAgICAgICAgMHgwMDAwMTA2RUwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzcwICAgICAgICAgICAgIDB4MDAwMDEwNzBMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF83MiAgICAgICAgICAgICAweDAwMDAxMDcyTAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNzQgICAgICAgICAgICAgMHgwMDAwMTA3NEwKKyNkZWZpbmUgQkEwX0FDOTdfQ0FMX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNzZMCisjZGVmaW5lIEJBMF9BQzk3X0NBTF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDc4TAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfN0EgICAgICAgICAgICAgMHgwMDAwMTA3QUwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX0lEMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwN0NMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9JRDIgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDdFTAorI2VuZGlmCQkJCS8qIF9fQ1M0NjFYX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2MXhfaW1hZ2UuaCBiL3NvdW5kL29zcy9jczQ2MXhfaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWM1YTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDYxeF9pbWFnZS5oCkBAIC0wLDAgKzEsMzIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIkNXQ0lNQUdFLkgiLS0gRm9yIENTNDZYWC4gVmVyIDEuMDQKKyAqICAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSAoYykgQ2lycnVzIExvZ2ljIENvcnAuCisgKiAgICAgIFZlcnNpb24gMS4wNAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2lmbmRlZiBfX0NTX0lNQUdFX0gKKyNkZWZpbmUgX19DU19JTUFHRV9ICisKKyNkZWZpbmUgQ0xFQVJfX0NPVU5UICAgICAzCisjZGVmaW5lIEZJTExfX0NPVU5UICAgICAgNAorI2RlZmluZSBCQTFfX0RXT1JEX1NJWkUgIDEzKjEwMjQrNTEyCisKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgICAgICAgdW5zaWduZWQgQkExX19EZXN0Qnl0ZU9mZnNldDsKKyAgICAgICAgdW5zaWduZWQgQkExX19Tb3VyY2VTaXplOworfSBDbHJTdGF0W0NMRUFSX19DT1VOVF0gPXsgezB4MDAwMDAwMDAsIDB4MDAwMDMwMDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMDEwMDAwLCAweDAwMDAzODAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAyMDAwMCwgMHgwMDAwNzAwMCB9IH07CisKK3N0YXRpYyB1MzIgRmlsbEFycmF5MVtdPXsKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAxNjMsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDIwMDA0MCwweDAwMDA4MDEwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4ODAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDYwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDA5MDAwODAsMHgwMDAwMDE3MywweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDEwLDB4MDA4MDAwMDAsMHgwMDkwMDAwMCwKKzB4ZjJjMDAwMGYsMHgwMDAwMDIwMCwweDAwMDAwMDAwLDB4MDAwMTA2MDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAxNjMsMHgzMzAzMDBjMiwKKzB4MDYwMDAwMDAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLDB4ODAwMDgwMDAsCisweDNmYzAwMDBmLDB4MDAwMDAzMDEsMHgwMDAxMDQwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMGIwMDAwMCwweDAwZDA4MDZkLDB4MzMwNDgwYzMsCisweDA0ODAwMDAwLDB4MDAwMDAwMDEsMHgwMDgwMDAwMSwweDAwMDBmZmZmLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDA2NmEwNjAwLDB4MDYzNTAwNzAsMHgwMDAwOTI5ZCwweDkyOWQ5MjlkLAorMHgwMDAwMDAwMCwweDAwMDA3MzVhLDB4MDAwMDA2MDAsMHgwMDAwMDAwMCwKKzB4OTI5ZDczNWEsMHgwMDAwMDAwMCwweDAwMDEwMDAwLDB4NzM1YTczNWEsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwODA0ZiwweDAwMDAwMGMzLAorMHgwNTAwMDAwMCwweDAwYTAwMDEwLDB4MDAwMDAwMDAsMHg4MDAwODAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwNzAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDA4MCwweDAwYTAwMDAwLDB4MDAwMDgwOWEsMHgwMDAwMDBjMiwKKzB4MDc0MDAwMDAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLDB4ZmZmZmZmZmYsCisweDAwYzgwMDI4LDB4MDAwMDU1NTUsMHgwMDAwMDAwMCwweDAwMDEwN2EwLAorMHgwMGM4MDAyOCwweDAwMDAwMGMyLDB4MDY4MDAwMDAsMHgwMDAwMDAwMCwKKzB4MDZlMDAwODAsMHgwMDMwMDAwMCwweDAwMDA4MGJiLDB4MDAwMDAwYzksCisweDA3YTAwMDAwLDB4MDQwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAorMHgwMGM4MDAyOCwweDAwMDA1NTU1LDB4MDAwMDAwMDAsMHgwMDAwMDc4MCwKKzB4MDBjODAwMjgsMHgwMDAwMDBjNSwweGZmODAwMDAwLDB4MDAwMDAwMDAsCisweDAwNjQwMDgwLDB4MDBjMDAwMDAsMHgwMDAwODE5NywweDAwMDAwMGM5LAorMHgwNzgwMDAwMCwweDA0MDAwMDAwLDB4ODAwMDgwMDAsMHhmZmZmZmZmZiwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDgwNWUsMHgwMDAwMDBjMSwKKzB4MDAwMDAwMDAsMHgwMDgwMDAwMCwweDgwMDA4MDAwLDB4ODAwMDgwMDAsCisweDAwMDIwMDAwLDB4MDAwMGZmZmYsMHgwMDAwMDAwMCwweDAwMDAwMDAwfTsKKworc3RhdGljIHUzMiBGaWxsQXJyYXkyW109eworMHg5MjlkMDYwMCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkMDAwMCwKKzB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCisweDkyOWQ5MjlkLDB4MDAxMDA2MzUsMHgwNjBiMDEzZiwweDAwMDAwMDA0LAorMHgwMDAwMDAwMSwweDAwN2EwMDAyLDB4MDAwMDAwMDAsMHgwNjZlMDYxMCwKKzB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCisweDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHg3MzVhMDA1MSwKKzB4MDAwMDAwMDAsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCisweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4MDAwMDAwMDAsMHgwNjQwMDEzNiwKKzB4MDAwMDI3MGYsMHgwMDAxMDAwMCwweDAwN2EwMDAwLDB4MDAwMDAwMDAsCisweDA2OGUwNjQ1LDB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweDczNWEwMTAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfTsKKworc3RhdGljIHUzMiBGaWxsQXJyYXkzW109eworMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMDAwNH07CisKK3N0YXRpYyB1MzIgRmlsbEFycmF5NFtdPXsKKzB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCisweDAwMDAxNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAorMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKzB4MDAwMDk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCisweDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAorMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKzB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCisweDAwMDE5NzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAorMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKzB4MDAwMjE3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCisweDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAorMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKzB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCisweDAwMDMxNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAorMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKzB4MDAwMzk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCisweDAwMGZlMTllLDB4MDAwMDEwMDMsMHgwMDA5YzczMCwweDAwMDAxMDAzLAorMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKKzB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCisweDAwMDA5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAorMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKzB4MDAwMTE3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCisweDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAorMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKzB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCisweDAwMDIxNzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAorMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKzB4MDAwMjk3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCisweDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAorMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKzB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCisweDAwMDM5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAorMHgwMDAwYTczMCwweDAwMDAxMDA4LDB4MDAwZTI3MzAsMHgwMDAwMTAwMiwKKzB4MDAwMGE3MzEsMHgwMDAwMTAwMiwweDAwMDBhNzMxLDB4MDAwMDEwMDIsCisweDAwMDBhNzMxLDB4MDAwMDEwMDIsMHgwMDAwYTczMSwweDAwMDAxMDAyLAorMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGY2MTljLDB4MDAwMDEwMDMsCisweDAwMDdmODAxLDB4MDAwYzAwMDAsMHgwMDAwMDAzNywweDAwMDAxMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMzczYywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwZWUxOWMsMHgwMDAwMTAwMywweDAwMDdmODAxLDB4MDAwYzAwMDAsCisweDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAyNzNjLDB4MDAwMDEwMDAsCisweDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDBlNjc5ZSwweDAwMDAxMDAzLAorMHgwMDAwNzcwNSwweDAwMDAxNDAwLDB4MDAwYWM3MWUsMHgwMDAwMTAwMywKKzB4MDAwODdmYzEsMHgwMDBjM2JlMCwweDAwMDdmODAxLDB4MDAwYzAwMDAsCisweDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNzMwLDB4MDAwMDEwMDMsCisweDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDA3ZjgwMSwweDAwMGMwMDAwLAorMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGMwMDAwLAorMHgwMDAwMDAzMiwweDAwMDAxMDAwLDB4MDAwMDI3M2QsMHgwMDAwMTAwMCwKKzB4MDAwNGE3MzAsMHgwMDAwMTAwMywweDAwMDAwZjQxLDB4MDAwOTcxNDAsCisweDAwMDBhODQxLDB4MDAwOWIyNDAsMHgwMDAwYTBjMSwweDAwMDlmMDQwLAorMHgwMDAxYzY0MSwweDAwMDkzNTQwLDB4MDAwMWNlYzEsMHgwMDA5YjVjMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDFiZjA1LDB4MDAwM2ZjNDAsCisweDAwMDAyNzI1LDB4MDAwYWE0MDAsMHgwMDAxMzcwNSwweDAwMDkzYTAwLAorMHgwMDAwMDAyZSwweDAwMDlkNmMwLDB4MDAwMzg2MzAsMHgwMDAwMTAwNCwKKzB4MDAwNGVmMGEsMHgwMDBlYjc4NSwweDAwMDNmYzhhLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwYzcwZTAsMHgwMDA3ZDE4MiwweDAwMDJjNjQwLAorMHgwMDAwMDYzMCwweDAwMDAxMDA0LDB4MDAwNzk5YjgsMHgwMDAyYzZjMCwKKzB4MDAwMzE3MDUsMHgwMDA5MjI0MCwweDAwMDM5ZjA1LDB4MDAwOTMyYzAsCisweDAwMDM1MjBhLDB4MDAwMDAwMDAsMHgwMDA0MDczMSwweDAwMDAxMDBiLAorMHgwMDAxMDcwNSwweDAwMGIyMGMwLDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKKzB4MDAwMzIxMDgsMHgwMDBjNjBjNCwweDAwMDY1MjA4LDB4MDAwYzI5MTcsCisweDAwMDQwNmIwLDB4MDAwMDEwMDcsMHgwMDAxMmYwNSwweDAwMDM2ODgwLAorMHgwMDAyODE4ZSwweDAwMGMwMDAwLDB4MDAwNDQxMGEsMHgwMDAwMDAwMCwKKzB4MDAwNDA2MzAsMHgwMDAwMTAwNywweDAwMDI5NzA1LDB4MDAwYzAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwM2ZjMSwweDAwMDNmYzQwLAorMHgwMDAwMzdjMSwweDAwMDkxYjQwLDB4MDAwMDNmYzEsMHgwMDA5MTFjMCwKKzB4MDAwMDM3YzEsMHgwMDA5NTdjMCwweDAwMDAzZmMxLDB4MDAwOTUxYzAsCisweDAwMDAzN2MxLDB4MDAwMDAwMDAsMHgwMDAwM2ZjMSwweDAwMDk5MWMwLAorMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDA5ZDFjMCwKKzB4MDAwMDM3YzEsMHgwMDAwMDAwMCwweDAwMDFjY2MxLDB4MDAwOTE1YzAsCisweDAwMDFjNDQxLDB4MDAwOWQ4MDAsMHgwMDA5Y2RjMSwweDAwMDkxMjQwLAorMHgwMDAxYzU0MSwweDAwMDkxZDAwLDB4MDAwOWNmYzEsMHgwMDA5NTI0MCwKKzB4MDAwMWM3NDEsMHgwMDA5NWM4MCwweDAwMGU4Y2E5LDB4MDAwOTkyNDAsCisweDAwMGU4NWFkLDB4MDAwOTU2NDAsMHgwMDA2OWNhOSwweDAwMDk5ZDgwLAorMHgwMDBlOTUyZCwweDAwMDk5NjQwLDB4MDAwZWFjYTksMHgwMDA5ZDZjMCwKKzB4MDAwZWE1YWQsMHgwMDA5MWE0MCwweDAwMDZiY2E5LDB4MDAwOWRlODAsCisweDAwMGViNTJkLDB4MDAwOTVhNDAsMHgwMDBlY2NhOSwweDAwMDk5YWMwLAorMHgwMDBlYzVhZCwweDAwMDlkYTQwLDB4MDAwZWRjYTksMHgwMDA5ZDMwMCwKKzB4MDAwYTZlMGEsMHgwMDAwMTAwMCwweDAwMGVkNTJkLDB4MDAwOTFlNDAsCisweDAwMGVlY2E5LDB4MDAwOTVlYzAsMHgwMDBlZTVhZCwweDAwMDk5ZTQwLAorMHgwMDA2ZmNhOSwweDAwMDAyNTAwLDB4MDAwZmIyMDgsMHgwMDBjNTlhMCwKKzB4MDAwZWY1MmQsMHgwMDA5ZGU0MCwweDAwMDY4Y2E5LDB4MDAwOTEyYzEsCisweDAwMDY4M2FkLDB4MDAwOTUyNDEsMHgwMDAyMGYwNSwweDAwMDk5MWMxLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwODZmODgsMHgwMDAwMTAwMCwKKzB4MDAwOWNmODEsMHgwMDBiNTM0MCwweDAwMDljNzAxLDB4MDAwYjkyYzAsCisweDAwMDlkZTgxLDB4MDAwYmQzMDAsMHgwMDA5ZDYwMSwweDAwMGIxNzAwLAorMHgwMDAxZmQ4MSwweDAwMGI5ZDgwLDB4MDAwOWY1MDEsMHgwMDBiNTdjMCwKKzB4MDAwYTBmODEsMHgwMDBiZDc0MCwweDAwMDIwNzAxLDB4MDAwYjVjODAsCisweDAwMGExNjgxLDB4MDAwYjk3YzAsMHgwMDAyMTYwMSwweDAwMDAyNTAwLAorMHgwMDBhMDcwMSwweDAwMGI5YjQwLDB4MDAwYTBmODEsMHgwMDBiMWJjMCwKKzB4MDAwMjE2ODEsMHgwMDAwMmQwMCwweDAwMDIwZjgxLDB4MDAwYmQ4MDAsCisweDAwMGEwNzAxLDB4MDAwYjViYzAsMHgwMDAyMTYwMSwweDAwMDAzNTAwLAorMHgwMDBhMGY4MSwweDAwMGI1ZjQwLDB4MDAwYTA3MDEsMHgwMDBiZGJjMCwKKzB4MDAwMjE2ODEsMHgwMDAwM2QwMCwweDAwMDIwZjgxLDB4MDAwYjFkMDAsCisweDAwMGEwNzAxLDB4MDAwYjFmYzAsMHgwMDAyMTYwMSwweDAwMDIwNTAwLAorMHgwMDAyMGY4MSwweDAwMGIxMzQxLDB4MDAwYTA3MDEsMHgwMDBiOWZjMCwKKzB4MDAwMjE2ODEsMHgwMDAyMGQwMCwweDAwMDIwZjgxLDB4MDAwYmRlODAsCisweDAwMGEwNzAxLDB4MDAwYmRmYzAsMHgwMDAyMTYwMSwweDAwMDIxNTAwLAorMHgwMDAyMGY4MSwweDAwMGI5MzQxLDB4MDAwMjA3MDEsMHgwMDBiNTNjMSwKKzB4MDAwMjE2ODEsMHgwMDAyMWQwMCwweDAwMGEwZjgxLDB4MDAwZDAzODAsCisweDAwMDBiNjAxLDB4MDAwYjE1YzAsMHgwMDAwN2IwMSwweDAwMDAwMDAwLAorMHgwMDAwN2I4MSwweDAwMGJkMWMwLDB4MDAwMDdiMDEsMHgwMDAwMDAwMCwKKzB4MDAwMDdiODEsMHgwMDBiOTFjMCwweDAwMDA3YjAxLDB4MDAwYjU3YzAsCisweDAwMDA3YjgxLDB4MDAwYjUxYzAsMHgwMDAwN2IwMSwweDAwMGIxYjQwLAorMHgwMDAwN2I4MSwweDAwMGIxMWMwLDB4MDAwODdiMDEsMHgwMDBjM2RjMCwKKzB4MDAwN2U0ODgsMHgwMDBkN2U0NSwweDAwMDAwMDAwLDB4MDAwZDdhNDQsCisweDAwMDdlNDhhLDB4MDAwMDAwMDAsMHgwMDAxMWYwNSwweDAwMDg0MDgwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDE3MDUsMHgwMDBiMzU0MCwKKzB4MDAwMDhhMDEsMHgwMDBiZjA0MCwweDAwMDA3MDgxLDB4MDAwYmI1YzAsCisweDAwMDU1NDg4LDB4MDAwMDAwMDAsMHgwMDAwZDQ4MiwweDAwMDNmYzQwLAorMHgwMDAzZmM4OCwweDAwMDAwMDAwLDB4MDAwMWU0MDEsMHgwMDBiM2EwMCwKKzB4MDAwMWVjODEsMHgwMDBiZDZjMCwweDAwMDRlZjA4LDB4MDAwZWI3ODQsCisweDAwMGM4NmIwLDB4MDAwMDEwMDcsMHgwMDAwODI4MSwweDAwMGJiMjQwLAorMHgwMDAwYjgwMSwweDAwMGI3MTQwLDB4MDAwMDc4ODgsMHgwMDAwMDAwMCwKKzB4MDAwMDA3M2MsMHgwMDAwMTAwMCwweDAwMDdmMTg4LDB4MDAwYzAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDA1NTI4OCwweDAwMGM1NTVjLAorMHgwMDA1NTI4YSwweDAwMGMwMDAwLDB4MDAwOWZhODgsMHgwMDBjNWQwMCwKKzB4MDAwMGZhODgsMHgwMDAwMDAwMCwweDAwMDAwMDMyLDB4MDAwMDEwMDAsCisweDAwMDAwNzNkLDB4MDAwMDEwMDAsMHgwMDA3ZjE4OCwweDAwMGMwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwOGMwMWMsMHgwMDAwMTAwMywKKzB4MDAwMDI3MDUsMHgwMDAwMTAwOCwweDAwMDhiMjAxLDB4MDAwYzEzOTIsCisweDAwMDBiYTAxLDB4MDAwMDAwMDAsMHgwMDAwODczMSwweDAwMDAxNDAwLAorMHgwMDA0YzEwOCwweDAwMGZlMGM0LDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwKKzB4MDAwYTYzODgsMHgwMDAwMTAwMSwweDAwMDhiMzM0LDB4MDAwYmMxNDEsCisweDAwMDMwMjBlLDB4MDAwMDAwMDAsMHgwMDA4ODZiMCwweDAwMDAxMDA4LAorMHgwMDAwMzYyNSwweDAwMGM1ZGZhLDB4MDAwYTYzOGEsMHgwMDAwMTAwMSwKKzB4MDAwODAyMGUsMHgwMDAwMTAwMiwweDAwMDhhNmIwLDB4MDAwMDEwMDgsCisweDAwMDdmMzAxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMjcyNSwweDAwMGE4YzQwLDB4MDAwMDAwYWUsMHgwMDAwMDAwMCwKKzB4MDAwZDg2MzAsMHgwMDAwMTAwOCwweDAwMDAwMDAwLDB4MDAwYzc0ZTAsCisweDAwMDdkMTgyLDB4MDAwMmQ2NDAsMHgwMDBhODYzMCwweDAwMDAxMDA4LAorMHgwMDA3OTliOCwweDAwMDJkNmMwLDB4MDAwMDc0OGEsMHgwMDBjM2VjNSwKKzB4MDAwNzQyMGEsMHgwMDBjMDAwMCwweDAwMDYyMjA4LDB4MDAwYzQxMTcsCisweDAwMDcwNjMwLDB4MDAwMDEwMDksMHgwMDAwMDAwMCwweDAwMGMwMDAwLAorMHgwMDAxMDIyZSwweDAwMDAwMDAwLDB4MDAwM2E2MzAsMHgwMDAwMTAwOSwKKzB4MDAwMDAwMDAsMHgwMDBjMDAwMCwweDAwMDAwMDM2LDB4MDAwMDEwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMmE3MzAsMHgwMDAwMTAwOCwweDAwMDdmODAxLDB4MDAwYzAwMDAsCisweDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDJhNzMwLDB4MDAwMDEwMDgsCisweDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDAyYTcwNSwweDAwMDAxMDA4LAorMHgwMDAwN2EwMSwweDAwMGMwMDAwLDB4MDAwZTYyODgsMHgwMDBkNTUwYSwKKzB4MDAwNjQyOGEsMHgwMDAwMDAwMCwweDAwMDYwNzMwLDB4MDAwMDEwMGEsCisweDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDA3YWFiMCwweDAwMDM0ODgwLDB4MDAwNzhmYjAsMHgwMDAwMTAwYiwKKzB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDMzYjk0LDB4MDAwODExNDAsCisweDAwMDE4M2FlLDB4MDAwMDAwMDAsMHgwMDA3ODZiMCwweDAwMDAxMDBiLAorMHgwMDAyMmYwNSwweDAwMGMzNTQ1LDB4MDAwMGViOGEsMHgwMDAwMDAwMCwKKzB4MDAwNDI3MzEsMHgwMDAwMTAwMywweDAwMDdhYWIwLDB4MDAwMzQ4ODAsCisweDAwMDQ4ZmIwLDB4MDAwMDEwMGEsMHgwMDA1NzQ4OCwweDAwMDAwMDAwLAorMHgwMDAzM2I5NCwweDAwMDgxMTQwLDB4MDAwMTgzYWUsMHgwMDAwMDAwMCwKKzB4MDAwODA2YjAsMHgwMDAwMTAwYiwweDAwMDIyZjA1LDB4MDAwMDAwMDAsCisweDAwMDA3NDAxLDB4MDAwOTExNDAsMHgwMDA0OGYwNSwweDAwMDk1MWMwLAorMHgwMDA0MjczMSwweDAwMDAxMDAzLDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwKKzB4MDAwZjE5YjAsMHgwMDBiYmM0NywweDAwMDgwMDAwLDB4MDAwYmZmYzcsCisweDAwMGZlMTllLDB4MDAwMDEwMDMsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKKzB4MDAwMDBmNDEsMHgwMDA5NzE0MCwweDAwMDBhODQxLDB4MDAwOWIyNDAsCisweDAwMDBhMGMxLDB4MDAwOWYwNDAsMHgwMDAxYzY0MSwweDAwMDkzNTQwLAorMHgwMDAxY2VjMSwweDAwMDliNWMwLDB4MDAwMDAwMDAsMHgwMDBmZGM0NCwKKzB4MDAwNTUyMDgsMHgwMDAwMDAwMCwweDAwMDEwNzA1LDB4MDAwYTI4ODAsCisweDAwMDBhMjNhLDB4MDAwOTNhMDAsMHgwMDAzZmM4YSwweDAwMGRmNmM1LAorMHgwMDA0ZWYwYSwweDAwMGMwMDAwLDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwKKzB4MDAwNjUzMDgsMHgwMDBjMjk5NywweDAwMGQ4NmIwLDB4MDAwMDEwMGEsCisweDAwMDQ0MTBhLDB4MDAwZDQwYzcsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDA4MDczMCwweDAwMDAxMDA0LDB4MDAwNTZmMGEsMHgwMDBlYTEwNSwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA0NzNkLDB4MDAwMDEwMDAsCisweDAwMGYxOWIwLDB4MDAwYmJjNDcsMHgwMDA4MDAwMCwweDAwMGJmZmM3LAorMHgwMDAwMjczZCwweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKKzB4MDAwNDhmMDUsMHgwMDAwZjQ0MCwweDAwMDA3NDAxLDB4MDAwMGY3YzAsCisweDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAorMHgwMDAwNmE4OCwweDAwMGM3NWM0LDB4MDAwMDAwMDAsMHgwMDBlNTA4NCwKKzB4MDAwMDAwMDAsMHgwMDBlYmE0NCwweDAwMDg3NDAxLDB4MDAwZTQ3ODIsCisweDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAorMHgwMDAwNmE4OCwweDAwMGM3NWM0LDB4MDAwN2MxMDgsMHgwMDBjMDAwMCwKKzB4MDAwN2U3MjEsMHgwMDBiZWQ0MCwweDAwMDA1ZjI1LDB4MDAwYmFkYzAsCisweDAwMDNiYTk3LDB4MDAwYmViODAsMHgwMDA2NTU5MCwweDAwMGIyZTAwLAorMHgwMDAzMzIxNywweDAwMDAzZWMwLDB4MDAwNjU1OTAsMHgwMDBiOGU0MCwKKzB4MDAwM2VkODAsMHgwMDA0OTFjMCwweDAwMDczZmIwLDB4MDAwNzRjODAsCisweDAwMDI4M2EwLDB4MDAwMDEwMGMsMHgwMDBlZTM4OCwweDAwMDQyOTcwLAorMHgwMDAwODMwMSwweDAwMDIxZWYyLDB4MDAwYjhmMTQsMHgwMDAwMDAwZiwKKzB4MDAwYzRkOGQsMHgwMDAwMDAxYiwweDAwMGQ2ZGMyLDB4MDAwZTA2YzYsCisweDAwMDAzMmFjLDB4MDAwYzM5MTYsMHgwMDA0ZWRjMiwweDAwMDc0YzgwLAorMHgwMDA3ODg5OCwweDAwMDAxMDAwLDB4MDAwMzg4OTQsMHgwMDAwMDAzMiwKKzB4MDAwYzRkOGQsMHgwMDA5MmUxYiwweDAwMGQ2ZGMyLDB4MDAwZTA2YzYsCisweDAwMDRlZGMyLDB4MDAwYzE5NTYsMHgwMDAwNzIyYywweDAwMDM0YTAwLAorMHgwMDA0MTcwNSwweDAwMDllZDQwLDB4MDAwNTg3MzAsMHgwMDAwMTQwMCwKKzB4MDAwZDc0ODgsMHgwMDBjM2EwMCwweDAwMDQ4ZjA1LDB4MDAwMDAwMDB9OworCitzdGF0aWMgc3RydWN0Cit7ICAgdTMyIE9mZnNldDsKKyAgICB1MzIgU2l6ZTsKKyAgICB1MzIgKnBGaWxsOworfSBGaWxsU3RhdFtGSUxMX19DT1VOVF0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMDAwMDAsIHNpemVvZihGaWxsQXJyYXkxKSwgRmlsbEFycmF5MX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMDE4MDAsIHNpemVvZihGaWxsQXJyYXkyKSwgRmlsbEFycmF5Mn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMTM3ZjAsIHNpemVvZihGaWxsQXJyYXkzKSwgRmlsbEFycmF5M30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMjAwMDAsIHNpemVvZihGaWxsQXJyYXk0KSwgRmlsbEFycmF5NH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2eHguYyBiL3NvdW5kL29zcy9jczQ2eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U2YjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDZ4eC5jCkBAIC0wLDAgKzEsNTc5NCBAQAorLyoKKyAqCUNyeXN0YWwgU291bmRGdXNpb24gQ1M0Nnh4IGRyaXZlcgorICoKKyAqCUNvcHlyaWdodCAxOTk4LTIwMDEgQ2lycnVzIExvZ2ljIENvcnBvcmF0aW9uIDxwY2F1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbT4KKyAqCQkJCQkJPHR3b2xsZXJAY3J5c3RhbC5jaXJydXMuY29tPgorICoJQ29weXJpZ2h0IDE5OTktMjAwMCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKglDb3B5cmlnaHQgMjAwMCBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqCVRoZSBjb3JlIG9mIHRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIHRoZSBBTFNBIHByb2plY3QgZHJpdmVyIGJ5IAorICoJSmFyb3NsYXYuIFBsZWFzZSBzZW5kIEphcm9zbGF2IHRoZSBjcmVkaXQgZm9yIHRoZSBkcml2ZXIgYW5kIAorICoJcmVwb3J0IGJ1Z3MgaW4gdGhpcyBwb3J0IHRvIDxhbGFuQHJlZGhhdC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKglDdXJyZW50IG1haW50YWluZXJzOgorICoJCUNpcnJ1cyBMb2dpYyBDb3Jwb3JhdGlvbiwgVGhvbWFzIFdvbGxlciAodHcpCisgKgkJCTx0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbT4KKyAqCQlOaWxzIEZhZXJiZXIgKG5mKQorICoJCQk8bmlsc0BrZXJuZWxjb25jZXB0cy5kZT4KKyAqCQlUaGFua3MgdG8gRGF2aWQgUG9sbGFyZCBmb3IgdGVzdGluZy4KKyAqCisgKglDaGFuZ2VzOgorICoJMjAwMDA5MDktbmYJQ2hhbmdlZCBjc19yZWFkLCBjc193cml0ZSBhbmQgZHJhaW5fZGFjCisgKgkyMDAwMTAyNS10dwlTZXBhcmF0ZSBQbGF5YmFjay9DYXB0dXJlIHN0cnVjdHMgYW5kIGJ1ZmZlcnMuCisgKgkJCUFkZGVkIFNjYXR0ZXIvR2F0aGVyIHN1cHBvcnQgZm9yIFBsYXliYWNrLgorICoJCQlBZGRlZCBDYXB0dXJlLgorICoJMjAwMDEwMjctbmYJUG9ydCB0byBrZXJuZWwgMi40LjAtdGVzdDksIHNvbWUgY2xlYW4tdXBzCisgKgkJCVN0YXJ0IG9mIHBvd2VybWFuYWdlbWVudCBzdXBwb3J0IChDUzQ2WFhfUE0pLgorICoJMjAwMDExMjgtdHcJQWRkIG1vZHVsZSBwYXJtIGZvciBkZWZhdWx0IGJ1ZmZlciBvcmRlci4KKyAqCQkJYWRkZWQgRE1BX0dGUCBmbGFnIHRvIGttYWxsb2MgZG1hIGJ1ZmZlciBhbGxvY3MuCisgKgkJCWJhY2tmaWxsIHNpbGVuY2UgdG8gZWxpbWluYXRlIHN0dXR0ZXJpbmcgb24KKyAqCQkJdW5kZXJydW5zLgorICoJMjAwMDEyMDEtdHcJYWRkIHJlc3luY2luZyBvZiBzd3B0ciBvbiB1bmRlcnJ1bnMuCisgKgkyMDAwMTIwNS10dy1uZglmaXhlZCBHRVRPU1BBQ0UgaW9jdGwoKSBhZnRlciBvcGVuKCkKKyAqCTIwMDEwMTEzLXR3CXBhdGNoIGZyb20gSGFucyBHcm9ibGVyIGdlbmVyYWwgY2xlYW51cC4KKyAqCTIwMDEwMTE3LXR3CTIuNC4wIHBjaSBjbGVhbnVwLCB3cmFwcGVyIGNvZGUgZm9yIDIuMi4xNi0yLjQuMAorICoJMjAwMTAxMTgtdHcJYmFzaWMgUE0gc3VwcG9ydCBmb3IgMi4yLjE2KyBhbmQgMi40LjAvMi40LjIuCisgKgkyMDAxMDIyOC1kaAlwYXRjaCBmcm9tIERhdmlkIEh1Z2dpbnMgLSBjc191cGRhdGVfcHRyIHJlY3Vyc2lvbi4KKyAqCTIwMDEwNDA5LXR3CWFkZCBoZXJjdWxlcyBnYW1lIHRoZWF0cmUgWFAgYW1wIGNvZGUuCisgKgkyMDAxMDQyMC10dwljbGVhbnVwIHBvd2VyZG93bi91cCBjb2RlLgorICoJMjAwMTA1MjEtdHcJZWxpbWluYXRlIHBvcHMsIGFuZCBmaXhlcyBmb3IgcG93ZXJkb3duLgorICoJMjAwMTA1MjUtdHcJYWRkZWQgZml4ZXMgZm9yIHRoaW5rcGFkcyB3aXRoIHBvd2VyZG93biBsb2dpYy4KKyAqCTIwMDEwNzIzLXNoICAgICBwYXRjaCBmcm9tIEhvcm1zIChTaW1vbiBIb3JtYW4pIC0KKyAqCSAgICAgICAgICAgICAgICBTT1VORF9QQ01fUkVBRF9CSVRTIHJldHVybnMgYml0cyBhcyBzZXQgaW4gZHJpdmVyCisgKgkgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gYSBsb2dpY2FsIG9yIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMuCisgKgkgICAgICAgICAgICAgICAgVmFyaW91cyBpb2N0bHMgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBkZXZpY2UKKyAqCSAgICAgICAgICAgICAgICBpcyBvcGVuIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgYnV0IG5vdCBib3RoIGJldHRlci4KKyAqCisgKglTdGF0dXM6CisgKglQbGF5YmFjay9DYXB0dXJlIHN1cHBvcnRlZCBmcm9tIDhrLTQ4ay4KKyAqCTE2Qml0IFNpZ25lZCBMRSAmIDhCaXQgVW5zaWduZWQsIHdpdGggTW9ubyBvciBTdGVyZW8gc3VwcG9ydGVkLgorICoKKyAqCUFQTS9QTSAtIDIuMi54IEFQTSBpcyBlbmFibGVkIGFuZCBmdW5jdGlvbmluZyBmaW5lLiBBUE0gY2FuIGFsc28KKyAqCWJlIGVuYWJsZWQgZm9yIDIuNC54IGJ5IG1vZGlmeWluZyB0aGUgQ1M0NlhYX0FDUElfU1VQUE9SVCBtYWNybworICoJZGVmaW5pdGlvbi4KKyAqCisgKiAgICAgIEhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCAtIHRoZSBFR1BJTzIgcGluIGNvbnRyb2xzIHRoZSBleHRlcm5hbCBBbXAsCisgKglzbywgdXNlIHRoZSBkcmFpbi9wb2xhcml0eSB0byBlbmFibGUuICAKKyAqCWhlcmN1bGVzX2VncGlvX2Rpc2FibGUgc2V0IHRvIDEsIHdpbGwgZm9yY2UgYSAwIHRvIEVHUElPRFIuCisgKgorICoJVlRCIFNhbnRhIENydXogLSB0aGUgR1BJTzcvR1BJTzggb24gdGhlIFNlY29uZGFyeSBDb2RlYyBjb250cm9sCisgKgl0aGUgZXh0ZXJuYWwgYW1wbGlmaWVyIGZvciB0aGUgImJhY2siIHNwZWFrZXJzLCBzaW5jZSB3ZSBkbyBub3QKKyAqCXN1cHBvcnQgdGhlIHNlY29uZGFyeSBjb2RlYyB0aGVuIHRoaXMgZXh0ZXJuYWwgYW1wIGlzIGFsc28gbm90CisgKgl0dXJuZWQgb24uCisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJjczQ2eHhwbS0yNC5oIgorI2luY2x1ZGUgImNzNDZ4eF93cmFwcGVyLTI0LmgiCisjaW5jbHVkZSAiY3M0NjF4LmgiCisKKy8qIE1JREkgYnVmZmVyIHNpemVzICovCisjZGVmaW5lIENTX01JRElJTkJVRiAgNTAwCisjZGVmaW5lIENTX01JRElPVVRCVUYgNTAwCisKKyNkZWZpbmUgQURDX1JVTk5JTkcJMQorI2RlZmluZSBEQUNfUlVOTklORwkyCisKKyNkZWZpbmUgQ1NfRk1UXzE2QklUCTEJCS8qIFRoZXNlIGFyZSBmaXhlZCBpbiBmYWN0ICovCisjZGVmaW5lIENTX0ZNVF9TVEVSRU8JMgorI2RlZmluZSBDU19GTVRfTUFTSwkzCisKKyNkZWZpbmUgQ1NfVFlQRV9BREMJMQorI2RlZmluZSBDU19UWVBFX0RBQwkyCisKKyNkZWZpbmUgQ1NfVFJVRSAJMQorI2RlZmluZSBDU19GQUxTRSAJMAorCisjZGVmaW5lIENTX0lOQ19VU0VfQ09VTlQobSkgKGF0b21pY19pbmMobSkpCisjZGVmaW5lIENTX0RFQ19VU0VfQ09VTlQobSkgKGF0b21pY19kZWMobSkpCisjZGVmaW5lIENTX0RFQ19BTkRfVEVTVChtKSAoYXRvbWljX2RlY19hbmRfdGVzdChtKSkKKyNkZWZpbmUgQ1NfSU5fVVNFKG0pIChhdG9taWNfcmVhZChtKSAhPSAwKQorCisjZGVmaW5lIENTX0RCR0JSRUFLUE9JTlQge19fYXNtX18oIklOVCAkMyIpO30KKy8qCisgKglDUzQ2MXggZGVmaW5pdGlvbnMKKyAqLworIAorI2RlZmluZSBDUzQ2MVhfQkEwX1NJWkUJCTB4MjAwMAorI2RlZmluZSBDUzQ2MVhfQkExX0RBVEEwX1NJWkUJMHgzMDAwCisjZGVmaW5lIENTNDYxWF9CQTFfREFUQTFfU0laRQkweDM4MDAKKyNkZWZpbmUgQ1M0NjFYX0JBMV9QUkdfU0laRQkweDcwMDAKKyNkZWZpbmUgQ1M0NjFYX0JBMV9SRUdfU0laRQkweDAxMDAKKworI2RlZmluZSBHT0ZfUEVSX1NFQwkyMDAKKworI2RlZmluZSBDU0RFQlVHX0lOVEVSRkFDRSAxCisjZGVmaW5lIENTREVCVUcgMQorLyoKKyAqIFR1cm4gb24vb2ZmIGRlYnVnZ2luZyBjb21waWxhdGlvbiBieSB1c2luZyAxLzAgcmVzcGVjdGl2ZWx5IGZvciBDU0RFQlVHCisgKgorICoKKyAqIENTREVCVUcgaXMgdXN1YWwgbW9kZSBpcyBzZXQgdG8gMSwgdGhlbiB1c2UgdGhlCisgKiBjc19kZWJ1Z2xldmVsIGFuZCBjc19kZWJ1Z21hc2sgdG8gdHVybiBvbiBvciBvZmYgZGVidWdnaW5nLgorICogRGVidWcgbGV2ZWwgb2YgMSBoYXMgYmVlbiBkZWZpbmVkIHRvIGJlIGtlcm5lbCBlcnJvcnMgYW5kIGluZm8KKyAqIHRoYXQgc2hvdWxkIGJlIHByaW50ZWQgb24gYW55IHJlbGVhc2VkIGRyaXZlci4KKyAqLworI2lmIENTREVCVUcKKyNkZWZpbmUgQ1NfREJHT1VUKG1hc2ssbGV2ZWwseCkgaWYoKGNzX2RlYnVnbGV2ZWwgPj0gKGxldmVsKSkgJiYgKChtYXNrKSAmIGNzX2RlYnVnbWFzaykpIHt4O30gCisjZWxzZQorI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KSAKKyNlbmRpZgorLyoKKyAqIGNzX2RlYnVnbWFzayBhcmVhcworICovCisjZGVmaW5lIENTX0lOSVQJIAkweDAwMDAwMDAxCQkvKiBpbml0aWFsaXphdGlvbiBhbmQgcHJvYmUgZnVuY3Rpb25zICovCisjZGVmaW5lIENTX0VSUk9SIAkweDAwMDAwMDAyCQkvKiB0bXAgZGVidWdnaW5nIGJpdCBwbGFjZWhvbGRlciAqLworI2RlZmluZSBDU19JTlRFUlJVUFQJMHgwMDAwMDAwNAkJLyogaW50ZXJydXB0IGhhbmRsZXIgKHNlcGFyYXRlIGZyb20gYWxsIG90aGVyKSAqLworI2RlZmluZSBDU19GVU5DVElPTiAJMHgwMDAwMDAwOAkJLyogZW50ZXIvbGVhdmUgZnVuY3Rpb25zICovCisjZGVmaW5lIENTX1dBVkVfV1JJVEUgCTB4MDAwMDAwMTAJCS8qIHdyaXRlIGluZm9ybWF0aW9uIGZvciB3YXZlICovCisjZGVmaW5lIENTX1dBVkVfUkVBRCAJMHgwMDAwMDAyMAkJLyogcmVhZCBpbmZvcm1hdGlvbiBmb3Igd2F2ZSAqLworI2RlZmluZSBDU19NSURJX1dSSVRFIAkweDAwMDAwMDQwCQkvKiB3cml0ZSBpbmZvcm1hdGlvbiBmb3IgbWlkaSAqLworI2RlZmluZSBDU19NSURJX1JFQUQgCTB4MDAwMDAwODAJCS8qIHJlYWQgaW5mb3JtYXRpb24gZm9yIG1pZGkgKi8KKyNkZWZpbmUgQ1NfTVBVNDAxX1dSSVRFIDB4MDAwMDAxMDAJCS8qIHdyaXRlIGluZm9ybWF0aW9uIGZvciBtcHU0MDEgKi8KKyNkZWZpbmUgQ1NfTVBVNDAxX1JFQUQgCTB4MDAwMDAyMDAJCS8qIHJlYWQgaW5mb3JtYXRpb24gZm9yIG1wdTQwMSAqLworI2RlZmluZSBDU19PUEVOCQkweDAwMDAwNDAwCQkvKiBhbGwgb3BlbiBmdW5jdGlvbnMgaW4gdGhlIGRyaXZlciAqLworI2RlZmluZSBDU19SRUxFQVNFCTB4MDAwMDA4MDAJCS8qIGFsbCByZWxlYXNlIGZ1bmN0aW9ucyBpbiB0aGUgZHJpdmVyICovCisjZGVmaW5lIENTX1BBUk1TCTB4MDAwMDEwMDAJCS8qIGZ1bmN0aW9uYWwgYW5kIG9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgQ1NfSU9DVEwJMHgwMDAwMjAwMAkJLyogaW9jdGwgKG5vbi1taXhlcikgKi8KKyNkZWZpbmUgQ1NfUE0JCTB4MDAwMDQwMDAJCS8qIFBNICovCisjZGVmaW5lIENTX1RNUAkJMHgxMDAwMDAwMAkJLyogdG1wIGRlYnVnIG1hc2sgYml0ICovCisKKyNkZWZpbmUgQ1NfSU9DVExfQ01EX1NVU1BFTkQJMHgxCS8vIHN1c3BlbmQKKyNkZWZpbmUgQ1NfSU9DVExfQ01EX1JFU1VNRQkweDIJLy8gcmVzdW1lCisKKyNpZiBDU0RFQlVHCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z2xldmVsPTE7CQkJLyogbGV2ZWxzIHJhbmdlIGZyb20gMS05ICovCittb2R1bGVfcGFyYW0oY3NfZGVidWdsZXZlbCwgdWxvbmcsIDA2NDQpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3NfZGVidWdtYXNrPUNTX0lOSVQgfCBDU19FUlJPUjsJLyogdXNlIENTX0RCR09VVCB3aXRoIHZhcmlvdXMgbWFzayB2YWx1ZXMgKi8KK21vZHVsZV9wYXJhbShjc19kZWJ1Z21hc2ssIHVsb25nLCAwNjQ0KTsKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVyY3VsZXNfZWdwaW9fZGlzYWJsZTsgIC8qIGlmIG5vbi16ZXJvIHNldCBhbGwgRUdQSU8gdG8gMCAqLworbW9kdWxlX3BhcmFtKGhlcmN1bGVzX2VncGlvX2Rpc2FibGUsIHVsb25nLCAwKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluaXRkZWxheT03MDA7ICAvKiBQTSBkZWxheSBpbiBtaWxsaXNlY3MgKi8KK21vZHVsZV9wYXJhbShpbml0ZGVsYXksIHVsb25nLCAwKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBvd2VyZG93bj0tMTsgIC8qIHR1cm4gb24vb2ZmIHBvd2VyZG93biBwcm9jZXNzaW5nIGluIGRyaXZlciAqLworbW9kdWxlX3BhcmFtKHBvd2VyZG93biwgdWxvbmcsIDApOworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSIDMKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmF1bHRvcmRlcj1ETUFCVUZfREVGQVVMVE9SREVSOworbW9kdWxlX3BhcmFtKGRlZmF1bHRvcmRlciwgdWxvbmcsIDApOworCitzdGF0aWMgaW50IGV4dGVybmFsX2FtcDsKK21vZHVsZV9wYXJhbShleHRlcm5hbF9hbXAsIGJvb2wsIDApOworc3RhdGljIGludCB0aGlua3BhZDsKK21vZHVsZV9wYXJhbSh0aGlua3BhZCwgYm9vbCwgMCk7CisKKy8qCisqIHNldCB0aGUgcG93ZXJkb3duIG1vZHVsZSBwYXJtIHRvIDAgdG8gZGlzYWJsZSBhbGwgCisqIHBvd2VyZG93bi4gYWxzbyBzZXQgdGhpbmtwYWQgdG8gMSB0byBkaXNhYmxlIHBvd2VyZG93biwgCisqIGJ1dCBhbHNvIHRvIGVuYWJsZSB0aGUgY2xrcnVuIGZ1bmN0aW9uYWxpdHkuCisqLworc3RhdGljIHVuc2lnbmVkIGNzX3Bvd2VyZG93bj0xOworc3RhdGljIHVuc2lnbmVkIGNzX2xhcHRvcF93YWl0PTE7CisKKy8qIEFuIGluc3RhbmNlIG9mIHRoZSA0NjEwIGNoYW5uZWwgKi8KK3N0cnVjdCBjc19jaGFubmVsIAoreworCWludCB1c2VkOworCWludCBudW07CisJdm9pZCAqc3RhdGU7Cit9OworCisjZGVmaW5lIENTNDZYWF9NQUpPUl9WRVJTSU9OICIxIgorI2RlZmluZSBDUzQ2WFhfTUlOT1JfVkVSU0lPTiAiMjgiCisKKyNpZmRlZiBfX2lhNjRfXworI2RlZmluZSBDUzQ2WFhfQVJDSAkgICAgIAkiNjQiCS8vYXJjaGl0ZWN0dXJlIGtleQorI2Vsc2UKKyNkZWZpbmUgQ1M0NlhYX0FSQ0gJICAgICAJIjMyIgkvL2FyY2hpdGVjdHVyZSBrZXkKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBjczQ2eHhfZGV2cyA9IHsgJmNzNDZ4eF9kZXZzLCAmY3M0Nnh4X2RldnMgfTsKKworLyogbWFnaWMgbnVtYmVycyB0byBwcm90ZWN0IG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgQ1NfQ0FSRF9NQUdJQwkJMHg0MzUyNTU1MyAvKiAiQ1JVUyIgKi8KKyNkZWZpbmUgQ1NfU1RBVEVfTUFHSUMJCTB4NGM0ZjQ3NDkgLyogIkxPR0kiICovCisjZGVmaW5lIE5SX0hXX0NICQkzCisKKy8qIG1heGludW0gbnVtYmVyIG9mIEFDOTcgY29kZWNzIGNvbm5lY3RlZCwgQUM5NyAyLjAgZGVmaW5lZCA0ICovCisjZGVmaW5lIE5SX0FDOTcJCTIKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaXplW10gPSB7IDEsIDIsIDIsIDQgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2hpZnRbXSA9IHsgMCwgMSwgMSwgMiB9OworCisvKiAic29mdHdhcmUiIG9yIHZpcnR1YWwgY2hhbm5lbCwgYW4gaW5zdGFuY2Ugb2Ygb3BlbmVkIC9kZXYvZHNwICovCitzdHJ1Y3QgY3Nfc3RhdGUgeworCXVuc2lnbmVkIGludCBtYWdpYzsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZDsJLyogQ2FyZCBpbmZvICovCisKKwkvKiBzaW5nbGUgb3BlbiBsb2NrIG1lY2hhbmlzbSwgb25seSB1c2VkIGZvciByZWNvcmRpbmcgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCS8qIGZpbGUgbW9kZSAqLworCW1vZGVfdCBvcGVuX21vZGU7CisKKwkvKiB2aXJ0dWFsIGNoYW5uZWwgbnVtYmVyICovCisJaW50IHZpcnQ7CisJCisJc3RydWN0IGRtYWJ1ZiB7CisJCS8qIHdhdmUgc2FtcGxlIHN0dWZmICovCisJCXVuc2lnbmVkIGludCByYXRlOworCQl1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlOworCisJCS8qIGhhcmR3YXJlIGNoYW5uZWwgKi8KKwkJc3RydWN0IGNzX2NoYW5uZWwgKmNoYW5uZWw7CisJCWludCBwcmluZ2J1ZjsJCS8qIFNvZnR3YXJlIHJpbmcgc2xvdCAqLworCQl2b2lkICpwYnVmOwkJLyogNEsgaGFyZHdhcmUgRE1BIGJ1ZmZlciAqLworCisJCS8qIE9TUyBidWZmZXIgbWFuYWdlbWVudCBzdHVmZiAqLworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwkJdW5zaWduZWQgYnVmb3JkZXI7CisJCXVuc2lnbmVkIG51bWZyYWc7CisJCXVuc2lnbmVkIGZyYWdzaGlmdDsKKwkJdW5zaWduZWQgZGl2aXNvcjsKKwkJdW5zaWduZWQgdHlwZTsKKwkJdm9pZCAqdG1wYnVmZjsJCQkvKiB0bXAgYnVmZmVyIGZvciBzYW1wbGUgY29udmVyc2lvbnMgKi8KKwkJZG1hX2FkZHJfdCBkbWFhZGRyOworCQlkbWFfYWRkcl90IGRtYWFkZHJfdG1wYnVmZjsKKwkJdW5zaWduZWQgYnVmb3JkZXJfdG1wYnVmZjsJLyogTG9nIGJhc2UgMiBvZiBzaXplIGluIGJ5dGVzLi4gKi8KKworCQkvKiBvdXIgYnVmZmVyIGFjdHMgbGlrZSBhIGNpcmN1bGFyIHJpbmcgKi8KKwkJdW5zaWduZWQgaHdwdHI7CQkvKiB3aGVyZSBkbWEgbGFzdCBzdGFydGVkLCB1cGRhdGVkIGJ5IHVwZGF0ZV9wdHIgKi8KKwkJdW5zaWduZWQgc3dwdHI7CQkvKiB3aGVyZSBkcml2ZXIgbGFzdCBjbGVhci9maWxsZWQsIHVwZGF0ZWQgYnkgcmVhZC93cml0ZSAqLworCQlpbnQgY291bnQ7CQkvKiBieXRlcyB0byBiZSBjb21zdW1lZCBvciBiZWVuIGdlbmVyYXRlZCBieSBkbWEgbWFjaGluZSAqLworCQl1bnNpZ25lZCB0b3RhbF9ieXRlczsJLyogdG90YWwgYnl0ZXMgZG1hZWQgYnkgaGFyZHdhcmUgKi8KKwkJdW5zaWduZWQgYmxvY2tzOwkvKiB0b3RhbCBibG9ja3MgKi8KKworCQl1bnNpZ25lZCBlcnJvcjsJCS8qIG51bWJlciBvZiBvdmVyL3VuZGVycnVucyAqLworCQl1bnNpZ25lZCB1bmRlcnJ1bjsJLyogdW5kZXJydW4gcGVuZGluZyBiZWZvcmUgbmV4dCB3cml0ZSBoYXMgb2NjdXJyZWQgKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsJLyogcHV0IHByb2Nlc3Mgb24gd2FpdCBxdWV1ZSB3aGVuIG5vIG1vcmUgc3BhY2UgaW4gYnVmZmVyICovCisKKwkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQl1bnNpZ25lZCBmcmFnc2l6ZTsKKwkJdW5zaWduZWQgZG1hc2l6ZTsKKwkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7CisKKwkJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIG1hcHBlZDoxOworCQl1bnNpZ25lZCByZWFkeToxOworCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CisJCXVuc2lnbmVkIFNHb2s6MTsKKwkJdW5zaWduZWQgdXBkYXRlX2ZsYWc7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwl9IGRtYWJ1ZjsKKwkvKiBHdWFyZCBhZ2FpbnN0IG1tYXAvd3JpdGUvcmVhZCByYWNlcyAqLworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworfTsKKworc3RydWN0IGNzX2NhcmQgeworCXN0cnVjdCBjc19jaGFubmVsIGNoYW5uZWxbMl07CisJdW5zaWduZWQgaW50IG1hZ2ljOworCisJLyogV2Uga2VlcCBjczQ2MXggY2FyZHMgaW4gYSBsaW5rZWQgbGlzdCAqLworCXN0cnVjdCBjc19jYXJkICpuZXh0OworCisJLyogVGhlIGNzNDYxeCBoYXMgYSBjZXJ0YWluIGFtb3VudCBvZiBjcm9zcyBjaGFubmVsIGludGVyYWN0aW9uCisJICAgc28gd2UgdXNlIGEgc2luZ2xlIHBlciBjYXJkIGxvY2sgKi8KKwlzcGlubG9ja190IGxvY2s7CisJCisJLyogS2VlcCBBQzk3IHNhbmUgKi8KKwlzcGlubG9ja190IGFjOTdfbG9jazsKKworCS8qIG1peGVyIHVzZSBjb3VudCAqLworCWF0b21pY190IG1peGVyX3VzZV9jbnQ7CisKKwkvKiBQQ0kgZGV2aWNlIHN0dWZmICovCisJc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXVuc2lnbmVkIGludCBwY3RsLCBjY3RsOwkvKiBIYXJkd2FyZSBETUEgZmxhZyBzZXRzICovCisKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgZGV2X2F1ZGlvOworCWludCBkZXZfbWlkaTsKKworCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgYmFua3MgYW5kIGNoYW5uZWxzKi8KKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlc1syXTsKKworCXUxNiBhYzk3X2ZlYXR1cmVzOworCQorCWludCBhbXBsaWZpZXI7CQkJLyogQW1wbGlmaWVyIGNvbnRyb2wgKi8KKwl2b2lkICgqYW1wbGlmaWVyX2N0cmwpKHN0cnVjdCBjc19jYXJkICosIGludCk7CisJdm9pZCAoKmFtcF9pbml0KShzdHJ1Y3QgY3NfY2FyZCAqKTsKKwkKKwlpbnQgYWN0aXZlOwkJCS8qIEFjdGl2ZSBjbG9ja2luZyAqLworCXZvaWQgKCphY3RpdmVfY3RybCkoc3RydWN0IGNzX2NhcmQgKiwgaW50KTsKKwkKKwkvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBsb25nIGJhMF9hZGRyOworCXVuc2lnbmVkIGxvbmcgYmExX2FkZHI7CisJdTMyIGlycTsKKwkKKwkvKiBtYXBwaW5ncyAqLworCXZvaWQgX19pb21lbSAqYmEwOworCXVuaW9uCisJeworCQlzdHJ1Y3QKKwkJeworCQkJdTggX19pb21lbSAqZGF0YTA7CisJCQl1OCBfX2lvbWVtICpkYXRhMTsKKwkJCXU4IF9faW9tZW0gKnBtZW07CisJCQl1OCBfX2lvbWVtICpyZWc7CisJCX0gbmFtZTsKKwkJdTggX19pb21lbSAqaWR4WzRdOworCX0gYmExOworCQorCS8qIEZ1bmN0aW9uIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgY3NfY2hhbm5lbCAqKCphbGxvY19wY21fY2hhbm5lbCkoc3RydWN0IGNzX2NhcmQgKik7CisJc3RydWN0IGNzX2NoYW5uZWwgKigqYWxsb2NfcmVjX3BjbV9jaGFubmVsKShzdHJ1Y3QgY3NfY2FyZCAqKTsKKwl2b2lkICgqZnJlZV9wY21fY2hhbm5lbCkoc3RydWN0IGNzX2NhcmQgKiwgaW50IGNoYW4pOworCisJLyogL2Rldi9taWRpIHN0dWZmICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaXJkLCBpd3IsIGljbnQ7CisJCXVuc2lnbmVkIG9yZCwgb3dyLCBvY250OworCQl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisJCXdhaXRfcXVldWVfaGVhZF90IGl3YWl0OworCQl3YWl0X3F1ZXVlX2hlYWRfdCBvd2FpdDsKKwkJc3BpbmxvY2tfdCBsb2NrOworCQl1bnNpZ25lZCBjaGFyIGlidWZbQ1NfTUlESUlOQlVGXTsKKwkJdW5zaWduZWQgY2hhciBvYnVmW0NTX01JRElPVVRCVUZdOworCQltb2RlX3Qgb3Blbl9tb2RlOworCQlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCX0gbWlkaTsKKwlzdHJ1Y3QgY3M0Nnh4X3BtIHBtOworfTsKKworc3RhdGljIGludCBjc19vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGNzX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgY3NfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgY3NfaGFyZHdhcmVfaW5pdChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCk7CitzdGF0aWMgaW50IGNzNDZ4eF9wb3dlcnVwKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGNzNDYxeF9wb3dlcmRvd24oc3RydWN0IGNzX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCB0eXBlLCBpbnQgc3VzcGVuZGZsYWcpOworc3RhdGljIHZvaWQgY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHR5cGUpOworc3RhdGljIGludCBjczQ2eHhfc3VzcGVuZF90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgY3M0Nnh4X3Jlc3VtZV90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldik7CisKKyNpZm5kZWYgQ1M0NlhYX0FDUElfU1VQUE9SVAorc3RhdGljIGludCBjczQ2eHhfcG1fY2FsbGJhY2soc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSk7CisjZW5kaWYKKworI2lmIENTREVCVUcKKworLyogREVCVUcgUk9VVElORVMgKi8KKworI2RlZmluZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTCAJX1NJT1dSKCdNJywxMjAsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUwgCV9TSU9XUignTScsMTIxLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0sgCV9TSU9XUignTScsMTIyLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0sgCV9TSU9XUignTScsMTIzLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX0FQTQkgCV9TSU9XUignTScsMTI0LCBpbnQpCisKK3N0YXRpYyB2b2lkIHByaW50aW9jdGwodW5zaWduZWQgaW50IHgpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciB2aWR4OworCS8qIHRoZXNlIHZhbHVlcyBhcmUgaW5jb3JyZWN0IGZvciB0aGUgYWM5NyBkcml2ZXIsIGZpeC4KKyAgICAgICAgICogSW5kZXggb2YgbWl4dGFibGUxW10gbWVtYmVyIGlzIERldmljZSBJRCAKKyAgICAgICAgICogYW5kIG11c3QgYmUgPD0gU09VTkRfTUlYRVJfTlJERVZJQ0VTLgorICAgICAgICAgKiBWYWx1ZSBvZiBhcnJheSBtZW1iZXIgaXMgaW5kZXggaW50byBzLT5taXgudm9sW10KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1peHRhYmxlMVtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9QQ01dICAgICA9IDEsICAgLyogdm9pY2UgKi8KKyAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfTElORTFdICAgPSAyLCAgIC8qIEFVWCAqLworICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9DRF0gICAgICA9IDMsICAgLyogQ0QgKi8KKyAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfTElORV0gICAgPSA0LCAgIC8qIExpbmUgKi8KKyAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfU1lOVEhdICAgPSA1LCAgIC8qIEZNICovCisgICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX01JQ10gICAgID0gNiwgICAvKiBNaWMgKi8KKyAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfU1BFQUtFUl0gPSA3LCAgIC8qIFNwZWFrZXIgKi8KKyAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfUkVDTEVWXSAgPSA4LCAgIC8qIFJlY29yZGluZyBsZXZlbCAqLworICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9WT0xVTUVdICA9IDkgICAgLyogTWFzdGVyIFZvbHVtZSAqLworICAgICAgICB9OworICAgICAgICAKKyAgICBzd2l0Y2goeCkgCisgICAgeworCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NTX0dFVERCR01BU0s6ICIpICk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUw6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDogIikgKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSzogIikgKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIk9TU19HRVRWRVJTSU9OOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NZTkM6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVREVVBMRVg6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUQ0FQUzogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfUkVTRVQ6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NQRUVEOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1RFUkVPOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9DSEFOTkVMUzogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VURk1UUzogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IAorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVRGTVQ6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfUE9TVDogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRUUklHR0VSOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVFRSSUdHRVI6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRPU1BBQ0U6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRJU1BBQ0U6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX05PTkJMT0NLOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT0RFTEFZOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVElQVFI6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT1BUUjogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRCTEtTSVpFOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NVQkRJVklERTogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX1JBVEU6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9CSVRTOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1dSSVRFX0ZJTFRFUjogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVFNZTkNSTzogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1JFQURfRklMVEVSOiAiKSApOworCQlicmVhazsKKworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUxOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTE6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUyOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTI6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUzOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTM6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEU0OgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTQ6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEU1OgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTU6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX0lORk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9JTkZPOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTT1VORF9PTERfTUlYRVJfSU5GTzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX09MRF9NSVhFUl9JTkZPOiAiKSApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN3aXRjaCAoX0lPQ19OUih4KSkgCisJCXsKKwkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9WT0xVTUU6ICIpICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNPVU5EX01JWEVSX1NQRUFLRVI6CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1NQRUFLRVI6ICIpICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKKwkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUkVDTEVWOiAiKSApOworCQkJCWJyZWFrOworCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX01JQzogIikgKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1lOVEg6CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1NZTlRIOiAiKSApOworCQkJCWJyZWFrOworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6IAorCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9SRUNTUkM6ICIpICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0RFVk1BU0s6ICIpICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1JFQ01BU0s6ICIpICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6IAorCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9TVEVSRU9ERVZTOiAiKSApOworCQkJCWJyZWFrOworCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DQVBTOiIpICk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWkgPSBfSU9DX05SKHgpOworCQkJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCAhKHZpZHggPSBtaXh0YWJsZTFbaV0pKQorCQkJCXsKKwkJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlVOS05PV04gSU9DVEw6IDB4JS44eCBOUj0lZCAiLHgsaSkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0lPQ1RMIEFDOXg6IDB4JS44eCBOUj0lZCAiLAorCQkJCQkJCXgsaSkgKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKyAgICB9CisgICAgQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoImNvbW1hbmQgPSAweCV4IElPQ19OUj0lZFxuIix4LCBfSU9DX05SKHgpKSApOworfQorI2VuZGlmCisKKy8qCisgKiAgY29tbW9uIEkvTyByb3V0aW5lcworICovCisKK3N0YXRpYyB2b2lkIGNzNDYxeF9wb2tlKHN0cnVjdCBjc19jYXJkICpjb2RlYywgdW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGludCB2YWwpCit7CisJd3JpdGVsKHZhbCwgY29kZWMtPmJhMS5pZHhbKHJlZyA+PiAxNikgJiAzXSsocmVnJjB4ZmZmZikpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNzNDYxeF9wZWVrKHN0cnVjdCBjc19jYXJkICpjb2RlYywgdW5zaWduZWQgbG9uZyByZWcpCit7CisJcmV0dXJuIHJlYWRsKGNvZGVjLT5iYTEuaWR4WyhyZWcgPj4gMTYpICYgM10rKHJlZyYweGZmZmYpKTsKK30KKworc3RhdGljIHZvaWQgY3M0NjF4X3Bva2VCQTAoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl3cml0ZWwodmFsLCBjb2RlYy0+YmEwK3JlZyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3M0NjF4X3BlZWtCQTAoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoY29kZWMtPmJhMCtyZWcpOworfQorCisKK3N0YXRpYyB1MTYgY3NfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKTsKK3N0YXRpYyB2b2lkIGNzX2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZywgdTE2IGRhdGEpOworCitzdGF0aWMgc3RydWN0IGNzX2NoYW5uZWwgKmNzX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworCWlmKGNhcmQtPmNoYW5uZWxbMV0udXNlZD09MSkKKwkJcmV0dXJuIE5VTEw7CisJY2FyZC0+Y2hhbm5lbFsxXS51c2VkPTE7CisJY2FyZC0+Y2hhbm5lbFsxXS5udW09MTsKKwlyZXR1cm4gJmNhcmQtPmNoYW5uZWxbMV07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3NfY2hhbm5lbCAqY3NfYWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworCWlmKGNhcmQtPmNoYW5uZWxbMF0udXNlZD09MSkKKwkJcmV0dXJuIE5VTEw7CisJY2FyZC0+Y2hhbm5lbFswXS51c2VkPTE7CisJY2FyZC0+Y2hhbm5lbFswXS5udW09MDsKKwlyZXR1cm4gJmNhcmQtPmNoYW5uZWxbMF07Cit9CisKK3N0YXRpYyB2b2lkIGNzX2ZyZWVfcGNtX2NoYW5uZWwoc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBjaGFubmVsKQoreworCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0uc3RhdGUgPSBOVUxMOworCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0udXNlZD0wOworfQorCisvKgorICogc2V0dXAgYSBkaXZpc29yIHZhbHVlIHRvIGhlbHAgd2l0aCBjb252ZXJzaW9uIGZyb20KKyAqIDE2Yml0IFN0ZXJlbywgZG93biB0byA4Yml0IHN0ZXJlby9tb25vIG9yIDE2Yml0IG1vbm8uCisgKiBhc3NpZ24gYSBkaXZpc29yIG9mIDEgaWYgdXNpbmcgMTZiaXQgU3RlcmVvIGFzIHRoYXQgaXMKKyAqIHRoZSBvbmx5IGZvcm1hdCB0aGF0IHRoZSBzdGF0aWMgaW1hZ2Ugd2lsbCBjYXB0dXJlLgorICovCitzdGF0aWMgdm9pZCBjc19zZXRfZGl2aXNvcihzdHJ1Y3QgZG1hYnVmICpkbWFidWYpCit7CisJaWYoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKQorCQlkbWFidWYtPmRpdmlzb3IgPSAxOworCWVsc2UgaWYoICEoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAKKwkgICAgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkKKwkJZG1hYnVmLT5kaXZpc29yID0gMjsKKwllbHNlIGlmKCAoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAKKwkgICAgIShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkpCisJCWRtYWJ1Zi0+ZGl2aXNvciA9IDI7CisJZWxzZSBpZiggIShkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pICYmIAorCSAgICAhKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkKKwkJZG1hYnVmLT5kaXZpc29yID0gNDsKKwllbHNlCisJCWRtYWJ1Zi0+ZGl2aXNvciA9IDE7CisKKwlDU19EQkdPVVQoQ1NfUEFSTVMgfCBDU19GVU5DVElPTiwgOCwgcHJpbnRrKAorCQkiY3M0Nnh4OiBjc19zZXRfZGl2aXNvcigpLSAlcyAlZFxuIiwKKwkJCShkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9BREMpID8gIkFEQyIgOiAiREFDIiwgCisJCQlkbWFidWYtPmRpdmlzb3IpICk7Cit9CisKKy8qCisqIG11dGUgc29tZSBvZiB0aGUgbW9yZSBwcmV2YWxlbnQgcmVnaXN0ZXJzIHRvIGF2b2lkIHBvcHBpbmcuCisqLworc3RhdGljIHZvaWQgY3NfbXV0ZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHN0YXRlKSAKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2PWNhcmQtPmFjOTdfY29kZWNbMF07CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfbXV0ZSgpKyAlc1xuIiwKKwkJKHN0YXRlID09IENTX1RSVUUpID8gIk11dGluZyIgOiAiVW5NdXRpbmciKSApOworCisJaWYoc3RhdGUgPT0gQ1NfVFJVRSkKKwl7CisJLyoKKwkqIGZpeCBwb3BzIHdoZW4gcG93ZXJpbmcgdXAgb24gdGhpbmtwYWRzCisJKi8KKwkJY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldCggZGV2LCAKKwkJCQkodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSk7IAorCQljYXJkLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCisJCQkJKHU4KUJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUpOyAKKwkJY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8gPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCisJCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyk7IAorCQljYXJkLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldChkZXYsIAorCQkJCSh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSk7CisJCQkKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgMHg4MDAwKTsKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgMHg4MDAwKTsKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCAweDgwMDApOworCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSwgMHg4MDAwKTsKKwl9CisJZWxzZQorCXsKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lKTsKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgY2FyZC0+cG0udTMyQUM5N19oZWFkcGhvbmVfdm9sdW1lKTsKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCBjYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubyk7CisJCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FLCBjYXJkLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lKTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX211dGUoKS1cbiIpKTsKK30KKworLyogc2V0IHBsYXliYWNrIHNhbXBsZSByYXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNzX3NldF9kYWNfcmF0ZShzdHJ1Y3QgY3Nfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IHJhdGUpCit7CQorCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGludCB0bXAxLCB0bXAyOworCXVuc2lnbmVkIGludCBwaGlJbmNyOworCXVuc2lnbmVkIGludCBjb3JyZWN0aW9uUGVyR09GLCBjb3JyZWN0aW9uUGVyU2VjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19zZXRfZGFjX3JhdGUoKSsgJWRcbiIscmF0ZSkgKTsKKworCS8qCisJICogIENvbXB1dGUgdGhlIHZhbHVlcyB1c2VkIHRvIGRyaXZlIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUgY29udmVyc2lvbi4KKwkgKiAgVGhlIGZvbGxvd2luZyBmb3JtdWxhcyBhcmUgYmVpbmcgY29tcHV0ZWQsIHVzaW5nIGlubGluZSBhc3NlbWJseQorCSAqICBzaW5jZSB3ZSBuZWVkIHRvIHVzZSA2NCBiaXQgYXJpdGhtZXRpYyB0byBjb21wdXRlIHRoZSB2YWx1ZXM6CisJICoKKwkgKiAgcGhpSW5jciA9IGZsb29yKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQorCSAqICBjb3JyZWN0aW9uUGVyR09GID0gZmxvb3IoKEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IpIC8KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPRl9QRVJfU0VDKQorICAgICAgICAgKiAgdWxDb3JyZWN0aW9uUGVyU2VjID0gRnMsaW4gKiAyXjI2IC0gRnMsb3V0ICogcGhpSW5jciAtTQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMgKiBjb3JyZWN0aW9uUGVyR09GCisJICoKKwkgKiAgaS5lLgorCSAqCisJICogIHBoaUluY3I6b3RoZXIgPSBkaXZpZGVuZDpyZW1haW5kZXIoKEZzLGluICogMl4yNikgLyBGcyxvdXQpCisJICogIGNvcnJlY3Rpb25QZXJHT0Y6Y29ycmVjdGlvblBlclNlYyA9CisJICogICAgICBkaXZpZGVuZDpyZW1haW5kZXIodWxPdGhlciAvIEdPRl9QRVJfU0VDKQorCSAqLworCXRtcDEgPSByYXRlIDw8IDE2OworCXBoaUluY3IgPSB0bXAxIC8gNDgwMDA7CisJdG1wMSAtPSBwaGlJbmNyICogNDgwMDA7CisJdG1wMSA8PD0gMTA7CisJcGhpSW5jciA8PD0gMTA7CisJdG1wMiA9IHRtcDEgLyA0ODAwMDsKKwlwaGlJbmNyICs9IHRtcDI7CisJdG1wMSAtPSB0bXAyICogNDgwMDA7CisJY29ycmVjdGlvblBlckdPRiA9IHRtcDEgLyBHT0ZfUEVSX1NFQzsKKwl0bXAxIC09IGNvcnJlY3Rpb25QZXJHT0YgKiBHT0ZfUEVSX1NFQzsKKwljb3JyZWN0aW9uUGVyU2VjID0gdG1wMTsKKworCS8qCisJICogIEZpbGwgaW4gdGhlIFNhbXBsZVJhdGVDb252ZXJ0ZXIgY29udHJvbCBibG9jay4KKwkgKi8KKwkgCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJY3M0NjF4X3Bva2Uoc3RhdGUtPmNhcmQsIEJBMV9QU1JDLAorCSAgKChjb3JyZWN0aW9uUGVyU2VjIDw8IDE2KSAmIDB4RkZGRjAwMDApIHwgKGNvcnJlY3Rpb25QZXJHT0YgJiAweEZGRkYpKTsKKwljczQ2MXhfcG9rZShzdGF0ZS0+Y2FyZCwgQkExX1BQSSwgcGhpSW5jcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlkbWFidWYtPnJhdGUgPSByYXRlOworCQorCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3NldF9kYWNfcmF0ZSgpLSAlZFxuIixyYXRlKSApOworCXJldHVybiByYXRlOworfQorCisvKiBzZXQgcmVjb3JkaW5nIHNhbXBsZSByYXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNzX3NldF9hZGNfcmF0ZShzdHJ1Y3QgY3Nfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBpbnQgcGhpSW5jciwgY29lZmZJbmNyLCB0bXAxLCB0bXAyOworCXVuc2lnbmVkIGludCBjb3JyZWN0aW9uUGVyR09GLCBjb3JyZWN0aW9uUGVyU2VjLCBpbml0aWFsRGVsYXk7CisJdW5zaWduZWQgaW50IGZyYW1lR3JvdXBMZW5ndGgsIGNudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3NldF9hZGNfcmF0ZSgpKyAlZFxuIixyYXRlKSApOworCisJLyoKKwkgKiAgV2UgY2FuIG9ubHkgZGVjaW1hdGUgYnkgdXAgdG8gYSBmYWN0b3Igb2YgMS85dGggdGhlIGhhcmR3YXJlIHJhdGUuCisJICogIENvcnJlY3QgdGhlIHZhbHVlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzdHJheSBvdXRzaWRlIHRoYXQgbGltaXQuCisJICovCisJaWYgKChyYXRlICogOSkgPCA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwIC8gOTsKKworCS8qCisJICogIFdlIGNhbiBub3QgY2FwdHVyZSBhdCBhdCByYXRlIGdyZWF0ZXIgdGhhbiB0aGUgSW5wdXQgUmF0ZSAoNDgwMDApLgorCSAqICBSZXR1cm4gYW4gZXJyb3IgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHN0cmF5IG91dHNpZGUgdGhhdCBsaW1pdC4KKwkgKi8KKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisKKwkvKgorCSAqICBDb21wdXRlIHRoZSB2YWx1ZXMgdXNlZCB0byBkcml2ZSB0aGUgYWN0dWFsIHNhbXBsZSByYXRlIGNvbnZlcnNpb24uCisJICogIFRoZSBmb2xsb3dpbmcgZm9ybXVsYXMgYXJlIGJlaW5nIGNvbXB1dGVkLCB1c2luZyBpbmxpbmUgYXNzZW1ibHkKKwkgKiAgc2luY2Ugd2UgbmVlZCB0byB1c2UgNjQgYml0IGFyaXRobWV0aWMgdG8gY29tcHV0ZSB0aGUgdmFsdWVzOgorCSAqCisJICogICAgIGNvZWZmSW5jciA9IC1mbG9vcigoRnMsb3V0ICogMl4yMykgLyBGcyxpbikKKwkgKiAgICAgcGhpSW5jciA9IGZsb29yKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQorCSAqICAgICBjb3JyZWN0aW9uUGVyR09GID0gZmxvb3IoKEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IpIC8KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMpCisJICogICAgIGNvcnJlY3Rpb25QZXJTZWMgPSBGcyxpbiAqIDJeMjYgLSBGcyxvdXQgKiBwaGlJbmNyIC0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMgKiBjb3JyZWN0aW9uUGVyR09GCisJICogICAgIGluaXRpYWxEZWxheSA9IGNlaWwoKDI0ICogRnMsaW4pIC8gRnMsb3V0KQorCSAqCisJICogaS5lLgorCSAqCisJICogICAgIGNvZWZmSW5jciA9IG5lZyhkaXZpZGVuZCgoRnMsb3V0ICogMl4yMykgLyBGcyxpbikpCisJICogICAgIHBoaUluY3I6dWxPdGhlciA9IGRpdmlkZW5kOnJlbWFpbmRlcigoRnMsaW4gKiAyXjI2KSAvIEZzLG91dCkKKwkgKiAgICAgY29ycmVjdGlvblBlckdPRjpjb3JyZWN0aW9uUGVyU2VjID0KKwkgKiAJICAgIGRpdmlkZW5kOnJlbWFpbmRlcih1bE90aGVyIC8gR09GX1BFUl9TRUMpCisJICogICAgIGluaXRpYWxEZWxheSA9IGRpdmlkZW5kKCgoMjQgKiBGcyxpbikgKyBGcyxvdXQgLSAxKSAvIEZzLG91dCkKKwkgKi8KKworCXRtcDEgPSByYXRlIDw8IDE2OworCWNvZWZmSW5jciA9IHRtcDEgLyA0ODAwMDsKKwl0bXAxIC09IGNvZWZmSW5jciAqIDQ4MDAwOworCXRtcDEgPDw9IDc7CisJY29lZmZJbmNyIDw8PSA3OworCWNvZWZmSW5jciArPSB0bXAxIC8gNDgwMDA7CisJY29lZmZJbmNyIF49IDB4RkZGRkZGRkY7CisJY29lZmZJbmNyKys7CisJdG1wMSA9IDQ4MDAwIDw8IDE2OworCXBoaUluY3IgPSB0bXAxIC8gcmF0ZTsKKwl0bXAxIC09IHBoaUluY3IgKiByYXRlOworCXRtcDEgPDw9IDEwOworCXBoaUluY3IgPDw9IDEwOworCXRtcDIgPSB0bXAxIC8gcmF0ZTsKKwlwaGlJbmNyICs9IHRtcDI7CisJdG1wMSAtPSB0bXAyICogcmF0ZTsKKwljb3JyZWN0aW9uUGVyR09GID0gdG1wMSAvIEdPRl9QRVJfU0VDOworCXRtcDEgLT0gY29ycmVjdGlvblBlckdPRiAqIEdPRl9QRVJfU0VDOworCWNvcnJlY3Rpb25QZXJTZWMgPSB0bXAxOworCWluaXRpYWxEZWxheSA9ICgoNDgwMDAgKiAyNCkgKyByYXRlIC0gMSkgLyByYXRlOworCisJLyoKKwkgKiAgRmlsbCBpbiB0aGUgVmFyaURlY2ltYXRlIGNvbnRyb2wgYmxvY2suCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1NSQywKKwkJKChjb3JyZWN0aW9uUGVyU2VjIDw8IDE2KSAmIDB4RkZGRjAwMDApIHwgKGNvcnJlY3Rpb25QZXJHT0YgJiAweEZGRkYpKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NJLCBjb2VmZkluY3IpOworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DRCwKKwkJKCgoQkExX1ZBUklERUNfQlVGXzEgKyAoaW5pdGlhbERlbGF5IDw8IDIpKSA8PCAxNikgJiAweEZGRkYwMDAwKSB8IDB4ODApOworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DUEksIHBoaUluY3IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogIEZpZ3VyZSBvdXQgdGhlIGZyYW1lIGdyb3VwIGxlbmd0aCBmb3IgdGhlIHdyaXRlIGJhY2sgdGFzay4gIEJhc2ljYWxseSwKKwkgKiAgdGhpcyBpcyBqdXN0IHRoZSBmYWN0b3JzIG9mIDI0MDAwICgyXjYqMyo1XjMpIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluCisJICogIHRoZSBvdXRwdXQgc2FtcGxlIHJhdGUuCisJICovCisJZnJhbWVHcm91cExlbmd0aCA9IDE7CisJZm9yIChjbnQgPSAyOyBjbnQgPD0gNjQ7IGNudCAqPSAyKSB7CisJCWlmICgoKHJhdGUgLyBjbnQpICogY250KSAhPSByYXRlKQorCQkJZnJhbWVHcm91cExlbmd0aCAqPSAyOworCX0KKwlpZiAoKChyYXRlIC8gMykgKiAzKSAhPSByYXRlKSB7CisJCWZyYW1lR3JvdXBMZW5ndGggKj0gMzsKKwl9CisJZm9yIChjbnQgPSA1OyBjbnQgPD0gMTI1OyBjbnQgKj0gNSkgeworCQlpZiAoKChyYXRlIC8gY250KSAqIGNudCkgIT0gcmF0ZSkgCisJCQlmcmFtZUdyb3VwTGVuZ3RoICo9IDU7CisgICAgICAgIH0KKworCS8qCisJICogRmlsbCBpbiB0aGUgV3JpdGVCYWNrIGNvbnRyb2wgYmxvY2suCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0ZHMSwgZnJhbWVHcm91cExlbmd0aCk7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NGRzIsICgweDAwODAwMDAwIHwgZnJhbWVHcm91cExlbmd0aCkpOworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1NULCAweDAwMDBGRkZGKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1NQQiwgKCg2NTUzNiAqIHJhdGUpIC8gMjQwMDApKTsKKwljczQ2MXhfcG9rZShjYXJkLCAoQkExX0NTUEIgKyA0KSwgMHgwMDAwRkZGRik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCWRtYWJ1Zi0+cmF0ZSA9IHJhdGU7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfc2V0X2FkY19yYXRlKCktICVkXG4iLHJhdGUpICk7CisJcmV0dXJuIHJhdGU7Cit9CisKKy8qIHByZXBhcmUgY2hhbm5lbCBhdHRyaWJ1dGVzIGZvciBwbGF5YmFjayAqLyAKK3N0YXRpYyB2b2lkIGNzX3BsYXlfc2V0dXAoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworICAgICAgICB1bnNpZ25lZCBpbnQgdG1wLCBDb3VudCwgcGxheUZvcm1hdDsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3BsYXlfc2V0dXAoKStcbiIpICk7CisgICAgICAgIGNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QVk9MLCAweDgwMDA4MDAwKTsKKyAgICAgICAgaWYoIWRtYWJ1Zi0+U0dvaykKKyAgICAgICAgICAgICAgIGNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QQkEsIHZpcnRfdG9fYnVzKGRtYWJ1Zi0+cGJ1ZikpOworICAgIAorICAgICAgICBDb3VudCA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBwbGF5Rm9ybWF0PWNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QRklFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgJj0gfkRNQV9SUV9DMl9BQ19NT05PX1RPX1NURVJFTzsgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENvdW50ICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgfD0gRE1BX1JRX0MyX0FDX01PTk9fVE9fU1RFUkVPOyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgJj0gfihETUFfUlFfQzJfQUNfOF9UT18xNl9CSVQgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQpOyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENvdW50ICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgfD0gKERNQV9SUV9DMl9BQ184X1RPXzE2X0JJVCAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQpOyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgcGxheUZvcm1hdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUERUQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0bXAgJj0gMHhmZmZmZmUwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUERUQywgdG1wIHwgLS1Db3VudCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAorCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcGxheV9zZXR1cCgpLVxuIikgKTsKKworfQorCitzdGF0aWMgc3RydWN0IEluaXRTdHJ1Y3QKK3sKKyAgICB1MzIgb2ZmOworICAgIHUzMiB2YWw7Cit9IEluaXRBcnJheVtdID0geyB7MHgwMDAwMDA0MCwgMHgzZmMwMDAwZn0sCisgICAgICAgICAgICAgICAgICB7MHgwMDAwMDA0YywgMHgwNDgwMDAwMH0sCisKKyAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGIzLCAweDAwMDAwNzgwfSwKKyAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGI3LCAweDAwMDAwMDAwfSwKKyAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGJjLCAweDA3ODAwMDAwfSwKKworICAgICAgICAgICAgICAgICAgezB4MDAwMDAwY2QsIDB4MDA4MDAwMDB9LAorICAgICAgICAgICAgICAgIH07CisKKy8qCisgKiAiU2V0Q2FwdHVyZVNQVmFsdWVzKCkiIC0tIEluaXRpYWxpemUgcmVjb3JkIHRhc2sgdmFsdWVzIGJlZm9yZSBlYWNoCisgKiAJY2FwdHVyZSBzdGFydHVwLiAgCisgKi8KK3N0YXRpYyB2b2lkIFNldENhcHR1cmVTUFZhbHVlcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpLCBvZmZzZXQ7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoImNzNDZ4eDogU2V0Q2FwdHVyZVNQVmFsdWVzKCkrXG4iKSApOworCWZvcihpPTA7IGk8c2l6ZW9mKEluaXRBcnJheSkvc2l6ZW9mKHN0cnVjdCBJbml0U3RydWN0KTsgaSsrKQorCXsKKwkJb2Zmc2V0ID0gSW5pdEFycmF5W2ldLm9mZio0OyAvKiA4Yml0IHRvIDMyYml0IG9mZnNldCB2YWx1ZSAqLworCQljczQ2MXhfcG9rZShjYXJkLCBvZmZzZXQsIEluaXRBcnJheVtpXS52YWwgKTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoImNzNDZ4eDogU2V0Q2FwdHVyZVNQVmFsdWVzKCktXG4iKSApOworfQorCisvKiBwcmVwYXJlIGNoYW5uZWwgYXR0cmlidXRlcyBmb3IgcmVjb3JkaW5nICovCitzdGF0aWMgdm9pZCBjc19yZWNfc2V0dXAoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlY19zZXR1cCgpK1xuIikgKTsKKworCVNldENhcHR1cmVTUFZhbHVlcyhjYXJkKTsKKworCS8qCisJICogc2V0IHRoZSBhdHRlbnVhdGlvbiB0byAwZEIgCisJICovCisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NWT0wsIDB4ODAwMDgwMDApOworCisJLyoKKwkgKiBzZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGludG8gdGhlIFNQCisJICovCisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NCQSwgdmlydF90b19idXMoZG1hYnVmLT5yYXdidWYpKTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlY19zZXR1cCgpLVxuIikgKTsKK30KKworCisvKiBnZXQgY3VycmVudCBwbGF5YmFjay9yZWNvcmRpbmcgZG1hIGJ1ZmZlciBwb2ludGVyIChieXRlIG9mZnNldCBmcm9tIExCQSksCisgICBjYWxsZWQgd2l0aCBzcGlubG9jayBoZWxkISAqLworICAgCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNzX2dldF9kbWFfYWRkcihzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXUzMiBvZmZzZXQ7CisJCisJaWYgKCAoIShkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSkgJiYKKwkgICAgICghKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpICkgKQorCXsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoCisJCQkiY3M0Nnh4OiBFUlJPUiBjc19nZXRfZG1hX2FkZHIoKTogbm90IGVuYWJsZWQgXG4iKSApOworCQlyZXR1cm4gMDsKKwl9CisJCQorCS8qCisJICogZ3JhbnVsYXJpdHkgaXMgYnl0ZSBib3VuZGFyeSwgZ29vZCBwYXJ0LgorCSAqLworCWlmKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCisJeworCQlvZmZzZXQgPSBjczQ2MXhfcGVlayhzdGF0ZS0+Y2FyZCwgQkExX1BCQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCX0KKwllbHNlIC8qIEFEQ19SVU5OSU5HIG11c3QgYmUgc2V0ICovCisJeworCQlvZmZzZXQgPSBjczQ2MXhfcGVlayhzdGF0ZS0+Y2FyZCwgQkExX0NCQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCX0KKwlDU19EQkdPVVQoQ1NfUEFSTVMgfCBDU19GVU5DVElPTiwgOSwgCisJCXByaW50aygiY3M0Nnh4OiBjc19nZXRfZG1hX2FkZHIoKSAlZFxuIixvZmZzZXQpICk7CisJb2Zmc2V0ID0gKHUzMilidXNfdG9fdmlydCgodW5zaWduZWQgbG9uZylvZmZzZXQpIC0gKHUzMilkbWFidWYtPnJhd2J1ZjsKKwlDU19EQkdPVVQoQ1NfUEFSTVMgfCBDU19GVU5DVElPTiwgOCwgCisJCXByaW50aygiY3M0Nnh4OiBjc19nZXRfZG1hX2FkZHIoKS0gJWRcbiIsb2Zmc2V0KSApOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3luY19kbWFfcHRycyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwkKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiByZXN5bmNfZG1hX3B0cnMoKSsgXG4iKSApOworCWlmKHN0YXRlKQorCXsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWRtYWJ1Zi0+aHdwdHI9ZG1hYnVmLT5zd3B0ciA9IDA7CisJCWRtYWJ1Zi0+cHJpbmdidWYgPSAwOworCX0KKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiByZXN5bmNfZG1hX3B0cnMoKS0gXG4iKSApOworfQorCQorLyogU3RvcCByZWNvcmRpbmcgKGxvY2sgaGVsZCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3BfYWRjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCQorCWRtYWJ1Zi0+ZW5hYmxlICY9IH5BRENfUlVOTklORzsKKwkKKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7CisJdG1wICY9IDB4RkZGRjAwMDA7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCApOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdG9wX2FkYygpKyBcbiIpICk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJX19zdG9wX2FkYyhzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdG9wX2FkYygpLSBcbiIpICk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSAmJiAKKwkgICAgICgoZG1hYnVmLT5tYXBwZWQgfHwgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpZG1hYnVmLT5kbWFzaXplKSAKKwkgICAgICAgJiYgZG1hYnVmLT5yZWFkeSkgJiYgCisJICAgICAgICgoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgfHwgCisJICAgICAgICAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fUkVTVU1FRCkpICkKKwl7CisJCWRtYWJ1Zi0+ZW5hYmxlIHw9IEFEQ19SVU5OSU5HOworCQljc19zZXRfZGl2aXNvcihkbWFidWYpOworCQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7CisJCXRtcCAmPSAweEZGRkYwMDAwOworCQl0bXAgfD0gY2FyZC0+Y2N0bDsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoCisJCQkiY3M0Nnh4OiBzdGFydF9hZGMoKSBwb2tlIDB4JXggXG4iLHRtcCkgKTsKKwkJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyogc3RvcCBwbGF5YmFjayAobG9jayBoZWxkKSAqLworc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF9kYWMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7CisJCisJdG1wPWNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKKwl0bXAmPTB4RkZGRjsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wKTsKK30KKworc3RhdGljIHZvaWQgc3RvcF9kYWMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RvcF9kYWMoKSsgXG4iKSApOworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RvcF9kYWMoc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RvcF9kYWMoKS0gXG4iKSApOworfQkKKworc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0bXA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdGFydF9kYWMoKSsgXG4iKSApOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJaWYgKCEoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgJiYgCisJICAgICgoZG1hYnVmLT5tYXBwZWQgfHwgZG1hYnVmLT5jb3VudCA+IDApICYmIGRtYWJ1Zi0+cmVhZHkpICYmCisJICAgICAgICgoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgfHwgCisJICAgICAgICAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fUkVTVU1FRCkpICkKKwl7CisJCWRtYWJ1Zi0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOworCQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7CisJCXRtcCAmPSAweEZGRkY7CisJCXRtcCB8PSBjYXJkLT5wY3RsOworCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDYsIHByaW50aygKKwkJICAgICJjczQ2eHg6IHN0YXJ0X2RhYygpIHBva2UgY2FyZD0lcCB0bXA9MHglLjA4eCBhZGRyPSVwIFxuIiwKKwkJICAgIGNhcmQsICh1bnNpZ25lZCl0bXAsIAorCQkgICAgY2FyZC0+YmExLmlkeFsoQkExX1BDVEwgPj4gMTYpICYgM10rKEJBMV9QQ1RMJjB4ZmZmZikgKSApOworCQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHN0YXJ0X2RhYygpLSBcbiIpICk7Cit9CisKKyNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKKworLyoKKyAqIGFsbG9jYXRlIERNQSBidWZmZXIsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgYnVmZmVycyBhcmUgc2VwYXJhdGUuCisgKi8KK3N0YXRpYyBpbnQgYWxsb2NfZG1hYnVmKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCit7CisKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1zdGF0ZS0+Y2FyZDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl2b2lkICpyYXdidWYgPSBOVUxMOworCXZvaWQgKnRtcGJ1ZmYgPSBOVUxMOworCWludCBvcmRlcjsKKwlzdHJ1Y3QgcGFnZSAqbWFwLCAqbWFwZW5kOworCXVuc2lnbmVkIGxvbmcgZGY7CisJCisJZG1hYnVmLT5yZWFkeSAgPSBkbWFidWYtPm1hcHBlZCA9IDA7CisJZG1hYnVmLT5TR29rID0gMDsKKy8qCisqIGNoZWNrIGZvciBvcmRlciB3aXRoaW4gbGltaXRzLCBidXQgZG8gbm90IG92ZXJ3cml0ZSB2YWx1ZS4KKyovCisJaWYoKGRlZmF1bHRvcmRlciA+IDEpICYmIChkZWZhdWx0b3JkZXIgPCAxMikpCisJCWRmID0gZGVmYXVsdG9yZGVyOworCWVsc2UKKwkJZGYgPSAyOwkKKworCWZvciAob3JkZXIgPSBkZjsgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKQorCQlpZiAoIChyYXdidWYgPSAodm9pZCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudCgKKwkJCWNhcmQtPnBjaV9kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRtYWJ1Zi0+ZG1hYWRkcikpKQorCQkJICAgIGJyZWFrOworCWlmICghcmF3YnVmKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkiY3M0Nnh4OiBhbGxvY19kbWFidWYoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHJhd2J1ZlxuIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZG1hYnVmLT5idWZvcmRlciA9IG9yZGVyOworCWRtYWJ1Zi0+cmF3YnVmID0gcmF3YnVmOworCS8vIE5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlIHRoZSAKKwkvLyByZW1hcF9wZm5fcmFuZ2UoKSBpbiBjczQ2eHhfbW1hcCBkb2Vzbid0IHdvcmsuCisJLy8gMS4gZ2V0IGluZGV4IHRvIGxhc3QgcGFnZSBpbiBtZW1fbWFwIGFycmF5IGZvciByYXdidWYuCisJbWFwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmICsgCisJCShQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKKworCS8vIDIuIG1hcmsgZWFjaCBwaHlzaWNhbCBwYWdlIGluIHJhbmdlIGFzICdyZXNlcnZlZCcuCisJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKKwkJY3M0eF9tZW1fbWFwX3Jlc2VydmUobWFwKTsKKworCUNTX0RCR09VVChDU19QQVJNUywgOSwgcHJpbnRrKCJjczQ2eHg6IGFsbG9jX2RtYWJ1ZigpOiBhbGxvY2F0ZWQgJWxkIChvcmRlciA9ICVkKSBieXRlcyBhdCAlcFxuIiwKKwkgICAgICAgUEFHRV9TSVpFIDw8IG9yZGVyLCBvcmRlciwgcmF3YnVmKSApOworCisvKgorKiAgb25seSBhbGxvY2F0ZSB0aGUgY29udmVyc2lvbiBidWZmZXIgZm9yIHRoZSBBREMKKyovCisJaWYoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKQorCXsKKwkJZG1hYnVmLT50bXBidWZmID0gTlVMTDsKKwkJZG1hYnVmLT5idWZvcmRlcl90bXBidWZmID0gMDsKKwkJcmV0dXJuIDA7CisJfQorLyoKKyAqIG5vdyB0aGUgdGVtcCBidWZmZXIgZm9yIDE2LzggY29udmVyc2lvbnMKKyAqLworCisJdG1wYnVmZiA9ICh2b2lkICopIHBjaV9hbGxvY19jb25zaXN0ZW50KAorCQljYXJkLT5wY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsICZkbWFidWYtPmRtYWFkZHJfdG1wYnVmZik7CisKKwlpZiAoIXRtcGJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCUNTX0RCR09VVChDU19QQVJNUywgOSwgcHJpbnRrKCJjczQ2eHg6IGFsbG9jYXRlZCAlbGQgKG9yZGVyID0gJWQpIGJ5dGVzIGF0ICVwXG4iLAorCSAgICAgICBQQUdFX1NJWkUgPDwgb3JkZXIsIG9yZGVyLCB0bXBidWZmKSApOworCisJZG1hYnVmLT50bXBidWZmID0gdG1wYnVmZjsKKwlkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYgPSBvcmRlcjsKKwkKKwkvLyBOb3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSB0aGUgCisJLy8gcmVtYXBfcGZuX3JhbmdlKCkgaW4gY3M0Nnh4X21tYXAgZG9lc24ndCB3b3JrLgorCS8vIDEuIGdldCBpbmRleCB0byBsYXN0IHBhZ2UgaW4gbWVtX21hcCBhcnJheSBmb3IgcmF3YnVmLgorCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnRtcGJ1ZmYgKyAKKwkJKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYpIC0gMSk7CisKKwkvLyAyLiBtYXJrIGVhY2ggcGh5c2ljYWwgcGFnZSBpbiByYW5nZSBhcyAncmVzZXJ2ZWQnLgorCWZvciAobWFwID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+dG1wYnVmZik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQorCQljczR4X21lbV9tYXBfcmVzZXJ2ZShtYXApOworCXJldHVybiAwOworfQorCisvKiBmcmVlIERNQSBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IHBhZ2UgKm1hcCwgKm1hcGVuZDsKKworCWlmIChkbWFidWYtPnJhd2J1ZikgeworCQkvLyBVbmRvIHByb2dfZG1hYnVmKCkncyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAKKwkJbWFwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmICsgCisJCQkJKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1Zik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQorCQkJY3M0eF9tZW1fbWFwX3VucmVzZXJ2ZShtYXApOworCQlmcmVlX2RtYWJ1ZihzdGF0ZS0+Y2FyZCwgZG1hYnVmKTsKKwl9CisKKwlpZiAoZG1hYnVmLT50bXBidWZmKSB7CisJCS8vIFVuZG8gcHJvZ19kbWFidWYoKSdzIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkIAorCQltYXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT50bXBidWZmICsKKwkJCQkoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXJfdG1wYnVmZikgLSAxKTsKKwkJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT50bXBidWZmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCisJCQljczR4X21lbV9tYXBfdW5yZXNlcnZlKG1hcCk7CisJCWZyZWVfZG1hYnVmMihzdGF0ZS0+Y2FyZCwgZG1hYnVmKTsKKwl9CisKKwlkbWFidWYtPnJhd2J1ZiA9IE5VTEw7CisJZG1hYnVmLT50bXBidWZmID0gTlVMTDsKKwlkbWFidWYtPm1hcHBlZCA9IGRtYWJ1Zi0+cmVhZHkgPSAwOworCWRtYWJ1Zi0+U0dvayA9IDA7Cit9CisKK3N0YXRpYyBpbnQgX19wcm9nX2RtYWJ1ZihzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQoreworICAgICAgICBzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhbGxvY2F0ZWRfcGFnZXMsIGFsbG9jYXRlZF9ieXRlczsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyLCBmbXQ9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHVuc2lnbmVkIGxvbmcgKnB0bXAgPSAodW5zaWduZWQgbG9uZyAqKSBkbWFidWYtPnBidWY7ICAgICAgICAgICAgICAgCisgICAgICAgIHVuc2lnbmVkIGxvbmcgU0dhcnJheVs5XSwgblNHcGFnZXM9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGludCByZXQ7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpKyBcbiIpKTsKKy8qCisgKiBjaGVjayBmb3IgQ0FQVFVSRSBhbmQgdXNlIG9ubHkgbm9uLXNnIGZvciBpbml0aWFsIHJlbGVhc2UKKyAqLworCWlmKGRtYWJ1Zi0+dHlwZSA9PSBDU19UWVBFX0FEQykKKwl7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCkgQURDXG4iKSk7CisJCS8qIAorCQkgKiBhZGQgaW4gbm9uLXNnIHN1cHBvcnQgZm9yIGNhcHR1cmUuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkvKiBhZGQgY29kZSB0byByZXNldCB0aGUgcmF3YnVmIG1lbW9yeS4gVFJXICovCisJCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSBkbWFidWYtPmJsb2NrcyA9IDA7CisJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmVycm9yID0gZG1hYnVmLT51bmRlcnJ1biA9IDA7CisKKwkJZG1hYnVmLT5TR29rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KKwkJaWYgKCFkbWFidWYtPnJhd2J1ZiB8fCAhZG1hYnVmLT50bXBidWZmKQorCQkJaWYgKChyZXQgPSBhbGxvY19kbWFidWYoc3RhdGUpKSkKKwkJCQlyZXR1cm4gcmV0OyAKKwkvKgorCSAqIHN0YXRpYyBpbWFnZSBvbmx5IHN1cHBvcnRzIDE2Qml0IHNpZ25lZCwgc3RlcmVvIC0gaGFyZCBjb2RlIGZtdAorCSAqLworCQlmbXQgPSBDU19GTVRfMTZCSVQgfCBDU19GTVRfU1RFUkVPOworCisJCWRtYWJ1Zi0+bnVtZnJhZyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlkbWFidWYtPmZyYWdzaXplID0gMjA0ODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IDIwNDggPj4gc2FtcGxlX3NoaWZ0W2ZtdF07ICAgIAorCQlkbWFidWYtPmRtYXNpemUgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZG1hYnVmLT5mcmFnc2hpZnQgPSAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKwkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZm10ICYgQ1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLAorCQkgICAgICAgZG1hYnVmLT5kbWFzaXplKTsKKyAgICAgICAgCW1lbXNldChkbWFidWYtPnRtcGJ1ZmYsIChmbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsIAorCQkJUEFHRV9TSVpFPDxkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYpOyAgICAgIAorCisJCS8qCisJCSAqICAgICAgTm93IHNldCB1cCB0aGUgcmluZworCQkgKi8KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJY3NfcmVjX3NldHVwKHN0YXRlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBzZXQgdGhlIHJlYWR5IGZsYWcgZm9yIHRoZSBkbWEgYnVmZmVyICovCisJCWRtYWJ1Zi0+cmVhZHkgPSAxOworCisJCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKAorCQkJImNzNDZ4eDogcHJvZ19kbWFidWYoKTogQ0FQVFVSRSByYXRlPSVkIGZtdD0weCV4IG51bWZyYWc9JWQgIgorCQkJImZyYWdzaXplPSVkIGRtYXNpemU9JWRcbiIsCisJCQkgICAgZG1hYnVmLT5yYXRlLCBkbWFidWYtPmZtdCwgZG1hYnVmLT5udW1mcmFnLAorCQkJICAgIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+ZG1hc2l6ZSkgKTsKKworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpLSAwIFxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSBpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKQorCXsKKwkvKgorCSAqIE11c3QgYmUgREFDCisJICovCisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCkgREFDXG4iKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXN5bmNfZG1hX3B0cnMoc3RhdGUpOworCQlkbWFidWYtPnRvdGFsX2J5dGVzID0gZG1hYnVmLT5ibG9ja3MgPSAwOworCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5lcnJvciA9IGRtYWJ1Zi0+dW5kZXJydW4gPSAwOworCisJCWRtYWJ1Zi0+U0dvayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIGlmIG5vdCBhbGxvY2F0ZWQgeWV0ICovCisJCWlmICghZG1hYnVmLT5yYXdidWYpCisJCQlpZiAoKHJldCA9IGFsbG9jX2RtYWJ1ZihzdGF0ZSkpKQorCQkJCXJldHVybiByZXQ7CisKKwkJYWxsb2NhdGVkX3BhZ2VzID0gMSA8PCBkbWFidWYtPmJ1Zm9yZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJYWxsb2NhdGVkX2J5dGVzID0gYWxsb2NhdGVkX3BhZ2VzKlBBR0VfU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCQkJCQkgICAgCisJCWlmKGFsbG9jYXRlZF9wYWdlcyA8IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCXsKKwkJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKAorCQkJICAgICJjczQ2eHg6IHByb2dfZG1hYnVmKCkgRXJyb3I6IGFsbG9jYXRlZF9wYWdlcyB0b28gc21hbGwgKCVkKVxuIiwKKwkJCQkodW5zaWduZWQpYWxsb2NhdGVkX3BhZ2VzKSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQkJCQkJCQkJCSAgICAKKwkJLyogVXNlIGFsbCB0aGUgcGFnZXMgYWxsb2NhdGVkLCBmcmFnc2l6ZSA0ay4gKi8KKwkJLyogVXNlICdwYnVmJyBmb3IgUy9HIHBhZ2UgbWFwIHRhYmxlLiAqLworCQlkbWFidWYtPlNHb2sgPSAxOyAgICAgICAgICAgLyogVXNlIFMvRy4gKi8KKworCQluU0dwYWdlcyA9IGFsbG9jYXRlZF9ieXRlcy80MDk2OyAgICAvKiBTL0cgcGFnZXMgYWx3YXlzIDRrLiAqLworCQkJCQkJCQkJCSAgICAKKwkJICAgICAvKiBTZXQgdXAgUy9HIHZhcmlhYmxlcy4gKi8KKwkJKnB0bXAgPSB2aXJ0X3RvX2J1cyhkbWFidWYtPnJhd2J1Zik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJKihwdG1wKzEpID0gMHgwMDAwMDAwODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZm9yKHRtcDE9IDE7IHRtcDEgPCBuU0dwYWdlczsgdG1wMSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCSoocHRtcCsyKnRtcDEpID0gdmlydF90b19idXMoIChkbWFidWYtPnJhd2J1ZikrNDA5Nip0bXAxKTsgIAorCQkJaWYoIHRtcDEgPT0gblNHcGFnZXMtMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJdG1wMiA9IDB4YmZmZjAwMDA7CisJCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQl0bXAyID0gMHg4MDAwMDAwMCs4Kih0bXAxKzEpOyAgICAgICAgICAgICAgICAgICAgICAgCisJCQkqKHB0bXArMip0bXAxKzEpID0gdG1wMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVswXSA9IDB4ODJjMDIwMGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVsxXSA9IDB4ZmZmZjAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVsyXSA9ICpwdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVszXSA9IDB4MDAwMTA2MDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVs0XSA9ICoocHRtcCsyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVs1XSA9IDB4ODAwMDAwMTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVs2XSA9ICpwdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVs3XSA9ICoocHRtcCsyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVs4XSA9ICh2aXJ0X3RvX2J1cyhkbWFidWYtPnBidWYpICYgMHhmZmZmMDAwKSB8IDB4MTA7ICAgICAgICAKKworCQlpZiAoZG1hYnVmLT5TR29rKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJZG1hYnVmLT5udW1mcmFnID0gblNHcGFnZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlkbWFidWYtPmZyYWdzaXplID0gNDA5NjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSA0MDk2ID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07ICAgIAorCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSAxMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcqNDA5NjsgICAgICAgICAgICAgICAgICAgICAKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCVNHYXJyYXlbMF0gPSAweGYyYzAwMDBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJU0dhcnJheVsxXSA9IDB4MDAwMDAyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlTR2FycmF5WzJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCVNHYXJyYXlbM10gPSAweDAwMDEwNjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJU0dhcnJheVs0XT1TR2FycmF5WzVdPVNHYXJyYXlbNl09U0dhcnJheVs3XT1TR2FycmF5WzhdID0gMDsgCisJCQlkbWFidWYtPm51bWZyYWcgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWRtYWJ1Zi0+ZnJhZ3NpemUgPSAyMDQ4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IDIwNDggPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsgICAgCisJCQlkbWFidWYtPmRtYXNpemUgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl9CisJCWZvcih0bXAxID0gMDsgdG1wMSA8IHNpemVvZihTR2FycmF5KS80OyB0bXAxKyspICAgICAgICAgICAgICAgICAgICAgCisJCQljczQ2MXhfcG9rZSggc3RhdGUtPmNhcmQsIEJBMV9QRFRDK3RtcDEqNCwgU0dhcnJheVt0bXAxXSk7ICAKKworCQltZW1zZXQoZG1hYnVmLT5yYXdidWYsIChkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwKKwkJICAgICAgIGRtYWJ1Zi0+ZG1hc2l6ZSk7CisKKwkJLyoKKwkJICogICAgICBOb3cgc2V0IHVwIHRoZSByaW5nCisJCSAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQljc19wbGF5X3NldHVwKHN0YXRlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBzZXQgdGhlIHJlYWR5IGZsYWcgZm9yIHRoZSBkbWEgYnVmZmVyICovCisJCWRtYWJ1Zi0+cmVhZHkgPSAxOworCisJCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKAorCQkJImNzNDZ4eDogcHJvZ19kbWFidWYoKTogUExBWUJBQ0sgcmF0ZT0lZCBmbXQ9MHgleCBudW1mcmFnPSVkICIKKwkJCSJmcmFnc2l6ZT0lZCBkbWFzaXplPSVkXG4iLAorCQkJICAgIGRtYWJ1Zi0+cmF0ZSwgZG1hYnVmLT5mbXQsIGRtYWJ1Zi0+bnVtZnJhZywKKwkJCSAgICBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmRtYXNpemUpICk7CisKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKS0gXG4iKSk7CisJCXJldHVybiAwOworCX0KKwllbHNlCisJeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpLSBJbnZhbGlkIFR5cGUgJWRcbiIsCisJCQlkbWFidWYtPnR5cGUpKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCQorCWRvd24oJnN0YXRlLT5zZW0pOworCXJldCA9IF9fcHJvZ19kbWFidWYoc3RhdGUpOworCXVwKCZzdGF0ZS0+c2VtKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjc19jbGVhcl90YWlsKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCit7Cit9CisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1zdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdG1vOworCWludCBjb3VudDsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGRyYWluX2RhYygpKyBcbiIpKTsKKwlpZiAoZG1hYnVmLT5tYXBwZWQgfHwgIWRtYWJ1Zi0+cmVhZHkpCisJeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBkcmFpbl9kYWMoKS0gMCwgbm90IHJlYWR5XG4iKSk7CisJCXJldHVybiAwOworCX0KKworCWFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCS8qIEl0IHNlZW1zIHRoYXQgd2UgaGF2ZSB0byBzZXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gVEFTS19JTlRFUlJVUFRJQkxFCisJCSAgIGV2ZXJ5IHRpbWUgdG8gbWFrZSB0aGUgcHJvY2VzcyByZWFsbHkgZ28gdG8gc2xlZXAgKi8KKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCisJCWlmIChub25ibG9jaykgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIGRtYWJ1Zi0+cmF0ZTsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOworCQl0bW8gKz0gKDIwNDgqSFopL2RtYWJ1Zi0+cmF0ZTsKKwkJCisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyB0bW8gOiAxKSAmJiB0bW8peworCQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGRyYWluX2RhYywgZG1hIHRpbWVvdXQ/ICVkXG4iLCBjb3VudCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogZHJhaW5fZGFjKCktIC1FUkVTVEFSVFNZU1xuIikpOworCQkvKgorCQkqIHNldCB0byBzaWxlbmNlIGFuZCBsZXQgdGhhdCBjbGVhciB0aGUgZmlmb3MuCisJCSovCisJCWNzNDYxeF9jbGVhcl9zZXJpYWxfRklGT3MoY2FyZCwgQ1NfVFlQRV9EQUMpOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGRyYWluX2RhYygpLSAwXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogdXBkYXRlIGJ1ZmZlciBtYW5hbmdlbWVudCBwb2ludGVycywgZXNwZWNpYWxseSwgZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLworc3RhdGljIHZvaWQgY3NfdXBkYXRlX3B0cihzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHdha2UpCit7CisJc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJdW5zaWduZWQgaHdwdHI7CisJaW50IGRpZmY7CisKKwkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBBREMgKi8KKwlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKKwlpZihzdGF0ZSkKKwl7CisJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgeworCQkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KKwkJCWh3cHRyID0gY3NfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKKworCQkJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOworCQkJQ1NfREJHT1VUKENTX1BBUk1TLCA5LCBwcmludGsoCisJCQkJImNzNDZ4eDogY3NfdXBkYXRlX3B0cigpKyBBREMgaHdwdHI9JWQgZGlmZj0lZFxuIiwgCisJCQkJaHdwdHIsZGlmZikgKTsKKwkJCWRtYWJ1Zi0+aHdwdHIgPSBod3B0cjsKKwkJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKKwkJCWlmIChkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKQorCQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CisKKwkJCWlmKGRtYWJ1Zi0+bWFwcGVkKQorCQkJeworCQkJCWlmICh3YWtlICYmIGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZClkbWFidWYtPmZyYWdzaXplKQorCQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQkJfSBlbHNlIAorCQkJeworCQkJCWlmICh3YWtlICYmIGRtYWJ1Zi0+Y291bnQgPiAwKQorCQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQkJfQorCQl9CisJfQorCisvKgorICogTm93IHRoZSBEQUMKKyAqLworCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCWlmKHN0YXRlKQorCXsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIERBQyAqLworCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgeworCQkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KKwkJCWh3cHRyID0gY3NfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKKworCQkJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOworCQkJQ1NfREJHT1VUKENTX1BBUk1TLCA5LCBwcmludGsoCisJCQkJImNzNDZ4eDogY3NfdXBkYXRlX3B0cigpKyBEQUMgaHdwdHI9JWQgZGlmZj0lZFxuIiwgCisJCQkJaHdwdHIsZGlmZikgKTsKKwkJCWRtYWJ1Zi0+aHdwdHIgPSBod3B0cjsKKwkJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKKwkJCQlpZiAod2FrZSAmJiBkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwkJCQkvKgorCQkJCSAqIG90aGVyIGRyaXZlcnMgdXNlIGZyYWdzaXplLCBidXQgZG9uJ3Qgc2VlIGFueSBzZW5zZQorCQkJCSAqIGluIHRoYXQsIHNpbmNlIGRtYXNpemUgaXMgdGhlIGJ1ZmZlciBhc2tlZCBmb3IKKwkJCQkgKiB2aWEgbW1hcC4KKwkJCQkgKi8KKwkJCQlpZiggZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKKwkJCQkJZG1hYnVmLT5jb3VudCAmPSBkbWFidWYtPmRtYXNpemUtMTsKKwkJCX0gZWxzZSB7CisJCQkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCQkJCS8qCisJCQkJICogYmFja2ZpbGwgd2l0aCBzaWxlbmNlIGFuZCBjbGVhciBvdXQgdGhlIGxhc3QgCisJCQkJICogImRpZmYiIG51bWJlciBvZiBieXRlcy4KKwkJCQkgKi8KKwkJCQlpZihod3B0ciA+PSBkaWZmKQorCQkJCXsKKwkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgaHdwdHIgLSBkaWZmLCAKKwkJCQkJCShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgZGlmZik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgCisJCQkJCQkoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsCisJCQkJCQkodW5zaWduZWQpaHdwdHIpOworCQkJCQltZW1zZXQoKGNoYXIgKilkbWFidWYtPnJhd2J1ZiArIAorCQkJCQkJCWRtYWJ1Zi0+ZG1hc2l6ZSArIGh3cHRyIC0gZGlmZiwKKwkJCQkJCShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgCisJCQkJCQlkaWZmIC0gaHdwdHIpOyAKKwkJCQl9CisKKwkJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCQkJICAiY3M0Nnh4OiBFUlJPUiBEQUMgY291bnQ8MCBvciBjb3VudCA+IGRtYXNpemUgKCVkKVxuIiwKKwkJCQkJICAJZG1hYnVmLT5jb3VudCkpOworCQkJCQkvKiAKKwkJCQkJKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4sIHJlc2V0IHRoZQorCQkJCQkqIGNvdW50IG9mIGJ5dGVzIHdyaXR0ZW4gYmFjayB0byAwLgorCQkJCQkqLworCQkJCQlpZihkbWFidWYtPmNvdW50IDwgMCkKKwkJCQkJCWRtYWJ1Zi0+dW5kZXJydW49MTsKKwkJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKKwkJCQl9CisJCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpZG1hYnVmLT5kbWFzaXplLzIpCisJCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyogaG9sZCBzcGlubG9jayBmb3IgdGhlIGZvbGxvd2luZyEgKi8KK3N0YXRpYyB2b2lkIGNzX2hhbmRsZV9taWRpKHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgICAgICBpbnQgd2FrZTsKKyAgICAgICAgdW5zaWduZWQgdGVtcDE7CisKKyAgICAgICAgd2FrZSA9IDA7CisgICAgICAgIHdoaWxlICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsICBCQTBfTUlEU1IpICYgTUlEU1JfUkJFKSkgeworICAgICAgICAgICAgICAgIGNoID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX01JRFJQKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FyZC0+bWlkaS5pY250IDwgQ1NfTUlESUlOQlVGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlidWZbY2FyZC0+bWlkaS5pd3JdID0gY2g7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5taWRpLml3ciA9IChjYXJkLT5taWRpLml3ciArIDEpICUgQ1NfTUlESUlOQlVGOworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pY250Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdha2UgPSAxOworICAgICAgICB9CisgICAgICAgIGlmICh3YWtlKQorICAgICAgICAgICAgICAgIHdha2VfdXAoJmNhcmQtPm1pZGkuaXdhaXQpOworICAgICAgICB3YWtlID0gMDsKKyAgICAgICAgd2hpbGUgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgIEJBMF9NSURTUikgJiBNSURTUl9UQkYpICYmIGNhcmQtPm1pZGkub2NudCA+IDApIHsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICggY2FyZC0+bWlkaS5vYnVmW2NhcmQtPm1pZGkub3JkXSApICYgMHgwMDAwMDBmZjsKKyAgICAgICAgICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEV1AsdGVtcDEpOworICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub3JkID0gKGNhcmQtPm1pZGkub3JkICsgMSkgJSBDU19NSURJT1VUQlVGOworICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub2NudC0tOworICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLm9jbnQgPCBDU19NSURJT1VUQlVGLTE2KQorICAgICAgICAgICAgICAgICAgICAgICAgd2FrZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdha2UpCisgICAgICAgICAgICAgICAgd2FrZV91cCgmY2FyZC0+bWlkaS5vd2FpdCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWRldl9pZDsKKwkvKiBTaW5nbGUgY2hhbm5lbCBjYXJkICovCisJc3RydWN0IGNzX3N0YXRlICpyZWNzdGF0ZSA9IGNhcmQtPmNoYW5uZWxbMF0uc3RhdGU7CisJc3RydWN0IGNzX3N0YXRlICpwbGF5c3RhdGUgPSBjYXJkLT5jaGFubmVsWzFdLnN0YXRlOworCXUzMiBzdGF0dXM7CisKKwlDU19EQkdPVVQoQ1NfSU5URVJSVVBULCA5LCBwcmludGsoImNzNDZ4eDogY3NfaW50ZXJydXB0KCkrIFxuIikpOworCisJc3Bpbl9sb2NrKCZjYXJkLT5sb2NrKTsKKworCXN0YXR1cyA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9ISVNSKTsKKwkKKwlpZiAoKHN0YXR1cyAmIDB4N2ZmZmZmZmYpID09IDApCisJeworCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfSElDUiwgSElDUl9DSEdNfEhJQ1JfSUVWKTsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CS8qIE1pZ2h0IGJlIElSUV9OT05FLi4gKi8KKwl9CisJCisJLyoKKwkgKiBjaGVjayBmb3IgcGxheWJhY2sgb3IgY2FwdHVyZSBpbnRlcnJ1cHQgb25seQorCSAqLworCWlmKCAoKHN0YXR1cyAmIEhJU1JfVkMwKSAmJiBwbGF5c3RhdGUgJiYgcGxheXN0YXRlLT5kbWFidWYucmVhZHkpIHx8IAorCSAgICAoKChzdGF0dXMgJiBISVNSX1ZDMSkgJiYgcmVjc3RhdGUgJiYgcmVjc3RhdGUtPmRtYWJ1Zi5yZWFkeSkpICkKKwl7CisJCUNTX0RCR09VVChDU19JTlRFUlJVUFQsIDgsIHByaW50aygKKwkJCSJjczQ2eHg6IGNzX2ludGVycnVwdCgpIGludGVycnVwdCBiaXQocykgc2V0ICgweCV4KVxuIixzdGF0dXMpKTsKKwkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKKwl9CisKKyAgICAgICAgaWYoIHN0YXR1cyAmIEhJU1JfTUlESSApCisgICAgICAgICAgICAgICAgY3NfaGFuZGxlX21pZGkoY2FyZCk7CisJCisgCS8qIGNsZWFyICdlbSAqLworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9ISUNSLCBISUNSX0NIR018SElDUl9JRVYpOworCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKKwlDU19EQkdPVVQoQ1NfSU5URVJSVVBULCA5LCBwcmludGsoImNzNDZ4eDogY3NfaW50ZXJydXB0KCktIFxuIikpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNzaXplX3QgY3NfbWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKyAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHNzaXplX3QgcmV0OworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICB1bnNpZ25lZCBwdHI7CisgICAgICAgIGludCBjbnQ7CisKKyAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcHRyID0gY2FyZC0+bWlkaS5pcmQ7CisgICAgICAgICAgICAgICAgY250ID0gQ1NfTUlESUlOQlVGIC0gcHRyOworICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLmljbnQgPCBjbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBjbnQgPSBjYXJkLT5taWRpLmljbnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChjbnQgPiBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNudCA9IGNvdW50OworICAgICAgICAgICAgICAgIGlmIChjbnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPm1pZGkuaXdhaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBjYXJkLT5taWRpLmlidWYgKyBwdHIsIGNudCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBwdHIgPSAocHRyICsgY250KSAlIENTX01JRElJTkJVRjsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaXJkID0gcHRyOworICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaWNudCAtPSBjbnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGNvdW50IC09IGNudDsKKyAgICAgICAgICAgICAgICBidWZmZXIgKz0gY250OworICAgICAgICAgICAgICAgIHJldCArPSBjbnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCBjc19taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKyAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHNzaXplX3QgcmV0OworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICB1bnNpZ25lZCBwdHI7CisgICAgICAgIGludCBjbnQ7CisKKyAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICByZXQgPSAwOworICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBwdHIgPSBjYXJkLT5taWRpLm93cjsKKyAgICAgICAgICAgICAgICBjbnQgPSBDU19NSURJT1VUQlVGIC0gcHRyOworICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLm9jbnQgKyBjbnQgPiBDU19NSURJT1VUQlVGKQorICAgICAgICAgICAgICAgICAgICAgICAgY250ID0gQ1NfTUlESU9VVEJVRiAtIGNhcmQtPm1pZGkub2NudDsKKyAgICAgICAgICAgICAgICBpZiAoY250IDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjc19oYW5kbGVfbWlkaShjYXJkKTsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKGNudCA+IGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgY250ID0gY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKGNudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2FyZC0+bWlkaS5vd2FpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGNhcmQtPm1pZGkub2J1ZiArIHB0ciwgYnVmZmVyLCBjbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgcHRyID0gKHB0ciArIGNudCkgJSBDU19NSURJT1VUQlVGOworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vd3IgPSBwdHI7CisgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vY250ICs9IGNudDsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgY291bnQgLT0gY250OworICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBjbnQ7CisgICAgICAgICAgICAgICAgcmV0ICs9IGNudDsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGNzX2hhbmRsZV9taWRpKGNhcmQpOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3NfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisgICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKyAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9XUklURSkKKyAgICAgICAgICAgICAgICBwb2xsX3dhaXQoZmlsZSwgJmNhcmQtPm1pZGkub3dhaXQsIHdhaXQpOworICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1JFQUQpCisgICAgICAgICAgICAgICAgcG9sbF93YWl0KGZpbGUsICZjYXJkLT5taWRpLml3YWl0LCB3YWl0KTsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkuaWNudCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLm9jbnQgPCBDU19NSURJT1VUQlVGKQorICAgICAgICAgICAgICAgICAgICAgICAgbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiBtYXNrOworfQorCisKK3N0YXRpYyBpbnQgY3NfbWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgICAgICB1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1OVUxMOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQorCXsKKwkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKKwkJaWYgKGNhcmQtPmRldl9taWRpID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGVudHJ5ID09ICZjczQ2eHhfZGV2cykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFjYXJkKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDZ4eDogY3M0Nnh4X21pZGlfb3BlbigpOiBFcnJvciAtIHVuYWJsZSB0byBmaW5kIGNhcmQgc3RydWN0XG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworICAgICAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkOworICAgICAgICAvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKyAgICAgICAgZG93bigmY2FyZC0+bWlkaS5vcGVuX3NlbSk7CisgICAgICAgIHdoaWxlIChjYXJkLT5taWRpLm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworICAgICAgICAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmNhcmQtPm1pZGkub3Blbl9zZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXAoJmNhcmQtPm1pZGkub3Blbl9zZW0pOworICAgICAgICAgICAgICAgIGludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPm1pZGkub3Blbl93YWl0KTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgIGRvd24oJmNhcmQtPm1pZGkub3Blbl9zZW0pOworICAgICAgICB9CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKCEoY2FyZC0+bWlkaS5vcGVuX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkpIHsKKyAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlyZCA9IGNhcmQtPm1pZGkuaXdyID0gY2FyZC0+bWlkaS5pY250ID0gMDsKKyAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9yZCA9IGNhcmQtPm1pZGkub3dyID0gY2FyZC0+bWlkaS5vY250ID0gMDsKKyAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlyZCA9IGNhcmQtPm1pZGkuaXdyID0gY2FyZC0+bWlkaS5pY250ID0gMDsKKyAgICAgICAgICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIDB4MDAwMDAwMGYpOyAgICAgICAgICAgIC8qIEVuYWJsZSB4bWl0LCByY3YuICovCisgICAgICAgICAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0hJQ1IsIEhJQ1JfSUVWIHwgSElDUl9DSEdNKTsgICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pcmQgPSBjYXJkLT5taWRpLml3ciA9IGNhcmQtPm1pZGkuaWNudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vcmQgPSBjYXJkLT5taWRpLm93ciA9IGNhcmQtPm1pZGkub2NudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bWlkaS5sb2NrLCBmbGFncyk7CisgICAgICAgIGNhcmQtPm1pZGkub3Blbl9tb2RlIHw9IChmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSk7CisgICAgICAgIHVwKCZjYXJkLT5taWRpLm9wZW5fc2VtKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjc19taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgdW5zaWduZWQgY291bnQsIHRtbzsKKworICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKyAgICAgICAgICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmY2FyZC0+bWlkaS5vd2FpdCwgJndhaXQpOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gY2FyZC0+bWlkaS5vY250OworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bWlkaS5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgdG1vID0gKGNvdW50ICogSFopIC8gMzEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyA6IDEpICYmIHRtbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgImNzNDZ4eDogbWlkaSB0aW1lZCBvdXQ/P1xuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZjYXJkLT5taWRpLm93YWl0LCAmd2FpdCk7CisgICAgICAgICAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisgICAgICAgIH0KKyAgICAgICAgZG93bigmY2FyZC0+bWlkaS5vcGVuX3NlbSk7CisgICAgICAgIGNhcmQtPm1pZGkub3Blbl9tb2RlICY9ICh+KGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSk7CisgICAgICAgIHVwKCZjYXJkLT5taWRpLm9wZW5fc2VtKTsKKyAgICAgICAgd2FrZV91cCgmY2FyZC0+bWlkaS5vcGVuX3dhaXQpOworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqICAgTWlkaSBmaWxlIG9wZXJhdGlvbnMgc3RydWN0LgorICovCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3NfbWlkaV9mb3BzID0geworCUNTX09XTkVSCUNTX1RISVNfTU9EVUxFCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gY3NfbWlkaV9yZWFkLAorCS53cml0ZQkJPSBjc19taWRpX3dyaXRlLAorCS5wb2xsCQk9IGNzX21pZGlfcG9sbCwKKwkub3BlbgkJPSBjc19taWRpX29wZW4sCisJLnJlbGVhc2UJPSBjc19taWRpX3JlbGVhc2UsCit9OworCisvKgorICoKKyAqIENvcHlTYW1wbGVzIGNvcGllcyAxNi1iaXQgc3RlcmVvIHNpZ25lZCBzYW1wbGVzIGZyb20gdGhlIHNvdXJjZSB0byB0aGUKKyAqIGRlc3RpbmF0aW9uLCBwb3NzaWJseSBjb252ZXJ0aW5nIGRvd24gdG8gdW5zaWduZWQgOC1iaXQgYW5kL29yIG1vbm8uCisgKiBjb3VudCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgdG8gd3JpdGUuCisgKgorICogIEFyZ3VtZW50czoKKyAqCisgKiAgZHN0ICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqICBzcmMgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGEgc291cmNlIGJ1ZmZlcgorICogIGNvdW50ICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgKiAgZm10ICAgICAgICAgICAgIC0gQ1NfRk1UXzE2QklUIGFuZC9vciBDU19GTVRfU1RFUkVPIGJpdHMKKyAqICBkbWFidWYgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkbWEgYnVmZmVyIHN0cnVjdHVyZQorICoKKyAqIE5PVEVTOiBvbmx5IGNhbGwgdGhpcyByb3V0aW5lIGlmIHRoZSBvdXRwdXQgZGVzaXJlZCBpcyBub3QgMTYgU2lnbmVkIFN0ZXJlbworICogCQorICoKKyAqLworc3RhdGljIHZvaWQgQ29weVNhbXBsZXMoY2hhciAqZHN0LCBjaGFyICpzcmMsIGludCBjb3VudCwgdW5zaWduZWQgZm10LCAKKwkJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmKQoreworCisgICAgczMyIHMzMkF1ZGlvU2FtcGxlOworICAgIHMxNiAqcHNTcmM9KHMxNiAqKXNyYzsKKyAgICBzMTYgKnBzRHN0PShzMTYgKilkc3Q7CisgICAgdTggKnB1Y0RzdD0odTggKilkc3Q7CisKKyAgICBDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogQ29weVNhbXBsZXMoKSsgIikgKTsKKyAgICBDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPCisJIiBkc3Q9JXAgc3JjPSVwIGNvdW50PSVkIGZtdD0weCV4XG4iLAorCWRzdCxzcmMsY291bnQsZm10KSApOworCisgICAgLyoKKyAgICAgKiBTZWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhcyA4LWJpdCB1bnNpZ25lZCBzdGVyZW8uCisgICAgICovCisgICAgaWYoKGZtdCAmIENTX0ZNVF9TVEVSRU8pICYmICEoZm10ICYgQ1NfRk1UXzE2QklUKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZWFjaCAxNi1iaXQgc2lnbmVkIHN0ZXJlbyBzYW1wbGUgdG8gOC1iaXQgdW5zaWduZWQgCisJICogc3RlcmVvIHVzaW5nIHJvdW5kaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHNTcmMgPSAoczE2ICopc3JjOworCWNvdW50ID0gY291bnQvMjsKKyAgICAgICAgd2hpbGUoY291bnQtLSkKKyAgICAgICAgeworICAgICAgICAgICAgKihwdWNEc3QrKykgPSAodTgpKCgoczE2KSgqcHNTcmMrKykgKyAoczE2KTB4ODAwMCkgPj4gOCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBTZWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhdCA4LWJpdCB1bnNpZ25lZCBtb25vLgorICAgICAqLworICAgIGVsc2UgaWYoIShmbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAhKGZtdCAmIENTX0ZNVF8xNkJJVCkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb252ZXJ0IGVhY2ggMTYtYml0IHNpZ25lZCBzdGVyZW8gc2FtcGxlIHRvIDgtYml0IHVuc2lnbmVkIAorCSAqIG1vbm8gdXNpbmcgYXZlcmFnaW5nIGFuZCByb3VuZGluZy4KKyAgICAgICAgICovCisgICAgICAgIHBzU3JjID0gKHMxNiAqKXNyYzsKKwljb3VudCA9IGNvdW50LzI7CisgICAgICAgIHdoaWxlKGNvdW50LS0pCisgICAgICAgIHsKKwkgICAgczMyQXVkaW9TYW1wbGUgPSAoKCpwc1NyYykrKCoocHNTcmMgKyAxKSkpLzIgKyAoczMyKTB4ODA7CisJICAgIGlmKHMzMkF1ZGlvU2FtcGxlID4gMHg3ZmZmKQorCSAgICAJczMyQXVkaW9TYW1wbGUgPSAweDdmZmY7CisgICAgICAgICAgICAqKHB1Y0RzdCsrKSA9ICh1OCkoKChzMTYpczMyQXVkaW9TYW1wbGUgKyAoczE2KTB4ODAwMCkgPj4gOCk7CisJICAgIHBzU3JjICs9IDI7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBTZWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhdCAxNi1iaXQgc2lnbmVkIG1vbm8uCisgICAgICovCisgICAgZWxzZSBpZighKGZtdCAmIENTX0ZNVF9TVEVSRU8pICYmIChmbXQgJiBDU19GTVRfMTZCSVQpKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCBlYWNoIDE2LWJpdCBzaWduZWQgc3RlcmVvIHNhbXBsZSB0byAxNi1iaXQgc2lnbmVkIAorCSAqIG1vbm8gdXNpbmcgYXZlcmFnaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHNTcmMgPSAoczE2ICopc3JjOworCWNvdW50ID0gY291bnQvMjsKKyAgICAgICAgd2hpbGUoY291bnQtLSkKKyAgICAgICAgeworICAgICAgICAgICAgKihwc0RzdCsrKSA9IChzMTYpKCgqcHNTcmMpKygqKHBzU3JjICsgMSkpKS8yOworCSAgICBwc1NyYyArPSAyOworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogY3NfY29weV90b191c2VyKCkKKyAqIHJlcGxhY2VtZW50IGZvciB0aGUgc3RhbmRhcmQgY29weV90b191c2VyLCB0byBhbGxvdyBmb3IgYSBjb252ZXJzaW9uIGZyb20KKyAqIDE2IGJpdCB0byA4IGJpdCBhbmQgZnJvbSBzdGVyZW8gdG8gbW9ubywgaWYgdGhlIHJlY29yZCBjb252ZXJzaW9uIGlzIGFjdGl2ZS4gIAorICogVGhlIGN1cnJlbnQgQ1M0Nnh4L0NTNDI4MCBzdGF0aWMgaW1hZ2Ugb25seSByZWNvcmRzIGluIDE2Yml0IHVuc2lnbmVkIFN0ZXJlbywgCisgKiBzbyB3ZSBjb252ZXJ0IGZyb20gYW55IG9mIHRoZSBvdGhlciBmb3JtYXQgY29tYmluYXRpb25zLgorICovCitzdGF0aWMgdW5zaWduZWQgY3NfY29weV90b191c2VyKAorCXN0cnVjdCBjc19zdGF0ZSAqcywgCisJdm9pZCBfX3VzZXIgKmRlc3QsIAorCXZvaWQgKmh3c3JjLCAKKwl1bnNpZ25lZCBjbnQsIAorCXVuc2lnbmVkICpjb3BpZWQpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnMtPmRtYWJ1ZjsKKwl2b2lkICpzcmMgPSBod3NyYzsgIC8qIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGRlc3RpbmF0aW9uIGJ1ZmZlciBhZGRyICovCisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDYsIHByaW50ayhLRVJOX0lORk8gCisJCSJjc19jb3B5X3RvX3VzZXIoKSsgZm10PTB4JXggY250PSVkIGRlc3Q9JXBcbiIsCisJCWRtYWJ1Zi0+Zm10LCh1bnNpZ25lZCljbnQsZGVzdCkgKTsKKworCWlmKGNudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKKwl7CisJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKKwl9CisJaWYoIWNudCkKKwl7CisJCSpjb3BpZWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYoZG1hYnVmLT5kaXZpc29yICE9IDEpCisJeworCQlpZighZG1hYnVmLT50bXBidWZmKQorCQl7CisJCQkqY29waWVkID0gY250L2RtYWJ1Zi0+ZGl2aXNvcjsKKwkJCXJldHVybiAwOworCQl9CisKKwkJQ29weVNhbXBsZXMoKGNoYXIgKilkbWFidWYtPnRtcGJ1ZmYsIChjaGFyICopaHdzcmMsIGNudCwgCisJCQlkbWFidWYtPmZtdCwgZG1hYnVmKTsKKwkJc3JjID0gZG1hYnVmLT50bXBidWZmOworCQljbnQgPSBjbnQvZG1hYnVmLT5kaXZpc29yOworCX0KKyAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihkZXN0LCBzcmMsIGNudCkpCisJeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0VSUiAKKwkJCSJjczQ2eHg6IGNzX2NvcHlfdG9fdXNlcigpLSBmYXVsdCBkZXN0PSVwIHNyYz0lcCBjbnQ9JWRcbiIsCisJCQkJZGVzdCxzcmMsY250KSApOworCQkqY29waWVkID0gMDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCSpjb3BpZWQgPSBjbnQ7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0Nnh4OiBjc19jb3B5X3RvX3VzZXIoKS0gY29waWVkIGJ5dGVzIGlzICVkIFxuIixjbnQpICk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB3YWl0aW5nIHRvIGJlIGNvcGllZCB0bworICAgdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCBkcmFpbmVkIGJ5IHRoaXMgbG9vcC4gKi8KK3N0YXRpYyBzc2l6ZV90IGNzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwlzc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCXVuc2lnbmVkIGNvcGllZD0wOworCisJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCB8IENTX0ZVTkNUSU9OLCA0LCAKKwkJcHJpbnRrKCJjczQ2eHg6IGNzX3JlYWQoKSsgJXpkXG4iLGNvdW50KSApOworCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwlpZighc3RhdGUpCisJCXJldHVybiAtRU5PREVWOworCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCisJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCQorCWRvd24oJnN0YXRlLT5zZW0pOworCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gX19wcm9nX2RtYWJ1ZihzdGF0ZSkpKQorCQlnb3RvIG91dDI7CisKKwlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQl3aGlsZSghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQorCQl7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYoIXJldCkgcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOworCQlpZiAoZG1hYnVmLT5jb3VudCA8IGNudCkKKwkJCWNudCA9IGRtYWJ1Zi0+Y291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY250ID4gKGNvdW50ICogZG1hYnVmLT5kaXZpc29yKSkKKwkJCWNudCA9IGNvdW50ICogZG1hYnVmLT5kaXZpc29yOworCQlpZiAoY250IDw9IDApIHsKKwkJCS8qIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCB3YWl0IGZvciBkYXRhIHRvIGJlCisJCQkgICByZWNvcmRlZCAqLworCQkJc3RhcnRfYWRjKHN0YXRlKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KSByZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gb3V0OworIAkJCX0KKwkJCXVwKCZzdGF0ZS0+c2VtKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZighcmV0KSByZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlkb3duKCZzdGF0ZS0+c2VtKTsKKwkJCWlmIChkbWFidWYtPm1hcHBlZCkgCisJCQl7CisJCQkJaWYoIXJldCkKKwkJCQkJcmV0ID0gLUVOWElPOworCQkJCWdvdG8gb3V0OworCQkJfQorIAkJCWNvbnRpbnVlOworCQl9CisKKwkJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJfcmVhZCgpIGNvcHlfdG8gY250PSVkIGNvdW50PSV6ZCAiLCBjbnQsY291bnQpICk7CisJCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDgsIHByaW50ayhLRVJOX0lORk8gCisJCQkiIC5kbWFzaXplPSVkIC5jb3VudD0lZCBidWZmZXI9JXAgcmV0PSV6ZFxuIiwKKwkJCWRtYWJ1Zi0+ZG1hc2l6ZSxkbWFidWYtPmNvdW50LGJ1ZmZlcixyZXQpICk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3NfY29weV90b191c2VyKHN0YXRlLCBidWZmZXIsIAorCQkJKGNoYXIgKilkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBjbnQsICZjb3BpZWQpKQorCQl7CisJCQlpZiAoIXJldCkgcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisgICAgICAgICAgICAgICAgc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgZG1hYnVmLT5kbWFzaXplOworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgZG1hYnVmLT5zd3B0ciA9IHN3cHRyOworICAgICAgICAgICAgICAgIGRtYWJ1Zi0+Y291bnQgLT0gY250OworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBjb3VudCAtPSBjb3BpZWQ7CisgICAgICAgICAgICAgICAgYnVmZmVyICs9IGNvcGllZDsKKyAgICAgICAgICAgICAgICByZXQgKz0gY29waWVkOworICAgICAgICAgICAgICAgIHN0YXJ0X2FkYyhzdGF0ZSk7CisJfQorb3V0OgorCXJlbW92ZV93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKK291dDI6CisJdXAoJnN0YXRlLT5zZW0pOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCB8IENTX0ZVTkNUSU9OLCA0LCAKKwkJcHJpbnRrKCJjczQ2eHg6IGNzX3JlYWQoKS0gJXpkXG4iLHJldCkgKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyB0byBiZSBkbWEgdG8KKyAgIHRoZSBzb3VuZGNhcmQuICBpdCBpcyBkcmFpbmVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgZmlsbGVkIGJ5IHRoaXMgbG9vcC4gKi8KK3N0YXRpYyBzc2l6ZV90IGNzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCisJQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUgfCBDU19GVU5DVElPTiwgNCwKKwkJcHJpbnRrKCJjczQ2eHg6IGNzX3dyaXRlIGNhbGxlZCwgY291bnQgPSAlemRcbiIsIGNvdW50KSApOworCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwlpZighc3RhdGUpCisJCXJldHVybiAtRU5PREVWOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisKKwlkb3duKCZzdGF0ZS0+c2VtKTsKKwlpZiAoZG1hYnVmLT5tYXBwZWQpCisJeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gX19wcm9nX2RtYWJ1ZihzdGF0ZSkpKQorCQlnb3RvIG91dDsKKwlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7CisJcmV0ID0gMDsKKy8qCisqIFN0YXJ0IHRoZSBsb29wIHRvIHJlYWQgZnJvbSB0aGUgdXNlcidzIGJ1ZmZlciBhbmQgd3JpdGUgdG8gdGhlIGRtYSBidWZmZXIuCisqIGNoZWNrIGZvciBQTSBldmVudHMgYW5kIHVuZGVycnVuL292ZXJydW4gaW4gdGhlIGxvb3AuCisqLworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJd2hpbGUoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKKwkJeworCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmKCFyZXQpIHJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CisJCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gc2xlZXBfb25fdGltZW91dCwKKwkJCSAgIHJlc3luYyBod3B0ciBhbmQgc3dwdHIgKi8KKwkJCWRtYWJ1Zi0+Y291bnQgPSAwOworCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCX0KKwkJaWYgKGRtYWJ1Zi0+dW5kZXJydW4pCisJCXsKKwkJCWRtYWJ1Zi0+dW5kZXJydW4gPSAwOworCQkJZG1hYnVmLT5od3B0ciA9IGNzX2dldF9kbWFfYWRkcihzdGF0ZSk7CisJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwkJfQorCisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisJCWlmIChkbWFidWYtPmNvdW50ICsgY250ID4gZG1hYnVmLT5kbWFzaXplKQorCQkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kIHdhaXQgZm9yIGRhdGEgdG8gYmUKKwkJCSAgIHBsYXllZCAqLworCQkJc3RhcnRfZGFjKHN0YXRlKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KSByZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gb3V0OworIAkJCX0KKwkJCXVwKCZzdGF0ZS0+c2VtKTsKKwkJCXNjaGVkdWxlKCk7CisgCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYoIXJldCkgcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0OworIAkJCX0KKwkJCWRvd24oJnN0YXRlLT5zZW0pOworCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQkJeworCQkJCWlmKCFyZXQpCisJCQkJCXJldCA9IC1FTlhJTzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKyAJCQljb250aW51ZTsKKyAJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgY250KSkgeworCQkJaWYgKCFyZXQpIHJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgZG1hYnVmLT5kbWFzaXplOworCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CisJCWRtYWJ1Zi0+Y291bnQgKz0gY250OworCQlpZihkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSB8IENTX0VSUk9SLCAyLCBwcmludGsoCisJCQkgICAgImNzNDZ4eDogY3Nfd3JpdGUoKSBkLT5jb3VudCA+IGRtYXNpemUgLSByZXNldHRpbmdcbiIpKTsKKwkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CisJCX0KKwkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCXN0YXJ0X2RhYyhzdGF0ZSk7CisJfQorb3V0OgorCXVwKCZzdGF0ZS0+c2VtKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCUNTX0RCR09VVChDU19XQVZFX1dSSVRFIHwgQ1NfRlVOQ1RJT04sIDIsIAorCQlwcmludGsoImNzNDZ4eDogY3Nfd3JpdGUoKS0gcmV0PSV6ZFxuIiwgcmV0KSApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3NfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19wb2xsKCkrIFxuIikpOworCWlmICghKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQpKSkKKwl7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJeworCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKKwkJaWYoc3RhdGUpCisJCXsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCXsKKwkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07CisJCWlmKHN0YXRlKQorCQl7CisJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19GQUxTRSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07CisJCWlmKHN0YXRlKQorCQl7CisJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0KKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCQlpZihzdGF0ZSkKKwkJeworCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKWRtYWJ1Zi0+ZnJhZ3NpemUpCisJCQkJICAgIG1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCQl9IGVsc2UgeworCQkJCWlmICgoc2lnbmVkKWRtYWJ1Zi0+ZG1hc2l6ZSA+PSBkbWFidWYtPmNvdW50IAorCQkJCQkrIChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQkgICAgbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19wb2xsKCktICgweCV4KSBcbiIsCisJCW1hc2spKTsKKwlyZXR1cm4gbWFzazsKK30KKworLyoKKyAqCVdlIGxldCB1c2VycyBtbWFwIHRoZSByaW5nIGJ1ZmZlci4gSXRzIG5vdCB0aGUgcmVhbCBETUEgYnVmZmVyIGJ1dAorICoJdGhhdCBzaWRlIG9mIHRoZSBjb2RlIGlzIGhpZGRlbiBpbiB0aGUgSVJRIGhhbmRsaW5nLiBXZSBkbyBhIHNvZnR3YXJlCisgKgllbXVsYXRpb24gb2YgRE1BIGZyb20gYSA2NEsgb3Igc28gYnVmZmVyIGludG8gYSAySyBGSUZPLiAKKyAqCSh0aGUgaGFyZHdhcmUgcHJvYmFibHkgZGVzZXJ2ZXMgYSBtb2FuIGhlcmUgYnV0IENyeXN0YWwgc2VuZCBtZSBuaWNlCisgKgl0b3lzIDspKS4KKyAqLworIAorc3RhdGljIGludCBjc19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19QQVJNUywgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX21tYXAoKSsgZmlsZT0lcCAlcyAlc1xuIiwgCisJCWZpbGUsIHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSA/ICJWTV9XUklURSIgOiAiIiwKKwkJdm1hLT52bV9mbGFncyAmIFZNX1JFQUQgPyAiVk1fUkVBRCIgOiAiIikgKTsKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07CisJCWlmKHN0YXRlKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfT1BFTiwgMiwgcHJpbnRrKAorCQkJICAiY3M0Nnh4OiBjc19tbWFwKCkgVk1fV1JJVEUgLSBzdGF0ZSBUUlVFIHByb2dfZG1hYnVmIERBQ1xuIikgKTsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCQlpZihzdGF0ZSkKKwkJeworCQkJQ1NfREJHT1VUKENTX09QRU4sIDIsIHByaW50aygKKwkJCSAgImNzNDZ4eDogY3NfbW1hcCgpIFZNX1JFQUQgLSBzdGF0ZSBUUlVFIHByb2dfZG1hYnVmIEFEQ1xuIikgKTsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50aygKKwkJICAiY3M0Nnh4OiBjc19tbWFwKCkgcmV0dXJuIC1FSU5WQUxcbiIpICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworLyoKKyAqIEZvciBub3cgT05MWSBzdXBwb3J0IHBsYXliYWNrLCBidXQgc2VlbXMgbGlrZSB0aGUgb25seSB3YXkgdG8gdXNlCisgKiBtbWFwKCkgaXMgdG8gb3BlbiBhbiBGRCB3aXRoIFJEV1IsIGp1c3QgcmVhZCBvciBqdXN0IHdyaXRlIGFjY2VzcworICogZG9lcyBub3QgZnVuY3Rpb24sIGdldCBhbiBlcnJvciBiYWNrIGZyb20gdGhlIGtlcm5lbC4KKyAqIEFsc28sIFF1YWtlSUlJIG9wZW5zIHdpdGggUkRXUiEgIFNvLCB0aGVyZSBtdXN0IGJlIHNvbWV0aGluZworICogdG8gbmVlZGluZyByZWFkL3dyaXRlIGFjY2VzcyBtYXBwaW5nLiAgU28sIGFsbG93IHJlYWQvd3JpdGUgYnV0IAorICogdXNlIHRoZSBEQUMgb25seS4KKyAqLworCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOyAgCisJaWYgKCFzdGF0ZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlkb3duKCZzdGF0ZS0+c2VtKTsJCisJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJaWYgKGNzNHhfcGdvZmYodm1hKSAhPSAwKQorCXsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisKKwlDU19EQkdPVVQoQ1NfUEFSTVMsIDIsIHByaW50aygiY3M0Nnh4OiBjc19tbWFwKCk6IHNpemU9JWRcbiIsKHVuc2lnbmVkKXNpemUpICk7CisKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikpCisJeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZpcnRfdG9fcGh5cyhkbWFidWYtPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCXsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCWRtYWJ1Zi0+bWFwcGVkID0gMTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX21tYXAoKS1cbiIpICk7CitvdXQ6CisJdXAoJnN0YXRlLT5zZW0pOworCXJldHVybiByZXQ7CQorfQorCitzdGF0aWMgaW50IGNzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1Zj1OVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYXVkaW9fYnVmX2luZm8gYWJpbmZvOworCWNvdW50X2luZm8gY2luZm87CisJaW50IHZhbCwgdmFsc2F2ZSwgbWFwcGVkLCByZXQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJaWYoc3RhdGUpCisJeworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJbWFwcGVkID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIGRtYWJ1Zi0+bWFwcGVkOworCX0KKwlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJaWYoc3RhdGUpCisJeworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJbWFwcGVkIHw9IChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgZG1hYnVmLT5tYXBwZWQ7CisJfQorCQkKKyNpZiBDU0RFQlVHCisJcHJpbnRpb2N0bChjbWQpOworI2VuZGlmCisKKwlzd2l0Y2ggKGNtZCkgCisJeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJLyogRklYTUU6IHNwaW5fbG9jayA/ICovCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQkJaWYoc3RhdGUpCisJCQl7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJCXN5bmNocm9uaXplX2lycShjYXJkLT5pcnEpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOworCQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJCQlkbWFidWYtPmJsb2NrcyA9IDA7CisJCQkJZG1hYnVmLT5TR29rID0gMDsKKwkJCX0KKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQkJaWYoc3RhdGUpCisJCQl7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJCXN5bmNocm9uaXplX2lycShjYXJkLT5pcnEpOworCQkJCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOworCQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJCQlkbWFidWYtPmJsb2NrcyA9IDA7CisJCQkJZG1hYnVmLT5TR29rID0gMDsKKwkJCX0KKwkJfQorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfUkVTRVQoKS1cbiIpICk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6IC8qIHNldCBzYW1wbGUgcmF0ZSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQkJCWlmKHN0YXRlKQorCQkJCXsKKwkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCWRtYWJ1Zi0+U0dvayA9IDA7CisJCQkJCWNzX3NldF9hZGNfcmF0ZShzdGF0ZSwgdmFsKTsKKwkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCQkJaWYoc3RhdGUpCisJCQkJeworCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQkJZG1hYnVmLT5TR29rID0gMDsKKwkJCQkJY3Nfc2V0X2RhY19yYXRlKHN0YXRlLCB2YWwpOworCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOworCQkJCX0KKwkJCX0KKwkJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoCisJCQkgICAgImNzNDZ4eDogY3NfaW9jdGwoKSBEU1BfU1BFRUQgJXMgJXMgJWRcbiIsCisJCQkJZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgPyAiREFDIiA6ICIiLAorCQkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiQURDIiA6ICIiLAorCQkJCWRtYWJ1Zi0+cmF0ZSApICk7CisJCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOiAvKiBzZXQgc3RlcmVvIG9yIG1vbm8gY2hhbm5lbCAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwkJCWlmKHN0YXRlKQorCQkJeworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQlkbWFidWYtPlNHb2sgPSAwOworCQkJCWlmKHZhbCkKKwkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKKwkJCQllbHNlCisJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOworCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKKwkJCQkgICAgImNzNDZ4eDogRFNQX1NURVJFTygpIERBQyAlc1xuIiwKKwkJCQkgICAgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPworCQkJCQkiU1RFUkVPIjoiTU9OTyIpICk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwkJCWlmKHN0YXRlKQorCQkJeworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQlkbWFidWYtPlNHb2sgPSAwOworCQkJCWlmKHZhbCkKKwkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKKwkJCQllbHNlCisJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOworCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKKwkJCQkgICAgImNzNDZ4eDogRFNQX1NURVJFTygpIEFEQyAlc1xuIiwKKwkJCQkgICAgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPworCQkJCQkiU1RFUkVPIjoiTU9OTyIpICk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCisJCQkJCXJldHVybiB2YWw7CisJCQkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+ZnJhZ3NpemUsIHApOworCQkJfQorCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCisJCQkJCXJldHVybiB2YWw7CisJCQkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+ZnJhZ3NpemUvZG1hYnVmLT5kaXZpc29yLCAKKwkJCQkJCXApOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCovCisJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSB8IEFGTVRfVTgsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0IHNhbXBsZSBmb3JtYXQgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKKwkJICAgICJjczQ2eHg6IGNzX2lvY3RsKCkgRFNQX1NFVEZNVCAlcyAlcyAlcyAlc1xuIiwKKwkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFID8gIkRBQyIgOiAiIiwKKwkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiQURDIiA6ICIiLAorCQkJdmFsID09IEFGTVRfUzE2X0xFID8gIjE2Qml0IFNpZ25lZCIgOiAiIiwKKwkJCXZhbCA9PSBBRk1UX1U4ID8gIjhCaXQgVW5zaWduZWQiIDogIiIpICk7CisJCXZhbHNhdmUgPSB2YWw7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYodmFsPT1BRk1UX1MxNl9MRSB8fCB2YWw9PUFGTVRfVTgpCisJCQl7CisJCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwkJCQkJaWYoc3RhdGUpCisJCQkJCXsKKwkJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCQlkbWFidWYtPlNHb2sgPSAwOworCQkJCQkJaWYodmFsPT1BRk1UX1MxNl9MRSkKKwkJCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfMTZCSVQ7CisJCQkJCQllbHNlCisJCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF8xNkJJVDsKKwkJCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7CisJCQkJCQlpZigocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKKwkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQl9CisJCQkJfQorCQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJCXZhbCA9IHZhbHNhdmU7CisJCQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwkJCQkJaWYoc3RhdGUpCisJCQkJCXsKKwkJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCQlkbWFidWYtPlNHb2sgPSAwOworCQkJCQkJaWYodmFsPT1BRk1UX1MxNl9MRSkKKwkJCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfMTZCSVQ7CisJCQkJCQllbHNlCisJCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF8xNkJJVDsKKwkJCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7CisJCQkJCQlpZigocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKKwkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX0VSUk9SLCAyLCBwcmludGsoCisJCQkJICAgICJjczQ2eHg6IERTUF9TRVRGTVQoKSBVbnN1cHBvcnRlZCBmb3JtYXQgKDB4JXgpXG4iLAorCQkJCQl2YWxzYXZlKSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQl7CisJCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQkJCWlmKHN0YXRlKQorCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCX0KKwkJCWVsc2UgaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXsKKwkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCQkJaWYoc3RhdGUpCisJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJfQorCQl9CisJCWlmKGRtYWJ1ZikKKwkJeworCQkJaWYoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpCisJCQkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFLCBwKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9VOCwgcCk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwkJCQlpZihzdGF0ZSkKKwkJCQl7CisJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCQlkbWFidWYtPlNHb2sgPSAwOworCQkJCQlpZih2YWw+MSkKKwkJCQkJCWRtYWJ1Zi0+Zm10IHw9IENTX0ZNVF9TVEVSRU87CisJCQkJCWVsc2UKKwkJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOworCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOworCQkJCQlpZiAocHJvZ19kbWFidWYoc3RhdGUpKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCQkJaWYoc3RhdGUpCisJCQkJeworCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQkJZG1hYnVmLT5TR29rID0gMDsKKwkJCQkJaWYodmFsPjEpCisJCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfU1RFUkVPOworCQkJCQllbHNlCisJCQkJCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX1NURVJFTzsKKwkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKKwkJCQkJaWYgKHByb2dfZG1hYnVmKHN0YXRlKSkKKwkJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPyAyIDogMSwKKwkJCQlwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQkvKgorCQkgKiBUaGVyZSB3aWxsIGJlIGEgbG9uZ2VyIHRoYW4gbm9ybWFsIHBhdXNlIGluIHRoZSBkYXRhLgorCQkgKiBzby4uLiBkbyBub3RoaW5nLCBiZWNhdXNlIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCB3ZSBjYW4gZG8uCisJCSAqLworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQkJaWYoc3RhdGUpCisJCQl7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJaWYgKGRtYWJ1Zi0+c3ViZGl2aXNpb24pCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSB2YWw7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwkJCWlmKHN0YXRlKQorCQkJeworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCWlmIChkbWFidWYtPnN1YmRpdmlzaW9uKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gdmFsOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQkJaWYoc3RhdGUpCisJCQl7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJfQorCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCQlkbWFidWYtPm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQlpZihzdGF0ZSkKKwkJeworCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7CisJCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplOworCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CisJCS8qCisJCSAqIGZvciBtbWFwIHdlIGFsd2F5cyBoYXZlIHRvdGFsIHNwYWNlIGF2YWlsYWJsZQorCQkgKi8KKwkJCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJCQlhYmluZm8uYnl0ZXMgPSBkbWFidWYtPmRtYXNpemU7CisJCQllbHNlCisJCQkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKworCQkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCQl9CisJCXJldHVybiAtRU5PREVWOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQlpZihzdGF0ZSkKKwkJeworCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7CisJCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplL2RtYWJ1Zi0+ZGl2aXNvcjsKKwkJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+Y291bnQvZG1hYnVmLT5kaXZpc29yOworCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CisJCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisJCX0KKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUV8RFNQX0NBUF9UUklHR0VSfERTUF9DQVBfTU1BUCwKKwkJCSAgICBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfR0VUVFJJR0dFUigpK1xuIikgKTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQl7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlpZihkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQkJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwkJCX0KKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJeworCQkJaWYoc3RhdGUpCisJCQl7CisJCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCWlmKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCisJCQkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJCX0KKwkJfQorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfR0VUVFJJR0dFUigpLSB2YWw9MHgleFxuIix2YWwpICk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCQlzdGFydF9hZGMoc3RhdGUpOworCQkJCX0gZWxzZQorCQkJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJc3RhcnRfZGFjKHN0YXRlKTsKKwkJCQl9IGVsc2UKKwkJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwkJaWYoc3RhdGUpCisJCXsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOworCQkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzL2RtYWJ1Zi0+ZGl2aXNvcjsKKwkJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQvZG1hYnVmLT5kaXZpc29yID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQkJY2luZm8ucHRyID0gZG1hYnVmLT5od3B0ci9kbWFidWYtPmRpdmlzb3I7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwkJaWYoc3RhdGUpCisJCXsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOworCQkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOworCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQkJeworCQkJCWNpbmZvLmJsb2NrcyA9IChjaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdCkgCisJCQkJCQkJLSBkbWFidWYtPmJsb2NrczsKKwkJCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDgsIAorCQkJCQlwcmludGsoInRvdGFsX2J5dGVzPSVkIGJsb2Nrcz0lZCBkbWFidWYtPmJsb2Nrcz0lZFxuIiwgCisJCQkJCWNpbmZvLmJ5dGVzLGNpbmZvLmJsb2NrcyxkbWFidWYtPmJsb2NrcykgKTsKKwkJCQlkbWFidWYtPmJsb2NrcyA9IGNpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CisJCQl9CisJCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCisJCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50aygKKwkJCSAgICAiY3M0Nnh4OiBHRVRPUFRSIGJ5dGVzPSVkIGJsb2Nrcz0lZCBwdHI9JWRcbiIsCisJCQkJY2luZm8uYnl0ZXMsY2luZm8uYmxvY2tzLGNpbmZvLnB0cikgKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwkJaWYoc3RhdGUpCisJCXsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOworCQkJdmFsID0gZG1hYnVmLT5jb3VudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJZWxzZQorCQkJdmFsID0gMDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCWlmKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCWVsc2UgCisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCWlmKHN0YXRlKQorCQl7CisJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnJhdGUsIHApOworCQl9CisJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKwkJCisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlpZihmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQllbHNlIAorCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQlpZihzdGF0ZSkKKwkJeworCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQlyZXR1cm4gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPyAyIDogMSwKKwkJCQlwKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCWlmKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCWVsc2UgCisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCWlmKHN0YXRlKQorCQl7CisJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCXJldHVybiBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gCisJCQkgIAlBRk1UX1MxNl9MRSA6IEFGTVRfVTgsIHApOworCisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCisvKgorICoJQU1QIGNvbnRyb2wgLSBudWxsIEFNUAorICovCisgCitzdGF0aWMgdm9pZCBhbXBfbm9uZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKK3sJCit9CisKKy8qCisgKglDcnlzdGFsIEVBUEQgbW9kZQorICovCisgCitzdGF0aWMgdm9pZCBhbXBfdm95ZXRyYShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKK3sKKwkvKiBNYW5hZ2UgdGhlIEVBUEQgYml0IG9uIHRoZSBDcnlzdGFsIDQyOTcgCisJICAgYW5kIHRoZSBBbmFsb2cgQUQxODg1ICovCisJICAgCisJaW50IG9sZD1jYXJkLT5hbXBsaWZpZXI7CisJCisJY2FyZC0+YW1wbGlmaWVyKz1jaGFuZ2U7CisJaWYoY2FyZC0+YW1wbGlmaWVyICYmICFvbGQpCisJeworCQkvKiBUdXJuIHRoZSBFQVBEIGFtcCBvbiAqLworCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCAgQUM5N19QT1dFUl9DT05UUk9MLCAKKwkJCWNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgfAorCQkJCTB4ODAwMCk7CisJfQorCWVsc2UgaWYob2xkICYmICFjYXJkLT5hbXBsaWZpZXIpCisJeworCQkvKiBUdXJuIHRoZSBFQVBEIGFtcCBvZmYgKi8KKwkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgIEFDOTdfUE9XRVJfQ09OVFJPTCwgCisJCQljc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYKKwkJCQl+MHg4MDAwKTsKKwl9Cit9CisKKwkJICAgICAgIAorLyoKKyAqCUdhbWUgVGhlYXRyZSBYUCBjYXJkIC0gRUdQSU9bMl0gaXMgdXNlZCB0byBlbmFibGUgdGhlIGV4dGVybmFsIGFtcC4KKyAqLworIAorc3RhdGljIHZvaWQgYW1wX2hlcmN1bGVzKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgY2hhbmdlKQoreworCWludCBvbGQ9Y2FyZC0+YW1wbGlmaWVyOworCWlmKCFjYXJkKQorCXsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPIAorCQkJImNzNDZ4eDogYW1wX2hlcmN1bGVzKCkgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXplZC5cbiIpKTsKKwkJcmV0dXJuOworCX0KKwljYXJkLT5hbXBsaWZpZXIrPWNoYW5nZTsKKwlpZiggKGNhcmQtPmFtcGxpZmllciAmJiAhb2xkKSAmJiAhKGhlcmN1bGVzX2VncGlvX2Rpc2FibGUpKQorCXsKKwkJQ1NfREJHT1VUKENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPIAorCQkJImNzNDZ4eDogYW1wX2hlcmN1bGVzKCkgZXh0ZXJuYWwgYW1wIGVuYWJsZWRcbiIpKTsKKwkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0VHUElPRFIsIAorCQkJRUdQSU9EUl9HUE9FMik7ICAgICAvKiBlbmFibGUgRUdQSU8yIG91dHB1dCAqLworCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfRUdQSU9QVFIsIAorCQkJRUdQSU9QVFJfR1BQVDIpOyAgIC8qIG9wZW4tZHJhaW4gb24gb3V0cHV0ICovCisJfQorCWVsc2UgaWYob2xkICYmICFjYXJkLT5hbXBsaWZpZXIpCisJeworCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8gCisJCQkiY3M0Nnh4OiBhbXBfaGVyY3VsZXMoKSBleHRlcm5hbCBhbXAgZGlzYWJsZWRcbiIpKTsKKwkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0VHUElPRFIsIDApOyAvKiBkaXNhYmxlICovCisJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9FR1BJT1BUUiwgMCk7IC8qIGRpc2FibGUgKi8KKwl9Cit9CisKKy8qCisgKglIYW5kbGUgdGhlIENMS1JVTiBvbiBhIHRoaW5rcGFkLiBXZSBtdXN0IGRpc2FibGUgQ0xLUlVOIHN1cHBvcnQKKyAqCXdoZW5ldmVyIHdlIG5lZWQgdG8gYmVhdCBvbiB0aGUgY2hpcC4KKyAqCisgKglUaGUgb3JpZ2luYWwgaWRlYSBhbmQgY29kZSBmb3IgdGhpcyBoYWNrIGNvbWVzIGZyb20gRGF2aWQgS2Fpc2VyIGF0CisgKglMaW51eGNhcmUuIFBlcmhhcHMgb25lIGRheSBDcnlzdGFsIHdpbGwgZG9jdW1lbnQgdGhlaXIgY2hpcHMgd2VsbAorICoJZW5vdWdoIHRvIG1ha2UgdGhlbSB1c2VmdWwuCisgKi8KKyAKK3N0YXRpYyB2b2lkIGNsa3J1bl9oYWNrKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgY2hhbmdlKQoreworCXN0cnVjdCBwY2lfZGV2ICphY3BpX2RldjsKKwl1MTYgY29udHJvbDsKKwl1OCBwcDsKKwl1bnNpZ25lZCBsb25nIHBvcnQ7CisJaW50IG9sZD1jYXJkLT5hY3RpdmU7CisJCisJY2FyZC0+YWN0aXZlKz1jaGFuZ2U7CisJCisJYWNwaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpOworCWlmKGFjcGlfZGV2ID09IE5VTEwpCisJCXJldHVybjsJCS8qIE5vdCBhIHRoaW5rcGFkIHRoYXRzIGZvciBzdXJlICovCisKKwkvKiBGaW5kIHRoZSBjb250cm9sIHBvcnQgKi8JCQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFjcGlfZGV2LCAweDQxLCAmcHApOworCXBvcnQ9cHA8PDg7CisKKwkvKiBSZWFkIEFDUEkgcG9ydCAqLwkKKwljb250cm9sPWludyhwb3J0KzB4MTApOworCisJLyogRmxpcCBDTEtSVU4gb2ZmIHdoaWxlIHJ1bm5pbmcgKi8KKwlpZighY2FyZC0+YWN0aXZlICYmIG9sZCkKKwl7CisJCUNTX0RCR09VVChDU19QQVJNUyAsIDksIHByaW50ayggS0VSTl9JTkZPCisJCQkiY3M0Nnh4OiBjbGtydW4oKSBlbmFibGUgY2xrcnVuIC0gY2hhbmdlPSVkIGFjdGl2ZT0lZFxuIiwKKwkJCQljaGFuZ2UsY2FyZC0+YWN0aXZlKSk7CisJCW91dHcoY29udHJvbHwweDIwMDAsIHBvcnQrMHgxMCk7CisJfQorCWVsc2UgCisJeworCS8qCisJKiBzb21ldGltZXMgb24gYSByZXN1bWUgdGhlIGJpdCBpcyBzZXQsIHNvIGFsd2F5cyByZXNldCB0aGUgYml0LgorCSovCisJCUNTX0RCR09VVChDU19QQVJNUyAsIDksIHByaW50ayggS0VSTl9JTkZPCisJCQkiY3M0Nnh4OiBjbGtydW4oKSBkaXNhYmxlIGNsa3J1biAtIGNoYW5nZT0lZCBhY3RpdmU9JWRcbiIsCisJCQkJY2hhbmdlLGNhcmQtPmFjdGl2ZSkpOworCQlvdXR3KGNvbnRyb2wmfjB4MjAwMCwgcG9ydCsweDEwKTsKKwl9Cit9CisKKwkKK3N0YXRpYyBpbnQgY3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlID0gTlVMTDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworICAgICAgICB1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludCByZXQ9MDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJQ1NfREJHT1VUKENTX09QRU4gfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX29wZW4oKSsgZmlsZT0lcCAlcyAlc1xuIiwKKwkJZmlsZSwgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgPyAiRk1PREVfV1JJVEUiIDogIiIsCisJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiRk1PREVfUkVBRCIgOiAiIikgKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykKKwl7CisJCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7CisKKwkJaWYgKCEoKGNhcmQtPmRldl9hdWRpbyBeIG1pbm9yKSAmIH4weGYpKQorCQkJYnJlYWs7CisJfQorCWlmIChlbnRyeSA9PSAmY3M0Nnh4X2RldnMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghY2FyZCkgeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0Nnh4OiBjc19vcGVuKCk6IEVycm9yIC0gdW5hYmxlIHRvIGZpbmQgYXVkaW8gY2FyZCBzdHJ1Y3RcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyoKKwkgKiBoYXJkY29kZSBzdGF0ZVswXSBmb3IgY2FwdHVyZSwgWzFdIGZvciBwbGF5YmFjaworCSAqLworCWlmKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJeworCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCAyLCBwcmludGsoImNzNDZ4eDogY3Nfb3BlbigpIEZNT0RFX1JFQURcbiIpICk7CisJCWlmIChjYXJkLT5zdGF0ZXNbMF0gPT0gTlVMTCkgeworCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF0gPSAoc3RydWN0IGNzX3N0YXRlICopCisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGNzX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBjc19zdGF0ZSkpOworCQkJaW5pdF9NVVRFWCgmc3RhdGUtPnNlbSk7CisJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCWRtYWJ1Zi0+cGJ1ZiA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJCWlmKGRtYWJ1Zi0+cGJ1Zj09TlVMTCkKKwkJCXsKKwkJCQlrZnJlZShzdGF0ZSk7CisJCQkJY2FyZC0+c3RhdGVzWzBdPU5VTEw7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKKwkJCWlmKHN0YXRlLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKGNhcmQpOworCQkJCisJCWlmIChkbWFidWYtPmNoYW5uZWwgPT0gTlVMTCkgeworCQkJa2ZyZWUgKGNhcmQtPnN0YXRlc1swXSk7CisJCQljYXJkLT5zdGF0ZXNbMF0gPSBOVUxMOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQkvKiBOb3cgdHVybiBvbiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCisJCXN0YXRlLT5jYXJkID0gY2FyZDsKKwkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLDEpOworCQlzdGF0ZS0+Y2FyZC0+YW1wbGlmaWVyX2N0cmwoc3RhdGUtPmNhcmQsMSk7CisJCQorCQlpZiggKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX0FEQykpICkKKwkJeworCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCBvZiBBREMgZmFpbGVkICgweCV4KVxuIix0bXApICk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWRtYWJ1Zi0+Y2hhbm5lbC0+c3RhdGUgPSBzdGF0ZTsKKwkJLyogaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCBjaGFubmVsICovCisJCXN0YXRlLT52aXJ0ID0gMDsKKwkJc3RhdGUtPm1hZ2ljID0gQ1NfU1RBVEVfTUFHSUM7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7CisJCWluaXRfTVVURVgoJnN0YXRlLT5vcGVuX3NlbSk7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQ7CisKKwkJZG93bigmc3RhdGUtPm9wZW5fc2VtKTsKKworCQkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgZm9ybWF0LiBBY2NvcmRpbmcgdG8gT1NTIFByb2dyYW1tZXIncyBHdWlkZSAgL2Rldi9kc3AKKwkJICAgc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kCisJCSAgIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLworCisJCS8qIERlZmF1bHQgaW5wdXQgaXMgOGJpdCBtb25vICovCisJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfTUFTSzsKKwkJZG1hYnVmLT50eXBlID0gQ1NfVFlQRV9BREM7CisJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMDsKKwkJZG1hYnVmLT5vc3NtYXhmcmFncyAgPSAwOworCQlkbWFidWYtPnN1YmRpdmlzaW9uICA9IDA7CisJCWNzX3NldF9hZGNfcmF0ZShzdGF0ZSwgODAwMCk7CisJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7CisKKwkJc3RhdGUtPm9wZW5fbW9kZSB8PSBGTU9ERV9SRUFEOworCQl1cCgmc3RhdGUtPm9wZW5fc2VtKTsKKwl9CisJaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJeworCQlDU19EQkdPVVQoQ1NfT1BFTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX29wZW4oKSBGTU9ERV9XUklURVxuIikgKTsKKwkJaWYgKGNhcmQtPnN0YXRlc1sxXSA9PSBOVUxMKSB7CisJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKikKKwkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3Nfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChzdGF0ZSA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RydWN0IGNzX3N0YXRlKSk7CisJCQlpbml0X01VVEVYKCZzdGF0ZS0+c2VtKTsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJZG1hYnVmLT5wYnVmID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCQkJaWYoZG1hYnVmLT5wYnVmPT1OVUxMKQorCQkJeworCQkJCWtmcmVlKHN0YXRlKTsKKwkJCQljYXJkLT5zdGF0ZXNbMV09TlVMTDsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCQkJaWYoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCk7CisJCQkKKwkJaWYgKGRtYWJ1Zi0+Y2hhbm5lbCA9PSBOVUxMKSB7CisJCQlrZnJlZSAoY2FyZC0+c3RhdGVzWzFdKTsKKwkJCWNhcmQtPnN0YXRlc1sxXSA9IE5VTEw7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCS8qIE5vdyB0dXJuIG9uIGV4dGVybmFsIEFNUCBpZiBuZWVkZWQgKi8KKwkJc3RhdGUtPmNhcmQgPSBjYXJkOworCQlzdGF0ZS0+Y2FyZC0+YWN0aXZlX2N0cmwoc3RhdGUtPmNhcmQsMSk7CisJCXN0YXRlLT5jYXJkLT5hbXBsaWZpZXJfY3RybChzdGF0ZS0+Y2FyZCwxKTsKKworCQlpZiggKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX0RBQykpICkKKwkJeworCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCBvZiBEQUMgZmFpbGVkICgweCV4KVxuIix0bXApICk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkKKwkJZG1hYnVmLT5jaGFubmVsLT5zdGF0ZSA9IHN0YXRlOworCQkvKiBpbml0aWFsaXplIHRoZSB2aXJ0dWFsIGNoYW5uZWwgKi8KKwkJc3RhdGUtPnZpcnQgPSAxOworCQlzdGF0ZS0+bWFnaWMgPSBDU19TVEFURV9NQUdJQzsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKKwkJaW5pdF9NVVRFWCgmc3RhdGUtPm9wZW5fc2VtKTsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKworCQlkb3duKCZzdGF0ZS0+b3Blbl9zZW0pOworCisJCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzIEd1aWRlICAvZGV2L2RzcAorCQkgICBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sIHdpdGggc2FtcGxlIHJhdGUgOGtIeiBhbmQKKwkJICAgL2Rldi9kc3BXIHdpbGwgYWNjZXB0IDE2LWJpdHMgc2FtcGxlICovCisKKwkJLyogRGVmYXVsdCBvdXRwdXQgaXMgOGJpdCBtb25vLiAqLworCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX01BU0s7CisJCWRtYWJ1Zi0+dHlwZSA9IENTX1RZUEVfREFDOworCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDA7CisJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgID0gMDsKKwkJZG1hYnVmLT5zdWJkaXZpc2lvbiAgPSAwOworCQljc19zZXRfZGFjX3JhdGUoc3RhdGUsIDgwMDApOworCQljc19zZXRfZGl2aXNvcihkbWFidWYpOworCisJCXN0YXRlLT5vcGVuX21vZGUgfD0gRk1PREVfV1JJVEU7CisJCXVwKCZzdGF0ZS0+b3Blbl9zZW0pOworCQlpZigocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKKwkJCXJldHVybiByZXQ7CisJfQorCUNTX0RCR09VVChDU19PUEVOIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19vcGVuKCktIDBcbiIpICk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGNzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOworCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7CisJdW5zaWduZWQgaW50IHRtcDsKKwlDU19EQkdPVVQoQ1NfUkVMRUFTRSB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVsZWFzZSgpKyBmaWxlPSVwICVzICVzXG4iLAorCQlmaWxlLCBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSA/ICJGTU9ERV9XUklURSIgOiAiIiwKKwkJZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCA/ICJGTU9ERV9SRUFEIiA6ICIiKSApOworCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpKQorCXsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCWlmKHN0YXRlKQorCXsKKwkJaWYgKCAoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKSAmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKSBGTU9ERV9XUklURVxuIikgKTsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJY3NfY2xlYXJfdGFpbChzdGF0ZSk7CisJCQlkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJCS8qIHN0b3AgRE1BIHN0YXRlIG1hY2hpbmUgYW5kIGZyZWUgRE1BIGJ1ZmZlcnMvY2hhbm5lbHMgKi8KKwkJCWRvd24oJnN0YXRlLT5vcGVuX3NlbSk7CisJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQlkZWFsbG9jX2RtYWJ1ZihzdGF0ZSk7CisJCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jaGFubmVsLT5udW0pOworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXN0YXRlLT5kbWFidWYucGJ1Zik7CisKKwkJCS8qIHdlJ3JlIGNvdmVyZWQgYnkgdGhlIG9wZW5fc2VtICovCisJCQl1cCgmc3RhdGUtPm9wZW5fc2VtKTsKKwkJCXN0YXRlLT5jYXJkLT5zdGF0ZXNbc3RhdGUtPnZpcnRdID0gTlVMTDsKKwkJCXN0YXRlLT5vcGVuX21vZGUgJj0gKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCisJCQlpZiggKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfREFDLCBDU19GQUxTRSApKSApCisJCQl7CisJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPIAorCQkJCQkiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpIHBvd2VyZG93biBEQUMgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOworCQkJfQorCisJCQkvKiBOb3cgdHVybiBvZmYgZXh0ZXJuYWwgQU1QIGlmIG5lZWRlZCAqLworCQkJc3RhdGUtPmNhcmQtPmFtcGxpZmllcl9jdHJsKHN0YXRlLT5jYXJkLCAtMSk7CisJCQlzdGF0ZS0+Y2FyZC0+YWN0aXZlX2N0cmwoc3RhdGUtPmNhcmQsIC0xKTsKKworCQkJa2ZyZWUoc3RhdGUpOworCQl9CisJfQorCisJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07CisJaWYoc3RhdGUpCisJeworCQlpZiAoIChzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfUkVBRCkgJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKSBGTU9ERV9SRUFEXG4iKSApOworCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQlkb3duKCZzdGF0ZS0+b3Blbl9zZW0pOworCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJZGVhbGxvY19kbWFidWYoc3RhdGUpOworCQkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylzdGF0ZS0+ZG1hYnVmLnBidWYpOworCisJCQkvKiB3ZSdyZSBjb3ZlcmVkIGJ5IHRoZSBvcGVuX3NlbSAqLworCQkJdXAoJnN0YXRlLT5vcGVuX3NlbSk7CisJCQlzdGF0ZS0+Y2FyZC0+c3RhdGVzW3N0YXRlLT52aXJ0XSA9IE5VTEw7CisJCQlzdGF0ZS0+b3Blbl9tb2RlICY9ICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKworCQkJaWYoICh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0FEQywgQ1NfRkFMU0UgKSkgKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkJImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKSBwb3dlcmRvd24gQURDIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKKwkJCX0KKworCQkJLyogTm93IHR1cm4gb2ZmIGV4dGVybmFsIEFNUCBpZiBuZWVkZWQgKi8KKwkJCXN0YXRlLT5jYXJkLT5hbXBsaWZpZXJfY3RybChzdGF0ZS0+Y2FyZCwgLTEpOworCQkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLCAtMSk7CisKKwkJCWtmcmVlKHN0YXRlKTsKKwkJfQorCX0KKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWxlYXNlKCktIDBcbiIpICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50cG0oc3RydWN0IGNzX2NhcmQgKnMpCit7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInBtIHN0cnVjdDpcbiIpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiZmxhZ3M6MHgleCB1MzJDTEtDUjFfU0FWRTogMCV4IHUzMlNTUE1WYWx1ZTogMHgleFxuIiwKKwkJKHVuc2lnbmVkKXMtPnBtLmZsYWdzLHMtPnBtLnUzMkNMS0NSMV9TQVZFLHMtPnBtLnUzMlNTUE1WYWx1ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJQUExWQ3ZhbHVlOiAweCV4IHUzMlBQUlZDdmFsdWU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMlBQTFZDdmFsdWUscy0+cG0udTMyUFBSVkN2YWx1ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJGTUxWQ3ZhbHVlOiAweCV4IHUzMkZNUlZDdmFsdWU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkZNTFZDdmFsdWUscy0+cG0udTMyRk1SVkN2YWx1ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJHUElPUnZhbHVlOiAweCV4IHUzMkpTQ1RMdmFsdWU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkdQSU9SdmFsdWUscy0+cG0udTMySlNDVEx2YWx1ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJTU0NSOiAweCV4IHUzMlNSQ1NBOiAweCV4XG4iLAorCQlzLT5wbS51MzJTU0NSLHMtPnBtLnUzMlNSQ1NBKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkRhY0FTUjogMHgleCB1MzJBZGNBU1I6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkRhY0FTUixzLT5wbS51MzJBZGNBU1IpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRGFjU1I6IDB4JXggdTMyQWRjU1I6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkRhY1NSLHMtPnBtLnUzMkFkY1NSKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMk1JRENSX1NhdmU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMk1JRENSX1NhdmUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19wb3dlcmRvd246IDB4JXggX2dlbmVyYWxfcHVycG9zZSAweCV4XG4iLAorCQlzLT5wbS51MzJBQzk3X3Bvd2VyZG93bixzLT5wbS51MzJBQzk3X2dlbmVyYWxfcHVycG9zZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X21hc3Rlcl92b2x1bWU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X2hlYWRwaG9uZV92b2x1bWU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubzogMHgleFxuIiwKKwkJcy0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8pKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19wY21fb3V0X3ZvbHVtZTogMHgleFxuIiwKKwkJcy0+cG0udTMyQUM5N19wY21fb3V0X3ZvbHVtZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJkbWFidWZfc3dwdHJfcGxheTogMHgleCBkbWFidWZfY291bnRfcGxheTogJWRcbiIsCisJCXMtPnBtLmRtYWJ1Zl9zd3B0cl9wbGF5LHMtPnBtLmRtYWJ1Zl9jb3VudF9wbGF5KSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImRtYWJ1Zl9zd3B0cl9jYXB0dXJlOiAweCV4IGRtYWJ1Zl9jb3VudF9jYXB0dXJlOiAlZFxuIiwKKwkJcy0+cG0uZG1hYnVmX3N3cHRyX2NhcHR1cmUscy0+cG0uZG1hYnVmX2NvdW50X2NhcHR1cmUpKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgU3VzcGVuZCAtIHNhdmUgdGhlIGFjOTcgcmVncywgbXV0ZSB0aGUgb3V0cHV0cyBhbmQgcG93ZXIgZG93biB0aGUgcGFydC4gIAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNzNDZ4eF9hYzk3X3N1c3BlbmQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCit7CisJaW50IENvdW50LGk7CisJc3RydWN0IGFjOTdfY29kZWMgKmRldj1jYXJkLT5hYzk3X2NvZGVjWzBdOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiY3M0Nnh4OiBjczQ2eHhfYWM5N19zdXNwZW5kKCkrXG4iKSk7CisKKwlpZihjYXJkLT5zdGF0ZXNbMV0pCisJeworCQlzdG9wX2RhYyhjYXJkLT5zdGF0ZXNbMV0pOworCQlyZXN5bmNfZG1hX3B0cnMoY2FyZC0+c3RhdGVzWzFdKTsKKwl9CisJaWYoY2FyZC0+c3RhdGVzWzBdKQorCXsKKwkJc3RvcF9hZGMoY2FyZC0+c3RhdGVzWzBdKTsKKwkJcmVzeW5jX2RtYV9wdHJzKGNhcmQtPnN0YXRlc1swXSk7CisJfQorCisJZm9yKENvdW50ID0gMHgyLCBpPTA7IChDb3VudCA8PSBDUzQ2WFhfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFKQorCQkJJiYgKGkgPCBDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTKTsgCisJCUNvdW50ICs9IDIsIGkrKykKKwl7CisJCWNhcmQtPnBtLmFjOTdbaV0gPSBjc19hYzk3X2dldChkZXYsIEJBMF9BQzk3X1JFU0VUICsgQ291bnQpOworCX0KKy8qCisqIFNhdmUgdGhlIGFjOTcgdm9sdW1lIHJlZ2lzdGVycyBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IHBvd2VyZG93biBzdGF0ZS4KKyogTm93LCBtdXRlIHRoZSBhbGwgdGhlIG91dHB1dHMgKG1hc3RlciwgaGVhZHBob25lLCBhbmQgbW9ubyksIGFzIHdlbGwKKyogYXMgdGhlIFBDTSB2b2x1bWUsIGluIHByZXBhcmF0aW9uIGZvciBwb3dlcmluZyBkb3duIHRoZSBlbnRpcmUgcGFydC4KKwljYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KCBkZXYsIAorCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUpOyAKKwljYXJkLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCisJCQkodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSk7IAorCWNhcmQtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vID0gKHUzMiljc19hYzk3X2dldChkZXYsIAorCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyk7IAorCWNhcmQtPnBtLnUzMkFDOTdfcGNtX291dF92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCisJCQkodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUpOworKi8gCisvKgorKiBtdXRlIHRoZSBvdXRwdXRzCisqLworCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUsIDB4ODAwMCk7CisJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgMHg4MDAwKTsKKwljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FX01PTk8sIDB4ODAwMCk7CisJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUsIDB4ODAwMCk7CisKKy8qCisqIHNhdmUgdGhlIHJlZ2lzdGVycyB0aGF0IGNhdXNlIHBvcHMKKyovCisJY2FyZC0+cG0udTMyQUM5N19wb3dlcmRvd24gPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgKHU4KUFDOTdfUE9XRVJfQ09OVFJPTCk7IAorCWNhcmQtPnBtLnUzMkFDOTdfZ2VuZXJhbF9wdXJwb3NlID0gKHUzMiljc19hYzk3X2dldChkZXYsICh1OClCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UpOyAKKy8qCisqIEFuZCBwb3dlciBkb3duIGV2ZXJ5dGhpbmcgb24gdGhlIEFDOTcgY29kZWMuCisqIHdlbGwsIGZvciBub3csIG9ubHkgcG93ZXIgZG93biB0aGUgREFDL0FEQyBhbmQgTUlYRVIgVlJFRk9OIGNvbXBvbmVudHMuIAorKiB0cm91YmxlIHdpdGggcmVtb3ZpbmcgVlJFRi4KKyovCisJaWYoICh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8CisJCQlDU19QT1dFUl9NSVhWT04sIENTX1RSVUUgKSkgKQorCXsKKwkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJjczQ2eHg6IGNzNDZ4eF9hYzk3X3N1c3BlbmQoKSBmYWlsdXJlICgweCV4KVxuIix0bXApICk7CisJfQorCisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X2FjOTdfc3VzcGVuZCgpLVxuIikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgUmVzdW1lIC0gcG93ZXIgdXAgdGhlIHBhcnQgYW5kIHJlc3RvcmUgaXRzIHJlZ2lzdGVycy4uICAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjczQ2eHhfYWM5N19yZXN1bWUoc3RydWN0IGNzX2NhcmQgKmNhcmQpCit7CisJaW50IENvdW50LGk7CisJc3RydWN0IGFjOTdfY29kZWMgKmRldj1jYXJkLT5hYzk3X2NvZGVjWzBdOworCisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X2FjOTdfcmVzdW1lKCkrXG4iKSk7CisKKy8qCisqIEZpcnN0LCB3ZSByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiAgVGhpcworKiBjb250YWlucyB0aGUgbWljIHNlbGVjdCAobWljMSBvciBtaWMyKSBhbmQgaWYgd2UgcmVzdG9yZSB0aGlzIGFmdGVyCisqIHdlIHJlc3RvcmUgdGhlIG1pYyB2b2x1bWUvYm9vc3Qgc3RhdGUgYW5kIG1pYzIgd2FzIHNlbGVjdGVkIGF0CisqIHN1c3BlbmQgdGltZSwgd2Ugd2lsbCBlbmQgdXAgd2l0aCBhIGJyaWVmIHBlcmlvZCBvZiB0aW1lIHdoZXJlIG1pYzEKKyogaXMgc2VsZWN0ZWQgd2l0aCB0aGUgdm9sdW1lL2Jvb3N0IHNldHRpbmdzIGZvciBtaWMyLCBjYXVzaW5nCisqIGFjb3VzdGljIGZlZWRiYWNrLiAgU28gd2UgcmVzdG9yZSB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyCisqIGZpcnN0LCB0aGVyZWJ5IGdldHRpbmcgdGhlIGNvcnJlY3QgbWljIHNlbGVjdGVkIGJlZm9yZSB3ZSByZXN0b3JlCisqIHRoZSBtaWMgdm9sdW1lL2Jvb3N0LgorKi8KKwljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UsIAorCQkodTE2KWNhcmQtPnBtLnUzMkFDOTdfZ2VuZXJhbF9wdXJwb3NlKTsKKy8qCisqIE5vdywgd2hpbGUgdGhlIG91dHB1dHMgYXJlIHN0aWxsIG11dGVkLCByZXN0b3JlIHRoZSBzdGF0ZSBvZiBwb3dlcgorKiBvbiB0aGUgQUM5NyBwYXJ0LgorKi8KKwljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19QT1dFUkRPV04sICh1MTYpY2FyZC0+cG0udTMyQUM5N19wb3dlcmRvd24pOworCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOworLyoKKyogUmVzdG9yZSBqdXN0IHRoZSBmaXJzdCBzZXQgb2YgcmVnaXN0ZXJzLCBmcm9tIHJlZ2lzdGVyIG51bWJlcgorKiAweDAyIHRvIHRoZSByZWdpc3RlciBudW1iZXIgdGhhdCB1bEhpZ2hlc3RSZWdUb1Jlc3RvcmUgc3BlY2lmaWVzLgorKi8KKwlmb3IoCUNvdW50ID0gMHgyLCBpPTA7IAorCQkoQ291bnQgPD0gQ1M0NlhYX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRSkKKwkJCSYmIChpIDwgQ1M0NlhYX0FDOTdfTlVNQkVSX1JFU1RPUkVfUkVHUyk7IAorCQlDb3VudCArPSAyLCBpKyspCisJeworCQljc19hYzk3X3NldChkZXYsICh1OCkoQkEwX0FDOTdfUkVTRVQgKyBDb3VudCksICh1MTYpY2FyZC0+cG0uYWM5N1tpXSk7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBpbml0IHRoZSBhbXBsaWZpZXIgKi8KKwlpZihjYXJkLT5hbXBfaW5pdCkKKwkJY2FyZC0+YW1wX2luaXQoY2FyZCk7CisgICAgICAgIAorCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9hYzk3X3Jlc3VtZSgpLVxuIikpOworfQorCisKK3N0YXRpYyBpbnQgY3M0Nnh4X3Jlc3RhcnRfcGFydChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAorCQlwcmludGsoICJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKStcbiIpKTsKKwlpZihjYXJkLT5zdGF0ZXNbMV0pCisJeworCQlkbWFidWYgPSAmY2FyZC0+c3RhdGVzWzFdLT5kbWFidWY7CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQlyZXN5bmNfZG1hX3B0cnMoY2FyZC0+c3RhdGVzWzFdKTsKKwkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKKwkJaWYoX19wcm9nX2RtYWJ1ZihjYXJkLT5zdGF0ZXNbMV0pKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgCisJCQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKS0gKC0xKSBwcm9nX2RtYWJ1ZigpIGRhYyBlcnJvclxuIikpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWNzX3NldF9kYWNfcmF0ZShjYXJkLT5zdGF0ZXNbMV0sIGRtYWJ1Zi0+cmF0ZSk7CisJfQorCWlmKGNhcmQtPnN0YXRlc1swXSkKKwl7CisJCWRtYWJ1ZiA9ICZjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1ZjsKKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCXJlc3luY19kbWFfcHRycyhjYXJkLT5zdGF0ZXNbMF0pOworCQljc19zZXRfZGl2aXNvcihkbWFidWYpOworCQlpZihfX3Byb2dfZG1hYnVmKGNhcmQtPnN0YXRlc1swXSkpCisJCXsKKwkJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAxLCAKKwkJCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3RhcnRfcGFydCgpLSAoLTEpIHByb2dfZG1hYnVmKCkgYWRjIGVycm9yXG4iKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY3Nfc2V0X2FkY19yYXRlKGNhcmQtPnN0YXRlc1swXSwgZG1hYnVmLT5yYXRlKTsKKwl9CisJY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX1JFU1VNRUQ7CisJaWYoY2FyZC0+c3RhdGVzWzBdKQorCQlzdGFydF9hZGMoY2FyZC0+c3RhdGVzWzBdKTsKKwlpZihjYXJkLT5zdGF0ZXNbMV0pCisJCXN0YXJ0X2RhYyhjYXJkLT5zdGF0ZXNbMV0pOworCisJY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX0lETEU7CisJY2FyZC0+cG0uZmxhZ3MgJj0gfihDUzQ2WFhfUE1fU1VTUEVORElORyB8IENTNDZYWF9QTV9TVVNQRU5ERUQgCisJCQl8IENTNDZYWF9QTV9SRVNVTUlORyB8IENTNDZYWF9QTV9SRVNVTUVEKTsKKwlpZihjYXJkLT5zdGF0ZXNbMF0pCisJCXdha2VfdXAoJmNhcmQtPnN0YXRlc1swXS0+ZG1hYnVmLndhaXQpOworCWlmKGNhcmQtPnN0YXRlc1sxXSkKKwkJd2FrZV91cCgmY2FyZC0+c3RhdGVzWzFdLT5kbWFidWYud2FpdCk7CisKKwlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCisJCXByaW50ayggImNzNDZ4eDogY3M0Nnh4X3Jlc3RhcnRfcGFydCgpLVxuIikpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGNzNDYxeF9yZXNldChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCk7CitzdGF0aWMgdm9pZCBjczQ2MXhfcHJvY19zdG9wKHN0cnVjdCBjc19jYXJkICpjYXJkKTsKK3N0YXRpYyBpbnQgY3M0Nnh4X3N1c3BlbmQoc3RydWN0IGNzX2NhcmQgKmNhcmQsIHUzMiBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKKwkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9zdXNwZW5kKCkrIGZsYWdzPTB4JXggcz0lcFxuIiwKKwkJCSh1bnNpZ25lZCljYXJkLT5wbS5mbGFncyxjYXJkKSk7CisvKgorKiBjaGVjayB0aGUgY3VycmVudCBzdGF0ZSwgb25seSBzdXNwZW5kIGlmIElETEUKKyovCisJaWYoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKKwl7CisJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAyLCAKKwkJCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZCgpIHVuYWJsZSB0byBzdXNwZW5kLCBub3QgSURMRVxuIikpOworCQlyZXR1cm4gMTsKKwl9CisJY2FyZC0+cG0uZmxhZ3MgJj0gfkNTNDZYWF9QTV9JRExFOworCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9TVVNQRU5ESU5HOworCisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwxKTsKKwkKKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUEZJRSk7CisJdG1wICY9IH4weDAwMDBmMDNmOworCXRtcCB8PSAgMHgwMDAwMDAxMDsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgdG1wKTsJLyogcGxheWJhY2sgaW50ZXJydXB0IGRpc2FibGUgKi8KKworCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DSUUpOworCXRtcCAmPSB+MHgwMDAwMDAzZjsKKwl0bXAgfD0gIDB4MDAwMDAwMTE7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZGlzYWJsZSAqLworCisJLyoKKyAgICAgICAgICogIFN0b3AgcGxheWJhY2sgRE1BLgorCSAqLworCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wICYgMHgwMDAwZmZmZik7CisKKwkvKgorICAgICAgICAgKiAgU3RvcCBjYXB0dXJlIERNQS4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCAmIDB4ZmZmZjAwMDApOworCisJaWYoY2FyZC0+c3RhdGVzWzFdKQorCXsKKwkJY2FyZC0+cG0uZG1hYnVmX3N3cHRyX3BsYXkgPSBjYXJkLT5zdGF0ZXNbMV0tPmRtYWJ1Zi5zd3B0cjsKKwkJY2FyZC0+cG0uZG1hYnVmX2NvdW50X3BsYXkgPSBjYXJkLT5zdGF0ZXNbMV0tPmRtYWJ1Zi5jb3VudDsKKwl9CisJaWYoY2FyZC0+c3RhdGVzWzBdKQorCXsKKwkJY2FyZC0+cG0uZG1hYnVmX3N3cHRyX2NhcHR1cmUgPSBjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1Zi5zd3B0cjsKKwkJY2FyZC0+cG0uZG1hYnVmX2NvdW50X2NhcHR1cmUgPSBjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1Zi5jb3VudDsKKwl9CisKKwljczQ2eHhfYWM5N19zdXNwZW5kKGNhcmQpOworCisJLyoKKyAgICAgICAgICogIFJlc2V0IHRoZSBwcm9jZXNzb3IuCisgICAgICAgICAqLworCWNzNDYxeF9yZXNldChjYXJkKTsKKworCWNzNDYxeF9wcm9jX3N0b3AoY2FyZCk7CisKKwkvKgorCSAqICBQb3dlciBkb3duIHRoZSBEQUMgYW5kIEFEQy4gIEZvciBub3cgbGVhdmUgdGhlIG90aGVyIGFyZWFzIG9uLgorCSAqLworCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgMHgwMzAwKTsKKworCS8qCisJICogIFBvd2VyIGRvd24gdGhlIFBMTC4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCAwKTsKKworCS8qCisJICogIFR1cm4gb2ZmIHRoZSBQcm9jZXNzb3IgYnkgdHVybmluZyBvZmYgdGhlIHNvZnR3YXJlIGNsb2NrIGVuYWJsZSBmbGFnIGluIAorCSAqICB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOworCisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwtMSk7CisKKwljYXJkLT5wbS5mbGFncyAmPSB+Q1M0NlhYX1BNX1NVU1BFTkRJTkc7CisJY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX1NVU1BFTkRFRDsKKworCXByaW50cG0oY2FyZCk7CisKKwlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCisJCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZCgpLSBmbGFncz0weCV4XG4iLAorCQkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M0Nnh4X3Jlc3VtZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKK3sKKwlpbnQgaTsKKworCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKKwkJcHJpbnRrKCAiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCkrIGZsYWdzPTB4JXhcbiIsCisJCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MpKTsKKwlpZighKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX1NVU1BFTkRFRCkpCisJeworCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMiwgCisJCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpIHVuYWJsZSB0byByZXN1bWUsIG5vdCBTVVNQRU5ERURcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9SRVNVTUlORzsKKwljYXJkLT5wbS5mbGFncyAmPSB+Q1M0NlhYX1BNX1NVU1BFTkRFRDsKKwlwcmludHBtKGNhcmQpOworCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIDEpOworCisJZm9yKGk9MDtpPDU7aSsrKQorCXsKKwkJaWYgKGNzX2hhcmR3YXJlX2luaXQoY2FyZCkgIT0gMCkKKwkJeworCQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDQsIHByaW50aygKKwkJCQkiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCktIEVSUk9SIGluIGNzX2hhcmR3YXJlX2luaXQoKVxuIikpOworCQkJbWRlbGF5KDEwICogY3NfbGFwdG9wX3dhaXQpOworCQkJY3M0NjF4X3Jlc2V0KGNhcmQpOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmKGk+PTQpCisJeworCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgcHJpbnRrKAorCQkJImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpLSBjc19oYXJkd2FyZV9pbml0KCkgZmFpbGVkLCByZXRyaWVkICVkIHRpbWVzLlxuIixpKSk7CisJCXJldHVybiAwOworCX0KKworCWlmKGNzNDZ4eF9yZXN0YXJ0X3BhcnQoY2FyZCkpCisJeworCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgNCwgcHJpbnRrKAorCQkJImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpOiBjczQ2eHhfcmVzdGFydF9wYXJ0KCkgcmV0dXJuZWQgZXJyb3JcbiIpKTsKKwl9CisKKwljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7CisKKwlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN1bWUoKS0gZmxhZ3M9MHgleFxuIiwKKwkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjczQ2MXhfZm9wcyA9IHsKKwlDU19PV05FUglDU19USElTX01PRFVMRQorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGNzX3JlYWQsCisJLndyaXRlCQk9IGNzX3dyaXRlLAorCS5wb2xsCQk9IGNzX3BvbGwsCisJLmlvY3RsCQk9IGNzX2lvY3RsLAorCS5tbWFwCQk9IGNzX21tYXAsCisJLm9wZW4JCT0gY3Nfb3BlbiwKKwkucmVsZWFzZQk9IGNzX3JlbGVhc2UsCit9OworCisvKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLworCisKK3N0YXRpYyB1MTYgX2NzX2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGRldi0+cHJpdmF0ZV9kYXRhOworCWludCBjb3VudCxsb29wY250OworCXVuc2lnbmVkIGludCB0bXA7CisJdTE2IHJldDsKKwkKKwkvKgorCSAqICAxLiBXcml0ZSBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2ggZm9yIEFDOTcgcmVnaXN0ZXIgYWRkcmVzcworCSAqICAyLiBXcml0ZSBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGggICAgZm9yIGRhdGEgdG8gd3JpdGUgdG8gQUM5NyAKKwkgKiAgMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGUKKwkgKiAgNC4gUmVhZCBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMTdoCisJICogIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgorCSAqICA2LiBSZWFkIEFDU1RTID0gU3RhdHVzIFJlZ2lzdGVyID0gNDY0aCwgY2hlY2sgVlNUUyBiaXQKKwkgKi8KKworCWNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NEQSk7CisKKwkvKgorCSAqICBTZXR1cCB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVycyBvbiB0aGUgQ1M0NjF4IHRvIHNlbmQgdGhlCisJICogIGFwcHJvcHJpYXRlIGNvbW1hbmQgdG8gdGhlIEFDOTcgdG8gcGVyZm9ybSB0aGUgcmVhZC4KKwkgKiAgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoCisJICogIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaAorCSAqICBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoCisJICogIHNldCBEQ1YgLSB3aWxsIGNsZWFyIHdoZW4gcHJvY2VzcyBjb21wbGV0ZWQKKwkgKiAgc2V0IENSVyAtIFJlYWQgY29tbWFuZAorCSAqICBzZXQgVkZSTSAtIHZhbGlkIGZyYW1lIGVuYWJsZWQKKwkgKiAgc2V0IEVTWU4gLSBBU1lOQyBnZW5lcmF0aW9uIGVuYWJsZWQKKwkgKiAgc2V0IFJTVE4gLSBBUlNUIyBpbmFjdGl2ZSwgQUM5NyBjb2RlYyBub3QgcmVzZXQKKwkgKi8KKworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NBRCwgcmVnKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDREEsIDApOworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgQUNDVExfRENWIHwgQUNDVExfQ1JXIHwKKwkJCQkJICAgICBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8CisJCQkJCSAgICAgQUNDVExfUlNUTik7CisKKworCS8qCisJICogIFdhaXQgZm9yIHRoZSByZWFkIHRvIG9jY3VyLgorCSAqLworCWlmKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpCisJCWxvb3BjbnQgPSAyMDAwOworCWVsc2UKKwkJbG9vcGNudCA9IDUwMCAqIGNzX2xhcHRvcF93YWl0OworIAlsb29wY250ICo9IGNzX2xhcHRvcF93YWl0OworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BjbnQ7IGNvdW50KyspIHsKKwkJLyoKKwkJICogIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KKwkgCSAqLworCQl1ZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7CisJCS8qCisJCSAqICBOb3csIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVhZCBoYXMgY29tcGxldGVkLgorCQkgKiAgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDE3aAorCQkgKi8KKwkJaWYgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikpCisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqICBNYWtlIHN1cmUgdGhlIHJlYWQgY29tcGxldGVkLgorCSAqLworCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSJjczQ2eHg6IEFDJzk3IHJlYWQgcHJvYmxlbSAoQUNDVExfRENWKSwgcmVnID0gMHgleCByZXR1cm5pbmcgMHhmZmZmXG4iLCByZWcpKTsKKwkJcmV0dXJuIDB4ZmZmZjsKKwl9CisKKwkvKgorCSAqICBXYWl0IGZvciB0aGUgdmFsaWQgc3RhdHVzIGJpdCB0byBnbyBhY3RpdmUuCisJICovCisKKwlpZighKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQorCQlsb29wY250ID0gMjAwMDsKKwllbHNlCisJCWxvb3BjbnQgPSAxMDAwOworIAlsb29wY250ICo9IGNzX2xhcHRvcF93YWl0OworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BjbnQ7IGNvdW50KyspIHsKKwkJLyoKKwkJICogIFJlYWQgdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyLgorCQkgKiAgQUNTVFMgPSBTdGF0dXMgUmVnaXN0ZXIgPSA0NjRoCisJCSAqICBWU1RTIC0gVmFsaWQgU3RhdHVzCisJCSAqLworCQlpZiAoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU1RTKSAmIEFDU1RTX1ZTVFMpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwICogY3NfbGFwdG9wX3dhaXQpOworCX0KKwkKKwkvKgorCSAqICBNYWtlIHN1cmUgd2UgZ290IHZhbGlkIHN0YXR1cy4KKwkgKi8KKwlpZiAoISggKHRtcD1jczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpKSAmIEFDU1RTX1ZTVFMpKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSJjczQ2eHg6IEFDJzk3IHJlYWQgcHJvYmxlbSAoQUNTVFNfVlNUUyksIHJlZyA9IDB4JXggdmFsPTB4JXggMHhmZmZmIFxuIiwgCisJCQkJcmVnLCB0bXApKTsKKwkJcmV0dXJuIDB4ZmZmZjsKKwl9CisKKwkvKgorCSAqICBSZWFkIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIEFDOTcgcmVnaXN0ZXIuCisJICogIEFDU0RBID0gU3RhdHVzIERhdGEgUmVnaXN0ZXIgPSA0NzRoCisJICovCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA5LCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQ2eHg6IGNzX2FjOTdfZ2V0KCkgcmVnID0gMHgleCwgdmFsID0gMHgleCwgQkEwX0FDQ0FEID0gMHgleFxuIiwgCisJCQlyZWcsIGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NEQSksCisJCQljczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDQUQpKSk7CisJcmV0ID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU0RBKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTE2IGNzX2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZykKK3sKKwl1MTYgcmV0OworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7CisJCisJc3Bpbl9sb2NrKCZjYXJkLT5hYzk3X2xvY2spOworCXJldCA9IF9jc19hYzk3X2dldChkZXYsIHJlZyk7CisJc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY3NfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnLCB1MTYgdmFsKQoreworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7CisJaW50IGNvdW50OworCWludCB2YWwyID0gMDsKKwkKKwlzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJCisJaWYocmVnID09IEFDOTdfQ0RfVk9MKQorCXsKKwkJdmFsMiA9IF9jc19hYzk3X2dldChkZXYsIEFDOTdfQ0RfVk9MKTsKKwl9CisJCisJCisJLyoKKwkgKiAgMS4gV3JpdGUgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoIGZvciBBQzk3IHJlZ2lzdGVyIGFkZHJlc3MKKwkgKiAgMi4gV3JpdGUgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoICAgIGZvciBkYXRhIHRvIHdyaXRlIHRvIEFDOTcKKwkgKiAgMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGUKKwkgKiAgNC4gUmVhZCBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMDdoCisJICogIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgorCSAqLworCisJLyoKKwkgKiAgU2V0dXAgdGhlIEFDOTcgY29udHJvbCByZWdpc3RlcnMgb24gdGhlIENTNDYxeCB0byBzZW5kIHRoZQorCSAqICBhcHByb3ByaWF0ZSBjb21tYW5kIHRvIHRoZSBBQzk3IHRvIHBlcmZvcm0gdGhlIHJlYWQuCisJICogIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaAorCSAqICBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGgKKwkgKiAgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaAorCSAqICBzZXQgRENWIC0gd2lsbCBjbGVhciB3aGVuIHByb2Nlc3MgY29tcGxldGVkCisJICogIHJlc2V0IENSVyAtIFdyaXRlIGNvbW1hbmQKKwkgKiAgc2V0IFZGUk0gLSB2YWxpZCBmcmFtZSBlbmFibGVkCisJICogIHNldCBFU1lOIC0gQVNZTkMgZ2VuZXJhdGlvbiBlbmFibGVkCisJICogIHNldCBSU1ROIC0gQVJTVCMgaW5hY3RpdmUsIEFDOTcgY29kZWMgbm90IHJlc2V0CisgICAgICAgICAqLworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NBRCwgcmVnKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDREEsIHZhbCk7CisJY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDAgfCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8IEFDQ1RMX1JTVE4pOworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgQUNDVExfRENWIHwgQUNDVExfVkZSTSB8CisJCQkJICAgICAgICAgICAgIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDAwOyBjb3VudCsrKSB7CisJCS8qCisJCSAqICBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCisJCSAqLworCQl1ZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7CisJCS8qCisJCSAqICBOb3csIGNoZWNrIHRvIHNlZSBpZiB0aGUgd3JpdGUgaGFzIGNvbXBsZXRlZC4KKwkJICogIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAwN2gKKwkJICovCisJCWlmICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NUTCkgJiBBQ0NUTF9EQ1YpKQorCQkJYnJlYWs7CisJfQorCS8qCisJICogIE1ha2Ugc3VyZSB0aGUgd3JpdGUgY29tcGxldGVkLgorCSAqLworCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKQorCXsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJImNzNDZ4eDogQUMnOTcgd3JpdGUgcHJvYmxlbSwgcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwgcmVnLCB2YWwpKTsKKwl9CisKKwlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKworCS8qCisJICoJQWRqdXN0IHBvd2VyIGlmIHRoZSBtaXhlciBpcyBzZWxlY3RlZC9kZXNlbGVjdGVkIGFjY29yZGluZworCSAqCXRvIHRoZSBDRC4KKwkgKgorCSAqCUlGIHRoZSBDRCBpcyBhIHZhbGlkIGlucHV0IHNvdXJjZSAobWl4ZXIgb3IgZGlyZWN0KSBBTkQKKwkgKgkJdGhlIENEIGlzIG5vdCBtdXRlZCBUSEVOIHBvd2VyIGlzIG5lZWRlZAorCSAqCisJICoJV2UgZG8gdHdvIHRoaW5ncy4gV2hlbiByZWNvcmQgc2VsZWN0IGNoYW5nZXMgdGhlIGlucHV0IHRvCisJICoJYWRkL3JlbW92ZSB0aGUgQ0Qgd2UgYWRqdXN0IHRoZSBwb3dlciBjb3VudCBpZiB0aGUgQ0QgaXMKKwkgKgl1bm11dGVkLgorCSAqCisJICoJV2hlbiB0aGUgQ0QgbXV0ZSBjaGFuZ2VzIHdlIGFkanVzdCB0aGUgcG93ZXIgbGV2ZWwgaWYgdGhlCisJICoJQ0Qgd2FzIGEgdmFsaWQgaW5wdXQuCisJICoKKwkgKiAgICAgIFdlIGFsc28gY2hlY2sgZm9yIENEIHZvbHVtZSAhPSAwLCBhcyB0aGUgQ0QgbXV0ZSBpc24ndAorCSAqICAgICAgbm9ybWFsbHkgdHdlYWtlZCBmcm9tIHVzZXJzcGFjZS4KKwkgKi8KKwkgCisJLyogQ0QgbXV0ZSBjaGFuZ2UgPyAqLworCQorCWlmKHJlZz09QUM5N19DRF9WT0wpCisJeworCQkvKiBNdXRlIGJpdCBjaGFuZ2UgPyAqLworCQlpZigodmFsMl52YWwpJjB4ODAwMCB8fCAoKHZhbDIgPT0gMHgxZjFmIHx8IHZhbCA9PSAweDFmMWYpICYmIHZhbDIgIT0gdmFsKSkKKwkJeworCQkJLyogVGhpcyBpcyBhIGhhY2sgYnV0IGl0cyBjbGVhbmVyIHRoYW4gdGhlIGFsdGVybmF0aXZlcy4KKwkJCSAgIFJpZ2h0IG5vdyBjYXJkLT5hYzk3X2NvZGVjWzBdIG1pZ2h0IGJlIE5VTEwgYXMgd2UgYXJlCisJCQkgICBzdGlsbCBkb2luZyBjb2RlYyBzZXR1cC4gVGhpcyBkb2VzIGFuIGVhcmx5IGFzc2lnbm1lbnQKKwkJCSAgIHRvIGF2b2lkIHRoZSBwcm9ibGVtIGlmIGl0IG9jY3VycyAqLworCQkJICAgCisJCQlpZihjYXJkLT5hYzk3X2NvZGVjWzBdPT1OVUxMKQorCQkJCWNhcmQtPmFjOTdfY29kZWNbMF09ZGV2OworCQkJCQorCQkJLyogTXV0ZSBvbiAqLworCQkJaWYodmFsJjB4ODAwMCB8fCB2YWwgPT0gMHgxZjFmKQorCQkJCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIC0xKTsKKwkJCWVsc2UgLyogTXV0ZSBvZmYgcG93ZXIgb24gKi8KKwkJCXsKKwkJCQlpZihjYXJkLT5hbXBfaW5pdCkKKwkJCQkJY2FyZC0+YW1wX2luaXQoY2FyZCk7CisJCQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgMSk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyogT1NTIC9kZXYvbWl4ZXIgZmlsZSBvcGVyYXRpb24gbWV0aG9kcyAqLworCitzdGF0aWMgaW50IGNzX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpPTA7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1OVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXVuc2lnbmVkIGludCB0bXA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCA0LAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3Nfb3Blbl9taXhkZXYoKStcbiIpKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykKKwl7CisJCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7CisJCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCisJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMICYmCisJCQkgICAgY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyID09IG1pbm9yKQorCQkJCWdvdG8gbWF0Y2g7CisJfQorCWlmICghY2FyZCkKKwl7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4gfCBDU19FUlJPUiwgMiwKKwkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X29wZW5fbWl4ZGV2KCktIC1FTk9ERVZcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorIG1hdGNoOgorCWlmKCFjYXJkLT5hYzk3X2NvZGVjW2ldKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkLT5hYzk3X2NvZGVjW2ldOworCisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwxKTsKKwlpZighQ1NfSU5fVVNFKCZjYXJkLT5taXhlcl91c2VfY250KSkKKwl7CisJCWlmKCAodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfTUlYVk9OICkpICkKKwkJeworCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiY3M0Nnh4OiBjc19vcGVuX21peGRldigpIHBvd2VydXAgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgMSk7CisJQ1NfSU5DX1VTRV9DT1VOVCgmY2FyZC0+bWl4ZXJfdXNlX2NudCk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgNCwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX29wZW5fbWl4ZGV2KCktIDBcbiIpKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgY3NfcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1OVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCWludCBpOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19SRUxFQVNFLCA0LAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKStcbiIpKTsKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpCisJeworCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOworCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQorCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJgorCQkJICAgIGNhcmQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlciA9PSBtaW5vcikKKwkJCQlnb3RvIG1hdGNoOworCX0KKwlpZiAoIWNhcmQpCisJeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOIHwgQ1NfRVJST1IsIDIsCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9vcGVuX21peGRldigpLSAtRU5PREVWXG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KK21hdGNoOgorCWlmKCFDU19ERUNfQU5EX1RFU1QoJmNhcmQtPm1peGVyX3VzZV9jbnQpKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUkVMRUFTRSwgNCwKKwkJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpLSBubyBwb3dlcmRvd24sIHVzZWNudD4wXG4iKSk7CisJCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKKwkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOworCQlyZXR1cm4gMDsKKwl9CisvKgorKiBvaywgbm8gb3V0c3RhbmRpbmcgbWl4ZXIgb3BlbnMsIHNvIHBvd2VyZG93bi4KKyovCisJaWYoICh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX01JWFZPTiwgQ1NfRkFMU0UgKSkgKQorCXsKKwkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJjczQ2eHg6IGNzX3JlbGVhc2VfbWl4ZGV2KCkgcG93ZXJkb3duIE1JWFZPTiBmYWlsdXJlICgweCV4KVxuIix0bXApICk7CisJCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKKwkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgLTEpOworCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIC0xKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19SRUxFQVNFLCA0LAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKS0gMFxuIikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQ9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIF9fdXNlciAqcCA9IChsb25nIF9fdXNlciAqKWFyZzsKKworI2lmIENTREVCVUdfSU5URVJGQUNFCisgICAgICAgIGludCB2YWw7CisKKwlpZiggCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSykgfHwgCisJCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSykgfHwKKwkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTCkgfHwKKwkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTCkgfHwKKwkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19BUE0pKQorCXsKKwkgICAgc3dpdGNoKGNtZCkKKwkgICAgeworCisJCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzoKKwkJCXJldHVybiBwdXRfdXNlcihjc19kZWJ1Z21hc2ssIHApOworCQkKKwkJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDoKKwkJCXJldHVybiBwdXRfdXNlcihjc19kZWJ1Z2xldmVsLCBwKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWNzX2RlYnVnbWFzayA9IHZhbDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUw6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWNzX2RlYnVnbGV2ZWwgPSB2YWw7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX0FQTToKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYodmFsID09IENTX0lPQ1RMX0NNRF9TVVNQRU5EKSAKKwkJCXsKKwkJCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpCisJCQkJeworCQkJCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOworCQkJCQljczQ2eHhfc3VzcGVuZChjYXJkLCAwKTsKKwkJCQl9CisKKwkJCX0KKwkJCWVsc2UgaWYodmFsID09IENTX0lPQ1RMX0NNRF9SRVNVTUUpCisJCQl7CisJCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQorCQkJCXsKKwkJCQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKKwkJCQkJY3M0Nnh4X3Jlc3VtZShjYXJkKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICJjczQ2eHg6IG1peGVyX2lvY3RsKCk6IGludmFsaWQgQVBNIGNtZCAoJWQpXG4iLAorCQkJCQl2YWwpKTsKKwkJCX0KKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6CisJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkJImNzNDZ4eDogbWl4ZXJfaW9jdGwoKTogRVJST1IgdW5rbm93biBkZWJ1ZyBjbWRcbiIpICk7CisJCQlyZXR1cm4gMDsKKwkgICAgfQorCX0KKyNlbmRpZgorCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzX21peGVyX2ZvcHMgPSB7CisJQ1NfT1dORVIJQ1NfVEhJU19NT0RVTEUKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gY3NfaW9jdGxfbWl4ZGV2LAorCS5vcGVuCQk9IGNzX29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlCT0gY3NfcmVsZWFzZV9taXhkZXYsCit9OworCisvKiBBQzk3IGNvZGVjIGluaXRpYWxpc2F0aW9uLiAqLworc3RhdGljIGludCBfX2luaXQgY3NfYWM5N19pbml0KHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworCWludCBudW1fYWM5NyA9IDA7CisJaW50IHJlYWR5XzJuZCA9IDA7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCXUxNiBlaWQ7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKStcbiIpICk7CisKKwlmb3IgKG51bV9hYzk3ID0gMDsgbnVtX2FjOTcgPCBOUl9BQzk3OyBudW1fYWM5NysrKSB7CisJCWlmICgoY29kZWMgPSBhYzk3X2FsbG9jX2NvZGVjKCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyB3aWxsIGJlIGZpbGxlZAorCQkgICBpbiBhYzk3X3Byb2JlX2NvZGVjICovCisJCWNvZGVjLT5wcml2YXRlX2RhdGEgPSBjYXJkOworCQljb2RlYy0+aWQgPSBudW1fYWM5NzsKKworCQljb2RlYy0+Y29kZWNfcmVhZCA9IGNzX2FjOTdfZ2V0OworCQljb2RlYy0+Y29kZWNfd3JpdGUgPSBjc19hYzk3X3NldDsKKwkKKwkJaWYgKGFjOTdfcHJvYmVfY29kZWMoY29kZWMpID09IDApCisJCXsKKwkJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCisJCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCktIGNvZGVjIG51bWJlciAlZCBub3QgZm91bmRcbiIsCisJCQkJCW51bV9hYzk3KSApOworCQkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpIGZvdW5kIGNvZGVjICVkXG4iLG51bV9hYzk3KSApOworCisJCWVpZCA9IGNzX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX0lEKTsKKwkJCisJCWlmKGVpZD09MHhGRkZGKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjczQ2eHg6IGNvZGVjICVkIG5vdCBwcmVzZW50XG4iLG51bV9hYzk3KTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisJCQlicmVhazsKKwkJfQorCQkKKwkJY2FyZC0+YWM5N19mZWF0dXJlcyA9IGVpZDsKKwkJCQorCQlpZiAoKGNvZGVjLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmY3NfbWl4ZXJfZm9wcywgLTEpKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOworCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKKwkJCWJyZWFrOworCQl9CisJCWNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID0gY29kZWM7CisKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpIGFjOTdfY29kZWNbJWRdIHNldCB0byAlcFxuIiwKKwkJCQkodW5zaWduZWQgaW50KW51bV9hYzk3LAorCQkJCWNvZGVjKSk7CisJCS8qIGlmIHRoZXJlIGlzIG5vIHNlY29uZGFyeSBjb2RlYyBhdCBhbGwsIGRvbid0IHByb2JlIGFueSBtb3JlICovCisJCWlmICghcmVhZHlfMm5kKQorCQl7CisJCQludW1fYWM5NyArPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDZ4eDogY3NfYWM5N19pbml0KCktICVkXG4iLCAodW5zaWduZWQgaW50KW51bV9hYzk3KSk7CisJcmV0dXJuIG51bV9hYzk3OworfQorCisvKgorICogbG9hZCB0aGUgc3RhdGljIGltYWdlIGludG8gdGhlIERTUAorICovCisjaW5jbHVkZSAiY3M0NjF4X2ltYWdlLmgiCitzdGF0aWMgdm9pZCBjczQ2MXhfZG93bmxvYWRfaW1hZ2Uoc3RydWN0IGNzX2NhcmQgKmNhcmQpCit7CisgICAgdW5zaWduZWQgaSwgaiwgdGVtcDEsIHRlbXAyLCBvZmZzZXQsIGNvdW50OworICAgIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqcEJBMSA9IGlvcmVtYXAoY2FyZC0+YmExX2FkZHIsIDB4NDAwMDApOworICAgIGZvciggaT0wOyBpIDwgQ0xFQVJfX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBvZmZzZXQgPSBDbHJTdGF0W2ldLkJBMV9fRGVzdEJ5dGVPZmZzZXQ7CisgICAgICAgIGNvdW50ICA9IENsclN0YXRbaV0uQkExX19Tb3VyY2VTaXplOworICAgICAgICBmb3IoICB0ZW1wMSA9IG9mZnNldDsgdGVtcDE8KG9mZnNldCtjb3VudCk7IHRlbXAxKz00ICkKKyAgICAgICAgICAgICAgd3JpdGVsKDAsIHBCQTErdGVtcDEpOworICAgIH0KKworICAgIGZvcihpPTA7IGk8RklMTF9fQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIHRlbXAyID0gRmlsbFN0YXRbaV0uT2Zmc2V0OworICAgICAgICBmb3Ioaj0wOyBqPChGaWxsU3RhdFtpXS5TaXplKS80OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAxID0gKEZpbGxTdGF0W2ldKS5wRmlsbFtqXTsKKyAgICAgICAgICAgIHdyaXRlbCh0ZW1wMSwgcEJBMSt0ZW1wMitqKjQpOworICAgICAgICB9CisgICAgfQorICAgIGlvdW5tYXAocEJBMSk7Cit9CisKKworLyoKKyAqICBDaGlwIHJlc2V0CisgKi8KKworc3RhdGljIHZvaWQgY3M0NjF4X3Jlc2V0KHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworCWludCBpZHg7CisKKwkvKgorCSAqICBXcml0ZSB0aGUgcmVzZXQgYml0IG9mIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCBTUENSX1JTVFNQKTsKKworCS8qCisJICogIFdyaXRlIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCBTUENSX0RSUUVOKTsKKworCS8qCisJICogIENsZWFyIHRoZSB0cmFwIHJlZ2lzdGVycy4KKwkgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDg7IGlkeCsrKSB7CisJCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9EUkVHLCBEUkVHX1JFR0lEX1RSQVBfU0VMRUNUICsgaWR4KTsKKwkJY3M0NjF4X3Bva2UoY2FyZCwgQkExX1RXUFIsIDB4RkZGRik7CisJfQorCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9EUkVHLCAwKTsKKworCS8qCisJICogIFNldCB0aGUgZnJhbWUgdGltZXIgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBwZXIgZnJhbWUuCisJICovCisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0ZSTVQsIDB4YWRmKTsKK30KKworc3RhdGljIHZvaWQgY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHR5cGUpCit7CisJaW50IGlkeCwgbG9vcCwgc3RhcnRmaWZvPTAsIGVuZGZpZm89MCwgcG93ZXJkb3duMSA9IDA7CisJdW5zaWduZWQgaW50IHRtcDsKKworCS8qCisJICogIFNlZSBpZiB0aGUgZGV2aWNlcyBhcmUgcG93ZXJlZCBkb3duLiAgSWYgc28sIHdlIG11c3QgcG93ZXIgdGhlbSB1cCBmaXJzdAorCSAqICBvciB0aGV5IHdpbGwgbm90IHJlc3BvbmQuCisJICovCisJaWYgKCEoKHRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9DTEtDUjEpKSAmIENMS0NSMV9TV0NFKSkgeworCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXAgfCBDTEtDUjFfU1dDRSk7CisJCXBvd2VyZG93bjEgPSAxOworCX0KKworCS8qCisJICogIFdlIHdhbnQgdG8gY2xlYXIgb3V0IHRoZSBzZXJpYWwgcG9ydCBGSUZPcyBzbyB3ZSBkb24ndCBlbmQgdXAgcGxheWluZworCSAqICB3aGF0ZXZlciByYW5kb20gZ2FyYmFnZSBoYXBwZW5zIHRvIGJlIGluIHRoZW0uICBXZSBmaWxsIHRoZSBzYW1wbGUgRklGT1MKKwkgKiAgd2l0aCB6ZXJvIChzaWxlbmNlKS4KKyAgICAgICAgICovCisJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkJXUCwgMCk7CisKKwkvKgorCSogQ2hlY2sgZm9yIHdoaWNoIEZJRk8gbG9jYXRpb25zIHRvIGNsZWFyLCBpZiB3ZSBhcmUgY3VycmVudGx5CisJKiBwbGF5aW5nIG9yIGNhcHR1cmluZyB0aGVuIHdlIGRvbid0IHdhbnQgdG8gcHV0IGluIDEyOCBieXRlcyBvZgorCSogIm5vaXNlIi4KKwkgKi8KKwlpZih0eXBlICYgQ1NfVFlQRV9EQUMpCisJeworCQlzdGFydGZpZm8gPSAxMjg7CisJCWVuZGZpZm8gPSAyNTY7CisJfQorCWlmKHR5cGUgJiBDU19UWVBFX0FEQykKKwl7CisJCXN0YXJ0ZmlmbyA9IDA7CisJCWlmKCFlbmRmaWZvKQorCQkJZW5kZmlmbyA9IDEyODsKKwl9CisJLyoKKwkgKiAgRmlsbCBzYW1wbGUgRklGTyBsb2NhdGlvbnMgKDI1NiBsb2NhdGlvbnMgdG90YWwpLgorCSAqLworCWZvciAoaWR4ID0gc3RhcnRmaWZvOyBpZHggPCBlbmRmaWZvOyBpZHgrKykgeworCQkvKgorCQkgKiAgTWFrZSBzdXJlIHRoZSBwcmV2aW91cyBGSUZPIHdyaXRlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgorCQkgKi8KKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IDU7IGxvb3ArKykgeworCQkJdWRlbGF5KDUwKTsKKwkJCWlmICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9TRVJCU1QpICYgU0VSQlNUX1dCU1kpKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfU0VSQlNUKSAmIFNFUkJTVF9XQlNZKSB7CisJCQlpZiAocG93ZXJkb3duMSkKKwkJCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOworCQl9CisJCS8qCisJCSAqICBXcml0ZSB0aGUgc2VyaWFsIHBvcnQgRklGTyBpbmRleC4KKwkJICovCisJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJCQUQsIGlkeCk7CisJCS8qCisJCSAqICBUZWxsIHRoZSBzZXJpYWwgcG9ydCB0byBsb2FkIHRoZSBuZXcgdmFsdWUgaW50byB0aGUgRklGTyBsb2NhdGlvbi4KKwkJICovCisJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJCQ00sIFNFUkJDTV9XUkMpOworCX0KKwkvKgorCSAqICBOb3csIGlmIHdlIHBvd2VyZWQgdXAgdGhlIGRldmljZXMsIHRoZW4gcG93ZXIgdGhlbSBiYWNrIGRvd24gYWdhaW4uCisJICogIFRoaXMgaXMga2luZGEgdWdseSwgYnV0IHNob3VsZCBuZXZlciBoYXBwZW4uCisJICovCisJaWYgKHBvd2VyZG93bjEpCisJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7Cit9CisKKworc3RhdGljIGludCBjczQ2MXhfcG93ZXJkb3duKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSwgaW50IHN1c3BlbmRmbGFnKQoreworCWludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgdG1wPTAsbXV0ZWQ9MDsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyB0eXBlPTB4JXhcbiIsdHlwZSkpOworCWlmKCFjc19wb3dlcmRvd24gJiYgIXN1c3BlbmRmbGFnKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoS0VSTl9JTkZPIAorCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpIERJU0FCTEVEIGV4aXRpbmdcbiIpKTsKKwkJcmV0dXJuIDA7CisJfQorCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkgcG93ZXJkb3duIHJlZz0weCV4XG4iLHRtcCkpOworLyoKKyogaWYgcG93ZXJpbmcgZG93biBvbmx5IHRoZSBWUkVGLCBhbmQgbm90IHBvd2VyaW5nIGRvd24gdGhlIERBQy9BREMsCisqIHRoZW4gZG8gbm90IHBvd2VyIGRvd24gdGhlIFZSRUYsIFVOTEVTUyBib3RoIHRoZSBEQUMgYW5kIEFEQyBhcmUgbm90CisqIGN1cnJlbnRseSBwb3dlcmVkIGRvd24uICBJZiBwb3dlcmluZyBkb3duIERBQyBhbmQgQURDLCB0aGVuCisqIGl0IGlzIHBvc3NpYmxlIHRvIHBvd2VyIGRvd24gdGhlIFZSRUYgKE9OKS4KKyovCisJaWYgKCAgICAoKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pICYmIAorCQkgKCEodHlwZSAmIENTX1BPV0VSX0FEQykgfHwgKCEodHlwZSAmIENTX1BPV0VSX0RBQykpKSApCisJICAgICAgJiYgCisJCSgodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikgfHwKKwkJICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSApICkKKwl7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKS0gMCAgdW5hYmxlIHRvIHBvd2VyZG93bi4gdG1wPTB4JXhcbiIsdG1wKSk7CisJCXJldHVybiAwOworCX0KKy8qCisqIGZvciBub3csIGFsd2F5cyBrZWVwIHBvd2VyIHRvIHRoZSBtaXhlciBibG9jay4KKyogbm90IHN1cmUgd2h5IGl0J3MgYSBwcm9ibGVtIGJ1dCBpdCBzZWVtcyB0byBiZSBpZiB3ZSBwb3dlciBvZmYuCisqLworCXR5cGUgJj0gfkNTX1BPV0VSX01JWFZPTjsKKwl0eXBlICY9IH5DU19QT1dFUl9NSVhWT0ZGOworCisJLyoKKwkgKiAgUG93ZXIgZG93biBpbmRpY2F0ZWQgYXJlYXMuCisJICovCisJaWYodHlwZSAmIENTX1BPV0VSX01JWFZPRkYpCisJeworCisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgTUlYVk9GRlxuIikpOworCQkvKgorCQkgKiAgUG93ZXIgZG93biB0aGUgTUlYRVIgKFZSRUYgT04pIG9uIHRoZSBBQzk3IGNhcmQuICAKKwkJICovCisJCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikKKwkJeworCQkJaWYoIW11dGVkKQorCQkJeworCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7CisJCQkJbXV0ZWQ9MTsKKwkJCX0KKwkJCXRtcCB8PSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRjsKKwkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7CisJCQkvKgorCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KKwkJCSAqLworCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKKwkJCQkvKgorCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKKwkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KKwkJCQkgKi8KKwkJCQl1ZGVsYXkoNTAwKTsKKworCQkJCS8qCisJCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCisJCQkJICovCisJCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAorCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikpCisJCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvKgorCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgorCQkJICovCisJCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAorCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCQkJImNzNDZ4eDogcG93ZXJkb3duIE1JWFZPRkYgZmFpbGVkXG4iKSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJaWYodHlwZSAmIENTX1BPV0VSX01JWFZPTikKKwl7CisKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKKwkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBNSVhWT05cbiIpKTsKKwkJLyoKKwkJICogIFBvd2VyIGRvd24gdGhlIE1JWEVSIChWUkVGIE9OKSBvbiB0aGUgQUM5NyBjYXJkLiAgCisJCSAqLworCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOworCQlpZiAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTikKKwkJeworCQkJaWYoIW11dGVkKQorCQkJeworCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7CisJCQkJbXV0ZWQ9MTsKKwkJCX0KKwkJCXRtcCB8PSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OOworCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKKwkJCS8qCisJCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgorCQkJICovCisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgeworCQkJCS8qCisJCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQorCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgorCQkJCSAqLworCQkJCXVkZWxheSg1MDApOworCisJCQkJLyoKKwkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KKwkJCQkgKi8KKwkJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJLyoKKwkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KKwkJCSAqLworCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCQkJImNzNDZ4eDogcG93ZXJkb3duIE1JWFZPTiBmYWlsZWRcbiIpKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlpZih0eXBlICYgQ1NfUE9XRVJfQURDKQorCXsKKwkJLyoKKwkJICogIFBvd2VyIGRvd24gdGhlIEFEQyBvbiB0aGUgQUM5NyBjYXJkLiAgCisJCSAqLworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBBRENcbiIpKTsKKwkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pCisJCXsKKwkJCWlmKCFtdXRlZCkKKwkJCXsKKwkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOworCQkJCW11dGVkPTE7CisJCQl9CisJCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQzsKKwkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7CisKKwkJCS8qCisJCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgorCQkJICovCisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgeworCQkJCS8qCisJCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQorCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgorCQkJCSAqLworCQkJCXVkZWxheSg1MDApOworCisJCQkJLyoKKwkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KKwkJCQkgKi8KKwkJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KKwkJCSAqLworCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCQkJImNzNDZ4eDogcG93ZXJkb3duIEFEQyBmYWlsZWRcbiIpKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlpZih0eXBlICYgQ1NfUE9XRVJfREFDKQorCXsKKwkJLyoKKwkJICogIFBvd2VyIGRvd24gdGhlIERBQyBvbiB0aGUgQUM5NyBjYXJkLiAgCisJCSAqLworCisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgREFDXG4iKSk7CisJCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKQorCQl7CisJCQlpZighbXV0ZWQpCisJCQl7CisJCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKKwkJCQltdXRlZD0xOworCQkJfQorCQkJdG1wIHw9IENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUM7CisJCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOworCQkJLyoKKwkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCisJCQkgKi8KKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7CisJCQkJLyoKKwkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCisJCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCisJCQkJICovCisJCQkJdWRlbGF5KDUwMCk7CisKKwkJCQkvKgorCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgorCQkJCSAqLworCQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpCisJCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvKgorCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgorCQkJICovCisJCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAorCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pCisJCQl7CisJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJCQkiY3M0Nnh4OiBwb3dlcmRvd24gREFDIGZhaWxlZFxuIikpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJaWYobXV0ZWQpCisJCWNzX211dGUoY2FyZCwgQ1NfRkFMU0UpOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpLSAwIHRtcD0weCV4XG4iLHRtcCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzNDZ4eF9wb3dlcnVwKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IHRtcD0wLG11dGVkPTA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDgsIHByaW50ayhLRVJOX0lORk8gCisJCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIHR5cGU9MHgleFxuIix0eXBlKSk7CisJLyoKKwkqIGNoZWNrIGZvciBWUkVGIGFuZCBwb3dlcnVwIGlmIG5lZWQgdG8uCisJKi8KKwlpZih0eXBlICYgQ1NfUE9XRVJfTUlYVk9OKQorCQl0eXBlIHw9IENTX1BPV0VSX01JWFZPRkY7CisJaWYodHlwZSAmIChDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMpKQorCQl0eXBlIHw9IENTX1BPV0VSX01JWFZPTiB8IENTX1BPV0VSX01JWFZPRkY7CisKKwkvKgorCSAqICBQb3dlciB1cCBpbmRpY2F0ZWQgYXJlYXMuCisJICovCisJaWYodHlwZSAmIENTX1BPV0VSX01JWFZPRkYpCisJeworCisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIE1JWFZPRkZcbiIpKTsKKwkJLyoKKwkJICogIFBvd2VyIHVwIHRoZSBNSVhFUiAoVlJFRiBPTikgb24gdGhlIEFDOTcgY2FyZC4gIAorCQkgKi8KKwkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkJaWYgKCEodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pKQorCQl7CisJCQlpZighbXV0ZWQpCisJCQl7CisJCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKKwkJCQltdXRlZD0xOworCQkJfQorCQkJdG1wICY9IH5DU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRjsKKwkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7CisJCQkvKgorCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KKwkJCSAqLworCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKKwkJCQkvKgorCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKKwkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KKwkJCQkgKi8KKwkJCQl1ZGVsYXkoNTAwKTsKKworCQkJCS8qCisJCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCisJCQkJICovCisJCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pCisJCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvKgorCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgorCQkJICovCisJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCQkJImNzNDZ4eDogcG93ZXJ1cCBNSVhWT0ZGIGZhaWxlZFxuIikpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCWlmKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pCisJeworCisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIE1JWFZPTlxuIikpOworCQkvKgorCQkgKiAgUG93ZXIgdXAgdGhlIE1JWEVSIChWUkVGIE9OKSBvbiB0aGUgQUM5NyBjYXJkLiAgCisJCSAqLworCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOworCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSkKKwkJeworCQkJaWYoIW11dGVkKQorCQkJeworCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7CisJCQkJbXV0ZWQ9MTsKKwkJCX0KKwkJCXRtcCAmPSB+Q1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTjsKKwkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7CisJCQkvKgorCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KKwkJCSAqLworCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKKwkJCQkvKgorCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKKwkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KKwkJCQkgKi8KKwkJCQl1ZGVsYXkoNTAwKTsKKworCQkJCS8qCisJCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCisJCQkJICovCisJCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCS8qCisJCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCisJCQkgKi8KKwkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSkKKwkJCXsKKwkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkJCSJjczQ2eHg6IHBvd2VydXAgTUlYVk9OIGZhaWxlZFxuIikpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCWlmKHR5cGUgJiBDU19QT1dFUl9BREMpCisJeworCQkvKgorCQkgKiAgUG93ZXIgdXAgdGhlIEFEQyBvbiB0aGUgQUM5NyBjYXJkLiAgCisJCSAqLworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKSsgQURDXG4iKSk7CisJCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pKQorCQl7CisJCQlpZighbXV0ZWQpCisJCQl7CisJCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKKwkJCQltdXRlZD0xOworCQkJfQorCQkJdG1wICY9IH5DU19BQzk3X1BPV0VSX0NPTlRST0xfQURDOworCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKKworCQkJLyoKKwkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCisJCQkgKi8KKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7CisJCQkJLyoKKwkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCisJCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCisJCQkJICovCisJCQkJdWRlbGF5KDUwMCk7CisKKwkJCQkvKgorCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgorCQkJCSAqLworCQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgorCQkJICovCisJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikpCisJCQl7CisJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIEFEQyBmYWlsZWRcbiIpKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlpZih0eXBlICYgQ1NfUE9XRVJfREFDKQorCXsKKwkJLyoKKwkJICogIFBvd2VyIHVwIHRoZSBEQUMgb24gdGhlIEFDOTcgY2FyZC4gIAorCQkgKi8KKworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpKyBEQUNcbiIpKTsKKwkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkJaWYgKCEodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpCisJCXsKKwkJCWlmKCFtdXRlZCkKKwkJCXsKKwkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOworCQkJCW11dGVkPTE7CisJCQl9CisJCQl0bXAgJj0gfkNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUM7CisJCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOworCQkJLyoKKwkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCisJCQkgKi8KKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7CisJCQkJLyoKKwkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCisJCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCisJCQkJICovCisJCQkJdWRlbGF5KDUwMCk7CisKKwkJCQkvKgorCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgorCQkJCSAqLworCQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pCisJCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvKgorCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgorCQkJICovCisJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpCisJCQl7CisJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIERBQyBmYWlsZWRcbiIpKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOworCWlmKG11dGVkKQorCQljc19tdXRlKGNhcmQsIENTX0ZBTFNFKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gCisJCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCktIDAgdG1wPTB4JXhcbiIsdG1wKSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgY3M0NjF4X3Byb2Nfc3RhcnQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCit7CisJaW50IGNudDsKKworCS8qCisJICogIFNldCB0aGUgZnJhbWUgdGltZXIgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBwZXIgZnJhbWUuCisJICovCisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0ZSTVQsIDB4YWRmKTsKKwkvKgorCSAqICBUdXJuIG9uIHRoZSBydW4sIHJ1biBhdCBmcmFtZSwgYW5kIERNQSBlbmFibGUgYml0cyBpbiB0aGUgbG9jYWwgY29weSBvZgorCSAqICB0aGUgU1AgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfU1BDUiwgU1BDUl9SVU4gfCBTUENSX1JVTkZSIHwgU1BDUl9EUlFFTik7CisJLyoKKwkgKiAgV2FpdCB1bnRpbCB0aGUgcnVuIGF0IGZyYW1lIGJpdCByZXNldHMgaXRzZWxmIGluIHRoZSBTUCBjb250cm9sCisJICogIHJlZ2lzdGVyLgorCSAqLworCWZvciAoY250ID0gMDsgY250IDwgMjU7IGNudCsrKSB7CisJCXVkZWxheSg1MCk7CisJCWlmICghKGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9TUENSKSAmIFNQQ1JfUlVORlIpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9TUENSKSAmIFNQQ1JfUlVORlIpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNzNDZ4eDogU1BDUl9SVU5GUiBuZXZlciByZXNldFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGNzNDYxeF9wcm9jX3N0b3Aoc3RydWN0IGNzX2NhcmQgKmNhcmQpCit7CisJLyoKKwkgKiAgVHVybiBvZmYgdGhlIHJ1biwgcnVuIGF0IGZyYW1lLCBhbmQgRE1BIGVuYWJsZSBiaXRzIGluIHRoZSBsb2NhbCBjb3B5IG9mCisJICogIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCAwKTsKK30KKworc3RhdGljIGludCBjc19oYXJkd2FyZV9pbml0KHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7CisJdW5zaWduZWQgaW50IHRtcCxjb3VudDsKKwkKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0Nnh4OiBjc19oYXJkd2FyZV9pbml0KCkrXG4iKSApOworCS8qIAorCSAqICBGaXJzdCwgYmxhc3QgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgdG8gemVybyBzbyB0aGF0IHRoZSBQTEwgc3RhcnRzCisgICAgICAgICAqICBvdXQgaW4gYSBrbm93biBzdGF0ZSwgYW5kIGJsYXN0IHRoZSBtYXN0ZXIgc2VyaWFsIHBvcnQgY29udHJvbCByZWdpc3RlcgorICAgICAgICAgKiAgdG8gemVybyBzbyB0aGF0IHRoZSBzZXJpYWwgcG9ydHMgYWxzbyBzdGFydCBvdXQgaW4gYSBrbm93biBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIDApOworICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCAwKTsKKworCS8qCisJICogIElmIHdlIGFyZSBpbiBBQzk3IG1vZGUsIHRoZW4gd2UgbXVzdCBzZXQgdGhlIHBhcnQgdG8gYSBob3N0IGNvbnRyb2xsZWQKKyAgICAgICAgICogIEFDLWxpbmsuICBPdGhlcndpc2UsIHdlIHdvbid0IGJlIGFibGUgdG8gYnJpbmcgdXAgdGhlIGxpbmsuCisgICAgICAgICAqLyAgICAgICAgCisgICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ09ERUNfVFlQRV8xXzAzKTsJLyogMS4wMyBjYXJkICovCisgICAgICAgIC8qIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ09ERUNfVFlQRV8yXzApOyAqLyAvKiAyLjAwIGNhcmQgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiAgRHJpdmUgdGhlIEFSU1QjIHBpbiBsb3cgZm9yIGEgbWluaW11bSBvZiAxdVMgKGFzIGRlZmluZWQgaW4gdGhlIEFDOTcKKyAgICAgICAgICogIHNwZWMpIGFuZCB0aGVuIGRyaXZlIGl0IGhpZ2guICBUaGlzIGlzIGRvbmUgZm9yIG5vbiBBQzk3IG1vZGVzIHNpbmNlCisgICAgICAgICAqICB0aGVyZSBtaWdodCBiZSBsb2dpYyBleHRlcm5hbCB0byB0aGUgQ1M0NjF4IHRoYXQgdXNlcyB0aGUgQVJTVCMgbGluZQorICAgICAgICAgKiAgZm9yIGEgcmVzZXQuCisgICAgICAgICAqLworICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDEpOworICAgICAgICB1ZGVsYXkoNTApOworICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDApOworICAgICAgICB1ZGVsYXkoNTApOworICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX1JTVE4pOworCisJLyoKKwkgKiAgVGhlIGZpcnN0IHRoaW5nIHdlIGRvIGhlcmUgaXMgdG8gZW5hYmxlIHN5bmMgZ2VuZXJhdGlvbi4gIEFzIHNvb24KKwkgKiAgYXMgd2Ugc3RhcnQgcmVjZWl2aW5nIGJpdCBjbG9jaywgd2UnbGwgc3RhcnQgcHJvZHVjaW5nIHRoZSBTWU5DCisJICogIHNpZ25hbC4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKKworCS8qCisJICogIE5vdyB3YWl0IGZvciBhIHNob3J0IHdoaWxlIHRvIGFsbG93IHRoZSBBQzk3IHBhcnQgdG8gc3RhcnQKKwkgKiAgZ2VuZXJhdGluZyBiaXQgY2xvY2sgKHNvIHdlIGRvbid0IHRyeSB0byBzdGFydCB0aGUgUExMIHdpdGhvdXQgYW4KKwkgKiAgaW5wdXQgY2xvY2spLgorCSAqLworCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOwkJLyogMSBzaG91bGQgYmUgZW5vdWdoID8/IChhbmQgcGlncyBtaWdodCBmbHkpICovCisKKwkvKgorCSAqICBTZXQgdGhlIHNlcmlhbCBwb3J0IHRpbWluZyBjb25maWd1cmF0aW9uLCBzbyB0aGF0CisJICogIHRoZSBjbG9jayBjb250cm9sIGNpcmN1aXQgZ2V0cyBpdHMgY2xvY2sgZnJvbSB0aGUgY29ycmVjdCBwbGFjZS4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCBTRVJNQzFfUFRDX0FDOTcpOworCisJLyoKKwkqIFRoZSBwYXJ0IHNlZW1zIHRvIG5vdCBiZSByZWFkeSBmb3IgYSB3aGlsZSBhZnRlciBhIHJlc3VtZS4KKwkqIHNvLCBpZiB3ZSBhcmUgcmVzdW1pbmcsIHRoZW4gd2FpdCBmb3IgNzAwIG1pbHMuICBOb3RlIHRoYXQgNjAwIG1pbHMKKwkqIGlzIG5vdCBlbm91Z2ggZm9yIHNvbWUgcGxhdGZvcm1zISB0ZXN0ZWQgb24gYW4gSUJNIFRoaW5rcGFkcyBhbmQgCisJKiByZWZlcmVuY2UgY2FyZHMuCisJKi8KKwlpZighKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQorCQltZGVsYXkoaW5pdGRlbGF5KTsKKwkvKgorCSAqICBXcml0ZSB0aGUgc2VsZWN0ZWQgY2xvY2sgY29udHJvbCBzZXR1cCB0byB0aGUgaGFyZHdhcmUuICBEbyBub3QgdHVybiBvbgorCSAqICBTV0NFIHlldCAoaWYgcmVxdWVzdGVkKSwgc28gdGhhdCB0aGUgZGV2aWNlcyBjbG9ja2VkIGJ5IHRoZSBvdXRwdXQgb2YKKwkgKiAgUExMIGFyZSBub3QgY2xvY2tlZCB1bnRpbCB0aGUgUExMIGlzIHN0YWJsZS4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfUExMQ0MsIFBMTENDX0xQRl8xMDUwXzI3ODBfS0haIHwgUExMQ0NfQ0RSXzczXzEwNF9NSFopOworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9QTExNLCAweDNhKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IyLCBDTEtDUjJfUERJVlNfOCk7CisKKwkvKgorCSAqICBQb3dlciB1cCB0aGUgUExMLgorCSAqLworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIENMS0NSMV9QTExQKTsKKworCS8qCisgICAgICAgICAqICBXYWl0IHVudGlsIHRoZSBQTEwgaGFzIHN0YWJpbGl6ZWQuCisJICovCisJbWRlbGF5KDUgKiBjc19sYXB0b3Bfd2FpdCk7CQkvKiBBZ2FpbiAxIHNob3VsZCBiZSBlbm91Z2ggPz8gKi8KKworCS8qCisJICogIFR1cm4gb24gY2xvY2tpbmcgb2YgdGhlIGNvcmUgc28gdGhhdCB3ZSBjYW4gc2V0dXAgdGhlIHNlcmlhbCBwb3J0cy4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSB8IENMS0NSMV9TV0NFOworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7CisKKwkvKgorCSAqICBGaWxsIHRoZSBzZXJpYWwgcG9ydCBGSUZPcyB3aXRoIHNpbGVuY2UuCisJICovCisJY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhjYXJkLENTX1RZUEVfREFDIHwgQ1NfVFlQRV9BREMpOworCisJLyoKKwkgKiAgU2V0IHRoZSBzZXJpYWwgcG9ydCBGSUZPIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgRklGTy4KKwkgKi8KKwkvKiBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQlNQLCAwKTsgKi8KKworCS8qCisJICogIFdyaXRlIHRoZSBzZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uIHRvIHRoZSBwYXJ0LiAgVGhlIG1hc3RlcgorCSAqICBlbmFibGUgYml0IGlzIG5vdCBzZXQgdW50aWwgYWxsIG90aGVyIHZhbHVlcyBoYXZlIGJlZW4gd3JpdHRlbi4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQzEsIFNFUkMxX1NPMUZfQUM5NyB8IFNFUkMxX1NPMUVOKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQzIsIFNFUkMyX1NJMUZfQUM5NyB8IFNFUkMxX1NPMUVOKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCBTRVJNQzFfUFRDX0FDOTcgfCBTRVJNQzFfTVNQRSk7CisKKworCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOwkJLyogU2hvdWxkbnQgYmUgbmVlZGVkID8/ICovCisJCisvKgorKiBJZiB3ZSBhcmUgcmVzdW1pbmcgdW5kZXIgMi4yLnggdGhlbiB3ZSBjYW4gbm90IHNjaGVkdWxlIGEgdGltZW91dC4KKyogc28sIGp1c3Qgc3BpbiB0aGUgQ1BVLgorKi8KKwlpZihjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKQorCXsKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBjYXJkIHJlYWR5IHNpZ25hbCBmcm9tIHRoZSBBQzk3IGNhcmQuCisJICovCisJCWVuZF90aW1lID0gamlmZmllcyArIDMgKiAoSFogPj4gMik7CisJCWRvIHsKKwkJLyoKKwkJICogIFJlYWQgdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB3ZSd2ZSBzZWVuIGEgQ09ERUMgUkVBRFkKKwkJICogIHNpZ25hbCBmcm9tIHRoZSBBQzk3IGNhcmQuCisJCSAqLworCQkJaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NUUykgJiBBQ1NUU19DUkRZKQorCQkJCWJyZWFrOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7CisJfQorCWVsc2UKKwl7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwMDsgY291bnQrKykgeworCQkvLyBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCisJCQl1ZGVsYXkoMjUgKiBjc19sYXB0b3Bfd2FpdCk7CisKKwkJCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfQ1JEWSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogIE1ha2Ugc3VyZSBDT0RFQyBpcyBSRUFEWS4KKwkgKi8KKwlpZiAoIShjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfQ1JEWSkpIHsKKwkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAgCisJCQkiY3M0Nnh4OiBjcmVhdGUgLSBuZXZlciByZWFkIGNhcmQgcmVhZHkgZnJvbSBBQyc5N1xuIikpOworCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9XQVJOSU5HICAKKwkJCSJjczQ2eHg6IHByb2JhYmx5IG5vdCBhIGJ1ZywgdHJ5IHVzaW5nIHRoZSBDUzQyMzIgZHJpdmVyLFxuIikpOworCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9XQVJOSU5HICAKKwkJCSJjczQ2eHg6IG9yIHR1cm4gb2ZmIGFueSBhdXRvbWF0aWMgUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IGluIHRoZSBCSU9TLlxuIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqICBBc3NlcnQgdGhlIHZhaWQgZnJhbWUgc2lnbmFsIHNvIHRoYXQgd2UgY2FuIHN0YXJ0IHNlbmRpbmcgY29tbWFuZHMKKwkgKiAgdG8gdGhlIEFDOTcgY2FyZC4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX1ZGUk0gfCBBQ0NUTF9FU1lOIHwgQUNDVExfUlNUTik7CisKKwlpZihjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKQorCXsKKwkvKgorCSAqICBXYWl0IHVudGlsIHdlJ3ZlIHNhbXBsZWQgaW5wdXQgc2xvdHMgMyBhbmQgNCBhcyB2YWxpZCwgbWVhbmluZyB0aGF0CisJICogIHRoZSBjYXJkIGlzIHB1bXBpbmcgQURDIGRhdGEgYWNyb3NzIHRoZSBBQy1saW5rLgorCSAqLworCQllbmRfdGltZSA9IGppZmZpZXMgKyAzICogKEhaID4+IDIpOworCQlkbyB7CisJCQkvKgorCQkJICogIFJlYWQgdGhlIGlucHV0IHNsb3QgdmFsaWQgcmVnaXN0ZXIgYW5kIHNlZSBpZiBpbnB1dCBzbG90cyAzIGFuZAorCQkJICogIDQgYXJlIHZhbGlkIHlldC4KKwkJCSAqLworCQkJaWYgKChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNJU1YpICYgKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgPT0gKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkKKwkJCQlicmVhazsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpOworCX0KKwllbHNlCisJeworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDA7IGNvdW50KyspIHsKKwkJLy8gRmlyc3QsIHdlIHdhbnQgdG8gd2FpdCBmb3IgYSBzaG9ydCB0aW1lLgorCQkJdWRlbGF5KDI1ICogY3NfbGFwdG9wX3dhaXQpOworCisJCQlpZiAoKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0lTVikgJiAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKSA9PSAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKQorCQkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogIE1ha2Ugc3VyZSBpbnB1dCBzbG90cyAzIGFuZCA0IGFyZSB2YWxpZC4gIElmIG5vdCwgdGhlbiByZXR1cm4KKwkgKiAgYW4gZXJyb3IuCisJICovCisJaWYgKChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNJU1YpICYgKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgIT0gKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjczQ2eHg6IGNyZWF0ZSAtIG5ldmVyIHJlYWQgSVNWMyAmIElTVjQgZnJvbSBBQyc5N1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJICogIE5vdywgYXNzZXJ0IHZhbGlkIGZyYW1lIGFuZCB0aGUgc2xvdCAzIGFuZCA0IHZhbGlkIGJpdHMuICBUaGlzIHdpbGwKKwkgKiAgY29tbWVuc2UgdGhlIHRyYW5zZmVyIG9mIGRpZ2l0YWwgYXVkaW8gZGF0YSB0byB0aGUgQUM5NyBjYXJkLgorCSAqLworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ09TViwgQUNPU1ZfU0xWMyB8IEFDT1NWX1NMVjQpOworCisJLyoKKwkgKiAgVHVybiBvZmYgdGhlIFByb2Nlc3NvciBieSB0dXJuaW5nIG9mZiB0aGUgc29mdHdhcmUgY2xvY2sgZW5hYmxlIGZsYWcgaW4gCisJICogIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCS8qIHRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9DTEtDUjEpICYgfkNMS0NSMV9TV0NFOyAqLworCS8qIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7ICovCisKKwkvKgorICAgICAgICAgKiAgUmVzZXQgdGhlIHByb2Nlc3Nvci4KKyAgICAgICAgICovCisJY3M0NjF4X3Jlc2V0KGNhcmQpOworCisJLyoKKyAgICAgICAgICogIERvd25sb2FkIHRoZSBpbWFnZSB0byB0aGUgcHJvY2Vzc29yLgorCSAqLworCQorCWNzNDYxeF9kb3dubG9hZF9pbWFnZShjYXJkKTsKKworCS8qCisgICAgICAgICAqICBTdG9wIHBsYXliYWNrIERNQS4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7CisJY2FyZC0+cGN0bCA9IHRtcCAmIDB4ZmZmZjAwMDA7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BDVEwsIHRtcCAmIDB4MDAwMGZmZmYpOworCisJLyoKKyAgICAgICAgICogIFN0b3AgY2FwdHVyZSBETUEuCisJICovCisJdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NDVEwpOworCWNhcmQtPmNjdGwgPSB0bXAgJiAweDAwMDBmZmZmOworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1RMLCB0bXAgJiAweGZmZmYwMDAwKTsKKworCS8qIGluaXRpYWxpemUgQUM5NyBjb2RlYyBhbmQgcmVnaXN0ZXIgL2Rldi9taXhlciAqLworCWlmKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpCisJeworCQlpZiAoY3NfYWM5N19pbml0KGNhcmQpIDw9IDApCisJCXsKKwkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCkgZmFpbHVyZVxuIikgKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCWVsc2UKKwl7CisJCWNzNDZ4eF9hYzk3X3Jlc3VtZShjYXJkKTsKKwl9CisJCisJY3M0NjF4X3Byb2Nfc3RhcnQoY2FyZCk7CisKKwkvKgorCSAqICBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgcGFydC4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfSElDUiwgSElDUl9JRVYgfCBISUNSX0NIR00pOworCisJdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BGSUUpOworCXRtcCAmPSB+MHgwMDAwZjAzZjsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgdG1wKTsJLyogcGxheWJhY2sgaW50ZXJydXB0IGVuYWJsZSAqLworCisJdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NJRSk7CisJdG1wICY9IH4weDAwMDAwMDNmOworCXRtcCB8PSAgMHgwMDAwMDAwMTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0lFLCB0bXApOwkvKiBjYXB0dXJlIGludGVycnVwdCBlbmFibGUgKi8JCisKKwkvKgorCSAqICBJZiBJRExFIHRoZW4gUG93ZXIgZG93biB0aGUgcGFydC4gIFdlIHdpbGwgcG93ZXIgY29tcG9uZW50cyB1cCAKKwkgKiAgd2hlbiB3ZSBuZWVkIHRoZW0uICAKKwkgKi8KKwlpZihjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKQorCXsKKwkJaWYoIWNzX3Bvd2VyZG93bikKKwkJeworCQkJaWYoICh0bXAgPSBjczQ2eHhfcG93ZXJ1cChjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAorCQkJCQlDU19QT1dFUl9NSVhWT04gKSkgKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcnVwKCkgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoICh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8CisJCQkJCUNTX1BPV0VSX01JWFZPTiwgQ1NfRkFMU0UgKSkgKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSBmYWlsdXJlICgweCV4KVxuIix0bXApICk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDZ4eDogY3NfaGFyZHdhcmVfaW5pdCgpLSAwXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGluc3RhbGwgdGhlIGRyaXZlciwgd2UgZG8gbm90IGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWwgbm9yIERNQSBidWZmZXIgbm93LCB0aGV5IGFyZSBkZWZlcmVkIAorICAgdW50aWwgIkFDQ0VTUyIgdGltZSAoaW4gcHJvZ19kbWFidWYgY2FsbGVkIGJ5IG9wZW4vcmVhZC93cml0ZS9pb2N0bC9tbWFwKSAqLworICAgCisvKgorICoJQ2FyZCBzdWJpZCB0YWJsZQorICovCisgCitzdHJ1Y3QgY3NfY2FyZF90eXBlCit7CisJdTE2IHZlbmRvcjsKKwl1MTYgaWQ7CisJY2hhciAqbmFtZTsKKwl2b2lkICgqYW1wKShzdHJ1Y3QgY3NfY2FyZCAqLCBpbnQpOworCXZvaWQgKCphbXBfaW5pdCkoc3RydWN0IGNzX2NhcmQgKik7CisJdm9pZCAoKmFjdGl2ZSkoc3RydWN0IGNzX2NhcmQgKiwgaW50KTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3NfY2FyZF90eXBlIGNhcmRzW10gPSB7CisJeworCQkudmVuZG9yCT0gMHgxNDg5LAorCQkuaWQJPSAweDcwMDEsCisJCS5uYW1lCT0gIkdlbml1cyBTb3VuZG1ha2VyIDEyOCB2YWx1ZSIsCisJCS5hbXAJPSBhbXBfbm9uZSwKKwl9LAorCXsKKwkJLnZlbmRvcgk9IDB4NTA1MywKKwkJLmlkCT0gMHgzMzU3LAorCQkubmFtZQk9ICJWb3lldHJhIiwKKwkJLmFtcAk9IGFtcF92b3lldHJhLAorCX0sCisJeworCQkudmVuZG9yCT0gMHgxMDcxLAorCQkuaWQJPSAweDYwMDMsCisJCS5uYW1lCT0gIk1pdGFjIE1JNjAyMC8yMSIsCisJCS5hbXAJPSBhbXBfdm95ZXRyYSwKKwl9LAorCXsKKwkJLnZlbmRvcgk9IDB4MTRBRiwKKwkJLmlkCT0gMHgwMDUwLAorCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAorCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAorCX0sCisJeworCQkudmVuZG9yCT0gMHgxNjgxLAorCQkuaWQJPSAweDAwNTAsCisJCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCisJCS5hbXAJPSBhbXBfaGVyY3VsZXMsCisJfSwKKwl7CisJCS52ZW5kb3IJPSAweDE2ODEsCisJCS5pZAk9IDB4MDA1MSwKKwkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKKwkJLmFtcAk9IGFtcF9oZXJjdWxlcywKKwl9LAorCXsKKwkJLnZlbmRvcgk9IDB4MTY4MSwKKwkJLmlkCT0gMHgwMDUyLAorCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAorCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAorCX0sCisJeworCQkudmVuZG9yCT0gMHgxNjgxLAorCQkuaWQJPSAweDAwNTMsCisJCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCisJCS5hbXAJPSBhbXBfaGVyY3VsZXMsCisJfSwKKwl7CisJCS52ZW5kb3IJPSAweDE2ODEsCisJCS5pZAk9IDB4MDA1NCwKKwkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKKwkJLmFtcAk9IGFtcF9oZXJjdWxlcywKKwl9LAorCXsKKwkJLnZlbmRvcgk9IDB4MTY4MSwKKwkJLmlkCT0gMHhhMDEwLAorCQkubmFtZQk9ICJIZXJjdWxlcyBGb3J0aXNzaW1vIElJIiwKKwkJLmFtcAk9IGFtcF9ub25lLAorCX0sCisJLyogTm90IHN1cmUgaWYgdGhlIDU3MCBuZWVkcyB0aGUgY2xrcnVuIGhhY2sgKi8KKwl7CisJCS52ZW5kb3IJPSBQQ0lfVkVORE9SX0lEX0lCTSwKKwkJLmlkCT0gMHgwMTMyLAorCQkubmFtZQk9ICJUaGlua3BhZCA1NzAiLAorCQkuYW1wCT0gYW1wX25vbmUsCisJCS5hY3RpdmUJPSBjbGtydW5faGFjaywKKwl9LAorCXsKKwkJLnZlbmRvcgk9IFBDSV9WRU5ET1JfSURfSUJNLAorCQkuaWQJPSAweDAxNTMsCisJCS5uYW1lCT0gIlRoaW5rcGFkIDYwMFgvQTIwL1QyMCIsCisJCS5hbXAJPSBhbXBfbm9uZSwKKwkJLmFjdGl2ZQk9IGNsa3J1bl9oYWNrLAorCX0sCisJeworCQkudmVuZG9yCT0gUENJX1ZFTkRPUl9JRF9JQk0sCisJCS5pZAk9IDB4MTAxMCwKKwkJLm5hbWUJPSAiVGhpbmtwYWQgNjAwRSAodW5zdXBwb3J0ZWQpIiwKKwl9LAorCXsKKwkJLm5hbWUJPSAiQ2FyZCB3aXRob3V0IFNTSUQgc2V0IiwKKwl9LAorCXsgMCwgfSwKK307CisKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBKYXJvc2xhdiBLeXNlbGEsIDxwY2F1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3J5c3RhbCBTb3VuZEZ1c2lvbiBBdWRpbyBTdXBwb3J0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworc3RhdGljIGNvbnN0IGNoYXIgY3M0Nnh4X2Jhbm5lcltdID0gS0VSTl9JTkZPICJDcnlzdGFsIDQyODAvNDZ4eCArIEFDOTcgQXVkaW8sIHZlcnNpb24gIiBDUzQ2WFhfTUFKT1JfVkVSU0lPTiAiLiIgQ1M0NlhYX01JTk9SX1ZFUlNJT04gIi4iIENTNDZYWF9BUkNIICIsICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiI7CitzdGF0aWMgY29uc3QgY2hhciBmbmRtc2dbXSA9IEtFUk5fSU5GTyAiY3M0Nnh4OiBGb3VuZCAlZCBhdWRpbyBkZXZpY2UocykuXG4iOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjczQ2eHhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCit7CisJc3RydWN0IHBtX2RldiAqcG1kZXY7CisJaW50IGksajsKKwl1MTYgc3NfY2FyZCwgc3NfdmVuZG9yOworCXN0cnVjdCBjc19jYXJkICpjYXJkOworCWRtYV9hZGRyX3QgZG1hX21hc2s7CisJc3RydWN0IGNzX2NhcmRfdHlwZSAqY3AgPSAmY2FyZHNbMF07CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogcHJvYmUoKStcbiIpKTsKKworCWRtYV9tYXNrID0gMHhmZmZmZmZmZjsJLyogdGhpcyBlbmFibGVzIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpIHsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDZ4eDogcGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIVJTUkNJU01FTU9SWVJFR0lPTihwY2lfZGV2LCAwKSB8fAorCSAgICAhUlNSQ0lTTUVNT1JZUkVHSU9OKHBjaV9kZXYsIDEpKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDZ4eDogcHJvYmUoKS0gTWVtb3J5IHJlZ2lvbiBub3QgYXNzaWduZWRcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAocGNpX2Rldi0+aXJxID09IDApIHsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKKwkJCSAiY3M0Nnh4OiBwcm9iZSgpIElSUSBub3QgYXNzaWduZWRcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIXBjaV9kbWFfc3VwcG9ydGVkKHBjaV9kZXYsIDB4ZmZmZmZmZmYpKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICJjczQ2eHg6IHByb2JlKCkgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnNzX3ZlbmRvcik7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX1NVQlNZU1RFTV9JRCwgJnNzX2NhcmQpOworCisJaWYgKChjYXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNzX2NhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKCpjYXJkKSk7CisJY2FyZC0+YmEwX2FkZHIgPSBSU1JDQUREUkVTUyhwY2lfZGV2LCAwKTsKKwljYXJkLT5iYTFfYWRkciA9IFJTUkNBRERSRVNTKHBjaV9kZXYsIDEpOworCWNhcmQtPnBjaV9kZXYgPSBwY2lfZGV2OworCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKKwljYXJkLT5tYWdpYyA9IENTX0NBUkRfTUFHSUM7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5hYzk3X2xvY2spOworCisJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CisKKwlwcmludGsoY3M0Nnh4X2Jhbm5lcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBDYXJkIGZvdW5kIGF0IDB4JTA4bHggYW5kIDB4JTA4bHgsIElSUSAlZFxuIiwKKwkgICAgICAgY2FyZC0+YmEwX2FkZHIsIGNhcmQtPmJhMV9hZGRyLCBjYXJkLT5pcnEpOworCisJY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBjc19hbGxvY19wY21fY2hhbm5lbDsKKwljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBjc19hbGxvY19yZWNfcGNtX2NoYW5uZWw7CisJY2FyZC0+ZnJlZV9wY21fY2hhbm5lbCA9IGNzX2ZyZWVfcGNtX2NoYW5uZWw7CisJY2FyZC0+YW1wbGlmaWVyX2N0cmwgPSBhbXBfbm9uZTsKKwljYXJkLT5hY3RpdmVfY3RybCA9IGFtcF9ub25lOworCisJd2hpbGUgKGNwLT5uYW1lKQorCXsKKwkJaWYoY3AtPnZlbmRvciA9PSBzc192ZW5kb3IgJiYgY3AtPmlkID09IHNzX2NhcmQpCisJCXsKKwkJCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gY3AtPmFtcDsKKwkJCWlmKGNwLT5hY3RpdmUpCisJCQkJY2FyZC0+YWN0aXZlX2N0cmwgPSBjcC0+YWN0aXZlOworCQkJaWYoY3AtPmFtcF9pbml0KQorCQkJCWNhcmQtPmFtcF9pbml0ID0gY3AtPmFtcF9pbml0OworCQkJYnJlYWs7CisJCX0KKwkJY3ArKzsKKwl9CisJaWYgKGNwLT5uYW1lPT1OVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBVbmtub3duIGNhcmQgKCUwNFg6JTA0WCkgYXQgMHglMDhseC8weCUwOGx4LCBJUlEgJWRcbiIsCisJCQlzc192ZW5kb3IsIHNzX2NhcmQsIGNhcmQtPmJhMF9hZGRyLCBjYXJkLT5iYTFfYWRkciwgIGNhcmQtPmlycSk7CisJfQorCWVsc2UKKwl7CisJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogJXMgKCUwNFg6JTA0WCkgYXQgMHglMDhseC8weCUwOGx4LCBJUlEgJWRcbiIsCisJCQljcC0+bmFtZSwgc3NfdmVuZG9yLCBzc19jYXJkLCBjYXJkLT5iYTBfYWRkciwgY2FyZC0+YmExX2FkZHIsIGNhcmQtPmlycSk7CisJfQorCQorCWlmIChjYXJkLT5hbXBsaWZpZXJfY3RybD09TlVMTCkKKwl7CisJCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gYW1wX25vbmU7CisJCWNhcmQtPmFjdGl2ZV9jdHJsID0gY2xrcnVuX2hhY2s7CisJfQkJCisKKwlpZiAoZXh0ZXJuYWxfYW1wID09IDEpCisJeworCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IENyeXN0YWwgRUFQRCBzdXBwb3J0IGZvcmNlZCBvbi5cbiIpOworCQljYXJkLT5hbXBsaWZpZXJfY3RybCA9IGFtcF92b3lldHJhOworCX0KKworCWlmICh0aGlua3BhZCA9PSAxKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBBY3RpdmF0aW5nIENMS1JVTiBoYWNrIGZvciBUaGlua3BhZC5cbiIpOworCQljYXJkLT5hY3RpdmVfY3RybCA9IGNsa3J1bl9oYWNrOworCX0KKy8qCisqIFRoZSB0aGlua3BhZHMgZG9uJ3Qgd29yayB3ZWxsIHdpdGhvdXQgcnVudGltZSB1cGRhdGluZyBvbiB0aGVpciBrZXJuZWwgCisqIGRlbGF5IHZhbHVlcyAob3IgYW55IGxhcHRvcCB3aXRoIHZhcmlhYmxlIENQVSBzcGVlZHMgcmVhbGx5KS4KKyogc28sIGp1c3QgdG8gYmUgc2FmZSBzZXQgdGhlIGluaXQgZGVsYXkgdG8gMjEwMC4gIEVsaW1pbmF0ZXMKKyogZmFpbHVyZXMgb24gVDIxIFRoaW5rcGFkcy4gIHJlbW92ZSB0aGlzIGNvZGUgd2hlbiB0aGUgdWRlbGF5CisqIGFuZCBtZGVsYXkga2VybmVsIGNvZGUgaXMgcmVwbGFjZWQgYnkgYSBwbSB0aW1lciwgb3IgdGhlIGRlbGF5cworKiB3b3JrIHdlbGwgZm9yIGJhdHRlcnkgYW5kL29yIEFDIHBvd2VyIGJvdGguCisqLworCWlmKGNhcmQtPmFjdGl2ZV9jdHJsID09IGNsa3J1bl9oYWNrKQorCXsKKwkJaW5pdGRlbGF5ID0gMjEwMDsKKwkJY3NfbGFwdG9wX3dhaXQgPSA1OworCX0KKwlpZigoY2FyZC0+YWN0aXZlX2N0cmwgPT0gY2xrcnVuX2hhY2spICYmICEocG93ZXJkb3duID09IDEpKQorCXsKKy8qCisqIGZvciBzb21lIGN1cnJlbnRseSB1bmtub3duIHJlYXNvbiwgcG93ZXJpbmcgZG93biB0aGUgREFDIGFuZCBBREMgY29tcG9uZW50CisqIGJsb2NrcyBvbiB0aGlua3BhZHMgY2F1c2VzIHNvbWUgZnVua3kgYmVoYXZpb3IuLi4gZGlzdG9vcnJydGlvbiBhbmQgYWM5NyAKKyogY29kZWMgYWNjZXNzIHByb2JsZW1zLiAgcHJvYmFibHkgdGhlIHNlcmlhbCBjbG9jayBiZWNvbWVzIHVuc3luY2VkLiAKKyogYWRkZWQgY29kZSB0byBzeW5jIHRoZSBjaGlwcyBiYWNrIHVwLCBidXQgb25seSBoZWxwZWQgYWJvdXQgNzAlIHRoZSB0aW1lLgorKi8KKwkJY3NfcG93ZXJkb3duID0gMDsKKwl9CisJaWYocG93ZXJkb3duID09IDApCisJCWNzX3Bvd2VyZG93biA9IDA7CisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgMSk7CisKKwkvKiBjbGFpbSBvdXIgaW9zcGFjZSBhbmQgaXJxICovCisJCisJY2FyZC0+YmEwID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMF9hZGRyLCBDUzQ2MVhfQkEwX1NJWkUpOworCWNhcmQtPmJhMS5uYW1lLmRhdGEwID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMV9hZGRyICsgQkExX1NQX0RNRU0wLCBDUzQ2MVhfQkExX0RBVEEwX1NJWkUpOworCWNhcmQtPmJhMS5uYW1lLmRhdGExID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMV9hZGRyICsgQkExX1NQX0RNRU0xLCBDUzQ2MVhfQkExX0RBVEExX1NJWkUpOworCWNhcmQtPmJhMS5uYW1lLnBtZW0gPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmExX2FkZHIgKyBCQTFfU1BfUE1FTSwgQ1M0NjFYX0JBMV9QUkdfU0laRSk7CisJY2FyZC0+YmExLm5hbWUucmVnID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMV9hZGRyICsgQkExX1NQX1JFRywgQ1M0NjFYX0JBMV9SRUdfU0laRSk7CisJCisJQ1NfREJHT1VUKENTX0lOSVQsIDQsIHByaW50ayhLRVJOX0lORk8gCisJCSJjczQ2eHg6IGNhcmQ9JXAgY2FyZC0+YmEwPSVwXG4iLGNhcmQsY2FyZC0+YmEwKSApOworCUNTX0RCR09VVChDU19JTklULCA0LCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0Nnh4OiBjYXJkLT5iYTE9JXAgJXAgJXAgJXBcbiIsCisJCQljYXJkLT5iYTEubmFtZS5kYXRhMCwKKwkJCWNhcmQtPmJhMS5uYW1lLmRhdGExLAorCQkJY2FyZC0+YmExLm5hbWUucG1lbSwKKwkJCWNhcmQtPmJhMS5uYW1lLnJlZykgKTsKKworCWlmKGNhcmQtPmJhMCA9PSAwIHx8IGNhcmQtPmJhMS5uYW1lLmRhdGEwID09IDAgfHwKKwkJY2FyZC0+YmExLm5hbWUuZGF0YTEgPT0gMCB8fCBjYXJkLT5iYTEubmFtZS5wbWVtID09IDAgfHwKKwkJY2FyZC0+YmExLm5hbWUucmVnID09IDApCisJCWdvdG8gZmFpbDI7CisJCQorCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZjc19pbnRlcnJ1cHQsIFNBX1NISVJRLCAiY3M0Nnh4IiwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJWRcbiIsIGNhcmQtPmlycSk7CisJCWdvdG8gZmFpbDI7CisJfQorCS8qIHJlZ2lzdGVyIC9kZXYvZHNwICovCisJaWYgKChjYXJkLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmNzNDYxeF9mb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogdW5hYmxlIHRvIHJlZ2lzdGVyIGRzcFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKyAgICAgICAgLyogcmVnaXN0ZXIgL2Rldi9taWRpICovCisgICAgICAgIGlmKChjYXJkLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJmNzX21pZGlfZm9wcywgLTEpKSA8IDApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHVuYWJsZSB0byByZWdpc3RlciBtaWRpXG4iKTsKKyAgICAgICAgICAgICAgICAKKwljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fSURMRTsKKwlmb3IoaT0wO2k8NTtpKyspCisJeworCQlpZiAoY3NfaGFyZHdhcmVfaW5pdChjYXJkKSAhPSAwKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDQsIHByaW50aygKKwkJCQkiY3M0Nnh4OiBFUlJPUiBpbiBjc19oYXJkd2FyZV9pbml0KCkuLi4gcmV0cnlpbmdcbiIpKTsKKwkJCWZvciAoaiA9IDA7IGogPCBOUl9BQzk3OyBqKyspCisJCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbal0gIT0gTlVMTCkgeworCQkJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTdfY29kZWNbal0tPmRldl9taXhlcik7CisJCQkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2pdKTsKKwkJCQl9CisJCQltZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisJaWYoaT49NCkKKwl7CisJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAxLCBwcmludGsoCisJCQkiY3M0Nnh4OiBjczQ2eHhfcHJvYmUoKS0gY3NfaGFyZHdhcmVfaW5pdCgpIGZhaWxlZCwgcmV0cmllZCAlZCB0aW1lcy5cbiIsaSkpOworICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7CisgICAgICAgICAgICAgICAgaWYoY2FyZC0+ZGV2X21pZGkpCisgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX21pZGkoY2FyZC0+ZGV2X21pZGkpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKwl9CisKKyAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+bWlkaS5vcGVuX3dhaXQpOworICAgICAgICBpbml0X01VVEVYKCZjYXJkLT5taWRpLm9wZW5fc2VtKTsKKyAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+bWlkaS5pd2FpdCk7CisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPm1pZGkub3dhaXQpOworICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIE1JRENSX01SU1QpOyAgIAorICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIDApOyAgIAorCisJLyogCisJKiBDaGVjayBpZiB3ZSBoYXZlIHRvIGluaXQgdGhlIGFtcGxpZmllciwgYnV0IHByb2JhYmx5IGFscmVhZHkgZG9uZQorCSogc2luY2UgdGhlIENEIGxvZ2ljIGluIHRoZSBhYzk3IGluaXQgY29kZSB3aWxsIHR1cm4gb24gdGhlIGV4dCBhbXAuCisJKi8KKwlpZihjcC0+YW1wX2luaXQpCisJCWNwLT5hbXBfaW5pdChjYXJkKTsKKyAgICAgICAgY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgLTEpOworCisJUENJX1NFVF9EUklWRVJfREFUQShwY2lfZGV2LCBjYXJkKTsKKwlQQ0lfU0VUX0RNQV9NQVNLKHBjaV9kZXYsIGRtYV9tYXNrKTsKKwlsaXN0X2FkZCgmY2FyZC0+bGlzdCwgJmNzNDZ4eF9kZXZzKTsKKworCXBtZGV2ID0gY3NfcG1fcmVnaXN0ZXIoUE1fUENJX0RFViwgUE1fUENJX0lEKHBjaV9kZXYpLCBjczQ2eHhfcG1fY2FsbGJhY2spOworCWlmIChwbWRldikKKwl7CisJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfUE0sIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0Nnh4OiBwcm9iZSgpIHBtX3JlZ2lzdGVyKCkgc3VjY2VlZGVkICglcCkuXG4iLAorCQkJCXBtZGV2KSk7CisJCXBtZGV2LT5kYXRhID0gY2FyZDsKKwl9CisJZWxzZQorCXsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19QTSB8IENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDZ4eDogcHJvYmUoKSBwbV9yZWdpc3RlcigpIGZhaWxlZCAoJXApLlxuIiwKKwkJCQlwbWRldikpOworCQljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fTk9UX1JFR0lTVEVSRUQ7CisJfQorCisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IHBtLmZsYWdzPTB4JXggY2FyZD0lcFxuIiwKKwkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzLGNhcmQpKTsKKworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJImNzNDZ4eDogcHJvYmUoKS0gZGV2aWNlIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHlcbiIpKTsKKyAgICAgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKK2ZhaWwyOgorCWlmKGNhcmQtPmJhMCkKKwkJaW91bm1hcChjYXJkLT5iYTApOworCWlmKGNhcmQtPmJhMS5uYW1lLmRhdGEwKQorCQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLmRhdGEwKTsKKwlpZihjYXJkLT5iYTEubmFtZS5kYXRhMSkKKwkJaW91bm1hcChjYXJkLT5iYTEubmFtZS5kYXRhMSk7CisJaWYoY2FyZC0+YmExLm5hbWUucG1lbSkKKwkJaW91bm1hcChjYXJkLT5iYTEubmFtZS5wbWVtKTsKKwlpZihjYXJkLT5iYTEubmFtZS5yZWcpCisJCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucmVnKTsKKwlrZnJlZShjYXJkKTsKKwlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQ2eHg6IHByb2JlKCktIG5vIGRldmljZSBhbGxvY2F0ZWRcbiIpKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30gLy8gcHJvYmVfY3M0Nnh4CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNzNDZ4eF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBQQ0lfR0VUX0RSSVZFUl9EQVRBKHBjaV9kZXYpOworCWludCBpOworCXVuc2lnbmVkIGludCB0bXA7CisJCisJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkgImNzNDZ4eDogY3M0Nnh4X3JlbW92ZSgpK1xuIikpOworCisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwxKTsKKwkKKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUEZJRSk7CisJdG1wICY9IH4weDAwMDBmMDNmOworCXRtcCB8PSAgMHgwMDAwMDAxMDsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgdG1wKTsJLyogcGxheWJhY2sgaW50ZXJydXB0IGRpc2FibGUgKi8KKworCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DSUUpOworCXRtcCAmPSB+MHgwMDAwMDAzZjsKKwl0bXAgfD0gIDB4MDAwMDAwMTE7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZGlzYWJsZSAqLworCisJLyoKKyAgICAgICAgICogIFN0b3AgcGxheWJhY2sgRE1BLgorCSAqLworCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wICYgMHgwMDAwZmZmZik7CisKKwkvKgorICAgICAgICAgKiAgU3RvcCBjYXB0dXJlIERNQS4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCAmIDB4ZmZmZjAwMDApOworCisJLyoKKyAgICAgICAgICogIFJlc2V0IHRoZSBwcm9jZXNzb3IuCisgICAgICAgICAqLworCWNzNDYxeF9yZXNldChjYXJkKTsKKworCWNzNDYxeF9wcm9jX3N0b3AoY2FyZCk7CisKKwkvKgorCSAqICBQb3dlciBkb3duIHRoZSBEQUMgYW5kIEFEQy4gIFdlIHdpbGwgcG93ZXIgdGhlbSB1cCAoaWYpIHdoZW4gd2UgbmVlZAorCSAqICB0aGVtLgorCSAqLworCWlmKCAodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAorCQkJQ1NfUE9XRVJfTUlYVk9OLCBDU19UUlVFICkpICkKKwl7CisJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOworCX0KKworCS8qCisJICogIFBvd2VyIGRvd24gdGhlIFBMTC4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCAwKTsKKworCS8qCisJICogIFR1cm4gb2ZmIHRoZSBQcm9jZXNzb3IgYnkgdHVybmluZyBvZmYgdGhlIHNvZnR3YXJlIGNsb2NrIGVuYWJsZSBmbGFnIGluIAorCSAqICB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOworCisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwtMSk7CisKKwkvKiBmcmVlIGhhcmR3YXJlIHJlc291cmNlcyAqLworCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisJaW91bm1hcChjYXJkLT5iYTApOworCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTApOworCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTEpOworCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucG1lbSk7CisJaW91bm1hcChjYXJkLT5iYTEubmFtZS5yZWcpOworCQorCS8qIHVucmVnaXN0ZXIgYXVkaW8gZGV2aWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCisJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKKwkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2ldKTsKKwkJfQorCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7CisgICAgICAgIGlmKGNhcmQtPmRldl9taWRpKQorICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc291bmRfbWlkaShjYXJkLT5kZXZfbWlkaSk7CisJbGlzdF9kZWwoJmNhcmQtPmxpc3QpOworCWtmcmVlKGNhcmQpOworCVBDSV9TRVRfRFJJVkVSX0RBVEEocGNpX2RldixOVUxMKTsKKworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJICJjczQ2eHg6IGNzNDZ4eF9yZW1vdmUoKS06IHJlbW92ZSBzdWNjZXNzZnVsXG4iKSk7Cit9CisKK2VudW0geworCUNTNDZYWF80NjEwID0gMCwKKwlDUzQ2WFhfNDYxMiwgIAkvKiBzYW1lIGFzIDQ2MzAgKi8KKwlDUzQ2WFhfNDYxNSwgIAkvKiBzYW1lIGFzIDQ2MjQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczQ2eHhfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvcgkgICAgID0gUENJX1ZFTkRPUl9JRF9DSVJSVVMsCisJCS5kZXZpY2UJICAgICA9IFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTAsCisJCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IENTNDZYWF80NjEwLAorCX0sCisJeworCQkudmVuZG9yCSAgICAgPSBQQ0lfVkVORE9SX0lEX0NJUlJVUywKKwkJLmRldmljZQkgICAgID0gUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMiwKKwkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gQ1M0NlhYXzQ2MTIsCisJfSwKKwl7CisJCS52ZW5kb3IJICAgICA9IFBDSV9WRU5ET1JfSURfQ0lSUlVTLAorCQkuZGV2aWNlCSAgICAgPSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjE1LAorCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBDUzQ2WFhfNDYxNSwKKwl9LAorCXsgMCwgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjczQ2eHhfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjczQ2eHhfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkgID0gImNzNDZ4eCIsCisJLmlkX3RhYmxlID0gY3M0Nnh4X3BjaV90YmwsCisJLnByb2JlCSAgPSBjczQ2eHhfcHJvYmUsCisJLnJlbW92ZQkgID0gX19kZXZleGl0X3AoY3M0Nnh4X3JlbW92ZSksCisJLnN1c3BlbmQgID0gQ1M0NlhYX1NVU1BFTkRfVEJMLAorCS5yZXN1bWUJICA9IENTNDZYWF9SRVNVTUVfVEJMLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3M0Nnh4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJ0biA9IDA7CisJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDZ4eDogY3M0Nnh4X2luaXRfbW9kdWxlKCkrIFxuIikpOworCXJ0biA9IHBjaV9tb2R1bGVfaW5pdCgmY3M0Nnh4X3BjaV9kcml2ZXIpOworCisJaWYocnRuID09IC1FTk9ERVYpCisJeworCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoIAorCQkJImNzNDZ4eDogVW5hYmxlIHRvIGRldGVjdCB2YWxpZCBjczQ2eHggZGV2aWNlXG4iKSk7CisJfQorCisJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9pbml0X21vZHVsZSgpLSAoJWQpXG4iLHJ0bikpOworCXJldHVybiBydG47Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjczQ2eHhfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNzNDZ4eF9wY2lfZHJpdmVyKTsKKwljc19wbV91bnJlZ2lzdGVyX2FsbChjczQ2eHhfcG1fY2FsbGJhY2spOworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjbGVhbnVwX2NzNDZ4eCgpIGZpbmlzaGVkXG4iKSk7Cit9CisKK21vZHVsZV9pbml0KGNzNDZ4eF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChjczQ2eHhfY2xlYW51cF9tb2R1bGUpOworCisjaWZuZGVmIENTNDZYWF9BQ1BJX1NVUFBPUlQKK3N0YXRpYyBpbnQgY3M0Nnh4X3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQ7CisKKwlDU19EQkdPVVQoQ1NfUE0sIDIsIHByaW50ayhLRVJOX0lORk8gCisJCSJjczQ2eHg6IGNzNDZ4eF9wbV9jYWxsYmFjayBkZXY9JXAgcnFzdD0weCV4IGNhcmQ9JXBcbiIsCisJCQlkZXYsKHVuc2lnbmVkKXJxc3QsZGF0YSkpOworCWNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKikgZGV2LT5kYXRhOworCWlmIChjYXJkKSB7CisJCXN3aXRjaChycXN0KSB7CisJCQljYXNlIFBNX1NVU1BFTkQ6CisJCQkJQ1NfREJHT1VUKENTX1BNLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSJjczQ2eHg6IFBNIHN1c3BlbmQgcmVxdWVzdFxuIikpOworCQkJCWlmKGNzNDZ4eF9zdXNwZW5kKGNhcmQsIDApKQorCQkJCXsKKwkJCQkgICAgQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSJjczQ2eHg6IFBNIHN1c3BlbmQgcmVxdWVzdCByZWZ1c2VkXG4iKSk7CisJCQkJCXJldHVybiAxOyAKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBNX1JFU1VNRToKKwkJCQlDU19EQkdPVVQoQ1NfUE0sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCQkJImNzNDZ4eDogUE0gcmVzdW1lIHJlcXVlc3RcbiIpKTsKKwkJCQlpZihjczQ2eHhfcmVzdW1lKGNhcmQpKQorCQkJCXsKKwkJCQkgICAgQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSJjczQ2eHg6IFBNIHJlc3VtZSByZXF1ZXN0IHJlZnVzZWRcbiIpKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmIENTNDZYWF9BQ1BJX1NVUFBPUlQKK3N0YXRpYyBpbnQgY3M0Nnh4X3N1c3BlbmRfdGJsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqcyA9IFBDSV9HRVRfRFJJVkVSX0RBVEEocGNpZGV2KTsKKwlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgMiwgCisJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmRfdGJsIHJlcXVlc3RcbiIpKTsKKwljczQ2eHhfc3VzcGVuZChzLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQ2eHhfcmVzdW1lX3RibChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCXN0cnVjdCBjc19jYXJkICpzID0gUENJX0dFVF9EUklWRVJfREFUQShwY2lkZXYpOworCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCAyLCAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lX3RibCByZXF1ZXN0XG4iKSk7CisJY3M0Nnh4X3Jlc3VtZShzKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eF93cmFwcGVyLTI0LmggYi9zb3VuZC9vc3MvY3M0Nnh4X3dyYXBwZXItMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhlMDExCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDZ4eF93cmFwcGVyLTI0LmgKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAiY3M0Nnh4X3dyYXBwZXIuYyIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDZYWCBsaW51eCBhdWRpbyBkcml2ZXIuCisqCisqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCisqICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCisqICAgICAgICAgICAgICAgKHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAwMS8xMS8yMDAxIHRydyAtIG5ldyBmaWxlIGZyb20gY3M0MjgxIHdyYXBwZXIgY29kZS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX0NTNDZYWF9XUkFQUEVSMjRfSAorI2RlZmluZSBfX0NTNDZYWF9XUkFQUEVSMjRfSAorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2RlZmluZSBDU19PV05FUiAub3duZXIgPQorI2RlZmluZSBDU19USElTX01PRFVMRSBUSElTX01PRFVMRSwKK3N0YXRpYyBpbmxpbmUgdm9pZCBjczQ2eHhfbnVsbChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KSB7IHJldHVybjsgfQorI2RlZmluZSBjczR4X21lbV9tYXBfcmVzZXJ2ZShwYWdlKSBTZXRQYWdlUmVzZXJ2ZWQocGFnZSkKKyNkZWZpbmUgY3M0eF9tZW1fbWFwX3VucmVzZXJ2ZShwYWdlKSBDbGVhclBhZ2VSZXNlcnZlZChwYWdlKQorCisjZGVmaW5lIGZyZWVfZG1hYnVmKGNhcmQsIGRtYWJ1ZikgXAorCXBjaV9mcmVlX2NvbnNpc3RlbnQoKGNhcmQpLT5wY2lfZGV2LCBcCisJCQkgICAgUEFHRV9TSVpFIDw8IChkbWFidWYpLT5idWZvcmRlciwgXAorCQkJICAgIChkbWFidWYpLT5yYXdidWYsIChkbWFidWYpLT5kbWFhZGRyKTsKKyNkZWZpbmUgZnJlZV9kbWFidWYyKGNhcmQsIGRtYWJ1ZikgXAorCXBjaV9mcmVlX2NvbnNpc3RlbnQoKGNhcmQpLT5wY2lfZGV2LCBcCisJCQkJICAgIFBBR0VfU0laRSA8PCAoZG1hYnVmKS0+YnVmb3JkZXJfdG1wYnVmZiwgXAorCQkJCSAgICAoZG1hYnVmKS0+dG1wYnVmZiwgKGRtYWJ1ZiktPmRtYWFkZHJfdG1wYnVmZik7CisjZGVmaW5lIGNzNHhfcGdvZmYodm1hKSAoKHZtYSktPnZtX3Bnb2ZmKQorCisjZGVmaW5lIFJTUkNJU0lPUkVHSU9OKGRldixudW0pICgoZGV2KS0+cmVzb3VyY2VbKG51bSldLnN0YXJ0ICE9IDAgJiYgXAorCSAoKGRldiktPnJlc291cmNlWyhudW0pXS5mbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UpID09IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pCisjZGVmaW5lIFJTUkNJU01FTU9SWVJFR0lPTihkZXYsbnVtKSAoKGRldiktPnJlc291cmNlWyhudW0pXS5zdGFydCAhPSAwICYmIFwKKwkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWSkKKyNkZWZpbmUgUlNSQ0FERFJFU1MoZGV2LG51bSkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uc3RhcnQpCisjZGVmaW5lIFBDSV9HRVRfRFJJVkVSX0RBVEEgcGNpX2dldF9kcnZkYXRhCisjZGVmaW5lIFBDSV9TRVRfRFJJVkVSX0RBVEEgcGNpX3NldF9kcnZkYXRhCisjZGVmaW5lIFBDSV9TRVRfRE1BX01BU0socGNpZGV2LG1hc2spIHBjaWRldi0+ZG1hX21hc2sgPSBtYXNrCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eHBtLTI0LmggYi9zb3VuZC9vc3MvY3M0Nnh4cG0tMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIwYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDZ4eHBtLTI0LmgKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAiY3M0Nnh4cG0tMjQuaCIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDZYWCBsaW51eCBhdWRpbyBkcml2ZXIuCisqCisqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCisqICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCisqICAgICAgICAgICAgICAgKHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAxMi8yMi8wMCB0cncgLSBuZXcgZmlsZS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX0NTNDZYWFBNMjRfSAorI2RlZmluZSBfX0NTNDZYWFBNMjRfSAorCisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlICJjczQ2eHhwbS5oIgorCisKKyNkZWZpbmUgQ1M0NlhYX0FDUElfU1VQUE9SVCAxCisjaWZkZWYgQ1M0NlhYX0FDUElfU1VQUE9SVAorLyogCisqIGZvciBub3cgKDEyLzIyLzAwKSBvbmx5IGVuYWJsZSB0aGUgcG1fcmVnaXN0ZXIgUE0gc3VwcG9ydC4KKyogYWxsb3cgdGhlc2UgdGFibGUgZW50cmllcyB0byBiZSBudWxsLgorKi8KK3N0YXRpYyBpbnQgY3M0Nnh4X3N1c3BlbmRfdGJsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IGNzNDZ4eF9yZXN1bWVfdGJsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpOworI2RlZmluZSBjc19wbV9yZWdpc3RlcihhLCBiLCBjKSAgTlVMTAorI2RlZmluZSBjc19wbV91bnJlZ2lzdGVyX2FsbChhKSAKKyNkZWZpbmUgQ1M0NlhYX1NVU1BFTkRfVEJMIGNzNDZ4eF9zdXNwZW5kX3RibAorI2RlZmluZSBDUzQ2WFhfUkVTVU1FX1RCTCBjczQ2eHhfcmVzdW1lX3RibAorI2Vsc2UKKyNkZWZpbmUgY3NfcG1fcmVnaXN0ZXIoYSwgYiwgYykgcG1fcmVnaXN0ZXIoKGEpLCAoYiksIChjKSk7CisjZGVmaW5lIGNzX3BtX3VucmVnaXN0ZXJfYWxsKGEpIHBtX3VucmVnaXN0ZXJfYWxsKChhKSk7CisjZGVmaW5lIENTNDZYWF9TVVNQRU5EX1RCTCBjczQ2eHhfbnVsbAorI2RlZmluZSBDUzQ2WFhfUkVTVU1FX1RCTCBjczQ2eHhfbnVsbAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eHBtLmggYi9zb3VuZC9vc3MvY3M0Nnh4cG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTMyYjZlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDZ4eHBtLmgKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAiY3M0Nnh4cG0uaCIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDZYWCBsaW51eCBhdWRpbyBkcml2ZXIuCisqCisqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCisqICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCisqICAgICAgICAgICAgICAgKHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAxMi8yMi8wMCB0cncgLSBuZXcgZmlsZS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX0NTNDZYWFBNX0gKKyNkZWZpbmUgX19DUzQ2WFhQTV9ICisKKyNkZWZpbmUgQ1M0NlhYX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRSAweDI2CisjZGVmaW5lIENTNDZYWF9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1MgKENTNDZYWF9BQzk3X0hJR0hFU1RSRUdUT1JFU1RPUkUvMi0xKQorCisvKiBQTSBzdGF0ZSBkZWZpbnRpb25zICovCisjZGVmaW5lIENTNDZYWF9QTV9OT1RfUkVHSVNURVJFRAkweDEwMDAKKyNkZWZpbmUgQ1M0NlhYX1BNX0lETEUJCQkweDAwMDEKKyNkZWZpbmUgQ1M0NlhYX1BNX1NVU1BFTkRJTkcJCTB4MDAwMgorI2RlZmluZSBDUzQ2WFhfUE1fU1VTUEVOREVECQkweDAwMDQKKyNkZWZpbmUgQ1M0NlhYX1BNX1JFU1VNSU5HCQkweDAwMDgKKyNkZWZpbmUgQ1M0NlhYX1BNX1JFU1VNRUQJCTB4MDAxMAorCisjZGVmaW5lIENTX1BPV0VSX0RBQwkJCTB4MDAwMQorI2RlZmluZSBDU19QT1dFUl9BREMJCQkweDAwMDIKKyNkZWZpbmUgQ1NfUE9XRVJfTUlYVk9OCQkJMHgwMDA0CisjZGVmaW5lIENTX1BPV0VSX01JWFZPRkYJCTB4MDAwOAorI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfT04JMHhmMDAwICAvKiBhbHdheXMgb24gYml0cyAoaW52ZXJ0ZWQpICovCisjZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BREMJMHgwMTAwCisjZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUMJMHgwMjAwCisjZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT04JMHgwNDAwCisjZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGCTB4MDgwMAorI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OCTB4MDAwMQorI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OCTB4MDAwMgorI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OCTB4MDAwNAorI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTiAweDAwMDgKKworc3RydWN0IGNzNDZ4eF9wbSB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdTMyQ0xLQ1IxX1NBVkUsdTMyU1NQTVZhbHVlLHUzMlBQTFZDdmFsdWUsdTMyUFBSVkN2YWx1ZTsKKwl1MzIgdTMyRk1MVkN2YWx1ZSx1MzJGTVJWQ3ZhbHVlLHUzMkdQSU9SdmFsdWUsdTMySlNDVEx2YWx1ZSx1MzJTU0NSOworCXUzMiB1MzJTUkNTQSx1MzJEYWNBU1IsdTMyQWRjQVNSLHUzMkRhY1NSLHUzMkFkY1NSLHUzMk1JRENSX1NhdmU7CisJdTMyIHUzMlNTUE1fQklUUzsKKwl1MzIgYWM5N1tDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTXTsKKwl1MzIgdTMyQUM5N19tYXN0ZXJfdm9sdW1lLCB1MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUsIHUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vOworCXUzMiB1MzJBQzk3X3BjbV9vdXRfdm9sdW1lLCB1MzJBQzk3X3Bvd2VyZG93biwgdTMyQUM5N19nZW5lcmFsX3B1cnBvc2U7CisJdTMyIHUzMmh3cHRyX3BsYXliYWNrLHUzMmh3cHRyX2NhcHR1cmU7CisJdW5zaWduZWQgZG1hYnVmX3N3cHRyX3BsYXk7CisJaW50IGRtYWJ1Zl9jb3VudF9wbGF5OworCXVuc2lnbmVkIGRtYWJ1Zl9zd3B0cl9jYXB0dXJlOworCWludCBkbWFidWZfY291bnRfY2FwdHVyZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2Rldl90YWJsZS5jIGIvc291bmQvb3NzL2Rldl90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWE5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZGV2X3RhYmxlLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBzb3VuZC9kZXZfdGFibGUuYworICoKKyAqIERldmljZSBjYWxsIHRhYmxlcy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2RlZmluZSBfREVWX1RBQkxFX0NfCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKK3N0YXRpYyBpbnQgc291bmRfYWxsb2NfYXVkaW9kZXYodm9pZCk7CisKK2ludCBzb3VuZF9pbnN0YWxsX2F1ZGlvZHJ2KGludCB2ZXJzLCBjaGFyICpuYW1lLCBzdHJ1Y3QgYXVkaW9fZHJpdmVyICpkcml2ZXIsCisJCQlpbnQgZHJpdmVyX3NpemUsIGludCBmbGFncywgdW5zaWduZWQgaW50IGZvcm1hdF9tYXNrLAorCQkJdm9pZCAqZGV2YywgaW50IGRtYTEsIGludCBkbWEyKQoreworCXN0cnVjdCBhdWRpb19kcml2ZXIgKmQ7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKm9wOworCWludCBudW07CisKKwlpZiAodmVycyAhPSBBVURJT19EUklWRVJfVkVSU0lPTiB8fCBkcml2ZXJfc2l6ZSA+IHNpemVvZihzdHJ1Y3QgYXVkaW9fZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBJbmNvbXBhdGlibGUgYXVkaW8gZHJpdmVyIGZvciAlc1xuIiwgbmFtZSk7CisJCXJldHVybiAtKEVJTlZBTCk7CisJfQorCW51bSA9IHNvdW5kX2FsbG9jX2F1ZGlvZGV2KCk7CisKKwlpZiAobnVtID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAic291bmQ6IFRvbyBtYW55IGF1ZGlvIGRyaXZlcnNcbiIpOworCQlyZXR1cm4gLShFQlVTWSk7CisJfQorCWQgPSAoc3RydWN0IGF1ZGlvX2RyaXZlciAqKSAoc291bmRfbWVtX2Jsb2Nrc1tzb3VuZF9uYmxvY2tzXSA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19kcml2ZXIpKSk7CisKKwlpZiAoc291bmRfbmJsb2NrcyA8IDEwMjQpCisJCXNvdW5kX25ibG9ja3MrKzsKKworCW9wID0gKHN0cnVjdCBhdWRpb19vcGVyYXRpb25zICopIChzb3VuZF9tZW1fYmxvY2tzW3NvdW5kX25ibG9ja3NdID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMpKSk7CisKKwlpZiAoc291bmRfbmJsb2NrcyA8IDEwMjQpCisJCXNvdW5kX25ibG9ja3MrKzsKKwlpZiAoZCA9PSBOVUxMIHx8IG9wID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogQ2FuJ3QgYWxsb2NhdGUgZHJpdmVyIGZvciAoJXMpXG4iLCBuYW1lKTsKKwkJc291bmRfdW5sb2FkX2F1ZGlvZGV2KG51bSk7CisJCXJldHVybiAtKEVOT01FTSk7CisJfQorCW1lbXNldCgoY2hhciAqKSBvcCwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19vcGVyYXRpb25zKSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmb3AtPmluX3NsZWVwZXIpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9wLT5vdXRfc2xlZXBlcik7CQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9wLT5wb2xsX3NsZWVwZXIpOworCWlmIChkcml2ZXJfc2l6ZSA8IHNpemVvZihzdHJ1Y3QgYXVkaW9fZHJpdmVyKSkKKwkJbWVtc2V0KChjaGFyICopIGQsIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fZHJpdmVyKSk7CisKKwltZW1jcHkoKGNoYXIgKikgZCwgKGNoYXIgKikgZHJpdmVyLCBkcml2ZXJfc2l6ZSk7CisKKwlvcC0+ZCA9IGQ7CisJc3RybGNweShvcC0+bmFtZSwgbmFtZSwgc2l6ZW9mKG9wLT5uYW1lKSk7CisJb3AtPmZsYWdzID0gZmxhZ3M7CisJb3AtPmZvcm1hdF9tYXNrID0gZm9ybWF0X21hc2s7CisJb3AtPmRldmMgPSBkZXZjOworCisJLyoKKwkgKiAgICBIYXJkY29kZWQgZGVmYXVsdHMKKwkgKi8KKwlhdWRpb19kZXZzW251bV0gPSBvcDsKKworCURNQWJ1Zl9pbml0KG51bSwgZG1hMSwgZG1hMik7CisKKwlhdWRpb19pbml0X2RldmljZXMoKTsKKwlyZXR1cm4gbnVtOworfQorCitpbnQgc291bmRfaW5zdGFsbF9taXhlcihpbnQgdmVycywgY2hhciAqbmFtZSwgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKmRyaXZlciwKKwlpbnQgZHJpdmVyX3NpemUsIHZvaWQgKmRldmMpCit7CisJc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKm9wOworCisJaW50IG4gPSBzb3VuZF9hbGxvY19taXhlcmRldigpOworCisJaWYgKG4gPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogVG9vIG1hbnkgbWl4ZXIgZHJpdmVyc1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICh2ZXJzICE9IE1JWEVSX0RSSVZFUl9WRVJTSU9OIHx8CisJCWRyaXZlcl9zaXplID4gc2l6ZW9mKHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBJbmNvbXBhdGlibGUgbWl4ZXIgZHJpdmVyIGZvciAlc1xuIiwgbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwkvKiBGSVhNRTogVGhpcyBsZWFrcyBhIG1peGVyX29wZXJhdGlvbnMgc3RydWN0IGV2ZXJ5IHRpbWUgaXRzIGNhbGxlZAorCSAgIHVudGlsIHlvdSB1bmxvYWQgc291bmQhICovCisJICAgCisJb3AgPSAoc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKikgKHNvdW5kX21lbV9ibG9ja3Nbc291bmRfbmJsb2Nrc10gPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucykpKTsKKworCWlmIChzb3VuZF9uYmxvY2tzIDwgMTAyNCkKKwkJc291bmRfbmJsb2NrcysrOworCWlmIChvcCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IENhbid0IGFsbG9jYXRlIG1peGVyIGRyaXZlciBmb3IgKCVzKVxuIiwgbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoKGNoYXIgKikgb3AsIDAsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucykpOworCW1lbWNweSgoY2hhciAqKSBvcCwgKGNoYXIgKikgZHJpdmVyLCBkcml2ZXJfc2l6ZSk7CisKKwlzdHJsY3B5KG9wLT5uYW1lLCBuYW1lLCBzaXplb2Yob3AtPm5hbWUpKTsKKwlvcC0+ZGV2YyA9IGRldmM7CisKKwltaXhlcl9kZXZzW25dID0gb3A7CisJcmV0dXJuIG47Cit9CisKK3ZvaWQgc291bmRfdW5sb2FkX2F1ZGlvZGV2KGludCBkZXYpCit7CisJaWYgKGRldiAhPSAtMSkgeworCQlETUFidWZfZGVpbml0KGRldik7CisJCWF1ZGlvX2RldnNbZGV2XSA9IE5VTEw7CisJCXVucmVnaXN0ZXJfc291bmRfZHNwKChkZXY8PDQpKzMpOworCX0KK30KKworc3RhdGljIGludCBzb3VuZF9hbGxvY19hdWRpb2Rldih2b2lkKQoreyAKKwlpbnQgaSA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmb3NzX3NvdW5kX2ZvcHMsIC0xKTsKKwlpZihpPT0tMSkKKwkJcmV0dXJuIGk7CisJaT4+PTQ7CisJaWYoaT49bnVtX2F1ZGlvZGV2cykKKwkJbnVtX2F1ZGlvZGV2cyA9IGkgKyAxOworCXJldHVybiBpOworfQorCitpbnQgc291bmRfYWxsb2NfbWlkaWRldih2b2lkKQoreworCWludCBpID0gcmVnaXN0ZXJfc291bmRfbWlkaSgmb3NzX3NvdW5kX2ZvcHMsIC0xKTsKKwlpZihpPT0tMSkKKwkJcmV0dXJuIGk7CisJaT4+PTQ7CisJaWYoaT49bnVtX21pZGlzKQorCQludW1fbWlkaXMgPSBpICsgMTsKKwlyZXR1cm4gaTsKK30KKworaW50IHNvdW5kX2FsbG9jX3N5bnRoZGV2KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NZTlRIX0RFVjsgaSsrKSB7CisJCWlmIChzeW50aF9kZXZzW2ldID09IE5VTEwpIHsKKwkJCWlmIChpID49IG51bV9zeW50aHMpCisJCQkJbnVtX3N5bnRocysrOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQgc291bmRfYWxsb2NfbWl4ZXJkZXYodm9pZCkKK3sKKwlpbnQgaSA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZvc3Nfc291bmRfZm9wcywgLTEpOworCWlmKGk9PS0xKQorCQlyZXR1cm4gLTE7CisJaT4+PTQ7CisJaWYoaT49bnVtX21peGVycykKKwkJbnVtX21peGVycyA9IGkgKyAxOworCXJldHVybiBpOworfQorCitpbnQgc291bmRfYWxsb2NfdGltZXJkZXYodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVElNRVJfREVWOyBpKyspIHsKKwkJaWYgKHNvdW5kX3RpbWVyX2RldnNbaV0gPT0gTlVMTCkgeworCQkJaWYgKGkgPj0gbnVtX3NvdW5kX3RpbWVycykKKwkJCQludW1fc291bmRfdGltZXJzKys7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgc291bmRfdW5sb2FkX21peGVyZGV2KGludCBkZXYpCit7CisJaWYgKGRldiAhPSAtMSkgeworCQltaXhlcl9kZXZzW2Rldl0gPSBOVUxMOworCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGRldjw8NCk7CisJCW51bV9taXhlcnMtLTsKKwl9Cit9CisKK3ZvaWQgc291bmRfdW5sb2FkX21pZGlkZXYoaW50IGRldikKK3sKKwlpZiAoZGV2ICE9IC0xKSB7CisJCW1pZGlfZGV2c1tkZXZdID0gTlVMTDsKKwkJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKChkZXY8PDQpKzIpOworCX0KK30KKwordm9pZCBzb3VuZF91bmxvYWRfc3ludGhkZXYoaW50IGRldikKK3sKKwlpZiAoZGV2ICE9IC0xKQorCQlzeW50aF9kZXZzW2Rldl0gPSBOVUxMOworfQorCit2b2lkIHNvdW5kX3VubG9hZF90aW1lcmRldihpbnQgZGV2KQoreworCWlmIChkZXYgIT0gLTEpCisJCXNvdW5kX3RpbWVyX2RldnNbZGV2XSA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZGV2X3RhYmxlLmggYi9zb3VuZC9vc3MvZGV2X3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmMWQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kZXZfdGFibGUuaApAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAqCWRldl90YWJsZS5oCisgKgorICoJR2xvYmFsIGRlZmluaXRpb25zIGZvciBkZXZpY2UgY2FsbCB0YWJsZXMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKworCisjaWZuZGVmIF9ERVZfVEFCTEVfSF8KKyNkZWZpbmUgX0RFVl9UQUJMRV9IXworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKy8qCisgKiBTb3VuZCBjYXJkIG51bWJlcnMgMjcgdG8gOTk5LiAoMSB0byAyNiBhcmUgZGVmaW5lZCBpbiBzb3VuZGNhcmQuaCkKKyAqIE51bWJlcnMgMTAwMCB0byBOIGFyZSByZXNlcnZlZCBmb3IgZHJpdmVyJ3MgaW50ZXJuYWwgdXNlLgorICovCisKKyNkZWZpbmUgU05EQ0FSRF9ERVNLUFJPWEwJCTI3CS8qIENvbXBhcSBEZXNrcHJvIFhMICovCisjZGVmaW5lIFNORENBUkRfVklEQwkJCTI4CS8qIEFSTXMgVklEQyAqLworI2RlZmluZSBTTkRDQVJEX1NCUE5QCQkJMjkKKyNkZWZpbmUgU05EQ0FSRF9TT0ZUT1NTCQkJMzYKKyNkZWZpbmUgU05EQ0FSRF9WTUlESQkJCTM3CisjZGVmaW5lIFNORENBUkRfT1BMM1NBMQkJCTM4CS8qIE5vdGU6IGNsYXNoIGluIG1zbmQuaCAqLworI2RlZmluZSBTTkRDQVJEX09QTDNTQTFfU0IJCTM5CisjZGVmaW5lIFNORENBUkRfT1BMM1NBMV9NUFUJCTQwCisjZGVmaW5lIFNORENBUkRfV0FWRUZST05UICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgU05EQ0FSRF9PUEwzU0EyICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBTTkRDQVJEX09QTDNTQTJfTVBVICAgICAgICAgICAgIDQzCisjZGVmaW5lIFNORENBUkRfV0FWRUFSVElTVCAgICAgICAgICAgICAgNDQJLyogV2F2ZWFydGlzdCAqLworI2RlZmluZSBTTkRDQVJEX09QTDNTQTJfTVNTICAgICAgICAgICAgIDQ1CS8qIE9yaWdpbmFsbHkgbWlzc2VkICovCisjZGVmaW5lIFNORENBUkRfQUQxODE2ICAgICAgICAgICAgICAgICAgODgKKworLyoKKyAqCU5PVEUhIAlOT1RFIQlOT1RFIQlOT1RFIQorICoKKyAqCUlmIHlvdSBtb2RpZnkgdGhpcyBmaWxlLCBwbGVhc2UgY2hlY2sgdGhlIGRldl90YWJsZS5jIGFsc28uCisgKgorICoJTk9URSEgCU5PVEUhCU5PVEUhCU5PVEUhCisgKi8KKworc3RydWN0IGRyaXZlcl9pbmZvIAoreworCWNoYXIgKmRyaXZlcl9pZDsKKwlpbnQgY2FyZF9zdWJ0eXBlOwkvKiBEcml2ZXIgc3BlY2lmaWMuIFVzdWFsbHkgMCAqLworCWludCBjYXJkX3R5cGU7CQkvKglGcm9tIHNvdW5kY2FyZC5oCSovCisJY2hhciAqbmFtZTsKKwl2b2lkICgqYXR0YWNoKSAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKTsKKwlpbnQgKCpwcm9iZSkgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZyk7CisJdm9pZCAoKnVubG9hZCkgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZyk7Cit9OworCitzdHJ1Y3QgY2FyZF9pbmZvIAoreworCWludCBjYXJkX3R5cGU7CS8qIExpbmsgKHNlYXJjaCBrZXkpIHRvIHRoZSBkcml2ZXIgbGlzdCAqLworCXN0cnVjdCBhZGRyZXNzX2luZm8gY29uZmlnOworCWludCBlbmFibGVkOworCXZvaWQgKmZvcl9kcml2ZXJfdXNlOworfTsKKworCisvKgorICogRGV2aWNlIHNwZWNpZmljIHBhcmFtZXRlcnMgKHVzZWQgb25seSBieSBkbWFidWYuYykKKyAqLworI2RlZmluZSBNQVhfU1VCX0JVRkZFUlMJCSgzMipNQVhfUkVBTFRJTUVfRkFDVE9SKQorCisjZGVmaW5lIERNT0RFX05PTkUJCTAKKyNkZWZpbmUgRE1PREVfT1VUUFVUCQlQQ01fRU5BQkxFX09VVFBVVAorI2RlZmluZSBETU9ERV9JTlBVVAkJUENNX0VOQUJMRV9JTlBVVAorCitzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAKK3sKKwlpbnQgICAgICBkbWFfbW9kZTsJLyogRE1PREVfSU5QVVQsIERNT0RFX09VVFBVVCBvciBETU9ERV9OT05FICovCisJaW50CSBjbG9zaW5nOworCisJLyoKKyAJICogUG9pbnRlcnMgdG8gcmF3IGJ1ZmZlcnMKKyAJICovCisKKyAgCWNoYXIgICAgICpyYXdfYnVmOworICAgIAl1bnNpZ25lZCBsb25nICAgcmF3X2J1Zl9waHlzOworCWludCBidWZmc2l6ZTsKKworICAgICAJLyoKKyAgICAgICAgICogRGV2aWNlIHN0YXRlIHRhYmxlcworICAgICAgICAgKi8KKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZGVmaW5lIERNQV9CVVNZCTB4MDAwMDAwMDEKKyNkZWZpbmUgRE1BX1JFU1RBUlQJMHgwMDAwMDAwMgorI2RlZmluZSBETUFfQUNUSVZFCTB4MDAwMDAwMDQKKyNkZWZpbmUgRE1BX1NUQVJURUQJMHgwMDAwMDAwOAorI2RlZmluZSBETUFfRU1QVFkJMHgwMDAwMDAxMAkKKyNkZWZpbmUgRE1BX0FMTE9DX0RPTkUJMHgwMDAwMDAyMAorI2RlZmluZSBETUFfU1lOQ0lORwkweDAwMDAwMDQwCisjZGVmaW5lIERNQV9ESVJUWQkweDAwMDAwMDgwCisjZGVmaW5lIERNQV9QT1NUCTB4MDAwMDAxMDAKKyNkZWZpbmUgRE1BX05PRE1BCTB4MDAwMDAyMDAKKyNkZWZpbmUgRE1BX05PVElNRU9VVAkweDAwMDAwNDAwCisKKwlpbnQgICAgICBvcGVuX21vZGU7CisKKwkvKgorCSAqIFF1ZXVlIHBhcmFtZXRlcnMuCisJICovCisJaW50ICAgICAgcWxlbjsKKwlpbnQgICAgICBxaGVhZDsKKwlpbnQgICAgICBxdGFpbDsKKwlzcGlubG9ja190IGxvY2s7CisJCQorCWludAkgY2ZyYWc7CS8qIEN1cnJlbnQgaW5jb21wbGV0ZSBmcmFnbWVudCAod3JpdGUpICovCisKKwlpbnQgICAgICBuYnVmczsKKwlpbnQgICAgICBjb3VudHNbTUFYX1NVQl9CVUZGRVJTXTsKKwlpbnQgICAgICBzdWJkaXZpc2lvbjsKKworCWludCAgICAgIGZyYWdtZW50X3NpemU7CisgICAgICAgIGludAkgbmVlZHNfcmVvcmc7CisJaW50CSBtYXhfZnJhZ21lbnRzOworCisJaW50CSBieXRlc19pbl91c2U7CisKKwlpbnQJIHVuZGVycnVuX2NvdW50OworCXVuc2lnbmVkIGxvbmcJIGJ5dGVfY291bnRlcjsKKwl1bnNpZ25lZCBsb25nCSB1c2VyX2NvdW50ZXI7CisJdW5zaWduZWQgbG9uZwkgbWF4X2J5dGVfY291bnRlcjsKKwlpbnQJIGRhdGFfcmF0ZTsgLyogQnl0ZXMvc2Vjb25kICovCisKKwlpbnQJIG1hcHBpbmdfZmxhZ3M7CisjZGVmaW5lCQkJRE1BX01BUF9NQVBQRUQJCTB4MDAwMDAwMDEKKwljaGFyCW5ldXRyYWxfYnl0ZTsKKwlpbnQJZG1hOwkJLyogRE1BIGNoYW5uZWwgKi8KKworCWludCAgICAgYXBwbGljX3Byb2ZpbGU7CS8qIEFwcGxpY2F0aW9uIHByb2ZpbGUgKEFQRl8qKSAqLworCS8qIEludGVycnVwdCBjYWxsYmFjayBzdHVmZiAqLworCXZvaWQgKCphdWRpb19jYWxsYmFjaykgKGludCBkZXYsIGludCBwYXJtKTsKKwlpbnQgY2FsbGJhY2tfcGFybTsKKworCWludAkgYnVmX2ZsYWdzW01BWF9TVUJfQlVGRkVSU107CisjZGVmaW5lCQkgQlVGRl9FT0YJCTB4MDAwMDAwMDEgLyogSW5jcmVtZW50IGVvZiBjb3VudCAqLworI2RlZmluZQkJIEJVRkZfRElSVFkJCTB4MDAwMDAwMDIgLyogQnVmZmVyIHdyaXR0ZW4gKi8KK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIHVzZSB3aXRoIHZhcmlvdXMgbWljcm9jb250cm9sbGVycyBhbmQgRFNQIHByb2Nlc3NvcnMgCisgKiBpbiB0aGUgcmVjZW50IHNvdW5kIGNhcmRzLgorICovCit0eXBlZGVmIHN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAKK3sKKwljaGFyIG5hbWVbNjRdOworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCWludCAoKm9wZW4pICh2b2lkICpkZXZjLCBpbnQgc3ViX2RldmljZSk7CisJdm9pZCAoKmNsb3NlKSAodm9pZCAqZGV2YywgaW50IHN1Yl9kZXZpY2UpOworCWludCAoKmlvY3RsKSAodm9pZCAqZGV2YywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcsIGludCBsb2NhbCk7CisJdm9pZCAoKnJlc2V0KSAodm9pZCAqZGV2Yyk7CisKKwl2b2lkICpkZXZjOwkJLyogRHJpdmVyIHNwZWNpZmljIGluZm8gKi8KK30gY29wcm9jX29wZXJhdGlvbnM7CisKK3N0cnVjdCBhdWRpb19kcml2ZXIgCit7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJaW50ICgqb3BlbikgKGludCBkZXYsIGludCBtb2RlKTsKKwl2b2lkICgqY2xvc2UpIChpbnQgZGV2KTsKKwl2b2lkICgqb3V0cHV0X2Jsb2NrKSAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIAorCQkJICAgICAgaW50IGNvdW50LCBpbnQgaW50cmZsYWcpOworCXZvaWQgKCpzdGFydF9pbnB1dCkgKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCAKKwkJCSAgICAgaW50IGNvdW50LCBpbnQgaW50cmZsYWcpOworCWludCAoKmlvY3RsKSAoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpOworCWludCAoKnByZXBhcmVfZm9yX2lucHV0KSAoaW50IGRldiwgaW50IGJ1ZnNpemUsIGludCBuYnVmcyk7CisJaW50ICgqcHJlcGFyZV9mb3Jfb3V0cHV0KSAoaW50IGRldiwgaW50IGJ1ZnNpemUsIGludCBuYnVmcyk7CisJdm9pZCAoKmhhbHRfaW8pIChpbnQgZGV2KTsKKwlpbnQgKCpsb2NhbF9xbGVuKShpbnQgZGV2KTsKKwl2b2lkICgqY29weV91c2VyKSAoaW50IGRldiwKKwkJCWNoYXIgKmxvY2FsYnVmLCBpbnQgbG9jYWxvZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsIGludCB1c2Vyb2ZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfaW4sIGludCBtYXhfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp1c2VkLCBpbnQgKnJldHVybmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CisJdm9pZCAoKmhhbHRfaW5wdXQpIChpbnQgZGV2KTsKKwl2b2lkICgqaGFsdF9vdXRwdXQpIChpbnQgZGV2KTsKKwl2b2lkICgqdHJpZ2dlcikgKGludCBkZXYsIGludCBiaXRzKTsKKwlpbnQgKCpzZXRfc3BlZWQpKGludCBkZXYsIGludCBzcGVlZCk7CisJdW5zaWduZWQgaW50ICgqc2V0X2JpdHMpKGludCBkZXYsIHVuc2lnbmVkIGludCBiaXRzKTsKKwlzaG9ydCAoKnNldF9jaGFubmVscykoaW50IGRldiwgc2hvcnQgY2hhbm5lbHMpOworCXZvaWQgKCpwb3N0cHJvY2Vzc193cml0ZSkoaW50IGRldik7IAkvKiBEZXZpY2Ugc3Blc2lmaWMgcG9zdHByb2Nlc3NpbmcgZm9yIHdyaXR0ZW4gZGF0YSAqLworCXZvaWQgKCpwcmVwcm9jZXNzX3JlYWQpKGludCBkZXYpOyAJLyogRGV2aWNlIHNwZXNpZmljIHByZXByb2Nlc3NpbmcgZm9yIHJlYWQgZGF0YSAqLworCXZvaWQgKCptbWFwKShpbnQgZGV2KTsKK307CisKK3N0cnVjdCBhdWRpb19vcGVyYXRpb25zIAoreworICAgICAgICBjaGFyIG5hbWVbMTI4XTsKKwlpbnQgZmxhZ3M7CisjZGVmaW5lIE5PVEhJTkdfU1BFQ0lBTCAJMHgwMAorI2RlZmluZSBORUVEU19SRVNUQVJUCQkweDAxCisjZGVmaW5lIERNQV9BVVRPTU9ERQkJMHgwMgorI2RlZmluZSBETUFfRFVQTEVYCQkweDA0CisjZGVmaW5lIERNQV9QU0VVRE9fQVVUT01PREUJMHgwOAorI2RlZmluZSBETUFfSEFSRFNUT1AJCTB4MTAKKyNkZWZpbmUgRE1BX0VYQUNUCQkweDQwCisjZGVmaW5lIERNQV9OT1JFU0VUCQkweDgwCisJaW50ICBmb3JtYXRfbWFzazsJLyogQml0bWFzayBmb3Igc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMgKi8KKwl2b2lkICpkZXZjOwkJLyogRHJpdmVyIHNwZWNpZmljIGluZm8gKi8KKwlzdHJ1Y3QgYXVkaW9fZHJpdmVyICpkOworCXZvaWQgKnBvcnRjOwkJLyogRHJpdmVyIHNwZWNpZmljIGluZm8gKi8KKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcF9pbiwgKmRtYXBfb3V0OworCXN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAqY29wcm9jOworCWludCBtaXhlcl9kZXY7CisJaW50IGVuYWJsZV9iaXRzOworIAlpbnQgb3Blbl9tb2RlOworCWludCBnbzsKKwlpbnQgbWluX2ZyYWdtZW50OwkvKiAwID09IHVubGltaXRlZCAqLworCWludCBtYXhfZnJhZ21lbnQ7CS8qIDAgPT0gdW5saW1pdGVkICovCisJaW50IHBhcmVudF9kZXY7CQkvKiAwIC0+IG5vIHBhcmVudCwgMSB0byBuIC0+IHBhcmVudD1wYXJlbnRfZGV2KzEgKi8KKworCS8qIGZpZWxkcyBmb3JtZXJseSBpbiBkbWFidWYuYyAqLworCXdhaXRfcXVldWVfaGVhZF90IGluX3NsZWVwZXI7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3V0X3NsZWVwZXI7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcG9sbF9zbGVlcGVyOworCisJLyogZmllbGRzIGZvcm1lcmx5IGluIGF1ZGlvLmMgKi8KKwlpbnQgYXVkaW9fbW9kZTsKKworI2RlZmluZQkJQU1fTk9ORQkJMAorI2RlZmluZQkJQU1fV1JJVEUJT1BFTl9XUklURQorI2RlZmluZSAJQU1fUkVBRAkJT1BFTl9SRUFECisKKwlpbnQgbG9jYWxfZm9ybWF0OworCWludCBhdWRpb19mb3JtYXQ7CisJaW50IGxvY2FsX2NvbnZlcnNpb247CisjZGVmaW5lIENOVl9NVV9MQVcJMHgwMDAwMDAwMQorCisJLyogbGFyZ2Ugc3RydWN0dXJlcyBhdCB0aGUgZW5kIHRvIGtlZXAgb2Zmc2V0cyBzbWFsbCAqLworCXN0cnVjdCBkbWFfYnVmZnBhcm1zIGRtYXBzWzJdOworfTsKKworaW50ICpsb2FkX21peGVyX3ZvbHVtZXMoY2hhciAqbmFtZSwgaW50ICpsZXZlbHMsIGludCBwcmVzZW50KTsKKworc3RydWN0IG1peGVyX29wZXJhdGlvbnMgCit7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJY2hhciBpZFsxNl07CisJY2hhciBuYW1lWzY0XTsKKwlpbnQgKCppb2N0bCkgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKTsKKwkKKwl2b2lkICpkZXZjOworCWludCBtb2RpZnlfY291bnRlcjsKK307CisKK3N0cnVjdCBzeW50aF9vcGVyYXRpb25zIAoreworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCWNoYXIgKmlkOwkvKiBVbmlxdWUgaWRlbnRpZmllciAoQVNDSUkpIG1heCAyOSBjaGFyICovCisJc3RydWN0IHN5bnRoX2luZm8gKmluZm87CisJaW50IG1pZGlfZGV2OworCWludCBzeW50aF90eXBlOworCWludCBzeW50aF9zdWJ0eXBlOworCisJaW50ICgqb3BlbikgKGludCBkZXYsIGludCBtb2RlKTsKKwl2b2lkICgqY2xvc2UpIChpbnQgZGV2KTsKKwlpbnQgKCppb2N0bCkgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKTsKKwlpbnQgKCpraWxsX25vdGUpIChpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBub3RlLCBpbnQgdmVsb2NpdHkpOworCWludCAoKnN0YXJ0X25vdGUpIChpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBub3RlLCBpbnQgdmVsb2NpdHkpOworCWludCAoKnNldF9pbnN0cikgKGludCBkZXYsIGludCB2b2ljZSwgaW50IGluc3RyKTsKKwl2b2lkICgqcmVzZXQpIChpbnQgZGV2KTsKKwl2b2lkICgqaHdfY29udHJvbCkgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KTsKKwlpbnQgKCpsb2FkX3BhdGNoKSAoaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJICAgICBpbnQgb2ZmcywgaW50IGNvdW50LCBpbnQgcG1ncl9mbGFnKTsKKwl2b2lkICgqYWZ0ZXJ0b3VjaCkgKGludCBkZXYsIGludCB2b2ljZSwgaW50IHByZXNzdXJlKTsKKwl2b2lkICgqY29udHJvbGxlcikgKGludCBkZXYsIGludCB2b2ljZSwgaW50IGN0cmxfbnVtLCBpbnQgdmFsdWUpOworCXZvaWQgKCpwYW5uaW5nKSAoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgdmFsdWUpOworCXZvaWQgKCp2b2x1bWVfbWV0aG9kKSAoaW50IGRldiwgaW50IG1vZGUpOworCXZvaWQgKCpiZW5kZXIpIChpbnQgZGV2LCBpbnQgY2huLCBpbnQgdmFsdWUpOworCWludCAoKmFsbG9jX3ZvaWNlKSAoaW50IGRldiwgaW50IGNobiwgaW50IG5vdGUsIHN0cnVjdCB2b2ljZV9hbGxvY19pbmZvICphbGxvYyk7CisJdm9pZCAoKnNldHVwX3ZvaWNlKSAoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgY2huKTsKKwlpbnQgKCpzZW5kX3N5c2V4KShpbnQgZGV2LCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CisKKyAJc3RydWN0IHZvaWNlX2FsbG9jX2luZm8gYWxsb2M7CisgCXN0cnVjdCBjaGFubmVsX2luZm8gY2huX2luZm9bMTZdOworCWludCBlbXVsYXRpb247CisjZGVmaW5lCUVNVV9HTQkJCTEJLyogR2VuZXJhbCBNSURJICovCisjZGVmaW5lCUVNVV9YRwkJCTIJLyogWWFtYWhhIFhHICovCisjZGVmaW5lIE1BWF9TWVNFWF9CVUYJNjQKKwl1bnNpZ25lZCBjaGFyIHN5c2V4X2J1ZltNQVhfU1lTRVhfQlVGXTsKKwlpbnQgc3lzZXhfcHRyOworfTsKKworc3RydWN0IG1pZGlfaW5wdXRfaW5mbyAKK3sKKwkvKiBNSURJIGlucHV0IHNjYW5uZXIgdmFyaWFibGVzICovCisjZGVmaW5lIE1JX01BWAkxMAorCXZvbGF0aWxlIGludCAgICAgICAgICAgICBtX2J1c3k7CisgICAgCXVuc2lnbmVkIGNoYXIgICBtX2J1ZltNSV9NQVhdOworCXVuc2lnbmVkIGNoYXIJbV9wcmV2X3N0YXR1czsJLyogRm9yIHJ1bm5pbmcgc3RhdHVzICovCisgICAgCWludCAgICAgICAgICAgICBtX3B0cjsKKyNkZWZpbmUgTVNUX0lOSVQJCQkwCisjZGVmaW5lIE1TVF9EQVRBCQkJMQorI2RlZmluZSBNU1RfU1lTRVgJCQkyCisgICAgCWludCAgICAgICAgICAgICBtX3N0YXRlOworICAgIAlpbnQgICAgICAgICAgICAgbV9sZWZ0OworfTsKKworc3RydWN0IG1pZGlfb3BlcmF0aW9ucyAKK3sKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwlzdHJ1Y3QgbWlkaV9pbmZvIGluZm87CisJc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgKmNvbnZlcnRlcjsKKwlzdHJ1Y3QgbWlkaV9pbnB1dF9pbmZvIGluX2luZm87CisJaW50ICgqb3BlbikgKGludCBkZXYsIGludCBtb2RlLAorCQl2b2lkICgqaW5wdXRpbnRyKShpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpLAorCQl2b2lkICgqb3V0cHV0aW50cikoaW50IGRldikKKwkJKTsKKwl2b2lkICgqY2xvc2UpIChpbnQgZGV2KTsKKwlpbnQgKCppb2N0bCkgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKTsKKwlpbnQgKCpvdXRwdXRjKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKTsKKwlpbnQgKCpzdGFydF9yZWFkKSAoaW50IGRldik7CisJaW50ICgqZW5kX3JlYWQpIChpbnQgZGV2KTsKKwl2b2lkICgqa2ljaykoaW50IGRldik7CisJaW50ICgqY29tbWFuZCkgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmRhdGEpOworCWludCAoKmJ1ZmZlcl9zdGF0dXMpIChpbnQgZGV2KTsKKwlpbnQgKCpwcmVmaXhfY21kKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBzdGF0dXMpOworCXN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAqY29wcm9jOworCXZvaWQgKmRldmM7Cit9OworCitzdHJ1Y3Qgc291bmRfbG93bGV2X3RpbWVyIAoreworCWludCBkZXY7CisJaW50IHByaW9yaXR5OworCXVuc2lnbmVkIGludCAoKnRtcl9zdGFydCkoaW50IGRldiwgdW5zaWduZWQgaW50IHVzZWNzKTsKKwl2b2lkICgqdG1yX2Rpc2FibGUpKGludCBkZXYpOworCXZvaWQgKCp0bXJfcmVzdGFydCkoaW50IGRldik7Cit9OworCitzdHJ1Y3Qgc291bmRfdGltZXJfb3BlcmF0aW9ucyAKK3sKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwlzdHJ1Y3Qgc291bmRfdGltZXJfaW5mbyBpbmZvOworCWludCBwcmlvcml0eTsKKwlpbnQgZGV2bGluazsKKwlpbnQgKCpvcGVuKShpbnQgZGV2LCBpbnQgbW9kZSk7CisJdm9pZCAoKmNsb3NlKShpbnQgZGV2KTsKKwlpbnQgKCpldmVudCkoaW50IGRldiwgdW5zaWduZWQgY2hhciAqZXYpOworCXVuc2lnbmVkIGxvbmcgKCpnZXRfdGltZSkoaW50IGRldik7CisJaW50ICgqaW9jdGwpIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZyk7CisJdm9pZCAoKmFybV90aW1lcikoaW50IGRldiwgbG9uZyB0aW1lKTsKK307CisKKyNpZmRlZiBfREVWX1RBQkxFX0NfICAgCitzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYXVkaW9fZGV2c1tNQVhfQVVESU9fREVWXTsKK2ludCBudW1fYXVkaW9kZXZzOworc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKm1peGVyX2RldnNbTUFYX01JWEVSX0RFVl07CitpbnQgbnVtX21peGVyczsKK3N0cnVjdCBzeW50aF9vcGVyYXRpb25zICpzeW50aF9kZXZzW01BWF9TWU5USF9ERVYrTUFYX01JRElfREVWXTsKK2ludCBudW1fc3ludGhzOworc3RydWN0IG1pZGlfb3BlcmF0aW9ucyAqbWlkaV9kZXZzW01BWF9NSURJX0RFVl07CitpbnQgbnVtX21pZGlzOworCitleHRlcm4gc3RydWN0IHNvdW5kX3RpbWVyX29wZXJhdGlvbnMgZGVmYXVsdF9zb3VuZF90aW1lcjsKK3N0cnVjdCBzb3VuZF90aW1lcl9vcGVyYXRpb25zICpzb3VuZF90aW1lcl9kZXZzW01BWF9USU1FUl9ERVZdID0geworCSZkZWZhdWx0X3NvdW5kX3RpbWVyLCBOVUxMCit9OyAKK2ludCBudW1fc291bmRfdGltZXJzID0gMTsKKyNlbHNlCitleHRlcm4gc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmF1ZGlvX2RldnNbTUFYX0FVRElPX0RFVl07CitleHRlcm4gaW50IG51bV9hdWRpb2RldnM7CitleHRlcm4gc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKm1peGVyX2RldnNbTUFYX01JWEVSX0RFVl07CitleHRlcm4gaW50IG51bV9taXhlcnM7CitleHRlcm4gc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgKnN5bnRoX2RldnNbTUFYX1NZTlRIX0RFVitNQVhfTUlESV9ERVZdOworZXh0ZXJuIGludCBudW1fc3ludGhzOworZXh0ZXJuIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgKm1pZGlfZGV2c1tNQVhfTUlESV9ERVZdOworZXh0ZXJuIGludCBudW1fbWlkaXM7CitleHRlcm4gc3RydWN0IHNvdW5kX3RpbWVyX29wZXJhdGlvbnMgKiBzb3VuZF90aW1lcl9kZXZzW01BWF9USU1FUl9ERVZdOworZXh0ZXJuIGludCBudW1fc291bmRfdGltZXJzOworI2VuZGlmCS8qIF9ERVZfVEFCTEVfQ18gKi8KKworZXh0ZXJuIGludCBzb3VuZF9tYXBfYnVmZmVyIChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCwgYnVmZm1lbV9kZXNjICppbmZvKTsKK3ZvaWQgc291bmRfdGltZXJfaW5pdCAoc3RydWN0IHNvdW5kX2xvd2xldl90aW1lciAqdCwgY2hhciAqbmFtZSk7Cit2b2lkIHNvdW5kX2RtYV9pbnRyIChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCwgaW50IGNoYW4pOworCisjZGVmaW5lIEFVRElPX0RSSVZFUl9WRVJTSU9OCTIKKyNkZWZpbmUgTUlYRVJfRFJJVkVSX1ZFUlNJT04JMgoraW50IHNvdW5kX2luc3RhbGxfYXVkaW9kcnYoaW50IHZlcnMsIGNoYXIgKm5hbWUsIHN0cnVjdCBhdWRpb19kcml2ZXIgKmRyaXZlciwKKwkJCWludCBkcml2ZXJfc2l6ZSwgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgZm9ybWF0X21hc2ssCisJCQl2b2lkICpkZXZjLCBpbnQgZG1hMSwgaW50IGRtYTIpOworaW50IHNvdW5kX2luc3RhbGxfbWl4ZXIoaW50IHZlcnMsIGNoYXIgKm5hbWUsIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zICpkcml2ZXIsCisJCQlpbnQgZHJpdmVyX3NpemUsIHZvaWQgKmRldmMpOworCit2b2lkIHNvdW5kX3VubG9hZF9hdWRpb2RldihpbnQgZGV2KTsKK3ZvaWQgc291bmRfdW5sb2FkX21peGVyZGV2KGludCBkZXYpOwordm9pZCBzb3VuZF91bmxvYWRfbWlkaWRldihpbnQgZGV2KTsKK3ZvaWQgc291bmRfdW5sb2FkX3N5bnRoZGV2KGludCBkZXYpOwordm9pZCBzb3VuZF91bmxvYWRfdGltZXJkZXYoaW50IGRldik7CitpbnQgc291bmRfYWxsb2NfbWl4ZXJkZXYodm9pZCk7CitpbnQgc291bmRfYWxsb2NfdGltZXJkZXYodm9pZCk7CitpbnQgc291bmRfYWxsb2Nfc3ludGhkZXYodm9pZCk7CitpbnQgc291bmRfYWxsb2NfbWlkaWRldih2b2lkKTsKKyNlbmRpZgkvKiBfREVWX1RBQkxFX0hfICovCisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbS5oIGIvc291bmQvb3NzL2RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhOTA1OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbS5oCkBAIC0wLDAgKzEsNzkgQEAKKyNpZm5kZWYgX0RSSVZFUlNfU09VTkRfRE1fSAorI2RlZmluZSBfRFJJVkVSU19TT1VORF9ETV9ICisKKy8qCisgKglEZWZpbml0aW9ucyBvZiB0aGUgJ2RpcmVjdCBtaWRpIHNvdW5kJyBpbnRlcmZhY2UgdXNlZAorICoJYnkgdGhlIG5ld2VyIGNvbW1lcmNpYWwgT1NTIHBhY2thZ2UuIFdlIHNob3VsZCBleHBvcnQKKyAqCXRoaXMgdG8gdXNlcmxhbmQgc29tZXdoZXJlIGluIGdsaWJjIGxhdGVyLgorICovCisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBjb21wb3NpbmcgYW4gRk0gIm5vdGUiIG9yIHNvdW5kIGV2ZW50LgorICovCisKK3N0cnVjdCBkbV9mbV92b2ljZQoreworCXU4IG9wOworCXU4IHZvaWNlOworCXU4IGFtOworCXU4IHZpYnJhdG87CisJdTggZG9fc3VzdGFpbjsKKwl1OCBrYmRfc2NhbGU7CisJdTggaGFybW9uaWM7CisJdTggc2NhbGVfbGV2ZWw7CisJdTggdm9sdW1lOworCXU4IGF0dGFjazsKKwl1OCBkZWNheTsKKwl1OCBzdXN0YWluOworCXU4IHJlbGVhc2U7CisJdTggZmVlZGJhY2s7CisJdTggY29ubmVjdGlvbjsKKwl1OCBsZWZ0OworCXU4IHJpZ2h0OworCXU4IHdhdmVmb3JtOworfTsKKworLyoKKyAqCVRoaXMgZGVzY3JpYmVzIGFuIEZNIG5vdGUgYnkgaXRzIHZvaWNlLCBvY3RhdmUsIGZyZXF1ZW5jeSBudW1iZXIgKDEwYml0KQorICoJYW5kIGtleSBvbi9vZmYuCisgKi8KKworc3RydWN0IGRtX2ZtX25vdGUKK3sKKwl1OCB2b2ljZTsKKwl1OCBvY3RhdmU7CisJdTMyIGZudW07CisJdTgga2V5X29uOworfTsKKworLyoKKyAqIEZNIHBhcmFtZXRlcnMgdGhhdCBhcHBseSBnbG9iYWxseSB0byBhbGwgdm9pY2VzLCBhbmQgdGh1cyBhcmUgbm90ICJub3RlcyIKKyAqLworCitzdHJ1Y3QgZG1fZm1fcGFyYW1zCit7CisJdTggYW1fZGVwdGg7CisJdTggdmliX2RlcHRoOworCXU4IGtiZF9zcGxpdDsKKwl1OCByaHl0aG07CisKKwkvKiBUaGlzIGJsb2NrIGlzIHRoZSBwZXJjdXNzaW9uIGluc3RydW1lbnQgZGF0YSAqLworCXU4IGJhc3M7CisJdTggc25hcmU7CisJdTggdG9tdG9tOworCXU4IGN5bWJhbDsKKwl1OCBoaWhhdDsKK307CisKKy8qCisgKglGTSBtb2RlIGlvY3RsIHNldHRpbmdzCisgKi8KKyAKKyNkZWZpbmUgRk1fSU9DVExfUkVTRVQgICAgICAgIDB4MjAKKyNkZWZpbmUgRk1fSU9DVExfUExBWV9OT1RFICAgIDB4MjEKKyNkZWZpbmUgRk1fSU9DVExfU0VUX1ZPSUNFICAgIDB4MjIKKyNkZWZpbmUgRk1fSU9DVExfU0VUX1BBUkFNUyAgIDB4MjMKKyNkZWZpbmUgRk1fSU9DVExfU0VUX01PREUgICAgIDB4MjQKKyNkZWZpbmUgRk1fSU9DVExfU0VUX09QTCAgICAgIDB4MjUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hYnVmLmMgYi9zb3VuZC9vc3MvZG1hYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmNDI0NAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFidWYuYwpAQCAtMCwwICsxLDEyOTggQEAKKy8qCisgKiBzb3VuZC9kbWFidWYuYworICoKKyAqIFRoZSBETUEgYnVmZmVyIG1hbmFnZXIgZm9yIGRpZ2l0aXplZCB2b2ljZSBhcHBsaWNhdGlvbnMKKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFRob21hcyBTYWlsZXIgICA6IG1vdmVkIHNldmVyYWwgc3RhdGljIHZhcmlhYmxlcyBpbnRvIHN0cnVjdCBhdWRpb19vcGVyYXRpb25zCisgKiAgICAgICAgICAgICAgICAgICAod2hpY2ggaXMgZ3Jvc3NseSBtaXNuYW1lZCBidHcuKSBiZWNhdXNlIHRoZXkgaGF2ZSB0aGUgc2FtZQorICogICAgICAgICAgICAgICAgICAgbGlmZXRpbWUgYXMgdGhlIHJlc3QgaW4gdGhlcmUgYW5kIGR5bmFtaWMgYWxsb2NhdGlvbiBzYXZlcworICogICAgICAgICAgICAgICAgICAgMTJrIG9yIHNvCisgKiBUaG9tYXMgU2FpbGVyICAgOiByZW1vdmUge2luLG91dH1fc2xlZXBfZmxhZy4gSXQgd2FzIHVzZWQgZm9yIHRoZSBzbGVlcGVyIHRvCisgKiAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmUgaWYgaXQgd2FzIHdva2VuIHVwIGJ5IHRoZSBleHBpcmluZyB0aW1lb3V0IG9yIGJ5CisgKiAgICAgICAgICAgICAgICAgICBhbiBleHBsaWNpdCB3YWtlX3VwLiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gc2NoZWR1bGVfdGltZW91dAorICoJCSAgICAgY2FuIGJlIHVzZWQgaW5zdGVhZDsgaWYgMCwgdGhlIHdha2V1cCB3YXMgZHVlIHRvIHRoZSB0aW1lb3V0LgorICoKKyAqIFJvYiBSaWdncwkJQWRkZWQgcGVyc2lzdGVudCBETUEgYnVmZmVycyAoMTk5OC8xMC8xNykKKyAqLworCisjZGVmaW5lIEJFX0NPTlNFUlZBVElWRQorI2RlZmluZSBTQU1QTEVfUk9VTkRVUCAwCisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2RlZmluZSBETUFQX0ZSRUVfT05fQ0xPU0UgICAgICAwCisjZGVmaW5lIERNQVBfS0VFUF9PTl9DTE9TRSAgICAgIDEKK2V4dGVybiBpbnQgc291bmRfZG1hcF9mbGFnOworCitzdGF0aWMgdm9pZCBkbWFfcmVzZXRfb3V0cHV0KGludCBkZXYpOworc3RhdGljIHZvaWQgZG1hX3Jlc2V0X2lucHV0KGludCBkZXYpOworc3RhdGljIGludCBsb2NhbF9zdGFydF9kbWEoc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIGludCBjb3VudCwgaW50IGRtYV9tb2RlKTsKKworCisKK3N0YXRpYyBpbnQgZGVidWdtZW07ICAgIAkvKiBzd2l0Y2hlZCBvZmYgYnkgZGVmYXVsdCAqLworc3RhdGljIGludCBkbWFfYnVmZnNpemUgPSBEU1BfQlVGRlNJWkU7CisKK3N0YXRpYyBsb25nIGRtYWJ1Zl90aW1lb3V0KHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwKQoreworCWxvbmcgdG1vdXQ7CisKKwl0bW91dCA9IChkbWFwLT5mcmFnbWVudF9zaXplICogSFopIC8gZG1hcC0+ZGF0YV9yYXRlOworCXRtb3V0ICs9IEhaIC8gNTsJLyogU29tZSBzYWZldHkgZGlzdGFuY2UgKi8KKwlpZiAodG1vdXQgPCAoSFogLyAyKSkKKwkJdG1vdXQgPSBIWiAvIDI7CisJaWYgKHRtb3V0ID4gMjAgKiBIWikKKwkJdG1vdXQgPSAyMCAqIEhaOworCXJldHVybiB0bW91dDsKK30KKworc3RhdGljIGludCBzb3VuZF9hbGxvY19kbWFwKHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwKQoreworCWNoYXIgKnN0YXJ0X2FkZHIsICplbmRfYWRkcjsKKwlpbnQgZG1hX3BhZ2VzaXplOworCWludCBzeiwgc2l6ZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWRtYXAtPm1hcHBpbmdfZmxhZ3MgJj0gfkRNQV9NQVBfTUFQUEVEOworCisJaWYgKGRtYXAtPnJhd19idWYgIT0gTlVMTCkKKwkJcmV0dXJuIDA7CS8qIEFscmVhZHkgZG9uZSAqLworCWlmIChkbWFfYnVmZnNpemUgPCA0MDk2KQorCQlkbWFfYnVmZnNpemUgPSA0MDk2OworCWRtYV9wYWdlc2l6ZSA9IChkbWFwLT5kbWEgPCA0KSA/ICg2NCAqIDEwMjQpIDogKDEyOCAqIDEwMjQpOworCQorCS8qCisJICoJTm93IGNoZWNrIGZvciB0aGUgQ3lyaXggcHJvYmxlbS4KKwkgKi8KKwkgCisJaWYoaXNhX2RtYV9icmlkZ2VfYnVnZ3k9PTIpCisJCWRtYV9wYWdlc2l6ZT0zMjc2ODsKKwkgCisJZG1hcC0+cmF3X2J1ZiA9IE5VTEw7CisJZG1hcC0+YnVmZnNpemUgPSBkbWFfYnVmZnNpemU7CisJaWYgKGRtYXAtPmJ1ZmZzaXplID4gZG1hX3BhZ2VzaXplKQorCQlkbWFwLT5idWZmc2l6ZSA9IGRtYV9wYWdlc2l6ZTsKKwlzdGFydF9hZGRyID0gTlVMTDsKKwkvKgorCSAqIE5vdyBsb29wIHVudGlsIHdlIGdldCBhIGZyZWUgYnVmZmVyLiBUcnkgdG8gZ2V0IHNtYWxsZXIgYnVmZmVyIGlmCisJICogaXQgZmFpbHMuIERvbid0IGFjY2VwdCBzbWFsbGVyIHRoYW4gOGsgYnVmZmVyIGZvciBwZXJmb3JtYW5jZQorCSAqIHJlYXNvbnMuCisJICovCisJd2hpbGUgKHN0YXJ0X2FkZHIgPT0gTlVMTCAmJiBkbWFwLT5idWZmc2l6ZSA+IFBBR0VfU0laRSkgeworCQlmb3IgKHN6ID0gMCwgc2l6ZSA9IFBBR0VfU0laRTsgc2l6ZSA8IGRtYXAtPmJ1ZmZzaXplOyBzeisrLCBzaXplIDw8PSAxKTsKKwkJZG1hcC0+YnVmZnNpemUgPSBQQUdFX1NJWkUgKiAoMSA8PCBzeik7CisJCXN0YXJ0X2FkZHIgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUN8R0ZQX0RNQXxfX0dGUF9OT1dBUk4sIHN6KTsKKwkJaWYgKHN0YXJ0X2FkZHIgPT0gTlVMTCkKKwkJCWRtYXAtPmJ1ZmZzaXplIC89IDI7CisJfQorCisJaWYgKHN0YXJ0X2FkZHIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZCBlcnJvcjogQ291bGRuJ3QgYWxsb2NhdGUgRE1BIGJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCS8qIG1ha2Ugc29tZSBjaGVja3MgKi8KKwkJZW5kX2FkZHIgPSBzdGFydF9hZGRyICsgZG1hcC0+YnVmZnNpemUgLSAxOworCisJCWlmIChkZWJ1Z21lbSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzb3VuZDogc3RhcnQgMHglbHgsIGVuZCAweCVseFxuIiwgKGxvbmcpIHN0YXJ0X2FkZHIsIChsb25nKSBlbmRfYWRkcik7CisJCQorCQkvKiBub3cgY2hlY2sgaWYgaXQgZml0cyBpbnRvIHRoZSBzYW1lIGRtYS1wYWdlc2l6ZSAqLworCisJCWlmICgoKGxvbmcpIHN0YXJ0X2FkZHIgJiB+KGRtYV9wYWdlc2l6ZSAtIDEpKSAhPSAoKGxvbmcpIGVuZF9hZGRyICYgfihkbWFfcGFnZXNpemUgLSAxKSkKKwkJICAgIHx8IGVuZF9hZGRyID49IChjaGFyICopIChNQVhfRE1BX0FERFJFU1MpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNvdW5kOiBHb3QgaW52YWxpZCBhZGRyZXNzIDB4JWx4IGZvciAlZGIgRE1BLWJ1ZmZlclxuIiwgKGxvbmcpIHN0YXJ0X2FkZHIsIGRtYXAtPmJ1ZmZzaXplKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCWRtYXAtPnJhd19idWYgPSBzdGFydF9hZGRyOworCWRtYXAtPnJhd19idWZfcGh5cyA9IHZpcnRfdG9fYnVzKHN0YXJ0X2FkZHIpOworCisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHN0YXJ0X2FkZHIpOyBwYWdlIDw9IHZpcnRfdG9fcGFnZShlbmRfYWRkcik7IHBhZ2UrKykKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb3VuZF9mcmVlX2RtYXAoc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXApCit7CisJaW50IHN6LCBzaXplOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgZW5kX2FkZHI7CisKKwlpZiAoZG1hcC0+cmF3X2J1ZiA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGRtYXAtPm1hcHBpbmdfZmxhZ3MgJiBETUFfTUFQX01BUFBFRCkKKwkJcmV0dXJuOwkJLyogRG9uJ3QgZnJlZSBtbWFwcGVkIGJ1ZmZlci4gV2lsbCB1c2UgaXQgbmV4dCB0aW1lICovCisJZm9yIChzeiA9IDAsIHNpemUgPSBQQUdFX1NJWkU7IHNpemUgPCBkbWFwLT5idWZmc2l6ZTsgc3orKywgc2l6ZSA8PD0gMSk7CisKKwlzdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGRtYXAtPnJhd19idWY7CisJZW5kX2FkZHIgPSBzdGFydF9hZGRyICsgZG1hcC0+YnVmZnNpemU7CisKKwlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc3RhcnRfYWRkcik7IHBhZ2UgPD0gdmlydF90b19wYWdlKGVuZF9hZGRyKTsgcGFnZSsrKQorCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGRtYXAtPnJhd19idWYsIHN6KTsKKwlkbWFwLT5yYXdfYnVmID0gTlVMTDsKK30KKworCisvKiBJbnRlbCB2ZXJzaW9uICEhISEhISEhISAqLworCitzdGF0aWMgaW50IHNvdW5kX3N0YXJ0X2RtYShzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCwgdW5zaWduZWQgbG9uZyBwaHlzYWRkciwgaW50IGNvdW50LCBpbnQgZG1hX21vZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY2hhbiA9IGRtYXAtPmRtYTsKKworCS8qIHByaW50ayggIlN0YXJ0IERNQSVkICVkLCAlZFxuIiwgIGNoYW4sICAoaW50KShwaHlzYWRkci1kbWFwLT5yYXdfYnVmX3BoeXMpLCAgY291bnQpOyAqLworCisJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGNoYW4pOworCWNsZWFyX2RtYV9mZihjaGFuKTsKKwlzZXRfZG1hX21vZGUoY2hhbiwgZG1hX21vZGUpOworCXNldF9kbWFfYWRkcihjaGFuLCBwaHlzYWRkcik7CisJc2V0X2RtYV9jb3VudChjaGFuLCBjb3VudCk7CisJZW5hYmxlX2RtYShjaGFuKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF9idWZmZXJzKHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwKQoreworCWRtYXAtPnFsZW4gPSBkbWFwLT5xaGVhZCA9IGRtYXAtPnF0YWlsID0gZG1hcC0+dXNlcl9jb3VudGVyID0gMDsKKwlkbWFwLT5ieXRlX2NvdW50ZXIgPSAwOworCWRtYXAtPm1heF9ieXRlX2NvdW50ZXIgPSA4MDAwICogNjAgKiA2MDsKKwlkbWFwLT5ieXRlc19pbl91c2UgPSBkbWFwLT5idWZmc2l6ZTsKKworCWRtYXAtPmRtYV9tb2RlID0gRE1PREVfTk9ORTsKKwlkbWFwLT5tYXBwaW5nX2ZsYWdzID0gMDsKKwlkbWFwLT5uZXV0cmFsX2J5dGUgPSAweDgwOworCWRtYXAtPmRhdGFfcmF0ZSA9IDgwMDA7CisJZG1hcC0+Y2ZyYWcgPSAtMTsKKwlkbWFwLT5jbG9zaW5nID0gMDsKKwlkbWFwLT5uYnVmcyA9IDE7CisJZG1hcC0+ZmxhZ3MgPSBETUFfQlVTWTsJLyogT3RoZXIgZmxhZ3Mgb2ZmICovCit9CisKK3N0YXRpYyBpbnQgb3Blbl9kbWFwKHN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2LCBpbnQgbW9kZSwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXApCit7CisJaW50IGVycjsKKwkKKwlpZiAoZG1hcC0+ZmxhZ3MgJiBETUFfQlVTWSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAoKGVyciA9IHNvdW5kX2FsbG9jX2RtYXAoZG1hcCkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChkbWFwLT5yYXdfYnVmID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQ6IERNQSBidWZmZXJzIG5vdCBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLUVOT1NQQzsJLyogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGR1cmluZyBib290ICovCisJfQorCWlmIChkbWFwLT5kbWEgPj0gMCAmJiBzb3VuZF9vcGVuX2RtYShkbWFwLT5kbWEsIGFkZXYtPm5hbWUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBncmFiKDIpIERNQSVkIGZvciB0aGUgYXVkaW8gZHJpdmVyXG4iLCBkbWFwLT5kbWEpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlkbWFfaW5pdF9idWZmZXJzKGRtYXApOworCXNwaW5fbG9ja19pbml0KCZkbWFwLT5sb2NrKTsKKwlkbWFwLT5vcGVuX21vZGUgPSBtb2RlOworCWRtYXAtPnN1YmRpdmlzaW9uID0gZG1hcC0+dW5kZXJydW5fY291bnQgPSAwOworCWRtYXAtPmZyYWdtZW50X3NpemUgPSAwOworCWRtYXAtPm1heF9mcmFnbWVudHMgPSA2NTUzNjsJLyogSnVzdCBhIGxhcmdlIHZhbHVlICovCisJZG1hcC0+Ynl0ZV9jb3VudGVyID0gMDsKKwlkbWFwLT5tYXhfYnl0ZV9jb3VudGVyID0gODAwMCAqIDYwICogNjA7CisJZG1hcC0+YXBwbGljX3Byb2ZpbGUgPSBBUEZfTk9STUFMOworCWRtYXAtPm5lZWRzX3Jlb3JnID0gMTsKKwlkbWFwLT5hdWRpb19jYWxsYmFjayA9IE5VTEw7CisJZG1hcC0+Y2FsbGJhY2tfcGFybSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX2RtYXAoc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYsIHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRtYXAtPmRtYSA+PSAwKSB7CisJCXNvdW5kX2Nsb3NlX2RtYShkbWFwLT5kbWEpOworCQlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShkbWFwLT5kbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwl9CisJaWYgKGRtYXAtPmZsYWdzICYgRE1BX0JVU1kpCisJCWRtYXAtPmRtYV9tb2RlID0gRE1PREVfTk9ORTsKKwlkbWFwLT5mbGFncyAmPSB+RE1BX0JVU1k7CisJCisJaWYgKHNvdW5kX2RtYXBfZmxhZyA9PSBETUFQX0ZSRUVfT05fQ0xPU0UpCisJCXNvdW5kX2ZyZWVfZG1hcChkbWFwKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGRlZmF1bHRfc2V0X2JpdHMoaW50IGRldiwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7CisKKwlzZXRfZnMoZ2V0X2RzKCkpOworCWF1ZGlvX2RldnNbZGV2XS0+ZC0+aW9jdGwoZGV2LCBTTkRDVExfRFNQX1NFVEZNVCwgKHZvaWQgX191c2VyICopJmJpdHMpOworCXNldF9mcyhmcyk7CisJcmV0dXJuIGJpdHM7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9zZXRfc3BlZWQoaW50IGRldiwgaW50IHNwZWVkKQoreworCW1tX3NlZ21lbnRfdCBmcyA9IGdldF9mcygpOworCisJc2V0X2ZzKGdldF9kcygpKTsKKwlhdWRpb19kZXZzW2Rldl0tPmQtPmlvY3RsKGRldiwgU05EQ1RMX0RTUF9TUEVFRCwgKHZvaWQgX191c2VyICopJnNwZWVkKTsKKwlzZXRfZnMoZnMpOworCXJldHVybiBzcGVlZDsKK30KKworc3RhdGljIHNob3J0IGRlZmF1bHRfc2V0X2NoYW5uZWxzKGludCBkZXYsIHNob3J0IGNoYW5uZWxzKQoreworCWludCBjID0gY2hhbm5lbHM7CisJbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7CisKKwlzZXRfZnMoZ2V0X2RzKCkpOworCWF1ZGlvX2RldnNbZGV2XS0+ZC0+aW9jdGwoZGV2LCBTTkRDVExfRFNQX0NIQU5ORUxTLCAodm9pZCBfX3VzZXIgKikmYyk7CisJc2V0X2ZzKGZzKTsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZHJpdmVyKHN0cnVjdCBhdWRpb19kcml2ZXIgKmQpCit7CisJaWYgKGQtPnNldF9zcGVlZCA9PSBOVUxMKQorCQlkLT5zZXRfc3BlZWQgPSBkZWZhdWx0X3NldF9zcGVlZDsKKwlpZiAoZC0+c2V0X2JpdHMgPT0gTlVMTCkKKwkJZC0+c2V0X2JpdHMgPSBkZWZhdWx0X3NldF9iaXRzOworCWlmIChkLT5zZXRfY2hhbm5lbHMgPT0gTlVMTCkKKwkJZC0+c2V0X2NoYW5uZWxzID0gZGVmYXVsdF9zZXRfY2hhbm5lbHM7Cit9CisKK2ludCBETUFidWZfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwX2luID0gTlVMTDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcF9vdXQgPSBOVUxMOworCisJaWYgKCFhZGV2KQorCQkgIHJldHVybiAtRU5YSU87CisJaWYgKCEoYWRldi0+ZmxhZ3MgJiBETUFfRFVQTEVYKSkKKwkJYWRldi0+ZG1hcF9pbiA9IGFkZXYtPmRtYXBfb3V0OworCWNoZWNrX2RyaXZlcihhZGV2LT5kKTsKKworCWlmICgocmV0dmFsID0gYWRldi0+ZC0+b3BlbihkZXYsIG1vZGUpKSA8IDApCisJCXJldHVybiByZXR2YWw7CisJZG1hcF9vdXQgPSBhZGV2LT5kbWFwX291dDsKKwlkbWFwX2luID0gYWRldi0+ZG1hcF9pbjsKKwlpZiAoZG1hcF9pbiA9PSBkbWFwX291dCkKKwkJYWRldi0+ZmxhZ3MgJj0gfkRNQV9EVVBMRVg7CisKKwlpZiAobW9kZSAmIE9QRU5fV1JJVEUpIHsKKwkJaWYgKChyZXR2YWwgPSBvcGVuX2RtYXAoYWRldiwgbW9kZSwgZG1hcF9vdXQpKSA8IDApIHsKKwkJCWFkZXYtPmQtPmNsb3NlKGRldik7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorCWFkZXYtPmVuYWJsZV9iaXRzID0gbW9kZTsKKworCWlmIChtb2RlID09IE9QRU5fUkVBRCB8fCAobW9kZSAhPSBPUEVOX1dSSVRFICYmIChhZGV2LT5mbGFncyAmIERNQV9EVVBMRVgpKSkgeworCQlpZiAoKHJldHZhbCA9IG9wZW5fZG1hcChhZGV2LCBtb2RlLCBkbWFwX2luKSkgPCAwKSB7CisJCQlhZGV2LT5kLT5jbG9zZShkZXYpOworCQkJaWYgKG1vZGUgJiBPUEVOX1dSSVRFKQorCQkJCWNsb3NlX2RtYXAoYWRldiwgZG1hcF9vdXQpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKwlhZGV2LT5vcGVuX21vZGUgPSBtb2RlOworCWFkZXYtPmdvID0gMTsKKworCWFkZXYtPmQtPnNldF9iaXRzKGRldiwgOCk7CisJYWRldi0+ZC0+c2V0X2NoYW5uZWxzKGRldiwgMSk7CisJYWRldi0+ZC0+c2V0X3NwZWVkKGRldiwgRFNQX0RFRkFVTFRfU1BFRUQpOworCWlmIChhZGV2LT5kbWFwX291dC0+ZG1hX21vZGUgPT0gRE1PREVfT1VUUFVUKSAKKwkJbWVtc2V0KGFkZXYtPmRtYXBfb3V0LT5yYXdfYnVmLCBhZGV2LT5kbWFwX291dC0+bmV1dHJhbF9ieXRlLAorCQkgICAgICAgYWRldi0+ZG1hcF9vdXQtPmJ5dGVzX2luX3VzZSk7CisJcmV0dXJuIDA7Cit9CisvKiBNVVNUIG5vdCBob2xkIHRoZSBzcGlubG9jayAqLwordm9pZCBETUFidWZfcmVzZXQoaW50IGRldikKK3sKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKQorCQlkbWFfcmVzZXRfb3V0cHV0KGRldik7CisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpCisJCWRtYV9yZXNldF9pbnB1dChkZXYpOworfQorCitzdGF0aWMgdm9pZCBkbWFfcmVzZXRfb3V0cHV0KGludCBkZXYpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJdW5zaWduZWQgbG9uZyBmbGFncyxmIDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworCisJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfU1RBUlRFRCkpCS8qIERNQSBpcyBub3QgYWN0aXZlICovCisJCXJldHVybjsKKworCS8qCisJICoJRmlyc3Qgd2FpdCB1bnRpbCB0aGUgY3VycmVudCBmcmFnbWVudCBoYXMgYmVlbiBwbGF5ZWQgY29tcGxldGVseQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwlhZGV2LT5kbWFwX291dC0+ZmxhZ3MgfD0gRE1BX1NZTkNJTkc7CisKKwlhZGV2LT5kbWFwX291dC0+dW5kZXJydW5fY291bnQgPSAwOworCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgYWRldi0+ZG1hcF9vdXQtPnFsZW4gJiYgCisJICAgIGFkZXYtPmRtYXBfb3V0LT51bmRlcnJ1bl9jb3VudCA9PSAwKXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7CisJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmYWRldi0+b3V0X3NsZWVwZXIsCisJCQkJCSAgICAgICBkbWFidWZfdGltZW91dChkbWFwKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwl9CisJYWRldi0+ZG1hcF9vdXQtPmZsYWdzICY9IH4oRE1BX1NZTkNJTkcgfCBETUFfQUNUSVZFKTsKKworCS8qCisJICoJRmluYWxseSBzaHV0IHRoZSBkZXZpY2Ugb2ZmCisJICovCisJaWYgKCEoYWRldi0+ZmxhZ3MgJiBETUFfRFVQTEVYKSB8fCAhYWRldi0+ZC0+aGFsdF9vdXRwdXQpCisJCWFkZXYtPmQtPmhhbHRfaW8oZGV2KTsKKwllbHNlCisJCWFkZXYtPmQtPmhhbHRfb3V0cHV0KGRldik7CisJYWRldi0+ZG1hcF9vdXQtPmZsYWdzICY9IH5ETUFfU1RBUlRFRDsKKwkKKwlmPWNsYWltX2RtYV9sb2NrKCk7CisJY2xlYXJfZG1hX2ZmKGRtYXAtPmRtYSk7CisJZGlzYWJsZV9kbWEoZG1hcC0+ZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGYpOworCQorCWRtYXAtPmJ5dGVfY291bnRlciA9IDA7CisJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgYWRldi0+ZG1hcF9vdXQsIDApOworCWRtYXAtPnFsZW4gPSBkbWFwLT5xaGVhZCA9IGRtYXAtPnF0YWlsID0gZG1hcC0+dXNlcl9jb3VudGVyID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZG1hX3Jlc2V0X2lucHV0KGludCBkZXYpCit7CisgICAgICAgIHN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSBhZGV2LT5kbWFwX2luOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCWlmICghKGFkZXYtPmZsYWdzICYgRE1BX0RVUExFWCkgfHwgIWFkZXYtPmQtPmhhbHRfaW5wdXQpCisJCWFkZXYtPmQtPmhhbHRfaW8oZGV2KTsKKwllbHNlCisJCWFkZXYtPmQtPmhhbHRfaW5wdXQoZGV2KTsKKwlhZGV2LT5kbWFwX2luLT5mbGFncyAmPSB+RE1BX1NUQVJURUQ7CisKKwlkbWFwLT5xbGVuID0gZG1hcC0+cWhlYWQgPSBkbWFwLT5xdGFpbCA9IGRtYXAtPnVzZXJfY291bnRlciA9IDA7CisJZG1hcC0+Ynl0ZV9jb3VudGVyID0gMDsKKwlyZW9yZ2FuaXplX2J1ZmZlcnMoZGV2LCBhZGV2LT5kbWFwX2luLCAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKK30KKy8qIE1VU1QgYmUgY2FsbGVkIHdpdGggaG9sZGluZyB0aGUgZG1hcC0+bG9jayAqLwordm9pZCBETUFidWZfbGF1bmNoX291dHB1dChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKworCWlmICghKChhZGV2LT5lbmFibGVfYml0cyAqIGFkZXYtPmdvKSAmIFBDTV9FTkFCTEVfT1VUUFVUKSkKKwkJcmV0dXJuOwkJLyogRG9uJ3Qgc3RhcnQgRE1BIHlldCAqLworCWRtYXAtPmRtYV9tb2RlID0gRE1PREVfT1VUUFVUOworCisJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfQUNUSVZFKSB8fCAhKGFkZXYtPmZsYWdzICYgRE1BX0FVVE9NT0RFKSB8fCAoZG1hcC0+ZmxhZ3MgJiBETUFfTk9ETUEpKSB7CisJCWlmICghKGRtYXAtPmZsYWdzICYgRE1BX1NUQVJURUQpKSB7CisJCQlyZW9yZ2FuaXplX2J1ZmZlcnMoZGV2LCBkbWFwLCAwKTsKKwkJCWlmIChhZGV2LT5kLT5wcmVwYXJlX2Zvcl9vdXRwdXQoZGV2LCBkbWFwLT5mcmFnbWVudF9zaXplLCBkbWFwLT5uYnVmcykpCisJCQkJcmV0dXJuOworCQkJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfTk9ETUEpKQorCQkJCWxvY2FsX3N0YXJ0X2RtYShhZGV2LCBkbWFwLT5yYXdfYnVmX3BoeXMsIGRtYXAtPmJ5dGVzX2luX3VzZSxETUFfTU9ERV9XUklURSk7CisJCQlkbWFwLT5mbGFncyB8PSBETUFfU1RBUlRFRDsKKwkJfQorCQlpZiAoZG1hcC0+Y291bnRzW2RtYXAtPnFoZWFkXSA9PSAwKQorCQkJZG1hcC0+Y291bnRzW2RtYXAtPnFoZWFkXSA9IGRtYXAtPmZyYWdtZW50X3NpemU7CisJCWRtYXAtPmRtYV9tb2RlID0gRE1PREVfT1VUUFVUOworCQlhZGV2LT5kLT5vdXRwdXRfYmxvY2soZGV2LCBkbWFwLT5yYXdfYnVmX3BoeXMgKyBkbWFwLT5xaGVhZCAqIGRtYXAtPmZyYWdtZW50X3NpemUsCisJCQkJICAgICAgZG1hcC0+Y291bnRzW2RtYXAtPnFoZWFkXSwgMSk7CisJCWlmIChhZGV2LT5kLT50cmlnZ2VyKQorCQkJYWRldi0+ZC0+dHJpZ2dlcihkZXYsYWRldi0+ZW5hYmxlX2JpdHMgKiBhZGV2LT5nbyk7CisJfQorCWRtYXAtPmZsYWdzIHw9IERNQV9BQ1RJVkU7Cit9CisKK2ludCBETUFidWZfc3luYyhpbnQgZGV2KQoreworCXN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG4gPSAwOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwOworCisJaWYgKCFhZGV2LT5nbyAmJiAhKGFkZXYtPmVuYWJsZV9iaXRzICYgUENNX0VOQUJMRV9PVVRQVVQpKQorCQlyZXR1cm4gMDsKKworCWlmIChhZGV2LT5kbWFwX291dC0+ZG1hX21vZGUgPT0gRE1PREVfT1VUUFVUKSB7CisJCWRtYXAgPSBhZGV2LT5kbWFwX291dDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQlpZiAoZG1hcC0+cWxlbiA+IDAgJiYgIShkbWFwLT5mbGFncyAmIERNQV9BQ1RJVkUpKQorCQkJRE1BYnVmX2xhdW5jaF9vdXRwdXQoZGV2LCBkbWFwKTsKKwkJYWRldi0+ZG1hcF9vdXQtPmZsYWdzIHw9IERNQV9TWU5DSU5HOworCQlhZGV2LT5kbWFwX291dC0+dW5kZXJydW5fY291bnQgPSAwOworCQl3aGlsZSAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIG4rKyA8PSBhZGV2LT5kbWFwX291dC0+bmJ1ZnMgJiYgCisJCSAgICAgICBhZGV2LT5kbWFwX291dC0+cWxlbiAmJiBhZGV2LT5kbWFwX291dC0+dW5kZXJydW5fY291bnQgPT0gMCkgeworCQkJbG9uZyB0ID0gZG1hYnVmX3RpbWVvdXQoZG1hcCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJCS8qIEZJWE1FOiBub3Qgc2FmZSBtYXkgbWlzcyBldmVudHMgKi8KKwkJCXQgPSBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmFkZXYtPm91dF9zbGVlcGVyLCB0KTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJCWlmICghdCkgeworCQkJCWFkZXYtPmRtYXBfb3V0LT5mbGFncyAmPSB+RE1BX1NZTkNJTkc7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7CisJCQkJcmV0dXJuIGFkZXYtPmRtYXBfb3V0LT5xbGVuOworCQkJfQorCQl9CisJCWFkZXYtPmRtYXBfb3V0LT5mbGFncyAmPSB+KERNQV9TWU5DSU5HIHwgRE1BX0FDVElWRSk7CisJCQorCQkvKgorCQkgKiBTb21lIGRldmljZXMgc3VjaCBhcyBHVVMgaGF2ZSBodWdlIGFtb3VudCBvZiBvbiBib2FyZCBSQU0gZm9yIHRoZQorCQkgKiBhdWRpbyBkYXRhLiBXZSBoYXZlIHRvIHdhaXQgdW50aWwgdGhlIGRldmljZSBoYXMgZmluaXNoZWQgcGxheWluZy4KKwkJICovCisKKwkJLyogc3RpbGwgaG9sZGluZyB0aGUgbG9jayAqLworCQlpZiAoYWRldi0+ZC0+bG9jYWxfcWxlbikgeyAgIC8qIERldmljZSBoYXMgaGlkZGVuIGJ1ZmZlcnMgKi8KKwkJCXdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYKKwkJCSAgICAgICBhZGV2LT5kLT5sb2NhbF9xbGVuKGRldikpeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmYWRldi0+b3V0X3NsZWVwZXIsCisJCQkJCQkJICAgICAgIGRtYWJ1Zl90aW1lb3V0KGRtYXApKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hcC0+bG9jayxmbGFncyk7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7CisJfQorCWFkZXYtPmRtYXBfb3V0LT5kbWFfbW9kZSA9IERNT0RFX05PTkU7CisJcmV0dXJuIGFkZXYtPmRtYXBfb3V0LT5xbGVuOworfQorCitpbnQgRE1BYnVmX3JlbGVhc2UoaW50IGRldiwgaW50IG1vZGUpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRtYXAgPSBhZGV2LT5kbWFwX291dDsKKwlpZiAoYWRldi0+b3Blbl9tb2RlICYgT1BFTl9XUklURSkKKwkJYWRldi0+ZG1hcF9vdXQtPmNsb3NpbmcgPSAxOworCisJaWYgKGFkZXYtPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCl7CisJCWFkZXYtPmRtYXBfaW4tPmNsb3NpbmcgPSAxOworCQlkbWFwID0gYWRldi0+ZG1hcF9pbjsKKwl9CisJaWYgKGFkZXYtPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpCisJCWlmICghKGFkZXYtPmRtYXBfb3V0LT5tYXBwaW5nX2ZsYWdzICYgRE1BX01BUF9NQVBQRUQpKQorCQkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiAoYWRldi0+ZG1hcF9vdXQtPmRtYV9tb2RlID09IERNT0RFX09VVFBVVCkpCisJCQkJRE1BYnVmX3N5bmMoZGV2KTsKKwlpZiAoYWRldi0+ZG1hcF9vdXQtPmRtYV9tb2RlID09IERNT0RFX09VVFBVVCkKKwkJbWVtc2V0KGFkZXYtPmRtYXBfb3V0LT5yYXdfYnVmLCBhZGV2LT5kbWFwX291dC0+bmV1dHJhbF9ieXRlLCBhZGV2LT5kbWFwX291dC0+Ynl0ZXNfaW5fdXNlKTsKKworCURNQWJ1Zl9yZXNldChkZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwlhZGV2LT5kLT5jbG9zZShkZXYpOworCisJaWYgKGFkZXYtPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpCisJCWNsb3NlX2RtYXAoYWRldiwgYWRldi0+ZG1hcF9vdXQpOworCisJaWYgKGFkZXYtPm9wZW5fbW9kZSA9PSBPUEVOX1JFQUQgfHwKKwkgICAgKGFkZXYtPm9wZW5fbW9kZSAhPSBPUEVOX1dSSVRFICYmCisJICAgICAoYWRldi0+ZmxhZ3MgJiBETUFfRFVQTEVYKSkpCisJCWNsb3NlX2RtYXAoYWRldiwgYWRldi0+ZG1hcF9pbik7CisJYWRldi0+b3Blbl9tb2RlID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKy8qIGNhbGxlZCB3aXRoIGRtYXAtPmxvY2sgZG9sZCAqLworaW50IERNQWJ1Zl9hY3RpdmF0ZV9yZWNvcmRpbmcoaW50IGRldiwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXApCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJaW50ICBlcnI7CisKKwlpZiAoIShhZGV2LT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpKQorCQlyZXR1cm4gMDsKKwlpZiAoIShhZGV2LT5lbmFibGVfYml0cyAmIFBDTV9FTkFCTEVfSU5QVVQpKQorCQlyZXR1cm4gMDsKKwlpZiAoZG1hcC0+ZG1hX21vZGUgPT0gRE1PREVfT1VUUFVUKSB7CS8qIERpcmVjdGlvbiBjaGFuZ2UgKi8KKwkJLyogcmVsZWFzZSBsb2NrIC0gaXQncyBub3QgcmVjdXJzaXZlICovCisJCXNwaW5fdW5sb2NrX2lycSgmZG1hcC0+bG9jayk7CisJCURNQWJ1Zl9zeW5jKGRldik7CisJCURNQWJ1Zl9yZXNldChkZXYpOworCQlzcGluX2xvY2tfaXJxKCZkbWFwLT5sb2NrKTsKKwkJZG1hcC0+ZG1hX21vZGUgPSBETU9ERV9OT05FOworCX0KKwlpZiAoIWRtYXAtPmRtYV9tb2RlKSB7CisJCXJlb3JnYW5pemVfYnVmZmVycyhkZXYsIGRtYXAsIDEpOworCQlpZiAoKGVyciA9IGFkZXYtPmQtPnByZXBhcmVfZm9yX2lucHV0KGRldiwKKwkJCQlkbWFwLT5mcmFnbWVudF9zaXplLCBkbWFwLT5uYnVmcykpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWRtYXAtPmRtYV9tb2RlID0gRE1PREVfSU5QVVQ7CisJfQorCWlmICghKGRtYXAtPmZsYWdzICYgRE1BX0FDVElWRSkpIHsKKwkJaWYgKGRtYXAtPm5lZWRzX3Jlb3JnKQorCQkJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgZG1hcCwgMCk7CisJCWxvY2FsX3N0YXJ0X2RtYShhZGV2LCBkbWFwLT5yYXdfYnVmX3BoeXMsIGRtYXAtPmJ5dGVzX2luX3VzZSwgRE1BX01PREVfUkVBRCk7CisJCWFkZXYtPmQtPnN0YXJ0X2lucHV0KGRldiwgZG1hcC0+cmF3X2J1Zl9waHlzICsgZG1hcC0+cXRhaWwgKiBkbWFwLT5mcmFnbWVudF9zaXplLAorCQkJCSAgICAgZG1hcC0+ZnJhZ21lbnRfc2l6ZSwgMCk7CisJCWRtYXAtPmZsYWdzIHw9IERNQV9BQ1RJVkU7CisJCWlmIChhZGV2LT5kLT50cmlnZ2VyKQorCQkJYWRldi0+ZC0+dHJpZ2dlcihkZXYsIGFkZXYtPmVuYWJsZV9iaXRzICogYWRldi0+Z28pOworCX0KKwlyZXR1cm4gMDsKK30KKy8qIGFxdWlyZXMgbG9jayAqLworaW50IERNQWJ1Zl9nZXRyZGJ1ZmZlcihpbnQgZGV2LCBjaGFyICoqYnVmLCBpbnQgKmxlbiwgaW50IGRvbnRibG9jaykKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAwLCBuID0gMDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfaW47CisJaW50IGdvOworCisJaWYgKCEoYWRldi0+b3Blbl9tb2RlICYgT1BFTl9SRUFEKSkKKwkJcmV0dXJuIC1FSU87CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCWlmIChkbWFwLT5uZWVkc19yZW9yZykKKwkJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgZG1hcCwgMCk7CisJaWYgKGFkZXYtPmRtYXBfaW4tPm1hcHBpbmdfZmxhZ3MgJiBETUFfTUFQX01BUFBFRCkgeworLyoJCSAgcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQ6IENhbid0IHJlYWQgZnJvbSBtbWFwcGVkIGRldmljZSAoMSlcbiIpOyovCisJCSAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7CisJCSAgcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHdoaWxlIChkbWFwLT5xbGVuIDw9IDAgJiYgbisrIDwgMTApIHsKKwkJbG9uZyB0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJCWlmICghKGFkZXYtPmVuYWJsZV9iaXRzICYgUENNX0VOQUJMRV9JTlBVVCkgfHwgIWFkZXYtPmdvKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCWlmICgoZXJyID0gRE1BYnVmX2FjdGl2YXRlX3JlY29yZGluZyhkZXYsIGRtYXApKSA8IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQkvKiBXYWl0IGZvciB0aGUgbmV4dCBibG9jayAqLworCisJCWlmIChkb250YmxvY2spIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJaWYgKChnbyA9IGFkZXYtPmdvKSkKKwkJCXRpbWVvdXQgPSBkbWFidWZfdGltZW91dChkbWFwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJdGltZW91dCA9IGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmYWRldi0+aW5fc2xlZXBlciwKKwkJCQkJCQkgdGltZW91dCk7CisJCWlmICghdGltZW91dCkgeworCQkJLyogRklYTUU6IGluY2x1ZGUgZGV2aWNlIG5hbWUgKi8KKwkJCWVyciA9IC1FSU87CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZDogRE1BIChpbnB1dCkgdGltZWQgb3V0IC0gSVJRL0RSUSBjb25maWcgZXJyb3I/XG4iKTsKKwkJCWRtYV9yZXNldF9pbnB1dChkZXYpOworCQl9IGVsc2UKKwkJCWVyciA9IC1FSU5UUjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKworCWlmIChkbWFwLT5xbGVuIDw9IDApCisJCXJldHVybiBlcnIgPyBlcnIgOiAtRUlOVFI7CisJKmJ1ZiA9ICZkbWFwLT5yYXdfYnVmW2RtYXAtPnFoZWFkICogZG1hcC0+ZnJhZ21lbnRfc2l6ZSArIGRtYXAtPmNvdW50c1tkbWFwLT5xaGVhZF1dOworCSpsZW4gPSBkbWFwLT5mcmFnbWVudF9zaXplIC0gZG1hcC0+Y291bnRzW2RtYXAtPnFoZWFkXTsKKworCXJldHVybiBkbWFwLT5xaGVhZDsKK30KKworaW50IERNQWJ1Zl9ybWNoYXJzKGludCBkZXYsIGludCBidWZmX25vLCBpbnQgYykKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfaW47CisJaW50IHAgPSBkbWFwLT5jb3VudHNbZG1hcC0+cWhlYWRdICsgYzsKKworCWlmIChkbWFwLT5tYXBwaW5nX2ZsYWdzICYgRE1BX01BUF9NQVBQRUQpCisJeworLyoJCSAgcHJpbnRrKCJTb3VuZDogQ2FuJ3QgcmVhZCBmcm9tIG1tYXBwZWQgZGV2aWNlICgyKVxuIik7Ki8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVsc2UgaWYgKGRtYXAtPnFsZW4gPD0gMCkKKwkJcmV0dXJuIC1FSU87CisJZWxzZSBpZiAocCA+PSBkbWFwLT5mcmFnbWVudF9zaXplKSB7ICAvKiBUaGlzIGJ1ZmZlciBpcyBjb21wbGV0ZWx5IGVtcHR5ICovCisJCWRtYXAtPmNvdW50c1tkbWFwLT5xaGVhZF0gPSAwOworCQlkbWFwLT5xbGVuLS07CisJCWRtYXAtPnFoZWFkID0gKGRtYXAtPnFoZWFkICsgMSkgJSBkbWFwLT5uYnVmczsKKwl9CisJZWxzZSBkbWFwLT5jb3VudHNbZG1hcC0+cWhlYWRdID0gcDsKKworCXJldHVybiAwOworfQorLyogTVVTVCBiZSBjYWxsZWQgd2l0aCBkbWFwLT5sb2NrIGhvbGQgKi8KK2ludCBETUFidWZfZ2V0X2J1ZmZlcl9wb2ludGVyKGludCBkZXYsIHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwLCBpbnQgZGlyZWN0aW9uKQoreworCS8qCisJICoJVHJ5IHRvIGFwcHJveGltYXRlIHRoZSBhY3RpdmUgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgRE1BIHBvaW50ZXIgd2l0aGluIHRoZQorCSAqCWJ1ZmZlciBhcmVhIGFzIHdlbGwgYXMgcG9zc2libGUuCisJICovCisKKwlpbnQgcG9zOworCXVuc2lnbmVkIGxvbmcgZjsKKworCWlmICghKGRtYXAtPmZsYWdzICYgRE1BX0FDVElWRSkpCisJCXBvcyA9IDA7CisJZWxzZSB7CisJCWludCBjaGFuID0gZG1hcC0+ZG1hOworCQkKKwkJZj1jbGFpbV9kbWFfbG9jaygpOworCQljbGVhcl9kbWFfZmYoY2hhbik7CisJCQorCQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpCisJCQlkaXNhYmxlX2RtYShkbWFwLT5kbWEpOworCQkKKwkJcG9zID0gZ2V0X2RtYV9yZXNpZHVlKGNoYW4pOworCQkKKwkJcG9zID0gZG1hcC0+Ynl0ZXNfaW5fdXNlIC0gcG9zOworCisJCWlmICghKGRtYXAtPm1hcHBpbmdfZmxhZ3MgJiBETUFfTUFQX01BUFBFRCkpIHsKKwkJCWlmIChkaXJlY3Rpb24gPT0gRE1PREVfT1VUUFVUKSB7CisJCQkJaWYgKGRtYXAtPnFoZWFkID09IDApCisJCQkJCWlmIChwb3MgPiBkbWFwLT5mcmFnbWVudF9zaXplKQorCQkJCQkJcG9zID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRtYXAtPnF0YWlsID09IDApCisJCQkJCWlmIChwb3MgPiBkbWFwLT5mcmFnbWVudF9zaXplKQorCQkJCQkJcG9zID0gMDsKKwkJCX0KKwkJfQorCQlpZiAocG9zIDwgMCkKKwkJCXBvcyA9IDA7CisJCWlmIChwb3MgPj0gZG1hcC0+Ynl0ZXNfaW5fdXNlKQorCQkJcG9zID0gMDsKKwkJCisJCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkKKwkJCWVuYWJsZV9kbWEoZG1hcC0+ZG1hKTsKKwkJCQorCQlyZWxlYXNlX2RtYV9sb2NrKGYpOworCX0KKwkvKiBwcmludGsoICIlMDR4ICIsICBwb3MpOyAqLworCisJcmV0dXJuIHBvczsKK30KKworLyoKKyAqCURNQWJ1Zl9zdGFydF9kZXZpY2VzKCkgaXMgY2FsbGVkIGJ5IHRoZSAvZGV2L211c2ljIGRyaXZlciB0byBzdGFydAorICoJb25lIG9yIG1vcmUgYXVkaW8gZGV2aWNlcyBhdCBkZXNpcmVkIG1vbWVudC4KKyAqLworCit2b2lkIERNQWJ1Zl9zdGFydF9kZXZpY2VzKHVuc2lnbmVkIGludCBkZXZtYXNrKQoreworCXN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2OworCWludCBkZXY7CisKKwlmb3IgKGRldiA9IDA7IGRldiA8IG51bV9hdWRpb2RldnM7IGRldisrKSB7CisJCWlmICghKGRldm1hc2sgJiAoMSA8PCBkZXYpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShhZGV2ID0gYXVkaW9fZGV2c1tkZXZdKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYWRldi0+b3Blbl9tb2RlID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKGFkZXYtPmdvKQorCQkJY29udGludWU7CisJCS8qIE9LIHRvIHN0YXJ0IHRoZSBkZXZpY2UgKi8KKwkJYWRldi0+Z28gPSAxOworCQlpZiAoYWRldi0+ZC0+dHJpZ2dlcikKKwkJCWFkZXYtPmQtPnRyaWdnZXIoZGV2LGFkZXYtPmVuYWJsZV9iaXRzICogYWRldi0+Z28pOworCX0KK30KKy8qIHZpYSBwb2xsIGNhbGxlZCB3aXRob3V0IGEgbG9jayA/Ki8KK2ludCBETUFidWZfc3BhY2VfaW5fcXVldWUoaW50IGRldikKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlpbnQgbGVuLCBtYXgsIHRtcDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworCWludCBsaW0gPSBkbWFwLT5uYnVmczsKKworCWlmIChsaW0gPCAyKQorCQlsaW0gPSAyOworCisJaWYgKGRtYXAtPnFsZW4gPj0gbGltKQkvKiBObyBzcGFjZSBhdCBhbGwgKi8KKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqCVZlcmlmeSB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHBlbmRpbmcgYnVmZmVycyB0aGFuIHRoZSBsaW1pdAorCSAqCWRlZmluZWQgYnkgdGhlIHByb2Nlc3MuCisJICovCisKKwltYXggPSBkbWFwLT5tYXhfZnJhZ21lbnRzOworCWlmIChtYXggPiBsaW0pCisJCW1heCA9IGxpbTsKKwlsZW4gPSBkbWFwLT5xbGVuOworCisJaWYgKGFkZXYtPmQtPmxvY2FsX3FsZW4pIHsKKwkJdG1wID0gYWRldi0+ZC0+bG9jYWxfcWxlbihkZXYpOworCQlpZiAodG1wICYmIGxlbikKKwkJCXRtcC0tOwkvKiBUaGlzIGJ1ZmZlciBoYXMgYmVlbiBjb3VudGVkIHR3aWNlICovCisJCWxlbiArPSB0bXA7CisJfQorCWlmIChkbWFwLT5ieXRlX2NvdW50ZXIgJSBkbWFwLT5mcmFnbWVudF9zaXplKQkvKiBUaGVyZSBpcyBhIHBhcnRpYWwgZnJhZ21lbnQgKi8KKwkJbGVuID0gbGVuICsgMTsKKworCWlmIChsZW4gPj0gbWF4KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gbWF4IC0gbGVuOworfQorLyogTVVTVCBub3QgaG9sZCB0aGUgc3BpbmxvY2sgIC0gdGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgKi8KK3N0YXRpYyBpbnQgb3V0cHV0X3NsZWVwKGludCBkZXYsIGludCBkb250YmxvY2spCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJaW50IGVyciA9IDA7CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSBhZGV2LT5kbWFwX291dDsKKwlsb25nIHRpbWVvdXQ7CisJbG9uZyB0aW1lb3V0X3ZhbHVlOworCisJaWYgKGRvbnRibG9jaykKKwkJcmV0dXJuIC1FQUdBSU47CisJaWYgKCEoYWRldi0+ZW5hYmxlX2JpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkpCisJCXJldHVybiAtRUFHQUlOOworCisJLyoKKwkgKiBXYWl0IGZvciBmcmVlIHNwYWNlCisJICovCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCXRpbWVvdXQgPSAoYWRldi0+Z28gJiYgIShkbWFwLT5mbGFncyAmIERNQV9OT1RJTUVPVVQpKTsKKwlpZiAodGltZW91dCkgCisJCXRpbWVvdXRfdmFsdWUgPSBkbWFidWZfdGltZW91dChkbWFwKTsKKwllbHNlCisJCXRpbWVvdXRfdmFsdWUgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwl0aW1lb3V0X3ZhbHVlID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZhZGV2LT5vdXRfc2xlZXBlciwKKwkJCQkJCSAgICAgICB0aW1lb3V0X3ZhbHVlKTsKKwlpZiAodGltZW91dCAhPSBNQVhfU0NIRURVTEVfVElNRU9VVCAmJiAhdGltZW91dF92YWx1ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZDogRE1BIChvdXRwdXQpIHRpbWVkIG91dCAtIElSUS9EUlEgY29uZmlnIGVycm9yP1xuIik7CisJCWRtYV9yZXNldF9vdXRwdXQoZGV2KTsKKwl9IGVsc2UgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQllcnIgPSAtRUlOVFI7CisJfQorCXJldHVybiBlcnI7Cit9CisvKiBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkICovCitzdGF0aWMgaW50IGZpbmRfb3V0cHV0X3NwYWNlKGludCBkZXYsIGNoYXIgKipidWYsIGludCAqc2l6ZSkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX29mZnM7CisJbG9uZyBsZW4sIG9mZnM7CisJaW50IG1heGZyYWdzOworCWludCBvY2N1cGllZF9ieXRlcyA9IChkbWFwLT51c2VyX2NvdW50ZXIgJSBkbWFwLT5mcmFnbWVudF9zaXplKTsKKworCSpidWYgPSBkbWFwLT5yYXdfYnVmOworCWlmICghKG1heGZyYWdzID0gRE1BYnVmX3NwYWNlX2luX3F1ZXVlKGRldikpICYmICFvY2N1cGllZF9ieXRlcykKKwkJcmV0dXJuIDA7CisKKyNpZmRlZiBCRV9DT05TRVJWQVRJVkUKKwlhY3RpdmVfb2ZmcyA9IGRtYXAtPmJ5dGVfY291bnRlciArIGRtYXAtPnFoZWFkICogZG1hcC0+ZnJhZ21lbnRfc2l6ZTsKKyNlbHNlCisJYWN0aXZlX29mZnMgPSBETUFidWZfZ2V0X2J1ZmZlcl9wb2ludGVyKGRldiwgZG1hcCwgRE1PREVfT1VUUFVUKTsKKwkvKiBDaGVjayBmb3IgcG9pbnRlciB3cmFwcGluZyBzaXR1YXRpb24gKi8KKwlpZiAoYWN0aXZlX29mZnMgPCAwIHx8IGFjdGl2ZV9vZmZzID49IGRtYXAtPmJ5dGVzX2luX3VzZSkKKwkJYWN0aXZlX29mZnMgPSAwOworCWFjdGl2ZV9vZmZzICs9IGRtYXAtPmJ5dGVfY291bnRlcjsKKyNlbmRpZgorCisJb2ZmcyA9IChkbWFwLT51c2VyX2NvdW50ZXIgJSBkbWFwLT5ieXRlc19pbl91c2UpICYgflNBTVBMRV9ST1VORFVQOworCWlmIChvZmZzIDwgMCB8fCBvZmZzID49IGRtYXAtPmJ5dGVzX2luX3VzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBHb3QgdW5leHBlY3RlZCBvZmZzICVsZC4gR2l2aW5nIHVwLlxuIiwgb2Zmcyk7CisJCXByaW50aygiQ291bnRlciA9ICVsZCwgYnl0ZXM9JWRcbiIsIGRtYXAtPnVzZXJfY291bnRlciwgZG1hcC0+Ynl0ZXNfaW5fdXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCSpidWYgPSBkbWFwLT5yYXdfYnVmICsgb2ZmczsKKworCWxlbiA9IGFjdGl2ZV9vZmZzICsgZG1hcC0+Ynl0ZXNfaW5fdXNlIC0gZG1hcC0+dXNlcl9jb3VudGVyOwkvKiBOdW1iZXIgb2YgdW51c2VkIGJ5dGVzIGluIGJ1ZmZlciAqLworCisJaWYgKChvZmZzICsgbGVuKSA+IGRtYXAtPmJ5dGVzX2luX3VzZSkKKwkJbGVuID0gZG1hcC0+Ynl0ZXNfaW5fdXNlIC0gb2ZmczsKKwlpZiAobGVuIDwgMCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGxlbiA+ICgobWF4ZnJhZ3MgKiBkbWFwLT5mcmFnbWVudF9zaXplKSAtIG9jY3VwaWVkX2J5dGVzKSkKKwkJbGVuID0gKG1heGZyYWdzICogZG1hcC0+ZnJhZ21lbnRfc2l6ZSkgLSBvY2N1cGllZF9ieXRlczsKKwkqc2l6ZSA9IGxlbiAmIH5TQU1QTEVfUk9VTkRVUDsKKwlyZXR1cm4gKCpzaXplID4gMCk7Cit9CisvKiBhcXVpcmVzIGxvY2sgICovCitpbnQgRE1BYnVmX2dldHdyYnVmZmVyKGludCBkZXYsIGNoYXIgKipidWYsIGludCAqc2l6ZSwgaW50IGRvbnRibG9jaykKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAtRUlPOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYWRldi0+ZG1hcF9vdXQ7CisKKwlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKSB7CisvKgkJcHJpbnRrKEtFUk5fREVCVUcgIlNvdW5kOiBDYW4ndCB3cml0ZSB0byBtbWFwcGVkIGRldmljZSAoMylcbiIpOyovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hcC0+bG9jayxmbGFncyk7CisJaWYgKGRtYXAtPm5lZWRzX3Jlb3JnKQorCQlyZW9yZ2FuaXplX2J1ZmZlcnMoZGV2LCBkbWFwLCAwKTsKKworCWlmIChkbWFwLT5kbWFfbW9kZSA9PSBETU9ERV9JTlBVVCkgewkvKiBEaXJlY3Rpb24gY2hhbmdlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQlETUFidWZfcmVzZXQoZGV2KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCX0KKwlkbWFwLT5kbWFfbW9kZSA9IERNT0RFX09VVFBVVDsKKworCXdoaWxlIChmaW5kX291dHB1dF9zcGFjZShkZXYsIGJ1Ziwgc2l6ZSkgPD0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJaWYgKChlcnIgPSBvdXRwdXRfc2xlZXAoZGV2LCBkb250YmxvY2spKSA8IDApIHsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorLyogaGFzIHRvIGFxdWlyZSBkbWFwLT5sb2NrICovCitpbnQgRE1BYnVmX21vdmVfd3Jwb2ludGVyKGludCBkZXYsIGludCBsKQoreworCXN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYWRldi0+ZG1hcF9vdXQ7CisJdW5zaWduZWQgbG9uZyBwdHI7CisJdW5zaWduZWQgbG9uZyBlbmRfcHRyLCBwOworCWludCBwb3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hcC0+bG9jayxmbGFncyk7CisJcG9zdD0gKGRtYXAtPmZsYWdzICYgRE1BX1BPU1QpOworCXB0ciA9IChkbWFwLT51c2VyX2NvdW50ZXIgLyBkbWFwLT5mcmFnbWVudF9zaXplKSAqIGRtYXAtPmZyYWdtZW50X3NpemU7CisKKwlkbWFwLT5mbGFncyAmPSB+RE1BX1BPU1Q7CisJZG1hcC0+Y2ZyYWcgPSAtMTsKKwlkbWFwLT51c2VyX2NvdW50ZXIgKz0gbDsKKwlkbWFwLT5mbGFncyB8PSBETUFfRElSVFk7CisKKwlpZiAoZG1hcC0+Ynl0ZV9jb3VudGVyID49IGRtYXAtPm1heF9ieXRlX2NvdW50ZXIpIHsKKwkJLyogV3JhcCB0aGUgYnl0ZSBjb3VudGVycyAqLworCQlsb25nIGRlY3IgPSBkbWFwLT5ieXRlX2NvdW50ZXI7CisJCWRtYXAtPmJ5dGVfY291bnRlciA9IChkbWFwLT5ieXRlX2NvdW50ZXIgJSBkbWFwLT5ieXRlc19pbl91c2UpOworCQlkZWNyIC09IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJZG1hcC0+dXNlcl9jb3VudGVyIC09IGRlY3I7CisJfQorCWVuZF9wdHIgPSAoZG1hcC0+dXNlcl9jb3VudGVyIC8gZG1hcC0+ZnJhZ21lbnRfc2l6ZSkgKiBkbWFwLT5mcmFnbWVudF9zaXplOworCisJcCA9IChkbWFwLT51c2VyX2NvdW50ZXIgLSAxKSAlIGRtYXAtPmJ5dGVzX2luX3VzZTsKKwlkbWFwLT5uZXV0cmFsX2J5dGUgPSBkbWFwLT5yYXdfYnVmW3BdOworCisJLyogVXBkYXRlIHRoZSBmcmFnbWVudCBiYXNlZCBib29ra2VlcGluZyB0b28gKi8KKwl3aGlsZSAocHRyIDwgZW5kX3B0cikgeworCQlkbWFwLT5jb3VudHNbZG1hcC0+cXRhaWxdID0gZG1hcC0+ZnJhZ21lbnRfc2l6ZTsKKwkJZG1hcC0+cXRhaWwgPSAoZG1hcC0+cXRhaWwgKyAxKSAlIGRtYXAtPm5idWZzOworCQlkbWFwLT5xbGVuKys7CisJCXB0ciArPSBkbWFwLT5mcmFnbWVudF9zaXplOworCX0KKworCWRtYXAtPmNvdW50c1tkbWFwLT5xdGFpbF0gPSBkbWFwLT51c2VyX2NvdW50ZXIgLSBwdHI7CisKKwkvKgorCSAqCUxldCB0aGUgbG93IGxldmVsIGRyaXZlciBwZXJmb3JtIHNvbWUgcG9zdHByb2Nlc3NpbmcgdG8KKwkgKgl0aGUgd3JpdHRlbiBkYXRhLgorCSAqLworCWlmIChhZGV2LT5kLT5wb3N0cHJvY2Vzc193cml0ZSkKKwkJYWRldi0+ZC0+cG9zdHByb2Nlc3Nfd3JpdGUoZGV2KTsKKworCWlmICghKGRtYXAtPmZsYWdzICYgRE1BX0FDVElWRSkpCisJCWlmIChkbWFwLT5xbGVuID4gMSB8fCAoZG1hcC0+cWxlbiA+IDAgJiYgKHBvc3QgfHwgZG1hcC0+cWxlbiA+PSBkbWFwLT5uYnVmcyAtIDEpKSkKKwkJCURNQWJ1Zl9sYXVuY2hfb3V0cHV0KGRldiwgZG1hcCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworaW50IERNQWJ1Zl9zdGFydF9kbWEoaW50IGRldiwgdW5zaWduZWQgbG9uZyBwaHlzYWRkciwgaW50IGNvdW50LCBpbnQgZG1hX21vZGUpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSAoZG1hX21vZGUgPT0gRE1BX01PREVfV1JJVEUpID8gYWRldi0+ZG1hcF9vdXQgOiBhZGV2LT5kbWFwX2luOworCisJaWYgKGRtYXAtPnJhd19idWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kOiBETUEgYnVmZmVyKDEpID09IE5VTExcbiIpOworCQlwcmludGsoIkRldmljZSAlZCwgY2huPSVzXG4iLCBkZXYsIChkbWFwID09IGFkZXYtPmRtYXBfb3V0KSA/ICJvdXQiIDogImluIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoZG1hcC0+ZG1hIDwgMCkKKwkJcmV0dXJuIDA7CisJc291bmRfc3RhcnRfZG1hKGRtYXAsIHBoeXNhZGRyLCBjb3VudCwgZG1hX21vZGUpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBsb2NhbF9zdGFydF9kbWEoc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIGludCBjb3VudCwgaW50IGRtYV9tb2RlKQoreworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gKGRtYV9tb2RlID09IERNQV9NT0RFX1dSSVRFKSA/IGFkZXYtPmRtYXBfb3V0IDogYWRldi0+ZG1hcF9pbjsKKworCWlmIChkbWFwLT5yYXdfYnVmID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZDogRE1BIGJ1ZmZlcigyKSA9PSBOVUxMXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJEZXZpY2UgJXMsIGNobj0lc1xuIiwgYWRldi0+bmFtZSwgKGRtYXAgPT0gYWRldi0+ZG1hcF9vdXQpID8gIm91dCIgOiAiaW4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChkbWFwLT5mbGFncyAmIERNQV9OT0RNQSkKKwkJcmV0dXJuIDE7CisJaWYgKGRtYXAtPmRtYSA8IDApCisJCXJldHVybiAwOworCXNvdW5kX3N0YXJ0X2RtYShkbWFwLCBkbWFwLT5yYXdfYnVmX3BoeXMsIGRtYXAtPmJ5dGVzX2luX3VzZSwgZG1hX21vZGUgfCBETUFfQVVUT0lOSVQpOworCWRtYXAtPmZsYWdzIHw9IERNQV9TVEFSVEVEOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX291dHB1dF9pbnRlcnJ1cHQoaW50IGRldiwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXApCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisKKwlpZiAoZG1hcC0+YXVkaW9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJZG1hcC0+YXVkaW9fY2FsbGJhY2soZGV2LCBkbWFwLT5jYWxsYmFja19wYXJtKTsKKwl3YWtlX3VwKCZhZGV2LT5vdXRfc2xlZXBlcik7CisJd2FrZV91cCgmYWRldi0+cG9sbF9zbGVlcGVyKTsKK30KKy8qIGNhbGxlZCB3aXRoIGRtYXAtPmxvY2sgaGVsZCBpbiBpcnEgY29udGV4dCovCitzdGF0aWMgdm9pZCBkb19vdXRwdXRpbnRyKGludCBkZXYsIGludCBkdW1teSkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworCWludCB0aGlzX2ZyYWdtZW50OworCisJaWYgKGRtYXAtPnJhd19idWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBFcnJvci4gQXVkaW8gaW50ZXJydXB0ICglZCkgYWZ0ZXIgZnJlZWluZyBidWZmZXJzLlxuIiwgZGV2KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKSB7CS8qIFZpcnR1YWwgbWVtb3J5IG1hcHBlZCBhY2Nlc3MgKi8KKwkJLyogbW1hcHBlZCBhY2Nlc3MgKi8KKwkJZG1hcC0+cWhlYWQgPSAoZG1hcC0+cWhlYWQgKyAxKSAlIGRtYXAtPm5idWZzOworCQlpZiAoZG1hcC0+cWhlYWQgPT0gMCkgewkgICAgLyogV3JhcHBlZCAqLworCQkJZG1hcC0+Ynl0ZV9jb3VudGVyICs9IGRtYXAtPmJ5dGVzX2luX3VzZTsKKwkJCWlmIChkbWFwLT5ieXRlX2NvdW50ZXIgPj0gZG1hcC0+bWF4X2J5dGVfY291bnRlcikgewkvKiBPdmVyZmxvdyAqLworCQkJCWxvbmcgZGVjciA9IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCQlkbWFwLT5ieXRlX2NvdW50ZXIgPSAoZG1hcC0+Ynl0ZV9jb3VudGVyICUgZG1hcC0+Ynl0ZXNfaW5fdXNlKTsKKwkJCQlkZWNyIC09IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCQlkbWFwLT51c2VyX2NvdW50ZXIgLT0gZGVjcjsKKwkJCX0KKwkJfQorCQlkbWFwLT5xbGVuKys7CS8qIFllcyBpbmNyZW1lbnQgaXQgKGRvbid0IGRlY3JlbWVudCkgKi8KKwkJaWYgKCEoYWRldi0+ZmxhZ3MgJiBETUFfQVVUT01PREUpKQorCQkJZG1hcC0+ZmxhZ3MgJj0gfkRNQV9BQ1RJVkU7CisJCWRtYXAtPmNvdW50c1tkbWFwLT5xaGVhZF0gPSBkbWFwLT5mcmFnbWVudF9zaXplOworCQlETUFidWZfbGF1bmNoX291dHB1dChkZXYsIGRtYXApOworCQlmaW5pc2hfb3V0cHV0X2ludGVycnVwdChkZXYsIGRtYXApOworCQlyZXR1cm47CisJfQorCisJZG1hcC0+cWxlbi0tOworCXRoaXNfZnJhZ21lbnQgPSBkbWFwLT5xaGVhZDsKKwlkbWFwLT5xaGVhZCA9IChkbWFwLT5xaGVhZCArIDEpICUgZG1hcC0+bmJ1ZnM7CisKKwlpZiAoZG1hcC0+cWhlYWQgPT0gMCkgewkvKiBXcmFwcGVkICovCisJCWRtYXAtPmJ5dGVfY291bnRlciArPSBkbWFwLT5ieXRlc19pbl91c2U7CisJCWlmIChkbWFwLT5ieXRlX2NvdW50ZXIgPj0gZG1hcC0+bWF4X2J5dGVfY291bnRlcikgewkvKiBPdmVyZmxvdyAqLworCQkJbG9uZyBkZWNyID0gZG1hcC0+Ynl0ZV9jb3VudGVyOworCQkJZG1hcC0+Ynl0ZV9jb3VudGVyID0gKGRtYXAtPmJ5dGVfY291bnRlciAlIGRtYXAtPmJ5dGVzX2luX3VzZSk7CisJCQlkZWNyIC09IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCWRtYXAtPnVzZXJfY291bnRlciAtPSBkZWNyOworCQl9CisJfQorCWlmICghKGFkZXYtPmZsYWdzICYgRE1BX0FVVE9NT0RFKSkKKwkJZG1hcC0+ZmxhZ3MgJj0gfkRNQV9BQ1RJVkU7CisJCQorCS8qCisJICoJVGhpcyBpcyAgZG1hcC0+cWxlbiA8PSAwIGV4Y2VwdCB3aGVuIGNsb3Npbmcgd2hlbgorCSAqCWRtYXAtPnFsZW4gPCAwCisJICovCisJIAorCXdoaWxlIChkbWFwLT5xbGVuIDw9IC1kbWFwLT5jbG9zaW5nKSB7CisJCWRtYXAtPnVuZGVycnVuX2NvdW50Kys7CisJCWRtYXAtPnFsZW4rKzsKKwkJaWYgKChkbWFwLT5mbGFncyAmIERNQV9ESVJUWSkgJiYgZG1hcC0+YXBwbGljX3Byb2ZpbGUgIT0gQVBGX0NQVUlOVEVOUykgeworCQkJZG1hcC0+ZmxhZ3MgJj0gfkRNQV9ESVJUWTsKKwkJCW1lbXNldChhZGV2LT5kbWFwX291dC0+cmF3X2J1ZiwgYWRldi0+ZG1hcF9vdXQtPm5ldXRyYWxfYnl0ZSwKKwkJCSAgICAgICBhZGV2LT5kbWFwX291dC0+YnVmZnNpemUpOworCQl9CisJCWRtYXAtPnVzZXJfY291bnRlciArPSBkbWFwLT5mcmFnbWVudF9zaXplOworCQlkbWFwLT5xdGFpbCA9IChkbWFwLT5xdGFpbCArIDEpICUgZG1hcC0+bmJ1ZnM7CisJfQorCWlmIChkbWFwLT5xbGVuID4gMCkKKwkJRE1BYnVmX2xhdW5jaF9vdXRwdXQoZGV2LCBkbWFwKTsKKwlmaW5pc2hfb3V0cHV0X2ludGVycnVwdChkZXYsIGRtYXApOworfQorLyogY2FsbGVkIGluIGlycSBjb250ZXh0ICovCit2b2lkIERNQWJ1Zl9vdXRwdXRpbnRyKGludCBkZXYsIGludCBub3RpZnlfb25seSkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYWRldi0+ZG1hcF9vdXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hcC0+bG9jayxmbGFncyk7CisJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfTk9ETUEpKSB7CisJCWludCBjaGFuID0gZG1hcC0+ZG1hLCBwb3MsIG47CisJCXVuc2lnbmVkIGxvbmcgZjsKKwkJCisJCWY9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCisJCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkKKwkJCWRpc2FibGVfZG1hKGRtYXAtPmRtYSk7CisJCWNsZWFyX2RtYV9mZihjaGFuKTsKKwkJcG9zID0gZG1hcC0+Ynl0ZXNfaW5fdXNlIC0gZ2V0X2RtYV9yZXNpZHVlKGNoYW4pOworCQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpCisJCQllbmFibGVfZG1hKGRtYXAtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZik7CisJCQorCQlwb3MgPSBwb3MgLyBkbWFwLT5mcmFnbWVudF9zaXplOwkvKiBBY3R1YWwgcWhlYWQgKi8KKwkJaWYgKHBvcyA8IDAgfHwgcG9zID49IGRtYXAtPm5idWZzKQorCQkJcG9zID0gMDsKKwkJbiA9IDA7CisJCXdoaWxlIChkbWFwLT5xaGVhZCAhPSBwb3MgJiYgbisrIDwgZG1hcC0+bmJ1ZnMpCisJCQlkb19vdXRwdXRpbnRyKGRldiwgbm90aWZ5X29ubHkpOworCX0KKwllbHNlCisJCWRvX291dHB1dGludHIoZGV2LCBub3RpZnlfb25seSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7Cit9CisvKiBjYWxsZWQgd2l0aCBkbWFwLT5sb2NrIGhlbGQgaW4gaXJxIGNvbnRleHQgKi8KK3N0YXRpYyB2b2lkIGRvX2lucHV0aW50cihpbnQgZGV2KQoreworCXN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYWRldi0+ZG1hcF9pbjsKKworCWlmIChkbWFwLT5yYXdfYnVmID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogRmF0YWwgZXJyb3IuIEF1ZGlvIGludGVycnVwdCBhZnRlciBmcmVlaW5nIGJ1ZmZlcnMuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKSB7CisJCWRtYXAtPnF0YWlsID0gKGRtYXAtPnF0YWlsICsgMSkgJSBkbWFwLT5uYnVmczsKKwkJaWYgKGRtYXAtPnF0YWlsID09IDApIHsJCS8qIFdyYXBwZWQgKi8KKwkJCWRtYXAtPmJ5dGVfY291bnRlciArPSBkbWFwLT5ieXRlc19pbl91c2U7CisJCQlpZiAoZG1hcC0+Ynl0ZV9jb3VudGVyID49IGRtYXAtPm1heF9ieXRlX2NvdW50ZXIpIHsJLyogT3ZlcmZsb3cgKi8KKwkJCQlsb25nIGRlY3IgPSBkbWFwLT5ieXRlX2NvdW50ZXI7CisJCQkJZG1hcC0+Ynl0ZV9jb3VudGVyID0gKGRtYXAtPmJ5dGVfY291bnRlciAlIGRtYXAtPmJ5dGVzX2luX3VzZSkgKyBkbWFwLT5ieXRlc19pbl91c2U7CisJCQkJZGVjciAtPSBkbWFwLT5ieXRlX2NvdW50ZXI7CisJCQkJZG1hcC0+dXNlcl9jb3VudGVyIC09IGRlY3I7CisJCQl9CisJCX0KKwkJZG1hcC0+cWxlbisrOworCisJCWlmICghKGFkZXYtPmZsYWdzICYgRE1BX0FVVE9NT0RFKSkgeworCQkJaWYgKGRtYXAtPm5lZWRzX3Jlb3JnKQorCQkJCXJlb3JnYW5pemVfYnVmZmVycyhkZXYsIGRtYXAsIDApOworCQkJbG9jYWxfc3RhcnRfZG1hKGFkZXYsIGRtYXAtPnJhd19idWZfcGh5cywgZG1hcC0+Ynl0ZXNfaW5fdXNlLERNQV9NT0RFX1JFQUQpOworCQkJYWRldi0+ZC0+c3RhcnRfaW5wdXQoZGV2LCBkbWFwLT5yYXdfYnVmX3BoeXMgKyBkbWFwLT5xdGFpbCAqIGRtYXAtPmZyYWdtZW50X3NpemUsCisJCQkJCSAgICAgZG1hcC0+ZnJhZ21lbnRfc2l6ZSwgMSk7CisJCQlpZiAoYWRldi0+ZC0+dHJpZ2dlcikKKwkJCQlhZGV2LT5kLT50cmlnZ2VyKGRldiwgYWRldi0+ZW5hYmxlX2JpdHMgKiBhZGV2LT5nbyk7CisJCX0KKwkJZG1hcC0+ZmxhZ3MgfD0gRE1BX0FDVElWRTsKKwl9IGVsc2UgaWYgKGRtYXAtPnFsZW4gPj0gKGRtYXAtPm5idWZzIC0gMSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQ6IFJlY29yZGluZyBvdmVycnVuXG4iKTsKKwkJZG1hcC0+dW5kZXJydW5fY291bnQrKzsKKworCQkvKiBKdXN0IHRocm93IGF3YXkgdGhlIG9sZGVzdCBmcmFnbWVudCBidXQga2VlcCB0aGUgZW5naW5lIHJ1bm5pbmcgKi8KKwkJZG1hcC0+cWhlYWQgPSAoZG1hcC0+cWhlYWQgKyAxKSAlIGRtYXAtPm5idWZzOworCQlkbWFwLT5xdGFpbCA9IChkbWFwLT5xdGFpbCArIDEpICUgZG1hcC0+bmJ1ZnM7CisJfSBlbHNlIGlmIChkbWFwLT5xbGVuID49IDAgJiYgZG1hcC0+cWxlbiA8IGRtYXAtPm5idWZzKSB7CisJCWRtYXAtPnFsZW4rKzsKKwkJZG1hcC0+cXRhaWwgPSAoZG1hcC0+cXRhaWwgKyAxKSAlIGRtYXAtPm5idWZzOworCQlpZiAoZG1hcC0+cXRhaWwgPT0gMCkgewkJLyogV3JhcHBlZCAqLworCQkJZG1hcC0+Ynl0ZV9jb3VudGVyICs9IGRtYXAtPmJ5dGVzX2luX3VzZTsKKwkJCWlmIChkbWFwLT5ieXRlX2NvdW50ZXIgPj0gZG1hcC0+bWF4X2J5dGVfY291bnRlcikgewkvKiBPdmVyZmxvdyAqLworCQkJCWxvbmcgZGVjciA9IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCQlkbWFwLT5ieXRlX2NvdW50ZXIgPSAoZG1hcC0+Ynl0ZV9jb3VudGVyICUgZG1hcC0+Ynl0ZXNfaW5fdXNlKSArIGRtYXAtPmJ5dGVzX2luX3VzZTsKKwkJCQlkZWNyIC09IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCQlkbWFwLT51c2VyX2NvdW50ZXIgLT0gZGVjcjsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIShhZGV2LT5mbGFncyAmIERNQV9BVVRPTU9ERSkgfHwgKGRtYXAtPmZsYWdzICYgRE1BX05PRE1BKSkgeworCQlsb2NhbF9zdGFydF9kbWEoYWRldiwgZG1hcC0+cmF3X2J1Zl9waHlzLCBkbWFwLT5ieXRlc19pbl91c2UsIERNQV9NT0RFX1JFQUQpOworCQlhZGV2LT5kLT5zdGFydF9pbnB1dChkZXYsIGRtYXAtPnJhd19idWZfcGh5cyArIGRtYXAtPnF0YWlsICogZG1hcC0+ZnJhZ21lbnRfc2l6ZSwgZG1hcC0+ZnJhZ21lbnRfc2l6ZSwgMSk7CisJCWlmIChhZGV2LT5kLT50cmlnZ2VyKQorCQkJYWRldi0+ZC0+dHJpZ2dlcihkZXYsYWRldi0+ZW5hYmxlX2JpdHMgKiBhZGV2LT5nbyk7CisJfQorCWRtYXAtPmZsYWdzIHw9IERNQV9BQ1RJVkU7CisJaWYgKGRtYXAtPnFsZW4gPiAwKQorCXsKKwkJd2FrZV91cCgmYWRldi0+aW5fc2xlZXBlcik7CisJCXdha2VfdXAoJmFkZXYtPnBvbGxfc2xlZXBlcik7CisJfQorfQorLyogY2FsbGVkIGluIGlycSBjb250ZXh0ICovCit2b2lkIERNQWJ1Zl9pbnB1dGludHIoaW50IGRldikKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfaW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKworCWlmICghKGRtYXAtPmZsYWdzICYgRE1BX05PRE1BKSkgeworCQlpbnQgY2hhbiA9IGRtYXAtPmRtYSwgcG9zLCBuOworCQl1bnNpZ25lZCBsb25nIGY7CisJCQorCQlmPWNsYWltX2RtYV9sb2NrKCk7CisJCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkKKwkJCWRpc2FibGVfZG1hKGRtYXAtPmRtYSk7CisJCWNsZWFyX2RtYV9mZihjaGFuKTsKKwkJcG9zID0gZG1hcC0+Ynl0ZXNfaW5fdXNlIC0gZ2V0X2RtYV9yZXNpZHVlKGNoYW4pOworCQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpCisJCQllbmFibGVfZG1hKGRtYXAtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZik7CisKKwkJcG9zID0gcG9zIC8gZG1hcC0+ZnJhZ21lbnRfc2l6ZTsJLyogQWN0dWFsIHFoZWFkICovCisJCWlmIChwb3MgPCAwIHx8IHBvcyA+PSBkbWFwLT5uYnVmcykKKwkJCXBvcyA9IDA7CisKKwkJbiA9IDA7CisJCXdoaWxlIChkbWFwLT5xdGFpbCAhPSBwb3MgJiYgKytuIDwgZG1hcC0+bmJ1ZnMpCisJCQlkb19pbnB1dGludHIoZGV2KTsKKwl9IGVsc2UKKwkJZG9faW5wdXRpbnRyKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7Cit9CisKK2ludCBETUFidWZfb3Blbl9kbWEoaW50IGRldikKK3sKKwkvKgorCSAqICAgIE5PVEUhICBUaGlzIHJvdXRpbmUgb3BlbnMgb25seSB0aGUgcHJpbWFyeSBETUEgY2hhbm5lbCAob3V0cHV0KS4KKwkgKi8KKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBvcGVuX2RtYXAoYWRldiwgT1BFTl9SRUFEV1JJVEUsIGFkZXYtPmRtYXBfb3V0KSkgPCAwKQorCQlyZXR1cm4gLUVCVVNZOworCWRtYV9pbml0X2J1ZmZlcnMoYWRldi0+ZG1hcF9vdXQpOworCWFkZXYtPmRtYXBfb3V0LT5mbGFncyB8PSBETUFfQUxMT0NfRE9ORTsKKwlhZGV2LT5kbWFwX291dC0+ZnJhZ21lbnRfc2l6ZSA9IGFkZXYtPmRtYXBfb3V0LT5idWZmc2l6ZTsKKworCWlmIChhZGV2LT5kbWFwX291dC0+ZG1hID49IDApIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQljbGVhcl9kbWFfZmYoYWRldi0+ZG1hcF9vdXQtPmRtYSk7CisJCWRpc2FibGVfZG1hKGFkZXYtPmRtYXBfb3V0LT5kbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgRE1BYnVmX2Nsb3NlX2RtYShpbnQgZGV2KQoreworCWNsb3NlX2RtYXAoYXVkaW9fZGV2c1tkZXZdLCBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0KTsKK30KKwordm9pZCBETUFidWZfaW5pdChpbnQgZGV2LCBpbnQgZG1hMSwgaW50IGRtYTIpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJLyoKKwkgKiBOT1RFISBUaGlzIHJvdXRpbmUgY291bGQgYmUgY2FsbGVkIHNldmVyYWwgdGltZXMuCisJICovCisKKwkvKiBkcmFnIGluIGF1ZGlvX3N5bXMubyAqLworCXsKKwkJZXh0ZXJuIGNoYXIgYXVkaW9fc3ltc19zeW1ib2w7CisJCWF1ZGlvX3N5bXNfc3ltYm9sID0gMDsKKwl9CisKKwlpZiAoYWRldiAmJiBhZGV2LT5kbWFwX291dCA9PSBOVUxMKSB7CisJCWlmIChhZGV2LT5kID09IE5VTEwpCisJCQlwYW5pYygiT1NTOiBhdWRpb19kZXZzWyVkXS0+ZCA9PSBOVUxMXG4iLCBkZXYpOworCisJCWlmIChhZGV2LT5wYXJlbnRfZGV2KSB7CSAvKiBVc2UgRE1BIG1hcCBvZiB0aGUgcGFyZW50IGRldiAqLworCQkJaW50IHBhcmVudCA9IGFkZXYtPnBhcmVudF9kZXYgLSAxOworCQkJYWRldi0+ZG1hcF9vdXQgPSBhdWRpb19kZXZzW3BhcmVudF0tPmRtYXBfb3V0OworCQkJYWRldi0+ZG1hcF9pbiA9IGF1ZGlvX2RldnNbcGFyZW50XS0+ZG1hcF9pbjsKKwkJfSBlbHNlIHsKKwkJCWFkZXYtPmRtYXBfb3V0ID0gYWRldi0+ZG1hcF9pbiA9ICZhZGV2LT5kbWFwc1swXTsKKwkJCWFkZXYtPmRtYXBfb3V0LT5kbWEgPSBkbWExOworCQkJaWYgKGFkZXYtPmZsYWdzICYgRE1BX0RVUExFWCkgeworCQkJCWFkZXYtPmRtYXBfaW4gPSAmYWRldi0+ZG1hcHNbMV07CisJCQkJYWRldi0+ZG1hcF9pbi0+ZG1hID0gZG1hMjsKKwkJCX0KKwkJfQorCQkvKiBQZXJzaXN0ZW50IERNQSBidWZmZXJzIGFsbG9jYXRlZCBoZXJlICovCisJCWlmIChzb3VuZF9kbWFwX2ZsYWcgPT0gRE1BUF9LRUVQX09OX0NMT1NFKSB7CisJCQlpZiAoYWRldi0+ZG1hcF9pbi0+cmF3X2J1ZiA9PSBOVUxMKQorCQkJCXNvdW5kX2FsbG9jX2RtYXAoYWRldi0+ZG1hcF9pbik7CisJCQlpZiAoYWRldi0+ZG1hcF9vdXQtPnJhd19idWYgPT0gTlVMTCkKKwkJCQlzb3VuZF9hbGxvY19kbWFwKGFkZXYtPmRtYXBfb3V0KTsKKwkJfQorCX0KK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBETUFidWZfYWN0aXZhdGVfcmVjb3JkaW5nIHByb3RlY3RlZCBieSBnbG9iYWwgY2xpL3N0aSAqLworc3RhdGljIHVuc2lnbmVkIGludCBwb2xsX2lucHV0KHN0cnVjdCBmaWxlICogZmlsZSwgaW50IGRldiwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfaW47CisKKwlpZiAoIShhZGV2LT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpKQorCQlyZXR1cm4gMDsKKwlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKSB7CisJCWlmIChkbWFwLT5xbGVuKQorCQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJCXJldHVybiAwOworCX0KKwlpZiAoZG1hcC0+ZG1hX21vZGUgIT0gRE1PREVfSU5QVVQpIHsKKwkJaWYgKGRtYXAtPmRtYV9tb2RlID09IERNT0RFX05PTkUgJiYKKwkJICAgIGFkZXYtPmVuYWJsZV9iaXRzICYgUENNX0VOQUJMRV9JTlBVVCAmJgorCQkgICAgIWRtYXAtPnFsZW4gJiYgYWRldi0+Z28pIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJCURNQWJ1Zl9hY3RpdmF0ZV9yZWNvcmRpbmcoZGV2LCBkbWFwKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoIWRtYXAtPnFsZW4pCisJCXJldHVybiAwOworCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBvbGxfb3V0cHV0KHN0cnVjdCBmaWxlICogZmlsZSwgaW50IGRldiwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworCQorCWlmICghKGFkZXYtPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpKQorCQlyZXR1cm4gMDsKKwlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKSB7CisJCWlmIChkbWFwLT5xbGVuKQorCQkJcmV0dXJuIFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGRtYXAtPmRtYV9tb2RlID09IERNT0RFX0lOUFVUKQorCQlyZXR1cm4gMDsKKwlpZiAoZG1hcC0+ZG1hX21vZGUgPT0gRE1PREVfTk9ORSkKKwkJcmV0dXJuIFBPTExPVVQgfCBQT0xMV1JOT1JNOworCWlmICghRE1BYnVmX3NwYWNlX2luX3F1ZXVlKGRldikpCisJCXJldHVybiAwOworCXJldHVybiBQT0xMT1VUIHwgUE9MTFdSTk9STTsKK30KKwordW5zaWduZWQgaW50IERNQWJ1Zl9wb2xsKHN0cnVjdCBmaWxlICogZmlsZSwgaW50IGRldiwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlwb2xsX3dhaXQoZmlsZSwgJmFkZXYtPnBvbGxfc2xlZXBlciwgd2FpdCk7CisJcmV0dXJuIHBvbGxfaW5wdXQoZmlsZSwgZGV2LCB3YWl0KSB8IHBvbGxfb3V0cHV0KGZpbGUsIGRldiwgd2FpdCk7Cit9CisKK3ZvaWQgRE1BYnVmX2RlaW5pdChpbnQgZGV2KQoreworCXN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOworCS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBkcml2ZXIgaXMgYmVpbmcgdW5sb2FkZWQgKi8KKwlpZiAoIWFkZXYpCisJCXJldHVybjsKKworCS8qIFBlcnNpc3RlbnQgRE1BIGJ1ZmZlcnMgZGVhbGxvY2F0ZWQgaGVyZSAqLworCWlmIChzb3VuZF9kbWFwX2ZsYWcgPT0gRE1BUF9LRUVQX09OX0NMT1NFKSB7CisJCXNvdW5kX2ZyZWVfZG1hcChhZGV2LT5kbWFwX291dCk7CisJCWlmIChhZGV2LT5mbGFncyAmIERNQV9EVVBMRVgpCisJCQlzb3VuZF9mcmVlX2RtYXAoYWRldi0+ZG1hcF9pbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL0tjb25maWcgYi9zb3VuZC9vc3MvZG1hc291bmQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjg0NTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL0tjb25maWcKQEAgLTAsMCArMSw1OCBAQAorY29uZmlnIERNQVNPVU5EX0FUQVJJCisJdHJpc3RhdGUgIkF0YXJpIERNQSBzb3VuZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVRBUkkgJiYgU09VTkQKKwlzZWxlY3QgRE1BU09VTkQKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGludGVybmFsIGF1ZGlvIG9mIHlvdXIgQXRhcmkgaW4gTGludXgsIGFuc3dlcgorCSAgWSB0byB0aGlzIHF1ZXN0aW9uLiBUaGlzIHdpbGwgcHJvdmlkZSBhIFN1bi1saWtlIC9kZXYvYXVkaW8sCisJICBjb21wYXRpYmxlIHdpdGggdGhlIExpbnV4L2kzODYgc291bmQgc3lzdGVtLiBPdGhlcndpc2UsIHNheSBOLgorCisJICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdQorCSAgd2FudCkuIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4KKworY29uZmlnIERNQVNPVU5EX1BNQUMKKwl0cmlzdGF0ZSAiUG93ZXJNYWMgRE1BIHNvdW5kIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQUEMzMiAmJiBQUENfUE1BQyAmJiBTT1VORCAmJiBJMkMKKyAJc2VsZWN0IERNQVNPVU5ECisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBpbnRlcm5hbCBhdWRpbyBvZiB5b3VyIFBvd2VyTWFjIGluIExpbnV4LAorCSAgYW5zd2VyIFkgdG8gdGhpcyBxdWVzdGlvbi4gVGhpcyB3aWxsIHByb3ZpZGUgYSBTdW4tbGlrZSAvZGV2L2F1ZGlvLAorCSAgY29tcGF0aWJsZSB3aXRoIHRoZSBMaW51eC9pMzg2IHNvdW5kIHN5c3RlbS4gT3RoZXJ3aXNlLCBzYXkgTi4KKworCSAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCisJICBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3UKKwkgIHdhbnQpLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dD4uCisKK2NvbmZpZyBETUFTT1VORF9QQVVMQQorCXRyaXN0YXRlICJBbWlnYSBETUEgc291bmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIChBTUlHQSB8fCBBUFVTKSAmJiBTT1VORAorCXNlbGVjdCBETUFTT1VORAorCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgaW50ZXJuYWwgYXVkaW8gb2YgeW91ciBBbWlnYSBpbiBMaW51eCwgYW5zd2VyCisJICBZIHRvIHRoaXMgcXVlc3Rpb24uIFRoaXMgd2lsbCBwcm92aWRlIGEgU3VuLWxpa2UgL2Rldi9hdWRpbywKKwkgIGNvbXBhdGlibGUgd2l0aCB0aGUgTGludXgvaTM4NiBzb3VuZCBzeXN0ZW0uIE90aGVyd2lzZSwgc2F5IE4uCisKKwkgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91CisJICB3YW50KS4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQ+LgorCitjb25maWcgRE1BU09VTkRfUTQwCisJdHJpc3RhdGUgIlE0MCBzb3VuZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUTQwICYmIFNPVU5ECisJc2VsZWN0IERNQVNPVU5ECisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBpbnRlcm5hbCBhdWRpbyBvZiB5b3VyIFE0MCBpbiBMaW51eCwgYW5zd2VyCisJICBZIHRvIHRoaXMgcXVlc3Rpb24uIFRoaXMgd2lsbCBwcm92aWRlIGEgU3VuLWxpa2UgL2Rldi9hdWRpbywKKwkgIGNvbXBhdGlibGUgd2l0aCB0aGUgTGludXgvaTM4NiBzb3VuZCBzeXN0ZW0uIE90aGVyd2lzZSwgc2F5IE4uCisKKwkgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91CisJICB3YW50KS4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQ+LgorCitjb25maWcgRE1BU09VTkQKKwl0cmlzdGF0ZQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL01ha2VmaWxlIGIvc291bmQvb3NzL2RtYXNvdW5kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTE2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIERNQSBzb3VuZCBkcml2ZXIKKyMKKworZG1hc291bmRfcG1hYy15CQkJKz0gZG1hc291bmRfYXdhY3MubyBcCisJCQkJICAgdHJhbnNfMTYubyBkYWMzNTUwYS5vIHRhc19jb21tb24ubyBcCisJCQkJICAgdGFzMzAwMWMubyB0YXMzMDAxY190YWJsZXMubyBcCisJCQkJICAgdGFzMzAwNC5vIHRhczMwMDRfdGFibGVzLm8KKworb2JqLSQoQ09ORklHX0RNQVNPVU5EX0FUQVJJKQkrPSBkbWFzb3VuZF9jb3JlLm8gZG1hc291bmRfYXRhcmkubworb2JqLSQoQ09ORklHX0RNQVNPVU5EX1BNQUMpCSs9IGRtYXNvdW5kX2NvcmUubyBkbWFzb3VuZF9wbWFjLm8KK29iai0kKENPTkZJR19ETUFTT1VORF9QQVVMQSkJKz0gZG1hc291bmRfY29yZS5vIGRtYXNvdW5kX3BhdWxhLm8KK29iai0kKENPTkZJR19ETUFTT1VORF9RNDApCSs9IGRtYXNvdW5kX2NvcmUubyBkbWFzb3VuZF9xNDAubwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2F3YWNzX2RlZnMuaCBiL3NvdW5kL29zcy9kbWFzb3VuZC9hd2Fjc19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5NGY0NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC9hd2Fjc19kZWZzLmgKQEAgLTAsMCArMSwyNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgc29tZW9uZSwgc29tZXdoZXJlLCBzb21ldGltZSAqLworLyogQW5kIGlzIHJlbGVhc2VkIGludG8gdGhlIFB1YmxpYyBEb21haW4gICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0FXQUNTX0RFRlNfSF8KKyNkZWZpbmUgX0FXQUNTX0RFRlNfSF8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBV0FDcyBBdWRpbyBSZWdpc3RlciBMYXlvdXQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYXdhY3NfcmVncyB7CisgICAgdW5zaWduZWQJY29udHJvbDsJLyogQXVkaW8gY29udHJvbCByZWdpc3RlciAqLworICAgIHVuc2lnbmVkCXBhZDBbM107CisgICAgdW5zaWduZWQJY29kZWNfY3RybDsJLyogQ29kZWMgY29udHJvbCByZWdpc3RlciAqLworICAgIHVuc2lnbmVkCXBhZDFbM107CisgICAgdW5zaWduZWQJY29kZWNfc3RhdDsJLyogQ29kZWMgc3RhdHVzIHJlZ2lzdGVyICovCisgICAgdW5zaWduZWQJcGFkMlszXTsKKyAgICB1bnNpZ25lZAljbGlwX2NvdW50OwkvKiBDbGlwcGluZyBjb3VudCByZWdpc3RlciAqLworICAgIHVuc2lnbmVkCXBhZDNbM107CisgICAgdW5zaWduZWQJYnl0ZXN3YXA7CS8qIERhdGEgaXMgbGl0dGxlLWVuZGlhbiBpZiAxICovCit9OworCisvKioqKioqKioqKioqKioqKioqKi8KKy8qIEF1ZGlvIEJpdCBNYXNrcyAqLworLyoqKioqKioqKioqKioqKioqKiovCisKKy8qIEF1ZGlvIENvbnRyb2wgUmVnIEJpdCBNYXNrcyAqLworLyogLS0tLS0gLS0tLS0tLSAtLS0gLS0tIC0tLS0tICovCisjZGVmaW5lIE1BU0tfSVNGU0VMCSgweGYpCQkvKiBJbnB1dCBTdWJGcmFtZSBTZWxlY3QgKi8KKyNkZWZpbmUgTUFTS19PU0ZTRUwJKDB4ZiA8PCA0KQkvKiBPdXRwdXQgU3ViRnJhbWUgU2VsZWN0ICovCisjZGVmaW5lIE1BU0tfUkFURQkoMHg3IDw8IDgpCS8qIFNvdW5kIFJhdGUgKi8KKyNkZWZpbmUgTUFTS19DTlRMRVJSCSgweDEgPDwgMTEpCS8qIEVycm9yICovCisjZGVmaW5lIE1BU0tfUE9SVENIRwkoMHgxIDw8IDEyKQkvKiBQb3J0IENoYW5nZSAqLworI2RlZmluZSBNQVNLX0lFRQkoMHgxIDw8IDEzKQkvKiBFbmFibGUgSW50ZXJydXB0IG9uIEVycm9yICovCisjZGVmaW5lIE1BU0tfSUVQQwkoMHgxIDw8IDE0KQkvKiBFbmFibGUgSW50ZXJydXB0IG9uIFBvcnQgQ2hhbmdlICovCisjZGVmaW5lIE1BU0tfU1NGU0VMCSgweDMgPDwgMTUpCS8qIFN0YXR1cyBTdWJGcmFtZSBTZWxlY3QgKi8KKworLyogQXVkaW8gQ29kZWMgQ29udHJvbCBSZWcgQml0IE1hc2tzICovCisvKiAtLS0tLSAtLS0tLSAtLS0tLS0tIC0tLSAtLS0gLS0tLS0gKi8KKyNkZWZpbmUgTUFTS19ORVdFQ01ECSgweDEgPDwgMjQpCS8qIExvY2s6IGRvbid0IHdyaXRlIHRvIHJlZyB3aGVuIDEgKi8KKyNkZWZpbmUgTUFTS19FTU9ERVNFTAkoMHgzIDw8IDIyKQkvKiBTZW5kIGluZm8gb3V0IG9uIHdoaWNoIGZyYW1lPyAqLworI2RlZmluZSBNQVNLX0VYTU9ERUFERFIJKDB4M2ZmIDw8IDEyKQkvKiBFeHRlbmRlZCBNb2RlIEFkZHJlc3MgLS0gMTAgYml0cyAqLworI2RlZmluZSBNQVNLX0VYTU9ERURBVEEJKDB4ZmZmKQkJLyogRXh0ZW5kZWQgTW9kZSBEYXRhIC0tIDEyIGJpdHMgKi8KKworLyogQXVkaW8gQ29kZWMgQ29udHJvbCBBZGRyZXNzIFZhbHVlcyAvIE1hc2tzICovCisvKiAtLS0tLSAtLS0tLSAtLS0tLS0tIC0tLS0tLS0gLS0tLS0tIC0gLS0tLS0gKi8KKyNkZWZpbmUgTUFTS19BRERSMAkoMHgwIDw8IDEyKQkvKiBFeHBhbmRlZCBEYXRhIE1vZGUgQWRkcmVzcyAwICovCisjZGVmaW5lIE1BU0tfQUREUl9NVVgJTUFTS19BRERSMAkvKiBNdXggQ29udHJvbCAqLworI2RlZmluZSBNQVNLX0FERFJfR0FJTglNQVNLX0FERFIwCisKKyNkZWZpbmUgTUFTS19BRERSMQkoMHgxIDw8IDEyKQkvKiBFeHBhbmRlZCBEYXRhIE1vZGUgQWRkcmVzcyAxICovCisjZGVmaW5lIE1BU0tfQUREUl9NVVRFCU1BU0tfQUREUjEKKyNkZWZpbmUgTUFTS19BRERSX1JBVEUJTUFTS19BRERSMQorCisjZGVmaW5lIE1BU0tfQUREUjIJKDB4MiA8PCAxMikJLyogRXhwYW5kZWQgRGF0YSBNb2RlIEFkZHJlc3MgMiAqLworI2RlZmluZSBNQVNLX0FERFJfVk9MQQlNQVNLX0FERFIyCS8qIFZvbHVtZSBDb250cm9sIEEgLS0gSGVhZHBob25lcyAqLworI2RlZmluZSBNQVNLX0FERFJfVk9MSEQgTUFTS19BRERSMgorCisjZGVmaW5lIE1BU0tfQUREUjQJKDB4NCA8PCAxMikJLyogRXhwYW5kZWQgRGF0YSBNb2RlIEFkZHJlc3MgNCAqLworI2RlZmluZSBNQVNLX0FERFJfVk9MQwlNQVNLX0FERFI0CS8qIFZvbHVtZSBDb250cm9sIEMgLS0gU3BlYWtlciAqLworI2RlZmluZSBNQVNLX0FERFJfVk9MU1BLIE1BU0tfQUREUjQKKworLyogYWRkaXRpb25hbCByZWdpc3RlcnMgb2Ygc2NyZWFtZXIgKi8KKyNkZWZpbmUgTUFTS19BRERSNQkoMHg1IDw8IDEyKQkvKiBFeHBhbmRlZCBEYXRhIE1vZGUgQWRkcmVzcyA1ICovCisjZGVmaW5lIE1BU0tfQUREUjYJKDB4NiA8PCAxMikJLyogRXhwYW5kZWQgRGF0YSBNb2RlIEFkZHJlc3MgNiAqLworI2RlZmluZSBNQVNLX0FERFI3CSgweDcgPDwgMTIpCS8qIEV4cGFuZGVkIERhdGEgTW9kZSBBZGRyZXNzIDcgKi8KKworLyogQWRkcmVzcyAwIEJpdCBNYXNrcyAmIE1hY3JvcyAqLworLyogLS0tLS0tLSAtIC0tLSAtLS0tLSAtIC0tLS0tLSAqLworI2RlZmluZSBNQVNLX0dBSU5SSUdIVAkoMHhmKQkJLyogR2FpbiBSaWdodCBNYXNrICovCisjZGVmaW5lIE1BU0tfR0FJTkxFRlQJKDB4ZiA8PCA0KQkvKiBHYWluIExlZnQgTWFzayAqLworI2RlZmluZSBNQVNLX0dBSU5MSU5FCSgweDEgPDwgOCkJLyogRGlzYWJsZSBNaWMgcHJlYW1wICovCisjZGVmaW5lIE1BU0tfR0FJTk1JQwkoMHgwIDw8IDgpCS8qIEVuYWJsZSBNaWMgcHJlYW1wICovCisKKyNkZWZpbmUgTUFTS19NVVhfQ0QJKDB4MSA8PCA5KQkvKiBTZWxlY3QgQ0QgaW4gTVVYICovCisjZGVmaW5lIE1BU0tfTVVYX01JQwkoMHgxIDw8IDEwKQkvKiBTZWxlY3QgTWljIGluIE1VWCAqLworI2RlZmluZSBNQVNLX01VWF9BVURJTgkoMHgxIDw8IDExKQkvKiBTZWxlY3QgQXVkaW8gSW4gaW4gTVVYICovCisjZGVmaW5lIE1BU0tfTVVYX0xJTkUJTUFTS19NVVhfQVVESU4KKworI2RlZmluZSBHQUlOUklHSFQoeCkJKCh4KSAmIE1BU0tfR0FJTlJJR0hUKQorI2RlZmluZSBHQUlOTEVGVCh4KQkoKCh4KSA8PCA0KSAmIE1BU0tfR0FJTkxFRlQpCisKKyNkZWZpbmUgREVGX0NEX0dBSU4gMHgwMGJiCisjZGVmaW5lIERFRl9NSUNfR0FJTiAweDAwY2MKKworLyogQWRkcmVzcyAxIEJpdCBNYXNrcyAqLworLyogLS0tLS0tLSAtIC0tLSAtLS0tLSAqLworI2RlZmluZSBNQVNLX0FERFIxUkVTMQkoMHgzKQkJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFTS19SRUNBTElCUkFURSAoMHgxIDw8IDIpCS8qIFJlY2FsaWJyYXRlICovCisjZGVmaW5lIE1BU0tfU0FNUExFUkFURQkoMHg3IDw8IDMpCS8qIFNhbXBsZSBSYXRlOiAqLworI2RlZmluZSBNQVNLX0xPT1BUSFJVCSgweDEgPDwgNikJLyogTG9vcHRocm91Z2ggRW5hYmxlICovCisjZGVmaW5lIE1BU0tfQ01VVEUJKDB4MSA8PCA3KQkvKiBPdXRwdXQgQyAoU3BlYWtlcikgTXV0ZSB3aGVuIDEgKi8KKyNkZWZpbmUgTUFTS19TUEtNVVRFCU1BU0tfQ01VVEUKKyNkZWZpbmUgTUFTS19BRERSMVJFUzIJKDB4MSA8PCA4KQkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBNQVNLX0FNVVRFCSgweDEgPDwgOSkJLyogT3V0cHV0IEEgKEhlYWRwaG9uZSkgTXV0ZSB3aGVuIDEgKi8KKyNkZWZpbmUgTUFTS19IRE1VVEUJTUFTS19BTVVURQorI2RlZmluZSBNQVNLX1BBUk9VVDAJKDB4MSA8PCAxMCkJLyogUGFyYWxsZWwgT3V0cHV0IDAgKi8KKyNkZWZpbmUgTUFTS19QQVJPVVQxCSgweDIgPDwgMTApCS8qIFBhcmFsbGVsIE91dHB1dCAxICovCisKKyNkZWZpbmUgTUFTS19NSUNfQk9PU1QgICgweDQpICAgICAgICAgICAvKiBzY3JlYW1lciBtaWMgYm9vc3QgKi8KKworI2RlZmluZSBTQU1QTEVSQVRFXzQ4MDAwCSgweDAgPDwgMykJLyogNDggb3IgNDQuMSBrSHogKi8KKyNkZWZpbmUgU0FNUExFUkFURV8zMjAwMAkoMHgxIDw8IDMpCS8qIDMyIG9yIDI5LjQga0h6ICovCisjZGVmaW5lIFNBTVBMRVJBVEVfMjQwMDAJKDB4MiA8PCAzKQkvKiAyNCBvciAyMi4wNSBrSHogKi8KKyNkZWZpbmUgU0FNUExFUkFURV8xOTIwMAkoMHgzIDw8IDMpCS8qIDE5LjIgb3IgMTcuNjQga0h6ICovCisjZGVmaW5lIFNBTVBMRVJBVEVfMTYwMDAJKDB4NCA8PCAzKQkvKiAxNiBvciAxNC43IGtIeiAqLworI2RlZmluZSBTQU1QTEVSQVRFXzEyMDAwCSgweDUgPDwgMykJLyogMTIgb3IgMTEuMDI1IGtIeiAqLworI2RlZmluZSBTQU1QTEVSQVRFXzk2MDAJCSgweDYgPDwgMykJLyogOS42IG9yIDguODIga0h6ICovCisjZGVmaW5lIFNBTVBMRVJBVEVfODAwMAkJKDB4NyA8PCAzKQkvKiA4IG9yIDcuMzUga0h6ICovCisKKy8qIEFkZHJlc3MgMiAmIDQgQml0IE1hc2tzICYgTWFjcm9zICovCisvKiAtLS0tLS0tIC0gLSAtIC0tLSAtLS0tLSAtIC0tLS0tLSAqLworI2RlZmluZSBNQVNLX09VVFZPTFJJR0hUICgweGYpCQkvKiBPdXRwdXQgUmlnaHQgVm9sdW1lICovCisjZGVmaW5lIE1BU0tfQUREUjJSRVMxCSgweDIgPDwgNCkJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFTS19BRERSNFJFUzEJTUFTS19BRERSMlJFUzEKKyNkZWZpbmUgTUFTS19PVVRWT0xMRUZUCSgweGYgPDwgNikJLyogT3V0cHV0IExlZnQgVm9sdW1lICovCisjZGVmaW5lIE1BU0tfQUREUjJSRVMyCSgweDIgPDwgMTApCS8qIFJlc2VydmVkICovCisjZGVmaW5lIE1BU0tfQUREUjRSRVMyCU1BU0tfQUREUjJSRVMyCisKKyNkZWZpbmUgVk9MUklHSFQoeCkJKCgofih4KSkgJiBNQVNLX09VVFZPTFJJR0hUKSkKKyNkZWZpbmUgVk9MTEVGVCh4KQkoKCh+KHgpKSA8PCA2KSAmIE1BU0tfT1VUVk9MTEVGVCkKKworLyogQXVkaW8gQ29kZWMgU3RhdHVzIFJlZyBCaXQgTWFza3MgKi8KKy8qIC0tLS0tIC0tLS0tIC0tLS0tLSAtLS0gLS0tIC0tLS0tICovCisjZGVmaW5lIE1BU0tfRVhURU5ECSgweDEgPDwgMjMpCS8qIEV4dGVuZCAqLworI2RlZmluZSBNQVNLX1ZBTElECSgweDEgPDwgMjIpCS8qIFZhbGlkIERhdGE/ICovCisjZGVmaW5lIE1BU0tfT0ZMRUZUCSgweDEgPDwgMjEpCS8qIE92ZXJmbG93IExlZnQgKi8KKyNkZWZpbmUgTUFTS19PRlJJR0hUCSgweDEgPDwgMjApCS8qIE92ZXJmbG93IFJpZ2h0ICovCisjZGVmaW5lIE1BU0tfRVJSQ09ERQkoMHhmIDw8IDE2KQkvKiBFcnJvciBDb2RlICovCisjZGVmaW5lIE1BU0tfUkVWSVNJT04JKDB4ZiA8PCAxMikJLyogUmV2aXNpb24gTnVtYmVyICovCisjZGVmaW5lIE1BU0tfTUZHSUQJKDB4ZiA8PCA4KQkvKiBNZmcuIElEICovCisjZGVmaW5lIE1BU0tfQ09EU1RBVFJFUwkoMHhmIDw8IDQpCS8qIGJpdHMgNCAtIDcgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFTS19JTlBQT1JUCSgweGYpCQkvKiBJbnB1dCBQb3J0ICovCisjZGVmaW5lIE1BU0tfSERQQ09OTgk4CQkvKiBoZWFkcGhvbmUgcGx1Z2dlZCBpbiAqLworCisvKiBDbGlwcGluZyBDb3VudCBSZWcgQml0IE1hc2tzICovCisvKiAtLS0tLS0tLSAtLS0tLSAtLS0gLS0tIC0tLS0tICovCisjZGVmaW5lIE1BU0tfQ0xJUExFRlQJKDB4ZmYgPDwgNykJLyogQ2xpcHBpbmcgQ291bnQsIExlZnQgQ2hhbm5lbCAqLworI2RlZmluZSBNQVNLX0NMSVBSSUdIVAkoMHhmZikJCS8qIENsaXBwaW5nIENvdW50LCBSaWdodCBDaGFubmVsICovCisKKy8qIERCRE1BIENoYW5uZWxTdGF0dXMgQml0IE1hc2tzICovCisvKiAtLS0tLSAtLS0tLS0tLS0tLS0tIC0tLSAtLS0tLSAqLworI2RlZmluZSBNQVNLX0NTRVJSCSgweDEgPDwgNykJLyogRXJyb3IgKi8KKyNkZWZpbmUgTUFTS19FT0kJKDB4MSA8PCA2KQkvKiBFbmQgb2YgSW5wdXQgLS0gb25seSBmb3IgSW5wdXQgQ2hhbm5lbCAqLworI2RlZmluZSBNQVNLX0NTVU5VU0VECSgweDFmIDw8IDEpCS8qIGJpdHMgMS01IG5vdCB1c2VkICovCisjZGVmaW5lIE1BU0tfV0FJVAkoMHgxKQkJLyogV2FpdCAqLworCisvKiBWYXJpb3VzIFJhdGVzICovCisvKiAtLS0tLS0tIC0tLS0tICovCisjZGVmaW5lIFJBVEVfNDgwMDAJKDB4MCA8PCA4KQkvKiA0OCBrSHogKi8KKyNkZWZpbmUgUkFURV80NDEwMAkoMHgwIDw8IDgpCS8qIDQ0LjEga0h6ICovCisjZGVmaW5lIFJBVEVfMzIwMDAJKDB4MSA8PCA4KQkvKiAzMiBrSHogKi8KKyNkZWZpbmUgUkFURV8yOTQwMAkoMHgxIDw8IDgpCS8qIDI5LjQga0h6ICovCisjZGVmaW5lIFJBVEVfMjQwMDAJKDB4MiA8PCA4KQkvKiAyNCBrSHogKi8KKyNkZWZpbmUgUkFURV8yMjA1MAkoMHgyIDw8IDgpCS8qIDIyLjA1IGtIeiAqLworI2RlZmluZSBSQVRFXzE5MjAwCSgweDMgPDwgOCkJLyogMTkuMiBrSHogKi8KKyNkZWZpbmUgUkFURV8xNzY0MAkoMHgzIDw8IDgpCS8qIDE3LjY0IGtIeiAqLworI2RlZmluZSBSQVRFXzE2MDAwCSgweDQgPDwgOCkJLyogMTYga0h6ICovCisjZGVmaW5lIFJBVEVfMTQ3MDAJKDB4NCA8PCA4KQkvKiAxNC43IGtIeiAqLworI2RlZmluZSBSQVRFXzEyMDAwCSgweDUgPDwgOCkJLyogMTIga0h6ICovCisjZGVmaW5lIFJBVEVfMTEwMjUJKDB4NSA8PCA4KQkvKiAxMS4wMjUga0h6ICovCisjZGVmaW5lIFJBVEVfOTYwMAkoMHg2IDw8IDgpCS8qIDkuNiBrSHogKi8KKyNkZWZpbmUgUkFURV84ODIwCSgweDYgPDwgOCkJLyogOC44MiBrSHogKi8KKyNkZWZpbmUgUkFURV84MDAwCSgweDcgPDwgOCkJLyogOCBrSHogKi8KKyNkZWZpbmUgUkFURV83MzUwCSgweDcgPDwgOCkJLyogNy4zNSBrSHogKi8KKworI2RlZmluZSBSQVRFX0xPVwkxCS8qIEhJR0ggPSA0OGtIeiwgZXRjOyAgTE9XID0gNDQuMWtIeiwgZXRjLiAqLworCisvKioqKioqKioqKioqKioqKioqKi8KKy8qIEJ1cmd1bmR5IHZhbHVlcyAqLworLyoqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUFTS19BRERSX0JVUkdVTkRZX0lOUFNFTDIxICgweDExIDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfSU5QU0VMMyAoMHgxMiA8PCAxMikKKworI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNIMSAoMHgxMyA8PCAxMikKKyNkZWZpbmUgTUFTS19BRERSX0JVUkdVTkRZX0dBSU5DSDIgKDB4MTQgPDwgMTIpCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9HQUlOQ0gzICgweDE1IDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNINCAoMHgxNiA8PCAxMikKKworI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0gxICgweDIwIDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0gyICgweDIxIDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0gzICgweDIyIDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0g0ICgweDIzIDw8IDEyKQorCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9PVVRQVVRTRUxFQ1RTICgweDJCIDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfT1VUUFVURU5BQkxFUyAoMHgyRiA8PCAxMikKKworI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfTUFTVEVSX1ZPTFVNRSAoMHgzMCA8PCAxMikKKworI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfTU9SRV9PVVRQVVRFTkFCTEVTICgweDYwIDw8IDEyKQorCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9BVFRFTlNQRUFLRVIgKDB4NjIgPDwgMTIpCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9BVFRFTkxJTkVPVVQgKDB4NjMgPDwgMTIpCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9BVFRFTkhQICgweDY0IDw8IDEyKQorCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9WT0xDRCAoTUFTS19BRERSX0JVUkdVTkRZX1ZPTENIMSkKKyNkZWZpbmUgTUFTS19BRERSX0JVUkdVTkRZX1ZPTExJTkUgKE1BU0tfQUREUl9CVVJHVU5EWV9WT0xDSDIpCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9WT0xNSUMgKE1BU0tfQUREUl9CVVJHVU5EWV9WT0xDSDMpCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9WT0xNT0RFTSAoTUFTS19BRERSX0JVUkdVTkRZX1ZPTENINCkKKworI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNEIChNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNIMSkKKyNkZWZpbmUgTUFTS19BRERSX0JVUkdVTkRZX0dBSU5MSU5FIChNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNIMikKKyNkZWZpbmUgTUFTS19BRERSX0JVUkdVTkRZX0dBSU5NSUMgKE1BU0tfQUREUl9CVVJHVU5EWV9HQUlOQ0gzKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfR0FJTk1PREVNIChNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0g0KQorCisKKy8qIFRoZXNlIGFyZSBhbGwgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBidXJndW5keSAqLworI2RlZmluZSBERUZfQlVSR1VORFlfSU5QU0VMMjEgKDB4QUEpCisjZGVmaW5lIERFRl9CVVJHVU5EWV9JTlBTRUwzICgweDBBKQorCisjZGVmaW5lIERFRl9CVVJHVU5EWV9HQUlOQ0QgKDB4MzMpCisjZGVmaW5lIERFRl9CVVJHVU5EWV9HQUlOTElORSAoMHg0NCkKKyNkZWZpbmUgREVGX0JVUkdVTkRZX0dBSU5NSUMgKDB4NDQpCisjZGVmaW5lIERFRl9CVVJHVU5EWV9HQUlOTU9ERU0gKDB4MDYpCisKKy8qIFJlbWVtYmVyOiBsb3dlc3Qgdm9sdW1lIGhlcmUgaXMgMHg5YiAqLworI2RlZmluZSBERUZfQlVSR1VORFlfVk9MQ0QgKDB4Q0NDQ0NDQ0MpCisjZGVmaW5lIERFRl9CVVJHVU5EWV9WT0xMSU5FICgweDAwMDAwMDAwKQorI2RlZmluZSBERUZfQlVSR1VORFlfVk9MTUlDICgweDAwMDAwMDAwKQorI2RlZmluZSBERUZfQlVSR1VORFlfVk9MTU9ERU0gKDB4Q0NDQ0NDQ0MpCisKKyNkZWZpbmUgREVGX0JVUkdVTkRZX09VVFBVVFNFTEVDVFMgKDB4MDEwZjAxMGYpCisjZGVmaW5lIERFRl9CVVJHVU5EWV9PVVRQVVRFTkFCTEVTICgweDBBKQorCisjZGVmaW5lIERFRl9CVVJHVU5EWV9NQVNURVJfVk9MVU1FICgweEZGRkZGRkZGKQorCisjZGVmaW5lIERFRl9CVVJHVU5EWV9NT1JFX09VVFBVVEVOQUJMRVMgKDB4N0UpCisKKyNkZWZpbmUgREVGX0JVUkdVTkRZX0FUVEVOU1BFQUtFUiAoMHg0NCkKKyNkZWZpbmUgREVGX0JVUkdVTkRZX0FUVEVOTElORU9VVCAoMHhDQykKKyNkZWZpbmUgREVGX0JVUkdVTkRZX0FUVEVOSFAgKDB4Q0MpCisKKy8qKioqKioqKioqKioqKioqKioqKiovCisvKiBpMnMgbGF5b3V0IHZhbHVlcyAqLworLyoqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJMlNfUkVHX0lOVF9DVEwJCQkweDAwCisjZGVmaW5lIEkyU19SRUdfU0VSSUFMX0ZPUk1BVAkJMHgxMAorI2RlZmluZSBJMlNfUkVHX0NPREVDX01TR19PVVQJCTB4MjAKKyNkZWZpbmUgSTJTX1JFR19DT0RFQ19NU0dfSU4JCTB4MzAKKyNkZWZpbmUgSTJTX1JFR19GUkFNRV9DT1VOVAkJMHg0MAorI2RlZmluZSBJMlNfUkVHX0ZSQU1FX01BVENICQkweDUwCisjZGVmaW5lIEkyU19SRUdfREFUQVdPUkRfU0laRVMJCTB4NjAKKyNkZWZpbmUgSTJTX1JFR19QRUFLTEVWRUxfU0VMCQkweDcwCisjZGVmaW5lIEkyU19SRUdfUEVBS0xFVkVMX0lOMAkJMHg4MAorI2RlZmluZSBJMlNfUkVHX1BFQUtMRVZFTF9JTjEJCTB4OTAKKworI2VuZGlmIC8qIF9BV0FDU19ERUZTX0hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZGFjMzU1MGEuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kYWMzNTUwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMzg5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZGFjMzU1MGEuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIGkyYy9pMnMgYmFzZWQgREFDMzU1MGEgc291bmQgY2hpcCB1c2VkCisgKiBvbiBzb21lIEFwcGxlIGlCb29rcy4gQWxzbyBrbm93biBhcyAiREFDQSIuCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImRtYXNvdW5kLmgiCisKKy8qIEZZSTogVGhpcyBjb2RlIHdhcyBkZXJpdmVkIGZyb20gdGhlIHRhczMwMDFjLmMgVGV4YXMvVHVtYmxlciBtaXhlcgorICogY29udHJvbCBjb2RlLCBhcyB3ZWxsIGFzIGluZm8gZGVyaXZlZCBmcm9tIHRoZSBBcHBsZURBQ0FBdWRpbyBkcml2ZXIKKyAqIGZyb20gRGFyd2luIENWUyAobWFpbiB0aGluZyBJIGRlcml2ZWQgYmVpbmcgcmVnaXN0ZXIgbnVtYmVycyBhbmQgCisgKiB2YWx1ZXMsIGFzIHdlbGwgYXMgd2hlbiB0byBtYWtlIHRoZSBjYWxscykuICovCisKKyNkZWZpbmUgSTJDX0RSSVZFUklEX0RBQ0EgKDB4RkRDQikKKworI2RlZmluZSBEQUNBX1ZFUlNJT04JIjAuMSIKKyNkZWZpbmUgREFDQV9EQVRFICIyMDAxMDkzMCIKKworc3RhdGljIGludCBjdXJfbGVmdF92b2w7CitzdGF0aWMgaW50IGN1cl9yaWdodF92b2w7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKmRhY2FfY2xpZW50OworCitzdGF0aWMgaW50IGRhY2FfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgZGFjYV9kZXRlY3RfY2xpZW50KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MpOworc3RhdGljIGludCBkYWNhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0cnVjdCBpMmNfZHJpdmVyIGRhY2FfZHJpdmVyID0geyAgCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gIkRBQzM1NTBBIGRyaXZlciAgViAiIERBQ0FfVkVSU0lPTiwKKwkuaWQJCQk9IEkyQ19EUklWRVJJRF9EQUNBLAorCS5mbGFncwkJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJCT0gZGFjYV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAkJPSBkYWNhX2RldGFjaF9jbGllbnQsCit9OworCisjZGVmaW5lIFZPTF9NQVggKCgxPDwyMCkgLSAxKQorCit2b2lkIGRhY2FfZ2V0X3ZvbHVtZSh1aW50ICogbGVmdF92b2wsIHVpbnQgICpyaWdodF92b2wpCit7CisJKmxlZnRfdm9sID0gY3VyX2xlZnRfdm9sID4+IDU7CisJKnJpZ2h0X3ZvbCA9IGN1cl9yaWdodF92b2wgPj4gNTsKK30KKworaW50IGRhY2Ffc2V0X3ZvbHVtZSh1aW50IGxlZnRfdm9sLCB1aW50IHJpZ2h0X3ZvbCkKK3sKKwl1bnNpZ25lZCBzaG9ydCB2b2xkYXRhOworICAKKwlpZiAoIWRhY2FfY2xpZW50KQorCQlyZXR1cm4gLTE7CisKKwkvKiBEZXJpdmVkIGZyb20gZXhwZXJpZW5jZSwgbm90IGZyb20gYW55IHNwZWNpZmljIHZhbHVlcyAqLworCWxlZnRfdm9sIDw8PSA1OworCXJpZ2h0X3ZvbCA8PD0gNTsKKworCWlmIChsZWZ0X3ZvbCA+IFZPTF9NQVgpCisJCWxlZnRfdm9sID0gVk9MX01BWDsKKwlpZiAocmlnaHRfdm9sID4gVk9MX01BWCkKKwkJcmlnaHRfdm9sID0gVk9MX01BWDsKKworCXZvbGRhdGEgPSAoKGxlZnRfdm9sID4+IDE0KSAgJiAweDNmKSA8PCA4OworCXZvbGRhdGEgfD0gKHJpZ2h0X3ZvbCA+PiAxNCkgICYgMHgzZjsKKyAgCisJaWYgKGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoZGFjYV9jbGllbnQsIDIsIHZvbGRhdGEpIDwgMCkgeworCQlwcmludGsoImRhY2E6IGZhaWxlZCB0byBzZXQgdm9sdW1lIFxuIik7CisJCXJldHVybiAtMTsgCisJfQorCisJY3VyX2xlZnRfdm9sID0gbGVmdF92b2w7CisJY3VyX3JpZ2h0X3ZvbCA9IHJpZ2h0X3ZvbDsKKyAgCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYWNhX2xlYXZlX3NsZWVwKHZvaWQpCit7CisJaWYgKCFkYWNhX2NsaWVudCkKKwkJcmV0dXJuIC0xOworICAKKwkvKiBEbyBhIHNob3J0IHNsZWVwLCBqdXN0IHRvIG1ha2Ugc3VyZSBJMkMgYnVzIGlzIGF3YWtlIGFuZCBwYXlpbmcKKwkgKiBhdHRlbnRpb24gdG8gdXMKKwkgKi8KKwltc2xlZXAoMjApOworCS8qIFdyaXRlIHRoZSBzYW1wbGUgcmF0ZSByZWcgdGhlIHZhbHVlIGl0IG5lZWRzICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYWNhX2NsaWVudCwgMSwgOCk7CisJZGFjYV9zZXRfdm9sdW1lKGN1cl9sZWZ0X3ZvbCA+PiA1LCBjdXJfcmlnaHRfdm9sID4+IDUpOworCS8qIEFub3RoZXIgc2hvcnQgZGVsYXksIGp1c3QgdG8gbWFrZSBzdXJlIHRoZSBvdGhlciBJMkMgYnVzIHdyaXRlcworCSAqIGhhdmUgdGFrZW4uLi4KKwkgKi8KKwltc2xlZXAoMjApOworCS8qIFdyaXRlIHRoZSBnbG9iYWwgY29uZmlnIHJlZyAtIGludmVydCByaWdodCBwb3dlciBhbXAsCisJICogREFDIG9uLCB1c2UgNS12b2x0IG1vZGUgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhY2FfY2xpZW50LCAzLCAweDQ1KTsKKworCXJldHVybiAwOworfQorCitpbnQgZGFjYV9lbnRlcl9zbGVlcCh2b2lkKQoreworCWlmICghZGFjYV9jbGllbnQpCisJCXJldHVybiAtMTsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGFjYV9jbGllbnQsIDEsIDgpOworCWRhY2Ffc2V0X3ZvbHVtZShjdXJfbGVmdF92b2wgPj4gNSwgY3VyX3JpZ2h0X3ZvbCA+PiA1KTsKKworCS8qIFdyaXRlIHRoZSBnbG9iYWwgY29uZmlnIHJlZyAtIGludmVydCByaWdodCBwb3dlciBhbXAsCisJICogREFDIG9uLCBlbnRlciBsb3ctcG93ZXIgbW9kZSwgdXNlIDUtdm9sdCBtb2RlCisJICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYWNhX2NsaWVudCwgMywgMHg2NSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYWNhX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIXN0cm5jbXAoYWRhcHRlci0+bmFtZSwgIm1hYy1pbyIsIDYpKQorCQlkYWNhX2RldGVjdF9jbGllbnQoYWRhcHRlciwgMHg0ZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFjYV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqIG5ld19jbGllbnQpCit7CisJLyogCisJICogUHJvYmUgaXMgbm90IHdvcmtpbmcgd2l0aCB0aGUgY3VycmVudCBpMmMta2V5d2VzdAorCSAqIGRyaXZlci4gV2UgdHJ5IHRvIHVzZSBhZGRyIDB4NGQgb24gZWFjaCBhZGFwdGVycworCSAqIGluc3RlYWQsIGJ5IHNldHRpbmcgdGhlIGZvcm1hdCByZWdpc3Rlci4KKwkgKiAKKwkgKiBGSVhNRTogSSdtIHN1cmUgdGhhdCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUKKwkgKiBkZXZpY2UtdHJlZS4gLS1CZW5ILgorCSAqLworICAKKwkvKiBXcml0ZSB0aGUgZ2xvYmFsIGNvbmZpZyByZWcgLSBpbnZlcnQgcmlnaHQgcG93ZXIgYW1wLAorCSAqIERBQyBvbiwgdXNlIDUtdm9sdCBtb2RlCisJICovCisJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEobmV3X2NsaWVudCwgMywgMHg0NSkpCisJCXJldHVybiAtMTsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEobmV3X2NsaWVudCwgMSwgOCk7CisJZGFjYV9jbGllbnQgPSBuZXdfY2xpZW50OworCWRhY2Ffc2V0X3ZvbHVtZSgxNTAwMCwgMTUwMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFjYV9kZXRlY3RfY2xpZW50KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MpCit7CisJY29uc3QgY2hhciAqY2xpZW50X25hbWUgPSAiREFDIDM1NTBBIERpZ2l0YWwgRXF1YWxpemVyIjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlpbnQgcmMgPSAtRU5PREVWOworCisJbmV3X2NsaWVudCA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfY2xpZW50KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQobmV3X2NsaWVudCwgMCwgc2l6ZW9mKCpuZXdfY2xpZW50KSk7CisKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmZGFjYV9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCXN0cmNweShuZXdfY2xpZW50LT5uYW1lLCBjbGllbnRfbmFtZSk7CisKKwlpZiAoZGFjYV9pbml0X2NsaWVudChuZXdfY2xpZW50KSkKKwkJZ290byBiYWlsOworCisJLyogVGVsbCB0aGUgaTJjIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmIChpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkKKwkJZ290byBiYWlsOworCisJcmV0dXJuIDA7CisgYmFpbDoKKwlrZnJlZShuZXdfY2xpZW50KTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBkYWNhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpZiAoY2xpZW50ID09IGRhY2FfY2xpZW50KQorCQlkYWNhX2NsaWVudCA9IE5VTEw7CisKKyAgCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkYWNhX2NsZWFudXAodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZGFjYV9kcml2ZXIpOworfQorCitpbnQgZGFjYV9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJkYWMzNTUwYSBkcml2ZXIgdmVyc2lvbiAlcyAoJXMpXG4iLERBQ0FfVkVSU0lPTixEQUNBX0RBVEUpOworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZGFjYV9kcml2ZXIpOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kLmggYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTJmNTBmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kLmgKQEAgLTAsMCArMSwyNzcgQEAKKyNpZm5kZWYgX2RtYXNvdW5kX2hfCisvKgorICogIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZC5oCisgKgorICoKKyAqICBNaW5vciBudW1iZXJzIGZvciB0aGUgc291bmQgZHJpdmVyLgorICoKKyAqICBVbmZvcnR1bmF0ZWx5IENyZWF0aXZlIGNhbGxlZCB0aGUgY29kZWMgY2hpcCBvZiBTQiBhcyBhIERTUC4gRm9yIHRoaXMKKyAqICByZWFzb24gdGhlIC9kZXYvZHNwIGlzIHJlc2VydmVkIGZvciBkaWdpdGl6ZWQgYXVkaW8gdXNlLiBUaGVyZSBpcyBhCisgKiAgZGV2aWNlIGZvciB0cnVlIERTUCBwcm9jZXNzb3JzIGJ1dCBpdCB3aWxsIGJlIGNhbGxlZCBzb21ldGhpbmcgZWxzZS4KKyAqICBJbiB2My4wIGl0J3MgL2Rldi9zbmRwcm9jIGJ1dCB0aGlzIGNvdWxkIGJlIGEgdGVtcG9yYXJ5IHNvbHV0aW9uLgorICovCisjZGVmaW5lIF9kbWFzb3VuZF9oXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZSBTTkRfTkRFVlMJMjU2CS8qIE51bWJlciBvZiBzdXBwb3J0ZWQgZGV2aWNlcyAqLworI2RlZmluZSBTTkRfREVWX0NUTAkwCS8qIENvbnRyb2wgcG9ydCAvZGV2L21peGVyICovCisjZGVmaW5lIFNORF9ERVZfU0VRCTEJLyogU2VxdWVuY2VyIG91dHB1dCAvZGV2L3NlcXVlbmNlciAoRk0KKwkJCQkgICBzeW50aGVzaXplciBhbmQgTUlESSBvdXRwdXQpICovCisjZGVmaW5lIFNORF9ERVZfTUlESU4JMgkvKiBSYXcgbWlkaSBhY2Nlc3MgKi8KKyNkZWZpbmUgU05EX0RFVl9EU1AJMwkvKiBEaWdpdGl6ZWQgdm9pY2UgL2Rldi9kc3AgKi8KKyNkZWZpbmUgU05EX0RFVl9BVURJTwk0CS8qIFNwYXJjIGNvbXBhdGlibGUgL2Rldi9hdWRpbyAqLworI2RlZmluZSBTTkRfREVWX0RTUDE2CTUJLyogTGlrZSAvZGV2L2RzcCBidXQgMTYgYml0cy9zYW1wbGUgKi8KKyNkZWZpbmUgU05EX0RFVl9TVEFUVVMJNgkvKiAvZGV2L3NuZHN0YXQgKi8KKy8qICM3IG5vdCBpbiB1c2Ugbm93LiBXYXMgaW4gMi40LiBGcmVlIGZvciB1c2UgYWZ0ZXIgdjMuMC4gKi8KKyNkZWZpbmUgU05EX0RFVl9TRVEyCTgJLyogL2Rldi9zZXF1ZW5jZXIsIGxldmVsIDIgaW50ZXJmYWNlICovCisjZGVmaW5lIFNORF9ERVZfU05EUFJPQyA5CS8qIC9kZXYvc25kcHJvYyBmb3IgcHJvZ3JhbW1hYmxlIGRldmljZXMgKi8KKyNkZWZpbmUgU05EX0RFVl9QU1MJU05EX0RFVl9TTkRQUk9DCisKKy8qIHN3aXRjaCBvbiB2YXJpb3VzIHByaW5rcyAqLworI2RlZmluZSBERUJVR19ETUFTT1VORCAxCisKKyNkZWZpbmUgTUFYX0FVRElPX0RFVgk1CisjZGVmaW5lIE1BWF9NSVhFUl9ERVYJNAorI2RlZmluZSBNQVhfU1lOVEhfREVWCTMKKyNkZWZpbmUgTUFYX01JRElfREVWCTYKKyNkZWZpbmUgTUFYX1RJTUVSX0RFVgkzCisKKyNkZWZpbmUgTUFYX0NBVENIX1JBRElVUwkxMAorCisjZGVmaW5lIGxlMmJlMTYoeCkJKCgoeCk8PDggJiAweGZmMDApIHwgKCh4KT4+OCAmIDB4MDBmZikpCisjZGVmaW5lIGxlMmJlMTZkYmwoeCkJKCgoeCk8PDggJiAweGZmMDBmZjAwKSB8ICgoeCk+PjggJiAweDAwZmYwMGZmKSkKKworI2RlZmluZSBJT0NUTF9JTihhcmcsIHJldCkgXAorCWRvIHsgaW50IGVycm9yID0gZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKShhcmcpKTsgXAorCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIElPQ1RMX09VVChhcmcsIHJldCkJaW9jdGxfcmV0dXJuKChpbnQgX191c2VyICopKGFyZyksIHJldCkKKworc3RhdGljIGlubGluZSBpbnQgaW9jdGxfcmV0dXJuKGludCBfX3VzZXIgKmFkZHIsIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gdmFsdWUgPCAwID8gdmFsdWUgOiBwdXRfdXNlcih2YWx1ZSwgYWRkcik7Cit9CisKKworICAgIC8qCisgICAgICogIENvbmZpZ3VyYXRpb24KKyAgICAgKi8KKworI3VuZGVmIEhBU184QklUX1RBQkxFUworI3VuZGVmIEhBU19SRUNPUkQKKworI2lmIGRlZmluZWQoQ09ORklHX0RNQVNPVU5EX0FUQVJJKSB8fCBkZWZpbmVkKENPTkZJR19ETUFTT1VORF9BVEFSSV9NT0RVTEUpIHx8XAorICAgIGRlZmluZWQoQ09ORklHX0RNQVNPVU5EX1BBVUxBKSB8fCBkZWZpbmVkKENPTkZJR19ETUFTT1VORF9QQVVMQV9NT0RVTEUpIHx8XAorICAgIGRlZmluZWQoQ09ORklHX0RNQVNPVU5EX1E0MCkgfHwgZGVmaW5lZChDT05GSUdfRE1BU09VTkRfUTQwX01PRFVMRSkKKyNkZWZpbmUgSEFTXzhCSVRfVEFCTEVTCisjZGVmaW5lIE1JTl9CVUZGRVJTCTQKKyNkZWZpbmUgTUlOX0JVRlNJWkUJKDE8PDEyKQkvKiBpbiBieXRlcyAoLSB3aGVyZSBkb2VzIHRoaXMgY29tZSBmcm9tID8pICovCisjZGVmaW5lIE1JTl9GUkFHX1NJWkUJOAkvKiBub3QgMTAwJSBzdXJlIGFib3V0IHRoaXMgKi8KKyNkZWZpbmUgTUFYX0JVRlNJWkUJKDE8PDE3KQkvKiBMaW1pdCBmb3IgQW1pZ2EgaXMgMTI4IGtiICovCisjZGVmaW5lIE1BWF9GUkFHX1NJWkUJMTUJLyogYWxsb3cgKjQgZm9yIG1vbm8tOCA9PiBzdGVyZW8tMTYgKGZvciBtdWx0aSkgKi8KKworI2Vsc2UgLyogaXMgcG1hYyBhbmQgbXVsdGkgaXMgb2ZmICovCisKKyNkZWZpbmUgTUlOX0JVRkZFUlMJMgorI2RlZmluZSBNSU5fQlVGU0laRQkoMTw8OCkJLyogaW4gYnl0ZXMgKi8KKyNkZWZpbmUgTUlOX0ZSQUdfU0laRQk4CisjZGVmaW5lIE1BWF9CVUZTSVpFCSgxPDwxOCkJLyogdGhpcyBpcyBzb21ld2hhdCBhcmJpdHJhcnkgZm9yIHBtYWMgKi8KKyNkZWZpbmUgTUFYX0ZSQUdfU0laRQkxNgkvKiBuZWVkIHRvIGFsbG93ICo0IGZvciBtb25vLTggPT4gc3RlcmVvLTE2ICovCisjZW5kaWYKKworI2RlZmluZSBERUZBVUxUX05fQlVGRkVSUyA0CisjZGVmaW5lIERFRkFVTFRfQlVGRl9TSVpFICgxPDwxNSkKKworI2lmIGRlZmluZWQoQ09ORklHX0RNQVNPVU5EX1BNQUMpIHx8IGRlZmluZWQoQ09ORklHX0RNQVNPVU5EX1BNQUNfTU9EVUxFKQorI2RlZmluZSBIQVNfUkVDT1JECisjZW5kaWYKKworICAgIC8qCisgICAgICogIEluaXRpYWxpemF0aW9uCisgICAgICovCisKK2V4dGVybiBpbnQgZG1hc291bmRfaW5pdCh2b2lkKTsKKyNpZmRlZiBNT0RVTEUKK2V4dGVybiB2b2lkIGRtYXNvdW5kX2RlaW5pdCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIGRtYXNvdW5kX2RlaW5pdCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBkZXNjcmlwdGlvbiBvZiB0aGUgc2V0LXVwIGFwcGxpZXMgdG8gZWl0aGVyIGhhcmQgb3Igc29mdCBzZXR0aW5ncyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGZvcm1hdDsJCS8qIEFGTVRfKiAqLworICAgIGludCBzdGVyZW87CQkvKiAwID0gbW9ubywgMSA9IHN0ZXJlbyAqLworICAgIGludCBzaXplOwkJLyogOC8xNiBiaXQqLworICAgIGludCBzcGVlZDsJCS8qIHNwZWVkICovCit9IFNFVFRJTkdTOworCisgICAgLyoKKyAgICAgKiAgTWFjaGluZSBkZWZpbml0aW9ucworICAgICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpuYW1lMjsKKyAgICBzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKyAgICB2b2lkICooKmRtYV9hbGxvYykodW5zaWduZWQgaW50LCBpbnQpOworICAgIHZvaWQgKCpkbWFfZnJlZSkodm9pZCAqLCB1bnNpZ25lZCBpbnQpOworICAgIGludCAoKmlycWluaXQpKHZvaWQpOworI2lmZGVmIE1PRFVMRQorICAgIHZvaWQgKCppcnFjbGVhbnVwKSh2b2lkKTsKKyNlbmRpZgorICAgIHZvaWQgKCppbml0KSh2b2lkKTsKKyAgICB2b2lkICgqc2lsZW5jZSkodm9pZCk7CisgICAgaW50ICgqc2V0Rm9ybWF0KShpbnQpOworICAgIGludCAoKnNldFZvbHVtZSkoaW50KTsKKyAgICBpbnQgKCpzZXRCYXNzKShpbnQpOworICAgIGludCAoKnNldFRyZWJsZSkoaW50KTsKKyAgICBpbnQgKCpzZXRHYWluKShpbnQpOworICAgIHZvaWQgKCpwbGF5KSh2b2lkKTsKKyAgICB2b2lkICgqcmVjb3JkKSh2b2lkKTsJCS8qIG9wdGlvbmFsICovCisgICAgdm9pZCAoKm1peGVyX2luaXQpKHZvaWQpOwkJLyogb3B0aW9uYWwgKi8KKyAgICBpbnQgKCptaXhlcl9pb2N0bCkodV9pbnQsIHVfbG9uZyk7CS8qIG9wdGlvbmFsICovCisgICAgaW50ICgqd3JpdGVfc3Ffc2V0dXApKHZvaWQpOwkvKiBvcHRpb25hbCAqLworICAgIGludCAoKnJlYWRfc3Ffc2V0dXApKHZvaWQpOwkJLyogb3B0aW9uYWwgKi8KKyAgICBpbnQgKCpzcV9vcGVuKShtb2RlX3QpOwkJLyogb3B0aW9uYWwgKi8KKyAgICBpbnQgKCpzdGF0ZV9pbmZvKShjaGFyICosIHNpemVfdCk7CS8qIG9wdGlvbmFsICovCisgICAgdm9pZCAoKmFib3J0X3JlYWQpKHZvaWQpOwkJLyogb3B0aW9uYWwgKi8KKyAgICBpbnQgbWluX2RzcF9zcGVlZDsKKyAgICBpbnQgbWF4X2RzcF9zcGVlZDsKKyAgICBpbnQgdmVyc2lvbiA7CisgICAgaW50IGhhcmR3YXJlX2FmbXRzIDsJCS8qIE9TUyBzYXlzIHdlIG9ubHkgcmV0dXJuIGgnd2FyZSBpbmZvICovCisJCQkJCS8qIHdoZW4gcXVlcmllZCB2aWEgU05EQ1RMX0RTUF9HRVRGTVRTICovCisgICAgaW50IGNhcGFiaWxpdGllcyA7CQkvKiBsb3ctbGV2ZWwgcmVwbHkgdG8gU05EQ1RMX0RTUF9HRVRDQVBTICovCisgICAgU0VUVElOR1MgZGVmYXVsdF9oYXJkIDsJLyogb3BlbigpIG9yIGluaXQoKSBzaG91bGQgc2V0IHNvbWV0aGluZyB2YWxpZCAqLworICAgIFNFVFRJTkdTIGRlZmF1bHRfc29mdCA7CS8qIHlvdSBjYW4gbWFrZSBpdCBsb29rIGxpa2Ugb2xkIE9TUywgaWYgeW91IHdhbnQgdG8gKi8KK30gTUFDSElORTsKKworICAgIC8qCisgICAgICogIExvdyBsZXZlbCBzdHVmZgorICAgICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3NpemVfdCAoKmN0X3VsYXcpKGNvbnN0IHVfY2hhciBfX3VzZXIgKiwgc2l6ZV90LCB1X2NoYXIgKiwgc3NpemVfdCAqLCBzc2l6ZV90KTsKKyAgICBzc2l6ZV90ICgqY3RfYWxhdykoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF9zOCkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF91OCkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF9zMTZiZSkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF91MTZiZSkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF9zMTZsZSkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF91MTZsZSkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworfSBUUkFOUzsKKworc3RydWN0IHNvdW5kX3NldHRpbmdzIHsKKyAgICBNQUNISU5FIG1hY2g7CS8qIG1hY2hpbmUgZGVwZW5kZW50IHRoaW5ncyAqLworICAgIFNFVFRJTkdTIGhhcmQ7CS8qIGhhcmR3YXJlIHNldHRpbmdzICovCisgICAgU0VUVElOR1Mgc29mdDsJLyogc29mdHdhcmUgc2V0dGluZ3MgKi8KKyAgICBTRVRUSU5HUyBkc3A7CS8qIC9kZXYvZHNwIGRlZmF1bHQgc2V0dGluZ3MgKi8KKyAgICBUUkFOUyAqdHJhbnNfd3JpdGU7CS8qIHN1cHBvcnRlZCB0cmFuc2xhdGlvbnMgKi8KKyNpZmRlZiBIQVNfUkVDT1JECisgICAgVFJBTlMgKnRyYW5zX3JlYWQ7CS8qIHN1cHBvcnRlZCB0cmFuc2xhdGlvbnMgKi8KKyNlbmRpZgorICAgIGludCB2b2x1bWVfbGVmdDsJLyogdm9sdW1lIChyYW5nZSBpcyBtYWNoaW5lIGRlcGVuZGVudCkgKi8KKyAgICBpbnQgdm9sdW1lX3JpZ2h0OworICAgIGludCBiYXNzOwkJLyogdG9uZSAocmFuZ2UgaXMgbWFjaGluZSBkZXBlbmRlbnQpICovCisgICAgaW50IHRyZWJsZTsKKyAgICBpbnQgZ2FpbjsKKyAgICBpbnQgbWluRGV2OwkJLyogbWlub3IgZGV2aWNlIG51bWJlciBjdXJyZW50bHkgb3BlbiAqLworICAgIHNwaW5sb2NrX3QgbG9jazsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc291bmRfc2V0dGluZ3MgZG1hc291bmQ7CisKKyNpZmRlZiBIQVNfOEJJVF9UQUJMRVMKK2V4dGVybiBjaGFyIGRtYXNvdW5kX3VsYXcyZG1hOFtdOworZXh0ZXJuIGNoYXIgZG1hc291bmRfYWxhdzJkbWE4W107CisjZW5kaWYKKworICAgIC8qCisgICAgICogIE1pZCBsZXZlbCBzdHVmZgorICAgICAqLworCitzdGF0aWMgaW5saW5lIGludCBkbWFzb3VuZF9zZXRfdm9sdW1lKGludCB2b2x1bWUpCit7CisJcmV0dXJuIGRtYXNvdW5kLm1hY2guc2V0Vm9sdW1lKHZvbHVtZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtYXNvdW5kX3NldF9iYXNzKGludCBiYXNzKQoreworCXJldHVybiBkbWFzb3VuZC5tYWNoLnNldEJhc3MgPyBkbWFzb3VuZC5tYWNoLnNldEJhc3MoYmFzcykgOiA1MDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hc291bmRfc2V0X3RyZWJsZShpbnQgdHJlYmxlKQoreworCXJldHVybiBkbWFzb3VuZC5tYWNoLnNldFRyZWJsZSA/IGRtYXNvdW5kLm1hY2guc2V0VHJlYmxlKHRyZWJsZSkgOiA1MDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hc291bmRfc2V0X2dhaW4oaW50IGdhaW4pCit7CisJcmV0dXJuIGRtYXNvdW5kLm1hY2guc2V0R2FpbiA/IGRtYXNvdW5kLm1hY2guc2V0R2FpbihnYWluKSA6IDEwMDsKK30KKworCisgICAgLyoKKyAgICAgKiBTb3VuZCBxdWV1ZSBzdHVmZiwgdGhlIGhlYXJ0IG9mIHRoZSBkcml2ZXIKKyAgICAgKi8KKworc3RydWN0IHNvdW5kX3F1ZXVlIHsKKyAgICAvKiBidWZmZXJzIGFsbG9jYXRlZCBmb3IgdGhpcyBxdWV1ZSAqLworICAgIGludCBudW1CdWZzOwkJLyogcmVhbCBsaW1pdHMgb24gd2hhdCB0aGUgdXNlciBjYW4gaGF2ZSAqLworICAgIGludCBidWZTaXplOwkJLyogaW4gYnl0ZXMgKi8KKyAgICBjaGFyICoqYnVmZmVyczsKKworICAgIC8qIGN1cnJlbnQgcGFyYW1ldGVycyAqLworICAgIGludCBsb2NrZWQgOwkJLyogcGFyYW1zIGNhbm5vdCBiZSBtb2RpZmllZCB3aGVuICE9IDAgKi8KKyAgICBpbnQgdXNlcl9mcmFncyA7CQkvKiB1c2VyIHJlcXVlc3RzIHRoaXMgbWFueSAqLworICAgIGludCB1c2VyX2ZyYWdfc2l6ZSA7CS8qIG9mIHRoaXMgc2l6ZSAqLworICAgIGludCBtYXhfY291bnQ7CQkvKiBhY3R1YWwgIyBmcmFnbWVudHMgPD0gbnVtQnVmcyAqLworICAgIGludCBibG9ja19zaXplOwkJLyogaW50ZXJuYWwgYmxvY2sgc2l6ZSBpbiBieXRlcyAqLworICAgIGludCBtYXhfYWN0aXZlOwkJLyogaW4tdXNlIGZyYWdtZW50cyA8PSBtYXhfY291bnQgKi8KKworICAgIC8qIGl0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgdG8gZGVjbGFyZSBhbnkgb2YgdGhlc2Ugdm9sYXRpbGUgKi8KKyAgICBpbnQgZnJvbnQsIHJlYXIsIGNvdW50OworICAgIGludCByZWFyX3NpemU7CisgICAgLyoKKyAgICAgKglUaGUgdXNlIG9mIHRoZSBwbGF5aW5nIGZpZWxkIGRlcGVuZHMgb24gdGhlIGhhcmR3YXJlCisgICAgICoKKyAgICAgKglBdGFyaSwgUE1hYzogVGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCBhcmUgbG9hZGVkL3BsYXlpbmcKKyAgICAgKgorICAgICAqCUFtaWdhOiBCaXQgMCBpcyBzZXQ6IGEgZnJhbWUgaXMgbG9hZGVkCisgICAgICoJICAgICAgIEJpdCAxIGlzIHNldDogYSBmcmFtZSBpcyBwbGF5aW5nCisgICAgICovCisgICAgaW50IGFjdGl2ZTsKKyAgICB3YWl0X3F1ZXVlX2hlYWRfdCBhY3Rpb25fcXVldWUsIG9wZW5fcXVldWUsIHN5bmNfcXVldWU7CisgICAgaW50IG9wZW5fbW9kZTsKKyAgICBpbnQgYnVzeSwgc3luY2luZywgeHJ1bnMsIGRpZWQ7Cit9OworCisjZGVmaW5lIFNMRUVQKHF1ZXVlKQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZxdWV1ZSwgSFopCisjZGVmaW5lIFdBS0VfVVAocXVldWUpCQkod2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxdWV1ZSkpCisKK2V4dGVybiBzdHJ1Y3Qgc291bmRfcXVldWUgZG1hc291bmRfd3JpdGVfc3E7CisjZGVmaW5lIHdyaXRlX3NxCWRtYXNvdW5kX3dyaXRlX3NxCisKKyNpZmRlZiBIQVNfUkVDT1JECitleHRlcm4gc3RydWN0IHNvdW5kX3F1ZXVlIGRtYXNvdW5kX3JlYWRfc3E7CisjZGVmaW5lIHJlYWRfc3EJCWRtYXNvdW5kX3JlYWRfc3EKKyNlbmRpZgorCitleHRlcm4gaW50IGRtYXNvdW5kX2NhdGNoUmFkaXVzOworI2RlZmluZSBjYXRjaFJhZGl1cwlkbWFzb3VuZF9jYXRjaFJhZGl1cworCisvKiBkZWZpbmUgdGhlIHZhbHVlIHRvIGJlIHB1dCBpbiB0aGUgYnl0ZS1zd2FwIHJlZyBpbiBtYWMtaW8KKyAgIHdoZW4gd2Ugd2FudCBpdCB0byBzd2FwIGZvciB1cy4KKyovCisjZGVmaW5lIEJTX1ZBTCAxCisKKyNkZWZpbmUgU1dfSU5QVVRfVk9MVU1FX1NDQUxFCTQKKyNkZWZpbmUgU1dfSU5QVVRfVk9MVU1FX0RFRkFVTFQJKDEyOCAvIFNXX0lOUFVUX1ZPTFVNRV9TQ0FMRSkKKworZXh0ZXJuIGludCBleHBhbmRfYmFsOwkvKiBCYWxhbmNlIGZhY3RvciBmb3IgZXhwYW5kaW5nIChub3Qgdm9sdW1lISkgKi8KK2V4dGVybiBpbnQgZXhwYW5kX3JlYWRfYmFsOwkvKiBCYWxhbmNlIGZhY3RvciBmb3IgcmVhZGluZyAqLworZXh0ZXJuIHVpbnQgc29mdHdhcmVfaW5wdXRfdm9sdW1lOyAvKiBzb2Z0d2FyZSBpbXBsZW1lbnRlZCByZWNvcmRpbmcgdm9sdW1lISAqLworCisjZW5kaWYgLyogX2RtYXNvdW5kX2hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXRhcmkuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hdGFyaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYWFmODcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXRhcmkuYwpAQCAtMCwwICsxLDE2MDAgQEAKKy8qCisgKiAgbGludXgvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F0YXJpLmMKKyAqCisgKiAgQXRhcmkgVFQgYW5kIEZhbGNvbiBETUEgU291bmQgRHJpdmVyCisgKgorICogIFNlZSBsaW51eC9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfY29yZS5jIGZvciBjb3B5cmlnaHQgYW5kIGNyZWRpdHMKKyAqICBwcmlvciB0byAyOC8wMS8yMDAxCisgKgorICogIDI4LzAxLzIwMDEgWzAuMV0gSWFpbiBTYW5kb2UKKyAqCQkgICAgIC0gYWRkZWQgdmVyc2lvbmluZworICoJCSAgICAgLSBwdXQgaW4gYW5kIHBvcHVsYXRlZCB0aGUgaGFyZHdhcmVfYWZtdHMgZmllbGQuCisgKiAgICAgICAgICAgICBbMC4yXSAtIHB1dCBpbiBTTkRDVExfRFNQX0dFVENBUFMgdmFsdWUuCisgKiAgMDEvMDIvMjAwMSBbMC4zXSAtIHB1dCBpbiBkZWZhdWx0IGhhcmQvc29mdCBzZXR0aW5ncy4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpX3N0cmFtLmg+CisKKyNpbmNsdWRlICJkbWFzb3VuZC5oIgorCisjZGVmaW5lIERNQVNPVU5EX0FUQVJJX1JFVklTSU9OIDAKKyNkZWZpbmUgRE1BU09VTkRfQVRBUklfRURJVElPTiAzCisKK2V4dGVybiB2b2lkIGF0YXJpX21pY3Jvd2lyZV9jbWQoaW50IGNtZCk7CisKK3N0YXRpYyBpbnQgaXNfZmFsY29uOworc3RhdGljIGludCB3cml0ZV9zcV9pZ25vcmVfaW50OwkvKiArK1RlU2NoZTogdXNlZCBmb3IgRmFsY29uICovCisKK3N0YXRpYyBpbnQgZXhwYW5kX2JhbDsJLyogQmFsYW5jZSBmYWN0b3IgZm9yIGV4cGFuZGluZyAobm90IHZvbHVtZSEpICovCitzdGF0aWMgaW50IGV4cGFuZF9kYXRhOwkvKiBEYXRhIGZvciBleHBhbmRpbmcgKi8KKworCisvKioqIFRyYW5zbGF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogKytUZVNjaGU6IHJhZGljYWxseSBjaGFuZ2VkIGZvciBuZXcgZXhwYW5kaW5nIHB1cnBvc2VzLi4uCisgKgorICogVGhlc2UgdHdvIHJvdXRpbmVzIG5vdyBkZWFsIHdpdGggY29weWluZy9leHBhbmRpbmcvdHJhbnNsYXRpbmcgdGhlIHNhbXBsZXMKKyAqIGZyb20gdXNlciBzcGFjZSBpbnRvIG91ciBidWZmZXIgYXQgdGhlIHJpZ2h0IGZyZXF1ZW5jeS4gVGhleSB0YWtlIGNhcmUgYWJvdXQKKyAqIGhvdyBtdWNoIGRhdGEgdGhlcmUncyBhY3R1YWxseSB0byByZWFkLCBob3cgbXVjaCBidWZmZXIgc3BhY2UgdGhlcmUgaXMgYW5kCisgKiB0byBjb252ZXJ0IHNhbXBsZXMgaW50byB0aGUgcmlnaHQgZnJlcXVlbmN5L2VuY29kaW5nLiBUaGV5IHdpbGwgb25seSB3b3JrIG9uCisgKiBjb21wbGV0ZSBzYW1wbGVzIHNvIGl0IG1heSBoYXBwZW4gdGhleSBsZWF2ZSBzb21lIGJ5dGVzIGluIHRoZSBpbnB1dCBzdHJlYW0KKyAqIGlmIHRoZSB1c2VyIGRpZG4ndCB3cml0ZSBhIG11bHRpcGxlIG9mIHRoZSBjdXJyZW50IHNhbXBsZSBzaXplLiBUaGV5IGJvdGgKKyAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZXkndmUgdXNlZCBmcm9tIGJvdGggc3RyZWFtcyBzbyB5b3UgbWF5IGRldGVjdAorICogc3VjaCBhIHNpdHVhdGlvbi4gTHVja2lseSBhbGwgcHJvZ3JhbXMgc2hvdWxkIGJlIGFibGUgdG8gY29wZSB3aXRoIHRoYXQuCisgKgorICogSSB0aGluayBJJ3ZlIG9wdGltaXplZCBhbnl0aGluZyBhcyBmYXIgYXMgb25lIGNhbiBkbyBpbiBwbGFpbiBDLCBhbGwKKyAqIHZhcmlhYmxlcyBzaG91bGQgZml0IGluIHJlZ2lzdGVycyBhbmQgdGhlIGxvb3BzIGFyZSByZWFsbHkgc2hvcnQuIFRoZXJlJ3MKKyAqIG9uZSBsb29wIGZvciBldmVyeSBwb3NzaWJsZSBzaXR1YXRpb24uIFdyaXRpbmcgYSBtb3JlIGdlbmVyYWxpemVkIGFuZCB0aHVzCisgKiBwYXJhbWV0ZXJpemVkIGxvb3Agd291bGQgb25seSBwcm9kdWNlIHNsb3dlciBjb2RlLiBGZWVsIGZyZWUgdG8gb3B0aW1pemUKKyAqIHRoaXMgaW4gYXNzZW1ibGVyIGlmIHlvdSBsaWtlLiA6KQorICoKKyAqIEkgdGhpbmsgdGhlc2Ugcm91dGluZXMgYmVsb25nIGhlcmUgYmVjYXVzZSB0aGV5J3JlIG5vdCB5ZXQgcmVhbGx5IGhhcmR3YXJlCisgKiBpbmRlcGVuZGVudCwgZXNwZWNpYWxseSB0aGUgZmFjdCB0aGF0IHRoZSBGYWxjb24gY2FuIHBsYXkgMTZiaXQgc2FtcGxlcworICogb25seSBpbiBzdGVyZW8gaXMgaGFyZGNvZGVkIGluIGJvdGggb2YgdGhlbSEKKyAqCisgKiArK2dlZXJ0OiBzcGxpdCBpbiBldmVuIG1vcmUgZnVuY3Rpb25zIChvbmUgcGVyIGZvcm1hdCkKKyAqLworCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgYXRhX2N0X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91OChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBhdGFfY3RfczE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgYXRhX2N0X3UxNmJlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF9zMTZsZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBhdGFfY3RfdTE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgYXRhX2N0eF9sYXcoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3U4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zMTZiZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3MxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgYXRhX2N0eF91MTZsZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKKworCisvKioqIExvdyBsZXZlbCBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQgKkF0YUFsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MpOworc3RhdGljIHZvaWQgQXRhRnJlZSh2b2lkICosIHVuc2lnbmVkIGludCBzaXplKTsKK3N0YXRpYyBpbnQgQXRhSXJxSW5pdCh2b2lkKTsKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyB2b2lkIEF0YUlycUNsZWFuVXAodm9pZCk7CisjZW5kaWYgLyogTU9EVUxFICovCitzdGF0aWMgaW50IEF0YVNldEJhc3MoaW50IGJhc3MpOworc3RhdGljIGludCBBdGFTZXRUcmVibGUoaW50IHRyZWJsZSk7CitzdGF0aWMgdm9pZCBUVFNpbGVuY2Uodm9pZCk7CitzdGF0aWMgdm9pZCBUVEluaXQodm9pZCk7CitzdGF0aWMgaW50IFRUU2V0Rm9ybWF0KGludCBmb3JtYXQpOworc3RhdGljIGludCBUVFNldFZvbHVtZShpbnQgdm9sdW1lKTsKK3N0YXRpYyBpbnQgVFRTZXRHYWluKGludCBnYWluKTsKK3N0YXRpYyB2b2lkIEZhbGNvblNpbGVuY2Uodm9pZCk7CitzdGF0aWMgdm9pZCBGYWxjb25Jbml0KHZvaWQpOworc3RhdGljIGludCBGYWxjb25TZXRGb3JtYXQoaW50IGZvcm1hdCk7CitzdGF0aWMgaW50IEZhbGNvblNldFZvbHVtZShpbnQgdm9sdW1lKTsKK3N0YXRpYyB2b2lkIEF0YVBsYXlOZXh0RnJhbWUoaW50IGluZGV4KTsKK3N0YXRpYyB2b2lkIEF0YVBsYXkodm9pZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgQXRhSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApOworCisvKioqIE1pZCBsZXZlbCBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIFRUTWl4ZXJJbml0KHZvaWQpOworc3RhdGljIHZvaWQgRmFsY29uTWl4ZXJJbml0KHZvaWQpOworc3RhdGljIGludCBBdGFNaXhlcklvY3RsKHVfaW50IGNtZCwgdV9sb25nIGFyZyk7CitzdGF0aWMgaW50IFRUTWl4ZXJJb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpOworc3RhdGljIGludCBGYWxjb25NaXhlcklvY3RsKHVfaW50IGNtZCwgdV9sb25nIGFyZyk7CitzdGF0aWMgaW50IEF0YVdyaXRlU3FTZXR1cCh2b2lkKTsKK3N0YXRpYyBpbnQgQXRhU3FPcGVuKG1vZGVfdCBtb2RlKTsKK3N0YXRpYyBpbnQgVFRTdGF0ZUluZm8oY2hhciAqYnVmZmVyLCBzaXplX3Qgc3BhY2UpOworc3RhdGljIGludCBGYWxjb25TdGF0ZUluZm8oY2hhciAqYnVmZmVyLCBzaXplX3Qgc3BhY2UpOworCisKKy8qKiogVHJhbnNsYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJY2hhciAqdGFibGUgPSBkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9PSBBRk1UX01VX0xBVyA/IGRtYXNvdW5kX3VsYXcyZG1hOAorCQkJCQkJCSAgOiBkbWFzb3VuZF9hbGF3MmRtYTg7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwl1X2NoYXIgKnAgPSAmZnJhbWVbKmZyYW1lVXNlZF07CisKKwljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKKwlpZiAoZG1hc291bmQuc29mdC5zdGVyZW8pCisJCWNvdW50ICY9IH4xOworCXVzZWQgPSBjb3VudDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXVfY2hhciBkYXRhOworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXNlclB0cisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQkqcCsrID0gdGFibGVbZGF0YV07CisJCWNvdW50LS07CisJfQorCSpmcmFtZVVzZWQgKz0gdXNlZDsKKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwl2b2lkICpwID0gJmZyYW1lWypmcmFtZVVzZWRdOworCisJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk7CisJaWYgKGRtYXNvdW5kLnNvZnQuc3RlcmVvKQorCQljb3VudCAmPSB+MTsKKwl1c2VkID0gY291bnQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKHAsIHVzZXJQdHIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJKmZyYW1lVXNlZCArPSB1c2VkOworCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91OChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90IGNvdW50LCB1c2VkOworCisJaWYgKCFkbWFzb3VuZC5zb2Z0LnN0ZXJlbykgeworCQl1X2NoYXIgKnAgPSAmZnJhbWVbKmZyYW1lVXNlZF07CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCQl1c2VkID0gY291bnQ7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCXVfY2hhciBkYXRhOworCQkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkqcCsrID0gZGF0YSBeIDB4ODA7CisJCQljb3VudC0tOworCQl9CisJfSBlbHNlIHsKKwkJdV9zaG9ydCAqcCA9ICh1X3Nob3J0ICopJmZyYW1lWypmcmFtZVVzZWRdOworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KT4+MTsKKwkJdXNlZCA9IGNvdW50KjI7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCXVfc2hvcnQgZGF0YTsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCSpwKysgPSBkYXRhIF4gMHg4MDgwOworCQkJY291bnQtLTsKKwkJfQorCX0KKwkqZnJhbWVVc2VkICs9IHVzZWQ7CisJcmV0dXJuIHVzZWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgYXRhX2N0X3MxNmJlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNzaXplX3QgY291bnQsIHVzZWQ7CisKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CisJCXVfc2hvcnQgKnAgPSAodV9zaG9ydCAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk+PjE7CisJCXVzZWQgPSBjb3VudCoyOworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQl1X3Nob3J0IGRhdGE7CisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkqcCsrID0gZGF0YTsKKwkJCSpwKysgPSBkYXRhOworCQkJY291bnQtLTsKKwkJfQorCQkqZnJhbWVVc2VkICs9IHVzZWQqMjsKKwl9IGVsc2UgeworCQl2b2lkICpwID0gKHVfc2hvcnQgKikmZnJhbWVbKmZyYW1lVXNlZF07CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpICYgfjM7CisJCXVzZWQgPSBjb3VudDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHAsIHVzZXJQdHIsIGNvdW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQkqZnJhbWVVc2VkICs9IHVzZWQ7CisJfQorCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91MTZiZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90IGNvdW50LCB1c2VkOworCisJaWYgKCFkbWFzb3VuZC5zb2Z0LnN0ZXJlbykgeworCQl1X3Nob3J0ICpwID0gKHVfc2hvcnQgKikmZnJhbWVbKmZyYW1lVXNlZF07CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpPj4xOworCQl1c2VkID0gY291bnQqMjsKKwkJd2hpbGUgKGNvdW50ID4gMCkgeworCQkJdV9zaG9ydCBkYXRhOworCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZGF0YSBePSAweDgwMDA7CisJCQkqcCsrID0gZGF0YTsKKwkJCSpwKysgPSBkYXRhOworCQkJY291bnQtLTsKKwkJfQorCQkqZnJhbWVVc2VkICs9IHVzZWQqMjsKKwl9IGVsc2UgeworCQl1X2xvbmcgKnAgPSAodV9sb25nICopJmZyYW1lWypmcmFtZVVzZWRdOworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KT4+MjsKKwkJdXNlZCA9IGNvdW50KjQ7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCXVfbG9uZyBkYXRhOworCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCSpwKysgPSBkYXRhIF4gMHg4MDAwODAwMDsKKwkJCWNvdW50LS07CisJCX0KKwkJKmZyYW1lVXNlZCArPSB1c2VkOworCX0KKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfczE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKworCWNvdW50ID0gZnJhbWVMZWZ0OworCWlmICghZG1hc291bmQuc29mdC5zdGVyZW8pIHsKKwkJdV9zaG9ydCAqcCA9ICh1X3Nob3J0ICopJmZyYW1lWypmcmFtZVVzZWRdOworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KT4+MTsKKwkJdXNlZCA9IGNvdW50KjI7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCXVfc2hvcnQgZGF0YTsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSBsZTJiZTE2KGRhdGEpOworCQkJKnArKyA9IGRhdGE7CisJCQkqcCsrID0gZGF0YTsKKwkJCWNvdW50LS07CisJCX0KKwkJKmZyYW1lVXNlZCArPSB1c2VkKjI7CisJfSBlbHNlIHsKKwkJdV9sb25nICpwID0gKHVfbG9uZyAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk+PjI7CisJCXVzZWQgPSBjb3VudCo0OworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQl1X2xvbmcgZGF0YTsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfaW50ICopdXNlclB0cikrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkYXRhID0gbGUyYmUxNmRibChkYXRhKTsKKwkJCSpwKysgPSBkYXRhOworCQkJY291bnQtLTsKKwkJfQorCQkqZnJhbWVVc2VkICs9IHVzZWQ7CisJfQorCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91MTZsZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90IGNvdW50LCB1c2VkOworCisJY291bnQgPSBmcmFtZUxlZnQ7CisJaWYgKCFkbWFzb3VuZC5zb2Z0LnN0ZXJlbykgeworCQl1X3Nob3J0ICpwID0gKHVfc2hvcnQgKikmZnJhbWVbKmZyYW1lVXNlZF07CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpPj4xOworCQl1c2VkID0gY291bnQqMjsKKwkJd2hpbGUgKGNvdW50ID4gMCkgeworCQkJdV9zaG9ydCBkYXRhOworCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZGF0YSA9IGxlMmJlMTYoZGF0YSkgXiAweDgwMDA7CisJCQkqcCsrID0gZGF0YTsKKwkJCSpwKysgPSBkYXRhOworCQl9CisJCSpmcmFtZVVzZWQgKz0gdXNlZCoyOworCX0gZWxzZSB7CisJCXVfbG9uZyAqcCA9ICh1X2xvbmcgKikmZnJhbWVbKmZyYW1lVXNlZF07CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpPj4yOworCQl1c2VkID0gY291bnQ7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCXVfbG9uZyBkYXRhOworCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSBsZTJiZTE2ZGJsKGRhdGEpIF4gMHg4MDAwODAwMDsKKwkJCSpwKysgPSBkYXRhOworCQkJY291bnQtLTsKKwkJfQorCQkqZnJhbWVVc2VkICs9IHVzZWQ7CisJfQorCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwljaGFyICp0YWJsZSA9IGRtYXNvdW5kLnNvZnQuZm9ybWF0ID09IEFGTVRfTVVfTEFXID8gZG1hc291bmRfdWxhdzJkbWE4CisJCQkJCQkJICA6IGRtYXNvdW5kX2FsYXcyZG1hODsKKwkvKiB0aGlzIHNob3VsZCBoZWxwIGdjYyB0byBzdHVmZiBldmVyeXRoaW5nIGludG8gcmVnaXN0ZXJzICovCisJbG9uZyBiYWwgPSBleHBhbmRfYmFsOworCWxvbmcgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlzc2l6ZV90IHVzZWQsIHVzZWRmOworCisJdXNlZCA9IHVzZXJDb3VudDsKKwl1c2VkZiA9IGZyYW1lTGVmdDsKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CisJCXVfY2hhciAqcCA9ICZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9jaGFyIGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCkgeworCQkJdV9jaGFyIGM7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICghdXNlckNvdW50KQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IHRhYmxlW2NdOworCQkJCXVzZXJDb3VudC0tOworCQkJCWJhbCArPSBoU3BlZWQ7CisJCQl9CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdC0tOworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfSBlbHNlIHsKKwkJdV9zaG9ydCAqcCA9ICh1X3Nob3J0ICopJmZyYW1lWypmcmFtZVVzZWRdOworCQl1X3Nob3J0IGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCA+PSAyKSB7CisJCQl1X2NoYXIgYzsKKwkJCWlmIChiYWwgPCAwKSB7CisJCQkJaWYgKHVzZXJDb3VudCA8IDIpCisJCQkJCWJyZWFrOworCQkJCWlmIChnZXRfdXNlcihjLCB1c2VyUHRyKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhID0gdGFibGVbY10gPDwgODsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSB8PSB0YWJsZVtjXTsKKwkJCQl1c2VyQ291bnQgLT0gMjsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQgLT0gMjsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCXVzZWQgLT0gdXNlckNvdW50OworCSpmcmFtZVVzZWQgKz0gdXNlZGYtZnJhbWVMZWZ0OworCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwkvKiB0aGlzIHNob3VsZCBoZWxwIGdjYyB0byBzdHVmZiBldmVyeXRoaW5nIGludG8gcmVnaXN0ZXJzICovCisJbG9uZyBiYWwgPSBleHBhbmRfYmFsOworCWxvbmcgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlzc2l6ZV90IHVzZWQsIHVzZWRmOworCisJdXNlZCA9IHVzZXJDb3VudDsKKwl1c2VkZiA9IGZyYW1lTGVmdDsKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CisJCXVfY2hhciAqcCA9ICZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9jaGFyIGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCkgeworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAoIXVzZXJDb3VudCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXVzZXJDb3VudC0tOworCQkJCWJhbCArPSBoU3BlZWQ7CisJCQl9CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdC0tOworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfSBlbHNlIHsKKwkJdV9zaG9ydCAqcCA9ICh1X3Nob3J0ICopJmZyYW1lWypmcmFtZVVzZWRdOworCQl1X3Nob3J0IGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCA+PSAyKSB7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICh1c2VyQ291bnQgPCAyKQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXVzZXJDb3VudCAtPSAyOworCQkJCWJhbCArPSBoU3BlZWQ7CisJCQl9CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdCAtPSAyOworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfQorCWV4cGFuZF9iYWwgPSBiYWw7CisJdXNlZCAtPSB1c2VyQ291bnQ7CisJKmZyYW1lVXNlZCArPSB1c2VkZi1mcmFtZUxlZnQ7CisJcmV0dXJuIHVzZWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgYXRhX2N0eF91OChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCS8qIHRoaXMgc2hvdWxkIGhlbHAgZ2NjIHRvIHN0dWZmIGV2ZXJ5dGhpbmcgaW50byByZWdpc3RlcnMgKi8KKwlsb25nIGJhbCA9IGV4cGFuZF9iYWw7CisJbG9uZyBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCXNzaXplX3QgdXNlZCwgdXNlZGY7CisKKwl1c2VkID0gdXNlckNvdW50OworCXVzZWRmID0gZnJhbWVMZWZ0OworCWlmICghZG1hc291bmQuc29mdC5zdGVyZW8pIHsKKwkJdV9jaGFyICpwID0gJmZyYW1lWypmcmFtZVVzZWRdOworCQl1X2NoYXIgZGF0YSA9IGV4cGFuZF9kYXRhOworCQl3aGlsZSAoZnJhbWVMZWZ0KSB7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICghdXNlckNvdW50KQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXNlclB0cisrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSBePSAweDgwOworCQkJCXVzZXJDb3VudC0tOworCQkJCWJhbCArPSBoU3BlZWQ7CisJCQl9CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdC0tOworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfSBlbHNlIHsKKwkJdV9zaG9ydCAqcCA9ICh1X3Nob3J0ICopJmZyYW1lWypmcmFtZVVzZWRdOworCQl1X3Nob3J0IGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCA+PSAyKSB7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICh1c2VyQ291bnQgPCAyKQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgXj0gMHg4MDgwOworCQkJCXVzZXJDb3VudCAtPSAyOworCQkJCWJhbCArPSBoU3BlZWQ7CisJCQl9CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdCAtPSAyOworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfQorCWV4cGFuZF9iYWwgPSBiYWw7CisJdXNlZCAtPSB1c2VyQ291bnQ7CisJKmZyYW1lVXNlZCArPSB1c2VkZi1mcmFtZUxlZnQ7CisJcmV0dXJuIHVzZWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zMTZiZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCS8qIHRoaXMgc2hvdWxkIGhlbHAgZ2NjIHRvIHN0dWZmIGV2ZXJ5dGhpbmcgaW50byByZWdpc3RlcnMgKi8KKwlsb25nIGJhbCA9IGV4cGFuZF9iYWw7CisJbG9uZyBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCXNzaXplX3QgdXNlZCwgdXNlZGY7CisKKwl1c2VkID0gdXNlckNvdW50OworCXVzZWRmID0gZnJhbWVMZWZ0OworCWlmICghZG1hc291bmQuc29mdC5zdGVyZW8pIHsKKwkJdV9zaG9ydCAqcCA9ICh1X3Nob3J0ICopJmZyYW1lWypmcmFtZVVzZWRdOworCQl1X3Nob3J0IGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCA+PSA0KSB7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICh1c2VyQ291bnQgPCAyKQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXVzZXJDb3VudCAtPSAyOworCQkJCWJhbCArPSBoU3BlZWQ7CisJCQl9CisJCQkqcCsrID0gZGF0YTsKKwkJCSpwKysgPSBkYXRhOworCQkJZnJhbWVMZWZ0IC09IDQ7CisJCQliYWwgLT0gc1NwZWVkOworCQl9CisJCWV4cGFuZF9kYXRhID0gZGF0YTsKKwl9IGVsc2UgeworCQl1X2xvbmcgKnAgPSAodV9sb25nICopJmZyYW1lWypmcmFtZVVzZWRdOworCQl1X2xvbmcgZGF0YSA9IGV4cGFuZF9kYXRhOworCQl3aGlsZSAoZnJhbWVMZWZ0ID49IDQpIHsKKwkJCWlmIChiYWwgPCAwKSB7CisJCQkJaWYgKHVzZXJDb3VudCA8IDQpCisJCQkJCWJyZWFrOworCQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfaW50ICopdXNlclB0cikrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXVzZXJDb3VudCAtPSA0OworCQkJCWJhbCArPSBoU3BlZWQ7CisJCQl9CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdCAtPSA0OworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfQorCWV4cGFuZF9iYWwgPSBiYWw7CisJdXNlZCAtPSB1c2VyQ291bnQ7CisJKmZyYW1lVXNlZCArPSB1c2VkZi1mcmFtZUxlZnQ7CisJcmV0dXJuIHVzZWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgYXRhX2N0eF91MTZiZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCS8qIHRoaXMgc2hvdWxkIGhlbHAgZ2NjIHRvIHN0dWZmIGV2ZXJ5dGhpbmcgaW50byByZWdpc3RlcnMgKi8KKwlsb25nIGJhbCA9IGV4cGFuZF9iYWw7CisJbG9uZyBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCXNzaXplX3QgdXNlZCwgdXNlZGY7CisKKwl1c2VkID0gdXNlckNvdW50OworCXVzZWRmID0gZnJhbWVMZWZ0OworCWlmICghZG1hc291bmQuc29mdC5zdGVyZW8pIHsKKwkJdV9zaG9ydCAqcCA9ICh1X3Nob3J0ICopJmZyYW1lWypmcmFtZVVzZWRdOworCQl1X3Nob3J0IGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCA+PSA0KSB7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICh1c2VyQ291bnQgPCAyKQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgXj0gMHg4MDAwOworCQkJCXVzZXJDb3VudCAtPSAyOworCQkJCWJhbCArPSBoU3BlZWQ7CisJCQl9CisJCQkqcCsrID0gZGF0YTsKKwkJCSpwKysgPSBkYXRhOworCQkJZnJhbWVMZWZ0IC09IDQ7CisJCQliYWwgLT0gc1NwZWVkOworCQl9CisJCWV4cGFuZF9kYXRhID0gZGF0YTsKKwl9IGVsc2UgeworCQl1X2xvbmcgKnAgPSAodV9sb25nICopJmZyYW1lWypmcmFtZVVzZWRdOworCQl1X2xvbmcgZGF0YSA9IGV4cGFuZF9kYXRhOworCQl3aGlsZSAoZnJhbWVMZWZ0ID49IDQpIHsKKwkJCWlmIChiYWwgPCAwKSB7CisJCQkJaWYgKHVzZXJDb3VudCA8IDQpCisJCQkJCWJyZWFrOworCQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfaW50ICopdXNlclB0cikrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgXj0gMHg4MDAwODAwMDsKKwkJCQl1c2VyQ291bnQgLT0gNDsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQgLT0gNDsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCXVzZWQgLT0gdXNlckNvdW50OworCSpmcmFtZVVzZWQgKz0gdXNlZGYtZnJhbWVMZWZ0OworCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwkvKiB0aGlzIHNob3VsZCBoZWxwIGdjYyB0byBzdHVmZiBldmVyeXRoaW5nIGludG8gcmVnaXN0ZXJzICovCisJbG9uZyBiYWwgPSBleHBhbmRfYmFsOworCWxvbmcgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlzc2l6ZV90IHVzZWQsIHVzZWRmOworCisJdXNlZCA9IHVzZXJDb3VudDsKKwl1c2VkZiA9IGZyYW1lTGVmdDsKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CisJCXVfc2hvcnQgKnAgPSAodV9zaG9ydCAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9zaG9ydCBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQgPj0gNCkgeworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAodXNlckNvdW50IDwgMikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhID0gbGUyYmUxNihkYXRhKTsKKwkJCQl1c2VyQ291bnQgLT0gMjsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdCAtPSA0OworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfSBlbHNlIHsKKwkJdV9sb25nICpwID0gKHVfbG9uZyAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9sb25nIGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCA+PSA0KSB7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICh1c2VyQ291bnQgPCA0KQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X2ludCAqKXVzZXJQdHIpKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhID0gbGUyYmUxNmRibChkYXRhKTsKKwkJCQl1c2VyQ291bnQgLT0gNDsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQgLT0gNDsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCXVzZWQgLT0gdXNlckNvdW50OworCSpmcmFtZVVzZWQgKz0gdXNlZGYtZnJhbWVMZWZ0OworCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwkvKiB0aGlzIHNob3VsZCBoZWxwIGdjYyB0byBzdHVmZiBldmVyeXRoaW5nIGludG8gcmVnaXN0ZXJzICovCisJbG9uZyBiYWwgPSBleHBhbmRfYmFsOworCWxvbmcgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlzc2l6ZV90IHVzZWQsIHVzZWRmOworCisJdXNlZCA9IHVzZXJDb3VudDsKKwl1c2VkZiA9IGZyYW1lTGVmdDsKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CisJCXVfc2hvcnQgKnAgPSAodV9zaG9ydCAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9zaG9ydCBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQgPj0gNCkgeworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAodXNlckNvdW50IDwgMikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhID0gbGUyYmUxNihkYXRhKSBeIDB4ODAwMDsKKwkJCQl1c2VyQ291bnQgLT0gMjsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdCAtPSA0OworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfSBlbHNlIHsKKwkJdV9sb25nICpwID0gKHVfbG9uZyAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9sb25nIGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCA+PSA0KSB7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICh1c2VyQ291bnQgPCA0KQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X2ludCAqKXVzZXJQdHIpKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhID0gbGUyYmUxNmRibChkYXRhKSBeIDB4ODAwMDgwMDA7CisJCQkJdXNlckNvdW50IC09IDQ7CisJCQkJYmFsICs9IGhTcGVlZDsKKwkJCX0KKwkJCSpwKysgPSBkYXRhOworCQkJZnJhbWVMZWZ0IC09IDQ7CisJCQliYWwgLT0gc1NwZWVkOworCQl9CisJCWV4cGFuZF9kYXRhID0gZGF0YTsKKwl9CisJZXhwYW5kX2JhbCA9IGJhbDsKKwl1c2VkIC09IHVzZXJDb3VudDsKKwkqZnJhbWVVc2VkICs9IHVzZWRmLWZyYW1lTGVmdDsKKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgVFJBTlMgdHJhbnNUVE5vcm1hbCA9IHsKKwkuY3RfdWxhdwk9IGF0YV9jdF9sYXcsCisJLmN0X2FsYXcJPSBhdGFfY3RfbGF3LAorCS5jdF9zOAkJPSBhdGFfY3RfczgsCisJLmN0X3U4CQk9IGF0YV9jdF91OCwKK307CisKK3N0YXRpYyBUUkFOUyB0cmFuc1RURXhwYW5kaW5nID0geworCS5jdF91bGF3CT0gYXRhX2N0eF9sYXcsCisJLmN0X2FsYXcJPSBhdGFfY3R4X2xhdywKKwkuY3RfczgJCT0gYXRhX2N0eF9zOCwKKwkuY3RfdTgJCT0gYXRhX2N0eF91OCwKK307CisKK3N0YXRpYyBUUkFOUyB0cmFuc0ZhbGNvbk5vcm1hbCA9IHsKKwkuY3RfdWxhdwk9IGF0YV9jdF9sYXcsCisJLmN0X2FsYXcJPSBhdGFfY3RfbGF3LAorCS5jdF9zOAkJPSBhdGFfY3RfczgsCisJLmN0X3U4CQk9IGF0YV9jdF91OCwKKwkuY3RfczE2YmUJPSBhdGFfY3RfczE2YmUsCisJLmN0X3UxNmJlCT0gYXRhX2N0X3UxNmJlLAorCS5jdF9zMTZsZQk9IGF0YV9jdF9zMTZsZSwKKwkuY3RfdTE2bGUJPSBhdGFfY3RfdTE2bGUKK307CisKK3N0YXRpYyBUUkFOUyB0cmFuc0ZhbGNvbkV4cGFuZGluZyA9IHsKKwkuY3RfdWxhdwk9IGF0YV9jdHhfbGF3LAorCS5jdF9hbGF3CT0gYXRhX2N0eF9sYXcsCisJLmN0X3M4CQk9IGF0YV9jdHhfczgsCisJLmN0X3U4CQk9IGF0YV9jdHhfdTgsCisJLmN0X3MxNmJlCT0gYXRhX2N0eF9zMTZiZSwKKwkuY3RfdTE2YmUJPSBhdGFfY3R4X3UxNmJlLAorCS5jdF9zMTZsZQk9IGF0YV9jdHhfczE2bGUsCisJLmN0X3UxNmxlCT0gYXRhX2N0eF91MTZsZSwKK307CisKKworLyoqKiBMb3cgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyoKKyAqIEF0YXJpIChUVC9GYWxjb24pCisgKi8KKworc3RhdGljIHZvaWQgKkF0YUFsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGF0YXJpX3N0cmFtX2FsbG9jKHNpemUsICJkbWFzb3VuZCIpOworfQorCitzdGF0aWMgdm9pZCBBdGFGcmVlKHZvaWQgKm9iaiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJYXRhcmlfc3RyYW1fZnJlZSggb2JqICk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IEF0YUlycUluaXQodm9pZCkKK3sKKwkvKiBTZXQgdXAgdGltZXIgQS4gVGltZXIgQQorCSAgIHdpbGwgcmVjZWl2ZSBhIHNpZ25hbCB1cG9uIGVuZCBvZiBwbGF5aW5nIGZyb20gdGhlIHNvdW5kCisJICAgaGFyZHdhcmUuIEZ1cnRoZXJtb3JlIFRpbWVyIEEgaXMgYWJsZSB0byBjb3VudCBldmVudHMKKwkgICBhbmQgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQgYWZ0ZXIgYSBwcm9ncmFtbWVkIG51bWJlcgorCSAgIG9mIGV2ZW50cy4gU28gYWxsIHdlIG5lZWQgdG8ga2VlcCB0aGUgbXVzaWMgcGxheWluZyBpcworCSAgIHRvIHByb3ZpZGUgdGhlIHNvdW5kIGhhcmR3YXJlIHdpdGggbmV3IGRhdGEgdXBvbgorCSAgIGFuIGludGVycnVwdCBmcm9tIHRpbWVyIEEuICovCisJbWZwLnRpbV9jdF9hID0gMDsJLyogKytyb21hbjogU3RvcCB0aW1lciBiZWZvcmUgcHJvZ3JhbW1pbmchICovCisJbWZwLnRpbV9kdF9hID0gMTsJLyogQ2F1c2UgaW50ZXJydXB0IGFmdGVyIGZpcnN0IGV2ZW50LiAqLworCW1mcC50aW1fY3RfYSA9IDg7CS8qIFR1cm4gb24gZXZlbnQgY291bnRpbmcuICovCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIuICovCisJcmVxdWVzdF9pcnEoSVJRX01GUF9USU1BLCBBdGFJbnRlcnJ1cHQsIElSUV9UWVBFX1NMT1csICJETUEgc291bmQiLAorCQkgICAgQXRhSW50ZXJydXB0KTsKKwltZnAuaW50X2VuX2EgfD0gMHgyMDsJLyogVHVybiBpbnRlcnJ1cHQgb24uICovCisJbWZwLmludF9ta19hIHw9IDB4MjA7CisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyB2b2lkIEF0YUlycUNsZWFuVXAodm9pZCkKK3sKKwltZnAudGltX2N0X2EgPSAwOwkvKiBzdG9wIHRpbWVyICovCisJbWZwLmludF9lbl9hICY9IH4weDIwOwkvKiB0dXJuIGludGVycnVwdCBvZmYgKi8KKwlmcmVlX2lycShJUlFfTUZQX1RJTUEsIEF0YUludGVycnVwdCk7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKKworI2RlZmluZSBUT05FX1ZPWFdBUkVfVE9fREIodikgXAorCSgoKHYpIDwgMCkgPyAtMTIgOiAoKHYpID4gMTAwKSA/IDEyIDogKCh2KSAtIDUwKSAqIDYgLyAyNSkKKyNkZWZpbmUgVE9ORV9EQl9UT19WT1hXQVJFKHYpICgoKHYpICogMjUgKyAoKHYpID4gMCA/IDUgOiAtNSkpIC8gNiArIDUwKQorCisKK3N0YXRpYyBpbnQgQXRhU2V0QmFzcyhpbnQgYmFzcykKK3sKKwlkbWFzb3VuZC5iYXNzID0gVE9ORV9WT1hXQVJFX1RPX0RCKGJhc3MpOworCWF0YXJpX21pY3Jvd2lyZV9jbWQoTVdfTE0xOTkyX0JBU1MoZG1hc291bmQuYmFzcykpOworCXJldHVybiBUT05FX0RCX1RPX1ZPWFdBUkUoZG1hc291bmQuYmFzcyk7Cit9CisKKworc3RhdGljIGludCBBdGFTZXRUcmVibGUoaW50IHRyZWJsZSkKK3sKKwlkbWFzb3VuZC50cmVibGUgPSBUT05FX1ZPWFdBUkVfVE9fREIodHJlYmxlKTsKKwlhdGFyaV9taWNyb3dpcmVfY21kKE1XX0xNMTk5Ml9UUkVCTEUoZG1hc291bmQudHJlYmxlKSk7CisJcmV0dXJuIFRPTkVfREJfVE9fVk9YV0FSRShkbWFzb3VuZC50cmVibGUpOworfQorCisKKworLyoKKyAqIFRUCisgKi8KKworCitzdGF0aWMgdm9pZCBUVFNpbGVuY2Uodm9pZCkKK3sKKwl0dF9kbWFzbmQuY3RybCA9IERNQVNORF9DVFJMX09GRjsKKwlhdGFyaV9taWNyb3dpcmVfY21kKE1XX0xNMTk5Ml9QU0dfSElHSCk7IC8qIG1peCBpbiBQU0cgc2lnbmFsIDE6MSAqLworfQorCisKK3N0YXRpYyB2b2lkIFRUSW5pdCh2b2lkKQoreworCWludCBtb2RlLCBpLCBpZHg7CisJY29uc3QgaW50IGZyZXFbNF0gPSB7NTAwNjYsIDI1MDMzLCAxMjUxNywgNjI1OH07CisKKwkvKiBzZWFyY2ggYSBmcmVxdWVuY3kgdGhhdCBmaXRzIGludG8gdGhlIGFsbG93ZWQgZXJyb3IgcmFuZ2UgKi8KKworCWlkeCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZyZXEpOyBpKyspCisJCS8qIHRoaXMgaXNuJ3QgYXMgbXVjaCB1c2VmdWwgZm9yIGEgVFQgdGhhbiBmb3IgYSBGYWxjb24sIGJ1dAorCQkgKiB0aGVuIGl0IGRvZXNuJ3QgaHVydCB2ZXJ5IG11Y2ggdG8gaW1wbGVtZW50IGl0IGZvciBhIFRUIHRvby4KKwkJICovCisJCWlmICgoMTAwICogYWJzKGRtYXNvdW5kLnNvZnQuc3BlZWQgLSBmcmVxW2ldKSAvIGZyZXFbaV0pIDwgY2F0Y2hSYWRpdXMpCisJCQlpZHggPSBpOworCWlmIChpZHggPiAtMSkgeworCQlkbWFzb3VuZC5zb2Z0LnNwZWVkID0gZnJlcVtpZHhdOworCQlkbWFzb3VuZC50cmFuc193cml0ZSA9ICZ0cmFuc1RUTm9ybWFsOworCX0gZWxzZQorCQlkbWFzb3VuZC50cmFuc193cml0ZSA9ICZ0cmFuc1RURXhwYW5kaW5nOworCisJVFRTaWxlbmNlKCk7CisJZG1hc291bmQuaGFyZCA9IGRtYXNvdW5kLnNvZnQ7CisKKwlpZiAoZG1hc291bmQuaGFyZC5zcGVlZCA+IDUwMDY2KSB7CisJCS8qIHdlIHdvdWxkIG5lZWQgdG8gc3F1ZWV6ZSB0aGUgc291bmQsIGJ1dCB3ZSB3b24ndCBkbyB0aGF0ICovCisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSA1MDA2NjsKKwkJbW9kZSA9IERNQVNORF9NT0RFXzUwS0haOworCQlkbWFzb3VuZC50cmFuc193cml0ZSA9ICZ0cmFuc1RUTm9ybWFsOworCX0gZWxzZSBpZiAoZG1hc291bmQuaGFyZC5zcGVlZCA+IDI1MDMzKSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSA1MDA2NjsKKwkJbW9kZSA9IERNQVNORF9NT0RFXzUwS0haOworCX0gZWxzZSBpZiAoZG1hc291bmQuaGFyZC5zcGVlZCA+IDEyNTE3KSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSAyNTAzMzsKKwkJbW9kZSA9IERNQVNORF9NT0RFXzI1S0haOworCX0gZWxzZSBpZiAoZG1hc291bmQuaGFyZC5zcGVlZCA+IDYyNTgpIHsKKwkJZG1hc291bmQuaGFyZC5zcGVlZCA9IDEyNTE3OworCQltb2RlID0gRE1BU05EX01PREVfMTJLSFo7CisJfSBlbHNlIHsKKwkJZG1hc291bmQuaGFyZC5zcGVlZCA9IDYyNTg7CisJCW1vZGUgPSBETUFTTkRfTU9ERV82S0haOworCX0KKworCXR0X2RtYXNuZC5tb2RlID0gKGRtYXNvdW5kLmhhcmQuc3RlcmVvID8KKwkJCSAgRE1BU05EX01PREVfU1RFUkVPIDogRE1BU05EX01PREVfTU9OTykgfAorCQlETUFTTkRfTU9ERV84QklUIHwgbW9kZTsKKworCWV4cGFuZF9iYWwgPSAtZG1hc291bmQuc29mdC5zcGVlZDsKK30KKworCitzdGF0aWMgaW50IFRUU2V0Rm9ybWF0KGludCBmb3JtYXQpCit7CisJLyogVFQgc291bmQgRE1BIHN1cHBvcnRzIG9ubHkgOGJpdCBtb2RlcyAqLworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIEFGTVRfUVVFUlk6CisJCXJldHVybiBkbWFzb3VuZC5zb2Z0LmZvcm1hdDsKKwljYXNlIEFGTVRfTVVfTEFXOgorCWNhc2UgQUZNVF9BX0xBVzoKKwljYXNlIEFGTVRfUzg6CisJY2FzZSBBRk1UX1U4OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmb3JtYXQgPSBBRk1UX1M4OworCX0KKworCWRtYXNvdW5kLnNvZnQuZm9ybWF0ID0gZm9ybWF0OworCWRtYXNvdW5kLnNvZnQuc2l6ZSA9IDg7CisJaWYgKGRtYXNvdW5kLm1pbkRldiA9PSBTTkRfREVWX0RTUCkgeworCQlkbWFzb3VuZC5kc3AuZm9ybWF0ID0gZm9ybWF0OworCQlkbWFzb3VuZC5kc3Auc2l6ZSA9IDg7CisJfQorCVRUSW5pdCgpOworCisJcmV0dXJuIGZvcm1hdDsKK30KKworCisjZGVmaW5lIFZPTFVNRV9WT1hXQVJFX1RPX0RCKHYpIFwKKwkoKCh2KSA8IDApID8gLTQwIDogKCh2KSA+IDEwMCkgPyAwIDogKCh2KSAqIDIpIC8gNSAtIDQwKQorI2RlZmluZSBWT0xVTUVfREJfVE9fVk9YV0FSRSh2KSAoKCgodikgKyA0MCkgKiA1ICsgMSkgLyAyKQorCisKK3N0YXRpYyBpbnQgVFRTZXRWb2x1bWUoaW50IHZvbHVtZSkKK3sKKwlkbWFzb3VuZC52b2x1bWVfbGVmdCA9IFZPTFVNRV9WT1hXQVJFX1RPX0RCKHZvbHVtZSAmIDB4ZmYpOworCWF0YXJpX21pY3Jvd2lyZV9jbWQoTVdfTE0xOTkyX0JBTExFRlQoZG1hc291bmQudm9sdW1lX2xlZnQpKTsKKwlkbWFzb3VuZC52b2x1bWVfcmlnaHQgPSBWT0xVTUVfVk9YV0FSRV9UT19EQigodm9sdW1lICYgMHhmZjAwKSA+PiA4KTsKKwlhdGFyaV9taWNyb3dpcmVfY21kKE1XX0xNMTk5Ml9CQUxSSUdIVChkbWFzb3VuZC52b2x1bWVfcmlnaHQpKTsKKwlyZXR1cm4gVk9MVU1FX0RCX1RPX1ZPWFdBUkUoZG1hc291bmQudm9sdW1lX2xlZnQpIHwKKwkgICAgICAgKFZPTFVNRV9EQl9UT19WT1hXQVJFKGRtYXNvdW5kLnZvbHVtZV9yaWdodCkgPDwgOCk7Cit9CisKKworI2RlZmluZSBHQUlOX1ZPWFdBUkVfVE9fREIodikgXAorCSgoKHYpIDwgMCkgPyAtODAgOiAoKHYpID4gMTAwKSA/IDAgOiAoKHYpICogNCkgLyA1IC0gODApCisjZGVmaW5lIEdBSU5fREJfVE9fVk9YV0FSRSh2KSAoKCgodikgKyA4MCkgKiA1ICsgMSkgLyA0KQorCitzdGF0aWMgaW50IFRUU2V0R2FpbihpbnQgZ2FpbikKK3sKKwlkbWFzb3VuZC5nYWluID0gR0FJTl9WT1hXQVJFX1RPX0RCKGdhaW4pOworCWF0YXJpX21pY3Jvd2lyZV9jbWQoTVdfTE0xOTkyX1ZPTFVNRShkbWFzb3VuZC5nYWluKSk7CisJcmV0dXJuIEdBSU5fREJfVE9fVk9YV0FSRShkbWFzb3VuZC5nYWluKTsKK30KKworCisKKy8qCisgKiBGYWxjb24KKyAqLworCisKK3N0YXRpYyB2b2lkIEZhbGNvblNpbGVuY2Uodm9pZCkKK3sKKwkvKiBzdG9wIHBsYXliYWNrLCBzZXQgc2FtcGxlIHJhdGUgNTBrSHogZm9yIFBTRyBzb3VuZCAqLworCXR0X2RtYXNuZC5jdHJsID0gRE1BU05EX0NUUkxfT0ZGOworCXR0X2RtYXNuZC5tb2RlID0gRE1BU05EX01PREVfNTBLSFogfCBETUFTTkRfTU9ERV9TVEVSRU8gfCBETUFTTkRfTU9ERV84QklUOworCXR0X2RtYXNuZC5pbnRfZGl2ID0gMDsgLyogU1RFIGNvbXBhdGlibGUgZGl2aWRlciAqLworCXR0X2RtYXNuZC5pbnRfY3RybCA9IDB4MDsKKwl0dF9kbWFzbmQuY2Jhcl9zcmMgPSAweDAwMDA7IC8qIG5vIG1hdHJpeCBpbnB1dHMgKi8KKwl0dF9kbWFzbmQuY2Jhcl9kc3QgPSAweDAwMDA7IC8qIG5vIG1hdHJpeCBvdXRwdXRzICovCisJdHRfZG1hc25kLmRhY19zcmMgPSAxOyAvKiBjb25uZWN0IEFEQyB0byBEQUMsIGRpc2Nvbm5lY3QgbWF0cml4ICovCisJdHRfZG1hc25kLmFkY19zcmMgPSAzOyAvKiBBREMgSW5wdXQgPSBQU0cgKi8KK30KKworCitzdGF0aWMgdm9pZCBGYWxjb25Jbml0KHZvaWQpCit7CisJaW50IGRpdmlkZXIsIGksIGlkeDsKKwljb25zdCBpbnQgZnJlcVs4XSA9IHs0OTE3MCwgMzI3ODAsIDI0NTg1LCAxOTY2OCwgMTYzOTAsIDEyMjkyLCA5ODM0LCA4MTk1fTsKKworCS8qIHNlYXJjaCBhIGZyZXF1ZW5jeSB0aGF0IGZpdHMgaW50byB0aGUgYWxsb3dlZCBlcnJvciByYW5nZSAqLworCisJaWR4ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnJlcSk7IGkrKykKKwkJLyogaWYgd2Ugd2lsbCB0b2xlcmF0ZSAzJSBlcnJvciA4MDAwSHotPjgxOTVIeiAoMi4zOCUpIHdvdWxkCisJCSAqIGJlIHBsYXlhYmxlIHdpdGhvdXQgZXhwYW5kaW5nLCBidXQgdGhhdCBub3cgYSBrZXJuZWwgcnVudGltZQorCQkgKiBvcHRpb24KKwkJICovCisJCWlmICgoMTAwICogYWJzKGRtYXNvdW5kLnNvZnQuc3BlZWQgLSBmcmVxW2ldKSAvIGZyZXFbaV0pIDwgY2F0Y2hSYWRpdXMpCisJCQlpZHggPSBpOworCWlmIChpZHggPiAtMSkgeworCQlkbWFzb3VuZC5zb2Z0LnNwZWVkID0gZnJlcVtpZHhdOworCQlkbWFzb3VuZC50cmFuc193cml0ZSA9ICZ0cmFuc0ZhbGNvbk5vcm1hbDsKKwl9IGVsc2UKKwkJZG1hc291bmQudHJhbnNfd3JpdGUgPSAmdHJhbnNGYWxjb25FeHBhbmRpbmc7CisKKwlGYWxjb25TaWxlbmNlKCk7CisJZG1hc291bmQuaGFyZCA9IGRtYXNvdW5kLnNvZnQ7CisKKwlpZiAoZG1hc291bmQuaGFyZC5zaXplID09IDE2KSB7CisJCS8qIHRoZSBGYWxjb24gY2FuIHBsYXkgMTZiaXQgc2FtcGxlcyBvbmx5IGluIHN0ZXJlbyAqLworCQlkbWFzb3VuZC5oYXJkLnN0ZXJlbyA9IDE7CisJfQorCisJaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiA0OTE3MCkgeworCQkvKiB3ZSB3b3VsZCBuZWVkIHRvIHNxdWVlemUgdGhlIHNvdW5kLCBidXQgd2Ugd29uJ3QgZG8gdGhhdCAqLworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gNDkxNzA7CisJCWRpdmlkZXIgPSAxOworCQlkbWFzb3VuZC50cmFuc193cml0ZSA9ICZ0cmFuc0ZhbGNvbk5vcm1hbDsKKwl9IGVsc2UgaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiAzMjc4MCkgeworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gNDkxNzA7CisJCWRpdmlkZXIgPSAxOworCX0gZWxzZSBpZiAoZG1hc291bmQuaGFyZC5zcGVlZCA+IDI0NTg1KSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSAzMjc4MDsKKwkJZGl2aWRlciA9IDI7CisJfSBlbHNlIGlmIChkbWFzb3VuZC5oYXJkLnNwZWVkID4gMTk2NjgpIHsKKwkJZG1hc291bmQuaGFyZC5zcGVlZCA9IDI0NTg1OworCQlkaXZpZGVyID0gMzsKKwl9IGVsc2UgaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiAxNjM5MCkgeworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gMTk2Njg7CisJCWRpdmlkZXIgPSA0OworCX0gZWxzZSBpZiAoZG1hc291bmQuaGFyZC5zcGVlZCA+IDEyMjkyKSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSAxNjM5MDsKKwkJZGl2aWRlciA9IDU7CisJfSBlbHNlIGlmIChkbWFzb3VuZC5oYXJkLnNwZWVkID4gOTgzNCkgeworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gMTIyOTI7CisJCWRpdmlkZXIgPSA3OworCX0gZWxzZSBpZiAoZG1hc291bmQuaGFyZC5zcGVlZCA+IDgxOTUpIHsKKwkJZG1hc291bmQuaGFyZC5zcGVlZCA9IDk4MzQ7CisJCWRpdmlkZXIgPSA5OworCX0gZWxzZSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSA4MTk1OworCQlkaXZpZGVyID0gMTE7CisJfQorCXR0X2RtYXNuZC5pbnRfZGl2ID0gZGl2aWRlcjsKKworCS8qIFNldHVwIEZhbGNvbiBzb3VuZCBETUEgZm9yIHBsYXliYWNrICovCisJdHRfZG1hc25kLmludF9jdHJsID0gMHg0OyAvKiBUaW1lciBBIGludCBhdCBwbGF5IGVuZCAqLworCXR0X2RtYXNuZC50cmFja19zZWxlY3QgPSAweDA7IC8qIHBsYXkgMSB0cmFjaywgdHJhY2sgMSAqLworCXR0X2RtYXNuZC5jYmFyX3NyYyA9IDB4MDAwMTsgLyogRE1BKDI1TUh6KSAtLT4gREFDICovCisJdHRfZG1hc25kLmNiYXJfZHN0ID0gMHgwMDAwOworCXR0X2RtYXNuZC5yZWNfdHJhY2tfc2VsZWN0ID0gMDsKKwl0dF9kbWFzbmQuZGFjX3NyYyA9IDI7IC8qIGNvbm5lY3QgbWF0cml4IHRvIERBQyAqLworCXR0X2RtYXNuZC5hZGNfc3JjID0gMDsgLyogQURDIElucHV0ID0gTWljICovCisKKwl0dF9kbWFzbmQubW9kZSA9IChkbWFzb3VuZC5oYXJkLnN0ZXJlbyA/CisJCQkgIERNQVNORF9NT0RFX1NURVJFTyA6IERNQVNORF9NT0RFX01PTk8pIHwKKwkJKChkbWFzb3VuZC5oYXJkLnNpemUgPT0gOCkgPworCQkgRE1BU05EX01PREVfOEJJVCA6IERNQVNORF9NT0RFXzE2QklUKSB8CisJCURNQVNORF9NT0RFXzZLSFo7CisKKwlleHBhbmRfYmFsID0gLWRtYXNvdW5kLnNvZnQuc3BlZWQ7Cit9CisKKworc3RhdGljIGludCBGYWxjb25TZXRGb3JtYXQoaW50IGZvcm1hdCkKK3sKKwlpbnQgc2l6ZTsKKwkvKiBGYWxjb24gc291bmQgRE1BIHN1cHBvcnRzIDhiaXQgYW5kIDE2Yml0IG1vZGVzICovCisKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgQUZNVF9RVUVSWToKKwkJcmV0dXJuIGRtYXNvdW5kLnNvZnQuZm9ybWF0OworCWNhc2UgQUZNVF9NVV9MQVc6CisJY2FzZSBBRk1UX0FfTEFXOgorCWNhc2UgQUZNVF9VODoKKwljYXNlIEFGTVRfUzg6CisJCXNpemUgPSA4OworCQlicmVhazsKKwljYXNlIEFGTVRfUzE2X0JFOgorCWNhc2UgQUZNVF9VMTZfQkU6CisJY2FzZSBBRk1UX1MxNl9MRToKKwljYXNlIEFGTVRfVTE2X0xFOgorCQlzaXplID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIDotKSAqLworCQlzaXplID0gODsKKwkJZm9ybWF0ID0gQUZNVF9TODsKKwl9CisKKwlkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9IGZvcm1hdDsKKwlkbWFzb3VuZC5zb2Z0LnNpemUgPSBzaXplOworCWlmIChkbWFzb3VuZC5taW5EZXYgPT0gU05EX0RFVl9EU1ApIHsKKwkJZG1hc291bmQuZHNwLmZvcm1hdCA9IGZvcm1hdDsKKwkJZG1hc291bmQuZHNwLnNpemUgPSBkbWFzb3VuZC5zb2Z0LnNpemU7CisJfQorCisJRmFsY29uSW5pdCgpOworCisJcmV0dXJuIGZvcm1hdDsKK30KKworCisvKiBUaGlzIGlzIGZvciB0aGUgRmFsY29uIG91dHB1dCAqYXR0ZW51YXRpb24qIGluIDEuNWRCIHN0ZXBzLAorICogaS5lLiBvdXRwdXQgbGV2ZWwgZnJvbSAwIHRvIC0yMi41ZEIgaW4gLTEuNWRCIHN0ZXBzLgorICovCisjZGVmaW5lIFZPTFVNRV9WT1hXQVJFX1RPX0FUVCh2KSBcCisJKCh2KSA8IDAgPyAxNSA6ICh2KSA+IDEwMCA/IDAgOiAxNSAtICh2KSAqIDMgLyAyMCkKKyNkZWZpbmUgVk9MVU1FX0FUVF9UT19WT1hXQVJFKHYpICgxMDAgLSAodikgKiAyMCAvIDMpCisKKworc3RhdGljIGludCBGYWxjb25TZXRWb2x1bWUoaW50IHZvbHVtZSkKK3sKKwlkbWFzb3VuZC52b2x1bWVfbGVmdCA9IFZPTFVNRV9WT1hXQVJFX1RPX0FUVCh2b2x1bWUgJiAweGZmKTsKKwlkbWFzb3VuZC52b2x1bWVfcmlnaHQgPSBWT0xVTUVfVk9YV0FSRV9UT19BVFQoKHZvbHVtZSAmIDB4ZmYwMCkgPj4gOCk7CisJdHRfZG1hc25kLm91dHB1dF9hdHRlbiA9IGRtYXNvdW5kLnZvbHVtZV9sZWZ0IDw8IDggfCBkbWFzb3VuZC52b2x1bWVfcmlnaHQgPDwgNDsKKwlyZXR1cm4gVk9MVU1FX0FUVF9UT19WT1hXQVJFKGRtYXNvdW5kLnZvbHVtZV9sZWZ0KSB8CisJICAgICAgIFZPTFVNRV9BVFRfVE9fVk9YV0FSRShkbWFzb3VuZC52b2x1bWVfcmlnaHQpIDw8IDg7Cit9CisKKworc3RhdGljIHZvaWQgQXRhUGxheU5leHRGcmFtZShpbnQgaW5kZXgpCit7CisJY2hhciAqc3RhcnQsICplbmQ7CisKKwkvKiB1c2VkIGJ5IEF0YVBsYXkoKSBpZiBhbGwgZG91YnRzIHdoZXRoZXIgdGhlcmUgcmVhbGx5IGlzIHNvbWV0aGluZworCSAqIHRvIGJlIHBsYXllZCBhcmUgYWxyZWFkeSB3aXBlZCBvdXQuCisJICovCisJc3RhcnQgPSB3cml0ZV9zcS5idWZmZXJzW3dyaXRlX3NxLmZyb250XTsKKwllbmQgPSBzdGFydCsoKHdyaXRlX3NxLmNvdW50ID09IGluZGV4KSA/IHdyaXRlX3NxLnJlYXJfc2l6ZQorCQkJCQkgICAgICAgOiB3cml0ZV9zcS5ibG9ja19zaXplKTsKKwkvKiBlbmQgbWlnaHQgbm90IGJlIGEgbGVnYWwgdmlydHVhbCBhZGRyZXNzLiAqLworCURNQVNORFNldEVuZCh2aXJ0X3RvX3BoeXMoZW5kIC0gMSkgKyAxKTsKKwlETUFTTkRTZXRCYXNlKHZpcnRfdG9fcGh5cyhzdGFydCkpOworCS8qIFNpbmNlIG9ubHkgYW4gZXZlbiBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUgY2FuCisJICAgYmUgcGxheWVkLCB3ZSBtaWdodCBsb3NlIG9uZSBieXRlIGhlcmUuIChUTyBETykgKi8KKwl3cml0ZV9zcS5mcm9udCA9ICh3cml0ZV9zcS5mcm9udCsxKSAlIHdyaXRlX3NxLm1heF9jb3VudDsKKwl3cml0ZV9zcS5hY3RpdmUrKzsKKwl0dF9kbWFzbmQuY3RybCA9IERNQVNORF9DVFJMX09OIHwgRE1BU05EX0NUUkxfUkVQRUFUOworfQorCisKK3N0YXRpYyB2b2lkIEF0YVBsYXkodm9pZCkKK3sKKwkvKiArK1RlU2NoZTogTm90ZSB0aGF0IHdyaXRlX3NxLmFjdGl2ZSBpcyBubyBsb25nZXIganVzdCBhIGZsYWcgYnV0CisJICogaG9sZHMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhlIERNQSBpcyBjdXJyZW50bHkgcHJvZ3JhbW1lZCBmb3IKKwkgKiBpbnN0ZWFkLCBtYXkgYmUgMCwgMSAoY3VycmVudGx5IGJlaW5nIHBsYXllZCkgb3IgMiAocHJlLXByb2dyYW1tZWQpLgorCSAqCisJICogQ2hhbmdlcyBkb25lIHRvIHdyaXRlX3NxLmNvdW50IGFuZCB3cml0ZV9zcS5hY3RpdmUgYXJlIGEgYml0IG1vcmUKKwkgKiBzdWJ0bGUgYWdhaW4gc28gbm93IEkgbXVzdCBhZG1pdCBJIGFsc28gcHJlZmVyIGRpc2FibGluZyB0aGUgaXJxCisJICogaGVyZSByYXRoZXIgdGhhbiBjb25zaWRlcmluZyBhbGwgcG9zc2libGUgc2l0dWF0aW9ucy4gQnV0IHRoZSBwb2ludAorCSAqIGlzIHRoYXQgZGlzYWJsaW5nIHRoZSBpcnEgZG9lc24ndCBoYXZlIGFueSBiYWQgaW5mbHVlbmNlIG9uIHRoaXMKKwkgKiB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgYXMgd2UgYmVuZWZpdCBmcm9tIGhhdmluZyBwcmUtcHJvZ3JhbW1lZCB0aGUKKwkgKiBETUEgd2hlcmV2ZXIgcG9zc2libGU6IFRoZXJlJ3Mgbm8gbmVlZCB0byByZWxvYWQgdGhlIERNQSBhdCB0aGUKKwkgKiBleGFjdCB0aW1lIG9mIGFuIGludGVycnVwdCBidXQgb25seSBhdCBzb21lIHRpbWUgd2hpbGUgdGhlCisJICogcHJlLXByb2dyYW1tZWQgZnJhbWUgaXMgcGxheWluZyEKKwkgKi8KKwlhdGFyaV9kaXNhYmxlX2lycShJUlFfTUZQX1RJTUEpOworCisJaWYgKHdyaXRlX3NxLmFjdGl2ZSA9PSAyIHx8CS8qIERNQSBpcyAnZnVsbCcgKi8KKwkgICAgd3JpdGVfc3EuY291bnQgPD0gMCkgewkvKiBub3RoaW5nIHRvIGRvICovCisJCWF0YXJpX2VuYWJsZV9pcnEoSVJRX01GUF9USU1BKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh3cml0ZV9zcS5hY3RpdmUgPT0gMCkgeworCQkvKiBsb29rcyBsaWtlIHRoZXJlJ3Mgbm90aGluZyAnaW4nIHRoZSBETUEgeWV0LCBzbyB0cnkKKwkJICogdG8gcHV0IHR3byBmcmFtZXMgaW50byBpdCAoYXQgbGVhc3Qgb25lIGlzIGF2YWlsYWJsZSkuCisJCSAqLworCQlpZiAod3JpdGVfc3EuY291bnQgPT0gMSAmJgorCQkgICAgd3JpdGVfc3EucmVhcl9zaXplIDwgd3JpdGVfc3EuYmxvY2tfc2l6ZSAmJgorCQkgICAgIXdyaXRlX3NxLnN5bmNpbmcpIHsKKwkJCS8qIGhtbW0sIHRoZSBvbmx5IGV4aXN0aW5nIGZyYW1lIGlzIG5vdAorCQkJICogeWV0IGZpbGxlZCBhbmQgd2UncmUgbm90IHN5bmNpbmc/CisJCQkgKi8KKwkJCWF0YXJpX2VuYWJsZV9pcnEoSVJRX01GUF9USU1BKTsKKwkJCXJldHVybjsKKwkJfQorCQlBdGFQbGF5TmV4dEZyYW1lKDEpOworCQlpZiAod3JpdGVfc3EuY291bnQgPT0gMSkgeworCQkJLyogbm8gbW9yZSBmcmFtZXMgKi8KKwkJCWF0YXJpX2VuYWJsZV9pcnEoSVJRX01GUF9USU1BKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAod3JpdGVfc3EuY291bnQgPT0gMiAmJgorCQkgICAgd3JpdGVfc3EucmVhcl9zaXplIDwgd3JpdGVfc3EuYmxvY2tfc2l6ZSAmJgorCQkgICAgIXdyaXRlX3NxLnN5bmNpbmcpIHsKKwkJCS8qIGhtbW0sIHRoZXJlIHdlcmUgdHdvIGZyYW1lcywgYnV0IHRoZSBzZWNvbmQKKwkJCSAqIG9uZSBpcyBub3QgeWV0IGZpbGxlZCBhbmQgd2UncmUgbm90IHN5bmNpbmc/CisJCQkgKi8KKwkJCWF0YXJpX2VuYWJsZV9pcnEoSVJRX01GUF9USU1BKTsKKwkJCXJldHVybjsKKwkJfQorCQlBdGFQbGF5TmV4dEZyYW1lKDIpOworCX0gZWxzZSB7CisJCS8qIHRoZXJlJ3MgYWxyZWFkeSBhIGZyYW1lIGJlaW5nIHBsYXllZCBzbyB3ZSBtYXkgb25seSBzdHVmZgorCQkgKiBvbmUgbmV3IGludG8gdGhlIERNQSwgYnV0IGV2ZW4gaWYgdGhpcyBtYXkgYmUgdGhlIGxhc3QKKwkJICogZnJhbWUgZXhpc3RpbmcgdGhlIHByZXZpb3VzIG9uZSBpcyBzdGlsbCBvbiB3cml0ZV9zcS5jb3VudC4KKwkJICovCisJCWlmICh3cml0ZV9zcS5jb3VudCA9PSAyICYmCisJCSAgICB3cml0ZV9zcS5yZWFyX3NpemUgPCB3cml0ZV9zcS5ibG9ja19zaXplICYmCisJCSAgICAhd3JpdGVfc3Euc3luY2luZykgeworCQkJLyogaG1tbSwgdGhlIG9ubHkgZXhpc3RpbmcgZnJhbWUgaXMgbm90CisJCQkgKiB5ZXQgZmlsbGVkIGFuZCB3ZSdyZSBub3Qgc3luY2luZz8KKwkJCSAqLworCQkJYXRhcmlfZW5hYmxlX2lycShJUlFfTUZQX1RJTUEpOworCQkJcmV0dXJuOworCQl9CisJCUF0YVBsYXlOZXh0RnJhbWUoMik7CisJfQorCWF0YXJpX2VuYWJsZV9pcnEoSVJRX01GUF9USU1BKTsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgQXRhSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisjaWYgMAorCS8qICsrVGVTY2hlOiBpZiB5b3Ugc2hvdWxkIHdhbnQgdG8gdGVzdCB0aGlzLi4uICovCisJc3RhdGljIGludCBjbnQ7CisJaWYgKHdyaXRlX3NxLmFjdGl2ZSA9PSAyKQorCQlpZiAoKytjbnQgPT0gMTApIHsKKwkJCS8qIHNpbXVsYXRlIGxvc2luZyBhbiBpbnRlcnJ1cHQgKi8KKwkJCWNudCA9IDA7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKyNlbmRpZgorCXNwaW5fbG9jaygmZG1hc291bmQubG9jayk7CisJaWYgKHdyaXRlX3NxX2lnbm9yZV9pbnQgJiYgaXNfZmFsY29uKSB7CisJCS8qICsrVGVTY2hlOiBGYWxjb24gb25seTogaWdub3JlIGZpcnN0IGlycSBiZWNhdXNlIGl0IGNvbWVzCisJCSAqIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0aW5nIGEgZnJhbWUuIGFmdGVyIHRoYXQsIGlycXMgY29tZQorCQkgKiAoYWxtb3N0KSBsaWtlIG9uIHRoZSBUVC4KKwkJICovCisJCXdyaXRlX3NxX2lnbm9yZV9pbnQgPSAwOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKCF3cml0ZV9zcS5hY3RpdmUpIHsKKwkJLyogcGxheWluZyB3YXMgaW50ZXJydXB0ZWQgYW5kIHNxX3Jlc2V0KCkgaGFzIGFscmVhZHkgY2xlYXJlZAorCQkgKiB0aGUgc3EgdmFyaWFibGVzLCBzbyBiZXR0ZXIgZG9uJ3QgZG8gYW55dGhpbmcgaGVyZS4KKwkJICovCisJCVdBS0VfVVAod3JpdGVfc3Euc3luY19xdWV1ZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBQcm9iYWJseSA7KSBvbmUgZnJhbWUgaXMgZmluaXNoZWQuIFdlbGwsIGluIGZhY3QgaXQgbWF5IGJlIHRoYXQgYQorCSAqIHByZS1wcm9ncmFtbWVkIG9uZSBpcyBhbHNvIGZpbmlzaGVkIGJlY2F1c2UgdGhlcmUgaGFzIGJlZW4gYSBsb25nCisJICogZGVsYXkgaW4gaW50ZXJydXB0IGRlbGl2ZXJ5IGFuZCB3ZSd2ZSBjb21wbGV0ZWx5IGxvc3Qgb25lLCBidXQKKwkgKiB0aGVyZSdzIG5vIHdheSB0byBkZXRlY3Qgc3VjaCBhIHNpdHVhdGlvbi4gSW4gc3VjaCBhIGNhc2UgdGhlIGxhc3QKKwkgKiBmcmFtZSB3aWxsIGJlIHBsYXllZCBtb3JlIHRoYW4gb25jZSBhbmQgdGhlIHNpdHVhdGlvbiB3aWxsIHJlY292ZXIKKwkgKiBhcyBzb29uIGFzIHRoZSBpcnEgZ2V0cyB0aHJvdWdoLgorCSAqLworCXdyaXRlX3NxLmNvdW50LS07CisJd3JpdGVfc3EuYWN0aXZlLS07CisKKwlpZiAoIXdyaXRlX3NxLmFjdGl2ZSkgeworCQl0dF9kbWFzbmQuY3RybCA9IERNQVNORF9DVFJMX09GRjsKKwkJd3JpdGVfc3FfaWdub3JlX2ludCA9IDE7CisJfQorCisJV0FLRV9VUCh3cml0ZV9zcS5hY3Rpb25fcXVldWUpOworCS8qIEF0IGxlYXN0IG9uZSBibG9jayBvZiB0aGUgcXVldWUgaXMgZnJlZSBub3cKKwkgICBzbyB3YWtlIHVwIGEgd3JpdGluZyBwcm9jZXNzIGJsb2NrZWQgYmVjYXVzZQorCSAgIG9mIGEgZnVsbCBxdWV1ZS4gKi8KKworCWlmICgod3JpdGVfc3EuYWN0aXZlICE9IDEpIHx8ICh3cml0ZV9zcS5jb3VudCAhPSAxKSkKKwkJLyogV2UgbXVzdCBiZSBhIGJpdCBjYXJlZnVsbHkgaGVyZTogd3JpdGVfc3EuY291bnQgaW5kaWNhdGVzIHRoZQorCQkgKiBudW1iZXIgb2YgYnVmZmVycyB1c2VkIGFuZCBub3QgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUKKwkJICogcGxheWVkLiBJZiB3cml0ZV9zcS5jb3VudD09MSBhbmQgd3JpdGVfc3EuYWN0aXZlPT0xIHRoYXQKKwkJICogbWVhbnMgdGhlIG9ubHkgcmVtYWluaW5nIGZyYW1lIHdhcyBhbHJlYWR5IHByb2dyYW1tZWQKKwkJICogZWFybGllciAoYW5kIGlzIGN1cnJlbnRseSBydW5uaW5nKSBzbyB3ZSBtdXN0bid0IGNhbGwKKwkJICogQXRhUGxheSgpIGhlcmUsIG90aGVyd2lzZSB3ZSdsbCBwbGF5IG9uZSBmcmFtZSB0b28gbXVjaC4KKwkJICovCisJCUF0YVBsYXkoKTsKKworCWlmICghd3JpdGVfc3EuYWN0aXZlKSBXQUtFX1VQKHdyaXRlX3NxLnN5bmNfcXVldWUpOworCS8qIFdlIGFyZSBub3QgcGxheWluZyBhZnRlciBBdGFQbGF5KCksIHNvIHRoZXJlCisJICAgaXMgbm90aGluZyB0byBwbGF5IGFueSBtb3JlLiBXYWtlIHVwIGEgcHJvY2VzcworCSAgIHdhaXRpbmcgZm9yIGF1ZGlvIG91dHB1dCB0byBkcmFpbi4gKi8KKwlzcGluX3VubG9jaygmZG1hc291bmQubG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qKiogTWlkIGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorICogL2Rldi9taXhlciBhYnN0cmFjdGlvbgorICovCisKKyNkZWZpbmUgUkVDTEVWRUxfVk9YV0FSRV9UT19HQUlOKHYpCVwKKwkoKHYpIDwgMCA/IDAgOiAodikgPiAxMDAgPyAxNSA6ICh2KSAqIDMgLyAyMCkKKyNkZWZpbmUgUkVDTEVWRUxfR0FJTl9UT19WT1hXQVJFKHYpCSgoKHYpICogMjAgKyAyKSAvIDMpCisKKworc3RhdGljIHZvaWQgX19pbml0IFRUTWl4ZXJJbml0KHZvaWQpCit7CisJYXRhcmlfbWljcm93aXJlX2NtZChNV19MTTE5OTJfVk9MVU1FKDApKTsKKwlkbWFzb3VuZC52b2x1bWVfbGVmdCA9IDA7CisJYXRhcmlfbWljcm93aXJlX2NtZChNV19MTTE5OTJfQkFMTEVGVCgwKSk7CisJZG1hc291bmQudm9sdW1lX3JpZ2h0ID0gMDsKKwlhdGFyaV9taWNyb3dpcmVfY21kKE1XX0xNMTk5Ml9CQUxSSUdIVCgwKSk7CisJYXRhcmlfbWljcm93aXJlX2NtZChNV19MTTE5OTJfVFJFQkxFKDApKTsKKwlhdGFyaV9taWNyb3dpcmVfY21kKE1XX0xNMTk5Ml9CQVNTKDApKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IEZhbGNvbk1peGVySW5pdCh2b2lkKQoreworCWRtYXNvdW5kLnZvbHVtZV9sZWZ0ID0gKHR0X2RtYXNuZC5vdXRwdXRfYXR0ZW4gJiAweGYwMCkgPj4gODsKKwlkbWFzb3VuZC52b2x1bWVfcmlnaHQgPSAodHRfZG1hc25kLm91dHB1dF9hdHRlbiAmIDB4ZjApID4+IDQ7Cit9CisKK3N0YXRpYyBpbnQgQXRhTWl4ZXJJb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisJaW50IGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzd2l0Y2ggKGNtZCkgeworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfU1BFQUtFUjoKKwkJICAgIGlmIChpc19mYWxjb24gfHwgTUFDSF9JU19UVCkgeworCQkJICAgIGludCBwb3J0YTsKKwkJCSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCQkJICAgIHNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbCA9IDE0OworCQkJICAgIHBvcnRhID0gc291bmRfeW0ucmRfZGF0YV9yZWdfc2VsOworCQkJICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKwkJCSAgICByZXR1cm4gSU9DVExfT1VUKGFyZywgcG9ydGEgJiAweDQwID8gMCA6IDEwMCk7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUU6CisJCSAgICBJT0NUTF9JTihhcmcsIGRhdGEpOworCQkgICAgcmV0dXJuIElPQ1RMX09VVChhcmcsIGRtYXNvdW5kX3NldF92b2x1bWUoZGF0YSkpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1dSSVRFX1NQRUFLRVI6CisJCSAgICBpZiAoaXNfZmFsY29uIHx8IE1BQ0hfSVNfVFQpIHsKKwkJCSAgICBpbnQgcG9ydGE7CisJCQkgICAgSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJCSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCQkJICAgIHNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbCA9IDE0OworCQkJICAgIHBvcnRhID0gKHNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbCAmIH4weDQwKSB8CisJCQkJICAgIChkYXRhIDwgNTAgPyAweDQwIDogMCk7CisJCQkgICAgc291bmRfeW0ud2RfZGF0YSA9IHBvcnRhOworCQkJICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKwkJCSAgICByZXR1cm4gSU9DVExfT1VUKGFyZywgcG9ydGEgJiAweDQwID8gMCA6IDEwMCk7CisJCSAgICB9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisKK3N0YXRpYyBpbnQgVFRNaXhlcklvY3RsKHVfaW50IGNtZCwgdV9sb25nIGFyZykKK3sKKwlpbnQgZGF0YTsKKwlzd2l0Y2ggKGNtZCkgeworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSzoKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIDApOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSzoKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsCisJCQkJIFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19UUkVCTEUgfCBTT1VORF9NQVNLX0JBU1MgfAorCQkJCSAoTUFDSF9JU19UVCA/IFNPVU5EX01BU0tfU1BFQUtFUiA6IDApKTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlM6CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBTT1VORF9NQVNLX1ZPTFVNRSk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU6CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLAorCQkJCSBWT0xVTUVfREJfVE9fVk9YV0FSRShkbWFzb3VuZC52b2x1bWVfbGVmdCkgfAorCQkJCSAoVk9MVU1FX0RCX1RPX1ZPWFdBUkUoZG1hc291bmQudm9sdW1lX3JpZ2h0KSA8PCA4KSk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9CQVNTOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgVE9ORV9EQl9UT19WT1hXQVJFKGRtYXNvdW5kLmJhc3MpKTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1RSRUJMRToKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIFRPTkVfREJfVE9fVk9YV0FSRShkbWFzb3VuZC50cmVibGUpKTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX09HQUlOOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgR0FJTl9EQl9UT19WT1hXQVJFKGRtYXNvdW5kLmdhaW4pKTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9XUklURV9CQVNTOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgZG1hc291bmRfc2V0X2Jhc3MoZGF0YSkpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1dSSVRFX1RSRUJMRToKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIGRtYXNvdW5kX3NldF90cmVibGUoZGF0YSkpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1dSSVRFX09HQUlOOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgZG1hc291bmRfc2V0X2dhaW4oZGF0YSkpOworCX0KKwlyZXR1cm4gQXRhTWl4ZXJJb2N0bChjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgRmFsY29uTWl4ZXJJb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisJaW50IGRhdGE7CisJc3dpdGNoIChjbWQpIHsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBTT1VORF9NQVNLX01JQyk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfU1BFQUtFUik7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9TVEVSRU9ERVZTOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX01JQyk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU6CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLAorCQkJVk9MVU1FX0FUVF9UT19WT1hXQVJFKGRtYXNvdW5kLnZvbHVtZV9sZWZ0KSB8CisJCQlWT0xVTUVfQVRUX1RPX1ZPWFdBUkUoZG1hc291bmQudm9sdW1lX3JpZ2h0KSA8PCA4KTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NBUFM6CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBTT1VORF9DQVBfRVhDTF9JTlBVVCk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTUlDOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQl0dF9kbWFzbmQuaW5wdXRfZ2FpbiA9CisJCQlSRUNMRVZFTF9WT1hXQVJFX1RPX0dBSU4oZGF0YSAmIDB4ZmYpIDw8IDQgfAorCQkJUkVDTEVWRUxfVk9YV0FSRV9UT19HQUlOKGRhdGEgPj4gOCAmIDB4ZmYpOworCQkvKiBmYWxsIHRocnUsIHJldHVybiBzZXQgdmFsdWUgKi8KKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX01JQzoKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsCisJCQlSRUNMRVZFTF9HQUlOX1RPX1ZPWFdBUkUodHRfZG1hc25kLmlucHV0X2dhaW4gPj4gNCAmIDB4ZikgfAorCQkJUkVDTEVWRUxfR0FJTl9UT19WT1hXQVJFKHR0X2RtYXNuZC5pbnB1dF9nYWluICYgMHhmKSA8PCA4KTsKKwl9CisJcmV0dXJuIEF0YU1peGVySW9jdGwoY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IEF0YVdyaXRlU3FTZXR1cCh2b2lkKQoreworCXdyaXRlX3NxX2lnbm9yZV9pbnQgPSAwOworCXJldHVybiAwIDsKK30KKworc3RhdGljIGludCBBdGFTcU9wZW4obW9kZV90IG1vZGUpCit7CisJd3JpdGVfc3FfaWdub3JlX2ludCA9IDE7CisJcmV0dXJuIDAgOworfQorCitzdGF0aWMgaW50IFRUU3RhdGVJbmZvKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNwYWNlKQoreworCWludCBsZW4gPSAwOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcdHZvbCBsZWZ0ICAlZGRCIFstNDAuLi4gIDBdXG4iLAorCQkgICAgICAgZG1hc291bmQudm9sdW1lX2xlZnQpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcdHZvbCByaWdodCAlZGRCIFstNDAuLi4gIDBdXG4iLAorCQkgICAgICAgZG1hc291bmQudm9sdW1lX3JpZ2h0KTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXHRiYXNzICAgICAgJWRkQiBbLTEyLi4uKzEyXVxuIiwKKwkJICAgICAgIGRtYXNvdW5kLmJhc3MpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcdHRyZWJsZSAgICAlZGRCIFstMTIuLi4rMTJdXG4iLAorCQkgICAgICAgZG1hc291bmQudHJlYmxlKTsKKwlpZiAobGVuID49IHNwYWNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hc291bmRfYXRhcmk6IG92ZXJmbG93ZWQgc3RhdGUgYnVmZmVyIGFsbG9jLlxuIikgOworCQlsZW4gPSBzcGFjZSA7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgRmFsY29uU3RhdGVJbmZvKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNwYWNlKQoreworCWludCBsZW4gPSAwOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcdHZvbCBsZWZ0ICAlZGRCIFstMjIuNSAuLi4gMF1cbiIsCisJCSAgICAgICBkbWFzb3VuZC52b2x1bWVfbGVmdCk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIlx0dm9sIHJpZ2h0ICVkZEIgWy0yMi41IC4uLiAwXVxuIiwKKwkJICAgICAgIGRtYXNvdW5kLnZvbHVtZV9yaWdodCk7CisJaWYgKGxlbiA+PSBzcGFjZSkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kX2F0YXJpOiBvdmVyZmxvd2VkIHN0YXRlIGJ1ZmZlciBhbGxvYy5cbiIpIDsKKwkJbGVuID0gc3BhY2UgOworCX0KKwlyZXR1cm4gbGVuOworfQorCisKKy8qKiogTWFjaGluZSBkZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFNFVFRJTkdTIGRlZl9oYXJkX2ZhbGNvbiA9IHsKKwkuZm9ybWF0CQk9IEFGTVRfUzgsCisJLnN0ZXJlbwkJPSAwLAorCS5zaXplCQk9IDgsCisJLnNwZWVkCQk9IDgxOTUKK30gOworCitzdGF0aWMgU0VUVElOR1MgZGVmX2hhcmRfdHQgPSB7CisJLmZvcm1hdAk9IEFGTVRfUzgsCisJLnN0ZXJlbwk9IDAsCisJLnNpemUJPSA4LAorCS5zcGVlZAk9IDEyNTE3Cit9IDsKKworc3RhdGljIFNFVFRJTkdTIGRlZl9zb2Z0ID0geworCS5mb3JtYXQJPSBBRk1UX1U4LAorCS5zdGVyZW8JPSAwLAorCS5zaXplCT0gOCwKKwkuc3BlZWQJPSA4MDAwCit9IDsKKworc3RhdGljIE1BQ0hJTkUgbWFjaFRUID0geworCS5uYW1lCQk9ICJBdGFyaSIsCisJLm5hbWUyCQk9ICJUVCIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kbWFfYWxsb2MJPSBBdGFBbGxvYywKKwkuZG1hX2ZyZWUJPSBBdGFGcmVlLAorCS5pcnFpbml0CT0gQXRhSXJxSW5pdCwKKyNpZmRlZiBNT0RVTEUKKwkuaXJxY2xlYW51cAk9IEF0YUlycUNsZWFuVXAsCisjZW5kaWYgLyogTU9EVUxFICovCisJLmluaXQJCT0gVFRJbml0LAorCS5zaWxlbmNlCT0gVFRTaWxlbmNlLAorCS5zZXRGb3JtYXQJPSBUVFNldEZvcm1hdCwKKwkuc2V0Vm9sdW1lCT0gVFRTZXRWb2x1bWUsCisJLnNldEJhc3MJPSBBdGFTZXRCYXNzLAorCS5zZXRUcmVibGUJPSBBdGFTZXRUcmVibGUsCisJLnNldEdhaW4JPSBUVFNldEdhaW4sCisJLnBsYXkJCT0gQXRhUGxheSwKKwkubWl4ZXJfaW5pdAk9IFRUTWl4ZXJJbml0LAorCS5taXhlcl9pb2N0bAk9IFRUTWl4ZXJJb2N0bCwKKwkud3JpdGVfc3Ffc2V0dXAJPSBBdGFXcml0ZVNxU2V0dXAsCisJLnNxX29wZW4JPSBBdGFTcU9wZW4sCisJLnN0YXRlX2luZm8JPSBUVFN0YXRlSW5mbywKKwkubWluX2RzcF9zcGVlZAk9IDYyNTgsCisJLnZlcnNpb24JPSAoKERNQVNPVU5EX0FUQVJJX1JFVklTSU9OPDw4KSB8IERNQVNPVU5EX0FUQVJJX0VESVRJT04pLAorCS5oYXJkd2FyZV9hZm10cwk9IEFGTVRfUzgsICAvKiBoJ3dhcmUtc3VwcG9ydGVkIGZvcm1hdHMgKm9ubHkqIGhlcmUgKi8KKwkuY2FwYWJpbGl0aWVzCT0gIERTUF9DQVBfQkFUQ0gJLyogQXMgcGVyIFNORENUTF9EU1BfR0VUQ0FQUyAqLworfTsKKworc3RhdGljIE1BQ0hJTkUgbWFjaEZhbGNvbiA9IHsKKwkubmFtZQkJPSAiQXRhcmkiLAorCS5uYW1lMgkJPSAiRkFMQ09OIiwKKwkuZG1hX2FsbG9jCT0gQXRhQWxsb2MsCisJLmRtYV9mcmVlCT0gQXRhRnJlZSwKKwkuaXJxaW5pdAk9IEF0YUlycUluaXQsCisjaWZkZWYgTU9EVUxFCisJLmlycWNsZWFudXAJPSBBdGFJcnFDbGVhblVwLAorI2VuZGlmIC8qIE1PRFVMRSAqLworCS5pbml0CQk9IEZhbGNvbkluaXQsCisJLnNpbGVuY2UJPSBGYWxjb25TaWxlbmNlLAorCS5zZXRGb3JtYXQJPSBGYWxjb25TZXRGb3JtYXQsCisJLnNldFZvbHVtZQk9IEZhbGNvblNldFZvbHVtZSwKKwkuc2V0QmFzcwk9IEF0YVNldEJhc3MsCisJLnNldFRyZWJsZQk9IEF0YVNldFRyZWJsZSwKKwkucGxheQkJPSBBdGFQbGF5LAorCS5taXhlcl9pbml0CT0gRmFsY29uTWl4ZXJJbml0LAorCS5taXhlcl9pb2N0bAk9IEZhbGNvbk1peGVySW9jdGwsCisJLndyaXRlX3NxX3NldHVwCT0gQXRhV3JpdGVTcVNldHVwLAorCS5zcV9vcGVuCT0gQXRhU3FPcGVuLAorCS5zdGF0ZV9pbmZvCT0gRmFsY29uU3RhdGVJbmZvLAorCS5taW5fZHNwX3NwZWVkCT0gODE5NSwKKwkudmVyc2lvbgk9ICgoRE1BU09VTkRfQVRBUklfUkVWSVNJT048PDgpIHwgRE1BU09VTkRfQVRBUklfRURJVElPTiksCisJLmhhcmR3YXJlX2FmbXRzCT0gKEFGTVRfUzggfCBBRk1UX1MxNl9CRSksIC8qIGgnd2FyZS1zdXBwb3J0ZWQgZm9ybWF0cyAqb25seSogaGVyZSAqLworCS5jYXBhYmlsaXRpZXMJPSAgRFNQX0NBUF9CQVRDSAkvKiBBcyBwZXIgU05EQ1RMX0RTUF9HRVRDQVBTICovCit9OworCisKKy8qKiogQ29uZmlnICYgU2V0dXAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IF9faW5pdCBkbWFzb3VuZF9hdGFyaV9pbml0KHZvaWQpCit7CisJaWYgKE1BQ0hfSVNfQVRBUkkgJiYgQVRBUklIV19QUkVTRU5UKFBDTV84QklUKSkgeworCSAgICBpZiAoQVRBUklIV19QUkVTRU5UKENPREVDKSkgeworCQlkbWFzb3VuZC5tYWNoID0gbWFjaEZhbGNvbjsKKwkJZG1hc291bmQubWFjaC5kZWZhdWx0X3NvZnQgPSBkZWZfc29mdCA7CisJCWRtYXNvdW5kLm1hY2guZGVmYXVsdF9oYXJkID0gZGVmX2hhcmRfZmFsY29uIDsKKwkJaXNfZmFsY29uID0gMTsKKwkgICAgfSBlbHNlIGlmIChBVEFSSUhXX1BSRVNFTlQoTUlDUk9XSVJFKSkgeworCQlkbWFzb3VuZC5tYWNoID0gbWFjaFRUOworCQlkbWFzb3VuZC5tYWNoLmRlZmF1bHRfc29mdCA9IGRlZl9zb2Z0IDsKKwkJZG1hc291bmQubWFjaC5kZWZhdWx0X2hhcmQgPSBkZWZfaGFyZF90dCA7CisJCWlzX2ZhbGNvbiA9IDA7CisJICAgIH0gZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKKwkgICAgaWYgKChtZnAuaW50X2VuX2EgJiBtZnAuaW50X21rX2EgJiAweDIwKSA9PSAwKQorCQlyZXR1cm4gZG1hc291bmRfaW5pdCgpOworCSAgICBlbHNlIHsKKwkJcHJpbnRrKCJETUEgc291bmQgZHJpdmVyOiBUaW1lciBBIGludGVycnVwdCBhbHJlYWR5IGluIHVzZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJICAgIH0KKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkbWFzb3VuZF9hdGFyaV9jbGVhbnVwKHZvaWQpCit7CisJZG1hc291bmRfZGVpbml0KCk7Cit9CisKK21vZHVsZV9pbml0KGRtYXNvdW5kX2F0YXJpX2luaXQpOworbW9kdWxlX2V4aXQoZG1hc291bmRfYXRhcmlfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXdhY3MuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hd2Fjcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODFiODgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXdhY3MuYwpAQCAtMCwwICsxLDMxNzYgQEAKKy8qCisgKiAgbGludXgvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F3YWNzLmMKKyAqCisgKiAgUG93ZXJNYWMgYEFXQUNTJyBhbmQgYEJ1cmd1bmR5JyBETUEgU291bmQgRHJpdmVyCisgKiAgd2l0aCBzb21lIGxpbWl0ZWQgc3VwcG9ydCBmb3IgREFDQSAmIFR1bWJsZXIKKyAqCisgKiAgU2VlIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9jb3JlLmMgZm9yIGNvcHlyaWdodCBhbmQKKyAqICBoaXN0b3J5IHByaW9yIHRvIDIwMDEvMDEvMjYuCisgKgorICoJMjYvMDEvMjAwMSBlZCAwLjEgSWFpbiBTYW5kb2UKKyAqCQktIGFkZGVkIHZlcnNpb24gaW5mby4KKyAqCQktIG1vdmVkIGRiZG1hIGNvbW1hbmQgYnVmZmVyIGFsbG9jYXRpb24gdG8gUE1hY1hYWFNxU2V0dXAoKQorICoJCS0gZml4ZWQgdXAgYmVlcCBkYmRtYSBjbWQgYnVmZmVycworICoKKyAqCTA4LzAyLzIwMDEgWzAuMl0KKyAqCQktIG1ha2UgU05EQ1RMX0RTUF9HRVRGTVRTIHJldHVybiB0aGUgY29ycmVjdCBpbmZvIGZvciB0aGUgaC93CisgKgkJLSBtb3ZlIHNvZnQgZm9ybWF0IHRyYW5zbGF0aW9ucyB0byBhIHNlcGFyYXRlIGZpbGUKKyAqCQktIFswLjNdIG1ha2UgU05EQ1RMX0RTUF9HRVRDQVBTIHJldHVybiBjb3JyZWN0IGluZm8uCisgKgkJLSBbMC40XSBtb3JlIGluZm9ybWF0aXZlIG1hY2hpbmUgbmFtZSBzdHJpbmdzLgorICoJCS0gWzAuNV0KKyAqCQktIHJlY29yZCBjaGFuZ2VzLgorICoJCS0gbWFkZSB0aGUgZGVmYXVsdF9oYXJkL3NvZnQgZW50cmllcy4KKyAqCTA0LzA0LzIwMDEgWzAuNl0KKyAqCQktIG1pbm9yIGNvcnJlY3Rpb24gdG8gYml0IGFzc2lnbm1lbnRzIGluIGF3YWNzX2RlZnMuaAorICoJCS0gaW5jb3Jwb3JhdGUgbWl4ZXIgY2hhbmdlcyBmcm9tIDIuMi54IGJhY2stcG9ydC4KKyAqCQktIHRha2Ugb3V0IHBhc3N0aHJ1IGFzIGEgcmVjIGlucHV0IChpdCBpc24ndCkuCisgKiAgICAgICAgICAgICAgLSBtYWtlIElucHV0IEdhaW4gc2xpZGVyIHdvcmsgdGhlICdyaWdodCB3YXkgdXAnLgorICogICAgICAgICAgICAgIC0gdHJ5IHRvIG1ha2UgdGhlIG1peGVyIHNsaWRlcnMgbW9yZSBsb2dpY2FsIC0gc28gbm93IHRoZQorICogICAgICAgICAgICAgICAgaW5wdXQgc2VsZWN0b3JzIGFyZSBqdXN0IHR3by1zdGF0ZSAoPjUwJSA9PSBPTikgYW5kIHRoZQorICogICAgICAgICAgICAgICAgSW5wdXQgR2FpbiBzbGlkZXIgaGFuZGxlcyB0aGUgcmVzdCBvZiB0aGUgZ2FpbiBpc3N1ZXMuCisgKiAgICAgICAgICAgICAgLSB0cnkgdG8gcGljayBzbGlkZXIgcmVwcmVzZW50YXRpb25zIHRoYXQgbW9zdCBjbG9zZWx5IG1hdGNoCisgKiAgICAgICAgICAgICAgICB0aGUgYWN0dWFsIHVzZSAtIGUuZy4gSUdhaW4gZm9yIGlucHV0IGdhaW4uLi4gCisgKiAgICAgICAgICAgICAgLSBmaXJzdCBzdGFiIGF0IG92ZXIvdW5kZXItcnVuIGRldGVjdGlvbi4KKyAqCQktIG1pbm9yIGNvc21ldGljIGNoYW5nZXMgdG8gSVJRIGlkZW50aWZpY2F0aW9uLgorICoJCS0gZml4IGJ1ZyB3aGVyZSByYXRlcyA+IG1heCB3b3VsZCBiZSByZXBvcnRlZCBhcyBzdXBwb3J0ZWQuCisgKiAgICAgICAgICAgICAgLSBmaXJzdCBzdGFiIGF0IG92ZXIvdW5kZXItcnVuIGRldGVjdGlvbi4KKyAqICAgICAgICAgICAgICAtIG1ha2UgdXNlIG9mIGkyYyBmb3IgbWl4ZXIgc2V0dGluZ3MgY29uZGl0aW9uYWwgb24gcGVyY2gKKyAqICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIGN1ZGEgKHNvbWUgbWFjaGluZXMgd2l0aG91dCBwZXJjaCBoYXZlIGN1ZGEpLgorICogICAgICAgICAgICAgIC0gZml4IGJ1ZyB3aGVyZSBUWCBzdG9wcyB3aGVuIGRiZG1hIHN0YXR1cyBjb21lcyB1cCAiREVBRCIKKyAqCQkgIHNvIGZhciBvbmx5IHJlcG9ydGVkIG9uIFBvd2VyQ29tcHV0aW5nIGNsb25lcyAuLi4gYnV0LgorICoJCS0gcHV0IGluIEFXQUNTL1NjcmVhbWVyIHJlZ2lzdGVyIHdyaXRlIHRpbWVvdXRzLgorICoJCS0gcGFydCB3YXkgdG8gcGFydGl0aW9uaW5nIHRoZSBpbml0KCkgc3R1ZmYKKyAqCQktIGZpcnN0IHBhc3MgYXQgJ3R1bWJsZXInIHN0dWZmIChub3Qgc3VwcG9ydCAtIGp1c3QgYW4gYXR0ZW1wdAorICoJCSAgdG8gYWxsb3cgdGhlIGRyaXZlciB0byBsb2FkIG9uIG5ldyBHNHMpLgorICogICAgICAwMS8wMi8yMDAyIFswLjddIC0gQmVuSAorICoJICAgICAgICAtIGFsbCBzb3J0IG9mIG1pbm9yIGJpdHMgd2VudCBpbiBzaW5jZSB0aGUgbGF0ZXN0IHVwZGF0ZSwgSQorICoJICAgICAgICAgIGJ1bXBlZCB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoYXQgcmVhc29uCisgKgorICogICAgICAwNy8yNi8yMDAyIFswLjhdIC0gQmVuSAorICoJICAgICAgICAtIE1vcmUgbWlub3IgYml0cyBzaW5jZSBsYXN0IGNoYW5nZWxvZyAoSSBzaG91bGQgYmUgbW9yZSBjYXJlZnVsCisgKgkgICAgICAgICAgd2l0aCB0aG9zZSkKKyAqCSAgICAgICAgLSBTdXBwb3J0IGZvciBzbmFwcGVyICYgYmV0dGVyIHR1bWJsZXIgaW50ZWdyYXRpb24gYnkgVG9ieSBTYXJnZWFudAorICoJICAgICAgICAtIEhlYWRwaG9uZSBkZXRlY3QgZm9yIHNjcmVtZXIgYnkgSnVsaWVuIEJsYWNoZQorICoJICAgICAgICAtIE1vcmUgdHVtYmxlciBmaXhlZCBieSBBbmRyZWFzIFNjaHdhYgorICoJMTEvMjkvMjAwMyBbMC44LjFdIC0gUmVuem8gRGF2b2xpIChLaW5nIEVuem8pCisgKgkJLSBTdXBwb3J0IGZvciBTbmFwcGVyIGxpbmUgaW4KKyAqCQktIHNuYXBwZXIgaW5wdXQgcmVzYW1wbGluZyAoZm9yIHJhdGVzIDwgNDQxMDApCisgKgkJLSBzb2Z0d2FyZSBsaW5lIGdhaW4gY29udHJvbAorICovCisKKy8qIEdFTkVSQUwgRklYTUUvVE9ETzogY2hlY2sgdGhhdCB0aGUgYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCBpcyB3cml0dGVuIHRvCisgICBtYWMtaW8gaXMgdmFsaWQgZm9yIERBQ0EgJiBUdW1ibGVyLgorCisgICBUaGlzIGRyaXZlciBpcyBpbiBiYWQgbmVlZCBvZiBhIHJld3JpdGUuIFRoZSBkYmRtYSBjb2RlIGhhcyB0byBiZSBzcGxpdCwKKyAgIHNvbWUgcHJvcGVyIGRldmljZS10cmVlIHBhcnNpbmcgY29kZSBoYXMgdG8gYmUgd3JpdHRlbiwgZXRjLi4uCisqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvYWRiLmg+CisjaW5jbHVkZSA8bGludXgvbnZyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaWZkZWYgQ09ORklHX0FEQl9DVURBCisjaW5jbHVkZSA8bGludXgvY3VkYS5oPgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FEQl9QTVUKKyNpbmNsdWRlIDxsaW51eC9wbXUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvaTJjLWRldi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbnZyYW0uaD4KKworI2luY2x1ZGUgImF3YWNzX2RlZnMuaCIKKyNpbmNsdWRlICJkbWFzb3VuZC5oIgorI2luY2x1ZGUgInRhczMwMDFjLmgiCisjaW5jbHVkZSAidGFzMzAwNC5oIgorI2luY2x1ZGUgInRhc19jb21tb24uaCIKKworI2RlZmluZSBETUFTT1VORF9BV0FDU19SRVZJU0lPTgkwCisjZGVmaW5lIERNQVNPVU5EX0FXQUNTX0VESVRJT04JNworCisjZGVmaW5lIEFXQUNTX1NOQVBQRVIgICAxMTAJLyogZmFrZSByZXZpc2lvbiAjIGZvciBzbmFwcGVyICovCisjZGVmaW5lIEFXQUNTX0JVUkdVTkRZCTEwMAkvKiBmYWtlIHJldmlzaW9uICMgZm9yIGJ1cmd1bmR5ICovCisjZGVmaW5lIEFXQUNTX1RVTUJMRVIgICAgOTAJLyogZmFrZSByZXZpc2lvbiAjIGZvciB0dW1ibGVyICovCisjZGVmaW5lIEFXQUNTX0RBQ0EJIDgwCS8qIGZha2UgcmV2aXNpb24gIyBmb3IgZGFjYSAoaWJvb2spICovCisjZGVmaW5lIEFXQUNTX0FXQUNTICAgICAgIDIgICAgIC8qIGhvbGRpbmcgcmV2aXNpb24gZm9yIEFXQUNTICovCisjZGVmaW5lIEFXQUNTX1NDUkVBTUVSICAgIDMgICAgIC8qIGhvbGRpbmcgcmV2aXNpb24gZm9yIFNjcmVhbWVyICovCisvKgorICogSW50ZXJydXB0IG51bWJlcnMgYW5kIGFkZHJlc3NlcywgJiBpbmZvIG9idGFpbmVkIGZyb20gdGhlIGRldmljZSB0cmVlLgorICovCitzdGF0aWMgaW50IGF3YWNzX2lycSwgYXdhY3NfdHhfaXJxLCBhd2Fjc19yeF9pcnE7CitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IGF3YWNzX3JlZ3MgX19pb21lbSAqYXdhY3M7CitzdGF0aWMgdm9sYXRpbGUgdTMyIF9faW9tZW0gKmkyczsKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICphd2Fjc190eGRtYSwgKmF3YWNzX3J4ZG1hOworc3RhdGljIGludCBhd2Fjc19yYXRlX2luZGV4Oworc3RhdGljIGludCBhd2Fjc19zdWJmcmFtZTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUqIGF3YWNzX25vZGU7CitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlKiBpMnNfbm9kZTsKKworc3RhdGljIGNoYXIgYXdhY3NfbmFtZVs2NF07CitzdGF0aWMgaW50IGF3YWNzX3JldmlzaW9uOworc3RhdGljIGludCBhd2Fjc19zbGVlcGluZzsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGRtYXNvdW5kX3NlbSk7CisKK3N0YXRpYyBpbnQgc291bmRfZGV2aWNlX2lkOwkJLyogZXhpc3RzIGFmdGVyIGlNYWMgcmV2QSAqLworc3RhdGljIGludCBod19jYW5fYnl0ZXN3YXAgPSAxIDsJLyogbW9zdCBwbWFjIHNvdW5kIGgvdyBjYW4gKi8KKworLyogbW9kZWwgaW5mbyAqLworLyogVG8gYmUgcmVwbGFjZWQgd2l0aCBiZXR0ZXIgaW50ZXJhY3Rpb24gd2l0aCBwbWFjX2ZlYXR1cmUuYyAqLworc3RhdGljIGludCBpc19wYm9va18zWDAwOworc3RhdGljIGludCBpc19wYm9va19nMzsKKworLyogZXhwYW5zaW9uIGluZm8gKi8KK3N0YXRpYyBpbnQgaGFzX3BlcmNoOworc3RhdGljIGludCBoYXNfeml2YTsKKworLyogZm9yIGVhcmxpZXIgcG93ZXJib29rcyB3aGljaCBuZWVkIGZpZGRsaW5nIHdpdGggbWFjLWlvIHRvIGVuYWJsZQorICogY2QgZXRjLgorKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmxhdGNoX2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgY2hhciBfX2lvbWVtICptYWNpb19iYXNlOworCisvKgorICogU3BhY2UgZm9yIHRoZSBEQkRNQSBjb21tYW5kIGJsb2Nrcy4KKyAqLworc3RhdGljIHZvaWQgKmF3YWNzX3R4X2NtZF9zcGFjZTsKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICphd2Fjc190eF9jbWRzOworc3RhdGljIGludCBudW1iZXJfb2ZfdHhfY21kX2J1ZmZlcnM7CisKK3N0YXRpYyB2b2lkICphd2Fjc19yeF9jbWRfc3BhY2U7CitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqYXdhY3NfcnhfY21kczsKK3N0YXRpYyBpbnQgbnVtYmVyX29mX3J4X2NtZF9idWZmZXJzOworCisvKgorICogQ2FjaGVkIHZhbHVlcyBvZiBBV0FDUyByZWdpc3RlcnMgKHdlIGNhbid0IHJlYWQgdGhlbSkuCisgKiBFeGNlcHQgb24gdGhlIGJ1cmd1bmR5IChhbmQgc2NyZWFtZXIpLiBYWFgKKyAqLworCitpbnQgYXdhY3NfcmVnWzhdOworaW50IGF3YWNzX3JlZzFfc2F2ZTsKKworLyogdHJhY2tpbmcgdmFsdWVzIGZvciB0aGUgbWl4ZXIgY29udGVudHMKKyovCisKK3N0YXRpYyBpbnQgc3BrX3ZvbDsKK3N0YXRpYyBpbnQgbGluZV92b2w7CitzdGF0aWMgaW50IHBhc3N0aHJ1X3ZvbDsKKworc3RhdGljIGludCBpcF9nYWluOyAgICAgICAgICAgLyogbWljIHByZWFtcCBzZXR0aW5ncyAqLworc3RhdGljIGludCByZWNfbGV2ID0gMHg0NTQ1IDsgLyogZGVmYXVsdCBDRCBnYWluIDY5ICUgKi8KK3N0YXRpYyBpbnQgbWljX2xldjsKK3N0YXRpYyBpbnQgY2RfbGV2ID0gMHg2MzYzIDsgLyogOTkgJSAqLworc3RhdGljIGludCBsaW5lX2xldjsKKworc3RhdGljIGludCBoZHBfY29ubmVjdGVkOworCisvKgorICogU3R1ZmYgZm9yIG91dHB1dHRpbmcgYSBiZWVwLiAgVGhlIHZhbHVlcyByYW5nZSBmcm9tIC0zMjcgdG8gKzMyNworICogc28gd2UgY2FuIG11bHRpcGx5IGJ5IGFuIGFtcGxpdHVkZSBpbiB0aGUgcmFuZ2UgMC4uMTAwIHRvIGdldCBhCisgKiBzaWduZWQgc2hvcnQgdmFsdWUgdG8gcHV0IGluIHRoZSBvdXRwdXQgYnVmZmVyLgorICovCitzdGF0aWMgc2hvcnQgYmVlcF93Zm9ybVsyNTZdID0geworCTAsCTQwLAk3OSwJMTE3LAkxNTMsCTE4NywJMjE4LAkyNDUsCisJMjY5LAkyODgsCTMwNCwJMzE2LAkzMjMsCTMyNywJMzI3LAkzMjQsCisJMzE4LAkzMTAsCTI5OSwJMjg4LAkyNzUsCTI2MiwJMjQ5LAkyMzYsCisJMjI0LAkyMTMsCTIwNCwJMTk2LAkxOTAsCTE4NiwJMTgzLAkxODIsCisJMTgyLAkxODMsCTE4NiwJMTg5LAkxOTIsCTE5NiwJMjAwLAkyMDMsCisJMjA2LAkyMDgsCTIwOSwJMjA5LAkyMDksCTIwNywJMjA0LAkyMDEsCisJMTk3LAkxOTMsCTE4OCwJMTgzLAkxNzksCTE3NCwJMTcwLAkxNjYsCisJMTYzLAkxNjEsCTE2MCwJMTU5LAkxNTksCTE2MCwJMTYxLAkxNjIsCisJMTY0LAkxNjYsCTE2OCwJMTY5LAkxNzEsCTE3MSwJMTcxLAkxNzAsCisJMTY5LAkxNjcsCTE2MywJMTU5LAkxNTUsCTE1MCwJMTQ0LAkxMzksCisJMTMzLAkxMjgsCTEyMiwJMTE3LAkxMTMsCTExMCwJMTA3LAkxMDUsCisJMTAzLAkxMDMsCTEwMywJMTAzLAkxMDQsCTEwNCwJMTA1LAkxMDUsCisJMTA1LAkxMDMsCTEwMSwJOTcsCTkyLAk4NiwJNzgsCTY4LAorCTU4LAk0NSwJMzIsCTE4LAkzLAktMTEsCS0yNiwJLTQxLAorCS01NSwJLTY4LAktNzksCS04OCwJLTk1LAktMTAwLAktMTAyLAktMTAyLAorCS05OSwJLTkzLAktODUsCS03NSwJLTYyLAktNDgsCS0zMywJLTE2LAorCTAsCTE2LAkzMywJNDgsCTYyLAk3NSwJODUsCTkzLAorCTk5LAkxMDIsCTEwMiwJMTAwLAk5NSwJODgsCTc5LAk2OCwKKwk1NSwJNDEsCTI2LAkxMSwJLTMsCS0xOCwJLTMyLAktNDUsCisJLTU4LAktNjgsCS03OCwJLTg2LAktOTIsCS05NywJLTEwMSwJLTEwMywKKwktMTA1LAktMTA1LAktMTA1LAktMTA0LAktMTA0LAktMTAzLAktMTAzLAktMTAzLAorCS0xMDMsCS0xMDUsCS0xMDcsCS0xMTAsCS0xMTMsCS0xMTcsCS0xMjIsCS0xMjgsCisJLTEzMywJLTEzOSwJLTE0NCwJLTE1MCwJLTE1NSwJLTE1OSwJLTE2MywJLTE2NywKKwktMTY5LAktMTcwLAktMTcxLAktMTcxLAktMTcxLAktMTY5LAktMTY4LAktMTY2LAorCS0xNjQsCS0xNjIsCS0xNjEsCS0xNjAsCS0xNTksCS0xNTksCS0xNjAsCS0xNjEsCisJLTE2MywJLTE2NiwJLTE3MCwJLTE3NCwJLTE3OSwJLTE4MywJLTE4OCwJLTE5MywKKwktMTk3LAktMjAxLAktMjA0LAktMjA3LAktMjA5LAktMjA5LAktMjA5LAktMjA4LAorCS0yMDYsCS0yMDMsCS0yMDAsCS0xOTYsCS0xOTIsCS0xODksCS0xODYsCS0xODMsCisJLTE4MiwJLTE4MiwJLTE4MywJLTE4NiwJLTE5MCwJLTE5NiwJLTIwNCwJLTIxMywKKwktMjI0LAktMjM2LAktMjQ5LAktMjYyLAktMjc1LAktMjg4LAktMjk5LAktMzEwLAorCS0zMTgsCS0zMjQsCS0zMjcsCS0zMjcsCS0zMjMsCS0zMTYsCS0zMDQsCS0yODgsCisJLTI2OSwJLTI0NSwJLTIxOCwJLTE4NywJLTE1MywJLTExNywJLTc5LAktNDAsCit9OworCisvKiBiZWVwIHN1cHBvcnQgKi8KKyNkZWZpbmUgQkVFUF9TUkFURQkyMjA1MAkvKiAyMjA1MCBIeiBzYW1wbGUgcmF0ZSAqLworI2RlZmluZSBCRUVQX0JVRkxFTgk1MTIKKyNkZWZpbmUgQkVFUF9WT0xVTUUJMTUJLyogMCAtIDEwMCAqLworCitzdGF0aWMgaW50IGJlZXBfdm9sID0gQkVFUF9WT0xVTUU7CitzdGF0aWMgaW50IGJlZXBfcGxheWluZzsKK3N0YXRpYyBpbnQgYXdhY3NfYmVlcF9zdGF0ZTsKK3N0YXRpYyBzaG9ydCAqYmVlcF9idWY7CitzdGF0aWMgdm9pZCAqYmVlcF9kYmRtYV9jbWRfc3BhY2U7CitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqYmVlcF9kYmRtYV9jbWQ7CisKKy8qIEJ1cmd1bmR5IGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgYXdhY3NfYnVyZ3VuZHlfd2N3KHVuc2lnbmVkIGFkZHIsdW5zaWduZWQgbmV3dmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBhd2Fjc19idXJndW5keV9yY3codW5zaWduZWQgYWRkcik7CitzdGF0aWMgdm9pZCBhd2Fjc19idXJndW5keV93cml0ZV92b2x1bWUodW5zaWduZWQgYWRkcmVzcywgaW50IHZvbHVtZSk7CitzdGF0aWMgaW50IGF3YWNzX2J1cmd1bmR5X3JlYWRfdm9sdW1lKHVuc2lnbmVkIGFkZHJlc3MpOworc3RhdGljIHZvaWQgYXdhY3NfYnVyZ3VuZHlfd3JpdGVfbXZvbHVtZSh1bnNpZ25lZCBhZGRyZXNzLCBpbnQgdm9sdW1lKTsKK3N0YXRpYyBpbnQgYXdhY3NfYnVyZ3VuZHlfcmVhZF9tdm9sdW1lKHVuc2lnbmVkIGFkZHJlc3MpOworCisvKiB3ZSB3aWxsIGFsbG9jYXRlIGEgc2luZ2xlICdlbWVyZ2VuY3knIGRiZG1hIGNtZCBibG9jayB0byB1c2UgaWYgdGhlCisgICB0eCBzdGF0dXMgY29tZXMgdXAgIkRFQUQiLiAgVGhpcyBoYXBwZW5zIG9uIHNvbWUgUG93ZXJDb21wdXRpbmcgUG1hYworICAgY2xvbmVzLCBlaXRoZXIgb3dpbmcgdG8gYSBidWcgaW4gZGJkbWEgb3Igc29tZSBpbnRlcmFjdGlvbiBiZXR3ZWVuCisgICBJREUgYW5kIHNvdW5kLiAgSG93ZXZlciwgdGhpcyBtZWFzdXJlIHdvdWxkIGRlYWwgd2l0aCBERUFEIHN0YXR1cyBpZgorICAgaWYgYXBwZWFyZWQgZWxzZXdoZXJlLgorCisgICBmb3IgdGhlIHNha2Ugb2YgbWVtb3J5IGVmZmljaWVuY3kgd2UnbGwgYWxsb2NhdGUgdGhpcyBjbWQgYXMgcGFydCBvZgorICAgdGhlIGJlZXAgY21kIHN0dWZmLgorKi8KKworc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmVtZXJnZW5jeV9kYmRtYV9jbWQ7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworLyoKKyAqIFN0dWZmIGZvciByZXN0b3JpbmcgYWZ0ZXIgYSBzbGVlcC4KKyAqLworc3RhdGljIGludCBhd2Fjc19zbGVlcF9ub3RpZnkoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pOworc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciBhd2Fjc19zbGVlcF9ub3RpZmllciA9IHsKKwlhd2Fjc19zbGVlcF9ub3RpZnksIFNMRUVQX0xFVkVMX1NPVU5ELAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworCisvKiBmb3IgKHNvZnQpIHNhbXBsZSByYXRlIHRyYW5zbGF0aW9ucyAqLworaW50IGV4cGFuZF9iYWw7CQkvKiBCYWxhbmNlIGZhY3RvciBmb3IgZXhwYW5kaW5nIChub3Qgdm9sdW1lISkgKi8KK2ludCBleHBhbmRfcmVhZF9iYWw7CS8qIEJhbGFuY2UgZmFjdG9yIGZvciBleHBhbmRpbmcgcmVhZHMgKG5vdCB2b2x1bWUhKSAqLworCisvKioqIExvdyBsZXZlbCBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkICpQTWFjQWxsb2ModW5zaWduZWQgaW50IHNpemUsIGludCBmbGFncyk7CitzdGF0aWMgdm9pZCBQTWFjRnJlZSh2b2lkICpwdHIsIHVuc2lnbmVkIGludCBzaXplKTsKK3N0YXRpYyBpbnQgUE1hY0lycUluaXQodm9pZCk7CisjaWZkZWYgTU9EVUxFCitzdGF0aWMgdm9pZCBQTWFjSXJxQ2xlYW51cCh2b2lkKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgUE1hY1NpbGVuY2Uodm9pZCk7CitzdGF0aWMgdm9pZCBQTWFjSW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgUE1hY1NldEZvcm1hdChpbnQgZm9ybWF0KTsKK3N0YXRpYyBpbnQgUE1hY1NldFZvbHVtZShpbnQgdm9sdW1lKTsKK3N0YXRpYyB2b2lkIFBNYWNQbGF5KHZvaWQpOworc3RhdGljIHZvaWQgUE1hY1JlY29yZCh2b2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBwbWFjX2F3YWNzX3R4X2ludHIoaW50IGlycSwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBwbWFjX2F3YWNzX3J4X2ludHIoaW50IGlycSwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBwbWFjX2F3YWNzX2ludHIoaW50IGlycSwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGF3YWNzX3dyaXRlKGludCB2YWwpOworc3RhdGljIGludCBhd2Fjc19nZXRfdm9sdW1lKGludCByZWcsIGludCBsc2hpZnQpOworc3RhdGljIGludCBhd2Fjc192b2x1bWVfc2V0dGVyKGludCB2b2x1bWUsIGludCBuLCBpbnQgbXV0ZSwgaW50IGxzaGlmdCk7CisKKworLyoqKiBNaWQgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBQTWFjTWl4ZXJJb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpOworc3RhdGljIGludCBQTWFjV3JpdGVTcVNldHVwKHZvaWQpOworc3RhdGljIGludCBQTWFjUmVhZFNxU2V0dXAodm9pZCk7CitzdGF0aWMgdm9pZCBQTWFjQWJvcnRSZWFkKHZvaWQpOworCitleHRlcm4gVFJBTlMgdHJhbnNBd2Fjc05vcm1hbCA7CitleHRlcm4gVFJBTlMgdHJhbnNBd2Fjc0V4cGFuZCA7CitleHRlcm4gVFJBTlMgdHJhbnNBd2Fjc05vcm1hbFJlYWQgOworZXh0ZXJuIFRSQU5TIHRyYW5zQXdhY3NFeHBhbmRSZWFkIDsKKworZXh0ZXJuIGludCBkYWNhX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBkYWNhX2NsZWFudXAodm9pZCk7CitleHRlcm4gaW50IGRhY2Ffc2V0X3ZvbHVtZSh1aW50IGxlZnRfdm9sLCB1aW50IHJpZ2h0X3ZvbCk7CitleHRlcm4gdm9pZCBkYWNhX2dldF92b2x1bWUodWludCAqIGxlZnRfdm9sLCB1aW50ICAqcmlnaHRfdm9sKTsKK2V4dGVybiBpbnQgZGFjYV9lbnRlcl9zbGVlcCh2b2lkKTsKK2V4dGVybiBpbnQgZGFjYV9sZWF2ZV9zbGVlcCh2b2lkKTsKKworI2RlZmluZSBUUllfTE9DSygpCVwKKwlpZiAoKHJjID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZkbWFzb3VuZF9zZW0pKSAhPSAwKQlcCisJCXJldHVybiByYzsKKyNkZWZpbmUgTE9DSygpCQlkb3duKCZkbWFzb3VuZF9zZW0pOworCisjZGVmaW5lIFVOTE9DSygpCXVwKCZkbWFzb3VuZF9zZW0pOworCisvKiBXZSB1c2UgZGlmZmVyZW50IHZlcnNpb25zIHRoYXQgdGhlIG9uZXMgcHJvdmlkZWQgaW4gZG1hc291bmQuaAorICogCisgKiBGSVhNRTogVXNlIGRpZmZlcmVudCBuYW1lcyA7KQorICovCisjdW5kZWYgSU9DVExfSU4KKyN1bmRlZiBJT0NUTF9PVVQKKworI2RlZmluZSBJT0NUTF9JTihhcmcsIHJldCkJXAorCXJjID0gZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKShhcmcpKTsgXAorCWlmIChyYykgYnJlYWs7CisjZGVmaW5lIElPQ1RMX09VVChhcmcsIHJldCkJXAorCWlvY3RsX3JldHVybjIoKGludCBfX3VzZXIgKikoYXJnKSwgcmV0KQorCitzdGF0aWMgaW5saW5lIGludCBpb2N0bF9yZXR1cm4yKGludCBfX3VzZXIgKmFkZHIsIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gdmFsdWUgPCAwID8gdmFsdWUgOiBwdXRfdXNlcih2YWx1ZSwgYWRkcik7Cit9CisKKworLyoqKiBBRSAtIFRVTUJMRVIgLyBTTkFQUEVSIFNUQVJUICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbnQgZ3Bpb19hdWRpb19yZXNldCwgZ3Bpb19hdWRpb19yZXNldF9wb2w7CitpbnQgZ3Bpb19hbXBfbXV0ZSwgZ3Bpb19hbXBfbXV0ZV9wb2w7CitpbnQgZ3Bpb19oZWFkcGhvbmVfbXV0ZSwgZ3Bpb19oZWFkcGhvbmVfbXV0ZV9wb2w7CitpbnQgZ3Bpb19oZWFkcGhvbmVfZGV0ZWN0LCBncGlvX2hlYWRwaG9uZV9kZXRlY3RfcG9sOworaW50IGdwaW9faGVhZHBob25lX2lycTsKKworaW50CitzZXR1cF9hdWRpb19ncGlvKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIqIGNvbXBhdGlibGUsIGludCAqZ3Bpb19hZGRyLCBpbnQqIGdwaW9fcG9sKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdTMyKiBwcDsKKwkKKwlucCA9IGZpbmRfZGV2aWNlcygiZ3BpbyIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJbnAgPSBucC0+Y2hpbGQ7CisJd2hpbGUobnAgIT0gMCkgeworCQlpZiAobmFtZSkgeworCQkJY2hhciAqcHJvcGVydHkgPSBnZXRfcHJvcGVydHkobnAsImF1ZGlvLWdwaW8iLE5VTEwpOworCQkJaWYgKHByb3BlcnR5ICE9IDAgJiYgc3RyY21wKHByb3BlcnR5LG5hbWUpID09IDApCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoY29tcGF0aWJsZSAmJiBkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgY29tcGF0aWJsZSkpCisJCQlicmVhazsKKwkJbnAgPSBucC0+c2libGluZzsKKwl9CisJaWYgKCFucCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcHAgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAiQUFQTCxhZGRyZXNzIiwgTlVMTCk7CisJaWYgKCFwcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJKmdwaW9fYWRkciA9ICgqcHApICYgMHgwMDAwZmZmZjsKKwlwcCA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJhdWRpby1ncGlvLWFjdGl2ZS1zdGF0ZSIsIE5VTEwpOworCWlmIChwcCkKKwkJKmdwaW9fcG9sID0gKnBwOworCWVsc2UKKwkJKmdwaW9fcG9sID0gMTsKKwlpZiAobnAtPm5faW50cnMgPiAwKQorCQlyZXR1cm4gbnAtPmludHJzWzBdLmxpbmU7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVfYXVkaW9fZ3BpbyhpbnQgZ3Bpb19hZGRyLCBpbnQgZGF0YSkKK3sKKwlpZiAoIWdwaW9fYWRkcikKKwkJcmV0dXJuOworCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1dSSVRFX0dQSU8sIE5VTEwsIGdwaW9fYWRkciwgZGF0YSA/IDB4MDUgOiAweDA0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3JlYWRfYXVkaW9fZ3BpbyhpbnQgZ3Bpb19hZGRyKQoreworCWlmICghZ3Bpb19hZGRyKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKChwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9SRUFEX0dQSU8sIE5VTEwsIGdwaW9fYWRkciwgMCkgJiAweDAyKSAhPTApOworfQorCisvKgorICogSGVhZHBob25lIGludGVycnVwdCB2aWEgR1BJTyAoVHVtYmxlciwgU25hcHBlciwgREFDQSkKKyAqLworc3RhdGljIGlycXJldHVybl90CitoZWFkcGhvbmVfaW50cihpbnQgaXJxLCB2b2lkICpkZXZpZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJaWYgKHJlYWRfYXVkaW9fZ3BpbyhncGlvX2hlYWRwaG9uZV9kZXRlY3QpID09IGdwaW9faGVhZHBob25lX2RldGVjdF9wb2wpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQXVkaW8gamFjayBwbHVnZ2VkLCBtdXRpbmcgc3BlYWtlcnMuXG4iKTsKKwkJd3JpdGVfYXVkaW9fZ3BpbyhncGlvX2hlYWRwaG9uZV9tdXRlLCAhZ3Bpb19oZWFkcGhvbmVfbXV0ZV9wb2wpOworCQl3cml0ZV9hdWRpb19ncGlvKGdwaW9fYW1wX211dGUsIGdwaW9fYW1wX211dGVfcG9sKTsKKwkJdGFzX291dHB1dF9kZXZpY2VfY2hhbmdlKHNvdW5kX2RldmljZV9pZCxUQVNfT1VUUFVUX0hFQURQSE9ORVMsMCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQXVkaW8gamFjayB1bnBsdWdnZWQsIGVuYWJsaW5nIHNwZWFrZXJzLlxuIik7CisJCXdyaXRlX2F1ZGlvX2dwaW8oZ3Bpb19hbXBfbXV0ZSwgIWdwaW9fYW1wX211dGVfcG9sKTsKKwkJd3JpdGVfYXVkaW9fZ3BpbyhncGlvX2hlYWRwaG9uZV9tdXRlLCBncGlvX2hlYWRwaG9uZV9tdXRlX3BvbCk7CisJCXRhc19vdXRwdXRfZGV2aWNlX2NoYW5nZShzb3VuZF9kZXZpY2VfaWQsVEFTX09VVFBVVF9JTlRFUk5BTF9TUEtSLDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qIEluaXRpYWxpemUgdHVtYmxlciAqLworCitzdGF0aWMgaW50Cit0YXNfZG1hc291bmRfaW5pdCh2b2lkKQoreworCXNldHVwX2F1ZGlvX2dwaW8oCisJCSJhdWRpby1ody1yZXNldCIsCisJCU5VTEwsCisJCSZncGlvX2F1ZGlvX3Jlc2V0LAorCQkmZ3Bpb19hdWRpb19yZXNldF9wb2wpOworCXNldHVwX2F1ZGlvX2dwaW8oCisJCSJhbXAtbXV0ZSIsCisJCU5VTEwsCisJCSZncGlvX2FtcF9tdXRlLAorCQkmZ3Bpb19hbXBfbXV0ZV9wb2wpOworCXNldHVwX2F1ZGlvX2dwaW8oImhlYWRwaG9uZS1tdXRlIiwKKwkJTlVMTCwKKwkJJmdwaW9faGVhZHBob25lX211dGUsCisJCSZncGlvX2hlYWRwaG9uZV9tdXRlX3BvbCk7CisJZ3Bpb19oZWFkcGhvbmVfaXJxID0gc2V0dXBfYXVkaW9fZ3BpbygKKwkJImhlYWRwaG9uZS1kZXRlY3QiLAorCQlOVUxMLAorCQkmZ3Bpb19oZWFkcGhvbmVfZGV0ZWN0LAorCQkmZ3Bpb19oZWFkcGhvbmVfZGV0ZWN0X3BvbCk7CisJLyogRml4IHNvbWUgYnJva2VuIE9GIGVudHJpZXMgaW4gZGVza3RvcCBtYWNoaW5lcyAqLworCWlmICghZ3Bpb19oZWFkcGhvbmVfaXJxKQorCQlncGlvX2hlYWRwaG9uZV9pcnEgPSBzZXR1cF9hdWRpb19ncGlvKAorCQkJTlVMTCwKKwkJCSJrZXl3ZXN0LWdwaW8xNSIsCisJCQkmZ3Bpb19oZWFkcGhvbmVfZGV0ZWN0LAorCQkJJmdwaW9faGVhZHBob25lX2RldGVjdF9wb2wpOworCisJd3JpdGVfYXVkaW9fZ3BpbyhncGlvX2F1ZGlvX3Jlc2V0LCBncGlvX2F1ZGlvX3Jlc2V0X3BvbCk7CisJbXNsZWVwKDEwMCk7CisJd3JpdGVfYXVkaW9fZ3BpbyhncGlvX2F1ZGlvX3Jlc2V0LCAhZ3Bpb19hdWRpb19yZXNldF9wb2wpOworCW1zbGVlcCgxMDApOworICAJaWYgKGdwaW9faGVhZHBob25lX2lycSkgeworCQlpZiAocmVxdWVzdF9pcnEoZ3Bpb19oZWFkcGhvbmVfaXJxLGhlYWRwaG9uZV9pbnRyLDAsIkhlYWRwaG9uZSBkZXRlY3QiLE5VTEwpIDwgMCkgeworICAgIAkJCXByaW50ayhLRVJOX0VSUiAidHVtYmxlcjogQ2FuJ3QgcmVxdWVzdCBoZWFkcGhvbmUgaW50ZXJydXB0XG4iKTsKKyAgICAJCQlncGlvX2hlYWRwaG9uZV9pcnEgPSAwOworICAgIAkJfSBlbHNlIHsKKwkJCXU4IHZhbDsKKwkJCS8qIEFjdGl2YXRlIGhlYWRwaG9uZSBzdGF0dXMgaW50ZXJydXB0cyAqLworCQkJdmFsID0gcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfUkVBRF9HUElPLCBOVUxMLCBncGlvX2hlYWRwaG9uZV9kZXRlY3QsIDApOworCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfV1JJVEVfR1BJTywgTlVMTCwgZ3Bpb19oZWFkcGhvbmVfZGV0ZWN0LCB2YWwgfCAweDgwKTsKKwkJCS8qIFRyaWdnZXIgaXQgKi8KKyAgCQkJaGVhZHBob25lX2ludHIoMCxOVUxMLE5VTEwpOworICAJCX0KKyAgCX0KKyAgCWlmICghZ3Bpb19oZWFkcGhvbmVfaXJxKSB7CisgIAkJLyogU29tZSBtYWNoaW5lIGVudGVyIHRoaXMgY2FzZSA/ICovCisgIAkJcHJpbnRrKEtFUk5fV0FSTklORyAidHVtYmxlcjogSGVhZHBob25lIGRldGVjdCBJUlEgbm90IGZvdW5kLCBlbmFibGluZyBhbGwgb3V0cHV0cyAhXG4iKTsKKyAgCQl3cml0ZV9hdWRpb19ncGlvKGdwaW9fYW1wX211dGUsICFncGlvX2FtcF9tdXRlX3BvbCk7CisgIAkJd3JpdGVfYXVkaW9fZ3BpbyhncGlvX2hlYWRwaG9uZV9tdXRlLCAhZ3Bpb19oZWFkcGhvbmVfbXV0ZV9wb2wpOworICAJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3Rhc19kbWFzb3VuZF9jbGVhbnVwKHZvaWQpCit7CisJaWYgKGdwaW9faGVhZHBob25lX2lycSkKKwkJZnJlZV9pcnEoZ3Bpb19oZWFkcGhvbmVfaXJxLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworLyogV2UgZG9uJ3Qgc3VwcG9ydCA0OGsgeWV0ICovCitzdGF0aWMgaW50IHRhc19mcmVxc1sxXSA9IHsgNDQxMDAgfSA7CitzdGF0aWMgaW50IHRhc19mcmVxc19va1sxXSA9IHsgMSB9IDsKKworLyogZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHJlYWxseSAtIGp1c3QgaGF2ZSB0byBsZWF2ZSBpdCB3aGVyZQorICogT0YgbGVmdCB0aGluZ3MKKyovCisKK3N0YXRpYyBpbnQKK3Rhc19zZXRfZnJhbWVfcmF0ZSh2b2lkKQoreworCWlmIChpMnMpIHsKKwkJb3V0X2xlMzIoaTJzICsgKEkyU19SRUdfU0VSSUFMX0ZPUk1BVCA+PiAyKSwgMHg0MTE5MDAwMCk7CisJCW91dF9sZTMyKGkycyArIChJMlNfUkVHX0RBVEFXT1JEX1NJWkVTID4+IDIpLCAweDAyMDAwMjAwKTsKKwl9CisJZG1hc291bmQuaGFyZC5zcGVlZCA9IDQ0MTAwIDsKKwlhd2Fjc19yYXRlX2luZGV4ID0gMCA7CisJcmV0dXJuIDQ0MTAwIDsKK30KKworc3RhdGljIGludAordGFzX21peGVyX2lvY3RsKHVfaW50IGNtZCwgdV9sb25nIGFyZykKK3sKKwlpbnQgX191c2VyICphcmdwID0gKGludCBfX3VzZXIgKilhcmc7CisJaW50IGRhdGE7CisJaW50IHJjOworCisgICAgICAgIHJjPXRhc19kZXZpY2VfaW9jdGwoY21kLCBhcmcpOworICAgICAgICBpZiAocmMgIT0gLUVJTlZBTCkgeworICAgICAgICAJcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChjbWQgJiB+MHhmZikgPT0gTUlYRVJfV1JJVEUoMCkgJiYKKyAgICAgICAgICAgIHRhc19zdXBwb3J0ZWRfbWl4ZXJzKCkgJiAoMTw8KGNtZCAmIDB4ZmYpKSkgeworCQlyYyA9IGdldF91c2VyKGRhdGEsIGFyZ3ApOworICAgICAgICAgICAgICAgIGlmIChyYzwwKSByZXR1cm4gcmM7CisJCXRhc19zZXRfbWl4ZXJfbGV2ZWwoY21kICYgMHhmZiwgZGF0YSk7CisJCXRhc19nZXRfbWl4ZXJfbGV2ZWwoY21kICYgMHhmZiwgJmRhdGEpOworCQlyZXR1cm4gaW9jdGxfcmV0dXJuMihhcmdwLCBkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNtZCAmIH4weGZmKSA9PSBNSVhFUl9SRUFEKDApICYmCisgICAgICAgICAgICB0YXNfc3VwcG9ydGVkX21peGVycygpICYgKDE8PChjbWQgJiAweGZmKSkpIHsKKwkJdGFzX2dldF9taXhlcl9sZXZlbChjbWQgJiAweGZmLCAmZGF0YSk7CisJCXJldHVybiBpb2N0bF9yZXR1cm4yKGFyZ3AsIGRhdGEpOworICAgICAgICB9CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0s6CisJCWRhdGEgPSB0YXNfc3VwcG9ydGVkX21peGVycygpIHwgU09VTkRfTUFTS19TUEVBS0VSOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUzoKKwkJZGF0YSA9IHRhc19zdGVyZW9fbWl4ZXJzKCk7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9DQVBTOgorCQlyYyA9IElPQ1RMX09VVChhcmcsIDApOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSzoKKwkJLy8gWFhYIEZJWE1FOiBmaW5kIGEgd2F5IHRvIGNoZWNrIHdoYXQgaXMgcmVhbGx5IGF2YWlsYWJsZSAqLworCQlkYXRhID0gU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19NSUM7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkM6CisJCWlmIChhd2Fjc19yZWdbMF0gJiBNQVNLX01VWF9BVURJTikKKwkJCWRhdGEgfD0gU09VTkRfTUFTS19MSU5FOworCQlpZiAoYXdhY3NfcmVnWzBdICYgTUFTS19NVVhfTUlDKQorCQkJZGF0YSB8PSBTT1VORF9NQVNLX01JQzsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9SRUNTUkM6CisgCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlkYXRhID0wOworIAkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKyAJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfU1BFQUtFUjoJLyogcmVhbGx5IGJlbGwgdm9sdW1lICovCisgCQlJT0NUTF9JTihhcmcsIGRhdGEpOworIAkJYmVlcF92b2wgPSBkYXRhICYgMHhmZjsKKyAJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9TUEVBS0VSOgorCQlyYyA9IElPQ1RMX09VVChhcmcsIChiZWVwX3ZvbDw8OCkgfCBiZWVwX3ZvbCk7CisgCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX09VVE1BU0s6CisJY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19pbml0Cit0YXNfaW5pdF9mcmFtZV9yYXRlcyh1bnNpZ25lZCBpbnQgKnByb3AsIHVuc2lnbmVkIGludCBsKQoreworCWludCBpIDsKKwlpZiAocHJvcCkgeworCQlmb3IgKGk9MDsgaTwxOyBpKyspCisJCQl0YXNfZnJlcXNfb2tbaV0gPSAwOworCQlmb3IgKGwgLz0gc2l6ZW9mKGludCk7IGwgPiAwOyAtLWwpIHsKKwkJCXVuc2lnbmVkIGludCByID0gKnByb3ArKzsKKwkJCS8qIEFwcGxlICdGaXhlZCcgZm9ybWF0ICovCisJCQlpZiAociA+PSAweDEwMDAwKQorCQkJCXIgPj49IDE2OworCQkJZm9yIChpID0gMDsgaSA8IDE7ICsraSkgeworCQkJCWlmIChyID09IHRhc19mcmVxc1tpXSkgeworCQkJCQl0YXNfZnJlcXNfb2tbaV0gPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyogZWxzZSB3ZSBhc3N1bWUgdGhhdCBhbGwgdGhlIHJhdGVzIGFyZSBhdmFpbGFibGUgKi8KK30KKworCisvKioqIEFFIC0gVFVNQkxFUiAvIFNOQVBQRVIgRU5EICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qKiogTG93IGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFBDSSBQb3dlck1hYywgd2l0aCBBV0FDUywgU2NyZWFtZXIsIEJ1cmd1bmR5LCBEQUNBIG9yIFR1bWJsZXIgYW5kIERCRE1BLgorICovCitzdGF0aWMgdm9pZCAqUE1hY0FsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBQTWFjRnJlZSh2b2lkICpwdHIsIHVuc2lnbmVkIGludCBzaXplKQoreworCWtmcmVlKHB0cik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IFBNYWNJcnFJbml0KHZvaWQpCit7CisJaWYgKGF3YWNzKQorCQlpZiAocmVxdWVzdF9pcnEoYXdhY3NfaXJxLCBwbWFjX2F3YWNzX2ludHIsIDAsICJCdWlsdC1pbiBTb3VuZCBtaXNjIiwgTlVMTCkpCisJCQlyZXR1cm4gMDsKKwlpZiAocmVxdWVzdF9pcnEoYXdhY3NfdHhfaXJxLCBwbWFjX2F3YWNzX3R4X2ludHIsIDAsICJCdWlsdC1pbiBTb3VuZCBvdXQiLCBOVUxMKQorCSAgICB8fCByZXF1ZXN0X2lycShhd2Fjc19yeF9pcnEsIHBtYWNfYXdhY3NfcnhfaW50ciwgMCwgIkJ1aWx0LWluIFNvdW5kIGluIiwgTlVMTCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgdm9pZCBQTWFjSXJxQ2xlYW51cCh2b2lkKQoreworCS8qIHR1cm4gb2ZmIGlucHV0ICYgb3V0cHV0IGRtYSAqLworCURCRE1BX0RPX1NUT1AoYXdhY3NfdHhkbWEpOworCURCRE1BX0RPX1NUT1AoYXdhY3NfcnhkbWEpOworCisJaWYgKGF3YWNzKQorCQkvKiBkaXNhYmxlIGludGVycnVwdHMgZnJvbSBhd2FjcyBpbnRlcmZhY2UgKi8KKwkJb3V0X2xlMzIoJmF3YWNzLT5jb250cm9sLCBpbl9sZTMyKCZhd2Fjcy0+Y29udHJvbCkgJiAweGZmZik7CisJCisJLyogU3dpdGNoIG9mZiB0aGUgc291bmQgY2xvY2sgKi8KKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9TT1VORF9DSElQX0VOQUJMRSwgYXdhY3Nfbm9kZSwgMCwgMCk7CisJLyogTWFrZSBzdXJlIHByb3BlciBiaXRzIGFyZSBzZXQgb24gcGlzbW8gJiB0aXBiICovCisJaWYgKChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazMsMSIpIHx8CisJICAgIG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMywyIikpICYmIGF3YWNzKSB7CisJCWF3YWNzX3JlZ1sxXSB8PSBNQVNLX1BBUk9VVDAgfCBNQVNLX1BBUk9VVDE7CisJCWF3YWNzX3dyaXRlKE1BU0tfQUREUjEgfCBhd2Fjc19yZWdbMV0pOworCQltc2xlZXAoMjAwKTsKKwl9CisJaWYgKGF3YWNzKQorCQlmcmVlX2lycShhd2Fjc19pcnEsIE5VTEwpOworCWZyZWVfaXJxKGF3YWNzX3R4X2lycSwgTlVMTCk7CisJZnJlZV9pcnEoYXdhY3NfcnhfaXJxLCBOVUxMKTsKKwkKKwlpZiAoYXdhY3MpCisJCWlvdW5tYXAoYXdhY3MpOworCWlmIChpMnMpCisJCWlvdW5tYXAoaTJzKTsKKwlpb3VubWFwKGF3YWNzX3R4ZG1hKTsKKwlpb3VubWFwKGF3YWNzX3J4ZG1hKTsKKworCXJlbGVhc2VfT0ZfcmVzb3VyY2UoYXdhY3Nfbm9kZSwgMCk7CisJcmVsZWFzZV9PRl9yZXNvdXJjZShhd2Fjc19ub2RlLCAxKTsKKwlyZWxlYXNlX09GX3Jlc291cmNlKGF3YWNzX25vZGUsIDIpOworCisJaWYgKGF3YWNzX3R4X2NtZF9zcGFjZSkKKwkJa2ZyZWUoYXdhY3NfdHhfY21kX3NwYWNlKTsKKwlpZiAoYXdhY3NfcnhfY21kX3NwYWNlKQorCQlrZnJlZShhd2Fjc19yeF9jbWRfc3BhY2UpOworCWlmIChiZWVwX2RiZG1hX2NtZF9zcGFjZSkKKwkJa2ZyZWUoYmVlcF9kYmRtYV9jbWRfc3BhY2UpOworCWlmIChiZWVwX2J1ZikKKwkJa2ZyZWUoYmVlcF9idWYpOworI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisJcG11X3VucmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIoJmF3YWNzX3NsZWVwX25vdGlmaWVyKTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCitzdGF0aWMgdm9pZCBQTWFjU2lsZW5jZSh2b2lkKQoreworCS8qIHR1cm4gb2ZmIG91dHB1dCBkbWEgKi8KKwlEQkRNQV9ET19TVE9QKGF3YWNzX3R4ZG1hKTsKK30KKworLyogZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHJlYWxseSAtIGp1c3QgaGF2ZSB0byBsZWF2ZSBpdCB3aGVyZQorICogT0YgbGVmdCB0aGluZ3MKKyovCisKK3N0YXRpYyBpbnQgZGFjYV9zZXRfZnJhbWVfcmF0ZSh2b2lkKQoreworCWlmIChpMnMpIHsKKwkJb3V0X2xlMzIoaTJzICsgKEkyU19SRUdfU0VSSUFMX0ZPUk1BVCA+PiAyKSwgMHg0MTE5MDAwMCk7CisJCW91dF9sZTMyKGkycyArIChJMlNfUkVHX0RBVEFXT1JEX1NJWkVTID4+IDIpLCAweDAyMDAwMjAwKTsKKwl9CisJZG1hc291bmQuaGFyZC5zcGVlZCA9IDQ0MTAwIDsKKwlhd2Fjc19yYXRlX2luZGV4ID0gMCA7CisJcmV0dXJuIDQ0MTAwIDsKK30KKworc3RhdGljIGludCBhd2Fjc19mcmVxc1s4XSA9IHsKKwk0NDEwMCwgMjk0MDAsIDIyMDUwLCAxNzY0MCwgMTQ3MDAsIDExMDI1LCA4ODIwLCA3MzUwCit9Oworc3RhdGljIGludCBhd2Fjc19mcmVxc19va1s4XSA9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9OworCitzdGF0aWMgaW50Cithd2Fjc19zZXRfZnJhbWVfcmF0ZShpbnQgZGVzaXJlZCwgaW50IGNhdGNoX3IpCit7CisJaW50IHRvbGVyYW5jZSwgaSA9IDggOworCS8qCisJICogSWYgd2UgaGF2ZSBhIHNhbXBsZSByYXRlIHdoaWNoIGlzIHdpdGhpbiBjYXRjaFJhZGl1cyBwZXJjZW50CisJICogb2YgdGhlIHJlcXVlc3RlZCB2YWx1ZSwgd2UgZG9uJ3QgaGF2ZSB0byBleHBhbmQgdGhlIHNhbXBsZXMuCisJICogT3RoZXJ3aXNlIGNob29zZSB0aGUgbmV4dCBoaWdoZXIgcmF0ZS4KKwkgKiBOLkIuOiBidXJndW5keSBhd2FjcyBvbmx5IHdvcmtzIGF0IDQ0MTAwIEh6LgorCSAqLworCWRvIHsKKwkJdG9sZXJhbmNlID0gY2F0Y2hfciAqIGF3YWNzX2ZyZXFzWy0taV0gLyAxMDA7CisJCWlmIChhd2Fjc19mcmVxc19va1tpXQorCQkgICAgJiYgZG1hc291bmQuc29mdC5zcGVlZCA8PSBhd2Fjc19mcmVxc1tpXSArIHRvbGVyYW5jZSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKGkgPiAwKTsKKwlkbWFzb3VuZC5oYXJkLnNwZWVkID0gYXdhY3NfZnJlcXNbaV07CisJYXdhY3NfcmF0ZV9pbmRleCA9IGk7CisKKwlvdXRfbGUzMigmYXdhY3MtPmNvbnRyb2wsIE1BU0tfSUVQQyB8IChpIDw8IDgpIHwgMHgxMSApOworCWF3YWNzX3JlZ1sxXSA9IChhd2Fjc19yZWdbMV0gJiB+TUFTS19TQU1QTEVSQVRFKSB8IChpIDw8IDMpOworCWF3YWNzX3dyaXRlKGF3YWNzX3JlZ1sxXSB8IE1BU0tfQUREUjEpOworCXJldHVybiBkbWFzb3VuZC5oYXJkLnNwZWVkOworfQorCitzdGF0aWMgaW50CitidXJndW5keV9zZXRfZnJhbWVfcmF0ZSh2b2lkKQoreworCWF3YWNzX3JhdGVfaW5kZXggPSAwIDsKKwlhd2Fjc19yZWdbMV0gPSAoYXdhY3NfcmVnWzFdICYgfk1BU0tfU0FNUExFUkFURSkgOworCS8qIFhYWCBkaXNhYmxlIGVycm9yIGludGVycnVwdCBvbiBidXJndW5keSBmb3Igbm93ICovCisJb3V0X2xlMzIoJmF3YWNzLT5jb250cm9sLCBNQVNLX0lFUEMgfCAwIHwgMHgxMSB8IE1BU0tfSUVFKTsKKwlyZXR1cm4gNDQxMDAgOworfQorCitzdGF0aWMgaW50CitzZXRfZnJhbWVfcmF0ZShpbnQgZGVzaXJlZCwgaW50IGNhdGNoX3IpCit7CisJc3dpdGNoIChhd2Fjc19yZXZpc2lvbikgeworCQljYXNlIEFXQUNTX0JVUkdVTkRZOgorCQkJZG1hc291bmQuaGFyZC5zcGVlZCA9IGJ1cmd1bmR5X3NldF9mcmFtZV9yYXRlKCk7CisJCQlicmVhayA7CisJCWNhc2UgQVdBQ1NfVFVNQkxFUjoKKwkJY2FzZSBBV0FDU19TTkFQUEVSOgorCQkJZG1hc291bmQuaGFyZC5zcGVlZCA9IHRhc19zZXRfZnJhbWVfcmF0ZSgpOworCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX0RBQ0E6CisJCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0KKwkJCSAgZGFjYV9zZXRfZnJhbWVfcmF0ZSgpOworCQkJYnJlYWsgOworCQlkZWZhdWx0OgorCQkJZG1hc291bmQuaGFyZC5zcGVlZCA9IGF3YWNzX3NldF9mcmFtZV9yYXRlKGRlc2lyZWQsCisJCQkJCQljYXRjaF9yKTsKKwkJCWJyZWFrIDsKKwl9CisJcmV0dXJuIGRtYXNvdW5kLmhhcmQuc3BlZWQgOworfQorCitzdGF0aWMgdm9pZAorYXdhY3NfcmVjYWxpYnJhdGUodm9pZCkKK3sKKwkvKiBTb3JyeSBmb3IgdGhlIGhvcnJpYmxlIGRlbGF5cy4uLiBJIGhvcGUgdG8gZ2V0IHRoYXQgaW1wcm92ZWQKKwkgKiBieSBtYWtpbmcgdGhlIHdob2xlIFBNIHByb2Nlc3MgYXN5bmNocm9ub3VzIGluIGEgZnV0dXJlIHZlcnNpb24KKwkgKi8KKwltc2xlZXAoNzUwKTsKKwlhd2Fjc19yZWdbMV0gfD0gTUFTS19DTVVURSB8IE1BU0tfQU1VVEU7CisJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzFdIHwgTUFTS19SRUNBTElCUkFURSB8IE1BU0tfQUREUjEpOworCW1zbGVlcCgxMDAwKTsKKwlhd2Fjc193cml0ZShhd2Fjc19yZWdbMV0gfCBNQVNLX0FERFIxKTsKK30KKworc3RhdGljIHZvaWQgUE1hY0luaXQodm9pZCkKK3sKKwlpbnQgdG9sZXJhbmNlOworCisJc3dpdGNoIChkbWFzb3VuZC5zb2Z0LmZvcm1hdCkgeworCSAgICBjYXNlIEFGTVRfUzE2X0xFOgorCSAgICBjYXNlIEFGTVRfVTE2X0xFOgorCQlpZiAoaHdfY2FuX2J5dGVzd2FwKQorCQkJZG1hc291bmQuaGFyZC5mb3JtYXQgPSBBRk1UX1MxNl9MRTsKKwkJZWxzZQorCQkJZG1hc291bmQuaGFyZC5mb3JtYXQgPSBBRk1UX1MxNl9CRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZG1hc291bmQuaGFyZC5mb3JtYXQgPSBBRk1UX1MxNl9CRTsKKwkJYnJlYWs7CisJfQorCWRtYXNvdW5kLmhhcmQuc3RlcmVvID0gMTsKKwlkbWFzb3VuZC5oYXJkLnNpemUgPSAxNjsKKworCS8qIHNldCBkbWFzb3VuZC5oYXJkLnNwZWVkIC0gb24gdGhlIGJhc2lzIG9mIHdoYXQgd2Ugd2FudCAoc29mdCkKKwkgKiBhbmQgdGhlIHRvbGVyYW5jZSB3ZSdsbCBhbGxvdy4KKwkqLworCXNldF9mcmFtZV9yYXRlKGRtYXNvdW5kLnNvZnQuc3BlZWQsIGNhdGNoUmFkaXVzKSA7CisKKwl0b2xlcmFuY2UgPSAoY2F0Y2hSYWRpdXMgKiBkbWFzb3VuZC5oYXJkLnNwZWVkKSAvIDEwMDsKKwlpZiAoZG1hc291bmQuc29mdC5zcGVlZCA+PSBkbWFzb3VuZC5oYXJkLnNwZWVkIC0gdG9sZXJhbmNlKSB7CisJCWRtYXNvdW5kLnRyYW5zX3dyaXRlID0gJnRyYW5zQXdhY3NOb3JtYWw7CisJCWRtYXNvdW5kLnRyYW5zX3JlYWQgPSAmdHJhbnNBd2Fjc05vcm1hbFJlYWQ7CisJfSBlbHNlIHsKKwkJZG1hc291bmQudHJhbnNfd3JpdGUgPSAmdHJhbnNBd2Fjc0V4cGFuZDsKKwkJZG1hc291bmQudHJhbnNfcmVhZCA9ICZ0cmFuc0F3YWNzRXhwYW5kUmVhZDsKKwl9CisKKwlpZiAoYXdhY3MpIHsKKwkJaWYgKGh3X2Nhbl9ieXRlc3dhcCAmJiAoZG1hc291bmQuaGFyZC5mb3JtYXQgPT0gQUZNVF9TMTZfTEUpKQorCQkJb3V0X2xlMzIoJmF3YWNzLT5ieXRlc3dhcCwgQlNfVkFMKTsKKwkJZWxzZQorCQkJb3V0X2xlMzIoJmF3YWNzLT5ieXRlc3dhcCwgMCk7CisJfQorCQorCWV4cGFuZF9iYWwgPSAtZG1hc291bmQuc29mdC5zcGVlZDsKKwlleHBhbmRfcmVhZF9iYWwgPSAtZG1hc291bmQuc29mdC5zcGVlZDsKK30KKworc3RhdGljIGludCBQTWFjU2V0Rm9ybWF0KGludCBmb3JtYXQpCit7CisJaW50IHNpemU7CisJaW50IHJlcV9mb3JtYXQgPSBmb3JtYXQ7CisJCQorCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBBRk1UX1FVRVJZOgorCQlyZXR1cm4gZG1hc291bmQuc29mdC5mb3JtYXQ7CisJY2FzZSBBRk1UX01VX0xBVzoKKwljYXNlIEFGTVRfQV9MQVc6CisJY2FzZSBBRk1UX1U4OgorCWNhc2UgQUZNVF9TODoKKwkJc2l6ZSA9IDg7CisJCWJyZWFrOworCWNhc2UgQUZNVF9TMTZfTEU6CisJCWlmKCFod19jYW5fYnl0ZXN3YXApCisJCQlmb3JtYXQgPSBBRk1UX1MxNl9CRTsKKwljYXNlIEFGTVRfUzE2X0JFOgorCQlzaXplID0gMTY7CisJCWJyZWFrOworCWNhc2UgQUZNVF9VMTZfTEU6CisJCWlmKCFod19jYW5fYnl0ZXN3YXApCisJCQlmb3JtYXQgPSBBRk1UX1UxNl9CRTsKKwljYXNlIEFGTVRfVTE2X0JFOgorCQlzaXplID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIDotKSAqLworCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kOiB1bmtub3duIGZvcm1hdCAweCV4LCB1c2luZyBBRk1UX1U4XG4iLAorCQkgICAgICAgZm9ybWF0KTsKKwkJc2l6ZSA9IDg7CisJCWZvcm1hdCA9IEFGTVRfVTg7CisJfQorCQorCWlmIChyZXFfZm9ybWF0ID09IGZvcm1hdCkgeworCQlkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9IGZvcm1hdDsKKwkJZG1hc291bmQuc29mdC5zaXplID0gc2l6ZTsKKwkJaWYgKGRtYXNvdW5kLm1pbkRldiA9PSBTTkRfREVWX0RTUCkgeworCQkJZG1hc291bmQuZHNwLmZvcm1hdCA9IGZvcm1hdDsKKwkJCWRtYXNvdW5kLmRzcC5zaXplID0gc2l6ZTsKKwkJfQorCX0KKworCXJldHVybiBmb3JtYXQ7Cit9CisKKyNkZWZpbmUgQVdBQ1NfVk9MVU1FX1RPX01BU0soeCkJKDE1IC0gKCgoKHgpIC0gMSkgKiAxNSkgLyA5OSkpCisjZGVmaW5lIEFXQUNTX01BU0tfVE9fVk9MVU1FKHkpCSgxMDAgLSAoKHkpICogOTkgLyAxNSkpCisKK3N0YXRpYyBpbnQgYXdhY3NfZ2V0X3ZvbHVtZShpbnQgcmVnLCBpbnQgbHNoaWZ0KQoreworCWludCB2b2x1bWU7CisKKwl2b2x1bWUgPSBBV0FDU19NQVNLX1RPX1ZPTFVNRSgocmVnID4+IGxzaGlmdCkgJiAweGYpOworCXZvbHVtZSB8PSBBV0FDU19NQVNLX1RPX1ZPTFVNRShyZWcgJiAweGYpIDw8IDg7CisJcmV0dXJuIHZvbHVtZTsKK30KKworc3RhdGljIGludCBhd2Fjc192b2x1bWVfc2V0dGVyKGludCB2b2x1bWUsIGludCBuLCBpbnQgbXV0ZSwgaW50IGxzaGlmdCkKK3sKKwlpbnQgcjEsIHJuOworCisJaWYgKG11dGUgJiYgdm9sdW1lID09IDApIHsKKwkJcjEgPSBhd2Fjc19yZWdbMV0gfCBtdXRlOworCX0gZWxzZSB7CisJCXIxID0gYXdhY3NfcmVnWzFdICYgfm11dGU7CisJCXJuID0gYXdhY3NfcmVnW25dICYgfigweGYgfCAoMHhmIDw8IGxzaGlmdCkpOworCQlybiB8PSAoKEFXQUNTX1ZPTFVNRV9UT19NQVNLKHZvbHVtZSAmIDB4ZmYpICYgMHhmKSA8PCBsc2hpZnQpOworCQlybiB8PSBBV0FDU19WT0xVTUVfVE9fTUFTSygodm9sdW1lID4+IDgpICYgMHhmZikgJiAweGY7CisJCWF3YWNzX3JlZ1tuXSA9IHJuOworCQlhd2Fjc193cml0ZSgobiA8PCAxMikgfCBybik7CisJCXZvbHVtZSA9IGF3YWNzX2dldF92b2x1bWUocm4sIGxzaGlmdCk7CisJfQorCWlmIChyMSAhPSBhd2Fjc19yZWdbMV0pIHsKKwkJYXdhY3NfcmVnWzFdID0gcjE7CisJCWF3YWNzX3dyaXRlKHIxIHwgTUFTS19BRERSMSk7CisJfQorCXJldHVybiB2b2x1bWU7Cit9CisKK3N0YXRpYyBpbnQgUE1hY1NldFZvbHVtZShpbnQgdm9sdW1lKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIkJvZ3VzIGNhbGwgdG8gUE1hY1NldFZvbHVtZSAhXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXdhY3Nfc2V0dXBfZm9yX2JlZXAoaW50IHNwZWVkKQoreworCW91dF9sZTMyKCZhd2Fjcy0+Y29udHJvbCwKKwkJIChpbl9sZTMyKCZhd2Fjcy0+Y29udHJvbCkgJiB+MHgxZjAwKQorCQkgfCAoKHNwZWVkID4gMCA/IHNwZWVkIDogYXdhY3NfcmF0ZV9pbmRleCkgPDwgOCkpOworCisJaWYgKGh3X2Nhbl9ieXRlc3dhcCAmJiAoZG1hc291bmQuaGFyZC5mb3JtYXQgPT0gQUZNVF9TMTZfTEUpICYmIHNwZWVkID09IC0xKQorCQlvdXRfbGUzMigmYXdhY3MtPmJ5dGVzd2FwLCBCU19WQUwpOworCWVsc2UKKwkJb3V0X2xlMzIoJmF3YWNzLT5ieXRlc3dhcCwgMCk7Cit9CisKKy8qIENIRUNLOiBob3cgbXVjaCBvZiB0aGlzICpyZWFsbHkqIG5lZWRzIElSUXMgbWFza2VkPyAqLworc3RhdGljIHZvaWQgX19QTWFjUGxheSh2b2lkKQoreworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNwOworCWludCBuZXh0X2ZyZywgY291bnQ7CisKKwljb3VudCA9IDMwMCA7IC8qID4gdHdvIGN5Y2xlcyBhdCB0aGUgbG93ZXN0IHNhbXBsZSByYXRlICovCisKKwkvKiB3aGF0IHdlIHdhbnQgdG8gc2VuZCBuZXh0ICovCisJbmV4dF9mcmcgPSAod3JpdGVfc3EuZnJvbnQgKyB3cml0ZV9zcS5hY3RpdmUpICUgd3JpdGVfc3EubWF4X2NvdW50OworCisJaWYgKGF3YWNzX2JlZXBfc3RhdGUpIHsKKwkJLyogc291bmQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGJlZXBzICovCisJCS8qIHN0b3AgdGhlIGRtYSBjaGFubmVsICovCisJCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y29udHJvbCwgKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNik7CisJCXdoaWxlICggKGluX2xlMzIoJmF3YWNzX3R4ZG1hLT5zdGF0dXMpICYgUlVOKSAmJiBjb3VudC0tKQorCQkJdWRlbGF5KDEpOworCQlpZiAoYXdhY3MpCisJCQlhd2Fjc19zZXR1cF9mb3JfYmVlcCgtMSk7CisJCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y21kcHRyLAorCQkJIHZpcnRfdG9fYnVzKCYoYXdhY3NfdHhfY21kc1tuZXh0X2ZyZ10pKSk7CisKKwkJYmVlcF9wbGF5aW5nID0gMDsKKwkJYXdhY3NfYmVlcF9zdGF0ZSA9IDA7CisJfQorCS8qIHRoaXMgd29uJ3QgYWxsb3cgbW9yZSB0aGFuIHR3byBmcmFncyB0byBiZSBpbiB0aGUgb3V0cHV0IHF1ZXVlIGF0CisJICAgb25jZS4gKG9yIG9uZSwgaWYgdGhlIG1heCBmcmFncyBpcyAyIC0gYmVjYXVzZSBjb3VudCBjYW4ndCBleGNlZWQKKwkgICAyIGluIHRoYXQgY2FzZSkKKwkqLworCXdoaWxlICh3cml0ZV9zcS5hY3RpdmUgPCAyICYmIHdyaXRlX3NxLmFjdGl2ZSA8IHdyaXRlX3NxLmNvdW50KSB7CisJCWNvdW50ID0gKHdyaXRlX3NxLmNvdW50ID09IHdyaXRlX3NxLmFjdGl2ZSArIDEpID8KKwkJCQl3cml0ZV9zcS5yZWFyX3NpemU6d3JpdGVfc3EuYmxvY2tfc2l6ZSA7CisJCWlmIChjb3VudCA8IHdyaXRlX3NxLmJsb2NrX3NpemUpIHsKKwkJCWlmICghd3JpdGVfc3Euc3luY2luZykgLyogbGFzdCBibG9jayBub3QgeWV0IGZpbGxlZCwqLworCQkJCWJyZWFrOyAJLyogYW5kIHdlJ3JlIG5vdCBzeW5jaW5nIG9yIFBPU1QtZWQgKi8KKwkJCWVsc2UgeworCQkJCS8qIHByZXRlbmQgdGhlIGJsb2NrIGlzIGZ1bGwgdG8gZm9yY2UgYSBuZXcKKwkJCQkgICBibG9jayB0byBiZSBzdGFydGVkIG9uIHRoZSBuZXh0IHdyaXRlICovCisJCQkJd3JpdGVfc3EucmVhcl9zaXplID0gd3JpdGVfc3EuYmxvY2tfc2l6ZSA7CisJCQkJd3JpdGVfc3Euc3luY2luZyAmPSB+MiA7IC8qIGNsZWFyIFBPU1QgKi8KKwkJCX0KKwkJfQorCQljcCA9ICZhd2Fjc190eF9jbWRzW25leHRfZnJnXTsKKwkJc3RfbGUxNigmY3AtPnJlcV9jb3VudCwgY291bnQpOworCQlzdF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMsIDApOworCQlzdF9sZTE2KCZjcC0+Y29tbWFuZCwgT1VUUFVUX01PUkUgKyBJTlRSX0FMV0FZUyk7CisJCS8qIHB1dCBhIFNUT1AgYXQgdGhlIGVuZCBvZiB0aGUgcXVldWUgLSBidXQgb25seSBpZiB3ZSBoYXZlCisJCSAgIHNwYWNlIGZvciBpdC4gIFRoaXMgbWVhbnMgdGhhdCwgaWYgd2UgdW5kZXItcnVuIGFuZCB3ZSBvbmx5CisJCSAgIGhhdmUgdHdvIGZyYWdtZW50cywgd2UgbWlnaHQgcmUtcGxheSBzb3VuZCBmcm9tIGFuIGV4aXN0aW5nCisJCSAgIHF1ZXVlZCBmcmFnLiAgSSBndWVzcyB0aGUgc29sdXRpb24gdG8gdGhhdCBpcyBub3QgdG8gc2V0IHR3bworCQkgICBmcmFncyBpZiB5b3UgYXJlIGxpa2VseSB0byB1bmRlci1ydW4uLi4KKwkJKi8KKwkJaWYgKHdyaXRlX3NxLmNvdW50IDwgd3JpdGVfc3EubWF4X2NvdW50KSB7CisJCQlpZiAoKytuZXh0X2ZyZyA+PSB3cml0ZV9zcS5tYXhfY291bnQpCisJCQkJbmV4dF9mcmcgPSAwIDsgLyogd3JhcCAqLworCQkJLyogaWYgd2UgZ2V0IGhlcmUgdGhlbiB3ZSd2ZSB1bmRlcnJ1biBzbyB3ZSB3aWxsIHN0b3AqLworCQkJc3RfbGUxNigmYXdhY3NfdHhfY21kc1tuZXh0X2ZyZ10uY29tbWFuZCwgREJETUFfU1RPUCk7CisJCX0KKwkJLyogc2V0IHRoZSBkYmRtYSBjb250cm9sbGVyIGdvaW5nLCBpZiBpdCBpcyBub3QgYWxyZWFkeSAqLworCQlpZiAod3JpdGVfc3EuYWN0aXZlID09IDApCisJCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNtZHB0ciwgdmlydF90b19idXMoY3ApKTsKKwkJKHZvaWQpaW5fbGUzMigmYXdhY3NfdHhkbWEtPnN0YXR1cyk7CisJCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y29udHJvbCwgKChSVU58V0FLRSkgPDwgMTYpICsgKFJVTnxXQUtFKSk7CisJCSsrd3JpdGVfc3EuYWN0aXZlOworCX0KK30KKworc3RhdGljIHZvaWQgUE1hY1BsYXkodm9pZCkKK3sKKwlMT0NLKCk7CisJaWYgKCFhd2Fjc19zbGVlcGluZykgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJCV9fUE1hY1BsYXkoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCX0KKwlVTkxPQ0soKTsKK30KKworc3RhdGljIHZvaWQgUE1hY1JlY29yZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmVhZF9zcS5hY3RpdmUpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisKKwkvKiBUaGlzIGlzIGFsbCB3ZSBoYXZlIHRvIGRvLi4uLi4uSnVzdCBzdGFydCBpdCB1cC4KKwkqLworCW91dF9sZTMyKCZhd2Fjc19yeGRtYS0+Y29udHJvbCwgKChSVU58V0FLRSkgPDwgMTYpICsgKFJVTnxXQUtFKSk7CisJcmVhZF9zcS5hY3RpdmUgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworfQorCisvKiBpZiB0aGUgVFggc3RhdHVzIGNvbWVzIHVwICJERUFEIiAtIHJlcG9ydGVkIG9uIHNvbWUgUG93ZXIgQ29tcHV0aW5nIG1hY2hpbmVzCisgICB3ZSBuZWVkIHRvIHJlLXN0YXJ0IHRoZSBkYmRtYSAtIGJ1dCBmcm9tIGEgZGlmZmVyZW50IHBoeXNpY2FsIHN0YXJ0IGFkZHJlc3MKKyAgIGFuZCB3aXRoIGEgZGlmZmVyZW50IHRyYW5zZmVyIGxlbmd0aC4gIEl0IHdvdWxkIGdldCB2ZXJ5IG1lc3N5IHRvIGRvIHRoaXMKKyAgIHdpdGggdGhlIG5vcm1hbCBkYmRtYV9jbWQgYmxvY2tzIC0gd2Ugd291bGQgaGF2ZSB0byByZS13cml0ZSB0aGUgYnVmZmVyIHN0YXJ0CisgICBhZGRyZXNzZXMgZWFjaCB0aW1lLiAgU28sIHdlIHdpbGwga2VlcCBhIHNpbmdsZSBkYmRtYV9jbWQgYmxvY2sgd2hpY2ggY2FuIGJlCisgICBmaWRkbGVkIHdpdGguCisgICBXaGVuIERFQUQgc3RhdHVzIGlzIGZpcnN0IHJlcG9ydGVkIHRoZSBjb250ZW50IG9mIHRoZSBmYXVsdGVkIGRiZG1hIGJsb2NrIGlzCisgICBjb3BpZWQgaW50byB0aGUgZW1lcmdlbmN5IGJ1ZmZlciBhbmQgd2Ugbm90ZSB0aGF0IHRoZSBidWZmZXIgaXMgaW4gdXNlLgorICAgd2UgdGhlbiBidW1wIHRoZSBzdGFydCBwaHlzaWNhbCBhZGRyZXNzIGJ5IHRoZSBhbW91bnQgdGhhdCB3YXMgc3VjY2Vzc2Z1bGx5CisgICBvdXRwdXQgYmVmb3JlIGl0IGRpZWQuCisgICBPbiBhbnkgc3Vic2VxdWVudCBERUFEIHJlc3VsdCB3ZSBqdXN0IGRvIHRoZSBidW1wLXVwcyAod2Uga25vdyB0aGF0IHdlIGFyZQorICAgYWxyZWFkeSB1c2luZyB0aGUgZW1lcmdlbmN5IGRiZG1hX2NtZCkuCisgICBDSEVDSzogdGhpcyBqdXN0IHRyaWVzIHRvICJkbyBpdCIuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIHNob3VsZCBhYmFuZG9uCisgICB4ZmVycyB3aGVuIHRoZSBudW1iZXIgb2YgcmVzaWR1YWwgYnl0ZXMgZ2V0cyBiZWxvdyBhIGNlcnRhaW4gdmFsdWUgLSBJIGNhbgorICAgc2VlIHRoYXQgdGhpcyBtaWdodCBjYXVzZSBhIGxvb3AtZm9yZXZlciBpZiB0b28gc21hbGwgYSB0cmFuc2ZlciBjYXVzZXMKKyAgIERFQUQgc3RhdHVzLiAgSG93ZXZlciB0aGlzIGlzIGEgVE9ETyBmb3Igbm93IC0gd2UnbGwgc2VlIHdoYXQgZ2V0cyByZXBvcnRlZC4KKyAgIFdoZW4gd2UgZ2V0IGEgc3VjY2Vzc2Z1bCB0cmFuc2ZlciByZXN1bHQgd2l0aCB0aGUgZW1lcmdlbmN5IGJ1ZmZlciB3ZSBqdXN0CisgICBwcmV0ZW5kIHRoYXQgaXQgY29tcGxldGVkIHVzaW5nIHRoZSBvcmlnaW5hbCBkbWRtYV9jbWQgYW5kIGNhcnJ5IG9uLiAgVGhlCisgICAnbmV4dF9jbWQnIGZpZWxkIHdpbGwgYWxyZWFkeSBwb2ludCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBsb29wIG9mIGJsb2Nrcy4KKyovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorcG1hY19hd2Fjc190eF9pbnRyKGludCBpcnEsIHZvaWQgKmRldmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaSA9IHdyaXRlX3NxLmZyb250OworCWludCBzdGF0OworCWludCBpX25vd3JhcCA9IHdyaXRlX3NxLmZyb250OworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNwOworCS8qICE9IDAgd2hlbiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgREVBRCB4ZmVyICovCisJc3RhdGljIGludCBlbWVyZ2VuY3lfaW5fdXNlOworCisJc3Bpbl9sb2NrKCZkbWFzb3VuZC5sb2NrKTsKKwl3aGlsZSAod3JpdGVfc3EuYWN0aXZlID4gMCkgeyAvKiB3ZSBleHBlY3QgdG8gaGF2ZSBkb25lIHNvbWV0aGluZyovCisJCWlmIChlbWVyZ2VuY3lfaW5fdXNlKSAvKiB3ZSBhcmUgZGVhbGluZyB3aXRoIERFQUQgeGZlciAqLworCQkJY3AgPSBlbWVyZ2VuY3lfZGJkbWFfY21kIDsKKwkJZWxzZQorCQkJY3AgPSAmYXdhY3NfdHhfY21kc1tpXTsKKwkJc3RhdCA9IGxkX2xlMTYoJmNwLT54ZmVyX3N0YXR1cyk7CisJCWlmIChzdGF0ICYgREVBRCkgeworCQkJdW5zaWduZWQgc2hvcnQgcmVxLCByZXMgOworCQkJdW5zaWduZWQgaW50IHBoeSA7CisjaWZkZWYgREVCVUdfRE1BU09VTkQKK3ByaW50aygiZG1hc291bmRfcG1hYzogdHgtaXJxOiB4ZmVyIGRpZWQgLSBwYXRjaGluZyBpdCB1cC4uLlxuIikgOworI2VuZGlmCisJCQkvKiB0byBjbGVhciBERUFEIHN0YXR1cyB3ZSBtdXN0IGZpcnN0IGNsZWFyIFJVTgorCQkJICAgc2V0IGl0IHRvIHF1aWVzY2VudCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlICovCisJCQkodm9pZClpbl9sZTMyKCZhd2Fjc190eGRtYS0+c3RhdHVzKTsKKwkJCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y29udHJvbCwKKwkJCQkoUlVOfFBBVVNFfEZMVVNIfFdBS0UpIDw8IDE2KTsKKwkJCXdyaXRlX3NxLmRpZWQrKyA7CisJCQlpZiAoIWVtZXJnZW5jeV9pbl91c2UpIHsgLyogbmV3IHByb2JsZW0gKi8KKwkJCQltZW1jcHkoKHZvaWQgKillbWVyZ2VuY3lfZGJkbWFfY21kLCAodm9pZCAqKWNwLAorCQkJCQlzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkpOworCQkJCWVtZXJnZW5jeV9pbl91c2UgPSAxOworCQkJCWNwID0gZW1lcmdlbmN5X2RiZG1hX2NtZDsKKwkJCX0KKwkJCS8qIG5vdyBidW1wIHRoZSB2YWx1ZXMgdG8gcmVmbGVjdCB0aGUgYW1vdW50CisJCQkgICB3ZSBoYXZlbid0IHlldCBzaGlmdGVkICovCisJCQlyZXEgPSBsZF9sZTE2KCZjcC0+cmVxX2NvdW50KTsKKwkJCXJlcyA9IGxkX2xlMTYoJmNwLT5yZXNfY291bnQpOworCQkJcGh5ID0gbGRfbGUzMigmY3AtPnBoeV9hZGRyKTsKKwkJCXBoeSArPSAocmVxIC0gcmVzKTsKKwkJCXN0X2xlMTYoJmNwLT5yZXFfY291bnQsIHJlcyk7CisJCQlzdF9sZTE2KCZjcC0+cmVzX2NvdW50LCAwKTsKKwkJCXN0X2xlMTYoJmNwLT54ZmVyX3N0YXR1cywgMCk7CisJCQlzdF9sZTMyKCZjcC0+cGh5X2FkZHIsIHBoeSk7CisJCQlzdF9sZTMyKCZjcC0+Y21kX2RlcCwgdmlydF90b19idXMoJmF3YWNzX3R4X2NtZHNbKGkrMSkld3JpdGVfc3EubWF4X2NvdW50XSkpOworCQkJc3RfbGUxNigmY3AtPmNvbW1hbmQsIE9VVFBVVF9NT1JFIHwgQlJfQUxXQVlTIHwgSU5UUl9BTFdBWVMpOworCQkJCisJCQkvKiBwb2ludCBhdCBvdXIgcGF0Y2hlZCB1cCBjb21tYW5kIGJsb2NrICovCisJCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNtZHB0ciwgdmlydF90b19idXMoY3ApKTsKKwkJCS8qIHdlIG11c3QgcmUtc3RhcnQgdGhlIGNvbnRyb2xsZXIgKi8KKwkJCSh2b2lkKWluX2xlMzIoJmF3YWNzX3R4ZG1hLT5zdGF0dXMpOworCQkJLyogc2hvdWxkIGNvbXBsZXRlIGNsZWFyaW5nIHRoZSBERUFEIHN0YXR1cyAqLworCQkJb3V0X2xlMzIoJmF3YWNzX3R4ZG1hLT5jb250cm9sLAorCQkJCSgoUlVOfFdBS0UpIDw8IDE2KSArIChSVU58V0FLRSkpOworCQkJYnJlYWs7IC8qIHRoaXMgYmxvY2sgaXMgc3RpbGwgZ29pbmcgKi8KKwkJfQorCQlpZiAoKHN0YXQgJiBBQ1RJVkUpID09IDApCisJCQlicmVhazsJLyogdGhpcyBmcmFtZSBpcyBzdGlsbCBnb2luZyAqLworCQlpZiAoZW1lcmdlbmN5X2luX3VzZSkKKwkJCWVtZXJnZW5jeV9pbl91c2UgPSAwIDsgLyogZG9uZSB0aGF0ICovCisJCS0td3JpdGVfc3EuY291bnQ7CisJCS0td3JpdGVfc3EuYWN0aXZlOworCQlpX25vd3JhcCsrOworCQlpZiAoKytpID49IHdyaXRlX3NxLm1heF9jb3VudCkKKwkJCWkgPSAwOworCX0KKworCS8qIGlmIHdlIHN0b3BwZWQgYW5kIHdlIHdlcmUgbm90IHN5bmMtaW5nIC0gdGhlbiB3ZSB1bmRlci1yYW4gKi8KKwlpZiggd3JpdGVfc3Euc3luY2luZyA9PSAwICl7CisJCXN0YXQgPSBpbl9sZTMyKCZhd2Fjc190eGRtYS0+c3RhdHVzKSA7CisJCS8qIHdlIGhpdCB0aGUgZGJkbWFfc3RvcCAqLworCQlpZiggKHN0YXQgJiBBQ1RJVkUpID09IDAgKSB3cml0ZV9zcS54cnVucysrIDsKKwl9CisKKwkvKiBpZiB3ZSB1c2VkIHNvbWUgZGF0YSB1cCB0aGVuIHdha2UgdGhlIHdyaXRlciB0byBzdXBwbHkgc29tZSBtb3JlKi8KKwlpZiAoaV9ub3dyYXAgIT0gd3JpdGVfc3EuZnJvbnQpCisJCVdBS0VfVVAod3JpdGVfc3EuYWN0aW9uX3F1ZXVlKTsKKwl3cml0ZV9zcS5mcm9udCA9IGk7CisKKwkvKiBidXQgbWFrZSBzdXJlIHdlIGZ1bm5lbCB3aGF0IHdlJ3ZlIGFscmVhZHkgZ290ICovXAorCSBpZiAoIWF3YWNzX3NsZWVwaW5nKQorCQlfX1BNYWNQbGF5KCk7CisKKwkvKiBtYWtlIHRoZSB3YWtlLW9uLWVtcHR5IGNvbmRpdGlvbmFsIG9uIHN5bmNpbmcgKi8KKwlpZiAoIXdyaXRlX3NxLmFjdGl2ZSAmJiAod3JpdGVfc3Euc3luY2luZyAmIDEpKQorCQlXQUtFX1VQKHdyaXRlX3NxLnN5bmNfcXVldWUpOyAvKiBhbnkgdGltZSB3ZSdyZSBlbXB0eSAqLworCXNwaW5fdW5sb2NrKCZkbWFzb3VuZC5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIGlycXJldHVybl90CitwbWFjX2F3YWNzX3J4X2ludHIoaW50IGlycSwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBzdGF0IDsKKwkvKiBGb3Igc29tZSByZWFzb24gb24gbXkgUG93ZXJCb29rIEczLCBJIGdldCBvbmUgaW50ZXJydXB0CisJICogd2hlbiB0aGUgaW50ZXJydXB0IHZlY3RvciBpcyBpbnN0YWxsZWQgKGxpa2Ugc29tZXRoaW5nIGlzCisJICogcGVuZGluZykuICBUaGlzIGhhcHBlbnMgYmVmb3JlIHRoZSBkYmRtYSBpcyBpbml0aWFsaXplZCBieQorCSAqIHVzLCBzbyBJIGp1c3QgY2hlY2sgdGhlIGNvbW1hbmQgcG9pbnRlciBhbmQgaWYgaXQgaXMgemVybywKKwkgKiBqdXN0IGJsb3cgaXQgb2ZmLgorCSAqLworCWlmIChpbl9sZTMyKCZhd2Fjc19yeGRtYS0+Y21kcHRyKSA9PSAwKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkvKiBXZSBhbHNvIHdhbnQgdG8gYmxvdyAnZW0gb2ZmIHdoZW4gc2h1dHRpbmcgZG93bi4KKwkqLworCWlmIChyZWFkX3NxLmFjdGl2ZSA9PSAwKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlzcGluX2xvY2soJmRtYXNvdW5kLmxvY2spOworCS8qIENoZWNrIG11bHRpcGxlIGJ1ZmZlcnMgaW4gY2FzZSB3ZSB3ZXJlIGhlbGQgb2ZmIGZyb20KKwkgKiBpbnRlcnJ1cHQgcHJvY2Vzc2luZyBmb3IgYSBsb25nIHRpbWUuICBHZWV6ZSwgSSByZWFsbHkgaG9wZQorCSAqIHRoaXMgZG9lc24ndCBoYXBwZW4uCisJICovCisJd2hpbGUgKChzdGF0PWF3YWNzX3J4X2NtZHNbcmVhZF9zcS5yZWFyXS54ZmVyX3N0YXR1cykpIHsKKworCQkvKiBpZiB3ZSBnb3QgYSAiREVBRCIgc3RhdHVzIHRoZW4ganVzdCBsb2cgaXQgZm9yIG5vdy4KKwkJICAgYW5kIHRyeSB0byByZXN0YXJ0IGRtYS4KKwkJICAgVE9ETzogZmlndXJlIG91dCBob3cgYmVzdCB0byBmaXggaXQgdXAKKwkJKi8KKwkJaWYgKHN0YXQgJiBERUFEKXsKKyNpZmRlZiBERUJVR19ETUFTT1VORAorcHJpbnRrKCJkbWFzb3VuZF9wbWFjOiByeC1pcnE6IERJRUQgLSBhdHRlbXB0aW5nIHJlc3VyZWN0aW9uXG4iKTsKKyNlbmRpZgorCQkJLyogdG8gY2xlYXIgREVBRCBzdGF0dXMgd2UgbXVzdCBmaXJzdCBjbGVhciBSVU4KKwkJCSAgIHNldCBpdCB0byBxdWllc2NlbnQgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSAqLworCQkJKHZvaWQpaW5fbGUzMigmYXdhY3NfdHhkbWEtPnN0YXR1cyk7CisJCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNvbnRyb2wsCisJCQkJKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNik7CisJCQlhd2Fjc19yeF9jbWRzW3JlYWRfc3EucmVhcl0ueGZlcl9zdGF0dXMgPSAwOworCQkJYXdhY3NfcnhfY21kc1tyZWFkX3NxLnJlYXJdLnJlc19jb3VudCA9IDA7CisJCQlyZWFkX3NxLmRpZWQrKyA7CisJCQkodm9pZClpbl9sZTMyKCZhd2Fjc190eGRtYS0+c3RhdHVzKTsKKwkJCS8qIHJlLXN0YXJ0IHRoZSBzYW1lIGJsb2NrICovCisJCQlvdXRfbGUzMigmYXdhY3NfcnhkbWEtPmNtZHB0ciwKKwkJCQl2aXJ0X3RvX2J1cygmYXdhY3NfcnhfY21kc1tyZWFkX3NxLnJlYXJdKSk7CisJCQkvKiB3ZSBtdXN0IHJlLXN0YXJ0IHRoZSBjb250cm9sbGVyICovCisJCQkodm9pZClpbl9sZTMyKCZhd2Fjc19yeGRtYS0+c3RhdHVzKTsKKwkJCS8qIHNob3VsZCBjb21wbGV0ZSBjbGVhcmluZyB0aGUgREVBRCBzdGF0dXMgKi8KKwkJCW91dF9sZTMyKCZhd2Fjc19yeGRtYS0+Y29udHJvbCwKKwkJCQkoKFJVTnxXQUtFKSA8PCAxNikgKyAoUlVOfFdBS0UpKTsKKwkJCXNwaW5fdW5sb2NrKCZkbWFzb3VuZC5sb2NrKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsgLyogdHJ5IHRoaXMgYmxvY2sgYWdhaW4gKi8KKwkJfQorCQkvKiBDbGVhciBzdGF0dXMgYW5kIG1vdmUgb24gdG8gbmV4dCBidWZmZXIuCisJCSovCisJCWF3YWNzX3J4X2NtZHNbcmVhZF9zcS5yZWFyXS54ZmVyX3N0YXR1cyA9IDA7CisJCXJlYWRfc3EucmVhcisrOworCisJCS8qIFdyYXAgdGhlIGJ1ZmZlciByaW5nLgorCQkqLworCQlpZiAocmVhZF9zcS5yZWFyID49IHJlYWRfc3EubWF4X2FjdGl2ZSkKKwkJCXJlYWRfc3EucmVhciA9IDA7CisKKwkJLyogSWYgd2UgaGF2ZSBjYXVnaHQgdXAgdG8gdGhlIGZyb250IGJ1ZmZlciwgYnVtcCBpdC4KKwkJICogVGhpcyB3aWxsIGNhdXNlIHdlaXJkIChidXQgbm90IGZhdGFsKSByZXN1bHRzIGlmIHRoZQorCQkgKiByZWFkIGxvb3AgaXMgY3VycmVudGx5IHVzaW5nIHRoaXMgYnVmZmVyLiAgVGhlIHVzZXIgaXMKKwkJICogYmVoaW5kIGluIHRoaXMgY2FzZSBhbnl3YXksIHNvIHdlaXJkIHRoaW5ncyBhcmUgZ29pbmcKKwkJICogdG8gaGFwcGVuLgorCQkgKi8KKwkJaWYgKHJlYWRfc3EucmVhciA9PSByZWFkX3NxLmZyb250KSB7CisJCQlyZWFkX3NxLmZyb250Kys7CisJCQlyZWFkX3NxLnhydW5zKysgOyAvKiB3ZSBvdmVyYW4gKi8KKwkJCWlmIChyZWFkX3NxLmZyb250ID49IHJlYWRfc3EubWF4X2FjdGl2ZSkKKwkJCQlyZWFkX3NxLmZyb250ID0gMDsKKwkJfQorCX0KKworCVdBS0VfVVAocmVhZF9zcS5hY3Rpb25fcXVldWUpOworCXNwaW5fdW5sb2NrKCZkbWFzb3VuZC5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIGlycXJldHVybl90CitwbWFjX2F3YWNzX2ludHIoaW50IGlycSwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBjdHJsOworCWludCBzdGF0dXM7CisJaW50IHIxOworCisJc3Bpbl9sb2NrKCZkbWFzb3VuZC5sb2NrKTsKKwljdHJsID0gaW5fbGUzMigmYXdhY3MtPmNvbnRyb2wpOworCXN0YXR1cyA9IGluX2xlMzIoJmF3YWNzLT5jb2RlY19zdGF0KTsKKworCWlmIChjdHJsICYgTUFTS19QT1JUQ0hHKSB7CisJCS8qIHRlc3RlZCBvbiBTY3JlYW1lciwgc2hvdWxkIHdvcmsgb24gb3RoZXJzIHRvbyAqLworCQlpZiAoYXdhY3NfcmV2aXNpb24gPT0gQVdBQ1NfU0NSRUFNRVIpIHsKKwkJCWlmICgoKHN0YXR1cyAmIE1BU0tfSERQQ09OTikgPj4gMykgJiYgKGhkcF9jb25uZWN0ZWQgPT0gMCkpIHsKKwkJCQloZHBfY29ubmVjdGVkID0gMTsKKwkJCQkKKwkJCQlyMSA9IGF3YWNzX3JlZ1sxXSB8IE1BU0tfU1BLTVVURTsKKwkJCQlhd2Fjc19yZWdbMV0gPSByMTsKKwkJCQlhd2Fjc193cml0ZShyMSB8IE1BU0tfQUREUl9NVVRFKTsKKwkJCX0gZWxzZSBpZiAoKChzdGF0dXMgJiBNQVNLX0hEUENPTk4pID4+IDMgPT0gMCkgJiYgKGhkcF9jb25uZWN0ZWQgPT0gMSkpIHsKKwkJCQloZHBfY29ubmVjdGVkID0gMDsKKwkJCQkKKwkJCQlyMSA9IGF3YWNzX3JlZ1sxXSAmIH5NQVNLX1NQS01VVEU7CisJCQkJYXdhY3NfcmVnWzFdID0gcjE7CisJCQkJYXdhY3Nfd3JpdGUocjEgfCBNQVNLX0FERFJfTVVURSk7CisJCQl9CisJCX0KKwl9CisJaWYgKGN0cmwgJiBNQVNLX0NOVExFUlIpIHsKKwkJaW50IGVyciA9IChpbl9sZTMyKCZhd2Fjcy0+Y29kZWNfc3RhdCkgJiBNQVNLX0VSUkNPREUpID4+IDE2OworCQkvKiBDSEVDSzogd2UganVzdCBzd2FsbG93IGJ1cmd1bmR5IGVycm9ycyBhdCB0aGUgbW9tZW50Li4qLworCQlpZiAoZXJyICE9IDAgJiYgYXdhY3NfcmV2aXNpb24gIT0gQVdBQ1NfQlVSR1VORFkpCisJCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kX3BtYWM6IGVycm9yICV4XG4iLCBlcnIpOworCX0KKwkvKiBXcml0aW5nIDFzIHRvIHRoZSBDTlRMRVJSIGFuZCBQT1JUQ0hHIGJpdHMgY2xlYXJzIHRoZW0uLi4gKi8KKwlvdXRfbGUzMigmYXdhY3MtPmNvbnRyb2wsIGN0cmwpOworCXNwaW5fdW5sb2NrKCZkbWFzb3VuZC5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCithd2Fjc193cml0ZShpbnQgdmFsKQoreworCWludCBjb3VudCA9IDMwMCA7CisJaWYgKGF3YWNzX3JldmlzaW9uID49IEFXQUNTX0RBQ0EgfHwgIWF3YWNzKQorCQlyZXR1cm4gOworCisJd2hpbGUgKChpbl9sZTMyKCZhd2Fjcy0+Y29kZWNfY3RybCkgJiBNQVNLX05FV0VDTUQpICYmIGNvdW50LS0pCisJCXVkZWxheSgxKSA7CS8qIHRpbWVvdXQgaXMgPiAyIHNhbXBsZXMgYXQgbG93ZXN0IHJhdGUgKi8KKwlvdXRfbGUzMigmYXdhY3MtPmNvZGVjX2N0cmwsIHZhbCB8IChhd2Fjc19zdWJmcmFtZSA8PCAyMikpOworCSh2b2lkKWluX2xlMzIoJmF3YWNzLT5ieXRlc3dhcCk7Cit9CisKKy8qIHRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGJlZXAgdGltZXIgZXhwaXJlcy4uLiBpdCB3aWxsIGJlIGNhbGxlZCBldmVuCisgICBpZiB0aGUgYmVlcCBoYXMgYmVlbiBvdmVyaWRkZW4gYnkgb3RoZXIgc291bmQgb3V0cHV0LgorKi8KK3N0YXRpYyB2b2lkIGF3YWNzX25vc291bmQodW5zaWduZWQgbG9uZyB4eCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCA9IDYwMCA7IC8qID4gZm91ciBzYW1wbGVzIGF0IGxvd2VzdCByYXRlICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCWlmIChiZWVwX3BsYXlpbmcpIHsKKwkJc3RfbGUxNigmYmVlcF9kYmRtYV9jbWQtPmNvbW1hbmQsIERCRE1BX1NUT1ApOworCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYpOworCQl3aGlsZSAoKGluX2xlMzIoJmF3YWNzX3R4ZG1hLT5zdGF0dXMpICYgUlVOKSAmJiBjb3VudC0tKQorCQkJdWRlbGF5KDEpOworCQlpZiAoYXdhY3MpCisJCQlhd2Fjc19zZXR1cF9mb3JfYmVlcCgtMSk7CisJCWJlZXBfcGxheWluZyA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFdlIGdlbmVyYXRlIHRoZSBiZWVwIHdpdGggYSBzaW5nbGUgZGJkbWEgY29tbWFuZCB0aGF0IGxvb3BzIGEgYnVmZmVyCisgKiBmb3JldmVyIC0gd2l0aG91dCBnZW5lcmF0aW5nIGludGVycnVwdHMuCisgKgorICogU28sIHRvIHN0b3AgaXQgeW91IGhhdmUgdG8gc3RvcCBkbWEgb3V0cHV0IGFzIHBlciBhd2Fjc19ub3NvdW5kLgorICovCitzdGF0aWMgaW50IGF3YWNzX2JlZXBfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJdW5zaWduZWQgaW50IGNvZGUsIGludCBoeikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBiZWVwX3NwZWVkID0gMDsKKwlpbnQgc3JhdGU7CisJaW50IHBlcmlvZCwgbmN5Y2xlcywgbnNhbXBsZXM7CisJaW50IGksIGosIGY7CisJc2hvcnQgKnA7CisJc3RhdGljIGludCBiZWVwX2h6X2NhY2hlOworCXN0YXRpYyBpbnQgYmVlcF9uc2FtcGxlc19jYWNoZTsKKwlzdGF0aWMgaW50IGJlZXBfdm9sdW1lX2NhY2hlOworCisJaWYgKHR5cGUgIT0gRVZfU05EKQorCQlyZXR1cm4gLTE7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBTTkRfQkVMTDoKKwkJaWYgKGh6KQorCQkJaHogPSAxMDAwOworCQlicmVhazsKKwljYXNlIFNORF9UT05FOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGJlZXBfYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIHF1aWNrLWhhY2sgZml4IGZvciBEQUNBLCBCdXJndW5keSAmIFR1bWJsZXIgKi8KKworCWlmIChhd2Fjc19yZXZpc2lvbiA+PSBBV0FDU19EQUNBKXsKKwkJc3JhdGUgPSA0NDEwMCA7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDggJiYgYXdhY3NfZnJlcXNbaV0gPj0gQkVFUF9TUkFURTsgKytpKQorCQkJaWYgKGF3YWNzX2ZyZXFzX29rW2ldKQorCQkJCWJlZXBfc3BlZWQgPSBpOworCQlzcmF0ZSA9IGF3YWNzX2ZyZXFzW2JlZXBfc3BlZWRdOworCX0KKworCWlmIChoeiA8PSBzcmF0ZSAvIEJFRVBfQlVGTEVOIHx8IGh6ID4gc3JhdGUgLyAyKSB7CisJCS8qIGNhbmNlbCBiZWVwIGN1cnJlbnRseSBwbGF5aW5nICovCisJCWF3YWNzX25vc291bmQoMCk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJaWYgKGJlZXBfcGxheWluZyB8fCB3cml0ZV9zcS5hY3RpdmUgfHwgYmVlcF9idWYgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsJCS8qIHRvbyBoYXJkLCBzb3JyeSA6LSggKi8KKwl9CisJYmVlcF9wbGF5aW5nID0gMTsKKwlzdF9sZTE2KCZiZWVwX2RiZG1hX2NtZC0+Y29tbWFuZCwgT1VUUFVUX01PUkUgKyBCUl9BTFdBWVMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKworCWlmIChoeiA9PSBiZWVwX2h6X2NhY2hlICYmIGJlZXBfdm9sID09IGJlZXBfdm9sdW1lX2NhY2hlKSB7CisJCW5zYW1wbGVzID0gYmVlcF9uc2FtcGxlc19jYWNoZTsKKwl9IGVsc2UgeworCQlwZXJpb2QgPSBzcmF0ZSAqIDI1NiAvIGh6OwkvKiBmaXhlZCBwb2ludCAqLworCQluY3ljbGVzID0gQkVFUF9CVUZMRU4gKiAyNTYgLyBwZXJpb2Q7CisJCW5zYW1wbGVzID0gKHBlcmlvZCAqIG5jeWNsZXMpID4+IDg7CisJCWYgPSBuY3ljbGVzICogNjU1MzYgLyBuc2FtcGxlczsKKwkJaiA9IDA7CisJCXAgPSBiZWVwX2J1ZjsKKwkJZm9yIChpID0gMDsgaSA8IG5zYW1wbGVzOyArK2ksIHAgKz0gMikgeworCQkJcFswXSA9IHBbMV0gPSBiZWVwX3dmb3JtW2ogPj4gOF0gKiBiZWVwX3ZvbDsKKwkJCWogPSAoaiArIGYpICYgMHhmZmZmOworCQl9CisJCWJlZXBfaHpfY2FjaGUgPSBoejsKKwkJYmVlcF92b2x1bWVfY2FjaGUgPSBiZWVwX3ZvbDsKKwkJYmVlcF9uc2FtcGxlc19jYWNoZSA9IG5zYW1wbGVzOworCX0KKworCXN0X2xlMTYoJmJlZXBfZGJkbWFfY21kLT5yZXFfY291bnQsIG5zYW1wbGVzKjQpOworCXN0X2xlMTYoJmJlZXBfZGJkbWFfY21kLT54ZmVyX3N0YXR1cywgMCk7CisJc3RfbGUzMigmYmVlcF9kYmRtYV9jbWQtPmNtZF9kZXAsIHZpcnRfdG9fYnVzKGJlZXBfZGJkbWFfY21kKSk7CisJc3RfbGUzMigmYmVlcF9kYmRtYV9jbWQtPnBoeV9hZGRyLCB2aXJ0X3RvX2J1cyhiZWVwX2J1ZikpOworCWF3YWNzX2JlZXBfc3RhdGUgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKwlpZiAoYmVlcF9wbGF5aW5nKSB7CS8qIGkuZS4gaGF2ZW4ndCBiZWVuIHRlcm1pbmF0ZWQgYWxyZWFkeSAqLworCQlpbnQgY291bnQgPSAzMDAgOworCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNvbnRyb2wsIChSVU58V0FLRXxGTFVTSHxQQVVTRSkgPDwgMTYpOworCQl3aGlsZSAoKGluX2xlMzIoJmF3YWNzX3R4ZG1hLT5zdGF0dXMpICYgUlVOKSAmJiBjb3VudC0tKQorCQkJdWRlbGF5KDEpOyAvKiB0aW1lb3V0ID4gMiBzYW1wbGVzIGF0IGxvd2VzdCByYXRlKi8KKwkJaWYgKGF3YWNzKQorCQkJYXdhY3Nfc2V0dXBfZm9yX2JlZXAoYmVlcF9zcGVlZCk7CisJCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhiZWVwX2RiZG1hX2NtZCkpOworCQkodm9pZClpbl9sZTMyKCZhd2Fjc190eGRtYS0+c3RhdHVzKTsKKwkJb3V0X2xlMzIoJmF3YWNzX3R4ZG1hLT5jb250cm9sLCBSVU4gfCAoUlVOIDw8IDE2KSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiB1c2VkIGluIGluaXQgYW5kIGZvciB3YWtlLXVwICovCisKK3N0YXRpYyB2b2lkCitsb2FkX2F3YWNzKHZvaWQpCit7CisJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzBdICsgTUFTS19BRERSMCk7CisJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzFdICsgTUFTS19BRERSMSk7CisJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzJdICsgTUFTS19BRERSMik7CisJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzRdICsgTUFTS19BRERSNCk7CisKKwlpZiAoYXdhY3NfcmV2aXNpb24gPT0gQVdBQ1NfU0NSRUFNRVIpIHsKKwkJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzVdICsgTUFTS19BRERSNSk7CisJCW1zbGVlcCgxMDApOworCQlhd2Fjc193cml0ZShhd2Fjc19yZWdbNl0gKyBNQVNLX0FERFI2KTsKKwkJbXNsZWVwKDIpOworCQlhd2Fjc193cml0ZShhd2Fjc19yZWdbMV0gKyBNQVNLX0FERFIxKTsKKwkJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzddICsgTUFTS19BRERSNyk7CisJfQorCWlmIChhd2FjcykgeworCQlpZiAoaHdfY2FuX2J5dGVzd2FwICYmIChkbWFzb3VuZC5oYXJkLmZvcm1hdCA9PSBBRk1UX1MxNl9MRSkpCisJCQlvdXRfbGUzMigmYXdhY3MtPmJ5dGVzd2FwLCBCU19WQUwpOworCQllbHNlCisJCQlvdXRfbGUzMigmYXdhY3MtPmJ5dGVzd2FwLCAwKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworLyoKKyAqIFNhdmUgc3RhdGUgd2hlbiBnb2luZyB0byBzbGVlcCwgcmVzdG9yZSBpdCBhZnRlcndhcmRzLgorICovCisvKiBGSVhNRTogc29ydCBvdXQgZGlzYWJsaW5nL3JlLWVuYWJsaW5nIG9mIHJlYWQgc3R1ZmYgYXMgd2VsbCAqLworc3RhdGljIGludCBhd2Fjc19zbGVlcF9ub3RpZnkoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAod2hlbikgeworCWNhc2UgUEJPT0tfU0xFRVBfTk9XOgkJCisJCUxPQ0soKTsKKwkJYXdhY3Nfc2xlZXBpbmcgPSAxOworCQkvKiBUZWxsIHRoZSByZXN0IG9mIHRoZSBkcml2ZXIgd2UgYXJlIG5vdyBnb2luZyB0byBzbGVlcCAqLworCQltYigpOworCQlpZiAoYXdhY3NfcmV2aXNpb24gPT0gQVdBQ1NfU0NSRUFNRVIgfHwKKwkJICAgIGF3YWNzX3JldmlzaW9uID09IEFXQUNTX0FXQUNTKSB7CisJCQlhd2Fjc19yZWcxX3NhdmUgPSBhd2Fjc19yZWdbMV07CisJCQlhd2Fjc19yZWdbMV0gfD0gTUFTS19BTVVURSB8IE1BU0tfQ01VVEU7CisJCQlhd2Fjc193cml0ZShNQVNLX0FERFIxIHwgYXdhY3NfcmVnWzFdKTsKKwkJfQorCisJCVBNYWNTaWxlbmNlKCk7CisJCS8qIHN0b3AgcnggLSBpZiBnb2luZyAtIGEgYml0IG9mIGEgZGFmdCB1c2VyLi4uIGJ1dCAqLworCQlvdXRfbGUzMigmYXdhY3NfcnhkbWEtPmNvbnRyb2wsIChSVU58V0FLRXxGTFVTSCA8PCAxNikpOworCQkvKiBkZW55IGludGVycnVwdHMgKi8KKwkJaWYgKGF3YWNzKQorCQkJZGlzYWJsZV9pcnEoYXdhY3NfaXJxKTsKKwkJZGlzYWJsZV9pcnEoYXdhY3NfdHhfaXJxKTsKKwkJZGlzYWJsZV9pcnEoYXdhY3NfcnhfaXJxKTsKKwkJLyogQ2hpcCBzcGVjaWZpYyBzbGVlcCBjb2RlICovCisJCXN3aXRjaCAoYXdhY3NfcmV2aXNpb24pIHsKKwkJCWNhc2UgQVdBQ1NfVFVNQkxFUjoKKwkJCWNhc2UgQVdBQ1NfU05BUFBFUjoKKwkJCQl3cml0ZV9hdWRpb19ncGlvKGdwaW9faGVhZHBob25lX211dGUsIGdwaW9faGVhZHBob25lX211dGVfcG9sKTsKKwkJCQl3cml0ZV9hdWRpb19ncGlvKGdwaW9fYW1wX211dGUsIGdwaW9fYW1wX211dGVfcG9sKTsKKwkJCQl0YXNfZW50ZXJfc2xlZXAoKTsKKwkJCQl3cml0ZV9hdWRpb19ncGlvKGdwaW9fYXVkaW9fcmVzZXQsIGdwaW9fYXVkaW9fcmVzZXRfcG9sKTsKKwkJCQlicmVhayA7CisJCQljYXNlIEFXQUNTX0RBQ0E6CisJCQkJZGFjYV9lbnRlcl9zbGVlcCgpOworCQkJCWJyZWFrIDsKKwkJCWNhc2UgQVdBQ1NfQlVSR1VORFk6CisJCQkJYnJlYWsgOworCQkJY2FzZSBBV0FDU19TQ1JFQU1FUjoKKwkJCWNhc2UgQVdBQ1NfQVdBQ1M6CisJCQlkZWZhdWx0OgorCQkJCW91dF9sZTMyKCZhd2Fjcy0+Y29udHJvbCwgMHgxMSkgOworCQkJCWJyZWFrIDsKKwkJfQorCQkvKiBEaXNhYmxlIHNvdW5kIGNsb2NrICovCisJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NPVU5EX0NISVBfRU5BQkxFLCBhd2Fjc19ub2RlLCAwLCAwKTsKKwkJLyogQWNjb3JkaW5nIHRvIERhcndpbiwgd2UgZG8gdGhhdCBhZnRlciB0dXJuaW5nIG9mZiB0aGUgc291bmQKKwkJICogY2hpcCBjbG9jay4gQWxsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGNsZWFuZWQgdXAgb25jZSB3ZSBwcm9wZXJseQorCQkgKiBwYXJzZSB0aGUgT0Ygc291bmQtb2JqZWN0cworCQkgKi8KKwkJaWYgKChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazMsMSIpIHx8CisJCSAgICBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazMsMiIpKSAmJiBhd2FjcykgeworCQkJYXdhY3NfcmVnWzFdIHw9IE1BU0tfUEFST1VUMCB8IE1BU0tfUEFST1VUMTsKKwkJCWF3YWNzX3dyaXRlKE1BU0tfQUREUjEgfCBhd2Fjc19yZWdbMV0pOworCQkJbXNsZWVwKDIwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQQk9PS19XQUtFOgorCQkvKiBFbmFibGUgc291bmQgY2xvY2sgKi8KKwkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfU09VTkRfQ0hJUF9FTkFCTEUsIGF3YWNzX25vZGUsIDAsIDEpOworCQlpZiAoKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMywxIikgfHwKKwkJICAgIG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMywyIikpICYmIGF3YWNzKSB7CisJCQltc2xlZXAoMTAwKTsKKwkJCWF3YWNzX3JlZ1sxXSAmPSB+KE1BU0tfUEFST1VUMCB8IE1BU0tfUEFST1VUMSk7CisJCQlhd2Fjc193cml0ZShNQVNLX0FERFIxIHwgYXdhY3NfcmVnWzFdKTsKKwkJCW1zbGVlcCgzMDApOworCQl9IGVsc2UKKwkJCW1zbGVlcCgxMDAwKTsKKyAJCS8qIHJlc3RvcmUgc2V0dGluZ3MgKi8KKwkJc3dpdGNoIChhd2Fjc19yZXZpc2lvbikgeworCQkJY2FzZSBBV0FDU19UVU1CTEVSOgorCQkJY2FzZSBBV0FDU19TTkFQUEVSOgorCQkJCXdyaXRlX2F1ZGlvX2dwaW8oZ3Bpb19oZWFkcGhvbmVfbXV0ZSwgZ3Bpb19oZWFkcGhvbmVfbXV0ZV9wb2wpOworCQkJCXdyaXRlX2F1ZGlvX2dwaW8oZ3Bpb19hbXBfbXV0ZSwgZ3Bpb19hbXBfbXV0ZV9wb2wpOworCQkJCXdyaXRlX2F1ZGlvX2dwaW8oZ3Bpb19hdWRpb19yZXNldCwgZ3Bpb19hdWRpb19yZXNldF9wb2wpOworCQkJCW1zbGVlcCgxMDApOworCQkJCXdyaXRlX2F1ZGlvX2dwaW8oZ3Bpb19hdWRpb19yZXNldCwgIWdwaW9fYXVkaW9fcmVzZXRfcG9sKTsKKwkJCQltc2xlZXAoMTUwKTsKKwkJCQl0YXNfbGVhdmVfc2xlZXAoKTsgLyogU3R1YiBmb3Igbm93ICovCisJCQkJaGVhZHBob25lX2ludHIoMCxOVUxMLE5VTEwpOworCQkJCWJyZWFrOworCQkJY2FzZSBBV0FDU19EQUNBOgorCQkJCW1zbGVlcCgxMCk7IC8qIENoZWNrIHRoaXMgISEhICovCisJCQkJZGFjYV9sZWF2ZV9zbGVlcCgpOworCQkJCWJyZWFrIDsJCS8qIGRvbnQga25vdyBob3cgeWV0ICovCisJCQljYXNlIEFXQUNTX0JVUkdVTkRZOgorCQkJCWJyZWFrIDsKKwkJCWNhc2UgQVdBQ1NfU0NSRUFNRVI6CisJCQljYXNlIEFXQUNTX0FXQUNTOgorCQkJZGVmYXVsdDoKKwkJIAkJbG9hZF9hd2FjcygpIDsKKwkJCQlicmVhayA7CisJCX0KKwkJLyogUmVjYWxpYnJhdGUgY2hpcCAqLworCQlpZiAoYXdhY3NfcmV2aXNpb24gPT0gQVdBQ1NfU0NSRUFNRVIgJiYgYXdhY3MpCisJCQlhd2Fjc19yZWNhbGlicmF0ZSgpOworCQkvKiBNYWtlIHN1cmUgZG1hIGlzIHN0b3BwZWQgKi8KKwkJUE1hY1NpbGVuY2UoKTsKKwkJaWYgKGF3YWNzKQorCQkJZW5hYmxlX2lycShhd2Fjc19pcnEpOworCQllbmFibGVfaXJxKGF3YWNzX3R4X2lycSk7CisgCQllbmFibGVfaXJxKGF3YWNzX3J4X2lycSk7CisgCQlpZiAoYXdhY3MpIHsKKyAJCQkvKiBPSywgYWxsb3cgaW50cyBiYWNrIGFnYWluICovCisJIAkJb3V0X2xlMzIoJmF3YWNzLT5jb250cm9sLCBNQVNLX0lFUEMKKyAJCQkgCXwgKGF3YWNzX3JhdGVfaW5kZXggPDwgOCkgfCAweDExCisgCQkJCSB8IChhd2Fjc19yZXZpc2lvbiA8IEFXQUNTX0RBQ0EgPyBNQVNLX0lFRTogMCkpOworIAkJfQorIAkJaWYgKG1hY2lvX2Jhc2UgJiYgaXNfcGJvb2tfZzMpIHsKKwkJCS8qIEZJWE1FOiBzaG91bGQgcmVzdG9yZSB0aGUgc2V0dXAgd2UgaGFkLi4uKi8KKwkJCW91dF84KG1hY2lvX2Jhc2UgKyAweDM3LCAzKTsKKyAJCX0gZWxzZSBpZiAoaXNfcGJvb2tfM1gwMCkgeworCQkJaW5fOChsYXRjaF9iYXNlICsgMHgxOTApOworCQl9CisJCS8qIFJlbW92ZSBtdXRlICovCisJCWlmIChhd2Fjc19yZXZpc2lvbiA9PSBBV0FDU19TQ1JFQU1FUiB8fAorCQkgICAgYXdhY3NfcmV2aXNpb24gPT0gQVdBQ1NfQVdBQ1MpIHsKKwkJCWF3YWNzX3JlZ1sxXSA9IGF3YWNzX3JlZzFfc2F2ZTsKKwkJCWF3YWNzX3dyaXRlKE1BU0tfQUREUjEgfCBhd2Fjc19yZWdbMV0pOworCQl9CisgCQlhd2Fjc19zbGVlcGluZyA9IDA7CisJCS8qIFJlc3VtZSBwZW5kaW5nIHNvdW5kcy4gKi8KKwkJLyogd2UgZG9uJ3QgdHJ5IHRvIHJlc3RhcnQgaW5wdXQuLi4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKwkJX19QTWFjUGxheSgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJCVVOTE9DSygpOworCX0KKwlyZXR1cm4gUEJPT0tfU0xFRVBfT0s7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKworCisvKiBBbGwgdGhlIGJ1cmd1bmR5IGZ1bmN0aW9uczogKi8KKworLyogV2FpdHMgZm9yIGJ1c3kgZmxhZyB0byBjbGVhciAqLworaW5saW5lIHN0YXRpYyB2b2lkCithd2Fjc19idXJndW5keV9idXN5X3dhaXQodm9pZCkKK3sKKwlpbnQgY291bnQgPSA1MDsgLyogPiAyIHNhbXBsZXMgYXQgNDRrMSAqLworCXdoaWxlICgoaW5fbGUzMigmYXdhY3MtPmNvZGVjX2N0cmwpICYgTUFTS19ORVdFQ01EKSAmJiBjb3VudC0tKQorCQl1ZGVsYXkoMSkgOworfQorCitpbmxpbmUgc3RhdGljIHZvaWQKK2F3YWNzX2J1cmd1bmR5X2V4dGVuZF93YWl0KHZvaWQpCit7CisJaW50IGNvdW50ID0gNTAgOyAvKiA+IDIgc2FtcGxlcyBhdCA0NGsxICovCisJd2hpbGUgKCghKGluX2xlMzIoJmF3YWNzLT5jb2RlY19zdGF0KSAmIE1BU0tfRVhURU5EKSkgJiYgY291bnQtLSkKKwkJdWRlbGF5KDEpIDsKKwljb3VudCA9IDUwOworCXdoaWxlICgoaW5fbGUzMigmYXdhY3MtPmNvZGVjX3N0YXQpICYgTUFTS19FWFRFTkQpICYmIGNvdW50LS0pCisJCXVkZWxheSgxKTsKK30KKworc3RhdGljIHZvaWQKK2F3YWNzX2J1cmd1bmR5X3djdyh1bnNpZ25lZCBhZGRyLCB1bnNpZ25lZCB2YWwpCit7CisJb3V0X2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsLCBhZGRyICsgMHgyMDBjMDAgKyAodmFsICYgMHhmZikpOworCWF3YWNzX2J1cmd1bmR5X2J1c3lfd2FpdCgpOworCW91dF9sZTMyKCZhd2Fjcy0+Y29kZWNfY3RybCwgYWRkciArIDB4MjAwZDAwICsoKHZhbD4+OCkgJiAweGZmKSk7CisJYXdhY3NfYnVyZ3VuZHlfYnVzeV93YWl0KCk7CisJb3V0X2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsLCBhZGRyICsgMHgyMDBlMDAgKygodmFsPj4xNikgJiAweGZmKSk7CisJYXdhY3NfYnVyZ3VuZHlfYnVzeV93YWl0KCk7CisJb3V0X2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsLCBhZGRyICsgMHgyMDBmMDAgKygodmFsPj4yNCkgJiAweGZmKSk7CisJYXdhY3NfYnVyZ3VuZHlfYnVzeV93YWl0KCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorYXdhY3NfYnVyZ3VuZHlfcmN3KHVuc2lnbmVkIGFkZHIpCit7CisJdW5zaWduZWQgdmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogc2hvdWxkIGhhdmUgdGltZW91dHMgaGVyZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisKKwlvdXRfbGUzMigmYXdhY3MtPmNvZGVjX2N0cmwsIGFkZHIgKyAweDEwMDAwMCk7CisJYXdhY3NfYnVyZ3VuZHlfYnVzeV93YWl0KCk7CisJYXdhY3NfYnVyZ3VuZHlfZXh0ZW5kX3dhaXQoKTsKKwl2YWwgKz0gKGluX2xlMzIoJmF3YWNzLT5jb2RlY19zdGF0KSA+PiA0KSAmIDB4ZmY7CisKKwlvdXRfbGUzMigmYXdhY3MtPmNvZGVjX2N0cmwsIGFkZHIgKyAweDEwMDEwMCk7CisJYXdhY3NfYnVyZ3VuZHlfYnVzeV93YWl0KCk7CisJYXdhY3NfYnVyZ3VuZHlfZXh0ZW5kX3dhaXQoKTsKKwl2YWwgKz0gKChpbl9sZTMyKCZhd2Fjcy0+Y29kZWNfc3RhdCk+PjQpICYgMHhmZikgPDw4OworCisJb3V0X2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsLCBhZGRyICsgMHgxMDAyMDApOworCWF3YWNzX2J1cmd1bmR5X2J1c3lfd2FpdCgpOworCWF3YWNzX2J1cmd1bmR5X2V4dGVuZF93YWl0KCk7CisJdmFsICs9ICgoaW5fbGUzMigmYXdhY3MtPmNvZGVjX3N0YXQpPj40KSAmIDB4ZmYpIDw8MTY7CisKKwlvdXRfbGUzMigmYXdhY3MtPmNvZGVjX2N0cmwsIGFkZHIgKyAweDEwMDMwMCk7CisJYXdhY3NfYnVyZ3VuZHlfYnVzeV93YWl0KCk7CisJYXdhY3NfYnVyZ3VuZHlfZXh0ZW5kX3dhaXQoKTsKKwl2YWwgKz0gKChpbl9sZTMyKCZhd2Fjcy0+Y29kZWNfc3RhdCk+PjQpICYgMHhmZikgPDwyNDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB2YWw7Cit9CisKKworc3RhdGljIHZvaWQKK2F3YWNzX2J1cmd1bmR5X3djYih1bnNpZ25lZCBhZGRyLCB1bnNpZ25lZCB2YWwpCit7CisJb3V0X2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsLCBhZGRyICsgMHgzMDAwMDAgKyAodmFsICYgMHhmZikpOworCWF3YWNzX2J1cmd1bmR5X2J1c3lfd2FpdCgpOworfQorCitzdGF0aWMgdW5zaWduZWQKK2F3YWNzX2J1cmd1bmR5X3JjYih1bnNpZ25lZCBhZGRyKQoreworCXVuc2lnbmVkIHZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHNob3VsZCBoYXZlIHRpbWVvdXRzIGhlcmUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCisJb3V0X2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsLCBhZGRyICsgMHgxMDAwMDApOworCWF3YWNzX2J1cmd1bmR5X2J1c3lfd2FpdCgpOworCWF3YWNzX2J1cmd1bmR5X2V4dGVuZF93YWl0KCk7CisJdmFsICs9IChpbl9sZTMyKCZhd2Fjcy0+Y29kZWNfc3RhdCkgPj4gNCkgJiAweGZmOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludAorYXdhY3NfYnVyZ3VuZHlfY2hlY2sodm9pZCkKK3sKKwkvKiBDaGVja3MgdG8gc2VlIHRoZSBjaGlwIGlzIGFsaXZlIGFuZCBraWNraW5nICovCisJaW50IGVycm9yID0gaW5fbGUzMigmYXdhY3MtPmNvZGVjX2N0cmwpICYgTUFTS19FUlJDT0RFOworCisJcmV0dXJuIGVycm9yID09IDB4ZjAwMDA7Cit9CisKK3N0YXRpYyBpbnQKK2F3YWNzX2J1cmd1bmR5X2luaXQodm9pZCkKK3sKKwlpZiAoYXdhY3NfYnVyZ3VuZHlfY2hlY2soKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJkbWFzb3VuZF9wbWFjOiBidXJndW5keSBub3Qgd29ya2luZyA6LShcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlhd2Fjc19idXJndW5keV93Y2IoTUFTS19BRERSX0JVUkdVTkRZX09VVFBVVEVOQUJMRVMsCisJCQkgICBERUZfQlVSR1VORFlfT1VUUFVURU5BQkxFUyk7CisJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9NT1JFX09VVFBVVEVOQUJMRVMsCisJCQkgICBERUZfQlVSR1VORFlfTU9SRV9PVVRQVVRFTkFCTEVTKTsKKwlhd2Fjc19idXJndW5keV93Y3coTUFTS19BRERSX0JVUkdVTkRZX09VVFBVVFNFTEVDVFMsCisJCQkgICBERUZfQlVSR1VORFlfT1VUUFVUU0VMRUNUUyk7CisKKwlhd2Fjc19idXJndW5keV93Y2IoTUFTS19BRERSX0JVUkdVTkRZX0lOUFNFTDIxLAorCQkJICAgREVGX0JVUkdVTkRZX0lOUFNFTDIxKTsKKwlhd2Fjc19idXJndW5keV93Y2IoTUFTS19BRERSX0JVUkdVTkRZX0lOUFNFTDMsCisJCQkgICBERUZfQlVSR1VORFlfSU5QU0VMMyk7CisJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9HQUlOQ0QsCisJCQkgICBERUZfQlVSR1VORFlfR0FJTkNEKTsKKwlhd2Fjc19idXJndW5keV93Y2IoTUFTS19BRERSX0JVUkdVTkRZX0dBSU5MSU5FLAorCQkJICAgREVGX0JVUkdVTkRZX0dBSU5MSU5FKTsKKwlhd2Fjc19idXJndW5keV93Y2IoTUFTS19BRERSX0JVUkdVTkRZX0dBSU5NSUMsCisJCQkgICBERUZfQlVSR1VORFlfR0FJTk1JQyk7CisJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9HQUlOTU9ERU0sCisJCQkgICBERUZfQlVSR1VORFlfR0FJTk1PREVNKTsKKworCWF3YWNzX2J1cmd1bmR5X3djYihNQVNLX0FERFJfQlVSR1VORFlfQVRURU5TUEVBS0VSLAorCQkJICAgREVGX0JVUkdVTkRZX0FUVEVOU1BFQUtFUik7CisJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9BVFRFTkxJTkVPVVQsCisJCQkgICBERUZfQlVSR1VORFlfQVRURU5MSU5FT1VUKTsKKwlhd2Fjc19idXJndW5keV93Y2IoTUFTS19BRERSX0JVUkdVTkRZX0FUVEVOSFAsCisJCQkgICBERUZfQlVSR1VORFlfQVRURU5IUCk7CisKKwlhd2Fjc19idXJndW5keV93Y3coTUFTS19BRERSX0JVUkdVTkRZX01BU1RFUl9WT0xVTUUsCisJCQkgICBERUZfQlVSR1VORFlfTUFTVEVSX1ZPTFVNRSk7CisJYXdhY3NfYnVyZ3VuZHlfd2N3KE1BU0tfQUREUl9CVVJHVU5EWV9WT0xDRCwKKwkJCSAgIERFRl9CVVJHVU5EWV9WT0xDRCk7CisJYXdhY3NfYnVyZ3VuZHlfd2N3KE1BU0tfQUREUl9CVVJHVU5EWV9WT0xMSU5FLAorCQkJICAgREVGX0JVUkdVTkRZX1ZPTExJTkUpOworCWF3YWNzX2J1cmd1bmR5X3djdyhNQVNLX0FERFJfQlVSR1VORFlfVk9MTUlDLAorCQkJICAgREVGX0JVUkdVTkRZX1ZPTE1JQyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithd2Fjc19idXJndW5keV93cml0ZV92b2x1bWUodW5zaWduZWQgYWRkcmVzcywgaW50IHZvbHVtZSkKK3sKKwlpbnQgaGFyZHZvbHVtZSxsdm9sdW1lLHJ2b2x1bWU7CisKKwlsdm9sdW1lID0gKHZvbHVtZSAmIDB4ZmYpID8gKHZvbHVtZSAmIDB4ZmYpICsgMTU1IDogMDsKKwlydm9sdW1lID0gKCh2b2x1bWUgPj44KSYweGZmKSA/ICgodm9sdW1lID4+IDgpJjB4ZmYgKSArIDE1NSA6IDA7CisKKwloYXJkdm9sdW1lID0gbHZvbHVtZSArIChydm9sdW1lIDw8IDE2KTsKKworCWF3YWNzX2J1cmd1bmR5X3djdyhhZGRyZXNzLCBoYXJkdm9sdW1lKTsKK30KKworc3RhdGljIGludAorYXdhY3NfYnVyZ3VuZHlfcmVhZF92b2x1bWUodW5zaWduZWQgYWRkcmVzcykKK3sKKwlpbnQgc29mdHZvbHVtZSx3dm9sdW1lOworCisJd3ZvbHVtZSA9IGF3YWNzX2J1cmd1bmR5X3JjdyhhZGRyZXNzKTsKKworCXNvZnR2b2x1bWUgPSAod3ZvbHVtZSAmIDB4ZmYpIC0gMTU1OworCXNvZnR2b2x1bWUgKz0gKCgod3ZvbHVtZSA+PiAxNikgJiAweGZmKSAtIDE1NSk8PDg7CisKKwlyZXR1cm4gc29mdHZvbHVtZSA+IDAgPyBzb2Z0dm9sdW1lIDogMDsKK30KKworc3RhdGljIGludAorYXdhY3NfYnVyZ3VuZHlfcmVhZF9tdm9sdW1lKHVuc2lnbmVkIGFkZHJlc3MpCit7CisJaW50IGx2b2x1bWUscnZvbHVtZSx3dm9sdW1lOworCisJd3ZvbHVtZSA9IGF3YWNzX2J1cmd1bmR5X3JjdyhhZGRyZXNzKTsKKworCXd2b2x1bWUgJj0gMHhmZmZmOworCisJcnZvbHVtZSA9ICh3dm9sdW1lICYgMHhmZikgLSAxNTU7CisJbHZvbHVtZSA9ICgod3ZvbHVtZSAmIDB4ZmYwMCk+PjgpIC0gMTU1OworCisJcmV0dXJuIGx2b2x1bWUgKyAocnZvbHVtZSA8PCA4KTsKK30KKworc3RhdGljIHZvaWQKK2F3YWNzX2J1cmd1bmR5X3dyaXRlX212b2x1bWUodW5zaWduZWQgYWRkcmVzcywgaW50IHZvbHVtZSkKK3sKKwlpbnQgbHZvbHVtZSxydm9sdW1lLGhhcmR2b2x1bWU7CisKKwlsdm9sdW1lID0gKHZvbHVtZSAmMHhmZikgPyAodm9sdW1lICYgMHhmZikgKyAxNTUgOjA7CisJcnZvbHVtZSA9ICgodm9sdW1lID4+OCkgJiAweGZmKSA/ICh2b2x1bWUgPj4gOCkgKyAxNTUgOjA7CisKKwloYXJkdm9sdW1lID0gbHZvbHVtZSArIChydm9sdW1lIDw8IDgpOworCWhhcmR2b2x1bWUgKz0gKGhhcmR2b2x1bWUgPDwgMTYpOworCisJYXdhY3NfYnVyZ3VuZHlfd2N3KGFkZHJlc3MsIGhhcmR2b2x1bWUpOworfQorCisvKiBFbmQgYnVyZ3VuZHkgZnVuY3Rpb25zICovCisKKy8qIFNldCB1cCBvdXRwdXQgdm9sdW1lcyBvbiBtYWNoaW5lcyB3aXRoIHRoZSAncGVyY2gvd2hpc3BlcicgZXh0ZW5zaW9uIGNhcmQuCisgKiB0aGlzIGhhcyBhbiBTR1MgaTJjIGNoaXAgKDc0MzMpIHdoaWNoIGlzIGFjY2Vzc2VkIHVzaW5nIHRoZSBjdWRhLgorICoKKyAqIFRPRE86IHNwbGl0IHRoaXMgb3V0IGFuZCBtYWtlIHVzZSBvZiB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIFNHUyBjaGlwIHRvCisgKiBkbyBCYXNzLCBUcmVibGUgZXRjLgorICovCisKK3N0YXRpYyB2b2lkCithd2Fjc19lbmFibGVfYW1wKGludCBzcGtyX3ZvbCkKK3sKKyNpZmRlZiBDT05GSUdfQURCX0NVREEKKwlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOworCisJaWYgKHN5c19jdHJsZXIgIT0gU1lTX0NUUkxFUl9DVURBKQorCQlyZXR1cm47CisKKwkvKiB0dXJuIG9uIGhlYWRwaG9uZXMgKi8KKwljdWRhX3JlcXVlc3QoJnJlcSwgTlVMTCwgNSwgQ1VEQV9QQUNLRVQsIENVREFfR0VUX1NFVF9JSUMsCisJCSAgICAgMHg4YSwgNCwgMCk7CisJd2hpbGUgKCFyZXEuY29tcGxldGUpIGN1ZGFfcG9sbCgpOworCWN1ZGFfcmVxdWVzdCgmcmVxLCBOVUxMLCA1LCBDVURBX1BBQ0tFVCwgQ1VEQV9HRVRfU0VUX0lJQywKKwkJICAgICAweDhhLCA2LCAwKTsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkgY3VkYV9wb2xsKCk7CisKKwkvKiB0dXJuIG9uIHNwZWFrZXIgKi8KKwljdWRhX3JlcXVlc3QoJnJlcSwgTlVMTCwgNSwgQ1VEQV9QQUNLRVQsIENVREFfR0VUX1NFVF9JSUMsCisJCSAgICAgMHg4YSwgMywgKDEwMCAtIChzcGtyX3ZvbCAmIDB4ZmYpKSAqIDMyIC8gMTAwKTsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkgY3VkYV9wb2xsKCk7CisJY3VkYV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDUsIENVREFfUEFDS0VULCBDVURBX0dFVF9TRVRfSUlDLAorCQkgICAgIDB4OGEsIDUsICgxMDAgLSAoKHNwa3Jfdm9sID4+IDgpICYgMHhmZikpICogMzIgLyAxMDApOworCXdoaWxlICghcmVxLmNvbXBsZXRlKSBjdWRhX3BvbGwoKTsKKworCWN1ZGFfcmVxdWVzdCgmcmVxLCBOVUxMLCA1LCBDVURBX1BBQ0tFVCwKKwkJICAgICBDVURBX0dFVF9TRVRfSUlDLCAweDhhLCAxLCAweDI5KTsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkgY3VkYV9wb2xsKCk7CisjZW5kaWYgLyogQ09ORklHX0FEQl9DVURBICovCit9CisKKworLyoqKiBNaWQgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKiAvZGV2L21peGVyIGFic3RyYWN0aW9uCisgKi8KKworc3RhdGljIHZvaWQgZG9fbGluZV9sZXYoaW50IGRhdGEpCit7CisJCWxpbmVfbGV2ID0gZGF0YSA7CisJCWF3YWNzX3JlZ1swXSAmPSB+TUFTS19NVVhfQVVESU47CisJCWlmICgoZGF0YSAmIDB4ZmYpID49IDUwKQorCQkJYXdhY3NfcmVnWzBdIHw9IE1BU0tfTVVYX0FVRElOOworCQlhd2Fjc193cml0ZShNQVNLX0FERFIwIHwgYXdhY3NfcmVnWzBdKTsKK30KKworc3RhdGljIHZvaWQgZG9faXBfZ2FpbihpbnQgZGF0YSkKK3sKKwlpcF9nYWluID0gZGF0YSA7CisJZGF0YSAmPSAweGZmOworCWF3YWNzX3JlZ1swXSAmPSB+TUFTS19HQUlOTElORTsKKwlpZiAoYXdhY3NfcmV2aXNpb24gPT0gQVdBQ1NfU0NSRUFNRVIpIHsKKwkJYXdhY3NfcmVnWzZdICY9IH5NQVNLX01JQ19CT09TVCA7CisJCWlmIChkYXRhID49IDMzKSB7CisJCQlhd2Fjc19yZWdbMF0gfD0gTUFTS19HQUlOTElORTsKKwkJCWlmKCBkYXRhID49IDY2KQorCQkJCWF3YWNzX3JlZ1s2XSB8PSBNQVNLX01JQ19CT09TVCA7CisJCX0KKwkJYXdhY3Nfd3JpdGUoTUFTS19BRERSNiB8IGF3YWNzX3JlZ1s2XSkgOworCX0gZWxzZSB7CisJCWlmIChkYXRhID49IDUwKQorCQkJYXdhY3NfcmVnWzBdIHw9IE1BU0tfR0FJTkxJTkU7CisJfQorCWF3YWNzX3dyaXRlKE1BU0tfQUREUjAgfCBhd2Fjc19yZWdbMF0pOworfQorCitzdGF0aWMgdm9pZCBkb19taWNfbGV2KGludCBkYXRhKQoreworCW1pY19sZXYgPSBkYXRhIDsKKwlkYXRhICY9IDB4ZmY7CisJYXdhY3NfcmVnWzBdICY9IH5NQVNLX01VWF9NSUM7CisJaWYgKGRhdGEgPj0gNTApCisJCWF3YWNzX3JlZ1swXSB8PSBNQVNLX01VWF9NSUM7CisJYXdhY3Nfd3JpdGUoTUFTS19BRERSMCB8IGF3YWNzX3JlZ1swXSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2NkX2xldihpbnQgZGF0YSkKK3sKKwljZF9sZXYgPSBkYXRhIDsKKwlhd2Fjc19yZWdbMF0gJj0gfk1BU0tfTVVYX0NEOworCWlmICgoZGF0YSAmIDB4ZmYpID49IDUwKQorCQlhd2Fjc19yZWdbMF0gfD0gTUFTS19NVVhfQ0Q7CisJYXdhY3Nfd3JpdGUoTUFTS19BRERSMCB8IGF3YWNzX3JlZ1swXSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3JlY19sZXYoaW50IGRhdGEpCit7CisJaW50IGxlZnQsIHJpZ2h0IDsKKwlyZWNfbGV2ID0gZGF0YSA7CisJLyogbmVlZCB0byBmdWRnZSB0aGlzIHRvIHVzZSB0aGUgdm9sdW1lIHNldHRlciByb3V0aW5lICovCisJbGVmdCA9IDEwMCAtIChkYXRhICYgMHhmZikgOyBpZiggbGVmdCA8IDAgKSBsZWZ0ID0gMCA7CisJcmlnaHQgPSAxMDAgLSAoKGRhdGEgPj4gOCkgJiAweGZmKSA7IGlmKCByaWdodCA8IDAgKSByaWdodCA9IDAgOworCWxlZnQgfD0gKHJpZ2h0IDw8IDggKTsKKwlsZWZ0ID0gYXdhY3Nfdm9sdW1lX3NldHRlcihsZWZ0LCAwLCAwLCA0KTsKK30KKworc3RhdGljIHZvaWQgZG9fcGFzc3RocnVfdm9sKGludCBkYXRhKQoreworCXBhc3N0aHJ1X3ZvbCA9IGRhdGEgOworCWF3YWNzX3JlZ1sxXSAmPSB+TUFTS19MT09QVEhSVTsKKwlpZiAoYXdhY3NfcmV2aXNpb24gPT0gQVdBQ1NfU0NSRUFNRVIpIHsKKwkJaWYoIGRhdGEgKSB7IC8qIHN3aXRjaCBpdCBvbiBmb3Igbm9uLXplcm8gKi8KKwkJCWF3YWNzX3JlZ1sxXSB8PSBNQVNLX0xPT1BUSFJVOworCQkJYXdhY3Nfd3JpdGUoTUFTS19BRERSMSB8IGF3YWNzX3JlZ1sxXSk7CisJCX0KKwkJZGF0YSA9IGF3YWNzX3ZvbHVtZV9zZXR0ZXIoZGF0YSwgNSwgMCwgNikgOworCX0gZWxzZSB7CisJCWlmICgoZGF0YSAmIDB4ZmYpID49IDUwKQorCQkJYXdhY3NfcmVnWzFdIHw9IE1BU0tfTE9PUFRIUlU7CisJCWF3YWNzX3dyaXRlKE1BU0tfQUREUjEgfCBhd2Fjc19yZWdbMV0pOworCQlkYXRhID0gKGF3YWNzX3JlZ1sxXSAmIE1BU0tfTE9PUFRIUlUpPyAxMDA6IDA7CisJfQorfQorCitzdGF0aWMgaW50IGF3YWNzX21peGVyX2lvY3RsKHVfaW50IGNtZCwgdV9sb25nIGFyZykKK3sKKwlpbnQgZGF0YTsKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9DQVBTOgorCQkvKiBzYXkgd2Ugd2lsbCBhbGxvdyBtdWx0aXBsZSBpbnB1dHM/ICBwcm9iLiB3cm9uZworCQkJc28gSSdtIHN3aXRjaGluZyBpdCB0byBzaW5nbGUgKi8KKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIDEpOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLOgorCQlkYXRhICA9IFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19TUEVBS0VSCisJCQl8IFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRAorCQkJfCBTT1VORF9NQVNLX0lHQUlOIHwgU09VTkRfTUFTS19SRUNMRVYKKwkJCXwgU09VTkRfTUFTS19BTFRQQ00KKwkJCXwgU09VTkRfTUFTS19NT05JVE9SOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSzoKKwkJZGF0YSA9IFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRDsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ1NSQzoKKwkJZGF0YSA9IDA7CisJCWlmIChhd2Fjc19yZWdbMF0gJiBNQVNLX01VWF9BVURJTikKKwkJCWRhdGEgfD0gU09VTkRfTUFTS19MSU5FOworCQlpZiAoYXdhY3NfcmVnWzBdICYgTUFTS19NVVhfTUlDKQorCQkJZGF0YSB8PSBTT1VORF9NQVNLX01JQzsKKwkJaWYgKGF3YWNzX3JlZ1swXSAmIE1BU0tfTVVYX0NEKQorCQkJZGF0YSB8PSBTT1VORF9NQVNLX0NEOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQzoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJZGF0YSAmPSAoU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0NEKTsKKwkJYXdhY3NfcmVnWzBdICY9IH4oTUFTS19NVVhfQ0QgfCBNQVNLX01VWF9NSUMKKwkJCQkgIHwgTUFTS19NVVhfQVVESU4pOworCQlpZiAoZGF0YSAmIFNPVU5EX01BU0tfTElORSkKKwkJCWF3YWNzX3JlZ1swXSB8PSBNQVNLX01VWF9BVURJTjsKKwkJaWYgKGRhdGEgJiBTT1VORF9NQVNLX01JQykKKwkJCWF3YWNzX3JlZ1swXSB8PSBNQVNLX01VWF9NSUM7CisJCWlmIChkYXRhICYgU09VTkRfTUFTS19DRCkKKwkJCWF3YWNzX3JlZ1swXSB8PSBNQVNLX01VWF9DRDsKKwkJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzBdIHwgTUFTS19BRERSMCk7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9TVEVSRU9ERVZTOgorCQlkYXRhID0gU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX1NQRUFLRVJ8IFNPVU5EX01BU0tfUkVDTEVWICA7CisJCWlmIChhd2Fjc19yZXZpc2lvbiA9PSBBV0FDU19TQ1JFQU1FUikKKwkJCWRhdGEgfD0gU09VTkRfTUFTS19NT05JVE9SIDsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUU6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWxpbmVfdm9sID0gZGF0YSA7CisJCWF3YWNzX3ZvbHVtZV9zZXR0ZXIoZGF0YSwgMiwgMCwgNik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU6CisJCXJjID0gSU9DVExfT1VUKGFyZywgbGluZV92b2wpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1NQRUFLRVI6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCXNwa192b2wgPSBkYXRhIDsKKwkJaWYgKGhhc19wZXJjaCkKKwkJCWF3YWNzX2VuYWJsZV9hbXAoZGF0YSk7CisJCWVsc2UKKwkJCSh2b2lkKWF3YWNzX3ZvbHVtZV9zZXR0ZXIoZGF0YSwgNCwgTUFTS19DTVVURSwgNik7CisJCS8qIGZhbGwgdGhvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NQRUFLRVI6CisJCXJjID0gSU9DVExfT1VUKGFyZywgc3BrX3ZvbCk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfQUxUUENNOgkvKiByZWFsbHkgYmVsbCB2b2x1bWUgKi8KKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJYmVlcF92b2wgPSBkYXRhICYgMHhmZjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0FMVFBDTToKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBiZWVwX3ZvbCk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTElORToKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJZG9fbGluZV9sZXYoZGF0YSkgOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfTElORToKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBsaW5lX2xldik7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfSUdBSU46CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWRvX2lwX2dhaW4oZGF0YSkgOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfSUdBSU46CisJCXJjID0gSU9DVExfT1VUKGFyZywgaXBfZ2Fpbik7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTUlDOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlkb19taWNfbGV2KGRhdGEpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfTUlDOgorCQlyYyA9IElPQ1RMX09VVChhcmcsIG1pY19sZXYpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0NEOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlkb19jZF9sZXYoZGF0YSk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9DRDoKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBjZF9sZXYpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ0xFVjoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJZG9fcmVjX2xldihkYXRhKSA7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNMRVY6CisJCXJjID0gSU9DVExfT1VUKGFyZywgcmVjX2xldik7CisJCWJyZWFrOworCWNhc2UgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTU9OSVRPUik6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWRvX3Bhc3N0aHJ1X3ZvbChkYXRhKSA7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9NT05JVE9SKToKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBwYXNzdGhydV92b2wpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJfQorCQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYXdhY3NfbWl4ZXJfaW5pdCh2b2lkKQoreworCWF3YWNzX3ZvbHVtZV9zZXR0ZXIobGluZV92b2wsIDIsIDAsIDYpOworCWlmIChoYXNfcGVyY2gpCisJCWF3YWNzX2VuYWJsZV9hbXAoc3BrX3ZvbCk7CisJZWxzZQorCQkodm9pZClhd2Fjc192b2x1bWVfc2V0dGVyKHNwa192b2wsIDQsIE1BU0tfQ01VVEUsIDYpOworCWRvX2xpbmVfbGV2KGxpbmVfbGV2KSA7CisJZG9faXBfZ2FpbihpcF9nYWluKSA7CisJZG9fbWljX2xldihtaWNfbGV2KSA7CisJZG9fY2RfbGV2KGNkX2xldikgOworCWRvX3JlY19sZXYocmVjX2xldikgOworCWRvX3Bhc3N0aHJ1X3ZvbChwYXNzdGhydV92b2wpIDsKK30KKworc3RhdGljIGludCBidXJndW5keV9taXhlcl9pb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisJaW50IGRhdGE7CisJaW50IHJjOworCisJLyogV2UgYXJlLCB3ZSBhcmUsIHdlIGFyZS4uLiBCdXJndW5keSBvciBiZXR0ZXIgKi8KKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0s6CisJCWRhdGEgPSBTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfQ0QgfAorCQkJU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19NSUMgfAorCQkJU09VTkRfTUFTS19TUEVBS0VSIHwgU09VTkRfTUFTS19BTFRQQ007CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNNQVNLOgorCQlkYXRhID0gU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19NSUMKKwkJCXwgU09VTkRfTUFTS19DRDsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ1NSQzoKKwkJZGF0YSA9IDA7CisJCWlmIChhd2Fjc19yZWdbMF0gJiBNQVNLX01VWF9BVURJTikKKwkJCWRhdGEgfD0gU09VTkRfTUFTS19MSU5FOworCQlpZiAoYXdhY3NfcmVnWzBdICYgTUFTS19NVVhfTUlDKQorCQkJZGF0YSB8PSBTT1VORF9NQVNLX01JQzsKKwkJaWYgKGF3YWNzX3JlZ1swXSAmIE1BU0tfTVVYX0NEKQorCQkJZGF0YSB8PSBTT1VORF9NQVNLX0NEOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQzoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJZGF0YSAmPSAoU09VTkRfTUFTS19MSU5FCisJCQkgfCBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QpOworCQlhd2Fjc19yZWdbMF0gJj0gfihNQVNLX01VWF9DRCB8IE1BU0tfTVVYX01JQworCQkJCSAgfCBNQVNLX01VWF9BVURJTik7CisJCWlmIChkYXRhICYgU09VTkRfTUFTS19MSU5FKQorCQkJYXdhY3NfcmVnWzBdIHw9IE1BU0tfTVVYX0FVRElOOworCQlpZiAoZGF0YSAmIFNPVU5EX01BU0tfTUlDKQorCQkJYXdhY3NfcmVnWzBdIHw9IE1BU0tfTVVYX01JQzsKKwkJaWYgKGRhdGEgJiBTT1VORF9NQVNLX0NEKQorCQkJYXdhY3NfcmVnWzBdIHw9IE1BU0tfTVVYX0NEOworCQlhd2Fjc193cml0ZShhd2Fjc19yZWdbMF0gfCBNQVNLX0FERFIwKTsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlM6CisJCWRhdGEgPSBTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfU1BFQUtFUgorCQkJfCBTT1VORF9NQVNLX1JFQ0xFViB8IFNPVU5EX01BU0tfQ0QKKwkJCXwgU09VTkRfTUFTS19MSU5FOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfQ0FQUzoKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUU6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWF3YWNzX2J1cmd1bmR5X3dyaXRlX212b2x1bWUoTUFTS19BRERSX0JVUkdVTkRZX01BU1RFUl9WT0xVTUUsIGRhdGEpOworCQkJCS8qIEZhbGwgdGhyb3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU6CisJCXJjID0gSU9DVExfT1VUKGFyZywgYXdhY3NfYnVyZ3VuZHlfcmVhZF9tdm9sdW1lKE1BU0tfQUREUl9CVVJHVU5EWV9NQVNURVJfVk9MVU1FKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfU1BFQUtFUjoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJaWYgKCEoZGF0YSAmIDB4ZmYpKSB7CisJCQkvKiBNdXRlIHRoZSBsZWZ0IHNwZWFrZXIgKi8KKwkJCWF3YWNzX2J1cmd1bmR5X3djYihNQVNLX0FERFJfQlVSR1VORFlfTU9SRV9PVVRQVVRFTkFCTEVTLAorCQkJCQkgICBhd2Fjc19idXJndW5keV9yY2IoTUFTS19BRERSX0JVUkdVTkRZX01PUkVfT1VUUFVURU5BQkxFUykgJiB+MHgyKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFVubXV0ZSB0aGUgbGVmdCBzcGVha2VyICovCisJCQlhd2Fjc19idXJndW5keV93Y2IoTUFTS19BRERSX0JVUkdVTkRZX01PUkVfT1VUUFVURU5BQkxFUywKKwkJCQkJICAgYXdhY3NfYnVyZ3VuZHlfcmNiKE1BU0tfQUREUl9CVVJHVU5EWV9NT1JFX09VVFBVVEVOQUJMRVMpIHwgMHgyKTsKKwkJfQorCQlpZiAoIShkYXRhICYgMHhmZjAwKSkgeworCQkJLyogTXV0ZSB0aGUgcmlnaHQgc3BlYWtlciAqLworCQkJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9NT1JFX09VVFBVVEVOQUJMRVMsCisJCQkJCSAgIGF3YWNzX2J1cmd1bmR5X3JjYihNQVNLX0FERFJfQlVSR1VORFlfTU9SRV9PVVRQVVRFTkFCTEVTKSAmIH4weDQpOworCQl9IGVsc2UgeworCQkJLyogVW5tdXRlIHRoZSByaWdodCBzcGVha2VyICovCisJCQlhd2Fjc19idXJndW5keV93Y2IoTUFTS19BRERSX0JVUkdVTkRZX01PUkVfT1VUUFVURU5BQkxFUywKKwkJCQkJICAgYXdhY3NfYnVyZ3VuZHlfcmNiKE1BU0tfQUREUl9CVVJHVU5EWV9NT1JFX09VVFBVVEVOQUJMRVMpIHwgMHg0KTsKKwkJfQorCisJCWRhdGEgPSAoKChkYXRhJjB4ZmYpKjE2KS8xMDAgPiAweGYgPyAweGYgOgorCQkJKCgoZGF0YSYweGZmKSoxNikvMTAwKSkgKworCQkJKCgoKGRhdGE+PjgpKjE2KS8xMDAgPiAweGYgPyAweGYgOgorCQkJICAoKCgoZGF0YT4+OCkqMTYpLzEwMCkpKTw8NCk7CisKKwkJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9BVFRFTlNQRUFLRVIsIH5kYXRhKTsKKwkJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfU1BFQUtFUjoKKwkJZGF0YSA9IGF3YWNzX2J1cmd1bmR5X3JjYihNQVNLX0FERFJfQlVSR1VORFlfQVRURU5TUEVBS0VSKTsKKwkJZGF0YSA9ICgoKGRhdGEgJiAweGYpKjEwMCkvMTYpICsgKCgoKGRhdGE+PjQpKjEwMCkvMTYpPDw4KTsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCAofmRhdGEpICYgMHgwMDAwZmZmZik7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfQUxUUENNOgkvKiByZWFsbHkgYmVsbCB2b2x1bWUgKi8KKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJYmVlcF92b2wgPSBkYXRhICYgMHhmZjsKKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfQUxUUENNOgorCQlyYyA9IElPQ1RMX09VVChhcmcsIGJlZXBfdm9sKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9MSU5FOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlhd2Fjc19idXJndW5keV93cml0ZV92b2x1bWUoTUFTS19BRERSX0JVUkdVTkRZX1ZPTExJTkUsIGRhdGEpOworCisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkU6CisJCWRhdGEgPSBhd2Fjc19idXJndW5keV9yZWFkX3ZvbHVtZShNQVNLX0FERFJfQlVSR1VORFlfVk9MTElORSk7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTUlDOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQkJCS8qIE1pYyBpcyBtb25vIGRldmljZSAqLworCQlkYXRhID0gKGRhdGEgPDwgOCkgKyAoZGF0YSA8PCAyNCk7CisJCWF3YWNzX2J1cmd1bmR5X3dyaXRlX3ZvbHVtZShNQVNLX0FERFJfQlVSR1VORFlfVk9MTUlDLCBkYXRhKTsKKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfTUlDOgorCQlkYXRhID0gYXdhY3NfYnVyZ3VuZHlfcmVhZF92b2x1bWUoTUFTS19BRERSX0JVUkdVTkRZX1ZPTE1JQyk7CisJCWRhdGEgPDw9IDI0OworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0NEOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlhd2Fjc19idXJndW5keV93cml0ZV92b2x1bWUoTUFTS19BRERSX0JVUkdVTkRZX1ZPTENELCBkYXRhKTsKKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfQ0Q6CisJCWRhdGEgPSBhd2Fjc19idXJndW5keV9yZWFkX3ZvbHVtZShNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0QpOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ0xFVjoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJZGF0YSA9IGF3YWNzX3ZvbHVtZV9zZXR0ZXIoZGF0YSwgMCwgMCwgNCk7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNMRVY6CisJCWRhdGEgPSBhd2Fjc19nZXRfdm9sdW1lKGF3YWNzX3JlZ1swXSwgNCk7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfT1VUTUFTSzoKKwljYXNlIFNPVU5EX01JWEVSX09VVFNSQzoKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJfQorCQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkYWNhX21peGVyX2lvY3RsKHVfaW50IGNtZCwgdV9sb25nIGFyZykKK3sKKwlpbnQgZGF0YTsKKwlpbnQgcmM7CisKKwkvKiBBbmQgdGhlIERBQ0EncyBubyBnZW5pdXMgZWl0aGVyISAqLworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLOgorCQlkYXRhID0gU09VTkRfTUFTS19WT0xVTUU7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNNQVNLOgorCQlkYXRhID0gMDsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ1NSQzoKKwkJZGF0YSA9IDA7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlkYXRhID0wOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUzoKKwkJZGF0YSA9IFNPVU5EX01BU0tfVk9MVU1FOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfQ0FQUzoKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUU6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWRhY2Ffc2V0X3ZvbHVtZShkYXRhLCBkYXRhKTsKKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1ZPTFVNRToKKwkJZGFjYV9nZXRfdm9sdW1lKCYgZGF0YSwgJmRhdGEpOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX09VVE1BU0s6CisJY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgUE1hY01peGVySW9jdGwodV9pbnQgY21kLCB1X2xvbmcgYXJnKQoreworCWludCByYzsKKwkKKwkvKiBEaWZmZXJlbnQgSU9DVExTIGZvciBidXJndW5keSBhbmQsIGV2ZW50dWFsbHksIERBQ0EgJiBUdW1ibGVyICovCisKKwlUUllfTE9DSygpOworCQorCXN3aXRjaCAoYXdhY3NfcmV2aXNpb24peworCQljYXNlIEFXQUNTX0JVUkdVTkRZOgorCQkJcmMgPSBidXJndW5keV9taXhlcl9pb2N0bChjbWQsIGFyZyk7CisJCQlicmVhayA7CisJCWNhc2UgQVdBQ1NfREFDQToKKwkJCXJjID0gZGFjYV9taXhlcl9pb2N0bChjbWQsIGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBBV0FDU19UVU1CTEVSOgorCQljYXNlIEFXQUNTX1NOQVBQRVI6CisJCQlyYyA9IHRhc19taXhlcl9pb2N0bChjbWQsIGFyZyk7CisJCQlicmVhayA7CisJCWRlZmF1bHQ6IC8qIDstKSkgKi8KKwkJCXJjID0gYXdhY3NfbWl4ZXJfaW9jdGwoY21kLCBhcmcpOworCX0KKworCVVOTE9DSygpOworCQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgUE1hY01peGVySW5pdCh2b2lkKQoreworCXN3aXRjaCAoYXdhY3NfcmV2aXNpb24pIHsKKwkJY2FzZSBBV0FDU19UVU1CTEVSOgorCQkgIHByaW50aygiQUUtSW5pdCB0dW1ibGVyIG1peGVyXG4iKTsKKwkJICBicmVhayA7CisJCWNhc2UgQVdBQ1NfU05BUFBFUjoKKwkJICBwcmludGsoIkFFLUluaXQgc25hcHBlciBtaXhlclxuIik7CisJCSAgYnJlYWsgOworCQljYXNlIEFXQUNTX0RBQ0E6CisJCWNhc2UgQVdBQ1NfQlVSR1VORFk6CisJCQlicmVhayA7CS8qIGRvbid0IGtub3cgeWV0ICovCisJCWNhc2UgQVdBQ1NfQVdBQ1M6CisJCWNhc2UgQVdBQ1NfU0NSRUFNRVI6CisJCWRlZmF1bHQ6CisJCQlhd2Fjc19taXhlcl9pbml0KCkgOworCQkJYnJlYWsgOworCX0KK30KKworLyogV3JpdGUvUmVhZCBzcSBzZXR1cCBmdW5jdGlvbnM6CisgICBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBlbm91Z2ggKG9yIGFueSkgZGJkbWEgY21kIGJ1ZmZlcnMgZm9yIHRoZQorICAgdXNlcidzIGZyYWdtZW50IHNldHRpbmdzLiAgSWYgbm90LCBhbGxvY2F0ZSBzb21lLiBJZiB0aGlzIGZhaWxzIHdlIHdpbGwKKyAgIHBvaW50IGF0IHRoZSBiZWVwIGJ1ZmZlciAtIGFzIGFuIGVtZXJnZW5jeSBwcm92aXNpb24gLSB0byBzdG9wIGRtYSB0cm9tcGluZworICAgb24gc29tZSByYW5kb20gYml0IG9mIG1lbW9yeSAoaWYgc29tZW9uZSBsZXRzIGl0IGdvIGFueXdheSkuCisgICBUaGUgY29tbWFuZCBidWZmZXJzIGFyZSB0aGVuIHNldCB1cCB0byBwb2ludCB0byB0aGUgZnJhZ21lbnQgYnVmZmVycworICAgKGFsbG9jYXRlZCBlbHNld2hlcmUpLiAgV2UgbmVlZCBuKzEgY29tbWFuZHMgdGhlIGxhc3Qgb2Ygd2hpY2ggaG9sZHMKKyAgIGEgTk9QICsgbG9vcCB0byBzdGFydC4KKyovCisKK3N0YXRpYyBpbnQgUE1hY1dyaXRlU3FTZXR1cCh2b2lkKQoreworCWludCBpLCBjb3VudCA9IDYwMCA7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY3A7CisKKwlMT0NLKCk7CisJCisJLyogc3RvcCB0aGUgY29udHJvbGxlciBmcm9tIGRvaW5nIGFueSBvdXRwdXQgLSBpZiBpdCBpc24ndCBhbHJlYWR5LgorCSAgIGl0IF9zaG91bGRfIGJlIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCBhbnl3YXkgKi8KKworCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y29udHJvbCwgKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNik7CisJd2hpbGUgKChpbl9sZTMyKCZhd2Fjc190eGRtYS0+c3RhdHVzKSAmIFJVTikgJiYgY291bnQtLSkKKwkJdWRlbGF5KDEpOworI2lmZGVmIERFQlVHX0RNQVNPVU5ECitpZiAoY291bnQgPD0gMCkKKwlwcmludGsoImRtYXNvdW5kX3BtYWM6IHdyaXRlIHNxIHNldHVwOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGRtYSB0byBzdG9wXG4iKTsKKyNlbmRpZgorCisJaWYgKCh3cml0ZV9zcS5tYXhfY291bnQgKyAxKSA+IG51bWJlcl9vZl90eF9jbWRfYnVmZmVycykgeworCQlpZiAoYXdhY3NfdHhfY21kX3NwYWNlKQorCQkJa2ZyZWUoYXdhY3NfdHhfY21kX3NwYWNlKTsKKwkJbnVtYmVyX29mX3R4X2NtZF9idWZmZXJzID0gMDsKKworCQkvKiB3ZSBuZWVkIG5idWZzICsgMSAoZm9yIHRoZSBsb29wKSBhbmQgd2Ugc2hvdWxkIHJlcXVlc3QgKyAxCisJCSAgIGFnYWluIGJlY2F1c2UgdGhlIERCRE1BX0FMSUdOIG1pZ2h0IHB1bGwgdGhlIHN0YXJ0IHVwIGJ5IHVwCisJCSAgIHRvIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSAtIDQuCisJCSovCisKKwkJYXdhY3NfdHhfY21kX3NwYWNlID0ga21hbGxvYworCQkJKCh3cml0ZV9zcS5tYXhfY291bnQgKyAxICsgMSkgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCksCisJCQkgR0ZQX0tFUk5FTCk7CisJCWlmIChhd2Fjc190eF9jbWRfc3BhY2UgPT0gTlVMTCkgeworCQkJLyogZG9uJ3QgbGVhdmUgaXQgZGFuZ2xpbmcgLSBuYXN0eSBidXQgYmV0dGVyIHRoYW4gYQorCQkJICAgcmFuZG9tIGFkZHJlc3MgKi8KKwkJCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhiZWVwX2RiZG1hX2NtZCkpOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAiZG1hc291bmRfcG1hYzogY2FuJ3QgYWxsb2NhdGUgZGJkbWEgY21kIGJ1ZmZlcnMiCisJCQkgICAiLCBkcml2ZXIgZGlzYWJsZWRcbiIpOworCQkJVU5MT0NLKCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlhd2Fjc190eF9jbWRzID0gKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKikKKwkJCURCRE1BX0FMSUdOKGF3YWNzX3R4X2NtZF9zcGFjZSk7CisJCW51bWJlcl9vZl90eF9jbWRfYnVmZmVycyA9IHdyaXRlX3NxLm1heF9jb3VudCArIDE7CisJfQorCisJY3AgPSBhd2Fjc190eF9jbWRzOworCW1lbXNldCgodm9pZCAqKWNwLCAwLCAod3JpdGVfc3EubWF4X2NvdW50KzEpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgd3JpdGVfc3EubWF4X2NvdW50OyArK2ksICsrY3ApIHsKKwkJc3RfbGUzMigmY3AtPnBoeV9hZGRyLCB2aXJ0X3RvX2J1cyh3cml0ZV9zcS5idWZmZXJzW2ldKSk7CisJfQorCXN0X2xlMTYoJmNwLT5jb21tYW5kLCBEQkRNQV9OT1AgKyBCUl9BTFdBWVMpOworCXN0X2xlMzIoJmNwLT5jbWRfZGVwLCB2aXJ0X3RvX2J1cyhhd2Fjc190eF9jbWRzKSk7CisJLyogcG9pbnQgdGhlIGNvbnRyb2xsZXIgYXQgdGhlIGNvbW1hbmQgc3RhY2sgLSByZWFkeSB0byBnbyAqLworCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhhd2Fjc190eF9jbWRzKSk7CisJVU5MT0NLKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgUE1hY1JlYWRTcVNldHVwKHZvaWQpCit7CisJaW50IGksIGNvdW50ID0gNjAwOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNwOworCisJTE9DSygpOworCQorCS8qIHN0b3AgdGhlIGNvbnRyb2xsZXIgZnJvbSBkb2luZyBhbnkgaW5wdXQgLSBpZiBpdCBpc24ndCBhbHJlYWR5LgorCSAgIGl0IF9zaG91bGRfIGJlIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCBhbnl3YXkgKi8KKwkKKwlvdXRfbGUzMigmYXdhY3NfcnhkbWEtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYpOworCXdoaWxlICgoaW5fbGUzMigmYXdhY3NfcnhkbWEtPnN0YXR1cykgJiBSVU4pICYmIGNvdW50LS0pCisJCXVkZWxheSgxKTsKKyNpZmRlZiBERUJVR19ETUFTT1VORAoraWYgKGNvdW50IDw9IDApCisJcHJpbnRrKCJkbWFzb3VuZF9wbWFjOiByZWFkIHNxIHNldHVwOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGRtYSB0byBzdG9wXG4iKTsKKyNlbmRpZgorCisJaWYgKChyZWFkX3NxLm1heF9jb3VudCsxKSA+IG51bWJlcl9vZl9yeF9jbWRfYnVmZmVycyApIHsKKwkJaWYgKGF3YWNzX3J4X2NtZF9zcGFjZSkKKwkJCWtmcmVlKGF3YWNzX3J4X2NtZF9zcGFjZSk7CisJCW51bWJlcl9vZl9yeF9jbWRfYnVmZmVycyA9IDA7CisKKwkJLyogd2UgbmVlZCBuYnVmcyArIDEgKGZvciB0aGUgbG9vcCkgYW5kIHdlIHNob3VsZCByZXF1ZXN0ICsgMSBhZ2FpbgorCQkgICBiZWNhdXNlIHRoZSBEQkRNQV9BTElHTiBtaWdodCBwdWxsIHRoZSBzdGFydCB1cCBieSB1cCB0bworCQkgICBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkgLSA0IChhc3N1bWluZyBrbWFsbG9jIGFsaWducyAzMiBiaXRzKS4KKwkJKi8KKworCQlhd2Fjc19yeF9jbWRfc3BhY2UgPSBrbWFsbG9jCisJCQkoKHJlYWRfc3EubWF4X2NvdW50ICsgMSArIDEpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpLAorCQkJIEdGUF9LRVJORUwpOworCQlpZiAoYXdhY3NfcnhfY21kX3NwYWNlID09IE5VTEwpIHsKKwkJCS8qIGRvbid0IGxlYXZlIGl0IGRhbmdsaW5nIC0gbmFzdHkgYnV0IGJldHRlciB0aGFuIGEKKwkJCSAgIHJhbmRvbSBhZGRyZXNzICovCisJCQlvdXRfbGUzMigmYXdhY3NfcnhkbWEtPmNtZHB0ciwgdmlydF90b19idXMoYmVlcF9kYmRtYV9jbWQpKTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgImRtYXNvdW5kX3BtYWM6IGNhbid0IGFsbG9jYXRlIGRiZG1hIGNtZCBidWZmZXJzIgorCQkJICAgIiwgZHJpdmVyIGRpc2FibGVkXG4iKTsKKwkJCVVOTE9DSygpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYXdhY3NfcnhfY21kcyA9ICh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICopCisJCQlEQkRNQV9BTElHTihhd2Fjc19yeF9jbWRfc3BhY2UpOworCQludW1iZXJfb2ZfcnhfY21kX2J1ZmZlcnMgPSByZWFkX3NxLm1heF9jb3VudCArIDEgOworCX0KKwljcCA9IGF3YWNzX3J4X2NtZHM7CisJbWVtc2V0KCh2b2lkICopY3AsIDAsIChyZWFkX3NxLm1heF9jb3VudCsxKSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSk7CisKKwkvKiBTZXQgZG1hIGJ1ZmZlcnMgdXAgaW4gYSBsb29wICovCisJZm9yIChpID0gMDsgaSA8IHJlYWRfc3EubWF4X2NvdW50OyBpKyssY3ArKykgeworCQlzdF9sZTMyKCZjcC0+cGh5X2FkZHIsIHZpcnRfdG9fYnVzKHJlYWRfc3EuYnVmZmVyc1tpXSkpOworCQlzdF9sZTE2KCZjcC0+Y29tbWFuZCwgSU5QVVRfTU9SRSArIElOVFJfQUxXQVlTKTsKKwkJc3RfbGUxNigmY3AtPnJlcV9jb3VudCwgcmVhZF9zcS5ibG9ja19zaXplKTsKKwkJc3RfbGUxNigmY3AtPnhmZXJfc3RhdHVzLCAwKTsKKwl9CisKKwkvKiBUaGUgbmV4dCB0d28gbGluZXMgbWFrZSB0aGUgdGhpbmcgbG9vcCBhcm91bmQuCisJKi8KKwlzdF9sZTE2KCZjcC0+Y29tbWFuZCwgREJETUFfTk9QICsgQlJfQUxXQVlTKTsKKwlzdF9sZTMyKCZjcC0+Y21kX2RlcCwgdmlydF90b19idXMoYXdhY3NfcnhfY21kcykpOworCS8qIHBvaW50IHRoZSBjb250cm9sbGVyIGF0IHRoZSBjb21tYW5kIHN0YWNrIC0gcmVhZHkgdG8gZ28gKi8KKwlvdXRfbGUzMigmYXdhY3NfcnhkbWEtPmNtZHB0ciwgdmlydF90b19idXMoYXdhY3NfcnhfY21kcykpOworCisJVU5MT0NLKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRPRE86IHRoaXMgbmVlZHMgd29yayB0byBndWFyYW50ZWUgdGhhdCB3aGVuIGl0IHJldHVybnMgRE1BIGhhcyBzdG9wcGVkCisgICBidXQgaW4gYSBtb3JlIGVsZWdhbnQgd2F5IHRoYW4gaXMgZG9uZSBoZXJlLi4uLgorKi8KKworc3RhdGljIHZvaWQgUE1hY0Fib3J0UmVhZCh2b2lkKQoreworCWludCBpOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNwOworCisJTE9DSygpOworCS8qIGdpdmUgaXQgYSBjaGFuY2UgdG8gdXBkYXRlIHRoZSBvdXRwdXQgYW5kIHByb3ZpZGUgdGhlIElSUQorCSAgIHRoYXQgaXMgZXhwZWN0ZWQuCisJKi8KKworCW91dF9sZTMyKCZhd2Fjc19yeGRtYS0+Y29udHJvbCwgKChGTFVTSCkgPDwgMTYpICsgRkxVU0ggKTsKKworCWNwID0gYXdhY3NfcnhfY21kczsKKwlmb3IgKGkgPSAwOyBpIDwgcmVhZF9zcS5tYXhfY291bnQ7IGkrKyxjcCsrKQorCQlzdF9sZTE2KCZjcC0+Y29tbWFuZCwgREJETUFfU1RPUCk7CisJLyoKKwkgKiBXZSBzaG91bGQgcHJvYmFibHkgd2FpdCBmb3IgdGhlIHRoaW5nIHRvIHN0b3AgYmVmb3JlIHdlCisJICogcmVsZWFzZSB0aGUgbWVtb3J5LgorCSAqLworCisJbXNsZWVwKDEwMCkgOyAvKiBnaXZlIGl0IGEgKHNtYWxsKSBjaGFuY2UgdG8gYWN0ICovCisKKwkvKiBhcHBseSB0aGUgc2xlZGdlaGFtbWVyIGFwcHJvYWNoIC0ganVzdCBzdG9wIGl0IG5vdyAqLworCisJb3V0X2xlMzIoJmF3YWNzX3J4ZG1hLT5jb250cm9sLCAoUlVOfFBBVVNFfEZMVVNIfFdBS0UpIDw8IDE2KTsKKwlVTkxPQ0soKTsKK30KKworZXh0ZXJuIGNoYXIgKmdldF9hZm10X3N0cmluZyhpbnQpOworc3RhdGljIGludCBQTWFjU3RhdGVJbmZvKGNoYXIgKmIsIHNpemVfdCBzcCkKK3sKKwlpbnQgaSwgbGVuID0gMDsKKwlsZW4gPSBzcHJpbnRmKGIsIkhXIHJhdGVzOiAiKTsKKwlzd2l0Y2ggKGF3YWNzX3JldmlzaW9uKXsKKwkJY2FzZSBBV0FDU19EQUNBOgorCQljYXNlIEFXQUNTX0JVUkdVTkRZOgorCQkJbGVuICs9IHNwcmludGYoYiwiNDQxMDAgIikgOworCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX1RVTUJMRVI6CisJCWNhc2UgQVdBQ1NfU05BUFBFUjoKKwkJCWZvciAoaT0wOyBpPDE7IGkrKyl7CisJCQkJaWYgKHRhc19mcmVxc19va1tpXSkKKwkJCQkJbGVuICs9IHNwcmludGYoYitsZW4sIiVkICIsIHRhc19mcmVxc1tpXSkgOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX0FXQUNTOgorCQljYXNlIEFXQUNTX1NDUkVBTUVSOgorCQlkZWZhdWx0OgorCQkJZm9yIChpPTA7IGk8ODsgaSsrKXsKKwkJCQlpZiAoYXdhY3NfZnJlcXNfb2tbaV0pCisJCQkJCWxlbiArPSBzcHJpbnRmKGIrbGVuLCIlZCAiLCBhd2Fjc19mcmVxc1tpXSkgOworCQkJfQorCQkJYnJlYWsgOworCX0KKwlsZW4gKz0gc3ByaW50ZihiK2xlbiwicy9zZWNcbiIpIDsKKwlpZiAobGVuIDwgc3ApIHsKKwkJbGVuICs9IHNwcmludGYoYitsZW4sIkhXIEFGTVRTOiAiKTsKKwkJaSA9IEFGTVRfVTE2X0JFIDsKKwkJd2hpbGUgKGkpIHsKKwkJCWlmIChpICYgZG1hc291bmQubWFjaC5oYXJkd2FyZV9hZm10cykKKwkJCQlsZW4gKz0gc3ByaW50ZihiK2xlbiwiJXMgIiwKKwkJCQkJZ2V0X2FmbXRfc3RyaW5nKGkgJiBkbWFzb3VuZC5tYWNoLmhhcmR3YXJlX2FmbXRzKSk7CisJCQlpID4+PSAxIDsKKwkJfQorCQlsZW4gKz0gc3ByaW50ZihiK2xlbiwiXG4iKSA7CisJfQorCXJldHVybiBsZW4gOworfQorCisvKioqIE1hY2hpbmUgZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBTRVRUSU5HUyBkZWZfaGFyZCA9IHsKKwkuZm9ybWF0CT0gQUZNVF9TMTZfQkUsCisJLnN0ZXJlbwk9IDEsCisJLnNpemUJPSAxNiwKKwkuc3BlZWQJPSA0NDEwMAorfSA7CisKK3N0YXRpYyBTRVRUSU5HUyBkZWZfc29mdCA9IHsKKwkuZm9ybWF0CT0gQUZNVF9TMTZfQkUsCisJLnN0ZXJlbwk9IDEsCisJLnNpemUJPSAxNiwKKwkuc3BlZWQJPSA0NDEwMAorfSA7CisKK3N0YXRpYyBNQUNISU5FIG1hY2hQTWFjID0geworCS5uYW1lCQk9IGF3YWNzX25hbWUsCisJLm5hbWUyCQk9ICJQb3dlck1hYyBCdWlsdC1pbiBTb3VuZCIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kbWFfYWxsb2MJPSBQTWFjQWxsb2MsCisJLmRtYV9mcmVlCT0gUE1hY0ZyZWUsCisJLmlycWluaXQJPSBQTWFjSXJxSW5pdCwKKyNpZmRlZiBNT0RVTEUKKwkuaXJxY2xlYW51cAk9IFBNYWNJcnFDbGVhbnVwLAorI2VuZGlmIC8qIE1PRFVMRSAqLworCS5pbml0CQk9IFBNYWNJbml0LAorCS5zaWxlbmNlCT0gUE1hY1NpbGVuY2UsCisJLnNldEZvcm1hdAk9IFBNYWNTZXRGb3JtYXQsCisJLnNldFZvbHVtZQk9IFBNYWNTZXRWb2x1bWUsCisJLnBsYXkJCT0gUE1hY1BsYXksCisJLnJlY29yZAkJPSBOVUxMLAkJLyogZGVmYXVsdCB0byBubyByZWNvcmQgKi8KKwkubWl4ZXJfaW5pdAk9IFBNYWNNaXhlckluaXQsCisJLm1peGVyX2lvY3RsCT0gUE1hY01peGVySW9jdGwsCisJLndyaXRlX3NxX3NldHVwCT0gUE1hY1dyaXRlU3FTZXR1cCwKKwkucmVhZF9zcV9zZXR1cAk9IFBNYWNSZWFkU3FTZXR1cCwKKwkuc3RhdGVfaW5mbwk9IFBNYWNTdGF0ZUluZm8sCisJLmFib3J0X3JlYWQJPSBQTWFjQWJvcnRSZWFkLAorCS5taW5fZHNwX3NwZWVkCT0gNzM1MCwKKwkubWF4X2RzcF9zcGVlZAk9IDQ0MTAwLAorCS52ZXJzaW9uCT0gKChETUFTT1VORF9BV0FDU19SRVZJU0lPTjw8OCkgKyBETUFTT1VORF9BV0FDU19FRElUSU9OKQorfTsKKworCisvKioqIENvbmZpZyAmIFNldHVwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENoZWNrIGZvciBwbWFjIG1vZGVscyB0aGF0IHdlIGNhcmUgYWJvdXQgaW4gdGVybXMgb2Ygc3BlY2lhbCBhY3Rpb25zLgorKi8KKwordm9pZCBfX2luaXQKK3NldF9tb2RlbCh2b2lkKQoreworCS8qIHBvcnRhYmxlcy9sYXAtdG9wcyAqLworCisJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCwzNDAwLzI0MDAiKSB8fAorCSAgICBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsMzUwMCIpKQl7CisJCWlzX3Bib29rXzNYMDAgPSAxIDsKKwl9CisJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMSwxIikgIHx8IC8qIGxvbWJhcmQgKi8KKwkgICAgbWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLFBvd2VyQm9vazE5OTgiKSl7IC8qIHdhbGxzdHJlZXQgKi8KKwkJaXNfcGJvb2tfZzMgPSAxIDsKKwkJcmV0dXJuIDsKKwl9Cit9CisKKy8qIEdldCB0aGUgT0Ygbm9kZSB0aGF0IHRlbGxzIHVzIGFib3V0IHRoZSByZWdpc3RlcnMsIGludGVycnVwdHMgZXRjLiB0byB1c2UKKyAgIGZvciBzb3VuZCBJTy4KKworICAgT24gbW9zdCBtYWNoaW5lcyB0aGUgc291bmQgSU8gT0Ygbm9kZSBpcyB0aGUgJ2RhdmJ1cycgbm9kZS4gIE9uIG5ld2VyIHBtYWNzCisgICB3aXRoIERBQ0EgKCYgVHVtYmxlcikgdGhlIG5vZGUgdG8gdXNlIGlzIGkycy1hLiAgT24gbXVjaCBvbGRlciBtYWNoaW5lcyBpLmUuCisgICBiZWZvcmUgOTUwMCB0aGVyZSBpcyBubyBkYXZidXMgbm9kZSBhbmQgd2UgaGF2ZSB0byB1c2UgdGhlICdhd2FjcycgcHJvcGVydHkuCisKKyAgSW4gdGhlIGxhdHRlciBjYXNlIHdlIHNpZ25hbCB0aGlzIGJ5IHNldHRpbmcgdGhlIGNvZGVjIHZhbHVlIC0gc28gdGhhdCB0aGUKKyAgY29kZSB0aGF0IGxvb2tzIGZvciBjaGlwIHByb3BlcnRpZXMga25vd3MgaG93IHRvIGdvIGFib3V0IGl0LgorKi8KKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSogX19pbml0CitnZXRfc25kX2lvX25vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKKworCS8qIHNldCB1cCBhd2Fjc19ub2RlIGZvciBlYXJseSBPRiB3aGljaCBkb2Vzbid0IGhhdmUgYSBmdWxsIHNldCBvZgorCSAqIHByb3BlcnRpZXMgb24gZGF2YnVzCisJKi8KKworCWF3YWNzX25vZGUgPSBmaW5kX2RldmljZXMoImF3YWNzIik7CisJaWYgKGF3YWNzX25vZGUpCisJCWF3YWNzX3JldmlzaW9uID0gQVdBQ1NfQVdBQ1M7CisKKwkvKiBwb3dlcm1hYyBtb2RlbHMgYWZ0ZXIgOTUwMCAob3RoZXIgdGhhbiB0aG9zZSB3aGljaCB1c2UgREFDQSBvcgorCSAqIFR1bWJsZXIpIGhhdmUgYSBub2RlIGNhbGxlZCAiZGF2YnVzIi4KKwkgKi8KKwlucCA9IGZpbmRfZGV2aWNlcygiZGF2YnVzIik7CisJLyoKKwkgKiBpZiB3ZSBkaWRuJ3QgZmluZCBhIGRhdmJ1cyBkZXZpY2UsIHRyeSAnaTJzLWEnIHNpbmNlCisJICogdGhpcyBzZWVtcyB0byBiZSB3aGF0IGlCb29rcyAoJiBUdW1ibGVyKSBoYXZlLgorCSAqLworCWlmIChucCA9PSBOVUxMKQorCQlucCA9IGkyc19ub2RlID0gZmluZF9kZXZpY2VzKCJpMnMtYSIpOworCisJLyogaWYgd2UgZGlkbid0IGZpbmQgdGhpcyAtIHBlcmhhcHMgd2UgYXJlIG9uIGFuIGVhcmx5IG1vZGVsCisJICogd2hpY2ggX29ubHlfIGhhcyBhbiAnYXdhY3MnIG5vZGUKKwkqLworCWlmIChucCA9PSBOVUxMICYmIGF3YWNzX25vZGUpCisJCW5wID0gYXdhY3Nfbm9kZSA7CisKKwkvKiBpZiB3ZSBmYWlsZWQgYWxsIHRoZXNlIHJldHVybiBudWxsIC0gdGhpcyB3aWxsIGNhdXNlIHRoZQorCSAqIGRyaXZlciB0byBnaXZlIHVwLi4uCisJKi8KKwlyZXR1cm4gbnAgOworfQorCisvKiBHZXQgdGhlIE9GIG5vZGUgdGhhdCBjb250YWlucyB0aGUgaW5mbyBhYm91dCB0aGUgc291bmQgY2hpcCwgaW5wdXRzIHMtcmF0ZXMKKyAgIGV0Yy4KKyAgIFRoaXMgbm9kZSBkb2VzIG5vdCBleGlzdCAob3IgY29udGFpbnMgbXVjaCByZWR1Y2VkIGluZm8pIG9uIGVhcmxpZXIgbWFjaGluZXMKKyAgIHdlIGhhdmUgdG8gZGVkdWNlIHRoZSBpbmZvIG90aGVyIHdheXMgZm9yIHRoZXNlLgorKi8KKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSogX19pbml0CitnZXRfc25kX2luZm9fbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmlvKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW5mbzsKKworCWluZm8gPSBmaW5kX2RldmljZXMoInNvdW5kIik7CisJd2hpbGUgKGluZm8gJiYgaW5mby0+cGFyZW50ICE9IGlvKQorCQlpbmZvID0gaW5mby0+bmV4dDsKKwlyZXR1cm4gaW5mbzsKK30KKworLyogRmluZCBvdXQgd2hhdCB0eXBlIG9mIGNvZGVjIHdlIGhhdmUuCisqLworCitzdGF0aWMgaW50IF9faW5pdAorZ2V0X2NvZGVjX3R5cGUoc3RydWN0IGRldmljZV9ub2RlICppbmZvKQoreworCS8qIGFscmVhZHkgc2V0IGlmIHByZS1kYXZidXMgbW9kZWwgYW5kIGluZm8gd2lsbCBiZSBOVUxMICovCisJaW50IGNvZGVjID0gYXdhY3NfcmV2aXNpb24gOworCisJaWYgKGluZm8pIHsKKwkJLyogbXVzdCBkbyBhd2FjcyBmaXJzdCB0byBhbGxvdyBzY3JlYW1lciB0byBvdmVyaWRlIGl0ICovCisJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShpbmZvLCAiYXdhY3MiKSkKKwkJCWNvZGVjID0gQVdBQ1NfQVdBQ1MgOworCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoaW5mbywgInNjcmVhbWVyIikpCisJCQljb2RlYyA9IEFXQUNTX1NDUkVBTUVSOworCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoaW5mbywgImJ1cmd1bmR5IikpCisJCQljb2RlYyA9IEFXQUNTX0JVUkdVTkRZIDsKKwkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGluZm8sICJkYWNhIikpCisJCQljb2RlYyA9IEFXQUNTX0RBQ0E7CisJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShpbmZvLCAidHVtYmxlciIpKQorCQkJY29kZWMgPSBBV0FDU19UVU1CTEVSOworCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoaW5mbywgInNuYXBwZXIiKSkKKwkJCWNvZGVjID0gQVdBQ1NfU05BUFBFUjsKKwl9CisJcmV0dXJuIGNvZGVjIDsKK30KKworLyogZmluZCBvdXQgd2hhdCB0eXBlLCBpZiBhbnksIG9mIGV4cGFuc2lvbiBjYXJkIHdlIGhhdmUKKyovCitzdGF0aWMgdm9pZCBfX2luaXQKK2dldF9leHBhbnNpb25fdHlwZSh2b2lkKQoreworCWlmIChmaW5kX2RldmljZXMoInBlcmNoIikgIT0gTlVMTCkKKwkJaGFzX3BlcmNoID0gMTsKKworCWlmIChmaW5kX2RldmljZXMoInBiLXppdmEtcGMiKSAhPSBOVUxMKQorCQloYXNfeml2YSA9IDE7CisJLyogbmVlZCB0byB3b3JrIG91dCBob3cgd2UgZGVhbCB3aXRoIGlNYWMgU1JTIG1vZHVsZSAqLworfQorCisvKiBzZXQgdXAgZnJhbWUgcmF0ZXMuCisgKiBJIHN1c3BlY3QgdGhhdCB0aGVzZSByb3V0aW5lcyBkb24ndCBxdWl0ZSBnbyBhYm91dCBpdCB0aGUgcmlnaHQgd2F5OgorICogLSB3aGVyZSB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHJhdGUgLSBJIHRoaW5rIHRoYXQgdGhlIGZpcnN0IHByb3BlcnR5CisgKiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHJhdGVzLgorICogVE9ETzogY2hlY2sgc29tZSBtb3JlIGRldmljZSB0cmVlcyBhbmQgbW9kaWZ5IGFjY29yZGluZ2x5CisgKiAgICAgICBTZXQgZG1hc291bmQubWFjaC5tYXhfZHNwX3JhdGUgb24gdGhlIGJhc2lzIG9mIHRoZXNlIHJvdXRpbmVzLgorKi8KKworc3RhdGljIHZvaWQgX19pbml0Cithd2Fjc19pbml0X2ZyYW1lX3JhdGVzKHVuc2lnbmVkIGludCAqcHJvcCwgdW5zaWduZWQgaW50IGwpCit7CisJaW50IGkgOworCWlmIChwcm9wKSB7CisJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJCWF3YWNzX2ZyZXFzX29rW2ldID0gMCA7CisJCWZvciAobCAvPSBzaXplb2YoaW50KTsgbCA+IDA7IC0tbCkgeworCQkJdW5zaWduZWQgaW50IHIgPSAqcHJvcCsrOworCQkJLyogQXBwbGUgJ0ZpeGVkJyBmb3JtYXQgKi8KKwkJCWlmIChyID49IDB4MTAwMDApCisJCQkJciA+Pj0gMTY7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisJCQkJaWYgKHIgPT0gYXdhY3NfZnJlcXNbaV0pIHsKKwkJCQkJYXdhY3NfZnJlcXNfb2tbaV0gPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyogZWxzZSB3ZSBhc3N1bWUgdGhhdCBhbGwgdGhlIHJhdGVzIGFyZSBhdmFpbGFibGUgKi8KK30KKworc3RhdGljIHZvaWQgX19pbml0CitidXJndW5keV9pbml0X2ZyYW1lX3JhdGVzKHVuc2lnbmVkIGludCAqcHJvcCwgdW5zaWduZWQgaW50IGwpCit7CisJaW50IHRlbXBbOV0gOworCWludCBpID0gMCA7CisJaWYgKHByb3ApIHsKKwkJZm9yIChsIC89IHNpemVvZihpbnQpOyBsID4gMDsgLS1sKSB7CisJCQl1bnNpZ25lZCBpbnQgciA9ICpwcm9wKys7CisJCQkvKiBBcHBsZSAnRml4ZWQnIGZvcm1hdCAqLworCQkJaWYgKHIgPj0gMHgxMDAwMCkKKwkJCQlyID4+PSAxNjsKKwkJCXRlbXBbaV0gPSByIDsKKwkJCWkrKyA7IGlmKGk+PTkpIGk9ODsKKwkJfQorCX0KKyNpZmRlZiBERUJVR19ETUFTT1VORAoraWYgKGkgPiAxKXsKKwlpbnQgajsKKwlwcmludGsoImRtYXNvdW5kX3BtYWM6IGJ1cmd1bmR5IHdpdGggbXVsdGlwbGUgZnJhbWUgcmF0ZXNcbiIpOworCWZvcihqPTA7IGo8aTsgaisrKQorCQlwcmludGsoIiVkICIsIHRlbXBbal0pIDsKKwlwcmludGsoIlxuIikgOworfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorZGFjYV9pbml0X2ZyYW1lX3JhdGVzKHVuc2lnbmVkIGludCAqcHJvcCwgdW5zaWduZWQgaW50IGwpCit7CisJaW50IHRlbXBbOV0gOworCWludCBpID0gMCA7CisJaWYgKHByb3ApIHsKKwkJZm9yIChsIC89IHNpemVvZihpbnQpOyBsID4gMDsgLS1sKSB7CisJCQl1bnNpZ25lZCBpbnQgciA9ICpwcm9wKys7CisJCQkvKiBBcHBsZSAnRml4ZWQnIGZvcm1hdCAqLworCQkJaWYgKHIgPj0gMHgxMDAwMCkKKwkJCQlyID4+PSAxNjsKKwkJCXRlbXBbaV0gPSByIDsKKwkJCWkrKyA7IGlmKGk+PTkpIGk9ODsKKworCQl9CisJfQorI2lmZGVmIERFQlVHX0RNQVNPVU5ECitpZiAoaSA+IDEpeworCWludCBqOworCXByaW50aygiZG1hc291bmRfcG1hYzogREFDQSB3aXRoIG11bHRpcGxlIGZyYW1lIHJhdGVzXG4iKTsKKwlmb3Ioaj0wOyBqPGk7IGorKykKKwkJcHJpbnRrKCIlZCAiLCB0ZW1wW2pdKSA7CisJcHJpbnRrKCJcbiIpIDsKK30KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK2luaXRfZnJhbWVfcmF0ZXModW5zaWduZWQgaW50ICpwcm9wLCB1bnNpZ25lZCBpbnQgbCkKK3sKKwlzd2l0Y2ggKGF3YWNzX3JldmlzaW9uKSB7CisJCWNhc2UgQVdBQ1NfVFVNQkxFUjoKKwkJY2FzZSBBV0FDU19TTkFQUEVSOgorCQkJdGFzX2luaXRfZnJhbWVfcmF0ZXMocHJvcCwgbCk7CisJCQlicmVhayA7CisJCWNhc2UgQVdBQ1NfREFDQToKKwkJCWRhY2FfaW5pdF9mcmFtZV9yYXRlcyhwcm9wLCBsKTsKKwkJCWJyZWFrIDsKKwkJY2FzZSBBV0FDU19CVVJHVU5EWToKKwkJCWJ1cmd1bmR5X2luaXRfZnJhbWVfcmF0ZXMocHJvcCwgbCk7CisJCQlicmVhayA7CisJCWRlZmF1bHQ6CisJCQlhd2Fjc19pbml0X2ZyYW1lX3JhdGVzKHByb3AsIGwpOworCQkJYnJlYWsgOworCX0KK30KKworLyogZmluZCB0aGluZ3MvbWFjaGluZXMgdGhhdCBjYW4ndCBkbyBtYWMtaW8gYnl0ZXN3YXAKKyovCisKK3N0YXRpYyB2b2lkIF9faW5pdAorc2V0X2h3X2J5dGVzd2FwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqaW8pCit7CisJc3RydWN0IGRldmljZV9ub2RlICptaW8gOworCXVuc2lnbmVkIGludCBrbCA9IDAgOworCisJLyogaWYgc2VlbXMgdGhhdCBLZXlsYXJnbyBjYW4ndCBieXRlLXN3YXAgICovCisKKwlmb3IgKG1pbyA9IGlvLT5wYXJlbnQ7IG1pbyA7IG1pbyA9IG1pby0+cGFyZW50KSB7CisJCWlmIChzdHJjbXAobWlvLT5uYW1lLCAibWFjLWlvIikgPT0gMCkgeworCQkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG1pbywgIktleWxhcmdvIikpCisJCQkJa2wgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJaHdfY2FuX2J5dGVzd2FwID0gIWtsOworfQorCisvKiBBbGxvY2F0ZSB0aGUgcmVzb3VyY2VzIG5lY2Vzc2FyeSBmb3IgYmVlcCBnZW5lcmF0aW9uLiAgVGhpcyBjYW5ub3QgYmUgKHF1aXRlKQorICAgZG9uZSBzdGF0aWNhbGx5ICh5ZXQpIGJlY2F1c2Ugd2UgY2Fubm90IGRvIHZpcnRfdG9fYnVzKCkgb24gc3RhdGljIHZhcnMgd2hlbgorICAgdGhlIGNvZGUgaXMgbG9hZGVkIGFzIGEgbW9kdWxlLgorCisgICBmb3IgdGhlIHNha2Ugb2Ygc2F2aW5nIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHR3byBhbGxvY2F0aW9ucyB3aWxsIGluY3VyIHRoZQorICAgb3ZlcmhlYWQgb2YgdHdvIHB1bGwtdXBzIGluIERCRE1BX0FMSUdOKCkgd2UgYWxsb2NhdGUgdGhlICdlbWVyZ2VuY3knIGRtZG1hCisgICBjb21tYW5kIGhlcmUgYXMgd2VsbC4uLiBldmVuIHRobycgaXQgaXMgbm90IHBhcnQgb2YgdGhlIGJlZXAgcHJvY2Vzcy4KKyovCisKK2ludDMyX3QKK19faW5pdCBzZXR1cF9iZWVwKHZvaWQpCit7CisJLyogSW5pdGlhbGl6ZSBiZWVwIHN0dWZmICovCisJLyogd2FudCBvbmUgY21kIGJ1ZmZlciBmb3IgYmVlcHMsIGFuZCBhIHNlY29uZCBvbmUgZm9yIGVtZXJnZW5jaWVzCisJICAgLSBpLmUuIGRiZG1hIGVycm9yIGNvbmRpdGlvbnMuCisJICAgYXNrIGZvciB0aHJlZSB0byBhbGxvdyBmb3IgcHVsbCB1cCBpbiBEQkRNQV9BTElHTigpLgorCSovCisJYmVlcF9kYmRtYV9jbWRfc3BhY2UgPQorCQlrbWFsbG9jKCgyICsgMSkgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCksIEdGUF9LRVJORUwpOworCWlmKGJlZXBfZGJkbWFfY21kX3NwYWNlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZF9wbWFjOiBubyBiZWVwIGRiZG1hIGNtZCBzcGFjZVxuIikgOworCQlyZXR1cm4gLUVOT01FTSA7CisJfQorCWJlZXBfZGJkbWFfY21kID0gKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKikKKwkJCURCRE1BX0FMSUdOKGJlZXBfZGJkbWFfY21kX3NwYWNlKTsKKwkvKiBzZXQgdXAgZW1lcmdlbmN5IGRiZG1hIGNtZCAqLworCWVtZXJnZW5jeV9kYmRtYV9jbWQgPSBiZWVwX2RiZG1hX2NtZCsxIDsKKwliZWVwX2J1ZiA9IChzaG9ydCAqKSBrbWFsbG9jKEJFRVBfQlVGTEVOICogNCwgR0ZQX0tFUk5FTCk7CisJaWYgKGJlZXBfYnVmID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZF9wbWFjOiBubyBtZW1vcnkgZm9yIGJlZXAgYnVmZmVyXG4iKTsKKwkJaWYoIGJlZXBfZGJkbWFfY21kX3NwYWNlICkga2ZyZWUoYmVlcF9kYmRtYV9jbWRfc3BhY2UpIDsKKwkJcmV0dXJuIC1FTk9NRU0gOworCX0KKwlyZXR1cm4gMCA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2IGF3YWNzX2JlZXBfZGV2ID0geworCS5ldmJpdAkJPSB7IEJJVChFVl9TTkQpIH0sCisJLnNuZGJpdAkJPSB7IEJJVChTTkRfQkVMTCkgfCBCSVQoU05EX1RPTkUpIH0sCisJLmV2ZW50CQk9IGF3YWNzX2JlZXBfZXZlbnQsCisJLm5hbWUJCT0gImRtYXNvdW5kIGJlZXBlciIsCisJLnBoeXMJCT0gIm1hY2lvL2lucHV0MCIsIC8qIHdoYXQgdGhlIGhlY2sgaXMgdGhpcz8/ICovCisJLmlkCQk9IHsKKwkJLmJ1c3R5cGUJPSBCVVNfSE9TVCwKKwl9LAorfTsKKworaW50IF9faW5pdCBkbWFzb3VuZF9hd2Fjc19pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICppbyA9IE5VTEwsICppbmZvID0gTlVMTDsKKwlpbnQgdm9sLCByZXM7CisKKwlpZiAoX21hY2hpbmUgIT0gX01BQ0hfUG1hYykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhd2Fjc19zdWJmcmFtZSA9IDA7CisJYXdhY3NfcmV2aXNpb24gPSAwOworCWh3X2Nhbl9ieXRlc3dhcCA9IDEgOyAvKiBtb3N0IGNhbiAqLworCisJLyogbG9vayBmb3IgbW9kZWxzIHdlIG5lZWQgdG8gaGFuZGxlIHNwZWNpYWxseSAqLworCXNldF9tb2RlbCgpIDsKKworCS8qIGZpbmQgdGhlIE9GIG5vZGUgdGhhdCB0ZWxscyB1cyBhYm91dCB0aGUgZGJkbWEgc3R1ZmYKKwkqLworCWlvID0gZ2V0X3NuZF9pb19ub2RlKCk7CisJaWYgKGlvID09IE5VTEwpIHsKKyNpZmRlZiBERUJVR19ETUFTT1VORAorcHJpbnRrKCJkbWFzb3VuZF9wbWFjOiBjb3VsZG4ndCBmaW5kIHNvdW5kIGlvIE9GIG5vZGVcbiIpOworI2VuZGlmCisJCXJldHVybiAtRU5PREVWIDsKKwl9CisKKwkvKiBmaW5kIHRoZSBPRiBub2RlIHRoYXQgdGVsbHMgdXMgYWJvdXQgdGhlIHNvdW5kIHN1Yi1zeXN0ZW0KKwkgKiB0aGlzIGRvZXNuJ3QgZXhpc3Qgb24gcHJlLWRhdmJ1cyBtYWNoaW5lcyAoZWFybGllciB0aGFuIDk1MDApCisJKi8KKwlpZiAoYXdhY3NfcmV2aXNpb24gIT0gQVdBQ1NfQVdBQ1MpIHsgLyogc2V0IGZvciBwcmUtZGF2YnVzICovCisJCWluZm8gPSBnZXRfc25kX2luZm9fbm9kZShpbykgOworCQlpZiAoaW5mbyA9PSBOVUxMKXsKKyNpZmRlZiBERUJVR19ETUFTT1VORAorcHJpbnRrKCJkbWFzb3VuZF9wbWFjOiBjb3VsZG4ndCBmaW5kICdzb3VuZCcgT0Ygbm9kZVxuIik7CisjZW5kaWYKKwkJCXJldHVybiAtRU5PREVWIDsKKwkJfQorCX0KKworCWF3YWNzX3JldmlzaW9uID0gZ2V0X2NvZGVjX3R5cGUoaW5mbykgOworCWlmIChhd2Fjc19yZXZpc2lvbiA9PSAwKSB7CisjaWZkZWYgREVCVUdfRE1BU09VTkQKK3ByaW50aygiZG1hc291bmRfcG1hYzogY291bGRuJ3QgZmluZCBhIENvZGVjIHdlIGNhbiBoYW5kbGVcbiIpOworI2VuZGlmCisJCXJldHVybiAtRU5PREVWIDsgLyogd2UgZG9uJ3Qga25vdyB0aGlzIHR5cGUgb2YgaC93ICovCisJfQorCisJLyogc2V0IHVwIHBlcmNoLCB6aXZhLCBTUlMgb3Igd2hhdGV2ZXIgZWxzZSB3ZSBoYXZlIGFzIHNvdW5kCisJICogIGV4cGFuc2lvbi4KKwkqLworCWdldF9leHBhbnNpb25fdHlwZSgpOworCisJLyogd2UndmUgbm93IGdvdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gbWFrZSB1cCB0aGUgYXVkaW8gdG9wb2xvZ3kuCisJICogd2Ugd2lsbCBtYXAgdGhlIHNvdW5kIHBhcnQgb2YgbWFjLWlvIG5vdyBzbyB0aGF0IHdlIGNhbiBwcm9iZSBmb3IKKwkgKiBvdGhlciBpbmZvIGlmIG5lY2Vzc2FyeSAoZWFybHkgQVdBQ1Mgd2Ugd2FudCB0byByZWFkIGNoaXAgaWRzKQorCSAqLworCisJaWYgKGlvLT5uX2FkZHJzIDwgMyB8fCBpby0+bl9pbnRycyA8IDMpIHsKKwkJLyogT0sgLSBtYXliZSB3ZSBuZWVkIHRvIHVzZSB0aGUgJ2F3YWNzJyBub2RlIChvbiBlYXJsaWVyCisJCSAqIG1hY2hpbmVzKS4KKwkJKi8KKwkJaWYgKGF3YWNzX25vZGUpIHsKKwkJCWlvID0gYXdhY3Nfbm9kZSA7CisJCQlpZiAoaW8tPm5fYWRkcnMgPCAzIHx8IGlvLT5uX2ludHJzIDwgMykgeworCQkJCXByaW50aygiZG1hc291bmRfcG1hYzogY2FuJ3QgdXNlICVzIgorCQkJCQkiICglZCBhZGRycywgJWQgaW50cnMpXG4iLAorCQkgICAgICAJCSBpby0+ZnVsbF9uYW1lLCBpby0+bl9hZGRycywgaW8tPm5faW50cnMpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKCJkbWFzb3VuZF9wbWFjOiBjYW4ndCB1c2UgJXMgKCVkIGFkZHJzLCAlZCBpbnRycylcbiIsCisJCSAJICAgICAgaW8tPmZ1bGxfbmFtZSwgaW8tPm5fYWRkcnMsIGlvLT5uX2ludHJzKTsKKwkJfQorCX0KKworCWlmICghcmVxdWVzdF9PRl9yZXNvdXJjZShpbywgMCwgTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZDogY2FuJ3QgcmVxdWVzdCBJTyByZXNvdXJjZSAhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICghcmVxdWVzdF9PRl9yZXNvdXJjZShpbywgMSwgIiAodHggZG1hKSIpKSB7CisJCXJlbGVhc2VfT0ZfcmVzb3VyY2UoaW8sIDApOworCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kOiBjYW4ndCByZXF1ZXN0IFRYIERNQSByZXNvdXJjZSAhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFyZXF1ZXN0X09GX3Jlc291cmNlKGlvLCAyLCAiIChyeCBkbWEpIikpIHsKKwkJcmVsZWFzZV9PRl9yZXNvdXJjZShpbywgMCk7CisJCXJlbGVhc2VfT0ZfcmVzb3VyY2UoaW8sIDEpOworCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kOiBjYW4ndCByZXF1ZXN0IFJYIERNQSByZXNvdXJjZSAhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogYWxsIE9GIHZlcnNpb25zIEkndmUgc2VlbiB1c2UgdGhpcyB2YWx1ZSAqLworCWlmIChpMnNfbm9kZSkKKwkJaTJzID0gaW9yZW1hcChpby0+YWRkcnNbMF0uYWRkcmVzcywgMHgxMDAwKTsKKwllbHNlCisJCWF3YWNzID0gaW9yZW1hcChpby0+YWRkcnNbMF0uYWRkcmVzcywgMHgxMDAwKTsKKwlhd2Fjc190eGRtYSA9IGlvcmVtYXAoaW8tPmFkZHJzWzFdLmFkZHJlc3MsIDB4MTAwKTsKKwlhd2Fjc19yeGRtYSA9IGlvcmVtYXAoaW8tPmFkZHJzWzJdLmFkZHJlc3MsIDB4MTAwKTsKKworCS8qIGZpcnN0IG9mIGFsbCBtYWtlIHN1cmUgdGhhdCB0aGUgY2hpcCBpcyBwb3dlcmVkIHVwLi4uLiovCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfU09VTkRfQ0hJUF9FTkFCTEUsIGlvLCAwLCAxKTsKKwlpZiAoYXdhY3NfcmV2aXNpb24gPT0gQVdBQ1NfU0NSRUFNRVIgJiYgYXdhY3MpCisJCWF3YWNzX3JlY2FsaWJyYXRlKCk7CisKKwlhd2Fjc19pcnEgPSBpby0+aW50cnNbMF0ubGluZTsKKwlhd2Fjc190eF9pcnEgPSBpby0+aW50cnNbMV0ubGluZTsKKwlhd2Fjc19yeF9pcnEgPSBpby0+aW50cnNbMl0ubGluZTsKKworCS8qIEhhY2sgZm9yIGxlZ2FjeSBjcmFwIHRoYXQgd2lsbCBiZSBraWxsZWQgc29tZWRheSAqLworCWF3YWNzX25vZGUgPSBpbzsKKworCS8qIGlmIHdlIGhhdmUgYW4gYXdhY3Mgb3Igc2NyZWFtZXIgLSBwcm9iZSB0aGUgY2hpcCB0byBtYWtlCisJICogc3VyZSB3ZSBoYXZlIHRoZSByaWdodCByZXZpc2lvbi4KKwkqLworCisJaWYgKGF3YWNzX3JldmlzaW9uIDw9IEFXQUNTX1NDUkVBTUVSKXsKKwkJdWludDMyX3QgdGVtcCwgcmV2LCBtZmcgOworCQkvKiBmaW5kIG91dCB0aGUgYXdhY3MgcmV2aXNpb24gZnJvbSB0aGUgY2hpcCAqLworCQl0ZW1wID0gaW5fbGUzMigmYXdhY3MtPmNvZGVjX3N0YXQpOworCQlyZXYgPSAodGVtcCA+PiAxMikgJiAweGY7CisJCW1mZyA9ICh0ZW1wID4+ICA4KSAmIDB4ZjsKKyNpZmRlZiBERUJVR19ETUFTT1VORAorcHJpbnRrKCJkbWFzb3VuZF9wbWFjOiBBd2Fjcy9TY3JlYW1lciBDb2RlYyBNZmN0OiAlZCBSZXYgJWRcbiIsIG1mZywgcmV2KTsKKyNlbmRpZgorCQlpZiAocmV2ID49IEFXQUNTX1NDUkVBTUVSKQorCQkJYXdhY3NfcmV2aXNpb24gPSBBV0FDU19TQ1JFQU1FUiA7CisJCWVsc2UKKwkJCWF3YWNzX3JldmlzaW9uID0gcmV2IDsKKwl9CisKKwlkbWFzb3VuZC5tYWNoID0gbWFjaFBNYWM7CisKKwkvKiBmaW5kIG91dCBvdGhlciBiaXRzICYgcGllY2VzIGZyb20gT0YsIHRoZXNlIG1heSBiZSBwcmVzZW50CisJICAgb25seSBvbiBzb21lIG1vZGVscyAuLi4gc28gYmUgY2FyZWZ1bC4KKwkqLworCisJLyogaW4gdGhlIGFic2VuY2Ugb2YgYSBmcmFtZSByYXRlcyBwcm9wZXJ0eSB3ZSB3aWxsIHVzZSB0aGUgZGVmYXVsdHMKKwkqLworCisJaWYgKGluZm8pIHsKKwkJdW5zaWduZWQgaW50ICpwcm9wLCBsOworCisJCXNvdW5kX2RldmljZV9pZCA9IDA7CisJCS8qIGRldmljZSBJRCBhcHBlYXJzIHBvc3QgZzMgYiZ3ICovCisJCXByb3AgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KGluZm8sICJkZXZpY2UtaWQiLCBOVUxMKTsKKwkJaWYgKHByb3AgIT0gMCkKKwkJCXNvdW5kX2RldmljZV9pZCA9ICpwcm9wOworCisJCS8qIGxvb2sgZm9yIGEgcHJvcGVydHkgc2F5aW5nIHdoYXQgc2FtcGxlIHJhdGVzCisJCSAgIGFyZSBhdmFpbGFibGUgKi8KKworCQlwcm9wID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShpbmZvLCAic2FtcGxlLXJhdGVzIiwgJmwpOworCQlpZiAocHJvcCA9PSAwKQorCQkJcHJvcCA9ICh1bnNpZ25lZCBpbnQgKikgZ2V0X3Byb3BlcnR5CisJCQkJKGluZm8sICJvdXRwdXQtZnJhbWUtcmF0ZXMiLCAmbCk7CisKKwkJLyogaWYgaXQncyB0aGVyZSB1c2UgaXQgdG8gc2V0IHVwIGZyYW1lIHJhdGVzICovCisJCWluaXRfZnJhbWVfcmF0ZXMocHJvcCwgbCkgOworCX0KKworCWlmIChhd2FjcykKKwkJb3V0X2xlMzIoJmF3YWNzLT5jb250cm9sLCAweDExKTsgLyogc2V0IGV2ZXJ5dGhpbmcgcXVpZXNlbnQgKi8KKworCXNldF9od19ieXRlc3dhcChpbykgOyAvKiBmaWd1cmUgb3V0IGlmIHRoZSBoL3cgY2FuIGRvIGl0ICovCisKKyNpZmRlZiBDT05GSUdfTlZSQU0KKwkvKiBnZXQgZGVmYXVsdCB2b2x1bWUgZnJvbSBudnJhbSAqLworCXZvbCA9ICgocG1hY194cHJhbV9yZWFkKCA4ICkgJiA3ICkgPDwgMSApOworI2Vsc2UKKwl2b2wgPSAwOworI2VuZGlmCisKKwkvKiBzZXQgdXAgdHJhY2tpbmcgdmFsdWVzICovCisJc3BrX3ZvbCA9IHZvbCAqIDEwMCA7CisJc3BrX3ZvbCAvPSA3IDsgLyogZ2V0IHNldCB2YWx1ZSB0byBhIHBlcmNlbnRhZ2UgKi8KKwlzcGtfdm9sIHw9IChzcGtfdm9sIDw8IDgpIDsgLyogZXF1YWwgbGVmdCAmIHJpZ2h0ICovCisgCWxpbmVfdm9sID0gcGFzc3RocnVfdm9sID0gc3BrX3ZvbCA7CisKKwkvKiBmaWxsIHJlZ3MgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gQVdBQ1MgJiBCdXJndW5keSAqLworCisJYXdhY3NfcmVnWzJdID0gdm9sICsgKHZvbCA8PCA2KTsKKwlhd2Fjc19yZWdbNF0gPSB2b2wgKyAodm9sIDw8IDYpOworCWF3YWNzX3JlZ1s1XSA9IHZvbCArICh2b2wgPDwgNik7IC8qIHNjcmVhbWVyIGhhcyBsb29wdGhydSB2b2wgY29udHJvbCAqLworCWF3YWNzX3JlZ1s2XSA9IDA7IC8qIG1heWJlIHNob3VsZCBiZSB2b2wgPDwgMyBmb3IgUENNQ0lBIHNwZWFrZXIgKi8KKwlhd2Fjc19yZWdbN10gPSAwOworCisJYXdhY3NfcmVnWzBdID0gTUFTS19NVVhfQ0Q7CisJYXdhY3NfcmVnWzFdID0gTUFTS19MT09QVEhSVTsKKworCS8qIEZJWE1FOiBPbmx5IG1hY2hpbmVzIHdpdGggZXh0ZXJuYWwgU1JTIG1vZHVsZSBuZWVkIE1BU0tfUEFST1VUICovCisJaWYgKGhhc19wZXJjaCB8fCBzb3VuZF9kZXZpY2VfaWQgPT0gMHg1CisJICAgIHx8IC8qc291bmRfZGV2aWNlX2lkID09IDB4OCB8fCovIHNvdW5kX2RldmljZV9pZCA9PSAweGIpCisJCWF3YWNzX3JlZ1sxXSB8PSBNQVNLX1BBUk9VVDAgfCBNQVNLX1BBUk9VVDE7CisKKwlzd2l0Y2ggKGF3YWNzX3JldmlzaW9uKSB7CisJCWNhc2UgQVdBQ1NfVFVNQkxFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhc19yZWdpc3Rlcl9kcml2ZXIoJnRhczMwMDFjX2hvb2tzKTsKKwkJCXRhc19pbml0KEkyQ19EUklWRVJJRF9UQVMzMDAxQywgSTJDX0RSSVZFUk5BTUVfVEFTMzAwMUMpOworCQkJdGFzX2RtYXNvdW5kX2luaXQoKTsKKwkJCXRhc19wb3N0X2luaXQoKTsKKwkJCWJyZWFrIDsKKwkJY2FzZSBBV0FDU19TTkFQUEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFzX3JlZ2lzdGVyX2RyaXZlcigmdGFzMzAwNF9ob29rcyk7CisJCQl0YXNfaW5pdChJMkNfRFJJVkVSSURfVEFTMzAwNCxJMkNfRFJJVkVSTkFNRV9UQVMzMDA0KTsKKwkJCXRhc19kbWFzb3VuZF9pbml0KCk7CisJCQl0YXNfcG9zdF9pbml0KCk7CisJCQlicmVhazsKKwkJY2FzZSBBV0FDU19EQUNBOgorCQkJZGFjYV9pbml0KCk7CisJCQlicmVhazsJCisJCWNhc2UgQVdBQ1NfQlVSR1VORFk6CisJCQlhd2Fjc19idXJndW5keV9pbml0KCk7CisJCQlicmVhayA7CisJCWNhc2UgQVdBQ1NfU0NSRUFNRVI6CisJCWNhc2UgQVdBQ1NfQVdBQ1M6CisJCWRlZmF1bHQ6CisJCQlsb2FkX2F3YWNzKCk7CisJCQlicmVhayA7CisJfQorCisJLyogZW5hYmxlL3NldC11cCBleHRlcm5hbCBtb2R1bGVzIC0gd2hlbiB3ZSBrbm93IGhvdyAqLworCisJaWYgKGhhc19wZXJjaCkKKwkJYXdhY3NfZW5hYmxlX2FtcCgxMDAgKiAweDEwMSk7CisKKwkvKiBSZXNldCBkYmRtYSBjaGFubmVscyAqLworCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y29udHJvbCwgKFJVTnxQQVVTRXxGTFVTSHxXQUtFfERFQUQpIDw8IDE2KTsKKwl3aGlsZSAoaW5fbGUzMigmYXdhY3NfdHhkbWEtPnN0YXR1cykgJiBSVU4pCisJCXVkZWxheSgxKTsKKwlvdXRfbGUzMigmYXdhY3NfcnhkbWEtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRXxERUFEKSA8PCAxNik7CisJd2hpbGUgKGluX2xlMzIoJmF3YWNzX3J4ZG1hLT5zdGF0dXMpICYgUlVOKQorCQl1ZGVsYXkoMSk7CisKKwkvKiBJbml0aWFsaXplIGJlZXAgc3R1ZmYgKi8KKwlpZiAoKHJlcz1zZXR1cF9iZWVwKCkpKQorCQlyZXR1cm4gcmVzIDsKKworI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisJcG11X3JlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZhd2Fjc19zbGVlcF9ub3RpZmllcik7CisjZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKworCS8qIFBvd2VyYm9va3MgaGF2ZSBvZGQgd2F5cyBvZiBlbmFibGluZyBpbnB1dHMgc3VjaCBhcworCSAgIGFuIGV4cGFuc2lvbi1iYXkgQ0Qgb3Igc291bmQgZnJvbSBhbiBpbnRlcm5hbCBtb2RlbQorCSAgIG9yIGEgUEMtY2FyZCBtb2RlbS4gKi8KKwlpZiAoaXNfcGJvb2tfM1gwMCkgeworCQkvKgorCQkgKiBFbmFibGUgQ0QgYW5kIFBDLWNhcmQgc291bmQgaW5wdXRzLgorCQkgKiBUaGlzIGlzIGRvbmUgYnkgcmVhZGluZyBmcm9tIGFkZHJlc3MKKwkJICogZjMwMWEwMDAsICsgMHgxMCB0byBlbmFibGUgdGhlIGV4cGFuc2lvbi1iYXkKKwkJICogQ0Qgc291bmQgaW5wdXQsICsgMHg4MCB0byBlbmFibGUgdGhlIFBDLWNhcmQKKwkJICogc291bmQgaW5wdXQuICBUaGUgMHgxMDAgZW5hYmxlcyB0aGUgU0NTSSBidXMKKwkJICogdGVybWluYXRvciBwb3dlci4KKwkJICovCisJCWxhdGNoX2Jhc2UgPSBpb3JlbWFwICgweGYzMDFhMDAwLCAweDEwMDApOworCQlpbl84KGxhdGNoX2Jhc2UgKyAweDE5MCk7CisKKwl9IGVsc2UgaWYgKGlzX3Bib29rX2czKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSogbWlvOworCQltYWNpb19iYXNlID0gTlVMTDsKKwkJZm9yIChtaW8gPSBpby0+cGFyZW50OyBtaW87IG1pbyA9IG1pby0+cGFyZW50KSB7CisJCQlpZiAoc3RyY21wKG1pby0+bmFtZSwgIm1hYy1pbyIpID09IDAKKwkJCSAgICAmJiBtaW8tPm5fYWRkcnMgPiAwKSB7CisJCQkJbWFjaW9fYmFzZSA9IGlvcmVtYXAobWlvLT5hZGRyc1swXS5hZGRyZXNzLCAweDQwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBFbmFibGUgQ0Qgc291bmQgaW5wdXQuCisJCSAqIFRoZSByZWxldmFudCBiaXRzIGZvciB3cml0aW5nIHRvIHRoaXMgYnl0ZSBhcmUgMHg4Zi4KKwkJICogSSBoYXZlbid0IGZvdW5kIG91dCB3aGF0IHRoZSAweDgwIGJpdCBkb2VzLgorCQkgKiBGb3IgdGhlIDB4ZiBiaXRzLCB3cml0aW5nIDMgb3IgNyBlbmFibGVzIHRoZSBDRAorCQkgKiBpbnB1dCwgYW55IG90aGVyIHZhbHVlIGRpc2FibGVzIGl0LiAgVmFsdWVzCisJCSAqIDEsIDMsIDUsIDcgZW5hYmxlIHRoZSBtaWNyb3Bob25lLiAgVmFsdWVzIDAsIDIsCisJCSAqIDQsIDYsIDggLSBmIGVuYWJsZSB0aGUgaW5wdXQgZnJvbSB0aGUgbW9kZW0uCisJCSAqICAtLSBwYXVsdXMuCisJCSAqLworCQlpZiAobWFjaW9fYmFzZSkKKwkJCW91dF84KG1hY2lvX2Jhc2UgKyAweDM3LCAzKTsKKwl9CisKKwlpZiAoaHdfY2FuX2J5dGVzd2FwKQorIAkJZG1hc291bmQubWFjaC5oYXJkd2FyZV9hZm10cyA9IChBRk1UX1MxNl9CRSB8IEFGTVRfUzE2X0xFKSA7CisgCWVsc2UKKwkJZG1hc291bmQubWFjaC5oYXJkd2FyZV9hZm10cyA9IEFGTVRfUzE2X0JFIDsKKworCS8qIHNodXQgb3V0IGNoaXBzIHRoYXQgZG8gb3V0cHV0IG9ubHkuCisJICogbWF5IG5lZWQgdG8gZXh0ZW5kIHRoaXMgdG8gbWFjaGluZXMgd2hpY2ggaGF2ZSBubyBpbnB1dHMgLSBldmVuIHRobycKKwkgKiB0aGV5IHVzZSBzY3JlYW1lciAtIElJUkMgb25lIG9mIHRoZSBwb3dlcmJvb2tzIGlzIGxpa2UgdGhpcy4KKwkgKi8KKworCWlmIChhd2Fjc19yZXZpc2lvbiAhPSBBV0FDU19EQUNBKSB7CisJCWRtYXNvdW5kLm1hY2guY2FwYWJpbGl0aWVzID0gRFNQX0NBUF9EVVBMRVggOworCQlkbWFzb3VuZC5tYWNoLnJlY29yZCA9IFBNYWNSZWNvcmQgOworCX0KKworCWRtYXNvdW5kLm1hY2guZGVmYXVsdF9oYXJkID0gZGVmX2hhcmQgOworCWRtYXNvdW5kLm1hY2guZGVmYXVsdF9zb2Z0ID0gZGVmX3NvZnQgOworCisJc3dpdGNoIChhd2Fjc19yZXZpc2lvbikgeworCQljYXNlIEFXQUNTX0JVUkdVTkRZOgorCQkJc3ByaW50Zihhd2Fjc19uYW1lLCAiUG93ZXJNYWMgQnVyZ3VuZHkgIikgOworCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX0RBQ0E6CisJCQlzcHJpbnRmKGF3YWNzX25hbWUsICJQb3dlck1hYyBEQUNBICIpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBBV0FDU19UVU1CTEVSOgorCQkJc3ByaW50Zihhd2Fjc19uYW1lLCAiUG93ZXJNYWMgVHVtYmxlciAiKSA7CisJCQlicmVhayA7CisJCWNhc2UgQVdBQ1NfU05BUFBFUjoKKwkJCXNwcmludGYoYXdhY3NfbmFtZSwgIlBvd2VyTWFjIFNuYXBwZXIgIikgOworCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX1NDUkVBTUVSOgorCQkJc3ByaW50Zihhd2Fjc19uYW1lLCAiUG93ZXJNYWMgU2NyZWFtZXIgIikgOworCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX0FXQUNTOgorCQlkZWZhdWx0OgorCQkJc3ByaW50Zihhd2Fjc19uYW1lLCAiUG93ZXJNYWMgQVdBQ1MgcmV2ICVkICIsIGF3YWNzX3JldmlzaW9uKSA7CisJCQlicmVhayA7CisJfQorCisJLyoKKwkgKiBYWFg6IHdlIHNob3VsZCBoYW5kbGUgZXJyb3JzIGhlcmUsIGJ1dCB0aGF0IHdvdWxkIG1lYW4KKwkgKiByZXdyaXRpbmcgdGhlIHdob2xlIGluaXQgY29kZS4gIGxhdGVyLi4KKwkgKi8KKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJmF3YWNzX2JlZXBfZGV2KTsKKworCXJldHVybiBkbWFzb3VuZF9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkbWFzb3VuZF9hd2Fjc19jbGVhbnVwKHZvaWQpCit7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJmF3YWNzX2JlZXBfZGV2KTsKKworCXN3aXRjaCAoYXdhY3NfcmV2aXNpb24pIHsKKwkJY2FzZSBBV0FDU19UVU1CTEVSOgorCQljYXNlIEFXQUNTX1NOQVBQRVI6CisJCQl0YXNfZG1hc291bmRfY2xlYW51cCgpOworCQkJdGFzX2NsZWFudXAoKTsKKwkJCWJyZWFrIDsKKwkJY2FzZSBBV0FDU19EQUNBOgorCQkJZGFjYV9jbGVhbnVwKCk7CisJCQlicmVhazsKKwl9CisJZG1hc291bmRfZGVpbml0KCk7CisKK30KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJQb3dlck1hYyBidWlsdC1pbiBhdWRpbyBkcml2ZXIuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGRtYXNvdW5kX2F3YWNzX2luaXQpOworbW9kdWxlX2V4aXQoZG1hc291bmRfYXdhY3NfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfY29yZS5jIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTMwMmExCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2NvcmUuYwpAQCAtMCwwICsxLDE4MjkgQEAKKy8qCisgKiAgbGludXgvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2NvcmUuYworICoKKyAqCisgKiAgT1NTL0ZyZWUgY29tcGF0aWJsZSBBdGFyaSBUVC9GYWxjb24gYW5kIEFtaWdhIERNQSBzb3VuZCBkcml2ZXIgZm9yCisgKiAgTGludXgvbTY4aworICogIEV4dGVuZGVkIHRvIHN1cHBvcnQgUG93ZXIgTWFjaW50b3NoIGZvciBMaW51eC9wcGMgYnkgUGF1bCBNYWNrZXJyYXMKKyAqCisgKiAgKGMpIDE5OTUgYnkgTWljaGFlbCBTY2hsdWV0ZXIgJiBNaWNoYWVsIE1hcnRlCisgKgorICogIE1pY2hhZWwgU2NobHVldGVyIChtaWNoYWVsQGR1Y2suc3lkLmRlKSBkaWQgdGhlIGJhc2ljIHN0cnVjdHVyZSBvZiB0aGUgVkZTCisgKiAgaW50ZXJmYWNlIGFuZCB0aGUgdS1sYXcgdG8gc2lnbmVkIGJ5dGUgY29udmVyc2lvbi4KKyAqCisgKiAgTWljaGFlbCBNYXJ0ZSAobWFydGVAaW5mb3JtYXRpay51bmktbXVlbmNoZW4uZGUpIGRpZCB0aGUgc291bmQgcXVldWUsCisgKiAgL2Rldi9taXhlciwgL2Rldi9zbmRzdGF0IGFuZCBjb21wbGVtZW50ZWQgdGhlIFZGUyBpbnRlcmZhY2UuIEhlIHdvdWxkIGxpa2UKKyAqICB0byB0aGFuazoKKyAqICAgIC0gTWljaGFlbCBTY2hsdWV0ZXIgZm9yIGluaXRpYWwgaWRlYXMgYW5kIGRvY3VtZW50YXRpb24gb24gdGhlIE1GUCBhbmQKKyAqCXRoZSBETUEgc291bmQgaGFyZHdhcmUuCisgKiAgICAtIFRoZXJhcHk/IGZvciB0aGVpciBDRCAnVHJvdWJsZWd1bScgd2hpY2ggcmVhbGx5IG1hZGUgbWUgcm9jay4KKyAqCisgKiAgL2Rldi9zbmRzdGF0IGlzIGJhc2VkIG9uIGNvZGUgYnkgSGFubnUgU2F2b2xhaW5lbiwgdGhlIGF1dGhvciBvZiB0aGUKKyAqICBWb3hXYXJlIGZhbWlseSBvZiBkcml2ZXJzLgorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgSGlzdG9yeToKKyAqCisgKgkxOTk1LzgvMjUJRmlyc3QgcmVsZWFzZQorICoKKyAqCTE5OTUvOS8wMglSb21hbiBIb2RlazoKKyAqCQkJICAtIEZpeGVkIGF0YXJpX3N0cmFtX2FsbG9jKCkgY2FsbCwgdGhlIHRpbWVyCisgKgkJCSAgICBwcm9ncmFtbWluZyBhbmQgc2V2ZXJhbCByYWNlIGNvbmRpdGlvbnMKKyAqCTE5OTUvOS8xNAlSb21hbiBIb2RlazoKKyAqCQkJICAtIEFmdGVyIHNvbWUgZGlzY3Vzc2lvbiB3aXRoIE1pY2hhZWwgU2NobHVldGVyLAorICoJCQkgICAgcmV2aXNlZCB0aGUgaW50ZXJydXB0IGRpc2FibGluZworICoJCQkgIC0gU2xpZ2h0bHkgc3BlZWRlZCB1cCBVOC0+UzggdHJhbnNsYXRpb24gYnkgdXNpbmcKKyAqCQkJICAgIGxvbmcgb3BlcmF0aW9ucyB3aGVyZSBwb3NzaWJsZQorICoJCQkgIC0gQWRkZWQgNDozIGludGVycG9sYXRpb24gZm9yIC9kZXYvYXVkaW8KKyAqCisgKgkxOTk1LzkvMjAJVG9yc3RlbiBTY2hlcmVyOgorICoJCQkgIC0gRml4ZWQgYSBidWcgaW4gc3Ffd3JpdGUgYW5kIGNoYW5nZWQgL2Rldi9hdWRpbworICoJCQkgICAgY29udmVydGluZyB0byBwbGF5IGF0IDEyNTE3SHogaW5zdGVhZCBvZiA2MjU4SHouCisgKgorICoJMTk5NS85LzIzCVRvcnN0ZW4gU2NoZXJlcjoKKyAqCQkJICAtIENoYW5nZWQgc3FfaW50ZXJydXB0KCkgYW5kIHNxX3BsYXkoKSB0byBwcmUtcHJvZ3JhbQorICoJCQkgICAgdGhlIERNQSBmb3IgYW5vdGhlciBmcmFtZSB3aGlsZSB0aGVyZSdzIHN0aWxsIG9uZQorICoJCQkgICAgcnVubmluZy4gVGhpcyBhbGxvd3MgdGhlIElSUSByZXNwb25zZSB0byBiZQorICoJCQkgICAgYXJiaXRyYXJpbHkgZGVsYXllZCBhbmQgcGxheWluZyB3aWxsIHN0aWxsIGNvbnRpbnVlLgorICoKKyAqCTE5OTUvMTAvMTQJR3VlbnRoZXIgS2VsbGV0ZXIsIFRvcnN0ZW4gU2NoZXJlcjoKKyAqCQkJICAtIEJldHRlciBzdXBwb3J0IGZvciBGYWxjb24gYXVkaW8gKHRoZSBGYWxjb24gZG9lc24ndAorICoJCQkgICAgcmFpc2UgYW4gSVJRIGF0IHRoZSBlbmQgb2YgYSBmcmFtZSwgYnV0IGF0IHRoZQorICoJCQkgICAgYmVnaW5uaW5nIGluc3RlYWQhKS4gdXNlcyAnaWYgKGNvZGVjX2RtYSknIGluIGxvdHMKKyAqCQkJICAgIG9mIHBsYWNlcyB0byBzaW1wbHkgc3dpdGNoIGJldHdlZW4gRmFsY29uIGFuZCBUVAorICoJCQkgICAgY29kZS4KKyAqCisgKgkxOTk1LzExLzA2CVRvcnN0ZW4gU2NoZXJlcjoKKyAqCQkJICAtIFN0YXJ0ZWQgaW50cm9kdWNpbmcgYSBoYXJkd2FyZSBhYnN0cmFjdGlvbiBzY2hlbWUKKyAqCQkJICAgIChtYXkgcGVyaGFwcyBhbHNvIHNlcnZlIGZvciBBbWlnYXM/KQorICoJCQkgIC0gQ2FuIG5vdyBwbGF5IHNhbXBsZXMgYXQgYWxtb3N0IGFsbCBmcmVxdWVuY2llcyBieQorICoJCQkgICAgbWVhbnMgb2YgYSBtb3JlIGdlbmVyYWxpemVkIGV4cGFuZCByb3V0aW5lCisgKgkJCSAgLSBUYWtlcyBhIGdvb2QgZGVhbCBvZiBjYXJlIHRvIGN1dCBkYXRhIG9ubHkgYXQKKyAqCQkJICAgIHNhbXBsZSBzaXplcworICoJCQkgIC0gQnVmZmVyIHNpemUgaXMgbm93IGEga2VybmVsIHJ1bnRpbWUgb3B0aW9uCisgKgkJCSAgLSBJbXBsZW1lbnRlZCBmc3luYygpICYgc2V2ZXJhbCBtaW5vciBpbXByb3ZlbWVudHMKKyAqCQkJR3VlbnRoZXIgS2VsbGV0ZXI6CisgKgkJCSAgLSBVc2VmdWwgaGludHMgYW5kIGJ1ZyBmaXhlcworICoJCQkgIC0gQ3Jvc3MtY2hlY2tlZCBpdCBmb3IgRmFsY29ucworICoKKyAqCTE5OTYvMy85CUdlZXJ0IFV5dHRlcmhvZXZlbjoKKyAqCQkJICAtIFN1cHBvcnQgYWRkZWQgZm9yIEFtaWdhLCBBLWxhdywgMTYtYml0IGxpdHRsZQorICoJCQkgICAgZW5kaWFuLgorICoJCQkgIC0gVW5pZmljYXRpb24gdG8gZHJpdmVycy9zb3VuZC9kbWFzb3VuZC5jLgorICoKKyAqCTE5OTYvNC82CU1hcnRpbiBNaXRjaGVsbDoKKyAqCQkJICAtIFVwZGF0ZWQgdG8gMS4zIGtlcm5lbC4KKyAqCisgKgkxOTk2LzYvMTMgICAgICAgVG9waSBLYW5lcnZhOgorICoJCQkgIC0gRml4ZWQgdGhpbmdzIHRoYXQgd2VyZSBicm9rZW4gKG1haW5seSB0aGUgYW1pZ2EKKyAqCQkJICAgIDE0LWJpdCByb3V0aW5lcykKKyAqCQkJICAtIC9kZXYvc25kc3RhdCBzaG93cyBub3cgdGhlIHJlYWwgaGFyZHdhcmUgZnJlcXVlbmN5CisgKgkJCSAgLSBUaGUgbG93cGFzcyBmaWx0ZXIgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBub3cKKyAqCisgKgkxOTk2LzkvMjUJR2VlcnQgVXl0dGVyaG9ldmVuOgorICoJCQkgIC0gTW9kdWxhcml6YXRpb24KKyAqCisgKgkxOTk4LzYvMTAJQW5kcmVhcyBTY2h3YWI6CisgKgkJCSAgLSBDb252ZXJ0ZWQgdG8gdXNlIHNvdW5kX2NvcmUKKyAqCisgKgkxOTk5LzEyLzI4CVJpY2hhcmQgWmlkbGlja3k6CisgKgkJCSAgLSBBZGRlZCBzdXBwb3J0IGZvciBRNDAKKyAqCisgKgkyMDAwLzIvMjcJR2VlcnQgVXl0dGVyaG9ldmVuOgorICoJCQkgIC0gQ2xlYW4gdXAgYW5kIHNwbGl0IHRoZSBjb2RlIGludG8gNCBwYXJ0czoKKyAqCQkJICAgICAgbyBkbWFzb3VuZF9jb3JlOiBtYWNoaW5lLWluZGVwZW5kZW50IGNvZGUKKyAqCQkJICAgICAgbyBkbWFzb3VuZF9hdGFyaTogQXRhcmkgVFQgYW5kIEZhbGNvbiBzdXBwb3J0CisgKgkJCSAgICAgIG8gZG1hc291bmRfYXdhY3M6IEFwcGxlIFBvd2VyTWFjIHN1cHBvcnQKKyAqCQkJICAgICAgbyBkbWFzb3VuZF9wYXVsYTogQW1pZ2Egc3VwcG9ydAorICoKKyAqCTIwMDAvMy8yNQlHZWVydCBVeXR0ZXJob2V2ZW46CisgKgkJCSAgLSBJbnRlZ3JhdGlvbiBvZiBkbWFzb3VuZF9xNDAKKyAqCQkJICAtIFNtYWxsIGNsZWFuIHVwcworICoKKyAqCTIwMDEvMDEvMjYgWzEuMF0gSWFpbiBTYW5kb2UKKyAqCQkJICAtIG1ha2UgL2Rldi9zbmRzdGF0IHNob3cgcmV2aXNpb24gJiBlZGl0aW9uIGluZm8uCisgKgkJCSAgLSBzaW5jZSBkbWFzb3VuZC5tYWNoLnNxX3NldHVwKCkgY2FuIGZhaWwgb24gcG1hYworICoJCQkgICAgaXRzIHR5cGUgaGFzIGJlZW4gY2hhbmdlZCB0byBpbnQgYW5kIHRoZSByZXR1cm5zCisgKgkJCSAgICBhcmUgY2hlY2tlZC4KKyAqCQkgICBbMS4xXSAgLSBzdG9wIG1pc3NpbmcgdHJhbnNsYXRpb25zIGZyb20gYmVpbmcgY2FsbGVkLgorICoJMjAwMS8wMi8wOCBbMS4yXSAgLSByZW1vdmUgdW51c2VkIHRyYW5zbGF0aW9uIHRhYmxlcyAmIG1vdmUgbWFjaGluZS0KKyAqCQkJICAgIHNwZWNpZmljIHRhYmxlcyB0byBsb3ctbGV2ZWwuCisgKgkJCSAgLSByZXR1cm4gY29ycmVjdCBpbmZvLiBmb3IgU05EQ1RMX0RTUF9HRVRGTVRTLgorICoJCSAgIFsxLjNdICAtIGltcGxlbWVudCBTTkRDVExfRFNQX0dFVENBUFMgZnVsbHkuCisgKgkJICAgWzEuNF0gIC0gbWFrZSAvZGV2L3NuZHN0YXQgdGV4dCBsZW5ndGggdXNhZ2UgZGV0ZXJtaW5pc3RpYy4KKyAqCQkJICAtIG1ha2UgL2Rldi9zbmRzdGF0IGNhbGwgdG8gbG93LWxldmVsCisgKgkJCSAgICBkbWFzb3VuZC5tYWNoLnN0YXRlX2luZm8oKSBwYXNzIG1heCBzcGFjZSB0byBsbCBkcml2ZXIuCisgKgkJCSAgLSB0aWR5IHN0YXJ0dXAgYmFubmVycyBhbmQgb3V0cHV0IGluZm8uCisgKgkJICAgWzEuNV0gIC0gdGlkeSB1cCBhIGxpdHRsZSAocmVtb3ZlZCBzb21lIHVudXNlZCAjZGVmaW5lcyBpbgorICoJCQkgICAgZG1hc291bmQuaCkKKyAqCQkJICAtIGZpeCB1cCBIQVNfUkVDT1JEIGNvbmRpdGlvbmFsaXNhdGlvbi4KKyAqCQkJICAtIGFkZCByZWNvcmQgY29kZSBpbiBwbGFjZXMgaXQgaXMgbWlzc2luZy4uLgorICoJCQkgIC0gY2hhbmdlIGJ1Zi1zaXplcyB0byBieXRlcyB0byBhbGxvdyA8IDFrYiBmb3IgcG1hYworICoJCQkgICAgaWYgdXNlciBwYXJhbSBlbnRyeSBpcyA8IDI1NiB0aGUgdmFsdWUgaXMgdGFrZW4gdG8KKyAqCQkJICAgIGJlIGluIGtiID4gMjU2IGlzIHRha2VuIHRvIGJlIGluIGJ5dGVzLgorICoJCQkgIC0gbWFrZSBkZWZhdWx0IGJ1ZmYvZnJhZyBwYXJhbXMgY29uZGl0aW9uYWwgb24KKyAqCQkJICAgIG1hY2hpbmUgdG8gYWxsb3cgc21hbGxlciB2YWx1ZXMgZm9yIHBtYWMuCisgKgkJCSAgLSBtYWRlIHRoZSBpb2N0bHMsIHJlYWQgJiB3cml0ZSBjb21wbHkgd2l0aCB0aGUgT1NTCisgKgkJCSAgICBydWxlcyBvbiBzZXR0aW5nIHBhcmFtcy4KKyAqCQkJICAtIGFkZGVkIHBhcnNpbmcgb2YgX3NldHVwKCkgcGFyYW1zIGZvciByZWNvcmQuCisgKgkyMDAxLzA0LzA0IFsxLjZdICAtIGZpeCBidWcgd2hlcmUgc2FtcGxlIHJhdGVzIGhpZ2hlciB0aGFuIG1heGltdW0gd2VyZQorICoJCQkgICAgYmVpbmcgcmVwb3J0ZWQgYXMgT0suCisgKgkJCSAgLSBmaXggb3BlbigpIHRvIHJldHVybiAtRUJVU1kgYXMgcGVyIE9TUyBkb2MuIHdoZW4KKyAqCQkJICAgIGF1ZGlvIGlzIGluIHVzZSAtIHRoaXMgaXMgaW5kZXBlbmRlbnQgb2YgT19OT0JMT0NLLgorICoJCQkgIC0gZml4IGJ1ZyB3aGVyZSBTTkRDVExfRFNQX1BPU1Qgd2FzIGJsb2NraW5nLgorICovCisKKyAvKiBSZWNvcmQgY2FwYWJpbGl0eSBub3RlcyAzMC8wMS8yMDAxOgorICAqIEF0IHByZXNlbnQgdGhlc2Ugb2JzZXJ2YXRpb25zIGFwcGx5IG9ubHkgdG8gcG1hYyBMTCBkcml2ZXIgKHRoZSBvbmx5IG9uZQorICAqIHRoYXQgY2FuIGRvIHJlY29yZCwgYXQgcHJlc2VudCkuICBIb3dldmVyLCBpZiBvdGhlciBMTCBkcml2ZXJzIGZvciBtYWNoaW5lcworICAqIHdpdGggcmVjb3JkIGFyZSBhZGRlZCB0aGV5IG1heSBhcHBseS4KKyAgKgorICAqIFRoZSBmcmFnbWVudCBwYXJhbWV0ZXJzIGZvciB0aGUgcmVjb3JkIGFuZCBwbGF5IGNoYW5uZWxzIGFyZSBzZXBhcmF0ZS4KKyAgKiBIb3dldmVyLCBpZiB0aGUgZHJpdmVyIGlzIG9wZW5lZCBPX1JEV1IgdGhlcmUgaXMgbm8gd2F5IChpbiB0aGUgY3VycmVudCBPU1MKKyAgKiBBUEkpIHRvIHNwZWNpZnkgdGhlaXIgdmFsdWVzIGluZGVwZW5kZW50bHkgZm9yIHRoZSByZWNvcmQgYW5kIHBsYXliYWNrCisgICogY2hhbm5lbHMuICBTaW5jZSB0aGUgb25seSBjb21tb24gZmFjdG9yIGJldHdlZW4gdGhlIGlucHV0ICYgb3V0cHV0IGlzIHRoZQorICAqIHNhbXBsZSByYXRlIChvbiBwbWFjKSBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gb3BlbiAvZGV2L2RzcFggT19XUk9OTFkgYW5kCisgICogL2Rldi9kc3BZIE9fUkRPTkxZLiAgVGhlIGlucHV0ICYgb3V0cHV0IGNoYW5uZWxzIGNvdWxkIHRoZW4gaGF2ZSBkaWZmZXJlbnQKKyAgKiBjaGFyYWN0ZXJpc3RpY3MgKG90aGVyIHRoYW4gdGhlIGZpcnN0IHRoYXQgc2V0cyBzYW1wbGUgcmF0ZSBjbGFpbWluZyB0aGUKKyAgKiByaWdodCB0byBzZXQgaXQgZm9yIGV2ZXIpLiAgQXMgaXQgc3RhbmRzLCB0aGUgZm9ybWF0LCBjaGFubmVscywgbnVtYmVyIG9mCisgICogYml0cyAmIHNhbXBsZSByYXRlIGFyZSBhc3N1bWVkIHRvIGJlIGNvbW1vbi4gIEluIHRoZSBmdXR1cmUgcGVyaGFwcyB0aGVzZQorICAqIHNob3VsZCBiZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIExMIGRyaXZlciAtIGFuZCB0aGVuIGlmIGEgY2FyZCByZWFsbHkKKyAgKiBkb2VzIG5vdCBzaGFyZSBpdGVtcyBiZXR3ZWVuIHJlY29yZCAmIHBsYXliYWNrIHRoZXkgY2FuIGJlIHNwZWNpZmllZAorICAqIHNlcGFyYXRlbHkuCisqLworCisvKiBUaHJlYWQtc2FmZW5lc3Mgb2Ygc2hhcmVkX3Jlc291cmNlcyBub3RlczogMzEvMDEvMjAwMQorICogSWYgdGhlIHVzZXIgb3BlbnMgT19SRFdSIGFuZCB0aGVuIHNwbGl0cyByZWNvcmQgJiBwbGF5IGJldHdlZW4gdHdvIHRocmVhZHMKKyAqIGJvdGggb2Ygd2hpY2ggaW5oZXJpdCB0aGUgZmQgLSBhbmQgdGhlbiBzdGFydHMgY2hhbmdpbmcgdGhpbmdzIGZyb20gYm90aAorICogLSB3ZSB3aWxsIGhhdmUgZGlmZmljdWx0eSB0ZWxsaW5nLgorICoKKyAqIEl0J3MgYmFkIGFwcGxpY2F0aW9uIGNvZGluZyAtIGJ1dCAuLi4KKyAqIFRPRE86IHRoaW5rIGFib3V0IGhvdyB0byBzb3J0IHRoaXMgb3V0Li4uIHdpdGhvdXQgYm9nZ2luZyBldmVyeXRoaW5nIGRvd24gaW4KKyAqIHNlbWFwaG9yZXMuCisgKgorICogU2ltaWxhcmx5LCB0aGUgT1NTIHNwZWMgc2F5cyAiYWxsIGNoYW5nZXMgdG8gcGFyYW1ldGVycyBtdXN0IGJlIGJldHdlZW4KKyAqIG9wZW4oKSBhbmQgdGhlIGZpcnN0IHJlYWQoKSBvciB3cml0ZSgpLiAtIGFuZCBhIGJpdCBsYXRlciBvbiAoYnkKKyAqIGltcGxpY2F0aW9uKSAiYmV0d2VlbiBTTkRDVExfRFNQX1JFU0VUIGFuZCB0aGUgZmlyc3QgcmVhZCgpIG9yIHdyaXRlKCkgYWZ0ZXIKKyAqIGl0Ii4gIElmIHRoZSBhcHAgaXMgbXVsdGktdGhyZWFkZWQgYW5kIHRoaXMgcnVsZSBpcyBicm9rZW4gYmV0d2VlbiB0aHJlYWRzCisgKiB3ZSB3aWxsIGhhdmUgdHJvdWJsZSBzcG90dGluZyBpdCAtIGFuZCB0aGUgZmF1bHQgd2lsbCBiZSByYXRoZXIgb2JzY3VyZSA6LSgKKyAqCisgKiBXZSB3aWxsIHRyeSBhbmQgcHV0IG91dCBhdCBsZWFzdCBhIGttc2cgaWYgd2Ugc2VlIGl0IGhhcHBlbi4uLiBidXQgSSB0aGluaworICogaXQgd2lsbCBiZSBxdWl0ZSBoYXJkIHRvIHRyYXAgaXQgd2l0aCBhbiAtRVhYWCByZXR1cm4uLi4gYmVjYXVzZSB3ZSBjYW4ndAorICogc2VlIHRoZSBmYXVsdCB1bnRpbCBhZnRlciB0aGUgZGFtYWdlIGlzIGRvbmUuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImRtYXNvdW5kLmgiCisKKyNkZWZpbmUgRE1BU09VTkRfQ09SRV9SRVZJU0lPTiAxCisjZGVmaW5lIERNQVNPVU5EX0NPUkVfRURJVElPTiA2CisKKyAgICAvKgorICAgICAqICBEZWNsYXJhdGlvbnMKKyAgICAgKi8KKworaW50IGRtYXNvdW5kX2NhdGNoUmFkaXVzID0gMDsKK01PRFVMRV9QQVJNKGRtYXNvdW5kX2NhdGNoUmFkaXVzLCAiaSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IG51bVdyaXRlQnVmcyA9IERFRkFVTFRfTl9CVUZGRVJTOworTU9EVUxFX1BBUk0obnVtV3JpdGVCdWZzLCAiaSIpOworc3RhdGljIHVuc2lnbmVkIGludCB3cml0ZUJ1ZlNpemUgPSBERUZBVUxUX0JVRkZfU0laRSA7CS8qIGluIGJ5dGVzICovCitNT0RVTEVfUEFSTSh3cml0ZUJ1ZlNpemUsICJpIik7CisKKyNpZmRlZiBIQVNfUkVDT1JECitzdGF0aWMgdW5zaWduZWQgaW50IG51bVJlYWRCdWZzID0gREVGQVVMVF9OX0JVRkZFUlM7CitNT0RVTEVfUEFSTShudW1SZWFkQnVmcywgImkiKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZEJ1ZlNpemUgPSBERUZBVUxUX0JVRkZfU0laRTsJLyogaW4gYnl0ZXMgKi8KK01PRFVMRV9QQVJNKHJlYWRCdWZTaXplLCAiaSIpOworI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIE1PRFVMRQorc3RhdGljIGludCBzcV91bml0ID0gLTE7CitzdGF0aWMgaW50IG1peGVyX3VuaXQgPSAtMTsKK3N0YXRpYyBpbnQgc3RhdGVfdW5pdCA9IC0xOworc3RhdGljIGludCBpcnFfaW5zdGFsbGVkOworI2VuZGlmIC8qIE1PRFVMRSAqLworCisvKiBzb2Z0d2FyZSBpbXBsZW1lbnRlZCByZWNvcmRpbmcgdm9sdW1lISAqLwordWludCBzb2Z0d2FyZV9pbnB1dF92b2x1bWUgPSBTV19JTlBVVF9WT0xVTUVfU0NBTEUgKiBTV19JTlBVVF9WT0xVTUVfREVGQVVMVDsKK0VYUE9SVF9TWU1CT0woc29mdHdhcmVfaW5wdXRfdm9sdW1lKTsKKworLyogY29udHJvbCBvdmVyIHdobyBjYW4gbW9kaWZ5IHJlc291cmNlcyBzaGFyZWQgYmV0d2VlbiBwbGF5L3JlY29yZCAqLworc3RhdGljIG1vZGVfdCBzaGFyZWRfcmVzb3VyY2Vfb3duZXI7CitzdGF0aWMgaW50IHNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQ7CisKKyAgICAvKgorICAgICAqICBNaWQgbGV2ZWwgc3R1ZmYKKyAgICAgKi8KKworc3RydWN0IHNvdW5kX3NldHRpbmdzIGRtYXNvdW5kID0geyAubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRCB9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc291bmRfc2lsZW5jZSh2b2lkKQoreworCWRtYXNvdW5kLm1hY2guc2lsZW5jZSgpOyAvKiBfTVVTVF8gc3RvcCBETUEgKi8KK30KKworc3RhdGljIGlubGluZSBpbnQgc291bmRfc2V0X2Zvcm1hdChpbnQgZm9ybWF0KQoreworCXJldHVybiBkbWFzb3VuZC5tYWNoLnNldEZvcm1hdChmb3JtYXQpOworfQorCisKK3N0YXRpYyBpbnQgc291bmRfc2V0X3NwZWVkKGludCBzcGVlZCkKK3sKKwlpZiAoc3BlZWQgPCAwKQorCQlyZXR1cm4gZG1hc291bmQuc29mdC5zcGVlZDsKKworCS8qIHRyYXAgb3V0LW9mLXJhbmdlIHNwZWVkIHNldHRpbmdzLgorCSAgIGF0IHByZXNlbnQgd2UgYWxsb3cgKGFyYml0cmFyaWx5KSBsb3cgcmF0ZXMgLSB1c2luZyBzb2Z0CisJICAgdXAtY29udmVyc2lvbiAtIGJ1dCB3ZSBjYW4ndCBhbGxvdyA+IG1heCBiZWNhdXNlIHRoZXJlIGlzCisJICAgbm8gc29mdCBkb3duLWNvbnZlcnNpb24uCisJKi8KKwlpZiAoZG1hc291bmQubWFjaC5tYXhfZHNwX3NwZWVkICYmCisJICAgKHNwZWVkID4gZG1hc291bmQubWFjaC5tYXhfZHNwX3NwZWVkKSkKKwkJc3BlZWQgPSBkbWFzb3VuZC5tYWNoLm1heF9kc3Bfc3BlZWQgOworCisJZG1hc291bmQuc29mdC5zcGVlZCA9IHNwZWVkOworCisJaWYgKGRtYXNvdW5kLm1pbkRldiA9PSBTTkRfREVWX0RTUCkKKwkJZG1hc291bmQuZHNwLnNwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKworCXJldHVybiBkbWFzb3VuZC5zb2Z0LnNwZWVkOworfQorCitzdGF0aWMgaW50IHNvdW5kX3NldF9zdGVyZW8oaW50IHN0ZXJlbykKK3sKKwlpZiAoc3RlcmVvIDwgMCkKKwkJcmV0dXJuIGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCisJc3RlcmVvID0gISFzdGVyZW87ICAgIC8qIHNob3VsZCBiZSAwIG9yIDEgbm93ICovCisKKwlkbWFzb3VuZC5zb2Z0LnN0ZXJlbyA9IHN0ZXJlbzsKKwlpZiAoZG1hc291bmQubWluRGV2ID09IFNORF9ERVZfRFNQKQorCQlkbWFzb3VuZC5kc3Auc3RlcmVvID0gc3RlcmVvOworCisJcmV0dXJuIHN0ZXJlbzsKK30KKworc3RhdGljIHNzaXplX3Qgc291bmRfY29weV90cmFuc2xhdGUoVFJBTlMgKnRyYW5zLCBjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLAorCQkJCSAgICBzaXplX3QgdXNlckNvdW50LCB1X2NoYXIgZnJhbWVbXSwKKwkJCQkgICAgc3NpemVfdCAqZnJhbWVVc2VkLCBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90ICgqY3RfZnVuYykoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworCisJc3dpdGNoIChkbWFzb3VuZC5zb2Z0LmZvcm1hdCkgeworCSAgICBjYXNlIEFGTVRfTVVfTEFXOgorCQljdF9mdW5jID0gdHJhbnMtPmN0X3VsYXc7CisJCWJyZWFrOworCSAgICBjYXNlIEFGTVRfQV9MQVc6CisJCWN0X2Z1bmMgPSB0cmFucy0+Y3RfYWxhdzsKKwkJYnJlYWs7CisJICAgIGNhc2UgQUZNVF9TODoKKwkJY3RfZnVuYyA9IHRyYW5zLT5jdF9zODsKKwkJYnJlYWs7CisJICAgIGNhc2UgQUZNVF9VODoKKwkJY3RfZnVuYyA9IHRyYW5zLT5jdF91ODsKKwkJYnJlYWs7CisJICAgIGNhc2UgQUZNVF9TMTZfQkU6CisJCWN0X2Z1bmMgPSB0cmFucy0+Y3RfczE2YmU7CisJCWJyZWFrOworCSAgICBjYXNlIEFGTVRfVTE2X0JFOgorCQljdF9mdW5jID0gdHJhbnMtPmN0X3UxNmJlOworCQlicmVhazsKKwkgICAgY2FzZSBBRk1UX1MxNl9MRToKKwkJY3RfZnVuYyA9IHRyYW5zLT5jdF9zMTZsZTsKKwkJYnJlYWs7CisJICAgIGNhc2UgQUZNVF9VMTZfTEU6CisJCWN0X2Z1bmMgPSB0cmFucy0+Y3RfdTE2bGU7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJLyogaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCBhIG5vbi1leGlzdGVudCB0cmFuc2xhdGlvbiBkb24ndCB0cnkKKwkgICB0byBjYWxsIGl0IGJ1dCBqdXN0IHJldHVybiAwIGJ5dGVzIG1vdmVkCisJKi8KKwlpZiAoY3RfZnVuYykKKwkJcmV0dXJuIGN0X2Z1bmModXNlclB0ciwgdXNlckNvdW50LCBmcmFtZSwgZnJhbWVVc2VkLCBmcmFtZUxlZnQpOworCXJldHVybiAwOworfQorCisgICAgLyoKKyAgICAgKiAgL2Rldi9taXhlciBhYnN0cmFjdGlvbgorICAgICAqLworCitzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgYnVzeTsKKyAgICBpbnQgbW9kaWZ5X2NvdW50ZXI7Cit9IG1peGVyOworCitzdGF0aWMgaW50IG1peGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKCF0cnlfbW9kdWxlX2dldChkbWFzb3VuZC5tYWNoLm93bmVyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJbWl4ZXIuYnVzeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWl4ZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlsb2NrX2tlcm5lbCgpOworCW1peGVyLmJ1c3kgPSAwOworCW1vZHVsZV9wdXQoZG1hc291bmQubWFjaC5vd25lcik7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorc3RhdGljIGludCBtaXhlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLAorCQkgICAgICAgdV9sb25nIGFyZykKK3sKKwlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkKKwkgICAgbWl4ZXIubW9kaWZ5X2NvdW50ZXIrKzsKKwlzd2l0Y2ggKGNtZCkgeworCSAgICBjYXNlIE9TU19HRVRWRVJTSU9OOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgU09VTkRfVkVSU0lPTik7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfSU5GTzoKKwkJeworCQkgICAgbWl4ZXJfaW5mbyBpbmZvOworCQkgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQkgICAgc3RybGNweShpbmZvLmlkLCBkbWFzb3VuZC5tYWNoLm5hbWUyLCBzaXplb2YoaW5mby5pZCkpOworCQkgICAgc3RybGNweShpbmZvLm5hbWUsIGRtYXNvdW5kLm1hY2gubmFtZTIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJICAgIGluZm8ubW9kaWZ5X2NvdW50ZXIgPSBtaXhlci5tb2RpZnlfY291bnRlcjsKKwkJICAgIGlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCSAgICByZXR1cm4gLUVGQVVMVDsKKwkJICAgIHJldHVybiAwOworCQl9CisJfQorCWlmIChkbWFzb3VuZC5tYWNoLm1peGVyX2lvY3RsKQorCSAgICByZXR1cm4gZG1hc291bmQubWFjaC5taXhlcl9pb2N0bChjbWQsIGFyZyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1peGVyX2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gbWl4ZXJfaW9jdGwsCisJLm9wZW4JCT0gbWl4ZXJfb3BlbiwKKwkucmVsZWFzZQk9IG1peGVyX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBtaXhlcl9pbml0KHZvaWQpCit7CisjaWZuZGVmIE1PRFVMRQorCWludCBtaXhlcl91bml0OworI2VuZGlmCisJbWl4ZXJfdW5pdCA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZtaXhlcl9mb3BzLCAtMSk7CisJaWYgKG1peGVyX3VuaXQgPCAwKQorCQlyZXR1cm47CisKKwltaXhlci5idXN5ID0gMDsKKwlkbWFzb3VuZC50cmVibGUgPSAwOworCWRtYXNvdW5kLmJhc3MgPSAwOworCWlmIChkbWFzb3VuZC5tYWNoLm1peGVyX2luaXQpCisJICAgIGRtYXNvdW5kLm1hY2gubWl4ZXJfaW5pdCgpOworfQorCisKKyAgICAvKgorICAgICAqICBTb3VuZCBxdWV1ZSBzdHVmZiwgdGhlIGhlYXJ0IG9mIHRoZSBkcml2ZXIKKyAgICAgKi8KKworc3RydWN0IHNvdW5kX3F1ZXVlIGRtYXNvdW5kX3dyaXRlX3NxOworc3RhdGljIHZvaWQgc3FfcmVzZXRfb3V0cHV0KHZvaWQpIDsKKyNpZmRlZiBIQVNfUkVDT1JECitzdHJ1Y3Qgc291bmRfcXVldWUgZG1hc291bmRfcmVhZF9zcTsKK3N0YXRpYyB2b2lkIHNxX3Jlc2V0X2lucHV0KHZvaWQpIDsKKyNlbmRpZgorCitzdGF0aWMgaW50IHNxX2FsbG9jYXRlX2J1ZmZlcnMoc3RydWN0IHNvdW5kX3F1ZXVlICpzcSwgaW50IG51bSwgaW50IHNpemUpCit7CisJaW50IGk7CisKKwlpZiAoc3EtPmJ1ZmZlcnMpCisJCXJldHVybiAwOworCXNxLT5udW1CdWZzID0gbnVtOworCXNxLT5idWZTaXplID0gc2l6ZTsKKwlzcS0+YnVmZmVycyA9IGttYWxsb2MgKG51bSAqIHNpemVvZihjaGFyICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNxLT5idWZmZXJzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJc3EtPmJ1ZmZlcnNbaV0gPSBkbWFzb3VuZC5tYWNoLmRtYV9hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzcS0+YnVmZmVyc1tpXSkgeworCQkJd2hpbGUgKGktLSkKKwkJCQlkbWFzb3VuZC5tYWNoLmRtYV9mcmVlKHNxLT5idWZmZXJzW2ldLCBzaXplKTsKKwkJCWtmcmVlKHNxLT5idWZmZXJzKTsKKwkJCXNxLT5idWZmZXJzID0gTlVMTDsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzcV9yZWxlYXNlX2J1ZmZlcnMoc3RydWN0IHNvdW5kX3F1ZXVlICpzcSkKK3sKKwlpbnQgaTsKKworCWlmIChzcS0+YnVmZmVycykgeworCQlmb3IgKGkgPSAwOyBpIDwgc3EtPm51bUJ1ZnM7IGkrKykKKwkJCWRtYXNvdW5kLm1hY2guZG1hX2ZyZWUoc3EtPmJ1ZmZlcnNbaV0sIHNxLT5idWZTaXplKTsKKwkJa2ZyZWUoc3EtPmJ1ZmZlcnMpOworCQlzcS0+YnVmZmVycyA9IE5VTEw7CisJfQorfQorCisKK3N0YXRpYyBpbnQgc3Ffc2V0dXAoc3RydWN0IHNvdW5kX3F1ZXVlICpzcSkKK3sKKwlpbnQgKCpzZXR1cF9mdW5jKSh2b2lkKSA9IE5VTEw7CisJaW50IGhhcmRfZnJhbWUgOworCisJaWYgKHNxLT5sb2NrZWQpIHsgLyogYXJlIHdlIGFscmVhZHkgc2V0PyAtIGFuZCBub3QgY2hhbmdlYWJsZSAqLworI2lmZGVmIERFQlVHX0RNQVNPVU5ECitwcmludGsoImRtYXNvdW5kX2NvcmU6IHRyaWVkIHRvIHNxX3NldHVwIGEgbG9ja2VkIHF1ZXVlXG4iKSA7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUwgOworCX0KKwlzcS0+bG9ja2VkID0gMSA7IC8qIGRvbid0IHRoaW5rIHdlIGhhdmUgYSByYWNlIHByb2IuIGhlcmUgX2NoZWNrXyAqLworCisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIHBhcmFtZXRlcnMgYXJlIHNldCB1cAorCSAgIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkb25lIGFscmVhZHkuLi4KKwkqLworCisJZG1hc291bmQubWFjaC5pbml0KCk7CisKKwkvKiBPSy4gIElmIHRoZSB1c2VyIGhhcyBzZXQgZnJhZ21lbnQgcGFyYW1ldGVycyBleHBsaWNpdGx5LCB0aGVuIHdlCisJICAgc2hvdWxkIGxlYXZlIHRoZW0gYWxvbmUuLi4gYXMgbG9uZyBhcyB0aGV5IGFyZSB2YWxpZC4KKwkgICBJbnZhbGlkIHVzZXIgZnJhZ21lbnQgcGFyYW1zIGNhbiBvY2N1ciBpZiB3ZSBhbGxvdyB0aGUgd2hvbGUgYnVmZmVyCisJICAgdG8gYmUgdXNlZCB3aGVuIHRoZSB1c2VyIHJlcXVlc3RzIHRoZSBmcmFnbWVudHMgc2l6ZXMgKHdpdGggbm8gc29mdAorCSAgIHgtbGF0aW9uKSBhbmQgdGhlbiB0aGUgdXNlciBzdWJzZXF1ZW50bHkgc2V0cyBhIHNvZnQgeC1sYXRpb24gdGhhdAorCSAgIHJlcXVpcmVzIGluY3JlYXNlZCBpbnRlcm5hbCBidWZmZXJpbmcuCisKKwkgICBPdGh3ZXJ3aXNlIChpZiB0aGUgdXNlciBkaWQgbm90IHNldCB0aGVtKSBPU1Mgc2F5cyB0aGF0IHdlIHNob3VsZAorCSAgIHNlbGVjdCBmcmFnIHBhcmFtcyBvbiB0aGUgYmFzaXMgb2YgMC41IHMgb3V0cHV0ICYgMC4xIHMgaW5wdXQKKwkgICBsYXRlbmN5LiAoVE9ETy4gIEZvciBub3cgd2Ugd2lsbCBjb3B5IGluIHRoZSBkZWZhdWx0cy4pCisJKi8KKworCWlmIChzcS0+dXNlcl9mcmFncyA8PSAwKSB7CisJCXNxLT5tYXhfY291bnQgPSBzcS0+bnVtQnVmcyA7CisJCXNxLT5tYXhfYWN0aXZlID0gc3EtPm51bUJ1ZnMgOworCQlzcS0+YmxvY2tfc2l6ZSA9IHNxLT5idWZTaXplOworCQkvKiBzZXQgdXAgdGhlIHVzZXIgaW5mbyAqLworCQlzcS0+dXNlcl9mcmFncyA9IHNxLT5udW1CdWZzIDsKKwkJc3EtPnVzZXJfZnJhZ19zaXplID0gc3EtPmJ1ZlNpemUgOworCQlzcS0+dXNlcl9mcmFnX3NpemUgKj0KKwkJCShkbWFzb3VuZC5zb2Z0LnNpemUgKiAoZG1hc291bmQuc29mdC5zdGVyZW8rMSkgKSA7CisJCXNxLT51c2VyX2ZyYWdfc2l6ZSAvPQorCQkJKGRtYXNvdW5kLmhhcmQuc2l6ZSAqIChkbWFzb3VuZC5oYXJkLnN0ZXJlbysxKSApIDsKKwl9IGVsc2UgeworCQkvKiB3b3JrIG91dCByZXF1ZXN0ZWQgYmxvY2sgc2l6ZSAqLworCQlzcS0+YmxvY2tfc2l6ZSA9IHNxLT51c2VyX2ZyYWdfc2l6ZSA7CisJCXNxLT5ibG9ja19zaXplICo9CisJCQkoZG1hc291bmQuaGFyZC5zaXplICogKGRtYXNvdW5kLmhhcmQuc3RlcmVvKzEpICkgOworCQlzcS0+YmxvY2tfc2l6ZSAvPQorCQkJKGRtYXNvdW5kLnNvZnQuc2l6ZSAqIChkbWFzb3VuZC5zb2Z0LnN0ZXJlbysxKSApIDsKKwkJLyogdGhlIHVzZXIgd2FudHMgdG8gd3JpdGUgZnJhZy1zaXplIGNodW5rcyAqLworCQlzcS0+YmxvY2tfc2l6ZSAqPSBkbWFzb3VuZC5oYXJkLnNwZWVkIDsKKwkJc3EtPmJsb2NrX3NpemUgLz0gZG1hc291bmQuc29mdC5zcGVlZCA7CisJCS8qIHRoaXMgb25seSB3b3JrcyBmb3Igc2l6ZSB2YWx1ZXMgd2hpY2ggYXJlIHBvd2VycyBvZiAyICovCisJCWhhcmRfZnJhbWUgPQorCQkJKGRtYXNvdW5kLmhhcmQuc2l6ZSAqIChkbWFzb3VuZC5oYXJkLnN0ZXJlbysxKSkvOCA7CisJCXNxLT5ibG9ja19zaXplICs9ICAoaGFyZF9mcmFtZSAtIDEpIDsKKwkJc3EtPmJsb2NrX3NpemUgJj0gfihoYXJkX2ZyYW1lIC0gMSkgOyAvKiBtYWtlIHN1cmUgd2UgYXJlIGFsaWduZWQgKi8KKwkJLyogbGV0J3MganVzdCBjaGVjayBmb3Igb2J2aW91cyBtaXN0YWtlcyAqLworCQlpZiAoIHNxLT5ibG9ja19zaXplIDw9IDAgfHwgc3EtPmJsb2NrX3NpemUgPiBzcS0+YnVmU2l6ZSkgeworI2lmZGVmIERFQlVHX0RNQVNPVU5ECitwcmludGsoImRtYXNvdW5kX2NvcmU6IGludmFsaWQgZnJhZyBzaXplICh1c2VyIHNldCAlZClcbiIsIHNxLT51c2VyX2ZyYWdfc2l6ZSkgOworI2VuZGlmCisJCQlzcS0+YmxvY2tfc2l6ZSA9IHNxLT5idWZTaXplIDsKKwkJfQorCQlpZiAoIHNxLT51c2VyX2ZyYWdzIDw9IHNxLT5udW1CdWZzICkgeworCQkJc3EtPm1heF9jb3VudCA9IHNxLT51c2VyX2ZyYWdzIDsKKwkJCS8qIGlmIHVzZXIgaGFzIHNldCBtYXhfYWN0aXZlIC0gdGhlbiB1c2UgaXQgKi8KKwkJCXNxLT5tYXhfYWN0aXZlID0gKHNxLT5tYXhfYWN0aXZlIDw9IHNxLT5tYXhfY291bnQpID8KKwkJCQlzcS0+bWF4X2FjdGl2ZSA6IHNxLT5tYXhfY291bnQgOworCQl9IGVsc2UgeworI2lmZGVmIERFQlVHX0RNQVNPVU5ECitwcmludGsoImRtYXNvdW5kX2NvcmU6IGludmFsaWQgZnJhZyBjb3VudCAodXNlciBzZXQgJWQpXG4iLCBzcS0+dXNlcl9mcmFncykgOworI2VuZGlmCisJCQlzcS0+bWF4X2NvdW50ID0KKwkJCXNxLT5tYXhfYWN0aXZlID0gc3EtPm51bUJ1ZnMgOworCQl9CisJfQorCXNxLT5mcm9udCA9IHNxLT5jb3VudCA9IHNxLT5yZWFyX3NpemUgPSAwOworCXNxLT5zeW5jaW5nID0gMDsKKwlzcS0+YWN0aXZlID0gMDsKKworCWlmIChzcSA9PSAmd3JpdGVfc3EpIHsKKwkgICAgc3EtPnJlYXIgPSAtMTsKKwkgICAgc2V0dXBfZnVuYyA9IGRtYXNvdW5kLm1hY2gud3JpdGVfc3Ffc2V0dXA7CisJfQorI2lmZGVmIEhBU19SRUNPUkQKKwllbHNlIHsKKwkgICAgc3EtPnJlYXIgPSAwOworCSAgICBzZXR1cF9mdW5jID0gZG1hc291bmQubWFjaC5yZWFkX3NxX3NldHVwOworCX0KKyNlbmRpZgorCWlmIChzZXR1cF9mdW5jKQorCSAgICByZXR1cm4gc2V0dXBfZnVuYygpOworCXJldHVybiAwIDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNxX3BsYXkodm9pZCkKK3sKKwlkbWFzb3VuZC5tYWNoLnBsYXkoKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3Ffd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIHNpemVfdCB1TGVmdCwKKwkJCWxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IHVXcml0dGVuID0gMDsKKwl1X2NoYXIgKmRlc3Q7CisJc3NpemVfdCB1VXNlZCA9IDAsIGJVc2VkLCBiTGVmdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzIDsKKworCS8qICsrVGVTY2hlOiBJcyBzb21ldGhpbmcgbGlrZSB0aGlzIG5lY2Vzc2FyeT8KKwkgKiBIZXksIHRoYXQncyBhbiBob25lc3QgcXVlc3Rpb24hIE9yIGRvZXMgYW55IG90aGVyIHBhcnQgb2YgdGhlCisJICogZmlsZXN5c3RlbSBhbHJlYWR5IGNoZWNrcyB0aGlzIHNpdHVhdGlvbj8gSSByZWFsbHkgZG9uJ3Qga25vdy4KKwkgKi8KKwlpZiAodUxlZnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBpbXBsZW1lbnQgYW55IGNoYW5nZXMgd2UgaGF2ZSBtYWRlIHRvIHRoZSBzb2Z0L2hhcmQgcGFyYW1zLgorCSAgIHRoaXMgaXMgbm90IHNhdGlzZmFjdG9yeSByZWFsbHksIGFsbCB3ZSBoYXZlIGRvbmUgdXAgdG8gbm93IGlzIHRvCisJICAgc2F5IHdoYXQgd2Ugd291bGQgbGlrZSAtIHRoZXJlIGhhc24ndCBiZWVuIGFueSByZWFsIGNoZWNraW5nIG9mIGNhcGFiaWxpdHkKKwkqLworCisJaWYgKHNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPT0gMCkgeworCQlkbWFzb3VuZC5tYWNoLmluaXQoKSA7CisJCXNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPSAxIDsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIHNxIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGRvbmUuIFRoaXMgbWF5IHNlZW0gYSBkdW1iIHBsYWNlCisJICAgdG8gZG8gaXQgLSBidXQgaXQgaXMgd2hhdCBPU1MgcmVxdWlyZXMuICBJdCBtZWFucyB0aGF0IHdyaXRlKCkgY2FuCisJICAgcmV0dXJuIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9ycy4gIFRvIGF2b2lkIHRoaXMgcG9zc2liaWxpdHkgdXNlIHRoZQorCSAgIEdFVEJMS1NJWkUgb3IgR0VUT1NQQUNFIGlvY3RscyAoYWZ0ZXIgeW91J3ZlIGZpZGRsZWQgd2l0aCBhbGwgdGhlCisJICAgcGFyYW1zIHlvdSB3YW50IHRvIGNoYW5nZSkgLSB0aGVzZSBpb2N0bHMgYWxzbyBmb3JjZSB0aGUgc2V0dXAuCisJKi8KKworCWlmICh3cml0ZV9zcS5sb2NrZWQgPT0gMCkgeworCQlpZiAoKHVXcml0dGVuID0gc3Ffc2V0dXAoJndyaXRlX3NxKSkgPCAwKSByZXR1cm4gdVdyaXR0ZW4gOworCQl1V3JpdHRlbiA9IDAgOworCX0KKworLyogRklYTUU6IEkgdGhpbmsgdGhhdCB0aGlzIG1heSBiZSB0aGUgd3JvbmcgYmVoYXZpb3VyIHdoZW4gd2UgZ2V0IHN0cmFwcGVkCisJZm9yIHRpbWUgYW5kIHRoZSBjcHUgaXMgY2xvc2UgdG8gYmVpbmcgKG9yIGFjdHVhbGx5KSBiZWhpbmQgaW4gc2VuZGluZyBkYXRhLgorCS0gYmVjYXVzZSB3ZSd2ZSBsb3N0IHRoZSB0aW1lIHRoYXQgdGhlIE4gc2FtcGxlcywgYWxyZWFkeSBpbiB0aGUgYnVmZmVyLAorCXdvdWxkIGhhdmUgZ2l2ZW4gdXMgdG8gZ2V0IGhlcmUgd2l0aCB0aGUgbmV4dCBsb3QgZnJvbSB0aGUgdXNlci4KKyovCisJLyogVGhlIGludGVycnVwdCBkb2Vzbid0IHN0YXJ0IHRvIHBsYXkgdGhlIGxhc3QsIGluY29tcGxldGUgZnJhbWUuCisJICogVGh1cyB3ZSBjYW4gYXBwZW5kIHRvIGl0IHdpdGhvdXQgZGlzYWJsaW5nIHRoZSBpbnRlcnJ1cHRzISAoTm90ZQorCSAqIGFsc28gdGhhdCB3cml0ZV9zcS5yZWFyIGlzbid0IGFmZmVjdGVkIGJ5IHRoZSBpbnRlcnJ1cHQuKQorCSAqLworCisJLyogYXMgb2YgMS42IHRoaXMgYmVoYXZpb3VyIGNoYW5nZXMgaWYgU05EQ1RMX0RTUF9QT1NUIGhhcyBiZWVuIGlzc3VlZDoKKwkgICB0aGlzIHdpbGwgbWltaWMgdGhlIGJlaGF2aW91ciBvZiBzeW5jaW5nIGFuZCBhbGxvdyB0aGUgc3FfcGxheSgpIHRvCisJICAgcXVldWUgYSBwYXJ0aWFsIGZyYWdtZW50LiAgU2luY2Ugc3FfcGxheSgpIG1heS93aWxsIGJlIGNhbGxlZCBmcm9tCisJICAgdGhlIElSUSBoYW5kbGVyIC0gYXQgbGVhc3Qgb24gUG1hYyB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBpdC4KKwkgICBUaGUgc3RyYXRlZ3kgLSBwb3NzaWJseSBub3Qgb3B0aW11bSAtIGlzIHRvIGtpbGwgX1BPU1Qgc3RhdHVzIGlmIHdlCisJICAgZ2V0IGhlcmUuICBUaGlzIHNlZW1zLCBhdCBsZWFzdCwgcmVhc29uYWJsZSAtIGluIHRoZSBzZW5zZSB0aGF0IFBPU1QKKwkgICBpcyBzdXBwb3NlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIG1pZ2h0IG5vdCB3cml0ZSBiZWZvcmUgdGhlIHF1ZXVlCisJICAgaXMgZHJhaW5lZCAtIGFuZCBpZiB3ZSBnZXQgaGVyZSBpbiB0aW1lIHRoZW4gaXQgZG9lcyBub3QgYXBwbHkuCisJKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJd3JpdGVfc3Euc3luY2luZyAmPSB+MiA7IC8qIHRha2Ugb3V0IFBPU1Qgc3RhdHVzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCisJaWYgKHdyaXRlX3NxLmNvdW50ID4gMCAmJgorCSAgICAoYkxlZnQgPSB3cml0ZV9zcS5ibG9ja19zaXplLXdyaXRlX3NxLnJlYXJfc2l6ZSkgPiAwKSB7CisJCWRlc3QgPSB3cml0ZV9zcS5idWZmZXJzW3dyaXRlX3NxLnJlYXJdOworCQliVXNlZCA9IHdyaXRlX3NxLnJlYXJfc2l6ZTsKKwkJdVVzZWQgPSBzb3VuZF9jb3B5X3RyYW5zbGF0ZShkbWFzb3VuZC50cmFuc193cml0ZSwgc3JjLCB1TGVmdCwKKwkJCQkJICAgICBkZXN0LCAmYlVzZWQsIGJMZWZ0KTsKKwkJaWYgKHVVc2VkIDw9IDApCisJCQlyZXR1cm4gdVVzZWQ7CisJCXNyYyArPSB1VXNlZDsKKwkJdVdyaXR0ZW4gKz0gdVVzZWQ7CisJCXVMZWZ0ID0gKHVVc2VkIDw9IHVMZWZ0KSA/ICh1TGVmdCAtIHVVc2VkKSA6IDAgOyAvKiBwYXJhbm9pYSAqLworCQl3cml0ZV9zcS5yZWFyX3NpemUgPSBiVXNlZDsKKwl9CisKKwl3aGlsZSAodUxlZnQpIHsKKwkJd2hpbGUgKHdyaXRlX3NxLmNvdW50ID49IHdyaXRlX3NxLm1heF9hY3RpdmUpIHsKKwkJCXNxX3BsYXkoKTsKKwkJCWlmICh3cml0ZV9zcS5vcGVuX21vZGUgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiB1V3JpdHRlbiA+IDAgPyB1V3JpdHRlbiA6IC1FQUdBSU47CisJCQlTTEVFUCh3cml0ZV9zcS5hY3Rpb25fcXVldWUpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiB1V3JpdHRlbiA+IDAgPyB1V3JpdHRlbiA6IC1FSU5UUjsKKwkJfQorCisJCS8qIEhlcmUsIHdlIGNhbiBhdm9pZCBkaXNhYmxpbmcgdGhlIGludGVycnVwdCBieSBmaXJzdAorCQkgKiBjb3B5aW5nIGFuZCB0cmFuc2xhdGluZyB0aGUgZGF0YSwgYW5kIHRoZW4gdXBkYXRpbmcKKwkJICogdGhlIHdyaXRlX3NxIHZhcmlhYmxlcy4gVW50aWwgdGhpcyBpcyBkb25lLCB0aGUgaW50ZXJydXB0CisJCSAqIHdvbid0IHNlZSB0aGUgbmV3IGZyYW1lIGFuZCB3ZSBjYW4gd29yayBvbiBpdAorCQkgKiB1bmRpc3R1cmJlZC4KKwkJICovCisKKwkJZGVzdCA9IHdyaXRlX3NxLmJ1ZmZlcnNbKHdyaXRlX3NxLnJlYXIrMSkgJSB3cml0ZV9zcS5tYXhfY291bnRdOworCQliVXNlZCA9IDA7CisJCWJMZWZ0ID0gd3JpdGVfc3EuYmxvY2tfc2l6ZTsKKwkJdVVzZWQgPSBzb3VuZF9jb3B5X3RyYW5zbGF0ZShkbWFzb3VuZC50cmFuc193cml0ZSwgc3JjLCB1TGVmdCwKKwkJCQkJICAgICBkZXN0LCAmYlVzZWQsIGJMZWZ0KTsKKwkJaWYgKHVVc2VkIDw9IDApCisJCQlicmVhazsKKwkJc3JjICs9IHVVc2VkOworCQl1V3JpdHRlbiArPSB1VXNlZDsKKwkJdUxlZnQgPSAodVVzZWQgPD0gdUxlZnQpID8gKHVMZWZ0IC0gdVVzZWQpIDogMCA7IC8qIHBhcmFub2lhICovCisJCWlmIChiVXNlZCkgeworCQkJd3JpdGVfc3EucmVhciA9ICh3cml0ZV9zcS5yZWFyKzEpICUgd3JpdGVfc3EubWF4X2NvdW50OworCQkJd3JpdGVfc3EucmVhcl9zaXplID0gYlVzZWQ7CisJCQl3cml0ZV9zcS5jb3VudCsrOworCQl9CisJfSAvKiB1VXNlZCBtYXkgaGF2ZSBiZWVuIDAgKi8KKworCXNxX3BsYXkoKTsKKworCXJldHVybiB1VXNlZCA8IDA/IHVVc2VkOiB1V3JpdHRlbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzcV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCWludCByZXRWYWw7CisJCisJaWYgKHdyaXRlX3NxLmxvY2tlZCA9PSAwKSB7CisJCWlmICgocmV0VmFsID0gc3Ffc2V0dXAoJndyaXRlX3NxKSkgPCAwKQorCQkJcmV0dXJuIHJldFZhbDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSApCisJCXBvbGxfd2FpdChmaWxlLCAmd3JpdGVfc3EuYWN0aW9uX3F1ZXVlLCB3YWl0KTsKKyNpZmRlZiBIQVNfUkVDT1JECisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXBvbGxfd2FpdChmaWxlLCAmcmVhZF9zcS5hY3Rpb25fcXVldWUsIHdhaXQpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlpZiAocmVhZF9zcS5ibG9ja19zaXplIC0gcmVhZF9zcS5yZWFyX3NpemUgPiAwKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworI2VuZGlmCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlpZiAod3JpdGVfc3EuY291bnQgPCB3cml0ZV9zcS5tYXhfYWN0aXZlIHx8IHdyaXRlX3NxLmJsb2NrX3NpemUgLSB3cml0ZV9zcS5yZWFyX3NpemUgPiAwKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwlyZXR1cm4gbWFzazsKKworfQorCisjaWZkZWYgSEFTX1JFQ09SRAorICAgIC8qCisgICAgICogIEhlcmUgaXMgaG93IHRoZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHJlYWRpbmcuCisgICAgICogIFRoZSB2YWx1ZSAnYWN0aXZlJyBzaW1wbHkgaW5kaWNhdGVzIHRoZSBETUEgaXMgcnVubmluZy4gIFRoaXMgaXMgZG9uZQorICAgICAqICBzbyB0aGUgZHJpdmVyIHNlbWFudGljcyBhcmUgRE1BIHN0YXJ0cyB3aGVuIHRoZSBmaXJzdCByZWFkIGlzIHBvc3RlZC4KKyAgICAgKiAgVGhlIHZhbHVlICdmcm9udCcgaW5kaWNhdGVzIHRoZSBidWZmZXIgd2Ugc2hvdWxkIG5leHQgc2VuZCB0byB0aGUgdXNlci4KKyAgICAgKiAgVGhlIHZhbHVlICdyZWFyJyBpbmRpY2F0ZXMgdGhlIGJ1ZmZlciB0aGUgRE1BIGlzIGN1cnJlbnRseSBmaWxsaW5nLgorICAgICAqICBXaGVuICdmcm9udCcgPT0gJ3JlYXInIHRoZSBidWZmZXIgInJpbmciIGlzIGVtcHR5ICh3ZSBhbHdheXMgaGF2ZSBhbgorICAgICAqICBlbXB0eSBhdmFpbGFibGUpLiAgVGhlICdyZWFyX3NpemUnIGlzIHVzZWQgdG8gdHJhY2sgcGFydGlhbCBvZmZzZXRzCisgICAgICogIGludG8gdGhlIGJ1ZmZlciB3ZSBhcmUgY3VycmVudGx5IHJldHVybmluZyB0byB0aGUgdXNlci4KKworICAgICAqICBUaGlzIGxldmVsICg+IFsxLjVdKSBkb2Vzbid0IGNhcmUgd2hhdCBzdHJhdGVneSB0aGUgTEwgZHJpdmVyIHVzZXMgd2l0aAorICAgICAqICBETUEgb24gb3Zlci1ydW4uICBJdCBjYW4gbGVhdmUgaXQgcnVubmluZyAoYW5kIGtlZXAgYWN0aXZlID09IDEpIG9yIGl0CisgICAgICogIGNhbiBraWxsIGl0IGFuZCBzZXQgYWN0aXZlID09IDAgaW4gd2hpY2ggY2FzZSB0aGlzIHJvdXRpbmUgd2lsbCBzcG90CisgICAgICogIGl0IGFuZCByZXN0YXJ0IHRoZSBETUEuCisgICAgICovCisKK3N0YXRpYyBzc2l6ZV90IHNxX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkc3QsIHNpemVfdCB1TGVmdCwKKwkJICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKworCXNzaXplX3QJdVJlYWQsIGJMZWZ0LCBiVXNlZCwgdVVzZWQ7CisKKwlpZiAodUxlZnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBjYXRlciBmb3IgdGhlIGNvbXBhdGliaWxpdHkgbW9kZSAtIHJlY29yZCBjb21waWxlZCBpbiBidXQgbm8gTEwgKi8KKwlpZiAoZG1hc291bmQubWFjaC5yZWNvcmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUwgOworCisJLyogc2VlIGNvbW1lbnQgaW4gc3Ffd3JpdGUoKQorCSovCisKKwlpZiggc2hhcmVkX3Jlc291cmNlc19pbml0aWFsaXNlZCA9PSAwKSB7CisJCWRtYXNvdW5kLm1hY2guaW5pdCgpIDsKKwkJc2hhcmVkX3Jlc291cmNlc19pbml0aWFsaXNlZCA9IDEgOworCX0KKworCS8qIHNldCB1cCB0aGUgc3EgaWYgaXQgaXMgbm90IGFscmVhZHkgZG9uZS4gc2VlIGNvbW1lbnRzIGluIHNxX3dyaXRlKCkuCisJKi8KKworCWlmIChyZWFkX3NxLmxvY2tlZCA9PSAwKSB7CisJCWlmICgodVJlYWQgPSBzcV9zZXR1cCgmcmVhZF9zcSkpIDwgMCkKKwkJCXJldHVybiB1UmVhZCA7CisJfQorCisJdVJlYWQgPSAwOworCisJLyogTW92ZSB3aGF0IHRoZSB1c2VyIHJlcXVlc3RzLCBkZXBlbmRpbmcgdXBvbiBvdGhlciBvcHRpb25zLgorCSovCisJd2hpbGUgKHVMZWZ0ID4gMCkgeworCisJCS8qIHdlIGhhcHBlbmVkIHRvIGdldCBiZWhpbmQgYW5kIHRoZSBMTCBkcml2ZXIga2lsbGVkIERNQQorCQkgICB0aGVuIHdlIHNob3VsZCBzZXQgaXQgZ29pbmcgYWdhaW4uICBUaGlzIGFsc28gc2V0cyBpdAorCQkgICBnb2luZyB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLgorCQkqLworCQlpZiAoICFyZWFkX3NxLmFjdGl2ZSApCisJCQlkbWFzb3VuZC5tYWNoLnJlY29yZCgpOworCisJCS8qIFdoZW4gZnJvbnQgPT0gcmVhciwgdGhlIERNQSBpcyBub3QgZG9uZSB5ZXQuCisJCSovCisJCXdoaWxlIChyZWFkX3NxLmZyb250ID09IHJlYWRfc3EucmVhcikgeworCQkJaWYgKHJlYWRfc3Eub3Blbl9tb2RlICYgT19OT05CTE9DSykgeworCQkJICAgICAgIHJldHVybiB1UmVhZCA+IDAgPyB1UmVhZCA6IC1FQUdBSU47CisJCQl9CisJCQlTTEVFUChyZWFkX3NxLmFjdGlvbl9xdWV1ZSk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIHVSZWFkID4gMCA/IHVSZWFkIDogLUVJTlRSOworCQl9CisKKwkJLyogVGhlIGFtb3VudCB3ZSBtb3ZlIGlzIGVpdGhlciB3aGF0IGlzIGxlZnQgaW4gdGhlCisJCSAqIGN1cnJlbnQgYnVmZmVyIG9yIHdoYXQgdGhlIHVzZXIgd2FudHMuCisJCSAqLworCQliTGVmdCA9IHJlYWRfc3EuYmxvY2tfc2l6ZSAtIHJlYWRfc3EucmVhcl9zaXplOworCQliVXNlZCA9IHJlYWRfc3EucmVhcl9zaXplOworCQl1VXNlZCA9IHNvdW5kX2NvcHlfdHJhbnNsYXRlKGRtYXNvdW5kLnRyYW5zX3JlYWQsIGRzdCwgdUxlZnQsCisJCQkJCSAgICAgcmVhZF9zcS5idWZmZXJzW3JlYWRfc3EuZnJvbnRdLAorCQkJCQkgICAgICZiVXNlZCwgYkxlZnQpOworCQlpZiAodVVzZWQgPD0gMCkKKwkJCXJldHVybiB1VXNlZDsKKwkJZHN0ICs9IHVVc2VkOworCQl1UmVhZCArPSB1VXNlZDsKKwkJdUxlZnQgLT0gdVVzZWQ7CisJCXJlYWRfc3EucmVhcl9zaXplICs9IGJVc2VkOworCQlpZiAocmVhZF9zcS5yZWFyX3NpemUgPj0gcmVhZF9zcS5ibG9ja19zaXplKSB7CisJCQlyZWFkX3NxLnJlYXJfc2l6ZSA9IDA7CisJCQlyZWFkX3NxLmZyb250Kys7CisJCQlpZiAocmVhZF9zcS5mcm9udCA+PSByZWFkX3NxLm1heF9hY3RpdmUpCisJCQkJcmVhZF9zcS5mcm9udCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIHVSZWFkOworfQorI2VuZGlmIC8qIEhBU19SRUNPUkQgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNxX2luaXRfd2FpdHF1ZXVlKHN0cnVjdCBzb3VuZF9xdWV1ZSAqc3EpCit7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3EtPmFjdGlvbl9xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3EtPm9wZW5fcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNxLT5zeW5jX3F1ZXVlKTsKKwlzcS0+YnVzeSA9IDA7Cit9CisKKyNpZiAwIC8qIGJsb2NraW5nIG9wZW4oKSAqLworc3RhdGljIGlubGluZSB2b2lkIHNxX3dha2VfdXAoc3RydWN0IHNvdW5kX3F1ZXVlICpzcSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICBtb2RlX3QgbW9kZSkKK3sKKwlpZiAoZmlsZS0+Zl9tb2RlICYgbW9kZSkgeworCQlzcS0+YnVzeSA9IDA7IC8qIENIRUNLOiBJUyBUSElTIE9LPz8/ICovCisJCVdBS0VfVVAoc3EtPm9wZW5fcXVldWUpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNxX29wZW4yKHN0cnVjdCBzb3VuZF9xdWV1ZSAqc3EsIHN0cnVjdCBmaWxlICpmaWxlLCBtb2RlX3QgbW9kZSwKKwkJICAgIGludCBudW1idWZzLCBpbnQgYnVmc2l6ZSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIG1vZGUpIHsKKwkJaWYgKHNxLT5idXN5KSB7CisjaWYgMCAvKiBibG9ja2luZyBvcGVuKCkgKi8KKwkJCXJjID0gLUVCVVNZOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiByYzsKKwkJCXJjID0gLUVJTlRSOworCQkJd2hpbGUgKHNxLT5idXN5KSB7CisJCQkJU0xFRVAoc3EtPm9wZW5fcXVldWUpOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJcmMgPSAwOworI2Vsc2UKKwkJCS8qIE9TUyBtYW51YWwgc2F5cyB3ZSB3aWxsIHJldHVybiBFQlVTWSByZWdhcmRsZXNzCisJCQkgICBvZiBPX05PQkxPQ0suCisJCQkqLworCQkJcmV0dXJuIC1FQlVTWSA7CisjZW5kaWYKKwkJfQorCQlzcS0+YnVzeSA9IDE7IC8qIExldCdzIHBsYXkgc3BvdC10aGUtcmFjZS1jb25kaXRpb24gKi8KKworCQkvKiBhbGxvY2F0ZSB0aGUgZGVmYXVsdCBudW1iZXIgJiBzaXplIG9mIGJ1ZmZlcnMuCisJCSAgIChpLmUuIHNwZWNpZmllZCBpbiBfc2V0dXAoKSBvciBhcyBtb2R1bGUgcGFyYW1zKQorCQkgICBjYW4ndCBiZSBjaGFuZ2VkIGF0IHRoZSBtb21lbnQgLSBidXQgX2NvdWxkXyBiZSBwZXJoYXBzCisJCSAgIGluIHRoZSBzZXRmcmFnbWVudHMgaW9jdGwuCisJCSovCisJCWlmICgoIHJjID0gc3FfYWxsb2NhdGVfYnVmZmVycyhzcSwgbnVtYnVmcywgYnVmc2l6ZSkpKSB7CisjaWYgMCAvKiBibG9ja2luZyBvcGVuKCkgKi8KKwkJCXNxX3dha2VfdXAoc3EsIGZpbGUsIG1vZGUpOworI2Vsc2UKKwkJCXNxLT5idXN5ID0gMCA7CisjZW5kaWYKKwkJCXJldHVybiByYzsKKwkJfQorCisJCXNxLT5vcGVuX21vZGUgPSBmaWxlLT5mX21vZGU7CisJfQorCXJldHVybiByYzsKK30KKworI2RlZmluZSB3cml0ZV9zcV9pbml0X3dhaXRxdWV1ZSgpCXNxX2luaXRfd2FpdHF1ZXVlKCZ3cml0ZV9zcSkKKyNpZiAwIC8qIGJsb2NraW5nIG9wZW4oKSAqLworI2RlZmluZSB3cml0ZV9zcV93YWtlX3VwKGZpbGUpCQlzcV93YWtlX3VwKCZ3cml0ZV9zcSwgZmlsZSwgRk1PREVfV1JJVEUpCisjZW5kaWYKKyNkZWZpbmUgd3JpdGVfc3FfcmVsZWFzZV9idWZmZXJzKCkJc3FfcmVsZWFzZV9idWZmZXJzKCZ3cml0ZV9zcSkKKyNkZWZpbmUgd3JpdGVfc3Ffb3BlbihmaWxlKQlcCisJc3Ffb3BlbjIoJndyaXRlX3NxLCBmaWxlLCBGTU9ERV9XUklURSwgbnVtV3JpdGVCdWZzLCB3cml0ZUJ1ZlNpemUgKQorCisjaWZkZWYgSEFTX1JFQ09SRAorI2RlZmluZSByZWFkX3NxX2luaXRfd2FpdHF1ZXVlKCkJc3FfaW5pdF93YWl0cXVldWUoJnJlYWRfc3EpCisjaWYgMCAvKiBibG9ja2luZyBvcGVuKCkgKi8KKyNkZWZpbmUgcmVhZF9zcV93YWtlX3VwKGZpbGUpCQlzcV93YWtlX3VwKCZyZWFkX3NxLCBmaWxlLCBGTU9ERV9SRUFEKQorI2VuZGlmCisjZGVmaW5lIHJlYWRfc3FfcmVsZWFzZV9idWZmZXJzKCkJc3FfcmVsZWFzZV9idWZmZXJzKCZyZWFkX3NxKQorI2RlZmluZSByZWFkX3NxX29wZW4oZmlsZSkJXAorCXNxX29wZW4yKCZyZWFkX3NxLCBmaWxlLCBGTU9ERV9SRUFELCBudW1SZWFkQnVmcywgcmVhZEJ1ZlNpemUgKQorI2Vsc2UKKyNkZWZpbmUgcmVhZF9zcV9pbml0X3dhaXRxdWV1ZSgpCWRvIHt9IHdoaWxlICgwKQorI2lmIDAgLyogYmxvY2tpbmcgb3BlbigpICovCisjZGVmaW5lIHJlYWRfc3Ffd2FrZV91cChmaWxlKQkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKyNkZWZpbmUgcmVhZF9zcV9yZWxlYXNlX2J1ZmZlcnMoKQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgc3FfcmVzZXRfaW5wdXQoKQkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIGludCBzcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByYzsKKworCWlmICghdHJ5X21vZHVsZV9nZXQoZG1hc291bmQubWFjaC5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCisJcmMgPSB3cml0ZV9zcV9vcGVuKGZpbGUpOyAvKiBjaGVja3MgdGhlIGZfbW9kZSAqLworCWlmIChyYykKKwkJZ290byBvdXQ7CisjaWZkZWYgSEFTX1JFQ09SRAorCWlmIChkbWFzb3VuZC5tYWNoLnJlY29yZCkgeworCQlyYyA9IHJlYWRfc3Ffb3BlbihmaWxlKTsgLyogY2hlY2tzIHRoZSBmX21vZGUgKi8KKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsgLyogbm8gcmVjb3JkIGZ1bmN0aW9uIGluc3RhbGxlZDsgaW4gY29tcGF0IG1vZGUgKi8KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCS8qIFRPRE86IGlmIE9fUkRXUiwgcmVsZWFzZSBhbnkgcmVzb3VyY2VzIGdyYWJiZWQgYnkgd3JpdGUgcGFydCAqLworCQkJcmMgPSAtRU5YSU87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKyNlbHNlIC8qICFIQVNfUkVDT1JEICovCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJLyogVE9ETzogaWYgT19SRFdSLCByZWxlYXNlIGFueSByZXNvdXJjZXMgZ3JhYmJlZCBieSB3cml0ZSBwYXJ0ICovCisJCXJjID0gLUVOWElPIDsgLyogSSB0aGluayB0aGlzIGlzIHdoYXQgaXMgcmVxdWlyZWQgYnkgb3BlbigyKSAqLworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYgLyogSEFTX1JFQ09SRCAqLworCisJaWYgKGRtYXNvdW5kLm1hY2guc3Ffb3BlbikKKwkgICAgZG1hc291bmQubWFjaC5zcV9vcGVuKGZpbGUtPmZfbW9kZSk7CisKKwkvKiBDSEVDSyB3aGV0aGVyIHRoaXMgaXMgc2Vuc2libGUgLSBpbiB0aGUgY2FzZSB0aGF0IGRzcDAgY291bGQgYmUgb3BlbmVkCisJICBPX1JET05MWSBhbmQgZHNwMSBjb3VsZCBiZSBvcGVuZWQgT19XUk9OTFkKKwkqLworCisJZG1hc291bmQubWluRGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CisKKwkvKiBPSy4gLSB3ZSBzaG91bGQgbWFrZSBzb21lIGF0dGVtcHQgYXQgY29uc2lzdGVuY3kuIEF0IGxlYXN0IHRoZSBIJ3dhcmUKKwkgICBvcHRpb25zIHNob3VsZCBiZSBzZXQgd2l0aCBhIHZhbGlkIG1vZGUuICBXZSB3aWxsIG1ha2UgaXQgdGhhdCB0aGUgTEwKKwkgICBkcml2ZXIgbXVzdCBzdXBwbHkgZGVmYXVsdHMgZm9yIGhhcmQgJiBzb2Z0IHBhcmFtcy4KKwkqLworCisJaWYgKHNoYXJlZF9yZXNvdXJjZV9vd25lciA9PSAwKSB7CisJCS8qIHlvdSBjYW4gbWFrZSB0aGlzIEFGTVRfVTgvbW9uby84SyBpZiB5b3Ugd2FudCB0byBtaW1pYyBvbGQKKwkJICAgT1NTIGJlaGF2aW91ciAtIHdoaWxlIHdlIHN0aWxsIGhhdmUgc29mdCB0cmFuc2xhdGlvbnMgOy0pICovCisJCWRtYXNvdW5kLnNvZnQgPSBkbWFzb3VuZC5tYWNoLmRlZmF1bHRfc29mdCA7CisJCWRtYXNvdW5kLmRzcCA9IGRtYXNvdW5kLm1hY2guZGVmYXVsdF9zb2Z0IDsKKwkJZG1hc291bmQuaGFyZCA9IGRtYXNvdW5kLm1hY2guZGVmYXVsdF9oYXJkIDsKKwl9CisKKyNpZm5kZWYgRE1BU09VTkRfU1RSSUNUX09TU19DT01QTElBTkNFCisJLyogbm9uZSBvZiB0aGUgY3VycmVudCBMTCBkcml2ZXJzIGNhbiBhY3R1YWxseSBkbyB0aGlzICJuYXRpdmUiIGF0IHRoZSBtb21lbnQKKwkgICBPU1MgZG9lcyBub3QgcmVhbGx5IHJlcXVpcmUgdXMgdG8gc3VwcGx5IC9kZXYvYXVkaW8gaWYgd2UgY2FuJ3QgZG8gaXQuCisJKi8KKwlpZiAoZG1hc291bmQubWluRGV2ID09IFNORF9ERVZfQVVESU8pIHsKKwkJc291bmRfc2V0X3NwZWVkKDgwMDApOworCQlzb3VuZF9zZXRfc3RlcmVvKDApOworCQlzb3VuZF9zZXRfZm9ybWF0KEFGTVRfTVVfTEFXKTsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworIG91dDoKKwltb2R1bGVfcHV0KGRtYXNvdW5kLm1hY2gub3duZXIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgc3FfcmVzZXRfb3V0cHV0KHZvaWQpCit7CisJc291bmRfc2lsZW5jZSgpOyAvKiB0aGlzIF9tdXN0XyBzdG9wIERNQSwgd2UgbWlnaHQgYmUgYWJvdXQgdG8gbG9zZSB0aGUgYnVmZmVycyAqLworCXdyaXRlX3NxLmFjdGl2ZSA9IDA7CisJd3JpdGVfc3EuY291bnQgPSAwOworCXdyaXRlX3NxLnJlYXJfc2l6ZSA9IDA7CisJLyogd3JpdGVfc3EuZnJvbnQgPSAod3JpdGVfc3EucmVhcisxKSAlIHdyaXRlX3NxLm1heF9jb3VudDsqLworCXdyaXRlX3NxLmZyb250ID0gMCA7CisJd3JpdGVfc3EucmVhciA9IC0xIDsgLyogc2FtZSBhcyBmb3Igc2V0LXVwICovCisKKwkvKiBPSyAtIHdlIGNhbiB1bmxvY2sgdGhlIHBhcmFtZXRlcnMgYW5kIGZyYWdtZW50IHNldHRpbmdzICovCisJd3JpdGVfc3EubG9ja2VkID0gMCA7CisJd3JpdGVfc3EudXNlcl9mcmFncyA9IDAgOworCXdyaXRlX3NxLnVzZXJfZnJhZ19zaXplID0gMCA7Cit9CisKKyNpZmRlZiBIQVNfUkVDT1JECisKK3N0YXRpYyB2b2lkIHNxX3Jlc2V0X2lucHV0KHZvaWQpCit7CisJaWYgKGRtYXNvdW5kLm1hY2gucmVjb3JkICYmIHJlYWRfc3EuYWN0aXZlKSB7CisJCWlmIChkbWFzb3VuZC5tYWNoLmFib3J0X3JlYWQpIHsgLyogdGhpcyByb3V0aW5lIG11c3QgcmVhbGx5IGJlIHByZXNlbnQgKi8KKwkJCXJlYWRfc3Euc3luY2luZyA9IDEgOworCQkJLyogdGhpcyBjYW4gdXNlIHRoZSByZWFkX3NxLnN5bmNfcXVldWUgdG8gc2xlZXAgaWYKKwkJCSAgIG5lY2Vzc2FyeSAtIGl0IHNob3VsZCBub3QgcmV0dXJuIHVudGlsIERNQQorCQkJICAgaXMgcmVhbGx5IHN0b3BwZWQgLSBiZWNhdXNlIHdlIG1pZ2h0IGRlYWxsb2NhdGUKKwkJCSAgIHRoZSBidWZmZXJzIGFzIHRoZSBuZXh0IGFjdGlvbi4uLgorCQkJKi8KKwkJCWRtYXNvdW5kLm1hY2guYWJvcnRfcmVhZCgpIDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJImRtYXNvdW5kX2NvcmU6ICVzIGhhcyBubyBhYm9ydF9yZWFkKCkhISBhbGwgYmV0cyBhcmUgb2ZmXG4iLAorCQkJCWRtYXNvdW5kLm1hY2gubmFtZSkgOworCQl9CisJfQorCXJlYWRfc3Euc3luY2luZyA9CisJcmVhZF9zcS5hY3RpdmUgPQorCXJlYWRfc3EuZnJvbnQgPQorCXJlYWRfc3EuY291bnQgPQorCXJlYWRfc3EucmVhciA9IDAgOworCisJLyogT0sgLSB3ZSBjYW4gdW5sb2NrIHRoZSBwYXJhbWV0ZXJzIGFuZCBmcmFnbWVudCBzZXR0aW5ncyAqLworCXJlYWRfc3EubG9ja2VkID0gMCA7CisJcmVhZF9zcS51c2VyX2ZyYWdzID0gMCA7CisJcmVhZF9zcS51c2VyX2ZyYWdfc2l6ZSA9IDAgOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgc3FfcmVzZXQodm9pZCkKK3sKKwlzcV9yZXNldF9vdXRwdXQoKSA7CisJc3FfcmVzZXRfaW5wdXQoKSA7CisJLyogd2UgY291bGQgY29uc2lkZXIgcmVzZXR0aW5nIHRoZSBzaGFyZWRfcmVzb3VyY2VzX293bmVyIGhlcmUuLi4gYnV0IEkKKwkgICB0aGluayBpdCBpcyBwcm9iYWJseSBzdGlsbCByYXRoZXIgbm9uLW9idmlvdXMgdG8gYXBwbGljYXRpb24gd3JpdGVyCisJKi8KKworCS8qIHdlIHJlbGVhc2UgZXZlcnl0aGluZyBlbHNlIHRob3VnaCAqLworCXNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPSAwIDsKK30KKworc3RhdGljIGludCBzcV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCByYyA9IDA7CisJaW50IHRpbWVvdXQgPSA1OworCisJd3JpdGVfc3Euc3luY2luZyB8PSAxOworCXNxX3BsYXkoKTsJLyogdGhlcmUgbWF5IGJlIGFuIGluY29tcGxldGUgZnJhbWUgd2FpdGluZyAqLworCisJd2hpbGUgKHdyaXRlX3NxLmFjdGl2ZSkgeworCQlTTEVFUCh3cml0ZV9zcS5zeW5jX3F1ZXVlKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkvKiBXaGlsZSB3YWl0aW5nIGZvciBhdWRpbyBvdXRwdXQgdG8gZHJhaW4sIGFuCisJCQkgKiBpbnRlcnJ1cHQgb2NjdXJyZWQuICBTdG9wIGF1ZGlvIG91dHB1dCBpbW1lZGlhdGVseQorCQkJICogYW5kIGNsZWFyIHRoZSBxdWV1ZS4gKi8KKwkJCXNxX3Jlc2V0X291dHB1dCgpOworCQkJcmMgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIS0tdGltZW91dCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZG1hc291bmQ6IFRpbWVvdXQgZHJhaW5pbmcgb3V0cHV0XG4iKTsKKwkJCXNxX3Jlc2V0X291dHB1dCgpOworCQkJcmMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBmbGFnIG5vIHN5bmMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIGhhZCBhIERTUF9QT1NUIG9yIG5vdCAqLworCXdyaXRlX3NxLnN5bmNpbmcgPSAwIDsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgc3FfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmMgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKworI2lmZGVmIEhBU19SRUNPUkQKKwkvKiBwcm9iYWJseSBiZXN0IHRvIGRvIHRoZSByZWFkIHNpZGUgZmlyc3QgLSBzbyB0aGF0IHRpbWUgdGFrZW4gdG8gZG8gaXQKKwkgICBvdmVybGFwcyB3aXRoIHBsYXlpbmcgYW55IHJlbWFpbmluZyBvdXRwdXQgc2FtcGxlcy4KKwkqLworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXNxX3Jlc2V0X2lucHV0KCkgOyAvKiBtYWtlIHN1cmUgZG1hIGlzIHN0b3BwZWQgYW5kIGFsbCBpcyBxdWlldCAqLworCQlyZWFkX3NxX3JlbGVhc2VfYnVmZmVycygpOworCQlyZWFkX3NxLmJ1c3kgPSAwOworCX0KKyNlbmRpZgorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICh3cml0ZV9zcS5idXN5KQorCQkJcmMgPSBzcV9mc3luYyhmaWxlLCBmaWxlLT5mX2RlbnRyeSk7CisKKwkJc3FfcmVzZXRfb3V0cHV0KCkgOyAvKiBtYWtlIHN1cmUgZG1hIGlzIHN0b3BwZWQgYW5kIGFsbCBpcyBxdWlldCAqLworCQl3cml0ZV9zcV9yZWxlYXNlX2J1ZmZlcnMoKTsKKwkJd3JpdGVfc3EuYnVzeSA9IDA7CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIHNoYXJlZF9yZXNvdXJjZV9vd25lcikgeyAvKiBpdCdzIHVzIHRoYXQgaGFzIHRoZW0gKi8KKwkJc2hhcmVkX3Jlc291cmNlX293bmVyID0gMCA7CisJCXNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPSAwIDsKKwkJZG1hc291bmQuaGFyZCA9IGRtYXNvdW5kLm1hY2guZGVmYXVsdF9oYXJkIDsKKwl9CisKKwltb2R1bGVfcHV0KGRtYXNvdW5kLm1hY2gub3duZXIpOworCisjaWYgMCAvKiBibG9ja2luZyBvcGVuKCkgKi8KKwkvKiBXYWtlIHVwIGEgcHJvY2VzcyB3YWl0aW5nIGZvciB0aGUgcXVldWUgYmVpbmcgcmVsZWFzZWQuCisJICogTm90ZTogVGhlcmUgbWF5IGJlIHNldmVyYWwgcHJvY2Vzc2VzIHdhaXRpbmcgZm9yIGEgY2FsbAorCSAqIHRvIG9wZW4oKSByZXR1cm5pbmcuICovCisKKwkvKiBJYWluOiBobW0gSSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgbmV4dCBjb21tZW50IC4uLiAqLworCS8qIFRoZXJlIGlzIHByb2JhYmx5IGEgRE9TIGF0YWNrIGhlcmUuIFRoZXkgY2hhbmdlIHRoZSBtb2RlIGZsYWcuICovCisJLyogWFhYIGFkZCBjaGVjayBoZXJlLCovCisJcmVhZF9zcV93YWtlX3VwKGZpbGUpOyAvKiBjaGVja3MgZl9tb2RlICovCisJd3JpdGVfc3Ffd2FrZV91cChmaWxlKTsgLyogY2hlY2tzIGZfbW9kZSAqLworI2VuZGlmIC8qIGJsb2NraW5nIG9wZW4oKSAqLworCisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJjOworfQorCisvKiBoZXJlIHdlIHNlZSBpZiB3ZSBoYXZlIGEgcmlnaHQgdG8gbW9kaWZ5IGZvcm1hdCwgY2hhbm5lbHMsIHNpemUgYW5kIHNvIG9uCisgICBpZiBuby1vbmUgZWxzZSBoYXMgY2xhaW1lZCBpdCBhbHJlYWR5IHRoZW4gd2UgZG8uLi4KKworICAgVE9ETzogV2UgbWlnaHQgY2hhbmdlIHRoaXMgdG8gbWFzayBPX1JEV1Igc3VjaCB0aGF0IG9ubHkgb25lIG9yIHRoZSBvdGhlciBjaGFubmVsCisgICBpcyB0aGUgb3duZXIgLSBpZiB3ZSBoYXZlIHByb2JsZW1zLgorKi8KKworc3RhdGljIGludCBzaGFyZWRfcmVzb3VyY2VzX2FyZV9taW5lKG1vZGVfdCBtZCkKK3sKKwlpZiAoc2hhcmVkX3Jlc291cmNlX293bmVyKQorCQlyZXR1cm4gKHNoYXJlZF9yZXNvdXJjZV9vd25lciAmIG1kICkgOworCWVsc2UgeworCQlzaGFyZWRfcmVzb3VyY2Vfb3duZXIgPSBtZCA7CisJCXJldHVybiAxIDsKKwl9Cit9CisKKy8qIGlmIGVpdGhlciBxdWV1ZSBpcyBsb2NrZWQgd2UgbXVzdCBkZW55IHRoZSByaWdodCB0byBjaGFuZ2Ugc2hhcmVkIHBhcmFtcworKi8KKworc3RhdGljIGludCBxdWV1ZXNfYXJlX3F1aWVzY2VudCh2b2lkKQoreworI2lmZGVmIEhBU19SRUNPUkQKKwlpZiAoZG1hc291bmQubWFjaC5yZWNvcmQpCisJCWlmIChyZWFkX3NxLmxvY2tlZCkKKwkJCXJldHVybiAwIDsKKyNlbmRpZgorCWlmICh3cml0ZV9zcS5sb2NrZWQpCisJCXJldHVybiAwIDsKKwlyZXR1cm4gMSA7Cit9CisKKy8qIGNoZWNrIGFuZCBzZXQgYSBxdWV1ZSdzIGZyYWdtZW50cyBwZXIgdXNlcidzIHdpc2hlcy4uLgorICAgd2Ugd2lsbCBjaGVjayBhZ2FpbnN0IHRoZSBwcmUtZGVmaW5lZCBsaXRlcmFscyBhbmQgdGhlIGFjdHVhbCBzaXplcy4KKyAgIFRoaXMgaXMgYSBiaXQgZnJhdWdodCAtIGJlY2F1c2Ugc29mdCB0cmFuc2xhdGlvbnMgY2FuIG1lc3Mgd2l0aCBvdXIKKyAgIGJ1ZmZlciByZXF1aXJlbWVudHMgKmFmdGVyKiB0aGlzIGNhbGwgLSBPU1Mgc2F5cyAiY2FsbCBzZXRmcmFncyBmaXJzdCIKKyovCisKKy8qIEl0IGlzIHBvc3NpYmxlIHRvIHJlcGxhY2UgYWxsIHRoZSAtRUlOVkFMIHJldHVybnMgd2l0aCBhbiBvdmVycmlkZSB0aGF0CisgICBqdXN0IHB1dHMgdGhlIGFsbG93YWJsZSB2YWx1ZSBpbi4gIFRoaXMgbWF5IGJlIHdoYXQgbWFueSBPU1MgYXBwcyByZXF1aXJlCisqLworCitzdGF0aWMgaW50IHNldF9xdWV1ZV9mcmFncyhzdHJ1Y3Qgc291bmRfcXVldWUgKnNxLCBpbnQgYnVmcywgaW50IHNpemUpCit7CisJaWYgKHNxLT5sb2NrZWQpIHsKKyNpZmRlZiBERUJVR19ETUFTT1VORAorcHJpbnRrKCJkbWFzb3VuZF9jb3JlOiB0cmllZCB0byBzZXRfcXVldWVfZnJhZ3Mgb24gYSBsb2NrZWQgcXVldWVcbiIpIDsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTlZBTCA7CisJfQorCisJaWYgKChzaXplIDwgTUlOX0ZSQUdfU0laRSkgfHwgKHNpemUgPiBNQVhfRlJBR19TSVpFKSkKKwkJcmV0dXJuIC1FSU5WQUwgOworCXNpemUgPSAoMTw8c2l6ZSkgOyAvKiBub3cgaW4gYnl0ZXMgKi8KKwlpZiAoc2l6ZSA+IHNxLT5idWZTaXplKQorCQlyZXR1cm4gLUVJTlZBTCA7IC8qIHRoaXMgbWlnaHQgc3RpbGwgbm90IHdvcmsgKi8KKworCWlmIChidWZzIDw9IDApCisJCXJldHVybiAtRUlOVkFMIDsKKwlpZiAoYnVmcyA+IHNxLT5udW1CdWZzKSAvKiB0aGUgdXNlciBpcyBhbGxvd2VkIHNheSAiZG9uJ3QgY2FyZSIgd2l0aCAweDdmZmYgKi8KKwkJYnVmcyA9IHNxLT5udW1CdWZzIDsKKworCS8qIHRoZXJlIGlzLCBjdXJyZW50bHksIG5vIHdheSB0byBzcGVjaWZ5IG1heF9hY3RpdmUgc2VwYXJhdGVseQorCSAgIGZyb20gbWF4X2NvdW50LiAgVGhpcyBjb3VsZCBiZSBhIExMIGRyaXZlciBpc3N1ZSAtIEkgZ3Vlc3MKKwkgICBpZiB0aGVyZSBpcyBhIHJlcXVpcmVtZW50IGZvciB0aGVzZSB2YWx1ZXMgdG8gYmUgZGlmZmVyZW50IHRoZW4KKwkgIHdlIHdpbGwgaGF2ZSB0byBwYXNzIHRoYXQgaW5mby4gdXAgdG8gdGhpcyBsZXZlbC4KKwkqLworCXNxLT51c2VyX2ZyYWdzID0KKwlzcS0+bWF4X2FjdGl2ZSA9IGJ1ZnMgOworCXNxLT51c2VyX2ZyYWdfc2l6ZSA9IHNpemUgOworCisJcmV0dXJuIDAgOworfQorCitzdGF0aWMgaW50IHNxX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1X2ludCBjbWQsCisJCSAgICB1X2xvbmcgYXJnKQoreworCWludCB2YWwsIHJlc3VsdDsKKwl1X2xvbmcgZm10OworCWludCBkYXRhOworCWludCBzaXplLCBuYnVmczsKKwlhdWRpb19idWZfaW5mbyBpbmZvOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCXNxX3Jlc2V0KCk7CisJCXJldHVybiAwOworCQlicmVhayA7CisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CisJCWZtdCA9IGRtYXNvdW5kLm1hY2guaGFyZHdhcmVfYWZtdHMgOyAvKiB0aGlzIGlzIHdoYXQgT1NTIHNheXMuLiAqLworCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgZm10KTsKKwkJYnJlYWsgOworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQkvKiB0aGlzIHNob3VsZCB0ZWxsIHRoZSBjYWxsZXIgYWJvdXQgYnl0ZXMgdGhhdCB0aGUgYXBwIGNhbgorCQkgICByZWFkL3dyaXRlIC0gdGhlIGFwcCBkb2Vzbid0IGNhcmUgYWJvdXQgb3VyIGludGVybmFsIGJ1ZmZlcnMuCisJCSAgIFdlIGZvcmNlIHNxX3NldHVwKCkgaGVyZSBhcyBwZXIgT1NTIDEuMSAod2hpY2ggc2hvdWxkCisJCSAgIGNvbXB1dGUgdGhlIHZhbHVlcyBuZWNlc3NhcnkpLgorCQkgICBTaW5jZSB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gc3BlY2lmeSByZWFkL3dyaXRlIHNlcGFyYXRlbHksIGZvcgorCQkgICBmZHMgb3BlbmVkIE9fUkRXUiwgdGhlIHdyaXRlX3NxIHZhbHVlcyB3aWxsLCBhcmJpdHJhcmlseSwgb3ZlcndyaXRlCisJCSAgIHRoZSByZWFkX3NxIG9uZXMuCisJCSovCisJCXNpemUgPSAwIDsKKyNpZmRlZiBIQVNfUkVDT1JECisJCWlmIChkbWFzb3VuZC5tYWNoLnJlY29yZCAmJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJCWlmICggIXJlYWRfc3EubG9ja2VkICkKKwkJCQlzcV9zZXR1cCgmcmVhZF9zcSkgOyAvKiBzZXQgcGFyYW1zICovCisJCQlzaXplID0gcmVhZF9zcS51c2VyX2ZyYWdfc2l6ZSA7CisJCX0KKyNlbmRpZgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICggIXdyaXRlX3NxLmxvY2tlZCApCisJCQkJc3Ffc2V0dXAoJndyaXRlX3NxKSA7CisJCQlzaXplID0gd3JpdGVfc3EudXNlcl9mcmFnX3NpemUgOworCQl9CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBzaXplKTsKKwkJYnJlYWsgOworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQkvKiBhbGwgd2UgYXJlIGdvaW5nIHRvIGRvIGlzIHRvIHRlbGwgdGhlIExMIHRoYXQgYW55CisJCSAgIHBhcnRpYWwgZnJhZ3MgY2FuIGJlIHF1ZXVlZCBmb3Igb3V0cHV0LgorCQkgICBUaGUgTEwgd2lsbCBoYXZlIHRvIGNsZWFyIHRoaXMgZmxhZyB3aGVuIGxhc3Qgb3V0cHV0CisJCSAgIGlzIHF1ZXVlZC4KKwkJKi8KKwkJd3JpdGVfc3Euc3luY2luZyB8PSAweDIgOworCQlzcV9wbGF5KCkgOworCQlyZXR1cm4gMCA7CisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCS8qIFRoaXMgY2FsbCwgZWZmZWN0aXZlbHksIGhhcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgU05EQ1RMX0RTUF9SRVNFVAorCQkgICBleGNlcHQgdGhhdCBpdCB3YWl0cyBmb3Igb3V0cHV0IHRvIGZpbmlzaCBiZWZvcmUgcmVzZXR0aW5nCisJCSAgIGV2ZXJ5dGhpbmcgLSByZWFkLCBob3dldmVyLCBpcyBraWxsZWQgaW1lZGlhdGVseS4KKwkJKi8KKwkJcmVzdWx0ID0gMCA7CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgZG1hc291bmQubWFjaC5yZWNvcmQpCisJCQlzcV9yZXNldF9pbnB1dCgpIDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlyZXN1bHQgPSBzcV9mc3luYyhmaWxlLCBmaWxlLT5mX2RlbnRyeSk7CisJCQlzcV9yZXNldF9vdXRwdXQoKSA7CisJCX0KKwkJLyogaWYgd2UgYXJlIHRoZSBzaGFyZWQgcmVzb3VyY2Ugb3duZXIgdGhlbiByZWxlYXNlIHRoZW0gKi8KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIHNoYXJlZF9yZXNvdXJjZV9vd25lcikKKwkJCXNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPSAwIDsKKwkJcmV0dXJuIHJlc3VsdCA7CisJCWJyZWFrIDsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBkbWFzb3VuZC5zb2Z0LnNwZWVkKTsKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCS8qIGNoYW5naW5nIHRoaXMgb24gdGhlIGZseSB3aWxsIGhhdmUgd2VpcmQgZWZmZWN0cyBvbiB0aGUgc291bmQuCisJCSAgIFdoZXJlIHRoZXJlIGFyZSByYXRlIGNvbnZlcnNpb25zIGltcGxlbWVudGVkIGluIHNvZnQgZm9ybSAtIGl0CisJCSAgIHdpbGwgY2F1c2UgdGhlIF9jdHhfeHh4KCkgZnVuY3Rpb25zIHRvIGJlIHN1YnN0aXR1dGVkLgorCQkgICBIb3dldmVyLCB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnkgcmVhc29uIHRvIGRpcy1hbGxvdyBpdCBmcm9tCisJCSAgIGEgZHJpdmVyIHBvdi4KKwkJKi8KKwkJaWYgKHNoYXJlZF9yZXNvdXJjZXNfYXJlX21pbmUoZmlsZS0+Zl9tb2RlKSkgeworCQkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJCWRhdGEgPSBzb3VuZF9zZXRfc3BlZWQoZGF0YSkgOworCQkJc2hhcmVkX3Jlc291cmNlc19pbml0aWFsaXNlZCA9IDAgOworCQkJcmV0dXJuIElPQ1RMX09VVChhcmcsIGRhdGEpOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMIDsKKwkJYnJlYWsgOworCS8qIE9TUyBzYXlzIHRoZXNlIG5leHQgNCBhY3Rpb25zIGFyZSB1bmRlZmluZWQgd2hlbiB0aGUgZGV2aWNlIGlzCisJICAgYnVzeS9hY3RpdmUgLSB3ZSB3aWxsIGp1c3QgcmV0dXJuIC1FSU5WQUwuCisJICAgVG8gYmUgYWxsb3dlZCB0byBjaGFuZ2Ugb25lIC0gKGEpIHlvdSBoYXZlIHRvIG93biB0aGUgcmlnaHQKKwkgICAgKGIpIHRoZSBxdWV1ZShzKSBtdXN0IGJlIHF1aWVzY2VudAorCSovCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKHNoYXJlZF9yZXNvdXJjZXNfYXJlX21pbmUoZmlsZS0+Zl9tb2RlKSAmJgorCQkgICAgcXVldWVzX2FyZV9xdWllc2NlbnQoKSkgeworCQkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJCXNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPSAwIDsKKwkJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBzb3VuZF9zZXRfc3RlcmVvKGRhdGEpKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTCA7CisJCWJyZWFrIDsKKwljYXNlIFNPVU5EX1BDTV9XUklURV9DSEFOTkVMUzoKKwkJaWYgKHNoYXJlZF9yZXNvdXJjZXNfYXJlX21pbmUoZmlsZS0+Zl9tb2RlKSAmJgorCQkgICAgcXVldWVzX2FyZV9xdWllc2NlbnQoKSkgeworCQkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJCS8qIHRoZSB1c2VyIG1pZ2h0IGFzayBmb3IgMjAgY2hhbm5lbHMsIHdlIHdpbGwgcmV0dXJuIDEgb3IgMiAqLworCQkJc2hhcmVkX3Jlc291cmNlc19pbml0aWFsaXNlZCA9IDAgOworCQkJcmV0dXJuIElPQ1RMX09VVChhcmcsIHNvdW5kX3NldF9zdGVyZW8oZGF0YS0xKSsxKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTCA7CisJCWJyZWFrIDsKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOgorCQlpZiAoc2hhcmVkX3Jlc291cmNlc19hcmVfbWluZShmaWxlLT5mX21vZGUpICYmCisJCSAgICBxdWV1ZXNfYXJlX3F1aWVzY2VudCgpKSB7CisJCSAgICAJaW50IGZvcm1hdDsKKwkJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCQlzaGFyZWRfcmVzb3VyY2VzX2luaXRpYWxpc2VkID0gMCA7CisJCQlmb3JtYXQgPSBzb3VuZF9zZXRfZm9ybWF0KGRhdGEpOworCQkJcmVzdWx0ID0gSU9DVExfT1VUKGFyZywgZm9ybWF0KTsKKwkJCWlmIChyZXN1bHQgPCAwKQorCQkJCXJldHVybiByZXN1bHQ7CisJCQlpZiAoZm9ybWF0ICE9IGRhdGEgJiYgZGF0YSAhPSBBRk1UX1FVRVJZKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUwgOworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCXJldHVybiAtRUlOVkFMIDsKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCS8qIHdlIGNhbiBkbyB0aGlzIGluZGVwZW5kZW50bHkgZm9yIHRoZSB0d28gcXVldWVzIC0gd2l0aCB0aGUKKwkJICAgcHJvdmlzbyB0aGF0IGZvciBmZHMgb3BlbmVkIE9fUkRXUiB3ZSBjYW5ub3Qgc2VwYXJhdGUgdGhlCisJCSAgIGFjdGlvbnMgYW5kIGJvdGggcXVldWVzIHdpbGwgYmUgc2V0IHBlciB0aGUgbGFzdCBjYWxsLgorCQkgICBOT1RFOiB0aGlzIGRvZXMgKk5PVCogYWN0dWFsbHkgc2V0IHRoZSBxdWV1ZSB1cCAtIG1lcmVseQorCQkgICByZWdpc3RlcnMgb3VyIGludGVudGlvbnMuCisJCSovCisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCXJlc3VsdCA9IDAgOworCQluYnVmcyA9IChkYXRhID4+IDE2KSAmIDB4N2ZmZiA7IC8qIDB4N2ZmZiBpcyAndXNlIG1heGltdW0nICovCisJCXNpemUgPSBkYXRhICYgMHhmZmZmOworI2lmZGVmIEhBU19SRUNPUkQKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiBkbWFzb3VuZC5tYWNoLnJlY29yZCkgeworCQkJcmVzdWx0ID0gc2V0X3F1ZXVlX2ZyYWdzKCZyZWFkX3NxLCBuYnVmcywgc2l6ZSkgOworCQkJaWYgKHJlc3VsdCkKKwkJCQlyZXR1cm4gcmVzdWx0IDsKKwkJfQorI2VuZGlmCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJcmVzdWx0ID0gc2V0X3F1ZXVlX2ZyYWdzKCZ3cml0ZV9zcSwgbmJ1ZnMsIHNpemUpIDsKKwkJCWlmIChyZXN1bHQpCisJCQkJcmV0dXJuIHJlc3VsdCA7CisJCX0KKwkJLyogTk9URTogdGhpcyByZXR1cm4gdmFsdWUgaXMgaXJyZWxldmFudCAtIE9TUyBzcGVjaWZpY2FsbHkgc2F5cyB0aGF0CisJCSAgIHRoZSB2YWx1ZSBpcyAncmFuZG9tJyBhbmQgdGhhdCB0aGUgdXNlciBfbXVzdF8gY2hlY2sgdGhlIGFjdHVhbAorCQkgICBmcmFncyB2YWx1ZXMgdXNpbmcgU05EQ1RMX0RTUF9HRVRCTEtTSVpFIG9yIHNpbWlsYXIgKi8KKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhayA7CisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJLyoKKwkJKi8KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoICF3cml0ZV9zcS5sb2NrZWQgKQorCQkJCXNxX3NldHVwKCZ3cml0ZV9zcSkgOworCQkJaW5mby5mcmFnbWVudHMgPSB3cml0ZV9zcS5tYXhfYWN0aXZlIC0gd3JpdGVfc3EuY291bnQ7CisJCQlpbmZvLmZyYWdzdG90YWwgPSB3cml0ZV9zcS5tYXhfYWN0aXZlOworCQkJaW5mby5mcmFnc2l6ZSA9IHdyaXRlX3NxLnVzZXJfZnJhZ19zaXplOworCQkJaW5mby5ieXRlcyA9IGluZm8uZnJhZ21lbnRzICogaW5mby5mcmFnc2l6ZTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMIDsKKwkJYnJlYWsgOworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQl2YWwgPSBkbWFzb3VuZC5tYWNoLmNhcGFiaWxpdGllcyAmIDB4ZmZmZmZmMDA7CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLHZhbCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gbWl4ZXJfaW9jdGwoaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNxX2ZvcHMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gc3Ffd3JpdGUsCisJLnBvbGwJCT0gc3FfcG9sbCwKKwkuaW9jdGwJCT0gc3FfaW9jdGwsCisJLm9wZW4JCT0gc3Ffb3BlbiwKKwkucmVsZWFzZQk9IHNxX3JlbGVhc2UsCisjaWZkZWYgSEFTX1JFQ09SRAorCS5yZWFkCQk9IE5VTEwJLyogZGVmYXVsdCB0byBubyByZWFkIGZvciBjb21wYXQgbW9kZSAqLworI2VuZGlmCit9OworCitzdGF0aWMgaW50IHNxX2luaXQodm9pZCkKK3sKKyNpZm5kZWYgTU9EVUxFCisJaW50IHNxX3VuaXQ7CisjZW5kaWYKKworI2lmZGVmIEhBU19SRUNPUkQKKwlpZiAoZG1hc291bmQubWFjaC5yZWNvcmQpCisJCXNxX2ZvcHMucmVhZCA9IHNxX3JlYWQgOworI2VuZGlmCisJc3FfdW5pdCA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmc3FfZm9wcywgLTEpOworCWlmIChzcV91bml0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kX2NvcmU6IGNvdWxkbid0IHJlZ2lzdGVyIGZvcHNcbiIpIDsKKwkJcmV0dXJuIHNxX3VuaXQgOworCX0KKworCXdyaXRlX3NxX2luaXRfd2FpdHF1ZXVlKCk7CisJcmVhZF9zcV9pbml0X3dhaXRxdWV1ZSgpOworCisJLyogVGhlc2UgcGFyYW1ldGVycyB3aWxsIGJlIHJlc3RvcmVkIGZvciBldmVyeSBjbGVhbiBvcGVuKCkKKwkgKiBpbiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBvcGVuKClzIChlLmcuIGRzcDAgJiBkc3AxKSB0aGV5CisJICogd2lsbCBiZSBzZXQgc28gbG9uZyBhcyB0aGUgc2hhcmVkIHJlc291cmNlcyBoYXZlIG5vIG93bmVyLgorCSAqLworCisJaWYgKHNoYXJlZF9yZXNvdXJjZV9vd25lciA9PSAwKSB7CisJCWRtYXNvdW5kLnNvZnQgPSBkbWFzb3VuZC5tYWNoLmRlZmF1bHRfc29mdCA7CisJCWRtYXNvdW5kLmhhcmQgPSBkbWFzb3VuZC5tYWNoLmRlZmF1bHRfaGFyZCA7CisJCWRtYXNvdW5kLmRzcCA9IGRtYXNvdW5kLm1hY2guZGVmYXVsdF9zb2Z0IDsKKwkJc2hhcmVkX3Jlc291cmNlc19pbml0aWFsaXNlZCA9IDAgOworCX0KKwlyZXR1cm4gMCA7Cit9CisKKworICAgIC8qCisgICAgICogIC9kZXYvc25kc3RhdAorICAgICAqLworCisvKiB3ZSBhbGxvdyBtb3JlIHNwYWNlIGZvciByZWNvcmQtZW5hYmxlZCBiZWNhdXNlIHRoZXJlIGFyZSBleHRyYSBvdXRwdXQgbGluZXMuCisgICB0aGUgbnVtYmVyIGhlcmUgbXVzdCBpbmNsdWRlIHRoZSBhbW91bnQgd2UgYXJlIHByZXBhcmVkIHRvIGdpdmUgdG8gdGhlIGxvdy1sZXZlbAorICAgZHJpdmVyLgorKi8KKworI2lmZGVmIEhBU19SRUNPUkQKKyNkZWZpbmUgU1RBVF9CVUZGX0xFTiAxMDI0CisjZWxzZQorI2RlZmluZSBTVEFUX0JVRkZfTEVOIDc2OAorI2VuZGlmCisKKy8qIHRoaXMgaXMgaG93IG11Y2ggc3BhY2Ugd2Ugd2lsbCBhbGxvdyB0aGUgbG93LWxldmVsIGRyaXZlciB0byB1c2UKKyAgIGluIHRoZSBzdGF0IGJ1ZmZlci4gIEN1cnJlbnRseSwgMiAqICg4MCBjaGFyYWN0ZXIgbGluZSArIDxOTD4pLgorICAgV2UgZG8gbm90IHBvbGljZSB0aGlzIChpdCBpcyB1cCB0byB0aGUgbGwgZHJpdmVyIHRvIGJlIGhvbmVzdCkuCisqLworCisjZGVmaW5lIExPV19MRVZFTF9TVEFUX0FMTE9DIDE2MgorCitzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgYnVzeTsKKyAgICBjaGFyIGJ1ZltTVEFUX0JVRkZfTEVOXTsJLyogc3RhdGUuYnVmIHNob3VsZCBub3Qgb3ZlcmZsb3chICovCisgICAgaW50IGxlbiwgcHRyOworfSBzdGF0ZTsKKworLyogcHVibGlzaCB0aGlzIGZ1bmN0aW9uIGZvciB1c2UgYnkgbG93LWxldmVsIGNvZGUsIGlmIHJlcXVpcmVkICovCisKK2NoYXIgKmdldF9hZm10X3N0cmluZyhpbnQgYWZtdCkKK3sKKyAgICAgICAgc3dpdGNoKGFmbXQpIHsKKyAgICAgICAgICAgIGNhc2UgQUZNVF9NVV9MQVc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJtdS1sYXciOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBRk1UX0FfTEFXOgorICAgICAgICAgICAgICAgIHJldHVybiAiQS1sYXciOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBRk1UX1U4OgorICAgICAgICAgICAgICAgIHJldHVybiAidW5zaWduZWQgOCBiaXQiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBRk1UX1M4OgorICAgICAgICAgICAgICAgIHJldHVybiAic2lnbmVkIDggYml0IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUZNVF9TMTZfQkU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzaWduZWQgMTYgYml0IEJFIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUZNVF9VMTZfQkU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ1bnNpZ25lZCAxNiBiaXQgQkUiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBRk1UX1MxNl9MRToKKyAgICAgICAgICAgICAgICByZXR1cm4gInNpZ25lZCAxNiBiaXQgTEUiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBRk1UX1UxNl9MRToKKyAgICAgICAgICAgICAgICByZXR1cm4gInVuc2lnbmVkIDE2IGJpdCBMRSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgMDoKKwkJcmV0dXJuICJmb3JtYXQgbm90IHNldCIgOworCQlicmVhayA7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIkVSUk9SOiBVbnN1cHBvcnRlZCBBRk1UX1hYWFggY29kZSIgOworfQorCitzdGF0aWMgaW50IHN0YXRlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY2hhciAqYnVmZmVyID0gc3RhdGUuYnVmOworCWludCBsZW4gPSAwOworCisJaWYgKHN0YXRlLmJ1c3kpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRtYXNvdW5kLm1hY2gub3duZXIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlzdGF0ZS5wdHIgPSAwOworCXN0YXRlLmJ1c3kgPSAxOworCisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIiVzRE1BIHNvdW5kIGRyaXZlciByZXYgJTAzZCA6XG4iLAorCQlkbWFzb3VuZC5tYWNoLm5hbWUsIChETUFTT1VORF9DT1JFX1JFVklTSU9OPDw0KSArCisJCSgoZG1hc291bmQubWFjaC52ZXJzaW9uPj44KSAmIDB4MGYpKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLAorCQkiQ29yZSBkcml2ZXIgZWRpdGlvbiAlMDJkLiUwMmQgOiAlcyBkcml2ZXIgZWRpdGlvbiAlMDJkLiUwMmRcbiIsCisJCURNQVNPVU5EX0NPUkVfUkVWSVNJT04sIERNQVNPVU5EX0NPUkVfRURJVElPTiwgZG1hc291bmQubWFjaC5uYW1lMiwKKwkJKGRtYXNvdW5kLm1hY2gudmVyc2lvbiA+PiA4KSwgKGRtYXNvdW5kLm1hY2gudmVyc2lvbiAmIDB4ZmYpKSA7CisKKwkvKiBjYWxsIHRoZSBsb3ctbGV2ZWwgbW9kdWxlIHRvIGZpbGwgaW4gYW55IHN0YXQgaW5mby4gdGhhdCBpdCBoYXMKKwkgICBpZiBwcmVzZW50LiAgTWF4aW11bSBidWZmZXIgdXNhZ2UgaXMgc3BlY2lmaWVkLgorCSovCisKKwlpZiAoZG1hc291bmQubWFjaC5zdGF0ZV9pbmZvKQorCQlsZW4gKz0gZG1hc291bmQubWFjaC5zdGF0ZV9pbmZvKGJ1ZmZlcitsZW4sCisJCQkoc2l6ZV90KSBMT1dfTEVWRUxfU1RBVF9BTExPQykgOworCisJLyogbWFrZSB1c2FnZSBvZiB0aGUgc3RhdGUgYnVmZmVyIGFzIGRldGVybWluaXN0aWMgYXMgcG9zcy4KKwkgICBleGNlcHRpb25hbCBjb25kaXRpb25zIGNvdWxkIGNhdXNlIG92ZXJydW4gLSBhbmQgdGhpcyBpcyBmbGFnZ2VkIGFzCisJICAgYSBrZXJuZWwgZXJyb3IuCisJKi8KKworCS8qIGZvcm1hdHMgYW5kIHNldHRpbmdzICovCisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCJcdFx0ID09PSBGb3JtYXRzICYgc2V0dGluZ3MgPT09XG4iKSA7CisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwiUGFyYW1ldGVyICUyMHMlMjBzXG4iLCJzb2Z0IiwiaGFyZCIpIDsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCJGb3JtYXQgICA6JTIwcyUyMHNcbiIsCisJCWdldF9hZm10X3N0cmluZyhkbWFzb3VuZC5zb2Z0LmZvcm1hdCksCisJCWdldF9hZm10X3N0cmluZyhkbWFzb3VuZC5oYXJkLmZvcm1hdCkpOworCisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwiU2FtcCBSYXRlOiUxNGQgcy9zZWMlMTRkIHMvc2VjXG4iLAorCQkgICAgICAgZG1hc291bmQuc29mdC5zcGVlZCwgZG1hc291bmQuaGFyZC5zcGVlZCk7CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCJDaGFubmVscyA6JTIwcyUyMHNcbiIsCisJCSAgICAgICBkbWFzb3VuZC5zb2Z0LnN0ZXJlbyA/ICJzdGVyZW8iIDogIm1vbm8iLAorCQkgICAgICAgZG1hc291bmQuaGFyZC5zdGVyZW8gPyAic3RlcmVvIiA6ICJtb25vIiApOworCisJLyogc291bmQgcXVldWUgc3RhdHVzICovCisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCJcdFx0ID09PSBTb3VuZCBRdWV1ZSBzdGF0dXMgPT09XG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCJBbGxvY2F0ZWQ6JThzJTZzXG4iLCJCdWZmZXJzIiwiU2l6ZSIpIDsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCIlOXM6JThkJTZkXG4iLAorCQkid3JpdGUiLCB3cml0ZV9zcS5udW1CdWZzLCB3cml0ZV9zcS5idWZTaXplKSA7CisjaWZkZWYgSEFTX1JFQ09SRAorCWlmIChkbWFzb3VuZC5tYWNoLnJlY29yZCkKKwkJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwiJTlzOiU4ZCU2ZFxuIiwKKwkJCSJyZWFkIiwgcmVhZF9zcS5udW1CdWZzLCByZWFkX3NxLmJ1ZlNpemUpIDsKKyNlbmRpZgorCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sCisJCSJDdXJyZW50ICA6IE1heEZyZyBGcmFnU2l6IE1heEFjdCBGcm50IFJlYXIgIgorCQkiQ250IFJyU2l6ZSBBIEIgUyBMICB4cnVuc1xuIikgOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIiU5czolN2QlOGQlN2QlNWQlNWQlNGQlN2QlMmQlMmQlMmQlMmQlN2RcbiIsCisJCSJ3cml0ZSIsIHdyaXRlX3NxLm1heF9jb3VudCwgd3JpdGVfc3EuYmxvY2tfc2l6ZSwKKwkJd3JpdGVfc3EubWF4X2FjdGl2ZSwgd3JpdGVfc3EuZnJvbnQsIHdyaXRlX3NxLnJlYXIsCisJCXdyaXRlX3NxLmNvdW50LCB3cml0ZV9zcS5yZWFyX3NpemUsIHdyaXRlX3NxLmFjdGl2ZSwKKwkJd3JpdGVfc3EuYnVzeSwgd3JpdGVfc3Euc3luY2luZywgd3JpdGVfc3EubG9ja2VkLCB3cml0ZV9zcS54cnVucykgOworI2lmZGVmIEhBU19SRUNPUkQKKwlpZiAoZG1hc291bmQubWFjaC5yZWNvcmQpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIiU5czolN2QlOGQlN2QlNWQlNWQlNGQlN2QlMmQlMmQlMmQlMmQlN2RcbiIsCisJCQkicmVhZCIsIHJlYWRfc3EubWF4X2NvdW50LCByZWFkX3NxLmJsb2NrX3NpemUsCisJCQlyZWFkX3NxLm1heF9hY3RpdmUsIHJlYWRfc3EuZnJvbnQsIHJlYWRfc3EucmVhciwKKwkJCXJlYWRfc3EuY291bnQsIHJlYWRfc3EucmVhcl9zaXplLCByZWFkX3NxLmFjdGl2ZSwKKwkJCXJlYWRfc3EuYnVzeSwgcmVhZF9zcS5zeW5jaW5nLCByZWFkX3NxLmxvY2tlZCwgcmVhZF9zcS54cnVucykgOworI2VuZGlmCisjaWZkZWYgREVCVUdfRE1BU09VTkQKK3ByaW50aygiZG1hc291bmQ6IHN0YXQgYnVmZmVyIHVzZWQgJWQgYnl0ZXNcbiIsIGxlbikgOworI2VuZGlmCisKKwlpZiAobGVuID49IFNUQVRfQlVGRl9MRU4pCisJCXByaW50ayhLRVJOX0VSUiAiZG1hc291bmRfY29yZTogc3RhdCBidWZmZXIgb3ZlcmZsb3dlZCFcbiIpOworCisJc3RhdGUubGVuID0gbGVuOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YXRlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJbG9ja19rZXJuZWwoKTsKKwlzdGF0ZS5idXN5ID0gMDsKKwltb2R1bGVfcHV0KGRtYXNvdW5kLm1hY2gub3duZXIpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc3RhdGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICBsb2ZmX3QgKnBwb3MpCit7CisJaW50IG4gPSBzdGF0ZS5sZW4gLSBzdGF0ZS5wdHI7CisJaWYgKG4gPiBjb3VudCkKKwkJbiA9IGNvdW50OworCWlmIChuIDw9IDApCisJCXJldHVybiAwOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmc3RhdGUuYnVmW3N0YXRlLnB0cl0sIG4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzdGF0ZS5wdHIgKz0gbjsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3RhdGVfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gc3RhdGVfcmVhZCwKKwkub3BlbgkJPSBzdGF0ZV9vcGVuLAorCS5yZWxlYXNlCT0gc3RhdGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc3RhdGVfaW5pdCh2b2lkKQoreworI2lmbmRlZiBNT0RVTEUKKwlpbnQgc3RhdGVfdW5pdDsKKyNlbmRpZgorCXN0YXRlX3VuaXQgPSByZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKCZzdGF0ZV9mb3BzLCBTTkRfREVWX1NUQVRVUyk7CisJaWYgKHN0YXRlX3VuaXQgPCAwKQorCQlyZXR1cm4gc3RhdGVfdW5pdCA7CisJc3RhdGUuYnVzeSA9IDA7CisJcmV0dXJuIDAgOworfQorCisKKyAgICAvKgorICAgICAqICBDb25maWcgJiBTZXR1cAorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IF9vbmVfIGNoaXBzZXQtc3BlY2lmaWMgZHJpdmVyCisgICAgICovCisKK2ludCBkbWFzb3VuZF9pbml0KHZvaWQpCit7CisJaW50IHJlcyA7CisjaWZkZWYgTU9EVUxFCisJaWYgKGlycV9pbnN0YWxsZWQpCisJCXJldHVybiAtRUJVU1k7CisjZW5kaWYKKworCS8qIFNldCB1cCBzb3VuZCBxdWV1ZSwgL2Rldi9hdWRpbyBhbmQgL2Rldi9kc3AuICovCisKKwkvKiBTZXQgZGVmYXVsdCBzZXR0aW5ncy4gKi8KKwlpZiAoKHJlcyA9IHNxX2luaXQoKSkgPCAwKQorCQlyZXR1cm4gcmVzIDsKKworCS8qIFNldCB1cCAvZGV2L3NuZHN0YXQuICovCisJaWYgKChyZXMgPSBzdGF0ZV9pbml0KCkpIDwgMCkKKwkJcmV0dXJuIHJlcyA7CisKKwkvKiBTZXQgdXAgL2Rldi9taXhlci4gKi8KKwltaXhlcl9pbml0KCk7CisKKwlpZiAoIWRtYXNvdW5kLm1hY2guaXJxaW5pdCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BIHNvdW5kIGRyaXZlcjogSW50ZXJydXB0IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKyNpZmRlZiBNT0RVTEUKKwlpcnFfaW5zdGFsbGVkID0gMTsKKyNlbmRpZgorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgRE1BIHNvdW5kIGRyaXZlciByZXYgJTAzZCBpbnN0YWxsZWRcbiIsCisJCWRtYXNvdW5kLm1hY2gubmFtZSwgKERNQVNPVU5EX0NPUkVfUkVWSVNJT048PDQpICsKKwkJKChkbWFzb3VuZC5tYWNoLnZlcnNpb24+PjgpICYgMHgwZikpOworCXByaW50ayhLRVJOX0lORk8KKwkJIkNvcmUgZHJpdmVyIGVkaXRpb24gJTAyZC4lMDJkIDogJXMgZHJpdmVyIGVkaXRpb24gJTAyZC4lMDJkXG4iLAorCQlETUFTT1VORF9DT1JFX1JFVklTSU9OLCBETUFTT1VORF9DT1JFX0VESVRJT04sIGRtYXNvdW5kLm1hY2gubmFtZTIsCisJCShkbWFzb3VuZC5tYWNoLnZlcnNpb24gPj4gOCksIChkbWFzb3VuZC5tYWNoLnZlcnNpb24gJiAweGZmKSkgOworCXByaW50ayhLRVJOX0lORk8gIldyaXRlIHdpbGwgdXNlICU0ZCBmcmFnbWVudHMgb2YgJTdkIGJ5dGVzIGFzIGRlZmF1bHRcbiIsCisJCW51bVdyaXRlQnVmcywgd3JpdGVCdWZTaXplKSA7CisjaWZkZWYgSEFTX1JFQ09SRAorCWlmIChkbWFzb3VuZC5tYWNoLnJlY29yZCkKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIlJlYWQgIHdpbGwgdXNlICU0ZCBmcmFnbWVudHMgb2YgJTdkIGJ5dGVzIGFzIGRlZmF1bHRcbiIsCisJCQludW1SZWFkQnVmcywgcmVhZEJ1ZlNpemUpIDsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKKwordm9pZCBkbWFzb3VuZF9kZWluaXQodm9pZCkKK3sKKwlpZiAoaXJxX2luc3RhbGxlZCkgeworCQlzb3VuZF9zaWxlbmNlKCk7CisJCWRtYXNvdW5kLm1hY2guaXJxY2xlYW51cCgpOworCQlpcnFfaW5zdGFsbGVkID0gMDsKKwl9CisKKwl3cml0ZV9zcV9yZWxlYXNlX2J1ZmZlcnMoKTsKKwlyZWFkX3NxX3JlbGVhc2VfYnVmZmVycygpOworCisJaWYgKG1peGVyX3VuaXQgPj0gMCkKKwkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihtaXhlcl91bml0KTsKKwlpZiAoc3RhdGVfdW5pdCA+PSAwKQorCQl1bnJlZ2lzdGVyX3NvdW5kX3NwZWNpYWwoc3RhdGVfdW5pdCk7CisJaWYgKHNxX3VuaXQgPj0gMCkKKwkJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aoc3FfdW5pdCk7Cit9CisKKyNlbHNlIC8qICFNT0RVTEUgKi8KKworc3RhdGljIGludCBkbWFzb3VuZF9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbNl0sIHNpemU7CisKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJLyogY2hlY2sgdGhlIGJvb3RzdHJhcCBwYXJhbWV0ZXIgZm9yICJkbWFzb3VuZD0iICovCisKKwkvKiBGSVhNRTogb3RoZXIgdGhhbiBpbiB0aGUgbW9zdCBuYWl2ZSBvZiBjYXNlcyB0aGVyZSBpcyBubyBzZW5zZSBpbiB0aGVzZQorCSAqCSAgYnVmZmVycyBiZWluZyBvdGhlciB0aGFuIHBvd2VycyBvZiB0d28uICBUaGlzIGlzIG5vdCBjaGVja2VkIHlldC4KKwkgKi8KKworCXN3aXRjaCAoaW50c1swXSkgeworI2lmZGVmIEhBU19SRUNPUkQKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIGlmICgoaW50c1s1XSA8IDApIHx8IChpbnRzWzVdID4gTUFYX0NBVENIX1JBRElVUykpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImRtYXNvdW5kX3NldHVwOiBpbnZhbGlkIGNhdGNoIHJhZGl1cywgdXNpbmcgZGVmYXVsdCA9ICVkXG4iLCBjYXRjaFJhZGl1cyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hSYWRpdXMgPSBpbnRzWzVdOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgaWYgKGludHNbNF0gPCBNSU5fQlVGRkVSUykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZG1hc291bmRfc2V0dXA6IGludmFsaWQgbnVtYmVyIG9mIHJlYWQgYnVmZmVycywgdXNpbmcgZGVmYXVsdCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUmVhZEJ1ZnMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVJlYWRCdWZzID0gaW50c1s0XTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSAzOgorCQlpZiAoKHNpemUgPSBpbnRzWzNdKSA8IDI1NikgIC8qIGNoZWNrIGZvciBzbWFsbCBidWZmZXIgc3BlY3MgKi8KKwkJCXNpemUgPDw9IDEwIDsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IE1JTl9CVUZTSVpFIHx8IHNpemUgPiBNQVhfQlVGU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZG1hc291bmRfc2V0dXA6IGludmFsaWQgcmVhZCBidWZmZXIgc2l6ZSwgdXNpbmcgZGVmYXVsdCA9ICVkXG4iLCByZWFkQnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJ1ZlNpemUgPSBzaXplOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworI2Vsc2UKKwljYXNlIDM6CisJCWlmICgoaW50c1szXSA8IDApIHx8IChpbnRzWzNdID4gTUFYX0NBVENIX1JBRElVUykpCisJCQlwcmludGsoImRtYXNvdW5kX3NldHVwOiBpbnZhbGlkIGNhdGNoIHJhZGl1cywgdXNpbmcgZGVmYXVsdCA9ICVkXG4iLCBjYXRjaFJhZGl1cyk7CisJCWVsc2UKKwkJCWNhdGNoUmFkaXVzID0gaW50c1szXTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisjZW5kaWYKKwljYXNlIDI6CisJCWlmIChpbnRzWzFdIDwgTUlOX0JVRkZFUlMpCisJCQlwcmludGsoImRtYXNvdW5kX3NldHVwOiBpbnZhbGlkIG51bWJlciBvZiBidWZmZXJzLCB1c2luZyBkZWZhdWx0ID0gJWRcbiIsIG51bVdyaXRlQnVmcyk7CisJCWVsc2UKKwkJCW51bVdyaXRlQnVmcyA9IGludHNbMV07CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgMToKKwkJaWYgKChzaXplID0gaW50c1syXSkgPCAyNTYpIC8qIGNoZWNrIGZvciBzbWFsbCBidWZmZXIgc3BlY3MgKi8KKwkJCXNpemUgPDw9IDEwIDsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IE1JTl9CVUZTSVpFIHx8IHNpemUgPiBNQVhfQlVGU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZG1hc291bmRfc2V0dXA6IGludmFsaWQgd3JpdGUgYnVmZmVyIHNpemUsIHVzaW5nIGRlZmF1bHQgPSAlZFxuIiwgd3JpdGVCdWZTaXplKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ1ZlNpemUgPSBzaXplOworCWNhc2UgMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJkbWFzb3VuZF9zZXR1cDogaW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJkbWFzb3VuZD0iLCBkbWFzb3VuZF9zZXR1cCk7CisKKyNlbmRpZiAvKiAhTU9EVUxFICovCisKKyAgICAvKgorICAgICAqICBDb252ZXJzaW9uIHRhYmxlcworICAgICAqLworCisjaWZkZWYgSEFTXzhCSVRfVEFCTEVTCisvKiA4IGJpdCBtdS1sYXcgKi8KKworY2hhciBkbWFzb3VuZF91bGF3MmRtYThbXSA9IHsKKwktMTI2LAktMTIyLAktMTE4LAktMTE0LAktMTEwLAktMTA2LAktMTAyLAktOTgsCisJLTk0LAktOTAsCS04NiwJLTgyLAktNzgsCS03NCwJLTcwLAktNjYsCisJLTYzLAktNjEsCS01OSwJLTU3LAktNTUsCS01MywJLTUxLAktNDksCisJLTQ3LAktNDUsCS00MywJLTQxLAktMzksCS0zNywJLTM1LAktMzMsCisJLTMxLAktMzAsCS0yOSwJLTI4LAktMjcsCS0yNiwJLTI1LAktMjQsCisJLTIzLAktMjIsCS0yMSwJLTIwLAktMTksCS0xOCwJLTE3LAktMTYsCisJLTE2LAktMTUsCS0xNSwJLTE0LAktMTQsCS0xMywJLTEzLAktMTIsCisJLTEyLAktMTEsCS0xMSwJLTEwLAktMTAsCS05LAktOSwJLTgsCisJLTgsCS04LAktNywJLTcsCS03LAktNywJLTYsCS02LAorCS02LAktNiwJLTUsCS01LAktNSwJLTUsCS00LAktNCwKKwktNCwJLTQsCS00LAktNCwJLTMsCS0zLAktMywJLTMsCisJLTMsCS0zLAktMywJLTMsCS0yLAktMiwJLTIsCS0yLAorCS0yLAktMiwJLTIsCS0yLAktMiwJLTIsCS0yLAktMiwKKwktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCisJLTEsCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAorCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAkwLAorCTEyNSwJMTIxLAkxMTcsCTExMywJMTA5LAkxMDUsCTEwMSwJOTcsCisJOTMsCTg5LAk4NSwJODEsCTc3LAk3MywJNjksCTY1LAorCTYyLAk2MCwJNTgsCTU2LAk1NCwJNTIsCTUwLAk0OCwKKwk0NiwJNDQsCTQyLAk0MCwJMzgsCTM2LAkzNCwJMzIsCisJMzAsCTI5LAkyOCwJMjcsCTI2LAkyNSwJMjQsCTIzLAorCTIyLAkyMSwJMjAsCTE5LAkxOCwJMTcsCTE2LAkxNSwKKwkxNSwJMTQsCTE0LAkxMywJMTMsCTEyLAkxMiwJMTEsCisJMTEsCTEwLAkxMCwJOSwJOSwJOCwJOCwJNywKKwk3LAk3LAk2LAk2LAk2LAk2LAk1LAk1LAorCTUsCTUsCTQsCTQsCTQsCTQsCTMsCTMsCisJMywJMywJMywJMywJMiwJMiwJMiwJMiwKKwkyLAkyLAkyLAkyLAkxLAkxLAkxLAkxLAorCTEsCTEsCTEsCTEsCTEsCTEsCTEsCTEsCisJMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAKK307CisKKy8qIDggYml0IEEtbGF3ICovCisKK2NoYXIgZG1hc291bmRfYWxhdzJkbWE4W10gPSB7CisJLTIyLAktMjEsCS0yNCwJLTIzLAktMTgsCS0xNywJLTIwLAktMTksCisJLTMwLAktMjksCS0zMiwJLTMxLAktMjYsCS0yNSwJLTI4LAktMjcsCisJLTExLAktMTEsCS0xMiwJLTEyLAktOSwJLTksCS0xMCwJLTEwLAorCS0xNSwJLTE1LAktMTYsCS0xNiwJLTEzLAktMTMsCS0xNCwJLTE0LAorCS04NiwJLTgyLAktOTQsCS05MCwJLTcwLAktNjYsCS03OCwJLTc0LAorCS0xMTgsCS0xMTQsCS0xMjYsCS0xMjIsCS0xMDIsCS05OCwJLTExMCwJLTEwNiwKKwktNDMsCS00MSwJLTQ3LAktNDUsCS0zNSwJLTMzLAktMzksCS0zNywKKwktNTksCS01NywJLTYzLAktNjEsCS01MSwJLTQ5LAktNTUsCS01MywKKwktMiwJLTIsCS0yLAktMiwJLTIsCS0yLAktMiwJLTIsCisJLTIsCS0yLAktMiwJLTIsCS0yLAktMiwJLTIsCS0yLAorCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAktMSwKKwktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCisJLTYsCS02LAktNiwJLTYsCS01LAktNSwJLTUsCS01LAorCS04LAktOCwJLTgsCS04LAktNywJLTcsCS03LAktNywKKwktMywJLTMsCS0zLAktMywJLTMsCS0zLAktMywJLTMsCisJLTQsCS00LAktNCwJLTQsCS00LAktNCwJLTQsCS00LAorCTIxLAkyMCwJMjMsCTIyLAkxNywJMTYsCTE5LAkxOCwKKwkyOSwJMjgsCTMxLAkzMCwJMjUsCTI0LAkyNywJMjYsCisJMTAsCTEwLAkxMSwJMTEsCTgsCTgsCTksCTksCisJMTQsCTE0LAkxNSwJMTUsCTEyLAkxMiwJMTMsCTEzLAorCTg2LAk4MiwJOTQsCTkwLAk3MCwJNjYsCTc4LAk3NCwKKwkxMTgsCTExNCwJMTI2LAkxMjIsCTEwMiwJOTgsCTExMCwJMTA2LAorCTQzLAk0MSwJNDcsCTQ1LAkzNSwJMzMsCTM5LAkzNywKKwk1OSwJNTcsCTYzLAk2MSwJNTEsCTQ5LAk1NSwJNTMsCisJMSwJMSwJMSwJMSwJMSwJMSwJMSwJMSwKKwkxLAkxLAkxLAkxLAkxLAkxLAkxLAkxLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisJMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKKwk1LAk1LAk1LAk1LAk0LAk0LAk0LAk0LAorCTcsCTcsCTcsCTcsCTYsCTYsCTYsCTYsCisJMiwJMiwJMiwJMiwJMiwJMiwJMiwJMiwKKwkzLAkzLAkzLAkzLAkzLAkzLAkzLAkzCit9OworI2VuZGlmIC8qIEhBU184QklUX1RBQkxFUyAqLworCisgICAgLyoKKyAgICAgKiAgVmlzaWJsZSBzeW1ib2xzIGZvciBtb2R1bGVzCisgICAgICovCisKK0VYUE9SVF9TWU1CT0woZG1hc291bmQpOworRVhQT1JUX1NZTUJPTChkbWFzb3VuZF9pbml0KTsKKyNpZmRlZiBNT0RVTEUKK0VYUE9SVF9TWU1CT0woZG1hc291bmRfZGVpbml0KTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTChkbWFzb3VuZF93cml0ZV9zcSk7CisjaWZkZWYgSEFTX1JFQ09SRAorRVhQT1JUX1NZTUJPTChkbWFzb3VuZF9yZWFkX3NxKTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTChkbWFzb3VuZF9jYXRjaFJhZGl1cyk7CisjaWZkZWYgSEFTXzhCSVRfVEFCTEVTCitFWFBPUlRfU1lNQk9MKGRtYXNvdW5kX3VsYXcyZG1hOCk7CitFWFBPUlRfU1lNQk9MKGRtYXNvdW5kX2FsYXcyZG1hOCk7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woZ2V0X2FmbXRfc3RyaW5nKSA7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcGF1bGEuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9wYXVsYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OGRiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcGF1bGEuYwpAQCAtMCwwICsxLDc0MyBAQAorLyoKKyAqICBsaW51eC9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcGF1bGEuYworICoKKyAqICBBbWlnYSBgUGF1bGEnIERNQSBTb3VuZCBEcml2ZXIKKyAqCisgKiAgU2VlIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9jb3JlLmMgZm9yIGNvcHlyaWdodCBhbmQgY3JlZGl0cworICogIHByaW9yIHRvIDI4LzAxLzIwMDEKKyAqCisgKiAgMjgvMDEvMjAwMSBbMC4xXSBJYWluIFNhbmRvZQorICoJCSAgICAgLSBhZGRlZCB2ZXJzaW9uaW5nCisgKgkJICAgICAtIHB1dCBpbiBhbmQgcG9wdWxhdGVkIHRoZSBoYXJkd2FyZV9hZm10cyBmaWVsZC4KKyAqICAgICAgICAgICAgIFswLjJdIC0gcHV0IGluIFNORENUTF9EU1BfR0VUQ0FQUyB2YWx1ZS4KKyAqCSAgICAgICBbMC4zXSAtIHB1dCBpbiBjb25zdHJhaW50IG9uIHN0YXRlIGJ1ZmZlciB1c2FnZS4KKyAqCSAgICAgICBbMC40XSAtIHB1dCBpbiBkZWZhdWx0IGhhcmQvc29mdCBzZXR0aW5ncworKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisKKyNpbmNsdWRlICJkbWFzb3VuZC5oIgorCisjZGVmaW5lIERNQVNPVU5EX1BBVUxBX1JFVklTSU9OIDAKKyNkZWZpbmUgRE1BU09VTkRfUEFVTEFfRURJVElPTiA0CisKKyAgIC8qCisgICAgKglUaGUgbWluaW11bSBwZXJpb2QgZm9yIGF1ZGlvIGRlcGVuZHMgb24gaHRvdGFsIChmb3IgT0NTL0VDUy9BR0EpCisgICAgKgkoSW1wb3J0ZWQgZnJvbSBhcmNoL202OGsvYW1pZ2EvYW1pc291bmQuYykKKyAgICAqLworCitleHRlcm4gdm9sYXRpbGUgdV9zaG9ydCBhbWlnYV9hdWRpb19taW5fcGVyaW9kOworCisKKyAgIC8qCisgICAgKglhbWlnYV9ta3NvdW5kKCkgc2hvdWxkIGJlIGFibGUgdG8gcmVzdG9yZSB0aGUgcGVyaW9kIGFmdGVyIGJlZXBpbmcKKyAgICAqCShJbXBvcnRlZCBmcm9tIGFyY2gvbTY4ay9hbWlnYS9hbWlzb3VuZC5jKQorICAgICovCisKK2V4dGVybiB1X3Nob3J0IGFtaWdhX2F1ZGlvX3BlcmlvZDsKKworCisgICAvKgorICAgICoJQXVkaW8gRE1BIG1hc2tzCisgICAgKi8KKworI2RlZmluZSBBTUlfQVVESU9fT0ZGCShETUFGX0FVRDAgfCBETUFGX0FVRDEgfCBETUFGX0FVRDIgfCBETUFGX0FVRDMpCisjZGVmaW5lIEFNSV9BVURJT184CShETUFGX1NFVENMUiB8IERNQUZfTUFTVEVSIHwgRE1BRl9BVUQwIHwgRE1BRl9BVUQxKQorI2RlZmluZSBBTUlfQVVESU9fMTQJKEFNSV9BVURJT184IHwgRE1BRl9BVUQyIHwgRE1BRl9BVUQzKQorCisKKyAgICAvKgorICAgICAqICBIZWxwZXIgcG9pbnRlcnMgZm9yIDE2KDE0KS1iaXQgc291bmQKKyAgICAgKi8KKworc3RhdGljIGludCB3cml0ZV9zcV9ibG9ja19zaXplX2hhbGYsIHdyaXRlX3NxX2Jsb2NrX3NpemVfcXVhcnRlcjsKKworCisvKioqIExvdyBsZXZlbCBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQgKkFtaUFsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MpOworc3RhdGljIHZvaWQgQW1pRnJlZSh2b2lkICpvYmosIHVuc2lnbmVkIGludCBzaXplKTsKK3N0YXRpYyBpbnQgQW1pSXJxSW5pdCh2b2lkKTsKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyB2b2lkIEFtaUlycUNsZWFuVXAodm9pZCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIEFtaVNpbGVuY2Uodm9pZCk7CitzdGF0aWMgdm9pZCBBbWlJbml0KHZvaWQpOworc3RhdGljIGludCBBbWlTZXRGb3JtYXQoaW50IGZvcm1hdCk7CitzdGF0aWMgaW50IEFtaVNldFZvbHVtZShpbnQgdm9sdW1lKTsKK3N0YXRpYyBpbnQgQW1pU2V0VHJlYmxlKGludCB0cmVibGUpOworc3RhdGljIHZvaWQgQW1pUGxheU5leHRGcmFtZShpbnQgaW5kZXgpOworc3RhdGljIHZvaWQgQW1pUGxheSh2b2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBBbWlJbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCk7CisKKyNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCisKKyAgICAvKgorICAgICAqICBIZWFydGJlYXQgaW50ZXJmZXJlcyB3aXRoIHNvdW5kIHNpbmNlIHRoZSA3IGtIeiBsb3ctcGFzcyBmaWx0ZXIgYW5kIHRoZQorICAgICAqICBwb3dlciBMRUQgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHNhbWUgbGluZS4KKyAgICAgKi8KKworI2lmZGVmIENPTkZJR19BUFVTCisjZGVmaW5lIG1hY2hfaGVhcnRiZWF0CXBwY19tZC5oZWFydGJlYXQKKyNlbmRpZgorCitzdGF0aWMgdm9pZCAoKnNhdmVkX2hlYXJ0YmVhdCkoaW50KSA9IE5VTEw7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2hlYXJ0YmVhdCh2b2lkKQoreworCWlmIChtYWNoX2hlYXJ0YmVhdCkgeworCSAgICBzYXZlZF9oZWFydGJlYXQgPSBtYWNoX2hlYXJ0YmVhdDsKKwkgICAgbWFjaF9oZWFydGJlYXQgPSBOVUxMOworCX0KKwlBbWlTZXRUcmVibGUoZG1hc291bmQudHJlYmxlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9oZWFydGJlYXQodm9pZCkKK3sKKwlpZiAoc2F2ZWRfaGVhcnRiZWF0KQorCSAgICBtYWNoX2hlYXJ0YmVhdCA9IHNhdmVkX2hlYXJ0YmVhdDsKK30KKyNlbHNlIC8qICFDT05GSUdfSEVBUlRCRUFUICovCisjZGVmaW5lIGRpc2FibGVfaGVhcnRiZWF0KCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBlbmFibGVfaGVhcnRiZWF0KCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qICFDT05GSUdfSEVBUlRCRUFUICovCisKKworLyoqKiBNaWQgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBBbWlNaXhlckluaXQodm9pZCk7CitzdGF0aWMgaW50IEFtaU1peGVySW9jdGwodV9pbnQgY21kLCB1X2xvbmcgYXJnKTsKK3N0YXRpYyBpbnQgQW1pV3JpdGVTcVNldHVwKHZvaWQpOworc3RhdGljIGludCBBbWlTdGF0ZUluZm8oY2hhciAqYnVmZmVyLCBzaXplX3Qgc3BhY2UpOworCisKKy8qKiogVHJhbnNsYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogKytUZVNjaGU6IHJhZGljYWxseSBjaGFuZ2VkIGZvciBuZXcgZXhwYW5kaW5nIHB1cnBvc2VzLi4uCisgKgorICogVGhlc2UgdHdvIHJvdXRpbmVzIG5vdyBkZWFsIHdpdGggY29weWluZy9leHBhbmRpbmcvdHJhbnNsYXRpbmcgdGhlIHNhbXBsZXMKKyAqIGZyb20gdXNlciBzcGFjZSBpbnRvIG91ciBidWZmZXIgYXQgdGhlIHJpZ2h0IGZyZXF1ZW5jeS4gVGhleSB0YWtlIGNhcmUgYWJvdXQKKyAqIGhvdyBtdWNoIGRhdGEgdGhlcmUncyBhY3R1YWxseSB0byByZWFkLCBob3cgbXVjaCBidWZmZXIgc3BhY2UgdGhlcmUgaXMgYW5kCisgKiB0byBjb252ZXJ0IHNhbXBsZXMgaW50byB0aGUgcmlnaHQgZnJlcXVlbmN5L2VuY29kaW5nLiBUaGV5IHdpbGwgb25seSB3b3JrIG9uCisgKiBjb21wbGV0ZSBzYW1wbGVzIHNvIGl0IG1heSBoYXBwZW4gdGhleSBsZWF2ZSBzb21lIGJ5dGVzIGluIHRoZSBpbnB1dCBzdHJlYW0KKyAqIGlmIHRoZSB1c2VyIGRpZG4ndCB3cml0ZSBhIG11bHRpcGxlIG9mIHRoZSBjdXJyZW50IHNhbXBsZSBzaXplLiBUaGV5IGJvdGgKKyAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZXkndmUgdXNlZCBmcm9tIGJvdGggc3RyZWFtcyBzbyB5b3UgbWF5IGRldGVjdAorICogc3VjaCBhIHNpdHVhdGlvbi4gTHVja2lseSBhbGwgcHJvZ3JhbXMgc2hvdWxkIGJlIGFibGUgdG8gY29wZSB3aXRoIHRoYXQuCisgKgorICogSSB0aGluayBJJ3ZlIG9wdGltaXplZCBhbnl0aGluZyBhcyBmYXIgYXMgb25lIGNhbiBkbyBpbiBwbGFpbiBDLCBhbGwKKyAqIHZhcmlhYmxlcyBzaG91bGQgZml0IGluIHJlZ2lzdGVycyBhbmQgdGhlIGxvb3BzIGFyZSByZWFsbHkgc2hvcnQuIFRoZXJlJ3MKKyAqIG9uZSBsb29wIGZvciBldmVyeSBwb3NzaWJsZSBzaXR1YXRpb24uIFdyaXRpbmcgYSBtb3JlIGdlbmVyYWxpemVkIGFuZCB0aHVzCisgKiBwYXJhbWV0ZXJpemVkIGxvb3Agd291bGQgb25seSBwcm9kdWNlIHNsb3dlciBjb2RlLiBGZWVsIGZyZWUgdG8gb3B0aW1pemUKKyAqIHRoaXMgaW4gYXNzZW1ibGVyIGlmIHlvdSBsaWtlLiA6KQorICoKKyAqIEkgdGhpbmsgdGhlc2Ugcm91dGluZXMgYmVsb25nIGhlcmUgYmVjYXVzZSB0aGV5J3JlIG5vdCB5ZXQgcmVhbGx5IGhhcmR3YXJlCisgKiBpbmRlcGVuZGVudCwgZXNwZWNpYWxseSB0aGUgZmFjdCB0aGF0IHRoZSBGYWxjb24gY2FuIHBsYXkgMTZiaXQgc2FtcGxlcworICogb25seSBpbiBzdGVyZW8gaXMgaGFyZGNvZGVkIGluIGJvdGggb2YgdGhlbSEKKyAqCisgKiArK2dlZXJ0OiBzcGxpdCBpbiBldmVuIG1vcmUgZnVuY3Rpb25zIChvbmUgcGVyIGZvcm1hdCkKKyAqLworCisKKyAgICAvKgorICAgICAqICBOYXRpdmUgZm9ybWF0CisgICAgICovCisKK3N0YXRpYyBzc2l6ZV90IGFtaV9jdF9zOChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKworCWlmICghZG1hc291bmQuc29mdC5zdGVyZW8pIHsKKwkJdm9pZCAqcCA9ICZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCkgJiB+MTsKKwkJdXNlZCA9IGNvdW50OworCQlpZiAoY29weV9mcm9tX3VzZXIocCwgdXNlclB0ciwgY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJdV9jaGFyICpsZWZ0ID0gJmZyYW1lWypmcmFtZVVzZWQ+PjFdOworCQl1X2NoYXIgKnJpZ2h0ID0gbGVmdCt3cml0ZV9zcV9ibG9ja19zaXplX2hhbGY7CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpPj4xICYgfjE7CisJCXVzZWQgPSBjb3VudCoyOworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQlpZiAoZ2V0X3VzZXIoKmxlZnQrKywgdXNlclB0cisrKQorCQkJICAgIHx8IGdldF91c2VyKCpyaWdodCsrLCB1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJY291bnQtLTsKKwkJfQorCX0KKwkqZnJhbWVVc2VkICs9IHVzZWQ7CisJcmV0dXJuIHVzZWQ7Cit9CisKKworICAgIC8qCisgICAgICogIENvcHkgYW5kIGNvbnZlcnQgOCBiaXQgZGF0YQorICAgICAqLworCisjZGVmaW5lIEdFTkVSQVRFX0FNSV9DVDgoZnVuY25hbWUsIGNvbnZzYW1wbGUpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGZ1bmNuYW1lKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwJXAorCQkJdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwJCVwKKwkJCXNzaXplX3QgZnJhbWVMZWZ0KQkJCQlcCit7CQkJCQkJCQkJXAorCXNzaXplX3QgY291bnQsIHVzZWQ7CQkJCQkJXAorCQkJCQkJCQkJXAorCWlmICghZG1hc291bmQuc29mdC5zdGVyZW8pIHsJCQkJCVwKKwkJdV9jaGFyICpwID0gJmZyYW1lWypmcmFtZVVzZWRdOwkJCQlcCisJCWNvdW50ID0gbWluX3Qoc2l6ZV90LCB1c2VyQ291bnQsIGZyYW1lTGVmdCkgJiB+MTsJXAorCQl1c2VkID0gY291bnQ7CQkJCQkJXAorCQl3aGlsZSAoY291bnQgPiAwKSB7CQkJCQlcCisJCQl1X2NoYXIgZGF0YTsJCQkJCVwKKwkJCWlmIChnZXRfdXNlcihkYXRhLCB1c2VyUHRyKyspKQkJCVwKKwkJCQlyZXR1cm4gLUVGQVVMVDsJCQkJXAorCQkJKnArKyA9IGNvbnZzYW1wbGUoZGF0YSk7CQkJXAorCQkJY291bnQtLTsJCQkJCVwKKwkJfQkJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQl1X2NoYXIgKmxlZnQgPSAmZnJhbWVbKmZyYW1lVXNlZD4+MV07CQkJXAorCQl1X2NoYXIgKnJpZ2h0ID0gbGVmdCt3cml0ZV9zcV9ibG9ja19zaXplX2hhbGY7CQlcCisJCWNvdW50ID0gbWluX3Qoc2l6ZV90LCB1c2VyQ291bnQsIGZyYW1lTGVmdCk+PjEgJiB+MTsJXAorCQl1c2VkID0gY291bnQqMjsJCQkJCQlcCisJCXdoaWxlIChjb3VudCA+IDApIHsJCQkJCVwKKwkJCXVfY2hhciBkYXRhOwkJCQkJXAorCQkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCQkJXAorCQkJCXJldHVybiAtRUZBVUxUOwkJCQlcCisJCQkqbGVmdCsrID0gY29udnNhbXBsZShkYXRhKTsJCQlcCisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXNlclB0cisrKSkJCQlcCisJCQkJcmV0dXJuIC1FRkFVTFQ7CQkJCVwKKwkJCSpyaWdodCsrID0gY29udnNhbXBsZShkYXRhKTsJCQlcCisJCQljb3VudC0tOwkJCQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJKmZyYW1lVXNlZCArPSB1c2VkOwkJCQkJCVwKKwlyZXR1cm4gdXNlZDsJCQkJCQkJXAorfQorCisjZGVmaW5lIEFNSV9DVF9VTEFXKHgpCShkbWFzb3VuZF91bGF3MmRtYThbKHgpXSkKKyNkZWZpbmUgQU1JX0NUX0FMQVcoeCkJKGRtYXNvdW5kX2FsYXcyZG1hOFsoeCldKQorI2RlZmluZSBBTUlfQ1RfVTgoeCkJKCh4KSBeIDB4ODApCisKK0dFTkVSQVRFX0FNSV9DVDgoYW1pX2N0X3VsYXcsIEFNSV9DVF9VTEFXKQorR0VORVJBVEVfQU1JX0NUOChhbWlfY3RfYWxhdywgQU1JX0NUX0FMQVcpCitHRU5FUkFURV9BTUlfQ1Q4KGFtaV9jdF91OCwgQU1JX0NUX1U4KQorCisKKyAgICAvKgorICAgICAqICBDb3B5IGFuZCBjb252ZXJ0IDE2IGJpdCBkYXRhCisgICAgICovCisKKyNkZWZpbmUgR0VORVJBVEVfQU1JX0NUXzE2KGZ1bmNuYW1lLCBjb252c2FtcGxlKQkJCVwKK3N0YXRpYyBzc2l6ZV90IGZ1bmNuYW1lKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwJXAorCQkJdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwJCVwKKwkJCXNzaXplX3QgZnJhbWVMZWZ0KQkJCQlcCit7CQkJCQkJCQkJXAorCXNzaXplX3QgY291bnQsIHVzZWQ7CQkJCQkJXAorCXVfc2hvcnQgZGF0YTsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmICghZG1hc291bmQuc29mdC5zdGVyZW8pIHsJCQkJCVwKKwkJdV9jaGFyICpoaWdoID0gJmZyYW1lWypmcmFtZVVzZWQ+PjFdOwkJCVwKKwkJdV9jaGFyICpsb3cgPSBoaWdoK3dyaXRlX3NxX2Jsb2NrX3NpemVfaGFsZjsJCVwKKwkJY291bnQgPSBtaW5fdChzaXplX3QsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KT4+MSAmIH4xOwlcCisJCXVzZWQgPSBjb3VudCoyOwkJCQkJCVwKKwkJd2hpbGUgKGNvdW50ID4gMCkgewkJCQkJXAorCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQlcCisJCQkJcmV0dXJuIC1FRkFVTFQ7CQkJCVwKKwkJCWRhdGEgPSBjb252c2FtcGxlKGRhdGEpOwkJCVwKKwkJCSpoaWdoKysgPSBkYXRhPj44OwkJCQlcCisJCQkqbG93KysgPSAoZGF0YT4+MikgJiAweDNmOwkJCVwKKwkJCWNvdW50LS07CQkJCQlcCisJCX0JCQkJCQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJdV9jaGFyICpsZWZ0aCA9ICZmcmFtZVsqZnJhbWVVc2VkPj4yXTsJCQlcCisJCXVfY2hhciAqbGVmdGwgPSBsZWZ0aCt3cml0ZV9zcV9ibG9ja19zaXplX3F1YXJ0ZXI7CVwKKwkJdV9jaGFyICpyaWdodGggPSBsZWZ0aCt3cml0ZV9zcV9ibG9ja19zaXplX2hhbGY7CVwKKwkJdV9jaGFyICpyaWdodGwgPSByaWdodGgrd3JpdGVfc3FfYmxvY2tfc2l6ZV9xdWFydGVyOwlcCisJCWNvdW50ID0gbWluX3Qoc2l6ZV90LCB1c2VyQ291bnQsIGZyYW1lTGVmdCk+PjIgJiB+MTsJXAorCQl1c2VkID0gY291bnQqNDsJCQkJCQlcCisJCXdoaWxlIChjb3VudCA+IDApIHsJCQkJCVwKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkJXAorCQkJCXJldHVybiAtRUZBVUxUOwkJCQlcCisJCQlkYXRhID0gY29udnNhbXBsZShkYXRhKTsJCQlcCisJCQkqbGVmdGgrKyA9IGRhdGE+Pjg7CQkJCVwKKwkJCSpsZWZ0bCsrID0gKGRhdGE+PjIpICYgMHgzZjsJCQlcCisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCVwKKwkJCQlyZXR1cm4gLUVGQVVMVDsJCQkJXAorCQkJZGF0YSA9IGNvbnZzYW1wbGUoZGF0YSk7CQkJXAorCQkJKnJpZ2h0aCsrID0gZGF0YT4+ODsJCQkJXAorCQkJKnJpZ2h0bCsrID0gKGRhdGE+PjIpICYgMHgzZjsJCQlcCisJCQljb3VudC0tOwkJCQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJKmZyYW1lVXNlZCArPSB1c2VkOwkJCQkJCVwKKwlyZXR1cm4gdXNlZDsJCQkJCQkJXAorfQorCisjZGVmaW5lIEFNSV9DVF9TMTZCRSh4KQkoeCkKKyNkZWZpbmUgQU1JX0NUX1UxNkJFKHgpCSgoeCkgXiAweDgwMDApCisjZGVmaW5lIEFNSV9DVF9TMTZMRSh4KQkobGUyYmUxNigoeCkpKQorI2RlZmluZSBBTUlfQ1RfVTE2TEUoeCkJKGxlMmJlMTYoKHgpKSBeIDB4ODAwMCkKKworR0VORVJBVEVfQU1JX0NUXzE2KGFtaV9jdF9zMTZiZSwgQU1JX0NUX1MxNkJFKQorR0VORVJBVEVfQU1JX0NUXzE2KGFtaV9jdF91MTZiZSwgQU1JX0NUX1UxNkJFKQorR0VORVJBVEVfQU1JX0NUXzE2KGFtaV9jdF9zMTZsZSwgQU1JX0NUX1MxNkxFKQorR0VORVJBVEVfQU1JX0NUXzE2KGFtaV9jdF91MTZsZSwgQU1JX0NUX1UxNkxFKQorCisKK3N0YXRpYyBUUkFOUyB0cmFuc0FtaWdhID0geworCS5jdF91bGF3CT0gYW1pX2N0X3VsYXcsCisJLmN0X2FsYXcJPSBhbWlfY3RfYWxhdywKKwkuY3RfczgJCT0gYW1pX2N0X3M4LAorCS5jdF91OAkJPSBhbWlfY3RfdTgsCisJLmN0X3MxNmJlCT0gYW1pX2N0X3MxNmJlLAorCS5jdF91MTZiZQk9IGFtaV9jdF91MTZiZSwKKwkuY3RfczE2bGUJPSBhbWlfY3RfczE2bGUsCisJLmN0X3UxNmxlCT0gYW1pX2N0X3UxNmxlLAorfTsKKworLyoqKiBMb3cgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHZvaWQgU3RvcERNQSh2b2lkKQoreworCWN1c3RvbS5hdWRbMF0uYXVkdm9sID0gY3VzdG9tLmF1ZFsxXS5hdWR2b2wgPSAwOworCWN1c3RvbS5hdWRbMl0uYXVkdm9sID0gY3VzdG9tLmF1ZFszXS5hdWR2b2wgPSAwOworCWN1c3RvbS5kbWFjb24gPSBBTUlfQVVESU9fT0ZGOworCWVuYWJsZV9oZWFydGJlYXQoKTsKK30KKworc3RhdGljIHZvaWQgKkFtaUFsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGFtaWdhX2NoaXBfYWxsb2MoKGxvbmcpc2l6ZSwgImRtYXNvdW5kIFtQYXVsYV0iKTsKK30KKworc3RhdGljIHZvaWQgQW1pRnJlZSh2b2lkICpvYmosIHVuc2lnbmVkIGludCBzaXplKQoreworCWFtaWdhX2NoaXBfZnJlZSAob2JqKTsKK30KKworc3RhdGljIGludCBfX2luaXQgQW1pSXJxSW5pdCh2b2lkKQoreworCS8qIHR1cm4gb2ZmIERNQSBmb3IgYXVkaW8gY2hhbm5lbHMgKi8KKwlTdG9wRE1BKCk7CisKKwkvKiBSZWdpc3RlciBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KKwlpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX0FVRDAsIEFtaUludGVycnVwdCwgMCwgIkRNQSBzb3VuZCIsCisJCQlBbWlJbnRlcnJ1cHQpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIHZvaWQgQW1pSXJxQ2xlYW5VcCh2b2lkKQoreworCS8qIHR1cm4gb2ZmIERNQSBmb3IgYXVkaW8gY2hhbm5lbHMgKi8KKwlTdG9wRE1BKCk7CisJLyogcmVsZWFzZSB0aGUgaW50ZXJydXB0ICovCisJZnJlZV9pcnEoSVJRX0FNSUdBX0FVRDAsIEFtaUludGVycnVwdCk7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKK3N0YXRpYyB2b2lkIEFtaVNpbGVuY2Uodm9pZCkKK3sKKwkvKiB0dXJuIG9mZiBETUEgZm9yIGF1ZGlvIGNoYW5uZWxzICovCisJU3RvcERNQSgpOworfQorCisKK3N0YXRpYyB2b2lkIEFtaUluaXQodm9pZCkKK3sKKwlpbnQgcGVyaW9kLCBpOworCisJQW1pU2lsZW5jZSgpOworCisJaWYgKGRtYXNvdW5kLnNvZnQuc3BlZWQpCisJCXBlcmlvZCA9IGFtaWdhX2NvbG9yY2xvY2svZG1hc291bmQuc29mdC5zcGVlZC0xOworCWVsc2UKKwkJcGVyaW9kID0gYW1pZ2FfYXVkaW9fbWluX3BlcmlvZDsKKwlkbWFzb3VuZC5oYXJkID0gZG1hc291bmQuc29mdDsKKwlkbWFzb3VuZC50cmFuc193cml0ZSA9ICZ0cmFuc0FtaWdhOworCisJaWYgKHBlcmlvZCA8IGFtaWdhX2F1ZGlvX21pbl9wZXJpb2QpIHsKKwkJLyogd2Ugd291bGQgbmVlZCB0byBzcXVlZXplIHRoZSBzb3VuZCwgYnV0IHdlIHdvbid0IGRvIHRoYXQgKi8KKwkJcGVyaW9kID0gYW1pZ2FfYXVkaW9fbWluX3BlcmlvZDsKKwl9IGVsc2UgaWYgKHBlcmlvZCA+IDY1NTM1KSB7CisJCXBlcmlvZCA9IDY1NTM1OworCX0KKwlkbWFzb3VuZC5oYXJkLnNwZWVkID0gYW1pZ2FfY29sb3JjbG9jay8ocGVyaW9kKzEpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJY3VzdG9tLmF1ZFtpXS5hdWRwZXIgPSBwZXJpb2Q7CisJYW1pZ2FfYXVkaW9fcGVyaW9kID0gcGVyaW9kOworfQorCisKK3N0YXRpYyBpbnQgQW1pU2V0Rm9ybWF0KGludCBmb3JtYXQpCit7CisJaW50IHNpemU7CisKKwkvKiBBbWlnYSBzb3VuZCBETUEgc3VwcG9ydHMgOGJpdCBhbmQgMTZiaXQgKHBzZXVkbyAxNCBiaXQpIG1vZGVzICovCisKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgQUZNVF9RVUVSWToKKwkJcmV0dXJuIGRtYXNvdW5kLnNvZnQuZm9ybWF0OworCWNhc2UgQUZNVF9NVV9MQVc6CisJY2FzZSBBRk1UX0FfTEFXOgorCWNhc2UgQUZNVF9VODoKKwljYXNlIEFGTVRfUzg6CisJCXNpemUgPSA4OworCQlicmVhazsKKwljYXNlIEFGTVRfUzE2X0JFOgorCWNhc2UgQUZNVF9VMTZfQkU6CisJY2FzZSBBRk1UX1MxNl9MRToKKwljYXNlIEFGTVRfVTE2X0xFOgorCQlzaXplID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIDotKSAqLworCQlzaXplID0gODsKKwkJZm9ybWF0ID0gQUZNVF9TODsKKwl9CisKKwlkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9IGZvcm1hdDsKKwlkbWFzb3VuZC5zb2Z0LnNpemUgPSBzaXplOworCWlmIChkbWFzb3VuZC5taW5EZXYgPT0gU05EX0RFVl9EU1ApIHsKKwkJZG1hc291bmQuZHNwLmZvcm1hdCA9IGZvcm1hdDsKKwkJZG1hc291bmQuZHNwLnNpemUgPSBkbWFzb3VuZC5zb2Z0LnNpemU7CisJfQorCUFtaUluaXQoKTsKKworCXJldHVybiBmb3JtYXQ7Cit9CisKKworI2RlZmluZSBWT0xVTUVfVk9YV0FSRV9UT19BTUkodikgXAorCSgoKHYpIDwgMCkgPyAwIDogKCh2KSA+IDEwMCkgPyA2NCA6ICgodikgKiA2NCkvMTAwKQorI2RlZmluZSBWT0xVTUVfQU1JX1RPX1ZPWFdBUkUodikgKCh2KSoxMDAvNjQpCisKK3N0YXRpYyBpbnQgQW1pU2V0Vm9sdW1lKGludCB2b2x1bWUpCit7CisJZG1hc291bmQudm9sdW1lX2xlZnQgPSBWT0xVTUVfVk9YV0FSRV9UT19BTUkodm9sdW1lICYgMHhmZik7CisJY3VzdG9tLmF1ZFswXS5hdWR2b2wgPSBkbWFzb3VuZC52b2x1bWVfbGVmdDsKKwlkbWFzb3VuZC52b2x1bWVfcmlnaHQgPSBWT0xVTUVfVk9YV0FSRV9UT19BTUkoKHZvbHVtZSAmIDB4ZmYwMCkgPj4gOCk7CisJY3VzdG9tLmF1ZFsxXS5hdWR2b2wgPSBkbWFzb3VuZC52b2x1bWVfcmlnaHQ7CisJaWYgKGRtYXNvdW5kLmhhcmQuc2l6ZSA9PSAxNikgeworCQlpZiAoZG1hc291bmQudm9sdW1lX2xlZnQgPT0gNjQgJiYgZG1hc291bmQudm9sdW1lX3JpZ2h0ID09IDY0KSB7CisJCQljdXN0b20uYXVkWzJdLmF1ZHZvbCA9IDE7CisJCQljdXN0b20uYXVkWzNdLmF1ZHZvbCA9IDE7CisJCX0gZWxzZSB7CisJCQljdXN0b20uYXVkWzJdLmF1ZHZvbCA9IDA7CisJCQljdXN0b20uYXVkWzNdLmF1ZHZvbCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIFZPTFVNRV9BTUlfVE9fVk9YV0FSRShkbWFzb3VuZC52b2x1bWVfbGVmdCkgfAorCSAgICAgICAoVk9MVU1FX0FNSV9UT19WT1hXQVJFKGRtYXNvdW5kLnZvbHVtZV9yaWdodCkgPDwgOCk7Cit9CisKK3N0YXRpYyBpbnQgQW1pU2V0VHJlYmxlKGludCB0cmVibGUpCit7CisJZG1hc291bmQudHJlYmxlID0gdHJlYmxlOworCWlmICh0cmVibGUgPCA1MCkKKwkJY2lhYS5wcmEgJj0gfjB4MDI7CisJZWxzZQorCQljaWFhLnByYSB8PSAweDAyOworCXJldHVybiB0cmVibGU7Cit9CisKKworI2RlZmluZSBBTUlfUExBWV9MT0FERUQJCTEKKyNkZWZpbmUgQU1JX1BMQVlfUExBWUlORwkyCisjZGVmaW5lIEFNSV9QTEFZX01BU0sJCTMKKworCitzdGF0aWMgdm9pZCBBbWlQbGF5TmV4dEZyYW1lKGludCBpbmRleCkKK3sKKwl1X2NoYXIgKnN0YXJ0LCAqY2gwLCAqY2gxLCAqY2gyLCAqY2gzOworCXVfbG9uZyBzaXplOworCisJLyogdXNlZCBieSBBbWlQbGF5KCkgaWYgYWxsIGRvdWJ0cyB3aGV0aGVyIHRoZXJlIHJlYWxseSBpcyBzb21ldGhpbmcKKwkgKiB0byBiZSBwbGF5ZWQgYXJlIGFscmVhZHkgd2lwZWQgb3V0LgorCSAqLworCXN0YXJ0ID0gd3JpdGVfc3EuYnVmZmVyc1t3cml0ZV9zcS5mcm9udF07CisJc2l6ZSA9ICh3cml0ZV9zcS5jb3VudCA9PSBpbmRleCA/IHdyaXRlX3NxLnJlYXJfc2l6ZQorCQkJCQk6IHdyaXRlX3NxLmJsb2NrX3NpemUpPj4xOworCisJaWYgKGRtYXNvdW5kLmhhcmQuc3RlcmVvKSB7CisJCWNoMCA9IHN0YXJ0OworCQljaDEgPSBzdGFydCt3cml0ZV9zcV9ibG9ja19zaXplX2hhbGY7CisJCXNpemUgPj49IDE7CisJfSBlbHNlIHsKKwkJY2gwID0gc3RhcnQ7CisJCWNoMSA9IHN0YXJ0OworCX0KKworCWRpc2FibGVfaGVhcnRiZWF0KCk7CisJY3VzdG9tLmF1ZFswXS5hdWR2b2wgPSBkbWFzb3VuZC52b2x1bWVfbGVmdDsKKwljdXN0b20uYXVkWzFdLmF1ZHZvbCA9IGRtYXNvdW5kLnZvbHVtZV9yaWdodDsKKwlpZiAoZG1hc291bmQuaGFyZC5zaXplID09IDgpIHsKKwkJY3VzdG9tLmF1ZFswXS5hdWRsYyA9ICh1X3Nob3J0ICopWlRXT19QQUREUihjaDApOworCQljdXN0b20uYXVkWzBdLmF1ZGxlbiA9IHNpemU7CisJCWN1c3RvbS5hdWRbMV0uYXVkbGMgPSAodV9zaG9ydCAqKVpUV09fUEFERFIoY2gxKTsKKwkJY3VzdG9tLmF1ZFsxXS5hdWRsZW4gPSBzaXplOworCQljdXN0b20uZG1hY29uID0gQU1JX0FVRElPXzg7CisJfSBlbHNlIHsKKwkJc2l6ZSA+Pj0gMTsKKwkJY3VzdG9tLmF1ZFswXS5hdWRsYyA9ICh1X3Nob3J0ICopWlRXT19QQUREUihjaDApOworCQljdXN0b20uYXVkWzBdLmF1ZGxlbiA9IHNpemU7CisJCWN1c3RvbS5hdWRbMV0uYXVkbGMgPSAodV9zaG9ydCAqKVpUV09fUEFERFIoY2gxKTsKKwkJY3VzdG9tLmF1ZFsxXS5hdWRsZW4gPSBzaXplOworCQlpZiAoZG1hc291bmQudm9sdW1lX2xlZnQgPT0gNjQgJiYgZG1hc291bmQudm9sdW1lX3JpZ2h0ID09IDY0KSB7CisJCQkvKiBXZSBjYW4gcGxheSBwc2V1ZG8gMTQtYml0IG9ubHkgd2l0aCB0aGUgbWF4aW11bSB2b2x1bWUgKi8KKwkJCWNoMyA9IGNoMCt3cml0ZV9zcV9ibG9ja19zaXplX3F1YXJ0ZXI7CisJCQljaDIgPSBjaDErd3JpdGVfc3FfYmxvY2tfc2l6ZV9xdWFydGVyOworCQkJY3VzdG9tLmF1ZFsyXS5hdWR2b2wgPSAxOyAgLyogd2UgYXJlIGJlaW5nIGFmZmVjdGVkIGJ5IHRoZSBiZWVwcyAqLworCQkJY3VzdG9tLmF1ZFszXS5hdWR2b2wgPSAxOyAgLyogcmVzdG9yaW5nIHZvbHVtZSBoZXJlIGhlbHBzIGEgYml0ICovCisJCQljdXN0b20uYXVkWzJdLmF1ZGxjID0gKHVfc2hvcnQgKilaVFdPX1BBRERSKGNoMik7CisJCQljdXN0b20uYXVkWzJdLmF1ZGxlbiA9IHNpemU7CisJCQljdXN0b20uYXVkWzNdLmF1ZGxjID0gKHVfc2hvcnQgKilaVFdPX1BBRERSKGNoMyk7CisJCQljdXN0b20uYXVkWzNdLmF1ZGxlbiA9IHNpemU7CisJCQljdXN0b20uZG1hY29uID0gQU1JX0FVRElPXzE0OworCQl9IGVsc2UgeworCQkJY3VzdG9tLmF1ZFsyXS5hdWR2b2wgPSAwOworCQkJY3VzdG9tLmF1ZFszXS5hdWR2b2wgPSAwOworCQkJY3VzdG9tLmRtYWNvbiA9IEFNSV9BVURJT184OworCQl9CisJfQorCXdyaXRlX3NxLmZyb250ID0gKHdyaXRlX3NxLmZyb250KzEpICUgd3JpdGVfc3EubWF4X2NvdW50OworCXdyaXRlX3NxLmFjdGl2ZSB8PSBBTUlfUExBWV9MT0FERUQ7Cit9CisKKworc3RhdGljIHZvaWQgQW1pUGxheSh2b2lkKQoreworCWludCBtaW5mcmFtZXMgPSAxOworCisJY3VzdG9tLmludGVuYSA9IElGX0FVRDA7CisKKwlpZiAod3JpdGVfc3EuYWN0aXZlICYgQU1JX1BMQVlfTE9BREVEKSB7CisJCS8qIFRoZXJlJ3MgYWxyZWFkeSBhIGZyYW1lIGxvYWRlZCAqLworCQljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgSUZfQVVEMDsKKwkJcmV0dXJuOworCX0KKworCWlmICh3cml0ZV9zcS5hY3RpdmUgJiBBTUlfUExBWV9QTEFZSU5HKQorCQkvKiBJbmNyZWFzZSB0aHJlc2hvbGQ6IGZyYW1lIDEgaXMgYWxyZWFkeSBiZWluZyBwbGF5ZWQgKi8KKwkJbWluZnJhbWVzID0gMjsKKworCWlmICh3cml0ZV9zcS5jb3VudCA8IG1pbmZyYW1lcykgeworCQkvKiBOb3RoaW5nIHRvIGRvICovCisJCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9BVUQwOworCQlyZXR1cm47CisJfQorCisJaWYgKHdyaXRlX3NxLmNvdW50IDw9IG1pbmZyYW1lcyAmJgorCSAgICB3cml0ZV9zcS5yZWFyX3NpemUgPCB3cml0ZV9zcS5ibG9ja19zaXplICYmICF3cml0ZV9zcS5zeW5jaW5nKSB7CisJCS8qIGhtbW0sIHRoZSBvbmx5IGV4aXN0aW5nIGZyYW1lIGlzIG5vdAorCQkgKiB5ZXQgZmlsbGVkIGFuZCB3ZSdyZSBub3Qgc3luY2luZz8KKwkJICovCisJCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9BVUQwOworCQlyZXR1cm47CisJfQorCisJQW1pUGxheU5leHRGcmFtZShtaW5mcmFtZXMpOworCisJY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX0FVRDA7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IEFtaUludGVycnVwdChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCWludCBtaW5mcmFtZXMgPSAxOworCisJY3VzdG9tLmludGVuYSA9IElGX0FVRDA7CisKKwlpZiAoIXdyaXRlX3NxLmFjdGl2ZSkgeworCQkvKiBQbGF5aW5nIHdhcyBpbnRlcnJ1cHRlZCBhbmQgc3FfcmVzZXQoKSBoYXMgYWxyZWFkeSBjbGVhcmVkCisJCSAqIHRoZSBzcSB2YXJpYWJsZXMsIHNvIGJldHRlciBkb24ndCBkbyBhbnl0aGluZyBoZXJlLgorCQkgKi8KKwkJV0FLRV9VUCh3cml0ZV9zcS5zeW5jX3F1ZXVlKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmICh3cml0ZV9zcS5hY3RpdmUgJiBBTUlfUExBWV9QTEFZSU5HKSB7CisJCS8qIFdlJ3ZlIGp1c3QgZmluaXNoZWQgYSBmcmFtZSAqLworCQl3cml0ZV9zcS5jb3VudC0tOworCQlXQUtFX1VQKHdyaXRlX3NxLmFjdGlvbl9xdWV1ZSk7CisJfQorCisJaWYgKHdyaXRlX3NxLmFjdGl2ZSAmIEFNSV9QTEFZX0xPQURFRCkKKwkJLyogSW5jcmVhc2UgdGhyZXNob2xkOiBmcmFtZSAxIGlzIGFscmVhZHkgYmVpbmcgcGxheWVkICovCisJCW1pbmZyYW1lcyA9IDI7CisKKwkvKiBTaGlmdCB0aGUgZmxhZ3MgKi8KKwl3cml0ZV9zcS5hY3RpdmUgPSAod3JpdGVfc3EuYWN0aXZlPDwxKSAmIEFNSV9QTEFZX01BU0s7CisKKwlpZiAoIXdyaXRlX3NxLmFjdGl2ZSkKKwkJLyogTm8gZnJhbWUgaXMgcGxheWluZywgZGlzYWJsZSBhdWRpbyBETUEgKi8KKwkJU3RvcERNQSgpOworCisJY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX0FVRDA7CisKKwlpZiAod3JpdGVfc3EuY291bnQgPj0gbWluZnJhbWVzKQorCQkvKiBUcnkgdG8gcGxheSB0aGUgbmV4dCBmcmFtZSAqLworCQlBbWlQbGF5KCk7CisKKwlpZiAoIXdyaXRlX3NxLmFjdGl2ZSkKKwkJLyogTm90aGluZyB0byBwbGF5IGFueW1vcmUuCisJCSAgIFdha2UgdXAgYSBwcm9jZXNzIHdhaXRpbmcgZm9yIGF1ZGlvIG91dHB1dCB0byBkcmFpbi4gKi8KKwkJV0FLRV9VUCh3cml0ZV9zcS5zeW5jX3F1ZXVlKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKiogTWlkIGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorICogL2Rldi9taXhlciBhYnN0cmFjdGlvbgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBBbWlNaXhlckluaXQodm9pZCkKK3sKKwlkbWFzb3VuZC52b2x1bWVfbGVmdCA9IDY0OworCWRtYXNvdW5kLnZvbHVtZV9yaWdodCA9IDY0OworCWN1c3RvbS5hdWRbMF0uYXVkdm9sID0gZG1hc291bmQudm9sdW1lX2xlZnQ7CisJY3VzdG9tLmF1ZFszXS5hdWR2b2wgPSAxOwkvKiBGb3IgcHNldWRvIDE0Yml0ICovCisJY3VzdG9tLmF1ZFsxXS5hdWR2b2wgPSBkbWFzb3VuZC52b2x1bWVfcmlnaHQ7CisJY3VzdG9tLmF1ZFsyXS5hdWR2b2wgPSAxOwkvKiBGb3IgcHNldWRvIDE0Yml0ICovCisJZG1hc291bmQudHJlYmxlID0gNTA7Cit9CisKK3N0YXRpYyBpbnQgQW1pTWl4ZXJJb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisJaW50IGRhdGE7CisJc3dpdGNoIChjbWQpIHsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0s6CisJCSAgICByZXR1cm4gSU9DVExfT1VUKGFyZywgU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX1RSRUJMRSk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNNQVNLOgorCQkgICAgcmV0dXJuIElPQ1RMX09VVChhcmcsIDApOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUzoKKwkJICAgIHJldHVybiBJT0NUTF9PVVQoYXJnLCBTT1VORF9NQVNLX1ZPTFVNRSk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU6CisJCSAgICByZXR1cm4gSU9DVExfT1VUKGFyZywKKwkJCSAgICBWT0xVTUVfQU1JX1RPX1ZPWFdBUkUoZG1hc291bmQudm9sdW1lX2xlZnQpIHwKKwkJCSAgICBWT0xVTUVfQU1JX1RPX1ZPWFdBUkUoZG1hc291bmQudm9sdW1lX3JpZ2h0KSA8PCA4KTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUU6CisJCSAgICBJT0NUTF9JTihhcmcsIGRhdGEpOworCQkgICAgcmV0dXJuIElPQ1RMX09VVChhcmcsIGRtYXNvdW5kX3NldF92b2x1bWUoZGF0YSkpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfVFJFQkxFOgorCQkgICAgcmV0dXJuIElPQ1RMX09VVChhcmcsIGRtYXNvdW5kLnRyZWJsZSk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVFJFQkxFOgorCQkgICAgSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJICAgIHJldHVybiBJT0NUTF9PVVQoYXJnLCBkbWFzb3VuZF9zZXRfdHJlYmxlKGRhdGEpKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworc3RhdGljIGludCBBbWlXcml0ZVNxU2V0dXAodm9pZCkKK3sKKwl3cml0ZV9zcV9ibG9ja19zaXplX2hhbGYgPSB3cml0ZV9zcS5ibG9ja19zaXplPj4xOworCXdyaXRlX3NxX2Jsb2NrX3NpemVfcXVhcnRlciA9IHdyaXRlX3NxX2Jsb2NrX3NpemVfaGFsZj4+MTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IEFtaVN0YXRlSW5mbyhjaGFyICpidWZmZXIsIHNpemVfdCBzcGFjZSkKK3sKKwlpbnQgbGVuID0gMDsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXHRzb3VuZC52b2x1bWVfbGVmdCA9ICVkIFswLi4uNjRdXG4iLAorCQkgICAgICAgZG1hc291bmQudm9sdW1lX2xlZnQpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcdHNvdW5kLnZvbHVtZV9yaWdodCA9ICVkIFswLi4uNjRdXG4iLAorCQkgICAgICAgZG1hc291bmQudm9sdW1lX3JpZ2h0KTsKKwlpZiAobGVuID49IHNwYWNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hc291bmRfcGF1bGE6IG92ZXJsb3dlZCBzdGF0ZSBidWZmZXIgYWxsb2MuXG4iKSA7CisJCWxlbiA9IHNwYWNlIDsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworCisvKioqIE1hY2hpbmUgZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBTRVRUSU5HUyBkZWZfaGFyZCA9IHsKKwkuZm9ybWF0CT0gQUZNVF9TOCwKKwkuc3RlcmVvCT0gMCwKKwkuc2l6ZQk9IDgsCisJLnNwZWVkCT0gODAwMAorfSA7CisKK3N0YXRpYyBTRVRUSU5HUyBkZWZfc29mdCA9IHsKKwkuZm9ybWF0CT0gQUZNVF9VOCwKKwkuc3RlcmVvCT0gMCwKKwkuc2l6ZQk9IDgsCisJLnNwZWVkCT0gODAwMAorfSA7CisKK3N0YXRpYyBNQUNISU5FIG1hY2hBbWlnYSA9IHsKKwkubmFtZQkJPSAiQW1pZ2EiLAorCS5uYW1lMgkJPSAiQU1JR0EiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZG1hX2FsbG9jCT0gQW1pQWxsb2MsCisJLmRtYV9mcmVlCT0gQW1pRnJlZSwKKwkuaXJxaW5pdAk9IEFtaUlycUluaXQsCisjaWZkZWYgTU9EVUxFCisJLmlycWNsZWFudXAJPSBBbWlJcnFDbGVhblVwLAorI2VuZGlmIC8qIE1PRFVMRSAqLworCS5pbml0CQk9IEFtaUluaXQsCisJLnNpbGVuY2UJPSBBbWlTaWxlbmNlLAorCS5zZXRGb3JtYXQJPSBBbWlTZXRGb3JtYXQsCisJLnNldFZvbHVtZQk9IEFtaVNldFZvbHVtZSwKKwkuc2V0VHJlYmxlCT0gQW1pU2V0VHJlYmxlLAorCS5wbGF5CQk9IEFtaVBsYXksCisJLm1peGVyX2luaXQJPSBBbWlNaXhlckluaXQsCisJLm1peGVyX2lvY3RsCT0gQW1pTWl4ZXJJb2N0bCwKKwkud3JpdGVfc3Ffc2V0dXAJPSBBbWlXcml0ZVNxU2V0dXAsCisJLnN0YXRlX2luZm8JPSBBbWlTdGF0ZUluZm8sCisJLm1pbl9kc3Bfc3BlZWQJPSA4MDAwLAorCS52ZXJzaW9uCT0gKChETUFTT1VORF9QQVVMQV9SRVZJU0lPTjw8OCkgfCBETUFTT1VORF9QQVVMQV9FRElUSU9OKSwKKwkuaGFyZHdhcmVfYWZtdHMJPSAoQUZNVF9TOCB8IEFGTVRfUzE2X0JFKSwgLyogaCd3YXJlLXN1cHBvcnRlZCBmb3JtYXRzICpvbmx5KiBoZXJlICovCisJLmNhcGFiaWxpdGllcwk9IERTUF9DQVBfQkFUQ0ggICAgICAgICAgLyogQXMgcGVyIFNORENUTF9EU1BfR0VUQ0FQUyAqLworfTsKKworCisvKioqIENvbmZpZyAmIFNldHVwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW50IF9faW5pdCBkbWFzb3VuZF9wYXVsYV9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWlmIChNQUNIX0lTX0FNSUdBICYmIEFNSUdBSFdfUFJFU0VOVChBTUlfQVVESU8pKSB7CisJICAgIGlmICghcmVxdWVzdF9tZW1fcmVnaW9uKENVU1RPTV9QSFlTQUREUisweGEwLCAweDQwLAorCQkJCSAgICAiZG1hc291bmQgW1BhdWxhXSIpKQorCQlyZXR1cm4gLUVCVVNZOworCSAgICBkbWFzb3VuZC5tYWNoID0gbWFjaEFtaWdhOworCSAgICBkbWFzb3VuZC5tYWNoLmRlZmF1bHRfaGFyZCA9IGRlZl9oYXJkIDsKKwkgICAgZG1hc291bmQubWFjaC5kZWZhdWx0X3NvZnQgPSBkZWZfc29mdCA7CisJICAgIGVyciA9IGRtYXNvdW5kX2luaXQoKTsKKwkgICAgaWYgKGVycikKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKENVU1RPTV9QSFlTQUREUisweGEwLCAweDQwKTsKKwkgICAgcmV0dXJuIGVycjsKKwl9IGVsc2UKKwkgICAgcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkbWFzb3VuZF9wYXVsYV9jbGVhbnVwKHZvaWQpCit7CisJZG1hc291bmRfZGVpbml0KCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKENVU1RPTV9QSFlTQUREUisweGEwLCAweDQwKTsKK30KKworbW9kdWxlX2luaXQoZG1hc291bmRfcGF1bGFfaW5pdCk7Cittb2R1bGVfZXhpdChkbWFzb3VuZF9wYXVsYV9jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9xNDAuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9xNDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmMyNWEwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3E0MC5jCkBAIC0wLDAgKzEsNjM0IEBACisvKgorICogIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9xNDAuYworICoKKyAqICBRNDAgRE1BIFNvdW5kIERyaXZlcgorICoKKyAqICBTZWUgbGludXgvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2NvcmUuYyBmb3IgY29weXJpZ2h0IGFuZCBjcmVkaXRzCisgKiAgcHJpb3IgdG8gMjgvMDEvMjAwMQorICoKKyAqICAyOC8wMS8yMDAxIFswLjFdIElhaW4gU2FuZG9lCisgKgkJICAgICAtIGFkZGVkIHZlcnNpb25pbmcKKyAqCQkgICAgIC0gcHV0IGluIGFuZCBwb3B1bGF0ZWQgdGhlIGhhcmR3YXJlX2FmbXRzIGZpZWxkLgorICogICAgICAgICAgICAgWzAuMl0gLSBwdXQgaW4gU05EQ1RMX0RTUF9HRVRDQVBTIHZhbHVlLgorICoJICAgICAgIFswLjNdIC0gcHV0IGluIGRlZmF1bHQgaGFyZC9zb2Z0IHNldHRpbmdzLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9xNDBpbnRzLmg+CisjaW5jbHVkZSA8YXNtL3E0MF9tYXN0ZXIuaD4KKworI2luY2x1ZGUgImRtYXNvdW5kLmgiCisKKyNkZWZpbmUgRE1BU09VTkRfUTQwX1JFVklTSU9OIDAKKyNkZWZpbmUgRE1BU09VTkRfUTQwX0VESVRJT04gMworCitzdGF0aWMgaW50IGV4cGFuZF9iYWw7CS8qIEJhbGFuY2UgZmFjdG9yIGZvciBleHBhbmRpbmcgKG5vdCB2b2x1bWUhKSAqLworc3RhdGljIGludCBleHBhbmRfZGF0YTsJLyogRGF0YSBmb3IgZXhwYW5kaW5nICovCisKKworLyoqKiBMb3cgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyB2b2lkICpRNDBBbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKTsKK3N0YXRpYyB2b2lkIFE0MEZyZWUodm9pZCAqLCB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCBRNDBJcnFJbml0KHZvaWQpOworI2lmZGVmIE1PRFVMRQorc3RhdGljIHZvaWQgUTQwSXJxQ2xlYW5VcCh2b2lkKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgUTQwU2lsZW5jZSh2b2lkKTsKK3N0YXRpYyB2b2lkIFE0MEluaXQodm9pZCk7CitzdGF0aWMgaW50IFE0MFNldEZvcm1hdChpbnQgZm9ybWF0KTsKK3N0YXRpYyBpbnQgUTQwU2V0Vm9sdW1lKGludCB2b2x1bWUpOworc3RhdGljIHZvaWQgUTQwUGxheU5leHRGcmFtZShpbnQgaW5kZXgpOworc3RhdGljIHZvaWQgUTQwUGxheSh2b2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBRNDBTdGVyZW9JbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgUTQwTW9ub0ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKK3N0YXRpYyB2b2lkIFE0MEludGVycnVwdCh2b2lkKTsKKworCisvKioqIE1pZCBsZXZlbCBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvKiB1c2VyQ291bnQsIGZyYW1lVXNlZCwgZnJhbWVMZWZ0ID09IGJ5dGUgY291bnRzICovCitzdGF0aWMgc3NpemVfdCBxNDBfY3RfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwljaGFyICp0YWJsZSA9IGRtYXNvdW5kLnNvZnQuZm9ybWF0ID09IEFGTVRfTVVfTEFXID8gZG1hc291bmRfdWxhdzJkbWE4OiBkbWFzb3VuZF9hbGF3MmRtYTg7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwl1X2NoYXIgKnAgPSAodV9jaGFyICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKworCXVzZWQgPSBjb3VudCA9IG1pbl90KHNpemVfdCwgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCWlmIChjb3B5X2Zyb21fdXNlcihwLHVzZXJQdHIsY291bnQpKQorCSAgcmV0dXJuIC1FRkFVTFQ7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkqcCA9IHRhYmxlWypwXSsxMjg7CisJCXArKzsKKwkJY291bnQtLTsKKwl9CisJKmZyYW1lVXNlZCArPSB1c2VkIDsKKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBxNDBfY3RfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90IGNvdW50LCB1c2VkOworCXVfY2hhciAqcCA9ICh1X2NoYXIgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCisJdXNlZCA9IGNvdW50ID0gbWluX3Qoc2l6ZV90LCB1c2VyQ291bnQsIGZyYW1lTGVmdCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKHAsdXNlclB0cixjb3VudCkpCisJICByZXR1cm4gLUVGQVVMVDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCSpwID0gKnAgKyAxMjg7CisJCXArKzsKKwkJY291bnQtLTsKKwl9CisJKmZyYW1lVXNlZCArPSB1c2VkOworCXJldHVybiB1c2VkOworfQorCitzdGF0aWMgc3NpemVfdCBxNDBfY3RfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90IGNvdW50LCB1c2VkOworCXVfY2hhciAqcCA9ICh1X2NoYXIgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCisJdXNlZCA9IGNvdW50ID0gbWluX3Qoc2l6ZV90LCB1c2VyQ291bnQsIGZyYW1lTGVmdCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKHAsdXNlclB0cixjb3VudCkpCisJICByZXR1cm4gLUVGQVVMVDsKKwkqZnJhbWVVc2VkICs9IHVzZWQ7CisJcmV0dXJuIHVzZWQ7Cit9CisKKworLyogYSBiaXQgdG9vIGNvbXBsaWNhdGVkIHRvIG9wdGltaXNlIHJpZ2h0IG5vdyAuLiovCitzdGF0aWMgc3NpemVfdCBxNDBfY3R4X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwl1bnNpZ25lZCBjaGFyICp0YWJsZSA9ICh1bnNpZ25lZCBjaGFyICopCisJCShkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9PSBBRk1UX01VX0xBVyA/IGRtYXNvdW5kX3VsYXcyZG1hODogZG1hc291bmRfYWxhdzJkbWE4KTsKKwl1bnNpZ25lZCBpbnQgZGF0YSA9IGV4cGFuZF9kYXRhOworCXVfY2hhciAqcCA9ICh1X2NoYXIgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCWludCBiYWwgPSBleHBhbmRfYmFsOworCWludCBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCWludCB1dG90YWwsIGZ0b3RhbDsKKworCWZ0b3RhbCA9IGZyYW1lTGVmdDsKKwl1dG90YWwgPSB1c2VyQ291bnQ7CisJd2hpbGUgKGZyYW1lTGVmdCkgeworCQl1X2NoYXIgYzsKKwkJaWYgKGJhbCA8IDApIHsKKwkJCWlmICh1c2VyQ291bnQgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChnZXRfdXNlcihjLCB1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZGF0YSA9IHRhYmxlW2NdOworCQkJZGF0YSArPSAweDgwOworCQkJdXNlckNvdW50LS07CisJCQliYWwgKz0gaFNwZWVkOworCQl9CisJCSpwKysgPSBkYXRhOworCQlmcmFtZUxlZnQtLTsKKwkJYmFsIC09IHNTcGVlZDsKKwl9CisJZXhwYW5kX2JhbCA9IGJhbDsKKwlleHBhbmRfZGF0YSA9IGRhdGE7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KTsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiB1dG90YWw7Cit9CisKKworc3RhdGljIHNzaXplX3QgcTQwX2N0eF9zOChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJdV9jaGFyICpwID0gKHVfY2hhciAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJdW5zaWduZWQgaW50IGRhdGEgPSBleHBhbmRfZGF0YTsKKwlpbnQgYmFsID0gZXhwYW5kX2JhbDsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisKKworCWZ0b3RhbCA9IGZyYW1lTGVmdDsKKwl1dG90YWwgPSB1c2VyQ291bnQ7CisJd2hpbGUgKGZyYW1lTGVmdCkgeworCQl1X2NoYXIgYzsKKwkJaWYgKGJhbCA8IDApIHsKKwkJCWlmICh1c2VyQ291bnQgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChnZXRfdXNlcihjLCB1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZGF0YSA9IGMgOworCQkJZGF0YSArPSAweDgwOworCQkJdXNlckNvdW50LS07CisJCQliYWwgKz0gaFNwZWVkOworCQl9CisJCSpwKysgPSBkYXRhOworCQlmcmFtZUxlZnQtLTsKKwkJYmFsIC09IHNTcGVlZDsKKwl9CisJZXhwYW5kX2JhbCA9IGJhbDsKKwlleHBhbmRfZGF0YSA9IGRhdGE7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KTsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiB1dG90YWw7Cit9CisKKworc3RhdGljIHNzaXplX3QgcTQwX2N0eF91OChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJdV9jaGFyICpwID0gKHVfY2hhciAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJdW5zaWduZWQgaW50IGRhdGEgPSBleHBhbmRfZGF0YTsKKwlpbnQgYmFsID0gZXhwYW5kX2JhbDsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdV9jaGFyIGM7CisJCWlmIChiYWwgPCAwKSB7CisJCQlpZiAodXNlckNvdW50ID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSBjIDsKKwkJCXVzZXJDb3VudC0tOworCQkJYmFsICs9IGhTcGVlZDsKKwkJfQorCQkqcCsrID0gZGF0YTsKKwkJZnJhbWVMZWZ0LS07CisJCWJhbCAtPSBzU3BlZWQ7CisJfQorCWV4cGFuZF9iYWwgPSBiYWw7CisJZXhwYW5kX2RhdGEgPSBkYXRhOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCkgOworCXV0b3RhbCAtPSB1c2VyQ291bnQ7CisJcmV0dXJuIHV0b3RhbDsKK30KKworLyogY29tcHJlc3NpbmcgdmVyc2lvbnMgKi8KK3N0YXRpYyBzc2l6ZV90IHE0MF9jdGNfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXVuc2lnbmVkIGNoYXIgKnRhYmxlID0gKHVuc2lnbmVkIGNoYXIgKikKKwkJKGRtYXNvdW5kLnNvZnQuZm9ybWF0ID09IEFGTVRfTVVfTEFXID8gZG1hc291bmRfdWxhdzJkbWE4OiBkbWFzb3VuZF9hbGF3MmRtYTgpOworCXVuc2lnbmVkIGludCBkYXRhID0gZXhwYW5kX2RhdGE7CisJdV9jaGFyICpwID0gKHVfY2hhciAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJaW50IGJhbCA9IGV4cGFuZF9iYWw7CisJaW50IGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJaW50IHV0b3RhbCwgZnRvdGFsOworIAorCWZ0b3RhbCA9IGZyYW1lTGVmdDsKKwl1dG90YWwgPSB1c2VyQ291bnQ7CisJd2hpbGUgKGZyYW1lTGVmdCkgeworCQl1X2NoYXIgYzsKKwkJd2hpbGUoYmFsPDApIHsKKwkJCWlmICh1c2VyQ291bnQgPT0gMCkKKwkJCQlnb3RvIGxvdXQ7CisJCQlpZiAoIShiYWw8KC1oU3BlZWQpKSkgeworCQkJCWlmIChnZXRfdXNlcihjLCB1c2VyUHRyKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IDB4ODAgKyB0YWJsZVtjXTsKKwkJCX0KKwkJCXVzZXJQdHIrKzsKKwkJCXVzZXJDb3VudC0tOworCQkJYmFsICs9IGhTcGVlZDsKKwkJfQorCQkqcCsrID0gZGF0YTsKKwkJZnJhbWVMZWZ0LS07CisJCWJhbCAtPSBzU3BlZWQ7CisJfQorIGxvdXQ6CisJZXhwYW5kX2JhbCA9IGJhbDsKKwlleHBhbmRfZGF0YSA9IGRhdGE7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KTsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiB1dG90YWw7Cit9CisKKworc3RhdGljIHNzaXplX3QgcTQwX2N0Y19zOChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJdV9jaGFyICpwID0gKHVfY2hhciAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJdW5zaWduZWQgaW50IGRhdGEgPSBleHBhbmRfZGF0YTsKKwlpbnQgYmFsID0gZXhwYW5kX2JhbDsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdV9jaGFyIGM7CisJCXdoaWxlIChiYWwgPCAwKSB7CisJCQlpZiAodXNlckNvdW50ID09IDApCisJCQkJZ290byBsb3V0OworCQkJaWYgKCEoYmFsPCgtaFNwZWVkKSkpIHsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgPSBjICsgMHg4MDsKKwkJCX0KKwkJCXVzZXJQdHIrKzsKKwkJCXVzZXJDb3VudC0tOworCQkJYmFsICs9IGhTcGVlZDsKKwkJfQorCQkqcCsrID0gZGF0YTsKKwkJZnJhbWVMZWZ0LS07CisJCWJhbCAtPSBzU3BlZWQ7CisJfQorIGxvdXQ6CisJZXhwYW5kX2JhbCA9IGJhbDsKKwlleHBhbmRfZGF0YSA9IGRhdGE7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KTsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiB1dG90YWw7Cit9CisKKworc3RhdGljIHNzaXplX3QgcTQwX2N0Y191OChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJdV9jaGFyICpwID0gKHVfY2hhciAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJdW5zaWduZWQgaW50IGRhdGEgPSBleHBhbmRfZGF0YTsKKwlpbnQgYmFsID0gZXhwYW5kX2JhbDsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdV9jaGFyIGM7CisJCXdoaWxlIChiYWwgPCAwKSB7CisJCQlpZiAodXNlckNvdW50ID09IDApCisJCQkJZ290byBsb3V0OworCQkJaWYgKCEoYmFsPCgtaFNwZWVkKSkpIHsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgPSBjIDsKKwkJCX0KKwkJCXVzZXJQdHIrKzsKKwkJCXVzZXJDb3VudC0tOworCQkJYmFsICs9IGhTcGVlZDsKKwkJfQorCQkqcCsrID0gZGF0YTsKKwkJZnJhbWVMZWZ0LS07CisJCWJhbCAtPSBzU3BlZWQ7CisJfQorIGxvdXQ6CisJZXhwYW5kX2JhbCA9IGJhbDsKKwlleHBhbmRfZGF0YSA9IGRhdGE7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KSA7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gdXRvdGFsOworfQorCisKK3N0YXRpYyBUUkFOUyB0cmFuc1E0ME5vcm1hbCA9IHsKKwlxNDBfY3RfbGF3LCBxNDBfY3RfbGF3LCBxNDBfY3RfczgsIHE0MF9jdF91OCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworc3RhdGljIFRSQU5TIHRyYW5zUTQwRXhwYW5kaW5nID0geworCXE0MF9jdHhfbGF3LCBxNDBfY3R4X2xhdywgcTQwX2N0eF9zOCwgcTQwX2N0eF91OCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworc3RhdGljIFRSQU5TIHRyYW5zUTQwQ29tcHJlc3NpbmcgPSB7CisJcTQwX2N0Y19sYXcsIHE0MF9jdGNfbGF3LCBxNDBfY3RjX3M4LCBxNDBfY3RjX3U4LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCit9OworCisKKy8qKiogTG93IGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgKlE0MEFsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MpCit7CisgICAgICAgICByZXR1cm4ga21hbGxvYyhzaXplLCBmbGFncyk7IC8qIGNoYW5nZSB0byB2bWFsbG9jICovCit9CisKK3N0YXRpYyB2b2lkIFE0MEZyZWUodm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlrZnJlZShwdHIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBRNDBJcnFJbml0KHZvaWQpCit7CisJLyogUmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIuICovCisJcmVxdWVzdF9pcnEoUTQwX0lSUV9TQU1QTEUsIFE0MFN0ZXJlb0ludGVycnVwdCwgMCwKKwkJICAgICJETUEgc291bmQiLCBRNDBJbnRlcnJ1cHQpOworCisJcmV0dXJuKDEpOworfQorCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyB2b2lkIFE0MElycUNsZWFuVXAodm9pZCkKK3sKKyAgICAgICAgbWFzdGVyX291dGIoMCxTQU1QTEVfRU5BQkxFX1JFRyk7CisJZnJlZV9pcnEoUTQwX0lSUV9TQU1QTEUsIFE0MEludGVycnVwdCk7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKKworc3RhdGljIHZvaWQgUTQwU2lsZW5jZSh2b2lkKQoreworICAgICAgICBtYXN0ZXJfb3V0YigwLFNBTVBMRV9FTkFCTEVfUkVHKTsKKwkqREFDX0xFRlQ9KkRBQ19SSUdIVD0xMjc7Cit9CisKK3N0YXRpYyBjaGFyICpxNDBfcHA7CitzdGF0aWMgdW5zaWduZWQgaW50IHE0MF9zYzsKKworc3RhdGljIHZvaWQgUTQwUGxheU5leHRGcmFtZShpbnQgaW5kZXgpCit7CisJdV9jaGFyICpzdGFydDsKKwl1X2xvbmcgc2l6ZTsKKwl1X2NoYXIgc3BlZWQ7CisKKwkvKiB1c2VkIGJ5IFE0MFBsYXkoKSBpZiBhbGwgZG91YnRzIHdoZXRoZXIgdGhlcmUgcmVhbGx5IGlzIHNvbWV0aGluZworCSAqIHRvIGJlIHBsYXllZCBhcmUgYWxyZWFkeSB3aXBlZCBvdXQuCisJICovCisJc3RhcnQgPSB3cml0ZV9zcS5idWZmZXJzW3dyaXRlX3NxLmZyb250XTsKKwlzaXplID0gKHdyaXRlX3NxLmNvdW50ID09IGluZGV4ID8gd3JpdGVfc3EucmVhcl9zaXplIDogd3JpdGVfc3EuYmxvY2tfc2l6ZSk7CisKKwlxNDBfcHA9c3RhcnQ7CisJcTQwX3NjPXNpemU7CisKKwl3cml0ZV9zcS5mcm9udCA9ICh3cml0ZV9zcS5mcm9udCsxKSAlIHdyaXRlX3NxLm1heF9jb3VudDsKKwl3cml0ZV9zcS5hY3RpdmUrKzsKKworCXNwZWVkPShkbWFzb3VuZC5oYXJkLnNwZWVkPT0xMDAwMCA/IDAgOiAxKTsKKworCW1hc3Rlcl9vdXRiKCAwLFNBTVBMRV9FTkFCTEVfUkVHKTsKKwlmcmVlX2lycShRNDBfSVJRX1NBTVBMRSwgUTQwSW50ZXJydXB0KTsKKwlpZiAoZG1hc291bmQuc29mdC5zdGVyZW8pCisJICAJcmVxdWVzdF9pcnEoUTQwX0lSUV9TQU1QTEUsIFE0MFN0ZXJlb0ludGVycnVwdCwgMCwKKwkJICAgICJRNDAgc291bmQiLCBRNDBJbnRlcnJ1cHQpOworCSAgZWxzZQorCSAgICAgICAgcmVxdWVzdF9pcnEoUTQwX0lSUV9TQU1QTEUsIFE0ME1vbm9JbnRlcnJ1cHQsIDAsCisJCSAgICAiUTQwIHNvdW5kIiwgUTQwSW50ZXJydXB0KTsKKworCW1hc3Rlcl9vdXRiKCBzcGVlZCwgU0FNUExFX1JBVEVfUkVHKTsKKwltYXN0ZXJfb3V0YiggMSxTQU1QTEVfQ0xFQVJfUkVHKTsKKwltYXN0ZXJfb3V0YiggMSxTQU1QTEVfRU5BQkxFX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIFE0MFBsYXkodm9pZCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh3cml0ZV9zcS5hY3RpdmUgfHwgd3JpdGVfc3EuY291bnQ8PTAgKSB7CisJCS8qIFRoZXJlJ3MgYWxyZWFkeSBhIGZyYW1lIGxvYWRlZCAqLworCQlyZXR1cm47CisJfQorCisJLyogbm90aGluZyBpbiB0aGUgcXVldWUgKi8KKwlpZiAod3JpdGVfc3EuY291bnQgPD0gMSAmJiB3cml0ZV9zcS5yZWFyX3NpemUgPCB3cml0ZV9zcS5ibG9ja19zaXplICYmICF3cml0ZV9zcS5zeW5jaW5nKSB7CisJICAgICAgICAgLyogaG1tbSwgdGhlIG9ubHkgZXhpc3RpbmcgZnJhbWUgaXMgbm90CisJCSAgKiB5ZXQgZmlsbGVkIGFuZCB3ZSdyZSBub3Qgc3luY2luZz8KKwkJICAqLworCSAgICAgICAgIHJldHVybjsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKwlRNDBQbGF5TmV4dEZyYW1lKDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IFE0MFN0ZXJlb0ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCXNwaW5fbG9jaygmZG1hc291bmQubG9jayk7CisgICAgICAgIGlmIChxNDBfc2M+MSl7CisgICAgICAgICAgICAqREFDX0xFRlQ9KnE0MF9wcCsrOworCSAgICAqREFDX1JJR0hUPSpxNDBfcHArKzsKKwkgICAgcTQwX3NjIC09MjsKKwkgICAgbWFzdGVyX291dGIoMSxTQU1QTEVfQ0xFQVJfUkVHKTsKKwl9ZWxzZSBRNDBJbnRlcnJ1cHQoKTsKKwlzcGluX3VubG9jaygmZG1hc291bmQubG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorc3RhdGljIGlycXJldHVybl90IFE0ME1vbm9JbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwlzcGluX2xvY2soJmRtYXNvdW5kLmxvY2spOworICAgICAgICBpZiAocTQwX3NjPjApeworICAgICAgICAgICAgKkRBQ19MRUZUPSpxNDBfcHA7CisJICAgICpEQUNfUklHSFQ9KnE0MF9wcCsrOworCSAgICBxNDBfc2MgLS07CisJICAgIG1hc3Rlcl9vdXRiKDEsU0FNUExFX0NMRUFSX1JFRyk7CisJfWVsc2UgUTQwSW50ZXJydXB0KCk7CisJc3Bpbl91bmxvY2soJmRtYXNvdW5kLmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KK3N0YXRpYyB2b2lkIFE0MEludGVycnVwdCh2b2lkKQoreworCWlmICghd3JpdGVfc3EuYWN0aXZlKSB7CisJICAgICAgICAgIC8qIHBsYXlpbmcgd2FzIGludGVycnVwdGVkIGFuZCBzcV9yZXNldCgpIGhhcyBhbHJlYWR5IGNsZWFyZWQKKwkJICAgKiB0aGUgc3EgdmFyaWFibGVzLCBzbyBiZXR0ZXIgZG9uJ3QgZG8gYW55dGhpbmcgaGVyZS4KKwkJICAgKi8KKwkgICAgICAgICAgIFdBS0VfVVAod3JpdGVfc3Euc3luY19xdWV1ZSk7CisJCSAgIG1hc3Rlcl9vdXRiKDAsU0FNUExFX0VOQUJMRV9SRUcpOyAvKiBiZXR0ZXIgc2FmZSAqLworCQkgICBnb3RvIGV4aXQ7CisJfSBlbHNlIHdyaXRlX3NxLmFjdGl2ZT0wOworCXdyaXRlX3NxLmNvdW50LS07CisJUTQwUGxheSgpOworCisJaWYgKHE0MF9zYzwyKQorCSAgICAgIHsgLyogdGhlcmUgd2FzIG5vdGhpbmcgdG8gcGxheSwgZGlzYWJsZSBpcnEgKi8KKwkJbWFzdGVyX291dGIoMCxTQU1QTEVfRU5BQkxFX1JFRyk7CisJCSpEQUNfTEVGVD0qREFDX1JJR0hUPTEyNzsKKwkgICAgICB9CisJV0FLRV9VUCh3cml0ZV9zcS5hY3Rpb25fcXVldWUpOworCisgZXhpdDoKKwltYXN0ZXJfb3V0YigxLFNBTVBMRV9DTEVBUl9SRUcpOworfQorCisKK3N0YXRpYyB2b2lkIFE0MEluaXQodm9pZCkKK3sKKwlpbnQgaSwgaWR4OworCWNvbnN0IGludCBmcmVxW10gPSB7MTAwMDAsIDIwMDAwfTsKKworCS8qIHNlYXJjaCBhIGZyZXF1ZW5jeSB0aGF0IGZpdHMgaW50byB0aGUgYWxsb3dlZCBlcnJvciByYW5nZSAqLworCisJaWR4ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJaWYgKCgxMDAgKiBhYnMoZG1hc291bmQuc29mdC5zcGVlZCAtIGZyZXFbaV0pIC8gZnJlcVtpXSkgPD0gY2F0Y2hSYWRpdXMpCisJCQlpZHggPSBpOworCisJZG1hc291bmQuaGFyZCA9IGRtYXNvdW5kLnNvZnQ7CisJLypzb3VuZC5oYXJkLnN0ZXJlbz0xOyovIC8qIG5vIGxvbmdlciB0cnVlICovCisJZG1hc291bmQuaGFyZC5zaXplPTg7CisKKwlpZiAoaWR4ID4gLTEpIHsKKwkJZG1hc291bmQuc29mdC5zcGVlZCA9IGZyZXFbaWR4XTsKKwkJZG1hc291bmQudHJhbnNfd3JpdGUgPSAmdHJhbnNRNDBOb3JtYWw7CisJfSBlbHNlCisJCWRtYXNvdW5kLnRyYW5zX3dyaXRlID0gJnRyYW5zUTQwRXhwYW5kaW5nOworCisJUTQwU2lsZW5jZSgpOworCisJaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiAyMDIwMCkgeworCQkvKiBzcXVlZXplIHRoZSBzb3VuZCwgd2UgZG8gdGhhdCAqLworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gMjAwMDA7CisJCWRtYXNvdW5kLnRyYW5zX3dyaXRlID0gJnRyYW5zUTQwQ29tcHJlc3Npbmc7CisJfSBlbHNlIGlmIChkbWFzb3VuZC5oYXJkLnNwZWVkID4gMTAwMDApIHsKKwkJZG1hc291bmQuaGFyZC5zcGVlZCA9IDIwMDAwOworCX0gZWxzZSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSAxMDAwMDsKKwl9CisJZXhwYW5kX2JhbCA9IC1kbWFzb3VuZC5zb2Z0LnNwZWVkOworfQorCisKK3N0YXRpYyBpbnQgUTQwU2V0Rm9ybWF0KGludCBmb3JtYXQpCit7CisJLyogUTQwIHNvdW5kIHN1cHBvcnRzIG9ubHkgOGJpdCBtb2RlcyAqLworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIEFGTVRfUVVFUlk6CisJCXJldHVybihkbWFzb3VuZC5zb2Z0LmZvcm1hdCk7CisJY2FzZSBBRk1UX01VX0xBVzoKKwljYXNlIEFGTVRfQV9MQVc6CisJY2FzZSBBRk1UX1M4OgorCWNhc2UgQUZNVF9VODoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZm9ybWF0ID0gQUZNVF9TODsKKwl9CisKKwlkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9IGZvcm1hdDsKKwlkbWFzb3VuZC5zb2Z0LnNpemUgPSA4OworCWlmIChkbWFzb3VuZC5taW5EZXYgPT0gU05EX0RFVl9EU1ApIHsKKwkJZG1hc291bmQuZHNwLmZvcm1hdCA9IGZvcm1hdDsKKwkJZG1hc291bmQuZHNwLnNpemUgPSA4OworCX0KKwlRNDBJbml0KCk7CisKKwlyZXR1cm4oZm9ybWF0KTsKK30KKworc3RhdGljIGludCBRNDBTZXRWb2x1bWUoaW50IHZvbHVtZSkKK3sKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqIE1hY2hpbmUgZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBTRVRUSU5HUyBkZWZfaGFyZCA9IHsKKwkuZm9ybWF0CT0gQUZNVF9VOCwKKwkuc3RlcmVvCT0gMCwKKwkuc2l6ZQk9IDgsCisJLnNwZWVkCT0gMTAwMDAKK30gOworCitzdGF0aWMgU0VUVElOR1MgZGVmX3NvZnQgPSB7CisJLmZvcm1hdAk9IEFGTVRfVTgsCisJLnN0ZXJlbwk9IDAsCisJLnNpemUJPSA4LAorCS5zcGVlZAk9IDgwMDAKK30gOworCitzdGF0aWMgTUFDSElORSBtYWNoUTQwID0geworCS5uYW1lCQk9ICJRNDAiLAorCS5uYW1lMgkJPSAiUTQwIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRtYV9hbGxvYwk9IFE0MEFsbG9jLAorCS5kbWFfZnJlZQk9IFE0MEZyZWUsCisJLmlycWluaXQJPSBRNDBJcnFJbml0LAorI2lmZGVmIE1PRFVMRQorCS5pcnFjbGVhbnVwCT0gUTQwSXJxQ2xlYW5VcCwKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwkuaW5pdAkJPSBRNDBJbml0LAorCS5zaWxlbmNlCT0gUTQwU2lsZW5jZSwKKwkuc2V0Rm9ybWF0CT0gUTQwU2V0Rm9ybWF0LAorCS5zZXRWb2x1bWUJPSBRNDBTZXRWb2x1bWUsCisJLnBsYXkJCT0gUTQwUGxheSwKKyAJLm1pbl9kc3Bfc3BlZWQJPSAxMDAwMCwKKwkudmVyc2lvbgk9ICgoRE1BU09VTkRfUTQwX1JFVklTSU9OPDw4KSB8IERNQVNPVU5EX1E0MF9FRElUSU9OKSwKKwkuaGFyZHdhcmVfYWZtdHMJPSBBRk1UX1U4LCAvKiBoJ3dhcmUtc3VwcG9ydGVkIGZvcm1hdHMgKm9ubHkqIGhlcmUgKi8KKwkuY2FwYWJpbGl0aWVzCT0gRFNQX0NBUF9CQVRDSCAgLyogQXMgcGVyIFNORENUTF9EU1BfR0VUQ0FQUyAqLworfTsKKworCisvKioqIENvbmZpZyAmIFNldHVwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW50IF9faW5pdCBkbWFzb3VuZF9xNDBfaW5pdCh2b2lkKQoreworCWlmIChNQUNIX0lTX1E0MCkgeworCSAgICBkbWFzb3VuZC5tYWNoID0gbWFjaFE0MDsKKwkgICAgZG1hc291bmQubWFjaC5kZWZhdWx0X2hhcmQgPSBkZWZfaGFyZCA7CisJICAgIGRtYXNvdW5kLm1hY2guZGVmYXVsdF9zb2Z0ID0gZGVmX3NvZnQgOworCSAgICByZXR1cm4gZG1hc291bmRfaW5pdCgpOworCX0gZWxzZQorCSAgICByZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRtYXNvdW5kX3E0MF9jbGVhbnVwKHZvaWQpCit7CisJZG1hc291bmRfZGVpbml0KCk7Cit9CisKK21vZHVsZV9pbml0KGRtYXNvdW5kX3E0MF9pbml0KTsKK21vZHVsZV9leGl0KGRtYXNvdW5kX3E0MF9jbGVhbnVwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJRNDAvUTYwIHNvdW5kIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDFjLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwMWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjI3YzlmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDFjLmMKQEAgLTAsMCArMSw4NTAgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBpMmMvaTJzIGJhc2VkIFRBMzAwNCBzb3VuZCBjaGlwIHVzZWQKKyAqIG9uIHNvbWUgQXBwbGUgaGFyZHdhcmUuIEFsc28ga25vd24gYXMgInNuYXBwZXIiLgorICoKKyAqIFRvYmlhcyBTYXJnZWFudCA8dG9iaWFzLnNhcmdlYW50QGJpZ3BvbmQuY29tPgorICogQmFzZWQgdXBvbiwgdGFzMzAwMWMuYyBieSBDaHJpc3RvcGhlciBDLiBDaGltZWxpcyA8Y2hyaXNAZGViaWFuLm9yZz46CisgKgorICogICBUT0RPOgorICogICAtLS0tLQorICogICAqIEVuYWJsZSBjb250cm9sIG92ZXIgaW5wdXQgbGluZSAyIChpcyB0aGlzIGNvbm5lY3RlZD8pCisgKiAgICogSW1wbGVtZW50IHNsZWVwIHN1cHBvcnQgKGF0IGxlYXN0IG11dGUgZXZlcnl0aGluZyBhbmQKKyAqICAgKiBzZXQgZ2FpbnMgdG8gbWluaW11bSBkdXJpbmcgc2xlZXApCisgKiAgICogTG9vayBpbnRvIHNvbWUgb2YgRGFyd2luJ3MgdHdlYWtzIHJlZ2FyZGluZyB0aGUgbXV0ZQorICogICAqIGxpbmVzIChkZWxheXMgJiBkaWZmZXJlbnQgYmVoYXZpb3VyIG9uIHNvbWUgSFcpCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworI2luY2x1ZGUgImRtYXNvdW5kLmgiCisjaW5jbHVkZSAidGFzX2NvbW1vbi5oIgorI2luY2x1ZGUgInRhczMwMDFjLmgiCisKKyNpbmNsdWRlICJ0YXNfaW9jdGwuaCIKKworI2RlZmluZSBUQVMzMDAxQ19CSVFVQURfRklMVEVSX0NPVU5UICA2CisjZGVmaW5lIFRBUzMwMDFDX0JJUVVBRF9DSEFOTkVMX0NPVU5UIDIKKworI2RlZmluZSBWT0xfREVGQVVMVAkoMTAwICogNCAvIDUpCisjZGVmaW5lIElOUFVUX0RFRkFVTFQJKDEwMCAqIDQgLyA1KQorI2RlZmluZSBCQVNTX0RFRkFVTFQJKDEwMCAvIDIpCisjZGVmaW5lIFRSRUJMRV9ERUZBVUxUCSgxMDAgLyAyKQorCitzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90IHsKKwlzdHJ1Y3QgdGFzX2RhdGFfdCBzdXBlcjsKKwlpbnQgZGV2aWNlX2lkOworCWludCBvdXRwdXRfaWQ7CisJaW50IHNwZWFrZXJfaWQ7CisJc3RydWN0IHRhc19kcmNlX3QgZHJjZV9zdGF0ZTsKK307CisKKworc3RhdGljIGNvbnN0IHVuaW9uIHRhc19iaXF1YWRfdAordGFzMzAwMWNfZXFfdW5pdHk9eworCS5idWYgPSB7IDB4MTAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCB9Cit9OworCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBkYl90b19yZWd2YWwoc2hvcnQgZGIpIHsKKwlpbnQgcj0wOworCisJcj0oZGIrMHg1OWEwKSAvIDB4NjA7CisKKwlpZiAociA8IDB4OTEpIHJldHVybiAweDkxOworCWlmIChyID4gMHhlZikgcmV0dXJuIDB4ZWY7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2hvcnQgcXVhbnRpemVfZGIoc2hvcnQgZGIpIHsKKwlyZXR1cm4gZGJfdG9fcmVndmFsKGRiKSAqIDB4NjAgLSAweDU5YTA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQKK3JlZ2lzdGVyX3dpZHRoKGVudW0gdGFzMzAwMWNfcmVnX3QgcikKK3sKKwlzd2l0Y2gocikgeworCWNhc2UgVEFTMzAwMUNfUkVHX01DUjoKKyAJY2FzZSBUQVMzMDAxQ19SRUdfVFJFQkxFOgorCWNhc2UgVEFTMzAwMUNfUkVHX0JBU1M6CisJCXJldHVybiAxOworCisJY2FzZSBUQVMzMDAxQ19SRUdfRFJDOgorCQlyZXR1cm4gMjsKKworCWNhc2UgVEFTMzAwMUNfUkVHX01JWEVSMToKKwljYXNlIFRBUzMwMDFDX1JFR19NSVhFUjI6CisJCXJldHVybiAzOworCisJY2FzZSBUQVMzMDAxQ19SRUdfVk9MVU1FOgorCQlyZXR1cm4gNjsKKworCWNhc2UgVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMDoKKwljYXNlIFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDE6CisJY2FzZSBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQyOgorCWNhc2UgVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMzoKKwljYXNlIFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDQ6CisJY2FzZSBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQ1OgorCWNhc2UgVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFENjoKKworCWNhc2UgVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDA6CisJY2FzZSBUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMToKKwljYXNlIFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQyOgorCWNhc2UgVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDM6CisJY2FzZSBUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFENDoKKwljYXNlIFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQ1OgorCWNhc2UgVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDY6CisJCXJldHVybiAxNTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludAordGFzMzAwMWNfd3JpdGVfcmVnaXN0ZXIoCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsCisJCQkJZW51bSB0YXMzMDAxY19yZWdfdCByZWdfbnVtLAorCQkJCWNoYXIgKmRhdGEsCisJCQkJdWludCB3cml0ZV9tb2RlKQoreworCWlmIChyZWdfbnVtPT1UQVMzMDAxQ19SRUdfTUNSIHx8CisJICAgIHJlZ19udW09PVRBUzMwMDFDX1JFR19CQVNTIHx8CisJICAgIHJlZ19udW09PVRBUzMwMDFDX1JFR19UUkVCTEUpIHsKKwkJcmV0dXJuIHRhc193cml0ZV9ieXRlX3JlZ2lzdGVyKCZzZWxmLT5zdXBlciwKKwkJCQkJICAgICAgICh1aW50KXJlZ19udW0sCisJCQkJCSAgICAgICAqZGF0YSwKKwkJCQkJICAgICAgIHdyaXRlX21vZGUpOworCX0gZWxzZSB7CisJCXJldHVybiB0YXNfd3JpdGVfcmVnaXN0ZXIoJnNlbGYtPnN1cGVyLAorCQkJCQkgICh1aW50KXJlZ19udW0sCisJCQkJCSAgcmVnaXN0ZXJfd2lkdGgocmVnX251bSksCisJCQkJCSAgZGF0YSwKKwkJCQkJICB3cml0ZV9tb2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX3N5bmNfcmVnaXN0ZXIoCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsCisJCQllbnVtIHRhczMwMDFjX3JlZ190IHJlZ19udW0pCit7CisJaWYgKHJlZ19udW09PVRBUzMwMDFDX1JFR19NQ1IgfHwKKwkgICAgcmVnX251bT09VEFTMzAwMUNfUkVHX0JBU1MgfHwKKwkgICAgcmVnX251bT09VEFTMzAwMUNfUkVHX1RSRUJMRSkgeworCQlyZXR1cm4gdGFzX3N5bmNfYnl0ZV9yZWdpc3Rlcigmc2VsZi0+c3VwZXIsCisJCQkJCSAgICAgICh1aW50KXJlZ19udW0sCisJCQkJCSAgICAgIHJlZ2lzdGVyX3dpZHRoKHJlZ19udW0pKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdGFzX3N5bmNfcmVnaXN0ZXIoJnNlbGYtPnN1cGVyLAorCQkJCQkgKHVpbnQpcmVnX251bSwKKwkJCQkJIHJlZ2lzdGVyX3dpZHRoKHJlZ19udW0pKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX3JlYWRfcmVnaXN0ZXIoCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsCisJCQllbnVtIHRhczMwMDFjX3JlZ190IHJlZ19udW0sCisJCQljaGFyICpkYXRhLAorCQkJdWludCB3cml0ZV9tb2RlKQoreworCXJldHVybiB0YXNfcmVhZF9yZWdpc3Rlcigmc2VsZi0+c3VwZXIsCisJCQkJICh1aW50KXJlZ19udW0sCisJCQkJIHJlZ2lzdGVyX3dpZHRoKHJlZ19udW0pLAorCQkJCSBkYXRhKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3RhczMwMDFjX2Zhc3RfbG9hZChzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLCBpbnQgZmFzdCkKK3sKKwlpZiAoZmFzdCkKKwkJc2VsZi0+c3VwZXIuc2hhZG93W1RBUzMwMDFDX1JFR19NQ1JdWzBdIHw9IDB4ODA7CisJZWxzZQorCQlzZWxmLT5zdXBlci5zaGFkb3dbVEFTMzAwMUNfUkVHX01DUl1bMF0gJj0gMHg3ZjsKKwlyZXR1cm4gdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19NQ1IpOworfQorCitzdGF0aWMgdWludAordGFzMzAwMWNfc3VwcG9ydGVkX21peGVycyhzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmKQoreworCXJldHVybiBTT1VORF9NQVNLX1ZPTFVNRSB8CisJCVNPVU5EX01BU0tfUENNIHwKKwkJU09VTkRfTUFTS19BTFRQQ00gfAorCQlTT1VORF9NQVNLX1RSRUJMRSB8CisJCVNPVU5EX01BU0tfQkFTUzsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfbWl4ZXJfaXNfc3RlcmVvKHN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsaW50IG1peGVyKQoreworCXN3aXRjaChtaXhlcikgeworCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB1aW50Cit0YXMzMDAxY19zdGVyZW9fbWl4ZXJzKHN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYpCit7CisJdWludCByPXRhczMwMDFjX3N1cHBvcnRlZF9taXhlcnMoc2VsZik7CisJdWludCBpOworCQorCWZvciAoaT0xOyBpPFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQlpZiAociYoMTw8aSkgJiYgIXRhczMwMDFjX21peGVyX2lzX3N0ZXJlbyhzZWxmLGkpKQorCQkJciAmPSB+KDE8PGkpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY19nZXRfbWl4ZXJfbGV2ZWwoc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZixpbnQgbWl4ZXIsdWludCAqbGV2ZWwpCit7CisJaWYgKCFzZWxmKQorCQlyZXR1cm4gLTE7CisJCQorCSpsZXZlbD1zZWxmLT5zdXBlci5taXhlclttaXhlcl07CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX3NldF9taXhlcl9sZXZlbChzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLGludCBtaXhlcix1aW50IGxldmVsKQoreworCWludCByYzsKKwl0YXNfc2hhZG93X3QgKnNoYWRvdzsKKworCXVpbnQgdGVtcDsKKwl1aW50IG9mZnNldD0wOworCisJaWYgKCFzZWxmKQorCQlyZXR1cm4gLTE7CisJCQorCXNoYWRvdz1zZWxmLT5zdXBlci5zaGFkb3c7CisKKwlpZiAoIXRhczMwMDFjX21peGVyX2lzX3N0ZXJlbyhzZWxmLG1peGVyKSkKKwkJbGV2ZWwgPSB0YXNfbW9ub190b19zdGVyZW8obGV2ZWwpOworCisJc3dpdGNoKG1peGVyKSB7CisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCXRlbXAgPSB0YXMzMDAxY19nYWluLm1hc3RlcltsZXZlbCYweGZmXTsKKwkJc2hhZG93W1RBUzMwMDFDX1JFR19WT0xVTUVdWzBdID0gKHRlbXAgPj4gMTYpICYgMHhmZjsKKwkJc2hhZG93W1RBUzMwMDFDX1JFR19WT0xVTUVdWzFdID0gKHRlbXAgPj4gOCkgICYgMHhmZjsKKwkJc2hhZG93W1RBUzMwMDFDX1JFR19WT0xVTUVdWzJdID0gKHRlbXAgPj4gMCkgICYgMHhmZjsKKwkJdGVtcCA9IHRhczMwMDFjX2dhaW4ubWFzdGVyWyhsZXZlbD4+OCkmMHhmZl07CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfVk9MVU1FXVszXSA9ICh0ZW1wID4+IDE2KSAmIDB4ZmY7CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfVk9MVU1FXVs0XSA9ICh0ZW1wID4+IDgpICAmIDB4ZmY7CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfVk9MVU1FXVs1XSA9ICh0ZW1wID4+IDApICAmIDB4ZmY7CisJCXJjID0gdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19WT0xVTUUpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0FMVFBDTToKKwkJLyogdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsIDEpOyAqLworCQlsZXZlbCA9IHRhc19tb25vX3RvX3N0ZXJlbyhsZXZlbCk7CisJCXRlbXAgPSB0YXMzMDAxY19nYWluLm1peGVyW2xldmVsJjB4ZmZdOworCQlzaGFkb3dbVEFTMzAwMUNfUkVHX01JWEVSMl1bb2Zmc2V0KzBdID0gKHRlbXAgPj4gMTYpICYgMHhmZjsKKwkJc2hhZG93W1RBUzMwMDFDX1JFR19NSVhFUjJdW29mZnNldCsxXSA9ICh0ZW1wID4+IDgpICAmIDB4ZmY7CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfTUlYRVIyXVtvZmZzZXQrMl0gPSAodGVtcCA+PiAwKSAgJiAweGZmOworCQlyYyA9IHRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTUlYRVIyKTsKKwkJLyogdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsIDApOyAqLworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwkJLyogdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsIDEpOyAqLworCQlsZXZlbCA9IHRhc19tb25vX3RvX3N0ZXJlbyhsZXZlbCk7CisJCXRlbXAgPSB0YXMzMDAxY19nYWluLm1peGVyW2xldmVsJjB4ZmZdOworCQlzaGFkb3dbVEFTMzAwMUNfUkVHX01JWEVSMV1bb2Zmc2V0KzBdID0gKHRlbXAgPj4gMTYpICYgMHhmZjsKKwkJc2hhZG93W1RBUzMwMDFDX1JFR19NSVhFUjFdW29mZnNldCsxXSA9ICh0ZW1wID4+IDgpICAmIDB4ZmY7CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfTUlYRVIxXVtvZmZzZXQrMl0gPSAodGVtcCA+PiAwKSAgJiAweGZmOworCQlyYyA9IHRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTUlYRVIxKTsKKwkJLyogdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsIDApOyAqLworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1RSRUJMRToKKwkJdGVtcCA9IHRhczMwMDFjX2dhaW4udHJlYmxlW2xldmVsJjB4ZmZdOworCQlzaGFkb3dbVEFTMzAwMUNfUkVHX1RSRUJMRV1bMF09dGVtcCYweGZmOworCQlyYyA9IHRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfVFJFQkxFKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9CQVNTOgorCQl0ZW1wID0gdGFzMzAwMWNfZ2Fpbi5iYXNzW2xldmVsJjB4ZmZdOworCQlzaGFkb3dbVEFTMzAwMUNfUkVHX0JBU1NdWzBdPXRlbXAmMHhmZjsKKwkJcmMgPSB0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0JBU1MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC0xOworCQlicmVhazsKKwl9CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXNlbGYtPnN1cGVyLm1peGVyW21peGVyXT1sZXZlbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfbGVhdmVfc2xlZXAoc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZikKK3sKKwl1bnNpZ25lZCBjaGFyIG1jciA9ICgxPDw2KSsoMjw8NCkrKDI8PDIpOworCisJaWYgKCFzZWxmKQorCQlyZXR1cm4gLTE7CisKKwkvKiBNYWtlIHN1cmUgc29tZXRoaW5nIGFuc3dlcnMgb24gdGhlIGkyYyBidXMgKi8KKwlpZiAodGFzMzAwMWNfd3JpdGVfcmVnaXN0ZXIoc2VsZiwgVEFTMzAwMUNfUkVHX01DUiwgJm1jciwKKwkgICAgV1JJVEVfTk9STUFMfEZPUkNFX1dSSVRFKSA8IDApCisJICAgIAlyZXR1cm4gLTE7CisKKwl0YXMzMDAxY19mYXN0X2xvYWQoc2VsZiwgMSk7CisKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDApOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMSk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQyKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDMpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFENCk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQ1KTsKKworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQwKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMSk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDIpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQzKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFENCk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDUpOworCisJdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsIDApOworCisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19CQVNTKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1RSRUJMRSk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19NSVhFUjEpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTUlYRVIyKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1ZPTFVNRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfZW50ZXJfc2xlZXAoc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZikKK3sKKwkvKiBTdHViIGZvciBub3csIGJ1dCBJIGhhdmUgdGhlIGRldGFpbHMgb24gbG93LXBvd2VyIG1vZGUgKi8KKwlpZiAoIXNlbGYpCisJCXJldHVybiAtMTsgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX3N5bmNfYmlxdWFkKAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQkJdV9pbnQgY2hhbm5lbCwKKwkJCXVfaW50IGZpbHRlcikKK3sKKwllbnVtIHRhczMwMDFjX3JlZ190IHJlZzsKKworCWlmIChjaGFubmVsID49IFRBUzMwMDFDX0JJUVVBRF9DSEFOTkVMX0NPVU5UIHx8CisJICAgIGZpbHRlciAgPj0gVEFTMzAwMUNfQklRVUFEX0ZJTFRFUl9DT1VOVCkgcmV0dXJuIC1FSU5WQUw7CisKKwlyZWc9KCBjaGFubmVsID8gVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDAgOiBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQwICkgKyBmaWx0ZXI7CisKKwlyZXR1cm4gdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLHJlZyk7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX3dyaXRlX2JpcXVhZF9zaGFkb3coCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsCisJCQkJdV9pbnQgY2hhbm5lbCwKKwkJCQl1X2ludCBmaWx0ZXIsCisJCQkJY29uc3QgdW5pb24gdGFzX2JpcXVhZF90ICpiaXF1YWQpCit7CisJdGFzX3NoYWRvd190ICpzaGFkb3c9c2VsZi0+c3VwZXIuc2hhZG93OworCWVudW0gdGFzMzAwMWNfcmVnX3QgcmVnOworCisJaWYgKGNoYW5uZWwgPj0gVEFTMzAwMUNfQklRVUFEX0NIQU5ORUxfQ09VTlQgfHwKKwkgICAgZmlsdGVyICA+PSBUQVMzMDAxQ19CSVFVQURfRklMVEVSX0NPVU5UKSByZXR1cm4gLUVJTlZBTDsKKworCXJlZz0oIGNoYW5uZWwgPyBUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMCA6IFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDAgKSArIGZpbHRlcjsKKworCVNFVF80XzIwKHNoYWRvd1tyZWddLCAwLGJpcXVhZC0+Y29lZmYuYjApOworCVNFVF80XzIwKHNoYWRvd1tyZWddLCAzLGJpcXVhZC0+Y29lZmYuYjEpOworCVNFVF80XzIwKHNoYWRvd1tyZWddLCA2LGJpcXVhZC0+Y29lZmYuYjIpOworCVNFVF80XzIwKHNoYWRvd1tyZWddLCA5LGJpcXVhZC0+Y29lZmYuYTEpOworCVNFVF80XzIwKHNoYWRvd1tyZWddLDEyLGJpcXVhZC0+Y29lZmYuYTIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX3dyaXRlX2JpcXVhZCgJc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZiwKKwkJCXVfaW50IGNoYW5uZWwsCisJCQl1X2ludCBmaWx0ZXIsCisJCQljb25zdCB1bmlvbiB0YXNfYmlxdWFkX3QgKmJpcXVhZCkKK3sKKwlpbnQgcmM7CisKKwlyYz10YXMzMDAxY193cml0ZV9iaXF1YWRfc2hhZG93KHNlbGYsIGNoYW5uZWwsIGZpbHRlciwgYmlxdWFkKTsKKwlpZiAocmMgPCAwKSByZXR1cm4gcmM7CisKKwlyZXR1cm4gdGFzMzAwMWNfc3luY19iaXF1YWQoc2VsZiwgY2hhbm5lbCwgZmlsdGVyKTsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfd3JpdGVfYmlxdWFkX2xpc3QoCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsCisJCQkJdV9pbnQgZmlsdGVyX2NvdW50LAorCQkJCXVfaW50IGZsYWdzLAorCQkJCXN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCAqYmlxdWFkcykKK3sKKwlpbnQgaTsKKwlpbnQgcmM7CisKKwlpZiAoZmxhZ3MgJiBUQVNfQklRVUFEX0ZBU1RfTE9BRCkgdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsMSk7CisKKwlmb3IgKGk9MDsgaTxmaWx0ZXJfY291bnQ7IGkrKykgeworCQlyYz10YXMzMDAxY193cml0ZV9iaXF1YWQoc2VsZiwKKwkJCQkJIGJpcXVhZHNbaV0uY2hhbm5lbCwKKwkJCQkJIGJpcXVhZHNbaV0uZmlsdGVyLAorCQkJCQkgJmJpcXVhZHNbaV0uZGF0YSk7CisJCWlmIChyYyA8IDApIGJyZWFrOworCX0KKworCWlmIChmbGFncyAmIFRBU19CSVFVQURfRkFTVF9MT0FEKSB7CisJCXRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLDApOworCisJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfQkFTUyk7CisJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfVFJFQkxFKTsKKwkJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19NSVhFUjEpOworCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX01JWEVSMik7CisJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfVk9MVU1FKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX3JlYWRfYmlxdWFkKAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQkJdV9pbnQgY2hhbm5lbCwKKwkJCXVfaW50IGZpbHRlciwKKwkJCXVuaW9uIHRhc19iaXF1YWRfdCAqYmlxdWFkKQoreworCXRhc19zaGFkb3dfdCAqc2hhZG93PXNlbGYtPnN1cGVyLnNoYWRvdzsKKwllbnVtIHRhczMwMDFjX3JlZ190IHJlZzsKKworCWlmIChjaGFubmVsID49IFRBUzMwMDFDX0JJUVVBRF9DSEFOTkVMX0NPVU5UIHx8CisJICAgIGZpbHRlciAgPj0gVEFTMzAwMUNfQklRVUFEX0ZJTFRFUl9DT1VOVCkgcmV0dXJuIC1FSU5WQUw7CisKKwlyZWc9KCBjaGFubmVsID8gVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDAgOiBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQwICkgKyBmaWx0ZXI7CisKKwliaXF1YWQtPmNvZWZmLmIwPUdFVF80XzIwKHNoYWRvd1tyZWddLCAwKTsKKwliaXF1YWQtPmNvZWZmLmIxPUdFVF80XzIwKHNoYWRvd1tyZWddLCAzKTsKKwliaXF1YWQtPmNvZWZmLmIyPUdFVF80XzIwKHNoYWRvd1tyZWddLCA2KTsKKwliaXF1YWQtPmNvZWZmLmExPUdFVF80XzIwKHNoYWRvd1tyZWddLCA5KTsKKwliaXF1YWQtPmNvZWZmLmEyPUdFVF80XzIwKHNoYWRvd1tyZWddLDEyKTsKKwkKKwlyZXR1cm4gMDsJCit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX2VxX3J3KAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQl1X2ludCBjbWQsCisJCXVfbG9uZyBhcmcpCit7CisJaW50IHJjOworCXN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCBiaXF1YWQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJpcXVhZCwgYXJncCwgc2l6ZW9mKHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCkpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjbWQgJiBTSU9DX0lOKSB7CisJCXJjPXRhczMwMDFjX3dyaXRlX2JpcXVhZChzZWxmLCBiaXF1YWQuY2hhbm5lbCwgYmlxdWFkLmZpbHRlciwgJmJpcXVhZC5kYXRhKTsKKwkJaWYgKHJjICE9IDApIHJldHVybiByYzsKKwl9CisKKwlpZiAoY21kICYgU0lPQ19PVVQpIHsKKwkJcmM9dGFzMzAwMWNfcmVhZF9iaXF1YWQoc2VsZiwgYmlxdWFkLmNoYW5uZWwsIGJpcXVhZC5maWx0ZXIsICZiaXF1YWQuZGF0YSk7CisJCWlmIChyYyAhPSAwKSByZXR1cm4gcmM7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmYmlxdWFkLCBzaXplb2Yoc3RydWN0IHRhc19iaXF1YWRfY3RybF90KSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX2VxX2xpc3RfcncoCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsCisJCQl1X2ludCBjbWQsCisJCQl1X2xvbmcgYXJnKQoreworCWludCByYzsKKwlpbnQgZmlsdGVyX2NvdW50OworCWludCBmbGFnczsKKwlpbnQgaSxqOworCWNoYXIgc3luY19yZXF1aXJlZFsyXVs2XTsKKwlzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgYmlxdWFkOworCXN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfbGlzdF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCW1lbXNldChzeW5jX3JlcXVpcmVkLDAsc2l6ZW9mKHN5bmNfcmVxdWlyZWQpKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZmlsdGVyX2NvdW50LCAmYXJncC0+ZmlsdGVyX2NvdW50LCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZmbGFncywgJmFyZ3AtPmZsYWdzLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNtZCAmIFNJT0NfSU4pIHsKKwl9CisKKwlmb3IgKGk9MDsgaSA8IGZpbHRlcl9jb3VudDsgaSsrKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYmlxdWFkLCAmYXJncC0+YmlxdWFkc1tpXSwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHRhc19iaXF1YWRfY3RybF90KSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJaWYgKGNtZCAmIFNJT0NfSU4pIHsKKwkJCXN5bmNfcmVxdWlyZWRbYmlxdWFkLmNoYW5uZWxdW2JpcXVhZC5maWx0ZXJdPTE7CisJCQlyYz10YXMzMDAxY193cml0ZV9iaXF1YWRfc2hhZG93KHNlbGYsIGJpcXVhZC5jaGFubmVsLCBiaXF1YWQuZmlsdGVyLCAmYmlxdWFkLmRhdGEpOworCQkJaWYgKHJjICE9IDApIHJldHVybiByYzsKKwkJfQorCisJCWlmIChjbWQgJiBTSU9DX09VVCkgeworCQkJcmM9dGFzMzAwMWNfcmVhZF9iaXF1YWQoc2VsZiwgYmlxdWFkLmNoYW5uZWwsIGJpcXVhZC5maWx0ZXIsICZiaXF1YWQuZGF0YSk7CisJCQlpZiAocmMgIT0gMCkgcmV0dXJuIHJjOworCisJCQlpZiAoY29weV90b191c2VyKCZhcmdwLT5iaXF1YWRzW2ldLCAmYmlxdWFkLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCkpKSB7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY21kICYgU0lPQ19JTikgeworCQlpZiAoZmxhZ3MgJiBUQVNfQklRVUFEX0ZBU1RfTE9BRCkgdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsMSk7CisJCWZvciAoaT0wOyBpPDI7IGkrKykgeworCQkJZm9yIChqPTA7IGo8NjsgaisrKSB7CisJCQkJaWYgKHN5bmNfcmVxdWlyZWRbaV1bal0pIHsKKwkJCQkJcmM9dGFzMzAwMWNfc3luY19iaXF1YWQoc2VsZiwgaSwgaik7CisJCQkJCWlmIChyYyA8IDApIHJldHVybiByYzsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGZsYWdzICYgVEFTX0JJUVVBRF9GQVNUX0xPQUQpIHsKKwkJCXRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLDApOworCQkJLyogbm93IHdlIG5lZWQgdG8gc2V0IHVwIHRoZSBtaXhlcnMgYWdhaW4sCisJCQkgICBiZWNhdXNlIGxlYXZpbmcgZmFzdCBtb2RlIHJlc2V0cyB0aGVtLiAqLworCQkJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19CQVNTKTsKKwkJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfVFJFQkxFKTsKKwkJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTUlYRVIxKTsKKwkJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTUlYRVIyKTsKKwkJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfVk9MVU1FKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY191cGRhdGVfZHJjZSgJc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZiwKKwkJCWludCBmbGFncywKKwkJCXN0cnVjdCB0YXNfZHJjZV90ICpkcmNlKQoreworCXRhc19zaGFkb3dfdCAqc2hhZG93OworCXNoYWRvdz1zZWxmLT5zdXBlci5zaGFkb3c7CisKKwlzaGFkb3dbVEFTMzAwMUNfUkVHX0RSQ11bMV0gPSAweGMxOworCisJaWYgKGZsYWdzICYgVEFTX0RSQ0VfVEhSRVNIT0xEKSB7CisJCXNlbGYtPmRyY2Vfc3RhdGUudGhyZXNob2xkPXF1YW50aXplX2RiKGRyY2UtPnRocmVzaG9sZCk7CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfRFJDXVsyXSA9IGRiX3RvX3JlZ3ZhbChzZWxmLT5kcmNlX3N0YXRlLnRocmVzaG9sZCk7CisJfQorCisJaWYgKGZsYWdzICYgVEFTX0RSQ0VfRU5BQkxFKSB7CisJCXNlbGYtPmRyY2Vfc3RhdGUuZW5hYmxlID0gZHJjZS0+ZW5hYmxlOworCX0KKworCWlmICghc2VsZi0+ZHJjZV9zdGF0ZS5lbmFibGUpIHsKKwkJc2hhZG93W1RBUzMwMDFDX1JFR19EUkNdWzBdID0gMHhmMDsKKwl9CisKKyNpZmRlZiBERUJVR19EUkNFCisJcHJpbnRrKCJEUkNFIElPQ1RMOiBzZXQgWyBFTkFCTEU6JXggVEhSRVNIOiV4XG4iLAorCSAgICAgICBzZWxmLT5kcmNlX3N0YXRlLmVuYWJsZSwKKwkgICAgICAgc2VsZi0+ZHJjZV9zdGF0ZS50aHJlc2hvbGQpOworCisJcHJpbnRrKCJEUkNFIElPQ1RMOiByZWcgWyAlMDJ4ICUwMnggXVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGNoYXIpc2hhZG93W1RBUzMwMDFDX1JFR19EUkNdWzBdLAorCSAgICAgICAodW5zaWduZWQgY2hhcilzaGFkb3dbVEFTMzAwMUNfUkVHX0RSQ11bMV0pOworI2VuZGlmCisKKwlyZXR1cm4gdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLCBUQVMzMDAxQ19SRUdfRFJDKTsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfZHJjZV9ydygJc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZiwKKwkJCXVfaW50IGNtZCwKKwkJCXVfbG9uZyBhcmcpCit7CisJaW50IHJjOworCXN0cnVjdCB0YXNfZHJjZV9jdHJsX3QgZHJjZV9jdHJsOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkcmNlX2N0cmwsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdGFzX2RyY2VfY3RybF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCisjaWZkZWYgREVCVUdfRFJDRQorCXByaW50aygiRFJDRSBJT0NUTDogaW5wdXQgWyBGTEFHUzoleCBFTkFCTEU6JXggVEhSRVNIOiV4XG4iLAorCSAgICAgICBkcmNlX2N0cmwuZmxhZ3MsCisJICAgICAgIGRyY2VfY3RybC5kYXRhLmVuYWJsZSwKKwkgICAgICAgZHJjZV9jdHJsLmRhdGEudGhyZXNob2xkKTsKKyNlbmRpZgorCisJaWYgKGNtZCAmIFNJT0NfSU4pIHsKKwkJcmMgPSB0YXMzMDAxY191cGRhdGVfZHJjZShzZWxmLCBkcmNlX2N0cmwuZmxhZ3MsICZkcmNlX2N0cmwuZGF0YSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKGNtZCAmIFNJT0NfT1VUKSB7CisJCWlmIChkcmNlX2N0cmwuZmxhZ3MgJiBUQVNfRFJDRV9FTkFCTEUpCisJCQlkcmNlX2N0cmwuZGF0YS5lbmFibGUgPSBzZWxmLT5kcmNlX3N0YXRlLmVuYWJsZTsKKworCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfVEhSRVNIT0xEKQorCQkJZHJjZV9jdHJsLmRhdGEudGhyZXNob2xkID0gc2VsZi0+ZHJjZV9zdGF0ZS50aHJlc2hvbGQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZHJjZV9jdHJsLAorCQkJCSBzaXplb2Yoc3RydWN0IHRhc19kcmNlX2N0cmxfdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordGFzMzAwMWNfdXBkYXRlX2RldmljZV9wYXJhbWV0ZXJzKHN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYpCit7CisJaW50IGksajsKKworCWlmICghc2VsZikgcmV0dXJuOworCisJaWYgKHNlbGYtPm91dHB1dF9pZCA9PSBUQVNfT1VUUFVUX0hFQURQSE9ORVMpIHsKKwkJdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsIDEpOworCisJCWZvciAoaT0wOyBpPFRBUzMwMDFDX0JJUVVBRF9DSEFOTkVMX0NPVU5UOyBpKyspIHsKKwkJCWZvciAoaj0wOyBqPFRBUzMwMDFDX0JJUVVBRF9GSUxURVJfQ09VTlQ7IGorKykgeworCQkJCXRhczMwMDFjX3dyaXRlX2JpcXVhZChzZWxmLCBpLCBqLCAmdGFzMzAwMWNfZXFfdW5pdHkpOworCQkJfQorCQl9CisKKwkJdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsIDApOworCisJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfQkFTUyk7CisJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfVFJFQkxFKTsKKwkJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19NSVhFUjEpOworCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX01JWEVSMik7CisJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfVk9MVU1FKTsKKworCQlyZXR1cm47CisJfQorCisJZm9yIChpPTA7IHRhczMwMDFjX2VxX3ByZWZzW2ldOyBpKyspIHsKKwkJc3RydWN0IHRhc19lcV9wcmVmX3QgKmVxID0gdGFzMzAwMWNfZXFfcHJlZnNbaV07CisKKwkJaWYgKGVxLT5kZXZpY2VfaWQgPT0gc2VsZi0+ZGV2aWNlX2lkICYmCisJCSAgICAoZXEtPm91dHB1dF9pZCA9PSAwIHx8IGVxLT5vdXRwdXRfaWQgPT0gc2VsZi0+b3V0cHV0X2lkKSAmJgorCQkgICAgKGVxLT5zcGVha2VyX2lkID09IDAgfHwgZXEtPnNwZWFrZXJfaWQgPT0gc2VsZi0+c3BlYWtlcl9pZCkpIHsKKworCQkJdGFzMzAwMWNfdXBkYXRlX2RyY2Uoc2VsZiwgVEFTX0RSQ0VfQUxMLCBlcS0+ZHJjZSk7CisJCQl0YXMzMDAxY193cml0ZV9iaXF1YWRfbGlzdChzZWxmLCBlcS0+ZmlsdGVyX2NvdW50LCBUQVNfQklRVUFEX0ZBU1RfTE9BRCwgZXEtPmJpcXVhZHMpOworCisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3RhczMwMDFjX2RldmljZV9jaGFuZ2VfaGFuZGxlcih2b2lkICpzZWxmKQoreworCWlmIChzZWxmKQorCQl0YXMzMDAxY191cGRhdGVfZGV2aWNlX3BhcmFtZXRlcnMoc2VsZik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGV2aWNlX2NoYW5nZTsKKworc3RhdGljIGludAordGFzMzAwMWNfb3V0cHV0X2RldmljZV9jaGFuZ2UoCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsCisJCQkJaW50IGRldmljZV9pZCwKKwkJCQlpbnQgb3V0cHV0X2lkLAorCQkJCWludCBzcGVha2VyX2lkKQoreworCXNlbGYtPmRldmljZV9pZD1kZXZpY2VfaWQ7CisJc2VsZi0+b3V0cHV0X2lkPW91dHB1dF9pZDsKKwlzZWxmLT5zcGVha2VyX2lkPXNwZWFrZXJfaWQ7CisKKwlzY2hlZHVsZV93b3JrKCZkZXZpY2VfY2hhbmdlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfZGV2aWNlX2lvY3RsKAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQkJdV9pbnQgY21kLAorCQkJdV9sb25nIGFyZykKK3sKKwl1aW50IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVEFTX1JFQURfRVE6CisJY2FzZSBUQVNfV1JJVEVfRVE6CisJCXJldHVybiB0YXMzMDAxY19lcV9ydyhzZWxmLCBjbWQsIGFyZyk7CisKKwljYXNlIFRBU19SRUFEX0VRX0xJU1Q6CisJY2FzZSBUQVNfV1JJVEVfRVFfTElTVDoKKwkJcmV0dXJuIHRhczMwMDFjX2VxX2xpc3Rfcncoc2VsZiwgY21kLCBhcmcpOworCisJY2FzZSBUQVNfUkVBRF9FUV9GSUxURVJfQ09VTlQ6CisJCXB1dF91c2VyKFRBUzMwMDFDX0JJUVVBRF9GSUxURVJfQ09VTlQsIGFyZ3ApOworCQlyZXR1cm4gMDsKKworCWNhc2UgVEFTX1JFQURfRVFfQ0hBTk5FTF9DT1VOVDoKKwkJcHV0X3VzZXIoVEFTMzAwMUNfQklRVUFEX0NIQU5ORUxfQ09VTlQsIGFyZ3ApOworCQlyZXR1cm4gMDsKKworCWNhc2UgVEFTX1JFQURfRFJDRToKKwljYXNlIFRBU19XUklURV9EUkNFOgorCQlyZXR1cm4gdGFzMzAwMWNfZHJjZV9ydyhzZWxmLCBjbWQsIGFyZyk7CisKKwljYXNlIFRBU19SRUFEX0RSQ0VfQ0FQUzoKKwkJcHV0X3VzZXIoVEFTX0RSQ0VfRU5BQkxFIHwgVEFTX0RSQ0VfVEhSRVNIT0xELCBhcmdwKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRBU19SRUFEX0RSQ0VfTUlOOgorCWNhc2UgVEFTX1JFQURfRFJDRV9NQVg6IHsKKwkJc3RydWN0IHRhc19kcmNlX2N0cmxfdCBkcmNlX2N0cmw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkcmNlX2N0cmwsIGFyZ3AsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCB0YXNfZHJjZV9jdHJsX3QpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfVEhSRVNIT0xEKSB7CisJCQlpZiAoY21kID09IFRBU19SRUFEX0RSQ0VfTUlOKSB7CisJCQkJZHJjZV9jdHJsLmRhdGEudGhyZXNob2xkPS0zNjw8ODsKKwkJCX0gZWxzZSB7CisJCQkJZHJjZV9jdHJsLmRhdGEudGhyZXNob2xkPS02PDw4OworCQkJfQorCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZHJjZV9jdHJsLAorCQkJCSBzaXplb2Yoc3RydWN0IHRhc19kcmNlX2N0cmxfdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfaW5pdF9taXhlcihzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmKQoreworCXVuc2lnbmVkIGNoYXIgbWNyID0gKDE8PDYpKygyPDw0KSsoMjw8Mik7CisKKwkvKiBNYWtlIHN1cmUgc29tZXRoaW5nIGFuc3dlcnMgb24gdGhlIGkyYyBidXMgKi8KKwlpZiAodGFzMzAwMWNfd3JpdGVfcmVnaXN0ZXIoc2VsZiwgVEFTMzAwMUNfUkVHX01DUiwgJm1jciwKKwkgICAgV1JJVEVfTk9STUFMfEZPUkNFX1dSSVRFKSA8IDApCisJCXJldHVybiAtMTsKKworCXRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLCAxKTsKKworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMCk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQxKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDIpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMyk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQ0KTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDUpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFENik7CisKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMCk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDEpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQyKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMyk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDQpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQ1KTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFENik7CisKKwl0YXMzMDAxY19mYXN0X2xvYWQoc2VsZiwgMCk7CisKKwl0YXMzMDAxY19zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfVk9MVU1FLCBWT0xfREVGQVVMVDw8OCB8IFZPTF9ERUZBVUxUKTsKKwl0YXMzMDAxY19zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfUENNLCBJTlBVVF9ERUZBVUxUPDw4IHwgSU5QVVRfREVGQVVMVCk7CisJdGFzMzAwMWNfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX0FMVFBDTSwgMCk7CisKKwl0YXMzMDAxY19zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfQkFTUywgQkFTU19ERUZBVUxUKTsKKwl0YXMzMDAxY19zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfVFJFQkxFLCBUUkVCTEVfREVGQVVMVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfdW5pbml0X21peGVyKHN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYpCit7CisJdGFzMzAwMWNfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX1ZPTFVNRSwgMCk7CisJdGFzMzAwMWNfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX1BDTSwgICAgMCk7CisJdGFzMzAwMWNfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX0FMVFBDTSwgMCk7CisKKwl0YXMzMDAxY19zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfQkFTUywgICAwKTsKKwl0YXMzMDAxY19zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfVFJFQkxFLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY19pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZjsKKwlzaXplX3Qgc3ogPSBzaXplb2YoKnNlbGYpICsgKFRBUzMwMDFDX1JFR19NQVgqc2l6ZW9mKHRhc19zaGFkb3dfdCkpOworCWludCBpLCBqOworCisJc2VsZiA9IGttYWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmICghc2VsZikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHNlbGYsIDAsIHN6KTsKKworCXNlbGYtPnN1cGVyLmNsaWVudCA9IGNsaWVudDsKKwlzZWxmLT5zdXBlci5zaGFkb3cgPSAodGFzX3NoYWRvd190ICopKHNlbGYrMSk7CisJc2VsZi0+b3V0cHV0X2lkID0gVEFTX09VVFBVVF9IRUFEUEhPTkVTOworCisJZGV2X3NldF9kcnZkYXRhKCZjbGllbnQtPmRldiwgc2VsZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgVEFTMzAwMUNfQklRVUFEX0NIQU5ORUxfQ09VTlQ7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IFRBUzMwMDFDX0JJUVVBRF9GSUxURVJfQ09VTlQ7IGorKykKKwkJCXRhczMwMDFjX3dyaXRlX2JpcXVhZF9zaGFkb3coc2VsZiwgaSwgaiwKKwkJCQkmdGFzMzAwMWNfZXFfdW5pdHkpOworCisJSU5JVF9XT1JLKCZkZXZpY2VfY2hhbmdlLCB0YXMzMDAxY19kZXZpY2VfY2hhbmdlX2hhbmRsZXIsIHNlbGYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordGFzMzAwMWNfdW5pbml0KHN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYpCit7CisJdGFzMzAwMWNfdW5pbml0X21peGVyKHNlbGYpOworCWtmcmVlKHNlbGYpOworfQorCitzdHJ1Y3QgdGFzX2RyaXZlcl9ob29rc190IHRhczMwMDFjX2hvb2tzID0geworCS5pbml0CQkJPSAodGFzX2hvb2tfaW5pdF90KXRhczMwMDFjX2luaXQsCisJLnBvc3RfaW5pdAkJPSAodGFzX2hvb2tfcG9zdF9pbml0X3QpdGFzMzAwMWNfaW5pdF9taXhlciwKKwkudW5pbml0CQkJPSAodGFzX2hvb2tfdW5pbml0X3QpdGFzMzAwMWNfdW5pbml0LAorCS5nZXRfbWl4ZXJfbGV2ZWwJPSAodGFzX2hvb2tfZ2V0X21peGVyX2xldmVsX3QpdGFzMzAwMWNfZ2V0X21peGVyX2xldmVsLAorCS5zZXRfbWl4ZXJfbGV2ZWwJPSAodGFzX2hvb2tfc2V0X21peGVyX2xldmVsX3QpdGFzMzAwMWNfc2V0X21peGVyX2xldmVsLAorCS5lbnRlcl9zbGVlcAkJPSAodGFzX2hvb2tfZW50ZXJfc2xlZXBfdCl0YXMzMDAxY19lbnRlcl9zbGVlcCwKKwkubGVhdmVfc2xlZXAJCT0gKHRhc19ob29rX2xlYXZlX3NsZWVwX3QpdGFzMzAwMWNfbGVhdmVfc2xlZXAsCisJLnN1cHBvcnRlZF9taXhlcnMJPSAodGFzX2hvb2tfc3VwcG9ydGVkX21peGVyc190KXRhczMwMDFjX3N1cHBvcnRlZF9taXhlcnMsCisJLm1peGVyX2lzX3N0ZXJlbwk9ICh0YXNfaG9va19taXhlcl9pc19zdGVyZW9fdCl0YXMzMDAxY19taXhlcl9pc19zdGVyZW8sCisJLnN0ZXJlb19taXhlcnMJCT0gKHRhc19ob29rX3N0ZXJlb19taXhlcnNfdCl0YXMzMDAxY19zdGVyZW9fbWl4ZXJzLAorCS5vdXRwdXRfZGV2aWNlX2NoYW5nZQk9ICh0YXNfaG9va19vdXRwdXRfZGV2aWNlX2NoYW5nZV90KXRhczMwMDFjX291dHB1dF9kZXZpY2VfY2hhbmdlLAorCS5kZXZpY2VfaW9jdGwJCT0gKHRhc19ob29rX2RldmljZV9pb2N0bF90KXRhczMwMDFjX2RldmljZV9pb2N0bAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDAxYy5oIGIvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2MGRhMwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDAxYy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBIZWFkZXIgZmlsZSBmb3IgdGhlIGkyYy9pMnMgYmFzZWQgVEEzMDAxYyBzb3VuZCBjaGlwIHVzZWQKKyAqIG9uIHNvbWUgQXBwbGUgaGFyZHdhcmUuIEFsc28ga25vd24gYXMgInR1bWJsZXIiLgorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBXcml0dGVuIGJ5IENocmlzdG9waGVyIEMuIENoaW1lbGlzIDxjaHJpc0BkZWJpYW4ub3JnPgorICovCisKKyNpZm5kZWYgX1RBUzMwMDFDX0hfCisjZGVmaW5lIF9UQVMzMDAxQ19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgInRhc19jb21tb24uaCIKKyNpbmNsdWRlICJ0YXNfZXFfcHJlZnMuaCIKKworLyoKKyAqIE1hY3JvcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHJlZ2lzdGVycyB0aGF0IHdlIHdyaXRlIHRvCisgKiB3aGVuIHNldHRpbmcgdGhlIHZhcmlvdXMgdmFsdWVzLgorICovCisKKyNkZWZpbmUgVEFTMzAwMUNfVkVSU0lPTgkiMC4zIgorI2RlZmluZSBUQVMzMDAxQ19EQVRFCSAgICAgICAgIjIwMDExMjE0IgorCisjZGVmaW5lIEkyQ19EUklWRVJOQU1FX1RBUzMwMDFDICJUQVMzMDAxYyBkcml2ZXIgViAiIFRBUzMwMDFDX1ZFUlNJT04KKyNkZWZpbmUgSTJDX0RSSVZFUklEX1RBUzMwMDFDICAgKEkyQ19EUklWRVJJRF9UQVNfQkFTRSswKQorCitleHRlcm4gIHN0cnVjdCB0YXNfZHJpdmVyX2hvb2tzX3QgdGFzMzAwMWNfaG9va3M7CitleHRlcm4gc3RydWN0IHRhc19nYWluX3QgdGFzMzAwMWNfZ2FpbjsKK2V4dGVybiBzdHJ1Y3QgdGFzX2VxX3ByZWZfdCAqdGFzMzAwMWNfZXFfcHJlZnNbXTsKKworZW51bSB0YXMzMDAxY19yZWdfdCB7CisgIFRBUzMwMDFDX1JFR19NQ1IgICAgICAgICAgICAgICAgICAgID0gMHgwMSwKKyAgVEFTMzAwMUNfUkVHX0RSQyAgICAgICAgICAgICAgICAgICAgPSAweDAyLAorCisgIFRBUzMwMDFDX1JFR19WT0xVTUUgICAgICAgICAgICAgICAgID0gMHgwNCwKKyAgVEFTMzAwMUNfUkVHX1RSRUJMRSAgICAgICAgICAgICAgICAgPSAweDA1LAorICBUQVMzMDAxQ19SRUdfQkFTUyAgICAgICAgICAgICAgICAgICA9IDB4MDYsCisgIFRBUzMwMDFDX1JFR19NSVhFUjEgICAgICAgICAgICAgICAgID0gMHgwNywKKyAgVEFTMzAwMUNfUkVHX01JWEVSMiAgICAgICAgICAgICAgICAgPSAweDA4LAorCisgIFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDAgICAgICAgICAgID0gMHgwYSwKKyAgVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMSAgICAgICAgICAgPSAweDBiLAorICBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQyICAgICAgICAgICA9IDB4MGMsCisgIFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDMgICAgICAgICAgID0gMHgwZCwKKyAgVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFENCAgICAgICAgICAgPSAweDBlLAorICBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQ1ICAgICAgICAgICA9IDB4MGYsCisgIFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDYgICAgICAgICAgID0gMHgxMCwKKyAgCisgIFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQwICAgICAgICAgID0gMHgxMywKKyAgVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDEgICAgICAgICAgPSAweDE0LAorICBUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMiAgICAgICAgICA9IDB4MTUsCisgIFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQzICAgICAgICAgID0gMHgxNiwKKyAgVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDQgICAgICAgICAgPSAweDE3LAorICBUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFENSAgICAgICAgICA9IDB4MTgsCisgIFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQ2ICAgICAgICAgID0gMHgxOSwKKworICBUQVMzMDAxQ19SRUdfTUFYICAgICAgICAgICAgICAgICAgICA9IDB4MjAKK307CisKKyNlbmRpZiAvKiBfVEFTMzAwMUNfSF8gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDAxY190YWJsZXMuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDAxY190YWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY4ZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDFjX3RhYmxlcy5jCkBAIC0wLDAgKzEsMzc1IEBACisjaW5jbHVkZSAidGFzX2NvbW1vbi5oIgorI2luY2x1ZGUgInRhc19lcV9wcmVmcy5oIgorCitzdGF0aWMgc3RydWN0IHRhc19kcmNlX3QgZXFwXzBlXzJfMV9kcmNlID0geworICAuZW5hYmxlICAgICA9IDEsCisgIC5hYm92ZSAgICAgID0geyAudmFsID0gMy4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAuYmVsb3cgICAgICA9IHsgLnZhbCA9IDEuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLnRocmVzaG9sZCAgPSAtMTUuMzMgICogKDE8PDgpLAorICAuZW5lcmd5ICAgICA9IDIuNCAgICAgKiAoMTw8MTIpLAorICAuYXR0YWNrICAgICA9IDAuMDEzICAgKiAoMTw8MTIpLAorICAuZGVjYXkgICAgICA9IDAuMjEyICAgKiAoMTw8MTIpLAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCBlcXBfMGVfMl8xX2JpcXVhZHNbXT17CisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkNBRDMsIDB4RTA2QTU4LCAweDBGQ0FEMywgMHhFMDZCMDksIDB4MEY5NjU3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDQxNzMxLCAweDA4MkU2MywgMHgwNDE3MzEsIDB4RkQ4RDA4LCAweDAyQ0ZCRCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGRkRDNywgMHhFMDUyNEMsIDB4MEZCRkFBLCAweEUwNTI0QywgMHgwRkJENzIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRjNEMzUsIDB4RTIyOENBLCAweDBFQzdCMiwgMHhFMjI4Q0EsIDB4MEUwNEU4IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZDRUJGLCAweEUxODFDMiwgMHgwRjI2NTYsIDB4RTE4MUMyLCAweDBFRjUxNiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBFQzQxNywgMHgwNzNFMjIsIDB4MEIwNjMzLCAweDA3M0UyMiwgMHgwOUNBNEEgfSB9IH0sCisKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGQ0FEMywgMHhFMDZBNTgsIDB4MEZDQUQzLCAweEUwNkIwOSwgMHgwRjk2NTcgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwNDE3MzEsIDB4MDgyRTYzLCAweDA0MTczMSwgMHhGRDhEMDgsIDB4MDJDRkJEIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZGREM3LCAweEUwNTI0QywgMHgwRkJGQUEsIDB4RTA1MjRDLCAweDBGQkQ3MiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGM0QzNSwgMHhFMjI4Q0EsIDB4MEVDN0IyLCAweEUyMjhDQSwgMHgwRTA0RTggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkNFQkYsIDB4RTE4MUMyLCAweDBGMjY1NiwgMHhFMTgxQzIsIDB4MEVGNTE2IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEVDNDE3LCAweDA3M0UyMiwgMHgwQjA2MzMsIDB4MDczRTIyLCAweDA5Q0E0QSB9IH0gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2VxX3ByZWZfdCBlcXBfMGVfMl8xID0geworICAuc2FtcGxlX3JhdGUgICA9IDQ0MTAwLAorICAuZGV2aWNlX2lkICAgICA9IDB4MGUsCisgIC5vdXRwdXRfaWQgICAgID0gVEFTX09VVFBVVF9FWFRFUk5BTF9TUEtSLAorICAuc3BlYWtlcl9pZCAgICA9IDB4MDEsCisKKyAgLmRyY2UgICAgICAgICAgPSAmZXFwXzBlXzJfMV9kcmNlLAorCisgIC5maWx0ZXJfY291bnQgID0gMTIsCisgIC5iaXF1YWRzICAgICAgID0gZXFwXzBlXzJfMV9iaXF1YWRzCit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHN0cnVjdCB0YXNfZHJjZV90IGVxcF8xMF8xXzBfZHJjZT17CisgIC5lbmFibGUgICAgID0gMSwKKyAgLmFib3ZlICAgICAgPSB7IC52YWwgPSAzLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC5iZWxvdyAgICAgID0geyAudmFsID0gMS4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAudGhyZXNob2xkICA9IC0xMi40NiAgKiAoMTw8OCksCisgIC5lbmVyZ3kgICAgID0gMi40ICAgICAqICgxPDwxMiksCisgIC5hdHRhY2sgICAgID0gMC4wMTMgICAqICgxPDwxMiksCisgIC5kZWNheSAgICAgID0gMC4yMTIgICAqICgxPDwxMiksCit9OworCitzdGF0aWMgc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGVxcF8xMF8xXzBfYmlxdWFkc1tdPXsKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGNEExMiwgMHhFMTZCREEsIDB4MEY0QTEyLCAweEUxNzNGMCwgMHgwRTlDM0EgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwMkRENTQsIDB4MDVCQUE4LCAweDAyREQ1NCwgMHhGODAwMUQsIDB4MDM3NTMyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEUyRkM3LCAweEU0RDVEQywgMHgwRDc0NzcsIDB4RTRENURDLCAweDBCQTQzRiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBFNzg5OSwgMHhFNjdDQ0EsIDB4MEQwRTkzLCAweEU2N0NDQSwgMHgwQjg3MkQgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCB9IH0gfSwKKworICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDAsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEY0QTEyLCAweEUxNkJEQSwgMHgwRjRBMTIsIDB4RTE3M0YwLCAweDBFOUMzQSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAxLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDAyREQ1NCwgMHgwNUJBQTgsIDB4MDJERDU0LCAweEY4MDAxRCwgMHgwMzc1MzIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRTJGQzcsIDB4RTRENURDLCAweDBENzQ3NywgMHhFNEQ1REMsIDB4MEJBNDNGIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDMsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEU3ODk5LCAweEU2N0NDQSwgMHgwRDBFOTMsIDB4RTY3Q0NBLCAweDBCODcyRCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA0LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDEwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwIH0gfSB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfZXFfcHJlZl90IGVxcF8xMF8xXzAgPSB7CisgIC5zYW1wbGVfcmF0ZSAgID0gNDQxMDAsCisgIC5kZXZpY2VfaWQgICAgID0gMHgxMCwKKyAgLm91dHB1dF9pZCAgICAgPSBUQVNfT1VUUFVUX0lOVEVSTkFMX1NQS1IsCisgIC5zcGVha2VyX2lkICAgID0gMHgwMCwKKworICAuZHJjZSAgICAgICAgICA9ICZlcXBfMTBfMV8wX2RyY2UsCisKKyAgLmZpbHRlcl9jb3VudCAgPSAxMiwKKyAgLmJpcXVhZHMgICAgICAgPSBlcXBfMTBfMV8wX2JpcXVhZHMKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgc3RydWN0IHRhc19kcmNlX3QgZXFwXzE1XzJfMV9kcmNlPXsKKyAgLmVuYWJsZSAgICAgPSAxLAorICAuYWJvdmUgICAgICA9IHsgLnZhbCA9IDMuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLmJlbG93ICAgICAgPSB7IC52YWwgPSAxLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC50aHJlc2hvbGQgID0gLTE1LjMzICAqICgxPDw4KSwKKyAgLmVuZXJneSAgICAgPSAyLjQgICAgICogKDE8PDEyKSwKKyAgLmF0dGFjayAgICAgPSAwLjAxMyAgICogKDE8PDEyKSwKKyAgLmRlY2F5ICAgICAgPSAwLjIxMiAgICogKDE8PDEyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgZXFwXzE1XzJfMV9iaXF1YWRzW109eworICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDAsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZFMTQzLCAweEUwNTIwNCwgMHgwRkNDQzUsIDB4RTA1MjY2LCAweDBGQUU2QiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAxLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDEwMjM4MywgMHhFMDNBMDMsIDB4MEZBMzI1LCAweEUwM0EwMywgMHgwRkM2QTggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkYyQUIsIDB4RTA2Mjg1LCAweDBGQjIwQSwgMHhFMDYyODUsIDB4MEZBNEI1IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDMsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEY1NDRELCAweEUzNTk3MSwgMHgwRDhGM0EsIDB4RTM1OTcxLCAweDBDRTM4OCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA0LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDEzRTFEMywgMHhGM0VDQjUsIDB4MDQyMjI3LCAweEYzRUNCNSwgMHgwODAzRkEgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwQUMxMTksIDB4MDM0MTgxLCAweDA3OEFCMSwgMHgwMzQxODEsIDB4MDI0QkNBIH0gfSB9LAorCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkUxNDMsIDB4RTA1MjA0LCAweDBGQ0NDNSwgMHhFMDUyNjYsIDB4MEZBRTZCIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTAyMzgzLCAweEUwM0EwMywgMHgwRkEzMjUsIDB4RTAzQTAzLCAweDBGQzZBOCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGRjJBQiwgMHhFMDYyODUsIDB4MEZCMjBBLCAweEUwNjI4NSwgMHgwRkE0QjUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRjU0NEQsIDB4RTM1OTcxLCAweDBEOEYzQSwgMHhFMzU5NzEsIDB4MENFMzg4IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTNFMUQzLCAweEYzRUNCNSwgMHgwNDIyMjcsIDB4RjNFQ0I1LCAweDA4MDNGQSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBBQzExOSwgMHgwMzQxODEsIDB4MDc4QUIxLCAweDAzNDE4MSwgMHgwMjRCQ0EgfSB9IH0sCit9OworCitzdGF0aWMgc3RydWN0IHRhc19lcV9wcmVmX3QgZXFwXzE1XzJfMSA9IHsKKyAgLnNhbXBsZV9yYXRlICAgPSA0NDEwMCwKKyAgLmRldmljZV9pZCAgICAgPSAweDE1LAorICAub3V0cHV0X2lkICAgICA9IFRBU19PVVRQVVRfRVhURVJOQUxfU1BLUiwKKyAgLnNwZWFrZXJfaWQgICAgPSAweDAxLAorCisgIC5kcmNlICAgICAgICAgID0gJmVxcF8xNV8yXzFfZHJjZSwKKworICAuZmlsdGVyX2NvdW50ICA9IDEyLAorICAuYmlxdWFkcyAgICAgICA9IGVxcF8xNV8yXzFfYmlxdWFkcworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2RyY2VfdCBlcXBfMTVfMV8wX2RyY2U9eworICAuZW5hYmxlICAgICA9IDEsCisgIC5hYm92ZSAgICAgID0geyAudmFsID0gMy4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAuYmVsb3cgICAgICA9IHsgLnZhbCA9IDEuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLnRocmVzaG9sZCAgPSAwLjAgICAgICogKDE8PDgpLAorICAuZW5lcmd5ICAgICA9IDIuNCAgICAgKiAoMTw8MTIpLAorICAuYXR0YWNrICAgICA9IDAuMDEzICAgKiAoMTw8MTIpLAorICAuZGVjYXkgICAgICA9IDAuMjEyICAgKiAoMTw8MTIpLAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCBlcXBfMTVfMV8wX2JpcXVhZHNbXT17CisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkFEMDgsIDB4RTBBNUVGLCAweDBGQUQwOCwgMHhFMEE3OUQsIDB4MEY1QkJFIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDRCMzhELCAweDA5NjcxQiwgMHgwNEIzOEQsIDB4MDAwRjcxLCAweDAyQkVDNSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGREQzMiwgMHhFMEE1NkYsIDB4MEY4QTY5LCAweEUwQTU2RiwgMHgwRjY3OUMgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkQyODQsIDB4RTEzNUZCLCAweDBGMjE2MSwgMHhFMTM1RkIsIDB4MEVGM0U1IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEU4MUIxLCAweEU2MjgzRiwgMHgwQ0U0OUQsIDB4RTYyODNGLCAweDBCNjY0RiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGMkQ2MiwgMHhFOTg3OTcsIDB4MEQxRTE5LCAweEU5ODc5NywgMHgwQzRCN0IgfSB9IH0sCisKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGQUQwOCwgMHhFMEE1RUYsIDB4MEZBRDA4LCAweEUwQTc5RCwgMHgwRjVCQkUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwNEIzOEQsIDB4MDk2NzFCLCAweDA0QjM4RCwgMHgwMDBGNzEsIDB4MDJCRUM1IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZERDMyLCAweEUwQTU2RiwgMHgwRjhBNjksIDB4RTBBNTZGLCAweDBGNjc5QyB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGRDI4NCwgMHhFMTM1RkIsIDB4MEYyMTYxLCAweEUxMzVGQiwgMHgwRUYzRTUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRTgxQjEsIDB4RTYyODNGLCAweDBDRTQ5RCwgMHhFNjI4M0YsIDB4MEI2NjRGIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEYyRDYyLCAweEU5ODc5NywgMHgwRDFFMTksIDB4RTk4Nzk3LCAweDBDNEI3QiB9IH0gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2VxX3ByZWZfdCBlcXBfMTVfMV8wID0geworICAuc2FtcGxlX3JhdGUgICA9IDQ0MTAwLAorICAuZGV2aWNlX2lkICAgICA9IDB4MTUsCisgIC5vdXRwdXRfaWQgICAgID0gVEFTX09VVFBVVF9JTlRFUk5BTF9TUEtSLAorICAuc3BlYWtlcl9pZCAgICA9IDB4MDAsCisKKyAgLmRyY2UgICAgICAgICAgPSAmZXFwXzE1XzFfMF9kcmNlLAorCisgIC5maWx0ZXJfY291bnQgID0gMTIsCisgIC5iaXF1YWRzICAgICAgID0gZXFwXzE1XzFfMF9iaXF1YWRzCit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHN0cnVjdCB0YXNfZHJjZV90IGVxcF8wZl8yXzFfZHJjZT17CisgIC5lbmFibGUgICAgID0gMSwKKyAgLmFib3ZlICAgICAgPSB7IC52YWwgPSAzLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC5iZWxvdyAgICAgID0geyAudmFsID0gMS4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAudGhyZXNob2xkICA9IC0xNS4zMyAgKiAoMTw8OCksCisgIC5lbmVyZ3kgICAgID0gMi40ICAgICAqICgxPDwxMiksCisgIC5hdHRhY2sgICAgID0gMC4wMTMgICAqICgxPDwxMiksCisgIC5kZWNheSAgICAgID0gMC4yMTIgICAqICgxPDwxMiksCit9OworCitzdGF0aWMgc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGVxcF8wZl8yXzFfYmlxdWFkc1tdPXsKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGRTE0MywgMHhFMDUyMDQsIDB4MEZDQ0M1LCAweEUwNTI2NiwgMHgwRkFFNkIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMDIzODMsIDB4RTAzQTAzLCAweDBGQTMyNSwgMHhFMDNBMDMsIDB4MEZDNkE4IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZGMkFCLCAweEUwNjI4NSwgMHgwRkIyMEEsIDB4RTA2Mjg1LCAweDBGQTRCNSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGNTQ0RCwgMHhFMzU5NzEsIDB4MEQ4RjNBLCAweEUzNTk3MSwgMHgwQ0UzODggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxM0UxRDMsIDB4RjNFQ0I1LCAweDA0MjIyNywgMHhGM0VDQjUsIDB4MDgwM0ZBIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEFDMTE5LCAweDAzNDE4MSwgMHgwNzhBQjEsIDB4MDM0MTgxLCAweDAyNEJDQSB9IH0gfSwKKworICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDAsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZFMTQzLCAweEUwNTIwNCwgMHgwRkNDQzUsIDB4RTA1MjY2LCAweDBGQUU2QiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAxLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDEwMjM4MywgMHhFMDNBMDMsIDB4MEZBMzI1LCAweEUwM0EwMywgMHgwRkM2QTggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkYyQUIsIDB4RTA2Mjg1LCAweDBGQjIwQSwgMHhFMDYyODUsIDB4MEZBNEI1IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDMsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEY1NDRELCAweEUzNTk3MSwgMHgwRDhGM0EsIDB4RTM1OTcxLCAweDBDRTM4OCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA0LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDEzRTFEMywgMHhGM0VDQjUsIDB4MDQyMjI3LCAweEYzRUNCNSwgMHgwODAzRkEgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwQUMxMTksIDB4MDM0MTgxLCAweDA3OEFCMSwgMHgwMzQxODEsIDB4MDI0QkNBIH0gfSB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfZXFfcHJlZl90IGVxcF8wZl8yXzEgPSB7CisgIC5zYW1wbGVfcmF0ZSAgID0gNDQxMDAsCisgIC5kZXZpY2VfaWQgICAgID0gMHgwZiwKKyAgLm91dHB1dF9pZCAgICAgPSBUQVNfT1VUUFVUX0VYVEVSTkFMX1NQS1IsCisgIC5zcGVha2VyX2lkICAgID0gMHgwMSwKKworICAuZHJjZSAgICAgICAgICA9ICZlcXBfMGZfMl8xX2RyY2UsCisKKyAgLmZpbHRlcl9jb3VudCAgPSAxMiwKKyAgLmJpcXVhZHMgICAgICAgPSBlcXBfMGZfMl8xX2JpcXVhZHMKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgc3RydWN0IHRhc19kcmNlX3QgZXFwXzBmXzFfMF9kcmNlPXsKKyAgLmVuYWJsZSAgICAgPSAxLAorICAuYWJvdmUgICAgICA9IHsgLnZhbCA9IDMuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLmJlbG93ICAgICAgPSB7IC52YWwgPSAxLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC50aHJlc2hvbGQgID0gLTE1LjMzICAqICgxPDw4KSwKKyAgLmVuZXJneSAgICAgPSAyLjQgICAgICogKDE8PDEyKSwKKyAgLmF0dGFjayAgICAgPSAwLjAxMyAgICogKDE8PDEyKSwKKyAgLmRlY2F5ICAgICAgPSAwLjIxMiAgICogKDE8PDEyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgZXFwXzBmXzFfMF9iaXF1YWRzW109eworICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDAsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZDQUQzLCAweEUwNkE1OCwgMHgwRkNBRDMsIDB4RTA2QjA5LCAweDBGOTY1NyB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAxLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDA0MTczMSwgMHgwODJFNjMsIDB4MDQxNzMxLCAweEZEOEQwOCwgMHgwMkNGQkQgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkZEQzcsIDB4RTA1MjRDLCAweDBGQkZBQSwgMHhFMDUyNEMsIDB4MEZCRDcyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDMsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEYzRDM1LCAweEUyMjhDQSwgMHgwRUM3QjIsIDB4RTIyOENBLCAweDBFMDRFOCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA0LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGQ0VCRiwgMHhFMTgxQzIsIDB4MEYyNjU2LCAweEUxODFDMiwgMHgwRUY1MTYgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRUM0MTcsIDB4MDczRTIyLCAweDBCMDYzMywgMHgwNzNFMjIsIDB4MDlDQTRBIH0gfSB9LAorCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkNBRDMsIDB4RTA2QTU4LCAweDBGQ0FEMywgMHhFMDZCMDksIDB4MEY5NjU3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDQxNzMxLCAweDA4MkU2MywgMHgwNDE3MzEsIDB4RkQ4RDA4LCAweDAyQ0ZCRCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGRkRDNywgMHhFMDUyNEMsIDB4MEZCRkFBLCAweEUwNTI0QywgMHgwRkJENzIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRjNEMzUsIDB4RTIyOENBLCAweDBFQzdCMiwgMHhFMjI4Q0EsIDB4MEUwNEU4IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZDRUJGLCAweEUxODFDMiwgMHgwRjI2NTYsIDB4RTE4MUMyLCAweDBFRjUxNiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBFQzQxNywgMHgwNzNFMjIsIDB4MEIwNjMzLCAweDA3M0UyMiwgMHgwOUNBNEEgfSB9IH0sCit9OworCitzdGF0aWMgc3RydWN0IHRhc19lcV9wcmVmX3QgZXFwXzBmXzFfMCA9IHsKKyAgLnNhbXBsZV9yYXRlICAgPSA0NDEwMCwKKyAgLmRldmljZV9pZCAgICAgPSAweDBmLAorICAub3V0cHV0X2lkICAgICA9IFRBU19PVVRQVVRfSU5URVJOQUxfU1BLUiwKKyAgLnNwZWFrZXJfaWQgICAgPSAweDAwLAorCisgIC5kcmNlICAgICAgICAgID0gJmVxcF8wZl8xXzBfZHJjZSwKKworICAuZmlsdGVyX2NvdW50ICA9IDEyLAorICAuYmlxdWFkcyAgICAgICA9IGVxcF8wZl8xXzBfYmlxdWFkcworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyB1aW50IHRhczMwMDFjX21hc3Rlcl90YWJbXT17CisJICAgICAgIDB4MCwgICAgICAgMHg3NSwgICAgICAgMHg5YywgICAgICAgMHhiYiwKKwkgICAgICAweGRiLCAgICAgICAweGZiLCAgICAgIDB4MTFlLCAgICAgIDB4MTQzLAorCSAgICAgMHgxNmIsICAgICAgMHgxOTYsICAgICAgMHgxYzMsICAgICAgMHgxZjUsCisJICAgICAweDIyOSwgICAgICAweDI2MywgICAgICAweDI5ZiwgICAgICAweDJlMSwKKwkgICAgIDB4MzI4LCAgICAgIDB4MzczLCAgICAgIDB4M2M1LCAgICAgIDB4NDFiLAorCSAgICAgMHg0NzgsICAgICAgMHg0ZGMsICAgICAgMHg1NDcsICAgICAgMHg1YjgsCisJICAgICAweDYzMywgICAgICAweDZiNSwgICAgICAweDc0MCwgICAgICAweDdkNSwKKwkgICAgIDB4ODczLCAgICAgIDB4OTFjLCAgICAgIDB4OWQyLCAgICAgIDB4YTkyLAorCSAgICAgMHhiNWUsICAgICAgMHhjMzksICAgICAgMHhkMjIsICAgICAgMHhlMTksCisJICAgICAweGYyMCwgICAgIDB4MTAzNywgICAgIDB4MTE2MSwgICAgIDB4MTI5ZSwKKwkgICAgMHgxM2VkLCAgICAgMHgxNTUxLCAgICAgMHgxNmNhLCAgICAgMHgxODVkLAorCSAgICAweDFhMDgsICAgICAweDFiY2MsICAgICAweDFkYWMsICAgICAweDFmYTcsCisJICAgIDB4MjFjMSwgICAgIDB4MjNmYSwgICAgIDB4MjY1NSwgICAgIDB4MjhkNiwKKwkgICAgMHgyYjdjLCAgICAgMHgyZTRhLCAgICAgMHgzMTQxLCAgICAgMHgzNDY0LAorCSAgICAweDM3YjQsICAgICAweDNiMzUsICAgICAweDNlZTksICAgICAweDQyZDMsCisJICAgIDB4NDZmNiwgICAgIDB4NGI1MywgICAgIDB4NGZmMCwgICAgIDB4NTRjZSwKKwkgICAgMHg1OWYyLCAgICAgMHg1ZjVmLCAgICAgMHg2NTE5LCAgICAgMHg2YjI0LAorCSAgICAweDcxODMsICAgICAweDc4M2MsICAgICAweDdmNTMsICAgICAweDg2Y2MsCisJICAgIDB4OGVhZCwgICAgIDB4OTZmYSwgICAgIDB4OWZiYSwgICAgIDB4YThmMiwKKwkgICAgMHhiMmE3LCAgICAgMHhiY2UxLCAgICAgMHhjN2E1LCAgICAgMHhkMmZhLAorCSAgICAweGRlZTgsICAgICAweGViNzUsICAgICAweGY4YWEsICAgIDB4MTA2OGUsCisJICAgMHgxMTUyYSwgICAgMHgxMjQ4NywgICAgMHgxMzRhZCwgICAgMHgxNDVhNSwKKwkgICAweDE1NzdiLCAgICAweDE2YTM3LCAgICAweDE3ZGY1LCAgICAweDE5MmJkLAorCSAgIDB4MWE4OTAsICAgIDB4MWJmN2IsICAgIDB4MWQ3OGQsICAgIDB4MWYwZDEsCisJICAgMHgyMGI1NSwgICAgMHgyMjcyNywgICAgMHgyNDQ1NiwgICAgMHgyNjJmMiwKKwkgICAweDI4MzBiCit9OworCitzdGF0aWMgdWludCB0YXMzMDAxY19taXhlcl90YWJbXT17CisJICAgICAgIDB4MCwgICAgICAweDc0OCwgICAgICAweDliZSwgICAgICAweGJhZiwKKwkgICAgIDB4ZGE0LCAgICAgIDB4ZmIxLCAgICAgMHgxMWRlLCAgICAgMHgxNDMxLAorCSAgICAweDE2YWQsICAgICAweDE5NTksICAgICAweDFjMzcsICAgICAweDFmNGIsCisJICAgIDB4MjI5OCwgICAgIDB4MjYyOCwgICAgIDB4MjlmYiwgICAgIDB4MmUxMiwKKwkgICAgMHgzMjdkLCAgICAgMHgzNzM0LCAgICAgMHgzYzQ3LCAgICAgMHg0MWI0LAorCSAgICAweDQ3ODcsICAgICAweDRkYmUsICAgICAweDU0NmQsICAgICAweDViODYsCisJICAgIDB4NjMyZSwgICAgIDB4NmI1MiwgICAgIDB4NzQwMCwgICAgIDB4N2Q1NCwKKwkgICAgMHg4NzNiLCAgICAgMHg5MWM2LCAgICAgMHg5ZDFhLCAgICAgMHhhOTIwLAorCSAgICAweGI1ZTUsICAgICAweGMzOGMsICAgICAweGQyMWIsICAgICAweGUxOGYsCisJICAgIDB4ZjFmNSwgICAgMHgxMDM2YSwgICAgMHgxMTYwZiwgICAgMHgxMjlkNiwKKwkgICAweDEzZWQwLCAgICAweDE1NTBjLCAgICAweDE2Y2EwLCAgICAweDE4NWM5LAorCSAgIDB4MWEwN2IsICAgIDB4MWJjYzMsICAgIDB4MWRhYjksICAgIDB4MWZhNzUsCisJICAgMHgyMWMwZiwgICAgMHgyM2ZhMywgICAgMHgyNjU1MiwgICAgMHgyOGQ2NCwKKwkgICAweDJiN2M5LCAgICAweDJlNGEyLCAgICAweDMxNDExLCAgICAweDM0NjNiLAorCSAgIDB4MzdiNDQsICAgIDB4M2IzNTMsICAgIDB4M2VlOTQsICAgIDB4NDJkMzAsCisJICAgMHg0NmY1NSwgICAgMHg0YjUzMywgICAgMHg0ZmVmYywgICAgMHg1NGNlNSwKKwkgICAweDU5ZjI1LCAgICAweDVmNWY2LCAgICAweDY1MTkzLCAgICAweDZiMjNjLAorCSAgIDB4NzE4MzUsICAgIDB4NzgzYzMsICAgIDB4N2Y1MmMsICAgIDB4ODZjYzAsCisJICAgMHg4ZWFjYywgICAgMHg5NmZhNSwgICAgMHg5ZmJhMCwgICAgMHhhOGYxYSwKKwkgICAweGIyYTcxLCAgICAweGJjZTBhLCAgICAweGM3YTRhLCAgICAweGQyZmEwLAorCSAgIDB4ZGVlN2IsICAgIDB4ZWI3NTIsICAgIDB4ZjhhOWYsICAgMHgxMDY4ZTQsCisJICAweDExNTJhMywgICAweDEyNDg2YSwgICAweDEzNGFjOCwgICAweDE0NWE1NSwKKwkgIDB4MTU3N2FjLCAgIDB4MTZhMzcwLCAgIDB4MTdkZjUxLCAgIDB4MTkyYmMyLAorCSAgMHgxYTg4ZjgsICAgMHgxYmY3YjcsICAgMHgxZDc4YzksICAgMHgxZjBkMDQsCisJICAweDIwYjU0MiwgICAweDIyNzI2OCwgICAweDI0NDU2NCwgICAweDI2MmYyNiwKKwkgIDB4MjgzMGFmCit9OworCitzdGF0aWMgdWludCB0YXMzMDAxY190cmVibGVfdGFiW109eworCSAgICAgIDB4OTYsICAgICAgIDB4OTUsICAgICAgIDB4OTUsICAgICAgIDB4OTQsCisJICAgICAgMHg5MywgICAgICAgMHg5MiwgICAgICAgMHg5MiwgICAgICAgMHg5MSwKKwkgICAgICAweDkwLCAgICAgICAweDkwLCAgICAgICAweDhmLCAgICAgICAweDhlLAorCSAgICAgIDB4OGQsICAgICAgIDB4OGQsICAgICAgIDB4OGMsICAgICAgIDB4OGIsCisJICAgICAgMHg4YSwgICAgICAgMHg4YSwgICAgICAgMHg4OSwgICAgICAgMHg4OCwKKwkgICAgICAweDg4LCAgICAgICAweDg3LCAgICAgICAweDg2LCAgICAgICAweDg1LAorCSAgICAgIDB4ODUsICAgICAgIDB4ODQsICAgICAgIDB4ODMsICAgICAgIDB4ODMsCisJICAgICAgMHg4MiwgICAgICAgMHg4MSwgICAgICAgMHg4MCwgICAgICAgMHg4MCwKKwkgICAgICAweDdmLCAgICAgICAweDdlLCAgICAgICAweDdlLCAgICAgICAweDdkLAorCSAgICAgIDB4N2MsICAgICAgIDB4N2IsICAgICAgIDB4N2IsICAgICAgIDB4N2EsCisJICAgICAgMHg3OSwgICAgICAgMHg3OCwgICAgICAgMHg3OCwgICAgICAgMHg3NywKKwkgICAgICAweDc2LCAgICAgICAweDc2LCAgICAgICAweDc1LCAgICAgICAweDc0LAorCSAgICAgIDB4NzMsICAgICAgIDB4NzMsICAgICAgIDB4NzIsICAgICAgIDB4NzEsCisJICAgICAgMHg3MSwgICAgICAgMHg3MCwgICAgICAgMHg2ZSwgICAgICAgMHg2ZCwKKwkgICAgICAweDZkLCAgICAgICAweDZjLCAgICAgICAweDZiLCAgICAgICAweDZhLAorCSAgICAgIDB4NjksICAgICAgIDB4NjgsICAgICAgIDB4NjcsICAgICAgIDB4NjYsCisJICAgICAgMHg2NSwgICAgICAgMHg2MywgICAgICAgMHg2MiwgICAgICAgMHg2MiwKKwkgICAgICAweDYwLCAgICAgICAweDVmLCAgICAgICAweDVkLCAgICAgICAweDVjLAorCSAgICAgIDB4NWEsICAgICAgIDB4NTgsICAgICAgIDB4NTYsICAgICAgIDB4NTUsCisJICAgICAgMHg1MywgICAgICAgMHg1MSwgICAgICAgMHg0ZiwgICAgICAgMHg0YywKKwkgICAgICAweDRhLCAgICAgICAweDQ4LCAgICAgICAweDQ1LCAgICAgICAweDQzLAorCSAgICAgIDB4NDAsICAgICAgIDB4M2QsICAgICAgIDB4M2EsICAgICAgIDB4MzcsCisJICAgICAgMHgzNSwgICAgICAgMHgzMiwgICAgICAgMHgyZSwgICAgICAgMHgyYSwKKwkgICAgICAweDI3LCAgICAgICAweDIyLCAgICAgICAweDFlLCAgICAgICAweDFhLAorCSAgICAgIDB4MTUsICAgICAgIDB4MTEsICAgICAgICAweGMsICAgICAgICAweDcsCisJICAgICAgIDB4MQorfTsKKworc3RhdGljIHVpbnQgdGFzMzAwMWNfYmFzc190YWJbXT17CisJICAgICAgMHg4NiwgICAgICAgMHg4MywgICAgICAgMHg4MSwgICAgICAgMHg3ZiwKKwkgICAgICAweDdkLCAgICAgICAweDdiLCAgICAgICAweDc5LCAgICAgICAweDc4LAorCSAgICAgIDB4NzYsICAgICAgIDB4NzUsICAgICAgIDB4NzQsICAgICAgIDB4NzIsCisJICAgICAgMHg3MSwgICAgICAgMHg2ZiwgICAgICAgMHg2ZSwgICAgICAgMHg2ZCwKKwkgICAgICAweDZjLCAgICAgICAweDZiLCAgICAgICAweDY5LCAgICAgICAweDY3LAorCSAgICAgIDB4NjUsICAgICAgIDB4NjQsICAgICAgIDB4NjEsICAgICAgIDB4NjAsCisJICAgICAgMHg1ZSwgICAgICAgMHg1ZCwgICAgICAgMHg1YywgICAgICAgMHg1YiwKKwkgICAgICAweDVhLCAgICAgICAweDU5LCAgICAgICAweDU4LCAgICAgICAweDU3LAorCSAgICAgIDB4NTYsICAgICAgIDB4NTUsICAgICAgIDB4NTUsICAgICAgIDB4NTQsCisJICAgICAgMHg1MywgICAgICAgMHg1MiwgICAgICAgMHg1MCwgICAgICAgMHg0ZiwKKwkgICAgICAweDRkLCAgICAgICAweDRjLCAgICAgICAweDRiLCAgICAgICAweDQ5LAorCSAgICAgIDB4NDcsICAgICAgIDB4NDUsICAgICAgIDB4NDQsICAgICAgIDB4NDIsCisJICAgICAgMHg0MSwgICAgICAgMHgzZiwgICAgICAgMHgzZSwgICAgICAgMHgzZCwKKwkgICAgICAweDNjLCAgICAgICAweDNiLCAgICAgICAweDM5LCAgICAgICAweDM4LAorCSAgICAgIDB4MzcsICAgICAgIDB4MzYsICAgICAgIDB4MzUsICAgICAgIDB4MzQsCisJICAgICAgMHgzMywgICAgICAgMHgzMSwgICAgICAgMHgzMCwgICAgICAgMHgyZiwKKwkgICAgICAweDJlLCAgICAgICAweDJjLCAgICAgICAweDJiLCAgICAgICAweDJiLAorCSAgICAgIDB4MjksICAgICAgIDB4MjgsICAgICAgIDB4MjcsICAgICAgIDB4MjYsCisJICAgICAgMHgyNSwgICAgICAgMHgyNCwgICAgICAgMHgyMiwgICAgICAgMHgyMSwKKwkgICAgICAweDIwLCAgICAgICAweDFlLCAgICAgICAweDFjLCAgICAgICAweDE5LAorCSAgICAgIDB4MTgsICAgICAgIDB4MTgsICAgICAgIDB4MTcsICAgICAgIDB4MTYsCisJICAgICAgMHgxNSwgICAgICAgMHgxNCwgICAgICAgMHgxMywgICAgICAgMHgxMiwKKwkgICAgICAweDExLCAgICAgICAweDEwLCAgICAgICAgMHhmLCAgICAgICAgMHhlLAorCSAgICAgICAweGQsICAgICAgICAweGIsICAgICAgICAweGEsICAgICAgICAweDksCisJICAgICAgIDB4OCwgICAgICAgIDB4NiwgICAgICAgIDB4NCwgICAgICAgIDB4MiwKKwkgICAgICAgMHgxCit9OworCitzdHJ1Y3QgdGFzX2dhaW5fdCB0YXMzMDAxY19nYWluID0geworICAubWFzdGVyICA9IHRhczMwMDFjX21hc3Rlcl90YWIsCisgIC50cmVibGUgID0gdGFzMzAwMWNfdHJlYmxlX3RhYiwKKyAgLmJhc3MgICAgPSB0YXMzMDAxY19iYXNzX3RhYiwKKyAgLm1peGVyICAgPSB0YXMzMDAxY19taXhlcl90YWIKK307CisKK3N0cnVjdCB0YXNfZXFfcHJlZl90ICp0YXMzMDAxY19lcV9wcmVmc1tdPXsKKyAgJmVxcF8wZV8yXzEsCisgICZlcXBfMTBfMV8wLAorICAmZXFwXzE1XzJfMSwKKyAgJmVxcF8xNV8xXzAsCisgICZlcXBfMGZfMl8xLAorICAmZXFwXzBmXzFfMCwKKyAgTlVMTAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDA0LmMgYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWFhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwNC5jCkBAIC0wLDAgKzEsMTE0MCBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIGkyYy9pMnMgYmFzZWQgVEEzMDA0IHNvdW5kIGNoaXAgdXNlZAorICogb24gc29tZSBBcHBsZSBoYXJkd2FyZS4gQWxzbyBrbm93biBhcyAic25hcHBlciIuCisgKgorICogVG9iaWFzIFNhcmdlYW50IDx0b2JpYXMuc2FyZ2VhbnRAYmlncG9uZC5jb20+CisgKiBCYXNlZCB1cG9uIHRhczMwMDFjLmMgYnkgQ2hyaXN0b3BoZXIgQy4gQ2hpbWVsaXMgPGNocmlzQGRlYmlhbi5vcmc+OgorICoKKyAqIElucHV0IHN1cHBvcnQgYnkgUmVuem8gRGF2b2xpIDxyZW56b0Bjcy51bmliby5pdD4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKKyNpbmNsdWRlICJkbWFzb3VuZC5oIgorI2luY2x1ZGUgInRhc19jb21tb24uaCIKKyNpbmNsdWRlICJ0YXMzMDA0LmgiCisKKyNpbmNsdWRlICJ0YXNfaW9jdGwuaCIKKworLyogI2RlZmluZSBERUJVR19EUkNFICovCisKKyNkZWZpbmUgVEFTMzAwNF9CSVFVQURfRklMVEVSX0NPVU5UICA3CisjZGVmaW5lIFRBUzMwMDRfQklRVUFEX0NIQU5ORUxfQ09VTlQgMgorCisjZGVmaW5lIFZPTF9ERUZBVUxUCSgxMDAgKiA0IC8gNSkKKyNkZWZpbmUgSU5QVVRfREVGQVVMVAkoMTAwICogNCAvIDUpCisjZGVmaW5lIEJBU1NfREVGQVVMVAkoMTAwIC8gMikKKyNkZWZpbmUgVFJFQkxFX0RFRkFVTFQJKDEwMCAvIDIpCisKK3N0cnVjdCB0YXMzMDA0X2RhdGFfdCB7CisJc3RydWN0IHRhc19kYXRhX3Qgc3VwZXI7CisJaW50IGRldmljZV9pZDsKKwlpbnQgb3V0cHV0X2lkOworCWludCBzcGVha2VyX2lkOworCXN0cnVjdCB0YXNfZHJjZV90IGRyY2Vfc3RhdGU7Cit9OworCisjZGVmaW5lIE1BS0VfVElNRShzZWMsdXNlYykgKCgoc2VjKTw8MTIpICsgKDUwMDAwKyh1c2VjLzEwKSooMTw8MTIpKS8xMDAwMDApCisKKyNkZWZpbmUgTUFLRV9SQVRJTyhpLGYpICgoKGkpPDw4KSArICgoNTAwKyhmKSooMTw8OCkpLzEwMDApKQorCisKK3N0YXRpYyBjb25zdCB1bmlvbiB0YXNfYmlxdWFkX3QgdGFzMzAwNF9lcV91bml0eSA9IHsKKwkuYnVmCQkgPSB7IDB4MTAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCB9LAorfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhc19kcmNlX3QgdGFzMzAwNF9kcmNlX21pbiA9IHsKKwkuZW5hYmxlCQk9IDEsCisJLmFib3ZlCQk9IHsgLnZhbCA9IE1BS0VfUkFUSU8oMTYsMCksIC5leHBhbmQgPSAwIH0sCisJLmJlbG93CQk9IHsgLnZhbCA9IE1BS0VfUkFUSU8oMiwwKSwgLmV4cGFuZCA9IDAgfSwKKwkudGhyZXNob2xkCT0gLTB4NTlhMCwKKwkuZW5lcmd5CQk9IE1BS0VfVElNRSgwLCAgMTcwMCksCisJLmF0dGFjawkJPSBNQUtFX1RJTUUoMCwgIDE3MDApLAorCS5kZWNheQkJPSBNQUtFX1RJTUUoMCwgIDE3MDApLAorfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhc19kcmNlX3QgdGFzMzAwNF9kcmNlX21heCA9IHsKKwkuZW5hYmxlCQk9IDEsCisJLmFib3ZlCQk9IHsgLnZhbCA9IE1BS0VfUkFUSU8oMSw1MDApLCAuZXhwYW5kID0gMSB9LAorCS5iZWxvdwkJPSB7IC52YWwgPSBNQUtFX1JBVElPKDIsMCksIC5leHBhbmQgPSAxIH0sCisJLnRocmVzaG9sZAk9IC0weDAsCisJLmVuZXJneQkJPSBNQUtFX1RJTUUoMiw0MDAwMDApLAorCS5hdHRhY2sJCT0gTUFLRV9USU1FKDIsNDAwMDAwKSwKKwkuZGVjYXkJCT0gTUFLRV9USU1FKDIsNDAwMDAwKSwKK307CisKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHRpbWVfY29uc3RhbnRzW109eworCU1BS0VfVElNRSgwLCAgMTcwMCksCisJTUFLRV9USU1FKDAsICAzNTAwKSwKKwlNQUtFX1RJTUUoMCwgIDY3MDApLAorCU1BS0VfVElNRSgwLCAxMzAwMCksCisJTUFLRV9USU1FKDAsIDI2MDAwKSwKKwlNQUtFX1RJTUUoMCwgNTMwMDApLAorCU1BS0VfVElNRSgwLDEwNjAwMCksCisJTUFLRV9USU1FKDAsMjEyMDAwKSwKKwlNQUtFX1RJTUUoMCw0MjUwMDApLAorCU1BS0VfVElNRSgwLDg1MDAwMCksCisJTUFLRV9USU1FKDEsNzAwMDAwKSwKKwlNQUtFX1RJTUUoMiw0MDAwMDApLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGFib3ZlX3RocmVzaG9sZF9jb21wcmVzc2lvbl9yYXRpb1tdPXsKKwlNQUtFX1JBVElPKCAxLCA3MCksCisJTUFLRV9SQVRJTyggMSwxNDApLAorCU1BS0VfUkFUSU8oIDEsMjMwKSwKKwlNQUtFX1JBVElPKCAxLDMzMCksCisJTUFLRV9SQVRJTyggMSw0NTApLAorCU1BS0VfUkFUSU8oIDEsNjAwKSwKKwlNQUtFX1JBVElPKCAxLDc4MCksCisJTUFLRV9SQVRJTyggMiwgIDApLAorCU1BS0VfUkFUSU8oIDIsMjkwKSwKKwlNQUtFX1JBVElPKCAyLDY3MCksCisJTUFLRV9SQVRJTyggMywyMDApLAorCU1BS0VfUkFUSU8oIDQsICAwKSwKKwlNQUtFX1JBVElPKCA1LDMzMCksCisJTUFLRV9SQVRJTyggOCwgIDApLAorCU1BS0VfUkFUSU8oMTYsICAwKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBhYm92ZV90aHJlc2hvbGRfZXhwYW5zaW9uX3JhdGlvW109eworCU1BS0VfUkFUSU8oMSwgNjApLAorCU1BS0VfUkFUSU8oMSwxMzApLAorCU1BS0VfUkFUSU8oMSwxOTApLAorCU1BS0VfUkFUSU8oMSwyNTApLAorCU1BS0VfUkFUSU8oMSwzMTApLAorCU1BS0VfUkFUSU8oMSwzODApLAorCU1BS0VfUkFUSU8oMSw0NDApLAorCU1BS0VfUkFUSU8oMSw1MDApCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYmVsb3dfdGhyZXNob2xkX2NvbXByZXNzaW9uX3JhdGlvW109eworCU1BS0VfUkFUSU8oMSwgNzApLAorCU1BS0VfUkFUSU8oMSwxNDApLAorCU1BS0VfUkFUSU8oMSwyMzApLAorCU1BS0VfUkFUSU8oMSwzMzApLAorCU1BS0VfUkFUSU8oMSw0NTApLAorCU1BS0VfUkFUSU8oMSw2MDApLAorCU1BS0VfUkFUSU8oMSw3ODApLAorCU1BS0VfUkFUSU8oMiwgIDApCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYmVsb3dfdGhyZXNob2xkX2V4cGFuc2lvbl9yYXRpb1tdPXsKKwlNQUtFX1JBVElPKDEsIDYwKSwKKwlNQUtFX1JBVElPKDEsMTMwKSwKKwlNQUtFX1JBVElPKDEsMTkwKSwKKwlNQUtFX1JBVElPKDEsMjUwKSwKKwlNQUtFX1JBVElPKDEsMzEwKSwKKwlNQUtFX1JBVElPKDEsMzgwKSwKKwlNQUtFX1JBVElPKDEsNDQwKSwKKwlNQUtFX1JBVElPKDEsNTAwKSwKKwlNQUtFX1JBVElPKDEsNTYwKSwKKwlNQUtFX1JBVElPKDEsNjMwKSwKKwlNQUtFX1JBVElPKDEsNjkwKSwKKwlNQUtFX1JBVElPKDEsNzUwKSwKKwlNQUtFX1JBVElPKDEsODEwKSwKKwlNQUtFX1JBVElPKDEsODgwKSwKKwlNQUtFX1JBVElPKDEsOTQwKSwKKwlNQUtFX1JBVElPKDIsICAwKQorfTsKKworc3RhdGljIGlubGluZSBpbnQKK3NlYXJjaCgJdW5zaWduZWQgc2hvcnQgdmFsLAorCWNvbnN0IHVuc2lnbmVkIHNob3J0ICphcnIsCisJY29uc3QgaW50IGFycnNpemUpIHsKKwkvKgorCSAqIFRoaXMgY291bGQgYmUgYSBiaW5hcnkgc2VhcmNoLCBidXQgZm9yIHNtYWxsIHRhYmxlcywKKwkgKiBhIGxpbmVhciBzZWFyY2ggaXMgbGlrZWx5IHRvIGJlIGZhc3RlcgorCSAqLworCisJaW50IGk7CisKKwlmb3IgKGk9MDsgaSA8IGFycnNpemU7IGkrKykKKwkJaWYgKGFycltpXSA+PSB2YWwpCisJCQlnb3RvIF8xOworCXJldHVybiBhcnJzaXplLTE7CisgXzE6CisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChhcnJbaV0tdmFsIDwgdmFsLWFycltpLTFdKSA/IGkgOiBpLTE7Cit9CisKKyNkZWZpbmUgU0VBUkNIKGEsIGIpIHNlYXJjaChhLCBiLCBBUlJBWV9TSVpFKGIpKQorCitzdGF0aWMgaW5saW5lIGludAordGltZV9pbmRleCh1bnNpZ25lZCBzaG9ydCB0aW1lKQoreworCXJldHVybiBTRUFSQ0godGltZSwgdGltZV9jb25zdGFudHMpOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50CithYm92ZV90aHJlc2hvbGRfY29tcHJlc3Npb25faW5kZXgodW5zaWduZWQgc2hvcnQgcmF0aW8pCit7CisJcmV0dXJuIFNFQVJDSChyYXRpbywgYWJvdmVfdGhyZXNob2xkX2NvbXByZXNzaW9uX3JhdGlvKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludAorYWJvdmVfdGhyZXNob2xkX2V4cGFuc2lvbl9pbmRleCh1bnNpZ25lZCBzaG9ydCByYXRpbykKK3sKKwlyZXR1cm4gU0VBUkNIKHJhdGlvLCBhYm92ZV90aHJlc2hvbGRfZXhwYW5zaW9uX3JhdGlvKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludAorYmVsb3dfdGhyZXNob2xkX2NvbXByZXNzaW9uX2luZGV4KHVuc2lnbmVkIHNob3J0IHJhdGlvKQoreworCXJldHVybiBTRUFSQ0gocmF0aW8sIGJlbG93X3RocmVzaG9sZF9jb21wcmVzc2lvbl9yYXRpbyk7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQKK2JlbG93X3RocmVzaG9sZF9leHBhbnNpb25faW5kZXgodW5zaWduZWQgc2hvcnQgcmF0aW8pCit7CisJcmV0dXJuIFNFQVJDSChyYXRpbywgYmVsb3dfdGhyZXNob2xkX2V4cGFuc2lvbl9yYXRpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBkYl90b19yZWd2YWwoc2hvcnQgZGIpIHsKKwlpbnQgcj0wOworCisJcj0oZGIrMHg1OWEwKSAvIDB4NjA7CisKKwlpZiAociA8IDB4OTEpIHJldHVybiAweDkxOworCWlmIChyID4gMHhlZikgcmV0dXJuIDB4ZWY7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2hvcnQgcXVhbnRpemVfZGIoc2hvcnQgZGIpCit7CisJcmV0dXJuIGRiX3RvX3JlZ3ZhbChkYikgKiAweDYwIC0gMHg1OWEwOworfQorCitzdGF0aWMgaW5saW5lIGludAorcmVnaXN0ZXJfd2lkdGgoZW51bSB0YXMzMDA0X3JlZ190IHIpCit7CisJc3dpdGNoKHIpIHsKKwljYXNlIFRBUzMwMDRfUkVHX01DUjoKKyAJY2FzZSBUQVMzMDA0X1JFR19UUkVCTEU6CisJY2FzZSBUQVMzMDA0X1JFR19CQVNTOgorCWNhc2UgVEFTMzAwNF9SRUdfQU5BTE9HX0NUUkw6CisJY2FzZSBUQVMzMDA0X1JFR19URVNUMToKKwljYXNlIFRBUzMwMDRfUkVHX1RFU1QyOgorCWNhc2UgVEFTMzAwNF9SRUdfTUNSMjoKKwkJcmV0dXJuIDE7CisKKwljYXNlIFRBUzMwMDRfUkVHX0xFRlRfTE9VRF9CSVFVQURfR0FJTjoKKwljYXNlIFRBUzMwMDRfUkVHX1JJR0hUX0xPVURfQklRVUFEX0dBSU46CisJCXJldHVybiAzOworCisJY2FzZSBUQVMzMDA0X1JFR19EUkM6CisJY2FzZSBUQVMzMDA0X1JFR19WT0xVTUU6CisJCXJldHVybiA2OworCisJY2FzZSBUQVMzMDA0X1JFR19MRUZUX01JWEVSOgorCWNhc2UgVEFTMzAwNF9SRUdfUklHSFRfTUlYRVI6CisJCXJldHVybiA5OworCisJY2FzZSBUQVMzMDA0X1JFR19URVNUOgorCQlyZXR1cm4gMTA7CisKKwljYXNlIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMDoKKwljYXNlIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMToKKwljYXNlIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMjoKKwljYXNlIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMzoKKwljYXNlIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFENDoKKwljYXNlIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFENToKKwljYXNlIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFENjoKKworCWNhc2UgVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMDoKKwljYXNlIFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDE6CisJY2FzZSBUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQyOgorCWNhc2UgVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMzoKKwljYXNlIFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDQ6CisJY2FzZSBUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQ1OgorCWNhc2UgVEFTMzAwNF9SRUdfUklHSFRfQklRVUFENjoKKworCWNhc2UgVEFTMzAwNF9SRUdfTEVGVF9MT1VEX0JJUVVBRDoKKwljYXNlIFRBUzMwMDRfUkVHX1JJR0hUX0xPVURfQklRVUFEOgorCQlyZXR1cm4gMTU7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfd3JpdGVfcmVnaXN0ZXIoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCWVudW0gdGFzMzAwNF9yZWdfdCByZWdfbnVtLAorCQkJY2hhciAqZGF0YSwKKwkJCXVpbnQgd3JpdGVfbW9kZSkKK3sKKwlpZiAocmVnX251bT09VEFTMzAwNF9SRUdfTUNSIHx8CisJICAgIHJlZ19udW09PVRBUzMwMDRfUkVHX0JBU1MgfHwKKwkgICAgcmVnX251bT09VEFTMzAwNF9SRUdfVFJFQkxFIHx8CisJICAgIHJlZ19udW09PVRBUzMwMDRfUkVHX0FOQUxPR19DVFJMKSB7CisJCXJldHVybiB0YXNfd3JpdGVfYnl0ZV9yZWdpc3Rlcigmc2VsZi0+c3VwZXIsCisJCQkJCSAgICAgICAodWludClyZWdfbnVtLAorCQkJCQkgICAgICAgKmRhdGEsCisJCQkJCSAgICAgICB3cml0ZV9tb2RlKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdGFzX3dyaXRlX3JlZ2lzdGVyKCZzZWxmLT5zdXBlciwKKwkJCQkJICAodWludClyZWdfbnVtLAorCQkJCQkgIHJlZ2lzdGVyX3dpZHRoKHJlZ19udW0pLAorCQkJCQkgIGRhdGEsCisJCQkJCSAgd3JpdGVfbW9kZSk7CisJfQorfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCWVudW0gdGFzMzAwNF9yZWdfdCByZWdfbnVtKQoreworCWlmIChyZWdfbnVtPT1UQVMzMDA0X1JFR19NQ1IgfHwKKwkgICAgcmVnX251bT09VEFTMzAwNF9SRUdfQkFTUyB8fAorCSAgICByZWdfbnVtPT1UQVMzMDA0X1JFR19UUkVCTEUgfHwKKwkgICAgcmVnX251bT09VEFTMzAwNF9SRUdfQU5BTE9HX0NUUkwpIHsKKwkJcmV0dXJuIHRhc19zeW5jX2J5dGVfcmVnaXN0ZXIoJnNlbGYtPnN1cGVyLAorCQkJCQkgICAgICAodWludClyZWdfbnVtLAorCQkJCQkgICAgICByZWdpc3Rlcl93aWR0aChyZWdfbnVtKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRhc19zeW5jX3JlZ2lzdGVyKCZzZWxmLT5zdXBlciwKKwkJCQkJICh1aW50KXJlZ19udW0sCisJCQkJCSByZWdpc3Rlcl93aWR0aChyZWdfbnVtKSk7CisJfQorfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X3JlYWRfcmVnaXN0ZXIoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCWVudW0gdGFzMzAwNF9yZWdfdCByZWdfbnVtLAorCQkJY2hhciAqZGF0YSwKKwkJCXVpbnQgd3JpdGVfbW9kZSkKK3sKKwlyZXR1cm4gdGFzX3JlYWRfcmVnaXN0ZXIoJnNlbGYtPnN1cGVyLAorCQkJCSAodWludClyZWdfbnVtLAorCQkJCSByZWdpc3Rlcl93aWR0aChyZWdfbnVtKSwKKwkJCQkgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0YXMzMDA0X2Zhc3RfbG9hZChzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsIGludCBmYXN0KQoreworCWlmIChmYXN0KQorCQlzZWxmLT5zdXBlci5zaGFkb3dbVEFTMzAwNF9SRUdfTUNSXVswXSB8PSAweDgwOworCWVsc2UKKwkJc2VsZi0+c3VwZXIuc2hhZG93W1RBUzMwMDRfUkVHX01DUl1bMF0gJj0gMHg3ZjsKKwlyZXR1cm4gdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTUNSKTsKK30KKworc3RhdGljIHVpbnQKK3RhczMwMDRfc3VwcG9ydGVkX21peGVycyhzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYpCit7CisJcmV0dXJuIFNPVU5EX01BU0tfVk9MVU1FIHwKKwkJU09VTkRfTUFTS19QQ00gfAorCQlTT1VORF9NQVNLX0FMVFBDTSB8CisJCVNPVU5EX01BU0tfSU1JWCB8CisJCVNPVU5EX01BU0tfVFJFQkxFIHwKKwkJU09VTkRfTUFTS19CQVNTIHwKKwkJU09VTkRfTUFTS19NSUMgfAorCQlTT1VORF9NQVNLX0xJTkU7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfbWl4ZXJfaXNfc3RlcmVvKHN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwgaW50IG1peGVyKQoreworCXN3aXRjaChtaXhlcikgeworCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCWNhc2UgU09VTkRfTUlYRVJfUENNOgorCWNhc2UgU09VTkRfTUlYRVJfQUxUUENNOgorCWNhc2UgU09VTkRfTUlYRVJfSU1JWDoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdWludAordGFzMzAwNF9zdGVyZW9fbWl4ZXJzKHN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZikKK3sKKwl1aW50IHIgPSB0YXMzMDA0X3N1cHBvcnRlZF9taXhlcnMoc2VsZik7CisJdWludCBpOworCQorCWZvciAoaT0xOyBpPFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQlpZiAociYoMTw8aSkgJiYgIXRhczMwMDRfbWl4ZXJfaXNfc3RlcmVvKHNlbGYsaSkpCisJCQlyICY9IH4oMTw8aSk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfZ2V0X21peGVyX2xldmVsKHN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwgaW50IG1peGVyLCB1aW50ICpsZXZlbCkKK3sKKwlpZiAoIXNlbGYpCisJCXJldHVybiAtMTsKKworCSpsZXZlbCA9IHNlbGYtPnN1cGVyLm1peGVyW21peGVyXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X3NldF9taXhlcl9sZXZlbChzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsIGludCBtaXhlciwgdWludCBsZXZlbCkKK3sKKwlpbnQgcmM7CisJdGFzX3NoYWRvd190ICpzaGFkb3c7CisJdWludCB0ZW1wOworCXVpbnQgb2Zmc2V0PTA7CisKKwlpZiAoIXNlbGYpCisJCXJldHVybiAtMTsKKworCXNoYWRvdyA9IHNlbGYtPnN1cGVyLnNoYWRvdzsKKworCWlmICghdGFzMzAwNF9taXhlcl9pc19zdGVyZW8oc2VsZixtaXhlcikpCisJCWxldmVsID0gdGFzX21vbm9fdG9fc3RlcmVvKGxldmVsKTsKKwlzd2l0Y2gobWl4ZXIpIHsKKwljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwkJdGVtcCA9IHRhczMwMDRfZ2Fpbi5tYXN0ZXJbbGV2ZWwmMHhmZl07CisJCVNFVF80XzIwKHNoYWRvd1tUQVMzMDA0X1JFR19WT0xVTUVdLCAwLCB0ZW1wKTsKKwkJdGVtcCA9IHRhczMwMDRfZ2Fpbi5tYXN0ZXJbKGxldmVsPj44KSYweGZmXTsKKwkJU0VUXzRfMjAoc2hhZG93W1RBUzMwMDRfUkVHX1ZPTFVNRV0sIDMsIHRlbXApOworCQlyYyA9IHRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1ZPTFVNRSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfSU1JWDoKKwkJb2Zmc2V0ICs9IDM7CisJY2FzZSBTT1VORF9NSVhFUl9BTFRQQ006CisJCW9mZnNldCArPSAzOworCWNhc2UgU09VTkRfTUlYRVJfUENNOgorCQkvKgorCQkgKiBEb24ndCBsb2FkIHRoZXNlIGluIGZhc3QgbW9kZS4gVGhlIGRvY3VtZW50YXRpb24KKwkJICogc2F5cyBpdCBjYW4gYmUgZG9uZSBpbiBlaXRoZXIgbW9kZSwgYnV0IHRlc3RpbmcgaXQKKwkJICogc2hvd3MgdGhhdCBmYXN0IG1vZGUgcHJvZHVjZXMgdWdseSBjbGlja2luZy4KKwkJKi8KKwkJLyogdGFzMzAwNF9mYXN0X2xvYWQoc2VsZiwxKTsgKi8KKwkJdGVtcCA9IHRhczMwMDRfZ2Fpbi5taXhlcltsZXZlbCYweGZmXTsKKwkJU0VUXzRfMjAoc2hhZG93W1RBUzMwMDRfUkVHX0xFRlRfTUlYRVJdLCBvZmZzZXQsIHRlbXApOworCQl0ZW1wID0gdGFzMzAwNF9nYWluLm1peGVyWyhsZXZlbD4+OCkmMHhmZl07CisJCVNFVF80XzIwKHNoYWRvd1tUQVMzMDA0X1JFR19SSUdIVF9NSVhFUl0sIG9mZnNldCwgdGVtcCk7CisJCXJjID0gdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9NSVhFUik7CisJCWlmIChyYyA9PSAwKQorCQkJcmM9dGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfTUlYRVIpOworCQkvKiB0YXMzMDA0X2Zhc3RfbG9hZChzZWxmLDApOyAqLworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1RSRUJMRToKKwkJdGVtcCA9IHRhczMwMDRfZ2Fpbi50cmVibGVbbGV2ZWwmMHhmZl07CisJCXNoYWRvd1tUQVMzMDA0X1JFR19UUkVCTEVdWzBdPXRlbXAmMHhmZjsKKwkJcmMgPSB0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19UUkVCTEUpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0JBU1M6CisJCXRlbXAgPSB0YXMzMDA0X2dhaW4uYmFzc1tsZXZlbCYweGZmXTsKKwkJc2hhZG93W1RBUzMwMDRfUkVHX0JBU1NdWzBdPXRlbXAmMHhmZjsKKwkJcmMgPSB0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19CQVNTKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCWlmICgobGV2ZWwmMHhmZik+MCkgeworCQkJc29mdHdhcmVfaW5wdXRfdm9sdW1lID0gU1dfSU5QVVRfVk9MVU1FX1NDQUxFICogKGxldmVsJjB4ZmYpOworCQkJaWYgKHNlbGYtPnN1cGVyLm1peGVyW21peGVyXSA9PSAwKSB7CisJCQkJc2VsZi0+c3VwZXIubWl4ZXJbU09VTkRfTUlYRVJfTElORV0gPSAwOworCQkJCXNoYWRvd1tUQVMzMDA0X1JFR19BTkFMT0dfQ1RSTF1bMF09MHhjMjsKKwkJCQlyYyA9IHRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0FOQUxPR19DVFJMKTsKKwkJCX0gZWxzZSByYz0wOworCQl9IGVsc2UgeworCQkJc2VsZi0+c3VwZXIubWl4ZXJbU09VTkRfTUlYRVJfTElORV0gPSBTV19JTlBVVF9WT0xVTUVfREVGQVVMVDsKKwkJCXNvZnR3YXJlX2lucHV0X3ZvbHVtZSA9IFNXX0lOUFVUX1ZPTFVNRV9TQ0FMRSAqCisJCQkJKHNlbGYtPnN1cGVyLm1peGVyW1NPVU5EX01JWEVSX0xJTkVdJjB4ZmYpOworCQkJc2hhZG93W1RBUzMwMDRfUkVHX0FOQUxPR19DVFJMXVswXT0weDAwOworCQkJcmMgPSB0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19BTkFMT0dfQ1RSTCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9MSU5FOgorCQlpZiAoc2VsZi0+c3VwZXIubWl4ZXJbU09VTkRfTUlYRVJfTUlDXSA9PSAwKSB7CisJCQlzb2Z0d2FyZV9pbnB1dF92b2x1bWUgPSBTV19JTlBVVF9WT0xVTUVfU0NBTEUgKiAobGV2ZWwmMHhmZik7CisJCQlyYz0wOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLTE7CisJCWJyZWFrOworCX0KKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJc2VsZi0+c3VwZXIubWl4ZXJbbWl4ZXJdID0gbGV2ZWw7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfbGVhdmVfc2xlZXAoc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmKQoreworCXVuc2lnbmVkIGNoYXIgbWNyID0gKDE8PDYpKygyPDw0KSsoMjw8Mik7CisKKwlpZiAoIXNlbGYpCisJCXJldHVybiAtMTsKKworCS8qIE1ha2Ugc3VyZSBzb21ldGhpbmcgYW5zd2VycyBvbiB0aGUgaTJjIGJ1cyAqLworCWlmICh0YXMzMDA0X3dyaXRlX3JlZ2lzdGVyKHNlbGYsIFRBUzMwMDRfUkVHX01DUiwgJm1jciwKKwkgICAgV1JJVEVfTk9STUFMIHwgRk9SQ0VfV1JJVEUpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJdGFzMzAwNF9mYXN0X2xvYWQoc2VsZiwgMSk7CisKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQwKTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQxKTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQyKTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQzKTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQ0KTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQ1KTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQ2KTsKKworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMCk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQxKTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDIpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMyk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQ0KTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDUpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfQklRVUFENik7CisKKwl0YXMzMDA0X2Zhc3RfbG9hZChzZWxmLCAwKTsKKworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1ZPTFVNRSk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9NSVhFUik7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfTUlYRVIpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1RSRUJMRSk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfQkFTUyk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfQU5BTE9HX0NUUkwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfZW50ZXJfc2xlZXAoc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmKQoreworCWlmICghc2VsZikKKwkJcmV0dXJuIC0xOyAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwNF9zeW5jX2JpcXVhZCgJc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmLAorCQkJdV9pbnQgY2hhbm5lbCwKKwkJCXVfaW50IGZpbHRlcikKK3sKKwllbnVtIHRhczMwMDRfcmVnX3QgcmVnOworCisJaWYgKGNoYW5uZWwgPj0gVEFTMzAwNF9CSVFVQURfQ0hBTk5FTF9DT1VOVCB8fAorCSAgICBmaWx0ZXIgID49IFRBUzMwMDRfQklRVUFEX0ZJTFRFUl9DT1VOVCkgcmV0dXJuIC1FSU5WQUw7CisKKwlyZWc9KCBjaGFubmVsID8gVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMCA6IFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMCApICsgZmlsdGVyOworCisJcmV0dXJuIHRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLHJlZyk7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfd3JpdGVfYmlxdWFkX3NoYWRvdygJc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmLAorCQkJCXVfaW50IGNoYW5uZWwsCisJCQkJdV9pbnQgZmlsdGVyLAorCQkJCWNvbnN0IHVuaW9uIHRhc19iaXF1YWRfdCAqYmlxdWFkKQoreworCXRhc19zaGFkb3dfdCAqc2hhZG93PXNlbGYtPnN1cGVyLnNoYWRvdzsKKwllbnVtIHRhczMwMDRfcmVnX3QgcmVnOworCisJaWYgKGNoYW5uZWwgPj0gVEFTMzAwNF9CSVFVQURfQ0hBTk5FTF9DT1VOVCB8fAorCSAgICBmaWx0ZXIgID49IFRBUzMwMDRfQklRVUFEX0ZJTFRFUl9DT1VOVCkgcmV0dXJuIC1FSU5WQUw7CisKKwlyZWc9KCBjaGFubmVsID8gVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMCA6IFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMCApICsgZmlsdGVyOworCisJU0VUXzRfMjAoc2hhZG93W3JlZ10sIDAsYmlxdWFkLT5jb2VmZi5iMCk7CisJU0VUXzRfMjAoc2hhZG93W3JlZ10sIDMsYmlxdWFkLT5jb2VmZi5iMSk7CisJU0VUXzRfMjAoc2hhZG93W3JlZ10sIDYsYmlxdWFkLT5jb2VmZi5iMik7CisJU0VUXzRfMjAoc2hhZG93W3JlZ10sIDksYmlxdWFkLT5jb2VmZi5hMSk7CisJU0VUXzRfMjAoc2hhZG93W3JlZ10sMTIsYmlxdWFkLT5jb2VmZi5hMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwNF93cml0ZV9iaXF1YWQoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCXVfaW50IGNoYW5uZWwsCisJCQl1X2ludCBmaWx0ZXIsCisJCQljb25zdCB1bmlvbiB0YXNfYmlxdWFkX3QgKmJpcXVhZCkKK3sKKwlpbnQgcmM7CisKKwlyYz10YXMzMDA0X3dyaXRlX2JpcXVhZF9zaGFkb3coc2VsZiwgY2hhbm5lbCwgZmlsdGVyLCBiaXF1YWQpOworCWlmIChyYyA8IDApIHJldHVybiByYzsKKworCXJldHVybiB0YXMzMDA0X3N5bmNfYmlxdWFkKHNlbGYsIGNoYW5uZWwsIGZpbHRlcik7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfd3JpdGVfYmlxdWFkX2xpc3QoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCQl1X2ludCBmaWx0ZXJfY291bnQsCisJCQkJdV9pbnQgZmxhZ3MsCisJCQkJc3RydWN0IHRhc19iaXF1YWRfY3RybF90ICpiaXF1YWRzKQoreworCWludCBpOworCWludCByYzsKKworCWlmIChmbGFncyAmIFRBU19CSVFVQURfRkFTVF9MT0FEKSB0YXMzMDA0X2Zhc3RfbG9hZChzZWxmLDEpOworCisJZm9yIChpPTA7IGk8ZmlsdGVyX2NvdW50OyBpKyspIHsKKwkJcmM9dGFzMzAwNF93cml0ZV9iaXF1YWQoc2VsZiwKKwkJCQkJYmlxdWFkc1tpXS5jaGFubmVsLAorCQkJCQliaXF1YWRzW2ldLmZpbHRlciwKKwkJCQkJJmJpcXVhZHNbaV0uZGF0YSk7CisJCWlmIChyYyA8IDApIGJyZWFrOworCX0KKworCWlmIChmbGFncyAmIFRBU19CSVFVQURfRkFTVF9MT0FEKSB0YXMzMDA0X2Zhc3RfbG9hZChzZWxmLDApOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X3JlYWRfYmlxdWFkKAlzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsCisJCQl1X2ludCBjaGFubmVsLAorCQkJdV9pbnQgZmlsdGVyLAorCQkJdW5pb24gdGFzX2JpcXVhZF90ICpiaXF1YWQpCit7CisJdGFzX3NoYWRvd190ICpzaGFkb3c9c2VsZi0+c3VwZXIuc2hhZG93OworCWVudW0gdGFzMzAwNF9yZWdfdCByZWc7CisKKwlpZiAoY2hhbm5lbCA+PSBUQVMzMDA0X0JJUVVBRF9DSEFOTkVMX0NPVU5UIHx8CisJICAgIGZpbHRlciAgPj0gVEFTMzAwNF9CSVFVQURfRklMVEVSX0NPVU5UKSByZXR1cm4gLUVJTlZBTDsKKworCXJlZz0oIGNoYW5uZWwgPyBUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQwIDogVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQwICkgKyBmaWx0ZXI7CisKKwliaXF1YWQtPmNvZWZmLmIwPUdFVF80XzIwKHNoYWRvd1tyZWddLCAwKTsKKwliaXF1YWQtPmNvZWZmLmIxPUdFVF80XzIwKHNoYWRvd1tyZWddLCAzKTsKKwliaXF1YWQtPmNvZWZmLmIyPUdFVF80XzIwKHNoYWRvd1tyZWddLCA2KTsKKwliaXF1YWQtPmNvZWZmLmExPUdFVF80XzIwKHNoYWRvd1tyZWddLCA5KTsKKwliaXF1YWQtPmNvZWZmLmEyPUdFVF80XzIwKHNoYWRvd1tyZWddLDEyKTsKKwkKKwlyZXR1cm4gMDsJCit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfZXFfcncoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJdV9pbnQgY21kLAorCQl1X2xvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCByYzsKKwlzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgYmlxdWFkOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJmJpcXVhZCwgYXJncCwgc2l6ZW9mKHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCkpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjbWQgJiBTSU9DX0lOKSB7CisJCXJjPXRhczMwMDRfd3JpdGVfYmlxdWFkKHNlbGYsIGJpcXVhZC5jaGFubmVsLCBiaXF1YWQuZmlsdGVyLCAmYmlxdWFkLmRhdGEpOworCQlpZiAocmMgIT0gMCkgcmV0dXJuIHJjOworCX0KKworCWlmIChjbWQgJiBTSU9DX09VVCkgeworCQlyYz10YXMzMDA0X3JlYWRfYmlxdWFkKHNlbGYsIGJpcXVhZC5jaGFubmVsLCBiaXF1YWQuZmlsdGVyLCAmYmlxdWFkLmRhdGEpOworCQlpZiAocmMgIT0gMCkgcmV0dXJuIHJjOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmJpcXVhZCwgc2l6ZW9mKHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X2VxX2xpc3RfcncoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCXVfaW50IGNtZCwKKwkJCXVfbG9uZyBhcmcpCit7CisJaW50IHJjID0gMDsKKwlpbnQgZmlsdGVyX2NvdW50OworCWludCBmbGFnczsKKwlpbnQgaSxqOworCWNoYXIgc3luY19yZXF1aXJlZFtUQVMzMDA0X0JJUVVBRF9DSEFOTkVMX0NPVU5UXVtUQVMzMDA0X0JJUVVBRF9GSUxURVJfQ09VTlRdOworCXN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCBiaXF1YWQ7CisJc3RydWN0IHRhc19iaXF1YWRfY3RybF9saXN0X3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJbWVtc2V0KHN5bmNfcmVxdWlyZWQsMCxzaXplb2Yoc3luY19yZXF1aXJlZCkpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZmaWx0ZXJfY291bnQsICZhcmdwLT5maWx0ZXJfY291bnQsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmZsYWdzLCAmYXJncC0+ZmxhZ3MsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY21kICYgU0lPQ19JTikgeworCX0KKworCWZvciAoaT0wOyBpIDwgZmlsdGVyX2NvdW50OyBpKyspIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZiaXF1YWQsICZhcmdwLT5iaXF1YWRzW2ldLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAoY21kICYgU0lPQ19JTikgeworCQkJc3luY19yZXF1aXJlZFtiaXF1YWQuY2hhbm5lbF1bYmlxdWFkLmZpbHRlcl09MTsKKwkJCXJjPXRhczMwMDRfd3JpdGVfYmlxdWFkX3NoYWRvdyhzZWxmLCBiaXF1YWQuY2hhbm5lbCwgYmlxdWFkLmZpbHRlciwgJmJpcXVhZC5kYXRhKTsKKwkJCWlmIChyYyAhPSAwKSByZXR1cm4gcmM7CisJCX0KKworCQlpZiAoY21kICYgU0lPQ19PVVQpIHsKKwkJCXJjPXRhczMwMDRfcmVhZF9iaXF1YWQoc2VsZiwgYmlxdWFkLmNoYW5uZWwsIGJpcXVhZC5maWx0ZXIsICZiaXF1YWQuZGF0YSk7CisJCQlpZiAocmMgIT0gMCkgcmV0dXJuIHJjOworCisJCQlpZiAoY29weV90b191c2VyKCZhcmdwLT5iaXF1YWRzW2ldLCAmYmlxdWFkLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCkpKSB7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY21kICYgU0lPQ19JTikgeworCQkvKgorCQkgKiBUaGlzIGlzIE9LIGZvciB0aGUgdGFzMzAwNC4gRm9yIHRoZQorCQkgKiB0YXMzMDAxYywgZ29pbmcgaW50byBmYXN0IGxvYWQgbW9kZSBjYXVzZXMKKwkJICogdGhlIHRyZWJsZSBhbmQgYmFzcyB0byBiZSByZXNldCB0byAwZEIsIGFuZAorCQkgKiB2b2x1bWUgY29udHJvbHMgdG8gYmUgbXV0ZWQuCisJCSAqLworCQlpZiAoZmxhZ3MgJiBUQVNfQklRVUFEX0ZBU1RfTE9BRCkgdGFzMzAwNF9mYXN0X2xvYWQoc2VsZiwxKTsKKwkJZm9yIChpPTA7IGk8VEFTMzAwNF9CSVFVQURfQ0hBTk5FTF9DT1VOVDsgaSsrKSB7CisJCQlmb3IgKGo9MDsgajxUQVMzMDA0X0JJUVVBRF9GSUxURVJfQ09VTlQ7IGorKykgeworCQkJCWlmIChzeW5jX3JlcXVpcmVkW2ldW2pdKSB7CisJCQkJCXJjPXRhczMwMDRfc3luY19iaXF1YWQoc2VsZiwgaSwgaik7CisJCQkJCWlmIChyYyA8IDApIGdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCW91dDoKKwkJaWYgKGZsYWdzICYgVEFTX0JJUVVBRF9GQVNUX0xPQUQpCisJCQl0YXMzMDA0X2Zhc3RfbG9hZChzZWxmLDApOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAordGFzMzAwNF91cGRhdGVfZHJjZSgJc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmLAorCQkJaW50IGZsYWdzLAorCQkJc3RydWN0IHRhc19kcmNlX3QgKmRyY2UpCit7CisJdGFzX3NoYWRvd190ICpzaGFkb3c7CisJaW50IGk7CisJc2hhZG93PXNlbGYtPnN1cGVyLnNoYWRvdzsKKworCWlmIChmbGFncyAmIFRBU19EUkNFX0FCT1ZFX1JBVElPKSB7CisJCXNlbGYtPmRyY2Vfc3RhdGUuYWJvdmUuZXhwYW5kID0gZHJjZS0+YWJvdmUuZXhwYW5kOworCQlpZiAoZHJjZS0+YWJvdmUudmFsID09ICgxPDw4KSkgeworCQkJc2VsZi0+ZHJjZV9zdGF0ZS5hYm92ZS52YWwgPSAxPDw4OworCQkJc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bMF0gPSAweDAyOworCQkJCQkKKwkJfSBlbHNlIGlmIChkcmNlLT5hYm92ZS5leHBhbmQpIHsKKwkJCWk9YWJvdmVfdGhyZXNob2xkX2V4cGFuc2lvbl9pbmRleChkcmNlLT5hYm92ZS52YWwpOworCQkJc2VsZi0+ZHJjZV9zdGF0ZS5hYm92ZS52YWw9YWJvdmVfdGhyZXNob2xkX2V4cGFuc2lvbl9yYXRpb1tpXTsKKwkJCXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzBdID0gMHgwYSArIChpPDwzKTsKKwkJfSBlbHNlIHsKKwkJCWk9YWJvdmVfdGhyZXNob2xkX2NvbXByZXNzaW9uX2luZGV4KGRyY2UtPmFib3ZlLnZhbCk7CisJCQlzZWxmLT5kcmNlX3N0YXRlLmFib3ZlLnZhbD1hYm92ZV90aHJlc2hvbGRfY29tcHJlc3Npb25fcmF0aW9baV07CisJCQlzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVswXSA9IDB4MDggKyAoaTw8Myk7CisJCX0KKwl9CisKKwlpZiAoZmxhZ3MgJiBUQVNfRFJDRV9CRUxPV19SQVRJTykgeworCQlzZWxmLT5kcmNlX3N0YXRlLmJlbG93LmV4cGFuZCA9IGRyY2UtPmJlbG93LmV4cGFuZDsKKwkJaWYgKGRyY2UtPmJlbG93LnZhbCA9PSAoMTw8OCkpIHsKKwkJCXNlbGYtPmRyY2Vfc3RhdGUuYmVsb3cudmFsID0gMTw8ODsKKwkJCXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzFdID0gMHgwMjsKKwkJCQkJCisJCX0gZWxzZSBpZiAoZHJjZS0+YmVsb3cuZXhwYW5kKSB7CisJCQlpPWJlbG93X3RocmVzaG9sZF9leHBhbnNpb25faW5kZXgoZHJjZS0+YmVsb3cudmFsKTsKKwkJCXNlbGYtPmRyY2Vfc3RhdGUuYmVsb3cudmFsPWJlbG93X3RocmVzaG9sZF9leHBhbnNpb25fcmF0aW9baV07CisJCQlzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVsxXSA9IDB4MDggKyAoaTw8Myk7CisJCX0gZWxzZSB7CisJCQlpPWJlbG93X3RocmVzaG9sZF9jb21wcmVzc2lvbl9pbmRleChkcmNlLT5iZWxvdy52YWwpOworCQkJc2VsZi0+ZHJjZV9zdGF0ZS5iZWxvdy52YWw9YmVsb3dfdGhyZXNob2xkX2NvbXByZXNzaW9uX3JhdGlvW2ldOworCQkJc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bMV0gPSAweDBhICsgKGk8PDMpOworCQl9CisJfQorCisJaWYgKGZsYWdzICYgVEFTX0RSQ0VfVEhSRVNIT0xEKSB7CisJCXNlbGYtPmRyY2Vfc3RhdGUudGhyZXNob2xkPXF1YW50aXplX2RiKGRyY2UtPnRocmVzaG9sZCk7CisJCXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzJdID0gZGJfdG9fcmVndmFsKHNlbGYtPmRyY2Vfc3RhdGUudGhyZXNob2xkKTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBUQVNfRFJDRV9FTkVSR1kpIHsKKwkJaT10aW1lX2luZGV4KGRyY2UtPmVuZXJneSk7CisJCXNlbGYtPmRyY2Vfc3RhdGUuZW5lcmd5PXRpbWVfY29uc3RhbnRzW2ldOworCQlzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVszXSA9IDB4NDAgKyAoaTw8NCk7CisJfQorCisJaWYgKGZsYWdzICYgVEFTX0RSQ0VfQVRUQUNLKSB7CisJCWk9dGltZV9pbmRleChkcmNlLT5hdHRhY2spOworCQlzZWxmLT5kcmNlX3N0YXRlLmF0dGFjaz10aW1lX2NvbnN0YW50c1tpXTsKKwkJc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bNF0gPSAweDQwICsgKGk8PDQpOworCX0KKworCWlmIChmbGFncyAmIFRBU19EUkNFX0RFQ0FZKSB7CisJCWk9dGltZV9pbmRleChkcmNlLT5kZWNheSk7CisJCXNlbGYtPmRyY2Vfc3RhdGUuZGVjYXk9dGltZV9jb25zdGFudHNbaV07CisJCXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzVdID0gMHg0MCArIChpPDw0KTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBUQVNfRFJDRV9FTkFCTEUpIHsKKwkJc2VsZi0+ZHJjZV9zdGF0ZS5lbmFibGUgPSBkcmNlLT5lbmFibGU7CisJfQorCisJaWYgKCFzZWxmLT5kcmNlX3N0YXRlLmVuYWJsZSkgeworCQlzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVswXSB8PSAweDAxOworCX0KKworI2lmZGVmIERFQlVHX0RSQ0UKKwlwcmludGsoIkRSQ0U6IHNldCBbIEVOQUJMRToleCBBQk9WRToleC8leCBCRUxPVzoleC8leCBUSFJFU0g6JXggRU5FUkdZOiV4IEFUVEFDSzoleCBERUNBWToleFxuIiwKKwkgICAgICAgc2VsZi0+ZHJjZV9zdGF0ZS5lbmFibGUsCisJICAgICAgIHNlbGYtPmRyY2Vfc3RhdGUuYWJvdmUuZXhwYW5kLHNlbGYtPmRyY2Vfc3RhdGUuYWJvdmUudmFsLAorCSAgICAgICBzZWxmLT5kcmNlX3N0YXRlLmJlbG93LmV4cGFuZCxzZWxmLT5kcmNlX3N0YXRlLmJlbG93LnZhbCwKKwkgICAgICAgc2VsZi0+ZHJjZV9zdGF0ZS50aHJlc2hvbGQsCisJICAgICAgIHNlbGYtPmRyY2Vfc3RhdGUuZW5lcmd5LAorCSAgICAgICBzZWxmLT5kcmNlX3N0YXRlLmF0dGFjaywKKwkgICAgICAgc2VsZi0+ZHJjZV9zdGF0ZS5kZWNheSk7CisKKwlwcmludGsoIkRSQ0U6IHJlZyBbICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IF1cbiIsCisJICAgICAgICh1bnNpZ25lZCBjaGFyKXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzBdLAorCSAgICAgICAodW5zaWduZWQgY2hhcilzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVsxXSwKKwkgICAgICAgKHVuc2lnbmVkIGNoYXIpc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bMl0sCisJICAgICAgICh1bnNpZ25lZCBjaGFyKXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzNdLAorCSAgICAgICAodW5zaWduZWQgY2hhcilzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVs0XSwKKwkgICAgICAgKHVuc2lnbmVkIGNoYXIpc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bNV0pOworI2VuZGlmCisKKwlyZXR1cm4gdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsIFRBUzMwMDRfUkVHX0RSQyk7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfZHJjZV9ydygJc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmLAorCQkJdV9pbnQgY21kLAorCQkJdV9sb25nIGFyZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHRhc19kcmNlX2N0cmxfdCBkcmNlX2N0cmw7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRyY2VfY3RybCwgYXJncCwgc2l6ZW9mKHN0cnVjdCB0YXNfZHJjZV9jdHJsX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKyNpZmRlZiBERUJVR19EUkNFCisJcHJpbnRrKCJEUkNFOiBpbnB1dCBbIEZMQUdTOiV4IEVOQUJMRToleCBBQk9WRToleC8leCBCRUxPVzoleC8leCBUSFJFU0g6JXggRU5FUkdZOiV4IEFUVEFDSzoleCBERUNBWToleFxuIiwKKwkgICAgICAgZHJjZV9jdHJsLmZsYWdzLAorCSAgICAgICBkcmNlX2N0cmwuZGF0YS5lbmFibGUsCisJICAgICAgIGRyY2VfY3RybC5kYXRhLmFib3ZlLmV4cGFuZCxkcmNlX2N0cmwuZGF0YS5hYm92ZS52YWwsCisJICAgICAgIGRyY2VfY3RybC5kYXRhLmJlbG93LmV4cGFuZCxkcmNlX2N0cmwuZGF0YS5iZWxvdy52YWwsCisJICAgICAgIGRyY2VfY3RybC5kYXRhLnRocmVzaG9sZCwKKwkgICAgICAgZHJjZV9jdHJsLmRhdGEuZW5lcmd5LAorCSAgICAgICBkcmNlX2N0cmwuZGF0YS5hdHRhY2ssCisJICAgICAgIGRyY2VfY3RybC5kYXRhLmRlY2F5KTsKKyNlbmRpZgorCisJaWYgKGNtZCAmIFNJT0NfSU4pIHsKKwkJcmMgPSB0YXMzMDA0X3VwZGF0ZV9kcmNlKHNlbGYsIGRyY2VfY3RybC5mbGFncywgJmRyY2VfY3RybC5kYXRhKTsKKwkJaWYgKHJjIDwgMCkgcmV0dXJuIHJjOworCX0KKworCWlmIChjbWQgJiBTSU9DX09VVCkgeworCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfRU5BQkxFKQorCQkJZHJjZV9jdHJsLmRhdGEuZW5hYmxlID0gc2VsZi0+ZHJjZV9zdGF0ZS5lbmFibGU7CisJCWlmIChkcmNlX2N0cmwuZmxhZ3MgJiBUQVNfRFJDRV9BQk9WRV9SQVRJTykKKwkJCWRyY2VfY3RybC5kYXRhLmFib3ZlID0gc2VsZi0+ZHJjZV9zdGF0ZS5hYm92ZTsKKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX0JFTE9XX1JBVElPKQorCQkJZHJjZV9jdHJsLmRhdGEuYmVsb3cgPSBzZWxmLT5kcmNlX3N0YXRlLmJlbG93OworCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfVEhSRVNIT0xEKQorCQkJZHJjZV9jdHJsLmRhdGEudGhyZXNob2xkID0gc2VsZi0+ZHJjZV9zdGF0ZS50aHJlc2hvbGQ7CisJCWlmIChkcmNlX2N0cmwuZmxhZ3MgJiBUQVNfRFJDRV9FTkVSR1kpCisJCQlkcmNlX2N0cmwuZGF0YS5lbmVyZ3kgPSBzZWxmLT5kcmNlX3N0YXRlLmVuZXJneTsKKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX0FUVEFDSykKKwkJCWRyY2VfY3RybC5kYXRhLmF0dGFjayA9IHNlbGYtPmRyY2Vfc3RhdGUuYXR0YWNrOworCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfREVDQVkpCisJCQlkcmNlX2N0cmwuZGF0YS5kZWNheSA9IHNlbGYtPmRyY2Vfc3RhdGUuZGVjYXk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZHJjZV9jdHJsLAorCQkJCSBzaXplb2Yoc3RydWN0IHRhc19kcmNlX2N0cmxfdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordGFzMzAwNF91cGRhdGVfZGV2aWNlX3BhcmFtZXRlcnMoc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmKQoreworCWNoYXIgZGF0YTsKKwlpbnQgaTsKKworCWlmICghc2VsZikgcmV0dXJuOworCisJaWYgKHNlbGYtPm91dHB1dF9pZCA9PSBUQVNfT1VUUFVUX0hFQURQSE9ORVMpIHsKKwkJLyogdHVybiBvbiBhbGxQYXNzIHdoZW4gaGVhZHBob25lcyBhcmUgcGx1Z2dlZCBpbiAqLworCQlkYXRhID0gMHgwMjsKKwl9IGVsc2UgeworCQlkYXRhID0gMHgwMDsKKwl9CisKKwl0YXMzMDA0X3dyaXRlX3JlZ2lzdGVyKHNlbGYsIFRBUzMwMDRfUkVHX01DUjIsICZkYXRhLCBXUklURV9OT1JNQUwgfCBGT1JDRV9XUklURSk7CisKKwlmb3IgKGk9MDsgdGFzMzAwNF9lcV9wcmVmc1tpXTsgaSsrKSB7CisJCXN0cnVjdCB0YXNfZXFfcHJlZl90ICplcSA9IHRhczMwMDRfZXFfcHJlZnNbaV07CisKKwkJaWYgKGVxLT5kZXZpY2VfaWQgPT0gc2VsZi0+ZGV2aWNlX2lkICYmCisJCSAgICAoZXEtPm91dHB1dF9pZCA9PSAwIHx8IGVxLT5vdXRwdXRfaWQgPT0gc2VsZi0+b3V0cHV0X2lkKSAmJgorCQkgICAgKGVxLT5zcGVha2VyX2lkID09IDAgfHwgZXEtPnNwZWFrZXJfaWQgPT0gc2VsZi0+c3BlYWtlcl9pZCkpIHsKKworCQkJdGFzMzAwNF91cGRhdGVfZHJjZShzZWxmLCBUQVNfRFJDRV9BTEwsIGVxLT5kcmNlKTsKKwkJCXRhczMwMDRfd3JpdGVfYmlxdWFkX2xpc3Qoc2VsZiwgZXEtPmZpbHRlcl9jb3VudCwgVEFTX0JJUVVBRF9GQVNUX0xPQUQsIGVxLT5iaXF1YWRzKTsKKworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCit0YXMzMDA0X2RldmljZV9jaGFuZ2VfaGFuZGxlcih2b2lkICpzZWxmKQoreworCWlmICghc2VsZikgcmV0dXJuOworCisJdGFzMzAwNF91cGRhdGVfZGV2aWNlX3BhcmFtZXRlcnMoKHN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqKXNlbGYpOworfQorCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGRldmljZV9jaGFuZ2U7CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfb3V0cHV0X2RldmljZV9jaGFuZ2UoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCQlpbnQgZGV2aWNlX2lkLAorCQkJCWludCBvdXRwdXRfaWQsCisJCQkJaW50IHNwZWFrZXJfaWQpCit7CisJc2VsZi0+ZGV2aWNlX2lkPWRldmljZV9pZDsKKwlzZWxmLT5vdXRwdXRfaWQ9b3V0cHV0X2lkOworCXNlbGYtPnNwZWFrZXJfaWQ9c3BlYWtlcl9pZDsKKworCXNjaGVkdWxlX3dvcmsoJmRldmljZV9jaGFuZ2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfZGV2aWNlX2lvY3RsKAlzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsCisJCQl1X2ludCBjbWQsCisJCQl1X2xvbmcgYXJnKQoreworCXVpbnQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUQVNfUkVBRF9FUToKKwljYXNlIFRBU19XUklURV9FUToKKwkJcmV0dXJuIHRhczMwMDRfZXFfcncoc2VsZiwgY21kLCBhcmcpOworCisJY2FzZSBUQVNfUkVBRF9FUV9MSVNUOgorCWNhc2UgVEFTX1dSSVRFX0VRX0xJU1Q6CisJCXJldHVybiB0YXMzMDA0X2VxX2xpc3Rfcncoc2VsZiwgY21kLCBhcmcpOworCisJY2FzZSBUQVNfUkVBRF9FUV9GSUxURVJfQ09VTlQ6CisJCXB1dF91c2VyKFRBUzMwMDRfQklRVUFEX0ZJTFRFUl9DT1VOVCwgYXJncCk7CisJCXJldHVybiAwOworCisJY2FzZSBUQVNfUkVBRF9FUV9DSEFOTkVMX0NPVU5UOgorCQlwdXRfdXNlcihUQVMzMDA0X0JJUVVBRF9DSEFOTkVMX0NPVU5ULCBhcmdwKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRBU19SRUFEX0RSQ0U6CisJY2FzZSBUQVNfV1JJVEVfRFJDRToKKwkJcmV0dXJuIHRhczMwMDRfZHJjZV9ydyhzZWxmLCBjbWQsIGFyZyk7CisKKwljYXNlIFRBU19SRUFEX0RSQ0VfQ0FQUzoKKwkJcHV0X3VzZXIoVEFTX0RSQ0VfRU5BQkxFICAgICAgICAgfAorCQkJIFRBU19EUkNFX0FCT1ZFX1JBVElPICAgIHwKKwkJCSBUQVNfRFJDRV9CRUxPV19SQVRJTyAgICB8CisJCQkgVEFTX0RSQ0VfVEhSRVNIT0xEICAgICAgfAorCQkJIFRBU19EUkNFX0VORVJHWSAgICAgICAgIHwKKwkJCSBUQVNfRFJDRV9BVFRBQ0sgICAgICAgICB8CisJCQkgVEFTX0RSQ0VfREVDQVksCisJCQkgYXJncCk7CisJCXJldHVybiAwOworCisJY2FzZSBUQVNfUkVBRF9EUkNFX01JTjoKKwljYXNlIFRBU19SRUFEX0RSQ0VfTUFYOiB7CisJCXN0cnVjdCB0YXNfZHJjZV9jdHJsX3QgZHJjZV9jdHJsOworCQljb25zdCBzdHJ1Y3QgdGFzX2RyY2VfdCAqZHJjZV9jb3B5OworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZHJjZV9jdHJsLCBhcmdwLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgdGFzX2RyY2VfY3RybF90KSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJaWYgKGNtZCA9PSBUQVNfUkVBRF9EUkNFX01JTikgeworCQkJZHJjZV9jb3B5PSZ0YXMzMDA0X2RyY2VfbWluOworCQl9IGVsc2UgeworCQkJZHJjZV9jb3B5PSZ0YXMzMDA0X2RyY2VfbWF4OworCQl9CisKKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX0FCT1ZFX1JBVElPKSB7CisJCQlkcmNlX2N0cmwuZGF0YS5hYm92ZT1kcmNlX2NvcHktPmFib3ZlOworCQl9CisJCWlmIChkcmNlX2N0cmwuZmxhZ3MgJiBUQVNfRFJDRV9CRUxPV19SQVRJTykgeworCQkJZHJjZV9jdHJsLmRhdGEuYmVsb3c9ZHJjZV9jb3B5LT5iZWxvdzsKKwkJfQorCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfVEhSRVNIT0xEKSB7CisJCQlkcmNlX2N0cmwuZGF0YS50aHJlc2hvbGQ9ZHJjZV9jb3B5LT50aHJlc2hvbGQ7CisJCX0KKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX0VORVJHWSkgeworCQkJZHJjZV9jdHJsLmRhdGEuZW5lcmd5PWRyY2VfY29weS0+ZW5lcmd5OworCQl9CisJCWlmIChkcmNlX2N0cmwuZmxhZ3MgJiBUQVNfRFJDRV9BVFRBQ0spIHsKKwkJCWRyY2VfY3RybC5kYXRhLmF0dGFjaz1kcmNlX2NvcHktPmF0dGFjazsKKwkJfQorCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfREVDQVkpIHsKKwkJCWRyY2VfY3RybC5kYXRhLmRlY2F5PWRyY2VfY29weS0+ZGVjYXk7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZkcmNlX2N0cmwsCisJCQkJIHNpemVvZihzdHJ1Y3QgdGFzX2RyY2VfY3RybF90KSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X2luaXRfbWl4ZXIoc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmKQoreworCXVuc2lnbmVkIGNoYXIgbWNyID0gKDE8PDYpKygyPDw0KSsoMjw8Mik7CisKKwkvKiBNYWtlIHN1cmUgc29tZXRoaW5nIGFuc3dlcnMgb24gdGhlIGkyYyBidXMgKi8KKwlpZiAodGFzMzAwNF93cml0ZV9yZWdpc3RlcihzZWxmLCBUQVMzMDA0X1JFR19NQ1IsICZtY3IsCisJICAgIFdSSVRFX05PUk1BTCB8IEZPUkNFX1dSSVRFKSA8IDApCisJCXJldHVybiAtMTsKKworCXRhczMwMDRfZmFzdF9sb2FkKHNlbGYsIDEpOworCisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMCk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMSk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMik7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMyk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFENCk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFENSk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFENik7CisKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDApOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMSk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQyKTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDMpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfQklRVUFENCk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQ1KTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDYpOworCisJdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsIFRBUzMwMDRfUkVHX0RSQyk7CisKKwl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZiwgVEFTMzAwNF9SRUdfTUNSMik7CisKKwl0YXMzMDA0X2Zhc3RfbG9hZChzZWxmLCAwKTsKKworCXRhczMwMDRfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX1ZPTFVNRSwgVk9MX0RFRkFVTFQ8PDggfCBWT0xfREVGQVVMVCk7CisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfUENNLCBJTlBVVF9ERUZBVUxUPDw4IHwgSU5QVVRfREVGQVVMVCk7CisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfQUxUUENNLCAwKTsKKwl0YXMzMDA0X3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9JTUlYLCAwKTsKKworCXRhczMwMDRfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX0JBU1MsIEJBU1NfREVGQVVMVCk7CisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfVFJFQkxFLCBUUkVCTEVfREVGQVVMVCk7CisKKwl0YXMzMDA0X3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9MSU5FLFNXX0lOUFVUX1ZPTFVNRV9ERUZBVUxUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X3VuaW5pdF9taXhlcihzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYpCit7CisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfVk9MVU1FLCAwKTsKKwl0YXMzMDA0X3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9QQ00sIDApOworCXRhczMwMDRfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX0FMVFBDTSwgMCk7CisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfSU1JWCwgMCk7CisKKwl0YXMzMDA0X3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9CQVNTLCAwKTsKKwl0YXMzMDA0X3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9UUkVCTEUsIDApOworCisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfTElORSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwNF9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmOworCXNpemVfdCBzeiA9IHNpemVvZigqc2VsZikgKyAoVEFTMzAwNF9SRUdfTUFYKnNpemVvZih0YXNfc2hhZG93X3QpKTsKKwljaGFyIGRyY2VfaW5pdFtdID0geyAweDY5LCAweDIyLCAweDlmLCAweGIwLCAweDYwLCAweGEwIH07CisJY2hhciBtY3IyID0gMDsKKwlpbnQgaSwgajsKKworCXNlbGYgPSBrbWFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlbGYpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChzZWxmLCAwLCBzeik7CisKKwlzZWxmLT5zdXBlci5jbGllbnQgPSBjbGllbnQ7CisJc2VsZi0+c3VwZXIuc2hhZG93ID0gKHRhc19zaGFkb3dfdCAqKShzZWxmKzEpOworCXNlbGYtPm91dHB1dF9pZCA9IFRBU19PVVRQVVRfSEVBRFBIT05FUzsKKworCWRldl9zZXRfZHJ2ZGF0YSgmY2xpZW50LT5kZXYsIHNlbGYpOworCisJZm9yIChpID0gMDsgaSA8IFRBUzMwMDRfQklRVUFEX0NIQU5ORUxfQ09VTlQ7IGkrKykKKwkJZm9yIChqID0gMDsgajxUQVMzMDA0X0JJUVVBRF9GSUxURVJfQ09VTlQ7IGorKykKKwkJCXRhczMwMDRfd3JpdGVfYmlxdWFkX3NoYWRvdyhzZWxmLCBpLCBqLAorCQkJCQkmdGFzMzAwNF9lcV91bml0eSk7CisKKwl0YXMzMDA0X3dyaXRlX3JlZ2lzdGVyKHNlbGYsIFRBUzMwMDRfUkVHX01DUjIsICZtY3IyLCBXUklURV9TSEFET1cpOworCXRhczMwMDRfd3JpdGVfcmVnaXN0ZXIoc2VsZiwgVEFTMzAwNF9SRUdfRFJDLCBkcmNlX2luaXQsIFdSSVRFX1NIQURPVyk7CisKKwlJTklUX1dPUksoJmRldmljZV9jaGFuZ2UsIHRhczMwMDRfZGV2aWNlX2NoYW5nZV9oYW5kbGVyLCBzZWxmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgCit0YXMzMDA0X3VuaW5pdChzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYpCit7CisJdGFzMzAwNF91bmluaXRfbWl4ZXIoc2VsZik7CisJa2ZyZWUoc2VsZik7Cit9CisKKworc3RydWN0IHRhc19kcml2ZXJfaG9va3NfdCB0YXMzMDA0X2hvb2tzID0geworCS5pbml0CQkJPSAodGFzX2hvb2tfaW5pdF90KXRhczMwMDRfaW5pdCwKKwkucG9zdF9pbml0CQk9ICh0YXNfaG9va19wb3N0X2luaXRfdCl0YXMzMDA0X2luaXRfbWl4ZXIsCisJLnVuaW5pdAkJCT0gKHRhc19ob29rX3VuaW5pdF90KXRhczMwMDRfdW5pbml0LAorCS5nZXRfbWl4ZXJfbGV2ZWwJPSAodGFzX2hvb2tfZ2V0X21peGVyX2xldmVsX3QpdGFzMzAwNF9nZXRfbWl4ZXJfbGV2ZWwsCisJLnNldF9taXhlcl9sZXZlbAk9ICh0YXNfaG9va19zZXRfbWl4ZXJfbGV2ZWxfdCl0YXMzMDA0X3NldF9taXhlcl9sZXZlbCwKKwkuZW50ZXJfc2xlZXAJCT0gKHRhc19ob29rX2VudGVyX3NsZWVwX3QpdGFzMzAwNF9lbnRlcl9zbGVlcCwKKwkubGVhdmVfc2xlZXAJCT0gKHRhc19ob29rX2xlYXZlX3NsZWVwX3QpdGFzMzAwNF9sZWF2ZV9zbGVlcCwKKwkuc3VwcG9ydGVkX21peGVycwk9ICh0YXNfaG9va19zdXBwb3J0ZWRfbWl4ZXJzX3QpdGFzMzAwNF9zdXBwb3J0ZWRfbWl4ZXJzLAorCS5taXhlcl9pc19zdGVyZW8JPSAodGFzX2hvb2tfbWl4ZXJfaXNfc3RlcmVvX3QpdGFzMzAwNF9taXhlcl9pc19zdGVyZW8sCisJLnN0ZXJlb19taXhlcnMJCT0gKHRhc19ob29rX3N0ZXJlb19taXhlcnNfdCl0YXMzMDA0X3N0ZXJlb19taXhlcnMsCisJLm91dHB1dF9kZXZpY2VfY2hhbmdlCT0gKHRhc19ob29rX291dHB1dF9kZXZpY2VfY2hhbmdlX3QpdGFzMzAwNF9vdXRwdXRfZGV2aWNlX2NoYW5nZSwKKwkuZGV2aWNlX2lvY3RsCQk9ICh0YXNfaG9va19kZXZpY2VfaW9jdGxfdCl0YXMzMDA0X2RldmljZV9pb2N0bAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDA0LmggYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDU4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwNC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBIZWFkZXIgZmlsZSBmb3IgdGhlIGkyYy9pMnMgYmFzZWQgVEEzMDA0IHNvdW5kIGNoaXAgdXNlZAorICogb24gc29tZSBBcHBsZSBoYXJkd2FyZS4gQWxzbyBrbm93biBhcyAidHVtYmxlciIuCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFdyaXR0ZW4gYnkgQ2hyaXN0b3BoZXIgQy4gQ2hpbWVsaXMgPGNocmlzQGRlYmlhbi5vcmc+CisgKi8KKworI2lmbmRlZiBfVEFTMzAwNF9IXworI2RlZmluZSBfVEFTMzAwNF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgInRhc19jb21tb24uaCIKKyNpbmNsdWRlICJ0YXNfZXFfcHJlZnMuaCIKKworLyoKKyAqIE1hY3JvcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHJlZ2lzdGVycyB0aGF0IHdlIHdyaXRlIHRvCisgKiB3aGVuIHNldHRpbmcgdGhlIHZhcmlvdXMgdmFsdWVzLgorICovCisKKyNkZWZpbmUgVEFTMzAwNF9WRVJTSU9OCSAgICAgICAgIjAuMyIKKyNkZWZpbmUgVEFTMzAwNF9EQVRFCSAgICAgICAgIjIwMDExMjE0IgorCisjZGVmaW5lIEkyQ19EUklWRVJOQU1FX1RBUzMwMDQgIlRBUzMwMDQgZHJpdmVyIFYgIiBUQVMzMDA0X1ZFUlNJT04KKyNkZWZpbmUgSTJDX0RSSVZFUklEX1RBUzMwMDQgICAgKEkyQ19EUklWRVJJRF9UQVNfQkFTRSsxKQorCitleHRlcm4gIHN0cnVjdCB0YXNfZHJpdmVyX2hvb2tzX3QgdGFzMzAwNF9ob29rczsKK2V4dGVybiBzdHJ1Y3QgdGFzX2dhaW5fdCB0YXMzMDA0X2dhaW47CitleHRlcm4gc3RydWN0IHRhc19lcV9wcmVmX3QgKnRhczMwMDRfZXFfcHJlZnNbXTsKKworZW51bSB0YXMzMDA0X3JlZ190IHsKKyAgVEFTMzAwNF9SRUdfTUNSICAgICAgICAgICAgICAgICAgICA9IDB4MDEsCisgIFRBUzMwMDRfUkVHX0RSQyAgICAgICAgICAgICAgICAgICAgPSAweDAyLAorCisgIFRBUzMwMDRfUkVHX1ZPTFVNRSAgICAgICAgICAgICAgICAgPSAweDA0LAorICBUQVMzMDA0X1JFR19UUkVCTEUgICAgICAgICAgICAgICAgID0gMHgwNSwKKyAgVEFTMzAwNF9SRUdfQkFTUyAgICAgICAgICAgICAgICAgICA9IDB4MDYsCisgIFRBUzMwMDRfUkVHX0xFRlRfTUlYRVIgICAgICAgICAgICAgPSAweDA3LAorICBUQVMzMDA0X1JFR19SSUdIVF9NSVhFUiAgICAgICAgICAgID0gMHgwOCwKKworICBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDAgICAgICAgICAgID0gMHgwYSwKKyAgVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQxICAgICAgICAgICA9IDB4MGIsCisgIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMiAgICAgICAgICAgPSAweDBjLAorICBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDMgICAgICAgICAgID0gMHgwZCwKKyAgVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQ0ICAgICAgICAgICA9IDB4MGUsCisgIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFENSAgICAgICAgICAgPSAweDBmLAorICBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDYgICAgICAgICAgID0gMHgxMCwKKyAgCisgIFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDAgICAgICAgICAgPSAweDEzLAorICBUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQxICAgICAgICAgID0gMHgxNCwKKyAgVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMiAgICAgICAgICA9IDB4MTUsCisgIFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDMgICAgICAgICAgPSAweDE2LAorICBUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQ0ICAgICAgICAgID0gMHgxNywKKyAgVEFTMzAwNF9SRUdfUklHSFRfQklRVUFENSAgICAgICAgICA9IDB4MTgsCisgIFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDYgICAgICAgICAgPSAweDE5LAorCisgIFRBUzMwMDRfUkVHX0xFRlRfTE9VRF9CSVFVQUQgICAgICAgPSAweDIxLAorICBUQVMzMDA0X1JFR19SSUdIVF9MT1VEX0JJUVVBRCAgICAgID0gMHgyMiwKKworICBUQVMzMDA0X1JFR19MRUZUX0xPVURfQklRVUFEX0dBSU4gID0gMHgyMywKKyAgVEFTMzAwNF9SRUdfUklHSFRfTE9VRF9CSVFVQURfR0FJTiA9IDB4MjQsCisKKyAgVEFTMzAwNF9SRUdfVEVTVCAgICAgICAgICAgICAgICAgICA9IDB4MjksCisKKyAgVEFTMzAwNF9SRUdfQU5BTE9HX0NUUkwgICAgICAgICAgICA9IDB4NDAsCisgIFRBUzMwMDRfUkVHX1RFU1QxICAgICAgICAgICAgICAgICAgPSAweDQxLAorICBUQVMzMDA0X1JFR19URVNUMiAgICAgICAgICAgICAgICAgID0gMHg0MiwKKyAgVEFTMzAwNF9SRUdfTUNSMiAgICAgICAgICAgICAgICAgICA9IDB4NDMsCisKKyAgVEFTMzAwNF9SRUdfTUFYICAgICAgICAgICAgICAgICAgICA9IDB4NDQKK307CisKKyNlbmRpZiAvKiBfVEFTMzAwNF9IXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDRfdGFibGVzLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwNF90YWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTEwZTBhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDRfdGFibGVzLmMKQEAgLTAsMCArMSwzMDEgQEAKKyNpbmNsdWRlICJ0YXMzMDA0LmgiCisjaW5jbHVkZSAidGFzX2VxX3ByZWZzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2RyY2VfdCBlcXBfMTdfMV8wX2RyY2U9eworICAgIC5lbmFibGUgICAgID0gMSwKKyAgICAuYWJvdmUgICAgICA9IHsgLnZhbCA9IDMuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgICAuYmVsb3cgICAgICA9IHsgLnZhbCA9IDEuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgICAudGhyZXNob2xkICA9IC0xOS4xMiAgKiAoMTw8OCksCisgICAgLmVuZXJneSAgICAgPSAyLjQgICAgICogKDE8PDEyKSwKKyAgICAuYXR0YWNrICAgICA9IDAuMDEzICAgKiAoMTw8MTIpLAorICAgIC5kZWNheSAgICAgID0gMC4yMTIgICAqICgxPDwxMiksCit9OworCitzdGF0aWMgc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGVxcF8xN18xXzBfYmlxdWFkc1tdPXsKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmZDBkNCwgMHhlMDVlNTYsIDB4MGZkMGQ0LCAweGUwNWVlMSwgMHgwZmEyMzQgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwOTEwZDcsIDB4MDg4ZTFhLCAweDAzMDY1MSwgMHgwMWRjYjEsIDB4MDJjODkyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGZmODk1LCAweGUwOTcwYiwgMHgwZjdmMDAsIDB4ZTA5NzBiLCAweDBmNzc5NSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmZDFjNCwgMHhlMWFjMjIsIDB4MGVjOGNmLCAweGUxYWMyMiwgMHgwZTlhOTQgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZjdjMWMsIDB4ZTNjYzAzLCAweDBkZjc4NiwgMHhlM2NjMDMsIDB4MGQ3M2EyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTFmYjkyLCAweGY1YTFhMCwgMHgwNzNjZDIsIDB4ZjVhMWEwLCAweDA5Mzg2NSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA2LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBlMTdhOSwgMHgwNjhiNmMsIDB4MDhhMGU1LCAweDA2OGI2YywgMHgwNmI4OGUgfSB9IH0sCisKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmZDBkNCwgMHhlMDVlNTYsIDB4MGZkMGQ0LCAweGUwNWVlMSwgMHgwZmEyMzQgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwOTEwZDcsIDB4MDg4ZTFhLCAweDAzMDY1MSwgMHgwMWRjYjEsIDB4MDJjODkyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGZmODk1LCAweGUwOTcwYiwgMHgwZjdmMDAsIDB4ZTA5NzBiLCAweDBmNzc5NSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmZDFjNCwgMHhlMWFjMjIsIDB4MGVjOGNmLCAweGUxYWMyMiwgMHgwZTlhOTQgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZjdjMWMsIDB4ZTNjYzAzLCAweDBkZjc4NiwgMHhlM2NjMDMsIDB4MGQ3M2EyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTFmYjkyLCAweGY1YTFhMCwgMHgwNzNjZDIsIDB4ZjVhMWEwLCAweDA5Mzg2NSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA2LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBlMTdhOSwgMHgwNjhiNmMsIDB4MDhhMGU1LCAweDA2OGI2YywgMHgwNmI4OGUgfSB9IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2VxX3ByZWZfdCBlcXBfMTdfMV8wID0geworICAuc2FtcGxlX3JhdGUgICA9IDQ0MTAwLAorICAuZGV2aWNlX2lkICAgICA9IDB4MTcsCisgIC5vdXRwdXRfaWQgICAgID0gVEFTX09VVFBVVF9JTlRFUk5BTF9TUEtSLAorICAuc3BlYWtlcl9pZCAgICA9IDB4MDAsCisKKyAgLmRyY2UgICAgICAgICAgPSAmZXFwXzE3XzFfMF9kcmNlLAorCisgIC5maWx0ZXJfY291bnQgID0gMTQsCisgIC5iaXF1YWRzICAgICAgID0gZXFwXzE3XzFfMF9iaXF1YWRzCit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHN0cnVjdCB0YXNfZHJjZV90IGVxcF8xOF8xXzBfZHJjZT17CisgIC5lbmFibGUgICAgID0gMSwKKyAgLmFib3ZlICAgICAgPSB7IC52YWwgPSAzLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC5iZWxvdyAgICAgID0geyAudmFsID0gMS4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAudGhyZXNob2xkICA9IC0xMy4xNCAgKiAoMTw8OCksCisgIC5lbmVyZ3kgICAgID0gMi40ICAgICAqICgxPDwxMiksCisgIC5hdHRhY2sgICAgID0gMC4wMTMgICAqICgxPDwxMiksCisgIC5kZWNheSAgICAgID0gMC4yMTIgICAqICgxPDwxMiksCit9OworCitzdGF0aWMgc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGVxcF8xOF8xXzBfYmlxdWFkc1tdPXsKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmNTUxNCwgMHhlMTU1ZDcsIDB4MGY1NTE0LCAweGUxNWNmYSwgMHgwZWIxNGIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwNmVjMzMsIDB4MDJhYmUzLCAweDAxNWVlZiwgMHhmNzY0ZDksIDB4MDM5MjJkIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGVmNWYyLCAweGU2N2QxZiwgMHgwYmNmMzcsIDB4ZTY3ZDFmLCAweDBhYzUyOSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBkYjA1MCwgMHhlNWJlNGQsIDB4MGQwYzc4LCAweGU1YmU0ZCwgMHgwYWJjYzggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZjEyOTgsIDB4ZTY0ZWM2LCAweDBjYzAzZSwgMHhlNjRlYzYsIDB4MGJkMmQ3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGM2NDFhLCAweDA2NTM3YSwgMHgwOGQxNTUsIDB4MDY1MzdhLCAweDA1MzU3MCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA2LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDEwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAgfSB9IH0sCisKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmNTUxNCwgMHhlMTU1ZDcsIDB4MGY1NTE0LCAweGUxNWNmYSwgMHgwZWIxNGIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwNmVjMzMsIDB4MDJhYmUzLCAweDAxNWVlZiwgMHhmNzY0ZDksIDB4MDM5MjJkIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGVmNWYyLCAweGU2N2QxZiwgMHgwYmNmMzcsIDB4ZTY3ZDFmLCAweDBhYzUyOSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBkYjA1MCwgMHhlNWJlNGQsIDB4MGQwYzc4LCAweGU1YmU0ZCwgMHgwYWJjYzggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZjEyOTgsIDB4ZTY0ZWM2LCAweDBjYzAzZSwgMHhlNjRlYzYsIDB4MGJkMmQ3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGM2NDFhLCAweDA2NTM3YSwgMHgwOGQxNTUsIDB4MDY1MzdhLCAweDA1MzU3MCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA2LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDEwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAgfSB9IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2VxX3ByZWZfdCBlcXBfMThfMV8wID0geworICAuc2FtcGxlX3JhdGUgICA9IDQ0MTAwLAorICAuZGV2aWNlX2lkICAgICA9IDB4MTgsCisgIC5vdXRwdXRfaWQgICAgID0gVEFTX09VVFBVVF9JTlRFUk5BTF9TUEtSLAorICAuc3BlYWtlcl9pZCAgICA9IDB4MDAsCisKKyAgLmRyY2UgICAgICAgICAgPSAmZXFwXzE4XzFfMF9kcmNlLAorCisgIC5maWx0ZXJfY291bnQgID0gMTQsCisgIC5iaXF1YWRzICAgICAgID0gZXFwXzE4XzFfMF9iaXF1YWRzCit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHN0cnVjdCB0YXNfZHJjZV90IGVxcF8xYV8xXzBfZHJjZT17CisgIC5lbmFibGUgICAgID0gMSwKKyAgLmFib3ZlICAgICAgPSB7IC52YWwgPSAzLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC5iZWxvdyAgICAgID0geyAudmFsID0gMS4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAudGhyZXNob2xkICA9IC0xMC43NSAgKiAoMTw8OCksCisgIC5lbmVyZ3kgICAgID0gMi40ICAgICAqICgxPDwxMiksCisgIC5hdHRhY2sgICAgID0gMC4wMTMgICAqICgxPDwxMiksCisgIC5kZWNheSAgICAgID0gMC4yMTIgICAqICgxPDwxMiksCit9OworCitzdGF0aWMgc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGVxcF8xYV8xXzBfYmlxdWFkc1tdPXsKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmYjhmZCwgMHhlMDhlMDQsIDB4MGZiOGZkLCAweGUwOGY0MCwgMHgwZjczMzYgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwNjM3MWQsIDB4MGM2ZTNhLCAweDA2MzcxZCwgMHgwNWJmZDMsIDB4MDMxY2EyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGZhMWMwLCAweGUxODY5MiwgMHgwZjAzMGUsIDB4ZTE4NjkyLCAweDBlYTRjZSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmZTQ5NSwgMHhlMTdlZmYsIDB4MGYwNDUyLCAweGUxN2VmZiwgMHgwZWU4ZTcgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMDA4NTcsIDB4ZTdlNzFjLCAweDBlOTU5OSwgMHhlN2U3MWMsIDB4MGU5ZGYxIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGZiMjZlLCAweDA2YTgyYywgMHgwZGIyYjQsIDB4MDZhODJjLCAweDBkNjUyMiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA2LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDExNDE5ZCwgMHhmMDZjYmYsIDB4MGE0ZjZlLCAweGYwNmNiZiwgMHgwYjkxMGMgfSB9IH0sCisKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmYjhmZCwgMHhlMDhlMDQsIDB4MGZiOGZkLCAweGUwOGY0MCwgMHgwZjczMzYgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwNjM3MWQsIDB4MGM2ZTNhLCAweDA2MzcxZCwgMHgwNWJmZDMsIDB4MDMxY2EyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGZhMWMwLCAweGUxODY5MiwgMHgwZjAzMGUsIDB4ZTE4NjkyLCAweDBlYTRjZSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmZTQ5NSwgMHhlMTdlZmYsIDB4MGYwNDUyLCAweGUxN2VmZiwgMHgwZWU4ZTcgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMDA4NTcsIDB4ZTdlNzFjLCAweDBlOTU5OSwgMHhlN2U3MWMsIDB4MGU5ZGYxIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGZiMjZlLCAweDA2YTgyYywgMHgwZGIyYjQsIDB4MDZhODJjLCAweDBkNjUyMiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA2LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDExNDE5ZCwgMHhmMDZjYmYsIDB4MGE0ZjZlLCAweGYwNmNiZiwgMHgwYjkxMGMgfSB9IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2VxX3ByZWZfdCBlcXBfMWFfMV8wID0geworICAuc2FtcGxlX3JhdGUgICA9IDQ0MTAwLAorICAuZGV2aWNlX2lkICAgICA9IDB4MWEsCisgIC5vdXRwdXRfaWQgICAgID0gVEFTX09VVFBVVF9JTlRFUk5BTF9TUEtSLAorICAuc3BlYWtlcl9pZCAgICA9IDB4MDAsCisKKyAgLmRyY2UgICAgICAgICAgPSAmZXFwXzFhXzFfMF9kcmNlLAorCisgIC5maWx0ZXJfY291bnQgID0gMTQsCisgIC5iaXF1YWRzICAgICAgID0gZXFwXzFhXzFfMF9iaXF1YWRzCit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHN0cnVjdCB0YXNfZHJjZV90IGVxcF8xY18xXzBfZHJjZT17CisgIC5lbmFibGUgICAgID0gMSwKKyAgLmFib3ZlICAgICAgPSB7IC52YWwgPSAzLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC5iZWxvdyAgICAgID0geyAudmFsID0gMS4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAudGhyZXNob2xkICA9IC0xNC4zNCAgKiAoMTw8OCksCisgIC5lbmVyZ3kgICAgID0gMi40ICAgICAqICgxPDwxMiksCisgIC5hdHRhY2sgICAgID0gMC4wMTMgICAqICgxPDwxMiksCisgIC5kZWNheSAgICAgID0gMC4yMTIgICAqICgxPDwxMiksCit9OworCitzdGF0aWMgc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGVxcF8xY18xXzBfYmlxdWFkc1tdPXsKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmNGY5NSwgMHhlMTYwZDQsIDB4MGY0Zjk1LCAweGUxNjg2ZSwgMHgwZWE2YzUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwNjZiOTIsIDB4MDI5MGQ0LCAweDAxNDhhMCwgMHhmNjg1M2YsIDB4MDNiZmM3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGY1N2RjLCAweGU1MWM5MSwgMHgwZGQxY2IsIDB4ZTUxYzkxLCAweDBkMjlhOCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBkZjFjYiwgMHhlNGZhODQsIDB4MGQ3Y2RjLCAweGU0ZmE4NCwgMHgwYjZlYTcgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZWJhMzYsIDB4ZTZhYTQ4LCAweDBiOWY1MiwgMHhlNmFhNDgsIDB4MGE1OTg5IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGNhZjAyLCAweDA1ZWY5ZCwgMHgwODRiZWIsIDB4MDVlZjlkLCAweDA0ZmFlZSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA2LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmYzY4NiwgMHhlMjI5NDcsIDB4MGU0YjVkLCAweGUyMjk0NywgMHgwZTExZTQgfSB9IH0sCisKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmNGY5NSwgMHhlMTYwZDQsIDB4MGY0Zjk1LCAweGUxNjg2ZSwgMHgwZWE2YzUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwNjZiOTIsIDB4MDI5MGQ0LCAweDAxNDhhMCwgMHhmNjg1M2YsIDB4MDNiZmM3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGY1N2RjLCAweGU1MWM5MSwgMHgwZGQxY2IsIDB4ZTUxYzkxLCAweDBkMjlhOCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBkZjFjYiwgMHhlNGZhODQsIDB4MGQ3Y2RjLCAweGU0ZmE4NCwgMHgwYjZlYTcgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZWJhMzYsIDB4ZTZhYTQ4LCAweDBiOWY1MiwgMHhlNmFhNDgsIDB4MGE1OTg5IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGNhZjAyLCAweDA1ZWY5ZCwgMHgwODRiZWIsIDB4MDVlZjlkLCAweDA0ZmFlZSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA2LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmYzY4NiwgMHhlMjI5NDcsIDB4MGU0YjVkLCAweGUyMjk0NywgMHgwZTExZTQgfSB9IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2VxX3ByZWZfdCBlcXBfMWNfMV8wID0geworICAuc2FtcGxlX3JhdGUgICA9IDQ0MTAwLAorICAuZGV2aWNlX2lkICAgICA9IDB4MWMsCisgIC5vdXRwdXRfaWQgICAgID0gVEFTX09VVFBVVF9JTlRFUk5BTF9TUEtSLAorICAuc3BlYWtlcl9pZCAgICA9IDB4MDAsCisKKyAgLmRyY2UgICAgICAgICAgPSAmZXFwXzFjXzFfMF9kcmNlLAorCisgIC5maWx0ZXJfY291bnQgID0gMTQsCisgIC5iaXF1YWRzICAgICAgID0gZXFwXzFjXzFfMF9iaXF1YWRzCit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHVpbnQgdGFzMzAwNF9tYXN0ZXJfdGFiW109eworCSAgICAgICAweDAsICAgICAgIDB4NzUsICAgICAgIDB4OWMsICAgICAgIDB4YmIsCisJICAgICAgMHhkYiwgICAgICAgMHhmYiwgICAgICAweDExZSwgICAgICAweDE0MywKKwkgICAgIDB4MTZiLCAgICAgIDB4MTk2LCAgICAgIDB4MWMzLCAgICAgIDB4MWY1LAorCSAgICAgMHgyMjksICAgICAgMHgyNjMsICAgICAgMHgyOWYsICAgICAgMHgyZTEsCisJICAgICAweDMyOCwgICAgICAweDM3MywgICAgICAweDNjNSwgICAgICAweDQxYiwKKwkgICAgIDB4NDc4LCAgICAgIDB4NGRjLCAgICAgIDB4NTQ3LCAgICAgIDB4NWI4LAorCSAgICAgMHg2MzMsICAgICAgMHg2YjUsICAgICAgMHg3NDAsICAgICAgMHg3ZDUsCisJICAgICAweDg3MywgICAgICAweDkxYywgICAgICAweDlkMiwgICAgICAweGE5MiwKKwkgICAgIDB4YjVlLCAgICAgIDB4YzM5LCAgICAgIDB4ZDIyLCAgICAgIDB4ZTE5LAorCSAgICAgMHhmMjAsICAgICAweDEwMzcsICAgICAweDExNjEsICAgICAweDEyOWUsCisJICAgIDB4MTNlZCwgICAgIDB4MTU1MSwgICAgIDB4MTZjYSwgICAgIDB4MTg1ZCwKKwkgICAgMHgxYTA4LCAgICAgMHgxYmNjLCAgICAgMHgxZGFjLCAgICAgMHgxZmE3LAorCSAgICAweDIxYzEsICAgICAweDIzZmEsICAgICAweDI2NTUsICAgICAweDI4ZDYsCisJICAgIDB4MmI3YywgICAgIDB4MmU0YSwgICAgIDB4MzE0MSwgICAgIDB4MzQ2NCwKKwkgICAgMHgzN2I0LCAgICAgMHgzYjM1LCAgICAgMHgzZWU5LCAgICAgMHg0MmQzLAorCSAgICAweDQ2ZjYsICAgICAweDRiNTMsICAgICAweDRmZjAsICAgICAweDU0Y2UsCisJICAgIDB4NTlmMiwgICAgIDB4NWY1ZiwgICAgIDB4NjUxOSwgICAgIDB4NmIyNCwKKwkgICAgMHg3MTgzLCAgICAgMHg3ODNjLCAgICAgMHg3ZjUzLCAgICAgMHg4NmNjLAorCSAgICAweDhlYWQsICAgICAweDk2ZmEsICAgICAweDlmYmEsICAgICAweGE4ZjIsCisJICAgIDB4YjJhNywgICAgIDB4YmNlMSwgICAgIDB4YzdhNSwgICAgIDB4ZDJmYSwKKwkgICAgMHhkZWU4LCAgICAgMHhlYjc1LCAgICAgMHhmOGFhLCAgICAweDEwNjhlLAorCSAgIDB4MTE1MmEsICAgIDB4MTI0ODcsICAgIDB4MTM0YWQsICAgIDB4MTQ1YTUsCisJICAgMHgxNTc3YiwgICAgMHgxNmEzNywgICAgMHgxN2RmNSwgICAgMHgxOTJiZCwKKwkgICAweDFhODkwLCAgICAweDFiZjdiLCAgICAweDFkNzhkLCAgICAweDFmMGQxLAorCSAgIDB4MjBiNTUsICAgIDB4MjI3MjcsICAgIDB4MjQ0NTYsICAgIDB4MjYyZjIsCisJICAgMHgyODMwYgorfTsKKworc3RhdGljIHVpbnQgdGFzMzAwNF9taXhlcl90YWJbXT17CisJICAgICAgIDB4MCwgICAgICAweDc0OCwgICAgICAweDliZSwgICAgICAweGJhZiwKKwkgICAgIDB4ZGE0LCAgICAgIDB4ZmIxLCAgICAgMHgxMWRlLCAgICAgMHgxNDMxLAorCSAgICAweDE2YWQsICAgICAweDE5NTksICAgICAweDFjMzcsICAgICAweDFmNGIsCisJICAgIDB4MjI5OCwgICAgIDB4MjYyOCwgICAgIDB4MjlmYiwgICAgIDB4MmUxMiwKKwkgICAgMHgzMjdkLCAgICAgMHgzNzM0LCAgICAgMHgzYzQ3LCAgICAgMHg0MWI0LAorCSAgICAweDQ3ODcsICAgICAweDRkYmUsICAgICAweDU0NmQsICAgICAweDViODYsCisJICAgIDB4NjMyZSwgICAgIDB4NmI1MiwgICAgIDB4NzQwMCwgICAgIDB4N2Q1NCwKKwkgICAgMHg4NzNiLCAgICAgMHg5MWM2LCAgICAgMHg5ZDFhLCAgICAgMHhhOTIwLAorCSAgICAweGI1ZTUsICAgICAweGMzOGMsICAgICAweGQyMWIsICAgICAweGUxOGYsCisJICAgIDB4ZjFmNSwgICAgMHgxMDM2YSwgICAgMHgxMTYwZiwgICAgMHgxMjlkNiwKKwkgICAweDEzZWQwLCAgICAweDE1NTBjLCAgICAweDE2Y2EwLCAgICAweDE4NWM5LAorCSAgIDB4MWEwN2IsICAgIDB4MWJjYzMsICAgIDB4MWRhYjksICAgIDB4MWZhNzUsCisJICAgMHgyMWMwZiwgICAgMHgyM2ZhMywgICAgMHgyNjU1MiwgICAgMHgyOGQ2NCwKKwkgICAweDJiN2M5LCAgICAweDJlNGEyLCAgICAweDMxNDExLCAgICAweDM0NjNiLAorCSAgIDB4MzdiNDQsICAgIDB4M2IzNTMsICAgIDB4M2VlOTQsICAgIDB4NDJkMzAsCisJICAgMHg0NmY1NSwgICAgMHg0YjUzMywgICAgMHg0ZmVmYywgICAgMHg1NGNlNSwKKwkgICAweDU5ZjI1LCAgICAweDVmNWY2LCAgICAweDY1MTkzLCAgICAweDZiMjNjLAorCSAgIDB4NzE4MzUsICAgIDB4NzgzYzMsICAgIDB4N2Y1MmMsICAgIDB4ODZjYzAsCisJICAgMHg4ZWFjYywgICAgMHg5NmZhNSwgICAgMHg5ZmJhMCwgICAgMHhhOGYxYSwKKwkgICAweGIyYTcxLCAgICAweGJjZTBhLCAgICAweGM3YTRhLCAgICAweGQyZmEwLAorCSAgIDB4ZGVlN2IsICAgIDB4ZWI3NTIsICAgIDB4ZjhhOWYsICAgMHgxMDY4ZTQsCisJICAweDExNTJhMywgICAweDEyNDg2YSwgICAweDEzNGFjOCwgICAweDE0NWE1NSwKKwkgIDB4MTU3N2FjLCAgIDB4MTZhMzcwLCAgIDB4MTdkZjUxLCAgIDB4MTkyYmMyLAorCSAgMHgxYTg4ZjgsICAgMHgxYmY3YjcsICAgMHgxZDc4YzksICAgMHgxZjBkMDQsCisJICAweDIwYjU0MiwgICAweDIyNzI2OCwgICAweDI0NDU2NCwgICAweDI2MmYyNiwKKwkgIDB4MjgzMGFmCit9OworCitzdGF0aWMgdWludCB0YXMzMDA0X3RyZWJsZV90YWJbXT17CisJICAgICAgMHg5NiwgICAgICAgMHg5NSwgICAgICAgMHg5NSwgICAgICAgMHg5NCwKKwkgICAgICAweDkzLCAgICAgICAweDkyLCAgICAgICAweDkyLCAgICAgICAweDkxLAorCSAgICAgIDB4OTAsICAgICAgIDB4OTAsICAgICAgIDB4OGYsICAgICAgIDB4OGUsCisJICAgICAgMHg4ZCwgICAgICAgMHg4ZCwgICAgICAgMHg4YywgICAgICAgMHg4YiwKKwkgICAgICAweDhhLCAgICAgICAweDhhLCAgICAgICAweDg5LCAgICAgICAweDg4LAorCSAgICAgIDB4ODgsICAgICAgIDB4ODcsICAgICAgIDB4ODYsICAgICAgIDB4ODUsCisJICAgICAgMHg4NSwgICAgICAgMHg4NCwgICAgICAgMHg4MywgICAgICAgMHg4MywKKwkgICAgICAweDgyLCAgICAgICAweDgxLCAgICAgICAweDgwLCAgICAgICAweDgwLAorCSAgICAgIDB4N2YsICAgICAgIDB4N2UsICAgICAgIDB4N2UsICAgICAgIDB4N2QsCisJICAgICAgMHg3YywgICAgICAgMHg3YiwgICAgICAgMHg3YiwgICAgICAgMHg3YSwKKwkgICAgICAweDc5LCAgICAgICAweDc4LCAgICAgICAweDc4LCAgICAgICAweDc3LAorCSAgICAgIDB4NzYsICAgICAgIDB4NzYsICAgICAgIDB4NzUsICAgICAgIDB4NzQsCisJICAgICAgMHg3MywgICAgICAgMHg3MywgICAgICAgMHg3MiwgICAgICAgMHg3MSwKKwkgICAgICAweDcxLCAgICAgICAweDY4LCAgICAgICAweDQ1LCAgICAgICAweDViLAorCSAgICAgIDB4NmQsICAgICAgIDB4NmMsICAgICAgIDB4NmIsICAgICAgIDB4NmEsCisJICAgICAgMHg2OSwgICAgICAgMHg2OCwgICAgICAgMHg2NywgICAgICAgMHg2NiwKKwkgICAgICAweDY1LCAgICAgICAweDYzLCAgICAgICAweDYyLCAgICAgICAweDYyLAorCSAgICAgIDB4NjAsICAgICAgIDB4NWUsICAgICAgIDB4NWMsICAgICAgIDB4NWIsCisJICAgICAgMHg1OSwgICAgICAgMHg1NywgICAgICAgMHg1NSwgICAgICAgMHg1MywKKwkgICAgICAweDUyLCAgICAgICAweDRmLCAgICAgICAweDRkLCAgICAgICAweDRhLAorCSAgICAgIDB4NDgsICAgICAgIDB4NDYsICAgICAgIDB4NDMsICAgICAgIDB4NDAsCisJICAgICAgMHgzZCwgICAgICAgMHgzYSwgICAgICAgMHgzNiwgICAgICAgMHgzMywKKwkgICAgICAweDJmLCAgICAgICAweDJjLCAgICAgICAweDI3LCAgICAgICAweDIzLAorCSAgICAgIDB4MWYsICAgICAgIDB4MWEsICAgICAgIDB4MTUsICAgICAgICAweGYsCisJICAgICAgIDB4OCwgICAgICAgIDB4NSwgICAgICAgIDB4MiwgICAgICAgIDB4MSwKKwkgICAgICAgMHgxCit9OworCitzdGF0aWMgdWludCB0YXMzMDA0X2Jhc3NfdGFiW109eworCSAgICAgIDB4OTYsICAgICAgIDB4OTUsICAgICAgIDB4OTUsICAgICAgIDB4OTQsCisJICAgICAgMHg5MywgICAgICAgMHg5MiwgICAgICAgMHg5MiwgICAgICAgMHg5MSwKKwkgICAgICAweDkwLCAgICAgICAweDkwLCAgICAgICAweDhmLCAgICAgICAweDhlLAorCSAgICAgIDB4OGQsICAgICAgIDB4OGQsICAgICAgIDB4OGMsICAgICAgIDB4OGIsCisJICAgICAgMHg4YSwgICAgICAgMHg4YSwgICAgICAgMHg4OSwgICAgICAgMHg4OCwKKwkgICAgICAweDg4LCAgICAgICAweDg3LCAgICAgICAweDg2LCAgICAgICAweDg1LAorCSAgICAgIDB4ODUsICAgICAgIDB4ODQsICAgICAgIDB4ODMsICAgICAgIDB4ODMsCisJICAgICAgMHg4MiwgICAgICAgMHg4MSwgICAgICAgMHg4MCwgICAgICAgMHg4MCwKKwkgICAgICAweDdmLCAgICAgICAweDdlLCAgICAgICAweDdlLCAgICAgICAweDdkLAorCSAgICAgIDB4N2MsICAgICAgIDB4N2IsICAgICAgIDB4N2IsICAgICAgIDB4N2EsCisJICAgICAgMHg3OSwgICAgICAgMHg3OCwgICAgICAgMHg3OCwgICAgICAgMHg3NywKKwkgICAgICAweDc2LCAgICAgICAweDc2LCAgICAgICAweDc1LCAgICAgICAweDc0LAorCSAgICAgIDB4NzMsICAgICAgIDB4NzMsICAgICAgIDB4NzIsICAgICAgIDB4NzEsCisJICAgICAgMHg3MCwgICAgICAgMHg2ZiwgICAgICAgMHg2ZSwgICAgICAgMHg2ZCwKKwkgICAgICAweDZjLCAgICAgICAweDZiLCAgICAgICAweDZhLCAgICAgICAweDZhLAorCSAgICAgIDB4NjksICAgICAgIDB4NjcsICAgICAgIDB4NjYsICAgICAgIDB4NjYsCisJICAgICAgMHg2NSwgICAgICAgMHg2MywgICAgICAgMHg2MiwgICAgICAgMHg2MiwKKwkgICAgICAweDYxLCAgICAgICAweDYwLCAgICAgICAweDVlLCAgICAgICAweDVkLAorCSAgICAgIDB4NWIsICAgICAgIDB4NTksICAgICAgIDB4NTcsICAgICAgIDB4NTUsCisJICAgICAgMHg1MywgICAgICAgMHg1MSwgICAgICAgMHg0ZiwgICAgICAgMHg0YywKKwkgICAgICAweDRhLCAgICAgICAweDQ4LCAgICAgICAweDQ2LCAgICAgICAweDQ0LAorCSAgICAgIDB4NDEsICAgICAgIDB4M2UsICAgICAgIDB4M2IsICAgICAgIDB4MzgsCisJICAgICAgMHgzNiwgICAgICAgMHgzMywgICAgICAgMHgyZiwgICAgICAgMHgyYiwKKwkgICAgICAweDI4LCAgICAgICAweDI0LCAgICAgICAweDIwLCAgICAgICAweDFjLAorCSAgICAgIDB4MTcsICAgICAgIDB4MTIsICAgICAgICAweGQsICAgICAgICAweDcsCisJICAgICAgIDB4MQorfTsKKworc3RydWN0IHRhc19nYWluX3QgdGFzMzAwNF9nYWluPXsKKyAgLm1hc3RlciAgPSB0YXMzMDA0X21hc3Rlcl90YWIsCisgIC50cmVibGUgID0gdGFzMzAwNF90cmVibGVfdGFiLAorICAuYmFzcyAgICA9IHRhczMwMDRfYmFzc190YWIsCisgIC5taXhlciAgID0gdGFzMzAwNF9taXhlcl90YWIKK307CisKK3N0cnVjdCB0YXNfZXFfcHJlZl90ICp0YXMzMDA0X2VxX3ByZWZzW109eworICAmZXFwXzE3XzFfMCwKKyAgJmVxcF8xOF8xXzAsCisgICZlcXBfMWFfMV8wLAorICAmZXFwXzFjXzFfMCwKKyAgTlVMTAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC90YXNfY29tbW9uLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNmExZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzX2NvbW1vbi5jCkBAIC0wLDAgKzEsMjE0IEBACisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKKyNpbmNsdWRlICJ0YXNfY29tbW9uLmgiCisKKyNkZWZpbmUgQ0FMTDAocHJvYykJCQkJCQkJCVwKKwlkbyB7CQkJCQkJCQkJXAorCQlzdHJ1Y3QgdGFzX2RhdGFfdCAqc2VsZjsJCQkJCVwKKwkJaWYgKCF0YXNfY2xpZW50IHx8IGRyaXZlcl9ob29rcyA9PSBOVUxMKQkJCVwKKwkJCXJldHVybiAtMTsJCQkJCQlcCisJCXNlbGYgPSBkZXZfZ2V0X2RydmRhdGEoJnRhc19jbGllbnQtPmRldik7CQkJXAorCQlpZiAoZHJpdmVyX2hvb2tzLT5wcm9jKQkJCQkJCVwKKwkJCXJldHVybiBkcml2ZXJfaG9va3MtPnByb2Moc2VsZik7CQkJXAorCQllbHNlCQkJCQkJCQlcCisJCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxMKHByb2MsYXJnLi4uKQkJCQkJCQlcCisJZG8gewkJCQkJCQkJCVwKKwkJc3RydWN0IHRhc19kYXRhX3QgKnNlbGY7CQkJCQlcCisJCWlmICghdGFzX2NsaWVudCB8fCBkcml2ZXJfaG9va3MgPT0gTlVMTCkJCQlcCisJCQlyZXR1cm4gLTE7CQkJCQkJXAorCQlzZWxmID0gZGV2X2dldF9kcnZkYXRhKCZ0YXNfY2xpZW50LT5kZXYpOwkJCVwKKwkJaWYgKGRyaXZlcl9ob29rcy0+cHJvYykJCQkJCQlcCisJCQlyZXR1cm4gZHJpdmVyX2hvb2tzLT5wcm9jKHNlbGYsICMjIGFyZyk7CQlcCisJCWVsc2UJCQkJCQkJCVwKKwkJCXJldHVybiAtRUlOVkFMOwkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisKK3N0YXRpYyB1OCB0YXNfaTJjX2FkZHJlc3MgPSAweDM0Oworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50ICp0YXNfY2xpZW50Oworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSogdGFzX25vZGU7CisKK3N0YXRpYyBpbnQgdGFzX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKK3N0YXRpYyBpbnQgdGFzX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKik7CisKK3N0cnVjdCBpMmNfZHJpdmVyIHRhc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ0YXMiLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlcgk9IHRhc19hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IHRhc19kZXRhY2hfY2xpZW50LAorfTsKKworc3RydWN0IHRhc19kcml2ZXJfaG9va3NfdCAqZHJpdmVyX2hvb2tzOworCitpbnQKK3Rhc19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHRhc19kcml2ZXJfaG9va3NfdCAqaG9va3MpCit7CisJZHJpdmVyX2hvb2tzID0gaG9va3M7CisJcmV0dXJuIDA7Cit9CisKK2ludAordGFzX2dldF9taXhlcl9sZXZlbChpbnQgbWl4ZXIsIHVpbnQgKmxldmVsKQoreworCUNBTEwoZ2V0X21peGVyX2xldmVsLG1peGVyLGxldmVsKTsKK30KKworaW50Cit0YXNfc2V0X21peGVyX2xldmVsKGludCBtaXhlcix1aW50IGxldmVsKQoreworCUNBTEwoc2V0X21peGVyX2xldmVsLG1peGVyLGxldmVsKTsKK30KKworaW50Cit0YXNfZW50ZXJfc2xlZXAodm9pZCkKK3sKKwlDQUxMMChlbnRlcl9zbGVlcCk7Cit9CisKK2ludAordGFzX2xlYXZlX3NsZWVwKHZvaWQpCit7CisJQ0FMTDAobGVhdmVfc2xlZXApOworfQorCitpbnQKK3Rhc19zdXBwb3J0ZWRfbWl4ZXJzKHZvaWQpCit7CisJQ0FMTDAoc3VwcG9ydGVkX21peGVycyk7Cit9CisKK2ludAordGFzX21peGVyX2lzX3N0ZXJlbyhpbnQgbWl4ZXIpCit7CisJQ0FMTChtaXhlcl9pc19zdGVyZW8sbWl4ZXIpOworfQorCitpbnQKK3Rhc19zdGVyZW9fbWl4ZXJzKHZvaWQpCit7CisJQ0FMTDAoc3RlcmVvX21peGVycyk7Cit9CisKK2ludAordGFzX291dHB1dF9kZXZpY2VfY2hhbmdlKGludCBkZXZpY2VfaWQsaW50IGxheW91dF9pZCxpbnQgc3BlYWtlcl9pZCkKK3sKKwlDQUxMKG91dHB1dF9kZXZpY2VfY2hhbmdlLGRldmljZV9pZCxsYXlvdXRfaWQsc3BlYWtlcl9pZCk7Cit9CisKK2ludAordGFzX2RldmljZV9pb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisJQ0FMTChkZXZpY2VfaW9jdGwsY21kLGFyZyk7Cit9CisKK2ludAordGFzX3Bvc3RfaW5pdCh2b2lkKQoreworCUNBTEwwKHBvc3RfaW5pdCk7Cit9CisKK3N0YXRpYyBpbnQKK3Rhc19kZXRlY3RfY2xpZW50KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNsaWVudF9uYW1lID0gInRhcyBEaWdpdGFsIEVxdWFsaXplciI7CisJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJaW50IHJjID0gLUVOT0RFVjsKKworCWlmICghZHJpdmVyX2hvb2tzKSB7CisJCXByaW50ayhLRVJOX0VSUiAidGFzX2RldGVjdF9jbGllbnQgY2FsbGVkIHdpdGggbm8gaG9va3MgIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkKKwluZXdfY2xpZW50ID0ga21hbGxvYyhzaXplb2YoKm5ld19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19jbGllbnQpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChuZXdfY2xpZW50LCAwLCBzaXplb2YoKm5ld19jbGllbnQpKTsKKworCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCW5ld19jbGllbnQtPmRyaXZlciA9ICZ0YXNfZHJpdmVyOworCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgY2xpZW50X25hbWUsIERFVklDRV9OQU1FX1NJWkUpOworCisgICAgICAgIGlmIChkcml2ZXJfaG9va3MtPmluaXQobmV3X2NsaWVudCkpCisJCWdvdG8gYmFpbDsKKworCS8qIFRlbGwgdGhlIGkyYyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KKwlpZiAoaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpIHsKKwkJZHJpdmVyX2hvb2tzLT51bmluaXQoZGV2X2dldF9kcnZkYXRhKCZuZXdfY2xpZW50LT5kZXYpKTsKKwkJZ290byBiYWlsOworCX0KKworCXRhc19jbGllbnQgPSBuZXdfY2xpZW50OworCXJldHVybiAwOworIGJhaWw6CisJdGFzX2NsaWVudCA9IE5VTEw7CisJa2ZyZWUobmV3X2NsaWVudCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50Cit0YXNfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghc3RybmNtcChhZGFwdGVyLT5uYW1lLCAibWFjLWlvIiwgNikpCisJCXJldHVybiB0YXNfZGV0ZWN0X2NsaWVudChhZGFwdGVyLCB0YXNfaTJjX2FkZHJlc3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWlmIChjbGllbnQgPT0gdGFzX2NsaWVudCkgeworCQlkcml2ZXJfaG9va3MtPnVuaW5pdChkZXZfZ2V0X2RydmRhdGEoJmNsaWVudC0+ZGV2KSk7CisKKwkJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwkJa2ZyZWUoY2xpZW50KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3Rhc19jbGVhbnVwKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnRhc19kcml2ZXIpOworfQorCitpbnQgX19pbml0Cit0YXNfaW5pdChpbnQgZHJpdmVyX2lkLCBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSkKK3sKKwl1MzIqIHBhZGRyOworCisJcHJpbnRrKEtFUk5fSU5GTyAidGFzIGRyaXZlciBbJXNdKVxuIiwgZHJpdmVyX25hbWUpOworCisjaWZuZGVmIENPTkZJR19JMkNfS0VZV0VTVAorCXJlcXVlc3RfbW9kdWxlKCJpMmMta2V5d2VzdCIpOworI2VuZGlmCisJdGFzX25vZGUgPSBmaW5kX2RldmljZXMoImRlcSIpOworCWlmICh0YXNfbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwYWRkciA9ICh1MzIgKilnZXRfcHJvcGVydHkodGFzX25vZGUsICJpMmMtYWRkcmVzcyIsIE5VTEwpOworCWlmIChwYWRkcikgeworCQl0YXNfaTJjX2FkZHJlc3MgPSAoKnBhZGRyKSA+PiAxOworCQlwcmludGsoS0VSTl9JTkZPICJ1c2luZyBpMmMgYWRkcmVzczogMHgleCBmcm9tIGRldmljZS10cmVlXG4iLAorCQkJCXRhc19pMmNfYWRkcmVzcyk7CisJfSBlbHNlICAgIAorCQlwcmludGsoS0VSTl9JTkZPICJ1c2luZyBpMmMgYWRkcmVzczogMHgleCAoZGVmYXVsdClcbiIsCisJCQkJdGFzX2kyY19hZGRyZXNzKTsKKworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmdGFzX2RyaXZlcik7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvdGFzX2NvbW1vbi5oIGIvc291bmQvb3NzL2RtYXNvdW5kL3Rhc19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZkNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL3Rhc19jb21tb24uaApAQCAtMCwwICsxLDI4NCBAQAorI2lmbmRlZiBfVEFTX0NPTU1PTl9IXworI2RlZmluZSBfVEFTX0NPTU1PTl9IXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorCisjZGVmaW5lIEkyQ19EUklWRVJJRF9UQVNfQkFTRSAgICgweEZFQkEpCisKKyNkZWZpbmUgU0VUXzRfMjAoc2hhZG93LCBvZmZzZXQsIHZhbCkgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCShzaGFkb3cpWyhvZmZzZXQpKzBdID0gKCh2YWwpID4+IDE2KSAmIDB4ZmY7IFwKKwkJKHNoYWRvdylbKG9mZnNldCkrMV0gPSAoKHZhbCkgPj4gOCkgICYgMHhmZjsgXAorCQkoc2hhZG93KVsob2Zmc2V0KSsyXSA9ICgodmFsKSA+PiAwKSAgJiAweGZmOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBHRVRfNF8yMChzaGFkb3csIG9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKCh1X2ludCkoKHNoYWRvdylbKG9mZnNldCkrMF0pIDw8IDE2KSB8ICAgICAgICAgICAgIFwKKwkgKCh1X2ludCkoKHNoYWRvdylbKG9mZnNldCkrMV0pIDw8ICA4KSB8ICAgICAgICAgICAgIFwKKwkgKCh1X2ludCkoKHNoYWRvdylbKG9mZnNldCkrMl0pIDw8ICAwKSkKKworCisjZGVmaW5lIFRBU19CSVFVQURfRkFTVF9MT0FEIDB4MDEKKworI2RlZmluZSBUQVNfRFJDRV9FTkFCTEUgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgVEFTX0RSQ0VfQUJPVkVfUkFUSU8gICAgICAweDAyCisjZGVmaW5lIFRBU19EUkNFX0JFTE9XX1JBVElPICAgICAgMHgwNAorI2RlZmluZSBUQVNfRFJDRV9USFJFU0hPTEQgICAgICAgIDB4MDgKKyNkZWZpbmUgVEFTX0RSQ0VfRU5FUkdZICAgICAgICAgICAweDEwCisjZGVmaW5lIFRBU19EUkNFX0FUVEFDSyAgICAgICAgICAgMHgyMAorI2RlZmluZSBUQVNfRFJDRV9ERUNBWSAgICAgICAgICAgIDB4NDAKKworI2RlZmluZSBUQVNfRFJDRV9BTEwgICAgICAgICAgICAgIDB4N2YKKworCisjZGVmaW5lIFRBU19PVVRQVVRfSEVBRFBIT05FUyAgICAgMHgwMAorI2RlZmluZSBUQVNfT1VUUFVUX0lOVEVSTkFMX1NQS1IgIDB4MDEKKyNkZWZpbmUgVEFTX09VVFBVVF9FWFRFUk5BTF9TUEtSICAweDAyCisKKwordW5pb24gdGFzX2JpcXVhZF90IHsKKwlzdHJ1Y3QgeworCQlpbnQgYjAsYjEsYjIsYTEsYTI7CisJfSBjb2VmZjsKKwlpbnQgYnVmWzVdOworfTsKKworc3RydWN0IHRhc19iaXF1YWRfY3RybF90IHsKKwl1X2ludCBjaGFubmVsOjQ7CisJdV9pbnQgZmlsdGVyOjQ7CisKKwl1bmlvbiB0YXNfYmlxdWFkX3QgZGF0YTsKK307CisKK3N0cnVjdCB0YXNfYmlxdWFkX2N0cmxfbGlzdF90IHsKKwlpbnQgZmxhZ3M7CisJaW50IGZpbHRlcl9jb3VudDsKKwlzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgYmlxdWFkc1swXTsKK307CisKK3N0cnVjdCB0YXNfcmF0aW9fdCB7CisJdW5zaWduZWQgc2hvcnQgdmFsOyAgICAvKiA4LjggICAgICAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0IGV4cGFuZDsgLyogMCA9IGNvbXByZXNzLCAhMCA9IGV4cGFuZC4gKi8KK307CisKK3N0cnVjdCB0YXNfZHJjZV90IHsKKwl1bnNpZ25lZCBzaG9ydCBlbmFibGU7CisJc3RydWN0IHRhc19yYXRpb190IGFib3ZlOworCXN0cnVjdCB0YXNfcmF0aW9fdCBiZWxvdzsKKwlzaG9ydCB0aHJlc2hvbGQ7ICAgICAgIC8qIGRCLCAgICAgICA4Ljggc2lnbmVkICAgICovCisJdW5zaWduZWQgc2hvcnQgZW5lcmd5OyAvKiBzZWNvbmRzLCAgNC4xMiB1bnNpZ25lZCAqLworCXVuc2lnbmVkIHNob3J0IGF0dGFjazsgLyogc2Vjb25kcywgIDQuMTIgdW5zaWduZWQgKi8KKwl1bnNpZ25lZCBzaG9ydCBkZWNheTsgIC8qIHNlY29uZHMsICA0LjEyIHVuc2lnbmVkICovCit9OworCitzdHJ1Y3QgdGFzX2RyY2VfY3RybF90IHsKKwl1aW50IGZsYWdzOworCisJc3RydWN0IHRhc19kcmNlX3QgZGF0YTsKK307CisKK3N0cnVjdCB0YXNfZ2Fpbl90Cit7CisgIHVuc2lnbmVkIGludCAqbWFzdGVyOworICB1bnNpZ25lZCBpbnQgKnRyZWJsZTsKKyAgdW5zaWduZWQgaW50ICpiYXNzOworICB1bnNpZ25lZCBpbnQgKm1peGVyOworfTsKKwordHlwZWRlZiBjaGFyIHRhc19zaGFkb3dfdFsweDQ1XTsKKworc3RydWN0IHRhc19kYXRhX3QKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXRhc19zaGFkb3dfdCAqc2hhZG93OworCXVpbnQgbWl4ZXJbU09VTkRfTUlYRVJfTlJERVZJQ0VTXTsKK307CisKK3R5cGVkZWYgaW50ICgqdGFzX2hvb2tfaW5pdF90KShzdHJ1Y3QgaTJjX2NsaWVudCAqKTsKK3R5cGVkZWYgaW50ICgqdGFzX2hvb2tfcG9zdF9pbml0X3QpKHN0cnVjdCB0YXNfZGF0YV90ICopOwordHlwZWRlZiB2b2lkICgqdGFzX2hvb2tfdW5pbml0X3QpKHN0cnVjdCB0YXNfZGF0YV90ICopOworCit0eXBlZGVmIGludCAoKnRhc19ob29rX2dldF9taXhlcl9sZXZlbF90KShzdHJ1Y3QgdGFzX2RhdGFfdCAqLGludCx1aW50ICopOwordHlwZWRlZiBpbnQgKCp0YXNfaG9va19zZXRfbWl4ZXJfbGV2ZWxfdCkoc3RydWN0IHRhc19kYXRhX3QgKixpbnQsdWludCk7CisKK3R5cGVkZWYgaW50ICgqdGFzX2hvb2tfZW50ZXJfc2xlZXBfdCkoc3RydWN0IHRhc19kYXRhX3QgKik7Cit0eXBlZGVmIGludCAoKnRhc19ob29rX2xlYXZlX3NsZWVwX3QpKHN0cnVjdCB0YXNfZGF0YV90ICopOworCit0eXBlZGVmIGludCAoKnRhc19ob29rX3N1cHBvcnRlZF9taXhlcnNfdCkoc3RydWN0IHRhc19kYXRhX3QgKik7Cit0eXBlZGVmIGludCAoKnRhc19ob29rX21peGVyX2lzX3N0ZXJlb190KShzdHJ1Y3QgdGFzX2RhdGFfdCAqLGludCk7Cit0eXBlZGVmIGludCAoKnRhc19ob29rX3N0ZXJlb19taXhlcnNfdCkoc3RydWN0IHRhc19kYXRhX3QgKik7CisKK3R5cGVkZWYgaW50ICgqdGFzX2hvb2tfb3V0cHV0X2RldmljZV9jaGFuZ2VfdCkoc3RydWN0IHRhc19kYXRhX3QgKixpbnQsaW50LGludCk7Cit0eXBlZGVmIGludCAoKnRhc19ob29rX2RldmljZV9pb2N0bF90KShzdHJ1Y3QgdGFzX2RhdGFfdCAqLHVfaW50LHVfbG9uZyk7CisKK3N0cnVjdCB0YXNfZHJpdmVyX2hvb2tzX3QgeworCS8qCisJICogQWxsIGhhcmR3YXJlIGluaXRpYWxpc2F0aW9uIG11c3QgYmUgcGVyZm9ybWVkIGluCisJICogcG9zdF9pbml0KCksIGFzIHRhc19kbWFzb3VuZF9pbml0KCkgZG9lcyBhIGhhcmR3YXJlIHJlc2V0LgorCSAqCisJICogaW5pdCgpIGlzIGNhbGxlZCBiZWZvcmUgdGFzX2RtYXNvdW5kX2luaXQoKSBzbyB0aGF0CisJICogb3VwdXRfZGV2aWNlX2NoYW5nZSgpIGlzIGFsd2F5cyBjYWxsZWQgYWZ0ZXIgaTJjIGRyaXZlcgorCSAqIGluaXRpYWxpc2F0aW9uLiBUaGUgaW1wbGljYXRpb24gaXMgdGhhdAorCSAqIG91dHB1dF9kZXZpY2VfY2hhbmdlKCkgbXVzdCBjb3BlIHdpdGggdGhlIGZhY3QgdGhhdCBpdAorCSAqIG1heSBiZSBjYWxsZWQgYmVmb3JlIHBvc3RfaW5pdCgpLgorCSAqLworCisJdGFzX2hvb2tfaW5pdF90ICAgICAgICAgICAgICAgICAgIGluaXQ7CisJdGFzX2hvb2tfcG9zdF9pbml0X3QgICAgICAgICAgICAgIHBvc3RfaW5pdDsKKwl0YXNfaG9va191bmluaXRfdCAgICAgICAgICAgICAgICAgdW5pbml0OworCisJdGFzX2hvb2tfZ2V0X21peGVyX2xldmVsX3QgICAgICAgIGdldF9taXhlcl9sZXZlbDsKKwl0YXNfaG9va19zZXRfbWl4ZXJfbGV2ZWxfdCAgICAgICAgc2V0X21peGVyX2xldmVsOworCisJdGFzX2hvb2tfZW50ZXJfc2xlZXBfdCAgICAgICAgICAgIGVudGVyX3NsZWVwOworCXRhc19ob29rX2xlYXZlX3NsZWVwX3QgICAgICAgICAgICBsZWF2ZV9zbGVlcDsKKworCXRhc19ob29rX3N1cHBvcnRlZF9taXhlcnNfdCAgICAgICBzdXBwb3J0ZWRfbWl4ZXJzOworCXRhc19ob29rX21peGVyX2lzX3N0ZXJlb190ICAgICAgICBtaXhlcl9pc19zdGVyZW87CisJdGFzX2hvb2tfc3RlcmVvX21peGVyc190ICAgICAgICAgIHN0ZXJlb19taXhlcnM7CisKKwl0YXNfaG9va19vdXRwdXRfZGV2aWNlX2NoYW5nZV90ICAgb3V0cHV0X2RldmljZV9jaGFuZ2U7CisJdGFzX2hvb2tfZGV2aWNlX2lvY3RsX3QgICAgICAgICAgIGRldmljZV9pb2N0bDsKK307CisKK2VudW0gdGFzX3dyaXRlX21vZGVfdCB7CisJV1JJVEVfSFcgICAgID0gMHgwMSwKKwlXUklURV9TSEFET1cgPSAweDAyLAorCVdSSVRFX05PUk1BTCA9IDB4MDMsCisJRk9SQ0VfV1JJVEUgID0gMHgwNAorfTsKKworc3RhdGljIGlubGluZSB1aW50Cit0YXNfbW9ub190b19zdGVyZW8odWludCBtb25vKQoreworCW1vbm8gJj0weGZmOworCXJldHVybiBtb25vIHwgKG1vbm88PDgpOworfQorCisvKgorICogVG9kbzogbWFrZSB0aGVzZSBmdW5jdGlvbnMgYSBiaXQgbW9yZSBlZmZpY2llbnQgIQorICovCitzdGF0aWMgaW5saW5lIGludAordGFzX3dyaXRlX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzX2RhdGFfdCAqc2VsZiwKKwkJCXVpbnQgcmVnX251bSwKKwkJCXVpbnQgcmVnX3dpZHRoLAorCQkJY2hhciAqZGF0YSwKKwkJCXVpbnQgd3JpdGVfbW9kZSkKK3sKKwlpbnQgcmM7CisKKwlpZiAocmVnX3dpZHRoPT0wIHx8IGRhdGE9PU5VTEwgfHwgc2VsZj09TlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCEod3JpdGVfbW9kZSAmIEZPUkNFX1dSSVRFKSAmJgorCSAgICAhbWVtY21wKGRhdGEsc2VsZi0+c2hhZG93W3JlZ19udW1dLHJlZ193aWR0aCkpCisJICAgIAlyZXR1cm4gMDsKKworCWlmICh3cml0ZV9tb2RlICYgV1JJVEVfU0hBRE9XKQorCQltZW1jcHkoc2VsZi0+c2hhZG93W3JlZ19udW1dLGRhdGEscmVnX3dpZHRoKTsKKwlpZiAod3JpdGVfbW9kZSAmIFdSSVRFX0hXKSB7CisJCXJjPWkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKHNlbGYtPmNsaWVudCwKKwkJCQkJICAgICAgcmVnX251bSwKKwkJCQkJICAgICAgcmVnX3dpZHRoLAorCQkJCQkgICAgICBkYXRhKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKCJ0YXM6IEkyQyBibG9jayB3cml0ZSBmYWlsZWQgXG4iKTsgIAorCQkJcmV0dXJuIHJjOyAKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3Rhc19zeW5jX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzX2RhdGFfdCAqc2VsZiwKKwkJCXVpbnQgcmVnX251bSwKKwkJCXVpbnQgcmVnX3dpZHRoKQoreworCWludCByYzsKKworCWlmIChyZWdfd2lkdGg9PTAgfHwgc2VsZj09TlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmM9aTJjX3NtYnVzX3dyaXRlX2Jsb2NrX2RhdGEoc2VsZi0+Y2xpZW50LAorCQkJCSAgICAgIHJlZ19udW0sCisJCQkJICAgICAgcmVnX3dpZHRoLAorCQkJCSAgICAgIHNlbGYtPnNoYWRvd1tyZWdfbnVtXSk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoInRhczogSTJDIGJsb2NrIHdyaXRlIGZhaWxlZCBcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAordGFzX3dyaXRlX2J5dGVfcmVnaXN0ZXIoCXN0cnVjdCB0YXNfZGF0YV90ICpzZWxmLAorCQkJCXVpbnQgcmVnX251bSwKKwkJCQljaGFyIGRhdGEsCisJCQkJdWludCB3cml0ZV9tb2RlKQoreworCWlmIChzZWxmPT1OVUxMKQorCQlyZXR1cm4gLTE7CisJaWYgKCEod3JpdGVfbW9kZSAmIEZPUkNFX1dSSVRFKSAmJiBkYXRhICE9IHNlbGYtPnNoYWRvd1tyZWdfbnVtXVswXSkKKwkJcmV0dXJuIDA7CisJaWYgKHdyaXRlX21vZGUgJiBXUklURV9TSEFET1cpCisJCXNlbGYtPnNoYWRvd1tyZWdfbnVtXVswXT1kYXRhOworCWlmICh3cml0ZV9tb2RlICYgV1JJVEVfSFcpIHsKKwkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc2VsZi0+Y2xpZW50LCByZWdfbnVtLCBkYXRhKSA8IDApIHsKKwkJCXByaW50aygidGFzOiBJMkMgYnl0ZSB3cml0ZSBmYWlsZWQgXG4iKTsgIAorCQkJcmV0dXJuIC0xOyAKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3Rhc19zeW5jX2J5dGVfcmVnaXN0ZXIoCXN0cnVjdCB0YXNfZGF0YV90ICpzZWxmLAorCQkJdWludCByZWdfbnVtLAorCQkJdWludCByZWdfd2lkdGgpCit7CisJaWYgKHJlZ193aWR0aD09MCB8fCBzZWxmPT1OVUxMKQorCQlyZXR1cm4gLTE7CisJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoCisJICAgIHNlbGYtPmNsaWVudCwgcmVnX251bSwgc2VsZi0+c2hhZG93W3JlZ19udW1dWzBdKSA8IDApIHsKKwkJcHJpbnRrKCJ0YXM6IEkyQyBieXRlIHdyaXRlIGZhaWxlZCBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAordGFzX3JlYWRfcmVnaXN0ZXIoCXN0cnVjdCB0YXNfZGF0YV90ICpzZWxmLAorCQkJdWludCByZWdfbnVtLAorCQkJdWludCByZWdfd2lkdGgsCisJCQljaGFyICpkYXRhKQoreworCWlmIChyZWdfd2lkdGg9PTAgfHwgZGF0YT09TlVMTCB8fCBzZWxmPT1OVUxMKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KGRhdGEsc2VsZi0+c2hhZG93W3JlZ19udW1dLHJlZ193aWR0aCk7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgdGFzX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdGFzX2RyaXZlcl9ob29rc190ICpob29rcyk7CisKK2V4dGVybiBpbnQgdGFzX2dldF9taXhlcl9sZXZlbChpbnQgbWl4ZXIsdWludCAqbGV2ZWwpOworZXh0ZXJuIGludCB0YXNfc2V0X21peGVyX2xldmVsKGludCBtaXhlcix1aW50IGxldmVsKTsKK2V4dGVybiBpbnQgdGFzX2VudGVyX3NsZWVwKHZvaWQpOworZXh0ZXJuIGludCB0YXNfbGVhdmVfc2xlZXAodm9pZCk7CitleHRlcm4gaW50IHRhc19zdXBwb3J0ZWRfbWl4ZXJzKHZvaWQpOworZXh0ZXJuIGludCB0YXNfbWl4ZXJfaXNfc3RlcmVvKGludCBtaXhlcik7CitleHRlcm4gaW50IHRhc19zdGVyZW9fbWl4ZXJzKHZvaWQpOworZXh0ZXJuIGludCB0YXNfb3V0cHV0X2RldmljZV9jaGFuZ2UoaW50LGludCxpbnQpOworZXh0ZXJuIGludCB0YXNfZGV2aWNlX2lvY3RsKHVfaW50LCB1X2xvbmcpOworCitleHRlcm4gdm9pZCB0YXNfY2xlYW51cCh2b2lkKTsKK2V4dGVybiBpbnQgdGFzX2luaXQoaW50IGRyaXZlcl9pZCxjb25zdCBjaGFyICpkcml2ZXJfbmFtZSk7CitleHRlcm4gaW50IHRhc19wb3N0X2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBfVEFTX0NPTU1PTl9IXyAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIHRhYi13aWR0aDogOAorICogaW5kZW50LXRhYnMtbW9kZTogdAorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL3Rhc19lcV9wcmVmcy5oIGIvc291bmQvb3NzL2RtYXNvdW5kL3Rhc19lcV9wcmVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTk0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzX2VxX3ByZWZzLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfVEFTX0VRX1BSRUZTX0hfCisjZGVmaW5lIF9UQVNfRVFfUFJFRlNfSF8KKworc3RydWN0IHRhc19lcV9wcmVmX3QgeworCXVfaW50IHNhbXBsZV9yYXRlOworCXVfaW50IGRldmljZV9pZDsKKwl1X2ludCBvdXRwdXRfaWQ7CisJdV9pbnQgc3BlYWtlcl9pZDsKKworCXN0cnVjdCB0YXNfZHJjZV90ICpkcmNlOworCisJdV9pbnQgZmlsdGVyX2NvdW50OworCXN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCAqYmlxdWFkczsKK307CisKKyNlbmRpZiAvKiBfVEFTX0VRX1BSRUZTX0hfICovCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiB0YWItd2lkdGg6IDgKKyAqIGluZGVudC10YWJzLW1vZGU6IHQKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC90YXNfaW9jdGwuaCBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXNfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2NhZTNhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL3Rhc19pb2N0bC5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX1RBU19JT0NUTF9IXworI2RlZmluZSBfVEFTX0lPQ1RMX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKworCisjZGVmaW5lIFRBU19SRUFEX0VRICAgICAgICAgICAgICBfU0lPUigndCcsMCxzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QpCisjZGVmaW5lIFRBU19XUklURV9FUSAgICAgICAgICAgICBfU0lPVygndCcsMCxzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QpCisKKyNkZWZpbmUgVEFTX1JFQURfRVFfTElTVCAgICAgICAgIF9TSU9SKCd0JywxLHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCkKKyNkZWZpbmUgVEFTX1dSSVRFX0VRX0xJU1QgICAgICAgIF9TSU9XKCd0JywxLHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCkKKworI2RlZmluZSBUQVNfUkVBRF9FUV9GSUxURVJfQ09VTlQgIF9TSU9SKCd0JywyLGludCkKKyNkZWZpbmUgVEFTX1JFQURfRVFfQ0hBTk5FTF9DT1VOVCBfU0lPUigndCcsMyxpbnQpCisKKyNkZWZpbmUgVEFTX1JFQURfRFJDRSAgICAgICAgICAgIF9TSU9SKCd0Jyw0LHN0cnVjdCB0YXNfZHJjZV9jdHJsX3QpCisjZGVmaW5lIFRBU19XUklURV9EUkNFICAgICAgICAgICBfU0lPVygndCcsNCxzdHJ1Y3QgdGFzX2RyY2VfY3RybF90KQorCisjZGVmaW5lIFRBU19SRUFEX0RSQ0VfQ0FQUyAgICAgICBfU0lPUigndCcsNSxpbnQpCisjZGVmaW5lIFRBU19SRUFEX0RSQ0VfTUlOICAgICAgICBfU0lPUigndCcsNixpbnQpCisjZGVmaW5lIFRBU19SRUFEX0RSQ0VfTUFYICAgICAgICBfU0lPUigndCcsNyxpbnQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL3RyYW5zXzE2LmMgYi9zb3VuZC9vc3MvZG1hc291bmQvdHJhbnNfMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzU2MmU5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL3RyYW5zXzE2LmMKQEAgLTAsMCArMSw4OTcgQEAKKy8qCisgKiAgbGludXgvc291bmQvb3NzL2RtYXNvdW5kL3RyYW5zXzE2LmMKKyAqCisgKiAgMTYgYml0IHRyYW5zbGF0aW9uIHJvdXRpbmVzLiAgT25seSB1c2VkIGJ5IFBvd2VyIG1hYyBhdCBwcmVzZW50LgorICoKKyAqICBTZWUgbGludXgvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2NvcmUuYyBmb3IgY29weXJpZ2h0IGFuZAorICogIGhpc3RvcnkgcHJpb3IgdG8gMDgvMDIvMjAwMS4KKyAqCisgKiAgMDgvMDIvMjAwMSBJYWluIFNhbmRvZQorICoJCXNwbGl0IGZyb20gZG1hc291bmRfYXdhY3MuYworICogIDExLzI5LzIwMDMgUmVuem8gRGF2b2xpIChLaW5nIEVuem8pCisgKiAgCS0gaW5wdXQgcmVzYW1wbGluZyAoZm9yIHNvZnQgcmF0ZSA8IGhhcmQgcmF0ZSkKKyAqICAJLSBzb2Z0d2FyZSBsaW5lIGluIGdhaW4gY29udHJvbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImRtYXNvdW5kLmgiCisKK3N0YXRpYyBzaG9ydCBkbWFzb3VuZF9hbGF3MmRtYTE2W10gOworc3RhdGljIHNob3J0IGRtYXNvdW5kX3VsYXcyZG1hMTZbXSA7CisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3RfbGF3KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgcG1hY19jdF9zOChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3U4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3RfczE2KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgcG1hY19jdF91MTYoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7CisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgcG1hY19jdHhfczgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBwbWFjX2N0eF91OChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X3MxNihjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgcG1hY19jdHhfdTE2KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCk7CisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3RfczE2X3JlYWQoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3UxNl9yZWFkKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpOworCisvKioqIFRyYW5zbGF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZXhwYW5kX2RhdGE7CS8qIERhdGEgZm9yIGV4cGFuZGluZyAqLworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNob3J0ICp0YWJsZSA9IGRtYXNvdW5kLnNvZnQuZm9ybWF0ID09IEFGTVRfTVVfTEFXCisJCT8gZG1hc291bmRfdWxhdzJkbWExNiA6IGRtYXNvdW5kX2FsYXcyZG1hMTY7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwlzaG9ydCAqcCA9IChzaG9ydCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJaW50IHZhbCwgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisKKwlmcmFtZUxlZnQgPj49IDI7CisJaWYgKHN0ZXJlbykKKwkJdXNlckNvdW50ID4+PSAxOworCXVzZWQgPSBjb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXVfY2hhciBkYXRhOworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXNlclB0cisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2YWwgPSB0YWJsZVtkYXRhXTsKKwkJKnArKyA9IHZhbDsKKwkJaWYgKHN0ZXJlbykgeworCQkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl2YWwgPSB0YWJsZVtkYXRhXTsKKwkJfQorCQkqcCsrID0gdmFsOworCQljb3VudC0tOworCX0KKwkqZnJhbWVVc2VkICs9IHVzZWQgKiA0OworCXJldHVybiBzdGVyZW8/IHVzZWQgKiAyOiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3RfczgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwlzaG9ydCAqcCA9IChzaG9ydCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJaW50IHZhbCwgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisKKwlmcmFtZUxlZnQgPj49IDI7CisJaWYgKHN0ZXJlbykKKwkJdXNlckNvdW50ID4+PSAxOworCXVzZWQgPSBjb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXVfY2hhciBkYXRhOworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXNlclB0cisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2YWwgPSBkYXRhIDw8IDg7CisJCSpwKysgPSB2YWw7CisJCWlmIChzdGVyZW8pIHsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCB1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdmFsID0gZGF0YSA8PCA4OworCQl9CisJCSpwKysgPSB2YWw7CisJCWNvdW50LS07CisJfQorCSpmcmFtZVVzZWQgKz0gdXNlZCAqIDQ7CisJcmV0dXJuIHN0ZXJlbz8gdXNlZCAqIDI6IHVzZWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgcG1hY19jdF91OChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90IGNvdW50LCB1c2VkOworCXNob3J0ICpwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlpbnQgdmFsLCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwlpZiAoc3RlcmVvKQorCQl1c2VyQ291bnQgPj49IDE7CisJdXNlZCA9IGNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJdV9jaGFyIGRhdGE7CisJCWlmIChnZXRfdXNlcihkYXRhLCB1c2VyUHRyKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXZhbCA9IChkYXRhIF4gMHg4MCkgPDwgODsKKwkJKnArKyA9IHZhbDsKKwkJaWYgKHN0ZXJlbykgeworCQkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl2YWwgPSAoZGF0YSBeIDB4ODApIDw8IDg7CisJCX0KKwkJKnArKyA9IHZhbDsKKwkJY291bnQtLTsKKwl9CisJKmZyYW1lVXNlZCArPSB1c2VkICogNDsKKwlyZXR1cm4gc3RlcmVvPyB1c2VkICogMjogdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3MxNihjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNzaXplX3QgY291bnQsIHVzZWQ7CisJaW50IHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCXNob3J0ICpmcCA9IChzaG9ydCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisKKwlmcmFtZUxlZnQgPj49IDI7CisJdXNlckNvdW50ID4+PSAoc3RlcmVvPyAyOiAxKTsKKwl1c2VkID0gY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk7CisJaWYgKCFzdGVyZW8pIHsKKwkJc2hvcnQgX191c2VyICp1cCA9IChzaG9ydCBfX3VzZXIgKikgdXNlclB0cjsKKwkJd2hpbGUgKGNvdW50ID4gMCkgeworCQkJc2hvcnQgZGF0YTsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCB1cCsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCSpmcCsrID0gZGF0YTsKKwkJCSpmcCsrID0gZGF0YTsKKwkJCWNvdW50LS07CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY29weV9mcm9tX3VzZXIoZnAsIHVzZXJQdHIsIGNvdW50ICogNCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJKmZyYW1lVXNlZCArPSB1c2VkICogNDsKKwlyZXR1cm4gc3RlcmVvPyB1c2VkICogNDogdXNlZCAqIDI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3RfdTE2KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwlpbnQgbWFzayA9IChkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9PSBBRk1UX1UxNl9MRT8gMHgwMDgwOiAweDgwMDApOworCWludCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKwlzaG9ydCAqZnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXNob3J0IF9fdXNlciAqdXAgPSAoc2hvcnQgX191c2VyICopIHVzZXJQdHI7CisKKwlmcmFtZUxlZnQgPj49IDI7CisJdXNlckNvdW50ID4+PSAoc3RlcmVvPyAyOiAxKTsKKwl1c2VkID0gY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzaG9ydCBkYXRhOworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXArKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZGF0YSBePSBtYXNrOworCQkqZnArKyA9IGRhdGE7CisJCWlmIChzdGVyZW8pIHsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCB1cCsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgXj0gbWFzazsKKwkJfQorCQkqZnArKyA9IGRhdGE7CisJCWNvdW50LS07CisJfQorCSpmcmFtZVVzZWQgKz0gdXNlZCAqIDQ7CisJcmV0dXJuIHN0ZXJlbz8gdXNlZCAqIDQ6IHVzZWQgKiAyOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJdW5zaWduZWQgc2hvcnQgKnRhYmxlID0gKHVuc2lnbmVkIHNob3J0ICopCisJCShkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9PSBBRk1UX01VX0xBVworCQkgPyBkbWFzb3VuZF91bGF3MmRtYTE2IDogZG1hc291bmRfYWxhdzJkbWExNik7CisJdW5zaWduZWQgaW50IGRhdGEgPSBleHBhbmRfZGF0YTsKKwl1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlpbnQgYmFsID0gZXhwYW5kX2JhbDsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisJaW50IHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCisJZnJhbWVMZWZ0ID4+PSAyOworCWlmIChzdGVyZW8pCisJCXVzZXJDb3VudCA+Pj0gMTsKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdV9jaGFyIGM7CisJCWlmIChiYWwgPCAwKSB7CisJCQlpZiAodXNlckNvdW50ID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSB0YWJsZVtjXTsKKwkJCWlmIChzdGVyZW8pIHsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIHRhYmxlW2NdOworCQkJfSBlbHNlCisJCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIGRhdGE7CisJCQl1c2VyQ291bnQtLTsKKwkJCWJhbCArPSBoU3BlZWQ7CisJCX0KKwkJKnArKyA9IGRhdGE7CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCWV4cGFuZF9kYXRhID0gZGF0YTsKKwkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDI6IHV0b3RhbDsKK30KKworc3RhdGljIHNzaXplX3QgcG1hY19jdHhfczgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwl1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwl1bnNpZ25lZCBpbnQgZGF0YSA9IGV4cGFuZF9kYXRhOworCWludCBiYWwgPSBleHBhbmRfYmFsOworCWludCBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCWludCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisKKwlmcmFtZUxlZnQgPj49IDI7CisJaWYgKHN0ZXJlbykKKwkJdXNlckNvdW50ID4+PSAxOworCWZ0b3RhbCA9IGZyYW1lTGVmdDsKKwl1dG90YWwgPSB1c2VyQ291bnQ7CisJd2hpbGUgKGZyYW1lTGVmdCkgeworCQl1X2NoYXIgYzsKKwkJaWYgKGJhbCA8IDApIHsKKwkJCWlmICh1c2VyQ291bnQgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChnZXRfdXNlcihjLCB1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZGF0YSA9IGMgPDwgODsKKwkJCWlmIChzdGVyZW8pIHsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIChjIDw8IDgpOworCQkJfSBlbHNlCisJCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIGRhdGE7CisJCQl1c2VyQ291bnQtLTsKKwkJCWJhbCArPSBoU3BlZWQ7CisJCX0KKwkJKnArKyA9IGRhdGE7CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCWV4cGFuZF9kYXRhID0gZGF0YTsKKwkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDI6IHV0b3RhbDsKK30KKworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0eF91OChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXVuc2lnbmVkIGludCAqcCA9ICh1bnNpZ25lZCBpbnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXVuc2lnbmVkIGludCBkYXRhID0gZXhwYW5kX2RhdGE7CisJaW50IGJhbCA9IGV4cGFuZF9iYWw7CisJaW50IGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJaW50IHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCWludCB1dG90YWwsIGZ0b3RhbDsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwlpZiAoc3RlcmVvKQorCQl1c2VyQ291bnQgPj49IDE7CisJZnRvdGFsID0gZnJhbWVMZWZ0OworCXV0b3RhbCA9IHVzZXJDb3VudDsKKwl3aGlsZSAoZnJhbWVMZWZ0KSB7CisJCXVfY2hhciBjOworCQlpZiAoYmFsIDwgMCkgeworCQkJaWYgKHVzZXJDb3VudCA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGdldF91c2VyKGMsIHVzZXJQdHIrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkYXRhID0gKGMgXiAweDgwKSA8PCA4OworCQkJaWYgKHN0ZXJlbykgeworCQkJCWlmIChnZXRfdXNlcihjLCB1c2VyUHRyKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhID0gKGRhdGEgPDwgMTYpICsgKChjIF4gMHg4MCkgPDwgOCk7CisJCQl9IGVsc2UKKwkJCQlkYXRhID0gKGRhdGEgPDwgMTYpICsgZGF0YTsKKwkJCXVzZXJDb3VudC0tOworCQkJYmFsICs9IGhTcGVlZDsKKwkJfQorCQkqcCsrID0gZGF0YTsKKwkJZnJhbWVMZWZ0LS07CisJCWJhbCAtPSBzU3BlZWQ7CisJfQorCWV4cGFuZF9iYWwgPSBiYWw7CisJZXhwYW5kX2RhdGEgPSBkYXRhOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCkgKiA0OworCXV0b3RhbCAtPSB1c2VyQ291bnQ7CisJcmV0dXJuIHN0ZXJlbz8gdXRvdGFsICogMjogdXRvdGFsOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X3MxNihjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJdW5zaWduZWQgaW50ICpwID0gKHVuc2lnbmVkIGludCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJdW5zaWduZWQgaW50IGRhdGEgPSBleHBhbmRfZGF0YTsKKwl1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKnVwID0gKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSB1c2VyUHRyOworCWludCBiYWwgPSBleHBhbmRfYmFsOworCWludCBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCWludCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisKKwlmcmFtZUxlZnQgPj49IDI7CisJdXNlckNvdW50ID4+PSAoc3RlcmVvPyAyOiAxKTsKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdW5zaWduZWQgc2hvcnQgYzsKKwkJaWYgKGJhbCA8IDApIHsKKwkJCWlmICh1c2VyQ291bnQgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCB1cCsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChzdGVyZW8pIHsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgdXArKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgPSAoZGF0YSA8PCAxNikgKyBjOworCQkJfSBlbHNlCisJCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIGRhdGE7CisJCQl1c2VyQ291bnQtLTsKKwkJCWJhbCArPSBoU3BlZWQ7CisJCX0KKwkJKnArKyA9IGRhdGE7CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCWV4cGFuZF9kYXRhID0gZGF0YTsKKwkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDQ6IHV0b3RhbCAqIDI7Cit9CisKKworc3RhdGljIHNzaXplX3QgcG1hY19jdHhfdTE2KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlpbnQgbWFzayA9IChkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9PSBBRk1UX1UxNl9MRT8gMHgwMDgwOiAweDgwMDApOworCXVuc2lnbmVkIGludCAqcCA9ICh1bnNpZ25lZCBpbnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXVuc2lnbmVkIGludCBkYXRhID0gZXhwYW5kX2RhdGE7CisJdW5zaWduZWQgc2hvcnQgX191c2VyICp1cCA9ICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgdXNlclB0cjsKKwlpbnQgYmFsID0gZXhwYW5kX2JhbDsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisJaW50IHV0b3RhbCwgZnRvdGFsOworCisJZnJhbWVMZWZ0ID4+PSAyOworCXVzZXJDb3VudCA+Pj0gKHN0ZXJlbz8gMjogMSk7CisJZnRvdGFsID0gZnJhbWVMZWZ0OworCXV0b3RhbCA9IHVzZXJDb3VudDsKKwl3aGlsZSAoZnJhbWVMZWZ0KSB7CisJCXVuc2lnbmVkIHNob3J0IGM7CisJCWlmIChiYWwgPCAwKSB7CisJCQlpZiAodXNlckNvdW50ID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXArKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkYXRhIF49IG1hc2s7CisJCQlpZiAoc3RlcmVvKSB7CisJCQkJaWYgKGdldF91c2VyKGMsIHVwKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhID0gKGRhdGEgPDwgMTYpICsgKGMgXiBtYXNrKTsKKwkJCX0gZWxzZQorCQkJCWRhdGEgPSAoZGF0YSA8PCAxNikgKyBkYXRhOworCQkJdXNlckNvdW50LS07CisJCQliYWwgKz0gaFNwZWVkOworCQl9CisJCSpwKysgPSBkYXRhOworCQlmcmFtZUxlZnQtLTsKKwkJYmFsIC09IHNTcGVlZDsKKwl9CisJZXhwYW5kX2JhbCA9IGJhbDsKKwlleHBhbmRfZGF0YSA9IGRhdGE7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KSAqIDQ7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gc3RlcmVvPyB1dG90YWwgKiA0OiB1dG90YWwgKiAyOworfQorCisvKiBkYXRhIGluIHJvdXRpbmVzLi4uICovCisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3RfczhfcmVhZChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90IGNvdW50LCB1c2VkOworCXNob3J0ICpwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlpbnQgdmFsLCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwlpZiAoc3RlcmVvKQorCQl1c2VyQ291bnQgPj49IDE7CisJdXNlZCA9IGNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJdV9jaGFyIGRhdGE7CisKKwkJdmFsID0gKnArKzsKKwkJdmFsID0gKHZhbCAqIHNvZnR3YXJlX2lucHV0X3ZvbHVtZSkgPj4gNzsKKwkJZGF0YSA9IHZhbCA+PiA4OworCQlpZiAocHV0X3VzZXIoZGF0YSwgKHVfY2hhciBfX3VzZXIgKil1c2VyUHRyKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChzdGVyZW8pIHsKKwkJCXZhbCA9ICpwOworCQkJdmFsID0gKHZhbCAqIHNvZnR3YXJlX2lucHV0X3ZvbHVtZSkgPj4gNzsKKwkJCWRhdGEgPSB2YWwgPj4gODsKKwkJCWlmIChwdXRfdXNlcihkYXRhLCAodV9jaGFyIF9fdXNlciAqKXVzZXJQdHIrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcCsrOworCQljb3VudC0tOworCX0KKwkqZnJhbWVVc2VkICs9IHVzZWQgKiA0OworCXJldHVybiBzdGVyZW8/IHVzZWQgKiAyOiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3RfdThfcmVhZChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90IGNvdW50LCB1c2VkOworCXNob3J0ICpwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlpbnQgdmFsLCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwlpZiAoc3RlcmVvKQorCQl1c2VyQ291bnQgPj49IDE7CisJdXNlZCA9IGNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJdV9jaGFyIGRhdGE7CisKKwkJdmFsID0gKnArKzsKKwkJdmFsID0gKHZhbCAqIHNvZnR3YXJlX2lucHV0X3ZvbHVtZSkgPj4gNzsKKwkJZGF0YSA9ICh2YWwgPj4gOCkgXiAweDgwOworCQlpZiAocHV0X3VzZXIoZGF0YSwgKHVfY2hhciBfX3VzZXIgKil1c2VyUHRyKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChzdGVyZW8pIHsKKwkJCXZhbCA9ICpwOworCQkJdmFsID0gKHZhbCAqIHNvZnR3YXJlX2lucHV0X3ZvbHVtZSkgPj4gNzsKKwkJCWRhdGEgPSAodmFsID4+IDgpIF4gMHg4MDsKKwkJCWlmIChwdXRfdXNlcihkYXRhLCAodV9jaGFyIF9fdXNlciAqKXVzZXJQdHIrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcCsrOworCQljb3VudC0tOworCX0KKwkqZnJhbWVVc2VkICs9IHVzZWQgKiA0OworCXJldHVybiBzdGVyZW8/IHVzZWQgKiAyOiB1c2VkOworfQorCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3MxNl9yZWFkKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwlpbnQgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisJc2hvcnQgKmZwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlzaG9ydCBfX3VzZXIgKnVwID0gKHNob3J0IF9fdXNlciAqKSB1c2VyUHRyOworCisJZnJhbWVMZWZ0ID4+PSAyOworCXVzZXJDb3VudCA+Pj0gKHN0ZXJlbz8gMjogMSk7CisJdXNlZCA9IGNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc2hvcnQgZGF0YTsKKworCQlkYXRhID0gKmZwKys7CisJCWRhdGEgPSAoZGF0YSAqIHNvZnR3YXJlX2lucHV0X3ZvbHVtZSkgPj4gNzsKKwkJaWYgKHB1dF91c2VyKGRhdGEsIHVwKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChzdGVyZW8pIHsKKwkJCWRhdGEgPSAqZnA7CisJCQlkYXRhID0gKGRhdGEgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCQlpZiAocHV0X3VzZXIoZGF0YSwgdXArKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJZnArKzsKKwkJY291bnQtLTsKKyAJfQorCSpmcmFtZVVzZWQgKz0gdXNlZCAqIDQ7CisJcmV0dXJuIHN0ZXJlbz8gdXNlZCAqIDQ6IHVzZWQgKiAyOworfQorCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3UxNl9yZWFkKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwlpbnQgbWFzayA9IChkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9PSBBRk1UX1UxNl9MRT8gMHgwMDgwOiAweDgwMDApOworCWludCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKwlzaG9ydCAqZnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXNob3J0IF9fdXNlciAqdXAgPSAoc2hvcnQgX191c2VyICopIHVzZXJQdHI7CisKKwlmcmFtZUxlZnQgPj49IDI7CisJdXNlckNvdW50ID4+PSAoc3RlcmVvPyAyOiAxKTsKKwl1c2VkID0gY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlpbnQgZGF0YTsKKworCQlkYXRhID0gKmZwKys7CisJCWRhdGEgPSAoZGF0YSAqIHNvZnR3YXJlX2lucHV0X3ZvbHVtZSkgPj4gNzsKKwkJZGF0YSBePSBtYXNrOworCQlpZiAocHV0X3VzZXIoZGF0YSwgdXArKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHN0ZXJlbykgeworCQkJZGF0YSA9ICpmcDsKKwkJCWRhdGEgPSAoZGF0YSAqIHNvZnR3YXJlX2lucHV0X3ZvbHVtZSkgPj4gNzsKKwkJCWRhdGEgXj0gbWFzazsKKwkJCWlmIChwdXRfdXNlcihkYXRhLCB1cCsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlmcCsrOworCQljb3VudC0tOworCX0KKwkqZnJhbWVVc2VkICs9IHVzZWQgKiA0OworCXJldHVybiBzdGVyZW8/IHVzZWQgKiA0OiB1c2VkICogMjsKK30KKworLyogZGF0YSBpbiByb3V0aW5lcyAocmVkdWNpbmcgc3BlZWQpLi4uICovCisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X3M4X3JlYWQoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc2hvcnQgKnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCWludCBiYWwgPSBleHBhbmRfcmVhZF9iYWw7CisJaW50IHZhbGwsdmFsciwgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisJaW50IGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJaW50IHV0b3RhbCwgZnRvdGFsOworCisJZnJhbWVMZWZ0ID4+PSAyOworCWlmIChzdGVyZW8pCisJCXVzZXJDb3VudCA+Pj0gMTsKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdV9jaGFyIGRhdGE7CisKKwkJaWYgKGJhbDwwICYmIHVzZXJDb3VudCA9PSAwKQorCQkJYnJlYWs7CisJCXZhbGwgPSAqcCsrOworCQl2YWxsID0gKHZhbGwgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCWlmIChzdGVyZW8pIHsKKwkJCXZhbHIgPSAqcDsKKwkJCXZhbHIgPSAodmFsciAqIHNvZnR3YXJlX2lucHV0X3ZvbHVtZSkgPj4gNzsKKwkJfQorCQlwKys7CisJCWlmIChiYWwgPCAwKSB7CisJCQlkYXRhID0gdmFsbCA+PiA4OworCQkJaWYgKHB1dF91c2VyKGRhdGEsICh1X2NoYXIgX191c2VyICopdXNlclB0cisrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChzdGVyZW8pIHsKKwkJCQlkYXRhID0gdmFsciA+PiA4OworCQkJCWlmIChwdXRfdXNlcihkYXRhLCAodV9jaGFyIF9fdXNlciAqKXVzZXJQdHIrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJdXNlckNvdW50LS07CisJCQliYWwgKz0gaFNwZWVkOworCQl9CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKwlleHBhbmRfcmVhZF9iYWw9YmFsOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCkgKiA0OworCXV0b3RhbCAtPSB1c2VyQ291bnQ7CisJcmV0dXJuIHN0ZXJlbz8gdXRvdGFsICogMjogdXRvdGFsOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X3U4X3JlYWQoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc2hvcnQgKnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCWludCBiYWwgPSBleHBhbmRfcmVhZF9iYWw7CisJaW50IHZhbGwsdmFsciwgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisJaW50IGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJaW50IHV0b3RhbCwgZnRvdGFsOworCisJZnJhbWVMZWZ0ID4+PSAyOworCWlmIChzdGVyZW8pCisJCXVzZXJDb3VudCA+Pj0gMTsKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdV9jaGFyIGRhdGE7CisKKwkJaWYgKGJhbDwwICYmIHVzZXJDb3VudCA9PSAwKQorCQkJYnJlYWs7CisKKwkJdmFsbCA9ICpwKys7CisJCXZhbGwgPSAodmFsbCAqIHNvZnR3YXJlX2lucHV0X3ZvbHVtZSkgPj4gNzsKKwkJaWYgKHN0ZXJlbykgeworCQkJdmFsciA9ICpwOworCQkJdmFsciA9ICh2YWxyICogc29mdHdhcmVfaW5wdXRfdm9sdW1lKSA+PiA3OworCQl9CisJCXArKzsKKwkJaWYgKGJhbCA8IDApIHsKKwkJCWRhdGEgPSAodmFsbCA+PiA4KSBeIDB4ODA7CisJCQlpZiAocHV0X3VzZXIoZGF0YSwgKHVfY2hhciBfX3VzZXIgKil1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHN0ZXJlbykgeworCQkJCWRhdGEgPSAodmFsciA+PiA4KSBeIDB4ODA7CisJCQkJaWYgKHB1dF91c2VyKGRhdGEsICh1X2NoYXIgX191c2VyICopdXNlclB0cisrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQl1c2VyQ291bnQtLTsKKwkJCWJhbCArPSBoU3BlZWQ7CisJCX0KKwkJZnJhbWVMZWZ0LS07CisJCWJhbCAtPSBzU3BlZWQ7CisJfQorCWV4cGFuZF9yZWFkX2JhbD1iYWw7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KSAqIDQ7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gc3RlcmVvPyB1dG90YWwgKiAyOiB1dG90YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X3MxNl9yZWFkKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJaW50IGJhbCA9IGV4cGFuZF9yZWFkX2JhbDsKKwlzaG9ydCAqZnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXNob3J0IF9fdXNlciAqdXAgPSAoc2hvcnQgX191c2VyICopIHVzZXJQdHI7CisJaW50IHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCWludCBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCWludCB1dG90YWwsIGZ0b3RhbDsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwl1c2VyQ291bnQgPj49IChzdGVyZW8/IDI6IDEpOworCWZ0b3RhbCA9IGZyYW1lTGVmdDsKKwl1dG90YWwgPSB1c2VyQ291bnQ7CisJd2hpbGUgKGZyYW1lTGVmdCkgeworCQlpbnQgZGF0YWwsZGF0YXI7CisKKwkJaWYgKGJhbDwwICYmIHVzZXJDb3VudCA9PSAwKQorCQkJYnJlYWs7CisKKwkJZGF0YWwgPSAqZnArKzsKKwkJZGF0YWwgPSAoZGF0YWwgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCWlmIChzdGVyZW8pIHsKKwkJCWRhdGFyID0gKmZwOworCQkJZGF0YXIgPSAoZGF0YXIgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCX0KKwkJZnArKzsKKwkJaWYgKGJhbCA8IDApIHsKKwkJCWlmIChwdXRfdXNlcihkYXRhbCwgdXArKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoc3RlcmVvKSB7CisJCQkJaWYgKHB1dF91c2VyKGRhdGFyLCB1cCsrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQl1c2VyQ291bnQtLTsKKwkJCWJhbCArPSBoU3BlZWQ7CisJCX0KKwkJZnJhbWVMZWZ0LS07CisJCWJhbCAtPSBzU3BlZWQ7CisJfQorCWV4cGFuZF9yZWFkX2JhbD1iYWw7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KSAqIDQ7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gc3RlcmVvPyB1dG90YWwgKiA0OiB1dG90YWwgKiAyOworfQorCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0eF91MTZfcmVhZChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCWludCBiYWwgPSBleHBhbmRfcmVhZF9iYWw7CisJaW50IG1hc2sgPSAoZG1hc291bmQuc29mdC5mb3JtYXQgPT0gQUZNVF9VMTZfTEU/IDB4MDA4MDogMHg4MDAwKTsKKwlzaG9ydCAqZnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXNob3J0IF9fdXNlciAqdXAgPSAoc2hvcnQgX191c2VyICopIHVzZXJQdHI7CisJaW50IHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCWludCBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCWludCB1dG90YWwsIGZ0b3RhbDsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwl1c2VyQ291bnQgPj49IChzdGVyZW8/IDI6IDEpOworCWZ0b3RhbCA9IGZyYW1lTGVmdDsKKwl1dG90YWwgPSB1c2VyQ291bnQ7CisJd2hpbGUgKGZyYW1lTGVmdCkgeworCQlpbnQgZGF0YWwsZGF0YXI7CisKKwkJaWYgKGJhbDwwICYmIHVzZXJDb3VudCA9PSAwKQorCQkJYnJlYWs7CisKKwkJZGF0YWwgPSAqZnArKzsKKwkJZGF0YWwgPSAoZGF0YWwgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCWRhdGFsIF49IG1hc2s7CisJCWlmIChzdGVyZW8pIHsKKwkJCWRhdGFyID0gKmZwOworCQkJZGF0YXIgPSAoZGF0YXIgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCQlkYXRhciBePSBtYXNrOworCQl9CisJCWZwKys7CisJCWlmIChiYWwgPCAwKSB7CisJCQlpZiAocHV0X3VzZXIoZGF0YWwsIHVwKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHN0ZXJlbykgeworCQkJCWlmIChwdXRfdXNlcihkYXRhciwgdXArKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJdXNlckNvdW50LS07CisJCQliYWwgKz0gaFNwZWVkOworCQl9CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKwlleHBhbmRfcmVhZF9iYWw9YmFsOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCkgKiA0OworCXV0b3RhbCAtPSB1c2VyQ291bnQ7CisJcmV0dXJuIHN0ZXJlbz8gdXRvdGFsICogNDogdXRvdGFsICogMjsKK30KKworCitUUkFOUyB0cmFuc0F3YWNzTm9ybWFsID0geworCS5jdF91bGF3PQlwbWFjX2N0X2xhdywKKwkuY3RfYWxhdz0JcG1hY19jdF9sYXcsCisJLmN0X3M4PQkJcG1hY19jdF9zOCwKKwkuY3RfdTg9CQlwbWFjX2N0X3U4LAorCS5jdF9zMTZiZT0JcG1hY19jdF9zMTYsCisJLmN0X3UxNmJlPQlwbWFjX2N0X3UxNiwKKwkuY3RfczE2bGU9CXBtYWNfY3RfczE2LAorCS5jdF91MTZsZT0JcG1hY19jdF91MTYsCit9OworCitUUkFOUyB0cmFuc0F3YWNzRXhwYW5kID0geworCS5jdF91bGF3PQlwbWFjX2N0eF9sYXcsCisJLmN0X2FsYXc9CXBtYWNfY3R4X2xhdywKKwkuY3Rfczg9CQlwbWFjX2N0eF9zOCwKKwkuY3RfdTg9CQlwbWFjX2N0eF91OCwKKwkuY3RfczE2YmU9CXBtYWNfY3R4X3MxNiwKKwkuY3RfdTE2YmU9CXBtYWNfY3R4X3UxNiwKKwkuY3RfczE2bGU9CXBtYWNfY3R4X3MxNiwKKwkuY3RfdTE2bGU9CXBtYWNfY3R4X3UxNiwKK307CisKK1RSQU5TIHRyYW5zQXdhY3NOb3JtYWxSZWFkID0geworCS5jdF9zOD0JCXBtYWNfY3RfczhfcmVhZCwKKwkuY3RfdTg9CQlwbWFjX2N0X3U4X3JlYWQsCisJLmN0X3MxNmJlPQlwbWFjX2N0X3MxNl9yZWFkLAorCS5jdF91MTZiZT0JcG1hY19jdF91MTZfcmVhZCwKKwkuY3RfczE2bGU9CXBtYWNfY3RfczE2X3JlYWQsCisJLmN0X3UxNmxlPQlwbWFjX2N0X3UxNl9yZWFkLAorfTsKKworVFJBTlMgdHJhbnNBd2Fjc0V4cGFuZFJlYWQgPSB7CisJLmN0X3M4PQkJcG1hY19jdHhfczhfcmVhZCwKKwkuY3RfdTg9CQlwbWFjX2N0eF91OF9yZWFkLAorCS5jdF9zMTZiZT0JcG1hY19jdHhfczE2X3JlYWQsCisJLmN0X3UxNmJlPQlwbWFjX2N0eF91MTZfcmVhZCwKKwkuY3RfczE2bGU9CXBtYWNfY3R4X3MxNl9yZWFkLAorCS5jdF91MTZsZT0JcG1hY19jdHhfdTE2X3JlYWQsCit9OworCisvKiB0cmFuc2xhdGlvbiB0YWJsZXMgKi8KKy8qIDE2IGJpdCBtdS1sYXcgKi8KKworc3RhdGljIHNob3J0IGRtYXNvdW5kX3VsYXcyZG1hMTZbXSA9IHsKKwktMzIxMjQsCS0zMTEwMCwJLTMwMDc2LAktMjkwNTIsCS0yODAyOCwJLTI3MDA0LAktMjU5ODAsCS0yNDk1NiwKKwktMjM5MzIsCS0yMjkwOCwJLTIxODg0LAktMjA4NjAsCS0xOTgzNiwJLTE4ODEyLAktMTc3ODgsCS0xNjc2NCwKKwktMTU5OTYsCS0xNTQ4NCwJLTE0OTcyLAktMTQ0NjAsCS0xMzk0OCwJLTEzNDM2LAktMTI5MjQsCS0xMjQxMiwKKwktMTE5MDAsCS0xMTM4OCwJLTEwODc2LAktMTAzNjQsCS05ODUyLAktOTM0MCwJLTg4MjgsCS04MzE2LAorCS03OTMyLAktNzY3NiwJLTc0MjAsCS03MTY0LAktNjkwOCwJLTY2NTIsCS02Mzk2LAktNjE0MCwKKwktNTg4NCwJLTU2MjgsCS01MzcyLAktNTExNiwJLTQ4NjAsCS00NjA0LAktNDM0OCwJLTQwOTIsCisJLTM5MDAsCS0zNzcyLAktMzY0NCwJLTM1MTYsCS0zMzg4LAktMzI2MCwJLTMxMzIsCS0zMDA0LAorCS0yODc2LAktMjc0OCwJLTI2MjAsCS0yNDkyLAktMjM2NCwJLTIyMzYsCS0yMTA4LAktMTk4MCwKKwktMTg4NCwJLTE4MjAsCS0xNzU2LAktMTY5MiwJLTE2MjgsCS0xNTY0LAktMTUwMCwJLTE0MzYsCisJLTEzNzIsCS0xMzA4LAktMTI0NCwJLTExODAsCS0xMTE2LAktMTA1MiwJLTk4OCwJLTkyNCwKKwktODc2LAktODQ0LAktODEyLAktNzgwLAktNzQ4LAktNzE2LAktNjg0LAktNjUyLAorCS02MjAsCS01ODgsCS01NTYsCS01MjQsCS00OTIsCS00NjAsCS00MjgsCS0zOTYsCisJLTM3MiwJLTM1NiwJLTM0MCwJLTMyNCwJLTMwOCwJLTI5MiwJLTI3NiwJLTI2MCwKKwktMjQ0LAktMjI4LAktMjEyLAktMTk2LAktMTgwLAktMTY0LAktMTQ4LAktMTMyLAorCS0xMjAsCS0xMTIsCS0xMDQsCS05NiwJLTg4LAktODAsCS03MiwJLTY0LAorCS01NiwJLTQ4LAktNDAsCS0zMiwJLTI0LAktMTYsCS04LAkwLAorCTMyMTI0LAkzMTEwMCwJMzAwNzYsCTI5MDUyLAkyODAyOCwJMjcwMDQsCTI1OTgwLAkyNDk1NiwKKwkyMzkzMiwJMjI5MDgsCTIxODg0LAkyMDg2MCwJMTk4MzYsCTE4ODEyLAkxNzc4OCwJMTY3NjQsCisJMTU5OTYsCTE1NDg0LAkxNDk3MiwJMTQ0NjAsCTEzOTQ4LAkxMzQzNiwJMTI5MjQsCTEyNDEyLAorCTExOTAwLAkxMTM4OCwJMTA4NzYsCTEwMzY0LAk5ODUyLAk5MzQwLAk4ODI4LAk4MzE2LAorCTc5MzIsCTc2NzYsCTc0MjAsCTcxNjQsCTY5MDgsCTY2NTIsCTYzOTYsCTYxNDAsCisJNTg4NCwJNTYyOCwJNTM3MiwJNTExNiwJNDg2MCwJNDYwNCwJNDM0OCwJNDA5MiwKKwkzOTAwLAkzNzcyLAkzNjQ0LAkzNTE2LAkzMzg4LAkzMjYwLAkzMTMyLAkzMDA0LAorCTI4NzYsCTI3NDgsCTI2MjAsCTI0OTIsCTIzNjQsCTIyMzYsCTIxMDgsCTE5ODAsCisJMTg4NCwJMTgyMCwJMTc1NiwJMTY5MiwJMTYyOCwJMTU2NCwJMTUwMCwJMTQzNiwKKwkxMzcyLAkxMzA4LAkxMjQ0LAkxMTgwLAkxMTE2LAkxMDUyLAk5ODgsCTkyNCwKKwk4NzYsCTg0NCwJODEyLAk3ODAsCTc0OCwJNzE2LAk2ODQsCTY1MiwKKwk2MjAsCTU4OCwJNTU2LAk1MjQsCTQ5MiwJNDYwLAk0MjgsCTM5NiwKKwkzNzIsCTM1NiwJMzQwLAkzMjQsCTMwOCwJMjkyLAkyNzYsCTI2MCwKKwkyNDQsCTIyOCwJMjEyLAkxOTYsCTE4MCwJMTY0LAkxNDgsCTEzMiwKKwkxMjAsCTExMiwJMTA0LAk5NiwJODgsCTgwLAk3MiwJNjQsCisJNTYsCTQ4LAk0MCwJMzIsCTI0LAkxNiwJOCwJMCwKK307CisKKy8qIDE2IGJpdCBBLWxhdyAqLworCitzdGF0aWMgc2hvcnQgZG1hc291bmRfYWxhdzJkbWExNltdID0geworCS01NTA0LAktNTI0OCwJLTYwMTYsCS01NzYwLAktNDQ4MCwJLTQyMjQsCS00OTkyLAktNDczNiwKKwktNzU1MiwJLTcyOTYsCS04MDY0LAktNzgwOCwJLTY1MjgsCS02MjcyLAktNzA0MCwJLTY3ODQsCisJLTI3NTIsCS0yNjI0LAktMzAwOCwJLTI4ODAsCS0yMjQwLAktMjExMiwJLTI0OTYsCS0yMzY4LAorCS0zNzc2LAktMzY0OCwJLTQwMzIsCS0zOTA0LAktMzI2NCwJLTMxMzYsCS0zNTIwLAktMzM5MiwKKwktMjIwMTYsCS0yMDk5MiwJLTI0MDY0LAktMjMwNDAsCS0xNzkyMCwJLTE2ODk2LAktMTk5NjgsCS0xODk0NCwKKwktMzAyMDgsCS0yOTE4NCwJLTMyMjU2LAktMzEyMzIsCS0yNjExMiwJLTI1MDg4LAktMjgxNjAsCS0yNzEzNiwKKwktMTEwMDgsCS0xMDQ5NiwJLTEyMDMyLAktMTE1MjAsCS04OTYwLAktODQ0OCwJLTk5ODQsCS05NDcyLAorCS0xNTEwNCwJLTE0NTkyLAktMTYxMjgsCS0xNTYxNiwJLTEzMDU2LAktMTI1NDQsCS0xNDA4MCwJLTEzNTY4LAorCS0zNDQsCS0zMjgsCS0zNzYsCS0zNjAsCS0yODAsCS0yNjQsCS0zMTIsCS0yOTYsCisJLTQ3MiwJLTQ1NiwJLTUwNCwJLTQ4OCwJLTQwOCwJLTM5MiwJLTQ0MCwJLTQyNCwKKwktODgsCS03MiwJLTEyMCwJLTEwNCwJLTI0LAktOCwJLTU2LAktNDAsCisJLTIxNiwJLTIwMCwJLTI0OCwJLTIzMiwJLTE1MiwJLTEzNiwJLTE4NCwJLTE2OCwKKwktMTM3NiwJLTEzMTIsCS0xNTA0LAktMTQ0MCwJLTExMjAsCS0xMDU2LAktMTI0OCwJLTExODQsCisJLTE4ODgsCS0xODI0LAktMjAxNiwJLTE5NTIsCS0xNjMyLAktMTU2OCwJLTE3NjAsCS0xNjk2LAorCS02ODgsCS02NTYsCS03NTIsCS03MjAsCS01NjAsCS01MjgsCS02MjQsCS01OTIsCisJLTk0NCwJLTkxMiwJLTEwMDgsCS05NzYsCS04MTYsCS03ODQsCS04ODAsCS04NDgsCisJNTUwNCwJNTI0OCwJNjAxNiwJNTc2MCwJNDQ4MCwJNDIyNCwJNDk5MiwJNDczNiwKKwk3NTUyLAk3Mjk2LAk4MDY0LAk3ODA4LAk2NTI4LAk2MjcyLAk3MDQwLAk2Nzg0LAorCTI3NTIsCTI2MjQsCTMwMDgsCTI4ODAsCTIyNDAsCTIxMTIsCTI0OTYsCTIzNjgsCisJMzc3NiwJMzY0OCwJNDAzMiwJMzkwNCwJMzI2NCwJMzEzNiwJMzUyMCwJMzM5MiwKKwkyMjAxNiwJMjA5OTIsCTI0MDY0LAkyMzA0MCwJMTc5MjAsCTE2ODk2LAkxOTk2OCwJMTg5NDQsCisJMzAyMDgsCTI5MTg0LAkzMjI1NiwJMzEyMzIsCTI2MTEyLAkyNTA4OCwJMjgxNjAsCTI3MTM2LAorCTExMDA4LAkxMDQ5NiwJMTIwMzIsCTExNTIwLAk4OTYwLAk4NDQ4LAk5OTg0LAk5NDcyLAorCTE1MTA0LAkxNDU5MiwJMTYxMjgsCTE1NjE2LAkxMzA1NiwJMTI1NDQsCTE0MDgwLAkxMzU2OCwKKwkzNDQsCTMyOCwJMzc2LAkzNjAsCTI4MCwJMjY0LAkzMTIsCTI5NiwKKwk0NzIsCTQ1NiwJNTA0LAk0ODgsCTQwOCwJMzkyLAk0NDAsCTQyNCwKKwk4OCwJNzIsCTEyMCwJMTA0LAkyNCwJOCwJNTYsCTQwLAorCTIxNiwJMjAwLAkyNDgsCTIzMiwJMTUyLAkxMzYsCTE4NCwJMTY4LAorCTEzNzYsCTEzMTIsCTE1MDQsCTE0NDAsCTExMjAsCTEwNTYsCTEyNDgsCTExODQsCisJMTg4OCwJMTgyNCwJMjAxNiwJMTk1MiwJMTYzMiwJMTU2OCwJMTc2MCwJMTY5NiwKKwk2ODgsCTY1NiwJNzUyLAk3MjAsCTU2MCwJNTI4LAk2MjQsCTU5MiwKKwk5NDQsCTkxMiwJMTAwOCwJOTc2LAk4MTYsCTc4NCwJODgwLAk4NDgsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvODAxMC5oIGIvc291bmQvb3NzL2VtdTEwazEvODAxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzZjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS84MDEwLmgKQEAgLTAsMCArMSw3MzcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIDgwMTAuaAorICogICAgIENvcHlyaWdodCAxOTk5LTIwMDEgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUJCSAgICBBdXRob3IJICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0JCSAgICAtLS0tLS0JICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294CSAgICBDbGVhbmVkIG9mIDhiaXQgY2hhcnMsIERPUworICoJCQkJCSAgICBsaW5lIGVuZGluZ3MKKyAqICAgICBEZWNlbWJlciA4LCAxOTk5ICAgICBKb24gVGF5bG9yCSAgICBBZGRlZCBsb3RzIG9mIG5ldyByZWdpc3RlciBpbmZvCisgKiAgICAgTWF5IDE2LCAyMDAxICAgICAgICAgRGFuaWVsIEJlcnRyYW5kIEFkZGVkIHVub2ZmaWNpYWwgREJHIHJlZ2lzdGVyIGluZm8KKyAqICAgICBPY3QtTm92IDIwMDEgICAgICAgICBELkIuICAgICAgICAgICAgQWRkZWQgdW5vZmZpY2lhbCBBdWRpZ3kgcmVnaXN0ZXJzIAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKworI2lmbmRlZiBfODAxMF9ICisjZGVmaW5lIF84MDEwX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8vIERyaXZlciB2ZXJzaW9uOgorI2RlZmluZSBNQUpPUl9WRVIgMAorI2RlZmluZSBNSU5PUl9WRVIgMjAKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMjBhIgorCisKKy8vIEF1ZGlneSBzcGVjaWZ5IHJlZ2lzdGVycyBhcmUgcHJlZml4ZWQgd2l0aCAnQV8nCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgZnVuY3Rpb24gMCByZWdpc3RlcnMsIGFkZHJlc3MgPSA8dmFsPiArIFBDSUJBU0UwCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUFRSCQkJMHgwMAkJLyogSW5kZXhlZCByZWdpc3RlciBzZXQgcG9pbnRlciByZWdpc3RlcgkqLworCQkJCQkJLyogTk9URTogVGhlIENIQU5ORUxOVU0gYW5kIEFERFJFU1Mgd29yZHMgY2FuCSovCisJCQkJCQkvKiBiZSBtb2RpZmllZCBpbmRlcGVuZGVudGx5IG9mIGVhY2ggb3RoZXIuCSovCisjZGVmaW5lIFBUUl9DSEFOTkVMTlVNX01BU0sJMHgwMDAwMDAzZgkvKiBGb3IgZWFjaCBwZXItY2hhbm5lbCByZWdpc3RlciwgaW5kaWNhdGVzIHRoZQkqLworCQkJCQkJLyogY2hhbm5lbCBudW1iZXIgb2YgdGhlIHJlZ2lzdGVyIHRvIGJlCQkqLworCQkJCQkJLyogYWNjZXNzZWQuICBGb3Igbm9uIHBlci1jaGFubmVsIHJlZ2lzdGVycyB0aGUJKi8KKwkJCQkJCS8qIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gemVyby4JCQkqLworI2RlZmluZSBQVFJfQUREUkVTU19NQVNLCTB4MDdmZjAwMDAJLyogUmVnaXN0ZXIgaW5kZXgJCQkJKi8KKworI2RlZmluZSBEQVRBCQkJMHgwNAkJLyogSW5kZXhlZCByZWdpc3RlciBzZXQgZGF0YSByZWdpc3RlcgkJKi8KKworI2RlZmluZSBJUFIJCQkweDA4CQkvKiBHbG9iYWwgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIJCSovCisJCQkJCQkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMgYnkgd3JpdGluZyBhIDEgdG8JKi8KKwkJCQkJCS8qIHRoZSByZWxldmFudCBiaXRzIGFuZCB6ZXJvIHRvIHRoZSBvdGhlciBiaXRzCSovCisKKy8qIFRoZSBuZXh0IHR3byBpbnRlcnJ1cHRzIGFyZSBmb3IgdGhlIG1pZGkgcG9ydCBvbiB0aGUgQXVkaWd5IERyaXZlIChBX01QVTEpCQkJKi8KKyNkZWZpbmUgQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkyCTB4MTAwMDAwMDAJLyogTUlESSBVQVJUIHRyYW5zbWl0IGJ1ZmZlciBlbXB0eQkJKi8KKyNkZWZpbmUgQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWTIJMHgwODAwMDAwMAkvKiBNSURJIFVBUlQgcmVjZWl2ZSBidWZmZXIgZW1wdHkJCSovCisKKyNkZWZpbmUgSVBSX1NBTVBMRVJBVEVUUkFDS0VSCTB4MDEwMDAwMDAJLyogU2FtcGxlIHJhdGUgdHJhY2tlciBsb2NrIHN0YXR1cyBjaGFuZ2UJKi8KKyNkZWZpbmUgSVBSX0ZYRFNQCQkweDAwODAwMDAwCS8qIEVuYWJsZSBGWCBEU1AgaW50ZXJydXB0cwkJCSovCisjZGVmaW5lIElQUl9GT1JDRUlOVAkJMHgwMDQwMDAwMAkvKiBGb3JjZSBTb3VuZCBCbGFzdGVyIGludGVycnVwdAkJKi8KKyNkZWZpbmUgSVBSX1BDSUVSUk9SCQkweDAwMjAwMDAwCS8qIFBDSSBidXMgZXJyb3IJCQkJKi8KKyNkZWZpbmUgSVBSX1ZPTElOQ1IJCTB4MDAxMDAwMDAJLyogVm9sdW1lIGluY3JlbWVudCBidXR0b24gcHJlc3NlZAkJKi8KKyNkZWZpbmUgSVBSX1ZPTERFQ1IJCTB4MDAwODAwMDAJLyogVm9sdW1lIGRlY3JlbWVudCBidXR0b24gcHJlc3NlZAkJKi8KKyNkZWZpbmUgSVBSX01VVEUJCTB4MDAwNDAwMDAJLyogTXV0ZSBidXR0b24gcHJlc3NlZAkJCQkqLworI2RlZmluZSBJUFJfTUlDQlVGRlVMTAkJMHgwMDAyMDAwMAkvKiBNaWNyb3Bob25lIGJ1ZmZlciBmdWxsCQkJKi8KKyNkZWZpbmUgSVBSX01JQ0JVRkhBTEZGVUxMCTB4MDAwMTAwMDAJLyogTWljcm9waG9uZSBidWZmZXIgaGFsZiBmdWxsCQkJKi8KKyNkZWZpbmUgSVBSX0FEQ0JVRkZVTEwJCTB4MDAwMDgwMDAJLyogQURDIGJ1ZmZlciBmdWxsCQkJCSovCisjZGVmaW5lIElQUl9BRENCVUZIQUxGRlVMTAkweDAwMDA0MDAwCS8qIEFEQyBidWZmZXIgaGFsZiBmdWxsCQkJCSovCisjZGVmaW5lIElQUl9FRlhCVUZGVUxMCQkweDAwMDAyMDAwCS8qIEVmZmVjdHMgYnVmZmVyIGZ1bGwJCQkJKi8KKyNkZWZpbmUgSVBSX0VGWEJVRkhBTEZGVUxMCTB4MDAwMDEwMDAJLyogRWZmZWN0cyBidWZmZXIgaGFsZiBmdWxsCQkJKi8KKyNkZWZpbmUgSVBSX0dQU1BESUZTVEFUVVNDSEFOR0UJMHgwMDAwMDgwMAkvKiBHUFNQRElGIGNoYW5uZWwgc3RhdHVzIGNoYW5nZQkJKi8KKyNkZWZpbmUgSVBSX0NEUk9NU1RBVFVTQ0hBTkdFCTB4MDAwMDA0MDAJLyogQ0QtUk9NIGNoYW5uZWwgc3RhdHVzIGNoYW5nZQkJCSovCisjZGVmaW5lIElQUl9JTlRFUlZBTFRJTUVSCTB4MDAwMDAyMDAJLyogSW50ZXJ2YWwgdGltZXIgdGVybWluYWwgY291bnQJCSovCisjZGVmaW5lIElQUl9NSURJVFJBTlNCVUZFTVBUWQkweDAwMDAwMTAwCS8qIE1JREkgVUFSVCB0cmFuc21pdCBidWZmZXIgZW1wdHkJCSovCisjZGVmaW5lIElQUl9NSURJUkVDVkJVRkVNUFRZCTB4MDAwMDAwODAJLyogTUlESSBVQVJUIHJlY2VpdmUgYnVmZmVyIGVtcHR5CQkqLworI2RlZmluZSBJUFJfQ0hBTk5FTExPT1AJCTB4MDAwMDAwNDAJLyogT25lIG9yIG1vcmUgY2hhbm5lbCBsb29wIGludGVycnVwdHMgcGVuZGluZwkqLworI2RlZmluZSBJUFJfQ0hBTk5FTE5VTUJFUk1BU0sJMHgwMDAwMDAzZgkvKiBXaGVuIElQUl9DSEFOTkVMTE9PUCBpcyBzZXQsIGluZGljYXRlcyB0aGUJKi8KKwkJCQkJCS8qIEhpZ2hlc3Qgc2V0IGNoYW5uZWwgaW4gQ0xJUEwgb3IgQ0xJUEguICBXaGVuCSovCisJCQkJCQkvKiBJUCBpcyB3cml0dGVuIHdpdGggQ0wgc2V0LCB0aGUgYml0IGluIENMSVBMCSovCisJCQkJCQkvKiBvciBDTElQSCBjb3JyZXNwb25kaW5nIHRvIHRoZSBDSU4gdmFsdWUgCSovCisJCQkJCQkvKiB3cml0dGVuIHdpbGwgYmUgY2xlYXJlZC4JCQkqLworI2RlZmluZSBBX0lQUl9NSURJVFJBTlNCVUZFTVBUWTEJSVBSX01JRElUUkFOU0JVRkVNUFRZCS8qIE1JREkgVUFSVCB0cmFuc21pdCBidWZmZXIgZW1wdHkJCSovCisjZGVmaW5lIEFfSVBSX01JRElSRUNWQlVGRU1QVFkxCUlQUl9NSURJUkVDVkJVRkVNUFRZCS8qIE1JREkgVUFSVCByZWNlaXZlIGJ1ZmZlciBlbXB0eQkJKi8KKworCisKKyNkZWZpbmUgSU5URQkJCTB4MGMJCS8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIJCQkqLworI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl9NQVNLCTB4YzAwMDAwMDAJLyogVmlydHVhbCBTb3VuZGJsYXN0ZXIgSS9PIHBvcnQgY2FwdHVyZQkqLworI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl8yMjAJMHgwMDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgyMjAtMHgyMmYJKi8KKyNkZWZpbmUgSU5URV9WSVJUVUFMU0JfMjQwCTB4NDAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MjQwCQkqLworI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl8yNjAJMHg4MDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgyNjAJCSovCisjZGVmaW5lIElOVEVfVklSVFVBTFNCXzI4MAkweGMwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDI4MAkJKi8KKyNkZWZpbmUgSU5URV9WSVJUVUFMTVBVX01BU0sJMHgzMDAwMDAwMAkvKiBWaXJ0dWFsIE1QVSBJL08gcG9ydCBjYXB0dXJlCQkJKi8KKyNkZWZpbmUgSU5URV9WSVJUVUFMTVBVXzMwMAkweDAwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDMwMC0weDMwMQkqLworI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfMzEwCTB4MTAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MzEwCQkqLworI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfMzIwCTB4MjAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MzIwCQkqLworI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfMzMwCTB4MzAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MzMwCQkqLworI2RlZmluZSBJTlRFX01BU1RFUkRNQUVOQUJMRQkweDA4MDAwMDAwCS8qIE1hc3RlciBETUEgZW11bGF0aW9uIGF0IDB4MDAwLTB4MDBmCQkqLworI2RlZmluZSBJTlRFX1NMQVZFRE1BRU5BQkxFCTB4MDQwMDAwMDAJLyogU2xhdmUgRE1BIGVtdWxhdGlvbiBhdCAweDBjMC0weDBkZgkJKi8KKyNkZWZpbmUgSU5URV9NQVNURVJQSUNFTkFCTEUJMHgwMjAwMDAwMAkvKiBNYXN0ZXIgUElDIGVtdWxhdGlvbiBhdCAweDAyMC0weDAyMQkJKi8KKyNkZWZpbmUgSU5URV9TTEFWRVBJQ0VOQUJMRQkweDAxMDAwMDAwCS8qIFNsYXZlIFBJQyBlbXVsYXRpb24gYXQgMHgwYTAtMHgwYTEJCSovCisjZGVmaW5lIElOVEVfVlNCRU5BQkxFCQkweDAwODAwMDAwCS8qIEVuYWJsZSB2aXJ0dWFsIFNvdW5kYmxhc3RlcgkJCSovCisjZGVmaW5lIElOVEVfQURMSUJFTkFCTEUJMHgwMDQwMDAwMAkvKiBFbmFibGUgQWRMaWIgZW11bGF0aW9uIGF0IDB4Mzg4LTB4MzhiCSovCisjZGVmaW5lIElOVEVfTVBVRU5BQkxFCQkweDAwMjAwMDAwCS8qIEVuYWJsZSB2aXJ0dWFsIE1QVQkJCQkqLworI2RlZmluZSBJTlRFX0ZPUkNFSU5UCQkweDAwMTAwMDAwCS8qIENvbnRpbnVvdXNseSBhc3NlcnQgSU5UQU4JCQkqLworCisjZGVmaW5lIElOVEVfTVJIQU5ERU5BQkxFCTB4MDAwODAwMDAJLyogRW5hYmxlIHRoZSAiTXIuIEhhbmQiIGxvZ2ljCQkJKi8KKwkJCQkJCS8qIE5PVEU6IFRoZXJlIGlzIG5vIHJlYXNvbiB0byB1c2UgdGhpcyB1bmRlcgkqLworCQkJCQkJLyogTGludXgsIGFuZCBpdCB3aWxsIGNhdXNlIG9kZCBoYXJkd2FyZSAJKi8KKwkJCQkJCS8qIGJlaGF2aW9yIGFuZCBwb3NzaWJseSByYW5kb20gc2VnZmF1bHRzIGFuZAkqLworCQkJCQkJLyogbG9ja3VwcyBpZiBlbmFibGVkLgkJCQkqLworCisvKiBUaGUgbmV4dCB0d28gaW50ZXJydXB0cyBhcmUgZm9yIHRoZSBtaWRpIHBvcnQgb24gdGhlIEF1ZGlneSBEcml2ZSAoQV9NUFUxKQkJCSovCisjZGVmaW5lIEFfSU5URV9NSURJVFhFTkFCTEUyCTB4MDAwMjAwMDAJLyogRW5hYmxlIE1JREkgdHJhbnNtaXQtYnVmZmVyLWVtcHR5IGludGVycnVwdHMJKi8KKyNkZWZpbmUgQV9JTlRFX01JRElSWEVOQUJMRTIJMHgwMDAxMDAwMAkvKiBFbmFibGUgTUlESSByZWNlaXZlLWJ1ZmZlci1lbXB0eSBpbnRlcnJ1cHRzCSovCisKKworI2RlZmluZSBJTlRFX1NBTVBMRVJBVEVUUkFDS0VSCTB4MDAwMDIwMDAJLyogRW5hYmxlIHNhbXBsZSByYXRlIHRyYWNrZXIgaW50ZXJydXB0cwkqLworCQkJCQkJLyogTk9URTogVGhpcyBiaXQgbXVzdCBhbHdheXMgYmUgZW5hYmxlZCAgICAgICAJKi8KKyNkZWZpbmUgSU5URV9GWERTUEVOQUJMRQkweDAwMDAxMDAwCS8qIEVuYWJsZSBGWCBEU1AgaW50ZXJydXB0cwkJCSovCisjZGVmaW5lIElOVEVfUENJRVJST1JFTkFCTEUJMHgwMDAwMDgwMAkvKiBFbmFibGUgUENJIGJ1cyBlcnJvciBpbnRlcnJ1cHRzCQkqLworI2RlZmluZSBJTlRFX1ZPTElOQ1JFTkFCTEUJMHgwMDAwMDQwMAkvKiBFbmFibGUgdm9sdW1lIGluY3JlbWVudCBidXR0b24gaW50ZXJydXB0cwkqLworI2RlZmluZSBJTlRFX1ZPTERFQ1JFTkFCTEUJMHgwMDAwMDIwMAkvKiBFbmFibGUgdm9sdW1lIGRlY3JlbWVudCBidXR0b24gaW50ZXJydXB0cwkqLworI2RlZmluZSBJTlRFX01VVEVFTkFCTEUJCTB4MDAwMDAxMDAJLyogRW5hYmxlIG11dGUgYnV0dG9uIGludGVycnVwdHMJCSovCisjZGVmaW5lIElOVEVfTUlDQlVGRU5BQkxFCTB4MDAwMDAwODAJLyogRW5hYmxlIG1pY3JvcGhvbmUgYnVmZmVyIGludGVycnVwdHMJCSovCisjZGVmaW5lIElOVEVfQURDQlVGRU5BQkxFCTB4MDAwMDAwNDAJLyogRW5hYmxlIEFEQyBidWZmZXIgaW50ZXJydXB0cwkJCSovCisjZGVmaW5lIElOVEVfRUZYQlVGRU5BQkxFCTB4MDAwMDAwMjAJLyogRW5hYmxlIEVmZmVjdHMgYnVmZmVyIGludGVycnVwdHMJCSovCisjZGVmaW5lIElOVEVfR1BTUERJRkVOQUJMRQkweDAwMDAwMDEwCS8qIEVuYWJsZSBHUFNQRElGIHN0YXR1cyBpbnRlcnJ1cHRzCQkqLworI2RlZmluZSBJTlRFX0NEU1BESUZFTkFCTEUJMHgwMDAwMDAwOAkvKiBFbmFibGUgQ0RTUERJRiBzdGF0dXMgaW50ZXJydXB0cwkJKi8KKyNkZWZpbmUgSU5URV9JTlRFUlZBTFRJTUVSRU5CCTB4MDAwMDAwMDQJLyogRW5hYmxlIGludGVydmFsIHRpbWVyIGludGVycnVwdHMJCSovCisjZGVmaW5lIElOVEVfTUlESVRYRU5BQkxFCTB4MDAwMDAwMDIJLyogRW5hYmxlIE1JREkgdHJhbnNtaXQtYnVmZmVyLWVtcHR5IGludGVycnVwdHMJKi8KKyNkZWZpbmUgSU5URV9NSURJUlhFTkFCTEUJMHgwMDAwMDAwMQkvKiBFbmFibGUgTUlESSByZWNlaXZlLWJ1ZmZlci1lbXB0eSBpbnRlcnJ1cHRzCSovCisKKy8qIFRoZSBuZXh0IHR3byBpbnRlcnJ1cHRzIGFyZSBmb3IgdGhlIG1pZGkgcG9ydCBvbiB0aGUgQXVkaWd5IChBX01QVTIpCSovCisjZGVmaW5lIEFfSU5URV9NSURJVFhFTkFCTEUxICAJSU5URV9NSURJVFhFTkFCTEUKKyNkZWZpbmUgQV9JTlRFX01JRElSWEVOQUJMRTEJSU5URV9NSURJUlhFTkFCTEUKKworI2RlZmluZSBXQwkJCTB4MTAJCS8qIFdhbGwgQ2xvY2sgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgV0NfU0FNUExFQ09VTlRFUl9NQVNLCTB4MDNGRkZGQzAJLyogU2FtcGxlIHBlcmlvZHMgZWxhcHNlZCBzaW5jZSByZXNldAkJKi8KKyNkZWZpbmUgV0NfU0FNUExFQ09VTlRFUgkweDE0MDYwMDEwCisjZGVmaW5lIFdDX0NVUlJFTlRDSEFOTkVMCTB4MDAwMDAwM0YJLyogQ2hhbm5lbCBbMC4uNjNdIGN1cnJlbnRseSBiZWluZyBzZXJ2aWNlZAkqLworCQkJCQkJLyogTk9URTogRWFjaCBjaGFubmVsIHRha2VzIDEvNjR0aCBvZiBhIHNhbXBsZQkqLworCQkJCQkJLyogcGVyaW9kIHRvIGJlIHNlcnZpY2VkLgkJCSovCisKKyNkZWZpbmUgSENGRwkJCTB4MTQJCS8qIEhhcmR3YXJlIGNvbmZpZyByZWdpc3RlcgkJCSovCisJCQkJCQkvKiBOT1RFOiBUaGVyZSBpcyBubyByZWFzb24gdG8gdXNlIHRoZSBsZWdhY3kJKi8KKwkJCQkJCS8qIFNvdW5kQmxhc3RlciBlbXVsYXRpb24gc3R1ZmYgZGVzY3JpYmVkIGJlbG93CSovCisJCQkJCQkvKiB1bmRlciBMaW51eCwgYW5kIGFsbCBraW5kcyBvZiB3ZWlyZCBoYXJkd2FyZQkqLworCQkJCQkJLyogYmVoYXZpb3IgY2FuIHJlc3VsdCBpZiB5b3UgdHJ5LiAgRG9uJ3QuCSovCisjZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19NQVNLCTB4ZTAwMDAwMDAJLyogTGVnYWN5IGZ1bmN0aW9uIG51bWJlciAJCQkqLworI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTVBVCTB4MDAwMDAwMDAJLyogTGVnYWN5IE1QVQkgCQkJCSovCisjZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19TQgkweDQwMDAwMDAwCS8qIExlZ2FjeSBTQgkJCQkJKi8KKyNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX0FECTB4NjAwMDAwMDAJLyogTGVnYWN5IEFECQkJCQkqLworI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTVBJQwkweDgwMDAwMDAwCS8qIExlZ2FjeSBNUElDCQkJCQkqLworI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTURNQQkweGEwMDAwMDAwCS8qIExlZ2FjeSBNRE1BCQkJCQkqLworI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfU1BDSQkweGMwMDAwMDAwCS8qIExlZ2FjeSBTUENJCQkJCQkqLworI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfU0RNQQkweGUwMDAwMDAwCS8qIExlZ2FjeSBTRE1BCQkJCQkqLworI2RlZmluZSBIQ0ZHX0lPQ0FQVFVSRUFERFIJMHgxZjAwMDAwMAkvKiBUaGUgNCBMU0JzIG9mIHRoZSBjYXB0dXJlZCBJL08gYWRkcmVzcy4JKi8KKyNkZWZpbmUgSENGR19MRUdBQ1lXUklURQkweDAwODAwMDAwCS8qIDEgPSB3cml0ZSwgMCA9IHJlYWQgCQkJCSovCisjZGVmaW5lIEhDRkdfTEVHQUNZV09SRAkJMHgwMDQwMDAwMAkvKiAxID0gd29yZCwgMCA9IGJ5dGUgCQkJCSovCisjZGVmaW5lIEhDRkdfTEVHQUNZSU5UCQkweDAwMjAwMDAwCS8qIDEgPSBsZWdhY3kgZXZlbnQgY2FwdHVyZWQuIFdyaXRlIDEgdG8gY2xlYXIuCSovCisJCQkJCQkvKiBOT1RFOiBUaGUgcmVzdCBvZiB0aGUgYml0cyBpbiB0aGlzIHJlZ2lzdGVyCSovCisJCQkJCQkvKiBfYXJlXyByZWxldmFudCB1bmRlciBMaW51eC4JCQkqLworI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX01BU0sJMHgwMDA3MDAwMAkvKiBDT0RFQyBmb3JtYXQJCQkJCSovCisjZGVmaW5lIEhDRkdfQ09ERUNGT1JNQVRfQUM5NwkweDAwMDAwMDAwCS8qIEFDOTcgQ09ERUMgZm9ybWF0IC0tIFByaW1hcnkgT3V0cHV0CQkqLworI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX0kyUwkweDAwMDEwMDAwCS8qIEkyUyBDT0RFQyBmb3JtYXQgLS0gU2Vjb25kYXJ5IChSZWFyKSBPdXRwdXQJKi8KKyNkZWZpbmUgSENGR19HUElOUFVUMAkJMHgwMDAwNDAwMAkvKiBFeHRlcm5hbCBwaW4xMTIJCQkJKi8KKyNkZWZpbmUgSENGR19HUElOUFVUMQkJMHgwMDAwMjAwMAkvKiBFeHRlcm5hbCBwaW4xMTAJCQkJKi8KKworI2RlZmluZSBIQ0ZHX0dQT1VUUFVUX01BU0sJMHgwMDAwMWMwMAkvKiBFeHRlcm5hbCBwaW5zIHdoaWNoIG1heSBiZSBjb250cm9sbGVkCSovCisjZGVmaW5lIEhDRkdfR1BPVVQwCQkweDAwMDAxMDAwCS8qIHNldCB0byBlbmFibGUgZGlnaXRhbCBvdXQgb24gNS4xIGNhcmRzCSovCisKKyNkZWZpbmUgSENGR19KT1lFTkFCTEUgICAgICAJMHgwMDAwMDIwMAkvKiBJbnRlcm5hbCBqb3lzdGljayBlbmFibGUgICAgCQkJKi8KKyNkZWZpbmUgSENGR19QSEFTRVRSQUNLRU5BQkxFCTB4MDAwMDAxMDAJLyogUGhhc2UgdHJhY2tpbmcgZW5hYmxlCQkJKi8KKwkJCQkJCS8qIDEgPSBGb3JjZSBhbGwgMyBhc3luYyBkaWdpdGFsIGlucHV0cyB0byB1c2UJKi8KKwkJCQkJCS8qIHRoZSBzYW1lIGFzeW5jIHNhbXBsZSByYXRlIHRyYWNrZXIgKFpWSURFTykJKi8KKyNkZWZpbmUgSENGR19BQzNFTkFCTEVfTUFTSwkweDB4MDAwMGUwCS8qIEFDMyBhc3luYyBpbnB1dCBjb250cm9sIC0gTm90IGltcGxlbWVudGVkCSovCisjZGVmaW5lIEhDRkdfQUMzRU5BQkxFX1pWSURFTwkweDAwMDAwMDgwCS8qIENoYW5uZWxzIDAgYW5kIDEgcmVwbGFjZSBaVklERU8JCSovCisjZGVmaW5lIEhDRkdfQUMzRU5BQkxFX0NEU1BESUYJMHgwMDAwMDA0MAkvKiBDaGFubmVscyAwIGFuZCAxIHJlcGxhY2UgQ0RTUERJRgkJKi8KKyNkZWZpbmUgSENGR19BQzNFTkFCTEVfR1BTUERJRiAgMHgwMDAwMDAyMCAgICAgIC8qIENoYW5uZWxzIDAgYW5kIDEgcmVwbGFjZSBHUFNQRElGICAgICAgICAgICAgICovCisjZGVmaW5lIEhDRkdfQVVUT01VVEUJCTB4MDAwMDAwMTAJLyogV2hlbiBzZXQsIHRoZSBhc3luYyBzYW1wbGUgcmF0ZSBjb252ZXJ0b3JzCSovCisJCQkJCQkvKiB3aWxsIGF1dG9tYXRpY2FsbHkgbXV0ZSB0aGVpciBvdXRwdXQgd2hlbgkqLworCQkJCQkJLyogdGhleSBhcmUgbm90IHJhdGUtbG9ja2VkIHRvIHRoZSBleHRlcm5hbAkqLworCQkJCQkJLyogYXN5bmMgYXVkaW8gc291cmNlICAJCQkJKi8KKyNkZWZpbmUgSENGR19MT0NLU09VTkRDQUNIRQkweDAwMDAwMDA4CS8qIDEgPSBDYW5jZWwgYnVzdG1hc3RlciBhY2Nlc3NlcyB0byBzb3VuZGNhY2hlICovCisJCQkJCQkvKiBOT1RFOiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgbmV2ZXIgYmUgdXNlZC4gIAkqLworI2RlZmluZSBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSwkweDAwMDAwMDA0CS8qIDEgPSBDYW5jZWwgYnVzdG1hc3RlciBhY2Nlc3NlcyB0byB0YW5rY2FjaGUJKi8KKwkJCQkJCS8qIE5PVEU6IFRoaXMgc2hvdWxkIGdlbmVyYWxseSBuZXZlciBiZSB1c2VkLiAgCSovCisjZGVmaW5lIEhDRkdfTE9DS1RBTktDQUNIRQkweDAxMDIwMDE0CisjZGVmaW5lIEhDRkdfTVVURUJVVFRPTkVOQUJMRQkweDAwMDAwMDAyCS8qIDEgPSBNYXN0ZXIgbXV0ZSBidXR0b24gc2V0cyBBVURJT0VOQUJMRSA9IDAuCSovCisJCQkJCQkvKiBOT1RFOiBUaGlzIGlzIGEgJ2NoZWFwJyB3YXkgdG8gaW1wbGVtZW50IGEJKi8KKwkJCQkJCS8qIG1hc3RlciBtdXRlIGZ1bmN0aW9uIG9uIHRoZSBtdXRlIGJ1dHRvbiwgYW5kCSovCisJCQkJCQkvKiBpbiBnZW5lcmFsIHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgYSBtb3JlCSovCisJCQkJCQkvKiBzb3BoaXN0aWNhdGVkIG1hc3RlciBtdXRlIGZ1bmN0aW9uIGhhcyBub3QJKi8KKwkJCQkJCS8qIGJlZW4gd3JpdHRlbi4gICAgICAgCQkJCSovCisjZGVmaW5lIEhDRkdfQVVESU9FTkFCTEUJMHgwMDAwMDAwMQkvKiAwID0gQ09ERUNzIHRyYW5zbWl0IHplcm8tdmFsdWVkIHNhbXBsZXMJKi8KKwkJCQkJCS8qIFNob3VsZCBiZSBzZXQgdG8gMSB3aGVuIHRoZSBFTVUxMEsxIGlzCSovCisJCQkJCQkvKiBjb21wbGV0ZWx5IGluaXRpYWxpemVkLgkJCSovCisKKy8vRm9yIEF1ZGlneSwgTVBVIHBvcnQgbW92ZSB0byAweDcwLTB4NzQgcHRyIHJlZ2lzdGVyCisKKyNkZWZpbmUgTVVEQVRBCQkJMHgxOAkJLyogTVBVNDAxIGRhdGEgcmVnaXN0ZXIgKDggYml0cykgICAgICAgCQkqLworCisjZGVmaW5lIE1VQ01ECQkJMHgxOQkJLyogTVBVNDAxIGNvbW1hbmQgcmVnaXN0ZXIgKDggYml0cykgICAgCQkqLworI2RlZmluZSBNVUNNRF9SRVNFVAkJMHhmZgkJLyogUkVTRVQgY29tbWFuZAkJCQkqLworI2RlZmluZSBNVUNNRF9FTlRFUlVBUlRNT0RFCTB4M2YJCS8qIEVudGVyX1VBUlRfbW9kZSBjb21tYW5kCQkJKi8KKwkJCQkJCS8qIE5PVEU6IEFsbCBvdGhlciBjb21tYW5kcyBhcmUgaWdub3JlZAkJKi8KKworI2RlZmluZSBNVVNUQVQJCQlNVUNNRAkJLyogTVBVNDAxIHN0YXR1cyByZWdpc3RlciAoOCBiaXRzKSAgICAgCQkqLworI2RlZmluZSBNVVNUQVRfSVJEWU4JCTB4ODAJCS8qIDAgPSBNSURJIGRhdGEgb3IgY29tbWFuZCBBQ0sJCQkqLworI2RlZmluZSBNVVNUQVRfT1JEWU4JCTB4NDAJCS8qIDAgPSBNVURBVEEgY2FuIGFjY2VwdCBhIGNvbW1hbmQgb3IgZGF0YQkqLworCisjZGVmaW5lIEFfSU9DRkcJCQkweDE4CQkvKiBHUElPIG9uIEF1ZGlneSBjYXJkICgxNmJpdHMpCQkJKi8KKyNkZWZpbmUgQV9HUElOUFVUX01BU0sJCTB4ZmYwMAorI2RlZmluZSBBX0dQT1VUUFVUX01BU0sJCTB4MDBmZgorCisjZGVmaW5lIFRJTUVSCQkJMHgxYQkJLyogVGltZXIgdGVybWluYWwgY291bnQgcmVnaXN0ZXIgKDE2LWJpdCkJKi8KKwkJCQkJCS8qIE5PVEU6IEFmdGVyIHRoZSByYXRlIGlzIGNoYW5nZWQsIGEgbWF4aW11bQkqLworCQkJCQkJLyogb2YgMTAyNCBzYW1wbGUgcGVyaW9kcyBzaG91bGQgYmUgYWxsb3dlZAkqLworCQkJCQkJLyogYmVmb3JlIHRoZSBuZXcgcmF0ZSBpcyBndWFyYW50ZWVkIGFjY3VyYXRlLgkqLworI2RlZmluZSBUSU1FUl9SQVRFX01BU0sJCTB4MDNmZgkJLyogVGltZXIgaW50ZXJydXB0IHJhdGUgaW4gc2FtcGxlIHBlcmlvZHMJKi8KKwkJCQkJCS8qIDAgPT0gMTAyNCBwZXJpb2RzLCBbMS4uNF0gYXJlIG5vdCB1c2VmdWwJKi8KKworI2RlZmluZSBBQzk3REFUQQkJMHgxYwkJLyogQUM5NyByZWdpc3RlciBzZXQgZGF0YSByZWdpc3RlciAoMTYgYml0KQkqLworCisjZGVmaW5lIEFDOTdBRERSRVNTCQkweDFlCQkvKiBBQzk3IHJlZ2lzdGVyIHNldCBhZGRyZXNzIHJlZ2lzdGVyICg4IGJpdCkJKi8KKyNkZWZpbmUgQUM5N0FERFJFU1NfUkVBRFkJMHg4MAkJLyogUmVhZC1vbmx5IGJpdCwgcmVmbGVjdHMgQ09ERUMgUkVBRFkgc2lnbmFsCSovCisjZGVmaW5lIEFDOTdBRERSRVNTX0FERFJFU1MJMHg3ZgkJLyogQWRkcmVzcyBvZiBpbmRleGVkIEFDOTcgcmVnaXN0ZXIJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVtdTEwazEgcG9pbnRlci1vZmZzZXQgcmVnaXN0ZXIgc2V0LCBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBQVFIgYW5kIERBVEEgcmVnaXN0ZXJzCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDUEYJCQkweDAwCQkvKiBDdXJyZW50IHBpdGNoIGFuZCBmcmFjdGlvbiByZWdpc3RlcgkJCSovCisjZGVmaW5lIENQRl9DVVJSRU5UUElUQ0hfTUFTSwkweGZmZmYwMDAwCS8qIEN1cnJlbnQgcGl0Y2ggKGxpbmVhciwgMHg0MDAwID09IHVuaXR5IHBpdGNoIHNoaWZ0KSAJKi8KKyNkZWZpbmUgQ1BGX0NVUlJFTlRQSVRDSAkweDEwMTAwMDAwCisjZGVmaW5lIENQRl9TVEVSRU9fTUFTSwkJMHgwMDAwODAwMAkvKiAxID0gRXZlbiBjaGFubmVsIGludGVybGVhdmUsIG9kZCBjaGFubmVsIGxvY2tlZAkqLworI2RlZmluZSBDUEZfU1RPUF9NQVNLCQkweDAwMDA0MDAwCS8qIDEgPSBDdXJyZW50IHBpdGNoIGZvcmNlZCB0byAwCQkJKi8KKyNkZWZpbmUgQ1BGX0ZSQUNBRERSRVNTX01BU0sJMHgwMDAwM2ZmZgkvKiBMaW5lYXIgZnJhY3Rpb25hbCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IGNoYW5uZWwJKi8KKworI2RlZmluZSBQVFJYCQkJMHgwMQkJLyogUGl0Y2ggdGFyZ2V0IGFuZCBzZW5kIEEvQiBhbW91bnRzIHJlZ2lzdGVyCQkqLworI2RlZmluZSBQVFJYX1BJVENIVEFSR0VUX01BU0sJMHhmZmZmMDAwMAkvKiBQaXRjaCB0YXJnZXQgb2Ygc3BlY2lmaWVkIGNoYW5uZWwJCQkqLworI2RlZmluZSBQVFJYX1BJVENIVEFSR0VUCTB4MTAxMDAwMDEKKyNkZWZpbmUgUFRSWF9GWFNFTkRBTU9VTlRfQV9NQVNLIDB4MDAwMGZmMDAJLyogTGluZWFyIGxldmVsIG9mIGNoYW5uZWwgb3V0cHV0IHNlbnQgdG8gRlggc2VuZCBidXMgQQkqLworI2RlZmluZSBQVFJYX0ZYU0VOREFNT1VOVF9BCTB4MDgwODAwMDEKKyNkZWZpbmUgUFRSWF9GWFNFTkRBTU9VTlRfQl9NQVNLIDB4MDAwMDAwZmYJLyogTGluZWFyIGxldmVsIG9mIGNoYW5uZWwgb3V0cHV0IHNlbnQgdG8gRlggc2VuZCBidXMgQgkqLworI2RlZmluZSBQVFJYX0ZYU0VOREFNT1VOVF9CCTB4MDgwMDAwMDEKKworI2RlZmluZSBDVkNGCQkJMHgwMgkJLyogQ3VycmVudCB2b2x1bWUgYW5kIGZpbHRlciBjdXRvZmYgcmVnaXN0ZXIJCSovCisjZGVmaW5lIENWQ0ZfQ1VSUkVOVFZPTF9NQVNLCTB4ZmZmZjAwMDAJLyogQ3VycmVudCBsaW5lYXIgdm9sdW1lIG9mIHNwZWNpZmllZCBjaGFubmVsCQkqLworI2RlZmluZSBDVkNGX0NVUlJFTlRWT0wJCTB4MTAxMDAwMDIKKyNkZWZpbmUgQ1ZDRl9DVVJSRU5URklMVEVSX01BU0sJMHgwMDAwZmZmZgkvKiBDdXJyZW50IGZpbHRlciBjdXRvZmYgZnJlcXVlbmN5IG9mIHNwZWNpZmllZCBjaGFubmVsCSovCisjZGVmaW5lIENWQ0ZfQ1VSUkVOVEZJTFRFUgkweDEwMDAwMDAyCisKKyNkZWZpbmUgVlRGVAkJCTB4MDMJCS8qIFZvbHVtZSB0YXJnZXQgYW5kIGZpbHRlciBjdXRvZmYgdGFyZ2V0IHJlZ2lzdGVyCSovCisjZGVmaW5lIFZURlRfVk9MVU1FVEFSR0VUX01BU0sJMHhmZmZmMDAwMAkvKiBWb2x1bWUgdGFyZ2V0IG9mIHNwZWNpZmllZCBjaGFubmVsCQkJKi8KKyNkZWZpbmUgVlRGVF9GSUxURVJUQVJHRVRfTUFTSwkweDAwMDBmZmZmCS8qIEZpbHRlciBjdXRvZmYgdGFyZ2V0IG9mIHNwZWNpZmllZCBjaGFubmVsCQkqLworCisjZGVmaW5lIFoxCQkJMHgwNQkJLyogRmlsdGVyIGRlbGF5IG1lbW9yeSAxIHJlZ2lzdGVyCQkJKi8KKworI2RlZmluZSBaMgkJCTB4MDQJCS8qIEZpbHRlciBkZWxheSBtZW1vcnkgMiByZWdpc3RlcgkJCSovCisKKyNkZWZpbmUgUFNTVAkJCTB4MDYJCS8qIFNlbmQgQyBhbW91bnQgYW5kIGxvb3Agc3RhcnQgYWRkcmVzcyByZWdpc3RlcgkqLworI2RlZmluZSBQU1NUX0ZYU0VOREFNT1VOVF9DX01BU0sgMHhmZjAwMDAwMAkvKiBMaW5lYXIgbGV2ZWwgb2YgY2hhbm5lbCBvdXRwdXQgc2VudCB0byBGWCBzZW5kIGJ1cyBDCSovCisKKyNkZWZpbmUgUFNTVF9GWFNFTkRBTU9VTlRfQwkweDA4MTgwMDA2CisKKyNkZWZpbmUgUFNTVF9MT09QU1RBUlRBRERSX01BU0sJMHgwMGZmZmZmZgkvKiBMb29wIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsCQkqLworI2RlZmluZSBQU1NUX0xPT1BTVEFSVEFERFIJMHgxODAwMDAwNgorCisjZGVmaW5lIERTTAkJCTB4MDcJCS8qIFNlbmQgRCBhbW91bnQgYW5kIGxvb3Agc3RhcnQgYWRkcmVzcyByZWdpc3RlcgkqLworI2RlZmluZSBEU0xfRlhTRU5EQU1PVU5UX0RfTUFTSwkweGZmMDAwMDAwCS8qIExpbmVhciBsZXZlbCBvZiBjaGFubmVsIG91dHB1dCBzZW50IHRvIEZYIHNlbmQgYnVzIEQJKi8KKworI2RlZmluZSBEU0xfRlhTRU5EQU1PVU5UX0QJMHgwODE4MDAwNworCisjZGVmaW5lIERTTF9MT09QRU5EQUREUl9NQVNLCTB4MDBmZmZmZmYJLyogTG9vcCBlbmQgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGNoYW5uZWwJCSovCisjZGVmaW5lIERTTF9MT09QRU5EQUREUgkJMHgxODAwMDAwNworCisjZGVmaW5lIENDQ0EJCQkweDA4CQkvKiBGaWx0ZXIgUSwgaW50ZXJwLiBST00sIGJ5dGUgc2l6ZSwgY3VyLiBhZGRyIHJlZ2lzdGVyICovCisjZGVmaW5lIENDQ0FfUkVTT05BTkNFCQkweGYwMDAwMDAwCS8qIExvd3Bhc3MgZmlsdGVyIHJlc29uYW5jZSAoUSkgaGVpZ2h0CQkJKi8KKyNkZWZpbmUgQ0NDQV9JTlRFUlBST01NQVNLCTB4MGUwMDAwMDAJLyogU2VsZWN0cyBwYXNzYmFuZCBvZiBpbnRlcnBvbGF0aW9uIFJPTQkJKi8KKwkJCQkJCS8qIDEgPT0gZnVsbCBiYW5kLCA3ID09IGxvd3Bhc3MJCQkJKi8KKwkJCQkJCS8qIFJPTSAwIGlzIHVzZWQgd2hlbiBwaXRjaCBzaGlmdGluZyBkb3dud2FyZCBvciBsZXNzCSovCisJCQkJCQkvKiB0aGVuIDMgc2VtaXRvbmVzIHVwd2FyZC4gIEluY3JlYXNpbmdseSBoaWdoZXIgUk9NCSovCisJCQkJCQkvKiBudW1iZXJzIGFyZSB1c2VkLCB0eXBpY2FsbHkgaW4gc3RlcHMgb2YgMyBzZW1pdG9uZXMsCSovCisJCQkJCQkvKiBhcyB1cHdhcmQgcGl0Y2ggc2hpZnRpbmcgaXMgcGVyZm9ybWVkLgkJKi8KKyNkZWZpbmUgQ0NDQV9JTlRFUlBST01fMAkweDAwMDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSAwCQkJCSovCisjZGVmaW5lIENDQ0FfSU5URVJQUk9NXzEJMHgwMjAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gMQkJCQkqLworI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV8yCTB4MDQwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDIJCQkJKi8KKyNkZWZpbmUgQ0NDQV9JTlRFUlBST01fMwkweDA2MDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSAzCQkJCSovCisjZGVmaW5lIENDQ0FfSU5URVJQUk9NXzQJMHgwODAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gNAkJCQkqLworI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV81CTB4MGEwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDUJCQkJKi8KKyNkZWZpbmUgQ0NDQV9JTlRFUlBST01fNgkweDBjMDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSA2CQkJCSovCisjZGVmaW5lIENDQ0FfSU5URVJQUk9NXzcJMHgwZTAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gNwkJCQkqLworI2RlZmluZSBDQ0NBXzhCSVRTRUxFQ1QJCTB4MDEwMDAwMDAJLyogMSA9IFNvdW5kIG1lbW9yeSBmb3IgdGhpcyBjaGFubmVsIHVzZXMgOC1iaXQgc2FtcGxlcwkqLworI2RlZmluZSBDQ0NBX0NVUlJBRERSX01BU0sJMHgwMGZmZmZmZgkvKiBDdXJyZW50IGFkZHJlc3Mgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwJCSovCisjZGVmaW5lIENDQ0FfQ1VSUkFERFIJCTB4MTgwMDAwMDgKKworI2RlZmluZSBDQ1IJCQkweDA5CQkvKiBDYWNoZSBjb250cm9sIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENDUl9DQUNIRUlOVkFMSURTSVpFCTB4MDcxOTAwMDkKKyNkZWZpbmUgQ0NSX0NBQ0hFSU5WQUxJRFNJWkVfTUFTSwkweGZlMDAwMDAwCS8qIE51bWJlciBvZiBpbnZhbGlkIHNhbXBsZXMgY2FjaGUgZm9yIHRoaXMgY2hhbm5lbCAgICAJKi8KKyNkZWZpbmUgQ0NSX0NBQ0hFTE9PUEZMQUcJMHgwMTAwMDAwMAkvKiAxID0gQ2FjaGUgaGFzIGEgbG9vcCBzZXJ2aWNlIHBlbmRpbmcJCQkqLworI2RlZmluZSBDQ1JfSU5URVJMRUFWRURTQU1QTEVTCTB4MDA4MDAwMDAJLyogMSA9IEEgY2FjaGUgc2VydmljZSB3aWxsIGZldGNoIGludGVybGVhdmVkIHNhbXBsZXMJKi8KKyNkZWZpbmUgQ0NSX1dPUkRTSVpFRFNBTVBMRVMJMHgwMDQwMDAwMAkvKiAxID0gQSBjYWNoZSBzZXJ2aWNlIHdpbGwgZmV0Y2ggd29yZCBzaXplZCBzYW1wbGVzCSovCisjZGVmaW5lIENDUl9SRUFEQUREUkVTUwkJMHgwNjEwMDAwOQorI2RlZmluZSBDQ1JfUkVBREFERFJFU1NfTUFTSwkweDAwM2YwMDAwCS8qIExvY2F0aW9uIG9mIGNhY2hlIGp1c3QgYmV5b25kIGN1cnJlbnQgY2FjaGUgc2VydmljZQkqLworI2RlZmluZSBDQ1JfTE9PUElOVkFMU0laRQkweDAwMDBmZTAwCS8qIE51bWJlciBvZiBpbnZhbGlkIHNhbXBsZXMgaW4gY2FjaGUgcHJpb3IgdG8gbG9vcAkqLworCQkJCQkJLyogTk9URTogVGhpcyBpcyB2YWxpZCBvbmx5IGlmIENBQ0hFTE9PUEZMQUcgaXMgc2V0CSovCisjZGVmaW5lIENDUl9MT09QRkxBRwkJMHgwMDAwMDEwMAkvKiBTZXQgZm9yIGEgc2luZ2xlIHNhbXBsZSBwZXJpb2Qgd2hlbiBhIGxvb3Agb2NjdXJzCSovCisjZGVmaW5lIENDUl9DQUNIRUxPT1BBRERSSEkJMHgwMDAwMDBmZgkvKiBEU0xfTE9PUFNUQVJUQUREUidzIGhpIGJ5dGUgaWYgQ0FDSEVMT09QRkxBRyBpcyBzZXQJKi8KKworI2RlZmluZSBDTFAJCQkweDBhCQkvKiBDYWNoZSBsb29wIHJlZ2lzdGVyICh2YWxpZCBpZiBDQ1JfQ0FDSEVMT09QRkxBRyA9IDEpICovCisJCQkJCQkvKiBOT1RFOiBUaGlzIHJlZ2lzdGVyIGlzIG5vcm1hbGx5IG5vdCB1c2VkCQkqLworI2RlZmluZSBDTFBfQ0FDSEVMT09QQUREUgkweDAwMDBmZmZmCS8qIENhY2hlIGxvb3AgYWRkcmVzcyAoRFNMX0xPT1BTVEFSVEFERFIgWzAuLjE1XSkJKi8KKworI2RlZmluZSBGWFJUCQkJMHgwYgkJLyogRWZmZWN0cyBzZW5kIHJvdXRpbmcgcmVnaXN0ZXIJCQkqLworCQkJCQkJLyogTk9URTogSXQgaXMgaWxsZWdhbCB0byBhc3NpZ24gdGhlIHNhbWUgcm91dGluZyB0bwkqLworCQkJCQkJLyogdHdvIGVmZmVjdHMgc2VuZHMuCQkJCQkqLworI2RlZmluZSBGWFJUX0NIQU5ORUxBCQkweDAwMGYwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEEJKi8KKyNkZWZpbmUgRlhSVF9DSEFOTkVMQgkJMHgwMGYwMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBCCSovCisjZGVmaW5lIEZYUlRfQ0hBTk5FTEMJCTB4MGYwMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgQwkqLworI2RlZmluZSBGWFJUX0NIQU5ORUxECQkweGYwMDAwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEQJKi8KKworI2RlZmluZSBNQVBBCQkJMHgwYwkJLyogQ2FjaGUgbWFwIEEJCQkJCQkqLworCisjZGVmaW5lIE1BUEIJCQkweDBkCQkvKiBDYWNoZSBtYXAgQgkJCQkJCSovCisKKyNkZWZpbmUgTUFQX1BURV9NQVNLCQkweGZmZmZlMDAwCS8qIFRoZSAxOSBNU0JzIG9mIHRoZSBQVEUgaW5kZXhlZCBieSB0aGUgUFRJCQkqLworI2RlZmluZSBNQVBfUFRJX01BU0sJCTB4MDAwMDFmZmYJLyogVGhlIDEzIGJpdCBpbmRleCB0byBvbmUgb2YgdGhlIDgxOTIgUFRFIGR3b3JkcyAgICAgIAkqLworCisjZGVmaW5lIEVOVlZPTAkJCTB4MTAJCS8qIFZvbHVtZSBlbnZlbG9wZSByZWdpc3RlcgkJCQkqLworI2RlZmluZSBFTlZWT0xfTUFTSwkJMHgwMDAwZmZmZgkvKiBDdXJyZW50IHZhbHVlIG9mIHZvbHVtZSBlbnZlbG9wZSBzdGF0ZSB2YXJpYWJsZQkqLyAgCisJCQkJCQkvKiAweDgwMDAtbiA9PSA2NjYqbiB1c2VjIGRlbGF5CSAgICAgICAJCQkqLworCisjZGVmaW5lIEFUS0hMRFYgCQkweDExCQkvKiBWb2x1bWUgZW52ZWxvcGUgaG9sZCBhbmQgYXR0YWNrIHJlZ2lzdGVyCQkqLworI2RlZmluZSBBVEtITERWX1BIQVNFMAkJMHgwMDAwODAwMAkvKiAwID0gQmVnaW4gYXR0YWNrIHBoYXNlCQkJCSovCisjZGVmaW5lIEFUS0hMRFZfSE9MRFRJTUVfTUFTSwkweDAwMDA3ZjAwCS8qIEVudmVsb3BlIGhvbGQgdGltZSAoMTI3LW4gPT0gbio4OC4ybXNlYykJCSovCisjZGVmaW5lIEFUS0hMRFZfQVRUQUNLVElNRV9NQVNLCTB4MDAwMDAwN2YJLyogRW52ZWxvcGUgYXR0YWNrIHRpbWUsIGxvZyBlbmNvZGVkCQkJKi8KKwkJCQkJCS8qIDAgPSBpbmZpbml0ZSwgMSA9IDEwLjltc2VjLCAuLi4gMHg3ZiA9IDUuNW1zZWMJKi8KKworI2RlZmluZSBEQ1lTVVNWIAkJMHgxMgkJLyogVm9sdW1lIGVudmVsb3BlIHN1c3RhaW4gYW5kIGRlY2F5IHJlZ2lzdGVyCQkqLworI2RlZmluZSBEQ1lTVVNWX1BIQVNFMV9NQVNLCTB4MDAwMDgwMDAJLyogMCA9IEJlZ2luIGF0dGFjayBwaGFzZSwgMSA9IGJlZ2luIHJlbGVhc2UgcGhhc2UJKi8KKyNkZWZpbmUgRENZU1VTVl9TVVNUQUlOTEVWRUxfTUFTSyAweDAwMDA3ZjAwCS8qIDEyNyA9IGZ1bGwsIDAgPSBvZmYsIDAuNzVkQiBpbmNyZW1lbnRzCQkqLworI2RlZmluZSBEQ1lTVVNWX0NIQU5ORUxFTkFCTEVfTUFTSyAweDAwMDAwMDgwCS8qIDEgPSBJbmhpYml0IGVudmVsb3BlIGVuZ2luZSBmcm9tIHdyaXRpbmcgdmFsdWVzIGluCSovCisJCQkJCQkvKiB0aGlzIGNoYW5uZWwgYW5kIGZyb20gd3JpdGluZyB0byBwaXRjaCwgZmlsdGVyIGFuZAkqLworCQkJCQkJLyogdm9sdW1lIHRhcmdldHMuCQkJCQkqLworI2RlZmluZSBEQ1lTVVNWX0RFQ0FZVElNRV9NQVNLCTB4MDAwMDAwN2YJLyogVm9sdW1lIGVudmVsb3BlIGRlY2F5IHRpbWUsIGxvZyBlbmNvZGVkICAgICAJCSovCisJCQkJCQkvKiAwID0gNDMuN21zZWMsIDEgPSAyMS44bXNlYywgMHg3ZiA9IDIybXNlYwkJKi8KKworI2RlZmluZSBMRk9WQUwxIAkJMHgxMwkJLyogTW9kdWxhdGlvbiBMRk8gdmFsdWUJCQkJCSovCisjZGVmaW5lIExGT1ZBTF9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2YgbW9kdWxhdGlvbiBMRk8gc3RhdGUgdmFyaWFibGUJKi8KKwkJCQkJCS8qIDB4ODAwMC1uID09IDY2NipuIHVzZWMgZGVsYXkJCQkJKi8KKworI2RlZmluZSBFTlZWQUwJCQkweDE0CQkvKiBNb2R1bGF0aW9uIGVudmVsb3BlIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEVOVlZBTF9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2YgbW9kdWxhdGlvbiBlbnZlbG9wZSBzdGF0ZSB2YXJpYWJsZSAJKi8KKwkJCQkJCS8qIDB4ODAwMC1uID09IDY2NipuIHVzZWMgZGVsYXkJCQkJKi8KKworI2RlZmluZSBBVEtITERNCQkJMHgxNQkJLyogTW9kdWxhdGlvbiBlbnZlbG9wZSBob2xkIGFuZCBhdHRhY2sgcmVnaXN0ZXIJCSovCisjZGVmaW5lIEFUS0hMRE1fUEhBU0UwCQkweDAwMDA4MDAwCS8qIDAgPSBCZWdpbiBhdHRhY2sgcGhhc2UJCQkJKi8KKyNkZWZpbmUgQVRLSExETV9IT0xEVElNRQkweDAwMDA3ZjAwCS8qIEVudmVsb3BlIGhvbGQgdGltZSAoMTI3LW4gPT0gbio0Mm1zZWMpCQkqLworI2RlZmluZSBBVEtITERNX0FUVEFDS1RJTUUJMHgwMDAwMDA3ZgkvKiBFbnZlbG9wZSBhdHRhY2sgdGltZSwgbG9nIGVuY29kZWQJCQkqLworCQkJCQkJLyogMCA9IGluZmluaXRlLCAxID0gMTFtc2VjLCAuLi4gMHg3ZiA9IDUuNW1zZWMJCSovCisKKyNkZWZpbmUgRENZU1VTTQkJCTB4MTYJCS8qIE1vZHVsYXRpb24gZW52ZWxvcGUgZGVjYXkgYW5kIHN1c3RhaW4gcmVnaXN0ZXIJKi8KKyNkZWZpbmUgRENZU1VTTV9QSEFTRTFfTUFTSwkweDAwMDA4MDAwCS8qIDAgPSBCZWdpbiBhdHRhY2sgcGhhc2UsIDEgPSBiZWdpbiByZWxlYXNlIHBoYXNlCSovCisjZGVmaW5lIERDWVNVU01fU1VTVEFJTkxFVkVMX01BU0sgMHgwMDAwN2YwMAkvKiAxMjcgPSBmdWxsLCAwID0gb2ZmLCAwLjc1ZEIgaW5jcmVtZW50cwkJKi8KKyNkZWZpbmUgRENZU1VTTV9ERUNBWVRJTUVfTUFTSwkweDAwMDAwMDdmCS8qIEVudmVsb3BlIGRlY2F5IHRpbWUsIGxvZyBlbmNvZGVkCQkJKi8KKwkJCQkJCS8qIDAgPSA0My43bXNlYywgMSA9IDIxLjhtc2VjLCAweDdmID0gMjJtc2VjCQkqLworCisjZGVmaW5lIExGT1ZBTDIgCQkweDE3CQkvKiBWaWJyYXRvIExGTyByZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTEZPVkFMMl9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2YgdmlicmF0byBMRk8gc3RhdGUgdmFyaWFibGUgCQkqLworCQkJCQkJLyogMHg4MDAwLW4gPT0gNjY2Km4gdXNlYyBkZWxheQkJCQkqLworCisjZGVmaW5lIElQCQkJMHgxOAkJLyogSW5pdGlhbCBwaXRjaCByZWdpc3RlcgkJCQkqLworI2RlZmluZSBJUF9NQVNLCQkJMHgwMDAwZmZmZgkvKiBFeHBvbmVudGlhbCBpbml0aWFsIHBpdGNoIHNoaWZ0CQkJKi8KKwkJCQkJCS8qIDQgYml0cyBvZiBvY3RhdmUsIDEyIGJpdHMgb2YgZnJhY3Rpb25hbCBvY3RhdmUJKi8KKyNkZWZpbmUgSVBfVU5JVFkJCTB4MDAwMGUwMDAJLyogVW5pdHkgcGl0Y2ggc2hpZnQJCQkJCSovCisKKyNkZWZpbmUgSUZBVE4JCQkweDE5CQkvKiBJbml0aWFsIGZpbHRlciBjdXRvZmYgYW5kIGF0dGVudWF0aW9uIHJlZ2lzdGVyCSovCisjZGVmaW5lIElGQVROX0ZJTFRFUkNVVE9GRl9NQVNLCTB4MDAwMGZmMDAJLyogSW5pdGlhbCBmaWx0ZXIgY3V0b2ZmIGZyZXF1ZW5jeSBpbiBleHBvbmVudGlhbCB1bml0cwkqLworCQkJCQkJLyogNiBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXJlIHNlbWl0b25lcwkJKi8KKwkJCQkJCS8qIDIgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgZnJhY3Rpb25zCQkqLworI2RlZmluZSBJRkFUTl9GSUxURVJDVVRPRkYJMHgwODA4MDAxOQorI2RlZmluZSBJRkFUTl9BVFRFTlVBVElPTl9NQVNLCTB4MDAwMDAwZmYJLyogSW5pdGlhbCBhdHRlbnVhdGlvbiBpbiAwLjM3NWRCIHN0ZXBzCQkJKi8KKyNkZWZpbmUgSUZBVE5fQVRURU5VQVRJT04JMHgwODAwMDAxOQorCisKKyNkZWZpbmUgUEVGRQkJCTB4MWEJCS8qIFBpdGNoIGVudmVsb3BlIGFuZCBmaWx0ZXIgZW52ZWxvcGUgYW1vdW50IHJlZ2lzdGVyCSovCisjZGVmaW5lIFBFRkVfUElUQ0hBTU9VTlRfTUFTSwkweDAwMDBmZjAwCS8qIFBpdGNoIGVudmxvcGUgYW1vdW50CQkJCQkqLworCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gb25lIG9jdGF2ZSBwZWFrIGV4dHJlbWVzCSovCisjZGVmaW5lIFBFRkVfUElUQ0hBTU9VTlQJMHgwODA4MDAxYQorI2RlZmluZSBQRUZFX0ZJTFRFUkFNT1VOVF9NQVNLCTB4MDAwMDAwZmYJLyogRmlsdGVyIGVudmxvcGUgYW1vdW50CQkJCSovCisJCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsICsvLSBzaXggb2N0YXZlcyBwZWFrIGV4dHJlbWVzICovCisjZGVmaW5lIFBFRkVfRklMVEVSQU1PVU5UCTB4MDgwMDAwMWEKKyNkZWZpbmUgRk1NT0QJCQkweDFiCQkvKiBWaWJyYXRvL2ZpbHRlciBtb2R1bGF0aW9uIGZyb20gTEZPIHJlZ2lzdGVyCQkqLworI2RlZmluZSBGTU1PRF9NT0RWSUJSQVRPCTB4MDAwMGZmMDAJLyogVmlicmF0byBMRk8gbW9kdWxhdGlvbiBkZXB0aAkJCQkqLworCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gb25lIG9jdGF2ZSBleHRyZW1lcwkqLworI2RlZmluZSBGTU1PRF9NT0ZJTFRFUgkJMHgwMDAwMDBmZgkvKiBGaWx0ZXIgTEZPIG1vZHVsYXRpb24gZGVwdGgJCQkJKi8KKwkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgKy8tIHRocmVlIG9jdGF2ZSBleHRyZW1lcwkqLworCisKKyNkZWZpbmUgVFJFTUZSUSAJCTB4MWMJCS8qIFRyZW1vbG8gYW1vdW50IGFuZCBtb2R1bGF0aW9uIExGTyBmcmVxdWVuY3kgcmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFJFTUZSUV9ERVBUSAkJMHgwMDAwZmYwMAkvKiBUcmVtb2xvIGRlcHRoCQkJCQkqLworCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCB3aXRoICsvLSAxMmRCIGV4dHJlbWVzCSovCisjZGVmaW5lIFRSRU1GUlFfRlJFUVVFTkNZCTB4MDAwMDAwZmYJLyogVHJlbW9sbyBMRk8gZnJlcXVlbmN5CQkJCSovCisJCQkJCQkvKiA/P0h6IHN0ZXBzLCBtYXhpbXVtIG9mID8/IEh6LgkJCSovCisKKyNkZWZpbmUgRk0yRlJRMiAJCTB4MWQJCS8qIFZpYnJhdG8gYW1vdW50IGFuZCB2aWJyYXRvIExGTyBmcmVxdWVuY3kgcmVnaXN0ZXIJKi8KKyNkZWZpbmUgRk0yRlJRMl9ERVBUSAkJMHgwMDAwZmYwMAkvKiBWaWJyYXRvIExGTyB2aWJyYXRvIGRlcHRoCQkJCSovCisJCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsICsvLSBvbmUgb2N0YXZlIGV4dHJlbWVzCSovCisjZGVmaW5lIEZNMkZSUTJfRlJFUVVFTkNZCTB4MDAwMDAwZmYJLyogVmlicmF0byBMRk8gZnJlcXVlbmN5CQkJCSovCisJCQkJCQkvKiAwLjAzOUh6IHN0ZXBzLCBtYXhpbXVtIG9mIDkuODUgSHouCQkJKi8KKworI2RlZmluZSBURU1QRU5WIAkJMHgxZQkJLyogVGVtcG9yeSBlbnZlbG9wZSByZWdpc3RlcgkJCQkqLworI2RlZmluZSBURU1QRU5WX01BU0sJCTB4MDAwMGZmZmYJLyogMTYtYml0IHZhbHVlCQkJCQkJKi8KKwkJCQkJCS8qIE5PVEU6IEFsbCBjaGFubmVscyBjb250YWluIGludGVybmFsIHZhcmlhYmxlczsgZG8JKi8KKwkJCQkJCS8qIG5vdCB3cml0ZSB0byB0aGVzZSBsb2NhdGlvbnMuCQkJKi8KKworI2RlZmluZSBDRDAJCQkweDIwCQkvKiBDYWNoZSBkYXRhIDAgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQ0QxCQkJMHgyMQkJLyogQ2FjaGUgZGF0YSAxIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENEMgkJCTB4MjIJCS8qIENhY2hlIGRhdGEgMiByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDRDMJCQkweDIzCQkvKiBDYWNoZSBkYXRhIDMgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQ0Q0CQkJMHgyNAkJLyogQ2FjaGUgZGF0YSA0IHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENENQkJCTB4MjUJCS8qIENhY2hlIGRhdGEgNSByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDRDYJCQkweDI2CQkvKiBDYWNoZSBkYXRhIDYgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQ0Q3CQkJMHgyNwkJLyogQ2FjaGUgZGF0YSA3IHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENEOAkJCTB4MjgJCS8qIENhY2hlIGRhdGEgOCByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDRDkJCQkweDI5CQkvKiBDYWNoZSBkYXRhIDkgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQ0RBCQkJMHgyYQkJLyogQ2FjaGUgZGF0YSBBIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENEQgkJCTB4MmIJCS8qIENhY2hlIGRhdGEgQiByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDREMJCQkweDJjCQkvKiBDYWNoZSBkYXRhIEMgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQ0RECQkJMHgyZAkJLyogQ2FjaGUgZGF0YSBEIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENERQkJCTB4MmUJCS8qIENhY2hlIGRhdGEgRSByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDREYJCQkweDJmCQkvKiBDYWNoZSBkYXRhIEYgcmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBQVEIJCQkweDQwCQkvKiBQYWdlIHRhYmxlIGJhc2UgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUFRCX01BU0sJCTB4ZmZmZmYwMDAJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFnZSB0YWJsZSBpbiBob3N0IG1lbW9yeQkqLworCisjZGVmaW5lIFRDQgkJCTB4NDEJCS8qIFRhbmsgY2FjaGUgYmFzZSByZWdpc3RlciAgICAJCQkJKi8KKyNkZWZpbmUgVENCX01BU0sJCTB4ZmZmZmYwMDAJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYm90dG9tIG9mIGhvc3QgYmFzZWQgVFJBTQkqLworCisjZGVmaW5lIEFEQ0NSCQkJMHg0MgkJLyogQURDIHNhbXBsZSByYXRlL3N0ZXJlbyBjb250cm9sIHJlZ2lzdGVyCQkqLworI2RlZmluZSBBRENDUl9SQ0hBTkVOQUJMRQkweDAwMDAwMDEwCS8qIEVuYWJsZXMgcmlnaHQgY2hhbm5lbCBmb3Igd3JpdGluZyB0byB0aGUgaG9zdCAgICAgICAJKi8KKyNkZWZpbmUgQURDQ1JfTENIQU5FTkFCTEUJMHgwMDAwMDAwOAkvKiBFbmFibGVzIGxlZnQgY2hhbm5lbCBmb3Igd3JpdGluZyB0byB0aGUgaG9zdAkJKi8KKwkJCQkJCS8qIE5PVEU6IFRvIGd1YXJhbnRlZSBwaGFzZSBjb2hlcmVuY3ksIGJvdGggY2hhbm5lbHMJKi8KKwkJCQkJCS8qIG11c3QgYmUgZGlzYWJsZWQgcHJpb3IgdG8gZW5hYmxpbmcgYm90aCBjaGFubmVscy4JKi8KKyNkZWZpbmUgQV9BRENDUl9SQ0hBTkVOQUJMRQkweDAwMDAwMDIwCisjZGVmaW5lIEFfQURDQ1JfTENIQU5FTkFCTEUJMHgwMDAwMDAxMAorCisjZGVmaW5lIEFfQURDQ1JfU0FNUExFUkFURV9NQVNLIDB4MDAwMDAwMEYgICAgICAvKiBBdWRpZ3kgc2FtcGxlIHJhdGUgY29udmVydG9yIG91dHB1dCByYXRlCQkqLworI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFX01BU0sJMHgwMDAwMDAwNwkvKiBTYW1wbGUgcmF0ZSBjb252ZXJ0b3Igb3V0cHV0IHJhdGUJCQkqLworCisjZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfNDgJMHgwMDAwMDAwMAkvKiA0OGtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KKyNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV80NAkweDAwMDAwMDAxCS8qIDQ0LjFrSHogc2FtcGxlIHJhdGUJCQkJCSovCisjZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMzIJMHgwMDAwMDAwMgkvKiAzMmtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KKyNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV8yNAkweDAwMDAwMDAzCS8qIDI0a0h6IHNhbXBsZSByYXRlCQkJCQkqLworI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzIyCTB4MDAwMDAwMDQJLyogMjIuMDVrSHogc2FtcGxlIHJhdGUJCQkJCSovCisjZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMTYJMHgwMDAwMDAwNQkvKiAxNmtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KKyNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV8xMQkweDAwMDAwMDA2CS8qIDExLjAyNWtIeiBzYW1wbGUgcmF0ZQkJCQkqLworI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzgJMHgwMDAwMDAwNwkvKiA4a0h6IHNhbXBsZSByYXRlCQkJCQkqLworCisjZGVmaW5lIEFfQURDQ1JfU0FNUExFUkFURV8xMgkweDAwMDAwMDA2CS8qIDEya0h6IHNhbXBsZSByYXRlCQkJCQkqLworI2RlZmluZSBBX0FEQ0NSX1NBTVBMRVJBVEVfMTEJMHgwMDAwMDAwNwkvKiAxMS4wMjVrSHogc2FtcGxlIHJhdGUJCQkJKi8KKyNkZWZpbmUgQV9BRENDUl9TQU1QTEVSQVRFXzgJMHgwMDAwMDAwOAkvKiA4a0h6IHNhbXBsZSByYXRlCQkJCQkqLworCisjZGVmaW5lIEZYV0MJCQkweDQzCQkvKiBGWCBvdXRwdXQgd3JpdGUgY2hhbm5lbHMgcmVnaXN0ZXIJCQkqLworCQkJCQkJLyogV2hlbiBzZXQsIGVhY2ggYml0IGVuYWJsZXMgdGhlIHdyaXRpbmcgb2YgdGhlCSovCisJCQkJCQkvKiBjb3JyZXNwb25kaW5nIEZYIG91dHB1dCBjaGFubmVsIChpbnRlcm5hbCByZWdpc3RlcnMgICovCisJCQkJCQkvKiAweDIwLTB4M2YpIGludG8gaG9zdCBtZW1vcnkuIFRoaXMgbW9kZSBvZiByZWNvcmRpbmcJKi8KKwkJCQkJCS8qIGlzIDE2Yml0LCA0OEtIeiBvbmx5LiBBbGwgMzIJY2hhbm5lbHMgY2FuIGJlIGVuYWJsZWQgKi8KKwkJCQkJCS8qIHNpbXVsdGFuZW91c2x5LgkJCQkJKi8KKyNkZWZpbmUgVENCUwkJCTB4NDQJCS8qIFRhbmsgY2FjaGUgYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkqLworI2RlZmluZSBUQ0JTX01BU0sJCTB4MDAwMDAwMDcJLyogVGFuayBjYWNoZSBidWZmZXIgc2l6ZSBmaWVsZAkJCQkqLworI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzE2SwkweDAwMDAwMDAwCisjZGVmaW5lIFRDQlNfQlVGRlNJWkVfMzJLCTB4MDAwMDAwMDEKKyNkZWZpbmUgVENCU19CVUZGU0laRV82NEsJMHgwMDAwMDAwMgorI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzEyOEsJMHgwMDAwMDAwMworI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzI1NksJMHgwMDAwMDAwNAorI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzUxMksJMHgwMDAwMDAwNQorI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzEwMjRLCTB4MDAwMDAwMDYKKyNkZWZpbmUgVENCU19CVUZGU0laRV8yMDQ4SwkweDAwMDAwMDA3CisKKyNkZWZpbmUgTUlDQkEJCQkweDQ1CQkvKiBBQzk3IG1pY3JvcGhvbmUgYnVmZmVyIGFkZHJlc3MgcmVnaXN0ZXIJCSovCisjZGVmaW5lIE1JQ0JBX01BU0sJCTB4ZmZmZmYwMDAJLyogMjAgYml0IGJhc2UgYWRkcmVzcwkJCQkJKi8KKworI2RlZmluZSBBRENCQQkJCTB4NDYJCS8qIEFEQyBidWZmZXIgYWRkcmVzcyByZWdpc3RlcgkJCQkqLworI2RlZmluZSBBRENCQV9NQVNLCQkweGZmZmZmMDAwCS8qIDIwIGJpdCBiYXNlIGFkZHJlc3MJCQkJCSovCisKKyNkZWZpbmUgRlhCQQkJCTB4NDcJCS8qIEZYIEJ1ZmZlciBBZGRyZXNzICovCisjZGVmaW5lIEZYQkFfTUFTSwkJMHhmZmZmZjAwMAkvKiAyMCBiaXQgYmFzZSBhZGRyZXNzCQkJCQkqLworCisjZGVmaW5lIE1JQ0JTCQkJMHg0OQkJLyogTWljcm9waG9uZSBidWZmZXIgc2l6ZSByZWdpc3RlcgkJCSovCisKKyNkZWZpbmUgQURDQlMJCQkweDRhCQkvKiBBREMgYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBGWEJTCQkJMHg0YgkJLyogRlggYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkJKi8KKworLyogVGhlIGZvbGxvd2luZyBtYXNrIHZhbHVlcyBkZWZpbmUgdGhlIHNpemUgb2YgdGhlIEFEQywgTUlYIGFuZCBGWCBidWZmZXJzIGluIGJ5dGVzICovCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfTk9ORQkweDAwMDAwMDAwCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMzg0CTB4MDAwMDAwMDEKKyNkZWZpbmUgQURDQlNfQlVGU0laRV80NDgJMHgwMDAwMDAwMgorI2RlZmluZSBBRENCU19CVUZTSVpFXzUxMgkweDAwMDAwMDAzCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNjQwCTB4MDAwMDAwMDQKKyNkZWZpbmUgQURDQlNfQlVGU0laRV83NjgJMHgwMDAwMDAwNQorI2RlZmluZSBBRENCU19CVUZTSVpFXzg5NgkweDAwMDAwMDA2CisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTAyNAkweDAwMDAwMDA3CisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTI4MAkweDAwMDAwMDA4CisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTUzNgkweDAwMDAwMDA5CisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTc5MgkweDAwMDAwMDBhCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjA0OAkweDAwMDAwMDBiCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjU2MAkweDAwMDAwMDBjCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMzA3MgkweDAwMDAwMDBkCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMzU4NAkweDAwMDAwMDBlCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNDA5NgkweDAwMDAwMDBmCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNTEyMAkweDAwMDAwMDEwCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNjE0NAkweDAwMDAwMDExCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNzE2OAkweDAwMDAwMDEyCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfODE5MgkweDAwMDAwMDEzCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTAyNDAJMHgwMDAwMDAxNAorI2RlZmluZSBBRENCU19CVUZTSVpFXzEyMjg4CTB4MDAwMDAwMTUKKyNkZWZpbmUgQURDQlNfQlVGU0laRV8xNDM2NgkweDAwMDAwMDE2CisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTYzODQJMHgwMDAwMDAxNworI2RlZmluZSBBRENCU19CVUZTSVpFXzIwNDgwCTB4MDAwMDAwMTgKKyNkZWZpbmUgQURDQlNfQlVGU0laRV8yNDU3NgkweDAwMDAwMDE5CisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjg2NzIJMHgwMDAwMDAxYQorI2RlZmluZSBBRENCU19CVUZTSVpFXzMyNzY4CTB4MDAwMDAwMWIKKyNkZWZpbmUgQURDQlNfQlVGU0laRV80MDk2MAkweDAwMDAwMDFjCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNDkxNTIJMHgwMDAwMDAxZAorI2RlZmluZSBBRENCU19CVUZTSVpFXzU3MzQ0CTB4MDAwMDAwMWUKKyNkZWZpbmUgQURDQlNfQlVGU0laRV82NTUzNgkweDAwMDAwMDFmCisKKworI2RlZmluZSBDRENTCQkJMHg1MAkJLyogQ0QtUk9NIGRpZ2l0YWwgY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXIJKi8KKworI2RlZmluZSBHUFNDUwkJCTB4NTEJCS8qIEdlbmVyYWwgUHVycG9zZSBTUERJRiBjaGFubmVsIHN0YXR1cyByZWdpc3RlciovCisKKyNkZWZpbmUgREJHCQkJMHg1MgkJLyogRE8gTk9UIFBST0dSQU0gVEhJUyBSRUdJU1RFUiEhISBNQVkgREVTVFJPWSBDSElQICovCisKKy8qIGRlZmluaXRpb25zIGZvciBkZWJ1ZyByZWdpc3RlciAtIHRha2VuIGZyb20gdGhlIGFsc2EgZHJpdmVycyAqLworI2RlZmluZSBEQkdfWkMgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwICAgICAgLyogemVybyB0cmFtIGNvdW50ZXIgKi8KKyNkZWZpbmUgREJHX1NBVFVSQVRJT05fT0NDVVJFRCAgMHgwMjAwMDAwMCAgICAgIC8qIHNhdHVyYXRpb24gY29udHJvbCAqLworI2RlZmluZSBEQkdfU0FUVVJBVElPTl9BRERSICAgICAweDAxZmYwMDAwICAgICAgLyogc2F0dXJhdGlvbiBhZGRyZXNzICovCisjZGVmaW5lIERCR19TSU5HTEVfU1RFUCAgICAgICAgIDB4MDAwMDgwMDAgICAgICAvKiBzaW5nbGUgc3RlcCBtb2RlICovCisjZGVmaW5lIERCR19TVEVQICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgICAgICAvKiBzdGFydCBzaW5nbGUgc3RlcCAqLworI2RlZmluZSBEQkdfQ09ORElUSU9OX0NPREUgICAgICAweDAwMDAzZTAwICAgICAgLyogY29uZGl0aW9uIGNvZGUgKi8KKyNkZWZpbmUgREJHX1NJTkdMRV9TVEVQX0FERFIgICAgMHgwMDAwMDFmZiAgICAgIC8qIHNpbmdsZSBzdGVwIGFkZHJlc3MgKi8KKworCisjZGVmaW5lIFJFRzUzCQkJMHg1MwkJLyogRE8gTk9UIFBST0dSQU0gVEhJUyBSRUdJU1RFUiEhISBNQVkgREVTVFJPWSBDSElQICovCisKKyNkZWZpbmUgQV9EQkcJCQkgMHg1MworI2RlZmluZSBBX0RCR19TSU5HTEVfU1RFUAkgMHgwMDAyMDAwMAkvKiBTZXQgdG8gemVybyB0byBzdGFydCBkc3AgKi8KKyNkZWZpbmUgQV9EQkdfWkMJCSAweDQwMDAwMDAwCS8qIHplcm8gdHJhbSBjb3VudGVyICovCisjZGVmaW5lIEFfREJHX1NURVBfQUREUgkJIDB4MDAwMDAzZmYKKyNkZWZpbmUgQV9EQkdfU0FUVVJBVElPTl9PQ0NVUkVEIDB4MjAwMDAwMDAKKyNkZWZpbmUgQV9EQkdfU0FUVVJBVElPTl9BRERSCSAweDBmZmMwMDAwCisKKyNkZWZpbmUgU1BDUzAJCQkweDU0CQkvKiBTUERJRiBvdXRwdXQgQ2hhbm5lbCBTdGF0dXMgMCByZWdpc3RlcgkqLworCisjZGVmaW5lIFNQQ1MxCQkJMHg1NQkJLyogU1BESUYgb3V0cHV0IENoYW5uZWwgU3RhdHVzIDEgcmVnaXN0ZXIJKi8KKworI2RlZmluZSBTUENTMgkJCTB4NTYJCS8qIFNQRElGIG91dHB1dCBDaGFubmVsIFN0YXR1cyAyIHJlZ2lzdGVyCSovCisKKyNkZWZpbmUgU1BDU19DTEtBQ0NZTUFTSwkweDMwMDAwMDAwCS8qIENsb2NrIGFjY3VyYWN5CQkJCSovCisjZGVmaW5lIFNQQ1NfQ0xLQUNDWV8xMDAwUFBNCTB4MDAwMDAwMDAJLyogMTAwMCBwYXJ0cyBwZXIgbWlsbGlvbgkJCSovCisjZGVmaW5lIFNQQ1NfQ0xLQUNDWV81MFBQTQkweDEwMDAwMDAwCS8qIDUwIHBhcnRzIHBlciBtaWxsaW9uCQkJCSovCisjZGVmaW5lIFNQQ1NfQ0xLQUNDWV9WQVJJQUJMRQkweDIwMDAwMDAwCS8qIFZhcmlhYmxlIGFjY3VyYWN5CQkJCSovCisjZGVmaW5lIFNQQ1NfU0FNUExFUkFURU1BU0sJMHgwZjAwMDAwMAkvKiBTYW1wbGUgcmF0ZQkJCQkJKi8KKyNkZWZpbmUgU1BDU19TQU1QTEVSQVRFXzQ0CTB4MDAwMDAwMDAJLyogNDQuMWtIeiBzYW1wbGUgcmF0ZQkJCQkqLworI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfNDgJMHgwMjAwMDAwMAkvKiA0OGtIeiBzYW1wbGUgcmF0ZQkJCQkqLworI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfMzIJMHgwMzAwMDAwMAkvKiAzMmtIeiBzYW1wbGUgcmF0ZQkJCQkqLworI2RlZmluZSBTUENTX0NIQU5ORUxOVU1NQVNLCTB4MDBmMDAwMDAJLyogQ2hhbm5lbCBudW1iZXIJCQkJKi8KKyNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX1VOU1BFQwkweDAwMDAwMDAwCS8qIFVuc3BlY2lmaWVkIGNoYW5uZWwgbnVtYmVyCQkJKi8KKyNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX0xFRlQJMHgwMDEwMDAwMAkvKiBMZWZ0IGNoYW5uZWwJCQkJCSovCisjZGVmaW5lIFNQQ1NfQ0hBTk5FTE5VTV9SSUdIVAkweDAwMjAwMDAwCS8qIFJpZ2h0IGNoYW5uZWwJCQkJKi8KKyNkZWZpbmUgU1BDU19TT1VSQ0VOVU1NQVNLCTB4MDAwZjAwMDAJLyogU291cmNlIG51bWJlcgkJCQkqLworI2RlZmluZSBTUENTX1NPVVJDRU5VTV9VTlNQRUMJMHgwMDAwMDAwMAkvKiBVbnNwZWNpZmllZCBzb3VyY2UgbnVtYmVyCQkJKi8KKyNkZWZpbmUgU1BDU19HRU5FUkFUSU9OU1RBVFVTCTB4MDAwMDgwMDAJLyogT3JpZ2luYWxpdHkgZmxhZyAoc2VlIElFQy05NTggc3BlYykJCSovCisjZGVmaW5lIFNQQ1NfQ0FURUdPUllDT0RFTUFTSwkweDAwMDA3ZjAwCS8qIENhdGVnb3J5IGNvZGUgKHNlZSBJRUMtOTU4IHNwZWMpCQkqLworI2RlZmluZSBTUENTX01PREVNQVNLCQkweDAwMDAwMGMwCS8qIE1vZGUgKHNlZSBJRUMtOTU4IHNwZWMpCQkJKi8KKyNkZWZpbmUgU1BDU19FTVBIQVNJU01BU0sJMHgwMDAwMDAzOAkvKiBFbXBoYXNpcwkJCQkJKi8KKyNkZWZpbmUgU1BDU19FTVBIQVNJU19OT05FCTB4MDAwMDAwMDAJLyogTm8gZW1waGFzaXMJCQkJCSovCisjZGVmaW5lIFNQQ1NfRU1QSEFTSVNfNTBfMTUJMHgwMDAwMDAwOAkvKiA1MC8xNSB1c2VjIDIgY2hhbm5lbAkJCQkqLworI2RlZmluZSBTUENTX0NPUFlSSUdIVAkJMHgwMDAwMDAwNAkvKiBDb3B5cmlnaHQgYXNzZXJ0ZWQgZmxhZyAtLSBkbyBub3QgbW9kaWZ5CSovCisjZGVmaW5lIFNQQ1NfTk9UQVVESU9EQVRBCTB4MDAwMDAwMDIJLyogMCA9IERpZ2l0YWwgYXVkaW8sIDEgPSBub3QgYXVkaW8JCSovCisjZGVmaW5lIFNQQ1NfUFJPRkVTU0lPTkFMCTB4MDAwMDAwMDEJLyogMCA9IENvbnN1bWVyIChJRUMtOTU4KSwgMSA9IHBybyAoQUVTMy0xOTkyKQkqLworCisvKiBUaGUgMzItYml0IENMSXggYW5kIFNPTHggcmVnaXN0ZXJzIGFsbCBoYXZlIG9uZSBiaXQgcGVyIGNoYW5uZWwgY29udHJvbC9zdGF0dXMgICAgICAJCSovCisjZGVmaW5lIENMSUVMCQkJMHg1OAkJLyogQ2hhbm5lbCBsb29wIGludGVycnVwdCBlbmFibGUgbG93IHJlZ2lzdGVyCSovCisKKyNkZWZpbmUgQ0xJRUgJCQkweDU5CQkvKiBDaGFubmVsIGxvb3AgaW50ZXJydXB0IGVuYWJsZSBoaWdoIHJlZ2lzdGVyCSovCisKKyNkZWZpbmUgQ0xJUEwJCQkweDVhCQkvKiBDaGFubmVsIGxvb3AgaW50ZXJydXB0IHBlbmRpbmcgbG93IHJlZ2lzdGVyCSovCisKKyNkZWZpbmUgQ0xJUEgJCQkweDViCQkvKiBDaGFubmVsIGxvb3AgaW50ZXJydXB0IHBlbmRpbmcgaGlnaCByZWdpc3RlcgkqLworCisjZGVmaW5lIFNPTEVMCQkJMHg1YwkJLyogU3RvcCBvbiBsb29wIGVuYWJsZSBsb3cgcmVnaXN0ZXIJCSovCisKKyNkZWZpbmUgU09MRUgJCQkweDVkCQkvKiBTdG9wIG9uIGxvb3AgZW5hYmxlIGhpZ2ggcmVnaXN0ZXIJCSovCisKKyNkZWZpbmUgU1BCWVBBU1MJCTB4NWUJCS8qIFNQRElGIEJZUEFTUyBtb2RlIHJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BCWVBBU1NfRU5BQkxFCQkweDAwMDAwMDAxCS8qIEVuYWJsZSBTUERJRiBieXBhc3MgbW9kZQkJCSovCisKKyNkZWZpbmUgQUM5N1NMT1QJCTB4NWYJCS8qIGFkZGl0aW9uYWwgQUM5NyBzbG90cyBlbmFibGUgYml0cyAqLworI2RlZmluZSBBQzk3U0xPVF9DTlRSCQkweDEwCQkvKiBDZW50ZXIgZW5hYmxlICovCisjZGVmaW5lIEFDOTdTTE9UX0xGRQkJMHgyMAkJLyogTEZFIGVuYWJsZSAqLworCisjZGVmaW5lIENEU1JDUwkJCTB4NjAJCS8qIENELVJPTSBTYW1wbGUgUmF0ZSBDb252ZXJ0ZXIgc3RhdHVzIHJlZ2lzdGVyCSovCisKKyNkZWZpbmUgR1BTUkNTCQkJMHg2MQkJLyogR2VuZXJhbCBQdXJwb3NlIFNQRElGIHNhbXBsZSByYXRlIGN2dCBzdGF0dXMgKi8KKworI2RlZmluZSBaVlNSQ1MJCQkweDYyCQkvKiBaVmlkZW8gc2FtcGxlIHJhdGUgY29udmVydGVyIHN0YXR1cwkJKi8KKwkJCQkJCS8qIE5PVEU6IFRoaXMgb25lIGhhcyBubyBTUERJRkxPQ0tFRCBmaWVsZAkqLworCQkJCQkJLyogQXNzdW1lcyBzYW1wbGUgbG9jawkJCQkqLworCisvKiBUaGVzZSB0aHJlZSBiaXRmaWVsZHMgYXBwbHkgdG8gQ0RTUkNTLCBHUFNSQ1MsIGFuZCAoZXhjZXB0IGFzIG5vdGVkKSBaVlNSQ1MuCQkJKi8KKyNkZWZpbmUgU1JDU19TUERJRkxPQ0tFRAkweDAyMDAwMDAwCS8qIFNQRElGIHN0cmVhbSBsb2NrZWQJCQkJKi8KKyNkZWZpbmUgU1JDU19SQVRFTE9DS0VECQkweDAxMDAwMDAwCS8qIFNhbXBsZSByYXRlIGxvY2tlZAkJCQkqLworI2RlZmluZSBTUkNTX0VTVFNBTVBMRVJBVEUJMHgwMDA3ZmZmZgkvKiBEbyBub3QgbW9kaWZ5IHRoaXMgZmllbGQuCQkJKi8KKworCisvKiBOb3RlIHRoYXQgdGhlc2UgdmFsdWVzIGNhbiB2YXJ5ICsvLSBieSBhIHNtYWxsIGFtb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTUkNTX1NQRElGUkFURV80NAkweDAwMDNhY2Q5CisjZGVmaW5lIFNSQ1NfU1BESUZSQVRFXzQ4CTB4MDAwNDAwMDAKKyNkZWZpbmUgU1JDU19TUERJRlJBVEVfOTYJMHgwMDA4MDAwMAorCisjZGVmaW5lIE1JQ0lEWCAgICAgICAgICAgICAgICAgIDB4NjMgICAgICAgICAgICAvKiBNaWNyb3Bob25lIHJlY29yZGluZyBidWZmZXIgaW5kZXggcmVnaXN0ZXIgICAqLworI2RlZmluZSBNSUNJRFhfTUFTSyAgICAgICAgICAgICAweDAwMDBmZmZmICAgICAgLyogMTYtYml0IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlDSURYX0lEWAkJMHgxMDAwMDA2MworCisjZGVmaW5lIEFfQURDSURYCQkweDYzCisjZGVmaW5lIEFfQURDSURYX0lEWAkJMHgxMDAwMDA2MworCisjZGVmaW5lIEFEQ0lEWAkJCTB4NjQJCS8qIEFEQyByZWNvcmRpbmcgYnVmZmVyIGluZGV4IHJlZ2lzdGVyCQkqLworI2RlZmluZSBBRENJRFhfTUFTSwkJMHgwMDAwZmZmZgkvKiAxNiBiaXQgaW5kZXggZmllbGQJCQkJKi8KKyNkZWZpbmUgQURDSURYX0lEWAkJMHgxMDAwMDA2NAorCisjZGVmaW5lIEZYSURYCQkJMHg2NQkJLyogRlggcmVjb3JkaW5nIGJ1ZmZlciBpbmRleCByZWdpc3RlcgkJKi8KKyNkZWZpbmUgRlhJRFhfTUFTSwkJMHgwMDAwZmZmZgkvKiAxNi1iaXQgdmFsdWUJCQkJCSovCisjZGVmaW5lIEZYSURYX0lEWAkJMHgxMDAwMDA2NQorCisvKiBUaGlzIGlzIHRoZSBNUFUgcG9ydCBvbiB0aGUgY2FyZCAodmlhIHRoZSBnYW1lIHBvcnQpCQkJCQkJKi8KKyNkZWZpbmUgQV9NVURBVEExCQkweDcwCisjZGVmaW5lIEFfTVVDTUQxCQkweDcxCisjZGVmaW5lIEFfTVVTVEFUMQkJQV9NVUNNRDEKKworLyogVGhpcyBpcyB0aGUgTVBVIHBvcnQgb24gdGhlIEF1ZGlneSBEcml2ZSAJCQkJCQkJKi8KKyNkZWZpbmUgQV9NVURBVEEyCQkweDcyCisjZGVmaW5lIEFfTVVDTUQyCQkweDczCisjZGVmaW5lIEFfTVVTVEFUMgkJQV9NVUNNRDIJCisKKy8qIFRoZSBuZXh0IHR3byBhcmUgdGhlIEF1ZGlneSBlcXVpdmFsZW50IG9mIEZYV0MJCQkJCQkqLworLyogdGhlIEF1ZGlneSBjYW4gcmVjb3JkIGFueSBvdXRwdXQgKDE2Yml0LCA0OGtIeiwgdXAgdG8gNjQgY2hhbm5lbCBzaW11bHRhbmVvdXNseSkgCQkqLworLyogRWFjaCBiaXQgc2VsZWN0cyBhIGNoYW5uZWwgZm9yIHJlY29yZGluZyAqLworI2RlZmluZSBBX0ZYV0MxCQkJMHg3NCAgICAgICAgICAgIC8qIFNlbGVjdHMgMHg3Zi0weDYwIGZvciBGWCByZWNvcmRpbmcgICAgICAgICAgICovCisjZGVmaW5lIEFfRlhXQzIJCQkweDc1CQkvKiBTZWxlY3RzIDB4OWYtMHg4MCBmb3IgRlggcmVjb3JkaW5nICAgICAgICAgICAqLworCisjZGVmaW5lIEFfU1BESUZfU0FNUExFUkFURQkweDc2CQkvKiBTZXQgdGhlIHNhbXBsZSByYXRlIG9mIFNQRElGIG91dHB1dAkJKi8KKyNkZWZpbmUgQV9TUERJRl80ODAwMAkJMHgwMDAwMDA4MAorI2RlZmluZSBBX1NQRElGXzQ0MTAwCQkweDAwMDAwMDAwCisjZGVmaW5lIEFfU1BESUZfOTYwMDAJCTB4MDAwMDAwNDAKKworI2RlZmluZSBBX0ZYUlQyCQkJMHg3YworI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEUJCTB4MDAwMDAwM2YJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRQkqLworI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEYJCTB4MDAwMDNmMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRgkqLworI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEcJCTB4MDAzZjAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRwkqLworI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEgJCTB4M2YwMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgSAkqLworCisjZGVmaW5lIEFfU0VOREFNT1VOVFMJCTB4N2QKKyNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfRV9NQVNLCTB4ZmYwMDAwMDAKKyNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfRl9NQVNLCTB4MDBmZjAwMDAKKyNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfR19NQVNLCTB4MDAwMGZmMDAKKyNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfSF9NQVNLCTB4MDAwMDAwZmYKKworLyogVGhlIHNlbmQgYW1vdW50cyBmb3IgdGhpcyBvbmUgYXJlIHRoZSBzYW1lIGFzIHVzZWQgd2l0aCB0aGUgZW11MTBrMSAqLworI2RlZmluZSBBX0ZYUlQxCQkJMHg3ZQorI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEEJCTB4MDAwMDAwM2YKKyNkZWZpbmUgQV9GWFJUX0NIQU5ORUxCCQkweDAwMDAzZjAwCisjZGVmaW5lIEFfRlhSVF9DSEFOTkVMQwkJMHgwMDNmMDAwMAorI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEQJCTB4M2YwMDAwMDAKKworCisvKiBFYWNoIEZYIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpcyAzMiBiaXRzIGluIGxlbmd0aCwgYWxsIGJpdHMgYXJlIHVzZWQJCQkqLworI2RlZmluZSBGWEdQUkVHQkFTRQkJMHgxMDAJCS8qIEZYIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgYmFzZSAgICAgICAJKi8KKyNkZWZpbmUgQV9GWEdQUkVHQkFTRQkJMHg0MDAJCS8qIEF1ZGlneSBHUFJzLCAweDQwMCB0byAweDVmZgkJCSovCisvKiBUYW5rIGF1ZGlvIGRhdGEgaXMgbG9nYXJpdGhtaWNhbGx5IGNvbXByZXNzZWQgZG93biB0byAxNiBiaXRzIGJlZm9yZSB3cml0aW5nIHRvIFRSQU0gYW5kIGlzCSovCisvKiBkZWNvbXByZXNzZWQgYmFjayB0byAyMCBiaXRzIG9uIGEgcmVhZC4gIFRoZXJlIGFyZSBhIHRvdGFsIG9mIDE2MCBsb2NhdGlvbnMsIHRoZSBsYXN0IDMyCSovCisvKiBsb2NhdGlvbnMgYXJlIGZvciBleHRlcm5hbCBUUkFNLiAJCQkJCQkJCSovCisjZGVmaW5lIFRBTktNRU1EQVRBUkVHQkFTRQkweDIwMAkJLyogVGFuayBtZW1vcnkgZGF0YSByZWdpc3RlcnMgYmFzZSAgICAgCQkqLworI2RlZmluZSBUQU5LTUVNREFUQVJFR19NQVNLCTB4MDAwZmZmZmYJLyogMjAgYml0IHRhbmsgYXVkaW8gZGF0YSBmaWVsZAkJCSovCisKKy8qIENvbWJpbmVkIGFkZHJlc3MgZmllbGQgYW5kIG1lbW9yeSBvcGNvZGUgb3IgZmxhZyBmaWVsZC4gIDE2MCBsb2NhdGlvbnMsIGxhc3QgMzIgYXJlIGV4dGVybmFsCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHQkFTRQkweDMwMAkJLyogVGFuayBtZW1vcnkgYWRkcmVzcyByZWdpc3RlcnMgYmFzZQkJKi8KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfQUREUl9NQVNLIDB4MDAwZmZmZmYJLyogMjAgYml0IHRhbmsgYWRkcmVzcyBmaWVsZAkJCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX0NMRUFSCTB4MDA4MDAwMDAJLyogQ2xlYXIgdGFuayBtZW1vcnkJCQkJKi8KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfQUxJR04JMHgwMDQwMDAwMAkvKiBBbGlnbiByZWFkIG9yIHdyaXRlIHJlbGF0aXZlIHRvIHRhbmsgYWNjZXNzCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX1dSSVRFCTB4MDAyMDAwMDAJLyogV3JpdGUgdG8gdGFuayBtZW1vcnkJCQkJKi8KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfUkVBRAkweDAwMTAwMDAwCS8qIFJlYWQgZnJvbSB0YW5rIG1lbW9yeQkJCSovCisKKyNkZWZpbmUgTUlDUk9DT0RFQkFTRQkJMHg0MDAJCS8qIE1pY3JvY29kZSBkYXRhIGJhc2UgYWRkcmVzcwkJCSovCisKKy8qIEVhY2ggRFNQIG1pY3JvY29kZSBpbnN0cnVjdGlvbiBpcyBtYXBwZWQgaW50byAyIGRvdWJsZXdvcmRzIAkJCQkJKi8KKy8qIE5PVEU6IFdoZW4gd3JpdGluZywgYWx3YXlzIHdyaXRlIHRoZSBMTyBkb3VibGV3b3JkIGZpcnN0LiAgUmVhZHMgY2FuIGJlIGluIGVpdGhlciBvcmRlci4JKi8KKyNkZWZpbmUgTE9XT1JEX09QWF9NQVNLCQkweDAwMGZmYzAwCS8qIEluc3RydWN0aW9uIG9wZXJhbmQgWAkJCSovCisjZGVmaW5lIExPV09SRF9PUFlfTUFTSwkJMHgwMDAwMDNmZgkvKiBJbnN0cnVjdGlvbiBvcGVyYW5kIFkJCQkqLworI2RlZmluZSBISVdPUkRfT1BDT0RFX01BU0sJMHgwMGYwMDAwMAkvKiBJbnN0cnVjdGlvbiBvcGNvZGUJCQkJKi8KKyNkZWZpbmUgSElXT1JEX1JFU1VMVF9NQVNLCTB4MDAwZmZjMDAJLyogSW5zdHJ1Y3Rpb24gcmVzdWx0CQkJCSovCisjZGVmaW5lIEhJV09SRF9PUEFfTUFTSwkJMHgwMDAwMDNmZgkvKiBJbnN0cnVjdGlvbiBvcGVyYW5kIEEJCQkqLworCisKKy8qIEF1ZGlneSBTb3VuZGNhcmQgaGF2ZSBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbiBmb3JtYXQgKi8KKyNkZWZpbmUgQVVESUdZX0NPREVCQVNFCQkweDYwMAorI2RlZmluZSBBX0xPV09SRF9PUFlfTUFTSwkweDAwMDAwN2ZmCQkKKyNkZWZpbmUgQV9MT1dPUkRfT1BYX01BU0sJMHgwMDdmZjAwMAorI2RlZmluZSBBX0hJV09SRF9PUENPREVfTUFTSwkweDBmMDAwMDAwCisjZGVmaW5lIEFfSElXT1JEX1JFU1VMVF9NQVNLCTB4MDA3ZmYwMDAKKyNkZWZpbmUgQV9ISVdPUkRfT1BBX01BU0sJMHgwMDAwMDdmZgorCisKKyNlbmRpZiAvKiBfODAxMF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9NYWtlZmlsZSBiL3NvdW5kL29zcy9lbXUxMGsxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWY5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjIE1ha2VmaWxlIGZvciBDcmVhdGl2ZSBMYWJzIEVNVTEwSzEgCisjCisjIDEyIEFwciAyMDAwIFJ1aSBTb3VzYQorCitvYmotJChDT05GSUdfU09VTkRfRU1VMTBLMSkgKz0gZW11MTBrMS5vCisKK2VtdTEwazEtb2JqcyA6PSBhdWRpby5vIGNhcmRtaS5vIGNhcmRtby5vIGNhcmR3aS5vIGNhcmR3by5vIGVjYXJkLm8gXAorICAgICAgICAgICAgICAgIGVmeG1nci5vIGVtdWFkeG1nLm8gaHdhY2Nlc3MubyBpcnFtZ3IubyBtYWluLm8gbWlkaS5vIFwKKyAgICAgICAgICAgICAgICBtaXhlci5vIHBhc3N0aHJvdWdoLm8gcmVjbWdyLm8gdGltZXIubyB2b2ljZW1nci5vCisKK2lmZGVmIERFQlVHCisgICAgRVhUUkFfQ0ZMQUdTICs9IC1ERU1VMTBLMV9ERUJVRworZW5kaWYKKworaWZkZWYgQ09ORklHX01JRElfRU1VMTBLMQorICAgIEVYVFJBX0NGTEFHUyArPSAtREVNVTEwSzFfU0VRVUVOQ0VSCitlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uYyBiL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlNGQ1OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMKQEAgLTAsMCArMSwxNTg4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBhdWRpby5jIC0tIC9kZXYvZHNwIGludGVyZmFjZSBmb3IgZW11MTBrMSBkcml2ZXIKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqICAgICBOb3ZlbWJlciAyLCAxOTk5CSAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cCB0eXBlcy9sZWFrcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKyNpbmNsdWRlICJjYXJkd28uaCIKKyNpbmNsdWRlICJjYXJkd2kuaCIKKyNpbmNsdWRlICJyZWNtZ3IuaCIKKyNpbmNsdWRlICJpcnFtZ3IuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgIjgwMTAuaCIKKworc3RhdGljIHZvaWQgY2FsY3VsYXRlX29mcmFnKHN0cnVjdCB3b2luc3QgKik7CitzdGF0aWMgdm9pZCBjYWxjdWxhdGVfaWZyYWcoc3RydWN0IHdpaW5zdCAqKTsKKworc3RhdGljIHZvaWQgZW11MTBrMV93YXZlb3V0X2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSk7CitzdGF0aWMgdm9pZCBlbXUxMGsxX3dhdmVpbl9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpOworCisvKiBBdWRpbyBmaWxlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzc2l6ZV90IGVtdTEwazFfYXVkaW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisJc3NpemVfdCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEQoMywgImVtdTEwazFfYXVkaW9fcmVhZCgpLCBidWZmZXI9JXAsIGNvdW50PSVkXG4iLCBidWZmZXIsICh1MzIpIGNvdW50KTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHdpaW5zdC0+bW1hcHBlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAod2lpbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkgeworCQljYWxjdWxhdGVfaWZyYWcod2lpbnN0KTsKKworCQl3aGlsZSAoZW11MTBrMV93YXZlaW5fb3Blbih3YXZlX2RldikgPCAwKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiAtRUFHQUlOOworCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3YXZlX2Rldi0+Y2FyZC0+b3Blbl93YWl0KTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQl1MzIgYnl0ZXN0b2NvcHk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCWlmICghKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCisJCSAgICAmJiAod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX0lOUFVUKSkKKwkJCWVtdTEwazFfd2F2ZWluX3N0YXJ0KHdhdmVfZGV2KTsKKworCQllbXUxMGsxX3dhdmVpbl91cGRhdGUod2F2ZV9kZXYtPmNhcmQsIHdpaW5zdCk7CisJCWVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHdpaW5zdCwgJmJ5dGVzdG9jb3B5KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQlEUEQoMywgImJ5dGVzdG9jb3B5IC0tPiAlZFxuIiwgYnl0ZXN0b2NvcHkpOworCisJCWlmICgoYnl0ZXN0b2NvcHkgPj0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkKKwkJICAgIHx8IChieXRlc3RvY29weSA+PSBjb3VudCkpIHsKKwkJCWJ5dGVzdG9jb3B5ID0gbWluX3QodTMyLCBieXRlc3RvY29weSwgY291bnQpOworCisJCQllbXUxMGsxX3dhdmVpbl94ZmVyZGF0YSh3aWluc3QsICh1OCBfX3VzZXIgKilidWZmZXIsICZieXRlc3RvY29weSk7CisKKwkJCWNvdW50IC09IGJ5dGVzdG9jb3B5OworCQkJYnVmZmVyICs9IGJ5dGVzdG9jb3B5OworCQkJcmV0ICs9IGJ5dGVzdG9jb3B5OworCQl9CisKKwkJaWYgKGNvdW50ID4gMCkgeworCQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCSAgICB8fCAoISh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfSU5QVVQpKSkKKwkJCQlyZXR1cm4gKHJldCA/IHJldCA6IC1FQUdBSU4pOworCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3aWluc3QtPndhaXRfcXVldWUpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIChyZXQgPyByZXQgOiAtRVJFU1RBUlRTWVMpOworCisJCX0KKwl9CisKKwlEUEQoMywgImJ5dGVzIGNvcGllZCAtPiAlZFxuIiwgKHUzMikgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVtdTEwazFfYXVkaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEQoMywgImVtdTEwazFfYXVkaW9fd3JpdGUoKSwgYnVmZmVyPSVwLCBjb3VudD0lZFxuIiwgYnVmZmVyLCAodTMyKSBjb3VudCk7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHdvaW5zdC0+bW1hcHBlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJLy8gVGhpcyBpcyBmb3IgZW11MTBrMSByZXZzIGxlc3MgdGhhbiA3LCB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdHJhbQorCWlmICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAxKSB7CisJCWludCByOworCQkKKwkJd29pbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gUFRfQkxPQ0tTSVpFX0xPRzI7CisJCXdvaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gUFRfQkxPQ0tDT1VOVDsKKwkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7CisJCQorCQlyID0gZW11MTBrMV9wdF93cml0ZShmaWxlLCBidWZmZXIsIGNvdW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiByOworCX0KKworCWlmICh3b2luc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKSB7CisJCWNhbGN1bGF0ZV9vZnJhZyh3b2luc3QpOworCisJCXdoaWxlIChlbXUxMGsxX3dhdmVvdXRfb3Blbih3YXZlX2RldikgPCAwKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiAtRUFHQUlOOworCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3YXZlX2Rldi0+Y2FyZC0+b3Blbl93YWl0KTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJcmV0ID0gMDsKKwlpZiAoY291bnQgJSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnNhbXBsZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCWNvdW50IC89IHdvaW5zdC0+bnVtX3ZvaWNlczsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJdTMyIGJ5dGVzdG9jb3B5OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOworCQllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCQlEUEQoMywgImJ5dGVzdG9jb3B5IC0tPiAlZFxuIiwgYnl0ZXN0b2NvcHkpOworCisJCWlmICgoYnl0ZXN0b2NvcHkgPj0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkKKwkJICAgIHx8IChieXRlc3RvY29weSA+PSBjb3VudCkpIHsKKworCQkJYnl0ZXN0b2NvcHkgPSBtaW5fdCh1MzIsIGJ5dGVzdG9jb3B5LCBjb3VudCk7CisKKwkJCWVtdTEwazFfd2F2ZW91dF94ZmVyZGF0YSh3b2luc3QsICh1OCBfX3VzZXIgKikgYnVmZmVyLCAmYnl0ZXN0b2NvcHkpOworCisJCQljb3VudCAtPSBieXRlc3RvY29weTsKKwkJCWJ1ZmZlciArPSBieXRlc3RvY29weSAqIHdvaW5zdC0+bnVtX3ZvaWNlczsKKwkJCXJldCArPSBieXRlc3RvY29weSAqIHdvaW5zdC0+bnVtX3ZvaWNlczsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJd29pbnN0LT50b3RhbF9jb3BpZWQgKz0gYnl0ZXN0b2NvcHk7CisKKwkJCWlmICghKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCisJCQkgICAgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9PVVRQVVQpCisJCQkgICAgJiYgKHdvaW5zdC0+dG90YWxfY29waWVkID49IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpKQorCQkJCWVtdTEwazFfd2F2ZW91dF9zdGFydCh3YXZlX2Rldik7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQl9CisKKwkJaWYgKGNvdW50ID4gMCkgeworCQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCSAgICB8fCAoISh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKSkpCisJCQkJcmV0dXJuIChyZXQgPyByZXQgOiAtRUFHQUlOKTsKKworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd29pbnN0LT53YWl0X3F1ZXVlKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAocmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTKTsKKwkJfQorCX0KKworCURQRCgzLCAiYnl0ZXMgY29waWVkIC0+ICVkXG4iLCAodTMyKSByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbXUxMGsxX2F1ZGlvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSBOVUxMOworCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IE5VTEw7CisJaW50IHZhbCA9IDA7CisJdTMyIGJ5dGVzdG9jb3B5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOworCisJRFBGKDQsICJlbXUxMGsxX2F1ZGlvX2lvY3RsKClcbiIpOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQl3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXdpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCURQRigyLCAiT1NTX0dFVFZFUlNJT046XG4iKTsKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlEUEYoMiwgIlNORENUTF9EU1BfUkVTRVQ6XG4iKTsKKwkJd2F2ZV9kZXYtPmVuYWJsZWJpdHMgPSBQQ01fRU5BQkxFX09VVFBVVCB8IFBDTV9FTkFCTEVfSU5QVVQ7CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7CisJCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKKwkJCX0KKworCQkJd29pbnN0LT5tbWFwcGVkID0gMDsKKwkJCXdvaW5zdC0+dG90YWxfY29waWVkID0gMDsKKwkJCXdvaW5zdC0+dG90YWxfcGxheWVkID0gMDsKKwkJCXdvaW5zdC0+YmxvY2tzID0gMDsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCX0KKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgeworCQkJCWVtdTEwazFfd2F2ZWluX2Nsb3NlKHdhdmVfZGV2KTsKKwkJCX0KKworCQkJd2lpbnN0LT5tbWFwcGVkID0gMDsKKwkJCXdpaW5zdC0+dG90YWxfcmVjb3JkZWQgPSAwOworCQkJd2lpbnN0LT5ibG9ja3MgPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlEUEYoMiwgIlNORENUTF9EU1BfU1lOQzpcbiIpOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7CisKKwkJCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKKwkJCQkJd2hpbGUgKCh3b2luc3QtPnRvdGFsX3BsYXllZCA8IHdvaW5zdC0+dG90YWxfY29waWVkKQorCQkJCQkgICAgICAgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJndvaW5zdC0+d2FpdF9xdWV1ZSk7CisJCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCQkJCX0KKwkJCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOworCQkJfQorCisJCQl3b2luc3QtPm1tYXBwZWQgPSAwOworCQkJd29pbnN0LT50b3RhbF9jb3BpZWQgPSAwOworCQkJd29pbnN0LT50b3RhbF9wbGF5ZWQgPSAwOworCQkJd29pbnN0LT5ibG9ja3MgPSAwOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7CisJCQkJZW11MTBrMV93YXZlaW5fY2xvc2Uod2F2ZV9kZXYpOworCQkJfQorCisJCQl3aWluc3QtPm1tYXBwZWQgPSAwOworCQkJd2lpbnN0LT50b3RhbF9yZWNvcmRlZCA9IDA7CisJCQl3aWluc3QtPmJsb2NrcyA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJRFBGKDIsICJTTkRDVExfRFNQX1NFVERVUExFWDpcbiIpOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlEUEYoMiwgIlNORENUTF9EU1BfR0VUQ0FQUzpcbiIpOworCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwKKwkJCQlEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAgfAorCQkJCURTUF9DQVBfQ09QUk9DfCBEU1BfQ0FQX01VTFRJLCBwKTsKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCURQRigyLCAiU05EQ1RMX0RTUF9TUEVFRDpcbiIpOworCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJRFBEKDIsICJ2YWwgaXMgJWRcbiIsIHZhbCk7CisKKwkJaWYgKHZhbCA+IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKKworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJCWZvcm1hdCA9IHdpaW5zdC0+Zm9ybWF0OworCQkJCWZvcm1hdC5zYW1wbGluZ3JhdGUgPSB2YWw7CisKKwkJCQlpZiAoZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQkJRFBEKDIsICJzZXQgcmVjb3JkaW5nIHNhbXBsaW5nIHJhdGUgLT4gJWRcbiIsIHZhbCk7CisJCQl9CisKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7CisKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKKwkJCQlmb3JtYXQuc2FtcGxpbmdyYXRlID0gdmFsOworCisJCQkJaWYgKGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlOworCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCQlEUEQoMiwgInNldCBwbGF5YmFjayBzYW1wbGluZyByYXRlIC0+ICVkXG4iLCB2YWwpOworCQkJfQorCisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKKwkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKKworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlEUEYoMiwgIlNORENUTF9EU1BfU1RFUkVPOlxuIik7CisKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEUEQoMiwgIiB2YWwgaXMgJWRcbiIsIHZhbCk7CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJZm9ybWF0ID0gd2lpbnN0LT5mb3JtYXQ7CisJCQlmb3JtYXQuY2hhbm5lbHMgPSB2YWwgPyAyIDogMTsKKworCQkJaWYgKGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzIC0gMTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCQlEUEQoMiwgInNldCByZWNvcmRpbmcgc3RlcmVvIC0+ICVkXG4iLCB2YWwpOworCQl9CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWZvcm1hdCA9IHdvaW5zdC0+Zm9ybWF0OworCQkJZm9ybWF0LmNoYW5uZWxzID0gdmFsID8gMiA6IDE7CisKKwkJCWlmIChlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuY2hhbm5lbHMgLSAxOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJRFBEKDIsICJzZXQgcGxheWJhY2sgc3RlcmVvIC0+ICVkXG4iLCB2YWwpOworCQl9CisKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisJCURQRigyLCAiU05EQ1RMX0RTUF9DSEFOTkVMUzpcbiIpOworCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJRFBEKDIsICIgdmFsIGlzICVkXG4iLCB2YWwpOworCisJCWlmICh2YWwgPiAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7CisKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCQlmb3JtYXQgPSB3aWluc3QtPmZvcm1hdDsKKwkJCQlmb3JtYXQuY2hhbm5lbHMgPSB2YWw7CisKKwkJCQlpZiAoZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVsczsKKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCURQRCgyLCAic2V0IHJlY29yZGluZyBudW1iZXIgb2YgY2hhbm5lbHMgLT4gJWRcbiIsIHZhbCk7CisJCQl9CisKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7CisKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKKwkJCQlmb3JtYXQuY2hhbm5lbHMgPSB2YWw7CisKKwkJCQlpZiAoZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5jaGFubmVsczsKKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCURQRCgyLCAic2V0IHBsYXliYWNrIG51bWJlciBvZiBjaGFubmVscyAtPiAlZFxuIiwgdmFsKTsKKwkJCX0KKworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVsczsKKwkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzOworCisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgorCQlEUEYoMiwgIlNORENUTF9EU1BfR0VURk1UUzpcbiIpOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJdmFsID0gQUZNVF9TMTZfTEU7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQl2YWwgPSBBRk1UX1MxNl9MRSB8IEFGTVRfVTg7CisJCQlpZiAoZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZ3YXZlX2Rldi0+Y2FyZC0+bWdyLAorCQkJCQkJICAgICB3YXZlX2Rldi0+Y2FyZC0+cHQucGF0Y2hfbmFtZSwgCisJCQkJCQkgICAgIHdhdmVfZGV2LT5jYXJkLT5wdC5lbmFibGVfZ3ByX25hbWUpID49IDApCisJCQkJdmFsIHw9IEFGTVRfQUMzOworCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoJLyogU2FtZSBhcyBTTkRDVExfRFNQX1NBTVBMRVNJWkUgKi8KKwkJRFBGKDIsICJTTkRDVExfRFNQX1NFVEZNVDpcbiIpOworCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJRFBEKDIsICIgdmFsIGlzICVkXG4iLCB2YWwpOworCisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQkJZm9ybWF0ID0gd2lpbnN0LT5mb3JtYXQ7CisJCQkJZm9ybWF0LmlkID0gdmFsOworCisJCQkJaWYgKGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5pZDsKKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCURQRCgyLCAic2V0IHJlY29yZGluZyBmb3JtYXQgLT4gJWRcbiIsIHZhbCk7CisJCQl9CisKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7CisKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKKwkJCQlmb3JtYXQuaWQgPSB2YWw7CisKKwkJCQlpZiAoZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5pZDsKKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCURQRCgyLCAic2V0IHBsYXliYWNrIGZvcm1hdCAtPiAlZFxuIiwgdmFsKTsKKwkJCX0KKworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5pZDsKKwkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmlkOworCisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsOworCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsOworCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlOworCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVsczsKKwkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5jaGFubmVsczsKKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKwkJRFBGKDIsICJTT1VORF9QQ01fV1JJVEVfRklMVEVSOiBub3QgaW1wbGVtZW50ZWRcbiIpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorCQlEUEYoMiwgIlNPVU5EX1BDTV9SRUFEX0ZJTFRFUjogbm90IGltcGxlbWVudGVkXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgorCQlEUEYoMiwgIlNORENUTF9EU1BfU0VUU1lOQ1JPOiBub3QgaW1wbGVtZW50ZWRcbiIpOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQlEUEYoMiwgIlNORENUTF9EU1BfR0VUVFJJR0dFUjpcbiIpOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiAod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9JTlBVVCkpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlEUEYoMiwgIlNORENUTF9EU1BfU0VUVFJJR0dFUjpcbiIpOworCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgeworCQkJCXdhdmVfZGV2LT5lbmFibGViaXRzIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKQorCQkJCQllbXUxMGsxX3dhdmVvdXRfc3RhcnQod2F2ZV9kZXYpOworCQkJfSBlbHNlIHsKKwkJCQl3YXZlX2Rldi0+ZW5hYmxlYml0cyAmPSB+UENNX0VOQUJMRV9PVVRQVVQ7CisJCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCisJCQkJCWVtdTEwazFfd2F2ZW91dF9zdG9wKHdhdmVfZGV2KTsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCX0KKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCXdhdmVfZGV2LT5lbmFibGViaXRzIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pCisJCQkJCWVtdTEwazFfd2F2ZWluX3N0YXJ0KHdhdmVfZGV2KTsKKwkJCX0gZWxzZSB7CisJCQkJd2F2ZV9kZXYtPmVuYWJsZWJpdHMgJj0gflBDTV9FTkFCTEVfSU5QVVQ7CisJCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCisJCQkJCWVtdTEwazFfd2F2ZWluX3N0b3Aod2F2ZV9kZXYpOworCQkJfQorCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCXsKKwkJCWF1ZGlvX2J1Zl9pbmZvIGluZm87CisKKwkJCURQRig0LCAiU05EQ1RMX0RTUF9HRVRPU1BBQ0U6XG4iKTsKKworCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7CisJCQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOworCQkJCWVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSh3b2luc3QsICZieXRlc3RvY29weSk7CisJCQkJaW5mby5ieXRlcyA9IGJ5dGVzdG9jb3B5OworCQkJfSBlbHNlIHsKKwkJCQljYWxjdWxhdGVfb2ZyYWcod29pbnN0KTsKKwkJCQlpbmZvLmJ5dGVzID0gd29pbnN0LT5idWZmZXIuc2l6ZTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpbmZvLmJ5dGVzICo9IHdvaW5zdC0+bnVtX3ZvaWNlczsKKwkJCWluZm8uZnJhZ3NpemUgPSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplICogd29pbnN0LT5udW1fdm9pY2VzOworCQkJaW5mby5mcmFnc3RvdGFsID0gd29pbnN0LT5idWZmZXIubnVtZnJhZ3MgKiB3b2luc3QtPm51bV92b2ljZXM7CisJCQlpbmZvLmZyYWdtZW50cyA9IGluZm8uYnl0ZXMgLyBpbmZvLmZyYWdzaXplOworCisJCQlpZiAoY29weV90b191c2VyKHAsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJeworCQkJYXVkaW9fYnVmX2luZm8gaW5mbzsKKworCQkJRFBGKDQsICJTTkRDVExfRFNQX0dFVElTUEFDRTpcbiIpOworCisJCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKKwkJCQllbXUxMGsxX3dhdmVpbl91cGRhdGUod2F2ZV9kZXYtPmNhcmQsIHdpaW5zdCk7CisJCQkJZW11MTBrMV93YXZlaW5fZ2V0eGZlcnNpemUod2lpbnN0LCAmYnl0ZXN0b2NvcHkpOworCQkJCWluZm8uYnl0ZXMgPSBieXRlc3RvY29weTsKKwkJCX0gZWxzZSB7CisJCQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7CisJCQkJaW5mby5ieXRlcyA9IDA7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJaW5mby5mcmFnc3RvdGFsID0gd2lpbnN0LT5idWZmZXIubnVtZnJhZ3M7CisJCQlpbmZvLmZyYWdtZW50cyA9IGluZm8uYnl0ZXMgLyB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOworCQkJaW5mby5mcmFnc2l6ZSA9IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCURQRigyLCAiU05EQ1RMX0RTUF9OT05CTE9DSzpcbiIpOworCisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUT0RFTEFZOlxuIik7CisKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgeworCQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOworCQkJZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHdvaW5zdCwgJmJ5dGVzdG9jb3B5KTsKKwkJCXZhbCA9IHdvaW5zdC0+YnVmZmVyLnNpemUgLSBieXRlc3RvY29weTsKKwkJfSBlbHNlCisJCQl2YWwgPSAwOworCisJCXZhbCAqPSB3b2luc3QtPm51bV92b2ljZXM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCXsKKwkJCWNvdW50X2luZm8gY2luZm87CisKKwkJCURQRig0LCAiU05EQ1RMX0RTUF9HRVRJUFRSOiBcbiIpOworCisJCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgeworCQkJCWVtdTEwazFfd2F2ZWluX3VwZGF0ZSh3YXZlX2Rldi0+Y2FyZCwgd2lpbnN0KTsKKwkJCQljaW5mby5wdHIgPSB3aWluc3QtPmJ1ZmZlci5od19wb3M7CisJCQkJY2luZm8uYnl0ZXMgPSBjaW5mby5wdHIgKyB3aWluc3QtPnRvdGFsX3JlY29yZGVkIC0gd2lpbnN0LT50b3RhbF9yZWNvcmRlZCAlIHdpaW5zdC0+YnVmZmVyLnNpemU7CisJCQkJY2luZm8uYmxvY2tzID0gY2luZm8uYnl0ZXMgLyB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplIC0gd2lpbnN0LT5ibG9ja3M7CisJCQkJd2lpbnN0LT5ibG9ja3MgPSBjaW5mby5ieXRlcyAvIHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7CisJCQl9IGVsc2UgeworCQkJCWNpbmZvLnB0ciA9IDA7CisJCQkJY2luZm8uYnl0ZXMgPSAwOworCQkJCWNpbmZvLmJsb2NrcyA9IDA7CisJCQl9CisKKwkJCWlmICh3aWluc3QtPm1tYXBwZWQpCisJCQkJd2lpbnN0LT5idWZmZXIuYnl0ZXN0b2NvcHkgJT0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQl7CisJCQljb3VudF9pbmZvIGNpbmZvOworCisJCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUT1BUUjpcbiIpOworCisJCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4gfHwgCisJCQkgICAgKCh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAxKSAmJiB3YXZlX2Rldi0+Y2FyZC0+cHQuc3RhdGUpKSB7CisJCQkJaW50IG51bV9mcmFnbWVudHM7CisKKwkJCQlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMSkgeworCQkJCQllbXUxMGsxX3B0X3dhdmVvdXRfdXBkYXRlKHdhdmVfZGV2KTsKKwkJCQkJY2luZm8uYnl0ZXMgPSB3b2luc3QtPnRvdGFsX3BsYXllZDsKKwkJCQl9IGVsc2UgeworCQkJCQllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7CisJCQkJCWNpbmZvLmJ5dGVzID0gd29pbnN0LT50b3RhbF9wbGF5ZWQ7CisJCQkJfQorCisJCQkJY2luZm8ucHRyID0gd29pbnN0LT5idWZmZXIuaHdfcG9zOworCQkJCW51bV9mcmFnbWVudHMgPSBjaW5mby5ieXRlcyAvIHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7CisJCQkJY2luZm8uYmxvY2tzID0gbnVtX2ZyYWdtZW50cyAtIHdvaW5zdC0+YmxvY2tzOworCQkJCXdvaW5zdC0+YmxvY2tzID0gbnVtX2ZyYWdtZW50czsKKworCQkJCWNpbmZvLmJ5dGVzICo9IHdvaW5zdC0+bnVtX3ZvaWNlczsKKwkJCQljaW5mby5wdHIgKj0gd29pbnN0LT5udW1fdm9pY2VzOworCQkJfSBlbHNlIHsKKwkJCQljaW5mby5wdHIgPSAwOworCQkJCWNpbmZvLmJ5dGVzID0gMDsKKwkJCQljaW5mby5ibG9ja3MgPSAwOworCQkJfQorCisJCQlpZiAod29pbnN0LT5tbWFwcGVkKQorCQkJCXdvaW5zdC0+YnVmZmVyLmZyZWVfYnl0ZXMgJT0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlEUEYoMiwgIlNORENUTF9EU1BfR0VUQkxLU0laRTpcbiIpOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQljYWxjdWxhdGVfb2ZyYWcod29pbnN0KTsKKwkJCXZhbCA9IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgKiB3b2luc3QtPm51bV92b2ljZXM7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQl9CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7CisJCQl2YWwgPSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQorCQkJICAgICYmICh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKQorCQkJICAgICYmICh3b2luc3QtPnRvdGFsX2NvcGllZCA+IDApKQorCQkJCWVtdTEwazFfd2F2ZW91dF9zdGFydCh3YXZlX2Rldik7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlEUEYoMiwgIlNORENUTF9EU1BfU1VCRElWSURFOiBub3QgaW1wbGVtZW50ZWRcbiIpOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJRFBGKDIsICJTTkRDVExfRFNQX1NFVEZSQUdNRU5UOlxuIik7CisKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEUEQoMiwgInZhbCBpcyAlI3hcbiIsIHZhbCk7CisKKwkJaWYgKHZhbCA9PSAwKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkvKiBkaWdpdGFsIHBhc3MtdGhyb3VnaCBmcmFnbWVudCBjb3VudCBhbmQgc2l6ZSBhcmUgZml4ZWQgdmFsdWVzICovCisJCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTiB8fCAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CS8qIHRvbyBsYXRlIHRvIGNoYW5nZSAqLworCisJCQl3b2luc3QtPmJ1ZmZlci5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQl3b2luc3QtPmJ1ZmZlci5udW1mcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQl9CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKQorCQkJCXJldHVybiAtRUlOVkFMOwkvKiB0b28gbGF0ZSB0byBjaGFuZ2UgKi8KKworCQkJd2lpbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJd2lpbnN0LT5idWZmZXIubnVtZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfQ09QUl9MT0FEOgorCQl7CisJCQljb3ByX2J1ZmZlciAqYnVmOworCQkJdTMyIGk7CisKKwkJCURQRig0LCAiU05EQ1RMX0NPUFJfTE9BRDpcbiIpOworCisJCQlidWYgPSBrbWFsbG9jKHNpemVvZihjb3ByX2J1ZmZlciksIEdGUF9LRVJORUwpOworCQkJaWYgKCFidWYpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHAsIHNpemVvZihjb3ByX2J1ZmZlcikpKSB7CisJCQkJa2ZyZWUgKGJ1Zik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCWlmICgoYnVmLT5jb21tYW5kICE9IENNRF9SRUFEKSAmJiAoYnVmLT5jb21tYW5kICE9IENNRF9XUklURSkpIHsKKwkJCQlrZnJlZSAoYnVmKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJaWYgKGJ1Zi0+Y29tbWFuZCA9PSBDTURfV1JJVEUpIHsKKwkJCQkKKyNpZmRlZiBEQkdFTVUKKwkJCQlpZiAoKGJ1Zi0+b2ZmcyA8IDApIHx8IChidWYtPm9mZnMgKyBidWYtPmxlbiA+IDB4ZTAwKSB8fCAoYnVmLT5sZW4gPiAxMDAwKSkgeworI2Vsc2UKKwkJCQlpZiAoKChidWYtPm9mZnMgPCAweDEwMCkgfHwgKGJ1Zi0+b2ZmcyArIGJ1Zi0+bGVuID4gKHdhdmVfZGV2LT5jYXJkLT5pc19hdWRpZ3kgPyAweGUwMCA6IDB4ODAwKSkgfHwgKGJ1Zi0+bGVuID4gMTAwMCkKKwkJCQkpICYmICEoCisJCQkJCS8vYW55IHJlZ2lzdGVyIGFsbG93ZWQgcmF3IGFjY2VzcyB0byB1c2VycyBnb2VzIGhlcmU6CisJCQkJCShidWYtPm9mZnMgPT0gREJHIHx8CisJCQkJCSAgYnVmLT5vZmZzID09IEFfREJHKQorCQkJCQkmJiAoYnVmLT5sZW4gPT0gMSkpKSB7CisjZW5kaWYJCQorCQkJCQlrZnJlZShidWYpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICgoYnVmLT5vZmZzIDwgMCkgfHwgKGJ1Zi0+b2ZmcyArIGJ1Zi0+bGVuID4gMHhlMDApIHx8IChidWYtPmxlbiA+IDEwMDApKSB7CisJCQkJCWtmcmVlKGJ1Zik7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0JCQkKKwkJCQkKKwkJCWlmICgoKHVuc2lnbmVkKWJ1Zi0+ZmxhZ3MpID4gMHgzZikKKwkJCQlidWYtPmZsYWdzID0gMDsKKworCQkJaWYgKGJ1Zi0+Y29tbWFuZCA9PSBDTURfUkVBRCkgeworCQkJCWZvciAoaSA9IDA7IGkgPCBidWYtPmxlbjsgaSsrKQorCQkJCQkoKHUzMiAqKSBidWYtPmRhdGEpW2ldID0gc2JsaXZlX3JlYWRwdHIod2F2ZV9kZXYtPmNhcmQsIGJ1Zi0+b2ZmcyArIGksIGJ1Zi0+ZmxhZ3MpOworCisJCQkJaWYgKGNvcHlfdG9fdXNlcihwLCBidWYsIHNpemVvZihjb3ByX2J1ZmZlcikpKSB7CisJCQkJCWtmcmVlKGJ1Zik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpID0gMDsgaSA8IGJ1Zi0+bGVuOyBpKyspCisJCQkJCXNibGl2ZV93cml0ZXB0cih3YXZlX2Rldi0+Y2FyZCwgYnVmLT5vZmZzICsgaSwgYnVmLT5mbGFncywgKCh1MzIgKikgYnVmLT5kYXRhKVtpXSk7CisJCQl9CisKKwkJCWtmcmVlIChidWYpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CQkvKiBEZWZhdWx0IGlzIHVucmVjb2duaXplZCBjb21tYW5kICovCisJCURQRCgyLCAiZGVmYXVsdDogJSN4XG4iLCBjbWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqZW11MTBrMV9tbV9ub3BhZ2UgKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgKnR5cGUpCit7CisJc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisJc3RydWN0IHBhZ2UgKmRtYXBhZ2U7CisJdW5zaWduZWQgbG9uZyBwZ29mZjsKKwlpbnQgcmQsIHdyOworCisJRFBGKDMsICJlbXUxMGsxX21tX25vcGFnZSgpXG4iKTsKKwlEUEQoMywgImFkZHI6ICUjbHhcbiIsIGFkZHJlc3MpOworCisJaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkgeworCQlEUEYoMSwgIkVYSVQsIHJldHVybmluZyBOT1BBR0VfU0lHQlVTXG4iKTsKKwkJcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIERpc2FsbG93IG1yZW1hcCAqLworCX0KKworCXBnb2ZmID0gdm1hLT52bV9wZ29mZiArICgoYWRkcmVzcyAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpOworCWlmICh3b2luc3QgIT0gTlVMTCkKKwkJd3IgPSB3b2luc3QtPm1tYXBwZWQ7CisJZWxzZQorCQl3ciA9IDA7CisKKwlpZiAod2lpbnN0ICE9IE5VTEwpCisJCXJkID0gd2lpbnN0LT5tbWFwcGVkOworCWVsc2UKKwkJcmQgPSAwOworCisJLyogaWYgZnVsbC1kdXBsZXggKHJlYWQrd3JpdGUpIGFuZCB3ZSBoYXZlIHR3byBzZXRzIG9mIGJ1ZnMsCisJKiB0aGVuIHRoZSBwbGF5YmFjayBidWZmZXJzIGNvbWUgZmlyc3QsIHNleiBzb3VuZGNhcmQuYyAqLworCWlmICh3cikgeworCQlpZiAocGdvZmYgPj0gd29pbnN0LT5idWZmZXIucGFnZXMpIHsKKwkJCXBnb2ZmIC09IHdvaW5zdC0+YnVmZmVyLnBhZ2VzOworCQkJZG1hcGFnZSA9IHZpcnRfdG9fcGFnZSAoKHU4ICopIHdpaW5zdC0+YnVmZmVyLmFkZHIgKyBwZ29mZiAqIFBBR0VfU0laRSk7CisJCX0gZWxzZQorCQkJZG1hcGFnZSA9IHZpcnRfdG9fcGFnZSAod29pbnN0LT52b2ljZVswXS5tZW0uYWRkcltwZ29mZl0pOworCX0gZWxzZSB7CisJCWRtYXBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKCh1OCAqKSB3aWluc3QtPmJ1ZmZlci5hZGRyICsgcGdvZmYgKiBQQUdFX1NJWkUpOworCX0KKworCWdldF9wYWdlIChkbWFwYWdlKTsKKworCURQRCgzLCAicGFnZTogJSNseFxuIiwgKHVuc2lnbmVkIGxvbmcpIGRtYXBhZ2UpOworCWlmICh0eXBlKQorCQkqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCXJldHVybiBkbWFwYWdlOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGVtdTEwazFfbW1fb3BzID0geworCS5ub3BhZ2UgICAgICAgICA9IGVtdTEwazFfbW1fbm9wYWdlLAorfTsKKworc3RhdGljIGludCBlbXUxMGsxX2F1ZGlvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgbWF4X3BhZ2VzLCBuX3BhZ2VzLCBwZ29mZnNldDsKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSBOVUxMOworCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQRigyLCAiZW11MTBrMV9hdWRpb19tbWFwKClcbiIpOworCisJbWF4X3BhZ2VzID0gMDsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCXdvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCS8qIE5vIG0nbWFwcGluZyBwb3NzaWJsZSBmb3IgbXVsdGljaGFubmVsICovCisJCWlmICh3b2luc3QtPm51bV92b2ljZXMgPiAxKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAod29pbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkgeworCQkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7CisKKwkJCWlmIChlbXUxMGsxX3dhdmVvdXRfb3Blbih3YXZlX2RldikgPCAwKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCQkJRVJST1IoKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCisJCXdvaW5zdC0+bW1hcHBlZCA9IDE7CisJCW1heF9wYWdlcyArPSB3b2luc3QtPmJ1ZmZlci5wYWdlczsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCXdpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQlpZiAod2lpbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkgeworCQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7CisKKwkJCWlmIChlbXUxMGsxX3dhdmVpbl9vcGVuKHdhdmVfZGV2KSA8IDApIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQlFUlJPUigpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisKKwkJd2lpbnN0LT5tbWFwcGVkID0gMTsKKwkJbWF4X3BhZ2VzICs9IHdpaW5zdC0+YnVmZmVyLnBhZ2VzOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwluX3BhZ2VzID0gKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwlwZ29mZnNldCA9IHZtYS0+dm1fcGdvZmY7CisKKwlEUEQoMiwgInZtYV9zdGFydDogJSNseCwgdm1hX2VuZDogJSNseCwgdm1hX29mZnNldDogJWxkXG4iLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgcGdvZmZzZXQpOworCURQRCgyLCAibl9wYWdlczogJWxkLCBtYXhfcGFnZXM6ICVsZFxuIiwgbl9wYWdlcywgbWF4X3BhZ2VzKTsKKworCWlmIChwZ29mZnNldCArIG5fcGFnZXMgPiBtYXhfcGFnZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX29wcyA9ICZlbXUxMGsxX21tX29wczsKKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHdhdmVfZGV2OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtdTEwazFfYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2OworCisJRFBGKDIsICJlbXUxMGsxX2F1ZGlvX29wZW4oKVxuIik7CisKKwkvKiBDaGVjayBmb3IgY29ycmVjdCBkZXZpY2UgdG8gb3BlbiAqLworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmVtdTEwazFfZGV2cykgeworCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdTEwazFfY2FyZCwgbGlzdCk7CisKKwkJaWYgKCEoKGNhcmQtPmF1ZGlvX2RldiBeIG1pbm9yKSAmIH4weGYpIHx8ICEoKGNhcmQtPmF1ZGlvX2RldjEgXiBtaW5vcikgJiB+MHhmKSkKKwkJCWdvdG8gbWF0Y2g7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7CisKK21hdGNoOgorCisJd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAod2F2ZV9kZXYgPT0gTlVMTCkgeyAKKwkJRVJST1IoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJd2F2ZV9kZXYtPmNhcmQgPSBjYXJkOworCXdhdmVfZGV2LT53aWluc3QgPSBOVUxMOworCXdhdmVfZGV2LT53b2luc3QgPSBOVUxMOworCXdhdmVfZGV2LT5lbmFibGViaXRzID0gUENNX0VOQUJMRV9PVVRQVVQgfCBQQ01fRU5BQkxFX0lOUFVUOwkvKiBEZWZhdWx0ICovCisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkvKiBSZWNvcmRpbmcgKi8KKwkJc3RydWN0IHdpaW5zdCAqd2lpbnN0OworCisJCWlmICgod2lpbnN0ID0gKHN0cnVjdCB3aWluc3QgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHdpaW5zdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCQlFUlJPUigpOworCQkJa2ZyZWUod2F2ZV9kZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQl3aWluc3QtPnJlY3NyYyA9IGNhcmQtPndhdmVpbi5yZWNzcmM7CisgICAgICAgICAgICAgICAgd2lpbnN0LT5meHdjID0gY2FyZC0+d2F2ZWluLmZ4d2M7CisKKwkJc3dpdGNoICh3aWluc3QtPnJlY3NyYykgeworCQljYXNlIFdBVkVSRUNPUkRfQUM5NzoKKwkJCXdpaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9TMTZfTEU7CisJCQl3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgPSA4MDAwOworCQkJd2lpbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPSAxNjsKKwkJCXdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFdBVkVSRUNPUkRfTUlDOgorCQkJd2lpbnN0LT5mb3JtYXQuaWQgPSBBRk1UX1MxNl9MRTsKKwkJCXdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSA9IDgwMDA7CisJCQl3aWluc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9IDE2OworCQkJd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgV0FWRVJFQ09SRF9GWDoKKwkJCXdpaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9TMTZfTEU7CisJCQl3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgPSA0ODAwMDsKKwkJCXdpaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID0gMTY7CisJCQl3aWluc3QtPmZvcm1hdC5jaGFubmVscyA9IGh3ZWlnaHQzMih3aWluc3QtPmZ4d2MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlrZnJlZSh3YXZlX2Rldik7CisJCQlrZnJlZSh3aWluc3QpOworCQkJQlVHKCk7CisJCQlicmVhazsKKwkJfQorCisJCXdpaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX0NMT1NFRDsKKworCQl3aWluc3QtPmJ1ZmZlci5vc3NmcmFnc2hpZnQgPSAwOworCQl3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplID0gMDsKKwkJd2lpbnN0LT5idWZmZXIubnVtZnJhZ3MgPSAwOworCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndpaW5zdC0+d2FpdF9xdWV1ZSk7CisKKwkJd2lpbnN0LT5tbWFwcGVkID0gMDsKKwkJd2lpbnN0LT50b3RhbF9yZWNvcmRlZCA9IDA7CisJCXdpaW5zdC0+YmxvY2tzID0gMDsKKwkJc3Bpbl9sb2NrX2luaXQoJndpaW5zdC0+bG9jayk7CisJCXRhc2tsZXRfaW5pdCgmd2lpbnN0LT50aW1lci50YXNrbGV0LCBlbXUxMGsxX3dhdmVpbl9iaCwgKHVuc2lnbmVkIGxvbmcpIHdhdmVfZGV2KTsKKwkJd2F2ZV9kZXYtPndpaW5zdCA9IHdpaW5zdDsKKwkJZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmd2lpbnN0LT5mb3JtYXQpOworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3Q7CisJCWludCBpOworCisJCWlmICgod29pbnN0ID0gKHN0cnVjdCB3b2luc3QgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHdvaW5zdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCQlFUlJPUigpOworCQkJa2ZyZWUod2F2ZV9kZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlpZiAod2F2ZV9kZXYtPndpaW5zdCAhPSBOVUxMKSB7CisJCQl3b2luc3QtPmZvcm1hdCA9IHdhdmVfZGV2LT53aWluc3QtPmZvcm1hdDsKKwkJfSBlbHNlIHsKKwkJCXdvaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9VODsKKwkJCXdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSA9IDgwMDA7CisJCQl3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9IDg7CisJCQl3b2luc3QtPmZvcm1hdC5jaGFubmVscyA9IDE7CisJCX0KKworCQl3b2luc3QtPnN0YXRlID0gV0FWRV9TVEFURV9DTE9TRUQ7CisKKwkJd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSA9IDA7CisJCXdvaW5zdC0+YnVmZmVyLm9zc2ZyYWdzaGlmdCA9IDA7CisJCXdvaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gMDsKKwkJd29pbnN0LT5kZXZpY2UgPSAoY2FyZC0+YXVkaW9fZGV2MSA9PSBtaW5vcik7CisJCXdvaW5zdC0+dGltZXIuc3RhdGUgPSBUSU1FUl9TVEFURV9VTklOU1RBTExFRDsKKwkJd29pbnN0LT5udW1fdm9pY2VzID0gMTsKKwkJZm9yIChpID0gMDsgaSA8IFdBVkVPVVRfTUFYVk9JQ0VTOyBpKyspIHsKKwkJCXdvaW5zdC0+dm9pY2VbaV0udXNhZ2UgPSBWT0lDRV9VU0FHRV9GUkVFOworCQkJd29pbnN0LT52b2ljZVtpXS5tZW0uZW11cGFnZWluZGV4ID0gLTE7CisJCX0KKworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3b2luc3QtPndhaXRfcXVldWUpOworCisJCXdvaW5zdC0+bW1hcHBlZCA9IDA7CisJCXdvaW5zdC0+dG90YWxfY29waWVkID0gMDsKKwkJd29pbnN0LT50b3RhbF9wbGF5ZWQgPSAwOworCQl3b2luc3QtPmJsb2NrcyA9IDA7CisJCXNwaW5fbG9ja19pbml0KCZ3b2luc3QtPmxvY2spOworCQl0YXNrbGV0X2luaXQoJndvaW5zdC0+dGltZXIudGFza2xldCwgZW11MTBrMV93YXZlb3V0X2JoLCAodW5zaWduZWQgbG9uZykgd2F2ZV9kZXYpOworCQl3YXZlX2Rldi0+d29pbnN0ID0gd29pbnN0OworCQllbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHdhdmVfZGV2LCAmd29pbnN0LT5mb3JtYXQpOworCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopIHdhdmVfZGV2OworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVtdTEwazFfYXVkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljYXJkID0gd2F2ZV9kZXYtPmNhcmQ7CisKKwlEUEYoMiwgImVtdTEwazFfYXVkaW9fcmVsZWFzZSgpXG4iKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJaWYod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2g9PTIpCisJCQljYXJkLT5wdC5zdGF0ZT1QVF9TVEFURV9QTEFZSU5HOworCQlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggJiYgY2FyZC0+cHQuc3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpeworCQkJc3Bpbl9sb2NrKCZjYXJkLT5wdC5sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtdTEwazFfcHRfc3RvcChjYXJkKTsKKwkJCXNwaW5fdW5sb2NrKCZjYXJkLT5wdC5sb2NrKTsKKwkJfQorCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgeworCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpIHsKKwkJCQlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJCQkJd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KQorCQkJCQkgICAgICAgJiYgKHdvaW5zdC0+dG90YWxfcGxheWVkIDwgd29pbnN0LT50b3RhbF9jb3BpZWQpKSB7CisJCQkJCQlEUEYoNCwgIkJ1ZmZlciBoYXNuJ3QgYmVlbiB0b3RhbGx5IHBsYXllZCwgc2xlZXAuLi4uXG4iKTsKKwkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd29pbnN0LT53YWl0X3F1ZXVlKTsKKwkJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJLyogcmVtb3ZlIHRoZSB0YXNrbGV0ICovCisJCXRhc2tsZXRfa2lsbCgmd29pbnN0LT50aW1lci50YXNrbGV0KTsKKwkJa2ZyZWUod2F2ZV9kZXYtPndvaW5zdCk7CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKKwkJCWVtdTEwazFfd2F2ZWluX2Nsb3NlKHdhdmVfZGV2KTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQl0YXNrbGV0X2tpbGwoJndpaW5zdC0+dGltZXIudGFza2xldCk7CisJCWtmcmVlKHdhdmVfZGV2LT53aWluc3QpOworCX0KKworCWtmcmVlKHdhdmVfZGV2KTsKKworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZjYXJkLT5vcGVuX3dhaXQpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhcmQtPm9wZW5fd2FpdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRklYTUUgc29ydCBvdXQgcG9sbCgpICsgbW1hcCgpICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVtdTEwazFfYXVkaW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7CisJc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJdTMyIGJ5dGVzdG9jb3B5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoNCwgImVtdTEwazFfYXVkaW9fcG9sbCgpXG4iKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcG9sbF93YWl0KGZpbGUsICZ3b2luc3QtPndhaXRfcXVldWUsIHdhaXQpOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXBvbGxfd2FpdChmaWxlLCAmd2lpbnN0LT53YWl0X3F1ZXVlLCB3YWl0KTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKKwkJCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKKwkJCWVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSh3b2luc3QsICZieXRlc3RvY29weSk7CisKKwkJCWlmIChieXRlc3RvY29weSA+PSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0gZWxzZQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKKwkJCWVtdTEwazFfd2F2ZWluX3VwZGF0ZSh3YXZlX2Rldi0+Y2FyZCwgd2lpbnN0KTsKKwkJCWVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHdpaW5zdCwgJmJ5dGVzdG9jb3B5KTsKKworCQkJaWYgKGJ5dGVzdG9jb3B5ID49IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpCisJCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9vZnJhZyhzdHJ1Y3Qgd29pbnN0ICp3b2luc3QpCit7CisJc3RydWN0IHdhdmVvdXRfYnVmZmVyICpidWZmZXIgPSAmd29pbnN0LT5idWZmZXI7CisJdTMyIGZyYWdzaXplOworCisJaWYgKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSkKKwkJcmV0dXJuOworCisJaWYgKCFidWZmZXItPm9zc2ZyYWdzaGlmdCkgeworCQlmcmFnc2l6ZSA9ICh3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlICogd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICogV0FWRU9VVF9ERUZBVUxURlJBR0xFTikgLyAxMDAwIC0gMTsKKworCQl3aGlsZSAoZnJhZ3NpemUpIHsKKwkJCWZyYWdzaXplID4+PSAxOworCQkJYnVmZmVyLT5vc3NmcmFnc2hpZnQrKzsKKwkJfQorCX0KKworCWlmIChidWZmZXItPm9zc2ZyYWdzaGlmdCA8IFdBVkVPVVRfTUlORlJBR1NISUZUKQorCQlidWZmZXItPm9zc2ZyYWdzaGlmdCA9IFdBVkVPVVRfTUlORlJBR1NISUZUOworCisJYnVmZmVyLT5mcmFnbWVudF9zaXplID0gMSA8PCBidWZmZXItPm9zc2ZyYWdzaGlmdDsKKworCXdoaWxlIChidWZmZXItPmZyYWdtZW50X3NpemUgKiBXQVZFT1VUX01JTkZSQUdTID4gV0FWRU9VVF9NQVhCVUZTSVpFKQorCQlidWZmZXItPmZyYWdtZW50X3NpemUgPj49IDE7CisKKwkvKiBub3cgd2UgYXJlIHN1cmUgdGhhdDoKKwkgKDJeV0FWRU9VVF9NSU5GUkFHU0hJRlQpIDw9IChmcmFnbWVudF9zaXplID0gMl5uKSA8PSAoV0FWRU9VVF9NQVhCVUZTSVpFIC8gV0FWRU9VVF9NSU5GUkFHUykKKwkqLworCisJaWYgKCFidWZmZXItPm51bWZyYWdzKSB7CisJCXUzMiBudW1mcmFnczsKKworCQludW1mcmFncyA9ICh3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlICogd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICogV0FWRU9VVF9ERUZBVUxUQlVGTEVOKSAvCisJCQkgICAoYnVmZmVyLT5mcmFnbWVudF9zaXplICogMTAwMCkgLSAxOworCisJCWJ1ZmZlci0+bnVtZnJhZ3MgPSAxOworCisJCXdoaWxlIChudW1mcmFncykgeworCQkJbnVtZnJhZ3MgPj49IDE7CisJCQlidWZmZXItPm51bWZyYWdzIDw8PSAxOworCQl9CisJfQorCisJaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFT1VUX01JTkZSQUdTKQorCQlidWZmZXItPm51bWZyYWdzID0gV0FWRU9VVF9NSU5GUkFHUzsKKworCWlmIChidWZmZXItPm51bWZyYWdzICogYnVmZmVyLT5mcmFnbWVudF9zaXplID4gV0FWRU9VVF9NQVhCVUZTSVpFKQorCQlidWZmZXItPm51bWZyYWdzID0gV0FWRU9VVF9NQVhCVUZTSVpFIC8gYnVmZmVyLT5mcmFnbWVudF9zaXplOworCisJaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFT1VUX01JTkZSQUdTKQorCQlCVUcoKTsKKworCWJ1ZmZlci0+c2l6ZSA9IGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIGJ1ZmZlci0+bnVtZnJhZ3M7CisJYnVmZmVyLT5wYWdlcyA9IGJ1ZmZlci0+c2l6ZSAvIFBBR0VfU0laRSArICgoYnVmZmVyLT5zaXplICUgUEFHRV9TSVpFKSA/IDEgOiAwKTsKKworCURQRCgyLCAiIGNhbGN1bGF0ZWQgcGxheWJhY2sgZnJhZ21lbnRfc2l6ZSAtPiAlZFxuIiwgYnVmZmVyLT5mcmFnbWVudF9zaXplKTsKKwlEUEQoMiwgIiBjYWxjdWxhdGVkIHBsYXliYWNrIG51bWZyYWdzIC0+ICVkXG4iLCBidWZmZXItPm51bWZyYWdzKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2FsY3VsYXRlX2lmcmFnKHN0cnVjdCB3aWluc3QgKndpaW5zdCkKK3sKKwlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOworCXUzMiBmcmFnc2l6ZSwgYnVmc2l6ZSwgc2l6ZVs0XTsKKwlpbnQgaSwgajsKKworCWlmIChidWZmZXItPmZyYWdtZW50X3NpemUpCisJCXJldHVybjsKKworCWlmICghYnVmZmVyLT5vc3NmcmFnc2hpZnQpIHsKKwkJZnJhZ3NpemUgPSAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJzZWMgKiBXQVZFSU5fREVGQVVMVEZSQUdMRU4pIC8gMTAwMCAtIDE7CisKKwkJd2hpbGUgKGZyYWdzaXplKSB7CisJCQlmcmFnc2l6ZSA+Pj0gMTsKKwkJCWJ1ZmZlci0+b3NzZnJhZ3NoaWZ0Kys7CisJCX0KKwl9CisKKwlpZiAoYnVmZmVyLT5vc3NmcmFnc2hpZnQgPCBXQVZFSU5fTUlORlJBR1NISUZUKQorCQlidWZmZXItPm9zc2ZyYWdzaGlmdCA9IFdBVkVJTl9NSU5GUkFHU0hJRlQ7CisKKwlidWZmZXItPmZyYWdtZW50X3NpemUgPSAxIDw8IGJ1ZmZlci0+b3NzZnJhZ3NoaWZ0OworCisJd2hpbGUgKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIFdBVkVJTl9NSU5GUkFHUyA+IFdBVkVJTl9NQVhCVUZTSVpFKQorCQlidWZmZXItPmZyYWdtZW50X3NpemUgPj49IDE7CisKKwkvKiBub3cgd2UgYXJlIHN1cmUgdGhhdDoKKwkgICAoMl5XQVZFSU5fTUlORlJBR1NISUZUKSA8PSAoZnJhZ21lbnRfc2l6ZSA9IDJebikgPD0gKFdBVkVJTl9NQVhCVUZTSVpFIC8gV0FWRUlOX01JTkZSQUdTKQorICAgICAgICAqLworCisKKwlpZiAoIWJ1ZmZlci0+bnVtZnJhZ3MpCisJCWJ1ZmZlci0+bnVtZnJhZ3MgPSAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJzZWMgKiBXQVZFSU5fREVGQVVMVEJVRkxFTikgLyAoYnVmZmVyLT5mcmFnbWVudF9zaXplICogMTAwMCkgLSAxOworCisJaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFSU5fTUlORlJBR1MpCisJCWJ1ZmZlci0+bnVtZnJhZ3MgPSBXQVZFSU5fTUlORlJBR1M7CisKKwlpZiAoYnVmZmVyLT5udW1mcmFncyAqIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA+IFdBVkVJTl9NQVhCVUZTSVpFKQorCQlidWZmZXItPm51bWZyYWdzID0gV0FWRUlOX01BWEJVRlNJWkUgLyBidWZmZXItPmZyYWdtZW50X3NpemU7CisKKwlpZiAoYnVmZmVyLT5udW1mcmFncyA8IFdBVkVJTl9NSU5GUkFHUykKKwkJQlVHKCk7CisKKwlidWZzaXplID0gYnVmZmVyLT5mcmFnbWVudF9zaXplICogYnVmZmVyLT5udW1mcmFnczsKKworCS8qIHRoZSBidWZmZXIgc2l6ZSBmb3IgcmVjb3JkaW5nIGlzIHJlc3RyaWN0ZWQgdG8gY2VydGFpbiB2YWx1ZXMsIGFkanVzdCBpdCBub3cgKi8KKwlpZiAoYnVmc2l6ZSA+PSAweDEwMDAwKSB7CisJCWJ1ZmZlci0+c2l6ZSA9IDB4MTAwMDA7CisJCWJ1ZmZlci0+c2l6ZXJlZ3ZhbCA9IDB4MWY7CisJfSBlbHNlIHsKKwkJYnVmZmVyLT5zaXplID0gMDsKKwkJc2l6ZVswXSA9IDM4NDsKKwkJc2l6ZVsxXSA9IDQ0ODsKKwkJc2l6ZVsyXSA9IDUxMjsKKwkJc2l6ZVszXSA9IDY0MDsKKworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwkJCQlpZiAoYnVmc2l6ZSA+PSBzaXplW2pdKSB7CisJCQkJCWJ1ZmZlci0+c2l6ZSA9IHNpemVbal07CisJCQkJCXNpemVbal0gKj0gMjsKKwkJCQkJYnVmZmVyLT5zaXplcmVndmFsID0gaSAqIDQgKyBqICsgMTsKKwkJCQl9IGVsc2UKKwkJCQkJZ290byBleGl0bG9vcDsKKwkgICAgICBleGl0bG9vcDoKKwkJaWYgKGJ1ZmZlci0+c2l6ZSA9PSAwKSB7CisJCQlidWZmZXItPnNpemUgPSAzODQ7CisJCQlidWZmZXItPnNpemVyZWd2YWwgPSAweDAxOworCQl9CisJfQorCisJLyogYWRqdXN0IHRoZSBmcmFnbWVudCBzaXplIHNvIHRoYXQgYnVmZmVyIHNpemUgaXMgYW4gaW50ZWdlciBtdWx0aXBsZSAqLworCXdoaWxlIChidWZmZXItPnNpemUgJSBidWZmZXItPmZyYWdtZW50X3NpemUpCisJCWJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA+Pj0gMTsKKworCWJ1ZmZlci0+bnVtZnJhZ3MgPSBidWZmZXItPnNpemUgLyBidWZmZXItPmZyYWdtZW50X3NpemU7CisJYnVmZmVyLT5wYWdlcyA9ICBidWZmZXItPnNpemUgLyBQQUdFX1NJWkUgKyAoKGJ1ZmZlci0+c2l6ZSAlIFBBR0VfU0laRSkgPyAxIDogMCk7CisKKwlEUEQoMiwgIiBjYWxjdWxhdGVkIHJlY29yZGluZyBmcmFnbWVudF9zaXplIC0+ICVkXG4iLCBidWZmZXItPmZyYWdtZW50X3NpemUpOworCURQRCgyLCAiIGNhbGN1bGF0ZWQgcmVjb3JkaW5nIG51bWZyYWdzIC0+ICVkXG4iLCBidWZmZXItPm51bWZyYWdzKTsKKwlEUEQoMiwgIiBidWZmZXIgc2l6ZSByZWdpc3RlciAtPiAlIzA0eFxuIiwgYnVmZmVyLT5zaXplcmVndmFsKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZW11MTBrMV93YXZlaW5fYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKQoreworCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgcmVmZGF0YTsKKwlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OworCXUzMiBieXRlc3RvY29weTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCF3aWluc3QpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCWlmICghKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJZW11MTBrMV93YXZlaW5fdXBkYXRlKHdhdmVfZGV2LT5jYXJkLCB3aWluc3QpOworCWVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHdpaW5zdCwgJmJ5dGVzdG9jb3B5KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGJ5dGVzdG9jb3B5ID49IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIHsKKwkgCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ3aWluc3QtPndhaXRfcXVldWUpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3aWluc3QtPndhaXRfcXVldWUpOworCX0gZWxzZQorCQlEUEQoMywgIk5vdCBlbm91Z2ggdHJhbnNmZXIgc2l6ZSwgJWRcbiIsIGJ5dGVzdG9jb3B5KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZW11MTBrMV93YXZlb3V0X2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSkKK3sKKwlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIHJlZmRhdGE7CisJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKKwl1MzIgYnl0ZXN0b2NvcHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghd29pbnN0KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKKwllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOworCisJaWYgKHdvaW5zdC0+YnVmZmVyLmZpbGxfc2lsZW5jZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlKHdvaW5zdCk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGJ5dGVzdG9jb3B5ID49IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIHsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJndvaW5zdC0+d2FpdF9xdWV1ZSkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndvaW5zdC0+d2FpdF9xdWV1ZSk7CisJfSBlbHNlCisJCURQRCgzLCAiTm90IGVub3VnaCB0cmFuc2ZlciBzaXplIC0+ICVkXG4iLCBieXRlc3RvY29weSk7CisKKwlyZXR1cm47Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9hdWRpb19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBlbXUxMGsxX2F1ZGlvX3JlYWQsCisJLndyaXRlCQk9IGVtdTEwazFfYXVkaW9fd3JpdGUsCisJLnBvbGwJCT0gZW11MTBrMV9hdWRpb19wb2xsLAorCS5pb2N0bAkJPSBlbXUxMGsxX2F1ZGlvX2lvY3RsLAorCS5tbWFwCQk9IGVtdTEwazFfYXVkaW9fbW1hcCwKKwkub3BlbgkJPSBlbXUxMGsxX2F1ZGlvX29wZW4sCisJLnJlbGVhc2UJPSBlbXUxMGsxX2F1ZGlvX3JlbGVhc2UsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uaCBiL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlZTgxYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgYXVkaW8uYyAtLSAvZGV2L2RzcCBpbnRlcmZhY2UgZm9yIGVtdTEwazEgZHJpdmVyCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKiAgICAgTm92ZW1iZXIgMiwgMTk5OQkgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuZWQgdXAgdHlwZXMvbGVha3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX0FVRElPX0gKKyNkZWZpbmUgX0FVRElPX0gKKworc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZQoreworICAgICAgICBzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOworICAgICAgICBzdHJ1Y3Qgd2lpbnN0ICp3aWluc3Q7CisgICAgICAgIHN0cnVjdCB3b2luc3QgKndvaW5zdDsKKyAgICAgICAgdTE2IGVuYWJsZWJpdHM7Cit9OworCisjZW5kaWYgLyogX0FVRElPX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0NTgxNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jCkBAIC0wLDAgKzEsODMyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBzYmxpdmVfbWkuYyAtIE1JREkgVUFSVCBpbnB1dCBIQUwgZm9yIGVtdTEwazEgZHJpdmVyCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuIHVwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKworI2luY2x1ZGUgImh3YWNjZXNzLmgiCisjaW5jbHVkZSAiODAxMC5oIgorI2luY2x1ZGUgImNhcmRtaS5oIgorI2luY2x1ZGUgImlycW1nci5oIgorCisKK3N0YXRpYyBpbnQgZW11MTBrMV9tcHVpbl9jYWxsYmFjayhzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTMyIG1zZywgdW5zaWduZWQgbG9uZyBkYXRhLCB1MzIgYnl0ZXN2YWxpZCk7CisKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVJbml0KHN0cnVjdCBlbXUxMGsxX21wdWluICopOworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZUVudHJ5KHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVQYXJzZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7CitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGUoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUzQnl0ZVZlbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7CitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlMkJ5dGUoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTJCeXRlS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24yKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24yS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zVmVsKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNFeE5vcm0oc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c1JlYWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOworCisKK3N0YXRpYyBzdHJ1Y3QgeworCWludCAoKkZuKSAoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOworfSBtaWRpc3RhdGVmbltdID0geworCisJeworCXNibGl2ZV9taVN0YXRlUGFyc2V9LCB7CisJc2JsaXZlX21pU3RhdGUzQnl0ZX0sCS8qIDB4OG4sIDB4OW4sIDB4QW4sIDB4Qm4sIDB4RW4gKi8KKwl7CisJc2JsaXZlX21pU3RhdGUzQnl0ZUtleX0sCS8qIEJ5dGUgMSAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7CisJc2JsaXZlX21pU3RhdGUzQnl0ZVZlbH0sCS8qIEJ5dGUgMiAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7CisJc2JsaXZlX21pU3RhdGUyQnl0ZX0sCS8qIDB4Q24sIDB4RG4gICAgICAgICAgICAgICAgICAgKi8KKwl7CisJc2JsaXZlX21pU3RhdGUyQnl0ZUtleX0sCS8qIEJ5dGUgMSAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7CisJc2JsaXZlX21pU3RhdGVTeXNDb21tb24yfSwJLyogMHhGMSAsIDB4RjMgICAgICAgICAgICAgICAgICAqLworCXsKKwlzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjJLZXl9LAkvKiAweEYxICwgMHhGMywgQnl0ZSAxICAgICAgICAgICovCisJeworCXNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM30sCS8qIDB4RjIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7CisJc2JsaXZlX21pU3RhdGVTeXNDb21tb24zS2V5fSwJLyogMHhGMiAsIEJ5dGUgMSAgICAgICAgICAgICAgICAqLworCXsKKwlzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjNWZWx9LAkvKiAweEYyICwgQnl0ZSAyICAgICAgICAgICAgICAgICovCisJeworCXNibGl2ZV9taVN0YXRlU3lzRXhOb3JtfSwJLyogMHhGMCwgMHhGNywgTm9ybWFsIG1vZGUgICAgICAqLworCXsKKwlzYmxpdmVfbWlTdGF0ZVN5c1JlYWx9CS8qIDB4RjQgLSAweEY2ICwweEY4IC0gMHhGRiAgICAgKi8KK307CisKKworLyogSW5zdGFsbHMgdGhlIElSUSBoYW5kbGVyIGZvciB0aGUgTVBVIGluIHBvcnQgICAgICAgICAgICAgICAgICovCisKKy8qIGFuZCBpbml0aWFsaXplIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgZW11MTBrMV9tcHVpbl9vcGVuKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBtaWRpX29wZW5pbmZvICpvcGVuaW5mbykKK3sKKwlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IGNhcmQtPm1wdWluOworCisJRFBGKDIsICJlbXUxMGsxX21wdWluX29wZW5cbiIpOworCisJaWYgKCEoY2FyZF9tcHVpbi0+c3RhdHVzICYgRkxBR1NfQVZBSUxBQkxFKSkKKwkJcmV0dXJuIC0xOworCisJLyogQ29weSBvcGVuIGluZm8gYW5kIG1hcmsgY2hhbm5lbCBhcyBpbiB1c2UgKi8KKwljYXJkX21wdWluLT5vcGVuaW5mbyA9ICpvcGVuaW5mbzsKKwljYXJkX21wdWluLT5zdGF0dXMgJj0gfkZMQUdTX0FWQUlMQUJMRTsJLyogY2xlYXIgKi8KKwljYXJkX21wdWluLT5zdGF0dXMgfD0gRkxBR1NfUkVBRFk7CS8qIHNldCAqLworCWNhcmRfbXB1aW4tPnN0YXR1cyAmPSB+RkxBR1NfTUlETV9TVEFSVEVEOwkvKiBjbGVhciAqLworCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBOVUxMOworCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7CisJY2FyZF9tcHVpbi0+cWhlYWQgPSAwOworCWNhcmRfbXB1aW4tPnF0YWlsID0gMDsKKworCXNibGl2ZV9taVN0YXRlSW5pdChjYXJkX21wdWluKTsKKworCWVtdTEwazFfbXB1X3Jlc2V0KGNhcmQpOworCWVtdTEwazFfbXB1X2FjcXVpcmUoY2FyZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVtdTEwazFfbXB1aW5fY2xvc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IGNhcmQtPm1wdWluOworCisJRFBGKDIsICJlbXUxMGsxX21wdWluX2Nsb3NlKClcbiIpOworCisJLyogQ2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaW5wdXQgU3lzRXggYnVmZmVycyAqLworCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxICE9IE5VTEwpIHsKKwkJRVJST1IoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIERpc2FibGUgUlggaW50ZXJydXB0ICovCisJZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVJYRU5BQkxFIDogSU5URV9NSURJUlhFTkFCTEUpOworCisJZW11MTBrMV9tcHVfcmVsZWFzZShjYXJkKTsKKworCWNhcmRfbXB1aW4tPnN0YXR1cyB8PSBGTEFHU19BVkFJTEFCTEU7CS8qIHNldCAqLworCWNhcmRfbXB1aW4tPnN0YXR1cyAmPSB+RkxBR1NfTUlETV9TVEFSVEVEOwkvKiBjbGVhciAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIEFkZHMgTUlESSBidWZmZXIgdG8gbG9jYWwgcXVldWUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgZW11MTBrMV9tcHVpbl9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCBzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIpCit7CisJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwgImVtdTEwazFfbXB1aW5fYWRkX2J1ZmZlcigpXG4iKTsKKworCS8qIFVwZGF0ZSBNSURJIGJ1ZmZlciBmbGFncyAqLworCW1pZGloZHItPmZsYWdzIHw9IE1JRElCVUZfSU5RVUVVRTsJLyogc2V0ICovCisJbWlkaWhkci0+ZmxhZ3MgJj0gfk1JRElCVUZfRE9ORTsJLyogY2xlYXIgKi8KKworCWlmICgobWlkaXEgPSAoc3RydWN0IG1pZGlfcXVldWUgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfcXVldWUpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQkvKiBNZXNzYWdlIGxvc3QgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCW1pZGlxLT5uZXh0ID0gTlVMTDsKKwltaWRpcS0+cXR5cGUgPSAxOworCW1pZGlxLT5sZW5ndGggPSBtaWRpaGRyLT5idWZmZXJsZW5ndGg7CisJbWlkaXEtPnNpemVMZWZ0ID0gbWlkaWhkci0+YnVmZmVybGVuZ3RoOworCW1pZGlxLT5taWRpYnl0ZSA9IG1pZGloZHItPmRhdGE7CisJbWlkaXEtPnJlZmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWlkaWhkcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9PSBOVUxMKSB7CisJCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcTsKKwkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gbWlkaXE7CisJfSBlbHNlIHsKKwkJKGNhcmRfbXB1aW4tPmxhc3RtaWRpcSktPm5leHQgPSBtaWRpcTsKKwkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gbWlkaXE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEZpcnN0IHNldCB0aGUgVGltZSBTdGFtcCBpZiBNSURJIElOIGhhcyBub3Qgc3RhcnRlZC4gICAgICAgICAqLworCisvKiBUaGVuIGVuYWJsZSBSWCBJcnEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IGVtdTEwazFfbXB1aW5fc3RhcnQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IGNhcmQtPm1wdWluOworCXU4IGR1bW15OworCisJRFBGKDIsICJlbXUxMGsxX21wdWluX3N0YXJ0KClcbiIpOworCisJLyogU2V0IHRpbWVzdGFtcCBpZiBub3Qgc2V0ICovCisJaWYgKGNhcmRfbXB1aW4tPnN0YXR1cyAmIEZMQUdTX01JRE1fU1RBUlRFRCkgeworCQlEUEYoMiwgIlRpbWUgU3RhbXAgbm90IGNoYW5nZWRcbiIpOworCX0gZWxzZSB7CisJCXdoaWxlICghZW11MTBrMV9tcHVfcmVhZF9kYXRhKGNhcmQsICZkdW1teSkpOworCisJCWNhcmRfbXB1aW4tPnN0YXR1cyB8PSBGTEFHU19NSURNX1NUQVJURUQ7CS8qIHNldCAqLworCisJCS8qIFNldCBuZXcgdGltZSBzdGFtcCAqLworCQljYXJkX21wdWluLT50aW1lc3RhcnQgPSAoamlmZmllcyAqIDEwMDApIC8gSFo7CisJCURQRCgyLCAiTmV3IFRpbWUgU3RhbXAgPSAlZFxuIiwgY2FyZF9tcHVpbi0+dGltZXN0YXJ0KTsKKworCQljYXJkX21wdWluLT5xaGVhZCA9IDA7CisJCWNhcmRfbXB1aW4tPnF0YWlsID0gMDsKKworCQllbXUxMGsxX2lycV9lbmFibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElSWEVOQUJMRSA6IElOVEVfTUlESVJYRU5BQkxFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRGlzYWJsZSB0aGUgUlggSXJxLiAgSWYgYSBwYXJ0aWFsIHJlY29yZGVkIGJ1ZmZlciAgICAgICAgICAgICovCisKKy8qIGV4aXN0LCBzZW5kIGl0IHVwIHRvIElNSURJIGxldmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgZW11MTBrMV9tcHVpbl9zdG9wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKKwlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQRigyLCAiZW11MTBrMV9tcHVpbl9zdG9wKClcbiIpOworCisJZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVJYRU5BQkxFIDogSU5URV9NSURJUlhFTkFCTEUpOworCisJY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19NSURNX1NUQVJURUQ7CS8qIGNsZWFyICovCisKKwlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOworCisJCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKKwkJaWYgKG1pZGlxICE9IE5VTEwpIHsKKwkJCWlmIChtaWRpcS0+c2l6ZUxlZnQgPT0gbWlkaXEtPmxlbmd0aCkKKwkJCQltaWRpcSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7CisJCQkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPT0gTlVMTCkKKwkJCQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKKwkJCX0KKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKKworCQlpZiAobWlkaXEpIHsKKwkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOTE9OR0VSUk9SLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOworCQkJa2ZyZWUobWlkaXEpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIERpc2FibGUgdGhlIFJYIElycS4gIElmIGFueSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBleGlzdCwgc2VuZCBpdCB1cCB0byBJTUlESSBsZXZlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCBlbXUxMGsxX21wdWluX3Jlc2V0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKKwlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7CisKKwlEUEYoMiwgImVtdTEwazFfbXB1aW5fcmVzZXQoKVxuIik7CisKKwllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJUlhFTkFCTEUgOiBJTlRFX01JRElSWEVOQUJMRSk7CisKKwl3aGlsZSAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgeworCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7CisJCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKKworCQlpZiAobWlkaXEtPnNpemVMZWZ0ID09IG1pZGlxLT5sZW5ndGgpCisJCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdEQVRBLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOworCQllbHNlCisJCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdFUlJPUiwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKKworCQlrZnJlZShtaWRpcSk7CisJfQorCisJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKKwljYXJkX21wdWluLT5zdGF0dXMgJj0gfkZMQUdTX01JRE1fU1RBUlRFRDsKKworCXJldHVybiAwOworfQorCisvKiBQYXNzZXMgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQgICAgICAgICAgKi8KKworLyogdmlhIElSUSAmIERQQyBjYWxsYmFja3MgdG8gUmluZyAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgaW50IGVtdTEwazFfbXB1aW5fY2FsbGJhY2soc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHUzMiBtc2csIHVuc2lnbmVkIGxvbmcgZGF0YSwgdTMyIGJ5dGVzdmFsaWQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1laW47CisJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCXVuc2lnbmVkIGxvbmcgY2FsbGJhY2tfbXNnWzNdOworCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKKworCS8qIENhbGxlZCBkdXJpbmcgSVNSLiBUaGUgZGF0YSAmIGNvZGUgdG91Y2hlZCBhcmU6CisJICogMS4gY2FyZF9tcHVpbgorCSAqIDIuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQKKwkgKi8KKworCXRpbWVpbiA9IGNhcmRfbXB1aW4tPnRpbWVpbjsKKwlpZiAoY2FyZF9tcHVpbi0+dGltZXN0YXJ0IDw9IHRpbWVpbikKKwkJY2FsbGJhY2tfbXNnWzBdID0gdGltZWluIC0gY2FyZF9tcHVpbi0+dGltZXN0YXJ0OworCWVsc2UKKwkJY2FsbGJhY2tfbXNnWzBdID0gKH4weDBMIC0gY2FyZF9tcHVpbi0+dGltZXN0YXJ0KSArIHRpbWVpbjsKKworCWlmIChtc2cgPT0gSUNBUkRNSURJX0lOREFUQSB8fCBtc2cgPT0gSUNBUkRNSURJX0lOREFUQUVSUk9SKSB7CisJCWNhbGxiYWNrX21zZ1sxXSA9IGRhdGE7CisJCWNhbGxiYWNrX21zZ1syXSA9IGJ5dGVzdmFsaWQ7CisJCURQRCgyLCAiZW11MTBrMV9tcHVpbl9jYWxsYmFjazogbWlkaW1zZyA9ICUjbHhcbiIsIGRhdGEpOworCX0gZWxzZSB7CisJCW1pZGlxID0gKHN0cnVjdCBtaWRpX3F1ZXVlICopIGRhdGE7CisJCW1pZGloZHIgPSAoc3RydWN0IG1pZGlfaGRyICopIG1pZGlxLT5yZWZkYXRhOworCisJCWNhbGxiYWNrX21zZ1sxXSA9IG1pZGlxLT5sZW5ndGggLSBtaWRpcS0+c2l6ZUxlZnQ7CisJCWNhbGxiYWNrX21zZ1syXSA9IG1pZGlxLT5yZWZkYXRhOworCQltaWRpaGRyLT5mbGFncyAmPSB+TUlESUJVRl9JTlFVRVVFOworCQltaWRpaGRyLT5mbGFncyB8PSBNSURJQlVGX0RPTkU7CisKKwkJbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZCA9IG1pZGlxLT5sZW5ndGggLSBtaWRpcS0+c2l6ZUxlZnQ7CisJfQorCisJLyogTm90aWZ5IGNsaWVudCB0aGF0IFN5c2V4IGJ1ZmZlciBoYXMgYmVlbiBzZW50ICovCisJZW11MTBrMV9taWRpX2NhbGxiYWNrKG1zZywgY2FyZF9tcHVpbi0+b3BlbmluZm8ucmVmZGF0YSwgY2FsbGJhY2tfbXNnKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGVtdTEwazFfbXB1aW5fYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKQoreworCXU4IGRhdGE7CisJdW5zaWduZWQgaWR4OworCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gKHN0cnVjdCBlbXUxMGsxX21wdWluICopIHJlZmRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdoaWxlIChjYXJkX21wdWluLT5xaGVhZCAhPSBjYXJkX21wdWluLT5xdGFpbCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOworCQlpZHggPSBjYXJkX21wdWluLT5xaGVhZDsKKwkJZGF0YSA9IGNhcmRfbXB1aW4tPm1pZGlxW2lkeF0uZGF0YTsKKwkJY2FyZF9tcHVpbi0+dGltZWluID0gY2FyZF9tcHVpbi0+bWlkaXFbaWR4XS50aW1laW47CisJCWlkeCA9IChpZHggKyAxKSAlIE1JRElJTl9NQVhfQlVGRkVSX1NJWkU7CisJCWNhcmRfbXB1aW4tPnFoZWFkID0gaWR4OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7CisKKwkJc2JsaXZlX21pU3RhdGVFbnRyeShjYXJkX21wdWluLCBkYXRhKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qIElSUSBjYWxsYmFjayBoYW5kbGVyIHJvdXRpbmUgZm9yIHRoZSBNUFUgaW4gcG9ydCAqLworCitpbnQgZW11MTBrMV9tcHVpbl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgaWR4OworCXVuc2lnbmVkIGNvdW50OworCXU4IE1QVUl2YWx1ZTsKKwlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IGNhcmQtPm1wdWluOworCisJLyogSVJRIHNlcnZpY2Ugcm91dGluZS4gVGhlIGRhdGEgYW5kIGNvZGUgdG91Y2hlZCBhcmU6CisJICogMS4gY2FyZF9tcHVpbgorCSAqLworCisJY291bnQgPSAwOworCWlkeCA9IGNhcmRfbXB1aW4tPnF0YWlsOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKGVtdTEwazFfbXB1X3JlYWRfZGF0YShjYXJkLCAmTVBVSXZhbHVlKSA8IDApIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJKytjb3VudDsKKwkJCWNhcmRfbXB1aW4tPm1pZGlxW2lkeF0uZGF0YSA9IE1QVUl2YWx1ZTsKKwkJCWNhcmRfbXB1aW4tPm1pZGlxW2lkeF0udGltZWluID0gKGppZmZpZXMgKiAxMDAwKSAvIEhaOworCQkJaWR4ID0gKGlkeCArIDEpICUgTUlESUlOX01BWF9CVUZGRVJfU0laRTsKKwkJfQorCX0KKworCWlmIChjb3VudCkgeworCQljYXJkX21wdWluLT5xdGFpbCA9IGlkeDsKKworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZjYXJkX21wdWluLT50YXNrbGV0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgIFN1cHBvcnRpbmcgZnVuY3Rpb25zIGZvciBNaWRpLUluIEludGVycHJldGF0aW9uIFN0YXRlIE1hY2hpbmUgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWFjcm8gKi8KK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVJbml0KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluKQoreworCWNhcmRfbXB1aW4tPnN0YXR1cyA9IDA7CS8qIEZvciBNSURJIHJ1bm5pbmcgc3RhdHVzICovCisJY2FyZF9tcHVpbi0+ZnN0YXR1cyA9IDA7CS8qIEZvciAweEZuIHN0YXR1cyBvbmx5ICovCisJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1BBUlNFOworCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IFNUSU5fUEFSU0U7CisJY2FyZF9tcHVpbi0+ZGF0YSA9IDA7CisJY2FyZF9tcHVpbi0+dGltZXN0YXJ0ID0gMDsKKwljYXJkX21wdWluLT50aW1laW4gPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvICovCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlRW50cnkoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCit7CisJcmV0dXJuIG1pZGlzdGF0ZWZuW2NhcmRfbXB1aW4tPmN1cnN0YXRlXS5GbihjYXJkX21wdWluLCBkYXRhKTsKK30KKworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVBhcnNlKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQoreworCXN3aXRjaCAoZGF0YSAmIDB4ZjApIHsKKwljYXNlIDB4ODA6CisJY2FzZSAweDkwOgorCWNhc2UgMHhBMDoKKwljYXNlIDB4QjA6CisJY2FzZSAweEUwOgorCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fM0JZVEU7CisJCWJyZWFrOworCisJY2FzZSAweEMwOgorCWNhc2UgMHhEMDoKKwkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzJCWVRFOworCQlicmVhazsKKworCWNhc2UgMHhGMDoKKwkJLyogU3lzdGVtIG1lc3NhZ2VzIGRvIG5vdCBhZmZlY3QgdGhlIHByZXZpb3VzIHJ1bm5pbmcgc3RhdHVzISAqLworCQlzd2l0Y2ggKGRhdGEgJiAweDBmKSB7CisJCWNhc2UgMHgwOgorCQkJY2FyZF9tcHVpbi0+bGFzdHN0YXRlID0gY2FyZF9tcHVpbi0+Y3Vyc3RhdGU7CisJCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0VYX05PUk07CisKKwkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7CisJCQkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCisJCQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOworCQkJCSptaWRpcS0+bWlkaWJ5dGUgPSBkYXRhOworCQkJCS0tbWlkaXEtPnNpemVMZWZ0OworCQkJCSsrbWlkaXEtPm1pZGlieXRlOworCQkJfQorCisJCQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOworCisJCWNhc2UgMHg3OgorCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIDB4ZjcsIDApOworCQkJcmV0dXJuIC0xOworCisJCWNhc2UgMHgyOgorCQkJY2FyZF9tcHVpbi0+bGFzdHN0YXRlID0gY2FyZF9tcHVpbi0+Y3Vyc3RhdGU7CisJCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8zOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDE6CisJCWNhc2UgMHgzOgorCQkJY2FyZF9tcHVpbi0+bGFzdHN0YXRlID0gY2FyZF9tcHVpbi0+Y3Vyc3RhdGU7CisJCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8yOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIGluY2x1ZGVzIDB4RjQgLSAweEY2LCAweEY4IC0gMHhGRiAqLworCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUEYoMiwgIkJVRzogZGVmYXVsdCBjYXNlIGhpdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gbWlkaXN0YXRlZm5bY2FyZF9tcHVpbi0+Y3Vyc3RhdGVdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGUoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCit7CisJdTggdGVtcCA9IGRhdGEgJiAweGYwOworCisJaWYgKHRlbXAgPCAweDgwKSB7CisJCXJldHVybiBtaWRpc3RhdGVmbltTVElOXzNCWVRFX0tFWV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7CisJfSBlbHNlIGlmICh0ZW1wIDw9IDB4ZTAgJiYgdGVtcCAhPSAweGMwICYmIHRlbXAgIT0gMHhkMCkgeworCQljYXJkX21wdWluLT5zdGF0dXMgPSBkYXRhOworCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fM0JZVEVfS0VZOworCisJCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7CisJfQorCisJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fUEFSU0VdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGVLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCisvKiBieXRlIDEgKi8KK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmIChkYXRhID4gMHg3ZikgeworCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KKwkJaWYgKGRhdGEgPiAweGY3KQorCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworCisJCS8qIEludmFsaWQgZGF0YSEgKi8KKwkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKKworCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fUEFSU0U7CisJCXRtcCA9ICgodW5zaWduZWQgbG9uZykgZGF0YSkgPDwgODsKKwkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7CisKKwkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCWNhcmRfbXB1aW4tPmRhdGEgPSBkYXRhOworCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8zQllURV9WRUw7CisKKwlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGVWZWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCisvKiBieXRlIDIgKi8KK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmIChkYXRhID4gMHg3ZikgeworCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KKwkJaWYgKGRhdGEgPiAweGY3KQorCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworCisJCS8qIEludmFsaWQgZGF0YSEgKi8KKwkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKKworCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fUEFSU0U7CisJCXRtcCA9ICgodW5zaWduZWQgbG9uZykgZGF0YSkgPDwgODsKKwkJdG1wIHw9IGNhcmRfbXB1aW4tPmRhdGE7CisJCXRtcCA9IHRtcCA8PCA4OworCQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPnN0YXR1czsKKworCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzNCWVRFOworCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOworCXRtcCA9IHRtcCA8PCA4OworCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZGF0YTsKKwl0bXAgPSB0bXAgPDwgODsKKwl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPnN0YXR1czsKKworCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgdG1wLCAzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlMkJ5dGUoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCit7CisJdTggdGVtcCA9IGRhdGEgJiAweGYwOworCisJaWYgKCh0ZW1wID09IDB4YzApIHx8ICh0ZW1wID09IDB4ZDApKSB7CisJCWNhcmRfbXB1aW4tPnN0YXR1cyA9IGRhdGE7CisJCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8yQllURV9LRVk7CisKKwkJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKKwl9CisKKwlpZiAodGVtcCA8IDB4ODApCisJCXJldHVybiBtaWRpc3RhdGVmbltTVElOXzJCWVRFX0tFWV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7CisKKwlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9QQVJTRV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUyQnl0ZUtleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKKy8qIGJ5dGUgMSAqLworeworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJaWYgKGRhdGEgPiAweDdmKSB7CisJCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLworCQlpZiAoZGF0YSA+IDB4ZjcpCisJCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7CisKKwkJLyogSW52YWxpZCBkYXRhISAqLworCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOworCisJCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9QQVJTRTsKKwkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7CisJCXRtcCA9IHRtcCA8PCA4OworCQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPnN0YXR1czsKKworCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzJCWVRFOworCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOworCXRtcCA9IHRtcCA8PCA4OworCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+c3RhdHVzOworCisJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBLCB0bXAsIDIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24yKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQoreworCWNhcmRfbXB1aW4tPmZzdGF0dXMgPSBkYXRhOworCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9TWVNfQ09NTU9OXzJfS0VZOworCisJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKK30KKworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjJLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCisvKiBieXRlIDEgKi8KK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmIChkYXRhID4gMHg3ZikgeworCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KKwkJaWYgKGRhdGEgPiAweGY3KQorCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworCisJCS8qIEludmFsaWQgZGF0YSEgKi8KKwkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKKworCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKKwkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7CisJCXRtcCA9IHRtcCA8PCA4OworCQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmZzdGF0dXM7CisKKwkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOworCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOworCXRtcCA9IHRtcCA8PCA4OworCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKKworCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgdG1wLCAyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMyhzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKK3sKKwljYXJkX21wdWluLT5mc3RhdHVzID0gZGF0YTsKKwljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8zX0tFWTsKKworCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Cit9CisKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQorLyogYnl0ZSAxICovCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlpZiAoZGF0YSA+IDB4N2YpIHsKKwkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCisJCWlmIChkYXRhID4gMHhmNykKKwkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKKworCQkvKiBJbnZhbGlkIGRhdGEhICovCisJCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7CisKKwkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7CisJCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOworCQl0bXAgPSB0bXAgPDwgODsKKwkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5mc3RhdHVzOworCisJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOworCisJCXJldHVybiAtMTsKKwl9CisKKwljYXJkX21wdWluLT5kYXRhID0gZGF0YTsKKwljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8zX1ZFTDsKKworCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Cit9CisKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zVmVsKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQorLyogYnl0ZSAyICovCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlpZiAoZGF0YSA+IDB4N2YpIHsKKwkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCisJCWlmIChkYXRhID4gMHhmNykKKwkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKKworCQkvKiBJbnZhbGlkIGRhdGEhICovCisJCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7CisKKwkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7CisJCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOworCQl0bXAgPSB0bXAgPDwgODsKKwkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5kYXRhOworCQl0bXAgPSB0bXAgPDwgODsKKwkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5mc3RhdHVzOworCisJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOworCisJCXJldHVybiAtMTsKKwl9CisKKwljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKKwl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKKwl0bXAgPSB0bXAgPDwgODsKKwl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmRhdGE7CisJdG1wID0gdG1wIDw8IDg7CisJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5mc3RhdHVzOworCisJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBLCB0bXAsIDMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNFeE5vcm0oc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgoZGF0YSA+IDB4N2YpICYmIChkYXRhICE9IDB4ZjcpKSB7CisJCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLworCQlpZiAoZGF0YSA+IDB4ZjcpCisJCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7CisKKwkJLyogSW52YWxpZCBEYXRhISAqLworCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOworCisJCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOworCisJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7CisJCQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7CisKKwkJCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKKwkJCSptaWRpcS0+bWlkaWJ5dGUgPSBkYXRhOworCQkJLS1taWRpcS0+c2l6ZUxlZnQ7CisJCQkrK21pZGlxLT5taWRpYnl0ZTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKKworCQkJY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OworCQkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPT0gTlVMTCkKKwkJCQljYXJkX21wdWluLT5sYXN0bWlkaXEgPSBOVUxMOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7CisKKwkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOTE9OR0VSUk9SLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOworCisJCQlrZnJlZShtaWRpcSk7CisJCX0KKworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKKwkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCisJCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKKwkJKm1pZGlxLT5taWRpYnl0ZSA9IGRhdGE7CisJCS0tbWlkaXEtPnNpemVMZWZ0OworCQkrK21pZGlxLT5taWRpYnl0ZTsKKwl9CisKKwlpZiAoZGF0YSA9PSAweGY3KSB7CisJCS8qIEVuZCBvZiBTeXNleCBidWZmZXIgKi8KKwkJLyogU2VuZCBkb3duIHRoZSBidWZmZXIgKi8KKworCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKKworCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgeworCQkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCisJCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7CisKKwkJCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKKwkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpCisJCQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOworCisJCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdEQVRBLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOworCisJCQlrZnJlZShtaWRpcSk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgeworCQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7CisKKwkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOworCisJCWlmIChtaWRpcS0+c2l6ZUxlZnQgPT0gMCkgeworCQkJLyogU3BlY2lhbCBjYXNlICovCisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7CisKKwkJCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKKwkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpCisJCQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOworCisJCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdEQVRBLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOworCisJCQlrZnJlZShtaWRpcSk7CisKKwkJCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7CisJCX0KKwl9CisKKwlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzUmVhbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKK3sKKwllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEEsIGRhdGEsIDEpOworCisJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5oIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyYzI0MQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIHNibGl2ZV9taS5oCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuZWQgdXAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX0NBUkRNSV9ICisjZGVmaW5lIF9DQVJETUlfSAorCisjaW5jbHVkZSAiaWNhcmRtaWQuaCIKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKwordHlwZWRlZiBlbnVtCit7CisJU1RJTl9QQVJTRSA9IDAsCisJU1RJTl8zQllURSwgICAgICAgICAgICAgICAgICAgICAvKiAweDgwLCAweDkwLCAweEEwLCAweEIwLCAweEUwICovCisJU1RJTl8zQllURV9LRVksICAgICAgICAgICAgICAgICAvKiBCeXRlIDEgKi8KKwlTVElOXzNCWVRFX1ZFTCwgICAgICAgICAgICAgICAgIC8qIEJ5dGUgMSAqLworCVNUSU5fMkJZVEUsICAgICAgICAgICAgICAgICAgICAgLyogMHhDMCwgMHhEMCAqLworCVNUSU5fMkJZVEVfS0VZLCAgICAgICAgICAgICAgICAgLyogQnl0ZSAxICovCisJU1RJTl9TWVNfQ09NTU9OXzIsICAgICAgICAgICAgICAvKiAweEYxLCAweEYzICAqLworCVNUSU5fU1lTX0NPTU1PTl8yX0tFWSwKKwlTVElOX1NZU19DT01NT05fMywgICAgICAgICAgICAgIC8qIDB4RjIgKi8KKwlTVElOX1NZU19DT01NT05fM19LRVksCisJU1RJTl9TWVNfQ09NTU9OXzNfVkVMLAorCVNUSU5fU1lTX0VYX05PUk0sICAgICAgICAgICAgICAgLyogMHhGMCwgTm9ybWFsIG1vZGUgKi8KKwlTVElOX1NZU19SRUFMCit9IG1pZGlfaW5fc3RhdGU7CisKKworLyogZmxhZ3MgZm9yIGNhcmQgTUlESSBpbiBvYmplY3QgKi8KKyNkZWZpbmUgRkxBR1NfTUlETV9TVEFSVEVEICAgICAgICAgIDB4MDAwMDEwMDAgICAgICAvLyBEYXRhIGhhcyBzdGFydGVkIHRvIGNvbWUgaW4gYWZ0ZXIgTWlkbSBTdGFydAorI2RlZmluZSBNSURJSU5fTUFYX0JVRkZFUl9TSVpFICAgICAgMjAwICAgICAgICAgICAgIC8vIERlZmluaXRpb24gZm9yIHN0cnVjdCBlbXUxMGsxX21wdWluCisKK3N0cnVjdCBtaWRpX2RhdGEKK3sKKwl1OCBkYXRhOworCXUzMiB0aW1laW47Cit9OworCitzdHJ1Y3QgZW11MTBrMV9tcHVpbgoreworCXNwaW5sb2NrX3QgICAgICAgIGxvY2s7CisJc3RydWN0IG1pZGlfcXVldWUgKmZpcnN0bWlkaXE7CisJc3RydWN0IG1pZGlfcXVldWUgKmxhc3RtaWRpcTsKKwl1bnNpZ25lZCAgICAgICAgICBxaGVhZCwgcXRhaWw7CisJc3RydWN0IG1pZGlfZGF0YSAgbWlkaXFbTUlESUlOX01BWF9CVUZGRVJfU0laRV07CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7CisJc3RydWN0IG1pZGlfb3BlbmluZm8gICAgb3BlbmluZm87CisKKwkvKiBGb3IgTUlESSBzdGF0ZSBtYWNoaW5lICovCisJdTggICAgICAgICAgICAgIHN0YXR1czsgICAgICAgIC8qIEZvciBNSURJIHJ1bm5pbmcgc3RhdHVzICovCisJdTggICAgICAgICAgICAgIGZzdGF0dXM7ICAgICAgIC8qIEZvciAweEZuIHN0YXR1cyBvbmx5ICovCisJbWlkaV9pbl9zdGF0ZSAgIGN1cnN0YXRlOworCW1pZGlfaW5fc3RhdGUgICBsYXN0c3RhdGU7CisJdTMyICAgICAgICAgICAgIHRpbWVzdGFydDsKKwl1MzIgICAgICAgICAgICAgdGltZWluOworCXU4ICAgICAgICAgICAgICBkYXRhOworfTsKKworaW50IGVtdTEwazFfbXB1aW5fb3BlbihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBtaWRpX29wZW5pbmZvICopOworaW50IGVtdTEwazFfbXB1aW5fY2xvc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK2ludCBlbXUxMGsxX21wdWluX2FkZF9idWZmZXIoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgc3RydWN0IG1pZGlfaGRyICopOworaW50IGVtdTEwazFfbXB1aW5fc3RhcnQoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK2ludCBlbXUxMGsxX21wdWluX3N0b3Aoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK2ludCBlbXUxMGsxX21wdWluX3Jlc2V0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7CisKK2ludCBlbXUxMGsxX21wdWluX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK3ZvaWQgZW11MTBrMV9tcHVpbl9iaCh1bnNpZ25lZCBsb25nKTsKKworI2VuZGlmICAvKiBfQ0FSRE1JX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5jIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzOGQzMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5jCkBAIC0wLDAgKzEsMjI5IEBACisvKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIGNhcmRtby5jIC0gTUlESSBVQVJUIG91dHB1dCBIQUwgZm9yIGVtdTEwazEgZHJpdmVyIAorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKKyAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAorICogICAgIFVTQS4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgIjgwMTAuaCIKKyNpbmNsdWRlICJjYXJkbW8uaCIKKyNpbmNsdWRlICJpcnFtZ3IuaCIKKworLyogSW5zdGFsbHMgdGhlIElSUSBoYW5kbGVyIGZvciB0aGUgTVBVIG91dCBwb3J0ICAgICAgICAgICAgICAgKgorICogYW5kIGluaXRpYWxpemUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2ludCBlbXUxMGsxX21wdW91dF9vcGVuKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBtaWRpX29wZW5pbmZvICpvcGVuaW5mbykKK3sKKwlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQgKmNhcmRfbXB1b3V0ID0gY2FyZC0+bXB1b3V0OworCisJRFBGKDIsICJlbXUxMGsxX21wdW91dF9vcGVuKClcbiIpOworCisJaWYgKCEoY2FyZF9tcHVvdXQtPnN0YXR1cyAmIEZMQUdTX0FWQUlMQUJMRSkpCisJCXJldHVybiAtMTsKKworCS8qIENvcHkgb3BlbiBpbmZvIGFuZCBtYXJrIGNoYW5uZWwgYXMgaW4gdXNlICovCisJY2FyZF9tcHVvdXQtPmludHIgPSAwOworCWNhcmRfbXB1b3V0LT5vcGVuaW5mbyA9ICpvcGVuaW5mbzsKKwljYXJkX21wdW91dC0+c3RhdHVzICY9IH5GTEFHU19BVkFJTEFCTEU7CisJY2FyZF9tcHVvdXQtPmxhc3RzdGF0dXMgPSAweDgwOworCWNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID0gTlVMTDsKKwljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gTlVMTDsKKworCWVtdTEwazFfbXB1X3Jlc2V0KGNhcmQpOworCWVtdTEwazFfbXB1X2FjcXVpcmUoY2FyZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVtdTEwazFfbXB1b3V0X2Nsb3NlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKKwlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7CisJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwgImVtdTEwazFfbXB1b3V0X2Nsb3NlKClcbiIpOworCisJZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVRYRU5BQkxFIDogSU5URV9NSURJVFhFTkFCTEUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgIT0gTlVMTCkgeworCQltaWRpcSA9IGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxOworCQltaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBtaWRpcS0+cmVmZGF0YTsKKworCQljYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OworCisJCWtmcmVlKG1pZGloZHItPmRhdGEpOworCQlrZnJlZShtaWRpaGRyKTsKKwkJa2ZyZWUobWlkaXEpOworCX0KKworCWNhcmRfbXB1b3V0LT5sYXN0bWlkaXEgPSBOVUxMOworCisJZW11MTBrMV9tcHVfcmVsZWFzZShjYXJkKTsKKworCWNhcmRfbXB1b3V0LT5zdGF0dXMgfD0gRkxBR1NfQVZBSUxBQkxFOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggYnVmZmVyIHNwYWNlLCByZWplY3QgTWlkaSBCdWZmZXIuICAgICAqCisqIE90aGVyd2lzZSwgZGlzYWJsZSBUWCwgY3JlYXRlIG9iamVjdCB0byBob2xkIE1pZGkgICAgICAgICAgICAqCisqICB1ZmZlciwgdXBkYXRlIGJ1ZmZlciBmbGFncyBhbmQgb3RoZXIgcGFyYW1ldGVycyAgICAgICAgICAgICAqCisqIGJlZm9yZSBlbmFibGluZyBUWCBhZ2Fpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIpCit7CisJc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKKwlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQRigyLCAiZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcigpXG4iKTsKKworCWlmIChjYXJkX21wdW91dC0+c3RhdGUgPT0gQ0FSRE1JRElPVVRfU1RBVEVfU1VTUEVORCkKKwkJcmV0dXJuIDA7CisKKwltaWRpaGRyLT5mbGFncyB8PSBNSURJQlVGX0lOUVVFVUU7CisJbWlkaWhkci0+ZmxhZ3MgJj0gfk1JRElCVUZfRE9ORTsKKworCWlmICgobWlkaXEgPSAoc3RydWN0IG1pZGlfcXVldWUgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfcXVldWUpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkvKiBNZXNzYWdlIGxvc3QgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCW1pZGlxLT5uZXh0ID0gTlVMTDsKKwltaWRpcS0+cXR5cGUgPSAxOworCW1pZGlxLT5sZW5ndGggPSBtaWRpaGRyLT5idWZmZXJsZW5ndGg7CisJbWlkaXEtPnNpemVMZWZ0ID0gbWlkaWhkci0+YnVmZmVybGVuZ3RoOworCW1pZGlxLT5taWRpYnl0ZSA9IG1pZGloZHItPmRhdGE7CisKKwltaWRpcS0+cmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpaGRyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPT0gTlVMTCkgeworCQljYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9IG1pZGlxOworCQljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gbWlkaXE7CisJfSBlbHNlIHsKKwkJKGNhcmRfbXB1b3V0LT5sYXN0bWlkaXEpLT5uZXh0ID0gbWlkaXE7CisJCWNhcmRfbXB1b3V0LT5sYXN0bWlkaXEgPSBtaWRpcTsKKwl9CisKKwljYXJkX21wdW91dC0+aW50ciA9IDA7CisKKwllbXUxMGsxX2lycV9lbmFibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElUWEVOQUJMRSA6IElOVEVfTUlESVRYRU5BQkxFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbXUxMGsxX21wdW91dF9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgZW11MTBrMV9jYXJkICopIHJlZmRhdGE7CisJc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKKwlpbnQgY0J5dGVTZW50ID0gMDsKKwlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7CisJc3RydWN0IG1pZGlfcXVldWUgKmRvbmVxID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgIT0gTlVMTCkgeworCQltaWRpcSA9IGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxOworCisJCXdoaWxlIChjQnl0ZVNlbnQgPCA0ICYmIG1pZGlxLT5zaXplTGVmdCkgeworCQkJaWYgKGVtdTEwazFfbXB1X3dyaXRlX2RhdGEoY2FyZCwgKm1pZGlxLT5taWRpYnl0ZSkgPCAwKSB7CisJCQkJRFBGKDIsICJlbXUxMGsxX21wdW91dERwY0NhbGxiYWNrIGVycm9yISFcbiIpOworCQkJfSBlbHNlIHsKKwkJCQkrK2NCeXRlU2VudDsKKwkJCQktLW1pZGlxLT5zaXplTGVmdDsKKwkJCQkrK21pZGlxLT5taWRpYnl0ZTsKKwkJCX0KKwkJfQorCisJCWlmIChtaWRpcS0+c2l6ZUxlZnQgPT0gMCkgeworCQkJaWYgKGRvbmVxID09IE5VTEwpCisJCQkJZG9uZXEgPSBtaWRpcTsKKwkJCWNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID09IE5VTEwpCisJCWNhcmRfbXB1b3V0LT5sYXN0bWlkaXEgPSBOVUxMOworCisJaWYgKGRvbmVxICE9IE5VTEwpIHsKKwkJd2hpbGUgKGRvbmVxICE9IGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxKSB7CisJCQl1bnNpZ25lZCBsb25nIGNhbGxiYWNrX21zZ1szXTsKKworCQkJbWlkaXEgPSBkb25lcTsKKwkJCWRvbmVxID0gbWlkaXEtPm5leHQ7CisKKwkJCWlmIChtaWRpcS0+cXR5cGUpIHsKKwkJCQljYWxsYmFja19tc2dbMF0gPSAwOworCQkJCWNhbGxiYWNrX21zZ1sxXSA9IG1pZGlxLT5sZW5ndGg7CisJCQkJY2FsbGJhY2tfbXNnWzJdID0gbWlkaXEtPnJlZmRhdGE7CisKKwkJCQllbXUxMGsxX21pZGlfY2FsbGJhY2soSUNBUkRNSURJX09VVExPTkdEQVRBLCBjYXJkX21wdW91dC0+b3BlbmluZm8ucmVmZGF0YSwgY2FsbGJhY2tfbXNnKTsKKwkJCX0gZWxzZSBpZiAoKCh1OCkgbWlkaXEtPnJlZmRhdGEpIDwgMHhGMCAmJiAoKHU4KSBtaWRpcS0+cmVmZGF0YSkgPiAweDdGKQorCQkJCWNhcmRfbXB1b3V0LT5sYXN0c3RhdHVzID0gKHU4KSBtaWRpcS0+cmVmZGF0YTsKKworCQkJa2ZyZWUobWlkaXEpOworCQl9CisJfQorCisJaWYgKChjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSAhPSBOVUxMKSB8fCBjQnl0ZVNlbnQpIHsKKwkJY2FyZF9tcHVvdXQtPmludHIgPSAwOworCQllbXUxMGsxX2lycV9lbmFibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElUWEVOQUJMRSA6IElOVEVfTUlESVRYRU5BQkxFKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuOworfQorCitpbnQgZW11MTBrMV9tcHVvdXRfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXN0cnVjdCBlbXUxMGsxX21wdW91dCAqY2FyZF9tcHVvdXQgPSBjYXJkLT5tcHVvdXQ7CisKKwlEUEYoNCwgImVtdTEwazFfbXB1b3V0X2lycWhhbmRsZXJcbiIpOworCisJY2FyZF9tcHVvdXQtPmludHIgPSAxOworCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElUWEVOQUJMRSA6IElOVEVfTUlESVRYRU5BQkxFKTsKKworCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmNhcmRfbXB1b3V0LT50YXNrbGV0KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmggYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDI2ZWIzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgY2FyZG1vLmgKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveAkgICAgY2xlYW5lZCB1cAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfQ0FSRE1PX0gKKyNkZWZpbmUgX0NBUkRNT19ICisKKyNpbmNsdWRlICJpY2FyZG1pZC5oIgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjZGVmaW5lIENBUkRNSURJT1VUX1NUQVRFX0RFRkFVTFQgICAgMHgwMDAwMDAwMAorI2RlZmluZSBDQVJETUlESU9VVF9TVEFURV9TVVNQRU5EICAgIDB4MDAwMDAwMDEKKworc3RydWN0IGVtdTEwazFfbXB1b3V0Cit7CisJdTMyCQkJc3RhdHVzOworCXUzMgkJCXN0YXRlOworCXZvbGF0aWxlIGludAkJaW50cjsKKwlzdHJ1Y3QgbWlkaV9xdWV1ZQkqZmlyc3RtaWRpcTsKKwlzdHJ1Y3QgbWlkaV9xdWV1ZQkqbGFzdG1pZGlxOworCXU4CQkJbGFzdHN0YXR1czsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCXRhc2tsZXQ7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgbWlkaV9vcGVuaW5mbwlvcGVuaW5mbzsKK307CisKK2ludCBlbXUxMGsxX21wdW91dF9vcGVuKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IG1pZGlfb3BlbmluZm8gKik7CitpbnQgZW11MTBrMV9tcHVvdXRfY2xvc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK2ludCBlbXUxMGsxX21wdW91dF9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IG1pZGlfaGRyICopOworCitpbnQgZW11MTBrMV9tcHVvdXRfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwordm9pZCBlbXUxMGsxX21wdW91dF9iaCh1bnNpZ25lZCBsb25nKTsKKworI2VuZGlmICAvKiBfQ0FSRE1PX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5jIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiZjQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5jCkBAIC0wLDAgKzEsMzczIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBjYXJkd2kuYyAtIFBDTSBpbnB1dCBIQUwgZm9yIGVtdTEwazEgZHJpdmVyCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgImh3YWNjZXNzLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKyNpbmNsdWRlICJyZWNtZ3IuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImNhcmR3aS5oIgorCisvKioKKyAqIHF1ZXJ5X2Zvcm1hdCAtIHJldHVybnMgYSB2YWxpZCBzb3VuZCBmb3JtYXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgdmFsaWQgc291bmQgZm9ybWF0IGFzIGNsb3NlCisgKiB0byB0aGUgcmVxdWVzdGVkIG9uZSBhcyBwb3NzaWJsZS4gCisgKi8KK3N0YXRpYyB2b2lkIHF1ZXJ5X2Zvcm1hdChpbnQgcmVjc3JjLCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKndhdmVfZm10KQoreworCisJc3dpdGNoIChyZWNzcmMpIHsKKwljYXNlIFdBVkVSRUNPUkRfQUM5NzoKKworCQlpZiAoKHdhdmVfZm10LT5jaGFubmVscyAhPSAxKSAmJiAod2F2ZV9mbXQtPmNoYW5uZWxzICE9IDIpKQorCQkJd2F2ZV9mbXQtPmNoYW5uZWxzID0gMjsKKworCQlpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHhCQjgwICsgMHhBQzQ0KSAvIDIpCisJCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHhCQjgwOworCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweEFDNDQgKyAweDdEMDApIC8gMikKKwkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweEFDNDQ7CisJCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4N0QwMCArIDB4NURDMCkgLyAyKQorCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4N0QwMDsKKwkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHg1REMwICsgMHg1NjIyKSAvIDIpCisJCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHg1REMwOworCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweDU2MjIgKyAweDNFODApIC8gMikKKwkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDU2MjI7CisJCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4M0U4MCArIDB4MkIxMSkgLyAyKQorCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4M0U4MDsKKwkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHgyQjExICsgMHgxRjQwKSAvIDIpCisJCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHgyQjExOworCQllbHNlCisJCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHgxRjQwOworCisJCXN3aXRjaCAod2F2ZV9mbXQtPmlkKSB7CisJCWNhc2UgQUZNVF9TMTZfTEU6CisJCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKKwkJCWJyZWFrOworCQljYXNlIEFGTVRfVTg6CisJCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSA4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl3YXZlX2ZtdC0+aWQgPSBBRk1UX1MxNl9MRTsKKwkJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKworCS8qIHRoZXNlIGNhbid0IGJlIGNoYW5nZWQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVzICovCisJY2FzZSBXQVZFUkVDT1JEX01JQzoKKwljYXNlIFdBVkVSRUNPUkRfRlg6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCXdhdmVfZm10LT5ieXRlc3BlcmNoYW5uZWwgPSB3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPj4gMzsKKwl3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGUgPSB3YXZlX2ZtdC0+Y2hhbm5lbHMgKiB3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsOworCXdhdmVfZm10LT5ieXRlc3BlcnNlYyA9IHdhdmVfZm10LT5ieXRlc3BlcnNhbXBsZSAqIHdhdmVfZm10LT5zYW1wbGluZ3JhdGU7CisJd2F2ZV9mbXQtPmJ5dGVzcGVydm9pY2VzYW1wbGUgPSB3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGU7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpCit7CisJYnVmZmVyLT5hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgYnVmZmVyLT5zaXplICogYnVmZmVyLT5jb3YsCisJCQkJCSAgICAmYnVmZmVyLT5kbWFfaGFuZGxlKTsKKwlpZiAoYnVmZmVyLT5hZGRyID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQoreworCWlmIChidWZmZXItPmFkZHIgIT0gTlVMTCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBidWZmZXItPnNpemUgKiBidWZmZXItPmNvdiwKKwkJCQkgICAgYnVmZmVyLT5hZGRyLCBidWZmZXItPmRtYV9oYW5kbGUpOworfQorCitpbnQgZW11MTBrMV93YXZlaW5fb3BlbihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7CisJc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKKwlzdHJ1Y3Qgd2lpbnN0ICoqd2lpbnN0X3RtcCA9IE5VTEw7CisJdTE2IGRlbGF5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwgImVtdTEwazFfd2F2ZWluX29wZW4oKVxuIik7CisKKwlzd2l0Y2ggKHdpaW5zdC0+cmVjc3JjKSB7CisJY2FzZSBXQVZFUkVDT1JEX0FDOTc6CisJCXdpaW5zdF90bXAgPSAmY2FyZC0+d2F2ZWluLmFjOTc7CisJCWJyZWFrOworCWNhc2UgV0FWRVJFQ09SRF9NSUM6CisJCXdpaW5zdF90bXAgPSAmY2FyZC0+d2F2ZWluLm1pYzsKKwkJYnJlYWs7CisJY2FzZSBXQVZFUkVDT1JEX0ZYOgorCQl3aWluc3RfdG1wID0gJmNhcmQtPndhdmVpbi5meDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJaWYgKCp3aWluc3RfdG1wICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJKndpaW5zdF90bXAgPSB3aWluc3Q7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJLyogaGFuZGxlIDggYml0IHJlY29yZGluZyAqLworCWlmICh3aWluc3QtPmZvcm1hdC5ieXRlc3BlcmNoYW5uZWwgPT0gMSkgeworCQlpZiAod2lpbnN0LT5idWZmZXIuc2l6ZSA+IDB4ODAwMCkgeworCQkJd2lpbnN0LT5idWZmZXIuc2l6ZSA9IDB4ODAwMDsKKwkJCXdpaW5zdC0+YnVmZmVyLnNpemVyZWd2YWwgPSAweDFmOworCQl9IGVsc2UKKwkJCXdpaW5zdC0+YnVmZmVyLnNpemVyZWd2YWwgKz0gNDsKKworCQl3aWluc3QtPmJ1ZmZlci5jb3YgPSAyOworCX0gZWxzZQorCQl3aWluc3QtPmJ1ZmZlci5jb3YgPSAxOworCisJaWYgKGFsbG9jX2J1ZmZlcihjYXJkLCAmd2lpbnN0LT5idWZmZXIpIDwgMCkgeworCQlFUlJPUigpOworCQlyZXR1cm4gLTE7CisJfQorCisJZW11MTBrMV9zZXRfcmVjb3JkX3NyYyhjYXJkLCB3aWluc3QpOworCisJZW11MTBrMV9yZXNldF9yZWNvcmQoY2FyZCwgJndpaW5zdC0+YnVmZmVyKTsKKworCXdpaW5zdC0+YnVmZmVyLmh3X3BvcyA9IDA7CisJd2lpbnN0LT5idWZmZXIucG9zID0gMDsKKwl3aWluc3QtPmJ1ZmZlci5ieXRlc3RvY29weSA9IDA7CisKKwlkZWxheSA9ICg0ODAwMCAqIHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIC8gd2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJzZWM7CisKKwllbXUxMGsxX3RpbWVyX2luc3RhbGwoY2FyZCwgJndpaW5zdC0+dGltZXIsIGRlbGF5IC8gMik7CisKKwl3aWluc3QtPnN0YXRlID0gV0FWRV9TVEFURV9PUEVOOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW11MTBrMV93YXZlaW5fY2xvc2Uoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQRigyLCAiZW11MTBrMV93YXZlaW5fY2xvc2UoKVxuIik7CisKKwllbXUxMGsxX3dhdmVpbl9zdG9wKHdhdmVfZGV2KTsKKworCWVtdTEwazFfdGltZXJfdW5pbnN0YWxsKGNhcmQsICZ3aWluc3QtPnRpbWVyKTsKKworCWZyZWVfYnVmZmVyKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCXN3aXRjaCAod2F2ZV9kZXYtPndpaW5zdC0+cmVjc3JjKSB7CisJY2FzZSBXQVZFUkVDT1JEX0FDOTc6CisJCWNhcmQtPndhdmVpbi5hYzk3ID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBXQVZFUkVDT1JEX01JQzoKKwkJY2FyZC0+d2F2ZWluLm1pYyA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgV0FWRVJFQ09SRF9GWDoKKwkJY2FyZC0+d2F2ZWluLmZ4ID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwl3aWluc3QtPnN0YXRlID0gV0FWRV9TVEFURV9DTE9TRUQ7Cit9CisKK3ZvaWQgZW11MTBrMV93YXZlaW5fc3RhcnQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisKKwlEUEYoMiwgImVtdTEwazFfd2F2ZWluX3N0YXJ0KClcbiIpOworCisJZW11MTBrMV9zdGFydF9yZWNvcmQoY2FyZCwgJndpaW5zdC0+YnVmZmVyKTsKKwllbXUxMGsxX3RpbWVyX2VuYWJsZSh3YXZlX2Rldi0+Y2FyZCwgJndpaW5zdC0+dGltZXIpOworCisJd2lpbnN0LT5zdGF0ZSB8PSBXQVZFX1NUQVRFX1NUQVJURUQ7Cit9CisKK3ZvaWQgZW11MTBrMV93YXZlaW5fc3RvcChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7CisJc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKKworCURQRigyLCAiZW11MTBrMV93YXZlaW5fc3RvcCgpXG4iKTsKKworCWlmICghKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKQorCQlyZXR1cm47CisKKwllbXUxMGsxX3RpbWVyX2Rpc2FibGUoY2FyZCwgJndpaW5zdC0+dGltZXIpOworCWVtdTEwazFfc3RvcF9yZWNvcmQoY2FyZCwgJndpaW5zdC0+YnVmZmVyKTsKKworCXdpaW5zdC0+c3RhdGUgJj0gfldBVkVfU1RBVEVfU1RBUlRFRDsKK30KKworaW50IGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2Rldiwgc3RydWN0IHdhdmVfZm9ybWF0ICpmb3JtYXQpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisJdTE2IGRlbGF5OworCisJRFBGKDIsICJlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQoKVxuIik7CisKKwlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKKwkJcmV0dXJuIC0xOworCisJcXVlcnlfZm9ybWF0KHdpaW5zdC0+cmVjc3JjLCBmb3JtYXQpOworCisJaWYgKCh3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgIT0gZm9ybWF0LT5zYW1wbGluZ3JhdGUpCisJICAgIHx8ICh3aWluc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCAhPSBmb3JtYXQtPmJpdHNwZXJjaGFubmVsKQorCSAgICB8fCAod2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgIT0gZm9ybWF0LT5jaGFubmVscykpIHsKKworCQl3aWluc3QtPmZvcm1hdCA9ICpmb3JtYXQ7CisKKwkJaWYgKHdpaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpCisJCQlyZXR1cm4gMDsKKworCQl3aWluc3QtPmJ1ZmZlci5zaXplICo9IHdpaW5zdC0+YnVmZmVyLmNvdjsKKworCQlpZiAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJjaGFubmVsID09IDEpIHsKKwkJCXdpaW5zdC0+YnVmZmVyLmNvdiA9IDI7CisJCQl3aWluc3QtPmJ1ZmZlci5zaXplIC89IHdpaW5zdC0+YnVmZmVyLmNvdjsKKwkJfSBlbHNlCisJCQl3aWluc3QtPmJ1ZmZlci5jb3YgPSAxOworCisJCWVtdTEwazFfdGltZXJfdW5pbnN0YWxsKGNhcmQsICZ3aWluc3QtPnRpbWVyKTsKKworCQlkZWxheSA9ICg0ODAwMCAqIHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIC8gd2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJzZWM7CisKKwkJZW11MTBrMV90aW1lcl9pbnN0YWxsKGNhcmQsICZ3aWluc3QtPnRpbWVyLCBkZWxheSAvIDIpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHN0cnVjdCB3aWluc3QgKndpaW5zdCwgdTMyICogc2l6ZSkKK3sKKwlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOworCisJKnNpemUgPSBidWZmZXItPmJ5dGVzdG9jb3B5OworCisJaWYgKHdpaW5zdC0+bW1hcHBlZCkKKwkJcmV0dXJuOworCisJaWYgKCpzaXplID4gYnVmZmVyLT5zaXplKSB7CisJCSpzaXplID0gYnVmZmVyLT5zaXplOworCQlidWZmZXItPnBvcyA9IGJ1ZmZlci0+aHdfcG9zOworCQlidWZmZXItPmJ5dGVzdG9jb3B5ID0gYnVmZmVyLT5zaXplOworCQlEUEYoMSwgImJ1ZmZlciBvdmVycnVuXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfYmxvY2sodTggX191c2VyICpkc3QsIHU4ICogc3JjLCB1MzIgc3RyLCB1MzIgbGVuLCB1OCBjb3YpCit7CisJaWYgKGNvdiA9PSAxKQorCQlfX2NvcHlfdG9fdXNlcihkc3QsIHNyYyArIHN0ciwgbGVuKTsKKwllbHNlIHsKKwkJdTggYnl0ZTsKKwkJdTMyIGk7CisKKwkJc3JjICs9IDEgKyAyICogc3RyOworCisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJYnl0ZSA9IHNyY1syICogaV0gXiAweDgwOworCQkJX19jb3B5X3RvX3VzZXIoZHN0ICsgaSwgJmJ5dGUsIDEpOworCQl9CisJfQorfQorCit2b2lkIGVtdTEwazFfd2F2ZWluX3hmZXJkYXRhKHN0cnVjdCB3aWluc3QgKndpaW5zdCwgdTggX191c2VyICpkYXRhLCB1MzIgKiBzaXplKQoreworCXN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIgPSAmd2lpbnN0LT5idWZmZXI7CisJdTMyIHNpemV0b2NvcHksIHNpemV0b2NvcHlfbm93LCBzdGFydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2l6ZXRvY29weSA9IG1pbl90KHUzMiwgYnVmZmVyLT5zaXplLCAqc2l6ZSk7CisJKnNpemUgPSBzaXpldG9jb3B5OworCisJaWYgKCFzaXpldG9jb3B5KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJc3RhcnQgPSBidWZmZXItPnBvczsKKwlidWZmZXItPnBvcyArPSBzaXpldG9jb3B5OworCWJ1ZmZlci0+cG9zICU9IGJ1ZmZlci0+c2l6ZTsKKwlidWZmZXItPmJ5dGVzdG9jb3B5IC09IHNpemV0b2NvcHk7CisJc2l6ZXRvY29weV9ub3cgPSBidWZmZXItPnNpemUgLSBzdGFydDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNpemV0b2NvcHkgPiBzaXpldG9jb3B5X25vdykgeworCQlzaXpldG9jb3B5IC09IHNpemV0b2NvcHlfbm93OworCisJCWNvcHlfYmxvY2soZGF0YSwgYnVmZmVyLT5hZGRyLCBzdGFydCwgc2l6ZXRvY29weV9ub3csIGJ1ZmZlci0+Y292KTsKKwkJY29weV9ibG9jayhkYXRhICsgc2l6ZXRvY29weV9ub3csIGJ1ZmZlci0+YWRkciwgMCwgc2l6ZXRvY29weSwgYnVmZmVyLT5jb3YpOworCX0gZWxzZSB7CisJCWNvcHlfYmxvY2soZGF0YSwgYnVmZmVyLT5hZGRyLCBzdGFydCwgc2l6ZXRvY29weSwgYnVmZmVyLT5jb3YpOworCX0KK30KKwordm9pZCBlbXUxMGsxX3dhdmVpbl91cGRhdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdpaW5zdCAqd2lpbnN0KQoreworCXUzMiBod19wb3M7CisJdTMyIGRpZmY7CisKKwkvKiBUaGVyZSBpcyBubyBhY3R1YWwgc3RhcnQgeWV0ICovCisJaWYgKCEod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkpIHsKKwkJaHdfcG9zID0gd2lpbnN0LT5idWZmZXIuaHdfcG9zOworCX0gZWxzZSB7CisJCS8qIGh3X3BvcyBpbiBieXRlIHVuaXRzICovCisJCWh3X3BvcyA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIHdpaW5zdC0+YnVmZmVyLmlkeHJlZywgMCkgLyB3aWluc3QtPmJ1ZmZlci5jb3Y7CisJfQorCisJZGlmZiA9ICh3aWluc3QtPmJ1ZmZlci5zaXplICsgaHdfcG9zIC0gd2lpbnN0LT5idWZmZXIuaHdfcG9zKSAlIHdpaW5zdC0+YnVmZmVyLnNpemU7CisJd2lpbnN0LT50b3RhbF9yZWNvcmRlZCArPSBkaWZmOworCXdpaW5zdC0+YnVmZmVyLmJ5dGVzdG9jb3B5ICs9IGRpZmY7CisKKwl3aWluc3QtPmJ1ZmZlci5od19wb3MgPSBod19wb3M7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1Y2ZiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuaApAQCAtMCwwICsxLDkxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBjYXJkd2kuaCAtLSBoZWFkZXIgZmlsZSBmb3IgY2FyZCB3YXZlIGlucHV0IGZ1bmN0aW9ucworICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpZm5kZWYgX0NBUkRXSV9ICisjZGVmaW5lIF9DQVJEV0lfSAorCisjaW5jbHVkZSAiaWNhcmR3YXYuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgInRpbWVyLmgiCisKK3N0cnVjdCB3YXZlaW5fYnVmZmVyIHsKKwl1MTYgb3NzZnJhZ3NoaWZ0OworICAgICAgICB1MzIgZnJhZ21lbnRfc2l6ZTsKKyAgICAgICAgdTMyIG51bWZyYWdzOworCXUzMiBod19wb3M7CQkvKiBoYXJkd2FyZSBjdXJzb3IgcG9zaXRpb24gKi8KKwl1MzIgcG9zOwkJLyogc29mdHdhcmUgY3Vyc29yIHBvc2l0aW9uICovCisJdTMyIGJ5dGVzdG9jb3B5OwkvKiBieXRlcyBvZiByZWNvcmRlZCBkYXRhIGF2YWlsYWJsZSAqLworCXUzMiBzaXplOworCXUzMiBwYWdlczsKKwl1MzIgc2l6ZXJlZzsKKwl1MzIgc2l6ZXJlZ3ZhbDsKKyAgICAgICAgdTMyIGFkZHJyZWc7CisgICAgICAgIHUzMiBpZHhyZWc7CisgICAgICAgIHUzMiBhZGNjdGw7CisJdm9pZCAqYWRkcjsKKwl1OCBjb3Y7CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwkKK307CisKK3N0cnVjdCB3aWluc3QKK3sKKwl1OCBzdGF0ZTsKKwlzdHJ1Y3QgZW11X3RpbWVyIHRpbWVyOworCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7CisJc3RydWN0IHdhdmVpbl9idWZmZXIgYnVmZmVyOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CisJdTggbW1hcHBlZDsKKwl1MzIgdG90YWxfcmVjb3JkZWQ7CS8qIHRvdGFsIGJ5dGVzIHJlYWQoKSBmcm9tIGRldmljZSAqLworCXUzMiBibG9ja3M7CisJc3BpbmxvY2tfdCBsb2NrOworCXU4IHJlY3NyYzsKKwl1MTYgZnh3YzsKK307CisKKyNkZWZpbmUgV0FWRUlOX01BWEJVRlNJWkUJNjU1MzYKKyNkZWZpbmUgV0FWRUlOX01JTkJVRlNJWkUJMzY4CisKKyNkZWZpbmUgV0FWRUlOX0RFRkFVTFRGUkFHTEVOCTEwMCAKKyNkZWZpbmUgV0FWRUlOX0RFRkFVTFRCVUZMRU4JMTAwMAorCisjZGVmaW5lIFdBVkVJTl9NSU5GUkFHU0hJRlQJOCAKKyNkZWZpbmUgV0FWRUlOX01JTkZSQUdTCQkyCisKK2ludCBlbXUxMGsxX3dhdmVpbl9vcGVuKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Cit2b2lkIGVtdTEwazFfd2F2ZWluX2Nsb3NlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Cit2b2lkIGVtdTEwazFfd2F2ZWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Cit2b2lkIGVtdTEwazFfd2F2ZWluX3N0b3Aoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKK3ZvaWQgZW11MTBrMV93YXZlaW5fZ2V0eGZlcnNpemUoc3RydWN0IHdpaW5zdCAqLCB1MzIgKik7Cit2b2lkIGVtdTEwazFfd2F2ZWluX3hmZXJkYXRhKHN0cnVjdCB3aWluc3QgKiwgdTggX191c2VyICosIHUzMiAqKTsKK2ludCBlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqLCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKik7Cit2b2lkIGVtdTEwazFfd2F2ZWluX3VwZGF0ZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB3aWluc3QgKik7CisKKworI2VuZGlmIC8qIF9DQVJEV0lfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRhY2E0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmMKQEAgLTAsMCArMSw2NDMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIGNhcmR3by5jIC0gUENNIG91dHB1dCBIQUwgZm9yIGVtdTEwazEgZHJpdmVyCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgImh3YWNjZXNzLmgiCisjaW5jbHVkZSAiODAxMC5oIgorI2luY2x1ZGUgInZvaWNlbWdyLmgiCisjaW5jbHVkZSAiY2FyZHdvLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKworc3RhdGljIHUzMiBzYW1wbGVyYXRlX3RvX2xpbmVhcnBpdGNoKHUzMiBzYW1wbGluZ3JhdGUpCit7CisJc2FtcGxpbmdyYXRlID0gKHNhbXBsaW5ncmF0ZSA8PCA4KSAvIDM3NTsKKwlyZXR1cm4gKHNhbXBsaW5ncmF0ZSA+PiAxKSArIChzYW1wbGluZ3JhdGUgJiAxKTsKK30KKworc3RhdGljIHZvaWQgcXVlcnlfZm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2LCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKndhdmVfZm10KQoreworCWludCBpLCBqLCBkb19wYXNzdGhyb3VnaCA9IDAsIGlzX2FjMyA9IDA7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7CisKKwlpZiAoKHdhdmVfZm10LT5jaGFubmVscyA+IDIpICYmICh3YXZlX2ZtdC0+aWQgIT0gQUZNVF9TMTZfTEUpICYmICh3YXZlX2ZtdC0+aWQgIT0gQUZNVF9VOCkpCisJCXdhdmVfZm10LT5jaGFubmVscyA9IDI7CisKKwlpZiAoKHdhdmVfZm10LT5jaGFubmVscyA8IDEpIHx8ICh3YXZlX2ZtdC0+Y2hhbm5lbHMgPiBXQVZFT1VUX01BWFZPSUNFUykpCisJCXdhdmVfZm10LT5jaGFubmVscyA9IDI7CisKKwlpZiAod2F2ZV9mbXQtPmNoYW5uZWxzID09IDIpCisJCXdvaW5zdC0+bnVtX3ZvaWNlcyA9IDE7CisJZWxzZQorCQl3b2luc3QtPm51bV92b2ljZXMgPSB3YXZlX2ZtdC0+Y2hhbm5lbHM7CisKKwlpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAweDJlZTAwKQorCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHgyZWUwMDsKKworCXdhdmVfZm10LT5wYXNzdGhyb3VnaCA9IDA7CisJZG9fcGFzc3Rocm91Z2ggPSBpc19hYzMgPSAwOworCisJaWYgKGNhcmQtPnB0LnNlbGVjdGVkKQorCQlkb19wYXNzdGhyb3VnaCA9IDE7CisKKwlzd2l0Y2ggKHdhdmVfZm10LT5pZCkgeworCWNhc2UgQUZNVF9TMTZfTEU6CisJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OworCQlicmVhazsKKwljYXNlIEFGTVRfVTg6CisJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDg7CisJCWJyZWFrOworCWNhc2UgQUZNVF9BQzM6CisJCWRvX3Bhc3N0aHJvdWdoID0gMTsKKwkJaXNfYWMzID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJd2F2ZV9mbXQtPmlkID0gQUZNVF9TMTZfTEU7CisJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OworCQlicmVhazsKKwl9CQorCWlmIChkb19wYXNzdGhyb3VnaCkgeworCQkvKiBjdXJyZW50bHkgb25seSBvbmUgd2F2ZW91dCBpbnN0YW5jZSBtYXkgdXNlIHBhc3MtdGhyb3VnaCAqLworCQlpZiAod29pbnN0LT5zdGF0ZSAhPSBXQVZFX1NUQVRFX0NMT1NFRCB8fCAKKwkJICAgIGNhcmQtPnB0LnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFIHx8CisJCSAgICAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSAhPSA0ODAwMCAmJiAhaXNfYWMzKSkgeworCQkJRFBGKDIsICJ1bmFibGUgdG8gc2V0IHBhc3MtdGhyb3VnaCBtb2RlXG4iKTsKKwkJfSBlbHNlIGlmIChVU0VfUFRfTUVUSE9EMSkgeworCQkJaSA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCBjYXJkLT5wdC5wYXRjaF9uYW1lLCBjYXJkLT5wdC5pbnRyX2dwcl9uYW1lKTsKKwkJCWogPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgY2FyZC0+cHQucGF0Y2hfbmFtZSwgY2FyZC0+cHQuZW5hYmxlX2dwcl9uYW1lKTsKKwkJCWlmIChpIDwgMCB8fCBqIDwgMCkKKwkJCQlEUEYoMiwgInVuYWJsZSB0byBzZXQgcGFzcy10aHJvdWdoIG1vZGVcbiIpOworCQkJZWxzZSB7CisJCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDQ4MDAwOworCQkJCXdhdmVfZm10LT5jaGFubmVscyA9IDI7CisJCQkJY2FyZC0+cHQucG9zX2dwciA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCBjYXJkLT5wdC5wYXRjaF9uYW1lLAorCQkJCQkJCQkJICAgIGNhcmQtPnB0LnBvc19ncHJfbmFtZSk7CisJCQkJd2F2ZV9mbXQtPnBhc3N0aHJvdWdoID0gMTsKKwkJCQljYXJkLT5wdC5pbnRyX2dwciA9IGk7CisJCQkJY2FyZC0+cHQuZW5hYmxlX2dwciA9IGo7CisJCQkJY2FyZC0+cHQuc3RhdGUgPSBQVF9TVEFURV9JTkFDVElWRTsKKwkJCQorCQkJCURQRCgyLCAiaXNfYWMzIGlzICVkXG4iLCBpc19hYzMpOworCQkJCWNhcmQtPnB0LmFjM2RhdGEgPSBpc19hYzM7CisJCQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gMTY7CisJCQl9CisJCX1lbHNleworCQkJRFBGKDIsICJVc2luZyBQYXNzdGhyb3VnaCBNZXRob2QgMlxuIik7CisJCQljYXJkLT5wdC5lbmFibGVfZ3ByID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIGNhcmQtPnB0LnBhdGNoX25hbWUsCisJCQkJCQkJCSAgICAgICBjYXJkLT5wdC5lbmFibGVfZ3ByX25hbWUpOworCQkJd2F2ZV9mbXQtPnBhc3N0aHJvdWdoID0gMjsKKwkJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OworCQl9CisJfQorCisJd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbCA9IHdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA+PiAzOworCXdhdmVfZm10LT5ieXRlc3BlcnNhbXBsZSA9IHdhdmVfZm10LT5jaGFubmVscyAqIHdhdmVfZm10LT5ieXRlc3BlcmNoYW5uZWw7CisJd2F2ZV9mbXQtPmJ5dGVzcGVyc2VjID0gd2F2ZV9mbXQtPmJ5dGVzcGVyc2FtcGxlICogd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZTsKKworCWlmICh3YXZlX2ZtdC0+Y2hhbm5lbHMgPT0gMikKKwkJd2F2ZV9mbXQtPmJ5dGVzcGVydm9pY2VzYW1wbGUgPSB3YXZlX2ZtdC0+Y2hhbm5lbHMgKiB3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsOworCWVsc2UKKwkJd2F2ZV9mbXQtPmJ5dGVzcGVydm9pY2VzYW1wbGUgPSB3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsOworfQorCitzdGF0aWMgaW50IGdldF92b2ljZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd29pbnN0ICp3b2luc3QsIHVuc2lnbmVkIGludCB2b2ljZW51bSkKK3sKKwlzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSA9ICZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXTsKKworCS8qIEFsbG9jYXRlIHZvaWNlcyBoZXJlLCBpZiBubyB2b2ljZXMgYXZhaWxhYmxlLCByZXR1cm4gZXJyb3IuICovCisKKwl2b2ljZS0+dXNhZ2UgPSBWT0lDRV9VU0FHRV9QTEFZQkFDSzsKKworCXZvaWNlLT5mbGFncyA9IDA7CisKKwlpZiAod29pbnN0LT5mb3JtYXQuY2hhbm5lbHMgPT0gMikKKwkJdm9pY2UtPmZsYWdzIHw9IFZPSUNFX0ZMQUdTX1NURVJFTzsKKworCWlmICh3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9PSAxNikKKwkJdm9pY2UtPmZsYWdzIHw9IFZPSUNFX0ZMQUdTXzE2QklUOworCisJaWYgKGVtdTEwazFfdm9pY2VfYWxsb2MoY2FyZCwgdm9pY2UpIDwgMCkgeworCQl2b2ljZS0+dXNhZ2UgPSBWT0lDRV9VU0FHRV9GUkVFOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2FsY3VsYXRlIHBpdGNoICovCisJdm9pY2UtPmluaXRpYWxfcGl0Y2ggPSAodTE2KSAoc3JUb1BpdGNoKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSkgPj4gOCk7CisJdm9pY2UtPnBpdGNoX3RhcmdldCA9IHNhbXBsZXJhdGVfdG9fbGluZWFycGl0Y2god29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlKTsKKworCURQRCgyLCAiSW5pdGlhbCBwaXRjaCAtLT4gJSN4XG4iLCB2b2ljZS0+aW5pdGlhbF9waXRjaCk7CisKKwl2b2ljZS0+c3RhcnRsb29wID0gKHZvaWNlLT5tZW0uZW11cGFnZWluZGV4IDw8IDEyKSAvCisJIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7CisJdm9pY2UtPmVuZGxvb3AgPSB2b2ljZS0+c3RhcnRsb29wICsgd29pbnN0LT5idWZmZXIuc2l6ZSAvIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7CisJdm9pY2UtPnN0YXJ0ID0gdm9pY2UtPnN0YXJ0bG9vcDsKKworCQorCXZvaWNlLT5wYXJhbXNbMF0udm9sdW1lX3RhcmdldCA9IDB4ZmZmZjsKKwl2b2ljZS0+cGFyYW1zWzBdLmluaXRpYWxfZmMgPSAweGZmOworCXZvaWNlLT5wYXJhbXNbMF0uaW5pdGlhbF9hdHRuID0gMHgwMDsKKwl2b2ljZS0+cGFyYW1zWzBdLmJ5YW1wbF9lbnZfc3VzdGFpbiA9IDB4N2Y7CisJdm9pY2UtPnBhcmFtc1swXS5ieWFtcGxfZW52X2RlY2F5ID0gMHg3ZjsKKworCQorCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pIHsKKwkJaWYgKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoID09IDIpIHsKKwkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nICA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nICA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BUXTsKKwkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QVF07CisJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfZGNiYSA9IDB4ZmY7CisJCQl2b2ljZS0+cGFyYW1zWzFdLnNlbmRfZGNiYSA9IDB4ZmYwMDsKKwkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9oZ2ZlID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX2hnZmU9MDsKKwkJfSBlbHNlIHsKKwkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9kY2JhID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9MRUZUXTsKKwkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9oZ2ZlID0gY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9MRUZUXTsKKwkJCXZvaWNlLT5wYXJhbXNbMV0uc2VuZF9kY2JhID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9SSUdIVF07CisJCQl2b2ljZS0+cGFyYW1zWzFdLnNlbmRfaGdmZSA9IGNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfUklHSFRdOworCisJCQlpZiAod29pbnN0LT5kZXZpY2UpIHsKKwkJCQkvLyAvZGV2L2RwczEKKwkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyAgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZyAgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ00xXTsKKwkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZzIgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZzIgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUENNMV07CisJCQl9IGVsc2UgeworCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nICA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nICA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTV07CisJCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcyID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTV07CisJCQl9CisJCX0KKwkJCisJCXZvaWNlLT5wYXJhbXNbMV0udm9sdW1lX3RhcmdldCA9IDB4ZmZmZjsKKwkJdm9pY2UtPnBhcmFtc1sxXS5pbml0aWFsX2ZjID0gMHhmZjsKKwkJdm9pY2UtPnBhcmFtc1sxXS5pbml0aWFsX2F0dG4gPSAweDAwOworCQl2b2ljZS0+cGFyYW1zWzFdLmJ5YW1wbF9lbnZfc3VzdGFpbiA9IDB4N2Y7CisJCXZvaWNlLT5wYXJhbXNbMV0uYnlhbXBsX2Vudl9kZWNheSA9IDB4N2Y7CisJfSBlbHNlIHsKKwkJaWYgKHdvaW5zdC0+bnVtX3ZvaWNlcyA+IDEpIHsKKwkJCS8vIE11bHRpY2hhbm5lbCBwY20KKwkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9kY2JhPTB4ZmY7CisJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfaGdmZT0wOworCQkJaWYgKGNhcmQtPmlzX2F1ZGlneSkgeworCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nID0gMHgzZjNmM2YwMCArIGNhcmQtPm1jaGFubmVsX2Z4ICsgdm9pY2VudW07CisJCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gMHgzZjNmM2YzZjsKKwkJCX0gZWxzZSB7CisJCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgPSAweGZmZjAgKyBjYXJkLT5tY2hhbm5lbF9meCArIHZvaWNlbnVtOworCQkJfQorCQkJCisJCX0gZWxzZSB7CisJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfZGNiYSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTU9OT107CisJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfaGdmZSA9IGNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfTU9OT107CisKKwkJCWlmICh3b2luc3QtPmRldmljZSkgeworCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNMV07CisJCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTTFdOworCQkJfSBlbHNlIHsKKwkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTV07CisJCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTV07CisJCQl9CisJCX0KKwl9CisKKwlEUEQoMiwgInZvaWNlOiBzdGFydGxvb3A9JSN4LCBlbmRsb29wPSUjeFxuIiwgdm9pY2UtPnN0YXJ0bG9vcCwgdm9pY2UtPmVuZGxvb3ApOworCisJZW11MTBrMV92b2ljZV9wbGF5YmFja19zZXR1cCh2b2ljZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVtdTEwazFfd2F2ZW91dF9vcGVuKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciAqYnVmZmVyID0gJndvaW5zdC0+YnVmZmVyOworCXVuc2lnbmVkIGludCB2b2ljZW51bTsKKwl1MTYgZGVsYXk7CisKKwlEUEYoMiwgImVtdTEwazFfd2F2ZW91dF9vcGVuKClcbiIpOworCisJZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZW51bSsrKSB7CisJCWlmIChlbXUxMGsxX3ZvaWNlX2FsbG9jX2J1ZmZlcihjYXJkLCAmd29pbnN0LT52b2ljZVt2b2ljZW51bV0ubWVtLCB3b2luc3QtPmJ1ZmZlci5wYWdlcykgPCAwKSB7CisJCQlFUlJPUigpOworCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChnZXRfdm9pY2UoY2FyZCwgd29pbnN0LCB2b2ljZW51bSkgPCAwKSB7CisJCQlFUlJPUigpOworCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWJ1ZmZlci0+ZmlsbF9zaWxlbmNlID0gMDsKKwlidWZmZXItPnNpbGVuY2VfYnl0ZXMgPSAwOworCWJ1ZmZlci0+c2lsZW5jZV9wb3MgPSAwOworCWJ1ZmZlci0+aHdfcG9zID0gMDsKKwlidWZmZXItPmZyZWVfYnl0ZXMgPSB3b2luc3QtPmJ1ZmZlci5zaXplOworCisJZGVsYXkgPSAoNDgwMDAgKiB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSAvCisJCSAod29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICogd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZSk7CisKKwllbXUxMGsxX3RpbWVyX2luc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIsIGRlbGF5KTsKKworCXdvaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX09QRU47CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbXUxMGsxX3dhdmVvdXRfY2xvc2Uoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7CisJdW5zaWduZWQgaW50IHZvaWNlbnVtOworCisJRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfY2xvc2UoKVxuIik7CisKKwllbXUxMGsxX3dhdmVvdXRfc3RvcCh3YXZlX2Rldik7CisKKwllbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChjYXJkLCAmd29pbnN0LT50aW1lcik7CisKKwlmb3IgKHZvaWNlbnVtID0gMDsgdm9pY2VudW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlbnVtKyspIHsKKwkJZW11MTBrMV92b2ljZV9mcmVlKCZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXSk7CisJCWVtdTEwazFfdm9pY2VfZnJlZV9idWZmZXIoY2FyZCwgJndvaW5zdC0+dm9pY2Vbdm9pY2VudW1dLm1lbSk7CisJfQorCisJd29pbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfQ0xPU0VEOworfQorCit2b2lkIGVtdTEwazFfd2F2ZW91dF9zdGFydChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7CisJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKKwlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7CisKKwlEUEYoMiwgImVtdTEwazFfd2F2ZW91dF9zdGFydCgpXG4iKTsKKworCWlmICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAyKSB7CisJCWVtdTEwazFfcHRfc2V0dXAod2F2ZV9kZXYpOworCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgKGNhcmQtPmlzX2F1ZGlneSA/IEFfR1BSX0JBU0UgOiBHUFJfQkFTRSkgKyBwdC0+ZW5hYmxlX2dwciwgMCwgMSk7CisJCXB0LT5zdGF0ZSA9IFBUX1NUQVRFX1BMQVlJTkc7CisJfQorCisJLyogQWN0dWFsIHN0YXJ0ICovCisJZW11MTBrMV92b2ljZXNfc3RhcnQod29pbnN0LT52b2ljZSwgd29pbnN0LT5udW1fdm9pY2VzLCB3b2luc3QtPnRvdGFsX3BsYXllZCk7CisKKwllbXUxMGsxX3RpbWVyX2VuYWJsZShjYXJkLCAmd29pbnN0LT50aW1lcik7CisKKwl3b2luc3QtPnN0YXRlIHw9IFdBVkVfU1RBVEVfU1RBUlRFRDsKK30KKworaW50IGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYsIHN0cnVjdCB3YXZlX2Zvcm1hdCAqZm9ybWF0KQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCXVuc2lnbmVkIGludCB2b2ljZW51bTsKKwl1MTYgZGVsYXk7CisKKwlEUEYoMiwgImVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQoKVxuIik7CisKKwlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKKwkJcmV0dXJuIC0xOworCisJcXVlcnlfZm9ybWF0KHdhdmVfZGV2LCBmb3JtYXQpOworCisJaWYgKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAhPSBmb3JtYXQtPnNhbXBsaW5ncmF0ZSB8fAorCSAgICB3b2luc3QtPmZvcm1hdC5jaGFubmVscyAhPSBmb3JtYXQtPmNoYW5uZWxzIHx8CisJICAgIHdvaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsICE9IGZvcm1hdC0+Yml0c3BlcmNoYW5uZWwpIHsKKworCQl3b2luc3QtPmZvcm1hdCA9ICpmb3JtYXQ7CisKKwkJaWYgKHdvaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpCisJCQlyZXR1cm4gMDsKKworCQllbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChjYXJkLCAmd29pbnN0LT50aW1lcik7CisKKwkJZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZW51bSsrKSB7CisJCQllbXUxMGsxX3ZvaWNlX2ZyZWUoJndvaW5zdC0+dm9pY2Vbdm9pY2VudW1dKTsKKworCQkJaWYgKGdldF92b2ljZShjYXJkLCB3b2luc3QsIHZvaWNlbnVtKSA8IDApIHsKKwkJCQlFUlJPUigpOworCQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisKKwkJZGVsYXkgPSAoNDgwMDAgKiB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSAvCisJCQkgKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAqIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUpOworCisJCWVtdTEwazFfdGltZXJfaW5zdGFsbChjYXJkLCAmd29pbnN0LT50aW1lciwgZGVsYXkpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGVtdTEwazFfd2F2ZW91dF9zdG9wKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCisJRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfc3RvcCgpXG4iKTsKKworCWlmICghKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKQorCQlyZXR1cm47CisKKwllbXUxMGsxX3RpbWVyX2Rpc2FibGUoY2FyZCwgJndvaW5zdC0+dGltZXIpOworCisJLyogU3RvcCBhY3R1YWwgdm9pY2VzICovCisJZW11MTBrMV92b2ljZXNfc3RvcCh3b2luc3QtPnZvaWNlLCB3b2luc3QtPm51bV92b2ljZXMpOworCisJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOworCisJd29pbnN0LT5zdGF0ZSAmPSB+V0FWRV9TVEFURV9TVEFSVEVEOworfQorCisvKioKKyAqIGVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSAtCisgKgorICogZ2l2ZXMgdGhlIHRvdGFsIGZyZWUgYnl0ZXMgb24gdGhlIHZvaWNlIGJ1ZmZlciwgaW5jbHVkaW5nIHNpbGVuY2UgYnl0ZXMKKyAqIChiYXNpY2FsbHk6IHRvdGFsX2ZyZWVfYnl0ZXMgPSBmcmVlX2J5dGVzICsgc2lsZW5jZV9ieXRlcykuCisgKgorICovCit2b2lkIGVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZShzdHJ1Y3Qgd29pbnN0ICp3b2luc3QsIHUzMiAqdG90YWxfZnJlZV9ieXRlcykKK3sKKwlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgKmJ1ZmZlciA9ICZ3b2luc3QtPmJ1ZmZlcjsKKwlpbnQgcGVuZGluZ19ieXRlczsKKworCWlmICh3b2luc3QtPm1tYXBwZWQpIHsKKwkJKnRvdGFsX2ZyZWVfYnl0ZXMgPSBidWZmZXItPmZyZWVfYnl0ZXM7CisJCXJldHVybjsKKwl9CisKKwlwZW5kaW5nX2J5dGVzID0gYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5mcmVlX2J5dGVzOworCisJYnVmZmVyLT5maWxsX3NpbGVuY2UgPSAocGVuZGluZ19ieXRlcyA8IChzaWduZWQpIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIDIpID8gMSA6IDA7CisKKwlpZiAocGVuZGluZ19ieXRlcyA+IChzaWduZWQpIGJ1ZmZlci0+c2lsZW5jZV9ieXRlcykgeworCQkqdG90YWxfZnJlZV9ieXRlcyA9IChidWZmZXItPmZyZWVfYnl0ZXMgKyBidWZmZXItPnNpbGVuY2VfYnl0ZXMpOworCX0gZWxzZSB7CisJCSp0b3RhbF9mcmVlX2J5dGVzID0gYnVmZmVyLT5zaXplOworCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgPSBwZW5kaW5nX2J5dGVzOworCQlpZiAocGVuZGluZ19ieXRlcyA8IDApIHsKKwkJCWJ1ZmZlci0+c2lsZW5jZV9wb3MgPSBidWZmZXItPmh3X3BvczsKKwkJCWJ1ZmZlci0+c2lsZW5jZV9ieXRlcyA9IDA7CisJCQlidWZmZXItPmZyZWVfYnl0ZXMgPSBidWZmZXItPnNpemU7CisJCQlEUEYoMSwgImJ1ZmZlciB1bmRlcnJ1blxuIik7CisJCX0KKwl9Cit9CisKKy8qKgorICogY29weV9ibG9jayAtCisgKgorICogY29waWVzIGEgYmxvY2sgb2YgcGNtIGRhdGEgdG8gYSB2b2ljZSBidWZmZXIuCisgKiBOb3RpY2UgdGhhdCB0aGUgdm9pY2UgYnVmZmVyIGlzIGFjdHVhbGx5IGEgc2V0IG9mIGRpc2pvaW50ZWQgbWVtb3J5IHBhZ2VzLgorICoKKyAqLworc3RhdGljIHZvaWQgY29weV9ibG9jayh2b2lkICoqZHN0LCB1MzIgc3RyLCB1OCBfX3VzZXIgKnNyYywgdTMyIGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgcGc7CisJdW5zaWduZWQgaW50IHBnb2ZmOworCXVuc2lnbmVkIGludCBrOworCisJcGcgPSBzdHIgLyBQQUdFX1NJWkU7CisJcGdvZmYgPSBzdHIgJSBQQUdFX1NJWkU7CisKKwlpZiAobGVuID4gUEFHRV9TSVpFIC0gcGdvZmYpIHsKKwkJayA9IFBBR0VfU0laRSAtIHBnb2ZmOworCQlpZiAoX19jb3B5X2Zyb21fdXNlcigodTggKilkc3RbcGddICsgcGdvZmYsIHNyYywgaykpCisJCQlyZXR1cm47CisJCWxlbiAtPSBrOworCQl3aGlsZSAobGVuID4gUEFHRV9TSVpFKSB7CisJCQlpZiAoX19jb3B5X2Zyb21fdXNlcihkc3RbKytwZ10sIHNyYyArIGssIFBBR0VfU0laRSkpCisJCQkJcmV0dXJuOworCQkJayArPSBQQUdFX1NJWkU7CisJCQlsZW4gLT0gUEFHRV9TSVpFOworCQl9CisJCWlmIChfX2NvcHlfZnJvbV91c2VyKGRzdFsrK3BnXSwgc3JjICsgaywgbGVuKSkKKwkJCXJldHVybjsKKworCX0gZWxzZQorCQlfX2NvcHlfZnJvbV91c2VyKCh1OCAqKWRzdFtwZ10gKyBwZ29mZiwgc3JjLCBsZW4pOworfQorCisvKioKKyAqIGNvcHlfaWx2X2Jsb2NrIC0KKyAqCisgKiBjb3BpZXMgYSBibG9jayBvZiBwY20gZGF0YSBjb250YWluaW5nIG4gaW50ZXJsZWF2ZWQgY2hhbm5lbHMgdG8gbiBtb25vIHZvaWNlIGJ1ZmZlcnMuCisgKiBOb3RpY2UgdGhhdCB0aGUgdm9pY2UgYnVmZmVyIGlzIGFjdHVhbGx5IGEgc2V0IG9mIGRpc2pvaW50ZWQgbWVtb3J5IHBhZ2VzLgorICoKKyAqLworc3RhdGljIHZvaWQgY29weV9pbHZfYmxvY2soc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1MzIgc3RyLCB1OCBfX3VzZXIgKnNyYywgdTMyIGxlbikgCit7CisgICAgICAgIHVuc2lnbmVkIGludCBwZzsKKwl1bnNpZ25lZCBpbnQgcGdvZmY7CisJdW5zaWduZWQgaW50IHZvaWNlX251bTsKKwlzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSA9IHdvaW5zdC0+dm9pY2U7CisKKwlwZyA9IHN0ciAvIFBBR0VfU0laRTsKKwlwZ29mZiA9IHN0ciAlIFBBR0VfU0laRTsKKworCXdoaWxlIChsZW4pIHsgCisJCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykgeworCQkJaWYgKF9fY29weV9mcm9tX3VzZXIoKHU4ICopKHZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddKSArIHBnb2ZmLCBzcmMsIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUpKQorCQkJCXJldHVybjsKKwkJCXNyYyArPSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOworCQl9CisKKwkJbGVuIC09IHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7CisKKwkJcGdvZmYgKz0gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKKwkJaWYgKHBnb2ZmID49IFBBR0VfU0laRSkgeworCQkJcGdvZmYgPSAwOworCQkJcGcrKzsKKwkJfQorCX0KK30KKworLyoqCisgKiBmaWxsX2Jsb2NrIC0KKyAqCisgKiBmaWxscyBhIHNldCB2b2ljZSBidWZmZXJzIHdpdGggYSBibG9jayBvZiBhIGdpdmVuIHNhbXBsZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGZpbGxfYmxvY2soc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1MzIgc3RyLCB1OCBkYXRhLCB1MzIgbGVuKQoreworCXVuc2lnbmVkIGludCBwZzsKKwl1bnNpZ25lZCBpbnQgcGdvZmY7CisJdW5zaWduZWQgaW50IHZvaWNlX251bTsKKyAgICAgICAgc3RydWN0IGVtdV92b2ljZSAqdm9pY2UgPSB3b2luc3QtPnZvaWNlOworCXVuc2lnbmVkIGludCAgazsKKworCXBnID0gc3RyIC8gUEFHRV9TSVpFOworCXBnb2ZmID0gc3RyICUgUEFHRV9TSVpFOworCisJaWYgKGxlbiA+IFBBR0VfU0laRSAtIHBnb2ZmKSB7CisJCWsgPSBQQUdFX1NJWkUgLSBwZ29mZjsKKwkJZm9yICh2b2ljZV9udW0gPSAwOyB2b2ljZV9udW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlX251bSsrKQorCQkJbWVtc2V0KCh1OCAqKXZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddICsgcGdvZmYsIGRhdGEsIGspOworCQlsZW4gLT0gazsKKwkJd2hpbGUgKGxlbiA+IFBBR0VfU0laRSkgeworCQkJcGcrKzsKKwkJCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKKwkJCQltZW1zZXQodm9pY2Vbdm9pY2VfbnVtXS5tZW0uYWRkcltwZ10sIGRhdGEsIFBBR0VfU0laRSk7CisKKwkJCWxlbiAtPSBQQUdFX1NJWkU7CisJCX0KKwkJcGcrKzsKKwkJZm9yICh2b2ljZV9udW0gPSAwOyB2b2ljZV9udW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlX251bSsrKQorCQkJbWVtc2V0KHZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddLCBkYXRhLCBsZW4pOworCisJfSBlbHNlIHsKKwkJZm9yICh2b2ljZV9udW0gPSAwOyB2b2ljZV9udW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlX251bSsrKQorCQkJbWVtc2V0KCh1OCAqKXZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddICsgcGdvZmYsIGRhdGEsIGxlbik7CisJfQorfQorCisvKioKKyAqIGVtdTEwazFfd2F2ZW91dF94ZmVyZGF0YSAtCisgKgorICogY29waWVzIHBjbSBkYXRhIHRvIHRoZSB2b2ljZSBidWZmZXIuIFNpbGVuY2Ugc2FtcGxlcworICogcHJldmlvdXNseSBhZGRlZCB0byB0aGUgYnVmZmVyIGFyZSBvdmVyd3JpdHRlbi4KKyAqCisgKi8KK3ZvaWQgZW11MTBrMV93YXZlb3V0X3hmZXJkYXRhKHN0cnVjdCB3b2luc3QgKndvaW5zdCwgdTggX191c2VyICpkYXRhLCB1MzIgKnNpemUpCit7CisJc3RydWN0IHdhdmVvdXRfYnVmZmVyICpidWZmZXIgPSAmd29pbnN0LT5idWZmZXI7CisJc3RydWN0IHZvaWNlX21lbSAqbWVtID0gJndvaW5zdC0+dm9pY2VbMF0ubWVtOworCXUzMiBzaXpldG9jb3B5LCBzaXpldG9jb3B5X25vdywgc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNpemV0b2NvcHkgPSBtaW5fdCh1MzIsIGJ1ZmZlci0+c2l6ZSwgKnNpemUpOworCSpzaXplID0gc2l6ZXRvY29weTsKKworCWlmICghc2l6ZXRvY29weSkKKwkJcmV0dXJuOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwlzdGFydCA9IChidWZmZXItPnNpemUgKyBidWZmZXItPnNpbGVuY2VfcG9zIC0gYnVmZmVyLT5zaWxlbmNlX2J5dGVzKSAlIGJ1ZmZlci0+c2l6ZTsKKworCWlmIChzaXpldG9jb3B5ID4gYnVmZmVyLT5zaWxlbmNlX2J5dGVzKSB7CisJCWJ1ZmZlci0+c2lsZW5jZV9wb3MgKz0gc2l6ZXRvY29weSAtIGJ1ZmZlci0+c2lsZW5jZV9ieXRlczsKKwkJYnVmZmVyLT5mcmVlX2J5dGVzIC09IHNpemV0b2NvcHkgLSBidWZmZXItPnNpbGVuY2VfYnl0ZXM7CisJCWJ1ZmZlci0+c2lsZW5jZV9ieXRlcyA9IDA7CisJfSBlbHNlCisJCWJ1ZmZlci0+c2lsZW5jZV9ieXRlcyAtPSBzaXpldG9jb3B5OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwlzaXpldG9jb3B5X25vdyA9IGJ1ZmZlci0+c2l6ZSAtIHN0YXJ0OworCWlmIChzaXpldG9jb3B5ID4gc2l6ZXRvY29weV9ub3cpIHsKKwkJc2l6ZXRvY29weSAtPSBzaXpldG9jb3B5X25vdzsKKwkJaWYgKHdvaW5zdC0+bnVtX3ZvaWNlcyA+IDEpIHsKKwkJCWNvcHlfaWx2X2Jsb2NrKHdvaW5zdCwgc3RhcnQsIGRhdGEsIHNpemV0b2NvcHlfbm93KTsKKwkJCWNvcHlfaWx2X2Jsb2NrKHdvaW5zdCwgMCwgZGF0YSArIHNpemV0b2NvcHlfbm93ICogd29pbnN0LT5udW1fdm9pY2VzLCBzaXpldG9jb3B5KTsKKwkJfSBlbHNlIHsKKwkJCWNvcHlfYmxvY2sobWVtLT5hZGRyLCBzdGFydCwgZGF0YSwgc2l6ZXRvY29weV9ub3cpOworCQkJY29weV9ibG9jayhtZW0tPmFkZHIsIDAsIGRhdGEgKyBzaXpldG9jb3B5X25vdywgc2l6ZXRvY29weSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAod29pbnN0LT5udW1fdm9pY2VzID4gMSkKKwkJCWNvcHlfaWx2X2Jsb2NrKHdvaW5zdCwgc3RhcnQsIGRhdGEsIHNpemV0b2NvcHkpOworCQllbHNlCisJCQljb3B5X2Jsb2NrKG1lbS0+YWRkciwgc3RhcnQsIGRhdGEsIHNpemV0b2NvcHkpOworCX0KK30KKworLyoqCisgKiBlbXUxMGsxX3dhdmVvdXRfZmlsbHNpbGVuY2UgLQorICoKKyAqIGFkZHMgc2FtcGxlcyBvZiBzaWxlbmNlIHRvIHRoZSB2b2ljZSBidWZmZXIgc28gdGhhdCB3ZQorICogZG9uJ3QgbG9vcCBvdmVyIHN0YWxlIHBjbSBkYXRhLgorICoKKyAqLwordm9pZCBlbXUxMGsxX3dhdmVvdXRfZmlsbHNpbGVuY2Uoc3RydWN0IHdvaW5zdCAqd29pbnN0KQoreworCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciAqYnVmZmVyID0gJndvaW5zdC0+YnVmZmVyOworCXUzMiBzaXpldG9jb3B5LCBzaXpldG9jb3B5X25vdywgc3RhcnQ7CisJdTggZmlsbGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNpemV0b2NvcHkgPSBidWZmZXItPmZyYWdtZW50X3NpemU7CisKKwlpZiAod29pbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPT0gMTYpCisJCWZpbGxkYXRhID0gMHgwMDsKKwllbHNlCisJCWZpbGxkYXRhID0gMHg4MDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwlidWZmZXItPnNpbGVuY2VfYnl0ZXMgKz0gc2l6ZXRvY29weTsKKwlidWZmZXItPmZyZWVfYnl0ZXMgLT0gc2l6ZXRvY29weTsKKwlidWZmZXItPnNpbGVuY2VfcG9zICU9IGJ1ZmZlci0+c2l6ZTsKKwlzdGFydCA9IGJ1ZmZlci0+c2lsZW5jZV9wb3M7CisJYnVmZmVyLT5zaWxlbmNlX3BvcyArPSBzaXpldG9jb3B5OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJc2l6ZXRvY29weV9ub3cgPSBidWZmZXItPnNpemUgLSBzdGFydDsKKworCWlmIChzaXpldG9jb3B5ID4gc2l6ZXRvY29weV9ub3cpIHsKKwkJc2l6ZXRvY29weSAtPSBzaXpldG9jb3B5X25vdzsKKwkJZmlsbF9ibG9jayh3b2luc3QsIHN0YXJ0LCBmaWxsZGF0YSwgc2l6ZXRvY29weV9ub3cpOworCQlmaWxsX2Jsb2NrKHdvaW5zdCwgMCwgZmlsbGRhdGEsIHNpemV0b2NvcHkpOworCX0gZWxzZSB7CisJCWZpbGxfYmxvY2sod29pbnN0LCBzdGFydCwgZmlsbGRhdGEsIHNpemV0b2NvcHkpOworCX0KK30KKworLyoqCisgKiBlbXUxMGsxX3dhdmVvdXRfdXBkYXRlIC0KKyAqCisgKiB1cGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdm9pY2UgYnVmZmVyIGhhcmR3YXJlIHBvaW50ZXIgKGh3X3BvcykKKyAqIGFuZCB0aGUgbnVtYmVyIG9mIGZyZWUgYnl0ZXMgb24gdGhlIGJ1ZmZlciAoZnJlZV9ieXRlcykuCisgKiBUaGUgZnJlZSBieXRlcyBfZG9uJ3RfIGluY2x1ZGUgc2lsZW5jZSBieXRlcyB0aGF0IG1heSBoYXZlIGJlZW4KKyAqIGFkZGVkIHRvIHRoZSBidWZmZXIuCisgKgorICovCit2b2lkIGVtdTEwazFfd2F2ZW91dF91cGRhdGUoc3RydWN0IHdvaW5zdCAqd29pbnN0KQoreworCXUzMiBod19wb3M7CisJdTMyIGRpZmY7CisKKwkvKiBUaGVyZSBpcyBubyBhY3R1YWwgc3RhcnQgeWV0ICovCisJaWYgKCEod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkpIHsKKwkJaHdfcG9zID0gd29pbnN0LT5idWZmZXIuaHdfcG9zOworCX0gZWxzZSB7CisJCS8qIGh3X3BvcyBpbiBzYW1wbGUgdW5pdHMgKi8KKwkJaHdfcG9zID0gc2JsaXZlX3JlYWRwdHIod29pbnN0LT52b2ljZVswXS5jYXJkLCBDQ0NBX0NVUlJBRERSLCB3b2luc3QtPnZvaWNlWzBdLm51bSk7CisKKwkJaWYoaHdfcG9zIDwgd29pbnN0LT52b2ljZVswXS5zdGFydCkKKwkJCWh3X3BvcyArPSB3b2luc3QtPmJ1ZmZlci5zaXplIC8gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZSAtIHdvaW5zdC0+dm9pY2VbMF0uc3RhcnQ7CisJCWVsc2UKKwkJCWh3X3BvcyAtPSB3b2luc3QtPnZvaWNlWzBdLnN0YXJ0OworCisJCWh3X3BvcyAqPSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOworCX0KKworCWRpZmYgPSAod29pbnN0LT5idWZmZXIuc2l6ZSArIGh3X3BvcyAtIHdvaW5zdC0+YnVmZmVyLmh3X3BvcykgJSB3b2luc3QtPmJ1ZmZlci5zaXplOworCXdvaW5zdC0+dG90YWxfcGxheWVkICs9IGRpZmY7CisJd29pbnN0LT5idWZmZXIuZnJlZV9ieXRlcyArPSBkaWZmOworCXdvaW5zdC0+YnVmZmVyLmh3X3BvcyA9IGh3X3BvczsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5oIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlY2U4OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgY2FyZHdvLmggLS0gaGVhZGVyIGZpbGUgZm9yIGNhcmQgd2F2ZSBvdXQgZnVuY3Rpb25zCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAorICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAorICogICAgIFVTQS4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICovCisKKyNpZm5kZWYgX0NBUkRXT19ICisjZGVmaW5lIF9DQVJEV09fSAorCisjaW5jbHVkZSAiaWNhcmR3YXYuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgInZvaWNlbWdyLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKworLyogc2V0dGluZyB0aGlzIHRvIG90aGVyIHRoYW4gYSBwb3dlciBvZiB0d28gbWF5IGJyZWFrIHNvbWUgYXBwbGljYXRpb25zICovCisjZGVmaW5lIFdBVkVPVVRfTUFYQlVGU0laRQlNQVhCVUZTSVpFCisKKyNkZWZpbmUgV0FWRU9VVF9ERUZBVUxURlJBR0xFTgkyMCAvKiBUaW1lIHRvIHBsYXkgYSBmcmFnbWVudCBpbiBtcyAobGF0ZW5jeSkgKi8KKyNkZWZpbmUgV0FWRU9VVF9ERUZBVUxUQlVGTEVOCTUwMCAvKiBUaW1lIHRvIHBsYXkgdGhlIGVudGlyZSBidWZmZXIgaW4gbXMgKi8KKworI2RlZmluZSBXQVZFT1VUX01JTkZSQUdTSElGVAk2IC8qIE1pbmltdW0gZnJhZ21lbnQgc2l6ZSBpbiBieXRlcyBpcyAyXjYgKi8KKyNkZWZpbmUgV0FWRU9VVF9NSU5GUkFHUwkzIC8qIF9kb24ndF8gZ28gYmVsbG93IDMsIGl0IHdvdWxkIGJyZWFrIHNpbGVuY2UgZmlsbGluZyAqLworI2RlZmluZSBXQVZFT1VUX01BWFZPSUNFUwk2CisKK3N0cnVjdCB3YXZlb3V0X2J1ZmZlciB7CisJdTE2IG9zc2ZyYWdzaGlmdDsKKwl1MzIgbnVtZnJhZ3M7CisJdTMyIGZyYWdtZW50X3NpemU7CS8qIGluIGJ5dGVzIHVuaXRzICovCisJdTMyIHNpemU7CQkvKiBpbiBieXRlcyB1bml0cyAqLworCXUzMiBwYWdlczsJCS8qIGJ1ZmZlciBzaXplIGluIHBhZ2UgdW5pdHMqLworCXUzMiBzaWxlbmNlX3BvczsJLyogc29mdHdhcmUgY3Vyc29yIHBvc2l0aW9uIChpbmNsdWRpbmcgc2lsZW5jZSBieXRlcykgKi8KKwl1MzIgaHdfcG9zOwkJLyogaGFyZHdhcmUgY3Vyc29yIHBvc2l0aW9uICovCisJdTMyIGZyZWVfYnl0ZXM7CQkvKiBmcmVlIGJ5dGVzIGF2YWlsYWJsZSBvbiB0aGUgYnVmZmVyIChub3QgaW5jbHVkaW5nIHNpbGVuY2UgYnl0ZXMpICovCisJdTggZmlsbF9zaWxlbmNlOworCXUzMiBzaWxlbmNlX2J5dGVzOyAgICAgIC8qIHNpbGVuY2UgYnl0ZXMgb24gdGhlIGJ1ZmZlciAqLworfTsKKworc3RydWN0IHdvaW5zdCAKK3sKKwl1OCBzdGF0ZTsKKwl1OCBudW1fdm9pY2VzOworCXN0cnVjdCBlbXVfdm9pY2Ugdm9pY2VbV0FWRU9VVF9NQVhWT0lDRVNdOworCXN0cnVjdCBlbXVfdGltZXIgdGltZXI7CisJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKKwlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgYnVmZmVyOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CisJdTggbW1hcHBlZDsKKwl1MzIgdG90YWxfY29waWVkOwkvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbigpIHRvIHRoZSBidWZmZXIgKGV4Y2x1ZGluZyBzaWxlbmNlKSAqLworCXUzMiB0b3RhbF9wbGF5ZWQ7CS8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBwbGF5ZWQgaW5jbHVkaW5nIHNpbGVuY2UgKi8KKwl1MzIgYmxvY2tzOworCXU4IGRldmljZTsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitpbnQgZW11MTBrMV93YXZlb3V0X29wZW4oc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKK3ZvaWQgZW11MTBrMV93YXZlb3V0X2Nsb3NlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Cit2b2lkIGVtdTEwazFfd2F2ZW91dF9zdGFydChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwordm9pZCBlbXUxMGsxX3dhdmVvdXRfc3RvcChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwordm9pZCBlbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUoc3RydWN0IHdvaW5zdCosIHUzMiAqKTsKK3ZvaWQgZW11MTBrMV93YXZlb3V0X3hmZXJkYXRhKHN0cnVjdCB3b2luc3QqLCB1OCBfX3VzZXIgKiwgdTMyICopOwordm9pZCBlbXUxMGsxX3dhdmVvdXRfZmlsbHNpbGVuY2Uoc3RydWN0IHdvaW5zdCopOworaW50IGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSosIHN0cnVjdCB3YXZlX2Zvcm1hdCopOwordm9pZCBlbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHN0cnVjdCB3b2luc3QqKTsKKworI2VuZGlmIC8qIF9DQVJEV09fSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlNjM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgZWNhcmQuYyAtIEUtY2FyZCBpbml0aWFsaXphdGlvbiBjb2RlCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAorICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAorICogICAgIFVTQS4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICovIAorCisjaW5jbHVkZSAiZWNhcmQuaCIKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorCisvKiBQcml2YXRlIHJvdXRpbmVzICovCitzdGF0aWMgdm9pZCBlY2FyZF9zZXRhZGNnYWluKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVjYXJkX3N0YXRlICosIHUxNik7CitzdGF0aWMgdm9pZCBlY2FyZF93cml0ZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZ1bmMgU2V0IHRoZSBnYWluIG9mIHRoZSBFQ0FSRCdzIENTMzMxMCBUcmltL2dhaW4gY29udHJvbGxlci4gIFRoZQorICogdHJpbSB2YWx1ZSBjb25zaXN0cyBvZiBhIDE2Yml0IHZhbHVlIHdoaWNoIGlzIGNvbXBvc2VkIG9mIHR3bworICogOCBiaXQgZ2Fpbi90cmltIHZhbHVlcywgb25lIGZvciB0aGUgbGVmdCBjaGFubmVsIGFuZCBvbmUgZm9yIHRoZQorICogcmlnaHQgY2hhbm5lbC4gIFRoZSBmb2xsb3dpbmcgdGFibGUgbWFwcyBmcm9tIHRoZSBHYWluL0F0dGVudWF0aW9uCisgKiB2YWx1ZSBpbiBkZWNpYmVscyBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBwYXR0ZXJuIGZvciBhIHNpbmdsZQorICogY2hhbm5lbC4KKyAqLworCitzdGF0aWMgdm9pZCBlY2FyZF9zZXRhZGNnYWluKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlY2FyZF9zdGF0ZSAqZWNhcmQsIHUxNiBnYWluKQoreworCXUzMiBjdXJyYml0OworCWVjYXJkLT5hZGNfZ2FpbiA9IGdhaW47CisKKwkvKiBFbmFibGUgd3JpdGluZyB0byB0aGUgVFJJTSByZWdpc3RlcnMgKi8KKwllY2FyZF93cml0ZShjYXJkLCBlY2FyZC0+Y29udHJvbF9iaXRzICYgfkVDX1RSSU1fQ1NOKTsKKworCS8qIERvIGl0IGFnYWluIHRvIGluc3VyZSB0aGF0IHdlIG1lZXQgaG9sZCB0aW1lIHJlcXVpcmVtZW50cyAqLworCWVjYXJkX3dyaXRlKGNhcmQsIGVjYXJkLT5jb250cm9sX2JpdHMgJiB+RUNfVFJJTV9DU04pOworCisJZm9yIChjdXJyYml0ID0gKDFMIDw8IDE1KTsgY3VycmJpdDsgY3VycmJpdCA+Pj0gMSkgeworCisJCXUzMiB2YWx1ZSA9IGVjYXJkLT5jb250cm9sX2JpdHMgJiB+KEVDX1RSSU1fQ1NOfEVDX1RSSU1fU0RBVEEpOworCisJCWlmIChnYWluICYgY3VycmJpdCkKKwkJICAgICAgdmFsdWUgfD0gRUNfVFJJTV9TREFUQTsKKworCQkvKiBDbG9jayB0aGUgYml0ICovCisJCWVjYXJkX3dyaXRlKGNhcmQsIHZhbHVlKTsKKwkJZWNhcmRfd3JpdGUoY2FyZCwgdmFsdWUgfCBFQ19UUklNX1NDTEspOworCQllY2FyZF93cml0ZShjYXJkLCB2YWx1ZSk7CisJfQorCisJZWNhcmRfd3JpdGUoY2FyZCwgZWNhcmQtPmNvbnRyb2xfYml0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQGZ1bmMgQ2xvY2sgYml0cyBpbnRvIHRoZSBFY2FyZCdzIGNvbnRyb2wgbGF0Y2guICBUaGUgRWNhcmQgdXNlcyBhCisgKiAgY29udHJvbCBsYXRjaCB3aWxsIGlzIGxvYWRlZCBiaXQtc2VyaWFsbHkgYnkgdG9nZ2xpbmcgdGhlIE1vZGVtIGNvbnRyb2wKKyAqICBsaW5lcyBmcm9tIGZ1bmN0aW9uIDIgb24gdGhlIEU4MDEwLiAgVGhpcyBmdW5jdGlvbiBoaWRlcyB0aGVzZSBkZXRhaWxzCisgKiAgYW5kIHByZXNlbnRzIHRoZSBpbGx1c2lvbiB0aGF0IHdlIGFyZSBhY3R1YWxseSB3cml0aW5nIHRvIGEgZGlzdGluY3QKKyAqICByZWdpc3Rlci4KKyAqLworc3RhdGljIHZvaWQgZWNhcmRfd3JpdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHZhbHVlKQoreworCXUxNiBjb3VudDsKKwl1MzIgZGF0YSwgaGN2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWhjdmFsdWUgPSBpbmwoY2FyZC0+aW9iYXNlICsgSENGRykgJiB+KEhPT0tOX0JJVHxIQU5ETl9CSVR8UFVMU0VOX0JJVCk7CisKKwlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUpOworCisJZm9yIChjb3VudCA9IDAgOyBjb3VudCA8IEVDX05VTV9DT05UUk9MX0JJVFM7IGNvdW50KyspIHsKKwkKKwkJLyogU2V0IHVwIHRoZSB2YWx1ZSAqLworCQlkYXRhID0gKCh2YWx1ZSAmIDB4MSkgPyBQVUxTRU5fQklUIDogMCk7CisJCXZhbHVlID4+PSAxOworCisJCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSB8IGRhdGEpOworCisJCS8qIENsb2NrIHRoZSBzaGlmdCByZWdpc3RlciAqLworCQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUgfCBkYXRhIHwgSEFORE5fQklUKTsKKwkJb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlIHwgZGF0YSk7CisJfQorCisJLyogTGF0Y2ggdGhlIGJpdHMgKi8KKwlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUgfCBIT09LTl9CSVQpOworCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgX19kZXZpbml0IGVtdTEwazFfZWNhcmRfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXUzMiBoY3ZhbHVlOworCXN0cnVjdCBlY2FyZF9zdGF0ZSBlY2FyZDsKKworCS8qIFNldCB1cCB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworCWVjYXJkLm11eDBfc2V0dGluZyA9IEVDX0RFRkFVTFRfU1BESUYwX1NFTDsKKwllY2FyZC5tdXgxX3NldHRpbmcgPSBFQ19ERUZBVUxUX1NQRElGMV9TRUw7CisJZWNhcmQubXV4Ml9zZXR0aW5nID0gMDsKKwllY2FyZC5hZGNfZ2FpbiA9IEVDX0RFRkFVTFRfQURDX0dBSU47CisJZWNhcmQuY29udHJvbF9iaXRzID0gRUNfUkFXX1JVTl9NT0RFIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1NQRElGMF9TRUxFQ1QoZWNhcmQubXV4MF9zZXR0aW5nKSB8CisJCQkgICAgIEVDX1NQRElGMV9TRUxFQ1QoZWNhcmQubXV4MV9zZXR0aW5nKTsKKworCisJLyogU3RlcCAwOiBTZXQgdGhlIGNvZGVjIHR5cGUgaW4gdGhlIGhhcmR3YXJlIGNvbnRyb2wgcmVnaXN0ZXIgCisJICogYW5kIGVuYWJsZSBhdWRpbyBvdXRwdXQgKi8KKwloY3ZhbHVlID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIEhDRkcpOworCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgaGN2YWx1ZSB8IEhDRkdfQVVESU9FTkFCTEUgfCBIQ0ZHX0NPREVDRk9STUFUX0kyUyk7CisKKwkvKiBTdGVwIDE6IFR1cm4gb2ZmIHRoZSBsZWQgYW5kIGRlYXNzZXJ0IFRSSU1fQ1MgKi8KKwllY2FyZF93cml0ZShjYXJkLCBFQ19BRENDQUwgfCBFQ19MRUROIHwgRUNfVFJJTV9DU04pOworCisJLyogU3RlcCAyOiBDYWxpYnJhdGUgdGhlIEFEQyBhbmQgREFDICovCisJZWNhcmRfd3JpdGUoY2FyZCwgRUNfREFDQ0FMIHwgRUNfTEVETiB8IEVDX1RSSU1fQ1NOKTsKKworCS8qIFN0ZXAgMzogV2FpdCBmb3IgYXdoaWxlOyBGSVhNRTogSXMgdGhpcyBjb3JyZWN0PyAqLworCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChIWik7CisKKwkvKiBTdGVwIDQ6IFN3aXRjaCBvZmYgdGhlIERBQyBhbmQgQURDIGNhbGlicmF0aW9uLiAgTm90ZQorCSAqIFRoYXQgQURDX0NBTCBpcyBhY3R1YWxseSBhbiBpbnZlcnRlZCBzaWduYWwsIHNvIHdlIGFzc2VydAorCSAqIGl0IGhlcmUgdG8gc3RvcCBjYWxpYnJhdGlvbi4gICovCisJZWNhcmRfd3JpdGUoY2FyZCwgRUNfQURDQ0FMIHwgRUNfTEVETiB8IEVDX1RSSU1fQ1NOKTsKKworCS8qIFN0ZXAgNDogU3dpdGNoIGludG8gcnVuIG1vZGUgKi8KKwllY2FyZF93cml0ZShjYXJkLCBlY2FyZC5jb250cm9sX2JpdHMpOworCisJLyogU3RlcCA1OiBTZXQgdGhlIGFuYWxvZyBpbnB1dCBnYWluICovCisJZWNhcmRfc2V0YWRjZ2FpbihjYXJkLCAmZWNhcmQsIGVjYXJkLmFkY19nYWluKTsKK30KKworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5oIGIvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2FlYWQxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuaApAQCAtMCwwICsxLDExMyBAQAorLyogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBlY2FyZC5oCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAorICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKKyAqICAgICBVU0EuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqLyAKKworI2lmbmRlZiBfRUNBUkRfSAorI2RlZmluZSBfRUNBUkRfSAorCisjaW5jbHVkZSAiODAxMC5oIgorI2luY2x1ZGUgImh3YWNjZXNzLmgiCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisvKiBJbiBBMSBTaWxpY29uLCB0aGVzZSBiaXRzIGFyZSBpbiB0aGUgSEMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSE9PS05fQklUICAgKDFMIDw8IDEyKQorI2RlZmluZSBIQU5ETl9CSVQgICAoMUwgPDwgMTEpCisjZGVmaW5lIFBVTFNFTl9CSVQgICgxTCA8PCAxMCkKKworI2RlZmluZSBFQ19HREkxICgxIDw8IDEzKQorI2RlZmluZSBFQ19HREkwICgxIDw8IDE0KQorCisjZGVmaW5lIEVDX05VTV9DT05UUk9MX0JJVFMgMjAKKworI2RlZmluZSBFQ19BQzNfREFUQV9TRUxOICAweDAwMDFMCisjZGVmaW5lIEVDX0VFX0RBVEFfU0VMICAgIDB4MDAwMkwKKyNkZWZpbmUgRUNfRUVfQ05UUkxfU0VMTiAgMHgwMDA0TAorI2RlZmluZSBFQ19FRUNMSyAgICAgICAgICAweDAwMDhMCisjZGVmaW5lIEVDX0VFQ1MgICAgICAgICAgIDB4MDAxMEwKKyNkZWZpbmUgRUNfRUVTRE8gICAgICAgICAgMHgwMDIwTAorI2RlZmluZSBFQ19UUklNX0NTTgkgIDB4MDA0MEwKKyNkZWZpbmUgRUNfVFJJTV9TQ0xLCSAgMHgwMDgwTAorI2RlZmluZSBFQ19UUklNX1NEQVRBCSAgMHgwMTAwTAorI2RlZmluZSBFQ19UUklNX01VVEVOCSAgMHgwMjAwTAorI2RlZmluZSBFQ19BRENDQUwJICAweDA0MDBMCisjZGVmaW5lIEVDX0FEQ1JTVE4JICAweDA4MDBMCisjZGVmaW5lIEVDX0RBQ0NBTAkgIDB4MTAwMEwKKyNkZWZpbmUgRUNfREFDTVVURU4JICAweDIwMDBMCisjZGVmaW5lIEVDX0xFRE4JCSAgMHg0MDAwTAorCisjZGVmaW5lIEVDX1NQRElGMF9TRUxfU0hJRlQJMTUKKyNkZWZpbmUgRUNfU1BESUYxX1NFTF9TSElGVAkxNwkKKyNkZWZpbmUgRUNfU1BESUYwX1NFTF9NQVNLCSgweDNMIDw8IEVDX1NQRElGMF9TRUxfU0hJRlQpCisjZGVmaW5lIEVDX1NQRElGMV9TRUxfTUFTSwkoMHg3TCA8PCBFQ19TUERJRjFfU0VMX1NISUZUKQorI2RlZmluZSBFQ19TUERJRjBfU0VMRUNUKF94KSAoKChfeCkgPDwgRUNfU1BESUYwX1NFTF9TSElGVCkgJiBFQ19TUERJRjBfU0VMX01BU0spCisjZGVmaW5lIEVDX1NQRElGMV9TRUxFQ1QoX3gpICgoKF94KSA8PCBFQ19TUERJRjFfU0VMX1NISUZUKSAmIEVDX1NQRElGMV9TRUxfTUFTSykKKyNkZWZpbmUgRUNfQ1VSUkVOVF9QUk9NX1ZFUlNJT04gMHgwMSAvKiBTZWxmLWV4cGxhbmF0b3J5LiAgVGhpcyBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZSBpbmNyZW1lbnRlZCBhbnkgdGltZSB0aGUgRUVQUk9NJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmb3JtYXQgaXMgY2hhbmdlZC4gICovCisKKyNkZWZpbmUgRUNfRUVQUk9NX1NJWkUJICAgICAgICAweDQwIC8qIEVDQVJEIEVFUFJPTSBoYXMgNjQgMTYtYml0IHdvcmRzICovCisKKy8qIEFkZHJlc3NlcyBmb3Igc3BlY2lhbCB2YWx1ZXMgc3RvcmVkIGluIHRvIEVFUFJPTSAqLworI2RlZmluZSBFQ19QUk9NX1ZFUlNJT05fQUREUgkweDIwCS8qIEFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgcHJvbSB2ZXJzaW9uICovCisjZGVmaW5lIEVDX0JPQVJEUkVWMF9BRERSCTB4MjEJLyogTFNXIG9mIGJvYXJkIHJldiAqLworI2RlZmluZSBFQ19CT0FSRFJFVjFfQUREUiAJMHgyMgkvKiBNU1cgb2YgYm9hcmQgcmV2ICovIAorCisjZGVmaW5lIEVDX0xBU1RfUFJPTUZJTEVfQUREUgkweDJmCisKKyNkZWZpbmUgRUNfU0VSSUFMTlVNX0FERAkweDMwCS8qIEZpcnN0IHdvcmQgb2Ygc2VyaWFsIG51bWJlci4gIFRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYW4gYmUgdXAgdG8gMzAgY2hhcmFjdGVycyBpbiBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgaXMgc3RvcmVkIGFzIGEgTlVMTC10ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQVNDSUkgc3RyaW5nLiAgQW55IHVudXNlZCBieXRlcyBtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmlsbGVkIHdpdGggemVyb3MgKi8KKyNkZWZpbmUgRUNfQ0hFQ0tTVU1fQUREUgkweDNmICAgIC8qIExvY2F0aW9uIGF0IHdoaWNoIGNoZWNrc3VtIGlzIHN0b3JlZCAqLworCisKKworLyogTW9zdCBvZiB0aGlzIHN0dWZmIGlzIHByZXR0eSBzZWxmLWV2aWRlbnQuICBBY2NvcmRpbmcgdG8gdGhlIGhhcmR3YXJlIAorICogZHVkZXMsIHdlIG5lZWQgdG8gbGVhdmUgdGhlIEFEQ0NBTCBiaXQgbG93IGluIG9yZGVyIHRvIGF2b2lkIGEgREMgCisgKiBvZmZzZXQgcHJvYmxlbS4gIFdlaXJkLgorICovCisjZGVmaW5lIEVDX1JBV19SVU5fTU9ERQkoRUNfREFDTVVURU4gfCBFQ19BRENSU1ROIHwgRUNfVFJJTV9NVVRFTiB8IEVDX1RSSU1fQ1NOKQorCisKKyNkZWZpbmUgRUNfREVGQVVMVF9BRENfR0FJTiAgIDB4QzRDNAorI2RlZmluZSBFQ19ERUZBVUxUX1NQRElGMF9TRUwgMHgwCisjZGVmaW5lIEVDX0RFRkFVTFRfU1BESUYxX1NFTCAweDQKKworI2RlZmluZSBIQ19FQSAweDAxTAorCisvKiBFQ0FSRCBzdGF0ZSBzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSBtYWludGFpbnMgdGhlIHN0YXRlCisgKiBmb3IgdmFyaW91cyBwb3J0aW9ucyBvZiB0aGUgRUNBUkQncyBvbmJvYXJkIGhhcmR3YXJlLgorICovCitzdHJ1Y3QgZWNhcmRfc3RhdGUgeworCXUzMiBjb250cm9sX2JpdHM7CisJdTE2IGFkY19nYWluOworCXUxNiBtdXgwX3NldHRpbmc7CisJdTE2IG11eDFfc2V0dGluZzsKKwl1MTYgbXV4Ml9zZXR0aW5nOworfTsKKwordm9pZCBlbXUxMGsxX2VjYXJkX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqKSBfX2RldmluaXQ7CisKKyNlbmRpZiAvKiBfRUNBUkRfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9lZnhtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDU4NjVkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIGVmeG1nci5jCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAorICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAorICogICAgIFVTQS4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgImVmeG1nci5oIgorCitpbnQgZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKHN0cnVjdCBwYXRjaF9tYW5hZ2VyICptZ3IsIGNvbnN0IGNoYXIgKnBhdGNoX25hbWUsIGNvbnN0IGNoYXIgKmdwcl9uYW1lKQoreworICAgICAgICBzdHJ1Y3QgZHNwX3BhdGNoICpwYXRjaDsKKwlzdHJ1Y3QgZHNwX3JwYXRjaCAqcnBhdGNoOworCWNoYXIgc1tQQVRDSF9OQU1FX1NJWkUgKyA0XTsKKwl1bnNpZ25lZCBsb25nICpncHJfdXNlZDsKKwlpbnQgaTsKKworCURQRCgyLCAiZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCk6ICVzICVzXG4iLCBwYXRjaF9uYW1lLCBncHJfbmFtZSk7CisKKwlycGF0Y2ggPSAmbWdyLT5ycGF0Y2g7CisJaWYgKCFzdHJjbXAocnBhdGNoLT5uYW1lLCBwYXRjaF9uYW1lKSkgeworCQlncHJfdXNlZCA9IHJwYXRjaC0+Z3ByX3VzZWQ7CisJCWdvdG8gbWF0Y2g7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1nci0+Y3VycmVudF9wYWdlcyAqIFBBVENIRVNfUEVSX1BBR0U7IGkrKykgeworCQlwYXRjaCA9IFBBVENIKG1nciwgaSk7CisJCQlzcHJpbnRmKHMsIiVzIiwgcGF0Y2gtPm5hbWUpOworCisJCWlmICghc3RyY21wKHMsIHBhdGNoX25hbWUpKSB7CisJCQlncHJfdXNlZCA9IHBhdGNoLT5ncHJfdXNlZDsKKwkJCWdvdG8gbWF0Y2g7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7CisKKyAgbWF0Y2g6CisJZm9yIChpID0gMDsgaSA8IE5VTV9HUFJTOyBpKyspCisJCWlmIChtZ3ItPmdwcltpXS50eXBlID09IEdQUl9UWVBFX0NPTlRST0wgJiYKKwkJICAgIHRlc3RfYml0KGksIGdwcl91c2VkKSAmJgorCQkgICAgIXN0cmNtcChtZ3ItPmdwcltpXS5uYW1lLCBncHJfbmFtZSkpCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAtMTsKK30KKwordm9pZCBlbXUxMGsxX3NldF9jb250cm9sX2dwcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBpbnQgYWRkciwgczMyIHZhbCwgaW50IGZsYWcpCit7CisJc3RydWN0IHBhdGNoX21hbmFnZXIgKm1nciA9ICZjYXJkLT5tZ3I7CisKKwlEUEQoMiwgImVtdTEwazFfc2V0X2NvbnRyb2xfZ3ByKCk6ICVkICV4XG4iLCBhZGRyLCB2YWwpOworCisJaWYgKGFkZHIgPCAwIHx8IGFkZHIgPj0gTlVNX0dQUlMpCisJCXJldHVybjsKKworCS8vZml4bWU6IG9uY2UgcGF0Y2ggbWFuYWdlciBpcyB1cCwgcmVtZW1iZXIgdG8gZml4IHRoaXMgZm9yIHRoZSBhdWRpZ3kKKwlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7CisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX0dQUl9CQVNFICsgYWRkciwgMCwgdmFsKTsKKwl9IGVsc2UgeworCQlpZiAoZmxhZykKKwkJCXZhbCArPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBHUFJfQkFTRSArIGFkZHIsIDApOworCQlpZiAodmFsID4gbWdyLT5ncHJbYWRkcl0ubWF4KQorCQkJdmFsID0gbWdyLT5ncHJbYWRkcl0ubWF4OworCQllbHNlIGlmICh2YWwgPCBtZ3ItPmdwclthZGRyXS5taW4pCisJCQl2YWwgPSBtZ3ItPmdwclthZGRyXS5taW47CisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBHUFJfQkFTRSArIGFkZHIsIDAsIHZhbCk7CisJfQorCQorCQorfQorCisvL1RPRE86IG1ha2UgdGhpcyBjb25maWd1cmFibGU6CisjZGVmaW5lIFZPTENUUkxfQ0hBTk5FTCBTT1VORF9NSVhFUl9WT0xVTUUKKyNkZWZpbmUgVk9MQ1RSTF9TVEVQX1NJWkUgICAgICAgIDUKKworLy9BbiBpbnRlcm5hbCBmdW5jdGlvbiBmb3Igc2V0dGluZyBPU1MgbWl4ZXIgY29udHJvbHMuCitzdGF0aWMgdm9pZCBlbXUxMGsxX3NldF9vc3Nfdm9sKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBvc3NfbWl4ZXIsCisJCQkJdW5zaWduZWQgaW50IGxlZnQsIHVuc2lnbmVkIGludCByaWdodCkKK3sKKwlleHRlcm4gY2hhciB2b2x1bWVfcGFyYW1zW1NPVU5EX01JWEVSX05SREVWSUNFU107CisKKwljYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfbWl4ZXJdID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsKKworCWlmICghY2FyZC0+aXNfYXBzKQorCQljYXJkLT5hYzk3LT53cml0ZV9taXhlcihjYXJkLT5hYzk3LCBvc3NfbWl4ZXIsIGxlZnQsIHJpZ2h0KTsKKwkKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIGNhcmQtPm1nci5jdHJsX2dwcltvc3NfbWl4ZXJdWzBdLCBsZWZ0LAorCQkJICAgICAgIHZvbHVtZV9wYXJhbXNbb3NzX21peGVyXSk7CisKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIGNhcmQtPm1nci5jdHJsX2dwcltvc3NfbWl4ZXJdWzFdLCByaWdodCwKKwkJCSAgICAgICB2b2x1bWVfcGFyYW1zW29zc19taXhlcl0pOworfQorCisvL0ZJWE1FOiBtdXRlIHNob3VsZCB1bm11dGUgd2hlbiBwcmVzc2VkIGEgc2Vjb25kIHRpbWUKK3ZvaWQgZW11MTBrMV9tdXRlX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwlpbnQgb3NzX2NoYW5uZWwgPSBWT0xDVFJMX0NIQU5ORUw7CisJaW50IGxlZnQsIHJpZ2h0OworCXN0YXRpYyBpbnQgdmFsOworCisJaWYgKHZhbCkgeworCQlsZWZ0ID0gdmFsICYgMHhmZjsKKwkJcmlnaHQgPSAodmFsID4+IDgpICYgMHhmZjsKKwkJdmFsID0gMDsKKwl9IGVsc2UgeworCQl2YWwgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfY2hhbm5lbF07CisJCWxlZnQgPSAwOworCQlyaWdodCA9IDA7CisJfQorCisJZW11MTBrMV9zZXRfb3NzX3ZvbChjYXJkLCBvc3NfY2hhbm5lbCwgbGVmdCwgcmlnaHQpOworfQorCit2b2lkIGVtdTEwazFfdm9saW5jcl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJaW50IG9zc19jaGFubmVsID0gVk9MQ1RSTF9DSEFOTkVMOworCWludCBsZWZ0LCByaWdodDsKKworCWxlZnQgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfY2hhbm5lbF0gJiAweGZmOworCXJpZ2h0ID0gKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19jaGFubmVsXSA+PiA4KSAmIDB4ZmY7CisKKwlpZiAoKGxlZnQgKz0gVk9MQ1RSTF9TVEVQX1NJWkUpID4gMTAwKQorCQlsZWZ0ID0gMTAwOworCisJaWYgKChyaWdodCArPSBWT0xDVFJMX1NURVBfU0laRSkgPiAxMDApCisJCXJpZ2h0ID0gMTAwOworCisJZW11MTBrMV9zZXRfb3NzX3ZvbChjYXJkLCBvc3NfY2hhbm5lbCwgbGVmdCwgcmlnaHQpOworfQorCit2b2lkIGVtdTEwazFfdm9sZGVjcl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJaW50IG9zc19jaGFubmVsID0gVk9MQ1RSTF9DSEFOTkVMOworCWludCBsZWZ0LCByaWdodDsKKworCWxlZnQgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfY2hhbm5lbF0gJiAweGZmOworCXJpZ2h0ID0gKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19jaGFubmVsXSA+PiA4KSAmIDB4ZmY7CisKKwlpZiAoKGxlZnQgLT0gVk9MQ1RSTF9TVEVQX1NJWkUpIDwgMCkKKwkJbGVmdCA9IDA7CisKKwlpZiAoKHJpZ2h0IC09IFZPTENUUkxfU1RFUF9TSVpFKSA8IDApCisJCXJpZ2h0ID0gMDsKKworCWVtdTEwazFfc2V0X29zc192b2woY2FyZCwgb3NzX2NoYW5uZWwsIGxlZnQsIHJpZ2h0KTsKK30KKwordm9pZCBlbXUxMGsxX3NldF92b2x1bWVfZ3ByKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBhZGRyLCBzMzIgdm9sLCBpbnQgc2NhbGUpCit7CisJc3RydWN0IHBhdGNoX21hbmFnZXIgKm1nciA9ICZjYXJkLT5tZ3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN0YXRpYyBjb25zdCBzMzIgbG9nMmxpbls0XSA9eyAgICAgICAgICAgLy8gIGF0dGVudWF0aW9uIChkQikKKwkJMHg3ZmZmZmZmZiwgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgMC4wICAgICAgICAgCisJCTB4N2ZmZmZmZmYgKiAwLjg0MDg5NjQxNTI1MzcxNSAsIC8vICAgICAgIDEuNSAgICAgICAgICAKKwkJMHg3ZmZmZmZmZiAqIDAuNzA3MTA2NzgxMTg2NTQ4LCAgLy8gICAgICAgMy4wCisJCTB4N2ZmZmZmZmYgKiAwLjU5NDYwMzU1NzUwMTM2MSAsIC8vICAgICAgIDQuNQorCX07CisKKwlpZiAoYWRkciA8IDApCisJCXJldHVybjsKKworCXZvbCA9ICgxMDAgLSB2b2wgKSAqIHNjYWxlIC8gMTAwOworCisJLy8gVGhhbmtzIHRvIHRoZSBjb21wLmRzcCBuZXdzZ3JvdXAgZm9yIHRoaXMgbmVhdCB0cmljazoKKwl2b2wgPSAodm9sID49IHNjYWxlKSA/IDAgOiAobG9nMmxpblt2b2wgJiAzXSA+PiAodm9sID4+IDIpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZ3ItPmxvY2ssIGZsYWdzKTsKKwllbXUxMGsxX3NldF9jb250cm9sX2dwcihjYXJkLCBhZGRyLCB2b2wsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1nci0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkIGVtdTEwazFfZHNwX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNhcmQtPnB0LnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKSB7CisJCXUzMiBiYzsKKwkJYmMgPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBHUFJfQkFTRSArIGNhcmQtPnB0LmludHJfZ3ByLCAwKTsKKwkJaWYgKGJjICE9IDApIHsKKwkJCURQRCgzLCAicHQgaW50ZXJydXB0LCBiYyA9ICVkXG4iLCBiYyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+cHQubG9jaywgZmxhZ3MpOworCQkJY2FyZC0+cHQuYmxvY2tzX3BsYXllZCA9IGJjOworCQkJaWYgKGNhcmQtPnB0LmJsb2Nrc19wbGF5ZWQgPj0gY2FyZC0+cHQuYmxvY2tzX2NvcGllZCkgeworCQkJCURQRigxLCAiYnVmZmVyIHVuZGVycnVuIGluIHBhc3N0aHJvdWdoIHBsYXliYWNrXG4iKTsKKwkJCQllbXUxMGsxX3B0X3N0b3AoY2FyZCk7CisJCQl9CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhcmQtPnB0LndhaXQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+cHQubG9jaywgZmxhZ3MpOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9lZnhtZ3IuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDhlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9lZnhtZ3IuaApAQCAtMCwwICsxLDI3MCBAQAorLyogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBzYmxpdmVfZnguaAorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAorICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKKyAqICAgICBVU0EuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqLworCisjaWZuZGVmIF9FRlhNR1JfSAorI2RlZmluZSBfRUZYTUdSX0gKKworc3RydWN0IGVtdV9lZnhfaW5mb190eworCWludCBvcGNvZGVfc2hpZnQ7CisJaW50IGhpZ2hfb3BlcmFuZF9zaGlmdDsKKwlpbnQgaW5zdHJ1Y3Rpb25fc3RhcnQ7CisJaW50IGdwcl9iYXNlOworCWludCBvdXRwdXRfYmFzZTsKK307CisKKworI2RlZmluZSBXUklURV9FRlgoYSwgYiwgYykgc2JsaXZlX3dyaXRlcHRyKChhKSwgZW11X2VmeF9pbmZvW2NhcmQtPmlzX2F1ZGlneV0uaW5zdHJ1Y3Rpb25fc3RhcnQgKyAoYiksIDAsIChjKSkKKworI2RlZmluZSBPUChvcCwgeiwgdywgeCwgeSkgXAorCWRvIHsgV1JJVEVfRUZYKGNhcmQsIChwYykgKiAyLCAoKHgpIDw8IGVtdV9lZnhfaW5mb1tjYXJkLT5pc19hdWRpZ3ldLmhpZ2hfb3BlcmFuZF9zaGlmdCkgfCAoeSkpOyBcCisJV1JJVEVfRUZYKGNhcmQsIChwYykgKiAyICsgMSwgKChvcCkgPDwgZW11X2VmeF9pbmZvW2NhcmQtPmlzX2F1ZGlneV0ub3Bjb2RlX3NoaWZ0ICkgfCAoKHopIDw8IGVtdV9lZnhfaW5mb1tjYXJkLT5pc19hdWRpZ3ldLmhpZ2hfb3BlcmFuZF9zaGlmdCkgfCAodykpOyBcCisJKytwYzsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBOVU1fSU5QVVRTIDB4MjAKKyNkZWZpbmUgTlVNX09VVFBVVFMgMHgyMAorI2RlZmluZSBOVU1fR1BSUyAweDEwMAorCisjZGVmaW5lIEFfTlVNX0lOUFVUUyAweDYwCisjZGVmaW5lIEFfTlVNX09VVFBVVFMgMHg2MCAgLy9maXhtZTogdGhpcyBtYXkgb3IgbWF5IG5vdCBiZSB0cnVlCisjZGVmaW5lIEFfTlVNX0dQUlMgMHgyMDAKKworI2RlZmluZSBHUFJfTkFNRV9TSVpFICAgMzIKKyNkZWZpbmUgUEFUQ0hfTkFNRV9TSVpFIDMyCisKK3N0cnVjdCBkc3BfcnBhdGNoIHsKKwljaGFyIG5hbWVbUEFUQ0hfTkFNRV9TSVpFXTsKKwl1MTYgY29kZV9zdGFydDsKKwl1MTYgY29kZV9zaXplOworCisJdW5zaWduZWQgbG9uZyBncHJfdXNlZFtOVU1fR1BSUyAvIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSArIDFdOworCXVuc2lnbmVkIGxvbmcgZ3ByX2lucHV0W05VTV9HUFJTIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpICsgMV07CisJdW5zaWduZWQgbG9uZyByb3V0ZVtOVU1fT1VUUFVUU107CisJdW5zaWduZWQgbG9uZyByb3V0ZV92W05VTV9PVVRQVVRTXTsKK307CisKK3N0cnVjdCBkc3BfcGF0Y2ggeworCWNoYXIgbmFtZVtQQVRDSF9OQU1FX1NJWkVdOworCXU4IGlkOworCXVuc2lnbmVkIGxvbmcgaW5wdXQ7CS8qIGJpdG1hcCBvZiB0aGUgbGluZXMgdXNlZCBhcyBpbnB1dHMgKi8KKwl1bnNpZ25lZCBsb25nIG91dHB1dDsJLyogYml0bWFwIG9mIHRoZSBsaW5lcyB1c2VkIGFzIG91dHB1dHMgKi8KKwl1MTYgY29kZV9zdGFydDsKKwl1MTYgY29kZV9zaXplOworCisJdW5zaWduZWQgbG9uZyBncHJfdXNlZFtOVU1fR1BSUyAvIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSArIDFdOwkvKiBiaXRtYXAgb2YgdXNlZCBncHJzICovCisJdW5zaWduZWQgbG9uZyBncHJfaW5wdXRbTlVNX0dQUlMgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgKyAxXTsKKwl1OCB0cmFtbF9pc3RhcnQ7CS8qIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGludGVybmFsIHRyYW0gbGluZXMgdXNlZCAqLworCXU4IHRyYW1sX2lzaXplOwkJLyogbnVtYmVyIG9mIGludGVybmFsIHRyYW0gbGluZXMgdXNlZCAqLworCisJdTggdHJhbWxfZXN0YXJ0OworCXU4IHRyYW1sX2VzaXplOworCisJdTE2IHRyYW1iX2lzdGFydDsgICAgICAgIC8qIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGludGVybmFsIHRyYW0gbWVtb3J5IHVzZWQgKi8KKwl1MTYgdHJhbWJfaXNpemU7ICAgICAgICAgLyogYW1vdW50IG9mIGludGVybmFsIG1lbW9yeSB1c2VkICovCisJdTMyIHRyYW1iX2VzdGFydDsKKwl1MzIgdHJhbWJfZXNpemU7Cit9OworCitzdHJ1Y3QgZHNwX2dwciB7CisJdTggdHlwZTsJCQkvKiBncHIgdHlwZSwgU1RBVElDLCBEWU5BTUlDLCBJTlBVVCwgT1VUUFVULCBDT05UUk9MICovCisJY2hhciBuYW1lW0dQUl9OQU1FX1NJWkVdOwkvKiBncHIgdmFsdWUsIG9ubHkgdmFsaWQgZm9yIGNvbnRyb2wgZ3BycyAqLworCXMzMiBtaW4sIG1heDsJCQkvKiB2YWx1ZSByYW5nZSBmb3IgdGhpcyBncHIsIG9ubHkgdmFsaWQgZm9yIGNvbnRyb2wgZ3BycyAqLworCXU4IGxpbmU7CQkJLyogd2hpY2ggaW5wdXQvb3V0cHV0IGxpbmUgaXMgdGhlIGdwciBhdHRhY2hlZCwgb25seSB2YWxpZCBmb3IgaW5wdXQvb3V0cHV0IGdwcnMgKi8KKwl1OCB1c2FnZTsKK307CisKK2VudW0geworCUdQUl9UWVBFX05VTEwgPSAwLAorCUdQUl9UWVBFX0lPLAorCUdQUl9UWVBFX1NUQVRJQywKKwlHUFJfVFlQRV9EWU5BTUlDLAorCUdQUl9UWVBFX0NPTlRST0wsCisJR1BSX1RZUEVfQ09OU1RBTlQKK307CisKKyNkZWZpbmUgR1BSX0JBU0UgMHgxMDAKKyNkZWZpbmUgT1VUUFVUX0JBU0UgMHgyMAorCisjZGVmaW5lIEFfR1BSX0JBU0UgMHg0MDAKKyNkZWZpbmUgQV9PVVRQVVRfQkFTRSAweDYwCisKKyNkZWZpbmUgTUFYX1BBVENIRVNfUEFHRVMgMzIKKworc3RydWN0IHBhdGNoX21hbmFnZXIgeworCXZvaWQgKnBhdGNoW01BWF9QQVRDSEVTX1BBR0VTXTsKKwlpbnQgY3VycmVudF9wYWdlczsKKwlzdHJ1Y3QgZHNwX3JwYXRjaCBycGF0Y2g7CisJc3RydWN0IGRzcF9ncHIgZ3ByW05VTV9HUFJTXTsgICAvKiBncHIgdXNhZ2UgdGFibGUgKi8KKwlzcGlubG9ja190IGxvY2s7CisJczE2IGN0cmxfZ3ByW1NPVU5EX01JWEVSX05SREVWSUNFU11bMl07Cit9OworCisjZGVmaW5lIFBBVENIRVNfUEVSX1BBR0UgKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgZHNwX3BhdGNoKSkKKworI2RlZmluZSBQQVRDSChtZ3IsIGkpICgoc3RydWN0IGRzcF9wYXRjaCAqKSAobWdyKS0+cGF0Y2hbKGkpIC8gUEFUQ0hFU19QRVJfUEFHRV0gKyAoaSkgJSBQQVRDSEVTX1BFUl9QQUdFKQorCisvKiBQQ00gdm9sdW1lIGNvbnRyb2wgKi8KKyNkZWZpbmUgVE1QX1BDTV9MICAgICAweDEwMCAvL3RlbXAgUENNIEwgKGFmdGVyIHRoZSB2b2wgY29udHJvbCkgICAgICAgCisjZGVmaW5lIFRNUF9QQ01fUiAgICAgMHgxMDEKKyNkZWZpbmUgVk9MX1BDTV9MICAgICAweDEwMiAvL3ZvbCBQQ00KKyNkZWZpbmUgVk9MX1BDTV9SICAgICAweDEwMworCisvKiBSb3V0aW5nIHBhdGNoICovCisjZGVmaW5lIFRNUF9BQ19MICAgICAgMHgxMDQgLy90bXAgYWM5NyBvdXQKKyNkZWZpbmUgVE1QX0FDX1IgICAgICAweDEwNQorI2RlZmluZSBUTVBfUkVBUl9MICAgIDB4MTA2IC8vb3V0cHV0IC0gVGVtcCBSZWFyCisjZGVmaW5lIFRNUF9SRUFSX1IgICAgMHgxMDcKKyNkZWZpbmUgVE1QX0RJR0lfTCAgICAweDEwOCAvL291dHB1dCAtIFRlbXAgZGlnaXRhbAorI2RlZmluZSBUTVBfRElHSV9SICAgIDB4MTA5CisjZGVmaW5lIERTUF9WT0xfTCAgICAgMHgxMGEgLy8gbWFpbiBkc3Agdm9sdW1lCisjZGVmaW5lIERTUF9WT0xfUiAgICAgMHgxMGIKKworLyogaHcgaW5wdXRzICovCisjZGVmaW5lIFBDTV9JTl9MIAkweDAwCisjZGVmaW5lIFBDTV9JTl9SIAkweDAxCisKKyNkZWZpbmUgUENNMV9JTl9MICAgICAgICAweDA0CisjZGVmaW5lIFBDTTFfSU5fUiAgICAgICAgMHgwNQorLy9tdXRpbGNoYW5uZWwgcGxheWJhY2sgc3RyZWFtIGFwcGVhciBoZXJlOgorCisjZGVmaW5lIE1VTFRJX0ZST05UX0wJMHgwOAorI2RlZmluZSBNVUxUSV9GUk9OVF9SCTB4MDkKKyNkZWZpbmUgTVVMVElfUkVBUl9MCTB4MGEKKyNkZWZpbmUgTVVMVElfUkVBUl9SCTB4MGIKKyNkZWZpbmUgTVVMVElfQ0VOVEVSCTB4MGMKKyNkZWZpbmUgTVVMVElfTEZFCTB4MGQKKworI2RlZmluZSBBQzk3X0lOX0wJMHgxMAorI2RlZmluZSBBQzk3X0lOX1IJMHgxMQorI2RlZmluZSBTUERJRl9DRF9MCTB4MTIKKyNkZWZpbmUgU1BESUZfQ0RfUgkweDEzCisKKy8qIGh3IG91dHB1dHMgKi8KKyNkZWZpbmUgQUM5N19GUk9OVF9MCTB4MjAKKyNkZWZpbmUgQUM5N19GUk9OVF9SCTB4MjEKKyNkZWZpbmUgRElHSVRBTF9PVVRfTAkweDIyCisjZGVmaW5lIERJR0lUQUxfT1VUX1IJMHgyMworI2RlZmluZSBESUdJVEFMX0NFTlRFUgkweDI0CisjZGVmaW5lIERJR0lUQUxfTEZFCTB4MjUKKworI2RlZmluZSBBTkFMT0dfUkVBUl9MCTB4MjgKKyNkZWZpbmUgQU5BTE9HX1JFQVJfUgkweDI5CisjZGVmaW5lIEFEQ19SRUNfTAkweDJhCisjZGVmaW5lIEFEQ19SRUNfUgkweDJiCisKKyNkZWZpbmUgQU5BTE9HX0NFTlRFUgkweDMxCisjZGVmaW5lIEFOQUxPR19MRkUJMHgzMgorCisKKyNkZWZpbmUgSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsIG5tLCBsbiwgaSkJCVwKK2RvIHsJCQkJCQkJXAorCXBhdGNoID0gUEFUQ0gobWdyLCBwYXRjaF9uKTsJCQlcCisJc3RyY3B5KHBhdGNoLT5uYW1lLCBubSk7CQkJXAorCXBhdGNoLT5jb2RlX3N0YXJ0ID0gcGMgKiAyOwkJCVwKKwlwYXRjaC0+aW5wdXQgPSAoMTw8KDB4MWYmbG4pKTsJCQlcCisJcGF0Y2gtPm91dHB1dD0gKDE8PCgweDFmJmxuKSk7CQkJXAorCXBhdGNoLT5pZCA9IGk7CQkJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKQkJCQlcCitkbyB7CQkJCQkJCVwKKwlwYXRjaC0+Y29kZV9zaXplID0gcGMgKiAyIC0gcGF0Y2gtPmNvZGVfc3RhcnQ7CVwKKwlwYXRjaF9uKys7CQkJCQlcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBST1VUSU5HX1BBVENIX1NUQVJUKHBhdGNoLCBubSkJXAorZG8gewkJCQkJXAorCXBhdGNoID0gJm1nci0+cnBhdGNoOwkJXAorCXN0cmNweShwYXRjaC0+bmFtZSwgbm0pOwlcCisJcGF0Y2gtPmNvZGVfc3RhcnQgPSBwYyAqIDI7CVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBST1VUSU5HX1BBVENIX0VORChwYXRjaCkJCQlcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlwYXRjaC0+Y29kZV9zaXplID0gcGMgKiAyIC0gcGF0Y2gtPmNvZGVfc3RhcnQ7ICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIENPTk5FQ1QoaW5wdXQsIG91dHB1dCkgc2V0X2JpdChpbnB1dCwgJnJwYXRjaC0+cm91dGVbKG91dHB1dCkgLSBPVVRQVVRfQkFTRV0pOworCisjZGVmaW5lIENPTk5FQ1RfVihpbnB1dCwgb3V0cHV0KSBzZXRfYml0KGlucHV0LCAmcnBhdGNoLT5yb3V0ZV92WyhvdXRwdXQpIC0gT1VUUFVUX0JBU0VdKTsKKworI2RlZmluZSBPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsIG5tLCBsbiwgaSkJCVwKK2RvIHsJCQkJCQkJXAorCXBhdGNoID0gUEFUQ0gobWdyLCBwYXRjaF9uKTsJCQlcCisJc3RyY3B5KHBhdGNoLT5uYW1lLCBubSk7CQkJXAorCXBhdGNoLT5jb2RlX3N0YXJ0ID0gcGMgKiAyOwkJCVwKKwlwYXRjaC0+aW5wdXQgPSAoMTw8KDB4MWYmbG4pKTsJCQlcCisJcGF0Y2gtPm91dHB1dD0gKDE8PCgweDFmJmxuKSk7CQkJXAorCXBhdGNoLT5pZCA9IGk7CQkJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgT1VUUFVUX1BBVENIX0VORChwYXRjaCkJCQkJXAorZG8gewkJCQkJCQlcCisJcGF0Y2gtPmNvZGVfc2l6ZSA9IHBjICogMiAtIHBhdGNoLT5jb2RlX3N0YXJ0OwlcCisJcGF0Y2hfbisrOwkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEdFVF9PVVRQVVRfR1BSKHBhdGNoLCBnLCBsbikJCQlcCitkbyB7CQkJCQkJCVwKKwltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udHlwZSA9IEdQUl9UWVBFX0lPOwlcCisJbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnVzYWdlKys7CQlcCisJbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLmxpbmUgPSBsbjsJCVwKKwlzZXRfYml0KChnKSAtIEdQUl9CQVNFLCBwYXRjaC0+Z3ByX3VzZWQpOwlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgR0VUX0lOUFVUX0dQUihwYXRjaCwgZywgbG4pCQkJXAorZG8gewkJCQkJCQlcCisJbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9JTzsJXAorCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS51c2FnZSsrOwkJXAorCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5saW5lID0gbG47CQlcCisJc2V0X2JpdCgoZykgLSBHUFJfQkFTRSwgcGF0Y2gtPmdwcl91c2VkKTsJXAorCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfaW5wdXQpOwlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgR0VUX0RZTkFNSUNfR1BSKHBhdGNoLCBnKQkJCQlcCitkbyB7CQkJCQkJCQlcCisJbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9EWU5BTUlDOwlcCisJbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnVzYWdlKys7CQkJXAorCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfdXNlZCk7ICAgICAgICAgIAlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgR0VUX0NPTlRST0xfR1BSKHBhdGNoLCBnLCBubSwgYSwgYikJCQlcCitkbyB7CQkJCQkJCQlcCisJc3RyY3B5KG1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5uYW1lLCBubSk7CQlcCisJbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9DT05UUk9MOwlcCisJbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnVzYWdlKys7CQkJXAorCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5taW4gPSBhOwkJCVwKKwltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0ubWF4ID0gYjsJCQlcCisJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIGcsIDAsIGIpOwkJCQlcCisJc2V0X2JpdCgoZykgLSBHUFJfQkFTRSwgcGF0Y2gtPmdwcl91c2VkKTsJCVwKK30gd2hpbGUoMCkKKworI2VuZGlmIC8qIF9FRlhNR1JfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZW11YWR4bWcuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2VtdWFkeG1nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkMmQ0YwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2VtdWFkeG1nLmMKQEAgLTAsMCArMSwxMDQgQEAKKworLyogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBlbXVhZHhtZy5jIC0gQWRkcmVzcyBzcGFjZSBtYW5hZ2VyIGZvciBlbXUxMGsxIGRyaXZlciAKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCisgKiAgICAgVVNBLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKi8KKworI2luY2x1ZGUgImh3YWNjZXNzLmgiCisKKy8qIEFsbG9jYXRlcyBlbXUgYWRkcmVzcyBzcGFjZSAqLworCitpbnQgZW11MTBrMV9hZGR4bWdyX2FsbG9jKHUzMiBzaXplLCBzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXUxNiAqcGFnZXRhYmxlID0gY2FyZC0+ZW11cGFnZXRhYmxlOworCXUxNiBpbmRleCA9IDA7CisJdTE2IG51bXBhZ2VzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBDb252ZXJ0IGJ5dGVzIHRvIHBhZ2VzICovCisJbnVtcGFnZXMgPSAoc2l6ZSAvIEVNVVBBR0VTSVpFKSArICgoc2l6ZSAlIEVNVVBBR0VTSVpFKSA/IDEgOiAwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoaW5kZXggPCAoTUFYUEFHRVMgLSAxKSkgeworCQlpZiAocGFnZXRhYmxlW2luZGV4XSAmIDB4ODAwMCkgeworCQkJLyogVGhpcyBibG9jayBvZiBwYWdlcyBpcyBpbiB1c2UsIGp1bXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGJsb2NrLiAqLworCQkJaW5kZXggKz0gKHBhZ2V0YWJsZVtpbmRleF0gJiAweDdmZmYpOworCQl9IGVsc2UgeworCQkJLyogRm91bmQgZnJlZSBibG9jayAqLworCQkJaWYgKHBhZ2V0YWJsZVtpbmRleF0gPj0gbnVtcGFnZXMpIHsKKworCQkJCS8qIEJsb2NrIGlzIGxhcmdlIGVub3VnaCAqLworCisJCQkJLyogSWYgZnJlZSBibG9jayBpcyBsYXJnZXIgdGhhbiB0aGUgYmxvY2sgcmVxdWVzdGVkCisJCQkJICogdGhlbiBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGJsb2NrIHJlbWFpbmluZyAqLworCQkJCWlmIChwYWdldGFibGVbaW5kZXhdID4gbnVtcGFnZXMpCisJCQkJCXBhZ2V0YWJsZVtpbmRleCArIG51bXBhZ2VzXSA9IHBhZ2V0YWJsZVtpbmRleF0gLSBudW1wYWdlczsKKworCQkJCXBhZ2V0YWJsZVtpbmRleF0gPSAobnVtcGFnZXMgfCAweDgwMDApOwkvKiBNYXJrIGJsb2NrIGFzIHVzZWQgKi8KKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkJCXJldHVybiBpbmRleDsKKwkJCX0gZWxzZSB7CisJCQkJLyogQmxvY2sgdG9vIHNtYWxsLCBqdW1wIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBibG9jayAqLworCQkJCWluZGV4ICs9IHBhZ2V0YWJsZVtpbmRleF07CisJCQl9CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIEZyZWVzIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgZW11IGFkZHJlc3Mgc3BhY2UuICovCisKK3ZvaWQgZW11MTBrMV9hZGR4bWdyX2ZyZWUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IGluZGV4KQoreworCXUxNiAqcGFnZXRhYmxlID0gY2FyZC0+ZW11cGFnZXRhYmxlOworCXUxNiBvcmlnc2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocGFnZXRhYmxlW2luZGV4XSAmIDB4ODAwMCkgeworCQkvKiBCbG9jayBpcyBhbGxvY2F0ZWQgLSBtYXJrIGJsb2NrIGFzIGZyZWUgKi8KKwkJb3JpZ3NpemUgPSBwYWdldGFibGVbaW5kZXhdICYgMHg3ZmZmOworCQlwYWdldGFibGVbaW5kZXhdID0gb3JpZ3NpemU7CisKKwkJLyogSWYgbmV4dCBibG9jayBpcyBmcmVlLCB3ZSBjb25jYXQgYm90aCBibG9ja3MgKi8KKwkJaWYgKCEocGFnZXRhYmxlW2luZGV4ICsgb3JpZ3NpemVdICYgMHg4MDAwKSkKKwkJCXBhZ2V0YWJsZVtpbmRleF0gKz0gcGFnZXRhYmxlW2luZGV4ICsgb3JpZ3NpemVdICYgMHg3ZmZmOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2h3YWNjZXNzLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzE2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5jCkBAIC0wLDAgKzEsNTA3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBod2FjY2Vzcy5jIC0tIEhhcmR3YXJlIGFjY2VzcyBsYXllcgorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICogICAgIERlY2VtYmVyIDksIDE5OTkgICAgIEpvbiBUYXlsb3IgICAgICByZXdyb3RlIHRoZSBJL08gc3Vic3lzdGVtCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgIjgwMTAuaCIKKyNpbmNsdWRlICJpY2FyZG1pZC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbiA6IHNyVG9QaXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogSW5wdXQgICAgOiBzYW1wbGVSYXRlIC0gc2FtcGxpbmcgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIFJldHVybiAgIDogcGl0Y2ggdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBBYm91dCAgICA6IGNvbnZlcnQgc2FtcGxpbmcgcmF0ZSB0byBwaXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogTm90ZSAgICAgOiBmb3IgODAxMCwgc2FtcGxpbmcgcmF0ZSBpcyBhdCA0OGtIeiwgdGhpcyBmdW5jdGlvbiBzaG91bGQgICAqCisqICAgICAgICAgICAgYmUgY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBzclRvUGl0Y2godTMyIHNhbXBsZVJhdGUpCit7CisJaW50IGk7CisKKwkvKiBGSVhNRTogVGhlc2UgdGFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGluIGEgaGVhZGVyZmlsZSAqLworCXN0YXRpYyB1MzIgbG9nTWFnVGFibGVbMTI4XSA9IHsKKwkJMHgwMDAwMCwgMHgwMmRmYywgMHgwNWI5ZSwgMHgwODhlNiwgMHgwYjVkNiwgMHgwZTI2ZiwgMHgxMGViMywgMHgxM2FhMiwKKwkJMHgxNjYzZiwgMHgxOTE4YSwgMHgxYmM4NCwgMHgxZTcyZSwgMHgyMTE4YiwgMHgyM2I5YSwgMHgyNjU1ZCwgMHgyOGVkNSwKKwkJMHgyYjgwMywgMHgyZTBlOCwgMHgzMDk4NSwgMHgzMzFkYiwgMHgzNTllYiwgMHgzODFiNiwgMHgzYTkzZCwgMHgzZDA4MSwKKwkJMHgzZjc4MiwgMHg0MWU0MiwgMHg0NDRjMSwgMHg0NmIwMSwgMHg0OTEwMSwgMHg0YjZjNCwgMHg0ZGM0OSwgMHg1MDE5MSwKKwkJMHg1MjY5ZSwgMHg1NGI2ZiwgMHg1NzAwNiwgMHg1OTQ2MywgMHg1Yjg4OCwgMHg1ZGM3NCwgMHg2MDAyOSwgMHg2MjNhNywKKwkJMHg2NDZlZSwgMHg2NmEwMCwgMHg2OGNkZCwgMHg2YWY4NiwgMHg2ZDFmYSwgMHg2ZjQzYywgMHg3MTY0YiwgMHg3MzgyOSwKKwkJMHg3NTlkNCwgMHg3N2I0ZiwgMHg3OWM5YSwgMHg3YmRiNSwgMHg3ZGVhMSwgMHg3ZmY1ZSwgMHg4MWZlZCwgMHg4NDA0ZSwKKwkJMHg4NjA4MiwgMHg4ODA4OSwgMHg4YTA2NCwgMHg4YzAxNCwgMHg4ZGY5OCwgMHg4ZmVmMSwgMHg5MWUyMCwgMHg5M2QyNiwKKwkJMHg5NWMwMSwgMHg5N2FiNCwgMHg5OTkzZSwgMHg5Yjc5ZiwgMHg5ZDVkOSwgMHg5ZjNlYywgMHhhMTFkOCwgMHhhMmY5ZCwKKwkJMHhhNGQzYywgMHhhNmFiNSwgMHhhODgwOCwgMHhhYTUzNywgMHhhYzI0MSwgMHhhZGYyNiwgMHhhZmJlNywgMHhiMTg4NSwKKwkJMHhiMzUwMCwgMHhiNTE1NywgMHhiNmQ4YywgMHhiODk5ZiwgMHhiYTU4ZiwgMHhiYzE1ZSwgMHhiZGQwYywgMHhiZjg5OSwKKwkJMHhjMTQwNCwgMHhjMmY1MCwgMHhjNGE3YiwgMHhjNjU4NywgMHhjODA3MywgMHhjOWIzZiwgMHhjYjVlZCwgMHhjZDA3YywKKwkJMHhjZWFlYywgMHhkMDUzZiwgMHhkMWY3MywgMHhkMzk4YSwgMHhkNTM4NCwgMHhkNmQ2MCwgMHhkODcyMCwgMHhkYTBjMywKKwkJMHhkYmE0YSwgMHhkZDNiNCwgMHhkZWQwMywgMHhlMDYzNiwgMHhlMWY0ZSwgMHhlMzg0YSwgMHhlNTEyYywgMHhlNjlmMywKKwkJMHhlODI5ZiwgMHhlOWIzMSwgMHhlYjNhOSwgMHhlY2MwOCwgMHhlZTQ0YywgMHhlZmM3OCwgMHhmMTQ4YSwgMHhmMmM4MywKKwkJMHhmNDQ2MywgMHhmNWMyYSwgMHhmNzNkYSwgMHhmOGI3MSwgMHhmYTJmMCwgMHhmYmE1NywgMHhmZDFhNywgMHhmZThkZgorCX07CisKKwlzdGF0aWMgY2hhciBsb2dTbG9wZVRhYmxlWzEyOF0gPSB7CisJCTB4NWMsIDB4NWMsIDB4NWIsIDB4NWEsIDB4NWEsIDB4NTksIDB4NTgsIDB4NTgsCisJCTB4NTcsIDB4NTYsIDB4NTYsIDB4NTUsIDB4NTUsIDB4NTQsIDB4NTMsIDB4NTMsCisJCTB4NTIsIDB4NTIsIDB4NTEsIDB4NTEsIDB4NTAsIDB4NTAsIDB4NGYsIDB4NGYsCisJCTB4NGUsIDB4NGQsIDB4NGQsIDB4NGQsIDB4NGMsIDB4NGMsIDB4NGIsIDB4NGIsCisJCTB4NGEsIDB4NGEsIDB4NDksIDB4NDksIDB4NDgsIDB4NDgsIDB4NDcsIDB4NDcsCisJCTB4NDcsIDB4NDYsIDB4NDYsIDB4NDUsIDB4NDUsIDB4NDUsIDB4NDQsIDB4NDQsCisJCTB4NDMsIDB4NDMsIDB4NDMsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDEsIDB4NDEsCisJCTB4NDEsIDB4NDAsIDB4NDAsIDB4NDAsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2UsCisJCTB4M2UsIDB4M2UsIDB4M2QsIDB4M2QsIDB4M2QsIDB4M2MsIDB4M2MsIDB4M2MsCisJCTB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2EsIDB4M2EsIDB4M2EsIDB4MzksCisJCTB4MzksIDB4MzksIDB4MzksIDB4MzgsIDB4MzgsIDB4MzgsIDB4MzgsIDB4MzcsCisJCTB4MzcsIDB4MzcsIDB4MzcsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzUsCisJCTB4MzUsIDB4MzUsIDB4MzUsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsCisJCTB4MzMsIDB4MzMsIDB4MzMsIDB4MzMsIDB4MzIsIDB4MzIsIDB4MzIsIDB4MzIsCisJCTB4MzIsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzAsIDB4MzAsCisJCTB4MzAsIDB4MzAsIDB4MzAsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYKKwl9OworCisJaWYgKHNhbXBsZVJhdGUgPT0gMCkKKwkJcmV0dXJuIDA7CS8qIEJhaWwgb3V0IGlmIG5vIGxlYWRpbmcgIjEiICovCisKKwlzYW1wbGVSYXRlICo9IDExMTg1OwkvKiBTY2FsZSA0ODAwMCB0byAweDIwMDAyMzgwICovCisKKwlmb3IgKGkgPSAzMTsgaSA+IDA7IGktLSkgeworCQlpZiAoc2FtcGxlUmF0ZSAmIDB4ODAwMDAwMDApIHsJLyogRGV0ZWN0IGxlYWRpbmcgIjEiICovCisJCQlyZXR1cm4gKHUzMikgKCgoczMyKSAoaSAtIDE1KSA8PCAyMCkgKworCQkJCSAgICAgIGxvZ01hZ1RhYmxlWzB4N2YgJiAoc2FtcGxlUmF0ZSA+PiAyNCldICsKKwkJCQkgICAgICAoMHg3ZiAmIChzYW1wbGVSYXRlID4+IDE3KSkgKiBsb2dTbG9wZVRhYmxlWzB4N2YgJiAoc2FtcGxlUmF0ZSA+PiAyNCldKTsKKwkJfQorCQlzYW1wbGVSYXRlID0gc2FtcGxlUmF0ZSA8PCAxOworCX0KKworCURQRigyLCAic3JUb1BpdGNoOiBCVUchXG4iKTsKKwlyZXR1cm4gMDsJCS8qIFNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBvaW50ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHdyaXRlL3JlYWQgUENJIGZ1bmN0aW9uIDAgcmVnaXN0ZXJzICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGVtdTEwazFfd3JpdGVmbjAoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHJlZywgdTMyIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyZWcgJiAweGZmMDAwMDAwKSB7CisJCXUzMiBtYXNrOworCQl1OCBzaXplLCBvZmZzZXQ7CisKKwkJc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKKwkJb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOworCQltYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OworCQlkYXRhID0gKGRhdGEgPDwgb2Zmc2V0KSAmIG1hc2s7CisJCXJlZyAmPSAweDdmOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCWRhdGEgfD0gaW5sKGNhcmQtPmlvYmFzZSArIHJlZykgJiB+bWFzazsKKwkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyByZWcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyByZWcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuOworfQorCisjaWZkZWYgREJHRU1VCit2b2lkIGVtdTEwazFfd3JpdGVmbjBfMihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgcmVnLCB1MzIgZGF0YSwgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2l6ZSA9PSAzMikKKwkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyAocmVnICYgMHgxRikpOworCWVsc2UgaWYgKHNpemUgPT0gMTYpCisJCW91dHcoZGF0YSwgY2FyZC0+aW9iYXNlICsgKHJlZyAmIDB4MUYpKTsKKwllbHNlCisJCW91dGIoZGF0YSwgY2FyZC0+aW9iYXNlICsgKHJlZyAmIDB4MUYpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybjsKK30KKyNlbmRpZiAgLyogIERCR0VNVSAgKi8KKwordTMyIGVtdTEwazFfcmVhZGZuMChzdHJ1Y3QgZW11MTBrMV9jYXJkICogY2FyZCwgdTMyIHJlZykKK3sKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmVnICYgMHhmZjAwMDAwMCkgeworCQl1MzIgbWFzazsKKwkJdTggc2l6ZSwgb2Zmc2V0OworCisJCXNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7CisJCW9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKKwkJbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKKwkJcmVnICY9IDB4N2Y7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIHJlZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gKHZhbCAmIG1hc2spID4+IG9mZnNldDsKKyAgICAgICAgfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIHJlZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHZhbDsKKwl9Cit9CisKK3ZvaWQgZW11MTBrMV90aW1lcl9zZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqIGNhcmQsIHUxNiBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCW91dHcoZGF0YSAmIFRJTUVSX1JBVEVfTUFTSywgY2FyZC0+aW9iYXNlICsgVElNRVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB3cml0ZS9yZWFkIEVtdTEwazEgcG9pbnRlci1vZmZzZXQgcmVnaXN0ZXIgc2V0LCBhY2Nlc3NlZCB0aHJvdWdoICAgICAgKgorKiAgdGhlIFBUUiBhbmQgREFUQSByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQV9QVFJfQUREUkVTU19NQVNLIDB4MGZmZjAwMDAKK3ZvaWQgc2JsaXZlX3dyaXRlcHRyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiByZWcsIHUzMiBjaGFubmVsLCB1MzIgZGF0YSkKK3sKKwl1MzIgcmVncHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZWdwdHIgPSAoKHJlZyA8PCAxNikgJiBBX1BUUl9BRERSRVNTX01BU0spIHwgKGNoYW5uZWwgJiBQVFJfQ0hBTk5FTE5VTV9NQVNLKTsKKworCWlmIChyZWcgJiAweGZmMDAwMDAwKSB7CisJCXUzMiBtYXNrOworCQl1OCBzaXplLCBvZmZzZXQ7CisKKwkJc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKKwkJb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOworCQltYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OworCQlkYXRhID0gKGRhdGEgPDwgb2Zmc2V0KSAmIG1hc2s7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJb3V0bChyZWdwdHIsIGNhcmQtPmlvYmFzZSArIFBUUik7CisJCWRhdGEgfD0gaW5sKGNhcmQtPmlvYmFzZSArIERBVEEpICYgfm1hc2s7CisJCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgREFUQSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQlvdXRsKHJlZ3B0ciwgY2FyZC0+aW9iYXNlICsgUFRSKTsKKwkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyBEQVRBKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCX0KK30KKworLyogLi4uIDogIGRhdGEsIHJlZywgLi4uICwgVEFHTElTVF9FTkQgKi8KK3ZvaWQgc2JsaXZlX3dyaXRlcHRyX3RhZyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgY2hhbm5lbCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIHUzMiByZWc7CisKKwl2YV9zdGFydChhcmdzLCBjaGFubmVsKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJd2hpbGUgKChyZWcgPSB2YV9hcmcoYXJncywgdTMyKSkgIT0gVEFHTElTVF9FTkQpIHsKKwkJdTMyIGRhdGEgPSB2YV9hcmcoYXJncywgdTMyKTsKKwkJdTMyIHJlZ3B0ciA9ICgoKHJlZyA8PCAxNikgJiBBX1BUUl9BRERSRVNTX01BU0spCisJCQkgICAgICB8IChjaGFubmVsICYgUFRSX0NIQU5ORUxOVU1fTUFTSykpOworCQlvdXRsKHJlZ3B0ciwgY2FyZC0+aW9iYXNlICsgUFRSKTsKKwkJaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKKwkJCWludCBzaXplID0gKHJlZyA+PiAyNCkgJiAweDNmOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKKwkJCXUzMiBtYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OworCQkJZGF0YSA9IChkYXRhIDw8IG9mZnNldCkgJiBtYXNrOworCisJCQlkYXRhIHw9IGlubChjYXJkLT5pb2Jhc2UgKyBEQVRBKSAmIH5tYXNrOworCQl9CisJCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgREFUQSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCXZhX2VuZChhcmdzKTsKKworCXJldHVybjsKK30KKwordTMyIHNibGl2ZV9yZWFkcHRyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiBjYXJkLCB1MzIgcmVnLCB1MzIgY2hhbm5lbCkKK3sKKwl1MzIgcmVncHRyLCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJlZ3B0ciA9ICgocmVnIDw8IDE2KSAmIEFfUFRSX0FERFJFU1NfTUFTSykgfCAoY2hhbm5lbCAmIFBUUl9DSEFOTkVMTlVNX01BU0spOworCisJaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKKwkJdTMyIG1hc2s7CisJCXU4IHNpemUsIG9mZnNldDsKKworCQlzaXplID0gKHJlZyA+PiAyNCkgJiAweDNmOworCQlvZmZzZXQgPSAocmVnID4+IDE2KSAmIDB4MWY7CisJCW1hc2sgPSAoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQ7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJb3V0bChyZWdwdHIsIGNhcmQtPmlvYmFzZSArIFBUUik7CisJCXZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyBEQVRBKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJCXJldHVybiAodmFsICYgbWFzaykgPj4gb2Zmc2V0OworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCW91dGwocmVncHRyLCBjYXJkLT5pb2Jhc2UgKyBQVFIpOworCQl2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgREFUQSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gdmFsOworCX0KK30KKwordm9pZCBlbXUxMGsxX2lycV9lbmFibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIGlycV9tYXNrKQoreworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQRigyLCJlbXUxMGsxX2lycV9lbmFibGUoKVxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICB2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgSU5URSkgfCBpcnFfbWFzazsKKyAgICAgICAgb3V0bCh2YWwsIGNhcmQtPmlvYmFzZSArIElOVEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgZW11MTBrMV9pcnFfZGlzYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgaXJxX21hc2spCit7CisgICAgICAgIHUzMiB2YWw7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgRFBGKDIsImVtdTEwazFfaXJxX2Rpc2FibGUoKVxuIik7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIElOVEUpICYgfmlycV9tYXNrOworICAgICAgICBvdXRsKHZhbCwgY2FyZC0+aW9iYXNlICsgSU5URSk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuOworfQorCit2b2lkIGVtdTEwazFfY2xlYXJfc3RvcF9vbl9sb29wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiB2b2ljZW51bSkKK3sKKwkvKiBWb2ljZSBpbnRlcnJ1cHQgKi8KKwlpZiAodm9pY2VudW0gPj0gMzIpCisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBTT0xFSCB8ICgoMHgwMTAwIHwgKHZvaWNlbnVtIC0gMzIpKSA8PCAxNiksIDAsIDApOworCWVsc2UKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFNPTEVMIHwgKCgweDAxMDAgfCB2b2ljZW51bSkgPDwgMTYpLCAwLCAwKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgc2JsaXZlX3djd2FpdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgd2FpdCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCB1Q291bnQ7CisJdTMyIG5ld3RpbWUgPSAwLCBjdXJ0aW1lOworCisJY3VydGltZSA9IGVtdTEwazFfcmVhZGZuMChjYXJkLCBXQ19TQU1QTEVDT1VOVEVSKTsKKwl3aGlsZSAod2FpdC0tKSB7CisJCXVDb3VudCA9IDA7CisJCXdoaWxlICh1Q291bnQrKyA8IFRJTUVPVVQpIHsKKwkJCW5ld3RpbWUgPSBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgV0NfU0FNUExFQ09VTlRFUik7CisJCQlpZiAobmV3dGltZSAhPSBjdXJ0aW1lKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKHVDb3VudCA+PSBUSU1FT1VUKQorCQkJYnJlYWs7CisKKwkJY3VydGltZSA9IG5ld3RpbWU7CisJfQorfQorCit1MTYgZW11MTBrMV9hYzk3X3JlYWQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJdTE2IGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlvdXRiKHJlZywgY2FyZC0+aW9iYXNlICsgQUM5N0FERFJFU1MpOworCWRhdGEgPSBpbncoY2FyZC0+aW9iYXNlICsgQUM5N0RBVEEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQgZW11MTBrMV9hYzk3X3dyaXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsdWUpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlvdXRiKHJlZywgY2FyZC0+aW9iYXNlICsgQUM5N0FERFJFU1MpOworCW91dHcodmFsdWUsIGNhcmQtPmlvYmFzZSArIEFDOTdEQVRBKTsKKwlvdXRiKCBBQzk3X0VYVEVOREVEX0lELCBjYXJkLT5pb2Jhc2UgKyBBQzk3QUREUkVTUyk7IAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgIE1QVSBhY2Nlc3MgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGVtdTEwazFfbXB1X3dyaXRlX2RhdGEoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTggZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7CisJCWlmICgoc2JsaXZlX3JlYWRwdHIoY2FyZCwgQV9NVVNUQVQsMCkgJiBNVVNUQVRfT1JEWU4pID09IDApIHsKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX01VREFUQSwgMCwgZGF0YSk7CisJCQlyZXQgPSAwOworCQl9IGVsc2UKKwkJCXJldCA9IC0xOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKChpbmIoY2FyZC0+aW9iYXNlICsgTVVTVEFUKSAmIE1VU1RBVF9PUkRZTikgPT0gMCkgeworCQkJb3V0YihkYXRhLCBjYXJkLT5pb2Jhc2UgKyBNVURBVEEpOworCQkJcmV0ID0gMDsKKwkJfSBlbHNlCisJCQlyZXQgPSAtMTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IGVtdTEwazFfbXB1X3JlYWRfZGF0YShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1OCAqIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKGNhcmQtPmlzX2F1ZGlneSkgeworCQlpZiAoKHNibGl2ZV9yZWFkcHRyKGNhcmQsIEFfTVVTVEFULDApICYgTVVTVEFUX0lSRFlOKSA9PSAwKSB7CisJCQkqZGF0YSA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIEFfTVVEQVRBLDApOworCQkJcmV0ID0gMDsKKwkJfSBlbHNlCisJCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJCWlmICgoaW5iKGNhcmQtPmlvYmFzZSArIE1VU1RBVCkgJiBNVVNUQVRfSVJEWU4pID09IDApIHsKKwkJCSpkYXRhID0gaW5iKGNhcmQtPmlvYmFzZSArIE1VREFUQSk7CisJCQlyZXQgPSAwOworCQl9IGVsc2UKKwkJCXJldCA9IC0xOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW11MTBrMV9tcHVfcmVzZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwl1OCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQRigyLCAiZW11MTBrMV9tcHVfcmVzZXQoKVxuIik7CisJaWYgKGNhcmQtPmlzX2F1ZGlneSkgeworCQlpZiAoY2FyZC0+bXB1YWNxY291bnQgPT0gMCkgeworCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfTVVDTUQsIDAsIE1VQ01EX1JFU0VUKTsKKwkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7CisJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9NVUNNRCwgMCwgTVVDTURfUkVTRVQpOworCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX01VQ01ELCAwLCBNVUNNRF9FTlRFUlVBUlRNT0RFKTsKKwkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7CisJCQlzdGF0dXMgPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBBX01VREFUQSwgMCk7CisJCQlpZiAoc3RhdHVzID09IDB4ZmUpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlCisJCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKGNhcmQtPm1wdWFjcWNvdW50ID09IDApIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCQlvdXRiKE1VQ01EX1JFU0VULCBjYXJkLT5pb2Jhc2UgKyBNVUNNRCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCQlvdXRiKE1VQ01EX1JFU0VULCBjYXJkLT5pb2Jhc2UgKyBNVUNNRCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCQlvdXRiKE1VQ01EX0VOVEVSVUFSVE1PREUsIGNhcmQtPmlvYmFzZSArIE1VQ01EKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCXN0YXR1cyA9IGluYihjYXJkLT5pb2Jhc2UgKyBNVURBVEEpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAoc3RhdHVzID09IDB4ZmUpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlCisJCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgZW11MTBrMV9tcHVfYWNxdWlyZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvICovCisJKytjYXJkLT5tcHVhY3Fjb3VudDsKKworCXJldHVybiAwOworfQorCitpbnQgZW11MTBrMV9tcHVfcmVsZWFzZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCS8qIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBhIG1hY3JvICovCisJLS1jYXJkLT5tcHVhY3Fjb3VudDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2h3YWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0MjIzYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2h3YWNjZXNzLmgKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIGh3YWNjZXNzLmgKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZQkJICAgIEF1dGhvcgkgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLQkJICAgIC0tLS0tLQkgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9IV0FDQ0VTU19ICisjZGVmaW5lIF9IV0FDQ0VTU19ICisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiZWZ4bWdyLmgiCisjaW5jbHVkZSAicGFzc3Rocm91Z2guaCIKKyNpbmNsdWRlICJtaWRpLmgiCisKKyNkZWZpbmUgRU1VUEFHRVNJWkUgICAgIDQwOTYgICAgICAgICAgICAvKiBkb24ndCBjaGFuZ2UgKi8KKyNkZWZpbmUgTlVNX0cgICAgICAgICAgIDY0ICAgICAgICAgICAgICAvKiB1c2UgYWxsIGNoYW5uZWxzICovCisjZGVmaW5lIE5VTV9GWFNFTkRTICAgICA0ICAgICAgICAgICAgICAgLyogZG9uJ3QgY2hhbmdlICovCisvKiBzZXR0aW5nIHRoaXMgdG8gb3RoZXIgdGhhbiBhIHBvd2VyIG9mIHR3byBtYXkgYnJlYWsgc29tZSBhcHBsaWNhdGlvbnMgKi8KKyNkZWZpbmUgTUFYQlVGU0laRQk2NTUzNgorI2RlZmluZSBNQVhQQUdFUwk4MTkyIAorI2RlZmluZSBCVUZNQVhQQUdFUyAgICAgKE1BWEJVRlNJWkUgLyBQQUdFX1NJWkUpCisKKyNkZWZpbmUgRkxBR1NfQVZBSUxBQkxFICAgICAweDAwMDEKKyNkZWZpbmUgRkxBR1NfUkVBRFkgICAgICAgICAweDAwMDIKKworc3RydWN0IG1lbWhhbmRsZQoreworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwl2b2lkICphZGRyOworCXUzMiBzaXplOworfTsKKworI2RlZmluZSBERUJVR19MRVZFTCAyCisKKyNpZmRlZiBFTVUxMEsxX0RFQlVHCisjIGRlZmluZSBEUEQobGV2ZWwseCx5Li4uKSBkbyB7aWYobGV2ZWwgPD0gREVCVUdfTEVWRUwpIHByaW50ayggS0VSTl9OT1RJQ0UgImVtdTEwazE6ICVzOiAlZDogIiB4ICwgX19GSUxFX18gLCBfX0xJTkVfXyAsIHkgKTt9IHdoaWxlKDApCisjIGRlZmluZSBEUEYobGV2ZWwseCkgICBkbyB7aWYobGV2ZWwgPD0gREVCVUdfTEVWRUwpIHByaW50ayggS0VSTl9OT1RJQ0UgImVtdTEwazE6ICVzOiAlZDogIiB4ICwgX19GSUxFX18gLCBfX0xJTkVfXyApO30gd2hpbGUoMCkKKyNlbHNlCisjIGRlZmluZSBEUEQobGV2ZWwseCx5Li4uKSBkbyB7IH0gd2hpbGUgKDApIC8qIG5vdCBkZWJ1Z2dpbmc6IG5vdGhpbmcgKi8KKyMgZGVmaW5lIERQRihsZXZlbCx4KSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogRU1VMTBLMV9ERUJVRyAqLworCisjZGVmaW5lIEVSUk9SKCkgRFBGKDEsImVycm9yXG4iKQorCisvKiBEQVRBIFNUUlVDVFVSRVMgKi8KKworc3RydWN0IGVtdTEwazFfd2F2ZW91dAoreworCXUzMiBzZW5kX3JvdXRpbmdbM107CisJLy8gYXVkaWd5IG9ubHk6CisJdTMyIHNlbmRfcm91dGluZzJbM107CisKKwl1MzIgc2VuZF9kY2JhWzNdOworCS8vIGF1ZGlneSBvbmx5OgorCXUzMiBzZW5kX2hnZmVbM107Cit9OworI2RlZmluZSBST1VURV9QQ00gMAorI2RlZmluZSBST1VURV9QVCAxCisjZGVmaW5lIFJPVVRFX1BDTTEgMgorCisjZGVmaW5lIFNFTkRfTU9OTyAwCisjZGVmaW5lIFNFTkRfTEVGVCAxCisjZGVmaW5lIFNFTkRfUklHSFQgMgorCitzdHJ1Y3QgZW11MTBrMV93YXZlaW4KK3sKKyAgICAgICAgc3RydWN0IHdpaW5zdCAqYWM5NzsKKyAgICAgICAgc3RydWN0IHdpaW5zdCAqbWljOworICAgICAgICBzdHJ1Y3Qgd2lpbnN0ICpmeDsKKworICAgICAgICB1OCByZWNzcmM7CisgICAgICAgIHUzMiBmeHdjOworfTsKKworI2RlZmluZSBDTURfUkVBRCAxCisjZGVmaW5lIENNRF9XUklURSAyCisKK3N0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsIHsKKyAgICAgICAgdTMyIGNtZDsKKyAgICAgICAgdTMyIHZhbFs5MF07Cit9OworCisvKiBib2d1cyBpb2N0bHMgbnVtYmVycyB0byBlc2NhcGUgZnJvbSBPU1MgbWl4ZXIgbGltaXRhdGlvbnMgKi8KKyNkZWZpbmUgQ01EX1dSSVRFRk4wICAgICAgICAgICAgX0lPVygnRCcsIDAsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQorI2RlZmluZSBDTURfUkVBREZOMAkJX0lPUignRCcsIDEsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX1dSSVRFUFRSCQlfSU9XKCdEJywgMiwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAorI2RlZmluZSBDTURfUkVBRFBUUgkJX0lPUignRCcsIDMsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX1NFVFJFQ1NSQwkJX0lPVygnRCcsIDQsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX0dFVFJFQ1NSQwkJX0lPUignRCcsIDUsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX0dFVFZPSUNFUEFSQU0JX0lPUignRCcsIDYsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX1NFVFZPSUNFUEFSQU0JX0lPVygnRCcsIDcsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX0dFVFBBVENICQlfSU9SKCdEJywgOCwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAorI2RlZmluZSBDTURfR0VUR1BSCQlfSU9SKCdEJywgOSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAorI2RlZmluZSBDTURfR0VUQ1RMR1BSICAgICAgICAgICBfSU9SKCdEJywgMTAsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQorI2RlZmluZSBDTURfU0VUUEFUQ0gJCV9JT1coJ0QnLCAxMSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAorI2RlZmluZSBDTURfU0VUR1BSCQlfSU9XKCdEJywgMTIsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX1NFVENUTEdQUgkJX0lPVygnRCcsIDEzLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKKyNkZWZpbmUgQ01EX1NFVEdQT1VUCQlfSU9XKCdEJywgMTQsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQorI2RlZmluZSBDTURfR0VUR1BSMk9TUwkJX0lPUignRCcsIDE1LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKKyNkZWZpbmUgQ01EX1NFVEdQUjJPU1MJCV9JT1coJ0QnLCAxNiwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCisjZGVmaW5lIENNRF9TRVRNQ0hfRlgJCV9JT1coJ0QnLCAxNywgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCisjZGVmaW5lIENNRF9TRVRQQVNTVEhST1VHSAlfSU9XKCdEJywgMTgsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQorI2RlZmluZSBDTURfUFJJVkFURTNfVkVSU0lPTglfSU9XKCdEJywgMTksIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQorI2RlZmluZSBDTURfQUM5N19CT09TVAkJX0lPVygnRCcsIDIwLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKKworLy91cCB0aGlzIG51bWJlciB3aGVuIGJyZWFraW5nIGNvbXBhdGliaWxpdHkKKyNkZWZpbmUgUFJJVkFURTNfVkVSU0lPTiAyCisKK3N0cnVjdCBlbXUxMGsxX2NhcmQgCit7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IG1lbWhhbmRsZQl2aXJ0dWFscGFnZXRhYmxlOworCXN0cnVjdCBtZW1oYW5kbGUJdGFua21lbTsKKwlzdHJ1Y3QgbWVtaGFuZGxlCXNpbGVudHBhZ2U7CisKKwlzcGlubG9ja190CQlsb2NrOworCisJdTgJCQl2b2ljZXRhYmxlW05VTV9HXTsKKwl1MTYJCQllbXVwYWdldGFibGVbTUFYUEFHRVNdOworCisJc3RydWN0IGxpc3RfaGVhZAl0aW1lcnM7CisJdTE2CQkJdGltZXJfZGVsYXk7CisJc3BpbmxvY2tfdAkJdGltZXJfbG9jazsKKworCXN0cnVjdCBwY2lfZGV2CQkqcGNpX2RldjsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBpb2Jhc2U7CisJdW5zaWduZWQgbG9uZwkJbGVuZ3RoOworCXVuc2lnbmVkIHNob3J0CQltb2RlbDsKKwl1bnNpZ25lZCBpbnQgaXJxOyAKKworCWludAlhdWRpb19kZXY7CisJaW50CWF1ZGlvX2RldjE7CisJaW50CW1pZGlfZGV2OworI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCisJaW50IHNlcV9kZXY7CisJc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqc2VxX21pZGlkZXY7CisjZW5kaWYKKworCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3OworCWludCBhYzk3X3N1cHBvcnRlZF9taXhlcnM7CisJaW50IGFjOTdfc3RlcmVvX21peGVyczsKKworCS8qIE51bWJlciBvZiBmaXJzdCBmeCB2b2ljZSBmb3IgbXVsdGljaGFubmVsIG91dHB1dCAqLworCXU4IG1jaGFubmVsX2Z4OworCXN0cnVjdCBlbXUxMGsxX3dhdmVvdXQJd2F2ZW91dDsKKwlzdHJ1Y3QgZW11MTBrMV93YXZlaW4Jd2F2ZWluOworCXN0cnVjdCBlbXUxMGsxX21wdW91dAkqbXB1b3V0OworCXN0cnVjdCBlbXUxMGsxX21wdWluCSptcHVpbjsKKworCXN0cnVjdCBzZW1hcGhvcmUJb3Blbl9zZW07CisJbW9kZV90CQkJb3Blbl9tb2RlOworCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKKworCXUzMgkgICAgbXB1YWNxY291bnQ7CSAgLy8gTXB1IGFjcXVpcmUgY291bnQKKwl1MzIJICAgIGhhc190b3NsaW5rOwkgICAgICAgLy8gVE9TTGluayBkZXRlY3Rpb24KKworCXU4IGNoaXByZXY7ICAgICAgICAgICAgICAgICAgICAvKiBDaGlwIHJldmlzaW9uICAgICAgICAgICAgICAgICovCisJdTggaXNfYXVkaWd5OworCXU4IGlzX2FwczsKKworCXN0cnVjdCBwYXRjaF9tYW5hZ2VyIG1ncjsKKwlzdHJ1Y3QgcHRfZGF0YSBwdDsKK307CisKK2ludCBlbXUxMGsxX2FkZHhtZ3JfYWxsb2ModTMyLCBzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwordm9pZCBlbXUxMGsxX2FkZHhtZ3JfZnJlZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIGludCk7CisKK2ludCBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoc3RydWN0IHBhdGNoX21hbmFnZXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwordm9pZCBlbXUxMGsxX3NldF9jb250cm9sX2dwcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIGludCAsIHMzMiwgaW50ICk7CisKK3ZvaWQgZW11MTBrMV9zZXRfdm9sdW1lX2dwcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIGludCwgczMyLCBpbnQpOworCisKKyNkZWZpbmUgVk9MXzZCSVQgMHg0MAorI2RlZmluZSBWT0xfNUJJVCAweDIwCisjZGVmaW5lIFZPTF80QklUIDB4MTAKKworI2RlZmluZSBUSU1FT1VUIAkJICAgIDE2Mzg0CisKK3UzMiBzclRvUGl0Y2godTMyKTsKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgZW11MTBrMV9kZXZzOworCisvKiBIYXJkd2FyZSBBYnN0cmFjdGlvbiBMYXllciBhY2Nlc3MgZnVuY3Rpb25zICovCisKK3ZvaWQgZW11MTBrMV93cml0ZWZuMChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMiwgdTMyKTsKK3ZvaWQgZW11MTBrMV93cml0ZWZuMF8yKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyLCB1MzIsIGludCk7Cit1MzIgZW11MTBrMV9yZWFkZm4wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKKwordm9pZCBlbXUxMGsxX3RpbWVyX3NldChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUxNik7CisKK3ZvaWQgc2JsaXZlX3dyaXRlcHRyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyLCB1MzIsIHUzMik7Cit2b2lkIHNibGl2ZV93cml0ZXB0cl90YWcoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIsIC4uLik7CisjZGVmaW5lIFRBR0xJU1RfRU5ECTAKKwordTMyIHNibGl2ZV9yZWFkcHRyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyICwgdTMyICk7CisKK3ZvaWQgZW11MTBrMV9pcnFfZW5hYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKK3ZvaWQgZW11MTBrMV9pcnFfZGlzYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7Cit2b2lkIGVtdTEwazFfY2xlYXJfc3RvcF9vbl9sb29wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKKworLyogQUM5NyBDb2RlYyByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb24gKi8KK3UxNiBlbXUxMGsxX2FjOTdfcmVhZChzdHJ1Y3QgYWM5N19jb2RlYyAqLCB1OCk7Cit2b2lkIGVtdTEwazFfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqLCB1OCwgdTE2KTsKKworLyogTVBVIGFjY2VzcyBmdW5jdGlvbiovCitpbnQgZW11MTBrMV9tcHVfd3JpdGVfZGF0YShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHU4KTsKK2ludCBlbXUxMGsxX21wdV9yZWFkX2RhdGEoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1OCAqKTsKK2ludCBlbXUxMGsxX21wdV9yZXNldChzdHJ1Y3QgZW11MTBrMV9jYXJkICopOworaW50IGVtdTEwazFfbXB1X2FjcXVpcmUoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK2ludCBlbXUxMGsxX21wdV9yZWxlYXNlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7CisKKyNlbmRpZiAgLyogX0hXQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkbWlkLmggYi9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZG1pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNmVmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZG1pZC5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBpc2JsaXZlX21pZC5oCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9JQ0FSRE1JRElfSAorI2RlZmluZSBfSUNBUkRNSURJX0gKKworLyogTUlESSBkZWZpbmVzICovCisjZGVmaW5lIE1JRElfREFUQV9GSVJTVCAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNSURJX0RBVEFfTEFTVCAgICAgICAgICAgICAgICAgIDB4N0YKKyNkZWZpbmUgTUlESV9TVEFUVVNfRklSU1QgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIE1JRElfU1RBVFVTX0xBU1QgICAgICAgICAgICAgICAgMHhGRgorCisvKiBDaGFubmVsIHN0YXR1cyBieXRlcyAqLworI2RlZmluZSBNSURJX1NUQVRVU19DSEFOTkVMX0ZJUlNUICAgICAgIDB4ODAKKyNkZWZpbmUgTUlESV9TVEFUVVNfQ0hBTk5FTF9MQVNUICAgICAgICAweEUwCisjZGVmaW5lIE1JRElfU1RBVFVTX0NIQU5ORUxfTUFTSyAgICAgICAgMHhGMAorCisvKiBDaGFubmVsIHZvaWNlIG1lc3NhZ2VzICovCisjZGVmaW5lIE1JRElfVk9JQ0VfTk9URV9PRkYgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBNSURJX1ZPSUNFX05PVEVfT04gICAgICAgICAgICAgIDB4OTAKKyNkZWZpbmUgTUlESV9WT0lDRV9QT0xZX1BSRVNTVVJFICAgICAgICAweEEwCisjZGVmaW5lIE1JRElfVk9JQ0VfQ09OVFJPTF9DSEFOR0UgICAgICAgMHhCMAorI2RlZmluZSBNSURJX1ZPSUNFX1BST0dSQU1fQ0hBTkdFICAgICAgIDB4QzAKKyNkZWZpbmUgTUlESV9WT0lDRV9DSEFOTkVMX1BSRVNTVVJFICAgICAweEQwCisjZGVmaW5lIE1JRElfVk9JQ0VfUElUQ0hfQkVORCAgICAgICAgICAgMHhFMAorCisvKiBDaGFubmVsIG1vZGUgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUlESV9NT0RFX0NIQU5ORUwgICAgICAgICAgICAgICBNSURJX1ZPSUNFX0NPTlRST0xfQ0hBTkdFCisKKy8qIFN5c3RlbSBzdGF0dXMgYnl0ZXMgKi8KKyNkZWZpbmUgTUlESV9TVEFUVVNfU1lTVEVNX0ZJUlNUICAgICAgICAweEYwCisjZGVmaW5lIE1JRElfU1RBVFVTX1NZU1RFTV9MQVNUICAgICAgICAgMHhGRgorCisvKiBTeXN0ZW0gZXhjbHVzaXZlIG1lc3NhZ2VzICovCisjZGVmaW5lIE1JRElfU1lTRVhfQkVHSU4gICAgICAgICAgICAgICAgMHhGMAorI2RlZmluZSBNSURJX1NZU0VYX0VPWCAgICAgICAgICAgICAgICAgIDB4RjcKKworLyogU3lzdGVtIGNvbW1vbiBtZXNzYWdlcyAqLworI2RlZmluZSBNSURJX0NPTU1PTl9UQ1FGICAgICAgICAgICAgICAgIDB4RjEJLyogVGltZSBjb2RlIHF1YXJ0ZXIgZnJhbWUgICovCisjZGVmaW5lIE1JRElfQ09NTU9OX1NPTkdfUE9TSVRJT04gICAgICAgMHhGMgorI2RlZmluZSBNSURJX0NPTU1PTl9TT05HX1NFTEVDVCAgICAgICAgIDB4RjMKKyNkZWZpbmUgTUlESV9DT01NT05fVU5ERUZJTkVEX0Y0ICAgICAgICAweEY0CisjZGVmaW5lIE1JRElfQ09NTU9OX1VOREVGSU5FRF9GNSAgICAgICAgMHhGNQorI2RlZmluZSBNSURJX0NPTU1PTl9UVU5FX1JFUVVFU1QgICAgICAgIDB4RjYKKworLyogU3lzdGVtIHJlYWwtdGltZSBtZXNzYWdlcyAqLworI2RlZmluZSBNSURJX1JUSU1FX1RJTUlOR19DTE9DSyAgICAgICAgIDB4RjgKKyNkZWZpbmUgTUlESV9SVElNRV9VTkRFRklORURfRjkgICAgICAgICAweEY5CisjZGVmaW5lIE1JRElfUlRJTUVfU1RBUlQgICAgICAgICAgICAgICAgMHhGQQorI2RlZmluZSBNSURJX1JUSU1FX0NPTlRJTlVFICAgICAgICAgICAgIDB4RkIKKyNkZWZpbmUgTUlESV9SVElNRV9TVE9QICAgICAgICAgICAgICAgICAweEZDCisjZGVmaW5lIE1JRElfUlRJTUVfVU5ERUZJTkVEX0ZEICAgICAgICAgMHhGRAorI2RlZmluZSBNSURJX1JUSU1FX0FDVElWRV9TRU5TSU5HICAgICAgIDB4RkUKKyNkZWZpbmUgTUlESV9SVElNRV9TWVNURU1fUkVTRVQgICAgICAgICAweEZGCisKKy8qIEZsYWdzIGZvciBmbGFncyBwYXJtIG9mIG1pZGlPdXRDYWNoZVBhdGNoZXMoKSwgbWlkaU91dENhY2hlRHJ1bVBhdGNoZXMoKSAqLworI2RlZmluZSBNSURJX0NBQ0hFX0FMTCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlESV9DQUNIRV9CRVNURklUICAgICAgICAgICAgICAyCisjZGVmaW5lIE1JRElfQ0FDSEVfUVVFUlkgICAgICAgICAgICAgICAgMworI2RlZmluZSBNSURJX1VOQ0FDSEUgICAgICAgICAgICAgICAgICAgIDQKKworLyogRXZlbnQgZGVjbGFyYXRpb25zIGZvciBNUFUgSVJRIENhbGxiYWNrcyAqLworI2RlZmluZSBJQ0FSRE1JRElfSU5MT05HREFUQSAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogTUlNX0xPTkdEQVRBICovCisjZGVmaW5lIElDQVJETUlESV9JTkxPTkdFUlJPUiAgICAgICAgICAgMHgwMDAwMDAwMiAvKiBNSU1fTE9OR0VSUk9SICovCisjZGVmaW5lIElDQVJETUlESV9PVVRMT05HREFUQSAgICAgICAgICAgMHgwMDAwMDAwNCAvKiBNT01fRE9ORSBmb3IgTVBVIE9VVCBidWZmZXIgKi8KKyNkZWZpbmUgSUNBUkRNSURJX0lOREFUQSAgICAgICAgICAgICAgICAweDAwMDAwMDEwIC8qIE1JTV9EQVRBICovCisjZGVmaW5lIElDQVJETUlESV9JTkRBVEFFUlJPUiAgICAgICAgICAgMHgwMDAwMDAyMCAvKiBNSU1fRVJST1IgKi8KKworLyogRGVjbGFyYXRpb24gZm9yIGZsYWdzIGluIENBUkRNSURJQlVGRkVSSERSICovCisvKiBNYWtlIGl0IHRoZSBzYW1lIGFzIE1IRFJfRE9ORSwgTUhEUl9JTlFVRVVFIGluIG1tc3lzdGVtLmggKi8KKyNkZWZpbmUgTUlESUJVRl9ET05FICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE1JRElCVUZfSU5RVUVVRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorCisvKiBEZWNsYXJhdGlvbiBmb3IgbXNnIHBhcmFtZXRlciBpbiBtaWRpQ2FsbGJhY2tGbiAqLworI2RlZmluZSBJQ0FSRE1JRElfT1VUQlVGRkVST0sgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSUNBUkRNSURJX0lOTUlESU9LICAgICAgICAgICAgICAweDAwMDAwMDAyCisKKy8qIERlY2xhcmF0aW9uIGZvciB0ZWNobm9sb2d5IGluIHN0cnVjdCBtaWRpX2NhcHMgKi8KKyNkZWZpbmUgTVRfTUlESVBPUlQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCS8qIEluIG9yaWdpbmFsIE1JRElPVVRDQVBTIHN0cnVjdHVyZSAqLworI2RlZmluZSBNVF9GTVNZTlRIICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQJLyogSW4gb3JpZ2luYWwgTUlESU9VVENBUFMgc3RydWN0dXJlICovCisjZGVmaW5lIE1UX0FXRVNZTlRIICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBNVF9QQ0lTWU5USCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgTVRfUENJU1lOVEg2NCAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIENBUkRNSURJX0FXRU1BU0sgICAgICAgICAgICAgICAgMHgwMDAwRjAwMAorCitlbnVtIExvY2FsRXJyb3JDb2RlCit7CisgICAgICAgIENUU1RBVFVTX05PVEVOQUJMRUQgPSAweDcwMDAsCisgICAgICAgIENUU1RBVFVTX1JFQURZLAorICAgICAgICBDVFNUQVRVU19CVVNZLAorICAgICAgICBDVFNUQVRVU19EQVRBQVZBSUwsCisgICAgICAgIENUU1RBVFVTX05PREFUQSwKKyAgICAgICAgQ1RTVEFUVVNfTkVYVF9CWVRFCit9OworCisvKiBNSURJIGRhdGEgYmxvY2sgaGVhZGVyICovCitzdHJ1Y3QgbWlkaV9oZHIKK3sKKwl1OCAqcmVzZXJ2ZWQ7CQkvKiBQb2ludGVyIHRvIG9yaWdpbmFsIGxvY2tlZCBkYXRhIGJsb2NrICovCisJdTMyIGJ1ZmZlcmxlbmd0aDsJLyogTGVuZ3RoIG9mIGRhdGEgaW4gZGF0YSBibG9jayAqLworCXUzMiBieXRlc3JlY29yZGVkOwkvKiBVc2VkIGZvciBpbnB1dCBvbmx5ICovCisJdTMyIHVzZXI7CQkvKiBGb3IgY2xpZW50J3MgdXNlICovCisJdTMyIGZsYWdzOwkJLyogQXNzb3J0ZWQgZmxhZ3MgKHNlZSBkZWZpbmVzKSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogUmVzZXJ2ZWQgZm9yIGRyaXZlciAqLworCXU4ICpkYXRhOwkJLyogU2Vjb25kIGNvcHkgb2YgZmlyc3QgcG9pbnRlciAqLworfTsKKworLyogRW51bWVyYXRpb24gZm9yIFNldENvbnRyb2wgKi8KK2VudW0KK3sKKwlNSURJT0JKVk9MVU1FID0gMHgxLAorCU1JRElRVUVSWUFDVElWRUlOU1QKK307CisKK3N0cnVjdCBtaWRpX3F1ZXVlCit7CisJc3RydWN0IG1pZGlfcXVldWUgICpuZXh0OworCXUzMiBxdHlwZTsgICAgICAgICAgICAvKiAwID0gc2hvcnQgbWVzc2FnZSwgMSA9IGxvbmcgZGF0YSAqLworCXUzMiBsZW5ndGg7CisJdTMyIHNpemVMZWZ0OworCXU4ICptaWRpYnl0ZTsKKwl1bnNpZ25lZCBsb25nIHJlZmRhdGE7Cit9OworCitzdHJ1Y3QgbWlkaV9vcGVuaW5mbworeworCXUzMiAgICAgY2JzaXplOworCXUzMiAgICAgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyAgcmVmZGF0YTsKKwl1MzIgICAgIHN0cmVhbWlkOworfTsKKworaW50IGVtdTEwazFfbWlkaV9jYWxsYmFjayh1bnNpZ25lZCBsb25nICwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyAqKTsKKworI2VuZGlmIC8qIF9JQ0FSRE1JRElfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvaWNhcmR3YXYuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkd2F2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViZTQwOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkd2F2LmgKQEAgLTAsMCArMSw1MyBAQAorLyogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBpY2FyZHdhdi5oCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAorICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAorICogICAgIFVTQS4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICovCisKKyNpZm5kZWYgX0lDQVJEV0FWX0gKKyNkZWZpbmUgX0lDQVJEV0FWX0gKKworc3RydWN0IHdhdmVfZm9ybWF0IAoreworCWludCBpZDsKKwlpbnQgc2FtcGxpbmdyYXRlOworCXU4IGJpdHNwZXJjaGFubmVsOworCXU4IGNoYW5uZWxzOwkJLyogMSA9IE1vbm8sIDIgPSBTdGVyZW8sIDMsIC4uLiA9IE11bHRpY2hhbm5lbCAqLworCXU4IGJ5dGVzcGVyY2hhbm5lbDsKKwl1OCBieXRlc3BlcnZvaWNlc2FtcGxlOworCXU4IGJ5dGVzcGVyc2FtcGxlOworCWludCBieXRlc3BlcnNlYzsKKwl1OCBwYXNzdGhyb3VnaDsKK307CisKKy8qIGVtdTEwazFfd2F2ZSBzdGF0ZXMgKi8KKyNkZWZpbmUgV0FWRV9TVEFURV9PUEVOCQkweDAxCQorI2RlZmluZSBXQVZFX1NUQVRFX1NUQVJURUQJMHgwMgorI2RlZmluZSBXQVZFX1NUQVRFX0NMT1NFRAkweDA0CisKKyNlbmRpZiAvKiBfSUNBUkRXQVZfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTliNDY0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIGlycW1nci5jIC0gSVJRIG1hbmFnZXIgZm9yIGVtdTEwazEgZHJpdmVyCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKyNpbmNsdWRlICI4MDEwLmgiCisjaW5jbHVkZSAiY2FyZG1pLmgiCisjaW5jbHVkZSAiY2FyZG1vLmgiCisjaW5jbHVkZSAiaXJxbWdyLmgiCisKKy8qIEludGVycnVwdCBoYW5kbGVyICovCisKK2lycXJldHVybl90IGVtdTEwazFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgZW11MTBrMV9jYXJkICopIGRldl9pZDsKKwl1MzIgaXJxc3RhdHVzLCBpcnFzdGF0dXNfdG1wOworCWludCBoYW5kbGVkID0gMDsKKworCURQRCg0LCAiZW11MTBrMV9pbnRlcnJ1cHQgY2FsbGVkLCBpcnEgPSAgJXVcbiIsIGlycSk7CisKKwkvKgorCSAqKiBOT1RFIDoKKwkgKiogV2UgZG8gYSAnd2hpbGUgbG9vcCcgaGVyZSBjb3Mgb24gY2VydGFpbiBtYWNoaW5lcywgd2l0aCBib3RoCisJICoqIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgZ29pbmcgb24gYXQgdGhlIHNhbWUgdGltZSwgSVJRcyB3aWxsCisJICoqIHN0b3AgY29taW5nIGluIGFmdGVyIGEgd2hpbGUuIENoZWNraW5nIElQTkQgaW5kZWVkIHNob3dzIHRoYXQKKwkgKiogdGhlcmUgYXJlIGludGVycnVwdHMgcGVuZGluZyBidXQgdGhlIFBJQyBzYXlzIG5vIElSUXMgcGVuZGluZy4KKwkgKiogSSBzdXNwZWN0IHRoYXQgc29tZSBib2FyZHMgbmVlZCBlZGdlLXRyaWdnZXJlZCBJUlFzIGJ1dCBhcmUgbm90CisJICoqIGdldHRpbmcgdGhhdCBjb25kaXRpb24gaWYgd2UgZG9uJ3QgY29tcGxldGVseSBjbGVhciB0aGUgSVBORAorCSAqKiAobWFrZSBzdXJlIG5vIG1vcmUgaW50ZXJydXB0cyBhcmUgcGVuZGluZykuCisJICoqIC0gRXJpYworCSAqLworCisJd2hpbGUgKChpcnFzdGF0dXMgPSBpbmwoY2FyZC0+aW9iYXNlICsgSVBSKSkpIHsKKwkJRFBEKDQsICJpcnEgc3RhdHVzICUjeFxuIiwgaXJxc3RhdHVzKTsKKworCQlpcnFzdGF0dXNfdG1wID0gaXJxc3RhdHVzOworCisJCWlmIChpcnFzdGF0dXMgJiBJUlFUWVBFX1RJTUVSKSB7CisJCQllbXUxMGsxX3RpbWVyX2lycWhhbmRsZXIoY2FyZCk7CisJCQlpcnFzdGF0dXMgJj0gfklSUVRZUEVfVElNRVI7CisJCX0KKworCQlpZiAoaXJxc3RhdHVzICYgSVJRVFlQRV9EU1ApIHsKKwkJCWVtdTEwazFfZHNwX2lycWhhbmRsZXIoY2FyZCk7CisJCQlpcnFzdGF0dXMgJj0gfklSUVRZUEVfRFNQOworCQl9CisKKwkJaWYgKGlycXN0YXR1cyAmIElSUVRZUEVfTVBVSU4pIHsKKwkJCWVtdTEwazFfbXB1aW5faXJxaGFuZGxlcihjYXJkKTsKKwkJCWlycXN0YXR1cyAmPSB+SVJRVFlQRV9NUFVJTjsKKwkJfQorCisJCWlmIChpcnFzdGF0dXMgJiBJUlFUWVBFX01QVU9VVCkgeworCQkJZW11MTBrMV9tcHVvdXRfaXJxaGFuZGxlcihjYXJkKTsKKwkJCWlycXN0YXR1cyAmPSB+SVJRVFlQRV9NUFVPVVQ7CisJCX0KKworCQlpZiAoaXJxc3RhdHVzICYgSVBSX01VVEUpIHsKKwkJCWVtdTEwazFfbXV0ZV9pcnFoYW5kbGVyKGNhcmQpOworCQkJaXJxc3RhdHVzICY9fklQUl9NVVRFOworCQl9CisKKwkJaWYgKGlycXN0YXR1cyAmIElQUl9WT0xJTkNSKSB7CisJCQllbXUxMGsxX3ZvbGluY3JfaXJxaGFuZGxlcihjYXJkKTsKKwkJCWlycXN0YXR1cyAmPX5JUFJfVk9MSU5DUjsKKwkJfQorCisJCWlmIChpcnFzdGF0dXMgJiBJUFJfVk9MREVDUikgeworCQkJZW11MTBrMV92b2xkZWNyX2lycWhhbmRsZXIoY2FyZCk7CisJCQlpcnFzdGF0dXMgJj1+SVBSX1ZPTERFQ1I7CisJCX0KKworCQlpZiAoaXJxc3RhdHVzKXsKKwkJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogV2FybmluZywgdW5oYW5kbGVkIGludGVycnVwdDogJSMwOHhcbiIsIGlycXN0YXR1cyk7CisJCQkvL21ha2Ugc3VyZSBhbnkgaW50ZXJydXB0cyB3ZSBkb24ndCBoYW5kbGUgYXJlIGRpc2FibGVkOgorCQkJZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCB+KElOVEVfTUlESVJYRU5BQkxFIHwgSU5URV9NSURJVFhFTkFCTEUgfCBJTlRFX0lOVEVSVkFMVElNRVJFTkIgfAorCQkJCQkJSU5URV9WT0xERUNSRU5BQkxFIHwgSU5URV9WT0xJTkNSRU5BQkxFIHwgSU5URV9NVVRFRU5BQkxFIHwKKwkJCQkJCUlOVEVfRlhEU1BFTkFCTEUpKTsKKwkJfQorCisJCS8qIGFja25vd2xlZGdlIGludGVycnVwdCAqLworCQlvdXRsKGlycXN0YXR1c190bXAsIGNhcmQtPmlvYmFzZSArIElQUik7CisJCWhhbmRsZWQgPSAxOworCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5oIGIvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3YzljYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIGlycS5oCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9JUlFfSAorI2RlZmluZSBfSVJRX0gKKworLyogRU1VIElycSBUeXBlcyAqLworI2RlZmluZSBJUlFUWVBFX1BDSUJVU0VSUk9SCUlQUl9QQ0lFUlJPUgorI2RlZmluZSBJUlFUWVBFX01JWEVSQlVUVE9OCShJUFJfVk9MSU5DUiB8IElQUl9WT0xERUNSIHwgSVBSX01VVEUpCisjZGVmaW5lIElSUVRZUEVfVk9JQ0UJCShJUFJfQ0hBTk5FTExPT1AgfCBJUFJfQ0hBTk5FTE5VTUJFUk1BU0spCisjZGVmaW5lIElSUVRZUEVfUkVDT1JECQkoSVBSX0FEQ0JVRkZVTEwgfCBJUFJfQURDQlVGSEFMRkZVTEwgfCBJUFJfTUlDQlVGRlVMTCB8IElQUl9NSUNCVUZIQUxGRlVMTCB8IElQUl9FRlhCVUZGVUxMIHwgSVBSX0VGWEJVRkhBTEZGVUxMKQorI2RlZmluZSBJUlFUWVBFX01QVU9VVAkJKElQUl9NSURJVFJBTlNCVUZFTVBUWSB8IEFfSVBSX01JRElUUkFOU0JVRkVNUFRZMikgCisjZGVmaW5lIElSUVRZUEVfTVBVSU4JCShJUFJfTUlESVJFQ1ZCVUZFTVBUWSB8IEFfSVBSX01JRElSRUNWQlVGRU1QVFkyKQorI2RlZmluZSBJUlFUWVBFX1RJTUVSCQlJUFJfSU5URVJWQUxUSU1FUgorI2RlZmluZSBJUlFUWVBFX1NQRElGCQkoSVBSX0dQU1BESUZTVEFUVVNDSEFOR0UgfCBJUFJfQ0RST01TVEFUVVNDSEFOR0UpCisjZGVmaW5lIElSUVRZUEVfRFNQCQlJUFJfRlhEU1AKKwordm9pZCBlbXUxMGsxX3RpbWVyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK3ZvaWQgZW11MTBrMV9kc3BfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwordm9pZCBlbXUxMGsxX211dGVfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwordm9pZCBlbXUxMGsxX3ZvbGluY3JfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwordm9pZCBlbXUxMGsxX3ZvbGRlY3JfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOworCisjZW5kaWYgLyogX0lSUV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9tYWluLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5MDViYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL21haW4uYwpAQCAtMCwwICsxLDE0NzUgQEAKKyAvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBtYWluLmMgLSBDcmVhdGl2ZSBFTVUxMEsxIGF1ZGlvIGRyaXZlcgorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwIHN0dWZmCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIFN1cHBvcnRlZCBkZXZpY2VzOgorICogICAgICAvZGV2L2RzcDogICAgICAgIFN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgT1NTLWNvbXBhdGlibGUKKyAqICAgICAgL2Rldi9kc3AxOiAgICAgICBSb3V0ZXMgdG8gcmVhciBzcGVha2VycyBvbmx5CSAKKyAqICAgICAgL2Rldi9taXhlcjogICAgICBTdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgT1NTLWNvbXBhdGlibGUKKyAqICAgICAgL2Rldi9taWRpOiAgICAgICBSYXcgTUlESSBVQVJUIGRldmljZSwgbW9zdGx5IE9TUy1jb21wYXRpYmxlCisgKgkvZGV2L3NlcXVlbmNlcjogIFNlcXVlbmNlciBJbnRlcmZhY2UgKHJlcXVpcmVzIHNvdW5kLm8pCisgKgorICogICAgICBSZXZpc2lvbiBoaXN0b3J5OgorICogICAgICAwLjEgYmV0YSBJbml0aWFsIHJlbGVhc2UKKyAqICAgICAgMC4yIExvd2VyZWQgaW5pdGlhbCBtaXhlciB2b2wuIEltcHJvdmVkIG9uIHN0dXR0ZXJpbmcgd2F2ZSBwbGF5YmFjay4gQWRkZWQgTUlESSBVQVJUIHN1cHBvcnQuCisgKiAgICAgIDAuMyBGaXhlZCBtaXhlciByb3V0aW5nIGJ1ZywgYWRkZWQgQVBTLCBqb3lzdGljayBzdXBwb3J0LgorICogICAgICAwLjQgQWRkZWQgcmVhci1jaGFubmVsLCBTUERJRiBzdXBwb3J0LgorICoJMC41IFNvdXJjZSBjbGVhbnVwLCBTTVAgZml4ZXMsIG11bHRpb3BlbiBzdXBwb3J0LCA2NCBiaXQgYXJjaCBmaXhlcywKKyAqCSAgICBtb3ZlZCBiaCdzIHRvIHRhc2tsZXRzLCBtb3ZlZCB0byB0aGUgbmV3IFBDSSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gc3R5bGUuCisgKgkwLjYgTWFrZSB1c2Ugb2YgcGNpX2FsbG9jX2NvbnNpc3RlbnQsIGltcHJvdmUgY29tcGF0aWJpbGl0eSBsYXllciBmb3IgMi4yIGtlcm5lbHMsCisgKgkgICAgY29kZSByZW9yZ2FuaXphdGlvbiBhbmQgY2xlYW51cC4KKyAqCTAuNyBTdXBwb3J0IGZvciB0aGUgRW11LUFQUy4gQnVnIGZpeGVzIGZvciB2b2ljZSBjYWNoZSBzZXR1cCwgbW1hcGVkIHNvdW5kICsgcG9sbCgpLgorICogICAgICAgICAgU3VwcG9ydCBmb3Igc2V0dGluZyBleHRlcm5hbCBUUkFNIHNpemUuCisgKiAgICAgIDAuOCBNYWtlIHVzZSBvZiB0aGUga2VybmVsIGFjOTcgaW50ZXJmYWNlLiBTdXBwb3J0IGZvciBhIGRzcCBwYXRjaCBtYW5hZ2VyLgorICogICAgICAwLjkgUmUtZW5hYmxlcyByZWFyIHNwZWFrZXJzIHZvbHVtZSBjb250cm9scworICogICAgIDAuMTAgSW5pdGlhbGl6ZXMgcmVhciBzcGVha2VyIHZvbHVtZS4KKyAqCSAgICBEeW5hbWljIHBhdGNoIHN0b3JhZ2UgYWxsb2NhdGlvbi4KKyAqCSAgICBOZXcgcHJpdmF0ZSBpb2N0bHMgdG8gY2hhbmdlIGNvbnRyb2wgZ3ByIHZhbHVlcy4KKyAqCSAgICBFbmFibGUgdm9sdW1lIGNvbnRyb2wgaW50ZXJydXB0cy4KKyAqCSAgICBCeSBkZWZhdWx0IGVuYWJsZSBkc3Agcm91dGVzIHRvIGRpZ2l0YWwgb3V0LiAKKyAqICAgICAwLjExIEZpeGVkIGZ4IC8gNCBwcm9ibGVtLgorICogICAgIDAuMTIgSW1wbGVtZW50ZWQgbW1hcGVkIGZvciByZWNvcmRpbmcuCisgKgkgICAgRml4ZWQgYnVnOiBub3QgdW5yZXNlcnZpbmcgbW1hcGVkIGJ1ZmZlciBwYWdlcy4KKyAqCSAgICBJUlEgaGFuZGxlciBjbGVhbnVwLgorICogICAgIDAuMTMgRml4ZWQgcHJvYmxlbSB3aXRoIGRzcDEKKyAqICAgICAgICAgIFNpbXBsaWZpZWQgZHNwIHBhdGNoIHdyaXRpbmcgKGluc2lkZSB0aGUgZHJpdmVyKQorICoJICAgIEZpeGVkIHNldmVyYWwgYnVncyBmb3VuZCBieSB0aGUgU3RhbmZvcmQgdG9vbHMKKyAqICAgICAwLjE0IE5ldyBjb250cm9sIGdwciB0byBvc3MgbWl4ZXIgbWFwcGluZyBmZWF0dXJlIChDaHJpcyBQdXJuZWxsKQorICogICAgICAgICAgQWRkZWQgQUMzIFBhc3N0aHJvdWdoIFN1cHBvcnQgKEp1aGEgWXJqb2xhKQorICogICAgICAgICAgQWRkZWQgU3VwcG9ydCBmb3IgNS4xIGNhcmRzIChkaWdpdGFsIG91dCBhbmQgdGhlIHRoaXJkIGFuYWxvZyBvdXQpCisgKiAgICAgMC4xNSBBZGRlZCBTZXF1ZW5jZXIgU3VwcG9ydCAoRGFuaWVsIE1hY2spCisgKiAgICAgICAgICBTdXBwb3J0IGZvciBtdWx0aWNoYW5uZWwgcGNtIHBsYXliYWNrIChFZHVhcmQgSGFzZW5sZWl0aG5lcikKKyAqICAgICAwLjE2IE1peGVyIGltcHJvdmVtZW50cywgYWRkZWQgb2xkIHRyZWJsZS9iYXNzIHN1cHBvcnQgKERhbmllbCBCZXJ0cmFuZCkKKyAqICAgICAgICAgIFNtYWxsIGNvZGUgZm9ybWF0IGNsZWFudXAuCisgKiAgICAgICAgICBEZWFkbG9jayBidWcgZml4IGZvciBlbXUxMGsxX3ZvbHh4eF9pcnFoYW5kbGVyKCkuCisgKiAgICAgMC4xNyBGaXggZm9yIG1peGVyIFNPVU5EX01JWEVSX0lORk8gaW9jdGwuCisgKgkgICAgRml4IGZvciBISUdITUVNIG1hY2hpbmVzIChlbXUxMGsxIGNhbiBvbmx5IGRvIDMxIGJpdCBidXMgbWFzdGVyKSAKKyAqCSAgICBtaWRpIHBvbGwgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KKyAqCSAgICBTbWFsbCBtaXhlciBmaXhlcy9jbGVhbnVwcy4KKyAqCSAgICBJbXByb3ZlZCBzdXBwb3J0IGZvciA1LjEgY2FyZHMuCisgKiAgICAgMC4xOCBGaXggZm9yIHBvc3NpYmxlIGxlYWsgaW4gcGNpX2FsbG9jX2NvbnNpc3RlbnQoKQorICogICAgICAgICAgQ2xlYW5lZCB1cCBwb2xsKCkgZnVuY3Rpb25zIChhdWRpbyBhbmQgbWlkaSkuIERvbid0IHN0YXJ0IGlucHV0LgorICoJICAgIFJlc3RyaWN0IERNQSBwYWdlcyB1c2VkIHRvIDUxMk1pYiByYW5nZS4KKyAqCSAgICBOZXcgQUM5N19CT09TVCBtaXhlciBpb2N0bC4KKyAqICAgIDAuMTlhIEFkZGVkIFN1cHBvcnQgZm9yIEF1ZGlneSBDYXJkcworICoJICAgIFJlYWwgZml4IGZvciBrZXJuZWwgd2l0aCBoaWdobWVtIHN1cHBvcnQgKGNhc3QgZG1hX2hhbmRsZSB0byB1MzIpLgorICoJICAgIEZpeCByZWNvcmRpbmcgYnVmZmVyaW5nIHBhcmFtZXRlcnMgY2FsY3VsYXRpb24uCisgKgkgICAgVXNlIHVuc2lnbmVkIGxvbmcgZm9yIHZhcmlhYmxlcyBpbiBiaXQgb3BzLgorICogICAgMC4yMGEgRml4ZWQgcmVjb3JkaW5nIHN0YXJ0dXAKKyAqCSAgICBGaXhlZCB0aW1lciByYXRlIHNldHRpbmcgKGl0J3MgYSAxNi1iaXQgcmVnaXN0ZXIpCisgKgkwLjIxIENvbnZlcnRlZCBjb2RlIHRvIHVzZSBwY2lfbmFtZSgpIGluc3RlYWQgb2YgYWNjZXNzaW5nIHNsb3RfbmFtZQorICoJICAgIGRpcmVjdGx5IChFdWdlbmUgVGVvKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlc2UgYXJlIG9ubHkgaW5jbHVkZWQgb25jZSBwZXIgbW9kdWxlICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgImh3YWNjZXNzLmgiCisjaW5jbHVkZSAiODAxMC5oIgorI2luY2x1ZGUgImVmeG1nci5oIgorI2luY2x1ZGUgImNhcmR3by5oIgorI2luY2x1ZGUgImNhcmR3aS5oIgorI2luY2x1ZGUgImNhcmRtby5oIgorI2luY2x1ZGUgImNhcmRtaS5oIgorI2luY2x1ZGUgInJlY21nci5oIgorI2luY2x1ZGUgImVjYXJkLmgiCisKKworI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCisjZGVmaW5lIE1JRElfU1lOVEhfTkFNRSAiRU1VMTBLMSBNSURJIgorI2RlZmluZSBNSURJX1NZTlRIX0NBUFMgU1lOVEhfQ0FQX0lOUFVUCisgCisjaW5jbHVkZSAiLi4vc291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAiLi4vbWlkaV9zeW50aC5oIgorCisvKiB0aGlzIHNob3VsZCBiZSBpbiBkZXZfdGFibGUuaCAqLworI2RlZmluZSBTTkRDQVJEX0VNVTEwSzEgNDYKKyNlbmRpZgorIAorCisvKiB0aGUgZW11MTBrMSBfc2VlbXNfIHRvIG9ubHkgc3VwcG9ydHMgMjkgYml0ICg1MTJNaUIpIGJpdCBidXMgbWFzdGVyICovCisjZGVmaW5lIEVNVTEwSzFfRE1BX01BU0sgICAgICAgICAgICAgICAgMHgxZmZmZmZmZgkvKiBETUEgYnVmZmVyIG1hc2sgZm9yIHBjaV9hbGxvY19jb25zaXN0ICovCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9DUkVBVElWRQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NSRUFUSVZFIDB4MTEwMgorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DUkVBVElWRV9FTVUxMEsxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfRU1VMTBLMSAweDAwMDIKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0FVRElHWQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0FVRElHWSAweDAwMDQKKyNlbmRpZgorCisjZGVmaW5lIEVNVV9BUFNfU1VCSUQJMHg0MDAxMTEwMgorIAorZW51bSB7CisJRU1VMTBLMSA9IDAsCisJQVVESUdZLAorfTsKKworc3RhdGljIGNoYXIgKmNhcmRfbmFtZXNbXSBfX2RldmluaXRkYXRhID0geworCSJFTVUxMEsxIiwKKwkiQXVkaWd5IiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBlbXUxMGsxX3BjaV90YmxbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9DUkVBVElWRSwgUENJX0RFVklDRV9JRF9DUkVBVElWRV9FTVUxMEsxLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBFTVUxMEsxfSwKKwl7UENJX1ZFTkRPUl9JRF9DUkVBVElWRSwgUENJX0RFVklDRV9JRF9DUkVBVElWRV9BVURJR1ksCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFVRElHWX0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGVtdTEwazFfcGNpX3RibCk7CisKKy8qIEdsb2JhbCB2YXIgaW5zdGFudGlhdGlvbiAqLworCitMSVNUX0hFQUQoZW11MTBrMV9kZXZzKTsKKworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9hdWRpb19mb3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9taXhlcl9mb3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9taWRpX2ZvcHM7CisKKyNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgorc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgZW11MTBrMV9taWRpX29wZXJhdGlvbnM7CisjZW5kaWYKKworZXh0ZXJuIGlycXJldHVybl90IGVtdTEwazFfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqcyk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfYXVkaW9faW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCS8qIEFzc2lnbiBkZWZhdWx0IHBsYXliYWNrIHZvaWNlIHBhcmFtZXRlcnMgKi8KKwlpZiAoY2FyZC0+aXNfYXVkaWd5KQorCQljYXJkLT5tY2hhbm5lbF9meCA9IDA7CisJZWxzZQorCQljYXJkLT5tY2hhbm5lbF9meCA9IDg7CisKKworCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKKwkJLyogbW9ubyB2b2ljZSAqLworCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX01PTk9dID0gMHhmZmZmZmZmZjsKKwkJY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9NT05PXSA9IDB4MDAwMGZmZmY7CisJCisJCS8qIHN0ZXJlbyB2b2ljZSAqLworCQkvKiBsZWZ0ICovCisJCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTEVGVF0gPSAweDAwZmYwMGZmOworCQljYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX0xFRlRdID0gMHgwMDAwN2Y3ZjsJCisJCS8qIHJpZ2h0ICovCisJCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfUklHSFRdID0gMHhmZjAwZmYwMDsKKwkJY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9SSUdIVF0gPSAweDAwMDA3ZjdmOworCisJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTV0gPSAweDAzMDIwMTAwOyAvLyBSZWd1bGFyIHBjbQorCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUENNXSA9IDB4MDcwNjA1MDQ7CisKKwkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUFRdID0gMHgzZjNmM2QzYzsgLy8gUGFzc3Rocm91Z2gKKwkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BUXSA9IDB4M2YzZjNmM2Y7CisJCQorCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ00xXSA9IDB4MDMwMjAxMDA7IC8vIFNwYXJlCisJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ00xXSA9IDB4MDcwNjA0MDQ7CisJCQorCX0gZWxzZSB7CisJCS8qIG1vbm8gdm9pY2UgKi8KKwkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9NT05PXSA9IDB4MDAwMGZmZmY7CisJCisJCS8qIHN0ZXJlbyB2b2ljZSAqLworCQkvKiBsZWZ0ICovCisJCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTEVGVF0gPSAweDAwMDAwMGZmOworCQkvKiByaWdodCAqLworCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX1JJR0hUXSA9IDB4MDAwMGZmMDA7CisKKwkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNXSA9IDB4MzIxMDsgLy8gcGNtCisJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BUXSA9IDB4MzIxMDsgLy8gcGFzc3Rocm91Z2gKKwkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNMV0gPSAweDc2NTQ7IC8vIC9kZXYvZHNwMQorCX0KKworCS8qIEFzc2lnbiBkZWZhdWx0IHJlY29yZGluZyBwYXJhbWV0ZXJzICovCisJLyogRklYTUUgKi8KKwlpZiAoY2FyZC0+aXNfYXBzKQorCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9GWDsKKwllbHNlCisJCWNhcmQtPndhdmVpbi5yZWNzcmMgPSBXQVZFUkVDT1JEX0FDOTc7CisKKwljYXJkLT53YXZlaW4uZnh3YyA9IDB4MDAwMzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW11MTBrMV9hdWRpb19jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfcmVnaXN0ZXJfZGV2aWNlcyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCWNhcmQtPmF1ZGlvX2RldiA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZW11MTBrMV9hdWRpb19mb3BzLCAtMSk7CisJaWYgKGNhcmQtPmF1ZGlvX2RldiA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgZmlyc3QgYXVkaW8gZGV2aWNlIVxuIik7CisJCWdvdG8gZXJyX2RldjsKKwl9CisKKwljYXJkLT5hdWRpb19kZXYxID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlbXUxMGsxX2F1ZGlvX2ZvcHMsIC0xKTsKKwlpZiAoY2FyZC0+YXVkaW9fZGV2MSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgc2Vjb25kIGF1ZGlvIGRldmljZSFcbiIpOworCQlnb3RvIGVycl9kZXYxOworCX0KKworCWNhcmQtPmFjOTctPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZlbXUxMGsxX21peGVyX2ZvcHMsIC0xKTsKKwlpZiAoY2FyZC0+YWM5Ny0+ZGV2X21peGVyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCByZWdpc3RlciBtaXhlciBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9taXhlcjsKKyAgICAgICAgfQorCisJY2FyZC0+bWlkaV9kZXYgPSByZWdpc3Rlcl9zb3VuZF9taWRpKCZlbXUxMGsxX21pZGlfZm9wcywgLTEpOworCWlmIChjYXJkLT5taWRpX2RldiA8IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCByZWdpc3RlciBtaWRpIGRldmljZSFcbiIpOworCQlnb3RvIGVycl9taWRpOworICAgICAgICB9CisKKyNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgorCWNhcmQtPnNlcV9kZXYgPSBzb3VuZF9hbGxvY19taWRpZGV2KCk7CisJaWYgKGNhcmQtPnNlcV9kZXYgPT0gLTEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVtdTEwazE6IHVuYWJsZSB0byByZWdpc3RlciBzZXF1ZW5jZXIgZGV2aWNlISIpOworCWVsc2UgeworCQlzdGRfbWlkaV9zeW50aC5taWRpX2RldiA9IGNhcmQtPnNlcV9kZXY7CisJCW1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XSA9IAorCQkJKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgKikKKwkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpLCBHRlBfS0VSTkVMKTsKKworCQlpZiAobWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSEiKTsKKwkJCXNvdW5kX3VubG9hZF9taWRpZGV2KGNhcmQtPnNlcV9kZXYpOworCQkJY2FyZC0+c2VxX2RldiA9IC0xOworCQkJLyogcmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KKwkJfSBlbHNlIHsKKwkJCW1lbWNweSgoY2hhciAqKW1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XSwgCisJCQkJKGNoYXIgKikmZW11MTBrMV9taWRpX29wZXJhdGlvbnMsIAorCQkJCXNpemVvZihzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSk7CisJCQltaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0tPmRldmMgPSBjYXJkOworCQkJc2VxdWVuY2VyX2luaXQoKTsKKwkJCWNhcmQtPnNlcV9taWRpZGV2ID0gTlVMTDsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiAwOworCitlcnJfbWlkaToKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTctPmRldl9taXhlcik7CitlcnJfbWl4ZXI6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+YXVkaW9fZGV2KTsKK2Vycl9kZXYxOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmF1ZGlvX2Rldik7CitlcnJfZGV2OgorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBlbXUxMGsxX3VucmVnaXN0ZXJfZGV2aWNlcyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCisJaWYgKGNhcmQtPnNlcV9kZXYgPiAtMSkgeworCQlrZnJlZShtaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0pOworCQltaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0gPSBOVUxMOworCQlzb3VuZF91bmxvYWRfbWlkaWRldihjYXJkLT5zZXFfZGV2KTsKKwkJY2FyZC0+c2VxX2RldiA9IC0xOworCX0KKyNlbmRpZgorCisJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKGNhcmQtPm1pZGlfZGV2KTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTctPmRldl9taXhlcik7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+YXVkaW9fZGV2MSk7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+YXVkaW9fZGV2KTsKK30KKworc3RhdGljIGludCBlbXUxMGsxX2luZm9fcHJvYyAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBkYXRhOworCWludCBsZW4gPSAwOworCQorCWlmIChjYXJkID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJEcml2ZXIgVmVyc2lvbiA6ICVzXG4iLCBEUklWRVJfVkVSU0lPTik7CisJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJDYXJkIHR5cGUgICAgICA6ICVzXG4iLCBjYXJkLT5pc19hcHMgPyAiQXBzIiA6IChjYXJkLT5pc19hdWRpZ3kgPyAiQXVkaWd5IiA6ICJFbXUxMGsxIikpOworCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiUmV2aXNpb24gICAgICAgOiAlZFxuIiwgY2FyZC0+Y2hpcHJldik7CisJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJNb2RlbCAgICAgICAgICA6ICUjMDZ4XG4iLCBjYXJkLT5tb2RlbCk7CisJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJJTyAgICAgICAgICAgICA6ICUjMDZseC0lIzA2bHhcbiIsIGNhcmQtPmlvYmFzZSwgY2FyZC0+aW9iYXNlICsgY2FyZC0+bGVuZ3RoIC0gMSk7CisJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJJUlEgICAgICAgICAgICA6ICVkXG5cbiIsIGNhcmQtPmlycSk7CisJCisJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJSZWdpc3RlcmVkIC9kZXYgRW50cmllczpcbiIpOworCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9kc3AlZFxuIiwgY2FyZC0+YXVkaW9fZGV2IC8gMTYpOworCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9kc3AlZFxuIiwgY2FyZC0+YXVkaW9fZGV2MSAvIDE2KTsKKwlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvbWl4ZXIlZFxuIiwgY2FyZC0+YWM5Ny0+ZGV2X21peGVyIC8gMTYpOworCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9taWRpJWRcbiIsIGNhcmQtPm1pZGlfZGV2IC8gMTYpOworCisjaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKKwlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvc2VxdWVuY2VyXG4iKTsKKyNlbmRpZgorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9wcm9jX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwljaGFyIHNbNDhdOworCisJaWYgKCFwcm9jX21rZGlyICgiZHJpdmVyL2VtdTEwazEiLCBOVUxMKSkgeworCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBkaXJlY3RvcnkgZHJpdmVyL2VtdTEwazFcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CisJaWYgKCFwcm9jX21rZGlyIChzLCBOVUxMKSkgeworCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBkaXJlY3RvcnkgJXNcbiIsIHMpOworCQlnb3RvIGVycl9lbXUxMGsxX3Byb2M7CisJfQorCisJc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMvaW5mbyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKKwlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKHMsIDAsIE5VTEwsIGVtdTEwazFfaW5mb19wcm9jLCBjYXJkKSkgeworCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBlbnRyeSAlc1xuIiwgcyk7CisJCWdvdG8gZXJyX2Rldl9wcm9jOworCX0KKworCWlmICghY2FyZC0+aXNfYXBzKSB7CisJCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2FjOTciLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CisJCWlmICghY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAocywgMCwgTlVMTCwgYWM5N19yZWFkX3Byb2MsIGNhcmQtPmFjOTcpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBlbnRyeSAlc1xuIiwgcyk7CisJCQlnb3RvIGVycl9wcm9jX2FjOTc7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3Byb2NfYWM5NzoKKwlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcy9pbmZvIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOworCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOworCitlcnJfZGV2X3Byb2M6CisJc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CisJcmVtb3ZlX3Byb2NfZW50cnkocywgTlVMTCk7CisKK2Vycl9lbXUxMGsxX3Byb2M6CisJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9lbXUxMGsxIiwgTlVMTCk7CisKK2Vycl9vdXQ6CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyB2b2lkIGVtdTEwazFfcHJvY19jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJY2hhciBzWzQ4XTsKKworCWlmICghY2FyZC0+aXNfYXBzKSB7CisJCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2FjOTciLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOworCX0KKworCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2luZm8iLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CisJcmVtb3ZlX3Byb2NfZW50cnkocywgTlVMTCk7CisKKwlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKKwlyZW1vdmVfcHJvY19lbnRyeShzLCBOVUxMKTsKKwkJCisJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9lbXUxMGsxIiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfbWl4ZXJfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyAgPSBhYzk3X2FsbG9jX2NvZGVjKCk7CisJCisJaWYoY29kZWMgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGFsbG9jYXRlIG1peGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWNhcmQtPmFjOTcgPSBjb2RlYzsKKwljYXJkLT5hYzk3LT5wcml2YXRlX2RhdGEgPSBjYXJkOworCisJaWYgKCFjYXJkLT5pc19hcHMpIHsKKwkJY2FyZC0+YWM5Ny0+aWQgPSAwOworCQljYXJkLT5hYzk3LT5jb2RlY19yZWFkID0gZW11MTBrMV9hYzk3X3JlYWQ7CisgICAgICAgIAljYXJkLT5hYzk3LT5jb2RlY193cml0ZSA9IGVtdTEwazFfYWM5N193cml0ZTsKKworCQlpZiAoYWM5N19wcm9iZV9jb2RlYyAoY2FyZC0+YWM5NykgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gcHJvYmUgQUM5NyBjb2RlY1xuIik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJLyogNS4xOiBFbmFibGUgdGhlIGFkZGl0aW9uYWwgQUM5NyBTbG90cyBhbmQgdW5tdXRlIGV4dHJhIGNoYW5uZWxzIG9uIEFDOTcgY29kZWMgKi8KKwkJaWYgKGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X0VYVEVOREVEX0lEKSAmIDB4MDA4MCl7CisJCQlwcmludGsoS0VSTl9JTkZPICJlbXUxMGsxOiBTQkxpdmUhIDUuMSBjYXJkIGRldGVjdGVkXG4iKTsgCisJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQUM5N1NMT1QsIDAsIEFDOTdTTE9UX0NOVFIgfCBBQzk3U0xPVF9MRkUpOworCQkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NVUlJPVU5EX01BU1RFUiwgMHgwKTsKKwkJfQorCisJCS8vIEZvcmNlIDViaXQ6CQkgICAgCisJCS8vY2FyZC0+YWM5Ny0+Yml0X3Jlc29sdXRpb249NTsKKworCQkvKiB0aGVzZSB3aWxsIHN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZXMgYW5kIG5ldmVyIGJlIG1vZGlmaWVkICovCisJCWNhcmQtPmFjOTdfc3VwcG9ydGVkX21peGVycyA9IGNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnM7CisJCWNhcmQtPmFjOTdfc3RlcmVvX21peGVycyA9IGNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnM7CisJfQorCisJcmV0dXJuIDA7CisKKyBlcnJfb3V0OgorIAlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5Nyk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyB2b2lkIGVtdTEwazFfbWl4ZXJfY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9taWRpX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwlpbnQgcmV0OworCisJY2FyZC0+bXB1b3V0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVtdTEwazFfbXB1b3V0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQtPm1wdW91dCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVtdTEwazE6IFVuYWJsZSB0byBhbGxvY2F0ZSBlbXUxMGsxX21wdW91dDogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDE7CisJfQorCisJbWVtc2V0KGNhcmQtPm1wdW91dCwgMCwgc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX21wdW91dCkpOworCisJY2FyZC0+bXB1b3V0LT5pbnRyID0gMTsKKwljYXJkLT5tcHVvdXQtPnN0YXR1cyA9IEZMQUdTX0FWQUlMQUJMRTsKKwljYXJkLT5tcHVvdXQtPnN0YXRlID0gQ0FSRE1JRElPVVRfU1RBVEVfREVGQVVMVDsKKworCXRhc2tsZXRfaW5pdCgmY2FyZC0+bXB1b3V0LT50YXNrbGV0LCBlbXUxMGsxX21wdW91dF9iaCwgKHVuc2lnbmVkIGxvbmcpIGNhcmQpOworCisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPm1wdW91dC0+bG9jayk7CisKKwljYXJkLT5tcHVpbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX21wdWluKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQtPm1wdWluID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZW11MTBrMTogVW5hYmxlIHRvIGFsbG9jYXRlIGVtdTEwazFfbXB1aW46IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXQgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGdvdG8gZXJyX291dDI7CisJfQorCisJbWVtc2V0KGNhcmQtPm1wdWluLCAwLCBzaXplb2Yoc3RydWN0IGVtdTEwazFfbXB1aW4pKTsKKworCWNhcmQtPm1wdWluLT5zdGF0dXMgPSBGTEFHU19BVkFJTEFCTEU7CisKKwl0YXNrbGV0X2luaXQoJmNhcmQtPm1wdWluLT50YXNrbGV0LCBlbXUxMGsxX21wdWluX2JoLCAodW5zaWduZWQgbG9uZykgY2FyZC0+bXB1aW4pOworCisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPm1wdWluLT5sb2NrKTsKKworCS8qIFJlc2V0IHRoZSBNUFUgcG9ydCAqLworCWlmIChlbXUxMGsxX21wdV9yZXNldChjYXJkKSA8IDApIHsKKwkJRVJST1IoKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dDM6CisJa2ZyZWUoY2FyZC0+bXB1aW4pOworZXJyX291dDI6CisJa2ZyZWUoY2FyZC0+bXB1b3V0KTsKK2Vycl9vdXQxOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVtdTEwazFfbWlkaV9jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJdGFza2xldF9raWxsKCZjYXJkLT5tcHVvdXQtPnRhc2tsZXQpOworCWtmcmVlKGNhcmQtPm1wdW91dCk7CisKKwl0YXNrbGV0X2tpbGwoJmNhcmQtPm1wdWluLT50YXNrbGV0KTsKKwlrZnJlZShjYXJkLT5tcHVpbik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2b2ljZV9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0c7IGkrKykKKwkJY2FyZC0+dm9pY2V0YWJsZVtpXSA9IFZPSUNFX1VTQUdFX0ZSRUU7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0aW1lcl9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPnRpbWVycyk7CisJY2FyZC0+dGltZXJfZGVsYXkgPSBUSU1FUl9TVE9QUEVEOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT50aW1lcl9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGFkZHhtZ3JfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXUzMiBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1BWFBBR0VTOyBjb3VudCsrKQorCQljYXJkLT5lbXVwYWdldGFibGVbY291bnRdID0gMDsKKworCS8qIE1hcmsgZmlyc3QgcGFnZSBhcyB1c2VkICovCisJLyogVGhpcyBwYWdlIGlzIHJlc2VydmVkIGJ5IHRoZSBkcml2ZXIgKi8KKwljYXJkLT5lbXVwYWdldGFibGVbMF0gPSAweDgwMDE7CisJY2FyZC0+ZW11cGFnZXRhYmxlWzFdID0gTUFYUEFHRVMgLSAxOworfQorCitzdGF0aWMgdm9pZCBmeF9jbGVhbnVwKHN0cnVjdCBwYXRjaF9tYW5hZ2VyICptZ3IpCit7CisJaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgbWdyLT5jdXJyZW50X3BhZ2VzOyBpKyspCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgbWdyLT5wYXRjaFtpXSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZ4X2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqbWdyID0gJmNhcmQtPm1ncjsKKwlzdHJ1Y3QgZHNwX3BhdGNoICpwYXRjaDsKKwlzdHJ1Y3QgZHNwX3JwYXRjaCAqcnBhdGNoOworCXMzMiBsZWZ0LCByaWdodDsKKwlpbnQgaTsKKwl1MzIgcGMgPSAwOworCXUzMiBwYXRjaF9uPTA7CisJc3RydWN0IGVtdV9lZnhfaW5mb190IGVtdV9lZnhfaW5mb1syXT0KKwkJe3sgMjAsIDEwLCAweDQwMCwgMHgxMDAsIDB4MjAgfSwKKwkJIHsgMjQsIDEyLCAweDYwMCwgMHg0MDAsIDB4NjAgfSwKKwkJfTsgCisJCQkKKworCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykgeworCQltZ3ItPmN0cmxfZ3ByW2ldWzBdID0gLTE7CisJCW1nci0+Y3RybF9ncHJbaV1bMV0gPSAtMTsKKwl9CisKKworCWlmIChjYXJkLT5pc19hdWRpZ3kpCisJCW1nci0+Y3VycmVudF9wYWdlcyA9ICgyICsgUEFUQ0hFU19QRVJfUEFHRSAtIDEpIC8gUEFUQ0hFU19QRVJfUEFHRTsKKwllbHNlCisJCS8qICEhIFRoZSBudW1iZXIgYmVsb3cgbXVzdCBlcXVhbCB0aGUgbnVtYmVyIG9mIHBhdGNoZXMsIGN1cnJlbnRseSAxMSAhISAqLworCQltZ3ItPmN1cnJlbnRfcGFnZXMgPSAoMTEgKyBQQVRDSEVTX1BFUl9QQUdFIC0gMSkgLyBQQVRDSEVTX1BFUl9QQUdFOworCQorCWZvciAoaSA9IDA7IGkgPCBtZ3ItPmN1cnJlbnRfcGFnZXM7IGkrKykgeworCQltZ3ItPnBhdGNoW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmIChtZ3ItPnBhdGNoW2ldID09IE5VTEwpIHsKKwkJCW1nci0+Y3VycmVudF9wYWdlcyA9IGk7CisJCQlmeF9jbGVhbnVwKG1ncik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQobWdyLT5wYXRjaFtpXSwgMCwgUEFHRV9TSVpFKTsKKwl9CisKKwlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisJCQlPUCgweGYsIDB4MGMwLCAweDBjMCwgMHgwY2YsIDB4MGMwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNTEyIDsgaSsrKQorCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfR1BSX0JBU0UraSwwLDApOworCisJCXBjPTA7CisKKwkJLy9QY20gaW5wdXQgdm9sdW1lCisJCU9QKDAsIDB4NDAyLCAweDBjMCwgMHg0MDYsIDB4MDAwKTsKKwkJT1AoMCwgMHg0MDMsIDB4MGMwLCAweDQwNywgMHgwMDEpOworCisJCS8vQ0QtRGlnaXRhbCBpbnB1dCBWb2x1bWUKKwkJT1AoMCwgMHg0MDQsIDB4MGMwLCAweDQwZCwgMHg0Mik7CisJCU9QKDAsIDB4NDA1LCAweDBjMCwgMHg0MGYsIDB4NDMpOworCisJCS8vIENEICsgUENNIAorCQlPUCg2LCAweDQwMCwgMHgwYzAsIDB4NDAyLCAweDQwNCk7CisJCU9QKDYsIDB4NDAxLCAweDBjMCwgMHg0MDMsIDB4NDA1KTsKKwkJCisJCS8vIEZyb250IE91dHB1dCArIE1hc3RlciBWb2x1bWUKKwkJT1AoMCwgMHg2OCwgMHgwYzAsIDB4NDA4LCAweDQwMCk7CisJCU9QKDAsIDB4NjksIDB4MGMwLCAweDQwOSwgMHg0MDEpOworCisJCS8vIEFkZC1pbiBhbmFsb2cgaW5wdXRzIGZvciBvdGhlciBzcGVha2VycworCQlPUCg2LCAweDQwMCwgMHg0MCwgMHg0MDAsIDB4YzApOworCQlPUCg2LCAweDQwMSwgMHg0MSwgMHg0MDEsIDB4YzApOworCisJCS8vIERpZ2l0YWwgRnJvbnQgKyBNYXN0ZXIgVm9sdW1lCisJCU9QKDAsIDB4NjAsIDB4MGMwLCAweDQwOCwgMHg0MDApOworCQlPUCgwLCAweDYxLCAweDBjMCwgMHg0MDksIDB4NDAxKTsKKworCQkvLyBSZWFyIE91dHB1dCArIFJlYXIgVm9sdW1lCisJCU9QKDAsIDB4MDZlLCAweDBjMCwgMHg0MTksIDB4NDAwKTsKKwkJT1AoMCwgMHgwNmYsIDB4MGMwLCAweDQxYSwgMHg0MDEpOwkJCisKKwkJLy8gRGlnaXRhbCBSZWFyIE91dHB1dCArIFJlYXIgVm9sdW1lCisJCU9QKDAsIDB4MDY2LCAweDBjMCwgMHg0MTksIDB4NDAwKTsKKwkJT1AoMCwgMHgwNjcsIDB4MGMwLCAweDQxYSwgMHg0MDEpOwkJCisKKwkJLy8gQXVkaWd5IERyaXZlLCBIZWFkcGhvbmUgb3V0CisJCU9QKDYsIDB4NjQsIDB4MGMwLCAweDBjMCwgMHg0MDApOworCQlPUCg2LCAweDY1LCAweDBjMCwgMHgwYzAsIDB4NDAxKTsKKworCQkvLyBhYzk3IFJlY29yZGluZworCQlPUCg2LCAweDc2LCAweDBjMCwgMHgwYzAsIDB4NDApOworCQlPUCg2LCAweDc3LCAweDBjMCwgMHgwYzAsIDB4NDEpOworCQkKKwkJLy8gQ2VudGVyID0gc3ViID0gTGVmdC8yICsgUmlnaHQvMgorCQlPUCgweGUsIDB4NDAwLCAweDQwMSwgMHhjZCwgMHg0MDApOworCisJCS8vIGNlbnRlci9zdWIgIFZvbHVtZSAobWFzdGVyKQorCQlPUCgwLCAweDA2YSwgMHgwYzAsIDB4NDA4LCAweDQwMCk7CisJCU9QKDAsIDB4MDZiLCAweDBjMCwgMHg0MDksIDB4NDAwKTsKKworCQkvLyBEaWdpdGFsIGNlbnRlci9zdWIgIFZvbHVtZSAobWFzdGVyKQorCQlPUCgwLCAweDA2MiwgMHgwYzAsIDB4NDA4LCAweDQwMCk7CisJCU9QKDAsIDB4MDYzLCAweDBjMCwgMHg0MDksIDB4NDAwKTsKKworCQlST1VUSU5HX1BBVENIX1NUQVJUKHJwYXRjaCwgIlJvdXRpbmciKTsKKwkJUk9VVElOR19QQVRDSF9FTkQocnBhdGNoKTsKKworCQkvKiBkZWxpbWl0ZXIgcGF0Y2ggKi8KKwkJcGF0Y2ggPSBQQVRDSChtZ3IsIHBhdGNoX24pOworCQlwYXRjaC0+Y29kZV9zaXplID0gMDsKKworCQorCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgMHg1MywgMCwgMCk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDUxMiA7IGkrKykKKwkJCU9QKDYsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDApOworCisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKKwkJCQkJICAgIEZYR1BSRUdCQVNFICsgaSwgMCwKKwkJCQkJICAgIFRBTktNRU1BRERSUkVHQkFTRSArIGksIDAsCisJCQkJCSAgICBUQUdMSVNUX0VORCk7CisKKwkJCisJCXBjID0gMDsKKworCQkvL2ZpcnN0IGZyZWUgR1BSID0gMHgxMWIKKwkKKwkJCisJCS8qIEZYIHZvbHVtZSBjb3JyZWN0aW9uIGFuZCBWb2x1bWUgY29udHJvbCovCisJCUlOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiUGNtIEwgdm9sIiwgMHgwLCAwKTsKKwkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTAwLCAweDApOworCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTA2LCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7CisJCUdFVF9EWU5BTUlDX0dQUihwYXRjaCwgMHgxMTIpOworCisJCU9QKDQsIDB4MTEyLCAweDQwLCBQQ01fSU5fTCwgMHg0NCk7IC8vKjQJCisJCU9QKDAsIDB4MTAwLCAweDA0MCwgMHgxMTIsIDB4MTA2KTsgIC8vKnZvbAkKKwkJSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKTsKKworCisJCUlOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiUGNtIFIgdm9sIiwgMHgxLCAwKTsKKwkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTAxLCAweDEpOworCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTA3LCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7CisJCUdFVF9EWU5BTUlDX0dQUihwYXRjaCwgMHgxMTIpOworCisJCU9QKDQsIDB4MTEyLCAweDQwLCBQQ01fSU5fUiwgMHg0NCk7IAorCQlPUCgwLCAweDEwMSwgMHgwNDAsIDB4MTEyLCAweDEwNyk7CisKKwkJSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKTsKKworCisJCS8vIENELURpZ2l0YWwgSW4gVm9sdW1lIGNvbnRyb2wJCisJCUlOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiQ0QtRGlnaXRhbCBWb2wgTCIsIDB4MTIsIDApOworCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMGMsIDB4MTIpOworCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTBkLCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7CisKKwkJT1AoMCwgMHgxMGMsIDB4MDQwLCBTUERJRl9DRF9MLCAweDEwZCk7CisJCUlOUFVUX1BBVENIX0VORChwYXRjaCk7CisKKwkJSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJDRC1EaWdpdGFsIFZvbCBSIiwgMHgxMywgMCk7CisJCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDEwZSwgMHgxMyk7CisJCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMGYsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKKworCQlPUCgwLCAweDEwZSwgMHgwNDAsIFNQRElGX0NEX1IsIDB4MTBmKTsKKwkJSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKTsKKworCQkvL1ZvbHVtZSBDb3JyZWN0aW9uIGZvciBNdWx0aS1jaGFubmVsIElucHV0cwkKKwkJSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJNdWx0aS1DaGFubmVsIEdhaW4iLCAweDA4LCAwKTsKKwkJcGF0Y2gtPmlucHV0PXBhdGNoLT5vdXRwdXQ9MHgzRjAwOworCisJCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExMywgTVVMVElfRlJPTlRfTCk7CisJCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExNCwgTVVMVElfRlJPTlRfUik7CisJCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExNSwgTVVMVElfUkVBUl9MKTsKKwkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTE2LCBNVUxUSV9SRUFSX1IpOworCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTcsIE1VTFRJX0NFTlRFUik7CisJCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExOCwgTVVMVElfTEZFKTsKKworCQlPUCg0LCAweDExMywgMHg0MCwgTVVMVElfRlJPTlRfTCwgMHg0NCk7CisJCU9QKDQsIDB4MTE0LCAweDQwLCBNVUxUSV9GUk9OVF9SLCAweDQ0KTsKKwkJT1AoNCwgMHgxMTUsIDB4NDAsIE1VTFRJX1JFQVJfTCwgMHg0NCk7CisJCU9QKDQsIDB4MTE2LCAweDQwLCBNVUxUSV9SRUFSX1IsIDB4NDQpOworCQlPUCg0LCAweDExNywgMHg0MCwgTVVMVElfQ0VOVEVSLCAweDQ0KTsKKwkJT1AoNCwgMHgxMTgsIDB4NDAsIE1VTFRJX0xGRSwgMHg0NCk7CisJCisJCUlOUFVUX1BBVENIX0VORChwYXRjaCk7CisKKworCQkvL1JvdXRpbmcgcGF0Y2ggc3RhcnQJCisJCVJPVVRJTkdfUEFUQ0hfU1RBUlQocnBhdGNoLCAiUm91dGluZyIpOworCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMDAsIDB4MCk7CisJCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDEwMSwgMHgxKTsKKwkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTBjLCAweDEyKTsKKwkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTBlLCAweDEzKTsKKwkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTEzLCBNVUxUSV9GUk9OVF9MKTsKKwkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTE0LCBNVUxUSV9GUk9OVF9SKTsKKwkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTE1LCBNVUxUSV9SRUFSX0wpOworCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTYsIE1VTFRJX1JFQVJfUik7CisJCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExNywgTVVMVElfQ0VOVEVSKTsKKwkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTE4LCBNVUxUSV9MRkUpOworCisJCUdFVF9EWU5BTUlDX0dQUihycGF0Y2gsIDB4MTAyKTsKKwkJR0VUX0RZTkFNSUNfR1BSKHJwYXRjaCwgMHgxMDMpOworCisJCUdFVF9PVVRQVVRfR1BSKHJwYXRjaCwgMHgxMDQsIDB4OCk7CisJCUdFVF9PVVRQVVRfR1BSKHJwYXRjaCwgMHgxMDUsIDB4OSk7CisJCUdFVF9PVVRQVVRfR1BSKHJwYXRjaCwgMHgxMGEsIDB4Mik7CisJCUdFVF9PVVRQVVRfR1BSKHJwYXRjaCwgMHgxMGIsIDB4Myk7CisJCQorCQkKKwkJLyogaW5wdXQgYnVmZmVyICovCisJCU9QKDYsIDB4MTAyLCBBQzk3X0lOX0wsIDB4NDAsIDB4NDApOworCQlPUCg2LCAweDEwMywgQUM5N19JTl9SLCAweDQwLCAweDQwKTsKKworCisJCS8qIERpZ2l0YWwgSW4gKyBQQ00gKyBNVUxUSV9GUk9OVC0+IEFDOTcgb3V0IChmcm9udCBzcGVha2VycykqLworCQlPUCg2LCBBQzk3X0ZST05UX0wsIDB4MTAwLCAweDEwYywgMHgxMTMpOworCisJCUNPTk5FQ1QoTVVMVElfRlJPTlRfTCwgQUM5N19GUk9OVF9MKTsKKwkJQ09OTkVDVChQQ01fSU5fTCwgQUM5N19GUk9OVF9MKTsKKwkJQ09OTkVDVChTUERJRl9DRF9MLCBBQzk3X0ZST05UX0wpOworCisJCU9QKDYsIEFDOTdfRlJPTlRfUiwgMHgxMDEsIDB4MTBlLCAweDExNCk7CisKKwkJQ09OTkVDVChNVUxUSV9GUk9OVF9SLCBBQzk3X0ZST05UX1IpOworCQlDT05ORUNUKFBDTV9JTl9SLCBBQzk3X0ZST05UX1IpOworCQlDT05ORUNUKFNQRElGX0NEX1IsIEFDOTdfRlJPTlRfUik7CisKKwkJLyogRGlnaXRhbCBJbiArIFBDTSArIEFDOTcgSW4gKyBQQ00xICsgTVVMVElfUkVBUiAtLT4gUmVhciBDaGFubmVsICovIAorCQlPUCg2LCAweDEwNCwgUENNMV9JTl9MLCAweDEwMCwgMHgxMTUpOworCQlPUCg2LCAweDEwNCwgMHgxMDQsIDB4MTBjLCAweDEwMik7CisKKwkJQ09OTkVDVChNVUxUSV9SRUFSX0wsIEFOQUxPR19SRUFSX0wpOworCQlDT05ORUNUKEFDOTdfSU5fTCwgQU5BTE9HX1JFQVJfTCk7CisJCUNPTk5FQ1QoUENNX0lOX0wsIEFOQUxPR19SRUFSX0wpOworCQlDT05ORUNUKFNQRElGX0NEX0wsIEFOQUxPR19SRUFSX0wpOworCQlDT05ORUNUKFBDTTFfSU5fTCwgQU5BTE9HX1JFQVJfTCk7CisKKwkJT1AoNiwgMHgxMDUsIFBDTTFfSU5fUiwgMHgxMDEsIDB4MTE2KTsKKwkJT1AoNiwgMHgxMDUsIDB4MTA1LCAweDEwZSwgMHgxMDMpOworCisJCUNPTk5FQ1QoTVVMVElfUkVBUl9SLCBBTkFMT0dfUkVBUl9SKTsKKwkJQ09OTkVDVChBQzk3X0lOX1IsIEFOQUxPR19SRUFSX1IpOworCQlDT05ORUNUKFBDTV9JTl9SLCBBTkFMT0dfUkVBUl9SKTsKKwkJQ09OTkVDVChTUERJRl9DRF9SLCBBTkFMT0dfUkVBUl9SKTsKKwkJQ09OTkVDVChQQ00xX0lOX1IsIEFOQUxPR19SRUFSX1IpOworCisJCS8qIERpZ2l0YWwgSW4gKyBQQ00gKyBBQzk3IEluICsgTVVMVElfRlJPTlQgLS0+IERpZ2l0YWwgb3V0ICovCisJCU9QKDYsIDB4MTBiLCAweDEwMCwgMHgxMDIsIDB4MTBjKTsKKwkJT1AoNiwgMHgxMGIsIDB4MTBiLCAweDExMywgMHg0MCk7CisKKwkJQ09OTkVDVChNVUxUSV9GUk9OVF9MLCBESUdJVEFMX09VVF9MKTsKKwkJQ09OTkVDVChQQ01fSU5fTCwgRElHSVRBTF9PVVRfTCk7CisJCUNPTk5FQ1QoQUM5N19JTl9MLCBESUdJVEFMX09VVF9MKTsKKwkJQ09OTkVDVChTUERJRl9DRF9MLCBESUdJVEFMX09VVF9MKTsKKworCQlPUCg2LCAweDEwYSwgMHgxMDEsIDB4MTAzLCAweDEwZSk7CisJCU9QKDYsIDB4MTBiLCAweDEwYiwgMHgxMTQsIDB4NDApOworCisJCUNPTk5FQ1QoTVVMVElfRlJPTlRfUiwgRElHSVRBTF9PVVRfUik7CisJCUNPTk5FQ1QoUENNX0lOX1IsIERJR0lUQUxfT1VUX1IpOworCQlDT05ORUNUKEFDOTdfSU5fUiwgRElHSVRBTF9PVVRfUik7CisJCUNPTk5FQ1QoU1BESUZfQ0RfUiwgRElHSVRBTF9PVVRfUik7CisKKwkJLyogQUM5NyBJbiAtLT4gQURDIFJlY29yZGluZyBCdWZmZXIgKi8KKwkJT1AoNiwgQURDX1JFQ19MLCAweDEwMiwgMHg0MCwgMHg0MCk7CisKKwkJQ09OTkVDVChBQzk3X0lOX0wsIEFEQ19SRUNfTCk7CisKKwkJT1AoNiwgQURDX1JFQ19SLCAweDEwMywgMHg0MCwgMHg0MCk7CisKKwkJQ09OTkVDVChBQzk3X0lOX1IsIEFEQ19SRUNfUik7CisKKworCQkvKiBmeDEyOkFuYWxvZy1DZW50ZXIgKi8KKwkJT1AoNiwgQU5BTE9HX0NFTlRFUiwgMHgxMTcsIDB4NDAsIDB4NDApOworCQlDT05ORUNUKE1VTFRJX0NFTlRFUiwgQU5BTE9HX0NFTlRFUik7CisKKwkJLyogZngxMTpBbmFsb2ctTEZFICovCisJCU9QKDYsIEFOQUxPR19MRkUsIDB4MTE4LCAweDQwLCAweDQwKTsKKwkJQ09OTkVDVChNVUxUSV9MRkUsIEFOQUxPR19MRkUpOworCisJCS8qIGZ4MTI6RGlnaXRhbC1DZW50ZXIgKi8KKwkJT1AoNiwgRElHSVRBTF9DRU5URVIsIDB4MTE3LCAweDQwLCAweDQwKTsKKwkJQ09OTkVDVChNVUxUSV9DRU5URVIsIERJR0lUQUxfQ0VOVEVSKTsKKwkJCisJCS8qIGZ4MTE6QW5hbG9nLUxGRSAqLworCQlPUCg2LCBESUdJVEFMX0xGRSwgMHgxMTgsIDB4NDAsIDB4NDApOworCQlDT05ORUNUKE1VTFRJX0xGRSwgRElHSVRBTF9MRkUpOworCQorCQlST1VUSU5HX1BBVENIX0VORChycGF0Y2gpOworCisKKwkJLy8gUmVhciB2b2x1bWUgY29udHJvbAkKKwkJT1VUUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiVm9sIFJlYXIgTCIsIDB4OCwgMCk7CisJCUdFVF9JTlBVVF9HUFIocGF0Y2gsIDB4MTA0LCAweDgpOworCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTE5LCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7CisKKwkJT1AoMCwgQU5BTE9HX1JFQVJfTCwgMHgwNDAsIDB4MTA0LCAweDExOSk7CisJCU9VVFBVVF9QQVRDSF9FTkQocGF0Y2gpOworCisJCU9VVFBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlZvbCBSZWFyIFIiLCAweDksIDApOworCQlHRVRfSU5QVVRfR1BSKHBhdGNoLCAweDEwNSwgMHg5KTsKKwkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDExYSwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOworCisJCU9QKDAsIEFOQUxPR19SRUFSX1IsIDB4MDQwLCAweDEwNSwgMHgxMWEpOworCQlPVVRQVVRfUEFUQ0hfRU5EKHBhdGNoKTsKKworCisJCS8vTWFzdGVyIHZvbHVtZSBjb250cm9sIG9uIGZyb250LWRpZ2l0YWwJCisJCU9VVFBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlZvbCBNYXN0ZXIgTCIsIDB4MiwgMSk7CisJCUdFVF9JTlBVVF9HUFIocGF0Y2gsIDB4MTBhLCAweDIpOworCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTA4LCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7CisKKwkJT1AoMCwgRElHSVRBTF9PVVRfTCwgMHgwNDAsIDB4MTBhLCAweDEwOCk7CisJCU9VVFBVVF9QQVRDSF9FTkQocGF0Y2gpOworCisKKwkJT1VUUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiVm9sIE1hc3RlciBSIiwgMHgzLCAxKTsKKwkJR0VUX0lOUFVUX0dQUihwYXRjaCwgMHgxMGIsIDB4Myk7CisJCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMDksICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKKworCQlPUCgwLCBESUdJVEFMX09VVF9SLCAweDA0MCwgMHgxMGIsIDB4MTA5KTsKKwkJT1VUUFVUX1BBVENIX0VORChwYXRjaCk7CisKKworCQkvKiBkZWxpbWl0ZXIgcGF0Y2ggKi8KKwkJcGF0Y2ggPSBQQVRDSChtZ3IsIHBhdGNoX24pOworCQlwYXRjaC0+Y29kZV9zaXplID0gMDsKKworCQorCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgREJHLCAwLCAwKTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmbWdyLT5sb2NrKTsKKworCS8vIFNldCB1cCBWb2x1bWUgY29udHJvbHMsIHRyeSB0byBrZWVwIHRoaXMgdGhlIHNhbWUgZm9yIGJvdGggQXVkaWd5IGFuZCBMaXZlCisKKwkvL01hc3RlciB2b2x1bWUKKwltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX1ZPTFVNRV1bMF0gPSA4OworCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfVk9MVU1FXVsxXSA9IDk7CisKKwlsZWZ0ID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfVk9MVU1FXSAmIDB4ZmY7CisJcmlnaHQgPSAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfVk9MVU1FXSA+PiA4KSAmIDB4ZmY7CisKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDgsIGxlZnQsIDEgPDwgY2FyZC0+YWM5Ny0+Yml0X3Jlc29sdXRpb24pOworCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgOSwgcmlnaHQsIDEgPDwgY2FyZC0+YWM5Ny0+Yml0X3Jlc29sdXRpb24pOworCisJLy9SZWFyIHZvbHVtZQorCW1nci0+Y3RybF9ncHJbIFNPVU5EX01JWEVSX09HQUlOIF1bMF0gPSAweDE5OworCW1nci0+Y3RybF9ncHJbIFNPVU5EX01JWEVSX09HQUlOIF1bMV0gPSAweDFhOworCisJbGVmdCA9IHJpZ2h0ID0gNjc7CisJY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfT0dBSU5dID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsKKworCWNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnMgfD0gU09VTkRfTUFTS19PR0FJTjsKKwljYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzIHw9IFNPVU5EX01BU0tfT0dBSU47CisKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDB4MTksIGxlZnQsIFZPTF81QklUKTsKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDB4MWEsIHJpZ2h0LCBWT0xfNUJJVCk7CisKKwkvL1BDTSBWb2x1bWUKKwltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX1BDTV1bMF0gPSA2OworCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfUENNXVsxXSA9IDc7CisKKwlsZWZ0ID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfUENNXSAmIDB4ZmY7CisJcmlnaHQgPSAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfUENNXSA+PiA4KSAmIDB4ZmY7CisKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDYsIGxlZnQsIFZPTF81QklUKTsKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDcsIHJpZ2h0LCBWT0xfNUJJVCk7CisKKwkvL0NELURpZ2l0YWwgVm9sdW1lCisJbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9ESUdJVEFMMV1bMF0gPSAweGQ7CisJbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9ESUdJVEFMMV1bMV0gPSAweGY7CisKKwlsZWZ0ID0gcmlnaHQgPSA2NzsKKwljYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9ESUdJVEFMMV0gPSAocmlnaHQgPDwgOCkgfCBsZWZ0OyAKKworCWNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnMgfD0gU09VTkRfTUFTS19ESUdJVEFMMTsKKwljYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzIHw9IFNPVU5EX01BU0tfRElHSVRBTDE7CisKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDB4ZCwgbGVmdCwgVk9MXzVCSVQpOworCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgMHhmLCByaWdodCwgVk9MXzVCSVQpOworCisKKwkvL2hhcmQgd2lyZSB0aGUgYWM5NydzIHBjbSwgcGNtIHZvbHVtZSBpcyBkb25lIGFib3ZlIHVzaW5nIGRzcCBjb2RlLgorCWlmIChjYXJkLT5pc19hdWRpZ3kpCisJCS8vZm9yIEF1ZGlneSwgd2UgbXV0ZSBpdCBhbmQgdXNlIHRoZSBwaGlsaXBzIDYgY2hhbm5lbCBEQUMgaW5zdGVhZAorCQllbXUxMGsxX2FjOTdfd3JpdGUoY2FyZC0+YWM5NywgMHgxOCwgMHg4MDAwKTsKKwllbHNlCisJCS8vRm9yIHRoZSBMaXZlIHdlIGhhcmR3aXJlIGl0IHRvIGZ1bGwgdm9sdW1lCisJCWVtdTEwazFfYWM5N193cml0ZShjYXJkLT5hYzk3LCAweDE4LCAweDApOworCisJLy9yZW1vdmUgaXQgZnJvbSB0aGUgYWM5N19jb2RlYydzIGNvbnRyb2wKKwljYXJkLT5hYzk3X3N1cHBvcnRlZF9taXhlcnMgJj0gflNPVU5EX01BU0tfUENNOworCWNhcmQtPmFjOTdfc3RlcmVvX21peGVycyAmPSB+U09VTkRfTUFTS19QQ007CisKKwkvL3NldCBJZ2FpbiB0byAwZEIgYnkgZGVmYXVsdCwgbWF5YmUgY29uc2lkZXIgaGFyZHdpcmluZyBpdCBoZXJlLgorCWVtdTEwazFfYWM5N193cml0ZShjYXJkLT5hYzk3LCBBQzk3X1JFQ09SRF9HQUlOLCAweDAwMDApOworCWNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX0lHQUlOXSA9IDB4MTAxOyAKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBod19pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJaW50IG5DaDsKKwl1MzIgcGFnZWNvdW50OyAvKiB0bXAgKi8KKwlpbnQgcmV0OworCisJLyogRGlzYWJsZSBhdWRpbyBhbmQgbG9jayBjYWNoZSAqLworCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19MT0NLU09VTkRDQUNIRSB8IEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19NVVRFQlVUVE9ORU5BQkxFKTsKKworCS8qIFJlc2V0IHJlY29yZGluZyBidWZmZXJzICovCisJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAorCQkJICAgIE1JQ0JTLCBBRENCU19CVUZTSVpFX05PTkUsCisJCQkgICAgTUlDQkEsIDAsCisJCQkgICAgRlhCUywgQURDQlNfQlVGU0laRV9OT05FLAorCQkJICAgIEZYQkEsIDAsCisJCQkgICAgQURDQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKKwkJCSAgICBBRENCQSwgMCwKKwkJCSAgICBUQUdMSVNUX0VORCk7CisKKwkvKiBEaXNhYmxlIGNoYW5uZWwgaW50ZXJydXB0ICovCisJZW11MTBrMV93cml0ZWZuMChjYXJkLCBJTlRFLCAwKTsKKwlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCisJCQkgICAgQ0xJRUwsIDAsCisJCQkgICAgQ0xJRUgsIDAsCisJCQkgICAgU09MRUwsIDAsCisJCQkgICAgU09MRUgsIDAsCisJCQkgICAgVEFHTElTVF9FTkQpOworCisJaWYgKGNhcmQtPmlzX2F1ZGlneSkgeworCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsMCwKKwkJCQkgICAgMHg1ZSwweGYwMCwKKwkJCQkgICAgMHg1ZiwweDMsCisJCQkJICAgIFRBR0xJU1RfRU5EKTsKKwl9CisKKwkvKiBJbml0IGVudmVsb3BlIGVuZ2luZSAqLworCWZvciAobkNoID0gMDsgbkNoIDwgTlVNX0c7IG5DaCsrKSB7CisJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgbkNoLAorCQkJCSAgICBEQ1lTVVNWLCAwLAorCQkJCSAgICBJUCwgMCwKKwkJCQkgICAgVlRGVCwgMHhmZmZmLAorCQkJCSAgICBDVkNGLCAweGZmZmYsCisJCQkJICAgIFBUUlgsIDAsCisJCQkJICAgIC8vQ1BGLCAwLAorCQkJCSAgICBDQ1IsIDAsCisKKwkJCQkgICAgUFNTVCwgMCwKKwkJCQkgICAgRFNMLCAweDEwLAorCQkJCSAgICBDQ0NBLCAwLAorCQkJCSAgICBaMSwgMCwKKwkJCQkgICAgWjIsIDAsCisJCQkJICAgIEZYUlQsIDB4ZDAxYzAwMDAsCisKKwkJCQkgICAgQVRLSExETSwgMCwKKwkJCQkgICAgRENZU1VTTSwgMCwKKwkJCQkgICAgSUZBVE4sIDB4ZmZmZiwKKwkJCQkgICAgUEVGRSwgMCwKKwkJCQkgICAgRk1NT0QsIDAsCisJCQkJICAgIFRSRU1GUlEsIDI0LAkvKiAxIEh6ICovCisJCQkJICAgIEZNMkZSUTIsIDI0LAkvKiAxIEh6ICovCisJCQkJICAgIFRFTVBFTlYsIDAsCisKKwkJCQkgICAgLyoqKiBUaGVzZSBhcmUgbGFzdCBzbyBPRkYgcHJldmVudHMgd3JpdGluZyAqKiovCisJCQkJICAgIExGT1ZBTDIsIDAsCisJCQkJICAgIExGT1ZBTDEsIDAsCisJCQkJICAgIEFUS0hMRFYsIDAsCisJCQkJICAgIEVOVlZPTCwgMCwKKwkJCQkgICAgRU5WVkFMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHTElTVF9FTkQpOworCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGLCBuQ2gsIDApOworCQkvKgorCQkgIEF1ZGlneSBGWFJUIGluaXRpYWxpemF0aW9uCisJCSAgcmV2ZXJzZWQgZW5nJ2QsIG1heSBub3QgYmUgYWNjdXJhdGUuCisJCSAqLworCQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7CisJCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsbkNoLAorCQkJCQkgICAgMHg0YywweDAsCisJCQkJCSAgICAweDRkLDB4MCwKKwkJCQkJICAgIDB4NGUsMHgwLAorCQkJCQkgICAgMHg0ZiwweDAsCisJCQkJCSAgICBBX0ZYUlQxLCAweDNmM2YzZjNmLAorCQkJCQkgICAgQV9GWFJUMiwgMHgzZjNmM2YzZiwKKwkJCQkJICAgIEFfU0VOREFNT1VOVFMsIDAsCisJCQkJCSAgICBUQUdMSVNUX0VORCk7CisJCX0KKwl9CisJCisKKwkvKgorCSAqKiBJbml0IHRvIDB4MDIxMDkyMDQgOgorCSAqKiBDbG9jayBhY2N1cmFjeSAgICA9IDAgICAgICgxMDAwcHBtKQorCSAqKiBTYW1wbGUgUmF0ZSAgICAgICA9IDIgICAgICg0OGtIeikKKwkgKiogQXVkaW8gQ2hhbm5lbCAgICAgPSAxICAgICAoTGVmdCBvZiAyKQorCSAqKiBTb3VyY2UgTnVtYmVyICAgICA9IDAgICAgIChVbnNwZWNpZmllZCkKKwkgKiogR2VuZXJhdGlvbiBTdGF0dXMgPSAxICAgICAoT3JpZ2luYWwgZm9yIENhdCBDb2RlIDEyKQorCSAqKiBDYXQgQ29kZSAgICAgICAgICA9IDEyICAgIChEaWdpdGFsIFNpZ25hbCBNaXhlcikKKwkgKiogTW9kZSAgICAgICAgICAgICAgPSAwICAgICAoTW9kZSAwKQorCSAqKiBFbXBoYXNpcyAgICAgICAgICA9IDAgICAgIChOb25lKQorCSAqKiBDUCAgICAgICAgICAgICAgICA9IDEgICAgIChDb3B5cmlnaHQgdW5hc3NlcnRlZCkKKwkgKiogQU4gICAgICAgICAgICAgICAgPSAwICAgICAoRGlnaXRhbCBhdWRpbykKKwkgKiogUCAgICAgICAgICAgICAgICAgPSAwICAgICAoQ29uc3VtZXIpCisJICovCisKKwlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCisKKwkJCSAgICAvKiBTUERJRjAgKi8KKwkJCSAgICBTUENTMCwgKFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgMHgwMDIwMDAwMDAgfAorCQkJCSAgICBTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8IFNQQ1NfR0VORVJBVElPTlNUQVRVUyB8IDB4MDAwMDEyMDAgfCBTUENTX0VNUEhBU0lTX05PTkUgfCBTUENTX0NPUFlSSUdIVCksCisKKwkJCSAgICAvKiBTUERJRjEgKi8KKwkJCSAgICBTUENTMSwgKFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgMHgwMDIwMDAwMDAgfAorCQkJCSAgICBTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8IFNQQ1NfR0VORVJBVElPTlNUQVRVUyB8IDB4MDAwMDEyMDAgfCBTUENTX0VNUEhBU0lTX05PTkUgfCBTUENTX0NPUFlSSUdIVCksCisKKwkJCSAgICAvKiBTUERJRjIgJiBTUERJRjMgKi8KKwkJCSAgICBTUENTMiwgKFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgMHgwMDIwMDAwMDAgfAorCQkJCSAgICBTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8IFNQQ1NfR0VORVJBVElPTlNUQVRVUyB8IDB4MDAwMDEyMDAgfCBTUENTX0VNUEhBU0lTX05PTkUgfCBTUENTX0NPUFlSSUdIVCksCisKKwkJCSAgICBUQUdMSVNUX0VORCk7CisKKwlpZiAoY2FyZC0+aXNfYXVkaWd5ICYmIChjYXJkLT5jaGlwcmV2ID09IDQpKSB7CisJCS8qIEhhY2tzIGZvciBBbGljZTMgdG8gd29yayBpbmRlcGVuZGVudCBvZiBoYVAxNlYgZHJpdmVyICovCisJCXUzMiB0bXA7CisKKwkJLy9TZXR1cCBTUkNNdWx0aV9JMlMgU2FtcGxpbmdSYXRlCisJCXRtcCA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIEFfU1BESUZfU0FNUExFUkFURSwgMCk7CisJCXRtcCAmPSAweGZmZmZmMWZmOworCQl0bXAgfD0gKDB4Mjw8OSk7CisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX1NQRElGX1NBTVBMRVJBVEUsIDAsIHRtcCk7CisKKwkJLyogU2V0dXAgU1JDU2VsIChFbmFibGUgU3BkaWYsSTJTIFNSQ011bHRpKSAqLworCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIDB4MjAsIDB4NjAwMDAwKTsKKwkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAweDI0LCAweDE0KTsKKworCQkvKiBTZXR1cCBTUkNNdWx0aSBJbnB1dCBBdWRpbyBFbmFibGUgKi8KKwkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAweDIwLCAweDZFMDAwMCk7CisJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgMHgyNCwgMHhGRjAwRkYwMCk7CisJfQorCisJcmV0ID0gZnhfaW5pdChjYXJkKTsJCS8qIGluaXRpYWxpemUgZWZmZWN0cyBlbmdpbmUgKi8KKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWNhcmQtPnRhbmttZW0uc2l6ZSA9IDA7CisKKwljYXJkLT52aXJ0dWFscGFnZXRhYmxlLnNpemUgPSBNQVhQQUdFUyAqIHNpemVvZih1MzIpOworCisJY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5zaXplLCAmY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5kbWFfaGFuZGxlKTsKKwlpZiAoY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyID09IE5VTEwpIHsKKwkJRVJST1IoKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnIwOworCX0KKworCWNhcmQtPnNpbGVudHBhZ2Uuc2l6ZSA9IEVNVVBBR0VTSVpFOworCisJY2FyZC0+c2lsZW50cGFnZS5hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+c2lsZW50cGFnZS5zaXplLCAmY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlKTsKKwlpZiAoY2FyZC0+c2lsZW50cGFnZS5hZGRyID09IE5VTEwpIHsKKwkJRVJST1IoKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnIxOworCX0KKworCWZvciAocGFnZWNvdW50ID0gMDsgcGFnZWNvdW50IDwgTUFYUEFHRVM7IHBhZ2Vjb3VudCsrKQorCQkoKHUzMiAqKSBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIpW3BhZ2Vjb3VudF0gPSBjcHVfdG9fbGUzMigoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMikgfCBwYWdlY291bnQpOworCisJLyogSW5pdCBwYWdlIHRhYmxlICYgdGFuayBtZW1vcnkgYmFzZSByZWdpc3RlciAqLworCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKKwkJCSAgICBQVEIsICh1MzIpIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuZG1hX2hhbmRsZSwKKwkJCSAgICBUQ0IsIDAsCisJCQkgICAgVENCUywgMCwKKwkJCSAgICBUQUdMSVNUX0VORCk7CisKKwlmb3IgKG5DaCA9IDA7IG5DaCA8IE5VTV9HOyBuQ2grKykgeworCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIG5DaCwKKwkJCQkgICAgTUFQQSwgTUFQX1BUSV9NQVNLIHwgKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpLAorCQkJCSAgICBNQVBCLCBNQVBfUFRJX01BU0sgfCAoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMiksCisJCQkJICAgIFRBR0xJU1RfRU5EKTsKKwl9CisKKwkvKiBIb2theSwgbm93IGVuYWJsZSB0aGUgQVVEIGJpdCAqLworCS8qIEVuYWJsZSBBdWRpbyA9IDEgKi8KKwkvKiBNdXRlIERpc2FibGUgQXVkaW8gPSAwICovCisJLyogTG9jayBUYW5rIE1lbW9yeSA9IDEgKi8KKwkvKiBMb2NrIFNvdW5kIE1lbW9yeSA9IDAgKi8KKwkvKiBBdXRvIE11dGUgPSAxICovCisJaWYgKGNhcmQtPmlzX2F1ZGlneSkgeworCQlpZiAoY2FyZC0+Y2hpcHJldiA9PSA0KQorCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0FVRElPRU5BQkxFICB8IEhDRkdfQUMzRU5BQkxFX0NEU1BESUYgfCBIQ0ZHX0FDM0VOQUJMRV9HUFNQRElGIHwgSENGR19BVVRPTVVURSB8IEhDRkdfSk9ZRU5BQkxFKTsKKwkJZWxzZQorCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0FVRElPRU5BQkxFICB8IEhDRkdfQVVUT01VVEUgfCBIQ0ZHX0pPWUVOQUJMRSk7CisJfSBlbHNlIHsKKwkJaWYgKGNhcmQtPm1vZGVsID09IDB4MjAgfHwgY2FyZC0+bW9kZWwgPT0gMHhjNDAwIHx8CisJCSAoY2FyZC0+bW9kZWwgPT0gMHgyMSAmJiBjYXJkLT5jaGlwcmV2IDwgNikpCisJICAgICAgICAJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0FVRElPRU5BQkxFICB8IEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19BVVRPTVVURSk7CisJCWVsc2UKKwkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19BVURJT0VOQUJMRSAgfCBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSyB8IEhDRkdfQVVUT01VVEUgfCBIQ0ZHX0pPWUVOQUJMRSk7CisJfQorCS8qIEVuYWJsZSBWb2xfQ3RybCBpcnFzICovCisJZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIElOVEVfVk9MSU5DUkVOQUJMRSB8IElOVEVfVk9MREVDUkVOQUJMRSB8IElOVEVfTVVURUVOQUJMRSB8IElOVEVfRlhEU1BFTkFCTEUpOworCisJaWYgKGNhcmQtPmlzX2F1ZGlneSAmJiAoY2FyZC0+Y2hpcHJldiA9PSA0KSkgeworCQkvKiBVbm11dGUgQW5hbG9nIG5vdy4gIFNldCBHUE82IHRvIDEgZm9yIEFwb2xsby4KKwkJICogVGhpcyBoYXMgdG8gYmUgZG9uZSBhZnRlciBpbml0IEFMaWNlMyBJMlNPdXQgYmV5b25kIDQ4S0h6LgorCQkgKiBTbywgc2VxdWVuY2UgaXMgaW1wb3J0YW50LiAqLworCQl1MzIgdG1wID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIEFfSU9DRkcpOworCQl0bXAgfD0gMHgwMDQwOworCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEFfSU9DRkcsIHRtcCk7CisJfQorCQorCS8qIEZJWE1FOiBUT1NMaW5rIGRldGVjdGlvbiAqLworCWNhcmQtPmhhc190b3NsaW5rID0gMDsKKworCS8qIEluaXRpYWxpemUgZGlnaXRhbCBwYXNzdGhyb3VnaCB2YXJpYWJsZXMgKi8KKwljYXJkLT5wdC5wb3NfZ3ByID0gY2FyZC0+cHQuaW50cl9ncHIgPSBjYXJkLT5wdC5lbmFibGVfZ3ByID0gLTE7CisJY2FyZC0+cHQuc2VsZWN0ZWQgPSAwOworCWNhcmQtPnB0LnN0YXRlID0gUFRfU1RBVEVfSU5BQ1RJVkU7CisJY2FyZC0+cHQuc3Bjc190b191c2UgPSAweDAxOworCWNhcmQtPnB0LnBhdGNoX25hbWUgPSAiQUMzcGFzcyI7CisJY2FyZC0+cHQuaW50cl9ncHJfbmFtZSA9ICJjb3VudCI7CisJY2FyZC0+cHQuZW5hYmxlX2dwcl9uYW1lID0gImVuYWJsZSI7CisJY2FyZC0+cHQucG9zX2dwcl9uYW1lID0gInB0ciI7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPnB0LmxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPnB0LndhaXQpOworCisvKgl0bXAgPSBzYmxpdmVfcmVhZGZuMChjYXJkLCBIQ0ZHKTsKKwlpZiAodG1wICYgKEhDRkdfR1BJTlBVVDAgfCBIQ0ZHX0dQSU5QVVQxKSkgeworCQlzYmxpdmVfd3JpdGVmbjAoY2FyZCwgSENGRywgdG1wIHwgMHg4MDApOworCisJCXVkZWxheSg1MTIpOworCisJCWlmICh0bXAgIT0gKHNibGl2ZV9yZWFkZm4wKGNhcmQsIEhDRkcpICYgfjB4ODAwKSkgeworCQkJY2FyZC0+aGFzX3Rvc2xpbmsgPSAxOworCQkJc2JsaXZlX3dyaXRlZm4wKGNhcmQsIEhDRkcsIHRtcCk7CisJCX0KKwl9CisqLworCXJldHVybiAwOworCisgIGVycjE6CisJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLnNpemUsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkciwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5kbWFfaGFuZGxlKTsKKyAgZXJyMDoKKwlmeF9jbGVhbnVwKCZjYXJkLT5tZ3IpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJLyogSW5pdCBDYXJkICovCisJaWYgKGh3X2luaXQoY2FyZCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwl2b2ljZV9pbml0KGNhcmQpOworCXRpbWVyX2luaXQoY2FyZCk7CisJYWRkeG1ncl9pbml0KGNhcmQpOworCisJRFBEKDIsICIgIGh3IGNvbnRyb2wgcmVnaXN0ZXIgLT4gJSN4XG4iLCBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgSENGRykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVtdTEwazFfY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCWludCBjaDsKKworCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSU5URSwgMCk7CisKKwkvKiogU2h1dGRvd24gdGhlIGNoaXAgKiovCisJZm9yIChjaCA9IDA7IGNoIDwgTlVNX0c7IGNoKyspCisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBEQ1lTVVNWLCBjaCwgMCk7CisKKwlmb3IgKGNoID0gMDsgY2ggPCBOVU1fRzsgY2grKykgeworCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIGNoLAorCQkJCSAgICBWVEZULCAwLAorCQkJCSAgICBDVkNGLCAwLAorCQkJCSAgICBQVFJYLCAwLAorCQkJCSAgICAvL0NQRiwgMCwKKwkJCQkgICAgVEFHTElTVF9FTkQpOworCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGLCBjaCwgMCk7CisJfQorCisJLyogRGlzYWJsZSBhdWRpbyBhbmQgbG9jayBjYWNoZSAqLworCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19MT0NLU09VTkRDQUNIRSB8IEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19NVVRFQlVUVE9ORU5BQkxFKTsKKworCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEIsIDAsCisKKwkJCSAgICAvKiBSZXNldCByZWNvcmRpbmcgYnVmZmVycyAqLworCQkJICAgIE1JQ0JTLCBBRENCU19CVUZTSVpFX05PTkUsCisJCQkgICAgTUlDQkEsIDAsCisJCQkgICAgRlhCUywgQURDQlNfQlVGU0laRV9OT05FLAorCQkJICAgIEZYQkEsIDAsCisJCQkgICAgRlhXQywgMCwKKwkJCSAgICBBRENCUywgQURDQlNfQlVGU0laRV9OT05FLAorCQkJICAgIEFEQ0JBLCAwLAorCQkJICAgIFRDQlMsIDAsCisJCQkgICAgVENCLCAwLAorCQkJICAgIERCRywgMHg4MDAwLAorCisJCQkgICAgLyogRGlzYWJsZSBjaGFubmVsIGludGVycnVwdCAqLworCQkJICAgIENMSUVMLCAwLAorCQkJICAgIENMSUVILCAwLAorCQkJICAgIFNPTEVMLCAwLAorCQkJICAgIFNPTEVILCAwLAorCQkJICAgIFRBR0xJU1RfRU5EKTsKKworCWlmIChjYXJkLT5pc19hdWRpZ3kpCisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCAwLCBBX0RCRywgIEFfREJHX1NJTkdMRV9TVEVQKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5zaXplLCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuZG1hX2hhbmRsZSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT5zaWxlbnRwYWdlLnNpemUsIGNhcmQtPnNpbGVudHBhZ2UuYWRkciwgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlKTsKKwkKKwlpZihjYXJkLT50YW5rbWVtLnNpemUgIT0gMCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT50YW5rbWVtLnNpemUsIGNhcmQtPnRhbmttZW0uYWRkciwgY2FyZC0+dGFua21lbS5kbWFfaGFuZGxlKTsKKworCS8qIHJlbGVhc2UgcGF0Y2ggc3RvcmFnZSBtZW1vcnkgKi8KKwlmeF9jbGVhbnVwKCZjYXJkLT5tZ3IpOworfQorCisvKiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gcm91dGluZSAqLworc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOworCXUzMiBzdWJzeXN2aWQ7CisJaW50IHJldDsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIEVNVTEwSzFfRE1BX01BU0spKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjliaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCisJCXJldHVybiAtRUlPOworCisJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CisKKwlpZiAoKGNhcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW11MTBrMV9jYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICB9CisgICAgICAgIG1lbXNldChjYXJkLCAwLCBzaXplb2Yoc3RydWN0IGVtdTEwazFfY2FyZCkpOworCisJY2FyZC0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApOworCWNhcmQtPmxlbmd0aCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCk7IAorCisJaWYgKHJlcXVlc3RfcmVnaW9uKGNhcmQtPmlvYmFzZSwgY2FyZC0+bGVuZ3RoLCBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogSU8gc3BhY2UgaW4gdXNlXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9yZWdpb247CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIGNhcmQpOworCisJY2FyZC0+aXJxID0gcGNpX2Rldi0+aXJxOworCWNhcmQtPnBjaV9kZXYgPSBwY2lfZGV2OworCisJLyogUmVzZXJ2ZSBJUlEgTGluZSAqLworCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsIGVtdTEwazFfaW50ZXJydXB0LCBTQV9TSElSUSwgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBJUlEgaW4gdXNlXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX1JFVklTSU9OX0lELCAmY2FyZC0+Y2hpcHJldik7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX1NVQlNZU1RFTV9JRCwgJmNhcmQtPm1vZGVsKTsKKworCXByaW50ayhLRVJOX0lORk8gImVtdTEwazE6ICVzIHJldiAlZCBtb2RlbCAlIzA0eCBmb3VuZCwgSU8gYXQgJSMwNGx4LSUjMDRseCwgSVJRICVkXG4iLAorCQljYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCBjYXJkLT5jaGlwcmV2LCBjYXJkLT5tb2RlbCwgY2FyZC0+aW9iYXNlLAorCQljYXJkLT5pb2Jhc2UgKyBjYXJkLT5sZW5ndGggLSAxLCBjYXJkLT5pcnEpOworCisJaWYgKHBjaV9pZC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfQVVESUdZKQorCQljYXJkLT5pc19hdWRpZ3kgPSAxOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmc3Vic3lzdmlkKTsKKwljYXJkLT5pc19hcHMgPSAoc3Vic3lzdmlkID09IEVNVV9BUFNfU1VCSUQpOworCisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOworCWluaXRfTVVURVgoJmNhcmQtPm9wZW5fc2VtKTsKKwljYXJkLT5vcGVuX21vZGUgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPm9wZW5fd2FpdCk7CisKKwlyZXQgPSBlbXUxMGsxX2F1ZGlvX2luaXQoY2FyZCk7CisJaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCBpbml0aWFsaXplIGF1ZGlvIGRldmljZXNcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyX2F1ZGlvOworICAgICAgICB9CisKKwlyZXQgPSBlbXUxMGsxX21peGVyX2luaXQoY2FyZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgaW5pdGlhbGl6ZSBBQzk3IGNvZGVjXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycl9taXhlcjsKKwl9CisKKwlyZXQgPSBlbXUxMGsxX21pZGlfaW5pdChjYXJkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCByZWdpc3RlciBtaWRpIGRldmljZVxuIik7CisJCWdvdG8gZXJyX21pZGk7CisJfQorCisJcmV0ID0gZW11MTBrMV9pbml0KGNhcmQpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGluaXRpYWxpemUgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfZW11MTBrMV9pbml0OworCX0KKworCWlmIChjYXJkLT5pc19hcHMpCisJCWVtdTEwazFfZWNhcmRfaW5pdChjYXJkKTsKKworCXJldCA9IGVtdTEwazFfcmVnaXN0ZXJfZGV2aWNlcyhjYXJkKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisKKwkvKiBwcm9jIGVudHJpZXMgbXVzdCBiZSBjcmVhdGVkIGFmdGVyIHJlZ2lzdGVyaW5nIGRldmljZXMsIGFzCisJICogZW11MTBrMV9pbmZvX3Byb2MgcHJpbnRzIGNhcmQtPmF1ZGlvX2RldiAmY28uICovCisJcmV0ID0gZW11MTBrMV9wcm9jX2luaXQoY2FyZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgaW5pdGlhbGl6ZSBwcm9jIGRpcmVjdG9yeVxuIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJfcHJvYzsKKwl9CisJCisJbGlzdF9hZGQoJmNhcmQtPmxpc3QsICZlbXUxMGsxX2RldnMpOworCisJcmV0dXJuIDA7CisKK2Vycl9wcm9jOgorCWVtdTEwazFfdW5yZWdpc3Rlcl9kZXZpY2VzKGNhcmQpOworCitlcnJfcmVnaXN0ZXI6CisJZW11MTBrMV9jbGVhbnVwKGNhcmQpOworCQorZXJyX2VtdTEwazFfaW5pdDoKKwllbXUxMGsxX21pZGlfY2xlYW51cChjYXJkKTsKKworZXJyX21pZGk6CisJZW11MTBrMV9taXhlcl9jbGVhbnVwKGNhcmQpOworCitlcnJfbWl4ZXI6CisJZW11MTBrMV9hdWRpb19jbGVhbnVwKGNhcmQpOworCitlcnJfYXVkaW86CisJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKworZXJyX2lycToKKwlyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIGNhcmQtPmxlbmd0aCk7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOworCitlcnJfcmVnaW9uOgorCWtmcmVlKGNhcmQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGVtdTEwazFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisKKwlsaXN0X2RlbCgmY2FyZC0+bGlzdCk7CisKKwllbXUxMGsxX3VucmVnaXN0ZXJfZGV2aWNlcyhjYXJkKTsKKwllbXUxMGsxX2NsZWFudXAoY2FyZCk7CisJZW11MTBrMV9taWRpX2NsZWFudXAoY2FyZCk7CisJZW11MTBrMV9taXhlcl9jbGVhbnVwKGNhcmQpOworCWVtdTEwazFfcHJvY19jbGVhbnVwKGNhcmQpOworCWVtdTEwazFfYXVkaW9fY2xlYW51cChjYXJkKTsJCisJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKwlyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIGNhcmQtPmxlbmd0aCk7CisJa2ZyZWUoY2FyZCk7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOworfQorCitNT0RVTEVfQVVUSE9SKCJCZXJ0cmFuZCBMZWUsIENhaSBZaW5nLiAoRW1haWwgdG86IGVtdTEwazEtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDcmVhdGl2ZSBFTVUxMEsxIFBDSSBBdWRpbyBEcml2ZXIgdiIgRFJJVkVSX1ZFUlNJT04gIlxuQ29weXJpZ2h0IChDKSAxOTk5IENyZWF0aXZlIFRlY2hub2xvZ3kgTHRkLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZW11MTBrMV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJlbXUxMGsxIiwKKwkuaWRfdGFibGUJPSBlbXUxMGsxX3BjaV90YmwsCisJLnByb2JlCQk9IGVtdTEwazFfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChlbXUxMGsxX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlbXUxMGsxX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ3JlYXRpdmUgRU1VMTBLMSBQQ0kgQXVkaW8gRHJpdmVyLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIik7CisKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZlbXUxMGsxX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZW11MTBrMV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZW11MTBrMV9wY2lfZHJpdmVyKTsKKworCXJldHVybjsKK30KKworbW9kdWxlX2luaXQoZW11MTBrMV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChlbXUxMGsxX2NsZWFudXBfbW9kdWxlKTsKKworI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCisKKy8qIGluIG1pZGkuYyAqLworZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX29wZW4oaW50IGRldiwgaW50IG1vZGUsIAorCQkJCXZvaWQgKCppbnB1dCkoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpLAorCQkJCXZvaWQgKCpvdXRwdXQpKGludCBkZXYpKTsKK2V4dGVybiB2b2lkIGVtdTEwazFfc2VxX21pZGlfY2xvc2UoaW50IGRldik7CitleHRlcm4gaW50IGVtdTEwazFfc2VxX21pZGlfb3V0KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKTsKK2V4dGVybiBpbnQgZW11MTBrMV9zZXFfbWlkaV9zdGFydF9yZWFkKGludCBkZXYpOworZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX2VuZF9yZWFkKGludCBkZXYpOworZXh0ZXJuIHZvaWQgZW11MTBrMV9zZXFfbWlkaV9raWNrKGludCBkZXYpOworZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX2J1ZmZlcl9zdGF0dXMoaW50IGRldik7CisKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9vcGVyYXRpb25zID0KK3sKKwlUSElTX01PRFVMRSwKKwl7IkVNVTEwSzEgTUlESSIsIDAsIDAsIFNORENBUkRfRU1VMTBLMX0sCisJJnN0ZF9taWRpX3N5bnRoLAorCXswfSwKKwllbXUxMGsxX3NlcV9taWRpX29wZW4sCisJZW11MTBrMV9zZXFfbWlkaV9jbG9zZSwKKwlOVUxMLAorCWVtdTEwazFfc2VxX21pZGlfb3V0LAorCWVtdTEwazFfc2VxX21pZGlfc3RhcnRfcmVhZCwKKwllbXUxMGsxX3NlcV9taWRpX2VuZF9yZWFkLAorCWVtdTEwazFfc2VxX21pZGlfa2ljaywKKwlOVUxMLAorCWVtdTEwazFfc2VxX21pZGlfYnVmZmVyX3N0YXR1cywKKwlOVUxMCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYyBiL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2RlYTNkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvbWlkaS5jCkBAIC0wLDAgKzEsNjEzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBtaWRpLmMgLSAvZGV2L21pZGkgaW50ZXJmYWNlIGZvciBlbXUxMGsxIGRyaXZlcgorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgImNhcmRtby5oIgorI2luY2x1ZGUgImNhcmRtaS5oIgorI2luY2x1ZGUgIm1pZGkuaCIKKworI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCisjaW5jbHVkZSAiLi4vc291bmRfY29uZmlnLmgiCisjZW5kaWYKKworc3RhdGljIERFRklORV9TUElOTE9DSyhtaWRpX3NwaW5sb2NrIF9fYXR0cmlidXRlKCh1bnVzZWQpKSk7CisKK3N0YXRpYyB2b2lkIGluaXRfbWlkaV9oZHIoc3RydWN0IG1pZGlfaGRyICptaWRpaGRyKQoreworCW1pZGloZHItPmJ1ZmZlcmxlbmd0aCA9IE1JRElJTl9CVUZMRU47CisJbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZCA9IDA7CisJbWlkaWhkci0+ZmxhZ3MgPSAwOworfQorCitzdGF0aWMgaW50IG1pZGlpbl9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2LCBzdHJ1Y3QgbWlkaV9oZHIgKiptaWRpaGRycHRyKQoreworCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKKworCWlmICgobWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJRVJST1IoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5pdF9taWRpX2hkcihtaWRpaGRyKTsKKworCWlmICgobWlkaWhkci0+ZGF0YSA9ICh1OCAqKSBrbWFsbG9jKE1JRElJTl9CVUZMRU4sIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCUVSUk9SKCk7CisJCWtmcmVlKG1pZGloZHIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGVtdTEwazFfbXB1aW5fYWRkX2J1ZmZlcihtaWRpX2Rldi0+Y2FyZC0+bXB1aW4sIG1pZGloZHIpIDwgMCkgeworCQlFUlJPUigpOworCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKKwkJa2ZyZWUobWlkaWhkcik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqbWlkaWhkcnB0ciA9IG1pZGloZHI7CisJbGlzdF9hZGRfdGFpbCgmbWlkaWhkci0+bGlzdCwgJm1pZGlfZGV2LT5taWRfaGRycyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbXUxMGsxX21pZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBOVUxMOworCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJRFBGKDIsICJlbXUxMGsxX21pZGlfb3BlbigpXG4iKTsKKworCS8qIENoZWNrIGZvciBjb3JyZWN0IGRldmljZSB0byBvcGVuICovCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmVtdTEwazFfZGV2cykgeworCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdTEwazFfY2FyZCwgbGlzdCk7CisKKwkJaWYgKGNhcmQtPm1pZGlfZGV2ID09IG1pbm9yKQorCQkJZ290byBtYXRjaDsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKKworbWF0Y2g6CisjaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKKwlpZiAoY2FyZC0+c2VxX21pZGlkZXYpCS8qIGNhcmQgaXMgb3BlbmVkIGJ5IHNlcXVlbmNlciAqLworCQlyZXR1cm4gLUVCVVNZOworI2VuZGlmCisKKwkvKiBXYWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZjYXJkLT5vcGVuX3NlbSk7CisJd2hpbGUgKGNhcmQtPm9wZW5fbW9kZSAmIChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmY2FyZC0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCXVwKCZjYXJkLT5vcGVuX3NlbSk7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPm9wZW5fd2FpdCk7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisKKwkJZG93bigmY2FyZC0+b3Blbl9zZW0pOworCX0KKworCWlmICgobWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBrbWFsbG9jKHNpemVvZigqbWlkaV9kZXYpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltaWRpX2Rldi0+Y2FyZCA9IGNhcmQ7CisJbWlkaV9kZXYtPm1pc3RhdGUgPSBNSURJSU5fU1RBVEVfU1RPUFBFRDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX2Rldi0+b1dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1pZGlfZGV2LT5pV2FpdCk7CisJbWlkaV9kZXYtPmlyZCA9IDA7CisJbWlkaV9kZXYtPml3ciA9IDA7CisJbWlkaV9kZXYtPmljbnQgPSAwOworCUlOSVRfTElTVF9IRUFEKCZtaWRpX2Rldi0+bWlkX2hkcnMpOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RydWN0IG1pZGlfb3BlbmluZm8gZHNDYXJkTWlkaU9wZW5JbmZvOworCQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIxOworCQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIyOworCisJCWRzQ2FyZE1pZGlPcGVuSW5mby5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGlfZGV2OworCisJCWlmIChlbXUxMGsxX21wdWluX29wZW4oY2FyZCwgJmRzQ2FyZE1pZGlPcGVuSW5mbykgPCAwKSB7CisJCQlFUlJPUigpOworCQkJa2ZyZWUobWlkaV9kZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQkvKiBBZGQgdHdvIGJ1ZmZlcnMgdG8gcmVjZWl2ZSBzeXNleCBidWZmZXIgKi8KKwkJaWYgKG1pZGlpbl9hZGRfYnVmZmVyKG1pZGlfZGV2LCAmbWlkaWhkcjEpIDwgMCkgeworCQkJa2ZyZWUobWlkaV9kZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlpZiAobWlkaWluX2FkZF9idWZmZXIobWlkaV9kZXYsICZtaWRpaGRyMikgPCAwKSB7CisJCQlsaXN0X2RlbCgmbWlkaWhkcjEtPmxpc3QpOworCQkJa2ZyZWUobWlkaWhkcjEtPmRhdGEpOworCQkJa2ZyZWUobWlkaWhkcjEpOworCQkJa2ZyZWUobWlkaV9kZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RydWN0IG1pZGlfb3BlbmluZm8gZHNDYXJkTWlkaU9wZW5JbmZvOworCisJCWRzQ2FyZE1pZGlPcGVuSW5mby5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGlfZGV2OworCisJCWlmIChlbXUxMGsxX21wdW91dF9vcGVuKGNhcmQsICZkc0NhcmRNaWRpT3BlbkluZm8pIDwgMCkgeworCQkJRVJST1IoKTsKKwkJCWtmcmVlKG1pZGlfZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikgbWlkaV9kZXY7CisKKwljYXJkLT5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKTsKKworCXVwKCZjYXJkLT5vcGVuX3NlbSk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZW11MTBrMV9taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKKworCWxvY2tfa2VybmVsKCk7CisKKwljYXJkID0gbWlkaV9kZXYtPmNhcmQ7CisJRFBGKDIsICJlbXUxMGsxX21pZGlfcmVsZWFzZSgpXG4iKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKKworCQkJd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiAoY2FyZC0+bXB1b3V0LT5maXJzdG1pZGlxICE9IE5VTEwpKSB7CisJCQkJRFBGKDQsICJDYW5ub3QgY2xvc2UgLSBidWZmZXJzIG5vdCBlbXB0eVxuIik7CisKKwkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZtaWRpX2Rldi0+b1dhaXQpOworCisJCQl9CisJCX0KKworCQllbXUxMGsxX21wdW91dF9jbG9zZShjYXJkKTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7CisKKwkJaWYgKG1pZGlfZGV2LT5taXN0YXRlID09IE1JRElJTl9TVEFURV9TVEFSVEVEKSB7CisJCQllbXUxMGsxX21wdWluX3N0b3AoY2FyZCk7CisJCQltaWRpX2Rldi0+bWlzdGF0ZSA9IE1JRElJTl9TVEFURV9TVE9QUEVEOworCQl9CisKKwkJZW11MTBrMV9tcHVpbl9yZXNldChjYXJkKTsKKwkJZW11MTBrMV9tcHVpbl9jbG9zZShjYXJkKTsKKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJm1pZGlfZGV2LT5taWRfaGRycykpIHsKKwkJCW1pZGloZHIgPSBsaXN0X2VudHJ5KG1pZGlfZGV2LT5taWRfaGRycy5uZXh0LCBzdHJ1Y3QgbWlkaV9oZHIsIGxpc3QpOworCisJCQlsaXN0X2RlbChtaWRpX2Rldi0+bWlkX2hkcnMubmV4dCk7CisJCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKKwkJCWtmcmVlKG1pZGloZHIpOworCQl9CisJfQorCisJa2ZyZWUobWlkaV9kZXYpOworCisJZG93bigmY2FyZC0+b3Blbl9zZW0pOworCWNhcmQtPm9wZW5fbW9kZSAmPSB+KChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpOworCXVwKCZjYXJkLT5vcGVuX3NlbSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYXJkLT5vcGVuX3dhaXQpOworCisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVtdTEwazFfbWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBvcykKK3sKKwlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJldCA9IDA7CisJdTE2IGNudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBEKDQsICJlbXUxMGsxX21pZGlfcmVhZCgpLCBjb3VudCAlI3hcbiIsICh1MzIpIGNvdW50KTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG1pZGlfZGV2LT5taXN0YXRlID09IE1JRElJTl9TVEFURV9TVE9QUEVEKSB7CisJCWlmIChlbXUxMGsxX21wdWluX3N0YXJ0KG1pZGlfZGV2LT5jYXJkKSA8IDApIHsKKwkJCUVSUk9SKCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW1pZGlfZGV2LT5taXN0YXRlID0gTUlESUlOX1NUQVRFX1NUQVJURUQ7CisJfQorCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQljbnQgPSBNSURJSU5fQlVGTEVOIC0gbWlkaV9kZXYtPmlyZDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOworCisJCWlmIChtaWRpX2Rldi0+aWNudCA8IGNudCkKKwkJCWNudCA9IG1pZGlfZGV2LT5pY250OworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKKwkJCURQRigyLCAiIEdvIHRvIHNsZWVwLi4uXG4iKTsKKworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmbWlkaV9kZXYtPmlXYWl0KTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIG1pZGlfZGV2LT5pQnVmICsgbWlkaV9kZXYtPmlyZCwgY250KSkgeworCQkJRVJST1IoKTsKKwkJCXJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOworCQl9CisKKwkJbWlkaV9kZXYtPmlyZCArPSBjbnQ7CisJCW1pZGlfZGV2LT5pcmQgJT0gTUlESUlOX0JVRkxFTjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOworCisJCW1pZGlfZGV2LT5pY250IC09IGNudDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCisJCWlmIChtaWRpX2Rldi0+aWNudCA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZW11MTBrMV9taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBvcykKK3sKKwlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQRCg0LCAiZW11MTBrMV9taWRpX3dyaXRlKCksIGNvdW50PSUjeFxuIiwgKHUzMikgY291bnQpOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgobWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbWlkaWhkci0+YnVmZmVybGVuZ3RoID0gY291bnQ7CisJbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZCA9IDA7CisJbWlkaWhkci0+ZmxhZ3MgPSAwOworCisJaWYgKChtaWRpaGRyLT5kYXRhID0gKHU4ICopIGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCUVSUk9SKCk7CisJCWtmcmVlKG1pZGloZHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIobWlkaWhkci0+ZGF0YSwgYnVmZmVyLCBjb3VudCkpIHsKKwkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7CisJCWtmcmVlKG1pZGloZHIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGVtdTEwazFfbXB1b3V0X2FkZF9idWZmZXIobWlkaV9kZXYtPmNhcmQsIG1pZGloZHIpIDwgMCkgeworCQlFUlJPUigpOworCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKKwkJa2ZyZWUobWlkaWhkcik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGVtdTEwazFfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlEUEYoNCwgImVtdTEwazFfbWlkaV9wb2xsKCkgY2FsbGVkXG4iKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcG9sbF93YWl0KGZpbGUsICZtaWRpX2Rldi0+b1dhaXQsIHdhaXQpOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXBvbGxfd2FpdChmaWxlLCAmbWlkaV9kZXYtPmlXYWl0LCB3YWl0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAobWlkaV9kZXYtPm1pc3RhdGUgPT0gTUlESUlOX1NUQVRFX1NUQVJURUQpCisJCQlpZiAobWlkaV9kZXYtPmljbnQgPiAwKQorCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbWFzazsKK30KKworaW50IGVtdTEwazFfbWlkaV9jYWxsYmFjayh1bnNpZ25lZCBsb25nIG1zZywgdW5zaWduZWQgbG9uZyByZWZkYXRhLCB1bnNpZ25lZCBsb25nICpwbXNnKQoreworCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKikgcmVmZGF0YTsKKwlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlEUEYoNCwgImVtdTEwazFfbWlkaV9jYWxsYmFjaygpXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKG1zZykgeworCWNhc2UgSUNBUkRNSURJX09VVExPTkdEQVRBOgorCQltaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBwbXNnWzJdOworCisJCWtmcmVlKG1pZGloZHItPmRhdGEpOworCQlrZnJlZShtaWRpaGRyKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtaWRpX2Rldi0+b1dhaXQpOworCisJCWJyZWFrOworCisJY2FzZSBJQ0FSRE1JRElfSU5MT05HREFUQToKKwkJbWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikgcG1zZ1syXTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZDsgaSsrKSB7CisJCQltaWRpX2Rldi0+aUJ1ZlttaWRpX2Rldi0+aXdyKytdID0gbWlkaWhkci0+ZGF0YVtpXTsKKwkJCW1pZGlfZGV2LT5pd3IgJT0gTUlESUlOX0JVRkxFTjsKKwkJfQorCisJCW1pZGlfZGV2LT5pY250ICs9IG1pZGloZHItPmJ5dGVzcmVjb3JkZWQ7CisKKwkJaWYgKG1pZGlfZGV2LT5taXN0YXRlID09IE1JRElJTl9TVEFURV9TVEFSVEVEKSB7CisJCQlpbml0X21pZGlfaGRyKG1pZGloZHIpOworCQkJZW11MTBrMV9tcHVpbl9hZGRfYnVmZmVyKG1pZGlfZGV2LT5jYXJkLT5tcHVpbiwgbWlkaWhkcik7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm1pZGlfZGV2LT5pV2FpdCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElDQVJETUlESV9JTkRBVEE6CisJCXsKKwkJCXU4ICpwQnVmID0gKHU4ICopICYgcG1zZ1sxXTsKKwkJCXUxNiBieXRlc3ZhbGlkID0gcG1zZ1syXTsKKworCQkJZm9yIChpID0gMDsgaSA8IGJ5dGVzdmFsaWQ7IGkrKykgeworCQkJCW1pZGlfZGV2LT5pQnVmW21pZGlfZGV2LT5pd3IrK10gPSBwQnVmW2ldOworCQkJCW1pZGlfZGV2LT5pd3IgJT0gTUlESUlOX0JVRkxFTjsKKwkJCX0KKworCQkJbWlkaV9kZXYtPmljbnQgKz0gYnl0ZXN2YWxpZDsKKwkJfQorCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbWlkaV9kZXYtPmlXYWl0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLyogVW5rbm93biBtZXNzYWdlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBNSURJIGZpbGUgb3BlcmF0aW9ucyAqLworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlbXUxMGsxX21pZGlfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gZW11MTBrMV9taWRpX3JlYWQsCisJLndyaXRlCQk9IGVtdTEwazFfbWlkaV93cml0ZSwKKwkucG9sbAkJPSBlbXUxMGsxX21pZGlfcG9sbCwKKwkub3BlbgkJPSBlbXUxMGsxX21pZGlfb3BlbiwKKwkucmVsZWFzZQk9IGVtdTEwazFfbWlkaV9yZWxlYXNlLAorfTsKKworCisjaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKKworLyogZnVuY3Rpb25zIHVzZWQgZm9yIHNlcXVlbmNlciBhY2Nlc3MgKi8KKworaW50IGVtdTEwazFfc2VxX21pZGlfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSwKKwkJCQl2b2lkICgqaW5wdXQpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpLAorCQkJCXZvaWQgKCpvdXRwdXQpIChpbnQgZGV2KSkKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOworCXN0cnVjdCBtaWRpX29wZW5pbmZvIGRzQ2FyZE1pZGlPcGVuSW5mbzsKKwlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldjsKKworCWlmIChtaWRpX2RldnNbZGV2XSA9PSBOVUxMIHx8IG1pZGlfZGV2c1tkZXZdLT5kZXZjID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJY2FyZCA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGNhcmQtPm9wZW5fbW9kZSkJCS8qIGNhcmQgaXMgb3BlbmVkIG5hdGl2ZSAqLworCQlyZXR1cm4gLUVCVVNZOworCQkJCisJRFBGKDIsICJlbXUxMGsxX3NlcV9taWRpX29wZW4oKVxuIik7CisJCisJaWYgKChtaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGttYWxsb2Moc2l6ZW9mKCptaWRpX2RldiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1pZGlfZGV2LT5jYXJkID0gY2FyZDsKKwltaWRpX2Rldi0+bWlzdGF0ZSA9IE1JRElJTl9TVEFURV9TVE9QUEVEOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1pZGlfZGV2LT5vV2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWlkaV9kZXYtPmlXYWl0KTsKKwltaWRpX2Rldi0+aXJkID0gMDsKKwltaWRpX2Rldi0+aXdyID0gMDsKKwltaWRpX2Rldi0+aWNudCA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJm1pZGlfZGV2LT5taWRfaGRycyk7CisKKwlkc0NhcmRNaWRpT3BlbkluZm8ucmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpX2RldjsKKworCWlmIChlbXUxMGsxX21wdW91dF9vcGVuKGNhcmQsICZkc0NhcmRNaWRpT3BlbkluZm8pIDwgMCkgeworCQlFUlJPUigpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljYXJkLT5zZXFfbWlkaWRldiA9IG1pZGlfZGV2OworCQkKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbXUxMGsxX3NlcV9taWRpX2Nsb3NlKGludCBkZXYpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKKworCURQRigyLCAiZW11MTBrMV9zZXFfbWlkaV9jbG9zZSgpXG4iKTsKKwlpZiAobWlkaV9kZXZzW2Rldl0gPT0gTlVMTCB8fCBtaWRpX2RldnNbZGV2XS0+ZGV2YyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7CisJZW11MTBrMV9tcHVvdXRfY2xvc2UoY2FyZCk7CisKKwlpZiAoY2FyZC0+c2VxX21pZGlkZXYpIHsKKwkJa2ZyZWUoY2FyZC0+c2VxX21pZGlkZXYpOworCQljYXJkLT5zZXFfbWlkaWRldiA9IE5VTEw7CisJfQorfQorCitpbnQgZW11MTBrMV9zZXFfbWlkaV9vdXQoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChtaWRpX2RldnNbZGV2XSA9PSBOVUxMIHx8IG1pZGlfZGV2c1tkZXZdLT5kZXZjID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJY2FyZCA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKChtaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9oZHIpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltaWRpaGRyLT5idWZmZXJsZW5ndGggPSAxOworCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSAwOworCW1pZGloZHItPmZsYWdzID0gMDsKKworCWlmICgobWlkaWhkci0+ZGF0YSA9ICh1OCAqKSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCUVSUk9SKCk7CisJCWtmcmVlKG1pZGloZHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqKG1pZGloZHItPmRhdGEpID0gbWlkaV9ieXRlOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcihjYXJkLCBtaWRpaGRyKSA8IDApIHsKKwkJRVJST1IoKTsKKwkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7CisJCWtmcmVlKG1pZGloZHIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAxOworfQorCitpbnQgZW11MTBrMV9zZXFfbWlkaV9zdGFydF9yZWFkKGludCBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBlbXUxMGsxX3NlcV9taWRpX2VuZF9yZWFkKGludCBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW11MTBrMV9zZXFfbWlkaV9raWNrKGludCBkZXYpCit7Cit9CisKK2ludCBlbXUxMGsxX3NlcV9taWRpX2J1ZmZlcl9zdGF0dXMoaW50IGRldikKK3sKKwlpbnQgY291bnQ7CisJc3RydWN0IG1pZGlfcXVldWUgKnF1ZXVlOworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7CisKKwlpZiAobWlkaV9kZXZzW2Rldl0gPT0gTlVMTCB8fCBtaWRpX2RldnNbZGV2XS0+ZGV2YyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvdW50ID0gMDsKKworCWNhcmQgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKwlxdWV1ZSA9IGNhcmQtPm1wdW91dC0+Zmlyc3RtaWRpcTsKKworCXdoaWxlIChxdWV1ZSAhPSBOVUxMKSB7CisJCWNvdW50Kys7CisJCWlmIChxdWV1ZSA9PSBjYXJkLT5tcHVvdXQtPmxhc3RtaWRpcSkKKwkJCWJyZWFrOworCisJCXF1ZXVlID0gcXVldWUtPm5leHQ7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvbWlkaS5oIGIvc291bmQvb3NzL2VtdTEwazEvbWlkaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTllYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmgKQEAgLTAsMCArMSw3OCBAQAorLyogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBtaWRpLmgKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCisgKiAgICAgVVNBLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKi8gCisKKyNpZm5kZWYgX01JRElfSAorI2RlZmluZSBfTUlESV9ICisKKyNkZWZpbmUgRk1PREVfTUlESV9TSElGVCAzCisjZGVmaW5lIEZNT0RFX01JRElfUkVBRCAgKEZNT0RFX1JFQUQgPDwgRk1PREVfTUlESV9TSElGVCkKKyNkZWZpbmUgRk1PREVfTUlESV9XUklURSAoRk1PREVfV1JJVEUgPDwgRk1PREVfTUlESV9TSElGVCkKKworI2RlZmluZSBNSURJSU5fU1RBVEVfU1RBUlRFRCAweDAwMDAwMDAxCisjZGVmaW5lIE1JRElJTl9TVEFURV9TVE9QUEVEIDB4MDAwMDAwMDIKKworI2RlZmluZSBNSURJSU5fQlVGTEVOIDEwMjQKKworc3RydWN0IGVtdTEwazFfbWlkaWRldmljZQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7CisJdTMyIG1pc3RhdGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb1dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgaVdhaXQ7CisJczggaUJ1ZltNSURJSU5fQlVGTEVOXTsKKwl1MTYgaXJkLCBpd3IsIGljbnQ7CisJc3RydWN0IGxpc3RfaGVhZCBtaWRfaGRyczsKK307CisKKy8qIHVuY29tbWVudCBuZXh0IGxpbmUgdG8gdXNlIG1pZGkgcG9ydCBvbiBBdWRpZ3kgZHJpdmUgKi8KKy8vI2RlZmluZSBVU0VfQVVESUdZX0RSSVZFX01JREkKKworI2lmZGVmIFVTRV9BVURJR1lfRFJJVkVfTUlESQorI2RlZmluZSBBX01VREFUQQlBX01VREFUQTIKKyNkZWZpbmUgQV9NVUNNRAkJQV9NVUNNRDIKKyNkZWZpbmUgQV9NVVNUQVQJQV9NVUNNRDIKKyNkZWZpbmUgQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkJQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkyCisjZGVmaW5lIEFfSVBSX01JRElSRUNWQlVGRU1QVFkJQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWTIKKyNkZWZpbmUgQV9JTlRFX01JRElUWEVOQUJMRQlBX0lOVEVfTUlESVRYRU5BQkxFMgorI2RlZmluZSBBX0lOVEVfTUlESVJYRU5BQkxFCUFfSU5URV9NSURJUlhFTkFCTEUyCisjZWxzZQorI2RlZmluZSBBX01VREFUQQlBX01VREFUQTEKKyNkZWZpbmUgQV9NVUNNRAkJQV9NVUNNRDEKKyNkZWZpbmUgQV9NVVNUQVQJQV9NVUNNRDEKKyNkZWZpbmUgQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkJQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkxCisjZGVmaW5lIEFfSVBSX01JRElSRUNWQlVGRU1QVFkJQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWTEKKyNkZWZpbmUgQV9JTlRFX01JRElUWEVOQUJMRQlBX0lOVEVfTUlESVRYRU5BQkxFMQorI2RlZmluZSBBX0lOVEVfTUlESVJYRU5BQkxFCUFfSU5URV9NSURJUlhFTkFCTEUxCisjZW5kaWYKKworCisjZW5kaWYgLyogX01JRElfSCAqLworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9taXhlci5jIGIvc291bmQvb3NzL2VtdTEwazEvbWl4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmNhYWEzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvbWl4ZXIuYwpAQCAtMCwwICsxLDY5MCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgbWl4ZXIuYyAtIC9kZXYvbWl4ZXIgaW50ZXJmYWNlIGZvciBlbXUxMGsxIGRyaXZlcgorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwIHN0dWZmCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKyNpbmNsdWRlICI4MDEwLmgiCisjaW5jbHVkZSAicmVjbWdyLmgiCisKKworc3RhdGljIGNvbnN0IHUzMiBiYXNzX3RhYmxlWzQxXVs1XSA9IHsKKwl7IDB4M2U0Zjg0NGYsIDB4ODRlZDRjYzMsIDB4M2NjNjk5MjcsIDB4N2IwMzU1M2EsIDB4YzRkYTg0ODYgfSwKKwl7IDB4M2U2OWExN2EsIDB4ODRjMjgwZmIsIDB4M2NkNzdjZDQsIDB4N2IyZjJhNmYsIDB4YzRiMDhkMWQgfSwKKwl7IDB4M2U4MmZmNDIsIDB4ODQ5OTkxZDUsIDB4M2NlNzQ2NmIsIDB4N2I1OTE3YzYsIDB4YzQ4ODYzZWUgfSwKKwl7IDB4M2U5YmFiM2MsIDB4ODQ3MjY3ZjAsIDB4M2NmNWZmZTgsIDB4N2I4MTM1NjAsIDB4YzQ2MWYyMmMgfSwKKwl7IDB4M2ViM2IyNzUsIDB4ODQ0Y2VkMjksIDB4M2QwM2IyOTUsIDB4N2JhNzlhMWMsIDB4YzQzZDIyM2IgfSwKKwl7IDB4M2VjYjIxNzQsIDB4ODQyOTBjOGIsIDB4M2QxMDY3MTQsIDB4N2JjYzViYTMsIDB4YzQxOWRmYTUgfSwKKwl7IDB4M2VlMjA0NGIsIDB4ODQwNmIyNDQsIDB4M2QxYzI1NjEsIDB4N2JlZjhlNzcsIDB4YzNmODE3MGYgfSwKKwl7IDB4M2VmODY2OTgsIDB4ODNlNWNiOTYsIDB4M2QyNmY0ZDgsIDB4N2MxMTQ2MDAsIDB4YzNkN2I2MjUgfSwKKwl7IDB4M2YwZTUzOTAsIDB4ODNjNjQ2YzksIDB4M2QzMGRjMzksIDB4N2MzMTk0OTgsIDB4YzNiOGFiOTcgfSwKKwl7IDB4M2YyM2Q2MGIsIDB4ODNhODEzMjEsIDB4M2QzOWUxYWYsIDB4N2M1MDhiOWMsIDB4YzM5YWU3MDQgfSwKKwl7IDB4M2YzOGY4ODQsIDB4ODM4YjIwZDIsIDB4M2Q0MjBhZDIsIDB4N2M2ZTNiNzUsIDB4YzM3ZTU4ZjEgfSwKKwl7IDB4M2Y0ZGM1MmMsIDB4ODM2ZjYwZWYsIDB4M2Q0OTVjYWIsIDB4N2M4YWIzYTYsIDB4YzM2MmYyYmUgfSwKKwl7IDB4M2Y2MjQ1ZTgsIDB4ODM1NGM1NjUsIDB4M2Q0ZmRiYjgsIDB4N2NhNjAyZDYsIDB4YzM0OGE2OWIgfSwKKwl7IDB4M2Y3Njg0NWYsIDB4ODMzYjQwZWMsIDB4M2Q1NThiZjAsIDB4N2NjMDM2ZGYsIDB4YzMyZjY3N2MgfSwKKwl7IDB4M2Y4YThhMDMsIDB4ODMyMmM2ZmIsIDB4M2Q1YTcwYzQsIDB4N2NkOTVjZDcsIDB4YzMxNzI5MGIgfSwKKwl7IDB4M2Y5ZTYwMTQsIDB4ODMwYjRiYzMsIDB4M2Q1ZThkMjUsIDB4N2NmMTgxMWEsIDB4YzJmZmRmYTUgfSwKKwl7IDB4M2ZiMjBmYWUsIDB4ODJmNGM0MjAsIDB4M2Q2MWUzN2YsIDB4N2QwOGFmNTYsIDB4YzJlOTgwNGEgfSwKKwl7IDB4M2ZjNWExY2MsIDB4ODJkZjI1OTIsIDB4M2Q2NDc1YzMsIDB4N2QxZWYyOTQsIDB4YzJkNDAwOTYgfSwKKwl7IDB4M2ZkOTFmNTUsIDB4ODJjYTY2MzIsIDB4M2Q2NjQ1NjQsIDB4N2QzNDU1NDEsIDB4YzJiZjU2YjkgfSwKKwl7IDB4M2ZlYzkxMjAsIDB4ODJiNjdjYWMsIDB4M2Q2NzUzNTYsIDB4N2Q0OGUxMzgsIDB4YzJhYjc5NmUgfSwKKwl7IDB4NDAwMDAwMDAsIDB4ODJhMzYwMzcsIDB4M2Q2N2EwMTIsIDB4N2Q1YzlmYzksIDB4YzI5ODVmZWUgfSwKKwl7IDB4NDAxMzc0YzcsIDB4ODI5MTA4OGEsIDB4M2Q2NzJiOTMsIDB4N2Q2Zjk5YzMsIDB4YzI4NjAxZjIgfSwKKwl7IDB4NDAyNmY4NTcsIDB4ODI3ZjZkZDcsIDB4M2Q2NWY1NTksIDB4N2Q4MWQ3N2MsIDB4YzI3NDU3YTMgfSwKKwl7IDB4NDAzYTkzOWYsIDB4ODI2ZTg4YzUsIDB4M2Q2M2ZjNjMsIDB4N2Q5MzYwZDQsIDB4YzI2MzU5OTYgfSwKKwl7IDB4NDA0ZTRmYWYsIDB4ODI1ZTUyNjYsIDB4M2Q2MTNmMzIsIDB4N2RhNDNkNDIsIDB4YzI1MzAwYzYgfSwKKwl7IDB4NDA2MjM1YmEsIDB4ODI0ZWM0MzQsIDB4M2Q1ZGJiYzMsIDB4N2RiNDczZDcsIDB4YzI0MzQ2OGUgfSwKKwl7IDB4NDA3NjRmMWYsIDB4ODIzZmQ4MGMsIDB4M2Q1OTZmOGYsIDB4N2RjNDBiNDQsIDB4YzIzNDI0YTIgfSwKKwl7IDB4NDA4YWE1NzYsIDB4ODIzMTg4MjQsIDB4M2Q1NDU3ODcsIDB4N2RkMzA5ZTIsIDB4YzIyNTk1MDkgfSwKKwl7IDB4NDA5ZjQyOTYsIDB4ODIyM2NmMGIsIDB4M2Q0ZTcwMTIsIDB4N2RlMTc1YjUsIDB4YzIxNzkyMTggfSwKKwl7IDB4NDBiNDMwYTAsIDB4ODIxNmE3YTEsIDB4M2Q0N2I1MDUsIDB4N2RlZjU0NzUsIDB4YzIwYTE2NzAgfSwKKwl7IDB4NDBjOTdhMGEsIDB4ODIwYTBkMTIsIDB4M2Q0MDIxYTEsIDB4N2RmY2FiOGQsIDB4YzFmZDFjZjUgfSwKKwl7IDB4NDBkZjI5YTYsIDB4ODFmZGZhZDYsIDB4M2QzN2IwOGQsIDB4N2UwOTgwMjgsIDB4YzFmMGEwY2EgfSwKKwl7IDB4NDBmNTRhYjEsIDB4ODFmMjZjYTksIDB4M2QyZTViZDEsIDB4N2UxNWQ3MmIsIDB4YzFlNDlkNTIgfSwKKwl7IDB4NDEwYmU4ZGEsIDB4ODFlNzVlODksIDB4M2QyNDFjY2UsIDB4N2UyMWI1NDQsIDB4YzFkOTBlMjQgfSwKKwl7IDB4NDEyMzEwNTEsIDB4ODFkY2NjYjMsIDB4M2QxOGVjMzcsIDB4N2UyZDFlZTYsIDB4YzFjZGVmMTAgfSwKKwl7IDB4NDEzYWNkZDAsIDB4ODFkMmIzOWUsIDB4M2QwY2MyMGEsIDB4N2UzODE4NGUsIDB4YzFjMzNjMTMgfSwKKwl7IDB4NDE1MzJlYTcsIDB4ODFjOTBmZmIsIDB4M2NmZjk1ODUsIDB4N2U0MmE1OGIsIDB4YzFiOGYxNWEgfSwKKwl7IDB4NDE2YzQwY2QsIDB4ODFiZmRlYjIsIDB4M2NmMTVkMjEsIDB4N2U0Y2NhN2MsIDB4YzFhZjBiM2YgfSwKKwl7IDB4NDE4NjEyZWEsIDB4ODFiNzFjZGMsIDB4M2NlMjBlODUsIDB4N2U1NjhhZDMsIDB4YzFhNTg2NDAgfSwKKwl7IDB4NDFhMGI0NjUsIDB4ODFhZWM3YzUsIDB4M2NkMTllN2MsIDB4N2U1ZmVhMWUsIDB4YzE5YzVmMDMgfSwKKwl7IDB4NDFiYzM1NzMsIDB4ODFhNmRjZWEsIDB4M2NjMDAwZTksIDB4N2U2OGViYzIsIDB4YzE5MzkyNTAgfQorfTsKKworc3RhdGljIGNvbnN0IHUzMiB0cmVibGVfdGFibGVbNDFdWzVdID0geworCXsgMHgwMTI1Y2JhOSwgMHhmZWQ1ZGViZCwgMHgwMDU5OWI2YywgMHgwZDI1MDZkYSwgMHhmYTg1YjM1NCB9LAorCXsgMHgwMTQyZjY3ZSwgMHhmZWIwMzE2MywgMHgwMDY2Y2QwZiwgMHgwZDE0YzY5ZCwgMHhmYTkxNDQ3MyB9LAorCXsgMHgwMTYzMjhiZCwgMHhmZTg2MDE1OCwgMHgwMDc1YjdmMiwgMHgwZDAzZWIyNywgMHhmYTlkMzJkMiB9LAorCXsgMHgwMTg2YjQzOCwgMHhmZTU2Yzk4MiwgMHgwMDg2OTIzNCwgMHgwY2YyNzA0OCwgMHhmYWE5N2ZjYSB9LAorCXsgMHgwMWFkZjM1OCwgMHhmZTIxZjVmZSwgMHgwMDk5OTg0MiwgMHgwY2UwNTFjMiwgMHhmYWI2MmNhNSB9LAorCXsgMHgwMWQ5NDlmYSwgMHhmZGU2ZTI4NywgMHgwMGFmMGQ4ZCwgMHgwY2NkOGI0YSwgMHhmYWMzM2FhNyB9LAorCXsgMHgwMjA5MjY2OSwgMHhmZGE0ZDhiZiwgMHgwMGM3M2Q0YywgMHgwY2JhMTg4NCwgMHhmYWQwYWIwNyB9LAorCXsgMHgwMjNlMDI2OCwgMHhmZDViMGU0YSwgMHgwMGUyN2I1NCwgMHgwY2E1ZjUwOSwgMHhmYWRlN2VmMiB9LAorCXsgMHgwMjc4NjQ1YywgMHhmZDA4YTJiMCwgMHgwMTAxMjUwOSwgMHgwYzkxMWM2MywgMHhmYWVjYjc4OCB9LAorCXsgMHgwMmI4ZTA5MSwgMHhmY2FjOWQxYSwgMHgwMTIzYTI2MiwgMHgwYzdiOGExNCwgMHhmYWZiNTVkZiB9LAorCXsgMHgwMzAwMWE5YSwgMHhmYzQ1ZTljZSwgMHgwMTRhNjcwOSwgMHgwYzY1Mzk4ZiwgMHhmYjBhNWFmZiB9LAorCXsgMHgwMzRlYzZkNywgMHhmYmQzNTc2YiwgMHgwMTc1ZjM5NywgMHgwYzRlMjY0MywgMHhmYjE5YzdlNCB9LAorCXsgMHgwM2E1YWMxNSwgMHhmYjUzOTNlZSwgMHgwMWE2ZDZlZCwgMHgwYzM2NGI5NCwgMHhmYjI5OWQ3YyB9LAorCXsgMHgwNDA1YTU2MiwgMHhmYWM1Mjk2OCwgMHgwMWRkYWZhZSwgMHgwYzFkYTRlMiwgMHhmYjM5ZGNhNSB9LAorCXsgMHgwNDZmYTNmZSwgMHhmYTI2N2E2NiwgMHgwMjFiMmRkZCwgMHgwYzA0MmQ4ZCwgMHhmYjRhODYzMSB9LAorCXsgMHgwNGU0YjE3ZiwgMHhmOTc1YmUwZiwgMHgwMjYwMTQ5ZiwgMHgwYmU5ZTBmMiwgMHhmYjViOWFlMCB9LAorCXsgMHgwNTY1ZjIyMCwgMHhmOGIwZmJlNSwgMHgwMmFkM2MyOSwgMHgwYmNlYmE3MywgMHhmYjZkMWI2MCB9LAorCXsgMHgwNWY0YTc0NSwgMHhmN2Q2MDcyMiwgMHgwMzAzOTNkNCwgMHgwYmIyYjU3OCwgMHhmYjdmMDg0ZCB9LAorCXsgMHgwNjkyMzIzNiwgMHhmNmUyNzliZCwgMHgwMzY0MjQ2NSwgMHgwYjk1Y2Q3NSwgMHhmYjkxNjIzMyB9LAorCXsgMHgwNzQwMTcxMywgMHhmNWQzYWVmOSwgMHgwM2QwMTI4MywgMHgwYjc3ZmRlZCwgMHhmYmE0Mjk4NCB9LAorCXsgMHgwODAwMDAwMCwgMHhmNGE2YmQ4OCwgMHgwNDQ4YTE2MSwgMHgwYjU5NDI3OCwgMHhmYmI3NWU5ZiB9LAorCXsgMHgwOGQzYzA5NywgMHhmMzU4NzEzMSwgMHgwNGNmMzVhNCwgMHgwYjM5OTZjOSwgMHhmYmNiMDFjYiB9LAorCXsgMHgwOWJkNTlhMiwgMHhmMWU1NDNmOSwgMHgwNTY1NTg4MCwgMHgwYjE4ZjZiMiwgMHhmYmRmMTMzMyB9LAorCXsgMHgwYWJlZmQwZiwgMHhmMDQ5NTZjYSwgMHgwNjBjYmIxMiwgMHgwYWY3NWUyYywgMHhmYmYzOTJlOCB9LAorCXsgMHgwYmRiMTIzZSwgMHhlZTgwNjk4NCwgMHgwNmM3MzlmZSwgMHgwYWQ0Yzk2MiwgMHhmYzA4ODBkZCB9LAorCXsgMHgwZDE0M2E5NCwgMHhlYzg1ZDI4NywgMHgwNzk2ZTE1MCwgMHgwYWIxMzRiMCwgMHhmYzFkZGNlNSB9LAorCXsgMHgwZTZkNTY2NCwgMHhlYTU0NzU5OCwgMHgwODdkZjBhMCwgMHgwYThjOWNiNiwgMHhmYzMzYTZhZCB9LAorCXsgMHgwZmU5OGEyYSwgMHhlN2U2YmEzNSwgMHgwOTdlZGY4MywgMHgwYTY2ZmU1YiwgMHhmYzQ5ZGRjMiB9LAorCXsgMHgxMThjNDQyMSwgMHhlNTM2ODEzYSwgMHgwYTljNjI0OCwgMHgwYTQwNTZkNywgMHhmYzYwODE4NSB9LAorCXsgMHgxMzU5NDIyZSwgMHhlMjNkMTllYiwgMHgwYmQ5NmVmYiwgMHgwYTE4YTNiZiwgMHhmYzc3OTEyYyB9LAorCXsgMHgxNTU0OTgyYiwgMHhkZWYzMzY0NSwgMHgwZDM5NDJiZCwgMHgwOWVmZTMxMiwgMHhmYzhmMGJjMSB9LAorCXsgMHgxNzgyYjY4YSwgMHhkYjUwZGViMSwgMHgwZWJmNjc2ZCwgMHgwOWM2MTMzZiwgMHhmY2E2ZjAxOSB9LAorCXsgMHgxOWU4NzE1ZCwgMHhkNzRkNjRmZCwgMHgxMDZmYjk5OSwgMHgwOTliMzMzNywgMHhmY2JmM2NkNiB9LAorCXsgMHgxYzhiMDdiOCwgMHhkMmRmNTZhYiwgMHgxMjRlNmVjOCwgMHgwOTZmNDI3NCwgMHhmY2Q3ZjA2MCB9LAorCXsgMHgxZjcwMmI2ZCwgMHhjZGZjNmU5MiwgMHgxNDYwMWMxMCwgMHgwOTQyNDEwYiwgMHhmY2YxMDhlNSB9LAorCXsgMHgyMjllMDkzMywgMHhjODk5ODVjZCwgMHgxNmE5YmNmYSwgMHgwOTE0MmZiNSwgMHhmZDBhODQ1MSB9LAorCXsgMHgyNjFiNTExOCwgMHhjMmFhODQwOSwgMHgxOTMwYmFiNiwgMHgwOGU1MGZkYywgMHhmZDI0NjA0ZCB9LAorCXsgMHgyOWVmM2Y1ZCwgMHhiYzIyNGYyOCwgMHgxYmZhZjM5NiwgMHgwOGI0ZTNhYSwgMHhmZDNlOWEzYiB9LAorCXsgMHgyZTIxYTU5YiwgMHhiNGYyYmE0NiwgMHgxZjBlYzJkNiwgMHgwODgzYWUxNSwgMHhmZDU5MmYzMyB9LAorCXsgMHgzMmJhZjQ0YiwgMHhhZDBjNzQyOSwgMHgyMjczMDhhMywgMHgwODUxNzJlYiwgMHhmZDc0MWJmZCB9LAorCXsgMHgzN2M0NDQ4YiwgMHhhNDVlZjUxZCwgMHgyNjJmMzI2NywgMHgwODFlMzZkYywgMHhmZDhmNWQxNCB9Cit9OworCisKK3N0YXRpYyB2b2lkIHNldF9iYXNzKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBsLCBpbnQgcikKK3sKKwlpbnQgaTsKKworCWwgPSAobCAqIDQwICsgNTApIC8gMTAwOworCXIgPSAociAqIDQwICsgNTApIC8gMTAwOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIChjYXJkLT5pc19hdWRpZ3kgPyBBX0dQUl9CQVNFIDogR1BSX0JBU0UpICsgY2FyZC0+bWdyLmN0cmxfZ3ByW1NPVU5EX01JWEVSX0JBU1NdWzBdICsgaSwgMCwgYmFzc190YWJsZVtsXVtpXSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF90cmVibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IGwsIGludCByKQoreworCWludCBpOworCisJbCA9IChsICogNDAgKyA1MCkgLyAxMDA7CisJciA9IChyICogNDAgKyA1MCkgLyAxMDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgKGNhcmQtPmlzX2F1ZGlneSA/IEFfR1BSX0JBU0UgOiBHUFJfQkFTRSkgKyBjYXJkLT5tZ3IuY3RybF9ncHJbU09VTkRfTUlYRVJfVFJFQkxFXVswXSArIGkgLCAwLCB0cmVibGVfdGFibGVbbF1baV0pOworfQorCitjb25zdCBjaGFyIHZvbHVtZV9wYXJhbXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXT0geworLyogVXNlZCBieSB0aGUgYWM5NyBkcml2ZXIgKi8KKwlbU09VTkRfTUlYRVJfVk9MVU1FXQk9CVZPTF82QklULAorCVtTT1VORF9NSVhFUl9CQVNTXQk9CVZPTF80QklULAorCVtTT1VORF9NSVhFUl9UUkVCTEVdCT0JVk9MXzRCSVQsCisJW1NPVU5EX01JWEVSX1BDTV0JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfU1BFQUtFUl0JPQlWT0xfNEJJVCwKKwlbU09VTkRfTUlYRVJfTElORV0JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfTUlDXQk9CVZPTF81QklULAorCVtTT1VORF9NSVhFUl9DRF0JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfQUxUUENNXQk9CVZPTF82QklULAorCVtTT1VORF9NSVhFUl9JR0FJTl0JPQlWT0xfNEJJVCwKKwlbU09VTkRfTUlYRVJfTElORTFdCT0JVk9MXzVCSVQsCisJW1NPVU5EX01JWEVSX1BIT05FSU5dCT0gCVZPTF81QklULAorCVtTT1VORF9NSVhFUl9QSE9ORU9VVF0JPSAJVk9MXzZCSVQsCisJW1NPVU5EX01JWEVSX1ZJREVPXQk9CVZPTF81QklULAorLyogTm90IHVzZWQgYnkgdGhlIGFjOTcgZHJpdmVyICovCisJW1NPVU5EX01JWEVSX1NZTlRIXQk9CVZPTF81QklULAorCVtTT1VORF9NSVhFUl9JTUlYXQk9CVZPTF81QklULAorCVtTT1VORF9NSVhFUl9SRUNMRVZdCT0JVk9MXzVCSVQsCisJW1NPVU5EX01JWEVSX09HQUlOXQk9CVZPTF81QklULAorCVtTT1VORF9NSVhFUl9MSU5FMl0JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfTElORTNdCT0JVk9MXzVCSVQsCisJW1NPVU5EX01JWEVSX0RJR0lUQUwxXQk9CVZPTF81QklULAorCVtTT1VORF9NSVhFUl9ESUdJVEFMMl0JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfRElHSVRBTDNdCT0JVk9MXzVCSVQsCisJW1NPVU5EX01JWEVSX1JBRElPXQk9CVZPTF81QklULAorCVtTT1VORF9NSVhFUl9NT05JVE9SXQk9CVZPTF81QklUCit9OworCisvKiBNaXhlciBmaWxlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgZW11MTBrMV9wcml2YXRlX21peGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsICpjdGw7CisJc3RydWN0IGRzcF9wYXRjaCAqcGF0Y2g7CisJdTMyIHNpemUsIHBhZ2U7CisJaW50IGFkZHIsIHNpemVfcmVnLCBpLCByZXQ7CisJdW5zaWduZWQgaW50IGlkLCBjaDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUzOgorCisJCWN0bCA9IChzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCksIEdGUF9LRVJORUwpOworCQlpZiAoY3RsID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoY3RsLCBhcmdwLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkgeworCQkJa2ZyZWUoY3RsKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmV0ID0gMDsKKwkJc3dpdGNoIChjdGwtPmNtZCkgeworI2lmZGVmIERCR0VNVQorCQljYXNlIENNRF9XUklURUZOMDoKKwkJCWVtdTEwazFfd3JpdGVmbjBfMihjYXJkLCBjdGwtPnZhbFswXSwgY3RsLT52YWxbMV0sIGN0bC0+dmFsWzJdKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgQ01EX1dSSVRFUFRSOgorI2lmZGVmIERCR0VNVQorCQkJaWYgKGN0bC0+dmFsWzFdID49IDB4NDAgfHwgY3RsLT52YWxbMF0gPj0gMHgxMDAwKSB7CisjZWxzZQorCQkJaWYgKGN0bC0+dmFsWzFdID49IDB4NDAgfHwgY3RsLT52YWxbMF0gPj0gMHgxMDAwIHx8ICgoY3RsLT52YWxbMF0gPCAweDEwMCApICYmCisJCSAgICAvL0FueSByZWdpc3RlciBhbGxvd2VkIHJhdyBhY2Nlc3MgZ29lcyBoZXJlOgorCQkJCSAgICAgKGN0bC0+dmFsWzBdICE9IEFfU1BESUZfU0FNUExFUkFURSkgJiYgKGN0bC0+dmFsWzBdICE9IEFfREJHKQorCQkJKQorCQkJCSkgeworI2VuZGlmCisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBjdGwtPnZhbFswXSwgY3RsLT52YWxbMV0sIGN0bC0+dmFsWzJdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX1JFQURGTjA6CisJCQljdGwtPnZhbFsyXSA9IGVtdTEwazFfcmVhZGZuMChjYXJkLCBjdGwtPnZhbFswXSk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKKwkJCQlyZXQgPSAtRUZBVUxUOworCisJCQlicmVhazsKKworCQljYXNlIENNRF9SRUFEUFRSOgorCQkJaWYgKGN0bC0+dmFsWzFdID49IDB4NDAgfHwgKGN0bC0+dmFsWzBdICYgMHg3ZmYpID4gMHhmZikgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICgoY3RsLT52YWxbMF0gJiAweDdmZikgPiAweDNmKQorCQkJCWN0bC0+dmFsWzFdID0gMHgwMDsKKworCQkJY3RsLT52YWxbMl0gPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBjdGwtPnZhbFswXSwgY3RsLT52YWxbMV0pOworCisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCisJCQkJcmV0ID0gLUVGQVVMVDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfU0VUUkVDU1JDOgorCQkJc3dpdGNoIChjdGwtPnZhbFswXSkgeworCQkJY2FzZSBXQVZFUkVDT1JEX0FDOTc6CisJCQkJaWYgKGNhcmQtPmlzX2FwcykgeworCQkJCQlyZXQgPSAtRUlOVkFMOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9BQzk3OworCQkJCWJyZWFrOworCisJCQljYXNlIFdBVkVSRUNPUkRfTUlDOgorCQkJCWNhcmQtPndhdmVpbi5yZWNzcmMgPSBXQVZFUkVDT1JEX01JQzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBXQVZFUkVDT1JEX0ZYOgorCQkJCWNhcmQtPndhdmVpbi5yZWNzcmMgPSBXQVZFUkVDT1JEX0ZYOworCQkJCWNhcmQtPndhdmVpbi5meHdjID0gY3RsLT52YWxbMV0gJiAweGZmZmY7CisKKwkJCQlpZiAoIWNhcmQtPndhdmVpbi5meHdjKQorCQkJCQlyZXQgPSAtRUlOVkFMOworCisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX0dFVFJFQ1NSQzoKKwkJCWN0bC0+dmFsWzBdID0gY2FyZC0+d2F2ZWluLnJlY3NyYzsKKwkJCWN0bC0+dmFsWzFdID0gY2FyZC0+d2F2ZWluLmZ4d2M7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCisJCQkJcmV0ID0gLUVGQVVMVDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfR0VUVk9JQ0VQQVJBTToKKwkJCWN0bC0+dmFsWzBdID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMF07CisJCQljdGwtPnZhbFsxXSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzBdOworCisJCQljdGwtPnZhbFsyXSA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzFdOworCQkJY3RsLT52YWxbM10gPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVsxXTsKKworCQkJY3RsLT52YWxbNF0gPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1syXTsKKwkJCWN0bC0+dmFsWzVdID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMl07CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKKwkJCQlyZXQgPSAtRUZBVUxUOworCisJCQlicmVhazsKKworCQljYXNlIENNRF9TRVRWT0lDRVBBUkFNOgorCQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMF0gPSBjdGwtPnZhbFswXTsKKwkJCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzBdID0gY3RsLT52YWxbMV07CisKKwkJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzFdID0gY3RsLT52YWxbMl07CisJCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVsxXSA9IGN0bC0+dmFsWzNdOworCisJCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1syXSA9IGN0bC0+dmFsWzRdOworCQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMl0gPSBjdGwtPnZhbFs1XTsKKworCQkJYnJlYWs7CisJCQorCQljYXNlIENNRF9TRVRNQ0hfRlg6CisJCQljYXJkLT5tY2hhbm5lbF9meCA9IGN0bC0+dmFsWzBdICYgMHgwMDBmOworCQkJYnJlYWs7CisJCQorCQljYXNlIENNRF9HRVRQQVRDSDoKKwkJCWlmIChjdGwtPnZhbFswXSA9PSAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2FyZC0+bWdyLnJwYXRjaCwgc2l6ZW9mKHN0cnVjdCBkc3BfcnBhdGNoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlyZXQgPSAtRUZBVUxUOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGN0bC0+dmFsWzBdIC0gMSkgLyBQQVRDSEVTX1BFUl9QQUdFID49IGNhcmQtPm1nci5jdXJyZW50X3BhZ2VzKSB7CisJCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgUEFUQ0goJmNhcmQtPm1nciwgY3RsLT52YWxbMF0gLSAxKSwgc2l6ZW9mKHN0cnVjdCBkc3BfcGF0Y2gpKSkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfR0VUR1BSOgorCQkJaWQgPSBjdGwtPnZhbFswXTsKKworCQkJaWYgKGlkID4gTlVNX0dQUlMpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjYXJkLT5tZ3IuZ3ByW2lkXSwgc2l6ZW9mKHN0cnVjdCBkc3BfZ3ByKSkpCisJCQkJcmV0ID0gLUVGQVVMVDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfR0VUQ1RMR1BSOgorCQkJYWRkciA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCAoY2hhciAqKSBjdGwtPnZhbCwgJigoY2hhciAqKSBjdGwtPnZhbClbUEFUQ0hfTkFNRV9TSVpFXSk7CisJCQljdGwtPnZhbFswXSA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIGFkZHIsIDApOworCisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCisJCQkJcmV0ID0gLUVGQVVMVDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfU0VUUEFUQ0g6CisJCQlpZiAoY3RsLT52YWxbMF0gPT0gMCkKKwkJCQltZW1jcHkoJmNhcmQtPm1nci5ycGF0Y2gsICZjdGwtPnZhbFsxXSwgc2l6ZW9mKHN0cnVjdCBkc3BfcnBhdGNoKSk7CisJCQllbHNlIHsKKwkJCQlwYWdlID0gKGN0bC0+dmFsWzBdIC0gMSkgLyBQQVRDSEVTX1BFUl9QQUdFOworCQkJCWlmIChwYWdlID4gTUFYX1BBVENIRVNfUEFHRVMpIHsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKHBhZ2UgPj0gY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXMpIHsKKwkJCQkJZm9yIChpID0gY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXM7IGkgPCBwYWdlICsgMTsgaSsrKSB7CisJCQkJICAgICAgICAgICAgICAgIGNhcmQtPm1nci5wYXRjaFtpXSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQkJCQkJaWYoY2FyZC0+bWdyLnBhdGNoW2ldID09IE5VTEwpIHsKKwkJCQkJCQljYXJkLT5tZ3IuY3VycmVudF9wYWdlcyA9IGk7CisJCQkJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCW1lbXNldChjYXJkLT5tZ3IucGF0Y2hbaV0sIDAsIFBBR0VfU0laRSk7CisJCQkJCX0KKwkJCQkJY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXMgPSBwYWdlICsgMTsKKwkJCQl9CisKKwkJCQlwYXRjaCA9IFBBVENIKCZjYXJkLT5tZ3IsIGN0bC0+dmFsWzBdIC0gMSk7CisKKwkJCQltZW1jcHkocGF0Y2gsICZjdGwtPnZhbFsxXSwgc2l6ZW9mKHN0cnVjdCBkc3BfcGF0Y2gpKTsKKworCQkJCWlmIChwYXRjaC0+Y29kZV9zaXplID09IDApIHsKKwkJCQkJZm9yKGkgPSBwYWdlICsgMTsgaSA8IGNhcmQtPm1nci5jdXJyZW50X3BhZ2VzOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGNhcmQtPm1nci5wYXRjaFtpXSk7CisKKwkJCQkJY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXMgPSBwYWdlICsgMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENNRF9TRVRHUFI6CisJCQlpZiAoY3RsLT52YWxbMF0gPiBOVU1fR1BSUykgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW1lbWNweSgmY2FyZC0+bWdyLmdwcltjdGwtPnZhbFswXV0sICZjdGwtPnZhbFsxXSwgc2l6ZW9mKHN0cnVjdCBkc3BfZ3ByKSk7CisJCQlicmVhazsKKworCQljYXNlIENNRF9TRVRDVExHUFI6CisJCQlhZGRyID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIChjaGFyICopIGN0bC0+dmFsLCAoY2hhciAqKSBjdGwtPnZhbCArIFBBVENIX05BTUVfU0laRSk7CisJCQllbXUxMGsxX3NldF9jb250cm9sX2dwcihjYXJkLCBhZGRyLCAqKChzMzIgKikoKGNoYXIgKikgY3RsLT52YWwgKyAyICogUEFUQ0hfTkFNRV9TSVpFKSksIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfU0VUR1BPVVQ6CisJCQlpZiAoICgoY3RsLT52YWxbMF0gPiAyKSAmJiAoIWNhcmQtPmlzX2F1ZGlneSkpCisJCQkgICAgIHx8IChjdGwtPnZhbFswXSA+IDE1KSB8fCBjdGwtPnZhbFsxXSA+IDEpIHsKKwkJCQlyZXQ9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChjYXJkLT5pc19hdWRpZ3kpCisJCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAoMSA8PCAyNCkgfCAoKGN0bC0+dmFsWzBdKSA8PCAxNikgfCBBX0lPQ0ZHLCBjdGwtPnZhbFsxXSk7CisJCQllbHNlCisJCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAoMSA8PCAyNCkgfCAoKChjdGwtPnZhbFswXSkgKyAxMCkgPDwgMTYpIHwgSENGRywgY3RsLT52YWxbMV0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfR0VUR1BSMk9TUzoKKwkJCWlkID0gY3RsLT52YWxbMF07CisJCQljaCA9IGN0bC0+dmFsWzFdOworCisJCQlpZiAoaWQgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8IGNoID49IDIpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQljdGwtPnZhbFsyXSA9IGNhcmQtPm1nci5jdHJsX2dwcltpZF1bY2hdOworCisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCisJCQkJcmV0ID0gLUVGQVVMVDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfU0VUR1BSMk9TUzoKKwkJCWlkID0gY3RsLT52YWxbMF07CisJCQkvKiAwID09IGxlZnQsIDEgPT0gcmlnaHQgKi8KKwkJCWNoID0gY3RsLT52YWxbMV07CisJCQlhZGRyID0gY3RsLT52YWxbMl07CisKKwkJCWlmIChpZCA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgY2ggPj0gMikgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhcmQtPm1nci5jdHJsX2dwcltpZF1bY2hdID0gYWRkcjsKKworCQkJaWYgKGNhcmQtPmlzX2FwcykKKwkJCQlicmVhazsKKworCQkJaWYgKGFkZHIgPj0gMCkgeworCQkJCXVuc2lnbmVkIGludCBzdGF0ZSA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2lkXTsKKworCQkJCWlmIChjaCA9PSAxKSB7CisJCQkJCXN0YXRlID4+PSA4OworCQkJCQljYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzIHw9ICgxIDw8IGlkKTsKKwkJCQl9CisKKwkJCQljYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzIHw9ICgxIDw8IGlkKTsKKworCQkJCWlmIChpZCA9PSBTT1VORF9NSVhFUl9UUkVCTEUpIHsKKwkJCQkJc2V0X3RyZWJsZShjYXJkLCBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtpZF0gJiAweGZmLCAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaWRdID4+IDgpICYgMHhmZik7CisJCQkJfSBlbHNlIGlmIChpZCA9PSBTT1VORF9NSVhFUl9CQVNTKSB7CisJCQkJCXNldF9iYXNzKGNhcmQsIGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2lkXSAmIDB4ZmYsIChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtpZF0gPj4gOCkgJiAweGZmKTsKKwkJCQl9IGVsc2UKKwkJCQkJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCBhZGRyLCBzdGF0ZSAmIDB4ZmYsCisJCQkJCQkJICAgICAgIHZvbHVtZV9wYXJhbXNbaWRdKTsKKwkJCX0gZWxzZSB7CisJCQkJY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVycyAmPSB+KDEgPDwgaWQpOworCQkJCWNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnMgfD0gY2FyZC0+YWM5N19zdGVyZW9fbWl4ZXJzOworCisJCQkJaWYgKGNoID09IDApIHsKKwkJCQkJY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVycyAmPSB+KDEgPDwgaWQpOworCQkJCQljYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzIHw9IGNhcmQtPmFjOTdfc3VwcG9ydGVkX21peGVyczsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENNRF9TRVRQQVNTVEhST1VHSDoKKwkJCWNhcmQtPnB0LnNlbGVjdGVkID0gY3RsLT52YWxbMF0gPyAxIDogMDsKKwkJCWlmIChjYXJkLT5wdC5zdGF0ZSAhPSBQVF9TVEFURV9JTkFDVElWRSkKKwkJCQlicmVhazsKKworCQkJY2FyZC0+cHQuc3Bjc190b191c2UgPSBjdGwtPnZhbFswXSAmIDB4MDc7CisJCQlicmVhazsKKworCQljYXNlIENNRF9QUklWQVRFM19WRVJTSU9OOgorCQkJY3RsLT52YWxbMF0gPSBQUklWQVRFM19WRVJTSU9OOwkvL3ByaXZhdGUzIHZlcnNpb24KKwkJCWN0bC0+dmFsWzFdID0gTUFKT1JfVkVSOwkvL21ham9yIGRyaXZlciB2ZXJzaW9uCisJCQljdGwtPnZhbFsyXSA9IE1JTk9SX1ZFUjsJLy9taW5vciBkcml2ZXIgdmVyc2lvbgorCQkJY3RsLT52YWxbM10gPSBjYXJkLT5pc19hdWRpZ3k7CS8vMT1jYXJkIGlzIGF1ZGlneQorCisJCQlpZiAoY2FyZC0+aXNfYXVkaWd5KQorCQkJCWN0bC0+dmFsWzRdPWVtdTEwazFfcmVhZGZuMChjYXJkLCAweDE4KTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKworCQljYXNlIENNRF9BQzk3X0JPT1NUOgorCQkJaWYgKGN0bC0+dmFsWzBdKQorCQkJCWVtdTEwazFfYWM5N193cml0ZShjYXJkLT5hYzk3LCAweDE4LCAweDApOwkKKwkJCWVsc2UKKwkJCQllbXUxMGsxX2FjOTdfd3JpdGUoY2FyZC0+YWM5NywgMHgxOCwgMHgwODA4KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJa2ZyZWUoY3RsKTsKKwkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1BSSVZBVEU0OgorCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2l6ZSwgYXJncCwgc2l6ZW9mKHNpemUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURQRCgyLCAiRXh0ZXJuYWwgdHJhbSBzaXplICUjeFxuIiwgc2l6ZSk7CisKKwkJaWYgKHNpemUgPiAweDFmZmZmZikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNpemVfcmVnID0gMDsKKworCQlpZiAoc2l6ZSAhPSAwKSB7CisJCQlzaXplID0gKHNpemUgLSAxKSA+PiAxNDsKKworCQkJd2hpbGUgKHNpemUpIHsKKwkJCQlzaXplID4+PSAxOworCQkJCXNpemVfcmVnKys7CisJCQl9CisKKwkJCXNpemUgPSAweDQwMDAgPDwgc2l6ZV9yZWc7CisJCX0KKworCQlEUEQoMiwgIkV4dGVybmFsIHRyYW0gc2l6ZSAlI3ggJSN4XG4iLCBzaXplLCBzaXplX3JlZyk7CisKKwkJaWYgKHNpemUgIT0gY2FyZC0+dGFua21lbS5zaXplKSB7CisJCQlpZiAoY2FyZC0+dGFua21lbS5zaXplID4gMCkgeworCQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGR19MT0NLVEFOS0NBQ0hFLCAxKTsKKworCQkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwgVENCLCAwLCBUQ0JTLCAwLCBUQUdMSVNUX0VORCk7CisKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnRhbmttZW0uc2l6ZSwgY2FyZC0+dGFua21lbS5hZGRyLCBjYXJkLT50YW5rbWVtLmRtYV9oYW5kbGUpOworCisJCQkJY2FyZC0+dGFua21lbS5zaXplID0gMDsKKwkJCX0KKworCQkJaWYgKHNpemUgIT0gMCkgeworCQkJCWNhcmQtPnRhbmttZW0uYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIHNpemUsICZjYXJkLT50YW5rbWVtLmRtYV9oYW5kbGUpOworCQkJCWlmIChjYXJkLT50YW5rbWVtLmFkZHIgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCQljYXJkLT50YW5rbWVtLnNpemUgPSBzaXplOworCisJCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLCBUQ0IsICh1MzIpIGNhcmQtPnRhbmttZW0uZG1hX2hhbmRsZSwgVENCUywodTMyKSBzaXplX3JlZywgVEFHTElTVF9FTkQpOworCisJCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHX0xPQ0tUQU5LQ0FDSEUsIDApOworCQkJfQorCQl9CisJCXJldHVybiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGVtdTEwazFfZHNwX21peGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBvc3NfbWl4ZXIsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBsZWZ0LCByaWdodDsKKwlpbnQgdmFsOworCWludCBzY2FsZTsKKworCWNhcmQtPmFjOTctPm1vZGNudCsrOworCisJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIGNsZWFuc2UgaW5wdXQgYSBsaXR0bGUgKi8KKwlyaWdodCA9ICgodmFsID4+IDgpICAmIDB4ZmYpOworCWxlZnQgPSAodmFsICAmIDB4ZmYpOworCisJaWYgKHJpZ2h0ID4gMTAwKSByaWdodCA9IDEwMDsKKwlpZiAobGVmdCA+IDEwMCkgbGVmdCA9IDEwMDsKKworCWNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19taXhlcl0gPSAocmlnaHQgPDwgOCkgfCBsZWZ0OworCWlmIChvc3NfbWl4ZXIgPT0gU09VTkRfTUlYRVJfVFJFQkxFKSB7CisJCXNldF90cmVibGUoY2FyZCwgbGVmdCwgcmlnaHQpOworCQlyZXR1cm4gMDsKKwl9IGlmIChvc3NfbWl4ZXIgPT0gU09VTkRfTUlYRVJfQkFTUykgeworCQlzZXRfYmFzcyhjYXJkLCBsZWZ0LCByaWdodCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChvc3NfbWl4ZXIgPT0gU09VTkRfTUlYRVJfVk9MVU1FKQorCQlzY2FsZSA9IDEgPDwgY2FyZC0+YWM5Ny0+Yml0X3Jlc29sdXRpb247CisJZWxzZQorCQlzY2FsZSA9IHZvbHVtZV9wYXJhbXNbb3NzX21peGVyXTsKKworCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgY2FyZC0+bWdyLmN0cmxfZ3ByW29zc19taXhlcl1bMF0sIGxlZnQsIHNjYWxlKTsKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIGNhcmQtPm1nci5jdHJsX2dwcltvc3NfbWl4ZXJdWzFdLCByaWdodCwgc2NhbGUpOworCisJaWYgKGNhcmQtPmFjOTdfc3VwcG9ydGVkX21peGVycyAmICgxIDw8IG9zc19taXhlcikpCisJCWNhcmQtPmFjOTctPndyaXRlX21peGVyKGNhcmQtPmFjOTcsIG9zc19taXhlciwgbGVmdCwgcmlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW11MTBrMV9taXhlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBvc3NfbWl4ZXIgPSBfSU9DX05SKGNtZCk7CisJCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoIWNhcmQtPmlzX2FwcykgeworCQlpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKKwkJCW1peGVyX2luZm8gaW5mbzsKKworCQkJc3RybGNweShpbmZvLmlkLCBjYXJkLT5hYzk3LT5uYW1lLCBzaXplb2YoaW5mby5pZCkpOworCisJCQlpZiAoY2FyZC0+aXNfYXVkaWd5KQorCQkJCXN0cmxjcHkoaW5mby5uYW1lLCAiQXVkaWd5IC0gRW11MTBrMSIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJCWVsc2UKKwkJCQlzdHJsY3B5KGluZm8ubmFtZSwgIkNyZWF0aXZlIFNCTGl2ZSAtIEVtdTEwazEiLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCQkJCisJCQlpbmZvLm1vZGlmeV9jb3VudGVyID0gY2FyZC0+YWM5Ny0+bW9kY250OworCisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKChfU0lPQ19ESVIoY21kKSA9PSAoX1NJT0NfV1JJVEV8X1NJT0NfUkVBRCkpICYmIG9zc19taXhlciA8PSBTT1VORF9NSVhFUl9OUkRFVklDRVMpCisJCQlyZXQgPSBlbXUxMGsxX2RzcF9taXhlcihjYXJkLCBvc3NfbWl4ZXIsIGFyZyk7CisJCWVsc2UKKwkJCXJldCA9IGNhcmQtPmFjOTctPm1peGVyX2lvY3RsKGNhcmQtPmFjOTcsIGNtZCwgYXJnKTsKKwl9CisJCisJaWYgKHJldCA8IDApCisJCXJldCA9IGVtdTEwazFfcHJpdmF0ZV9taXhlcihjYXJkLCBjbWQsIGFyZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVtdTEwazFfbWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJRFBGKDQsICJlbXUxMGsxX21peGVyX29wZW4oKVxuIik7CisKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmZW11MTBrMV9kZXZzKSB7CisJCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11MTBrMV9jYXJkLCBsaXN0KTsKKworCQlpZiAoY2FyZC0+YWM5Ny0+ZGV2X21peGVyID09IG1pbm9yKQorCQkJZ290byBtYXRjaDsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgbWF0Y2g6CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbXUxMGsxX21peGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJRFBGKDQsICJlbXUxMGsxX21peGVyX3JlbGVhc2UoKVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gZW11MTBrMV9taXhlcl9pb2N0bCwKKwkub3BlbgkJPSBlbXUxMGsxX21peGVyX29wZW4sCisJLnJlbGVhc2UJPSBlbXUxMGsxX21peGVyX3JlbGVhc2UsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guYyBiL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5NGJlNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmMKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIHBhc3N0aHJvdWdoLmMgLS0gRW11MTBrMSBkaWdpdGFsIHBhc3N0aHJvdWdoCisgKiAgICAgQ29weXJpZ2h0IChDKSAyMDAxICBKdWhhIFlyavZs5CA8anlyam9sYUBjYy5odXQuZmk+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBNYXkgMTUsIDIwMDEJICAgIEp1aGEgWXJq9mzkCSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgImNhcmR3by5oIgorI2luY2x1ZGUgImNhcmR3aS5oIgorI2luY2x1ZGUgInJlY21nci5oIgorI2luY2x1ZGUgImlycW1nci5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiODAxMC5oIgorCitzdGF0aWMgdm9pZCBwdF9wdXRzYW1wbGVzKHN0cnVjdCBwdF9kYXRhICpwdCwgdTE2ICpwdHIsIHUxNiBsZWZ0LCB1MTYgcmlnaHQpCit7CisJdW5zaWduZWQgaW50IGlkeDsKKworCXB0cltwdC0+Y29weXB0cl0gPSBsZWZ0OworCWlkeCA9IHB0LT5jb3B5cHRyICsgUFRfU0FNUExFUy8yOworCWlkeCAlPSBQVF9TQU1QTEVTOworCXB0cltpZHhdID0gcmlnaHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB0X2Nhbl93cml0ZShzdHJ1Y3QgcHRfZGF0YSAqcHQpCit7CisJcmV0dXJuIHB0LT5ibG9ja3NfY29waWVkIDwgcHQtPmJsb2Nrc19wbGF5ZWQgKyA4OworfQorCitzdGF0aWMgaW50IHB0X3dhaXRfZm9yX3dyaXRlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVkZXYsIGludCBub25ibG9jaykKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZWRldi0+Y2FyZDsKKwlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7CisKKwlpZiAobm9uYmxvY2sgJiYgIXB0X2Nhbl93cml0ZShwdCkpCisJCXJldHVybiAtRUFHQUlOOworCXdoaWxlICghcHRfY2FuX3dyaXRlKHB0KSAmJiBwdC0+c3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpIHsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcHQtPndhaXQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlpZiAocHQtPnN0YXRlID09IFBUX1NUQVRFX0lOQUNUSVZFKQorCQlyZXR1cm4gLUVBR0FJTjsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdF9wdXRibG9jayhzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiwgdTE2ICpibG9jaywgaW50IG5vbmJsb2NrKQoreworCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZjYXJkLT5wdDsKKwl1MTYgKnB0ciA9ICh1MTYgKikgY2FyZC0+dGFua21lbS5hZGRyOworCWludCBpID0gMCwgcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJciA9IHB0X3dhaXRfZm9yX3dyaXRlKHdhdmVfZGV2LCBub25ibG9jayk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+cHQubG9jaywgZmxhZ3MpOworCXdoaWxlIChpIDwgUFRfQkxPQ0tTQU1QTEVTKSB7CisJCXB0X3B1dHNhbXBsZXMocHQsIHB0ciwgYmxvY2tbMippXSwgYmxvY2tbMippKzFdKTsKKwkJaWYgKHB0LT5jb3B5cHRyID09IDApCisJCQlwdC0+Y29weXB0ciA9IFBUX1NBTVBMRVM7CisJCXB0LT5jb3B5cHRyLS07CisJCWkrKzsKKwl9CisJd29pbnN0LT50b3RhbF9jb3BpZWQgKz0gUFRfQkxPQ0tTSVpFOworCXB0LT5ibG9ja3NfY29waWVkKys7CisJaWYgKHB0LT5ibG9ja3NfY29waWVkID49IDQgJiYgcHQtPnN0YXRlICE9IFBUX1NUQVRFX1BMQVlJTkcpIHsKKwkJRFBGKDIsICJhY3RpdmF0aW5nIGRpZ2l0YWwgcGFzcy10aHJvdWdoIHBsYXliYWNrXG4iKTsKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEdQUl9CQVNFICsgcHQtPmVuYWJsZV9ncHIsIDAsIDEpOworCQlwdC0+c3RhdGUgPSBQVF9TVEFURV9QTEFZSU5HOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5wdC5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBlbXUxMGsxX3B0X3NldHVwKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQoreworCXUzMiBiaXRzOworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKKwlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXB0LT5vbGRfc3Bjc1tpXSA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIFNQQ1MwICsgaSwgMCk7CisJCWlmIChwdC0+c3Bjc190b191c2UgJiAoMSA8PCBpKSkgeworCQkJRFBEKDIsICJ1c2luZyBTL1BESUYgcG9ydCAlZFxuIiwgaSk7CisJCQliaXRzID0gU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCBTUENTX1NBTVBMRVJBVEVfNDggfAorCQkJCVNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwKKwkJCQkweDAwMDAxMjAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQ7CisJCQlpZiAocHQtPmFjM2RhdGEpCisJCQkJYml0cyB8PSBTUENTX05PVEFVRElPREFUQTsKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBTUENTMCArIGksIDAsIGJpdHMpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzc2l6ZV90IGVtdTEwazFfcHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7CisJc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OworCWludCBub25ibG9jaywgaSwgciwgYmxvY2tzLCBibG9ja3NfY29waWVkLCBieXRlc19jb3BpZWQgPSAwOworCisJRFBEKDMsICJlbXUxMGsxX3B0X3dyaXRlKCk6ICVkIGJ5dGVzXG4iLCBjb3VudCk7CisJCisJbm9uYmxvY2sgPSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSzsKKwkKKwlpZiAoY2FyZC0+dGFua21lbS5zaXplIDwgUFRfU0FNUExFUyoyKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocHQtPnN0YXRlID09IFBUX1NUQVRFX0lOQUNUSVZFKSB7CisJCURQRigyLCAiYnVmcHRyIGluaXRcbiIpOworCQlwdC0+cGxheXB0ciA9IFBUX1NBTVBMRVMtMTsKKwkJcHQtPmNvcHlwdHIgPSBQVF9JTklUUFRSOworCQlwdC0+YmxvY2tzX3BsYXllZCA9IHB0LT5ibG9ja3NfY29waWVkID0gMDsKKwkJbWVtc2V0KGNhcmQtPnRhbmttZW0uYWRkciwgMCwgY2FyZC0+dGFua21lbS5zaXplKTsKKwkJcHQtPnN0YXRlID0gUFRfU1RBVEVfQUNUSVZBVEVEOworCQlwdC0+YnVmID0ga21hbGxvYyhQVF9CTE9DS1NJWkUsIEdGUF9LRVJORUwpOworCQlwdC0+cHJlcGVuZF9zaXplID0gMDsKKwkJaWYgKHB0LT5idWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQllbXUxMGsxX3B0X3NldHVwKHdhdmVfZGV2KTsKKwl9CisJaWYgKHB0LT5wcmVwZW5kX3NpemUpIHsKKwkJaW50IG5lZWRlZCA9IFBUX0JMT0NLU0laRSAtIHB0LT5wcmVwZW5kX3NpemU7CisKKwkJRFBEKDMsICJwcmVwZW5kIHNpemUgJWQsIHByZXBlbmRpbmcgJWQgYnl0ZXNcbiIsIHB0LT5wcmVwZW5kX3NpemUsIG5lZWRlZCk7CisJCWlmIChjb3VudCA8IG5lZWRlZCkgeworCQkJY29weV9mcm9tX3VzZXIocHQtPmJ1ZiArIHB0LT5wcmVwZW5kX3NpemUsIGJ1ZmZlciwgY291bnQpOworCQkJcHQtPnByZXBlbmRfc2l6ZSArPSBjb3VudDsKKwkJCURQRCgzLCAicHJlcGVuZCBzaXplIG5vdyAlZFxuIiwgcHQtPnByZXBlbmRfc2l6ZSk7CisJCQlyZXR1cm4gY291bnQ7CisJCX0KKwkJY29weV9mcm9tX3VzZXIocHQtPmJ1ZiArIHB0LT5wcmVwZW5kX3NpemUsIGJ1ZmZlciwgbmVlZGVkKTsKKwkJciA9IHB0X3B1dGJsb2NrKHdhdmVfZGV2LCAodTE2ICopIHB0LT5idWYsIG5vbmJsb2NrKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwkJYnl0ZXNfY29waWVkICs9IG5lZWRlZDsKKwkJcHQtPnByZXBlbmRfc2l6ZSA9IDA7CisJfQorCWJsb2NrcyA9IChjb3VudC1ieXRlc19jb3BpZWQpL1BUX0JMT0NLU0laRTsKKwlibG9ja3NfY29waWVkID0gMDsKKwl3aGlsZSAoYmxvY2tzID4gMCkgeworCQl1MTYgX191c2VyICpidWZwdHIgPSAodTE2IF9fdXNlciAqKSBidWZmZXIgKyAoYnl0ZXNfY29waWVkLzIpOworCQljb3B5X2Zyb21fdXNlcihwdC0+YnVmLCBidWZwdHIsIFBUX0JMT0NLU0laRSk7CisJCXIgPSBwdF9wdXRibG9jayh3YXZlX2RldiwgKHUxNiAqKXB0LT5idWYsIG5vbmJsb2NrKTsKKwkJaWYgKHIpIHsKKwkJCWlmIChieXRlc19jb3BpZWQpCisJCQkJcmV0dXJuIGJ5dGVzX2NvcGllZDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gcjsKKwkJfQorCQlieXRlc19jb3BpZWQgKz0gUFRfQkxPQ0tTSVpFOworCQlibG9ja3MtLTsKKwkJYmxvY2tzX2NvcGllZCsrOworCX0KKwlpID0gY291bnQgLSBieXRlc19jb3BpZWQ7CisJaWYgKGkpIHsKKwkJcHQtPnByZXBlbmRfc2l6ZSA9IGk7CisJCWNvcHlfZnJvbV91c2VyKHB0LT5idWYsIGJ1ZmZlciArIGJ5dGVzX2NvcGllZCwgaSk7CisJCWJ5dGVzX2NvcGllZCArPSBpOworCQlEUEQoMywgImZpbGxpbmcgcHJlcGVuZCBidWZmZXIgd2l0aCAlZCBieXRlcyIsIGkpOworCX0KKwlyZXR1cm4gYnl0ZXNfY29waWVkOworfQorCit2b2lkIGVtdTEwazFfcHRfc3RvcChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZjYXJkLT5wdDsKKwlpbnQgaTsKKworCWlmIChwdC0+c3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpIHsKKwkJRFBGKDIsICJkaWdpdGFsIHBhc3MtdGhyb3VnaCBzdG9wcGVkXG4iKTsKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIChjYXJkLT5pc19hdWRpZ3kgPyBBX0dQUl9CQVNFIDogR1BSX0JBU0UpICsgcHQtPmVuYWJsZV9ncHIsIDAsIDApOworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHQtPnNwY3NfdG9fdXNlICYgKDEgPDwgaSkpCisJCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFNQQ1MwICsgaSwgMCwgcHQtPm9sZF9zcGNzW2ldKTsKKwkJfQorCQlwdC0+c3RhdGUgPSBQVF9TVEFURV9JTkFDVElWRTsKKwkJaWYocHQtPmJ1ZikKKwkJCWtmcmVlKHB0LT5idWYpOworCX0KK30KKwordm9pZCBlbXUxMGsxX3B0X3dhdmVvdXRfdXBkYXRlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQoreworCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7CisJc3RydWN0IHB0X2RhdGEgKnB0ID0gJndhdmVfZGV2LT5jYXJkLT5wdDsKKwl1MzIgcG9zOworCisJaWYgKHB0LT5zdGF0ZSA9PSBQVF9TVEFURV9QTEFZSU5HICYmIHB0LT5wb3NfZ3ByID49IDApIHsKKwkJcG9zID0gc2JsaXZlX3JlYWRwdHIod2F2ZV9kZXYtPmNhcmQsIEdQUl9CQVNFICsgcHQtPnBvc19ncHIsIDApOworCQlpZiAocG9zID4gUFRfQkxPQ0tTQU1QTEVTKQorCQkJcG9zID0gUFRfQkxPQ0tTQU1QTEVTOworCQlwb3MgPSA0ICogKFBUX0JMT0NLU0FNUExFUyAtIHBvcyk7CisJfSBlbHNlCisJCXBvcyA9IDA7CisJd29pbnN0LT50b3RhbF9wbGF5ZWQgPSBwdC0+YmxvY2tzX3BsYXllZCAqIHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgKyBwb3M7CisJd29pbnN0LT5idWZmZXIuaHdfcG9zID0gcG9zOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guaCBiL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwY2M5NwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgcGFzc3Rocm91Z2guaCAtLSBFbXUxMGsxIGRpZ2l0YWwgcGFzc3Rocm91Z2ggaGVhZGVyIGZpbGUKKyAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEp1aGEgWXJq9mzkIDxqeXJqb2xhQGNjLmh1dC5maT4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE1heSAxNSwgMjAwMQkgICAgSnVoYSBZcmr2bOQgICAgIGJhc2UgY29kZSByZWxlYXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9QQVNTVEhST1VHSF9ICisjZGVmaW5lIF9QQVNTVEhST1VHSF9ICisKKyNpbmNsdWRlICJhdWRpby5oIgorCisvKiBudW1iZXIgb2YgMTYtYml0IHN0ZXJlbyBzYW1wbGVzIGluIFhUUkFNIGJ1ZmZlciAqLworI2RlZmluZSBQVF9TQU1QTEVTIDB4ODAwMAorI2RlZmluZSBQVF9CTE9DS1NBTVBMRVMgMHg0MDAKKyNkZWZpbmUgUFRfQkxPQ0tTSVpFIChQVF9CTE9DS1NBTVBMRVMqNCkKKyNkZWZpbmUgUFRfQkxPQ0tTSVpFX0xPRzIgMTIKKyNkZWZpbmUgUFRfQkxPQ0tDT1VOVCAoUFRfU0FNUExFUy9QVF9CTE9DS1NBTVBMRVMpCisjZGVmaW5lIFBUX0lOSVRQVFIgKFBUX1NBTVBMRVMvMi0xKQorCisjZGVmaW5lIFBUX1NUQVRFX0lOQUNUSVZFIDAKKyNkZWZpbmUgUFRfU1RBVEVfQUNUSVZBVEVEIDEKKyNkZWZpbmUgUFRfU1RBVEVfUExBWUlORyAyCisKKy8qIHBhc3N0aHJvdWdoIHN0cnVjdCAqLworc3RydWN0IHB0X2RhdGEKK3sKKwl1OAlzZWxlY3RlZCwgc3RhdGUsIHNwY3NfdG9fdXNlOworCWludAlpbnRyX2dwciwgZW5hYmxlX2dwciwgcG9zX2dwcjsKKwl1MzIJYmxvY2tzX3BsYXllZCwgYmxvY2tzX2NvcGllZCwgb2xkX3NwY3NbM107CisJdTMyCXBsYXlwdHIsIGNvcHlwdHI7CisJdTMyCXByZXBlbmRfc2l6ZTsKKwl1OAkqYnVmOworCXU4CWFjM2RhdGE7CisKKwljaGFyCSpwYXRjaF9uYW1lLCAqaW50cl9ncHJfbmFtZSwgKmVuYWJsZV9ncHJfbmFtZSwgKnBvc19ncHJfbmFtZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworLyoKKyAgUGFzc3Rocm91Z2ggY2FuIGJlIGRvbmUgaW4gdHdvIG1ldGhvZHM6CisKKyAgTWV0aG9kIDEgOiB0cmFtCisgICAgIEluIG9yaWdpbmFsIGVtdTEwazEsIHdlIGNvdWxkbid0IGJ5cGFzcyB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVycy4gRXZlbiBhdCA0OGtIegorICAgICAodGhlIGludGVybmFsIHNhbXBsZSByYXRlIG9mIHRoZSBlbXUxMGsxKSB0aGUgc2FtcGxlcyB3b3VsZCBnZXQgbWVzc2VkIHVwLgorICAgICBUbyBvdmVyIGNvbWUgdGhpcywgc2FtcGxlcyBhcmUgY29waWVkIGludG8gdGhlIHRyYW0gYW5kIGEgc3BlY2lhbCBkc3AgcGF0Y2ggY29waWVzCisgICAgIHRoZSBzYW1wbGVzIG91dCBhbmQgZ2VuZXJhdGVzIGludGVycnVwdHMgd2hlbiBhIGJsb2NrIGhhcyBmaW5uaXNoZWQgcGxheWluZy4KKworICBNZXRob2QgMiA6IEludGVycG9sYXRvciBieXBhc3MKKworICAgICBDcmVhdGl2ZSBmaXhlZCB0aGUgc2FtcGxlIHJhdGUgY29udmVydCBwcm9ibGVtIGluIGVtdTEwazEgcmV2IDcgYW5kIGhpZ2hlcgorICAgICAoaW5jbHVkaW5nIHRoZSBlbXUxMGsyIChhdWRpZ3kpKS4gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIHRoZSByZWd1bGFyLCBhbmQgbXVjaCBzaW1wbGVyCisgICAgIHBsYXliYWNrIG1ldGhvZC4gCisKKworICBJbiBib3RoIG1ldGhvZHMsIGRzcCBjb2RlIGlzIHVzZWQgdG8gbXV4IGF1ZGlvIGFuZCBwYXNzdGhyb3VnaC4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHNwZGlmCisgIGRvZXNuJ3QgcmVjZWl2ZSBhdWRpbyBhbmQgcGFzdGhyb3VnaCBkYXRhIGF0IHRoZSBzYW1lIHRpbWUuIFRoZSBzcGRpZiBmbGFnIFNQQ1NfTk9UQVVESU9EQVRBCisgIGlzIHNldCB0byB0ZWxsIAorCisgKi8KKworLy8gZW11MTBrMSByZXZzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA3IGNhbiB1c2UgbWV0aG9kMgorCisjZGVmaW5lIFVTRV9QVF9NRVRIT0QyICAoY2FyZC0+aXNfYXVkaWd5KQorI2RlZmluZSBVU0VfUFRfTUVUSE9EMQkhVVNFX1BUX01FVEhPRDIKKworc3NpemVfdCBlbXUxMGsxX3B0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpOworCitpbnQgZW11MTBrMV9wdF9zZXR1cChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2Rldik7Cit2b2lkIGVtdTEwazFfcHRfc3RvcChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKTsKK3ZvaWQgZW11MTBrMV9wdF93YXZlb3V0X3VwZGF0ZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2Rldik7CisKKyNlbmRpZiAvKiBfUEFTU1RIUk9VR0hfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvcmVjbWdyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2MzZmQwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvcmVjbWdyLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIHJlY21nci5jIC0tIFJlY29yZGluZyBtYW5hZ2VyIGZvciBlbXUxMGsxIGRyaXZlcgorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgIjgwMTAuaCIKKyNpbmNsdWRlICJyZWNtZ3IuaCIKKwordm9pZCBlbXUxMGsxX3Jlc2V0X3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQoreworCURQRigyLCAiZW11MTBrMV9yZXNldF9yZWNvcmQoKVxuIik7CisKKwlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgYnVmZmVyLT5zaXplcmVnLCAwLCBBRENCU19CVUZTSVpFX05PTkUpOworCisJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIGJ1ZmZlci0+c2l6ZXJlZywgMCwgYnVmZmVyLT5zaXplcmVndmFsKTsJCisKKwl3aGlsZSAoc2JsaXZlX3JlYWRwdHIoY2FyZCwgYnVmZmVyLT5pZHhyZWcsIDApKQorCQl1ZGVsYXkoNSk7Cit9CisKK3ZvaWQgZW11MTBrMV9zdGFydF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcikKK3sKKwlEUEYoMiwgImVtdTEwazFfc3RhcnRfcmVjb3JkKClcbiIpOworCisJaWYgKGJ1ZmZlci0+YWRjY3RsKQorCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQURDQ1IsIDAsIGJ1ZmZlci0+YWRjY3RsKTsKK30KKwordm9pZCBlbXUxMGsxX3N0b3BfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpCit7CisJRFBGKDIsICJlbXUxMGsxX3N0b3BfcmVjb3JkKClcbiIpOworCisJLyogRGlzYWJsZSByZWNvcmQgdHJhbnNmZXIgKi8KKwlpZiAoYnVmZmVyLT5hZGNjdGwpCisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBRENDUiwgMCwgMCk7Cit9CisKK3ZvaWQgZW11MTBrMV9zZXRfcmVjb3JkX3NyYyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QpCit7CisJc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlciA9ICZ3aWluc3QtPmJ1ZmZlcjsKKworCURQRigyLCAiZW11MTBrMV9zZXRfcmVjb3JkX3NyYygpXG4iKTsKKworCXN3aXRjaCAod2lpbnN0LT5yZWNzcmMpIHsKKworCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgorCQlEUEYoMiwgInJlY29yZGluZyBzb3VyY2U6IEFDOTdcbiIpOworCQlidWZmZXItPnNpemVyZWcgPSBBRENCUzsKKwkJYnVmZmVyLT5hZGRycmVnID0gQURDQkE7CisJCWJ1ZmZlci0+aWR4cmVnID0gY2FyZC0+aXNfYXVkaWd5ID8gQV9BRENJRFhfSURYIDogQURDSURYX0lEWDsKKworCQlzd2l0Y2ggKHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSkgeworCQljYXNlIDB4QkI4MDoKKwkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV80ODsKKwkJCWJyZWFrOworCQljYXNlIDB4QUM0NDoKKwkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV80NDsKKwkJCWJyZWFrOworCQljYXNlIDB4N0QwMDoKKwkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV8zMjsKKwkJCWJyZWFrOworCQljYXNlIDB4NURDMDoKKwkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV8yNDsKKwkJCWJyZWFrOworCQljYXNlIDB4NTYyMjoKKwkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV8yMjsKKwkJCWJyZWFrOworCQljYXNlIDB4M0U4MDoKKwkJCWJ1ZmZlci0+YWRjY3RsID0gQURDQ1JfU0FNUExFUkFURV8xNjsKKwkJCWJyZWFrOworCQkvLyBGSVhNRTogYXVkaWd5IHN1cHBvcnRzIDEya0h6IHJlY29yZGluZworCQkvKgorCQljYXNlID8/Pz86CisJCQlidWZmZXItPmFkY2N0bCA9IEFfQURDQ1JfU0FNUExFUkFURV8xMjsKKwkJCWJyZWFrOworCQkqLworCQljYXNlIDB4MkIxMToKKwkJCWJ1ZmZlci0+YWRjY3RsID0gY2FyZC0+aXNfYXVkaWd5ID8gQV9BRENDUl9TQU1QTEVSQVRFXzExIDogQURDQ1JfU0FNUExFUkFURV8xMTsKKwkJCWJyZWFrOworCQljYXNlIDB4MUY0MDoKKwkJCWJ1ZmZlci0+YWRjY3RsID0gY2FyZC0+aXNfYXVkaWd5ID8gQV9BRENDUl9TQU1QTEVSQVRFXzggOiBBRENDUl9TQU1QTEVSQVRFXzg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQkJYnJlYWs7CisJCX0KKworCQlidWZmZXItPmFkY2N0bCB8PSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0NSX0xDSEFORU5BQkxFIDogQURDQ1JfTENIQU5FTkFCTEU7CisKKwkJaWYgKHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID09IDIpCisJCQlidWZmZXItPmFkY2N0bCB8PSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0NSX1JDSEFORU5BQkxFIDogQURDQ1JfUkNIQU5FTkFCTEU7CisKKwkJYnJlYWs7CisKKwljYXNlIFdBVkVSRUNPUkRfTUlDOgorCQlEUEYoMiwgInJlY29yZGluZyBzb3VyY2U6IE1JQ1xuIik7CisJCWJ1ZmZlci0+c2l6ZXJlZyA9IE1JQ0JTOworCQlidWZmZXItPmFkZHJyZWcgPSBNSUNCQTsKKwkJYnVmZmVyLT5pZHhyZWcgPSBNSUNJRFhfSURYOworCQlidWZmZXItPmFkY2N0bCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBXQVZFUkVDT1JEX0ZYOgorCQlEUEYoMiwgInJlY29yZGluZyBzb3VyY2U6IEZYXG4iKTsKKwkJYnVmZmVyLT5zaXplcmVnID0gRlhCUzsKKwkJYnVmZmVyLT5hZGRycmVnID0gRlhCQTsKKwkJYnVmZmVyLT5pZHhyZWcgPSBGWElEWF9JRFg7CisJCWJ1ZmZlci0+YWRjY3RsID0gMDsKKworCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgRlhXQywgMCwgd2lpbnN0LT5meHdjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCURQRCgyLCAiYnVzIGFkZHg6ICUjbHhcbiIsICh1bnNpZ25lZCBsb25nKSBidWZmZXItPmRtYV9oYW5kbGUpOworCisJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIGJ1ZmZlci0+YWRkcnJlZywgMCwgKHUzMilidWZmZXItPmRtYV9oYW5kbGUpOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvcmVjbWdyLmggYi9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjg3NjZhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvcmVjbWdyLmgKQEAgLTAsMCArMSw0OCBAQAorLyogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICByZWNtZ3IuaAorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAorICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKKyAqICAgICBVU0EuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqLworCisjaWZuZGVmIF9SRUNPUkRNR1JfSAorI2RlZmluZSBfUkVDT1JETUdSX0gKKworI2luY2x1ZGUgImh3YWNjZXNzLmgiCisjaW5jbHVkZSAiY2FyZHdpLmgiCisKKy8qIFJlY29yZGluZyByZXNvdXJjZXMgKi8KKyNkZWZpbmUgV0FWRVJFQ09SRF9BQzk3CQkweDAxCisjZGVmaW5lIFdBVkVSRUNPUkRfTUlDCQkweDAyCisjZGVmaW5lIFdBVkVSRUNPUkRfRlgJCTB4MDMKKwordm9pZCBlbXUxMGsxX3Jlc2V0X3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKTsKK3ZvaWQgZW11MTBrMV9zdGFydF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqKTsKK3ZvaWQgZW11MTBrMV9zdG9wX3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB3YXZlaW5fYnVmZmVyICopOwordm9pZCBlbXUxMGsxX3NldF9yZWNvcmRfc3JjKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHdpaW5zdCAqd2lpbnN0KTsKKworI2VuZGlmIC8qIF9SRUNPUkRNR1JfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvdGltZXIuYyBiL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwZDMwNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmMKQEAgLTAsMCArMSwxNzYgQEAKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgdGltZXIuYworICogICAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBpbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiAzLzYvMjAwMAlJbXByb3ZlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgdGltZXIgZGVsYXlzICBSdWkgU291c2EgKi8KKworLyogNC8zLzIwMDAJSW1wbGVtZW50ZWQgdGltZXIgbGlzdCB1c2luZyBsaXN0LmggCSAgICAgUnVpIFNvdXNhICovCisKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgIjgwMTAuaCIKKyNpbmNsdWRlICJpcnFtZ3IuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorCisvKiBUcnkgdG8gc2NoZWR1bGUgb25seSBvbmNlIHBlciBmcmFnbWVudCAqLworCit2b2lkIGVtdTEwazFfdGltZXJfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXN0cnVjdCBlbXVfdGltZXIgKnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisKKwlzcGluX2xvY2soJmNhcmQtPnRpbWVyX2xvY2spOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNhcmQtPnRpbWVycykgeworCQl0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdV90aW1lciwgbGlzdCk7CisKKwkJaWYgKHQtPnN0YXRlICYgVElNRVJfU1RBVEVfQUNUSVZFKSB7CisJCQl0LT5jb3VudCsrOworCQkJaWYgKHQtPmNvdW50ID09IHQtPmNvdW50X21heCkgeworCQkJCXQtPmNvdW50ID0gMDsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZ0LT50YXNrbGV0KTsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZjYXJkLT50aW1lcl9sb2NrKTsKKworCXJldHVybjsKK30KKwordm9pZCBlbXUxMGsxX3RpbWVyX2luc3RhbGwoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV90aW1lciAqdGltZXIsIHUxNiBkZWxheSkKK3sKKwlzdHJ1Y3QgZW11X3RpbWVyICp0OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVsYXkgPCA1KQorCQlkZWxheSA9IDU7CisKKwl0aW1lci0+ZGVsYXkgPSBkZWxheTsKKwl0aW1lci0+c3RhdGUgPSBUSU1FUl9TVEFURV9JTlNUQUxMRUQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOworCisJdGltZXItPmNvdW50X21heCA9IHRpbWVyLT5kZWxheSAvIChjYXJkLT50aW1lcl9kZWxheSA8IDEwMjQgPyBjYXJkLT50aW1lcl9kZWxheSA6IDEwMjQpOworCXRpbWVyLT5jb3VudCA9IHRpbWVyLT5jb3VudF9tYXggLSAxOworCisJbGlzdF9hZGQoJnRpbWVyLT5saXN0LCAmY2FyZC0+dGltZXJzKTsKKworCWlmIChjYXJkLT50aW1lcl9kZWxheSA+IGRlbGF5KSB7CisJCWlmIChjYXJkLT50aW1lcl9kZWxheSA9PSBUSU1FUl9TVE9QUEVEKQorCQkJZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIElOVEVfSU5URVJWQUxUSU1FUkVOQik7CisKKwkJY2FyZC0+dGltZXJfZGVsYXkgPSBkZWxheTsKKwkJZGVsYXkgPSAoZGVsYXkgPCAxMDI0ID8gZGVsYXkgOiAxMDI0KTsKKworCQllbXUxMGsxX3RpbWVyX3NldChjYXJkLCBkZWxheSk7CisKKwkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNhcmQtPnRpbWVycykgeworCQkJdCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXVfdGltZXIsIGxpc3QpOworCisJCQl0LT5jb3VudF9tYXggPSB0LT5kZWxheSAvIGRlbGF5OworCQkJLyogZG9uJ3Qgd2FudCB0byB0aGluayBtdWNoLCBqdXN0IGZvcmNlIHNjaGVkdWxpbmcgCisJCQkgICBvbiB0aGUgbmV4dCBpbnRlcnJ1cHQgKi8KKwkJCXQtPmNvdW50ID0gdC0+Y291bnRfbWF4IC0gMTsKKwkJfQorCisJCURQRCgyLCAidGltZXIgcmF0ZSAtLT4gJXVcbiIsIGRlbGF5KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgZW11MTBrMV90aW1lcl91bmluc3RhbGwoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV90aW1lciAqdGltZXIpCit7CisJc3RydWN0IGVtdV90aW1lciAqdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwl1MTYgZGVsYXkgPSBUSU1FUl9TVE9QUEVEOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodGltZXItPnN0YXRlID09IFRJTUVSX1NUQVRFX1VOSU5TVEFMTEVEKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOworCisJbGlzdF9kZWwoJnRpbWVyLT5saXN0KTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZjYXJkLT50aW1lcnMpIHsKKwkJdCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXVfdGltZXIsIGxpc3QpOworCisJCWlmICh0LT5kZWxheSA8IGRlbGF5KQorCQkJZGVsYXkgPSB0LT5kZWxheTsKKwl9CisKKwlpZiAoY2FyZC0+dGltZXJfZGVsYXkgIT0gZGVsYXkpIHsKKwkJY2FyZC0+dGltZXJfZGVsYXkgPSBkZWxheTsKKworCQlpZiAoZGVsYXkgPT0gVElNRVJfU1RPUFBFRCkKKwkJCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgSU5URV9JTlRFUlZBTFRJTUVSRU5CKTsKKwkJZWxzZSB7CisJCQlkZWxheSA9IChkZWxheSA8IDEwMjQgPyBkZWxheSA6IDEwMjQpOworCisJCQllbXUxMGsxX3RpbWVyX3NldChjYXJkLCBkZWxheSk7CisKKwkJCWxpc3RfZm9yX2VhY2goZW50cnksICZjYXJkLT50aW1lcnMpIHsKKwkJCQl0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdV90aW1lciwgbGlzdCk7CisKKwkJCQl0LT5jb3VudF9tYXggPSB0LT5kZWxheSAvIGRlbGF5OworCQkJCXQtPmNvdW50ID0gdC0+Y291bnRfbWF4IC0gMTsKKwkJCX0KKwkJfQorCisJCURQRCgyLCAidGltZXIgcmF0ZSAtLT4gJXVcbiIsIGRlbGF5KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7CisKKwl0aW1lci0+c3RhdGUgPSBUSU1FUl9TVEFURV9VTklOU1RBTExFRDsKKworCXJldHVybjsKK30KKwordm9pZCBlbXUxMGsxX3RpbWVyX2VuYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZW11X3RpbWVyICp0aW1lcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKKwl0aW1lci0+c3RhdGUgfD0gVElNRVJfU1RBVEVfQUNUSVZFOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybjsKK30KKwordm9pZCBlbXUxMGsxX3RpbWVyX2Rpc2FibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV90aW1lciAqdGltZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7CisJdGltZXItPnN0YXRlICY9IH5USU1FUl9TVEFURV9BQ1RJVkU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvdGltZXIuaCBiL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1NDNiNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgdGltZXIuaAorICogICAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKyNpZm5kZWYgX1RJTUVSX0gKKyNkZWZpbmUgX1RJTUVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKworc3RydWN0IGVtdV90aW1lciAKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7CisJdTggc3RhdGU7IAorCXUxNiBjb3VudDsJCQkJLyogY3VycmVudCBudW1iZXIgb2YgaW50ZXJydXB0cyAqLworCXUxNiBjb3VudF9tYXg7CQkJCS8qIG51bWJlciBvZiBpbnRlcnJ1cHRzIG5lZWRlZCB0byBzY2hlZHVsZSB0aGUgYmggKi8KKwl1MTYgZGVsYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgZGVsYXkgKi8KK307CisKK3ZvaWQgZW11MTBrMV90aW1lcl9pbnN0YWxsKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV90aW1lciAqLCB1MTYpOwordm9pZCBlbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBlbXVfdGltZXIgKik7Cit2b2lkIGVtdTEwazFfdGltZXJfZW5hYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV90aW1lciAqKTsKK3ZvaWQgZW11MTBrMV90aW1lcl9kaXNhYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV90aW1lciAqKTsKKworI2RlZmluZSBUSU1FUl9TVE9QUEVEIAkJCTB4ZmZmZiAKKyNkZWZpbmUgVElNRVJfU1RBVEVfSU5TVEFMTEVEIAkJMHgwMQorI2RlZmluZSBUSU1FUl9TVEFURV9BQ1RJVkUJCTB4MDIKKyNkZWZpbmUgVElNRVJfU1RBVEVfVU5JTlNUQUxMRUQgCTB4MDQKKworI2VuZGlmIC8qIF9USU1FUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5jIGIvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODhiNjAyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuYwpAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgdm9pY2VtZ3IuYyAtIFZvaWNlIG1hbmFnZXIgZm9yIGVtdTEwazEgZHJpdmVyCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAidm9pY2VtZ3IuaCIKKyNpbmNsdWRlICI4MDEwLmgiCisKKyNkZWZpbmUgUElUQ0hfNDgwMDAgMHgwMDAwNDAwMAorI2RlZmluZSBQSVRDSF85NjAwMCAweDAwMDA4MDAwCisjZGVmaW5lIFBJVENIXzg1MDAwIDB4MDAwMDcxNTUKKyNkZWZpbmUgUElUQ0hfODA3MjYgMHgwMDAwNmJhMgorI2RlZmluZSBQSVRDSF82Nzg4MiAweDAwMDA1YTgyCisjZGVmaW5lIFBJVENIXzU3MDgxIDB4MDAwMDRjMWMKKworc3RhdGljIHUzMiBlbXUxMGsxX3NlbGVjdF9pbnRlcnByb20oc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwKKwkJCQkgICAgc3RydWN0IGVtdV92b2ljZSAqdm9pY2UpCit7CisJaWYodm9pY2UtPnBpdGNoX3RhcmdldD09UElUQ0hfNDgwMDApCisJCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8wOworCWVsc2UgaWYodm9pY2UtPnBpdGNoX3RhcmdldDxQSVRDSF80ODAwMCkKKwkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzE7CisJZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfOTYwMDApCisJCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8wOworCWVsc2UgIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ+PVBJVENIXzg1MDAwKQorCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fNjsKKwllbHNlICBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0Pj1QSVRDSF84MDcyNikKKwkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzU7CisJZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfNjc4ODIpCisJCXJldHVybiBDQ0NBX0lOVEVSUFJPTV80OworCWVsc2UgIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ+PVBJVENIXzU3MDgxKQorCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMzsKKwllbHNlICAKKwkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzI7Cit9CisKKworLyoqCisgKiBlbXUxMGsxX3ZvaWNlX2FsbG9jX2J1ZmZlciAtCisgKgorICogYWxsb2NhdGVzIHRoZSBtZW1vcnkgYnVmZmVyIGZvciBhIHZvaWNlLiBUd28gcGFnZSB0YWJsZXMgYXJlIGtlcHQgZm9yIGVhY2ggYnVmZmVyLgorICogT25lIChkbWFfaGFuZGxlKSBrZWVwcyB0cmFjayBvZiB0aGUgaG9zdCBtZW1vcnkgcGFnZXMgdXNlZCBhbmQgdGhlIG90aGVyICh2aXJ0dWFscGFnZXRhYmxlKQorICogaXMgcGFzc2VkIHRvIHRoZSBkZXZpY2Ugc28gdGhhdCBpdCBjYW4gZG8gRE1BIHRvIGhvc3QgbWVtb3J5LgorICoKKyAqLworaW50IGVtdTEwazFfdm9pY2VfYWxsb2NfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB2b2ljZV9tZW0gKm1lbSwgdTMyIHBhZ2VzKQoreworCXUzMiBwYWdlaW5kZXgsIHBhZ2Vjb3VudDsKKwl1MzIgYnVzYWRkeDsKKwlpbnQgaTsKKworCURQRCgyLCAicmVxdWVzdGVkIHBhZ2VzIGlzOiAlZFxuIiwgcGFnZXMpOworCisJaWYgKChtZW0tPmVtdXBhZ2VpbmRleCA9IGVtdTEwazFfYWRkeG1ncl9hbGxvYyhwYWdlcyAqIFBBR0VfU0laRSwgY2FyZCkpIDwgMCkKKwl7CisJCURQRigxLCAiY291bGRuJ3QgYWxsb2NhdGUgZW11MTBrMSBhZGRyZXNzIHNwYWNlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEZpbGwgaW4gdmlydHVhbCBtZW1vcnkgdGFibGUgKi8KKwlmb3IgKHBhZ2Vjb3VudCA9IDA7IHBhZ2Vjb3VudCA8IHBhZ2VzOyBwYWdlY291bnQrKykgeworCQlpZiAoKG1lbS0+YWRkcltwYWdlY291bnRdID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgUEFHRV9TSVpFLCAmbWVtLT5kbWFfaGFuZGxlW3BhZ2Vjb3VudF0pKQorCQkJPT0gTlVMTCkgeworCQkJbWVtLT5wYWdlcyA9IHBhZ2Vjb3VudDsKKwkJCURQRigxLCAiY291bGRuJ3QgYWxsb2NhdGUgZG1hIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlEUEQoMiwgIlZpcnR1YWwgQWRkeDogJXBcbiIsIG1lbS0+YWRkcltwYWdlY291bnRdKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gRU1VUEFHRVNJWkU7IGkrKykgeworCQkJYnVzYWRkeCA9ICh1MzIpIG1lbS0+ZG1hX2hhbmRsZVtwYWdlY291bnRdICsgaSAqIEVNVVBBR0VTSVpFOworCisJCQlEUEQoMywgIkJ1cyBBZGR4OiAlI3hcbiIsIGJ1c2FkZHgpOworCisJCQlwYWdlaW5kZXggPSBtZW0tPmVtdXBhZ2VpbmRleCArIHBhZ2Vjb3VudCAqIFBBR0VfU0laRSAvIEVNVVBBR0VTSVpFICsgaTsKKworCQkJKCh1MzIgKikgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyKVtwYWdlaW5kZXhdID0gY3B1X3RvX2xlMzIoKGJ1c2FkZHggKiAyKSB8IHBhZ2VpbmRleCk7CisJCX0KKwl9CisKKwltZW0tPnBhZ2VzID0gcGFnZWNvdW50OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZW11MTBrMV92b2ljZV9mcmVlX2J1ZmZlciAtCisgKgorICogZnJlZXMgdGhlIG1lbW9yeSBidWZmZXIgZm9yIGEgdm9pY2UuCisgKi8KK3ZvaWQgZW11MTBrMV92b2ljZV9mcmVlX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgdm9pY2VfbWVtICptZW0pCit7CisJdTMyIHBhZ2Vjb3VudCwgcGFnZWluZGV4OworCWludCBpOworCisJaWYgKG1lbS0+ZW11cGFnZWluZGV4IDwgMCkKKwkJcmV0dXJuOworCisJZm9yIChwYWdlY291bnQgPSAwOyBwYWdlY291bnQgPCBtZW0tPnBhZ2VzOyBwYWdlY291bnQrKykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIFBBR0VfU0laRSwKKwkJCQkJbWVtLT5hZGRyW3BhZ2Vjb3VudF0sCisJCQkJCW1lbS0+ZG1hX2hhbmRsZVtwYWdlY291bnRdKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gRU1VUEFHRVNJWkU7IGkrKykgeworCQkJcGFnZWluZGV4ID0gbWVtLT5lbXVwYWdlaW5kZXggKyBwYWdlY291bnQgKiBQQUdFX1NJWkUgLyBFTVVQQUdFU0laRSArIGk7CisJCQkoKHUzMiAqKSBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIpW3BhZ2VpbmRleF0gPQorCQkJCWNwdV90b19sZTMyKCgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSB8IHBhZ2VpbmRleCk7CisJCX0KKwl9CisKKwllbXUxMGsxX2FkZHhtZ3JfZnJlZShjYXJkLCBtZW0tPmVtdXBhZ2VpbmRleCk7CisJbWVtLT5lbXVwYWdlaW5kZXggPSAtMTsKK30KKworaW50IGVtdTEwazFfdm9pY2VfYWxsb2Moc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV92b2ljZSAqdm9pY2UpCit7CisJdTggKnZvaWNldGFibGUgPSBjYXJkLT52b2ljZXRhYmxlOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwgImVtdTEwazFfdm9pY2VfYWxsb2MoKVxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykgeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0c7IGkgKz0gMikKKwkJCWlmICgodm9pY2V0YWJsZVtpXSA9PSBWT0lDRV9VU0FHRV9GUkVFKSAmJiAodm9pY2V0YWJsZVtpICsgMV0gPT0gVk9JQ0VfVVNBR0VfRlJFRSkpIHsKKwkJCQl2b2ljZXRhYmxlW2ldID0gdm9pY2UtPnVzYWdlOworCQkJCXZvaWNldGFibGVbaSArIDFdID0gdm9pY2UtPnVzYWdlOworCQkJCWJyZWFrOworCQkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRzsgaSsrKQorCQkJaWYgKHZvaWNldGFibGVbaV0gPT0gVk9JQ0VfVVNBR0VfRlJFRSkgeworCQkJCXZvaWNldGFibGVbaV0gPSB2b2ljZS0+dXNhZ2U7CisJCQkJYnJlYWs7CisJCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGkgPj0gTlVNX0cpCisJCXJldHVybiAtMTsKKworCXZvaWNlLT5jYXJkID0gY2FyZDsKKwl2b2ljZS0+bnVtID0gaTsKKworCWZvciAoaSA9IDA7IGkgPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBpKyspIHsKKwkJRFBEKDIsICIgdm9pY2UgYWxsb2NhdGVkIC0+ICVkXG4iLCB2b2ljZS0+bnVtICsgaSk7CisKKwkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCB2b2ljZS0+bnVtICsgaSwgSUZBVE4sIDB4ZmZmZiwKKwkJCQkJCQlEQ1lTVVNWLCAwLAorCQkJCQkJCVZURlQsIDB4MDAwMGZmZmYsCisJCQkJCQkJUFRSWCwgMCwKKwkJCQkJCQlUQUdMSVNUX0VORCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW11MTBrMV92b2ljZV9mcmVlKHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlKQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB2b2ljZS0+Y2FyZDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBGKDIsICJlbXUxMGsxX3ZvaWNlX2ZyZWUoKVxuIik7CisKKwlpZiAodm9pY2UtPnVzYWdlID09IFZPSUNFX1VTQUdFX0ZSRUUpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBpKyspIHsKKwkJRFBEKDIsICIgdm9pY2UgcmVsZWFzZWQgLT4gJWRcbiIsIHZvaWNlLT5udW0gKyBpKTsKKworCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBpLCBEQ1lTVVNWLCAwLCAKKwkJCQkJCQlWVEZULCAweDAwMDBmZmZmLAorCQkJCQkJCVBUUlhfUElUQ0hUQVJHRVQsIDAsCisJCQkJCQkJQ1ZDRiwgMHgwMDAwZmZmZiwKKwkJCQkJCQkvL0NQRiwgMCwKKwkJCQkJCQlUQUdMSVNUX0VORCk7CisJCQorCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGLCB2b2ljZS0+bnVtICsgaSwgMCk7CisJfQorCisJdm9pY2UtPnVzYWdlID0gVk9JQ0VfVVNBR0VfRlJFRTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwljYXJkLT52b2ljZXRhYmxlW3ZvaWNlLT5udW1dID0gVk9JQ0VfVVNBR0VfRlJFRTsKKworCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pCisJCWNhcmQtPnZvaWNldGFibGVbdm9pY2UtPm51bSArIDFdID0gVk9JQ0VfVVNBR0VfRlJFRTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBlbXUxMGsxX3ZvaWNlX3BsYXliYWNrX3NldHVwKHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlKQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB2b2ljZS0+Y2FyZDsKKwl1MzIgc3RhcnQ7CisJaW50IGk7CisKKwlEUEYoMiwgImVtdTEwazFfdm9pY2VfcGxheWJhY2tfc2V0dXAoKVxuIik7CisKKwlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKSB7CisJCS8qIFNldCBzdGVyZW8gYml0ICovCisJCXN0YXJ0ID0gMjg7CisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0sIENQRl9TVEVSRU9fTUFTSyk7CisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0gKyAxLCBDUEZfU1RFUkVPX01BU0spOworCX0gZWxzZSB7CisJCXN0YXJ0ID0gMzA7CisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0sIDApOworCX0KKworCWlmKCEodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfMTZCSVQpKQorCQlzdGFydCAqPSAyOworCisJdm9pY2UtPnN0YXJ0ICs9IHN0YXJ0OworCisJZm9yIChpID0gMDsgaSA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGkrKykgeworCQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7CisJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9GWFJUMSwgdm9pY2UtPm51bSArIGksIHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9yb3V0aW5nKTsKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX0ZYUlQyLCB2b2ljZS0+bnVtICsgaSwgdm9pY2UtPnBhcmFtc1tpXS5zZW5kX3JvdXRpbmcyKTsKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCAgQV9TRU5EQU1PVU5UUywgdm9pY2UtPm51bSArIGksIHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9oZ2ZlKTsKKwkJfSBlbHNlIHsKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBGWFJULCB2b2ljZS0+bnVtICsgaSwgdm9pY2UtPnBhcmFtc1tpXS5zZW5kX3JvdXRpbmcgPDwgMTYpOworCQl9CisKKwkJLyogU3RvcCBDQSAqLworCQkvKiBBc3N1bXB0aW9uIHRoYXQgUFQgaXMgYWxyZWFkeSAwIHNvIG5vIGhhcm0gb3ZlcndyaXRpbmcgKi8KKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFBUUlgsIHZvaWNlLT5udW0gKyBpLCAoKHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9kY2JhICYgMHhmZikgPDwgOCkKKwkJCQl8ICgodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweGZmMDApID4+IDgpKTsKKworCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBpLAorCQkJCS8qIENTTCwgU1QsIENBICovCisJCQkJICAgIERTTCwgdm9pY2UtPmVuZGxvb3AgfCAodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweGZmMDAwMDAwKSwKKwkJCQkgICAgUFNTVCwgdm9pY2UtPnN0YXJ0bG9vcCB8ICgodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweDAwZmYwMDAwKSA8PCA4KSwKKwkJCQkgICAgQ0NDQSwgKHZvaWNlLT5zdGFydCkgfCAgZW11MTBrMV9zZWxlY3RfaW50ZXJwcm9tKGNhcmQsdm9pY2UpIHwKKwkJCQkgICAgICAgICgodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfMTZCSVQpID8gMCA6IENDQ0FfOEJJVFNFTEVDVCksCisJCQkJICAgIC8qIENsZWFyIGZpbHRlciBkZWxheSBtZW1vcnkgKi8KKwkJCQkgICAgWjEsIDAsCisJCQkJICAgIFoyLCAwLAorCQkJCSAgICAvKiBJbnZhbGlkYXRlIG1hcHMgKi8KKwkJCQkgICAgTUFQQSwgTUFQX1BUSV9NQVNLIHwgKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpLAorCQkJCSAgICBNQVBCLCBNQVBfUFRJX01BU0sgfCAoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMiksCisJCQkJLyogbW9kdWxhdGlvbiBlbnZlbG9wZSAqLworCQkJCSAgICBDVkNGLCAweDAwMDBmZmZmLAorCQkJCSAgICBWVEZULCAweDAwMDBmZmZmLAorCQkJCSAgICBBVEtITERNLCAwLAorCQkJCSAgICBEQ1lTVVNNLCAweDAwN2YsCisJCQkJICAgIExGT1ZBTDEsIDB4ODAwMCwKKwkJCQkgICAgTEZPVkFMMiwgMHg4MDAwLAorCQkJCSAgICBGTU1PRCwgMCwKKwkJCQkgICAgVFJFTUZSUSwgMCwKKwkJCQkgICAgRk0yRlJRMiwgMCwKKwkJCQkgICAgRU5WVkFMLCAweDgwMDAsCisJCQkJLyogdm9sdW1lIGVudmVsb3BlICovCisJCQkJICAgIEFUS0hMRFYsIDB4N2Y3ZiwKKwkJCQkgICAgRU5WVk9MLCAweDgwMDAsCisJCQkJLyogZmlsdGVyIGVudmVsb3BlICovCisJCQkJICAgIFBFRkVfRklMVEVSQU1PVU5ULCAweDdmLAorCQkJCS8qIHBpdGNoIGVudmVsb3BlICovCisJCQkJICAgIFBFRkVfUElUQ0hBTU9VTlQsIDAsIFRBR0xJU1RfRU5EKTsKKworCQl2b2ljZS0+cGFyYW1zW2ldLmZjX3RhcmdldCA9IDB4ZmZmZjsKKwl9Cit9CisKK3ZvaWQgZW11MTBrMV92b2ljZXNfc3RhcnQoc3RydWN0IGVtdV92b2ljZSAqZmlyc3Rfdm9pY2UsIHVuc2lnbmVkIGludCBudW1fdm9pY2VzLCBpbnQgc2V0KQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBmaXJzdF92b2ljZS0+Y2FyZDsKKwlzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZTsKKwl1bnNpZ25lZCBpbnQgdm9pY2VudW07CisJaW50IGo7CisKKwlEUEYoMiwgImVtdTEwazFfdm9pY2VzX3N0YXJ0KClcbiIpOworCisJZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgbnVtX3ZvaWNlczsgdm9pY2VudW0rKykKKwl7CisJCXZvaWNlID0gZmlyc3Rfdm9pY2UgKyB2b2ljZW51bTsKKworCQlpZiAoIXNldCkgeworCQkJdTMyIGNyYSwgY2NpcywgY3MsIHNhbXBsZTsKKwkJCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pIHsKKwkJCQljcmEgPSA2NDsKKwkJCQljY2lzID0gMjg7CisJCQkJY3MgPSA0OworCQkJfSBlbHNlIHsKKwkJCQljcmEgPSA2NDsKKwkJCQljY2lzID0gMzA7CisJCQkJY3MgPSAyOworCQkJfQorCisJCQlpZih2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU18xNkJJVCkgeworCQkJCXNhbXBsZSA9IDB4MDAwMDAwMDA7CisJCQl9IGVsc2UgeworCQkJCXNhbXBsZSA9IDB4ODA4MDgwODA7CQkKKwkJCQljY2lzICo9IDI7CisJCQl9CisKKwkJCWZvcihqID0gMDsgaiA8IGNzOyBqKyspCisJICAgICAgICAJICAgICAgICBzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0QwICsgaiwgdm9pY2UtPm51bSwgc2FtcGxlKTsKKworCQkJLyogUmVzZXQgY2FjaGUgKi8KKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UtPm51bSwgMCk7CisJCQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKQorCQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UtPm51bSArIDEsIDApOworCisJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0NSX1JFQURBRERSRVNTLCB2b2ljZS0+bnVtLCBjcmEpOworCisJCQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKQorCQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfUkVBREFERFJFU1MsIHZvaWNlLT5udW0gKyAxLCBjcmEpOworCisJCQkvKiBGaWxsIGNhY2hlICovCisJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0NSX0NBQ0hFSU5WQUxJRFNJWkUsIHZvaWNlLT5udW0sIGNjaXMpOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGorKykgeworCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCB2b2ljZS0+bnVtICsgaiwKKwkJCQkgICAgSUZBVE4sICh2b2ljZS0+cGFyYW1zW2pdLmluaXRpYWxfZmMgPDwgOCkgfCB2b2ljZS0+cGFyYW1zW2pdLmluaXRpYWxfYXR0biwKKwkJCQkgICAgVlRGVCwgKHZvaWNlLT5wYXJhbXNbal0udm9sdW1lX3RhcmdldCA8PCAxNikgfCB2b2ljZS0+cGFyYW1zW2pdLmZjX3RhcmdldCwKKwkJCQkgICAgQ1ZDRiwgKHZvaWNlLT5wYXJhbXNbal0udm9sdW1lX3RhcmdldCA8PCAxNikgfCB2b2ljZS0+cGFyYW1zW2pdLmZjX3RhcmdldCwKKwkJCQkgICAgRENZU1VTViwgKHZvaWNlLT5wYXJhbXNbal0uYnlhbXBsX2Vudl9zdXN0YWluIDw8IDgpIHwgdm9pY2UtPnBhcmFtc1tqXS5ieWFtcGxfZW52X2RlY2F5LAorCQkJCSAgICBUQUdMSVNUX0VORCk7CisJCisJCQllbXUxMGsxX2NsZWFyX3N0b3Bfb25fbG9vcChjYXJkLCB2b2ljZS0+bnVtICsgaik7CisJCX0KKwl9CisKKworICAgICAgICBmb3IgKHZvaWNlbnVtID0gMDsgdm9pY2VudW0gPCBudW1fdm9pY2VzOyB2b2ljZW51bSsrKQorCXsKKwkJdm9pY2UgPSBmaXJzdF92b2ljZSArIHZvaWNlbnVtOworCisJCWZvciAoaiA9IDA7IGogPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBqKyspIHsKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBQVFJYX1BJVENIVEFSR0VULCB2b2ljZS0+bnVtICsgaiwgdm9pY2UtPnBpdGNoX3RhcmdldCk7CisKKwkJCWlmIChqID09IDApCisJCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRl9DVVJSRU5UUElUQ0gsIHZvaWNlLT5udW0sIHZvaWNlLT5waXRjaF90YXJnZXQpOworCisJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgSVAsIHZvaWNlLT5udW0gKyBqLCB2b2ljZS0+aW5pdGlhbF9waXRjaCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgZW11MTBrMV92b2ljZXNfc3RvcChzdHJ1Y3QgZW11X3ZvaWNlICpmaXJzdF92b2ljZSwgaW50IG51bV92b2ljZXMpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGZpcnN0X3ZvaWNlLT5jYXJkOworCXN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlOworCXVuc2lnbmVkIGludCB2b2ljZV9udW07CisJaW50IGo7CisKKwlEUEYoMiwgImVtdTEwazFfdm9pY2Vfc3RvcCgpXG4iKTsKKworICAgICAgICBmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IG51bV92b2ljZXM7IHZvaWNlX251bSsrKQorCXsKKwkJdm9pY2UgPSBmaXJzdF92b2ljZSArIHZvaWNlX251bTsKKworCQlmb3IgKGogPSAwOyBqIDwgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTyA/IDIgOiAxKTsgaisrKSB7CisJCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBqLAorCQkJCQkJUFRSWF9QSVRDSFRBUkdFVCwgMCwKKwkJCQkJCUNQRl9DVVJSRU5UUElUQ0gsIDAsCisJCQkJCQlJRkFUTiwgMHhmZmZmLAorCQkJCQkJVlRGVCwgMHgwMDAwZmZmZiwKKwkJCQkJCUNWQ0YsIDB4MDAwMGZmZmYsCisJCQkJCQlJUCwgMCwKKwkJCQkJCVRBR0xJU1RfRU5EKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuaCBiL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5YThjYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIHNibGl2ZV92b2ljZS5oIC0tIEVNVSBWb2ljZSBSZXNvdXJjZSBNYW5hZ2VyIGhlYWRlciBmaWxlCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9WT0lDRU1HUl9ICisjZGVmaW5lIF9WT0lDRU1HUl9ICisKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorCisvKiBzdHJ1Y3QgZW11X3ZvaWNlLnVzYWdlIGZsYWdzICovCisjZGVmaW5lIFZPSUNFX1VTQUdFX0ZSRUUJCTB4MDEKKyNkZWZpbmUgVk9JQ0VfVVNBR0VfTUlESQkJMHgwMgorI2RlZmluZSBWT0lDRV9VU0FHRV9QTEFZQkFDSwkJMHgwNAorCisvKiBzdHJ1Y3QgZW11X3ZvaWNlLmZsYWdzIGZsYWdzICovCisjZGVmaW5lIFZPSUNFX0ZMQUdTX1NURVJFTwkJMHgwMgorI2RlZmluZSBWT0lDRV9GTEFHU18xNkJJVAkJMHgwNAorCitzdHJ1Y3Qgdm9pY2VfcGFyYW0KK3sKKwkvKiBGWCBidXMgYW1vdW50IHNlbmQgKi8KKworCXUzMiBzZW5kX3JvdXRpbmc7CisJLy8gYXVkaWd5IG9ubHk6CisJdTMyIHNlbmRfcm91dGluZzI7CisKKwl1MzIgc2VuZF9kY2JhOworCS8vIGF1ZGlneSBvbmx5OgorCXUzMiBzZW5kX2hnZmU7CisKKworCXUzMiBpbml0aWFsX2ZjOworCXUzMiBmY190YXJnZXQ7CisKKwl1MzIgaW5pdGlhbF9hdHRuOworCXUzMiB2b2x1bWVfdGFyZ2V0OworCisJdTMyIGJ5YW1wbF9lbnZfc3VzdGFpbjsKKwl1MzIgYnlhbXBsX2Vudl9kZWNheTsKK307CisKK3N0cnVjdCB2b2ljZV9tZW0geworCWludCBlbXVwYWdlaW5kZXg7CisJdm9pZCAqYWRkcltCVUZNQVhQQUdFU107CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlW0JVRk1BWFBBR0VTXTsKKwl1MzIgcGFnZXM7Cit9OworCitzdHJ1Y3QgZW11X3ZvaWNlCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKKwl1OCB1c2FnZTsJCS8qIEZyZWUsIE1JREksIHBsYXliYWNrICovCisJdTggbnVtOwkJCS8qIFZvaWNlIElEICovCisJdTggZmxhZ3M7CQkvKiBTdGVyZW8vbW9ubywgOC8xNiBiaXQgKi8KKworCXUzMiBzdGFydGxvb3A7CisJdTMyIGVuZGxvb3A7CisJdTMyIHN0YXJ0OworCisJdTMyIGluaXRpYWxfcGl0Y2g7CisJdTMyIHBpdGNoX3RhcmdldDsKKworCXN0cnVjdCB2b2ljZV9wYXJhbSBwYXJhbXNbMl07CisKKwlzdHJ1Y3Qgdm9pY2VfbWVtIG1lbTsKK307CisKK2ludCBlbXUxMGsxX3ZvaWNlX2FsbG9jX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB2b2ljZV9tZW0gKiwgdTMyKTsKK3ZvaWQgZW11MTBrMV92b2ljZV9mcmVlX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB2b2ljZV9tZW0gKik7CitpbnQgZW11MTBrMV92b2ljZV9hbGxvYyhzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBlbXVfdm9pY2UgKik7Cit2b2lkIGVtdTEwazFfdm9pY2VfZnJlZShzdHJ1Y3QgZW11X3ZvaWNlICopOwordm9pZCBlbXUxMGsxX3ZvaWNlX3BsYXliYWNrX3NldHVwKHN0cnVjdCBlbXVfdm9pY2UgKik7Cit2b2lkIGVtdTEwazFfdm9pY2VzX3N0YXJ0KHN0cnVjdCBlbXVfdm9pY2UgKiwgdW5zaWduZWQgaW50LCBpbnQpOwordm9pZCBlbXUxMGsxX3ZvaWNlc19zdG9wKHN0cnVjdCBlbXVfdm9pY2UgKiwgaW50KTsKKworI2VuZGlmIC8qIF9WT0lDRU1HUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZXMxMzcwLmMgYi9zb3VuZC9vc3MvZXMxMzcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2MDkxYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lczEzNzAuYwpAQCAtMCwwICsxLDI3ODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICAgICAgZXMxMzcwLmMgIC0tICBFbnNvbmlxIEVTMTM3MC9Bc2FoaSBLYXNlaSBBSzQ1MzEgYXVkaW8gZHJpdmVyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEsIDIwMDMgIFRob21hcyBTYWlsZXIgKHQuc2FpbGVyQGFsdW1uaS5ldGh6LmNoKQorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBEYXZpZCBDLiBOaWVtaQorICoKKyAqCisgKiBNb2R1bGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnM6CisgKiAgIGxpbmVvdXQgIGlmIDEgdGhlIExJTkUgamFjayBpcyB1c2VkIGFzIGFuIG91dHB1dCBpbnN0ZWFkIG9mIGFuIGlucHV0LgorICogICAgICAgICAgICBMSU5FIHRoZW4gY29udGFpbnMgdGhlIHVubWl4ZWQgZHNwIG91dHB1dC4gVGhpcyBjYW4gYmUgdXNlZAorICogICAgICAgICAgICB0byBtYWtlIHRoZSBjYXJkIGEgZm91ciBjaGFubmVsIG9uZTogdXNlIGRzcCB0byBvdXRwdXQgdHdvCisgKiAgICAgICAgICAgIGNoYW5uZWxzIHRvIExJTkUgYW5kIGRhYyB0byBvdXRwdXQgdGhlIG90aGVyIHR3byBjaGFubmVscyB0bworICogICAgICAgICAgICBTUEtSLiBTZXQgdGhlIG1peGVyIHRvIG9ubHkgb3V0cHV0IHN5bnRoIHRvIFNQS1IuCisgKiAgIG1pY2JpYXMgIHNldHMgdGhlICs1ViBiaWFzIHRvIHRoZSBtaWMgaWYgdXNpbmcgYW4gZWxlY3RyZXRtaWMuCisgKiAgICAgICAgICAgIAorICoKKyAqICBOb3RlOiBzeW5jIG1vZGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgKGkuZS4gcnVubmluZyBkc3AgYW5kIGRhYyBmcm9tIHRoZSBzYW1lCisgKiAgY2xvY2sgc291cmNlKQorICoKKyAqICBTdXBwb3J0ZWQgZGV2aWNlczoKKyAqICAvZGV2L2RzcCAgICBzdGFuZGFyZCAvZGV2L2RzcCBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCisgKiAgL2Rldi9taXhlciAgc3RhbmRhcmQgL2Rldi9taXhlciBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCisgKiAgL2Rldi9kc3AxICAgYWRkaXRpb25hbCBEQUMsIGxpa2UgL2Rldi9kc3AsIGJ1dCBvdXRwdXQgb25seSwKKyAqICAgICAgICAgICAgICBvbmx5IDU1MTIsIDExMDI1LCAyMjA1MCBhbmQgNDQxMDAgc2FtcGxlcy9zLAorICogICAgICAgICAgICAgIG91dHB1dHMgdG8gbWl4ZXIgIlNZTlRIIiBzZXR0aW5nCisgKiAgL2Rldi9taWRpICAgc2ltcGxlIE1JREkgVUFSVCBpbnRlcmZhY2UsIG5vIGlvY3RsCisgKgorICogIE5PVEU6IHRoZSBjYXJkIGRvZXMgbm90IGhhdmUgYW55IEZNL1dhdmV0YWJsZSBzeW50aGVzaXplciwgaXQgaXMgc3VwcG9zZWQKKyAqICB0byBiZSBkb25lIGluIHNvZnR3YXJlLiBUaGF0IGlzIHdoYXQgL2Rldi9kYWMgaXMgZm9yLiBCeSBub3cgKFEyIDE5OTgpCisgKiAgdGhlcmUgYXJlIHNldmVyYWwgTUlESSB0byBQQ00gKFdBVikgcGFja2FnZXMsIG9uZSBvZiB0aGVtIGlzIHRpbWlkaXR5LgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAyNi4wMy4xOTk4ICAgMC4xICAgSW5pdGlhbCByZWxlYXNlCisgKiAgICAzMS4wMy4xOTk4ICAgMC4yICAgRml4IGJ1ZyBpbiBHRVRPU1BBQ0UKKyAqICAgIDA0LjA0LjE5OTggICAwLjMgICBNYWtlIGl0IHdvcmsgKGFnYWluKSB1bmRlciAyLjAuMzMKKyAqICAgICAgICAgICAgICAgICAgICAgICBGaXggbWl4ZXIgd3JpdGUgb3BlcmF0aW9uIG5vdCByZXR1cm5pbmcgdGhlIGFjdHVhbAorICogICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzCisgKiAgICAwNS4wNC4xOTk4ICAgMC40ICAgRmlyc3QgYXR0ZW1wdCBhdCB1c2luZyB0aGUgbmV3IFBDSSBzdHVmZgorICogICAgMjkuMDQuMTk5OCAgIDAuNSAgIEZpeCBoYW5nIHdoZW4gXkMgaXMgcHJlc3NlZCBvbiBhbXAKKyAqICAgIDA3LjA1LjE5OTggICAwLjYgICBEb24ndCBkb3VibGUgbG9jayBhcm91bmQgc3RvcF8qKCkgaW4gKl9yZWxlYXNlKCkKKyAqICAgIDEwLjA1LjE5OTggICAwLjcgICBGaXJzdCBzdGFiIGF0IGEgc2ltcGxlIG1pZGkgaW50ZXJmYWNlIChubyBiZWxscyZ3aGlzdGxlcykKKyAqICAgIDE0LjA1LjE5OTggICAwLjggICBEb24ndCBhbGxvdyBleGNlc3NpdmUgaW50ZXJydXB0IHJhdGVzCisgKiAgICAwOC4wNi4xOTk4ICAgMC45ICAgRmlyc3QgcmVsZWFzZSB1c2luZyBBbGFuIENveCcgc291bmRjb3JlIGluc3RlYWQgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICBtaXNjZGV2aWNlCisgKiAgICAwNS4wNy4xOTk4ICAgMC4xMCAgRml4ZWQgdGhlIGRyaXZlciB0byBjb3JyZWN0bHkgbWFpbnRpbiBPU1Mgc3R5bGUgdm9sdW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgKG5vdCBzdXJlIGlmIHRoaXMgc2hvdWxkIGJlIHN0YW5kYXJkKQorICogICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIG1hbnkgcmVmZXJlbmNlczogZl9mbGFncyBzaG91bGQgYmUgZl9tb2RlCisgKiAgICAgICAgICAgICAgICAgICAgICAgLS0gR2VyYWxkIEJyaXR0b24gPGdicml0dG9uQG1pdC5lZHU+CisgKiAgICAwMy4wOC4xOTk4ICAgMC4xMSAgTm93IG1peGVyIGJlaGF2aW91ciBjYW4gYmFzaWNhbGx5IGJlIHNlbGVjdGVkIGJldHdlZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAiT1NTIGRvY3VtZW50ZWQiIGFuZCAiT1NTIGFjdHVhbCIgYmVoYXZpb3VyCisgKiAgICAgICAgICAgICAgICAgICAgICAgRml4ZWQgbWl4ZXIgdGFibGUgdGhhbmtzIHRvIEhha2FuLkxlbm5lc3RhbEBsdS5lcmlzb2Z0LnNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgT24gbW9kdWxlIHN0YXJ0dXAsIHNldCBEQUMyIHRvIDExa1NQUyBpbnN0ZWFkIG9mIDUuNWtTUFMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgYXMgaXQgcHJvZHVjZXMgYW4gYW5ub3lpbmcgc3Nzc2ggaW4gdGhlIGxvd2VyIHNhbXBsaW5nIHJhdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICBEbyBub3QgaW5jbHVkZSBtb2R2ZXJzaW9ucy5oCisgKiAgICAyMi4wOC4xOTk4ICAgMC4xMiAgTWl4ZXIgcmVnaXN0ZXJzIGFjdHVhbGx5IGhhdmUgNSBpbnN0ZWFkIG9mIDQgYml0cworICogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgb3V0IGJ5IEl0YWkgTmFoc2hvbgorICogICAgMzEuMDguMTk5OCAgIDAuMTMgIEZpeCByZWFscGxheWVyIHByb2JsZW1zIC0gZGFjLmNvdW50IGlzc3VlcworICogICAgMDguMTAuMTk5OCAgIDAuMTQgIEpveXN0aWNrIHN1cHBvcnQgZml4ZWQKKyAqCQkgICAgICAgICAtLSBPbGl2ZXIgTmV1a3VtIDxjMTg4QG9yZy5jaGVtaWUudW5pLW11ZW5jaGVuLmRlPgorICogICAgMTAuMTIuMTk5OCAgIDAuMTUgIEZpeCBkcmFpbl9kYWMgdHJ5aW5nIHRvIHdhaXQgb24gbm90IHlldCBpbml0aWFsaXplZCBETUEKKyAqICAgIDE2LjEyLjE5OTggICAwLjE2ICBEb24ndCB3YWtlIHVwIGFwcCB1bnRpbCB0aGVyZSBhcmUgZnJhZ3NpemUgYnl0ZXMgdG8gcmVhZC93cml0ZQorICogICAgMDYuMDEuMTk5OSAgIDAuMTcgIHJlbW92ZSB0aGUgc2lsbHkgU0FfSU5URVJSVVBUIGZsYWcuCisgKiAgICAgICAgICAgICAgICAgICAgICAgaG9wZWZ1bGx5IGtpbGxlZCB0aGUgZWdjcyBzZWN0aW9uIHR5cGUgY29uZmxpY3QKKyAqICAgIDEyLjAzLjE5OTkgICAwLjE4ICBjaW5mby5ibG9ja3Mgc2hvdWxkIGJlIHJlc2V0IGFmdGVyIEdFVHhQVFIgaW9jdGwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYnkgSm9oYW4gTWFlcyA8am9tYUB0ZWxpbmR1cy5iZT4KKyAqICAgIDIyLjAzLjE5OTkgICAwLjE5ICByZXR1cm4gRUFHQUlOIGluc3RlYWQgb2YgRUJVU1kgd2hlbiBPX05PTkJMT0NLCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVhZC93cml0ZSBjYW5ub3QgYmUgZXhlY3V0ZWQKKyAqICAgIDA3LjA0LjE5OTkgICAwLjIwICBpbXBsZW1lbnRlZCB0aGUgZm9sbG93aW5nIGlvY3RsJ3M6IFNPVU5EX1BDTV9SRUFEX1JBVEUsIAorICogICAgICAgICAgICAgICAgICAgICAgIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTLCBTT1VORF9QQ01fUkVBRF9CSVRTOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICBBbHBoYSBmaXhlcyByZXBvcnRlZCBieSBQZXRlciBKb25lcyA8cGpvbmVzQHJlZGhhdC5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogam95c3RpY2sgYWRkcmVzcyBoYW5kbGluZyBtaWdodCBzdGlsbCBiZSB3cm9uZyBvbiBhcmNocworICogICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHRoYW4gaTM4NgorICogICAgMTAuMDUuMTk5OSAgIDAuMjEgIEFkZGVkIHN1cHBvcnQgZm9yIGFuIGVsZWN0cmV0IG1pYyBmb3IgU0IgUENJNjQKKyAqICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgTGludXgga2VybmVsIHNvdW5kIGRyaXZlci4gVGhpcyBtb2QgYWxzbyBzdHJhaWdodGVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3V0IHRoZSBxdWVzdGlvbiBtYXJrcyBhcm91bmQgdGhlIG1pYyBpbXBlZGFuY2Ugc2V0dGluZworICogICAgICAgICAgICAgICAgICAgICAgIChtaWN6KS4gRnJvbSBLaW0uQmVydHNAZmlzdWIubWFpbC5hYmIuY29tCisgKiAgICAxMS4wNS4xOTk5ICAgMC4yMiAgSW1wbGVtZW50ZWQgdGhlIElNSVggY2FsbCB0byBtdXRlIHJlY29yZGluZyBtb25pdG9yLgorICogICAgICAgICAgICAgICAgICAgICAgIEd1ZW50ZXIgR2VpZ2VyIDxnZWlnZXJAZXB5LmNvLmF0PgorICogICAgMTUuMDYuMTk5OSAgIDAuMjMgIEZpeCBiYWQgYWxsb2NhdGlvbiBidWcuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVGhhbmtzIHRvIERldGkgRmxpZWdsIDxmbGllZ2xAaW4udHVtLmRlPgorICogICAgMjguMDYuMTk5OSAgIDAuMjQgIEFkZCBwY2lfc2V0X21hc3RlcgorICogICAgMDIuMDguMTk5OSAgIDAuMjUgIEFkZGVkIHdvcmthcm91bmQgZm9yIHRoZSAicGhhbnRvbSB3cml0ZSIgYnVnIGZpcnN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRlZCBieSBEYXZlIFNoYXJwbGVzcyBmcm9tIEFuY2hvciBHYW1lcworICogICAgMDMuMDguMTk5OSAgIDAuMjYgIGFkYXB0IHRvIExpbnVzJyBuZXcgX19zZXR1cC9fX2luaXRjYWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gImVzMTM3MD1qb3lzdGlja1ssbGluZW91dFssbWljYmlhc11dIgorICogICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgQ09ORklHX1NPVU5EX0VTMTM3MF9KT1lQT1JUX0JPT1Qga2x1ZGdlCisgKiAgICAxMi4wOC4xOTk5ICAgMC4yNyAgbW9kdWxlX2luaXQvX19zZXR1cCBmaXhlcworICogICAgMTkuMDguMTk5OSAgIDAuMjggIFNPVU5EX01JWEVSX0lNSVggZml4ZXMsIHJlcG9ydGVkIGJ5IEdpYW5sdWNhIDxnaWFsbHVjYUBtYWlsLnRpc2NhbGluZXQuaXQ+CisgKiAgICAzMS4wOC4xOTk5ICAgMC4yOSAgYWRkIHNwaW5fbG9ja19pbml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgY3VycmVudC0+c3RhdGUgPSB4IHdpdGggc2V0X2N1cnJlbnRfc3RhdGUoeCkKKyAqICAgIDAzLjA5LjE5OTkgICAwLjMwICBjaGFuZ2UgcmVhZCBzZW1hbnRpY3MgZm9yIE1JREkgdG8gbWF0Y2gKKyAqICAgICAgICAgICAgICAgICAgICAgICBPU1MgbW9yZSBjbG9zZWx5OyByZW1vdmUgcG9zc2libGUgd2FrZXVwIHJhY2UKKyAqICAgIDI4LjEwLjE5OTkgICAwLjMxICBNb3JlIHdhaXRxdWV1ZSByYWNlcyBmaXhlZAorICogICAgMDguMDEuMjAwMCAgIDAuMzIgIFByZXZlbnQgc29tZSBpb2N0bCdzIGZyb20gcmV0dXJuaW5nIGJhZCBjb3VudCB2YWx1ZXMgb24gdW5kZXJydW4vb3ZlcnJ1bjsKKyAqICAgICAgICAgICAgICAgICAgICAgICBUaW0gSmFuaWsncyBCU0UgKEJlZGV2aWxsZWQgU291bmQgRW5naW5lKSBmb3VuZCB0aGlzCisgKiAgICAwNy4wMi4yMDAwICAgMC4zMyAgVXNlIHBjaV9hbGxvY19jb25zaXN0ZW50IGFuZCBwY2lfcmVnaXN0ZXJfZHJpdmVyCisgKiAgICAyMS4xMS4yMDAwICAgMC4zNCAgSW5pdGlhbGl6ZSBkbWEgYnVmZmVycyBpbiBwb2xsLCBvdGhlcndpc2UgcG9sbCBtYXkgcmV0dXJuIGEgYm9ndXMgbWFzaworICogICAgMTIuMTIuMjAwMCAgIDAuMzUgIE1vcmUgZG1hIGJ1ZmZlciBpbml0aWFsaXphdGlvbnMsIHBhdGNoIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICBUamVlcmQgTXVsZGVyIDx0amVlcmQubXVsZGVyQGZ1aml0c3Utc2llbWVucy5jb20+CisgKiAgICAwNy4wMS4yMDAxICAgMC4zNiAgVGltZW91dCBjaGFuZ2UgaW4gd3Jjb2RlYyBhcyByZXF1ZXN0ZWQgYnkgRnJhbmsgS2xlbW0gPHBma0BmdWNocy5vZmZsLnVuaS1qZW5hLmRlPgorICogICAgMzEuMDEuMjAwMSAgIDAuMzcgIFJlZ2lzdGVyL1VucmVnaXN0ZXIgZ2FtZXBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBGaXggU0VUVFJJR0dFUiBub24gT1NTIEFQSSBjb25mb3JtaXR5CisgKiAgICAwMy4wMS4yMDAzICAgMC4zOCAgb3Blbl9tb2RlIGZpeGVzIGZyb20gR2VvcmcgQWNoZXIgPGFjaGVyQGluLnR1bS5kZT4KKyAqCisgKiBzb21lIGltcG9ydGFudCB0aGluZ3MgbWlzc2luZyBpbiBFbnNvbmlxIGRvY3VtZW50YXRpb246CisgKgorICogRXhwZXJpbWVudGFsIFBDTEtESVYgcmVzdWx0czogIHBsYXkgdGhlIHNhbWUgd2F2ZWZvcm1zIG9uIGJvdGggREFDMSBhbmQgREFDMgorICogYW5kIHZhcnkgUENMS0RJViB0byBvYnRhaW4gemVybyBiZWF0LgorICogIDU1MTJzcHM6ICAyNTQKKyAqIDQ0MTAwc3BzOiAgIDMwCisgKiBzZWVtcyB0byBiZSBmcyA9IDE0MTEyMDAvKFBDTEtESVYrMikKKyAqCisgKiBzaG91bGQgZmluZCBvdXQgd2hlbiBjdXJyX3NhbXBsZV9jdCBpcyBjbGVhcmVkIGFuZAorICogd2hlcmUgZXhhY3RseSB0aGUgQ0NCIGZldGNoZXMgZGF0YQorICoKKyAqIFRoZSBjYXJkIHVzZXMgYSAyMi41NzkyIE1IeiBjcnlzdGFsLgorICogVGhlIExJTkVJTiBqYWNrIG1heSBiZSBjb252ZXJ0ZWQgdG8gYW4gQU9VVCBqYWNrIGJ5CisgKiBzZXR0aW5nIHBpbiA0NyAoWENUTDApIG9mIHRoZSBFUzEzNzAgdG8gaGlnaC4KKyAqIFBpbiA0OCAoWENUTDEpIG9mIHRoZSBFUzEzNzAgc2V0cyB0aGUgKzVWIGJpYXMgZm9yIGFuIGVsZWN0cmV0bWljCisgKiAKKyAqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI3VuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworI2RlZmluZSBEQkcoeCkge30KKy8qI2RlZmluZSBEQkcoeCkge3h9Ki8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9FTlNPTklRCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRU5TT05JUSAgICAgICAgMHgxMjc0ICAgIAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcwIDB4NTAwMAorI2VuZGlmCisKKyNkZWZpbmUgRVMxMzcwX01BR0lDICAoKFBDSV9WRU5ET1JfSURfRU5TT05JUTw8MTYpfFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzApCisKKyNkZWZpbmUgRVMxMzcwX0VYVEVOVCAgICAgICAgICAgICAweDQwCisjZGVmaW5lIEpPWV9FWFRFTlQgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIEVTMTM3MF9SRUdfQ09OVFJPTCAgICAgICAgMHgwMAorI2RlZmluZSBFUzEzNzBfUkVHX1NUQVRVUyAgICAgICAgIDB4MDQKKyNkZWZpbmUgRVMxMzcwX1JFR19VQVJUX0RBVEEgICAgICAweDA4CisjZGVmaW5lIEVTMTM3MF9SRUdfVUFSVF9TVEFUVVMgICAgMHgwOQorI2RlZmluZSBFUzEzNzBfUkVHX1VBUlRfQ09OVFJPTCAgIDB4MDkKKyNkZWZpbmUgRVMxMzcwX1JFR19VQVJUX1RFU1QgICAgICAweDBhCisjZGVmaW5lIEVTMTM3MF9SRUdfTUVNUEFHRSAgICAgICAgMHgwYworI2RlZmluZSBFUzEzNzBfUkVHX0NPREVDICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCAweDIwCisjZGVmaW5lIEVTMTM3MF9SRUdfREFDMV9TQ09VTlQgICAgMHgyNAorI2RlZmluZSBFUzEzNzBfUkVHX0RBQzJfU0NPVU5UICAgIDB4MjgKKyNkZWZpbmUgRVMxMzcwX1JFR19BRENfU0NPVU5UICAgICAweDJjCisKKyNkZWZpbmUgRVMxMzcwX1JFR19EQUMxX0ZSQU1FQURSICAgIDB4YzMwCisjZGVmaW5lIEVTMTM3MF9SRUdfREFDMV9GUkFNRUNOVCAgICAweGMzNAorI2RlZmluZSBFUzEzNzBfUkVHX0RBQzJfRlJBTUVBRFIgICAgMHhjMzgKKyNkZWZpbmUgRVMxMzcwX1JFR19EQUMyX0ZSQU1FQ05UICAgIDB4YzNjCisjZGVmaW5lIEVTMTM3MF9SRUdfQURDX0ZSQU1FQURSICAgICAweGQzMAorI2RlZmluZSBFUzEzNzBfUkVHX0FEQ19GUkFNRUNOVCAgICAgMHhkMzQKKyNkZWZpbmUgRVMxMzcwX1JFR19QSEFOVE9NX0ZSQU1FQURSIDB4ZDM4CisjZGVmaW5lIEVTMTM3MF9SRUdfUEhBTlRPTV9GUkFNRUNOVCAweGQzYworCisjZGVmaW5lIEVTMTM3MF9GTVRfVThfTU9OTyAgICAgMAorI2RlZmluZSBFUzEzNzBfRk1UX1U4X1NURVJFTyAgIDEKKyNkZWZpbmUgRVMxMzcwX0ZNVF9TMTZfTU9OTyAgICAyCisjZGVmaW5lIEVTMTM3MF9GTVRfUzE2X1NURVJFTyAgMworI2RlZmluZSBFUzEzNzBfRk1UX1NURVJFTyAgICAgIDEKKyNkZWZpbmUgRVMxMzcwX0ZNVF9TMTYgICAgICAgICAyCisjZGVmaW5lIEVTMTM3MF9GTVRfTUFTSyAgICAgICAgMworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NpemVbXSA9IHsgMSwgMiwgMiwgNCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAwLCAxLCAxLCAyIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkYWMxX3NhbXBsZXJhdGVbXSA9IHsgNTUxMiwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9OworCisjZGVmaW5lIERBQzJfU1JUT0RJVih4KSAoKCgxNDExMjAwKyh4KS8yKS8oeCkpLTIpCisjZGVmaW5lIERBQzJfRElWVE9TUih4KSAoMTQxMTIwMC8oKHgpKzIpKQorCisjZGVmaW5lIENUUkxfQURDX1NUT1AgICAweDgwMDAwMDAwICAvKiAxID0gQURDIHN0b3BwZWQgKi8KKyNkZWZpbmUgQ1RSTF9YQ1RMMSAgICAgIDB4NDAwMDAwMDAgIC8qIGVsZWN0cmV0IG1pYyBiaWFzICovCisjZGVmaW5lIENUUkxfT1BFTiAgICAgICAweDIwMDAwMDAwICAvKiBubyBmdW5jdGlvbiwgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4gKi8KKyNkZWZpbmUgQ1RSTF9QQ0xLRElWICAgIDB4MWZmZjAwMDAgIC8qIEFEQy9EQUMyIGNsb2NrIGRpdmlkZXIgKi8KKyNkZWZpbmUgQ1RSTF9TSF9QQ0xLRElWIDE2CisjZGVmaW5lIENUUkxfTVNGTVRTRUwgICAweDAwMDA4MDAwICAvKiBNUEVHIHNlcmlhbCBkYXRhIGZtdDogMCA9IFNvbnksIDEgPSBJMlMgKi8KKyNkZWZpbmUgQ1RSTF9NX1NCQiAgICAgIDB4MDAwMDQwMDAgIC8qIERBQzIgY2xvY2s6IDAgPSBQQ0xLRElWLCAxID0gTVBFRyAqLworI2RlZmluZSBDVFJMX1dUU1JTRUwgICAgMHgwMDAwMzAwMCAgLyogREFDMSBjbG9jayBmcmVxOiAwPTU1MTIsIDE9MTEwMjUsIDI9MjIwNTAsIDM9NDQxMDAgKi8KKyNkZWZpbmUgQ1RSTF9TSF9XVFNSU0VMIDEyCisjZGVmaW5lIENUUkxfREFDX1NZTkMgICAweDAwMDAwODAwICAvKiAxID0gREFDMiBydW5zIG9mZiBEQUMxIGNsb2NrICovCisjZGVmaW5lIENUUkxfQ0NCX0lOVFJNICAweDAwMDAwNDAwICAvKiAxID0gQ0NCICJ2b2ljZSIgaW50cyBlbmFibGVkICovCisjZGVmaW5lIENUUkxfTV9DQiAgICAgICAweDAwMDAwMjAwICAvKiByZWNvcmRpbmcgc291cmNlOiAwID0gQURDLCAxID0gTVBFRyAqLworI2RlZmluZSBDVFJMX1hDVEwwICAgICAgMHgwMDAwMDEwMCAgLyogMCA9IExpbmUgaW4sIDEgPSBMaW5lIG91dCAqLworI2RlZmluZSBDVFJMX0JSRVEgICAgICAgMHgwMDAwMDA4MCAgLyogMSA9IHRlc3QgbW9kZSAoaW50ZXJuYWwgbWVtIHRlc3QpICovCisjZGVmaW5lIENUUkxfREFDMV9FTiAgICAweDAwMDAwMDQwICAvKiBlbmFibGUgREFDMSAqLworI2RlZmluZSBDVFJMX0RBQzJfRU4gICAgMHgwMDAwMDAyMCAgLyogZW5hYmxlIERBQzIgKi8KKyNkZWZpbmUgQ1RSTF9BRENfRU4gICAgIDB4MDAwMDAwMTAgIC8qIGVuYWJsZSBBREMgKi8KKyNkZWZpbmUgQ1RSTF9VQVJUX0VOICAgIDB4MDAwMDAwMDggIC8qIGVuYWJsZSBNSURJIHVhcnQgKi8KKyNkZWZpbmUgQ1RSTF9KWVNUS19FTiAgIDB4MDAwMDAwMDQgIC8qIGVuYWJsZSBKb3lzdGljayBwb3J0IChwcmVzdW1hYmx5IGF0IGFkZHJlc3MgMHgyMDApICovCisjZGVmaW5lIENUUkxfQ0RDX0VOICAgICAweDAwMDAwMDAyICAvKiBlbmFibGUgc2VyaWFsIChDT0RFQykgaW50ZXJmYWNlICovCisjZGVmaW5lIENUUkxfU0VSUl9ESVMgICAweDAwMDAwMDAxICAvKiAxID0gZGlzYWJsZSBQQ0kgU0VSUiBzaWduYWwgKi8KKworI2RlZmluZSBTVEFUX0lOVFIgICAgICAgMHg4MDAwMDAwMCAgLyogd2lyZWQgb3Igb2YgYWxsIGludGVycnVwdCBiaXRzICovCisjZGVmaW5lIFNUQVRfQ1NUQVQgICAgICAweDAwMDAwNDAwICAvKiAxID0gY29kZWMgYnVzeSBvciBjb2RlYyB3cml0ZSBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBTVEFUX0NCVVNZICAgICAgMHgwMDAwMDIwMCAgLyogMSA9IGNvZGVjIGJ1c3kgKi8KKyNkZWZpbmUgU1RBVF9DV1JJUCAgICAgIDB4MDAwMDAxMDAgIC8qIDEgPSBjb2RlYyB3cml0ZSBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBTVEFUX1ZDICAgICAgICAgMHgwMDAwMDA2MCAgLyogQ0NCIGludCBzb3VyY2UsIDA9REFDMSwgMT1EQUMyLCAyPUFEQywgMz11bmRlZiAqLworI2RlZmluZSBTVEFUX1NIX1ZDICAgICAgNQorI2RlZmluZSBTVEFUX01DQ0IgICAgICAgMHgwMDAwMDAxMCAgLyogQ0NCIGludCBwZW5kaW5nICovCisjZGVmaW5lIFNUQVRfVUFSVCAgICAgICAweDAwMDAwMDA4ICAvKiBVQVJUIGludCBwZW5kaW5nICovCisjZGVmaW5lIFNUQVRfREFDMSAgICAgICAweDAwMDAwMDA0ICAvKiBEQUMxIGludCBwZW5kaW5nICovCisjZGVmaW5lIFNUQVRfREFDMiAgICAgICAweDAwMDAwMDAyICAvKiBEQUMyIGludCBwZW5kaW5nICovCisjZGVmaW5lIFNUQVRfQURDICAgICAgICAweDAwMDAwMDAxICAvKiBBREMgaW50IHBlbmRpbmcgKi8KKworI2RlZmluZSBVU1RBVF9SWElOVCAgICAgMHg4MCAgICAgICAgLyogVUFSVCByeCBpbnQgcGVuZGluZyAqLworI2RlZmluZSBVU1RBVF9UWElOVCAgICAgMHgwNCAgICAgICAgLyogVUFSVCB0eCBpbnQgcGVuZGluZyAqLworI2RlZmluZSBVU1RBVF9UWFJEWSAgICAgMHgwMiAgICAgICAgLyogVUFSVCB0eCByZWFkeSAqLworI2RlZmluZSBVU1RBVF9SWFJEWSAgICAgMHgwMSAgICAgICAgLyogVUFSVCByeCByZWFkeSAqLworCisjZGVmaW5lIFVDVFJMX1JYSU5URU4gICAweDgwICAgICAgICAvKiAxID0gZW5hYmxlIFJYIGludHMgKi8KKyNkZWZpbmUgVUNUUkxfVFhJTlRFTiAgIDB4NjAgICAgICAgIC8qIFRYIGludCBlbmFibGUgZmllbGQgbWFzayAqLworI2RlZmluZSBVQ1RSTF9FTkFfVFhJTlQgMHgyMCAgICAgICAgLyogZW5hYmxlIFRYIGludCAqLworI2RlZmluZSBVQ1RSTF9DTlRSTCAgICAgMHgwMyAgICAgICAgLyogY29udHJvbCBmaWVsZCAqLworI2RlZmluZSBVQ1RSTF9DTlRSTF9TV1IgMHgwMyAgICAgICAgLyogc29mdHdhcmUgcmVzZXQgY29tbWFuZCAqLworCisjZGVmaW5lIFNDVFJMX1AyRU5ESU5DICAgIDB4MDAzODAwMDAgIC8qICAqLworI2RlZmluZSBTQ1RSTF9TSF9QMkVORElOQyAxOQorI2RlZmluZSBTQ1RSTF9QMlNUSU5DICAgICAweDAwMDcwMDAwICAvKiAgKi8KKyNkZWZpbmUgU0NUUkxfU0hfUDJTVElOQyAgMTYKKyNkZWZpbmUgU0NUUkxfUjFMT09QU0VMICAgMHgwMDAwODAwMCAgLyogMCA9IGxvb3AgbW9kZSAqLworI2RlZmluZSBTQ1RSTF9QMkxPT1BTRUwgICAweDAwMDA0MDAwICAvKiAwID0gbG9vcCBtb2RlICovCisjZGVmaW5lIFNDVFJMX1AxTE9PUFNFTCAgIDB4MDAwMDIwMDAgIC8qIDAgPSBsb29wIG1vZGUgKi8KKyNkZWZpbmUgU0NUUkxfUDJQQVVTRSAgICAgMHgwMDAwMTAwMCAgLyogMSA9IHBhdXNlIG1vZGUgKi8KKyNkZWZpbmUgU0NUUkxfUDFQQVVTRSAgICAgMHgwMDAwMDgwMCAgLyogMSA9IHBhdXNlIG1vZGUgKi8KKyNkZWZpbmUgU0NUUkxfUjFJTlRFTiAgICAgMHgwMDAwMDQwMCAgLyogZW5hYmxlIGludGVycnVwdCAqLworI2RlZmluZSBTQ1RSTF9QMklOVEVOICAgICAweDAwMDAwMjAwICAvKiBlbmFibGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFNDVFJMX1AxSU5URU4gICAgIDB4MDAwMDAxMDAgIC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0NUUkxfUDFTQ1RSTEQgICAgMHgwMDAwMDA4MCAgLyogcmVsb2FkIHNhbXBsZSBjb3VudCByZWdpc3RlciBmb3IgREFDMSAqLworI2RlZmluZSBTQ1RSTF9QMkRBQ1NFTiAgICAweDAwMDAwMDQwICAvKiAxID0gREFDMiBwbGF5IGJhY2sgbGFzdCBzYW1wbGUgd2hlbiBkaXNhYmxlZCAqLworI2RlZmluZSBTQ1RSTF9SMVNFQiAgICAgICAweDAwMDAwMDIwICAvKiAxID0gMTZiaXQgKi8KKyNkZWZpbmUgU0NUUkxfUjFTTUIgICAgICAgMHgwMDAwMDAxMCAgLyogMSA9IHN0ZXJlbyAqLworI2RlZmluZSBTQ1RSTF9SMUZNVCAgICAgICAweDAwMDAwMDMwICAvKiBmb3JtYXQgbWFzayAqLworI2RlZmluZSBTQ1RSTF9TSF9SMUZNVCAgICA0CisjZGVmaW5lIFNDVFJMX1AyU0VCICAgICAgIDB4MDAwMDAwMDggIC8qIDEgPSAxNmJpdCAqLworI2RlZmluZSBTQ1RSTF9QMlNNQiAgICAgICAweDAwMDAwMDA0ICAvKiAxID0gc3RlcmVvICovCisjZGVmaW5lIFNDVFJMX1AyRk1UICAgICAgIDB4MDAwMDAwMGMgIC8qIGZvcm1hdCBtYXNrICovCisjZGVmaW5lIFNDVFJMX1NIX1AyRk1UICAgIDIKKyNkZWZpbmUgU0NUUkxfUDFTRUIgICAgICAgMHgwMDAwMDAwMiAgLyogMSA9IDE2Yml0ICovCisjZGVmaW5lIFNDVFJMX1AxU01CICAgICAgIDB4MDAwMDAwMDEgIC8qIDEgPSBzdGVyZW8gKi8KKyNkZWZpbmUgU0NUUkxfUDFGTVQgICAgICAgMHgwMDAwMDAwMyAgLyogZm9ybWF0IG1hc2sgKi8KKyNkZWZpbmUgU0NUUkxfU0hfUDFGTVQgICAgMAorCisvKiBtaXNjIHN0dWZmICovCisKKyNkZWZpbmUgRk1PREVfREFDICAgICAgICAgNCAgICAgICAgICAgLyogc2xpZ2h0IG1pc3VzZSBvZiBtb2RlX3QgKi8KKworLyogTUlESSBidWZmZXIgc2l6ZXMgKi8KKworI2RlZmluZSBNSURJSU5CVUYgIDI1NgorI2RlZmluZSBNSURJT1VUQlVGIDI1NgorCisjZGVmaW5lIEZNT0RFX01JRElfU0hJRlQgMworI2RlZmluZSBGTU9ERV9NSURJX1JFQUQgIChGTU9ERV9SRUFEIDw8IEZNT0RFX01JRElfU0hJRlQpCisjZGVmaW5lIEZNT0RFX01JRElfV1JJVEUgKEZNT0RFX1dSSVRFIDw8IEZNT0RFX01JRElfU0hJRlQpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgZXMxMzcwX3N0YXRlIHsKKwkvKiBtYWdpYyAqLworCXVuc2lnbmVkIGludCBtYWdpYzsKKworCS8qIGxpc3Qgb2YgZXMxMzcwIGRldmljZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldnM7CisKKwkvKiB0aGUgY29ycmVzcG9uZGluZyBwY2lfZGV2IHN0cnVjdHVyZSAqLworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgZGV2X2F1ZGlvOworCWludCBkZXZfbWl4ZXI7CisJaW50IGRldl9kYWM7CisJaW50IGRldl9taWRpOworCQorCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXVuc2lnbmVkIGxvbmcgaW87IC8qIGxvbmcgZm9yIFNQQVJDICovCisJdW5zaWduZWQgaW50IGlycTsKKworCS8qIG1peGVyIHJlZ2lzdGVyczsgdGhlcmUgaXMgbm8gSFcgcmVhZGJhY2sgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBzaG9ydCB2b2xbMTBdOworCQl1bnNpZ25lZCBpbnQgcmVjc3JjOworCQl1bnNpZ25lZCBpbnQgbW9kY250OworCQl1bnNpZ25lZCBzaG9ydCBtaWNwcmVhbXA7CisJICAgICAgICB1bnNpZ25lZCBpbnQgaW1peDsKKwl9IG1peDsKKworCS8qIHdhdmUgc3R1ZmYgKi8KKwl1bnNpZ25lZCBjdHJsOworCXVuc2lnbmVkIHNjdHJsOworCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW07CisJbW9kZV90IG9wZW5fbW9kZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwlzdHJ1Y3QgZG1hYnVmIHsKKwkJdm9pZCAqcmF3YnVmOworCQlkbWFfYWRkcl90IGRtYWFkZHI7CisJCXVuc2lnbmVkIGJ1Zm9yZGVyOworCQl1bnNpZ25lZCBudW1mcmFnOworCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CisJCXVuc2lnbmVkIGh3cHRyLCBzd3B0cjsKKwkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CisJCWludCBjb3VudDsKKwkJdW5zaWduZWQgZXJyb3I7IC8qIG92ZXIvdW5kZXJydW4gKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQl1bnNpZ25lZCBmcmFnc2l6ZTsKKwkJdW5zaWduZWQgZG1hc2l6ZTsKKwkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7CisJCS8qIE9TUyBzdHVmZiAqLworCQl1bnNpZ25lZCBtYXBwZWQ6MTsKKwkJdW5zaWduZWQgcmVhZHk6MTsKKwkJdW5zaWduZWQgZW5kY2xlYXJlZDoxOworCQl1bnNpZ25lZCBlbmFibGVkOjE7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwl9IGRtYV9kYWMxLCBkbWFfZGFjMiwgZG1hX2FkYzsKKworCS8qIFRoZSBmb2xsb3dpbmcgYnVmZmVyIGlzIHVzZWQgdG8gcG9pbnQgdGhlIHBoYW50b20gd3JpdGUgY2hhbm5lbCB0by4gKi8KKwl1bnNpZ25lZCBjaGFyICpidWdidWZfY3B1OworCWRtYV9hZGRyX3QgYnVnYnVmX2RtYTsKKworCS8qIG1pZGkgc3R1ZmYgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpcmQsIGl3ciwgaWNudDsKKwkJdW5zaWduZWQgb3JkLCBvd3IsIG9jbnQ7CisJCXdhaXRfcXVldWVfaGVhZF90IGl3YWl0OworCQl3YWl0X3F1ZXVlX2hlYWRfdCBvd2FpdDsKKwkJdW5zaWduZWQgY2hhciBpYnVmW01JRElJTkJVRl07CisJCXVuc2lnbmVkIGNoYXIgb2J1ZltNSURJT1VUQlVGXTsKKwl9IG1pZGk7CisKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBMSVNUX0hFQUQoZGV2cyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxkMih1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCByID0gMDsKKwkKKwlpZiAoeCA+PSAweDEwMDAwKSB7CisJCXggPj49IDE2OworCQlyICs9IDE2OworCX0KKwlpZiAoeCA+PSAweDEwMCkgeworCQl4ID4+PSA4OworCQlyICs9IDg7CisJfQorCWlmICh4ID49IDB4MTApIHsKKwkJeCA+Pj0gNDsKKwkJciArPSA0OworCX0KKwlpZiAoeCA+PSA0KSB7CisJCXggPj49IDI7CisJCXIgKz0gMjsKKwl9CisJaWYgKHggPj0gMikKKwkJcisrOworCXJldHVybiByOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgd3Jjb2RlYyhzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyIGlkeCwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgdG1vID0gamlmZmllcyArIEhaLzEwLCBqOworCQorCWRvIHsKKwkJaiA9IGppZmZpZXM7CisJCWlmICghKGlubChzLT5pbytFUzEzNzBfUkVHX1NUQVRVUykgJiBTVEFUX0NTVEFUKSkgeworCQkJb3V0dygoKCh1bnNpZ25lZCBzaG9ydClpZHgpPDw4KXxkYXRhLCBzLT5pbytFUzEzNzBfUkVHX0NPREVDKTsKKwkJCXJldHVybjsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0gd2hpbGUgKChzaWduZWQpKHRtby1qKSA+IDApOworCXByaW50ayhLRVJOX0VSUiAiZXMxMzcwOiB3cml0ZSB0byBjb2RlYyByZWdpc3RlciB0aW1lb3V0XG4iKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmN0cmwgJj0gfkNUUkxfQURDX0VOOworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9kYWMxKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+Y3RybCAmPSB+Q1RSTF9EQUMxX0VOOworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9kYWMyKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+Y3RybCAmPSB+Q1RSTF9EQUMyX0VOOworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMxKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBmcmFncmVtYWluLCBmc2hpZnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPmN0cmwgJiBDVFJMX0RBQzFfRU4pICYmIChzLT5kbWFfZGFjMS5tYXBwZWQgfHwgcy0+ZG1hX2RhYzEuY291bnQgPiAwKQorCSAgICAmJiBzLT5kbWFfZGFjMS5yZWFkeSkgeworCQlzLT5jdHJsIHw9IENUUkxfREFDMV9FTjsKKwkJcy0+c2N0cmwgPSAocy0+c2N0cmwgJiB+KFNDVFJMX1AxTE9PUFNFTCB8IFNDVFJMX1AxUEFVU0UgfCBTQ1RSTF9QMVNDVFJMRCkpIHwgU0NUUkxfUDFJTlRFTjsKKwkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCWZyYWdyZW1haW4gPSAoKC0gcy0+ZG1hX2RhYzEuaHdwdHIpICYgKHMtPmRtYV9kYWMxLmZyYWdzaXplLTEpKTsKKwkJZnNoaWZ0ID0gc2FtcGxlX3NoaWZ0WyhzLT5zY3RybCAmIFNDVFJMX1AxRk1UKSA+PiBTQ1RSTF9TSF9QMUZNVF07CisJCWlmIChmcmFncmVtYWluIDwgMipmc2hpZnQpCisJCQlmcmFncmVtYWluID0gcy0+ZG1hX2RhYzEuZnJhZ3NpemU7CisJCW91dGwoKGZyYWdyZW1haW4gPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MF9SRUdfREFDMV9TQ09VTlQpOworCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJCW91dGwoKHMtPmRtYV9kYWMxLmZyYWdzaXplID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzBfUkVHX0RBQzFfU0NPVU5UKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworc3RhdGljIHZvaWQgc3RhcnRfZGFjMihzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgZnJhZ3JlbWFpbiwgZnNoaWZ0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5jdHJsICYgQ1RSTF9EQUMyX0VOKSAmJiAocy0+ZG1hX2RhYzIubWFwcGVkIHx8IHMtPmRtYV9kYWMyLmNvdW50ID4gMCkKKwkgICAgJiYgcy0+ZG1hX2RhYzIucmVhZHkpIHsKKwkJcy0+Y3RybCB8PSBDVFJMX0RBQzJfRU47CisJCXMtPnNjdHJsID0gKHMtPnNjdHJsICYgfihTQ1RSTF9QMkxPT1BTRUwgfCBTQ1RSTF9QMlBBVVNFIHwgU0NUUkxfUDJEQUNTRU4gfCAKKwkJCQkJIFNDVFJMX1AyRU5ESU5DIHwgU0NUUkxfUDJTVElOQykpIHwgU0NUUkxfUDJJTlRFTiB8CisJCQkoKChzLT5zY3RybCAmIFNDVFJMX1AyRk1UKSA/IDIgOiAxKSA8PCBTQ1RSTF9TSF9QMkVORElOQykgfCAKKwkJCSgwIDw8IFNDVFJMX1NIX1AyU1RJTkMpOworCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJZnJhZ3JlbWFpbiA9ICgoLSBzLT5kbWFfZGFjMi5od3B0cikgJiAocy0+ZG1hX2RhYzIuZnJhZ3NpemUtMSkpOworCQlmc2hpZnQgPSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUDJGTVQpID4+IFNDVFJMX1NIX1AyRk1UXTsKKwkJaWYgKGZyYWdyZW1haW4gPCAyKmZzaGlmdCkKKwkJCWZyYWdyZW1haW4gPSBzLT5kbWFfZGFjMi5mcmFnc2l6ZTsKKwkJb3V0bCgoZnJhZ3JlbWFpbiA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcwX1JFR19EQUMyX1NDT1VOVCk7CisJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwkJb3V0bCgocy0+ZG1hX2RhYzIuZnJhZ3NpemUgPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MF9SRUdfREFDMl9TQ09VTlQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGZyYWdyZW1haW4sIGZzaGlmdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+Y3RybCAmIENUUkxfQURDX0VOKSAmJiAocy0+ZG1hX2FkYy5tYXBwZWQgfHwgcy0+ZG1hX2FkYy5jb3VudCA8IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtIDIqcy0+ZG1hX2FkYy5mcmFnc2l6ZSkpCisJICAgICYmIHMtPmRtYV9hZGMucmVhZHkpIHsKKwkJcy0+Y3RybCB8PSBDVFJMX0FEQ19FTjsKKwkJcy0+c2N0cmwgPSAocy0+c2N0cmwgJiB+U0NUUkxfUjFMT09QU0VMKSB8IFNDVFJMX1IxSU5URU47CisJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCQlmcmFncmVtYWluID0gKCgtIHMtPmRtYV9hZGMuaHdwdHIpICYgKHMtPmRtYV9hZGMuZnJhZ3NpemUtMSkpOworCQlmc2hpZnQgPSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUjFGTVQpID4+IFNDVFJMX1NIX1IxRk1UXTsKKwkJaWYgKGZyYWdyZW1haW4gPCAyKmZzaGlmdCkKKwkJCWZyYWdyZW1haW4gPSBzLT5kbWFfYWRjLmZyYWdzaXplOworCQlvdXRsKChmcmFncmVtYWluID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzBfUkVHX0FEQ19TQ09VTlQpOworCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJCW91dGwoKHMtPmRtYV9hZGMuZnJhZ3NpemUgPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MF9SRUdfQURDX1NDT1VOVCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIERNQUJVRl9ERUZBVUxUT1JERVIgKDE3LVBBR0VfU0hJRlQpCisjZGVmaW5lIERNQUJVRl9NSU5PUkRFUiAxCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CisKKwlpZiAoZGItPnJhd2J1ZikgeworCQkvKiB1bmRvIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocy0+ZGV2LCBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyLCBkYi0+cmF3YnVmLCBkYi0+ZG1hYWRkcik7CisJfQorCWRiLT5yYXdidWYgPSBOVUxMOworCWRiLT5tYXBwZWQgPSBkYi0+cmVhZHkgPSAwOworfQorCitzdGF0aWMgaW50IHByb2dfZG1hYnVmKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiLCB1bnNpZ25lZCByYXRlLCB1bnNpZ25lZCBmbXQsIHVuc2lnbmVkIHJlZykKK3sKKwlpbnQgb3JkZXI7CisJdW5zaWduZWQgYnl0ZXBlcnNlYzsKKwl1bnNpZ25lZCBidWZzOworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWRiLT5od3B0ciA9IGRiLT5zd3B0ciA9IGRiLT50b3RhbF9ieXRlcyA9IGRiLT5jb3VudCA9IGRiLT5lcnJvciA9IGRiLT5lbmRjbGVhcmVkID0gMDsKKwlpZiAoIWRiLT5yYXdidWYpIHsKKwkJZGItPnJlYWR5ID0gZGItPm1hcHBlZCA9IDA7CisJCWZvciAob3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pCisJCQlpZiAoKGRiLT5yYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRiLT5kbWFhZGRyKSkpCisJCQkJYnJlYWs7CisJCWlmICghZGItPnJhd2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlkYi0+YnVmb3JkZXIgPSBvcmRlcjsKKwkJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCX0KKwlmbXQgJj0gRVMxMzcwX0ZNVF9NQVNLOworCWJ5dGVwZXJzZWMgPSByYXRlIDw8IHNhbXBsZV9zaGlmdFtmbXRdOworCWJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworCWlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVwZXJzZWMpCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwMCk7CisJCWVsc2UKKwkJCWRiLT5mcmFnc2hpZnQgPSBkYi0+b3NzZnJhZ3NoaWZ0OworCX0gZWxzZSB7CisJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAvKGRiLT5zdWJkaXZpc2lvbiA/IGRiLT5zdWJkaXZpc2lvbiA6IDEpKTsKKwkJaWYgKGRiLT5mcmFnc2hpZnQgPCAzKQorCQkJZGItPmZyYWdzaGlmdCA9IDM7CisJfQorCWRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl9CisJZGItPmZyYWdzaXplID0gMSA8PCBkYi0+ZnJhZ3NoaWZ0OworCWlmIChkYi0+b3NzbWF4ZnJhZ3MgPj0gNCAmJiBkYi0+b3NzbWF4ZnJhZ3MgPCBkYi0+bnVtZnJhZykKKwkJZGItPm51bWZyYWcgPSBkYi0+b3NzbWF4ZnJhZ3M7CisJZGItPmZyYWdzYW1wbGVzID0gZGItPmZyYWdzaXplID4+IHNhbXBsZV9zaGlmdFtmbXRdOworCWRiLT5kbWFzaXplID0gZGItPm51bWZyYWcgPDwgZGItPmZyYWdzaGlmdDsKKwltZW1zZXQoZGItPnJhd2J1ZiwgKGZtdCAmIEVTMTM3MF9GTVRfUzE2KSA/IDAgOiAweDgwLCBkYi0+ZG1hc2l6ZSk7CisJb3V0bCgocmVnID4+IDgpICYgMTUsIHMtPmlvK0VTMTM3MF9SRUdfTUVNUEFHRSk7CisJb3V0bChkYi0+ZG1hYWRkciwgcy0+aW8rKHJlZyAmIDB4ZmYpKTsKKwlvdXRsKChkYi0+ZG1hc2l6ZSA+PiAyKS0xLCBzLT5pbysoKHJlZyArIDQpICYgMHhmZikpOworCWRiLT5lbmFibGVkID0gMTsKKwlkYi0+cmVhZHkgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9hZGMoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcykKK3sKKwlzdG9wX2FkYyhzKTsKKwlyZXR1cm4gcHJvZ19kbWFidWYocywgJnMtPmRtYV9hZGMsIERBQzJfRElWVE9TUigocy0+Y3RybCAmIENUUkxfUENMS0RJVikgPj4gQ1RSTF9TSF9QQ0xLRElWKSwKKwkJCSAgIChzLT5zY3RybCA+PiBTQ1RSTF9TSF9SMUZNVCkgJiBFUzEzNzBfRk1UX01BU0ssIEVTMTM3MF9SRUdfQURDX0ZSQU1FQURSKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfZGFjMihzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzKQoreworCXN0b3BfZGFjMihzKTsKKwlyZXR1cm4gcHJvZ19kbWFidWYocywgJnMtPmRtYV9kYWMyLCBEQUMyX0RJVlRPU1IoKHMtPmN0cmwgJiBDVFJMX1BDTEtESVYpID4+IENUUkxfU0hfUENMS0RJViksCisJCQkgICAocy0+c2N0cmwgPj4gU0NUUkxfU0hfUDJGTVQpICYgRVMxMzcwX0ZNVF9NQVNLLCBFUzEzNzBfUkVHX0RBQzJfRlJBTUVBRFIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9kYWMxKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJc3RvcF9kYWMxKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYzEsIGRhYzFfc2FtcGxlcmF0ZVsocy0+Y3RybCAmIENUUkxfV1RTUlNFTCkgPj4gQ1RSTF9TSF9XVFNSU0VMXSwKKwkJCSAgIChzLT5zY3RybCA+PiBTQ1RSTF9TSF9QMUZNVCkgJiBFUzEzNzBfRk1UX01BU0ssIEVTMTM3MF9SRUdfREFDMV9GUkFNRUFEUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X2h3cHRyKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiLCB1bnNpZ25lZCByZWcpCit7CisJdW5zaWduZWQgaHdwdHIsIGRpZmY7CisKKwlvdXRsKChyZWcgPj4gOCkgJiAxNSwgcy0+aW8rRVMxMzcwX1JFR19NRU1QQUdFKTsKKwlod3B0ciA9IChpbmwocy0+aW8rKHJlZyAmIDB4ZmYpKSA+PiAxNCkgJiAweDNmZmZjOworCWRpZmYgPSAoZGItPmRtYXNpemUgKyBod3B0ciAtIGRiLT5od3B0cikgJSBkYi0+ZG1hc2l6ZTsKKwlkYi0+aHdwdHIgPSBod3B0cjsKKwlyZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2FkdmFuY2Uodm9pZCAqYnVmLCB1bnNpZ25lZCBic2l6ZSwgdW5zaWduZWQgYnB0ciwgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKGJwdHIgKyBsZW4gPiBic2l6ZSkgeworCQl1bnNpZ25lZCB4ID0gYnNpemUgLSBicHRyOworCQltZW1zZXQoKChjaGFyICopYnVmKSArIGJwdHIsIGMsIHgpOworCQlicHRyID0gMDsKKwkJbGVuIC09IHg7CisJfQorCW1lbXNldCgoKGNoYXIgKilidWYpICsgYnB0ciwgYywgbGVuKTsKK30KKworLyogY2FsbCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgdm9pZCBlczEzNzBfdXBkYXRlX3B0cihzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzKQoreworCWludCBkaWZmOworCisJLyogdXBkYXRlIEFEQyBwb2ludGVyICovCisJaWYgKHMtPmN0cmwgJiBDVFJMX0FEQ19FTikgeworCQlkaWZmID0gZ2V0X2h3cHRyKHMsICZzLT5kbWFfYWRjLCBFUzEzNzBfUkVHX0FEQ19GUkFNRUNOVCk7CisJCXMtPmRtYV9hZGMudG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJcy0+ZG1hX2FkYy5jb3VudCArPSBkaWZmOworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpIAorCQkJd2FrZV91cCgmcy0+ZG1hX2FkYy53YWl0KTsKKwkJaWYgKCFzLT5kbWFfYWRjLm1hcHBlZCkgeworCQkJaWYgKHMtPmRtYV9hZGMuY291bnQgPiAoc2lnbmVkKShzLT5kbWFfYWRjLmRtYXNpemUgLSAoKDMgKiBzLT5kbWFfYWRjLmZyYWdzaXplKSA+PiAxKSkpIHsKKwkJCQlzLT5jdHJsICY9IH5DVFJMX0FEQ19FTjsKKwkJCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJCQkJcy0+ZG1hX2FkYy5lcnJvcisrOworCQkJfQorCQl9CisJfQorCS8qIHVwZGF0ZSBEQUMxIHBvaW50ZXIgKi8KKwlpZiAocy0+Y3RybCAmIENUUkxfREFDMV9FTikgeworCQlkaWZmID0gZ2V0X2h3cHRyKHMsICZzLT5kbWFfZGFjMSwgRVMxMzcwX1JFR19EQUMxX0ZSQU1FQ05UKTsKKwkJcy0+ZG1hX2RhYzEudG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkgeworCQkJcy0+ZG1hX2RhYzEuY291bnQgKz0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjMS5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMxLmZyYWdzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMxLndhaXQpOworCQl9IGVsc2UgeworCQkJcy0+ZG1hX2RhYzEuY291bnQgLT0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjMS5jb3VudCA8PSAwKSB7CisJCQkJcy0+Y3RybCAmPSB+Q1RSTF9EQUMxX0VOOworCQkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwkJCQlzLT5kbWFfZGFjMS5lcnJvcisrOworCQkJfSBlbHNlIGlmIChzLT5kbWFfZGFjMS5jb3VudCA8PSAoc2lnbmVkKXMtPmRtYV9kYWMxLmZyYWdzaXplICYmICFzLT5kbWFfZGFjMS5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzLT5kbWFfZGFjMS5yYXdidWYsIHMtPmRtYV9kYWMxLmRtYXNpemUsIHMtPmRtYV9kYWMxLnN3cHRyLCAKKwkJCQkJICAgICAgcy0+ZG1hX2RhYzEuZnJhZ3NpemUsIChzLT5zY3RybCAmIFNDVFJMX1AxU0VCKSA/IDAgOiAweDgwKTsKKwkJCQlzLT5kbWFfZGFjMS5lbmRjbGVhcmVkID0gMTsKKwkJCX0KKwkJCWlmIChzLT5kbWFfZGFjMS5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYzEuZnJhZ3NpemUgPD0gKHNpZ25lZClzLT5kbWFfZGFjMS5kbWFzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMxLndhaXQpOworCQl9CisJfQorCS8qIHVwZGF0ZSBEQUMyIHBvaW50ZXIgKi8KKwlpZiAocy0+Y3RybCAmIENUUkxfREFDMl9FTikgeworCQlkaWZmID0gZ2V0X2h3cHRyKHMsICZzLT5kbWFfZGFjMiwgRVMxMzcwX1JFR19EQUMyX0ZSQU1FQ05UKTsKKwkJcy0+ZG1hX2RhYzIudG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJaWYgKHMtPmRtYV9kYWMyLm1hcHBlZCkgeworCQkJcy0+ZG1hX2RhYzIuY291bnQgKz0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjMi5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMyLmZyYWdzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMyLndhaXQpOworCQl9IGVsc2UgeworCQkJcy0+ZG1hX2RhYzIuY291bnQgLT0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjMi5jb3VudCA8PSAwKSB7CisJCQkJcy0+Y3RybCAmPSB+Q1RSTF9EQUMyX0VOOworCQkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwkJCQlzLT5kbWFfZGFjMi5lcnJvcisrOworCQkJfSBlbHNlIGlmIChzLT5kbWFfZGFjMi5jb3VudCA8PSAoc2lnbmVkKXMtPmRtYV9kYWMyLmZyYWdzaXplICYmICFzLT5kbWFfZGFjMi5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzLT5kbWFfZGFjMi5yYXdidWYsIHMtPmRtYV9kYWMyLmRtYXNpemUsIHMtPmRtYV9kYWMyLnN3cHRyLCAKKwkJCQkJICAgICAgcy0+ZG1hX2RhYzIuZnJhZ3NpemUsIChzLT5zY3RybCAmIFNDVFJMX1AyU0VCKSA/IDAgOiAweDgwKTsKKwkJCQlzLT5kbWFfZGFjMi5lbmRjbGVhcmVkID0gMTsKKwkJCX0KKwkJCWlmIChzLT5kbWFfZGFjMi5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUgPD0gKHNpZ25lZClzLT5kbWFfZGFjMi5kbWFzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMyLndhaXQpOworCQl9CisJfQorfQorCisvKiBob2xkIHNwaW5sb2NrIGZvciB0aGUgZm9sbG93aW5nISAqLworc3RhdGljIHZvaWQgZXMxMzcwX2hhbmRsZV9taWRpKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwlpbnQgd2FrZTsKKworCWlmICghKHMtPmN0cmwgJiBDVFJMX1VBUlRfRU4pKQorCQlyZXR1cm47CisJd2FrZSA9IDA7CisJd2hpbGUgKGluYihzLT5pbytFUzEzNzBfUkVHX1VBUlRfU1RBVFVTKSAmIFVTVEFUX1JYUkRZKSB7CisJCWNoID0gaW5iKHMtPmlvK0VTMTM3MF9SRUdfVUFSVF9EQVRBKTsKKwkJaWYgKHMtPm1pZGkuaWNudCA8IE1JRElJTkJVRikgeworCQkJcy0+bWlkaS5pYnVmW3MtPm1pZGkuaXdyXSA9IGNoOworCQkJcy0+bWlkaS5pd3IgPSAocy0+bWlkaS5pd3IgKyAxKSAlIE1JRElJTkJVRjsKKwkJCXMtPm1pZGkuaWNudCsrOworCQl9CisJCXdha2UgPSAxOworCX0KKwlpZiAod2FrZSkKKwkJd2FrZV91cCgmcy0+bWlkaS5pd2FpdCk7CisJd2FrZSA9IDA7CisJd2hpbGUgKChpbmIocy0+aW8rRVMxMzcwX1JFR19VQVJUX1NUQVRVUykgJiBVU1RBVF9UWFJEWSkgJiYgcy0+bWlkaS5vY250ID4gMCkgeworCQlvdXRiKHMtPm1pZGkub2J1ZltzLT5taWRpLm9yZF0sIHMtPmlvK0VTMTM3MF9SRUdfVUFSVF9EQVRBKTsKKwkJcy0+bWlkaS5vcmQgPSAocy0+bWlkaS5vcmQgKyAxKSAlIE1JRElPVVRCVUY7CisJCXMtPm1pZGkub2NudC0tOworCQlpZiAocy0+bWlkaS5vY250IDwgTUlESU9VVEJVRi0xNikKKwkJCXdha2UgPSAxOworCX0KKwlpZiAod2FrZSkKKwkJd2FrZV91cCgmcy0+bWlkaS5vd2FpdCk7CisJb3V0Yigocy0+bWlkaS5vY250ID4gMCkgPyBVQ1RSTF9SWElOVEVOIHwgVUNUUkxfRU5BX1RYSU5UIDogVUNUUkxfUlhJTlRFTiwgcy0+aW8rRVMxMzcwX1JFR19VQVJUX0NPTlRST0wpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZXMxMzcwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilkZXZfaWQ7CisJdW5zaWduZWQgaW50IGludHNyYywgc2N0bDsKKwkKKwkvKiBmYXN0cGF0aCBvdXQsIHRvIGVhc2UgaW50ZXJydXB0IHNoYXJpbmcgKi8KKwlpbnRzcmMgPSBpbmwocy0+aW8rRVMxMzcwX1JFR19TVEFUVVMpOworCWlmICghKGludHNyYyAmIDB4ODAwMDAwMDApKQorCQlyZXR1cm4gSVJRX05PTkU7CisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwkvKiBjbGVhciBhdWRpbyBpbnRlcnJ1cHRzIGZpcnN0ICovCisJc2N0bCA9IHMtPnNjdHJsOworCWlmIChpbnRzcmMgJiBTVEFUX0FEQykKKwkJc2N0bCAmPSB+U0NUUkxfUjFJTlRFTjsKKwlpZiAoaW50c3JjICYgU1RBVF9EQUMxKQorCQlzY3RsICY9IH5TQ1RSTF9QMUlOVEVOOworCWlmIChpbnRzcmMgJiBTVEFUX0RBQzIpCisJCXNjdGwgJj0gflNDVFJMX1AySU5URU47CisJb3V0bChzY3RsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwllczEzNzBfdXBkYXRlX3B0cihzKTsKKwllczEzNzBfaGFuZGxlX21pZGkocyk7CisJc3Bpbl91bmxvY2soJnMtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfbWFnaWNbXSA9IEtFUk5fQ1JJVCAiZXMxMzcwOiBpbnZhbGlkIG1hZ2ljIHZhbHVlXG4iOworCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICghKHMpIHx8IChzKS0+bWFnaWMgIT0gRVMxMzcwX01BR0lDKSB7IFwKKwkJcHJpbnRrKGludmFsaWRfbWFnaWMpOyAgICAgICAgICAgIFwKKwkJcmV0dXJuIC1FTlhJTzsgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdW5zaWduZWQgdm9saWR4OjQ7CisJdW5zaWduZWQgbGVmdDo0OworCXVuc2lnbmVkIHJpZ2h0OjQ7CisJdW5zaWduZWQgc3RlcmVvOjE7CisJdW5zaWduZWQgcmVjbWFzazoxMzsKKwl1bnNpZ25lZCBhdmFpbDoxOworfSBtaXh0YWJsZVtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCVtTT1VORF9NSVhFUl9WT0xVTUVdID0geyAwLCAweDAsIDB4MSwgMSwgMHgwMDAwLCAxIH0sICAgLyogbWFzdGVyICovCisJW1NPVU5EX01JWEVSX1BDTV0gICAgPSB7IDEsIDB4MiwgMHgzLCAxLCAweDA0MDAsIDEgfSwgICAvKiB2b2ljZSAqLworCVtTT1VORF9NSVhFUl9TWU5USF0gID0geyAyLCAweDQsIDB4NSwgMSwgMHgwMDYwLCAxIH0sICAgLyogRk0gKi8KKwlbU09VTkRfTUlYRVJfQ0RdICAgICA9IHsgMywgMHg2LCAweDcsIDEsIDB4MDAwNiwgMSB9LCAgIC8qIENEICovCisJW1NPVU5EX01JWEVSX0xJTkVdICAgPSB7IDQsIDB4OCwgMHg5LCAxLCAweDAwMTgsIDEgfSwgICAvKiBMaW5lICovCisJW1NPVU5EX01JWEVSX0xJTkUxXSAgPSB7IDUsIDB4YSwgMHhiLCAxLCAweDE4MDAsIDEgfSwgICAvKiBBVVggKi8KKwlbU09VTkRfTUlYRVJfTElORTJdICA9IHsgNiwgMHhjLCAweDAsIDAsIDB4MDEwMCwgMSB9LCAgIC8qIE1vbm8xICovCisJW1NPVU5EX01JWEVSX0xJTkUzXSAgPSB7IDcsIDB4ZCwgMHgwLCAwLCAweDAyMDAsIDEgfSwgICAvKiBNb25vMiAqLworCVtTT1VORF9NSVhFUl9NSUNdICAgID0geyA4LCAweGUsIDB4MCwgMCwgMHgwMDAxLCAxIH0sICAgLyogTWljICovCisJW1NPVU5EX01JWEVSX09HQUlOXSAgPSB7IDksIDB4ZiwgMHgwLCAwLCAweDAwMDAsIDEgfSAgICAvKiBtb25vIG91dCAqLworfTsKKworc3RhdGljIHZvaWQgc2V0X3JlY3NyYyhzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCisJZm9yIChqID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykgeworCQlpZiAoISh2YWwgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFtaXh0YWJsZVtpXS5yZWNtYXNrKSB7CisJCQl2YWwgJj0gfigxIDw8IGkpOworCQkJY29udGludWU7CisJCX0KKwkJaiB8PSBtaXh0YWJsZVtpXS5yZWNtYXNrOworCX0KKwlzLT5taXgucmVjc3JjID0gdmFsOworCXdyY29kZWMocywgMHgxMiwgaiAmIDB4ZDUpOworCXdyY29kZWMocywgMHgxMywgaiAmIDB4YWEpOworCXdyY29kZWMocywgMHgxNCwgKGogPj4gOCkgJiAweDE3KTsKKwl3cmNvZGVjKHMsIDB4MTUsIChqID4+IDgpICYgMHgwZik7CisJaSA9IChqICYgMHgzN2YpIHwgKChqIDw8IDEpICYgMHgzMDAwKSB8IDB4YzYwOworCWlmICghcy0+bWl4LmltaXgpIHsKKwkJaSAmPSAweGZmNjA7ICAvKiBtdXRlIHJlY29yZCBhbmQgbGluZSBtb25pdG9yICovCisJfQorCXdyY29kZWMocywgMHgxMCwgaSk7CisJd3Jjb2RlYyhzLCAweDExLCBpID4+IDgpOworfQorCitzdGF0aWMgaW50IG1peGVyX2lvY3RsKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIHZhbDsKKwl1bnNpZ25lZCBjaGFyIGwsIHIsIHJsLCBycjsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUxKSB7CisJCS8qIGVuYWJsZS9kaXNhYmxlL3F1ZXJ5IG1peGVyIHByZWFtcCAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IC0xKSB7CisJCQlzLT5taXgubWljcHJlYW1wID0gISF2YWw7CisJCQl3cmNvZGVjKHMsIDB4MTksIHMtPm1peC5taWNwcmVhbXApOworCQl9CisJCXJldHVybiBwdXRfdXNlcihzLT5taXgubWljcHJlYW1wLCBwKTsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMikgeworCQkvKiBlbmFibGUvZGlzYWJsZS9xdWVyeSB1c2Ugb2YgbGluZWluIGFzIHNlY29uZCBsaW5lb3V0ICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gLTEpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAodmFsKQorCQkJCXMtPmN0cmwgfD0gQ1RSTF9YQ1RMMDsKKwkJCWVsc2UKKwkJCQlzLT5jdHJsICY9IH5DVFJMX1hDVEwwOworCQkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQl9CisJCXJldHVybiBwdXRfdXNlcigocy0+Y3RybCAmIENUUkxfWENUTDApID8gMSA6IDAsIHApOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUzKSB7CisJCS8qIGVuYWJsZS9kaXNhYmxlL3F1ZXJ5IG1pY3JvcGhvbmUgaW1wZWRhbmNlIHNldHRpbmcgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAtMSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh2YWwpCisJCQkJcy0+Y3RybCB8PSBDVFJMX1hDVEwxOworCQkJZWxzZQorCQkJCXMtPmN0cmwgJj0gfkNUUkxfWENUTDE7CisJCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5jdHJsICYgQ1RSTF9YQ1RMMSkgPyAxIDogMCwgcCk7CisJfQorICAgICAgICBpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKKwkJbWl4ZXJfaW5mbyBpbmZvOworCQlzdHJuY3B5KGluZm8uaWQsICJFUzEzNzAiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJuY3B5KGluZm8ubmFtZSwgIkVuc29uaXEgRVMxMzcwIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpbmZvLm1vZGlmeV9jb3VudGVyID0gcy0+bWl4Lm1vZGNudDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CisJCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCQlzdHJuY3B5KGluZm8uaWQsICJFUzEzNzAiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJuY3B5KGluZm8ubmFtZSwgIkVuc29uaXEgRVMxMzcwIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjbWQgPT0gT1NTX0dFVFZFUlNJT04pCisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKwlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ00nIHx8IF9TSU9DX1NJWkUoY21kKSAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgaWYgKF9TSU9DX0RJUihjbWQpID09IF9TSU9DX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC5yZWNzcmMsIHApOworCQkJCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIGRldmljZSAqLworCQkJdmFsID0gU09VTkRfTUFTS19JTUlYOworCQkJZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQkJCWlmIChtaXh0YWJsZVtpXS5hdmFpbCkKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgKi8KKwkJCWZvciAodmFsID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCQlpZiAobWl4dGFibGVbaV0ucmVjbWFzaykKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkJCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOiAvKiBNaXhlciBjaGFubmVscyBzdXBwb3J0aW5nIHN0ZXJlbyAqLworCQkJZm9yICh2YWwgPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQkJCWlmIChtaXh0YWJsZVtpXS5zdGVyZW8pCisJCQkJCXZhbCB8PSAxIDw8IGk7CisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCQorICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKwkJCisJCWNhc2UgU09VTkRfTUlYRVJfSU1JWDoKKwkJCXJldHVybiBwdXRfdXNlcihzLT5taXguaW1peCwgcCk7CisKKwkJZGVmYXVsdDoKKwkJCWkgPSBfSU9DX05SKGNtZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgIW1peHRhYmxlW2ldLmF2YWlsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sW21peHRhYmxlW2ldLnZvbGlkeF0sIHApOworCQl9CisJfQorICAgICAgICBpZiAoX1NJT0NfRElSKGNtZCkgIT0gKF9TSU9DX1JFQUR8X1NJT0NfV1JJVEUpKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisJcy0+bWl4Lm1vZGNudCsrOworCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisKKwljYXNlIFNPVU5EX01JWEVSX0lNSVg6CisJCWlmIChnZXRfdXNlcihzLT5taXguaW1peCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2V0X3JlY3NyYyhzLCBzLT5taXgucmVjc3JjKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzogLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHJlY29yZGluZyBzb3VyY2UgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2V0X3JlY3NyYyhzLCB2YWwpOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCWkgPSBfSU9DX05SKGNtZCk7CisJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCAhbWl4dGFibGVbaV0uYXZhaWwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbCA9IHZhbCAmIDB4ZmY7CisJCWlmIChsID4gMTAwKQorCQkJbCA9IDEwMDsKKwkJaWYgKG1peHRhYmxlW2ldLnN0ZXJlbykgeworCQkJciA9ICh2YWwgPj4gOCkgJiAweGZmOworCQkJaWYgKHIgPiAxMDApCisJCQkJciA9IDEwMDsKKwkJCWlmIChsIDwgNykgeworCQkJCXJsID0gMHg4MDsKKwkJCQlsID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJcmwgPSAzMSAtICgobCAtIDcpIC8gMyk7CisJCQkJbCA9ICgzMSAtIHJsKSAqIDMgKyA3OworCQkJfQorCQkJaWYgKHIgPCA3KSB7CisJCQkJcnIgPSAweDgwOworCQkJCXIgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlyciA9ICAzMSAtICgociAtIDcpIC8gMyk7CisJCQkJciA9ICgzMSAtIHJyKSAqIDMgKyA3OworCQkJfQorCQkJd3Jjb2RlYyhzLCBtaXh0YWJsZVtpXS5yaWdodCwgcnIpOworCQl9IGVsc2UgeyAKKwkJCWlmIChtaXh0YWJsZVtpXS5sZWZ0ID09IDE1KSB7CisJCQkJaWYgKGwgPCAyKSB7CisJCQkJCXJyID0gcmwgPSAweDgwOworCQkJCQlyID0gbCA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmwgPSA3IC0gKChsIC0gMikgLyAxNCk7CisJCQkJCXIgPSBsID0gKDcgLSBybCkgKiAxNCArIDI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAobCA8IDcpIHsKKwkJCQkJcmwgPSAweDgwOworCQkJCQlyID0gbCA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmwgPSAzMSAtICgobCAtIDcpIC8gMyk7CisJCQkJCXIgPSBsID0gKDMxIC0gcmwpICogMyArIDc7CisJCQkJfQorCQkJfQorCQl9CisJCXdyY29kZWMocywgbWl4dGFibGVbaV0ubGVmdCwgcmwpOworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sW21peHRhYmxlW2ldLnZvbGlkeF0gPSAoKHVuc2lnbmVkIGludClyIDw8IDgpIHwgbDsKKyNlbHNlCisJCXMtPm1peC52b2xbbWl4dGFibGVbaV0udm9saWR4XSA9IHZhbDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihzLT5taXgudm9sW21peHRhYmxlW2ldLnZvbGlkeF0sIHApOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZXMxMzcwX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBlczEzNzBfc3RhdGUsIGRldnMpOworCQlpZiAocy0+ZGV2X21peGVyID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBlczEzNzBfcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCQorCVZBTElEQVRFX1NUQVRFKHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzMTM3MF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBtaXhlcl9pb2N0bCgoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YSwgY21kLCBhcmcpOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXMxMzcwX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBlczEzNzBfaW9jdGxfbWl4ZGV2LAorCS5vcGVuCQk9IGVzMTM3MF9vcGVuX21peGRldiwKKwkucmVsZWFzZQk9IGVzMTM3MF9yZWxlYXNlX21peGRldiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGRyYWluX2RhYzEoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50LCB0bW87CisJCisJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCB8fCAhcy0+ZG1hX2RhYzEucmVhZHkpCisJCXJldHVybiAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOworICAgICAgICBmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9kYWMxLmNvdW50OworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDw9IDApCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKG5vbmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgICAgICAgICAgfQorCQl0bW8gPSAzICogSFogKiAoY291bnQgKyBzLT5kbWFfZGFjMS5mcmFnc2l6ZSkgLyAyCisJCQkvIGRhYzFfc2FtcGxlcmF0ZVsocy0+Y3RybCAmIENUUkxfV1RTUlNFTCkgPj4gQ1RSTF9TSF9XVFNSU0VMXTsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUDFGTVQpID4+IFNDVFJMX1NIX1AxRk1UXTsKKwkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyArIDEpKQorCQkJREJHKHByaW50ayhLRVJOX0RFQlVHICJlczEzNzA6IGRtYSB0aW1lZCBvdXQ/P1xuIik7KQorICAgICAgICB9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMS53YWl0LCAmd2FpdCk7CisgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcmFpbl9kYWMyKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCwgdG1vOworCisJaWYgKHMtPmRtYV9kYWMyLm1hcHBlZCB8fCAhcy0+ZG1hX2RhYzIucmVhZHkpCisJCXJldHVybiAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOworICAgICAgICBmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9kYWMyLmNvdW50OworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDw9IDApCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKG5vbmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgICAgICAgICAgfQorCQl0bW8gPSAzICogSFogKiAoY291bnQgKyBzLT5kbWFfZGFjMi5mcmFnc2l6ZSkgLyAyCisJCQkvIERBQzJfRElWVE9TUigocy0+Y3RybCAmIENUUkxfUENMS0RJVikgPj4gQ1RSTF9TSF9QQ0xLRElWKTsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUDJGTVQpID4+IFNDVFJMX1NIX1AyRk1UXTsKKwkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyArIDEpKQorCQkJREJHKHByaW50ayhLRVJOX0RFQlVHICJlczEzNzA6IGRtYSB0aW1lZCBvdXQ/P1xuIik7KQorICAgICAgICB9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7CisgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICByZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzc2l6ZV90IGVzMTM3MF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkb3duKCZzLT5zZW0pOwkKKwlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCWdvdG8gb3V0OworICAgICAgICAKKwlhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2FkYy53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzd3B0ciA9IHMtPmRtYV9hZGMuc3dwdHI7CisJCWNudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZS1zd3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMuY291bnQgPCBjbnQpCisJCQljbnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoY250IDw9IDApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKKwkJCQlzdGFydF9hZGMocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXVwKCZzLT5zZW0pOworCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlkb3duKCZzLT5zZW0pOworCQkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJeworCQkJCXJldCA9IC1FTlhJTzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfYWRjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9hZGMuY291bnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKKwkJCXN0YXJ0X2FkYyhzKTsKKwl9CitvdXQ6CisJdXAoJnMtPnNlbSk7CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVzMTM3MF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2RhYzIubWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZG93bigmcy0+c2VtKTsJCisJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjMihzKSkpCisJCWdvdG8gb3V0OworCXJldCA9IDA7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAocy0+ZG1hX2RhYzIuY291bnQgPCAwKSB7CisJCQlzLT5kbWFfZGFjMi5jb3VudCA9IDA7CisJCQlzLT5kbWFfZGFjMi5zd3B0ciA9IHMtPmRtYV9kYWMyLmh3cHRyOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYzIuc3dwdHI7CisJCWNudCA9IHMtPmRtYV9kYWMyLmRtYXNpemUtc3dwdHI7CisJCWlmIChzLT5kbWFfZGFjMi5jb3VudCArIGNudCA+IHMtPmRtYV9kYWMyLmRtYXNpemUpCisJCQljbnQgPSBzLT5kbWFfZGFjMi5kbWFzaXplIC0gcy0+ZG1hX2RhYzIuY291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2RhYzIuZW5hYmxlZCkKKwkJCQlzdGFydF9kYWMyKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl1cCgmcy0+c2VtKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0OwkKKwkJCX0KKwkJCWRvd24oJnMtPnNlbSk7CisJCQlpZiAocy0+ZG1hX2RhYzIubWFwcGVkKQorCQkJeworCQkJcmV0ID0gLUVOWElPOworCQkJZ290byBvdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYzIucmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMyLmRtYXNpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmRtYV9kYWMyLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9kYWMyLmNvdW50ICs9IGNudDsKKwkJcy0+ZG1hX2RhYzIuZW5kY2xlYXJlZCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlpZiAocy0+ZG1hX2RhYzIuZW5hYmxlZCkKKwkJCXN0YXJ0X2RhYzIocyk7CisJfQorb3V0OgorCXVwKCZzLT5zZW0pOworICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXMxMzcwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9kYWMyKHMpKQorCQkJcmV0dXJuIDA7CisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2RhYzIud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9hZGMocykpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfYWRjLndhaXQsIHdhaXQpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWVzMTM3MF91cGRhdGVfcHRyKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjMi5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMyLmZyYWdzaXplKSAKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9IGVsc2UgeworCQkJaWYgKChzaWduZWQpcy0+ZG1hX2RhYzIuZG1hc2l6ZSA+PSBzLT5kbWFfZGFjMi5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcwX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWRvd24oJnMtPnNlbSk7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYzIocykpICE9IDApIHsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRiID0gJnMtPmRtYV9kYWMyOworCX0gZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApIHsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRiID0gJnMtPmRtYV9hZGM7CisJfSBlbHNlICB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAodm1hLT52bV9wZ29mZiAhPSAwKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQl2aXJ0X3RvX3BoeXMoZGItPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCQlzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCWRiLT5tYXBwZWQgPSAxOworb3V0OgorCXVwKCZzLT5zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVzMTM3MF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKyAgICAgICAgY291bnRfaW5mbyBjaW5mbzsKKwlpbnQgY291bnQ7CisJaW50IHZhbCwgbWFwcGVkLCByZXQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAgbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYzIubWFwcGVkKSB8fAorCQkoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIHMtPmRtYV9hZGMubWFwcGVkKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gZHJhaW5fZGFjMihzLCAwLypmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyovKTsKKwkJcmV0dXJuIDA7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjMihzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQkJcy0+ZG1hX2RhYzIuc3dwdHIgPSBzLT5kbWFfZGFjMi5od3B0ciA9IHMtPmRtYV9kYWMyLmNvdW50ID0gcy0+ZG1hX2RhYzIudG90YWxfYnl0ZXMgPSAwOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQkJcy0+ZG1hX2FkYy5zd3B0ciA9IHMtPmRtYV9hZGMuaHdwdHIgPSBzLT5kbWFfYWRjLmNvdW50ID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9IDA7CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPj0gMCkgeworCQkJaWYgKHMtPm9wZW5fbW9kZSAmICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICh2YWwgPCA0MDAwKQorCQkJCXZhbCA9IDQwMDA7CisJCQlpZiAodmFsID4gNTAwMDApCisJCQkJdmFsID0gNTAwMDA7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN0b3BfZGFjMihzKTsKKwkJCXMtPmRtYV9hZGMucmVhZHkgPSBzLT5kbWFfZGFjMi5yZWFkeSA9IDA7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJcy0+Y3RybCA9IChzLT5jdHJsICYgfkNUUkxfUENMS0RJVikgfCAoREFDMl9TUlRPRElWKHZhbCkgPDwgQ1RSTF9TSF9QQ0xLRElWKTsKKwkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoREFDMl9ESVZUT1NSKChzLT5jdHJsICYgQ1RSTF9QQ0xLRElWKSA+PiBDVFJMX1NIX1BDTEtESVYpLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKHZhbCkKKwkJCQlzLT5zY3RybCB8PSBTQ1RSTF9SMVNNQjsKKwkJCWVsc2UKKwkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUjFTTUI7CisJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjMihzKTsKKwkJCXMtPmRtYV9kYWMyLnJlYWR5ID0gMDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAodmFsKQorCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1AyU01COworCQkJZWxzZQorCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMlNNQjsKKwkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIH0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUjFTTUI7CisJCQkJZWxzZQorCQkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUjFTTUI7CisJCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMyKHMpOworCQkJCXMtPmRtYV9kYWMyLnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDJTTUI7CisJCQkJZWxzZQorCQkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUDJTTUI7CisJCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gU0NUUkxfUjFTTUIgOiBTQ1RSTF9QMlNNQikpID8gMiA6IDEsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9VOCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1IxU0VCOworCQkJCWVsc2UKKwkJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1IxU0VCOworCQkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjMihzKTsKKwkJCQlzLT5kbWFfZGFjMi5yZWFkeSA9IDA7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMlNFQjsKKwkJCQllbHNlCisJCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMlNFQjsKKwkJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBTQ1RSTF9SMVNFQiA6IFNDVFJMX1AyU0VCKSkgPyAKKwkJCQlBRk1UX1MxNl9MRSA6IEFGTVRfVTgsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgcy0+Y3RybCAmIENUUkxfQURDX0VOKSAKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+Y3RybCAmIENUUkxfREFDMl9FTikgCisJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSB7CisJCQkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDE7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJfSBlbHNlIHsKKwkJCQlzLT5kbWFfYWRjLmVuYWJsZWQgPSAwOworCQkJCXN0b3BfYWRjKHMpOworCQkJfQorCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCQkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjMihzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJcy0+ZG1hX2RhYzIuZW5hYmxlZCA9IDE7CisJCQkJc3RhcnRfZGFjMihzKTsKKwkJCX0gZWxzZSB7CisJCQkJcy0+ZG1hX2RhYzIuZW5hYmxlZCA9IDA7CisJCQkJc3RvcF9kYWMyKHMpOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzIocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzBfdXBkYXRlX3B0cihzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYzIuZnJhZ3NpemU7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzIuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYzIuZG1hc2l6ZSAtIGNvdW50OworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYzIubnVtZnJhZzsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMyLmZyYWdzaGlmdDsgICAgICAKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzBfdXBkYXRlX3B0cihzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZTsKKwkJY291bnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcyA9IGNvdW50OworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7ICAgICAgCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKyAgICAgICAgICAgICAgICBmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzIocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzBfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IHMtPmRtYV9kYWMyLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCXJldHVybiBwdXRfdXNlcihjb3VudCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfYWRjKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcwX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSBzLT5kbWFfYWRjLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMihzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MF91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYzIudG90YWxfYnl0ZXM7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzIuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2RhYzIuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMyLmh3cHRyOworCQlpZiAocy0+ZG1hX2RhYzIubWFwcGVkKQorCQkJcy0+ZG1hX2RhYzIuY291bnQgJj0gcy0+ZG1hX2RhYzIuZnJhZ3NpemUtMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSkKKwkJCQlyZXR1cm4gdmFsOworCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMyLmZyYWdzaXplLCBwKTsKKwkJfQorCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQlyZXR1cm4gdmFsOworCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSA0OworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc21heGZyYWdzIDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gNDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXMtPmRtYV9kYWMyLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfZGFjMi5vc3NmcmFnc2hpZnQgPSA0OworCQkJaWYgKHMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9kYWMyLm9zc21heGZyYWdzIDwgNCkKKwkJCQlzLT5kbWFfZGFjMi5vc3NtYXhmcmFncyA9IDQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24pIHx8CisJCSAgICAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24gPSB2YWw7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJcmV0dXJuIHB1dF91c2VyKERBQzJfRElWVE9TUigocy0+Y3RybCAmIENUUkxfUENMS0RJVikgPj4gQ1RSTF9TSF9QQ0xLRElWKSwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBTQ1RSTF9SMVNNQiA6IFNDVFJMX1AyU01CKSkgPworCQkJCTIgOiAxLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gU0NUUkxfUjFTRUIgOiBTQ1RSTF9QMlNFQikpID8gCisJCQkJMTYgOiA4LCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkKKwl9CisJcmV0dXJuIG1peGVyX2lvY3RsKHMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBlczEzNzBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBlczEzNzBfc3RhdGUsIGRldnMpOworCQlpZiAoISgocy0+ZGV2X2F1ZGlvIF4gbWlub3IpICYgfjB4ZikpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBmaWxlLT5mX21vZGUpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+b3Blbl9tb2RlICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKSkKKwkJcy0+Y3RybCA9IChzLT5jdHJsICYgfkNUUkxfUENMS0RJVikgfCAoREFDMl9TUlRPRElWKDgwMDApIDw8IENUUkxfU0hfUENMS0RJVik7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IDA7CisJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDE7CisJCXMtPnNjdHJsICY9IH5TQ1RSTF9SMUZNVDsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCXMtPnNjdHJsIHw9IEVTMTM3MF9GTVRfUzE2X01PTk8gPDwgU0NUUkxfU0hfUjFGTVQ7CisJCWVsc2UKKwkJCXMtPnNjdHJsIHw9IEVTMTM3MF9GTVRfVThfTU9OTyA8PCBTQ1RSTF9TSF9SMUZNVDsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9kYWMyLm9zc21heGZyYWdzID0gcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24gPSAwOworCQlzLT5kbWFfZGFjMi5lbmFibGVkID0gMTsKKwkJcy0+c2N0cmwgJj0gflNDVFJMX1AyRk1UOworCQlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQkJcy0+c2N0cmwgfD0gRVMxMzcwX0ZNVF9TMTZfTU9OTyA8PCBTQ1RSTF9TSF9QMkZNVDsKKwkJZWxzZQorCQkJcy0+c2N0cmwgfD0gRVMxMzcwX0ZNVF9VOF9NT05PIDw8IFNDVFJMX1NIX1AyRk1UOworCX0KKwlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCWluaXRfTVVURVgoJnMtPnNlbSk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVzMTM3MF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlkcmFpbl9kYWMyKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0b3BfZGFjMihzKTsKKwkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjMik7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0b3BfYWRjKHMpOworCQlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYyk7CisJfQorCXMtPm9wZW5fbW9kZSAmPSB+KGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVzMTM3MF9hdWRpb19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBlczEzNzBfcmVhZCwKKwkud3JpdGUJCT0gZXMxMzcwX3dyaXRlLAorCS5wb2xsCQk9IGVzMTM3MF9wb2xsLAorCS5pb2N0bAkJPSBlczEzNzBfaW9jdGwsCisJLm1tYXAJCT0gZXMxMzcwX21tYXAsCisJLm9wZW4JCT0gZXMxMzcwX29wZW4sCisJLnJlbGVhc2UJPSBlczEzNzBfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCBlczEzNzBfd3JpdGVfZGFjKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfZGFjMS5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjMShzKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMxLndhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChzLT5kbWFfZGFjMS5jb3VudCA8IDApIHsKKwkJCXMtPmRtYV9kYWMxLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMxLnN3cHRyID0gcy0+ZG1hX2RhYzEuaHdwdHI7CisJCX0KKwkJc3dwdHIgPSBzLT5kbWFfZGFjMS5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYzEuZG1hc2l6ZS1zd3B0cjsKKwkJaWYgKHMtPmRtYV9kYWMxLmNvdW50ICsgY250ID4gcy0+ZG1hX2RhYzEuZG1hc2l6ZSkKKwkJCWNudCA9IHMtPmRtYV9kYWMxLmRtYXNpemUgLSBzLT5kbWFfZGFjMS5jb3VudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChzLT5kbWFfZGFjMS5lbmFibGVkKQorCQkJCXN0YXJ0X2RhYzEocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKHMtPmRtYV9kYWMxLnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfZGFjMS5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfZGFjMS5zd3B0ciA9IHN3cHRyOworCQlzLT5kbWFfZGFjMS5jb3VudCArPSBjbnQ7CisJCXMtPmRtYV9kYWMxLmVuZGNsZWFyZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9kYWMxLmVuYWJsZWQpCisJCQlzdGFydF9kYWMxKHMpOworCX0KKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMxLndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVzMTM3MF9wb2xsX2RhYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghcy0+ZG1hX2RhYzEucmVhZHkgJiYgcHJvZ19kbWFidWZfZGFjMShzKSkKKwkJcmV0dXJuIDA7CisJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfZGFjMS53YWl0LCB3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWVzMTM3MF91cGRhdGVfcHRyKHMpOworCWlmIChzLT5kbWFfZGFjMS5tYXBwZWQpIHsKKwkJaWYgKHMtPmRtYV9kYWMxLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYzEuZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0gZWxzZSB7CisJCWlmICgoc2lnbmVkKXMtPmRtYV9kYWMxLmRtYXNpemUgPj0gcy0+ZG1hX2RhYzEuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMxLmZyYWdzaXplKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGVzMTM3MF9tbWFwX2RhYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYzEocykpICE9IDApCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgcy0+ZG1hX2RhYzEuYnVmb3JkZXIpKQorCQlnb3RvIG91dDsKKwlyZXQgPSAtRUFHQUlOOworCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJdmlydF90b19waHlzKHMtPmRtYV9kYWMxLnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCXNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJZ290byBvdXQ7CisJcy0+ZG1hX2RhYzEubWFwcGVkID0gMTsKKwlyZXQgPSAwOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVzMTM3MF9pb2N0bF9kYWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBhdWRpb19idWZfaW5mbyBhYmluZm87CisgICAgICAgIGNvdW50X2luZm8gY2luZm87CisJaW50IGNvdW50OworCXVuc2lnbmVkIGN0cmw7CisJaW50IHZhbCwgcmV0OworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCXJldHVybiBkcmFpbl9kYWMxKHMsIDAvKmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKi8pOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCwgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCXN0b3BfZGFjMShzKTsKKwkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCXMtPmRtYV9kYWMxLnN3cHRyID0gcy0+ZG1hX2RhYzEuaHdwdHIgPSBzLT5kbWFfZGFjMS5jb3VudCA9IHMtPmRtYV9kYWMxLnRvdGFsX2J5dGVzID0gMDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPj0gMCkgeworCQkJc3RvcF9kYWMxKHMpOworCQkJcy0+ZG1hX2RhYzEucmVhZHkgPSAwOworCQkJZm9yIChjdHJsID0gMDsgY3RybCA8PSAyOyBjdHJsKyspCisJCQkJaWYgKHZhbCA8IChkYWMxX3NhbXBsZXJhdGVbY3RybF0gKyBkYWMxX3NhbXBsZXJhdGVbY3RybCsxXSkgLyAyKQorCQkJCQlicmVhazsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlzLT5jdHJsID0gKHMtPmN0cmwgJiB+Q1RSTF9XVFNSU0VMKSB8IChjdHJsIDw8IENUUkxfU0hfV1RTUlNFTCk7CisJCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKGRhYzFfc2FtcGxlcmF0ZVsocy0+Y3RybCAmIENUUkxfV1RTUlNFTCkgPj4gQ1RSTF9TSF9XVFNSU0VMXSwgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXN0b3BfZGFjMShzKTsKKwkJcy0+ZG1hX2RhYzEucmVhZHkgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAodmFsKQorCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDFTTUI7CisJCWVsc2UKKwkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMVNNQjsKKwkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMCkgeworCQkJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXN0b3BfZGFjMShzKTsKKwkJCXMtPmRtYV9kYWMxLnJlYWR5ID0gMDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAodmFsID49IDIpCisJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDFTTUI7CisJCQllbHNlCisJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AxU01COworCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmIFNDVFJMX1AxU01CKSA/IDIgOiAxLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRXxBRk1UX1U4LCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJc3RvcF9kYWMxKHMpOworCQkJcy0+ZG1hX2RhYzEucmVhZHkgPSAwOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDFTRUI7CisJCQllbHNlCisJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AxU0VCOworCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmIFNDVFJMX1AxU0VCKSA/IEFGTVRfUzE2X0xFIDogQUZNVF9VOCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCXJldHVybiBwdXRfdXNlcigocy0+Y3RybCAmIENUUkxfREFDMV9FTikgPyBQQ01fRU5BQkxFX09VVFBVVCA6IDAsIHApOworCQkJCQkJCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgeworCQkJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjMShzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJCXMtPmRtYV9kYWMxLmVuYWJsZWQgPSAxOworCQkJc3RhcnRfZGFjMShzKTsKKwkJfSBlbHNlIHsKKwkJCXMtPmRtYV9kYWMxLmVuYWJsZWQgPSAwOworCQkJc3RvcF9kYWMxKHMpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MF91cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfZGFjMS5mcmFnc2l6ZTsKKwkJY291bnQgPSBzLT5kbWFfZGFjMS5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBzLT5kbWFfZGFjMS5kbWFzaXplIC0gY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfZGFjMS5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2RhYzEuZnJhZ3NoaWZ0OyAgICAgIAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisgICAgICAgICAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCWlmICghcy0+ZG1hX2RhYzEucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzEocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzBfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IHMtPmRtYV9kYWMxLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCXJldHVybiBwdXRfdXNlcihjb3VudCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghcy0+ZG1hX2RhYzEucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzEocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzBfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMxLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9kYWMxLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9kYWMxLmZyYWdzaGlmdDsKKyAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSBzLT5kbWFfZGFjMS5od3B0cjsKKwkJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkKKwkJCXMtPmRtYV9kYWMxLmNvdW50ICY9IHMtPmRtYV9kYWMxLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmICgodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkpCisJCQlyZXR1cm4gdmFsOworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihzLT5kbWFfZGFjMS5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJcy0+ZG1hX2RhYzEub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJaWYgKHMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQlzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPSA0OworCQlpZiAocy0+ZG1hX2RhYzEub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQlzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJaWYgKHMtPmRtYV9kYWMxLm9zc21heGZyYWdzIDwgNCkKKwkJCXMtPmRtYV9kYWMxLm9zc21heGZyYWdzID0gNDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKHMtPmRtYV9kYWMxLnN1YmRpdmlzaW9uKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXMtPmRtYV9kYWMxLnN1YmRpdmlzaW9uID0gdmFsOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcihkYWMxX3NhbXBsZXJhdGVbKHMtPmN0cmwgJiBDVFJMX1dUU1JTRUwpID4+IENUUkxfU0hfV1RTUlNFTF0sIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiBTQ1RSTF9QMVNNQikgPyAyIDogMSwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgU0NUUkxfUDFTRUIpID8gMTYgOiA4LCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkKKwl9CisJcmV0dXJuIG1peGVyX2lvY3RsKHMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBlczEzNzBfb3Blbl9kYWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZXMxMzcwX3N0YXRlLCBkZXZzKTsKKwkJaWYgKCEoKHMtPmRldl9kYWMgXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisgICAgICAgCS8qIHdlIGFsbG93IG9wZW5pbmcgd2l0aCBPX1JEV1IsIG1vc3QgcHJvZ3JhbXMgZG8gaXQgYWx0aG91Z2ggdGhleSB3aWxsIG9ubHkgd3JpdGUgKi8KKyNpZiAwCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXJldHVybiAtRVBFUk07CisjZW5kaWYKKwlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCXJldHVybiAtRUlOVkFMOworICAgICAgIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgRk1PREVfREFDKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKwlzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjMS5vc3NtYXhmcmFncyA9IHMtPmRtYV9kYWMxLnN1YmRpdmlzaW9uID0gMDsKKwlzLT5kbWFfZGFjMS5lbmFibGVkID0gMTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmN0cmwgPSAocy0+Y3RybCAmIH5DVFJMX1dUU1JTRUwpIHwgKDEgPDwgQ1RSTF9TSF9XVFNSU0VMKTsKKyAgICAgIAlzLT5zY3RybCAmPSB+U0NUUkxfUDFGTVQ7CisJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJcy0+c2N0cmwgfD0gRVMxMzcwX0ZNVF9TMTZfTU9OTyA8PCBTQ1RSTF9TSF9QMUZNVDsKKwllbHNlCisJCXMtPnNjdHJsIHw9IEVTMTM3MF9GTVRfVThfTU9OTyA8PCBTQ1RSTF9TSF9QMUZNVDsKKwlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPm9wZW5fbW9kZSB8PSBGTU9ERV9EQUM7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcwX3JlbGVhc2VfZGFjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJZHJhaW5fZGFjMShzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJZG93bigmcy0+b3Blbl9zZW0pOworCXN0b3BfZGFjMShzKTsKKwlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYzEpOworCXMtPm9wZW5fbW9kZSAmPSB+Rk1PREVfREFDOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlczEzNzBfZGFjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBlczEzNzBfd3JpdGVfZGFjLAorCS5wb2xsCQk9IGVzMTM3MF9wb2xsX2RhYywKKwkuaW9jdGwJCT0gZXMxMzcwX2lvY3RsX2RhYywKKwkubW1hcAkJPSBlczEzNzBfbW1hcF9kYWMsCisJLm9wZW4JCT0gZXMxMzcwX29wZW5fZGFjLAorCS5yZWxlYXNlCT0gZXMxMzcwX3JlbGVhc2VfZGFjLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzc2l6ZV90IGVzMTM3MF9taWRpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHB0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCXJldCA9IDA7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLml3YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlwdHIgPSBzLT5taWRpLmlyZDsKKwkJY250ID0gTUlESUlOQlVGIC0gcHRyOworCQlpZiAocy0+bWlkaS5pY250IDwgY250KQorCQkJY250ID0gcy0+bWlkaS5pY250OworCQlpZiAoY250IDw9IDApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5taWRpLmlidWYgKyBwdHIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlwdHIgPSAocHRyICsgY250KSAlIE1JRElJTkJVRjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+bWlkaS5pcmQgPSBwdHI7CisJCXMtPm1pZGkuaWNudCAtPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlicmVhazsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5pd2FpdCwgJndhaXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVzMTM3MF9taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCXJldCA9IDA7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlwdHIgPSBzLT5taWRpLm93cjsKKwkJY250ID0gTUlESU9VVEJVRiAtIHB0cjsKKwkJaWYgKHMtPm1pZGkub2NudCArIGNudCA+IE1JRElPVVRCVUYpCisJCQljbnQgPSBNSURJT1VUQlVGIC0gcy0+bWlkaS5vY250OworCQlpZiAoY250IDw9IDApIHsKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWVzMTM3MF9oYW5kbGVfbWlkaShzKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+bWlkaS5vYnVmICsgcHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlwdHIgPSAocHRyICsgY250KSAlIE1JRElPVVRCVUY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPm1pZGkub3dyID0gcHRyOworCQlzLT5taWRpLm9jbnQgKz0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcwX2hhbmRsZV9taWRpKHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCBlczEzNzBfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlwb2xsX3dhaXQoZmlsZSwgJnMtPm1pZGkub3dhaXQsIHdhaXQpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlwb2xsX3dhaXQoZmlsZSwgJnMtPm1pZGkuaXdhaXQsIHdhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKHMtPm1pZGkuaWNudCA+IDApCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+bWlkaS5vY250IDwgTUlESU9VVEJVRikKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBlczEzNzBfbWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGVzMTM3MF9zdGF0ZSwgZGV2cyk7CisJCWlmIChzLT5kZXZfbWlkaSA9PSBtaW5vcikKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+b3Blbl9tb2RlICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpKSkgeworCQlzLT5taWRpLmlyZCA9IHMtPm1pZGkuaXdyID0gcy0+bWlkaS5pY250ID0gMDsKKwkJcy0+bWlkaS5vcmQgPSBzLT5taWRpLm93ciA9IHMtPm1pZGkub2NudCA9IDA7CisJCW91dGIoVUNUUkxfQ05UUkxfU1dSLCBzLT5pbytFUzEzNzBfUkVHX1VBUlRfQ09OVFJPTCk7CisJCW91dGIoMCwgcy0+aW8rRVMxMzcwX1JFR19VQVJUX0NPTlRST0wpOworCQlvdXRiKDAsIHMtPmlvK0VTMTM3MF9SRUdfVUFSVF9URVNUKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcy0+bWlkaS5pcmQgPSBzLT5taWRpLml3ciA9IHMtPm1pZGkuaWNudCA9IDA7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzLT5taWRpLm9yZCA9IHMtPm1pZGkub3dyID0gcy0+bWlkaS5vY250ID0gMDsKKwl9CisJcy0+Y3RybCB8PSBDVFJMX1VBUlRfRU47CisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOworCWVzMTM3MF9oYW5kbGVfbWlkaShzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+b3Blbl9tb2RlIHw9IChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcwX21pZGlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjb3VudCwgdG1vOworCisJVkFMSURBVEVfU1RBVEUocyk7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCQlmb3IgKDs7KSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJY291bnQgPSBzLT5taWRpLm9jbnQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoY291bnQgPD0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlicmVhazsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgCisJCQkJYnJlYWs7CisJCQl0bW8gPSAoY291bnQgKiBIWikgLyAzMTAwOworCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IDogMSkgJiYgdG1vKQorCQkJCURCRyhwcmludGsoS0VSTl9ERUJVRyAiZXMxMzcwOiBtaWRpIHRpbWVkIG91dD8/XG4iKTspCisJCX0KKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisJZG93bigmcy0+b3Blbl9zZW0pOworCXMtPm9wZW5fbW9kZSAmPSB+KChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkgJiAoRk1PREVfTUlESV9SRUFEfEZNT0RFX01JRElfV1JJVEUpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPm9wZW5fbW9kZSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKSkpIHsKKwkJcy0+Y3RybCAmPSB+Q1RSTF9VQVJUX0VOOworCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXMxMzcwX21pZGlfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gZXMxMzcwX21pZGlfcmVhZCwKKwkud3JpdGUJCT0gZXMxMzcwX21pZGlfd3JpdGUsCisJLnBvbGwJCT0gZXMxMzcwX21pZGlfcG9sbCwKKwkub3BlbgkJPSBlczEzNzBfbWlkaV9vcGVuLAorCS5yZWxlYXNlCT0gZXMxMzcwX21pZGlfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzOyBvbmx5IHVzZWQgZm9yIGNvbW1hbmQgbGluZSBwYXJhbXMgKi8KKyNkZWZpbmUgTlJfREVWSUNFIDUKKworc3RhdGljIGludCBsaW5lb3V0W05SX0RFVklDRV07CitzdGF0aWMgaW50IG1pY2JpYXNbTlJfREVWSUNFXTsKKworc3RhdGljIHVuc2lnbmVkIGludCBkZXZpbmRleDsKKworbW9kdWxlX3BhcmFtX2FycmF5KGxpbmVvdXQsIGJvb2wsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhsaW5lb3V0LCAiaWYgMSB0aGUgTElORSBpbnB1dCBpcyBjb252ZXJ0ZWQgdG8gTElORSBvdXQiKTsKK21vZHVsZV9wYXJhbV9hcnJheShtaWNiaWFzLCBib29sLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWljYmlhcywgInNldHMgdGhlICs1ViBiaWFzIGZvciBhbiBlbGVjdHJldCBtaWNyb3Bob25lIik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBNLiBTYWlsZXIsIHNhaWxlckBpZmUuZWUuZXRoei5jaCwgaGI5am54QGhiOXcuY2hlLmV1Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVTMTM3MCBBdWRpb1BDSSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpbml0dm9sIHsKKwlpbnQgbWl4Y2g7CisJaW50IHZvbDsKK30gaW5pdHZvbFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfUENNLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1NZTlRILCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX0NELCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX0xJTkUsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfTElORTEsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfTElORTIsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfTElORTMsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfTUlDLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX09HQUlOLCAweDQwNDAgfQorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZXMxMzcwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzOworCXN0cnVjdCBnYW1lcG9ydCAqZ3AgPSBOVUxMOworCW1tX3NlZ21lbnRfdCBmczsKKwlpbnQgaSwgdmFsLCByZXQ7CisKKwlpZiAoKHJldD1wY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKSkKKwkJcmV0dXJuIHJldDsKKworCWlmICggIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpZGV2LCAwKSAmIElPUkVTT1VSQ0VfSU8pIHx8CisJICAgICAhcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCkKKwkpCisJCXJldHVybiAtRU5PREVWOworCWlmIChwY2lkZXYtPmlycSA9PSAwKSAKKwkJcmV0dXJuIC1FTk9ERVY7CisJaSA9IHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCAweGZmZmZmZmZmKTsKKwlpZiAoaSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlczEzNzA6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcmV0dXJuIGk7CisJfQorCWlmICghKHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXMxMzcwX3N0YXRlKSwgR0ZQX0tFUk5FTCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVzMTM3MDogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBlczEzNzBfc3RhdGUpKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfYWRjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMxLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMyLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5pd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5vd2FpdCk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5tYWdpYyA9IEVTMTM3MF9NQUdJQzsKKwlzLT5kZXYgPSBwY2lkZXY7CisJcy0+aW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKKwlzLT5pcnEgPSBwY2lkZXYtPmlycTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvLCBFUzEzNzBfRVhURU5ULCAiZXMxMzcwIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlczEzNzA6IGlvIHBvcnRzICUjbHgtJSNseCBpbiB1c2VcbiIsIHMtPmlvLCBzLT5pbytFUzEzNzBfRVhURU5ULTEpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3JlZ2lvbjsKKwl9CisJaWYgKChyZXQ9cmVxdWVzdF9pcnEocy0+aXJxLCBlczEzNzBfaW50ZXJydXB0LCBTQV9TSElSUSwgImVzMTM3MCIscykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXMxMzcwOiBpcnEgJXUgaW4gdXNlXG4iLCBzLT5pcnEpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJLyogaW5pdGlhbGl6ZSBjb2RlYyByZWdpc3RlcnMgKi8KKwkvKiBub3RlOiBzZXR0aW5nIENUUkxfU0VSUl9ESVMgaXMgcmVwb3J0ZWQgdG8gYnJlYWsKKwkgKiBtaWMgYmlhcyBzZXR0aW5nIChieSBLaW0uQmVydHNAZmlzdWIubWFpbC5hYmIuY29tKSAqLworCXMtPmN0cmwgPSBDVFJMX0NEQ19FTiB8IChEQUMyX1NSVE9ESVYoODAwMCkgPDwgQ1RSTF9TSF9QQ0xLRElWKSB8ICgxIDw8IENUUkxfU0hfV1RTUlNFTCk7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbigweDIwMCwgSk9ZX0VYVEVOVCwgImVzMTM3MCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXMxMzcwOiBqb3lzdGljayBpbyBwb3J0IDB4MjAwIGluIHVzZVxuIik7CisJfSBlbHNlIGlmICghKHMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXMxMzcwOiBjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3JlZ2lvbigweDIwMCwgSk9ZX0VYVEVOVCk7CisJfSBlbHNlIHsKKwkJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJFU1MxMzcwIik7CisJCWdhbWVwb3J0X3NldF9waHlzKGdwLCAicGNpJXMvZ2FtZXBvcnQwIiwgcGNpX25hbWUocy0+ZGV2KSk7CisJCWdwLT5kZXYucGFyZW50ID0gJnMtPmRldi0+ZGV2OworCQlncC0+aW8gPSAweDIwMDsKKwkJcy0+Y3RybCB8PSBDVFJMX0pZU1RLX0VOOworCX0KKwlpZiAobGluZW91dFtkZXZpbmRleF0pCisJCXMtPmN0cmwgfD0gQ1RSTF9YQ1RMMDsKKwlpZiAobWljYmlhc1tkZXZpbmRleF0pCisJCXMtPmN0cmwgfD0gQ1RSTF9YQ1RMMTsKKwlzLT5zY3RybCA9IDA7CisJcHJpbnRrKEtFUk5fSU5GTyAiZXMxMzcwOiBmb3VuZCBhZGFwdGVyIGF0IGlvICUjbHggaXJxICV1XG4iCisJICAgICAgIEtFUk5fSU5GTyAiZXMxMzcwOiBmZWF0dXJlczogam95c3RpY2sgJXMsIGxpbmUgJXMsIG1pYyBpbXBlZGFuY2UgJXNcbiIsCisJICAgICAgIHMtPmlvLCBzLT5pcnEsIChzLT5jdHJsICYgQ1RSTF9KWVNUS19FTikgPyAib24iIDogIm9mZiIsCisJICAgICAgIChzLT5jdHJsICYgQ1RSTF9YQ1RMMCkgPyAib3V0IiA6ICJpbiIsCisJCSAgICAgICAocy0+Y3RybCAmIENUUkxfWENUTDEpID8gIjEiIDogIjAiKTsKKwkvKiByZWdpc3RlciBkZXZpY2VzICovCisJaWYgKChzLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmVzMTM3MF9hdWRpb19mb3BzLCAtMSkpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfYXVkaW87CisJCWdvdG8gZXJyX2RldjE7CisJfQorCWlmICgocy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmVzMTM3MF9taXhlcl9mb3BzLCAtMSkpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfbWl4ZXI7CisJCWdvdG8gZXJyX2RldjI7CisJfQorCWlmICgocy0+ZGV2X2RhYyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZXMxMzcwX2RhY19mb3BzLCAtMSkpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfZGFjOworCQlnb3RvIGVycl9kZXYzOworCX0KKwlpZiAoKHMtPmRldl9taWRpID0gcmVnaXN0ZXJfc291bmRfbWlkaSgmZXMxMzcwX21pZGlfZm9wcywgLTEpKSA8IDApIHsKKwkJcmV0ID0gcy0+ZGV2X21pZGk7CisJCWdvdG8gZXJyX2RldjQ7CisJfQorCS8qIGluaXRpYWxpemUgdGhlIGNoaXBzICovCisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOworCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCS8qIHBvaW50IHBoYW50b20gd3JpdGUgY2hhbm5lbCB0byAiYnVnYnVmIiAqLworCXMtPmJ1Z2J1Zl9jcHUgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lkZXYsMTYsJnMtPmJ1Z2J1Zl9kbWEpOworCWlmICghcy0+YnVnYnVmX2NwdSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kZXY1OworCX0KKwlvdXRsKChFUzEzNzBfUkVHX1BIQU5UT01fRlJBTUVBRFIgPj4gOCkgJiAxNSwgcy0+aW8rRVMxMzcwX1JFR19NRU1QQUdFKTsKKwlvdXRsKHMtPmJ1Z2J1Zl9kbWEsIHMtPmlvKyhFUzEzNzBfUkVHX1BIQU5UT01fRlJBTUVBRFIgJiAweGZmKSk7CisJb3V0bCgwLCBzLT5pbysoRVMxMzcwX1JFR19QSEFOVE9NX0ZSQU1FQ05UICYgMHhmZikpOworCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7ICAvKiBlbmFibGUgYnVzIG1hc3RlcmluZyAqLworCXdyY29kZWMocywgMHgxNiwgMyk7IC8qIG5vIFJTVCwgUEQgKi8KKwl3cmNvZGVjKHMsIDB4MTcsIDApOyAvKiBDT0RFQyBBREMgYW5kIENPREVDIERBQyB1c2Uge0xSLEJ9Q0xLMiBhbmQgcnVuIG9mZiB0aGUgTFJDTEsyIFBMTDsgcHJvZ3JhbSBEQUNfU1lOQz0wISEgICovCisJd3Jjb2RlYyhzLCAweDE4LCAwKTsgLyogcmVjb3JkaW5nIHNvdXJjZSBpcyBtaXhlciAqLworCXdyY29kZWMocywgMHgxOSwgcy0+bWl4Lm1pY3ByZWFtcCA9IDEpOyAvKiB0dXJuIG9uIE1JQyBwcmVhbXAgKi8KKwlzLT5taXguaW1peCA9IDE7CisJZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwl2YWwgPSBTT1VORF9NQVNLX0xJTkV8U09VTkRfTUFTS19TWU5USHxTT1VORF9NQVNLX0NEOworCW1peGVyX2lvY3RsKHMsIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQywgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihpbml0dm9sKS9zaXplb2YoaW5pdHZvbFswXSk7IGkrKykgeworCQl2YWwgPSBpbml0dm9sW2ldLnZvbDsKKwkJbWl4ZXJfaW9jdGwocywgaW5pdHZvbFtpXS5taXhjaCwgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJfQorCXNldF9mcyhmcyk7CisKKwkvKiByZWdpc3RlciBnYW1lcG9ydCAqLworCWlmIChncCkKKwkJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CisKKwkvKiBzdG9yZSBpdCBpbiB0aGUgZHJpdmVyIGZpZWxkICovCisJcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgcyk7CisJLyogcHV0IGl0IGludG8gZHJpdmVyIGxpc3QgKi8KKwlsaXN0X2FkZF90YWlsKCZzLT5kZXZzLCAmZGV2cyk7CisJLyogaW5jcmVtZW50IGRldmluZGV4ICovCisJaWYgKGRldmluZGV4IDwgTlJfREVWSUNFLTEpCisJCWRldmluZGV4Kys7CisJcmV0dXJuIDA7CisKKyBlcnJfZGV2NToKKwl1bnJlZ2lzdGVyX3NvdW5kX21pZGkocy0+ZGV2X21pZGkpOworIGVycl9kZXY0OgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9kYWMpOworIGVycl9kZXYzOgorCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+ZGV2X21peGVyKTsKKyBlcnJfZGV2MjoKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworIGVycl9kZXYxOgorCXByaW50ayhLRVJOX0VSUiAiZXMxMzcwOiBjYW5ub3QgcmVnaXN0ZXIgbWlzYyBkZXZpY2VcbiIpOworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisJaWYgKHMtPmdhbWVwb3J0KSB7CisJCXJlbGVhc2VfcmVnaW9uKHMtPmdhbWVwb3J0LT5pbywgSk9ZX0VYVEVOVCk7CisJCWdhbWVwb3J0X2ZyZWVfcG9ydChzLT5nYW1lcG9ydCk7CisJfQorIGVycl9pcnE6CisJcmVsZWFzZV9yZWdpb24ocy0+aW8sIEVTMTM3MF9FWFRFTlQpOworIGVycl9yZWdpb246CisJa2ZyZWUocyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGVzMTM3MF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoIXMpCisJCXJldHVybjsKKwlsaXN0X2RlbCgmcy0+ZGV2cyk7CisJb3V0bChDVFJMX1NFUlJfRElTIHwgKDEgPDwgQ1RSTF9TSF9XVFNSU0VMKSwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsgLyogc3dpdGNoIGV2ZXJ5dGhpbmcgb2ZmICovCisJb3V0bCgwLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsgLyogY2xlYXIgc2VyaWFsIGludGVycnVwdHMgKi8KKwlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworCWlmIChzLT5nYW1lcG9ydCkgeworCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKKwkJcmVsZWFzZV9yZWdpb24oZ3BpbywgSk9ZX0VYVEVOVCk7CisJfQorCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBFUzEzNzBfRVhURU5UKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+ZGV2X21peGVyKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfZGFjKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21pZGkocy0+ZGV2X21pZGkpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCAxNiwgcy0+YnVnYnVmX2NwdSwgcy0+YnVnYnVmX2RtYSk7CisJa2ZyZWUocyk7CisJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpZF90YWJsZVtdID0geworCXsgUENJX1ZFTkRPUl9JRF9FTlNPTklRLCBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZXMxMzcwX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZXMxMzcwIiwKKwkuaWRfdGFibGUJPSBpZF90YWJsZSwKKwkucHJvYmUJCT0gZXMxMzcwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZXMxMzcwX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2VzMTM3MCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImVzMTM3MDogdmVyc2lvbiB2MC4zOCB0aW1lICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmVzMTM3MF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9lczEzNzAodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJlczEzNzA6IHVubG9hZGluZ1xuIik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZlczEzNzBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9lczEzNzApOworbW9kdWxlX2V4aXQoY2xlYW51cF9lczEzNzApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBNT0RVTEUKKworLyogZm9ybWF0IGlzOiBlczEzNzA9bGluZW91dFssbWljYmlhc11dICovCisKK3N0YXRpYyBpbnQgX19pbml0IGVzMTM3MF9zZXR1cChjaGFyICpzdHIpCit7CisJc3RhdGljIHVuc2lnbmVkIF9faW5pdGRhdGEgbnJfZGV2ID0gMDsKKworCWlmIChucl9kZXYgPj0gTlJfREVWSUNFKQorCQlyZXR1cm4gMDsKKworCSh2b2lkKQorCSgoZ2V0X29wdGlvbigmc3RyLCZsaW5lb3V0IFtucl9kZXZdKSA9PSAyKQorCSAmJiBnZXRfb3B0aW9uKCZzdHIsJm1pY2JpYXMgW25yX2Rldl0pCisJKTsKKworCW5yX2RldisrOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJlczEzNzA9IiwgZXMxMzcwX3NldHVwKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VzMTM3MS5jIGIvc291bmQvb3NzL2VzMTM3MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MGZkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZXMxMzcxLmMKQEAgLTAsMCArMSwzMDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgICAgIGVzMTM3MS5jICAtLSAgQ3JlYXRpdmUgRW5zb25pcSBFUzEzNzEuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSwgMjAwMyAgVGhvbWFzIFNhaWxlciAodC5zYWlsZXJAYWx1bW5pLmV0aHouY2gpCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIEVuc29uaXEKKyAqCisgKiAgU3VwcG9ydGVkIGRldmljZXM6CisgKiAgL2Rldi9kc3AgICAgc3RhbmRhcmQgL2Rldi9kc3AgZGV2aWNlLCAobW9zdGx5KSBPU1MgY29tcGF0aWJsZQorICogIC9kZXYvbWl4ZXIgIHN0YW5kYXJkIC9kZXYvbWl4ZXIgZGV2aWNlLCAobW9zdGx5KSBPU1MgY29tcGF0aWJsZQorICogIC9kZXYvZHNwMSAgIGFkZGl0aW9uYWwgREFDLCBsaWtlIC9kZXYvZHNwLCBidXQgb3V0cHV0cyB0byBtaXhlciAiU1lOVEgiIHNldHRpbmcKKyAqICAvZGV2L21pZGkgICBzaW1wbGUgTUlESSBVQVJUIGludGVyZmFjZSwgbm8gaW9jdGwKKyAqCisgKiAgTk9URTogdGhlIGNhcmQgZG9lcyBub3QgaGF2ZSBhbnkgRk0vV2F2ZXRhYmxlIHN5bnRoZXNpemVyLCBpdCBpcyBzdXBwb3NlZAorICogIHRvIGJlIGRvbmUgaW4gc29mdHdhcmUuIFRoYXQgaXMgd2hhdCAvZGV2L2RhYyBpcyBmb3IuIEJ5IG5vdyAoUTIgMTk5OCkKKyAqICB0aGVyZSBhcmUgc2V2ZXJhbCBNSURJIHRvIFBDTSAoV0FWKSBwYWNrYWdlcywgb25lIG9mIHRoZW0gaXMgdGltaWRpdHkuCisgKgorICogIFJldmlzaW9uIGhpc3RvcnkKKyAqICAgIDA0LjA2LjE5OTggICAwLjEgICBJbml0aWFsIHJlbGVhc2UKKyAqICAgICAgICAgICAgICAgICAgICAgICBNaXhlciBzdHVmZiBzaG91bGQgYmUgb3ZlcmhhdWxlZDsgZXNwZWNpYWxseSBvcHRpb25hbCBBQzk3IG1peGVyIGJpdHMKKyAqICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgZGV0ZWN0ZWQuIFRoaXMgcmVzdWx0cyBpbiBzdHJhbmdlIGJlaGF2aW91ciBvZiBzb21lIG1peGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MsIGxpa2UgbWFzdGVyIHZvbHVtZSBhbmQgbWljLgorICogICAgMDguMDYuMTk5OCAgIDAuMiAgIEZpcnN0IHJlbGVhc2UgdXNpbmcgQWxhbiBDb3gnIHNvdW5kY29yZSBpbnN0ZWFkIG9mIG1pc2NkZXZpY2UKKyAqICAgIDAzLjA4LjE5OTggICAwLjMgICBEbyBub3QgaW5jbHVkZSBtb2R2ZXJzaW9ucy5oCisgKiAgICAgICAgICAgICAgICAgICAgICAgTm93IG1peGVyIGJlaGF2aW91ciBjYW4gYmFzaWNhbGx5IGJlIHNlbGVjdGVkIGJldHdlZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAiT1NTIGRvY3VtZW50ZWQiIGFuZCAiT1NTIGFjdHVhbCIgYmVoYXZpb3VyCisgKiAgICAzMS4wOC4xOTk4ICAgMC40ICAgRml4IHJlYWxwbGF5ZXIgcHJvYmxlbXMgLSBkYWMuY291bnQgaXNzdWVzCisgKiAgICAyNy4xMC4xOTk4ICAgMC41ICAgRml4IGpveXN0aWNrIHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAtLSBPbGl2ZXIgTmV1a3VtIChjMTg4QG9yZy5jaGVtaWUudW5pLW11ZW5jaGVuLmRlKQorICogICAgMTAuMTIuMTk5OCAgIDAuNiAgIEZpeCBkcmFpbl9kYWMgdHJ5aW5nIHRvIHdhaXQgb24gbm90IHlldCBpbml0aWFsaXplZCBETUEKKyAqICAgIDIzLjEyLjE5OTggICAwLjcgICBGaXggYSBmZXcgZl9maWxlICYgRk1PREVfIGJ1Z3MKKyAqICAgICAgICAgICAgICAgICAgICAgICBEb24ndCB3YWtlIHVwIGFwcCB1bnRpbCB0aGVyZSBhcmUgZnJhZ3NpemUgYnl0ZXMgdG8gcmVhZC93cml0ZQorICogICAgMDYuMDEuMTk5OSAgIDAuOCAgIHJlbW92ZSB0aGUgc2lsbHkgU0FfSU5URVJSVVBUIGZsYWcuCisgKiAgICAgICAgICAgICAgICAgICAgICAgaG9wZWZ1bGx5IGtpbGxlZCB0aGUgZWdjcyBzZWN0aW9uIHR5cGUgY29uZmxpY3QKKyAqICAgIDEyLjAzLjE5OTkgICAwLjkgICBjaW5mby5ibG9ja3Mgc2hvdWxkIGJlIHJlc2V0IGFmdGVyIEdFVHhQVFIgaW9jdGwuCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYnkgSm9oYW4gTWFlcyA8am9tYUB0ZWxpbmR1cy5iZT4KKyAqICAgIDIyLjAzLjE5OTkgICAwLjEwICByZXR1cm4gRUFHQUlOIGluc3RlYWQgb2YgRUJVU1kgd2hlbiBPX05PTkJMT0NLCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVhZC93cml0ZSBjYW5ub3QgYmUgZXhlY3V0ZWQKKyAqICAgIDA3LjA0LjE5OTkgICAwLjExICBpbXBsZW1lbnRlZCB0aGUgZm9sbG93aW5nIGlvY3RsJ3M6IFNPVU5EX1BDTV9SRUFEX1JBVEUsIAorICogICAgICAgICAgICAgICAgICAgICAgIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTLCBTT1VORF9QQ01fUkVBRF9CSVRTOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICBBbHBoYSBmaXhlcyByZXBvcnRlZCBieSBQZXRlciBKb25lcyA8cGpvbmVzQHJlZGhhdC5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgQW5vdGhlciBBbHBoYSBmaXggKHdhaXRfc3JjX3JlYWR5IGluIGluaXQgcm91dGluZSkKKyAqICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBieSAiSXZhbiBOLiBLb2tzaGF5c2t5IiA8aW5rQGp1cmFzc2ljLnBhcmsubXN1LnJ1PgorICogICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IGpveXN0aWNrIGFkZHJlc3MgaGFuZGxpbmcgbWlnaHQgc3RpbGwgYmUgd3Jvbmcgb24gYXJjaHMKKyAqICAgICAgICAgICAgICAgICAgICAgICBvdGhlciB0aGFuIGkzODYKKyAqICAgIDE1LjA2LjE5OTkgICAwLjEyICBGaXggYmFkIGFsbG9jYXRpb24gYnVnLgorICogICAgICAgICAgICAgICAgICAgICAgIFRoYW5rcyB0byBEZXRpIEZsaWVnbCA8ZmxpZWdsQGluLnR1bS5kZT4KKyAqICAgIDI4LjA2LjE5OTkgICAwLjEzICBBZGQgcGNpX3NldF9tYXN0ZXIKKyAqICAgIDAzLjA4LjE5OTkgICAwLjE0ICBhZGFwdCB0byBMaW51cycgbmV3IF9fc2V0dXAvX19pbml0Y2FsbAorICogICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9uICJlczEzNzE9am95c3RpY2thZGRyIgorICogICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgQ09ORklHX1NPVU5EX0VTMTM3MV9KT1lQT1JUX0JPT1Qga2x1ZGdlCisgKiAgICAxMC4wOC4xOTk5ICAgMC4xNSAgKFJlKWFkZGVkIFMvUERJRiBtb2R1bGUgb3B0aW9uIGZvciBjYXJkcyByZXZpc2lvbiA+PSA0LgorICogICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWwgdmVyc2lvbiBieSBEYXZlIFBsYXR0IDxkcGxhdHRAc251bGJ1Zy5tdHZpZXcuY2EudXM+LgorICogICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9pbml0L19fc2V0dXAgZml4ZXMKKyAqICAgIDA4LjE2LjE5OTkgICAwLjE2ICBKb2UgQ290ZWxsZXNlIDxqb2VjQGVuc29uaXEuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGRldGVjdGlvbiBmb3IgRVMxMzcxIHJldmlzaW9uIElEIHNvIHRoYXQgd2UgY2FuCisgKiAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0IHRoZSBFUzEzNzMgYW5kIGxhdGVyIHBhcnRzLgorICogICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIEFDOTcgI2RlZmluZXMgZm9yIHJlYWRhYmlsaXR5CisgKiAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgYSAvcHJvYyBmaWxlIHN5c3RlbSBmb3IgZHVtcGluZyBoYXJkd2FyZSBzdGF0ZQorICogICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgU1JDIGFuZCBDT0RFQyB3L3IgZnVuY3Rpb25zIHRvIGFjY29tbW9kYXRlIGJ1Z3MKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbiBzb21lIHZlcnNpb25zIG9mIHRoZSBFUzEzN3ggY2hpcHMuCisgKiAgICAzMS4wOC4xOTk5ICAgMC4xNyAgYWRkIHNwaW5fbG9ja19pbml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgY3VycmVudC0+c3RhdGUgPSB4IHdpdGggc2V0X2N1cnJlbnRfc3RhdGUoeCkKKyAqICAgIDAzLjA5LjE5OTkgICAwLjE4ICBjaGFuZ2UgcmVhZCBzZW1hbnRpY3MgZm9yIE1JREkgdG8gbWF0Y2gKKyAqICAgICAgICAgICAgICAgICAgICAgICBPU1MgbW9yZSBjbG9zZWx5OyByZW1vdmUgcG9zc2libGUgd2FrZXVwIHJhY2UKKyAqICAgIDIxLjEwLjE5OTkgICAwLjE5ICBSb3VuZCBzYW1wbGluZyByYXRlcywgcmVxdWVzdGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgS2FzYW1hdHN1IEtlbmljaGkgPHQyOXcwMjY3QGlwLm1lZGlhLmt5b3RvLXUuYWMuanA+CisgKiAgICAyNy4xMC4xOTk5ICAgMC4yMCAgQWRkZWQgU2lnbWFUZWwgM0QgZW5oYW5jZW1lbnQgc3RyaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgQ29kZWMgSUQgcHJpbnRpbmcgY2hhbmdlcworICogICAgMjguMTAuMTk5OSAgIDAuMjEgIE1vcmUgd2FpdHF1ZXVlIHJhY2VzIGZpeGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgSm9lIENvdGVsbGVzZSA8am9lY0BlbnNvbmlxLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkIFBDSSBkZXRlY3Rpb24gcm91dGluZSBzbyB3ZSBjYW4gbW9yZSBlYXNpbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3QgRVMxMzd4IGNoaXAgYW5kIGRlcml2YXRpdmVzLgorICogICAgMDUuMDEuMjAwMCAgIDAuMjIgIFNob3VsZCBub3cgd29yayB3aXRoIHJldjcgYm9hcmRzOyBwYXRjaCBieQorICogICAgICAgICAgICAgICAgICAgICAgIEVyaWMgTGVtYXIsIGVsZW1hckBjcy53YXNoaW5ndG9uLmVkdQorICogICAgMDguMDEuMjAwMCAgIDAuMjMgIFByZXZlbnQgc29tZSBpb2N0bCdzIGZyb20gcmV0dXJuaW5nIGJhZCBjb3VudCB2YWx1ZXMgb24gdW5kZXJydW4vb3ZlcnJ1bjsKKyAqICAgICAgICAgICAgICAgICAgICAgICBUaW0gSmFuaWsncyBCU0UgKEJlZGV2aWxsZWQgU291bmQgRW5naW5lKSBmb3VuZCB0aGlzCisgKiAgICAwNy4wMi4yMDAwICAgMC4yNCAgVXNlIHBjaV9hbGxvY19jb25zaXN0ZW50IGFuZCBwY2lfcmVnaXN0ZXJfZHJpdmVyCisgKiAgICAwNy4wMi4yMDAwICAgMC4yNSAgVXNlIGFjOTdfY29kZWMKKyAqICAgIDAxLjAzLjIwMDAgICAwLjI2ICBTUERJRiBwYXRjaCBieSBNaWthZWwgQm91aWxsb3QgPG1pa2FlbC5ib3VpbGxvdEBiaWdmb290LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICBVc2UgcGNpX21vZHVsZV9pbml0CisgKiAgICAyMS4xMS4yMDAwICAgMC4yNyAgSW5pdGlhbGl6ZSBkbWEgYnVmZmVycyBpbiBwb2xsLCBvdGhlcndpc2UgcG9sbCBtYXkgcmV0dXJuIGEgYm9ndXMgbWFzaworICogICAgMTIuMTIuMjAwMCAgIDAuMjggIE1vcmUgZG1hIGJ1ZmZlciBpbml0aWFsaXphdGlvbnMsIHBhdGNoIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICBUamVlcmQgTXVsZGVyIDx0amVlcmQubXVsZGVyQGZ1aml0c3Utc2llbWVucy5jb20+CisgKiAgICAwNS4wMS4yMDAxICAgMC4yOSAgSG9wZWZ1bGx5IHVwZGF0ZXMgd2lsbCBub3QgYmUgcmVxdWlyZWQgYW55bW9yZSB3aGVuIENyZWF0aXZlIGJ1bXBzCisgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIENUNTg4MCByZXZpc2lvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0ZWQgYnkgU3RlcGhhbiBN/GxsZXIgPHNtdWVsbGVyQGNocm9ub3guZGU+CisgKiAgICAzMS4wMS4yMDAxICAgMC4zMCAgUmVnaXN0ZXIvVW5yZWdpc3RlciBnYW1lcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgIEZpeCBTRVRUUklHR0VSIG5vbiBPU1MgQVBJIGNvbmZvcm1pdHkKKyAqICAgIDE0LjA3LjIwMDEgICAwLjMxICBBZGQgbGlzdCBvZiBsYXB0b3BzIG5lZWRpbmcgYW1wbGlmaWVyIGNvbnRyb2wKKyAqICAgIDAzLjAxLjIwMDMgICAwLjMyICBvcGVuX21vZGUgZml4ZXMgZnJvbSBHZW9yZyBBY2hlciA8YWNoZXJAaW4udHVtLmRlPgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI3VuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworI2RlZmluZSBFUzEzNzFfREVCVUcKKyNkZWZpbmUgREJHKHgpIHt9CisvKiNkZWZpbmUgREJHKHgpIHt4fSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfRU5TT05JUQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VOU09OSVEgICAgICAgIDB4MTI3NCAgICAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfRUNUSVZBCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRUNUSVZBICAgICAgICAgMHgxMTAyCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzEgMHgxMzcxCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAgMHg1ODgwCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VDVElWQV9FVjE5MzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FQ1RJVkFfRVYxOTM4IDB4ODkzOAorI2VuZGlmCisKKy8qIEVTMTM3MSBjaGlwIElEICovCisvKiBUaGlzIGlzIGEgbGl0dGxlIGNvbmZ1c2luZyBiZWNhdXNlIGFsbCBFUzEzNzEgY29tcGF0aWJsZSBjaGlwcyBoYXZlIHRoZQorICAgc2FtZSBERVZJQ0VfSUQsIHRoZSBvbmx5IHRoaW5nIGRpZmZlcmVudGlhdGluZyB0aGVtIGlzIHRoZSBSRVZfSUQgZmllbGQuCisgICBUaGlzIGlzIG9ubHkgc2lnbmlmaWNhbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZlYXR1cmVzIG9uIHRoZSBsYXRlciBwYXJ0cy4KKyAgIFllcywgSSBrbm93IGl0J3Mgc3R1cGlkIGFuZCB3aHkgZGlkbid0IHdlIHVzZSB0aGUgc3ViIElEcz8KKyovCisjZGVmaW5lIEVTMTM3MVJFVl9FUzEzNzNfQSAgMHgwNAorI2RlZmluZSBFUzEzNzFSRVZfRVMxMzczX0IgIDB4MDYKKyNkZWZpbmUgRVMxMzcxUkVWX0NUNTg4MF9BICAweDA3CisjZGVmaW5lIENUNTg4MFJFVl9DVDU4ODBfQyAgMHgwMgorI2RlZmluZSBDVDU4ODBSRVZfQ1Q1ODgwX0QgIDB4MDMKKyNkZWZpbmUgRVMxMzcxUkVWX0VTMTM3MV9CICAweDA5CisjZGVmaW5lIEVWMTkzOFJFVl9FVjE5MzhfQSAgMHgwMAorI2RlZmluZSBFUzEzNzFSRVZfRVMxMzczXzggIDB4MDgKKworI2RlZmluZSBFUzEzNzFfTUFHSUMgICgoUENJX1ZFTkRPUl9JRF9FTlNPTklRPDwxNil8UENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MSkKKworI2RlZmluZSBFUzEzNzFfRVhURU5UICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgSk9ZX0VYVEVOVCAgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgRVMxMzcxX1JFR19DT05UUk9MICAgICAgICAweDAwCisjZGVmaW5lIEVTMTM3MV9SRUdfU1RBVFVTICAgICAgICAgMHgwNCAvKiBvbiB0aGUgNTg4MCBpdCBpcyBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBFUzEzNzFfUkVHX1VBUlRfREFUQSAgICAgIDB4MDgKKyNkZWZpbmUgRVMxMzcxX1JFR19VQVJUX1NUQVRVUyAgICAweDA5CisjZGVmaW5lIEVTMTM3MV9SRUdfVUFSVF9DT05UUk9MICAgMHgwOQorI2RlZmluZSBFUzEzNzFfUkVHX1VBUlRfVEVTVCAgICAgIDB4MGEKKyNkZWZpbmUgRVMxMzcxX1JFR19NRU1QQUdFICAgICAgICAweDBjCisjZGVmaW5lIEVTMTM3MV9SRUdfU1JDT05WICAgICAgICAgMHgxMAorI2RlZmluZSBFUzEzNzFfUkVHX0NPREVDICAgICAgICAgIDB4MTQKKyNkZWZpbmUgRVMxMzcxX1JFR19MRUdBQ1kgICAgICAgICAweDE4CisjZGVmaW5lIEVTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wgMHgyMAorI2RlZmluZSBFUzEzNzFfUkVHX0RBQzFfU0NPVU5UICAgIDB4MjQKKyNkZWZpbmUgRVMxMzcxX1JFR19EQUMyX1NDT1VOVCAgICAweDI4CisjZGVmaW5lIEVTMTM3MV9SRUdfQURDX1NDT1VOVCAgICAgMHgyYworCisjZGVmaW5lIEVTMTM3MV9SRUdfREFDMV9GUkFNRUFEUiAgMHhjMzAKKyNkZWZpbmUgRVMxMzcxX1JFR19EQUMxX0ZSQU1FQ05UICAweGMzNAorI2RlZmluZSBFUzEzNzFfUkVHX0RBQzJfRlJBTUVBRFIgIDB4YzM4CisjZGVmaW5lIEVTMTM3MV9SRUdfREFDMl9GUkFNRUNOVCAgMHhjM2MKKyNkZWZpbmUgRVMxMzcxX1JFR19BRENfRlJBTUVBRFIgICAweGQzMAorI2RlZmluZSBFUzEzNzFfUkVHX0FEQ19GUkFNRUNOVCAgIDB4ZDM0CisKKyNkZWZpbmUgRVMxMzcxX0ZNVF9VOF9NT05PICAgICAwCisjZGVmaW5lIEVTMTM3MV9GTVRfVThfU1RFUkVPICAgMQorI2RlZmluZSBFUzEzNzFfRk1UX1MxNl9NT05PICAgIDIKKyNkZWZpbmUgRVMxMzcxX0ZNVF9TMTZfU1RFUkVPICAzCisjZGVmaW5lIEVTMTM3MV9GTVRfU1RFUkVPICAgICAgMQorI2RlZmluZSBFUzEzNzFfRk1UX1MxNiAgICAgICAgIDIKKyNkZWZpbmUgRVMxMzcxX0ZNVF9NQVNLICAgICAgICAzCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKKworI2RlZmluZSBDVFJMX1JFQ0VOX0IgICAgMHgwODAwMDAwMCAgLyogMSA9IGRvbid0IG1peCBhbmFsb2cgaW4gdG8gZGlnaXRhbCBvdXQgKi8KKyNkZWZpbmUgQ1RSTF9TUERJRkVOX0IgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQ1RSTF9KT1lfU0hJRlQgIDI0CisjZGVmaW5lIENUUkxfSk9ZX01BU0sgICAzCisjZGVmaW5lIENUUkxfSk9ZXzIwMCAgICAweDAwMDAwMDAwICAvKiBqb3lzdGljayBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ1RSTF9KT1lfMjA4ICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgQ1RSTF9KT1lfMjEwICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgQ1RSTF9KT1lfMjE4ICAgIDB4MDMwMDAwMDAKKyNkZWZpbmUgQ1RSTF9HUElPX0lOMCAgIDB4MDAxMDAwMDAgIC8qIGdlbmVyYWwgcHVycG9zZSBpbnB1dHMvb3V0cHV0cyAqLworI2RlZmluZSBDVFJMX0dQSU9fSU4xICAgMHgwMDIwMDAwMAorI2RlZmluZSBDVFJMX0dQSU9fSU4yICAgMHgwMDQwMDAwMAorI2RlZmluZSBDVFJMX0dQSU9fSU4zICAgMHgwMDgwMDAwMAorI2RlZmluZSBDVFJMX0dQSU9fT1VUMCAgMHgwMDAxMDAwMAorI2RlZmluZSBDVFJMX0dQSU9fT1VUMSAgMHgwMDAyMDAwMAorI2RlZmluZSBDVFJMX0dQSU9fT1VUMiAgMHgwMDA0MDAwMAorI2RlZmluZSBDVFJMX0dQSU9fT1VUMyAgMHgwMDA4MDAwMAorI2RlZmluZSBDVFJMX01TRk1UU0VMICAgMHgwMDAwODAwMCAgLyogTVBFRyBzZXJpYWwgZGF0YSBmbXQ6IDAgPSBTb255LCAxID0gSTJTICovCisjZGVmaW5lIENUUkxfU1lOQ1JFUyAgICAweDAwMDA0MDAwICAvKiBBQzk3IHdhcm0gcmVzZXQgKi8KKyNkZWZpbmUgQ1RSTF9BRENTVE9QICAgIDB4MDAwMDIwMDAgIC8qIHN0b3AgQURDIHRyYW5zZmVycyAqLworI2RlZmluZSBDVFJMX1BXUl9JTlRSTSAgMHgwMDAwMTAwMCAgLyogMSA9IHBvd2VyIGxldmVsIGludHMgZW5hYmxlZCAqLworI2RlZmluZSBDVFJMX01fQ0IgICAgICAgMHgwMDAwMDgwMCAgLyogcmVjb3JkaW5nIHNvdXJjZTogMCA9IEFEQywgMSA9IE1QRUcgKi8KKyNkZWZpbmUgQ1RSTF9DQ0JfSU5UUk0gIDB4MDAwMDA0MDAgIC8qIDEgPSBDQ0IgInZvaWNlIiBpbnRzIGVuYWJsZWQgKi8KKyNkZWZpbmUgQ1RSTF9QRExFVjAgICAgIDB4MDAwMDAwMDAgIC8qIHBvd2VyIGRvd24gbGV2ZWwgKi8KKyNkZWZpbmUgQ1RSTF9QRExFVjEgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQ1RSTF9QRExFVjIgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQ1RSTF9QRExFVjMgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgQ1RSTF9CUkVRICAgICAgIDB4MDAwMDAwODAgIC8qIDEgPSB0ZXN0IG1vZGUgKGludGVybmFsIG1lbSB0ZXN0KSAqLworI2RlZmluZSBDVFJMX0RBQzFfRU4gICAgMHgwMDAwMDA0MCAgLyogZW5hYmxlIERBQzEgKi8KKyNkZWZpbmUgQ1RSTF9EQUMyX0VOICAgIDB4MDAwMDAwMjAgIC8qIGVuYWJsZSBEQUMyICovCisjZGVmaW5lIENUUkxfQURDX0VOICAgICAweDAwMDAwMDEwICAvKiBlbmFibGUgQURDICovCisjZGVmaW5lIENUUkxfVUFSVF9FTiAgICAweDAwMDAwMDA4ICAvKiBlbmFibGUgTUlESSB1YXJ0ICovCisjZGVmaW5lIENUUkxfSllTVEtfRU4gICAweDAwMDAwMDA0ICAvKiBlbmFibGUgSm95c3RpY2sgcG9ydCAqLworI2RlZmluZSBDVFJMX1hUQUxDTEtESVMgMHgwMDAwMDAwMiAgLyogMSA9IGRpc2FibGUgY3J5c3RhbCBjbG9jayBpbnB1dCAqLworI2RlZmluZSBDVFJMX1BDSUNMS0RJUyAgMHgwMDAwMDAwMSAgLyogMSA9IGRpc2FibGUgUENJIGNsb2NrIGRpc3RyaWJ1dGlvbiAqLworCisKKyNkZWZpbmUgU1RBVF9JTlRSICAgICAgIDB4ODAwMDAwMDAgIC8qIHdpcmVkIG9yIG9mIGFsbCBpbnRlcnJ1cHQgYml0cyAqLworI2RlZmluZSBDU1RBVF81ODgwX0FDOTdfUlNUIDB4MjAwMDAwMDAgLyogQ1Q1ODgwIFJlc2V0IGJpdCAqLworI2RlZmluZSBTVEFUX0VOX1NQRElGICAgMHgwMDA0MDAwMCAgLyogZW5hYmxlIFMvUERJRiBjaXJjdWl0cnkgKi8KKyNkZWZpbmUgU1RBVF9UU19TUERJRiAgIDB4MDAwMjAwMDAgIC8qIHRlc3QgUy9QRElGIGNpcmN1aXRyeSAqLworI2RlZmluZSBTVEFUX1RFU1RNT0RFICAgMHgwMDAxMDAwMCAgLyogdGVzdCBBU0lDICovCisjZGVmaW5lIFNUQVRfU1lOQ19FUlIgICAweDAwMDAwMTAwICAvKiAxID0gY29kZWMgc3luYyBlcnJvciAqLworI2RlZmluZSBTVEFUX1ZDICAgICAgICAgMHgwMDAwMDBjMCAgLyogQ0NCIGludCBzb3VyY2UsIDA9REFDMSwgMT1EQUMyLCAyPUFEQywgMz11bmRlZiAqLworI2RlZmluZSBTVEFUX1NIX1ZDICAgICAgNgorI2RlZmluZSBTVEFUX01QV1IgICAgICAgMHgwMDAwMDAyMCAgLyogcG93ZXIgbGV2ZWwgaW50ZXJydXB0ICovCisjZGVmaW5lIFNUQVRfTUNDQiAgICAgICAweDAwMDAwMDEwICAvKiBDQ0IgaW50IHBlbmRpbmcgKi8KKyNkZWZpbmUgU1RBVF9VQVJUICAgICAgIDB4MDAwMDAwMDggIC8qIFVBUlQgaW50IHBlbmRpbmcgKi8KKyNkZWZpbmUgU1RBVF9EQUMxICAgICAgIDB4MDAwMDAwMDQgIC8qIERBQzEgaW50IHBlbmRpbmcgKi8KKyNkZWZpbmUgU1RBVF9EQUMyICAgICAgIDB4MDAwMDAwMDIgIC8qIERBQzIgaW50IHBlbmRpbmcgKi8KKyNkZWZpbmUgU1RBVF9BREMgICAgICAgIDB4MDAwMDAwMDEgIC8qIEFEQyBpbnQgcGVuZGluZyAqLworCisjZGVmaW5lIFVTVEFUX1JYSU5UICAgICAweDgwICAgICAgICAvKiBVQVJUIHJ4IGludCBwZW5kaW5nICovCisjZGVmaW5lIFVTVEFUX1RYSU5UICAgICAweDA0ICAgICAgICAvKiBVQVJUIHR4IGludCBwZW5kaW5nICovCisjZGVmaW5lIFVTVEFUX1RYUkRZICAgICAweDAyICAgICAgICAvKiBVQVJUIHR4IHJlYWR5ICovCisjZGVmaW5lIFVTVEFUX1JYUkRZICAgICAweDAxICAgICAgICAvKiBVQVJUIHJ4IHJlYWR5ICovCisKKyNkZWZpbmUgVUNUUkxfUlhJTlRFTiAgIDB4ODAgICAgICAgIC8qIDEgPSBlbmFibGUgUlggaW50cyAqLworI2RlZmluZSBVQ1RSTF9UWElOVEVOICAgMHg2MCAgICAgICAgLyogVFggaW50IGVuYWJsZSBmaWVsZCBtYXNrICovCisjZGVmaW5lIFVDVFJMX0VOQV9UWElOVCAweDIwICAgICAgICAvKiBlbmFibGUgVFggaW50ICovCisjZGVmaW5lIFVDVFJMX0NOVFJMICAgICAweDAzICAgICAgICAvKiBjb250cm9sIGZpZWxkICovCisjZGVmaW5lIFVDVFJMX0NOVFJMX1NXUiAweDAzICAgICAgICAvKiBzb2Z0d2FyZSByZXNldCBjb21tYW5kICovCisKKy8qIHNhbXBsZSByYXRlIGNvbnZlcnRlciAqLworI2RlZmluZSBTUkNfT0tTVEFURSAgICAgICAgMQorCisjZGVmaW5lIFNSQ19SQU1BRERSX01BU0sgICAweGZlMDAwMDAwCisjZGVmaW5lIFNSQ19SQU1BRERSX1NISUZUICAyNQorI2RlZmluZSBTUkNfREFDMUZSRUVaRSAgICAgKDFVTCA8PCAyMSkKKyNkZWZpbmUgU1JDX0RBQzJGUkVFWkUgICAgICAoMVVMIDw8IDIwKQorI2RlZmluZSBTUkNfQURDRlJFRVpFICAgICAgKDFVTCA8PCAxOSkKKworCisjZGVmaW5lIFNSQ19XRSAgICAgICAgICAgICAweDAxMDAwMDAwICAvKiByZWFkL3dyaXRlIGNvbnRyb2wgZm9yIFNSQyBSQU0gKi8KKyNkZWZpbmUgU1JDX0JVU1kgICAgICAgICAgIDB4MDA4MDAwMDAgIC8qIFNSQyBidXN5ICovCisjZGVmaW5lIFNSQ19ESVMgICAgICAgICAgICAweDAwNDAwMDAwICAvKiAxID0gZGlzYWJsZSBTUkMgKi8KKyNkZWZpbmUgU1JDX0REQUMxICAgICAgICAgIDB4MDAyMDAwMDAgIC8qIDEgPSBkaXNhYmxlIGFjY3VtIHVwZGF0ZSBmb3IgREFDMSAqLworI2RlZmluZSBTUkNfRERBQzIgICAgICAgICAgMHgwMDEwMDAwMCAgLyogMSA9IGRpc2FibGUgYWNjdW0gdXBkYXRlIGZvciBEQUMyICovCisjZGVmaW5lIFNSQ19EQURDICAgICAgICAgICAweDAwMDgwMDAwICAvKiAxID0gZGlzYWJsZSBhY2N1bSB1cGRhdGUgZm9yIEFEQzIgKi8KKyNkZWZpbmUgU1JDX0NUTE1BU0sgICAgICAgIDB4MDA3ODAwMDAKKyNkZWZpbmUgU1JDX1JBTURBVEFfTUFTSyAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgU1JDX1JBTURBVEFfU0hJRlQgIDAKKworI2RlZmluZSBTUkNSRUdfQURDICAgICAgMHg3OAorI2RlZmluZSBTUkNSRUdfREFDMSAgICAgMHg3MAorI2RlZmluZSBTUkNSRUdfREFDMiAgICAgMHg3NAorI2RlZmluZSBTUkNSRUdfVk9MX0FEQyAgMHg2YworI2RlZmluZSBTUkNSRUdfVk9MX0RBQzEgMHg3YworI2RlZmluZSBTUkNSRUdfVk9MX0RBQzIgMHg3ZQorCisjZGVmaW5lIFNSQ1JFR19UUlVOQ19OICAgICAweDAwCisjZGVmaW5lIFNSQ1JFR19JTlRfUkVHUyAgICAweDAxCisjZGVmaW5lIFNSQ1JFR19BQ0NVTV9GUkFDICAweDAyCisjZGVmaW5lIFNSQ1JFR19WRlJFUV9GUkFDICAweDAzCisKKyNkZWZpbmUgQ09ERUNfUElSRCAgICAgICAgMHgwMDgwMDAwMCAgLyogMCA9IHdyaXRlIEFDOTcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09ERUNfUElBRERfTUFTSyAgMHgwMDdmMDAwMAorI2RlZmluZSBDT0RFQ19QSUFERF9TSElGVCAxNgorI2RlZmluZSBDT0RFQ19QSURBVF9NQVNLICAweDAwMDBmZmZmCisjZGVmaW5lIENPREVDX1BJREFUX1NISUZUIDAKKworI2RlZmluZSBDT0RFQ19SRFkgICAgICAgICAweDgwMDAwMDAwICAvKiBBQzk3IHJlYWQgZGF0YSB2YWxpZCAqLworI2RlZmluZSBDT0RFQ19XSVAgICAgICAgICAweDQwMDAwMDAwICAvKiBBQzk3IHdyaXRlIGluIHByb2dyZXNzICovCisjZGVmaW5lIENPREVDX1BPUkQgICAgICAgIDB4MDA4MDAwMDAgIC8qIDAgPSB3cml0ZSBBQzk3IHJlZ2lzdGVyICovCisjZGVmaW5lIENPREVDX1BPQUREX01BU0sgIDB4MDA3ZjAwMDAKKyNkZWZpbmUgQ09ERUNfUE9BRERfU0hJRlQgMTYKKyNkZWZpbmUgQ09ERUNfUE9EQVRfTUFTSyAgMHgwMDAwZmZmZgorI2RlZmluZSBDT0RFQ19QT0RBVF9TSElGVCAwCisKKworI2RlZmluZSBMRUdBQ1lfSkZBU1QgICAgICAweDgwMDAwMDAwICAvKiBmYXN0IGpveXN0aWNrIHRpbWluZyAqLworI2RlZmluZSBMRUdBQ1lfRklSUSAgICAgICAweDAxMDAwMDAwICAvKiBmb3JjZSBJUlEgKi8KKworI2RlZmluZSBTQ1RSTF9EQUNURVNUICAgICAweDAwNDAwMDAwICAvKiAxID0gREFDIHRlc3QsIHRlc3QgdmVjdG9yIGdlbmVyYXRpb24gcHVycG9zZXMgKi8KKyNkZWZpbmUgU0NUUkxfUDJFTkRJTkMgICAgMHgwMDM4MDAwMCAgLyogICovCisjZGVmaW5lIFNDVFJMX1NIX1AyRU5ESU5DIDE5CisjZGVmaW5lIFNDVFJMX1AyU1RJTkMgICAgIDB4MDAwNzAwMDAgIC8qICAqLworI2RlZmluZSBTQ1RSTF9TSF9QMlNUSU5DICAxNgorI2RlZmluZSBTQ1RSTF9SMUxPT1BTRUwgICAweDAwMDA4MDAwICAvKiAwID0gbG9vcCBtb2RlICovCisjZGVmaW5lIFNDVFJMX1AyTE9PUFNFTCAgIDB4MDAwMDQwMDAgIC8qIDAgPSBsb29wIG1vZGUgKi8KKyNkZWZpbmUgU0NUUkxfUDFMT09QU0VMICAgMHgwMDAwMjAwMCAgLyogMCA9IGxvb3AgbW9kZSAqLworI2RlZmluZSBTQ1RSTF9QMlBBVVNFICAgICAweDAwMDAxMDAwICAvKiAxID0gcGF1c2UgbW9kZSAqLworI2RlZmluZSBTQ1RSTF9QMVBBVVNFICAgICAweDAwMDAwODAwICAvKiAxID0gcGF1c2UgbW9kZSAqLworI2RlZmluZSBTQ1RSTF9SMUlOVEVOICAgICAweDAwMDAwNDAwICAvKiBlbmFibGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFNDVFJMX1AySU5URU4gICAgIDB4MDAwMDAyMDAgIC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0NUUkxfUDFJTlRFTiAgICAgMHgwMDAwMDEwMCAgLyogZW5hYmxlIGludGVycnVwdCAqLworI2RlZmluZSBTQ1RSTF9QMVNDVFJMRCAgICAweDAwMDAwMDgwICAvKiByZWxvYWQgc2FtcGxlIGNvdW50IHJlZ2lzdGVyIGZvciBEQUMxICovCisjZGVmaW5lIFNDVFJMX1AyREFDU0VOICAgIDB4MDAwMDAwNDAgIC8qIDEgPSBEQUMyIHBsYXkgYmFjayBsYXN0IHNhbXBsZSB3aGVuIGRpc2FibGVkICovCisjZGVmaW5lIFNDVFJMX1IxU0VCICAgICAgIDB4MDAwMDAwMjAgIC8qIDEgPSAxNmJpdCAqLworI2RlZmluZSBTQ1RSTF9SMVNNQiAgICAgICAweDAwMDAwMDEwICAvKiAxID0gc3RlcmVvICovCisjZGVmaW5lIFNDVFJMX1IxRk1UICAgICAgIDB4MDAwMDAwMzAgIC8qIGZvcm1hdCBtYXNrICovCisjZGVmaW5lIFNDVFJMX1NIX1IxRk1UICAgIDQKKyNkZWZpbmUgU0NUUkxfUDJTRUIgICAgICAgMHgwMDAwMDAwOCAgLyogMSA9IDE2Yml0ICovCisjZGVmaW5lIFNDVFJMX1AyU01CICAgICAgIDB4MDAwMDAwMDQgIC8qIDEgPSBzdGVyZW8gKi8KKyNkZWZpbmUgU0NUUkxfUDJGTVQgICAgICAgMHgwMDAwMDAwYyAgLyogZm9ybWF0IG1hc2sgKi8KKyNkZWZpbmUgU0NUUkxfU0hfUDJGTVQgICAgMgorI2RlZmluZSBTQ1RSTF9QMVNFQiAgICAgICAweDAwMDAwMDAyICAvKiAxID0gMTZiaXQgKi8KKyNkZWZpbmUgU0NUUkxfUDFTTUIgICAgICAgMHgwMDAwMDAwMSAgLyogMSA9IHN0ZXJlbyAqLworI2RlZmluZSBTQ1RSTF9QMUZNVCAgICAgICAweDAwMDAwMDAzICAvKiBmb3JtYXQgbWFzayAqLworI2RlZmluZSBTQ1RSTF9TSF9QMUZNVCAgICAwCisKKworLyogbWlzYyBzdHVmZiAqLworI2RlZmluZSBQT0xMX0NPVU5UICAgMHgxMDAwCisjZGVmaW5lIEZNT0RFX0RBQyAgICAgICAgIDQgICAgICAgICAgIC8qIHNsaWdodCBtaXN1c2Ugb2YgbW9kZV90ICovCisKKy8qIE1JREkgYnVmZmVyIHNpemVzICovCisKKyNkZWZpbmUgTUlESUlOQlVGICAyNTYKKyNkZWZpbmUgTUlESU9VVEJVRiAyNTYKKworI2RlZmluZSBGTU9ERV9NSURJX1NISUZUIDMKKyNkZWZpbmUgRk1PREVfTUlESV9SRUFEICAoRk1PREVfUkVBRCA8PCBGTU9ERV9NSURJX1NISUZUKQorI2RlZmluZSBGTU9ERV9NSURJX1dSSVRFIChGTU9ERV9XUklURSA8PCBGTU9ERV9NSURJX1NISUZUKQorCisjZGVmaW5lIEVTMTM3MV9NT0RVTEVfTkFNRSAiZXMxMzcxIgorI2RlZmluZSBQRlggRVMxMzcxX01PRFVMRV9OQU1FICI6ICIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBlczEzNzFfc3RhdGUgeworCS8qIG1hZ2ljICovCisJdW5zaWduZWQgaW50IG1hZ2ljOworCisJLyogbGlzdCBvZiBlczEzNzEgZGV2aWNlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2czsKKworCS8qIHRoZSBjb3JyZXNwb25kaW5nIHBjaV9kZXYgc3RydWN0dXJlICovCisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfYXVkaW87CisJaW50IGRldl9kYWM7CisJaW50IGRldl9taWRpOworCQorCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXVuc2lnbmVkIGxvbmcgaW87IC8qIGxvbmcgZm9yIFNQQVJDICovCisJdW5zaWduZWQgaW50IGlycTsKKworCS8qIFBDSSBJRCdzICovCisJdTE2IHZlbmRvcjsKKwl1MTYgZGV2aWNlOworICAgICAgICB1OCByZXY7IC8qIHRoZSBjaGlwIHJldmlzaW9uICovCisKKwkvKiBvcHRpb25zICovCisJaW50IHNwZGlmX3ZvbHVtZTsgLyogUy9QRElGIG91dHB1dCBpcyBlbmFibGVkIGlmICE9IC0xICovCisKKyNpZmRlZiBFUzEzNzFfREVCVUcKKyAgICAgICAgLyogZGVidWcgL3Byb2MgZW50cnkgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBzOworI2VuZGlmIC8qIEVTMTM3MV9ERUJVRyAqLworCisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCisJLyogd2F2ZSBzdHVmZiAqLworCXVuc2lnbmVkIGN0cmw7CisJdW5zaWduZWQgc2N0cmw7CisJdW5zaWduZWQgZGFjMXJhdGUsIGRhYzJyYXRlLCBhZGNyYXRlOworCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW07CisJbW9kZV90IG9wZW5fbW9kZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwlzdHJ1Y3QgZG1hYnVmIHsKKwkJdm9pZCAqcmF3YnVmOworCQlkbWFfYWRkcl90IGRtYWFkZHI7CisJCXVuc2lnbmVkIGJ1Zm9yZGVyOworCQl1bnNpZ25lZCBudW1mcmFnOworCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CisJCXVuc2lnbmVkIGh3cHRyLCBzd3B0cjsKKwkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CisJCWludCBjb3VudDsKKwkJdW5zaWduZWQgZXJyb3I7IC8qIG92ZXIvdW5kZXJydW4gKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQl1bnNpZ25lZCBmcmFnc2l6ZTsKKwkJdW5zaWduZWQgZG1hc2l6ZTsKKwkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7CisJCS8qIE9TUyBzdHVmZiAqLworCQl1bnNpZ25lZCBtYXBwZWQ6MTsKKwkJdW5zaWduZWQgcmVhZHk6MTsKKwkJdW5zaWduZWQgZW5kY2xlYXJlZDoxOworCQl1bnNpZ25lZCBlbmFibGVkOjE7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwl9IGRtYV9kYWMxLCBkbWFfZGFjMiwgZG1hX2FkYzsKKworCS8qIG1pZGkgc3R1ZmYgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpcmQsIGl3ciwgaWNudDsKKwkJdW5zaWduZWQgb3JkLCBvd3IsIG9jbnQ7CisJCXdhaXRfcXVldWVfaGVhZF90IGl3YWl0OworCQl3YWl0X3F1ZXVlX2hlYWRfdCBvd2FpdDsKKwkJdW5zaWduZWQgY2hhciBpYnVmW01JRElJTkJVRl07CisJCXVuc2lnbmVkIGNoYXIgb2J1ZltNSURJT1VUQlVGXTsKKwl9IG1pZGk7CisKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBMSVNUX0hFQUQoZGV2cyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxkMih1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCByID0gMDsKKwkKKwlpZiAoeCA+PSAweDEwMDAwKSB7CisJCXggPj49IDE2OworCQlyICs9IDE2OworCX0KKwlpZiAoeCA+PSAweDEwMCkgeworCQl4ID4+PSA4OworCQlyICs9IDg7CisJfQorCWlmICh4ID49IDB4MTApIHsKKwkJeCA+Pj0gNDsKKwkJciArPSA0OworCX0KKwlpZiAoeCA+PSA0KSB7CisJCXggPj49IDI7CisJCXIgKz0gMjsKKwl9CisJaWYgKHggPj0gMikKKwkJcisrOworCXJldHVybiByOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIHdhaXRfc3JjX3JlYWR5KHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgaW50IHQsIHI7CisKKwlmb3IgKHQgPSAwOyB0IDwgUE9MTF9DT1VOVDsgdCsrKSB7CisJCWlmICghKChyID0gaW5sKHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpKSAmIFNSQ19CVVNZKSkKKwkJCXJldHVybiByOworCQl1ZGVsYXkoMSk7CisJfQorCXByaW50ayhLRVJOX0RFQlVHIFBGWCAic2FtcGxlIHJhdGUgY29udmVydGVyIHRpbWVvdXQgciA9IDB4JTA4eFxuIiwgcik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzcmNfcmVhZChzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCB1bnNpZ25lZCByZWcpCit7CisgICAgICAgIHVuc2lnbmVkIGludCB0ZW1wLGksb3JpZzsKKworICAgICAgICAvKiB3YWl0IGZvciByZWFkeSAqLworICAgICAgICB0ZW1wID0gd2FpdF9zcmNfcmVhZHkgKHMpOworCisgICAgICAgIC8qIHdlIGNhbiBvbmx5IGFjY2VzcyB0aGUgU1JDIGF0IGNlcnRhaW4gdGltZXMsIG1ha2Ugc3VyZQorICAgICAgICAgICB3ZSdyZSBhbGxvd2VkIHRvIGJlZm9yZSB3ZSByZWFkICovCisgICAgICAgICAgIAorICAgICAgICBvcmlnID0gdGVtcDsKKyAgICAgICAgLyogZXhwb3NlIHRoZSBTUkMgc3RhdGUgYml0cyAqLworICAgICAgICBvdXRsICggKHRlbXAgJiBTUkNfQ1RMTUFTSykgfCAocmVnIDw8IFNSQ19SQU1BRERSX1NISUZUKSB8IDB4MTAwMDBVTCwKKyAgICAgICAgICAgICAgIHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpOworCisgICAgICAgIC8qIG5vdywgd2FpdCBmb3IgYnVzeSBhbmQgdGhlIGNvcnJlY3QgdGltZSB0byByZWFkICovCisgICAgICAgIHRlbXAgPSB3YWl0X3NyY19yZWFkeSAocyk7CisKKyAgICAgICAgaWYgKCAodGVtcCAmIDB4MDA4NzAwMDBVTCApICE9ICggU1JDX09LU1RBVEUgPDwgMTYgKSl7CisgICAgICAgICAgICAgICAgLyogd2FpdCBmb3IgdGhlIHJpZ2h0IHN0YXRlICovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8UE9MTF9DT1VOVDsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBpbmwgKHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAodGVtcCAmIDB4MDA4NzAwMDBVTCApID09ICggU1JDX09LU1RBVEUgPDwgMTYgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogaGlkZSB0aGUgc3RhdGUgYml0cyAqLworICAgICAgICBvdXRsICgob3JpZyAmIFNSQ19DVExNQVNLKSB8IChyZWcgPDwgU1JDX1JBTUFERFJfU0hJRlQpLCBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKKyAgICAgICAgcmV0dXJuIHRlbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKK30KKworc3RhdGljIHZvaWQgc3JjX3dyaXRlKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHVuc2lnbmVkIHJlZywgdW5zaWduZWQgZGF0YSkKK3sKKyAgICAgIAorCXVuc2lnbmVkIGludCByOworCisJciA9IHdhaXRfc3JjX3JlYWR5KHMpICYgKFNSQ19ESVMgfCBTUkNfRERBQzEgfCBTUkNfRERBQzIgfCBTUkNfREFEQyk7CisJciB8PSAocmVnIDw8IFNSQ19SQU1BRERSX1NISUZUKSAmIFNSQ19SQU1BRERSX01BU0s7CisJciB8PSAoZGF0YSA8PCBTUkNfUkFNREFUQV9TSElGVCkgJiBTUkNfUkFNREFUQV9NQVNLOworCW91dGwociB8IFNSQ19XRSwgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIG1vc3Qgb2YgdGhlIGZvbGxvd2luZyBoZXJlIGlzIGJsYWNrIG1hZ2ljICovCitzdGF0aWMgdm9pZCBzZXRfYWRjX3JhdGUoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBuLCB0cnVuY20sIGZyZXE7CisKKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA0MDAwKQorCQlyYXRlID0gNDAwMDsKKwluID0gcmF0ZSAvIDMwMDA7CisJaWYgKCgxIDw8IG4pICYgKCgxIDw8IDE1KSB8ICgxIDw8IDEzKSB8ICgxIDw8IDExKSB8ICgxIDw8IDkpKSkKKwkJbi0tOworCXRydW5jbSA9ICgyMSAqIG4gLSAxKSB8IDE7CisgICAgICAgIGZyZXEgPSAoKDQ4MDAwVUwgPDwgMTUpIC8gcmF0ZSkgKiBuOworCXMtPmFkY3JhdGUgPSAoNDgwMDBVTCA8PCAxNSkgLyAoZnJlcSAvIG4pOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKHJhdGUgPj0gMjQwMDApIHsKKwkJaWYgKHRydW5jbSA+IDIzOSkKKwkJCXRydW5jbSA9IDIzOTsKKwkJc3JjX3dyaXRlKHMsIFNSQ1JFR19BREMrU1JDUkVHX1RSVU5DX04sIAorCQkJICAoKCgyMzkgLSB0cnVuY20pID4+IDEpIDw8IDkpIHwgKG4gPDwgNCkpOworCX0gZWxzZSB7CisJCWlmICh0cnVuY20gPiAxMTkpCisJCQl0cnVuY20gPSAxMTk7CisJCXNyY193cml0ZShzLCBTUkNSRUdfQURDK1NSQ1JFR19UUlVOQ19OLCAKKwkJCSAgMHg4MDAwIHwgKCgoMTE5IC0gdHJ1bmNtKSA+PiAxKSA8PCA5KSB8IChuIDw8IDQpKTsKKwl9CQkKKwlzcmNfd3JpdGUocywgU1JDUkVHX0FEQytTUkNSRUdfSU5UX1JFR1MsIAorCQkgIChzcmNfcmVhZChzLCBTUkNSRUdfQURDK1NSQ1JFR19JTlRfUkVHUykgJiAweDAwZmYpIHwKKwkJICAoKGZyZXEgPj4gNSkgJiAweGZjMDApKTsKKwlzcmNfd3JpdGUocywgU1JDUkVHX0FEQytTUkNSRUdfVkZSRVFfRlJBQywgZnJlcSAmIDB4N2ZmZik7CisJc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfQURDLCBuIDw8IDgpOworCXNyY193cml0ZShzLCBTUkNSRUdfVk9MX0FEQysxLCBuIDw8IDgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCBzZXRfZGFjMV9yYXRlKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZnJlcSwgcjsKKworCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDQwMDApCisJCXJhdGUgPSA0MDAwOworICAgICAgICBmcmVxID0gKChyYXRlIDw8IDE1KSArIDE1MDApIC8gMzAwMDsKKwlzLT5kYWMxcmF0ZSA9IChmcmVxICogMzAwMCArIDE2Mzg0KSA+PiAxNTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXIgPSAod2FpdF9zcmNfcmVhZHkocykgJiAoU1JDX0RJUyB8IFNSQ19EREFDMiB8IFNSQ19EQURDKSkgfCBTUkNfRERBQzE7CisJb3V0bChyLCBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKKwlzcmNfd3JpdGUocywgU1JDUkVHX0RBQzErU1JDUkVHX0lOVF9SRUdTLCAKKwkJICAoc3JjX3JlYWQocywgU1JDUkVHX0RBQzErU1JDUkVHX0lOVF9SRUdTKSAmIDB4MDBmZikgfAorCQkgICgoZnJlcSA+PiA1KSAmIDB4ZmMwMCkpOworCXNyY193cml0ZShzLCBTUkNSRUdfREFDMStTUkNSRUdfVkZSRVFfRlJBQywgZnJlcSAmIDB4N2ZmZik7CisJciA9ICh3YWl0X3NyY19yZWFkeShzKSAmIChTUkNfRElTIHwgU1JDX0REQUMyIHwgU1JDX0RBREMpKTsKKwlvdXRsKHIsIHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2RhYzJfcmF0ZShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGZyZXEsIHI7CisKKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA0MDAwKQorCQlyYXRlID0gNDAwMDsKKyAgICAgICAgZnJlcSA9ICgocmF0ZSA8PCAxNSkgKyAxNTAwKSAvIDMwMDA7CisJcy0+ZGFjMnJhdGUgPSAoZnJlcSAqIDMwMDAgKyAxNjM4NCkgPj4gMTU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyID0gKHdhaXRfc3JjX3JlYWR5KHMpICYgKFNSQ19ESVMgfCBTUkNfRERBQzEgfCBTUkNfREFEQykpIHwgU1JDX0REQUMyOworCW91dGwociwgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CisJc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMyK1NSQ1JFR19JTlRfUkVHUywgCisJCSAgKHNyY19yZWFkKHMsIFNSQ1JFR19EQUMyK1NSQ1JFR19JTlRfUkVHUykgJiAweDAwZmYpIHwKKwkJICAoKGZyZXEgPj4gNSkgJiAweGZjMDApKTsKKwlzcmNfd3JpdGUocywgU1JDUkVHX0RBQzIrU1JDUkVHX1ZGUkVRX0ZSQUMsIGZyZXEgJiAweDdmZmYpOworCXIgPSAod2FpdF9zcmNfcmVhZHkocykgJiAoU1JDX0RJUyB8IFNSQ19EREFDMSB8IFNSQ19EQURDKSk7CisJb3V0bChyLCBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc3JjX2luaXQoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgICAgLyogYmVmb3JlIHdlIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBTUkMgd2UgbmVlZAorICAgICAgICAgICB0byB3YWl0IGZvciBpdCB0byBiZWNvbWUgcmVhZHkgKi8KKyAgICAgICAgd2FpdF9zcmNfcmVhZHkocyk7CisKKyAgICAgICAgb3V0bChTUkNfRElTLCBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMHg4MDsgaSsrKQorICAgICAgICAgICAgICAgIHNyY193cml0ZShzLCBpLCAwKTsKKworICAgICAgICBzcmNfd3JpdGUocywgU1JDUkVHX0RBQzErU1JDUkVHX1RSVU5DX04sIDE2IDw8IDQpOworICAgICAgICBzcmNfd3JpdGUocywgU1JDUkVHX0RBQzErU1JDUkVHX0lOVF9SRUdTLCAxNiA8PCAxMCk7CisgICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfREFDMitTUkNSRUdfVFJVTkNfTiwgMTYgPDwgNCk7CisgICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfREFDMitTUkNSRUdfSU5UX1JFR1MsIDE2IDw8IDEwKTsKKyAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfQURDLCAxIDw8IDEyKTsKKyAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfQURDKzEsIDEgPDwgMTIpOworICAgICAgICBzcmNfd3JpdGUocywgU1JDUkVHX1ZPTF9EQUMxLCAxIDw8IDEyKTsKKyAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfREFDMSsxLCAxIDw8IDEyKTsKKyAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfREFDMiwgMSA8PCAxMik7CisgICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfVk9MX0RBQzIrMSwgMSA8PCAxMik7CisgICAgICAgIHNldF9hZGNfcmF0ZShzLCAyMjA1MCk7CisgICAgICAgIHNldF9kYWMxX3JhdGUocywgMjIwNTApOworICAgICAgICBzZXRfZGFjMl9yYXRlKHMsIDIyMDUwKTsKKworICAgICAgICAvKiBXQVJOSU5HOgorICAgICAgICAgKiBlbmFibGluZyB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVyIHdpdGhvdXQgcHJvcGVybHkgcHJvZ3JhbW1pbmcKKyAgICAgICAgICogaXRzIHBhcmFtZXRlcnMgY2F1c2VzIHRoZSBjaGlwIHRvIGxvY2sgdXAgKHRoZSBTUkMgYnVzeSBiaXQgd2lsbAorICAgICAgICAgKiBiZSBzdHVjayBoaWdoLCBhbmQgSSd2ZSBmb3VuZCBubyB3YXkgdG8gcmVjdGlmeSB0aGlzIG90aGVyIHRoYW4KKyAgICAgICAgICogcG93ZXIgY3ljbGUpCisgICAgICAgICAqLworICAgICAgICB3YWl0X3NyY19yZWFkeShzKTsKKyAgICAgICAgb3V0bCgwLCBzLT5pbytFUzEzNzFfUkVHX1NSQ09OVik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCB3cmNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggYWRkciwgdTE2IGRhdGEpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHQsIHg7CisgICAgICAgIAorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJZm9yICh0ID0gMDsgdCA8IFBPTExfQ09VTlQ7IHQrKykKKwkJaWYgKCEoaW5sKHMtPmlvK0VTMTM3MV9SRUdfQ09ERUMpICYgQ09ERUNfV0lQKSkKKwkJCWJyZWFrOworCisgICAgICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGxhdGVyICovCisgICAgICAgIHggPSB3YWl0X3NyY19yZWFkeShzKTsKKworICAgICAgICAvKiBlbmFibGUgU1JDIHN0YXRlIGRhdGEgaW4gU1JDIG11eCAqLworCW91dGwoKHggJiAoU1JDX0RJUyB8IFNSQ19EREFDMSB8IFNSQ19EREFDMiB8IFNSQ19EQURDKSkgfCAweDAwMDEwMDAwLAorCSAgICAgcy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpOworCisgICAgICAgIC8qIHdhaXQgZm9yIG5vdCBidXN5IChzdGF0ZSAwKSBmaXJzdCB0byBhdm9pZAorICAgICAgICAgICB0cmFuc2l0aW9uIHN0YXRlcyAqLworICAgICAgICBmb3IgKHQ9MDsgdDxQT0xMX0NPVU5UOyB0KyspeworICAgICAgICAgICAgICAgIGlmKChpbmwocy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpICYgMHgwMDg3MDAwMCkgPT0wICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgdWRlbGF5KDEpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiB3YWl0IGZvciBhIFNBRkUgdGltZSB0byB3cml0ZSBhZGRyL2RhdGEgYW5kIHRoZW4gZG8gaXQsIGRhbW1pdCAqLworICAgICAgICBmb3IgKHQ9MDsgdDxQT0xMX0NPVU5UOyB0KyspeworICAgICAgICAgICAgICAgIGlmKChpbmwocy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpICYgMHgwMDg3MDAwMCkgPT0weDAwMDEwMDAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgIH0KKworCW91dGwoKChhZGRyIDw8IENPREVDX1BPQUREX1NISUZUKSAmIENPREVDX1BPQUREX01BU0spIHwKKwkgICAgICgoZGF0YSA8PCBDT0RFQ19QT0RBVF9TSElGVCkgJiBDT0RFQ19QT0RBVF9NQVNLKSwgcy0+aW8rRVMxMzcxX1JFR19DT0RFQyk7CisKKwkvKiByZXN0b3JlIFNSQyByZWcgKi8KKwl3YWl0X3NyY19yZWFkeShzKTsKKwlvdXRsKHgsIHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1MTYgcmRjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IGFkZHIpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHQsIHg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQorICAgICAgICAvKiB3YWl0IGZvciBXSVAgdG8gZ28gYXdheSAqLworCWZvciAodCA9IDA7IHQgPCAweDEwMDA7IHQrKykKKwkJaWYgKCEoaW5sKHMtPmlvK0VTMTM3MV9SRUdfQ09ERUMpICYgQ09ERUNfV0lQKSkKKwkJCWJyZWFrOworCisJLyogc2F2ZSB0aGUgY3VycmVudCBzdGF0ZSBmb3IgbGF0ZXIgKi8KKwl4ID0gKHdhaXRfc3JjX3JlYWR5KHMpICYgKFNSQ19ESVMgfCBTUkNfRERBQzEgfCBTUkNfRERBQzIgfCBTUkNfREFEQykpOworCisJLyogZW5hYmxlIFNSQyBzdGF0ZSBkYXRhIGluIFNSQyBtdXggKi8KKwlvdXRsKCB4IHwgMHgwMDAxMDAwMCwKKyAgICAgICAgICAgICAgcy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpOworCisgICAgICAgIC8qIHdhaXQgZm9yIG5vdCBidXN5IChzdGF0ZSAwKSBmaXJzdCB0byBhdm9pZAorICAgICAgICAgICB0cmFuc2l0aW9uIHN0YXRlcyAqLworICAgICAgICBmb3IgKHQ9MDsgdDxQT0xMX0NPVU5UOyB0KyspeworICAgICAgICAgICAgICAgIGlmKChpbmwocy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpICYgMHgwMDg3MDAwMCkgPT0wICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgdWRlbGF5KDEpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiB3YWl0IGZvciBhIFNBRkUgdGltZSB0byB3cml0ZSBhZGRyL2RhdGEgYW5kIHRoZW4gZG8gaXQsIGRhbW1pdCAqLworICAgICAgICBmb3IgKHQ9MDsgdDxQT0xMX0NPVU5UOyB0KyspeworICAgICAgICAgICAgICAgIGlmKChpbmwocy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpICYgMHgwMDg3MDAwMCkgPT0weDAwMDEwMDAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgIH0KKworCW91dGwoKChhZGRyIDw8IENPREVDX1BPQUREX1NISUZUKSAmIENPREVDX1BPQUREX01BU0spIHwgQ09ERUNfUE9SRCwgcy0+aW8rRVMxMzcxX1JFR19DT0RFQyk7CisJLyogcmVzdG9yZSBTUkMgcmVnICovCisJd2FpdF9zcmNfcmVhZHkocyk7CisJb3V0bCh4LCBzLT5pbytFUzEzNzFfUkVHX1NSQ09OVik7CisKKyAgICAgICAgLyogd2FpdCBmb3IgV0lQIGFnYWluICovCisJZm9yICh0ID0gMDsgdCA8IDB4MTAwMDsgdCsrKQorCQlpZiAoIShpbmwocy0+aW8rRVMxMzcxX1JFR19DT0RFQykgJiBDT0RFQ19XSVApKQorCQkJYnJlYWs7CisgICAgICAgIAorCS8qIG5vdyB3YWl0IGZvciB0aGUgc3RpbmtpbicgZGF0YSAoUkRZKSAqLworCWZvciAodCA9IDA7IHQgPCBQT0xMX0NPVU5UOyB0KyspCisJCWlmICgoeCA9IGlubChzLT5pbytFUzEzNzFfUkVHX0NPREVDKSkgJiBDT0RFQ19SRFkpCisJCQlicmVhazsKKyAgICAgICAgCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAoKHggJiBDT0RFQ19QSURBVF9NQVNLKSA+PiBDT0RFQ19QSURBVF9TSElGVCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9hZGMoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5jdHJsICY9IH5DVFJMX0FEQ19FTjsKKwlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfZGFjMShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmN0cmwgJj0gfkNUUkxfREFDMV9FTjsKKwlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfZGFjMihzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmN0cmwgJj0gfkNUUkxfREFDMl9FTjsKKwlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworc3RhdGljIHZvaWQgc3RhcnRfZGFjMShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgZnJhZ3JlbWFpbiwgZnNoaWZ0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5jdHJsICYgQ1RSTF9EQUMxX0VOKSAmJiAocy0+ZG1hX2RhYzEubWFwcGVkIHx8IHMtPmRtYV9kYWMxLmNvdW50ID4gMCkKKwkgICAgJiYgcy0+ZG1hX2RhYzEucmVhZHkpIHsKKwkJcy0+Y3RybCB8PSBDVFJMX0RBQzFfRU47CisJCXMtPnNjdHJsID0gKHMtPnNjdHJsICYgfihTQ1RSTF9QMUxPT1BTRUwgfCBTQ1RSTF9QMVBBVVNFIHwgU0NUUkxfUDFTQ1RSTEQpKSB8IFNDVFJMX1AxSU5URU47CisJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQlmcmFncmVtYWluID0gKCgtIHMtPmRtYV9kYWMxLmh3cHRyKSAmIChzLT5kbWFfZGFjMS5mcmFnc2l6ZS0xKSk7CisJCWZzaGlmdCA9IHNhbXBsZV9zaGlmdFsocy0+c2N0cmwgJiBTQ1RSTF9QMUZNVCkgPj4gU0NUUkxfU0hfUDFGTVRdOworCQlpZiAoZnJhZ3JlbWFpbiA8IDIqZnNoaWZ0KQorCQkJZnJhZ3JlbWFpbiA9IHMtPmRtYV9kYWMxLmZyYWdzaXplOworCQlvdXRsKChmcmFncmVtYWluID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzFfUkVHX0RBQzFfU0NPVU5UKTsKKwkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCQlvdXRsKChzLT5kbWFfZGFjMS5mcmFnc2l6ZSA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcxX1JFR19EQUMxX1NDT1VOVCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2RhYzIoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGZyYWdyZW1haW4sIGZzaGlmdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+Y3RybCAmIENUUkxfREFDMl9FTikgJiYgKHMtPmRtYV9kYWMyLm1hcHBlZCB8fCBzLT5kbWFfZGFjMi5jb3VudCA+IDApCisJICAgICYmIHMtPmRtYV9kYWMyLnJlYWR5KSB7CisJCXMtPmN0cmwgfD0gQ1RSTF9EQUMyX0VOOworCQlzLT5zY3RybCA9IChzLT5zY3RybCAmIH4oU0NUUkxfUDJMT09QU0VMIHwgU0NUUkxfUDJQQVVTRSB8IFNDVFJMX1AyREFDU0VOIHwgCisJCQkJCSBTQ1RSTF9QMkVORElOQyB8IFNDVFJMX1AyU1RJTkMpKSB8IFNDVFJMX1AySU5URU4gfAorCQkJKCgocy0+c2N0cmwgJiBTQ1RSTF9QMkZNVCkgPyAyIDogMSkgPDwgU0NUUkxfU0hfUDJFTkRJTkMpIHwgCisJCQkoMCA8PCBTQ1RSTF9TSF9QMlNUSU5DKTsKKwkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCWZyYWdyZW1haW4gPSAoKC0gcy0+ZG1hX2RhYzIuaHdwdHIpICYgKHMtPmRtYV9kYWMyLmZyYWdzaXplLTEpKTsKKwkJZnNoaWZ0ID0gc2FtcGxlX3NoaWZ0WyhzLT5zY3RybCAmIFNDVFJMX1AyRk1UKSA+PiBTQ1RSTF9TSF9QMkZNVF07CisJCWlmIChmcmFncmVtYWluIDwgMipmc2hpZnQpCisJCQlmcmFncmVtYWluID0gcy0+ZG1hX2RhYzIuZnJhZ3NpemU7CisJCW91dGwoKGZyYWdyZW1haW4gPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MV9SRUdfREFDMl9TQ09VTlQpOworCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJCW91dGwoKHMtPmRtYV9kYWMyLmZyYWdzaXplID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzFfUkVHX0RBQzJfU0NPVU5UKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBmcmFncmVtYWluLCBmc2hpZnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPmN0cmwgJiBDVFJMX0FEQ19FTikgJiYgKHMtPmRtYV9hZGMubWFwcGVkIHx8IHMtPmRtYV9hZGMuY291bnQgPCAoc2lnbmVkKShzLT5kbWFfYWRjLmRtYXNpemUgLSAyKnMtPmRtYV9hZGMuZnJhZ3NpemUpKQorCSAgICAmJiBzLT5kbWFfYWRjLnJlYWR5KSB7CisJCXMtPmN0cmwgfD0gQ1RSTF9BRENfRU47CisJCXMtPnNjdHJsID0gKHMtPnNjdHJsICYgflNDVFJMX1IxTE9PUFNFTCkgfCBTQ1RSTF9SMUlOVEVOOworCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJZnJhZ3JlbWFpbiA9ICgoLSBzLT5kbWFfYWRjLmh3cHRyKSAmIChzLT5kbWFfYWRjLmZyYWdzaXplLTEpKTsKKwkJZnNoaWZ0ID0gc2FtcGxlX3NoaWZ0WyhzLT5zY3RybCAmIFNDVFJMX1IxRk1UKSA+PiBTQ1RSTF9TSF9SMUZNVF07CisJCWlmIChmcmFncmVtYWluIDwgMipmc2hpZnQpCisJCQlmcmFncmVtYWluID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZTsKKwkJb3V0bCgoZnJhZ3JlbWFpbiA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcxX1JFR19BRENfU0NPVU5UKTsKKwkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCQlvdXRsKChzLT5kbWFfYWRjLmZyYWdzaXplID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzFfUkVHX0FEQ19TQ09VTlQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNy1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CisKKwlpZiAoZGItPnJhd2J1ZikgeworCQkvKiB1bmRvIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocy0+ZGV2LCBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyLCBkYi0+cmF3YnVmLCBkYi0+ZG1hYWRkcik7CisJfQorCWRiLT5yYXdidWYgPSBOVUxMOworCWRiLT5tYXBwZWQgPSBkYi0+cmVhZHkgPSAwOworfQorCitzdGF0aWMgaW50IHByb2dfZG1hYnVmKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiLCB1bnNpZ25lZCByYXRlLCB1bnNpZ25lZCBmbXQsIHVuc2lnbmVkIHJlZykKK3sKKwlpbnQgb3JkZXI7CisJdW5zaWduZWQgYnl0ZXBlcnNlYzsKKwl1bnNpZ25lZCBidWZzOworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWRiLT5od3B0ciA9IGRiLT5zd3B0ciA9IGRiLT50b3RhbF9ieXRlcyA9IGRiLT5jb3VudCA9IGRiLT5lcnJvciA9IGRiLT5lbmRjbGVhcmVkID0gMDsKKwlpZiAoIWRiLT5yYXdidWYpIHsKKwkJZGItPnJlYWR5ID0gZGItPm1hcHBlZCA9IDA7CisJCWZvciAob3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pCisJCQlpZiAoKGRiLT5yYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRiLT5kbWFhZGRyKSkpCisJCQkJYnJlYWs7CisJCWlmICghZGItPnJhd2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlkYi0+YnVmb3JkZXIgPSBvcmRlcjsKKwkJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCX0KKwlmbXQgJj0gRVMxMzcxX0ZNVF9NQVNLOworCWJ5dGVwZXJzZWMgPSByYXRlIDw8IHNhbXBsZV9zaGlmdFtmbXRdOworCWJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworCWlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVwZXJzZWMpCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwMCk7CisJCWVsc2UKKwkJCWRiLT5mcmFnc2hpZnQgPSBkYi0+b3NzZnJhZ3NoaWZ0OworCX0gZWxzZSB7CisJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAvKGRiLT5zdWJkaXZpc2lvbiA/IGRiLT5zdWJkaXZpc2lvbiA6IDEpKTsKKwkJaWYgKGRiLT5mcmFnc2hpZnQgPCAzKQorCQkJZGItPmZyYWdzaGlmdCA9IDM7CisJfQorCWRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl9CisJZGItPmZyYWdzaXplID0gMSA8PCBkYi0+ZnJhZ3NoaWZ0OworCWlmIChkYi0+b3NzbWF4ZnJhZ3MgPj0gNCAmJiBkYi0+b3NzbWF4ZnJhZ3MgPCBkYi0+bnVtZnJhZykKKwkJZGItPm51bWZyYWcgPSBkYi0+b3NzbWF4ZnJhZ3M7CisJZGItPmZyYWdzYW1wbGVzID0gZGItPmZyYWdzaXplID4+IHNhbXBsZV9zaGlmdFtmbXRdOworCWRiLT5kbWFzaXplID0gZGItPm51bWZyYWcgPDwgZGItPmZyYWdzaGlmdDsKKwltZW1zZXQoZGItPnJhd2J1ZiwgKGZtdCAmIEVTMTM3MV9GTVRfUzE2KSA/IDAgOiAweDgwLCBkYi0+ZG1hc2l6ZSk7CisJb3V0bCgocmVnID4+IDgpICYgMTUsIHMtPmlvK0VTMTM3MV9SRUdfTUVNUEFHRSk7CisJb3V0bChkYi0+ZG1hYWRkciwgcy0+aW8rKHJlZyAmIDB4ZmYpKTsKKwlvdXRsKChkYi0+ZG1hc2l6ZSA+PiAyKS0xLCBzLT5pbysoKHJlZyArIDQpICYgMHhmZikpOworCWRiLT5lbmFibGVkID0gMTsKKwlkYi0+cmVhZHkgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9hZGMoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwlzdG9wX2FkYyhzKTsKKwlyZXR1cm4gcHJvZ19kbWFidWYocywgJnMtPmRtYV9hZGMsIHMtPmFkY3JhdGUsIChzLT5zY3RybCA+PiBTQ1RSTF9TSF9SMUZNVCkgJiBFUzEzNzFfRk1UX01BU0ssIAorCQkJICAgRVMxMzcxX1JFR19BRENfRlJBTUVBRFIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9kYWMyKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJc3RvcF9kYWMyKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYzIsIHMtPmRhYzJyYXRlLCAocy0+c2N0cmwgPj4gU0NUUkxfU0hfUDJGTVQpICYgRVMxMzcxX0ZNVF9NQVNLLCAKKwkJCSAgIEVTMTM3MV9SRUdfREFDMl9GUkFNRUFEUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2RhYzEoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwlzdG9wX2RhYzEocyk7CisJcmV0dXJuIHByb2dfZG1hYnVmKHMsICZzLT5kbWFfZGFjMSwgcy0+ZGFjMXJhdGUsIChzLT5zY3RybCA+PiBTQ1RSTF9TSF9QMUZNVCkgJiBFUzEzNzFfRk1UX01BU0ssCisJCQkgICBFUzEzNzFfUkVHX0RBQzFfRlJBTUVBRFIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF9od3B0cihzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYiwgdW5zaWduZWQgcmVnKQoreworCXVuc2lnbmVkIGh3cHRyLCBkaWZmOworCisJb3V0bCgocmVnID4+IDgpICYgMTUsIHMtPmlvK0VTMTM3MV9SRUdfTUVNUEFHRSk7CisJaHdwdHIgPSAoaW5sKHMtPmlvKyhyZWcgJiAweGZmKSkgPj4gMTQpICYgMHgzZmZmYzsKKwlkaWZmID0gKGRiLT5kbWFzaXplICsgaHdwdHIgLSBkYi0+aHdwdHIpICUgZGItPmRtYXNpemU7CisJZGItPmh3cHRyID0gaHdwdHI7CisJcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9hZHZhbmNlKHZvaWQgKmJ1ZiwgdW5zaWduZWQgYnNpemUsIHVuc2lnbmVkIGJwdHIsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY2hhciBjKQoreworCWlmIChicHRyICsgbGVuID4gYnNpemUpIHsKKwkJdW5zaWduZWQgeCA9IGJzaXplIC0gYnB0cjsKKwkJbWVtc2V0KCgoY2hhciAqKWJ1ZikgKyBicHRyLCBjLCB4KTsKKwkJYnB0ciA9IDA7CisJCWxlbiAtPSB4OworCX0KKwltZW1zZXQoKChjaGFyICopYnVmKSArIGJwdHIsIGMsIGxlbik7Cit9CisKKy8qIGNhbGwgd2l0aCBzcGlubG9jayBoZWxkISAqLworc3RhdGljIHZvaWQgZXMxMzcxX3VwZGF0ZV9wdHIoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwlpbnQgZGlmZjsKKworCS8qIHVwZGF0ZSBBREMgcG9pbnRlciAqLworCWlmIChzLT5jdHJsICYgQ1RSTF9BRENfRU4pIHsKKwkJZGlmZiA9IGdldF9od3B0cihzLCAmcy0+ZG1hX2FkYywgRVMxMzcxX1JFR19BRENfRlJBTUVDTlQpOworCQlzLT5kbWFfYWRjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCXMtPmRtYV9hZGMuY291bnQgKz0gZGlmZjsKKwkJaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfYWRjLmZyYWdzaXplKSAKKwkJCXdha2VfdXAoJnMtPmRtYV9hZGMud2FpdCk7CisJCWlmICghcy0+ZG1hX2FkYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID4gKHNpZ25lZCkocy0+ZG1hX2FkYy5kbWFzaXplIC0gKCgzICogcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgPj4gMSkpKSB7CisJCQkJcy0+Y3RybCAmPSB+Q1RSTF9BRENfRU47CisJCQkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCQkJCXMtPmRtYV9hZGMuZXJyb3IrKzsKKwkJCX0KKwkJfQorCX0KKwkvKiB1cGRhdGUgREFDMSBwb2ludGVyICovCisJaWYgKHMtPmN0cmwgJiBDVFJMX0RBQzFfRU4pIHsKKwkJZGlmZiA9IGdldF9od3B0cihzLCAmcy0+ZG1hX2RhYzEsIEVTMTM3MV9SRUdfREFDMV9GUkFNRUNOVCk7CisJCXMtPmRtYV9kYWMxLnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWlmIChzLT5kbWFfZGFjMS5tYXBwZWQpIHsKKwkJCXMtPmRtYV9kYWMxLmNvdW50ICs9IGRpZmY7CisJCQlpZiAocy0+ZG1hX2RhYzEuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfZGFjMS5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZzLT5kbWFfZGFjMS53YWl0KTsKKwkJfSBlbHNlIHsKKwkJCXMtPmRtYV9kYWMxLmNvdW50IC09IGRpZmY7CisJCQlpZiAocy0+ZG1hX2RhYzEuY291bnQgPD0gMCkgeworCQkJCXMtPmN0cmwgJj0gfkNUUkxfREFDMV9FTjsKKwkJCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJCQkJcy0+ZG1hX2RhYzEuZXJyb3IrKzsKKwkJCX0gZWxzZSBpZiAocy0+ZG1hX2RhYzEuY291bnQgPD0gKHNpZ25lZClzLT5kbWFfZGFjMS5mcmFnc2l6ZSAmJiAhcy0+ZG1hX2RhYzEuZW5kY2xlYXJlZCkgeworCQkJCWNsZWFyX2FkdmFuY2Uocy0+ZG1hX2RhYzEucmF3YnVmLCBzLT5kbWFfZGFjMS5kbWFzaXplLCBzLT5kbWFfZGFjMS5zd3B0ciwgCisJCQkJCSAgICAgIHMtPmRtYV9kYWMxLmZyYWdzaXplLCAocy0+c2N0cmwgJiBTQ1RSTF9QMVNFQikgPyAwIDogMHg4MCk7CisJCQkJcy0+ZG1hX2RhYzEuZW5kY2xlYXJlZCA9IDE7CisJCQl9CisJCQlpZiAocy0+ZG1hX2RhYzEuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMxLmZyYWdzaXplIDw9IChzaWduZWQpcy0+ZG1hX2RhYzEuZG1hc2l6ZSkKKwkJCQl3YWtlX3VwKCZzLT5kbWFfZGFjMS53YWl0KTsKKwkJfQorCX0KKwkvKiB1cGRhdGUgREFDMiBwb2ludGVyICovCisJaWYgKHMtPmN0cmwgJiBDVFJMX0RBQzJfRU4pIHsKKwkJZGlmZiA9IGdldF9od3B0cihzLCAmcy0+ZG1hX2RhYzIsIEVTMTM3MV9SRUdfREFDMl9GUkFNRUNOVCk7CisJCXMtPmRtYV9kYWMyLnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpIHsKKwkJCXMtPmRtYV9kYWMyLmNvdW50ICs9IGRpZmY7CisJCQlpZiAocy0+ZG1hX2RhYzIuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfZGFjMi5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZzLT5kbWFfZGFjMi53YWl0KTsKKwkJfSBlbHNlIHsKKwkJCXMtPmRtYV9kYWMyLmNvdW50IC09IGRpZmY7CisJCQlpZiAocy0+ZG1hX2RhYzIuY291bnQgPD0gMCkgeworCQkJCXMtPmN0cmwgJj0gfkNUUkxfREFDMl9FTjsKKwkJCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJCQkJcy0+ZG1hX2RhYzIuZXJyb3IrKzsKKwkJCX0gZWxzZSBpZiAocy0+ZG1hX2RhYzIuY291bnQgPD0gKHNpZ25lZClzLT5kbWFfZGFjMi5mcmFnc2l6ZSAmJiAhcy0+ZG1hX2RhYzIuZW5kY2xlYXJlZCkgeworCQkJCWNsZWFyX2FkdmFuY2Uocy0+ZG1hX2RhYzIucmF3YnVmLCBzLT5kbWFfZGFjMi5kbWFzaXplLCBzLT5kbWFfZGFjMi5zd3B0ciwgCisJCQkJCSAgICAgIHMtPmRtYV9kYWMyLmZyYWdzaXplLCAocy0+c2N0cmwgJiBTQ1RSTF9QMlNFQikgPyAwIDogMHg4MCk7CisJCQkJcy0+ZG1hX2RhYzIuZW5kY2xlYXJlZCA9IDE7CisJCQl9CisJCQlpZiAocy0+ZG1hX2RhYzIuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMyLmZyYWdzaXplIDw9IChzaWduZWQpcy0+ZG1hX2RhYzIuZG1hc2l6ZSkKKwkJCQl3YWtlX3VwKCZzLT5kbWFfZGFjMi53YWl0KTsKKwkJfQorCX0KK30KKworLyogaG9sZCBzcGlubG9jayBmb3IgdGhlIGZvbGxvd2luZyEgKi8KK3N0YXRpYyB2b2lkIGVzMTM3MV9oYW5kbGVfbWlkaShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGNoYXIgY2g7CisJaW50IHdha2U7CisKKwlpZiAoIShzLT5jdHJsICYgQ1RSTF9VQVJUX0VOKSkKKwkJcmV0dXJuOworCXdha2UgPSAwOworCXdoaWxlIChpbmIocy0+aW8rRVMxMzcxX1JFR19VQVJUX1NUQVRVUykgJiBVU1RBVF9SWFJEWSkgeworCQljaCA9IGluYihzLT5pbytFUzEzNzFfUkVHX1VBUlRfREFUQSk7CisJCWlmIChzLT5taWRpLmljbnQgPCBNSURJSU5CVUYpIHsKKwkJCXMtPm1pZGkuaWJ1ZltzLT5taWRpLml3cl0gPSBjaDsKKwkJCXMtPm1pZGkuaXdyID0gKHMtPm1pZGkuaXdyICsgMSkgJSBNSURJSU5CVUY7CisJCQlzLT5taWRpLmljbnQrKzsKKwkJfQorCQl3YWtlID0gMTsKKwl9CisJaWYgKHdha2UpCisJCXdha2VfdXAoJnMtPm1pZGkuaXdhaXQpOworCXdha2UgPSAwOworCXdoaWxlICgoaW5iKHMtPmlvK0VTMTM3MV9SRUdfVUFSVF9TVEFUVVMpICYgVVNUQVRfVFhSRFkpICYmIHMtPm1pZGkub2NudCA+IDApIHsKKwkJb3V0YihzLT5taWRpLm9idWZbcy0+bWlkaS5vcmRdLCBzLT5pbytFUzEzNzFfUkVHX1VBUlRfREFUQSk7CisJCXMtPm1pZGkub3JkID0gKHMtPm1pZGkub3JkICsgMSkgJSBNSURJT1VUQlVGOworCQlzLT5taWRpLm9jbnQtLTsKKwkJaWYgKHMtPm1pZGkub2NudCA8IE1JRElPVVRCVUYtMTYpCisJCQl3YWtlID0gMTsKKwl9CisJaWYgKHdha2UpCisJCXdha2VfdXAoJnMtPm1pZGkub3dhaXQpOworCW91dGIoKHMtPm1pZGkub2NudCA+IDApID8gVUNUUkxfUlhJTlRFTiB8IFVDVFJMX0VOQV9UWElOVCA6IFVDVFJMX1JYSU5URU4sIHMtPmlvK0VTMTM3MV9SRUdfVUFSVF9DT05UUk9MKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGVzMTM3MV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZGV2X2lkOworCXVuc2lnbmVkIGludCBpbnRzcmMsIHNjdGw7CisJCisJLyogZmFzdHBhdGggb3V0LCB0byBlYXNlIGludGVycnVwdCBzaGFyaW5nICovCisJaW50c3JjID0gaW5sKHMtPmlvK0VTMTM3MV9SRUdfU1RBVFVTKTsKKwlpZiAoIShpbnRzcmMgJiAweDgwMDAwMDAwKSkKKwkJcmV0dXJuIElSUV9OT05FOworCXNwaW5fbG9jaygmcy0+bG9jayk7CisJLyogY2xlYXIgYXVkaW8gaW50ZXJydXB0cyBmaXJzdCAqLworCXNjdGwgPSBzLT5zY3RybDsKKwlpZiAoaW50c3JjICYgU1RBVF9BREMpCisJCXNjdGwgJj0gflNDVFJMX1IxSU5URU47CisJaWYgKGludHNyYyAmIFNUQVRfREFDMSkKKwkJc2N0bCAmPSB+U0NUUkxfUDFJTlRFTjsKKwlpZiAoaW50c3JjICYgU1RBVF9EQUMyKQorCQlzY3RsICY9IH5TQ1RSTF9QMklOVEVOOworCW91dGwoc2N0bCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisJZXMxMzcxX2hhbmRsZV9taWRpKHMpOworCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPSBLRVJOX0NSSVQgUEZYICJpbnZhbGlkIG1hZ2ljIHZhbHVlXG4iOworCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICghKHMpIHx8IChzKS0+bWFnaWMgIT0gRVMxMzcxX01BR0lDKSB7IFwKKwkJcHJpbnRrKGludmFsaWRfbWFnaWMpOyAgICAgICAgICAgIFwKKwkJcmV0dXJuIC1FTlhJTzsgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ29udmVyc2lvbiB0YWJsZSBmb3IgUy9QRElGIFBDTSB2b2x1bWUgZW11bGF0aW9uIHRocm91Z2ggdGhlIFNSQyAqLworLyogZEItbGluZWFyIHRhYmxlIG9mIERBQyB2b2wgdmFsdWVzOyAtMGRCIHRvIC00Ni41ZEIgd2l0aCBtdXRlICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgREFDVm9sVGFibGVbMTAxXSA9Cit7CisJMHgxMDAwLCAweDBmMmEsIDB4MGU2MCwgMHgwZGEwLCAweDBjZWEsIDB4MGMzZSwgMHgwYjlhLCAweDBhZmYsCisJMHgwYTZkLCAweDA5ZTEsIDB4MDk1ZSwgMHgwOGUxLCAweDA4NmEsIDB4MDdmYSwgMHgwNzhmLCAweDA3MmEsCisJMHgwNmNiLCAweDA2NzAsIDB4MDYxYSwgMHgwNWM5LCAweDA1N2IsIDB4MDUzMiwgMHgwNGVkLCAweDA0YWIsCisJMHgwNDZkLCAweDA0MzIsIDB4MDNmYSwgMHgwM2M1LCAweDAzOTIsIDB4MDM2MywgMHgwMzM1LCAweDAzMGIsCisJMHgwMmUyLCAweDAyYmMsIDB4MDI5NywgMHgwMjc1LCAweDAyNTQsIDB4MDIzNSwgMHgwMjE3LCAweDAxZmIsCisJMHgwMWUxLCAweDAxYzgsIDB4MDFiMCwgMHgwMTk5LCAweDAxODQsIDB4MDE3MCwgMHgwMTVkLCAweDAxNGIsCisJMHgwMTM5LCAweDAxMjksIDB4MDExOSwgMHgwMTBiLCAweDAwZmQsIDB4MDBmMCwgMHgwMGUzLCAweDAwZDcsCisJMHgwMGNjLCAweDAwYzEsIDB4MDBiNywgMHgwMGFlLCAweDAwYTUsIDB4MDA5YywgMHgwMDk0LCAweDAwOGMsCisJMHgwMDg1LCAweDAwN2UsIDB4MDA3NywgMHgwMDcxLCAweDAwNmIsIDB4MDA2NiwgMHgwMDYwLCAweDAwNWIsCisJMHgwMDU3LCAweDAwNTIsIDB4MDA0ZSwgMHgwMDRhLCAweDAwNDYsIDB4MDA0MiwgMHgwMDNmLCAweDAwM2MsCisJMHgwMDM4LCAweDAwMzYsIDB4MDAzMywgMHgwMDMwLCAweDAwMmUsIDB4MDAyYiwgMHgwMDI5LCAweDAwMjcsCisJMHgwMDI1LCAweDAwMjMsIDB4MDAyMSwgMHgwMDFmLCAweDAwMWUsIDB4MDAxYywgMHgwMDFiLCAweDAwMTksCisJMHgwMDE4LCAweDAwMTcsIDB4MDAxNiwgMHgwMDE0LCAweDAwMDAKK307CisKKy8qCisgKiB3aGVuIHdlIGFyZSBpbiBTL1BESUYgbW9kZSwgd2Ugd2FudCB0byBkaXNhYmxlIGFueSBhbmFsb2cgb3V0cHV0IHNvCisgKiB3ZSBmaWx0ZXIgdGhlIG1peGVyIGlvY3RscyAKKyAqLworc3RhdGljIGludCBtaXhkZXZfaW9jdGwoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCWludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbGVmdCwgcmlnaHQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwkvKiBmaWx0ZXIgbWl4ZXIgaW9jdGxzIHRvIGNhdGNoIFBDTSBhbmQgTUFTVEVSIHZvbHVtZSB3aGVuIGluIFMvUERJRiBtb2RlICovCisJaWYgKHMtPnNwZGlmX3ZvbHVtZSA9PSAtMSkKKwkJcmV0dXJuIGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUU6CisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9QQ006ICAgLyogdXNlIFNSQyBmb3IgUENNIHZvbHVtZSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmlnaHQgPSAoKHZhbCA+PiA4KSAgJiAweGZmKTsKKwkJbGVmdCA9ICh2YWwgICYgMHhmZik7CisJCWlmIChyaWdodCA+IDEwMCkKKwkJCXJpZ2h0ID0gMTAwOworCQlpZiAobGVmdCA+IDEwMCkKKwkJCWxlZnQgPSAxMDA7CisJCXMtPnNwZGlmX3ZvbHVtZSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXNyY193cml0ZShzLCBTUkNSRUdfVk9MX0RBQzIsIERBQ1ZvbFRhYmxlWzEwMCAtIGxlZnRdKTsKKwkJc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfREFDMisxLCBEQUNWb2xUYWJsZVsxMDAgLSByaWdodF0pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCQorCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9QQ006CisJCXJldHVybiBwdXRfdXNlcihzLT5zcGRpZl92b2x1bWUsIChpbnQgX191c2VyICopYXJnKTsKKwl9CisJcmV0dXJuIGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEFDOTcgTWl4ZXIgUmVnaXN0ZXIgdG8gQ29ubmVjdGlvbnMgbWFwcGluZyBvZiB0aGUgQ29uY2VydCA5NyBib2FyZAorICoKKyAqIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8gICBMaW5lIE91dAorICogQUM5N19NQVNURVJfVk9MX01PTk8gICAgIFRBRCBPdXRwdXQKKyAqIEFDOTdfUENCRUVQX1ZPTCAgICAgICAgICBub25lCisgKiBBQzk3X1BIT05FX1ZPTCAgICAgICAgICAgVEFEIElucHV0IChtb25vKQorICogQUM5N19NSUNfVk9MICAgICAgICAgICAgIE1JQyBJbnB1dCAobW9ubykKKyAqIEFDOTdfTElORUlOX1ZPTCAgICAgICAgICBMaW5lIElucHV0IChzdGVyZW8pCisgKiBBQzk3X0NEX1ZPTCAgICAgICAgICAgICAgQ0QgSW5wdXQgKHN0ZXJlbykKKyAqIEFDOTdfVklERU9fVk9MICAgICAgICAgICBub25lCisgKiBBQzk3X0FVWF9WT0wgICAgICAgICAgICAgQXV4IElucHV0IChzdGVyZW8pCisgKiBBQzk3X1BDTU9VVF9WT0wgICAgICAgICAgV2F2ZSBPdXRwdXQgKHN0ZXJlbykKKyAqLworCitzdGF0aWMgaW50IGVzMTM3MV9vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZXMxMzcxX3N0YXRlLCBkZXZzKTsKKwkJaWYgKHMtPmNvZGVjLT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVzMTM3MV9yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCisJVkFMSURBVEVfU1RBVEUocyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IHMtPmNvZGVjOworCisJcmV0dXJuIG1peGRldl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXMxMzcxX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBlczEzNzFfaW9jdGxfbWl4ZGV2LAorCS5vcGVuCQk9IGVzMTM3MV9vcGVuX21peGRldiwKKwkucmVsZWFzZQk9IGVzMTM3MV9yZWxlYXNlX21peGRldiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGRyYWluX2RhYzEoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50LCB0bW87CisJCisJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCB8fCAhcy0+ZG1hX2RhYzEucmVhZHkpCisJCXJldHVybiAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOworICAgICAgICBmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9kYWMxLmNvdW50OworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDw9IDApCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKG5vbmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgICAgICAgICAgfQorCQl0bW8gPSAzICogSFogKiAoY291bnQgKyBzLT5kbWFfZGFjMS5mcmFnc2l6ZSkgLyAyIC8gcy0+ZGFjMXJhdGU7CisJCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0WyhzLT5zY3RybCAmIFNDVFJMX1AxRk1UKSA+PiBTQ1RSTF9TSF9QMUZNVF07CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gKyAxKSkKKwkJCURCRyhwcmludGsoS0VSTl9ERUJVRyBQRlggImRhYzEgZG1hIHRpbWVkIG91dD8/XG4iKTspCisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMxLndhaXQsICZ3YWl0KTsKKyAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyYWluX2RhYzIoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50LCB0bW87CisKKwlpZiAocy0+ZG1hX2RhYzIubWFwcGVkIHx8ICFzLT5kbWFfZGFjMi5yZWFkeSkKKwkJcmV0dXJuIDA7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7CisgICAgICAgIGZvciAoOzspIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjMi5jb3VudDsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChub25ibG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMyLndhaXQsICZ3YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICAgICAgICAgIH0KKwkJdG1vID0gMyAqIEhaICogKGNvdW50ICsgcy0+ZG1hX2RhYzIuZnJhZ3NpemUpIC8gMiAvIHMtPmRhYzJyYXRlOworCQl0bW8gPj49IHNhbXBsZV9zaGlmdFsocy0+c2N0cmwgJiBTQ1RSTF9QMkZNVCkgPj4gU0NUUkxfU0hfUDJGTVRdOworCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vICsgMSkpCisJCQlEQkcocHJpbnRrKEtFUk5fREVCVUcgUEZYICJkYWMyIGRtYSB0aW1lZCBvdXQ/P1xuIik7KQorICAgICAgICB9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7CisgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICByZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzc2l6ZV90IGVzMTM3MV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkb3duKCZzLT5zZW0pOworCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJZ290byBvdXQyOworCQorCWFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXN3cHRyID0gcy0+ZG1hX2FkYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2FkYy5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA8IGNudCkKKwkJCWNudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5lbmFibGVkKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJdXAoJnMtPnNlbSk7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIG91dDI7CisJCQl9CisJCQlkb3duKCZzLT5zZW0pOworCQkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJeworCQkJCXJldCA9IC1FTlhJTzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfYWRjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9hZGMuY291bnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKKwkJCXN0YXJ0X2FkYyhzKTsKKwl9CitvdXQ6CisJdXAoJnMtPnNlbSk7CitvdXQyOgorCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVzMTM3MV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkb3duKCZzLT5zZW0pOwkKKwlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSkKKwkJZ290byBvdXQzOworCXJldCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMyLndhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChzLT5kbWFfZGFjMi5jb3VudCA8IDApIHsKKwkJCXMtPmRtYV9kYWMyLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMyLnN3cHRyID0gcy0+ZG1hX2RhYzIuaHdwdHI7CisJCX0KKwkJc3dwdHIgPSBzLT5kbWFfZGFjMi5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYzIuZG1hc2l6ZS1zd3B0cjsKKwkJaWYgKHMtPmRtYV9kYWMyLmNvdW50ICsgY250ID4gcy0+ZG1hX2RhYzIuZG1hc2l6ZSkKKwkJCWNudCA9IHMtPmRtYV9kYWMyLmRtYXNpemUgLSBzLT5kbWFfZGFjMi5jb3VudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChzLT5kbWFfZGFjMi5lbmFibGVkKQorCQkJCXN0YXJ0X2RhYzIocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dDsKKwkJCX0JCisJCQl1cCgmcy0+c2VtKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0MjsKKwkJCX0KKwkJCWRvd24oJnMtPnNlbSk7CisJCQlpZiAocy0+ZG1hX2RhYzIubWFwcGVkKQorCQkJeworCQkJCXJldCA9IC1FTlhJTzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihzLT5kbWFfZGFjMi5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYzIuZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+ZG1hX2RhYzIuc3dwdHIgPSBzd3B0cjsKKwkJcy0+ZG1hX2RhYzIuY291bnQgKz0gY250OworCQlzLT5kbWFfZGFjMi5lbmRjbGVhcmVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWlmIChzLT5kbWFfZGFjMi5lbmFibGVkKQorCQkJc3RhcnRfZGFjMihzKTsKKwl9CitvdXQ6CisJdXAoJnMtPnNlbSk7CitvdXQyOgorCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7CitvdXQzOgkKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVzMTM3MV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgcHJvZ19kbWFidWZfZGFjMihzKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMyLndhaXQsIHdhaXQpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgcHJvZ19kbWFidWZfYWRjKHMpKQorCQkJcmV0dXJuIDA7CisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2FkYy53YWl0LCB3YWl0KTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwllczEzNzFfdXBkYXRlX3B0cihzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfYWRjLmZyYWdzaXplKQorCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjMi5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMyLmZyYWdzaXplKSAKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9IGVsc2UgeworCQkJaWYgKChzaWduZWQpcy0+ZG1hX2RhYzIuZG1hc2l6ZSA+PSBzLT5kbWFfZGFjMi5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWRvd24oJnMtPnNlbSk7CisJCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYzIocykpICE9IDApIHsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRiID0gJnMtPmRtYV9kYWMyOworCX0gZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApIHsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRiID0gJnMtPmRtYV9hZGM7CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCXZpcnRfdG9fcGh5cyhkYi0+cmF3YnVmKSA+PiBQQUdFX1NISUZULAorCQkJCXNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisJZGItPm1hcHBlZCA9IDE7CitvdXQ6CisJdXAoJnMtPnNlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgYXVkaW9fYnVmX2luZm8gYWJpbmZvOworICAgICAgICBjb3VudF9pbmZvIGNpbmZvOworCWludCBjb3VudDsKKwlpbnQgdmFsLCBtYXBwZWQsIHJldDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworICAgICAgICBtYXBwZWQgPSAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiBzLT5kbWFfZGFjMi5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMyKHMsIDAvKmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKi8pOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCwgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMyKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfZGFjMi5zd3B0ciA9IHMtPmRtYV9kYWMyLmh3cHRyID0gcy0+ZG1hX2RhYzIuY291bnQgPSBzLT5kbWFfZGFjMi50b3RhbF9ieXRlcyA9IDA7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2FkYy5od3B0ciA9IHMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCXNldF9hZGNfcmF0ZShzLCB2YWwpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMyKHMpOworCQkJCXMtPmRtYV9kYWMyLnJlYWR5ID0gMDsKKwkJCQlzZXRfZGFjMl9yYXRlKHMsIHZhbCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IHMtPmFkY3JhdGUgOiBzLT5kYWMycmF0ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKHZhbCkKKwkJCQlzLT5zY3RybCB8PSBTQ1RSTF9SMVNNQjsKKwkJCWVsc2UKKwkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUjFTTUI7CisJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjMihzKTsKKwkJCXMtPmRtYV9kYWMyLnJlYWR5ID0gMDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAodmFsKQorCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1AyU01COworCQkJZWxzZQorCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMlNNQjsKKwkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIH0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUjFTTUI7CisJCQkJZWxzZQorCQkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUjFTTUI7CisJCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMyKHMpOworCQkJCXMtPmRtYV9kYWMyLnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDJTTUI7CisJCQkJZWxzZQorCQkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUDJTTUI7CisJCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gU0NUUkxfUjFTTUIgOiBTQ1RSTF9QMlNNQikpID8gMiA6IDEsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9VOCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1IxU0VCOworCQkJCWVsc2UKKwkJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1IxU0VCOworCQkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjMihzKTsKKwkJCQlzLT5kbWFfZGFjMi5yZWFkeSA9IDA7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMlNFQjsKKwkJCQllbHNlCisJCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMlNFQjsKKwkJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBTQ1RSTF9SMVNFQiA6IFNDVFJMX1AyU0VCKSkgPyAKKwkJCQlBRk1UX1MxNl9MRSA6IEFGTVRfVTgsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgcy0+Y3RybCAmIENUUkxfQURDX0VOKSAKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+Y3RybCAmIENUUkxfREFDMl9FTikgCisJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSB7CisJCQkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDE7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJfSBlbHNlIHsKKwkJCQlzLT5kbWFfYWRjLmVuYWJsZWQgPSAwOworCQkJCXN0b3BfYWRjKHMpOworCQkJfQorCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCQkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjMihzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJcy0+ZG1hX2RhYzIuZW5hYmxlZCA9IDE7CisJCQkJc3RhcnRfZGFjMihzKTsKKwkJCX0gZWxzZSB7CisJCQkJcy0+ZG1hX2RhYzIuZW5hYmxlZCA9IDA7CisJCQkJc3RvcF9kYWMyKHMpOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzIocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzFfdXBkYXRlX3B0cihzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYzIuZnJhZ3NpemU7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzIuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYzIuZG1hc2l6ZSAtIGNvdW50OworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYzIubnVtZnJhZzsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMyLmZyYWdzaGlmdDsgICAgICAKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzFfdXBkYXRlX3B0cihzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZTsKKwkJY291bnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcyA9IGNvdW50OworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7ICAgICAgCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKyAgICAgICAgICAgICAgICBmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzIocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzFfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IHMtPmRtYV9kYWMyLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCXJldHVybiBwdXRfdXNlcihjb3VudCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfYWRjKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSBzLT5kbWFfYWRjLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMihzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYzIudG90YWxfYnl0ZXM7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzIuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2RhYzIuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMyLmh3cHRyOworCQlpZiAocy0+ZG1hX2RhYzIubWFwcGVkKQorCQkJcy0+ZG1hX2RhYzIuY291bnQgJj0gcy0+ZG1hX2RhYzIuZnJhZ3NpemUtMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSkKKwkJCQlyZXR1cm4gdmFsOworCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMyLmZyYWdzaXplLCBwKTsKKwkJfQorCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQlyZXR1cm4gdmFsOworCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSA0OworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc21heGZyYWdzIDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gNDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXMtPmRtYV9kYWMyLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfZGFjMi5vc3NmcmFnc2hpZnQgPSA0OworCQkJaWYgKHMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9kYWMyLm9zc21heGZyYWdzIDwgNCkKKwkJCQlzLT5kbWFfZGFjMi5vc3NtYXhmcmFncyA9IDQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24pIHx8CisJCSAgICAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24gPSB2YWw7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IHMtPmFkY3JhdGUgOiBzLT5kYWMycmF0ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBTQ1RSTF9SMVNNQiA6IFNDVFJMX1AyU01CKSkgPyAyIDogMSwgcCk7CisJCQorICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gU0NUUkxfUjFTRUIgOiBTQ1RSTF9QMlNFQikpID8gMTYgOiA4LCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkKKwl9CisJcmV0dXJuIG1peGRldl9pb2N0bChzLT5jb2RlYywgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IGVzMTM3MV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGVzMTM3MV9zdGF0ZSwgZGV2cyk7CisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IDA7CisJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDE7CisJCXNldF9hZGNfcmF0ZShzLCA4MDAwKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9kYWMyLm9zc21heGZyYWdzID0gcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24gPSAwOworCQlzLT5kbWFfZGFjMi5lbmFibGVkID0gMTsKKwkJc2V0X2RhYzJfcmF0ZShzLCA4MDAwKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5zY3RybCAmPSB+U0NUUkxfUjFGTVQ7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlzLT5zY3RybCB8PSBFUzEzNzFfRk1UX1MxNl9NT05PIDw8IFNDVFJMX1NIX1IxRk1UOworCQllbHNlCisJCQlzLT5zY3RybCB8PSBFUzEzNzFfRk1UX1U4X01PTk8gPDwgU0NUUkxfU0hfUjFGTVQ7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzLT5zY3RybCAmPSB+U0NUUkxfUDJGTVQ7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlzLT5zY3RybCB8PSBFUzEzNzFfRk1UX1MxNl9NT05PIDw8IFNDVFJMX1NIX1AyRk1UOworCQllbHNlCisJCQlzLT5zY3RybCB8PSBFUzEzNzFfRk1UX1U4X01PTk8gPDwgU0NUUkxfU0hfUDJGTVQ7CisJfQorCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlpbml0X01VVEVYKCZzLT5zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBlczEzNzFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJZHJhaW5fZGFjMihzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJZG93bigmcy0+b3Blbl9zZW0pOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdG9wX2RhYzIocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjMik7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0b3BfYWRjKHMpOworCQlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYyk7CisJfQorCXMtPm9wZW5fbW9kZSAmPSB+KGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVzMTM3MV9hdWRpb19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBlczEzNzFfcmVhZCwKKwkud3JpdGUJCT0gZXMxMzcxX3dyaXRlLAorCS5wb2xsCQk9IGVzMTM3MV9wb2xsLAorCS5pb2N0bAkJPSBlczEzNzFfaW9jdGwsCisJLm1tYXAJCT0gZXMxMzcxX21tYXAsCisJLm9wZW4JCT0gZXMxMzcxX29wZW4sCisJLnJlbGVhc2UJPSBlczEzNzFfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCBlczEzNzFfd3JpdGVfZGFjKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfZGFjMS5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjMShzKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHMtPmRtYV9kYWMxLmNvdW50IDwgMCkgeworCQkJcy0+ZG1hX2RhYzEuY291bnQgPSAwOworCQkJcy0+ZG1hX2RhYzEuc3dwdHIgPSBzLT5kbWFfZGFjMS5od3B0cjsKKwkJfQorCQlzd3B0ciA9IHMtPmRtYV9kYWMxLnN3cHRyOworCQljbnQgPSBzLT5kbWFfZGFjMS5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+ZG1hX2RhYzEuY291bnQgKyBjbnQgPiBzLT5kbWFfZGFjMS5kbWFzaXplKQorCQkJY250ID0gcy0+ZG1hX2RhYzEuZG1hc2l6ZSAtIHMtPmRtYV9kYWMxLmNvdW50OworCQlpZiAoY250IDw9IDApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKHMtPmRtYV9kYWMxLmVuYWJsZWQpCisJCQkJc3RhcnRfZGFjMShzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYzEucmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMxLmRtYXNpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmRtYV9kYWMxLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9kYWMxLmNvdW50ICs9IGNudDsKKwkJcy0+ZG1hX2RhYzEuZW5kY2xlYXJlZCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlpZiAocy0+ZG1hX2RhYzEuZW5hYmxlZCkKKwkJCXN0YXJ0X2RhYzEocyk7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMS53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCBlczEzNzFfcG9sbF9kYWMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYzEocykpCisJCXJldHVybiAwOworCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2RhYzEud2FpdCwgd2FpdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwllczEzNzFfdXBkYXRlX3B0cihzKTsKKwlpZiAocy0+ZG1hX2RhYzEubWFwcGVkKSB7CisJCWlmIChzLT5kbWFfZGFjMS5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMxLmZyYWdzaXplKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9IGVsc2UgeworCQlpZiAoKHNpZ25lZClzLT5kbWFfZGFjMS5kbWFzaXplID49IHMtPmRtYV9kYWMxLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjMS5mcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBlczEzNzFfbW1hcF9kYWMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCXJldHVybiAtRUlOVkFMOworCWxvY2tfa2VybmVsKCk7CisJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSAtRUlOVkFMOworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCisJCWdvdG8gb3V0OworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IHMtPmRtYV9kYWMxLmJ1Zm9yZGVyKSkKKwkJZ290byBvdXQ7CisJcmV0ID0gLUVBR0FJTjsKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCXZpcnRfdG9fcGh5cyhzLT5kbWFfZGFjMS5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQlzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCWdvdG8gb3V0OworCXMtPmRtYV9kYWMxLm1hcHBlZCA9IDE7CisJcmV0ID0gMDsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlczEzNzFfaW9jdGxfZGFjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgYXVkaW9fYnVmX2luZm8gYWJpbmZvOworICAgICAgICBjb3VudF9pbmZvIGNpbmZvOworCWludCBjb3VudDsKKwlpbnQgdmFsLCByZXQ7CisJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKwkJcmV0dXJuIGRyYWluX2RhYzEocywgMC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sqLyk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJc3RvcF9kYWMxKHMpOworCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJcy0+ZG1hX2RhYzEuc3dwdHIgPSBzLT5kbWFfZGFjMS5od3B0ciA9IHMtPmRtYV9kYWMxLmNvdW50ID0gcy0+ZG1hX2RhYzEudG90YWxfYnl0ZXMgPSAwOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlzdG9wX2RhYzEocyk7CisJCQlzLT5kbWFfZGFjMS5yZWFkeSA9IDA7CisJCQlzZXRfZGFjMV9yYXRlKHMsIHZhbCk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHMtPmRhYzFyYXRlLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzdG9wX2RhYzEocyk7CisJCXMtPmRtYV9kYWMxLnJlYWR5ID0gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHZhbCkKKwkJCXMtPnNjdHJsIHw9IFNDVFJMX1AxU01COworCQllbHNlCisJCQlzLT5zY3RybCAmPSB+U0NUUkxfUDFTTUI7CisJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCXN0b3BfZGFjMShzKTsKKwkJCXMtPmRtYV9kYWMxLnJlYWR5ID0gMDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAodmFsID49IDIpCisJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDFTTUI7CisJCQllbHNlCisJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AxU01COworCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmIFNDVFJMX1AxU01CKSA/IDIgOiAxLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRXxBRk1UX1U4LCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJc3RvcF9kYWMxKHMpOworCQkJcy0+ZG1hX2RhYzEucmVhZHkgPSAwOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDFTRUI7CisJCQllbHNlCisJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AxU0VCOworCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmIFNDVFJMX1AxU0VCKSA/IEFGTVRfUzE2X0xFIDogQUZNVF9VOCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCXJldHVybiBwdXRfdXNlcigocy0+Y3RybCAmIENUUkxfREFDMV9FTikgPyBQQ01fRU5BQkxFX09VVFBVVCA6IDAsIHApOworCQkJCQkJCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgeworCQkJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjMShzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJCXMtPmRtYV9kYWMxLmVuYWJsZWQgPSAxOworCQkJc3RhcnRfZGFjMShzKTsKKwkJfSBlbHNlIHsKKwkJCXMtPmRtYV9kYWMxLmVuYWJsZWQgPSAwOworCQkJc3RvcF9kYWMxKHMpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MV91cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfZGFjMS5mcmFnc2l6ZTsKKwkJY291bnQgPSBzLT5kbWFfZGFjMS5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBzLT5kbWFfZGFjMS5kbWFzaXplIC0gY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfZGFjMS5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2RhYzEuZnJhZ3NoaWZ0OyAgICAgIAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisgICAgICAgICAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCWlmICghcy0+ZG1hX2RhYzEucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzEocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzFfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IHMtPmRtYV9kYWMxLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCXJldHVybiBwdXRfdXNlcihjb3VudCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghcy0+ZG1hX2RhYzEucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYzEocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzFfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMxLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9kYWMxLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9kYWMxLmZyYWdzaGlmdDsKKyAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSBzLT5kbWFfZGFjMS5od3B0cjsKKwkJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkKKwkJCXMtPmRtYV9kYWMxLmNvdW50ICY9IHMtPmRtYV9kYWMxLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmICgodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkpCisJCQlyZXR1cm4gdmFsOworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihzLT5kbWFfZGFjMS5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJcy0+ZG1hX2RhYzEub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJaWYgKHMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQlzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPSA0OworCQlpZiAocy0+ZG1hX2RhYzEub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQlzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJaWYgKHMtPmRtYV9kYWMxLm9zc21heGZyYWdzIDwgNCkKKwkJCXMtPmRtYV9kYWMxLm9zc21heGZyYWdzID0gNDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKHMtPmRtYV9kYWMxLnN1YmRpdmlzaW9uKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXMtPmRtYV9kYWMxLnN1YmRpdmlzaW9uID0gdmFsOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcihzLT5kYWMxcmF0ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmIFNDVFJMX1AxU01CKSA/IDIgOiAxLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiBTQ1RSTF9QMVNFQikgPyAxNiA6IDgsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCQorCX0KKwlyZXR1cm4gbWl4ZGV2X2lvY3RsKHMtPmNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX29wZW5fZGFjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGVzMTM3MV9zdGF0ZSwgZGV2cyk7CisJCWlmICghKChzLT5kZXZfZGFjIF4gbWlub3IpICYgfjB4ZikpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworICAgICAgIAkvKiB3ZSBhbGxvdyBvcGVuaW5nIHdpdGggT19SRFdSLCBtb3N0IHByb2dyYW1zIGRvIGl0IGFsdGhvdWdoIHRoZXkgd2lsbCBvbmx5IHdyaXRlICovCisjaWYgMAorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlyZXR1cm4gLUVQRVJNOworI2VuZGlmCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIEZNT0RFX0RBQykgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJcy0+ZG1hX2RhYzEub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYzEub3NzbWF4ZnJhZ3MgPSBzLT5kbWFfZGFjMS5zdWJkaXZpc2lvbiA9IDA7CisJcy0+ZG1hX2RhYzEuZW5hYmxlZCA9IDE7CisJc2V0X2RhYzFfcmF0ZShzLCA4MDAwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPnNjdHJsICY9IH5TQ1RSTF9QMUZNVDsKKwlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQlzLT5zY3RybCB8PSBFUzEzNzFfRk1UX1MxNl9NT05PIDw8IFNDVFJMX1NIX1AxRk1UOworCWVsc2UKKwkJcy0+c2N0cmwgfD0gRVMxMzcxX0ZNVF9VOF9NT05PIDw8IFNDVFJMX1NIX1AxRk1UOworCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5vcGVuX21vZGUgfD0gRk1PREVfREFDOworCXVwKCZzLT5vcGVuX3NlbSk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVzMTM3MV9yZWxlYXNlX2RhYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWRyYWluX2RhYzEocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlzdG9wX2RhYzEocyk7CisJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9kYWMxKTsKKwlzLT5vcGVuX21vZGUgJj0gfkZNT0RFX0RBQzsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXMxMzcxX2RhY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gZXMxMzcxX3dyaXRlX2RhYywKKwkucG9sbAkJPSBlczEzNzFfcG9sbF9kYWMsCisJLmlvY3RsCQk9IGVzMTM3MV9pb2N0bF9kYWMsCisJLm1tYXAJCT0gZXMxMzcxX21tYXBfZGFjLAorCS5vcGVuCQk9IGVzMTM3MV9vcGVuX2RhYywKKwkucmVsZWFzZQk9IGVzMTM3MV9yZWxlYXNlX2RhYywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCBlczEzNzFfbWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXQgPSAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5pd2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcHRyID0gcy0+bWlkaS5pcmQ7CisJCWNudCA9IE1JRElJTkJVRiAtIHB0cjsKKwkJaWYgKHMtPm1pZGkuaWNudCA8IGNudCkKKwkJCWNudCA9IHMtPm1pZGkuaWNudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcy0+bWlkaS5pYnVmICsgcHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcHRyID0gKHB0ciArIGNudCkgJSBNSURJSU5CVUY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPm1pZGkuaXJkID0gcHRyOworCQlzLT5taWRpLmljbnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJYnJlYWs7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5pd2FpdCwgJndhaXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVzMTM3MV9taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCXJldCA9IDA7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlwdHIgPSBzLT5taWRpLm93cjsKKwkJY250ID0gTUlESU9VVEJVRiAtIHB0cjsKKwkJaWYgKHMtPm1pZGkub2NudCArIGNudCA+IE1JRElPVVRCVUYpCisJCQljbnQgPSBNSURJT1VUQlVGIC0gcy0+bWlkaS5vY250OworCQlpZiAoY250IDw9IDApIHsKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWVzMTM3MV9oYW5kbGVfbWlkaShzKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+bWlkaS5vYnVmICsgcHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlwdHIgPSAocHRyICsgY250KSAlIE1JRElPVVRCVUY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPm1pZGkub3dyID0gcHRyOworCQlzLT5taWRpLm9jbnQgKz0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcxX2hhbmRsZV9taWRpKHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVzMTM3MV9taWRpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXBvbGxfd2FpdChmaWxlLCAmcy0+bWlkaS5vd2FpdCwgd2FpdCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXBvbGxfd2FpdChmaWxlLCAmcy0+bWlkaS5pd2FpdCwgd2FpdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+bWlkaS5pY250ID4gMCkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChzLT5taWRpLm9jbnQgPCBNSURJT1VUQlVGKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGVzMTM3MV9taWRpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZXMxMzcxX3N0YXRlLCBkZXZzKTsKKwkJaWYgKHMtPmRldl9taWRpID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCQlzLT5taWRpLm9yZCA9IHMtPm1pZGkub3dyID0gcy0+bWlkaS5vY250ID0gMDsKKwkJb3V0YihVQ1RSTF9DTlRSTF9TV1IsIHMtPmlvK0VTMTM3MV9SRUdfVUFSVF9DT05UUk9MKTsKKwkJb3V0YigwLCBzLT5pbytFUzEzNzFfUkVHX1VBUlRfQ09OVFJPTCk7CisJCW91dGIoMCwgcy0+aW8rRVMxMzcxX1JFR19VQVJUX1RFU1QpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5taWRpLmlyZCA9IHMtPm1pZGkuaXdyID0gcy0+bWlkaS5pY250ID0gMDsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXMtPm1pZGkub3JkID0gcy0+bWlkaS5vd3IgPSBzLT5taWRpLm9jbnQgPSAwOworCX0KKwlzLT5jdHJsIHw9IENUUkxfVUFSVF9FTjsKKwlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJZXMxMzcxX2hhbmRsZV9taWRpKHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBlczEzNzFfbWlkaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNvdW50LCB0bW87CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCQlmb3IgKDs7KSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJY291bnQgPSBzLT5taWRpLm9jbnQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoY291bnQgPD0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlicmVhazsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlicmVhazsKKwkJCXRtbyA9IChjb3VudCAqIEhaKSAvIDMxMDA7CisJCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID8gOiAxKSAmJiB0bW8pCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJtaWRpIHRpbWVkIG91dD8/XG4iKTsKKwkJfQorCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJcy0+b3Blbl9tb2RlICY9IH4oKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUR8Rk1PREVfTUlESV9XUklURSkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+b3Blbl9tb2RlICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpKSkgeworCQlzLT5jdHJsICY9IH5DVFJMX1VBUlRfRU47CisJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlczEzNzFfbWlkaV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBlczEzNzFfbWlkaV9yZWFkLAorCS53cml0ZQkJPSBlczEzNzFfbWlkaV93cml0ZSwKKwkucG9sbAkJPSBlczEzNzFfbWlkaV9wb2xsLAorCS5vcGVuCQk9IGVzMTM3MV9taWRpX29wZW4sCisJLnJlbGVhc2UJPSBlczEzNzFfbWlkaV9yZWxlYXNlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCB3ZSdsbCBjcmVhdGUgYSBwcm9jIGRldmljZSB0aGF0IGR1bXBzIHRoZQorICogQ09ERUMgY2hpcHN0YXRlCisgKi8KKworI2lmZGVmIEVTMTM3MV9ERUJVRworc3RhdGljIGludCBwcm9jX2VzMTM3MV9kdW1wIChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3QgZnBvcywgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqczsKKyAgICAgICAgaW50IGNudCwgbGVuID0gMDsKKworCWlmIChsaXN0X2VtcHR5KCZkZXZzKSkKKwkJcmV0dXJuIDA7CisJcyA9IGxpc3RfZW50cnkoZGV2cy5uZXh0LCBzdHJ1Y3QgZXMxMzcxX3N0YXRlLCBkZXZzKTsKKyAgICAgICAgLyogcHJpbnQgb3V0IGhlYWRlciAqLworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcdFx0Q3JlYXRpdmUgRVMxMzd4IERlYnVnIER1bXAtby1tYXRpY1xuIik7CisKKyAgICAgICAgLyogcHJpbnQgb3V0IENPREVDIHN0YXRlICovCisgICAgICAgIGxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJBQzk3IENPREVDIHN0YXRlXG4iKTsKKwlmb3IgKGNudD0wOyBjbnQgPD0gMHg3ZTsgY250ID0gY250ICsyKQorICAgICAgICAgICAgICAgIGxlbis9IHNwcmludGYgKGJ1ZiArIGxlbiwgInJlZzoweCUwMnggIHZhbDoweCUwNHhcbiIsIGNudCwgcmRjb2RlYyhzLT5jb2RlYywgY250KSk7CisKKyAgICAgICAgaWYgKGZwb3MgPj1sZW4peworICAgICAgICAgICAgICAgICpzdGFydCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICAqZW9mID0xOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgICpzdGFydCA9IGJ1ZiArIGZwb3M7CisgICAgICAgIGlmICgobGVuIC09IGZwb3MpID4gbGVuZ3RoKQorICAgICAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgICplb2YgPTE7CisgICAgICAgIHJldHVybiBsZW47CisKK30KKyNlbmRpZiAvKiBFUzEzNzFfREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGRldmljZXM7IG9ubHkgdXNlZCBmb3IgY29tbWFuZCBsaW5lIHBhcmFtcyAqLworI2RlZmluZSBOUl9ERVZJQ0UgNQorCitzdGF0aWMgaW50IHNwZGlmW05SX0RFVklDRV07CitzdGF0aWMgaW50IG5vbWl4W05SX0RFVklDRV07CitzdGF0aWMgaW50IGFtcGxpZmllcltOUl9ERVZJQ0VdOworCitzdGF0aWMgdW5zaWduZWQgaW50IGRldmluZGV4OworCittb2R1bGVfcGFyYW1fYXJyYXkoc3BkaWYsIGJvb2wsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhzcGRpZiwgImlmIDEgdGhlIG91dHB1dCBpcyBpbiBTL1BESUYgZGlnaXRhbCBtb2RlIik7Cittb2R1bGVfcGFyYW1fYXJyYXkobm9taXgsIGJvb2wsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhub21peCwgImlmIDEgbm8gYW5hbG9nIGF1ZGlvIGlzIG1peGVkIHRvIHRoZSBkaWdpdGFsIG91dHB1dCIpOworbW9kdWxlX3BhcmFtX2FycmF5KGFtcGxpZmllciwgYm9vbCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFtcGxpZmllciwgIlNldCB0byAxIGlmIHRoZSBtYWNoaW5lIG5lZWRzIHRoZSBhbXAgY29udHJvbCBlbmFibGluZyAobWFueSBsYXB0b3BzKSIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgTS4gU2FpbGVyLCBzYWlsZXJAaWZlLmVlLmV0aHouY2gsIGhiOWpueEBoYjl3LmNoZS5ldSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFUzEzNzEgQXVkaW9QQ0k5NyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpbml0dm9sIHsKKwlpbnQgbWl4Y2g7CisJaW50IHZvbDsKK30gaW5pdHZvbFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX0NELCAweDQwNDAgfSwKKwl7IE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1ZJREVPKSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FMSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9QQ00sIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FLCAweDQwNDAgfSwKKwl7IE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1BIT05FT1VUKSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9PR0FJTiwgMHg0MDQwIH0sCisJeyBNSVhFUl9XUklURShTT1VORF9NSVhFUl9QSE9ORUlOKSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9TUEVBS0VSLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX01JQywgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9SRUNMRVYsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfSUdBSU4sIDB4NDA0MCB9Cit9OworCitzdGF0aWMgc3RydWN0Cit7CisJc2hvcnQgc3ZpZCwgc2RpZDsKK30gYW1wbGlmaWVyX25lZWRlZFtdID0gCit7CisJeyAweDEwN0IsIDB4MjE1MCB9LAkJLyogR2F0ZXdheSBTb2xvIDIxNTAgKi8KKwl7IDB4MTNCRCwgMHgxMDBDIH0sCQkvKiBNZWJpdXMgUEMtTUoxMDBWICovCisJeyAweDExMDIsIDB4NTkzOCB9LAkJLyogVGFyZ2EgWHRlbmRlciAzMDAgKi8KKwl7IDB4MTEwMiwgMHg4OTM4IH0sCQkvKiBJUEMgbm90ZWJvb2sgKi8KKwl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfQorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZXMxMzcxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzOworCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CisJbW1fc2VnbWVudF90IGZzOworCWludCBpLCBncGlvLCB2YWwsIHJlcyA9IC0xOworCWludCBpZHg7CisJdW5zaWduZWQgbG9uZyB0bW87CisJc2lnbmVkIGxvbmcgdG1vMjsKKwl1bnNpZ25lZCBpbnQgY3NzcjsKKworCWlmICgocmVzPXBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpKQorCQlyZXR1cm4gcmVzOworCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBjaWRldiwgMCkgJiBJT1JFU09VUkNFX0lPKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHBjaWRldi0+aXJxID09IDApIAorCQlyZXR1cm4gLUVOT0RFVjsKKwlpID0gcGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIDB4ZmZmZmZmZmYpOworCWlmIChpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVzMTM3MTogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlyZXR1cm4gaTsKKwl9CisJaWYgKCEocyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlczEzNzFfc3RhdGUpLCBHRlBfS0VSTkVMKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHMsIDAsIHNpemVvZihzdHJ1Y3QgZXMxMzcxX3N0YXRlKSk7CisJCisJcy0+Y29kZWMgPSBhYzk3X2FsbG9jX2NvZGVjKCk7CisJaWYocy0+Y29kZWMgPT0gTlVMTCkKKwkJZ290byBlcnJfY29kZWM7CisJCQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9hZGMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYzEud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYzIud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5taWRpLml3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5taWRpLm93YWl0KTsKKwlpbml0X01VVEVYKCZzLT5vcGVuX3NlbSk7CisJc3Bpbl9sb2NrX2luaXQoJnMtPmxvY2spOworCXMtPm1hZ2ljID0gRVMxMzcxX01BR0lDOworCXMtPmRldiA9IHBjaWRldjsKKwlzLT5pbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOworCXMtPmlycSA9IHBjaWRldi0+aXJxOworCXMtPnZlbmRvciA9IHBjaWRldi0+dmVuZG9yOworCXMtPmRldmljZSA9IHBjaWRldi0+ZGV2aWNlOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwgUENJX1JFVklTSU9OX0lELCAmcy0+cmV2KTsKKwlzLT5jb2RlYy0+cHJpdmF0ZV9kYXRhID0gczsKKwlzLT5jb2RlYy0+aWQgPSAwOworCXMtPmNvZGVjLT5jb2RlY19yZWFkID0gcmRjb2RlYzsKKwlzLT5jb2RlYy0+Y29kZWNfd3JpdGUgPSB3cmNvZGVjOworCXByaW50ayhLRVJOX0lORk8gUEZYICJmb3VuZCBjaGlwLCB2ZW5kb3IgaWQgMHglMDR4IGRldmljZSBpZCAweCUwNHggcmV2aXNpb24gMHglMDJ4XG4iLAorCSAgICAgICBzLT52ZW5kb3IsIHMtPmRldmljZSwgcy0+cmV2KTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvLCBFUzEzNzFfRVhURU5ULCAiZXMxMzcxIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW8gcG9ydHMgJSNseC0lI2x4IGluIHVzZVxuIiwgcy0+aW8sIHMtPmlvK0VTMTM3MV9FWFRFTlQtMSk7CisJCXJlcyA9IC1FQlVTWTsKKwkJZ290byBlcnJfcmVnaW9uOworCX0KKwlpZiAoKHJlcz1yZXF1ZXN0X2lycShzLT5pcnEsIGVzMTM3MV9pbnRlcnJ1cHQsIFNBX1NISVJRLCAiZXMxMzcxIixzKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaXJxICV1IGluIHVzZVxuIiwgcy0+aXJxKTsKKwkJZ290byBlcnJfaXJxOworCX0KKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiZm91bmQgZXMxMzcxIHJldiAlZCBhdCBpbyAlI2x4IGlycSAldVxuIiwKKwkgICAgICAgcy0+cmV2LCBzLT5pbywgcy0+aXJxKTsKKwkvKiByZWdpc3RlciBkZXZpY2VzICovCisJaWYgKChyZXM9KHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZXMxMzcxX2F1ZGlvX2ZvcHMsLTEpKSk8MCkKKwkJZ290byBlcnJfZGV2MTsKKwlpZiAoKHJlcz0ocy0+Y29kZWMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZlczEzNzFfbWl4ZXJfZm9wcywgLTEpKSkgPCAwKQorCQlnb3RvIGVycl9kZXYyOworCWlmICgocmVzPShzLT5kZXZfZGFjID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlczEzNzFfZGFjX2ZvcHMsIC0xKSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MzsKKwlpZiAoKHJlcz0ocy0+ZGV2X21pZGkgPSByZWdpc3Rlcl9zb3VuZF9taWRpKCZlczEzNzFfbWlkaV9mb3BzLCAtMSkpKTwwICkKKwkJZ290byBlcnJfZGV2NDsKKyNpZmRlZiBFUzEzNzFfREVCVUcKKwkvKiBpbml0aWFsaXplIHRoZSBkZWJ1ZyBwcm9jIGRldmljZSAqLworCXMtPnBzID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZXMxMzcxIiwwLE5VTEwscHJvY19lczEzNzFfZHVtcCxOVUxMKTsKKyNlbmRpZiAvKiBFUzEzNzFfREVCVUcgKi8KKwkKKwkvKiBpbml0aWFsaXplIGNvZGVjIHJlZ2lzdGVycyAqLworCXMtPmN0cmwgPSAwOworCisJLyogQ2hlY2sgYW1wbGlmaWVyIHJlcXVpcmVtZW50cyAqLworCQorCWlmIChhbXBsaWZpZXJbZGV2aW5kZXhdKQorCQlzLT5jdHJsIHw9IENUUkxfR1BJT19PVVQwOworCWVsc2UgZm9yKGlkeCA9IDA7IGFtcGxpZmllcl9uZWVkZWRbaWR4XS5zdmlkICE9IFBDSV9BTllfSUQ7IGlkeCsrKQorCXsKKwkJaWYocGNpZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IGFtcGxpZmllcl9uZWVkZWRbaWR4XS5zdmlkICYmCisJCSAgIHBjaWRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBhbXBsaWZpZXJfbmVlZGVkW2lkeF0uc2RpZCkKKwkJeworICAgICAgICAgICAgICAgICAgICAJcy0+Y3RybCB8PSBDVFJMX0dQSU9fT1VUMDsgICAvKiB0dXJuIGludGVybmFsIGFtcGxpZmllciBvbiAqLworICAgICAgICAgICAgICAgICAgICAJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkVuYWJsaW5nIGludGVybmFsIGFtcGxpZmllci5cbiIpOworCQl9CisJfQorCisJZm9yIChncGlvID0gMHgyMTg7IGdwaW8gPj0gMHgyMDA7IGdwaW8gLT0gMHgwOCkKKwkJaWYgKHJlcXVlc3RfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQsICJlczEzNzEiKSkKKwkJCWJyZWFrOworCisJaWYgKGdwaW8gPCAweDIwMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJubyBmcmVlIGpveXN0aWNrIGFkZHJlc3MgZm91bmRcbiIpOworCX0gZWxzZSBpZiAoIShzLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3JlZ2lvbihncGlvLCBKT1lfRVhURU5UKTsKKwl9IGVsc2UgeworCQlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkVTUzEzNzEgR2FtZXBvcnQiKTsKKwkJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJpc2ElMDR4L2dhbWVwb3J0MCIsIGdwaW8pOworCQlncC0+ZGV2LnBhcmVudCA9ICZzLT5kZXYtPmRldjsKKwkJZ3AtPmlvID0gZ3BpbzsKKwkJcy0+Y3RybCB8PSBDVFJMX0pZU1RLX0VOIHwgKCgoZ3BpbyA+PiAzKSAmIENUUkxfSk9ZX01BU0spIDw8IENUUkxfSk9ZX1NISUZUKTsKKwl9CisKKwlzLT5zY3RybCA9IDA7CisJY3NzciA9IDA7CisJcy0+c3BkaWZfdm9sdW1lID0gLTE7CisJLyogY2hlY2sgdG8gc2VlIGlmIHMvcGRpZiBtb2RlIGlzIGJlaW5nIHJlcXVlc3RlZCAqLworCWlmIChzcGRpZltkZXZpbmRleF0pIHsKKwkJaWYgKHMtPnJldiA+PSA0KSB7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZW5hYmxpbmcgUy9QRElGIG91dHB1dFxuIik7CisJCQlzLT5zcGRpZl92b2x1bWUgPSAwOworCQkJY3NzciB8PSBTVEFUX0VOX1NQRElGOworCQkJcy0+Y3RybCB8PSBDVFJMX1NQRElGRU5fQjsKKwkJCWlmIChub21peFtkZXZpbmRleF0pIC8qIGRvbid0IG1peCBhbmFsb2cgaW5wdXRzIHRvIHMvcGRpZiBvdXRwdXQgKi8KKwkJCQlzLT5jdHJsIHw9IENUUkxfUkVDRU5fQjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggInJldmlzaW9uICVkIGRvZXMgbm90IHN1cHBvcnQgUy9QRElGXG4iLCBzLT5yZXYpOworCQl9CisJfQorCS8qIGluaXRpYWxpemUgdGhlIGNoaXBzICovCisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCW91dGwoTEVHQUNZX0pGQVNULCBzLT5pbytFUzEzNzFfUkVHX0xFR0FDWSk7CisJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsgIC8qIGVuYWJsZSBidXMgbWFzdGVyaW5nICovCisJLyogaWYgd2UgYXJlIGEgNTg4MCB0dXJuIG9uIHRoZSBBQzk3ICovCisJaWYgKHMtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0VOU09OSVEgJiYKKwkgICAgKChzLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MCAmJiBzLT5yZXYgPj0gQ1Q1ODgwUkVWX0NUNTg4MF9DKSB8fCAKKwkgICAgIChzLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MSAmJiBzLT5yZXYgPT0gRVMxMzcxUkVWX0NUNTg4MF9BKSB8fCAKKwkgICAgIChzLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MSAmJiBzLT5yZXYgPT0gRVMxMzcxUkVWX0VTMTM3M184KSkpIHsgCisJCWNzc3IgfD0gQ1NUQVRfNTg4MF9BQzk3X1JTVDsKKwkJb3V0bChjc3NyLCBzLT5pbytFUzEzNzFfUkVHX1NUQVRVUyk7CisJCS8qIG5lZWQgdG8gZGVsYXkgYXJvdW5kIDIwbXMoYmxlZWNoKSB0byBnaXZlCisJCSAgIHNvbWUgQ09ERUNzIGVub3VnaCB0aW1lIHRvIHdha2V1cCAqLworCQl0bW8gPSBqaWZmaWVzICsgKEhaIC8gNTApICsgMTsKKwkJZm9yICg7OykgeworCQkJdG1vMiA9IHRtbyAtIGppZmZpZXM7CisJCQlpZiAodG1vMiA8PSAwKQorCQkJCWJyZWFrOworCQkJc2NoZWR1bGVfdGltZW91dCh0bW8yKTsKKwkJfQorCX0KKwkvKiBBQzk3IHdhcm0gcmVzZXQgdG8gc3RhcnQgdGhlIGJpdGNsayAqLworCW91dGwocy0+Y3RybCB8IENUUkxfU1lOQ1JFUywgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwl1ZGVsYXkoMik7CisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCS8qIGluaXQgdGhlIHNhbXBsZSByYXRlIGNvbnZlcnRlciAqLworCXNyY19pbml0KHMpOworCS8qIGNvZGVjIGluaXQgKi8KKwlpZiAoIWFjOTdfcHJvYmVfY29kZWMocy0+Y29kZWMpKSB7CisJCXJlcyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2dwOworCX0KKwkvKiBzZXQgZGVmYXVsdCB2YWx1ZXMgKi8KKworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJdmFsID0gU09VTkRfTUFTS19MSU5FOworCW1peGRldl9pb2N0bChzLT5jb2RlYywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGluaXR2b2wpL3NpemVvZihpbml0dm9sWzBdKTsgaSsrKSB7CisJCXZhbCA9IGluaXR2b2xbaV0udm9sOworCQltaXhkZXZfaW9jdGwocy0+Y29kZWMsIGluaXR2b2xbaV0ubWl4Y2gsICh1bnNpZ25lZCBsb25nKSZ2YWwpOworCX0KKwkvKiBtdXRlIG1hc3RlciBhbmQgUENNIHdoZW4gaW4gUy9QRElGIG1vZGUgKi8KKwlpZiAocy0+c3BkaWZfdm9sdW1lICE9IC0xKSB7CisJCXZhbCA9IDB4MDAwMDsKKwkJcy0+Y29kZWMtPm1peGVyX2lvY3RsKHMtPmNvZGVjLCBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsICh1bnNpZ25lZCBsb25nKSZ2YWwpOworCQlzLT5jb2RlYy0+bWl4ZXJfaW9jdGwocy0+Y29kZWMsIFNPVU5EX01JWEVSX1dSSVRFX1BDTSwgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJfQorCXNldF9mcyhmcyk7CisJLyogdHVybiBvbiBTL1BESUYgb3V0cHV0IGRyaXZlciBpZiByZXF1ZXN0ZWQgKi8KKwlvdXRsKGNzc3IsIHMtPmlvK0VTMTM3MV9SRUdfU1RBVFVTKTsKKworCS8qIHJlZ2lzdGVyIGdhbWVwb3J0ICovCisJaWYgKHMtPmdhbWVwb3J0KQorCQlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKKworCS8qIHN0b3JlIGl0IGluIHRoZSBkcml2ZXIgZmllbGQgKi8KKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBzKTsKKwkvKiBwdXQgaXQgaW50byBkcml2ZXIgbGlzdCAqLworCWxpc3RfYWRkX3RhaWwoJnMtPmRldnMsICZkZXZzKTsKKwkvKiBpbmNyZW1lbnQgZGV2aW5kZXggKi8KKwlpZiAoZGV2aW5kZXggPCBOUl9ERVZJQ0UtMSkKKwkJZGV2aW5kZXgrKzsKKyAgICAgICAJcmV0dXJuIDA7CisKKyBlcnJfZ3A6CisJaWYgKHMtPmdhbWVwb3J0KSB7CisJCXJlbGVhc2VfcmVnaW9uKHMtPmdhbWVwb3J0LT5pbywgSk9ZX0VYVEVOVCk7CisJCWdhbWVwb3J0X2ZyZWVfcG9ydChzLT5nYW1lcG9ydCk7CisJfQorI2lmZGVmIEVTMTM3MV9ERUJVRworCWlmIChzLT5wcykKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImVzMTM3MSIsIE5VTEwpOworI2VuZGlmCisJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKHMtPmRldl9taWRpKTsKKyBlcnJfZGV2NDoKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfZGFjKTsKKyBlcnJfZGV2MzoKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLT5kZXZfbWl4ZXIpOworIGVycl9kZXYyOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisgZXJyX2RldjE6CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworIGVycl9pcnE6CisJcmVsZWFzZV9yZWdpb24ocy0+aW8sIEVTMTM3MV9FWFRFTlQpOworIGVycl9yZWdpb246CisgZXJyX2NvZGVjOgorCWFjOTdfcmVsZWFzZV9jb2RlYyhzLT5jb2RlYyk7CisJa2ZyZWUocyk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGVzMTM3MV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoIXMpCisJCXJldHVybjsKKwlsaXN0X2RlbCgmcy0+ZGV2cyk7CisjaWZkZWYgRVMxMzcxX0RFQlVHCisJaWYgKHMtPnBzKQorCQlyZW1vdmVfcHJvY19lbnRyeSgiZXMxMzcxIiwgTlVMTCk7CisjZW5kaWYgLyogRVMxMzcxX0RFQlVHICovCisJb3V0bCgwLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOyAvKiBzd2l0Y2ggZXZlcnl0aGluZyBvZmYgKi8KKwlvdXRsKDAsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOyAvKiBjbGVhciBzZXJpYWwgaW50ZXJydXB0cyAqLworCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisJaWYgKHMtPmdhbWVwb3J0KSB7CisJCWludCBncGlvID0gcy0+Z2FtZXBvcnQtPmlvOworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQocy0+Z2FtZXBvcnQpOworCQlyZWxlYXNlX3JlZ2lvbihncGlvLCBKT1lfRVhURU5UKTsKKwl9CisJcmVsZWFzZV9yZWdpb24ocy0+aW8sIEVTMTM3MV9FWFRFTlQpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5jb2RlYy0+ZGV2X21peGVyKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfZGFjKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21pZGkocy0+ZGV2X21pZGkpOworCWFjOTdfcmVsZWFzZV9jb2RlYyhzLT5jb2RlYyk7CisJa2ZyZWUocyk7CisJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpZF90YWJsZVtdID0geworCXsgUENJX1ZFTkRPUl9JRF9FTlNPTklRLCBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfRUNUSVZBLCBQQ0lfREVWSUNFX0lEX0VDVElWQV9FVjE5MzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlczEzNzFfZHJpdmVyID0geworCS5uYW1lCQk9ICJlczEzNzEiLAorCS5pZF90YWJsZQk9IGlkX3RhYmxlLAorCS5wcm9iZQkJPSBlczEzNzFfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChlczEzNzFfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZXMxMzcxKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggInZlcnNpb24gdjAuMzIgdGltZSAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZlczEzNzFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfZXMxMzcxKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggInVubG9hZGluZ1xuIik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZlczEzNzFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9lczEzNzEpOworbW9kdWxlX2V4aXQoY2xlYW51cF9lczEzNzEpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBNT0RVTEUKKworLyogZm9ybWF0IGlzOiBlczEzNzE9W3NwZGlmLFtub21peCxbYW1wbGlmaWVyXV1dICovCisKK3N0YXRpYyBpbnQgX19pbml0IGVzMTM3MV9zZXR1cChjaGFyICpzdHIpCit7CisJc3RhdGljIHVuc2lnbmVkIF9faW5pdGRhdGEgbnJfZGV2ID0gMDsKKworCWlmIChucl9kZXYgPj0gTlJfREVWSUNFKQorCQlyZXR1cm4gMDsKKworCSh2b2lkKQorICAgICAgICAoKGdldF9vcHRpb24oJnN0ciwgJnNwZGlmW25yX2Rldl0pID09IDIpCisgICAgICAgICAmJiAoZ2V0X29wdGlvbigmc3RyLCAmbm9taXhbbnJfZGV2XSkgPT0gMikKKyAgICAgICAgICYmIChnZXRfb3B0aW9uKCZzdHIsICZhbXBsaWZpZXJbbnJfZGV2XSkpKTsKKworCW5yX2RldisrOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJlczEzNzE9IiwgZXMxMzcxX3NldHVwKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2Vzc3NvbG8xLmMgYi9zb3VuZC9vc3MvZXNzc29sbzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNiOWE5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2Vzc3NvbG8xLmMKQEAgLTAsMCArMSwyNDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICAgICAgZXNzc29sbzEuYyAgLS0gIEVTUyBUZWNobm9sb2d5IFNvbG8xIChFUzE5NDYpIGF1ZGlvIGRyaXZlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAxLCAyMDAzICBUaG9tYXMgU2FpbGVyICh0LnNhaWxlckBhbHVtbmkuZXRoei5jaCkKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogTW9kdWxlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzOgorICogICBub25lIHNvIGZhcgorICoKKyAqICBTdXBwb3J0ZWQgZGV2aWNlczoKKyAqICAvZGV2L2RzcCAgICBzdGFuZGFyZCAvZGV2L2RzcCBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCisgKiAgL2Rldi9taXhlciAgc3RhbmRhcmQgL2Rldi9taXhlciBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCisgKiAgL2Rldi9taWRpICAgc2ltcGxlIE1JREkgVUFSVCBpbnRlcmZhY2UsIG5vIGlvY3RsCisgKgorICogIFJldmlzaW9uIGhpc3RvcnkKKyAqICAgIDEwLjExLjE5OTggICAwLjEgICBJbml0aWFsIHJlbGVhc2UgKHdpdGhvdXQgYW55IGhhcmR3YXJlKQorICogICAgMjIuMDMuMTk5OSAgIDAuMiAgIGNpbmZvLmJsb2NrcyBzaG91bGQgYmUgcmVzZXQgYWZ0ZXIgR0VUeFBUUiBpb2N0bC4KKyAqICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBieSBKb2hhbiBNYWVzIDxqb21hQHRlbGluZHVzLmJlPgorICogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFQUdBSU4gaW5zdGVhZCBvZiBFQlVTWSB3aGVuIE9fTk9OQkxPQ0sKKyAqICAgICAgICAgICAgICAgICAgICAgICByZWFkL3dyaXRlIGNhbm5vdCBiZSBleGVjdXRlZAorICogICAgMDcuMDQuMTk5OSAgIDAuMyAgIGltcGxlbWVudGVkIHRoZSBmb2xsb3dpbmcgaW9jdGwnczogU09VTkRfUENNX1JFQURfUkFURSwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgU09VTkRfUENNX1JFQURfQ0hBTk5FTFMsIFNPVU5EX1BDTV9SRUFEX0JJVFM7IAorICogICAgICAgICAgICAgICAgICAgICAgIEFscGhhIGZpeGVzIHJlcG9ydGVkIGJ5IFBldGVyIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KKyAqICAgIDE1LjA2LjE5OTkgICAwLjQgICBGaXggYmFkIGFsbG9jYXRpb24gYnVnLgorICogICAgICAgICAgICAgICAgICAgICAgIFRoYW5rcyB0byBEZXRpIEZsaWVnbCA8ZmxpZWdsQGluLnR1bS5kZT4KKyAqICAgIDI4LjA2LjE5OTkgICAwLjUgICBBZGQgcGNpX3NldF9tYXN0ZXIKKyAqICAgIDEyLjA4LjE5OTkgICAwLjYgICBGaXggTUlESSBVQVJUIGNyYXNoaW5nIHRoZSBkcml2ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkIG1peGVyIHNlbWFudGljcyBmcm9tIE9TUyBkb2N1bWVudGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3VyIHRvIE9TUyAiY29kZSBiZWhhdmlvdXIiLgorICogICAgICAgICAgICAgICAgICAgICAgIFJlY29yZGluZyBtaWdodCBhY3R1YWxseSB3b3JrIG5vdy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVhbCBERE1BIGNvbnRyb2xsZXIgYWRkcmVzcyByZWdpc3RlciBpcyBhdCBQQ0kgY29uZmlnCisgKiAgICAgICAgICAgICAgICAgICAgICAgMHg2MCwgd2hpbGUgdGhlIHJlZ2lzdGVyIGF0IDB4MTggaXMgdXNlZCBhcyBhIHBsYWNlaG9sZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgZm9yIEJJT1MgYWRkcmVzcyBhbGxvY2F0aW9uLiBUaGlzIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgaXMgc3VwcG9zZWQgdG8gYmUgY29waWVkIGludG8gMHg2MCwgYWNjb3JkaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIFNvbG8xIGRhdGFzaGVldC4gV2hlbiBJIGRvIHRoYXQsIEkgY2FuIGFjY2VzcworICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBERE1BIHJlZ2lzdGVycyBleGNlcHQgdGhlIG1hc2sgYml0LCB3aGljaAorICogICAgICAgICAgICAgICAgICAgICAgIGlzIHN0dWNrIGF0IDEuIFdoZW4gSSBjb3B5IHRoZSBjb250ZW50cyBvZiAweDE4ICsweDEwCisgKiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIERETUEgYmFzZSByZWdpc3RlciwgZXZlcnl0aGluZyBzZWVtcyB0byB3b3JrLgorICogICAgICAgICAgICAgICAgICAgICAgIFRoZSBmdW4gcGFydCBpcyB0aGF0IHRoZSBXaW5kb3dzIFNvbG8xIGRyaXZlciBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgc2VlbSB0byBkbyB0aGVzZSB0cmlja3MuCisgKiAgICAgICAgICAgICAgICAgICAgICAgQnVncyByZW1haW5pbmc6IHBsb3BzIGFuZCBjbGlja3Mgd2hlbiBzdGFydGluZy9zdG9wcGluZyBwbGF5YmFjaworICogICAgMzEuMDguMTk5OSAgIDAuNyAgIGFkZCBzcGluX2xvY2tfaW5pdAorICogICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGN1cnJlbnQtPnN0YXRlID0geCB3aXRoIHNldF9jdXJyZW50X3N0YXRlKHgpCisgKiAgICAwMy4wOS4xOTk5ICAgMC44ICAgY2hhbmdlIHJlYWQgc2VtYW50aWNzIGZvciBNSURJIHRvIG1hdGNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgT1NTIG1vcmUgY2xvc2VseTsgcmVtb3ZlIHBvc3NpYmxlIHdha2V1cCByYWNlCisgKiAgICAwNy4xMC4xOTk5ICAgMC45ICAgRml4IGluaXRpYWxpemF0aW9uOyBjb21wbGFpbiBpZiBzZXF1ZW5jZXIgd3JpdGVzIHRpbWUgb3V0CisgKiAgICAgICAgICAgICAgICAgICAgICAgUmV2aXNlZCByZXNvdXJjZSBncmFiYmluZyBmb3IgdGhlIEZNIHN5bnRoZXNpemVyCisgKiAgICAyOC4xMC4xOTk5ICAgMC4xMCAgTW9yZSB3YWl0cXVldWUgcmFjZXMgZml4ZWQKKyAqICAgIDA5LjEyLjE5OTkgICAwLjExICBXb3JrIGFyb3VuZCBzdHVwaWQgQWxwaGEgcG9ydCBpc3N1ZSAodmlydF90b19idXMoa21hbGxvYyhHRlBfRE1BKSkgPiAxNk0pCisgKiAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsaW5nIHJlY29yZGluZyBvbiBBbHBoYQorICogICAgMTIuMDEuMjAwMCAgIDAuMTIgIFByZXZlbnQgc29tZSBpb2N0bCdzIGZyb20gcmV0dXJuaW5nIGJhZCBjb3VudCB2YWx1ZXMgb24gdW5kZXJydW4vb3ZlcnJ1bjsKKyAqICAgICAgICAgICAgICAgICAgICAgICBUaW0gSmFuaWsncyBCU0UgKEJlZGV2aWxsZWQgU291bmQgRW5naW5lKSBmb3VuZCB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdyYXRlZCAoYWthIHJlZGlkIDgtKSkgQVBNIHN1cHBvcnQgcGF0Y2ggYnkgWmFjaCBCcm93bgorICogICAgMDcuMDIuMjAwMCAgIDAuMTMgIFVzZSBwY2lfYWxsb2NfY29uc2lzdGVudCBhbmQgcGNpX3JlZ2lzdGVyX2RyaXZlcgorICogICAgMTkuMDIuMjAwMCAgIDAuMTQgIFVzZSBwY2lfZG1hX3N1cHBvcnRlZCB0byBkZXRlcm1pbmUgaWYgcmVjb3JkaW5nIHNob3VsZCBiZSBkaXNhYmxlZAorICogICAgMTMuMDMuMjAwMCAgIDAuMTUgIFJlaW50cm9kdWNlIGluaXRpYWxpemF0aW9uIG9mIGEgY291cGxlIG9mIFBDSSBjb25maWcgc3BhY2UgcmVnaXN0ZXJzCisgKiAgICAyMS4xMS4yMDAwICAgMC4xNiAgSW5pdGlhbGl6ZSBkbWEgYnVmZmVycyBpbiBwb2xsLCBvdGhlcndpc2UgcG9sbCBtYXkgcmV0dXJuIGEgYm9ndXMgbWFzaworICogICAgMTIuMTIuMjAwMCAgIDAuMTcgIE1vcmUgZG1hIGJ1ZmZlciBpbml0aWFsaXphdGlvbnMsIHBhdGNoIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICBUamVlcmQgTXVsZGVyIDx0amVlcmQubXVsZGVyQGZ1aml0c3Utc2llbWVucy5jb20+CisgKiAgICAzMS4wMS4yMDAxICAgMC4xOCAgUmVnaXN0ZXIvVW5yZWdpc3RlciBnYW1lcG9ydCwgb3JpZ2luYWwgcGF0Y2ggZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgIE5hdGhhbmllbCBEYXcgPGRhd0Bjcy5jbXUuZWR1PgorICogICAgICAgICAgICAgICAgICAgICAgIEZpeCBTRVRUUklHR0VSIG5vbiBPU1MgQVBJIGNvbmZvcm1pdHkKKyAqICAgIDEwLjAzLjIwMDEgICAgICAgICBwcm92aWRlIGFicyBmdW5jdGlvbiwgcHJldmVudCBwaWNraW5nIHVwIGEgYm9ndXMga2VybmVsIG1hY3JvCisgKiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFicy4gQnVnIHJlcG9ydCBieSBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuYXU+CisgKiAgICAxNS4wNS4yMDAxICAgICAgICAgcGNpX2VuYWJsZV9kZXZpY2UgbW92ZWQsIHJldHVybiB2YWx1ZXMgaW4gcHJvYmUgY2xlYW5lZAorICogICAgICAgICAgICAgICAgICAgICAgIHVwLiBNYXJjdXMgTWVpc3NuZXIgPG1tQGNhbGRlcmEuZGU+CisgKiAgICAyMi4wNS4yMDAxICAgMC4xOSAgbW9yZSBjbGVhbnVwcywgY2hhbmdlZCBQTSB0byBQQ0kgMi40IHN0eWxlLCBnb3QgcmlkCisgKiAgICAgICAgICAgICAgICAgICAgICAgb2YgZ2xvYmFsIGxpc3Qgb2YgZGV2aWNlcywgdXNpbmcgcGNpIGRldmljZSBkYXRhLgorICogICAgICAgICAgICAgICAgICAgICAgIE1hcmN1cyBNZWlzc25lciA8bW1AY2FsZGVyYS5kZT4KKyAqICAgIDAzLjAxLjIwMDMgICAwLjIwICBvcGVuX21vZGUgZml4ZXMgZnJvbSBHZW9yZyBBY2hlciA8YWNoZXJAaW4udHVtLmRlPgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImRtLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfRVNTCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRVNTICAgICAgICAgMHgxMjVkCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9FU1NfU09MTzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FU1NfU09MTzEgICAweDE5NjkKKyNlbmRpZgorCisjZGVmaW5lIFNPTE8xX01BR0lDICAoKFBDSV9WRU5ET1JfSURfRVNTPDwxNil8UENJX0RFVklDRV9JRF9FU1NfU09MTzEpCisKKyNkZWZpbmUgRERNQUJBU0VfT0ZGU0VUICAgICAgICAgICAwICAgIC8qIGNoaXAgYnVnIHdvcmthcm91bmQga2x1ZGdlICovCisjZGVmaW5lIERETUFCQVNFX0VYVEVOVCAgICAgICAgICAgMTYKKworI2RlZmluZSBJT0JBU0VfRVhURU5UICAgICAgICAgICAgIDE2CisjZGVmaW5lIFNCQkFTRV9FWFRFTlQgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVkNCQVNFX0VYVEVOVCAgICAgICAgICAgICAoRERNQUJBU0VfRVhURU5UK0RETUFCQVNFX09GRlNFVCkKKyNkZWZpbmUgTVBVQkFTRV9FWFRFTlQgICAgICAgICAgICA0CisjZGVmaW5lIEdQQkFTRV9FWFRFTlQgICAgICAgICAgICAgNAorI2RlZmluZSBHQU1FUE9SVF9FWFRFTlQJCSAgNAorCisjZGVmaW5lIEZNU1lOVEhfRVhURU5UICAgICAgICAgICAgNAorCisvKiBNSURJIGJ1ZmZlciBzaXplcyAqLworCisjZGVmaW5lIE1JRElJTkJVRiAgMjU2CisjZGVmaW5lIE1JRElPVVRCVUYgMjU2CisKKyNkZWZpbmUgRk1PREVfTUlESV9TSElGVCAzCisjZGVmaW5lIEZNT0RFX01JRElfUkVBRCAgKEZNT0RFX1JFQUQgPDwgRk1PREVfTUlESV9TSElGVCkKKyNkZWZpbmUgRk1PREVfTUlESV9XUklURSAoRk1PREVfV1JJVEUgPDwgRk1PREVfTUlESV9TSElGVCkKKworI2RlZmluZSBGTU9ERV9ETUZNIDB4MTAKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNvbG8xX2RyaXZlcjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBzb2xvMV9zdGF0ZSB7CisJLyogbWFnaWMgKi8KKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisKKwkvKiB0aGUgY29ycmVzcG9uZGluZyBwY2lfZGV2IHN0cnVjdHVyZSAqLworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgZGV2X2F1ZGlvOworCWludCBkZXZfbWl4ZXI7CisJaW50IGRldl9taWRpOworCWludCBkZXZfZG1mbTsKKworCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXVuc2lnbmVkIGxvbmcgaW9iYXNlLCBzYmJhc2UsIHZjYmFzZSwgZGRtYWJhc2UsIG1wdWJhc2U7IC8qIGxvbmcgZm9yIFNQQVJDICovCisJdW5zaWduZWQgaW50IGlycTsKKworCS8qIG1peGVyIHJlZ2lzdGVycyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0IHZvbFsxMF07CisJCXVuc2lnbmVkIGludCByZWNzcmM7CisJCXVuc2lnbmVkIGludCBtb2RjbnQ7CisJCXVuc2lnbmVkIHNob3J0IG1pY3ByZWFtcDsKKwl9IG1peDsKKworCS8qIHdhdmUgc3R1ZmYgKi8KKwl1bnNpZ25lZCBmbXQ7CisJdW5zaWduZWQgY2hhbm5lbHM7CisJdW5zaWduZWQgcmF0ZTsKKwl1bnNpZ25lZCBjaGFyIGNsa2RpdjsKKwl1bnNpZ25lZCBlbmE7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwltb2RlX3Qgb3Blbl9tb2RlOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCXN0cnVjdCBkbWFidWYgeworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hYWRkcjsKKwkJdW5zaWduZWQgYnVmb3JkZXI7CisJCXVuc2lnbmVkIG51bWZyYWc7CisJCXVuc2lnbmVkIGZyYWdzaGlmdDsKKwkJdW5zaWduZWQgaHdwdHIsIHN3cHRyOworCQl1bnNpZ25lZCB0b3RhbF9ieXRlczsKKwkJaW50IGNvdW50OworCQl1bnNpZ25lZCBlcnJvcjsgLyogb3Zlci91bmRlcnJ1biAqLworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCisJCXVuc2lnbmVkIGZyYWdzaXplOworCQl1bnNpZ25lZCBkbWFzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKwkJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIG1hcHBlZDoxOworCQl1bnNpZ25lZCByZWFkeToxOworCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CisJCXVuc2lnbmVkIGVuYWJsZWQ6MTsKKwkJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OworCQlpbnQgb3NzbWF4ZnJhZ3M7CisJCXVuc2lnbmVkIHN1YmRpdmlzaW9uOworCX0gZG1hX2RhYywgZG1hX2FkYzsKKworCS8qIG1pZGkgc3R1ZmYgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpcmQsIGl3ciwgaWNudDsKKwkJdW5zaWduZWQgb3JkLCBvd3IsIG9jbnQ7CisJCXdhaXRfcXVldWVfaGVhZF90IGl3YWl0OworCQl3YWl0X3F1ZXVlX2hlYWRfdCBvd2FpdDsKKwkJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJCXVuc2lnbmVkIGNoYXIgaWJ1ZltNSURJSU5CVUZdOworCQl1bnNpZ25lZCBjaGFyIG9idWZbTUlESU9VVEJVRl07CisJfSBtaWRpOworCisJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc2VxKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciBkYXRhKQoreworICAgICAgICBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogdGhlIGxvY2FsX2lycV9zYXZlIHN0dW50IGlzIHRvIHNlbmQgdGhlIGRhdGEgd2l0aGluIHRoZSBjb21tYW5kIHdpbmRvdyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMHhmZmZmOyBpKyspIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmICghKGluYihzLT5zYmJhc2UrMHhjKSAmIDB4ODApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRiKGRhdGEsIHMtPnNiYmFzZSsweGMpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKwlwcmludGsoS0VSTl9FUlIgImVzc3NvbG8xOiB3cml0ZV9zZXEgdGltZW91dFxuIik7CisJb3V0YihkYXRhLCBzLT5zYmJhc2UrMHhjKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVhZF9zZXEoc3RydWN0IHNvbG8xX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoIWRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAweGZmZmY7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoaW5iKHMtPnNiYmFzZSsweGUpICYgMHg4MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEgPSBpbmIocy0+c2JiYXNlKzB4YSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisJcHJpbnRrKEtFUk5fRVJSICJlc3Nzb2xvMTogcmVhZF9zZXEgdGltZW91dFxuIik7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCByZXNldF9jdHJsKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcykKK3sKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgb3V0YigzLCBzLT5zYmJhc2UrNik7IC8qIGNsZWFyIHNlcXVlbmNlciBhbmQgRklGTyAqLworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICBvdXRiKDAsIHMtPnNiYmFzZSs2KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDB4ZmZmZjsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChpbmIocy0+c2JiYXNlKzB4ZSkgJiAweDgwKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluYihzLT5zYmJhc2UrMHhhKSA9PSAweGFhKSB7CisJCQkJd3JpdGVfc2VxKHMsIDB4YzYpOyAvKiBlbnRlciBlbmhhbmNlZCBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworCQkJfQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfY3RybChzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJd3JpdGVfc2VxKHMsIHJlZyk7CisJd3JpdGVfc2VxKHMsIGRhdGEpOworfQorCisjaWYgMCAvKiB1bnVzZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWRfY3RybChzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgcmVnKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIHI7CisKKwl3cml0ZV9zZXEocywgMHhjMCk7CisJd3JpdGVfc2VxKHMsIHJlZyk7CisJcmVhZF9zZXEocywgJnIpOworCXJldHVybiByOworfQorI2VuZGlmIC8qIHVudXNlZCAqLworCitzdGF0aWMgdm9pZCB3cml0ZV9taXhlcihzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJb3V0YihyZWcsIHMtPnNiYmFzZSs0KTsKKwlvdXRiKGRhdGEsIHMtPnNiYmFzZSs1KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhZF9taXhlcihzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgcmVnKQoreworCW91dGIocmVnLCBzLT5zYmJhc2UrNCk7CisJcmV0dXJuIGluYihzLT5zYmJhc2UrNSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxkMih1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCByID0gMDsKKwkKKwlpZiAoeCA+PSAweDEwMDAwKSB7CisJCXggPj49IDE2OworCQlyICs9IDE2OworCX0KKwlpZiAoeCA+PSAweDEwMCkgeworCQl4ID4+PSA4OworCQlyICs9IDg7CisJfQorCWlmICh4ID49IDB4MTApIHsKKwkJeCA+Pj0gNDsKKwkJciArPSA0OworCX0KKwlpZiAoeCA+PSA0KSB7CisJCXggPj49IDI7CisJCXIgKz0gMjsKKwl9CisJaWYgKHggPj0gMikKKwkJcisrOworCXJldHVybiByOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfZGFjKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5lbmEgJj0gfkZNT0RFX1dSSVRFOworCXdyaXRlX21peGVyKHMsIDB4NzgsIDB4MTApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5lbmEgJiBGTU9ERV9XUklURSkgJiYgKHMtPmRtYV9kYWMubWFwcGVkIHx8IHMtPmRtYV9kYWMuY291bnQgPiAwKSAmJiBzLT5kbWFfZGFjLnJlYWR5KSB7CisJCXMtPmVuYSB8PSBGTU9ERV9XUklURTsKKwkJd3JpdGVfbWl4ZXIocywgMHg3OCwgMHgxMik7CisJCXVkZWxheSgxMCk7CisJCXdyaXRlX21peGVyKHMsIDB4NzgsIDB4MTMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9hZGMoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmVuYSAmPSB+Rk1PREVfUkVBRDsKKwl3cml0ZV9jdHJsKHMsIDB4YjgsIDB4ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPmVuYSAmIEZNT0RFX1JFQUQpICYmIChzLT5kbWFfYWRjLm1hcHBlZCB8fCBzLT5kbWFfYWRjLmNvdW50IDwgKHNpZ25lZCkocy0+ZG1hX2FkYy5kbWFzaXplIC0gMipzLT5kbWFfYWRjLmZyYWdzaXplKSkKKwkgICAgJiYgcy0+ZG1hX2FkYy5yZWFkeSkgeworCQlzLT5lbmEgfD0gRk1PREVfUkVBRDsKKwkJd3JpdGVfY3RybChzLCAweGI4LCAweGYpOworI2lmIDAKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xOiBETUFidWZmZXI6IDB4JTA4bHhcbiIsIChsb25nKXMtPmRtYV9hZGMucmF3YnVmKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xOiBETUE6IG1hc2s6IDB4JTAyeCBjbnQ6IDB4JTA0eCBhZGRyOiAweCUwOHggIHN0YXQ6IDB4JTAyeFxuIiwgCisJCSAgICAgICBpbmIocy0+ZGRtYWJhc2UrMHhmKSwgaW53KHMtPmRkbWFiYXNlKzQpLCBpbmwocy0+ZGRtYWJhc2UpLCBpbmIocy0+ZGRtYWJhc2UrOCkpOworI2VuZGlmCisgICAgICAgICAgICAgICAgb3V0YigwLCBzLT5kZG1hYmFzZSsweGQpOyAvKiBtYXN0ZXIgcmVzZXQgKi8KKwkJb3V0YigxLCBzLT5kZG1hYmFzZSsweGYpOyAgLyogbWFzayAqLworCQlvdXRiKDB4NTQvKjB4MTQqLywgcy0+ZGRtYWJhc2UrMHhiKTsgIC8qIERNQV9NT0RFX1JFQUQgfCBETUFfTU9ERV9BVVRPSU5JVCAqLworCQlvdXRsKHZpcnRfdG9fYnVzKHMtPmRtYV9hZGMucmF3YnVmKSwgcy0+ZGRtYWJhc2UpOworCQlvdXR3KHMtPmRtYV9hZGMuZG1hc2l6ZS0xLCBzLT5kZG1hYmFzZSs0KTsKKwkJb3V0YigwLCBzLT5kZG1hYmFzZSsweGYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMTogc3RhcnQgRE1BOiByZWcgQjg6IDB4JTAyeCAgU0JzdGF0OiAweCUwMnhcbiIKKwkgICAgICAgS0VSTl9ERUJVRyAic29sbzE6IERNQTogc3RhdDogMHglMDJ4ICBjbnQ6IDB4JTA0eCAgbWFzazogMHglMDJ4XG4iLCAKKwkgICAgICAgcmVhZF9jdHJsKHMsIDB4YjgpLCBpbmIocy0+c2JiYXNlKzB4YyksIAorCSAgICAgICBpbmIocy0+ZGRtYWJhc2UrOCksIGludyhzLT5kZG1hYmFzZSs0KSwgaW5iKHMtPmRkbWFiYXNlKzB4ZikpOworCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMTogQTE6IDB4JTAyeCAgQTI6IDB4JTAyeCAgQTQ6IDB4JTAyeCAgQTU6IDB4JTAyeCAgQTg6IDB4JTAyeFxuIiAgCisJICAgICAgIEtFUk5fREVCVUcgInNvbG8xOiBCMTogMHglMDJ4ICBCMjogMHglMDJ4ICBCNDogMHglMDJ4ICBCNzogMHglMDJ4ICBCODogMHglMDJ4ICBCOTogMHglMDJ4XG4iLAorCSAgICAgICByZWFkX2N0cmwocywgMHhhMSksIHJlYWRfY3RybChzLCAweGEyKSwgcmVhZF9jdHJsKHMsIDB4YTQpLCByZWFkX2N0cmwocywgMHhhNSksIHJlYWRfY3RybChzLCAweGE4KSwgCisJICAgICAgIHJlYWRfY3RybChzLCAweGIxKSwgcmVhZF9jdHJsKHMsIDB4YjIpLCByZWFkX2N0cmwocywgMHhiNCksIHJlYWRfY3RybChzLCAweGI3KSwgcmVhZF9jdHJsKHMsIDB4YjgpLCAKKwkgICAgICAgcmVhZF9jdHJsKHMsIDB4YjkpKTsKKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNS1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVhbGxvY19kbWFidWYoc3RydWN0IHNvbG8xX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CisKKwlpZiAoZGItPnJhd2J1ZikgeworCQkvKiB1bmRvIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocy0+ZGV2LCBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyLCBkYi0+cmF3YnVmLCBkYi0+ZG1hYWRkcik7CisJfQorCWRiLT5yYXdidWYgPSBOVUxMOworCWRiLT5tYXBwZWQgPSBkYi0+cmVhZHkgPSAwOworfQorCitzdGF0aWMgaW50IHByb2dfZG1hYnVmKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIpCit7CisJaW50IG9yZGVyOworCXVuc2lnbmVkIGJ5dGVzcGVyc2VjOworCXVuc2lnbmVkIGJ1ZnMsIHNhbXBsZV9zaGlmdCA9IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJZGItPmh3cHRyID0gZGItPnN3cHRyID0gZGItPnRvdGFsX2J5dGVzID0gZGItPmNvdW50ID0gZGItPmVycm9yID0gZGItPmVuZGNsZWFyZWQgPSAwOworCWlmICghZGItPnJhd2J1ZikgeworCQlkYi0+cmVhZHkgPSBkYi0+bWFwcGVkID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKG9yZGVyID0gRE1BQlVGX0RFRkFVTFRPUkRFUjsgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKQorCQkJaWYgKChkYi0+cmF3YnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocy0+ZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsICZkYi0+ZG1hYWRkcikpKQorCQkJCWJyZWFrOworCQlpZiAoIWRiLT5yYXdidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZGItPmJ1Zm9yZGVyID0gb3JkZXI7CisJCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLworCQlwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKKwl9CisJaWYgKHMtPmZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFKSkKKwkJc2FtcGxlX3NoaWZ0Kys7CisJaWYgKHMtPmNoYW5uZWxzID4gMSkKKwkJc2FtcGxlX3NoaWZ0Kys7CisJYnl0ZXNwZXJzZWMgPSBzLT5yYXRlIDw8IHNhbXBsZV9zaGlmdDsKKwlidWZzID0gUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcjsKKwlpZiAoZGItPm9zc2ZyYWdzaGlmdCkgeworCQlpZiAoKDEwMDAgPDwgZGItPm9zc2ZyYWdzaGlmdCkgPCBieXRlc3BlcnNlYykKKwkJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXNwZXJzZWMvMTAwMCk7CisJCWVsc2UKKwkJCWRiLT5mcmFnc2hpZnQgPSBkYi0+b3NzZnJhZ3NoaWZ0OworCX0gZWxzZSB7CisJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXNwZXJzZWMvMTAwLyhkYi0+c3ViZGl2aXNpb24gPyBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CisJCWlmIChkYi0+ZnJhZ3NoaWZ0IDwgMykKKwkJCWRiLT5mcmFnc2hpZnQgPSAzOworCX0KKwlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl3aGlsZSAoZGItPm51bWZyYWcgPCA0ICYmIGRiLT5mcmFnc2hpZnQgPiAzKSB7CisJCWRiLT5mcmFnc2hpZnQtLTsKKwkJZGItPm51bWZyYWcgPSBidWZzID4+IGRiLT5mcmFnc2hpZnQ7CisJfQorCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKwlpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisJCWRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworCWRiLT5mcmFnc2FtcGxlcyA9IGRiLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnQ7CisJZGItPmRtYXNpemUgPSBkYi0+bnVtZnJhZyA8PCBkYi0+ZnJhZ3NoaWZ0OworCWRiLT5lbmFibGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfYWRjKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIHZhOworCWludCBjOworCisJc3RvcF9hZGMocyk7CisJLyogY2hlY2sgaWYgUENJIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIDI0Yml0IGJ1c21hc3RlciBETUEgKi8KKwlpZiAocy0+ZGV2LT5kbWFfbWFzayA+IDB4ZmZmZmZmKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoKGMgPSBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYykpKQorCQlyZXR1cm4gYzsKKwl2YSA9IHMtPmRtYV9hZGMuZG1hYWRkcjsKKwlpZiAoKHZhICYgfigoMTw8MjQpLTEpKSkKKwkJcGFuaWMoInNvbG8xOiBidWZmZXIgYWJvdmUgMTZNIGJvdW5kYXJ5Iik7CisJb3V0YigwLCBzLT5kZG1hYmFzZSsweGQpOyAgLyogY2xlYXIgKi8KKwlvdXRiKDEsIHMtPmRkbWFiYXNlKzB4Zik7IC8qIG1hc2sgKi8KKwkvKm91dGIoMCwgcy0+ZGRtYWJhc2UrOCk7Ki8gIC8qIGVuYWJsZSAoZW5hYmxlIGlzIGFjdGl2ZSBsb3chKSAqLworCW91dGIoMHg1NCwgcy0+ZGRtYWJhc2UrMHhiKTsgIC8qIERNQV9NT0RFX1JFQUQgfCBETUFfTU9ERV9BVVRPSU5JVCAqLworCW91dGwodmEsIHMtPmRkbWFiYXNlKTsKKwlvdXR3KHMtPmRtYV9hZGMuZG1hc2l6ZS0xLCBzLT5kZG1hYmFzZSs0KTsKKwljID0gLSBzLT5kbWFfYWRjLmZyYWdzYW1wbGVzOworCXdyaXRlX2N0cmwocywgMHhhNCwgYyk7CisJd3JpdGVfY3RybChzLCAweGE1LCBjID4+IDgpOworCW91dGIoMCwgcy0+ZGRtYWJhc2UrMHhmKTsKKwlzLT5kbWFfYWRjLnJlYWR5ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfZGFjKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIHZhOworCWludCBjOworCisJc3RvcF9kYWMocyk7CisJaWYgKChjID0gcHJvZ19kbWFidWYocywgJnMtPmRtYV9kYWMpKSkKKwkJcmV0dXJuIGM7CisJbWVtc2V0KHMtPmRtYV9kYWMucmF3YnVmLCAocy0+Zm10ICYgKEFGTVRfVTggfCBBRk1UX1UxNl9MRSkpID8gMCA6IDB4ODAsIHMtPmRtYV9kYWMuZG1hc2l6ZSk7IC8qIGFsbW9zdCBjb3JyZWN0IGZvciBVMTYgKi8KKwl2YSA9IHMtPmRtYV9kYWMuZG1hYWRkcjsKKwlpZiAoKHZhIF4gKHZhICsgcy0+ZG1hX2RhYy5kbWFzaXplIC0gMSkpICYgfigoMTw8MjApLTEpKQorCQlwYW5pYygic29sbzE6IGJ1ZmZlciBjcm9zc2VzIDFNIGJvdW5kYXJ5Iik7CisJb3V0bCh2YSwgcy0+aW9iYXNlKTsKKwkvKiB3YXJuaW5nOiBzLT5kbWFfZGFjLmRtYXNpemUgJiAweGZmZmYgbXVzdCBub3QgYmUgemVybyEgaS5lLiB0aGlzIGxpbWl0cyB1cyB0byBhIDMyayBidWZmZXIgKi8KKwlvdXR3KHMtPmRtYV9kYWMuZG1hc2l6ZSwgcy0+aW9iYXNlKzQpOworCWMgPSAtIHMtPmRtYV9kYWMuZnJhZ3NhbXBsZXM7CisJd3JpdGVfbWl4ZXIocywgMHg3NCwgYyk7CisJd3JpdGVfbWl4ZXIocywgMHg3NiwgYyA+PiA4KTsKKwlvdXRiKDB4YSwgcy0+aW9iYXNlKzYpOworCXMtPmRtYV9kYWMucmVhZHkgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYWR2YW5jZSh2b2lkICpidWYsIHVuc2lnbmVkIGJzaXplLCB1bnNpZ25lZCBicHRyLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoYnB0ciArIGxlbiA+IGJzaXplKSB7CisJCXVuc2lnbmVkIHggPSBic2l6ZSAtIGJwdHI7CisJCW1lbXNldCgoKGNoYXIgKilidWYpICsgYnB0ciwgYywgeCk7CisJCWJwdHIgPSAwOworCQlsZW4gLT0geDsKKwl9CisJbWVtc2V0KCgoY2hhciAqKWJ1ZikgKyBicHRyLCBjLCBsZW4pOworfQorCisvKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCEgKi8KKworc3RhdGljIHZvaWQgc29sbzFfdXBkYXRlX3B0cihzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMpCit7CisJaW50IGRpZmY7CisJdW5zaWduZWQgaHdwdHI7CisKKwkvKiB1cGRhdGUgQURDIHBvaW50ZXIgKi8KKwlpZiAocy0+ZW5hICYgRk1PREVfUkVBRCkgeworCQlod3B0ciA9IChzLT5kbWFfYWRjLmRtYXNpemUgLSAxIC0gaW53KHMtPmRkbWFiYXNlKzQpKSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKyAgICAgICAgICAgICAgICBkaWZmID0gKHMtPmRtYV9hZGMuZG1hc2l6ZSArIGh3cHRyIC0gcy0+ZG1hX2FkYy5od3B0cikgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5od3B0ciA9IGh3cHRyOworCQlzLT5kbWFfYWRjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCXMtPmRtYV9hZGMuY291bnQgKz0gZGlmZjsKKyNpZiAwCisJCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMTogcmQ6IGh3cHRyICV1IHN3cHRyICV1IGRtYXNpemUgJXUgY291bnQgJXVcbiIsCisJCSAgICAgICBzLT5kbWFfYWRjLmh3cHRyLCBzLT5kbWFfYWRjLnN3cHRyLCBzLT5kbWFfYWRjLmRtYXNpemUsIHMtPmRtYV9hZGMuY291bnQpOworI2VuZGlmCisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkgeworCQkJaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfYWRjLmZyYWdzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9hZGMud2FpdCk7CisJCX0gZWxzZSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtICgoMyAqIHMtPmRtYV9hZGMuZnJhZ3NpemUpID4+IDEpKSkgeworCQkJCXMtPmVuYSAmPSB+Rk1PREVfUkVBRDsKKwkJCQl3cml0ZV9jdHJsKHMsIDB4YjgsIDB4ZSk7CisJCQkJcy0+ZG1hX2FkYy5lcnJvcisrOworCQkJfQorCQkJaWYgKHMtPmRtYV9hZGMuY291bnQgPiAwKQorCQkJCXdha2VfdXAoJnMtPmRtYV9hZGMud2FpdCk7CisJCX0KKwl9CisJLyogdXBkYXRlIERBQyBwb2ludGVyICovCisJaWYgKHMtPmVuYSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgICAgICAgICAgaHdwdHIgPSAocy0+ZG1hX2RhYy5kbWFzaXplIC0gaW53KHMtPmlvYmFzZSs0KSkgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisgICAgICAgICAgICAgICAgZGlmZiA9IChzLT5kbWFfZGFjLmRtYXNpemUgKyBod3B0ciAtIHMtPmRtYV9kYWMuaHdwdHIpICUgcy0+ZG1hX2RhYy5kbWFzaXplOworICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuaHdwdHIgPSBod3B0cjsKKwkJcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyArPSBkaWZmOworI2lmIDAKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xOiB3cjogaHdwdHIgJXUgc3dwdHIgJXUgZG1hc2l6ZSAldSBjb3VudCAldVxuIiwKKwkJICAgICAgIHMtPmRtYV9kYWMuaHdwdHIsIHMtPmRtYV9kYWMuc3dwdHIsIHMtPmRtYV9kYWMuZG1hc2l6ZSwgcy0+ZG1hX2RhYy5jb3VudCk7CisjZW5kaWYKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKSB7CisJCQlzLT5kbWFfZGFjLmNvdW50ICs9IGRpZmY7CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYy53YWl0KTsKKwkJfSBlbHNlIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgLT0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50IDw9IDApIHsKKwkJCQlzLT5lbmEgJj0gfkZNT0RFX1dSSVRFOworCQkJCXdyaXRlX21peGVyKHMsIDB4NzgsIDB4MTIpOworCQkJCXMtPmRtYV9kYWMuZXJyb3IrKzsKKwkJCX0gZWxzZSBpZiAocy0+ZG1hX2RhYy5jb3VudCA8PSAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUgJiYgIXMtPmRtYV9kYWMuZW5kY2xlYXJlZCkgeworCQkJCWNsZWFyX2FkdmFuY2Uocy0+ZG1hX2RhYy5yYXdidWYsIHMtPmRtYV9kYWMuZG1hc2l6ZSwgcy0+ZG1hX2RhYy5zd3B0ciwKKwkJCQkJICAgICAgcy0+ZG1hX2RhYy5mcmFnc2l6ZSwgKHMtPmZtdCAmIChBRk1UX1U4IHwgQUZNVF9VMTZfTEUpKSA/IDAgOiAweDgwKTsKKwkJCQlzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAxOworCQkJfQorCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPCAoc2lnbmVkKXMtPmRtYV9kYWMuZG1hc2l6ZSkKKwkJCQl3YWtlX3VwKCZzLT5kbWFfZGFjLndhaXQpOworCQl9CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcHJvZ19jb2RlYyhzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZmRpdiwgZmlsdGVyOworCXVuc2lnbmVkIGNoYXIgYzsKKworCXJlc2V0X2N0cmwocyk7CisJd3JpdGVfc2VxKHMsIDB4ZDMpOworCS8qIHByb2dyYW0gc2FtcGxpbmcgcmF0ZXMgKi8KKwlmaWx0ZXIgPSBzLT5yYXRlICogOSAvIDIwOyAvKiBTZXQgZmlsdGVyIHJvbGwtb2ZmIHRvIDkwJSBvZiByYXRlLzIgKi8KKwlmZGl2ID0gMjU2IC0gNzE2MDAwMCAvIChmaWx0ZXIgKiA4Mik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl3cml0ZV9jdHJsKHMsIDB4YTEsIHMtPmNsa2Rpdik7CisJd3JpdGVfY3RybChzLCAweGEyLCBmZGl2KTsKKwl3cml0ZV9taXhlcihzLCAweDcwLCBzLT5jbGtkaXYpOworCXdyaXRlX21peGVyKHMsIDB4NzIsIGZkaXYpOworCS8qIHByb2dyYW0gQURDIHBhcmFtZXRlcnMgKi8KKwl3cml0ZV9jdHJsKHMsIDB4YjgsIDB4ZSk7CisJd3JpdGVfY3RybChzLCAweGI5LCAvKjB4MSovMCk7CisJd3JpdGVfY3RybChzLCAweGE4LCAocy0+Y2hhbm5lbHMgPiAxKSA/IDB4MTEgOiAweDEyKTsKKwljID0gMHhkMDsKKwlpZiAocy0+Zm10ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUpKQorCQljIHw9IDB4MDQ7CisJaWYgKHMtPmZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfUzgpKQorCQljIHw9IDB4MjA7CisJaWYgKHMtPmNoYW5uZWxzID4gMSkKKwkJYyBePSAweDQ4OworCXdyaXRlX2N0cmwocywgMHhiNywgKGMgJiAweDcwKSB8IDEpOworCXdyaXRlX2N0cmwocywgMHhiNywgYyk7CisJd3JpdGVfY3RybChzLCAweGIxLCAweDUwKTsKKwl3cml0ZV9jdHJsKHMsIDB4YjIsIDB4NTApOworCS8qIHByb2dyYW0gREFDIHBhcmFtZXRlcnMgKi8KKwljID0gMHg0MDsKKwlpZiAocy0+Zm10ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUpKQorCQljIHw9IDE7CisJaWYgKHMtPmZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfUzgpKQorCQljIHw9IDQ7CisJaWYgKHMtPmNoYW5uZWxzID4gMSkKKwkJYyB8PSAyOworCXdyaXRlX21peGVyKHMsIDB4N2EsIGMpOworCXdyaXRlX21peGVyKHMsIDB4NzgsIDB4MTApOworCXMtPmVuYSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9tYWdpY1tdID0gS0VSTl9DUklUICJzb2xvMTogaW52YWxpZCBtYWdpYyB2YWx1ZVxuIjsKKworI2RlZmluZSBWQUxJREFURV9TVEFURShzKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoIShzKSB8fCAocyktPm1hZ2ljICE9IFNPTE8xX01BR0lDKSB7IFwKKwkJcHJpbnRrKGludmFsaWRfbWFnaWMpOyAgICAgICAgICAgIFwKKwkJcmV0dXJuIC1FTlhJTzsgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBtaXhlcl9pb2N0bChzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWl4ZXJfc3JjWzhdID0geworCQlTT1VORF9NQVNLX01JQywgU09VTkRfTUFTS19NSUMsIFNPVU5EX01BU0tfQ0QsIFNPVU5EX01BU0tfVk9MVU1FLAorCQlTT1VORF9NQVNLX01JQywgMCwgU09VTkRfTUFTS19MSU5FLCAwCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtaXh0YWJsZTFbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9IHsKKwkJW1NPVU5EX01JWEVSX1BDTV0gICAgID0gMSwgICAvKiB2b2ljZSAqLworCQlbU09VTkRfTUlYRVJfU1lOVEhdICAgPSAyLCAgIC8qIEZNICovCisJCVtTT1VORF9NSVhFUl9DRF0gICAgICA9IDMsICAgLyogQ0QgKi8KKwkJW1NPVU5EX01JWEVSX0xJTkVdICAgID0gNCwgICAvKiBMaW5lICovCisJCVtTT1VORF9NSVhFUl9MSU5FMV0gICA9IDUsICAgLyogQVVYICovCisJCVtTT1VORF9NSVhFUl9NSUNdICAgICA9IDYsICAgLyogTWljICovCisJCVtTT1VORF9NSVhFUl9MSU5FMl0gICA9IDcsICAgLyogTW9ubyBpbiAqLworCQlbU09VTkRfTUlYRVJfU1BFQUtFUl0gPSA4LCAgIC8qIFNwZWFrZXIgKi8KKwkJW1NPVU5EX01JWEVSX1JFQ0xFVl0gID0gOSwgICAvKiBSZWNvcmRpbmcgbGV2ZWwgKi8KKwkJW1NPVU5EX01JWEVSX1ZPTFVNRV0gID0gMTAgICAvKiBNYXN0ZXIgVm9sdW1lICovCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtaXhyZWdbXSA9IHsKKwkJMHg3YywgICAvKiB2b2ljZSAqLworCQkweDM2LCAgIC8qIEZNICovCisJCTB4MzgsICAgLyogQ0QgKi8KKwkJMHgzZSwgICAvKiBMaW5lICovCisJCTB4M2EsICAgLyogQVVYICovCisJCTB4MWEsICAgLyogTWljICovCisJCTB4NmQgICAgLyogTW9ubyBpbiAqLworCX07CisJdW5zaWduZWQgY2hhciBsLCByLCBybCwgcnIsIHZpZHg7CisJaW50IGksIHZhbDsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlWQUxJREFURV9TVEFURShzKTsKKworCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfUFJJVkFURTEpIHsKKwkJLyogZW5hYmxlL2Rpc2FibGUvcXVlcnkgbWl4ZXIgcHJlYW1wICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gLTEpIHsKKwkJCXZhbCA9IHZhbCA/IDB4ZmYgOiAweGY3OworCQkJd3JpdGVfbWl4ZXIocywgMHg3ZCwgKHJlYWRfbWl4ZXIocywgMHg3ZCkgfCAweDA4KSAmIHZhbCk7CisJCX0KKwkJdmFsID0gKHJlYWRfbWl4ZXIocywgMHg3ZCkgJiAweDA4KSA/IDEgOiAwOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMikgeworCQkvKiBlbmFibGUvZGlzYWJsZS9xdWVyeSBzcGF0aWFsaXplciAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IC0xKSB7CisJCQl2YWwgJj0gMHgzZjsKKwkJCXdyaXRlX21peGVyKHMsIDB4NTIsIHZhbCk7CisJCQl3cml0ZV9taXhlcihzLCAweDUwLCB2YWwgPyAweDA4IDogMCk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHJlYWRfbWl4ZXIocywgMHg1MiksIHApOworCX0KKyAgICAgICAgaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCW1peGVyX2luZm8gaW5mbzsKKwkJc3RybmNweShpbmZvLmlkLCAiU29sbzEiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJuY3B5KGluZm8ubmFtZSwgIkVTUyBTb2xvMSIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaW5mby5tb2RpZnlfY291bnRlciA9IHMtPm1peC5tb2RjbnQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9PTERfTUlYRVJfSU5GTykgeworCQlfb2xkX21peGVyX2luZm8gaW5mbzsKKwkJc3RybmNweShpbmZvLmlkLCAiU29sbzEiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJuY3B5KGluZm8ubmFtZSwgIkVTUyBTb2xvMSIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IE9TU19HRVRWRVJTSU9OKQorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdNJyB8fCBfU0lPQ19TSVpFKGNtZCkgIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGlmIChfU0lPQ19ESVIoY21kKSA9PSBfU0lPQ19SRUFEKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzogLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHJlY29yZGluZyBzb3VyY2UgKi8KKwkJCXJldHVybiBwdXRfdXNlcihtaXhlcl9zcmNbcmVhZF9taXhlcihzLCAweDFjKSAmIDddLCBwKTsKKworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzogLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHN1cHBvcnRlZCBkZXZpY2UgKi8KKwkJCXJldHVybiBwdXRfdXNlcihTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfU1lOVEggfCBTT1VORF9NQVNLX0NEIHwKKwkJCQkJU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19MSU5FMSB8IFNPVU5EX01BU0tfTUlDIHwKKwkJCQkJU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX0xJTkUyIHwgU09VTkRfTUFTS19SRUNMRVYgfAorCQkJCQlTT1VORF9NQVNLX1NQRUFLRVIsIHApOworCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgKi8KKwkJCXJldHVybiBwdXRfdXNlcihTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX1ZPTFVNRSwgcCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6IC8qIE1peGVyIGNoYW5uZWxzIHN1cHBvcnRpbmcgc3RlcmVvICovCisJCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX1NZTlRIIHwgU09VTkRfTUFTS19DRCB8CisJCQkJCVNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX01JQyB8CisJCQkJCVNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19MSU5FMiB8IFNPVU5EX01BU0tfUkVDTEVWLCBwKTsKKwkJCQorICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCXJldHVybiBwdXRfdXNlcihTT1VORF9DQVBfRVhDTF9JTlBVVCwgcCk7CisKKwkJZGVmYXVsdDoKKwkJCWkgPSBfSU9DX05SKGNtZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgISh2aWR4ID0gbWl4dGFibGUxW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFt2aWR4LTFdLCBwKTsKKwkJfQorCX0KKyAgICAgICAgaWYgKF9TSU9DX0RJUihjbWQpICE9IChfU0lPQ19SRUFEfF9TSU9DX1dSSVRFKSkgCisJCXJldHVybiAtRUlOVkFMOworCXMtPm1peC5tb2RjbnQrKzsKKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworI2lmIDAKKwkgICAgICAgIHsKKwkJCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJlZ3NbXSA9IHsKKwkJCQkweDFjLCAweDFhLCAweDM2LCAweDM4LCAweDNhLCAweDNjLCAweDNlLCAweDYwLCAweDYyLCAweDZkLCAweDdjCisJCQl9OworCQkJaW50IGk7CisJCQkKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmVncyk7IGkrKykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAic29sbzE6IG1peGVyIHJlZyAweCUwMng6IDB4JTAyeFxuIiwKKwkJCQkgICAgICAgcmVnc1tpXSwgcmVhZF9taXhlcihzLCByZWdzW2ldKSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic29sbzE6IGN0cmwgcmVnIDB4JTAyeDogMHglMDJ4XG4iLAorCQkJICAgICAgIDB4YjQsIHJlYWRfY3RybChzLCAweGI0KSk7CisJCX0KKyNlbmRpZgorCSAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBpID0gaHdlaWdodDMyKHZhbCk7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPiAxKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCAmPSB+bWl4ZXJfc3JjW3JlYWRfbWl4ZXIocywgMHgxYykgJiA3XTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJaWYgKG1peGVyX3NyY1tpXSAmIHZhbCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA+IDcpCisJCQlyZXR1cm4gMDsKKwkJd3JpdGVfbWl4ZXIocywgMHgxYywgaSk7CisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCXIgPSAodmFsID4+IDgpICYgMHhmZjsKKwkJaWYgKHIgPiAxMDApCisJCQlyID0gMTAwOworCQlpZiAobCA8IDYpIHsKKwkJCXJsID0gMHg0MDsKKwkJCWwgPSAwOworCQl9IGVsc2UgeworCQkJcmwgPSAobCAqIDIgLSAxMSkgLyAzOworCQkJbCA9IChybCAqIDMgKyAxMSkgLyAyOworCQl9CisJCWlmIChyIDwgNikgeworCQkJcnIgPSAweDQwOworCQkJciA9IDA7CisJCX0gZWxzZSB7CisJCQlyciA9IChyICogMiAtIDExKSAvIDM7CisJCQlyID0gKHJyICogMyArIDExKSAvIDI7CisJCX0KKwkJd3JpdGVfbWl4ZXIocywgMHg2MCwgcmwpOworCQl3cml0ZV9taXhlcihzLCAweDYyLCBycik7CisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisgICAgICAgICAgICAgICAgcy0+bWl4LnZvbFs5XSA9ICgodW5zaWduZWQgaW50KXIgPDwgOCkgfCBsOworI2Vsc2UKKyAgICAgICAgICAgICAgICBzLT5taXgudm9sWzldID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzldLCBwKTsKKworCWNhc2UgU09VTkRfTUlYRVJfU1BFQUtFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbCA9IHZhbCAmIDB4ZmY7CisJCWlmIChsID4gMTAwKQorCQkJbCA9IDEwMDsKKwkJZWxzZSBpZiAobCA8IDIpCisJCQlsID0gMjsKKwkJcmwgPSAobCAtIDIpIC8gMTQ7CisJCWwgPSBybCAqIDE0ICsgMjsKKwkJd3JpdGVfbWl4ZXIocywgMHgzYywgcmwpOworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworICAgICAgICAgICAgICAgIHMtPm1peC52b2xbN10gPSBsICogMHgxMDE7CisjZWxzZQorICAgICAgICAgICAgICAgIHMtPm1peC52b2xbN10gPSB2YWw7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbN10sIHApOworCisJY2FzZSBTT1VORF9NSVhFUl9SRUNMRVY6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSAodmFsIDw8IDEpICYgMHgxZmU7CisJCWlmIChsID4gMjAwKQorCQkJbCA9IDIwMDsKKwkJZWxzZSBpZiAobCA8IDUpCisJCQlsID0gNTsKKwkJciA9ICh2YWwgPj4gNykgJiAweDFmZTsKKwkJaWYgKHIgPiAyMDApCisJCQlyID0gMjAwOworCQllbHNlIGlmIChyIDwgNSkKKwkJCXIgPSA1OworCQlybCA9IChsIC0gNSkgLyAxMzsKKwkJcnIgPSAociAtIDUpIC8gMTM7CisJCXIgPSAocmwgKiAxMyArIDUpIC8gMjsKKwkJbCA9IChyciAqIDEzICsgNSkgLyAyOworCQl3cml0ZV9jdHJsKHMsIDB4YjQsIChybCA8PCA0KSB8IHJyKTsKKyNpZmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKyAgICAgICAgICAgICAgICBzLT5taXgudm9sWzhdID0gKCh1bnNpZ25lZCBpbnQpciA8PCA4KSB8IGw7CisjZWxzZQorICAgICAgICAgICAgICAgIHMtPm1peC52b2xbOF0gPSB2YWw7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbOF0sIHApOworCisJZGVmYXVsdDoKKwkJaSA9IF9JT0NfTlIoY21kKTsKKwkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbCA9ICh2YWwgPDwgMSkgJiAweDFmZTsKKwkJaWYgKGwgPiAyMDApCisJCQlsID0gMjAwOworCQllbHNlIGlmIChsIDwgNSkKKwkJCWwgPSA1OworCQlyID0gKHZhbCA+PiA3KSAmIDB4MWZlOworCQlpZiAociA+IDIwMCkKKwkJCXIgPSAyMDA7CisJCWVsc2UgaWYgKHIgPCA1KQorCQkJciA9IDU7CisJCXJsID0gKGwgLSA1KSAvIDEzOworCQlyciA9IChyIC0gNSkgLyAxMzsKKwkJciA9IChybCAqIDEzICsgNSkgLyAyOworCQlsID0gKHJyICogMTMgKyA1KSAvIDI7CisJCXdyaXRlX21peGVyKHMsIG1peHJlZ1t2aWR4LTFdLCAocmwgPDwgNCkgfCBycik7CisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisgICAgICAgICAgICAgICAgcy0+bWl4LnZvbFt2aWR4LTFdID0gKCh1bnNpZ25lZCBpbnQpciA8PCA4KSB8IGw7CisjZWxzZQorICAgICAgICAgICAgICAgIHMtPm1peC52b2xbdmlkeC0xXSA9IHZhbDsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFt2aWR4LTFdLCBwKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHNvbG8xX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisKKwl3aGlsZSAoKHBjaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldikpICE9IE5VTEwpIHsKKwkJc3RydWN0IHBjaV9kcml2ZXIgKmRydnI7CisJCWRydnIgPSBwY2lfZGV2X2RyaXZlciAocGNpX2Rldik7CisJCWlmIChkcnZyICE9ICZzb2xvMV9kcml2ZXIpCisJCQljb250aW51ZTsKKwkJcyA9IChzdHJ1Y3Qgc29sbzFfc3RhdGUqKXBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwkJaWYgKCFzKQorCQkJY29udGludWU7CisJCWlmIChzLT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT0RFVjsKKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgc29sbzFfcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbG8xX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIG1peGVyX2lvY3RsKChzdHJ1Y3Qgc29sbzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGEsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNvbG8xX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBzb2xvMV9pb2N0bF9taXhkZXYsCisJLm9wZW4JCT0gc29sbzFfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSBzb2xvMV9yZWxlYXNlX21peGRldiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGRyYWluX2RhYyhzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudDsKKwl1bnNpZ25lZCB0bW87CisJCisJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQlyZXR1cm4gMDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgICAgICBmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDw9IDApCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKG5vbmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgICAgICAgICB9CisJCXRtbyA9IDMgKiBIWiAqIChjb3VudCArIHMtPmRtYV9kYWMuZnJhZ3NpemUpIC8gMiAvIHMtPnJhdGU7CisJCWlmIChzLT5mbXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSkpCisJCQl0bW8gPj49IDE7CisJCWlmIChzLT5jaGFubmVscyA+IDEpCisJCQl0bW8gPj49IDE7CisgICAgICAgICAgICAgICAgaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xOiBkbWEgdGltZWQgb3V0Pz9cbiIpOworICAgICAgICB9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNzaXplX3Qgc29sbzFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQlyZXR1cm4gcmV0OworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9hZGMud2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc3dwdHIgPSBzLT5kbWFfYWRjLnN3cHRyOworCQljbnQgPSBzLT5kbWFfYWRjLmRtYXNpemUtc3dwdHI7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50IDwgY250KQorCQkJY250ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworI2lmZGVmIERFQlVHUkVDCisJCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMV9yZWFkOiByZWcgQjg6IDB4JTAyeCAgRE1Bc3RhdDogMHglMDJ4ICBETUFjbnQ6IDB4JTA0eCAgU0JzdGF0OiAweCUwMnggIGNudDogJXVcbiIsIAorCQkgICAgICAgcmVhZF9jdHJsKHMsIDB4YjgpLCBpbmIocy0+ZGRtYWJhc2UrOCksIGludyhzLT5kZG1hYmFzZSs0KSwgaW5iKHMtPnNiYmFzZSsweGMpLCBjbnQpOworI2VuZGlmCisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKKwkJCQlzdGFydF9hZGMocyk7CisjaWZkZWYgREVCVUdSRUMKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMV9yZWFkOiByZWdzOiBBMTogMHglMDJ4ICBBMjogMHglMDJ4ICBBNDogMHglMDJ4ICBBNTogMHglMDJ4ICBBODogMHglMDJ4XG4iCisJCQkgICAgICAgS0VSTl9ERUJVRyAic29sbzFfcmVhZDogcmVnczogQjE6IDB4JTAyeCAgQjI6IDB4JTAyeCAgQjc6IDB4JTAyeCAgQjg6IDB4JTAyeCAgQjk6IDB4JTAyeFxuIgorCQkJICAgICAgIEtFUk5fREVCVUcgInNvbG8xX3JlYWQ6IERNQTogYWRkcjogMHglMDh4IGNudDogMHglMDR4IHN0YXQ6IDB4JTAyeCBtYXNrOiAweCUwMnhcbiIgIAorCQkJICAgICAgIEtFUk5fREVCVUcgInNvbG8xX3JlYWQ6IFNCc3RhdDogMHglMDJ4ICBjbnQ6ICV1XG4iLAorCQkJICAgICAgIHJlYWRfY3RybChzLCAweGExKSwgcmVhZF9jdHJsKHMsIDB4YTIpLCByZWFkX2N0cmwocywgMHhhNCksIHJlYWRfY3RybChzLCAweGE1KSwgcmVhZF9jdHJsKHMsIDB4YTgpLCAKKwkJCSAgICAgICByZWFkX2N0cmwocywgMHhiMSksIHJlYWRfY3RybChzLCAweGIyKSwgcmVhZF9jdHJsKHMsIDB4YjcpLCByZWFkX2N0cmwocywgMHhiOCksIHJlYWRfY3RybChzLCAweGI5KSwgCisJCQkgICAgICAgaW5sKHMtPmRkbWFiYXNlKSwgaW53KHMtPmRkbWFiYXNlKzQpLCBpbmIocy0+ZGRtYWJhc2UrOCksIGluYihzLT5kZG1hYmFzZSsxNSksIGluYihzLT5zYmJhc2UrMHhjKSwgY250KTsKKyNlbmRpZgorCQkJaWYgKGluYihzLT5kZG1hYmFzZSsxNSkgJiAxKQorCQkJCXByaW50ayhLRVJOX0VSUiAic29sbzE6IGNhbm5vdCBzdGFydCByZWNvcmRpbmcsIERETUEgbWFzayBiaXQgc3R1Y2sgYXQgMVxuIik7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisjaWZkZWYgREVCVUdSRUMKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMV9yZWFkOiByZWdzOiBBMTogMHglMDJ4ICBBMjogMHglMDJ4ICBBNDogMHglMDJ4ICBBNTogMHglMDJ4ICBBODogMHglMDJ4XG4iCisJCQkgICAgICAgS0VSTl9ERUJVRyAic29sbzFfcmVhZDogcmVnczogQjE6IDB4JTAyeCAgQjI6IDB4JTAyeCAgQjc6IDB4JTAyeCAgQjg6IDB4JTAyeCAgQjk6IDB4JTAyeFxuIgorCQkJICAgICAgIEtFUk5fREVCVUcgInNvbG8xX3JlYWQ6IERNQTogYWRkcjogMHglMDh4IGNudDogMHglMDR4IHN0YXQ6IDB4JTAyeCBtYXNrOiAweCUwMnhcbiIgIAorCQkJICAgICAgIEtFUk5fREVCVUcgInNvbG8xX3JlYWQ6IFNCc3RhdDogMHglMDJ4ICBjbnQ6ICV1XG4iLAorCQkJICAgICAgIHJlYWRfY3RybChzLCAweGExKSwgcmVhZF9jdHJsKHMsIDB4YTIpLCByZWFkX2N0cmwocywgMHhhNCksIHJlYWRfY3RybChzLCAweGE1KSwgcmVhZF9jdHJsKHMsIDB4YTgpLCAKKwkJCSAgICAgICByZWFkX2N0cmwocywgMHhiMSksIHJlYWRfY3RybChzLCAweGIyKSwgcmVhZF9jdHJsKHMsIDB4YjcpLCByZWFkX2N0cmwocywgMHhiOCksIHJlYWRfY3RybChzLCAweGI5KSwgCisJCQkgICAgICAgaW5sKHMtPmRkbWFiYXNlKSwgaW53KHMtPmRkbWFiYXNlKzQpLCBpbmIocy0+ZGRtYWJhc2UrOCksIGluYihzLT5kZG1hYmFzZSsxNSksIGluYihzLT5zYmJhc2UrMHhjKSwgY250KTsKKyNlbmRpZgorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfYWRjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9hZGMuY291bnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKKwkJCXN0YXJ0X2FkYyhzKTsKKyNpZmRlZiBERUJVR1JFQworCQlwcmludGsoS0VSTl9ERUJVRyAic29sbzFfcmVhZDogcmVnIEI4OiAweCUwMnggIERNQXN0YXQ6IDB4JTAyeCAgRE1BY250OiAweCUwNHggIFNCc3RhdDogMHglMDJ4XG4iLCAKKwkJICAgICAgIHJlYWRfY3RybChzLCAweGI4KSwgaW5iKHMtPmRkbWFiYXNlKzgpLCBpbncocy0+ZGRtYWJhc2UrNCksIGluYihzLT5zYmJhc2UrMHhjKSk7CisjZW5kaWYKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9hZGMud2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgc29sbzFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc29sbzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAic29sbzFfd3JpdGU6IHJlZyA3MDogMHglMDJ4ICA3MTogMHglMDJ4ICA3MjogMHglMDJ4ICA3NDogMHglMDJ4ICA3NjogMHglMDJ4ICA3ODogMHglMDJ4ICA3QTogMHglMDJ4XG4iCisJICAgICAgIEtFUk5fREVCVUcgInNvbG8xX3dyaXRlOiBETUE6IGFkZHI6IDB4JTA4eCAgY250OiAweCUwNHggIHN0YXQ6IDB4JTAyeCAgU0JzdGF0OiAweCUwMnhcbiIsIAorCSAgICAgICByZWFkX21peGVyKHMsIDB4NzApLCByZWFkX21peGVyKHMsIDB4NzEpLCByZWFkX21peGVyKHMsIDB4NzIpLCByZWFkX21peGVyKHMsIDB4NzQpLCByZWFkX21peGVyKHMsIDB4NzYpLAorCSAgICAgICByZWFkX21peGVyKHMsIDB4NzgpLCByZWFkX21peGVyKHMsIDB4N2EpLCBpbmwocy0+aW9iYXNlKSwgaW53KHMtPmlvYmFzZSs0KSwgaW5iKHMtPmlvYmFzZSs2KSwgaW5iKHMtPnNiYmFzZSsweGMpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAic29sbzFfd3JpdGU6IHJlZyA3ODogMHglMDJ4ICByZWcgN0E6IDB4JTAyeCAgRE1BY250OiAweCUwNHggIERNQXN0YXQ6IDB4JTAyeCAgU0JzdGF0OiAweCUwMnhcbiIsIAorCSAgICAgICByZWFkX21peGVyKHMsIDB4NzgpLCByZWFkX21peGVyKHMsIDB4N2EpLCBpbncocy0+aW9iYXNlKzQpLCBpbmIocy0+aW9iYXNlKzYpLCBpbmIocy0+c2JiYXNlKzB4YykpOworI2VuZGlmCisJcmV0ID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CQorCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHMtPmRtYV9kYWMuY291bnQgPCAwKSB7CisJCQlzLT5kbWFfZGFjLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+ZG1hX2RhYy5jb3VudCArIGNudCA+IHMtPmRtYV9kYWMuZG1hc2l6ZSkKKwkJCWNudCA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIHMtPmRtYV9kYWMuY291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5lbmFibGVkKQorCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYy5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfZGFjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9kYWMuY291bnQgKz0gY250OworCQlzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9kYWMuZW5hYmxlZCkKKwkJCXN0YXJ0X2RhYyhzKTsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc29sbzFfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc29sbzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYyhzKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9hZGMocykpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfYWRjLndhaXQsIHdhaXQpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXNvbG8xX3VwZGF0ZV9wdHIocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQl9IGVsc2UgeworCQkJaWYgKHMtPmRtYV9hZGMuY291bnQgPiAwKQorCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJfQorCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUpIAorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0gZWxzZSB7CisJCQlpZiAoKHNpZ25lZClzLT5kbWFfZGFjLmRtYXNpemUgPiBzLT5kbWFfZGFjLmNvdW50KQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCisKK3N0YXRpYyBpbnQgc29sbzFfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpICE9IDApCisJCQlnb3RvIG91dDsKKwkJZGIgPSAmcy0+ZG1hX2RhYzsKKwl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSAhPSAwKQorCQkJZ290byBvdXQ7CisJCWRiID0gJnMtPmRtYV9hZGM7CisJfSBlbHNlIAorCQlnb3RvIG91dDsKKwlyZXQgPSAtRUlOVkFMOworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCisJCWdvdG8gb3V0OworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikpCisJCWdvdG8gb3V0OworCXJldCA9IC1FQUdBSU47CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJdmlydF90b19waHlzKGRiLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlnb3RvIG91dDsKKwlkYi0+bWFwcGVkID0gMTsKKwlyZXQgPSAwOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNvbG8xX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKyAgICAgICAgY291bnRfaW5mbyBjaW5mbzsKKwlpbnQgdmFsLCBtYXBwZWQsIHJldCwgY291bnQ7CisgICAgICAgIGludCBkaXYxLCBkaXYyOworICAgICAgICB1bnNpZ25lZCByYXRlMSwgcmF0ZTI7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAgbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYy5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywgMC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sqLyk7CisJCXJldHVybiAwOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQkJcy0+ZG1hX2RhYy5zd3B0ciA9IHMtPmRtYV9kYWMuaHdwdHIgPSBzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9IDA7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2FkYy5od3B0ciA9IHMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlwcm9nX2NvZGVjKHMpOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IHMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJLyogcHJvZ3JhbSBzYW1wbGluZyByYXRlcyAqLworCQkJaWYgKHZhbCA+IDQ4MDAwKQorCQkJCXZhbCA9IDQ4MDAwOworCQkJaWYgKHZhbCA8IDYzMDApCisJCQkJdmFsID0gNjMwMDsKKwkJCWRpdjEgPSAoNzY4MDAwICsgdmFsIC8gMikgLyB2YWw7CisJCQlyYXRlMSA9ICg3NjgwMDAgKyBkaXYxIC8gMikgLyBkaXYxOworCQkJZGl2MSA9IC1kaXYxOworCQkJZGl2MiA9ICg3OTM4MDAgKyB2YWwgLyAyKSAvIHZhbDsKKwkJCXJhdGUyID0gKDc5MzgwMCArIGRpdjIgLyAyKSAvIGRpdjI7CisJCQlkaXYyID0gKC1kaXYyKSAmIDB4N2Y7CisJCQlpZiAoYWJzKHZhbCAtIHJhdGUyKSA8IGFicyh2YWwgLSByYXRlMSkpIHsKKwkJCQlyYXRlMSA9IHJhdGUyOworCQkJCWRpdjEgPSBkaXYyOworCQkJfQorCQkJcy0+cmF0ZSA9IHJhdGUxOworCQkJcy0+Y2xrZGl2ID0gZGl2MTsKKwkJCXByb2dfY29kZWMocyk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHMtPnJhdGUsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzdG9wX2FkYyhzKTsKKwkJc3RvcF9kYWMocyk7CisJCXMtPmRtYV9hZGMucmVhZHkgPSBzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJLyogcHJvZ3JhbSBjaGFubmVscyAqLworCQlzLT5jaGFubmVscyA9IHZhbCA/IDIgOiAxOworCQlwcm9nX2NvZGVjKHMpOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IHMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJLyogcHJvZ3JhbSBjaGFubmVscyAqLworCQkJcy0+Y2hhbm5lbHMgPSAodmFsID49IDIpID8gMiA6IDE7CisJCQlwcm9nX2NvZGVjKHMpOworCQl9CisJCXJldHVybiBwdXRfdXNlcihzLT5jaGFubmVscywgcCk7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9VMTZfTEV8QUZNVF9TOHxBRk1UX1U4LCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXMtPmRtYV9hZGMucmVhZHkgPSBzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCS8qIHByb2dyYW0gZm9ybWF0ICovCisJCQlpZiAodmFsICE9IEFGTVRfUzE2X0xFICYmIHZhbCAhPSBBRk1UX1UxNl9MRSAmJiAKKwkJCSAgICB2YWwgIT0gQUZNVF9TOCAmJiB2YWwgIT0gQUZNVF9VOCkKKwkJCQl2YWwgPSBBRk1UX1U4OworCQkJcy0+Zm10ID0gdmFsOworCQkJcHJvZ19jb2RlYyhzKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIocy0+Zm10LCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgcy0+ZW5hICYgRk1PREVfUkVBRCkKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgcy0+ZW5hICYgRk1PREVfV1JJVEUpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzLT5kbWFfZGFjLmVuYWJsZWQgPSAxOworCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCQlpZiAoaW5iKHMtPmRkbWFiYXNlKzE1KSAmIDEpCisJCQkJCXByaW50ayhLRVJOX0VSUiAic29sbzE6IGNhbm5vdCBzdGFydCByZWNvcmRpbmcsIERETUEgbWFzayBiaXQgc3R1Y2sgYXQgMVxuIik7CisJCQl9IGVsc2UgeworCQkJCXMtPmRtYV9kYWMuZW5hYmxlZCA9IDA7CisJCQkJc3RvcF9hZGMocyk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJcy0+ZG1hX2RhYy5lbmFibGVkID0gMTsKKwkJCQlzdGFydF9kYWMocyk7CisJCQl9IGVsc2UgeworCQkJCXMtPmRtYV9kYWMuZW5hYmxlZCA9IDA7CisJCQkJc3RvcF9kYWMocyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzb2xvMV91cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfZGFjLmZyYWdzaXplOworCQljb3VudCA9IHMtPmRtYV9kYWMuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfZGFjLm51bWZyYWc7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsgICAgICAKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzb2xvMV91cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplOworICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcyA9IHMtPmRtYV9hZGMuY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bWZyYWc7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsgICAgICAKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKyAgICAgICAgICAgICAgICBmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc29sbzFfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IHMtPmRtYV9kYWMuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJcmV0dXJuIHB1dF91c2VyKGNvdW50LCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzb2xvMV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKKyAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBzLT5kbWFfYWRjLmNvdW50ID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9hZGMuaHdwdHI7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc29sbzFfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMudG90YWxfYnl0ZXM7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsKKyAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSBzLT5kbWFfZGFjLmh3cHRyOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCQlzLT5kbWFfZGFjLmNvdW50ICY9IHMtPmRtYV9kYWMuZnJhZ3NpemUtMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworI2lmIDAKKwkJcHJpbnRrKEtFUk5fREVCVUcgImVzc3NvbG8xOiBHRVRPUFRSOiBieXRlcyAldSBibG9ja3MgJXUgcHRyICV1LCBidWZvcmRlciAldSBudW1mcmFnICV1IGZyYWdzaGlmdCAldVxuIgorCQkgICAgICAgS0VSTl9ERUJVRyAiZXNzc29sbzE6IHN3cHRyICV1IGNvdW50ICV1IGZyYWdzaXplICV1IGRtYXNpemUgJXUgZnJhZ3NhbXBsZXMgJXVcbiIsCisJCSAgICAgICBjaW5mby5ieXRlcywgY2luZm8uYmxvY2tzLCBjaW5mby5wdHIsIHMtPmRtYV9kYWMuYnVmb3JkZXIsIHMtPmRtYV9kYWMubnVtZnJhZywgcy0+ZG1hX2RhYy5mcmFnc2hpZnQsCisJCSAgICAgICBzLT5kbWFfZGFjLnN3cHRyLCBzLT5kbWFfZGFjLmNvdW50LCBzLT5kbWFfZGFjLmZyYWdzaXplLCBzLT5kbWFfZGFjLmRtYXNpemUsIHMtPmRtYV9kYWMuZnJhZ3NhbXBsZXMpOworI2VuZGlmCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJcmV0dXJuIHZhbDsKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfZGFjLmZyYWdzaXplLCBwKTsKKwkJfQorCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQlyZXR1cm4gdmFsOworCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSA0OworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc21heGZyYWdzIDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gNDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSA0OworCQl9CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKSB8fAorCQkgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIocy0+cmF0ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJcmV0dXJuIHB1dF91c2VyKHMtPmNoYW5uZWxzLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKEFGTVRfUzh8QUZNVF9VOCkpID8gOCA6IDE2LCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkKKwl9CisJcmV0dXJuIG1peGVyX2lvY3RsKHMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBzb2xvMV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc29sbzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJZHJhaW5fZGFjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0b3BfZGFjKHMpOworCQlvdXRiKDAsIHMtPmlvYmFzZSs2KTsgIC8qIGRpc2FibGUgRE1BICovCisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RvcF9hZGMocyk7CisJCW91dGIoMSwgcy0+ZGRtYWJhc2UrMHhmKTsgLyogbWFzayBETUEgY2hhbm5lbCAqLworCQlvdXRiKDAsIHMtPmRkbWFiYXNlKzB4ZCk7IC8qIERNQSBtYXN0ZXIgY2xlYXIgKi8KKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9hZGMpOworCX0KKwlzLT5vcGVuX21vZGUgJj0gfihGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sbzFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqcyA9IE5VTEw7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCQorCXdoaWxlICgocGNpX2RldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZGV2KSkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2cjsKKworCQlkcnZyID0gcGNpX2Rldl9kcml2ZXIocGNpX2Rldik7CisJCWlmIChkcnZyICE9ICZzb2xvMV9kcml2ZXIpCisJCQljb250aW51ZTsKKwkJcyA9IChzdHJ1Y3Qgc29sbzFfc3RhdGUqKXBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwkJaWYgKCFzKQorCQkJY29udGludWU7CisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXMpCisJCXJldHVybiAtRU5PREVWOworICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCXMtPmZtdCA9IEFGTVRfVTg7CisJcy0+Y2hhbm5lbHMgPSAxOworCXMtPnJhdGUgPSA4MDAwOworCXMtPmNsa2RpdiA9IDk2IHwgMHg4MDsKKwlzLT5lbmEgPSAwOworCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSAwOworCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDE7CisJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IDA7CisJcy0+ZG1hX2RhYy5lbmFibGVkID0gMTsKKwlzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlwcm9nX2NvZGVjKHMpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNvbG8xX2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHNvbG8xX3JlYWQsCisJLndyaXRlCQk9IHNvbG8xX3dyaXRlLAorCS5wb2xsCQk9IHNvbG8xX3BvbGwsCisJLmlvY3RsCQk9IHNvbG8xX2lvY3RsLAorCS5tbWFwCQk9IHNvbG8xX21tYXAsCisJLm9wZW4JCT0gc29sbzFfb3BlbiwKKwkucmVsZWFzZQk9IHNvbG8xX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogaG9sZCBzcGlubG9jayBmb3IgdGhlIGZvbGxvd2luZyEgKi8KK3N0YXRpYyB2b2lkIHNvbG8xX2hhbmRsZV9taWRpKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCWludCB3YWtlOworCisJaWYgKCEocy0+bXB1YmFzZSkpCisJCXJldHVybjsKKwl3YWtlID0gMDsKKwl3aGlsZSAoIShpbmIocy0+bXB1YmFzZSsxKSAmIDB4ODApKSB7CisJCWNoID0gaW5iKHMtPm1wdWJhc2UpOworCQlpZiAocy0+bWlkaS5pY250IDwgTUlESUlOQlVGKSB7CisJCQlzLT5taWRpLmlidWZbcy0+bWlkaS5pd3JdID0gY2g7CisJCQlzLT5taWRpLml3ciA9IChzLT5taWRpLml3ciArIDEpICUgTUlESUlOQlVGOworCQkJcy0+bWlkaS5pY250Kys7CisJCX0KKwkJd2FrZSA9IDE7CisJfQorCWlmICh3YWtlKQorCQl3YWtlX3VwKCZzLT5taWRpLml3YWl0KTsKKwl3YWtlID0gMDsKKwl3aGlsZSAoIShpbmIocy0+bXB1YmFzZSsxKSAmIDB4NDApICYmIHMtPm1pZGkub2NudCA+IDApIHsKKwkJb3V0YihzLT5taWRpLm9idWZbcy0+bWlkaS5vcmRdLCBzLT5tcHViYXNlKTsKKwkJcy0+bWlkaS5vcmQgPSAocy0+bWlkaS5vcmQgKyAxKSAlIE1JRElPVVRCVUY7CisJCXMtPm1pZGkub2NudC0tOworCQlpZiAocy0+bWlkaS5vY250IDwgTUlESU9VVEJVRi0xNikKKwkJCXdha2UgPSAxOworCX0KKwlpZiAod2FrZSkKKwkJd2FrZV91cCgmcy0+bWlkaS5vd2FpdCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzb2xvMV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWRldl9pZDsKKwl1bnNpZ25lZCBpbnQgaW50c3JjOworCQorCS8qIGZhc3RwYXRoIG91dCwgdG8gZWFzZSBpbnRlcnJ1cHQgc2hhcmluZyAqLworCWludHNyYyA9IGluYihzLT5pb2Jhc2UrNyk7IC8qIGdldCBpbnRlcnJ1cHQgc291cmNlKHMpICovCisJaWYgKCFpbnRzcmMpCisJCXJldHVybiBJUlFfTk9ORTsKKwkodm9pZClpbmIocy0+c2JiYXNlKzB4ZSk7ICAvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwlzcGluX2xvY2soJnMtPmxvY2spOworCS8qIGNsZWFyIGF1ZGlvIGludGVycnVwdHMgZmlyc3QgKi8KKwlpZiAoaW50c3JjICYgMHgyMCkKKwkJd3JpdGVfbWl4ZXIocywgMHg3YSwgcmVhZF9taXhlcihzLCAweDdhKSAmIDB4N2YpOworCXNvbG8xX3VwZGF0ZV9wdHIocyk7CisJc29sbzFfaGFuZGxlX21pZGkocyk7CisJc3Bpbl91bmxvY2soJnMtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgc29sbzFfbWlkaV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXNvbG8xX2hhbmRsZV9taWRpKHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5taWRpLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzKzE7CisJYWRkX3RpbWVyKCZzLT5taWRpLnRpbWVyKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzc2l6ZV90IHNvbG8xX21pZGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHB0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCXJldCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJnMtPm1pZGkuaXdhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXB0ciA9IHMtPm1pZGkuaXJkOworCQljbnQgPSBNSURJSU5CVUYgLSBwdHI7CisJCWlmIChzLT5taWRpLmljbnQgPCBjbnQpCisJCQljbnQgPSBzLT5taWRpLmljbnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPm1pZGkuaWJ1ZiArIHB0ciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESUlOQlVGOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5taWRpLmlyZCA9IHB0cjsKKwkJcy0+bWlkaS5pY250IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWJyZWFrOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkuaXdhaXQsICZ3YWl0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzb2xvMV9taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXQgPSAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcHRyID0gcy0+bWlkaS5vd3I7CisJCWNudCA9IE1JRElPVVRCVUYgLSBwdHI7CisJCWlmIChzLT5taWRpLm9jbnQgKyBjbnQgPiBNSURJT1VUQlVGKQorCQkJY250ID0gTUlESU9VVEJVRiAtIHMtPm1pZGkub2NudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzb2xvMV9oYW5kbGVfbWlkaShzKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+bWlkaS5vYnVmICsgcHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlwdHIgPSAocHRyICsgY250KSAlIE1JRElPVVRCVUY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPm1pZGkub3dyID0gcHRyOworCQlzLT5taWRpLm9jbnQgKz0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc29sbzFfaGFuZGxlX21pZGkocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc29sbzFfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX2ZsYWdzICYgRk1PREVfV1JJVEUpCisJCXBvbGxfd2FpdChmaWxlLCAmcy0+bWlkaS5vd2FpdCwgd2FpdCk7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9SRUFEKQorCQlwb2xsX3dhaXQoZmlsZSwgJnMtPm1pZGkuaXdhaXQsIHdhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5taWRpLmljbnQgPiAwKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChzLT5taWRpLm9jbnQgPCBNSURJT1VUQlVGKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IHNvbG8xX21pZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisKKwl3aGlsZSAoKHBjaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldikpICE9IE5VTEwpIHsKKwkJc3RydWN0IHBjaV9kcml2ZXIgKmRydnI7CisKKwkJZHJ2ciA9IHBjaV9kZXZfZHJpdmVyKHBjaV9kZXYpOworCQlpZiAoZHJ2ciAhPSAmc29sbzFfZHJpdmVyKQorCQkJY29udGludWU7CisJCXMgPSAoc3RydWN0IHNvbG8xX3N0YXRlKilwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJCWlmICghcykKKwkJCWNvbnRpbnVlOworCQlpZiAocy0+ZGV2X21pZGkgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT0RFVjsKKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+b3Blbl9tb2RlICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpKSkgeworCQlzLT5taWRpLmlyZCA9IHMtPm1pZGkuaXdyID0gcy0+bWlkaS5pY250ID0gMDsKKwkJcy0+bWlkaS5vcmQgPSBzLT5taWRpLm93ciA9IHMtPm1pZGkub2NudCA9IDA7CisJCW91dGIoMHhmZiwgcy0+bXB1YmFzZSsxKTsgLyogcmVzZXQgY29tbWFuZCAqLworCQlvdXRiKDB4M2YsIHMtPm1wdWJhc2UrMSk7IC8qIHVhcnQgY29tbWFuZCAqLworCQlpZiAoIShpbmIocy0+bXB1YmFzZSsxKSAmIDB4ODApKQorCQkJaW5iKHMtPm1wdWJhc2UpOworCQlzLT5taWRpLmlyZCA9IHMtPm1pZGkuaXdyID0gcy0+bWlkaS5pY250ID0gMDsKKwkJb3V0YigweGIwLCBzLT5pb2Jhc2UgKyA3KTsgLyogZW5hYmxlIEExLCBBMiwgTVBVIGlycSdzICovCisJCWluaXRfdGltZXIoJnMtPm1pZGkudGltZXIpOworCQlzLT5taWRpLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzKzE7CisJCXMtPm1pZGkudGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXM7CisJCXMtPm1pZGkudGltZXIuZnVuY3Rpb24gPSBzb2xvMV9taWRpX3RpbWVyOworCQlhZGRfdGltZXIoJnMtPm1pZGkudGltZXIpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5taWRpLmlyZCA9IHMtPm1pZGkuaXdyID0gcy0+bWlkaS5pY250ID0gMDsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXMtPm1pZGkub3JkID0gcy0+bWlkaS5vd3IgPSBzLT5taWRpLm9jbnQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+b3Blbl9tb2RlIHw9IChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgc29sbzFfbWlkaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc29sbzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjb3VudCwgdG1vOworCisJVkFMSURBVEVfU1RBVEUocyk7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCQlmb3IgKDs7KSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJY291bnQgPSBzLT5taWRpLm9jbnQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoY291bnQgPD0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlicmVhazsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlicmVhazsKKwkJCXRtbyA9IChjb3VudCAqIEhaKSAvIDMxMDA7CisJCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID8gOiAxKSAmJiB0bW8pCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xOiBtaWRpIHRpbWVkIG91dD8/XG4iKTsKKwkJfQorCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJcy0+b3Blbl9tb2RlICY9IH4oKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUR8Rk1PREVfTUlESV9XUklURSkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+b3Blbl9tb2RlICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpKSkgeworCQlvdXRiKDB4MzAsIHMtPmlvYmFzZSArIDcpOyAvKiBlbmFibGUgQTEsIEEyIGlycSdzICovCisJCWRlbF90aW1lcigmcy0+bWlkaS50aW1lcik7CQkKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzb2xvMV9taWRpX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHNvbG8xX21pZGlfcmVhZCwKKwkud3JpdGUJCT0gc29sbzFfbWlkaV93cml0ZSwKKwkucG9sbAkJPSBzb2xvMV9taWRpX3BvbGwsCisJLm9wZW4JCT0gc29sbzFfbWlkaV9vcGVuLAorCS5yZWxlYXNlCT0gc29sbzFfbWlkaV9yZWxlYXNlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc29sbzFfZG1mbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgb3Bfb2Zmc2V0WzE4XSA9IHsKKwkJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKKwkJMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwKKwkJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNQorCX07CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1fZm1fdm9pY2UgdjsKKwlzdHJ1Y3QgZG1fZm1fbm90ZSBuOworCXN0cnVjdCBkbV9mbV9wYXJhbXMgcDsKKwl1bnNpZ25lZCBpbnQgaW87CisJdW5zaWduZWQgaW50IHJlZ2I7CisKKwlzd2l0Y2ggKGNtZCkgewkJCisJY2FzZSBGTV9JT0NUTF9SRVNFVDoKKwkJZm9yIChyZWdiID0gMHhiMDsgcmVnYiA8IDB4Yjk7IHJlZ2IrKykgeworCQkJb3V0YihyZWdiLCBzLT5zYmJhc2UpOworCQkJb3V0YigwLCBzLT5zYmJhc2UrMSk7CisJCQlvdXRiKHJlZ2IsIHMtPnNiYmFzZSsyKTsKKwkJCW91dGIoMCwgcy0+c2JiYXNlKzMpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBGTV9JT0NUTF9QTEFZX05PVEU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YobikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChuLnZvaWNlID49IDE4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChuLnZvaWNlID49IDkpIHsKKwkJCXJlZ2IgPSBuLnZvaWNlIC0gOTsKKwkJCWlvID0gcy0+c2JiYXNlKzI7CisJCX0gZWxzZSB7CisJCQlyZWdiID0gbi52b2ljZTsKKwkJCWlvID0gcy0+c2JiYXNlOworCQl9CisJCW91dGIoMHhhMCArIHJlZ2IsIGlvKTsKKwkJb3V0YihuLmZudW0gJiAweGZmLCBpbysxKTsKKwkJb3V0YigweGIwICsgcmVnYiwgaW8pOworCQlvdXRiKCgobi5mbnVtID4+IDgpICYgMykgfCAoKG4ub2N0YXZlICYgNykgPDwgMikgfCAoKG4ua2V5X29uICYgMSkgPDwgNSksIGlvKzEpOworCQlyZXR1cm4gMDsKKworCWNhc2UgRk1fSU9DVExfU0VUX1ZPSUNFOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodi52b2ljZSA+PSAxOCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZWdiID0gb3Bfb2Zmc2V0W3Yudm9pY2VdOworCQlpbyA9IHMtPnNiYmFzZSArICgodi5vcCAmIDEpIDw8IDEpOworCQlvdXRiKDB4MjAgKyByZWdiLCBpbyk7CisJCW91dGIoKCh2LmFtICYgMSkgPDwgNykgfCAoKHYudmlicmF0byAmIDEpIDw8IDYpIHwgKCh2LmRvX3N1c3RhaW4gJiAxKSA8PCA1KSB8IAorCQkgICAgICgodi5rYmRfc2NhbGUgJiAxKSA8PCA0KSB8ICh2Lmhhcm1vbmljICYgMHhmKSwgaW8rMSk7CisJCW91dGIoMHg0MCArIHJlZ2IsIGlvKTsKKwkJb3V0YigoKHYuc2NhbGVfbGV2ZWwgJiAweDMpIDw8IDYpIHwgKHYudm9sdW1lICYgMHgzZiksIGlvKzEpOworCQlvdXRiKDB4NjAgKyByZWdiLCBpbyk7CisJCW91dGIoKCh2LmF0dGFjayAmIDB4ZikgPDwgNCkgfCAodi5kZWNheSAmIDB4ZiksIGlvKzEpOworCQlvdXRiKDB4ODAgKyByZWdiLCBpbyk7CisJCW91dGIoKCh2LnN1c3RhaW4gJiAweGYpIDw8IDQpIHwgKHYucmVsZWFzZSAmIDB4ZiksIGlvKzEpOworCQlvdXRiKDB4ZTAgKyByZWdiLCBpbyk7CisJCW91dGIodi53YXZlZm9ybSAmIDB4NywgaW8rMSk7CisJCWlmIChuLnZvaWNlID49IDkpIHsKKwkJCXJlZ2IgPSBuLnZvaWNlIC0gOTsKKwkJCWlvID0gcy0+c2JiYXNlKzI7CisJCX0gZWxzZSB7CisJCQlyZWdiID0gbi52b2ljZTsKKwkJCWlvID0gcy0+c2JiYXNlOworCQl9CisJCW91dGIoMHhjMCArIHJlZ2IsIGlvKTsKKwkJb3V0YigoKHYucmlnaHQgJiAxKSA8PCA1KSB8ICgodi5sZWZ0ICYgMSkgPDwgNCkgfCAoKHYuZmVlZGJhY2sgJiA3KSA8PCAxKSB8CisJCSAgICAgKHYuY29ubmVjdGlvbiAmIDEpLCBpbysxKTsKKwkJcmV0dXJuIDA7CisJCQorCWNhc2UgRk1fSU9DVExfU0VUX1BBUkFNUzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihwKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJb3V0YigweDA4LCBzLT5zYmJhc2UpOworCQlvdXRiKChwLmtiZF9zcGxpdCAmIDEpIDw8IDYsIHMtPnNiYmFzZSsxKTsKKwkJb3V0YigweGJkLCBzLT5zYmJhc2UpOworCQlvdXRiKCgocC5hbV9kZXB0aCAmIDEpIDw8IDcpIHwgKChwLnZpYl9kZXB0aCAmIDEpIDw8IDYpIHwgKChwLnJoeXRobSAmIDEpIDw8IDUpIHwgKChwLmJhc3MgJiAxKSA8PCA0KSB8CisJCSAgICAgKChwLnNuYXJlICYgMSkgPDwgMykgfCAoKHAudG9tdG9tICYgMSkgPDwgMikgfCAoKHAuY3ltYmFsICYgMSkgPDwgMSkgfCAocC5oaWhhdCAmIDEpLCBzLT5zYmJhc2UrMSk7CisJCXJldHVybiAwOworCisJY2FzZSBGTV9JT0NUTF9TRVRfT1BMOgorCQlvdXRiKDQsIHMtPnNiYmFzZSsyKTsKKwkJb3V0YihhcmcsIHMtPnNiYmFzZSszKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEZNX0lPQ1RMX1NFVF9NT0RFOgorCQlvdXRiKDUsIHMtPnNiYmFzZSsyKTsKKwkJb3V0YihhcmcgJiAxLCBzLT5zYmJhc2UrMyk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IHNvbG8xX2RtZm1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqcyA9IE5VTEw7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCisJd2hpbGUgKChwY2lfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXYpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBwY2lfZHJpdmVyICpkcnZyOworCisJCWRydnIgPSBwY2lfZGV2X2RyaXZlcihwY2lfZGV2KTsKKwkJaWYgKGRydnIgIT0gJnNvbG8xX2RyaXZlcikKKwkJCWNvbnRpbnVlOworCQlzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSopcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCQlpZiAoIXMpCisJCQljb250aW51ZTsKKwkJaWYgKHMtPmRldl9kbWZtID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorCWlmICghcykKKwkJcmV0dXJuIC1FTk9ERVY7CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBGTU9ERV9ETUZNKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPnNiYmFzZSwgRk1TWU5USF9FWFRFTlQsICJFU1MgU29sbzEiKSkgeworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlwcmludGsoS0VSTl9FUlIgInNvbG8xOiBGTSBzeW50aCBpbyBwb3J0cyBpbiB1c2UsIG9wbDMgbG9hZGVkP1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCS8qIGluaXQgdGhlIHN0dWZmICovCisJb3V0YigxLCBzLT5zYmJhc2UpOworCW91dGIoMHgyMCwgcy0+c2JiYXNlKzEpOyAvKiBlbmFibGUgd2F2ZWZvcm1zICovCisJb3V0Yig0LCBzLT5zYmJhc2UrMik7CisJb3V0YigwLCBzLT5zYmJhc2UrMyk7ICAvKiBubyA0b3AgZW5hYmxlZCAqLworCW91dGIoNSwgcy0+c2JiYXNlKzIpOworCW91dGIoMSwgcy0+c2JiYXNlKzMpOyAgLyogZW5hYmxlIE9QTDMgKi8KKwlzLT5vcGVuX21vZGUgfD0gRk1PREVfRE1GTTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzb2xvMV9kbWZtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVnYjsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJZG93bigmcy0+b3Blbl9zZW0pOworCXMtPm9wZW5fbW9kZSAmPSB+Rk1PREVfRE1GTTsKKwlmb3IgKHJlZ2IgPSAweGIwOyByZWdiIDwgMHhiOTsgcmVnYisrKSB7CisJCW91dGIocmVnYiwgcy0+c2JiYXNlKTsKKwkJb3V0YigwLCBzLT5zYmJhc2UrMSk7CisJCW91dGIocmVnYiwgcy0+c2JiYXNlKzIpOworCQlvdXRiKDAsIHMtPnNiYmFzZSszKTsKKwl9CisJcmVsZWFzZV9yZWdpb24ocy0+c2JiYXNlLCBGTVNZTlRIX0VYVEVOVCk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNvbG8xX2RtZm1fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IHNvbG8xX2RtZm1faW9jdGwsCisJLm9wZW4JCT0gc29sbzFfZG1mbV9vcGVuLAorCS5yZWxlYXNlCT0gc29sbzFfZG1mbV9yZWxlYXNlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaW5pdHZvbCB7CisJaW50IG1peGNoOworCWludCB2b2w7Cit9IGluaXR2b2xbXSBfX2RldmluaXRkYXRhID0geworCXsgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1BDTSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9TWU5USCwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9DRCwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX0xJTkUxLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX0xJTkUyLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1JFQ0xFViwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9TUEVBS0VSLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX01JQywgMHg0MDQwIH0KK307CisKK3N0YXRpYyBpbnQgc2V0dXBfc29sbzEoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBzLT5kZXY7CisJbW1fc2VnbWVudF90IGZzOworCWludCBpLCB2YWw7CisKKwkvKiBpbml0aWFsaXplIERETUEgYmFzZSBhZGRyZXNzICovCisJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xOiBkZG1hIGJhc2UgYWRkcmVzczogMHglbHhcbiIsIHMtPmRkbWFiYXNlKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpZGV2LCAweDYwLCAocy0+ZGRtYWJhc2UgJiAofjB4ZikpIHwgMSk7CisJLyogc2V0IERNQSBwb2xpY3kgdG8gRERNQSwgSVJRIGVtdWxhdGlvbiBvZmYgKENMS1JVTiBkaXNhYmxlZCBmb3Igbm93KSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCAweDUwLCAwKTsKKwkvKiBkaXNhYmxlIGxlZ2FjeSBhdWRpbyBhZGRyZXNzIGRlY29kZSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIDB4NDAsIDB4OTA3Zik7CisKKwkvKiBpbml0aWFsaXplIHRoZSBjaGlwcyAqLworCWlmICghcmVzZXRfY3RybChzKSkgeworCQlwcmludGsoS0VSTl9FUlIgImVzc3NvbG8xOiBjYW5ub3QgcmVzZXQgY29udHJvbGxlclxuIik7CisJCXJldHVybiAtMTsKKwl9CisJb3V0YigweGIwLCBzLT5pb2Jhc2UrNyk7IC8qIGVuYWJsZSBBMSwgQTIsIE1QVSBpcnEncyAqLworCQorCS8qIGluaXRpYWxpemUgbWl4ZXIgcmVncyAqLworCXdyaXRlX21peGVyKHMsIDB4N2YsIDApOyAvKiBkaXNhYmxlIG11c2ljIGRpZ2l0YWwgcmVjb3JkaW5nICovCisJd3JpdGVfbWl4ZXIocywgMHg3ZCwgMHgwYyk7IC8qIGVuYWJsZSBtaWMgcHJlYW1wLCBNT05PX09VVCBpcyAybmQgREFDIHJpZ2h0IGNoYW5uZWwgKi8KKwl3cml0ZV9taXhlcihzLCAweDY0LCAweDQ1KTsgLyogdm9sdW1lIGNvbnRyb2wgKi8KKwl3cml0ZV9taXhlcihzLCAweDQ4LCAweDEwKTsgLyogZW5hYmxlIG11c2ljIERBQy9FUzZ4eCBpbnRlcmZhY2UgKi8KKwl3cml0ZV9taXhlcihzLCAweDUwLCAwKTsgIC8qIGRpc2FibGUgc3BhdGlhbGl6ZXIgKi8KKwl3cml0ZV9taXhlcihzLCAweDUyLCAwKTsKKwl3cml0ZV9taXhlcihzLCAweDE0LCAwKTsgIC8qIERBQzEgbWluaW11bSB2b2x1bWUgKi8KKwl3cml0ZV9taXhlcihzLCAweDcxLCAweDIwKTsgLyogZW5hYmxlIG5ldyAweEExIHJlZyBmb3JtYXQgKi8KKwlvdXRiKDAsIHMtPmRkbWFiYXNlKzB4ZCk7IC8qIERNQSBtYXN0ZXIgY2xlYXIgKi8KKwlvdXRiKDEsIHMtPmRkbWFiYXNlKzB4Zik7IC8qIG1hc2sgY2hhbm5lbCAqLworCS8qb3V0YigwLCBzLT5kZG1hYmFzZSsweDgpOyovIC8qIGVuYWJsZSBjb250cm9sbGVyIChlbmFibGUgaXMgbG93IGFjdGl2ZSEhKSAqLworCisJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsgIC8qIGVuYWJsZSBidXMgbWFzdGVyaW5nICovCisJCisJZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwl2YWwgPSBTT1VORF9NQVNLX0xJTkU7CisJbWl4ZXJfaW9jdGwocywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGluaXR2b2wpL3NpemVvZihpbml0dm9sWzBdKTsgaSsrKSB7CisJCXZhbCA9IGluaXR2b2xbaV0udm9sOworCQltaXhlcl9pb2N0bChzLCBpbml0dm9sW2ldLm1peGNoLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwl9CisJdmFsID0gMTsgLyogZW5hYmxlIG1pYyBwcmVhbXAgKi8KKwltaXhlcl9pb2N0bChzLCBTT1VORF9NSVhFUl9QUklWQVRFMSwgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJc2V0X2ZzKGZzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc29sbzFfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKSB7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSopcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCWlmICghcykKKwkJcmV0dXJuIDE7CisJb3V0YigwLCBzLT5pb2Jhc2UrNik7CisJLyogRE1BIG1hc3RlciBjbGVhciAqLworCW91dGIoMCwgcy0+ZGRtYWJhc2UrMHhkKTsgCisJLyogcmVzZXQgc2VxdWVuY2VyIGFuZCBGSUZPICovCisJb3V0YigzLCBzLT5zYmJhc2UrNik7IAorCS8qIHR1cm4gb2ZmIERETUEgY29udHJvbGxlciBhZGRyZXNzIHNwYWNlICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHMtPmRldiwgMHg2MCwgMCk7IAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citzb2xvMV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpIHsKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlKilwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJaWYgKCFzKQorCQlyZXR1cm4gMTsKKwlzZXR1cF9zb2xvMShzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc29sbzFfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHNvbG8xX3N0YXRlICpzLCBpbnQgaW9fcG9ydCkKK3sKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCBHQU1FUE9SVF9FWFRFTlQsICJFU1MgU29sbzEiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvbG8xOiBnYW1lcG9ydCBpbyBwb3J0cyBhcmUgaW4gdXNlXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOworCWlmICghZ3ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb2xvMTogY2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oaW9fcG9ydCwgR0FNRVBPUlRfRVhURU5UKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJFU1MgU29sbzEgR2FtZXBvcnQiKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhncCwgImlzYSUwNHgvZ2FtZXBvcnQwIiwgaW9fcG9ydCk7CisJZ3AtPmRldi5wYXJlbnQgPSAmcy0+ZGV2LT5kZXY7CisJZ3AtPmlvID0gaW9fcG9ydDsKKworCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQoZ3ApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNvbG8xX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnM7CisJaW50IGdwaW87CisJaW50IHJldDsKKworIAlpZiAoKHJldD1wY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpZGV2LCAwKSAmIElPUkVTT1VSQ0VfSU8pIHx8CisJICAgICEocGNpX3Jlc291cmNlX2ZsYWdzKHBjaWRldiwgMSkgJiBJT1JFU09VUkNFX0lPKSB8fAorCSAgICAhKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDIpICYgSU9SRVNPVVJDRV9JTykgfHwKKwkgICAgIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpZGV2LCAzKSAmIElPUkVTT1VSQ0VfSU8pKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocGNpZGV2LT5pcnEgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBSZWNvcmRpbmcgcmVxdWlyZXMgMjQtYml0IERNQSwgc28gYXR0ZW1wdCB0byBzZXQgZG1hIG1hc2sKKwkgKiB0byAyNCBiaXRzIGZpcnN0LCB0aGVuIDMyIGJpdHMgKHBsYXliYWNrIG9ubHkpIGlmIHRoYXQgZmFpbHMuCisJICovCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCAweDAwZmZmZmZmKSAmJgorCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBjaWRldiwgMHhmZmZmZmZmZikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic29sbzE6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI0Yml0IG9yIDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCEocyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2xvMV9zdGF0ZSksIEdGUF9LRVJORUwpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzb2xvMTogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBzb2xvMV9zdGF0ZSkpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9hZGMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm1pZGkuaXdhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm1pZGkub3dhaXQpOworCWluaXRfTVVURVgoJnMtPm9wZW5fc2VtKTsKKwlzcGluX2xvY2tfaW5pdCgmcy0+bG9jayk7CisJcy0+bWFnaWMgPSBTT0xPMV9NQUdJQzsKKwlzLT5kZXYgPSBwY2lkZXY7CisJcy0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CisJcy0+c2JiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMSk7CisJcy0+dmNiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMik7CisJcy0+ZGRtYWJhc2UgPSBzLT52Y2Jhc2UgKyBERE1BQkFTRV9PRkZTRVQ7CisJcy0+bXB1YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDMpOworCWdwaW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCA0KTsKKwlzLT5pcnEgPSBwY2lkZXYtPmlycTsKKwlyZXQgPSAtRUJVU1k7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzLT5pb2Jhc2UsIElPQkFTRV9FWFRFTlQsICJFU1MgU29sbzEiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvbG8xOiBpbyBwb3J0cyBpbiB1c2VcbiIpOworCQlnb3RvIGVycl9yZWdpb24xOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPnNiYmFzZStGTVNZTlRIX0VYVEVOVCwgU0JCQVNFX0VYVEVOVC1GTVNZTlRIX0VYVEVOVCwgIkVTUyBTb2xvMSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29sbzE6IGlvIHBvcnRzIGluIHVzZVxuIik7CisJCWdvdG8gZXJyX3JlZ2lvbjI7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24ocy0+ZGRtYWJhc2UsIERETUFCQVNFX0VYVEVOVCwgIkVTUyBTb2xvMSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29sbzE6IGlvIHBvcnRzIGluIHVzZVxuIik7CisJCWdvdG8gZXJyX3JlZ2lvbjM7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24ocy0+bXB1YmFzZSwgTVBVQkFTRV9FWFRFTlQsICJFU1MgU29sbzEiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvbG8xOiBpbyBwb3J0cyBpbiB1c2VcbiIpOworCQlnb3RvIGVycl9yZWdpb240OworCX0KKwlpZiAoKHJldD1yZXF1ZXN0X2lycShzLT5pcnEsc29sbzFfaW50ZXJydXB0LFNBX1NISVJRLCJFU1MgU29sbzEiLHMpKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvbG8xOiBpcnEgJXUgaW4gdXNlXG4iLCBzLT5pcnEpOworCQlnb3RvIGVycl9pcnE7CisJfQorCS8qIHJlZ2lzdGVyIGRldmljZXMgKi8KKwlpZiAoKHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmc29sbzFfYXVkaW9fZm9wcywgLTEpKSA8IDApIHsKKwkJcmV0ID0gcy0+ZGV2X2F1ZGlvOworCQlnb3RvIGVycl9kZXYxOworCX0KKwlpZiAoKHMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZzb2xvMV9taXhlcl9mb3BzLCAtMSkpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfbWl4ZXI7CisJCWdvdG8gZXJyX2RldjI7CisJfQorCWlmICgocy0+ZGV2X21pZGkgPSByZWdpc3Rlcl9zb3VuZF9taWRpKCZzb2xvMV9taWRpX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXJldCA9IHMtPmRldl9taWRpOworCQlnb3RvIGVycl9kZXYzOworCX0KKwlpZiAoKHMtPmRldl9kbWZtID0gcmVnaXN0ZXJfc291bmRfc3BlY2lhbCgmc29sbzFfZG1mbV9mb3BzLCAxNSAvKiA/PyAqLykpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfZG1mbTsKKwkJZ290byBlcnJfZGV2NDsKKwl9CisJaWYgKHNldHVwX3NvbG8xKHMpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKwkvKiByZWdpc3RlciBnYW1lcG9ydCAqLworCXNvbG8xX3JlZ2lzdGVyX2dhbWVwb3J0KHMsIGdwaW8pOworCS8qIHN0b3JlIGl0IGluIHRoZSBkcml2ZXIgZmllbGQgKi8KKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBzKTsKKwlyZXR1cm4gMDsKKworIGVycjoKKwl1bnJlZ2lzdGVyX3NvdW5kX3NwZWNpYWwocy0+ZGV2X2RtZm0pOworIGVycl9kZXY0OgorCXVucmVnaXN0ZXJfc291bmRfbWlkaShzLT5kZXZfbWlkaSk7CisgZXJyX2RldjM6CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5kZXZfbWl4ZXIpOworIGVycl9kZXYyOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisgZXJyX2RldjE6CisJcHJpbnRrKEtFUk5fRVJSICJzb2xvMTogaW5pdGlhbGlzYXRpb24gZXJyb3JcbiIpOworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisgZXJyX2lycToKKwlyZWxlYXNlX3JlZ2lvbihzLT5tcHViYXNlLCBNUFVCQVNFX0VYVEVOVCk7CisgZXJyX3JlZ2lvbjQ6CisJcmVsZWFzZV9yZWdpb24ocy0+ZGRtYWJhc2UsIERETUFCQVNFX0VYVEVOVCk7CisgZXJyX3JlZ2lvbjM6CisJcmVsZWFzZV9yZWdpb24ocy0+c2JiYXNlK0ZNU1lOVEhfRVhURU5ULCBTQkJBU0VfRVhURU5ULUZNU1lOVEhfRVhURU5UKTsKKyBlcnJfcmVnaW9uMjoKKwlyZWxlYXNlX3JlZ2lvbihzLT5pb2Jhc2UsIElPQkFTRV9FWFRFTlQpOworIGVycl9yZWdpb24xOgorCWtmcmVlKHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzb2xvMV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwkKKwlpZiAoIXMpCisJCXJldHVybjsKKwkvKiBzdG9wIERNQSBjb250cm9sbGVyICovCisJb3V0YigwLCBzLT5pb2Jhc2UrNik7CisJb3V0YigwLCBzLT5kZG1hYmFzZSsweGQpOyAvKiBETUEgbWFzdGVyIGNsZWFyICovCisJb3V0YigzLCBzLT5zYmJhc2UrNik7IC8qIHJlc2V0IHNlcXVlbmNlciBhbmQgRklGTyAqLworCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCXBjaV93cml0ZV9jb25maWdfd29yZChzLT5kZXYsIDB4NjAsIDApOyAvKiB0dXJuIG9mZiBERE1BIGNvbnRyb2xsZXIgYWRkcmVzcyBzcGFjZSAqLworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisJaWYgKHMtPmdhbWVwb3J0KSB7CisJCWludCBncGlvID0gcy0+Z2FtZXBvcnQtPmlvOworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQocy0+Z2FtZXBvcnQpOworCQlyZWxlYXNlX3JlZ2lvbihncGlvLCBHQU1FUE9SVF9FWFRFTlQpOworCX0KKwlyZWxlYXNlX3JlZ2lvbihzLT5pb2Jhc2UsIElPQkFTRV9FWFRFTlQpOworCXJlbGVhc2VfcmVnaW9uKHMtPnNiYmFzZStGTVNZTlRIX0VYVEVOVCwgU0JCQVNFX0VYVEVOVC1GTVNZTlRIX0VYVEVOVCk7CisJcmVsZWFzZV9yZWdpb24ocy0+ZGRtYWJhc2UsIERETUFCQVNFX0VYVEVOVCk7CisJcmVsZWFzZV9yZWdpb24ocy0+bXB1YmFzZSwgTVBVQkFTRV9FWFRFTlQpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5kZXZfbWl4ZXIpOworCXVucmVnaXN0ZXJfc291bmRfbWlkaShzLT5kZXZfbWlkaSk7CisJdW5yZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKHMtPmRldl9kbWZtKTsKKwlrZnJlZShzKTsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0VTUywgUENJX0RFVklDRV9JRF9FU1NfU09MTzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzb2xvMV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIkVTUyBTb2xvMSIsCisJLmlkX3RhYmxlCT0gaWRfdGFibGUsCisJLnByb2JlCQk9IHNvbG8xX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc29sbzFfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IHNvbG8xX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzb2xvMV9yZXN1bWUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc29sbzEodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJzb2xvMTogdmVyc2lvbiB2MC4yMCB0aW1lICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzb2xvMV9kcml2ZXIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIE0uIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoLCBoYjlqbnhAaGI5dy5jaGUuZXUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRVNTIFNvbG8xIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3NvbG8xKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAic29sbzE6IHVubG9hZGluZ1xuIik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzb2xvMV9kcml2ZXIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworbW9kdWxlX2luaXQoaW5pdF9zb2xvMSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX3NvbG8xKTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2ZvcnRlLmMgYi9zb3VuZC9vc3MvZm9ydGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDA2YmM5MAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9mb3J0ZS5jCkBAIC0wLDAgKzEsMjEzNyBAQAorLyoKKyAqIGZvcnRlLmMgLSBGb3J0ZU1lZGlhIEZNODAxIE9TUyBEcml2ZXIKKyAqCisgKiBXcml0dGVuIGJ5IE1hcnRpbiBLLiBQZXRlcnNlbiA8bWtwQG1rcC5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwMyBNYXJ0aW4gSy4gUGV0ZXJzZW4KKyAqCisgKiBMYXRlc3QgdmVyc2lvbjogaHR0cDovL21rcC5uZXQvZm9ydGUvCisgKgorICogQmFzZWQgdXBvbiB0aGUgQUxTQSBGTTgwMSBkcml2ZXIgYnkgSmFyb3NsYXYgS3lzZWxhIGFuZCBPU1MgZHJpdmVycworICogYnkgVGhvbWFzIFNhaWxlciwgQWxhbiBDb3gsIFphY2ggQnJvd24sIGFuZCBKZWZmIEdhcnppay4gIFRoYW5rcworICogZ3V5cyEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKiBVU0EKKyAqCisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgRFJJVkVSX05BTUUJImZvcnRlIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAJIiRJZDogZm9ydGUuYyx2IDEuNjMgMjAwMy8wMy8wMSAwNTozMjo0MiBta3AgRXhwICQiCisjZGVmaW5lIFBGWCAJCURSSVZFUl9OQU1FICI6ICIKKworI3VuZGVmIE1fREVCVUcKKworI2lmZGVmIE1fREVCVUcKKyNkZWZpbmUgRFBSSU5USyhhcmdzLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIGFyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKGFyZ3MuLi4pCisjZW5kaWYKKworLyogQ2FyZCBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgRk9SVEVfQ0FQUyAgICAgICAgICAgICAgKERTUF9DQVBfTU1BUCB8IERTUF9DQVBfVFJJR0dFUikKKworLyogU3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMgKi8KKyNkZWZpbmUgRk9SVEVfRk1UUwkJKEFGTVRfVTggfCBBRk1UX1MxNl9MRSkKKworLyogQnVmZmVycyAqLworI2RlZmluZSBGT1JURV9NSU5fRlJBR19TSVpFICAgICAyNTYKKyNkZWZpbmUgRk9SVEVfTUFYX0ZSQUdfU0laRSAgICAgUEFHRV9TSVpFCisjZGVmaW5lIEZPUlRFX0RFRl9GUkFHX1NJWkUgICAgIDI1NgorI2RlZmluZSBGT1JURV9NSU5fRlJBR01FTlRTICAgICAyCisjZGVmaW5lIEZPUlRFX01BWF9GUkFHTUVOVFMgICAgIDI1NgorI2RlZmluZSBGT1JURV9ERUZfRlJBR01FTlRTICAgICAyCisjZGVmaW5lIEZPUlRFX01JTl9CVUZfTVNFQ1MgICAgIDUwMAorI2RlZmluZSBGT1JURV9NQVhfQlVGX01TRUNTICAgICAxMDAwCisKKy8qIFBDSSBCQVJzICovCisjZGVmaW5lIEZPUlRFX1BDTV9WT0wgICAgICAgICAgIDB4MDAgICAgLyogUENNIE91dHB1dCBWb2x1bWUgKi8KKyNkZWZpbmUgRk9SVEVfRk1fVk9MICAgICAgICAgICAgMHgwMiAgICAvKiBGTSBPdXRwdXQgVm9sdW1lICovCisjZGVmaW5lIEZPUlRFX0kyU19WT0wgICAgICAgICAgIDB4MDQgICAgLyogSTJTIFZvbHVtZSAqLworI2RlZmluZSBGT1JURV9SRUNfU1JDICAgICAgICAgICAweDA2ICAgIC8qIFJlY29yZCBTb3VyY2UgKi8KKyNkZWZpbmUgRk9SVEVfUExZX0NUUkwgICAgICAgICAgMHgwOCAgICAvKiBQbGF5YmFjayBDb250cm9sICovCisjZGVmaW5lIEZPUlRFX1BMWV9DT1VOVCAgICAgICAgIDB4MGEgICAgLyogUGxheWJhY2sgQ291bnQgKi8KKyNkZWZpbmUgRk9SVEVfUExZX0JVRjEgICAgICAgICAgMHgwYyAgICAvKiBQbGF5YmFjayBCdWZmZXIgSSAqLworI2RlZmluZSBGT1JURV9QTFlfQlVGMiAgICAgICAgICAweDEwICAgIC8qIFBsYXliYWNrIEJ1ZmZlciBJSSAqLworI2RlZmluZSBGT1JURV9DQVBfQ1RSTCAgICAgICAgICAweDE0ICAgIC8qIENhcHR1cmUgQ29udHJvbCAqLworI2RlZmluZSBGT1JURV9DQVBfQ09VTlQgICAgICAgICAweDE2ICAgIC8qIENhcHR1cmUgQ291bnQgKi8KKyNkZWZpbmUgRk9SVEVfQ0FQX0JVRjEgICAgICAgICAgMHgxOCAgICAvKiBDYXB0dXJlIEJ1ZmZlciBJICovCisjZGVmaW5lIEZPUlRFX0NBUF9CVUYyICAgICAgICAgIDB4MWMgICAgLyogQ2FwdHVyZSBCdWZmZXIgSUkgKi8KKyNkZWZpbmUgRk9SVEVfQ09ERUNfQ1RSTCAgICAgICAgMHgyMiAgICAvKiBDb2RlYyBDb250cm9sICovCisjZGVmaW5lIEZPUlRFX0kyU19NT0RFICAgICAgICAgIDB4MjQgICAgLyogSTJTIE1vZGUgQ29udHJvbCAqLworI2RlZmluZSBGT1JURV9WT0xVTUUgICAgICAgICAgICAweDI2ICAgIC8qIFZvbHVtZSBVcC9Eb3duL011dGUgU3RhdHVzICovCisjZGVmaW5lIEZPUlRFX0kyQ19DVFJMICAgICAgICAgIDB4MjkgICAgLyogSTJDIENvbnRyb2wgKi8KKyNkZWZpbmUgRk9SVEVfQUM5N19DTUQgICAgICAgICAgMHgyYSAgICAvKiBBQyc5NyBDb21tYW5kICovCisjZGVmaW5lIEZPUlRFX0FDOTdfREFUQSAgICAgICAgIDB4MmMgICAgLyogQUMnOTcgRGF0YSAqLworI2RlZmluZSBGT1JURV9NUFU0MDFfREFUQSAgICAgICAweDMwICAgIC8qIE1QVTQwMSBEYXRhICovCisjZGVmaW5lIEZPUlRFX01QVTQwMV9DTUQgICAgICAgIDB4MzEgICAgLyogTVBVNDAxIENvbW1hbmQgKi8KKyNkZWZpbmUgRk9SVEVfR1BJT19DVFJMICAgICAgICAgMHg1MiAgICAvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIENvbnRyb2wgKi8KKyNkZWZpbmUgRk9SVEVfR0VOX0NUUkwgICAgICAgICAgMHg1NCAgICAvKiBHZW5lcmFsIENvbnRyb2wgKi8KKyNkZWZpbmUgRk9SVEVfSVJRX01BU0sgICAgICAgICAgMHg1NiAgICAvKiBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBGT1JURV9JUlFfU1RBVFVTICAgICAgICAweDVhICAgIC8qIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgRk9SVEVfT1BMM19CQU5LMCAgICAgICAgMHg2OCAgICAvKiBPUEwzIFN0YXR1cyBSZWFkIC8gQmFuayAwIFdyaXRlICovCisjZGVmaW5lIEZPUlRFX09QTDNfREFUQTAgICAgICAgIDB4NjkgICAgLyogT1BMMyBEYXRhIDAgV3JpdGUgKi8KKyNkZWZpbmUgRk9SVEVfT1BMM19CQU5LMSAgICAgICAgMHg2YSAgICAvKiBPUEwzIEJhbmsgMSBXcml0ZSAqLworI2RlZmluZSBGT1JURV9PUEwzX0RBVEExICAgICAgICAweDZiICAgIC8qIE9QTDMgQmFuayAxIFdyaXRlICovCisjZGVmaW5lIEZPUlRFX1BPV0VSRE9XTiAgICAgICAgIDB4NzAgICAgLyogQmxvY2tzIFBvd2VyIERvd24gQ29udHJvbCAqLworCisjZGVmaW5lIEZPUlRFX0NBUF9PRkZTRVQgICAgICAgIEZPUlRFX0NBUF9DVFJMIC0gRk9SVEVfUExZX0NUUkwKKworI2RlZmluZSBGT1JURV9BQzk3X0FERFJfU0hJRlQgICAxMAorCisvKiBQbGF5YmFjayBhbmQgcmVjb3JkIGNvbnRyb2wgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBGT1JURV9CVUYxX0xBU1QgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgRk9SVEVfQlVGMl9MQVNUICAgICAgICAgKDE8PDIpCisjZGVmaW5lIEZPUlRFX1NUQVJUICAgICAgICAgICAgICgxPDw1KQorI2RlZmluZSBGT1JURV9QQVVTRSAgICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgRk9SVEVfSU1NRURfU1RPUCAgICAgICAgKDE8PDcpCisjZGVmaW5lIEZPUlRFX1JBVEVfU0hJRlQgICAgICAgIDgKKyNkZWZpbmUgRk9SVEVfUkFURV9NQVNLICAgICAgICAgKDE1IDw8IEZPUlRFX1JBVEVfU0hJRlQpCisjZGVmaW5lIEZPUlRFX0NIQU5ORUxTXzQgICAgICAgICgxPDwxMikgLyogUGxheWJhY2sgb25seSAqLworI2RlZmluZSBGT1JURV9DSEFOTkVMU182ICAgICAgICAoMjw8MTIpIC8qIFBsYXliYWNrIG9ubHkgKi8KKyNkZWZpbmUgRk9SVEVfQ0hBTk5FTFNfNk1TICAgICAgKDM8PDEyKSAvKiBQbGF5YmFjayBvbmx5ICovCisjZGVmaW5lIEZPUlRFX0NIQU5ORUxTX01BU0sgICAgICgzPDwxMikKKyNkZWZpbmUgRk9SVEVfMTZCSVQgICAgICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBGT1JURV9TVEVSRU8gICAgICAgICAgICAoMTw8MTUpCisKKy8qIElSUSBzdGF0dXMgYml0cyAqLworI2RlZmluZSBGT1JURV9JUlFfUExBWUJBQ0sgICAgICAoMTw8OCkKKyNkZWZpbmUgRk9SVEVfSVJRX0NBUFRVUkUgICAgICAgKDE8PDkpCisjZGVmaW5lIEZPUlRFX0lSUV9WT0xVTUUgICAgICAgICgxPDwxNCkKKyNkZWZpbmUgRk9SVEVfSVJRX01QVSAgICAgICAgICAgKDE8PDE1KQorCisvKiBDT0RFQyBjb250cm9sICovCisjZGVmaW5lIEZPUlRFX0NDX0NPREVDX1JFU0VUICAgICgxPDw1KQorI2RlZmluZSBGT1JURV9DQ19BQzk3X1JFU0VUICAgICAoMTw8NikKKworLyogQUM5NyBjbWQgKi8KKyNkZWZpbmUgRk9SVEVfQUM5N19XUklURSAgICAgICAgKDA8PDcpCisjZGVmaW5lIEZPUlRFX0FDOTdfUkVBRCAgICAgICAgICgxPDw3KQorI2RlZmluZSBGT1JURV9BQzk3X0RQX0lOVkFMSUQgICAoMDw8OCkKKyNkZWZpbmUgRk9SVEVfQUM5N19EUF9WQUxJRCAgICAgKDE8PDgpCisjZGVmaW5lIEZPUlRFX0FDOTdfUE9SVF9SRFkgICAgICgwPDw5KQorI2RlZmluZSBGT1JURV9BQzk3X1BPUlRfQlNZICAgICAoMTw8OSkKKworCitzdHJ1Y3QgZm9ydGVfY2hhbm5lbCB7CisgICAgICAgIGNvbnN0IGNoYXIgCQkqbmFtZTsKKworCXVuc2lnbmVkIHNob3J0CQljdHJsOyAJCS8qIEN0cmwgQkFSIGNvbnRlbnRzICovCisJdW5zaWduZWQgbG9uZyAJCWlvYmFzZTsJCS8qIEN0cmwgQkFSIGFkZHJlc3MgKi8KKworCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CisKKwl2b2lkIAkJCSpidWY7IAkJLyogQnVmZmVyICovCisJZG1hX2FkZHJfdAkJYnVmX2hhbmRsZTsgCS8qIEJ1ZmZlciBoYW5kbGUgKi8KKworICAgICAgICB1bnNpZ25lZCBpbnQgCQlyZWNvcmQ7CisJdW5zaWduZWQgaW50CQlmb3JtYXQ7CisgICAgICAgIHVuc2lnbmVkIGludAkJcmF0ZTsKKwl1bnNpZ25lZCBpbnQJCXN0ZXJlbzsKKworCXVuc2lnbmVkIGludAkJZnJhZ19zejsgCS8qIEN1cnJlbnQgZnJhZ21lbnQgc2l6ZSAqLworCXVuc2lnbmVkIGludAkJZnJhZ19udW07IAkvKiBDdXJyZW50ICMgb2YgZnJhZ21lbnRzICovCisJdW5zaWduZWQgaW50CQlmcmFnX21zZWNzOyAgICAgLyogTWlsbGlzZWNvbmRzIHBlciBmcmFnICovCisJdW5zaWduZWQgaW50CQlidWZfc3o7CQkvKiBDdXJyZW50IGJ1ZmZlciBzaXplICovCisKKwl1bnNpZ25lZCBpbnQJCWh3cHRyOwkJLyogVGFpbCAqLworCXVuc2lnbmVkIGludAkJc3dwdHI7IAkJLyogSGVhZCAqLworCXVuc2lnbmVkIGludAkJZmlsbGVkX2ZyYWdzOyAJLyogRnJhZ21lbnRzIGN1cnJlbnRseSBmdWxsICovCisJdW5zaWduZWQgaW50CQluZXh0X2J1ZjsJLyogSW5kZXggb2YgbmV4dCBidWZmZXIgKi8KKworCXVuc2lnbmVkIGludAkJYWN0aXZlOwkJLyogQ2hhbm5lbCBjdXJyZW50bHkgaW4gdXNlICovCisJdW5zaWduZWQgaW50CQltYXBwZWQ7CQkvKiBtbWFwICovCisKKwl1bnNpZ25lZCBpbnQJCWJ1Zl9wYWdlczsJLyogUmVhbCBzaXplIG9mIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludAkJbnJfaXJxczsJLyogTnVtYmVyIG9mIGludGVycnVwdHMgKi8KKwl1bnNpZ25lZCBpbnQJCWJ5dGVzOwkJLyogVG90YWwgYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQJCXJlc2lkdWU7CS8qIFBhcnRpYWwgZnJhZ21lbnQgKi8KK307CisKKworc3RydWN0IGZvcnRlX2NoaXAgeworCXN0cnVjdCBwY2lfZGV2CQkqcGNpX2RldjsKKwl1bnNpZ25lZCBsb25nCQlpb2Jhc2U7CisJaW50CQkJaXJxOworCisJc3RydWN0IHNlbWFwaG9yZQlvcGVuX3NlbTsgCS8qIERldmljZSBhY2Nlc3MgKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogU3RhdGUgKi8KKworCXNwaW5sb2NrX3QJCWFjOTdfbG9jazsKKwlzdHJ1Y3QgYWM5N19jb2RlYwkqYWM5NzsKKworCWludAkJCW11bHRpY2hhbm5lbDsKKwlpbnQJCQlkc3A7IAkJLyogT1NTIGhhbmRsZSAqLworCWludCAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXI7CS8qIG1tYXAgSS9PIHRyaWdnZXIgKi8KKworCXN0cnVjdCBmb3J0ZV9jaGFubmVsCXBsYXk7CisJc3RydWN0IGZvcnRlX2NoYW5uZWwJcmVjOworfTsKKworCitzdGF0aWMgaW50IGNoYW5uZWxzW10gPSB7IDIsIDQsIDYsIH07CitzdGF0aWMgaW50IHJhdGVzW10gICAgPSB7IDU1MDAsIDgwMDAsIDk2MDAsIDExMDI1LCAxNjAwMCwgMTkyMDAsIAorCQkJICAyMjA1MCwgMzIwMDAsIDM4NDAwLCA0NDEwMCwgNDgwMDAsIH07CisKK3N0YXRpYyBzdHJ1Y3QgZm9ydGVfY2hpcCAqZm9ydGU7CitzdGF0aWMgaW50IGZvdW5kOworCisKKy8qIEFDOTcgQ29kZWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiogCisgKiBmb3J0ZV9hYzk3X3dhaXQ6CisgKiBAY2hpcDoJZm04MDEgaW5zdGFuY2Ugd2hvc2UgQUM5NyBjb2RlYyB0byB3YWl0IG9uCisgKgorICogRklYTUU6CisgKgkJU3RvcCBidXN5LXdhaXRpbmcKKyAqLworCitzdGF0aWMgaW5saW5lIGludAorZm9ydGVfYWM5N193YWl0IChzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcCkKK3sKKwlpbnQgaSA9IDEwMDAwOworCisJd2hpbGUgKCAoaW53IChjaGlwLT5pb2Jhc2UgKyBGT1JURV9BQzk3X0NNRCkgJiBGT1JURV9BQzk3X1BPUlRfQlNZKSAKKwkJJiYgaS0tICkKKwkJY3B1X3JlbGF4KCk7CisKKwlyZXR1cm4gaSA9PSAwOworfQorCisKKy8qKgorICogZm9ydGVfYWM5N19yZWFkOgorICogQGNvZGVjOglBQzk3IGNvZGVjIHRvIHJlYWQgZnJvbQorICogQHJlZzoJcmVnaXN0ZXIgdG8gcmVhZAorICovCisKK3N0YXRpYyB1MTYKK2ZvcnRlX2FjOTdfcmVhZCAoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpCit7CisJdTE2IHJldCA9IDA7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXAgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCisJc3Bpbl9sb2NrICgmY2hpcC0+YWM5N19sb2NrKTsKKworCS8qIEtub2NrLCBrbm9jayAqLworCWlmIChmb3J0ZV9hYzk3X3dhaXQgKGNoaXApKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJhYzk3X3JlYWQ6IFNlcmlhbCBidXMgYnVzeVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNlbmQgcmVhZCBjb21tYW5kICovCisJb3V0dyAocmVnIHwgKDE8PDcpLCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9BQzk3X0NNRCk7CisKKwlpZiAoZm9ydGVfYWM5N193YWl0IChjaGlwKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiYWM5N19yZWFkOiBCdXMgYnVzeSByZWFkaW5nIHJlZyAweCV4XG4iLAorCQkJcmVnKTsKKwkJZ290byBvdXQ7CisJfQorCQorCS8qIFNhbml0eSBjaGVja2luZyAqLworCWlmIChpbncgKGNoaXAtPmlvYmFzZSArIEZPUlRFX0FDOTdfQ01EKSAmIEZPUlRFX0FDOTdfRFBfSU5WQUxJRCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiYWM5N19yZWFkOiBJbnZhbGlkIGRhdGEgcG9ydCIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBGZXRjaCByZXN1bHQgKi8KKwlyZXQgPSBpbncgKGNoaXAtPmlvYmFzZSArIEZPUlRFX0FDOTdfREFUQSk7CisKKyBvdXQ6CisJc3Bpbl91bmxvY2sgKCZjaGlwLT5hYzk3X2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiBmb3J0ZV9hYzk3X3dyaXRlOgorICogQGNvZGVjOglBQzk3IGNvZGVjIHRvIHNlbmQgY29tbWFuZCB0bworICogQHJlZzoJcmVnaXN0ZXIgdG8gd3JpdGUKKyAqIEB2YWw6CXZhbHVlIHRvIHdyaXRlCisgKi8KKworc3RhdGljIHZvaWQKK2ZvcnRlX2FjOTdfd3JpdGUgKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsKQoreworCXN0cnVjdCBmb3J0ZV9jaGlwICpjaGlwID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKworCXNwaW5fbG9jayAoJmNoaXAtPmFjOTdfbG9jayk7CisKKwkvKiBLbm9jaywga25vY2sgKi8KKwlpZiAoZm9ydGVfYWM5N193YWl0IChjaGlwKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiYWM5N193cml0ZTogU2VyaWFsIGJ1cyBidXN5XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJb3V0dyAodmFsLCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9BQzk3X0RBVEEpOworCW91dGIgKHJlZyB8IEZPUlRFX0FDOTdfV1JJVEUsIGNoaXAtPmlvYmFzZSArIEZPUlRFX0FDOTdfQ01EKTsKKworCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwlpZiAoZm9ydGVfYWM5N193YWl0IChjaGlwKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiYWM5N193cml0ZTogQnVzIGJ1c3kgYWZ0ZXIgd3JpdGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKyBvdXQ6CisJc3Bpbl91bmxvY2sgKCZjaGlwLT5hYzk3X2xvY2spOworfQorCisKKy8qIE1peGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKioKKyAqIGZvcnRlX21peGVyX29wZW46CisgKiBAaW5vZGU6CQkKKyAqIEBmaWxlOgkJCisgKi8KKworc3RhdGljIGludAorZm9ydGVfbWl4ZXJfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXAgPSBmb3J0ZTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBjaGlwLT5hYzk3OworCXJldHVybiAwOworfQorCisKKy8qKgorICogZm9ydGVfbWl4ZXJfcmVsZWFzZToKKyAqIEBpbm9kZToJCQorICogQGZpbGU6CQkKKyAqLworCitzdGF0aWMgaW50Citmb3J0ZV9taXhlcl9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiBXZSB3aWxsIHdlbGVhc2UgV29kZXdpY2sgKi8KKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIGZvcnRlX21peGVyX2lvY3RsOgorICogQGlub2RlOgkJCisgKiBAZmlsZToJCQorICovCisKK3N0YXRpYyBpbnQKK2ZvcnRlX21peGVyX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IChzdHJ1Y3QgYWM5N19jb2RlYyAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsIChjb2RlYywgY21kLCBhcmcpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcnRlX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrICAgICAgICAgCT0gbm9fbGxzZWVrLAorCS5pb2N0bCAgICAgICAgICAJPSBmb3J0ZV9taXhlcl9pb2N0bCwKKwkub3BlbiAgICAgICAgICAgCT0gZm9ydGVfbWl4ZXJfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgCT0gZm9ydGVfbWl4ZXJfcmVsZWFzZSwKK307CisKKworLyogQ2hhbm5lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiogCisgKiBmb3J0ZV9jaGFubmVsX3Jlc2V0OgorICogQGNoYW5uZWw6CUNoYW5uZWwgdG8gcmVzZXQKKyAqIAorICogTG9ja2luZzoJTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQKK2ZvcnRlX2NoYW5uZWxfcmVzZXQgKHN0cnVjdCBmb3J0ZV9jaGFubmVsICpjaGFubmVsKQoreworCWlmICghY2hhbm5lbCB8fCAhY2hhbm5lbC0+aW9iYXNlKQorCQlyZXR1cm47CisKKwlEUFJJTlRLICgiJXM6IGNoYW5uZWwgPSAlc1xuIiwgX19GVU5DVElPTl9fLCBjaGFubmVsLT5uYW1lKTsKKworCWNoYW5uZWwtPmN0cmwgJj0gfkZPUlRFX1NUQVJUOworCW91dHcgKGNoYW5uZWwtPmN0cmwsIGNoYW5uZWwtPmlvYmFzZSArIEZPUlRFX1BMWV9DVFJMKTsKKwkKKwkvKiBXZSBhbHdheXMgcGxheSBhdCBsZWFzdCB0d28gZnJhZ21lbnRzLCBoZW5jZSB0aGVzZSBkZWZhdWx0cyAqLworIAljaGFubmVsLT5od3B0ciA9IGNoYW5uZWwtPmZyYWdfc3o7CisJY2hhbm5lbC0+bmV4dF9idWYgPSAxOworCWNoYW5uZWwtPnN3cHRyID0gMDsKKwljaGFubmVsLT5maWxsZWRfZnJhZ3MgPSAwOworCWNoYW5uZWwtPmFjdGl2ZSA9IDA7CisJY2hhbm5lbC0+Ynl0ZXMgPSAwOworCWNoYW5uZWwtPm5yX2lycXMgPSAwOworCWNoYW5uZWwtPm1hcHBlZCA9IDA7CisJY2hhbm5lbC0+cmVzaWR1ZSA9IDA7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9zdGFydDoKKyAqIEBjaGFubmVsOiAJQ2hhbm5lbCB0byBzdGFydCAocmVjb3JkL3BsYXliYWNrKQorICoKKyAqIExvY2tpbmc6CU11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIGlubGluZQorZm9ydGVfY2hhbm5lbF9zdGFydCAoc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLT5pb2Jhc2UgfHwgY2hhbm5lbC0+YWN0aXZlKSAKKwkJcmV0dXJuOworCisJY2hhbm5lbC0+Y3RybCAmPSB+KEZPUlRFX1BBVVNFIHwgRk9SVEVfQlVGMV9MQVNUIHwgRk9SVEVfQlVGMl9MQVNUCisJCQkgICB8IEZPUlRFX0lNTUVEX1NUT1ApOworCWNoYW5uZWwtPmN0cmwgfD0gRk9SVEVfU1RBUlQ7CisJY2hhbm5lbC0+YWN0aXZlID0gMTsKKwlvdXR3IChjaGFubmVsLT5jdHJsLCBjaGFubmVsLT5pb2Jhc2UgKyBGT1JURV9QTFlfQ1RSTCk7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9zdG9wOgorICogQGNoYW5uZWw6IAlDaGFubmVsIHRvIHN0b3AKKyAqCisgKiBMb2NraW5nOglNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCBpbmxpbmUKK2ZvcnRlX2NoYW5uZWxfc3RvcCAoc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLT5pb2Jhc2UpIAorCQlyZXR1cm47CisKKwljaGFubmVsLT5jdHJsICY9IH4oRk9SVEVfU1RBUlQgfCBGT1JURV9QQVVTRSk7CQorCWNoYW5uZWwtPmN0cmwgfD0gRk9SVEVfSU1NRURfU1RPUDsKKworCWNoYW5uZWwtPmFjdGl2ZSA9IDA7CisJb3V0dyAoY2hhbm5lbC0+Y3RybCwgY2hhbm5lbC0+aW9iYXNlICsgRk9SVEVfUExZX0NUUkwpOworfQorCisKKy8qKiAKKyAqIGZvcnRlX2NoYW5uZWxfcGF1c2U6CisgKiBAY2hhbm5lbDogCUNoYW5uZWwgdG8gcGF1c2UKKyAqCisgKiBMb2NraW5nOglNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCBpbmxpbmUKK2ZvcnRlX2NoYW5uZWxfcGF1c2UgKHN0cnVjdCBmb3J0ZV9jaGFubmVsICpjaGFubmVsKQoreworCWlmICghY2hhbm5lbCB8fCAhY2hhbm5lbC0+aW9iYXNlKSAKKwkJcmV0dXJuOworCisJY2hhbm5lbC0+Y3RybCB8PSBGT1JURV9QQVVTRTsKKworCWNoYW5uZWwtPmFjdGl2ZSA9IDA7CisJb3V0dyAoY2hhbm5lbC0+Y3RybCwgY2hhbm5lbC0+aW9iYXNlICsgRk9SVEVfUExZX0NUUkwpOworfQorCisKKy8qKiAKKyAqIGZvcnRlX2NoYW5uZWxfcmF0ZToKKyAqIEBjaGFubmVsOiAJQ2hhbm5lbCB3aG9zZSByYXRlIHRvIHNldC4gIFBsYXliYWNrIGFuZCByZWNvcmQgYXJlCisgKiAgICAgICAgICAgCWluZGVwZW5kZW50LgorICogQHJhdGU6ICAgIAlDaGFubmVsIHJhdGUgaW4gSHoKKyAqCisgKiBMb2NraW5nOglNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgaW50Citmb3J0ZV9jaGFubmVsX3JhdGUgKHN0cnVjdCBmb3J0ZV9jaGFubmVsICpjaGFubmVsLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwlpbnQgbmV3X3JhdGU7CisKKwlpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwtPmlvYmFzZSkgCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhlIEZNODAxIG9ubHkgc3VwcG9ydHMgYSBoYW5kZnVsIG9mIGZpeGVkIGZyZXF1ZW5jaWVzLgorCSAqIFdlIGZpbmQgdGhlIHZhbHVlIGNsb3Nlc3QgdG8gd2hhdCB1c2VybGFuZCByZXF1ZXN0ZWQuCisJICovCisJaWYgICAgICAocmF0ZSA8PSA2MjUwKSAgeyByYXRlID0gNTUwMDsgIG5ld19yYXRlID0gIDA7IH0KKwllbHNlIGlmIChyYXRlIDw9IDg4MDApICB7IHJhdGUgPSA4MDAwOyAgbmV3X3JhdGUgPSAgMTsgfQorCWVsc2UgaWYgKHJhdGUgPD0gMTAzMTIpIHsgcmF0ZSA9IDk2MDA7ICBuZXdfcmF0ZSA9ICAyOyB9CisJZWxzZSBpZiAocmF0ZSA8PSAxMzUxMikgeyByYXRlID0gMTEwMjU7IG5ld19yYXRlID0gIDM7IH0KKwllbHNlIGlmIChyYXRlIDw9IDE3NjAwKSB7IHJhdGUgPSAxNjAwMDsgbmV3X3JhdGUgPSAgNDsgfQorCWVsc2UgaWYgKHJhdGUgPD0gMjA2MjUpIHsgcmF0ZSA9IDE5MjAwOyBuZXdfcmF0ZSA9ICA1OyB9CisJZWxzZSBpZiAocmF0ZSA8PSAyNzAyNSkgeyByYXRlID0gMjIwNTA7IG5ld19yYXRlID0gIDY7IH0KKwllbHNlIGlmIChyYXRlIDw9IDM1MjAwKSB7IHJhdGUgPSAzMjAwMDsgbmV3X3JhdGUgPSAgNzsgfQorCWVsc2UgaWYgKHJhdGUgPD0gNDEyNTApIHsgcmF0ZSA9IDM4NDAwOyBuZXdfcmF0ZSA9ICA4OyB9CisJZWxzZSBpZiAocmF0ZSA8PSA0NjA1MCkgeyByYXRlID0gNDQxMDA7IG5ld19yYXRlID0gIDk7IH0KKwllbHNlICAgICAgICAgICAgICAgICAgICB7IHJhdGUgPSA0ODAwMDsgbmV3X3JhdGUgPSAxMDsgfQorCisJY2hhbm5lbC0+Y3RybCAmPSB+Rk9SVEVfUkFURV9NQVNLOworCWNoYW5uZWwtPmN0cmwgfD0gbmV3X3JhdGUgPDwgRk9SVEVfUkFURV9TSElGVDsKKwljaGFubmVsLT5yYXRlID0gcmF0ZTsKKworCURQUklOVEsgKCIlczogJXMgcmF0ZSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGNoYW5uZWwtPm5hbWUsIHJhdGUpOworCisJcmV0dXJuIHJhdGU7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9mb3JtYXQ6CisgKiBAY2hhbm5lbDogCUNoYW5uZWwgd2hvc2UgYXVkaW8gZm9ybWF0IHRvIHNldAorICogQGZvcm1hdDogIAlPU1MgZm9ybWF0IElECisgKgorICogTG9ja2luZzoJTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIGludAorZm9ydGVfY2hhbm5lbF9mb3JtYXQgKHN0cnVjdCBmb3J0ZV9jaGFubmVsICpjaGFubmVsLCBpbnQgZm9ybWF0KQoreworCWlmICghY2hhbm5lbCB8fCAhY2hhbm5lbC0+aW9iYXNlKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGZvcm1hdCkgeworCisJY2FzZSBBRk1UX1FVRVJZOgorCQlicmVhazsKKwkKKwljYXNlIEFGTVRfVTg6CisJCWNoYW5uZWwtPmN0cmwgJj0gfkZPUlRFXzE2QklUOworCQljaGFubmVsLT5mb3JtYXQgPSBBRk1UX1U4OworCQlicmVhazsKKworCWNhc2UgQUZNVF9TMTZfTEU6CisJZGVmYXVsdDoKKwkJY2hhbm5lbC0+Y3RybCB8PSBGT1JURV8xNkJJVDsKKwkJY2hhbm5lbC0+Zm9ybWF0ID0gQUZNVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKworCURQUklOVEsgKCIlczogJXMgd2FudCAlZCBmb3JtYXQsIGdvdCAlZFxuIiwgX19GVU5DVElPTl9fLCBjaGFubmVsLT5uYW1lLCAKKwkJIGZvcm1hdCwgY2hhbm5lbC0+Zm9ybWF0KTsKKworCXJldHVybiBjaGFubmVsLT5mb3JtYXQ7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9zdGVyZW86CisgKiBAY2hhbm5lbDogCUNoYW5uZWwgdG8gdG9nZ2xlCisgKiBAc3RlcmVvOiAgCTAgZm9yIE1vbm8sIDEgZm9yIFN0ZXJlbworICoKKyAqIExvY2tpbmc6CU11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyBpbnQKK2ZvcnRlX2NoYW5uZWxfc3RlcmVvIChzdHJ1Y3QgZm9ydGVfY2hhbm5lbCAqY2hhbm5lbCwgdW5zaWduZWQgaW50IHN0ZXJlbykKK3sKKwlpbnQgcmV0OworCisJaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLT5pb2Jhc2UpCisJCXJldHVybiAtRUlOVkFMOworCisJRFBSSU5USyAoIiVzOiAlcyBzdGVyZW8gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBjaGFubmVsLT5uYW1lLCBzdGVyZW8pOworCisJc3dpdGNoIChzdGVyZW8pIHsKKworCWNhc2UgMDoKKwkJY2hhbm5lbC0+Y3RybCAmPSB+KEZPUlRFX1NURVJFTyB8IEZPUlRFX0NIQU5ORUxTX01BU0spOworCQljaGFubmVsLT4gc3RlcmVvID0gc3RlcmVvOworCQlyZXQgPSBzdGVyZW87CisJCWJyZWFrOworCisJY2FzZSAxOgorCQljaGFubmVsLT5jdHJsICY9IH5GT1JURV9DSEFOTkVMU19NQVNLOworCQljaGFubmVsLT5jdHJsIHw9IEZPUlRFX1NURVJFTzsKKwkJY2hhbm5lbC0+IHN0ZXJlbyA9IHN0ZXJlbzsKKwkJcmV0ID0gc3RlcmVvOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURQUklOVEsgKCJVbnN1cHBvcnRlZCBjaGFubmVsIGZvcm1hdCIpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKiAKKyAqIGZvcnRlX2NoYW5uZWxfYnVmZmVyOgorICogQGNoYW5uZWw6CUNoYW5uZWwgd2hvc2UgYnVmZmVyIHRvIHNldCB1cAorICoKKyAqIExvY2tpbmc6CU11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkCitmb3J0ZV9jaGFubmVsX2J1ZmZlciAoc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwsIGludCBzeiwgaW50IG51bSkKK3sKKwl1bnNpZ25lZCBpbnQgbXNlY3MsIHNoaWZ0OworCisJLyogR28gYXdheSwgSSdtIGJ1c3kgKi8KKwlpZiAoY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzIHx8IGNoYW5uZWwtPmJ5dGVzKQorCQlyZXR1cm47CisKKwkvKiBGcmFnbWVudCBzaXplIG11c3QgYmUgYSBwb3dlciBvZiAyICovCisJc2hpZnQgPSAwOyBzeisrOworCXdoaWxlIChzeiA+Pj0gMSkKKwkJc2hpZnQrKzsKKwljaGFubmVsLT5mcmFnX3N6ID0gMSA8PCBzaGlmdDsKKworCS8qIFJvdW5kIGZyYWdtZW50IHNpemUgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUgKi8KKwlpZiAoY2hhbm5lbC0+ZnJhZ19zeiA8IEZPUlRFX01JTl9GUkFHX1NJWkUpCisJCWNoYW5uZWwtPmZyYWdfc3ogPSBGT1JURV9NSU5fRlJBR19TSVpFOworCisJaWYgKGNoYW5uZWwtPmZyYWdfc3ogPiBGT1JURV9NQVhfRlJBR19TSVpFKQorCQljaGFubmVsLT5mcmFnX3N6ID0gRk9SVEVfTUFYX0ZSQUdfU0laRTsKKworCS8qIEZpbmQgZnJhZ21lbnQgbGVuZ3RoIGluIG1pbGxpc2Vjb25kcyAqLworCW1zZWNzID0gY2hhbm5lbC0+ZnJhZ19zeiAvCisJCShjaGFubmVsLT5mb3JtYXQgPT0gQUZNVF9TMTZfTEUgPyAyIDogMSkgLworCQkoY2hhbm5lbC0+c3RlcmVvID8gMiA6IDEpIC8KKwkJKGNoYW5uZWwtPnJhdGUgLyAxMDAwKTsKKworCWNoYW5uZWwtPmZyYWdfbXNlY3MgPSBtc2VjczsKKworCS8qIFBpY2sgYSBzdWl0YWJsZSBudW1iZXIgb2YgZnJhZ21lbnRzICovCisJaWYgKG1zZWNzICogbnVtIDwgRk9SVEVfTUlOX0JVRl9NU0VDUykKKwkgICAgIG51bSA9IEZPUlRFX01JTl9CVUZfTVNFQ1MgLyBtc2VjczsKKworCWlmIChtc2VjcyAqIG51bSA+IEZPUlRFX01BWF9CVUZfTVNFQ1MpCisJICAgICBudW0gPSBGT1JURV9NQVhfQlVGX01TRUNTIC8gbXNlY3M7CisKKwkvKiBGcmFnbWVudCBudW1iZXIgbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KKwlzaGlmdCA9IDA7CQorCXdoaWxlIChudW0gPj49IDEpCisJCXNoaWZ0Kys7CisJY2hhbm5lbC0+ZnJhZ19udW0gPSAxIDw8IChzaGlmdCArIDEpOworCisJLyogUm91bmQgZnJhZ21lbnQgbnVtYmVyIHRvIHNvbWV0aGluZyByZWFzb25hYmxlICovCisJaWYgKGNoYW5uZWwtPmZyYWdfbnVtIDwgRk9SVEVfTUlOX0ZSQUdNRU5UUykKKwkJY2hhbm5lbC0+ZnJhZ19udW0gPSBGT1JURV9NSU5fRlJBR01FTlRTOworCisJaWYgKGNoYW5uZWwtPmZyYWdfbnVtID4gRk9SVEVfTUFYX0ZSQUdNRU5UUykKKwkJY2hhbm5lbC0+ZnJhZ19udW0gPSBGT1JURV9NQVhfRlJBR01FTlRTOworCisJY2hhbm5lbC0+YnVmX3N6ID0gY2hhbm5lbC0+ZnJhZ19zeiAqIGNoYW5uZWwtPmZyYWdfbnVtOworCisJRFBSSU5USyAoIiVzOiAlcyBmcmFnX3N6ID0gJWQsIGZyYWdfbnVtID0gJWQsIGJ1Zl9zeiA9ICVkXG4iLAorCQkgX19GVU5DVElPTl9fLCBjaGFubmVsLT5uYW1lLCBjaGFubmVsLT5mcmFnX3N6LCAKKwkJIGNoYW5uZWwtPmZyYWdfbnVtLCBjaGFubmVsLT5idWZfc3opOworfQorCisKKy8qKiAKKyAqIGZvcnRlX2NoYW5uZWxfcHJlcDoKKyAqIEBjaGFubmVsOglDaGFubmVsIHdob3NlIGJ1ZmZlciB0byBwcmVwYXJlCisgKgorICogTG9ja2luZzoJTG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkCitmb3J0ZV9jaGFubmVsX3ByZXAgKHN0cnVjdCBmb3J0ZV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBpOworCQorCWlmIChjaGFubmVsLT5idWYpCisJCXJldHVybjsKKworCWZvcnRlX2NoYW5uZWxfYnVmZmVyIChjaGFubmVsLCBjaGFubmVsLT5mcmFnX3N6LCBjaGFubmVsLT5mcmFnX251bSk7CisJY2hhbm5lbC0+YnVmX3BhZ2VzID0gY2hhbm5lbC0+YnVmX3N6ID4+IFBBR0VfU0hJRlQ7CisKKwlpZiAoY2hhbm5lbC0+YnVmX3N6ICUgUEFHRV9TSVpFKQorCQljaGFubmVsLT5idWZfcGFnZXMrKzsKKworCURQUklOVEsgKCIlczogJXMgZnJhZ19zeiA9ICVkLCBmcmFnX251bSA9ICVkLCBidWZfc3ogPSAlZCwgcGcgPSAlZFxuIiwgCisJCSBfX0ZVTkNUSU9OX18sIGNoYW5uZWwtPm5hbWUsIGNoYW5uZWwtPmZyYWdfc3osIAorCQkgY2hhbm5lbC0+ZnJhZ19udW0sIGNoYW5uZWwtPmJ1Zl9zeiwgY2hhbm5lbC0+YnVmX3BhZ2VzKTsKKworCS8qIERNQSBidWZmZXIgKi8KKwljaGFubmVsLT5idWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAoZm9ydGUtPnBjaV9kZXYsIAorCQkJCQkgICAgIGNoYW5uZWwtPmJ1Zl9wYWdlcyAqIFBBR0VfU0laRSwKKwkJCQkJICAgICAmY2hhbm5lbC0+YnVmX2hhbmRsZSk7CisKKwlpZiAoIWNoYW5uZWwtPmJ1ZiB8fCAhY2hhbm5lbC0+YnVmX2hhbmRsZSkKKwkJQlVHKCk7CisKKwlwYWdlID0gdmlydF90b19wYWdlIChjaGFubmVsLT5idWYpOworCQorCS8qIEZJWE1FOiBjYW4gdGhpcyBnbyBhd2F5ID8gKi8KKwlmb3IgKGkgPSAwIDsgaSA8IGNoYW5uZWwtPmJ1Zl9wYWdlcyA7IGkrKykKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UrKyk7CisKKwkvKiBQcmVwIGJ1ZmZlciByZWdpc3RlcnMgKi8KKwlvdXR3IChjaGFubmVsLT5mcmFnX3N6IC0gMSwgY2hhbm5lbC0+aW9iYXNlICsgRk9SVEVfUExZX0NPVU5UKTsKKwlvdXRsIChjaGFubmVsLT5idWZfaGFuZGxlLCBjaGFubmVsLT5pb2Jhc2UgKyBGT1JURV9QTFlfQlVGMSk7CisJb3V0bCAoY2hhbm5lbC0+YnVmX2hhbmRsZSArIGNoYW5uZWwtPmZyYWdfc3osIAorCSAgICAgIGNoYW5uZWwtPmlvYmFzZSArIEZPUlRFX1BMWV9CVUYyKTsKKworCS8qIFJlc2V0IGh3cHRyICovCisgCWNoYW5uZWwtPmh3cHRyID0gY2hhbm5lbC0+ZnJhZ19zejsKKwljaGFubmVsLT5uZXh0X2J1ZiA9IDE7CisKKwlEUFJJTlRLICgiJXM6ICVzIGJ1ZmZlciBAICVwICglcClcbiIsIF9fRlVOQ1RJT05fXywgY2hhbm5lbC0+bmFtZSwgCisJCSBjaGFubmVsLT5idWYsIGNoYW5uZWwtPmJ1Zl9oYW5kbGUpOworfQorCisKKy8qKiAKKyAqIGZvcnRlX2NoYW5uZWxfZHJhaW46CisgKiBAY2hpcDoJCisgKiBAY2hhbm5lbDoJCisgKgorICogTG9ja2luZzoJRG9uJ3QgaG9sZCB0aGUgbG9jay4KKyAqLworCitzdGF0aWMgaW5saW5lIGludAorZm9ydGVfY2hhbm5lbF9kcmFpbiAoc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJREVDTEFSRV9XQUlUUVVFVUUgKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUFJJTlRLICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoY2hhbm5lbC0+bWFwcGVkKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlICgmZm9ydGUtPmxvY2ssIGZsYWdzKTsKKwkJZm9ydGVfY2hhbm5lbF9zdG9wIChjaGFubmVsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmZvcnRlLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlICgmZm9ydGUtPmxvY2ssIGZsYWdzKTsKKwlhZGRfd2FpdF9xdWV1ZSAoJmNoYW5uZWwtPndhaXQsICZ3YWl0KTsKKworCWZvciAoOzspIHsKKwkJaWYgKGNoYW5uZWwtPmFjdGl2ZSA9PSAwIHx8IGNoYW5uZWwtPmZpbGxlZF9mcmFncyA9PSAxKQorCQkJYnJlYWs7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmZvcnRlLT5sb2NrLCBmbGFncyk7CisKKwkJX19zZXRfY3VycmVudF9zdGF0ZSAoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJmZvcnRlLT5sb2NrLCBmbGFncyk7CisJfQorCisJZm9ydGVfY2hhbm5lbF9zdG9wIChjaGFubmVsKTsKKwlmb3J0ZV9jaGFubmVsX3Jlc2V0IChjaGFubmVsKTsKKwlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSAoJmNoYW5uZWwtPndhaXQsICZ3YWl0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZm9ydGUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKKy8qKiAKKyAqIGZvcnRlX2NoYW5uZWxfaW5pdDoKKyAqIEBjaGlwOiAJRm9ydGUgY2hpcCBpbnN0YW5jZSB0aGUgY2hhbm5lbCBoYW5ncyBvZmYKKyAqIEBjaGFubmVsOiAJQ2hhbm5lbCB0byBpbml0aWFsaXplCisgKgorICogRGVzY3JpcHRpb246CisgKgkgICAgICAgIEluaXRpYWxpemVzIGEgY2hhbm5lbCwgc2V0cyBkZWZhdWx0cywgYW5kIGFsbG9jYXRlcworICoJICAgICAgICBidWZmZXJzLgorICoKKyAqIExvY2tpbmc6CU5vIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgaW50Citmb3J0ZV9jaGFubmVsX2luaXQgKHN0cnVjdCBmb3J0ZV9jaGlwICpjaGlwLCBzdHJ1Y3QgZm9ydGVfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlEUFJJTlRLICgiJXM6IGNoaXAgaW9iYXNlIEAgJXBcbiIsIF9fRlVOQ1RJT05fXywgKHZvaWQgKiljaGlwLT5pb2Jhc2UpOworCisJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCW1lbXNldCAoY2hhbm5lbCwgMHgwLCBzaXplb2YgKCpjaGFubmVsKSk7CisKKwlpZiAoY2hhbm5lbCA9PSAmY2hpcC0+cGxheSkgeworCQljaGFubmVsLT5uYW1lID0gIlBDTV9PVVQiOworCQljaGFubmVsLT5pb2Jhc2UgPSBjaGlwLT5pb2Jhc2U7CisJCURQUklOVEsgKCIlczogUENNLU9VVCBpb2Jhc2UgQCAlcFxuIiwgX19GVU5DVElPTl9fLAorCQkJICh2b2lkICopIGNoYW5uZWwtPmlvYmFzZSk7CisJfQorCWVsc2UgaWYgKGNoYW5uZWwgPT0gJmNoaXAtPnJlYykgeworCQljaGFubmVsLT5uYW1lID0gIlBDTV9JTiI7CisJCWNoYW5uZWwtPmlvYmFzZSA9IGNoaXAtPmlvYmFzZSArIEZPUlRFX0NBUF9PRkZTRVQ7CisJCWNoYW5uZWwtPnJlY29yZCA9IDE7CisJCURQUklOVEsgKCIlczogUENNLUlOIGlvYmFzZSBAICVwXG4iLCBfX0ZVTkNUSU9OX18sIAorCQkJICh2b2lkICopIGNoYW5uZWwtPmlvYmFzZSk7CisJfQorCWVsc2UKKwkJQlVHKCk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkICgmY2hhbm5lbC0+d2FpdCk7CisKKwkvKiBEZWZhdWx0czogNDhrSHosIDE2LWJpdCwgc3RlcmVvICovCisJY2hhbm5lbC0+Y3RybCA9IGludyAoY2hhbm5lbC0+aW9iYXNlICsgRk9SVEVfUExZX0NUUkwpOworCWZvcnRlX2NoYW5uZWxfcmVzZXQgKGNoYW5uZWwpOworCWZvcnRlX2NoYW5uZWxfc3RlcmVvIChjaGFubmVsLCAxKTsKKwlmb3J0ZV9jaGFubmVsX2Zvcm1hdCAoY2hhbm5lbCwgQUZNVF9TMTZfTEUpOworCWZvcnRlX2NoYW5uZWxfcmF0ZSAoY2hhbm5lbCwgNDgwMDApOworCWNoYW5uZWwtPmZyYWdfc3ogPSBGT1JURV9ERUZfRlJBR19TSVpFOworCWNoYW5uZWwtPmZyYWdfbnVtID0gRk9SVEVfREVGX0ZSQUdNRU5UUzsKKworCWNoaXAtPnRyaWdnZXIgPSAwOworCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9mcmVlOgorICogQGNoaXA6CUNoaXAgdGhpcyBjaGFubmVsIGhhbmdzIG9mZgorICogQGNoYW5uZWw6CUNoYW5uZWwgdG8gbnVrZSAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIAkJUmVzZXRzIGNoYW5uZWwgYW5kIGZyZWVzIGJ1ZmZlcnMuCisgKgorICogTG9ja2luZzoJSG9sZCB5b3VyIGhvcnNlcy4KKyAqLworCitzdGF0aWMgdm9pZAorZm9ydGVfY2hhbm5lbF9mcmVlIChzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcCwgc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJRFBSSU5USyAoIiVzOiAlc1xuIiwgX19GVU5DVElPTl9fLCBjaGFubmVsLT5uYW1lKTsKKworCWlmICghY2hhbm5lbC0+YnVmX2hhbmRsZSkKKwkJcmV0dXJuOworCisJcGNpX2ZyZWVfY29uc2lzdGVudCAoY2hpcC0+cGNpX2RldiwgY2hhbm5lbC0+YnVmX3BhZ2VzICogUEFHRV9TSVpFLCAKKwkJCSAgICAgY2hhbm5lbC0+YnVmLCBjaGFubmVsLT5idWZfaGFuZGxlKTsKKwkKKwltZW1zZXQgKGNoYW5uZWwsIDB4MCwgc2l6ZW9mICgqY2hhbm5lbCkpOworfQorCisKKy8qIERTUCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKioKKyAqIGZvcnRlX2RzcF9pb2N0bDoKKyAqLworCitzdGF0aWMgaW50Citmb3J0ZV9kc3BfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGl2YWw9MCwgcmV0LCBydmFsPTAsIHJkLCB3ciwgY291bnQ7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXA7CisJc3RydWN0IGF1ZGlvX2J1Zl9pbmZvIGFiaTsKKwlzdHJ1Y3QgY291bnRfaW5mbyBjaW5mbzsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCWNoaXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQl3ciA9IDE7CisJZWxzZSAKKwkJd3IgPSAwOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXJkID0gMTsKKwllbHNlCisJCXJkID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorCQlyZXR1cm4gcHV0X3VzZXIgKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCURQUklOVEsgKCIlczogR0VUQ0FQU1xuIiwgX19GVU5DVElPTl9fKTsKKworCQlpdmFsID0gRk9SVEVfQ0FQUzsgLyogRFVQTEVYICovCisJCXJldHVybiBwdXRfdXNlciAoaXZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKKwkJRFBSSU5USyAoIiVzOiBHRVRGTVRTXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWl2YWwgPSBGT1JURV9GTVRTOyAvKiBVOCwgMTZMRSAqLworCQlyZXR1cm4gcHV0X3VzZXIgKGl2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoJLyogVTgsIDE2TEUgKi8KKwkJRFBSSU5USyAoIiVzOiBTRVRGTVRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaWYgKGdldF91c2VyIChpdmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAocmQpIHsKKwkJCWZvcnRlX2NoYW5uZWxfc3RvcCAoJmNoaXAtPnJlYyk7CisJCQlydmFsID0gZm9ydGVfY2hhbm5lbF9mb3JtYXQgKCZjaGlwLT5yZWMsIGl2YWwpOworCQl9CisKKwkJaWYgKHdyKSB7CisJCQlmb3J0ZV9jaGFubmVsX3N0b3AgKCZjaGlwLT5yZWMpOworCQkJcnZhbCA9IGZvcnRlX2NoYW5uZWxfZm9ybWF0ICgmY2hpcC0+cGxheSwgaXZhbCk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKwkKKwkJcmV0dXJuIHB1dF91c2VyIChydmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CS8qIDAgLSBtb25vLCAxIC0gc3RlcmVvICovCisJCURQUklOVEsgKCIlczogU1RFUkVPXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlmIChnZXRfdXNlciAoaXZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJaWYgKHJkKSB7CisJCQlmb3J0ZV9jaGFubmVsX3N0b3AgKCZjaGlwLT5yZWMpOworCQkJcnZhbCA9IGZvcnRlX2NoYW5uZWxfc3RlcmVvICgmY2hpcC0+cmVjLCBpdmFsKTsKKwkJfQorCisJCWlmICh3cikgeworCQkJZm9ydGVfY2hhbm5lbF9zdG9wICgmY2hpcC0+cmVjKTsKKwkJCXJ2YWwgPSBmb3J0ZV9jaGFubmVsX3N0ZXJlbyAoJmNoaXAtPnBsYXksIGl2YWwpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIgKHJ2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOiAvKiAxIC0gbW9ubywgMiAtIHN0ZXJlbyAqLworCQlEUFJJTlRLICgiJXM6IENIQU5ORUxTXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlmIChnZXRfdXNlciAoaXZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJaWYgKHJkKSB7CisJCQlmb3J0ZV9jaGFubmVsX3N0b3AgKCZjaGlwLT5yZWMpOworCQkJcnZhbCA9IGZvcnRlX2NoYW5uZWxfc3RlcmVvICgmY2hpcC0+cmVjLCBpdmFsLTEpICsgMTsKKwkJfQorCisJCWlmICh3cikgeworCQkJZm9ydGVfY2hhbm5lbF9zdG9wICgmY2hpcC0+cGxheSk7CisJCQlydmFsID0gZm9ydGVfY2hhbm5lbF9zdGVyZW8gKCZjaGlwLT5wbGF5LCBpdmFsLTEpICsgMTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyIChydmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJRFBSSU5USyAoIiVzOiBTUEVFRFxuIiwgX19GVU5DVElPTl9fKTsKKworCQlpZiAoZ2V0X3VzZXIgKGl2YWwsIHApKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCWlmIChyZCkgeworCQkJZm9ydGVfY2hhbm5lbF9zdG9wICgmY2hpcC0+cmVjKTsKKwkJCXJ2YWwgPSBmb3J0ZV9jaGFubmVsX3JhdGUgKCZjaGlwLT5yZWMsIGl2YWwpOworCQl9CisKKwkJaWYgKHdyKSB7CisJCQlmb3J0ZV9jaGFubmVsX3N0b3AgKCZjaGlwLT5wbGF5KTsKKwkJCXJ2YWwgPSBmb3J0ZV9jaGFubmVsX3JhdGUgKCZjaGlwLT5wbGF5LCBpdmFsKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyKHJ2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCURQUklOVEsgKCIlczogR0VUQkxLU0laRVxuIiwgX19GVU5DVElPTl9fKTsKKworCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJaWYgKHJkKQorCQkJaXZhbCA9IGNoaXAtPnJlYy5mcmFnX3N6OworCisJCWlmICh3cikKKwkJCWl2YWwgPSBjaGlwLT5wbGF5LmZyYWdfc3o7CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIgKGl2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlEUFJJTlRLICgiJXM6IFJFU0VUXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAocmQpCisJCQlmb3J0ZV9jaGFubmVsX3Jlc2V0ICgmY2hpcC0+cmVjKTsKKworCQlpZiAod3IpCisJCQlmb3J0ZV9jaGFubmVsX3Jlc2V0ICgmY2hpcC0+cGxheSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlEUFJJTlRLICgiJXM6IFNZTkNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaWYgKHdyKQorCQkJcmV0ID0gZm9ydGVfY2hhbm5lbF9kcmFpbiAoJmNoaXAtPnBsYXkpOworCisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCURQUklOVEsgKCIlczogUE9TVFxuIiwgX19GVU5DVElPTl9fKTsKKworCQlpZiAod3IpIHsKKwkJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQkJaWYgKGNoaXAtPnBsYXkuZmlsbGVkX2ZyYWdzKQorCQkJCWZvcnRlX2NoYW5uZWxfc3RhcnQgKCZjaGlwLT5wbGF5KTsKKworCQkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisJCX0KKworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlEUFJJTlRLICgiJXM6IFNFVEZSQUdNRU5UXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlmIChnZXRfdXNlciAoaXZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJaWYgKHJkKSB7CisJCQlmb3J0ZV9jaGFubmVsX2J1ZmZlciAoJmNoaXAtPnJlYywgaXZhbCAmIDB4ZmZmZiwgCisJCQkJCSAgICAgIChpdmFsID4+IDE2KSAmIDB4ZmZmZik7CisJCQlpdmFsID0gKGNoaXAtPnJlYy5mcmFnX251bSA8PCAxNikgKyBjaGlwLT5yZWMuZnJhZ19zejsKKwkJfQorCisJCWlmICh3cikgeworCQkJZm9ydGVfY2hhbm5lbF9idWZmZXIgKCZjaGlwLT5wbGF5LCBpdmFsICYgMHhmZmZmLCAKKwkJCQkJICAgICAgKGl2YWwgPj4gMTYpICYgMHhmZmZmKTsKKwkJCWl2YWwgPSAoY2hpcC0+cGxheS5mcmFnX251bSA8PCAxNikgK2NoaXAtPnBsYXkuZnJhZ19zejsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCXJldHVybiBwdXRfdXNlciAoaXZhbCwgcCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCURQUklOVEsgKCIlczogR0VUSVNQQUNFXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlmICghcmQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJYWJpLmZyYWdzdG90YWwgPSBjaGlwLT5yZWMuZnJhZ19udW07CisJCWFiaS5mcmFnc2l6ZSA9IGNoaXAtPnJlYy5mcmFnX3N6OworCQkJCisJCWlmIChjaGlwLT5yZWMubWFwcGVkKSB7CisJCQlhYmkuZnJhZ21lbnRzID0gY2hpcC0+cmVjLmZyYWdfbnVtIC0gMjsKKwkJCWFiaS5ieXRlcyA9IGFiaS5mcmFnbWVudHMgKiBhYmkuZnJhZ3NpemU7CisJCX0KKwkJZWxzZSB7CisJCQlhYmkuZnJhZ21lbnRzID0gY2hpcC0+cmVjLmZpbGxlZF9mcmFnczsKKwkJCWFiaS5ieXRlcyA9IGFiaS5mcmFnbWVudHMgKiBhYmkuZnJhZ3NpemU7CisJCX0KKworCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlyZXR1cm4gY29weV90b191c2VyIChhcmdwLCAmYWJpLCBzaXplb2YgKGFiaSkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJRFBSSU5USyAoIiVzOiBHRVRJUFRSXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlmICghcmQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJaWYgKGNoaXAtPnJlYy5hY3RpdmUpIAorCQkJY2luZm8ucHRyID0gY2hpcC0+cmVjLmh3cHRyOworCQllbHNlCisJCQljaW5mby5wdHIgPSAwOworCisJCWNpbmZvLmJ5dGVzID0gY2hpcC0+cmVjLmJ5dGVzOworCQljaW5mby5ibG9ja3MgPSBjaGlwLT5yZWMubnJfaXJxczsKKwkJY2hpcC0+cmVjLm5yX2lycXMgPSAwOworCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCXJldHVybiBjb3B5X3RvX3VzZXIgKGFyZ3AsICZjaW5mbywgc2l6ZW9mIChjaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCF3cikKKwkJCXJldHVybiAtRUlOVkFMOworCQkKKwkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCWFiaS5mcmFnc3RvdGFsID0gY2hpcC0+cGxheS5mcmFnX251bTsKKwkJYWJpLmZyYWdzaXplID0gY2hpcC0+cGxheS5mcmFnX3N6OworCisJCWlmIChjaGlwLT5wbGF5Lm1hcHBlZCkgeworCQkJYWJpLmZyYWdtZW50cyA9IGNoaXAtPnBsYXkuZnJhZ19udW0gLSAyOworCQkJYWJpLmJ5dGVzID0gY2hpcC0+cGxheS5idWZfc3o7CisJCX0KKwkJZWxzZSB7CisJCQlhYmkuZnJhZ21lbnRzID0gY2hpcC0+cGxheS5mcmFnX251bSAtIAorCQkJCWNoaXAtPnBsYXkuZmlsbGVkX2ZyYWdzOworCisJCQlpZiAoY2hpcC0+cGxheS5yZXNpZHVlKQorCQkJCWFiaS5mcmFnbWVudHMtLTsKKworCQkJYWJpLmJ5dGVzID0gYWJpLmZyYWdtZW50cyAqIGFiaS5mcmFnc2l6ZSArCisJCQkJY2hpcC0+cGxheS5yZXNpZHVlOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisJCQorCQlyZXR1cm4gY29weV90b191c2VyIChhcmdwLCAmYWJpLCBzaXplb2YgKGFiaSkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCF3cikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAoY2hpcC0+cGxheS5hY3RpdmUpIAorCQkJY2luZm8ucHRyID0gY2hpcC0+cGxheS5od3B0cjsKKwkJZWxzZQorCQkJY2luZm8ucHRyID0gMDsKKworCQljaW5mby5ieXRlcyA9IGNoaXAtPnBsYXkuYnl0ZXM7CisJCWNpbmZvLmJsb2NrcyA9IGNoaXAtPnBsYXkubnJfaXJxczsKKwkJY2hpcC0+cGxheS5ucl9pcnFzID0gMDsKKworCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlyZXR1cm4gY29weV90b191c2VyIChhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCF3cikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAoIWNoaXAtPnBsYXkuYWN0aXZlKSB7CisJCQlpdmFsID0gMDsKKwkJfQorCQllbHNlIGlmIChjaGlwLT5wbGF5Lm1hcHBlZCkgeworCQkJY291bnQgPSBpbncgKGNoaXAtPnBsYXkuaW9iYXNlICsgRk9SVEVfUExZX0NPVU5UKSArIDE7CisJCQlpdmFsID0gY2hpcC0+cGxheS5mcmFnX3N6IC0gY291bnQ7CisJCX0KKwkJZWxzZSB7CisJCQlpdmFsID0gY2hpcC0+cGxheS5maWxsZWRfZnJhZ3MgKiBjaGlwLT5wbGF5LmZyYWdfc3o7CisKKwkJCWlmIChjaGlwLT5wbGF5LnJlc2lkdWUpCisJCQkJaXZhbCArPSBjaGlwLT5wbGF5LmZyYWdfc3ogLSBjaGlwLT5wbGF5LnJlc2lkdWU7CisJCX0KKworCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlyZXR1cm4gcHV0X3VzZXIgKGl2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJRFBSSU5USyAoIiVzOiBTRVREVVBMRVhcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJRFBSSU5USyAoIiVzOiBHRVRUUklHR0VSXG4iLCBfX0ZVTkNUSU9OX18pOworCQkKKwkJcmV0dXJuIHB1dF91c2VyIChjaGlwLT50cmlnZ2VyLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisKKwkJaWYgKGdldF91c2VyIChpdmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURQUklOVEsgKCIlczogU0VUVFJJR0dFUiAlZFxuIiwgX19GVU5DVElPTl9fLCBpdmFsKTsKKworCQlpZiAod3IpIHsKKwkJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQkJaWYgKGl2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkKKwkJCQlmb3J0ZV9jaGFubmVsX3N0YXJ0ICgmY2hpcC0+cGxheSk7CisJCQllbHNlIHsJCQorCQkJCWNoaXAtPnRyaWdnZXIgPSAxOworCQkJCWZvcnRlX2NoYW5uZWxfcHJlcCAoJmNoaXAtPnBsYXkpOworCQkJCWZvcnRlX2NoYW5uZWxfc3RvcCAoJmNoaXAtPnBsYXkpOworCQkJfQorCisJCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKwkJfQorCQllbHNlIGlmIChyZCkgeworCQkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCQlpZiAoaXZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpCisJCQkJZm9ydGVfY2hhbm5lbF9zdGFydCAoJmNoaXAtPnJlYyk7CisJCQllbHNlIHsJCQorCQkJCWNoaXAtPnRyaWdnZXIgPSAxOworCQkJCWZvcnRlX2NoYW5uZWxfcHJlcCAoJmNoaXAtPnJlYyk7CisJCQkJZm9ydGVfY2hhbm5lbF9zdG9wICgmY2hpcC0+cmVjKTsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisJCX0KKworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlEUFJJTlRLICgiJXM6IFBDTV9SRUFEX1JBVEVcbiIsIF9fRlVOQ1RJT05fXyk7CQkKKwkJcmV0dXJuIHB1dF91c2VyIChjaGlwLT5wbGF5LnJhdGUsIHApOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJRFBSSU5USyAoIiVzOiBQQ01fUkVBRF9DSEFOTkVMU1xuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIHB1dF91c2VyIChjaGlwLT5wbGF5LnN0ZXJlbywgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCURQUklOVEsgKCIlczogUENNX1JFQURfQklUU1xuIiwgX19GVU5DVElPTl9fKTsJCQorCQlyZXR1cm4gcHV0X3VzZXIgKGNoaXAtPnBsYXkuZm9ybWF0LCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKwkJRFBSSU5USyAoIiVzOiBEU1BfTk9OQkxPQ0tcbiIsIF9fRlVOQ1RJT05fXyk7CQkKKyAgICAgICAgICAgICAgICBmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJRFBSSU5USyAoIlVuc3VwcG9ydGVkIGlvY3RsOiAleCAoJXApXG4iLCBjbWQsIGFyZ3ApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCisvKioKKyAqIGZvcnRlX2RzcF9vcGVuOgorICovCisKK3N0YXRpYyBpbnQgCitmb3J0ZV9kc3Bfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXAgPSBmb3J0ZTsgLyogRklYTUU6IEhBQ0sgRlJPTSBIRUxMISAqLworCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCWlmIChkb3duX3RyeWxvY2sgKCZjaGlwLT5vcGVuX3NlbSkpIHsKKwkJCURQUklOVEsgKCIlczogcmV0dXJuaW5nIC1FQUdBSU5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKwllbHNlIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmNoaXAtPm9wZW5fc2VtKSkgeworCQkJRFBSSU5USyAoIiVzOiByZXR1cm5pbmcgLUVSRVNUQVJUU1lTXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZvcnRlOworCisJRFBSSU5USyAoIiVzOiBkc3Agb3BlbmVkIGJ5ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGN1cnJlbnQtPnBpZCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWZvcnRlX2NoYW5uZWxfaW5pdCAoZm9ydGUsICZmb3J0ZS0+cGxheSk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJZm9ydGVfY2hhbm5lbF9pbml0IChmb3J0ZSwgJmZvcnRlLT5yZWMpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisKKy8qKgorICogZm9ydGVfZHNwX3JlbGVhc2U6CisgKi8KKworc3RhdGljIGludCAKK2ZvcnRlX2RzcF9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCURQUklOVEsgKCIlczogY2hpcCBAICVwXG4iLCBfX0ZVTkNUSU9OX18sIGNoaXApOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWZvcnRlX2NoYW5uZWxfZHJhaW4gKCZjaGlwLT5wbGF5KTsKKworCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKyAJCWZvcnRlX2NoYW5uZWxfZnJlZSAoY2hpcCwgJmNoaXAtPnBsYXkpOworCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworICAgICAgICB9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQl3aGlsZSAoY2hpcC0+cmVjLmZpbGxlZF9mcmFncyA+IDApCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uICgmY2hpcC0+cmVjLndhaXQpOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlmb3J0ZV9jaGFubmVsX3N0b3AgKCZjaGlwLT5yZWMpOworCQlmb3J0ZV9jaGFubmVsX2ZyZWUgKGNoaXAsICZjaGlwLT5yZWMpOworCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCX0KKworCXVwICgmY2hpcC0+b3Blbl9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIGZvcnRlX2RzcF9wb2xsOgorICoKKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IAorZm9ydGVfZHNwX3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXA7CisJc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWw7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJY2hpcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQljaGFubmVsID0gJmNoaXAtPnBsYXk7CisKKwkJaWYgKGNoYW5uZWwtPmFjdGl2ZSkKKwkJCXBvbGxfd2FpdCAoZmlsZSwgJmNoYW5uZWwtPndhaXQsIHdhaXQpOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAoY2hhbm5lbC0+ZnJhZ19udW0gLSBjaGFubmVsLT5maWxsZWRfZnJhZ3MgPiAwKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQljaGFubmVsID0gJmNoaXAtPnJlYzsKKworCQlpZiAoY2hhbm5lbC0+YWN0aXZlKQorCQkJcG9sbF93YWl0IChmaWxlLCAmY2hhbm5lbC0+d2FpdCwgd2FpdCk7CisKKwkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCWlmIChjaGFubmVsLT5maWxsZWRfZnJhZ3MgPiAwKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCX0KKworCXJldHVybiBtYXNrOworfQorCisKKy8qKgorICogZm9ydGVfZHNwX21tYXA6CisgKi8KKworc3RhdGljIGludAorZm9ydGVfZHNwX21tYXAgKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgZm9ydGVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHJldDsKKworCWNoaXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlEUFJJTlRLICgiJXM6IHN0YXJ0ICVsWGgsIHNpemUgJWxkLCBwZ29mZiAlbGRcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bnb2ZmKTsKKworCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUgJiYgY2hpcC0+cGxheS5hY3RpdmUpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKyAgICAgICAgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEICYmIGNoaXAtPnJlYy5hY3RpdmUpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKyAgICAgICAgfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQljaGFubmVsID0gJmNoaXAtPnBsYXk7CisJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJY2hhbm5lbCA9ICZjaGlwLT5yZWM7CisJZWxzZSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWZvcnRlX2NoYW5uZWxfcHJlcCAoY2hhbm5lbCk7CisJY2hhbm5lbC0+bWFwcGVkID0gMTsKKworICAgICAgICBpZiAodm1hLT52bV9wZ29mZiAhPSAwKSB7CisJCXJldCA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisJfQorCisgICAgICAgIHNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisKKyAgICAgICAgaWYgKHNpemUgPiBjaGFubmVsLT5idWZfcGFnZXMgKiBQQUdFX1NJWkUpIHsKKwkJRFBSSU5USyAoIiVzOiBzaXplICglbGQpID4gYnVmX3N6ICglZCkgXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgc2l6ZSwgY2hhbm5lbC0+YnVmX3N6KTsKKwkJcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKwl9CisKKyAgICAgICAgaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgICB2aXJ0X3RvX3BoeXMoY2hhbm5lbC0+YnVmKSA+PiBQQUdFX1NISUZULAorCQkJICAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCURQUklOVEsgKCIlczogcmVtYXAgZWwgYSBubyB3b3Jrb1xuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0ID0gLUVBR0FJTjsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKwl9CisKKyAgICAgICAgcmV0ID0gMDsKKworIG91dDoKKwlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIGZvcnRlX2RzcF93cml0ZToKKyAqLworCitzdGF0aWMgc3NpemVfdCAKK2ZvcnRlX2RzcF93cml0ZSAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBieXRlcywgCisJCSBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXA7CisJc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWw7CisJdW5zaWduZWQgaW50IGkgPSBieXRlcywgc3ogPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWFjY2Vzc19vayAoVkVSSUZZX1JFQUQsIGJ1ZmZlciwgYnl0ZXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNoaXAgPSAoc3RydWN0IGZvcnRlX2NoaXAgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFjaGlwKQorCQlCVUcoKTsKKworCWNoYW5uZWwgPSAmY2hpcC0+cGxheTsKKworCWlmICghY2hhbm5lbCkKKwkJQlVHKCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFNldCB1cCBidWZmZXJzIHdpdGggdGhlIHJpZ2h0IGZyYWdtZW50IHNpemUgKi8KKwlmb3J0ZV9jaGFubmVsX3ByZXAgKGNoYW5uZWwpOworCisJd2hpbGUgKGkpIHsKKwkJLyogQWxsIGZyYWdtZW50IGJ1ZmZlcnMgaW4gdXNlIC0+IHdhaXQgKi8KKwkJaWYgKGNoYW5uZWwtPmZyYWdfbnVtIC0gY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzID09IDApIHsKKwkJCURFQ0xBUkVfV0FJVFFVRVVFICh3YWl0LCBjdXJyZW50KTsKKworCQkJLyogRm9yIHRyaWdnZXIgb3Igbm9uLWJsb2NraW5nIG9wZXJhdGlvbiwgZ2V0IG91dCAqLworCQkJaWYgKGNoaXAtPnRyaWdnZXIgfHwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCQkJCXJldHVybiAtRUFHQUlOOworCQkJfQorCisJCQkvKiBPdGhlcndpc2Ugd2FpdCBmb3IgYnVmZmVycyAqLworCQkJYWRkX3dhaXRfcXVldWUgKCZjaGFubmVsLT53YWl0LCAmd2FpdCk7CisKKwkJCWZvciAoOzspIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJCQkJc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJc2NoZWR1bGUoKTsKKworCQkJCXNwaW5fbG9ja19pcnFzYXZlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJCQkJaWYgKGNoYW5uZWwtPmZyYWdfbnVtIC0gY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcmVtb3ZlX3dhaXRfcXVldWUgKCZjaGFubmVsLT53YWl0LCAmd2FpdCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19SVU5OSU5HKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZjaGlwLT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCX0KKwkJfQorCisJCWlmIChjaGFubmVsLT5yZXNpZHVlKQorCQkJc3ogPSBjaGFubmVsLT5yZXNpZHVlOworCQllbHNlIGlmIChpID4gY2hhbm5lbC0+ZnJhZ19zeikKKwkJCXN6ID0gY2hhbm5lbC0+ZnJhZ19zejsKKwkJZWxzZQorCQkJc3ogPSBpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZjaGlwLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyICgodm9pZCAqKSBjaGFubmVsLT5idWYgKyBjaGFubmVsLT5zd3B0ciwgYnVmZmVyLCBzeikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBBZHZhbmNlIHNvZnR3YXJlIHBvaW50ZXIgKi8KKwkJYnVmZmVyICs9IHN6OworCQljaGFubmVsLT5zd3B0ciArPSBzejsKKwkJY2hhbm5lbC0+c3dwdHIgJT0gY2hhbm5lbC0+YnVmX3N6OworCQlpIC09IHN6OworCisJCS8qIE9ubHkgYnVtcCBmaWxsZWRfZnJhZ3MgaWYgYSBmdWxsIGZyYWdtZW50IGhhcyBiZWVuIHdyaXR0ZW4gKi8KKwkJaWYgKGNoYW5uZWwtPnN3cHRyICUgY2hhbm5lbC0+ZnJhZ19zeiA9PSAwKSB7CisJCQljaGFubmVsLT5maWxsZWRfZnJhZ3MrKzsKKwkJCWNoYW5uZWwtPnJlc2lkdWUgPSAwOworCQl9CisJCWVsc2UKKwkJCWNoYW5uZWwtPnJlc2lkdWUgPSBjaGFubmVsLT5mcmFnX3N6IC0gc3o7CisKKwkJLyogSWYgcGxheWJhY2sgaXNuJ3QgYWN0aXZlLCBzdGFydCBpdCAqLworCQlpZiAoY2hhbm5lbC0+YWN0aXZlID09IDAgJiYgY2hpcC0+dHJpZ2dlciA9PSAwKQorCQkJZm9ydGVfY2hhbm5lbF9zdGFydCAoY2hhbm5lbCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBieXRlcyAtIGk7Cit9CisKKworLyoqCisgKiBmb3J0ZV9kc3BfcmVhZDoKKyAqLworCitzdGF0aWMgc3NpemVfdCAKK2ZvcnRlX2RzcF9yZWFkIChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCAKKwkJbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBmb3J0ZV9jaGlwICpjaGlwOworCXN0cnVjdCBmb3J0ZV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGludCBpID0gYnl0ZXMsIHN6OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCBidWZmZXIsIGJ5dGVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljaGlwID0gKHN0cnVjdCBmb3J0ZV9jaGlwICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghY2hpcCkKKwkJQlVHKCk7CisKKwljaGFubmVsID0gJmNoaXAtPnJlYzsKKworCWlmICghY2hhbm5lbCkKKwkJQlVHKCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFNldCB1cCBidWZmZXJzIHdpdGggdGhlIHJpZ2h0IGZyYWdtZW50IHNpemUgKi8KKwlmb3J0ZV9jaGFubmVsX3ByZXAgKGNoYW5uZWwpOworCisJLyogU3RhcnQgcmVjb3JkaW5nICovCisJaWYgKCFjaGlwLT50cmlnZ2VyKQorCQlmb3J0ZV9jaGFubmVsX3N0YXJ0IChjaGFubmVsKTsKKworCXdoaWxlIChpKSB7CisJCS8qIE5vIGZyYWdtZW50IGJ1ZmZlcnMgaW4gdXNlIC0+IHdhaXQgKi8KKwkJaWYgKGNoYW5uZWwtPmZpbGxlZF9mcmFncyA9PSAwKSB7CisJCQlERUNMQVJFX1dBSVRRVUVVRSAod2FpdCwgY3VycmVudCk7CisKKwkJCS8qIEZvciB0cmlnZ2VyIG1vZGUgb3BlcmF0aW9uLCBnZXQgb3V0ICovCisJCQlpZiAoY2hpcC0+dHJpZ2dlcikgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZjaGlwLT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisKKwkJCWFkZF93YWl0X3F1ZXVlICgmY2hhbm5lbC0+d2FpdCwgJndhaXQpOworCisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKGNoYW5uZWwtPmFjdGl2ZSA9PSAwKQorCQkJCQlicmVhazsKKworCQkJCWlmIChjaGFubmVsLT5maWxsZWRfZnJhZ3MpCisJCQkJCWJyZWFrOworCQkJCQkJCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKworCQkJCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlKCk7CisKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSAoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKworCQkJc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfUlVOTklORyk7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSAoJmNoYW5uZWwtPndhaXQsICZ3YWl0KTsKKwkJfQorCisJCWlmIChpID4gY2hhbm5lbC0+ZnJhZ19zeikKKwkJCXN6ID0gY2hhbm5lbC0+ZnJhZ19zejsKKwkJZWxzZQorCQkJc3ogPSBpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZjaGlwLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNvcHlfdG9fdXNlciAoYnVmZmVyLCAodm9pZCAqKWNoYW5uZWwtPmJ1ZitjaGFubmVsLT5zd3B0ciwgc3opKSB7CisJCQlEUFJJTlRLICgiJXM6IGNvcHlfdG9fdXNlciBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJCS8qIEFkdmFuY2Ugc29mdHdhcmUgcG9pbnRlciAqLworCQlidWZmZXIgKz0gc3o7CisJCWlmIChjaGFubmVsLT5maWxsZWRfZnJhZ3MgPiAwKQorCQkJY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzLS07CisJCWNoYW5uZWwtPnN3cHRyICs9IGNoYW5uZWwtPmZyYWdfc3o7CisJCWNoYW5uZWwtPnN3cHRyICU9IGNoYW5uZWwtPmJ1Zl9zejsKKwkJaSAtPSBzejsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGJ5dGVzIC0gaTsKK30KKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3J0ZV9kc3BfZm9wcyA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgICAgIAkJPSAmbm9fbGxzZWVrLAorCS5yZWFkICAgICAgIAkJPSAmZm9ydGVfZHNwX3JlYWQsCisJLndyaXRlICAgICAgCQk9ICZmb3J0ZV9kc3Bfd3JpdGUsCisJLnBvbGwgICAgICAgCQk9ICZmb3J0ZV9kc3BfcG9sbCwKKwkuaW9jdGwgICAgICAJCT0gJmZvcnRlX2RzcF9pb2N0bCwKKwkub3BlbiAgICAgICAJCT0gJmZvcnRlX2RzcF9vcGVuLAorCS5yZWxlYXNlICAgIAkJPSAmZm9ydGVfZHNwX3JlbGVhc2UsCisJLm1tYXAJCQk9ICZmb3J0ZV9kc3BfbW1hcCwKK307CisKKworLyogQ29tbW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qKgorICogZm9ydGVfaW50ZXJydXB0OgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZm9ydGVfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBmb3J0ZV9jaGlwICpjaGlwID0gZGV2X2lkOworCXN0cnVjdCBmb3J0ZV9jaGFubmVsICpjaGFubmVsID0gTlVMTDsKKwl1MTYgc3RhdHVzLCBjb3VudDsgCisKKwlzdGF0dXMgPSBpbncgKGNoaXAtPmlvYmFzZSArIEZPUlRFX0lSUV9TVEFUVVMpOworCisJLyogSWYgdGhpcyBpcyBub3QgZm9yIHVzLCBnZXQgb3V0dGEgaGVyZSBBU0FQICovCisJaWYgKChzdGF0dXMgJiAoRk9SVEVfSVJRX1BMQVlCQUNLIHwgRk9SVEVfSVJRX0NBUFRVUkUpKSA9PSAwKQorCQlyZXR1cm4gSVJRX05PTkU7CisJCisJaWYgKHN0YXR1cyAmIEZPUlRFX0lSUV9QTEFZQkFDSykgeworCQljaGFubmVsID0gJmNoaXAtPnBsYXk7CisKKwkJc3Bpbl9sb2NrICgmY2hpcC0+bG9jayk7CisKKwkJaWYgKGNoYW5uZWwtPmZyYWdfc3ogPT0gMCkKKwkJCWdvdG8gcGFjazsKKworCQkvKiBEZWNsYXJlIGEgZnJhZ21lbnQgZG9uZSAqLworCQlpZiAoY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzID4gMCkKKwkJCWNoYW5uZWwtPmZpbGxlZF9mcmFncy0tOworCQljaGFubmVsLT5ieXRlcyArPSBjaGFubmVsLT5mcmFnX3N6OworCQljaGFubmVsLT5ucl9pcnFzKys7CisJCQorCQkvKiBGbGlwLWZsb3AgYmV0d2VlbiBidWZmZXIgSSBhbmQgSUkgKi8KKwkJY2hhbm5lbC0+bmV4dF9idWYgXj0gMTsKKworCQkvKiBBZHZhbmNlIGhhcmR3YXJlIHBvaW50ZXIgYnkgZnJhZ21lbnQgc2l6ZSBhbmQgd3JhcCBhcm91bmQgKi8KKwkJY2hhbm5lbC0+aHdwdHIgKz0gY2hhbm5lbC0+ZnJhZ19zejsKKwkJY2hhbm5lbC0+aHdwdHIgJT0gY2hhbm5lbC0+YnVmX3N6OworCisJCS8qIEJ1ZmZlciBJIG9yIGJ1ZmZlciBJSSBCQVIgKi8KKyAgICAgICAgICAgICAgICBvdXRsIChjaGFubmVsLT5idWZfaGFuZGxlICsgY2hhbm5lbC0+aHdwdHIsIAorCQkgICAgICBjaGFubmVsLT5uZXh0X2J1ZiA9PSAwID8KKwkJICAgICAgY2hhbm5lbC0+aW9iYXNlICsgRk9SVEVfUExZX0JVRjEgOgorCQkgICAgICBjaGFubmVsLT5pb2Jhc2UgKyBGT1JURV9QTFlfQlVGMik7CisKKwkJLyogSWYgdGhlIGN1cnJlbnRseSBwbGF5aW5nIGZyYWdtZW50IGlzIGxhc3QsIHNjaGVkdWxlIHBhdXNlICovCisJCWlmIChjaGFubmVsLT5maWxsZWRfZnJhZ3MgPT0gMSkgCisJCQlmb3J0ZV9jaGFubmVsX3BhdXNlIChjaGFubmVsKTsKKworCXBhY2s6CisJCS8qIEFja25vd2xlZGdlIGludGVycnVwdCAqLworICAgICAgICAgICAgICAgIG91dHcgKEZPUlRFX0lSUV9QTEFZQkFDSywgY2hpcC0+aW9iYXNlICsgRk9SVEVfSVJRX1NUQVRVUyk7CisKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUgKCZjaGFubmVsLT53YWl0KSkgCisJCQl3YWtlX3VwX2FsbCAoJmNoYW5uZWwtPndhaXQpOworCisJCXNwaW5fdW5sb2NrICgmY2hpcC0+bG9jayk7CisJfQorCisJaWYgKHN0YXR1cyAmIEZPUlRFX0lSUV9DQVBUVVJFKSB7CisJCWNoYW5uZWwgPSAmY2hpcC0+cmVjOworCQlzcGluX2xvY2sgKCZjaGlwLT5sb2NrKTsKKworCQkvKiBPbmUgZnJhZ21lbnQgZmlsbGVkICovCisJCWNoYW5uZWwtPmZpbGxlZF9mcmFncysrOworCisJCS8qIEdldCAjIG9mIGNvbXBsZXRlZCBieXRlcyAqLworCQljb3VudCA9IGludyAoY2hhbm5lbC0+aW9iYXNlICsgRk9SVEVfUExZX0NPVU5UKSArIDE7CisKKwkJaWYgKGNvdW50ID09IDApIHsKKwkJCURQUklOVEsgKCIlczogbGFzdCwgZmlsbGVkX2ZyYWdzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkgY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzKTsKKwkJCWNoYW5uZWwtPmZpbGxlZF9mcmFncyA9IDA7CisJCQlnb3RvIHJhY2s7CisJCX0KKworCQkvKiBCdWZmZXIgSSBvciBidWZmZXIgSUkgQkFSICovCisgICAgICAgICAgICAgICAgb3V0bCAoY2hhbm5lbC0+YnVmX2hhbmRsZSArIGNoYW5uZWwtPmh3cHRyLCAKKwkJICAgICAgY2hhbm5lbC0+bmV4dF9idWYgPT0gMCA/CisJCSAgICAgIGNoYW5uZWwtPmlvYmFzZSArIEZPUlRFX1BMWV9CVUYxIDoKKwkJICAgICAgY2hhbm5lbC0+aW9iYXNlICsgRk9SVEVfUExZX0JVRjIpOworCisJCS8qIEZsaXAtZmxvcCBiZXR3ZWVuIGJ1ZmZlciBJIGFuZCBJSSAqLworCQljaGFubmVsLT5uZXh0X2J1ZiBePSAxOworCisJCS8qIEFkdmFuY2UgaGFyZHdhcmUgcG9pbnRlciBieSBmcmFnbWVudCBzaXplIGFuZCB3cmFwIGFyb3VuZCAqLworCQljaGFubmVsLT5od3B0ciArPSBjaGFubmVsLT5mcmFnX3N6OworCQljaGFubmVsLT5od3B0ciAlPSBjaGFubmVsLT5idWZfc3o7CisKKwkJLyogT3V0IG9mIGJ1ZmZlcnMgKi8KKwkJaWYgKGNoYW5uZWwtPmZpbGxlZF9mcmFncyA9PSBjaGFubmVsLT5mcmFnX251bSAtIDEpCisJCQlmb3J0ZV9jaGFubmVsX3N0b3AgKGNoYW5uZWwpOworCXJhY2s6CisJCS8qIEFja25vd2xlZGdlIGludGVycnVwdCAqLworICAgICAgICAgICAgICAgIG91dHcgKEZPUlRFX0lSUV9DQVBUVVJFLCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9JUlFfU1RBVFVTKTsKKworCQlzcGluX3VubG9jayAoJmNoaXAtPmxvY2spOworCisJCWlmICh3YWl0cXVldWVfYWN0aXZlICgmY2hhbm5lbC0+d2FpdCkpCisJCQl3YWtlX3VwX2FsbCAoJmNoYW5uZWwtPndhaXQpOwkJCisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qKgorICogZm9ydGVfcHJvY19yZWFkOgorICovCisKK3N0YXRpYyBpbnQKK2ZvcnRlX3Byb2NfcmVhZCAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgCisJCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaSA9IDAsIHBfcmF0ZSwgcF9jaGFuLCByX3JhdGU7CisJdW5zaWduZWQgc2hvcnQgcF9yZWcsIHJfcmVnOworCisJaSArPSBzcHJpbnRmIChwYWdlLCAiRm9ydGVNZWRpYSBGTTgwMSBPU1MgTGl0ZSBkcml2ZXJcbiVzXG4gXG4iLCAKKwkJICAgICAgRFJJVkVSX1ZFUlNJT04pOworCisJaWYgKCFmb3J0ZS0+aW9iYXNlKQorCQlyZXR1cm4gaTsKKworCXBfcmF0ZSA9IHBfY2hhbiA9IC0xOworCXBfcmVnICA9IGludyAoZm9ydGUtPmlvYmFzZSArIEZPUlRFX1BMWV9DVFJMKTsKKwlwX3JhdGUgPSAocF9yZWcgPj4gOCkgJiAxNTsKKwlwX2NoYW4gPSAocF9yZWcgPj4gMTIpICYgMzsKKworIAlpZiAocF9yYXRlID49IDAgfHwgcF9yYXRlIDw9IDEwKQorCQlwX3JhdGUgPSByYXRlc1twX3JhdGVdOworCisJaWYgKHBfY2hhbiA+PSAwIHx8IHBfY2hhbiA8PSAyKQorCQlwX2NoYW4gPSBjaGFubmVsc1twX2NoYW5dOworCisJcl9yYXRlID0gLTE7CisJcl9yZWcgID0gaW53IChmb3J0ZS0+aW9iYXNlICsgRk9SVEVfQ0FQX0NUUkwpOworCXJfcmF0ZSA9IChyX3JlZyA+PiA4KSAmIDE1OworCisgCWlmIChyX3JhdGUgPj0gMCB8fCByX3JhdGUgPD0gMTApCisJCXJfcmF0ZSA9IHJhdGVzW3JfcmF0ZV07IAorCisJaSArPSBzcHJpbnRmIChwYWdlICsgaSwKKwkJICAgICAgIiAgICAgICAgICAgICBQbGF5YmFjayAgQ2FwdHVyZVxuIgorCQkgICAgICAiRklGTyBlbXB0eSA6ICUtM3MgICAgICAgJS0zc1xuIgorCQkgICAgICAiQnVmMSBMYXN0ICA6ICUtM3MgICAgICAgJS0zc1xuIgorCQkgICAgICAiQnVmMiBMYXN0ICA6ICUtM3MgICAgICAgJS0zc1xuIgorCQkgICAgICAiU3RhcnRlZCAgICA6ICUtM3MgICAgICAgJS0zc1xuIgorCQkgICAgICAiUGF1c2VkICAgICA6ICUtM3MgICAgICAgJS0zc1xuIgorCQkgICAgICAiSW1tZWQgU3RvcCA6ICUtM3MgICAgICAgJS0zc1xuIgorCQkgICAgICAiUmF0ZSAgICAgICA6ICUtNWQgICAgICUtNWRcbiIKKwkJICAgICAgIkNoYW5uZWxzICAgOiAlLTVkICAgICAtXG4iCisJCSAgICAgICIxNi1iaXQgICAgIDogJS0zcyAgICAgICAlLTNzXG4iCisJCSAgICAgICJTdGVyZW8gICAgIDogJS0zcyAgICAgICAlLTNzXG4iCisJCSAgICAgICIgXG4iCisJCSAgICAgICJCdWZmZXIgU3ogIDogJS02ZCAgICAlLTZkXG4iCisJCSAgICAgICJGcmFnIFN6ICAgIDogJS02ZCAgICAlLTZkXG4iCisJCSAgICAgICJGcmFnIE51bSAgIDogJS02ZCAgICAlLTZkXG4iCisJCSAgICAgICJGcmFnIG1zZWNzIDogJS02ZCAgICAlLTZkXG4iCisJCSAgICAgICJVc2VkIEZyYWdzIDogJS02ZCAgICAlLTZkXG4iCisJCSAgICAgICJNYXBwZWQgICAgIDogJS0zcyAgICAgICAlLTNzXG4iLAorCQkgICAgICBwX3JlZyAmIDE8PDAgID8gInllcyIgOiAibm8iLAorCQkgICAgICByX3JlZyAmIDE8PDAgID8gInllcyIgOiAibm8iLAorCQkgICAgICBwX3JlZyAmIDE8PDEgID8gInllcyIgOiAibm8iLAorCQkgICAgICByX3JlZyAmIDE8PDEgID8gInllcyIgOiAibm8iLAorCQkgICAgICBwX3JlZyAmIDE8PDIgID8gInllcyIgOiAibm8iLAorCQkgICAgICByX3JlZyAmIDE8PDIgID8gInllcyIgOiAibm8iLAorCQkgICAgICBwX3JlZyAmIDE8PDUgID8gInllcyIgOiAibm8iLAorCQkgICAgICByX3JlZyAmIDE8PDUgID8gInllcyIgOiAibm8iLAorCQkgICAgICBwX3JlZyAmIDE8PDYgID8gInllcyIgOiAibm8iLAorCQkgICAgICByX3JlZyAmIDE8PDYgID8gInllcyIgOiAibm8iLAorCQkgICAgICBwX3JlZyAmIDE8PDcgID8gInllcyIgOiAibm8iLAorCQkgICAgICByX3JlZyAmIDE8PDcgID8gInllcyIgOiAibm8iLAorCQkgICAgICBwX3JhdGUsIHJfcmF0ZSwKKwkJICAgICAgcF9jaGFuLAorCQkgICAgICBwX3JlZyAmIDE8PDE0ID8gInllcyIgOiAibm8iLAorCQkgICAgICByX3JlZyAmIDE8PDE0ID8gInllcyIgOiAibm8iLAorCQkgICAgICBwX3JlZyAmIDE8PDE1ID8gInllcyIgOiAibm8iLAorCQkgICAgICByX3JlZyAmIDE8PDE1ID8gInllcyIgOiAibm8iLAorCQkgICAgICBmb3J0ZS0+cGxheS5idWZfc3osICAgICAgIGZvcnRlLT5yZWMuYnVmX3N6LAorCQkgICAgICBmb3J0ZS0+cGxheS5mcmFnX3N6LCAgICAgIGZvcnRlLT5yZWMuZnJhZ19zeiwKKwkJICAgICAgZm9ydGUtPnBsYXkuZnJhZ19udW0sICAgICBmb3J0ZS0+cmVjLmZyYWdfbnVtLAorCQkgICAgICBmb3J0ZS0+cGxheS5mcmFnX21zZWNzLCAgIGZvcnRlLT5yZWMuZnJhZ19tc2VjcywKKwkJICAgICAgZm9ydGUtPnBsYXkuZmlsbGVkX2ZyYWdzLCBmb3J0ZS0+cmVjLmZpbGxlZF9mcmFncywKKwkJICAgICAgZm9ydGUtPnBsYXkubWFwcGVkID8gInllcyIgOiAibm8iLAorCQkgICAgICBmb3J0ZS0+cmVjLm1hcHBlZCA/ICJ5ZXMiIDogIm5vIgorCQkpOworCisJcmV0dXJuIGk7Cit9CisKKworLyoqCisgKiBmb3J0ZV9wcm9jX2luaXQ6CisgKgorICogQ3JlYXRlcyBkcml2ZXIgaW5mbyBlbnRyaWVzIGluIC9wcm9jCisgKi8KKworc3RhdGljIGludCBfX2luaXQgCitmb3J0ZV9wcm9jX2luaXQgKHZvaWQpCit7CisJaWYgKCFwcm9jX21rZGlyICgiZHJpdmVyL2ZvcnRlIiwgTlVMTCkpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFjcmVhdGVfcHJvY19yZWFkX2VudHJ5ICgiZHJpdmVyL2ZvcnRlL2NoaXAiLCAwLCBOVUxMLCBmb3J0ZV9wcm9jX3JlYWQsIGZvcnRlKSkgeworCQlyZW1vdmVfcHJvY19lbnRyeSAoImRyaXZlci9mb3J0ZSIsIE5VTEwpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRyaXZlci9mb3J0ZS9hYzk3IiwgMCwgTlVMTCwgYWM5N19yZWFkX3Byb2MsIGZvcnRlLT5hYzk3KSkgeworCQlyZW1vdmVfcHJvY19lbnRyeSAoImRyaXZlci9mb3J0ZS9jaGlwIiwgTlVMTCk7CisJCXJlbW92ZV9wcm9jX2VudHJ5ICgiZHJpdmVyL2ZvcnRlIiwgTlVMTCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogZm9ydGVfcHJvY19yZW1vdmU6CisgKgorICogUmVtb3ZlcyBkcml2ZXIgaW5mbyBlbnRyaWVzIGluIC9wcm9jCisgKi8KKworc3RhdGljIHZvaWQKK2ZvcnRlX3Byb2NfcmVtb3ZlICh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5ICgiZHJpdmVyL2ZvcnRlL2FjOTciLCBOVUxMKTsKKwlyZW1vdmVfcHJvY19lbnRyeSAoImRyaXZlci9mb3J0ZS9jaGlwIiwgTlVMTCk7CisJcmVtb3ZlX3Byb2NfZW50cnkgKCJkcml2ZXIvZm9ydGUiLCBOVUxMKTsJCit9CisKKworLyoqCisgKiBmb3J0ZV9jaGlwX2luaXQ6CisgKiBAY2hpcDoJQ2hpcCBpbnN0YW5jZSB0byBpbml0aWFsaXplCisgKgorICogRGVzY3JpcHRpb246CisgKiAJCVJlc2V0cyBjaGlwLCBjb25maWd1cmVzIGNvZGVjIGFuZCByZWdpc3RlcnMgdGhlIGRyaXZlciB3aXRoCisgKiAJCXRoZSBzb3VuZCBzdWJzeXN0ZW0uCisgKgorICogCQlQcmVzcyBhbmQgaG9sZCBTdGFydCBmb3IgOCBzZWNzLCB0aGVuIHN3aXRjaCBvbiBSdW4KKyAqIAkJYW5kIGhvbGQgZm9yIDQgc2Vjb25kcy4gIExldCBnbyBvZiBTdGFydC4gIE51bWJlcnMKKyAqIAkJYXNzdW1lIGEgcHJvcGVybHkgb2lsZWQgVFdHLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0Citmb3J0ZV9jaGlwX2luaXQgKHN0cnVjdCBmb3J0ZV9jaGlwICpjaGlwKQoreworCXU4IHJldmlzaW9uOworCXUxNiBjbWR3OworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYzsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjaGlwLT5wY2lfZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZyZXZpc2lvbik7CisKKwlpZiAocmV2aXNpb24gPj0gMHhCMSkgeworCQljaGlwLT5tdWx0aWNoYW5uZWwgPSAxOworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIk11bHRpLWNoYW5uZWwgZGV2aWNlIGRldGVjdGVkLlxuIik7CisJfQorCisJLyogUmVzZXQgY2hpcCAqLworCW91dHcgKEZPUlRFX0NDX0NPREVDX1JFU0VUIHwgRk9SVEVfQ0NfQUM5N19SRVNFVCwgCisJICAgICAgY2hpcC0+aW9iYXNlICsgRk9SVEVfQ09ERUNfQ1RSTCk7CisJdWRlbGF5KDEwMCk7CisJb3V0dyAoMCwgY2hpcC0+aW9iYXNlICsgRk9SVEVfQ09ERUNfQ1RSTCk7CisKKwkvKiBSZXF1ZXN0IHJlYWQgZnJvbSBBQzk3ICovCisJb3V0dyAoRk9SVEVfQUM5N19SRUFEIHwgKDAgPDwgRk9SVEVfQUM5N19BRERSX1NISUZUKSwgCisJICAgICAgY2hpcC0+aW9iYXNlICsgRk9SVEVfQUM5N19DTUQpOworCW1kZWxheSg3NTApOworCisJaWYgKChpbncgKGNoaXAtPmlvYmFzZSArIEZPUlRFX0FDOTdfQ01EKSAmICgzPDw4KSkgIT0gKDE8PDgpKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQUM5NyBjb2RlYyBub3QgcmVzcG9uZGluZyIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBJbml0IHZvbHVtZSAqLworCW91dHcgKDB4MDgwOCwgY2hpcC0+aW9iYXNlICsgRk9SVEVfUENNX1ZPTCk7CisJb3V0dyAoMHg5ZjFmLCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9GTV9WT0wpOworCW91dHcgKDB4ODgwOCwgY2hpcC0+aW9iYXNlICsgRk9SVEVfSTJTX1ZPTCk7CisKKwkvKiBJMlMgY29udHJvbCAtIEkyUyBtb2RlICovCisJb3V0dyAoMHgwMDAzLCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9JMlNfTU9ERSk7CisKKwkvKiBJbnRlcnJ1cHQgc2V0dXAgLSB1bm1hc2sgUExBWUJBQ0sgJiBDQVBUVVJFICovCisJY21kdyA9IGludyAoY2hpcC0+aW9iYXNlICsgRk9SVEVfSVJRX01BU0spOworCWNtZHcgJj0gfjB4MDAwMzsKKwlvdXR3IChjbWR3LCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9JUlFfTUFTSyk7CisKKwkvKiBJbnRlcnJ1cHQgY2xlYXIgKi8KKwlvdXR3IChGT1JURV9JUlFfUExBWUJBQ0t8Rk9SVEVfSVJRX0NBUFRVUkUsIAorCSAgICAgIGNoaXAtPmlvYmFzZSArIEZPUlRFX0lSUV9TVEFUVVMpOworCisJLyogU2V0IHVwIHRoZSBBQzk3IGNvZGVjICovCisJaWYgKChjb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY29kZWMtPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJY29kZWMtPmNvZGVjX3JlYWQgPSBmb3J0ZV9hYzk3X3JlYWQ7CisJY29kZWMtPmNvZGVjX3dyaXRlID0gZm9ydGVfYWM5N193cml0ZTsKKwljb2RlYy0+aWQgPSAwOworCisJaWYgKGFjOTdfcHJvYmVfY29kZWMgKGNvZGVjKSA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjb2RlYyBwcm9iZSBmYWlsZWRcbiIpOworCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogUmVnaXN0ZXIgbWl4ZXIgKi8KKwlpZiAoKGNvZGVjLT5kZXZfbWl4ZXIgPSAKKwkgICAgIHJlZ2lzdGVyX3NvdW5kX21peGVyICgmZm9ydGVfbWl4ZXJfZm9wcywgLTEpKSA8IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNvdWxkbid0IHJlZ2lzdGVyIG1peGVyIVxuIik7CisJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisJCXJldHVybiAtMTsKKwl9CisKKwljaGlwLT5hYzk3ID0gY29kZWM7CisKKwkvKiBSZWdpc3RlciBEU1AgKi8KKwlpZiAoKGNoaXAtPmRzcCA9IHJlZ2lzdGVyX3NvdW5kX2RzcCAoJmZvcnRlX2RzcF9mb3BzLCAtMSkgKSA8IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNvdWxkbid0IHJlZ2lzdGVyIGRzcCFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogUmVnaXN0ZXIgd2l0aCAvcHJvYyAqLworCWlmIChmb3J0ZV9wcm9jX2luaXQoKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY291bGRuJ3QgYWRkIGVudHJpZXMgdG8gL3Byb2MhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogZm9ydGVfcHJvYmU6CisgKiBAcGNpX2RldjoJUENJIHN0cnVjdCBmb3IgcHJvYmVkIGRldmljZQorICogQHBjaV9pZDoJCisgKgorICogRGVzY3JpcHRpb246CisgKgkJQWxsb2NhdGVzIGNoaXAgaW5zdGFuY2UsIEkvTyByZWdpb24sIGFuZCBJUlEKKyAqLworc3RhdGljIGludCBfX2luaXQgCitmb3J0ZV9wcm9iZSAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXA7CisJaW50IHJldCA9IDA7CisKKwkvKiBGSVhNRTogU3VwcG9ydCBtb3JlIHRoYW4gb25lIGNoaXAgKi8KKwlpZiAoZm91bmQrKykKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBJZ25pdGlvbiAqLworCWlmIChwY2lfZW5hYmxlX2RldmljZSAocGNpX2RldikpCisJCXJldHVybiAtRUlPOworCisJcGNpX3NldF9tYXN0ZXIgKHBjaV9kZXYpOworCisJLyogQWxsb2NhdGUgY2hpcCBpbnN0YW5jZSBhbmQgY29uZmlndXJlICovCisJZm9ydGUgPSAoc3RydWN0IGZvcnRlX2NoaXAgKikgCisJCWttYWxsb2MgKHNpemVvZiAoc3RydWN0IGZvcnRlX2NoaXApLCBHRlBfS0VSTkVMKTsKKwljaGlwID0gZm9ydGU7CisKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIFBGWCAiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQgKGNoaXAsIDAsIHNpemVvZiAoc3RydWN0IGZvcnRlX2NoaXApKTsKKwljaGlwLT5wY2lfZGV2ID0gcGNpX2RldjsKKworCWluaXRfTVVURVgoJmNoaXAtPm9wZW5fc2VtKTsKKwlzcGluX2xvY2tfaW5pdCAoJmNoaXAtPmxvY2spOworCXNwaW5fbG9ja19pbml0ICgmY2hpcC0+YWM5N19sb2NrKTsKKworCWlmICghIHJlcXVlc3RfcmVnaW9uIChwY2lfcmVzb3VyY2Vfc3RhcnQgKHBjaV9kZXYsIDApLAorCQkJICAgICAgcGNpX3Jlc291cmNlX2xlbiAocGNpX2RldiwgMCksIERSSVZFUl9OQU1FKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBQRlggIlVuYWJsZSB0byByZXNlcnZlIEkvTyBzcGFjZSIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCWNoaXAtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGNpX2RldiwgMCk7CisJY2hpcC0+aXJxID0gcGNpX2Rldi0+aXJxOworCisJaWYgKHJlcXVlc3RfaXJxIChjaGlwLT5pcnEsIGZvcnRlX2ludGVycnVwdCwgU0FfU0hJUlEsIERSSVZFUl9OQU1FLAorCQkJIGNoaXApKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIFBGWCAiVW5hYmxlIHRvIHJlc2VydmUgSVJRIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQkJCisJCisJcGNpX3NldF9kcnZkYXRhIChwY2lfZGV2LCBjaGlwKTsKKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiRk04MDEgY2hpcCBmb3VuZCBhdCAweCUwNGxYLTB4JTA0bFggSVJRICV1XG4iLCAKKwkJY2hpcC0+aW9iYXNlLCBwY2lfcmVzb3VyY2VfZW5kIChwY2lfZGV2LCAwKSwgY2hpcC0+aXJxKTsKKworCS8qIFBvd2VyIGl0IHVwICovCisJaWYgKChyZXQgPSBmb3J0ZV9jaGlwX2luaXQgKGNoaXApKSA9PSAwKQorCQlyZXR1cm4gMDsKKworIGVycm9yOgorCWlmIChjaGlwLT5pcnEpCisJCWZyZWVfaXJxIChjaGlwLT5pcnEsIGNoaXApOworCisJaWYgKGNoaXAtPmlvYmFzZSkgCisJCXJlbGVhc2VfcmVnaW9uIChwY2lfcmVzb3VyY2Vfc3RhcnQgKHBjaV9kZXYsIDApLAorCQkJCXBjaV9yZXNvdXJjZV9sZW4gKHBjaV9kZXYsIDApKTsKKwkJCisJa2ZyZWUgKGNoaXApOworCisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIGZvcnRlX3JlbW92ZToKKyAqIEBwY2lfZGV2OglQQ0kgZGV2aWNlIHRvIHVuY2xhaW0KKyAqCisgKi8KKworc3RhdGljIHZvaWQgCitmb3J0ZV9yZW1vdmUgKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBmb3J0ZV9jaGlwICpjaGlwID0gcGNpX2dldF9kcnZkYXRhIChwY2lfZGV2KTsKKworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIFR1cm4gdm9sdW1lIGRvd24gdG8gYXZvaWQgcG9wcGluZyAqLworCW91dHcgKDB4MWYxZiwgY2hpcC0+aW9iYXNlICsgRk9SVEVfUENNX1ZPTCk7CisJb3V0dyAoMHgxZjFmLCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9GTV9WT0wpOworCW91dHcgKDB4MWYxZiwgY2hpcC0+aW9iYXNlICsgRk9SVEVfSTJTX1ZPTCk7CisKKwlmb3J0ZV9wcm9jX3JlbW92ZSgpOworCWZyZWVfaXJxIChjaGlwLT5pcnEsIGNoaXApOworCXJlbGVhc2VfcmVnaW9uIChjaGlwLT5pb2Jhc2UsIHBjaV9yZXNvdXJjZV9sZW4gKHBjaV9kZXYsIDApKTsKKworCXVucmVnaXN0ZXJfc291bmRfZHNwIChjaGlwLT5kc3ApOworCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIgKGNoaXAtPmFjOTctPmRldl9taXhlcik7CisJYWM5N19yZWxlYXNlX2NvZGVjKGNoaXAtPmFjOTcpOworCWtmcmVlIChjaGlwKTsKKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiZHJpdmVyIHJlbGVhc2VkXG4iKTsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZm9ydGVfcGNpX2lkc1tdID0geworCXsgMHgxMzE5LCAweDA4MDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCisJeyAwLCB9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBmb3J0ZV9wY2lfZHJpdmVyID0geworCS5uYW1lCQkJPSBEUklWRVJfTkFNRSwKKwkuaWRfdGFibGUJCT0gZm9ydGVfcGNpX2lkcywKKwkucHJvYmUJIAkJPSBmb3J0ZV9wcm9iZSwKKwkucmVtb3ZlCQkJPSBmb3J0ZV9yZW1vdmUsCisKK307CisKKworLyoqCisgKiBmb3J0ZV9pbml0X21vZHVsZToKKyAqCisgKi8KKworc3RhdGljIGludCBfX2luaXQKK2ZvcnRlX2luaXRfbW9kdWxlICh2b2lkKQoreworCXByaW50ayAoS0VSTl9JTkZPIFBGWCBEUklWRVJfVkVSU0lPTiAiXG4iKTsKKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyICgmZm9ydGVfcGNpX2RyaXZlcik7Cit9CisKKworLyoqCisgKiBmb3J0ZV9jbGVhbnVwX21vZHVsZToKKyAqCisgKi8KKworc3RhdGljIHZvaWQgX19leGl0IAorZm9ydGVfY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmZm9ydGVfcGNpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoZm9ydGVfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZm9ydGVfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1rcEBta3AubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGb3J0ZU1lZGlhIEZNODAxIE9TUyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgZm9ydGVfcGNpX2lkcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZ3VzLmggYi9zb3VuZC9vc3MvZ3VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1MjcxYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9ndXMuaApAQCAtMCwwICsxLDI0IEBACisKKyNpbmNsdWRlICJhZDE4NDguaCIKKworLyoJRnJvbSBndXNfY2FyZC5jICovCitpbnQgZ3VzX3NldF9taWRpX2lycShpbnQgbnVtKTsKK2lycXJldHVybl90IGd1c2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIGR1bW15KTsKKworLyoJRnJvbSBndXNfd2F2ZS5jICovCitpbnQgZ3VzX3dhdmVfZGV0ZWN0KGludCBiYXNlYWRkcik7Cit2b2lkIGd1c193YXZlX2luaXQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKTsKK3ZvaWQgZ3VzX3dhdmVfdW5sb2FkIChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOwordm9pZCBndXNfdm9pY2VfaXJxKHZvaWQpOwordm9pZCBndXNfd3JpdGU4KGludCByZWcsIHVuc2lnbmVkIGludCBkYXRhKTsKK3ZvaWQgZ3Vzd2F2ZV9kbWFfaXJxKHZvaWQpOwordm9pZCBndXNfZGVsYXkodm9pZCk7CitpbnQgZ3VzX2RlZmF1bHRfbWl4ZXJfaW9jdGwgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOwordm9pZCBndXNfdGltZXJfY29tbWFuZCAodW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCB2YWwpOworCisvKglGcm9tIGd1c19taWRpLmMgKi8KK3ZvaWQgZ3VzX21pZGlfaW5pdChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOwordm9pZCBndXNfbWlkaV9pbnRlcnJ1cHQoaW50IGR1bW15KTsKKworLyoJRnJvbSBpY3MyMTAxLmMgKi8KK2ludCBpY3MyMTAxX21peGVyX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZ3VzX2NhcmQuYyBiL3NvdW5kL29zcy9ndXNfY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjI5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZ3VzX2NhcmQuYwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIHNvdW5kL2d1c19jYXJkLmMKKyAqCisgKiBEZXRlY3Rpb24gcm91dGluZSBmb3IgdGhlIEdyYXZpcyBVbHRyYXNvdW5kLgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKgorICogRnJhbmsgdmFuIGRlIFBvbCA6IEZpeGVkIEdVUyBNQVggaW50ZXJydXB0IGhhbmRsaW5nLCBlbmFibGVkIHNpbXVsdGFuaW91cworICogICAgICAgICAgICAgICAgICAgIHVzYWdlIG9mIENTNDIzMUEgY29kZWMsIEdVUyB3YXZlIGFuZCBNSURJIGZvciBHVVMgTUFYLgorICogQ2hyaXN0b3BoIEhlbGx3aWc6IEFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQsIHNpbXBsZSBjbGVhbnVwcy4KKyAqCisgKiBTdGF0dXM6CisgKiAgICAgICAgICAgICAgVGVzdGVkLi4uIAorICovCisgICAgICAKKyAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgImd1cy5oIgorI2luY2x1ZGUgImd1c19ody5oIgorCitpcnFyZXR1cm5fdCBndXNpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KTsKKworaW50ICAgICAgICAgICAgIGd1c19iYXNlID0gMCwgZ3VzX2lycSA9IDAsIGd1c19kbWEgPSAwOworaW50ICAgICAgICAgICAgIGd1c19ub193YXZlX2RtYSA9IDA7IAorZXh0ZXJuIGludCAgICAgIGd1c193YXZlX3ZvbHVtZTsKK2V4dGVybiBpbnQgICAgICBndXNfcGNtX3ZvbHVtZTsKK2V4dGVybiBpbnQgICAgICBoYXZlX2d1c19tYXg7CitpbnQgICAgICAgICAgICAgZ3VzX3BucF9mbGFnID0gMDsKKyNpZmRlZiBDT05GSUdfU09VTkRfR1VTMTYKK3N0YXRpYyBpbnQgICAgICBkYjE2OwkvKiBIYXMgYSBHdXMxNiBBRDE4NDggb24gaXQgKi8KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX2d1cyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJZ3VzX3dhdmVfaW5pdChod19jb25maWcpOworCisJaWYgKHNvdW5kX2FsbG9jX2RtYShod19jb25maWctPmRtYSwgIkdVUyIpKQorCQlwcmludGsoS0VSTl9FUlIgImd1c19jYXJkLmM6IENhbid0IGFsbG9jYXRlIERNQSBjaGFubmVsICVkXG4iLCBod19jb25maWctPmRtYSk7CisJaWYgKGh3X2NvbmZpZy0+ZG1hMiAhPSAtMSAmJiBod19jb25maWctPmRtYTIgIT0gaHdfY29uZmlnLT5kbWEpCisJCWlmIChzb3VuZF9hbGxvY19kbWEoaHdfY29uZmlnLT5kbWEyLCAiR1VTKDIpIikpCisJCQlwcmludGsoS0VSTl9FUlIgImd1c19jYXJkLmM6IENhbid0IGFsbG9jYXRlIERNQSBjaGFubmVsICVkXG4iLCBod19jb25maWctPmRtYTIpOworCWd1c19taWRpX2luaXQoaHdfY29uZmlnKTsKKwlpZihyZXF1ZXN0X2lycShod19jb25maWctPmlycSwgZ3VzaW50ciwgMCwgICJHcmF2aXMgVWx0cmFzb3VuZCIsIGh3X2NvbmZpZyk8MCkKKwkJcHJpbnRrKEtFUk5fRVJSICJndXNfY2FyZC5jOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRICVkXG4iLCBod19jb25maWctPmlycSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX2d1cyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJaW50ICAgICAgICAgICAgIGlycTsKKwlpbnQgICAgICAgICAgICAgaW9fYWRkcjsKKworCWlmIChod19jb25maWctPmNhcmRfc3VidHlwZSA9PSAxKQorCQlndXNfcG5wX2ZsYWcgPSAxOworCisJaXJxID0gaHdfY29uZmlnLT5pcnE7CisKKwlpZiAoaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUgPT0gMCkJLyogR1VTL01BWC9BQ0UgKi8KKwkJaWYgKGlycSAhPSAzICYmIGlycSAhPSA1ICYmIGlycSAhPSA3ICYmIGlycSAhPSA5ICYmCisJCSAgICBpcnEgIT0gMTEgJiYgaXJxICE9IDEyICYmIGlycSAhPSAxNSkKKwkJICB7CisJCQkgIHByaW50ayhLRVJOX0VSUiAiR1VTOiBVbnN1cHBvcnRlZCBJUlEgJWRcbiIsIGlycSk7CisJCQkgIHJldHVybiAwOworCQkgIH0KKwlpZiAoZ3VzX3dhdmVfZGV0ZWN0KGh3X2NvbmZpZy0+aW9fYmFzZSkpCisJCXJldHVybiAxOworCisjaWZuZGVmIEVYQ0xVREVfR1VTX0lPREVURUNUCisKKwkvKgorCSAqIExvb2sgYXQgdGhlIHBvc3NpYmxlIGJhc2UgYWRkcmVzc2VzICgweDJYMCwgWD0xLCAyLCAzLCA0LCA1LCA2KQorCSAqLworCisJZm9yIChpb19hZGRyID0gMHgyMTA7IGlvX2FkZHIgPD0gMHgyNjA7IGlvX2FkZHIgKz0gMHgxMCkgeworCQlpZiAoaW9fYWRkciA9PSBod19jb25maWctPmlvX2Jhc2UpCS8qIEFscmVhZHkgdGVzdGVkICovCisJCQljb250aW51ZTsKKwkJaWYgKGd1c193YXZlX2RldGVjdChpb19hZGRyKSkgeworCQkJaHdfY29uZmlnLT5pb19iYXNlID0gaW9fYWRkcjsKKwkJCXJldHVybiAxOworCQl9CisJfQorI2VuZGlmCisKKwlwcmludGsoIk5PIEdVUyBjYXJkIGZvdW5kICFcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX2d1cyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJRERCKHByaW50aygidW5sb2FkX2d1cygleClcbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSkpOworCisJZ3VzX3dhdmVfdW5sb2FkKGh3X2NvbmZpZyk7CisKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDE2KTsKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UgKyAweDEwMCwgMTIpOwkJLyogMHgxMGMtPiBpcyBNQVggKi8KKwlmcmVlX2lycShod19jb25maWctPmlycSwgaHdfY29uZmlnKTsKKworCXNvdW5kX2ZyZWVfZG1hKGh3X2NvbmZpZy0+ZG1hKTsKKworCWlmIChod19jb25maWctPmRtYTIgIT0gLTEgJiYgaHdfY29uZmlnLT5kbWEyICE9IGh3X2NvbmZpZy0+ZG1hKQorCQlzb3VuZF9mcmVlX2RtYShod19jb25maWctPmRtYTIpOworfQorCitpcnFyZXR1cm5fdCBndXNpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KQoreworCXVuc2lnbmVkIGNoYXIgc3JjOworCWV4dGVybiBpbnQgZ3VzX3RpbWVyX2VuYWJsZWQ7CisJaW50IGhhbmRsZWQgPSAwOworCisjaWZkZWYgQ09ORklHX1NPVU5EX0dVU01BWAorCWlmIChoYXZlX2d1c19tYXgpIHsKKwkJc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnID0gZGV2X2lkOworCQlhZGludHIoaXJxLCAodm9pZCAqKWh3X2NvbmZpZy0+c2xvdHNbMV0sIE5VTEwpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT1VORF9HVVMxNgorCWlmIChkYjE2KSB7CisJCXN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZyA9IGRldl9pZDsKKwkJYWRpbnRyKGlycSwgKHZvaWQgKilod19jb25maWctPnNsb3RzWzNdLCBOVUxMKTsKKwl9CisjZW5kaWYKKworCXdoaWxlICgxKQorCXsKKwkJaWYgKCEoc3JjID0gaW5iKHVfSXJxU3RhdHVzKSkpCisJCQlicmVhazsKKwkJaGFuZGxlZCA9IDE7CisJCWlmIChzcmMgJiBETUFfVENfSVJRKQorCQl7CisJCQlndXN3YXZlX2RtYV9pcnEoKTsKKwkJfQorCQlpZiAoc3JjICYgKE1JRElfVFhfSVJRIHwgTUlESV9SWF9JUlEpKQorCQl7CisJCQlndXNfbWlkaV9pbnRlcnJ1cHQoMCk7CisJCX0KKwkJaWYgKHNyYyAmIChHRjFfVElNRVIxX0lSUSB8IEdGMV9USU1FUjJfSVJRKSkKKwkJeworCQkJaWYgKGd1c190aW1lcl9lbmFibGVkKQorCQkJCXNvdW5kX3RpbWVyX2ludGVycnVwdCgpOworCQkJZ3VzX3dyaXRlOCgweDQ1LCAwKTsJLyogQWNrIElSUSAqLworCQkJZ3VzX3RpbWVyX2NvbW1hbmQoNCwgMHg4MCk7CQkvKiBSZXNldCBJUlEgZmxhZ3MgKi8KKwkJfQorCQlpZiAoc3JjICYgKFdBVkVUQUJMRV9JUlEgfCBFTlZFTE9QRV9JUlEpKQorCQkJZ3VzX3ZvaWNlX2lycSgpOworCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyoKKyAqCVNvbWUgZXh0cmEgY29kZSBmb3IgdGhlIDE2IGJpdCBzYW1wbGluZyBvcHRpb24KKyAqLworCisjaWZkZWYgQ09ORklHX1NPVU5EX0dVUzE2CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZ3VzX2RiMTYoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7CisKKwlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCwgImFkMTg0OCIpOworCWlmICghcG9ydHMpCisJCXJldHVybiAwOworCisJaWYgKCFhZDE4NDhfZGV0ZWN0KHBvcnRzLCBOVUxMLCBod19jb25maWctPm9zcCkpIHsKKwkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZ3VzX3BjbV92b2x1bWUgPSAxMDA7CisJZ3VzX3dhdmVfdm9sdW1lID0gOTA7CisKKwlod19jb25maWctPnNsb3RzWzNdID0gYWQxODQ4X2luaXQoIkdVUyAxNiBiaXQgc2FtcGxpbmciLCBwb3J0cywKKwkJCQkJICBod19jb25maWctPmlycSwKKwkJCQkJICBod19jb25maWctPmRtYSwKKwkJCQkJICBod19jb25maWctPmRtYSwgMCwKKwkJCQkJICBod19jb25maWctPm9zcCwKKwkJCQkJICBUSElTX01PRFVMRSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfZ3VzX2RiMTYoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCisJYWQxODQ4X3VubG9hZChod19jb25maWctPmlvX2Jhc2UsCisJCSAgICAgIGh3X2NvbmZpZy0+aXJxLAorCQkgICAgICBod19jb25maWctPmRtYSwKKwkJICAgICAgaHdfY29uZmlnLT5kbWEsIDApOworCXNvdW5kX3VubG9hZF9hdWRpb2Rldihod19jb25maWctPnNsb3RzWzNdKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NPVU5EX0dVUzE2CitzdGF0aWMgaW50IGd1czE2OworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NPVU5EX0dVU01BWAorc3RhdGljIGludCBub193YXZlX2RtYTsgICAvKiBTZXQgaWYgbm8gZG1hIGlzIHRvIGJlIHVzZWQgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXZlIHRhYmxlIChHRjEgY2hpcCkgKi8KKyNlbmRpZgorCisKKy8qCisgKiAgICBOb3RlIERNQTIgb2YgLTEgaGFzIHRoZSByaWdodCBtZWFuaW5nIGluIHRoZSBHVVMgZHJpdmVyIGFzIHdlbGwKKyAqICAgICAgYXMgaGVyZS4gCisgKi8KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8gPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWExNiA9IC0xOwkvKiBTZXQgdGhpcyBmb3IgbW9kdWxlcyB0aGF0IG5lZWQgaXQgKi8KK3N0YXRpYyBpbnQgX19pbml0ZGF0YSB0eXBlID0gMDsJCS8qIDEgZm9yIFBuUCAqLworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWExNiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0eXBlLCBpbnQsIDApOworI2lmZGVmIENPTkZJR19TT1VORF9HVVNNQVgKK21vZHVsZV9wYXJhbShub193YXZlX2RtYSwgaW50LCAwKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT1VORF9HVVMxNgorbW9kdWxlX3BhcmFtKGRiMTYsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZ3VzMTYsIGludCwgMCk7CisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ndXModm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJHcmF2aXMgVWx0cmFzb3VuZCBhdWRpbyBkcml2ZXIgQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NlxuIik7CisKKwljZmcuaW9fYmFzZSA9IGlvOworCWNmZy5pcnEgPSBpcnE7CisJY2ZnLmRtYSA9IGRtYTsKKwljZmcuZG1hMiA9IGRtYTE2OworCWNmZy5jYXJkX3N1YnR5cGUgPSB0eXBlOworI2lmZGVmIENPTkZJR19TT1VORF9HVVNNQVgKKwlndXNfbm9fd2F2ZV9kbWEgPSBub193YXZlX2RtYTsKKyNlbmRpZgorCisJaWYgKGNmZy5pb19iYXNlID09IC0xIHx8IGNmZy5kbWEgPT0gLTEgfHwgY2ZnLmlycSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgIkkvTywgSVJRLCBhbmQgRE1BIGFyZSBtYW5kYXRvcnlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU09VTkRfR1VTMTYKKwlpZiAoZ3VzMTYgJiYgaW5pdF9ndXNfZGIxNigmY2ZnKSkKKwkJZGIxNiA9IDE7CisjZW5kaWYKKwlpZiAoIXByb2JlX2d1cygmY2ZnKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYXR0YWNoX2d1cygmY2ZnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9ndXModm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU09VTkRfR1VTMTYKKwlpZiAoZGIxNikKKwkJdW5sb2FkX2d1c19kYjE2KCZjZmcpOworI2VuZGlmCisJdW5sb2FkX2d1cygmY2ZnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ndXMpOworbW9kdWxlX2V4aXQoY2xlYW51cF9ndXMpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfZ3VzKGNoYXIgKnN0cikKK3sKKwkvKiBpbywgaXJxLCBkbWEsIGRtYTIgKi8KKwlpbnQgaW50c1s1XTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvCT0gaW50c1sxXTsKKwlpcnEJPSBpbnRzWzJdOworCWRtYQk9IGludHNbM107CisJZG1hMTYJPSBpbnRzWzRdOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImd1cz0iLCBzZXR1cF9ndXMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZ3VzX2h3LmggYi9zb3VuZC9vc3MvZ3VzX2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3YTBiOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9ndXNfaHcuaApAQCAtMCwwICsxLDUwIEBACisKKy8qCisgKiBJL08gYWRkcmVzc2VzCisgKi8KKworI2RlZmluZSB1X0Jhc2UJCQkoZ3VzX2Jhc2UgKyAweDAwMCkKKyNkZWZpbmUgdV9NaXhlcgkJCXVfQmFzZQorI2RlZmluZSB1X1N0YXR1cwkJKGd1c19iYXNlICsgMHgwMDYpCisjZGVmaW5lIHVfVGltZXJDb250cm9sCQkoZ3VzX2Jhc2UgKyAweDAwOCkKKyNkZWZpbmUgdV9UaW1lckRhdGEJCShndXNfYmFzZSArIDB4MDA5KQorI2RlZmluZSB1X0lSUURNQUNvbnRyb2wJCShndXNfYmFzZSArIDB4MDBiKQorI2RlZmluZSB1X01pZGlDb250cm9sCQkoZ3VzX2Jhc2UgKyAweDEwMCkKKyNkZWZpbmUgCU1JRElfUkVTRVQJCTB4MDMKKyNkZWZpbmUJCU1JRElfRU5BQkxFX1hNSVQJMHgyMAorI2RlZmluZQkJTUlESV9FTkFCTEVfUkNWCQkweDgwCisjZGVmaW5lIHVfTWlkaVN0YXR1cwkJdV9NaWRpQ29udHJvbAorI2RlZmluZQkJTUlESV9SQ1ZfRlVMTAkJMHgwMQorI2RlZmluZSAJTUlESV9YTUlUX0VNUFRZCQkweDAyCisjZGVmaW5lIAlNSURJX0ZSQU1FX0VSUgkJMHgxMAorI2RlZmluZSAJTUlESV9PVkVSUlVOCQkweDIwCisjZGVmaW5lIAlNSURJX0lSUV9QRU5ECQkweDgwCisjZGVmaW5lIHVfTWlkaURhdGEJCShndXNfYmFzZSArIDB4MTAxKQorI2RlZmluZSB1X1ZvaWNlCQkJKGd1c19iYXNlICsgMHgxMDIpCisjZGVmaW5lIHVfQ29tbWFuZAkJKGd1c19iYXNlICsgMHgxMDMpCisjZGVmaW5lIHVfRGF0YUxvCQkoZ3VzX2Jhc2UgKyAweDEwNCkKKyNkZWZpbmUgdV9EYXRhSGkJCShndXNfYmFzZSArIDB4MTA1KQorI2RlZmluZSB1X01peERhdGEgICAgICAgICAgICAgICAoZ3VzX2Jhc2UgKyAweDEwNikgICAvKiBSZXYuIDMuNysgbWl4aW5nICovCisjZGVmaW5lIHVfTWl4U2VsZWN0ICAgICAgICAgICAgIChndXNfYmFzZSArIDB4NTA2KSAgIC8qIHJlZ2lzdGVycy4gICAgICAgKi8KKyNkZWZpbmUgdV9JcnFTdGF0dXMJCXVfU3RhdHVzCisjCWRlZmluZSBNSURJX1RYX0lSUQkJMHgwMQkvKiBwZW5kaW5nIE1JREkgeG1pdCBJUlEgKi8KKyMJZGVmaW5lIE1JRElfUlhfSVJRCQkweDAyCS8qIHBlbmRpbmcgTUlESSByZWN2IElSUSAqLworIwlkZWZpbmUgR0YxX1RJTUVSMV9JUlEJCTB4MDQJLyogZ2VuZXJhbCBwdXJwb3NlIHRpbWVyICovCisjCWRlZmluZSBHRjFfVElNRVIyX0lSUQkJMHgwOAkvKiBnZW5lcmFsIHB1cnBvc2UgdGltZXIgKi8KKyMJZGVmaW5lIFdBVkVUQUJMRV9JUlEJCTB4MjAJLyogcGVuZGluZyB3YXZldGFibGUgSVJRICovCisjCWRlZmluZSBFTlZFTE9QRV9JUlEJCTB4NDAJLyogcGVuZGluZyB2b2x1bWUgZW52ZWxvcGUgSVJRICovCisjCWRlZmluZSBETUFfVENfSVJRCQkweDgwCS8qIHBlbmRpbmcgZG1hIHRjIElSUSAqLworCisjZGVmaW5lIElDUzIxMDEJCTEKKyMJZGVmaW5lIElDU19NSVhERVZTCTYKKyMJZGVmaW5lIERFVl9NSUMJCTAKKyMJZGVmaW5lIERFVl9MSU5FCQkxCisjCWRlZmluZSBERVZfQ0QJCTIKKyMJZGVmaW5lIERFVl9HRjEJCTMKKyMJZGVmaW5lIERFVl9VTlVTRUQJNAorIwlkZWZpbmUgREVWX1ZPTAkJNQorCisjCWRlZmluZSBDSE5fTEVGVAkJMAorIwlkZWZpbmUgQ0hOX1JJR0hUCTEKKyNkZWZpbmUgQ1M0MjMxCQkyCisjZGVmaW5lIHVfRFJBTUlPCQkoZ3VzX2Jhc2UgKyAweDEwNykKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ndXNfbGluZWFydm9sLmggYi9zb3VuZC9vc3MvZ3VzX2xpbmVhcnZvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDBjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZ3VzX2xpbmVhcnZvbC5oCkBAIC0wLDAgKzEsMTggQEAKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBndXNfbGluZWFydm9sWzEyOF0gPSB7CisgMHgwMDAwLCAweDA4ZmYsIDB4MDlmZiwgMHgwYTgwLCAweDBhZmYsIDB4MGI0MCwgMHgwYjgwLCAweDBiYzAsCisgMHgwYmZmLCAweDBjMjAsIDB4MGM0MCwgMHgwYzYwLCAweDBjODAsIDB4MGNhMCwgMHgwY2MwLCAweDBjZTAsCisgMHgwY2ZmLCAweDBkMTAsIDB4MGQyMCwgMHgwZDMwLCAweDBkNDAsIDB4MGQ1MCwgMHgwZDYwLCAweDBkNzAsCisgMHgwZDgwLCAweDBkOTAsIDB4MGRhMCwgMHgwZGIwLCAweDBkYzAsIDB4MGRkMCwgMHgwZGUwLCAweDBkZjAsCisgMHgwZGZmLCAweDBlMDgsIDB4MGUxMCwgMHgwZTE4LCAweDBlMjAsIDB4MGUyOCwgMHgwZTMwLCAweDBlMzgsCisgMHgwZTQwLCAweDBlNDgsIDB4MGU1MCwgMHgwZTU4LCAweDBlNjAsIDB4MGU2OCwgMHgwZTcwLCAweDBlNzgsCisgMHgwZTgwLCAweDBlODgsIDB4MGU5MCwgMHgwZTk4LCAweDBlYTAsIDB4MGVhOCwgMHgwZWIwLCAweDBlYjgsCisgMHgwZWMwLCAweDBlYzgsIDB4MGVkMCwgMHgwZWQ4LCAweDBlZTAsIDB4MGVlOCwgMHgwZWYwLCAweDBlZjgsCisgMHgwZWZmLCAweDBmMDQsIDB4MGYwOCwgMHgwZjBjLCAweDBmMTAsIDB4MGYxNCwgMHgwZjE4LCAweDBmMWMsCisgMHgwZjIwLCAweDBmMjQsIDB4MGYyOCwgMHgwZjJjLCAweDBmMzAsIDB4MGYzNCwgMHgwZjM4LCAweDBmM2MsCisgMHgwZjQwLCAweDBmNDQsIDB4MGY0OCwgMHgwZjRjLCAweDBmNTAsIDB4MGY1NCwgMHgwZjU4LCAweDBmNWMsCisgMHgwZjYwLCAweDBmNjQsIDB4MGY2OCwgMHgwZjZjLCAweDBmNzAsIDB4MGY3NCwgMHgwZjc4LCAweDBmN2MsCisgMHgwZjgwLCAweDBmODQsIDB4MGY4OCwgMHgwZjhjLCAweDBmOTAsIDB4MGY5NCwgMHgwZjk4LCAweDBmOWMsCisgMHgwZmEwLCAweDBmYTQsIDB4MGZhOCwgMHgwZmFjLCAweDBmYjAsIDB4MGZiNCwgMHgwZmI4LCAweDBmYmMsCisgMHgwZmMwLCAweDBmYzQsIDB4MGZjOCwgMHgwZmNjLCAweDBmZDAsIDB4MGZkNCwgMHgwZmQ4LCAweDBmZGMsCisgMHgwZmUwLCAweDBmZTQsIDB4MGZlOCwgMHgwZmVjLCAweDBmZjAsIDB4MGZmNCwgMHgwZmY4LCAweDBmZmMKK307CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZ3VzX21pZGkuYyBiL3NvdW5kL29zcy9ndXNfbWlkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OGY1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZ3VzX21pZGkuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIHNvdW5kL2d1czJfbWlkaS5jCisgKgorICogVGhlIGxvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSBHVVMgTWlkaSBJbnRlcmZhY2UuCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqIENoYW5nZXM6CisgKiAxMS0xMC0yMDAwCUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGJrekBsaW51eC1pZGUub3JnPgorICoJCUFkZGVkIF9faW5pdCB0byBndXNfbWlkaV9pbml0KCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJndXMuaCIKKyNpbmNsdWRlICJndXNfaHcuaCIKKworc3RhdGljIGludCAgICAgIG1pZGlfYnVzeSwgaW5wdXRfb3BlbmVkOworc3RhdGljIGludCAgICAgIG15X2RldjsKK3N0YXRpYyBpbnQgICAgICBvdXRwdXRfdXNlZDsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGd1c19taWRpX2NvbnRyb2w7CitzdGF0aWMgdm9pZCAgICAgKCptaWRpX2lucHV0X2ludHIpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciB0bXBfcXVldWVbMjU2XTsKK2V4dGVybiBpbnQgICAgICBndXNfcG5wX2ZsYWc7CitzdGF0aWMgdm9sYXRpbGUgaW50IHFsZW47CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBxaGVhZCwgcXRhaWw7CitleHRlcm4gaW50ICAgICAgZ3VzX2Jhc2UsIGd1c19pcnEsIGd1c19kbWE7CitleHRlcm4gaW50ICAgICAqZ3VzX29zcDsKK2V4dGVybiBzcGlubG9ja190IGd1c19sb2NrOworCitzdGF0aWMgaW50IEdVU19NSURJX1NUQVRVUyh2b2lkKQoreworCXJldHVybiBpbmIodV9NaWRpU3RhdHVzKTsKK30KKworc3RhdGljIGludCBndXNfbWlkaV9vcGVuKGludCBkZXYsIGludCBtb2RlLCB2b2lkICgqaW5wdXQpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpLCB2b2lkICgqb3V0cHV0KSAoaW50IGRldikpCit7CisJaWYgKG1pZGlfYnVzeSkKKwl7CisvKgkJcHJpbnRrKCJHVVM6IE1pZGkgYnVzeVxuIik7Ki8KKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJb3V0YigoTUlESV9SRVNFVCksIHVfTWlkaUNvbnRyb2wpOworCWd1c19kZWxheSgpOworCisJZ3VzX21pZGlfY29udHJvbCA9IDA7CisJaW5wdXRfb3BlbmVkID0gMDsKKworCWlmIChtb2RlID09IE9QRU5fUkVBRCB8fCBtb2RlID09IE9QRU5fUkVBRFdSSVRFKQorCQlpZiAoIWd1c19wbnBfZmxhZykKKwkJeworCQkJZ3VzX21pZGlfY29udHJvbCB8PSBNSURJX0VOQUJMRV9SQ1Y7CisJCQlpbnB1dF9vcGVuZWQgPSAxOworCQl9CisJb3V0YigoZ3VzX21pZGlfY29udHJvbCksIHVfTWlkaUNvbnRyb2wpOwkvKiBFbmFibGUgKi8KKworCW1pZGlfYnVzeSA9IDE7CisJcWxlbiA9IHFoZWFkID0gcXRhaWwgPSBvdXRwdXRfdXNlZCA9IDA7CisJbWlkaV9pbnB1dF9pbnRyID0gaW5wdXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdW1wX3RvX21pZGkodW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCWludCAgICAgICAgICAgICBvayA9IDA7CisKKwlvdXRwdXRfdXNlZCA9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssIGZsYWdzKTsKKworCWlmIChHVVNfTUlESV9TVEFUVVMoKSAmIE1JRElfWE1JVF9FTVBUWSkKKwl7CisJCW9rID0gMTsKKwkJb3V0YigobWlkaV9ieXRlKSwgdV9NaWRpRGF0YSk7CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqIEVuYWJsZSBNaWRpIHhtaXQgaW50ZXJydXB0cyAoYWdhaW4pCisJCSAqLworCQlndXNfbWlkaV9jb250cm9sIHw9IE1JRElfRU5BQkxFX1hNSVQ7CisJCW91dGIoKGd1c19taWRpX2NvbnRyb2wpLCB1X01pZGlDb250cm9sKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBndXNfbWlkaV9jbG9zZShpbnQgZGV2KQoreworCS8qCisJICogUmVzZXQgRklGTyBwb2ludGVycywgZGlzYWJsZSBpbnRycworCSAqLworCisJb3V0YigoTUlESV9SRVNFVCksIHVfTWlkaUNvbnRyb2wpOworCW1pZGlfYnVzeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZ3VzX21pZGlfb3V0KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCS8qCisJICogRHJhaW4gdGhlIGxvY2FsIHF1ZXVlIGZpcnN0CisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAocWxlbiAmJiBkdW1wX3RvX21pZGkodG1wX3F1ZXVlW3FoZWFkXSkpCisJeworCQlxbGVuLS07CisJCXFoZWFkKys7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKworCS8qCisJICoJT3V0cHV0IHRoZSBieXRlIGlmIHRoZSBsb2NhbCBxdWV1ZSBpcyBlbXB0eS4KKwkgKi8KKworCWlmICghcWxlbikKKwkJaWYgKGR1bXBfdG9fbWlkaShtaWRpX2J5dGUpKQorCQkJcmV0dXJuIDE7CS8qCisJCQkJCSAqIE9LCisJCQkJCSAqLworCisJLyoKKwkgKglQdXQgdG8gdGhlIGxvY2FsIHF1ZXVlCisJICovCisKKwlpZiAocWxlbiA+PSAyNTYpCisJCXJldHVybiAwOwkvKgorCQkJCSAqIExvY2FsIHF1ZXVlIGZ1bGwKKwkJCQkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssIGZsYWdzKTsKKworCXRtcF9xdWV1ZVtxdGFpbF0gPSBtaWRpX2J5dGU7CisJcWxlbisrOworCXF0YWlsKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ3VzX21pZGlfc3RhcnRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGd1c19taWRpX2VuZF9yZWFkKGludCBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19taWRpX2tpY2soaW50IGRldikKK3sKK30KKworc3RhdGljIGludCBndXNfbWlkaV9idWZmZXJfc3RhdHVzKGludCBkZXYpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJaWYgKCFvdXRwdXRfdXNlZCkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssIGZsYWdzKTsKKworCWlmIChxbGVuICYmIGR1bXBfdG9fbWlkaSh0bXBfcXVldWVbcWhlYWRdKSkKKwl7CisJCXFsZW4tLTsKKwkJcWhlYWQrKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCXJldHVybiAocWxlbiA+IDApIHx8ICEoR1VTX01JRElfU1RBVFVTKCkgJiBNSURJX1hNSVRfRU1QVFkpOworfQorCisjZGVmaW5lIE1JRElfU1lOVEhfTkFNRQkiR3JhdmlzIFVsdHJhc291bmQgTWlkaSIKKyNkZWZpbmUgTUlESV9TWU5USF9DQVBTCVNZTlRIX0NBUF9JTlBVVAorI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgZ3VzX21pZGlfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pbmZvCQk9IHsiR3JhdmlzIFVsdHJhU291bmQgTWlkaSIsIDAsIDAsIFNORENBUkRfR1VTfSwKKwkuY29udmVydGVyCT0gJnN0ZF9taWRpX3N5bnRoLAorCS5pbl9pbmZvCT0gezB9LAorCS5vcGVuCQk9IGd1c19taWRpX29wZW4sCisJLmNsb3NlCQk9IGd1c19taWRpX2Nsb3NlLAorCS5vdXRwdXRjCT0gZ3VzX21pZGlfb3V0LAorCS5zdGFydF9yZWFkCT0gZ3VzX21pZGlfc3RhcnRfcmVhZCwKKwkuZW5kX3JlYWQJPSBndXNfbWlkaV9lbmRfcmVhZCwKKwkua2ljawkJPSBndXNfbWlkaV9raWNrLAorCS5idWZmZXJfc3RhdHVzCT0gZ3VzX21pZGlfYnVmZmVyX3N0YXR1cywKK307CisKK3ZvaWQgX19pbml0IGd1c19taWRpX2luaXQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWludCBkZXYgPSBzb3VuZF9hbGxvY19taWRpZGV2KCk7CisKKwlpZiAoZGV2ID09IC0xKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZ3VzX21pZGk6IFRvbyBtYW55IG1pZGkgZGV2aWNlcyBkZXRlY3RlZFxuIik7CisJCXJldHVybjsKKwl9CisJb3V0YigoTUlESV9SRVNFVCksIHVfTWlkaUNvbnRyb2wpOworCisJc3RkX21pZGlfc3ludGgubWlkaV9kZXYgPSBteV9kZXYgPSBkZXY7CisJaHdfY29uZmlnLT5zbG90c1syXSA9IGRldjsKKwltaWRpX2RldnNbZGV2XSA9ICZndXNfbWlkaV9vcGVyYXRpb25zOworCXNlcXVlbmNlcl9pbml0KCk7CisJcmV0dXJuOworfQorCit2b2lkIGd1c19taWRpX2ludGVycnVwdChpbnQgZHVtbXkpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBzdGF0LCBkYXRhOworCWludCB0aW1lb3V0ID0gMTA7CisKKwlzcGluX2xvY2soJmd1c19sb2NrKTsKKworCXdoaWxlICh0aW1lb3V0LS0gPiAwICYmIChzdGF0ID0gR1VTX01JRElfU1RBVFVTKCkpICYgKE1JRElfUkNWX0ZVTEwgfCBNSURJX1hNSVRfRU1QVFkpKQorCXsKKwkJaWYgKHN0YXQgJiBNSURJX1JDVl9GVUxMKQorCQl7CisJCQlkYXRhID0gaW5iKHVfTWlkaURhdGEpOworCQkJaWYgKGlucHV0X29wZW5lZCkKKwkJCQltaWRpX2lucHV0X2ludHIobXlfZGV2LCBkYXRhKTsKKwkJfQorCQlpZiAoc3RhdCAmIE1JRElfWE1JVF9FTVBUWSkKKwkJeworCQkJd2hpbGUgKHFsZW4gJiYgZHVtcF90b19taWRpKHRtcF9xdWV1ZVtxaGVhZF0pKQorCQkJeworCQkJCXFsZW4tLTsKKwkJCQlxaGVhZCsrOworCQkJfQorCQkJaWYgKCFxbGVuKQorCQkJeworCQkJICAgICAgLyoKKwkJCSAgICAgICAqIERpc2FibGUgTWlkaSBvdXRwdXQgaW50ZXJydXB0cywgc2luY2Ugbm8gZGF0YSBpbiB0aGUgYnVmZmVyCisJCQkgICAgICAgKi8KKwkJCSAgICAgIGd1c19taWRpX2NvbnRyb2wgJj0gfk1JRElfRU5BQkxFX1hNSVQ7CisJCQkgICAgICBvdXRiKChndXNfbWlkaV9jb250cm9sKSwgdV9NaWRpQ29udHJvbCk7CisJCQkgICAgICBvdXRiKChndXNfbWlkaV9jb250cm9sKSwgdV9NaWRpQ29udHJvbCk7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmd1c19sb2NrKTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ndXNfdm9sLmMgYi9zb3VuZC9vc3MvZ3VzX3ZvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTY5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZ3VzX3ZvbC5jCkBAIC0wLDAgKzEsMTUzIEBACisKKy8qCisgKiBndXNfdm9sLmMgLSBDb21wdXRlIHZvbHVtZSBmb3IgR1VTLgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqLworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiZ3VzLmgiCisjaW5jbHVkZSAiZ3VzX2xpbmVhcnZvbC5oIgorCisjZGVmaW5lIEdVU19WT0xVTUUJZ3VzX3dhdmVfdm9sdW1lCisKKworZXh0ZXJuIGludCAgICAgIGd1c193YXZlX3ZvbHVtZTsKKworLyoKKyAqIENhbGN1bGF0ZSBndXMgdm9sdW1lIGZyb20gbm90ZSB2ZWxvY2l0eSwgbWFpbiB2b2x1bWUsIGV4cHJlc3Npb24sIGFuZAorICogaW50cmluc2ljIHBhdGNoIHZvbHVtZSBnaXZlbiBpbiBwYXRjaCBsaWJyYXJ5LiAgRXhwcmVzc2lvbiBpcyBtdWx0aXBsaWVkCisgKiBpbiwgc28gaXQgZW1waGFzaXplcyBkaWZmZXJlbmNlcyBpbiBub3RlIHZlbG9jaXR5LCB3aGlsZSBtYWluIHZvbHVtZSBpcworICogYWRkZWQgaW4gLS0gSSBkb24ndCBrbm93IHdoZXRoZXIgdGhpcyBpcyByaWdodCwgYnV0IGl0IHNlZW1zIHJlYXNvbmFibGUgdG8KKyAqIG1lLiAgKEluIHRoZSBwcmV2aW91cyBzdGFnZSwgbWFpbiB2b2x1bWUgY29udHJvbGxlciBtZXNzYWdlcyB3ZXJlIGNoYW5nZWQKKyAqIHRvIGV4cHJlc3Npb24gY29udHJvbGxlciBtZXNzYWdlcywgaWYgdGhleSB3ZXJlIGZvdW5kIHRvIGJlIHVzZWQgZm9yCisgKiBkeW5hbWljIHZvbHVtZSBhZGp1c3RtZW50cywgc28gaGVyZSwgbWFpbiB2b2x1bWUgY2FuIGJlIGFzc3VtZWQgdG8gYmUKKyAqIGNvbnN0YW50IHRocm91Z2hvdXQgYSBzb25nLikKKyAqCisgKiBJbnRyaW5zaWMgcGF0Y2ggdm9sdW1lIGlzIGFkZGVkIGluLCBidXQgaWYgb3ZlciA2NCBpcyBhbHNvIG11bHRpcGxpZWQgaW4sIHNvCisgKiB3ZSBjYW4gZ2l2ZSBhIGJpZyBib29zdCB0byB2ZXJ5IHdlYWsgdm9pY2VzIGxpa2Ugbnlsb24gZ3VpdGFyIGFuZCB0aGUKKyAqIGJhc3Nlcy4gIFRoZSBub3JtYWwgdmFsdWUgaXMgNjQuICBTdHJpbmdzIGFyZSBhc3NpZ25lZCBsb3dlciB2YWx1ZXMuCisgKi8KKwordW5zaWduZWQgc2hvcnQgZ3VzX2FkYWdpb192b2woaW50IHZlbCwgaW50IG1haW52LCBpbnQgeHBuLCBpbnQgdm9pY2V2KQoreworCWludCBpLCBtLCBuLCB4OworCisKKwkvKgorCSAqIEEgdm9pY2Ugdm9sdW1lIG9mIDY0IGlzIGNvbnNpZGVyZWQgbmV1dHJhbCwgc28gYWRqdXN0IHRoZSBtYWluIHZvbHVtZSBpZgorCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoaXMgbmV1dHJhbCB2YWx1ZSB3YXMgYXNzaWduZWQgaW4gdGhlIHBhdGNoCisJICogbGlicmFyeS4KKwkgKi8KKwl4ID0gMjU2ICsgNiAqICh2b2ljZXYgLSA2NCk7CisKKwkvKgorCSAqIEJvb3N0IGV4cHJlc3Npb24gYnkgdm9pY2Ugdm9sdW1lIGFib3ZlIG5ldXRyYWwuCisJICovCisJIAorCWlmICh2b2ljZXYgPiA2NSkKKwkJeHBuICs9IHZvaWNldiAtIDY0OworCXhwbiArPSAodm9pY2V2IC0gNjQpIC8gMjsKKworCS8qCisJICogQ29tYmluZSBtdWx0aXBsaWNhdGl2ZSBhbmQgbGV2ZWwgY29tcG9uZW50cy4KKwkgKi8KKwl4ID0gdmVsICogeHBuICogNiArICh2b2ljZXYgLyA0KSAqIHg7CisKKyNpZmRlZiBHVVNfVk9MVU1FCisJLyoKKwkgKiBGdXJ0aGVyIGFkanVzdG1lbnQgYnkgaW5zdGFsbGF0aW9uLXNwZWNpZmljIG1hc3RlciB2b2x1bWUgY29udHJvbAorCSAqIChkZWZhdWx0IDYwKS4KKwkgKi8KKwl4ID0gKHggKiBHVVNfVk9MVU1FICogR1VTX1ZPTFVNRSkgLyAxMDAwMDsKKyNlbmRpZgorCisjaWZkZWYgR1VTX1VTRV9DSE5fTUFJTl9WT0xVTUUKKwkvKgorCSAqIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB0aGUgY2hhbm5lbCBtYWluIHZvbHVtZQorCSAqLworCisJbWFpbnYgPSAobWFpbnYgLyAyKSArIDY0OwkvKiBTY2FsZSB0byA2NCB0byAxMjcgKi8KKwl4ID0gKHggKiBtYWludiAqIG1haW52KSAvIDE2Mzg0OworI2VuZGlmCisKKwlpZiAoeCA8IDIpCisJCXJldHVybiAoMCk7CisJZWxzZSBpZiAoeCA+PSA2NTUzNSkKKwkJcmV0dXJuICgoMTUgPDwgOCkgfCAyNTUpOworCisJLyoKKwkgKiBDb252ZXJ0IHRvIEdVUydzIGxvZ2FyaXRobWljIGZvcm0gd2l0aCA0IGJpdCBleHBvbmVudCBpIGFuZCA4IGJpdAorCSAqIG1hbnRpc3NhIG0uCisJICovCisJIAorCW4gPSB4OworCWkgPSA3OworCWlmIChuIDwgMTI4KQorCXsKKwkJICB3aGlsZSAoaSA+IDAgJiYgbiA8ICgxIDw8IGkpKQorCQkJICBpLS07CisJfQorCWVsc2UKKwl7CisJCXdoaWxlIChuID4gMjU1KQorCQl7CisJCQkgIG4gPj49IDE7CisJCQkgIGkrKzsKKwkJfQorCX0KKwkvKgorCSAqIE1hbnRpc3NhIGlzIHBhcnQgb2YgbGluZWFyIHZvbHVtZSBub3QgZXhwcmVzc2VkIGluIGV4cG9uZW50LiAgKFRoaXMgaXMKKwkgKiBub3QgcXVpdGUgbGlrZSByZWFsIGxvZ3MgLS0gSSB3b25kZXIgaWYgaXQncyByaWdodC4pCisJICovCisJbSA9IHggLSAoMSA8PCBpKTsKKworCS8qCisJICogQWRqdXN0IG1hbnRpc3NhIHRvIDggYml0cy4KKwkgKi8KKwlpZiAobSA+IDApCisJeworCQlpZiAoaSA+IDgpCisJCQltID4+PSBpIC0gODsKKwkJZWxzZSBpZiAoaSA8IDgpCisJCQltIDw8PSA4IC0gaTsKKwl9CisJcmV0dXJuICgoaSA8PCA4KSArIG0pOworfQorCisvKgorICogVm9sdW1lLXZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgbGluZWFyIHZhbHVlcy4gVm9sdW1lIGlzIGJhc2VkIG9uIHRoZQorICogdmFsdWUgc3VwcGxpZWQgd2l0aCBTRVFfU1RBUlRfTk9URSgpLCBjaGFubmVsIG1haW4gdm9sdW1lIChpZiBjb21waWxlZCBpbikKKyAqIGFuZCB0aGUgdm9sdW1lIHNldCBieSB0aGUgbWl4ZXItZGV2aWNlIChkZWZhdWx0IDYwJSkuCisgKi8KKwordW5zaWduZWQgc2hvcnQgZ3VzX2xpbmVhcl92b2woaW50IHZvbCwgaW50IG1haW52b2wpCit7CisJaW50IG1peGVyX21haW52b2w7CisKKwlpZiAodm9sIDw9IDApCisJCXZvbCA9IDA7CisJZWxzZSBpZiAodm9sID49IDEyNykKKwkJdm9sID0gMTI3OworCisjaWZkZWYgR1VTX1ZPTFVNRQorCW1peGVyX21haW52b2wgPSBHVVNfVk9MVU1FOworI2Vsc2UKKwltaXhlcl9tYWludm9sID0gMTAwOworI2VuZGlmCisKKyNpZmRlZiBHVVNfVVNFX0NITl9NQUlOX1ZPTFVNRQorCWlmIChtYWludm9sIDw9IDApCisJCW1haW52b2wgPSAwOworCWVsc2UgaWYgKG1haW52b2wgPj0gMTI3KQorCQltYWludm9sID0gMTI3OworI2Vsc2UKKwltYWludm9sID0gMTI3OworI2VuZGlmCisJcmV0dXJuIGd1c19saW5lYXJ2b2xbKCgodm9sICogbWFpbnZvbCkgLyAxMjcpICogbWl4ZXJfbWFpbnZvbCkgLyAxMDBdOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2d1c193YXZlLmMgYi9zb3VuZC9vc3MvZ3VzX3dhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDJkNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2d1c193YXZlLmMKQEAgLTAsMCArMSwzNDY0IEBACisvKgorICogc291bmQvZ3VzX3dhdmUuYworICoKKyAqIERyaXZlciBmb3IgdGhlIEdyYXZpcyBVbHRyYVNvdW5kIHdhdmUgdGFibGUgc3ludGguCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBUaG9tYXMgU2FpbGVyICAgIDogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICogRnJhbmsgdmFuIGRlIFBvbCA6IEZpeGVkIEdVUyBNQVggaW50ZXJydXB0IGhhbmRsaW5nLiBFbmFibGVkIHNpbXVsdGFuaW91cworICogICAgICAgICAgICAgICAgICAgIHVzYWdlIG9mIENTNDIzMUEgY29kZWMsIEdVUyB3YXZlIGFuZCBNSURJIGZvciBHVVMgTUFYLgorICogQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA6IGFkZGVkIHNvbWUgX19pbml0L19fZXhpdAorICovCisgCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPiAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjZGVmaW5lIEdVU1BOUF9BVVRPREVURUNUCisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlIDxsaW51eC91bHRyYXNvdW5kLmg+CisKKyNpbmNsdWRlICJndXMuaCIKKyNpbmNsdWRlICJndXNfaHcuaCIKKworI2RlZmluZSBHVVNfQkFOS19TSVpFICgoKGl3X21vZGUpID8gMjU2KjEwMjQqMTAyNCA6IDI1NioxMDI0KSkKKworI2RlZmluZSBNQVhfU0FNUExFCTE1MAorI2RlZmluZSBNQVhfUEFUQ0gJMjU2CisKKyNkZWZpbmUgTk9UX1NBTVBMRQkweGZmZmYKKworc3RydWN0IHZvaWNlX2luZm8KK3sKKwl1bnNpZ25lZCBsb25nICAgb3JpZ19mcmVxOworCXVuc2lnbmVkIGxvbmcgICBjdXJyZW50X2ZyZXE7CisJdW5zaWduZWQgbG9uZyAgIG1vZGU7CisJaW50ICAgICAgICAgICAgIGZpeGVkX3BpdGNoOworCWludCAgICAgICAgICAgICBiZW5kZXI7CisJaW50ICAgICAgICAgICAgIGJlbmRlcl9yYW5nZTsKKwlpbnQgICAgICAgICAgICAgcGFubmluZzsKKwlpbnQgICAgICAgICAgICAgbWlkaV92b2x1bWU7CisJdW5zaWduZWQgaW50ICAgIGluaXRpYWxfdm9sdW1lOworCXVuc2lnbmVkIGludCAgICBjdXJyZW50X3ZvbHVtZTsKKwlpbnQgICAgICAgICAgICAgbG9vcF9pcnFfbW9kZSwgbG9vcF9pcnFfcGFybTsKKyNkZWZpbmUgTE1PREVfRklOSVNICQkxCisjZGVmaW5lIExNT0RFX1BDTQkJMgorI2RlZmluZSBMTU9ERV9QQ01fU1RPUAkJMworCWludCAgICAgICAgICAgICB2b2x1bWVfaXJxX21vZGUsIHZvbHVtZV9pcnFfcGFybTsKKyNkZWZpbmUgVk1PREVfSEFMVAkJMQorI2RlZmluZSBWTU9ERV9FTlZFTE9QRQkJMgorI2RlZmluZSBWTU9ERV9TVEFSVF9OT1RFCTMKKworCWludCAgICAgICAgICAgICBlbnZfcGhhc2U7CisJdW5zaWduZWQgY2hhciAgIGVudl9yYXRlWzZdOworCXVuc2lnbmVkIGNoYXIgICBlbnZfb2Zmc2V0WzZdOworCisJLyoKKwkgKiBWb2x1bWUgY29tcHV0YXRpb24gcGFyYW1ldGVycyBmb3IgZ3VzX2FkYWdpb192b2woKQorCSAqLworCWludAkJbWFpbl92b2wsIGV4cHJlc3Npb25fdm9sLCBwYXRjaF92b2w7CisKKwkvKiBWYXJpYWJsZXMgZm9yICJVbHRyYWNsaWNrIiByZW1vdmFsICovCisJaW50ICAgICAgICAgICAgIGRldl9wZW5kaW5nLCBub3RlX3BlbmRpbmcsIHZvbHVtZV9wZW5kaW5nLAorCSAgICAgICAgICAgICAgICBzYW1wbGVfcGVuZGluZzsKKwljaGFyICAgICAgICAgICAga2lsbF9wZW5kaW5nOworCWxvbmcgICAgICAgICAgICBvZmZzZXRfcGVuZGluZzsKKworfTsKKworc3RhdGljIHN0cnVjdCB2b2ljZV9hbGxvY19pbmZvICp2b2ljZV9hbGxvYzsKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvICpndXNfaHdfY29uZmlnOworZXh0ZXJuIGludCAgICAgIGd1c19iYXNlOworZXh0ZXJuIGludCAgICAgIGd1c19pcnEsIGd1c19kbWE7CitleHRlcm4gaW50ICAgICAgZ3VzX3BucF9mbGFnOworZXh0ZXJuIGludCAgICAgIGd1c19ub193YXZlX2RtYTsKK3N0YXRpYyBpbnQgICAgICBndXNfZG1hMiA9IC0xOworc3RhdGljIGludCAgICAgIGR1YWxfZG1hX21vZGU7CitzdGF0aWMgbG9uZyAgICAgZ3VzX21lbV9zaXplOworc3RhdGljIGxvbmcgICAgIGZyZWVfbWVtX3B0cjsKK3N0YXRpYyBpbnQgICAgICBndXNfYnVzeTsKK3N0YXRpYyBpbnQgICAgICBndXNfbm9fZG1hOworc3RhdGljIGludCAgICAgIG5yX3ZvaWNlczsKK3N0YXRpYyBpbnQgICAgICBndXNfZGV2bnVtOworc3RhdGljIGludCAgICAgIHZvbHVtZV9iYXNlLCB2b2x1bWVfc2NhbGUsIHZvbHVtZV9tZXRob2Q7CitzdGF0aWMgaW50ICAgICAgZ3VzX3JlY21hc2sgPSBTT1VORF9NQVNLX01JQzsKK3N0YXRpYyBpbnQgICAgICByZWNvcmRpbmdfYWN0aXZlOworc3RhdGljIGludCAgICAgIG9ubHlfcmVhZF9hY2Nlc3M7CitzdGF0aWMgaW50ICAgICAgb25seV84X2JpdHM7CisKK3N0YXRpYyBpbnQgICAgICBpd19tb2RlID0gMDsKK2ludCAgICAgICAgICAgICBndXNfd2F2ZV92b2x1bWUgPSA2MDsKK2ludCAgICAgICAgICAgICBndXNfcGNtX3ZvbHVtZSA9IDgwOworaW50ICAgICAgICAgICAgIGhhdmVfZ3VzX21heCA9IDA7CitzdGF0aWMgaW50ICAgICAgZ3VzX2xpbmVfdm9sID0gMTAwLCBndXNfbWljX3ZvbDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1peF9pbWFnZSA9IDB4MDA7CisKK2ludCAgICAgICAgICAgICBndXNfdGltZXJfZW5hYmxlZCA9IDA7CisKKy8qCisgKiBDdXJyZW50IHZlcnNpb24gb2YgdGhpcyBkcml2ZXIgZG9lc24ndCBhbGxvdyBzeW50aCBhbmQgUENNIGZ1bmN0aW9ucworICogYXQgdGhlIHNhbWUgdGltZS4gVGhlIGFjdGl2ZV9kZXZpY2Ugc3BlY2lmaWVzIHRoZSBhY3RpdmUgZHJpdmVyCisgKi8KKworc3RhdGljIGludCAgICAgIGFjdGl2ZV9kZXZpY2U7CisKKyNkZWZpbmUgR1VTX0RFVl9XQVZFCQkxCS8qIFdhdmUgdGFibGUgc3ludGggKi8KKyNkZWZpbmUgR1VTX0RFVl9QQ01fRE9ORQkyCS8qIFBDTSBkZXZpY2UsIHRyYW5zZmVyIGRvbmUgKi8KKyNkZWZpbmUgR1VTX0RFVl9QQ01fQ09OVElOVUUJMwkvKiBQQ00gZGV2aWNlLCB0cmFuc2ZlciBkb25lIGNoLiAxLzIgKi8KKworc3RhdGljIGludCAgICAgIGd1c19hdWRpb19zcGVlZDsKK3N0YXRpYyBpbnQgICAgICBndXNfYXVkaW9fY2hhbm5lbHM7CitzdGF0aWMgaW50ICAgICAgZ3VzX2F1ZGlvX2JpdHM7CitzdGF0aWMgaW50ICAgICAgZ3VzX2F1ZGlvX2JzaXplOworc3RhdGljIGNoYXIgICAgIGJvdW5jZV9idWZbOCAqIDEwMjRdOwkvKiBNdXN0IG1hdGNoIHZhbHVlIHNldCB0byBtYXhfZnJhZ21lbnQgKi8KKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGRyYW1fc2xlZXBlcik7CisKKy8qCisgKiBWYXJpYWJsZXMgYW5kIGJ1ZmZlcnMgZm9yIFBDTSBvdXRwdXQKKyAqLworCisjZGVmaW5lIE1BWF9QQ01fQlVGRkVSUwkJKDEyOCpNQVhfUkVBTFRJTUVfRkFDVE9SKQkvKiBEb24ndCBjaGFuZ2UgKi8KKworc3RhdGljIGludCAgICAgIHBjbV9ic2l6ZSwgcGNtX25ibGssIHBjbV9iYW5rc2l6ZTsKK3N0YXRpYyBpbnQgICAgICBwY21fZGF0YXNpemVbTUFYX1BDTV9CVUZGRVJTXTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcGNtX2hlYWQsIHBjbV90YWlsLCBwY21fcWxlbjsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcGNtX2FjdGl2ZTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgZG1hX2FjdGl2ZTsKK3N0YXRpYyBpbnQgICAgICBwY21fb3BlbmVkOworc3RhdGljIGludCAgICAgIHBjbV9jdXJyZW50X2RldjsKK3N0YXRpYyBpbnQgICAgICBwY21fY3VycmVudF9ibG9jazsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjbV9jdXJyZW50X2J1ZjsKK3N0YXRpYyBpbnQgICAgICBwY21fY3VycmVudF9jb3VudDsKK3N0YXRpYyBpbnQgICAgICBwY21fY3VycmVudF9pbnRyZmxhZzsKK0RFRklORV9TUElOTE9DSyhndXNfbG9jayk7CisKK2V4dGVybiBpbnQgICAgICpndXNfb3NwOworCitzdGF0aWMgc3RydWN0IHZvaWNlX2luZm8gdm9pY2VzWzMyXTsKKworc3RhdGljIGludCAgICAgIGZyZXFfZGl2X3RhYmxlW10gPQoreworCTQ0MTAwLAkJCS8qIDE0ICovCisJNDExNjAsCQkJLyogMTUgKi8KKwkzODU4NywJCQkvKiAxNiAqLworCTM2MzE3LAkJCS8qIDE3ICovCisJMzQzMDAsCQkJLyogMTggKi8KKwkzMjQ5NCwJCQkvKiAxOSAqLworCTMwODcwLAkJCS8qIDIwICovCisJMjk0MDAsCQkJLyogMjEgKi8KKwkyODA2MywJCQkvKiAyMiAqLworCTI2ODQzLAkJCS8qIDIzICovCisJMjU3MjUsCQkJLyogMjQgKi8KKwkyNDY5NiwJCQkvKiAyNSAqLworCTIzNzQ2LAkJCS8qIDI2ICovCisJMjI4NjYsCQkJLyogMjcgKi8KKwkyMjA1MCwJCQkvKiAyOCAqLworCTIxMjg5LAkJCS8qIDI5ICovCisJMjA1ODAsCQkJLyogMzAgKi8KKwkxOTkxNiwJCQkvKiAzMSAqLworCTE5MjkzCQkJLyogMzIgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGF0Y2hfaW5mbyAqc2FtcGxlczsKK3N0YXRpYyBsb25nICAgICBzYW1wbGVfcHRyc1tNQVhfU0FNUExFICsgMV07CitzdGF0aWMgaW50ICAgICAgc2FtcGxlX21hcFszMl07CitzdGF0aWMgaW50ICAgICAgZnJlZV9zYW1wbGU7CitzdGF0aWMgaW50ICAgICAgbWl4ZXJfdHlwZTsKKworCitzdGF0aWMgaW50ICAgICAgcGF0Y2hfdGFibGVbTUFYX1BBVENIXTsKK3N0YXRpYyBpbnQgICAgICBwYXRjaF9tYXBbMzJdOworCitzdGF0aWMgc3RydWN0IHN5bnRoX2luZm8gZ3VzX2luZm8gPSB7CisJIkdyYXZpcyBVbHRyYVNvdW5kIiwgMCwgU1lOVEhfVFlQRV9TQU1QTEUsIFNBTVBMRV9UWVBFX0dVUywgCisJMCwgMTYsIDAsIE1BWF9QQVRDSAorfTsKKworc3RhdGljIHZvaWQgICAgIGd1c19wb2tlKGxvbmcgYWRkciwgdW5zaWduZWQgY2hhciBkYXRhKTsKK3N0YXRpYyB2b2lkICAgICBjb21wdXRlX2FuZF9zZXRfdm9sdW1lKGludCB2b2ljZSwgaW50IHZvbHVtZSwgaW50IHJhbXBfdGltZSk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZ3VzX2FkYWdpb192b2woaW50IHZlbCwgaW50IG1haW52LCBpbnQgeHBuLCBpbnQgdm9pY2V2KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBndXNfbGluZWFyX3ZvbChpbnQgdm9sLCBpbnQgbWFpbnZvbCk7CitzdGF0aWMgdm9pZCAgICAgY29tcHV0ZV92b2x1bWUoaW50IHZvaWNlLCBpbnQgdm9sdW1lKTsKK3N0YXRpYyB2b2lkICAgICBkb192b2x1bWVfaXJxKGludCB2b2ljZSk7CitzdGF0aWMgdm9pZCAgICAgc2V0X2lucHV0X3ZvbHVtZXModm9pZCk7CitzdGF0aWMgdm9pZCAgICAgZ3VzX3Rtcl9pbnN0YWxsKGludCBpb19iYXNlKTsKKworI2RlZmluZQlJTlNUQU5UX1JBTVAJCS0xCS8qIEluc3RhbnQgY2hhbmdlLiBObyByYW1waW5nICovCisjZGVmaW5lIEZBU1RfUkFNUAkJMAkvKiBGYXN0ZXN0IHBvc3NpYmxlIHJhbXAgKi8KKworc3RhdGljIHZvaWQgcmVzZXRfc2FtcGxlX21lbW9yeSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8PSBNQVhfU0FNUExFOyBpKyspCisJCXNhbXBsZV9wdHJzW2ldID0gLTE7CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCXNhbXBsZV9tYXBbaV0gPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJcGF0Y2hfbWFwW2ldID0gLTE7CisKKwlndXNfcG9rZSgwLCAwKTsJCS8qIFB1dCBhIHNpbGVudCBzYW1wbGUgdG8gdGhlIGJlZ2lubmluZyAqLworCWd1c19wb2tlKDEsIDApOworCWZyZWVfbWVtX3B0ciA9IDI7CisKKwlmcmVlX3NhbXBsZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1BBVENIOyBpKyspCisJCXBhdGNoX3RhYmxlW2ldID0gTk9UX1NBTVBMRTsKK30KKwordm9pZCBndXNfZGVsYXkodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJCWluYih1X0RSQU1JTyk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19wb2tlKGxvbmcgYWRkciwgdW5zaWduZWQgY2hhciBkYXRhKQorewkJCQkvKiBXcml0ZXMgYSBieXRlIHRvIHRoZSBEUkFNICovCisJb3V0YigoMHg0MyksIHVfQ29tbWFuZCk7CisJb3V0YigoYWRkciAmIDB4ZmYpLCB1X0RhdGFMbyk7CisJb3V0YigoKGFkZHIgPj4gOCkgJiAweGZmKSwgdV9EYXRhSGkpOworCisJb3V0YigoMHg0NCksIHVfQ29tbWFuZCk7CisJb3V0YigoKGFkZHIgPj4gMTYpICYgMHhmZiksIHVfRGF0YUhpKTsKKwlvdXRiKChkYXRhKSwgdV9EUkFNSU8pOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBndXNfcGVlayhsb25nIGFkZHIpCit7CQkJCS8qIFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBEUkFNICovCisJdW5zaWduZWQgY2hhciAgIHRtcDsKKworCW91dGIoKDB4NDMpLCB1X0NvbW1hbmQpOworCW91dGIoKGFkZHIgJiAweGZmKSwgdV9EYXRhTG8pOworCW91dGIoKChhZGRyID4+IDgpICYgMHhmZiksIHVfRGF0YUhpKTsKKworCW91dGIoKDB4NDQpLCB1X0NvbW1hbmQpOworCW91dGIoKChhZGRyID4+IDE2KSAmIDB4ZmYpLCB1X0RhdGFIaSk7CisJdG1wID0gaW5iKHVfRFJBTUlPKTsKKworCXJldHVybiB0bXA7Cit9CisKK3ZvaWQgZ3VzX3dyaXRlOChpbnQgcmVnLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3sJCQkJLyogV3JpdGVzIHRvIGFuIGluZGlyZWN0IHJlZ2lzdGVyICg4IGJpdCkgKi8KKwlvdXRiKChyZWcpLCB1X0NvbW1hbmQpOworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAoZGF0YSAmIDB4ZmYpKSwgdV9EYXRhSGkpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBndXNfcmVhZDgoaW50IHJlZykKK3sJCQkJCisJLyogUmVhZHMgZnJvbSBhbiBpbmRpcmVjdCByZWdpc3RlciAoOCBiaXQpLiBPZmZzZXQgMHg4MC4gKi8KKwl1bnNpZ25lZCBjaGFyICAgdmFsOworCisJb3V0YigocmVnIHwgMHg4MCksIHVfQ29tbWFuZCk7CisJdmFsID0gaW5iKHVfRGF0YUhpKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGd1c19sb29rOChpbnQgcmVnKQoreworCS8qIFJlYWRzIGZyb20gYW4gaW5kaXJlY3QgcmVnaXN0ZXIgKDggYml0KS4gTm8gYWRkaXRpb25hbCBvZmZzZXQuICovCisJdW5zaWduZWQgY2hhciAgIHZhbDsKKworCW91dGIoKHJlZyksIHVfQ29tbWFuZCk7CisJdmFsID0gaW5iKHVfRGF0YUhpKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGd1c193cml0ZTE2KGludCByZWcsIHVuc2lnbmVkIGludCBkYXRhKQoreworCS8qIFdyaXRlcyB0byBhbiBpbmRpcmVjdCByZWdpc3RlciAoMTYgYml0KSAqLworCW91dGIoKHJlZyksIHVfQ29tbWFuZCk7CisKKwlvdXRiKCgodW5zaWduZWQgY2hhcikgKGRhdGEgJiAweGZmKSksIHVfRGF0YUxvKTsKKwlvdXRiKCgodW5zaWduZWQgY2hhcikgKChkYXRhID4+IDgpICYgMHhmZikpLCB1X0RhdGFIaSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBndXNfcmVhZDE2KGludCByZWcpCit7CisJLyogUmVhZHMgZnJvbSBhbiBpbmRpcmVjdCByZWdpc3RlciAoMTYgYml0KS4gT2Zmc2V0IDB4ODAuICovCisJdW5zaWduZWQgY2hhciAgIGhpLCBsbzsKKworCW91dGIoKHJlZyB8IDB4ODApLCB1X0NvbW1hbmQpOworCisJbG8gPSBpbmIodV9EYXRhTG8pOworCWhpID0gaW5iKHVfRGF0YUhpKTsKKworCXJldHVybiAoKGhpIDw8IDgpICYgMHhmZjAwKSB8IGxvOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZ3VzX2xvb2sxNihpbnQgcmVnKQorewkJCisJLyogUmVhZHMgZnJvbSBhbiBpbmRpcmVjdCByZWdpc3RlciAoMTYgYml0KS4gTm8gYWRkaXRpb25hbCBvZmZzZXQuICovCisJdW5zaWduZWQgY2hhciAgIGhpLCBsbzsKKworCW91dGIoKHJlZyksIHVfQ29tbWFuZCk7CisKKwlsbyA9IGluYih1X0RhdGFMbyk7CisJaGkgPSBpbmIodV9EYXRhSGkpOworCisJcmV0dXJuICgoaGkgPDwgOCkgJiAweGZmMDApIHwgbG87Cit9CisKK3N0YXRpYyB2b2lkIGd1c193cml0ZV9hZGRyKGludCByZWcsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IGZyYWMsIGludCBpczE2Yml0KQoreworCS8qIFdyaXRlcyBhbiAyNCBiaXQgbWVtb3J5IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICAgaG9sZF9hZGRyZXNzOworCisJaWYgKGlzMTZiaXQpCisJeworCQlpZiAoaXdfbW9kZSkKKwkJeworCQkJLyogSW50ZXJ3YXZlIHNwZXNpZmljIGFkZHJlc3MgdHJhbnNsYXRpb25zICovCisJCQlhZGRyZXNzID4+PSAxOworCQl9CisJCWVsc2UKKwkJeworCQkJLyoKKwkJCSAqIFNwZWNpYWwgcHJvY2Vzc2luZyByZXF1aXJlZCBmb3IgMTYgYml0IHBhdGNoZXMKKwkJCSAqLworCisJCQlob2xkX2FkZHJlc3MgPSBhZGRyZXNzOworCQkJYWRkcmVzcyA9IGFkZHJlc3MgPj4gMTsKKwkJCWFkZHJlc3MgJj0gMHgwMDAxZmZmZkw7CisJCQlhZGRyZXNzIHw9IChob2xkX2FkZHJlc3MgJiAweDAwMGMwMDAwTCk7CisJCX0KKwl9CisJZ3VzX3dyaXRlMTYocmVnLCAodW5zaWduZWQgc2hvcnQpICgoYWRkcmVzcyA+PiA3KSAmIDB4ZmZmZikpOworCWd1c193cml0ZTE2KHJlZyArIDEsICh1bnNpZ25lZCBzaG9ydCkgKChhZGRyZXNzIDw8IDkpICYgMHhmZmZmKQorCQkgICAgKyAoZnJhYyA8PCA1KSk7CisJLyogQ291bGQgd3JpdGluZyB0d2ljZSBmaXggcHJvYmxlbXMgd2l0aCBHVVNfVk9JQ0VfUE9TKCk/IExldCdzIHRyeS4gKi8KKwlndXNfZGVsYXkoKTsKKwlndXNfd3JpdGUxNihyZWcsICh1bnNpZ25lZCBzaG9ydCkgKChhZGRyZXNzID4+IDcpICYgMHhmZmZmKSk7CisJZ3VzX3dyaXRlMTYocmVnICsgMSwgKHVuc2lnbmVkIHNob3J0KSAoKGFkZHJlc3MgPDwgOSkgJiAweGZmZmYpCisJCSAgICArIChmcmFjIDw8IDUpKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3NlbGVjdF92b2ljZShpbnQgdm9pY2UpCit7CisJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+IDMxKQorCQlyZXR1cm47CisJb3V0Yigodm9pY2UpLCB1X1ZvaWNlKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3NlbGVjdF9tYXhfdm9pY2VzKGludCBudm9pY2VzKQoreworCWlmIChpd19tb2RlKQorCQludm9pY2VzID0gMzI7CisJaWYgKG52b2ljZXMgPCAxNCkKKwkJbnZvaWNlcyA9IDE0OworCWlmIChudm9pY2VzID4gMzIpCisJCW52b2ljZXMgPSAzMjsKKworCXZvaWNlX2FsbG9jLT5tYXhfdm9pY2UgPSBucl92b2ljZXMgPSBudm9pY2VzOworCWd1c193cml0ZTgoMHgwZSwgKG52b2ljZXMgLSAxKSB8IDB4YzApOworfQorCitzdGF0aWMgdm9pZCBndXNfdm9pY2Vfb24odW5zaWduZWQgaW50IG1vZGUpCit7CisJZ3VzX3dyaXRlOCgweDAwLCAodW5zaWduZWQgY2hhcikgKG1vZGUgJiAweGZjKSk7CisJZ3VzX2RlbGF5KCk7CisJZ3VzX3dyaXRlOCgweDAwLCAodW5zaWduZWQgY2hhcikgKG1vZGUgJiAweGZjKSk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c192b2ljZV9vZmYodm9pZCkKK3sKKwlndXNfd3JpdGU4KDB4MDAsIGd1c19yZWFkOCgweDAwKSB8IDB4MDMpOworfQorCitzdGF0aWMgdm9pZCBndXNfdm9pY2VfbW9kZSh1bnNpZ25lZCBpbnQgbSkKK3sKKwl1bnNpZ25lZCBjaGFyICAgbW9kZSA9ICh1bnNpZ25lZCBjaGFyKSAobSAmIDB4ZmYpOworCisJZ3VzX3dyaXRlOCgweDAwLCAoZ3VzX3JlYWQ4KDB4MDApICYgMHgwMykgfAorCQkgICAobW9kZSAmIDB4ZmMpKTsJLyogRG9uJ3QgdG91Y2ggbGFzdCB0d28gYml0cyAqLworCWd1c19kZWxheSgpOworCWd1c193cml0ZTgoMHgwMCwgKGd1c19yZWFkOCgweDAwKSAmIDB4MDMpIHwgKG1vZGUgJiAweGZjKSk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c192b2ljZV9mcmVxKHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nICAgZGl2aXNvciA9IGZyZXFfZGl2X3RhYmxlW25yX3ZvaWNlcyAtIDE0XTsKKwl1bnNpZ25lZCBzaG9ydCAgZmM7CisKKwkvKiBJbnRlcndhdmUgcGxheXMgYXQgNDQxMDAgSHogd2l0aCBhbnkgbnVtYmVyIG9mIHZvaWNlcyAqLworCWlmIChpd19tb2RlKQorCQlmYyA9ICh1bnNpZ25lZCBzaG9ydCkgKCgoZnJlcSA8PCA5KSArICg0NDEwMCA+PiAxKSkgLyA0NDEwMCk7CisJZWxzZQorCQlmYyA9ICh1bnNpZ25lZCBzaG9ydCkgKCgoZnJlcSA8PCA5KSArIChkaXZpc29yID4+IDEpKSAvIGRpdmlzb3IpOworCWZjID0gZmMgPDwgMTsKKworCWd1c193cml0ZTE2KDB4MDEsIGZjKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3ZvaWNlX3ZvbHVtZSh1bnNpZ25lZCBpbnQgdm9sKQoreworCWd1c193cml0ZTgoMHgwZCwgMHgwMyk7CS8qIFN0b3AgcmFtcCBiZWZvcmUgc2V0dGluZyB2b2x1bWUgKi8KKwlndXNfd3JpdGUxNigweDA5LCAodW5zaWduZWQgc2hvcnQpICh2b2wgPDwgNCkpOworfQorCitzdGF0aWMgdm9pZCBndXNfdm9pY2VfYmFsYW5jZSh1bnNpZ25lZCBpbnQgYmFsYW5jZSkKK3sKKwlndXNfd3JpdGU4KDB4MGMsICh1bnNpZ25lZCBjaGFyKSAoYmFsYW5jZSAmIDB4ZmYpKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3JhbXBfcmFuZ2UodW5zaWduZWQgaW50IGxvdywgdW5zaWduZWQgaW50IGhpZ2gpCit7CisJZ3VzX3dyaXRlOCgweDA3LCAodW5zaWduZWQgY2hhcikgKChsb3cgPj4gNCkgJiAweGZmKSk7CisJZ3VzX3dyaXRlOCgweDA4LCAodW5zaWduZWQgY2hhcikgKChoaWdoID4+IDQpICYgMHhmZikpOworfQorCitzdGF0aWMgdm9pZCBndXNfcmFtcF9yYXRlKHVuc2lnbmVkIGludCBzY2FsZSwgdW5zaWduZWQgaW50IHJhdGUpCit7CisJZ3VzX3dyaXRlOCgweDA2LCAodW5zaWduZWQgY2hhcikgKCgoc2NhbGUgJiAweDAzKSA8PCA2KSB8IChyYXRlICYgMHgzZikpKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3JhbXBvbih1bnNpZ25lZCBpbnQgbSkKK3sKKwl1bnNpZ25lZCBjaGFyICAgbW9kZSA9ICh1bnNpZ25lZCBjaGFyKSAobSAmIDB4ZmYpOworCisJZ3VzX3dyaXRlOCgweDBkLCBtb2RlICYgMHhmYyk7CisJZ3VzX2RlbGF5KCk7CisJZ3VzX3dyaXRlOCgweDBkLCBtb2RlICYgMHhmYyk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19yYW1wX21vZGUodW5zaWduZWQgaW50IG0pCit7CisJdW5zaWduZWQgY2hhciBtb2RlID0gKHVuc2lnbmVkIGNoYXIpIChtICYgMHhmZik7CisKKwlndXNfd3JpdGU4KDB4MGQsIChndXNfcmVhZDgoMHgwZCkgJiAweDAzKSB8CisJCSAgIChtb2RlICYgMHhmYykpOwkvKiBMZWF2ZSB0aGUgbGFzdCAyIGJpdHMgYWxvbmUgKi8KKwlndXNfZGVsYXkoKTsKKwlndXNfd3JpdGU4KDB4MGQsIChndXNfcmVhZDgoMHgwZCkgJiAweDAzKSB8IChtb2RlICYgMHhmYykpOworfQorCitzdGF0aWMgdm9pZCBndXNfcmFtcG9mZih2b2lkKQoreworCWd1c193cml0ZTgoMHgwZCwgMHgwMyk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19zZXRfdm9pY2VfcG9zKGludCB2b2ljZSwgbG9uZyBwb3NpdGlvbikKK3sKKwlpbnQgc2FtcGxlX25vOworCisJaWYgKChzYW1wbGVfbm8gPSBzYW1wbGVfbWFwW3ZvaWNlXSkgIT0gLTEpIHsKKwkJaWYgKHBvc2l0aW9uIDwgc2FtcGxlc1tzYW1wbGVfbm9dLmxlbikgeworCQkJaWYgKHZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlID09IFZNT0RFX1NUQVJUX05PVEUpCisJCQkJdm9pY2VzW3ZvaWNlXS5vZmZzZXRfcGVuZGluZyA9IHBvc2l0aW9uOworCQkJZWxzZQorCQkJCWd1c193cml0ZV9hZGRyKDB4MGEsIHNhbXBsZV9wdHJzW3NhbXBsZV9ub10gKyBwb3NpdGlvbiwgMCwKKwkJCQkgc2FtcGxlc1tzYW1wbGVfbm9dLm1vZGUgJiBXQVZFXzE2X0JJVFMpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBndXNfdm9pY2VfaW5pdChpbnQgdm9pY2UpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwlndXNfdm9pY2Vfdm9sdW1lKDApOworCWd1c192b2ljZV9vZmYoKTsKKwlndXNfd3JpdGVfYWRkcigweDBhLCAwLCAwLCAwKTsJLyogU2V0IGN1cnJlbnQgcG9zaXRpb24gdG8gMCAqLworCWd1c193cml0ZTgoMHgwMCwgMHgwMyk7CS8qIFZvaWNlIG9mZiAqLworCWd1c193cml0ZTgoMHgwZCwgMHgwMyk7CS8qIFJhbXBpbmcgb2ZmICovCisJdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPSAwOworCXZvaWNlX2FsbG9jLT5hbGxvY190aW1lc1t2b2ljZV0gPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKworfQorCitzdGF0aWMgdm9pZCBndXNfdm9pY2VfaW5pdDIoaW50IHZvaWNlKQoreworCXZvaWNlc1t2b2ljZV0ucGFubmluZyA9IDA7CisJdm9pY2VzW3ZvaWNlXS5tb2RlID0gMDsKKwl2b2ljZXNbdm9pY2VdLm9yaWdfZnJlcSA9IDIwMDAwOworCXZvaWNlc1t2b2ljZV0uY3VycmVudF9mcmVxID0gMjAwMDA7CisJdm9pY2VzW3ZvaWNlXS5iZW5kZXIgPSAwOworCXZvaWNlc1t2b2ljZV0uYmVuZGVyX3JhbmdlID0gMjAwOworCXZvaWNlc1t2b2ljZV0uaW5pdGlhbF92b2x1bWUgPSAwOworCXZvaWNlc1t2b2ljZV0uY3VycmVudF92b2x1bWUgPSAwOworCXZvaWNlc1t2b2ljZV0ubG9vcF9pcnFfbW9kZSA9IDA7CisJdm9pY2VzW3ZvaWNlXS5sb29wX2lycV9wYXJtID0gMDsKKwl2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZSA9IDA7CisJdm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX3Bhcm0gPSAwOworCXZvaWNlc1t2b2ljZV0uZW52X3BoYXNlID0gMDsKKwl2b2ljZXNbdm9pY2VdLm1haW5fdm9sID0gMTI3OworCXZvaWNlc1t2b2ljZV0ucGF0Y2hfdm9sID0gMTI3OworCXZvaWNlc1t2b2ljZV0uZXhwcmVzc2lvbl92b2wgPSAxMjc7CisJdm9pY2VzW3ZvaWNlXS5zYW1wbGVfcGVuZGluZyA9IC0xOworCXZvaWNlc1t2b2ljZV0uZml4ZWRfcGl0Y2ggPSAwOworfQorCitzdGF0aWMgdm9pZCBzdGVwX2VudmVsb3BlKGludCB2b2ljZSkKK3sKKwl1bnNpZ25lZCAgICAgICAgdm9sLCBwcmV2X3ZvbCwgcGhhc2U7CisJdW5zaWduZWQgY2hhciAgIHJhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh2b2ljZXNbdm9pY2VdLm1vZGUgJiBXQVZFX1NVU1RBSU5fT04gJiYgdm9pY2VzW3ZvaWNlXS5lbnZfcGhhc2UgPT0gMikKKwl7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQlndXNfcmFtcG9mZigpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCXJldHVybjsKKwkJLyoKKwkJICogU3VzdGFpbiBwaGFzZSBiZWdpbnMuIENvbnRpbnVlIGVudmVsb3BlIGFmdGVyIHJlY2VpdmluZyBub3RlIG9mZi4KKwkJICovCisJfQorCWlmICh2b2ljZXNbdm9pY2VdLmVudl9waGFzZSA+PSA1KQorCXsKKwkJLyogRW52ZWxvcGUgZmluaXNoZWQuIFNob290IHRoZSB2b2ljZSBkb3duICovCisJCWd1c192b2ljZV9pbml0KHZvaWNlKTsKKwkJcmV0dXJuOworCX0KKwlwcmV2X3ZvbCA9IHZvaWNlc1t2b2ljZV0uY3VycmVudF92b2x1bWU7CisJcGhhc2UgPSArK3ZvaWNlc1t2b2ljZV0uZW52X3BoYXNlOworCWNvbXB1dGVfdm9sdW1lKHZvaWNlLCB2b2ljZXNbdm9pY2VdLm1pZGlfdm9sdW1lKTsKKwl2b2wgPSB2b2ljZXNbdm9pY2VdLmluaXRpYWxfdm9sdW1lICogdm9pY2VzW3ZvaWNlXS5lbnZfb2Zmc2V0W3BoYXNlXSAvIDI1NTsKKwlyYXRlID0gdm9pY2VzW3ZvaWNlXS5lbnZfcmF0ZVtwaGFzZV07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCisJZ3VzX3ZvaWNlX3ZvbHVtZShwcmV2X3ZvbCk7CisKKworCWd1c193cml0ZTgoMHgwNiwgcmF0ZSk7CS8qIFJhbXBpbmcgcmF0ZSAqLworCisJdm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX21vZGUgPSBWTU9ERV9FTlZFTE9QRTsKKworCWlmICgoKHZvbCAtIHByZXZfdm9sKSAvIDY0KSA9PSAwKQkvKiBObyBzaWduaWZpY2FudCB2b2x1bWUgY2hhbmdlICovCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCXN0ZXBfZW52ZWxvcGUodm9pY2UpOwkJLyogQ29udGludWUgdGhlIGVudmVsb3BlIG9uIHRoZSBuZXh0IHN0ZXAgKi8KKwkJcmV0dXJuOworCX0KKwlpZiAodm9sID4gcHJldl92b2wpCisJeworCQlpZiAodm9sID49ICg0MDk2IC0gNjQpKQorCQkJdm9sID0gNDA5NiAtIDY1OworCQlndXNfcmFtcF9yYW5nZSgwLCB2b2wpOworCQlndXNfcmFtcG9uKDB4MjApOwkvKiBJbmNyZWFzaW5nIHZvbHVtZSwgd2l0aCBJUlEgKi8KKwl9CisJZWxzZQorCXsKKwkJaWYgKHZvbCA8PSA2NCkKKwkJCXZvbCA9IDY1OworCQlndXNfcmFtcF9yYW5nZSh2b2wsIDQwMzApOworCQlndXNfcmFtcG9uKDB4NjApOwkvKiBEZWNyZWFzaW5nIHZvbHVtZSwgd2l0aCBJUlEgKi8KKwl9CisJdm9pY2VzW3ZvaWNlXS5jdXJyZW50X3ZvbHVtZSA9IHZvbDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfZW52ZWxvcGUoaW50IHZvaWNlKQoreworCXZvaWNlc1t2b2ljZV0uZW52X3BoYXNlID0gLTE7CisJdm9pY2VzW3ZvaWNlXS5jdXJyZW50X3ZvbHVtZSA9IDY0OworCisJc3RlcF9lbnZlbG9wZSh2b2ljZSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3JlbGVhc2UoaW50IHZvaWNlKQoreworCWlmIChndXNfcmVhZDgoMHgwMCkgJiAweDAzKQorCQlyZXR1cm47CQkvKiBWb2ljZSBhbHJlYWR5IHN0b3BwZWQgKi8KKworCXZvaWNlc1t2b2ljZV0uZW52X3BoYXNlID0gMjsJLyogV2lsbCBiZSBpbmNyZW1lbnRlZCBieSBzdGVwX2VudmVsb3BlICovCisKKwl2b2ljZXNbdm9pY2VdLmN1cnJlbnRfdm9sdW1lID0gdm9pY2VzW3ZvaWNlXS5pbml0aWFsX3ZvbHVtZSA9CisJCQkJCQlndXNfcmVhZDE2KDB4MDkpID4+IDQ7CS8qIEdldCBjdXJyZW50IHZvbHVtZSAqLworCisJdm9pY2VzW3ZvaWNlXS5tb2RlICY9IH5XQVZFX1NVU1RBSU5fT047CisJZ3VzX3JhbXBvZmYoKTsKKwlzdGVwX2VudmVsb3BlKHZvaWNlKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3ZvaWNlX2ZhZGUoaW50IHZvaWNlKQoreworCWludCBpbnN0cl9ubyA9IHNhbXBsZV9tYXBbdm9pY2VdLCBpczE2Yml0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKworCWlmIChpbnN0cl9ubyA8IDAgfHwgaW5zdHJfbm8gPiBNQVhfU0FNUExFKQorCXsKKwkJZ3VzX3dyaXRlOCgweDAwLCAweDAzKTsJLyogSGFyZCBzdG9wICovCisJCXZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlzMTZiaXRzID0gKHNhbXBsZXNbaW5zdHJfbm9dLm1vZGUgJiBXQVZFXzE2X0JJVFMpID8gMSA6IDA7CS8qIDggb3IgMTYgYml0cyAqLworCisJaWYgKHZvaWNlc1t2b2ljZV0ubW9kZSAmIFdBVkVfRU5WRUxPUEVTKQorCXsKKwkJc3RhcnRfcmVsZWFzZSh2b2ljZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIFJhbXAgdGhlIHZvbHVtZSBkb3duIGJ1dCBub3QgdG9vIHF1aWNrbHkuCisJICovCisJaWYgKChpbnQpIChndXNfcmVhZDE2KDB4MDkpID4+IDQpIDwgMTAwKQkvKiBHZXQgY3VycmVudCB2b2x1bWUgKi8KKwl7CisJCWd1c192b2ljZV9vZmYoKTsKKwkJZ3VzX3JhbXBvZmYoKTsKKwkJZ3VzX3ZvaWNlX2luaXQodm9pY2UpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCXJldHVybjsKKwl9CisJZ3VzX3JhbXBfcmFuZ2UoNjUsIDQwMzApOworCWd1c19yYW1wX3JhdGUoMiwgNCk7CisJZ3VzX3JhbXBvbigweDQwIHwgMHgyMCk7CS8qIERvd24sIG9uY2UsIHdpdGggSVJRICovCisJdm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX21vZGUgPSBWTU9ERV9IQUxUOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3Jlc2V0KHZvaWQpCit7CisJaW50IGk7CisKKwlndXNfc2VsZWN0X21heF92b2ljZXMoMjQpOworCXZvbHVtZV9iYXNlID0gMzA3MTsKKwl2b2x1bWVfc2NhbGUgPSA0OworCXZvbHVtZV9tZXRob2QgPSBWT0xfTUVUSE9EX0FEQUdJTzsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCXsKKwkJZ3VzX3ZvaWNlX2luaXQoaSk7CS8qIFR1cm4gdm9pY2Ugb2ZmICovCisJCWd1c192b2ljZV9pbml0MihpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGd1c19pbml0aWFsaXplKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGRtYV9pbWFnZSwgaXJxX2ltYWdlLCB0bXA7CisKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBndXNfaXJxX21hcFsxNl0gPSAJeworCQkwLCAwLCAwLCAzLCAwLCAyLCAwLCA0LCAwLCAxLCAwLCA1LCA2LCAwLCAwLCA3CisJfTsKKworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGd1c19kbWFfbWFwWzhdID0geworCQkwLCAxLCAwLCAyLCAwLCAzLCA0LCA1CisJfTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJZ3VzX3dyaXRlOCgweDRjLCAwKTsJLyogUmVzZXQgR0YxICovCisJZ3VzX2RlbGF5KCk7CisJZ3VzX2RlbGF5KCk7CisKKwlndXNfd3JpdGU4KDB4NGMsIDEpOwkvKiBSZWxlYXNlIFJlc2V0ICovCisJZ3VzX2RlbGF5KCk7CisJZ3VzX2RlbGF5KCk7CisKKwkvKgorCSAqIENsZWFyIGFsbCBpbnRlcnJ1cHRzCisJICovCisKKwlndXNfd3JpdGU4KDB4NDEsIDApOwkvKiBETUEgY29udHJvbCAqLworCWd1c193cml0ZTgoMHg0NSwgMCk7CS8qIFRpbWVyIGNvbnRyb2wgKi8KKwlndXNfd3JpdGU4KDB4NDksIDApOwkvKiBTYW1wbGUgY29udHJvbCAqLworCisJZ3VzX3NlbGVjdF9tYXhfdm9pY2VzKDI0KTsKKworCWluYih1X1N0YXR1cyk7CQkvKiBUb3VjaCB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisKKwlndXNfbG9vazgoMHg0MSk7CS8qIENsZWFyIGFueSBwZW5kaW5nIERNQSBJUlFzICovCisJZ3VzX2xvb2s4KDB4NDkpOwkvKiBDbGVhciBhbnkgcGVuZGluZyBzYW1wbGUgSVJRcyAqLworCWd1c19yZWFkOCgweDBmKTsJLyogQ2xlYXIgcGVuZGluZyBJUlFzICovCisKKwlndXNfcmVzZXQoKTsJCS8qIFJlc2V0cyBhbGwgdm9pY2VzICovCisKKwlndXNfbG9vazgoMHg0MSk7CS8qIENsZWFyIGFueSBwZW5kaW5nIERNQSBJUlFzICovCisJZ3VzX2xvb2s4KDB4NDkpOwkvKiBDbGVhciBhbnkgcGVuZGluZyBzYW1wbGUgSVJRcyAqLworCWd1c19yZWFkOCgweDBmKTsJLyogQ2xlYXIgcGVuZGluZyBJUlFzICovCisKKwlndXNfd3JpdGU4KDB4NGMsIDcpOwkvKiBNYXN0ZXIgcmVzZXQgfCBEQUMgZW5hYmxlIHwgSVJRIGVuYWJsZSAqLworCisJLyoKKwkgKiBTZXQgdXAgZm9yIERpZ2l0YWwgQVNJQworCSAqLworCisJb3V0YigoMHgwNSksIGd1c19iYXNlICsgMHgwZik7CisKKwltaXhfaW1hZ2UgfD0gMHgwMjsJLyogRGlzYWJsZSBsaW5lIG91dCAoZm9yIGEgbW9tZW50KSAqLworCW91dGIoKG1peF9pbWFnZSksIHVfTWl4ZXIpOworCisJb3V0YigoMHgwMCksIHVfSVJRRE1BQ29udHJvbCk7CisKKwlvdXRiKCgweDAwKSwgZ3VzX2Jhc2UgKyAweDBmKTsKKworCS8qCisJICogTm93IHNldCB1cCB0aGUgRE1BIGFuZCBJUlEgaW50ZXJmYWNlCisJICoKKwkgKiBUaGUgR1VTIHN1cHBvcnRzIHR3byBJUlFzIGFuZCB0d28gRE1Bcy4KKwkgKgorCSAqIEp1c3Qgb25lIERNQSBjaGFubmVsIGlzIHVzZWQuIFRoaXMgcHJldmVudHMgc2ltdWx0YW5lb3VzIEFEQyBhbmQgREFDLgorCSAqIEFkZGluZyB0aGlzIHN1cHBvcnQgcmVxdWlyZXMgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgZG1hYnVmLmMsIGRzcC5jCisJICogYW5kIGF1ZGlvLmMgYWxzby4KKwkgKi8KKworCWlycV9pbWFnZSA9IDA7CisJdG1wID0gZ3VzX2lycV9tYXBbZ3VzX2lycV07CisJaWYgKCFndXNfcG5wX2ZsYWcgJiYgIXRtcCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZyEgR1VTIElSUSBub3Qgc2VsZWN0ZWRcbiIpOworCWlycV9pbWFnZSB8PSB0bXA7CisJaXJxX2ltYWdlIHw9IDB4NDA7CS8qIENvbWJpbmUgSVJRMSAoR0YxKSBhbmQgSVJRMiAoTWlkaSkgKi8KKworCWR1YWxfZG1hX21vZGUgPSAxOworCWlmIChndXNfZG1hMiA9PSBndXNfZG1hIHx8IGd1c19kbWEyID09IC0xKQorCXsKKwkJZHVhbF9kbWFfbW9kZSA9IDA7CisJCWRtYV9pbWFnZSA9IDB4NDA7CS8qIENvbWJpbmUgRE1BMSAoRFJBTSkgYW5kIElSUTIgKEFEQykgKi8KKworCQl0bXAgPSBndXNfZG1hX21hcFtndXNfZG1hXTsKKwkJaWYgKCF0bXApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nISBHVVMgRE1BIG5vdCBzZWxlY3RlZFxuIik7CisKKwkJZG1hX2ltYWdlIHw9IHRtcDsKKwl9CisJZWxzZQorCXsKKwkJLyogU2V0dXAgZHVhbCBETUEgY2hhbm5lbCBtb2RlIGZvciBHVVMgTUFYICovCisKKwkJZG1hX2ltYWdlID0gZ3VzX2RtYV9tYXBbZ3VzX2RtYV07CisJCWlmICghZG1hX2ltYWdlKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZyEgR1VTIERNQSBub3Qgc2VsZWN0ZWRcbiIpOworCisJCXRtcCA9IGd1c19kbWFfbWFwW2d1c19kbWEyXSA8PCAzOworCQlpZiAoIXRtcCkKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZyEgSW52YWxpZCBHVVMgTUFYIERNQVxuIik7CisJCQl0bXAgPSAweDQwOwkJLyogQ29tYmluZSBETUEgY2hhbm5lbHMgKi8KKwkJCSAgICBkdWFsX2RtYV9tb2RlID0gMDsKKwkJfQorCQlkbWFfaW1hZ2UgfD0gdG1wOworCX0KKworCS8qCisJICogRm9yIHNvbWUgcmVhc29uIHRoZSBJUlEgYW5kIERNQSBhZGRyZXNzZXMgbXVzdCBiZSB3cml0dGVuIHR3aWNlCisJICovCisKKwkvKgorCSAqIERvaW5nIGl0IGZpcnN0IHRpbWUKKwkgKi8KKworCW91dGIoKG1peF9pbWFnZSksIHVfTWl4ZXIpOwkvKiBTZWxlY3QgRE1BIGNvbnRyb2wgKi8KKwlvdXRiKChkbWFfaW1hZ2UgfCAweDgwKSwgdV9JUlFETUFDb250cm9sKTsJLyogU2V0IERNQSBhZGRyZXNzICovCisKKwlvdXRiKChtaXhfaW1hZ2UgfCAweDQwKSwgdV9NaXhlcik7CS8qIFNlbGVjdCBJUlEgY29udHJvbCAqLworCW91dGIoKGlycV9pbWFnZSksIHVfSVJRRE1BQ29udHJvbCk7CS8qIFNldCBJUlEgYWRkcmVzcyAqLworCisJLyoKKwkgKiBEb2luZyBpdCBzZWNvbmQgdGltZQorCSAqLworCisJb3V0YigobWl4X2ltYWdlKSwgdV9NaXhlcik7CS8qIFNlbGVjdCBETUEgY29udHJvbCAqLworCW91dGIoKGRtYV9pbWFnZSksIHVfSVJRRE1BQ29udHJvbCk7CS8qIFNldCBETUEgYWRkcmVzcyAqLworCisJb3V0YigobWl4X2ltYWdlIHwgMHg0MCksIHVfTWl4ZXIpOwkvKiBTZWxlY3QgSVJRIGNvbnRyb2wgKi8KKwlvdXRiKChpcnFfaW1hZ2UpLCB1X0lSUURNQUNvbnRyb2wpOwkvKiBTZXQgSVJRIGFkZHJlc3MgKi8KKworCWd1c19zZWxlY3Rfdm9pY2UoMCk7CS8qIFRoaXMgZGlzYWJsZXMgd3JpdGVzIHRvIElSUS9ETUEgcmVnICovCisKKwltaXhfaW1hZ2UgJj0gfjB4MDI7CS8qIEVuYWJsZSBsaW5lIG91dCAqLworCW1peF9pbWFnZSB8PSAweDA4OwkvKiBFbmFibGUgSVJRICovCisJb3V0YigobWl4X2ltYWdlKSwgdV9NaXhlcik7CS8qCisJCQkJCSAqIFR1cm4gbWl4ZXIgY2hhbm5lbHMgb24KKwkJCQkJICogTm90ZSEgTWljIGluIGlzIGxlZnQgb2ZmLgorCQkJCQkgKi8KKworCWd1c19zZWxlY3Rfdm9pY2UoMCk7CS8qIFRoaXMgZGlzYWJsZXMgd3JpdGVzIHRvIElSUS9ETUEgcmVnICovCisKKwlndXNpbnRyKGd1c19pcnEsICh2b2lkICopZ3VzX2h3X2NvbmZpZywgTlVMTCk7CS8qIFNlcnZlIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCisJaW5iKHVfU3RhdHVzKTsJCS8qIFRvdWNoIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKworCWd1c19sb29rOCgweDQxKTsJLyogQ2xlYXIgYW55IHBlbmRpbmcgRE1BIElSUXMgKi8KKwlndXNfbG9vazgoMHg0OSk7CS8qIENsZWFyIGFueSBwZW5kaW5nIHNhbXBsZSBJUlFzICovCisKKwlndXNfcmVhZDgoMHgwZik7CS8qIENsZWFyIHBlbmRpbmcgSVJRcyAqLworCisJaWYgKGl3X21vZGUpCisJCWd1c193cml0ZTgoMHgxOSwgZ3VzX3JlYWQ4KDB4MTkpIHwgMHgwMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbnBfbWVtX2luaXQodm9pZCkKK3sKKyNpbmNsdWRlICJpd21lbS5oIgorI2RlZmluZSBDSFVOS19TSVpFICgyNTYqMTAyNCkKKyNkZWZpbmUgQkFOS19TSVpFICg0KjEwMjQqMTAyNCkKKyNkZWZpbmUgQ0hVTktTX1BFUl9CQU5LIChCQU5LX1NJWkUvQ0hVTktfU0laRSkKKworCWludCBiYW5rLCBjaHVuaywgYWRkciwgdG90YWwgPSAwOworCWludCBiYW5rX3NpemVzWzRdOworCWludCBpLCBqLCBiaXRzID0gLTEsIHRlc3RiaXRzID0gLTEsIG5iYW5rcyA9IDA7CisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBkZXRlcm1pbmVzIHdoYXQga2luZCBvZiBSQU0gaXMgaW5zdGFsbGVkIGluIGVhY2ggb2YgdGhlIGZvdXIKKwkgKiBTSU1NIGJhbmtzIGFuZCBjb25maWd1cmVzIHRoZSBEUkFNIGFkZHJlc3MgZGVjb2RlIGxvZ2ljIGFjY29yZGluZ2x5LgorCSAqLworCisJLyoKKwkgKiAgICBQbGFjZSB0aGUgY2hpcCBpbnRvIGVuaGFuY2VkIG1vZGUKKwkgKi8KKwlndXNfd3JpdGU4KDB4MTksIGd1c19yZWFkOCgweDE5KSB8IDB4MDEpOworCWd1c193cml0ZTgoMHg1MywgZ3VzX2xvb2s4KDB4NTMpICYgfjB4MDIpOwkvKiBTZWxlY3QgRFJBTSBJL08gYWNjZXNzICovCisKKwkvKgorCSAqIFNldCBtZW1vcnkgY29uZmlndXJhdGlvbiB0byA0IERSQU0gYmFua3Mgb2YgNE0gaW4gZWFjaCAoMTZNIHRvdGFsKS4KKwkgKi8KKworCWd1c193cml0ZTE2KDB4NTIsIChndXNfbG9vazE2KDB4NTIpICYgMHhmZmYwKSB8IDB4MDAwYyk7CisKKwkvKgorCSAqIFBlcmZvcm0gdGhlIERSQU0gc2l6ZSBkZXRlY3Rpb24gZm9yIGVhY2ggYmFuayBpbmRpdmlkdWFsbHkuCisJICovCisJZm9yIChiYW5rID0gMDsgYmFuayA8IDQ7IGJhbmsrKykKKwl7CisJCWludCBzaXplID0gMDsKKworCQlhZGRyID0gYmFuayAqIEJBTktfU0laRTsKKworCQkvKiBDbGVhbiBjaGVjayBwb2ludHMgb2YgZWFjaCBjaHVuayAqLworCQlmb3IgKGNodW5rID0gMDsgY2h1bmsgPCBDSFVOS1NfUEVSX0JBTks7IGNodW5rKyspCisJCXsKKwkJCWd1c19wb2tlKGFkZHIgKyBjaHVuayAqIENIVU5LX1NJWkUgKyAwTCwgMHgwMCk7CisJCQlndXNfcG9rZShhZGRyICsgY2h1bmsgKiBDSFVOS19TSVpFICsgMUwsIDB4MDApOworCQl9CisKKwkJLyogV3JpdGUgYSB2YWx1ZSB0byBlYWNoIGNodW5rIHBvaW50IGFuZCB2ZXJpZnkgdGhlIHJlc3VsdCAqLworCQlmb3IgKGNodW5rID0gMDsgY2h1bmsgPCBDSFVOS1NfUEVSX0JBTks7IGNodW5rKyspCisJCXsKKwkJCWd1c19wb2tlKGFkZHIgKyBjaHVuayAqIENIVU5LX1NJWkUgKyAwTCwgMHg1NSk7CisJCQlndXNfcG9rZShhZGRyICsgY2h1bmsgKiBDSFVOS19TSVpFICsgMUwsIDB4QUEpOworCisJCQlpZiAoZ3VzX3BlZWsoYWRkciArIGNodW5rICogQ0hVTktfU0laRSArIDBMKSA9PSAweDU1ICYmCisJCQkJZ3VzX3BlZWsoYWRkciArIGNodW5rICogQ0hVTktfU0laRSArIDFMKSA9PSAweEFBKQorCQkJeworCQkJCS8qIE9LLiBUaGVyZSBpcyBSQU0uIE5vdyBjaGVjayBmb3IgcG9zc2libGUgc2hhZG93cyAqLworCQkJCWludCBvayA9IDEsIGNodW5rMjsKKworCQkJCWZvciAoY2h1bmsyID0gMDsgb2sgJiYgY2h1bmsyIDwgY2h1bms7IGNodW5rMisrKQorCQkJCQlpZiAoZ3VzX3BlZWsoYWRkciArIGNodW5rMiAqIENIVU5LX1NJWkUgKyAwTCkgfHwKKwkJCQkJCQlndXNfcGVlayhhZGRyICsgY2h1bmsyICogQ0hVTktfU0laRSArIDFMKSkKKwkJCQkJCW9rID0gMDsJLyogQWRkcmVzc2luZyB3cmFwcyAqLworCisJCQkJaWYgKG9rKQorCQkJCQlzaXplID0gKGNodW5rICsgMSkgKiBDSFVOS19TSVpFOworCQkJfQorCQkJZ3VzX3Bva2UoYWRkciArIGNodW5rICogQ0hVTktfU0laRSArIDBMLCAweDAwKTsKKwkJCWd1c19wb2tlKGFkZHIgKyBjaHVuayAqIENIVU5LX1NJWkUgKyAxTCwgMHgwMCk7CisJCX0KKwkJYmFua19zaXplc1tiYW5rXSA9IHNpemU7CisJCWlmIChzaXplKQorCQkJbmJhbmtzID0gYmFuayArIDE7CisJCUREQihwcmludGsoIkludGVyd2F2ZTogQmFuayAlZCwgc2l6ZT0lZGtcbiIsIGJhbmssIHNpemUgLyAxMDI0KSk7CisJfQorCisJaWYgKG5iYW5rcyA9PSAwKQkvKiBObyBSQU0gLSBHaXZlIHVwICovCisJeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBBbiBJbnRlcndhdmUgYXVkaW8gY2hpcCBkZXRlY3RlZCBidXQgbm8gRFJBTVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IFVuYWJsZSB0byB3b3JrIHdpdGggdGhpcyBjYXJkLlxuIik7CisJCWd1c193cml0ZTgoMHgxOSwgZ3VzX3JlYWQ4KDB4MTkpICYgfjB4MDEpOworCQlndXNfbWVtX3NpemUgPSAwOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBOb3cgd2Uga25vdyBob3cgbXVjaCBEUkFNIHRoZXJlIGlzIGluIGVhY2ggYmFuay4gVGhlIG5leHQgc3RlcCBpcworCSAqIHRvIGZpbmQgYSBEUkFNIHNpemUgZW5jb2RpbmcgKDAgdG8gMTIpIHdoaWNoIGlzIGJlc3QgZm9yIHRoZSBjb21iaW5hdGlvbgorCSAqIHdlIGhhdmUuCisJICoKKwkgKiBGaXJzdCB0cnkgaWYgYW55IG9mIHRoZSBwb3NzaWJsZSBhbHRlcm5hdGl2ZXMgbWF0Y2hlcyBleGFjdGx5IHRoZSBhbW91bnQKKwkgKiBvZiBtZW1vcnkgd2UgaGF2ZS4KKwkgKi8KKworCWZvciAoaSA9IDA7IGJpdHMgPT0gLTEgJiYgaSA8IDEzOyBpKyspCisJeworCQliaXRzID0gaTsKKworCQlmb3IgKGogPSAwOyBiaXRzICE9IC0xICYmIGogPCA0OyBqKyspCisJCQlpZiAobWVtX2RlY29kZVtpXVtqXSAhPSBiYW5rX3NpemVzW2pdKQorCQkJCWJpdHMgPSAtMTsJLyogTm8gaGl0ICovCisJfQorCisJLyoKKwkgKiBJZiBuZWNlc3NhcnksIHRyeSB0byBmaW5kIGEgY29tYmluYXRpb24gd2hlcmUgb3RoZXIgdGhhbiB0aGUgbGFzdAorCSAqIGJhbmsgbWF0Y2hlcyBvdXIgY29uZmlndXJhdGlvbiBhbmQgdGhlIGxhc3QgYmFuayBpcyBsZWZ0IG92ZXJzaXplZC4KKwkgKiBJbiB0aGlzIHdheSB3ZSBkb24ndCBsZWF2ZSBob2xlcyBpbiB0aGUgbWlkZGxlIG9mIG1lbW9yeS4KKwkgKi8KKworCWlmIChiaXRzID09IC0xKQkJLyogTm8gbHVjayB5ZXQgKi8KKwl7CisJCWZvciAoaSA9IDA7IGJpdHMgPT0gLTEgJiYgaSA8IDEzOyBpKyspCisJCXsKKwkJCWJpdHMgPSBpOworCisJCQlmb3IgKGogPSAwOyBiaXRzICE9IC0xICYmIGogPCBuYmFua3MgLSAxOyBqKyspCisJCQkJaWYgKG1lbV9kZWNvZGVbaV1bal0gIT0gYmFua19zaXplc1tqXSkKKwkJCQkJYml0cyA9IC0xOwkvKiBObyBoaXQgKi8KKwkJCWlmIChtZW1fZGVjb2RlW2ldW25iYW5rcyAtIDFdIDwgYmFua19zaXplc1tuYmFua3MgLSAxXSkKKwkJCQliaXRzID0gLTE7CS8qIFRoZSBsYXN0IGJhbmsgaXMgdG9vIHNtYWxsICovCisJCX0KKwl9CisJLyoKKyAJICogVGhlIGxhc3QgcmVzb3J0IGlzIHRvIHNlYXJjaCBmb3IgYSBjb21iaW5hdGlvbiB3aGVyZSB0aGUgYmFua3MgYXJlCisgCSAqIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIFNJTU1zLiBUaGlzIGxlYXZlcyBzb21lIG1lbW9yeSBpbiB0aGUgYmFua3MKKyAJICogdW51c2VkIGJ1dCBkb2Vzbid0IGxlYXZlIGhvbGVzIGluIHRoZSBEUkFNIGFkZHJlc3Mgc3BhY2UuCisgCSAqLworIAlpZiAoYml0cyA9PSAtMSkJCS8qIE5vIGx1Y2sgeWV0ICovCisgCXsKKyAJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorIAkJeworIAkJCXRlc3RiaXRzID0gaTsKKyAJCQlmb3IgKGogPSAwOyB0ZXN0Yml0cyAhPSAtMSAmJiBqIDwgbmJhbmtzIC0gMTsgaisrKQorIAkJCQlpZiAobWVtX2RlY29kZVtpXVtqXSA+IGJhbmtfc2l6ZXNbal0pIHsKKyAJCQkJCXRlc3RiaXRzID0gLTE7CisgCQkJCX0KKyAJCQlpZih0ZXN0Yml0cyA+IGJpdHMpIGJpdHMgPSB0ZXN0Yml0czsKKyAJCX0KKyAJCWlmIChiaXRzICE9IC0xKQorIAkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSW50ZXJ3YXZlOiBDYW4ndCB1c2UgYWxsIGluc3RhbGxlZCBSQU0uXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkludGVyd2F2ZTogVHJ5IHJlb3JkZXJpbmcgU0lNTVMuXG4iKTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJJbnRlcndhdmU6IENhbid0IGZpbmQgd29ya2luZyBEUkFNIGVuY29kaW5nLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIkludGVyd2F2ZTogRGVmYXVsdGluZyB0byAyNTZrLiBUcnkgcmVvcmRlcmluZyBTSU1NUy5cbiIpOworCQliaXRzID0gMDsKKwl9CisJRERCKHByaW50aygiSW50ZXJ3YXZlOiBTZWxlY3RpbmcgRFJBTSBhZGRyZXNzaW5nIG1vZGUgJWRcbiIsIGJpdHMpKTsKKworCWZvciAoYmFuayA9IDA7IGJhbmsgPCA0OyBiYW5rKyspCisJeworCQlEREIocHJpbnRrKCIgIEJhbmsgJWQsIG1lbT0lZGsgKGxpbWl0ICVkaylcbiIsIGJhbmssIGJhbmtfc2l6ZXNbYmFua10gLyAxMDI0LCBtZW1fZGVjb2RlW2JpdHNdW2JhbmtdIC8gMTAyNCkpOworCisJCWlmIChiYW5rX3NpemVzW2JhbmtdID4gbWVtX2RlY29kZVtiaXRzXVtiYW5rXSkKKwkJCXRvdGFsICs9IG1lbV9kZWNvZGVbYml0c11bYmFua107CisJCWVsc2UKKwkJCXRvdGFsICs9IGJhbmtfc2l6ZXNbYmFua107CisJfQorCisJRERCKHByaW50aygiVG90YWwgJWRrIG9mIERSQU0gKGVuaGFuY2VkIG1vZGUpXG4iLCB0b3RhbCAvIDEwMjQpKTsKKworCS8qCisJICogICAgU2V0IHRoZSBtZW1vcnkgYWRkcmVzc2luZyBtb2RlLgorCSAqLworCWd1c193cml0ZTE2KDB4NTIsIChndXNfbG9vazE2KDB4NTIpICYgMHhmZmYwKSB8IGJpdHMpOworCisvKiAgICAgIExlYXZlIHRoZSBjaGlwIGludG8gZW5oYW5jZWQgbW9kZS4gRGlzYWJsZSBMRk8gICovCisJZ3VzX21lbV9zaXplID0gdG90YWw7CisJaXdfbW9kZSA9IDE7CisJZ3VzX3dyaXRlOCgweDE5LCAoZ3VzX3JlYWQ4KDB4MTkpIHwgMHgwMSkgJiB+MHgwMik7Cit9CisKK2ludCBfX2luaXQgZ3VzX3dhdmVfZGV0ZWN0KGludCBiYXNlYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nICAgaSwgbWF4X21lbSA9IDEwMjRMOworCXVuc2lnbmVkIGxvbmcgICBsb2M7CisJdW5zaWduZWQgY2hhciAgIHZhbDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZWFkZHIsIDE2LCAiR1VTIikpCisJCXJldHVybiAwOworCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZWFkZHIgKyAweDEwMCwgMTIsICJHVVMiKSkgeyAvKiAweDEwYy0+IGlzIE1BWCAqLworCQlyZWxlYXNlX3JlZ2lvbihiYXNlYWRkciwgMTYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlndXNfYmFzZSA9IGJhc2VhZGRyOworCisJZ3VzX3dyaXRlOCgweDRjLCAwKTsJLyogUmVzZXQgR0YxICovCisJZ3VzX2RlbGF5KCk7CisJZ3VzX2RlbGF5KCk7CisKKwlndXNfd3JpdGU4KDB4NGMsIDEpOwkvKiBSZWxlYXNlIFJlc2V0ICovCisJZ3VzX2RlbGF5KCk7CisJZ3VzX2RlbGF5KCk7CisKKyNpZmRlZiBHVVNQTlBfQVVUT0RFVEVDVAorCXZhbCA9IGd1c19sb29rOCgweDViKTsJLyogVmVyc2lvbiBudW1iZXIgcmVnaXN0ZXIgKi8KKwlndXNfd3JpdGU4KDB4NWIsIH52YWwpOwkvKiBJbnZlcnQgYWxsIGJpdHMgKi8KKworCWlmICgoZ3VzX2xvb2s4KDB4NWIpICYgMHhmMCkgPT0gKHZhbCAmIDB4ZjApKQkvKiBObyBjaGFuZ2UgKi8KKwl7CisJCWlmICgoZ3VzX2xvb2s4KDB4NWIpICYgMHgwZikgPT0gKCh+dmFsKSAmIDB4MGYpKQkvKiBDaGFuZ2UgKi8KKwkJeworCQkJRERCKHByaW50aygiSW50ZXJ3YXZlIGNoaXAgdmVyc2lvbiAlZCBkZXRlY3RlZFxuIiwgKHZhbCAmIDB4ZjApID4+IDQpKTsKKwkJCWd1c19wbnBfZmxhZyA9IDE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEREIocHJpbnRrKCJOb3QgYW4gSW50ZXJ3YXZlIGNoaXAgKCV4KVxuIiwgZ3VzX2xvb2s4KDB4NWIpKSk7CisJCQlndXNfcG5wX2ZsYWcgPSAwOworCQl9CisJfQorCWd1c193cml0ZTgoMHg1YiwgdmFsKTsJLyogUmVzdG9yZSBhbGwgYml0cyAqLworI2VuZGlmCisKKwlpZiAoZ3VzX3BucF9mbGFnKQorCQlwbnBfbWVtX2luaXQoKTsKKwlpZiAoaXdfbW9kZSkKKwkJcmV0dXJuIDE7CisKKwkvKiBTZWUgaWYgdGhlcmUgaXMgZmlyc3QgYmxvY2sgdGhlcmUuLi4uICovCisJZ3VzX3Bva2UoMEwsIDB4YWEpOworCWlmIChndXNfcGVlaygwTCkgIT0gMHhhYSkgeworCQlyZWxlYXNlX3JlZ2lvbihiYXNlYWRkciArIDB4MTAwLCAxMik7CisJCXJlbGVhc2VfcmVnaW9uKGJhc2VhZGRyLCAxNik7CisJCXJldHVybiAwOworCX0KKworCS8qIE5vdyB6ZXJvIGl0IG91dCBzbyB0aGF0IEkgY2FuIGNoZWNrIGZvciBtaXJyb3JpbmcgLi4gKi8KKwlndXNfcG9rZSgwTCwgMHgwMCk7CisJZm9yIChpID0gMUw7IGkgPCBtYXhfbWVtOyBpKyspCisJeworCQlpbnQgbiwgZmFpbGVkOworCisJCS8qIGNoZWNrIGZvciBtaXJyb3JpbmcgLi4uICovCisJCWlmIChndXNfcGVlaygwTCkgIT0gMCkKKwkJCWJyZWFrOworCQlsb2MgPSBpIDw8IDEwOworCisJCWZvciAobiA9IGxvYyAtIDEsIGZhaWxlZCA9IDA7IG4gPD0gbG9jOyBuKyspCisJCXsKKwkJCWd1c19wb2tlKGxvYywgMHhhYSk7CisJCQlpZiAoZ3VzX3BlZWsobG9jKSAhPSAweGFhKQorCQkJCWZhaWxlZCA9IDE7CisJCQlndXNfcG9rZShsb2MsIDB4NTUpOworCQkJaWYgKGd1c19wZWVrKGxvYykgIT0gMHg1NSkKKwkJCQlmYWlsZWQgPSAxOworCQl9CisJCWlmIChmYWlsZWQpCisJCQlicmVhazsKKwl9CisJZ3VzX21lbV9zaXplID0gaSA8PCAxMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBndXN3YXZlX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisKKwlzd2l0Y2ggKGNtZCkgCisJeworCQljYXNlIFNORENUTF9TWU5USF9JTkZPOgorCQkJZ3VzX2luZm8ubnJfdm9pY2VzID0gbnJfdm9pY2VzOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZndXNfaW5mbywgc2l6ZW9mKGd1c19pbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9TRVFfUkVTRVRTQU1QTEVTOgorCQkJcmVzZXRfc2FtcGxlX21lbW9yeSgpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfU0VRX1BFUkNNT0RFOgorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfU1lOVEhfTUVNQVZMOgorCQkJcmV0dXJuIChndXNfbWVtX3NpemUgPT0gMCkgPyAwIDogZ3VzX21lbV9zaXplIC0gZnJlZV9tZW1fcHRyIC0gMzI7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBndXN3YXZlX3NldF9pbnN0cihpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBpbnN0cl9ubykKK3sKKwlpbnQgc2FtcGxlX25vOworCisJaWYgKGluc3RyX25vIDwgMCB8fCBpbnN0cl9ubyA+IE1BWF9QQVRDSCkKKwkJaW5zdHJfbm8gPSAwOwkvKiBEZWZhdWx0IHRvIGFjb3VzdGljIHBpYW5vICovCisKKwlpZiAodm9pY2UgPCAwIHx8IHZvaWNlID4gMzEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlID09IFZNT0RFX1NUQVJUX05PVEUpCisJeworCQl2b2ljZXNbdm9pY2VdLnNhbXBsZV9wZW5kaW5nID0gaW5zdHJfbm87CisJCXJldHVybiAwOworCX0KKwlzYW1wbGVfbm8gPSBwYXRjaF90YWJsZVtpbnN0cl9ub107CisJcGF0Y2hfbWFwW3ZvaWNlXSA9IC0xOworCisJaWYgKHNhbXBsZV9ubyA9PSBOT1RfU0FNUExFKQorCXsKKy8qCQlwcmludGsoIkdVUzogVW5kZWZpbmVkIHBhdGNoICVkIGZvciB2b2ljZSAlZFxuIiwgaW5zdHJfbm8sIHZvaWNlKTsqLworCQlyZXR1cm4gLUVJTlZBTDsJLyogUGF0Y2ggbm90IGRlZmluZWQgKi8KKwl9CisJaWYgKHNhbXBsZV9wdHJzW3NhbXBsZV9ub10gPT0gLTEpCS8qIFNhbXBsZSBub3QgbG9hZGVkICovCisJeworLyoJCXByaW50aygiR1VTOiBTYW1wbGUgIyVkIG5vdCBsb2FkZWQgZm9yIHBhdGNoICVkICh2b2ljZSAlZClcbiIsIHNhbXBsZV9ubywgaW5zdHJfbm8sIHZvaWNlKTsqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2FtcGxlX21hcFt2b2ljZV0gPSBzYW1wbGVfbm87CisJcGF0Y2hfbWFwW3ZvaWNlXSA9IGluc3RyX25vOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGd1c3dhdmVfa2lsbF9ub3RlKGludCBkZXYsIGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkvKiB2b2ljZV9hbGxvYy0+bWFwW3ZvaWNlXSA9IDB4ZmZmZjsgKi8KKwlpZiAodm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX21vZGUgPT0gVk1PREVfU1RBUlRfTk9URSkKKwl7CisJCXZvaWNlc1t2b2ljZV0ua2lsbF9wZW5kaW5nID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCX0KKwllbHNlCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCWd1c192b2ljZV9mYWRlKHZvaWNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ3Vzd2F2ZV9hZnRlcnRvdWNoKGludCBkZXYsIGludCB2b2ljZSwgaW50IHByZXNzdXJlKQoreworfQorCitzdGF0aWMgdm9pZCBndXN3YXZlX3Bhbm5pbmcoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgdmFsdWUpCit7CisJaWYgKHZvaWNlID49IDAgfHwgdm9pY2UgPCAzMikKKwkJdm9pY2VzW3ZvaWNlXS5wYW5uaW5nID0gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGd1c3dhdmVfdm9sdW1lX21ldGhvZChpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlpZiAobW9kZSA9PSBWT0xfTUVUSE9EX0xJTkVBUiB8fCBtb2RlID09IFZPTF9NRVRIT0RfQURBR0lPKQorCQl2b2x1bWVfbWV0aG9kID0gbW9kZTsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZV92b2x1bWUoaW50IHZvaWNlLCBpbnQgdm9sdW1lKQoreworCWlmICh2b2x1bWUgPCAxMjgpCisJCXZvaWNlc1t2b2ljZV0ubWlkaV92b2x1bWUgPSB2b2x1bWU7CisKKwlzd2l0Y2ggKHZvbHVtZV9tZXRob2QpCisJeworCQljYXNlIFZPTF9NRVRIT0RfQURBR0lPOgorCQkJdm9pY2VzW3ZvaWNlXS5pbml0aWFsX3ZvbHVtZSA9CisJCQkJZ3VzX2FkYWdpb192b2wodm9pY2VzW3ZvaWNlXS5taWRpX3ZvbHVtZSwgdm9pY2VzW3ZvaWNlXS5tYWluX3ZvbCwKKwkJCQkJdm9pY2VzW3ZvaWNlXS5leHByZXNzaW9uX3ZvbCwKKwkJCQkJdm9pY2VzW3ZvaWNlXS5wYXRjaF92b2wpOworCQkJYnJlYWs7CisKKwkJY2FzZSBWT0xfTUVUSE9EX0xJTkVBUjoJLyogVG90YWxseSBpZ25vcmVzIHBhdGNoLXZvbHVtZSBhbmQgZXhwcmVzc2lvbiAqLworCQkJdm9pY2VzW3ZvaWNlXS5pbml0aWFsX3ZvbHVtZSA9IGd1c19saW5lYXJfdm9sKHZvbHVtZSwgdm9pY2VzW3ZvaWNlXS5tYWluX3ZvbCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJdm9pY2VzW3ZvaWNlXS5pbml0aWFsX3ZvbHVtZSA9IHZvbHVtZV9iYXNlICsKKwkJCQkodm9pY2VzW3ZvaWNlXS5taWRpX3ZvbHVtZSAqIHZvbHVtZV9zY2FsZSk7CisJfQorCisJaWYgKHZvaWNlc1t2b2ljZV0uaW5pdGlhbF92b2x1bWUgPiA0MDMwKQorCQl2b2ljZXNbdm9pY2VdLmluaXRpYWxfdm9sdW1lID0gNDAzMDsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZV9hbmRfc2V0X3ZvbHVtZShpbnQgdm9pY2UsIGludCB2b2x1bWUsIGludCByYW1wX3RpbWUpCit7CisJaW50IGN1cnIsIHRhcmdldCwgcmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY29tcHV0ZV92b2x1bWUodm9pY2UsIHZvbHVtZSk7CisJdm9pY2VzW3ZvaWNlXS5jdXJyZW50X3ZvbHVtZSA9IHZvaWNlc1t2b2ljZV0uaW5pdGlhbF92b2x1bWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCS8qCisJICogQ0FVVElPTiEgSW50ZXJydXB0cyBkaXNhYmxlZC4gRW5hYmxlIHRoZW0gYmVmb3JlIHJldHVybmluZworCSAqLworCisJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisKKwljdXJyID0gZ3VzX3JlYWQxNigweDA5KSA+PiA0OworCXRhcmdldCA9IHZvaWNlc1t2b2ljZV0uaW5pdGlhbF92b2x1bWU7CisKKwlpZiAocmFtcF90aW1lID09IElOU1RBTlRfUkFNUCkKKwl7CisJCWd1c19yYW1wb2ZmKCk7CisJCWd1c192b2ljZV92b2x1bWUodGFyZ2V0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmIChyYW1wX3RpbWUgPT0gRkFTVF9SQU1QKQorCQlyYXRlID0gNjM7CisJZWxzZQorCQlyYXRlID0gMTY7CisJZ3VzX3JhbXBfcmF0ZSgwLCByYXRlKTsKKworCWlmICgodGFyZ2V0IC0gY3VycikgLyA2NCA9PSAwKQkvKiBDbG9zZSBlbm91Z2ggdG8gdGFyZ2V0LiAqLworCXsKKwkJZ3VzX3JhbXBvZmYoKTsKKwkJZ3VzX3ZvaWNlX3ZvbHVtZSh0YXJnZXQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCXJldHVybjsKKwl9CisJaWYgKHRhcmdldCA+IGN1cnIpCisJeworCQlpZiAodGFyZ2V0ID4gKDQwOTUgLSA2NSkpCisJCQl0YXJnZXQgPSA0MDk1IC0gNjU7CisJCWd1c19yYW1wX3JhbmdlKGN1cnIsIHRhcmdldCk7CisJCWd1c19yYW1wb24oMHgwMCk7CS8qIFJhbXAgdXAsIG9uY2UsIG5vIElSUSAqLworCX0KKwllbHNlCisJeworCQlpZiAodGFyZ2V0IDwgNjUpCisJCQl0YXJnZXQgPSA2NTsKKworCQlndXNfcmFtcF9yYW5nZSh0YXJnZXQsIGN1cnIpOworCQlndXNfcmFtcG9uKDB4NDApOwkvKiBSYW1wIGRvd24sIG9uY2UsIG5vIGlycSAqLworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGR5bmFtaWNfdm9sdW1lX2NoYW5nZShpbnQgdm9pY2UpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJc3RhdHVzID0gZ3VzX3JlYWQ4KDB4MDApOwkvKiBHZXQgdm9pY2Ugc3RhdHVzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCisJaWYgKHN0YXR1cyAmIDB4MDMpCisJCXJldHVybjsJCS8qIFZvaWNlIHdhcyBub3QgcnVubmluZyAqLworCisJaWYgKCEodm9pY2VzW3ZvaWNlXS5tb2RlICYgV0FWRV9FTlZFTE9QRVMpKQorCXsKKwkJY29tcHV0ZV9hbmRfc2V0X3ZvbHVtZSh2b2ljZSwgdm9pY2VzW3ZvaWNlXS5taWRpX3ZvbHVtZSwgMSk7CisJCXJldHVybjsKKwl9CisJCisJLyoKKwkgKiBWb2ljZSBpcyBydW5uaW5nIGFuZCBoYXMgZW52ZWxvcGVzLgorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwlzdGF0dXMgPSBndXNfcmVhZDgoMHgwZCk7CS8qIFJhbXBpbmcgc3RhdHVzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCisJaWYgKHN0YXR1cyAmIDB4MDMpCS8qIFN1c3RhaW4gcGhhc2U/ICovCisJeworCQljb21wdXRlX2FuZF9zZXRfdm9sdW1lKHZvaWNlLCB2b2ljZXNbdm9pY2VdLm1pZGlfdm9sdW1lLCAxKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodm9pY2VzW3ZvaWNlXS5lbnZfcGhhc2UgPCAwKQorCQlyZXR1cm47CisKKwljb21wdXRlX3ZvbHVtZSh2b2ljZSwgdm9pY2VzW3ZvaWNlXS5taWRpX3ZvbHVtZSk7CisKK30KKworc3RhdGljIHZvaWQgZ3Vzd2F2ZV9jb250cm9sbGVyKGludCBkZXYsIGludCB2b2ljZSwgaW50IGN0cmxfbnVtLCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgICBmcmVxOworCisJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+IDMxKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGN0cmxfbnVtKQorCXsKKwkJY2FzZSBDVFJMX1BJVENIX0JFTkRFUjoKKwkJCXZvaWNlc1t2b2ljZV0uYmVuZGVyID0gdmFsdWU7CisKKwkJCWlmICh2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZSAhPSBWTU9ERV9TVEFSVF9OT1RFKQorCQkJeworCQkJCWZyZXEgPSBjb21wdXRlX2ZpbmV0dW5lKHZvaWNlc1t2b2ljZV0ub3JpZ19mcmVxLCB2YWx1ZSwgdm9pY2VzW3ZvaWNlXS5iZW5kZXJfcmFuZ2UsIDApOworCQkJCXZvaWNlc1t2b2ljZV0uY3VycmVudF9mcmVxID0gZnJlcTsKKworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCQkJZ3VzX3ZvaWNlX2ZyZXEoZnJlcSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDVFJMX1BJVENIX0JFTkRFUl9SQU5HRToKKwkJCXZvaWNlc1t2b2ljZV0uYmVuZGVyX3JhbmdlID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBDVExfRVhQUkVTU0lPTjoKKwkJCXZhbHVlIC89IDEyODsKKwkJY2FzZSBDVFJMX0VYUFJFU1NJT046CisJCQlpZiAodm9sdW1lX21ldGhvZCA9PSBWT0xfTUVUSE9EX0FEQUdJTykKKwkJCXsKKwkJCQl2b2ljZXNbdm9pY2VdLmV4cHJlc3Npb25fdm9sID0gdmFsdWU7CisJCQkJaWYgKHZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlICE9IFZNT0RFX1NUQVJUX05PVEUpCisJCQkJCWR5bmFtaWNfdm9sdW1lX2NoYW5nZSh2b2ljZSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENUTF9QQU46CisJCQl2b2ljZXNbdm9pY2VdLnBhbm5pbmcgPSAodmFsdWUgKiAyKSAtIDEyODsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1RMX01BSU5fVk9MVU1FOgorCQkJdmFsdWUgPSAodmFsdWUgKiAxMDApIC8gMTYzODM7CisKKwkJY2FzZSBDVFJMX01BSU5fVk9MVU1FOgorCQkJdm9pY2VzW3ZvaWNlXS5tYWluX3ZvbCA9IHZhbHVlOworCQkJaWYgKHZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlICE9IFZNT0RFX1NUQVJUX05PVEUpCisJCQkJZHluYW1pY192b2x1bWVfY2hhbmdlKHZvaWNlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ3Vzd2F2ZV9zdGFydF9ub3RlMihpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBub3RlX251bSwgaW50IHZvbHVtZSkKK3sKKwlpbnQgc2FtcGxlLCBiZXN0X3NhbXBsZSwgYmVzdF9kZWx0YSwgZGVsdGFfZnJlcTsKKwlpbnQgaXMxNmJpdHMsIHNhbXBsZXAsIHBhdGNoLCBwYW47CisJdW5zaWduZWQgbG9uZyAgIG5vdGVfZnJlcSwgYmFzZV9ub3RlLCBmcmVxLCBmbGFnczsKKwl1bnNpZ25lZCBjaGFyICAgbW9kZSA9IDA7CisKKwlpZiAodm9pY2UgPCAwIHx8IHZvaWNlID4gMzEpCisJeworLyoJCXByaW50aygiR1VTOiBJbnZhbGlkIHZvaWNlXG4iKTsqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG5vdGVfbnVtID09IDI1NSkKKwl7CisJCWlmICh2b2ljZXNbdm9pY2VdLm1vZGUgJiBXQVZFX0VOVkVMT1BFUykKKwkJeworCQkJdm9pY2VzW3ZvaWNlXS5taWRpX3ZvbHVtZSA9IHZvbHVtZTsKKwkJCWR5bmFtaWNfdm9sdW1lX2NoYW5nZSh2b2ljZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljb21wdXRlX2FuZF9zZXRfdm9sdW1lKHZvaWNlLCB2b2x1bWUsIDEpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKChwYXRjaCA9IHBhdGNoX21hcFt2b2ljZV0pID09IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKHNhbXBsZXAgPSBwYXRjaF90YWJsZVtwYXRjaF0pID09IE5PVF9TQU1QTEUpCisJeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbm90ZV9mcmVxID0gbm90ZV90b19mcmVxKG5vdGVfbnVtKTsKKworCS8qCisJICogRmluZCBhIHNhbXBsZSB3aXRoaW4gYSBwYXRjaCBzbyB0aGF0IHRoZSBub3RlX2ZyZXEgaXMgYmV0d2VlbiBsb3dfbm90ZQorCSAqIGFuZCBoaWdoX25vdGUuCisJICovCisJc2FtcGxlID0gLTE7CisKKwliZXN0X3NhbXBsZSA9IHNhbXBsZXA7CisJYmVzdF9kZWx0YSA9IDEwMDAwMDA7CisJd2hpbGUgKHNhbXBsZXAgIT0gMCAmJiBzYW1wbGVwICE9IE5PVF9TQU1QTEUgJiYgc2FtcGxlID09IC0xKQorCXsKKwkJZGVsdGFfZnJlcSA9IG5vdGVfZnJlcSAtIHNhbXBsZXNbc2FtcGxlcF0uYmFzZV9ub3RlOworCQlpZiAoZGVsdGFfZnJlcSA8IDApCisJCQlkZWx0YV9mcmVxID0gLWRlbHRhX2ZyZXE7CisJCWlmIChkZWx0YV9mcmVxIDwgYmVzdF9kZWx0YSkKKwkJeworCQkJYmVzdF9zYW1wbGUgPSBzYW1wbGVwOworCQkJYmVzdF9kZWx0YSA9IGRlbHRhX2ZyZXE7CisJCX0KKwkJaWYgKHNhbXBsZXNbc2FtcGxlcF0ubG93X25vdGUgPD0gbm90ZV9mcmVxICYmCisJCQlub3RlX2ZyZXEgPD0gc2FtcGxlc1tzYW1wbGVwXS5oaWdoX25vdGUpCisJCXsKKwkJCXNhbXBsZSA9IHNhbXBsZXA7CisJCX0KKwkJZWxzZQorCQkJc2FtcGxlcCA9IHNhbXBsZXNbc2FtcGxlcF0ua2V5OwkvKiBMaW5rIHRvIG5leHQgc2FtcGxlICovCisJICB9CisJaWYgKHNhbXBsZSA9PSAtMSkKKwkJc2FtcGxlID0gYmVzdF9zYW1wbGU7CisKKwlpZiAoc2FtcGxlID09IC0xKQorCXsKKy8qCQlwcmludGsoIkdVUzogUGF0Y2ggJWQgbm90IGRlZmluZWQgZm9yIG5vdGUgJWRcbiIsIHBhdGNoLCBub3RlX251bSk7Ki8KKwkJcmV0dXJuIDA7CS8qIFNob3VsZCBwbGF5IGRlZmF1bHQgcGF0Y2ggPz8/ICovCisJfQorCWlzMTZiaXRzID0gKHNhbXBsZXNbc2FtcGxlXS5tb2RlICYgV0FWRV8xNl9CSVRTKSA/IDEgOiAwOworCXZvaWNlc1t2b2ljZV0ubW9kZSA9IHNhbXBsZXNbc2FtcGxlXS5tb2RlOworCXZvaWNlc1t2b2ljZV0ucGF0Y2hfdm9sID0gc2FtcGxlc1tzYW1wbGVdLnZvbHVtZTsKKworCWlmIChpd19tb2RlKQorCQlndXNfd3JpdGU4KDB4MTUsIDB4MDApOwkJLyogUkFNLCBSZXNldCB2b2ljZSBkZWFjdGl2YXRlIGJpdCBvZiBTTVNJICovCisKKwlpZiAodm9pY2VzW3ZvaWNlXS5tb2RlICYgV0FWRV9FTlZFTE9QRVMpCisJeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQl7CisJCQl2b2ljZXNbdm9pY2VdLmVudl9yYXRlW2ldID0gc2FtcGxlc1tzYW1wbGVdLmVudl9yYXRlW2ldOworCQkJdm9pY2VzW3ZvaWNlXS5lbnZfb2Zmc2V0W2ldID0gc2FtcGxlc1tzYW1wbGVdLmVudl9vZmZzZXRbaV07CisJCX0KKwl9CisJc2FtcGxlX21hcFt2b2ljZV0gPSBzYW1wbGU7CisKKwlpZiAodm9pY2VzW3ZvaWNlXS5maXhlZF9waXRjaCkJLyogRml4ZWQgcGl0Y2ggKi8KKwl7CisJCSAgZnJlcSA9IHNhbXBsZXNbc2FtcGxlXS5iYXNlX2ZyZXE7CisJfQorCWVsc2UKKwl7CisJCWJhc2Vfbm90ZSA9IHNhbXBsZXNbc2FtcGxlXS5iYXNlX25vdGUgLyAxMDA7CisJCW5vdGVfZnJlcSAvPSAxMDA7CisKKwkJZnJlcSA9IHNhbXBsZXNbc2FtcGxlXS5iYXNlX2ZyZXEgKiBub3RlX2ZyZXEgLyBiYXNlX25vdGU7CisJfQorCisJdm9pY2VzW3ZvaWNlXS5vcmlnX2ZyZXEgPSBmcmVxOworCisJLyoKKwkgKiBTaW5jZSB0aGUgcGl0Y2ggYmVuZGVyIG1heSBoYXZlIGJlZW4gc2V0IGJlZm9yZSBwbGF5aW5nIHRoZSBub3RlLCB3ZQorCSAqIGhhdmUgdG8gY2FsY3VsYXRlIHRoZSBiZW5kaW5nIG5vdy4KKwkgKi8KKworCWZyZXEgPSBjb21wdXRlX2ZpbmV0dW5lKHZvaWNlc1t2b2ljZV0ub3JpZ19mcmVxLCB2b2ljZXNbdm9pY2VdLmJlbmRlciwKKwkJCQl2b2ljZXNbdm9pY2VdLmJlbmRlcl9yYW5nZSwgMCk7CisJdm9pY2VzW3ZvaWNlXS5jdXJyZW50X2ZyZXEgPSBmcmVxOworCisJcGFuID0gKHNhbXBsZXNbc2FtcGxlXS5wYW5uaW5nICsgdm9pY2VzW3ZvaWNlXS5wYW5uaW5nKSAvIDMyOworCXBhbiArPSA3OworCWlmIChwYW4gPCAwKQorCQlwYW4gPSAwOworCWlmIChwYW4gPiAxNSkKKwkJcGFuID0gMTU7CisKKwlpZiAoc2FtcGxlc1tzYW1wbGVdLm1vZGUgJiBXQVZFXzE2X0JJVFMpCisJeworCQltb2RlIHw9IDB4MDQ7CS8qIDE2IGJpdHMgKi8KKwkJaWYgKChzYW1wbGVfcHRyc1tzYW1wbGVdIC8gR1VTX0JBTktfU0laRSkgIT0KKwkJCSgoc2FtcGxlX3B0cnNbc2FtcGxlXSArIHNhbXBsZXNbc2FtcGxlXS5sZW4pIC8gR1VTX0JBTktfU0laRSkpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJHVVM6IFNhbXBsZSBhZGRyZXNzIGVycm9yXG4iKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwlndXNfdm9pY2Vfb2ZmKCk7CisJZ3VzX3JhbXBvZmYoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKworCWlmICh2b2ljZXNbdm9pY2VdLm1vZGUgJiBXQVZFX0VOVkVMT1BFUykKKwl7CisJCWNvbXB1dGVfdm9sdW1lKHZvaWNlLCB2b2x1bWUpOworCQlpbml0X2VudmVsb3BlKHZvaWNlKTsKKwl9CisJZWxzZQorCXsKKwkJY29tcHV0ZV9hbmRfc2V0X3ZvbHVtZSh2b2ljZSwgdm9sdW1lLCAwKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCisJaWYgKHNhbXBsZXNbc2FtcGxlXS5tb2RlICYgV0FWRV9MT09QX0JBQ0spCisJCWd1c193cml0ZV9hZGRyKDB4MGEsIHNhbXBsZV9wdHJzW3NhbXBsZV0gKyBzYW1wbGVzW3NhbXBsZV0ubGVuIC0KKwkJCXZvaWNlc1t2b2ljZV0ub2Zmc2V0X3BlbmRpbmcsIDAsIGlzMTZiaXRzKTsJLyogc3RhcnQ9ZW5kICovCisJZWxzZQorCQlndXNfd3JpdGVfYWRkcigweDBhLCBzYW1wbGVfcHRyc1tzYW1wbGVdICsgdm9pY2VzW3ZvaWNlXS5vZmZzZXRfcGVuZGluZywgMCwgaXMxNmJpdHMpOwkvKiBTYW1wbGUgc3RhcnQ9YmVnaW4gKi8KKworCWlmIChzYW1wbGVzW3NhbXBsZV0ubW9kZSAmIFdBVkVfTE9PUElORykKKwl7CisJCW1vZGUgfD0gMHgwODsKKworCQlpZiAoc2FtcGxlc1tzYW1wbGVdLm1vZGUgJiBXQVZFX0JJRElSX0xPT1ApCisJCQltb2RlIHw9IDB4MTA7CisKKwkJaWYgKHNhbXBsZXNbc2FtcGxlXS5tb2RlICYgV0FWRV9MT09QX0JBQ0spCisJCXsKKwkJCWd1c193cml0ZV9hZGRyKDB4MGEsIHNhbXBsZV9wdHJzW3NhbXBsZV0gKyBzYW1wbGVzW3NhbXBsZV0ubG9vcF9lbmQgLQorCQkJCQkgICB2b2ljZXNbdm9pY2VdLm9mZnNldF9wZW5kaW5nLAorCQkJCQkgICAoc2FtcGxlc1tzYW1wbGVdLmZyYWN0aW9ucyA+PiA0KSAmIDB4MGYsIGlzMTZiaXRzKTsKKwkJCW1vZGUgfD0gMHg0MDsKKwkJfQorCQlndXNfd3JpdGVfYWRkcigweDAyLCBzYW1wbGVfcHRyc1tzYW1wbGVdICsgc2FtcGxlc1tzYW1wbGVdLmxvb3Bfc3RhcnQsCisJCQlzYW1wbGVzW3NhbXBsZV0uZnJhY3Rpb25zICYgMHgwZiwgaXMxNmJpdHMpOwkvKiBMb29wIHN0YXJ0IGxvY2F0aW9uICovCisJCWd1c193cml0ZV9hZGRyKDB4MDQsIHNhbXBsZV9wdHJzW3NhbXBsZV0gKyBzYW1wbGVzW3NhbXBsZV0ubG9vcF9lbmQsCisJCQkoc2FtcGxlc1tzYW1wbGVdLmZyYWN0aW9ucyA+PiA0KSAmIDB4MGYsIGlzMTZiaXRzKTsJLyogTG9vcCBlbmQgbG9jYXRpb24gKi8KKwl9CisJZWxzZQorCXsKKwkJbW9kZSB8PSAweDIwOwkvKiBMb29wIElSUSBhdCB0aGUgZW5kICovCisJCXZvaWNlc1t2b2ljZV0ubG9vcF9pcnFfbW9kZSA9IExNT0RFX0ZJTklTSDsJLyogUmFtcCBkb3duIGF0IHRoZSBlbmQgKi8KKwkJdm9pY2VzW3ZvaWNlXS5sb29wX2lycV9wYXJtID0gMTsKKwkJZ3VzX3dyaXRlX2FkZHIoMHgwMiwgc2FtcGxlX3B0cnNbc2FtcGxlXSwgMCwgaXMxNmJpdHMpOwkvKiBMb29wIHN0YXJ0IGxvY2F0aW9uICovCisJCWd1c193cml0ZV9hZGRyKDB4MDQsIHNhbXBsZV9wdHJzW3NhbXBsZV0gKyBzYW1wbGVzW3NhbXBsZV0ubGVuIC0gMSwKKwkJCShzYW1wbGVzW3NhbXBsZV0uZnJhY3Rpb25zID4+IDQpICYgMHgwZiwgaXMxNmJpdHMpOwkvKiBMb29wIGVuZCBsb2NhdGlvbiAqLworCX0KKwlndXNfdm9pY2VfZnJlcShmcmVxKTsKKwlndXNfdm9pY2VfYmFsYW5jZShwYW4pOworCWd1c192b2ljZV9vbihtb2RlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5ldyBndXN3YXZlX3N0YXJ0X25vdGUgYnkgQW5kcmV3IEouIFJvYmluc29uIGF0dGVtcHRzIHRvIG1pbmltaXplIGNsaWNraW5nCisgKiB3aGVuIHRoZSBub3RlIHBsYXlpbmcgb24gdGhlIHZvaWNlIGlzIGNoYW5nZWQuICBJdCB1c2VzIHZvbHVtZQorICogcmFtcGluZy4KKyAqLworCitzdGF0aWMgaW50IGd1c3dhdmVfc3RhcnRfbm90ZShpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBub3RlX251bSwgaW50IHZvbHVtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBtb2RlOworCWludCByZXRfdmFsID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJaWYgKG5vdGVfbnVtID09IDI1NSkKKwl7CisJCWlmICh2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZSA9PSBWTU9ERV9TVEFSVF9OT1RFKQorCQl7CisJCQl2b2ljZXNbdm9pY2VdLnZvbHVtZV9wZW5kaW5nID0gdm9sdW1lOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0X3ZhbCA9IGd1c3dhdmVfc3RhcnRfbm90ZTIoZGV2LCB2b2ljZSwgbm90ZV9udW0sIHZvbHVtZSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCW1vZGUgPSBndXNfcmVhZDgoMHgwMCk7CisJCWlmIChtb2RlICYgMHgyMCkKKwkJCWd1c193cml0ZTgoMHgwMCwgbW9kZSAmIDB4ZGYpOwkvKiBObyBpbnRlcnJ1cHQhICovCisKKwkJdm9pY2VzW3ZvaWNlXS5vZmZzZXRfcGVuZGluZyA9IDA7CisJCXZvaWNlc1t2b2ljZV0ua2lsbF9wZW5kaW5nID0gMDsKKwkJdm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX21vZGUgPSAwOworCQl2b2ljZXNbdm9pY2VdLmxvb3BfaXJxX21vZGUgPSAwOworCisJCWlmICh2b2ljZXNbdm9pY2VdLnNhbXBsZV9wZW5kaW5nID49IDApCisJCXsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsJLyogUnVuIHRlbXBvcmFyaWx5IHdpdGggaW50ZXJydXB0cyBlbmFibGVkICovCisJCQlndXN3YXZlX3NldF9pbnN0cih2b2ljZXNbdm9pY2VdLmRldl9wZW5kaW5nLCB2b2ljZSwgdm9pY2VzW3ZvaWNlXS5zYW1wbGVfcGVuZGluZyk7CisJCQl2b2ljZXNbdm9pY2VdLnNhbXBsZV9wZW5kaW5nID0gLTE7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CS8qIFJlc2VsZWN0IHRoZSB2b2ljZSAoanVzdCB0byBiZSBzdXJlKSAqLworCQl9CisJCWlmICgobW9kZSAmIDB4MDEpIHx8IChpbnQpICgoZ3VzX3JlYWQxNigweDA5KSA+PiA0KSA8ICh1bnNpZ25lZCkgMjA2NSkpCisJCXsKKwkJCXJldF92YWwgPSBndXN3YXZlX3N0YXJ0X25vdGUyKGRldiwgdm9pY2UsIG5vdGVfbnVtLCB2b2x1bWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJdm9pY2VzW3ZvaWNlXS5kZXZfcGVuZGluZyA9IGRldjsKKwkJCXZvaWNlc1t2b2ljZV0ubm90ZV9wZW5kaW5nID0gbm90ZV9udW07CisJCQl2b2ljZXNbdm9pY2VdLnZvbHVtZV9wZW5kaW5nID0gdm9sdW1lOworCQkJdm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX21vZGUgPSBWTU9ERV9TVEFSVF9OT1RFOworCisJCQlndXNfcmFtcG9mZigpOworCQkJZ3VzX3JhbXBfcmFuZ2UoMjAwMCwgNDA2NSk7CisJCQlndXNfcmFtcF9yYXRlKDAsIDYzKTsJLyogRmFzdGVzdCBwb3NzaWJsZSByYXRlICovCisJCQlndXNfcmFtcG9uKDB4MjAgfCAweDQwKTsJLyogUmFtcCBkb3duLCBvbmNlLCBpcnEgKi8KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyB2b2lkIGd1c3dhdmVfcmVzZXQoaW50IGRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCXsKKwkJZ3VzX3ZvaWNlX2luaXQoaSk7CisJCWd1c192b2ljZV9pbml0MihpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ3Vzd2F2ZV9vcGVuKGludCBkZXYsIGludCBtb2RlKQoreworCWludCBlcnI7CisKKwlpZiAoZ3VzX2J1c3kpCisJCXJldHVybiAtRUJVU1k7CisKKwl2b2ljZV9hbGxvYy0+dGltZXN0YW1wID0gMDsKKworCWlmIChndXNfbm9fd2F2ZV9kbWEpIHsKKwkJZ3VzX25vX2RtYSA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKChlcnIgPSBETUFidWZfb3Blbl9kbWEoZ3VzX2Rldm51bSkpIDwgMCkKKwkJeworCQkJLyogcHJpbnRrKCAiR1VTOiBMb2FkaW5nIHNhbXBsZXMgd2l0aG91dCBETUFcbiIpOyAqLworCQkJZ3VzX25vX2RtYSA9IDE7CS8qIFVwbG9hZCBzYW1wbGVzIHVzaW5nIFBJTyAqLworCQl9CisJCWVsc2UKKwkJCWd1c19ub19kbWEgPSAwOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRyYW1fc2xlZXBlcik7CisJZ3VzX2J1c3kgPSAxOworCWFjdGl2ZV9kZXZpY2UgPSBHVVNfREVWX1dBVkU7CisKKwlndXNpbnRyKGd1c19pcnEsICh2b2lkICopZ3VzX2h3X2NvbmZpZywgTlVMTCk7CS8qIFNlcnZlIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCWd1c19pbml0aWFsaXplKCk7CisJZ3VzX3Jlc2V0KCk7CisJZ3VzaW50cihndXNfaXJxLCAodm9pZCAqKWd1c19od19jb25maWcsIE5VTEwpOwkvKiBTZXJ2ZSBwZW5kaW5nIGludGVycnVwdHMgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBndXN3YXZlX2Nsb3NlKGludCBkZXYpCit7CisJZ3VzX2J1c3kgPSAwOworCWFjdGl2ZV9kZXZpY2UgPSAwOworCWd1c19yZXNldCgpOworCisJaWYgKCFndXNfbm9fZG1hKQorCQlETUFidWZfY2xvc2VfZG1hKGd1c19kZXZudW0pOworfQorCitzdGF0aWMgaW50IGd1c3dhdmVfbG9hZF9wYXRjaChpbnQgZGV2LCBpbnQgZm9ybWF0LCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwKKwkJICAgaW50IG9mZnMsIGludCBjb3VudCwgaW50IHBtZ3JfZmxhZykKK3sKKwlzdHJ1Y3QgcGF0Y2hfaW5mbyBwYXRjaDsKKwlpbnQgaW5zdHI7CisJbG9uZyBzaXplb2ZfcGF0Y2g7CisKKwl1bnNpZ25lZCBsb25nIGJsa19zeiwgYmxrX2VuZCwgbGVmdCwgc3JjX29mZnMsIHRhcmdldDsKKworCXNpemVvZl9wYXRjaCA9IChsb25nKSAmcGF0Y2guZGF0YVswXSAtIChsb25nKSAmcGF0Y2g7CS8qIEhlYWRlciBzaXplICovCisKKwlpZiAoZm9ybWF0ICE9IEdVU19QQVRDSCkKKwl7CisvKgkJcHJpbnRrKCJHVVMgRXJyb3I6IEludmFsaWQgcGF0Y2ggZm9ybWF0IChrZXkpIDB4JXhcbiIsIGZvcm1hdCk7Ki8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb3VudCA8IHNpemVvZl9wYXRjaCkKKwl7CisvKgkJICBwcmludGsoIkdVUyBFcnJvcjogUGF0Y2ggaGVhZGVyIHRvbyBzaG9ydFxuIik7Ki8KKwkJICByZXR1cm4gLUVJTlZBTDsKKwl9CisJY291bnQgLT0gc2l6ZW9mX3BhdGNoOworCisJaWYgKGZyZWVfc2FtcGxlID49IE1BWF9TQU1QTEUpCisJeworLyoJCSAgcHJpbnRrKCJHVVM6IFNhbXBsZSB0YWJsZSBmdWxsXG4iKTsqLworCQkgIHJldHVybiAtRU5PU1BDOworCX0KKwkvKgorCSAqIENvcHkgdGhlIGhlYWRlciBmcm9tIHVzZXIgc3BhY2UgYnV0IGlnbm9yZSB0aGUgZmlyc3QgYnl0ZXMgd2hpY2ggaGF2ZQorCSAqIGJlZW4gdHJhbnNmZXJyZWQgYWxyZWFkeS4KKwkgKi8KKworCWlmIChjb3B5X2Zyb21fdXNlcigmKChjaGFyICopICZwYXRjaClbb2Zmc10sICYoYWRkcilbb2Zmc10sCisJCQkgICBzaXplb2ZfcGF0Y2ggLSBvZmZzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfUk9NKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZ3VzX21lbV9zaXplID09IDApCisJCXJldHVybiAtRU5PU1BDOworCisJaW5zdHIgPSBwYXRjaC5pbnN0cl9ubzsKKworCWlmIChpbnN0ciA8IDAgfHwgaW5zdHIgPiBNQVhfUEFUQ0gpCisJeworLyoJCXByaW50ayhLRVJOX0VSUiAiR1VTOiBJbnZhbGlkIHBhdGNoIG51bWJlciAlZFxuIiwgaW5zdHIpOyovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY291bnQgPCBwYXRjaC5sZW4pCisJeworLyoJCXByaW50ayhLRVJOX0VSUiAiR1VTIFdhcm5pbmc6IFBhdGNoIHJlY29yZCB0b28gc2hvcnQgKCVkPCVkKVxuIiwgY291bnQsIChpbnQpIHBhdGNoLmxlbik7Ki8KKwkJcGF0Y2gubGVuID0gY291bnQ7CisJfQorCWlmIChwYXRjaC5sZW4gPD0gMCB8fCBwYXRjaC5sZW4gPiBndXNfbWVtX3NpemUpCisJeworLyoJCXByaW50ayhLRVJOX0VSUiAiR1VTOiBJbnZhbGlkIHNhbXBsZSBsZW5ndGggJWRcbiIsIChpbnQpIHBhdGNoLmxlbik7Ki8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChwYXRjaC5tb2RlICYgV0FWRV9MT09QSU5HKQorCXsKKwkJaWYgKHBhdGNoLmxvb3Bfc3RhcnQgPCAwIHx8IHBhdGNoLmxvb3Bfc3RhcnQgPj0gcGF0Y2gubGVuKQorCQl7CisvKgkJCXByaW50ayhLRVJOX0VSUiAiR1VTOiBJbnZhbGlkIGxvb3Agc3RhcnRcbiIpOyovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAocGF0Y2gubG9vcF9lbmQgPCBwYXRjaC5sb29wX3N0YXJ0IHx8IHBhdGNoLmxvb3BfZW5kID4gcGF0Y2gubGVuKQorCQl7CisvKgkJCXByaW50ayhLRVJOX0VSUiAiR1VTOiBJbnZhbGlkIGxvb3AgZW5kXG4iKTsqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJZnJlZV9tZW1fcHRyID0gKGZyZWVfbWVtX3B0ciArIDMxKSAmIH4zMTsJLyogMzIgYnl0ZSBhbGlnbm1lbnQgKi8KKworCWlmIChwYXRjaC5tb2RlICYgV0FWRV8xNl9CSVRTKQorCXsKKwkJLyoKKwkJICogMTYgYml0IHNhbXBsZXMgbXVzdCBmaXQgb25lIDI1NmsgYmFuay4KKwkJICovCisJCWlmIChwYXRjaC5sZW4gPj0gR1VTX0JBTktfU0laRSkKKwkJeworLyoJCQkgcHJpbnRrKCJHVVM6IFNhbXBsZSAoMTYgYml0KSB0b28gbG9uZyAlZFxuIiwgKGludCkgcGF0Y2gubGVuKTsqLworCQkJcmV0dXJuIC1FTk9TUEM7CisJCX0KKwkJaWYgKChmcmVlX21lbV9wdHIgLyBHVVNfQkFOS19TSVpFKSAhPQorCQkJKChmcmVlX21lbV9wdHIgKyBwYXRjaC5sZW4pIC8gR1VTX0JBTktfU0laRSkpCisJCXsKKwkJCXVuc2lnbmVkIGxvbmcgICB0bXBfbWVtID0JCisJCQkJLyogQWxpZ24gdG8gMjU2SyAqLworCQkJCQkoKGZyZWVfbWVtX3B0ciAvIEdVU19CQU5LX1NJWkUpICsgMSkgKiBHVVNfQkFOS19TSVpFOworCisJCQlpZiAoKHRtcF9tZW0gKyBwYXRjaC5sZW4pID4gZ3VzX21lbV9zaXplKQorCQkJCXJldHVybiAtRU5PU1BDOworCisJCQlmcmVlX21lbV9wdHIgPSB0bXBfbWVtOwkJLyogVGhpcyBsZWF2ZXMgdW51c2FibGUgbWVtb3J5ICovCisJCX0KKwl9CisJaWYgKChmcmVlX21lbV9wdHIgKyBwYXRjaC5sZW4pID4gZ3VzX21lbV9zaXplKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXNhbXBsZV9wdHJzW2ZyZWVfc2FtcGxlXSA9IGZyZWVfbWVtX3B0cjsKKworCS8qCisJICogVHJlbW9sbyBpcyBub3QgcG9zc2libGUgd2l0aCBlbnZlbG9wZXMKKwkgKi8KKworCWlmIChwYXRjaC5tb2RlICYgV0FWRV9FTlZFTE9QRVMpCisJCXBhdGNoLm1vZGUgJj0gfldBVkVfVFJFTU9MTzsKKworCWlmICghKHBhdGNoLm1vZGUgJiBXQVZFX0ZSQUNUSU9OUykpCisJeworCQkgIHBhdGNoLmZyYWN0aW9ucyA9IDA7CisJfQorCW1lbWNweSgoY2hhciAqKSAmc2FtcGxlc1tmcmVlX3NhbXBsZV0sICZwYXRjaCwgc2l6ZW9mX3BhdGNoKTsKKworCS8qCisJICogTGluayB0aGlzX29uZSBzYW1wbGUgdG8gdGhlIGxpc3Qgb2Ygc2FtcGxlcyBmb3IgcGF0Y2ggJ2luc3RyJy4KKwkgKi8KKworCXNhbXBsZXNbZnJlZV9zYW1wbGVdLmtleSA9IHBhdGNoX3RhYmxlW2luc3RyXTsKKwlwYXRjaF90YWJsZVtpbnN0cl0gPSBmcmVlX3NhbXBsZTsKKworCS8qCisJICogVXNlIERNQSB0byB0cmFuc2ZlciB0aGUgd2F2ZSBkYXRhIHRvIHRoZSBEUkFNCisJICovCisKKwlsZWZ0ID0gcGF0Y2gubGVuOworCXNyY19vZmZzID0gMDsKKwl0YXJnZXQgPSBmcmVlX21lbV9wdHI7CisKKwl3aGlsZSAobGVmdCkJCS8qIE5vdCBjb21wbGV0ZWx5IHRyYW5zZmVycmVkIHlldCAqLworCXsKKwkJYmxrX3N6ID0gYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+ZG1hcF9vdXQtPmJ5dGVzX2luX3VzZTsKKwkJaWYgKGJsa19zeiA+IGxlZnQpCisJCQlibGtfc3ogPSBsZWZ0OworCisJCS8qCisJCSAqIERNQSBjYW5ub3QgY3Jvc3MgYmFuayAoMjU2aykgYm91bmRhcmllcy4gQ2hlY2sgZm9yIHRoYXQuCisJCSAqLworCQkgCisJCWJsa19lbmQgPSB0YXJnZXQgKyBibGtfc3o7CisKKwkJaWYgKCh0YXJnZXQgLyBHVVNfQkFOS19TSVpFKSAhPSAoYmxrX2VuZCAvIEdVU19CQU5LX1NJWkUpKQorCQl7CisJCQkvKiBTcGxpdCB0aGUgYmxvY2sgKi8KKwkJCWJsa19lbmQgJj0gfihHVVNfQkFOS19TSVpFIC0gMSk7CisJCQlibGtfc3ogPSBibGtfZW5kIC0gdGFyZ2V0OworCQl9CisJCWlmIChndXNfbm9fZG1hKQorCQl7CisJCQkvKgorCQkJICogRm9yIHNvbWUgcmVhc29uIHRoZSBETUEgaXMgbm90IHBvc3NpYmxlLiBXZSBoYXZlIHRvIHVzZSBQSU8uCisJCQkgKi8KKwkJCWxvbmcgaTsKKwkJCXVuc2lnbmVkIGNoYXIgZGF0YTsKKworCQkJZm9yIChpID0gMDsgaSA8IGJsa19zejsgaSsrKQorCQkJeworCQkJCWdldF91c2VyKCoodW5zaWduZWQgY2hhciAqKSAmZGF0YSwgKHVuc2lnbmVkIGNoYXIgX191c2VyICopICYoKGFkZHIpW3NpemVvZl9wYXRjaCArIGldKSk7CisJCQkJaWYgKHBhdGNoLm1vZGUgJiBXQVZFX1VOU0lHTkVEKQorCQkJCQlpZiAoIShwYXRjaC5tb2RlICYgV0FWRV8xNl9CSVRTKSB8fCAoaSAmIDB4MDEpKQorCQkJCQkJZGF0YSBePSAweDgwOwkvKiBDb252ZXJ0IHRvIHNpZ25lZCAqLworCQkJCWd1c19wb2tlKHRhcmdldCArIGksIGRhdGEpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBob2xkX2FkZHJlc3M7CisJCQl1bnNpZ25lZCBjaGFyIGRtYV9jb21tYW5kOworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJaWYgKGF1ZGlvX2RldnNbZ3VzX2Rldm51bV0tPmRtYXBfb3V0LT5yYXdfYnVmID09IE5VTEwpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJHVVM6IERNQSBidWZmZXIgPT0gTlVMTFxuIik7CisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQl9CisJCQkvKgorCQkJICogT0ssIG1vdmUgbm93LiBGaXJzdCBpbiBhbmQgdGhlbiBvdXQuCisJCQkgKi8KKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGF1ZGlvX2RldnNbZ3VzX2Rldm51bV0tPmRtYXBfb3V0LT5yYXdfYnVmLAorCQkJCQkgICAmKGFkZHIpW3NpemVvZl9wYXRjaCArIHNyY19vZmZzXSwKKwkJCQkJICAgYmxrX3N6KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c193cml0ZTgoMHg0MSwgMCk7CS8qIERpc2FibGUgR0YxIERNQSAqLworCQkJRE1BYnVmX3N0YXJ0X2RtYShndXNfZGV2bnVtLCBhdWRpb19kZXZzW2d1c19kZXZudW1dLT5kbWFwX291dC0+cmF3X2J1Zl9waHlzLAorCQkJCWJsa19zeiwgRE1BX01PREVfV1JJVEUpOworCisJCQkvKgorCQkJICogU2V0IHRoZSBEUkFNIGFkZHJlc3MgZm9yIHRoZSB3YXZlIGRhdGEKKwkJCSAqLworCisJCQlpZiAoaXdfbW9kZSkKKwkJCXsKKwkJCQkvKiBEaWZmZXJlbnQgYWRkcmVzcyB0cmFuc2xhdGlvbiBpbiBlbmhhbmNlZCBtb2RlICovCisKKwkJCQl1bnNpZ25lZCBjaGFyICAgaGk7CisKKwkJCQlpZiAoZ3VzX2RtYSA+IDQpCisJCQkJCWFkZHJlc3MgPSB0YXJnZXQgPj4gMTsJLyogQ29udmVydCB0byAxNiBiaXQgd29yZCBhZGRyZXNzICovCisJCQkJZWxzZQorCQkJCQlhZGRyZXNzID0gdGFyZ2V0OworCisJCQkJaGkgPSAodW5zaWduZWQgY2hhcikgKChhZGRyZXNzID4+IDE2KSAmIDB4ZjApOworCQkJCWhpICs9ICh1bnNpZ25lZCBjaGFyKSAoYWRkcmVzcyAmIDB4MGYpOworCisJCQkJZ3VzX3dyaXRlMTYoMHg0MiwgKGFkZHJlc3MgPj4gNCkgJiAweGZmZmYpOwkvKiBETUEgYWRkcmVzcyAobG93KSAqLworCQkJCWd1c193cml0ZTgoMHg1MCwgaGkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFkZHJlc3MgPSB0YXJnZXQ7CisJCQkJaWYgKGF1ZGlvX2RldnNbZ3VzX2Rldm51bV0tPmRtYXBfb3V0LT5kbWEgPiAzKQorCQkJCXsKKwkJCQkJaG9sZF9hZGRyZXNzID0gYWRkcmVzczsKKwkJCQkJYWRkcmVzcyA9IGFkZHJlc3MgPj4gMTsKKwkJCQkJYWRkcmVzcyAmPSAweDAwMDFmZmZmTDsKKwkJCQkJYWRkcmVzcyB8PSAoaG9sZF9hZGRyZXNzICYgMHgwMDBjMDAwMEwpOworCQkJCX0KKwkJCQlndXNfd3JpdGUxNigweDQyLCAoYWRkcmVzcyA+PiA0KSAmIDB4ZmZmZik7CS8qIERSQU0gRE1BIGFkZHJlc3MgKi8KKwkJCX0KKworCQkJLyoKKwkJCSAqIFN0YXJ0IHRoZSBETUEgdHJhbnNmZXIKKwkJCSAqLworCisJCQlkbWFfY29tbWFuZCA9IDB4MjE7CQkvKiBJUlEgZW5hYmxlLCBETUEgc3RhcnQgKi8KKwkJCWlmIChwYXRjaC5tb2RlICYgV0FWRV9VTlNJR05FRCkKKwkJCQlkbWFfY29tbWFuZCB8PSAweDgwOwkvKiBJbnZlcnQgTVNCICovCisJCQlpZiAocGF0Y2gubW9kZSAmIFdBVkVfMTZfQklUUykKKwkJCQlkbWFfY29tbWFuZCB8PSAweDQwOwkvKiAxNiBiaXQgX0RBVEFfICovCisJCQlpZiAoYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+ZG1hcF9vdXQtPmRtYSA+IDMpCisJCQkJZG1hX2NvbW1hbmQgfD0gMHgwNDsJLyogMTYgYml0IERNQSBfY2hhbm5lbF8gKi8KKwkJCQorCQkJLyoKKwkJCSAqIFNsZWVwIGhlcmUgdW50aWwgdGhlIERSQU0gRE1BIGRvbmUgaW50ZXJydXB0IGlzIHNlcnZlZAorCQkJICovCisJCQlhY3RpdmVfZGV2aWNlID0gR1VTX0RFVl9XQVZFOworCQkJZ3VzX3dyaXRlOCgweDQxLCBkbWFfY29tbWFuZCk7CS8qIExldHMgZ28gbHV0ZWV0ICg9YnVncykgKi8KKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOyAvKiBvcGVucyBhIHJhY2UgKi8KKwkJCWlmICghaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZkcmFtX3NsZWVwZXIsIEhaKSkKKwkJCQlwcmludGsoIkdVUzogRE1BIFRyYW5zZmVyIHRpbWVkIG91dFxuIik7CisJCX0KKworCQkvKgorCQkgKiBOb3cgdGhlIG5leHQgcGFydAorCQkgKi8KKworCQlsZWZ0IC09IGJsa19zejsKKwkJc3JjX29mZnMgKz0gYmxrX3N6OworCQl0YXJnZXQgKz0gYmxrX3N6OworCisJCWd1c193cml0ZTgoMHg0MSwgMCk7CS8qIFN0b3AgRE1BICovCisJfQorCisJZnJlZV9tZW1fcHRyICs9IHBhdGNoLmxlbjsKKwlmcmVlX3NhbXBsZSsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBndXN3YXZlX2h3X2NvbnRyb2woaW50IGRldiwgdW5zaWduZWQgY2hhciAqZXZlbnRfcmVjKQoreworCWludCB2b2ljZSwgY21kOworCXVuc2lnbmVkIHNob3J0IHAxLCBwMjsKKwl1bnNpZ25lZCBpbnQgcGxvbmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNtZCA9IGV2ZW50X3JlY1syXTsKKwl2b2ljZSA9IGV2ZW50X3JlY1szXTsKKwlwMSA9ICoodW5zaWduZWQgc2hvcnQgKikgJmV2ZW50X3JlY1s0XTsKKwlwMiA9ICoodW5zaWduZWQgc2hvcnQgKikgJmV2ZW50X3JlY1s2XTsKKwlwbG9uZyA9ICoodW5zaWduZWQgaW50ICopICZldmVudF9yZWNbNF07CisKKwlpZiAoKHZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlID09IFZNT0RFX1NUQVJUX05PVEUpICYmCisJCShjbWQgIT0gX0dVU19WT0lDRVNBTVBMRSkgJiYgKGNtZCAhPSBfR1VTX1ZPSUNFX1BPUykpCisJCWRvX3ZvbHVtZV9pcnEodm9pY2UpOworCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIF9HVVNfTlVNVk9JQ0VTOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQkJZ3VzX3NlbGVjdF9tYXhfdm9pY2VzKHAxKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgX0dVU19WT0lDRVNBTVBMRToKKwkJCWd1c3dhdmVfc2V0X2luc3RyKGRldiwgdm9pY2UsIHAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgX0dVU19WT0lDRU9OOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQkJcDEgJj0gfjB4MjA7CS8qIERvbid0IGFsbG93IGludGVycnVwdHMgKi8KKwkJCWd1c192b2ljZV9vbihwMSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfVk9JQ0VPRkY6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCQlndXNfdm9pY2Vfb2ZmKCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfVk9JQ0VGQURFOgorCQkJZ3VzX3ZvaWNlX2ZhZGUodm9pY2UpOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1ZPSUNFTU9ERToKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJCXAxICY9IH4weDIwOwkvKiBEb24ndCBhbGxvdyBpbnRlcnJ1cHRzICovCisJCQlndXNfdm9pY2VfbW9kZShwMSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfVk9JQ0VCQUxBOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQkJZ3VzX3ZvaWNlX2JhbGFuY2UocDEpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1ZPSUNFRlJFUToKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJCWd1c192b2ljZV9mcmVxKHBsb25nKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgX0dVU19WT0lDRVZPTDoKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJCWd1c192b2ljZV92b2x1bWUocDEpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1ZPSUNFVk9MMjoJLyogSnVzdCB1cGRhdGUgdGhlIHNvZnR3YXJlIHZvaWNlIGxldmVsICovCisJCQl2b2ljZXNbdm9pY2VdLmluaXRpYWxfdm9sdW1lID0gdm9pY2VzW3ZvaWNlXS5jdXJyZW50X3ZvbHVtZSA9IHAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1JBTVBSQU5HRToKKwkJCWlmICh2b2ljZXNbdm9pY2VdLm1vZGUgJiBXQVZFX0VOVkVMT1BFUykKKwkJCQlicmVhazsJLyogTk8tTk8gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJCWd1c19yYW1wX3JhbmdlKHAxLCBwMik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfUkFNUFJBVEU6CisJCQlpZiAodm9pY2VzW3ZvaWNlXS5tb2RlICYgV0FWRV9FTlZFTE9QRVMpCisJCQkJYnJlYWs7CS8qIE5KRVQtTkpFVCAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQkJZ3VzX3JhbXBfcmF0ZShwMSwgcDIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1JBTVBNT0RFOgorCQkJaWYgKHZvaWNlc1t2b2ljZV0ubW9kZSAmIFdBVkVfRU5WRUxPUEVTKQorCQkJCWJyZWFrOwkvKiBOTy1OTyAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQkJcDEgJj0gfjB4MjA7CS8qIERvbid0IGFsbG93IGludGVycnVwdHMgKi8KKwkJCWd1c19yYW1wX21vZGUocDEpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1JBTVBPTjoKKwkJCWlmICh2b2ljZXNbdm9pY2VdLm1vZGUgJiBXQVZFX0VOVkVMT1BFUykKKwkJCQlicmVhazsJLyogRUktRUkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJCXAxICY9IH4weDIwOwkvKiBEb24ndCBhbGxvdyBpbnRlcnJ1cHRzICovCisJCQlndXNfcmFtcG9uKHAxKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgX0dVU19SQU1QT0ZGOgorCQkJaWYgKHZvaWNlc1t2b2ljZV0ubW9kZSAmIFdBVkVfRU5WRUxPUEVTKQorCQkJCWJyZWFrOwkvKiBORUotTkVKICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCQlndXNfcmFtcG9mZigpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1ZPTFVNRV9TQ0FMRToKKwkJCXZvbHVtZV9iYXNlID0gcDE7CisJCQl2b2x1bWVfc2NhbGUgPSBwMjsKKwkJCWJyZWFrOworCisJCWNhc2UgX0dVU19WT0lDRV9QT1M6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCQlndXNfc2V0X3ZvaWNlX3Bvcyh2b2ljZSwgcGxvbmcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBndXNfYXVkaW9fc2V0X3NwZWVkKGludCBzcGVlZCkKK3sKKwlpZiAoc3BlZWQgPD0gMCkKKwkJc3BlZWQgPSBndXNfYXVkaW9fc3BlZWQ7CisKKwlpZiAoc3BlZWQgPCA0MDAwKQorCQlzcGVlZCA9IDQwMDA7CisKKwlpZiAoc3BlZWQgPiA0NDEwMCkKKwkJc3BlZWQgPSA0NDEwMDsKKworCWd1c19hdWRpb19zcGVlZCA9IHNwZWVkOworCisJaWYgKG9ubHlfcmVhZF9hY2Nlc3MpCisJeworCQkvKiBDb21wdXRlIG5lYXJlc3QgdmFsaWQgcmVjb3JkaW5nIHNwZWVkICBhbmQgcmV0dXJuIGl0ICovCisKKwkJLyogc3BlZWQgPSAoOTg3ODQwMCAvIChndXNfYXVkaW9fc3BlZWQgKyAyKSkgLyAxNjsgKi8KKwkJc3BlZWQgPSAoKCg5ODc4NDAwICsgZ3VzX2F1ZGlvX3NwZWVkIC8gMikgLyAoZ3VzX2F1ZGlvX3NwZWVkICsgMikpICsgOCkgLyAxNjsKKwkJc3BlZWQgPSAoOTg3ODQwMCAvIChzcGVlZCAqIDE2KSkgLSAyOworCX0KKwlyZXR1cm4gc3BlZWQ7Cit9CisKK3N0YXRpYyBpbnQgZ3VzX2F1ZGlvX3NldF9jaGFubmVscyhpbnQgY2hhbm5lbHMpCit7CisJaWYgKCFjaGFubmVscykKKwkJcmV0dXJuIGd1c19hdWRpb19jaGFubmVsczsKKwlpZiAoY2hhbm5lbHMgPiAyKQorCQljaGFubmVscyA9IDI7CisJaWYgKGNoYW5uZWxzIDwgMSkKKwkJY2hhbm5lbHMgPSAxOworCWd1c19hdWRpb19jaGFubmVscyA9IGNoYW5uZWxzOworCXJldHVybiBjaGFubmVsczsKK30KKworc3RhdGljIGludCBndXNfYXVkaW9fc2V0X2JpdHMoaW50IGJpdHMpCit7CisJaWYgKCFiaXRzKQorCQlyZXR1cm4gZ3VzX2F1ZGlvX2JpdHM7CisKKwlpZiAoYml0cyAhPSA4ICYmIGJpdHMgIT0gMTYpCisJCWJpdHMgPSA4OworCisJaWYgKG9ubHlfOF9iaXRzKQorCQliaXRzID0gODsKKworCWd1c19hdWRpb19iaXRzID0gYml0czsKKwlyZXR1cm4gYml0czsKK30KKworc3RhdGljIGludCBndXNfYXVkaW9faW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgdmFsOworCisJc3dpdGNoIChjbWQpIAorCXsKKwkJY2FzZSBTT1VORF9QQ01fV1JJVEVfUkFURToKKwkJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdmFsID0gZ3VzX2F1ZGlvX3NldF9zcGVlZCh2YWwpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQkJdmFsID0gZ3VzX2F1ZGlvX3NwZWVkOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXZhbCA9IGd1c19hdWRpb19zZXRfY2hhbm5lbHModmFsICsgMSkgLSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFM6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl2YWwgPSBndXNfYXVkaW9fc2V0X2NoYW5uZWxzKHZhbCk7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQkJdmFsID0gZ3VzX2F1ZGlvX2NoYW5uZWxzOworCQkJYnJlYWs7CisJCQorCQljYXNlIFNORENUTF9EU1BfU0VURk1UOgorCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdmFsID0gZ3VzX2F1ZGlvX3NldF9iaXRzKHZhbCk7CisJCQlicmVhazsKKwkJCisJCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJCXZhbCA9IGd1c19hdWRpb19iaXRzOworCQkJYnJlYWs7CisJCQorCQljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CQkvKiBOT1QgUE9TU0lCTEUgKi8KKwkJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCQl2YWwgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOworfQorCitzdGF0aWMgdm9pZCBndXNfYXVkaW9fcmVzZXQoaW50IGRldikKK3sKKwlpZiAocmVjb3JkaW5nX2FjdGl2ZSkKKwl7CisJCWd1c193cml0ZTgoMHg0OSwgMHgwMCk7CS8qIEhhbHQgcmVjb3JkaW5nICovCisJCXNldF9pbnB1dF92b2x1bWVzKCk7CisJfQorfQorCitzdGF0aWMgaW50IHNhdmVkX2l3X21vZGU7CS8qIEEgaGFjayBoYWNrIGhhY2sgKi8KKworc3RhdGljIGludCBndXNfYXVkaW9fb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlpZiAoZ3VzX2J1c3kpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoZ3VzX3BucF9mbGFnICYmIG1vZGUgJiBPUEVOX1JFQUQpCisJeworLyoJCXByaW50ayhLRVJOX0VSUiAiR1VTOiBBdWRpbyBkZXZpY2UgIyVkIGlzIHBsYXliYWNrIG9ubHkuXG4iLCBkZXYpOyovCisJCXJldHVybiAtRUlPOworCX0KKwlndXNfaW5pdGlhbGl6ZSgpOworCisJZ3VzX2J1c3kgPSAxOworCWFjdGl2ZV9kZXZpY2UgPSAwOworCisJc2F2ZWRfaXdfbW9kZSA9IGl3X21vZGU7CisJaWYgKGl3X21vZGUpCisJeworCQkvKiBUaGVyZSBhcmUgc29tZSBwcm9ibGVtcyB3aXRoIGF1ZGlvIGluIGVuaGFuY2VkIG1vZGUgc28gZGlzYWJsZSBpdCAqLworCQlndXNfd3JpdGU4KDB4MTksIGd1c19yZWFkOCgweDE5KSAmIH4weDAxKTsJLyogRGlzYWJsZSBlbmhhbmNlZCBtb2RlICovCisJCWl3X21vZGUgPSAwOworCX0KKworCWd1c19yZXNldCgpOworCXJlc2V0X3NhbXBsZV9tZW1vcnkoKTsKKwlndXNfc2VsZWN0X21heF92b2ljZXMoMTQpOworCisJcGNtX2FjdGl2ZSA9IDA7CisJZG1hX2FjdGl2ZSA9IDA7CisJcGNtX29wZW5lZCA9IDE7CisJaWYgKG1vZGUgJiBPUEVOX1JFQUQpCisJeworCQlyZWNvcmRpbmdfYWN0aXZlID0gMTsKKwkJc2V0X2lucHV0X3ZvbHVtZXMoKTsKKwl9CisJb25seV9yZWFkX2FjY2VzcyA9ICEobW9kZSAmIE9QRU5fV1JJVEUpOworCW9ubHlfOF9iaXRzID0gbW9kZSAmIE9QRU5fUkVBRDsKKwlpZiAob25seV84X2JpdHMpCisJCWF1ZGlvX2RldnNbZGV2XS0+Zm9ybWF0X21hc2sgPSBBRk1UX1U4OworCWVsc2UKKwkJYXVkaW9fZGV2c1tkZXZdLT5mb3JtYXRfbWFzayA9IEFGTVRfVTggfCBBRk1UX1MxNl9MRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBndXNfYXVkaW9fY2xvc2UoaW50IGRldikKK3sKKwlpd19tb2RlID0gc2F2ZWRfaXdfbW9kZTsKKwlndXNfcmVzZXQoKTsKKwlndXNfYnVzeSA9IDA7CisJcGNtX29wZW5lZCA9IDA7CisJYWN0aXZlX2RldmljZSA9IDA7CisKKwlpZiAocmVjb3JkaW5nX2FjdGl2ZSkKKwl7CisJCWd1c193cml0ZTgoMHg0OSwgMHgwMCk7CS8qIEhhbHQgcmVjb3JkaW5nICovCisJCXNldF9pbnB1dF92b2x1bWVzKCk7CisJfQorCXJlY29yZGluZ19hY3RpdmUgPSAwOworfQorCitzdGF0aWMgdm9pZCBndXNfYXVkaW9fdXBkYXRlX3ZvbHVtZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHZvaWNlOworCisJaWYgKHBjbV9hY3RpdmUgJiYgcGNtX29wZW5lZCkKKwkJZm9yICh2b2ljZSA9IDA7IHZvaWNlIDwgZ3VzX2F1ZGlvX2NoYW5uZWxzOyB2b2ljZSsrKQorCQl7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCQlndXNfcmFtcG9mZigpOworCQkJZ3VzX3ZvaWNlX3ZvbHVtZSgxNTMwICsgKDI1ICogZ3VzX3BjbV92b2x1bWUpKTsKKwkJCWd1c19yYW1wX3JhbmdlKDY1LCAxNTMwICsgKDI1ICogZ3VzX3BjbV92b2x1bWUpKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJfQorfQorCitzdGF0aWMgdm9pZCBwbGF5X25leHRfcGNtX2Jsb2NrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3BlZWQgPSBndXNfYXVkaW9fc3BlZWQ7CisJaW50IHRoaXNfb25lLCBpczE2Yml0cywgY2huOworCXVuc2lnbmVkIGxvbmcgZHJhbV9sb2M7CisJdW5zaWduZWQgY2hhciBtb2RlWzJdLCByYW1wX21vZGVbMl07CisKKwlpZiAoIXBjbV9xbGVuKQorCQlyZXR1cm47CisKKwl0aGlzX29uZSA9IHBjbV9oZWFkOworCisJZm9yIChjaG4gPSAwOyBjaG4gPCBndXNfYXVkaW9fY2hhbm5lbHM7IGNobisrKQorCXsKKwkJbW9kZVtjaG5dID0gMHgwMDsKKwkJcmFtcF9tb2RlW2Nobl0gPSAweDAzOwkvKiBSYW1waW5nIGFuZCByb2xsb3ZlciBvZmYgKi8KKworCQlpZiAoY2huID09IDApCisJCXsKKwkJCW1vZGVbY2huXSB8PSAweDIwOwkvKiBMb29wIElSUSAqLworCQkJdm9pY2VzW2Nobl0ubG9vcF9pcnFfbW9kZSA9IExNT0RFX1BDTTsKKwkJfQorCQlpZiAoZ3VzX2F1ZGlvX2JpdHMgIT0gOCkKKwkJeworCQkJaXMxNmJpdHMgPSAxOworCQkJbW9kZVtjaG5dIHw9IDB4MDQ7CS8qIDE2IGJpdCBkYXRhICovCisJCX0KKwkJZWxzZQorCQkJaXMxNmJpdHMgPSAwOworCisJCWRyYW1fbG9jID0gdGhpc19vbmUgKiBwY21fYnNpemU7CisJCWRyYW1fbG9jICs9IGNobiAqIHBjbV9iYW5rc2l6ZTsKKworCQlpZiAodGhpc19vbmUgPT0gKHBjbV9uYmxrIC0gMSkpCS8qIExhc3QgZnJhZ21lbnQgb2YgdGhlIERSQU0gYnVmZmVyICovCisJCXsKKwkJCW1vZGVbY2huXSB8PSAweDA4OwkvKiBFbmFibGUgbG9vcCAqLworCQkJcmFtcF9tb2RlW2Nobl0gPSAweDAzOwkvKiBEaXNhYmxlIHJvbGxvdmVyIGJpdCAqLworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKGNobiA9PSAwKQorCQkJCXJhbXBfbW9kZVtjaG5dID0gMHgwNDsJLyogRW5hYmxlIHJvbGxvdmVyIGJpdCAqLworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCWd1c19zZWxlY3Rfdm9pY2UoY2huKTsKKwkJZ3VzX3ZvaWNlX2ZyZXEoc3BlZWQpOworCisJCWlmIChndXNfYXVkaW9fY2hhbm5lbHMgPT0gMSkKKwkJCWd1c192b2ljZV9iYWxhbmNlKDcpOwkJLyogbW9ubyAqLworCQllbHNlIGlmIChjaG4gPT0gMCkKKwkJCWd1c192b2ljZV9iYWxhbmNlKDApOwkJLyogbGVmdCAqLworCQllbHNlCisJCQlndXNfdm9pY2VfYmFsYW5jZSgxNSk7CQkvKiByaWdodCAqLworCisJCWlmICghcGNtX2FjdGl2ZSkJLyogUGxheWJhY2sgbm90IGFscmVhZHkgYWN0aXZlICovCisJCXsKKwkJCS8qCisJCQkgKiBUaGUgcGxheWJhY2sgd2FzIG5vdCBzdGFydGVkIHlldCAob3IgdGhlcmUgaGFzIGJlZW4gYSBwYXVzZSkuCisJCQkgKiBTdGFydCB0aGUgdm9pY2UgKGFnYWluKSBhbmQgYXNrIGZvciBhIHJvbGxvdmVyIGlycSBhdCB0aGUgZW5kIG9mCisJCQkgKiB0aGlzX29uZSBibG9jay4gSWYgdGhpc19vbmUgb25lIGlzIGxhc3Qgb2YgdGhlIGJ1ZmZlcnMsIHVzZSBqdXN0CisJCQkgKiB0aGUgbm9ybWFsIGxvb3Agd2l0aCBpcnEuCisJCQkgKi8KKworCQkJZ3VzX3ZvaWNlX29mZigpOworCQkJZ3VzX3JhbXBvZmYoKTsKKwkJCWd1c192b2ljZV92b2x1bWUoMTUzMCArICgyNSAqIGd1c19wY21fdm9sdW1lKSk7CisJCQlndXNfcmFtcF9yYW5nZSg2NSwgMTUzMCArICgyNSAqIGd1c19wY21fdm9sdW1lKSk7CisKKwkJCWd1c193cml0ZV9hZGRyKDB4MGEsIGNobiAqIHBjbV9iYW5rc2l6ZSwgMCwgaXMxNmJpdHMpOwkvKiBTdGFydGluZyBwb3NpdGlvbiAqLworCQkJZ3VzX3dyaXRlX2FkZHIoMHgwMiwgY2huICogcGNtX2JhbmtzaXplLCAwLCBpczE2Yml0cyk7CS8qIExvb3Agc3RhcnQgKi8KKworCQkJaWYgKGNobiAhPSAwKQorCQkJCWd1c193cml0ZV9hZGRyKDB4MDQsIHBjbV9iYW5rc2l6ZSArIChwY21fYnNpemUgKiBwY21fbmJsaykgLSAxLAorCQkJCQkJICAgMCwgaXMxNmJpdHMpOwkvKiBMb29wIGVuZCBsb2NhdGlvbiAqLworCQl9CisJCWlmIChjaG4gPT0gMCkKKwkJCWd1c193cml0ZV9hZGRyKDB4MDQsIGRyYW1fbG9jICsgcGNtX2JzaXplIC0gMSwKKwkJCQkJIDAsIGlzMTZiaXRzKTsJLyogTG9vcCBlbmQgbG9jYXRpb24gKi8KKwkJZWxzZQorCQkJbW9kZVtjaG5dIHw9IDB4MDg7CS8qIEVuYWJsZSBsb29waW5nICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwl9CisJZm9yIChjaG4gPSAwOyBjaG4gPCBndXNfYXVkaW9fY2hhbm5lbHM7IGNobisrKQorCXsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJZ3VzX3NlbGVjdF92b2ljZShjaG4pOworCQlndXNfd3JpdGU4KDB4MGQsIHJhbXBfbW9kZVtjaG5dKTsKKwkJaWYgKGl3X21vZGUpCisJCQlndXNfd3JpdGU4KDB4MTUsIDB4MDApOwkvKiBSZXNldCB2b2ljZSBkZWFjdGl2YXRlIGJpdCBvZiBTTVNJICovCisJCWd1c192b2ljZV9vbihtb2RlW2Nobl0pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJfQorCXBjbV9hY3RpdmUgPSAxOworfQorCitzdGF0aWMgdm9pZCBndXNfdHJhbnNmZXJfb3V0cHV0X2Jsb2NrKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLAorCQkJICBpbnQgdG90YWxfY291bnQsIGludCBpbnRyZmxhZywgaW50IGNobikKK3sKKwkvKgorCSAqIFRoaXMgcm91dGluZSB0cmFuc2ZlcnMgb25lIGJsb2NrIG9mIGF1ZGlvIGRhdGEgdG8gdGhlIERSQU0uIEluIG1vbm8gbW9kZQorCSAqIGl0J3MgY2FsbGVkIGp1c3Qgb25jZS4gV2hlbiBpbiBzdGVyZW8gbW9kZSwgdGhpc19vbmUgcm91dGluZSBpcyBjYWxsZWQKKwkgKiBvbmNlIGZvciBib3RoIGNoYW5uZWxzLgorCSAqCisJICogVGhlIGxlZnQvbW9ubyBjaGFubmVsIGRhdGEgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIGJlZ2lubmluZyBvZiBkcmFtIGFuZCB0aGUKKwkgKiByaWdodCBkYXRhIHRvIHRoZSBhcmVhIHBvaW50ZWQgYnkgZ3VzX3BhZ2Vfc2l6ZS4KKwkgKi8KKworCWludCB0aGlzX29uZSwgY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGRtYV9jb21tYW5kOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaG9sZF9hZGRyZXNzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKworCWNvdW50ID0gdG90YWxfY291bnQgLyBndXNfYXVkaW9fY2hhbm5lbHM7CisKKwlpZiAoY2huID09IDApCisJeworCQlpZiAocGNtX3FsZW4gPj0gcGNtX25ibGspCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJHVVMgV2FybmluZzogUENNIGJ1ZmZlcnMgb3V0IG9mIHN5bmNcbiIpOworCisJCXRoaXNfb25lID0gcGNtX2N1cnJlbnRfYmxvY2sgPSBwY21fdGFpbDsKKwkJcGNtX3FsZW4rKzsKKwkJcGNtX3RhaWwgPSAocGNtX3RhaWwgKyAxKSAlIHBjbV9uYmxrOworCQlwY21fZGF0YXNpemVbdGhpc19vbmVdID0gY291bnQ7CisJfQorCWVsc2UKKwkJdGhpc19vbmUgPSBwY21fY3VycmVudF9ibG9jazsKKworCWd1c193cml0ZTgoMHg0MSwgMCk7CS8qIERpc2FibGUgR0YxIERNQSAqLworCURNQWJ1Zl9zdGFydF9kbWEoZGV2LCBidWYgKyAoY2huICogY291bnQpLCBjb3VudCwgRE1BX01PREVfV1JJVEUpOworCisJYWRkcmVzcyA9IHRoaXNfb25lICogcGNtX2JzaXplOworCWFkZHJlc3MgKz0gY2huICogcGNtX2JhbmtzaXplOworCisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA+IDMpCisJeworCQlob2xkX2FkZHJlc3MgPSBhZGRyZXNzOworCQlhZGRyZXNzID0gYWRkcmVzcyA+PiAxOworCQlhZGRyZXNzICY9IDB4MDAwMWZmZmZMOworCQlhZGRyZXNzIHw9IChob2xkX2FkZHJlc3MgJiAweDAwMGMwMDAwTCk7CisJfQorCWd1c193cml0ZTE2KDB4NDIsIChhZGRyZXNzID4+IDQpICYgMHhmZmZmKTsJLyogRFJBTSBETUEgYWRkcmVzcyAqLworCisJZG1hX2NvbW1hbmQgPSAweDIxOwkvKiBJUlEgZW5hYmxlLCBETUEgc3RhcnQgKi8KKworCWlmIChndXNfYXVkaW9fYml0cyAhPSA4KQorCQlkbWFfY29tbWFuZCB8PSAweDQwOwkvKiAxNiBiaXQgX0RBVEFfICovCisJZWxzZQorCQlkbWFfY29tbWFuZCB8PSAweDgwOwkvKiBJbnZlcnQgTVNCICovCisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID4gMykKKwkJZG1hX2NvbW1hbmQgfD0gMHgwNDsJLyogMTYgYml0IERNQSBjaGFubmVsICovCisKKwlndXNfd3JpdGU4KDB4NDEsIGRtYV9jb21tYW5kKTsJLyogS2ljayBzdGFydCAqLworCisJaWYgKGNobiA9PSAoZ3VzX2F1ZGlvX2NoYW5uZWxzIC0gMSkpCS8qIExhc3QgY2hhbm5lbCAqLworCXsKKwkJLyoKKwkJICogTGFzdCAocmlnaHQgb3IgbW9ubykgY2hhbm5lbCBkYXRhCisJCSAqLworCQlkbWFfYWN0aXZlID0gMTsJLyogRE1BIHN0YXJ0ZWQuIFRoZXJlIGlzIGEgdW5hY2tub3dsZWRnZWQgYnVmZmVyICovCisJCWFjdGl2ZV9kZXZpY2UgPSBHVVNfREVWX1BDTV9ET05FOworCQlpZiAoIXBjbV9hY3RpdmUgJiYgKHBjbV9xbGVuID4gMSB8fCBjb3VudCA8IHBjbV9ic2l6ZSkpCisJCXsKKwkJCXBsYXlfbmV4dF9wY21fYmxvY2soKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvKgorCQkgKiBMZWZ0IGNoYW5uZWwgZGF0YS4gVGhlIHJpZ2h0IGNoYW5uZWwKKwkJICogaXMgdHJhbnNmZXJyZWQgYWZ0ZXIgRE1BIGludGVycnVwdAorCQkgKi8KKwkJYWN0aXZlX2RldmljZSA9IEdVU19ERVZfUENNX0NPTlRJTlVFOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3VuaW50ZXJsZWF2ZTgoY2hhciAqYnVmLCBpbnQgbCkKK3sKKy8qIFRoaXMgcm91dGluZSB1bmludGVybGVhdmVzIDggYml0IHN0ZXJlbyBvdXRwdXQgKExSTFJMUi0+TExMUlJSKSAqLworCWludCBpLCBwID0gMCwgaGFsZnNpemUgPSBsIC8gMjsKKwljaGFyICpidWYyID0gYnVmICsgaGFsZnNpemUsICpzcmMgPSBib3VuY2VfYnVmOworCisJbWVtY3B5KGJvdW5jZV9idWYsIGJ1ZiwgbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGFsZnNpemU7IGkrKykKKwl7CisJCWJ1ZltpXSA9IHNyY1twKytdOwkvKiBMZWZ0IGNoYW5uZWwgKi8KKwkJYnVmMltpXSA9IHNyY1twKytdOwkvKiBSaWdodCBjaGFubmVsICovCisJfQorfQorCitzdGF0aWMgdm9pZCBndXNfdW5pbnRlcmxlYXZlMTYoc2hvcnQgKmJ1ZiwgaW50IGwpCit7CisvKiBUaGlzIHJvdXRpbmUgdW5pbnRlcmxlYXZlcyAxNiBiaXQgc3RlcmVvIG91dHB1dCAoTFJMUkxSLT5MTExSUlIpICovCisJaW50IGksIHAgPSAwLCBoYWxmc2l6ZSA9IGwgLyAyOworCXNob3J0ICpidWYyID0gYnVmICsgaGFsZnNpemUsICpzcmMgPSAoc2hvcnQgKikgYm91bmNlX2J1ZjsKKworCW1lbWNweShib3VuY2VfYnVmLCAoY2hhciAqKSBidWYsIGwgKiAyKTsKKworCWZvciAoaSA9IDA7IGkgPCBoYWxmc2l6ZTsgaSsrKQorCXsKKwkJYnVmW2ldID0gc3JjW3ArK107CS8qIExlZnQgY2hhbm5lbCAqLworCQlidWYyW2ldID0gc3JjW3ArK107CS8qIFJpZ2h0IGNoYW5uZWwgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGd1c19hdWRpb19vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCB0b3RhbF9jb3VudCwKKwkJICAgICAgIGludCBpbnRyZmxhZykKK3sKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQ7CisKKwlkbWFwLT5mbGFncyB8PSBETUFfTk9ETUEgfCBETUFfTk9USU1FT1VUOworCisJcGNtX2N1cnJlbnRfYnVmID0gYnVmOworCXBjbV9jdXJyZW50X2NvdW50ID0gdG90YWxfY291bnQ7CisJcGNtX2N1cnJlbnRfaW50cmZsYWcgPSBpbnRyZmxhZzsKKwlwY21fY3VycmVudF9kZXYgPSBkZXY7CisJaWYgKGd1c19hdWRpb19jaGFubmVscyA9PSAyKQorCXsKKwkJY2hhciAqYiA9IGRtYXAtPnJhd19idWYgKyAoYnVmIC0gZG1hcC0+cmF3X2J1Zl9waHlzKTsKKworCQlpZiAoZ3VzX2F1ZGlvX2JpdHMgPT0gOCkKKwkJCWd1c191bmludGVybGVhdmU4KGIsIHRvdGFsX2NvdW50KTsKKwkJZWxzZQorCQkJZ3VzX3VuaW50ZXJsZWF2ZTE2KChzaG9ydCAqKSBiLCB0b3RhbF9jb3VudCAvIDIpOworCX0KKwlndXNfdHJhbnNmZXJfb3V0cHV0X2Jsb2NrKGRldiwgYnVmLCB0b3RhbF9jb3VudCwgaW50cmZsYWcsIDApOworfQorCitzdGF0aWMgdm9pZCBndXNfYXVkaW9fc3RhcnRfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwKKwkJICAgICAgaW50IGludHJmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBtb2RlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKworCURNQWJ1Zl9zdGFydF9kbWEoZGV2LCBidWYsIGNvdW50LCBETUFfTU9ERV9SRUFEKTsKKwltb2RlID0gMHhhMDsJCS8qIERNQSBJUlEgZW5hYmxlZCwgaW52ZXJ0IE1TQiAqLworCisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hID4gMykKKwkJbW9kZSB8PSAweDA0OwkvKiAxNiBiaXQgRE1BIGNoYW5uZWwgKi8KKwlpZiAoZ3VzX2F1ZGlvX2NoYW5uZWxzID4gMSkKKwkJbW9kZSB8PSAweDAyOwkvKiBTdGVyZW8gKi8KKwltb2RlIHw9IDB4MDE7CQkvKiBETUEgZW5hYmxlICovCisKKwlndXNfd3JpdGU4KDB4NDksIG1vZGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCBndXNfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworCXVuc2lnbmVkIGludCByYXRlOworCisJZ3VzX2F1ZGlvX2JzaXplID0gYnNpemU7CisJYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5mbGFncyB8PSBETUFfTk9ETUE7CisJcmF0ZSA9ICgoKDk4Nzg0MDAgKyBndXNfYXVkaW9fc3BlZWQgLyAyKSAvIChndXNfYXVkaW9fc3BlZWQgKyAyKSkgKyA4KSAvIDE2OworCisJZ3VzX3dyaXRlOCgweDQ4LCByYXRlICYgMHhmZik7CS8qIFNldCBzYW1wbGluZyByYXRlICovCisKKwlpZiAoZ3VzX2F1ZGlvX2JpdHMgIT0gOCkKKwl7CisvKgkJcHJpbnRrKCJHVVMgRXJyb3I6IDE2IGJpdCByZWNvcmRpbmcgbm90IHN1cHBvcnRlZFxuIik7Ki8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGd1c19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworCWludCBpOworCisJbG9uZyBtZW1fcHRyLCBtZW1fc2l6ZTsKKworCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmZsYWdzIHw9IERNQV9OT0RNQSB8IERNQV9OT1RJTUVPVVQ7CisJbWVtX3B0ciA9IDA7CisJbWVtX3NpemUgPSBndXNfbWVtX3NpemUgLyBndXNfYXVkaW9fY2hhbm5lbHM7CisKKwlpZiAobWVtX3NpemUgPiAoMjU2ICogMTAyNCkpCisJCW1lbV9zaXplID0gMjU2ICogMTAyNDsKKworCXBjbV9ic2l6ZSA9IGJzaXplIC8gZ3VzX2F1ZGlvX2NoYW5uZWxzOworCXBjbV9oZWFkID0gcGNtX3RhaWwgPSBwY21fcWxlbiA9IDA7CisKKwlwY21fbmJsayA9IDI7CQkvKiBNQVhfUENNX0JVRkZFUlM7ICovCisJaWYgKChwY21fYnNpemUgKiBwY21fbmJsaykgPiBtZW1fc2l6ZSkKKwkJcGNtX25ibGsgPSBtZW1fc2l6ZSAvIHBjbV9ic2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBwY21fbmJsazsgaSsrKQorCQlwY21fZGF0YXNpemVbaV0gPSAwOworCisJcGNtX2JhbmtzaXplID0gcGNtX25ibGsgKiBwY21fYnNpemU7CisKKwlpZiAoZ3VzX2F1ZGlvX2JpdHMgIT0gOCAmJiBwY21fYmFua3NpemUgPT0gKDI1NiAqIDEwMjQpKQorCQlwY21fbmJsay0tOworCWd1c193cml0ZTgoMHg0MSwgMCk7CS8qIERpc2FibGUgR0YxIERNQSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGd1c19sb2NhbF9xbGVuKGludCBkZXYpCit7CisJcmV0dXJuIHBjbV9xbGVuOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIGd1c19hdWRpb19kcml2ZXIgPQoreworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCQk9IGd1c19hdWRpb19vcGVuLAorCS5jbG9zZQkJCT0gZ3VzX2F1ZGlvX2Nsb3NlLAorCS5vdXRwdXRfYmxvY2sJCT0gZ3VzX2F1ZGlvX291dHB1dF9ibG9jaywKKwkuc3RhcnRfaW5wdXQJCT0gZ3VzX2F1ZGlvX3N0YXJ0X2lucHV0LAorCS5pb2N0bAkJCT0gZ3VzX2F1ZGlvX2lvY3RsLAorCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IGd1c19hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dCwKKwkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gZ3VzX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dCwKKwkuaGFsdF9pbwkJPSBndXNfYXVkaW9fcmVzZXQsCisJLmxvY2FsX3FsZW4JCT0gZ3VzX2xvY2FsX3FsZW4sCit9OworCitzdGF0aWMgdm9pZCBndXN3YXZlX3NldHVwX3ZvaWNlKGludCBkZXYsIGludCB2b2ljZSwgaW50IGNobikKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9pbmZvICppbmZvID0gJnN5bnRoX2RldnNbZGV2XS0+Y2huX2luZm9bY2huXTsKKworCWd1c3dhdmVfc2V0X2luc3RyKGRldiwgdm9pY2UsIGluZm8tPnBnbV9udW0pOworCXZvaWNlc1t2b2ljZV0uZXhwcmVzc2lvbl92b2wgPSBpbmZvLT5jb250cm9sbGVyc1tDVExfRVhQUkVTU0lPTl07CS8qIEp1c3QgTVNCICovCisJdm9pY2VzW3ZvaWNlXS5tYWluX3ZvbCA9IChpbmZvLT5jb250cm9sbGVyc1tDVExfTUFJTl9WT0xVTUVdICogMTAwKSAvICh1bnNpZ25lZCkgMTI4OworCXZvaWNlc1t2b2ljZV0ucGFubmluZyA9IChpbmZvLT5jb250cm9sbGVyc1tDVExfUEFOXSAqIDIpIC0gMTI4OworCXZvaWNlc1t2b2ljZV0uYmVuZGVyID0gMDsKKwl2b2ljZXNbdm9pY2VdLmJlbmRlcl9yYW5nZSA9IGluZm8tPmJlbmRlcl9yYW5nZTsKKworCWlmIChjaG4gPT0gOSkKKwkJdm9pY2VzW3ZvaWNlXS5maXhlZF9waXRjaCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGd1c3dhdmVfYmVuZGVyKGludCBkZXYsIGludCB2b2ljZSwgaW50IHZhbHVlKQoreworCWludCBmcmVxOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCXZvaWNlc1t2b2ljZV0uYmVuZGVyID0gdmFsdWUgLSA4MTkyOworCWZyZXEgPSBjb21wdXRlX2ZpbmV0dW5lKHZvaWNlc1t2b2ljZV0ub3JpZ19mcmVxLCB2YWx1ZSAtIDgxOTIsIHZvaWNlc1t2b2ljZV0uYmVuZGVyX3JhbmdlLCAwKTsKKwl2b2ljZXNbdm9pY2VdLmN1cnJlbnRfZnJlcSA9IGZyZXE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCWd1c192b2ljZV9mcmVxKGZyZXEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCBndXN3YXZlX2FsbG9jKGludCBkZXYsIGludCBjaG4sIGludCBub3RlLCBzdHJ1Y3Qgdm9pY2VfYWxsb2NfaW5mbyAqYWxsb2MpCit7CisJaW50IGksIHAsIGJlc3QgPSAtMSwgYmVzdF90aW1lID0gMHg3ZmZmZmZmZjsKKworCXAgPSBhbGxvYy0+cHRyOworCS8qCisJICogRmlyc3QgbG9vayBmb3IgYSBjb21wbGV0ZWx5IHN0b3BwZWQgdm9pY2UKKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBhbGxvYy0+bWF4X3ZvaWNlOyBpKyspCisJeworCQlpZiAoYWxsb2MtPm1hcFtwXSA9PSAwKQorCQl7CisJCQlhbGxvYy0+cHRyID0gcDsKKwkJCXJldHVybiBwOworCQl9CisJCWlmIChhbGxvYy0+YWxsb2NfdGltZXNbcF0gPCBiZXN0X3RpbWUpCisJCXsKKwkJCWJlc3QgPSBwOworCQkJYmVzdF90aW1lID0gYWxsb2MtPmFsbG9jX3RpbWVzW3BdOworCQl9CisJCXAgPSAocCArIDEpICUgYWxsb2MtPm1heF92b2ljZTsKKwl9CisKKwkvKgorCSAqIFRoZW4gbG9vayBmb3IgYSByZWxlYXNpbmcgdm9pY2UKKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBhbGxvYy0+bWF4X3ZvaWNlOyBpKyspCisJeworCQlpZiAoYWxsb2MtPm1hcFtwXSA9PSAweGZmZmYpCisJCXsKKwkJCWFsbG9jLT5wdHIgPSBwOworCQkJcmV0dXJuIHA7CisJCX0KKwkJcCA9IChwICsgMSkgJSBhbGxvYy0+bWF4X3ZvaWNlOworCX0KKwlpZiAoYmVzdCA+PSAwKQorCQlwID0gYmVzdDsKKworCWFsbG9jLT5wdHIgPSBwOworCXJldHVybiBwOworfQorCitzdGF0aWMgc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgZ3Vzd2F2ZV9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlkCQk9ICJHVVMiLAorCS5pbmZvCQk9ICZndXNfaW5mbywKKwkubWlkaV9kZXYJPSAwLAorCS5zeW50aF90eXBlCT0gU1lOVEhfVFlQRV9TQU1QTEUsCisJLnN5bnRoX3N1YnR5cGUJPSBTQU1QTEVfVFlQRV9HVVMsCisJLm9wZW4JCT0gZ3Vzd2F2ZV9vcGVuLAorCS5jbG9zZQkJPSBndXN3YXZlX2Nsb3NlLAorCS5pb2N0bAkJPSBndXN3YXZlX2lvY3RsLAorCS5raWxsX25vdGUJPSBndXN3YXZlX2tpbGxfbm90ZSwKKwkuc3RhcnRfbm90ZQk9IGd1c3dhdmVfc3RhcnRfbm90ZSwKKwkuc2V0X2luc3RyCT0gZ3Vzd2F2ZV9zZXRfaW5zdHIsCisJLnJlc2V0CQk9IGd1c3dhdmVfcmVzZXQsCisJLmh3X2NvbnRyb2wJPSBndXN3YXZlX2h3X2NvbnRyb2wsCisJLmxvYWRfcGF0Y2gJPSBndXN3YXZlX2xvYWRfcGF0Y2gsCisJLmFmdGVydG91Y2gJPSBndXN3YXZlX2FmdGVydG91Y2gsCisJLmNvbnRyb2xsZXIJPSBndXN3YXZlX2NvbnRyb2xsZXIsCisJLnBhbm5pbmcJPSBndXN3YXZlX3Bhbm5pbmcsCisJLnZvbHVtZV9tZXRob2QJPSBndXN3YXZlX3ZvbHVtZV9tZXRob2QsCisJLmJlbmRlcgkJPSBndXN3YXZlX2JlbmRlciwKKwkuYWxsb2Nfdm9pY2UJPSBndXN3YXZlX2FsbG9jLAorCS5zZXR1cF92b2ljZQk9IGd1c3dhdmVfc2V0dXBfdm9pY2UKK307CisKK3N0YXRpYyB2b2lkIHNldF9pbnB1dF92b2x1bWVzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIG1hc2sgPSAweGZmICYgfjB4MDY7CS8qIEp1c3QgbGluZSBvdXQgZW5hYmxlZCAqLworCisJaWYgKGhhdmVfZ3VzX21heCkJLyogRG9uJ3QgZGlzdHVyYiBHVVMgTUFYICovCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisKKwkvKgorCSAqICAgIEVuYWJsZSBjaGFubmVscyBoYXZpbmcgdm9sID4gMTAlCisJICogICAgICBOb3RlISBiaXQgMHgwMSBtZWFucyB0aGUgbGluZSBpbiBESVNBQkxFRCB3aGlsZSAweDA0IG1lYW5zCisJICogICAgICAgICAgICB0aGUgbWljIGluIEVOQUJMRUQuCisJICovCisJaWYgKGd1c19saW5lX3ZvbCA+IDEwKQorCQltYXNrICY9IH4weDAxOworCWlmIChndXNfbWljX3ZvbCA+IDEwKQorCQltYXNrIHw9IDB4MDQ7CisKKwlpZiAocmVjb3JkaW5nX2FjdGl2ZSkKKwl7CisJCS8qCisJCSAqICAgIERpc2FibGUgY2hhbm5lbCwgaWYgbm90IHNlbGVjdGVkIGZvciByZWNvcmRpbmcKKwkJICovCisJCWlmICghKGd1c19yZWNtYXNrICYgU09VTkRfTUFTS19MSU5FKSkKKwkJCW1hc2sgfD0gMHgwMTsKKwkJaWYgKCEoZ3VzX3JlY21hc2sgJiBTT1VORF9NQVNLX01JQykpCisJCQltYXNrICY9IH4weDA0OworCX0KKwltaXhfaW1hZ2UgJj0gfjB4MDc7CisJbWl4X2ltYWdlIHw9IG1hc2sgJiAweDA3OworCW91dGIoKG1peF9pbWFnZSksIHVfTWl4ZXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworfQorCisjZGVmaW5lIE1JWF9ERVZTCShTT1VORF9NQVNLX01JQ3xTT1VORF9NQVNLX0xJTkV8IFwKKwkJCSBTT1VORF9NQVNLX1NZTlRIfFNPVU5EX01BU0tfUENNKQorCitpbnQgZ3VzX2RlZmF1bHRfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgdm9sLCB2YWw7CisKKwlpZiAoKChjbWQgPj4gOCkgJiAweGZmKSAhPSAnTScpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmcsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkgCisJeworCQlpZiAoX19nZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpIAorCQl7CisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQlndXNfcmVjbWFzayA9IHZhbCAmIE1JWF9ERVZTOworCQkJCWlmICghKGd1c19yZWNtYXNrICYgKFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19MSU5FKSkpCisJCQkJCWd1c19yZWNtYXNrID0gU09VTkRfTUFTS19NSUM7CisJCQkJLyogTm90ZSEgSW5wdXQgdm9sdW1lcyBhcmUgdXBkYXRlZCBkdXJpbmcgbmV4dCBvcGVuIGZvciByZWNvcmRpbmcgKi8KKwkJCQl2YWwgPSBndXNfcmVjbWFzazsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQkJdm9sID0gdmFsICYgMHhmZjsKKwkJCQlpZiAodm9sIDwgMCkKKwkJCQkJdm9sID0gMDsKKwkJCQlpZiAodm9sID4gMTAwKQorCQkJCQl2b2wgPSAxMDA7CisJCQkJZ3VzX21pY192b2wgPSB2b2w7CisJCQkJc2V0X2lucHV0X3ZvbHVtZXMoKTsKKwkJCQl2YWwgPSB2b2wgfCAodm9sIDw8IDgpOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBTT1VORF9NSVhFUl9MSU5FOgorCQkJCXZvbCA9IHZhbCAmIDB4ZmY7CisJCQkJaWYgKHZvbCA8IDApCisJCQkJCXZvbCA9IDA7CisJCQkJaWYgKHZvbCA+IDEwMCkKKwkJCQkJdm9sID0gMTAwOworCQkJCWd1c19saW5lX3ZvbCA9IHZvbDsKKwkJCQlzZXRfaW5wdXRfdm9sdW1lcygpOworCQkJCXZhbCA9IHZvbCB8ICh2b2wgPDwgOCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfUENNOgorCQkJCWd1c19wY21fdm9sdW1lID0gdmFsICYgMHhmZjsKKwkJCQlpZiAoZ3VzX3BjbV92b2x1bWUgPCAwKQorCQkJCQlndXNfcGNtX3ZvbHVtZSA9IDA7CisJCQkJaWYgKGd1c19wY21fdm9sdW1lID4gMTAwKQorCQkJCQlndXNfcGNtX3ZvbHVtZSA9IDEwMDsKKwkJCQlndXNfYXVkaW9fdXBkYXRlX3ZvbHVtZSgpOworCQkJCXZhbCA9IGd1c19wY21fdm9sdW1lIHwgKGd1c19wY21fdm9sdW1lIDw8IDgpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQkJCWd1c193YXZlX3ZvbHVtZSA9IHZhbCAmIDB4ZmY7CisJCQkJaWYgKGd1c193YXZlX3ZvbHVtZSA8IDApCisJCQkJCWd1c193YXZlX3ZvbHVtZSA9IDA7CisJCQkJaWYgKGd1c193YXZlX3ZvbHVtZSA+IDEwMCkKKwkJCQkJZ3VzX3dhdmVfdm9sdW1lID0gMTAwOworCQkJCWlmIChhY3RpdmVfZGV2aWNlID09IEdVU19ERVZfV0FWRSkgCisJCQkJeworCQkJCQlpbnQgdm9pY2U7CisJCQkJCWZvciAodm9pY2UgPSAwOyB2b2ljZSA8IG5yX3ZvaWNlczsgdm9pY2UrKykKKwkJCQkJZHluYW1pY192b2x1bWVfY2hhbmdlKHZvaWNlKTsJLyogQXBwbHkgdGhlIG5ldyB2b2wgKi8KKwkJCQl9CisJCQkJdmFsID0gZ3VzX3dhdmVfdm9sdW1lIHwgKGd1c193YXZlX3ZvbHVtZSA8PCA4KTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwllbHNlCisJeworCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpIAorCQl7CisJCQkvKgorCQkJICogUmV0dXJuIHBhcmFtZXRlcnMKKwkJCSAqLworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQkJdmFsID0gZ3VzX3JlY21hc2s7CisJCQkJYnJlYWs7CisJCQkJCQorCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJCXZhbCA9IE1JWF9ERVZTOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6CisJCQkJdmFsID0gMDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgorCQkJCXZhbCA9IFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19MSU5FOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQkJdmFsID0gMDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQkJdmFsID0gZ3VzX21pY192b2wgfCAoZ3VzX21pY192b2wgPDwgOCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfTElORToKKwkJCQl2YWwgPSBndXNfbGluZV92b2wgfCAoZ3VzX2xpbmVfdm9sIDw8IDgpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1BDTToKKwkJCQl2YWwgPSBndXNfcGNtX3ZvbHVtZSB8IChndXNfcGNtX3ZvbHVtZSA8PCA4KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKKwkJCQl2YWwgPSBndXNfd2F2ZV92b2x1bWUgfCAoZ3VzX3dhdmVfdm9sdW1lIDw8IDgpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiBfX3B1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOworfQorCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgZ3VzX21peGVyX29wZXJhdGlvbnMgPQoreworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5pZAk9ICJHVVMiLAorCS5uYW1lCT0gIkdyYXZpcyBVbHRyYXNvdW5kIiwKKwkuaW9jdGwJPSBndXNfZGVmYXVsdF9taXhlcl9pb2N0bAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ3VzX2RlZmF1bHRfbWl4ZXJfaW5pdCh2b2lkKQoreworCWludCBuOworCisJaWYgKChuID0gc291bmRfYWxsb2NfbWl4ZXJkZXYoKSkgIT0gLTEpCisJewkKKwkJLyoKKwkJICogRG9uJ3QgaW5zdGFsbCBpZiB0aGVyZSBpcyBhbm90aGVyCisJCSAqIG1peGVyCisJCSAqLworCQltaXhlcl9kZXZzW25dID0gJmd1c19taXhlcl9vcGVyYXRpb25zOworCX0KKwlpZiAoaGF2ZV9ndXNfbWF4KQorCXsKKwkJLyoKKwkJICogIEVuYWJsZSBhbGwgbWl4ZXIgY2hhbm5lbHMgb24gdGhlIEdGMSBzaWRlLiBPdGhlcndpc2UgcmVjb3JkaW5nIHdpbGwKKwkJICogIG5vdCBiZSBwb3NzaWJsZSB1c2luZyBHVVMgTUFYLgorCQkgKi8KKwkJbWl4X2ltYWdlICY9IH4weDA3OworCQltaXhfaW1hZ2UgfD0gMHgwNDsJLyogQWxsIGNoYW5uZWxzIGVuYWJsZWQgKi8KKwkJb3V0YigobWl4X2ltYWdlKSwgdV9NaXhlcik7CisJfQorCXJldHVybiBuOworfQorCit2b2lkIF9faW5pdCBndXNfd2F2ZV9pbml0KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdmFsOworCWNoYXIgKm1vZGVsX251bSA9ICIyLjQiOworCWNoYXIgdG1wWzY0XTsKKwlpbnQgZ3VzX3R5cGUgPSAweDI0OwkvKiAyLjQgKi8KKworCWludCBpcnEgPSBod19jb25maWctPmlycSwgZG1hID0gaHdfY29uZmlnLT5kbWEsIGRtYTIgPSBod19jb25maWctPmRtYTI7CisJaW50IHNkZXY7CisKKwlod19jb25maWctPnNsb3RzWzBdID0gLTE7CS8qIE5vIHdhdmUgKi8KKwlod19jb25maWctPnNsb3RzWzFdID0gLTE7CS8qIE5vIGFkMTg0OCAqLworCWh3X2NvbmZpZy0+c2xvdHNbNF0gPSAtMTsJLyogTm8gYXVkaW8gKi8KKwlod19jb25maWctPnNsb3RzWzVdID0gLTE7CS8qIE5vIG1peGVyICovCisKKwlpZiAoIWd1c19wbnBfZmxhZykKKwl7CisJCWlmIChpcnEgPCAwIHx8IGlycSA+IDE1KQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SISBJbnZhbGlkIElSUSMlZC4gR1VTIERpc2FibGVkIiwgaXJxKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkKKwlpZiAoZG1hIDwgMCB8fCBkbWEgPiA3IHx8IGRtYSA9PSA0KQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUiEgSW52YWxpZCBETUEjJWQuIEdVUyBEaXNhYmxlZCIsIGRtYSk7CisJCXJldHVybjsKKwl9CisJZ3VzX2lycSA9IGlycTsKKwlndXNfZG1hID0gZG1hOworCWd1c19kbWEyID0gZG1hMjsKKwlndXNfaHdfY29uZmlnID0gaHdfY29uZmlnOworCisJaWYgKGd1c19kbWEyID09IC0xKQorCQlndXNfZG1hMiA9IGRtYTsKKworCS8qCisJICogVHJ5IHRvIGlkZW50aWZ5IHRoZSBHVVMgbW9kZWwuCisJICoKKwkgKiAgVmVyc2lvbnMgPCAzLjYgZG9uJ3QgaGF2ZSB0aGUgZGlnaXRhbCBBU0lDLiBUcnkgdG8gcHJvYmUgaXQgZmlyc3QuCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCW91dGIoKDB4MjApLCBndXNfYmFzZSArIDB4MGYpOworCXZhbCA9IGluYihndXNfYmFzZSArIDB4MGYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKworCWlmIChndXNfcG5wX2ZsYWcgfHwgKHZhbCAhPSAweGZmICYmICh2YWwgJiAweDA2KSkpCS8qIFNob3VsZCBiZSAweDAyPz8gKi8KKwl7CisJCWludCAgICAgICAgICAgICBhZF9mbGFncyA9IDA7CisKKwkJaWYgKGd1c19wbnBfZmxhZykKKwkJCWFkX2ZsYWdzID0gMHgxMjM0NTY3ODsJLyogSW50ZXJ3YXZlICJtYWdpYyIgKi8KKwkJLyoKKwkJICogSXQgaGFzIHRoZSBkaWdpdGFsIEFTSUMgc28gdGhlIGNhcmQgaXMgYXQgbGVhc3QgdjMuNC4KKwkJICogTmV4dCB0cnkgdG8gZGV0ZWN0IHRoZSB0cnVlIG1vZGVsLgorCQkgKi8KKworCQlpZiAoZ3VzX3BucF9mbGFnKQkvKiBIYWNrIGhhY2sgaGFjayAqLworCQkJdmFsID0gMTA7CisJCWVsc2UKKwkJCXZhbCA9IGluYih1X01peFNlbGVjdCk7CisKKwkJLyoKKwkJICogVmFsdWUgMjU1IG1lYW5zIHByZS0zLjcgd2hpY2ggZG9uJ3QgaGF2ZSBtaXhlci4KKwkJICogVmFsdWVzIDUgdGhydSA5IG1lYW4gdjMuNyB3aGljaCBoYXMgYSBJQ1MyMTAxIG1peGVyLgorCQkgKiAxMCBhbmQgYWJvdmUgaXMgR1VTIE1BWCB3aGljaCBoYXMgdGhlIENTNDIzMSBjb2RlYy9taXhlci4KKwkJICoKKwkJICovCisKKwkJaWYgKHZhbCA9PSAyNTUgfHwgdmFsIDwgNSkKKwkJeworCQkJbW9kZWxfbnVtID0gIjMuNCI7CisJCQlndXNfdHlwZSA9IDB4MzQ7CisJCX0KKwkJZWxzZSBpZiAodmFsIDwgMTApCisJCXsKKwkJCW1vZGVsX251bSA9ICIzLjciOworCQkJZ3VzX3R5cGUgPSAweDM3OworCQkJbWl4ZXJfdHlwZSA9IElDUzIxMDE7CisJCQlyZXF1ZXN0X3JlZ2lvbih1X01peFNlbGVjdCwgMSwgIkdVUyBtaXhlciIpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwkJCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oZ3VzX2Jhc2UgKyAweDEwYywgNCwgImFkMTg0OCIpOworCQkJbW9kZWxfbnVtID0gIk1BWCI7CisJCQlndXNfdHlwZSA9IDB4NDA7CisJCQltaXhlcl90eXBlID0gQ1M0MjMxOworI2lmZGVmIENPTkZJR19TT1VORF9HVVNNQVgKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyICAgbWF4X2NvbmZpZyA9IDB4NDA7CS8qIENvZGVjIGVuYWJsZSAqLworCisJCQkJaWYgKGd1c19kbWEyID09IC0xKQorCQkJCQlndXNfZG1hMiA9IGd1c19kbWE7CisKKwkJCQlpZiAoZ3VzX2RtYSA+IDMpCisJCQkJCW1heF9jb25maWcgfD0gMHgxMDsJCS8qIDE2IGJpdCBjYXB0dXJlIERNQSAqLworCisJCQkJaWYgKGd1c19kbWEyID4gMykKKwkJCQkJbWF4X2NvbmZpZyB8PSAweDIwOwkJLyogMTYgYml0IHBsYXliYWNrIERNQSAqLworCisJCQkJbWF4X2NvbmZpZyB8PSAoZ3VzX2Jhc2UgPj4gNCkgJiAweDBmOwkvKiBFeHRyYWN0IHRoZSBYIGZyb20gMlgwICovCisKKwkJCQlvdXRiKChtYXhfY29uZmlnKSwgZ3VzX2Jhc2UgKyAweDEwNik7CS8qIFVsdHJhTWF4IGNvbnRyb2wgKi8KKwkJCX0KKworCQkJaWYgKCFwb3J0cykKKwkJCQlnb3RvIG5vX2NzNDIzMTsKKworCQkJaWYgKGFkMTg0OF9kZXRlY3QocG9ydHMsICZhZF9mbGFncywgaHdfY29uZmlnLT5vc3ApKQorCQkJeworCQkJCWNoYXIgICAgICAgICAgICpuYW1lID0gIkdVUyBNQVgiOworCQkJCWludCAgICAgICAgICAgICBvbGRfbnVtX21peGVycyA9IG51bV9taXhlcnM7CisKKwkJCQlpZiAoZ3VzX3BucF9mbGFnKQorCQkJCQluYW1lID0gIkdVUyBQblAiOworCisJCQkJZ3VzX21pY192b2wgPSBndXNfbGluZV92b2wgPSBndXNfcGNtX3ZvbHVtZSA9IDEwMDsKKwkJCQlndXNfd2F2ZV92b2x1bWUgPSA5MDsKKwkJCQloYXZlX2d1c19tYXggPSAxOworCQkJCWlmIChod19jb25maWctPm5hbWUpCisJCQkJCW5hbWUgPSBod19jb25maWctPm5hbWU7CisKKwkJCQlod19jb25maWctPnNsb3RzWzFdID0gYWQxODQ4X2luaXQobmFtZSwgcG9ydHMsCisJCQkJCQkJLWlycSwgZ3VzX2RtYTIsCS8qIFBsYXliYWNrIERNQSAqLworCQkJCQkJCWd1c19kbWEsCS8qIENhcHR1cmUgRE1BICovCisJCQkJCQkJMSwJCS8qIFNoYXJlIERNQSBjaGFubmVscyB3aXRoIEdGMSAqLworCQkJCQkJCWh3X2NvbmZpZy0+b3NwLAorCQkJCQkJCVRISVNfTU9EVUxFKTsKKworCQkJCWlmIChudW1fbWl4ZXJzID4gb2xkX251bV9taXhlcnMpCisJCQkJeworCQkJCQkvKiBHVVMgaGFzIGl0J3Mgb3duIG1peGVyIG1hcCAqLworCQkJCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMSwgU09VTkRfTUlYRVJfU1lOVEgpOworCQkJCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMiwgU09VTkRfTUlYRVJfQ0QpOworCQkJCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMywgU09VTkRfTUlYRVJfTElORSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJcmVsZWFzZV9yZWdpb24oZ3VzX2Jhc2UgKyAweDEwYywgNCk7CisJCQlub19jczQyMzE6CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiR1VTOiBObyBDUzQyMzEgPz8iKTsKKwkJCX0KKyNlbHNlCisJCQlwcmludGsoS0VSTl9FUlIgIkdVUyBNQVggZm91bmQsIGJ1dCBub3QgY29tcGlsZWQgaW5cbiIpOworI2VuZGlmCisJCX0KKwl9CisJZWxzZQorCXsKKwkJLyoKKwkJICogQVNJQyBub3QgZGV0ZWN0ZWQgc28gdGhlIGNhcmQgbXVzdCBiZSAyLjIgb3IgMi40LgorCQkgKiBUaGVyZSBjb3VsZCBzdGlsbCBiZSB0aGUgMTYtYml0L21peGVyIGRhdWdodGVyIGNhcmQuCisJCSAqLworCX0KKworCWlmIChod19jb25maWctPm5hbWUpCisJCXNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICIlcyAoJWRrKSIsIGh3X2NvbmZpZy0+bmFtZSwKKwkJCSAoaW50KSBndXNfbWVtX3NpemUgLyAxMDI0KTsKKwllbHNlIGlmIChndXNfcG5wX2ZsYWcpCisJCXNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJHcmF2aXMgVWx0cmFTb3VuZCBQblAgKCVkaykiLAorCQkJIChpbnQpIGd1c19tZW1fc2l6ZSAvIDEwMjQpOworCWVsc2UKKwkJc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIkdyYXZpcyBVbHRyYVNvdW5kICVzICglZGspIiwgbW9kZWxfbnVtLAorCQkJIChpbnQpIGd1c19tZW1fc2l6ZSAvIDEwMjQpOworCisKKwlzYW1wbGVzID0gKHN0cnVjdCBwYXRjaF9pbmZvICopdm1hbGxvYygoTUFYX1NBTVBMRSArIDEpICogc2l6ZW9mKCpzYW1wbGVzKSk7CisJaWYgKHNhbXBsZXMgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImd1c19pbml0OiBDYW50IGFsbG9jYXRlIG1lbW9yeSBmb3IgaW5zdHJ1bWVudCB0YWJsZXNcbiIpOworCQlyZXR1cm47CisJfQorCWNvbmZfcHJpbnRmKHRtcCwgaHdfY29uZmlnKTsKKwlzdHJsY3B5KGd1c19pbmZvLm5hbWUsIHRtcCwgc2l6ZW9mKGd1c19pbmZvLm5hbWUpKTsKKworCWlmICgoc2RldiA9IHNvdW5kX2FsbG9jX3N5bnRoZGV2KCkpID09IC0xKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJndXNfaW5pdDogVG9vIG1hbnkgc3ludGhlc2l6ZXJzXG4iKTsKKwllbHNlCisJeworCQl2b2ljZV9hbGxvYyA9ICZndXN3YXZlX29wZXJhdGlvbnMuYWxsb2M7CisJCWlmIChpd19tb2RlKQorCQkJZ3Vzd2F2ZV9vcGVyYXRpb25zLmlkID0gIklXQVZFIjsKKwkJaHdfY29uZmlnLT5zbG90c1swXSA9IHNkZXY7CisJCXN5bnRoX2RldnNbc2Rldl0gPSAmZ3Vzd2F2ZV9vcGVyYXRpb25zOworCQlzZXF1ZW5jZXJfaW5pdCgpOworCQlndXNfdG1yX2luc3RhbGwoZ3VzX2Jhc2UgKyA4KTsKKwl9CisKKwlyZXNldF9zYW1wbGVfbWVtb3J5KCk7CisKKwlndXNfaW5pdGlhbGl6ZSgpOworCQorCWlmICgoZ3VzX21lbV9zaXplID4gMCkgJiYgIWd1c19ub193YXZlX2RtYSkKKwl7CisJCWh3X2NvbmZpZy0+c2xvdHNbNF0gPSAtMTsKKwkJaWYgKChndXNfZGV2bnVtID0gc291bmRfaW5zdGFsbF9hdWRpb2RydihBVURJT19EUklWRVJfVkVSU0lPTiwKKwkJCQkJIlVsdHJhc291bmQiLAorCQkJCQkmZ3VzX2F1ZGlvX2RyaXZlciwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19kcml2ZXIpLAorCQkJCQlORUVEU19SRVNUQVJUIHwKKwkJICAgICAgICAgICAgICAgICAgIAkoKCFpd19tb2RlICYmIGRtYTIgIT0gZG1hICYmIGRtYTIgIT0gLTEpID8KKwkJCQkJCURNQV9EVVBMRVggOiAwKSwKKwkJCQkJQUZNVF9VOCB8IEFGTVRfUzE2X0xFLAorCQkJCQlOVUxMLCBkbWEsIGRtYTIpKSA8IDApCisJCXsKKwkJCXJldHVybjsKKwkJfQorCisJCWh3X2NvbmZpZy0+c2xvdHNbNF0gPSBndXNfZGV2bnVtOworCQlhdWRpb19kZXZzW2d1c19kZXZudW1dLT5taW5fZnJhZ21lbnQgPSA5OwkvKiA1MTJrICovCisJCWF1ZGlvX2RldnNbZ3VzX2Rldm51bV0tPm1heF9mcmFnbWVudCA9IDExOwkvKiA4ayAobXVzdCBtYXRjaCBzaXplIG9mIGJvdW5jZV9idWYgKi8KKwkJYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+bWl4ZXJfZGV2ID0gLTE7CS8qIE5leHQgbWl4ZXIjICovCisJCWF1ZGlvX2RldnNbZ3VzX2Rldm51bV0tPmZsYWdzIHw9IERNQV9IQVJEU1RPUDsKKwl9CisJCisJLyoKKwkgKiAgTWl4ZXIgZGVwZW5kZW50IGluaXRpYWxpemF0aW9uLgorCSAqLworCisJc3dpdGNoIChtaXhlcl90eXBlKQorCXsKKwkJY2FzZSBJQ1MyMTAxOgorCQkJZ3VzX21pY192b2wgPSBndXNfbGluZV92b2wgPSBndXNfcGNtX3ZvbHVtZSA9IDEwMDsKKwkJCWd1c193YXZlX3ZvbHVtZSA9IDkwOworCQkJcmVxdWVzdF9yZWdpb24odV9NaXhTZWxlY3QsIDEsICJHVVMgbWl4ZXIiKTsKKwkJCWh3X2NvbmZpZy0+c2xvdHNbNV0gPSBpY3MyMTAxX21peGVyX2luaXQoKTsKKwkJCWF1ZGlvX2RldnNbZ3VzX2Rldm51bV0tPm1peGVyX2RldiA9IGh3X2NvbmZpZy0+c2xvdHNbNV07CS8qIE5leHQgbWl4ZXIjICovCisJCQlyZXR1cm47CisKKwkJY2FzZSBDUzQyMzE6CisJCQkvKiBJbml0aWFsaXplZCBlbHNld2hlcmUgKGFkMTg0OC5jKSAqLworCQlkZWZhdWx0OgorCQkJaHdfY29uZmlnLT5zbG90c1s1XSA9IGd1c19kZWZhdWx0X21peGVyX2luaXQoKTsKKwkJCWF1ZGlvX2RldnNbZ3VzX2Rldm51bV0tPm1peGVyX2RldiA9IGh3X2NvbmZpZy0+c2xvdHNbNV07CS8qIE5leHQgbWl4ZXIjICovCisJCQlyZXR1cm47CisJfQorfQorCit2b2lkIF9fZXhpdCBndXNfd2F2ZV91bmxvYWQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworI2lmZGVmIENPTkZJR19TT1VORF9HVVNNQVgKKwlpZiAoaGF2ZV9ndXNfbWF4KQorCXsKKwkJYWQxODQ4X3VubG9hZChndXNfYmFzZSArIDB4MTBjLAorCQkJCS1ndXNfaXJxLAorCQkJCWd1c19kbWEyLAkvKiBQbGF5YmFjayBETUEgKi8KKwkJCQlndXNfZG1hLAkvKiBDYXB0dXJlIERNQSAqLworCQkJCTEpOwkvKiBTaGFyZSBETUEgY2hhbm5lbHMgd2l0aCBHRjEgKi8KKwl9CisjZW5kaWYKKworCWlmIChtaXhlcl90eXBlID09IElDUzIxMDEpCisJeworCQlyZWxlYXNlX3JlZ2lvbih1X01peFNlbGVjdCwgMSk7CisJfQorCWlmIChod19jb25maWctPnNsb3RzWzBdICE9IC0xKQorCQlzb3VuZF91bmxvYWRfc3ludGhkZXYoaHdfY29uZmlnLT5zbG90c1swXSk7CisJaWYgKGh3X2NvbmZpZy0+c2xvdHNbMV0gIT0gLTEpCisJCXNvdW5kX3VubG9hZF9hdWRpb2Rldihod19jb25maWctPnNsb3RzWzFdKTsKKwlpZiAoaHdfY29uZmlnLT5zbG90c1syXSAhPSAtMSkKKwkJc291bmRfdW5sb2FkX21pZGlkZXYoaHdfY29uZmlnLT5zbG90c1syXSk7CisJaWYgKGh3X2NvbmZpZy0+c2xvdHNbNF0gIT0gLTEpCisJCXNvdW5kX3VubG9hZF9hdWRpb2Rldihod19jb25maWctPnNsb3RzWzRdKTsKKwlpZiAoaHdfY29uZmlnLT5zbG90c1s1XSAhPSAtMSkKKwkJc291bmRfdW5sb2FkX21peGVyZGV2KGh3X2NvbmZpZy0+c2xvdHNbNV0pOworCQorCXZmcmVlKHNhbXBsZXMpOworCXNhbXBsZXM9TlVMTDsKK30KKy8qIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCAqLworc3RhdGljIHZvaWQgZG9fbG9vcF9pcnEoaW50IHZvaWNlKQoreworCXVuc2lnbmVkIGNoYXIgICB0bXA7CisJaW50ICAgICAgICAgICAgIG1vZGUsIHBhcm07CisKKwlzcGluX2xvY2soJmd1c19sb2NrKTsKKwlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKworCXRtcCA9IGd1c19yZWFkOCgweDAwKTsKKwl0bXAgJj0gfjB4MjA7CQkvKgorCQkJCSAqIERpc2FibGUgd2F2ZSBJUlEgZm9yIHRoaXNfb25lIHZvaWNlCisJCQkJICovCisJZ3VzX3dyaXRlOCgweDAwLCB0bXApOworCisJaWYgKHRtcCAmIDB4MDMpCQkvKiBWb2ljZSBzdG9wcGVkICovCisJCXZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdID0gMDsKKworCW1vZGUgPSB2b2ljZXNbdm9pY2VdLmxvb3BfaXJxX21vZGU7CisJdm9pY2VzW3ZvaWNlXS5sb29wX2lycV9tb2RlID0gMDsKKwlwYXJtID0gdm9pY2VzW3ZvaWNlXS5sb29wX2lycV9wYXJtOworCisJc3dpdGNoIChtb2RlKQorCXsKKwkJY2FzZSBMTU9ERV9GSU5JU0g6CS8qCisJCQkJCSAqIEZpbmFsIGxvb3AgZmluaXNoZWQsIHNob290IHZvbHVtZSBkb3duCisJCQkJCSAqLworCisJCQlpZiAoKGludCkgKGd1c19yZWFkMTYoMHgwOSkgPj4gNCkgPCAxMDApCS8qCisJCQkJCQkJCQkgKiBHZXQgY3VycmVudCB2b2x1bWUKKwkJCQkJCQkJCSAqLworCQkJeworCQkJCWd1c192b2ljZV9vZmYoKTsKKwkJCQlndXNfcmFtcG9mZigpOworCQkJCWd1c192b2ljZV9pbml0KHZvaWNlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWd1c19yYW1wX3JhbmdlKDY1LCA0MDY1KTsKKwkJCWd1c19yYW1wX3JhdGUoMCwgNjMpOwkJLyoKKwkJCQkJCQkgKiBGYXN0ZXN0IHBvc3NpYmxlIHJhdGUKKwkJCQkJCQkgKi8KKwkJCWd1c19yYW1wb24oMHgyMCB8IDB4NDApOwkvKgorCQkJCQkJCSAqIFJhbXAgZG93biwgb25jZSwgaXJxCisJCQkJCQkJICovCisJCQl2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZSA9IFZNT0RFX0hBTFQ7CisJCQlicmVhazsKKworCQljYXNlIExNT0RFX1BDTV9TVE9QOgorCQkJcGNtX2FjdGl2ZSA9IDA7CS8qIFNpZ25hbCB0byB0aGUgcGxheV9uZXh0X3BjbV9ibG9jayByb3V0aW5lICovCisJCWNhc2UgTE1PREVfUENNOgorCQl7CisJCQlwY21fcWxlbi0tOworCQkJcGNtX2hlYWQgPSAocGNtX2hlYWQgKyAxKSAlIHBjbV9uYmxrOworCQkJaWYgKHBjbV9xbGVuICYmIHBjbV9hY3RpdmUpCisJCQl7CisJCQkJcGxheV9uZXh0X3BjbV9ibG9jaygpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIFVuZGVycnVuLiBKdXN0IHN0b3AgdGhlIHZvaWNlICovCisJCQkJZ3VzX3NlbGVjdF92b2ljZSgwKTsJLyogTGVmdCBjaGFubmVsICovCisJCQkJZ3VzX3ZvaWNlX29mZigpOworCQkJCWd1c19yYW1wb2ZmKCk7CisJCQkJZ3VzX3NlbGVjdF92b2ljZSgxKTsJLyogUmlnaHQgY2hhbm5lbCAqLworCQkJCWd1c192b2ljZV9vZmYoKTsKKwkJCQlndXNfcmFtcG9mZigpOworCQkJCXBjbV9hY3RpdmUgPSAwOworCQkJfQorCisJCQkvKgorCQkJICogSWYgdGhlIHF1ZXVlIHdhcyBmdWxsIGJlZm9yZSB0aGlzIGludGVycnVwdCwgdGhlIERNQSB0cmFuc2ZlciB3YXMKKwkJCSAqIHN1c3BlbmRlZC4gTGV0IGl0IGNvbnRpbnVlIG5vdy4KKwkJCSAqLworCQkJCisJCQlpZiAoYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+ZG1hcF9vdXQtPnFsZW4gPiAwKQorCQkJCURNQWJ1Zl9vdXRwdXRpbnRyKGd1c19kZXZudW0sIDApOworCQl9CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJmd1c19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZG9fdm9sdW1lX2lycShpbnQgdm9pY2UpCit7CisJdW5zaWduZWQgY2hhciB0bXA7CisJaW50IG1vZGUsIHBhcm07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisKKwlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwl0bXAgPSBndXNfcmVhZDgoMHgwZCk7CisJdG1wICY9IH4weDIwOwkJLyoKKwkJCQkgKiBEaXNhYmxlIHZvbHVtZSByYW1wIElSUQorCQkJCSAqLworCWd1c193cml0ZTgoMHgwZCwgdG1wKTsKKworCW1vZGUgPSB2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZTsKKwl2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZSA9IDA7CisJcGFybSA9IHZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9wYXJtOworCisJc3dpdGNoIChtb2RlKQorCXsKKwkJY2FzZSBWTU9ERV9IQUxUOgkvKiBEZWNheSBwaGFzZSBmaW5pc2hlZCAqLworCQkJaWYgKGl3X21vZGUpCisJCQkJZ3VzX3dyaXRlOCgweDE1LCAweDAyKTsJLyogU2V0IHZvaWNlIGRlYWN0aXZhdGUgYml0IG9mIFNNU0kgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c192b2ljZV9pbml0KHZvaWNlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVk1PREVfRU5WRUxPUEU6CisJCQlndXNfcmFtcG9mZigpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJc3RlcF9lbnZlbG9wZSh2b2ljZSk7CisJCQlicmVhazsKKworCQljYXNlIFZNT0RFX1NUQVJUX05PVEU6CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXN3YXZlX3N0YXJ0X25vdGUyKHZvaWNlc1t2b2ljZV0uZGV2X3BlbmRpbmcsIHZvaWNlLAorCQkJCSAgICAgIHZvaWNlc1t2b2ljZV0ubm90ZV9wZW5kaW5nLCB2b2ljZXNbdm9pY2VdLnZvbHVtZV9wZW5kaW5nKTsKKwkJCWlmICh2b2ljZXNbdm9pY2VdLmtpbGxfcGVuZGluZykKKwkJCQlndXN3YXZlX2tpbGxfbm90ZSh2b2ljZXNbdm9pY2VdLmRldl9wZW5kaW5nLCB2b2ljZSwKKwkJCQkJICB2b2ljZXNbdm9pY2VdLm5vdGVfcGVuZGluZywgMCk7CisKKwkJCWlmICh2b2ljZXNbdm9pY2VdLnNhbXBsZV9wZW5kaW5nID49IDApCisJCQl7CisJCQkJZ3Vzd2F2ZV9zZXRfaW5zdHIodm9pY2VzW3ZvaWNlXS5kZXZfcGVuZGluZywgdm9pY2UsCisJCQkJCXZvaWNlc1t2b2ljZV0uc2FtcGxlX3BlbmRpbmcpOworCQkJCXZvaWNlc1t2b2ljZV0uc2FtcGxlX3BlbmRpbmcgPSAtMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJfQorfQorLyogY2FsbGVkIGluIGlycSBjb250ZXh0ICovCit2b2lkIGd1c192b2ljZV9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHdhdmVfaWdub3JlID0gMCwgdm9sdW1lX2lnbm9yZSA9IDA7CisJdW5zaWduZWQgbG9uZyB2b2ljZV9iaXQ7CisKKwl1bnNpZ25lZCBjaGFyIHNyYywgdm9pY2U7CisKKwl3aGlsZSAoMSkKKwl7CisJCXNyYyA9IGd1c19yZWFkOCgweDBmKTsJLyoKKwkJCQkJICogR2V0IHNvdXJjZSBpbmZvCisJCQkJCSAqLworCQl2b2ljZSA9IHNyYyAmIDB4MWY7CisJCXNyYyAmPSAweGMwOworCisJCWlmIChzcmMgPT0gKDB4ODAgfCAweDQwKSkKKwkJCXJldHVybjsJLyoKKwkJCQkgKiBObyBpbnRlcnJ1cHQKKwkJCQkgKi8KKworCQl2b2ljZV9iaXQgPSAxIDw8IHZvaWNlOworCisJCWlmICghKHNyYyAmIDB4ODApKQkvKgorCQkJCQkgKiBXYXZlIElSUSBwZW5kaW5nCisJCQkJCSAqLworCQkJaWYgKCEod2F2ZV9pZ25vcmUgJiB2b2ljZV9iaXQpICYmIChpbnQpIHZvaWNlIDwgbnJfdm9pY2VzKQkvKgorCQkJCQkJCQkJCQkgKiBOb3QgZG9uZQorCQkJCQkJCQkJCQkgKiB5ZXQKKwkJCQkJCQkJCQkJICovCisJCQl7CisJCQkJd2F2ZV9pZ25vcmUgfD0gdm9pY2VfYml0OworCQkJCWRvX2xvb3BfaXJxKHZvaWNlKTsKKwkJCX0KKwkJaWYgKCEoc3JjICYgMHg0MCkpCS8qCisJCQkJCSAqIFZvbHVtZSBJUlEgcGVuZGluZworCQkJCQkgKi8KKwkJCWlmICghKHZvbHVtZV9pZ25vcmUgJiB2b2ljZV9iaXQpICYmIChpbnQpIHZvaWNlIDwgbnJfdm9pY2VzKQkvKgorCQkJCQkJCQkJCQkgICAqIE5vdCBkb25lCisJCQkJCQkJCQkJCSAgICogeWV0CisJCQkJCQkJCQkJCSAqLworCQkJeworCQkJCXZvbHVtZV9pZ25vcmUgfD0gdm9pY2VfYml0OworCQkJCWRvX3ZvbHVtZV9pcnEodm9pY2UpOworCQkJfQorCX0KK30KKwordm9pZCBndXN3YXZlX2RtYV9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyICAgc3RhdHVzOworCisJc3RhdHVzID0gZ3VzX2xvb2s4KDB4NDEpOwkvKiBHZXQgRE1BIElSUSBTdGF0dXMgKi8KKwlpZiAoc3RhdHVzICYgMHg0MCkJLyogRE1BIGludGVycnVwdCBwZW5kaW5nICovCisJCXN3aXRjaCAoYWN0aXZlX2RldmljZSkKKwkJeworCQkJY2FzZSBHVVNfREVWX1dBVkU6CisJCQkJd2FrZV91cCgmZHJhbV9zbGVlcGVyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBHVVNfREVWX1BDTV9DT05USU5VRToJLyogTGVmdCBjaGFubmVsIGRhdGEgdHJhbnNmZXJyZWQgKi8KKwkJCQlndXNfd3JpdGU4KDB4NDEsIDApOwkvKiBEaXNhYmxlIEdGMSBETUEgKi8KKwkJCQlndXNfdHJhbnNmZXJfb3V0cHV0X2Jsb2NrKHBjbV9jdXJyZW50X2RldiwgcGNtX2N1cnJlbnRfYnVmLAorCQkJCQkJcGNtX2N1cnJlbnRfY291bnQsCisJCQkJCQlwY21fY3VycmVudF9pbnRyZmxhZywgMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgR1VTX0RFVl9QQ01fRE9ORToJLyogUmlnaHQgb3IgbW9ubyBjaGFubmVsIGRhdGEgdHJhbnNmZXJyZWQgKi8KKwkJCQlndXNfd3JpdGU4KDB4NDEsIDApOwkvKiBEaXNhYmxlIEdGMSBETUEgKi8KKwkJCQlpZiAocGNtX3FsZW4gPCBwY21fbmJsaykKKwkJCQl7CisJCQkJCWRtYV9hY3RpdmUgPSAwOworCQkJCQlpZiAoZ3VzX2J1c3kpCisJCQkJCXsKKwkJCQkJCWlmIChhdWRpb19kZXZzW2d1c19kZXZudW1dLT5kbWFwX291dC0+cWxlbiA+IDApCisJCQkJCQkJRE1BYnVmX291dHB1dGludHIoZ3VzX2Rldm51bSwgMCk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJfQorCXN0YXR1cyA9IGd1c19sb29rOCgweDQ5KTsJLyoKKwkJCQkJICogR2V0IFNhbXBsaW5nIElSUSBTdGF0dXMKKwkJCQkJICovCisJaWYgKHN0YXR1cyAmIDB4NDApCS8qCisJCQkJICogU2FtcGxpbmcgSXJxIHBlbmRpbmcKKwkJCQkgKi8KKwl7CisJCURNQWJ1Zl9pbnB1dGludHIoZ3VzX2Rldm51bSk7CisJfQorfQorCisvKgorICogVGltZXIgc3R1ZmYKKyAqLworCitzdGF0aWMgdm9sYXRpbGUgaW50IHNlbGVjdF9hZGRyLCBkYXRhX2FkZHI7CitzdGF0aWMgdm9sYXRpbGUgaW50IGN1cnJfdGltZXI7CisKK3ZvaWQgZ3VzX3RpbWVyX2NvbW1hbmQodW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IGk7CisKKwlvdXRiKCgodW5zaWduZWQgY2hhcikgKGFkZHIgJiAweGZmKSksIHNlbGVjdF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWluYihzZWxlY3RfYWRkcik7CisKKwlvdXRiKCgodW5zaWduZWQgY2hhcikgKHZhbCAmIDB4ZmYpKSwgZGF0YV9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWluYihzZWxlY3RfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGFybV90aW1lcihpbnQgdGltZXIsIHVuc2lnbmVkIGludCBpbnRlcnZhbCkKK3sKKwljdXJyX3RpbWVyID0gdGltZXI7CisKKwlpZiAodGltZXIgPT0gMSkKKwl7CisJCWd1c193cml0ZTgoMHg0NiwgMjU2IC0gaW50ZXJ2YWwpOwkvKiBTZXQgY291bnRlciBmb3IgdGltZXIgMSAqLworCQlndXNfd3JpdGU4KDB4NDUsIDB4MDQpOwkJCS8qIEVuYWJsZSB0aW1lciAxIElSUSAqLworCQlndXNfdGltZXJfY29tbWFuZCgweDA0LCAweDAxKTsJCS8qIFN0YXJ0IHRpbWVyIDEgKi8KKwl9CisJZWxzZQorCXsKKwkJZ3VzX3dyaXRlOCgweDQ3LCAyNTYgLSBpbnRlcnZhbCk7CS8qIFNldCBjb3VudGVyIGZvciB0aW1lciAyICovCisJCWd1c193cml0ZTgoMHg0NSwgMHgwOCk7CQkJLyogRW5hYmxlIHRpbWVyIDIgSVJRICovCisJCWd1c190aW1lcl9jb21tYW5kKDB4MDQsIDB4MDIpOwkJLyogU3RhcnQgdGltZXIgMiAqLworCX0KKworCWd1c190aW1lcl9lbmFibGVkID0gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBndXNfdG1yX3N0YXJ0KGludCBkZXYsIHVuc2lnbmVkIGludCB1c2Vjc19wZXJfdGljaykKK3sKKwlpbnQgdGltZXJfbm8sIHJlc29sdXRpb247CisJaW50IGRpdmlzb3I7CisKKwlpZiAodXNlY3NfcGVyX3RpY2sgPiAoMjU2ICogODApKQorCXsKKwkJdGltZXJfbm8gPSAyOworCQlyZXNvbHV0aW9uID0gMzIwOwkvKiB1c2VjICovCisJfQorCWVsc2UKKwl7CisJCXRpbWVyX25vID0gMTsKKwkJcmVzb2x1dGlvbiA9IDgwOwkvKiB1c2VjICovCisJfQorCWRpdmlzb3IgPSAodXNlY3NfcGVyX3RpY2sgKyAocmVzb2x1dGlvbiAvIDIpKSAvIHJlc29sdXRpb247CisJYXJtX3RpbWVyKHRpbWVyX25vLCBkaXZpc29yKTsKKworCXJldHVybiBkaXZpc29yICogcmVzb2x1dGlvbjsKK30KKworc3RhdGljIHZvaWQgZ3VzX3Rtcl9kaXNhYmxlKGludCBkZXYpCit7CisJZ3VzX3dyaXRlOCgweDQ1LCAwKTsJLyogRGlzYWJsZSBib3RoIHRpbWVycyAqLworCWd1c190aW1lcl9lbmFibGVkID0gMDsKK30KKworc3RhdGljIHZvaWQgZ3VzX3Rtcl9yZXN0YXJ0KGludCBkZXYpCit7CisJaWYgKGN1cnJfdGltZXIgPT0gMSkKKwkJZ3VzX3dyaXRlOCgweDQ1LCAweDA0KTsJCS8qIFN0YXJ0IHRpbWVyIDEgYWdhaW4gKi8KKwllbHNlCisJCWd1c193cml0ZTgoMHg0NSwgMHgwOCk7CQkvKiBTdGFydCB0aW1lciAyIGFnYWluICovCisJZ3VzX3RpbWVyX2VuYWJsZWQgPSAxOworfQorCitzdGF0aWMgc3RydWN0IHNvdW5kX2xvd2xldl90aW1lciBndXNfdG1yID0KK3sKKwkwLAorCTEsCisJZ3VzX3Rtcl9zdGFydCwKKwlndXNfdG1yX2Rpc2FibGUsCisJZ3VzX3Rtcl9yZXN0YXJ0Cit9OworCitzdGF0aWMgdm9pZCBndXNfdG1yX2luc3RhbGwoaW50IGlvX2Jhc2UpCit7CisJc3RydWN0IHNvdW5kX2xvd2xldl90aW1lciAqdG1yOworCisJc2VsZWN0X2FkZHIgPSBpb19iYXNlOworCWRhdGFfYWRkciA9IGlvX2Jhc2UgKyAxOworCisJdG1yID0gJmd1c190bXI7CisKKyNpZmRlZiBUSElTX0dFVFNfRklYRUQKKwlzb3VuZF90aW1lcl9pbml0KCZndXNfdG1yLCAiR1VTIik7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9oYWwyLmMgYi9zb3VuZC9vc3MvaGFsMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTk3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvaGFsMi5jCkBAIC0wLDAgKzEsMTU1NyBAQAorLyoKKyAqICBEcml2ZXIgZm9yIEEyIGF1ZGlvIHN5c3RlbSB1c2VkIGluIFNHSSBtYWNoaW5lcworICogIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMyBMYWRpc2xhdiBNaWNobCA8bGFkaXNAbGludXgtbWlwcy5vcmc+CisgKiAgCisgKiAgQmFzZWQgb24gVWxmIENhcmxzc29uJ3MgY29kZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBTdXBwb3J0ZWQgZGV2aWNlczoKKyAqICAvZGV2L2RzcCAgICBzdGFuZGFyZCBkc3AgZGV2aWNlLCAobW9zdGx5KSBPU1MgY29tcGF0aWJsZQorICogIC9kZXYvbWl4ZXIJc3RhbmRhcmQgbWl4ZXIgZGV2aWNlLCAobW9zdGx5KSBPU1MgY29tcGF0aWJsZQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NnaS9ocGMzLmg+CisjaW5jbHVkZSA8YXNtL3NnaS9pcDIyLmg+CisKKyNpbmNsdWRlICJoYWwyLmgiCisKKyNpZiAwCisjZGVmaW5lIERFQlVHKGFyZ3MuLi4pCQlwcmludGsoYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHKGFyZ3MuLi4pCisjZW5kaWYKKworI2lmIDAgCisjZGVmaW5lIERFQlVHX01JWChhcmdzLi4uKQlwcmludGsoYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHX01JWChhcmdzLi4uKQorI2VuZGlmCisKKy8qCisgKiBCZWZvcmUgdG91Y2hpbmcgdGhlc2UgbG9vayBob3cgaXQgd29ya3MuIEl0IGlzIGEgYml0IHVudXN1YWwgSSBrbm93LAorICogYnV0IGl0IGhlbHBzIHRvIGtlZXAgdGhpbmdzIHNpbXBsZS4gVGhpcyBkcml2ZXIgaXMgY29uc2lkZXJlZCBjb21wbGV0ZQorICogYW5kIEkgd29uJ3QgYWRkIGFueSBuZXcgZmVhdHVyZXMgYWx0aG91Z2ggaGFyZHdhcmUgaGFzIG1hbnkgY29vbAorICogY2FwYWJpbGl0aWVzLgorICogKEhpc3RvcmljYWwgbm90ZTogSEFMMiBkcml2ZXIgd2FzIGZpcnN0IHdyaXR0ZW4gYnkgVWxmIENhcmxzc29uIC0gQUxTQQorICogMC4zIHJ1bm5pbmcgd2l0aCAyLjIueCBrZXJuZWwuIFRoZW4gQUxTQSBjaGFuZ2VkIGNvbXBsZXRlbHkgYW5kIGl0CisgKiBzZWVtZWQgZWFzaWVyIHRvIG1lIHRvIHdyaXRlIE9TUyBkcml2ZXIgZnJvbSBzY3JhdGNoIC0gdGhpcyBvbmUuIE5vdworICogd2hlbiBBTFNBIGlzIG9mZmljaWFsIHBhcnQgb2YgMi42IGtlcm5lbCBpdCdzIHRpbWUgdG8gd3JpdGUgQUxTQSBkcml2ZXIKKyAqIHVzaW5nIChob3BlZnVsbHkpIGZpbmFsIHZlcnNpb24gb2YgQUxTQSBpbnRlcmZhY2UpCisgKi8KKyNkZWZpbmUgSDJfQkxPQ0tfU0laRQkxMDI0CisjZGVmaW5lIEgyX0FEQ19CVUZTSVpFCTgxOTIKKyNkZWZpbmUgSDJfREFDX0JVRlNJWkUJMTY4MzQKKworc3RydWN0IGhhbDJfcGJ1cyB7CisJc3RydWN0IGhwYzNfcGJ1c19kbWFjcmVncyAqcGJ1czsKKwlpbnQgcGJ1c25yOworCXVuc2lnbmVkIGludCBjdHJsOwkJLyogQ3VycmVudCBzdGF0ZSBvZiBwYnVzLT5wYmRtYV9jdHJsICovCit9OworCitzdHJ1Y3QgaGFsMl9kZXNjIHsKKwlzdHJ1Y3QgaHBjX2RtYV9kZXNjIGRlc2M7CisJdTMyIGNudDsJCQkvKiBkb24ndCB0b3VjaCwgaXQgaXMgYWxzbyBwYWRkaW5nICovCit9OworCitzdHJ1Y3QgaGFsMl9jb2RlYyB7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCXN0cnVjdCBoYWwyX2Rlc2MgKmRlc2M7CisJaW50IGRlc2NfY291bnQ7CisJaW50IHRhaWwsIGhlYWQ7CQkJLyogdGFpbCBpbmRleCwgaGVhZCBpbmRleCAqLworCXN0cnVjdCBoYWwyX3BidXMgcGJ1czsKKwl1bnNpZ25lZCBpbnQgZm9ybWF0OwkJLyogQXVkaW8gZGF0YSBmb3JtYXQgKi8KKwlpbnQgdm9pY2VzOwkJCS8qIG1vbm8vc3RlcmVvICovCisJdW5zaWduZWQgaW50IHNhbXBsZV9yYXRlOworCXVuc2lnbmVkIGludCBtYXN0ZXI7CQkvKiBNYXN0ZXIgZnJlcXVlbmN5ICovCisJdW5zaWduZWQgc2hvcnQgbW9kOwkJLyogTU9EIHZhbHVlICovCisJdW5zaWduZWQgc2hvcnQgaW5jOwkJLyogSU5DIHZhbHVlICovCisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBkbWFfd2FpdDsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisKKwlpbnQgdXNlY291bnQ7CQkJLyogcmVjb3JkaW5nIGFuZCBwbGF5YmFjayBhcmUKKwkJCQkJICogaW5kZXBlbmRlbnQgKi8KK307CisKKyNkZWZpbmUgSDJfTUlYX09VVFBVVF9BVFQJMAorI2RlZmluZSBIMl9NSVhfSU5QVVRfR0FJTgkxCisjZGVmaW5lIEgyX01JWEVSUwkJMgorc3RydWN0IGhhbDJfbWl4ZXIgeworCWludCBtb2RjbnQ7CisJdW5zaWduZWQgaW50IG1hc3RlcjsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lW0gyX01JWEVSU107Cit9OworCitzdHJ1Y3QgaGFsMl9jYXJkIHsKKwlpbnQgZGV2X2RzcDsJCQkvKiBhdWRpbyBkZXZpY2UgKi8KKwlpbnQgZGV2X21peGVyOwkJCS8qIG1peGVyIGRldmljZSAqLworCWludCBkZXZfbWlkaTsJCQkvKiBtaWRpIGRldmljZSAqLworCisJc3RydWN0IGhhbDJfY3RsX3JlZ3MgKmN0bF9yZWdzOwkvKiBIQUwyIGN0bCByZWdpc3RlcnMgKi8KKwlzdHJ1Y3QgaGFsMl9hZXNfcmVncyAqYWVzX3JlZ3M7CS8qIEhBTDIgYWVzIHJlZ2lzdGVycyAqLworCXN0cnVjdCBoYWwyX3ZvbF9yZWdzICp2b2xfcmVnczsJLyogSEFMMiB2b2wgcmVnaXN0ZXJzICovCisJc3RydWN0IGhhbDJfc3luX3JlZ3MgKnN5bl9yZWdzOwkvKiBIQUwyIHN5biByZWdpc3RlcnMgKi8KKworCXN0cnVjdCBoYWwyX2NvZGVjIGRhYzsKKwlzdHJ1Y3QgaGFsMl9jb2RlYyBhZGM7CisJc3RydWN0IGhhbDJfbWl4ZXIgbWl4ZXI7Cit9OworCisjZGVmaW5lIEgyX0lORElSRUNUX1dBSVQocmVncykJd2hpbGUgKHJlZ3MtPmlzciAmIEgyX0lTUl9UU1RBVFVTKTsKKworI2RlZmluZSBIMl9SRUFEX0FERFIoYWRkcikJKGFkZHIgfCAoMTw8NykpCisjZGVmaW5lIEgyX1dSSVRFX0FERFIoYWRkcikJKGFkZHIpCisKK3N0YXRpYyBjaGFyICpoYWwyc3RyID0gIkhBTDIiOworCisvKgorICogSSBkb3VidCBhbnlvbmUgaGFzIGEgbWFjaGluZSB3aXRoIHR3byBIQUwyIGNhcmRzLiBJdCdzIHBvc3NpYmxlIHRvCisgKiBoYXZlIHR3byBIUEMncywgc28gaXQgaXMgcHJvYmFibHkgcG9zc2libGUgdG8gaGF2ZSB0d28gSEFMMiBjYXJkcy4KKyAqIFRyeSB0byBkZWFsIHdpdGggaXQsIGJ1dCBub3RlIHRoYXQgaXQgaXMgbm90IHRlc3RlZC4KKyAqLworI2RlZmluZSBNQVhDQVJEUwkyCitzdGF0aWMgc3RydWN0IGhhbDJfY2FyZCogaGFsMl9jYXJkW01BWENBUkRTXTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBpZHg6NCwgYXZhaWw6MTsKK30gbWl4dGFibGVbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9IHsKKwlbU09VTkRfTUlYRVJfUENNXQk9IHsgSDJfTUlYX09VVFBVVF9BVFQsIDEgfSwJLyogdm9pY2UgKi8KKwlbU09VTkRfTUlYRVJfTUlDXQk9IHsgSDJfTUlYX0lOUFVUX0dBSU4sIDEgfSwJLyogbWljICovCit9OworCisjZGVmaW5lIEgyX1NVUFBPUlRFRF9GT1JNQVRTCShBRk1UX1MxNl9MRSB8IEFGTVRfUzE2X0JFKQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGFsMl9pc3Jfd3JpdGUoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgdTE2IHZhbCkKK3sKKwloYWwyLT5jdGxfcmVncy0+aXNyID0gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBoYWwyX2lzcl9sb29rKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIpCit7CisJcmV0dXJuIGhhbDItPmN0bF9yZWdzLT5pc3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGhhbDJfcmV2X2xvb2soc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKK3sKKwlyZXR1cm4gaGFsMi0+Y3RsX3JlZ3MtPnJldjsKK30KKworI2lmZGVmIEhBTDJfRFVNUF9SRUdTCitzdGF0aWMgdTE2IGhhbDJfaV9sb29rMTYoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgdTE2IGFkZHIpCit7CisJc3RydWN0IGhhbDJfY3RsX3JlZ3MgKnJlZ3MgPSBoYWwyLT5jdGxfcmVnczsKKworCXJlZ3MtPmlhciA9IEgyX1JFQURfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworCXJldHVybiByZWdzLT5pZHIwOworfQorI2VuZGlmCisKK3N0YXRpYyB1MzIgaGFsMl9pX2xvb2szMihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgYWRkcikKK3sKKwl1MzIgcmV0OworCXN0cnVjdCBoYWwyX2N0bF9yZWdzICpyZWdzID0gaGFsMi0+Y3RsX3JlZ3M7CisKKwlyZWdzLT5pYXIgPSBIMl9SRUFEX0FERFIoYWRkcik7CisJSDJfSU5ESVJFQ1RfV0FJVChyZWdzKTsKKwlyZXQgPSByZWdzLT5pZHIwICYgMHhmZmZmOworCXJlZ3MtPmlhciA9IEgyX1JFQURfQUREUihhZGRyIHwgMHgxKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworCXJldCB8PSAocmVncy0+aWRyMCAmIDB4ZmZmZikgPDwgMTY7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaGFsMl9pX3dyaXRlMTYoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgdTE2IGFkZHIsIHUxNiB2YWwpCit7CisJc3RydWN0IGhhbDJfY3RsX3JlZ3MgKnJlZ3MgPSBoYWwyLT5jdGxfcmVnczsKKworCXJlZ3MtPmlkcjAgPSB2YWw7CisJcmVncy0+aWRyMSA9IDA7CisJcmVncy0+aWRyMiA9IDA7CisJcmVncy0+aWRyMyA9IDA7CisJcmVncy0+aWFyID0gSDJfV1JJVEVfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBoYWwyX2lfd3JpdGUzMihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgYWRkciwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqcmVncyA9IGhhbDItPmN0bF9yZWdzOworCisJcmVncy0+aWRyMCA9IHZhbCAmIDB4ZmZmZjsKKwlyZWdzLT5pZHIxID0gdmFsID4+IDE2OworCXJlZ3MtPmlkcjIgPSAwOworCXJlZ3MtPmlkcjMgPSAwOworCXJlZ3MtPmlhciA9IEgyX1dSSVRFX0FERFIoYWRkcik7CisJSDJfSU5ESVJFQ1RfV0FJVChyZWdzKTsKK30KKworc3RhdGljIHZvaWQgaGFsMl9pX3NldGJpdDE2KHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIHUxNiBhZGRyLCB1MTYgYml0KQoreworCXN0cnVjdCBoYWwyX2N0bF9yZWdzICpyZWdzID0gaGFsMi0+Y3RsX3JlZ3M7CisKKwlyZWdzLT5pYXIgPSBIMl9SRUFEX0FERFIoYWRkcik7CisJSDJfSU5ESVJFQ1RfV0FJVChyZWdzKTsKKwlyZWdzLT5pZHIwID0gKHJlZ3MtPmlkcjAgJiAweGZmZmYpIHwgYml0OworCXJlZ3MtPmlkcjEgPSAwOworCXJlZ3MtPmlkcjIgPSAwOworCXJlZ3MtPmlkcjMgPSAwOworCXJlZ3MtPmlhciA9IEgyX1dSSVRFX0FERFIoYWRkcik7CisJSDJfSU5ESVJFQ1RfV0FJVChyZWdzKTsKK30KKworc3RhdGljIHZvaWQgaGFsMl9pX3NldGJpdDMyKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIHUxNiBhZGRyLCB1MzIgYml0KQoreworCXUzMiB0bXA7CisJc3RydWN0IGhhbDJfY3RsX3JlZ3MgKnJlZ3MgPSBoYWwyLT5jdGxfcmVnczsKKworCXJlZ3MtPmlhciA9IEgyX1JFQURfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworCXRtcCA9IChyZWdzLT5pZHIwICYgMHhmZmZmKSB8IChyZWdzLT5pZHIxIDw8IDE2KSB8IGJpdDsKKwlyZWdzLT5pZHIwID0gdG1wICYgMHhmZmZmOworCXJlZ3MtPmlkcjEgPSB0bXAgPj4gMTY7CisJcmVncy0+aWRyMiA9IDA7CisJcmVncy0+aWRyMyA9IDA7CisJcmVncy0+aWFyID0gSDJfV1JJVEVfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBoYWwyX2lfY2xlYXJiaXQxNihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgYWRkciwgdTE2IGJpdCkKK3sKKwlzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqcmVncyA9IGhhbDItPmN0bF9yZWdzOworCisJcmVncy0+aWFyID0gSDJfUkVBRF9BRERSKGFkZHIpOworCUgyX0lORElSRUNUX1dBSVQocmVncyk7CisJcmVncy0+aWRyMCA9IChyZWdzLT5pZHIwICYgMHhmZmZmKSAmIH5iaXQ7CisJcmVncy0+aWRyMSA9IDA7CisJcmVncy0+aWRyMiA9IDA7CisJcmVncy0+aWRyMyA9IDA7CisJcmVncy0+aWFyID0gSDJfV1JJVEVfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgaGFsMl9pX2NsZWFyYml0MzIoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgdTE2IGFkZHIsIHUzMiBiaXQpCit7CisJdTMyIHRtcDsKKwloYWwyX2N0bF9yZWdzX3QgKnJlZ3MgPSBoYWwyLT5jdGxfcmVnczsKKworCXJlZ3MtPmlhciA9IEgyX1JFQURfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworCXRtcCA9ICgocmVncy0+aWRyMCAmIDB4ZmZmZikgfCAocmVncy0+aWRyMSA8PCAxNikpICYgfmJpdDsKKwlyZWdzLT5pZHIwID0gdG1wICYgMHhmZmZmOworCXJlZ3MtPmlkcjEgPSB0bXAgPj4gMTY7CisJcmVncy0+aWRyMiA9IDA7CisJcmVncy0+aWRyMyA9IDA7CisJcmVncy0+aWFyID0gSDJfV1JJVEVfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworfQorI2VuZGlmCisKKyNpZmRlZiBIQUwyX0RVTVBfUkVHUworc3RhdGljIHZvaWQgaGFsMl9kdW1wX3JlZ3Moc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKK3sKKwlERUJVRygiaXNyOiAlMDhoeCAiLCBoYWwyX2lzcl9sb29rKGhhbDIpKTsKKwlERUJVRygicmV2OiAlMDhoeFxuIiwgaGFsMl9yZXZfbG9vayhoYWwyKSk7CisJREVCVUcoInJlbGF5OiAlMDRoeFxuIiwgaGFsMl9pX2xvb2sxNihoYWwyLCBIMklfUkVMQVlfQykpOworCURFQlVHKCJwb3J0IGVuOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9ETUFfUE9SVF9FTikpOworCURFQlVHKCJkbWEgZW5kOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9ETUFfRU5EKSk7CisJREVCVUcoImRtYSBkcnY6ICUwNGh4XG4iLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9ETUFfRFJWKSk7CisJREVCVUcoInN5biBjdGw6ICUwNGh4ICIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX1NZTlRIX0MpKTsKKwlERUJVRygiYWVzcnggY3RsOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9BRVNSWF9DKSk7CisJREVCVUcoImFlc3R4IGN0bDogJTA0aHggIiwgaGFsMl9pX2xvb2sxNihoYWwyLCBIMklfQUVTVFhfQykpOworCURFQlVHKCJkYWMgY3RsMTogJTA0aHggIiwgaGFsMl9pX2xvb2sxNihoYWwyLCBIMklfQURDX0MxKSk7CisJREVCVUcoImRhYyBjdGwyOiAlMDh4ICIsIGhhbDJfaV9sb29rMzIoaGFsMiwgSDJJX0FEQ19DMikpOworCURFQlVHKCJhZGMgY3RsMTogJTA0aHggIiwgaGFsMl9pX2xvb2sxNihoYWwyLCBIMklfREFDX0MxKSk7CisJREVCVUcoImFkYyBjdGwyOiAlMDh4ICIsIGhhbDJfaV9sb29rMzIoaGFsMiwgSDJJX0RBQ19DMikpOworCURFQlVHKCJzeW4gbWFwOiAlMDRoeFxuIiwgaGFsMl9pX2xvb2sxNihoYWwyLCBIMklfU1lOVEhfTUFQX0MpKTsKKwlERUJVRygiYnJlczEgY3RsMTogJTA0aHggIiwgaGFsMl9pX2xvb2sxNihoYWwyLCBIMklfQlJFUzFfQzEpKTsKKwlERUJVRygiYnJlczEgY3RsMjogJTA0eCAiLCBoYWwyX2lfbG9vazMyKGhhbDIsIEgySV9CUkVTMV9DMikpOworCURFQlVHKCJicmVzMiBjdGwxOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9CUkVTMl9DMSkpOworCURFQlVHKCJicmVzMiBjdGwyOiAlMDR4ICIsIGhhbDJfaV9sb29rMzIoaGFsMiwgSDJJX0JSRVMyX0MyKSk7CisJREVCVUcoImJyZXMzIGN0bDE6ICUwNGh4ICIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0JSRVMzX0MxKSk7CisJREVCVUcoImJyZXMzIGN0bDI6ICUwNHhcbiIsIGhhbDJfaV9sb29rMzIoaGFsMiwgSDJJX0JSRVMzX0MyKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBoYWwyX2NhcmQqIGhhbDJfZHNwX2ZpbmRfY2FyZChpbnQgbWlub3IpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQ0FSRFM7IGkrKykKKwkJaWYgKGhhbDJfY2FyZFtpXSAhPSBOVUxMICYmIGhhbDJfY2FyZFtpXS0+ZGV2X2RzcCA9PSBtaW5vcikKKwkJCXJldHVybiBoYWwyX2NhcmRbaV07CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGFsMl9jYXJkKiBoYWwyX21peGVyX2ZpbmRfY2FyZChpbnQgbWlub3IpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQ0FSRFM7IGkrKykKKwkJaWYgKGhhbDJfY2FyZFtpXSAhPSBOVUxMICYmIGhhbDJfY2FyZFtpXS0+ZGV2X21peGVyID09IG1pbm9yKQorCQkJcmV0dXJuIGhhbDJfY2FyZFtpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaGFsMl9pbmNfaGVhZChzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMpCit7CisJY29kZWMtPmhlYWQrKzsKKwlpZiAoY29kZWMtPmhlYWQgPT0gY29kZWMtPmRlc2NfY291bnQpCisJCWNvZGVjLT5oZWFkID0gMDsKK30KKworc3RhdGljIHZvaWQgaGFsMl9pbmNfdGFpbChzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMpCit7CisJY29kZWMtPnRhaWwrKzsKKwlpZiAoY29kZWMtPnRhaWwgPT0gY29kZWMtPmRlc2NfY291bnQpCisJCWNvZGVjLT50YWlsID0gMDsKK30KKworc3RhdGljIHZvaWQgaGFsMl9kYWNfaW50ZXJydXB0KHN0cnVjdCBoYWwyX2NvZGVjICpkYWMpCit7CisJaW50IHJ1bm5pbmc7CisKKwlzcGluX2xvY2soJmRhYy0+bG9jayk7CisJLyogaWYgdGFpbCBidWZmZXIgY29udGFpbnMgemVybyBzYW1wbGVzIERNQSBzdHJlYW0gd2FzIGFscmVhZHkKKwkgKiBzdG9wcGVkICovCisJcnVubmluZyA9IGRhYy0+ZGVzY1tkYWMtPnRhaWxdLmNudDsKKwlkYWMtPmRlc2NbZGFjLT50YWlsXS5jbnQgPSAwOworCWRhYy0+ZGVzY1tkYWMtPnRhaWxdLmRlc2MuY250aW5mbyA9IEhQQ0RNQV9YSUUgfCBIUENETUFfRU9YOworCS8qIHdlIGp1c3QgcHJvY2Nlc3NlZCBlbXB0eSBidWZmZXIsIGRvbid0IHVwZGF0ZSB0YWlsIHBvaW50ZXIgKi8KKwlpZiAocnVubmluZykKKwkJaGFsMl9pbmNfdGFpbChkYWMpOworCXNwaW5fdW5sb2NrKCZkYWMtPmxvY2spOworCisJd2FrZV91cCgmZGFjLT5kbWFfd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbDJfYWRjX2ludGVycnVwdChzdHJ1Y3QgaGFsMl9jb2RlYyAqYWRjKQoreworCWludCBydW5uaW5nOworCisJc3Bpbl9sb2NrKCZhZGMtPmxvY2spOworCS8qIGlmIGhlYWQgYnVmZmVyIGNvbnRhaW5zIG5vbnplcm8gc2FtcGxlcyBETUEgc3RyZWFtIHdhcyBhbHJlYWR5CisJICogc3RvcHBlZCAqLworCXJ1bm5pbmcgPSAhYWRjLT5kZXNjW2FkYy0+aGVhZF0uY250OworCWFkYy0+ZGVzY1thZGMtPmhlYWRdLmNudCA9IEgyX0JMT0NLX1NJWkU7CisJYWRjLT5kZXNjW2FkYy0+aGVhZF0uZGVzYy5jbnRpbmZvID0gSFBDRE1BX1hJRSB8IEhQQ0RNQV9FT1I7CisJLyogd2UganVzdCBwcm9jY2Vzc2VkIGVtcHR5IGJ1ZmZlciwgZG9uJ3QgdXBkYXRlIGhlYWQgcG9pbnRlciAqLworCWlmIChydW5uaW5nKQorCQloYWwyX2luY19oZWFkKGFkYyk7CisJc3Bpbl91bmxvY2soJmFkYy0+bG9jayk7CisKKwl3YWtlX3VwKCZhZGMtPmRtYV93YWl0KTsKK30KKworc3RhdGljIGlycXJldHVybl90IGhhbDJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGhhbDJfY2FyZCAqaGFsMiA9IChzdHJ1Y3QgaGFsMl9jYXJkKilkZXZfaWQ7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisKKwkvKiBkZWNpZGUgd2hhdCBjYXVzZWQgdGhpcyBpbnRlcnJ1cHQgKi8KKwlpZiAoaGFsMi0+ZGFjLnBidXMucGJ1cy0+cGJkbWFfY3RybCAmIEhQQzNfUERNQUNUUkxfSU5UKSB7CisJCWhhbDJfZGFjX2ludGVycnVwdCgmaGFsMi0+ZGFjKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCWlmIChoYWwyLT5hZGMucGJ1cy5wYnVzLT5wYmRtYV9jdHJsICYgSFBDM19QRE1BQ1RSTF9JTlQpIHsKKwkJaGFsMl9hZGNfaW50ZXJydXB0KCZoYWwyLT5hZGMpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoYWwyX2NvbXB1dGVfcmF0ZShzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIHNob3J0IG1vZDsKKwkKKwlERUJVRygicmF0ZTogJWRcbiIsIHJhdGUpOworCQorCWlmIChyYXRlIDwgNDAwMCkgcmF0ZSA9IDQwMDA7CisJZWxzZSBpZiAocmF0ZSA+IDQ4MDAwKSByYXRlID0gNDgwMDA7CisKKwlpZiAoNDQxMDAgJSByYXRlIDwgNDgwMDAgJSByYXRlKSB7CisJCW1vZCA9IDQgKiA0NDEwMCAvIHJhdGU7CisJCWNvZGVjLT5tYXN0ZXIgPSA0NDEwMDsKKwl9IGVsc2UgeworCQltb2QgPSA0ICogNDgwMDAgLyByYXRlOworCQljb2RlYy0+bWFzdGVyID0gNDgwMDA7CisJfQorCisJY29kZWMtPmluYyA9IDQ7CisJY29kZWMtPm1vZCA9IG1vZDsKKwlyYXRlID0gNCAqIGNvZGVjLT5tYXN0ZXIgLyBtb2Q7CisKKwlERUJVRygicmVhbF9yYXRlOiAlZFxuIiwgcmF0ZSk7CisKKwlyZXR1cm4gcmF0ZTsKK30KKworc3RhdGljIHZvaWQgaGFsMl9zZXRfZGFjX3JhdGUoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKK3sKKwl1bnNpZ25lZCBpbnQgbWFzdGVyID0gaGFsMi0+ZGFjLm1hc3RlcjsKKwlpbnQgaW5jID0gaGFsMi0+ZGFjLmluYzsKKwlpbnQgbW9kID0gaGFsMi0+ZGFjLm1vZDsKKworCURFQlVHKCJtYXN0ZXI6ICVkIGluYzogJWQgbW9kOiAlZFxuIiwgbWFzdGVyLCBpbmMsIG1vZCk7CisJCisJaGFsMl9pX3dyaXRlMTYoaGFsMiwgSDJJX0JSRVMxX0MxLCAobWFzdGVyID09IDQ0MTAwKSA/IDEgOiAwKTsKKwloYWwyX2lfd3JpdGUzMihoYWwyLCBIMklfQlJFUzFfQzIsICgoMHhmZmZmICYgKGluYyAtIG1vZCAtIDEpKSA8PCAxNikgfCBpbmMpOworfQorCitzdGF0aWMgdm9pZCBoYWwyX3NldF9hZGNfcmF0ZShzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCXVuc2lnbmVkIGludCBtYXN0ZXIgPSBoYWwyLT5hZGMubWFzdGVyOworCWludCBpbmMgPSBoYWwyLT5hZGMuaW5jOworCWludCBtb2QgPSBoYWwyLT5hZGMubW9kOworCisJREVCVUcoIm1hc3RlcjogJWQgaW5jOiAlZCBtb2Q6ICVkXG4iLCBtYXN0ZXIsIGluYywgbW9kKTsKKwkKKwloYWwyX2lfd3JpdGUxNihoYWwyLCBIMklfQlJFUzJfQzEsIChtYXN0ZXIgPT0gNDQxMDApID8gMSA6IDApOworCWhhbDJfaV93cml0ZTMyKGhhbDIsIEgySV9CUkVTMl9DMiwgKCgweGZmZmYgJiAoaW5jIC0gbW9kIC0gMSkpIDw8IDE2KSB8IGluYyk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbDJfc2V0dXBfZGFjKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIpCit7CisJdW5zaWduZWQgaW50IGZpZm9iZWcsIGZpZm9lbmQsIGhpZ2h3YXRlciwgc2FtcGxlX3NpemU7CisJc3RydWN0IGhhbDJfcGJ1cyAqcGJ1cyA9ICZoYWwyLT5kYWMucGJ1czsKKworCURFQlVHKCJoYWwyX3NldHVwX2RhY1xuIik7CisJCisJLyogTm93IHdlIHNldCB1cCBzb21lIFBCVVMgaW5mb3JtYXRpb24uIFRoZSBQQlVTIG5lZWRzIGluZm9ybWF0aW9uIGFib3V0CisJICogd2hhdCBwb3J0aW9uIG9mIHRoZSBmaWZvIGl0IHdpbGwgdXNlLiBJZiBpdCdzIHJlY2VpdmluZyBvcgorCSAqIHRyYW5zbWl0dGluZywgYW5kIGZpbmFsbHkgd2hldGhlciB0aGUgc3RyZWFtIGlzIGxpdHRsZSBlbmRpYW4gb3IgYmlnCisJICogZW5kaWFuLiBUaGUgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiBsYXRlciwgb24gdGhlIHN0YXJ0IGNhbGwuCisJICovCisJc2FtcGxlX3NpemUgPSAyICogaGFsMi0+ZGFjLnZvaWNlczsKKwkvKiBGaWZvIHNob3VsZCBiZSBzZXQgdG8gaG9sZCBleGFjdGx5IGZvdXIgc2FtcGxlcy4gSGlnaHdhdGVyIG1hcmsKKwkgKiBzaG91bGQgYmUgc2V0IHRvIHR3byBzYW1wbGVzLiAqLworCWhpZ2h3YXRlciA9IChzYW1wbGVfc2l6ZSAqIDIpID4+IDE7CS8qIGhhbGZ3b3JkcyAqLworCWZpZm9iZWcgPSAwOwkJCQkvKiBwbGF5YmFjayBpcyBmaXJzdCAqLworCWZpZm9lbmQgPSAoc2FtcGxlX3NpemUgKiA0KSA+PiAzOwkvKiBkb3VibGV3b3JkcyAqLworCXBidXMtPmN0cmwgPSBIUEMzX1BETUFDVFJMX1JUIHwgSFBDM19QRE1BQ1RSTF9MRCB8CisJCSAgICAgKGhpZ2h3YXRlciA8PCA4KSB8IChmaWZvYmVnIDw8IDE2KSB8IChmaWZvZW5kIDw8IDI0KSB8CisJCSAgICAgKGhhbDItPmRhYy5mb3JtYXQgJiBBRk1UX1MxNl9MRSA/IEhQQzNfUERNQUNUUkxfU0VMIDogMCk7CisJLyogV2UgZGlzYWJsZSBldmVyeXRoaW5nIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyBhdCBhbGwgKi8KKwlwYnVzLT5wYnVzLT5wYmRtYV9jdHJsID0gSFBDM19QRE1BQ1RSTF9MRDsKKwloYWwyX2lfY2xlYXJiaXQxNihoYWwyLCBIMklfRE1BX1BPUlRfRU4sIEgySV9ETUFfUE9SVF9FTl9DT0RFQ1RYKTsKKwkvKiBTZXR1cCB0aGUgSEFMMiBmb3IgcGxheWJhY2sgKi8KKwloYWwyX3NldF9kYWNfcmF0ZShoYWwyKTsKKwkvKiBTZXQgZW5kaWFuZXNzICovCisJaWYgKGhhbDItPmRhYy5mb3JtYXQgJiBBRk1UX1MxNl9MRSkKKwkJaGFsMl9pX3NldGJpdDE2KGhhbDIsIEgySV9ETUFfRU5ELCBIMklfRE1BX0VORF9DT0RFQ1RYKTsKKwllbHNlCisJCWhhbDJfaV9jbGVhcmJpdDE2KGhhbDIsIEgySV9ETUFfRU5ELCBIMklfRE1BX0VORF9DT0RFQ1RYKTsKKwkvKiBTZXQgRE1BIGJ1cyAqLworCWhhbDJfaV9zZXRiaXQxNihoYWwyLCBIMklfRE1BX0RSViwgKDEgPDwgcGJ1cy0+cGJ1c25yKSk7CisJLyogV2UgYXJlIHVzaW5nIDFzdCBCcmVzZW5oYW0gY2xvY2sgZ2VuZXJhdG9yIGZvciBwbGF5YmFjayAqLworCWhhbDJfaV93cml0ZTE2KGhhbDIsIEgySV9EQUNfQzEsIChwYnVzLT5wYnVzbnIgPDwgSDJJX0MxX0RNQV9TSElGVCkKKwkJCXwgKDEgPDwgSDJJX0MxX0NMS0lEX1NISUZUKQorCQkJfCAoaGFsMi0+ZGFjLnZvaWNlcyA8PCBIMklfQzFfREFUQVRfU0hJRlQpKTsKK30KKworc3RhdGljIHZvaWQgaGFsMl9zZXR1cF9hZGMoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKK3sKKwl1bnNpZ25lZCBpbnQgZmlmb2JlZywgZmlmb2VuZCwgaGlnaHdhdGVyLCBzYW1wbGVfc2l6ZTsKKwlzdHJ1Y3QgaGFsMl9wYnVzICpwYnVzID0gJmhhbDItPmFkYy5wYnVzOworCisJREVCVUcoImhhbDJfc2V0dXBfYWRjXG4iKTsKKworCXNhbXBsZV9zaXplID0gMiAqIGhhbDItPmFkYy52b2ljZXM7CisJaGlnaHdhdGVyID0gKHNhbXBsZV9zaXplICogMikgPj4gMTsJCS8qIGhhbGZ3b3JkcyAqLworCWZpZm9iZWcgPSAoNCAqIDQpID4+IDM7CQkJCS8qIHJlY29yZCBpcyBzZWNvbmQgKi8KKwlmaWZvZW5kID0gKDQgKiA0ICsgc2FtcGxlX3NpemUgKiA0KSA+PiAzOwkvKiBkb3VibGV3b3JkcyAqLworCXBidXMtPmN0cmwgPSBIUEMzX1BETUFDVFJMX1JUIHwgSFBDM19QRE1BQ1RSTF9SQ1YgfCBIUEMzX1BETUFDVFJMX0xEIHwgCisJCSAgICAgKGhpZ2h3YXRlciA8PCA4KSB8IChmaWZvYmVnIDw8IDE2KSB8IChmaWZvZW5kIDw8IDI0KSB8CisJCSAgICAgKGhhbDItPmFkYy5mb3JtYXQgJiBBRk1UX1MxNl9MRSA/IEhQQzNfUERNQUNUUkxfU0VMIDogMCk7CisJcGJ1cy0+cGJ1cy0+cGJkbWFfY3RybCA9IEhQQzNfUERNQUNUUkxfTEQ7CisJaGFsMl9pX2NsZWFyYml0MTYoaGFsMiwgSDJJX0RNQV9QT1JUX0VOLCBIMklfRE1BX1BPUlRfRU5fQ09ERUNSKTsKKwkvKiBTZXR1cCB0aGUgSEFMMiBmb3IgcmVjb3JkICovCisJaGFsMl9zZXRfYWRjX3JhdGUoaGFsMik7CisJLyogU2V0IGVuZGlhbmVzcyAqLworCWlmIChoYWwyLT5hZGMuZm9ybWF0ICYgQUZNVF9TMTZfTEUpCisJCWhhbDJfaV9zZXRiaXQxNihoYWwyLCBIMklfRE1BX0VORCwgSDJJX0RNQV9FTkRfQ09ERUNSKTsKKwllbHNlCisJCWhhbDJfaV9jbGVhcmJpdDE2KGhhbDIsIEgySV9ETUFfRU5ELCBIMklfRE1BX0VORF9DT0RFQ1IpOworCS8qIFNldCBETUEgYnVzICovCisJaGFsMl9pX3NldGJpdDE2KGhhbDIsIEgySV9ETUFfRFJWLCAoMSA8PCBwYnVzLT5wYnVzbnIpKTsKKwkvKiBXZSBhcmUgdXNpbmcgMm5kIEJyZXNlbmhhbSBjbG9jayBnZW5lcmF0b3IgZm9yIHJlY29yZCAqLworCWhhbDJfaV93cml0ZTE2KGhhbDIsIEgySV9BRENfQzEsIChwYnVzLT5wYnVzbnIgPDwgSDJJX0MxX0RNQV9TSElGVCkKKwkJCXwgKDIgPDwgSDJJX0MxX0NMS0lEX1NISUZUKQorCQkJfCAoaGFsMi0+YWRjLnZvaWNlcyA8PCBIMklfQzFfREFUQVRfU0hJRlQpKTsKK30KKworc3RhdGljIGRtYV9hZGRyX3QgaGFsMl9kZXNjX2FkZHIoc3RydWN0IGhhbDJfY29kZWMgKmNvZGVjLCBpbnQgaSkKK3sKKwlpZiAoLS1pIDwgMCkKKwkJaSA9IGNvZGVjLT5kZXNjX2NvdW50IC0gMTsKKwlyZXR1cm4gY29kZWMtPmRlc2NbaV0uZGVzYy5wbmV4dDsKK30KKworc3RhdGljIHZvaWQgaGFsMl9zdGFydF9kYWMoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKK3sKKwlzdHJ1Y3QgaGFsMl9jb2RlYyAqZGFjID0gJmhhbDItPmRhYzsKKwlzdHJ1Y3QgaGFsMl9wYnVzICpwYnVzID0gJmRhYy0+cGJ1czsKKworCXBidXMtPnBidXMtPnBiZG1hX2RwdHIgPSBoYWwyX2Rlc2NfYWRkcihkYWMsIGRhYy0+dGFpbCk7CisJcGJ1cy0+cGJ1cy0+cGJkbWFfY3RybCA9IHBidXMtPmN0cmwgfCBIUEMzX1BETUFDVFJMX0FDVDsKKwkvKiBlbmFibGUgREFDICovCisJaGFsMl9pX3NldGJpdDE2KGhhbDIsIEgySV9ETUFfUE9SVF9FTiwgSDJJX0RNQV9QT1JUX0VOX0NPREVDVFgpOworfQorCitzdGF0aWMgdm9pZCBoYWwyX3N0YXJ0X2FkYyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOworCXN0cnVjdCBoYWwyX3BidXMgKnBidXMgPSAmYWRjLT5wYnVzOworCisJcGJ1cy0+cGJ1cy0+cGJkbWFfZHB0ciA9IGhhbDJfZGVzY19hZGRyKGFkYywgYWRjLT5oZWFkKTsKKwlwYnVzLT5wYnVzLT5wYmRtYV9jdHJsID0gcGJ1cy0+Y3RybCB8IEhQQzNfUERNQUNUUkxfQUNUOworCS8qIGVuYWJsZSBBREMgKi8KKwloYWwyX2lfc2V0Yml0MTYoaGFsMiwgSDJJX0RNQV9QT1JUX0VOLCBIMklfRE1BX1BPUlRfRU5fQ09ERUNSKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhhbDJfc3RvcF9kYWMoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKK3sKKwloYWwyLT5kYWMucGJ1cy5wYnVzLT5wYmRtYV9jdHJsID0gSFBDM19QRE1BQ1RSTF9MRDsKKwkvKiBUaGUgSEFMMiBpdHNlbGYgbWF5IHJlbWFpbiBlbmFibGVkIHNhZmVseSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGFsMl9zdG9wX2FkYyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCWhhbDItPmFkYy5wYnVzLnBidXMtPnBiZG1hX2N0cmwgPSBIUEMzX1BETUFDVFJMX0xEOworfQorCitzdGF0aWMgaW50IGhhbDJfYWxsb2NfZG1hYnVmKHN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYywgaW50IHNpemUsCisJCQkgICAgIGludCBjb3VudCwgaW50IGNudGluZm8sIGludCBkaXIpCit7CisJc3RydWN0IGhhbDJfZGVzYyAqZGVzYywgKmRtYV9hZGRyOworCWludCBpOworCisJREVCVUcoImFsbG9jYXRpbmcgJWRrIERNQSBidWZmZXIuXG4iLCBzaXplIC8gMTAyNCk7CisKKwljb2RlYy0+YnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBHRlBfRE1BLAorCQkJCQkJCSAgZ2V0X29yZGVyKHNpemUpKTsKKwlpZiAoIWNvZGVjLT5idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCWRlc2MgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgY291bnQgKiBzaXplb2Yoc3RydWN0IGhhbDJfZGVzYyksCisJCQkJICAoZG1hX2FkZHJfdCAqKSZkbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXNjKSB7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpY29kZWMtPmJ1ZmZlciwgZ2V0X29yZGVyKHNpemUpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNvZGVjLT5kZXNjID0gZGVzYzsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlkZXNjLT5kZXNjLnBidWYgPSBkbWFfbWFwX3NpbmdsZShOVUxMLAorCQkJKHZvaWQgKikoY29kZWMtPmJ1ZmZlciArIGkgKiBIMl9CTE9DS19TSVpFKSwKKwkJCUgyX0JMT0NLX1NJWkUsIGRpcik7CisJCWRlc2MtPmRlc2MuY250aW5mbyA9IGNudGluZm87CisJCWRlc2MtPmRlc2MucG5leHQgPSAoaSA9PSBjb3VudCAtIDEpID8KKwkJCQkgICAodTMyKWRtYV9hZGRyIDogKHUzMikoZG1hX2FkZHIgKyBpICsgMSk7CisJCWRlc2MtPmNudCA9IDA7CisJCWRlc2MrKzsKKwl9CisJY29kZWMtPmRlc2NfY291bnQgPSBjb3VudDsKKwljb2RlYy0+aGVhZCA9IGNvZGVjLT50YWlsID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYWwyX2FsbG9jX2RhY19kbWFidWYoc3RydWN0IGhhbDJfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBoYWwyX2FsbG9jX2RtYWJ1Zihjb2RlYywgSDJfREFDX0JVRlNJWkUsCisJCQkJIEgyX0RBQ19CVUZTSVpFIC8gSDJfQkxPQ0tfU0laRSwKKwkJCQkgSFBDRE1BX1hJRSB8IEhQQ0RNQV9FT1gsCisJCQkJIERNQV9UT19ERVZJQ0UpOworfQorCitzdGF0aWMgaW50IGhhbDJfYWxsb2NfYWRjX2RtYWJ1ZihzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIGhhbDJfYWxsb2NfZG1hYnVmKGNvZGVjLCBIMl9BRENfQlVGU0laRSwKKwkJCQkgSDJfQURDX0JVRlNJWkUgLyBIMl9CTE9DS19TSVpFLAorCQkJCSBIUENETUFfWElFIHwgSDJfQkxPQ0tfU0laRSwKKwkJCQkgRE1BX1RPX0RFVklDRSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbDJfZnJlZV9kbWFidWYoc3RydWN0IGhhbDJfY29kZWMgKmNvZGVjLCBpbnQgc2l6ZSwgaW50IGRpcikKK3sKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCWludCBpOworCisJZG1hX2FkZHIgPSBjb2RlYy0+ZGVzY1tjb2RlYy0+ZGVzY19jb3VudCAtIDFdLmRlc2MucG5leHQ7CisJZm9yIChpID0gMDsgaSA8IGNvZGVjLT5kZXNjX2NvdW50OyBpKyspCisJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgY29kZWMtPmRlc2NbaV0uZGVzYy5wYnVmLAorCQkJCSBIMl9CTE9DS19TSVpFLCBkaXIpOworCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIGNvZGVjLT5kZXNjX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBoYWwyX2Rlc2MpLAorCQkJICAodm9pZCAqKWNvZGVjLT5kZXNjLCBkbWFfYWRkcik7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyljb2RlYy0+YnVmZmVyLCBnZXRfb3JkZXIoc2l6ZSkpOworfQorCitzdGF0aWMgdm9pZCBoYWwyX2ZyZWVfZGFjX2RtYWJ1ZihzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIGhhbDJfZnJlZV9kbWFidWYoY29kZWMsIEgyX0RBQ19CVUZTSVpFLCBETUFfVE9fREVWSUNFKTsKK30KKworc3RhdGljIHZvaWQgaGFsMl9mcmVlX2FkY19kbWFidWYoc3RydWN0IGhhbDJfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBoYWwyX2ZyZWVfZG1hYnVmKGNvZGVjLCBIMl9BRENfQlVGU0laRSwgRE1BX0ZST01fREVWSUNFKTsKK30KKworLyogCisgKiBBZGQgJ2NvdW50JyBieXRlcyB0byAnYnVmZmVyJyBmcm9tIERNQSByaW5nIGJ1ZmZlcnMuIFJldHVybiBudW1iZXIgb2YKKyAqIGJ5dGVzIGFkZGVkIG9yIC1FRkFVTFQgaWYgY29weV9mcm9tX3VzZXIgZmFpbGVkLgorICovCitzdGF0aWMgaW50IGhhbDJfZ2V0X2J1ZmZlcihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCBjaGFyICpidWZmZXIsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzaXplLCByZXQgPSAwOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlzdHJ1Y3QgaGFsMl9kZXNjICp0YWlsOworCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOworCisJREVCVUcoImdldHRpbmcgJWQgYnl0ZXMgIiwgY291bnQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYy0+bG9jaywgZmxhZ3MpOworCXRhaWwgPSAmYWRjLT5kZXNjW2FkYy0+dGFpbF07CisJLyogZW5hYmxlIERNQSBzdHJlYW0gaWYgdGhlcmUgYXJlIG5vIGRhdGEgKi8KKwlpZiAoIXRhaWwtPmNudCAmJiAhKGFkYy0+cGJ1cy5wYnVzLT5wYmRtYV9jdHJsICYgSFBDM19QRE1BQ1RSTF9JU0FDVCkpCisJCWhhbDJfc3RhcnRfYWRjKGhhbDIpOworCXdoaWxlICh0YWlsLT5jbnQgPiAwICYmIGNvdW50ID4gMCkgeworCQlzaXplID0gbWluKChpbnQpdGFpbC0+Y250LCBjb3VudCk7CisJCWJ1ZiA9ICZhZGMtPmJ1ZmZlclsoYWRjLT50YWlsICsgMSkgKiBIMl9CTE9DS19TSVpFIC0gdGFpbC0+Y250XTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRjLT5sb2NrLCBmbGFncyk7CisJCWRtYV9zeW5jX3NpbmdsZShOVUxMLCB0YWlsLT5kZXNjLnBidWYsIHNpemUsIERNQV9GUk9NX0RFVklDRSk7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBidWYsIHNpemUpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYy0+bG9jaywgZmxhZ3MpOworCQl0YWlsLT5jbnQgLT0gc2l6ZTsKKwkJLyogYnVmZmVyIGlzIGVtcHR5LCB1cGRhdGUgdGFpbCBwb2ludGVyICovCisJCWlmICh0YWlsLT5jbnQgPT0gMCkgeworCQkJdGFpbC0+ZGVzYy5jbnRpbmZvID0gSFBDRE1BX1hJRSB8IEgyX0JMT0NLX1NJWkU7CisJCQloYWwyX2luY190YWlsKGFkYyk7CisJCQl0YWlsID0gJmFkYy0+ZGVzY1thZGMtPnRhaWxdOworCQkJLyogZW5hYmxlIERNQSBzdHJlYW0gYWdhaW4gaWYgbmVlZGVkICovCisJCQlpZiAoIShhZGMtPnBidXMucGJ1cy0+cGJkbWFfY3RybCAmIEhQQzNfUERNQUNUUkxfSVNBQ1QpKQorCQkJCWhhbDJfc3RhcnRfYWRjKGhhbDIpOworCQl9CisJCWJ1ZmZlciArPSBzaXplOworCQlyZXQgKz0gc2l6ZTsKKwkJY291bnQgLT0gc2l6ZTsKKworCQlERUJVRygiKCVkKSAiLCBzaXplKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRjLT5sb2NrLCBmbGFncyk7CitvdXQ6CisJREVCVUcoIlxuIik7CisKKwlyZXR1cm4gcmV0OworfSAKKworLyogCisgKiBBZGQgJ2NvdW50JyBieXRlcyBmcm9tICdidWZmZXInIHRvIERNQSByaW5nIGJ1ZmZlcnMuIFJldHVybiBudW1iZXIgb2YKKyAqIGJ5dGVzIGFkZGVkIG9yIC1FRkFVTFQgaWYgY29weV9mcm9tX3VzZXIgZmFpbGVkLgorICovCitzdGF0aWMgaW50IGhhbDJfYWRkX2J1ZmZlcihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCBjaGFyICpidWZmZXIsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgc2l6ZSwgcmV0ID0gMDsKKwlzdHJ1Y3QgaGFsMl9kZXNjICpoZWFkOworCXN0cnVjdCBoYWwyX2NvZGVjICpkYWMgPSAmaGFsMi0+ZGFjOworCisJREVCVUcoImFkZGluZyAlZCBieXRlcyAiLCBjb3VudCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGFjLT5sb2NrLCBmbGFncyk7CisJaGVhZCA9ICZkYWMtPmRlc2NbZGFjLT5oZWFkXTsKKwl3aGlsZSAoaGVhZC0+Y250ID09IDAgJiYgY291bnQgPiAwKSB7CisJCXNpemUgPSBtaW4oKGludClIMl9CTE9DS19TSVpFLCBjb3VudCk7CisJCWJ1ZiA9ICZkYWMtPmJ1ZmZlcltkYWMtPmhlYWQgKiBIMl9CTE9DS19TSVpFXTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFjLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgc2l6ZSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlkbWFfc3luY19zaW5nbGUoTlVMTCwgaGVhZC0+ZGVzYy5wYnVmLCBzaXplLCBETUFfVE9fREVWSUNFKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhYy0+bG9jaywgZmxhZ3MpOworCQloZWFkLT5kZXNjLmNudGluZm8gPSBzaXplIHwgSFBDRE1BX1hJRTsKKwkJaGVhZC0+Y250ID0gc2l6ZTsKKwkJYnVmZmVyICs9IHNpemU7CisJCXJldCArPSBzaXplOworCQljb3VudCAtPSBzaXplOworCQloYWwyX2luY19oZWFkKGRhYyk7CisJCWhlYWQgPSAmZGFjLT5kZXNjW2RhYy0+aGVhZF07CisKKwkJREVCVUcoIiglZCkgIiwgc2l6ZSk7CisJfQorCWlmICghKGRhYy0+cGJ1cy5wYnVzLT5wYmRtYV9jdHJsICYgSFBDM19QRE1BQ1RSTF9JU0FDVCkgJiYgcmV0ID4gMCkKKwkJaGFsMl9zdGFydF9kYWMoaGFsMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFjLT5sb2NrLCBmbGFncyk7CitvdXQ6CisJREVCVUcoIlxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIGhhbDJfcmVzZXRfZGFjX3BvaW50ZXIoaGFsMikJaGFsMl9yZXNldF9wb2ludGVyKGhhbDIsIDEpCisjZGVmaW5lIGhhbDJfcmVzZXRfYWRjX3BvaW50ZXIoaGFsMikJaGFsMl9yZXNldF9wb2ludGVyKGhhbDIsIDApCitzdGF0aWMgdm9pZCBoYWwyX3Jlc2V0X3BvaW50ZXIoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgaW50IGlzX2RhYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMgPSAoaXNfZGFjKSA/ICZoYWwyLT5kYWMgOiAmaGFsMi0+YWRjOworCisJREVCVUcoImhhbDJfcmVzZXRfcG9pbnRlclxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmRlc2NfY291bnQ7IGkrKykgeworCQljb2RlYy0+ZGVzY1tpXS5jbnQgPSAwOworCQljb2RlYy0+ZGVzY1tpXS5kZXNjLmNudGluZm8gPSBIUENETUFfWElFIHwgKGlzX2RhYykgPworCQkJCQkgICAgICBIUENETUFfRU9YIDogSDJfQkxPQ0tfU0laRTsKKwl9CisJY29kZWMtPmhlYWQgPSBjb2RlYy0+dGFpbCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgaGFsMl9zeW5jX2RhYyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBoYWwyX2NvZGVjICpkYWMgPSAmaGFsMi0+ZGFjOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2lnbmVkIGxvbmcgdGltZW91dCA9IDEwMDAgKiBIMl9CTE9DS19TSVpFICogMiAqIGRhYy0+dm9pY2VzICoKKwkJCSAgICAgIEhaIC8gZGFjLT5zYW1wbGVfcmF0ZSAvIDkwMDsKKworCXdoaWxlIChkYWMtPnBidXMucGJ1cy0+cGJkbWFfY3RybCAmIEhQQzNfUERNQUNUUkxfSVNBQ1QpIHsKKwkJYWRkX3dhaXRfcXVldWUoJmRhYy0+ZG1hX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhYy0+bG9jaywgZmxhZ3MpOworCQlpZiAoZGFjLT5kZXNjW2RhYy0+dGFpbF0uY250KQorCQkJcmV0ID0gLUVUSU1FOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQlpZiAocmV0KSB7CisJCQloYWwyX3N0b3BfZGFjKGhhbDIpOworCQkJaGFsMl9yZXNldF9kYWNfcG9pbnRlcihoYWwyKTsKKwkJfQorCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZGFjLT5kbWFfd2FpdCwgJndhaXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGFsMl93cml0ZV9taXhlcihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCBpbnQgaW5kZXgsIGludCB2b2wpCit7CisJdW5zaWduZWQgaW50IGwsIHIsIHRtcDsKKworCURFQlVHX01JWCgibWl4ZXIgJWQgd3JpdGVcbiIsIGluZGV4KTsKKworCWlmIChpbmRleCA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgIW1peHRhYmxlW2luZGV4XS5hdmFpbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyID0gKHZvbCA+PiA4KSAmIDB4ZmY7CisJaWYgKHIgPiAxMDApCisJCXIgPSAxMDA7CisJbCA9IHZvbCAmIDB4ZmY7CisJaWYgKGwgPiAxMDApCisJCWwgPSAxMDA7CisKKwloYWwyLT5taXhlci52b2x1bWVbbWl4dGFibGVbaW5kZXhdLmlkeF0gPSBsIHwgKHIgPDwgOCk7CisKKwlzd2l0Y2ggKG1peHRhYmxlW2luZGV4XS5pZHgpIHsKKwljYXNlIEgyX01JWF9PVVRQVVRfQVRUOgorCisJCURFQlVHX01JWCgib3V0cHV0IGF0dGVudWF0b3IgJWQsJWRcbiIsIGwsIHIpOworCisJCWlmIChyIHwgbCkgeworCQkJdG1wID0gaGFsMl9pX2xvb2szMihoYWwyLCBIMklfREFDX0MyKTsKKwkJCXRtcCAmPSB+KEgySV9DMl9MX0FUVF9NIHwgSDJJX0MyX1JfQVRUX00gfCBIMklfQzJfTVVURSk7CisKKwkJCS8qIEF0dGVudWF0b3IgaGFzIGZpdmUgYml0cyAqLworCQkJbCA9IDMxICogKDEwMCAtIGwpIC8gOTk7CisJCQlyID0gMzEgKiAoMTAwIC0gcikgLyA5OTsKKworCQkJREVCVUdfTUlYKCJsZWZ0OiAlZCwgcmlnaHQgJWRcbiIsIGwsIHIpOworCisJCQl0bXAgfD0gKGwgPDwgSDJJX0MyX0xfQVRUX1NISUZUKSAmIEgySV9DMl9MX0FUVF9NOworCQkJdG1wIHw9IChyIDw8IEgySV9DMl9SX0FUVF9TSElGVCkgJiBIMklfQzJfUl9BVFRfTTsKKwkJCWhhbDJfaV93cml0ZTMyKGhhbDIsIEgySV9EQUNfQzIsIHRtcCk7CisJCX0gZWxzZSAKKwkJCWhhbDJfaV9zZXRiaXQzMihoYWwyLCBIMklfREFDX0MyLCBIMklfQzJfTVVURSk7CisJCWJyZWFrOworCWNhc2UgSDJfTUlYX0lOUFVUX0dBSU46CisKKwkJREVCVUdfTUlYKCJpbnB1dCBnYWluICVkLCVkXG4iLCBsLCByKTsKKworCQl0bXAgPSBoYWwyX2lfbG9vazMyKGhhbDIsIEgySV9BRENfQzIpOworCQl0bXAgJj0gfihIMklfQzJfTF9HQUlOX00gfCBIMklfQzJfUl9HQUlOX00pOworCisJCS8qIEdhaW4gY29udHJvbCBoYXMgZm91ciBiaXRzICovCisJCWwgPSAxNiAqIGwgLyAxMDA7CisJCXIgPSAxNiAqIHIgLyAxMDA7CisKKwkJREVCVUdfTUlYKCJsZWZ0OiAlZCwgcmlnaHQgJWRcbiIsIGwsIHIpOworCisJCXRtcCB8PSAobCA8PCBIMklfQzJfTF9HQUlOX1NISUZUKSAmIEgySV9DMl9MX0dBSU5fTTsKKwkJdG1wIHw9IChyIDw8IEgySV9DMl9SX0dBSU5fU0hJRlQpICYgSDJJX0MyX1JfR0FJTl9NOworCQloYWwyX2lfd3JpdGUzMihoYWwyLCBIMklfQURDX0MyLCB0bXApOworCisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoYWwyX2luaXRfbWl4ZXIoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJaWYgKG1peHRhYmxlW2ldLmF2YWlsKQorCQkJaGFsMi0+bWl4ZXIudm9sdW1lW21peHRhYmxlW2ldLmlkeF0gPSAxMDAgfCAoMTAwIDw8IDgpOworCisJLyogZGlzYWJsZSBhdHRlbnVhdG9yICovCisJaGFsMl9pX3dyaXRlMzIoaGFsMiwgSDJJX0RBQ19DMiwgMCk7CisJLyogc2V0IG1heCBpbnB1dCBnYWluICovCisJaGFsMl9pX3dyaXRlMzIoaGFsMiwgSDJJX0FEQ19DMiwgSDJJX0MyX01VVEUgfAorCQkJKEgySV9DMl9MX0dBSU5fTSA8PCBIMklfQzJfTF9HQUlOX1NISUZUKSB8CisJCQkoSDJJX0MyX1JfR0FJTl9NIDw8IEgySV9DMl9SX0dBSU5fU0hJRlQpKTsKKwkvKiBzZXQgbWF4IHZvbHVtZSAqLworCWhhbDItPm1peGVyLm1hc3RlciA9IDB4ZmY7CisJaGFsMi0+dm9sX3JlZ3MtPmxlZnQgPSAweGZmOworCWhhbDItPnZvbF9yZWdzLT5yaWdodCA9IDB4ZmY7Cit9CisKKy8qCisgKiBYWFg6IGxhdGVyIGknbGwgaW1wbGVtZW50IG1peGVyIGZvciBtYWluIHZvbHVtZSB3aGljaCB3aWxsIGJlIGRpc2FibGVkCisgKiBieSBkZWZhdWx0LiBlbmFibGluZyBpdCB1c2VycyB3aWxsIGJlIGFsbG93ZWQgdG8gaGF2ZSBtYXN0ZXIgdm9sdW1lIGxldmVsCisgKiBjb250cm9sIG9uIHBhbmVsIGluIHRoZWlyIGZhdm91cml0ZSBYIGRlc2t0b3AKKyAqLworc3RhdGljIHZvaWQgaGFsMl92b2x1bWVfY29udHJvbChpbnQgZGlyZWN0aW9uKQoreworCXVuc2lnbmVkIGludCBtYXN0ZXIgPSBoYWwyX2NhcmRbMF0tPm1peGVyLm1hc3RlcjsKKwlzdHJ1Y3QgaGFsMl92b2xfcmVncyAqdm9sID0gaGFsMl9jYXJkWzBdLT52b2xfcmVnczsKKworCS8qIHZvbHVtZSB1cCAqLworCWlmIChkaXJlY3Rpb24gPiAwICYmIG1hc3RlciA8IDB4ZmYpCisJCW1hc3RlcisrOworCS8qIHZvbHVtZSBkb3duICovCisJZWxzZSBpZiAoZGlyZWN0aW9uIDwgMCAmJiBtYXN0ZXIgPiAwKQorCQltYXN0ZXItLTsKKwkvKiBUT0RPOiBtdXRlL3VubXV0ZSAqLworCXZvbC0+bGVmdCA9IG1hc3RlcjsKKwl2b2wtPnJpZ2h0ID0gbWFzdGVyOworCWhhbDJfY2FyZFswXS0+bWl4ZXIubWFzdGVyID0gbWFzdGVyOworfQorCitzdGF0aWMgaW50IGhhbDJfbWl4ZXJfaW9jdGwoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgdmFsOworCisgICAgICAgIGlmIChjbWQgPT0gU09VTkRfTUlYRVJfSU5GTykgeworCQltaXhlcl9pbmZvIGluZm87CisKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQlzdHJsY3B5KGluZm8uaWQsIGhhbDJzdHIsIHNpemVvZihpbmZvLmlkKSk7CisJCXN0cmxjcHkoaW5mby5uYW1lLCBoYWwyc3RyLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCWluZm8ubW9kaWZ5X2NvdW50ZXIgPSBoYWwyLT5taXhlci5tb2RjbnQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CisJCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJc3RybGNweShpbmZvLmlkLCBoYWwyc3RyLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgaGFsMnN0ciwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKilhcmcpOworCisJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdNJyB8fCBfSU9DX1NJWkUoY21kKSAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBpZiAoX0lPQ19ESVIoY21kKSA9PSBfSU9DX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCQkvKiBHaXZlIHRoZSBjdXJyZW50IHJlY29yZCBzb3VyY2UgKi8KKwkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQl2YWwgPSAwOwkvKiBGSVhNRSAqLworCQkJYnJlYWs7CisJCS8qIEdpdmUgdGhlIHN1cHBvcnRlZCBtaXhlcnMsIGFsbCBvZiB0aGVtIHN1cHBvcnQgc3RlcmVvICovCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogeworCQkJaW50IGk7CisKKwkJCWZvciAodmFsID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCQlpZiAobWl4dGFibGVbaV0uYXZhaWwpCisJCQkJCXZhbCB8PSAxIDw8IGk7CisJCQlicmVhazsKKwkJCX0KKwkJLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHN1cHBvcnRlZCByZWNvcmRpbmcgc291cmNlICovCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgorCQkJdmFsID0gMDsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCXZhbCA9IDA7CisJCQlicmVhazsKKwkJLyogUmVhZCBhIHNwZWNpZmljIG1peGVyICovCisJCWRlZmF1bHQ6IHsKKwkJCWludCBpID0gX0lPQ19OUihjbWQpOworCisJCQlpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgIW1peHRhYmxlW2ldLmF2YWlsKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJdmFsID0gaGFsMi0+bWl4ZXIudm9sdW1lW21peHRhYmxlW2ldLmlkeF07CisJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKKwl9CisKKyAgICAgICAgaWYgKF9JT0NfRElSKGNtZCkgIT0gKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloYWwyLT5taXhlci5tb2RjbnQrKzsKKworCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHJlY29yZGluZyBzb3VyY2UgKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJcmV0dXJuIDA7CS8qIEZJWE1FICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhhbDJfd3JpdGVfbWl4ZXIoaGFsMiwgX0lPQ19OUihjbWQpLCB2YWwpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbDJfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGhhbDJfY2FyZCAqaGFsMiA9IGhhbDJfbWl4ZXJfZmluZF9jYXJkKGltaW5vcihpbm9kZSkpOworCisJaWYgKGhhbDIpIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaGFsMjsKKwkJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBoYWwyX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbDJfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gaGFsMl9taXhlcl9pb2N0bCgoc3RydWN0IGhhbDJfY2FyZCAqKWZpbGUtPnByaXZhdGVfZGF0YSwgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IGhhbDJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgdmFsOworCXN0cnVjdCBoYWwyX2NhcmQgKmhhbDIgPSAoc3RydWN0IGhhbDJfY2FyZCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gaGFsMl9zeW5jX2RhYyhoYWwyKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX01VTFRJLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWhhbDJfc3RvcF9hZGMoaGFsMik7CisJCQloYWwyX3Jlc2V0X2FkY19wb2ludGVyKGhhbDIpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaGFsMl9zdG9wX2RhYyhoYWwyKTsKKwkJCWhhbDJfcmVzZXRfZGFjX3BvaW50ZXIoaGFsMik7CisJCX0KKwkJcmV0dXJuIDA7CisKKyAJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaGFsMl9zdG9wX2FkYyhoYWwyKTsKKwkJCXZhbCA9IGhhbDJfY29tcHV0ZV9yYXRlKCZoYWwyLT5hZGMsIHZhbCk7CisJCQloYWwyLT5hZGMuc2FtcGxlX3JhdGUgPSB2YWw7CisJCQloYWwyX3NldF9hZGNfcmF0ZShoYWwyKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWhhbDJfc3RvcF9kYWMoaGFsMik7CisJCQl2YWwgPSBoYWwyX2NvbXB1dGVfcmF0ZSgmaGFsMi0+ZGFjLCB2YWwpOworCQkJaGFsMi0+ZGFjLnNhbXBsZV9yYXRlID0gdmFsOworCQkJaGFsMl9zZXRfZGFjX3JhdGUoaGFsMik7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaGFsMl9zdG9wX2FkYyhoYWwyKTsKKwkJCWhhbDItPmFkYy52b2ljZXMgPSAodmFsKSA/IDIgOiAxOworCQkJaGFsMl9zZXR1cF9hZGMoaGFsMik7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQloYWwyX3N0b3BfZGFjKGhhbDIpOworCQkJaGFsMi0+ZGFjLnZvaWNlcyA9ICh2YWwpID8gMiA6IDE7CisJCQloYWwyX3NldHVwX2RhYyhoYWwyKTsKKyAgICAgICAgICAgICAgICB9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJaGFsMl9zdG9wX2FkYyhoYWwyKTsKKwkJCQloYWwyLT5hZGMudm9pY2VzID0gKHZhbCA9PSAxKSA/IDEgOiAyOworCQkJCWhhbDJfc2V0dXBfYWRjKGhhbDIpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJaGFsMl9zdG9wX2RhYyhoYWwyKTsKKwkJCQloYWwyLT5kYWMudm9pY2VzID0gKHZhbCA9PSAxKSA/IDEgOiAyOworCQkJCWhhbDJfc2V0dXBfZGFjKGhhbDIpOworCQkJfQorCQl9CisJCXZhbCA9IC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJdmFsID0gaGFsMi0+YWRjLnZvaWNlczsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJdmFsID0gaGFsMi0+ZGFjLnZvaWNlczsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoSDJfU1VQUE9SVEVEX0ZPUk1BVFMsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlpZiAoISh2YWwgJiBIMl9TVVBQT1JURURfRk9STUFUUykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCWhhbDJfc3RvcF9hZGMoaGFsMik7CisJCQkJaGFsMi0+YWRjLmZvcm1hdCA9IHZhbDsKKwkJCQloYWwyX3NldHVwX2FkYyhoYWwyKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCWhhbDJfc3RvcF9kYWMoaGFsMik7CisJCQkJaGFsMi0+ZGFjLmZvcm1hdCA9IHZhbDsKKwkJCQloYWwyX3NldHVwX2RhYyhoYWwyKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZhbCA9IC1FSU5WQUw7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQl2YWwgPSBoYWwyLT5hZGMuZm9ybWF0OworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCXZhbCA9IGhhbDItPmRhYy5mb3JtYXQ7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOiB7CisJCWF1ZGlvX2J1Zl9pbmZvIGluZm87CisJCWludCBpOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlzdHJ1Y3QgaGFsMl9jb2RlYyAqZGFjID0gJmhhbDItPmRhYzsKKworCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaW5mby5mcmFnbWVudHMgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGFjLT5sb2NrLCBmbGFncyk7CisJCWZvciAoaSA9IDA7IGkgPCBkYWMtPmRlc2NfY291bnQ7IGkrKykKKwkJCWlmIChkYWMtPmRlc2NbaV0uY250ID09IDApCisJCQkJaW5mby5mcmFnbWVudHMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFjLT5sb2NrLCBmbGFncyk7CisJCWluZm8uZnJhZ3N0b3RhbCA9IGRhYy0+ZGVzY19jb3VudDsKKwkJaW5mby5mcmFnc2l6ZSA9IEgyX0JMT0NLX1NJWkU7CisgICAgICAgICAgICAgICAgaW5mby5ieXRlcyA9IGluZm8uZnJhZ3NpemUgKiBpbmZvLmZyYWdtZW50czsKKworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSA/IC1FRkFVTFQgOiAwOworCX0KKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6IHsKKwkJYXVkaW9fYnVmX2luZm8gaW5mbzsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOworCisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWluZm8uZnJhZ21lbnRzID0gMDsKKwkJaW5mby5ieXRlcyA9IDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGMtPmxvY2ssIGZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IGFkYy0+ZGVzY19jb3VudDsgaSsrKQorCQkJaWYgKGFkYy0+ZGVzY1tpXS5jbnQgPiAwKSB7CisJCQkJaW5mby5mcmFnbWVudHMrKzsKKwkJCQlpbmZvLmJ5dGVzICs9IGFkYy0+ZGVzY1tpXS5jbnQ7CisJCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYy0+bG9jaywgZmxhZ3MpOworCQlpbmZvLmZyYWdzdG90YWwgPSBhZGMtPmRlc2NfY291bnQ7CisJCWluZm8uZnJhZ3NpemUgPSBIMl9CTE9DS19TSVpFOworCisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpID8gLUVGQVVMVCA6IDA7CisJfQorCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCXJldHVybiBwdXRfdXNlcihIMl9CTE9DS19TSVpFLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXZhbCA9IC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJdmFsID0gaGFsMi0+YWRjLnNhbXBsZV9yYXRlOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQl2YWwgPSBoYWwyLT5kYWMuc2FtcGxlX3JhdGU7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJdmFsID0gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQl2YWwgPSBoYWwyLT5hZGMudm9pY2VzOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQl2YWwgPSBoYWwyLT5kYWMudm9pY2VzOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0dXJuIHB1dF91c2VyKDE2LCAoaW50ICopYXJnKTsKKwl9CisKKwlyZXR1cm4gaGFsMl9taXhlcl9pb2N0bChoYWwyLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhhbDJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmZmVyLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXNzaXplX3QgZXJyOworCXN0cnVjdCBoYWwyX2NhcmQgKmhhbDIgPSAoc3RydWN0IGhhbDJfY2FyZCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGhhbDJfY29kZWMgKmFkYyA9ICZoYWwyLT5hZGM7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhZGMtPnNlbSkpCisJCXJldHVybiAtRUlOVFI7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCWVyciA9IGhhbDJfZ2V0X2J1ZmZlcihoYWwyLCBidWZmZXIsIGNvdW50KTsKKwkJZXJyID0gZXJyID09IDAgPyAtRUFHQUlOIDogZXJyOworCX0gZWxzZSB7CisJCWRvIHsKKwkJCS8qIH4xMCUgbG9uZ2VyICovCisJCQlzaWduZWQgbG9uZyB0aW1lb3V0ID0gMTAwMCAqIEgyX0JMT0NLX1NJWkUgKgorCQkJCTIgKiBhZGMtPnZvaWNlcyAqIEhaIC8gYWRjLT5zYW1wbGVfcmF0ZSAvIDkwMDsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwkJCXNzaXplX3QgY250ID0gMDsKKworCQkJZXJyID0gaGFsMl9nZXRfYnVmZmVyKGhhbDIsIGJ1ZmZlciwgY291bnQpOworCQkJaWYgKGVyciA+IDApIHsKKwkJCQljb3VudCAtPSBlcnI7CisJCQkJY250ICs9IGVycjsKKwkJCQlidWZmZXIgKz0gZXJyOworCQkJCWVyciA9IGNudDsKKwkJCX0KKwkJCWlmIChjb3VudCA+IDAgJiYgZXJyID49IDApIHsKKwkJCQlhZGRfd2FpdF9xdWV1ZSgmYWRjLT5kbWFfd2FpdCwgJndhaXQpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRjLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKCFhZGMtPmRlc2NbYWRjLT50YWlsXS5jbnQpCisJCQkJCWVyciA9IC1FQUdBSU47CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRjLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCQllcnIgPSAtRVJFU1RBUlRTWVM7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmFkYy0+ZG1hX3dhaXQsICZ3YWl0KTsKKwkJCQlpZiAoZXJyIDwgMCkgeworCQkJCQloYWwyX3N0b3BfYWRjKGhhbDIpOworCQkJCQloYWwyX3Jlc2V0X2FkY19wb2ludGVyKGhhbDIpOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoY291bnQgPiAwICYmIGVyciA+PSAwKTsKKwl9CisJdXAoJmFkYy0+c2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhhbDJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCBlcnI7CisJY2hhciAqYnVmID0gKGNoYXIqKSBidWZmZXI7CisJc3RydWN0IGhhbDJfY2FyZCAqaGFsMiA9IChzdHJ1Y3QgaGFsMl9jYXJkICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaGFsMl9jb2RlYyAqZGFjID0gJmhhbDItPmRhYzsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRhYy0+c2VtKSkKKwkJcmV0dXJuIC1FSU5UUjsKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJZXJyID0gaGFsMl9hZGRfYnVmZmVyKGhhbDIsIGJ1ZiwgY291bnQpOworCQllcnIgPSBlcnIgPT0gMCA/IC1FQUdBSU4gOiBlcnI7CisJfSBlbHNlIHsKKwkJZG8geworCQkJLyogfjEwJSBsb25nZXIgKi8KKwkJCXNpZ25lZCBsb25nIHRpbWVvdXQgPSAxMDAwICogSDJfQkxPQ0tfU0laRSAqCisJCQkJMiAqIGRhYy0+dm9pY2VzICogSFogLyBkYWMtPnNhbXBsZV9yYXRlIC8gOTAwOworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCQkJc3NpemVfdCBjbnQgPSAwOworCisJCQllcnIgPSBoYWwyX2FkZF9idWZmZXIoaGFsMiwgYnVmLCBjb3VudCk7CisJCQlpZiAoZXJyID4gMCkgeworCQkJCWNvdW50IC09IGVycjsKKwkJCQljbnQgKz0gZXJyOworCQkJCWJ1ZiArPSBlcnI7CisJCQkJZXJyID0gY250OworCQkJfQorCQkJaWYgKGNvdW50ID4gMCAmJiBlcnIgPj0gMCkgeworCQkJCWFkZF93YWl0X3F1ZXVlKCZkYWMtPmRtYV93YWl0LCAmd2FpdCk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkYWMtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAoZGFjLT5kZXNjW2RhYy0+aGVhZF0uY250KQorCQkJCQllcnIgPSAtRUFHQUlOOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhYy0+bG9jaywgZmxhZ3MpOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQkJZXJyID0gLUVSRVNUQVJUU1lTOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZkYWMtPmRtYV93YWl0LCAmd2FpdCk7CisJCQkJaWYgKGVyciA8IDApIHsKKwkJCQkJaGFsMl9zdG9wX2RhYyhoYWwyKTsKKwkJCQkJaGFsMl9yZXNldF9kYWNfcG9pbnRlcihoYWwyKTsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKGNvdW50ID4gMCAmJiBlcnIgPj0gMCk7CisJfQorCXVwKCZkYWMtPnNlbSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGhhbDJfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCXN0cnVjdCBoYWwyX2NhcmQgKmhhbDIgPSAoc3RydWN0IGhhbDJfY2FyZCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdHJ1Y3QgaGFsMl9jb2RlYyAqYWRjID0gJmhhbDItPmFkYzsKKworCQlwb2xsX3dhaXQoZmlsZSwgJmFkYy0+ZG1hX3dhaXQsIHdhaXQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRjLT5sb2NrLCBmbGFncyk7CisJCWlmIChhZGMtPmRlc2NbYWRjLT50YWlsXS5jbnQgPiAwKQorCQkJbWFzayB8PSBQT0xMSU47CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYy0+bG9jaywgZmxhZ3MpOworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdHJ1Y3QgaGFsMl9jb2RlYyAqZGFjID0gJmhhbDItPmRhYzsKKworCQlwb2xsX3dhaXQoZmlsZSwgJmRhYy0+ZG1hX3dhaXQsIHdhaXQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGFjLT5sb2NrLCBmbGFncyk7CisJCWlmIChkYWMtPmRlc2NbZGFjLT5oZWFkXS5jbnQgPT0gMCkKKwkJCW1hc2sgfD0gUE9MTE9VVDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFjLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgaGFsMl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBlcnI7CisJc3RydWN0IGhhbDJfY2FyZCAqaGFsMiA9IGhhbDJfZHNwX2ZpbmRfY2FyZChpbWlub3IoaW5vZGUpKTsKKworCWlmICghaGFsMikKKwkJcmV0dXJuIC1FTk9ERVY7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaGFsMjsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdHJ1Y3QgaGFsMl9jb2RlYyAqYWRjID0gJmhhbDItPmFkYzsKKworCQlpZiAoYWRjLT51c2Vjb3VudCkKKwkJCXJldHVybiAtRUJVU1k7CisJCS8qIE9TUyBzcGVjIHdhbnRlZCB1cyB0byB1c2UgOCBiaXQsIDgga0h6IG1vbm8gYnkgZGVmYXVsdCwKKwkJICogYnV0IEhBTDIgY2FuJ3QgZG8gOGJpdCBhdWRpbyAqLworCQlhZGMtPmZvcm1hdCA9IEFGTVRfUzE2X0JFOworCQlhZGMtPnZvaWNlcyA9IDE7CisJCWFkYy0+c2FtcGxlX3JhdGUgPSBoYWwyX2NvbXB1dGVfcmF0ZShhZGMsIDgwMDApOworCQloYWwyX3NldF9hZGNfcmF0ZShoYWwyKTsKKwkJZXJyID0gaGFsMl9hbGxvY19hZGNfZG1hYnVmKGFkYyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQloYWwyX3NldHVwX2FkYyhoYWwyKTsKKwkJYWRjLT51c2Vjb3VudCsrOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RydWN0IGhhbDJfY29kZWMgKmRhYyA9ICZoYWwyLT5kYWM7CisKKwkJaWYgKGRhYy0+dXNlY291bnQpCisJCQlyZXR1cm4gLUVCVVNZOworCQlkYWMtPmZvcm1hdCA9IEFGTVRfUzE2X0JFOworCQlkYWMtPnZvaWNlcyA9IDE7CisJCWRhYy0+c2FtcGxlX3JhdGUgPSBoYWwyX2NvbXB1dGVfcmF0ZShkYWMsIDgwMDApOworCQloYWwyX3NldF9kYWNfcmF0ZShoYWwyKTsKKwkJZXJyID0gaGFsMl9hbGxvY19kYWNfZG1hYnVmKGRhYyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQloYWwyX3NldHVwX2RhYyhoYWwyKTsKKwkJZGFjLT51c2Vjb3VudCsrOworCX0KKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBoYWwyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGhhbDJfY2FyZCAqaGFsMiA9IChzdHJ1Y3QgaGFsMl9jYXJkICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOworCisJCWRvd24oJmFkYy0+c2VtKTsKKwkJaGFsMl9zdG9wX2FkYyhoYWwyKTsKKwkJaGFsMl9mcmVlX2FkY19kbWFidWYoYWRjKTsKKwkJYWRjLT51c2Vjb3VudC0tOworCQl1cCgmYWRjLT5zZW0pOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RydWN0IGhhbDJfY29kZWMgKmRhYyA9ICZoYWwyLT5kYWM7CisKKwkJZG93bigmZGFjLT5zZW0pOworCQloYWwyX3N5bmNfZGFjKGhhbDIpOworCQloYWwyX2ZyZWVfZGFjX2RtYWJ1ZihkYWMpOworCQlkYWMtPnVzZWNvdW50LS07CisJCXVwKCZkYWMtPnNlbSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhhbDJfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gaGFsMl9yZWFkLAorCS53cml0ZQkJPSBoYWwyX3dyaXRlLAorCS5wb2xsCQk9IGhhbDJfcG9sbCwKKwkuaW9jdGwJCT0gaGFsMl9pb2N0bCwKKwkub3BlbgkJPSBoYWwyX29wZW4sCisJLnJlbGVhc2UJPSBoYWwyX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoYWwyX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBoYWwyX2lvY3RsX21peGRldiwKKwkub3BlbgkJPSBoYWwyX29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlCT0gaGFsMl9yZWxlYXNlX21peGRldiwKK307CisKK3N0YXRpYyB2b2lkIGhhbDJfaW5pdF9jb2RlYyhzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMsIHN0cnVjdCBocGMzX3JlZ3MgKmhwYzMsCisJCQkgICAgaW50IGluZGV4KQoreworCWNvZGVjLT5wYnVzLnBidXNuciA9IGluZGV4OworCWNvZGVjLT5wYnVzLnBidXMgPSAmaHBjMy0+cGJkbWFbaW5kZXhdOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvZGVjLT5kbWFfd2FpdCk7CisJaW5pdF9NVVRFWCgmY29kZWMtPnNlbSk7CisJc3Bpbl9sb2NrX2luaXQoJmNvZGVjLT5sb2NrKTsKK30KKworc3RhdGljIGludCBoYWwyX2RldGVjdChzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCXVuc2lnbmVkIHNob3J0IGJvYXJkLCBtYWpvciwgbWlub3I7CisJdW5zaWduZWQgc2hvcnQgcmV2OworCisJLyogcmVzZXQgSEFMMiAqLworCWhhbDJfaXNyX3dyaXRlKGhhbDIsIDApOworCS8qIHJlbGVhc2UgcmVzZXQgKi8KKwloYWwyX2lzcl93cml0ZShoYWwyLCBIMl9JU1JfR0xPQkFMX1JFU0VUX04gfCBIMl9JU1JfQ09ERUNfUkVTRVRfTik7CisKKwloYWwyX2lfd3JpdGUxNihoYWwyLCBIMklfUkVMQVlfQywgSDJJX1JFTEFZX0NfU1RBVEUpOyAKKwlpZiAoKHJldiA9IGhhbDJfcmV2X2xvb2soaGFsMikpICYgSDJfUkVWX0FVRElPX1BSRVNFTlQpCisJCXJldHVybiAtRU5PREVWOworCisJYm9hcmQgPSAocmV2ICYgSDJfUkVWX0JPQVJEX00pID4+IDEyOworCW1ham9yID0gKHJldiAmIEgyX1JFVl9NQUpPUl9DSElQX00pID4+IDQ7CisJbWlub3IgPSAocmV2ICYgSDJfUkVWX01JTk9SX0NISVBfTSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJTR0kgSEFMMiByZXZpc2lvbiAlaS4laS4laVxuIiwKKwkgICAgICAgYm9hcmQsIG1ham9yLCBtaW5vcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYWwyX2luaXRfY2FyZChzdHJ1Y3QgaGFsMl9jYXJkICoqcGhhbDIsIHN0cnVjdCBocGMzX3JlZ3MgKmhwYzMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGhhbDJfY2FyZCAqaGFsMjsKKworCWhhbDIgPSAoc3RydWN0IGhhbDJfY2FyZCAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGFsMl9jYXJkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoYWwyKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoaGFsMiwgMCwgc2l6ZW9mKHN0cnVjdCBoYWwyX2NhcmQpKTsKKworCWhhbDItPmN0bF9yZWdzID0gKHN0cnVjdCBoYWwyX2N0bF9yZWdzICopaHBjMy0+cGJ1c19leHRyZWdzWzBdOworCWhhbDItPmFlc19yZWdzID0gKHN0cnVjdCBoYWwyX2Flc19yZWdzICopaHBjMy0+cGJ1c19leHRyZWdzWzFdOworCWhhbDItPnZvbF9yZWdzID0gKHN0cnVjdCBoYWwyX3ZvbF9yZWdzICopaHBjMy0+cGJ1c19leHRyZWdzWzJdOworCWhhbDItPnN5bl9yZWdzID0gKHN0cnVjdCBoYWwyX3N5bl9yZWdzICopaHBjMy0+cGJ1c19leHRyZWdzWzNdOworCisJaWYgKGhhbDJfZGV0ZWN0KGhhbDIpIDwgMCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfY2FyZDsKKwl9CisKKwloYWwyX2luaXRfY29kZWMoJmhhbDItPmRhYywgaHBjMywgMCk7CisJaGFsMl9pbml0X2NvZGVjKCZoYWwyLT5hZGMsIGhwYzMsIDEpOworCisJLyoKKwkgKiBBbGwgRE1BIGNoYW5uZWwgaW50ZXJmYWNlcyBpbiBIQUwyIGFyZSBkZXNpZ25lZCB0byBvcGVyYXRlIHdpdGgKKwkgKiBQQlVTIHByb2dyYW1tZWQgZm9yIDIgY3ljbGVzIGluIEQzLCAyIGN5Y2xlcyBpbiBENCBhbmQgMiBjeWNsZXMKKwkgKiBpbiBENS4gSEFMMiBpcyBhIDE2LWJpdCBkZXZpY2Ugd2hpY2ggY2FuIGFjY2VwdCBib3RoIGJpZyBhbmQgbGl0dGxlCisJICogZW5kaWFuIGZvcm1hdC4gSXQgYXNzdW1lcyB0aGF0IGV2ZW4gYWRkcmVzcyBieXRlcyBhcmUgb24gaGlnaAorCSAqIHBvcnRpb24gb2YgUEJVUyAoMTU6OCkgYW5kIGFzc3VtZXMgdGhhdCBIUEMzIGlzIHByb2dyYW1tZWQgdG8KKwkgKiBhY2NlcHQgYSBsaXZlICh1bnN5bmNocm9uaXplZCkgdmVyc2lvbiBvZiBQX0RSRVFfTiBmcm9tIEhBTDIuCisJICovCisjZGVmaW5lIEhBTDJfUEJVU19ETUFDRkcgKCgwIDw8IEhQQzNfRE1BQ0ZHX0QzUl9TSElGVCkgfCBcCisJCQkgICgyIDw8IEhQQzNfRE1BQ0ZHX0Q0Ul9TSElGVCkgfCBcCisJCQkgICgyIDw8IEhQQzNfRE1BQ0ZHX0Q1Ul9TSElGVCkgfCBcCisJCQkgICgwIDw8IEhQQzNfRE1BQ0ZHX0QzV19TSElGVCkgfCBcCisJCQkgICgyIDw8IEhQQzNfRE1BQ0ZHX0Q0V19TSElGVCkgfCBcCisJCQkgICgyIDw8IEhQQzNfRE1BQ0ZHX0Q1V19TSElGVCkgfCBcCisJCQkJSFBDM19ETUFDRkdfRFMxNiB8IFwKKwkJCQlIUEMzX0RNQUNGR19FVkVOSEkgfCBcCisJCQkJSFBDM19ETUFDRkdfUlRJTUUgfCBcCisJCQkgICg4IDw8IEhQQzNfRE1BQ0ZHX0JVUlNUX1NISUZUKSB8IFwKKwkJCQlIUEMzX0RNQUNGR19EUlFMSVZFKQorCS8qCisJICogSWdub3JlIHdoYXQncyBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmljYXRpb24gYW5kIHdyaXRlIHZhbHVlIHdoaWNoCisJICogd29ya3MgaW4gVGhlIFJlYWwgV29ybGQgKFRNKQorCSAqLworCWhwYzMtPnBidXNfZG1hY2ZnW2hhbDItPmRhYy5wYnVzLnBidXNucl1bMF0gPSAweDgyMDg4NDQ7CisJaHBjMy0+cGJ1c19kbWFjZmdbaGFsMi0+YWRjLnBidXMucGJ1c25yXVswXSA9IDB4ODIwODg0NDsKKworCWlmIChyZXF1ZXN0X2lycShTR0lfSFBDRE1BX0lSUSwgaGFsMl9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJaGFsMnN0ciwgaGFsMikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIQUwyOiBDYW4ndCBnZXQgaXJxICVkXG4iLCBTR0lfSFBDRE1BX0lSUSk7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gZnJlZV9jYXJkOworCX0KKworCWhhbDItPmRldl9kc3AgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmhhbDJfYXVkaW9fZm9wcywgLTEpOworCWlmIChoYWwyLT5kZXZfZHNwIDwgMCkgeworCQlyZXQgPSBoYWwyLT5kZXZfZHNwOworCQlnb3RvIGZyZWVfaXJxOworCX0KKworCWhhbDItPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZoYWwyX21peGVyX2ZvcHMsIC0xKTsKKwlpZiAoaGFsMi0+ZGV2X21peGVyIDwgMCkgeworCQlyZXQgPSBoYWwyLT5kZXZfbWl4ZXI7CisJCWdvdG8gdW5yZWdpc3Rlcl9kc3A7CisJfQorCisJaGFsMl9pbml0X21peGVyKGhhbDIpOworCisJKnBoYWwyID0gaGFsMjsKKwlyZXR1cm4gMDsKK3VucmVnaXN0ZXJfZHNwOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKGhhbDItPmRldl9kc3ApOworZnJlZV9pcnE6CisJZnJlZV9pcnEoU0dJX0hQQ0RNQV9JUlEsIGhhbDIpOworZnJlZV9jYXJkOgorCWtmcmVlKGhhbDIpOworCisJcmV0dXJuIHJldDsKK30KKworZXh0ZXJuIHZvaWQgKCppbmR5X3ZvbHVtZV9idXR0b24pKGludCk7CisKKy8qIAorICogQXNzdW1pbmcgb25seSBvbmUgSEFMMiBjYXJkLiBNYWlsIG1lIGlmIHlvdSBldmVyIG1lZXQgbWFjaGluZSB3aXRoCisgKiBtb3JlIHRoYW4gb25lLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2hhbDIodm9pZCkKK3sKKwlpbnQgaSwgZXJyb3I7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQ0FSRFM7IGkrKykKKwkJaGFsMl9jYXJkW2ldID0gTlVMTDsKKworCWVycm9yID0gaGFsMl9pbml0X2NhcmQoJmhhbDJfY2FyZFswXSwgaHBjM2MwKTsKKworCS8qIGxldCBJbmR5J3Mgdm9sdW1lIGJ1dHRvbnMgd29yayAqLworCWlmICghZXJyb3IgJiYgIWlwMjJfaXNfZnVsbGhvdXNlKCkpCisJCWluZHlfdm9sdW1lX2J1dHRvbiA9IGhhbDJfdm9sdW1lX2NvbnRyb2w7CisKKwlyZXR1cm4gZXJyb3I7CisKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaGFsMih2b2lkKQoreworCWludCBpOworCisJLyogdW5yZWdpc3RlciB2b2x1bWUgYnV0b25zIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJaW5keV92b2x1bWVfYnV0dG9uID0gTlVMTDsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQ0FSRFM7IGkrKykKKwkJaWYgKGhhbDJfY2FyZFtpXSkgeworCQkJZnJlZV9pcnEoU0dJX0hQQ0RNQV9JUlEsIGhhbDJfY2FyZFtpXSk7CisJCQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChoYWwyX2NhcmRbaV0tPmRldl9kc3ApOworCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihoYWwyX2NhcmRbaV0tPmRldl9taXhlcik7CisJCQlrZnJlZShoYWwyX2NhcmRbaV0pOworCX0KK30KKworbW9kdWxlX2luaXQoaW5pdF9oYWwyKTsKK21vZHVsZV9leGl0KGV4aXRfaGFsMik7CisKK01PRFVMRV9ERVNDUklQVElPTigiT1NTIGNvbXBhdGlibGUgZHJpdmVyIGZvciBTR0kgSEFMMiBhdWRpbyIpOworTU9EVUxFX0FVVEhPUigiTGFkaXNsYXYgTWljaGwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9oYWwyLmggYi9zb3VuZC9vc3MvaGFsMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZDNiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvaGFsMi5oCkBAIC0wLDAgKzEsMjQ4IEBACisjaWZuZGVmIF9fSEFMMl9ICisjZGVmaW5lIF9fSEFMMl9ICisKKy8qCisgKiAgRHJpdmVyIGZvciBIQUwyIHNvdW5kIHByb2Nlc3NvcnMKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgVWxmIENhcmxzc29uIDx1bGZjQGJ1bi5mYWxrZW5iZXJnLnNlPgorICogIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMyBMYWRpc2xhdiBNaWNobCA8bGFkaXNAbGludXgtbWlwcy5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vc2dpL2hwYzMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEluZGlyZWN0IHN0YXR1cyByZWdpc3RlciAqLworCisjZGVmaW5lIEgyX0lTUl9UU1RBVFVTCQkweDAxCS8qIFJPOiB0cmFuc2FjdGlvbiBzdGF0dXMgMT1idXN5ICovCisjZGVmaW5lIEgyX0lTUl9VU1RBVFVTCQkweDAyCS8qIFJPOiB1dGltZSBzdGF0dXMgYml0IDE9YXJtZWQgKi8KKyNkZWZpbmUgSDJfSVNSX1FVQURfTU9ERQkweDA0CS8qIGNvZGVjIG1vZGUgMD1pbmRpZ28gMT1xdWFkICovCisjZGVmaW5lIEgyX0lTUl9HTE9CQUxfUkVTRVRfTgkweDA4CS8qIGNoaXAgZ2xvYmFsIHJlc2V0IDA9cmVzZXQgKi8KKyNkZWZpbmUgSDJfSVNSX0NPREVDX1JFU0VUX04JMHgxMAkvKiBjb2RlYy9zeW50aCByZXNldCAwPXJlc2V0ICAqLworCisvKiBSZXZpc2lvbiByZWdpc3RlciAqLworCisjZGVmaW5lIEgyX1JFVl9BVURJT19QUkVTRU5UCTB4ODAwMAkvKiBSTzogYXVkaW8gcHJlc2VudCAwPXByZXNlbnQgKi8KKyNkZWZpbmUgSDJfUkVWX0JPQVJEX00JCTB4NzAwMAkvKiBSTzogYml0cyAxNDoxMiwgYm9hcmQgcmV2aXNpb24gKi8KKyNkZWZpbmUgSDJfUkVWX01BSk9SX0NISVBfTQkweDAwRjAJLyogUk86IGJpdHMgNzo0LCBtYWpvciBjaGlwIHJldmlzaW9uICovCisjZGVmaW5lIEgyX1JFVl9NSU5PUl9DSElQX00JMHgwMDBGCS8qIFJPOiBiaXRzIDM6MCwgbWlub3IgY2hpcCByZXZpc2lvbiAqLworCisvKiBJbmRpcmVjdCBhZGRyZXNzIHJlZ2lzdGVyICovCisKKy8qCisgKiBBZGRyZXNzIG9mIGluZGlyZWN0IGludGVybmFsIHJlZ2lzdGVyIHRvIGJlIGFjY2Vzc2VkLiBBIHdyaXRlIHRvIHRoaXMKKyAqIHJlZ2lzdGVyIGluaXRpYXRlcyByZWFkIG9yIHdyaXRlIGFjY2VzcyB0byB0aGUgaW5kaXJlY3QgcmVnaXN0ZXJzIGluIHRoZQorICogSEFMMi4gTm90ZSB0aGF0IHRoZXJlIGFmIGZvdXIgaW5kaXJlY3QgZGF0YSByZWdpc3RlcnMgZm9yIHdyaXRlIGFjY2VzcyB0bworICogcmVnaXN0ZXJzIGxhcmdlciB0aGFuIDE2IGJ5dGUuCisgKi8KKworI2RlZmluZSBIMl9JQVJfVFlQRV9NCQkweEYwMDAJLyogYml0cyAxNToxMiwgdHlwZSBvZiBmdW5jdGlvbmFsICovCisJCQkJCS8qIGJsb2NrIHRoZSByZWdpc3RlciByZXNpZGVzIGluICovCisJCQkJCS8qIDE9RE1BIFBvcnQgKi8KKwkJCQkJLyogOT1HbG9iYWwgRE1BIENvbnRyb2wgKi8KKwkJCQkJLyogMj1CcmVzZW5oYW0gKi8KKwkJCQkJLyogMz1Vbml4IFRpbWVyICovCisjZGVmaW5lIEgyX0lBUl9OVU1fTQkJMHgwRjAwCS8qIGJpdHMgMTE6OCBpbnN0YW5jZSBvZiB0aGUgKi8KKwkJCQkJLyogYmxvY2tpbiB3aGljaCB0aGUgaW5kaXJlY3QgKi8KKwkJCQkJLyogcmVnaXN0ZXIgcmVzaWRlcyAqLworCQkJCQkvKiBJZiBJQVJfVFlQRV9NPURNQSBQb3J0OiAqLworCQkJCQkvKiAxPVN5bnRoIEluICovCisJCQkJCS8qIDI9QUVTIEluICovCisJCQkJCS8qIDM9QUVTIE91dCAqLworCQkJCQkvKiA0PURBQyBPdXQgKi8KKwkJCQkJLyogNT1BREMgT3V0ICovCisJCQkJCS8qIDY9U3ludGggQ29udHJvbCAqLworCQkJCQkvKiBJZiBJQVJfVFlQRV9NPUdsb2JhbCBETUEgQ29udHJvbDogKi8KKwkJCQkJLyogMT1Db250cm9sICovCisJCQkJCS8qIElmIElBUl9UWVBFX009QnJlc2VuaGFtOiAqLworCQkJCQkvKiAxPUJyZXNlbmhhbSBDbG9jayBHZW4gMSAqLworCQkJCQkvKiAyPUJyZXNlbmhhbSBDbG9jayBHZW4gMiAqLworCQkJCQkvKiAzPUJyZXNlbmhhbSBDbG9jayBHZW4gMyAqLworCQkJCQkvKiBJZiBJQVJfVFlQRV9NPVVuaXggVGltZXI6ICovCisJCQkJCS8qIDE9VW5peCBUaW1lciAqLworI2RlZmluZSBIMl9JQVJfQUNDRVNTX1NFTEVDVAkweDAwODAJLyogMT1yZWFkIDA9d3JpdGUgKi8KKyNkZWZpbmUgSDJfSUFSX1BBUkFNCQkweDAwMEMJLyogUGFyYW1ldGVyIFNlbGVjdCAqLworI2RlZmluZSBIMl9JQVJfUkJfSU5ERVhfTQkweDAwMDMJLyogUmVhZCBCYWNrIEluZGV4ICovCisJCQkJCS8qIDAwOndvcmQwICovCisJCQkJCS8qIDAxOndvcmQxICovCisJCQkJCS8qIDEwOndvcmQyICovCisJCQkJCS8qIDExOndvcmQzICovCisvKgorICogSEFMMiBpbnRlcm5hbCBhZGRyZXNzaW5nCisgKgorICogVGhlIEhBTDIgaGFzICJpbmRpcmVjdCByZWdpc3RlcnMiIChpZHIpIHdoaWNoIGFyZSBhY2Nlc3NlZCBieSB3cml0aW5nIHRvIHRoZQorICogSW5kaXJlY3QgRGF0YSByZWdpc3RlcnMuIFdyaXRlIHRoZSBhZGRyZXNzIHRvIHRoZSBJbmRpcmVjdCBBZGRyZXNzIHJlZ2lzdGVyCisgKiB0byB0cmFuc2ZlciB0aGUgZGF0YS4KKyAqCisgKiBXZSBkZWZpbmUgdGhlIEgySVJfKiB0byB0aGUgcmVhZCBhZGRyZXNzIGFuZCBIMklXXyogdG8gdGhlIHdyaXRlIGFkZHJlc3MgYW5kCisgKiBIMklfKiB0byBiZSBmaWVsZHMgaW4gd2hhdGV2ZXIgcmVnaXN0ZXIgaXMgcmVmZXJyZWQgdG8uCisgKgorICogV2hlbiB3ZSB3cml0ZSB0byBpbmRpcmVjdCByZWdpc3RlcnMgd2hpY2ggYXJlIGxhcmdlciB0aGFuIG9uZSB3b3JkICgxNiBiaXQpCisgKiB3ZSBoYXZlIHRvIGZpbGwgbW9yZSB0aGFuIG9uZSBpbmRpcmVjdCByZWdpc3RlciBiZWZvcmUgd3JpdGluZy4gV2hlbiB3ZSByZWFkCisgKiBiYWNrIGhvd2V2ZXIgd2UgaGF2ZSB0byByZWFkIHNldmVyYWwgdGltZXMsIGVhY2ggdGltZSB3aXRoIGRpZmZlcmVudCBSZWFkCisgKiBCYWNrIEluZGV4ZXMgKHRoZXJlIGFyZSBkZWZzIGZvciBkb2luZyB0aGlzIGVhc2lseSkuCisgKi8KKworLyoKKyAqIFJlbGF5IENvbnRyb2wKKyAqLworI2RlZmluZSBIMklfUkVMQVlfQwkJMHg5MTAwCisjZGVmaW5lIEgySV9SRUxBWV9DX1NUQVRFCTB4MDEJCS8qIHN0YXRlIG9mIFJFTEFZIHBpbiBzaWduYWwgKi8KKworLyogRE1BIHBvcnQgZW5hYmxlICovCisKKyNkZWZpbmUgSDJJX0RNQV9QT1JUX0VOCQkweDkxMDQKKyNkZWZpbmUgSDJJX0RNQV9QT1JUX0VOX1NZX0lOCTB4MDEJCS8qIFN5bnRoX2luIERNQSBwb3J0ICovCisjZGVmaW5lIEgySV9ETUFfUE9SVF9FTl9BRVNSWAkweDAyCQkvKiBBRVMgcmVjZWl2ZXIgRE1BIHBvcnQgKi8KKyNkZWZpbmUgSDJJX0RNQV9QT1JUX0VOX0FFU1RYCTB4MDQJCS8qIEFFUyB0cmFuc21pdHRlciBETUEgcG9ydCAqLworI2RlZmluZSBIMklfRE1BX1BPUlRfRU5fQ09ERUNUWAkweDA4CQkvKiBDT0RFQyB0cmFuc21pdCBETUEgcG9ydCAqLworI2RlZmluZSBIMklfRE1BX1BPUlRfRU5fQ09ERUNSCTB4MTAJCS8qIENPREVDIHJlY2VpdmUgRE1BIHBvcnQgKi8KKworI2RlZmluZSBIMklfRE1BX0VORAkJMHg5MTA4IAkJLyogZ2xvYmFsIGRtYSBlbmRpYW4gc2VsZWN0ICovCisjZGVmaW5lIEgySV9ETUFfRU5EX1NZX0lOCTB4MDEJCS8qIFN5bnRoX2luIERNQSBwb3J0ICovCisjZGVmaW5lIEgySV9ETUFfRU5EX0FFU1JYCTB4MDIJCS8qIEFFUyByZWNlaXZlciBETUEgcG9ydCAqLworI2RlZmluZSBIMklfRE1BX0VORF9BRVNUWAkweDA0CQkvKiBBRVMgdHJhbnNtaXR0ZXIgRE1BIHBvcnQgKi8KKyNkZWZpbmUgSDJJX0RNQV9FTkRfQ09ERUNUWAkweDA4CQkvKiBDT0RFQyB0cmFuc21pdCBETUEgcG9ydCAqLworI2RlZmluZSBIMklfRE1BX0VORF9DT0RFQ1IJMHgxMAkJLyogQ09ERUMgcmVjZWl2ZSBETUEgcG9ydCAqLworCQkJCQkJLyogMD1iX2VuZCAxPWxfZW5kICovCisKKyNkZWZpbmUgSDJJX0RNQV9EUlYJCTB4OTEwQyAgCS8qIGdsb2JhbCBQQlVTIERNQSBlbmFibGUgKi8KKworI2RlZmluZSBIMklfU1lOVEhfQwkJMHgxMTA0CQkvKiBTeW50aCBETUEgY29udHJvbCAqLworCisjZGVmaW5lIEgySV9BRVNSWF9DCQkweDEyMDQJIAkvKiBBRVMgUlggZG1hIGNvbnRyb2wgKi8KKworI2RlZmluZSBIMklfQ19UU19FTgkJMHgyMAkJLyogVGltZXN0YW1wIGVuYWJsZSAqLworI2RlZmluZSBIMklfQ19UU19GUk1UCQkweDQwCQkvKiBUaW1lc3RhbXAgZm9ybWF0ICovCisjZGVmaW5lIEgySV9DX05BVURJTwkJMHg4MAkJLyogU2lnbiBleHRlbmQgKi8KKworLyogQUVTUlggQ1RMLCAxNiBiaXQgKi8KKworI2RlZmluZSBIMklfQUVTVFhfQwkJMHgxMzA0CQkvKiBBRVMgVFggRE1BIGNvbnRyb2wgKi8KKyNkZWZpbmUgSDJJX0FFU1RYX0NfQ0xLSURfU0hJRlQJMwkJLyogQnJlc2VuaGFtIENsb2NrIEdlbiAxLTMgKi8KKyNkZWZpbmUgSDJJX0FFU1RYX0NfQ0xLSURfTQkweDE4CisjZGVmaW5lIEgySV9BRVNUWF9DX0RBVEFUX1NISUZUCTgJCS8qIDE9bW9ubyAyPXN0ZXJlbyAoMz1xdWFkKSAqLworI2RlZmluZSBIMklfQUVTVFhfQ19EQVRBVF9NCTB4MzAwCisKKy8qIENPREVDIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIEgySV9EQUNfQzEJCTB4MTQwNCAJCS8qIERBQyBETUEgY29udHJvbCwgMTYgYml0ICovCisjZGVmaW5lIEgySV9EQUNfQzIJCTB4MTQwOAkJLyogREFDIERNQSBjb250cm9sLCAzMiBiaXQgKi8KKyNkZWZpbmUgSDJJX0FEQ19DMQkJMHgxNTA0IAkJLyogQURDIERNQSBjb250cm9sLCAxNiBiaXQgKi8KKyNkZWZpbmUgSDJJX0FEQ19DMgkJMHgxNTA4CQkvKiBBREMgRE1BIGNvbnRyb2wsIDMyIGJpdCAqLworCisvKiBCaXRzIGluIENUTDEgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBIMklfQzFfRE1BX1NISUZUCTAJCS8qIERNQSBjaGFubmVsICovCisjZGVmaW5lIEgySV9DMV9ETUFfTQkJMHg3CisjZGVmaW5lIEgySV9DMV9DTEtJRF9TSElGVAkzCQkvKiBCcmVzZW5oYW0gQ2xvY2sgR2VuIDEtMyAqLworI2RlZmluZSBIMklfQzFfQ0xLSURfTQkJMHgxOAorI2RlZmluZSBIMklfQzFfREFUQVRfU0hJRlQJOAkJLyogMT1tb25vIDI9c3RlcmVvICgzPXF1YWQpICovCisjZGVmaW5lIEgySV9DMV9EQVRBVF9NCQkweDMwMAorCisvKiBCaXRzIGluIENUTDIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBIMklfQzJfUl9HQUlOX1NISUZUCTAJCS8qIHJpZ2h0IGEvZCBpbnB1dCBnYWluICovCQorI2RlZmluZSBIMklfQzJfUl9HQUlOX00JCTB4ZgkKKyNkZWZpbmUgSDJJX0MyX0xfR0FJTl9TSElGVAk0CQkvKiBsZWZ0IGEvZCBpbnB1dCBnYWluICovCisjZGVmaW5lIEgySV9DMl9MX0dBSU5fTQkJMHhmMAorI2RlZmluZSBIMklfQzJfUl9TRUwJCTB4MTAwCQkvKiByaWdodCBpbnB1dCBzZWxlY3QgKi8KKyNkZWZpbmUgSDJJX0MyX0xfU0VMCQkweDIwMAkJLyogbGVmdCBpbnB1dCBzZWxlY3QgKi8KKyNkZWZpbmUgSDJJX0MyX01VVEUJCTB4NDAwCQkvKiBtdXRlICovCisjZGVmaW5lIEgySV9DMl9ETzEJCTB4MDAwMTAwMDAJLyogZGlnaXRhbCBvdXRwdXQgcG9ydCBiaXQgMCAqLworI2RlZmluZSBIMklfQzJfRE8yCQkweDAwMDIwMDAwCS8qIGRpZ2l0YWwgb3V0cHV0IHBvcnQgYml0IDEgKi8KKyNkZWZpbmUgSDJJX0MyX1JfQVRUX1NISUZUCTE4CQkvKiByaWdodCBkL2Egb3V0cHV0IC0gKi8KKyNkZWZpbmUgSDJJX0MyX1JfQVRUX00JCTB4MDA3YzAwMDAJLyogYXR0ZW51YXRpb24gKi8KKyNkZWZpbmUgSDJJX0MyX0xfQVRUX1NISUZUCTIzCQkvKiBsZWZ0IGQvYSBvdXRwdXQgLSAqLworI2RlZmluZSBIMklfQzJfTF9BVFRfTQkJMHgwZjgwMDAwMAkvKiBhdHRlbnVhdGlvbiAqLworCisjZGVmaW5lIEgySV9TWU5USF9NQVBfQwkJMHgxMTA0CQkvKiBzeW50aCBkbWEgaGFuZHNoYWtlIGN0cmwgKi8KKworLyogQ2xvY2sgZ2VuZXJhdG9yIENUTCAxLCAxNiBiaXQgKi8KKworI2RlZmluZSBIMklfQlJFUzFfQzEJCTB4MjEwNAorI2RlZmluZSBIMklfQlJFUzJfQzEJCTB4MjIwNAorI2RlZmluZSBIMklfQlJFUzNfQzEJCTB4MjMwNAorCisjZGVmaW5lIEgySV9CUkVTX0MxX1NISUZUCTAJCS8qIDA9NDguMCAxPTQ0LjEgMj1hZXNfcnggKi8KKyNkZWZpbmUgSDJJX0JSRVNfQzFfTQkJMHgwMworCQkJCQorLyogQ2xvY2sgZ2VuZXJhdG9yIENUTCAyLCAzMiBiaXQgKi8KKworI2RlZmluZSBIMklfQlJFUzFfQzIJCTB4MjEwOAorI2RlZmluZSBIMklfQlJFUzJfQzIJCTB4MjIwOAorI2RlZmluZSBIMklfQlJFUzNfQzIJCTB4MjMwOAorCisjZGVmaW5lIEgySV9CUkVTX0MyX0lOQ19TSElGVAkwCQkvKiBpbmNyZW1lbnQgdmFsdWUgKi8KKyNkZWZpbmUgSDJJX0JSRVNfQzJfSU5DX00JMHhmZmZmCisjZGVmaW5lIEgySV9CUkVTX0MyX01PRF9TSElGVAkxNgkJLyogbW9kY29udHJvbCB2YWx1ZSAqLworI2RlZmluZSBIMklfQlJFU19DMl9NT0RfTQkweGZmZmYwMDAwCS8qIG1vZGN0cmw9MHhmZmZmJihtb2RpbmMtMSkgKi8KKworLyogVW5peCB0aW1lciwgNjQgYml0ICovCisKKyNkZWZpbmUgSDJJX1VUSU1FCQkweDMxMDQKKyNkZWZpbmUgSDJJX1VUSU1FXzBfTEQJCTB4ZmZmZgkJLyogbWljcm9zZWNvbmRzLCBMU0IncyAqLworI2RlZmluZSBIMklfVVRJTUVfMV9MRDAJCTB4MGYJCS8qIG1pY3Jvc2Vjb25kcywgTVNCJ3MgKi8KKyNkZWZpbmUgSDJJX1VUSU1FXzFfTEQxCQkweGYwCQkvKiB0ZW50aHMgb2YgbWljcm9zZWNvbmRzICovCisjZGVmaW5lIEgySV9VVElNRV8yX0xECQkweGZmZmYJCS8qIHNlY29uZHMsIExTQidzICovCisjZGVmaW5lIEgySV9VVElNRV8zX0xECQkweGZmZmYJCS8qIHNlY29uZHMsIE1TQidzICovCisKK3N0cnVjdCBoYWwyX2N0bF9yZWdzIHsKKwl1MzIgX3VudXNlZDBbNF07CisJdm9sYXRpbGUgdTMyIGlzcjsJCS8qIDB4MTAgU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyIF91bnVzZWQxWzNdOworCXZvbGF0aWxlIHUzMiByZXY7CQkvKiAweDIwIFJldmlzaW9uIFJlZ2lzdGVyICovCisJdTMyIF91bnVzZWQyWzNdOworCXZvbGF0aWxlIHUzMiBpYXI7CQkvKiAweDMwIEluZGlyZWN0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1MzIgX3VudXNlZDNbM107CisJdm9sYXRpbGUgdTMyIGlkcjA7CQkvKiAweDQwIEluZGlyZWN0IERhdGEgUmVnaXN0ZXIgMCAqLworCXUzMiBfdW51c2VkNFszXTsKKwl2b2xhdGlsZSB1MzIgaWRyMTsJCS8qIDB4NTAgSW5kaXJlY3QgRGF0YSBSZWdpc3RlciAxICovCisJdTMyIF91bnVzZWQ1WzNdOworCXZvbGF0aWxlIHUzMiBpZHIyOwkJLyogMHg2MCBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyIDIgKi8KKwl1MzIgX3VudXNlZDZbM107CisJdm9sYXRpbGUgdTMyIGlkcjM7CQkvKiAweDcwIEluZGlyZWN0IERhdGEgUmVnaXN0ZXIgMyAqLworfTsKKworc3RydWN0IGhhbDJfYWVzX3JlZ3MgeworCXZvbGF0aWxlIHUzMiByeF9zdGF0WzJdOwkvKiBTdGF0dXMgcmVnaXN0ZXJzICovCisJdm9sYXRpbGUgdTMyIHJ4X2NyWzJdOwkJLyogQ29udHJvbCByZWdpc3RlcnMgKi8KKwl2b2xhdGlsZSB1MzIgcnhfdWRbNF07CQkvKiBVc2VyIGRhdGEgd2luZG93ICovCisJdm9sYXRpbGUgdTMyIHJ4X3N0WzI0XTsJCS8qIENoYW5uZWwgc3RhdHVzIGRhdGEgKi8KKwkKKwl2b2xhdGlsZSB1MzIgdHhfc3RhdFsxXTsJLyogU3RhdHVzIHJlZ2lzdGVyICovCisJdm9sYXRpbGUgdTMyIHR4X2NyWzNdOwkJLyogQ29udHJvbCByZWdpc3RlcnMgKi8KKwl2b2xhdGlsZSB1MzIgdHhfdWRbNF07CQkvKiBVc2VyIGRhdGEgd2luZG93ICovCisJdm9sYXRpbGUgdTMyIHR4X3N0WzI0XTsJCS8qIENoYW5uZWwgc3RhdHVzIGRhdGEgKi8KK307CisKK3N0cnVjdCBoYWwyX3ZvbF9yZWdzIHsKKwl2b2xhdGlsZSB1MzIgcmlnaHQ7CQkvKiBSaWdodCB2b2x1bWUgKi8KKwl2b2xhdGlsZSB1MzIgbGVmdDsJCS8qIExlZnQgdm9sdW1lICovCit9OworCitzdHJ1Y3QgaGFsMl9zeW5fcmVncyB7CisJdTMyIF91bnVzZWQwWzJdOworCXZvbGF0aWxlIHUzMiBwYWdlOwkJLyogRE9DIFBhZ2UgcmVnaXN0ZXIgKi8KKwl2b2xhdGlsZSB1MzIgcmVnc2VsOwkJLyogRE9DIFJlZ2lzdGVyIHNlbGVjdGlvbiAqLworCXZvbGF0aWxlIHUzMiBkbG93OwkJLyogRE9DIERhdGEgbG93ICovCisJdm9sYXRpbGUgdTMyIGRoaWdoOwkJLyogRE9DIERhdGEgaGlnaCAqLworCXZvbGF0aWxlIHUzMiBpcnE7CQkvKiBJUlEgU3RhdHVzICovCisJdm9sYXRpbGUgdTMyIGRyYW07CQkvKiBEUkFNIEFjY2VzcyAqLworfTsKKworI2VuZGlmCS8qIF9fSEFMMl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvaGFybW9ueS5jIGIvc291bmQvb3NzL2hhcm1vbnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWU5ZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2hhcm1vbnkuYwpAQCAtMCwwICsxLDEzMzAgQEAKKy8qCisgCWRyaXZlcnMvc291bmQvaGFybW9ueS5jIAorCisJVGhpcyBpcyBhIHNvdW5kIGRyaXZlciBmb3IgQVNQJ3MgYW5kIExhc2kncyBIYXJtb255IHNvdW5kIGNoaXAKKwlhbmQgaXMgdW5saWtlbHkgdG8gYmUgdXNlZCBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBvbiBhIEhQIFBBLVJJU0MuCisKKwlIYXJtb255IGlzIGZvdW5kIGluIEhQIDcxMnMsIDcxNS9uZXcgYW5kIG1hbnkgb3RoZXIgR1NDIGJhc2VkIG1hY2hpbmVzLgorCU9uIG9sZGVyIDcxNSBtYWNoaW5lcyB5b3UnbGwgZmluZCB0aGUgdGVjaG5pY2FsbHkgaWRlbnRpY2FsIGNoaXAgCisJY2FsbGVkICdWaXZhY2UnLiBCb3RoIEhhcm1vbnkgYW5kIFZpY2FjZSBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLgorCisJQ29weXJpZ2h0IDIwMDAgKGMpIExpbnV4Y2FyZSBDYW5hZGEsIEFsZXggZGVWcmllcyA8YWxleEBvbmVmaXNodHdvLmNhPgorCUNvcHlyaWdodCAyMDAwLTIwMDMgKGMpIEhlbGdlIERlbGxlciA8ZGVsbGVyQGdteC5kZT4KKwlDb3B5cmlnaHQgMjAwMSAoYykgTWF0dGhpZXUgRGVsYWhheWUgPGRlbGFoYXltQGVzaWVlLmZyPgorCUNvcHlyaWdodCAyMDAxIChjKSBKZWFuLUNocmlzdG9waGUgVmF1Z2VvaXMgPHZhdWdlb2lqQGVzaWVlLmZyPgorCUNvcHlyaWdodCAyMDA0IChjKSBTdHVhcnQgQnJhZHkgPHNkYnJhZHlAbnRsd29ybGQuY29tPgorCisJCQkJCitUT0RPOgorCS0gZml4IFNORENUTF9EU1BfR0VUT1NQQUNFIGFuZCBTTkRDVExfRFNQX0dFVElTUEFDRSBpb2N0bHMgdG8KKwkJcmV0dXJuIHRoZSByZWFsIHZhbHVlcworCS0gYWRkIHByaXZhdGUgaW9jdGwgZm9yIHNlbGVjdGluZyBsaW5lLSBvciBtaWNyb3Bob25lIGlucHV0CisJCShvbmx5IG9uZSBvZiB0aGVtIGlzIGF2YWlsYWJsZSBhdCB0aGUgc2FtZSB0aW1lKQorCS0gYWRkIG1vZHVsZSBwYXJhbWV0ZXJzCisJLSBpbXBsZW1lbnQgbW1hcCBmdW5jdGlvbmFsaXR5CisJLSBpbXBsZW1lbnQgZ2FpbiBtZXRlciA/CisJLSAuLi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9wYXJpc2MtZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworCisjZGVmaW5lIFBGWCAiaGFybW9ueTogIgorI2RlZmluZSBIQVJNT05ZX1ZFUlNJT04gIlYwLjlhIgorCisjdW5kZWYgREVCVUcKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgRFBSSU5USyBwcmludGsgCisjZWxzZQorIyBkZWZpbmUgRFBSSU5USyh4LC4uLikKKyNlbmRpZgorCisKKyNkZWZpbmUgTUFYX0JVRlMgMTAJCS8qIG1heGltdW0gbnVtYmVyIG9mIHJvdGF0aW5nIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgSEFSTU9OWV9CVUZfU0laRSA0MDk2CS8qIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgUEFHRV9TSVpFICg0MDk2KSEgKi8KKworI2RlZmluZSBDTlRMX0MJCTB4ODAwMDAwMDAKKyNkZWZpbmUJQ05UTF9TVAkJMHgwMDAwMDAyMAorI2RlZmluZSBDTlRMXzQ0MTAwCTB4MDAwMDAwMTUJLyogSEFSTU9OWV9TUl80NEtIWiAqLworI2RlZmluZSBDTlRMXzgwMDAJMHgwMDAwMDAwOAkvKiBIQVJNT05ZX1NSXzhLSFogKi8KKworI2RlZmluZSBHQUlOQ1RMX0hFCTB4MDgwMDAwMDAKKyNkZWZpbmUgR0FJTkNUTF9MRQkweDA0MDAwMDAwCisjZGVmaW5lIEdBSU5DVExfU0UJMHgwMjAwMDAwMAorCisjZGVmaW5lIERTVEFUVVNfUE4JMHgwMDAwMDIwMAorI2RlZmluZSBEU1RBVFVTX1JOCTB4MDAwMDAwMDIKKworI2RlZmluZSBEU1RBVFVTX0lFCTB4ODAwMDAwMDAKKworI2RlZmluZSBIQVJNT05ZX0RGXzE2QklUX0xJTkVBUgkwCisjZGVmaW5lIEhBUk1PTllfREZfOEJJVF9VTEFXCTEKKyNkZWZpbmUgSEFSTU9OWV9ERl84QklUX0FMQVcJMgorCisjZGVmaW5lIEhBUk1PTllfU1NfTU9OTwkJMAorI2RlZmluZSBIQVJNT05ZX1NTX1NURVJFTwkxCisKKyNkZWZpbmUgSEFSTU9OWV9TUl84S0haCQkweDA4CisjZGVmaW5lIEhBUk1PTllfU1JfMTZLSFoJMHgwOQorI2RlZmluZSBIQVJNT05ZX1NSXzI3S0haCTB4MEEKKyNkZWZpbmUgSEFSTU9OWV9TUl8zMktIWgkweDBCCisjZGVmaW5lIEhBUk1PTllfU1JfNDhLSFoJMHgwRQorI2RlZmluZSBIQVJNT05ZX1NSXzlLSFoJCTB4MEYKKyNkZWZpbmUgSEFSTU9OWV9TUl81S0haCQkweDEwCisjZGVmaW5lIEhBUk1PTllfU1JfMTFLSFoJMHgxMQorI2RlZmluZSBIQVJNT05ZX1NSXzE4S0haCTB4MTIKKyNkZWZpbmUgSEFSTU9OWV9TUl8yMktIWgkweDEzCisjZGVmaW5lIEhBUk1PTllfU1JfMzdLSFoJMHgxNAorI2RlZmluZSBIQVJNT05ZX1NSXzQ0S0haCTB4MTUKKyNkZWZpbmUgSEFSTU9OWV9TUl8zM0tIWgkweDE2CisjZGVmaW5lIEhBUk1PTllfU1JfNktIWgkJMHgxNworCisvKgorICogU29tZSBtYWdpY3MgbnVtYmVycyB1c2VkIHRvIGF1dG8tZGV0ZWN0IGZpbGUgZm9ybWF0cworICovCisKKyNkZWZpbmUgSEFSTU9OWV9NQUdJQ184Ql9VTEFXCTEKKyNkZWZpbmUgSEFSTU9OWV9NQUdJQ184Ql9BTEFXCTI3CisjZGVmaW5lIEhBUk1PTllfTUFHSUNfMTZCX0xJTkVBUiAzCisjZGVmaW5lIEhBUk1PTllfTUFHSUNfTU9OTwkxCisjZGVmaW5lIEhBUk1PTllfTUFHSUNfU1RFUkVPCTIKKworLyoKKyAqIENoYW5uZWxzIFBvc2l0aW9ucyBpbiBtaXhlciByZWdpc3RlcgorICovCisKKyNkZWZpbmUgR0FJTl9IRV9TSElGVCAgIDI3CisjZGVmaW5lIEdBSU5fSEVfTUFTSyAgICAoIDEgPDwgR0FJTl9IRV9TSElGVCkgCisjZGVmaW5lIEdBSU5fTEVfU0hJRlQgICAyNgorI2RlZmluZSBHQUlOX0xFX01BU0sgICAgKCAxIDw8IEdBSU5fTEVfU0hJRlQpIAorI2RlZmluZSBHQUlOX1NFX1NISUZUICAgMjUKKyNkZWZpbmUgR0FJTl9TRV9NQVNLICAgICggMSA8PCBHQUlOX1NFX1NISUZUKSAKKyNkZWZpbmUgR0FJTl9JU19TSElGVCAgIDI0CisjZGVmaW5lIEdBSU5fSVNfTUFTSyAgICAoIDEgPDwgR0FJTl9JU19TSElGVCkgCisjZGVmaW5lIEdBSU5fTUFfU0hJRlQgICAyMAorI2RlZmluZSBHQUlOX01BX01BU0sgICAgKCAweDBmIDw8IEdBSU5fTUFfU0hJRlQpIAorI2RlZmluZSBHQUlOX0xJX1NISUZUICAgMTYKKyNkZWZpbmUgR0FJTl9MSV9NQVNLICAgICggMHgwZiA8PCBHQUlOX0xJX1NISUZUKSAKKyNkZWZpbmUgR0FJTl9SSV9TSElGVCAgIDEyCisjZGVmaW5lIEdBSU5fUklfTUFTSyAgICAoIDB4MGYgPDwgR0FJTl9SSV9TSElGVCkgCisjZGVmaW5lIEdBSU5fTE9fU0hJRlQgICA2CisjZGVmaW5lIEdBSU5fTE9fTUFTSyAgICAoIDB4M2YgPDwgR0FJTl9MT19TSElGVCkgCisjZGVmaW5lIEdBSU5fUk9fU0hJRlQgICAwCisjZGVmaW5lIEdBSU5fUk9fTUFTSyAgICAoIDB4M2YgPDwgR0FJTl9ST19TSElGVCkgCisKKworI2RlZmluZSBNQVhfT1VUUFVUX0xFVkVMICAoR0FJTl9ST19NQVNLID4+IEdBSU5fUk9fU0hJRlQpCisjZGVmaW5lIE1BWF9JTlBVVF9MRVZFTCAgIChHQUlOX1JJX01BU0sgPj4gR0FJTl9SSV9TSElGVCkKKyNkZWZpbmUgTUFYX01PTklUT1JfTEVWRUwgKEdBSU5fTUFfTUFTSyA+PiBHQUlOX01BX1NISUZUKQorCisjZGVmaW5lIE1JWEVSX0lOVEVSTkFMICAgU09VTkRfTUlYRVJfTElORTEKKyNkZWZpbmUgTUlYRVJfTElORU9VVCAgICBTT1VORF9NSVhFUl9MSU5FMgorI2RlZmluZSBNSVhFUl9IRUFEUEhPTkVTIFNPVU5EX01JWEVSX0xJTkUzCisKKyNkZWZpbmUgTUFTS19JTlRFUk5BTCAgIFNPVU5EX01BU0tfTElORTEKKyNkZWZpbmUgTUFTS19MSU5FT1VUICAgIFNPVU5EX01BU0tfTElORTIKKyNkZWZpbmUgTUFTS19IRUFEUEhPTkVTIFNPVU5EX01BU0tfTElORTMKKworLyoKKyAqIENoYW5uZWxzIE1hc2sgaW4gbWl4ZXIgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIEdBSU5fVE9UQUxfU0lMRU5DRSAweDAwRjAwRkZGCisjZGVmaW5lIEdBSU5fREVGQVVMVCAgICAgICAweDBGRjAwMDAwCisKKworc3RydWN0IGhhcm1vbnlfaHBhIHsKKwl1OAl1bnVzZWQwMDA7CisJdTgJaWQ7CisJdTgJdGVsZXNoYXJlX2lkOworCXU4CXVudXNlZDAwMzsKKwl1MzIJcmVzZXQ7CisJdTMyCWNudGw7CisJdTMyCWdhaW5jdGw7CisJdTMyCXBueHRhZGQ7CisJdTMyCXBjdXJhZGQ7CisJdTMyCXJueHRhZGQ7CisJdTMyCXJjdXJhZGQ7CisJdTMyCWRzdGF0dXM7CisJdTMyCW92OworCXUzMglwaW87CisJdTMyCXVudXNlZDAyYzsKKwl1MzIJdW51c2VkMDMwWzNdOworCXUzMglkaWFnOworfTsKKworc3RydWN0IGhhcm1vbnlfZGV2IHsKKwlzdHJ1Y3QgaGFybW9ueV9ocGEgKmhwYTsKKwlzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2OworCXUzMiBjdXJyZW50X2dhaW47CisJdTMyIGRhY19yYXRlOwkJLyogODAwMCAuLi4gNDgwMDAgKEh6KSAqLworCXU4IGRhdGFfZm9ybWF0OwkJLyogSEFSTU9OWV9ERl94eF9CSVRfeHh4ICovCisJdTggc2FtcGxlX3JhdGU7CQkvKiBIQVJNT05ZX1NSX3h4X0tIWiAqLworCXU4IHN0ZXJlb19zZWxlY3Q7CS8qIEhBUk1PTllfU1NfTU9OTyBvciBIQVJNT05ZX1NTX1NURVJFTyAqLworCWludCBmb3JtYXRfaW5pdGlhbGl6ZWQgIDoxOworCWludCBzdXNwZW5kZWRfcGxheWluZyAgIDoxOworCWludCBzdXNwZW5kZWRfcmVjb3JkaW5nIDoxOworCQorCWludCBibG9ja2VkX3BsYXlpbmcgICAgIDoxOworCWludCBibG9ja2VkX3JlY29yZGluZyAgIDoxOworCWludCBhdWRpb19vcGVuCQk6MTsKKwlpbnQgbWl4ZXJfb3BlbgkJOjE7CisJCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3FfcGxheSwgd3FfcmVjb3JkOworCWludCBmaXJzdF9maWxsZWRfcGxheTsJLyogZmlyc3QgYnVmZmVyIGNvbnRhaW5pbmcgZGF0YSAobmV4dCB0byBwbGF5KSAqLworCWludCBuYl9maWxsZWRfcGxheTsgCisJaW50IHBsYXlfb2Zmc2V0OworCWludCBmaXJzdF9maWxsZWRfcmVjb3JkOworCWludCBuYl9maWxsZWRfcmVjb3JkOworCQkKKwlpbnQgZHNwX3VuaXQsIG1peGVyX3VuaXQ7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgaGFybW9ueV9kZXYgaGFybW9ueTsKKworCisvKgorICogRHluYW1pYyBzb3VuZCBidWZmZXIgYWxsb2NhdGlvbiBhbmQgRE1BIG1lbW9yeQorICovCisKK3N0cnVjdCBoYXJtb255X2J1ZmZlciB7CisJdW5zaWduZWQgY2hhciAqYWRkcjsKKwlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisJaW50IGRtYV9jb2hlcmVudDsJLyogWmVybyBpZiBkbWFfYWxsb2NfY29oZXJlbnQoKSBmYWlscyAqLworCXVuc2lnbmVkIGludCBsZW47Cit9OworCisvKgorICogSGFybW9ueSBtZW1vcnkgYnVmZmVycworICovCisKK3N0YXRpYyBzdHJ1Y3QgaGFybW9ueV9idWZmZXIgcGxheWVkX2J1ZiwgcmVjb3JkZWRfYnVmLCBzaWxlbnQsIGdyYXZleWFyZDsKKworCisjZGVmaW5lIENIRUNLX1dCQUNLX0lOVl9PRkZTRVQoYixvZmZzZXQsbGVuKSBcCisgICAgICAgIGRvIHsgaWYgKCFiLmRtYV9jb2hlcmVudCkgXAorCQlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKWIuYWRkcitvZmZzZXQsbGVuKTsgXAorCX0gd2hpbGUgKDApIAorCisJCitzdGF0aWMgaW50IF9faW5pdCBoYXJtb255X2FsbG9jX2J1ZmZlcihzdHJ1Y3QgaGFybW9ueV9idWZmZXIgKmIsIAorCQl1bnNpZ25lZCBpbnQgYnVmZmVyX2NvdW50KQoreworCWItPmxlbiA9IGJ1ZmZlcl9jb3VudCAqIEhBUk1PTllfQlVGX1NJWkU7CisJYi0+YWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGFybW9ueS5kZXYtPmRldiwgCisJCQkgIGItPmxlbiwgJmItPmRtYV9oYW5kbGUsIEdGUF9LRVJORUx8R0ZQX0RNQSk7CisJaWYgKGItPmFkZHIgJiYgYi0+ZG1hX2hhbmRsZSkgeworCQliLT5kbWFfY29oZXJlbnQgPSAxOworCQlEUFJJTlRLKEtFUk5fSU5GTyBQRlggImNvaGVyZW50IG1lbW9yeTogMHglbHgsIHBsYXllZF9idWY6IDB4JWx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKWItPmRtYV9oYW5kbGUsICh1bnNpZ25lZCBsb25nKWItPmFkZHIpOworCX0gZWxzZSB7CisJCWItPmRtYV9jb2hlcmVudCA9IDA7CisJCS8qIGttYWxsb2MoKWVkIG1lbW9yeSB3aWxsIEhQTUMgb24gY2NpbyBtYWNoaW5lcyAhICovCisJCWItPmFkZHIgPSBrbWFsbG9jKGItPmxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghYi0+YWRkcikgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYi0+ZG1hX2hhbmRsZSA9IF9fcGEoYi0+YWRkcik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaGFybW9ueV9mcmVlX2J1ZmZlcihzdHJ1Y3QgaGFybW9ueV9idWZmZXIgKmIpCit7CisJaWYgKCFiLT5hZGRyKQorCQlyZXR1cm47CisKKwlpZiAoYi0+ZG1hX2NvaGVyZW50KQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGFybW9ueS5kZXYtPmRldiwKKwkJCQliLT5sZW4sIGItPmFkZHIsIGItPmRtYV9oYW5kbGUpOworCWVsc2UKKwkJa2ZyZWUoYi0+YWRkcik7CisKKwltZW1zZXQoYiwgMCwgc2l6ZW9mKCpiKSk7Cit9CisKKworCisvKgorICogTG93LUxldmVsIHNvdW5kLWNoaXAgcHJvZ3JhbW1pbmcKKyAqLworCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGhhcm1vbnlfd2FpdF9DTlRMKHZvaWQpCit7CisJLyogV2FpdCB1bnRpbCB3ZSdyZSBvdXQgb2YgY29udHJvbCBtb2RlICovCisJd2hpbGUgKGdzY19yZWFkbCgmaGFybW9ueS5ocGEtPmNudGwpICYgQ05UTF9DKQorCQkvKiB3YWl0ICovIDsKK30KKworCitzdGF0aWMgdm9pZCBoYXJtb255X3VwZGF0ZV9jb250cm9sKHZvaWQpIAoreworCXUzMiBkZWZhdWx0X2NudGw7CisJCisJLyogU2V0IENOVEwgKi8KKwlkZWZhdWx0X2NudGwgPSAoQ05UTF9DIHwgIAkJLyogVGhlIEMgYml0ICovCisJCShoYXJtb255LmRhdGFfZm9ybWF0IDw8IDYpIHwJLyogU2V0IHRoZSBkYXRhIGZvcm1hdCAqLworCQkoaGFybW9ueS5zdGVyZW9fc2VsZWN0IDw8IDUpIHwJLyogU3RlcmVvIHNlbGVjdCAqLworCQkoaGFybW9ueS5zYW1wbGVfcmF0ZSkpOwkJLyogU2V0IHNhbXBsZSByYXRlICovCisJaGFybW9ueS5mb3JtYXRfaW5pdGlhbGl6ZWQgPSAxOworCQorCS8qIGluaXRpYWxpemUgQ05UTCAqLworCWdzY193cml0ZWwoZGVmYXVsdF9jbnRsLCAmaGFybW9ueS5ocGEtPmNudGwpOworfQorCitzdGF0aWMgdm9pZCBoYXJtb255X3NldF9jb250cm9sKHU4IGRhdGFfZm9ybWF0LCB1OCBzYW1wbGVfcmF0ZSwgdTggc3RlcmVvX3NlbGVjdCkgCit7CisJaGFybW9ueS5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworCWhhcm1vbnkuZGF0YV9mb3JtYXQgPSBkYXRhX2Zvcm1hdDsKKwloYXJtb255LnN0ZXJlb19zZWxlY3QgPSBzdGVyZW9fc2VsZWN0OworCWhhcm1vbnlfdXBkYXRlX2NvbnRyb2woKTsKK30KKworc3RhdGljIHZvaWQgaGFybW9ueV9zZXRfcmF0ZSh1OCBkYXRhX3JhdGUpIAoreworCWhhcm1vbnkuc2FtcGxlX3JhdGUgPSBkYXRhX3JhdGU7CisJaGFybW9ueV91cGRhdGVfY29udHJvbCgpOworfQorCitzdGF0aWMgaW50IGhhcm1vbnlfZGV0ZWN0X3JhdGUoaW50ICpmcmVxKQoreworCWludCBuZXdyYXRlOworCXN3aXRjaCAoKmZyZXEpIHsKKwljYXNlIDgwMDA6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzhLSFo7CWJyZWFrOworCWNhc2UgMTYwMDA6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzE2S0haOwlicmVhazsgCisJY2FzZSAyNzQyODoJbmV3cmF0ZSA9IEhBUk1PTllfU1JfMjdLSFo7CWJyZWFrOyAKKwljYXNlIDMyMDAwOgluZXdyYXRlID0gSEFSTU9OWV9TUl8zMktIWjsJYnJlYWs7IAorCWNhc2UgNDgwMDA6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzQ4S0haOwlicmVhazsgCisJY2FzZSA5NjAwOgluZXdyYXRlID0gSEFSTU9OWV9TUl85S0haOwlicmVhazsgCisJY2FzZSA1NTEyOgluZXdyYXRlID0gSEFSTU9OWV9TUl81S0haOwlicmVhazsgCisJY2FzZSAxMTAyNToJbmV3cmF0ZSA9IEhBUk1PTllfU1JfMTFLSFo7CWJyZWFrOyAKKwljYXNlIDE4OTAwOgluZXdyYXRlID0gSEFSTU9OWV9TUl8xOEtIWjsJYnJlYWs7IAorCWNhc2UgMjIwNTA6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzIyS0haOwlicmVhazsgCisJY2FzZSAzNzgwMDoJbmV3cmF0ZSA9IEhBUk1PTllfU1JfMzdLSFo7CWJyZWFrOyAKKwljYXNlIDQ0MTAwOgluZXdyYXRlID0gSEFSTU9OWV9TUl80NEtIWjsJYnJlYWs7IAorCWNhc2UgMzMwNzU6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzMzS0haOwlicmVhazsgCisJY2FzZSA2NjE1OgluZXdyYXRlID0gSEFSTU9OWV9TUl82S0haOwlicmVhazsgCisJZGVmYXVsdDoJbmV3cmF0ZSA9IEhBUk1PTllfU1JfOEtIWjsgCisJCQkqZnJlcSA9IDgwMDA7CQkJYnJlYWs7CisJfQorCXJldHVybiBuZXdyYXRlOworfQorCitzdGF0aWMgdm9pZCBoYXJtb255X3NldF9mb3JtYXQodTggZGF0YV9mb3JtYXQpIAoreworCWhhcm1vbnkuZGF0YV9mb3JtYXQgPSBkYXRhX2Zvcm1hdDsKKwloYXJtb255X3VwZGF0ZV9jb250cm9sKCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhcm1vbnlfc2V0X3N0ZXJlbyh1OCBzdGVyZW9fc2VsZWN0KSAKK3sKKwloYXJtb255LnN0ZXJlb19zZWxlY3QgPSBzdGVyZW9fc2VsZWN0OworCWhhcm1vbnlfdXBkYXRlX2NvbnRyb2woKTsKK30KKworc3RhdGljIHZvaWQgaGFybW9ueV9kaXNhYmxlX2ludGVycnVwdHModm9pZCkgCit7CisJaGFybW9ueV93YWl0X0NOVEwoKTsKKwlnc2Nfd3JpdGVsKDAsICZoYXJtb255LmhwYS0+ZHN0YXR1cyk7IAorfQorCitzdGF0aWMgdm9pZCBoYXJtb255X2VuYWJsZV9pbnRlcnJ1cHRzKHZvaWQpIAoreworCWhhcm1vbnlfd2FpdF9DTlRMKCk7CisJZ3NjX3dyaXRlbChEU1RBVFVTX0lFLCAmaGFybW9ueS5ocGEtPmRzdGF0dXMpOyAKK30KKworLyoKKyAqIGhhcm1vbnlfc2lsZW5jZSgpCisgKgorICogVGhpcyBzdWJyb3V0aW5lIGZpbGxzIGluIGEgYnVmZmVyIHN0YXJ0aW5nIGF0IGxvY2F0aW9uIHN0YXJ0IGFuZAorICogc2lsZW5jZXMgZm9yIGxlbmd0aCBieXRlcy4gIFRoaXMgcmVmZXJlbmNlcyB0aGUgY3VycmVudAorICogY29uZmlndXJhdGlvbiBvZiB0aGUgYXVkaW8gZm9ybWF0LgorICoKKyAqLworCitzdGF0aWMgdm9pZCBoYXJtb255X3NpbGVuY2Uoc3RydWN0IGhhcm1vbnlfYnVmZmVyICpidWZmZXIsIGludCBzdGFydCwgaW50IGxlbmd0aCkgCit7CisJdTggc2lsZW5jZV9jaGFyOworCisJLyogRGVzcGl0ZSB3aGF0IHlvdSBoZWFyLCBzaWxlbmNlIGlzIGRpZmZlcmVudCBpbgorCSAgIGRpZmZlcmVudCBhdWRpbyBmb3JtYXRzLiAgKi8KKwlzd2l0Y2ggKGhhcm1vbnkuZGF0YV9mb3JtYXQpIHsKKwkJY2FzZSBIQVJNT05ZX0RGXzhCSVRfVUxBVzoJc2lsZW5jZV9jaGFyID0gMHg1NTsgYnJlYWs7CisJCWNhc2UgSEFSTU9OWV9ERl84QklUX0FMQVc6CXNpbGVuY2VfY2hhciA9IDB4ZmY7IGJyZWFrOworCQljYXNlIEhBUk1PTllfREZfMTZCSVRfTElORUFSOgkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoJCQlzaWxlbmNlX2NoYXIgPSAwOworCX0KKworCW1lbXNldChidWZmZXItPmFkZHIrc3RhcnQsIHNpbGVuY2VfY2hhciwgbGVuZ3RoKTsKK30KKworCitzdGF0aWMgaW50IGhhcm1vbnlfYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoaGFybW9ueS5hdWRpb19vcGVuKSAKKwkJcmV0dXJuIC1FQlVTWTsKKwkKKwloYXJtb255LmF1ZGlvX29wZW4gPSAxOworCWhhcm1vbnkuc3VzcGVuZGVkX3BsYXlpbmcgPSBoYXJtb255LnN1c3BlbmRlZF9yZWNvcmRpbmcgPSAxOworCWhhcm1vbnkuYmxvY2tlZF9wbGF5aW5nICAgPSBoYXJtb255LmJsb2NrZWRfcmVjb3JkaW5nICAgPSAwOworCWhhcm1vbnkuZmlyc3RfZmlsbGVkX3BsYXkgPSBoYXJtb255LmZpcnN0X2ZpbGxlZF9yZWNvcmQgPSAwOworCWhhcm1vbnkubmJfZmlsbGVkX3BsYXkgICAgPSBoYXJtb255Lm5iX2ZpbGxlZF9yZWNvcmQgICAgPSAwOworCWhhcm1vbnkucGxheV9vZmZzZXQgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhhcm1vbnkud3FfcGxheSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaGFybW9ueS53cV9yZWNvcmQpOworCQorCS8qIFN0YXJ0IG9mZiBpbiBhIGJhbGFuY2VkIG1vZGUuICovCisJaGFybW9ueV9zZXRfY29udHJvbChIQVJNT05ZX0RGXzhCSVRfVUxBVywgSEFSTU9OWV9TUl84S0haLCBIQVJNT05ZX1NTX01PTk8pOworCWhhcm1vbnlfdXBkYXRlX2NvbnRyb2woKTsKKwloYXJtb255LmZvcm1hdF9pbml0aWFsaXplZCA9IDA7CisKKwkvKiBDbGVhciBvdXQgYWxsIHRoZSBidWZmZXJzIGFuZCBmbHVzaCB0byBjYWNoZSAqLworCWhhcm1vbnlfc2lsZW5jZSgmcGxheWVkX2J1ZiwgMCwgSEFSTU9OWV9CVUZfU0laRSpNQVhfQlVGUyk7CisJQ0hFQ0tfV0JBQ0tfSU5WX09GRlNFVChwbGF5ZWRfYnVmLCAwLCBIQVJNT05ZX0JVRl9TSVpFKk1BWF9CVUZTKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlbGVhc2UgKGNsb3NlKSB0aGUgYXVkaW8gZGV2aWNlLgorICovCisKK3N0YXRpYyBpbnQgaGFybW9ueV9hdWRpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghaGFybW9ueS5hdWRpb19vcGVuKSAKKwkJcmV0dXJuIC1FQlVTWTsKKwkKKwloYXJtb255LmF1ZGlvX29wZW4gPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHJlY29yZGVkIGRhdGEgb2ZmIHRoZSBhdWRpbyBkZXZpY2UuCisgKi8KKworc3RhdGljIHNzaXplX3QgaGFybW9ueV9hdWRpb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHRvdGFsX2NvdW50ID0gKGludCkgc2l6ZV9jb3VudDsKKwlpbnQgY291bnQgPSAwOworCWludCBidWZfdG9fcmVhZDsKKworCXdoaWxlIChjb3VudDx0b3RhbF9jb3VudCkgeworCQkvKiBXYWl0IHVudGlsIHdlJ3JlIG91dCBvZiBjb250cm9sIG1vZGUgKi8KKwkJaGFybW9ueV93YWl0X0NOVEwoKTsKKwkJCisJCS8qIEZpZ3VyZSBvdXQgd2hpY2ggYnVmZmVyIHRvIGZpbGwgaW4gKi8KKwkJaWYgKGhhcm1vbnkubmJfZmlsbGVkX3JlY29yZCA8PSAyKSB7CisJCQloYXJtb255LmJsb2NrZWRfcmVjb3JkaW5nID0gMTsKKwkJICAgICAgICBpZiAoaGFybW9ueS5zdXNwZW5kZWRfcmVjb3JkaW5nKSB7CisJCQkJaGFybW9ueS5zdXNwZW5kZWRfcmVjb3JkaW5nID0gMDsKKwkJCQloYXJtb255X2VuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCQl9CisJCQkJCQkJCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZoYXJtb255LndxX3JlY29yZCk7CisJCQloYXJtb255LmJsb2NrZWRfcmVjb3JkaW5nID0gMDsKKwkJfQorCQkKKwkJaWYgKGhhcm1vbnkubmJfZmlsbGVkX3JlY29yZCA8IDIpCisJCQlyZXR1cm4gLUVCVVNZOworCQkKKwkJYnVmX3RvX3JlYWQgPSBoYXJtb255LmZpcnN0X2ZpbGxlZF9yZWNvcmQ7CisKKwkJLyogQ29weSB0aGUgcGFnZSB0byBhbiBhbGlnbmVkIGJ1ZmZlciAqLworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlcitjb3VudCwgcmVjb3JkZWRfYnVmLmFkZHIgKworCQkJCSAoSEFSTU9OWV9CVUZfU0laRSpidWZfdG9fcmVhZCksCisJCQkJIEhBUk1PTllfQlVGX1NJWkUpKSB7CisJCQljb3VudCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQkKKwkJaGFybW9ueS5uYl9maWxsZWRfcmVjb3JkLS07CisJCWhhcm1vbnkuZmlyc3RfZmlsbGVkX3JlY29yZCsrOworCQloYXJtb255LmZpcnN0X2ZpbGxlZF9yZWNvcmQgJT0gTUFYX0JVRlM7CisJCQkJCisJCWNvdW50ICs9IEhBUk1PTllfQlVGX1NJWkU7CisJfQorCXJldHVybiBjb3VudDsKK30KKworCisKKworLyoKKyAqIEhlcmUgaXMgdGhlIHBsYWNlIHdoZXJlIHdlIHRyeSB0byByZWNvZ25pemUgZmlsZSBmb3JtYXQuCisgKiBTdW4vTmVYVCAuYXUgZmlsZXMgYmVnaW4gd2l0aCB0aGUgc3RyaW5nIC5zbmQKKyAqIEF0IG9mZnNldCAxMiBpcyBzcGVjaWZpZWQgdGhlIGVuY29kaW5nLgorICogQXQgb2Zmc2V0IDE2IGlzIHNwZWNpZmllZCBzcGVlZCByYXRlCisgKiBBdCBPZmZzZXQgMjAgaXMgc3BlY2lmaWVkIHRoZSBudW1iZXJzIG9mIHZvaWNlcworICovCisKKyNkZWZpbmUgZm91cl9ieXRlc190b191MzIoc3RhcnQpIChmaWxlX2hlYWRlcltzdGFydF0gPDwgMjQpfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZV9oZWFkZXJbc3RhcnQrMV0gPDwgMTYpfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZV9oZWFkZXJbc3RhcnQrMl0gPDwgOCl8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX2hlYWRlcltzdGFydCszXSk7CisKKyNkZWZpbmUgdGVzdF9yYXRlKHRlc3RlZCxyZWFsX3ZhbHVlLGhhcm1vbnlfdmFsdWUpIGlmICgodGVzdGVkKTw9KHJlYWxfdmFsdWUpKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworc3RhdGljIGludCBoYXJtb255X2Zvcm1hdF9hdXRvX2RldGVjdChjb25zdCBjaGFyICpidWZmZXIsIGludCBibG9ja19zaXplKQoreworCXU4IGZpbGVfaGVhZGVyWzI0XTsKKwl1MzIgc3RhcnRfc3RyaW5nOworCWludCByZXQgPSAwOworCQorCWlmIChibG9ja19zaXplPjI0KSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihmaWxlX2hlYWRlciwgYnVmZmVyLCBzaXplb2YoZmlsZV9oZWFkZXIpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQkKKwkJc3RhcnRfc3RyaW5nID0gZm91cl9ieXRlc190b191MzIoMCk7CisJCQorCQlpZiAoKGZpbGVfaGVhZGVyWzRdPT0wKSAmJiAoc3RhcnRfc3RyaW5nPT0weDJFNzM2RTY0KSkgeworCQkJdTMyIGZvcm1hdDsKKwkJCXUzMiBuYl92b2ljZXM7CisJCQl1MzIgc3BlZWQ7CisJCQkKKwkJCWZvcm1hdCA9IGZvdXJfYnl0ZXNfdG9fdTMyKDEyKTsKKwkJCW5iX3ZvaWNlcyA9IGZvdXJfYnl0ZXNfdG9fdTMyKDIwKTsKKwkJCXNwZWVkID0gZm91cl9ieXRlc190b191MzIoMTYpOworCQkJCisJCQlzd2l0Y2ggKGZvcm1hdCkgeworCQkJY2FzZSBIQVJNT05ZX01BR0lDXzhCX1VMQVc6CisJCQkJaGFybW9ueS5kYXRhX2Zvcm1hdCA9IEhBUk1PTllfREZfOEJJVF9VTEFXOworCQkJCWJyZWFrOworCQkJY2FzZSBIQVJNT05ZX01BR0lDXzhCX0FMQVc6CisJCQkJaGFybW9ueS5kYXRhX2Zvcm1hdCA9IEhBUk1PTllfREZfOEJJVF9BTEFXOworCQkJCWJyZWFrOworCQkJY2FzZSBIQVJNT05ZX01BR0lDXzE2Ql9MSU5FQVI6CisJCQkJaGFybW9ueS5kYXRhX2Zvcm1hdCA9IEhBUk1PTllfREZfMTZCSVRfTElORUFSOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQloYXJtb255X3NldF9jb250cm9sKEhBUk1PTllfREZfMTZCSVRfTElORUFSLAorCQkJCQkJSEFSTU9OWV9TUl80NEtIWiwgSEFSTU9OWV9TU19TVEVSRU8pOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJc3dpdGNoIChuYl92b2ljZXMpIHsKKwkJCWNhc2UgSEFSTU9OWV9NQUdJQ19NT05POgorCQkJCWhhcm1vbnkuc3RlcmVvX3NlbGVjdCA9IEhBUk1PTllfU1NfTU9OTzsKKwkJCQlicmVhazsKKwkJCWNhc2UgSEFSTU9OWV9NQUdJQ19TVEVSRU86CisJCQkJaGFybW9ueS5zdGVyZW9fc2VsZWN0ID0gSEFSTU9OWV9TU19TVEVSRU87CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWhhcm1vbnkuc3RlcmVvX3NlbGVjdCA9IEhBUk1PTllfU1NfTU9OTzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWhhcm1vbnlfc2V0X3JhdGUoaGFybW9ueV9kZXRlY3RfcmF0ZSgmc3BlZWQpKTsKKwkJCWhhcm1vbnkuZGFjX3JhdGUgPSBzcGVlZDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWhhcm1vbnlfc2V0X2NvbnRyb2woSEFSTU9OWV9ERl84QklUX1VMQVcsIEhBUk1PTllfU1JfOEtIWiwgSEFSTU9OWV9TU19NT05PKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorI3VuZGVmIGZvdXJfYnl0ZXNfdG9fdTMyCisKKworc3RhdGljIHNzaXplX3QgaGFybW9ueV9hdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90ICpwcG9zKQoreworCWludCB0b3RhbF9jb3VudCA9IChpbnQpIHNpemVfY291bnQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgZnJhbWVfc2l6ZTsKKwlpbnQgYnVmX3RvX2ZpbGw7CisJaW50IGZyZXNoX2J1ZmZlcjsKKworCWlmICghaGFybW9ueS5mb3JtYXRfaW5pdGlhbGl6ZWQpIHsKKwkJaWYgKGhhcm1vbnlfZm9ybWF0X2F1dG9fZGV0ZWN0KGJ1ZmZlciwgdG90YWxfY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCQorCXdoaWxlIChjb3VudDx0b3RhbF9jb3VudCkgeworCQkvKiBXYWl0IHVudGlsIHdlJ3JlIG91dCBvZiBjb250cm9sIG1vZGUgKi8KKwkJaGFybW9ueV93YWl0X0NOVEwoKTsKKworCQkvKiBGaWd1cmUgb3V0IHdoaWNoIGJ1ZmZlciB0byBmaWxsIGluICovCisJCWlmIChoYXJtb255Lm5iX2ZpbGxlZF9wbGF5KzIgPj0gTUFYX0JVRlMgJiYgIWhhcm1vbnkucGxheV9vZmZzZXQpIHsKKwkJCWhhcm1vbnkuYmxvY2tlZF9wbGF5aW5nID0gMTsKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmhhcm1vbnkud3FfcGxheSk7CisJCQloYXJtb255LmJsb2NrZWRfcGxheWluZyA9IDA7CisJCX0KKwkJaWYgKGhhcm1vbnkubmJfZmlsbGVkX3BsYXkrMiA+PSBNQVhfQlVGUyAmJiAhaGFybW9ueS5wbGF5X29mZnNldCkKKwkJCXJldHVybiAtRUJVU1k7CisJCQorCQkKKwkJYnVmX3RvX2ZpbGwgPSAoaGFybW9ueS5maXJzdF9maWxsZWRfcGxheStoYXJtb255Lm5iX2ZpbGxlZF9wbGF5KTsgCisJCWlmIChoYXJtb255LnBsYXlfb2Zmc2V0KSB7CisJCQlidWZfdG9fZmlsbC0tOworCQkJYnVmX3RvX2ZpbGwgKz0gTUFYX0JVRlM7CisJCX0KKwkJYnVmX3RvX2ZpbGwgJT0gTUFYX0JVRlM7CisJCQorCQlmcmVzaF9idWZmZXIgPSAoaGFybW9ueS5wbGF5X29mZnNldCA9PSAwKTsKKwkJCisJCS8qIEZpZ3VyZSBvdXQgdGhlIHNpemUgb2YgdGhlIGZyYW1lICovCisJCWlmICgodG90YWxfY291bnQtY291bnQpID49IEhBUk1PTllfQlVGX1NJWkUgLSBoYXJtb255LnBsYXlfb2Zmc2V0KSB7CisJCQlmcmFtZV9zaXplID0gSEFSTU9OWV9CVUZfU0laRSAtIGhhcm1vbnkucGxheV9vZmZzZXQ7CisJCX0gZWxzZSB7CisJCQlmcmFtZV9zaXplID0gdG90YWxfY291bnQgLSBjb3VudDsKKwkJCS8qIENsZWFyIG91dCB0aGUgYnVmZmVyLCBzaW5jZSB0aGVyZSB3ZSdsbCBvbmx5IGJlIAorCQkJICAgb3ZlcmxheWluZyBwYXJ0IG9mIHRoZSBvbGQgYnVmZmVyIHdpdGggdGhlIG5ldyBvbmUgKi8KKwkJCWhhcm1vbnlfc2lsZW5jZSgmcGxheWVkX2J1ZiwgCisJCQkJSEFSTU9OWV9CVUZfU0laRSpidWZfdG9fZmlsbCtmcmFtZV9zaXplK2hhcm1vbnkucGxheV9vZmZzZXQsCisJCQkJSEFSTU9OWV9CVUZfU0laRS1mcmFtZV9zaXplLWhhcm1vbnkucGxheV9vZmZzZXQpOworCQl9CisKKwkJLyogQ29weSB0aGUgcGFnZSB0byBhbiBhbGlnbmVkIGJ1ZmZlciAqLworCQlpZiAoY29weV9mcm9tX3VzZXIocGxheWVkX2J1Zi5hZGRyICsoSEFSTU9OWV9CVUZfU0laRSpidWZfdG9fZmlsbCkgKyBoYXJtb255LnBsYXlfb2Zmc2V0LCAKKwkJCQkgICBidWZmZXIrY291bnQsIGZyYW1lX3NpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCUNIRUNLX1dCQUNLX0lOVl9PRkZTRVQocGxheWVkX2J1ZiwgKEhBUk1PTllfQlVGX1NJWkUqYnVmX3RvX2ZpbGwgKyBoYXJtb255LnBsYXlfb2Zmc2V0KSwgCisJCQkJZnJhbWVfc2l6ZSk7CisJCisJCWlmIChmcmVzaF9idWZmZXIpCisJCQloYXJtb255Lm5iX2ZpbGxlZF9wbGF5Kys7CisJCQorCQljb3VudCArPSBmcmFtZV9zaXplOworCQloYXJtb255LnBsYXlfb2Zmc2V0ICs9IGZyYW1lX3NpemU7CisJCWhhcm1vbnkucGxheV9vZmZzZXQgJT0gSEFSTU9OWV9CVUZfU0laRTsKKwkJaWYgKGhhcm1vbnkuc3VzcGVuZGVkX3BsYXlpbmcgJiYgKGhhcm1vbnkubmJfZmlsbGVkX3BsYXk+PTQpKQorCQkJaGFybW9ueV9lbmFibGVfaW50ZXJydXB0cygpOworCX0KKwkKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGFybW9ueV9hdWRpb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFoYXJtb255LnN1c3BlbmRlZF9yZWNvcmRpbmcpCisJCQlwb2xsX3dhaXQoZmlsZSwgJmhhcm1vbnkud3FfcmVjb3JkLCB3YWl0KTsKKwkJaWYgKGhhcm1vbnkubmJfZmlsbGVkX3JlY29yZCkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCFoYXJtb255LnN1c3BlbmRlZF9wbGF5aW5nKQorCQkJcG9sbF93YWl0KGZpbGUsICZoYXJtb255LndxX3BsYXksIHdhaXQpOworCQlpZiAoaGFybW9ueS5uYl9maWxsZWRfcGxheSkKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgaGFybW9ueV9hdWRpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgaXZhbCwgbmV3X2Zvcm1hdDsKKwlpbnQgZnJhZ19zaXplLCBmcmFnX2J1ZjsKKwlzdHJ1Y3QgYXVkaW9fYnVmX2luZm8gaW5mbzsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJaXZhbCA9IERTUF9DQVBfRFVQTEVYOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CisJCWl2YWwgPSAoQUZNVF9TMTZfQkUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcgKTsgCisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisJCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkgCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGl2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJc3dpdGNoIChpdmFsKSB7CisJCQljYXNlIEFGTVRfTVVfTEFXOgluZXdfZm9ybWF0ID0gSEFSTU9OWV9ERl84QklUX1VMQVc7IGJyZWFrOworCQkJY2FzZSBBRk1UX0FfTEFXOgluZXdfZm9ybWF0ID0gSEFSTU9OWV9ERl84QklUX0FMQVc7IGJyZWFrOworCQkJY2FzZSBBRk1UX1MxNl9CRToJbmV3X2Zvcm1hdCA9IEhBUk1PTllfREZfMTZCSVRfTElORUFSOyBicmVhazsKKwkJCWRlZmF1bHQ6IHsKKwkJCQlEUFJJTlRLKEtFUk5fV0FSTklORyBQRlggCisJCQkJCSJ1bnN1cHBvcnRlZCBzb3VuZCBmb3JtYXQgMHglMDR4IHJlcXVlc3RlZC5cbiIsCisJCQkJCWl2YWwpOworCQkJCWl2YWwgPSBBRk1UX1MxNl9CRTsKKwkJCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCQkJfQorCQkJfQorCQkJaGFybW9ueV9zZXRfZm9ybWF0KG5ld19mb3JtYXQpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGhhcm1vbnkuZGF0YV9mb3JtYXQpIHsKKwkJCWNhc2UgSEFSTU9OWV9ERl84QklUX1VMQVc6CWl2YWwgPSBBRk1UX01VX0xBVzsgYnJlYWs7CisJCQljYXNlIEhBUk1PTllfREZfOEJJVF9BTEFXOglpdmFsID0gQUZNVF9BX0xBVzsgIGJyZWFrOworCQkJY2FzZSBIQVJNT05ZX0RGXzE2QklUX0xJTkVBUjoJaXZhbCA9IEFGTVRfVTE2X0JFOyBicmVhazsKKwkJCWRlZmF1bHQ6IGl2YWwgPSAwOworCQkJfQorCQkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKKwkJfQorCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlpdmFsID0gaGFybW9ueS5kYWNfcmF0ZTsKKwkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQloYXJtb255X3NldF9yYXRlKGhhcm1vbnlfZGV0ZWN0X3JhdGUoJml2YWwpKTsKKwkJaGFybW9ueS5kYWNfcmF0ZSA9IGl2YWw7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50KikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmIChnZXRfdXNlcihpdmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGl2YWwgIT0gMCAmJiBpdmFsICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaGFybW9ueV9zZXRfc3RlcmVvKGl2YWwpOworIAkJcmV0dXJuIDA7CisgCisgCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKyAJCWlmIChnZXRfdXNlcihpdmFsLCAoaW50ICopIGFyZykpCisgCQkJcmV0dXJuIC1FRkFVTFQ7CisgCQlpZiAoaXZhbCAhPSAxICYmIGl2YWwgIT0gMikgeworIAkJCWl2YWwgPSBoYXJtb255LnN0ZXJlb19zZWxlY3QgPT0gSEFSTU9OWV9TU19NT05PID8gMSA6IDI7CisgCQkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKKyAJCX0KKyAJCWhhcm1vbnlfc2V0X3N0ZXJlbyhpdmFsLTEpOworIAkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaXZhbCA9IEhBUk1PTllfQlVGX1NJWkU7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisgICAgICAgICAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJaWYgKCFoYXJtb255LnN1c3BlbmRlZF9yZWNvcmRpbmcpIHsKKwkJCS8qIFRPRE86IHN0b3BfcmVjb3JkaW5nKCkgKi8KKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWZyYWdfc2l6ZSA9IGl2YWwgJiAweGZmZmY7CisJCWZyYWdfYnVmID0gKGl2YWw+PjE2KSAmIDB4ZmZmZjsKKwkJLyogVE9ETzogV2UgdXNlIGhhcmRjb2RlZCBmcmFnbWVudCBzaXplcyBhbmQgbnVtYmVycyBmb3Igbm93ICovCisJCWZyYWdfc2l6ZSA9IDEyOyAgLyogNDA5NiA9PSAyXjEyICovCisJCWZyYWdfYnVmICA9IE1BWF9CVUZTOworCQlpdmFsID0gKGZyYWdfYnVmIDw8IDE2KSArIGZyYWdfc2l6ZTsKKwkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWluZm8uZnJhZ3N0b3RhbCA9IE1BWF9CVUZTOworICAgICAgICAgICAgICAgIGluZm8uZnJhZ21lbnRzID0gTUFYX0JVRlMgLSBoYXJtb255Lm5iX2ZpbGxlZF9wbGF5OworCQlpbmZvLmZyYWdzaXplID0gSEFSTU9OWV9CVUZfU0laRTsKKyAgICAgICAgICAgICAgICBpbmZvLmJ5dGVzID0gaW5mby5mcmFnbWVudHMgKiBpbmZvLmZyYWdzaXplOworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaW5mby5mcmFnc3RvdGFsID0gTUFYX0JVRlM7CisgICAgICAgICAgICAgICAgaW5mby5mcmFnbWVudHMgPSAvKk1BWF9CVUZTLSovIGhhcm1vbnkubmJfZmlsbGVkX3JlY29yZDsKKwkJaW5mby5mcmFnc2l6ZSA9IEhBUk1PTllfQlVGX1NJWkU7CisgICAgICAgICAgICAgICAgaW5mby5ieXRlcyA9IGluZm8uZnJhZ21lbnRzICogaW5mby5mcmFnc2l6ZTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwkKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKwkJcmV0dXJuIDA7CisJfQorCQorCXJldHVybiAtRUlOVkFMOworfQorCisKKy8qCisgKiBoYXJtb255X2ludGVycnVwdCgpCisgKgorICogaGFybW9ueSBpbnRlcnJ1cHRpb24gc2VydmljZSByb3V0aW5lCisgKiAKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgaGFybW9ueV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgZHN0YXR1czsKKwlzdHJ1Y3QgaGFybW9ueV9ocGEgKmhwYTsKKworCS8qIFNldHVwIHRoZSBocGEgKi8KKwlocGEgPSAoKHN0cnVjdCBoYXJtb255X2RldiAqKWRldiktPmhwYTsKKwloYXJtb255X3dhaXRfQ05UTCgpOworCisJLyogUmVhZCBkc3RhdHVzIGFuZCBwY3VyYWRkICh0aGUgY3VycmVudCBhZGRyZXNzKSAqLworCWRzdGF0dXMgPSBnc2NfcmVhZGwoJmhwYS0+ZHN0YXR1cyk7CisJCisJLyogVHVybiBvZmYgaW50ZXJydXB0cyAqLworCWhhcm1vbnlfZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisJCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIHJlcXVlc3QgdG8gZ2V0IHRoZSBuZXh0IHBsYXkgYnVmZmVyICovCisJaWYgKGRzdGF0dXMgJiBEU1RBVFVTX1BOKSB7CisJCWlmICghaGFybW9ueS5uYl9maWxsZWRfcGxheSkgeworCQkJaGFybW9ueS5zdXNwZW5kZWRfcGxheWluZyA9IDE7CisJCQlnc2Nfd3JpdGVsKCh1bnNpZ25lZCBsb25nKXNpbGVudC5kbWFfaGFuZGxlLCAmaHBhLT5wbnh0YWRkKTsKKwkJCQkJCQorCQkJaWYgKCFoYXJtb255LnN1c3BlbmRlZF9yZWNvcmRpbmcpCisJCQkJaGFybW9ueV9lbmFibGVfaW50ZXJydXB0cygpOworCQl9IGVsc2UgeworCQkJaGFybW9ueS5zdXNwZW5kZWRfcGxheWluZyA9IDA7CisJCQlnc2Nfd3JpdGVsKCh1bnNpZ25lZCBsb25nKXBsYXllZF9idWYuZG1hX2hhbmRsZSArIAorCQkJCQkoSEFSTU9OWV9CVUZfU0laRSpoYXJtb255LmZpcnN0X2ZpbGxlZF9wbGF5KSwKKwkJCQkJJmhwYS0+cG54dGFkZCk7CisJCQloYXJtb255LmZpcnN0X2ZpbGxlZF9wbGF5Kys7CisJCQloYXJtb255LmZpcnN0X2ZpbGxlZF9wbGF5ICU9IE1BWF9CVUZTOworCQkJaGFybW9ueS5uYl9maWxsZWRfcGxheS0tOworCQkJCisJCSAgICAgICAJaGFybW9ueV9lbmFibGVfaW50ZXJydXB0cygpOworCQl9CisJCQorCQlpZiAoaGFybW9ueS5ibG9ja2VkX3BsYXlpbmcpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhhcm1vbnkud3FfcGxheSk7CisJfQorCQorCS8qIENoZWNrIGlmIHdlJ3JlIGJlaW5nIGFza2VkIHRvIGZpbGwgaW4gYSByZWNvcmRpbmcgYnVmZmVyICovCisJaWYgKGRzdGF0dXMgJiBEU1RBVFVTX1JOKSB7CisJCWlmKChoYXJtb255Lm5iX2ZpbGxlZF9yZWNvcmQrMj49TUFYX0JVRlMpIHx8IGhhcm1vbnkuc3VzcGVuZGVkX3JlY29yZGluZykKKwkJeworCQkJaGFybW9ueS5uYl9maWxsZWRfcmVjb3JkID0gMDsKKwkJCWhhcm1vbnkuZmlyc3RfZmlsbGVkX3JlY29yZCA9IDA7CisJCQloYXJtb255LnN1c3BlbmRlZF9yZWNvcmRpbmcgPSAxOworCQkJZ3NjX3dyaXRlbCgodW5zaWduZWQgbG9uZylncmF2ZXlhcmQuZG1hX2hhbmRsZSwgJmhwYS0+cm54dGFkZCk7CisJCQlpZiAoIWhhcm1vbnkuc3VzcGVuZGVkX3BsYXlpbmcpCisJCQkJaGFybW9ueV9lbmFibGVfaW50ZXJydXB0cygpOworCQl9IGVsc2UgeworCQkJaW50IGJ1Zl90b19maWxsOworCQkJYnVmX3RvX2ZpbGwgPSAoaGFybW9ueS5maXJzdF9maWxsZWRfcmVjb3JkK2hhcm1vbnkubmJfZmlsbGVkX3JlY29yZCkgJSBNQVhfQlVGUzsKKwkJCUNIRUNLX1dCQUNLX0lOVl9PRkZTRVQocmVjb3JkZWRfYnVmLCBIQVJNT05ZX0JVRl9TSVpFKmJ1Zl90b19maWxsLCBIQVJNT05ZX0JVRl9TSVpFKTsKKwkJCWdzY193cml0ZWwoKHVuc2lnbmVkIGxvbmcpcmVjb3JkZWRfYnVmLmRtYV9oYW5kbGUgKworCQkJCQlIQVJNT05ZX0JVRl9TSVpFKmJ1Zl90b19maWxsLAorCQkJCQkmaHBhLT5ybnh0YWRkKTsKKwkJCWhhcm1vbnkubmJfZmlsbGVkX3JlY29yZCsrOworCQkJaGFybW9ueV9lbmFibGVfaW50ZXJydXB0cygpOworCQl9CisKKwkJaWYgKGhhcm1vbnkuYmxvY2tlZF9yZWNvcmRpbmcgJiYgaGFybW9ueS5uYl9maWxsZWRfcmVjb3JkPjMpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhhcm1vbnkud3FfcmVjb3JkKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogU291bmQgcGxheWluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoYXJtb255X2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGhhcm1vbnlfYXVkaW9fcmVhZCwKKwkud3JpdGUJCT0gaGFybW9ueV9hdWRpb193cml0ZSwKKwkucG9sbAkJPSBoYXJtb255X2F1ZGlvX3BvbGwsCisJLmlvY3RsCQk9IGhhcm1vbnlfYXVkaW9faW9jdGwsCisJLm9wZW4JCT0gaGFybW9ueV9hdWRpb19vcGVuLAorCS5yZWxlYXNlCT0gaGFybW9ueV9hdWRpb19yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBoYXJtb255X2F1ZGlvX2luaXQodm9pZCkKK3sKKwkvKiBSZXF1ZXN0IHRoYXQgSVJRICovCisJaWYgKHJlcXVlc3RfaXJxKGhhcm1vbnkuZGV2LT5pcnEsIGhhcm1vbnlfaW50ZXJydXB0LCAwICwiaGFybW9ueSIsICZoYXJtb255KSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFcnJvciByZXF1ZXN0aW5nIGlycSAlZC5cbiIsIGhhcm1vbnkuZGV2LT5pcnEpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKyAgIAloYXJtb255LmRzcF91bml0ID0gcmVnaXN0ZXJfc291bmRfZHNwKCZoYXJtb255X2F1ZGlvX2ZvcHMsIC0xKTsKKwlpZiAoaGFybW9ueS5kc3BfdW5pdCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRXJyb3IgcmVnaXN0ZXJpbmcgZHNwXG4iKTsKKwkJZnJlZV9pcnEoaGFybW9ueS5kZXYtPmlycSwgJmhhcm1vbnkpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJCisJLyogQ2xlYXIgdGhlIGJ1ZmZlcnMgc28geW91IGRvbid0IGVuZCB1cCB3aXRoIGNyYXAgaW4gdGhlIGJ1ZmZlcnMuICovIAorCWhhcm1vbnlfc2lsZW5jZSgmcGxheWVkX2J1ZiwgMCwgSEFSTU9OWV9CVUZfU0laRSpNQVhfQlVGUyk7CisKKwkvKiBNYWtlIHN1cmUgdGhpcyBtYWtlcyBpdCB0byBjYWNoZSAqLworCUNIRUNLX1dCQUNLX0lOVl9PRkZTRVQocGxheWVkX2J1ZiwgMCwgSEFSTU9OWV9CVUZfU0laRSpNQVhfQlVGUyk7CisKKwkvKiBDbGVhciBvdXQgdGhlIHNpbGVudCBidWZmZXIgYW5kIGZsdXNoIHRvIGNhY2hlICovCisJaGFybW9ueV9zaWxlbmNlKCZzaWxlbnQsIDAsIEhBUk1PTllfQlVGX1NJWkUpOworCUNIRUNLX1dCQUNLX0lOVl9PRkZTRVQoc2lsZW50LCAwLCBIQVJNT05ZX0JVRl9TSVpFKTsKKwkKKwloYXJtb255LmF1ZGlvX29wZW4gPSAwOworCQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBtaXhlciBmdW5jdGlvbnMgCisgKi8KKworc3RhdGljIHZvaWQgaGFybW9ueV9taXhlcl9zZXRfZ2Fpbih2b2lkKQoreworCWhhcm1vbnlfd2FpdF9DTlRMKCk7CisJZ3NjX3dyaXRlbChoYXJtb255LmN1cnJlbnRfZ2FpbiwgJmhhcm1vbnkuaHBhLT5nYWluY3RsKTsKK30KKworLyogCisgKiAgUmVhZCBnYWluIG9mIHNlbGVjdGVkIGNoYW5uZWwuCisgKiAgVGhlIE9TUyByYXRlIGlzIGZyb20gMCAoc2lsZW50KSB0byAxMDAgLT4gbmVlZCBzb21lIGNvbnZlcnNpb25zCisgKgorICogIFRoZSBoYXJtb255IGdhaW4gYXJlIGF0dGVudWF0aW9uIGZvciBvdXRwdXQgYW5kIG1vbml0b3IgZ2Fpbi4KKyAqICAgICAgICAgICAgICAgICAgIGlzIGFtcGxpZmFjdGlvbiBmb3IgaW5wdXQgZ2FpbgorICovCisjZGVmaW5lIHRvX2hhcm1vbnlfbGV2ZWwobGV2ZWwsbWF4KSAoKGxldmVsKSptYXgvMTAwKQorI2RlZmluZSB0b19vc3NfbGV2ZWwobGV2ZWwsbWF4KSAoKGxldmVsKSoxMDAvbWF4KQorCitzdGF0aWMgaW50IGhhcm1vbnlfbWl4ZXJfZ2V0X2xldmVsKGludCBjaGFubmVsKQoreworCWludCBsZWZ0X2xldmVsOworCWludCByaWdodF9sZXZlbDsKKworCXN3aXRjaCAoY2hhbm5lbCkgeworCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwkJCWxlZnRfbGV2ZWwgID0gKGhhcm1vbnkuY3VycmVudF9nYWluICYgR0FJTl9MT19NQVNLKSA+PiBHQUlOX0xPX1NISUZUOworCQkJcmlnaHRfbGV2ZWwgPSAoaGFybW9ueS5jdXJyZW50X2dhaW4gJiBHQUlOX1JPX01BU0spID4+IEdBSU5fUk9fU0hJRlQ7CisJCQlsZWZ0X2xldmVsICA9IHRvX29zc19sZXZlbChNQVhfT1VUUFVUX0xFVkVMIC0gbGVmdF9sZXZlbCwgTUFYX09VVFBVVF9MRVZFTCk7CisJCQlyaWdodF9sZXZlbCA9IHRvX29zc19sZXZlbChNQVhfT1VUUFVUX0xFVkVMIC0gcmlnaHRfbGV2ZWwsIE1BWF9PVVRQVVRfTEVWRUwpOworCQkJcmV0dXJuIChyaWdodF9sZXZlbCA8PCA4KStsZWZ0X2xldmVsOworCQkJCisJCWNhc2UgU09VTkRfTUlYRVJfSUdBSU46CisJCQlsZWZ0X2xldmVsID0gKGhhcm1vbnkuY3VycmVudF9nYWluICYgR0FJTl9MSV9NQVNLKSA+PiBHQUlOX0xJX1NISUZUOworCQkJcmlnaHRfbGV2ZWw9IChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIEdBSU5fUklfTUFTSykgPj4gR0FJTl9SSV9TSElGVDsKKwkJCWxlZnRfbGV2ZWwgPSB0b19vc3NfbGV2ZWwobGVmdF9sZXZlbCwgTUFYX0lOUFVUX0xFVkVMKTsKKwkJCXJpZ2h0X2xldmVsPSB0b19vc3NfbGV2ZWwocmlnaHRfbGV2ZWwsIE1BWF9JTlBVVF9MRVZFTCk7CisJCQlyZXR1cm4gKHJpZ2h0X2xldmVsIDw8IDgpK2xlZnRfbGV2ZWw7CisJCQkKKwkJY2FzZSBTT1VORF9NSVhFUl9NT05JVE9SOgorCQkJbGVmdF9sZXZlbCA9IChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIEdBSU5fTUFfTUFTSykgPj4gR0FJTl9NQV9TSElGVDsKKwkJCWxlZnRfbGV2ZWwgPSB0b19vc3NfbGV2ZWwoTUFYX01PTklUT1JfTEVWRUwtbGVmdF9sZXZlbCwgTUFYX01PTklUT1JfTEVWRUwpOworCQkJcmV0dXJuIChsZWZ0X2xldmVsIDw8IDgpK2xlZnRfbGV2ZWw7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisKKworLyoKKyAqIFNvbWUgY29udmVyc2lvbnMgZm9yIHRoZSBzYW1lIHJlYXNvbnMuCisgKiBXZSBnaXZlIGJhY2sgdGhlIG5ldyByZWFsIHZhbHVlKHMpIGR1ZSB0bworICogdGhlIHJlc2NhbGUuCisgKi8KKworc3RhdGljIGludCBoYXJtb255X21peGVyX3NldF9sZXZlbChpbnQgY2hhbm5lbCwgaW50IHZhbHVlKQoreworCWludCBsZWZ0X2xldmVsOworCWludCByaWdodF9sZXZlbDsKKwlpbnQgbmV3X2xlZnRfbGV2ZWw7CisJaW50IG5ld19yaWdodF9sZXZlbDsKKworCXJpZ2h0X2xldmVsID0gKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4gODsKKwlsZWZ0X2xldmVsID0gdmFsdWUgJiAweDAwMDAwMGZmOworCWlmIChyaWdodF9sZXZlbCA+IDEwMCkgcmlnaHRfbGV2ZWwgPSAxMDA7CisJaWYgKGxlZnRfbGV2ZWwgPiAxMDApIGxlZnRfbGV2ZWwgPSAxMDA7CisgIAorCXN3aXRjaCAoY2hhbm5lbCkgeworCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwkJCXJpZ2h0X2xldmVsID0gdG9faGFybW9ueV9sZXZlbCgxMDAtcmlnaHRfbGV2ZWwsIE1BWF9PVVRQVVRfTEVWRUwpOworCQkJbGVmdF9sZXZlbCAgPSB0b19oYXJtb255X2xldmVsKDEwMC1sZWZ0X2xldmVsLCBNQVhfT1VUUFVUX0xFVkVMKTsKKwkJCW5ld19yaWdodF9sZXZlbCA9IHRvX29zc19sZXZlbChNQVhfT1VUUFVUX0xFVkVMIC0gcmlnaHRfbGV2ZWwsIE1BWF9PVVRQVVRfTEVWRUwpOworCQkJbmV3X2xlZnRfbGV2ZWwgID0gdG9fb3NzX2xldmVsKE1BWF9PVVRQVVRfTEVWRUwgLSBsZWZ0X2xldmVsLCBNQVhfT1VUUFVUX0xFVkVMKTsKKwkJCWhhcm1vbnkuY3VycmVudF9nYWluID0gKGhhcm1vbnkuY3VycmVudF9nYWluICYgfihHQUlOX0xPX01BU0sgfCBHQUlOX1JPX01BU0spKSAKKwkJCQkJfCAobGVmdF9sZXZlbCA8PCBHQUlOX0xPX1NISUZUKSB8IChyaWdodF9sZXZlbCA8PCBHQUlOX1JPX1NISUZUKTsKKwkJCWhhcm1vbnlfbWl4ZXJfc2V0X2dhaW4oKTsKKwkJCXJldHVybiAobmV3X3JpZ2h0X2xldmVsIDw8IDgpICsgbmV3X2xlZnRfbGV2ZWw7CisJCQkKKwkJY2FzZSBTT1VORF9NSVhFUl9JR0FJTjoKKwkJCXJpZ2h0X2xldmVsID0gdG9faGFybW9ueV9sZXZlbChyaWdodF9sZXZlbCwgTUFYX0lOUFVUX0xFVkVMKTsKKwkJCWxlZnRfbGV2ZWwgID0gdG9faGFybW9ueV9sZXZlbChsZWZ0X2xldmVsLCBNQVhfSU5QVVRfTEVWRUwpOworCQkJbmV3X3JpZ2h0X2xldmVsID0gdG9fb3NzX2xldmVsKHJpZ2h0X2xldmVsLCBNQVhfSU5QVVRfTEVWRUwpOworCQkJbmV3X2xlZnRfbGV2ZWwgID0gdG9fb3NzX2xldmVsKGxlZnRfbGV2ZWwsIE1BWF9JTlBVVF9MRVZFTCk7CisJCQloYXJtb255LmN1cnJlbnRfZ2FpbiA9IChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIH4oR0FJTl9MSV9NQVNLIHwgR0FJTl9SSV9NQVNLKSkKKwkJCQkJfCAobGVmdF9sZXZlbCA8PCBHQUlOX0xJX1NISUZUKSB8IChyaWdodF9sZXZlbCA8PCBHQUlOX1JJX1NISUZUKTsKKwkJCWhhcm1vbnlfbWl4ZXJfc2V0X2dhaW4oKTsKKwkJCXJldHVybiAobmV3X3JpZ2h0X2xldmVsIDw8IDgpICsgbmV3X2xlZnRfbGV2ZWw7CisJCisJCWNhc2UgU09VTkRfTUlYRVJfTU9OSVRPUjoKKwkJCWxlZnRfbGV2ZWwgPSB0b19oYXJtb255X2xldmVsKDEwMC1sZWZ0X2xldmVsLCBNQVhfTU9OSVRPUl9MRVZFTCk7CisJCQluZXdfbGVmdF9sZXZlbCA9IHRvX29zc19sZXZlbChNQVhfTU9OSVRPUl9MRVZFTC1sZWZ0X2xldmVsLCBNQVhfTU9OSVRPUl9MRVZFTCk7CisJCQloYXJtb255LmN1cnJlbnRfZ2FpbiA9IChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIH5HQUlOX01BX01BU0spIHwgKGxlZnRfbGV2ZWwgPDwgR0FJTl9NQV9TSElGVCk7CisJCQloYXJtb255X21peGVyX3NldF9nYWluKCk7CisJCQlyZXR1cm4gKG5ld19sZWZ0X2xldmVsIDw8IDgpICsgbmV3X2xlZnRfbGV2ZWw7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyN1bmRlZiB0b19oYXJtb255X2xldmVsCisjdW5kZWYgdG9fb3NzX2xldmVsCisKKy8qIAorICogUmV0dXJuIHRoZSBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgKG1pYyBvciBsaW5lKQorICovCisKK3N0YXRpYyBpbnQgaGFybW9ueV9taXhlcl9nZXRfcmVjbWFzayh2b2lkKSAKK3sKKwlpbnQgY3VycmVudF9pbnB1dF9saW5lOworCQorCWN1cnJlbnRfaW5wdXRfbGluZSA9IChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIEdBSU5fSVNfTUFTSykgCisJCQkJICAgID4+IEdBSU5fSVNfU0hJRlQ7CisJaWYgKGN1cnJlbnRfaW5wdXRfbGluZSkgCisJCXJldHVybiBTT1VORF9NQVNLX01JQzsKKworCXJldHVybiBTT1VORF9NQVNLX0xJTkU7Cit9CisKKy8qCisgKiBTZXQgdGhlIGlucHV0IChvbmx5IG9uZSBhdCB0aW1lLCBhcmJpdHJhcnkgcHJpb3JpdHkgdG8gbGluZSBpbikKKyAqLworCitzdGF0aWMgaW50IGhhcm1vbnlfbWl4ZXJfc2V0X3JlY21hc2soaW50IHJlY21hc2spCit7CisJaW50IG5ld19pbnB1dF9saW5lOworCWludCBuZXdfaW5wdXRfbWFzazsKKwlpbnQgY3VycmVudF9pbnB1dF9saW5lOworCQorCWN1cnJlbnRfaW5wdXRfbGluZSA9IChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIEdBSU5fSVNfTUFTSykKKwkJCQkgICAgPj4gR0FJTl9JU19TSElGVDsKKwlpZiAoKGN1cnJlbnRfaW5wdXRfbGluZSAmJiAoKHJlY21hc2sgJiBTT1VORF9NQVNLX0xJTkUpIHx8ICEocmVjbWFzayAmIFNPVU5EX01BU0tfTUlDKSkpIHx8CisJCSghY3VycmVudF9pbnB1dF9saW5lICYmICgocmVjbWFzayAmIFNPVU5EX01BU0tfTElORSkgJiYgIShyZWNtYXNrICYgU09VTkRfTUFTS19NSUMpKSkpIHsKKwkJbmV3X2lucHV0X2xpbmUgPSAwOworCQluZXdfaW5wdXRfbWFzayA9IFNPVU5EX01BU0tfTElORTsKKwl9IGVsc2UgeworCQluZXdfaW5wdXRfbGluZSA9IDE7CisJCW5ld19pbnB1dF9tYXNrID0gU09VTkRfTUFTS19NSUM7CisJfQorCWhhcm1vbnkuY3VycmVudF9nYWluID0gKChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIH5HQUlOX0lTX01BU0spIHwgCisJCQkJKG5ld19pbnB1dF9saW5lIDw8IEdBSU5fSVNfU0hJRlQgKSk7CisJaGFybW9ueV9taXhlcl9zZXRfZ2FpbigpOworCXJldHVybiBuZXdfaW5wdXRfbWFzazsKK30KKworCisvKiAKKyAqIGdpdmUgdGhlIGFjdGl2ZSBvdXRsaW5lcworICovCisKK3N0YXRpYyBpbnQgaGFybW9ueV9taXhlcl9nZXRfb3V0bWFzayh2b2lkKQoreworCWludCBvdXRtYXNrID0gMDsKKwkKKwlpZiAoaGFybW9ueS5jdXJyZW50X2dhaW4gJiBHQUlOX1NFX01BU0spIG91dG1hc2sgfD0gTUFTS19JTlRFUk5BTDsKKwlpZiAoaGFybW9ueS5jdXJyZW50X2dhaW4gJiBHQUlOX0xFX01BU0spIG91dG1hc2sgfD0gTUFTS19MSU5FT1VUOworCWlmIChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIEdBSU5fSEVfTUFTSykgb3V0bWFzayB8PSBNQVNLX0hFQURQSE9ORVM7CisJCisJcmV0dXJuIG91dG1hc2s7Cit9CisKKworc3RhdGljIGludCBoYXJtb255X21peGVyX3NldF9vdXRtYXNrKGludCBvdXRtYXNrKQoreworCWlmIChvdXRtYXNrICYgTUFTS19JTlRFUk5BTCkgCisJCWhhcm1vbnkuY3VycmVudF9nYWluIHw9IEdBSU5fU0VfTUFTSzsKKwllbHNlIAorCQloYXJtb255LmN1cnJlbnRfZ2FpbiAmPSB+R0FJTl9TRV9NQVNLOworCQorCWlmIChvdXRtYXNrICYgTUFTS19MSU5FT1VUKSAKKwkJaGFybW9ueS5jdXJyZW50X2dhaW4gfD0gR0FJTl9MRV9NQVNLOworCWVsc2UgCisJCWhhcm1vbnkuY3VycmVudF9nYWluICY9IH5HQUlOX0xFX01BU0s7CisJCisJaWYgKG91dG1hc2sgJiBNQVNLX0hFQURQSE9ORVMpIAorCQloYXJtb255LmN1cnJlbnRfZ2FpbiB8PSBHQUlOX0hFX01BU0s7IAorCWVsc2UgCisJCWhhcm1vbnkuY3VycmVudF9nYWluICY9IH5HQUlOX0hFX01BU0s7CisJCisJaGFybW9ueV9taXhlcl9zZXRfZ2FpbigpOworCisJcmV0dXJuIChvdXRtYXNrICYgKE1BU0tfSU5URVJOQUwgfCBNQVNLX0xJTkVPVVQgfCBNQVNLX0hFQURQSE9ORVMpKTsKK30KKworLyoKKyAqIFRoaXMgY29kZSBpcyBpbnNwaXJlZCBmcm9tIHNiX21peGVyLmMKKyAqLworCitzdGF0aWMgaW50IGhhcm1vbnlfbWl4ZXJfaW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHZhbDsKKwlpbnQgcmV0OworCisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCW1peGVyX2luZm8gaW5mbzsKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICAgICAgICAgICAgICAgIHN0cm5jcHkoaW5mby5pZCwgImhhcm1vbnkiLCBzaXplb2YoaW5mby5pZCktMSk7CisgICAgICAgICAgICAgICAgc3RybmNweShpbmZvLm5hbWUsICJIYXJtb255IGF1ZGlvIiwgc2l6ZW9mKGluZm8ubmFtZSktMSk7CisgICAgICAgICAgICAgICAgaW5mby5tb2RpZnlfY291bnRlciA9IDE7IC8qID8gKi8KKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJCisJaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKilhcmcpOworCisJLyogcmVhZCAqLworCXZhbCA9IDA7CisJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpCisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9DQVBTKToKKwkJcmV0ID0gU09VTkRfQ0FQX0VYQ0xfSU5QVVQ7CisJCWJyZWFrOworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9TVEVSRU9ERVZTKToKKwkJcmV0ID0gU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX0lHQUlOOworCQlicmVhazsKKwkJCisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JFQ01BU0spOgorCQlyZXQgPSBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfTElORTsKKwkJYnJlYWs7CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0RFVk1BU0spOgorCQlyZXQgPSBTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfSUdBSU4gfAorCQkJU09VTkRfTUFTS19NT05JVE9SOworCQlicmVhazsKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfT1VUTUFTSyk6CisJCXJldCA9IE1BU0tfSU5URVJOQUwgfCBNQVNLX0xJTkVPVVQgfAorCQkJTUFTS19IRUFEUEhPTkVTOworCQlicmVhazsKKwkJCisJY2FzZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl9SRUNTUkMpOgorCQlyZXQgPSBoYXJtb255X21peGVyX3NldF9yZWNtYXNrKHZhbCk7CisJCWJyZWFrOworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9SRUNTUkMpOgorCQlyZXQgPSBoYXJtb255X21peGVyX2dldF9yZWNtYXNrKCk7CisJCWJyZWFrOworCSAgICAgIAorCWNhc2UgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfT1VUU1JDKToKKwkJcmV0ID0gaGFybW9ueV9taXhlcl9zZXRfb3V0bWFzayh2YWwpOworCQlicmVhazsKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfT1VUU1JDKToKKwkJcmV0ID0gaGFybW9ueV9taXhlcl9nZXRfb3V0bWFzaygpOworCQlicmVhazsKKwkKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1ZPTFVNRSk6CisJY2FzZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl9JR0FJTik6CisJY2FzZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl9NT05JVE9SKToKKwkJcmV0ID0gaGFybW9ueV9taXhlcl9zZXRfbGV2ZWwoY21kICYgMHhmZiwgdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfVk9MVU1FKToKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfSUdBSU4pOgorCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9NT05JVE9SKToKKwkJcmV0ID0gaGFybW9ueV9taXhlcl9nZXRfbGV2ZWwoY21kICYgMHhmZik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHB1dF91c2VyKHJldCwgKGludCAqKWFyZykpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaGFybW9ueV9taXhlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChoYXJtb255Lm1peGVyX29wZW4pIAorCQlyZXR1cm4gLUVCVVNZOworCWhhcm1vbnkubWl4ZXJfb3BlbiA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFybW9ueV9taXhlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghaGFybW9ueS5taXhlcl9vcGVuKSAKKwkJcmV0dXJuIC1FQlVTWTsKKwloYXJtb255Lm1peGVyX29wZW4gPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoYXJtb255X21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5vcGVuCQk9IGhhcm1vbnlfbWl4ZXJfb3BlbiwKKwkucmVsZWFzZQk9IGhhcm1vbnlfbWl4ZXJfcmVsZWFzZSwKKwkuaW9jdGwJCT0gaGFybW9ueV9taXhlcl9pb2N0bCwKK307CisKKworLyoKKyAqIE11dGUgYWxsIHRoZSBvdXRwdXQgYW5kIHJlc2V0IEhhcm1vbnkuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGhhcm1vbnlfbWl4ZXJfcmVzZXQodm9pZCkKK3sKKwloYXJtb255LmN1cnJlbnRfZ2FpbiA9IEdBSU5fVE9UQUxfU0lMRU5DRTsKKwloYXJtb255X21peGVyX3NldF9nYWluKCk7CisJaGFybW9ueV93YWl0X0NOVEwoKTsKKwlnc2Nfd3JpdGVsKDEsICZoYXJtb255LmhwYS0+cmVzZXQpOworCW1kZWxheSg1MCk7CQkvKiB3YWl0IDUwIG1zICovCisJZ3NjX3dyaXRlbCgwLCAmaGFybW9ueS5ocGEtPnJlc2V0KTsKKwloYXJtb255LmN1cnJlbnRfZ2FpbiA9IEdBSU5fREVGQVVMVDsKKwloYXJtb255X21peGVyX3NldF9nYWluKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGhhcm1vbnlfbWl4ZXJfaW5pdCh2b2lkKQoreworCS8qIFJlZ2lzdGVyIHRoZSBkZXZpY2UgZmlsZSBvcGVyYXRpb25zICovCisJaGFybW9ueS5taXhlcl91bml0ID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmhhcm1vbnlfbWl4ZXJfZm9wcywgLTEpOworCWlmIChoYXJtb255Lm1peGVyX3VuaXQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJFcnJvciBSZWdpc3RlcmluZyBNaXhlciBEcml2ZXJcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisgIAorCWhhcm1vbnlfbWl4ZXJfcmVzZXQoKTsKKwloYXJtb255Lm1peGVyX29wZW4gPSAwOworCQorCXJldHVybiAwOworfQorCisKKworLyogCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayB0aGF0J3MgY2FsbGVkIGJ5IHRoZSBpbnZlbnRvcnkgaGFyZHdhcmUgY29kZSAKKyAqIGlmIGl0IGZpbmRzIGEgbWF0Y2ggdG8gdGhlIHJlZ2lzdGVyZWQgZHJpdmVyLiAKKyAqLworc3RhdGljIGludCBfX2RldmluaXQKK2hhcm1vbnlfZHJpdmVyX3Byb2JlKHN0cnVjdCBwYXJpc2NfZGV2aWNlICpkZXYpCit7CisJdTgJaWQ7CisJdTgJcmV2OworCXUzMgljbnRsOworCWludAlyZXQ7CisKKwlpZiAoaGFybW9ueS5ocGEpIHsKKwkJLyogV2Ugb25seSBzdXBwb3J0IG9uZSBIYXJtb255IGF0IHRoaXMgdGltZSAqLworCQlwcmludGsoS0VSTl9FUlIgUEZYICJkcml2ZXIgYWxyZWFkeSByZWdpc3RlcmVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoIWRldi0+aXJxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIGlycSBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNldCB0aGUgSFBBIG9mIGhhcm1vbnkgKi8KKwloYXJtb255LmhwYSA9IChzdHJ1Y3QgaGFybW9ueV9ocGEgKilkZXYtPmhwYTsKKwloYXJtb255LmRldiA9IGRldjsKKworCS8qIEdyYWIgdGhlIElEIGFuZCByZXZpc2lvbiBmcm9tIHRoZSBkZXZpY2UgKi8KKwlpZCA9IGdzY19yZWFkYigmaGFybW9ueS5ocGEtPmlkKTsKKwlpZiAoKGlkIHwgMSkgIT0gMHgxNSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAid3JvbmcgaGFybW9ueSBpZCAweCUwMnhcbiIsIGlkKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY250bCA9IGdzY19yZWFkbCgmaGFybW9ueS5ocGEtPmNudGwpOworCXJldiA9IChjbnRsPj4yMCkgJiAweGZmOworCisJcHJpbnRrKEtFUk5fSU5GTyAiTGFzaSBIYXJtb255IEF1ZGlvIGRyaXZlciAiIEhBUk1PTllfVkVSU0lPTiAiLCAiCisJCQkiaC93IGlkICVpLCByZXYuICVpIGF0IDB4JWx4LCBJUlEgJWlcbiIsCisJCQlpZCwgcmV2LCBkZXYtPmhwYSwgaGFybW9ueS5kZXYtPmlycSk7CisJCisJLyogTWFrZSBzdXJlIHRoZSBjb250cm9sIGJpdCBpc24ndCBzZXQsIGFsdGhvdWdoIEkgZG9uJ3QgdGhpbmsgaXQgCisJICAgZXZlciBpcy4gKi8KKwlpZiAoY250bCAmIENOVExfQykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiQ05UTCBidXN5XG4iKTsKKwkJaGFybW9ueS5ocGEgPSAwOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIG1lbW9yeSBidWZmZXJzICovCisJaWYgKGhhcm1vbnlfYWxsb2NfYnVmZmVyKCZwbGF5ZWRfYnVmLCBNQVhfQlVGUykgfHwgCisJICAgIGhhcm1vbnlfYWxsb2NfYnVmZmVyKCZyZWNvcmRlZF9idWYsIE1BWF9CVUZTKSB8fAorCSAgICBoYXJtb255X2FsbG9jX2J1ZmZlcigmZ3JhdmV5YXJkLCAxKSB8fAorCSAgICBoYXJtb255X2FsbG9jX2J1ZmZlcigmc2lsZW50LCAxKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiBJbml0aWFsaXplIC9kZXYvbWl4ZXIgYW5kIC9kZXYvYXVkaW8gICovCisJaWYgKChyZXQ9aGFybW9ueV9taXhlcl9pbml0KCkpKSAKKwkJZ290byBvdXRfZXJyOworCWlmICgocmV0PWhhcm1vbnlfYXVkaW9faW5pdCgpKSkgCisJCWdvdG8gb3V0X2VycjsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCWhhcm1vbnkuaHBhID0gMDsKKwloYXJtb255X2ZyZWVfYnVmZmVyKCZwbGF5ZWRfYnVmKTsKKwloYXJtb255X2ZyZWVfYnVmZmVyKCZyZWNvcmRlZF9idWYpOworCWhhcm1vbnlfZnJlZV9idWZmZXIoJmdyYXZleWFyZCk7CisJaGFybW9ueV9mcmVlX2J1ZmZlcigmc2lsZW50KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGFyaXNjX2RldmljZV9pZCBoYXJtb255X3RibFtdID0geworIC8qIHsgSFBIV19GSU8sIEhWRVJTSU9OX1JFVl9BTllfSUQsIEhWRVJTSU9OX0FOWV9JRCwgMHgwMDA3QSB9LCBCdXNobWFzdGVyL0Zsb3VuZGVyICovCisgeyBIUEhXX0ZJTywgSFZFUlNJT05fUkVWX0FOWV9JRCwgSFZFUlNJT05fQU5ZX0lELCAweDAwMDdCIH0sIC8qIDcxMi83MTUgQXVkaW8gKi8KKyB7IEhQSFdfRklPLCBIVkVSU0lPTl9SRVZfQU5ZX0lELCBIVkVSU0lPTl9BTllfSUQsIDB4MDAwN0UgfSwgLyogUGFjZSBBdWRpbyAqLworIHsgSFBIV19GSU8sIEhWRVJTSU9OX1JFVl9BTllfSUQsIEhWRVJTSU9OX0FOWV9JRCwgMHgwMDA3RiB9LCAvKiBPdXRmaWVsZCAvIENvcmFsIElJICovCisgeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBhcmlzYywgaGFybW9ueV90YmwpOworCitzdGF0aWMgc3RydWN0IHBhcmlzY19kcml2ZXIgaGFybW9ueV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIkxhc2kgSGFybW9ueSIsCisJLmlkX3RhYmxlCT0gaGFybW9ueV90YmwsCisJLnByb2JlCQk9IGhhcm1vbnlfZHJpdmVyX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9oYXJtb255KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3BhcmlzY19kcml2ZXIoJmhhcm1vbnlfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfaGFybW9ueSh2b2lkKQoreworCWZyZWVfaXJxKGhhcm1vbnkuZGV2LT5pcnEsICZoYXJtb255KTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGhhcm1vbnkubWl4ZXJfdW5pdCk7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoaGFybW9ueS5kc3BfdW5pdCk7CisJaGFybW9ueV9mcmVlX2J1ZmZlcigmcGxheWVkX2J1Zik7CisJaGFybW9ueV9mcmVlX2J1ZmZlcigmcmVjb3JkZWRfYnVmKTsKKwloYXJtb255X2ZyZWVfYnVmZmVyKCZncmF2ZXlhcmQpOworCWhhcm1vbnlfZnJlZV9idWZmZXIoJnNpbGVudCk7CisJdW5yZWdpc3Rlcl9wYXJpc2NfZHJpdmVyKCZoYXJtb255X2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUigiQWxleCBEZVZyaWVzIDxhbGV4QG9uZWZpc2h0d28uY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhcm1vbnkgc291bmQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfaGFybW9ueSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2hhcm1vbnkpOworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvaGV4MmhleC5jIGIvc291bmQvb3NzL2hleDJoZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDYwZmFhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2hleDJoZXguYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIGhleDJoZXggcmVhZHMgc3RkaW4gaW4gSW50ZWwgSEVYIGZvcm1hdCBhbmQgcHJvZHVjZXMgYW4KKyAqICh1bnNpZ25lZCBjaGFyKSBhcnJheSB3aGljaCBjb250YWlucyB0aGUgYnl0ZXMgYW5kIHdyaXRlcyBpdAorICogdG8gc3Rkb3V0IHVzaW5nIEMgc3ludGF4CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgQUJBTkRPTih3aHkpIHsgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgd2h5KTsgZXhpdCgxKTsgfQorI2RlZmluZSBNQVhfU0laRSAoMjU2KjEwMjQpCit1bnNpZ25lZCBjaGFyIGJ1ZltNQVhfU0laRV07CisKK2ludCBsb2FkaGV4KEZJTEUgKmluZiwgdW5zaWduZWQgY2hhciAqYnVmKQoreworCWludCBsPTAsIGMsIGk7CisKKwl3aGlsZSAoKGM9Z2V0YyhpbmYpKSE9RU9GKQorCXsKKwkJaWYgKGMgPT0gJzonKQkvKiBTeW5jIHdpdGggYmVnaW5uaW5nIG9mIGxpbmUgKi8KKwkJeworCQkJaW50IG4sIGNoZWNrOworCQkJdW5zaWduZWQgY2hhciBzdW07CisJCQlpbnQgYWRkcjsKKwkJCWludCBsaW5ldHlwZTsKKworCQkJaWYgKGZzY2FuZihpbmYsICIlMDJ4IiwgJm4pICE9IDEpCisJCQkgICBBQkFORE9OKCJGaWxlIGZvcm1hdCBlcnJvciIpOworCQkJc3VtID0gbjsKKworCQkJaWYgKGZzY2FuZihpbmYsICIlMDR4IiwgJmFkZHIpICE9IDEpCisJCQkgICBBQkFORE9OKCJGaWxlIGZvcm1hdCBlcnJvciIpOworCQkJc3VtICs9IGFkZHIvMjU2OworCQkJc3VtICs9IGFkZHIlMjU2OworCisJCQlpZiAoZnNjYW5mKGluZiwgIiUwMngiLCAmbGluZXR5cGUpICE9IDEpCisJCQkgICBBQkFORE9OKCJGaWxlIGZvcm1hdCBlcnJvciIpOworCQkJc3VtICs9IGxpbmV0eXBlOworCisJCQlpZiAobGluZXR5cGUgIT0gMCkKKwkJCSAgIGNvbnRpbnVlOworCisJCQlmb3IgKGk9MDtpPG47aSsrKQorCQkJeworCQkJCWlmIChmc2NhbmYoaW5mLCAiJTAyeCIsICZjKSAhPSAxKQorCQkJICAgCSAgIEFCQU5ET04oIkZpbGUgZm9ybWF0IGVycm9yIik7CisJCQkJaWYgKGFkZHIgPj0gTUFYX1NJWkUpCisJCQkJICAgQUJBTkRPTigiRmlsZSB0b28gbGFyZ2UiKTsKKwkJCQlidWZbYWRkcisrXSA9IGM7CisJCQkJaWYgKGFkZHIgPiBsKQorCQkJCSAgIGwgPSBhZGRyOworCQkJCXN1bSArPSBjOworCQkJfQorCisJCQlpZiAoZnNjYW5mKGluZiwgIiUwMngiLCAmY2hlY2spICE9IDEpCisJCQkgICBBQkFORE9OKCJGaWxlIGZvcm1hdCBlcnJvciIpOworCisJCQlzdW0gPSB+c3VtICsgMTsKKwkJCWlmIChjaGVjayAhPSBzdW0pCisJCQkgICBBQkFORE9OKCJMaW5lIGNoZWNrc3VtIGVycm9yIik7CisJCX0KKwl9CisKKwlyZXR1cm4gbDsKK30KKworaW50IG1haW4oIGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndiBbXSApCit7CisJY29uc3QgY2hhciAqIHZhcmxpbmU7CisJaW50IGksbDsKKwlpbnQgaWQ9MDsKKworCWlmKGFyZ3ZbMV0gJiYgc3RyY21wKGFyZ3ZbMV0sICItaSIpPT0wKQorCXsKKwkJYXJndisrOworCQlhcmdjLS07CisJCWlkPTE7CisJfQorCWlmKGFyZ3ZbMV09PU5VTEwpCisJeworCQlmcHJpbnRmKHN0ZGVyciwiaGV4MmhleDogWy1pXSBmaWxlbmFtZVxuIik7CisJCWV4aXQoMSk7CisJfQorCXZhcmxpbmUgPSBhcmd2WzFdOworCWwgPSBsb2FkaGV4KHN0ZGluLCBidWYpOworCisJcHJpbnRmKCIvKlxuICpcdCBDb21wdXRlciBnZW5lcmF0ZWQgZmlsZS4gRG8gbm90IGVkaXQuXG4gKi9cbiIpOworICAgICAgICBwcmludGYoInN0YXRpYyBpbnQgJXNfbGVuID0gJWQ7XG4iLCB2YXJsaW5lLCBsKTsKKwlwcmludGYoInN0YXRpYyB1bnNpZ25lZCBjaGFyICVzW10gJXMgPSB7XG4iLCB2YXJsaW5lLCBpZD8iX19pbml0ZGF0YSI6IiIpOworCisJZm9yIChpPTA7aTxsO2krKykKKwl7CisJCWlmIChpKSBwcmludGYoIiwiKTsKKwkJaWYgKGkgJiYgIShpICUgMTYpKSBwcmludGYoIlxuIik7CisJCXByaW50ZigiMHglMDJ4IiwgYnVmW2ldKTsKKwl9CisKKwlwcmludGYoIlxufTtcblxuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvaTgxMF9hdWRpby5jIGIvc291bmQvb3NzL2k4MTBfYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTlmNjY3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2k4MTBfYXVkaW8uYwpAQCAtMCwwICsxLDM2NTggQEAKKy8qCisgKglJbnRlbCBpODEwIGFuZCBmcmllbmRzIElDSCBkcml2ZXIgZm9yIExpbnV4CisgKglBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqICBCdWlsdCBmcm9tOgorICoJTG93IGxldmVsIGNvZGU6ICBaYWNoIEJyb3duIChvcmlnaW5hbCBub253b3JraW5nIGk4MTAgT1NTIGRyaXZlcikKKyAqCQkJIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4gKHdvcmtpbmcgQUxTQSBkcml2ZXIpCisgKgorICoJRnJhbWV3b3JrOiBUaG9tYXMgU2FpbGVyIDxzYWlsZXJAaWZlLmVlLmV0aHouY2g+CisgKglFeHRlbmRlZCBieTogWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+ICAKKyAqCQkJYW5kIG90aGVycy4uCisgKgorICogIEhhcmR3YXJlIFByb3ZpZGVkIEJ5OgorICoJQW5hbG9nIERldmljZXMgKEEgbWFqb3IgQUM5NyBjb2RlYyBtYWtlcikKKyAqCUludGVsIENvcnAgICh5b3UndmUgcHJvYmFibHkgaGVhcmQgb2YgdGhlbSBhbHJlYWR5KQorICoKKyAqICBBQzk3IGNsdWVzIGFuZCBhc3Npc3RhbmNlIHByb3ZpZGVkIGJ5CisgKglBbmFsb2cgRGV2aWNlcworICoJWmFjaCAnRnVmdScgQnJvd24KKyAqCUplZmYgR2FyemlrCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqCUludGVsIDgxMCB0aGVvcnkgb2Ygb3BlcmF0aW9uCisgKgorICoJVGhlIGNoaXBzZXQgcHJvdmlkZXMgdGhyZWUgRE1BIGNoYW5uZWxzIHRoYXQgdGFsayB0byBhbiBBQzk3CisgKglDT0RFQyAoQUM5NyBpcyBhIGRpZ2l0YWwvYW5hbG9nIG1peGVyIHN0YW5kYXJkKS4gQXQgaXRzIHNpbXBsZXN0CisgKgl5b3UgZ2V0IDQ4S2h6IGF1ZGlvIHdpdGggYmFzaWMgdm9sdW1lIGFuZCBtaXhlciBjb250cm9scy4gQXQgdGhlCisgKgliZXN0IHlvdSBnZXQgcmF0ZSBhZGFwdGlvbiBpbiB0aGUgY29kZWMuIFdlIHNldCB0aGUgY2FyZCB1cCBzbworICoJdGhhdCB3ZSBuZXZlciB0YWtlIGNvbXBsZXRpb24gaW50ZXJydXB0cyBidXQgaW5zdGVhZCBrZWVwIHRoZSBjYXJkCisgKgljaGFzaW5nIGl0cyB0YWlsIGFyb3VuZCBhIHJpbmcgYnVmZmVyLiBUaGlzIGlzIG5lZWRlZCBmb3IgbW1hcAorICoJbW9kZSBhdWRpbyBhbmQgaGFwcGVucyB0byB3b3JrIHJhdGhlciB3ZWxsIGZvciBub24tbW1hcCBtb2RlcyB0b28uCisgKgorICoJVGhlIGJvYXJkIGhhcyBvbmUgb3V0cHV0IGNoYW5uZWwgZm9yIFBDTSBhdWRpbyAoc3VwcG9ydGVkKSBhbmQKKyAqCWEgc3RlcmVvIGxpbmUgaW4gYW5kIG1vbm8gbWljcm9waG9uZSBpbnB1dC4gQWdhaW4gdGhlc2UgYXJlIG5vcm1hbGx5CisgKglsb2NrZWQgdG8gNDhLaHogb25seS4gUmlnaHQgbm93IHJlY29yZGluZyBpcyBub3QgZmluaXNoZWQuCisgKgorICoJVGhlcmUgaXMgbm8gbWlkaSBzdXBwb3J0LCBubyBzeW50aCBzdXBwb3J0LiBVc2UgdGltaWRpdHkuIFRvIGdldAorICoJZXNkIHdvcmtpbmcgeW91IG5lZWQgdG8gdXNlIGVzZCAtciA0ODAwMCBhcyBpdCB3b24ndCBwcm9iZSA0OEtIegorICoJYnkgZGVmYXVsdC4gbXBnMTIzIGNhbid0IGhhbmRsZSA0OEtoeiBvbmx5IGF1ZGlvIHNvIHVzZSB4bW1zLgorICoKKyAqCUZpeCBUaGUgU291bmQgT24gRGVsbAorICoKKyAqCU5vdCBldmVyeW9uZSB1c2VzIDQ4S0h6LiBXZSBrbm93IG9mIG5vIHdheSB0byBkZXRlY3QgdGhpcyByZWxpYWJseQorICoJYW5kIGNlcnRhaW5seSBub3QgdG8gZ2V0IHRoZSByaWdodCBkYXRhLiBJZiB5b3VyIGk4MTAgYXVkaW8gc291bmRzCisgKglzdHVwaWQgeW91IG1heSBuZWVkIHRvIGludmVzdGlnYXRlIG90aGVyIHNwZWVkcy4gQWNjb3JkaW5nIHRvIEFuYWxvZworICoJdGhleSB0ZW5kIHRvIHVzZSBhIDE0LjMxOE1IeiBjbG9jayB3aGljaCBnaXZlcyB5b3UgYSBiYXNlIHJhdGUgb2YKKyAqCTQxMTk0SHouCisgKgorICoJVGhpcyBpcyBhdmFpbGFibGUgdmlhIHRoZSAnZnRzb2RlbGw9MScgb3B0aW9uLiAKKyAqCisgKglJZiB5b3UgbmVlZCB0byBmb3JjZSBhIHNwZWNpZmljIHJhdGUgc2V0IHRoZSBjbG9ja2luZz0gb3B0aW9uCisgKgorICoJVGhpcyBkcml2ZXIgaXMgY3Vyc2VkLiAoQmVuIExhSGFpc2UpCisgKgorICogIElDSCAzIGNhdmVhdHMKKyAqCUludGVsIGVycmF0YSAjNyBmb3IgSUNIMyBJTy4gV2UgbmVlZCB0byBkaXNhYmxlIFNNSSBzdHVmZgorICoJd2hlbiBjb2RlYyBwcm9iaW5nLiBbTm90IFlldCBEb25lXQorICoKKyAqICBJQ0ggNCBjYXZlYXRzCisgKgorICoJVGhlIElDSDQgaGFzIHRoZSBmZWF0dXJlLCB0aGF0IHRoZSBjb2RlYyBJRCBkb2Vzbid0IGhhdmUgdG8gYmUgCisgKgljb25ncnVlbnQgd2l0aCB0aGUgSU8gY29ubmVjdGlvbi4KKyAqIAorICoJVGhlcmVmb3JlLCBmcm9tIGRyaXZlciB2ZXJzaW9uIDAuMjMgb24sIHRoZXJlIGlzIGEgImNvZGVjIElEIiA8LT4KKyAqCSJJTyByZWdpc3RlciBiYXNlIG9mZnNldCIgbWFwcGluZyAoY2FyZC0+YWM5N19pZF9tYXApIGZpZWxkLgorICogICAKKyAqCUp1ZXJnZW4gIkdlb3JnZSIgU2F3aW5za2kgKGpzYXcpIAorICovCisgCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIxLjAxIgorCisjZGVmaW5lIE1PRFVMT1AyKGEsIGIpICgoYSkgJiAoKGIpIC0gMSkpCisjZGVmaW5lIE1BU0tQMihhLCBiKSAoKGEpICYgfigoYikgLSAxKSkKKworc3RhdGljIGludCBmdHNvZGVsbDsKK3N0YXRpYyBpbnQgc3RyaWN0X2Nsb2NraW5nOworc3RhdGljIHVuc2lnbmVkIGludCBjbG9ja2luZzsKK3N0YXRpYyBpbnQgc3BkaWZfbG9ja2VkOworc3RhdGljIGludCBhYzk3X3F1aXJrID0gQUM5N19UVU5FX0RFRkFVTFQ7CisKKy8vI2RlZmluZSBERUJVRworLy8jZGVmaW5lIERFQlVHMgorLy8jZGVmaW5lIERFQlVHX0lOVEVSUlVQVFMKKy8vI2RlZmluZSBERUJVR19NTUFQCisvLyNkZWZpbmUgREVCVUdfTU1JTworCisjZGVmaW5lIEFEQ19SVU5OSU5HCTEKKyNkZWZpbmUgREFDX1JVTk5JTkcJMgorCisjZGVmaW5lIEk4MTBfRk1UXzE2QklUCTEKKyNkZWZpbmUgSTgxMF9GTVRfU1RFUkVPCTIKKyNkZWZpbmUgSTgxMF9GTVRfTUFTSwkzCisKKyNkZWZpbmUgU1BESUZfT04JMHgwMDA0CisjZGVmaW5lIFNVUlJfT04JCTB4MDAxMAorI2RlZmluZSBDRU5URVJfTEZFX09OCTB4MDAyMAorI2RlZmluZSBWT0xfTVVURUQJMHg4MDAwCisKKy8qIHRoZSA4MTAncyBhcnJheSBvZiBwb2ludGVycyB0byBkYXRhIGJ1ZmZlcnMgKi8KKworc3RydWN0IHNnX2l0ZW0geworI2RlZmluZSBCVVNBRERSX01BU0sJMHhGRkZGRkZGRQorCXUzMiBidXNhZGRyOwkKKyNkZWZpbmUgQ09OX0lPQyAJMHg4MDAwMDAwMCAvKiBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiAqLworI2RlZmluZSBDT05fQlVGUEFECTB4NDAwMDAwMDAgLyogcGFkIHVuZGVycnVuIHdpdGggbGFzdCBzYW1wbGUsIGVsc2UgMCAqLworI2RlZmluZSBDT05fQlVGTEVOX01BU0sJMHgwMDAwZmZmZiAvKiBidWZmZXIgbGVuZ3RoIGluIHNhbXBsZXMgKi8KKwl1MzIgY29udHJvbDsKK307CisKKy8qIGFuIGluc3RhbmNlIG9mIHRoZSBpODEwIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0dfTEVOIDMyCitzdHJ1Y3QgaTgxMF9jaGFubmVsIAoreworCS8qIHRoZXNlIHNnIGd1eXMgc2hvdWxkIHByb2JhYmx5IGJlIGFsbG9jYXRlZAorCSAgIHNlcGFyYXRlbHkgYXMgbm9jYWNoZS4gTXVzdCBiZSA4IGJ5dGUgYWxpZ25lZCAqLworCXN0cnVjdCBzZ19pdGVtIHNnW1NHX0xFTl07CS8qIDMyKjggKi8KKwl1MzIgb2Zmc2V0OwkJCS8qIDQgKi8KKwl1MzIgcG9ydDsJCQkvKiA0ICovCisJdTMyIHVzZWQ7CisJdTMyIG51bTsKK307CisKKy8qCisgKiB3ZSBoYXZlIDMgc2VwYXJhdGUgZG1hIGVuZ2luZXMuICBwY20gaW4sIHBjbSBvdXQsIGFuZCBtaWMuCisgKiBlYWNoIGRtYSBlbmdpbmUgaGFzIGNvbnRyb2xsaW5nIHJlZ2lzdGVycy4gIFRoZXNlIGdvb2Z5CisgKiBuYW1lcyBhcmUgZnJvbSB0aGUgZGF0YXNoZWV0LCBidXQgbWFrZSBpdCBlYXN5IHRvIHdyaXRlCisgKiBjb2RlIHdoaWxlIGxlYWZpbmcgdGhyb3VnaCBpdC4KKyAqCisgKiBJQ0g0IGhhcyA2IGRtYSBlbmdpbmVzLCBwY20gaW4sIHBjbSBvdXQsIG1pYywgcGNtIGluIDIsIAorICogbWljIGluIDIsIHMvcGRpZi4gICBPZiBzcGVjaWFsIGludGVyZXN0IGlzIHRoZSBmYWN0IHRoYXQKKyAqIHRoZSB1cHBlciAzIERNQSBlbmdpbmVzIG9uIHRoZSBJQ0g0ICptdXN0KiBiZSBhY2Nlc3NlZAorICogdmlhIG1taW8gYWNjZXNzIGluc3RlYWQgb2YgcGlvIGFjY2Vzcy4KKyAqLworCisjZGVmaW5lIEVOVU1fRU5HSU5FKFBSRSxESUcpIAkJCQkJCQkJCVwKK2VudW0gewkJCQkJCQkJCQkJCVwKKwlQUkUjI19CQVNFID0JMHgjI0RJRyMjMCwJCS8qIEJhc2UgQWRkcmVzcyAqLwkJCQlcCisJUFJFIyNfQkRCQVIgPQkweCMjRElHIyMwLAkJLyogQnVmZmVyIERlc2NyaXB0b3IgbGlzdCBCYXNlIEFkZHJlc3MgKi8JXAorCVBSRSMjX0NJViA9CTB4IyNESUcjIzQsCQkvKiBDdXJyZW50IEluZGV4IFZhbHVlICovCQkJXAorCVBSRSMjX0xWSSA9CTB4IyNESUcjIzUsCQkvKiBMYXN0IFZhbGlkIEluZGV4ICovCQkJCVwKKwlQUkUjI19TUiA9CTB4IyNESUcjIzYsCQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8JCQkJXAorCVBSRSMjX1BJQ0IgPQkweCMjRElHIyM4LAkJLyogUG9zaXRpb24gSW4gQ3VycmVudCBCdWZmZXIgKi8JCVwKKwlQUkUjI19QSVYgPQkweCMjRElHIyNhLAkJLyogUHJlZmV0Y2hlZCBJbmRleCBWYWx1ZSAqLwkJCVwKKwlQUkUjI19DUiA9CTB4IyNESUcjI2IJCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8JCQkJXAorfQorCitFTlVNX0VOR0lORShPRkYsMCk7CS8qIE9mZnNldHMgKi8KK0VOVU1fRU5HSU5FKFBJLDApOwkvKiBQQ00gSW4gKi8KK0VOVU1fRU5HSU5FKFBPLDEpOwkvKiBQQ00gT3V0ICovCitFTlVNX0VOR0lORShNQywyKTsJLyogTWljIEluICovCisKK2VudW0geworCUdMT0JfQ05UID0JMHgyYywJCQkvKiBHbG9iYWwgQ29udHJvbCAqLworCUdMT0JfU1RBID0gCTB4MzAsCQkJLyogR2xvYmFsIFN0YXR1cyAqLworCUNBUwkgPSAJMHgzNAkJCS8qIENvZGVjIFdyaXRlIFNlbWFwaG9yZSBSZWdpc3RlciAqLworfTsKKworRU5VTV9FTkdJTkUoTUMyLDQpOyAgICAgLyogTWljIEluIDIgKi8KK0VOVU1fRU5HSU5FKFBJMiw1KTsgICAgIC8qIFBDTSBJbiAyICovCitFTlVNX0VOR0lORShTUCw2KTsgICAgICAvKiBTL1BESUYgKi8KKworZW51bSB7CisJU0RNID0gICAgICAgICAgIDB4ODAgICAgICAgICAgICAgICAgICAgIC8qIFNEQVRBX0lOIE1hcCBSZWdpc3RlciAqLworfTsKKworLyogaW50ZXJydXB0cyBmb3IgYSBkbWEgZW5naW5lICovCisjZGVmaW5lIERNQV9JTlRfRklGTwkJKDE8PDQpICAvKiBmaWZvIHVuZGVyL292ZXIgZmxvdyAqLworI2RlZmluZSBETUFfSU5UX0NPTVBMRVRFCSgxPDwzKSAgLyogYnVmZmVyIHJlYWQvd3JpdGUgY29tcGxldGUgYW5kIGlvYyBzZXQgKi8KKyNkZWZpbmUgRE1BX0lOVF9MVkkJCSgxPDwyKSAgLyogbGFzdCB2YWxpZCBkb25lICovCisjZGVmaW5lIERNQV9JTlRfQ0VMVgkJKDE8PDEpICAvKiBsYXN0IHZhbGlkIGlzIGN1cnJlbnQgKi8KKyNkZWZpbmUgRE1BX0lOVF9EQ0gJCSgxKQkvKiBETUEgQ29udHJvbGxlciBIYWx0ZWQgKGhhcHBlbnMgb24gTFZJIGludGVycnVwdHMpICovCisjZGVmaW5lIERNQV9JTlRfTUFTSyAoRE1BX0lOVF9GSUZPfERNQV9JTlRfQ09NUExFVEV8RE1BX0lOVF9MVkkpCisKKy8qIGludGVycnVwdHMgZm9yIHRoZSB3aG9sZSBjaGlwICovCisjZGVmaW5lIElOVF9TRUMJCSgxPDwxMSkKKyNkZWZpbmUgSU5UX1BSSQkJKDE8PDEwKQorI2RlZmluZSBJTlRfTUMJCSgxPDw3KQorI2RlZmluZSBJTlRfUE8JCSgxPDw2KQorI2RlZmluZSBJTlRfUEkJCSgxPDw1KQorI2RlZmluZSBJTlRfTU8JCSgxPDwyKQorI2RlZmluZSBJTlRfTkkJCSgxPDwxKQorI2RlZmluZSBJTlRfR1BJCQkoMTw8MCkKKyNkZWZpbmUgSU5UX01BU0sgKElOVF9TRUN8SU5UX1BSSXxJTlRfTUN8SU5UX1BPfElOVF9QSXxJTlRfTU98SU5UX05JfElOVF9HUEkpCisKKy8qIG1hZ2ljIG51bWJlcnMgdG8gcHJvdGVjdCBvdXIgZGF0YSBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIEk4MTBfQ0FSRF9NQUdJQwkJMHg1MDcyNjk2RSAvKiAiUHJpbiIgKi8KKyNkZWZpbmUgSTgxMF9TVEFURV9NQUdJQwkweDYzNjU3MzczIC8qICJjZXNzIiAqLworI2RlZmluZSBJODEwX0RNQV9NQVNLCQkweGZmZmZmZmZmIC8qIERNQSBidWZmZXIgbWFzayBmb3IgcGNpX2FsbG9jX2NvbnNpc3QgKi8KKyNkZWZpbmUgTlJfSFdfQ0gJCTMKKworLyogbWF4aW51bSBudW1iZXIgb2YgQUM5NyBjb2RlY3MgY29ubmVjdGVkLCBBQzk3IDIuMCBkZWZpbmVkIDQgKi8KKyNkZWZpbmUgTlJfQUM5NyAgICAgICAgICAgICAgICAgNAorCisvKiBQbGVhc2Ugbm90ZSB0aGF0IGFuIDhiaXQgbW9ubyBzdHJlYW0gaXMgbm90IHZhbGlkIG9uIHRoaXMgY2FyZCwgeW91IG11c3QgaGF2ZSBhIDE2Yml0ICovCisvKiBzdHJlYW0gYXQgYSBtaW5pbXVtIGZvciB0aGlzIGNhcmQgdG8gYmUgaGFwcHkgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07CisvKiBTYW1wbGVzIGFyZSAxNmJpdCB2YWx1ZXMsIHNvIHdlIGFyZSBzaGlmdGluZyB0byBhIHdvcmQsIG5vdCB0byBhIGJ5dGUsIGhlbmNlIHNoaWZ0ICovCisvKiB2YWx1ZXMgYXJlIG9uZSBsZXNzIHRoYW4gbWlnaHQgYmUgZXhwZWN0ZWQgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2hpZnRbXSA9IHsgLTEsIDAsIDAsIDEgfTsKKworZW51bSB7CisJSUNIODI4MDFBQSA9IDAsCisJSUNIODI5MDFBQiwKKwlJTlRFTDQ0ME1YLAorCUlOVEVMSUNIMiwKKwlJTlRFTElDSDMsCisJSU5URUxJQ0g0LAorCUlOVEVMSUNINSwKKwlTSTcwMTIsCisJTlZJRElBX05GT1JDRSwKKwlBTUQ3NjgsCisJQU1EODExMQorfTsKKworc3RhdGljIGNoYXIgKiBjYXJkX25hbWVzW10gPSB7CisJIkludGVsIElDSCA4MjgwMUFBIiwKKwkiSW50ZWwgSUNIIDgyOTAxQUIiLAorCSJJbnRlbCA0NDBNWCIsCisJIkludGVsIElDSDIiLAorCSJJbnRlbCBJQ0gzIiwKKwkiSW50ZWwgSUNINCIsCisJIkludGVsIElDSDUiLAorCSJTaVMgNzAxMiIsCisJIk5WSURJQSBuRm9yY2UgQXVkaW8iLAorCSJBTUQgNzY4IiwKKwkiQU1ELTgxMTEgSU9IdWIiCit9OworCisvKiBUaGVzZSBhcmUgY2FwYWJpbGl0aWVzIChhbmQgYnVncykgdGhlIGNoaXBzZXRzIF9jYW5fIGhhdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludDE2X3QgICAgICBucl9hYzk3OworI2RlZmluZSBDQVBfTU1JTyAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIENBUF8yMEJJVF9BVURJT19TVVBQT1JUICAweDAwMDIKKwl1X2ludDE2X3QgZmxhZ3M7Cit9IGNhcmRfY2FwW10gPSB7CisJeyAgMSwgMHgwMDAwIH0sIC8qIElDSDgyODAxQUEgKi8KKwl7ICAxLCAweDAwMDAgfSwgLyogSUNIODI5MDFBQiAqLworCXsgIDEsIDB4MDAwMCB9LCAvKiBJTlRFTDQ0ME1YICovCisJeyAgMSwgMHgwMDAwIH0sIC8qIElOVEVMSUNIMiAqLworCXsgIDIsIDB4MDAwMCB9LCAvKiBJTlRFTElDSDMgKi8KKyAJeyAgMywgMHgwMDAzIH0sIC8qIElOVEVMSUNINCAqLworCXsgIDMsIDB4MDAwMyB9LCAvKiBJTlRFTElDSDUgKi8KKwkvKkBGSVhNRSB0byBiZSB2ZXJpZmllZCovCXsgIDIsIDB4MDAwMCB9LCAvKiBTSTcwMTIgKi8KKwkvKkBGSVhNRSB0byBiZSB2ZXJpZmllZCovCXsgIDIsIDB4MDAwMCB9LCAvKiBOVklESUFfTkZPUkNFICovCisJLypARklYTUUgdG8gYmUgdmVyaWZpZWQqLwl7ICAyLCAweDAwMDAgfSwgLyogQU1ENzY4ICovCisJLypARklYTUUgdG8gYmUgdmVyaWZpZWQqLwl7ICAzLCAweDAwMDEgfSwgLyogQU1EODExMSAqLworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGk4MTBfcGNpX3RibCBbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzUsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIElDSDgyODAxQUF9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUJfNSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSUNIODI5MDFBQn0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfNDQwTVgsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIElOVEVMNDQwTVh9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfNCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5URUxJQ0gyfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzUsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIElOVEVMSUNIM30sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl81LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBJTlRFTElDSDR9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfNSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5URUxJQ0g1fSwKKwl7UENJX1ZFTkRPUl9JRF9TSSwgUENJX0RFVklDRV9JRF9TSV83MDEyLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTSTcwMTJ9LAorCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTUNQMV9BVURJTywKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTlZJRElBX05GT1JDRX0sCisJe1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9NQ1AyX0FVRElPLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBOVklESUFfTkZPUkNFfSwKKwl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX01DUDNfQVVESU8sCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE5WSURJQV9ORk9SQ0V9LAorCXtQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfT1BVU183NDQ1LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBTUQ3Njh9LAorCXtQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfODExMV9BVURJTywKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQU1EODExMX0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfRVNCXzUsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIElOVEVMSUNINH0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xOCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5URUxJQ0g0fSwKKworCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgaTgxMF9wY2lfdGJsKTsKKworI2lmZGVmIENPTkZJR19QTQorI2RlZmluZSBQTV9TVVNQRU5ERUQoY2FyZCkgKGNhcmQtPnBtX3N1c3BlbmRlZCkKKyNlbHNlCisjZGVmaW5lIFBNX1NVU1BFTkRFRChjYXJkKSAoMCkKKyNlbmRpZgorCisvKiAic29mdHdhcmUiIG9yIHZpcnR1YWwgY2hhbm5lbCwgYW4gaW5zdGFuY2Ugb2Ygb3BlbmVkIC9kZXYvZHNwICovCitzdHJ1Y3QgaTgxMF9zdGF0ZSB7CisJdW5zaWduZWQgaW50IG1hZ2ljOworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQ7CS8qIENhcmQgaW5mbyAqLworCisJLyogc2luZ2xlIG9wZW4gbG9jayBtZWNoYW5pc20sIG9ubHkgdXNlZCBmb3IgcmVjb3JkaW5nICovCisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwkvKiBmaWxlIG1vZGUgKi8KKwltb2RlX3Qgb3Blbl9tb2RlOworCisJLyogdmlydHVhbCBjaGFubmVsIG51bWJlciAqLworCWludCB2aXJ0OworCisjaWZkZWYgQ09ORklHX1BNCisJdW5zaWduZWQgaW50IHBtX3NhdmVkX2RhY19yYXRlLHBtX3NhdmVkX2FkY19yYXRlOworI2VuZGlmCisJc3RydWN0IGRtYWJ1ZiB7CisJCS8qIHdhdmUgc2FtcGxlIHN0dWZmICovCisJCXVuc2lnbmVkIGludCByYXRlOworCQl1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlLCB0cmlnZ2VyOworCisJCS8qIGhhcmR3YXJlIGNoYW5uZWwgKi8KKwkJc3RydWN0IGk4MTBfY2hhbm5lbCAqcmVhZF9jaGFubmVsOworCQlzdHJ1Y3QgaTgxMF9jaGFubmVsICp3cml0ZV9jaGFubmVsOworCisJCS8qIE9TUyBidWZmZXIgbWFuYWdlbWVudCBzdHVmZiAqLworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwkJdW5zaWduZWQgYnVmb3JkZXI7CisJCXVuc2lnbmVkIG51bWZyYWc7CisJCXVuc2lnbmVkIGZyYWdzaGlmdDsKKworCQkvKiBvdXIgYnVmZmVyIGFjdHMgbGlrZSBhIGNpcmN1bGFyIHJpbmcgKi8KKwkJdW5zaWduZWQgaHdwdHI7CQkvKiB3aGVyZSBkbWEgbGFzdCBzdGFydGVkLCB1cGRhdGVkIGJ5IHVwZGF0ZV9wdHIgKi8KKwkJdW5zaWduZWQgc3dwdHI7CQkvKiB3aGVyZSBkcml2ZXIgbGFzdCBjbGVhci9maWxsZWQsIHVwZGF0ZWQgYnkgcmVhZC93cml0ZSAqLworCQlpbnQgY291bnQ7CQkvKiBieXRlcyB0byBiZSBjb25zdW1lZCBvciBiZWVuIGdlbmVyYXRlZCBieSBkbWEgbWFjaGluZSAqLworCQl1bnNpZ25lZCB0b3RhbF9ieXRlczsJLyogdG90YWwgYnl0ZXMgZG1hZWQgYnkgaGFyZHdhcmUgKi8KKworCQl1bnNpZ25lZCBlcnJvcjsJCS8qIG51bWJlciBvZiBvdmVyL3VuZGVycnVucyAqLworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwkvKiBwdXQgcHJvY2VzcyBvbiB3YWl0IHF1ZXVlIHdoZW4gbm8gbW9yZSBzcGFjZSBpbiBidWZmZXIgKi8KKworCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCisJCS8qIHdoYXQgdGhlIGhhcmR3YXJlIHVzZXMgKi8KKwkJdW5zaWduZWQgZG1hc2l6ZTsKKwkJdW5zaWduZWQgZnJhZ3NpemU7CisJCXVuc2lnbmVkIGZyYWdzYW1wbGVzOworCisJCS8qIHdoYXQgd2UgdGVsbCB0aGUgdXNlciB0byBleHBlY3QgKi8KKwkJdW5zaWduZWQgdXNlcmZyYWdzOworCQl1bnNpZ25lZCB1c2VyZnJhZ3NpemU7CisKKwkJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIG1hcHBlZDoxOworCQl1bnNpZ25lZCByZWFkeToxOworCQl1bnNpZ25lZCB1cGRhdGVfZmxhZzsKKwkJdW5zaWduZWQgb3NzZnJhZ3NpemU7CisJCXVuc2lnbmVkIG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwl9IGRtYWJ1ZjsKK307CisKKworc3RydWN0IGk4MTBfY2FyZCB7CisJdW5zaWduZWQgaW50IG1hZ2ljOworCisJLyogV2Uga2VlcCBpODEwIGNhcmRzIGluIGEgbGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3QgaTgxMF9jYXJkICpuZXh0OworCisJLyogVGhlIGk4MTAgaGFzIGEgY2VydGFpbiBhbW91bnQgb2YgY3Jvc3MgY2hhbm5lbCBpbnRlcmFjdGlvbgorCSAgIHNvIHdlIHVzZSBhIHNpbmdsZSBwZXIgY2FyZCBsb2NrICovCisJc3BpbmxvY2tfdCBsb2NrOworCQorCS8qIENvbnRyb2wgQUM5NyBhY2Nlc3Mgc2VyaWFsaXphdGlvbiAqLworCXNwaW5sb2NrX3QgYWM5N19sb2NrOworCisJLyogUENJIGRldmljZSBzdHVmZiAqLworCXN0cnVjdCBwY2lfZGV2ICogcGNpX2RldjsKKwl1MTYgcGNpX2lkOworCXUxNiBwY2lfaWRfaW50ZXJuYWw7IC8qIHVzZWQgdG8gYWNjZXNzIGNhcmRfY2FwW10gKi8KKyNpZmRlZiBDT05GSUdfUE0JCisJdTE2IHBtX3N1c3BlbmRlZDsKKwlpbnQgcG1fc2F2ZWRfbWl4ZXJfc2V0dGluZ3NbU09VTkRfTUlYRVJfTlJERVZJQ0VTXVtOUl9BQzk3XTsKKyNlbmRpZgorCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfYXVkaW87CisKKwkvKiBzdHJ1Y3R1cmVzIGZvciBhYnN0cmFjdGlvbiBvZiBoYXJkd2FyZSBmYWNpbGl0aWVzLCBjb2RlY3MsIGJhbmtzIGFuZCBjaGFubmVscyovCisJdTE2ICAgIGFjOTdfaWRfbWFwW05SX0FDOTddOworCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3X2NvZGVjW05SX0FDOTddOworCXN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZXNbTlJfSFdfQ0hdOworCXN0cnVjdCBpODEwX2NoYW5uZWwgKmNoYW5uZWw7CS8qIDE6MSB0byBzdGF0ZXNbXSBidXQgZGlmZi4gbGlmZXRpbWUgKi8KKwlkbWFfYWRkcl90IGNoYW5kbWE7CisKKwl1MTYgYWM5N19mZWF0dXJlczsKKwl1MTYgYWM5N19zdGF0dXM7CisJdTE2IGNoYW5uZWxzOworCQorCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXVuc2lnbmVkIGxvbmcgYWM5N2Jhc2U7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CisJdTMyIGlycTsKKworCXVuc2lnbmVkIGxvbmcgYWM5N2Jhc2VfbW1pb19waHlzOworCXVuc2lnbmVkIGxvbmcgaW9iYXNlX21taW9fcGh5czsKKwl1X2ludDhfdCBfX2lvbWVtICphYzk3YmFzZV9tbWlvOworCXVfaW50OF90IF9faW9tZW0gKmlvYmFzZV9tbWlvOworCisJaW50ICAgICAgICAgICB1c2VfbW1pbzsKKwkKKwkvKiBGdW5jdGlvbiBzdXBwb3J0ICovCisJc3RydWN0IGk4MTBfY2hhbm5lbCAqKCphbGxvY19wY21fY2hhbm5lbCkoc3RydWN0IGk4MTBfY2FyZCAqKTsKKwlzdHJ1Y3QgaTgxMF9jaGFubmVsICooKmFsbG9jX3JlY19wY21fY2hhbm5lbCkoc3RydWN0IGk4MTBfY2FyZCAqKTsKKwlzdHJ1Y3QgaTgxMF9jaGFubmVsICooKmFsbG9jX3JlY19taWNfY2hhbm5lbCkoc3RydWN0IGk4MTBfY2FyZCAqKTsKKwl2b2lkICgqZnJlZV9wY21fY2hhbm5lbCkoc3RydWN0IGk4MTBfY2FyZCAqLCBpbnQgY2hhbik7CisKKwkvKiBXZSBoYXZlIGEgKnZlcnkqIGxvbmcgaW5pdCB0aW1lIHBvc3NpYmx5LCBzbyB1c2UgdGhpcyB0byBibG9jayAqLworCS8qIGF0dGVtcHRzIHRvIG9wZW4gb3VyIGRldmljZXMgYmVmb3JlIHdlIGFyZSByZWFkeSAoc3RvcHMgb29wcydlcykgKi8KKwlpbnQgaW5pdGlhbGl6aW5nOworfTsKKworLyogZXh0cmFjdCByZWdpc3RlciBvZmZzZXQgZnJvbSBjb2RlYyBzdHJ1Y3QgKi8KKyNkZWZpbmUgSU9fUkVHX09GRihjb2RlYykgKCgoc3RydWN0IGk4MTBfY2FyZCAqKSBjb2RlYy0+cHJpdmF0ZV9kYXRhKS0+YWM5N19pZF9tYXBbY29kZWMtPmlkXSkKKworI2RlZmluZSBJODEwX0lPUkVBRChzaXplLCB0eXBlLCBjYXJkLCBvZmYpCQkJCVwKKyh7CQkJCQkJCQkJXAorCXR5cGUgdmFsOwkJCQkJCQlcCisJaWYgKGNhcmQtPnVzZV9tbWlvKQkJCQkJCVwKKwkJdmFsPXJlYWQjI3NpemUoY2FyZC0+aW9iYXNlX21taW8rb2ZmKTsJCQlcCisJZWxzZQkJCQkJCQkJXAorCQl2YWw9aW4jI3NpemUoY2FyZC0+aW9iYXNlK29mZik7CQkJCVwKKwl2YWw7CQkJCQkJCQlcCit9KQorCisjZGVmaW5lIEk4MTBfSU9SRUFETChjYXJkLCBvZmYpCQlJODEwX0lPUkVBRChsLCB1MzIsIGNhcmQsIG9mZikKKyNkZWZpbmUgSTgxMF9JT1JFQURXKGNhcmQsIG9mZikJCUk4MTBfSU9SRUFEKHcsIHUxNiwgY2FyZCwgb2ZmKQorI2RlZmluZSBJODEwX0lPUkVBREIoY2FyZCwgb2ZmKQkJSTgxMF9JT1JFQUQoYiwgdTgsICBjYXJkLCBvZmYpCisKKyNkZWZpbmUgSTgxMF9JT1dSSVRFKHNpemUsIHZhbCwgY2FyZCwgb2ZmKQkJCQlcCisoewkJCQkJCQkJCVwKKwlpZiAoY2FyZC0+dXNlX21taW8pCQkJCQkJXAorCQl3cml0ZSMjc2l6ZSh2YWwsIGNhcmQtPmlvYmFzZV9tbWlvK29mZik7CQlcCisJZWxzZQkJCQkJCQkJXAorCQlvdXQjI3NpemUodmFsLCBjYXJkLT5pb2Jhc2Urb2ZmKTsJCQlcCit9KQorCisjZGVmaW5lIEk4MTBfSU9XUklURUwodmFsLCBjYXJkLCBvZmYpCUk4MTBfSU9XUklURShsLCB2YWwsIGNhcmQsIG9mZikKKyNkZWZpbmUgSTgxMF9JT1dSSVRFVyh2YWwsIGNhcmQsIG9mZikJSTgxMF9JT1dSSVRFKHcsIHZhbCwgY2FyZCwgb2ZmKQorI2RlZmluZSBJODEwX0lPV1JJVEVCKHZhbCwgY2FyZCwgb2ZmKQlJODEwX0lPV1JJVEUoYiwgdmFsLCBjYXJkLCBvZmYpCisKKyNkZWZpbmUgR0VUX0NJVihjYXJkLCBwb3J0KSBNT0RVTE9QMihJODEwX0lPUkVBREIoKGNhcmQpLCAocG9ydCkgKyBPRkZfQ0lWKSwgU0dfTEVOKQorI2RlZmluZSBHRVRfTFZJKGNhcmQsIHBvcnQpIE1PRFVMT1AyKEk4MTBfSU9SRUFEQigoY2FyZCksIChwb3J0KSArIE9GRl9MVkkpLCBTR19MRU4pCisKKy8qIHNldCBMVkkgZnJvbSBDSVYgKi8KKyNkZWZpbmUgQ0lWX1RPX0xWSShjYXJkLCBwb3J0LCBvZmYpIFwKKwlJODEwX0lPV1JJVEVCKE1PRFVMT1AyKEdFVF9DSVYoKGNhcmQpLCAocG9ydCkpICsgKG9mZiksIFNHX0xFTiksIChjYXJkKSwgKHBvcnQpICsgT0ZGX0xWSSkKKworc3RhdGljIHN0cnVjdCBhYzk3X3F1aXJrIGFjOTdfcXVpcmtzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS52ZW5kb3IgPSAweDBlMTEsCisJCS5kZXZpY2UgPSAweDAwYjgsCisJCS5uYW1lID0gIkNvbXBhcSBFdm8gRDUxMEMiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwMjgsCisJCS5kZXZpY2UgPSAweDAwZDgsCisJCS5uYW1lID0gIkRlbGwgUHJlY2lzaW9uIDUzMCIsICAgLyogQUQxODg1ICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTAyOCwKKwkJLmRldmljZSA9IDB4MDEyNiwKKwkJLm5hbWUgPSAiRGVsbCBPcHRpcGxleCBHWDI2MCIsICAvKiBBRDE5ODFBICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTAyOCwKKwkJLmRldmljZSA9IDB4MDEyZCwKKwkJLm5hbWUgPSAiRGVsbCBQcmVjaXNpb24gNDUwIiwgICAvKiBBRDE5ODFCKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeyAgICAgICAvKiBGSVhNRTogd2hpY2ggY29kZWM/ICovCisJCS52ZW5kb3IgPSAweDEwM2MsCisJCS5kZXZpY2UgPSAweDAwYzMsCisJCS5uYW1lID0gIkhld2xldHQtUGFja2FyZCBvbmJvYXJkIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDNjLAorCQkuZGV2aWNlID0gMHgxMmYxLAorCQkubmFtZSA9ICJIUCB4dzgyMDAiLCAgICAvKiBBRDE5ODFCKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDNjLAorCQkuZGV2aWNlID0gMHgzMDA4LAorCQkubmFtZSA9ICJIUCB4dzQyMDAiLCAgICAvKiBBRDE5ODFCKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMGYxLAorCQkuZGV2aWNlID0gMHgyNjY1LAorCQkubmFtZSA9ICJGdWppdHN1LVNpZW1lbnMgQ2Vsc2l1cyIsICAgICAgLyogQUQxOTgxPyAqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwZjEsCisJCS5kZXZpY2UgPSAweDI4ODUsCisJCS5uYW1lID0gIkFNRDY0IE1vYm8iLCAgIC8qIEFMQzY1MCAqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDExMGEsCisJCS5kZXZpY2UgPSAweDAwNTYsCisJCS5uYW1lID0gIkZ1aml0c3UtU2llbWVucyBTY2VuaWMiLCAgICAgICAvKiBBRDE5ODE/ICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTFkNCwKKwkJLmRldmljZSA9IDB4NTM3NSwKKwkJLm5hbWUgPSAiQURJIEFEMTk4NSAoZGlzY3JldGUpIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxNDYyLAorCQkuZGV2aWNlID0gMHg1NDcwLAorCQkubmFtZSA9ICJNU0kgUDQgQVRYIDY0NSBVbHRyYSIsCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTczNCwKKwkJLmRldmljZSA9IDB4MDA4OCwKKwkJLm5hbWUgPSAiRnVqaXRzdS1TaWVtZW5zIEQxNTIyIiwJLyogQUQxOTgxICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4ODA4NiwKKwkJLmRldmljZSA9IDB4NDg1NiwKKwkJLm5hbWUgPSAiSW50ZWwgRDg0NVdOICg4MjgwMUJBKSIsCisJCS50eXBlID0gQUM5N19UVU5FX1NXQVBfSFAKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4ODA4NiwKKwkJLmRldmljZSA9IDB4NGQ0NCwKKwkJLm5hbWUgPSAiSW50ZWwgRDg1MEVNVjIiLCAgICAgICAvKiBBRDE4ODUgKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHg4MDg2LAorCQkuZGV2aWNlID0gMHg0ZDU2LAorCQkubmFtZSA9ICJJbnRlbCBJQ0gvQUQxODg1IiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDI4LAorCQkuZGV2aWNlID0gMHgwMTJkLAorCQkubmFtZSA9ICJEZWxsIFByZWNpc2lvbiA0NTAiLCAgIC8qIEFEMTk4MUIqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwM2MsCisJCS5kZXZpY2UgPSAweDMwMDgsCisJCS5uYW1lID0gIkhQIHh3NDIwMCIsICAgIC8qIEFEMTk4MUIqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwM2MsCisJCS5kZXZpY2UgPSAweDEyZjEsCisJCS5uYW1lID0gIkhQIHh3ODIwMCIsICAgIC8qIEFEMTk4MUIqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7IH0gLyogdGVybWluYXRvciAqLworfTsKKworc3RhdGljIHN0cnVjdCBpODEwX2NhcmQgKmRldnMgPSBOVUxMOworCitzdGF0aWMgaW50IGk4MTBfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBpODEwX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHUxNiBpODEwX2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZyk7CitzdGF0aWMgdm9pZCBpODEwX2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZywgdTE2IGRhdGEpOworc3RhdGljIHUxNiBpODEwX2FjOTdfZ2V0X21taW8oc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKTsKK3N0YXRpYyB2b2lkIGk4MTBfYWM5N19zZXRfbW1pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiBkYXRhKTsKK3N0YXRpYyB1MTYgaTgxMF9hYzk3X2dldF9pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcpOworc3RhdGljIHZvaWQgaTgxMF9hYzk3X3NldF9pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiBkYXRhKTsKKworc3RhdGljIHN0cnVjdCBpODEwX2NoYW5uZWwgKmk4MTBfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IGk4MTBfY2FyZCAqY2FyZCkKK3sKKwlpZihjYXJkLT5jaGFubmVsWzFdLnVzZWQ9PTEpCisJCXJldHVybiBOVUxMOworCWNhcmQtPmNoYW5uZWxbMV0udXNlZD0xOworCXJldHVybiAmY2FyZC0+Y2hhbm5lbFsxXTsKK30KKworc3RhdGljIHN0cnVjdCBpODEwX2NoYW5uZWwgKmk4MTBfYWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0cnVjdCBpODEwX2NhcmQgKmNhcmQpCit7CisJaWYoY2FyZC0+Y2hhbm5lbFswXS51c2VkPT0xKQorCQlyZXR1cm4gTlVMTDsKKwljYXJkLT5jaGFubmVsWzBdLnVzZWQ9MTsKKwlyZXR1cm4gJmNhcmQtPmNoYW5uZWxbMF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTgxMF9jaGFubmVsICppODEwX2FsbG9jX3JlY19taWNfY2hhbm5lbChzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkKQoreworCWlmKGNhcmQtPmNoYW5uZWxbMl0udXNlZD09MSkKKwkJcmV0dXJuIE5VTEw7CisJY2FyZC0+Y2hhbm5lbFsyXS51c2VkPTE7CisJcmV0dXJuICZjYXJkLT5jaGFubmVsWzJdOworfQorCitzdGF0aWMgdm9pZCBpODEwX2ZyZWVfcGNtX2NoYW5uZWwoc3RydWN0IGk4MTBfY2FyZCAqY2FyZCwgaW50IGNoYW5uZWwpCit7CisJY2FyZC0+Y2hhbm5lbFtjaGFubmVsXS51c2VkPTA7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF92YWxpZF9zcGRpZl9yYXRlICggc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCBpbnQgcmF0ZSApCit7CisJdW5zaWduZWQgbG9uZyBpZCA9IDBMOworCisJaWQgPSAoaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19WRU5ET1JfSUQxKSA8PCAxNik7CisJaWQgfD0gaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19WRU5ET1JfSUQyKSAmIDB4ZmZmZjsKKyNpZmRlZiBERUJVRworCXByaW50ayAoICJpODEwX2F1ZGlvOiBjb2RlYyA9ICVzLCBjb2RlY19pZCA9IDB4JTA4bHhcbiIsIGNvZGVjLT5uYW1lLCBpZCk7CisjZW5kaWYKKwlzd2l0Y2ggKCBpZCApIHsKKwkJY2FzZSAweDQxNDQ1MzYxOiAvKiBBRDE4ODYgKi8KKwkJCWlmIChyYXRlID09IDQ4MDAwKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogYWxsIG90aGVyIGNvZGVjcywgdW50aWwgd2Uga25vdyBvdGhlcndpYWUgKi8KKwkJCWlmIChyYXRlID09IDQ4MDAwIHx8IHJhdGUgPT0gNDQxMDAgfHwgcmF0ZSA9PSAzMjAwMCkgeworCQkJCXJldHVybiAxOworCQkJfQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qIGk4MTBfc2V0X3NwZGlmX291dHB1dAorICogCisgKiAgQ29uZmlndXJlIHRoZSBTL1BESUYgb3V0cHV0IHRyYW5zbWl0dGVyLiBXaGVuIHdlIHR1cm4gb24KKyAqICBTL1BESUYsIHdlIHR1cm4gb2ZmIHRoZSBhbmFsb2cgb3V0cHV0LiBUaGlzIG1heSBub3QgYmUKKyAqICB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uCisgKgorICogIEFzc3VtcHRpb25zOgorICogICAgIFRoZSBEU1Agc2FtcGxlIHJhdGUgbXVzdCBhbHJlYWR5IGJlIHNldCB0byBhIHN1cHBvcnRlZAorICogICAgIFMvUERJRiByYXRlICgzMmtIeiwgNDQuMWtIeiwgb3IgNDhrSHopIG9yIHdlIGFib3J0LgorICovCitzdGF0aWMgaW50IGk4MTBfc2V0X3NwZGlmX291dHB1dChzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUsIGludCBzbG90cywgaW50IHJhdGUpCit7CisJaW50CXZvbDsKKwlpbnQJYXVkX3JlZzsKKwlpbnQJciA9IDA7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gc3RhdGUtPmNhcmQtPmFjOTdfY29kZWNbMF07CisKKwlpZighY29kZWMtPmNvZGVjX29wcy0+ZGlnaXRhbCkgeworCQlzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJj0gflNQRElGX09OOworCX0gZWxzZSB7CisJCWlmICggc2xvdHMgPT0gLTEgKSB7IC8qIFR1cm4gb2ZmIFMvUERJRiAqLworCQkJY29kZWMtPmNvZGVjX29wcy0+ZGlnaXRhbChjb2RlYywgMCwgMCwgMCk7CisJCQkvKiBJZiB0aGUgdm9sdW1lIHdhc24ndCBtdXRlZCBiZWZvcmUgd2UgdHVybmVkIG9uIFMvUERJRiwgdW5tdXRlIGl0ICovCisJCQlpZiAoICEoc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICYgVk9MX01VVEVEKSApIHsKKwkJCQlhdWRfcmVnID0gaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTyk7CisJCQkJaTgxMF9hYzk3X3NldChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTywgKGF1ZF9yZWcgJiB+Vk9MX01VVEVEKSk7CisJCQl9CisJCQlzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJj0gfihWT0xfTVVURUQgfCBTUERJRl9PTik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXZvbCA9IGk4MTBfYWM5N19nZXQoY29kZWMsIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8pOworCQlzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgPSB2b2wgJiBWT0xfTVVURUQ7CisJCQorCQlyID0gY29kZWMtPmNvZGVjX29wcy0+ZGlnaXRhbChjb2RlYywgc2xvdHMsIHJhdGUsIDApOworCisJCWlmKHIpCisJCQlzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgfD0gU1BESUZfT047CisJCWVsc2UKKwkJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmPSB+U1BESUZfT047CisKKwkJLyogTXV0ZSB0aGUgYW5hbG9nIG91dHB1dCAqLworCQkvKiBTaG91bGQgdGhpcyBvbmx5IG11dGUgdGhlIFBDTSB2b2x1bWU/Pz8gKi8KKwkJaTgxMF9hYzk3X3NldChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTywgKHZvbCB8IFZPTF9NVVRFRCkpOworCX0KKwlyZXR1cm4gcjsKK30KKworLyogaTgxMF9zZXRfZGFjX2NoYW5uZWxzCisgKgorICogIENvbmZpZ3VyZSB0aGUgY29kZWMncyBtdWx0aS1jaGFubmVsIERBQ3MKKyAqCisgKiAgVGhlIGxvZ2ljIGlzIGJhY2t3YXJkcy4gU2V0dGluZyB0aGUgYml0IHRvIDEgdHVybnMgb2ZmIHRoZSBEQUMuIAorICoKKyAqICBXaGF0IGFib3V0IHRoZSBJQ0g/IFdlIGN1cnJlbnRseSBjb25maWd1cmUgaXQgdXNpbmcgdGhlCisgKiAgU05EQ1RMX0RTUF9DSEFOTkVMUyBpb2N0bC4gIElmIHdlJ3JlIHR1cm5uaW5nIG9uIHRoZSBEQUMsIAorICogIGRvZXMgdGhhdCBpbXBseSB0aGF0IHdlIHdhbnQgdGhlIElDSCBzZXQgdG8gc3VwcG9ydAorICogIHRoZXNlIGNoYW5uZWxzPworICogIAorICogIFRPRE86CisgKiAgICB2YWlsaWRhdGUgdGhhdCB0aGUgY29kZWMgcmVhbGx5IHN1cHBvcnRzIHRoZXNlIERBQ3MKKyAqICAgIGJlZm9yZSB0dXJuaW5nIHRoZW0gb24uIAorICovCitzdGF0aWMgdm9pZCBpODEwX3NldF9kYWNfY2hhbm5lbHMoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlLCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQJYXVkX3JlZzsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBzdGF0ZS0+Y2FyZC0+YWM5N19jb2RlY1swXTsKKwkKKwkvKiBObyBjb2RlYywgbm8gc2V0dXAgKi8KKwkKKwlpZihjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlhdWRfcmVnID0gaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCWF1ZF9yZWcgfD0gQUM5N19FQV9QUkkgfCBBQzk3X0VBX1BSSiB8IEFDOTdfRUFfUFJLOworCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmPSB+KFNVUlJfT04gfCBDRU5URVJfTEZFX09OKTsKKworCXN3aXRjaCAoIGNoYW5uZWwgKSB7CisJCWNhc2UgMjogLyogYWx3YXlzIGVuYWJsZWQgKi8KKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlhdWRfcmVnICY9IH5BQzk3X0VBX1BSSjsKKwkJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyB8PSBTVVJSX09OOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWF1ZF9yZWcgJj0gfihBQzk3X0VBX1BSSiB8IEFDOTdfRUFfUFJJIHwgQUM5N19FQV9QUkspOworCQkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzIHw9IFNVUlJfT04gfCBDRU5URVJfTEZFX09OOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJaTgxMF9hYzk3X3NldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIGF1ZF9yZWcpOworCit9CisKKworLyogc2V0IHBsYXliYWNrIHNhbXBsZSByYXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGk4MTBfc2V0X2RhY19yYXRlKHN0cnVjdCBpODEwX3N0YXRlICogc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQorewkKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1MzIgbmV3X3JhdGU7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjPXN0YXRlLT5jYXJkLT5hYzk3X2NvZGVjWzBdOworCQorCWlmKCEoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMmMHgwMDAxKSkKKwl7CisJCWRtYWJ1Zi0+cmF0ZSA9IGNsb2NraW5nOworI2lmZGVmIERFQlVHCisJCXByaW50aygiQXNrZWQgZm9yICVkIEh6LCBidXQgYWM5N19mZWF0dXJlcyBzYXlzIHdlIG9ubHkgZG8gJWRIei4gIFNvcnJ5IVxuIiwKKwkJICAgICAgIHJhdGUsY2xvY2tpbmcpOworI2VuZGlmCQkgICAgICAgCisJCXJldHVybiBjbG9ja2luZzsKKwl9CisJCQkKKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA4MDAwKQorCQlyYXRlID0gODAwMDsKKwlkbWFidWYtPnJhdGUgPSByYXRlOworCQkKKwkvKgorCSAqCUFkanVzdCBmb3IgbWlzY2xvY2tlZCBjcmFwCisJICovCisJcmF0ZSA9ICggcmF0ZSAqIGNsb2NraW5nKS80ODAwMDsKKwlpZihzdHJpY3RfY2xvY2tpbmcgJiYgcmF0ZSA8IDgwMDApIHsKKwkJcmF0ZSA9IDgwMDA7CisJCWRtYWJ1Zi0+cmF0ZSA9IChyYXRlICogNDgwMDApL2Nsb2NraW5nOworCX0KKworICAgICAgICBuZXdfcmF0ZT1hYzk3X3NldF9kYWNfcmF0ZShjb2RlYywgcmF0ZSk7CisJaWYobmV3X3JhdGUgIT0gcmF0ZSkgeworCQlkbWFidWYtPnJhdGUgPSAobmV3X3JhdGUgKiA0ODAwMCkvY2xvY2tpbmc7CisJfQorI2lmZGVmIERFQlVHCisJcHJpbnRrKCJpODEwX2F1ZGlvOiBjYWxsZWQgaTgxMF9zZXRfZGFjX3JhdGUgOiBhc2tlZCBmb3IgJWQsIGdvdCAlZFxuIiwgcmF0ZSwgZG1hYnVmLT5yYXRlKTsKKyNlbmRpZgorCXJhdGUgPSBuZXdfcmF0ZTsKKwlyZXR1cm4gZG1hYnVmLT5yYXRlOworfQorCisvKiBzZXQgcmVjb3JkaW5nIHNhbXBsZSByYXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGk4MTBfc2V0X2FkY19yYXRlKHN0cnVjdCBpODEwX3N0YXRlICogc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXUzMiBuZXdfcmF0ZTsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM9c3RhdGUtPmNhcmQtPmFjOTdfY29kZWNbMF07CisJCisJaWYoIShzdGF0ZS0+Y2FyZC0+YWM5N19mZWF0dXJlcyYweDAwMDEpKQorCXsKKwkJZG1hYnVmLT5yYXRlID0gY2xvY2tpbmc7CisJCXJldHVybiBjbG9ja2luZzsKKwl9CisJCQkKKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA4MDAwKQorCQlyYXRlID0gODAwMDsKKwlkbWFidWYtPnJhdGUgPSByYXRlOworCisJLyoKKwkgKglBZGp1c3QgZm9yIG1pc2Nsb2NrZWQgY3JhcAorCSAqLworCSAKKwlyYXRlID0gKCByYXRlICogY2xvY2tpbmcpLzQ4MDAwOworCWlmKHN0cmljdF9jbG9ja2luZyAmJiByYXRlIDwgODAwMCkgeworCQlyYXRlID0gODAwMDsKKwkJZG1hYnVmLT5yYXRlID0gKHJhdGUgKiA0ODAwMCkvY2xvY2tpbmc7CisJfQorCisJbmV3X3JhdGUgPSBhYzk3X3NldF9hZGNfcmF0ZShjb2RlYywgcmF0ZSk7CisJCisJaWYobmV3X3JhdGUgIT0gcmF0ZSkgeworCQlkbWFidWYtPnJhdGUgPSAobmV3X3JhdGUgKiA0ODAwMCkvY2xvY2tpbmc7CisJCXJhdGUgPSBuZXdfcmF0ZTsKKwl9CisjaWZkZWYgREVCVUcKKwlwcmludGsoImk4MTBfYXVkaW86IGNhbGxlZCBpODEwX3NldF9hZGNfcmF0ZSA6IHJhdGUgPSAlZC8lZFxuIiwgZG1hYnVmLT5yYXRlLCByYXRlKTsKKyNlbmRpZgorCXJldHVybiBkbWFidWYtPnJhdGU7Cit9CisKKy8qIGdldCBjdXJyZW50IHBsYXliYWNrL3JlY29yZGluZyBkbWEgYnVmZmVyIHBvaW50ZXIgKGJ5dGUgb2Zmc2V0IGZyb20gTEJBKSwKKyAgIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCisgICAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaTgxMF9nZXRfZG1hX2FkZHIoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlLCBpbnQgcmVjKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGludCBjaXYsIG9mZnNldCwgcG9ydCwgcG9ydF9waWNiLCBieXRlcyA9IDI7CisJCisJaWYgKCFkbWFidWYtPmVuYWJsZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocmVjKQorCQlwb3J0ID0gZG1hYnVmLT5yZWFkX2NoYW5uZWwtPnBvcnQ7CisJZWxzZQorCQlwb3J0ID0gZG1hYnVmLT53cml0ZV9jaGFubmVsLT5wb3J0OworCisJaWYoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1NJXzcwMTIpIHsKKwkJcG9ydF9waWNiID0gcG9ydCArIE9GRl9TUjsKKwkJYnl0ZXMgPSAxOworCX0gZWxzZQorCQlwb3J0X3BpY2IgPSBwb3J0ICsgT0ZGX1BJQ0I7CisKKwlkbyB7CisJCWNpdiA9IEdFVF9DSVYoc3RhdGUtPmNhcmQsIHBvcnQpOworCQlvZmZzZXQgPSBJODEwX0lPUkVBRFcoc3RhdGUtPmNhcmQsIHBvcnRfcGljYik7CisJCS8qIE11c3QgaGF2ZSBhIGRlbGF5IGhlcmUhICovIAorCQlpZihvZmZzZXQgPT0gMCkKKwkJCXVkZWxheSgxKTsKKwkJLyogUmVyZWFkIGJvdGggcmVnaXN0ZXJzIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGF0IHRvdGFsCisJCSAqIG9mZnNldCBmcm9tIHRoZSBmaXJzdCByZWFkaW5nIHRvIHRoZSBzZWNvbmQgaXMgMC4KKwkJICogVGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBTaVMgaGFyZHdhcmUgd2hlcmUgaXQgd2lsbCBjb3VudAorCQkgKiBwaWNiIGRvd24gdG8gMCwgdGhlbiB1cGRhdGUgY2l2IHRvIHRoZSBuZXh0IHZhbHVlLAorCQkgKiB0aGVuIHNldCB0aGUgbmV3IHBpY2IgdG8gZnJhZ3NpemUgYnl0ZXMuICBXZSBjYW4gY2F0Y2gKKwkJICogaXQgYmV0d2VlbiB0aGUgY2l2IHVwZGF0ZSBhbmQgdGhlIHBpY2IgdXBkYXRlLCBtYWtpbmcKKwkJICogaXQgbG9vayBhcyB0aG91Z2ggd2UgYXJlIDEgZnJhZ3NpemUgYWhlYWQgb2Ygd2hlcmUgd2UKKwkJICogYXJlLiAgVGhlIG5leHQgdG8gd2UgZ2V0IHRoZSBhZGRyZXNzIHRob3VnaCwgaXQgd2lsbAorCQkgKiBiZSBiYWNrIGluIHRoZSByaWdodCBwbGFjZSwgYW5kIHdlIHdpbGwgc3VkZGVubHkgdGhpbmsKKwkJICogd2UganVzdCB3ZW50IGZvcndhcmQgZG1hc2l6ZSAtIGZyYWdzaXplIGJ5dGVzLCBjYXVzaW5nCisJCSAqIHRvdGFsbHkgc3R1cGlkICpodWdlKiBkbWEgb3ZlcnJ1biBtZXNzYWdlcy4gIFdlIGFyZQorCQkgKiBhc3N1bWluZyB0aGF0IHRoZSAxdXMgZGVsYXkgaXMgbW9yZSB0aGFuIGxvbmcgZW5vdWdoCisJCSAqIHRoYXQgd2Ugd29uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgY2hpcCBzdGlsbCBiZWluZworCQkgKiBvdXQgb2Ygc3luYyB3aXRoIHJlYWxpdHkgOy0pCisJCSAqLworCX0gd2hpbGUgKGNpdiAhPSBHRVRfQ0lWKHN0YXRlLT5jYXJkLCBwb3J0KSB8fCBvZmZzZXQgIT0gSTgxMF9JT1JFQURXKHN0YXRlLT5jYXJkLCBwb3J0X3BpY2IpKTsKKwkJIAorCXJldHVybiAoKChjaXYgKyAxKSAqIGRtYWJ1Zi0+ZnJhZ3NpemUgLSAoYnl0ZXMgKiBvZmZzZXQpKQorCQklIGRtYWJ1Zi0+ZG1hc2l6ZSk7Cit9CisKKy8qIFN0b3AgcmVjb3JkaW5nIChsb2NrIGhlbGQpICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdG9wX2FkYyhzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCisJZG1hYnVmLT5lbmFibGUgJj0gfkFEQ19SVU5OSU5HOworCUk4MTBfSU9XUklURUIoMCwgY2FyZCwgUElfQ1IpOworCS8vIHdhaXQgZm9yIHRoZSBjYXJkIHRvIGFja25vd2xlZGdlIHNodXRkb3duCisJd2hpbGUoIEk4MTBfSU9SRUFEQihjYXJkLCBQSV9DUikgIT0gMCApIDsKKwkvLyBub3cgY2xlYXIgYW55IGxhdGVudCBpbnRlcnJ1cHQgYml0cyAobGlrZSB0aGUgaGFsdCBiaXQpCisJaWYoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxMikKKwkJSTgxMF9JT1dSSVRFQiggSTgxMF9JT1JFQURCKGNhcmQsIFBJX1BJQ0IpLCBjYXJkLCBQSV9QSUNCICk7CisJZWxzZQorCQlJODEwX0lPV1JJVEVCKCBJODEwX0lPUkVBREIoY2FyZCwgUElfU1IpLCBjYXJkLCBQSV9TUiApOworCUk4MTBfSU9XUklURUwoIEk4MTBfSU9SRUFETChjYXJkLCBHTE9CX1NUQSkgJiBJTlRfUEksIGNhcmQsIEdMT0JfU1RBKTsKK30KKworc3RhdGljIHZvaWQgc3RvcF9hZGMoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlfX3N0b3BfYWRjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N0YXJ0X2FkYyhzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisKKwlpZiAoZG1hYnVmLT5jb3VudCA8IGRtYWJ1Zi0+ZG1hc2l6ZSAmJiBkbWFidWYtPnJlYWR5ICYmICFkbWFidWYtPmVuYWJsZSAmJgorCSAgICAoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9JTlBVVCkpIHsKKwkJZG1hYnVmLT5lbmFibGUgfD0gQURDX1JVTk5JTkc7CisJCS8vIEludGVycnVwdCBlbmFibGUsIExWSSBlbmFibGUsIERNQSBlbmFibGUKKwkJSTgxMF9JT1dSSVRFQigweDEwIHwgMHgwNCB8IDB4MDEsIHN0YXRlLT5jYXJkLCBQSV9DUik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlfX3N0YXJ0X2FkYyhzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCisvKiBzdG9wIHBsYXliYWNrIChsb2NrIGhlbGQpICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdG9wX2RhYyhzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCisJZG1hYnVmLT5lbmFibGUgJj0gfkRBQ19SVU5OSU5HOworCUk4MTBfSU9XUklURUIoMCwgY2FyZCwgUE9fQ1IpOworCS8vIHdhaXQgZm9yIHRoZSBjYXJkIHRvIGFja25vd2xlZGdlIHNodXRkb3duCisJd2hpbGUoIEk4MTBfSU9SRUFEQihjYXJkLCBQT19DUikgIT0gMCApIDsKKwkvLyBub3cgY2xlYXIgYW55IGxhdGVudCBpbnRlcnJ1cHQgYml0cyAobGlrZSB0aGUgaGFsdCBiaXQpCisJaWYoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxMikKKwkJSTgxMF9JT1dSSVRFQiggSTgxMF9JT1JFQURCKGNhcmQsIFBPX1BJQ0IpLCBjYXJkLCBQT19QSUNCICk7CisJZWxzZQorCQlJODEwX0lPV1JJVEVCKCBJODEwX0lPUkVBREIoY2FyZCwgUE9fU1IpLCBjYXJkLCBQT19TUiApOworCUk4MTBfSU9XUklURUwoIEk4MTBfSU9SRUFETChjYXJkLCBHTE9CX1NUQSkgJiBJTlRfUE8sIGNhcmQsIEdMT0JfU1RBKTsKK30KKworc3RhdGljIHZvaWQgc3RvcF9kYWMoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlfX3N0b3BfZGFjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdGFydF9kYWMoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCisJaWYgKGRtYWJ1Zi0+Y291bnQgPiAwICYmIGRtYWJ1Zi0+cmVhZHkgJiYgIWRtYWJ1Zi0+ZW5hYmxlICYmCisJICAgIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX09VVFBVVCkpIHsKKwkJZG1hYnVmLT5lbmFibGUgfD0gREFDX1JVTk5JTkc7CisJCS8vIEludGVycnVwdCBlbmFibGUsIExWSSBlbmFibGUsIERNQSBlbmFibGUKKwkJSTgxMF9JT1dSSVRFQigweDEwIHwgMHgwNCB8IDB4MDEsIHN0YXRlLT5jYXJkLCBQT19DUik7CisJfQorfQorc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJX19zdGFydF9kYWMoc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNi1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCisvKiBhbGxvY2F0ZSBETUEgYnVmZmVyLCBwbGF5YmFjayBhbmQgcmVjb3JkaW5nIGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIHNlcGFyYXRlbHkgKi8KK3N0YXRpYyBpbnQgYWxsb2NfZG1hYnVmKHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl2b2lkICpyYXdidWY9IE5VTEw7CisJaW50IG9yZGVyLCBzaXplOworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgYW55IG9zcyBmcmFnIHBhcmFtcywgdGhlbiB1c2Ugb3VyIGRlZmF1bHQgb25lcyAqLworCWlmKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPT0gMCkKKwkJZG1hYnVmLT5vc3NtYXhmcmFncyA9IDQ7CisJaWYoZG1hYnVmLT5vc3NmcmFnc2l6ZSA9PSAwKQorCQlkbWFidWYtPm9zc2ZyYWdzaXplID0gKFBBR0VfU0laRTw8RE1BQlVGX0RFRkFVTFRPUkRFUikvZG1hYnVmLT5vc3NtYXhmcmFnczsKKwlzaXplID0gZG1hYnVmLT5vc3NmcmFnc2l6ZSAqIGRtYWJ1Zi0+b3NzbWF4ZnJhZ3M7CisKKwlpZihkbWFidWYtPnJhd2J1ZiAmJiAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpID09IHNpemUpCisJCXJldHVybiAwOworCS8qIGFsbG9jIGVub3VnaCB0byBzYXRpc2Z5IHRoZSBvc3MgcGFyYW1zICovCisJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkgeworCQlpZiAoIChQQUdFX1NJWkU8PG9yZGVyKSA+IHNpemUgKQorCQkJY29udGludWU7CisJCWlmICgocmF3YnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoc3RhdGUtPmNhcmQtPnBjaV9kZXYsCisJCQkJCQkgICBQQUdFX1NJWkUgPDwgb3JkZXIsCisJCQkJCQkgICAmZG1hYnVmLT5kbWFfaGFuZGxlKSkpCisJCQlicmVhazsKKwl9CisJaWYgKCFyYXdidWYpCisJCXJldHVybiAtRU5PTUVNOworCisKKyNpZmRlZiBERUJVRworCXByaW50aygiaTgxMF9hdWRpbzogYWxsb2NhdGVkICVsZCAob3JkZXIgPSAlZCkgYnl0ZXMgYXQgJXBcbiIsCisJICAgICAgIFBBR0VfU0laRSA8PCBvcmRlciwgb3JkZXIsIHJhd2J1Zik7CisjZW5kaWYKKworCWRtYWJ1Zi0+cmVhZHkgID0gZG1hYnVmLT5tYXBwZWQgPSAwOworCWRtYWJ1Zi0+cmF3YnVmID0gcmF3YnVmOworCWRtYWJ1Zi0+YnVmb3JkZXIgPSBvcmRlcjsKKwkKKwkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KKwlwZW5kID0gdmlydF90b19wYWdlKHJhd2J1ZiArIChQQUdFX1NJWkUgPDwgb3JkZXIpIC0gMSk7CisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZnJlZSBETUEgYnVmZmVyICovCitzdGF0aWMgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJaWYgKGRtYWJ1Zi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChzdGF0ZS0+Y2FyZC0+cGNpX2RldiwgUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIsCisJCQkJICAgIGRtYWJ1Zi0+cmF3YnVmLCBkbWFidWYtPmRtYV9oYW5kbGUpOworCX0KKwlkbWFidWYtPnJhd2J1ZiA9IE5VTEw7CisJZG1hYnVmLT5tYXBwZWQgPSBkbWFidWYtPnJlYWR5ID0gMDsKK30KKworc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgaTgxMF9jaGFubmVsICpjOworCXN0cnVjdCBzZ19pdGVtICpzZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisJdW5zaWduZWQgZnJhZ2ludDsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCWlmKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCisJCV9fc3RvcF9kYWMoc3RhdGUpOworCWlmKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCisJCV9fc3RvcF9hZGMoc3RhdGUpOworCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmVycm9yID0gMDsKKwlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCS8qIGFsbG9jYXRlIERNQSBidWZmZXIsIGxldCBhbGxvY19kbWFidWYgZGV0ZXJtaW5lIGlmIHdlIGFyZSBhbHJlYWR5CisJICogYWxsb2NhdGVkIHdlbGwgZW5vdWdoIG9yIGlmIHdlIHNob3VsZCByZXBsYWNlIHRoZSBjdXJyZW50IGJ1ZmZlcgorCSAqIChhc3N1bWluZyBvbmUgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIGlmIGl0IGlzbid0LCB0aGVuIGFsbG9jYXRlIGl0KS4KKwkgKi8KKwlpZiAoKHJldCA9IGFsbG9jX2RtYWJ1ZihzdGF0ZSkpKQorCQlyZXR1cm4gcmV0OworCisJLyogRklYTUU6IGZpZ3VyZSBvdXQgYWxsIHRoaXMgT1NTIGZyYWdtZW50IHN0dWZmICovCisJLyogSSBkaWQsIGl0IG5vdyBkb2VzIHdoYXQgaXQgc2hvdWxkIGFjY29yZGluZyB0byB0aGUgT1NTIEFQSS4gIERMICovCisJLyogV2UgbWF5IG5vdCBoYXZlIHJlYWxsb2NlZCBvdXIgZG1hYnVmLCBidXQgdGhlIGZyYWdtZW50IHNpemUgdG8KKwkgKiBmcmFnbWVudCBudW1iZXIgcmF0aW8gbWF5IGhhdmUgY2hhbmdlZCwgc28gZ28gYWhlYWQgYW5kIHJlcHJvZ3JhbQorCSAqIHRoaW5ncworCSAqLworCWRtYWJ1Zi0+ZG1hc2l6ZSA9IFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyOworCWRtYWJ1Zi0+bnVtZnJhZyA9IFNHX0xFTjsKKwlkbWFidWYtPmZyYWdzaXplID0gZG1hYnVmLT5kbWFzaXplL2RtYWJ1Zi0+bnVtZnJhZzsKKwlkbWFidWYtPmZyYWdzYW1wbGVzID0gZG1hYnVmLT5mcmFnc2l6ZSA+PiAxOworCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gZmZzKGRtYWJ1Zi0+ZnJhZ3NpemUpIC0gMTsKKwlkbWFidWYtPnVzZXJmcmFnc2l6ZSA9IGRtYWJ1Zi0+b3NzZnJhZ3NpemU7CisJZG1hYnVmLT51c2VyZnJhZ3MgPSBkbWFidWYtPmRtYXNpemUvZG1hYnVmLT5vc3NmcmFnc2l6ZTsKKworCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgMCwgZG1hYnVmLT5kbWFzaXplKTsKKworCWlmKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPT0gNCkgeworCQlmcmFnaW50ID0gODsKKwl9IGVsc2UgaWYgKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPT0gOCkgeworCQlmcmFnaW50ID0gNDsKKwl9IGVsc2UgaWYgKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPT0gMTYpIHsKKwkJZnJhZ2ludCA9IDI7CisJfSBlbHNlIHsKKwkJZnJhZ2ludCA9IDE7CisJfQorCS8qCisJICoJTm93IHNldCB1cCB0aGUgcmluZyAKKwkgKi8KKwlpZihkbWFidWYtPnJlYWRfY2hhbm5lbCkKKwkJYyA9IGRtYWJ1Zi0+cmVhZF9jaGFubmVsOworCWVsc2UKKwkJYyA9IGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbDsKKwl3aGlsZShjICE9IE5VTEwpIHsKKwkJc2c9JmMtPnNnWzBdOworCQkvKgorCQkgKglMb2FkIHVwIDMyIHNnIGVudHJpZXMgYW5kIHRha2UgYW4gaW50ZXJydXB0IGF0IGhhbGYKKwkJICoJd2F5ICh3ZSBtaWdodCB3YW50IG1vcmUgaW50ZXJydXB0cyBsYXRlci4uKSAKKwkJICovCisJICAKKwkJZm9yKGk9MDtpPGRtYWJ1Zi0+bnVtZnJhZztpKyspCisJCXsKKwkJCXNnLT5idXNhZGRyPSh1MzIpZG1hYnVmLT5kbWFfaGFuZGxlK2RtYWJ1Zi0+ZnJhZ3NpemUqaTsKKwkJCS8vIHRoZSBjYXJkIHdpbGwgYWx3YXlzIGJlIGRvaW5nIDE2Yml0IHN0ZXJlbworCQkJc2ctPmNvbnRyb2w9ZG1hYnVmLT5mcmFnc2FtcGxlczsKKwkJCWlmKHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDEyKQorCQkJCXNnLT5jb250cm9sIDw8PSAxOworCQkJc2ctPmNvbnRyb2x8PUNPTl9CVUZQQUQ7CisJCQkvLyBzZXQgdXMgdXAgdG8gZ2V0IElPQyBpbnRlcnJ1cHRzIGFzIG9mdGVuIGFzIG5lZWRlZCB0bworCQkJLy8gc2F0aXNmeSBudW1mcmFnIHJlcXVpcmVtZW50cywgbm8gbW9yZQorCQkJaWYoICgoaSsxKSAlIGZyYWdpbnQpID09IDApIHsKKwkJCQlzZy0+Y29udHJvbHw9Q09OX0lPQzsKKwkJCX0KKwkJCXNnKys7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCUk4MTBfSU9XUklURUIoMiwgc3RhdGUtPmNhcmQsIGMtPnBvcnQrT0ZGX0NSKTsgICAvKiByZXNldCBETUEgbWFjaGluZSAqLworCQl3aGlsZSggSTgxMF9JT1JFQURCKHN0YXRlLT5jYXJkLCBjLT5wb3J0K09GRl9DUikgJiAweDAyICkgOworCQlJODEwX0lPV1JJVEVMKCh1MzIpc3RhdGUtPmNhcmQtPmNoYW5kbWEgKworCQkgICAgYy0+bnVtKnNpemVvZihzdHJ1Y3QgaTgxMF9jaGFubmVsKSwKKwkJICAgIHN0YXRlLT5jYXJkLCBjLT5wb3J0K09GRl9CREJBUik7CisJCUNJVl9UT19MVkkoc3RhdGUtPmNhcmQsIGMtPnBvcnQsIDApOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJaWYoYyAhPSBkbWFidWYtPndyaXRlX2NoYW5uZWwpCisJCQljID0gZG1hYnVmLT53cml0ZV9jaGFubmVsOworCQllbHNlCisJCQljID0gTlVMTDsKKwl9CisJCisJLyogc2V0IHRoZSByZWFkeSBmbGFnIGZvciB0aGUgZG1hIGJ1ZmZlciAqLworCWRtYWJ1Zi0+cmVhZHkgPSAxOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImk4MTBfYXVkaW86IHByb2dfZG1hYnVmLCBzYW1wbGUgcmF0ZSA9ICVkLCBmb3JtYXQgPSAlZCxcblx0bnVtZnJhZyA9ICVkLCAiCisJICAgICAgICJmcmFnc2l6ZSA9ICVkIGRtYXNpemUgPSAlZFxuIiwKKwkgICAgICAgZG1hYnVmLT5yYXRlLCBkbWFidWYtPmZtdCwgZG1hYnVmLT5udW1mcmFnLAorCSAgICAgICBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmRtYXNpemUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pODEwX3VwZGF0ZV9sdmkoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlLCBpbnQgcmVjKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCB4LCBwb3J0OworCWludCB0cmlnZ2VyOworCWludCBjb3VudCwgZnJhZ3NpemU7CisJdm9pZCAoKnN0YXJ0KShzdHJ1Y3QgaTgxMF9zdGF0ZSAqKTsKKworCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwlpZiAocmVjKSB7CisJCXBvcnQgPSBkbWFidWYtPnJlYWRfY2hhbm5lbC0+cG9ydDsKKwkJdHJpZ2dlciA9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCXN0YXJ0ID0gX19zdGFydF9hZGM7CisJCWNvdW50ID0gZG1hYnVmLT5kbWFzaXplIC0gY291bnQ7CisJfSBlbHNlIHsKKwkJcG9ydCA9IGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbC0+cG9ydDsKKwkJdHJpZ2dlciA9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlzdGFydCA9IF9fc3RhcnRfZGFjOworCX0KKworCS8qIERvIG5vdCBwcm9jZXNzIHBhcnRpYWwgZnJhZ21lbnRzLiAqLworCWZyYWdzaXplID0gZG1hYnVmLT5mcmFnc2l6ZTsKKwlpZiAoY291bnQgPCBmcmFnc2l6ZSkKKwkJcmV0dXJuOworCisJLyogaWYgd2UgYXJlIGN1cnJlbnRseSBzdG9wcGVkLCB0aGVuIG91ciBDSVYgaXMgYWN0dWFsbHkgc2V0IHRvIG91cgorCSAqICpsYXN0KiBzZyBzZWdtZW50IGFuZCB3ZSBhcmUgcmVhZHkgdG8gd3JhcCB0byB0aGUgbmV4dC4gIEhvd2V2ZXIsCisJICogaWYgd2Ugc2V0IG91ciBMVkkgdG8gdGhlIGxhc3Qgc2cgc2VnbWVudCwgdGhlbiBpdCB3b24ndCB3cmFwIHRvCisJICogdGhlIG5leHQgc2cgc2VnbWVudCwgaXQgd29uJ3QgZXZlbiBnZXQgYSBzdGFydC4gIFNvLCBpbnN0ZWFkLCB3aGVuCisJICogd2UgYXJlIHN0b3BwZWQsIHdlIHNldCBib3RoIHRoZSBMVkkgdmFsdWUgYW5kIGFsc28gd2UgaW5jcmVtZW50CisJICogdGhlIENJViB2YWx1ZSB0byB0aGUgbmV4dCBzZyBzZWdtZW50IHRvIGJlIHBsYXllZCBzbyB0aGF0IHdoZW4KKwkgKiB3ZSBjYWxsIHN0YXJ0LCB0aGluZ3Mgd2lsbCBvcGVyYXRlIHByb3Blcmx5LiAgU2luY2UgdGhlIENJViBjYW4ndAorCSAqIGJlIHdyaXR0ZW4gdG8gZGlyZWN0bHkgZm9yIHRoaXMgcHVycG9zZSwgd2Ugc2V0IHRoZSBMVkkgdG8gQ0lWICsgMQorCSAqIHRlbXBvcmFyaWx5LiAgT25jZSB0aGUgZW5naW5lIGhhcyBzdGFydGVkIHdlIHNldCB0aGUgTFZJIHRvIGl0cworCSAqIGZpbmFsIHZhbHVlLgorCSAqLworCWlmICghZG1hYnVmLT5lbmFibGUgJiYgZG1hYnVmLT5yZWFkeSkgeworCQlpZiAoIShkbWFidWYtPnRyaWdnZXIgJiB0cmlnZ2VyKSkKKwkJCXJldHVybjsKKworCQlDSVZfVE9fTFZJKHN0YXRlLT5jYXJkLCBwb3J0LCAxKTsKKworCQlzdGFydChzdGF0ZSk7CisJCXdoaWxlICghKEk4MTBfSU9SRUFEQihzdGF0ZS0+Y2FyZCwgcG9ydCArIE9GRl9DUikgJiAoKDE8PDQpIHwgKDE8PDIpKSkpCisJCQk7CisJfQorCisJLyogTUFTS1AyKHN3cHRyLCBmcmFnc2l6ZSkgLSAxIGlzIHRoZSB0YWlsIG9mIG91ciB0cmFuc2ZlciAqLworCXggPSBNT0RVTE9QMihNQVNLUDIoZG1hYnVmLT5zd3B0ciwgZnJhZ3NpemUpIC0gMSwgZG1hYnVmLT5kbWFzaXplKTsKKwl4ID4+PSBkbWFidWYtPmZyYWdzaGlmdDsKKwlJODEwX0lPV1JJVEVCKHgsIHN0YXRlLT5jYXJkLCBwb3J0ICsgT0ZGX0xWSSk7Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBfdXBkYXRlX2x2aShzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUsIGludCByZWMpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmKCFkbWFidWYtPnJlYWR5KQorCQlyZXR1cm47CisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJX19pODEwX3VwZGF0ZV9sdmkoc3RhdGUsIHJlYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyogdXBkYXRlIGJ1ZmZlciBtYW5hbmdlbWVudCBwb2ludGVycywgZXNwZWNpYWxseSwgZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLworc3RhdGljIHZvaWQgaTgxMF91cGRhdGVfcHRyKHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBod3B0cjsKKwl1bnNpZ25lZCBmcmFnbWFzaywgZG1hbWFzazsKKwlpbnQgZGlmZjsKKworCWZyYWdtYXNrID0gTUFTS1AyKH4wLCBkbWFidWYtPmZyYWdzaXplKTsKKwlkbWFtYXNrID0gTU9EVUxPUDIofjAsIGRtYWJ1Zi0+ZG1hc2l6ZSk7CisKKwkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBBREMgKi8KKwlpZiAoZG1hYnVmLT5lbmFibGUgPT0gQURDX1JVTk5JTkcpIHsKKwkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KKwkJaHdwdHIgPSBpODEwX2dldF9kbWFfYWRkcihzdGF0ZSwgMSkgJiBmcmFnbWFzazsKKwkJZGlmZiA9IChod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICYgZG1hbWFzazsKKyNpZiBkZWZpbmVkKERFQlVHX0lOVEVSUlVQVFMpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJBREMgSFdQICVkLCVkLCVkXG4iLCBod3B0ciwgZG1hYnVmLT5od3B0ciwgZGlmZik7CisjZW5kaWYKKwkJZG1hYnVmLT5od3B0ciA9IGh3cHRyOworCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biAqLworCQkJLyogdGhpcyBpcyBub3JtYWwgZm9yIHRoZSBlbmQgb2YgYSByZWFkICovCisJCQkvKiBvbmx5IGdpdmUgYW4gZXJyb3IgaWYgd2Ugd2VudCBwYXN0IHRoZSAqLworCQkJLyogbGFzdCB2YWxpZCBzZyBlbnRyeSAqLworCQkJaWYgKEdFVF9DSVYoc3RhdGUtPmNhcmQsIFBJX0JBU0UpICE9CisJCQkgICAgR0VUX0xWSShzdGF0ZS0+Y2FyZCwgUElfQkFTRSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpODEwX2F1ZGlvOiBETUEgb3ZlcnJ1biBvbiByZWFkXG4iKTsKKwkJCQlkbWFidWYtPmVycm9yKys7CisJCQl9CisJCX0KKwkJaWYgKGRpZmYpCisJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCX0KKwkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBEQUMgKi8KKwlpZiAoZG1hYnVmLT5lbmFibGUgPT0gREFDX1JVTk5JTkcpIHsKKwkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KKwkJaHdwdHIgPSBpODEwX2dldF9kbWFfYWRkcihzdGF0ZSwgMCkgJiBmcmFnbWFzazsKKwkJZGlmZiA9IChod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICYgZG1hbWFzazsKKyNpZiBkZWZpbmVkKERFQlVHX0lOVEVSUlVQVFMpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJEQUMgSFdQICVkLCVkLCVkXG4iLCBod3B0ciwgZG1hYnVmLT5od3B0ciwgZGlmZik7CisjZW5kaWYKKwkJZG1hYnVmLT5od3B0ciA9IGh3cHRyOworCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CisJCQkvKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4gKi8KKwkJCS8qIHRoaXMgaXMgbm9ybWFsIGZvciB0aGUgZW5kIG9mIGEgd3JpdGUgKi8KKwkJCS8qIG9ubHkgZ2l2ZSBhbiBlcnJvciBpZiB3ZSB3ZW50IHBhc3QgdGhlICovCisJCQkvKiBsYXN0IHZhbGlkIHNnIGVudHJ5ICovCisJCQlpZiAoR0VUX0NJVihzdGF0ZS0+Y2FyZCwgUE9fQkFTRSkgIT0KKwkJCSAgICBHRVRfTFZJKHN0YXRlLT5jYXJkLCBQT19CQVNFKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImk4MTBfYXVkaW86IERNQSBvdmVycnVuIG9uIHdyaXRlXG4iKTsKKwkJCQlwcmludGsoImk4MTBfYXVkaW86IENJViAlZCwgTFZJICVkLCBod3B0ciAleCwgIgorCQkJCQkiY291bnQgJWRcbiIsCisJCQkJCUdFVF9DSVYoc3RhdGUtPmNhcmQsIFBPX0JBU0UpLAorCQkJCQlHRVRfTFZJKHN0YXRlLT5jYXJkLCBQT19CQVNFKSwKKwkJCQkJZG1hYnVmLT5od3B0ciwgZG1hYnVmLT5jb3VudCk7CisJCQkJZG1hYnVmLT5lcnJvcisrOworCQkJfQorCQl9CisJCWlmIChkaWZmKQorCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGk4MTBfZ2V0X2ZyZWVfd3JpdGVfc3BhY2Uoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCBmcmVlOworCisJaTgxMF91cGRhdGVfcHRyKHN0YXRlKTsKKwkvLyBjYXRjaCB1bmRlcnJ1bnMgZHVyaW5nIHBsYXliYWNrCisJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CisJCWRtYWJ1Zi0+Y291bnQgPSAwOworCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwl9CisJZnJlZSA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIGRtYWJ1Zi0+Y291bnQ7CisJaWYoZnJlZSA8IDApCisJCXJldHVybigwKTsKKwlyZXR1cm4oZnJlZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGk4MTBfZ2V0X2F2YWlsYWJsZV9yZWFkX2RhdGEoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCBhdmFpbDsKKworCWk4MTBfdXBkYXRlX3B0cihzdGF0ZSk7CisJLy8gY2F0Y2ggb3ZlcnJ1bnMgZHVyaW5nIHJlY29yZAorCWlmIChkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKSB7CisJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CisJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOworCX0KKwlhdmFpbCA9IGRtYWJ1Zi0+Y291bnQ7CisJaWYoYXZhaWwgPCAwKQorCQlyZXR1cm4oMCk7CisJcmV0dXJuKGF2YWlsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpbGxfcGFydGlhbF9mcmFnKHN0cnVjdCBkbWFidWYgKmRtYWJ1ZikKK3sKKwl1bnNpZ25lZCBmcmFnc2l6ZTsKKwl1bnNpZ25lZCBzd3B0ciwgbGVuOworCisJZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplOworCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwlsZW4gPSBmcmFnc2l6ZSAtIE1PRFVMT1AyKGRtYWJ1Zi0+c3dwdHIsIGZyYWdzaXplKTsKKwlpZiAobGVuID09IGZyYWdzaXplKQorCQlyZXR1cm47CisKKwltZW1zZXQoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgJ1wwJywgbGVuKTsKKwlkbWFidWYtPnN3cHRyID0gTU9EVUxPUDIoc3dwdHIgKyBsZW4sIGRtYWJ1Zi0+ZG1hc2l6ZSk7CisJZG1hYnVmLT5jb3VudCArPSBsZW47Cit9CisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSwgaW50IHNpZ25hbHNfYWxsb3dlZCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdG1vOworCWludCBjb3VudDsKKworCWlmICghZG1hYnVmLT5yZWFkeSkKKwkJcmV0dXJuIDA7CisJaWYoZG1hYnVmLT5tYXBwZWQpIHsKKwkJc3RvcF9kYWMoc3RhdGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWZpbGxfcGFydGlhbF9mcmFnKGRtYWJ1Zik7CisKKwkvKiAKKwkgKiBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgb3VyIExWSSBpcyBjb3JyZWN0LCB0aGF0IG91cgorCSAqIHBvaW50ZXIgaXMgdXBkYXRlZCwgYW5kIHRoYXQgdGhlIERBQyBpcyBydW5uaW5nLiAgV2UKKwkgKiBoYXZlIHRvIGZvcmNlIHRoZSBzZXR0aW5nIG9mIGRtYWJ1Zi0+dHJpZ2dlciB0byBhdm9pZAorCSAqIGFueSBwb3NzaWJsZSBkZWFkbG9ja3MuCisJICovCisJZG1hYnVmLT50cmlnZ2VyID0gUENNX0VOQUJMRV9PVVRQVVQ7CisJX19pODEwX3VwZGF0ZV9sdmkoc3RhdGUsIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWk4MTBfdXBkYXRlX3B0cihzdGF0ZSk7CisJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKworCQkvKiBJdCBzZWVtcyB0aGF0IHdlIGhhdmUgdG8gc2V0IHRoZSBjdXJyZW50IHN0YXRlIHRvCisJCSAqIFRBU0tfSU5URVJSVVBUSUJMRSBldmVyeSB0aW1lIHRvIG1ha2UgdGhlIHByb2Nlc3MKKwkJICogcmVhbGx5IGdvIHRvIHNsZWVwLiAgVGhpcyBhbHNvIGhhcyB0byBiZSAqYWZ0ZXIqIHRoZQorCQkgKiB1cGRhdGVfcHRyKCkgY2FsbCBiZWNhdXNlIHVwZGF0ZV9wdHIgaXMgbGlrZWx5IHRvCisJCSAqIGRvIGEgd2FrZV91cCgpIHdoaWNoIHdpbGwgdW5zZXQgdGhpcyBiZWZvcmUgd2UgZXZlcgorCQkgKiB0cnkgdG8gc2xlZXAsIHJlc3VsaW5nIGluIGEgdGlnaHQgbG9vcCBpbiB0aGlzIGNvZGUKKwkJICogaW5zdGVhZCBvZiBhY3R1YWxseSBzbGVlcGluZyBhbmQgd2FpdGluZyBmb3IgYW4KKwkJICogaW50ZXJydXB0IHRvIHdha2UgdXMgdXAhCisJCSAqLworCQlfX3NldF9jdXJyZW50X3N0YXRlKHNpZ25hbHNfYWxsb3dlZCA/CisJCQkJICAgIFRBU0tfSU5URVJSVVBUSUJMRSA6IFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIHNpZ25hbHNfYWxsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisJCS8qCisJCSAqIHNldCB0aGUgdGltZW91dCB0byBzaWduaWZpY2FudGx5IGxvbmdlciB0aGFuIGl0ICpzaG91bGQqCisJCSAqIHRha2UgZm9yIHRoZSBEQUMgdG8gZHJhaW4gdGhlIERNQSBidWZmZXIKKwkJICovCisJCXRtbyA9IChjb3VudCAqIEhaKSAvIChkbWFidWYtPnJhdGUpOworCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID49IDIgPyB0bW8gOiAyKSl7CisJCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IGRyYWluX2RhYywgZG1hIHRpbWVvdXQ/XG4iKTsKKwkJCWNvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOworCWlmKGNvdW50ID4gMCAmJiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBzaWduYWxzX2FsbG93ZWQpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJc3RvcF9kYWMoc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpODEwX2NoYW5uZWxfaW50ZXJydXB0KHN0cnVjdCBpODEwX2NhcmQgKmNhcmQpCit7CisJaW50IGksIGNvdW50OworCQorI2lmZGVmIERFQlVHX0lOVEVSUlVQVFMKKwlwcmludGsoIkNIQU5ORUwgIik7CisjZW5kaWYKKwlmb3IoaT0wO2k8TlJfSFdfQ0g7aSsrKQorCXsKKwkJc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlID0gY2FyZC0+c3RhdGVzW2ldOworCQlzdHJ1Y3QgaTgxMF9jaGFubmVsICpjOworCQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJCXVuc2lnbmVkIGxvbmcgcG9ydDsKKwkJdTE2IHN0YXR1czsKKwkJCisJCWlmKCFzdGF0ZSkKKwkJCWNvbnRpbnVlOworCQlpZighc3RhdGUtPmRtYWJ1Zi5yZWFkeSkKKwkJCWNvbnRpbnVlOworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJaWYoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgeworCQkJYz1kbWFidWYtPndyaXRlX2NoYW5uZWw7CisJCX0gZWxzZSBpZihkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7CisJCQljPWRtYWJ1Zi0+cmVhZF9jaGFubmVsOworCQl9IGVsc2UJLyogVGhpcyBjYW4gb2NjdXIgZ29pbmcgZnJvbSBSL1cgdG8gY2xvc2UgKi8KKwkJCWNvbnRpbnVlOworCQkKKwkJcG9ydCA9IGMtPnBvcnQ7CisKKwkJaWYoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxMikKKwkJCXN0YXR1cyA9IEk4MTBfSU9SRUFEVyhjYXJkLCBwb3J0ICsgT0ZGX1BJQ0IpOworCQllbHNlCisJCQlzdGF0dXMgPSBJODEwX0lPUkVBRFcoY2FyZCwgcG9ydCArIE9GRl9TUik7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRTCisJCXByaW50aygiTlVNICVkIFBPUlQgJVggSVJRICggU1QlZCAiLCBjLT5udW0sIGMtPnBvcnQsIHN0YXR1cyk7CisjZW5kaWYKKwkJaWYoc3RhdHVzICYgRE1BX0lOVF9DT01QTEVURSkKKwkJeworCQkJLyogb25seSB3YWtlX3VwKCkgd2FpdGVycyBpZiB0aGlzIGludGVycnVwdCBzaWduYWxzCisJCQkgKiB1cyBiZWluZyBiZXlvbmQgYSB1c2VyZnJhZ3NpemUgb2YgZGF0YSBvcGVuIG9yCisJCQkgKiBhdmFpbGFibGUsIGFuZCBpODEwX3VwZGF0ZV9wdHIoKSBkb2VzIHRoYXQgZm9yCisJCQkgKiB1cworCQkJICovCisJCQlpODEwX3VwZGF0ZV9wdHIoc3RhdGUpOworI2lmZGVmIERFQlVHX0lOVEVSUlVQVFMKKwkJCXByaW50aygiQ09NUCAlZCAiLCBkbWFidWYtPmh3cHRyIC8KKwkJCQkJZG1hYnVmLT5mcmFnc2l6ZSk7CisjZW5kaWYKKwkJfQorCQlpZihzdGF0dXMgJiAoRE1BX0lOVF9MVkkgfCBETUFfSU5UX0RDSCkpCisJCXsKKwkJCS8qIHdha2VfdXAoKSB1bmNvbmRpdGlvbmFsbHkgb24gTFZJIGFuZCBEQ0ggKi8KKwkJCWk4MTBfdXBkYXRlX3B0cihzdGF0ZSk7CisJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworI2lmZGVmIERFQlVHX0lOVEVSUlVQVFMKKwkJCWlmKHN0YXR1cyAmIERNQV9JTlRfTFZJKQorCQkJCXByaW50aygiTFZJICIpOworCQkJaWYoc3RhdHVzICYgRE1BX0lOVF9EQ0gpCisJCQkJcHJpbnRrKCJEQ0ggLSIpOworI2VuZGlmCisJCQljb3VudCA9IGRtYWJ1Zi0+Y291bnQ7CisJCQlpZihkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5kbWFzaXplIC0gY291bnQ7CisJCQlpZiAoY291bnQgPj0gKGludClkbWFidWYtPmZyYWdzaXplKSB7CisJCQkJSTgxMF9JT1dSSVRFQihJODEwX0lPUkVBREIoY2FyZCwgcG9ydCtPRkZfQ1IpIHwgMSwgY2FyZCwgcG9ydCtPRkZfQ1IpOworI2lmZGVmIERFQlVHX0lOVEVSUlVQVFMKKwkJCQlwcmludGsoIiBDT05USU5VRSAiKTsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKKwkJCQkJX19zdG9wX2RhYyhzdGF0ZSk7CisJCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCisJCQkJCV9fc3RvcF9hZGMoc3RhdGUpOworCQkJCWRtYWJ1Zi0+ZW5hYmxlID0gMDsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRTCisJCQkJcHJpbnRrKCIgU1RPUCAiKTsKKyNlbmRpZgorCQkJfQorCQl9CisJCWlmKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1NJXzcwMTIpCisJCQlJODEwX0lPV1JJVEVXKHN0YXR1cyAmIERNQV9JTlRfTUFTSywgY2FyZCwgcG9ydCArIE9GRl9QSUNCKTsKKwkJZWxzZQorCQkJSTgxMF9JT1dSSVRFVyhzdGF0dXMgJiBETUFfSU5UX01BU0ssIGNhcmQsIHBvcnQgKyBPRkZfU1IpOworCX0KKyNpZmRlZiBERUJVR19JTlRFUlJVUFRTCisJcHJpbnRrKCIpXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaTgxMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gKHN0cnVjdCBpODEwX2NhcmQgKilkZXZfaWQ7CisJdTMyIHN0YXR1czsKKworCXNwaW5fbG9jaygmY2FyZC0+bG9jayk7CisKKwlzdGF0dXMgPSBJODEwX0lPUkVBREwoY2FyZCwgR0xPQl9TVEEpOworCisJaWYoIShzdGF0dXMgJiBJTlRfTUFTSykpIAorCXsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOworCQlyZXR1cm4gSVJRX05PTkU7ICAvKiBub3QgZm9yIHVzICovCisJfQorCisJaWYoc3RhdHVzICYgKElOVF9QT3xJTlRfUEl8SU5UX01DKSkKKwkJaTgxMF9jaGFubmVsX2ludGVycnVwdChjYXJkKTsKKworIAkvKiBjbGVhciAnZW0gKi8KKwlJODEwX0lPV1JJVEVMKHN0YXR1cyAmIElOVF9NQVNLLCBjYXJkLCBHTE9CX1NUQSk7CisJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzCisgICB3YWl0aW5nIHRvIGJlIGNvcGllZCB0byB0aGUgdXNlcidzIGJ1ZmZlci4gIEl0IGlzIGZpbGxlZCBieSB0aGUgZG1hCisgICBtYWNoaW5lIGFuZCBkcmFpbmVkIGJ5IHRoaXMgbG9vcC4gKi8KKworc3RhdGljIHNzaXplX3QgaTgxMF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGk4MTBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZD1zdGF0ZSA/IHN0YXRlLT5jYXJkIDogTlVMTDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBzd3B0cjsKKwlpbnQgY250OworCWludCBwZW5kaW5nOworICAgICAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0YSwgY3VycmVudCk7CisKKyNpZmRlZiBERUJVRzIKKwlwcmludGsoImk4MTBfYXVkaW86IGk4MTBfcmVhZCBjYWxsZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKKyNlbmRpZgorCisJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWRtYWJ1Zi0+cmVhZF9jaGFubmVsKSB7CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQlkbWFidWYtPnJlYWRfY2hhbm5lbCA9IGNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbChjYXJkKTsKKwkJaWYgKCFkbWFidWYtPnJlYWRfY2hhbm5lbCkgeworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlLCAxKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKworCXBlbmRpbmcgPSAwOworCisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0YSk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChQTV9TVVNQRU5ERUQoY2FyZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQpIHJldCA9IC1FQUdBSU47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCQljbnQgPSBpODEwX2dldF9hdmFpbGFibGVfcmVhZF9kYXRhKHN0YXRlKTsKKwkJc3dwdHIgPSBkbWFidWYtPnN3cHRyOworCQkvLyB0aGlzIGlzIHRvIG1ha2UgdGhlIGNvcHlfdG9fdXNlciBzaW1wbGVyIGJlbG93CisJCWlmKGNudCA+IChkbWFidWYtPmRtYXNpemUgLSBzd3B0cikpCisJCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCXVuc2lnbmVkIGxvbmcgdG1vOworCQkJLyoKKwkJCSAqIERvbid0IGxldCB1cyBkZWFkbG9jay4gIFRoZSBBREMgd29uJ3Qgc3RhcnQgaWYKKwkJCSAqIGRtYWJ1Zi0+dHJpZ2dlciBpc24ndCBzZXQuICBBIGNhbGwgdG8gU0VUVFJJR0dFUgorCQkJICogY291bGQgaGF2ZSB0dXJuZWQgaXQgb2ZmIGFmdGVyIHdlIHNldCBpdCB0byBvbgorCQkJICogcHJldmlvdXNseS4KKwkJCSAqLworCQkJZG1hYnVmLT50cmlnZ2VyID0gUENNX0VOQUJMRV9JTlBVVDsKKwkJCS8qCisJCQkgKiBUaGlzIGRvZXMgdGhyZWUgdGhpbmdzLiAgVXBkYXRlcyBMVkkgdG8gYmUgY29ycmVjdCwKKwkJCSAqIG1ha2VzIHN1cmUgdGhlIEFEQyBpcyBydW5uaW5nLCBhbmQgdXBkYXRlcyB0aGUKKwkJCSAqIGh3cHRyLgorCQkJICovCisJCQlpODEwX3VwZGF0ZV9sdmkoc3RhdGUsMSk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkgcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQkvKiBTZXQgdGhlIHRpbWVvdXQgdG8gaG93IGxvbmcgaXQgd291bGQgdGFrZSB0byBmaWxsCisJCQkgKiB0d28gb2Ygb3VyIGJ1ZmZlcnMuICBJZiB3ZSBoYXZlbid0IGJlZW4gd29rZSB1cAorCQkJICogYnkgdGhlbiwgdGhlbiB3ZSBrbm93IHNvbWV0aGluZyBpcyB3cm9uZy4KKwkJCSAqLworCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaICogMikgLyAoZG1hYnVmLT5yYXRlICogNCk7CisJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0IHJldHVybnMsIG9uZSBpcyB3aGVuCisJCQkgICB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkKKwkJCSAgIElTUiBPTiBUSU1FLiBBbm90aGVyIGlzIHdoZW4gdGltZW91dCBpcyBleHBpcmVkLCB3aGljaCBtZWFucyB0aGF0CisJCQkgICBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdAorCQkJICAgaXMgVE9PIExBVEUgZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKHNjaGVkdWxlciBsYXRlbmN5KQorCQkJICAgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpIGJ1ZmZlciBvdmVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzCisJCQkgICBOT1RISU5HIHdlIGNhbiBkbyB0byBwcmV2ZW50IGl0LiAqLworCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA+PSAyID8gdG1vIDogMikpIHsKKyNpZmRlZiBERUJVRworCQkJCXByaW50ayhLRVJOX0VSUiAiaTgxMF9hdWRpbzogcmVjb3JkaW5nIHNjaGVkdWxlIHRpbWVvdXQsICIKKwkJCQkgICAgICAgImRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKKwkJCQkgICAgICAgZG1hYnVmLT5kbWFzaXplLCBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmNvdW50LAorCQkJCSAgICAgICBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKKyNlbmRpZgorCQkJCS8qIGEgYnVmZmVyIG92ZXJydW4sIHdlIGRlbGF5IHRoZSByZWNvdmVyeSB1bnRpbCBuZXh0IHRpbWUgdGhlCisJCQkJICAgd2hpbGUgbG9vcCBiZWdpbiBhbmQgd2UgUkVBTExZIGhhdmUgc3BhY2UgdG8gcmVjb3JkICovCisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXQgPSByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgY250KSkgeworCQkJaWYgKCFyZXQpIHJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlzd3B0ciA9IE1PRFVMT1AyKHN3cHRyICsgY250LCBkbWFidWYtPmRtYXNpemUpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgICAgICAgICBpZiAoUE1fU1VTUEVOREVEKGNhcmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKKwkJcGVuZGluZyA9IGRtYWJ1Zi0+Y291bnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCX0KKyBkb25lOgorCXBlbmRpbmcgPSBkbWFidWYtPmRtYXNpemUgLSBwZW5kaW5nOworCWlmIChkbWFidWYtPmVuYWJsZSB8fCBwZW5kaW5nID49IGRtYWJ1Zi0+dXNlcmZyYWdzaXplKQorCQlpODEwX3VwZGF0ZV9sdmkoc3RhdGUsIDEpOworICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdGEpOworCisJcmV0dXJuIHJldDsKK30KKworLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgdG8gYmUgZG1hIHRvCisgICB0aGUgc291bmRjYXJkLiAgaXQgaXMgZHJhaW5lZCBieSB0aGUgZG1hIG1hY2hpbmUgYW5kIGZpbGxlZCBieSB0aGlzIGxvb3AuICovCitzdGF0aWMgc3NpemVfdCBpODEwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGk4MTBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZD1zdGF0ZSA/IHN0YXRlLT5jYXJkIDogTlVMTDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBzd3B0ciA9IDA7CisJaW50IHBlbmRpbmc7CisJaW50IGNudDsKKyAgICAgICAgREVDTEFSRV9XQUlUUVVFVUUod2FpdGEsIGN1cnJlbnQpOworCisjaWZkZWYgREVCVUcyCisJcHJpbnRrKCJpODEwX2F1ZGlvOiBpODEwX3dyaXRlIGNhbGxlZCwgY291bnQgPSAlZFxuIiwgY291bnQpOworI2VuZGlmCisKKwlpZiAoZG1hYnVmLT5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZG1hYnVmLT53cml0ZV9jaGFubmVsKSB7CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQlkbWFidWYtPndyaXRlX2NoYW5uZWwgPSBjYXJkLT5hbGxvY19wY21fY2hhbm5lbChjYXJkKTsKKwkJaWYoIWRtYWJ1Zi0+d3JpdGVfY2hhbm5lbCkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisKKwlwZW5kaW5nID0gMDsKKworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdGEpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKFBNX1NVU1BFTkRFRChjYXJkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgcmV0ID0gLUVBR0FJTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKwkJY250ID0gaTgxMF9nZXRfZnJlZV93cml0ZV9zcGFjZShzdGF0ZSk7CisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJLyogQm91bmQgdGhlIG1heGltdW0gc2l6ZSB0byBob3cgbXVjaCB3ZSBjYW4gY29weSB0byB0aGUKKwkJICogZG1hIGJ1ZmZlciBiZWZvcmUgd2UgaGl0IHRoZSBlbmQuICBJZiB3ZSBoYXZlIG1vcmUgdG8KKwkJICogY29weSB0aGVuIGl0IHdpbGwgZ2V0IGRvbmUgaW4gYSBzZWNvbmQgcGFzcyBvZiB0aGlzCisJCSAqIGxvb3Agc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuCisJCSAqLworCQlpZihjbnQgPiAoZG1hYnVmLT5kbWFzaXplIC0gc3dwdHIpKQorCQkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBERUJVRzIKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaTgxMF9hdWRpbzogaTgxMF93cml0ZTogJWQgYnl0ZXMgYXZhaWxhYmxlIHNwYWNlXG4iLCBjbnQpOworI2VuZGlmCisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCXVuc2lnbmVkIGxvbmcgdG1vOworCQkJLy8gVGhlcmUgaXMgZGF0YSB3YWl0aW5nIHRvIGJlIHBsYXllZAorCQkJLyoKKwkJCSAqIEZvcmNlIHRoZSB0cmlnZ2VyIHNldHRpbmcgc2luY2Ugd2Ugd291bGQKKwkJCSAqIGRlYWRsb2NrIHdpdGggaXQgc2V0IGFueSBvdGhlciB3YXkKKwkJCSAqLworCQkJZG1hYnVmLT50cmlnZ2VyID0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCQlpODEwX3VwZGF0ZV9sdmkoc3RhdGUsMCk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkgcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJCS8qIE5vdCBzdHJpY3RseSBjb3JyZWN0IGJ1dCB3b3JrcyAqLworCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaICogMikgLyAoZG1hYnVmLT5yYXRlICogNCk7CisJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0IHJldHVybnMsIG9uZSBpcyB3aGVuCisJCQkgICB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkKKwkJCSAgIElTUiBPTiBUSU1FLiBBbm90aGVyIGlzIHdoZW4gdGltZW91dCBpcyBleHBpcmVkLCB3aGljaCBtZWFucyB0aGF0CisJCQkgICBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdAorCQkJICAgaXMgVE9PIExBVEUgZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKHNjaGVkdWxlciBsYXRlbmN5KQorCQkJICAgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpIGJ1ZmZlciB1bmRlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcworCQkJICAgTk9USElORyB3ZSBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KKwkJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPj0gMiA/IHRtbyA6IDIpKSB7CisjaWZkZWYgREVCVUcKKwkJCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IHBsYXliYWNrIHNjaGVkdWxlIHRpbWVvdXQsICIKKwkJCQkgICAgICAgImRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKKwkJCQkgICAgICAgZG1hYnVmLT5kbWFzaXplLCBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmNvdW50LAorCQkJCSAgICAgICBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKKyNlbmRpZgorCQkJCS8qIGEgYnVmZmVyIHVuZGVycnVuLCB3ZSBkZWxheSB0aGUgcmVjb3ZlcnkgdW50aWwgbmV4dCB0aW1lIHRoZQorCQkJCSAgIHdoaWxlIGxvb3AgYmVnaW4gYW5kIHdlIFJFQUxMWSBoYXZlIGRhdGEgdG8gcGxheSAqLworCQkJCS8vcmV0dXJuIHJldDsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KSByZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byByZXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYrc3dwdHIsYnVmZmVyLGNudCkpIHsKKwkJCWlmICghcmV0KSByZXQgPSAtRUZBVUxUOworCQkJZ290byByZXQ7CisJCX0KKworCQlzd3B0ciA9IE1PRFVMT1AyKHN3cHRyICsgY250LCBkbWFidWYtPmRtYXNpemUpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChQTV9TVVNQRU5ERUQoY2FyZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CisJCXBlbmRpbmcgPSBkbWFidWYtPmNvdW50ICs9IGNudDsKKworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJfQorcmV0OgorCWlmIChkbWFidWYtPmVuYWJsZSB8fCBwZW5kaW5nID49IGRtYWJ1Zi0+dXNlcmZyYWdzaXplKQorCQlpODEwX3VwZGF0ZV9sdmkoc3RhdGUsIDApOworICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdGEpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTgxMF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBpODEwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJaWYoIWRtYWJ1Zi0+cmVhZHkpCisJCXJldHVybiAwOworCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORyB8fAorCSAgICBkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX0lOUFVUKSB7CisJCWlmIChpODEwX2dldF9hdmFpbGFibGVfcmVhZF9kYXRhKHN0YXRlKSA+PSAKKwkJICAgIChzaWduZWQpZG1hYnVmLT51c2VyZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HIHx8CisJICAgIGRtYWJ1Zi0+dHJpZ2dlciAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCWlmIChpODEwX2dldF9mcmVlX3dyaXRlX3NwYWNlKHN0YXRlKSA+PQorCQkgICAgKHNpZ25lZClkbWFidWYtPnVzZXJmcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGk4MTBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICghZG1hYnVmLT53cml0ZV9jaGFubmVsICYmCisJCSAgICAoZG1hYnVmLT53cml0ZV9jaGFubmVsID0KKwkJICAgICBzdGF0ZS0+Y2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQpKSA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKKwkJaWYgKCFkbWFidWYtPnJlYWRfY2hhbm5lbCAmJgorCQkgICAgKGRtYWJ1Zi0+cmVhZF9jaGFubmVsID0gCisJCSAgICAgc3RhdGUtPmNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCkpID09IE5VTEwpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWlmICgocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSAhPSAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikpCisJCWdvdG8gb3V0OworCXJldCA9IC1FQUdBSU47CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZpcnRfdG9fcGh5cyhkbWFidWYtPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlnb3RvIG91dDsKKwlkbWFidWYtPm1hcHBlZCA9IDE7CisJZG1hYnVmLT50cmlnZ2VyID0gMDsKKwlyZXQgPSAwOworI2lmZGVmIERFQlVHX01NQVAKKwlwcmludGsoImk4MTBfYXVkaW86IG1tYXAnZWQgJWxkIGJ5dGVzIG9mIGRhdGEgc3BhY2VcbiIsIHNpemUpOworI2VuZGlmCitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBpODEwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpODEwX2NoYW5uZWwgKmMgPSBOVUxMOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYXVkaW9fYnVmX2luZm8gYWJpbmZvOworCWNvdW50X2luZm8gY2luZm87CisJdW5zaWduZWQgaW50IGlfZ2xvYl9jbnQ7CisJaW50IHZhbCA9IDAsIHJldDsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBzdGF0ZS0+Y2FyZC0+YWM5N19jb2RlY1swXTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJpODEwX2F1ZGlvOiBpODEwX2lvY3RsLCBhcmc9MHgleCwgY21kPSIsIGFyZyA/ICpwIDogMCk7CisjZW5kaWYKKworCXN3aXRjaCAoY21kKSAKKwl7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIk9TU19HRVRWRVJTSU9OXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1JFU0VUXG4iKTsKKyNlbmRpZgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IERBQ19SVU5OSU5HKSB7CisJCQljID0gZG1hYnVmLT53cml0ZV9jaGFubmVsOworCQkJX19zdG9wX2RhYyhzdGF0ZSk7CisJCX0KKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CisJCQljID0gZG1hYnVmLT5yZWFkX2NoYW5uZWw7CisJCQlfX3N0b3BfYWRjKHN0YXRlKTsKKwkJfQorCQlpZiAoYyAhPSBOVUxMKSB7CisJCQlJODEwX0lPV1JJVEVCKDIsIHN0YXRlLT5jYXJkLCBjLT5wb3J0K09GRl9DUik7ICAgLyogcmVzZXQgRE1BIG1hY2hpbmUgKi8KKwkJCXdoaWxlICggSTgxMF9JT1JFQURCKHN0YXRlLT5jYXJkLCBjLT5wb3J0K09GRl9DUikgJiAyICkKKwkJCQljcHVfcmVsYXgoKTsKKwkJCUk4MTBfSU9XUklURUwoKHUzMilzdGF0ZS0+Y2FyZC0+Y2hhbmRtYSArCisJCQkgICAgYy0+bnVtKnNpemVvZihzdHJ1Y3QgaTgxMF9jaGFubmVsKSwKKwkJCSAgICBzdGF0ZS0+Y2FyZCwgYy0+cG9ydCtPRkZfQkRCQVIpOworCQkJQ0lWX1RPX0xWSShzdGF0ZS0+Y2FyZCwgYy0+cG9ydCwgMCk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlzeW5jaHJvbml6ZV9pcnEoc3RhdGUtPmNhcmQtPnBjaV9kZXYtPmlycSk7CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciA9IDA7CisJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfU1lOQ1xuIik7CisjZW5kaWYKKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICE9IERBQ19SVU5OSU5HIHx8IGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIDA7CisJCWlmKCh2YWwgPSBkcmFpbl9kYWMoc3RhdGUsIDEpKSkKKwkJCXJldHVybiB2YWw7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDogLyogc2V0IHNtYXBsZSByYXRlICovCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NQRUVEXG4iKTsKKyNlbmRpZgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCWlmICggKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OKSApIHsgIC8qIFMvUERJRiBFbmFibGVkICovCisJCQkJCS8qIEFEMTg4NiBvbmx5IHN1cHBvcnRzIDQ4MDAwLCBuZWVkIHRvIGNoZWNrIHRoYXQgKi8KKwkJCQkJaWYgKCBpODEwX3ZhbGlkX3NwZGlmX3JhdGUgKCBjb2RlYywgdmFsICkgKSB7CisJCQkJCQkvKiBTZXQgREFDIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaTgxMF9zZXRfc3BkaWZfb3V0cHV0ICggc3RhdGUsIC0xLCAwICk7CisJCQkJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQkJaTgxMF9zZXRfZGFjX3JhdGUoc3RhdGUsIHZhbCk7CisJCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQkJLyogU2V0IFMvUERJRiB0cmFuc21pdHRlciByYXRlLiAqLworCQkJCQkJaTgxMF9zZXRfc3BkaWZfb3V0cHV0ICggc3RhdGUsIEFDOTdfRUFfU1BTQV8zXzQsIHZhbCApOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OKSApIHsKKwkJCQkJCQl2YWwgPSBkbWFidWYtPnJhdGU7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7IC8qIE5vdCBhIHZhbGlkIHJhdGUgZm9yIFMvUERJRiwgaWdub3JlIGl0ICovCisJCQkJCQl2YWwgPSBkbWFidWYtPnJhdGU7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQkJaTgxMF9zZXRfZGFjX3JhdGUoc3RhdGUsIHZhbCk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQkJfQorCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQkJaTgxMF9zZXRfYWRjX3JhdGUoc3RhdGUsIHZhbCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86IC8qIHNldCBzdGVyZW8gb3IgbW9ubyBjaGFubmVsICovCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NURVJFT1xuIik7CisjZW5kaWYKKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpIHsKKwkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJfQorCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgeworCQkJc3RvcF9hZGMoc3RhdGUpOworCQl9CisJCXJldHVybiBwdXRfdXNlcigxLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSkKKwkJCQlyZXR1cm4gdmFsOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAxKSkpCisJCQkJcmV0dXJuIHZhbDsKKwkJfQorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRCTEtTSVpFICVkXG4iLCBkbWFidWYtPnVzZXJmcmFnc2l6ZSk7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+dXNlcmZyYWdzaXplLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCovCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVEZNVFNcbiIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3Qgc2FtcGxlIGZvcm1hdCAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TRVRGTVRcbiIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0NIQU5ORUxTXG4iKTsKKyNlbmRpZgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICh2YWwgPiAwKSB7CisJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgeworCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCX0KKwkJCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7CisJCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIHB1dF91c2VyKHN0YXRlLT5jYXJkLT5jaGFubmVscywgcCk7CisJCX0KKworCQkvKiBJQ0ggYW5kIElDSDAgb25seSBzdXBwb3J0IDIgY2hhbm5lbHMgKi8KKwkJaWYgKCBzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV81CisJCSAgICAgfHwgc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUJfNSkgCisJCQlyZXR1cm4gcHV0X3VzZXIoMiwgcCk7CisJCisJCS8qIE11bHRpLWNoYW5uZWwgc3VwcG9ydCB3YXMgYWRkZWQgd2l0aCBJQ0gyLiBCaXRzIGluICovCisJCS8qIEdsb2JhbCBTdGF0dXMgYW5kIEdsb2JhbCBDb250cm9sIHJlZ2lzdGVyIGFyZSBub3cgICovCisJCS8qIHVzZWQgdG8gaW5kaWNhdGUgdGhpcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBpX2dsb2JfY250ID0gSTgxMF9JT1JFQURMKHN0YXRlLT5jYXJkLCBHTE9CX0NOVCk7CisKKwkJLyogQ3VycmVudCAjIG9mIGNoYW5uZWxzIGVuYWJsZWQgKi8KKwkJaWYgKCBpX2dsb2JfY250ICYgMHgwMTAwMDAwICkKKwkJCXJldCA9IDQ7CisJCWVsc2UgaWYgKCBpX2dsb2JfY250ICYgMHgwMjAwMDAwICkKKwkJCXJldCA9IDY7CisJCWVsc2UKKwkJCXJldCA9IDI7CisKKwkJc3dpdGNoICggdmFsICkgeworCQkJY2FzZSAyOiAvKiAyIGNoYW5uZWxzIGlzIGFsd2F5cyBzdXBwb3J0ZWQgKi8KKwkJCQlJODEwX0lPV1JJVEVMKGlfZ2xvYl9jbnQgJiAweGZmY2ZmZmZmLAorCQkJCSAgICAgc3RhdGUtPmNhcmQsIEdMT0JfQ05UKTsKKwkJCQkvKiBEbyB3ZSBuZWVkIHRvIGNoYW5nZSBtaXhlciBzZXR0aW5ncz8/Pz8gICovCisJCQkJYnJlYWs7CisJCQljYXNlIDQ6IC8qIFN1cHBvcnRlZCBvbiBzb21lIGNoaXBzZXRzLCBiZXR0ZXIgY2hlY2sgZmlyc3QgKi8KKwkJCQlpZiAoIHN0YXRlLT5jYXJkLT5jaGFubmVscyA+PSA0ICkgeworCQkJCQlJODEwX0lPV1JJVEVMKChpX2dsb2JfY250ICYgMHhmZmNmZmZmZikgfCAweDEwMDAwMCwKKwkJCQkJICAgICAgc3RhdGUtPmNhcmQsIEdMT0JfQ05UKTsKKwkJCQkJLyogRG8gd2UgbmVlZCB0byBjaGFuZ2UgbWl4ZXIgc2V0dGluZ3M/Pz8gKi8KKwkJCQl9IGVsc2UgeworCQkJCQl2YWwgPSByZXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSA2OiAvKiBTdXBwb3J0ZWQgb24gc29tZSBjaGlwc2V0cywgYmV0dGVyIGNoZWNrIGZpcnN0ICovCisJCQkJaWYgKCBzdGF0ZS0+Y2FyZC0+Y2hhbm5lbHMgPj0gNiApIHsKKwkJCQkJSTgxMF9JT1dSSVRFTCgoaV9nbG9iX2NudCAmIDB4ZmZjZmZmZmYpIHwgMHgyMDAwMDAsCisJCQkJCSAgICAgIHN0YXRlLT5jYXJkLCBHTE9CX0NOVCk7CisJCQkJCS8qIERvIHdlIG5lZWQgdG8gY2hhbmdlIG1peGVyIHNldHRpbmdzPz8/ICovCisJCQkJfSBlbHNlIHsKKwkJCQkJdmFsID0gcmV0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6IC8qIG5vdGhpbmcgZWxzZSBpcyBldmVyIHN1cHBvcnRlZCBieSB0aGUgY2hpcHNldCAqLworCQkJCXZhbCA9IHJldDsKKwkJCQlicmVhazsKKwkJfQorCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6IC8qIHRoZSB1c2VyIGhhcyBzZW50IGFsbCBkYXRhIGFuZCBpcyBub3RpZnlpbmcgdXMgKi8KKwkJLyogd2UgdXBkYXRlIHRoZSBzd3B0ciB0byB0aGUgZW5kIG9mIHRoZSBsYXN0IHNnIHNlZ21lbnQgdGhlbiByZXR1cm4gKi8KKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfUE9TVFxuIik7CisjZW5kaWYKKwkJaWYoIWRtYWJ1Zi0+cmVhZHkgfHwgKGRtYWJ1Zi0+ZW5hYmxlICE9IERBQ19SVU5OSU5HKSkKKwkJCXJldHVybiAwOworCQlpZigoZG1hYnVmLT5zd3B0ciAlIGRtYWJ1Zi0+ZnJhZ3NpemUpICE9IDApIHsKKwkJCXZhbCA9IGRtYWJ1Zi0+ZnJhZ3NpemUgLSAoZG1hYnVmLT5zd3B0ciAlIGRtYWJ1Zi0+ZnJhZ3NpemUpOworCQkJZG1hYnVmLT5zd3B0ciArPSB2YWw7CisJCQlkbWFidWYtPmNvdW50ICs9IHZhbDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmIChkbWFidWYtPnN1YmRpdmlzaW9uKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMiAmJiB2YWwgIT0gNCkKKwkJCXJldHVybiAtRUlOVkFMOworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TVUJESVZJREUgJWRcbiIsIHZhbCk7CisjZW5kaWYKKwkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWRtYWJ1Zi0+b3NzZnJhZ3NpemUgPSAxPDwodmFsICYgMHhmZmZmKTsKKwkJZG1hYnVmLT5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQlpZiAoIWRtYWJ1Zi0+b3NzZnJhZ3NpemUgfHwgIWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyoKKwkJICogQm91bmQgdGhlIGZyYWcgc2l6ZSBpbnRvIG91ciBhbGxvd2VkIHJhbmdlIG9mIDI1NiAtIDQwOTYKKwkJICovCisJCWlmIChkbWFidWYtPm9zc2ZyYWdzaXplIDwgMjU2KQorCQkJZG1hYnVmLT5vc3NmcmFnc2l6ZSA9IDI1NjsKKwkJZWxzZSBpZiAoZG1hYnVmLT5vc3NmcmFnc2l6ZSA+IDQwOTYpCisJCQlkbWFidWYtPm9zc2ZyYWdzaXplID0gNDA5NjsKKwkJLyoKKwkJICogVGhlIG51bWZyYWdzIGNvdWxkIGJlIHNvbWV0aGluZyByZWFzb25hYmxlLCBvciBpdCBjb3VsZAorCQkgKiBiZSAweGZmZmYgbWVhbmluZyAiR2l2ZSBtZSBhcyBtdWNoIGFzIHBvc3NpYmxlIi4gIFNvLAorCQkgKiB3ZSBjaGVjayB0aGUgbnVtZnJhZ3MgKiBmcmFnc2l6ZSBkb2Vzbid0IGV4Y2VlZCBvdXIKKwkJICogNjRrIGJ1ZmZlciBsaW1pdCwgbm9yIGlzIGl0IGxlc3MgdGhhbiBvdXIgOGsgbWluaW11bS4KKwkJICogSWYgaXQgZmFpbHMgZWl0aGVyIG9uZSBvZiB0aGVzZSBjaGVja3MsIHRoZW4gYWRqdXN0IHRoZQorCQkgKiBudW1iZXIgb2YgZnJhZ21lbnRzLCBub3QgdGhlIHNpemUgb2YgdGhlbS4gIEl0J3MgT0sgaWYKKwkJICogb3VyIG51bWJlciBvZiBmcmFnbWVudHMgZG9lc24ndCBlcXVhbCAzMiBvciBhbnl0aGluZworCQkgKiBsaWtlIG91ciBoYXJkd2FyZSBiYXNlZCBudW1iZXIgbm93IHNpbmNlIHdlIGFyZSB1c2luZworCQkgKiBhIGRpZmZlcmVudCBmcmFnIGNvdW50IGZvciB0aGUgaGFyZHdhcmUuICBCZWZvcmUgd2UgZ2V0CisJCSAqIGludG8gdGhpcyB0aG91Z2gsIGJvdW5kIHRoZSBtYXhmcmFncyB0byBhdm9pZCBvdmVyZmxvdworCQkgKiBpc3N1ZXMuICBBIHJlYXNvbmFibGUgYm91bmQgd291bGQgYmUgNjRrIC8gMjU2IHNpbmNlIG91cgorCQkgKiBtYXhpbXVtIGJ1ZmZlciBzaXplIGlzIDY0ayBhbmQgb3VyIG1pbmltdW0gZnJhZyBzaXplIGlzCisJCSAqIDI1Ni4gIE9uIHRoZSBvdGhlciBlbmQsIG91ciBtaW5pbXVtIGJ1ZmZlciBzaXplIGlzIDhrIGFuZAorCQkgKiBvdXIgbWF4aW11bSBmcmFnIHNpemUgaXMgNGssIHNvIHRoZSBsb3dlciBib3VuZCBzaG91bGQKKwkJICogYmUgMi4KKwkJICovCisKKwkJaWYoZG1hYnVmLT5vc3NtYXhmcmFncyA+IDI1NikKKwkJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAyNTY7CisJCWVsc2UgaWYgKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPCAyKQorCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA9IDI7CisKKwkJdmFsID0gZG1hYnVmLT5vc3NmcmFnc2l6ZSAqIGRtYWJ1Zi0+b3NzbWF4ZnJhZ3M7CisJCXdoaWxlICh2YWwgPCA4MTkyKSB7CisJCSAgICB2YWwgPDw9IDE7CisJCSAgICBkbWFidWYtPm9zc21heGZyYWdzIDw8PSAxOworCQl9CisJCXdoaWxlICh2YWwgPiA2NTUzNikgeworCQkgICAgdmFsID4+PSAxOworCQkgICAgZG1hYnVmLT5vc3NtYXhmcmFncyA+Pj0gMTsKKwkJfQorCQlkbWFidWYtPnJlYWR5ID0gMDsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfU0VURlJBR01FTlQgMHgleCwgJWQsICVkXG4iLCB2YWwsCisJCQlkbWFidWYtPm9zc2ZyYWdzaXplLCBkbWFidWYtPm9zc21heGZyYWdzKTsKKyNlbmRpZgorCisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWk4MTBfdXBkYXRlX3B0cihzdGF0ZSk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IGRtYWJ1Zi0+dXNlcmZyYWdzaXplOworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IGRtYWJ1Zi0+dXNlcmZyYWdzOworCQlpZiAoZG1hYnVmLT5tYXBwZWQpCisgCQkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplOworICAJCWVsc2UKKyAJCQlhYmluZm8uYnl0ZXMgPSBpODEwX2dldF9mcmVlX3dyaXRlX3NwYWNlKHN0YXRlKTsKKwkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyAvIGRtYWJ1Zi0+dXNlcmZyYWdzaXplOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9TUEFDRSAlZCwgJWQsICVkLCAlZFxuIiwgYWJpbmZvLmJ5dGVzLAorCQkJYWJpbmZvLmZyYWdzaXplLCBhYmluZm8uZnJhZ21lbnRzLCBhYmluZm8uZnJhZ3N0b3RhbCk7CisjZW5kaWYKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJdmFsID0gaTgxMF9nZXRfZnJlZV93cml0ZV9zcGFjZShzdGF0ZSk7CisJCWNpbmZvLmJ5dGVzID0gZG1hYnVmLT50b3RhbF9ieXRlczsKKwkJY2luZm8ucHRyID0gZG1hYnVmLT5od3B0cjsKKwkJY2luZm8uYmxvY2tzID0gdmFsL2RtYWJ1Zi0+dXNlcmZyYWdzaXplOworCQlpZiAoZG1hYnVmLT5tYXBwZWQgJiYgKGRtYWJ1Zi0+dHJpZ2dlciAmIFBDTV9FTkFCTEVfT1VUUFVUKSkgeworCQkJZG1hYnVmLT5jb3VudCArPSB2YWw7CisJCQlkbWFidWYtPnN3cHRyID0gKGRtYWJ1Zi0+c3dwdHIgKyB2YWwpICUgZG1hYnVmLT5kbWFzaXplOworCQkJX19pODEwX3VwZGF0ZV9sdmkoc3RhdGUsIDApOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChERUJVR19NTUFQKQorCQlwcmludGsoIlNORENUTF9EU1BfR0VUT1BUUiAlZCwgJWQsICVkLCAlZFxuIiwgY2luZm8uYnl0ZXMsCisJCQljaW5mby5ibG9ja3MsIGNpbmZvLnB0ciwgZG1hYnVmLT5jb3VudCk7CisjZW5kaWYKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAxKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlhYmluZm8uYnl0ZXMgPSBpODEwX2dldF9hdmFpbGFibGVfcmVhZF9kYXRhKHN0YXRlKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT51c2VyZnJhZ3NpemU7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT51c2VyZnJhZ3M7CisJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgLyBkbWFidWYtPnVzZXJmcmFnc2l6ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX01NQVApCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRJU1BBQ0UgJWQsICVkLCAlZCwgJWRcbiIsIGFiaW5mby5ieXRlcywKKwkJCWFiaW5mby5mcmFnc2l6ZSwgYWJpbmZvLmZyYWdtZW50cywgYWJpbmZvLmZyYWdzdG90YWwpOworI2VuZGlmCisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJdmFsID0gaTgxMF9nZXRfYXZhaWxhYmxlX3JlYWRfZGF0YShzdGF0ZSk7CisJCWNpbmZvLmJ5dGVzID0gZG1hYnVmLT50b3RhbF9ieXRlczsKKwkJY2luZm8uYmxvY2tzID0gdmFsL2RtYWJ1Zi0+dXNlcmZyYWdzaXplOworCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCQlpZiAoZG1hYnVmLT5tYXBwZWQgJiYgKGRtYWJ1Zi0+dHJpZ2dlciAmIFBDTV9FTkFCTEVfSU5QVVQpKSB7CisJCQlkbWFidWYtPmNvdW50IC09IHZhbDsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSAoZG1hYnVmLT5zd3B0ciArIHZhbCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQlfX2k4MTBfdXBkYXRlX2x2aShzdGF0ZSwgMSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX01NQVApCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRJUFRSICVkLCAlZCwgJWQsICVkXG4iLCBjaW5mby5ieXRlcywKKwkJCWNpbmZvLmJsb2NrcywgY2luZm8ucHRyLCBkbWFidWYtPmNvdW50KTsKKyNlbmRpZgorCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfTk9OQkxPQ0tcbiIpOworI2VuZGlmCisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfR0VUQ0FQU1xuIik7CisjZW5kaWYKKwkgICAgcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUV8RFNQX0NBUF9UUklHR0VSfERTUF9DQVBfTU1BUHxEU1BfQ0FQX0JJTkQsCisJCQkgICAgcCk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfR0VUVFJJR0dFUiAweCV4XG4iLCBkbWFidWYtPnRyaWdnZXIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnRyaWdnZXIsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChERUJVR19NTUFQKQorCQlwcmludGsoIlNORENUTF9EU1BfU0VUVFJJR0dFUiAweCV4XG4iLCB2YWwpOworI2VuZGlmCisJCS8qIHNpbGVudGx5IGlnbm9yZSBpbnZhbGlkIFBDTV9FTkFCTEVfeHh4IGJpdHMsCisJCSAqIGxpa2UgdGhlIG90aGVyIGRyaXZlcnMgZG8KKwkJICovCisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgKSkKKwkJCXZhbCAmPSB+UENNX0VOQUJMRV9JTlBVVDsKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgKSkKKwkJCXZhbCAmPSB+UENNX0VOQUJMRV9PVVRQVVQ7CisJCWlmKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiAhKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpICYmIGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CisJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCX0KKwkJaWYoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAhKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSAmJiBkbWFidWYtPmVuYWJsZSA9PSBEQUNfUlVOTklORykgeworCQkJc3RvcF9kYWMoc3RhdGUpOworCQl9CisJCWRtYWJ1Zi0+dHJpZ2dlciA9IHZhbDsKKwkJaWYoKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSAmJiAhKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpKSB7CisJCQlpZiAoIWRtYWJ1Zi0+d3JpdGVfY2hhbm5lbCkgeworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCWRtYWJ1Zi0+d3JpdGVfY2hhbm5lbCA9IHN0YXRlLT5jYXJkLT5hbGxvY19wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCk7CisJCQkJaWYgKCFkbWFidWYtPndyaXRlX2NoYW5uZWwpCisJCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCWk4MTBfdXBkYXRlX3B0cihzdGF0ZSk7CisJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQkJZG1hYnVmLT5jb3VudCA9IGk4MTBfZ2V0X2ZyZWVfd3JpdGVfc3BhY2Uoc3RhdGUpOworCQkJCWRtYWJ1Zi0+c3dwdHIgPSAoZG1hYnVmLT5zd3B0ciArIGRtYWJ1Zi0+Y291bnQpICUgZG1hYnVmLT5kbWFzaXplOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpODEwX3VwZGF0ZV9sdmkoc3RhdGUsIDApOworCQkJc3RhcnRfZGFjKHN0YXRlKTsKKwkJfQorCQlpZigodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgJiYgIShkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSkgeworCQkJaWYgKCFkbWFidWYtPnJlYWRfY2hhbm5lbCkgeworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCWRtYWJ1Zi0+cmVhZF9jaGFubmVsID0gc3RhdGUtPmNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCk7CisJCQkJaWYgKCFkbWFidWYtPnJlYWRfY2hhbm5lbCkKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDEpKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQkJaTgxMF91cGRhdGVfcHRyKHN0YXRlKTsKKwkJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwkJCQlkbWFidWYtPmNvdW50ID0gMDsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJaTgxMF91cGRhdGVfbHZpKHN0YXRlLCAxKTsKKwkJCXN0YXJ0X2FkYyhzdGF0ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TRVREVVBMRVhcbiIpOworI2VuZGlmCisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlpODEwX3VwZGF0ZV9wdHIoc3RhdGUpOworCQl2YWwgPSBkbWFidWYtPmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRPREVMQVkgJWRcbiIsIGRtYWJ1Zi0+Y291bnQpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU09VTkRfUENNX1JFQURfUkFURSAlZFxuIiwgZG1hYnVmLT5yYXRlKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9DSEFOTkVMU1xuIik7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKDIsIHApOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU09VTkRfUENNX1JFQURfQklUU1xuIik7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRTUERJRjogLyogU2V0IFMvUERJRiBDb250cm9sIHJlZ2lzdGVyICovCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NFVFNQRElGXG4iKTsKKyNlbmRpZgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29kZWMgc3VwcG9ydHMgUy9QRElGIHRyYW5zbWl0dGVyICovCisKKwkJaWYoKHN0YXRlLT5jYXJkLT5hYzk3X2ZlYXR1cmVzICYgNCkpIHsKKwkJCS8qIG1hc2sgb3V0IHRoZSB0cmFuc21pdHRlciBzcGVlZCBiaXRzIHNvIHRoZSB1c2VyIGNhbid0IHNldCB0aGVtICovCisJCQl2YWwgJj0gfjB4MzAwMDsKKworCQkJLyogQWRkIHRoZSBjdXJyZW50IHRyYW5zbWl0dGVyIHNwZWVkIGJpdHMgdG8gdGhlIHBhc3NlZCB2YWx1ZSAqLworCQkJcmV0ID0gaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19TUERJRl9DT05UUk9MKTsKKwkJCXZhbCB8PSAocmV0ICYgMHgzMDAwKTsKKworCQkJaTgxMF9hYzk3X3NldChjb2RlYywgQUM5N19TUERJRl9DT05UUk9MLCB2YWwpOworCQkJaWYoaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19TUERJRl9DT05UUk9MKSAhPSB2YWwgKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJpODEwX2F1ZGlvOiBVbmFibGUgdG8gc2V0IFMvUERJRiBjb25maWd1cmF0aW9uIHRvIDB4JTA0eC5cbiIsIHZhbCk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKyNpZmRlZiBERUJVRworCQllbHNlIAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTgxMF9hdWRpbzogUy9QRElGIHRyYW5zbWl0dGVyIG5vdCBhdmFsaWJsZS5cbiIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVFNQRElGOiAvKiBHZXQgUy9QRElGIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfR0VUU1BESUZcbiIpOworI2VuZGlmCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb2RlYyBzdXBwb3J0cyBTL1BESUYgdHJhbnNtaXR0ZXIgKi8KKworCQlpZighKHN0YXRlLT5jYXJkLT5hYzk3X2ZlYXR1cmVzICYgNCkpIHsKKyNpZmRlZiBERUJVRworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTgxMF9hdWRpbzogUy9QRElGIHRyYW5zbWl0dGVyIG5vdCBhdmFsaWJsZS5cbiIpOworI2VuZGlmCisJCQl2YWwgPSAwOworCQl9IGVsc2UgeworCQkJdmFsID0gaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19TUERJRl9DT05UUk9MKTsKKwkJfQorCQkvL3JldHVybiBwdXRfdXNlcigodmFsICYgMHhjZmZmKSwgcCk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworICAgCQkJCisJY2FzZSBTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTS1xuIik7CisjZW5kaWYKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCisJCS8qIEJhc2VkIG9uIEFDJzk3IERBQyBzdXBwb3J0LCBub3QgSUNIIGhhcmR3YXJlICovCisJCXZhbCA9IERTUF9CSU5EX0ZST05UOworCQlpZiAoIHN0YXRlLT5jYXJkLT5hYzk3X2ZlYXR1cmVzICYgMHgwMDA0ICkKKwkJCXZhbCB8PSBEU1BfQklORF9TUERJRjsKKworCQlpZiAoIHN0YXRlLT5jYXJkLT5hYzk3X2ZlYXR1cmVzICYgMHgwMDgwICkKKwkJCXZhbCB8PSBEU1BfQklORF9TVVJSOworCQlpZiAoIHN0YXRlLT5jYXJkLT5hYzk3X2ZlYXR1cmVzICYgMHgwMTQwICkKKwkJCXZhbCB8PSBEU1BfQklORF9DRU5URVJfTEZFOworCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTDoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfQklORF9DSEFOTkVMXG4iKTsKKyNlbmRpZgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoIHZhbCA9PSBEU1BfQklORF9RVUVSWSApIHsKKwkJCXZhbCA9IERTUF9CSU5EX0ZST05UOyAvKiBBbHdheXMgcmVwb3J0IHRoaXMgYXMgYmVpbmcgZW5hYmxlZCAqLworCQkJaWYgKCBzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTUERJRl9PTiApIAorCQkJCXZhbCB8PSBEU1BfQklORF9TUERJRjsKKwkJCWVsc2UgeworCQkJCWlmICggc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICYgU1VSUl9PTiApCisJCQkJCXZhbCB8PSBEU1BfQklORF9TVVJSOworCQkJCWlmICggc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICYgQ0VOVEVSX0xGRV9PTiApCisJCQkJCXZhbCB8PSBEU1BfQklORF9DRU5URVJfTEZFOworCQkJfQorCQl9IGVsc2UgeyAgLyogTm90IGEgcXVlcnksIHNldCBpdCAqLworCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCBkbWFidWYtPmVuYWJsZSA9PSBEQUNfUlVOTklORyApIHsKKwkJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQl9CisJCQlpZiAoIHZhbCAmIERTUF9CSU5EX1NQRElGICkgeyAgLyogVHVybiBvbiBTUERJRiAqLworCQkJCS8qICBPaywgdGhpcyBzaG91bGQgcHJvYmFibHkgZGVmaW5lIHdoYXQgc2xvdHMKKwkJCQkgKiAgdG8gdXNlLiBGb3Igbm93LCB3ZSdsbCBvbmx5IHNldCBpdCB0byB0aGUKKwkJCQkgKiAgZGVmYXVsdHM6CisJCQkJICogCisJCQkJICogICBub24gbXVsdGljaGFubmVsIGNvZGVjIG1hcHMgdG8gc2xvdHMgMyY0CisJCQkJICogICAyIGNoYW5uZWwgY29kZWMgbWFwcyB0byBzbG90cyA3JjgKKwkJCQkgKiAgIDQgY2hhbm5lbCBjb2RlYyBtYXBzIHRvIHNsb3RzIDYmOQorCQkJCSAqICAgNiBjaGFubmVsIGNvZGVjIG1hcHMgdG8gc2xvdHMgMTAmMTEKKwkJCQkgKgorCQkJCSAqICB0aGVyZSBzaG91bGQgYmUgc29tZSB3YXkgZm9yIHRoZSBhcHAgdG8KKwkJCQkgKiAgc2VsZWN0IHRoZSBzbG90IGFzc2lnbm1lbnQuCisJCQkJICovCisJCisJCQkJaTgxMF9zZXRfc3BkaWZfb3V0cHV0ICggc3RhdGUsIEFDOTdfRUFfU1BTQV8zXzQsIGRtYWJ1Zi0+cmF0ZSApOworCQkJCWlmICggIShzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTUERJRl9PTikgKQorCQkJCQl2YWwgJj0gfkRTUF9CSU5EX1NQRElGOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgbWFzazsKKwkJCQlpbnQgY2hhbm5lbHM7CisKKwkJCQkvKiBUdXJuIG9mZiBTL1BESUYgaWYgaXQgd2FzIG9uICovCisJCQkJaWYgKCBzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTUERJRl9PTiApIAorCQkJCQlpODEwX3NldF9zcGRpZl9vdXRwdXQgKCBzdGF0ZSwgLTEsIDAgKTsKKwkJCQkKKwkJCQltYXNrID0gdmFsICYgKERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUiB8IERTUF9CSU5EX0NFTlRFUl9MRkUpOworCQkJCXN3aXRjaCAobWFzaykgeworCQkJCQljYXNlIERTUF9CSU5EX0ZST05UOgorCQkJCQkJY2hhbm5lbHMgPSAyOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRFNQX0JJTkRfRlJPTlR8RFNQX0JJTkRfU1VSUjoKKwkJCQkJCWNoYW5uZWxzID0gNDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIERTUF9CSU5EX0ZST05UfERTUF9CSU5EX1NVUlJ8RFNQX0JJTkRfQ0VOVEVSX0xGRToKKwkJCQkJCWNoYW5uZWxzID0gNjsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJdmFsID0gRFNQX0JJTkRfRlJPTlQ7CisJCQkJCQljaGFubmVscyA9IDI7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaTgxMF9zZXRfZGFjX2NoYW5uZWxzICggc3RhdGUsIGNoYW5uZWxzICk7CisKKwkJCQkvKiBjaGVjayB0aGF0IHRoZXkgcmVhbGx5IGdvdCB0dXJuZWQgb24gKi8KKwkJCQlpZiAoIShzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTVVJSX09OKSkKKwkJCQkJdmFsICY9IH5EU1BfQklORF9TVVJSOworCQkJCWlmICghKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIENFTlRFUl9MRkVfT04pKQorCQkJCQl2YWwgJj0gfkRTUF9CSU5EX0NFTlRFUl9MRkU7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKKwljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMXyogLUVJTlZBTFxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGk4MTBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IGRldnM7CisJc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlID0gTlVMTDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSBOVUxMOworCisJLyogZmluZCBhbiBhdmFpYWJsZSB2aXJ0dWFsIGNoYW5uZWwgKGluc3RhbmNlIG9mIC9kZXYvZHNwKSAqLworCXdoaWxlIChjYXJkICE9IE5VTEwpIHsKKwkJLyoKKwkJICogSWYgd2UgYXJlIGluaXRpYWxpemluZyBhbmQgdGhlbiBmYWlsLCBjYXJkIGNvdWxkIGdvCisJCSAqIGF3YXkgdW51ZXhwZWN0ZWRseSB3aGlsZSB3ZSBhcmUgaW4gdGhlIGZvcigpIGxvb3AuCisJCSAqIFNvLCBjaGVjayBmb3IgY2FyZCBvbiBlYWNoIGl0ZXJhdGlvbiBiZWZvcmUgd2UgY2hlY2sKKwkJICogZm9yIGNhcmQtPmluaXRpYWxpemluZyB0byBhdm9pZCBhIHBvc3NpYmxlIG9vcHMuCisJCSAqIFRoaXMgdXN1YWxseSBvbmx5IG1hdHRlcnMgZm9yIHRpbWVzIHdoZW4gdGhlIGRyaXZlciBpcworCQkgKiBhdXRvbG9hZGVkIGJ5IGttb2QuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgNTAgJiYgY2FyZCAmJiBjYXJkLT5pbml0aWFsaXppbmc7IGkrKykgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChIWi8yMCk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIICYmIGNhcmQgJiYgIWNhcmQtPmluaXRpYWxpemluZzsgaSsrKSB7CisJCQlpZiAoY2FyZC0+c3RhdGVzW2ldID09IE5VTEwpIHsKKwkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXSA9IChzdHJ1Y3QgaTgxMF9zdGF0ZSAqKQorCQkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTgxMF9zdGF0ZSksIEdGUF9LRVJORUwpOworCQkJCWlmIChzdGF0ZSA9PSBOVUxMKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgaTgxMF9zdGF0ZSkpOworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCWdvdG8gZm91bmRfdmlydDsKKwkJCX0KKwkJfQorCQljYXJkID0gY2FyZC0+bmV4dDsKKwl9CisJLyogbm8gbW9yZSB2aXJ0dWFsIGNoYW5uZWwgYXZhaWFibGUgKi8KKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworZm91bmRfdmlydDoKKwkvKiBpbml0aWFsaXplIHRoZSB2aXJ0dWFsIGNoYW5uZWwgKi8KKwlzdGF0ZS0+dmlydCA9IGk7CisJc3RhdGUtPmNhcmQgPSBjYXJkOworCXN0YXRlLT5tYWdpYyA9IEk4MTBfU1RBVEVfTUFHSUM7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKKwlpbml0X01VVEVYKCZzdGF0ZS0+b3Blbl9zZW0pOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHN0YXRlOworCWRtYWJ1Zi0+dHJpZ2dlciA9IDA7CisKKwkvKiBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVscyAqLworCWlmKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYoKGRtYWJ1Zi0+cmVhZF9jaGFubmVsID0gY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKGNhcmQpKSA9PSBOVUxMKSB7CisJCQlrZnJlZSAoY2FyZC0+c3RhdGVzW2ldKTsKKwkJCWNhcmQtPnN0YXRlc1tpXSA9IE5VTEw7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWRtYWJ1Zi0+dHJpZ2dlciB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQlpODEwX3NldF9hZGNfcmF0ZShzdGF0ZSwgODAwMCk7CisJfQorCWlmKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmKChkbWFidWYtPndyaXRlX2NoYW5uZWwgPSBjYXJkLT5hbGxvY19wY21fY2hhbm5lbChjYXJkKSkgPT0gTlVMTCkgeworCQkJLyogbWFrZSBzdXJlIHdlIGZyZWUgdGhlIHJlY29yZCBjaGFubmVsIGFsbG9jYXRlZCBhYm92ZSAqLworCQkJaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQljYXJkLT5mcmVlX3BjbV9jaGFubmVsKGNhcmQsZG1hYnVmLT5yZWFkX2NoYW5uZWwtPm51bSk7CisJCQlrZnJlZSAoY2FyZC0+c3RhdGVzW2ldKTsKKwkJCWNhcmQtPnN0YXRlc1tpXSA9IE5VTEw7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCS8qIEluaXRpYWxpemUgdG8gOGtIej8gIFdoYXQgaWYgd2UgZG9uJ3Qgc3VwcG9ydCA4a0h6PyAqLworCQkvKiAgTGV0J3MgY2hhbmdlIHRoaXMgdG8gY2hlY2sgZm9yIFMvUERJRiBzdHVmZiAqLworCQorCQlkbWFidWYtPnRyaWdnZXIgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCWlmICggc3BkaWZfbG9ja2VkICkgeworCQkJaTgxMF9zZXRfZGFjX3JhdGUoc3RhdGUsIHNwZGlmX2xvY2tlZCk7CisJCQlpODEwX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV8zXzQsIHNwZGlmX2xvY2tlZCk7CisJCX0gZWxzZSB7CisJCQlpODEwX3NldF9kYWNfcmF0ZShzdGF0ZSwgODAwMCk7CisJCQkvKiBQdXQgdGhlIEFDTGluayBpbiAyIGNoYW5uZWwgbW9kZSBieSBkZWZhdWx0ICovCisJCQlpID0gSTgxMF9JT1JFQURMKGNhcmQsIEdMT0JfQ05UKTsKKwkJCUk4MTBfSU9XUklURUwoaSAmIDB4ZmZjZmZmZmYsIGNhcmQsIEdMT0JfQ05UKTsKKwkJfQorCX0KKwkJCisJLyogc2V0IGRlZmF1bHQgc2FtcGxlIGZvcm1hdC4gQWNjb3JkaW5nIHRvIE9TUyBQcm9ncmFtbWVyJ3MgR3VpZGUgIC9kZXYvZHNwCisJICAgc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kCisJICAgL2Rldi9kc3BXIHdpbGwgYWNjZXB0IDE2LWJpdHMgc2FtcGxlLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aG9zZSBzbyB3ZQorCSAgIHNldCBpdCBpbW1lZGlhdGVseSB0byBzdGVyZW8gYW5kIDE2Yml0LCB3aGljaCBpcyBhbGwgd2UgZG8gc3VwcG9ydCAqLworCWRtYWJ1Zi0+Zm10IHw9IEk4MTBfRk1UXzE2QklUIHwgSTgxMF9GTVRfU1RFUkVPOworCWRtYWJ1Zi0+b3NzZnJhZ3NpemUgPSAwOworCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgID0gMDsKKwlkbWFidWYtPnN1YmRpdmlzaW9uICA9IDA7CisKKwlzdGF0ZS0+b3Blbl9tb2RlIHw9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGk4MTBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGk4MTBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NrX2tlcm5lbCgpOworCisJLyogc3RvcCBETUEgc3RhdGUgbWFjaGluZSBhbmQgZnJlZSBETUEgYnVmZmVycy9jaGFubmVscyAqLworCWlmKGRtYWJ1Zi0+dHJpZ2dlciAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCWRyYWluX2RhYyhzdGF0ZSwgMCk7CisJfQorCWlmKGRtYWJ1Zi0+dHJpZ2dlciAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJc3RvcF9hZGMoc3RhdGUpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCWRlYWxsb2NfZG1hYnVmKHN0YXRlKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbC0+bnVtKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+cmVhZF9jaGFubmVsLT5udW0pOworCX0KKworCXN0YXRlLT5jYXJkLT5zdGF0ZXNbc3RhdGUtPnZpcnRdID0gTlVMTDsKKwlrZnJlZShzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgxMF9hdWRpb19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBpODEwX3JlYWQsCisJLndyaXRlCQk9IGk4MTBfd3JpdGUsCisJLnBvbGwJCT0gaTgxMF9wb2xsLAorCS5pb2N0bAkJPSBpODEwX2lvY3RsLAorCS5tbWFwCQk9IGk4MTBfbW1hcCwKKwkub3BlbgkJPSBpODEwX29wZW4sCisJLnJlbGVhc2UJPSBpODEwX3JlbGVhc2UsCit9OworCisvKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLworCitzdGF0aWMgdTE2IGk4MTBfYWM5N19nZXRfbW1pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcpCit7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IGRldi0+cHJpdmF0ZV9kYXRhOworCWludCBjb3VudCA9IDEwMDsKKwl1MTYgcmVnX3NldCA9IElPX1JFR19PRkYoZGV2KSB8IChyZWcmMHg3Zik7CisJCisJd2hpbGUoY291bnQtLSAmJiAocmVhZGIoY2FyZC0+aW9iYXNlX21taW8gKyBDQVMpICYgMSkpIAorCQl1ZGVsYXkoMSk7CisJCisjaWZkZWYgREVCVUdfTU1JTworCXsKKwkJdTE2IGFucyA9IHJlYWR3KGNhcmQtPmFjOTdiYXNlX21taW8gKyByZWdfc2V0KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImk4MTBfYXVkaW86IGFjOTdfZ2V0X21taW8oJWQpIC0+IDB4JTA0WFxuIiwgKChpbnQpIHJlZ19zZXQpICYgMHhmZmZmLCAodTMyKSBhbnMpOworCQlyZXR1cm4gYW5zOworCX0KKyNlbHNlCisJcmV0dXJuIHJlYWR3KGNhcmQtPmFjOTdiYXNlX21taW8gKyByZWdfc2V0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgdTE2IGk4MTBfYWM5N19nZXRfaW8oc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKQoreworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKKwlpbnQgY291bnQgPSAxMDA7CisJdTE2IHJlZ19zZXQgPSBJT19SRUdfT0ZGKGRldikgfCAocmVnJjB4N2YpOworCQorCXdoaWxlKGNvdW50LS0gJiYgKEk4MTBfSU9SRUFEQihjYXJkLCBDQVMpICYgMSkpIAorCQl1ZGVsYXkoMSk7CisJCisJcmV0dXJuIGludyhjYXJkLT5hYzk3YmFzZSArIHJlZ19zZXQpOworfQorCitzdGF0aWMgdm9pZCBpODEwX2FjOTdfc2V0X21taW8oc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7CisJaW50IGNvdW50ID0gMTAwOworCXUxNiByZWdfc2V0ID0gSU9fUkVHX09GRihkZXYpIHwgKHJlZyYweDdmKTsKKwkKKwl3aGlsZShjb3VudC0tICYmIChyZWFkYihjYXJkLT5pb2Jhc2VfbW1pbyArIENBUykgJiAxKSkgCisJCXVkZWxheSgxKTsKKwkKKwl3cml0ZXcoZGF0YSwgY2FyZC0+YWM5N2Jhc2VfbW1pbyArIHJlZ19zZXQpOworCisjaWZkZWYgREVCVUdfTU1JTworCXByaW50ayhLRVJOX0RFQlVHICJpODEwX2F1ZGlvOiBhYzk3X3NldF9tbWlvKDB4JTA0WCwgJWQpXG4iLCAodTMyKSBkYXRhLCAoKGludCkgcmVnX3NldCkgJiAweGZmZmYpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGk4MTBfYWM5N19zZXRfaW8oc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7CisJaW50IGNvdW50ID0gMTAwOworCXUxNiByZWdfc2V0ID0gSU9fUkVHX09GRihkZXYpIHwgKHJlZyYweDdmKTsKKwkKKwl3aGlsZShjb3VudC0tICYmIChJODEwX0lPUkVBREIoY2FyZCwgQ0FTKSAmIDEpKSAKKwkJdWRlbGF5KDEpOworCQorICAgICAgICBvdXR3KGRhdGEsIGNhcmQtPmFjOTdiYXNlICsgcmVnX3NldCk7Cit9CisKK3N0YXRpYyB1MTYgaTgxMF9hYzk3X2dldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcpCit7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IGRldi0+cHJpdmF0ZV9kYXRhOworCXUxNiByZXQ7CisJCisJc3Bpbl9sb2NrKCZjYXJkLT5hYzk3X2xvY2spOworCWlmIChjYXJkLT51c2VfbW1pbykgeworCQlyZXQgPSBpODEwX2FjOTdfZ2V0X21taW8oZGV2LCByZWcpOworCX0KKwllbHNlIHsKKwkJcmV0ID0gaTgxMF9hYzk3X2dldF9pbyhkZXYsIHJlZyk7CisJfQorCXNwaW5fdW5sb2NrKCZjYXJkLT5hYzk3X2xvY2spOworCQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7CisJCisJc3Bpbl9sb2NrKCZjYXJkLT5hYzk3X2xvY2spOworCWlmIChjYXJkLT51c2VfbW1pbykgeworCQlpODEwX2FjOTdfc2V0X21taW8oZGV2LCByZWcsIGRhdGEpOworCX0KKwllbHNlIHsKKwkJaTgxMF9hYzk3X3NldF9pbyhkZXYsIHJlZywgZGF0YSk7CisJfQorCXNwaW5fdW5sb2NrKCZjYXJkLT5hYzk3X2xvY2spOworfQorCisKKy8qIE9TUyAvZGV2L21peGVyIGZpbGUgb3BlcmF0aW9uIG1ldGhvZHMgKi8KKworc3RhdGljIGludCBpODEwX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IGRldnM7CisKKwlmb3IgKGNhcmQgPSBkZXZzOyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0KSB7CisJCS8qCisJCSAqIElmIHdlIGFyZSBpbml0aWFsaXppbmcgYW5kIHRoZW4gZmFpbCwgY2FyZCBjb3VsZCBnbworCQkgKiBhd2F5IHVudWV4cGVjdGVkbHkgd2hpbGUgd2UgYXJlIGluIHRoZSBmb3IoKSBsb29wLgorCQkgKiBTbywgY2hlY2sgZm9yIGNhcmQgb24gZWFjaCBpdGVyYXRpb24gYmVmb3JlIHdlIGNoZWNrCisJCSAqIGZvciBjYXJkLT5pbml0aWFsaXppbmcgdG8gYXZvaWQgYSBwb3NzaWJsZSBvb3BzLgorCQkgKiBUaGlzIHVzdWFsbHkgb25seSBtYXR0ZXJzIGZvciB0aW1lcyB3aGVuIHRoZSBkcml2ZXIgaXMKKwkJICogYXV0b2xvYWRlZCBieSBrbW9kLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDUwICYmIGNhcmQgJiYgY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoSFovMjApOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3ICYmIGNhcmQgJiYgIWNhcmQtPmluaXRpYWxpemluZzsgaSsrKSAKKwkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwgJiYKKwkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpIHsKKwkJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkLT5hYzk3X2NvZGVjW2ldOworCQkJCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwkJCX0KKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgxMF9taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gaTgxMF9pb2N0bF9taXhkZXYsCisJLm9wZW4JCT0gaTgxMF9vcGVuX21peGRldiwKK307CisKKy8qIEFDOTcgY29kZWMgaW5pdGlhbGlzYXRpb24uICBUaGVzZSBzbWFsbCBmdW5jdGlvbnMgZXhpc3Qgc28gd2UgZG9uJ3QKKyAgIGR1cGxpY2F0ZSBjb2RlIGJldHdlZW4gbW9kdWxlIGluaXQgYW5kIGFwbSByZXN1bWUgKi8KKworc3RhdGljIGlubGluZSBpbnQgaTgxMF9hYzk3X2V4aXN0cyhzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkLCBpbnQgYWM5N19udW1iZXIpCit7CisJdTMyIHJlZyA9IEk4MTBfSU9SRUFETChjYXJkLCBHTE9CX1NUQSk7CisJc3dpdGNoIChhYzk3X251bWJlcikgeworCWNhc2UgMDoKKwkJcmV0dXJuIHJlZyAmICgxPDw4KTsKKwljYXNlIDE6IAorCQlyZXR1cm4gcmVnICYgKDE8PDkpOworCWNhc2UgMjoKKwkJcmV0dXJuIHJlZyAmICgxPDwyOCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpODEwX2FjOTdfZW5hYmxlX3ZhcmlhYmxlX3JhdGUoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCWk4MTBfYWM5N19zZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCA5KTsKKwlpODEwX2FjOTdfc2V0KGNvZGVjLEFDOTdfRVhURU5ERURfU1RBVFVTLAorCQkgICAgICBpODEwX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyl8MHhFODAwKTsKKwkKKwlyZXR1cm4gKGk4MTBfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKSYxKTsKK30KKworCitzdGF0aWMgaW50IGk4MTBfYWM5N19wcm9iZV9hbmRfcG93ZXJ1cChzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkLHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwkvKiBSZXR1cm5zIDAgb24gZmFpbHVyZSAqLworCWludCBpOworCisJaWYgKGFjOTdfcHJvYmVfY29kZWMoY29kZWMpID09IDApIHJldHVybiAwOworCQorCS8qIHBvd2VyIGl0IGFsbCB1cCAqLworCWk4MTBfYWM5N19zZXQoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwKKwkJICAgICAgaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19QT1dFUl9DT05UUk9MKSAmIH4weDdmMDApOworCisJLyogd2FpdCBmb3IgYW5hbG9nIHJlYWR5ICovCisJZm9yIChpPTEwMDsgaSAmJiAoKGk4MTBfYWM5N19nZXQoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAweGYpICE9IDB4Zik7IGktLSkKKwl7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChIWi8yMCk7CisJfSAKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBpc19uZXdfaWNoKHUxNiBwY2lfaWQpCit7CisJc3dpdGNoIChwY2lfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl81OgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVCXzU6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0VTQl81OgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzE4OgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWNoX3VzZV9tbWlvKHN0cnVjdCBpODEwX2NhcmQgKmNhcmQpCit7CisJcmV0dXJuIGlzX25ld19pY2goY2FyZC0+cGNpX2lkKSAmJiBjYXJkLT51c2VfbW1pbzsKK30KKworLyoqCisgKglpODEwX2FjOTdfcG93ZXJfdXBfYnVzCS0JYnJpbmcgdXAgQUM5NyBsaW5rCisgKglAY2FyZCA6IElDSCBhdWRpbyBkZXZpY2UgdG8gcG93ZXIgdXAKKyAqCisgKglCcmluZyB1cCB0aGUgQUNMaW5rIEFDOTcgY29kZWMgYnVzCisgKi8KKyAKK3N0YXRpYyBpbnQgaTgxMF9hYzk3X3Bvd2VyX3VwX2J1cyhzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkKQorewkKKwl1MzIgcmVnID0gSTgxMF9JT1JFQURMKGNhcmQsIEdMT0JfQ05UKTsKKwlpbnQgaTsKKwlpbnQgcHJpbWFyeV9jb2RlY19pZCA9IDA7CisKKwlpZigocmVnJjIpPT0wKQkvKiBDb2xkIHJlcXVpcmVkICovCisJCXJlZ3w9MjsKKwllbHNlCisJCXJlZ3w9NDsJLyogV2FybSAqLworCQkKKwlyZWcmPX44OwkvKiBBQ0xpbmsgb24gKi8KKwkKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGRlYXNzZXJ0IEFDX1JFU0VUICMgKi8KKwlJODEwX0lPV1JJVEVMKHJlZyAsIGNhcmQsIEdMT0JfQ05UKTsKKworCS8qIFdlIG11c3Qgbm93IGFsbG93IHRpbWUgZm9yIHRoZSBDb2RlYyBpbml0aWFsaXNhdGlvbi4KKwkgICA2MDBtUyBpcyB0aGUgc3BlY2lmaWVkIHRpbWUgKi8KKwkgICAJCisJZm9yKGk9MDtpPDEwO2krKykKKwl7CisJCWlmKChJODEwX0lPUkVBREwoY2FyZCwgR0xPQl9DTlQpJjQpPT0wKQorCQkJYnJlYWs7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzIwKTsKKwl9CisJaWYoaT09MTApCisJeworCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IEFDJzk3IHJlc2V0IGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWi8yKTsKKworCS8qCisJICoJU2VlIGlmIHRoZSBwcmltYXJ5IGNvZGVjIGNvbWVzIHJlYWR5LiBUaGlzIG11c3QgaGFwcGVuCisJICoJYmVmb3JlIHdlIHN0YXJ0IGRvaW5nIERNQSBzdHVmZgorCSAqLwkKKwkvKiBzZWUgaTgxMF9hYzk3X2luaXQgZm9yIHRoZSBuZXh0IDEwIGxpbmVzIChqc2F3KSAqLworCWlmIChjYXJkLT51c2VfbW1pbykKKwkJcmVhZHcoY2FyZC0+YWM5N2Jhc2VfbW1pbyk7CisJZWxzZQorCQlpbncoY2FyZC0+YWM5N2Jhc2UpOworCWlmIChpY2hfdXNlX21taW8oY2FyZCkpIHsKKwkJcHJpbWFyeV9jb2RlY19pZCA9IChpbnQpIHJlYWRsKGNhcmQtPmlvYmFzZV9tbWlvICsgU0RNKSAmIDB4MzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaTgxMF9hdWRpbzogUHJpbWFyeSBjb2RlYyBoYXMgSUQgJWRcbiIsCisJCSAgICAgICBwcmltYXJ5X2NvZGVjX2lkKTsKKwl9CisKKwlpZighIGk4MTBfYWM5N19leGlzdHMoY2FyZCwgcHJpbWFyeV9jb2RlY19pZCkpCisJeworCQlwcmludGsoS0VSTl9JTkZPICJpODEwX2F1ZGlvOiBDb2RlYyBub3QgcmVhZHkuLiB3YWl0Li4gIik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChIWik7CS8qIGFjdHVhbGx5IDYwMG1TIGJ5IHRoZSBzcGVjICovCisKKwkJaWYoaTgxMF9hYzk3X2V4aXN0cyhjYXJkLCBwcmltYXJ5X2NvZGVjX2lkKSkKKwkJCXByaW50aygiT0tcbiIpOworCQllbHNlIAorCQkJcHJpbnRrKCJubyByZXNwb25zZS5cbiIpOworCX0KKwlpZiAoY2FyZC0+dXNlX21taW8pCisJCXJlYWR3KGNhcmQtPmFjOTdiYXNlX21taW8pOworCWVsc2UKKwkJaW53KGNhcmQtPmFjOTdiYXNlKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaTgxMF9hYzk3X2luaXQoc3RydWN0IGk4MTBfY2FyZCAqY2FyZCkKK3sKKwlpbnQgbnVtX2FjOTcgPSAwOworCWludCBhYzk3X2lkOworCWludCB0b3RhbF9jaGFubmVscyA9IDA7CisJaW50IG5yX2FjOTdfbWF4ID0gY2FyZF9jYXBbY2FyZC0+cGNpX2lkX2ludGVybmFsXS5ucl9hYzk3OworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYzsKKwl1MTYgZWlkOworCXUzMiByZWc7CisKKwlpZighaTgxMF9hYzk3X3Bvd2VyX3VwX2J1cyhjYXJkKSkgcmV0dXJuIDA7CisKKwkvKiBOdW1iZXIgb2YgY2hhbm5lbHMgc3VwcG9ydGVkICovCisJLyogV2hhdCBhYm91dCB0aGUgY29kZWM/ICBKdXN0IGJlY2F1c2UgdGhlIElDSCBzdXBwb3J0cyAqLworCS8qIG11bHRpcGxlIGNoYW5uZWxzIGRvZXNuJ3QgbWVhbiB0aGUgY29kZWMgZG9lcy4gICAgICAgKi8KKwkvKiB3ZSdsbCBoYXZlIHRvIG1vZGlmeSB0aGlzIGluIHRoZSBjb2RlYyBzZWN0aW9uIGJlbG93ICovCisJLyogdG8gcmVmbGVjdCB3aGF0IHRoZSBjb2RlYyBoYXMuICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIElDSCBhbmQgSUNIMCBvbmx5IHN1cHBvcnQgMiBjaGFubmVscyBzbyBkb24ndCBib3RoZXIgKi8KKwkvKiB0byBjaGVjay4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwljYXJkLT5jaGFubmVscyA9IDI7CisJcmVnID0gSTgxMF9JT1JFQURMKGNhcmQsIEdMT0JfU1RBKTsKKwlpZiAoIHJlZyAmIDB4MDIwMDAwMCApCisJCWNhcmQtPmNoYW5uZWxzID0gNjsKKwllbHNlIGlmICggcmVnICYgMHgwMTAwMDAwICkKKwkJY2FyZC0+Y2hhbm5lbHMgPSA0OworCXByaW50ayhLRVJOX0lORk8gImk4MTBfYXVkaW86IEF1ZGlvIENvbnRyb2xsZXIgc3VwcG9ydHMgJWQgY2hhbm5lbHMuXG4iLCBjYXJkLT5jaGFubmVscyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiaTgxMF9hdWRpbzogRGVmYXVsdGluZyB0byBiYXNlIDIgY2hhbm5lbCBtb2RlLlxuIik7CisJcmVnID0gSTgxMF9JT1JFQURMKGNhcmQsIEdMT0JfQ05UKTsKKwlJODEwX0lPV1JJVEVMKHJlZyAmIDB4ZmZjZmZmZmYsIGNhcmQsIEdMT0JfQ05UKTsKKwkJCisJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgCisJCWNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID0gTlVMTDsKKworCS8qQEZJWE1FIEkgZG9uJ3Qga25vdywgaWYgSSdtIHBsYXlpbmcgdG8gc2FmZSBoZXJlLi4uIChqc2F3KSAqLworCWlmICgobnJfYWM5N19tYXggPiAyKSAmJiAhY2FyZC0+dXNlX21taW8pIG5yX2FjOTdfbWF4ID0gMjsKKworCWZvciAobnVtX2FjOTcgPSAwOyBudW1fYWM5NyA8IG5yX2FjOTdfbWF4OyBudW1fYWM5NysrKSB7CisJCS8qIGNvZGVjIHJlc2V0ICovCisJCXByaW50ayhLRVJOX0lORk8gImk4MTBfYXVkaW86IFJlc2V0dGluZyBjb25uZWN0aW9uICVkXG4iLCBudW1fYWM5Nyk7CisJCWlmIChjYXJkLT51c2VfbW1pbykKKwkJCXJlYWR3KGNhcmQtPmFjOTdiYXNlX21taW8gKyAweDgwKm51bV9hYzk3KTsKKwkJZWxzZQorCQkJaW53KGNhcmQtPmFjOTdiYXNlICsgMHg4MCpudW1fYWM5Nyk7CisKKwkJLyogSWYgd2UgaGF2ZSB0aGUgU0RBVEFfSU4gTWFwIFJlZ2lzdGVyLCBhcyBvbiBJQ0g0LCB3ZQorCQkgICBkbyBub3QgbG9vcCB0aHJ1IGFsbCBwb3NzaWJsZSBjb2RlYyBJRHMgYnV0IHRocnUgYWxsIAorCQkgICBwb3NzaWJsZSBJTyBjaGFubmVscy4gQml0IDA6MSBvZiBTRE0gdGhlbiBob2xkcyB0aGUgCisJCSAgIGxhc3QgY29kZWMgSUQgc3Bva2VuIHRvLiAKKwkJKi8KKwkJaWYgKGljaF91c2VfbW1pbyhjYXJkKSkgeworCQkJYWM5N19pZCA9IChpbnQpIHJlYWRsKGNhcmQtPmlvYmFzZV9tbWlvICsgU0RNKSAmIDB4MzsKKwkJCXByaW50ayhLRVJOX0lORk8gImk4MTBfYXVkaW86IENvbm5lY3Rpb24gJWQgd2l0aCBjb2RlYyBpZCAlZFxuIiwKKwkJCSAgICAgICBudW1fYWM5NywgYWM5N19pZCk7CisJCX0KKwkJZWxzZSB7CisJCQlhYzk3X2lkID0gbnVtX2FjOTc7CisJCX0KKworCQkvKiBUaGUgSUNIIHByb2dyYW1tZXIncyByZWZlcmVuY2Ugc2F5cyB5b3Ugc2hvdWxkICAgKi8KKwkJLyogY2hlY2sgdGhlIHJlYWR5IHN0YXR1cyBiZWZvcmUgcHJvYmluZy4gU28gd2UgY2hrICovCisJCS8qICAgV2hhdCBkbyB3ZSBkbyBpZiBpdCdzIG5vdCByZWFkeT8gIFdhaXQgYW5kIHRyeSAqLworCQkvKiAgIGFnYWluLCBvciBhYm9ydD8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJaWYgKCFpODEwX2FjOTdfZXhpc3RzKGNhcmQsIGFjOTdfaWQpKSB7CisJCQlpZihudW1fYWM5NyA9PSAwKQorCQkJCXByaW50ayhLRVJOX0VSUiAiaTgxMF9hdWRpbzogUHJpbWFyeSBjb2RlYyBub3QgcmVhZHkuXG4iKTsKKwkJfQorCQkKKwkJaWYgKChjb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIGluaXRpYWxpemUgc29tZSBiYXNpYyBjb2RlYyBpbmZvcm1hdGlvbiwgb3RoZXIgZmllbGRzIHdpbGwgYmUgZmlsbGVkCisJCSAgIGluIGFjOTdfcHJvYmVfY29kZWMgKi8KKwkJY29kZWMtPnByaXZhdGVfZGF0YSA9IGNhcmQ7CisJCWNvZGVjLT5pZCA9IGFjOTdfaWQ7CisJCWNhcmQtPmFjOTdfaWRfbWFwW2FjOTdfaWRdID0gbnVtX2FjOTcgKiAweDgwOworCisJCWlmIChjYXJkLT51c2VfbW1pbykgewkKKwkJCWNvZGVjLT5jb2RlY19yZWFkID0gaTgxMF9hYzk3X2dldF9tbWlvOworCQkJY29kZWMtPmNvZGVjX3dyaXRlID0gaTgxMF9hYzk3X3NldF9tbWlvOworCQl9CisJCWVsc2UgeworCQkJY29kZWMtPmNvZGVjX3JlYWQgPSBpODEwX2FjOTdfZ2V0X2lvOworCQkJY29kZWMtPmNvZGVjX3dyaXRlID0gaTgxMF9hYzk3X3NldF9pbzsKKwkJfQorCQorCQlpZighaTgxMF9hYzk3X3Byb2JlX2FuZF9wb3dlcnVwKGNhcmQsY29kZWMpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IHRpbWVkIG91dCB3YWl0aW5nIGZvciBjb2RlYyAlZCBhbmFsb2cgcmVhZHkuXG4iLCBhYzk3X2lkKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisJCQlicmVhazsJLyogaXQgZGlkbid0IHdvcmsgKi8KKwkJfQorCQkvKiBTdG9yZSBzdGF0ZSBpbmZvcm1hdGlvbiBhYm91dCBTL1BESUYgdHJhbnNtaXR0ZXIgKi8KKwkJY2FyZC0+YWM5N19zdGF0dXMgPSAwOworCQkKKwkJLyogRG9uJ3QgYXR0ZW1wdCB0byBnZXQgZWlkIHVudGlsIHBvd2VydXAgaXMgY29tcGxldGUgKi8KKwkJZWlkID0gaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCk7CisKKwkJaWYoZWlkPT0weEZGRkYpCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImk4MTBfYXVkaW86IG5vIGNvZGVjIGF0dGFjaGVkID9cbiIpOworCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKKwkJCWJyZWFrOworCQl9CisJCQorCQkvKiBDaGVjayBmb3IgYW4gQUM5NyAxLjAgc29mdCBtb2RlbSAoSUQxKSAqLworCQkKKwkJaWYoY29kZWMtPm1vZGVtKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpODEwX2F1ZGlvOiBjb2RlYyAlZCBpcyBhIHNvZnRtb2RlbSAtIHNraXBwaW5nLlxuIiwgYWM5N19pZCk7CisJCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOworCQkJY29udGludWU7CisJCX0KKwkJCisJCWNhcmQtPmFjOTdfZmVhdHVyZXMgPSBlaWQ7CisKKwkJLyogTm93IGNoZWNrIHRoZSBjb2RlYyBmb3IgdXNlZnVsIGZlYXR1cmVzIHRvIG1ha2UgdXAgZm9yCisJCSAgIHRoZSBkdW1ibmVzcyBvZiB0aGUgODEwIGhhcmR3YXJlIGVuZ2luZSAqLworCisJCWlmKCEoZWlkJjB4MDAwMSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpODEwX2F1ZGlvOiBvbmx5IDQ4S2h6IHBsYXliYWNrIGF2YWlsYWJsZS5cbiIpOworCQllbHNlCisJCXsKKwkJCWlmKCFpODEwX2FjOTdfZW5hYmxlX3ZhcmlhYmxlX3JhdGUoY29kZWMpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTgxMF9hdWRpbzogQ29kZWMgcmVmdXNlZCB0byBhbGxvdyBWUkEsIHVzaW5nIDQ4S2h6IG9ubHkuXG4iKTsKKwkJCQljYXJkLT5hYzk3X2ZlYXR1cmVzJj1+MTsKKwkJCX0JCQkKKwkJfQorICAgCQkKKwkJLyogVHVybiBvbiB0aGUgYW1wbGlmaWVyICovCisKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsIAorCQkJIGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgfjB4ODAwMCk7CisJCQkJCisJCS8qIERldGVybWluZSBob3cgbWFueSBjaGFubmVscyB0aGUgY29kZWMocykgc3VwcG9ydCAgICovCisJCS8qICAgLSBUaGUgcHJpbWFyeSBjb2RlYyBhbHdheXMgc3VwcG9ydHMgMiAgICAgICAgICAgICovCisJCS8qICAgLSBJZiB0aGUgY29kZWMgc3VwcG9ydHMgQU1BUCwgc3Vycm91bmQgREFDcyB3aWxsICovCisJCS8qICAgICBhdXRvbWF0aWNsbHkgZ2V0IGFzc2lnbmVkIHRvIHNsb3RzLiAgICAgICAgICAgICovCisJCS8qICAgICAqIENoZWNrIGZvciBzdXJyb3VuZCBEQUNzIGFuZCBpbmNyZW1lbnQgaWYgICAgICovCisJCS8qICAgICAgIGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCS8qICAgLSBFbHNlIGNoZWNrIGlmIHRoZSBjb2RlYyBpcyByZXZpc2lvbiAyLjIgICAgICAgICovCisJCS8qICAgICAqIElmIHN1cnJvdW5kIERBQ3MgZXhpc3QsIGFzc2lnbiB0aGVtIHRvIHNsb3RzICovCisJCS8qICAgICAgIGFuZCBpbmNyZW1lbnQgY2hhbm5lbCBjb3VudC4gICAgICAgICAgICAgICAgICovCisKKwkJLyogQWxsIG9mIHRoaXMgb25seSBhcHBsaWVzIHRvIElDSDIgYW5kIGFib3ZlLiBJQ0ggICAgKi8KKwkJLyogYW5kIElDSDAgb25seSBzdXBwb3J0IDIgY2hhbm5lbHMuICBJQ0gyIHdpbGwgb25seSAgKi8KKwkJLyogc3VwcG9ydCBtdWx0aXBsZSBjb2RlY3MgaW4gYSAic3BsaXQgYXVkaW8iIGNvbmZpZy4gKi8KKwkJLyogYXMgZGVzY3JpYmVkIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCQkvKiBUT0RPOiBSZW1vdmUgYWxsIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZXMhICAgICAgICAgICAqLworCisJCWlmKChlaWQgJiAweGMwMDApID09IDApIC8qIHByaW1hcnkgY29kZWMgKi8KKwkJCXRvdGFsX2NoYW5uZWxzICs9IDI7IAorCisJCWlmKGVpZCAmIDB4MjAwKSB7IC8qIEdPT0QsIEFNQVAgc3VwcG9ydCAqLworCQkJaWYgKGVpZCAmIDB4MDA4MCkgLyogTC9SIFN1cnJvdW5kIGNoYW5uZWxzICovCisJCQkJdG90YWxfY2hhbm5lbHMgKz0gMjsKKwkJCWlmIChlaWQgJiAweDAxNDApIC8qIExGRSBhbmQgQ2VudGVyIGNoYW5uZWxzICovCisJCQkJdG90YWxfY2hhbm5lbHMgKz0gMjsKKwkJCXByaW50aygiaTgxMF9hdWRpbzogQUMnOTcgY29kZWMgJWQgc3VwcG9ydHMgQU1BUCwgdG90YWwgY2hhbm5lbHMgPSAlZFxuIiwgYWM5N19pZCwgdG90YWxfY2hhbm5lbHMpOworCQl9IGVsc2UgaWYgKGVpZCAmIDB4MDQwMCkgeyAgLyogdGhpcyBvbmx5IHdvcmtzIG9uIDIuMiBjb21wbGlhbnQgY29kZWNzICovCisJCQllaWQgJj0gMHhmZmNmOworCQkJaWYoKGVpZCAmIDB4YzAwMCkgIT0gMCkJeworCQkJCXN3aXRjaCAoIHRvdGFsX2NoYW5uZWxzICkgeworCQkJCQljYXNlIDI6CisJCQkJCQkvKiBTZXQgZHNhMSwgZHNhMCB0byAwMSAqLworCQkJCQkJZWlkIHw9IDB4MDAxMDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQkvKiBTZXQgZHNhMSwgZHNhMCB0byAxMCAqLworCQkJCQkJZWlkIHw9IDB4MDAyMDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDY6CisJCQkJCQkvKiBTZXQgZHNhMSwgZHNhMCB0byAxMSAqLworCQkJCQkJZWlkIHw9IDB4MDAzMDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQl0b3RhbF9jaGFubmVscyArPSAyOworCQkJfQorCQkJaTgxMF9hYzk3X3NldChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCwgZWlkKTsKKwkJCWVpZCA9IGk4MTBfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfSUQpOworCQkJcHJpbnRrKCJpODEwX2F1ZGlvOiBBQyc5NyBjb2RlYyAlZCwgbmV3IEVJRCB2YWx1ZSA9IDB4JTA0eFxuIiwgYWM5N19pZCwgZWlkKTsKKwkJCWlmIChlaWQgJiAweDAwODApIC8qIEwvUiBTdXJyb3VuZCBjaGFubmVscyAqLworCQkJCXRvdGFsX2NoYW5uZWxzICs9IDI7CisJCQlpZiAoZWlkICYgMHgwMTQwKSAvKiBMRkUgYW5kIENlbnRlciBjaGFubmVscyAqLworCQkJCXRvdGFsX2NoYW5uZWxzICs9IDI7CisJCQlwcmludGsoImk4MTBfYXVkaW86IEFDJzk3IGNvZGVjICVkLCBEQUMgbWFwIGNvbmZpZ3VyZWQsIHRvdGFsIGNoYW5uZWxzID0gJWRcbiIsIGFjOTdfaWQsIHRvdGFsX2NoYW5uZWxzKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiaTgxMF9hdWRpbzogQUMnOTcgY29kZWMgJWQgVW5hYmxlIHRvIG1hcCBzdXJyb3VuZCBEQUMncyAob3IgREFDJ3Mgbm90IHByZXNlbnQpLCB0b3RhbCBjaGFubmVscyA9ICVkXG4iLCBhYzk3X2lkLCB0b3RhbF9jaGFubmVscyk7CisJCX0KKworCQlpZiAoKGNvZGVjLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmaTgxMF9taXhlcl9mb3BzLCAtMSkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpODEwX2F1ZGlvOiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOworCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBjb2RlYzsKKwl9CisKKwkvKiB0dW5lIHVwIHRoZSBwcmltYXJ5IGNvZGVjICovCisJYWM5N190dW5lX2hhcmR3YXJlKGNhcmQtPnBjaV9kZXYsIGFjOTdfcXVpcmtzLCBhYzk3X3F1aXJrKTsKKworCS8qIHBpY2sgdGhlIG1pbmltdW0gb2YgY2hhbm5lbHMgc3VwcG9ydGVkIGJ5IElDSHggb3IgY29kZWMocykgKi8KKwljYXJkLT5jaGFubmVscyA9IChjYXJkLT5jaGFubmVscyA+IHRvdGFsX2NoYW5uZWxzKT90b3RhbF9jaGFubmVsczpjYXJkLT5jaGFubmVsczsKKworCXJldHVybiBudW1fYWM5NzsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGk4MTBfY29uZmlndXJlX2Nsb2NraW5nICh2b2lkKQoreworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQ7CisJc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwl1bnNpZ25lZCBpbnQgaSwgb2Zmc2V0LCBuZXdfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljYXJkID0gZGV2czsKKwkvKiBXZSBjb3VsZCB0cnkgdG8gc2V0IHRoZSBjbG9ja2luZyBmb3IgbXVsdGlwbGUgY2FyZHMsIGJ1dCBjYW4geW91IGV2ZW4gaGF2ZQorCSAqIG1vcmUgdGhhbiBvbmUgaTgxMCBpbiBhIG1hY2hpbmU/ICBCZXNpZGVzLCBjbG9ja2luZyBpcyBnbG9iYWwsIHNvIHVubGVzcworCSAqIHNvbWVvbmUgYWN0dWFsbHkgdGhpbmtzIG1vcmUgdGhhbiBvbmUgaTgxMCBpbiBhIG1hY2hpbmUgaXMgcG9zc2libGUgYW5kCisJICogZGVjaWRlcyB0byByZXdyaXRlIHRoYXQgbGl0dGxlIGJpdCwgc2V0dGluZyB0aGUgcmF0ZSBmb3IgbW9yZSB0aGFuIG9uZSBjYXJkCisJICogaXMgYSB3YXN0ZSBvZiB0aW1lLgorCSAqLworCWlmKGNhcmQgIT0gTlVMTCkgeworCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXSA9IChzdHJ1Y3QgaTgxMF9zdGF0ZSAqKQorCQkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTgxMF9zdGF0ZSksIEdGUF9LRVJORUwpOworCQlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RydWN0IGk4MTBfc3RhdGUpKTsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisKKwkJZG1hYnVmLT53cml0ZV9jaGFubmVsID0gY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCk7CisJCXN0YXRlLT52aXJ0ID0gMDsKKwkJc3RhdGUtPmNhcmQgPSBjYXJkOworCQlzdGF0ZS0+bWFnaWMgPSBJODEwX1NUQVRFX01BR0lDOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFidWYtPndhaXQpOworCQlpbml0X01VVEVYKCZzdGF0ZS0+b3Blbl9zZW0pOworCQlkbWFidWYtPmZtdCA9IEk4MTBfRk1UX1NURVJFTyB8IEk4MTBfRk1UXzE2QklUOworCQlkbWFidWYtPnRyaWdnZXIgPSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJaTgxMF9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCAtMSwgMCk7CisJCWk4MTBfc2V0X2RhY19jaGFubmVscyhzdGF0ZSwgMik7CisJCWk4MTBfc2V0X2RhY19yYXRlKHN0YXRlLCA0ODAwMCk7CisJCWlmKHByb2dfZG1hYnVmKHN0YXRlLCAwKSAhPSAwKSB7CisJCQlnb3RvIGNvbmZpZ19vdXRfbm9kbWFidWY7CisJCX0KKwkJaWYoZG1hYnVmLT5kbWFzaXplIDwgMTYzODQpIHsKKwkJCWdvdG8gY29uZmlnX291dDsKKwkJfQorCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5kbWFzaXplOworCQlDSVZfVE9fTFZJKGNhcmQsIGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbC0+cG9ydCwgLTEpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCXN0YXJ0X2RhYyhzdGF0ZSk7CisJCW9mZnNldCA9IGk4MTBfZ2V0X2RtYV9hZGRyKHN0YXRlLCAwKTsKKwkJbWRlbGF5KDUwKTsKKwkJbmV3X29mZnNldCA9IGk4MTBfZ2V0X2RtYV9hZGRyKHN0YXRlLCAwKTsKKwkJc3RvcF9kYWMoc3RhdGUpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWkgPSBuZXdfb2Zmc2V0IC0gb2Zmc2V0OworI2lmZGVmIERFQlVHX0lOVEVSUlVQVFMKKwkJcHJpbnRrKCJpODEwX2F1ZGlvOiAlZCBieXRlcyBpbiA1MCBtaWxsaXNlY29uZHNcbiIsIGkpOworI2VuZGlmCisJCWlmKGkgPT0gMCkKKwkJCWdvdG8gY29uZmlnX291dDsKKwkJaSA9IGkgLyA0ICogMjA7CisJCWlmIChpID4gNDg1MDAgfHwgaSA8IDQ3NTAwKSB7CisJCQljbG9ja2luZyA9IGNsb2NraW5nICogY2xvY2tpbmcgLyBpOworCQkJcHJpbnRrKCJpODEwX2F1ZGlvOiBzZXR0aW5nIGNsb2NraW5nIHRvICVkXG4iLCBjbG9ja2luZyk7CisJCX0KK2NvbmZpZ19vdXQ6CisJCWRlYWxsb2NfZG1hYnVmKHN0YXRlKTsKK2NvbmZpZ19vdXRfbm9kbWFidWY6CisJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkLHN0YXRlLT5kbWFidWYud3JpdGVfY2hhbm5lbC0+bnVtKTsKKwkJa2ZyZWUoc3RhdGUpOworCQljYXJkLT5zdGF0ZXNbMF0gPSBOVUxMOworCX0KK30KKworLyogaW5zdGFsbCB0aGUgZHJpdmVyLCB3ZSBkbyBub3QgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbCBub3IgRE1BIGJ1ZmZlciBub3csIHRoZXkgYXJlIGRlZmVyZWQgCisgICB1bnRpbCAiQUNDRVNTIiB0aW1lIChpbiBwcm9nX2RtYWJ1ZiBjYWxsZWQgYnkgb3Blbi9yZWFkL3dyaXRlL2lvY3RsL21tYXApICovCisgICAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGk4MTBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZDsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCBJODEwX0RNQV9NQVNLKSkgeworCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IgorCQkgICAgICAgIiAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkKKwlpZiAoKGNhcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTgxMF9jYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpODEwX2F1ZGlvOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChjYXJkLCAwLCBzaXplb2YoKmNhcmQpKTsKKworCWNhcmQtPmluaXRpYWxpemluZyA9IDE7CisJY2FyZC0+cGNpX2RldiA9IHBjaV9kZXY7CisJY2FyZC0+cGNpX2lkID0gcGNpX2lkLT5kZXZpY2U7CisJY2FyZC0+YWM5N2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBjaV9kZXYsIDApOworCWNhcmQtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGNpX2RldiwgMSk7CisKKwlpZiAoIShjYXJkLT5hYzk3YmFzZSkgfHwgIShjYXJkLT5pb2Jhc2UpKSB7CisJCWNhcmQtPmFjOTdiYXNlID0gMDsKKwkJY2FyZC0+aW9iYXNlID0gMDsKKwl9CisKKwkvKiBpZiBjaGlwc2V0IGNvdWxkIGhhdmUgbW1pbyBjYXBhYmlsaXR5LCBjaGVjayBpdCAqLyAKKwlpZiAoY2FyZF9jYXBbcGNpX2lkLT5kcml2ZXJfZGF0YV0uZmxhZ3MgJiBDQVBfTU1JTykgeworCQljYXJkLT5hYzk3YmFzZV9tbWlvX3BoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBjaV9kZXYsIDIpOworCQljYXJkLT5pb2Jhc2VfbW1pb19waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwY2lfZGV2LCAzKTsKKworCQlpZiAoKGNhcmQtPmFjOTdiYXNlX21taW9fcGh5cykgJiYgKGNhcmQtPmlvYmFzZV9tbWlvX3BoeXMpKSB7CisJCQljYXJkLT51c2VfbW1pbyA9IDE7CisJCX0KKwkJZWxzZSB7CisJCQljYXJkLT5hYzk3YmFzZV9tbWlvX3BoeXMgPSAwOworCQkJY2FyZC0+aW9iYXNlX21taW9fcGh5cyA9IDA7CisJCX0KKwl9CisKKwlpZiAoIShjYXJkLT51c2VfbW1pbykgJiYgKCEoY2FyZC0+aW9iYXNlKSB8fCAhKGNhcmQtPmFjOTdiYXNlKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpODEwX2F1ZGlvOiBObyBJL08gcmVzb3VyY2VzIGF2YWlsYWJsZS5cbiIpOworCQlnb3RvIG91dF9tZW07CisJfQorCisJY2FyZC0+aXJxID0gcGNpX2Rldi0+aXJxOworCWNhcmQtPm5leHQgPSBkZXZzOworCWNhcmQtPm1hZ2ljID0gSTgxMF9DQVJEX01BR0lDOworI2lmZGVmIENPTkZJR19QTQorCWNhcmQtPnBtX3N1c3BlbmRlZD0wOworI2VuZGlmCisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5hYzk3X2xvY2spOworCWRldnMgPSBjYXJkOworCisJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CisKKwlwcmludGsoS0VSTl9JTkZPICJpODEwOiAlcyBmb3VuZCBhdCBJTyAweCUwNGx4IGFuZCAweCUwNGx4LCAiCisJICAgICAgICJNRU0gMHglMDRseCBhbmQgMHglMDRseCwgSVJRICVkXG4iLAorCSAgICAgICBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCAKKwkgICAgICAgY2FyZC0+aW9iYXNlLCBjYXJkLT5hYzk3YmFzZSwgCisJICAgICAgIGNhcmQtPmFjOTdiYXNlX21taW9fcGh5cywgY2FyZC0+aW9iYXNlX21taW9fcGh5cywKKwkgICAgICAgY2FyZC0+aXJxKTsKKworCWNhcmQtPmFsbG9jX3BjbV9jaGFubmVsID0gaTgxMF9hbGxvY19wY21fY2hhbm5lbDsKKwljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBpODEwX2FsbG9jX3JlY19wY21fY2hhbm5lbDsKKwljYXJkLT5hbGxvY19yZWNfbWljX2NoYW5uZWwgPSBpODEwX2FsbG9jX3JlY19taWNfY2hhbm5lbDsKKwljYXJkLT5mcmVlX3BjbV9jaGFubmVsID0gaTgxMF9mcmVlX3BjbV9jaGFubmVsOworCisJaWYgKChjYXJkLT5jaGFubmVsID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwKKwkgICAgc2l6ZW9mKHN0cnVjdCBpODEwX2NoYW5uZWwpKk5SX0hXX0NILCAmY2FyZC0+Y2hhbmRtYSkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpODEwOiBjYW5ub3QgYWxsb2NhdGUgY2hhbm5lbCBETUEgbWVtb3J5XG4iKTsKKwkJZ290byBvdXRfbWVtOworCX0KKworCXsgLyogV2UgbWF5IGRpc3Bvc2Ugb2YgdGhpcyBhbHRvZ2V0aGVyIHNvbWUgdGltZSBzb29uLCBzby4uLiAqLworCQlzdHJ1Y3QgaTgxMF9jaGFubmVsICpjcCA9IGNhcmQtPmNoYW5uZWw7CisKKwkJY3BbMF0ub2Zmc2V0ID0gMDsKKwkJY3BbMF0ucG9ydCA9IDB4MDA7CisJCWNwWzBdLm51bSA9IDA7CisJCWNwWzFdLm9mZnNldCA9IDA7CisJCWNwWzFdLnBvcnQgPSAweDEwOworCQljcFsxXS5udW0gPSAxOworCQljcFsyXS5vZmZzZXQgPSAwOworCQljcFsyXS5wb3J0ID0gMHgyMDsKKwkJY3BbMl0ubnVtID0gMjsKKwl9CisKKwkvKiBjbGFpbSBvdXIgaW9zcGFjZSBhbmQgaXJxICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihjYXJkLT5pb2Jhc2UsIDY0LCBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdKSkgeworCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IHVuYWJsZSB0byBhbGxvY2F0ZSByZWdpb24gJWx4XG4iLCBjYXJkLT5pb2Jhc2UpOworCQlnb3RvIG91dF9yZWdpb24xOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGNhcmQtPmFjOTdiYXNlLCAyNTYsIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTgxMF9hdWRpbzogdW5hYmxlIHRvIGFsbG9jYXRlIHJlZ2lvbiAlbHhcbiIsIGNhcmQtPmFjOTdiYXNlKTsKKwkJZ290byBvdXRfcmVnaW9uMjsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCAmaTgxMF9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpODEwX2F1ZGlvOiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkXG4iLCBjYXJkLT5pcnEpOworCQlnb3RvIG91dF9waW87CisJfQorCisJaWYgKGNhcmQtPnVzZV9tbWlvKSB7CisJCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oY2FyZC0+YWM5N2Jhc2VfbW1pb19waHlzLCA1MTIsICJpY2hfYXVkaW8gTU1CQVIiKSkgeworCQkJaWYgKChjYXJkLT5hYzk3YmFzZV9tbWlvID0gaW9yZW1hcChjYXJkLT5hYzk3YmFzZV9tbWlvX3BoeXMsIDUxMikpKSB7IC8qQEZJWE1FIGNhbiBpb3JlbWFwIGZhaWw/IGRvbid0IGtub3cgKGpzYXcpICovCisJCQkJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihjYXJkLT5pb2Jhc2VfbW1pb19waHlzLCAyNTYsICJpY2hfYXVkaW8gTUJCQVIiKSkgeworCQkJCQlpZiAoKGNhcmQtPmlvYmFzZV9tbWlvID0gaW9yZW1hcChjYXJkLT5pb2Jhc2VfbW1pb19waHlzLCAyNTYpKSkgeworCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiaTgxMDogJXMgbW1pbyBhdCAweCUwNGx4IGFuZCAweCUwNGx4XG4iLAorCQkJCQkJICAgICAgIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIAorCQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBjYXJkLT5hYzk3YmFzZV9tbWlvLCAKKwkJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZykgY2FyZC0+aW9iYXNlX21taW8pOyAKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCWlvdW5tYXAoY2FyZC0+YWM5N2Jhc2VfbW1pbyk7CisJCQkJCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+YWM5N2Jhc2VfbW1pb19waHlzLCA1MTIpOworCQkJCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmlvYmFzZV9tbWlvX3BoeXMsIDUxMik7CisJCQkJCQljYXJkLT51c2VfbW1pbyA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWlvdW5tYXAoY2FyZC0+YWM5N2Jhc2VfbW1pbyk7CisJCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5hYzk3YmFzZV9tbWlvX3BoeXMsIDUxMik7CisJCQkJCWNhcmQtPnVzZV9tbWlvID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQljYXJkLT51c2VfbW1pbyA9IDA7CisJCX0KKwl9CisKKwkvKiBpbml0aWFsaXplIEFDOTcgY29kZWMgYW5kIHJlZ2lzdGVyIC9kZXYvbWl4ZXIgKi8KKwlpZiAoaTgxMF9hYzk3X2luaXQoY2FyZCkgPD0gMCkgeworCQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCQlnb3RvIG91dF9pb3NwYWNlOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgY2FyZCk7CisKKwlpZihjbG9ja2luZyA9PSAwKSB7CisJCWNsb2NraW5nID0gNDgwMDA7CisJCWk4MTBfY29uZmlndXJlX2Nsb2NraW5nKCk7CisJfQorCisJLyogcmVnaXN0ZXIgL2Rldi9kc3AgKi8KKwlpZiAoKGNhcmQtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmaTgxMF9hdWRpb19mb3BzLCAtMSkpIDwgMCkgeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fRVJSICJpODEwX2F1ZGlvOiBjb3VsZG4ndCByZWdpc3RlciBEU1AgZGV2aWNlIVxuIik7CisJCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisJCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCisJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKKwkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2ldKTsKKwkJfQorCQlnb3RvIG91dF9pb3NwYWNlOworCX0KKworIAljYXJkLT5pbml0aWFsaXppbmcgPSAwOworCXJldHVybiAwOworCitvdXRfaW9zcGFjZToKKwlpZiAoY2FyZC0+dXNlX21taW8pIHsKKwkJaW91bm1hcChjYXJkLT5hYzk3YmFzZV9tbWlvKTsKKwkJaW91bm1hcChjYXJkLT5pb2Jhc2VfbW1pbyk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5hYzk3YmFzZV9tbWlvX3BoeXMsIDUxMik7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5pb2Jhc2VfbW1pb19waHlzLCAyNTYpOworCX0KK291dF9waW86CQorCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgNjQpOworb3V0X3JlZ2lvbjI6CisJcmVsZWFzZV9yZWdpb24oY2FyZC0+YWM5N2Jhc2UsIDI1Nik7CitvdXRfcmVnaW9uMToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIHNpemVvZihzdHJ1Y3QgaTgxMF9jaGFubmVsKSpOUl9IV19DSCwKKwkgICAgY2FyZC0+Y2hhbm5lbCwgY2FyZC0+Y2hhbmRtYSk7CitvdXRfbWVtOgorCWtmcmVlKGNhcmQpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaTgxMF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJaW50IGk7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwkvKiBmcmVlIGhhcmR3YXJlIHJlc291cmNlcyAqLworCWZyZWVfaXJxKGNhcmQtPmlycSwgZGV2cyk7CisJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCA2NCk7CisJcmVsZWFzZV9yZWdpb24oY2FyZC0+YWM5N2Jhc2UsIDI1Nik7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2Yoc3RydWN0IGk4MTBfY2hhbm5lbCkqTlJfSFdfQ0gsCisJCQkgICAgY2FyZC0+Y2hhbm5lbCwgY2FyZC0+Y2hhbmRtYSk7CisJaWYgKGNhcmQtPnVzZV9tbWlvKSB7CisJCWlvdW5tYXAoY2FyZC0+YWM5N2Jhc2VfbW1pbyk7CisJCWlvdW5tYXAoY2FyZC0+aW9iYXNlX21taW8pOworCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+YWM5N2Jhc2VfbW1pb19waHlzLCA1MTIpOworCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aW9iYXNlX21taW9fcGh5cywgMjU2KTsKKwl9CisKKwkvKiB1bnJlZ2lzdGVyIGF1ZGlvIGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQorCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMKSB7CisJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlcik7CisJCQlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5N19jb2RlY1tpXSk7CisJCQljYXJkLT5hYzk3X2NvZGVjW2ldID0gTlVMTDsKKwkJfQorCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7CisJa2ZyZWUoY2FyZCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgaTgxMF9wbV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBwbV9zdGF0ZSkKK3sKKyAgICAgICAgc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworICAgICAgICBzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJaW50IGksbnVtX2FjOTc7CisjaWZkZWYgREVCVUcKKwlwcmludGsoImk4MTBfYXVkaW86IGk4MTBfcG1fc3VzcGVuZCBjYWxsZWRcbiIpOworI2VuZGlmCisJaWYoIWNhcmQpIHJldHVybiAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJY2FyZC0+cG1fc3VzcGVuZGVkPTE7CisJZm9yKGk9MDtpPE5SX0hXX0NIO2krKykgeworCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXTsKKwkJaWYoIXN0YXRlKSBjb250aW51ZTsKKwkJLyogdGhpcyBoYXBwZW5zIG9ubHkgaWYgdGhlcmUgYXJlIG9wZW4gZmlsZXMgKi8KKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWlmKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcgfHwKKwkJICAgKGRtYWJ1Zi0+Y291bnQgJiYgKGRtYWJ1Zi0+dHJpZ2dlciAmIFBDTV9FTkFCTEVfT1VUUFVUKSkpIHsKKwkJCXN0YXRlLT5wbV9zYXZlZF9kYWNfcmF0ZT1kbWFidWYtPnJhdGU7CisJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0ZS0+cG1fc2F2ZWRfZGFjX3JhdGU9MDsKKwkJfQorCQlpZihkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7CisJCQlzdGF0ZS0+cG1fc2F2ZWRfYWRjX3JhdGU9ZG1hYnVmLT5yYXRlOwkKKwkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXRlLT5wbV9zYXZlZF9hZGNfcmF0ZT0wOworCQl9CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciA9IDA7CisJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkvKiBzYXZlIG1peGVyIHNldHRpbmdzICovCisJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgeworCQlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBjYXJkLT5hYzk3X2NvZGVjW251bV9hYzk3XTsKKwkJaWYoIWNvZGVjKSBjb250aW51ZTsKKwkJZm9yKGk9MDtpPCBTT1VORF9NSVhFUl9OUkRFVklDRVMgO2krKykgeworCQkJaWYoKHN1cHBvcnRlZF9taXhlcihjb2RlYyxpKSkgJiYKKwkJCSAgIChjb2RlYy0+cmVhZF9taXhlcikpIHsKKwkJCQljYXJkLT5wbV9zYXZlZF9taXhlcl9zZXR0aW5nc1tpXVtudW1fYWM5N109CisJCQkJCWNvZGVjLT5yZWFkX21peGVyKGNvZGVjLGkpOworCQkJfQorCQl9CisJfQorCXBjaV9zYXZlX3N0YXRlKGRldik7IC8qIFhYWCBkbyB3ZSBuZWVkIHRoaXM/ICovCisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7IC8qIGRpc2FibGUgYnVzbWFzdGVyaW5nICovCisJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsMyk7IC8qIFp6ei4gKi8KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaTgxMF9wbV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgbnVtX2FjOTcsaT0wOworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQ9cGNpX2dldF9kcnZkYXRhKGRldik7CisJcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlwY2lfcmVzdG9yZV9zdGF0ZSAoZGV2KTsKKworCS8qIG9ic2VydmF0aW9uIG9mIGEgdG9zaGliYSBwb3J0ZWdlIDM0NDBjdCBzdWdnZXN0cyB0aGF0IHRoZSAKKwkgICBoYXJkd2FyZSBoYXMgdG8gYmUgbW9yZSBvciBsZXNzIGNvbXBsZXRlbHkgcmVpbml0aWFsaXplZCBmcm9tCisJICAgc2NyYXRjaCBhZnRlciBhbiBhcG0gc3VzcGVuZC4gIFdvcmtzIEZvciBNZS4gICAtZGFuICovCisKKwlpODEwX2FjOTdfcG93ZXJfdXBfYnVzKGNhcmQpOworCisJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgeworCQlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBjYXJkLT5hYzk3X2NvZGVjW251bV9hYzk3XTsKKwkJLyogY2hlY2sgdGhleSBoYXZlbid0IHN0b2xlbiB0aGUgaGFyZHdhcmUgd2hpbGUgd2Ugd2VyZQorCQkgICBhd2F5ICovCisJCWlmKCFjb2RlYyB8fCAhaTgxMF9hYzk3X2V4aXN0cyhjYXJkLG51bV9hYzk3KSkgeworCQkJaWYobnVtX2FjOTcpIGNvbnRpbnVlOworCQkJZWxzZSBCVUcoKTsKKwkJfQorCQlpZighaTgxMF9hYzk3X3Byb2JlX2FuZF9wb3dlcnVwKGNhcmQsY29kZWMpKSBCVUcoKTsKKwkJCisJCWlmKChjYXJkLT5hYzk3X2ZlYXR1cmVzJjB4MDAwMSkpIHsKKwkJCS8qIGF0IHByb2JlIHRpbWUgd2UgZm91bmQgd2UgY291bGQgZG8gdmFyaWFibGUKKwkJCSAgIHJhdGVzLCBidXQgQVBNIHN1c3BlbmQgaGFzIG1hZGUgaXQgZm9yZ2V0CisJCQkgICBpdHMgbWFnaWNhbCBwb3dlcnMgKi8KKwkJCWlmKCFpODEwX2FjOTdfZW5hYmxlX3ZhcmlhYmxlX3JhdGUoY29kZWMpKSBCVUcoKTsKKwkJfQorCQkvKiB3ZSBsb3N0IG91ciBtaXhlciBzZXR0aW5ncywgc28gcmVzdG9yZSB0aGVtICovCisJCWZvcihpPTA7aTwgU09VTkRfTUlYRVJfTlJERVZJQ0VTIDtpKyspIHsKKwkJCWlmKHN1cHBvcnRlZF9taXhlcihjb2RlYyxpKSl7CisJCQkJaW50IHZhbD1jYXJkLT4KKwkJCQkJcG1fc2F2ZWRfbWl4ZXJfc2V0dGluZ3NbaV1bbnVtX2FjOTddOworCQkJCWNvZGVjLT5taXhlcl9zdGF0ZVtpXT12YWw7CisJCQkJY29kZWMtPndyaXRlX21peGVyKGNvZGVjLGksCisJCQkJCQkgICAodmFsICAmIDB4ZmYpICwKKwkJCQkJCSAgICgodmFsID4+IDgpICAmIDB4ZmYpICk7CisJCQl9CisJCX0KKwl9CisKKwkvKiB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHNhbXBsZSByYXRlIGZyb20gd2hhdGV2ZXIgaXQgd2FzICovCisJZm9yKGk9MDtpPE5SX0hXX0NIO2krKykgeworCQlzdHJ1Y3QgaTgxMF9zdGF0ZSAqIHN0YXRlPWNhcmQtPnN0YXRlc1tpXTsKKwkJaWYoc3RhdGUpIHsKKwkJCWlmKHN0YXRlLT5wbV9zYXZlZF9hZGNfcmF0ZSkKKwkJCQlpODEwX3NldF9hZGNfcmF0ZShzdGF0ZSxzdGF0ZS0+cG1fc2F2ZWRfYWRjX3JhdGUpOworCQkJaWYoc3RhdGUtPnBtX3NhdmVkX2RhY19yYXRlKQorCQkJCWk4MTBfc2V0X2RhY19yYXRlKHN0YXRlLHN0YXRlLT5wbV9zYXZlZF9kYWNfcmF0ZSk7CisJCX0KKwl9CisKKwkKKyAgICAgICAgY2FyZC0+cG1fc3VzcGVuZGVkID0gMDsKKworCS8qIGFueSBwcm9jZXNzZXMgdGhhdCB3ZXJlIHJlYWRpbmcvd3JpdGluZyBkdXJpbmcgdGhlIHN1c3BlbmQKKwkgICBwcm9iYWJseSBlbmRlZCB1cCBoZXJlICovCisJZm9yKGk9MDtpPE5SX0hXX0NIO2krKykgeworCQlzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV07CisJCWlmKHN0YXRlKSB3YWtlX3VwKCZzdGF0ZS0+ZG1hYnVmLndhaXQpOworICAgICAgICB9CisKKwlyZXR1cm4gMDsKK30JCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK01PRFVMRV9BVVRIT1IoIlRoZSBMaW51eCBrZXJuZWwgdGVhbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCA4MTAgYXVkaW8gc3VwcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKGZ0c29kZWxsLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGNsb2NraW5nLCB1aW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShzdHJpY3RfY2xvY2tpbmcsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oc3BkaWZfbG9ja2VkLCBpbnQsIDA0NDQpOworCisjZGVmaW5lIEk4MTBfTU9EVUxFX05BTUUgImk4MTBfYXVkaW8iCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpODEwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gSTgxMF9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSBpODEwX3BjaV90YmwsCisJLnByb2JlCQk9IGk4MTBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChpODEwX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBpODEwX3BtX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpODEwX3BtX3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK307CisKKworc3RhdGljIGludCBfX2luaXQgaTgxMF9pbml0X21vZHVsZSAodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSW50ZWwgODEwICsgQUM5NyBBdWRpbywgdmVyc2lvbiAiCisJICAgICAgIERSSVZFUl9WRVJTSU9OICIsICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOworCisJcmV0dmFsID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaTgxMF9wY2lfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYoZnRzb2RlbGwgIT0gMCkgeworCQlwcmludGsoImk4MTBfYXVkaW86IGZ0c29kZWxsIGlzIG5vdyBhIGRlcHJlY2F0ZWQgb3B0aW9uLlxuIik7CisJfQorCWlmKHNwZGlmX2xvY2tlZCA+IDAgKSB7CisJCWlmKHNwZGlmX2xvY2tlZCA9PSAzMjAwMCB8fCBzcGRpZl9sb2NrZWQgPT0gNDQxMDAgfHwgc3BkaWZfbG9ja2VkID09IDQ4MDAwKSB7CisJCQlwcmludGsoImk4MTBfYXVkaW86IEVuYWJsaW5nIFMvUERJRiBhdCBzYW1wbGUgcmF0ZSAlZEh6LlxuIiwgc3BkaWZfbG9ja2VkKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiaTgxMF9hdWRpbzogUy9QRElGIGNhbiBvbmx5IGJlIGxvY2tlZCB0byAzMjAwMCwgNDQxMDAsIG9yIDQ4MDAwSHouXG4iKTsKKwkJCXNwZGlmX2xvY2tlZCA9IDA7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpODEwX2NsZWFudXBfbW9kdWxlICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaTgxMF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaTgxMF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChpODEwX2NsZWFudXBfbW9kdWxlKTsKKworLyoKK0xvY2FsIFZhcmlhYmxlczoKK2MtYmFzaWMtb2Zmc2V0OiA4CitFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2ljczIxMDEuYyBiL3NvdW5kL29zcy9pY3MyMTAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmM2JlOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9pY3MyMTAxLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBzb3VuZC9pY3MyMTAxLmMKKyAqCisgKiBEcml2ZXIgZm9yIHRoZSBJQ1MyMTAxIG1peGVyIG9mIEdVUyB2My43LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKgorICogVGhvbWFzIFNhaWxlciAgIDogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICogQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA6IGFkZGVkIF9faW5pdCB0byBpY3MyMTAxX21peGVyX2luaXQoKQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlIDxsaW51eC91bHRyYXNvdW5kLmg+CisKKyNpbmNsdWRlICJndXMuaCIKKyNpbmNsdWRlICJndXNfaHcuaCIKKworI2RlZmluZSBNSVhfREVWUwkoU09VTkRfTUFTS19NSUN8U09VTkRfTUFTS19MSU5FfCBcCisJCQkgU09VTkRfTUFTS19TWU5USHwgXAorICAJCQkgU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfVk9MVU1FKQorCitleHRlcm4gaW50ICAgICAqZ3VzX29zcDsKK2V4dGVybiBpbnQgICAgICBndXNfYmFzZTsKK2V4dGVybiBzcGlubG9ja190IGd1c19sb2NrOworc3RhdGljIGludCAgICAgIHZvbHVtZXNbSUNTX01JWERFVlNdOworc3RhdGljIGludCAgICAgIGxlZnRfZml4W0lDU19NSVhERVZTXSA9Cit7MSwgMSwgMSwgMiwgMSwgMn07CitzdGF0aWMgaW50ICAgICAgcmlnaHRfZml4W0lDU19NSVhERVZTXSA9Cit7MiwgMiwgMiwgMSwgMiwgMX07CisKK3N0YXRpYyBpbnQgc2NhbGVfdm9sKGludCB2b2wpCit7CisJLyoKKwkgKiAgRXhwZXJpbWVudGFsIHZvbHVtZSBzY2FsaW5nIGJ5IFJpc3RvIEthbmtrdW5lbi4KKwkgKiAgVGhpcyBzaG91bGQgZ2l2ZSBzbW9vdGhlciB2b2x1bWUgcmVzcG9uc2UgdGhhbiBqdXN0CisJICogIGEgcGxhaW4gbXVsdGlwbGljYXRpb24uCisJICovCisJIAorCWludCBlOworCisJaWYgKHZvbCA8IDApCisJCXZvbCA9IDA7CisJaWYgKHZvbCA+IDEwMCkKKwkJdm9sID0gMTAwOworCXZvbCA9ICgzMSAqIHZvbCArIDUwKSAvIDEwMDsKKwllID0gMDsKKwlpZiAodm9sKQorCXsKKwkJd2hpbGUgKHZvbCA8IDE2KQorCQl7CisJCQl2b2wgPDw9IDE7CisJCQllLS07CisJCX0KKwkJdm9sIC09IDE2OworCQllICs9IDc7CisJfQorCXJldHVybiAoKGUgPDwgNCkgKyB2b2wpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9taXgoaW50IGRldiwgaW50IGNobiwgaW50IHZvbCkKK3sKKwlpbnQgKnNlbGVjdG9yOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGN0cmxfYWRkciA9IGRldiA8PCAzOworCWludCBhdHRuX2FkZHIgPSBkZXYgPDwgMzsKKworCXZvbCA9IHNjYWxlX3ZvbCh2b2wpOworCisJaWYgKGNobiA9PSBDSE5fTEVGVCkKKwl7CisJCXNlbGVjdG9yID0gbGVmdF9maXg7CisJCWN0cmxfYWRkciB8PSAweDAwOworCQlhdHRuX2FkZHIgfD0gMHgwMjsKKwl9CisJZWxzZQorCXsKKwkJc2VsZWN0b3IgPSByaWdodF9maXg7CisJCWN0cmxfYWRkciB8PSAweDAxOworCQlhdHRuX2FkZHIgfD0gMHgwMzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssIGZsYWdzKTsKKwlvdXRiKChjdHJsX2FkZHIpLCB1X01peFNlbGVjdCk7CisJb3V0Yigoc2VsZWN0b3JbZGV2XSksIHVfTWl4RGF0YSk7CisJb3V0YigoYXR0bl9hZGRyKSwgdV9NaXhTZWxlY3QpOworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSB2b2wpLCB1X01peERhdGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCBzZXRfdm9sdW1lcyhpbnQgZGV2LCBpbnQgdm9sKQoreworCWludCBsZWZ0ID0gdm9sICYgMHgwMGZmOworCWludCByaWdodCA9ICh2b2wgPj4gOCkgJiAweDAwZmY7CisKKwlpZiAobGVmdCA8IDApCisJCWxlZnQgPSAwOworCWlmIChsZWZ0ID4gMTAwKQorCQlsZWZ0ID0gMTAwOworCWlmIChyaWdodCA8IDApCisJCXJpZ2h0ID0gMDsKKwlpZiAocmlnaHQgPiAxMDApCisJCXJpZ2h0ID0gMTAwOworCisJd3JpdGVfbWl4KGRldiwgQ0hOX0xFRlQsIGxlZnQpOworCXdyaXRlX21peChkZXYsIENITl9SSUdIVCwgcmlnaHQpOworCisJdm9sID0gbGVmdCArIChyaWdodCA8PCA4KTsKKwl2b2x1bWVzW2Rldl0gPSB2b2w7CisJcmV0dXJuIHZvbDsKK30KKworc3RhdGljIGludCBpY3MyMTAxX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHZhbDsKKwkKKwlpZiAoKChjbWQgPj4gOCkgJiAweGZmKSA9PSAnTScpIHsKKwkJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpIHsKKwkJCQorCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc3dpdGNoIChjbWQgJiAweGZmKSB7CisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQlyZXR1cm4gZ3VzX2RlZmF1bHRfbWl4ZXJfaW9jdGwoZGV2LCBjbWQsIGFyZyk7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQkJCXZhbCA9IHNldF92b2x1bWVzKERFVl9NSUMsIHZhbCk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFNPVU5EX01JWEVSX0NEOgorCQkJCXZhbCA9IHNldF92b2x1bWVzKERFVl9DRCwgdmFsKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9MSU5FOgorCQkJCXZhbCA9IHNldF92b2x1bWVzKERFVl9MSU5FLCB2YWwpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQkJCXZhbCA9IHNldF92b2x1bWVzKERFVl9HRjEsIHZhbCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJCXZhbCA9IHNldF92b2x1bWVzKERFVl9WT0wsIHZhbCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpIHsKKwkJCQkvKgorCQkJCSAqIFJldHVybiBwYXJhbWV0ZXJzCisJCQkJICovCisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQlyZXR1cm4gZ3VzX2RlZmF1bHRfbWl4ZXJfaW9jdGwoZGV2LCBjbWQsIGFyZyk7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKKwkJCQl2YWwgPSBNSVhfREVWUzsgCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoKKwkJCQl2YWwgPSBTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19TWU5USCB8IFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19NSUM7IAorCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQkJdmFsID0gU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0xJTkU7IAorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJCXZhbCA9IDA7IAorCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX01JQzoKKwkJCQl2YWwgPSB2b2x1bWVzW0RFVl9NSUNdOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBTT1VORF9NSVhFUl9MSU5FOgorCQkJCXZhbCA9IHZvbHVtZXNbREVWX0xJTkVdOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX0NEOgorCQkJCXZhbCA9IHZvbHVtZXNbREVWX0NEXTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCQkJdmFsID0gdm9sdW1lc1tERVZfVk9MXTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKKwkJCQl2YWwgPSB2b2x1bWVzW0RFVl9HRjFdOyAKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKTsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zIGljczIxMDFfbWl4ZXJfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmlkCT0gIklDUzIxMDEiLAorCS5uYW1lCT0gIklDUzIxMDEgTXVsdGltZWRpYSBNaXhlciIsCisJLmlvY3RsCT0gaWNzMjEwMV9taXhlcl9pb2N0bAorfTsKKworaW50IF9faW5pdCBpY3MyMTAxX21peGVyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgbjsKKworCWlmICgobiA9IHNvdW5kX2FsbG9jX21peGVyZGV2KCkpICE9IC0xKQorCXsKKwkJbWl4ZXJfZGV2c1tuXSA9ICZpY3MyMTAxX21peGVyX29wZXJhdGlvbnM7CisKKwkJLyoKKwkJICogU29tZSBHVVMgdjMuNyBjYXJkcyBoYWQgc29tZSBjaGFubmVscyBmbGlwcGVkLiBEaXNhYmxlCisJCSAqIHRoZSBmbGlwcGluZyBmZWF0dXJlIGlmIHRoZSBtb2RlbCBpZCBpcyBvdGhlciB0aGFuIDUuCisJCSAqLworCisJCWlmIChpbmIodV9NaXhTZWxlY3QpICE9IDUpCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBJQ1NfTUlYREVWUzsgaSsrKQorCQkJCWxlZnRfZml4W2ldID0gMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBJQ1NfTUlYREVWUzsgaSsrKQorCQkJCXJpZ2h0X2ZpeFtpXSA9IDI7CisJCX0KKwkJc2V0X3ZvbHVtZXMoREVWX0dGMSwgMHg1YTVhKTsKKwkJc2V0X3ZvbHVtZXMoREVWX0NELCAweDVhNWEpOworCQlzZXRfdm9sdW1lcyhERVZfTUlDLCAweDAwMDApOworCQlzZXRfdm9sdW1lcyhERVZfTElORSwgMHg1YTVhKTsKKwkJc2V0X3ZvbHVtZXMoREVWX1ZPTCwgMHg1YTVhKTsKKwkJc2V0X3ZvbHVtZXMoREVWX1VOVVNFRCwgMHgwMDAwKTsKKwl9CisJcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvaXRlODE3Mi5jIGIvc291bmQvb3NzL2l0ZTgxNzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGY4NzlmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2l0ZTgxNzIuYwpAQCAtMCwwICsxLDIyNTkgQEAKKy8qCisgKiAgICAgIGl0ZTgxNzIuYyAgLS0gIElURSBJVDgxNzJHIFNvdW5kIERyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICAJc3RldmVsQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqIE1vZHVsZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyczoKKyAqCisgKiAgU3VwcG9ydGVkIGRldmljZXM6CisgKiAgL2Rldi9kc3AgICAgc3RhbmRhcmQgT1NTIC9kZXYvZHNwIGRldmljZQorICogIC9kZXYvbWl4ZXIgIHN0YW5kYXJkIE9TUyAvZGV2L21peGVyIGRldmljZQorICoKKyAqIE5vdGVzOgorICoKKyAqICAxLiBNdWNoIG9mIHRoZSBPU1MgYnVmZmVyIGFsbG9jYXRpb24sIGlvY3RsJ3MsIGFuZCBtbWFwJ2luZyBhcmUKKyAqICAgICB0YWtlbiwgc2xpZ2h0bHkgbW9kaWZpZWQgb3Igbm90IGF0IGFsbCwgZnJvbSB0aGUgRVMxMzcxIGRyaXZlciwKKyAqICAgICBzbyByZWZlciB0byB0aGUgY3JlZGl0cyBpbiBlczEzNzEuYyBmb3IgdGhvc2UuIFRoZSByZXN0IG9mIHRoZQorICogICAgIGNvZGUgKHByb2JlLCBvcGVuLCByZWFkLCB3cml0ZSwgdGhlIElTUiwgZXRjLikgaXMgbmV3LgorICogIDIuIFRoZSBmb2xsb3dpbmcgc3VwcG9ydCBpcyB1bnRlc3RlZDoKKyAqICAgICAgKiBNZW1vcnkgbWFwcGluZyB0aGUgYXVkaW8gYnVmZmVycywgYW5kIHRoZSBpb2N0bCBjb250cm9scyB0aGF0IGdvCisgKiAgICAgICAgd2l0aCBpdC4KKyAqICAgICAgKiBTL1BESUYgb3V0cHV0LgorICogICAgICAqIEkyUyBzdXBwb3J0LgorICogIDMuIFRoZSBmb2xsb3dpbmcgaXMgbm90IHN1cHBvcnRlZDoKKyAqICAgICAgKiBsZWdhY3kgYXVkaW8gbW9kZS4KKyAqICA0LiBTdXBwb3J0IGZvciB2b2x1bWUgYnV0dG9uIGludGVycnVwdHMgaXMgaW1wbGVtZW50ZWQgYnV0IGRvZXNuJ3QKKyAqICAgICB3b3JrIHlldC4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMDIuMDguMjAwMSAgSW5pdGlhbCByZWxlYXNlCisgKiAgICAwNi4yMi4yMDAxICBBZGRlZCBJMlMgc3VwcG9ydAorICogICAgMDcuMzAuMjAwMyAgUmVtb3ZlZCBpbml0aWFsaXNhdGlvbiB0byB6ZXJvIGZvciBzdGF0aWMgdmFyaWFibGVzCisgKgkJICAgKHNwZGlmW05SX0RFVklDRV0sIGkyc19mbXRbTlJfREVWSUNFXSwgYW5kIGRldmluZGV4KQorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2l0ODE3Mi9pdDgxNzIuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyN1bmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKyNkZWZpbmUgSVQ4MTcyX0RFQlVHCisjdW5kZWYgSVQ4MTcyX1ZFUkJPU0VfREVCVUcKKyNkZWZpbmUgREJHKHgpIHt9CisKKyNkZWZpbmUgSVQ4MTcyX01PRFVMRV9OQU1FICJJVDgxNzIgYXVkaW8iCisjZGVmaW5lIFBGWCBJVDgxNzJfTU9EVUxFX05BTUUKKworI2lmZGVmIElUODE3Ml9ERUJVRworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0RFQlVHIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiBQRlggIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyBQRlggIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKworCisjZGVmaW5lIElUODE3Ml9NT0RVTEVfTkFNRSAiSVQ4MTcyIGF1ZGlvIgorI2RlZmluZSBQRlggSVQ4MTcyX01PRFVMRV9OQU1FCisKKyNpZmRlZiBJVDgxNzJfREVCVUcKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9ERUJVRyBQRlggIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKyNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgUEZYICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gUEZYICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIHdhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgUEZYICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAwLCAxLCAxLCAyIH07CisKKworLyoKKyAqIEF1ZGlvIENvbnRyb2xsZXIgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zIGZvbGxvdy4gU2VlCisgKiBpbmNsdWRlL2FzbS9pdDgxNzIvaXQ4MTcyLmggZm9yIHJlZ2lzdGVyIG9mZnNldHMuCisgKi8KKworLyogUENNIE91dCBWb2x1bWUgUmVnICovCisjZGVmaW5lIFBDTU9WX1BDTU9NCSgxPDwxNSkJLyogUENNIE91dCBNdXRlIGRlZmF1bHQgMTogbXV0ZSAqLworI2RlZmluZQlQQ01PVl9QQ01SQ0dfQklUIDgJLyogUENNIFJpZ2h0IGNoYW5uZWwgR2FpbiAqLworI2RlZmluZQlQQ01PVl9QQ01SQ0dfTUFTSyAoMHgxZjw8UENNT1ZfUENNUkNHX0JJVCkKKyNkZWZpbmUgUENNT1ZfUENNTENHX0JJVCAwCS8qIFBDTSBMZWZ0IGNoYW5uZWwgZ2FpbiAgKi8KKyNkZWZpbmUgUENNT1ZfUENNTENHX01BU0sgMHgxZgorCisvKiBGTSBPdXQgVm9sdW1lIFJlZyAqLworI2RlZmluZSBGTU9WX0ZNT00gICAgICAgKDE8PDE1KQkvKiBGTSBPdXQgTXV0ZSBkZWZhdWx0IDE6IG11dGUgKi8KKyNkZWZpbmUJRk1PVl9GTVJDR19CSVQJOAkvKiBGTSBSaWdodCBjaGFubmVsIEdhaW4gKi8KKyNkZWZpbmUJRk1PVl9GTVJDR19NQVNLICgweDFmPDxGTU9WX0ZNUkNHX0JJVCkKKyNkZWZpbmUgRk1PVl9GTUxDR19CSVQJMAkvKiBGTSBMZWZ0IGNoYW5uZWwgZ2FpbiAgKi8KKyNkZWZpbmUgRk1PVl9GTUxDR19NQVNLIDB4MWYKKworLyogSTJTIE91dCBWb2x1bWUgUmVnICovCisjZGVmaW5lIEkyU1ZfSTJTT00JICgxPDwxNSkgLyogSTJTIE91dCBNdXRlIGRlZmF1bHQgMTogbXV0ZSAqLworI2RlZmluZQlJMlNWX0kyU1JDR19CSVQJIDgJIC8qIEkyUyBSaWdodCBjaGFubmVsIEdhaW4gKi8KKyNkZWZpbmUJSTJTVl9JMlNSQ0dfTUFTSyAoMHgxZjw8STJTVl9JMlNSQ0dfQklUKQorI2RlZmluZSBJMlNWX0kyU0xDR19CSVQJIDAJIC8qIEkyUyBMZWZ0IGNoYW5uZWwgZ2FpbiAgKi8KKyNkZWZpbmUgSTJTVl9JMlNMQ0dfTUFTSyAweDFmCisKKy8qIERpZ2l0YWwgUmVjb3JkaW5nIFNvdXJjZSBTZWxlY3QgUmVnICovCisjZGVmaW5lCURSU1NfQklUICAgMAorI2RlZmluZQlEUlNTX01BU0sgIDB4MDcKKyNkZWZpbmUgICBEUlNTX0FDOTdfUFJJTSAwCisjZGVmaW5lICAgRFJTU19GTSAgICAgICAgMQorI2RlZmluZSAgIERSU1NfSTJTICAgICAgIDIKKyNkZWZpbmUgICBEUlNTX1BDTSAgICAgICAzCisjZGVmaW5lICAgRFJTU19BQzk3X1NFQyAgNAorCisvKiBQbGF5YmFjay9DYXB0dXJlIENoYW5uZWwgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJQ0NfU00JICAgICAgICAoMTw8MTUpCS8qIFN0ZXJlbywgTW9uZSAwOiBtb25vIDE6IHN0ZXJlbyAqLworI2RlZmluZQlDQ19ERgkgICAgICAgICgxPDwxNCkJLyogRGF0YSBGb3JtYXQgMDogOCBiaXQgMTogMTYgYml0ICovCisjZGVmaW5lIENDX0ZNVF9CSVQgICAgICAxNAorI2RlZmluZSBDQ19GTVRfTUFTSyAgICAgKDB4MDM8PENDX0ZNVF9CSVQpCisjZGVmaW5lIENDX0NGX0JJVCAgICAgICAxMiAgICAgIC8qIENoYW5uZWwgZm9ybWF0IChQbGF5YmFjayBvbmx5KSAqLworI2RlZmluZSBDQ19DRl9NQVNLICAgICAgKDB4MDM8PENDX0NGX0JJVCkKKyNkZWZpbmUJICBDQ19DRl8yCTAKKyNkZWZpbmUgICBDQ19DRl80CSgxPDxDQ19DRl9CSVQpCisjZGVmaW5lICAgQ0NfQ0ZfNgkoMjw8Q0NfQ0ZfQklUKQorI2RlZmluZSBDQ19TUl9CSVQgICAgICAgOCAgICAgICAvKiBzYW1wbGUgUmF0ZSAqLworI2RlZmluZSBDQ19TUl9NQVNLICAgICAgKDB4MGY8PENDX1NSX0JJVCkKKyNkZWZpbmUJICBDQ19TUl81NTAwCTAKKyNkZWZpbmUJICBDQ19TUl84MDAwCSgxPDxDQ19TUl9CSVQpCisjZGVmaW5lCSAgQ0NfU1JfOTYwMAkoMjw8Q0NfU1JfQklUKQorI2RlZmluZQkgIENDX1NSXzExMDI1CSgzPDxDQ19TUl9CSVQpCisjZGVmaW5lCSAgQ0NfU1JfMTYwMDAJKDQ8PENDX1NSX0JJVCkKKyNkZWZpbmUJICBDQ19TUl8xOTIwMAkoNTw8Q0NfU1JfQklUKQorI2RlZmluZQkgIENDX1NSXzIyMDUwCSg2PDxDQ19TUl9CSVQpCisjZGVmaW5lCSAgQ0NfU1JfMzIwMDAJKDc8PENDX1NSX0JJVCkKKyNkZWZpbmUJICBDQ19TUl8zODQwMAkoODw8Q0NfU1JfQklUKQorI2RlZmluZQkgIENDX1NSXzQ0MTAwCSg5PDxDQ19TUl9CSVQpCisjZGVmaW5lCSAgQ0NfU1JfNDgwMDAJKDEwPDxDQ19TUl9CSVQpCisjZGVmaW5lCUNDX0NTUAkgICAgICAgICgxPDw3KQkvKiBDaGFubmVsIHN0b3AgCisJCQkJICogMDogRW5kIG9mIEN1cnJlbnQgYnVmZmVyCisJCQkJICogMTogSW1tZWRpYXRlbHkgc3RvcCB3aGVuIHJlYyBzdG9wICovCisjZGVmaW5lIENDX0NQCSAgICAgICAgKDE8PDYpCS8qIENoYW5uZWwgcGF1c2UgMDogbm9ybWFsLCAxOiBwYXVzZSAqLworI2RlZmluZQlDQ19DQQkgICAgICAgICgxPDw1KQkvKiBDaGFubmVsIEFjdGlvbiAwOiBTdG9wICwgMTogc3RhcnQgKi8KKyNkZWZpbmUJQ0NfQ0IyTCAgICAgICAgICgxPDwyKQkvKiBDdXIuIGJ1Zi4gMiB4ZnIgaXMgbGFzdCAwOiBObywgMTogWWVzICovCisjZGVmaW5lIENDX0NCMUwgICAgICAgICAoMTw8MSkJLyogQ3VyLiBidWYuIDEgeGZyIGlzIGxhc3QgMDogTm8sIDE6IFllcyAqLworI2RlZmluZSBDQ19ERQkgICAgICAgIDEJLyogREZDL0RGSUZPIERhdGEgRW1wdHkgMTogZW1wdHksIDA6IG5vdCBlbXB0eQorCQkJCSAqIChQbGF5YmFjayBvbmx5KQorCQkJCSAqLworCisvKiBDb2RlYyBDb250cm9sIFJlZyAqLworI2RlZmluZSBDT0RFQ0NfR01FCSgxPDw5KQkvKiBBQzk3IEdQSU8gTW9kZSBlbmFibGUgKi8KKyNkZWZpbmUJQ09ERUNDX0FUTQkoMTw8OCkJLyogQUM5NyBBVEUgdGVzdCBtb2RlIDA6IHRlc3QgMTogbm9ybWFsICovCisjZGVmaW5lCUNPREVDQ19XUgkoMTw8NikJLyogQUM5NyBXYXJuIHJlc2V0IDE6IHdhcm0gcmVzZXQgLCAwOiBOb3JtYWwgKi8KKyNkZWZpbmUJQ09ERUNDX0NSCSgxPDw1KQkvKiBBQzk3IENvbGQgcmVzZXQgMTogQ29sZCByZXNldCAsIDA6IE5vcm1hbCAqLworCisKKy8qIEkyUyBDb250cm9sIFJlZwkqLworI2RlZmluZQlJMlNNQ19TUl9CSVQJIDYJLyogSTJTIFNhbXBsaW5nIHJhdGUgCisJCQkJICogMDA6IDQ4S0h6LCAwMTogNDQuMSBLSHosIDEwOiAzMiAzMiBLSHogKi8KKyNkZWZpbmUJSTJTTUNfU1JfTUFTSyAgICAoMHgwMzw8STJTTUNfU1JfQklUKQorI2RlZmluZQkgIEkyU01DX1NSXzQ4MDAwIDAKKyNkZWZpbmUJICBJMlNNQ19TUl80NDEwMCAoMTw8STJTTUNfU1JfQklUKQorI2RlZmluZQkgIEkyU01DX1NSXzMyMDAwICgyPDxJMlNNQ19TUl9CSVQpCisjZGVmaW5lCUkyU01DX1NSU1MJICgxPDw1KQkvKiBTYW1wbGUgUmF0ZSBTb3VyY2UgU2VsZWN0IDE6Uy9XLCAwOiBIL1cgKi8KKyNkZWZpbmUgSTJTTUNfSTJTRl9CSVQJIDAJLyogSTJTIEZvcm1hdCAqLworI2RlZmluZSBJMlNNQ19JMlNGX01BU0sgIDB4MDMKKyNkZWZpbmUgICBJMlNNQ19JMlNGX0RBQyAwCisjZGVmaW5lICAgSTJTTUNfSTJTRl9BREMgMgorI2RlZmluZSAgIEkyU01DX0kyU0ZfSTJTIDMKKworCisvKiBWb2x1bWUgdXAsIERvd24sIE11dGUgKi8KKyNkZWZpbmUJVlNfVk1QCSgxPDwyKQkvKiBWb2x1bWUgbXV0ZSAxOiBwdXNoZWQsIDA6IG5vdCAqLworI2RlZmluZQlWU19WRFAJKDE8PDEpCS8qIFZvbHVtZSBEb3duIDE6IHB1c2hlZCwgMDogbm90ICovCisjZGVmaW5lIFZTX1ZVUAkxCS8qIFZvbGltZSBVcCAxOiBwdXNoZWQsIDA6IG5vdCAqLworCisvKiBTUkMsIE1peGVyIHRlc3QgY29udHJvbC9ERkMgc3RhdHVzIHJlZyAqLworI2RlZmluZSBTUkNTX0RQVVNDICAgICAgKDE8PDUpCS8qIERGQyBQbGF5YmFjayB1bmRlcnJ1biBTdGF0dXMvY2xlYXIgKi8KKyNkZWZpbmUJU1JDU19EQ09TQwkoMTw8NCkJLyogREZDIENhcHR1cmUgT3ZlcnJ1biBTdGF0dXMvY2xlYXIgKi8KKyNkZWZpbmUgU1JDU19TSVMJKDE8PDMpCS8qIFNSQyBpbnB1dCBzZWxlY3QgMTogTWl4ZXIsIDA6IENvZGVjIEkvRiAqLworI2RlZmluZSBTUkNTX0NESVNfQklUCTAJLyogQ29kZWMgRGF0YSBJbnB1dCBTZWxlY3QgKi8KKyNkZWZpbmUgU1JDU19DRElTX01BU0sgIDB4MDcKKyNkZWZpbmUgICBTUkNTX0NESVNfTUlYRVIgMAorI2RlZmluZSAgIFNSQ1NfQ0RJU19QQ00gICAxCisjZGVmaW5lICAgU1JDU19DRElTX0kyUyAgIDIKKyNkZWZpbmUgICBTUkNTX0NESVNfRk0gICAgMworI2RlZmluZSAgIFNSQ1NfQ0RJU19ERkMgICA0CisKKworLyogQ29kZWMgSW5kZXggUmVnIGNvbW1hbmQgUG9ydCAqLworI2RlZmluZSBDSVJDUF9DSURfQklUICAgMTAKKyNkZWZpbmUgQ0lSQ1BfQ0lEX01BU0sgICgweDAzPDxDSVJDUF9DSURfQklUKQorI2RlZmluZSBDSVJDUF9DUFMJKDE8PDkpCS8qIENvbW1hbmQgUG9ydCBTdGF0dXMgMDogcmVhZHksIDE6IGJ1c3kgKi8KKyNkZWZpbmUJQ0lSQ1BfRFBWRgkoMTw8OCkJLyogRGF0YSBQb3J0IFZhbGlkIEZsYWcgMDogaW52YWxpcywgMTogdmFsaWQgKi8KKyNkZWZpbmUgQ0lSQ1BfUldDCSgxPDw3KQkvKiBSZWFkL3dyaXRlIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ0lSQ1BfQ0lBX0JJVCAgIDAKKyNkZWZpbmUgQ0lSQ1BfQ0lBX01BU0sgIDB4MDA3RgkvKiBDb2RlYyBJbmRleCBBZGRyZXNzICovCisKKy8qIFRlc3QgTW9kZSBDb250cm9sL1Rlc3QgZ3JvdXAgU2VsZWN0IENvbnRyb2wgKi8KKworLyogR2VuZXJhbCBDb250cm9sIFJlZyAqLworI2RlZmluZSBHQ19WRENfQklUCTYJLyogVm9sdW1lIERpdmlzaW9uIENvbnRyb2wgKi8KKyNkZWZpbmUgR0NfVkRDX01BU0sgICAgICgweDAzPDxHQ19WRENfQklUKQorI2RlZmluZSAgIEdDX1ZEQ19OT05FICAgMAorI2RlZmluZSAgIEdDX1ZEQ19ESVYyICAgKDE8PEdDX1ZEQ19CSVQpCisjZGVmaW5lICAgR0NfVkRDX0RJVjQgICAoMjw8R0NfVkRDX0JJVCkKKyNkZWZpbmUJR0NfU09FCSAgICAgICAgKDE8PDIpCS8qIFMvUERJRiBPdXRwdXQgZW5hYmxlICovCisjZGVmaW5lCUdDX1NXUgkgICAgICAgIDEJLyogU29mdHdhcmUgd2FybiByZXNldCAqLworCisvKiBJbnRlcnJ1cHQgbWFzayBDb250cm9sIFJlZyAqLworI2RlZmluZQlJTUNfVkNJTQkoMTw8NikJLyogVm9sdW1lIENOVEwgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUJSU1DX0NDSU0JKDE8PDEpCS8qIENhcHR1cmUgQ2hhbi4gaXRlcnJ1cHQgbWFzayAqLworI2RlZmluZQlJTUNfUENJTQkxCS8qIFBsYXliYWNrIENoYW4uIGludGVycnVwdCBtYXNrICovCisKKy8qIEludGVycnVwdCBzdGF0dXMvY2xlYXIgcmVnICovCisjZGVmaW5lCUlTQ19WQ0kJICAgICAgICAoMTw8NikJLyogVm9sdW1lIENOVEwgaW50ZXJydXB0IDE6IGNsZWFycyAqLworI2RlZmluZQlJU0NfQ0NJCSAgICAgICAgKDE8PDEpCS8qIENhcHR1cmUgQ2hhbi4gaW50ZXJydXB0IDE6IGNsZWFycyAgKi8KKyNkZWZpbmUJSVNDX1BDSQkgICAgICAgIDEJLyogUGxheWJhY2sgQ2hhbi4gaW50ZXJydXB0IDE6IGNsZWFycyAqLworCisvKiBtaXNjIHN0dWZmICovCisjZGVmaW5lIFBPTExfQ09VTlQgICAweDUwMDAKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIERlZmluZSBESUdJVEFMMSBhcyB0aGUgSTJTIGNoYW5uZWwsIHNpbmNlIGl0IGlzIG5vdCBsaXN0ZWQgaW4KKyAqIHNvdW5kY2FyZC5oLgorICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0kyUyAgICAgICAgU09VTkRfTUlYRVJfRElHSVRBTDEKKyNkZWZpbmUgU09VTkRfTUFTS19JMlMgICAgICAgICBTT1VORF9NQVNLX0RJR0lUQUwxCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfSTJTICAgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9JMlMpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0kyUyAgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfSTJTKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGl0ODE3Ml9zdGF0ZSB7CisJLyogbGlzdCBvZiBpdDgxNzIgZGV2aWNlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2czsKKworCS8qIHRoZSBjb3JyZXNwb25kaW5nIHBjaV9kZXYgc3RydWN0dXJlICovCisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfYXVkaW87CisKKwkvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBsb25nIGlvOworCXVuc2lnbmVkIGludCBpcnE7CisKKwkvKiBQQ0kgSUQncyAqLworCXUxNiB2ZW5kb3I7CisJdTE2IGRldmljZTsKKwl1OCByZXY7IC8qIHRoZSBjaGlwIHJldmlzaW9uICovCisKKwkvKiBvcHRpb25zICovCisJaW50IHNwZGlmX3ZvbHVtZTsgLyogUy9QRElGIG91dHB1dCBpcyBlbmFibGVkIGlmICE9IC0xICovCisJaW50IGkyc192b2x1bWU7ICAgLyogY3VycmVudCBJMlMgb3V0IHZvbHVtZSwgaW4gT1NTIGZvcm1hdCAqLworCWludCBpMnNfcmVjb3JkaW5nOy8qIDEgPSByZWNvcmRpbmcgZnJvbSBJMlMsIDAgPSBub3QgKi8KKyAgICAKKyNpZmRlZiBJVDgxNzJfREVCVUcKKwkvKiBkZWJ1ZyAvcHJvYyBlbnRyeSAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHM7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICphYzk3X3BzOworI2VuZGlmIC8qIElUODE3Ml9ERUJVRyAqLworCisJc3RydWN0IGFjOTdfY29kZWMgY29kZWM7CisKKwl1bnNpZ25lZCBzaG9ydCBwY2MsIGNhcGNjOworCXVuc2lnbmVkIGRhY3JhdGUsIGFkY3JhdGU7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwltb2RlX3Qgb3Blbl9tb2RlOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCXN0cnVjdCBkbWFidWYgeworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hYWRkcjsKKwkJdW5zaWduZWQgYnVmb3JkZXI7CisJCXVuc2lnbmVkIG51bWZyYWc7CisJCXVuc2lnbmVkIGZyYWdzaGlmdDsKKwkJdm9pZCogbmV4dEluOworCQl2b2lkKiBuZXh0T3V0OworCQlpbnQgY291bnQ7CisJCWludCBjdXJCdWZQdHI7CisJCXVuc2lnbmVkIHRvdGFsX2J5dGVzOworCQl1bnNpZ25lZCBlcnJvcjsgLyogb3Zlci91bmRlcnJ1biAqLworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCisJCXVuc2lnbmVkIGZyYWdzaXplOworCQl1bnNpZ25lZCBkbWFzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKwkJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIG1hcHBlZDoxOworCQl1bnNpZ25lZCByZWFkeToxOworCQl1bnNpZ25lZCBzdG9wcGVkOjE7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwl9IGRtYV9kYWMsIGRtYV9hZGM7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIExJU1RfSEVBRChkZXZzKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbGQyKHVuc2lnbmVkIGludCB4KQoreworCXVuc2lnbmVkIHIgPSAwOworCQorCWlmICh4ID49IDB4MTAwMDApIHsKKwkJeCA+Pj0gMTY7CisJCXIgKz0gMTY7CisJfQorCWlmICh4ID49IDB4MTAwKSB7CisJCXggPj49IDg7CisJCXIgKz0gODsKKwl9CisJaWYgKHggPj0gMHgxMCkgeworCQl4ID4+PSA0OworCQlyICs9IDQ7CisJfQorCWlmICh4ID49IDQpIHsKKwkJeCA+Pj0gMjsKKwkJciArPSAyOworCX0KKwlpZiAoeCA+PSAyKQorCQlyKys7CisJcmV0dXJuIHI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBpdDgxNzJfZGVsYXkoaW50IG1zZWMpCit7CisJdW5zaWduZWQgbG9uZyB0bW87CisJc2lnbmVkIGxvbmcgdG1vMjsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJcmV0dXJuOworICAgIAorCXRtbyA9IGppZmZpZXMgKyAobXNlYypIWikvMTAwMDsKKwlmb3IgKDs7KSB7CisJCXRtbzIgPSB0bW8gLSBqaWZmaWVzOworCQlpZiAodG1vMiA8PSAwKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlX3RpbWVvdXQodG1vMik7CisJfQorfQorCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorZ2V0X2NvbXBhdF9yYXRlKHVuc2lnbmVkKiByYXRlKQoreworCXVuc2lnbmVkIHJhdGVfb3V0ID0gKnJhdGU7CisJdW5zaWduZWQgc2hvcnQgc3I7CisgICAgCisJaWYgKHJhdGVfb3V0ID49IDQ2MDUwKSB7CisJCXNyID0gQ0NfU1JfNDgwMDA7IHJhdGVfb3V0ID0gNDgwMDA7CisJfSBlbHNlIGlmIChyYXRlX291dCA+PSA0MTI1MCkgeworCQlzciA9IENDX1NSXzQ0MTAwOyByYXRlX291dCA9IDQ0MTAwOworCX0gZWxzZSBpZiAocmF0ZV9vdXQgPj0gMzUyMDApIHsKKwkJc3IgPSBDQ19TUl8zODQwMDsgcmF0ZV9vdXQgPSAzODQwMDsKKwl9IGVsc2UgaWYgKHJhdGVfb3V0ID49IDI3MDI1KSB7CisJCXNyID0gQ0NfU1JfMzIwMDA7IHJhdGVfb3V0ID0gMzIwMDA7CisJfSBlbHNlIGlmIChyYXRlX291dCA+PSAyMDYyNSkgeworCQlzciA9IENDX1NSXzIyMDUwOyByYXRlX291dCA9IDIyMDUwOworCX0gZWxzZSBpZiAocmF0ZV9vdXQgPj0gMTc2MDApIHsKKwkJc3IgPSBDQ19TUl8xOTIwMDsgcmF0ZV9vdXQgPSAxOTIwMDsKKwl9IGVsc2UgaWYgKHJhdGVfb3V0ID49IDEzNTEzKSB7CisJCXNyID0gQ0NfU1JfMTYwMDA7IHJhdGVfb3V0ID0gMTYwMDA7CisJfSBlbHNlIGlmIChyYXRlX291dCA+PSAxMDMxMykgeworCQlzciA9IENDX1NSXzExMDI1OyByYXRlX291dCA9IDExMDI1OworCX0gZWxzZSBpZiAocmF0ZV9vdXQgPj0gODgwMCkgeworCQlzciA9IENDX1NSXzk2MDA7IHJhdGVfb3V0ID0gOTYwMDsKKwl9IGVsc2UgaWYgKHJhdGVfb3V0ID49IDY3NTApIHsKKwkJc3IgPSBDQ19TUl84MDAwOyByYXRlX291dCA9IDgwMDA7CisJfSBlbHNlIHsKKwkJc3IgPSBDQ19TUl81NTAwOyByYXRlX291dCA9IDU1MDA7CisJfQorCisJKnJhdGUgPSByYXRlX291dDsKKwlyZXR1cm4gc3I7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hZGNfcmF0ZShzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgc3I7CisgICAgCisJc3IgPSBnZXRfY29tcGF0X3JhdGUoJnJhdGUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5jYXBjYyAmPSB+Q0NfU1JfTUFTSzsKKwlzLT5jYXBjYyB8PSBzcjsKKwlvdXR3KHMtPmNhcGNjLCBzLT5pbytJVF9BQ19DQVBDQyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJcy0+YWRjcmF0ZSA9IHJhdGU7Cit9CisKKworc3RhdGljIHZvaWQgc2V0X2RhY19yYXRlKHN0cnVjdCBpdDgxNzJfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBzcjsKKyAgICAKKwlzciA9IGdldF9jb21wYXRfcmF0ZSgmcmF0ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPnBjYyAmPSB+Q0NfU1JfTUFTSzsKKwlzLT5wY2MgfD0gc3I7CisJb3V0dyhzLT5wY2MsIHMtPmlvK0lUX0FDX1BDQyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJcy0+ZGFjcmF0ZSA9IHJhdGU7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1MTYgcmRjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IGFkZHIpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcyA9IChzdHJ1Y3QgaXQ4MTcyX3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IGNpcmNwLCBkYXRhOworCWludCBpOworICAgIAorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKQorCQlpZiAoIShpbncocy0+aW8rSVRfQUNfQ0lSQ1ApICYgQ0lSQ1BfQ1BTKSkKKwkJCWJyZWFrOworCWlmIChpID09IFBPTExfQ09VTlQpCisJCWVycigicmRjb2RlYzogY29kZWMgcmVhZHkgcG9sbCBleHBpcmVkISIpOworCisJY2lyY3AgPSBhZGRyICYgQ0lSQ1BfQ0lBX01BU0s7CisJY2lyY3AgfD0gKGNvZGVjLT5pZCA8PCBDSVJDUF9DSURfQklUKTsKKwljaXJjcCB8PSBDSVJDUF9SV0M7IC8vIHJlYWQgY29tbWFuZAorCW91dHcoY2lyY3AsIHMtPmlvK0lUX0FDX0NJUkNQKTsKKworCS8qIG5vdyB3YWl0IGZvciB0aGUgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCBQT0xMX0NPVU5UOyBpKyspCisJCWlmIChpbncocy0+aW8rSVRfQUNfQ0lSQ1ApICYgQ0lSQ1BfRFBWRikKKwkJCWJyZWFrOworCWlmIChpID09IFBPTExfQ09VTlQpCisJCWVycigicmRjb2RlYzogcmVhZCBwb2xsIGV4cGlyZWQhIik7CisKKwlkYXRhID0gaW53KHMtPmlvK0lUX0FDX0NJUkRQKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworCitzdGF0aWMgdm9pZCB3cmNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggYWRkciwgdTE2IGRhdGEpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcyA9IChzdHJ1Y3QgaXQ4MTcyX3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IGNpcmNwOworCWludCBpOworICAgIAorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKQorCQlpZiAoIShpbncocy0+aW8rSVRfQUNfQ0lSQ1ApICYgQ0lSQ1BfQ1BTKSkKKwkJCWJyZWFrOworCWlmIChpID09IFBPTExfQ09VTlQpCisJCWVycigid3Jjb2RlYzogY29kZWMgcmVhZHkgcG9sbCBleHBpcmVkISIpOworCisJY2lyY3AgPSBhZGRyICYgQ0lSQ1BfQ0lBX01BU0s7CisJY2lyY3AgfD0gKGNvZGVjLT5pZCA8PCBDSVJDUF9DSURfQklUKTsKKwljaXJjcCAmPSB+Q0lSQ1BfUldDOyAvLyB3cml0ZSBjb21tYW5kCisKKwlvdXR3KGRhdGEsICBzLT5pbytJVF9BQ19DSVJEUCk7ICAvLyBzZW5kIGRhdGEgZmlyc3QKKwlvdXR3KGNpcmNwLCBzLT5pbytJVF9BQ19DSVJDUCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgd2FpdGNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wOworCisJLyogY29kZWNfd2FpdCBpcyB1c2VkIHRvIHdhaXQgZm9yIGEgcmVhZHkgc3RhdGUgYWZ0ZXIKKwkgICBhbiBBQzk3X1JFU0VULiAqLworCWl0ODE3Ml9kZWxheSgxMCk7CisKKwl0ZW1wID0gcmRjb2RlYyhjb2RlYywgMHgyNik7CisKKwkvLyBJZiBwb3dlciBkb3duLCBwb3dlciB1cAorCWlmICh0ZW1wICYgMHgzZjAwKSB7CisJCS8vIFBvd2VyIG9uCisJCXdyY29kZWMoY29kZWMsIDB4MjYsIDApOworCQlpdDgxNzJfZGVsYXkoMTAwKTsKKwkJLy8gUmVyZWFkCisJCXRlbXAgPSByZGNvZGVjKGNvZGVjLCAweDI2KTsKKwl9CisgICAgCisJLy8gQ2hlY2sgaWYgQ29kZWMgUkVGLEFOTCxEQUMsQURDIHJlYWR5KioqLworCWlmICgodGVtcCAmIDB4M2YwZikgIT0gMHgwMDBmKSB7CisJCWVycigiY29kZWMgcmVnIDI2IHN0YXR1cyAoMHgleCkgbm90IHJlYWR5ISEiLCB0ZW1wKTsKKwkJcmV0dXJuOworCX0KK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfYWRjKHN0cnVjdCBpdDgxNzJfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiogZGIgPSAmcy0+ZG1hX2FkYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgaW1jOworICAgIAorCWlmIChkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCXMtPmNhcGNjICY9IH4oQ0NfQ0EgfCBDQ19DUCB8IENDX0NCMkwgfCBDQ19DQjFMKTsKKwlzLT5jYXBjYyB8PSBDQ19DU1A7CisJb3V0dyhzLT5jYXBjYywgcy0+aW8rSVRfQUNfQ0FQQ0MpOworICAgIAorCS8vIGRpc2FibGUgY2FwdHVyZSBpbnRlcnJ1cHQKKwlpbWMgPSBpbmIocy0+aW8rSVRfQUNfSU1DKTsKKwlvdXRiKGltYyB8IElNQ19DQ0lNLCBzLT5pbytJVF9BQ19JTUMpOworCisJZGItPnN0b3BwZWQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfZGFjKHN0cnVjdCBpdDgxNzJfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiogZGIgPSAmcy0+ZG1hX2RhYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgaW1jOworICAgIAorCWlmIChkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCXMtPnBjYyAmPSB+KENDX0NBIHwgQ0NfQ1AgfCBDQ19DQjJMIHwgQ0NfQ0IxTCk7CisJcy0+cGNjIHw9IENDX0NTUDsKKwlvdXR3KHMtPnBjYywgcy0+aW8rSVRfQUNfUENDKTsKKyAgICAKKwkvLyBkaXNhYmxlIHBsYXliYWNrIGludGVycnVwdAorCWltYyA9IGluYihzLT5pbytJVF9BQ19JTUMpOworCW91dGIoaW1jIHwgSU1DX1BDSU0sIHMtPmlvK0lUX0FDX0lNQyk7CisKKwlkYi0+c3RvcHBlZCA9IDE7CisgICAgCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBpdDgxNzJfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiogZGIgPSAmcy0+ZG1hX2RhYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgaW1jOworCXVuc2lnbmVkIGxvbmcgYnVmMSwgYnVmMjsKKyAgICAKKwlpZiAoIWRiLT5zdG9wcGVkKQorCQlyZXR1cm47CisgICAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCS8vIHJlc2V0IEJ1ZmZlciAxIGFuZCAyIHBvaW50ZXJzIHRvIG5leHRPdXQgYW5kIG5leHRPdXQrZnJhZ3NpemUKKwlidWYxID0gdmlydF90b19idXMoZGItPm5leHRPdXQpOworCWJ1ZjIgPSBidWYxICsgZGItPmZyYWdzaXplOworCWlmIChidWYyID49IGRiLT5kbWFhZGRyICsgZGItPmRtYXNpemUpCisJCWJ1ZjIgLT0gZGItPmRtYXNpemU7CisgICAgCisJb3V0bChidWYxLCBzLT5pbytJVF9BQ19QQ0IxU1RBKTsKKwlvdXRsKGJ1ZjIsIHMtPmlvK0lUX0FDX1BDQjJTVEEpOworCWRiLT5jdXJCdWZQdHIgPSBJVF9BQ19QQ0IxU1RBOworICAgIAorCS8vIGVuYWJsZSBwbGF5YmFjayBpbnRlcnJ1cHQKKwlpbWMgPSBpbmIocy0+aW8rSVRfQUNfSU1DKTsKKwlvdXRiKGltYyAmIH5JTUNfUENJTSwgcy0+aW8rSVRfQUNfSU1DKTsKKworCXMtPnBjYyAmPSB+KENDX0NTUCB8IENDX0NQIHwgQ0NfQ0IyTCB8IENDX0NCMUwpOworCXMtPnBjYyB8PSBDQ19DQTsKKwlvdXR3KHMtPnBjYywgcy0+aW8rSVRfQUNfUENDKTsKKyAgICAKKwlkYi0+c3RvcHBlZCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1hYnVmKiBkYiA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBpbWM7CisJdW5zaWduZWQgbG9uZyBidWYxLCBidWYyOworICAgIAorCWlmICghZGItPnN0b3BwZWQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkvLyByZXNldCBCdWZmZXIgMSBhbmQgMiBwb2ludGVycyB0byBuZXh0SW4gYW5kIG5leHRJbitmcmFnc2l6ZQorCWJ1ZjEgPSB2aXJ0X3RvX2J1cyhkYi0+bmV4dEluKTsKKwlidWYyID0gYnVmMSArIGRiLT5mcmFnc2l6ZTsKKwlpZiAoYnVmMiA+PSBkYi0+ZG1hYWRkciArIGRiLT5kbWFzaXplKQorCQlidWYyIC09IGRiLT5kbWFzaXplOworICAgIAorCW91dGwoYnVmMSwgcy0+aW8rSVRfQUNfQ0FQQjFTVEEpOworCW91dGwoYnVmMiwgcy0+aW8rSVRfQUNfQ0FQQjJTVEEpOworCWRiLT5jdXJCdWZQdHIgPSBJVF9BQ19DQVBCMVNUQTsKKworCS8vIGVuYWJsZSBjYXB0dXJlIGludGVycnVwdAorCWltYyA9IGluYihzLT5pbytJVF9BQ19JTUMpOworCW91dGIoaW1jICYgfklNQ19DQ0lNLCBzLT5pbytJVF9BQ19JTUMpOworCisJcy0+Y2FwY2MgJj0gfihDQ19DU1AgfCBDQ19DUCB8IENDX0NCMkwgfCBDQ19DQjFMKTsKKwlzLT5jYXBjYyB8PSBDQ19DQTsKKwlvdXR3KHMtPmNhcGNjLCBzLT5pbytJVF9BQ19DQVBDQyk7CisgICAgCisJZGItPnN0b3BwZWQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAoMTctUEFHRV9TSElGVCkKKyNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKKworc3RhdGljIGlubGluZSB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBpdDgxNzJfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWlmIChkYi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsKKwkJCQkgICAgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIsCisJCQkJICAgIGRiLT5yYXdidWYsIGRiLT5kbWFhZGRyKTsKKwl9CisJZGItPnJhd2J1ZiA9IGRiLT5uZXh0SW4gPSBkYi0+bmV4dE91dCA9IE5VTEw7CisJZGItPm1hcHBlZCA9IGRiLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIsCisJCSAgICAgICB1bnNpZ25lZCByYXRlLCB1bnNpZ25lZCBmbXQsIHVuc2lnbmVkIHJlZykKK3sKKwlpbnQgb3JkZXI7CisJdW5zaWduZWQgYnl0ZXBlcnNlYzsKKwl1bnNpZ25lZCBidWZzOworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWlmICghZGItPnJhd2J1ZikgeworCQlkYi0+cmVhZHkgPSBkYi0+bWFwcGVkID0gMDsKKwkJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7CisJCSAgICAgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKQorCQkJaWYgKChkYi0+cmF3YnVmID0KKwkJCSAgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocy0+ZGV2LAorCQkJCQkJICBQQUdFX1NJWkUgPDwgb3JkZXIsCisJCQkJCQkgICZkYi0+ZG1hYWRkcikpKQorCQkJCWJyZWFrOworCQlpZiAoIWRiLT5yYXdidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZGItPmJ1Zm9yZGVyID0gb3JkZXI7CisJCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsKKwkJICAgb3RoZXJ3aXNlIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLworCQlwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKworCQkJCSAgICAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKKwl9CisKKwlkYi0+Y291bnQgPSAwOworCWRiLT5uZXh0SW4gPSBkYi0+bmV4dE91dCA9IGRiLT5yYXdidWY7CisgICAgCisJYnl0ZXBlcnNlYyA9IHJhdGUgPDwgc2FtcGxlX3NoaWZ0W2ZtdF07CisJYnVmcyA9IFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXI7CisJaWYgKGRiLT5vc3NmcmFnc2hpZnQpIHsKKwkJaWYgKCgxMDAwIDw8IGRiLT5vc3NmcmFnc2hpZnQpIDwgYnl0ZXBlcnNlYykKKwkJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAwKTsKKwkJZWxzZQorCQkJZGItPmZyYWdzaGlmdCA9IGRiLT5vc3NmcmFnc2hpZnQ7CisJfSBlbHNlIHsKKwkJZGItPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjLzEwMC8oZGItPnN1YmRpdmlzaW9uID8KKwkJCQkJCSAgICBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CisJCWlmIChkYi0+ZnJhZ3NoaWZ0IDwgMykKKwkJCWRiLT5mcmFnc2hpZnQgPSAzOworCX0KKwlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl3aGlsZSAoZGItPm51bWZyYWcgPCA0ICYmIGRiLT5mcmFnc2hpZnQgPiAzKSB7CisJCWRiLT5mcmFnc2hpZnQtLTsKKwkJZGItPm51bWZyYWcgPSBidWZzID4+IGRiLT5mcmFnc2hpZnQ7CisJfQorCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKwlpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisJCWRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworCWRiLT5mcmFnc2FtcGxlcyA9IGRiLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZm10XTsKKwlkYi0+ZG1hc2l6ZSA9IGRiLT5udW1mcmFnIDw8IGRiLT5mcmFnc2hpZnQ7CisJbWVtc2V0KGRiLT5yYXdidWYsIChmbXQgJiAoQ0NfREY+PkNDX0ZNVF9CSVQpKSA/IDAgOiAweDgwLCBidWZzKTsKKyAgICAKKyNpZmRlZiBJVDgxNzJfVkVSQk9TRV9ERUJVRworCWRiZygicmF0ZT0lZCwgZnJhZ3NpemU9JWQsIG51bWZyYWc9JWQsIGRtYXNpemU9JWQiLAorCSAgICByYXRlLCBkYi0+ZnJhZ3NpemUsIGRiLT5udW1mcmFnLCBkYi0+ZG1hc2l6ZSk7CisjZW5kaWYKKworCS8vIHNldCBkYXRhIGxlbmd0aCByZWdpc3RlcgorCW91dHcoZGItPmZyYWdzaXplLCBzLT5pbytyZWcrMik7CisJZGItPnJlYWR5ID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9hZGMoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcykKK3sKKwlzdG9wX2FkYyhzKTsKKwlyZXR1cm4gcHJvZ19kbWFidWYocywgJnMtPmRtYV9hZGMsIHMtPmFkY3JhdGUsCisJCQkgICAocy0+Y2FwY2MgJiBDQ19GTVRfTUFTSykgPj4gQ0NfRk1UX0JJVCwKKwkJCSAgIElUX0FDX0NBUENDKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfZGFjKHN0cnVjdCBpdDgxNzJfc3RhdGUgKnMpCit7CisJc3RvcF9kYWMocyk7CisJcmV0dXJuIHByb2dfZG1hYnVmKHMsICZzLT5kbWFfZGFjLCBzLT5kYWNyYXRlLAorCQkJICAgKHMtPnBjYyAmIENDX0ZNVF9NQVNLKSA+PiBDQ19GTVRfQklULAorCQkJICAgSVRfQUNfUENDKTsKK30KKworCisvKiBob2xkIHNwaW5sb2NrIGZvciB0aGUgZm9sbG93aW5nISAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgaXQ4MTcyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpdDgxNzJfc3RhdGUgKnMgPSAoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqKWRldl9pZDsKKwlzdHJ1Y3QgZG1hYnVmKiBkYWMgPSAmcy0+ZG1hX2RhYzsKKwlzdHJ1Y3QgZG1hYnVmKiBhZGMgPSAmcy0+ZG1hX2FkYzsKKwl1bnNpZ25lZCBjaGFyIGlzYywgdnM7CisJdW5zaWduZWQgc2hvcnQgdm9sLCBtdXRlOworCXVuc2lnbmVkIGxvbmcgbmV3cHRyOworICAgIAorCXNwaW5fbG9jaygmcy0+bG9jayk7CisKKwlpc2MgPSBpbmIocy0+aW8rSVRfQUNfSVNDKTsKKworCS8qIGZhc3RwYXRoIG91dCwgdG8gZWFzZSBpbnRlcnJ1cHQgc2hhcmluZyAqLworCWlmICghKGlzYyAmIChJU0NfVkNJIHwgSVNDX0NDSSB8IElTQ19QQ0kpKSkgeworCQlzcGluX3VubG9jaygmcy0+bG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisgICAgCisJLyogY2xlYXIgYXVkaW8gaW50ZXJydXB0cyBmaXJzdCAqLworCW91dGIoaXNjIHwgSVNDX1ZDSSB8IElTQ19DQ0kgfCBJU0NfUENJLCBzLT5pbytJVF9BQ19JU0MpOworICAgIAorCS8qIGhhbmRsZSB2b2x1bWUgYnV0dG9uIGV2ZW50cyAoaWdub3JlIGlmIFMvUERJRiBlbmFibGVkKSAqLworCWlmICgoaXNjICYgSVNDX1ZDSSkgJiYgcy0+c3BkaWZfdm9sdW1lID09IC0xKSB7CisJCXZzID0gaW5iKHMtPmlvK0lUX0FDX1ZTKTsKKwkJb3V0YigwLCBzLT5pbytJVF9BQ19WUyk7CisJCXZvbCA9IGludyhzLT5pbytJVF9BQ19QQ01PVik7CisJCW11dGUgPSB2b2wgJiBQQ01PVl9QQ01PTTsKKwkJdm9sICY9IFBDTU9WX1BDTUxDR19NQVNLOworCQlpZiAoKHZzICYgVlNfVlVQKSAmJiB2b2wgPiAwKQorCQkJdm9sLS07CisJCWlmICgodnMgJiBWU19WRFApICYmIHZvbCA8IDB4MWYpCisJCQl2b2wrKzsKKwkJdm9sIHw9ICh2b2wgPDwgUENNT1ZfUENNUkNHX0JJVCk7CisJCWlmICh2cyAmIFZTX1ZNUCkKKwkJCXZvbCB8PSAobXV0ZSBeIFBDTU9WX1BDTU9NKTsKKwkJb3V0dyh2b2wsIHMtPmlvK0lUX0FDX1BDTU9WKTsKKwl9CisgICAgCisJLyogdXBkYXRlIGNhcHR1cmUgcG9pbnRlcnMgKi8KKwlpZiAoaXNjICYgSVNDX0NDSSkgeworCQlpZiAoYWRjLT5jb3VudCA+IGFkYy0+ZG1hc2l6ZSAtIGFkYy0+ZnJhZ3NpemUpIHsKKwkJCS8vIE92ZXJydW4uIFN0b3AgQURDIGFuZCBsb2cgdGhlIGVycm9yCisJCQlzdG9wX2FkYyhzKTsKKwkJCWFkYy0+ZXJyb3IrKzsKKwkJCWRiZygiYWRjIG92ZXJydW4iKTsKKwkJfSBlbHNlIHsKKwkJCW5ld3B0ciA9IHZpcnRfdG9fYnVzKGFkYy0+bmV4dEluKSArIDIqYWRjLT5mcmFnc2l6ZTsKKwkJCWlmIChuZXdwdHIgPj0gYWRjLT5kbWFhZGRyICsgYWRjLT5kbWFzaXplKQorCQkJCW5ld3B0ciAtPSBhZGMtPmRtYXNpemU7CisJICAgIAorCQkJb3V0bChuZXdwdHIsIHMtPmlvK2FkYy0+Y3VyQnVmUHRyKTsKKwkJCWFkYy0+Y3VyQnVmUHRyID0gKGFkYy0+Y3VyQnVmUHRyID09IElUX0FDX0NBUEIxU1RBKSA/CisJCQkJSVRfQUNfQ0FQQjJTVEEgOiBJVF9BQ19DQVBCMVNUQTsKKwkgICAgCisJCQlhZGMtPm5leHRJbiArPSBhZGMtPmZyYWdzaXplOworCQkJaWYgKGFkYy0+bmV4dEluID49IGFkYy0+cmF3YnVmICsgYWRjLT5kbWFzaXplKQorCQkJCWFkYy0+bmV4dEluIC09IGFkYy0+ZG1hc2l6ZTsKKwkgICAgCisJCQlhZGMtPmNvdW50ICs9IGFkYy0+ZnJhZ3NpemU7CisJCQlhZGMtPnRvdGFsX2J5dGVzICs9IGFkYy0+ZnJhZ3NpemU7CisKKwkJCS8qIHdha2UgdXAgYW55Ym9keSBsaXN0ZW5pbmcgKi8KKwkJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZhZGMtPndhaXQpKQorCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYWRjLT53YWl0KTsKKwkJfQorCX0KKyAgICAKKwkvKiB1cGRhdGUgcGxheWJhY2sgcG9pbnRlcnMgKi8KKwlpZiAoaXNjICYgSVNDX1BDSSkgeworCQluZXdwdHIgPSB2aXJ0X3RvX2J1cyhkYWMtPm5leHRPdXQpICsgMipkYWMtPmZyYWdzaXplOworCQlpZiAobmV3cHRyID49IGRhYy0+ZG1hYWRkciArIGRhYy0+ZG1hc2l6ZSkKKwkJCW5ld3B0ciAtPSBkYWMtPmRtYXNpemU7CisJCisJCW91dGwobmV3cHRyLCBzLT5pbytkYWMtPmN1ckJ1ZlB0cik7CisJCWRhYy0+Y3VyQnVmUHRyID0gKGRhYy0+Y3VyQnVmUHRyID09IElUX0FDX1BDQjFTVEEpID8KKwkJCUlUX0FDX1BDQjJTVEEgOiBJVF9BQ19QQ0IxU1RBOworCQorCQlkYWMtPm5leHRPdXQgKz0gZGFjLT5mcmFnc2l6ZTsKKwkJaWYgKGRhYy0+bmV4dE91dCA+PSBkYWMtPnJhd2J1ZiArIGRhYy0+ZG1hc2l6ZSkKKwkJCWRhYy0+bmV4dE91dCAtPSBkYWMtPmRtYXNpemU7CisJCisJCWRhYy0+Y291bnQgLT0gZGFjLT5mcmFnc2l6ZTsKKwkJZGFjLT50b3RhbF9ieXRlcyArPSBkYWMtPmZyYWdzaXplOworCisJCS8qIHdha2UgdXAgYW55Ym9keSBsaXN0ZW5pbmcgKi8KKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmRhYy0+d2FpdCkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRhYy0+d2FpdCk7CisJCisJCWlmIChkYWMtPmNvdW50IDw9IDApCisJCQlzdG9wX2RhYyhzKTsKKwl9CisgICAgCisJc3Bpbl91bmxvY2soJnMtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgaXQ4MTcyX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBpdDgxNzJfc3RhdGUsIGRldnMpOworCQlpZiAocy0+Y29kZWMuZGV2X21peGVyID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGl0ODE3Ml9yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdTE2CitjdnRfb3Nzdm9sKHVuc2lnbmVkIGludCBnYWluKQoreworCXUxNiByZXQ7CisgICAgCisJaWYgKGdhaW4gPT0gMCkKKwkJcmV0dXJuIDA7CisgICAgCisJaWYgKGdhaW4gPiAxMDApCisJCWdhaW4gPSAxMDA7CisgICAgCisJcmV0ID0gKDEwMCAtIGdhaW4gKyAzMikgLyA0OworCXJldCA9IHJldCA+IDMxID8gMzEgOiByZXQ7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG1peGRldl9pb2N0bChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzID0gKHN0cnVjdCBpdDgxNzJfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBsZWZ0LCByaWdodDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2YWw7CisJdTE2IHZvbDsKKyAgICAKKwkvKgorCSAqIFdoZW4gd2UgYXJlIGluIFMvUERJRiBtb2RlLCB3ZSB3YW50IHRvIGRpc2FibGUgYW55IGFuYWxvZyBvdXRwdXQgc28KKwkgKiB3ZSBmaWx0ZXIgdGhlIG1hc3Rlci9QQ00gY2hhbm5lbCB2b2x1bWUgaW9jdGxzLgorCSAqCisJICogQWxzbyBmaWx0ZXIgSTJTIGNoYW5uZWwsIHdoaWNoIEFDJzk3IGtub3dzIG5vdGhpbmcgYWJvdXQuCisJICovCisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgorCQkvLyBpZiBub3QgaW4gUy9QRElGIG1vZGUsIHBhc3MgdG8gQUMnOTcKKwkJaWYgKHMtPnNwZGlmX3ZvbHVtZSA9PSAtMSkKKwkJCWJyZWFrOworCQlyZXR1cm4gMDsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1BDTToKKwkJLy8gaWYgbm90IGluIFMvUERJRiBtb2RlLCBwYXNzIHRvIEFDJzk3CisJCWlmIChzLT5zcGRpZl92b2x1bWUgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmlnaHQgPSAoKHZhbCA+PiA4KSAgJiAweGZmKTsKKwkJbGVmdCA9ICh2YWwgICYgMHhmZik7CisJCWlmIChyaWdodCA+IDEwMCkKKwkJCXJpZ2h0ID0gMTAwOworCQlpZiAobGVmdCA+IDEwMCkKKwkJCWxlZnQgPSAxMDA7CisJCXMtPnNwZGlmX3ZvbHVtZSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7CisJCXZvbCA9IGN2dF9vc3N2b2wobGVmdCk7CisJCXZvbCB8PSAoY3Z0X29zc3ZvbChyaWdodCkgPDwgUENNT1ZfUENNUkNHX0JJVCk7CisJCWlmICh2b2wgPT0gMCkKKwkJCXZvbCA9IFBDTU9WX1BDTU9NOyAvLyBtdXRlCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCW91dHcodm9sLCBzLT5pbytJVF9BQ19QQ01PVik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHMtPnNwZGlmX3ZvbHVtZSwgKGludCAqKWFyZyk7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1BDTToKKwkJLy8gaWYgbm90IGluIFMvUERJRiBtb2RlLCBwYXNzIHRvIEFDJzk3CisJCWlmIChzLT5zcGRpZl92b2x1bWUgPT0gLTEpCisJCQlicmVhazsKKwkJcmV0dXJuIHB1dF91c2VyKHMtPnNwZGlmX3ZvbHVtZSwgKGludCAqKWFyZyk7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9JMlM6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJpZ2h0ID0gKCh2YWwgPj4gOCkgICYgMHhmZik7CisJCWxlZnQgPSAodmFsICAmIDB4ZmYpOworCQlpZiAocmlnaHQgPiAxMDApCisJCQlyaWdodCA9IDEwMDsKKwkJaWYgKGxlZnQgPiAxMDApCisJCQlsZWZ0ID0gMTAwOworCQlzLT5pMnNfdm9sdW1lID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsKKwkJdm9sID0gY3Z0X29zc3ZvbChsZWZ0KTsKKwkJdm9sIHw9IChjdnRfb3Nzdm9sKHJpZ2h0KSA8PCBJMlNWX0kyU1JDR19CSVQpOworCQlpZiAodm9sID09IDApCisJCQl2b2wgPSBJMlNWX0kyU09NOyAvLyBtdXRlCisJCW91dHcodm9sLCBzLT5pbytJVF9BQ19JMlNWKTsKKwkJcmV0dXJuIHB1dF91c2VyKHMtPmkyc192b2x1bWUsIChpbnQgKilhcmcpOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9JMlM6CisJCXJldHVybiBwdXRfdXNlcihzLT5pMnNfdm9sdW1lLCAoaW50ICopYXJnKTsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQzoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAmIFNPVU5EX01BU0tfSTJTKSB7CisJCQlzLT5pMnNfcmVjb3JkaW5nID0gMTsKKwkJCW91dGIoRFJTU19JMlMsIHMtPmlvK0lUX0FDX0RSU1MpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlzLT5pMnNfcmVjb3JkaW5nID0gMDsKKwkJCW91dGIoRFJTU19BQzk3X1BSSU0sIHMtPmlvK0lUX0FDX0RSU1MpOworCQkJLy8gbm93IGxldCBBQyc5NyBzZWxlY3QgcmVjb3JkIHNvdXJjZQorCQkJYnJlYWs7CisJCX0KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDU1JDOgorCQlpZiAocy0+aTJzX3JlY29yZGluZykKKwkJCXJldHVybiBwdXRfdXNlcihTT1VORF9NQVNLX0kyUywgKGludCAqKWFyZyk7CisJCWVsc2UKKwkJCS8vIGxldCBBQyc5NyByZXBvcnQgcmVjb3JkaW5nIHNvdXJjZQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IGl0ODE3Ml9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcyA9IChzdHJ1Y3QgaXQ4MTcyX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9ICZzLT5jb2RlYzsKKworCXJldHVybiBtaXhkZXZfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGl0ODE3Ml9taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gaXQ4MTcyX2lvY3RsX21peGRldiwKKwkub3BlbgkJPSBpdDgxNzJfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSBpdDgxNzJfcmVsZWFzZV9taXhkZXYsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50LCB0bW87CisJCisJaWYgKHMtPmRtYV9kYWMubWFwcGVkIHx8ICFzLT5kbWFfZGFjLnJlYWR5IHx8IHMtPmRtYV9kYWMuc3RvcHBlZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKDs7KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJLy9pZiAobm9uYmxvY2spCisJCS8vcmV0dXJuIC1FQlVTWTsKKwkJdG1vID0gMTAwMCAqIGNvdW50IC8gcy0+ZGFjcmF0ZTsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPnBjYyAmIENDX0ZNVF9NQVNLKSA+PiBDQ19GTVRfQklUXTsKKwkJaXQ4MTcyX2RlbGF5KHRtbyk7CisJfQorCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyoKKyAqIENvcHkgYXVkaW8gZGF0YSB0by9mcm9tIHVzZXIgYnVmZmVyIGZyb20vdG8gZG1hIGJ1ZmZlciwgdGFraW5nIGNhcmUKKyAqIHRoYXQgd2Ugd3JhcCB3aGVuIHJlYWRpbmcvd3JpdGluZyB0aGUgZG1hIGJ1ZmZlci4gUmV0dXJucyBhY3R1YWwgYnl0ZQorICogY291bnQgd3JpdHRlbiB0byBvciByZWFkIGZyb20gdGhlIGRtYSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgY29weV9kbWFidWZfdXNlcihzdHJ1Y3QgZG1hYnVmICpkYiwgY2hhciogdXNlcmJ1ZiwKKwkJCSAgICBpbnQgY291bnQsIGludCB0b191c2VyKQoreworCWNoYXIqIGJ1ZnB0ciA9IHRvX3VzZXIgPyBkYi0+bmV4dE91dCA6IGRiLT5uZXh0SW47CisJY2hhciogYnVmZW5kID0gZGItPnJhd2J1ZiArIGRiLT5kbWFzaXplOworCQorCWlmIChidWZwdHIgKyBjb3VudCA+IGJ1ZmVuZCkgeworCQlpbnQgcGFydGlhbCA9IChpbnQpKGJ1ZmVuZCAtIGJ1ZnB0cik7CisJCWlmICh0b191c2VyKSB7CisJCQlpZiAoY29weV90b191c2VyKHVzZXJidWYsIGJ1ZnB0ciwgcGFydGlhbCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoY29weV90b191c2VyKHVzZXJidWYgKyBwYXJ0aWFsLCBkYi0+cmF3YnVmLAorCQkJCQkgY291bnQgLSBwYXJ0aWFsKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihidWZwdHIsIHVzZXJidWYsIHBhcnRpYWwpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRiLT5yYXdidWYsCisJCQkJCSAgIHVzZXJidWYgKyBwYXJ0aWFsLAorCQkJCQkgICBjb3VudCAtIHBhcnRpYWwpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHRvX3VzZXIpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlcmJ1ZiwgYnVmcHRyLCBjb3VudCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmcHRyLCB1c2VyYnVmLCBjb3VudCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJCisJcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyBzc2l6ZV90IGl0ODE3Ml9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWZmZXIsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzID0gKHN0cnVjdCBpdDgxNzJfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYWJ1ZiAqZGIgPSAmcy0+ZG1hX2FkYzsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjbnQsIHJlbWFpbmRlciwgYXZhaWw7CisKKwlpZiAoZGItPm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSAwOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkvLyB3YWl0IGZvciBzYW1wbGVzIGluIGNhcHR1cmUgYnVmZmVyCisJCWRvIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoZGItPnN0b3BwZWQpCisJCQkJc3RhcnRfYWRjKHMpOworCQkJYXZhaWwgPSBkYi0+Y291bnQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoYXZhaWwgPD0gMCkgeworCQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmRiLT53YWl0KTsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChhdmFpbCA8PSAwKTsKKworCQkvLyBjb3B5IGZyb20gbmV4dE91dCB0byB1c2VyCisJCWlmICgoY250ID0gY29weV9kbWFidWZfdXNlcihkYiwgYnVmZmVyLCBjb3VudCA+IGF2YWlsID8KKwkJCQkJICAgIGF2YWlsIDogY291bnQsIDEpKSA8IDApIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZGItPmNvdW50IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJCWRiLT5uZXh0T3V0ICs9IGNudDsKKwkJaWYgKGRiLT5uZXh0T3V0ID49IGRiLT5yYXdidWYgKyBkYi0+ZG1hc2l6ZSkKKwkJCWRiLT5uZXh0T3V0IC09IGRiLT5kbWFzaXplOwkKKworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJfSAvLyB3aGlsZSAoY291bnQgPiAwKQorCisJLyoKKwkgKiBTZWUgaWYgdGhlIGRtYSBidWZmZXIgY291bnQgYWZ0ZXIgdGhpcyByZWFkIGNhbGwgaXMKKwkgKiBhbGlnbmVkIG9uIGEgZnJhZ3NpemUgYm91bmRhcnkuIElmIG5vdCwgcmVhZCBmcm9tCisJICogYnVmZmVyIHVudGlsIHdlIHJlYWNoIGEgYm91bmRhcnksIGFuZCBsZXQncyBob3BlIHRoaXMKKwkgKiBpcyBqdXN0IHRoZSBsYXN0IHJlbWFpbmRlciBvZiBhbiBhdWRpbyByZWNvcmQuIElmIG5vdAorCSAqIGl0IG1lYW5zIHRoZSB1c2VyIGlzIG5vdCByZWFkaW5nIGluIGZyYWdzaXplIGNodW5rcywgaW4KKwkgKiB3aGljaCBjYXNlIGl0J3MgaGlzL2hlciBmYXVsdCB0aGF0IHRoZXJlIGFyZSBhdWRpbyBnYXBzCisJICogaW4gdGhlaXIgcmVjb3JkLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcmVtYWluZGVyID0gZGItPmNvdW50ICUgZGItPmZyYWdzaXplOworCWlmIChyZW1haW5kZXIpIHsKKwkJZGItPm5leHRPdXQgKz0gcmVtYWluZGVyOworCQlpZiAoZGItPm5leHRPdXQgPj0gZGItPnJhd2J1ZiArIGRiLT5kbWFzaXplKQorCQkJZGItPm5leHRPdXQgLT0gZGItPmRtYXNpemU7CisJCWRiLT5jb3VudCAtPSByZW1haW5kZXI7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGl0ODE3Ml93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpdDgxNzJfc3RhdGUgKnMgPSAoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9ICZzLT5kbWFfZGFjOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNudCwgcmVtYWluZGVyLCBhdmFpbDsKKworCWlmIChkYi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKyAgICAKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8vIHdhaXQgZm9yIHNwYWNlIGluIHBsYXliYWNrIGJ1ZmZlcgorCQlkbyB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJYXZhaWwgPSBkYi0+ZG1hc2l6ZSAtIGRiLT5jb3VudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChhdmFpbCA8PSAwKSB7CisJCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJCWlmICghcmV0KQorCQkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmZGItPndhaXQpOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKGF2YWlsIDw9IDApOworCQorCQkvLyBjb3B5IHRvIG5leHRJbgorCQlpZiAoKGNudCA9IGNvcHlfZG1hYnVmX3VzZXIoZGIsIChjaGFyKilidWZmZXIsCisJCQkJCSAgICBjb3VudCA+IGF2YWlsID8KKwkJCQkJICAgIGF2YWlsIDogY291bnQsIDApKSA8IDApIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZGItPmNvdW50ICs9IGNudDsKKwkJaWYgKGRiLT5zdG9wcGVkKQorCQkJc3RhcnRfZGFjKHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCisJCWRiLT5uZXh0SW4gKz0gY250OworCQlpZiAoZGItPm5leHRJbiA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQlkYi0+bmV4dEluIC09IGRiLT5kbWFzaXplOworCQorCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJfSAvLyB3aGlsZSAoY291bnQgPiAwKQorCQorCS8qCisJICogU2VlIGlmIHRoZSBkbWEgYnVmZmVyIGNvdW50IGFmdGVyIHRoaXMgd3JpdGUgY2FsbCBpcworCSAqIGFsaWduZWQgb24gYSBmcmFnc2l6ZSBib3VuZGFyeS4gSWYgbm90LCBmaWxsIGJ1ZmZlcgorCSAqIHdpdGggc2lsZW5jZSB0byB0aGUgbmV4dCBib3VuZGFyeSwgYW5kIGxldCdzIGhvcGUgdGhpcworCSAqIGlzIGp1c3QgdGhlIGxhc3QgcmVtYWluZGVyIG9mIGFuIGF1ZGlvIHBsYXliYWNrLiBJZiBub3QKKwkgKiBpdCBtZWFucyB0aGUgdXNlciBpcyBub3Qgc2VuZGluZyB1cyBmcmFnc2l6ZSBjaHVua3MsIGluCisJICogd2hpY2ggY2FzZSBpdCdzIGhpcy9oZXIgZmF1bHQgdGhhdCB0aGVyZSBhcmUgYXVkaW8gZ2FwcworCSAqIGluIHRoZWlyIHBsYXliYWNrLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcmVtYWluZGVyID0gZGItPmNvdW50ICUgZGItPmZyYWdzaXplOworCWlmIChyZW1haW5kZXIpIHsKKwkJaW50IGZpbGxfY250ID0gZGItPmZyYWdzaXplIC0gcmVtYWluZGVyOworCQltZW1zZXQoZGItPm5leHRJbiwgMCwgZmlsbF9jbnQpOworCQlkYi0+bmV4dEluICs9IGZpbGxfY250OworCQlpZiAoZGItPm5leHRJbiA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQlkYi0+bmV4dEluIC09IGRiLT5kbWFzaXplOworCQlkYi0+Y291bnQgKz0gZmlsbF9jbnQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50IGl0ODE3Ml9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzID0gKHN0cnVjdCBpdDgxNzJfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5KQorCQkJcmV0dXJuIDA7CisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2RhYy53YWl0LCB3YWl0KTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5KQorCQkJcmV0dXJuIDA7CisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2FkYy53YWl0LCB3YWl0KTsKKwl9CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2lnbmVkKXMtPmRtYV9kYWMuZG1hc2l6ZSA+PQorCQkJICAgIHMtPmRtYV9kYWMuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgaXQ4MTcyX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBpdDgxNzJfc3RhdGUgKnMgPSAoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCisJCWRiID0gJnMtPmRtYV9kYWM7CisJZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpCisJCWRiID0gJnMtPmRtYV9hZGM7CisJZWxzZSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCSAgICAgdmlydF90b19waHlzKGRiLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQkgICAgIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlkYi0+bWFwcGVkID0gMTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIElUODE3Ml9WRVJCT1NFX0RFQlVHCitzdGF0aWMgc3RydWN0IGlvY3RsX3N0cl90IHsKKwl1bnNpZ25lZCBpbnQgY21kOworCWNvbnN0IGNoYXIqIHN0cjsKK30gaW9jdGxfc3RyW10gPSB7CisJe1NORENUTF9EU1BfUkVTRVQsICJTTkRDVExfRFNQX1JFU0VUIn0sCisJe1NORENUTF9EU1BfU1lOQywgIlNORENUTF9EU1BfU1lOQyJ9LAorCXtTTkRDVExfRFNQX1NQRUVELCAiU05EQ1RMX0RTUF9TUEVFRCJ9LAorCXtTTkRDVExfRFNQX1NURVJFTywgIlNORENUTF9EU1BfU1RFUkVPIn0sCisJe1NORENUTF9EU1BfR0VUQkxLU0laRSwgIlNORENUTF9EU1BfR0VUQkxLU0laRSJ9LAorCXtTTkRDVExfRFNQX1NBTVBMRVNJWkUsICJTTkRDVExfRFNQX1NBTVBMRVNJWkUifSwKKwl7U05EQ1RMX0RTUF9DSEFOTkVMUywgIlNORENUTF9EU1BfQ0hBTk5FTFMifSwKKwl7U09VTkRfUENNX1dSSVRFX0NIQU5ORUxTLCAiU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTIn0sCisJe1NPVU5EX1BDTV9XUklURV9GSUxURVIsICJTT1VORF9QQ01fV1JJVEVfRklMVEVSIn0sCisJe1NORENUTF9EU1BfUE9TVCwgIlNORENUTF9EU1BfUE9TVCJ9LAorCXtTTkRDVExfRFNQX1NVQkRJVklERSwgIlNORENUTF9EU1BfU1VCRElWSURFIn0sCisJe1NORENUTF9EU1BfU0VURlJBR01FTlQsICJTTkRDVExfRFNQX1NFVEZSQUdNRU5UIn0sCisJe1NORENUTF9EU1BfR0VURk1UUywgIlNORENUTF9EU1BfR0VURk1UUyJ9LAorCXtTTkRDVExfRFNQX1NFVEZNVCwgIlNORENUTF9EU1BfU0VURk1UIn0sCisJe1NORENUTF9EU1BfR0VUT1NQQUNFLCAiU05EQ1RMX0RTUF9HRVRPU1BBQ0UifSwKKwl7U05EQ1RMX0RTUF9HRVRJU1BBQ0UsICJTTkRDVExfRFNQX0dFVElTUEFDRSJ9LAorCXtTTkRDVExfRFNQX05PTkJMT0NLLCAiU05EQ1RMX0RTUF9OT05CTE9DSyJ9LAorCXtTTkRDVExfRFNQX0dFVENBUFMsICJTTkRDVExfRFNQX0dFVENBUFMifSwKKwl7U05EQ1RMX0RTUF9HRVRUUklHR0VSLCAiU05EQ1RMX0RTUF9HRVRUUklHR0VSIn0sCisJe1NORENUTF9EU1BfU0VUVFJJR0dFUiwgIlNORENUTF9EU1BfU0VUVFJJR0dFUiJ9LAorCXtTTkRDVExfRFNQX0dFVElQVFIsICJTTkRDVExfRFNQX0dFVElQVFIifSwKKwl7U05EQ1RMX0RTUF9HRVRPUFRSLCAiU05EQ1RMX0RTUF9HRVRPUFRSIn0sCisJe1NORENUTF9EU1BfTUFQSU5CVUYsICJTTkRDVExfRFNQX01BUElOQlVGIn0sCisJe1NORENUTF9EU1BfTUFQT1VUQlVGLCAiU05EQ1RMX0RTUF9NQVBPVVRCVUYifSwKKwl7U05EQ1RMX0RTUF9TRVRTWU5DUk8sICJTTkRDVExfRFNQX1NFVFNZTkNSTyJ9LAorCXtTTkRDVExfRFNQX1NFVERVUExFWCwgIlNORENUTF9EU1BfU0VURFVQTEVYIn0sCisJe1NORENUTF9EU1BfR0VUT0RFTEFZLCAiU05EQ1RMX0RTUF9HRVRPREVMQVkifSwKKwl7U05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSywgIlNORENUTF9EU1BfR0VUQ0hBTk5FTE1BU0sifSwKKwl7U05EQ1RMX0RTUF9CSU5EX0NIQU5ORUwsICJTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTCJ9LAorCXtPU1NfR0VUVkVSU0lPTiwgIk9TU19HRVRWRVJTSU9OIn0sCisJe1NPVU5EX1BDTV9SRUFEX1JBVEUsICJTT1VORF9QQ01fUkVBRF9SQVRFIn0sCisJe1NPVU5EX1BDTV9SRUFEX0NIQU5ORUxTLCAiU09VTkRfUENNX1JFQURfQ0hBTk5FTFMifSwKKwl7U09VTkRfUENNX1JFQURfQklUUywgIlNPVU5EX1BDTV9SRUFEX0JJVFMifSwKKwl7U09VTkRfUENNX1JFQURfRklMVEVSLCAiU09VTkRfUENNX1JFQURfRklMVEVSIn0KK307CisjZW5kaWYgICAgCisKK3N0YXRpYyBpbnQgaXQ4MTcyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcyA9IChzdHJ1Y3QgaXQ4MTcyX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYXVkaW9fYnVmX2luZm8gYWJpbmZvOworCWNvdW50X2luZm8gY2luZm87CisJaW50IGNvdW50OworCWludCB2YWwsIG1hcHBlZCwgcmV0LCBkaWZmOworCisJbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYy5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCisjaWZkZWYgSVQ4MTcyX1ZFUkJPU0VfREVCVUcKKwlmb3IgKGNvdW50PTA7IGNvdW50PHNpemVvZihpb2N0bF9zdHIpL3NpemVvZihpb2N0bF9zdHJbMF0pOyBjb3VudCsrKSB7CisJCWlmIChpb2N0bF9zdHJbY291bnRdLmNtZCA9PSBjbWQpCisJCQlicmVhazsKKwl9CisJaWYgKGNvdW50IDwgc2l6ZW9mKGlvY3RsX3N0cikvc2l6ZW9mKGlvY3RsX3N0clswXSkpCisJCWRiZygiaW9jdGwgJXMsIGFyZz0weCUwOHgiLAorCQkgICAgaW9jdGxfc3RyW2NvdW50XS5zdHIsICh1bnNpZ25lZCBpbnQpYXJnKTsKKwllbHNlCisJCWRiZygiaW9jdGwgdW5rbm93biwgMHgleCIsIGNtZCk7CisjZW5kaWYKKyAgICAKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gZHJhaW5fZGFjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJcmV0dXJuIDA7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfUkVBTFRJTUUgfAorCQkJCURTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCwgKGludCAqKWFyZyk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQkJcy0+ZG1hX2RhYy5jb3VudCA9IHMtPmRtYV9kYWMudG90YWxfYnl0ZXMgPSAwOworCQkJcy0+ZG1hX2RhYy5uZXh0SW4gPSBzLT5kbWFfZGFjLm5leHRPdXQgPQorCQkJCXMtPmRtYV9kYWMucmF3YnVmOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQkJcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPSAwOworCQkJcy0+ZG1hX2FkYy5uZXh0SW4gPSBzLT5kbWFfYWRjLm5leHRPdXQgPQorCQkJCXMtPmRtYV9hZGMucmF3YnVmOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJc2V0X2FkY19yYXRlKHMsIHZhbCk7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMocyk7CisJCQkJc2V0X2RhY19yYXRlKHMsIHZhbCk7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPworCQkJCXMtPmFkY3JhdGUgOiBzLT5kYWNyYXRlLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCWlmICh2YWwpCisJCQkJcy0+Y2FwY2MgfD0gQ0NfU007CisJCQllbHNlCisJCQkJcy0+Y2FwY2MgJj0gfkNDX1NNOworCQkJb3V0dyhzLT5jYXBjYywgcy0+aW8rSVRfQUNfQ0FQQ0MpOworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCWlmICh2YWwpCisJCQkJcy0+cGNjIHw9IENDX1NNOworCQkJZWxzZQorCQkJCXMtPnBjYyAmPSB+Q0NfU007CisJCQlvdXR3KHMtPnBjYywgcy0+aW8rSVRfQUNfUENDKTsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJaWYgKHZhbCA+PSAyKSB7CisJCQkJCXZhbCA9IDI7CisJCQkJCXMtPmNhcGNjIHw9IENDX1NNOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXMtPmNhcGNjICY9IH5DQ19TTTsKKwkJCQlvdXR3KHMtPmNhcGNjLCBzLT5pbytJVF9BQ19DQVBDQyk7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMocyk7CisJCQkJc3dpdGNoICh2YWwpIHsKKwkJCQljYXNlIDE6CisJCQkJCXMtPnBjYyAmPSB+Q0NfU007CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJcy0+cGNjIHw9IENDX1NNOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQkvLyBGSVghIHN1cHBvcnQgbXVsdGljaGFubmVsPz8/CisJCQkJCXZhbCA9IDI7CisJCQkJCXMtPnBjYyB8PSBDQ19TTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW91dHcocy0+cGNjLCBzLT5pbytJVF9BQ19QQ0MpOworCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrICovCisJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRXxBRk1UX1U4LCAoaW50ICopYXJnKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCXMtPmNhcGNjIHw9IENDX0RGOworCQkJCWVsc2UgeworCQkJCQl2YWwgPSBBRk1UX1U4OworCQkJCQlzLT5jYXBjYyAmPSB+Q0NfREY7CisJCQkJfQorCQkJCW91dHcocy0+Y2FwY2MsIHMtPmlvK0lUX0FDX0NBUENDKTsKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5wY2MgfD0gQ0NfREY7CisJCQkJZWxzZSB7CisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJCXMtPnBjYyAmPSB+Q0NfREY7CisJCQkJfQorCQkJCW91dHcocy0+cGNjLCBzLT5pbytJVF9BQ19QQ0MpOworCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCXZhbCA9IChzLT5jYXBjYyAmIENDX0RGKSA/CisJCQkJCUFGTVRfUzE2X0xFIDogQUZNVF9VODsKKwkJCWVsc2UKKwkJCQl2YWwgPSAocy0+cGNjICYgQ0NfREYpID8KKwkJCQkJQUZNVF9TMTZfTEUgOiBBRk1UX1U4OworCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKilhcmcpOworCQkKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgIXMtPmRtYV9hZGMuc3RvcHBlZCkKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgIXMtPmRtYV9kYWMuc3RvcHBlZCkKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkKKwkJCQlzdGFydF9hZGMocyk7CisJCQllbHNlCisJCQkJc3RvcF9hZGMocyk7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpCisJCQkJc3RhcnRfZGFjKHMpOworCQkJZWxzZQorCQkJCXN0b3BfZGFjKHMpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJaWYgKCFzLT5kbWFfZGFjLnN0b3BwZWQpCisJCQljb3VudCAtPSAocy0+ZG1hX2RhYy5mcmFnc2l6ZSAtCisJCQkJICBpbncocy0+aW8rSVRfQUNfUENETCkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCWFiaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIGNvdW50OworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMubnVtZnJhZzsKKwkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsgICAgICAKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8KKwkJCS1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoIXMtPmRtYV9hZGMuc3RvcHBlZCkKKwkJCWNvdW50ICs9IChzLT5kbWFfYWRjLmZyYWdzaXplIC0KKwkJCQkgIGludyhzLT5pbytJVF9BQ19DQVBDREwpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworCQlhYmluZm8uYnl0ZXMgPSBjb3VudDsKKwkJYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bWZyYWc7CisJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7ICAgICAgCisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/CisJCQktRUZBVUxUIDogMDsKKwkJCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJaWYgKCFzLT5kbWFfZGFjLnN0b3BwZWQpCisJCQljb3VudCAtPSAocy0+ZG1hX2RhYy5mcmFnc2l6ZSAtCisJCQkJICBpbncocy0+aW8rSVRfQUNfUENETCkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCXJldHVybiBwdXRfdXNlcihjb3VudCwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY2luZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmICghcy0+ZG1hX2FkYy5zdG9wcGVkKSB7CisJCQlkaWZmID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZSAtIGludyhzLT5pbytJVF9BQ19DQVBDREwpOworCQkJY291bnQgKz0gZGlmZjsKKwkJCWNpbmZvLmJ5dGVzICs9IGRpZmY7CisJCQljaW5mby5wdHIgPSBpbmwocy0+aW8rcy0+ZG1hX2FkYy5jdXJCdWZQdHIpIC0KKwkJCQlzLT5kbWFfYWRjLmRtYWFkZHI7CisJCX0gZWxzZQorCQkJY2luZm8ucHRyID0gdmlydF90b19idXMocy0+ZG1hX2FkYy5uZXh0SW4pIC0KKwkJCQlzLT5kbWFfYWRjLmRtYWFkZHI7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCWNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlpZiAoIXMtPmRtYV9kYWMuc3RvcHBlZCkgeworCQkJZGlmZiA9IHMtPmRtYV9kYWMuZnJhZ3NpemUgLSBpbncocy0+aW8rSVRfQUNfQ0FQQ0RMKTsKKwkJCWNvdW50IC09IGRpZmY7CisJCQljaW5mby5ieXRlcyArPSBkaWZmOworCQkJY2luZm8ucHRyID0gaW5sKHMtPmlvK3MtPmRtYV9kYWMuY3VyQnVmUHRyKSAtCisJCQkJcy0+ZG1hX2RhYy5kbWFhZGRyOworCQl9IGVsc2UKKwkJCWNpbmZvLnB0ciA9IHZpcnRfdG9fYnVzKHMtPmRtYV9kYWMubmV4dE91dCkgLQorCQkJCXMtPmRtYV9kYWMuZG1hYWRkcjsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQkJcy0+ZG1hX2RhYy5jb3VudCAmPSBzLT5kbWFfZGFjLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2RhYy5mcmFnc2hpZnQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMuZnJhZ3NpemUsIChpbnQgKilhcmcpOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSA0OworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSA0OworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbikgfHwKKwkJICAgIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5kbWFfZGFjLnN1YmRpdmlzaW9uKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMocyk7CisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gdmFsOworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPworCQkJCXMtPmFkY3JhdGUgOiBzLT5kYWNyYXRlLCAoaW50ICopYXJnKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcmV0dXJuIHB1dF91c2VyKChzLT5jYXBjYyAmIENDX1NNKSA/IDIgOiAxLAorCQkJCQkoaW50ICopYXJnKTsKKwkJZWxzZQorCQkJcmV0dXJuIHB1dF91c2VyKChzLT5wY2MgJiBDQ19TTSkgPyAyIDogMSwKKwkJCQkJKGludCAqKWFyZyk7CisJICAgIAorCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlyZXR1cm4gcHV0X3VzZXIoKHMtPmNhcGNjICYgQ0NfREYpID8gMTYgOiA4LAorCQkJCQkoaW50ICopYXJnKTsKKwkJZWxzZQorCQkJcmV0dXJuIHB1dF91c2VyKChzLT5wY2MgJiBDQ19ERikgPyAxNiA6IDgsCisJCQkJCShpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBtaXhkZXZfaW9jdGwoJnMtPmNvZGVjLCBjbWQsIGFyZyk7Cit9CisKKworc3RhdGljIGludCBpdDgxNzJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzOworCWludCByZXQ7CisgICAgCisjaWZkZWYgSVQ4MTcyX1ZFUkJPU0VfREVCVUcKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCWRiZygiJXM6IG5vbi1ibG9ja2luZyIsIF9fRlVOQ1RJT05fXyk7CisJZWxzZQorCQlkYmcoIiVzOiBibG9ja2luZyIsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKKwkKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGl0ODE3Ml9zdGF0ZSwgZGV2cyk7CisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgZmlsZS0+Zl9tb2RlKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPSAwOworCQlzLT5jYXBjYyAmPSB+KENDX1NNIHwgQ0NfREYpOworCQlzZXRfYWRjX3JhdGUocywgODAwMCk7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlzLT5jYXBjYyB8PSBDQ19ERjsKKwkJb3V0dyhzLT5jYXBjYywgcy0+aW8rSVRfQUNfQ0FQQ0MpOworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9CisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9IDA7CisJCXMtPnBjYyAmPSB+KENDX1NNIHwgQ0NfREYpOworCQlzZXRfZGFjX3JhdGUocywgODAwMCk7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlzLT5wY2MgfD0gQ0NfREY7CisJCW91dHcocy0+cGNjLCBzLT5pbytJVF9BQ19QQ0MpOworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisgICAgCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJcy0+b3Blbl9tb2RlIHw9IChmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgaXQ4MTcyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcyA9IChzdHJ1Y3QgaXQ4MTcyX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisjaWZkZWYgSVQ4MTcyX1ZFUkJPU0VfREVCVUcKKwlkYmcoX19GVU5DVElPTl9fKTsKKyNlbmRpZgorCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RvcF9kYWMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RvcF9hZGMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKKwl9CisJcy0+b3Blbl9tb2RlICY9ICgofmZpbGUtPmZfbW9kZSkgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpdDgxNzJfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gaXQ4MTcyX3JlYWQsCisJLndyaXRlCQk9IGl0ODE3Ml93cml0ZSwKKwkucG9sbAkJPSBpdDgxNzJfcG9sbCwKKwkuaW9jdGwJCT0gaXQ4MTcyX2lvY3RsLAorCS5tbWFwCQk9IGl0ODE3Ml9tbWFwLAorCS5vcGVuCQk9IGl0ODE3Ml9vcGVuLAorCS5yZWxlYXNlCT0gaXQ4MTcyX3JlbGVhc2UsCit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UnbGwgY3JlYXRlIGEgcHJvYyBkZXZpY2UgdGhhdCBkdW1wcyB0aGUKKyAqIENPREVDIGNoaXBzdGF0ZQorICovCisKKyNpZmRlZiBJVDgxNzJfREVCVUcKK3N0YXRpYyBpbnQgcHJvY19pdDgxNzJfZHVtcCAoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsCisJCQkgICAgIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpdDgxNzJfc3RhdGUgKnM7CisJaW50IGNudCwgbGVuID0gMDsKKworCWlmIChsaXN0X2VtcHR5KCZkZXZzKSkKKwkJcmV0dXJuIDA7CisJcyA9IGxpc3RfZW50cnkoZGV2cy5uZXh0LCBzdHJ1Y3QgaXQ4MTcyX3N0YXRlLCBkZXZzKTsKKworCS8qIHByaW50IG91dCBoZWFkZXIgKi8KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcblx0XHRJVDgxNzIgQXVkaW8gRGVidWdcblxuIik7CisKKwkvLyBwcmludCBvdXQgZGlnaXRhbCBjb250cm9sbGVyIHN0YXRlCisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgIklUODE3MiBBdWRpbyBDb250cm9sbGVyIHJlZ2lzdGVyc1xuIik7CisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJY250PTA7CisJd2hpbGUgKGNudCA8IDB4NzIpIHsKKwkJaWYgKGNudCA9PSBJVF9BQ19QQ0IxU1RBIHx8IGNudCA9PSBJVF9BQ19QQ0IyU1RBIHx8CisJCSAgICBjbnQgPT0gSVRfQUNfQ0FQQjFTVEEgfHwgY250ID09IElUX0FDX0NBUEIyU1RBIHx8CisJCSAgICBjbnQgPT0gSVRfQUNfUEZEUCkgeworCQkJbGVuKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAicmVnICUwMnggPSAlMDh4XG4iLAorCQkJCSAgICAgICBjbnQsIGlubChzLT5pbytjbnQpKTsKKwkJCWNudCArPSA0OworCQl9IGVsc2UgeworCQkJbGVuKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAicmVnICUwMnggPSAlMDR4XG4iLAorCQkJCSAgICAgICBjbnQsIGludyhzLT5pbytjbnQpKTsKKwkJCWNudCArPSAyOworCQl9CisJfQorICAgIAorCS8qIHByaW50IG91dCBDT0RFQyBzdGF0ZSAqLworCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJcbkFDOTcgQ09ERUMgcmVnaXN0ZXJzXG4iKTsKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yIChjbnQ9MDsgY250IDw9IDB4N2U7IGNudCA9IGNudCArMikKKwkJbGVuKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAicmVnICUwMnggPSAlMDR4XG4iLAorCQkJICAgICAgIGNudCwgcmRjb2RlYygmcy0+Y29kZWMsIGNudCkpOworCisJaWYgKGZwb3MgPj1sZW4peworCQkqc3RhcnQgPSBidWY7CisJCSplb2YgPTE7CisJCXJldHVybiAwOworCX0KKwkqc3RhcnQgPSBidWYgKyBmcG9zOworCWlmICgobGVuIC09IGZwb3MpID4gbGVuZ3RoKQorCQlyZXR1cm4gbGVuZ3RoOworCSplb2YgPTE7CisJcmV0dXJuIGxlbjsKKworfQorI2VuZGlmIC8qIElUODE3Ml9ERUJVRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbWF4aW11bSBudW1iZXIgb2YgZGV2aWNlczsgb25seSB1c2VkIGZvciBjb21tYW5kIGxpbmUgcGFyYW1zICovCisjZGVmaW5lIE5SX0RFVklDRSA1CisKK3N0YXRpYyBpbnQgc3BkaWZbTlJfREVWSUNFXTsKK3N0YXRpYyBpbnQgaTJzX2ZtdFtOUl9ERVZJQ0VdOworCitzdGF0aWMgdW5zaWduZWQgaW50IGRldmluZGV4OworCitNT0RVTEVfUEFSTShzcGRpZiwgIjEtIiBfX01PRFVMRV9TVFJJTkcoTlJfREVWSUNFKSAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhzcGRpZiwgImlmIDEgdGhlIFMvUERJRiBkaWdpdGFsIG91dHB1dCBpcyBlbmFibGVkIik7CitNT0RVTEVfUEFSTShpMnNfZm10LCAiMS0iIF9fTU9EVUxFX1NUUklORyhOUl9ERVZJQ0UpICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGkyc19mbXQsICJ0aGUgZm9ybWF0IG9mIEkyUyIpOworCitNT0RVTEVfQVVUSE9SKCJNb250YSBWaXN0YSBTb2Z0d2FyZSwgc3RldmVsQG12aXN0YS5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVQ4MTcyIEF1ZGlvIERyaXZlciIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBfX2RldmluaXQgaXQ4MTcyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqczsKKwlpbnQgaSwgdmFsOworCXVuc2lnbmVkIHNob3J0IHBjaXNyLCB2b2w7CisJdW5zaWduZWQgY2hhciBsZWdhY3ksIGltYzsKKwljaGFyIHByb2Nfc3RyWzgwXTsKKyAgICAKKwlpZiAocGNpZGV2LT5pcnEgPT0gMCkgCisJCXJldHVybiAtMTsKKworCWlmICghKHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXQ4MTcyX3N0YXRlKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVycigiYWxsb2Mgb2YgZGV2aWNlIHN0cnVjdCBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBpdDgxNzJfc3RhdGUpKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfYWRjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKKwlpbml0X01VVEVYKCZzLT5vcGVuX3NlbSk7CisJc3Bpbl9sb2NrX2luaXQoJnMtPmxvY2spOworCXMtPmRldiA9IHBjaWRldjsKKwlzLT5pbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOworCXMtPmlycSA9IHBjaWRldi0+aXJxOworCXMtPnZlbmRvciA9IHBjaWRldi0+dmVuZG9yOworCXMtPmRldmljZSA9IHBjaWRldi0+ZGV2aWNlOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwgUENJX1JFVklTSU9OX0lELCAmcy0+cmV2KTsKKwlzLT5jb2RlYy5wcml2YXRlX2RhdGEgPSBzOworCXMtPmNvZGVjLmlkID0gMDsKKwlzLT5jb2RlYy5jb2RlY19yZWFkID0gcmRjb2RlYzsKKwlzLT5jb2RlYy5jb2RlY193cml0ZSA9IHdyY29kZWM7CisJcy0+Y29kZWMuY29kZWNfd2FpdCA9IHdhaXRjb2RlYzsKKworCWlmICghcmVxdWVzdF9yZWdpb24ocy0+aW8sIHBjaV9yZXNvdXJjZV9sZW4ocGNpZGV2LDApLAorCQkJICAgIElUODE3Ml9NT0RVTEVfTkFNRSkpIHsKKwkJZXJyKCJpbyBwb3J0cyAlI2x4LT4lI2x4IGluIHVzZSIsCisJCSAgICBzLT5pbywgcy0+aW8gKyBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwwKS0xKTsKKwkJZ290byBlcnJfcmVnaW9uOworCX0KKwlpZiAocmVxdWVzdF9pcnEocy0+aXJxLCBpdDgxNzJfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJCQlJVDgxNzJfTU9EVUxFX05BTUUsIHMpKSB7CisJCWVycigiaXJxICV1IGluIHVzZSIsIHMtPmlycSk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwlpbmZvKCJJTyBhdCAlI2x4LCBJUlEgJWQiLCBzLT5pbywgcy0+aXJxKTsKKworCS8qIHJlZ2lzdGVyIGRldmljZXMgKi8KKwlpZiAoKHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmaXQ4MTcyX2F1ZGlvX2ZvcHMsIC0xKSkgPCAwKQorCQlnb3RvIGVycl9kZXYxOworCWlmICgocy0+Y29kZWMuZGV2X21peGVyID0KKwkgICAgIHJlZ2lzdGVyX3NvdW5kX21peGVyKCZpdDgxNzJfbWl4ZXJfZm9wcywgLTEpKSA8IDApCisJCWdvdG8gZXJyX2RldjI7CisKKyNpZmRlZiBJVDgxNzJfREVCVUcKKwkvKiBpbml0aWFsaXplIHRoZSBkZWJ1ZyBwcm9jIGRldmljZSAqLworCXMtPnBzID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShJVDgxNzJfTU9EVUxFX05BTUUsIDAsIE5VTEwsCisJCQkJICAgICAgIHByb2NfaXQ4MTcyX2R1bXAsIE5VTEwpOworI2VuZGlmIC8qIElUODE3Ml9ERUJVRyAqLworCQorCS8qCisJICogUmVzZXQgdGhlIEF1ZGlvIGRldmljZSB1c2luZyB0aGUgSVQ4MTcyIFBDSSBSZXNldCByZWdpc3Rlci4gVGhpcworCSAqIGNyZWF0ZXMgYW4gYXVkaWJsZSBkb3VibGUgY2xpY2sgb24gYSBzcGVha2VyIGNvbm5lY3RlZCB0byBMaW5lLW91dC4KKwkgKi8KKwlJVF9JT19SRUFEMTYoSVRfUE1fUENJU1IsIHBjaXNyKTsKKwlwY2lzciB8PSBJVF9QTV9QQ0lTUl9BQ1NSOworCUlUX0lPX1dSSVRFMTYoSVRfUE1fUENJU1IsIHBjaXNyKTsKKwkvKiB3YWl0IHVwIHRvIDEwMG1zZWMgZm9yIHJlc2V0IHRvIGNvbXBsZXRlICovCisJZm9yIChpPTA7IHBjaXNyICYgSVRfUE1fUENJU1JfQUNTUjsgaSsrKSB7CisJCWl0ODE3Ml9kZWxheSgxMCk7CisJCWlmIChpID09IDEwKQorCQkJYnJlYWs7CisJCUlUX0lPX1JFQUQxNihJVF9QTV9QQ0lTUiwgcGNpc3IpOworCX0KKwlpZiAoaSA9PSAxMCkgeworCQllcnIoImNoaXAgcmVzZXQgdGltZW91dCEiKTsKKwkJZ290byBlcnJfZGV2MzsKKwl9CisgICAgCisJLyogZW5hYmxlIHBjaSBpbyBhbmQgYnVzIG1hc3RlcmluZyAqLworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKQorCQlnb3RvIGVycl9kZXYzOworCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CisKKwkvKiBnZXQgb3V0IG9mIGxlZ2FjeSBtb2RlICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUgKHBjaWRldiwgMHg0MCwgJmxlZ2FjeSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChwY2lkZXYsIDB4NDAsIGxlZ2FjeSAmIH4xKTsKKyAgICAKKwlzLT5zcGRpZl92b2x1bWUgPSAtMTsKKwkvKiBjaGVjayB0byBzZWUgaWYgcy9wZGlmIG1vZGUgaXMgYmVpbmcgcmVxdWVzdGVkICovCisJaWYgKHNwZGlmW2RldmluZGV4XSkgeworCQlpbmZvKCJlbmFibGluZyBTL1BESUYgb3V0cHV0Iik7CisJCXMtPnNwZGlmX3ZvbHVtZSA9IDA7CisJCW91dGIoR0NfU09FLCBzLT5pbytJVF9BQ19HQyk7CisJfSBlbHNlIHsKKwkJaW5mbygiZGlzYWJsaW5nIFMvUERJRiBvdXRwdXQiKTsKKwkJb3V0YigwLCBzLT5pbytJVF9BQ19HQyk7CisJfQorICAgIAorCS8qIGNoZWNrIHRvIHNlZSBpZiBJMlMgZm9ybWF0IHJlcXVlc3RlZCAqLworCWlmIChpMnNfZm10W2RldmluZGV4XSkgeworCQlpbmZvKCJzZXR0aW5nIEkyUyBmb3JtYXQgdG8gMHglMDJ4IiwgaTJzX2ZtdFtkZXZpbmRleF0pOworCQlvdXRiKGkyc19mbXRbZGV2aW5kZXhdLCBzLT5pbytJVF9BQ19JMlNNQyk7CisJfSBlbHNlIHsKKwkJb3V0YihJMlNNQ19JMlNGX0kyUywgcy0+aW8rSVRfQUNfSTJTTUMpOworCX0KKworCS8qIGNvbGQgcmVzZXQgdGhlIEFDOTcgKi8KKwlvdXR3KENPREVDQ19DUiwgcy0+aW8rSVRfQUNfQ09ERUNDKTsKKwl1ZGVsYXkoMTAwMCk7CisJb3V0dygwLCBzLT5pbytJVF9BQ19DT0RFQ0MpOworCS8qIG5lZWQgdG8gZGVsYXkgYXJvdW5kIDUwMG1zZWMoYmxlZWNoKSB0byBnaXZlCisJICAgc29tZSBDT0RFQ3MgZW5vdWdoIHRpbWUgdG8gd2FrZXVwICovCisJaXQ4MTcyX2RlbGF5KDUwMCk7CisgICAgCisJLyogQUM5NyB3YXJtIHJlc2V0IHRvIHN0YXJ0IHRoZSBiaXRjbGsgKi8KKwlvdXR3KENPREVDQ19XUiwgcy0+aW8rSVRfQUNfQ09ERUNDKTsKKwl1ZGVsYXkoMTAwMCk7CisJb3V0dygwLCBzLT5pbytJVF9BQ19DT0RFQ0MpOworICAgIAorCS8qIGNvZGVjIGluaXQgKi8KKwlpZiAoIWFjOTdfcHJvYmVfY29kZWMoJnMtPmNvZGVjKSkKKwkJZ290byBlcnJfZGV2MzsKKworCS8qIGFkZCBJMlMgYXMgYWxsb3dhYmxlIHJlY29yZGluZyBzb3VyY2UgKi8KKwlzLT5jb2RlYy5yZWNvcmRfc291cmNlcyB8PSBTT1VORF9NQVNLX0kyUzsKKwkKKwkvKiBFbmFibGUgVm9sdW1lIGJ1dHRvbiBpbnRlcnJ1cHRzICovCisJaW1jID0gaW5iKHMtPmlvK0lUX0FDX0lNQyk7CisJb3V0YihpbWMgJiB+SU1DX1ZDSU0sIHMtPmlvK0lUX0FDX0lNQyk7CisKKwkvKiBVbi1tdXRlIFBDTSBhbmQgRk0gb3V0IG9uIHRoZSBjb250cm9sbGVyICovCisJdm9sID0gaW53KHMtPmlvK0lUX0FDX1BDTU9WKTsKKwlvdXR3KHZvbCAmIH5QQ01PVl9QQ01PTSwgcy0+aW8rSVRfQUNfUENNT1YpOworCXZvbCA9IGludyhzLT5pbytJVF9BQ19GTU9WKTsKKwlvdXR3KHZvbCAmIH5GTU9WX0ZNT00sIHMtPmlvK0lUX0FDX0ZNT1YpOworICAgIAorCS8qIHNldCBjaGFubmVsIGRlZmF1bHRzIHRvIDgtYml0LCBtb25vLCA4IEtoeiAqLworCXMtPnBjYyA9IDA7CisJcy0+Y2FwY2MgPSAwOworCXNldF9kYWNfcmF0ZShzLCA4MDAwKTsKKwlzZXRfYWRjX3JhdGUocywgODAwMCk7CisKKwkvKiBzZXQgbWljIHRvIGJlIHRoZSByZWNvcmRpbmcgc291cmNlICovCisJdmFsID0gU09VTkRfTUFTS19NSUM7CisJbWl4ZGV2X2lvY3RsKCZzLT5jb2RlYywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLAorCQkgICAgICh1bnNpZ25lZCBsb25nKSZ2YWwpOworCisJLyogbXV0ZSBBQyc5NyBtYXN0ZXIgYW5kIFBDTSB3aGVuIGluIFMvUERJRiBtb2RlICovCisJaWYgKHMtPnNwZGlmX3ZvbHVtZSAhPSAtMSkgeworCQl2YWwgPSAweDAwMDA7CisJCXMtPmNvZGVjLm1peGVyX2lvY3RsKCZzLT5jb2RlYywgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJCXMtPmNvZGVjLm1peGVyX2lvY3RsKCZzLT5jb2RlYywgU09VTkRfTUlYRVJfV1JJVEVfUENNLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJfQorICAgIAorI2lmZGVmIElUODE3Ml9ERUJVRworCXNwcmludGYocHJvY19zdHIsICJkcml2ZXIvJXMvJWQvYWM5NyIsIElUODE3Ml9NT0RVTEVfTkFNRSwKKwkJcy0+Y29kZWMuaWQpOworCXMtPmFjOTdfcHMgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IChwcm9jX3N0ciwgMCwgTlVMTCwKKwkJCQkJICAgICBhYzk3X3JlYWRfcHJvYywgJnMtPmNvZGVjKTsKKyNlbmRpZgorICAgIAorCS8qIHN0b3JlIGl0IGluIHRoZSBkcml2ZXIgZmllbGQgKi8KKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBzKTsKKwlwY2lkZXYtPmRtYV9tYXNrID0gMHhmZmZmZmZmZjsKKwkvKiBwdXQgaXQgaW50byBkcml2ZXIgbGlzdCAqLworCWxpc3RfYWRkX3RhaWwoJnMtPmRldnMsICZkZXZzKTsKKwkvKiBpbmNyZW1lbnQgZGV2aW5kZXggKi8KKwlpZiAoZGV2aW5kZXggPCBOUl9ERVZJQ0UtMSkKKwkJZGV2aW5kZXgrKzsKKwlyZXR1cm4gMDsKKworIGVycl9kZXYzOgorCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+Y29kZWMuZGV2X21peGVyKTsKKyBlcnJfZGV2MjoKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworIGVycl9kZXYxOgorCWVycigiY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlIik7CisJZnJlZV9pcnEocy0+aXJxLCBzKTsKKyBlcnJfaXJxOgorCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwwKSk7CisgZXJyX3JlZ2lvbjoKKwlrZnJlZShzKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpdDgxNzJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFzKQorCQlyZXR1cm47CisJbGlzdF9kZWwoJnMtPmRldnMpOworI2lmZGVmIElUODE3Ml9ERUJVRworCWlmIChzLT5wcykKKwkJcmVtb3ZlX3Byb2NfZW50cnkoSVQ4MTcyX01PRFVMRV9OQU1FLCBOVUxMKTsKKyNlbmRpZiAvKiBJVDgxNzJfREVCVUcgKi8KKwlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBwY2lfcmVzb3VyY2VfbGVuKGRldiwwKSk7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLmRldl9taXhlcik7CisJa2ZyZWUocyk7CisJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Cit9CisKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfSVRFLCBQQ0lfREVWSUNFX0lEX0lURV9JVDgxNzJHX0FVRElPLCBQQ0lfQU5ZX0lELAorCSAgUENJX0FOWV9JRCwgMCwgMCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGl0ODE3Ml9kcml2ZXIgPSB7CisJLm5hbWUgPSBJVDgxNzJfTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlID0gaWRfdGFibGUsCisJLnByb2JlID0gaXQ4MTcyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpdDgxNzJfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9pdDgxNzIodm9pZCkKK3sKKwlpbmZvKCJ2ZXJzaW9uIHYwLjUgdGltZSAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyk7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmaXQ4MTcyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2l0ODE3Mih2b2lkKQoreworCWluZm8oInVubG9hZGluZyIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXQ4MTcyX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaXQ4MTcyKTsKK21vZHVsZV9leGl0KGNsZWFudXBfaXQ4MTcyKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTU9EVUxFCisKKy8qIGZvcm1hdCBpczogaXQ4MTcyPVtzcGRpZl0sW2kyczo8STJTIGZvcm1hdD5dICovCisKK3N0YXRpYyBpbnQgX19pbml0IGl0ODE3Ml9zZXR1cChjaGFyICpvcHRpb25zKQoreworCWNoYXIqIHRoaXNfb3B0OworCXN0YXRpYyB1bnNpZ25lZCBfX2luaXRkYXRhIG5yX2RldiA9IDA7CisKKwlpZiAobnJfZGV2ID49IE5SX0RFVklDRSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgeworCQlpZiAoISp0aGlzX29wdCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJzcGRpZiIsIDUpKSB7CisJCQlzcGRpZltucl9kZXZdID0gMTsKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImkyczoiLCA0KSkgeworCQkJaWYgKCFzdHJuY21wKHRoaXNfb3B0KzQsICJkYWMiLCAzKSkKKwkJCQlpMnNfZm10W25yX2Rldl0gPSBJMlNNQ19JMlNGX0RBQzsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0KzQsICJhZGMiLCAzKSkKKwkJCQlpMnNfZm10W25yX2Rldl0gPSBJMlNNQ19JMlNGX0FEQzsKKwkJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0KzQsICJpMnMiLCAzKSkKKwkJCQlpMnNfZm10W25yX2Rldl0gPSBJMlNNQ19JMlNGX0kyUzsKKwkJfQorCX0KKworCW5yX2RldisrOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJpdDgxNzI9IiwgaXQ4MTcyX3NldHVwKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2l3bWVtLmggYi9zb3VuZC9vc3MvaXdtZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDc0NWZiYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9pd21lbS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBzb3VuZC9pd21lbS5oCisgKgorICogRFJBTSBzaXplIGVuY29kaW5nIHRhYmxlIGZvciBBTUQgSW50ZXJ3YXZlIGNoaXAuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBDaGFuZ2VzOgorICogQmFydGxvbWllaiBab2xuaWVya2lld2ljegk6IGFkZGVkIF9faW5pdGRhdGEgdG8gbWVtX2RlY29kZQorICovCisKKworI2RlZmluZSBLIDEwMjQKKyNkZWZpbmUgTSAoMTAyNCpLKQorc3RhdGljIGludCBtZW1fZGVjb2RlW11bNF0gX19pbml0ZGF0YSA9Cit7CisvKglCYW5rMAlCYW5rMQlCYW5rMglCYW5rMwlFbmNvZGluZyBiaXRzCSovCisJezI1NipLLAkwLAkwLAkwfSwJCS8qICAwICovCisJezI1NipLLAkyNTYqSywJMCwJMH0sCQkvKiAgMSAqLworCXsyNTYqSywJMjU2KkssCTI1NipLLAkyNTYqS30sCQkvKiAgMiAqLworCXsyNTYqSywJMSpNLAkwLAkwfSwJCS8qICAzICovCisJezI1NipLLAkxKk0sCTEqTSwJMSpNfSwJCS8qICA0ICovCisJezI1NipLLAkyNTYqSywJMSpNLAkwfSwJCS8qICA1ICovCisJezI1NipLLAkyNTYqSywJMSpNLAkxKk19LAkJLyogIDYgKi8KKwl7MSpNLAkwLAkwLAkwfSwJCS8qICA3ICovCisJezEqTSwJMSpNLAkwLAkwfSwJCS8qICA4ICovCisJezEqTSwJMSpNLAkxKk0sCTEqTX0sCQkvKiAgOSAqLworCXs0Kk0sCTAsCTAsCTB9LAkJLyogMTAgKi8KKwl7NCpNLAk0Kk0sCTAsCTB9LAkJLyogMTEgKi8KKwl7NCpNLAk0Kk0sCTQqTSwJNCpNfQkJLyogMTIgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mva2FobHVhLmMgYi9zb3VuZC9vc3Mva2FobHVhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4YzVlZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9rYWhsdWEuYwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqCUluaXRpYWxpc2F0aW9uIGNvZGUgZm9yIEN5cml4L05hdFNlbWkgVlNBMSBzb2Z0YXVkaW8KKyAqCisgKgkoQykgQ29weXJpZ2h0IDIwMDMgUmVkIEhhdCBJbmMgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBYcHJlc3NBdWRpbyh0bSkgaXMgdXNlZCBvbiB0aGUgQ3lyaXggTWVkaWFHWCAobm93IE5hdFNlbWkgR2VvZGUpIHN5c3RlbXMuCisgKiBUaGUgb2xkZXIgdmVyc2lvbiAoVlNBMSkgcHJvdmlkZXMgZmFpcmx5IGdvb2Qgc291bmRibGFzdGVyIGVtdWxhdGlvbgorICogYWx0aG91Z2ggdGhlcmUgYXJlIGEgY291cGxlIG9mIGJ1Z3M6IGxhcmdlIERNQSBidWZmZXJzIGJyZWFrIHJlY29yZCwKKyAqIGFuZCB0aGUgTVBVIGV2ZW50IGhhbmRsaW5nIHNlZW1zIHN1c3BlY3QuIFZTQTIgYWxsb3dzIHRoZSBuYXRpdmUgZHJpdmVyCisgKiB0byBjb250cm9sIHRoZSBBQzk3IGF1ZGlvIGVuZ2luZSBkaXJlY3RseSBhbmQgcmVxdWlyZXMgYSBkaWZmZXJlbnQgZHJpdmVyLgorICoKKyAqIFRoYW5rcyB0byBOYXRpb25hbCBTZW1pY29uZHVjdG9yIGZvciBwcm92aWRpbmcgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbgorICogb24gdGhlIFhwcmVzc0F1ZGlvKHRtKSBpbnRlcm5hbHMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRPIERPOgorICoJSW52ZXN0aWdhdGUgd2hldGhlciB3ZSBjYW4gcG9ydGFibHkgc3VwcG9ydCBDb2duYWMgKDU1MjApIGluIHRoZQorICoJc2FtZSBtYW5uZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJzYi5oIgorCisvKgorICoJUmVhZCBhIHNvdW5kYmxhc3RlciBjb21wYXRpYmxlIG1peGVyIHJlZ2lzdGVyLgorICoJSW4gdGhpcyBjYXNlIHdlIGFyZSBhY3R1YWxseSByZWFkaW5nIGFuIFNNSSB0cmFwCisgKglub3QgcmVhbCBoYXJkd2FyZS4KKyAqLworCitzdGF0aWMgdTggX19kZXZpbml0IG1peGVyX3JlYWQodW5zaWduZWQgbG9uZyBpbywgdTggcmVnKQoreworCW91dGIocmVnLCBpbyArIDQpOworCXVkZWxheSgyMCk7CisJcmVnID0gaW5iKGlvICsgNSk7CisJdWRlbGF5KDIwKTsKKwlyZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1lbTsKKwl1bnNpZ25lZCBsb25nIGlvOworCXUxNiBtYXA7CisJdTggaXJxLCBkbWE4LCBkbWExNjsKKwlpbnQgb2xkcXVpZXQ7CisJZXh0ZXJuIGludCBzYl9iZV9xdWlldDsKKwkJCisJYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpZihiYXNlID09IDBVTCkKKwkJcmV0dXJuIDE7CisJCisJbWVtID0gaW9yZW1hcChiYXNlLCAxMjgpOworCWlmKG1lbSA9PSAwVUwpCisJCXJldHVybiAxOworCW1hcCA9IHJlYWR3KG1lbSArIDB4MTgpOwkvKiBSZWFkIHRoZSBTTUkgZW5hYmxlcyAqLworCWlvdW5tYXAobWVtKTsKKwkKKwkvKiBNYXAgYml0cworCQkwOjEJKiAweDIwICsgMHgyMDAgPSBzYiBiYXNlCisJCTIJc2IgZW5hYmxlCisJCTMJYWRsaWIgZW5hYmxlCisJCTUJTVBVIGVuYWJsZSAweDMzMAorCQk2CU1QVSBlbmFibGUgMHgzMDAKKwkJCisJICAgVGhlIG90aGVyIGJpdHMgbWF5IGJlIHVzZWQgaW50ZXJuYWxseSBzbyBtdXN0IGJlIG1hc2tlZCAqLworCisJaW8gPSAweDIyMCArIDB4MjAgKiAobWFwICYgMyk7CSAgIAorCQorCWlmKG1hcCAmICgxPDwyKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAia2FobHVhOiBYcHJlc3NBdWRpbyBhdCAweCVseFxuIiwgaW8pOworCWVsc2UKKwkJcmV0dXJuIDE7CisJCQorCWlmKG1hcCAmICgxPDw1KSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAia2FobHVhOiBNUFUgYXQgMHgzMDBcbiIpOworCWVsc2UgaWYobWFwICYgKDE8PDYpKQorCQlwcmludGsoS0VSTl9JTkZPICJrYWhsdWE6IE1QVSBhdCAweDMzMFxuIik7CisJCisJaXJxID0gbWl4ZXJfcmVhZChpbywgMHg4MCkgJiAweDBGOworCWRtYTggPSBtaXhlcl9yZWFkKGlvLCAweDgxKTsKKworCS8vIHByaW50aygiSVJRPSV4IE1BUD0leCBETUE9JXhcbiIsIGlycSwgbWFwLCBkbWE4KTsKKwkKKwlpZihkbWE4ICYgMHgyMCkKKwkJZG1hMTYgPSA1OworCWVsc2UgaWYoZG1hOCAmIDB4NDApCisJCWRtYTE2ID0gNjsKKwllbHNlIGlmKGRtYTggJiAweDgwKQorCQlkbWExNiA9IDc7CisJZWxzZQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJrYWhsdWE6IE5vIDE2Yml0IERNQSBlbmFibGVkLlxuIik7CisJCXJldHVybiAxOworCX0KKwkJCisJaWYoZG1hOCAmIDB4MDEpCisJCWRtYTggPSAwOworCWVsc2UgaWYoZG1hOCAmIDB4MDIpCisJCWRtYTggPSAxOworCWVsc2UgaWYoZG1hOCAmIDB4MDgpCisJCWRtYTggPSAzOworCWVsc2UKKwl7CisJCXByaW50ayhLRVJOX0VSUiAia2FobHVhOiBObyA4Yml0IERNQSBlbmFibGVkLlxuIik7CisJCXJldHVybiAxOworCX0KKwkKKwlpZihpcnEgJiAxKQorCQlpcnEgPSA5OworCWVsc2UgaWYoaXJxICYgMikKKwkJaXJxID0gNTsKKwllbHNlIGlmKGlycSAmIDQpCisJCWlycSA9IDc7CisJZWxzZSBpZihpcnEgJiA4KQorCQlpcnEgPSAxMDsKKwllbHNlCisJeworCQlwcmludGsoS0VSTl9FUlIgImthaGx1YTogU0IgSVJRIG5vdCBzZXQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCXByaW50ayhLRVJOX0lORk8gImthaGx1YTogWHByZXNzQXVkaW8gb24gSVJRICVkLCBETUEgJWQsICVkXG4iLAorCQlpcnEsIGRtYTgsIGRtYTE2KTsKKwkKKwlod19jb25maWcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkcmVzc19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYoaHdfY29uZmlnID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9FUlIgImthaGx1YTogb3V0IG9mIG1lbW9yeS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJbWVtc2V0KGh3X2NvbmZpZywgMCwgc2l6ZW9mKCpod19jb25maWcpKTsKKwkKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaHdfY29uZmlnKTsKKwkKKwlod19jb25maWctPmlvX2Jhc2UgPSBpbzsKKwlod19jb25maWctPmlycSA9IGlycTsKKwlod19jb25maWctPmRtYSA9IGRtYTg7CisJaHdfY29uZmlnLT5kbWEyID0gZG1hMTY7CisJaHdfY29uZmlnLT5uYW1lID0gIkN5cml4IFhwcmVzc0F1ZGlvIjsKKwlod19jb25maWctPmRyaXZlcl91c2VfMSA9IFNCX05PX01JREkgfCBTQl9QQ0lfSVJROworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgMTYsICJzb3VuZGJsYXN0ZXIiKSkKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJCisJaWYoc2JfZHNwX2RldGVjdChod19jb25maWcsIDAsIDAsIE5VTEwpPT0wKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJrYWhsdWE6IGF1ZGlvIG5vdCByZXNwb25kaW5nLlxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGlvLCAxNik7CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKworCW9sZHF1aWV0ID0gc2JfYmVfcXVpZXQ7CQorCXNiX2JlX3F1aWV0ID0gMTsKKwlpZihzYl9kc3BfaW5pdChod19jb25maWcsIFRISVNfTU9EVUxFKSkKKwl7CisJCXNiX2JlX3F1aWV0ID0gb2xkcXVpZXQ7CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKwlzYl9iZV9xdWlldCA9IG9sZHF1aWV0OworCQorCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWU6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKGh3X2NvbmZpZyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCByZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzYl9kc3BfdW5sb2FkKGh3X2NvbmZpZywgMCk7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKGh3X2NvbmZpZyk7Cit9CisKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkthaGx1YSBWU0ExIFBDSSBBdWRpbyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICoJNTUzMCBvbmx5LiBUaGUgNTUxMC81NTIwIGRlY29kZSBpcyBkaWZmZXJlbnQuCisgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlkX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX0FVRElPLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWRfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGthaGx1YV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImthaGx1YSIsCisJLmlkX3RhYmxlCT0gaWRfdGJsLAorCS5wcm9iZQkJPSBwcm9iZV9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChyZW1vdmVfb25lKSwKK307CisKKworc3RhdGljIGludCBfX2luaXQga2FobHVhX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ3lyaXggS2FobHVhIFZTQTEgWHByZXNzQXVkaW8gc3VwcG9ydCAoYykgQ29weXJpZ2h0IDIwMDMgUmVkIEhhdCBJbmNcbiIpOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmthaGx1YV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQga2FobHVhX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZrYWhsdWFfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChrYWhsdWFfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoa2FobHVhX2NsZWFudXBfbW9kdWxlKTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21hZDE2LmMgYi9zb3VuZC9vc3MvbWFkMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzA2N2YxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL21hZDE2LmMKQEAgLTAsMCArMSwxMDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIG1hZDE2LmMKKyAqCisgKiBJbml0aWFsaXphdGlvbiBjb2RlIGZvciBPUFRpIE1BRDE2IGNvbXBhdGlibGUgYXVkaW8gY2hpcHMuIEluY2x1ZGluZworICoKKyAqICAgICAgT1BUaSA4MkM5MjggICAgIE1BRDE2ICAgICAgICAgICAocmVwbGFjZWQgYnkgQzkyOSkKKyAqICAgICAgT0FLIE9USS02MDFEICAgIE1vemFydAorICogICAgICBPQUsgT1RJLTYwNQlNb3phcnQJCShsYXRlciB2ZXJzaW9uIHdpdGggTVBVNDAxIE1pZGkpCisgKiAgICAgIE9QVGkgODJDOTI5ICAgICBNQUQxNiBQcm8KKyAqICAgICAgT1BUaSA4MkM5MzAKKyAqICAgICAgT1BUaSA4MkM5MjQKKyAqCisgKiBUaGVzZSBhdWRpbyBpbnRlcmZhY2UgY2hpcHMgZG9uJ3QgcHJvZHVjZSBzb3VuZCB0aGVtc2VsdmVzLiBUaGV5IGp1c3QKKyAqIGNvbm5lY3Qgc29tZSBvdGhlciBjb21wb25lbnRzIChPUEwtWzIzNF0gYW5kIGEgV1NTIGNvbXBhdGlibGUgY29kZWMpCisgKiB0byB0aGUgUEMgYnVzIGFuZCBwZXJmb3JtIEkvTywgRE1BIGFuZCBJUlEgYWRkcmVzcyBkZWNvZGluZy4gVGhlcmUgaXMKKyAqIGFsc28gYSBVQVJUIGZvciB0aGUgTVBVLTQwMSBtb2RlIChub3QgODJDOTI4L01vemFydCkuCisgKiBUaGUgTW96YXJ0IGNoaXAgYXBwZWFycyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIDgyQzkyOCwgYWx0aG91Z2ggbGF0ZXIKKyAqIGlzc3VlcyBvZiB0aGUgY2FyZCwgdXNpbmcgdGhlIE9USS02MDUgY2hpcCwgaGF2ZSBhbiBNUFUtNDAxIGNvbXBhdGlibGUgTWlkaQorICogcG9ydC4gVGhpcyBwb3J0IGlzIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkgdG8gdGhhdCBvZiB0aGUgT1BUaSBhdWRpbyBjaGlwcy4KKyAqCisgKglDaGFuZ2VzCisgKgkKKyAqCUFsYW4gQ294CQlDbGVhbiB1cCwgYWRkZWQgbW9kdWxlIHNlbGVjdGlvbnMuCisgKgorICoJQS4gV2lrCQkJQWRkZWQgc3VwcG9ydCBmb3IgT3B0aTkyNCBQblAuCisgKgkJCQlJbXByb3ZlZCBkZWJ1Z2dpbmcgc3VwcG9ydC4JMTYtTWF5LTE5OTgKKyAqCQkJCUZpeGVkIGJ1Zy4JCQkxNi1KdW4tMTk5OAorICoKKyAqICAgICAgVG9yc3RlbiBEdXdlICAgICAgICAgICAgTWFkZSBPcHRpOTI0IFBuUCBzdXBwb3J0IG5vbi1kZXN0cnVjdGl2ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTIzLURlYy0xOTk4CisgKgorICoJUGF1bCBHcmF5c29uCQlBZGRlZCBzdXBwb3J0IGZvciBNaWRpIG9uIGxhdGVyIE1vemFydCBjYXJkcy4KKyAqCQkJCQkJCQkyNS1Ob3YtMTk5OQorICoJQ2hyaXN0b3BoIEhlbGx3aWcJQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdC4KKyAqCUFybmFsZG8gQy4gZGUgTWVsbwlnb3QgcmlkIG9mIGF0dGFjaF91YXJ0NDAxICAgICAgIDIxLVNlcC0yMDAwCisgKgorICoJUGF2ZWwgUmFiZWwJCUNsZWFuIHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgTm92LTIwMDAKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgImFkMTg0OC5oIgorI2luY2x1ZGUgInNiLmgiCisjaW5jbHVkZSAibXB1NDAxLmgiCisKK3N0YXRpYyBpbnQgICAgICBtYWQxNl9jb25mOworc3RhdGljIGludCAgICAgIG1hZDE2X2Nkc2VsOworc3RhdGljIHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOworCisjZGVmaW5lIEM5MjgJMQorI2RlZmluZSBNT1pBUlQJMgorI2RlZmluZSBDOTI5CTMKKyNkZWZpbmUgQzkzMAk0CisjZGVmaW5lIEM5MjQgICAgNQorCisvKgorICogICAgUmVnaXN0ZXJzCisgKgorICogICAgICBUaGUgTUFEMTYgb2NjdXBpZXMgSS9PIHBvcnRzIDB4ZjhkIHRvIDB4ZjkzIChmaXhlZCBsb2NhdGlvbnMpLgorICogICAgICBBbGwgcG9ydHMgYXJlIGluYWN0aXZlIGJ5IGRlZmF1bHQuIFRoZXkgY2FuIGJlIGFjdGl2YXRlZCBieQorICogICAgICB3cml0aW5nIDB4RTIgb3IgMHhFMyB0byB0aGUgcGFzc3dvcmQgcmVnaXN0ZXIuIFRoZSBwYXNzd29yZCBpcyB2YWxpZAorICogICAgICBvbmx5IHVudGlsIHRoZSBuZXh0IEkvTyByZWFkIG9yIHdyaXRlLgorICoKKyAqICAgICAgODJDOTMwIHVzZXMgMHhFNCBhcyB0aGUgcGFzc3dvcmQgYW5kIGluZGlyZWN0IGFkZHJlc3NpbmcgdG8gYWNjZXNzCisgKiAgICAgIHRoZSBjb25maWcgcmVnaXN0ZXJzLgorICovCisKKyNkZWZpbmUgTUMwX1BPUlQJMHhmOGMJLyogRHVtbXkgcG9ydCAqLworI2RlZmluZSBNQzFfUE9SVAkweGY4ZAkvKiBTQiBhZGRyZXNzLCBDRC1ST00gaW50ZXJmYWNlIHR5cGUsIGpveXN0aWNrICovCisjZGVmaW5lIE1DMl9QT1JUCTB4ZjhlCS8qIENELVJPTSBhZGRyZXNzLCBJUlEsIERNQSwgcGx1cyBPUEw0IGJpdCAqLworI2RlZmluZSBNQzNfUE9SVAkweGY4ZgorI2RlZmluZSBQQVNTV0RfUkVHCTB4ZjhmCisjZGVmaW5lIE1DNF9QT1JUCTB4ZjkwCisjZGVmaW5lIE1DNV9QT1JUCTB4ZjkxCisjZGVmaW5lIE1DNl9QT1JUCTB4ZjkyCisjZGVmaW5lIE1DN19QT1JUCTB4ZjkzCisjZGVmaW5lIE1DOF9QT1JUCTB4Zjk0CisjZGVmaW5lIE1DOV9QT1JUCTB4Zjk1CisjZGVmaW5lIE1DMTBfUE9SVAkweGY5NgorI2RlZmluZSBNQzExX1BPUlQJMHhmOTcKKyNkZWZpbmUgTUMxMl9QT1JUCTB4Zjk4CisKK3N0YXRpYyBpbnQgICAgICBib2FyZF90eXBlID0gQzkyODsKKworc3RhdGljIGludCAgICAgKm1hZDE2X29zcDsKK3N0YXRpYyBpbnQJYzkzMV9kZXRlY3RlZDsJLyogbWlub3IgZGlmZmVyZW5jZXMgZnJvbSBDOTMwICovCitzdGF0aWMgY2hhcgljOTI0cG5wOwkvKiAiICAgICAiICAgICAgICAgICAiICAgIEM5MjQgKi8KK3N0YXRpYyBpbnQJZGVidWc7ICAJLyogZGVidWdnaW5nIG91dHB1dCAqLworCisjaWZkZWYgRERCCisjdW5kZWYgRERCCisjZW5kaWYKKyNkZWZpbmUgRERCKHgpIGRvIHtpZiAoZGVidWcpIHg7fSB3aGlsZSAoMCkKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFkX3JlYWQoaW50IHBvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKworCXN3aXRjaCAoYm9hcmRfdHlwZSkJLyogT3V0cHV0IHBhc3N3b3JkICovCisJeworCQljYXNlIEM5Mjg6CisJCWNhc2UgTU9aQVJUOgorCQkJb3V0YigoMHhFMiksIFBBU1NXRF9SRUcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDOTI5OgorCQkJb3V0YigoMHhFMyksIFBBU1NXRF9SRUcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDOTMwOgorCQkJLyogb3V0YigoIDB4RTQpLCAgUEFTU1dEX1JFRyk7ICovCisJCQlicmVhazsKKworCQljYXNlIEM5MjQ6CisJCQkvKiB0aGUgYzkyNCBoYXMgaXRzIHBvcnRzIHJlbG9jYXRlZCBieSAtMTI4IGlmCisJCQkgICBQblAgaXMgZW5hYmxlZCAgLWF3ICovCisJCQlpZiAoIWM5MjRwbnApCisJCQkJb3V0YigoMHhFNSksIFBBU1NXRF9SRUcpOyBlbHNlCisJCQkJb3V0YigoMHhFNSksIFBBU1NXRF9SRUcgLSAweDgwKTsKKwkJCWJyZWFrOworCX0KKworCWlmIChib2FyZF90eXBlID09IEM5MzApCisJeworCQlvdXRiKChwb3J0IC0gTUMwX1BPUlQpLCAweGUwZSk7CS8qIFdyaXRlIHRvIGluZGV4IHJlZyAqLworCQl0bXAgPSBpbmIoMHhlMGYpOwkvKiBSZWFkIGZyb20gZGF0YSByZWcgKi8KKwl9CisJZWxzZQorCQlpZiAoIWM5MjRwbnApCisJCQl0bXAgPSBpbmIocG9ydCk7IGVsc2UKKwkJCXRtcCA9IGluYihwb3J0LTB4ODApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIHRtcDsKK30KKworc3RhdGljIHZvaWQgbWFkX3dyaXRlKGludCBwb3J0LCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCisJc3dpdGNoIChib2FyZF90eXBlKQkvKiBPdXRwdXQgcGFzc3dvcmQgKi8KKwl7CisJCWNhc2UgQzkyODoKKwkJY2FzZSBNT1pBUlQ6CisJCQlvdXRiKCgweEUyKSwgUEFTU1dEX1JFRyk7CisJCQlicmVhazsKKworCQljYXNlIEM5Mjk6CisJCQlvdXRiKCgweEUzKSwgUEFTU1dEX1JFRyk7CisJCQlicmVhazsKKworCQljYXNlIEM5MzA6CisJCQkvKiBvdXRiKCggMHhFNCksICBQQVNTV0RfUkVHKTsgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgQzkyNDoKKwkJCWlmICghYzkyNHBucCkKKwkJCQlvdXRiKCgweEU1KSwgUEFTU1dEX1JFRyk7IGVsc2UKKwkJCQlvdXRiKCgweEU1KSwgUEFTU1dEX1JFRyAtIDB4ODApOworCQkJYnJlYWs7CisJfQorCisJaWYgKGJvYXJkX3R5cGUgPT0gQzkzMCkKKwl7CisJCW91dGIoKHBvcnQgLSBNQzBfUE9SVCksIDB4ZTBlKTsJLyogV3JpdGUgdG8gaW5kZXggcmVnICovCisJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAodmFsdWUgJiAweGZmKSksIDB4ZTBmKTsKKwl9CisJZWxzZQorCQlpZiAoIWM5MjRwbnApCisJCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKHZhbHVlICYgMHhmZikpLCBwb3J0KTsgZWxzZQorCQkJb3V0YigoKHVuc2lnbmVkIGNoYXIpICh2YWx1ZSAmIDB4ZmYpKSwgcG9ydC0weDgwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZGV0ZWN0X2M5MzAodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyICAgdG1wID0gbWFkX3JlYWQoTUMxX1BPUlQpOworCisJaWYgKCh0bXAgJiAweDA2KSAhPSAweDA2KQorCXsKKwkJRERCKHByaW50aygiV3JvbmcgQzkzMCBzaWduYXR1cmUgKCV4KVxuIiwgdG1wKSk7CisJCS8qIHJldHVybiAwOyAqLworCX0KKwltYWRfd3JpdGUoTUMxX1BPUlQsIDApOworCisJaWYgKG1hZF9yZWFkKE1DMV9QT1JUKSAhPSAweDA2KQorCXsKKwkJRERCKHByaW50aygiV3JvbmcgQzkzMCBzaWduYXR1cmUyICgleClcbiIsIHRtcCkpOworCQkvKiByZXR1cm4gMDsgKi8KKwl9CisJbWFkX3dyaXRlKE1DMV9QT1JULCB0bXApOwkvKiBSZXN0b3JlIGJpdHMgKi8KKworCW1hZF93cml0ZShNQzdfUE9SVCwgMCk7CisJaWYgKCh0bXAgPSBtYWRfcmVhZChNQzdfUE9SVCkpICE9IDApCisJeworCQlEREIocHJpbnRrKCJNQzcgbm90IHdyaXRhYmxlICgleClcbiIsIHRtcCkpOworCQlyZXR1cm4gMDsKKwl9CisJbWFkX3dyaXRlKE1DN19QT1JULCAweGNiKTsKKwlpZiAoKHRtcCA9IG1hZF9yZWFkKE1DN19QT1JUKSkgIT0gMHhjYikKKwl7CisJCUREQihwcmludGsoIk1DNyBub3Qgd3JpdGFibGUyICgleClcbiIsIHRtcCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0bXAgPSBtYWRfcmVhZChNQzBfUE9SVCsxOCk7CisJaWYgKHRtcCA9PSAweGZmIHx8IHRtcCA9PSAweDAwKQorCQlyZXR1cm4gMTsKKwkvKiBXZSBwcm9iYWJseSBoYXZlIGEgQzkzMSAqLworCUREQihwcmludGsoIkRldGVjdGVkIEM5MzEgY29uZmlnPTB4JTAyeFxuIiwgdG1wKSk7CisJYzkzMV9kZXRlY3RlZCA9IDE7CisKKwkvKgorICAgICAgICAgKiBXZSBjYW5ub3QgY29uZmlndXJlIHRoZSBjaGlwIGlmIGl0IGlzIGluIFBuUCBtb2RlLgorICAgICAgICAgKiBJZiB3ZSBoYXZlIGEgQ1NOIGFzc2lnbmVkIChiaXQgOCBpbiBNQzEzKSB3ZSBmaXJzdCB0cnkKKyAgICAgICAgICogYSBzb2Z0d2FyZSByZXNldCwgdGhlbiBhIHNvZnR3YXJlIHBvd2VyIG9mZiwgZmluYWxseQorICAgICAgICAgKiBDbGVhcmluZyBQblAgbW9kZS4gVGhlIGxhc3Qgb3B0aW9uIGlzIG5vdAorCSAqIEJpdCA4IGluIE1DMTMgCisgICAgICAgICAqLworCWlmICgobWFkX3JlYWQoTUMwX1BPUlQrMTMpICYgMHg4MCkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwkvKiBTb2Z0d2FyZSByZXNldCAqLworCW1hZF93cml0ZShNQzlfUE9SVCwgMHgwMik7CisJbWFkX3dyaXRlKE1DOV9QT1JULCAweDAwKTsKKworCWlmICgobWFkX3JlYWQoTUMwX1BPUlQrMTMpICYgMHg4MCkgPT0gMCkKKwkJcmV0dXJuIDE7CisJCisJLyogUG93ZXIgb2ZmLCBhbmQgb24gYWdhaW4gKi8KKwltYWRfd3JpdGUoTUM5X1BPUlQsIDB4YzIpOworCW1hZF93cml0ZShNQzlfUE9SVCwgMHhjMCk7CisKKwlpZiAoKG1hZF9yZWFkKE1DMF9QT1JUKzEzKSAmIDB4ODApID09IDApCisJCXJldHVybiAxOworCQorI2lmIDAJCisJLyogRm9yY2Ugb2ZmIFBuUCBtb2RlLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBiZWNhdXNlCisJICogdGhlIFBuUCBiaW9zIHdpbGwgbm90IHJlY29nbml6ZSB0aGUgY2hpcCBvbiB0aGUgbmV4dAorCSAqIHdhcm0gYm9vdCBhbmQgbWF5IGFzc2lnbmQgZGlmZmVyZW50IHJlc291cmNlcyB0byBvdGhlcgorCSAqIFBuUC9QQ0kgY2FyZHMuCisJICovCisJbWFkX3dyaXRlKE1DMF9QT1JUKzE3LCAweDA0KTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkZXRlY3RfbWFkMTYodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcCwgdG1wMiwgYml0OworCWludCBpLCBwb3J0OworCisJLyoKKwkgKiBDaGVjayB0aGF0IHJlYWRpbmcgYSByZWdpc3RlciBkb2Vzbid0IHJldHVybiBidXMgZmxvYXQgKDB4ZmYpCisJICogd2hlbiB0aGUgY2FyZCBpcyBhY2Nlc3NlZCB1c2luZyBwYXNzd29yZC4gVGhpcyBtYXkgZmFpbCBpbiBjYXNlCisJICogdGhlIGNhcmQgaXMgaW4gbG93IHBvd2VyIG1vZGUuIE5vcm1hbGx5IGF0IGxlYXN0IHRoZSBwb3dlciBzYXZpbmcKKwkgKiBtb2RlIGJpdCBzaG91bGQgYmUgMC4KKwkgKi8KKworCWlmICgodG1wID0gbWFkX3JlYWQoTUMxX1BPUlQpKSA9PSAweGZmKQorCXsKKwkJRERCKHByaW50aygiTUMxX1BPUlQgcmV0dXJuZWQgMHhmZlxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChpID0gMHhmOGQ7IGkgPD0gMHhmOTg7IGkrKykKKwkJaWYgKCFjOTI0cG5wKQorCQkJRERCKHByaW50aygiUG9ydCAlMHggKGluaXQgdmFsdWUpID0gJTB4XG4iLCBpLCBtYWRfcmVhZChpKSkpOworCQllbHNlCisJCQlEREIocHJpbnRrKCJQb3J0ICUweCAoaW5pdCB2YWx1ZSkgPSAlMHhcbiIsIGktMHg4MCwgbWFkX3JlYWQoaSkpKTsKKworCWlmIChib2FyZF90eXBlID09IEM5MzApCisJCXJldHVybiBkZXRlY3RfYzkzMCgpOworCisJLyoKKwkgKiBOb3cgY2hlY2sgdGhhdCB0aGUgZ2F0ZSBpcyBjbG9zZWQgb24gZmlyc3QgSS9PIGFmdGVyIHdyaXRpbmcKKwkgKiB0aGUgcGFzc3dvcmQuIChUaGlzIGlzIGhvdyBhIE1BRDE2IGNvbXBhdGlibGUgY2FyZCB3b3JrcykuCisJICovCisKKwlpZiAoKHRtcDIgPSBpbmIoTUMxX1BPUlQpKSA9PSB0bXApCS8qIEl0IGRpZG4ndCBjbG9zZSAqLworCXsKKwkJRERCKHByaW50aygiTUMxX1BPUlQgZGlkbid0IGNsb3NlIGFmdGVyIHJlYWQgKDB4JTAyeClcbiIsIHRtcDIpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYml0ICA9IChjOTI0cG5wKSA/ICAgICAweDIwIDogMHg4MDsKKwlwb3J0ID0gKGM5MjRwbnApID8gTUMyX1BPUlQgOiBNQzFfUE9SVDsKKworCXRtcCA9IG1hZF9yZWFkKHBvcnQpOworCW1hZF93cml0ZShwb3J0LCB0bXAgXiBiaXQpOwkvKiBUb2dnbGUgYSBiaXQgKi8KKwlpZiAoKHRtcDIgPSBtYWRfcmVhZChwb3J0KSkgIT0gKHRtcCBeIGJpdCkpCS8qIENvbXBhcmUgdGhlIGJpdCAqLworCXsKKwkJbWFkX3dyaXRlKHBvcnQsIHRtcCk7CS8qIFJlc3RvcmUgKi8KKwkJRERCKHByaW50aygiQml0IHJldmVydCB0ZXN0IGZhaWxlZCAoMHglMDJ4LCAweCUwMngpXG4iLCB0bXAsIHRtcDIpKTsKKwkJcmV0dXJuIDA7CisJfQorCW1hZF93cml0ZShwb3J0LCB0bXApOwkvKiBSZXN0b3JlICovCisJcmV0dXJuIDE7CQkvKiBCaW5nbyAqLworfQorCitzdGF0aWMgaW50IF9faW5pdCB3c3NfaW5pdChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJLyoKKwkgKiBDaGVjayBpZiB0aGUgSU8gcG9ydCByZXR1cm5zIHZhbGlkIHNpZ25hdHVyZS4gVGhlIG9yaWdpbmFsIE1TIFNvdW5kCisJICogc3lzdGVtIHJldHVybnMgMHgwNCB3aGlsZSBzb21lIGNhcmRzIChBdWRpb1RyaXggUHJvIGZvciBleGFtcGxlKQorCSAqIHJldHVybiAweDAwLgorCSAqLworCisJaWYgKChpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgMykgJiAweDNmKSAhPSAweDA0ICYmCisJICAgIChpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgMykgJiAweDNmKSAhPSAweDAwKQorCXsKKwkJRERCKHByaW50aygiTm8gTVNTIHNpZ25hdHVyZSBkZXRlY3RlZCBvbiBwb3J0IDB4JXggKDB4JXgpXG4iLCBod19jb25maWctPmlvX2Jhc2UsIGluYihod19jb25maWctPmlvX2Jhc2UgKyAzKSkpOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBDaGVjayB0aGF0IERNQTAgaXMgbm90IGluIHVzZSB3aXRoIGEgOCBiaXQgYm9hcmQuCisJICovCisJaWYgKGh3X2NvbmZpZy0+ZG1hID09IDAgJiYgaW5iKGh3X2NvbmZpZy0+aW9fYmFzZSArIDMpICYgMHg4MCkKKwl7CisJCXByaW50aygiTVNTOiBDYW4ndCB1c2UgRE1BMCB3aXRoIGEgOCBiaXQgY2FyZC9zbG90XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChod19jb25maWctPmlycSA+IDkgJiYgaW5iKGh3X2NvbmZpZy0+aW9fYmFzZSArIDMpICYgMHg4MCkKKwkJcHJpbnRrKEtFUk5fRVJSICJNU1M6IENhbid0IHVzZSBJUlElZCB3aXRoIGEgOCBiaXQgY2FyZC9zbG90XG4iLCBod19jb25maWctPmlycSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2M5MzAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNmZyA9IDA7CisKKwljZmcgfD0gKDB4MGYgJiBtYWQxNl9jb25mKTsKKworCWlmKGM5MzFfZGV0ZWN0ZWQpCisJeworCQkvKiBCaXQgMCBoYXMgcmV2ZXJzZCBtZWFuaW5nLiBCaXRzIDEgYW5kIDIgc2VzZQorCQkgICByZXZlcnNlZCBvbiB3cml0ZS4KKwkJICAgU3VwcG9ydCBvbmx5IElERSBjZHJvbS4gSURFIHBvcnQgcHJvZ3JhbW1lZAorCQkgICBzb21ld2hlcmUgZWxzZS4gKi8KKwkJY2ZnID0gIChjZmcgJiAweDA5KSBeIDB4MDc7CisJfQorCWNmZyB8PSBiYXNlIDw8IDQ7CisJbWFkX3dyaXRlKE1DMV9QT1JULCBjZmcpOworCisJLyogTUMyIGlzIENEIGNvbmZpZ3VyYXRpb24uIERvbid0IHRvdWNoIGl0LiAqLworCisJbWFkX3dyaXRlKE1DM19QT1JULCAwKTsJLyogRGlzYWJsZSBTQiBtb2RlIElSUSBhbmQgRE1BICovCisKKwkvKiBiaXQgMiBvZiBNQzQgcmV2ZXJzZXMgaXQncyBtZWFuaW5nIGJldHdlZW4gdGhlIEM5MzAKKwkgICBhbmQgdGhlIEM5MzEuICovCisJY2ZnID0gYzkzMV9kZXRlY3RlZCA/IDB4MDQgOiAweDAwOworCisJaWYobWFkMTZfY2RzZWwgJiAweDIwKQorCQltYWRfd3JpdGUoTUM0X1BPUlQsIDB4NjJ8Y2ZnKTsgIC8qIG9wbDQgKi8KKwllbHNlCisJCW1hZF93cml0ZShNQzRfUE9SVCwgMHg1MnxjZmcpOyAgLyogb3BsMyAqLworCisJbWFkX3dyaXRlKE1DNV9QT1JULCAweDNDKTsJLyogSW5pdCBpdCBpbnRvIG1vZGUyICovCisJbWFkX3dyaXRlKE1DNl9QT1JULCAweDAyKTsJLyogRW5hYmxlIFdTUywgRGlzYWJsZSBNUFUgYW5kIFNCICovCisJbWFkX3dyaXRlKE1DN19QT1JULCAweENCKTsKKwltYWRfd3JpdGUoTUMxMF9QT1JULCAweDExKTsKK30KKworc3RhdGljIGludCBfX2luaXQgY2hpcF9kZXRlY3Qodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogICAgVGhlbiB0cnkgdG8gZGV0ZWN0IHdpdGggdGhlIG9sZCBwYXNzd29yZAorCSAqLworCWJvYXJkX3R5cGUgPSBDOTI0OworCisJRERCKHByaW50aygiRGV0ZWN0IHVzaW5nIHBhc3N3b3JkID0gMHhFNVxuIikpOworCQorCWlmIChkZXRlY3RfbWFkMTYoKSkgeworCQlyZXR1cm4gMTsKKwl9CisJCisJYm9hcmRfdHlwZSA9IEM5Mjg7CisKKwlEREIocHJpbnRrKCJEZXRlY3QgdXNpbmcgcGFzc3dvcmQgPSAweEUyXG4iKSk7CisKKwlpZiAoZGV0ZWN0X21hZDE2KCkpCisJeworCQl1bnNpZ25lZCBjaGFyIG1vZGVsOworCisJCWlmICgoKG1vZGVsID0gbWFkX3JlYWQoTUMzX1BPUlQpKSAmIDB4MDMpID09IDB4MDMpIHsKKwkJCUREQihwcmludGsoIm1hZDE2LmM6IE1vemFydCBkZXRlY3RlZFxuIikpOworCQkJYm9hcmRfdHlwZSA9IE1PWkFSVDsKKwkJfSBlbHNlIHsKKwkJCUREQihwcmludGsoIm1hZDE2LmM6IDgyQzkyOCBkZXRlY3RlZD8/P1xuIikpOworCQkJYm9hcmRfdHlwZSA9IEM5Mjg7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJYm9hcmRfdHlwZSA9IEM5Mjk7CisKKwlEREIocHJpbnRrKCJEZXRlY3QgdXNpbmcgcGFzc3dvcmQgPSAweEUzXG4iKSk7CisKKwlpZiAoZGV0ZWN0X21hZDE2KCkpCisJeworCQlEREIocHJpbnRrKCJtYWQxNi5jOiA4MkM5MjkgZGV0ZWN0ZWRcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGluYihQQVNTV0RfUkVHKSAhPSAweGZmKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogRmlyc3QgcmVsb2NhdGUgTUMjIHJlZ2lzdGVycyB0byAweGUwZS8weGUwZiwgZGlzYWJsZSBwYXNzd29yZCAKKwkgKi8KKworCW91dGIoKDB4RTQpLCBQQVNTV0RfUkVHKTsKKwlvdXRiKCgweDgwKSwgUEFTU1dEX1JFRyk7CisKKwlib2FyZF90eXBlID0gQzkzMDsKKworCUREQihwcmludGsoIkRldGVjdCB1c2luZyBwYXNzd29yZCA9IDB4RTRcbiIpKTsKKworCWZvciAoaSA9IDB4ZjhkOyBpIDw9IDB4ZjkzOyBpKyspCisJCUREQihwcmludGsoInBvcnQgJTAzeCA9ICUwMnhcbiIsIGksIG1hZF9yZWFkKGkpKSk7CisKKyAgICAgICAgaWYoZGV0ZWN0X21hZDE2KCkpIHsKKwkJRERCKHByaW50aygibWFkMTYuYzogODJDOTMwIGRldGVjdGVkXG4iKSk7CisJCXJldHVybiAxOworCX0KKworCS8qIFRoZSBDOTMxIGhhcyB0aGUgcGFzc3dvcmQgcmVnIGF0IEY4RCAqLworCW91dGIoKDB4RTQpLCAweEY4RCk7CisJb3V0YigoMHg4MCksIDB4RjhEKTsKKwlEREIocHJpbnRrKCJEZXRlY3QgdXNpbmcgcGFzc3dvcmQgPSAweEU0IGZvciBDOTMxXG4iKSk7CisKKwlpZiAoZGV0ZWN0X21hZDE2KCkpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJYm9hcmRfdHlwZSA9IEM5MjQ7CisJYzkyNHBucCsrOworCUREQihwcmludGsoIkRldGVjdCB1c2luZyBwYXNzd29yZCA9IDB4RTUgKGFnYWluKSwgcG9ydCBvZmZzZXQgLTB4ODBcbiIpKTsKKwlpZiAoZGV0ZWN0X21hZDE2KCkpIHsKKwkJRERCKHByaW50aygibWFkMTYuYzogODJDOTI0IFBuUCBkZXRlY3RlZFxuIikpOworCQlyZXR1cm4gMTsKKwl9CisJCisJYzkyNHBucD0wOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX21hZDE2KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwl1bnNpZ25lZCBjaGFyIGNzNDIzMV9tb2RlID0gMDsKKworCWludCBhZF9mbGFncyA9IDA7CisKKwlzaWduZWQgY2hhciBiaXRzOworCisJc3RhdGljIGNoYXIgICAgIGRtYV9iaXRzWzRdID0geworCQkxLCAyLCAwLCAzCisJfTsKKworCWludCBjb25maWdfcG9ydCA9IGh3X2NvbmZpZy0+aW9fYmFzZSArIDAsIHZlcnNpb25fcG9ydCA9IGh3X2NvbmZpZy0+aW9fYmFzZSArIDM7CisJaW50IGRtYSA9IGh3X2NvbmZpZy0+ZG1hLCBkbWEyID0gaHdfY29uZmlnLT5kbWEyOworCXVuc2lnbmVkIGNoYXIgZG1hMl9iaXQgPSAwOworCWludCBiYXNlOworCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7CisKKwltYWQxNl9vc3AgPSBod19jb25maWctPm9zcDsKKworCXN3aXRjaCAoaHdfY29uZmlnLT5pb19iYXNlKSB7CisJY2FzZSAweDUzMDoKKwkJYmFzZSA9IDA7CisJCWJyZWFrOworCWNhc2UgMHhlODA6CisJCWJhc2UgPSAxOworCQlicmVhazsKKwljYXNlIDB4ZjQwOgorCQliYXNlID0gMjsKKwkJYnJlYWs7CisJY2FzZSAweDYwNDoKKwkJYmFzZSA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiTUFEMTYvTW96YXJ0OiBCYWQgV1NTIGJhc2UgYWRkcmVzcyAweCV4XG4iLCBod19jb25maWctPmlvX2Jhc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZG1hICE9IDAgJiYgZG1hICE9IDEgJiYgZG1hICE9IDMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNU1M6IEJhZCBETUEgJWRcbiIsIGRtYSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogICAgQ2hlY2sgdGhhdCBhbGwgcG9ydHMgcmV0dXJuIDB4ZmYgKGJ1cyBmbG9hdCkgd2hlbiBubyBwYXNzd29yZAorCSAqICAgICAgaXMgd3JpdHRlbiB0byB0aGUgcGFzc3dvcmQgcmVnaXN0ZXIuCisJICovCisKKwlEREIocHJpbnRrKCItLS0gRGV0ZWN0aW5nIE1BRDE2IC8gTW96YXJ0IC0tLVxuIikpOworCWlmICghY2hpcF9kZXRlY3QoKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGh3X2NvbmZpZy0+aXJxKSB7CisJY2FzZSA3OgorCQliaXRzID0gODsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQliaXRzID0gMHgxMDsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJYml0cyA9IDB4MTg7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCWJpdHMgPSAweDIwOworCQlicmVhazsKKwljYXNlIDU6CS8qIEFsc28gSVJRNSBpcyBwb3NzaWJsZSBvbiBDOTMwICovCisJCWlmIChib2FyZF90eXBlID09IEM5MzAgfHwgYzkyNHBucCkgeworCQkJYml0cyA9IDB4Mjg7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiTUFEMTYvTW96YXJ0OiBCYWQgSVJRICVkXG4iLCBod19jb25maWctPmlycSk7CisJCXJldHVybiAwOworCX0KKworCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlICsgNCwgNCwgImFkMTg0OCIpOworCWlmICghcG9ydHMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNU1M6IEkvTyBwb3J0IGNvbmZsaWN0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0LCAibWFkMTYgV1NTIGNvbmZpZyIpKSB7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSArIDQsIDQpOworCQlwcmludGsoS0VSTl9FUlIgIk1TUzogSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYm9hcmRfdHlwZSA9PSBDOTMwKSB7CisJCWluaXRfYzkzMChod19jb25maWcsIGJhc2UpOworCQlnb3RvIGdvdF9pdDsKKwl9CisKKwlmb3IgKGkgPSAweGY4ZDsgaSA8PSAweGY5MzsgaSsrKSB7CisJCWlmICghYzkyNHBucCkKKwkJCUREQihwcmludGsoInBvcnQgJTAzeCA9ICUwMnhcbiIsIGksIG1hZF9yZWFkKGkpKSk7CisJCWVsc2UKKwkJCUREQihwcmludGsoInBvcnQgJTAzeCA9ICUwMnhcbiIsIGktMHg4MCwgbWFkX3JlYWQoaSkpKTsKKwl9CisKKy8qCisgKiBTZXQgdGhlIFdTUyBhZGRyZXNzCisgKi8KKworCXRtcCA9IChtYWRfcmVhZChNQzFfUE9SVCkgJiAweDBmKSB8IDB4ODA7CS8qIEVuYWJsZSBXU1MsIERpc2FibGUgU0IgKi8KKwl0bXAgfD0gYmFzZSA8PCA0OwkvKiBXU1MgcG9ydCBzZWxlY3QgYml0cyAqLworCisJLyoKKwkgKiBTZXQgb3B0aW9uYWwgQ0QtUk9NIGFuZCBqb3lzdGljayBzZXR0aW5ncy4KKwkgKi8KKworCXRtcCAmPSB+MHgwZjsKKwl0bXAgfD0gKG1hZDE2X2NvbmYgJiAweDBmKTsJLyogQ0QtUk9NIGFuZCBqb3lzdGljayBiaXRzICovCisJbWFkX3dyaXRlKE1DMV9QT1JULCB0bXApOworCisJdG1wID0gbWFkMTZfY2RzZWw7CisJbWFkX3dyaXRlKE1DMl9QT1JULCB0bXApOworCW1hZF93cml0ZShNQzNfUE9SVCwgMHhmMCk7CS8qIERpc2FibGUgU0IgKi8KKworCWlmIChib2FyZF90eXBlID09IEM5MjQpCS8qIFNwZWNpZmljIEM5MjQgaW5pdCB2YWx1ZXMgKi8KKwl7CisJCW1hZF93cml0ZShNQzRfUE9SVCwgMHhBMCk7CisJCW1hZF93cml0ZShNQzVfUE9SVCwgMHgwNSk7CisJCW1hZF93cml0ZShNQzZfUE9SVCwgMHgwMyk7CisJfQorCWlmICghYWQxODQ4X2RldGVjdChwb3J0cywgJmFkX2ZsYWdzLCBtYWQxNl9vc3ApKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoYWRfZmxhZ3MgJiAoQURfRl9DUzQyMzEgfCBBRF9GX0NTNDI0OCkpCisJCWNzNDIzMV9tb2RlID0gMHgwMjsJLyogQ1M0MjQ4L0NTNDIzMSBzeW5jIGRlbGF5IHN3aXRjaCAqLworCisJaWYgKGJvYXJkX3R5cGUgPT0gQzkyOSkKKwl7CisJCW1hZF93cml0ZShNQzRfUE9SVCwgMHhhMik7CisJCW1hZF93cml0ZShNQzVfUE9SVCwgMHhBNSB8IGNzNDIzMV9tb2RlKTsKKwkJbWFkX3dyaXRlKE1DNl9QT1JULCAweDAzKTsJLyogRGlzYWJsZSBNUFU0MDEgKi8KKwl9CisJZWxzZQorCXsKKwkJbWFkX3dyaXRlKE1DNF9QT1JULCAweDAyKTsKKwkJbWFkX3dyaXRlKE1DNV9QT1JULCAweDMwIHwgY3M0MjMxX21vZGUpOworCX0KKworCWZvciAoaSA9IDB4ZjhkOyBpIDw9IDB4ZjkzOyBpKyspIHsKKwkJaWYgKCFjOTI0cG5wKQorCQkJRERCKHByaW50aygicG9ydCAlMDN4IGFmdGVyIGluaXQgPSAlMDJ4XG4iLCBpLCBtYWRfcmVhZChpKSkpOworCQllbHNlCisJCQlEREIocHJpbnRrKCJwb3J0ICUwM3ggYWZ0ZXIgaW5pdCA9ICUwMnhcbiIsIGktMHg4MCwgbWFkX3JlYWQoaSkpKTsKKwl9CisKK2dvdF9pdDoKKwlhZF9mbGFncyA9IDA7CisJaWYgKCFhZDE4NDhfZGV0ZWN0KHBvcnRzLCAmYWRfZmxhZ3MsIG1hZDE2X29zcCkpCisJCWdvdG8gZmFpbDsKKworCWlmICghd3NzX2luaXQoaHdfY29uZmlnKSkKKwkJZ290byBmYWlsOworCisJLyoKKwkgKiBTZXQgdGhlIElSUSBhbmQgRE1BIGFkZHJlc3Nlcy4KKwkgKi8KKwkKKwlvdXRiKChiaXRzIHwgMHg0MCksIGNvbmZpZ19wb3J0KTsKKwlpZiAoKGluYih2ZXJzaW9uX3BvcnQpICYgMHg0MCkgPT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJbSVJRIENvbmZsaWN0P11cbiIpOworCisJLyoKKwkgKiBIYW5kbGUgdGhlIGNhcHR1cmUgRE1BIGNoYW5uZWwKKwkgKi8KKworCWlmIChhZF9mbGFncyAmIEFEX0ZfQ1M0MjMxICYmIGRtYTIgIT0gLTEgJiYgZG1hMiAhPSBkbWEpCisJeworCQlpZiAoISgoZG1hID09IDAgJiYgZG1hMiA9PSAxKSB8fAorCQkJKGRtYSA9PSAxICYmIGRtYTIgPT0gMCkgfHwKKwkJCShkbWEgPT0gMyAmJiBkbWEyID09IDApKSkKKwkJewkJLyogVW5zdXBwb3J0ZWQgY29tYmluYXRpb24uIFRyeSB0byBzd2FwIGNoYW5uZWxzICovCisJCQlpbnQgdG1wID0gZG1hOworCisJCQlkbWEgPSBkbWEyOworCQkJZG1hMiA9IHRtcDsKKwkJfQorCQlpZiAoKGRtYSA9PSAwICYmIGRtYTIgPT0gMSkgfHwgKGRtYSA9PSAxICYmIGRtYTIgPT0gMCkgfHwKKwkJCShkbWEgPT0gMyAmJiBkbWEyID09IDApKQorCQl7CisJCQlkbWEyX2JpdCA9IDB4MDQ7CS8qIEVuYWJsZSBjYXB0dXJlIERNQSAqLworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnRrKCJNQUQxNjogSW52YWxpZCBjYXB0dXJlIERNQVxuIik7CisJCQlkbWEyID0gZG1hOworCQl9CisJfQorCWVsc2UgZG1hMiA9IGRtYTsKKworCW91dGIoKGJpdHMgfCBkbWFfYml0c1tkbWFdIHwgZG1hMl9iaXQpLCBjb25maWdfcG9ydCk7CS8qIFdyaXRlIElSUStETUEgc2V0dXAgKi8KKworCWh3X2NvbmZpZy0+c2xvdHNbMF0gPSBhZDE4NDhfaW5pdCgibWFkMTYgV1NTIiwgcG9ydHMsCisJCQkJCSAgaHdfY29uZmlnLT5pcnEsCisJCQkJCSAgZG1hLAorCQkJCQkgIGRtYTIsIDAsCisJCQkJCSAgaHdfY29uZmlnLT5vc3AsCisJCQkJCSAgVEhJU19NT0RVTEUpOworCXJldHVybiAxOworCitmYWlsOgorCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSArIDQsIDQpOworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX21hZDE2X21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5zaWduZWQgY2hhciB0bXA7CisKKwlpZiAoYm9hcmRfdHlwZSA8IEM5MjkpCS8qIEVhcmx5IGNoaXAuIE5vIE1QVSBzdXBwb3J0LiBKdXN0IFNCIE1JREkgKi8KKwl7CisKKyNpZmRlZiBDT05GSUdfTUFEMTZfT0xEQ0FSRAorCisJCXRtcCA9IG1hZF9yZWFkKE1DM19QT1JUKTsKKworCQkvKiAKKwkJICogTUFEMTYgU0IgYmFzZSBpcyBkZWZpbmVkIGJ5IHRoZSBXU1MgYmFzZS4gSXQgY2Fubm90IGJlIGNoYW5nZWQgCisJCSAqIGFsb25lLgorCQkgKiBJZ25vcmUgY29uZmlndXJlZCBJL08gYmFzZS4gVXNlIHRoZSBhY3RpdmUgc2V0dGluZy4gCisJCSAqLworCisJCWlmIChtYWRfcmVhZChNQzFfUE9SVCkgJiAweDIwKQorCQkJaHdfY29uZmlnLT5pb19iYXNlID0gMHgyNDA7CisJCWVsc2UKKwkJCWh3X2NvbmZpZy0+aW9fYmFzZSA9IDB4MjIwOworCisJCXN3aXRjaCAoaHdfY29uZmlnLT5pcnEpCisJCXsKKwkJCWNhc2UgNToKKwkJCQl0bXAgPSAodG1wICYgMHgzZikgfCAweDgwOworCQkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJCXRtcCA9ICh0bXAgJiAweDNmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTE6CisJCQkJdG1wID0gKHRtcCAmIDB4M2YpIHwgMHg0MDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICJtYWQxNi9Nb3phcnQ6IEludmFsaWQgTUlESSBJUlFcbiIpOworCQkJCXJldHVybiAwOworCQl9CisKKwkJbWFkX3dyaXRlKE1DM19QT1JULCB0bXAgfCAweDA0KTsKKwkJaHdfY29uZmlnLT5kcml2ZXJfdXNlXzEgPSBTQl9NSURJX09OTFk7CisJCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNiwgInNvdW5kYmxhc3RlciIpKQorCQkJcmV0dXJuIDA7CisJCWlmICghc2JfZHNwX2RldGVjdChod19jb25maWcsIDAsIDAsIE5VTEwpKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDE2KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKG1hZF9yZWFkKE1DMV9QT1JUKSAmIDB4MjApCisJCQlod19jb25maWctPmlvX2Jhc2UgPSAweDI0MDsKKwkJZWxzZQorCQkJaHdfY29uZmlnLT5pb19iYXNlID0gMHgyMjA7CisKKwkJaHdfY29uZmlnLT5uYW1lID0gIk1hZDE2L01vemFydCI7CisJCXNiX2RzcF9pbml0KGh3X2NvbmZpZywgVEhJU19NT0RVTEUpOworCQlyZXR1cm4gMTsKKyNlbHNlCisJCS8qIGFzc3VtaW5nIGFsbCBsYXRlciBNb3phcnQgY2FyZHMgYXJlIGlkZW50aWZpZWQgYXMKKwkJICogZWl0aGVyIDgyQzkyOCBvciBNb3phcnQuIElmIHNvLCBmb2xsb3dpbmcgY29kZSBhdHRlbXB0cworCQkgKiB0byBzZXQgTVBVIHJlZ2lzdGVyLiBUT0RPIC0gYWRkIHByb2JpbmcKKwkJICovCisKKwkJdG1wID0gbWFkX3JlYWQoTUM4X1BPUlQpOworCisJCXN3aXRjaCAoaHdfY29uZmlnLT5pcnEpCisJCXsKKwkJCWNhc2UgNToKKwkJCQl0bXAgfD0gMHgwODsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCQl0bXAgfD0gMHgxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgOToKKwkJCQl0bXAgfD0gMHgxODsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CisJCQkJdG1wIHw9IDB4MjA7CisJCQkJYnJlYWs7CisJCQljYXNlIDExOgorCQkJCXRtcCB8PSAweDI4OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1hZDE2L01PWkFSVDogaW52YWxpZCBtcHVfaXJxXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJfQorCisJCXN3aXRjaCAoaHdfY29uZmlnLT5pb19iYXNlKQorCQl7CisJCQljYXNlIDB4MzAwOgorCQkJCXRtcCB8PSAweDAxOworCQkJCWJyZWFrOworCQkJY2FzZSAweDMxMDoKKwkJCQl0bXAgfD0gMHgwMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgzMjA6CisJCQkJdG1wIHw9IDB4MDU7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MzMwOgorCQkJCXRtcCB8PSAweDA3OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1hZDE2L01PWkFSVDogaW52YWxpZCBtcHVfaW9cbiIpOworCQkJCXJldHVybiAwOworCQl9CisKKwkJbWFkX3dyaXRlKE1DOF9QT1JULCB0bXApOwkvKiB3cml0ZSBNUFUgcG9ydCBwYXJhbWV0ZXJzICovCisJCWdvdG8gcHJvYmVfNDAxOworI2VuZGlmCisJfQorCXRtcCA9IG1hZF9yZWFkKE1DNl9QT1JUKSAmIDB4ODM7CisJdG1wIHw9IDB4ODA7CQkvKiBNUFUtNDAxIGVuYWJsZSAqLworCisJLyogU2V0IHRoZSBNUFUgYmFzZSBiaXRzICovCisKKwlzd2l0Y2ggKGh3X2NvbmZpZy0+aW9fYmFzZSkKKwl7CisJCWNhc2UgMHgzMDA6CisJCQl0bXAgfD0gMHg2MDsKKwkJCWJyZWFrOworCQljYXNlIDB4MzEwOgorCQkJdG1wIHw9IDB4NDA7CisJCQlicmVhazsKKwkJY2FzZSAweDMyMDoKKwkJCXRtcCB8PSAweDIwOworCQkJYnJlYWs7CisJCWNhc2UgMHgzMzA6CisJCQl0bXAgfD0gMHgwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJNQUQxNjogSW52YWxpZCBNSURJIHBvcnQgMHgleFxuIiwgaHdfY29uZmlnLT5pb19iYXNlKTsKKwkJCXJldHVybiAwOworCX0KKworCS8qIFNldCB0aGUgTVBVIElSUSBiaXRzICovCisKKwlzd2l0Y2ggKGh3X2NvbmZpZy0+aXJxKQorCXsKKwkJY2FzZSA1OgorCQkJdG1wIHw9IDB4MTA7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJdG1wIHw9IDB4MTg7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJdG1wIHw9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCXRtcCB8PSAweDA4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIk1BRDE2OiBJbnZhbGlkIE1JREkgSVJRICVkXG4iLCBod19jb25maWctPmlycSk7CisJCQlicmVhazsKKwl9CisJCQkKKwltYWRfd3JpdGUoTUM2X1BPUlQsIHRtcCk7CS8qIFdyaXRlIE1QVTQwMSBjb25maWcgKi8KKworI2lmbmRlZiBDT05GSUdfTUFEMTZfT0xEQ0FSRAorcHJvYmVfNDAxOgorI2VuZGlmCisJaHdfY29uZmlnLT5kcml2ZXJfdXNlXzEgPSBTQl9NSURJX09OTFk7CisJaHdfY29uZmlnLT5uYW1lID0gIk1hZDE2L01vemFydCI7CisJcmV0dXJuIHByb2JlX3VhcnQ0MDEoaHdfY29uZmlnLCBUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfbWFkMTYoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWFkMTg0OF91bmxvYWQoaHdfY29uZmlnLT5pb19iYXNlICsgNCwKKwkJCWh3X2NvbmZpZy0+aXJxLAorCQkJaHdfY29uZmlnLT5kbWEsCisJCQlod19jb25maWctPmRtYTIsIDApOworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCk7CisJc291bmRfdW5sb2FkX2F1ZGlvZGV2KGh3X2NvbmZpZy0+c2xvdHNbMF0pOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX21hZDE2X21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisjaWZkZWYgQ09ORklHX01BRDE2X09MRENBUkQKKwlpZiAoYm9hcmRfdHlwZSA8IEM5MjkpCS8qIEVhcmx5IGNoaXAuIE5vIE1QVSBzdXBwb3J0LiBKdXN0IFNCIE1JREkgKi8KKwl7CisJCXNiX2RzcF91bmxvYWQoaHdfY29uZmlnLCAwKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJdW5sb2FkX3VhcnQ0MDEoaHdfY29uZmlnKTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21wdTsKKworc3RhdGljIGludCBmb3VuZF9tcHU7CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfaW8gPSAwOworc3RhdGljIGludCBfX2luaXRkYXRhIG1wdV9pcnEgPSAwOworc3RhdGljIGludCBfX2luaXRkYXRhIGlvID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMTYgPSAtMTsgLyogU2V0IHRoaXMgZm9yIG1vZHVsZXMgdGhhdCBuZWVkIGl0ICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgY2R0eXBlID0gMDsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBjZGlycSA9IDA7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgY2Rwb3J0ID0gMHgzNDA7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgY2RkbWEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBvcGw0ID0gMDsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBqb3lzdGljayA9IDA7CisKK21vZHVsZV9wYXJhbShtcHVfaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXB1X2lycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hMTYsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNkdHlwZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjZGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjZHBvcnQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2RkbWEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ob3BsNCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShqb3lzdGljaywgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIDA2NDQpOworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hX21hcFsyXVs4XSA9Cit7CisJezB4MDMsIC0xLCAtMSwgLTEsIC0xLCAweDAwLCAweDAxLCAweDAyfSwKKwl7MHgwMywgLTEsIDB4MDEsIDB4MDAsIC0xLCAtMSwgLTEsIC0xfQorfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGlycV9tYXBbMTZdID0KK3sKKwkweDAwLCAtMSwgLTEsIDB4MEEsCisJLTEsIDB4MDQsIC0xLCAweDA4LAorCS0xLCAweDEwLCAweDE0LCAweDE4LAorCS0xLCAtMSwgLTEsIC0xCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYWQxNl9yZWdpc3Rlcl9nYW1lcG9ydChpbnQgaW9fcG9ydCkKK3sKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvX3BvcnQsIDEsICJtYWQxNiBnYW1lcG9ydCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWFkMTY6IGdhbWVwb3J0IGFkZHJlc3MgMHglI3ggYWxyZWFkeSBpbiB1c2VcbiIsIGlvX3BvcnQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWdhbWVwb3J0ID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOworCWlmICghZ2FtZXBvcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWQxNjogY2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oaW9fcG9ydCwgMSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWdhbWVwb3J0X3NldF9uYW1lKGdhbWVwb3J0LCAiTUFEMTYgR2FtZXBvcnQiKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhnYW1lcG9ydCwgImlzYSUwNHgvZ2FtZXBvcnQwIiwgaW9fcG9ydCk7CisJZ2FtZXBvcnQtPmlvID0gaW9fcG9ydDsKKworCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQoZ2FtZXBvcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfbWFkMTYodm9pZCkKK3sKKwlpbnQgZG1hdHlwZSA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJNQUQxNiBhdWRpbyBkcml2ZXIgQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NlxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICJDRFJPTSAiKTsKKwlzd2l0Y2ggKGNkdHlwZSkKKwl7CisJCWNhc2UgMHgwMDoKKwkJCXByaW50aygiRGlzYWJsZWQiKTsKKwkJCWNkaXJxID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDI6CisJCQlwcmludGsoIlNvbnkgQ0RVMzFBIik7CisJCQlkbWF0eXBlID0gMTsKKwkJCWlmKGNkZG1hID09IC0xKSBjZGRtYSA9IDM7CisJCQlicmVhazsKKwkJY2FzZSAweDA0OgorCQkJcHJpbnRrKCJNaXRzdW1pIik7CisJCQlkbWF0eXBlID0gMDsKKwkJCWlmKGNkZG1hID09IC0xKSBjZGRtYSA9IDU7CisJCQlicmVhazsKKwkJY2FzZSAweDA2OgorCQkJcHJpbnRrKCJQYW5hc29uaWMgTGFzZXJtYXRlIik7CisJCQlkbWF0eXBlID0gMTsKKwkJCWlmKGNkZG1hID09IC0xKSBjZGRtYSA9IDM7CisJCQlicmVhazsKKwkJY2FzZSAweDA4OgorCQkJcHJpbnRrKCJTZWNvbmRhcnkgSURFIik7CisJCQlkbWF0eXBlID0gMDsKKwkJCWlmKGNkZG1hID09IC0xKSBjZGRtYSA9IDU7CisJCQlicmVhazsKKwkJY2FzZSAweDBBOgorCQkJcHJpbnRrKCJQcmltYXJ5IElERSIpOworCQkJZG1hdHlwZSA9IDA7CisJCQlpZihjZGRtYSA9PSAtMSkgY2RkbWEgPSA1OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgQ0RST00gdHlwZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqICAgIEJ1aWxkIHRoZSBjb25maWcgd29yZHMKKwkgKi8KKworCW1hZDE2X2NvbmYgPSAoam95c3RpY2sgXiAxKSB8IGNkdHlwZTsKKwltYWQxNl9jZHNlbCA9IDA7CisJaWYgKG9wbDQpCisJCW1hZDE2X2Nkc2VsIHw9IDB4MjA7CisKKwlpZihjZHR5cGUpeworCQlpZiAoY2RkbWEgPiA3IHx8IGNkZG1hIDwgMCB8fCBkbWFfbWFwW2RtYXR5cGVdW2NkZG1hXSA9PSAtMSkKKwkJeworCQkJcHJpbnRrKCJcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIENEUk9NIERNQVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY2RkbWEpCisJCQlwcmludGsoIiwgRE1BICVkIiwgY2RkbWEpOworCQllbHNlCisJCQlwcmludGsoIiwgbm8gRE1BIik7CisKKwkJaWYgKCFjZGlycSkKKwkJCXByaW50aygiLCBubyBJUlEiKTsKKwkJZWxzZSBpZiAoY2RpcnEgPCAwIHx8IGNkaXJxID4gMTUgfHwgaXJxX21hcFtjZGlycV0gPT0gLTEpCisJCXsKKwkJCXByaW50aygiLCBpbnZhbGlkIElSUSAoZGlzYWJsaW5nKSIpOworCQkJY2RpcnEgPSAwOworCQl9CisJCWVsc2UgcHJpbnRrKCIsIElSUSAlZCIsIGNkaXJxKTsKKworCQltYWQxNl9jZHNlbCB8PSBkbWFfbWFwW2RtYXR5cGVdW2NkZG1hXTsKKworCQlpZiAoY2R0eXBlIDwgMHgwOCkKKwkJeworCQkJc3dpdGNoIChjZHBvcnQpCisJCQl7CisJCQkJY2FzZSAweDM0MDoKKwkJCQkJbWFkMTZfY2RzZWwgfD0gMHgwMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDMzMDoKKwkJCQkJbWFkMTZfY2RzZWwgfD0gMHg0MDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDM2MDoKKwkJCQkJbWFkMTZfY2RzZWwgfD0gMHg4MDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDMyMDoKKwkJCQkJbWFkMTZfY2RzZWwgfD0gMHhDMDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIENEUk9NIEkvTyBiYXNlICVkXG4iLCBjZHBvcnQpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCQltYWQxNl9jZHNlbCB8PSBpcnFfbWFwW2NkaXJxXTsKKwl9CisKKwlwcmludGsoIi5cbiIpOworCisJY2ZnLmlvX2Jhc2UgPSBpbzsKKwljZmcuaXJxID0gaXJxOworCWNmZy5kbWEgPSBkbWE7CisJY2ZnLmRtYTIgPSBkbWExNjsKKworCWlmIChjZmcuaW9fYmFzZSA9PSAtMSB8fCBjZmcuZG1hID09IC0xIHx8IGNmZy5pcnEgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJL08sIERNQSBhbmQgaXJxIGFyZSBtYW5kYXRvcnlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKE1DMF9QT1JULCAxMiwgIm1hZDE2IikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIXByb2JlX21hZDE2KCZjZmcpKSB7CisJCXJlbGVhc2VfcmVnaW9uKE1DMF9QT1JULCAxMik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNmZ19tcHUuaW9fYmFzZSA9IG1wdV9pbzsKKwljZmdfbXB1LmlycSA9IG1wdV9pcnE7CisKKwlmb3VuZF9tcHUgPSBwcm9iZV9tYWQxNl9tcHUoJmNmZ19tcHUpOworCisJaWYgKGpveXN0aWNrKQorCQltYWQxNl9yZWdpc3Rlcl9nYW1lcG9ydCgweDIwMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbWFkMTYodm9pZCkKK3sKKwlpZiAoZm91bmRfbXB1KQorCQl1bmxvYWRfbWFkMTZfbXB1KCZjZmdfbXB1KTsKKwlpZiAoZ2FtZXBvcnQpIHsKKwkJLyogdGhlIGdhbWVwb3J0IHdhcyBpbml0aWFsaXplZCBzbyB3ZSBtdXN0IGZyZWUgaXQgdXAgKi8KKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGdhbWVwb3J0KTsKKwkJZ2FtZXBvcnQgPSBOVUxMOworCQlyZWxlYXNlX3JlZ2lvbigweDIwMSwgMSk7CisJfQorCXVubG9hZF9tYWQxNigmY2ZnKTsKKwlyZWxlYXNlX3JlZ2lvbihNQzBfUE9SVCwgMTIpOworfQorCittb2R1bGVfaW5pdChpbml0X21hZDE2KTsKK21vZHVsZV9leGl0KGNsZWFudXBfbWFkMTYpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfbWFkMTYoY2hhciAqc3RyKQoreworCS8qIGlvLCBpcnEgKi8KKwlpbnQgaW50c1s4XTsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpbwkgPSBpbnRzWzFdOworCWlycQkgPSBpbnRzWzJdOworCWRtYQkgPSBpbnRzWzNdOworCWRtYTE2CSA9IGludHNbNF07CisJbXB1X2lvCSA9IGludHNbNV07CisJbXB1X2lycSAgPSBpbnRzWzZdOworCWpveXN0aWNrID0gaW50c1s3XTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJtYWQxNj0iLCBzZXR1cF9tYWQxNik7CisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tYWVzdHJvLmMgYi9zb3VuZC9vc3MvbWFlc3Ryby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDJkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbWFlc3Ryby5jCkBAIC0wLDAgKzEsMzgzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBFU1MgTWFlc3Ryby9NYWVzdHJvLTIvTWFlc3Ryby0yRSBkcml2ZXIgZm9yIExpbnV4IDIuWzIzXS54CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5OQkgQWxhbiBDb3ggPGFsYW4uY294QGxpbnV4Lm9yZz4KKyAqCisgKglCYXNlZCBoZWF2aWx5IG9uIFNvbmljVmliZXMuYzoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgIFRob21hcyBTYWlsZXIgKHNhaWxlckBpZmUuZWUuZXRoei5jaCkKKyAqCisgKglIZWF2aWx5IG1vZGlmaWVkIGJ5IFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+IGJhc2VkIG9uIGx1bmNoCisgKgl3aXRoIEVTUyBlbmdpbmVlcnMuICBNYW55IHRoYW5rcyB0byBIb3dhcmQgS2ltIGZvciBwcm92aWRpbmcgCisgKgljb250YWN0cyBhbmQgaGFyZHdhcmUuICBIb25vcmFibGUgbWVudGlvbiBnb2VzIHRvIEVyaWMgCisgKglCcm9tYmF1Z2ggZm9yIGFsbCBzb3J0cyBvZiB0aGluZ3MuICBCZXN0IHJlZ2FyZHMgdG8gdGhlIAorICoJcHJvcHJpZXRvcnMgb2YgSGFjayBDZW50cmFsIGZvciBmaW5lIGxvZGdpbmcuCisgKgorICogIFN1cHBvcnRlZCBkZXZpY2VzOgorICogIC9kZXYvZHNwMC0zICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21peGVyICBzdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqCisgKiAgSGFyZHdhcmUgRGVzY3JpcHRpb24KKyAqCisgKglBIHdvcmtpbmcgTWFlc3RybyBzZXR1cCBjb250YWlucyB0aGUgTWFlc3RybyBjaGlwIHdpcmVkIHRvIGEgCisgKgljb2RlYyBvciAyLiAgSW4gdGhlIE1hZXN0cm8gd2UgaGF2ZSB0aGUgQVBVcywgdGhlIEFTU1AsIGFuZCB0aGUKKyAqCVdhdmVjYWNoZS4gIFRoZSBBUFVzIGNhbiBiZSB0aG91Z2ggb2YgYXMgdmlydHVhbCBhdWRpbyByb3V0aW5nCisgKgljaGFubmVscy4gIFRoZXkgY2FuIHRha2UgZGF0YSBmcm9tIGEgbnVtYmVyIG9mIHNvdXJjZXMgYW5kIHBlcmZvcm0KKyAqCWJhc2ljIGVuY29kaW5ncyBvZiB0aGUgZGF0YS4gIFRoZSB3YXZlY2FjaGUgaXMgYSBzdG9yZWhvdXNlIGZvcgorICoJUENNIGRhdGEuICBUeXBpY2FsbHkgaXQgZGVhbHMgd2l0aCBQQ0kgYW5kIGludGVycmFjdHMgd2l0aCB0aGUKKyAqCUFQVXMuICBUaGUgQVNTUCBpcyBhIHdhY2t5IERTUCBsaWtlIGRldmljZSB0aGF0IEVTUyBpcyBsb3RoCisgKgl0byByZWxlYXNlIGRvY3Mgb24uICBUaGFua2Z1bGx5IGl0IGlzbid0IHJlcXVpcmVkIG9uIHRoZSBNYWVzdHJvCisgKgl1bnRpbCB5b3Ugc3RhcnQgZG9pbmcgaW5zYW5lIHRoaW5ncyBsaWtlIEZNIGVtdWxhdGlvbiBhbmQgc3Vycm91bmQKKyAqCWVuY29kaW5nLiAgVGhlIGNvZGVjcyBhcmUgYWxtb3N0IGFsd2F5cyBBQy05NyBjb21wbGlhbnQgY29kZWNzLCAKKyAqCWJ1dCBpdCBhcHBlYXJzIHRoYXQgZWFybHkgTWFlc3Ryb3MgbWF5IGhhdmUgaGFkIFBUMTAxIChhbiBFU1MKKyAqCXBhcnQ/KSB3aXJlZCB0byB0aGVtLiAgVGhlIG9ubHkgcmVhbCBkaWZmZXJlbmNlIGluIHRoZSBNYWVzdHJvCisgKglmYW1pbGllcyBpcyBleHRlcm5hbCBnb29wIGxpa2UgZG9ja2luZyBjYXBhYmlsaXR5LCBtZW1vcnkgZm9yCisgKgl0aGUgQVNTUCwgYW5kIGluaXRpYWxpemF0aW9uIGRpZmZlcmVuY2VzLgorICoKKyAqICBEcml2ZXIgT3BlcmF0aW9uCisgKgorICoJV2Ugb25seSBkcml2ZSB0aGUgQVBVL1dhdmVjYWNoZSBhcyB0eXBpY2FsIERBQ3MgYW5kIGRyaXZlIHRoZQorICoJbWl4ZXJzIGluIHRoZSBjb2RlY3MuICBUaGVyZSBhcmUgNjQgQVBVcy4gIFdlIGFzc2lnbiA2IHRvIGVhY2gKKyAqCS9kZXYvZHNwPyBkZXZpY2UuICAyIGNoYW5uZWxzIGZvciBvdXRwdXQsIGFuZCA0IGNoYW5uZWxzIGZvcgorICoJaW5wdXQuCisgKgorICoJRWFjaCBBUFUgY2FuIGRvIGEgbnVtYmVyIG9mIHRoaW5ncywgYnV0IHdlIG9ubHkgcmVhbGx5IHVzZQorICoJMyBiYXNpYyBmdW5jdGlvbnMuICBGb3IgcGxheWJhY2sgd2UgdXNlIHRoZW0gdG8gY29udmVydCBQQ00KKyAqCWRhdGEgZmV0Y2hlZCBvdmVyIFBDSSBieSB0aGUgd2F2ZWNhaGNoZSBpbnRvIGFuYWxvZyBkYXRhIHRoYXQKKyAqCWlzIGhhbmRlZCB0byB0aGUgY29kZWMuICBPbmUgQVBVIGZvciBtb25vLCBhbmQgYSBwYWlyIGZvciBzdGVyZW8uCisgKglXaGVuIGluIHN0ZXJlbywgdGhlIGNvbWJpbmF0aW9uIG9mIHNtYXJ0cyBpbiB0aGUgQVBVIGFuZCBXYXZlY2FjaGUKKyAqCWRlY2lkZSB3aGljaCB3YXZlY2FjaGUgZ2V0cyB0aGUgbGVmdCBvciByaWdodCBjaGFubmVsLgorICoKKyAqCUZvciByZWNvcmQgd2Ugc3RpbGwgdXNlIHRoZSBvbGQgb3Zlcmx5IG1vbm8gc3lzdGVtLiAgRm9yIGVhY2ggaW4KKyAqCWNvbWluZyBjaGFubmVsIHRoZSBkYXRhIGNvbWVzIGluIGZyb20gdGhlIGNvZGVjLCB0aHJvdWdoIGEgJ2lucHV0JworICoJQVBVLCB0aHJvdWdoIGFub3RoZXIgcmF0ZSBjb252ZXJ0ZXIgQVBVLCBhbmQgdGhlbiBpbnRvIG1lbW9yeSB2aWEKKyAqCXRoZSB3YXZlY2FjaGUgYW5kIFBDSS4gIElmIGl0cyBzdGVyZW8sIHdlIG1hc2ggaXQgYmFjayBpbnRvIExSTFIgaW4KKyAqCXNvZnR3YXJlLiAgVGhlIHBhc3MgYmV0d2VlbiB0aGUgMiBBUFVzIGlzIHN1cHBvc2VkbHkgd2hhdCByZXF1aXJlcyB1cworICoJdG8gaGF2ZSBhIDUxMiBieXRlIGJ1ZmZlciBzaXR0aW5nIGFyb3VuZCBpbiB3YXZlY2FjaGUvbWVtb3J5LgorICoKKyAqCVRoZSB3YXZlY2FjaGUgbWFrZXMgb3VyIGxpZmUgZXZlbiBtb3JlIGZ1bi4gIEZpcnN0IG9mZiwgaXQgY2FuCisgKglvbmx5IGFkZHJlc3MgdGhlIGZpcnN0IDI4IGJpdHMgb2YgUENJIGFkZHJlc3Mgc3BhY2UsIG1ha2luZyBpdAorICoJdXNlbGVzcyBvbiBxdWl0ZSBhIGZldyBhcmNoaXRlY3R1cmVzLiAgU2Vjb25kbHksIGl0cyBpbnNhbmUuCisgKglJdCBjbGFpbXMgdG8gZmV0Y2ggZnJvbSA0IHJlZ2lvbnMgb2YgUENJIHNwYWNlLCBlYWNoIDQgbWVnIGluIGxlbmd0aC4KKyAqCUJ1dCB0aGF0IGRvZXNuJ3QgcmVhbGx5IHdvcmsuICBZb3UgY2FuIG9ubHkgdXNlIDEgcmVnaW9uLiAgU28gYWxsIG91cgorICoJYWxsb2NhdGlvbnMgaGF2ZSB0byBiZSBpbiA0bWVnIG9mIGVhY2ggb3RoZXIuICBCb29vLiAgSGlzcy4KKyAqCVNvIHdlIGhhdmUgYSBtb2R1bGUgcGFyYW1ldGVyLCBkc3BzX29yZGVyLCB0aGF0IGlzIHRoZSBvcmRlciBvZgorICoJdGhlIG51bWJlciBvZiBkc3BzIHRvIHByb3ZpZGUuICBBbGwgdGhlaXIgYnVmZmVyIHNwYWNlIGlzIGFsbG9jYXRlZAorICoJb24gb3BlbiB0aW1lLiAgVGhlIHNvbmljdmliZXMgT1NTIHJvdXRpbmVzIHdlIGluaGVyaXRlZCByZWFsbHkgd2FudAorICoJcG93ZXIgb2YgMiBidWZmZXJzLCBzbyB3ZSBoYXZlIGFsbCB0aG9zZSBuZXh0IHRvIGVhY2ggb3RoZXIsIHRoZW4KKyAqCTUxMiBieXRlIHJlZ2lvbnMgZm9yIHRoZSByZWNvcmRpbmcgd2F2ZWNhY2hlcy4gIFRoaXMgZW5kcyB1cAorICoJd2FzdGluZyBxdWl0ZSBhIGJpdCBvZiBtZW1vcnkuICBUaGUgb25seSBmaXhlcyBJIGNhbiBzZWUgd291bGQgYmUgCisgKglnZXR0aW5nIGEga2VybmVsIGFsbG9jYXRvciB0aGF0IGNvdWxkIHdvcmsgaW4gem9uZXMsIG9yIGZpZ3VyaW5nIG91dAorICoJanVzdCBob3cgdG8gY29lcmNlIHRoZSBXUCBpbnRvIGRvaW5nIHdoYXQgd2Ugd2FudC4KKyAqCisgKglUaGUgaW5kaXJlY3Rpb24gb2YgdGhlIHZhcmlvdXMgcmVnaXN0ZXJzIG1lYW5zIHdlIGhhdmUgdG8gc3BpbmxvY2sKKyAqCW5lYXJseSBhbGwgcmVnaXN0ZXIgYWNjZXNzZXMuICBXZSBoYXZlIHRoZSBtYWluIHJlZ2lzdGVyIGluZGlyZWN0aW9uCisgKglsaWtlIHRoZSB3YXZlIGNhY2hlLCBtYWVzdHJvIHJlZ2lzdGVycywgZXRjLiAgVGhlbiB3ZSBoYXZlIGJlYXN0cworICoJbGlrZSB0aGUgQVBVIGludGVyZmFjZSB0aGF0IGlzIGluZGlyZWN0IHJlZ2lzdGVycyBnb3R0ZW4gYXQgdGhyb3VnaAorICoJdGhlIG1haW4gbWFlc3RybyBpbmRpcmVjdGlvbi4gIE91Y2guICBXZSBzcGlubG9jayBhcm91bmQgdGhlIGFjdHVhbAorICoJcG9ydHMgb24gYSBwZXIgY2FyZCBiYXNpcy4gIFRoaXMgbWVhbnMgc3BpbmxvY2sgYWN0aXZpdHkgYXQgZWFjaCBJTworICoJb3BlcmF0aW9uLCBidXQgdGhlIG9ubHkgSU8gb3BlcmF0aW9uIGNsdXN0ZXJzIGFyZSBpbiBub24gY3JpdGljYWwgCisgKglwYXRocyBhbmQgaXQgbWFrZXMgdGhlIGNvZGUgZmFyIGVhc2llciB0byBmb2xsb3cuICBJbnRlcnJ1cHRzIGFyZQorICoJYmxvY2tlZCB3aGlsZSBob2xkaW5nIHRoZSBsb2NrcyBiZWNhdXNlIHRoZSBpbnQgaGFuZGxlciBoYXMgdG8KKyAqCWdldCBhdCBzb21lIG9mIHRoZW0gOiguICBUaGUgbWl4ZXIgaW50ZXJmYWNlIGRvZXNuJ3QsIGhvd2V2ZXIuCisgKglXZSBhbHNvIGhhdmUgYW4gT1NTIHN0YXRlIGxvY2sgdGhhdCBpcyB0aHJvd24gYXJvdW5kIGluIGEgZmV3CisgKglwbGFjZXMuCisgKgorICoJVGhpcyBkcml2ZXIgaGFzIGJydXRlIGZvcmNlIEFQTSBzdXNwZW5kIHN1cHBvcnQuICBXZSBjYXRjaCBzdXNwZW5kCisgKglub3RpZmljYXRpb25zIGFuZCBzdG9wIGFsbCB3b3JrIGJlaW5nIGRvbmUgb24gdGhlIGNoaXAuICBBbnkgcGVvcGxlCisgKgl0aGF0IHRyeSBiZXR3ZWVuIHRoaXMgc2h1dGRvd24gYW5kIHRoZSByZWFsIHN1c3BlbmQgb3BlcmF0aW9uIHdpbGwKKyAqCWJlIHB1dCB0byBzbGVlcC4gIFdoZW4gd2UgcmVzdW1lIHdlIHJlc3RvcmUgb3VyIHNvZnR3YXJlIHN0YXRlIG9uCisgKgl0aGUgY2hpcCBhbmQgd2FrZSB1cCB0aGUgcGVvcGxlIHRoYXQgd2VyZSB1c2luZyBpdC4gIFRoZSBjb2RlIHRoYXRzCisgKgliZWluZyB1c2VkIG5vdyBpcyBxdWl0ZSBkaXJ0eSBhbmQgYXNzdW1lcyB3ZSdyZSBvbiBhIHVuaS1wcm9jZXNzb3IKKyAqCW1hY2hpbmUuICBNdWNoIG9mIGl0IHdpbGwgbmVlZCB0byBiZSBjbGVhbmVkIHVwIGZvciBTTVAgQUNQSSBvciAKKyAqCXNpbWlsYXIuCisgKgorICoJV2UgYWxzbyBwYXkgYXR0ZW50aW9uIHRvIFBDSSBwb3dlciBtYW5hZ2VtZW50IG5vdy4gIFRoZSBkcml2ZXIKKyAqCXdpbGwgcG93ZXIgZG93biB1bml0cyBvZiB0aGUgY2hpcCB0aGF0IGl0IGtub3dzIGFyZW4ndCBuZWVkZWQuCisgKglUaGUgV2F2ZVByb2Nlc3NvciBhbmQgY29tcGFueSBhcmUgb25seSBwb3dlcmVkIG9uIHdoZW4gcGVvcGxlCisgKgloYXZlIC9kZXYvZHNwKnMgb3Blbi4gIE9uIHJlbW92YWwgdGhlIGRyaXZlciB3aWxsCisgKglwb3dlciBkb3duIHRoZSBtYWVzdHJvIGVudGlyZWx5LiAgVGhlcmUgY291bGQgc3RpbGwgYmUKKyAqCXRyb3VibGUgd2l0aCBCSU9TZW4gdGhhdCBtYWdpY2FsbHkgY2hhbmdlIHBvd2VyIHN0YXRlcyAKKyAqCXRoZW1zZWx2ZXMsIGJ1dCB3ZSdsbCBzZWUuICAKKyAqCQorICogSGlzdG9yeQorICogIHYwLjE1IC0gTWF5IDIxIDIwMDEgLSBNYXJjdXMgTWVpc3NuZXIgPG1tQGNhbGRlcmEuZGU+CisgKiAgICAgIFBvcnRlZCB0byBMaW51eCAyLjQgUENJIEFQSS4gU29tZSBjbGVhbiB1cHMsIGdsb2JhbCBkZXZzIGxpc3QKKyAqICAgICAgcmVtb3ZlZCAobm93IHVzaW5nIHBjaSBkZXZpY2UgZHJpdmVyIGRhdGEpLgorICogICAgICBQTSBuZWVkcyB0byBiZSBwb2xpc2hlZCBzdGlsbC4gQnVtcGVkIHZlcnNpb24uCisgKiAgKHN0aWxsIGtpbmQgb2YgdjAuMTQpIE1heSAxMyAyMDAxIC0gQmVuIFBmYWZmIDxwZmFmZmJlbkBtc3UuZWR1PgorICogICAgICBBZGQgc3VwcG9ydCBmb3IgOTc4IGRvY2tpbmcgYW5kIGJhc2ljIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sCisgKiAgKHN0aWxsIGtpbmQgb2YgdjAuMTQpIE5vdiAyMyAtIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKglBZGQgY2xvY2tpbmc9IGZvciBwZW9wbGUgd2l0aCBzZXJpb3VzbHkgd2FycGVkIGhhcmR3YXJlCisgKiAgKHN0aWxsIHYwLjE0KSBOb3YgMTAgMjAwMCAtIEJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGJrekBsaW51eC1pZGUub3JnPgorICoJYWRkIF9faW5pdCB0byBtYWVzdHJvX2FjOTdfaW5pdCgpIGFuZCBtYWVzdHJvX2luc3RhbGwoKQorICogIChzdGlsbCBiYXNlZCBvbiB2MC4xNCkgTWFyIDI5IDIwMDAgLSBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KKyAqCW1vdmUgdG8gMi4zIHBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlLCB3aGljaAorICoJCXJlcXVpcmVkIGhhY2tpbmcgc29tZSBzdXNwZW5kL3Jlc3VtZS9jaGVjayBwYXRocyAKKyAqCW1ha2Ugc3RhdGljIGNvbXBpbGF0aW9uIHdvcmsKKyAqICB2MC4xNCAtIEphbiAyOCAyMDAwIC0gWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CisgKglhZGQgUENJIHBvd2VyIG1hbmFnZW1lbnQgdGhyb3VnaCBBQ1BJIHJlZ3MuCisgKgl3ZSBub3cgc2h1dCBkb3duIG9uIG1hY2hpbmUgcmVib290L2hhbHQKKyAqCWxlYXZlIHNjYXJ5IFBDSSBjb25maWcgaXRlbXMgYWxvbmUgKGlzYSBzdHVmZiwgbW9zdGx5KQorICoJZW5hYmxlIDE5MjFzLCBpdCBzZWVtcyBvbmx5IG1pbmUgd2FzIGJyb2tlLgorICoJZml4IHN3YXBwZWQgbGVmdC9yaWdodCBwY20gZGFjLiAgaGFyIGhhci4KKyAqCXVwIGJvYiBmcmVxLCBpbmNyZWFzZSBidWZmZXJzLCBmaXggcG9pbnRlcnMgYXQgdW5kZXJmbG93CisgKglzaWxseSBjb21waWxhdGlvbiBwcm9ibGVtcworICogIHYwLjEzIC0gTm92IDE4IDE5OTkgLSBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KKyAqCWZpeCBuZWMgVmVyc2FzPyAgbWFuIHdvdWxkIHRoYXQgYmUgY29vbC4KKyAqICB2MC4xMiAtIE5vdiAxMiAxOTk5IC0gWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CisgKglicm93biBiYWcgdm9sdW1lIG1heCBmaXguLgorICogIHYwLjExIC0gTm92IDExIDE5OTkgLSBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KKyAqCXVzZSBwcm9wZXIgc3RlcmVvIGFwdSBkZWNvZGluZywgbW1hcC93cml0ZSBzaG91bGQgd29yay4KKyAqCW1ha2Ugdm9sdW1lIHNsaWRlcnMgbW9yZSB1c2VmdWwsIHR3ZWFrIHJhdGUgY2FsY3VsYXRpb24uCisgKglmaXggbGFtZSA4Yml0IGZvcm1hdCByZXBvcnRpbmcgYnVnLiAgZHVoLiBhcG0gYXB1IHNhdmluZyBidWdsZXQgYWxzbworICoJZml4IG1hZXN0cm8gMSBjbG9jayBmcmVxICJidWciLCByZW1vdmUgcHQxMDEgc3VwcG9ydAorICogIHYwLjEwIC0gT2N0IDI4IDE5OTkgLSBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KKyAqCWFoYSwgc28sIHNvbWV0aW1lcyB0aGUgV1Agd3JpdGVzIGEgc3RhdHVzIHdvcmQgdG8gb2Zmc2V0IDAKKyAqCSAgZnJvbSBvbmUgb2YgdGhlIFBDTUJBUnMuICByZWFycmFuZ2UgYWxsb2NhdGlvbiBhY2NvcmRpbmdseS4uCisgKgkgIGNoZWVycyBhZ2FpbiB0byBFcmljIGZvciBiZWluZyBhIGdvb2QgaGFja2VyIGluIGludmVzdGlnYXRpbmcgdGhpcy4KKyAqCUplcm9lbiBIb29nZXJ2b3JzdCBzdWJtaXRzIDc1MDAgZml4IG91dCBvZiBub3doZXJlLiAgeWF5LiAgOikKKyAqICB2MC4wOSAtIE9jdCAyMyAxOTk5IC0gWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CisgKglhZGRlZCBBUE0gc3VwcG9ydC4KKyAqCXJlLW9yZGVyIHNvbWV0aGluZyBzdWNoIHRoYXQgc29tZSAyRXMgbm93IHdvcmsuICBNYWdpYyEKKyAqCW5ldyBjb2RlYyByZXNldCByb3V0aW5lLiAgbWFkZSBzb21lIGNvZGVjcyBjb21lIHRvIGxpZmUuCisgKglmaXggY2xlYXJfYWR2YW5jZSwgc3luYyBzb21lIGNvbnRyb2wgd2l0aCBFU1MuCisgKglub3cgd3JpdGUgdG8gYWxsIGJhc2UgcmVncyB0byBiZSBwYXJhbm9pZC4KKyAqICB2MC4wOCAtIE9jdCAyMCAxOTk5IC0gWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CisgKglGaXggaW5pdGlhbCBidWZsZW4gYnVnLiAgSSBhbSBzbyBzbWFydC4gIGFsc28gc21wIGNvbXBpbGluZy4uCisgKglJIG93ZSBFcmljIHlldCBhbm90aGVyIGJlZXI6IGZpeGVkIHJlY21hc2ssIGlnYWluLCAKKyAqCSAgbXV0aW5nLCBhbmQgYWRjIHN5bmMgY29uc2lzdGVuY3kuICBHbyBUZWFtLgorICogIHYwLjA3IC0gT2N0IDQgMTk5OSAtIFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPgorICoJdHdlYWsgYWRjL2RhYywgZm9ybWF0aW5nLCBhbmQgc3R1ZmYgdG8gYWxsb3cgZnVsbCBkdXBsZXgKKyAqCWFsbG9jYXRlIGRzcHMgbWVtb3J5IGF0IG9wZW4oKSBzbyB3ZSBjYW4gZml0IGluIHRoZSB3YXZlY2FjaGUgd2luZG93CisgKglmaXggd2F2ZWNhY2hlIGJyYWluZGFtYWdlLiAgYWdhaW4uICBubyBtb3JlIHNjcmliYmxpbmc/CisgKglmaXggZXNzIDE5MjEgY29kZWMgYnVnIG9uIHNvbWUgbGFwdG9wcy4KKyAqCWZpeCBkdW1iIHBjaSBzY2FubmluZyBidWcKKyAqCXN0YXJ0ZWQgMi4zIGNsZWFudXAsIHJlZGlkIHNwaW5sb2NrcywgbGl0dGxlIGNsZWFudXBzCisgKiAgdjAuMDYgLSBTZXAgMjAgMTk5OSAtIFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPgorICoJZml4IHdhdmVjYWNoZSB0aGlua29zLiAgbGltaXQgdG8gMSAvZGV2L2RzcC4KKyAqCWVyaWMgaXMgd2VhcmluZyBoaXMgdGhpbmtpbmcgdG9xdWUgdGhpcyB3ZWVrLgorICoJCXNwb3R0ZWQgYXB1IG1vZGUgYnVncyBhbmQgZ2FpbiByYW1waW5nIHByb2JsZW0KKyAqCWRvbid0IHRvdWNoIHdlaXJkIG1peGVyIHJlZ3MsIG1ha2UgcmVjbWFzayBvcHRpb25hbAorICoJZml4ZWQgaWdhaW4gaW52ZXJzaW9uLCBkZWZhdWx0cyBmb3IgbWl4ZXJzLCBjbGVhbiB1cCByZWNfc3RhcnQKKyAqCW1ha2UgbW9ubyByZWNvcmRpbmcgd29yay4KKyAqCXJlcG9ydCBzdWJzeXN0ZW0gc3R1ZmYsIHBsZWFzZSBzZW5kIHJlcG9ydHMuCisgKglsaXR0bGVzOiBwYXJhbGxlbCBvdXQsIGFtcCBub3cKKyAqICB2MC4wNSAtIFNlcCAxNyAxOTk5IC0gWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CisgKgltZXJnZWQgYW5kIGZpeGVkIHVwIEVyaWMncyBpbml0aWFsIHJlY29yZGluZyBjb2RlCisgKgltdW5nZWQgZm9ybWF0IGhhbmRsaW5nIHRvIGNhdGNoIG1pc3VzZSwgbmVlZHMgcmV3cml0ZS4KKyAqCXJldmVydCByaW5nIGJ1cyBpbml0LCBmaXh1cCBzaGFyZWQgaW50LCBhZGQgcGNpIGJ1c21hc3RlciBzZXR0aW5nCisgKglmaXggbWl4ZXIgb3NzIGludGVyZmFjZSwgZml4IG1pYyBtdXRlIGFuZCByZWNtYXNrCisgKgltYXNrIG9mZiB1bnN1cHBvcnRlZCBtaXhlcnMsIHJlc2V0IHdpdGggYWxsIDFzLCBtb2R1bGFyaXplIGRlZmF1bHRzCisgKgltYWtlIHN1cmUgYm9iIGlzIHJ1bm5pbmcgd2hpbGUgd2UgbmVlZCBpdAorICoJZ290IHJpZCBvZiBkZXZpY2UgbGltaXQsIGluaXRpYWwgbWluaW1hbCBhcG0gaG9va3MKKyAqCXB1bGwgb3V0IGRlYWQgY29kZS9pbmNsdWRlcywgb25seSBhbGxvdyBtdWx0aW1lZGlhL2F1ZGlvIG1hZXN0cm9zCisgKiAgdjAuMDQgLSBTZXAgMDEgMTk5OSAtIFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPgorICoJY29waWVkIG1lbW9yeSBsZWFrIGZpeCBmcm9tIHNvbmljdmliZXMgZHJpdmVyCisgKglkaWZmZXJlbnQgYWM5NyByZXNldCwgcGxheSB3aXRoIDIuMCBhYzk3LCBzaW1wbGlmeSByaW5nIGJ1cyBzZXR1cAorICoJYm9iIGZyZXEgY29kZSwgcmVnaW9uIHNhbml0eSwgaml0dGVyIHN5bmMgZml4OyBhbGwgZnJvbSBFcmljIAorICoKKyAqIFRPRE8KKyAqCWZpeCBib2IgZnJlcXVlbmN5CisgKgllbmRpYW5uZXNzCisgKglkbyBzbWFydCB0aGluZ3Mgd2l0aCBhYzk3IDIuMCBiaXRzLgorICoJZHVhbCBjb2RlY3MKKyAqCWxlYXZlIDU0LT42MSBvcGVuCisgKgorICoJaXQgYWxzbyB3b3VsZCBiZSBmdW4gdG8gaGF2ZSBhIG1vZGUgdGhhdCB3b3VsZCBub3QgdXNlIHBjaSBkbWEgYXQgYWxsCisgKglidXQgd291bGQgY29weSBpbnRvIHRoZSB3YXZlY2FjaGUgb24gYm9hcmQgbWVtb3J5IGFuZCB1c2UgdGhhdCAKKyAqCW9uIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBsaWtlIHRoZSBtYWVzdHJvJ3MgcGNpIGRtYSBpY2tpbmVzcy4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorc3RhdGljIGludCBtYWVzdHJvX3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmQpOworCisjaW5jbHVkZSAibWFlc3Ryby5oIgorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbWFlc3Ryb19wY2lfZHJpdmVyOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNX0RFQlVHIDEKKworI2lmZGVmIE1fREVCVUcKK3N0YXRpYyBpbnQgZGVidWc7CisjZGVmaW5lIE1fcHJpbnRrKGFyZ3MuLi4pIHtpZiAoZGVidWcpIHByaW50ayhhcmdzKTt9CisjZWxzZQorI2RlZmluZSBNX3ByaW50ayh4KQorI2VuZGlmCisKKy8qIHdlIHRyeSB0byBzZXR1cCAyXihkc3BzX29yZGVyKSAvZGV2L2RzcCBkZXZpY2VzICovCitzdGF0aWMgaW50IGRzcHNfb3JkZXI7CisvKiB3aGV0aGVyIG9yIG5vdCB3ZSBtZXNzIGFyb3VuZCB3aXRoIHBvd2VyIG1hbmFnZW1lbnQgKi8KK3N0YXRpYyBpbnQgdXNlX3BtPTI7IC8qIHNldCB0byAxIGZvciBmb3JjZSAqLworLyogY2xvY2tpbmcgZm9yIGJyb2tlbiBoYXJkd2FyZSAtIGEgZmV3IGxhcHRvcHMgc2VlbSB0byB1c2UgYSA1MEtoeiBjbG9jaworCWllIGluc21vZCB3aXRoIGNsb2NraW5nPTUwMDAwIG9yIHNvICovCisJCitzdGF0aWMgaW50IGNsb2NraW5nPTQ4MDAwOworCitNT0RVTEVfQVVUSE9SKCJaYWNoIEJyb3duIDx6YWJAemFiYm8ubmV0PiwgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRVNTIE1hZXN0cm8gRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBNX0RFQlVHCittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIDA2NDQpOworI2VuZGlmCittb2R1bGVfcGFyYW0oZHNwc19vcmRlciwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfcG0sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2xvY2tpbmcsIGludCwgMCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4xNSIKKworI2lmbmRlZiBQQ0lfVkVORE9SX0VTUworI2RlZmluZSBQQ0lfVkVORE9SX0VTUwkJCTB4MTI1RAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VTU19FU1MxOTY4CTB4MTk2OAkJLyogTWFlc3RybyAyCSovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0VTUzE5NzggICAgICAJMHgxOTc4CQkvKiBNYWVzdHJvIDJFCSovCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9FU1NfT0xECQkweDEyODUJCS8qIFBsYXRmb3JtIFRlY2gsIAorCQkJCQkJdGhlIHBlb3BsZSB0aGUgbWFlc3RybyAKKwkJCQkJCXdhcyBib3VnaHQgZnJvbSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VTU19FU1MwMTAwCTB4MDEwMAkJLyogbWFlc3RybyAxICovCisjZW5kaWYgLyogUENJX1ZFTkRPUl9FU1MgKi8KKworI2RlZmluZSBFU1NfQ0hBTl9IQVJECQkweDEwMAorCisvKiBORUMgVmVyc2FzID8gKi8KKyNkZWZpbmUgTkVDX1ZFUlNBX1NVQklEMQkweDgwNTgxMDMzCisjZGVmaW5lIE5FQ19WRVJTQV9TVUJJRDIJMHg4MDNjMTAzMworCisKKy8qIGNoYW5nZWQgc28gdGhhdCBJIGNvdWxkIGFjdHVhbGx5IGZpbmQgYWxsIHRoZQorCXJlZmVyZW5jZXMgYW5kIGZpeCB0aGVtIHVwLiAgaXQncyBhIGxpdHRsZSBtb3JlIHJlYWRhYmxlIG5vdy4gKi8KKyNkZWZpbmUgRVNTX0ZNVF9TVEVSRU8JMHgwMQorI2RlZmluZSBFU1NfRk1UXzE2QklUCTB4MDIKKyNkZWZpbmUgRVNTX0ZNVF9NQVNLCTB4MDMKKyNkZWZpbmUgRVNTX0RBQ19TSElGVAkwICAgCisjZGVmaW5lIEVTU19BRENfU0hJRlQJNAorCisjZGVmaW5lIEVTU19TVEFURV9NQUdJQwkJMHgxMjVEMTk2OAorI2RlZmluZSBFU1NfQ0FSRF9NQUdJQwkJMHgxOTI4Mzc0NgorCisjZGVmaW5lIERBQ19SVU5OSU5HCQkxCisjZGVmaW5lIEFEQ19SVU5OSU5HCQkyCisKKyNkZWZpbmUgTUFYX0RTUF9PUkRFUgkyCisjZGVmaW5lIE1BWF9EU1BTCSgxPDxNQVhfRFNQX09SREVSKQorI2RlZmluZSBOUl9EU1BTCQkoMTw8ZHNwc19vcmRlcikKKyNkZWZpbmUgTlJfSURSUwkJMzIKKworI2RlZmluZSBOUl9BUFVTCQk2NAorI2RlZmluZSBOUl9BUFVfUkVHUwkxNgorCisvKiBhY3BpIHN0YXRlcyAqLworZW51bSB7CisJQUNQSV9EMD0wLAorCUFDUElfRDEsCisJQUNQSV9EMiwKKwlBQ1BJX0QzCit9OworCisvKiBiaXRzIGluIHRoZSBhY3BpIG1hc2tzICovCisjZGVmaW5lIEFDUElfMTJNSFoJKCAxIDw8IDE1KQorI2RlZmluZSBBQ1BJXzI0TUhaCSggMSA8PCAxNCkKKyNkZWZpbmUgQUNQSV85NzgJKCAxIDw8IDEzKQorI2RlZmluZSBBQ1BJX1NQRElGCSggMSA8PCAxMikKKyNkZWZpbmUgQUNQSV9HTFVFCSggMSA8PCAxMSkKKyNkZWZpbmUgQUNQSV9fMTAJKCAxIDw8IDEwKSAvKiByZXNlcnZlZCAqLworI2RlZmluZSBBQ1BJX1BDSUlOVAkoIDEgPDwgOSkKKyNkZWZpbmUgQUNQSV9IVgkJKCAxIDw8IDgpIC8qIGhhcmR3YXJlIHZvbHVtZSAqLworI2RlZmluZSBBQ1BJX0dQSU8JKCAxIDw8IDcpCisjZGVmaW5lIEFDUElfQVNTUAkoIDEgPDwgNikKKyNkZWZpbmUgQUNQSV9TQgkJKCAxIDw8IDUpIC8qIHNiIGVtdWwgKi8KKyNkZWZpbmUgQUNQSV9GTQkJKCAxIDw8IDQpIC8qIGZtIGVtdWwgKi8KKyNkZWZpbmUgQUNQSV9SQgkJKCAxIDw8IDMpIC8qIHJpbmdidXMgLyBhY2xpbmsgKi8KKyNkZWZpbmUgQUNQSV9NSURJCSggMSA8PCAyKSAKKyNkZWZpbmUgQUNQSV9HUAkJKCAxIDw8IDEpIC8qIGdhbWUgcG9ydCAqLworI2RlZmluZSBBQ1BJX1dQCQkoIDEgPDwgMCkgLyogd2F2ZSBwcm9jZXNzb3IgKi8KKworI2RlZmluZSBBQ1BJX0FMTAkoMHhmZmZmKQorI2RlZmluZSBBQ1BJX1NMRUVQCSh+KEFDUElfU1BESUZ8QUNQSV9BU1NQfEFDUElfU0J8QUNQSV9GTXwgXAorCQkJQUNQSV9NSURJfEFDUElfR1B8QUNQSV9XUCkpCisjZGVmaW5lIEFDUElfTk9ORQkoQUNQSV9fMTApCisKKy8qIHRoZXNlIG1hc2tzIGluZGljYXRlIHdoaWNoIHVuaXRzIHdlIGNhcmUgYWJvdXQgYXQKKwl3aGljaCBzdGF0ZXMgKi8KK3N0YXRpYyB1MTYgYWNwaV9zdGF0ZV9tYXNrW10gPSB7CisJW0FDUElfRDBdID0gQUNQSV9BTEwsCisJW0FDUElfRDFdID0gQUNQSV9TTEVFUCwKKwlbQUNQSV9EMl0gPSBBQ1BJX1NMRUVQLAorCVtBQ1BJX0QzXSA9IEFDUElfTk9ORQorfTsKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorS0VSTl9JTkZPICJtYWVzdHJvOiB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiB0aW1lICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiI7CisKKworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NpemVbXSA9IHsgMSwgMiwgMiwgNCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAwLCAxLCAxLCAyIH07CisKK2VudW0gY2FyZF90eXBlc190IHsKKwlUWVBFX01BRVNUUk8sCisJVFlQRV9NQUVTVFJPMiwKKwlUWVBFX01BRVNUUk8yRQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNhcmRfbmFtZXNbXT17CisJW1RZUEVfTUFFU1RST10gPSAiRVNTIE1hZXN0cm8iLAorCVtUWVBFX01BRVNUUk8yXSA9ICJFU1MgTWFlc3RybyAyIiwKKwlbVFlQRV9NQUVTVFJPMkVdID0gIkVTUyBNYWVzdHJvIDJFIgorfTsKKworc3RhdGljIGludCBjbG9ja19mcmVxW109eworCVtUWVBFX01BRVNUUk9dID0gKDQ5MTUyMDAwTCAvIDEwMjRMKSwKKwlbVFlQRV9NQUVTVFJPMl0gPSAoNTAwMDAwMDBMIC8gMTAyNEwpLAorCVtUWVBFX01BRVNUUk8yRV0gPSAoNTAwMDAwMDBMIC8gMTAyNEwpCit9OworCitzdGF0aWMgaW50IG1hZXN0cm9fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqYnVmKTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtYWVzdHJvX25iID0ge21hZXN0cm9fbm90aWZpZXIsIE5VTEwsIDB9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGVzc19zdGF0ZSB7CisJdW5zaWduZWQgaW50IG1hZ2ljOworCS8qIEZJWE1FOiB3ZSBwcm9iYWJseSB3YW50IHN1Ym1peGVycyBpbiBoZXJlLCBidXQgb25seSBvbmUgcmVjb3JkIHBhaXIgKi8KKwl1OCBhcHVbNl07CQkvKiBsL3Igb3V0cHV0LCBsL3IgaW50cHV0IGNvbnZlcnRlcnMsIGwvciBpbnB1dCBhcHVzICovCisJdTggYXB1X21vZGVbNl07CQkvKiBSdW5uaW5nIG1vZGUgZm9yIHRoaXMgQVBVICovCisJdTggYXB1X3Bhbls2XTsJCS8qIFBhbm5pbmcgc2V0dXAgZm9yIHRoaXMgQVBVICovCisJdTMyIGFwdV9iYXNlWzZdOwkvKiBiYXNlIGFkZHJlc3MgZm9yIHRoaXMgYXB1ICovCisJc3RydWN0IGVzc19jYXJkICpjYXJkOwkvKiBDYXJkIGluZm8gKi8KKwkvKiB3YXZlIHN0dWZmICovCisJdW5zaWduZWQgaW50IHJhdGVhZGMsIHJhdGVkYWM7CisJdW5zaWduZWQgY2hhciBmbXQsIGVuYWJsZTsKKworCWludCBpbmRleDsKKworCS8qIHRoaXMgbG9ja3MgYXJvdW5kIHRoZSBvc3Mgc3RhdGUgaW4gdGhlIGRyaXZlciAqLworCXNwaW5sb2NrX3QgbG9jazsKKwkvKiBvbmx5IGxldCAxIGJlIG9wZW5pbmcgYXQgYSB0aW1lICovCisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisJbW9kZV90IG9wZW5fbW9kZTsKKworCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfYXVkaW87CisKKwlzdHJ1Y3QgZG1hYnVmIHsKKwkJdm9pZCAqcmF3YnVmOworCQl1bnNpZ25lZCBidWZvcmRlcjsKKwkJdW5zaWduZWQgbnVtZnJhZzsKKwkJdW5zaWduZWQgZnJhZ3NoaWZ0OworCQkvKiBYWFggemFiIC0gc3dwdHIgb25seSBpbiBoZXJlIHNvIHRoYXQgaXQgY2FuIGJlIHJlZmVyZW5jZWQgYnkKKwkJCWNsZWFyX2FkdmFuY2UsIGFzIGZhciBhcyBJIGNhbiB0ZWxsIDooICovCisJCXVuc2lnbmVkIGh3cHRyLCBzd3B0cjsKKwkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CisJCWludCBjb3VudDsKKwkJdW5zaWduZWQgZXJyb3I7IC8qIG92ZXIvdW5kZXJydW4gKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQl1bnNpZ25lZCBmcmFnc2l6ZTsKKwkJdW5zaWduZWQgZG1hc2l6ZTsKKwkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7CisJCS8qIE9TUyBzdHVmZiAqLworCQl1bnNpZ25lZCBtYXBwZWQ6MTsKKwkJdW5zaWduZWQgcmVhZHk6MTsJLyogb3VyIG9zcyBidWZmZXJzIGFyZSByZWFkeSB0byBnbyAqLworCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwkJdTE2IGJhc2U7CQkvKiBPZmZzZXQgZm9yIHB0ciAqLworCX0gZG1hX2RhYywgZG1hX2FkYzsKKworCS8qIHBvaW50ZXIgdG8gZWFjaCBkc3A/cyBwaWVjZSBvZiB0aGUgYXB1LT5zcmMgYnVmZmVyIHBhZ2UgKi8KKwl2b2lkICptaXhidWY7CisKK307CisJCitzdHJ1Y3QgZXNzX2NhcmQgeworCXVuc2lnbmVkIGludCBtYWdpYzsKKworCS8qIFdlIGtlZXAgbWFlc3RybyBjYXJkcyBpbiBhIGxpbmtlZCBsaXN0ICovCisJc3RydWN0IGVzc19jYXJkICpuZXh0OworCisJaW50IGRldl9taXhlcjsKKworCWludCBjYXJkX3R5cGU7CisKKwkvKiBhcyBtb3N0IG9mIHRoaXMgaXMgc3RhdGljLAorCQlwZXJoYXBzIGl0IHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gYSBnbG9iYWwgc3RydWN0ICovCisJc3RydWN0IG1peGVyX2dvbyB7CisJCWludCBtb2RjbnQ7CisJCWludCBzdXBwb3J0ZWRfbWl4ZXJzOworCQlpbnQgc3RlcmVvX21peGVyczsKKwkJaW50IHJlY29yZF9zb3VyY2VzOworCQkvKiB0aGUgY2FsbGVyIG11c3QgZ3VhcmFudGVlIGFyZyBzYW5pdHkgYmVmb3JlIGNhbGxpbmcgdGhlc2UgKi8KKy8qCQlpbnQgKCpyZWFkX21peGVyKShzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsIGludCBpbmRleCk7Ki8KKwkJdm9pZCAoKndyaXRlX21peGVyKShzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsaW50IG1peGVyLCB1bnNpZ25lZCBpbnQgbGVmdCx1bnNpZ25lZCBpbnQgcmlnaHQpOworCQlpbnQgKCpyZWNtYXNrX2lvKShzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsaW50IHJ3LGludCBtYXNrKTsKKwkJdW5zaWduZWQgaW50IG1peGVyX3N0YXRlW1NPVU5EX01JWEVSX05SREVWSUNFU107CisJfSBtaXg7CisJCisJaW50IHBvd2VyX3JlZ3M7CisJCQorCWludCBpbl9zdXNwZW5kOworCXdhaXRfcXVldWVfaGVhZF90IHN1c3BlbmRfcXVldWU7CisKKwlzdHJ1Y3QgZXNzX3N0YXRlIGNoYW5uZWxzW01BWF9EU1BTXTsKKwl1MTYgbWFlc3Ryb19tYXBbTlJfSURSU107CS8qIFJlZ2lzdGVyIG1hcCAqLworCS8qIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBqdW5rIHNvIHRoYXQgd2UgY2FuIGNvbWUgYmFjayBmcm9tIGEKKwkJc3VzcGVuZCAqLworCXUxNiBhcHVfbWFwW05SX0FQVVNdW05SX0FQVV9SRUdTXTsJLyogY29udGVudHMgb2YgYXB1IHJlZ3MgKi8KKworCS8qIHRoaXMgbG9ja3MgYXJvdW5kIHRoZSBwaHlzaWNhbCByZWdpc3RlcnMgb24gdGhlIGNhcmQgKi8KKwlzcGlubG9ja190IGxvY2s7CisKKwkvKiBtZW1vcnkgZm9yIHRoaXMgY2FyZC4uIHdhdmVjYWNoZSBsaW1pdGVkIDooKi8KKwl2b2lkICpkbWFwYWdlczsKKwlpbnQgZG1hb3JkZXI7CisKKwkvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXUzMiBpb2Jhc2U7CisJdTMyIGlycTsKKworCWludCBib2JfZnJlcTsKKwljaGFyIGRzcHNfb3BlbjsKKworCWludCBkb2NrX211dGVfdm9sOworfTsKKworc3RhdGljIHZvaWQgc2V0X21peGVyKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCx1bnNpZ25lZCBpbnQgbWl4ZXIsIHVuc2lnbmVkIGludCB2YWwgKTsKKworc3RhdGljIHVuc2lnbmVkIAorbGQyKHVuc2lnbmVkIGludCB4KQoreworCXVuc2lnbmVkIHIgPSAwOworCQorCWlmICh4ID49IDB4MTAwMDApIHsKKwkJeCA+Pj0gMTY7CisJCXIgKz0gMTY7CisJfQorCWlmICh4ID49IDB4MTAwKSB7CisJCXggPj49IDg7CisJCXIgKz0gODsKKwl9CisJaWYgKHggPj0gMHgxMCkgeworCQl4ID4+PSA0OworCQlyICs9IDQ7CisJfQorCWlmICh4ID49IDQpIHsKKwkJeCA+Pj0gMjsKKwkJciArPSAyOworCX0KKwlpZiAoeCA+PSAyKQorCQlyKys7CisJcmV0dXJuIHI7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGNoZWNrX3N1c3BlbmQoc3RydWN0IGVzc19jYXJkICpjYXJkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyoKKyAqCUVTUyBNYWVzdHJvIEFDOTcgY29kZWMgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLgorICovCisJIAorc3RhdGljIHZvaWQgbWFlc3Ryb19hYzk3X3NldChzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsIHU4IGNtZCwgdTE2IHZhbCkKK3sKKwlpbnQgaW8gPSBjYXJkLT5pb2Jhc2U7CisJaW50IGk7CisJLyoKKwkgKglXYWl0IGZvciB0aGUgY29kZWMgYnVzIHRvIGJlIGZyZWUgCisJICovCisKKwljaGVja19zdXNwZW5kKGNhcmQpOworCSAKKwlmb3IoaT0wO2k8MTAwMDA7aSsrKQorCXsKKwkJaWYoIShpbmIoaW8rRVNTX0FDOTdfSU5ERVgpJjEpKSAKKwkJCWJyZWFrOworCX0KKwkvKgorCSAqCVdyaXRlIHRoZSBidXMKKwkgKi8gCisJb3V0dyh2YWwsIGlvK0VTU19BQzk3X0RBVEEpOworCW1kZWxheSgxKTsKKwlvdXRiKGNtZCwgaW8rRVNTX0FDOTdfSU5ERVgpOworCW1kZWxheSgxKTsKK30KKworc3RhdGljIHUxNiBtYWVzdHJvX2FjOTdfZ2V0KHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgdTggY21kKQoreworCWludCBpbyA9IGNhcmQtPmlvYmFzZTsKKwlpbnQgc2FuaXR5PTEwMDAwOworCXUxNiBkYXRhOworCWludCBpOworCQorCWNoZWNrX3N1c3BlbmQoY2FyZCk7CisJLyoKKwkgKglXYWl0IGZvciB0aGUgY29kZWMgYnVzIHRvIGJlIGZyZWUgCisJICovCisJIAorCWZvcihpPTA7aTwxMDAwMDtpKyspCisJeworCQlpZighKGluYihpbytFU1NfQUM5N19JTkRFWCkmMSkpCisJCQlicmVhazsKKwl9CisKKwlvdXRiKGNtZHwweDgwLCBpbytFU1NfQUM5N19JTkRFWCk7CisJbWRlbGF5KDEpOworCQorCXdoaWxlKGluYihpbytFU1NfQUM5N19JTkRFWCkmMSkKKwl7CisJCXNhbml0eS0tOworCQlpZighc2FuaXR5KQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIm1hZXN0cm86IGFjOTcgY29kZWMgdGltZW91dCByZWFkaW5nIDB4JXguXG4iLGNtZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlkYXRhPWludyhpbytFU1NfQUM5N19EQVRBKTsKKwltZGVsYXkoMSk7CisJcmV0dXJuIGRhdGE7Cit9CisKKy8qIE9TUyBpbnRlcmZhY2UgdG8gdGhlIGFjOTdzLi4gKi8KKworI2RlZmluZSBBQzk3X1NURVJFT19NQVNLIChTT1VORF9NQVNLX1ZPTFVNRXxcCisJU09VTkRfTUFTS19QQ018U09VTkRfTUFTS19MSU5FfFNPVU5EX01BU0tfQ0R8XAorCVNPVU5EX01BU0tfVklERU98U09VTkRfTUFTS19MSU5FMXxTT1VORF9NQVNLX0lHQUlOKQorCisjZGVmaW5lIEFDOTdfU1VQUE9SVEVEX01BU0sgKEFDOTdfU1RFUkVPX01BU0sgfCBcCisJU09VTkRfTUFTS19CQVNTfFNPVU5EX01BU0tfVFJFQkxFfFNPVU5EX01BU0tfTUlDfFwKKwlTT1VORF9NQVNLX1NQRUFLRVIpCisKKyNkZWZpbmUgQUM5N19SRUNPUkRfTUFTSyAoU09VTkRfTUFTS19NSUN8XAorCVNPVU5EX01BU0tfQ0R8IFNPVU5EX01BU0tfVklERU98IFNPVU5EX01BU0tfTElORTF8IFNPVU5EX01BU0tfTElORXxcCisJU09VTkRfTUFTS19QSE9ORUlOKQorCisjZGVmaW5lIHN1cHBvcnRlZF9taXhlcihDQVJELEZPTykgKCBDQVJELT5taXguc3VwcG9ydGVkX21peGVycyAmICgxPDxGT08pICkKKworLyogdGhpcyB0YWJsZSBoYXMgZGVmYXVsdCBtaXhlciB2YWx1ZXMgZm9yIGFsbCBPU1MgbWl4ZXJzLgorCWJlIHN1cmUgdG8gZmlsbCBpdCBpbiBpZiB5b3UgYWRkIG9zcyBtaXhlcnMKKwl0byBhbnlvbmUncyBzdXBwb3J0ZWQgbWl4ZXIgZGVmaW5lcyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IG1peGVyX2RlZmF1bHRzW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7CisJW1NPVU5EX01JWEVSX1ZPTFVNRV0gPSAgICAgICAgICAweDMyMzIsCisJW1NPVU5EX01JWEVSX0JBU1NdID0gICAgICAgICAgICAweDMyMzIsCisJW1NPVU5EX01JWEVSX1RSRUJMRV0gPSAgICAgICAgICAweDMyMzIsCisJW1NPVU5EX01JWEVSX1NQRUFLRVJdID0gICAgICAgICAweDMyMzIsCisJW1NPVU5EX01JWEVSX01JQ10gPSAgICAgMHg4MDAwLCAvKiBhbm5veWluZyAqLworCVtTT1VORF9NSVhFUl9MSU5FXSA9ICAgIDB4MzIzMiwKKwlbU09VTkRfTUlYRVJfQ0RdID0gICAgICAweDMyMzIsCisJW1NPVU5EX01JWEVSX1ZJREVPXSA9ICAgMHgzMjMyLAorCVtTT1VORF9NSVhFUl9MSU5FMV0gPSAgIDB4MzIzMiwKKwlbU09VTkRfTUlYRVJfUENNXSA9ICAgICAgICAgICAgIDB4MzIzMiwKKwlbU09VTkRfTUlYRVJfSUdBSU5dID0gICAgICAgICAgIDB4MzIzMgorfTsKKwkKK3N0YXRpYyBzdHJ1Y3QgYWM5N19taXhlcl9odyB7CisJdW5zaWduZWQgY2hhciBvZmZzZXQ7CisJaW50IHNjYWxlOworfSBhYzk3X2h3W1NPVU5EX01JWEVSX05SREVWSUNFU109IHsKKwlbU09VTkRfTUlYRVJfVk9MVU1FXQk9CXsweDAyLDYzfSwKKwlbU09VTkRfTUlYRVJfQkFTU10JPQl7MHgwOCwxNX0sCisJW1NPVU5EX01JWEVSX1RSRUJMRV0JPQl7MHgwOCwxNX0sCisJW1NPVU5EX01JWEVSX1NQRUFLRVJdCT0JezB4MGEsMTV9LAorCVtTT1VORF9NSVhFUl9NSUNdCT0JezB4MGUsMzF9LAorCVtTT1VORF9NSVhFUl9MSU5FXQk9CXsweDEwLDMxfSwKKwlbU09VTkRfTUlYRVJfQ0RdCT0JezB4MTIsMzF9LAorCVtTT1VORF9NSVhFUl9WSURFT10JPQl7MHgxNCwzMX0sCisJW1NPVU5EX01JWEVSX0xJTkUxXQk9CXsweDE2LDMxfSwKKwlbU09VTkRfTUlYRVJfUENNXQk9CXsweDE4LDMxfSwKKwlbU09VTkRfTUlYRVJfSUdBSU5dCT0JezB4MWMsMTV9Cit9OworCisjaWYgMCAvKiAqc2hydWcqIHJlbW92ZWQgc2ltcGx5IGJlY2F1c2Ugd2UgbmV2ZXIgdXNlZCBpdC4KKwkJZmVlbCBmcmVlIHRvIGltcGxlbWVudCBhZ2FpbiBpZiBuZWVkZWQgKi8KKworLyogcmVhZHMgdGhlIGdpdmVuIE9TUyBtaXhlciBmcm9tIHRoZSBhYzk3CisJdGhlIGNhbGxlciBtdXN0IGhhdmUgaW5zdXJlZCB0aGF0IHRoZSBhYzk3IGtub3dzCisJYWJvdXQgdGhhdCBnaXZlbiBtaXhlciwgYW5kIHNob3VsZCBiZSBob2xkaW5nIGEKKwlzcGlubG9jayBmb3IgdGhlIGNhcmQgKi8KK3N0YXRpYyBpbnQgYWM5N19yZWFkX21peGVyKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgaW50IG1peGVyKSAKK3sKKwl1MTYgdmFsOworCWludCByZXQ9MDsKKwlzdHJ1Y3QgYWM5N19taXhlcl9odyAqbWggPSAmYWM5N19od1ttaXhlcl07CisKKwl2YWwgPSBtYWVzdHJvX2FjOTdfZ2V0KGNhcmQsIG1oLT5vZmZzZXQpOworCisJaWYoQUM5N19TVEVSRU9fTUFTSyAmICgxPDxtaXhlcikpIHsKKwkJLyogbmljZSBzdGVyZW8gbWl4ZXJzIC4uICovCisJCWludCBsZWZ0LHJpZ2h0OworCisJCWxlZnQgPSAodmFsID4+IDgpICAmIDB4N2Y7CisJCXJpZ2h0ID0gdmFsICAmIDB4N2Y7CisKKwkJaWYgKG1peGVyID09IFNPVU5EX01JWEVSX0lHQUlOKSB7CisJCQlyaWdodCA9IChyaWdodCAqIDEwMCkgLyBtaC0+c2NhbGU7CisJCQlsZWZ0ID0gKGxlZnQgKiAxMDApIC8gbWgtPnNjYWxlOworCQl9IGVsc2UgeworCQkJcmlnaHQgPSAxMDAgLSAoKHJpZ2h0ICogMTAwKSAvIG1oLT5zY2FsZSk7CisJCQlsZWZ0ID0gMTAwIC0gKChsZWZ0ICogMTAwKSAvIG1oLT5zY2FsZSk7CisJCX0KKworCQlyZXQgPSBsZWZ0IHwgKHJpZ2h0IDw8IDgpOworCX0gZWxzZSBpZiAobWl4ZXIgPT0gU09VTkRfTUlYRVJfU1BFQUtFUikgeworCQlyZXQgPSAxMDAgLSAoKCgodmFsICYgMHgxZSk+PjEpICogMTAwKSAvIG1oLT5zY2FsZSk7CisJfSBlbHNlIGlmIChtaXhlciA9PSBTT1VORF9NSVhFUl9NSUMpIHsKKwkJcmV0ID0gMTAwIC0gKCgodmFsICYgMHgxZikgKiAxMDApIC8gbWgtPnNjYWxlKTsKKwkvKiAgdGhlIGxvdyBiaXQgaXMgb3B0aW9uYWwgaW4gdGhlIHRvbmUgc2xpZGVycyBhbmQgbWFza2luZworCQlpdCBsZXRzIGlzIGF2b2lkIHRoZSAweGYgJ2J5cGFzcycuLiAqLworCX0gZWxzZSBpZiAobWl4ZXIgPT0gU09VTkRfTUlYRVJfQkFTUykgeworCQlyZXQgPSAxMDAgLSAoKCgodmFsID4+IDgpICYgMHhlKSAqIDEwMCkgLyBtaC0+c2NhbGUpOworCX0gZWxzZSBpZiAobWl4ZXIgPT0gU09VTkRfTUlYRVJfVFJFQkxFKSB7CisJCXJldCA9IDEwMCAtICgoKHZhbCAmIDB4ZSkgKiAxMDApIC8gbWgtPnNjYWxlKTsKKwl9CisKKwlNX3ByaW50aygicmVhZCBtaXhlciAlZCAoMHgleCkgJXggLT4gJXhcbiIsbWl4ZXIsbWgtPm9mZnNldCx2YWwscmV0KTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyogd3JpdGUgdGhlIE9TUyBlbmNvZGVkIHZvbHVtZSB0byB0aGUgZ2l2ZW4gT1NTIGVuY29kZWQgbWl4ZXIsCisJYWdhaW4gY2FsbGVyJ3Mgam9iIHRvIG1ha2Ugc3VyZSBhbGwgaXMgd2VsbCBpbiBhcmcgbGFuZCwKKwljYWxsIHdpdGggc3BpbmxvY2sgaGVsZCAqLworCQorLyogbGluZWFyIHNjYWxlIC0+IGxvZyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGluMmxvZ1sxMDFdID0gCit7CiswLCAwICwgMTUgLCAyMyAsIDMwICwgMzQgLCAzOCAsIDQyICwgNDUgLCA0NyAsCis1MCAsIDUyICwgNTMgLCA1NSAsIDU3ICwgNTggLCA2MCAsIDYxICwgNjIgLAorNjMgLCA2NSAsIDY2ICwgNjcgLCA2OCAsIDY5ICwgNjkgLCA3MCAsIDcxICwKKzcyICwgNzMgLCA3MyAsIDc0ICwgNzUgLCA3NSAsIDc2ICwgNzcgLCA3NyAsCis3OCAsIDc4ICwgNzkgLCA4MCAsIDgwICwgODEgLCA4MSAsIDgyICwgODIgLAorODMgLCA4MyAsIDg0ICwgODQgLCA4NCAsIDg1ICwgODUgLCA4NiAsIDg2ICwKKzg3ICwgODcgLCA4NyAsIDg4ICwgODggLCA4OCAsIDg5ICwgODkgLCA4OSAsCis5MCAsIDkwICwgOTAgLCA5MSAsIDkxICwgOTEgLCA5MiAsIDkyICwgOTIgLAorOTMgLCA5MyAsIDkzICwgOTQgLCA5NCAsIDk0ICwgOTQgLCA5NSAsIDk1ICwKKzk1ICwgOTUgLCA5NiAsIDk2ICwgOTYgLCA5NiAsIDk3ICwgOTcgLCA5NyAsCis5NyAsIDk4ICwgOTggLCA5OCAsIDk4ICwgOTkgLCA5OSAsIDk5ICwgOTkgLCA5OSAKK307CisKK3N0YXRpYyB2b2lkIGFjOTdfd3JpdGVfbWl4ZXIoc3RydWN0IGVzc19jYXJkICpjYXJkLGludCBtaXhlciwgdW5zaWduZWQgaW50IGxlZnQsIHVuc2lnbmVkIGludCByaWdodCkKK3sKKwl1MTYgdmFsPTA7CisJc3RydWN0IGFjOTdfbWl4ZXJfaHcgKm1oID0gJmFjOTdfaHdbbWl4ZXJdOworCisJTV9wcmludGsoIndyb3RlIG1peGVyICVkICgweCV4KSAlZCwlZCIsbWl4ZXIsbWgtPm9mZnNldCxsZWZ0LHJpZ2h0KTsKKworCWlmKEFDOTdfU1RFUkVPX01BU0sgJiAoMTw8bWl4ZXIpKSB7CisJCS8qIHN0ZXJlbyBtaXhlcnMsIG11dGUgdGhlbSBpZiB3ZSBjYW4gKi8KKworCQlpZiAobWl4ZXIgPT0gU09VTkRfTUlYRVJfSUdBSU4pIHsKKwkJCS8qIGlnYWluJ3Mgc2xpZGVyIGlzIHJldmVyc2VkLi4gKi8KKwkJCXJpZ2h0ID0gKHJpZ2h0ICogbWgtPnNjYWxlKSAvIDEwMDsKKwkJCWxlZnQgPSAobGVmdCAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCQlpZiAoKGxlZnQgPT0gMCkgJiYgKHJpZ2h0ID09IDApKQorCQkJCXZhbCB8PSAweDgwMDA7CisJCX0gZWxzZSBpZiAobWl4ZXIgPT0gU09VTkRfTUlYRVJfUENNIHx8IG1peGVyID09IFNPVU5EX01JWEVSX0NEKSB7CisJCQkvKiBsb2cgY29udmVyc2lvbiBzZWVtcyBiYWQgZm9yIHRoZW0gKi8KKwkJCWlmICgobGVmdCA9PSAwKSAmJiAocmlnaHQgPT0gMCkpCisJCQkJdmFsID0gMHg4MDAwOworCQkJcmlnaHQgPSAoKDEwMCAtIHJpZ2h0KSAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCX0gZWxzZSB7CisJCQkvKiBsb2cgY29udmVyc2lvbiBmb3IgdGhlIHN0ZXJlbyBjb250cm9scyAqLworCQkJaWYoKGxlZnQgPT0gMCkgJiYgKHJpZ2h0ID09IDApKQorCQkJCXZhbCA9IDB4ODAwMDsKKwkJCXJpZ2h0ID0gKCgxMDAgLSBsaW4ybG9nW3JpZ2h0XSkgKiBtaC0+c2NhbGUpIC8gMTAwOworCQkJbGVmdCA9ICgoMTAwIC0gbGluMmxvZ1tsZWZ0XSkgKiBtaC0+c2NhbGUpIC8gMTAwOworCQl9CisKKwkJdmFsIHw9IChsZWZ0IDw8IDgpIHwgcmlnaHQ7CisKKwl9IGVsc2UgaWYgKG1peGVyID09IFNPVU5EX01JWEVSX1NQRUFLRVIpIHsKKwkJdmFsID0gKCgoMTAwIC0gbGVmdCkgKiBtaC0+c2NhbGUpIC8gMTAwKSA8PCAxOworCX0gZWxzZSBpZiAobWl4ZXIgPT0gU09VTkRfTUlYRVJfTUlDKSB7CisJCXZhbCA9IG1hZXN0cm9fYWM5N19nZXQoY2FyZCwgbWgtPm9mZnNldCkgJiB+MHg4MDFmOworCQl2YWwgfD0gKCgoMTAwIC0gbGVmdCkgKiBtaC0+c2NhbGUpIC8gMTAwKTsKKwkvKiAgdGhlIGxvdyBiaXQgaXMgb3B0aW9uYWwgaW4gdGhlIHRvbmUgc2xpZGVycyBhbmQgbWFza2luZworCQlpdCBsZXRzIGlzIGF2b2lkIHRoZSAweGYgJ2J5cGFzcycuLiAqLworCX0gZWxzZSBpZiAobWl4ZXIgPT0gU09VTkRfTUlYRVJfQkFTUykgeworCQl2YWwgPSBtYWVzdHJvX2FjOTdfZ2V0KGNhcmQgLCBtaC0+b2Zmc2V0KSAmIH4weDBmMDA7CisJCXZhbCB8PSAoKCgoMTAwIC0gbGVmdCkgKiBtaC0+c2NhbGUpIC8gMTAwKSA8PCA4KSAmIDB4MGUwMDsKKwl9IGVsc2UgaWYgKG1peGVyID09IFNPVU5EX01JWEVSX1RSRUJMRSkgIHsKKwkJdmFsID0gbWFlc3Ryb19hYzk3X2dldChjYXJkICwgbWgtPm9mZnNldCkgJiB+MHgwMDBmOworCQl2YWwgfD0gKCgoMTAwIC0gbGVmdCkgKiBtaC0+c2NhbGUpIC8gMTAwKSAmIDB4MDAwZTsKKwl9CisKKwltYWVzdHJvX2FjOTdfc2V0KGNhcmQgLCBtaC0+b2Zmc2V0LCB2YWwpOworCQorCU1fcHJpbnRrKCIgLT4gJXhcbiIsdmFsKTsKK30KKworLyogdGhlIGZvbGxvd2luZyB0YWJsZXMgYWxsb3cgdXMgdG8gZ28gZnJvbSAKKwlPU1MgPC0+IGFjOTcgcXVpY2tseS4gKi8KKworZW51bSBhYzk3X3JlY3NldHRpbmdzIHsKKwlBQzk3X1JFQ19NSUM9MCwKKwlBQzk3X1JFQ19DRCwKKwlBQzk3X1JFQ19WSURFTywKKwlBQzk3X1JFQ19BVVgsCisJQUM5N19SRUNfTElORSwKKwlBQzk3X1JFQ19TVEVSRU8sIC8qIGNvbWJpbmF0aW9uIG9mIGFsbCBlbmFibGVkIG91dHB1dHMuLiAgKi8KKwlBQzk3X1JFQ19NT05PLCAgICAgICAgLyouLiBvciB0aGUgbW9ubyBlcXVpdmFsZW50ICovCisJQUM5N19SRUNfUEhPTkUgICAgICAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBhYzk3X29zc19tYXNrW10gPSB7CisJW0FDOTdfUkVDX01JQ10gPSBTT1VORF9NQVNLX01JQywgCisJW0FDOTdfUkVDX0NEXSA9IFNPVU5EX01BU0tfQ0QsIAorCVtBQzk3X1JFQ19WSURFT10gPSBTT1VORF9NQVNLX1ZJREVPLCAKKwlbQUM5N19SRUNfQVVYXSA9IFNPVU5EX01BU0tfTElORTEsIAorCVtBQzk3X1JFQ19MSU5FXSA9IFNPVU5EX01BU0tfTElORSwgCisJW0FDOTdfUkVDX1BIT05FXSA9IFNPVU5EX01BU0tfUEhPTkVJTgorfTsKKworLyogaW5kZXhlZCBieSBiaXQgcG9zaXRpb24gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWM5N19vc3Nfcm1bXSA9IHsKKwlbU09VTkRfTUlYRVJfTUlDXSA9IEFDOTdfUkVDX01JQywKKwlbU09VTkRfTUlYRVJfQ0RdID0gQUM5N19SRUNfQ0QsCisJW1NPVU5EX01JWEVSX1ZJREVPXSA9IEFDOTdfUkVDX1ZJREVPLAorCVtTT1VORF9NSVhFUl9MSU5FMV0gPSBBQzk3X1JFQ19BVVgsCisJW1NPVU5EX01JWEVSX0xJTkVdID0gQUM5N19SRUNfTElORSwKKwlbU09VTkRfTUlYRVJfUEhPTkVJTl0gPSBBQzk3X1JFQ19QSE9ORQorfTsKKwkKKy8qIHJlYWQgb3Igd3JpdGUgdGhlIHJlY21hc2sgCisJdGhlIGFjOTcgY2FuIHJlYWxseSBoYXZlIGxlZnQgYW5kIHJpZ2h0IHJlY29yZGluZworCWlucHV0cyBpbmRlcGVuZGVudGx5IHNldCwgYnV0IE9TUyBkb2Vzbid0IHNlZW0gdG8gCisJd2FudCB1cyB0byBleHByZXNzIHRoYXQgdG8gdGhlIHVzZXIuIAorCXRoZSBjYWxsZXIgZ3VhcmFudGVlcyB0aGF0IHdlIGhhdmUgYSBzdXBwb3J0ZWQgYml0IHNldCwKKwlhbmQgdGhleSBtdXN0IGJlIGhvbGRpbmcgdGhlIGNhcmQncyBzcGlubG9jayAqLworc3RhdGljIGludCAKK2FjOTdfcmVjbWFza19pbyhzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsIGludCByZWFkLCBpbnQgbWFzaykgCit7CisJdW5zaWduZWQgaW50IHZhbCA9IGFjOTdfb3NzX21hc2tbIG1hZXN0cm9fYWM5N19nZXQoY2FyZCwgMHgxYSkgJiAweDcgXTsKKworCWlmIChyZWFkKSByZXR1cm4gdmFsOworCisJLyogb3NzIGNhbiBoYXZlIG1hbnkgaW5wdXRzLCBtYWVzdHJvIGNhbid0LiAgdHJ5CisJCXRvIHBpY2sgdGhlICduZXcnIG9uZSAqLworCisJaWYgKG1hc2sgIT0gdmFsKSBtYXNrICY9IH52YWw7CisKKwl2YWwgPSBmZnMobWFzaykgLSAxOyAKKwl2YWwgPSBhYzk3X29zc19ybVt2YWxdOworCXZhbCB8PSB2YWwgPDwgODsgIC8qIHNldCBib3RoIGNoYW5uZWxzICovCisKKwlNX3ByaW50aygibWFlc3Rybzogc2V0dGluZyBhYzk3IHJlY21hc2sgdG8gMHgleFxuIix2YWwpOworCisJbWFlc3Ryb19hYzk3X3NldChjYXJkLDB4MWEsdmFsKTsKKworCXJldHVybiAwOworfTsKKworLyoKKyAqCVRoZSBNYWVzdHJvIGNhbiBiZSB3aXJlZCB0byBhIHN0YW5kYXJkIEFDOTcgY29tcGxpYW50IGNvZGVjCisgKgkoc2VlIHd3dy5pbnRlbC5jb20gZm9yIHRoZSBwZGYncyBvbiB0aGlzKSwgb3IgdG8gYSBQVDEwMSBjb2RlYworICoJd2hpY2ggYXBwZWFycyB0byBiZSB0aGUgRVMxOTE4IChkYXRhIHNoZWV0IG9uIHRoZSBlc3N0ZWNoLmNvbS50dyBzaXRlKQorICoKKyAqCVRoZSBQVDEwMSBzZXR1cCBpcyB1bnRlc3RlZC4KKyAqLworIAorc3RhdGljIHUxNiBfX2luaXQgbWFlc3Ryb19hYzk3X2luaXQoc3RydWN0IGVzc19jYXJkICpjYXJkKQoreworCXUxNiB2ZW5kMSwgdmVuZDIsIGNhcHM7CisKKwljYXJkLT5taXguc3VwcG9ydGVkX21peGVycyA9IEFDOTdfU1VQUE9SVEVEX01BU0s7CisJY2FyZC0+bWl4LnN0ZXJlb19taXhlcnMgPSBBQzk3X1NURVJFT19NQVNLOworCWNhcmQtPm1peC5yZWNvcmRfc291cmNlcyA9IEFDOTdfUkVDT1JEX01BU0s7CisvKgljYXJkLT5taXgucmVhZF9taXhlciA9IGFjOTdfcmVhZF9taXhlcjsqLworCWNhcmQtPm1peC53cml0ZV9taXhlciA9IGFjOTdfd3JpdGVfbWl4ZXI7CisJY2FyZC0+bWl4LnJlY21hc2tfaW8gPSBhYzk3X3JlY21hc2tfaW87CisKKwl2ZW5kMSA9IG1hZXN0cm9fYWM5N19nZXQoY2FyZCwgMHg3Yyk7CisJdmVuZDIgPSBtYWVzdHJvX2FjOTdfZ2V0KGNhcmQsIDB4N2UpOworCisJY2FwcyA9IG1hZXN0cm9fYWM5N19nZXQoY2FyZCwgMHgwMCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJtYWVzdHJvOiBBQzk3IENvZGVjIGRldGVjdGVkOiB2OiAweCUyeCUyeCBjYXBzOiAweCV4IHB3cjogMHgleFxuIiwKKwkJdmVuZDEsdmVuZDIsY2FwcyxtYWVzdHJvX2FjOTdfZ2V0KGNhcmQsMHgyNikgJiAweGYpOworCisJaWYgKCEgKGNhcHMgJiAweDQpICkgeworCQkvKiBubyBiYXNzL3RyZWJsZSBub2JzICovCisJCWNhcmQtPm1peC5zdXBwb3J0ZWRfbWl4ZXJzICY9IH4oU09VTkRfTUFTS19CQVNTfFNPVU5EX01BU0tfVFJFQkxFKTsKKwl9CisKKwkvKiBYWFggZW5kaWFubmVzcywgZG9yayBoZWFkLiAqLworCS8qIHZlbmRvciBzcGVjaWZjIGJpdHMuLiAqLworCXN3aXRjaCAoKGxvbmcpKHZlbmQxIDw8IDE2KSB8IHZlbmQyKSB7CisJY2FzZSAweDU0NTIwMGZmOgkvKiBUcmlUZWNoICovCisJCS8qIG5vIGlkZWEgd2hhdCB0aGlzIGRvZXMgKi8KKwkJbWFlc3Ryb19hYzk3X3NldChjYXJkLDB4MmEsMHgwMDAxKTsKKwkJbWFlc3Ryb19hYzk3X3NldChjYXJkLDB4MmMsMHgwMDAwKTsKKwkJbWFlc3Ryb19hYzk3X3NldChjYXJkLDB4MmMsMHhmZmZmKTsKKwkJYnJlYWs7CisjaWYgMAkvKiBpIHRob3VnaHQgdGhlIHByb2JsZW1zIEkgd2FzIHNlZWluZyB3ZXJlIHdpdGgKKwl0aGUgMTkyMSwgYnV0IGFwcGFyZW50bHkgdGhleSB3ZXJlIHdpdGggdGhlIHBjaSBib2FyZAorCWl0IHdhcyBvbiwgc28gdGhpcyBjb2RlIGlzIGNvbW1lbnRlZCBvdXQuCisJIGxldHMgc2VlIGlmIHRoaXMgaG9sZHMgdHJ1ZS4gKi8KKwljYXNlIDB4ODM4NDc2MDk6CS8qIEVTUyAxOTIxICovCisJCS8qIHdyaXRpbmcgdG8gMHhlIChtaWMpIG9yIDB4MWEgKHJlY21hc2spIHNlZW1zCisJCQl0byBoYW5nIHRoaXMgY29kZWMgKi8KKwkJY2FyZC0+bWl4LnN1cHBvcnRlZF9taXhlcnMgJj0gfihTT1VORF9NQVNLX01JQyk7CisJCWNhcmQtPm1peC5yZWNvcmRfc291cmNlcyA9IDA7CisJCWNhcmQtPm1peC5yZWNtYXNrX2lvID0gTlVMTDsKKyNpZiAwCS8qIGRvbid0IGFzay4gIEkgaGF2ZSB5ZXQgdG8gc2VlIHdoYXQgdGhlc2UgYWN0dWFsbHkgZG8uICovCisJCW1hZXN0cm9fYWM5N19zZXQoY2FyZCwweDc2LDB4QUJCQSk7IC8qIG8vfiBUYWtlIGEgY2hhbmNlIG9uIG1lIG8vfiAqLworCQl1ZGVsYXkoMjApOworCQltYWVzdHJvX2FjOTdfc2V0KGNhcmQsMHg3OCwweDMwMDIpOworCQl1ZGVsYXkoMjApOworCQltYWVzdHJvX2FjOTdfc2V0KGNhcmQsMHg3OCwweDM4MDIpOworCQl1ZGVsYXkoMjApOworI2VuZGlmCisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDogYnJlYWs7CisJfQorCisJbWFlc3Ryb19hYzk3X3NldChjYXJkLCAweDFFLCAweDA0MDQpOworCS8qIG51bGwgbWlzYyBzdHVmZiAqLworCW1hZXN0cm9fYWM5N19zZXQoY2FyZCwgMHgyMCwgMHgwMDAwKTsKKworCXJldHVybiAwOworfQorCisjaWYgMCAgLyogdGhlcmUgaGFzIGJlZW4gMSBwZXJzb24gb24gdGhlIHBsYW5ldCB3aXRoIGEgcHQxMDEgdGhhdCB3ZQorCWtub3cgb2YuICBJZiB0aGV5IGNhcmUsIHRoZXkgY2FuIHB1dCB0aGlzIGJhY2sgaW4gOikgKi8KK3N0YXRpYyB1MTYgbWFlc3Ryb19wdDEwMV9pbml0KHN0cnVjdCBlc3NfY2FyZCAqY2FyZCxpbnQgaW9iYXNlKQoreworCXByaW50ayhLRVJOX0lORk8gIm1hZXN0cm86IFBUMTAxIENvZGVjIGRldGVjdGVkLCBpbml0aWFsaXppbmcgYnV0IF9ub3RfIGluc3RhbGxpbmcgbWl4ZXIgZGV2aWNlLlxuIik7CisJLyogd2hvIGtub3dzLi4gKi8KKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgyQSwgMHgwMDAxKTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgyQywgMHgwMDAwKTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgyQywgMHhGRkZGKTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgxMCwgMHg5RjFGKTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgxMiwgMHgwODA4KTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgxNCwgMHg5RjFGKTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgxNiwgMHg5RjFGKTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgxOCwgMHgwNDA0KTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgxQSwgMHgwMDAwKTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgxQywgMHgwMDAwKTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgwMiwgMHgwNDA0KTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgwNCwgMHgwODA4KTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgwQywgMHg4MDFGKTsKKwltYWVzdHJvX2FjOTdfc2V0KGlvYmFzZSwgMHgwRSwgMHg4MDFGKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiB0aGlzIGlzIHZlcnkgbWFnaWMsIGFuZCB2ZXJ5IHNsb3cuLiAqLworc3RhdGljIHZvaWQgCittYWVzdHJvX2FjOTdfcmVzZXQoaW50IGlvYWRkciwgc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3sKKwl1MTYgc2F2ZV82ODsKKwl1MTYgdzsKKwl1MzIgdmVuZDsKKworCW91dHcoIGludyhpb2FkZHIgKyAweDM4KSAmIDB4ZmZmYywgaW9hZGRyICsgMHgzOCk7CisJb3V0dyggaW53KGlvYWRkciArIDB4M2EpICYgMHhmZmZjLCBpb2FkZHIgKyAweDNhKTsKKwlvdXR3KCBpbncoaW9hZGRyICsgMHgzYykgJiAweGZmZmMsIGlvYWRkciArIDB4M2MpOworCisJLyogcmVzZXQgdGhlIGZpcnN0IGNvZGVjICovCisJb3V0dygweDAwMDAsICBpb2FkZHIrMHgzNik7CisJc2F2ZV82OCA9IGludyhpb2FkZHIrMHg2OCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpZGV2LCAweDU4LCAmdyk7CS8qIHNvbWV0aGluZyBtYWdpY2FsIHdpdGggZ3BpbyBhbmQgYnVzIGFyYi4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnZlbmQpOworCWlmKCB3ICYgMHgxKQorCQlzYXZlXzY4IHw9IDB4MTA7CisJb3V0dygweGZmZmUsIGlvYWRkciArIDB4NjQpOwkvKiB0aWNrbHkgZ3BpbyAwLi4gKi8KKwlvdXR3KDB4MDAwMSwgaW9hZGRyICsgMHg2OCk7CisJb3V0dygweDAwMDAsIGlvYWRkciArIDB4NjApOworCXVkZWxheSgyMCk7CisJb3V0dygweDAwMDEsIGlvYWRkciArIDB4NjApOworCW1kZWxheSgyMCk7CisKKwlvdXR3KHNhdmVfNjggfCAweDEsIGlvYWRkciArIDB4NjgpOwkvKiBub3cgcmVzdG9yZSAuLiAqLworCW91dHcoIChpbncoaW9hZGRyICsgMHgzOCkgJiAweGZmZmMpfDB4MSwgaW9hZGRyICsgMHgzOCk7CisJb3V0dyggKGludyhpb2FkZHIgKyAweDNhKSAmIDB4ZmZmYyl8MHgxLCBpb2FkZHIgKyAweDNhKTsKKwlvdXR3KCAoaW53KGlvYWRkciArIDB4M2MpICYgMHhmZmZjKXwweDEsIGlvYWRkciArIDB4M2MpOworCisJLyogbm93IHRoZSBzZWNvbmQgY29kZWMgKi8KKwlvdXR3KDB4MDAwMCwgIGlvYWRkcisweDM2KTsKKwlvdXR3KDB4ZmZmNywgaW9hZGRyICsgMHg2NCk7CisJc2F2ZV82OCA9IGludyhpb2FkZHIrMHg2OCk7CisJb3V0dygweDAwMDksIGlvYWRkciArIDB4NjgpOworCW91dHcoMHgwMDAxLCBpb2FkZHIgKyAweDYwKTsKKwl1ZGVsYXkoMjApOworCW91dHcoMHgwMDA5LCBpb2FkZHIgKyAweDYwKTsKKwltZGVsYXkoNTAwKTsJLyogLi4gb3VjaC4uICovCisJb3V0dyggaW53KGlvYWRkciArIDB4MzgpICYgMHhmZmZjLCBpb2FkZHIgKyAweDM4KTsKKwlvdXR3KCBpbncoaW9hZGRyICsgMHgzYSkgJiAweGZmZmMsIGlvYWRkciArIDB4M2EpOworCW91dHcoIGludyhpb2FkZHIgKyAweDNjKSAmIDB4ZmZmYywgaW9hZGRyICsgMHgzYyk7CisKKyNpZiAwIC8qIHRoZSBsb29wIGhlcmUgbmVlZHMgdG8gYmUgbXVjaCBiZXR0ZXIgaWYgd2Ugd2FudCBpdC4uICovCisJTV9wcmludGsoInRyeWluZyBzb2Z0d2FyZSByZXNldFxuIik7CisJLyogdHJ5IGFuZCBkbyBhIHNvZnR3YXJlIHJlc2V0ICovCisJb3V0YigweDgwfDB4N2MsIGlvYWRkciArIDB4MzApOworCWZvciAodz0wOyA7IHcrKykgeworCQlpZiAoKGludyhpb2FkZHIrIDB4MzApICYgMSkgPT0gMCkgeworCQkJaWYoaW5iKGlvYWRkciArIDB4MzIpICE9MCkgYnJlYWs7CisKKwkJCW91dGIoMHg4MHwweDdkLCBpb2FkZHIgKyAweDMwKTsKKwkJCWlmICgoKGludyhpb2FkZHIrIDB4MzApICYgMSkgPT0gMCkgJiYgKGluYihpb2FkZHIgKyAweDMyKSAhPTApKSBicmVhazsKKwkJCW91dGIoMHg4MHwweDdmLCBpb2FkZHIgKyAweDMwKTsKKwkJCWlmICgoKGludyhpb2FkZHIrIDB4MzApICYgMSkgPT0gMCkgJiYgKGluYihpb2FkZHIgKyAweDMyKSAhPTApKSBicmVhazsKKwkJfQorCisJCWlmKCB3ID4gMTAwMDApIHsKKwkJCW91dGIoIGluYihpb2FkZHIgKyAweDM3KSB8IDB4MDgsIGlvYWRkciArIDB4MzcpOyAgLyogZG8gYSBzb2Z0d2FyZSByZXNldCAqLworCQkJbWRlbGF5KDUwMCk7IC8qIG9oIG15Li4gKi8KKwkJCW91dGIoIGluYihpb2FkZHIgKyAweDM3KSAmIH4weDA4LCBpb2FkZHIgKyAweDM3KTsgIAorCQkJdWRlbGF5KDEpOworCQkJb3V0dyggMHg4MCwgaW9hZGRyKzB4MzApOworCQkJZm9yKHcgPSAwIDsgdyA8IDEwMDAwOyB3KyspIHsKKwkJCQlpZigoaW53KGlvYWRkciArIDB4MzApICYgMSkgPT0wKSBicmVhazsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCWlmICggdmVuZCA9PSBORUNfVkVSU0FfU1VCSUQxIHx8IHZlbmQgPT0gTkVDX1ZFUlNBX1NVQklEMikgeworCQkvKiB0dXJuIG9uIGV4dGVybmFsIGFtcD8gKi8KKwkJb3V0dygweGY5ZmYsIGlvYWRkciArIDB4NjQpOworCQlvdXR3KGludyhpb2FkZHIrMHg2OCkgfCAweDYwMCwgaW9hZGRyICsgMHg2OCk7CisJCW91dHcoMHgwMjA5LCBpb2FkZHIgKyAweDYwKTsKKwl9CisKKwkvKiBUdXJuIG9uIHRoZSA5NzggZG9ja2luZyBjaGlwLgorCSAgIEZpcnN0IGZyb2IgdGhlICJtYXN0ZXIgb3V0cHV0IGVuYWJsZSIgYml0LAorCSAgIHRoZW4gc2V0IG1vc3Qgb2YgdGhlIHBsYXliYWNrIHZvbHVtZSBjb250cm9sIHJlZ2lzdGVycyB0byBtYXguICovCisJb3V0YihpbmIoaW9hZGRyKzB4YzApfCgxPDw1KSwgaW9hZGRyKzB4YzApOworCW91dGIoMHhmZiwgaW9hZGRyKzB4YzMpOworCW91dGIoMHhmZiwgaW9hZGRyKzB4YzQpOworCW91dGIoMHhmZiwgaW9hZGRyKzB4YzYpOworCW91dGIoMHhmZiwgaW9hZGRyKzB4YzgpOworCW91dGIoMHgzZiwgaW9hZGRyKzB4Y2YpOworCW91dGIoMHgzZiwgaW9hZGRyKzB4ZDApOworfQorLyoKKyAqCUluZGlyZWN0IHJlZ2lzdGVyIGFjY2Vzcy4gTm90IGFsbCByZWdpc3RlcnMgYXJlIHJlYWRhYmxlIHNvIHdlCisgKgluZWVkIHRvIGtlZXAgcmVnaXN0ZXIgc3RhdGUgb3Vyc2VsdmVzCisgKi8KKyAKKyNkZWZpbmUgV1JJVEVBQkxFX01BUAkweEVGRkZGRgorI2RlZmluZSBSRUFEQUJMRV9NQVAJMHg2NDAwM0YKKworLyoKKyAqCVRoZSBNYWVzdHJvIGVuZ2luZWVycyB3ZXJlIGEgbGl0dGxlIGluZGlyZWN0aW9uIGhhcHB5LiBUaGVzZSBpbmRpcmVjdGVkCisgKglyZWdpc3RlcnMgdGhlbXNlbHZlcyBpbmNsdWRlIGluZGlyZWN0IHJlZ2lzdGVycyBhdCBhbm90aGVyIGxheWVyCisgKi8KKworc3RhdGljIHZvaWQgX19tYWVzdHJvX3dyaXRlKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgdTE2IHJlZywgdTE2IGRhdGEpCit7CisJbG9uZyBpb2FkZHIgPSBjYXJkLT5pb2Jhc2U7CisKKwlvdXR3KHJlZywgaW9hZGRyKzB4MDIpOworCW91dHcoZGF0YSwgaW9hZGRyKzB4MDApOworCWlmKCByZWcgPj0gTlJfSURSUykgcHJpbnRrKCJtYWVzdHJvOiBJRFIgJWQgb3V0IG9mIGJvdW5kcyFcbiIscmVnKTsKKwllbHNlIGNhcmQtPm1hZXN0cm9fbWFwW3JlZ109ZGF0YTsKKworfQorIAorc3RhdGljIHZvaWQgbWFlc3Ryb193cml0ZShzdHJ1Y3QgZXNzX3N0YXRlICpzLCB1MTYgcmVnLCB1MTYgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2hlY2tfc3VzcGVuZChzLT5jYXJkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jayxmbGFncyk7CisKKwlfX21hZXN0cm9fd3JpdGUocy0+Y2FyZCxyZWcsZGF0YSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHUxNiBfX21hZXN0cm9fcmVhZChzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsIHUxNiByZWcpCit7CisJbG9uZyBpb2FkZHIgPSBjYXJkLT5pb2Jhc2U7CisKKwlvdXR3KHJlZywgaW9hZGRyKzB4MDIpOworCXJldHVybiBjYXJkLT5tYWVzdHJvX21hcFtyZWddPWludyhpb2FkZHIrMHgwMCk7Cit9CisKK3N0YXRpYyB1MTYgbWFlc3Ryb19yZWFkKHN0cnVjdCBlc3Nfc3RhdGUgKnMsIHUxNiByZWcpCit7CisJaWYoUkVBREFCTEVfTUFQICYgKDE8PHJlZykpCisJeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQljaGVja19zdXNwZW5kKHMtPmNhcmQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jayxmbGFncyk7CisKKwkJX19tYWVzdHJvX3JlYWQocy0+Y2FyZCxyZWcpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssZmxhZ3MpOworCX0KKwlyZXR1cm4gcy0+Y2FyZC0+bWFlc3Ryb19tYXBbcmVnXTsKK30KKworLyoKKyAqCVRoZXNlIHJvdXRpbmVzIGhhbmRsZSBhY2Nlc3NpbmcgdGhlIHNlY29uZCBsZXZlbCBpbmRpcmVjdGlvbnMgdG8gdGhlCisgKgl3YXZlIHJhbS4KKyAqLworCisvKgorICoJVGhlIHJlZ2lzdGVyIG5hbWVzIGFyZSB0aGUgb25lcyBFU1MgdXNlcyAoc2VlIDEwNFQzMS5aSVApCisgKi8KKyAKKyNkZWZpbmUgSURSMF9EQVRBX1BPUlQJCTB4MDAKKyNkZWZpbmUgSURSMV9DUkFNX1BPSU5URVIJMHgwMQorI2RlZmluZSBJRFIyX0NSQU1fREFUQQkJMHgwMgorI2RlZmluZSBJRFIzX1dBVkVfREFUQQkJMHgwMworI2RlZmluZSBJRFI0X1dBVkVfUFRSX0xPVwkweDA0CisjZGVmaW5lIElEUjVfV0FWRV9QVFJfSEkJMHgwNQorI2RlZmluZSBJRFI2X1RJTUVSX0NUUkwJCTB4MDYKKyNkZWZpbmUgSURSN19XQVZFX1JPTVJBTQkweDA3CisKK3N0YXRpYyB2b2lkIGFwdV9pbmRleF9zZXQoc3RydWN0IGVzc19jYXJkICpjYXJkLCB1MTYgaW5kZXgpCit7CisJaW50IGk7CisJX19tYWVzdHJvX3dyaXRlKGNhcmQsIElEUjFfQ1JBTV9QT0lOVEVSLCBpbmRleCk7CisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCQlpZihfX21hZXN0cm9fcmVhZChjYXJkLCBJRFIxX0NSQU1fUE9JTlRFUik9PWluZGV4KQorCQkJcmV0dXJuOworCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm86IEFQVSByZWdpc3RlciBzZWxlY3QgZmFpbGVkLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGFwdV9kYXRhX3NldChzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsIHUxNiBkYXRhKQoreworCWludCBpOworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWlmKF9fbWFlc3Ryb19yZWFkKGNhcmQsIElEUjBfREFUQV9QT1JUKT09ZGF0YSkKKwkJCXJldHVybjsKKwkJX19tYWVzdHJvX3dyaXRlKGNhcmQsIElEUjBfREFUQV9QT1JULCBkYXRhKTsKKwl9Cit9CisKKy8qCisgKglUaGlzIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZvciBBUFUgbWFuaXB1bGF0aW9uLiBJdCBoYW5kbGVzIHRoZQorICoJaW50ZXJsb2NrIHRvIGF2b2lkIHR3byBBUFUgd3JpdGVzIGluIHBhcmFsbGVsIGV0Yy4gRG9uJ3QgZGlkZGxlCisgKglkaXJlY3RseSB3aXRoIHRoZSBzdHVmZiBhYm92ZS4KKyAqLworCitzdGF0aWMgdm9pZCBhcHVfc2V0X3JlZ2lzdGVyKHN0cnVjdCBlc3Nfc3RhdGUgKnMsIHUxNiBjaGFubmVsLCB1OCByZWcsIHUxNiBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJY2hlY2tfc3VzcGVuZChzLT5jYXJkKTsKKworCWlmKGNoYW5uZWwmRVNTX0NIQU5fSEFSRCkKKwkJY2hhbm5lbCY9fkVTU19DSEFOX0hBUkQ7CisJZWxzZQorCXsKKwkJaWYoY2hhbm5lbD41KQorCQkJcHJpbnRrKCJCQUQgQ0hBTk5FTCAlZC5cbiIsY2hhbm5lbCk7CisJCWVsc2UKKwkJCWNoYW5uZWwgPSBzLT5hcHVbY2hhbm5lbF07CisJCS8qIHN0b3JlIGJhc2VkIG9uIHJlYWwgaGFyZHdhcmUgYXB1L3JlZyAqLworCQlzLT5jYXJkLT5hcHVfbWFwW2NoYW5uZWxdW3JlZ109ZGF0YTsKKwl9CisJcmVnfD0oY2hhbm5lbDw8NCk7CisJCisJLyogaG9vcmF5IGZvciBkb3VibGUgaW5kaXJlY3Rpb24hISAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKKworCWFwdV9pbmRleF9zZXQocy0+Y2FyZCwgcmVnKTsKKwlhcHVfZGF0YV9zZXQocy0+Y2FyZCwgZGF0YSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHUxNiBhcHVfZ2V0X3JlZ2lzdGVyKHN0cnVjdCBlc3Nfc3RhdGUgKnMsIHUxNiBjaGFubmVsLCB1OCByZWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgdjsKKwkKKwljaGVja19zdXNwZW5kKHMtPmNhcmQpOworCisJaWYoY2hhbm5lbCZFU1NfQ0hBTl9IQVJEKQorCQljaGFubmVsJj1+RVNTX0NIQU5fSEFSRDsKKwllbHNlCisJCWNoYW5uZWwgPSBzLT5hcHVbY2hhbm5lbF07CisKKwlyZWd8PShjaGFubmVsPDw0KTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jayxmbGFncyk7CisKKwlhcHVfaW5kZXhfc2V0KHMtPmNhcmQsIHJlZyk7CisJdj1fX21hZXN0cm9fcmVhZChzLT5jYXJkLCBJRFIwX0RBVEFfUE9SVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gdjsKK30KKworCisvKgorICoJVGhlIHdhdmVjYWNoZSBidWZmZXJzIGJldHdlZW4gdGhlIEFQVXMgYW5kCisgKglwY2kgYnVzIG1hc3RlcmluZworICovCisgCitzdGF0aWMgdm9pZCB3YXZlX3NldF9yZWdpc3RlcihzdHJ1Y3QgZXNzX3N0YXRlICpzLCB1MTYgcmVnLCB1MTYgdmFsdWUpCit7CisJbG9uZyBpb2FkZHIgPSBzLT5jYXJkLT5pb2Jhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGVja19zdXNwZW5kKHMtPmNhcmQpOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKKworCW91dHcocmVnLCBpb2FkZHIrMHgxMCk7CisJb3V0dyh2YWx1ZSwgaW9hZGRyKzB4MTIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB1MTYgd2F2ZV9nZXRfcmVnaXN0ZXIoc3RydWN0IGVzc19zdGF0ZSAqcywgdTE2IHJlZykKK3sKKwlsb25nIGlvYWRkciA9IHMtPmNhcmQtPmlvYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiB2YWx1ZTsKKwljaGVja19zdXNwZW5kKHMtPmNhcmQpOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKKwlvdXR3KHJlZywgaW9hZGRyKzB4MTApOworCXZhbHVlPWludyhpb2FkZHIrMHgxMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jayxmbGFncyk7CisJCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBzb3VuZF9yZXNldChpbnQgaW9hZGRyKQoreworCW91dHcoMHgyMDAwLCAweDE4K2lvYWRkcik7CisJdWRlbGF5KDEpOworCW91dHcoMHgwMDAwLCAweDE4K2lvYWRkcik7CisJdWRlbGF5KDEpOworfQorCisvKiBzZXRzIHRoZSBwbGF5IGZvcm1hdHMgb2YgdGhlc2UgYXB1cywgc2hvdWxkIGJlIHBhc3NlZCB0aGUgYWxyZWFkeSBzaGlmdGVkIGZvcm1hdCAqLworc3RhdGljIHZvaWQgc2V0X2FwdV9mbXQoc3RydWN0IGVzc19zdGF0ZSAqcywgaW50IGFwdSwgaW50IG1vZGUpCit7CisJaW50IGFwdV9mbXQgPSAweDEwOworCisJaWYoIShtb2RlJkVTU19GTVRfMTZCSVQpKSBhcHVfZm10Kz0weDIwOyAKKwlpZigobW9kZSZFU1NfRk1UX1NURVJFTykpIGFwdV9mbXQrPTB4MTA7IAorCXMtPmFwdV9tb2RlW2FwdV0gICA9IGFwdV9mbXQ7CisJcy0+YXB1X21vZGVbYXB1KzFdID0gYXB1X2ZtdDsKK30KKworLyogdGhpcyBvbmx5IGZpeGVzIHRoZSBvdXRwdXQgYXB1IG1vZGUgdG8gYmUgbGF0ZXIgc2V0IGJ5IHN0YXJ0X2RhYyBhbmQKKwljb21wYW55LiAgb3V0cHV0IGFwdSBtb2RlcyBhcmUgc2V0IGluIGVzc19yZWNfc2V0dXAgKi8KK3N0YXRpYyB2b2lkIHNldF9mbXQoc3RydWN0IGVzc19zdGF0ZSAqcywgdW5zaWduZWQgY2hhciBtYXNrLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJcy0+Zm10ID0gKHMtPmZtdCAmIG1hc2spIHwgZGF0YTsKKwlzZXRfYXB1X2ZtdChzLCAwLCAocy0+Zm10ID4+IEVTU19EQUNfU0hJRlQpICYgRVNTX0ZNVF9NQVNLKTsKK30KKworLyogdGhpcyBpcyBvZmYgYnkgYSBsaXR0bGUgYml0Li4gKi8KK3N0YXRpYyB1MzIgY29tcHV0ZV9yYXRlKHN0cnVjdCBlc3Nfc3RhdGUgKnMsIHUzMiBmcmVxKQoreworCXUzMiBjbG9jayA9IGNsb2NrX2ZyZXFbcy0+Y2FyZC0+Y2FyZF90eXBlXTsgICAgIAorCisJZnJlcSA9IChmcmVxICogY2xvY2tpbmcpLzQ4MDAwOworCQorCWlmIChmcmVxID09IDQ4MDAwKSAKKwkJcmV0dXJuIDB4MTAwMDA7CisKKwlyZXR1cm4gKChmcmVxIC8gY2xvY2spIDw8MTYgKSsgIAorCQkoKChmcmVxICUgY2xvY2spIDw8IDE2KSAvIGNsb2NrKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2RhY19yYXRlKHN0cnVjdCBlc3Nfc3RhdGUgKnMsIHVuc2lnbmVkIGludCByYXRlKQoreworCXUzMiBmcmVxOworCWludCBmbXQgPSAocy0+Zm10ID4+IEVTU19EQUNfU0hJRlQpICYgRVNTX0ZNVF9NQVNLOworCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgNDAwMCkKKwkJcmF0ZSA9IDQwMDA7CisKKwlzLT5yYXRlZGFjID0gcmF0ZTsKKworCWlmKCEgKGZtdCAmIEVTU19GTVRfMTZCSVQpICYmICEoZm10ICYgRVNTX0ZNVF9TVEVSRU8pKQorCQlyYXRlID4+PSAxOworCisvKglNX3ByaW50aygiY29tcHV0aW5nIGRhYyByYXRlICVkIHdpdGggbW9kZSAlZFxuIixyYXRlLHMtPmZtdCk7Ki8KKworCWZyZXEgPSBjb21wdXRlX3JhdGUocywgcmF0ZSk7CisJCisJLyogTG9hZCB0aGUgZnJlcXVlbmN5LCB0dXJuIG9uIDZkQiAqLworCWFwdV9zZXRfcmVnaXN0ZXIocywgMCwgMiwoYXB1X2dldF9yZWdpc3RlcihzLCAwLCAyKSYweDAwRkYpfAorCQkoICgoZnJlcSYweEZGKTw8OCl8MHgxMCApKTsKKwlhcHVfc2V0X3JlZ2lzdGVyKHMsIDAsIDMsIGZyZXE+PjgpOworCWFwdV9zZXRfcmVnaXN0ZXIocywgMSwgMiwoYXB1X2dldF9yZWdpc3RlcihzLCAxLCAyKSYweDAwRkYpfAorCQkoICgoZnJlcSYweEZGKTw8OCl8MHgxMCApKTsKKwlhcHVfc2V0X3JlZ2lzdGVyKHMsIDEsIDMsIGZyZXE+PjgpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYWRjX3JhdGUoc3RydWN0IGVzc19zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwl1MzIgZnJlcTsKKworCS8qIFNhbXBsZSBSYXRlIGNvbnZlcnNpb24gQVBVcyBkb24ndCBsaWtlIDB4MTAwMDAgZm9yIHRoZWlyIHJhdGUgKi8KKwlpZiAocmF0ZSA+IDQ3OTk5KQorCQlyYXRlID0gNDc5OTk7CisJaWYgKHJhdGUgPCA0MDAwKQorCQlyYXRlID0gNDAwMDsKKworCXMtPnJhdGVhZGMgPSByYXRlOworCisJZnJlcSA9IGNvbXB1dGVfcmF0ZShzLCByYXRlKTsKKwkKKwkvKiBMb2FkIHRoZSBmcmVxdWVuY3ksIHR1cm4gb24gNmRCICovCisJYXB1X3NldF9yZWdpc3RlcihzLCAyLCAyLChhcHVfZ2V0X3JlZ2lzdGVyKHMsIDIsIDIpJjB4MDBGRil8CisJCSggKChmcmVxJjB4RkYpPDw4KXwweDEwICkpOworCWFwdV9zZXRfcmVnaXN0ZXIocywgMiwgMywgZnJlcT4+OCk7CisJYXB1X3NldF9yZWdpc3RlcihzLCAzLCAyLChhcHVfZ2V0X3JlZ2lzdGVyKHMsIDMsIDIpJjB4MDBGRil8CisJCSggKChmcmVxJjB4RkYpPDw4KXwweDEwICkpOworCWFwdV9zZXRfcmVnaXN0ZXIocywgMywgMywgZnJlcT4+OCk7CisKKwkvKiBmaXggbWl4ZXIgcmF0ZSBhdCA0OGtoei4gIGFuZCBpdHMgX211c3RfIGJlIDB4MTAwMDAuICovCisJZnJlcSA9IDB4MTAwMDA7CisKKwlhcHVfc2V0X3JlZ2lzdGVyKHMsIDQsIDIsKGFwdV9nZXRfcmVnaXN0ZXIocywgNCwgMikmMHgwMEZGKXwKKwkJKCAoKGZyZXEmMHhGRik8PDgpfDB4MTAgKSk7CisJYXB1X3NldF9yZWdpc3RlcihzLCA0LCAzLCBmcmVxPj44KTsKKwlhcHVfc2V0X3JlZ2lzdGVyKHMsIDUsIDIsKGFwdV9nZXRfcmVnaXN0ZXIocywgNSwgMikmMHgwMEZGKXwKKwkJKCAoKGZyZXEmMHhGRik8PDgpfDB4MTAgKSk7CisJYXB1X3NldF9yZWdpc3RlcihzLCA1LCAzLCBmcmVxPj44KTsKK30KKworLyogU3RvcCBvdXIgaG9zdCBvZiByZWNvcmRpbmcgYXB1cyAqLworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfYWRjKHN0cnVjdCBlc3Nfc3RhdGUgKnMpCit7CisJLyogWFhYIGxldHMgaG9wZSB3ZSBkb24ndCBoYXZlIHRvIGxvY2sgYXJvdW5kIHRoaXMgKi8KKwlpZiAoISAocy0+ZW5hYmxlICYgQURDX1JVTk5JTkcpKSByZXR1cm47CisKKwlzLT5lbmFibGUgJj0gfkFEQ19SVU5OSU5HOworCWFwdV9zZXRfcmVnaXN0ZXIocywgMiwgMCwgYXB1X2dldF9yZWdpc3RlcihzLCAyLCAwKSYweEZGMEYpOworCWFwdV9zZXRfcmVnaXN0ZXIocywgMywgMCwgYXB1X2dldF9yZWdpc3RlcihzLCAzLCAwKSYweEZGMEYpOworCWFwdV9zZXRfcmVnaXN0ZXIocywgNCwgMCwgYXB1X2dldF9yZWdpc3RlcihzLCAyLCAwKSYweEZGMEYpOworCWFwdV9zZXRfcmVnaXN0ZXIocywgNSwgMCwgYXB1X2dldF9yZWdpc3RlcihzLCAzLCAwKSYweEZGMEYpOworfQkKKworLyogc3RvcCBvdXRwdXQgYXB1cyAqLworc3RhdGljIHZvaWQgc3RvcF9kYWMoc3RydWN0IGVzc19zdGF0ZSAqcykKK3sKKwkvKiBYWFggaGF2ZSB0byBsb2NrIGFyb3VuZCB0aGlzPyAqLworCWlmICghIChzLT5lbmFibGUgJiBEQUNfUlVOTklORykpIHJldHVybjsKKworCXMtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7CisJYXB1X3NldF9yZWdpc3RlcihzLCAwLCAwLCBhcHVfZ2V0X3JlZ2lzdGVyKHMsIDAsIDApJjB4RkYwRik7CisJYXB1X3NldF9yZWdpc3RlcihzLCAxLCAwLCBhcHVfZ2V0X3JlZ2lzdGVyKHMsIDEsIDApJjB4RkYwRik7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGVzc19zdGF0ZSAqcykKK3sKKwkvKiBYWFggbG9ja3M/ICovCisJaWYgKAkocy0+ZG1hX2RhYy5tYXBwZWQgfHwgcy0+ZG1hX2RhYy5jb3VudCA+IDApICYmIAorCQlzLT5kbWFfZGFjLnJlYWR5ICYmCisJCSghIChzLT5lbmFibGUgJiBEQUNfUlVOTklORykpICkgeworCisJCXMtPmVuYWJsZSB8PSBEQUNfUlVOTklORzsKKworCQlhcHVfc2V0X3JlZ2lzdGVyKHMsIDAsIDAsIAorCQkJKGFwdV9nZXRfcmVnaXN0ZXIocywgMCwgMCkmMHhGRjBGKXxzLT5hcHVfbW9kZVswXSk7CisKKwkJaWYoKHMtPmZtdCA+PiBFU1NfREFDX1NISUZUKSAgJiBFU1NfRk1UX1NURVJFTykgCisJCQlhcHVfc2V0X3JlZ2lzdGVyKHMsIDEsIDAsIAorCQkJCShhcHVfZ2V0X3JlZ2lzdGVyKHMsIDEsIDApJjB4RkYwRil8cy0+YXB1X21vZGVbMV0pOworCX0KK30JCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgZXNzX3N0YXRlICpzKQoreworCS8qIFhYWCBsb2Nrcz8gKi8KKwlpZiAoKHMtPmRtYV9hZGMubWFwcGVkIHx8IHMtPmRtYV9hZGMuY291bnQgPCAoc2lnbmVkKShzLT5kbWFfYWRjLmRtYXNpemUgLSAyKnMtPmRtYV9hZGMuZnJhZ3NpemUpKSAKKwkgICAgJiYgcy0+ZG1hX2FkYy5yZWFkeSAmJiAoISAocy0+ZW5hYmxlICYgQURDX1JVTk5JTkcpKSApIHsKKworCQlzLT5lbmFibGUgfD0gQURDX1JVTk5JTkc7CisJCWFwdV9zZXRfcmVnaXN0ZXIocywgMiwgMCwgCisJCQkoYXB1X2dldF9yZWdpc3RlcihzLCAyLCAwKSYweEZGMEYpfHMtPmFwdV9tb2RlWzJdKTsKKwkJYXB1X3NldF9yZWdpc3RlcihzLCA0LCAwLCAKKwkJCShhcHVfZ2V0X3JlZ2lzdGVyKHMsIDQsIDApJjB4RkYwRil8cy0+YXB1X21vZGVbNF0pOworCisJCWlmKCBzLT5mbXQgJiAoRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVCkpIHsKKwkJCWFwdV9zZXRfcmVnaXN0ZXIocywgMywgMCwgCisJCQkJKGFwdV9nZXRfcmVnaXN0ZXIocywgMywgMCkmMHhGRjBGKXxzLT5hcHVfbW9kZVszXSk7CisJCQlhcHVfc2V0X3JlZ2lzdGVyKHMsIDUsIDAsIAorCQkJCShhcHVfZ2V0X3JlZ2lzdGVyKHMsIDUsIDApJjB4RkYwRil8cy0+YXB1X21vZGVbNV0pOworCQl9CisJCQkKKwl9Cit9CQorCisKKy8qCisgKglOYXRpdmUgcGxheSBiYWNrIGRyaXZlciAKKyAqLworCisvKiB0aGUgbW9kZSBwYXNzZWQgc2hvdWxkIGJlIGFscmVhZHkgc2hpZnRlZCBhbmQgbWFza2VkICovCitzdGF0aWMgdm9pZCAKK2Vzc19wbGF5X3NldHVwKHN0cnVjdCBlc3Nfc3RhdGUgKmVzcywgaW50IG1vZGUsIHUzMiByYXRlLCB2b2lkICpidWZmZXIsIGludCBzaXplKQoreworCXUzMiBwYTsKKwl1MzIgdG1wdmFsOworCWludCBoaWdoX2FwdSA9IDA7CisJaW50IGNoYW5uZWw7CisKKwlNX3ByaW50aygibW9kZT0lZCByYXRlPSVkIGJ1Zj0lcCBsZW49JWQuXG4iLAorCQltb2RlLCByYXRlLCBidWZmZXIsIHNpemUpOworCQkKKwkvKiBhbGwgbWFlc3RybyBzaXplcyBhcmUgaW4gMTZiaXQgd29yZHMgKi8KKwlzaXplID4+PTE7CisKKwlpZihtb2RlJkVTU19GTVRfU1RFUkVPKSB7CisJCWhpZ2hfYXB1Kys7CisJCS8qIG9ubHkgMTYvc3RlcmVvIGdldHMgc2l6ZSBkaXZpZGVkICovCisJCWlmKG1vZGUmRVNTX0ZNVF8xNkJJVCkKKwkJCXNpemU+Pj0xOworCX0KKwkKKwlmb3IoY2hhbm5lbD0wOyBjaGFubmVsIDw9IGhpZ2hfYXB1OyBjaGFubmVsKyspCisJeworCQlwYSA9IHZpcnRfdG9fYnVzKGJ1ZmZlcik7CisKKwkJLyogc2V0IHRoZSB3YXZlY2FjaGUgY29udHJvbCByZWcgKi8KKwkJdG1wdmFsID0gKHBhIC0gMHgxMCkgJiAweEZGRjg7CisJCWlmKCEobW9kZSAmIEVTU19GTVRfMTZCSVQpKSB0bXB2YWwgfD0gNDsKKwkJaWYobW9kZSAmIEVTU19GTVRfU1RFUkVPKSB0bXB2YWwgfD0gMjsKKwkJZXNzLT5hcHVfYmFzZVtjaGFubmVsXT10bXB2YWw7CisJCXdhdmVfc2V0X3JlZ2lzdGVyKGVzcywgZXNzLT5hcHVbY2hhbm5lbF08PDMsIHRtcHZhbCk7CisJCQorCQlwYSAtPSB2aXJ0X3RvX2J1cyhlc3MtPmNhcmQtPmRtYXBhZ2VzKTsKKwkJcGE+Pj0xOyAvKiB3b3JkcyAqLworCQkKKwkJLyogYmFzZSBvZmZzZXQgb2YgZG1hIGNhbGNzIHdoZW4gcmVhZGluZyB0aGUgcG9pbnRlcgorCQkJb24gdGhlIGxlZnQgb25lICovCisJCWlmKCFjaGFubmVsKSBlc3MtPmRtYV9kYWMuYmFzZSA9IHBhJjB4RkZGRjsKKwkJCisJCXBhfD0weDAwNDAwMDAwOwkJCS8qIFN5c3RlbSBSQU0gKi8KKworCQkvKiBYWFggdGhlIDE2Yml0IGhlcmUgbWlnaHQgbm90IGJlIG5lZWRlZC4uICovCisJCWlmKChtb2RlICYgRVNTX0ZNVF9TVEVSRU8pICYmIChtb2RlICYgRVNTX0ZNVF8xNkJJVCkpIHsKKwkJCWlmKGNoYW5uZWwpIAorCQkJCXBhfD0weDAwODAwMDAwOwkJCS8qIFN0ZXJlbyAqLworCQkJcGE+Pj0xOworCQl9CisJCQkKKy8qIFhYWCB0aGluayBhYm91dCBlbmRpYW5lc3Mgd2hlbiB3cml0aW5nIHRoZXNlIHJlZ2lzdGVycyAqLworCQlNX3ByaW50aygibWFlc3RybzogZXNzX3BsYXlfc2V0dXA6IEFQVVslZF0gcGEgPSAweCV4XG4iLCBlc3MtPmFwdVtjaGFubmVsXSwgcGEpOworCQkvKiBzdGFydCBvZiBzYW1wbGUgKi8KKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDQsICgocGE+PjE2KSYweEZGKTw8OCk7CisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCA1LCBwYSYweEZGRkYpOworCQkvKiBzYW1wbGUgZW5kICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCA2LCAocGErc2l6ZSkmMHhGRkZGKTsKKwkJLyogc2V0dGluZyBsb29wIGxlbiA9PSBzYW1wbGUgbGVuICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCA3LCBzaXplKTsKKwkJCisJCS8qIGNsZWFyIGVmZmVjdHMvZW52Li4gKi8KKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDgsIDB4MDAwMCk7CisJCS8qIHNldCBhbXAgbm93IHRvIDB4ZDAgKD8pLCBsb3cgYnl0ZSBpcyAnYW1wbGl0dWRlIGRlc3QnPyAqLworCQlhcHVfc2V0X3JlZ2lzdGVyKGVzcywgY2hhbm5lbCwgOSwgMHhEMDAwKTsKKworCQkvKiBjbGVhciByb3V0aW5nIHN0dWZmICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCAxMSwgMHgwMDAwKTsKKwkJLyogZG1hIG9uLCBubyBlbnZlbG9wZXMsIGZpbHRlciB0byBhbGwgMXMpICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCAwLCAweDQwMEYpOworCQkKKwkJaWYobW9kZSZFU1NfRk1UXzE2QklUKQorCQkJZXNzLT5hcHVfbW9kZVtjaGFubmVsXT0weDEwOworCQllbHNlCisJCQllc3MtPmFwdV9tb2RlW2NoYW5uZWxdPTB4MzA7CisKKwkJaWYobW9kZSZFU1NfRk1UX1NURVJFTykgeworCQkJLyogc2V0IHBhbm5pbmc6IGxlZnQgb3IgcmlnaHQgKi8KKwkJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCAxMCwgMHg4RjAwIHwgKGNoYW5uZWwgPyAwIDogMHgxMCkpOworCQkJZXNzLT5hcHVfbW9kZVtjaGFubmVsXSArPSAweDEwOworCQl9IGVsc2UKKwkJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCAxMCwgMHg4RjA4KTsKKwl9CisJCisJLyogY2xlYXIgV1AgaW50ZXJydXB0cyAqLworCW91dHcoMSwgZXNzLT5jYXJkLT5pb2Jhc2UrMHgwNCk7CisJLyogZW5hYmxlIFdQIGludHMgKi8KKwlvdXR3KGludyhlc3MtPmNhcmQtPmlvYmFzZSsweDE4KXw0LCBlc3MtPmNhcmQtPmlvYmFzZSsweDE4KTsKKworCS8qIGdvIHRlYW0hICovCisJc2V0X2RhY19yYXRlKGVzcyxyYXRlKTsKKwlzdGFydF9kYWMoZXNzKTsKK30KKworLyoKKyAqCU5hdGl2ZSByZWNvcmQgZHJpdmVyIAorICovCisKKy8qIGFnYWluLCBwYXNzZWQgbW9kZSBpcyBhbHJhZHkgc2hpZnRlZC9tYXNrZWQgKi8KK3N0YXRpYyB2b2lkIAorZXNzX3JlY19zZXR1cChzdHJ1Y3QgZXNzX3N0YXRlICplc3MsIGludCBtb2RlLCB1MzIgcmF0ZSwgdm9pZCAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgYXB1X3N0ZXAgPSAyOworCWludCBjaGFubmVsOworCisJTV9wcmludGsoIm1hZXN0cm86IGVzc19yZWNfc2V0dXA6IG1vZGU9JWQgcmF0ZT0lZCBidWY9MHglcCBsZW49JWQuXG4iLAorCQltb2RlLCByYXRlLCBidWZmZXIsIHNpemUpOworCQkKKwkvKiBhbGwgbWFlc3RybyBzaXplcyBhcmUgaW4gMTZiaXQgd29yZHMgKi8KKwlzaXplID4+PTE7CisKKwkvKiB3ZSdyZSBnaXZlbiB0aGUgZnVsbCBzaXplIG9mIHRoZSBidWZmZXIsIGJ1dAorCWluIHN0ZXJlbyBlYWNoIGNoYW5uZWwgd2lsbCBvbmx5IHVzZSBpdHMgaGFsZiAqLworCWlmKG1vZGUmRVNTX0ZNVF9TVEVSRU8pIHsKKwkJc2l6ZSA+Pj0xOyAKKwkJYXB1X3N0ZXAgPSAxOworCX0KKwkKKwkvKiBBUFUgYXNzaWdubWVudHM6IDIgPSBtb25vL2xlZnQgU1JDCisJICAgICAgICAgICAgICAgICAgICAzID0gcmlnaHQgU1JDCisJICAgICAgICAgICAgICAgICAgICA0ID0gbW9uby9sZWZ0IElucHV0IE1peGVyCisJICAgICAgICAgICAgICAgICAgICA1ID0gcmlnaHQgSW5wdXQgTWl4ZXIgKi8KKwlmb3IoY2hhbm5lbD0yO2NoYW5uZWw8NjtjaGFubmVsKz1hcHVfc3RlcCkKKwl7CisJCWludCBpOworCQlpbnQgYnNpemUsIHJvdXRlOworCQl1MzIgcGE7CisJCXUzMiB0bXB2YWw7CisKKwkJLyogZGF0YSBzZWVtcyB0byBmbG93IGZyb20gdGhlIGNvZGVjLCB0aHJvdWdoIGFuIGFwdSBpbnRvCisJCQl0aGUgJ21peGJ1ZicgYml0IG9mIHBhZ2UsIHRoZW4gdGhyb3VnaCB0aGUgU1JDIGFwdQorCQkJYW5kIG91dCB0byB0aGUgcmVhbCAnYnVmZmVyJy4gIG9rLiAgc3VyZS4gICovCisJCQorCQlpZihjaGFubmVsICYgMHgwNCkgeworCQkJLyogb2ssIHdlJ3JlIGFuIGlucHV0IG1peGVyIGdvaW5nIGZyb20gYWRjCisJCQkJdGhyb3VnaCB0aGUgbWl4YnVmIHRvIHRoZSBvdGhlciBhcHVzICovCisKKwkJCWlmKCEoY2hhbm5lbCAmIDB4MDEpKSB7IAorCQkJCXBhID0gdmlydF90b19idXMoZXNzLT5taXhidWYpOworCQkJfSBlbHNlIHsKKwkJCQlwYSA9IHZpcnRfdG9fYnVzKGVzcy0+bWl4YnVmICsgKFBBR0VfU0laRSA+PiA0KSk7CisJCQl9CisKKwkJCS8qIHdlIHNvdXJjZSBmcm9tIGEgJ21hZ2ljJyBhcHUgKi8KKwkJCWJzaXplID0gUEFHRV9TSVpFID4+IDU7CS8qIGhhbGYgb2YgdGhpcyBjaGFubmVscyBhbGxvYywgaW4gd29yZHMgKi8KKwkJCXJvdXRlID0gMHgxNCArIChjaGFubmVsIC0gNCk7IC8qIHBhcmFsbGVsIGluIGNyYXAsIHNlZSBtYWVzdHJvIHJlZyAweEMgWzgtMTFdICovCisJCQllc3MtPmFwdV9tb2RlW2NoYW5uZWxdID0gMHg5MDsgIC8qIElucHV0IE1peGVyICovCisKKwkJfSBlbHNlIHsgIAorCQkJLyogd2UncmUgYSByYXRlIGNvbnZlcnRlciB0YWtpbmcKKwkJCQlpbnB1dCBmcm9tIHRoZSBpbnB1dCBhcHVzIGFuZCBvdXRwdXRpbmcgaXQgdG8KKwkJCQlzeXN0ZW0gbWVtb3J5ICovCisJCQlpZighKGNoYW5uZWwgJiAweDAxKSkgIHsKKwkJCQlwYSA9IHZpcnRfdG9fYnVzKGJ1ZmZlcik7CisJCQl9IGVsc2UgeworCQkJCS8qIHJpZ2h0IGNoYW5uZWwgcmVjb3JkcyBpdHMgc3BsaXQgaGFsZi4KKwkJCQkqMiBhY2NvbW1vZGF0ZXMgZm9yIHJhbXBhbnQgc2hpZnRpbmcgZWFybGllciAqLworCQkJCXBhID0gdmlydF90b19idXMoYnVmZmVyICsgc2l6ZSoyKTsKKwkJCX0KKworCQkJZXNzLT5hcHVfbW9kZVtjaGFubmVsXSA9IDB4QjA7ICAvKiBTYW1wbGUgUmF0ZSBDb252ZXJ0ZXIgKi8KKworCQkJYnNpemUgPSBzaXplOyAKKwkJCS8qIGdldCBpbnB1dCBmcm9tIGlucHV0aW5nIGFwdSAqLworCQkJcm91dGUgPSBjaGFubmVsICsgMjsKKwkJfQorCisJCU1fcHJpbnRrKCJtYWVzdHJvOiBlc3NfcmVjX3NldHVwOiBnZXR0aW5nIHBhIDB4JXggZnJvbSAlZFxuIixwYSxjaGFubmVsKTsKKwkJCisJCS8qIHNldCB0aGUgd2F2ZWNhY2hlIGNvbnRyb2wgcmVnICovCisJCXRtcHZhbCA9IChwYSAtIDB4MTApICYgMHhGRkY4OworCQllc3MtPmFwdV9iYXNlW2NoYW5uZWxdPXRtcHZhbDsKKwkJd2F2ZV9zZXRfcmVnaXN0ZXIoZXNzLCBlc3MtPmFwdVtjaGFubmVsXTw8MywgdG1wdmFsKTsKKwkJCisJCXBhIC09IHZpcnRfdG9fYnVzKGVzcy0+Y2FyZC0+ZG1hcGFnZXMpOworCQlwYT4+PTE7IC8qIHdvcmRzICovCisJCQorCQkvKiBiYXNlIG9mZnNldCBvZiBkbWEgY2FsY3Mgd2hlbiByZWFkaW5nIHRoZSBwb2ludGVyCisJCQlvbiB0aGlzIGxlZnQgb25lICovCisJCWlmKGNoYW5uZWw9PTIpIGVzcy0+ZG1hX2FkYy5iYXNlID0gcGEmMHhGRkZGOworCisJCXBhfD0weDAwNDAwMDAwOwkJCS8qIGJpdCAyMiAtPiBTeXN0ZW0gUkFNICovCisKKwkJTV9wcmludGsoIm1hZXN0cm86IGVzc19yZWNfc2V0dXA6IEFQVVslZF0gcGEgPSAweCV4IHNpemUgPSAweCV4IHJvdXRlID0gMHgleFxuIiwgCisJCQllc3MtPmFwdVtjaGFubmVsXSwgcGEsIGJzaXplLCByb3V0ZSk7CisJCQorCQkvKiBCZWdpbiBsb2FkaW5nIHRoZSBBUFUgKi8JCQorCQlmb3IoaT0wO2k8MTU7aSsrKQkJLyogY2xlYXIgYWxsIFBCUnMgKi8KKwkJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCBpLCAweDAwMDApOworCQkJCisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCAwLCAweDQwMEYpOworCisJCS8qIG5lZWQgdG8gZW5hYmxlIHN1Ymdyb3Vwcy4uIGFuZCB3ZSBzaG91bGQgcHJvYmFibHkKKwkJCWhhdmUgZGlmZmVyZW50IGdyb3VwcyBmb3IgZGlmZmVyZW50IC9kZXYvZHNwcy4uICAqLworIAkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDIsIDB4OCk7CisJCQkJCisJCS8qIExvYWQgdGhlIGJ1ZmZlciBpbnRvIHRoZSB3YXZlIGVuZ2luZSAqLworCQlhcHVfc2V0X3JlZ2lzdGVyKGVzcywgY2hhbm5lbCwgNCwgKChwYT4+MTYpJjB4RkYpPDw4KTsKKwkJLyogWFhYIHJlZyBpcyBsaXR0bGUgZW5kaWFuLi4gKi8KKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDUsIHBhJjB4RkZGRik7CisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCA2LCAocGErYnNpemUpJjB4RkZGRik7CisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCA3LCBic2l6ZSk7CisJCQkJCisJCS8qIGNsZWFyIGVmZmVjdHMvZW52Li4gKi8KKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDgsIDB4MDBGMCk7CisJCQorCQkvKiBhbXBsaXR1ZGUgbm93PyAgc3VyZS4gIHdoeSBub3QuICAqLworCQlhcHVfc2V0X3JlZ2lzdGVyKGVzcywgY2hhbm5lbCwgOSwgMHgwMDAwKTsKKworCQkvKiBzZXQgZmlsdGVyIHR1bmUsIHJhZGl1cywgcG9sYXIgcGFuICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCAxMCwgMHg4RjA4KTsKKworCQkvKiByb3V0ZSBpbnB1dCAqLworCQlhcHVfc2V0X3JlZ2lzdGVyKGVzcywgY2hhbm5lbCwgMTEsIHJvdXRlKTsKKwl9CisJCisJLyogY2xlYXIgV1AgaW50ZXJydXB0cyAqLworCW91dHcoMSwgZXNzLT5jYXJkLT5pb2Jhc2UrMHgwNCk7CisJLyogZW5hYmxlIFdQIGludHMgKi8KKwlvdXR3KGludyhlc3MtPmNhcmQtPmlvYmFzZSsweDE4KXw0LCBlc3MtPmNhcmQtPmlvYmFzZSsweDE4KTsKKworCS8qIGxldCAnZXIgcmlwICovCisJc2V0X2FkY19yYXRlKGVzcyxyYXRlKTsKKwlzdGFydF9hZGMoZXNzKTsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBzZXRfZG1hYShzdHJ1Y3QgZXNzX3N0YXRlICpzLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQoreworCU1fcHJpbnRrKCJzZXRfZG1hYT8/XG4iKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2RtYWMoc3RydWN0IGVzc19zdGF0ZSAqcywgdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlNX3ByaW50aygic2V0X2RtYWM/P1xuIik7Cit9CisKKy8qIFBsYXliYWNrIHBvaW50ZXIgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X2RtYWEoc3RydWN0IGVzc19zdGF0ZSAqcykKK3sKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gYXB1X2dldF9yZWdpc3RlcihzLDAsNSk7CisKKy8qCU1fcHJpbnRrKCJkbWFhOiBvZmZzZXQ6ICVkLCBiYXNlOiAlZFxuIixvZmZzZXQscy0+ZG1hX2RhYy5iYXNlKTsgKi8KKwkKKwlvZmZzZXQtPXMtPmRtYV9kYWMuYmFzZTsKKworCXJldHVybiAob2Zmc2V0JjB4RkZGRSk8PDE7IC8qIGhhcmR3YXJlIGlzIGluIHdvcmRzICovCit9CisKKy8qIFJlY29yZCBwb2ludGVyICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF9kbWFjKHN0cnVjdCBlc3Nfc3RhdGUgKnMpCit7CisJaW50IG9mZnNldDsKKworCW9mZnNldCA9IGFwdV9nZXRfcmVnaXN0ZXIocywyLDUpOworCisvKglNX3ByaW50aygiZG1hYzogb2Zmc2V0OiAlZCwgYmFzZTogJWRcbiIsb2Zmc2V0LHMtPmRtYV9hZGMuYmFzZSk7ICovCisJCisJLyogVGhlIG9mZnNldCBpcyBhbiBhZGRyZXNzIG5vdCBhIHBvc2l0aW9uIHJlbGF0aXZlIHRvIGJhc2UgKi8KKwlvZmZzZXQtPXMtPmRtYV9hZGMuYmFzZTsKKwkKKwlyZXR1cm4gKG9mZnNldCYweEZGRkUpPDwxOyAvKiBoYXJkd2FyZSBpcyBpbiB3b3JkcyAqLworfQorCisvKgorICoJTWVldCBCb2IsIHRoZSB0aW1lci4uLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlc3NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgdm9pZCBzdG9wX2JvYihzdHJ1Y3QgZXNzX3N0YXRlICpzKQoreworCS8qIE1hc2sgSURSIDExLDE3ICovCisJbWFlc3Ryb193cml0ZShzLCAgMHgxMSwgbWFlc3Ryb19yZWFkKHMsIDB4MTEpJn4xKTsKKwltYWVzdHJvX3dyaXRlKHMsICAweDE3LCBtYWVzdHJvX3JlYWQocywgMHgxNykmfjEpOworfQorCisvKiBldmVudHVhbGx5IHdlIGNvdWxkIGJlIGNsZXZlciBhbmQgbGltaXQgYm9iIGludHMKKwl0byB0aGUgZnJlcXVlbmN5IGF0IHdoaWNoIG91ciBzbWFsbGVzdCBkdXJhdGlvbgorCWNodW5rcyBtYXkgZXhwaXJlICovCisjZGVmaW5lIEVTU19TWVNDTEsJNTAwMDAwMDAKK3N0YXRpYyB2b2lkIHN0YXJ0X2JvYihzdHJ1Y3QgZXNzX3N0YXRlICpzKQoreworCWludCBwcmVzY2FsZTsKKwlpbnQgZGl2aWRlOworCQorCS8qIFhYWCBtYWtlIGZyZXEgc2VsZWN0b3IgbXVjaCBzbWFydGVyLCBzZWUgY2FsY19ib2JfcmF0ZSAqLworCWludCBmcmVxID0gMjAwOyAKKwkKKwkvKiBjb21wdXRlIGlkZWFsIGludGVycnVwdCBmcmVxdWVuY3kgZm9yIGJ1ZmZlciBzaXplICYgcGxheSByYXRlICovCisJLyogZmlyc3QsIGZpbmQgYmVzdCBwcmVzY2FsZXIgdmFsdWUgdG8gbWF0Y2ggZnJlcSAqLworCWZvcihwcmVzY2FsZT01O3ByZXNjYWxlPDEyO3ByZXNjYWxlKyspCisJCWlmKGZyZXEgPiAoRVNTX1NZU0NMSz4+KHByZXNjYWxlKzkpKSkKKwkJCWJyZWFrOworCQkJCisJLyogbmV4dCwgYmFjayBvZmYgcHJlc2NhbGVyIHdoaWxzdCBnZXR0aW5nIGRpdmlkZXIgaW50byBvcHRpbXVtIHJhbmdlICovCisJZGl2aWRlPTE7CisJd2hpbGUoKHByZXNjYWxlID4gNSkgJiYgKGRpdmlkZTwzMikpCisJeworCQlwcmVzY2FsZS0tOworCQlkaXZpZGUgPDw9MTsKKwl9CisJZGl2aWRlPj49MTsKKwkKKwkvKiBub3cgZmluZS10dW5lIHRoZSBkaXZpZGVyIGZvciBiZXN0IG1hdGNoICovCisJZm9yKDtkaXZpZGU8MzE7ZGl2aWRlKyspCisJCWlmKGZyZXEgPj0gKChFU1NfU1lTQ0xLPj4ocHJlc2NhbGUrOSkpLyhkaXZpZGUrMSkpKQorCQkJYnJlYWs7CisJCisJLyogZGl2aWRlID0gMCBpcyBpbGxlZ2FsLCBidXQgZG9uJ3QgbGV0IHByZXNjYWxlID0gNCEgKi8KKwlpZihkaXZpZGUgPT0gMCkKKwl7CisJCWRpdmlkZSsrOworCQlpZihwcmVzY2FsZT41KQorCQkJcHJlc2NhbGUtLTsKKwl9CisKKwltYWVzdHJvX3dyaXRlKHMsIDYsIDB4OTAwMCB8IChwcmVzY2FsZTw8NSkgfCBkaXZpZGUpOyAvKiBzZXQgcmVnICovCisJCisJLyogTm93IHNldCBJRFIgMTEvMTcgKi8KKwltYWVzdHJvX3dyaXRlKHMsIDB4MTEsIG1hZXN0cm9fcmVhZChzLCAweDExKXwxKTsKKwltYWVzdHJvX3dyaXRlKHMsIDB4MTcsIG1hZXN0cm9fcmVhZChzLCAweDE3KXwxKTsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB0aGlzIHF1aWNrbHkgY2FsY3VsYXRlcyB0aGUgZnJlcXVlbmN5IG5lZWRlZCBmb3IgYm9iCisJYW5kIHNldHMgaXQgaWYgaXRzIGRpZmZlcmVudCB0aGFuIHdoYXQgYm9iIGlzCisJY3VycmVudGx5IHJ1bm5pbmcgYXQuICBpdHMgY2FsbGVkIG9mdGVuIHNvIAorCW5lZWRzIHRvIGJlIGZhaXJseSBxdWljay4gKi8KKyNkZWZpbmUgQk9CX01JTiA1MAorI2RlZmluZSBCT0JfTUFYIDQwMAorc3RhdGljIHZvaWQgY2FsY19ib2JfcmF0ZShzdHJ1Y3QgZXNzX3N0YXRlICpzKSB7CisjaWYgMCAvKiB0aGlzIHRoaW5nIHRyaWVzIHRvIHNldCB0aGUgZnJlcXVlbmN5IG9mIGJvYiBzdWNoIHRoYXQKKwl0aGVyZSBhcmUgMiBpbnRlcnJ1cHRzIC8gYnVmZmVyIHdhbGtlZCBieSB0aGUgZGFjL2FkYy4gIFRoYXQKKwlpcyBwcm9iYWJseSB2ZXJ5IHdyb25nIGZvciBwZW9wbGUgd2hvIGFjdHVhbGx5IGNhcmUgYWJvdXQgCisJbWlkIGJ1ZmZlciBwb3NpdGlvbmluZy4gIGl0IHNob3VsZCBiZSBjYWxjdWxhdGVkIGFzIGJ5dGVzL2ludGVycnVwdAorCWFuZCB0aGF0IG5lZWRzIHRvIGJlIGRlY2lkZWQgOikgIHNvIGZvciBub3cganVzdCB1c2UgdGhlIHN0YXRpYyAxNTAKKwlpbiBzdGFydF9ib2IuKi8KKworCXVuc2lnbmVkIGludCBkYWNfcmF0ZT0yLGFkY19yYXRlPTEsbmV3cmF0ZTsKKwlzdGF0aWMgaW50IGlzcmF0ZT0tMTsKKworCWlmIChzLT5kbWFfZGFjLmZyYWdzaXplID09IDApIGRhY19yYXRlID0gQk9CX01JTjsKKwllbHNlICB7CisJCWRhY19yYXRlID0JKDIgKiBzLT5yYXRlZGFjICogc2FtcGxlX3NpemVbKHMtPmZtdCA+PiBFU1NfREFDX1NISUZUKSAmIEVTU19GTVRfTUFTS10pIC8KKwkJCQkocy0+ZG1hX2RhYy5mcmFnc2l6ZSkgOworCX0KKwkJCisJaWYgKHMtPmRtYV9hZGMuZnJhZ3NpemUgPT0gMCkgYWRjX3JhdGUgPSBCT0JfTUlOOworCWVsc2UgeworCQlhZGNfcmF0ZSA9CSgyICogcy0+cmF0ZWFkYyAqIHNhbXBsZV9zaXplWyhzLT5mbXQgPj4gRVNTX0RBQ19TSElGVCkgJiBFU1NfRk1UX01BU0tdKSAvCisJCQkJKHMtPmRtYV9hZGMuZnJhZ3NpemUpIDsKKwl9CisKKwlpZihkYWNfcmF0ZSA+IGFkY19yYXRlKSBuZXdyYXRlID0gYWRjX3JhdGU7CisJZWxzZSBuZXdyYXRlPWRhY19yYXRlOworCisJaWYobmV3cmF0ZSA+IEJPQl9NQVgpIG5ld3JhdGUgPSBCT0JfTUFYOworCWVsc2UgeworCQlpZihuZXdyYXRlIDwgQk9CX01JTikgCisJCQluZXdyYXRlID0gQk9CX01JTjsKKwl9CisKKwlpZiggaXNyYXRlICE9IG5ld3JhdGUpIHsKKwkJcHJpbnRrKCJkYWM6ICVkICBhZGM6ICVkIHJhdGU6ICVkXG4iLGRhY19yYXRlLGFkY19yYXRlLGlzcmF0ZSk7CisJCWlzcmF0ZT1uZXdyYXRlOworCX0KKyNlbmRpZgorCit9CisKK3N0YXRpYyBpbnQgCitwcm9nX2RtYWJ1ZihzdHJ1Y3QgZXNzX3N0YXRlICpzLCB1bnNpZ25lZCByZWMpCit7CisJc3RydWN0IGRtYWJ1ZiAqZGIgPSByZWMgPyAmcy0+ZG1hX2FkYyA6ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkIHJhdGUgPSByZWMgPyBzLT5yYXRlYWRjIDogcy0+cmF0ZWRhYzsKKwl1bnNpZ25lZCBieXRlcGVyc2VjOworCXVuc2lnbmVkIGJ1ZnM7CisJdW5zaWduZWQgY2hhciBmbXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJZm10ID0gcy0+Zm10OworCWlmIChyZWMpIHsKKwkJc3RvcF9hZGMocyk7CisJCWZtdCA+Pj0gRVNTX0FEQ19TSElGVDsKKwl9IGVsc2UgeworCQlzdG9wX2RhYyhzKTsKKwkJZm10ID4+PSBFU1NfREFDX1NISUZUOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJZm10ICY9IEVTU19GTVRfTUFTSzsKKworCWRiLT5od3B0ciA9IGRiLT5zd3B0ciA9IGRiLT50b3RhbF9ieXRlcyA9IGRiLT5jb3VudCA9IGRiLT5lcnJvciA9IGRiLT5lbmRjbGVhcmVkID0gMDsKKworCS8qIHRoaXMgYWxnb3JpdGhtIGlzIGEgbGl0dGxlIG51dHMuLiB3aGVyZSBkaWQgLzEwMDAgY29tZSBmcm9tPyAqLworCWJ5dGVwZXJzZWMgPSByYXRlIDw8IHNhbXBsZV9zaGlmdFtmbXRdOworCWJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworCWlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVwZXJzZWMpCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwMCk7CisJCWVsc2UKKwkJCWRiLT5mcmFnc2hpZnQgPSBkYi0+b3NzZnJhZ3NoaWZ0OworCX0gZWxzZSB7CisJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAvKGRiLT5zdWJkaXZpc2lvbiA/IGRiLT5zdWJkaXZpc2lvbiA6IDEpKTsKKwkJaWYgKGRiLT5mcmFnc2hpZnQgPCAzKQorCQkJZGItPmZyYWdzaGlmdCA9IDM7IAorCX0KKwlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl3aGlsZSAoZGItPm51bWZyYWcgPCA0ICYmIGRiLT5mcmFnc2hpZnQgPiAzKSB7CisJCWRiLT5mcmFnc2hpZnQtLTsKKwkJZGItPm51bWZyYWcgPSBidWZzID4+IGRiLT5mcmFnc2hpZnQ7CisJfQorCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKwlpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisJCWRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworCWRiLT5mcmFnc2FtcGxlcyA9IGRiLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZm10XTsKKwlkYi0+ZG1hc2l6ZSA9IGRiLT5udW1mcmFnIDw8IGRiLT5mcmFnc2hpZnQ7CisKKwlNX3ByaW50aygibWFlc3Rybzogc2V0dXAgb3NzOiBudW1mcmFnOiAlZCBmcmFnc2l6ZTogJWQgZG1hc2l6ZTogJWRcbiIsZGItPm51bWZyYWcsZGItPmZyYWdzaXplLGRiLT5kbWFzaXplKTsKKworCW1lbXNldChkYi0+cmF3YnVmLCAoZm10ICYgRVNTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgZGItPmRtYXNpemUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAocmVjKSAKKwkJZXNzX3JlY19zZXR1cChzLCBmbXQsIHMtPnJhdGVhZGMsIGRiLT5yYXdidWYsIGRiLT5kbWFzaXplKTsKKwllbHNlIAorCQllc3NfcGxheV9zZXR1cChzLCBmbXQsIHMtPnJhdGVkYWMsIGRiLT5yYXdidWYsIGRiLT5kbWFzaXplKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlkYi0+cmVhZHkgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgCitjbGVhcl9hZHZhbmNlKHN0cnVjdCBlc3Nfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgY2hhciBjID0gKChzLT5mbXQgPj4gRVNTX0RBQ19TSElGVCkgJiBFU1NfRk1UXzE2QklUKSA/IDAgOiAweDgwOworCQorCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHMtPmRtYV9kYWMucmF3YnVmOworCXVuc2lnbmVkIGJzaXplID0gcy0+ZG1hX2RhYy5kbWFzaXplOworCXVuc2lnbmVkIGJwdHIgPSBzLT5kbWFfZGFjLnN3cHRyOworCXVuc2lnbmVkIGxlbiA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisJCisJaWYgKGJwdHIgKyBsZW4gPiBic2l6ZSkgeworCQl1bnNpZ25lZCB4ID0gYnNpemUgLSBicHRyOworCQltZW1zZXQoYnVmICsgYnB0ciwgYywgeCk7CisJCS8qIGFjY291bnQgZm9yIHdyYXBwaW5nPyAqLworCQlicHRyID0gMDsKKwkJbGVuIC09IHg7CisJfQorCW1lbXNldChidWYgKyBicHRyLCBjLCBsZW4pOworfQorCisvKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCEgKi8KK3N0YXRpYyB2b2lkIAorZXNzX3VwZGF0ZV9wdHIoc3RydWN0IGVzc19zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBod3B0cjsKKwlpbnQgZGlmZjsKKworCS8qIHVwZGF0ZSBBREMgcG9pbnRlciAqLworCWlmIChzLT5kbWFfYWRjLnJlYWR5KSB7CisJCS8qIG9oIGJveSBzaG91bGQgdGhpcyBhbGwgYmUgcmUtd3JpdHRlbi4gIGV2ZXJ5dGhpbmcgaW4gdGhlIGN1cnJlbnQgY29kZSBwYXRocyB0aGluaworCQl0aGF0IHRoZSB2YXJpb3VzIGNvdW50ZXJzL3BvaW50ZXJzIGFyZSBleHByZXNzZWQgaW4gYnl0ZXMgdG8gdGhlIHVzZXIgYnV0IHdlIGhhdmUKKwkJdHdvIGFwdXMgZG9pbmcgc3RlcmVvIHN0dWZmIHNvIHdlIGZpeCBpdCB1cCBoZXJlLi4gaXQgcHJvcGFnYXRlcyB0byBhbGwgdGhlIHZhcmlvdXMKKwkJY291bnRlcnMgZnJvbSBoZXJlLiAgKi8KKwkJaWYgKCBzLT5mbXQgJiAoRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVCkpIHsKKwkJCWh3cHRyID0gKGdldF9kbWFjKHMpKjIpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQl9IGVsc2UgeworCQkJaHdwdHIgPSBnZXRfZG1hYyhzKSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKwkJfQorCQlkaWZmID0gKHMtPmRtYV9hZGMuZG1hc2l6ZSArIGh3cHRyIC0gcy0+ZG1hX2FkYy5od3B0cikgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisJCXMtPmRtYV9hZGMuaHdwdHIgPSBod3B0cjsKKwkJcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQlzLT5kbWFfYWRjLmNvdW50ICs9IGRpZmY7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgCisJCQl3YWtlX3VwKCZzLT5kbWFfYWRjLndhaXQpOworCQlpZiAoIXMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtICgoMyAqIHMtPmRtYV9hZGMuZnJhZ3NpemUpID4+IDEpKSkgeworCQkJCS8qIEZJTEwgTUUgCisJCQkJd3JpbmRpcihzLCBTVl9DSUVOQUJMRSwgcy0+ZW5hYmxlKTsgKi8KKwkJCQlzdG9wX2FkYyhzKTsgCisJCQkJLyogYnJ1dGUgZm9yY2UgZXZlcnlvbmUgYmFjayBpbiBzeW5jLCBzaWdoICovCisJCQkJcy0+ZG1hX2FkYy5jb3VudCA9IDA7CisJCQkJcy0+ZG1hX2FkYy5zd3B0ciA9IDA7CisJCQkJcy0+ZG1hX2FkYy5od3B0ciA9IDA7CisJCQkJcy0+ZG1hX2FkYy5lcnJvcisrOworCQkJfQorCQl9CisJfQorCS8qIHVwZGF0ZSBEQUMgcG9pbnRlciAqLworCWlmIChzLT5kbWFfZGFjLnJlYWR5KSB7CisJCWh3cHRyID0gZ2V0X2RtYWEocykgJSBzLT5kbWFfZGFjLmRtYXNpemU7IAorCQkvKiB0aGUgYXB1IG9ubHkgcmVwb3J0cyB0aGUgbGVuZ3RoIGl0IGhhcyBzZWVuLCBub3QgdGhlCisJCQlsZW5ndGggb2YgdGhlIG1lbW9yeSB0aGF0IGhhcyBiZWVuIHVzZWQgKHRoZSBXUAorCQkJa25vd3MgdGhhdCkgKi8KKwkJaWYgKCAoKHMtPmZtdCA+PiBFU1NfREFDX1NISUZUKSAmIEVTU19GTVRfTUFTSykgPT0gKEVTU19GTVRfU1RFUkVPfEVTU19GTVRfMTZCSVQpKQorCQkJaHdwdHI8PD0xOworCisJCWRpZmYgPSAocy0+ZG1hX2RhYy5kbWFzaXplICsgaHdwdHIgLSBzLT5kbWFfZGFjLmh3cHRyKSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKy8qCQlNX3ByaW50aygidXBkYXRpbmcgZGFjOiBod3B0cjogJWQgZGlmZjogJWRcbiIsaHdwdHIsZGlmZik7Ki8KKwkJcy0+ZG1hX2RhYy5od3B0ciA9IGh3cHRyOworCQlzLT5kbWFfZGFjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkgeworCQkJcy0+ZG1hX2RhYy5jb3VudCArPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplKSB7CisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYy53YWl0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgLT0gZGlmZjsKKy8qCQkJTV9wcmludGsoIm1hZXN0cm86IGVzc191cGRhdGVfcHRyOiBkaWZmOiAlZCwgY291bnQ6ICVkXG4iLCBkaWZmLCBzLT5kbWFfZGFjLmNvdW50KTsgKi8KKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50IDw9IDApIHsKKwkJCQlNX3ByaW50aygidW5kZXJmbG93ISBkaWZmOiAlZCBjb3VudDogJWQgaHc6ICVkIHN3OiAlZFxuIiwgZGlmZiwgcy0+ZG1hX2RhYy5jb3VudCwgCisJCQkJCWh3cHRyLCBzLT5kbWFfZGFjLnN3cHRyKTsKKwkJCQkvKiBGSUxMIE1FIAorCQkJCXdyaW5kaXIocywgU1ZfQ0lFTkFCTEUsIHMtPmVuYWJsZSk7ICovCisJCQkJLyogWFhYIGhvdyBvbiBlYXJ0aCBjYW4gY2FsbGluZyB0aGlzIHdpdGggdGhlIGxvY2sgaGVsZCB3b3JrLi4gKi8KKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQkvKiBicnV0ZSBmb3JjZSBldmVyeW9uZSBiYWNrIGluIHN5bmMsIHNpZ2ggKi8KKwkJCQlzLT5kbWFfZGFjLmNvdW50ID0gMDsgCisJCQkJcy0+ZG1hX2RhYy5zd3B0ciA9IGh3cHRyOyAKKwkJCQlzLT5kbWFfZGFjLmVycm9yKys7CisJCQl9IGVsc2UgaWYgKHMtPmRtYV9kYWMuY291bnQgPD0gKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplICYmICFzLT5kbWFfZGFjLmVuZGNsZWFyZWQpIHsKKwkJCQljbGVhcl9hZHZhbmNlKHMpOworCQkJCXMtPmRtYV9kYWMuZW5kY2xlYXJlZCA9IDE7CisJCQl9CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSA8PSAoc2lnbmVkKXMtPmRtYV9kYWMuZG1hc2l6ZSkgeworCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMud2FpdCk7CisvKgkJCQlwcmludGsoIndha2luZyB1cCBEQUMgY291bnQ6ICVkIHN3OiAlZCBodzogJWRcbiIscy0+ZG1hX2RhYy5jb3VudCwgcy0+ZG1hX2RhYy5zd3B0ciwgCisJCQkJCWh3cHRyKTsqLworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2Vzc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IGVzc19zdGF0ZSAqczsKKyAgICAgICAgc3RydWN0IGVzc19jYXJkICpjID0gKHN0cnVjdCBlc3NfY2FyZCAqKWRldl9pZDsKKwlpbnQgaTsKKwl1MzIgZXZlbnQ7CisKKwlpZiAoICEgKGV2ZW50ID0gaW5iKGMtPmlvYmFzZSsweDFBKSkgKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlvdXR3KGludyhjLT5pb2Jhc2UrNCkmMSwgYy0+aW9iYXNlKzQpOworCisvKglNX3ByaW50aygibWFlc3RybyBpbnQ6ICV4XG4iLGV2ZW50KTsqLworCWlmKGV2ZW50JigxPDw2KSkKKwl7CisJCWludCB4OworCQllbnVtIHtVUF9FVlQsIERPV05fRVZULCBNVVRFX0VWVH0gdm9sX2V2dDsKKwkJaW50IHZvbHVtZTsKKworCQkvKiBGaWd1cmUgb3V0IHdoaWNoIHZvbHVtZSBjb250cm9sIGJ1dHRvbiB3YXMgcHVzaGVkLAorCQkgICBiYXNlZCBvbiBkaWZmZXJlbmNlcyBmcm9tIHRoZSBkZWZhdWx0IHJlZ2lzdGVyCisJCSAgIHZhbHVlcy4gKi8KKwkJeCA9IGluYihjLT5pb2Jhc2UrMHgxYyk7CisJCWlmICh4JjEpIHZvbF9ldnQgPSBNVVRFX0VWVDsKKwkJZWxzZSBpZiAoKCh4Pj4xKSY3KSA+IDQpIHZvbF9ldnQgPSBVUF9FVlQ7CisJCWVsc2Ugdm9sX2V2dCA9IERPV05fRVZUOworCisJCS8qIFJlc2V0IHRoZSB2b2x1bWUgY29udHJvbCByZWdpc3RlcnMuICovCisJCW91dGIoMHg4OCwgYy0+aW9iYXNlKzB4MWMpOworCQlvdXRiKDB4ODgsIGMtPmlvYmFzZSsweDFkKTsKKwkJb3V0YigweDg4LCBjLT5pb2Jhc2UrMHgxZSk7CisJCW91dGIoMHg4OCwgYy0+aW9iYXNlKzB4MWYpOworCisJCS8qIERlYWwgd2l0aCB0aGUgYnV0dG9uIHByZXNzIGluIGEgaGFtbWVyLWhhbmRlZAorCQkgICBtYW5uZXIgYnkgYWRqdXN0aW5nIHRoZSBtYXN0ZXIgbWl4ZXIgdm9sdW1lLiAqLworCQl2b2x1bWUgPSBjLT5taXgubWl4ZXJfc3RhdGVbMF0gJiAweGZmOworCQlpZiAodm9sX2V2dCA9PSBVUF9FVlQpIHsKKwkJCXZvbHVtZSArPSA1OworCQkJaWYgKHZvbHVtZSA+IDEwMCkKKwkJCQl2b2x1bWUgPSAxMDA7CisJCX0KKwkJZWxzZSBpZiAodm9sX2V2dCA9PSBET1dOX0VWVCkgeworCQkJdm9sdW1lIC09IDU7CisJCQlpZiAodm9sdW1lIDwgMCkKKwkJCQl2b2x1bWUgPSAwOworCQl9IGVsc2UgeworCQkJLyogdm9sX2V2dCA9PSBNVVRFX0VWVCAqLworCQkJaWYgKHZvbHVtZSA9PSAwKQorCQkJCXZvbHVtZSA9IGMtPmRvY2tfbXV0ZV92b2w7CisJCQllbHNlIHsKKwkJCQljLT5kb2NrX211dGVfdm9sID0gdm9sdW1lOworCQkJCXZvbHVtZSA9IDA7CisJCQl9CisJCX0KKwkJc2V0X21peGVyIChjLCAwLCAodm9sdW1lIDw8IDgpIHwgdm9sdW1lKTsKKwl9CisKKwkvKiBBY2sgYWxsIHRoZSBpbnRlcnJ1cHRzLiAqLworCW91dGIoMHhGRiwgYy0+aW9iYXNlKzB4MUEpOworCQkKKwkvKgorCSAqCVVwZGF0ZSB0aGUgcG9pbnRlcnMgZm9yIGFsbCBBUFUncyB3ZSBhcmUgcnVubmluZy4KKwkgKi8KKwlmb3IoaT0wO2k8TlJfRFNQUztpKyspCisJeworCQlzPSZjLT5jaGFubmVsc1tpXTsKKwkJaWYocy0+ZGV2X2F1ZGlvID09IC0xKQorCQkJYnJlYWs7CisJCXNwaW5fbG9jaygmcy0+bG9jayk7CisJCWVzc191cGRhdGVfcHRyKHMpOworCQlzcGluX3VubG9jaygmcy0+bG9jayk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9tYWdpY1tdID0gS0VSTl9DUklUICJtYWVzdHJvOiBpbnZhbGlkIG1hZ2ljIHZhbHVlIGluICVzXG4iOworCisjZGVmaW5lIFZBTElEQVRFX01BR0lDKEZPTyxNQUcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICghKEZPTykgfHwgKEZPTyktPm1hZ2ljICE9IE1BRykgeyBcCisJCXByaW50ayhpbnZhbGlkX21hZ2ljLF9fRlVOQ1RJT05fXyk7ICAgICAgICAgICAgXAorCQlyZXR1cm4gLUVOWElPOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNkZWZpbmUgVkFMSURBVEVfU1RBVEUoYSkgVkFMSURBVEVfTUFHSUMoYSxFU1NfU1RBVEVfTUFHSUMpCisjZGVmaW5lIFZBTElEQVRFX0NBUkQoYSkgVkFMSURBVEVfTUFHSUMoYSxFU1NfQ0FSRF9NQUdJQykKKworc3RhdGljIHZvaWQgc2V0X21peGVyKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCx1bnNpZ25lZCBpbnQgbWl4ZXIsIHVuc2lnbmVkIGludCB2YWwgKSAKK3sKKwl1bnNpZ25lZCBpbnQgbGVmdCxyaWdodDsKKwkvKiBjbGVhbnNlIGlucHV0IGEgbGl0dGxlICovCisJcmlnaHQgPSAoKHZhbCA+PiA4KSAgJiAweGZmKSA7CisJbGVmdCA9ICh2YWwgICYgMHhmZikgOworCisJaWYocmlnaHQgPiAxMDApIHJpZ2h0ID0gMTAwOworCWlmKGxlZnQgPiAxMDApIGxlZnQgPSAxMDA7CisKKwljYXJkLT5taXgubWl4ZXJfc3RhdGVbbWl4ZXJdPShyaWdodCA8PCA4KSB8IGxlZnQ7CisJY2FyZC0+bWl4LndyaXRlX21peGVyKGNhcmQsbWl4ZXIsbGVmdCxyaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkCittaXhlcl9wdXNoX3N0YXRlKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCkKK3sKKwlpbnQgaTsKKwlmb3IoaSA9IDAgOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTIDsgaSsrKSB7CisJCWlmKCAhIHN1cHBvcnRlZF9taXhlcihjYXJkLGkpKSBjb250aW51ZTsKKworCQlzZXRfbWl4ZXIoY2FyZCxpLGNhcmQtPm1peC5taXhlcl9zdGF0ZVtpXSk7CisJfQorfQorCitzdGF0aWMgaW50IG1peGVyX2lvY3RsKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGksIHZhbD0wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlWQUxJREFURV9DQVJEKGNhcmQpOworICAgICAgICBpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKKwkJbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCXN0cmxjcHkoaW5mby5pZCwgY2FyZF9uYW1lc1tjYXJkLT5jYXJkX3R5cGVdLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgY2FyZF9uYW1lc1tjYXJkLT5jYXJkX3R5cGVdLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCWluZm8ubW9kaWZ5X2NvdW50ZXIgPSBjYXJkLT5taXgubW9kY250OworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CisJCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCXN0cmxjcHkoaW5mby5pZCwgY2FyZF9uYW1lc1tjYXJkLT5jYXJkX3R5cGVdLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgY2FyZF9uYW1lc1tjYXJkLT5jYXJkX3R5cGVdLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjbWQgPT0gT1NTX0dFVFZFUlNJT04pCisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWlmIChfSU9DX1RZUEUoY21kKSAhPSAnTScgfHwgX0lPQ19TSVpFKGNtZCkgIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKF9JT0NfRElSKGNtZCkgPT0gX0lPQ19SRUFEKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzogLyogZ2l2ZSB0aGVtIHRoZSBjdXJyZW50IHJlY29yZCBzb3VyY2UgKi8KKworCQkJaWYoIWNhcmQtPm1peC5yZWNtYXNrX2lvKSB7CisJCQkJdmFsID0gMDsKKwkJCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQl2YWwgPSBjYXJkLT5taXgucmVjbWFza19pbyhjYXJkLDEsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJYnJlYWs7CisJCQkKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6IC8qIGdpdmUgdGhlbSB0aGUgc3VwcG9ydGVkIG1peGVycyAqLworCQkJdmFsID0gY2FyZC0+bWl4LnN1cHBvcnRlZF9taXhlcnM7CisJCQlicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzogLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHN1cHBvcnRlZCByZWNvcmRpbmcgc291cmNlICovCisJCQl2YWwgPSBjYXJkLT5taXgucmVjb3JkX3NvdXJjZXM7CisJCQlicmVhazsKKwkJCQorICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogLyogTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gKi8KKwkJCXZhbCA9IGNhcmQtPm1peC5zdGVyZW9fbWl4ZXJzOworCQkJYnJlYWs7CisJCQkKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQl2YWwgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6IC8qIHJlYWQgYSBzcGVjaWZpYyBtaXhlciAqLworCQkJaSA9IF9JT0NfTlIoY21kKTsKKworCQkJaWYgKCAhIHN1cHBvcnRlZF9taXhlcihjYXJkLGkpKSAKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogZG8gd2UgZXZlciB3YW50IHRvIHRvdWNoIHRoZSBoYXJkd2FyZT8gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCXZhbCA9IGNhcmQtPm1peC5yZWFkX21peGVyKGNhcmQsaSk7CisgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsqLworCisJCQl2YWwgPSBjYXJkLT5taXgubWl4ZXJfc3RhdGVbaV07CisvKgkJCU1fcHJpbnRrKCJyZXR1cm5lZCAweCV4IGZvciBtaXhlciAlZFxuIix2YWwsaSk7Ki8KKworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJfQorCQorICAgICAgICBpZiAoX0lPQ19ESVIoY21kKSAhPSAoX0lPQ19XUklURXxfSU9DX1JFQUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwljYXJkLT5taXgubW9kY250Kys7CisKKwlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCisJCWlmICghY2FyZC0+bWl4LnJlY21hc2tfaW8pIHJldHVybiAtRUlOVkFMOworCQlpZighdmFsKSByZXR1cm4gMDsKKwkJaWYoISAodmFsICY9IGNhcmQtPm1peC5yZWNvcmRfc291cmNlcykpIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQljYXJkLT5taXgucmVjbWFza19pbyhjYXJkLDAsdmFsKTsKKyAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlpID0gX0lPQ19OUihjbWQpOworCisJCWlmICggISBzdXBwb3J0ZWRfbWl4ZXIoY2FyZCxpKSkgCisJCQlyZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJc2V0X21peGVyKGNhcmQsaSx2YWwpOworICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJCXJldHVybiAwOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IGVzc19vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBlc3NfY2FyZCAqY2FyZCA9IE5VTEw7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnZyOworCisJd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBkZXYpKSAhPSBOVUxMKSB7CisJCWRydnIgPSBwY2lfZGV2X2RyaXZlciAocGRldik7CisJCWlmIChkcnZyID09ICZtYWVzdHJvX3BjaV9kcml2ZXIpIHsKKwkJCWNhcmQgPSAoc3RydWN0IGVzc19jYXJkKilwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCQkJaWYgKCFjYXJkKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNhcmQtPmRldl9taXhlciA9PSBtaW5vcikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWNhcmQpCisJCXJldHVybiAtRU5PREVWOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQ7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVzc19yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGVzc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJVkFMSURBVEVfQ0FSRChjYXJkKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlc3NfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGVzc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJVkFMSURBVEVfQ0FSRChjYXJkKTsKKworCXJldHVybiBtaXhlcl9pb2N0bChjYXJkLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlc3NfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IGVzc19pb2N0bF9taXhkZXYsCisJLm9wZW4JCT0gZXNzX29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlCT0gZXNzX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBlc3Nfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50OworCXNpZ25lZCBsb25nIHRtbzsKKworCWlmIChzLT5kbWFfZGFjLm1hcHBlZCB8fCAhcy0+ZG1hX2RhYy5yZWFkeSkKKwkJcmV0dXJuIDA7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICAgICAgZm9yICg7OykgeworCQkvKiBYWFggdWhtLi4gcXVlc3Rpb25hYmxlIGxvY2tpbmcqLworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChub25ibG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICAgICAgICAgIH0KKwkJdG1vID0gKGNvdW50ICogSFopIC8gcy0+cmF0ZWRhYzsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPmZtdCA+PiBFU1NfREFDX1NISUZUKSAmIEVTU19GTVRfTUFTS107CisJCS8qIFhYWCB0aGlzIGlzIGp1c3QgYnJva2VuLiAgc29tZW9uZSBpcyB3YWtpbmcgdXMgdXAgYWxvdCwgb3Igc2NoZWR1bGVfdGltZW91dCBpcyBicm9rZW4uCisJCQlvciBzb21ldGhpbmcuICB3aG8gY2FyZXMuIC0gemFjaCAqLworCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID8gdG1vIDogMSkgJiYgdG1vKQorCQkJTV9wcmludGsoS0VSTl9ERUJVRyAibWFlc3RybzogZG1hIHRpbWVkIG91dD8/ICVsZFxuIixqaWZmaWVzKTsKKyAgICAgICAgfQorICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICByZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBaYWNoIHNlejogImdvZCB0aGlzIGlzIGdyb3NzLi4iICovCitzdGF0aWMgaW50IAorY29tYl9zdGVyZW8odW5zaWduZWQgY2hhciAqcmVhbF9idWZmZXIsdW5zaWduZWQgY2hhciAgKnRtcF9idWZmZXIsIGludCBvZmZzZXQsIAorCWludCBjb3VudCwgaW50IGJ1ZnNpemUpCit7ICAKKwkvKiBObyBzdWNoIHRoaW5nIGFzIHN0ZXJlbyByZWNvcmRpbmcsIHNvIHdlCisJdXNlIGR1YWwgaW5wdXQgbWl4ZXJzLiAgd2hpY2ggbWVhbnMgd2UgaGF2ZSB0byAKKwljb21iaW5lIG1vbm8gdG8gc3RlcmVvIGJ1ZmZlci4gIHl1Y2suIAorCisJYnV0IHdlIGRvbid0IGhhdmUgdG8gYmUgYWJsZSB0byB3b3JrIGEgYnl0ZSBhdCBhIHRpbWUuLiovCisKKwl1bnNpZ25lZCBjaGFyICpzbywqbGVmdCwqcmlnaHQ7CisJaW50IGk7CisKKwlzbyA9IHRtcF9idWZmZXI7CisJbGVmdCA9IHJlYWxfYnVmZmVyICsgb2Zmc2V0OworCXJpZ2h0ID0gcmVhbF9idWZmZXIgKyBidWZzaXplLzIgKyBvZmZzZXQ7CisKKy8qCU1fcHJpbnRrKCJjb21iX3N0ZXJlbyB3cml0aW5nICVkIHRvICVwIGZyb20gJXAgYW5kICVwLCBvZmZzZXQ6ICVkIHNpemU6ICVkXG4iLGNvdW50LzIsIHRtcF9idWZmZXIsbGVmdCxyaWdodCxvZmZzZXQsYnVmc2l6ZSk7Ki8KKworCWZvcihpPWNvdW50LzQ7IGkgOyBpLS0pIHsKKwkJKCooc28rMikpID0gKihyaWdodCsrKTsKKwkJKCooc28rMykpID0gKihyaWdodCsrKTsKKwkJKCpzbykgPSAqKGxlZnQrKyk7CisJCSgqKHNvKzEpKSA9ICoobGVmdCsrKTsKKwkJc28rPTQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGluIHRoaXMgbG9vcCwgZG1hX2FkYy5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXRzIHdhaXRpbmcKKwl0byBiZSBjb3BpZWQgdG8gdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGludGVycnVwdAorCWhhbmRsZXIgYW5kIGRyYWluZWQgYnkgdGhpcyBsb29wLiAqLworc3RhdGljIHNzaXplX3QgCitlc3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGVzc19zdGF0ZSAqcyA9IChzdHJ1Y3QgZXNzX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKwl1bnNpZ25lZCBjaGFyICpjb21iYnVmID0gTlVMTDsKKwkKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYoIShjb21iYnVmID0ga21hbGxvYyhjb3VudCxHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCXJldCA9IDA7CisKKwljYWxjX2JvYl9yYXRlKHMpOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkvKiByZW1lbWJlciwgYWxsIHRoZXNlIHRoaW5ncyBhcmUgZXhwcmVzc2VkIGluIGJ5dGVzIHRvIGJlCisJCQlzZW50IHRvIHRoZSB1c2VyLi4gaGVuY2UgdGhlIGV2aWwgLyAyIGRvd24gYmVsb3cgKi8KKwkJc3dwdHIgPSBzLT5kbWFfYWRjLnN3cHRyOworCQljbnQgPSBzLT5kbWFfYWRjLmRtYXNpemUtc3dwdHI7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50IDwgY250KQorCQkJY250ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCisJCWlmICggY250ID4gMCApIGNudCAmPSB+MzsKKworCQlpZiAoY250IDw9IDApIHsKKwkJCXN0YXJ0X2FkYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgCisJCQl7CisJCQkJcmV0ID0gcmV0ID8gcmV0IDogLUVBR0FJTjsKKwkJCQlnb3RvIHJlY19yZXR1cm5fZnJlZTsKKwkJCX0KKwkJCWlmICghaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzLT5kbWFfYWRjLndhaXQsIEhaKSkgeworCQkJCWlmKCEgcy0+Y2FyZC0+aW5fc3VzcGVuZCkgcHJpbnRrKEtFUk5fREVCVUcgIm1hZXN0cm86IHJlYWQ6IGNoaXAgbG9ja3VwPyBkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCisJCQkJICAgICAgIHMtPmRtYV9hZGMuZG1hc2l6ZSwgcy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcy0+ZG1hX2FkYy5jb3VudCwgCisJCQkJICAgICAgIHMtPmRtYV9hZGMuaHdwdHIsIHMtPmRtYV9hZGMuc3dwdHIpOworCQkJCXN0b3BfYWRjKHMpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJc2V0X2RtYWMocywgdmlydF90b19idXMocy0+ZG1hX2FkYy5yYXdidWYpLCBzLT5kbWFfYWRjLm51bWZyYWcgPDwgcy0+ZG1hX2FkYy5mcmFnc2hpZnQpOworCQkJCS8qIHByb2dyYW0gZW5oYW5jZWQgbW9kZSByZWdpc3RlcnMgKi8KKwkJCQkvKiBGSUxMIE1FICovCisvKgkJCQl3cmluZGlyKHMsIFNWX0NJRE1BQ0JBU0VDT1VOVDEsIChzLT5kbWFfYWRjLmZyYWdzYW1wbGVzLTEpID4+IDgpOworCQkJCXdyaW5kaXIocywgU1ZfQ0lETUFDQkFTRUNPVU5UMCwgcy0+ZG1hX2FkYy5mcmFnc2FtcGxlcy0xKTsgKi8KKwkJCQlzLT5kbWFfYWRjLmNvdW50ID0gcy0+ZG1hX2FkYy5od3B0ciA9IHMtPmRtYV9hZGMuc3dwdHIgPSAwOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgCisJCQl7CisJCQkJcmV0ID0gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gcmVjX3JldHVybl9mcmVlOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkKKwkJaWYocy0+Zm10ICYgKEVTU19GTVRfU1RFUkVPIDw8IEVTU19BRENfU0hJRlQpKSB7CisJCQkvKiBzd3B0ci8yIHNvIHRoYXQgd2Uga25vdyB0aGUgcmVhbCBvZmZzZXQgaW4gZWFjaCBhcHUncyBidWZmZXIgKi8KKwkJCWNvbWJfc3RlcmVvKHMtPmRtYV9hZGMucmF3YnVmLGNvbWJidWYsc3dwdHIvMixjbnQscy0+ZG1hX2FkYy5kbWFzaXplKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBjb21iYnVmLCBjbnQpKSB7CisJCQkJcmV0ID0gcmV0ID8gcmV0IDogLUVGQVVMVDsKKwkJCQlnb3RvIHJlY19yZXR1cm5fZnJlZTsKKwkJCX0KKwkJfSBlbHNlICB7CisJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcy0+ZG1hX2FkYy5yYXdidWYgKyBzd3B0ciwgY250KSkgeworCQkJCXJldCA9IHJldCA/IHJldCA6IC1FRkFVTFQ7CisJCQkJZ290byByZWNfcmV0dXJuX2ZyZWU7CisJCQl9CisJCX0KKworCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmRtYV9hZGMuc3dwdHIgPSBzd3B0cjsKKwkJcy0+ZG1hX2FkYy5jb3VudCAtPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzdGFydF9hZGMocyk7CisJfQorCityZWNfcmV0dXJuX2ZyZWU6CisJaWYoY29tYmJ1Zikga2ZyZWUoY29tYmJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgCitlc3Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlc3Nfc3RhdGUgKnMgPSAoc3RydWN0IGVzc19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyOworCWludCBjbnQ7CisJCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMCkpKQorCQlyZXR1cm4gcmV0OworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKworCWNhbGNfYm9iX3JhdGUocyk7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHMtPmRtYV9kYWMuY291bnQgPCAwKSB7CisJCQlzLT5kbWFfZGFjLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKworCQljbnQgPSBzLT5kbWFfZGFjLmRtYXNpemUtc3dwdHI7CisKKwkJaWYgKHMtPmRtYV9kYWMuY291bnQgKyBjbnQgPiBzLT5kbWFfZGFjLmRtYXNpemUpCisJCQljbnQgPSBzLT5kbWFfZGFjLmRtYXNpemUgLSBzLT5kbWFfZGFjLmNvdW50OworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKworCQlpZiAoY250IDw9IDApIHsKKwkJCXN0YXJ0X2RhYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmKCFyZXQpIHJldCA9IC1FQUdBSU47CisJCQkJZ290byByZXR1cm5fZnJlZTsKKwkJCX0KKwkJCWlmICghaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzLT5kbWFfZGFjLndhaXQsIEhaKSkgeworCQkJCWlmKCEgcy0+Y2FyZC0+aW5fc3VzcGVuZCkgcHJpbnRrKEtFUk5fREVCVUcgIm1hZXN0cm86IHdyaXRlOiBjaGlwIGxvY2t1cD8gZG1hc3ogJXUgZnJhZ3N6ICV1IGNvdW50ICVpIGh3cHRyICV1IHN3cHRyICV1XG4iLAorCQkJCSAgICAgICBzLT5kbWFfZGFjLmRtYXNpemUsIHMtPmRtYV9kYWMuZnJhZ3NpemUsIHMtPmRtYV9kYWMuY291bnQsIAorCQkJCSAgICAgICBzLT5kbWFfZGFjLmh3cHRyLCBzLT5kbWFfZGFjLnN3cHRyKTsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCXNldF9kbWFhKHMsIHZpcnRfdG9fYnVzKHMtPmRtYV9kYWMucmF3YnVmKSwgcy0+ZG1hX2RhYy5udW1mcmFnIDw8IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0KTsKKwkJCQkvKiBwcm9ncmFtIGVuaGFuY2VkIG1vZGUgcmVnaXN0ZXJzICovCisvKgkJCQl3cmluZGlyKHMsIFNWX0NJRE1BQUJBU0VDT1VOVDEsIChzLT5kbWFfZGFjLmZyYWdzYW1wbGVzLTEpID4+IDgpOworCQkJCXdyaW5kaXIocywgU1ZfQ0lETUFBQkFTRUNPVU5UMCwgcy0+ZG1hX2RhYy5mcmFnc2FtcGxlcy0xKTsgKi8KKwkJCQkvKiBGSUxMIE1FICovCisJCQkJcy0+ZG1hX2RhYy5jb3VudCA9IHMtPmRtYV9kYWMuaHdwdHIgPSBzLT5kbWFfZGFjLnN3cHRyID0gMDsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkgcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gcmV0dXJuX2ZyZWU7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkgcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gcmV0dXJuX2ZyZWU7CisJCX0KKy8qCQlwcmludGsoIndyb3RlICVkIGJ5dGVzIGF0IHN3OiAlZCBjbnQ6ICVkIHdoaWxlIGh3OiAlZFxuIixjbnQsIHN3cHRyLCBzLT5kbWFfZGFjLmNvdW50LCBzLT5kbWFfZGFjLmh3cHRyKTsqLworCisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfZGFjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9kYWMuY291bnQgKz0gY250OworCQlzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJc3RhcnRfZGFjKHMpOworCX0KK3JldHVybl9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVzc19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGVzc19zdGF0ZSAqcyA9IChzdHJ1Y3QgZXNzX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisKKy8qIEluIDAuMTQgcHJvZ19kbWFidWYgYWx3YXlzIHJldHVybnMgc3VjY2VzcyBhbnl3YXkgLi4uICovCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1ZihzLCAwKSkgCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkgIAlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgcHJvZ19kbWFidWYocywgMSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2RhYy53YWl0LCB3YWl0KTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfYWRjLndhaXQsIHdhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJZXNzX3VwZGF0ZV9wdHIocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfYWRjLmZyYWdzaXplKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUpIAorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0gZWxzZSB7CisJCQlpZiAoKHNpZ25lZClzLT5kbWFfZGFjLmRtYXNpemUgPj0gcy0+ZG1hX2RhYy5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBlc3NfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGVzc19zdGF0ZSAqcyA9IChzdHJ1Y3QgZXNzX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRiOworCWludCByZXQgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHMsIDEpKSAhPSAwKQorCQkJZ290byBvdXQ7CisJCWRiID0gJnMtPmRtYV9kYWM7CisJfSBlbHNlIAorI2lmIDAKKwkvKiBpZiB3ZSBjYW4gaGF2ZSB0aGUgd3Avd2MgZG8gdGhlIGNvbWJpbmluZworCQl3ZSBjYW4gdHVybiB0aGlzIGJhY2sgb24uICAqLworCSAgICAgIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSAhPSAwKQorCQkJZ290byBvdXQ7CisJCWRiID0gJnMtPmRtYV9hZGM7CisJfSBlbHNlICAKKyNlbmRpZgorCQlnb3RvIG91dDsKKwlyZXQgPSAtRUlOVkFMOworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCisJCWdvdG8gb3V0OworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikpCisJCWdvdG8gb3V0OworCXJldCA9IC1FQUdBSU47CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQl2aXJ0X3RvX3BoeXMoZGItPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCXNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJZ290byBvdXQ7CisJZGItPm1hcHBlZCA9IDE7CisJcmV0ID0gMDsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlc3NfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlc3Nfc3RhdGUgKnMgPSAoc3RydWN0IGVzc19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBhdWRpb19idWZfaW5mbyBhYmluZm87CisgICAgICAgIGNvdW50X2luZm8gY2luZm87CisJaW50IHZhbCwgbWFwcGVkLCByZXQ7CisJdW5zaWduZWQgY2hhciBmbXRtLCBmbXRkOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisvKglwcmludGsoIm1hZXN0cm86IGVzc19pb2N0bDogY21kICVkXG4iLCBjbWQpOyovCisJCisJVkFMSURBVEVfU1RBVEUocyk7CisgICAgICAgIG1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIHMtPmRtYV9kYWMubWFwcGVkKSB8fAorCQkoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIHMtPmRtYV9hZGMubWFwcGVkKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gZHJhaW5fZGFjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJcmV0dXJuIDA7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCS8qIFhYWCBmaXggKi8KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCwgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+Y2FyZC0+cGNpZGV2LT5pcnEpOworCQkJcy0+ZG1hX2RhYy5zd3B0ciA9IHMtPmRtYV9kYWMuaHdwdHIgPSBzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9IDA7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmNhcmQtPnBjaWRldi0+aXJxKTsKKwkJCXMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0gcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPSAwOworCQl9CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJc2V0X2FkY19yYXRlKHMsIHZhbCk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQlzZXRfZGFjX3JhdGUocywgdmFsKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+cmF0ZWFkYyA6IHMtPnJhdGVkYWMsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZm10ZCA9IDA7CisJCWZtdG0gPSB+MDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQlpZiAodmFsKQorCQkJCWZtdGQgfD0gRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVDsKKwkJCWVsc2UKKwkJCQlmbXRtICY9IH4oRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVCk7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJaWYgKHZhbCkKKwkJCQlmbXRkIHw9IEVTU19GTVRfU1RFUkVPIDw8IEVTU19EQUNfU0hJRlQ7CisJCQllbHNlCisJCQkJZm10bSAmPSB+KEVTU19GTVRfU1RFUkVPIDw8IEVTU19EQUNfU0hJRlQpOworCQl9CisJCXNldF9mbXQocywgZm10bSwgZm10ZCk7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWZtdGQgPSAwOworCQkJZm10bSA9IH4wOworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsID49IDIpCisJCQkJCWZtdGQgfD0gRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihFU1NfRk1UX1NURVJFTyA8PCBFU1NfQURDX1NISUZUKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJZm10ZCB8PSBFU1NfRk1UX1NURVJFTyA8PCBFU1NfREFDX1NISUZUOworCQkJCWVsc2UKKwkJCQkJZm10bSAmPSB+KEVTU19GTVRfU1RFUkVPIDw8IEVTU19EQUNfU0hJRlQpOworCQkJfQorCQkJc2V0X2ZtdChzLCBmbXRtLCBmbXRkKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPmZtdCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyAoRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVCkgCisJCQkJCSAgIDogKEVTU19GTVRfU1RFUkVPIDw8IEVTU19EQUNfU0hJRlQpKSkgPyAyIDogMSwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihBRk1UX1U4fEFGTVRfUzE2X0xFLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlmbXRkID0gMDsKKwkJCWZtdG0gPSB+MDsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJLyogZml4ZWQgYXQgMTZiaXQgZm9yIG5vdyAqLworCQkJCWZtdGQgfD0gRVNTX0ZNVF8xNkJJVCA8PCBFU1NfQURDX1NISUZUOworI2lmIDAKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlmbXRkIHw9IEVTU19GTVRfMTZCSVQgPDwgRVNTX0FEQ19TSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihFU1NfRk1UXzE2QklUIDw8IEVTU19BRENfU0hJRlQpOworI2VuZGlmCisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlmbXRkIHw9IEVTU19GTVRfMTZCSVQgPDwgRVNTX0RBQ19TSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihFU1NfRk1UXzE2QklUIDw8IEVTU19EQUNfU0hJRlQpOworCQkJfQorCQkJc2V0X2ZtdChzLCBmbXRtLCBmbXRkKTsKKwkJfQorIAkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gCisJCQkoRVNTX0ZNVF8xNkJJVCA8PCBFU1NfQURDX1NISUZUKSAKKwkJCTogKEVTU19GTVRfMTZCSVQgPDwgRVNTX0RBQ19TSElGVCkpKSA/IAorCQkJCUFGTVRfUzE2X0xFIDogCisJCQkJQUZNVF9VOCwgCisJCQlwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCXZhbCA9IDA7CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgKHMtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSkKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAocy0+ZW5hYmxlICYgREFDX1JVTk5JTkcpKSAKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9ICBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9hZGMocyk7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzdGFydF9kYWMocyk7CisJCQl9IGVsc2UKKwkJCQlzdG9wX2RhYyhzKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKwkJCXJldHVybiByZXQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzc191cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfZGFjLmZyYWdzaXplOworICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIHMtPmRtYV9kYWMuY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfZGFjLm51bWZyYWc7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsgICAgICAKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSAgcHJvZ19kbWFidWYocywgMSkpKQorCQkJcmV0dXJuIHJldDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXNzX3VwZGF0ZV9wdHIocyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ3NpemU7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy5jb3VudDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9hZGMubnVtZnJhZzsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OyAgICAgIAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisgICAgICAgICAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKwkJCXJldHVybiByZXQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzc191cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIHZhbCA9IHMtPmRtYV9kYWMuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gIHByb2dfZG1hYnVmKHMsIDEpKSkKKwkJCXJldHVybiByZXQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzc191cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKKyAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBzLT5kbWFfYWRjLmNvdW50ID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9hZGMuaHdwdHI7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMCkpKQorCQkJcmV0dXJuIHJldDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXNzX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IHMtPmRtYV9kYWMuY291bnQgPj4gcy0+ZG1hX2RhYy5mcmFnc2hpZnQ7CisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2RhYy5od3B0cjsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQkJcy0+ZG1hX2RhYy5jb3VudCAmPSBzLT5kbWFfZGFjLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICgodmFsID0gcHJvZ19kbWFidWYocywgMCkpKQorCQkJCXJldHVybiB2YWw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcCk7CisJCX0KKwkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCQlyZXR1cm4gdmFsOworCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCU1fcHJpbnRrKCJtYWVzdHJvOiBTRVRGUkFHTUVOVDogJTB4XG4iLHZhbCk7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSA0OworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc21heGZyYWdzIDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gNDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSA0OworCQl9CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKSB8fAorCQkgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+cmF0ZWFkYyA6IHMtPnJhdGVkYWMsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChFU1NfRk1UX1NURVJFTyA8PCBFU1NfQURDX1NISUZUKSAKKwkJCQkJICAgOiAoRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0RBQ19TSElGVCkpKSA/IDIgOiAxLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChFU1NfRk1UXzE2QklUIDw8IEVTU19BRENfU0hJRlQpIAorCQkJCQkgICA6IChFU1NfRk1UXzE2QklUIDw8IEVTU19EQUNfU0hJRlQpKSkgPyAxNiA6IDgsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQKK3NldF9iYXNlX3JlZ2lzdGVycyhzdHJ1Y3QgZXNzX3N0YXRlICpzLHZvaWQgKnZhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgcGFja2VkX3BoeXMgPSB2aXJ0X3RvX2J1cyh2YWRkcik+PjEyOworCXdhdmVfc2V0X3JlZ2lzdGVyKHMsIDB4MDFGQyAsIHBhY2tlZF9waHlzKTsKKwl3YXZlX3NldF9yZWdpc3RlcihzLCAweDAxRkQgLCBwYWNrZWRfcGh5cyk7CisJd2F2ZV9zZXRfcmVnaXN0ZXIocywgMHgwMUZFICwgcGFja2VkX3BoeXMpOworCXdhdmVfc2V0X3JlZ2lzdGVyKHMsIDB4MDFGRiAsIHBhY2tlZF9waHlzKTsKK30KKworLyogCisgKiB0aGlzIGd1eSBtYWtlcyBzdXJlIHdlJ3JlIGluIHRoZSByaWdodCBwb3dlcgorICogc3RhdGUgZm9yIHdoYXQgd2Ugd2FudCB0byBiZSBkb2luZyAKKyAqLworc3RhdGljIHZvaWQgbWFlc3Ryb19wb3dlcihzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsIGludCB0b3N0YXRlKQoreworCXUxNiBhY3RpdmVfbWFzayA9IGFjcGlfc3RhdGVfbWFza1t0b3N0YXRlXTsKKwl1OCBzdGF0ZTsKKworCWlmKCF1c2VfcG0pIHJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGNhcmQtPnBjaWRldiwgY2FyZC0+cG93ZXJfcmVncysweDQsICZzdGF0ZSk7CisJc3RhdGUmPTM7CisKKwkvKiBtYWtlIHN1cmUgd2UncmUgaW4gdGhlIHJpZ2h0IHN0YXRlICovCisJaWYoc3RhdGUgIT0gdG9zdGF0ZSkgeworCQlNX3ByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm86IGRldiAlMDJ4OiUwMnguJXggc3dpdGNoaW5nIGZyb20gRCVkIHRvIEQlZFxuIiwKKwkJCWNhcmQtPnBjaWRldi0+YnVzLT5udW1iZXIsIAorCQkJUENJX1NMT1QoY2FyZC0+cGNpZGV2LT5kZXZmbiksCisJCQlQQ0lfRlVOQyhjYXJkLT5wY2lkZXYtPmRldmZuKSwKKwkJCXN0YXRlLHRvc3RhdGUpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2FyZC0+cGNpZGV2LCBjYXJkLT5wb3dlcl9yZWdzKzB4NCwgdG9zdGF0ZSk7CisJfQorCisJLyogYW5kIG1ha2Ugc3VyZSB0aGUgdW5pdHMgd2UgY2FyZSBhYm91dCBhcmUgb24gCisJCVhYWCB3ZSBtaWdodCB3YW50IHRvIGRvIHRoaXMgYmVmb3JlIHN0YXRlIGZsaXBwaW5nPyAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChjYXJkLT5wY2lkZXYsIDB4NTQsIH4gYWN0aXZlX21hc2spOworCXBjaV93cml0ZV9jb25maWdfd29yZChjYXJkLT5wY2lkZXYsIDB4NTYsIH4gYWN0aXZlX21hc2spOworfQorCisvKiB3ZSBhbGxvY2F0ZSBhIGxhcmdlIHBvd2VyIG9mIHR3byBmb3IgYWxsIG91ciBtZW1vcnkuCisJdGhpcyBpcyBjdXQgdXAgaW50byAobm90IHRvIHNjYWxlIDopOgorCXxzaWxseSBmaWZvIHdvcmQJfCA1MTJieXRlIG1peGJ1ZiBwZXIgYWRjCXwgZGFjL2FkYyAqIGNoYW5uZWxzIHwKKyovCitzdGF0aWMgaW50CithbGxvY2F0ZV9idWZmZXJzKHN0cnVjdCBlc3Nfc3RhdGUgKnMpCit7CisJdm9pZCAqcmF3YnVmPU5VTEw7CisJaW50IG9yZGVyLGk7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJLyogYWxsb2MgYXMgYmlnIGEgY2h1bmsgYXMgd2UgY2FuICovCisJZm9yIChvcmRlciA9IChkc3BzX29yZGVyICsgKDE2LVBBR0VfU0hJRlQpICsgMSk7IG9yZGVyID49IChkc3BzX29yZGVyICsgMiArIDEpOyBvcmRlci0tKQorCQlpZigocmF3YnVmID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUx8R0ZQX0RNQSwgb3JkZXIpKSkKKwkJCWJyZWFrOworCisJaWYgKCFyYXdidWYpCisJCXJldHVybiAxOworCisJTV9wcmludGsoIm1hZXN0cm86IGFsbG9jYXRlZCAlbGQgKCVkKSBieXRlcyBhdCAlcFxuIixQQUdFX1NJWkU8PG9yZGVyLG9yZGVyLCByYXdidWYpOworCisJaWYgKCh2aXJ0X3RvX2J1cyhyYXdidWYpICsgKFBBR0VfU0laRSA8PCBvcmRlcikgLSAxKSAmIH4oKDE8PDI4KS0xKSkgIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWVzdHJvOiBETUEgYnVmZmVyIGJleW9uZCAyNTZNQiEgYnVzYWRkciAweCVseCAgc2l6ZSAlbGRcbiIsCisJCQl2aXJ0X3RvX2J1cyhyYXdidWYpLCBQQUdFX1NJWkUgPDwgb3JkZXIpOworCQlrZnJlZShyYXdidWYpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzLT5jYXJkLT5kbWFwYWdlcyA9IHJhd2J1ZjsKKwlzLT5jYXJkLT5kbWFvcmRlciA9IG9yZGVyOworCisJZm9yKGk9MDtpPE5SX0RTUFM7aSsrKSB7CisJCXN0cnVjdCBlc3Nfc3RhdGUgKmVzcyA9ICZzLT5jYXJkLT5jaGFubmVsc1tpXTsKKworCQlpZihlc3MtPmRldl9hdWRpbyA9PSAtMSkKKwkJCWNvbnRpbnVlOworCisJCWVzcy0+ZG1hX2RhYy5yZWFkeSA9IHMtPmRtYV9kYWMubWFwcGVkID0gMDsKKwkJZXNzLT5kbWFfYWRjLnJlYWR5ID0gcy0+ZG1hX2FkYy5tYXBwZWQgPSAwOworCQllc3MtPmRtYV9hZGMuYnVmb3JkZXIgPSBlc3MtPmRtYV9kYWMuYnVmb3JkZXIgPSBvcmRlciAtIDEgLSBkc3BzX29yZGVyIC0gMTsKKworCQkvKiBvZmZzZXQgZGFjIGFuZCBhZGMgYnVmZmVycyBzdGFydGluZyBoYWxmIHdheSB0aHJvdWdoIGFuZCB0aGVuIGF0IGVhY2ggW2RhXVthZF1jJ3MKKwkJCW9yZGVyJ3MgaW50ZXJ2YWxzLi4gKi8KKwkJZXNzLT5kbWFfZGFjLnJhd2J1ZiA9IHJhd2J1ZiArIChQQUdFX1NJWkU8PChvcmRlci0xKSkgKyAoaSAqICggUEFHRV9TSVpFIDw8IChlc3MtPmRtYV9kYWMuYnVmb3JkZXIgKyAxICkpKTsKKwkJZXNzLT5kbWFfYWRjLnJhd2J1ZiA9IGVzcy0+ZG1hX2RhYy5yYXdidWYgKyAoIFBBR0VfU0laRSA8PCBlc3MtPmRtYV9kYWMuYnVmb3JkZXIpOworCQkvKiBvZmZzZXQgbWl4YnVmIGJ5IGEgbWl4YnVmIHNvIHRoYXQgdGhlIGxhbWUgc3RhdHVzIGZpZm8gY2FuCisJCQloYXBwaWx5IHNjcmliYmxlIGF3YXkuLiAqLyAKKwkJZXNzLT5taXhidWYgPSByYXdidWYgKyAoNTEyICogKGkrMSkpOworCisJCU1fcHJpbnRrKCJtYWVzdHJvOiBzZXR1cCBhcHUgJWQ6IGRhYzogJXAgYWRjOiAlcCBtaXg6ICVwXG4iLGksZXNzLT5kbWFfZGFjLnJhd2J1ZiwKKwkJCWVzcy0+ZG1hX2FkYy5yYXdidWYsIGVzcy0+bWl4YnVmKTsKKworCX0KKworCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLworCXBlbmQgPSB2aXJ0X3RvX3BhZ2UocmF3YnVmICsgKFBBR0VfU0laRSA8PCBvcmRlcikgLSAxKTsKKwlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UocmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKKworCXJldHVybiAwOworfSAKK3N0YXRpYyB2b2lkCitmcmVlX2J1ZmZlcnMoc3RydWN0IGVzc19zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CisKKwlzLT5kbWFfZGFjLnJhd2J1ZiA9IHMtPmRtYV9hZGMucmF3YnVmID0gTlVMTDsKKwlzLT5kbWFfZGFjLm1hcHBlZCA9IHMtPmRtYV9hZGMubWFwcGVkID0gMDsKKwlzLT5kbWFfZGFjLnJlYWR5ID0gcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisKKwlNX3ByaW50aygibWFlc3RybzogZnJlZWluZyAlcFxuIixzLT5jYXJkLT5kbWFwYWdlcyk7CisJLyogdW5kbyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAqLworCisJcGVuZCA9IHZpcnRfdG9fcGFnZShzLT5jYXJkLT5kbWFwYWdlcyArIChQQUdFX1NJWkUgPDwgcy0+Y2FyZC0+ZG1hb3JkZXIpIC0gMSk7CisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHMtPmNhcmQtPmRtYXBhZ2VzKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzLT5jYXJkLT5kbWFwYWdlcyxzLT5jYXJkLT5kbWFvcmRlcik7CisJcy0+Y2FyZC0+ZG1hcGFnZXMgPSBOVUxMOworfQorCitzdGF0aWMgaW50IAorZXNzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgZXNzX3N0YXRlICpzID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIGZtdG0gPSB+MCwgZm10cyA9IDA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCS8qCisJICoJU2NhbiB0aGUgY2FyZHMgYW5kIGZpbmQgdGhlIGNoYW5uZWwuIFdlIG9ubHkKKwkgKglkbyB0aGlzIGF0IG9wZW4gdGltZSBzbyBpdCBpcyBvaworCSAqLworCisJd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBkZXYpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBlc3NfY2FyZCAqYzsKKwkJc3RydWN0IHBjaV9kcml2ZXIgKmRydnI7CisKKwkJZHJ2ciA9IHBjaV9kZXZfZHJpdmVyIChwZGV2KTsKKwkJaWYgKGRydnIgPT0gJm1hZXN0cm9fcGNpX2RyaXZlcikgeworCQkJaW50IGk7CisJCQlzdHJ1Y3QgZXNzX3N0YXRlICpzcDsKKworCQkJYyA9IChzdHJ1Y3QgZXNzX2NhcmQqKXBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJCQlpZiAoIWMpCisJCQkJY29udGludWU7CisJCQlmb3IoaT0wO2k8TlJfRFNQUztpKyspCisJCQl7CisJCQkJc3A9JmMtPmNoYW5uZWxzW2ldOworCQkJCWlmKHNwLT5kZXZfYXVkaW8gPCAwKQorCQkJCQljb250aW51ZTsKKwkJCQlpZigoc3AtPmRldl9hdWRpbyBeIG1pbm9yKSAmIH4weGYpCisJCQkJCWNvbnRpbnVlOworCQkJCXM9c3A7CisJCQl9CisJCX0KKwl9CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgZmlsZS0+Zl9tb2RlKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisJCX0KKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcy0+b3Blbl93YWl0KTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKworCS8qIHVuZGVyIHNlbWFwaG9yZS4uICovCisJaWYgKChzLT5jYXJkLT5kbWFwYWdlcz09TlVMTCkgJiYgYWxsb2NhdGVfYnVmZmVycyhzKSkgeworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiB3ZSdyZSBjb3ZlcmVkIGJ5IHRoZSBvcGVuX3NlbSAqLworCWlmKCAhIHMtPmNhcmQtPmRzcHNfb3BlbiApICB7CisJCW1hZXN0cm9fcG93ZXIocy0+Y2FyZCxBQ1BJX0QwKTsKKwkJc3RhcnRfYm9iKHMpOworCX0KKwlzLT5jYXJkLT5kc3BzX29wZW4rKzsKKwlNX3ByaW50aygibWFlc3Rybzogb3BlbiwgJWQgYm9icyBub3dcbiIscy0+Y2FyZC0+ZHNwc19vcGVuKTsKKworCS8qIG9rLCBsZXRzIHdyaXRlIFdDIGJhc2UgcmVncyBub3cgdGhhdCB3ZSd2ZSAKKwkJcG93ZXJlZCB1cCB0aGUgY2hpcCAqLworCU1fcHJpbnRrKCJtYWVzdHJvOiB3cml0aW5nIDB4JWx4IChidXMgMHglbHgpIHRvIHRoZSB3cFxuIix2aXJ0X3RvX2J1cyhzLT5jYXJkLT5kbWFwYWdlcyksCisJCSgodmlydF90b19idXMocy0+Y2FyZC0+ZG1hcGFnZXMpKSYweEZGRTAwMDAwKT4+MTIpOworCXNldF9iYXNlX3JlZ2lzdGVycyhzLHMtPmNhcmQtPmRtYXBhZ2VzKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisvKgorCQlmbXRtICY9IH4oKEVTU19GTVRfU1RFUkVPIHwgRVNTX0ZNVF8xNkJJVCkgPDwgRVNTX0FEQ19TSElGVCk7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlmbXRzIHw9IEVTU19GTVRfMTZCSVQgPDwgRVNTX0FEQ19TSElGVDsgKi8KKworCQlmbXRtICY9IH4oKEVTU19GTVRfU1RFUkVPfEVTU19GTVRfMTZCSVQpIDw8IEVTU19BRENfU0hJRlQpOworCQlmbXRzID0gKEVTU19GTVRfU1RFUkVPfEVTU19GTVRfMTZCSVQpIDw8IEVTU19BRENfU0hJRlQ7CisKKwkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IDA7CisJCXNldF9hZGNfcmF0ZShzLCA4MDAwKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWZtdG0gJj0gfigoRVNTX0ZNVF9TVEVSRU8gfCBFU1NfRk1UXzE2QklUKSA8PCBFU1NfREFDX1NISUZUKTsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCWZtdHMgfD0gRVNTX0ZNVF8xNkJJVCA8PCBFU1NfREFDX1NISUZUOworCisJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSAwOworCQlzZXRfZGFjX3JhdGUocywgODAwMCk7CisJfQorCXNldF9mbXQocywgZm10bSwgZm10cyk7CisJcy0+b3Blbl9tb2RlIHw9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgCitlc3NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXNzX3N0YXRlICpzID0gKHN0cnVjdCBlc3Nfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJZHJhaW5fZGFjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0b3BfZGFjKHMpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdG9wX2FkYyhzKTsKKwl9CisJCQorCXMtPm9wZW5fbW9kZSAmPSAofmZpbGUtPmZfbW9kZSkgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisJLyogd2UncmUgY292ZXJlZCBieSB0aGUgb3Blbl9zZW0gKi8KKwlNX3ByaW50aygibWFlc3RybzogJWQgZHNwcyBub3cgYWxpdmVcbiIscy0+Y2FyZC0+ZHNwc19vcGVuLTEpOworCWlmKCAtLXMtPmNhcmQtPmRzcHNfb3BlbiA8PSAwKSB7CisJCXMtPmNhcmQtPmRzcHNfb3BlbiA9IDA7CisJCXN0b3BfYm9iKHMpOworCQlmcmVlX2J1ZmZlcnMocyk7CisJCW1hZXN0cm9fcG93ZXIocy0+Y2FyZCxBQ1BJX0QyKTsKKwl9CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXNzX2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGVzc19yZWFkLAorCS53cml0ZQkJPSBlc3Nfd3JpdGUsCisJLnBvbGwJCT0gZXNzX3BvbGwsCisJLmlvY3RsCQk9IGVzc19pb2N0bCwKKwkubW1hcAkJPSBlc3NfbW1hcCwKKwkub3BlbgkJPSBlc3Nfb3BlbiwKKwkucmVsZWFzZQk9IGVzc19yZWxlYXNlLAorfTsKKworc3RhdGljIGludAorbWFlc3Ryb19jb25maWcoc3RydWN0IGVzc19jYXJkICpjYXJkKSAKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY2FyZC0+cGNpZGV2OworCXN0cnVjdCBlc3Nfc3RhdGUgKmVzcyA9ICZjYXJkLT5jaGFubmVsc1swXTsKKwlpbnQgYXB1LGlvYmFzZSAgPSBjYXJkLT5pb2Jhc2U7CisJdTE2IHc7CisJdTMyIG47CisKKwkvKiBXZSB1c2VkIHRvIG11Y2sgYXJvdW5kIHdpdGggcGNpIGNvbmZpZyBzcGFjZSB0aGF0CisJICogd2UgaGFkIG5vIGJ1c2luZXNzIG1lc3Npbmcgd2l0aC4gIFdlIGRvbid0IGtub3cgZW5vdWdoCisJICogYWJvdXQgdGhlIG1hY2hpbmUgdG8ga25vdyB3aGljaCBETUEgbW9kZSBpcyBhcHByb3ByaWF0ZSwgCisJICogZXRjLiAgV2Ugd2VyZSBndWVzc2luZyB3cm9uZyBvbiBzb21lIG1hY2hpbmVzIGFuZCBtYWtpbmcKKwkgKiB0aGVtIHVuaGFwcHkuICBXZSBub3cgdHJ1c3QgaW4gdGhlIEJJT1MgdG8gZG8gdGhpbmdzIHJpZ2h0LAorCSAqIHdoaWNoIGFsbW9zdCBjZXJ0YWlubHkgbWVhbnMgYSBuZXcgaG9zdCBvZiBwcm9ibGVtcyB3aWxsCisJICogYXJpc2Ugd2l0aCBicm9rZW4gQklPUyBpbXBsZW1lbnRhdGlvbnMuICBzY3JldyAnZW0uIAorCSAqIFdlJ3JlIGFscmVhZHkgaW50b2xlcmFudCBvZiBtYWNoaW5lcyB0aGF0IGRvbid0IGFzc2lnbgorCSAqIElSUXMuCisJICovCisJCisJLyogZG8gY29uZmlnIHdvcmsgYXQgZnVsbCBwb3dlciAqLworCW1hZXN0cm9fcG93ZXIoY2FyZCxBQ1BJX0QwKTsKKwkgCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpZGV2LCAweDUwLCAmdyk7CisKKwl3Jj1+KDE8PDUpOwkJCS8qIERvbid0IHN3YXAgbGVmdC9yaWdodCAodW5kb2MpKi8KKwkKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpZGV2LCAweDUwLCB3KTsKKwkKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2lkZXYsIDB4NTIsICZ3KTsKKwl3Jj1+KDE8PDE1KTsJCS8qIFR1cm4gb2ZmIGludGVybmFsIGNsb2NrIG11bHRpcGxpZXIgKi8KKwkvKiBYWFggaG93IGRvIHdlIGtub3cgd2hpY2ggdG8gdXNlPyAqLworCXcmPX4oMTw8MTQpOwkJLyogRXh0ZXJuYWwgY2xvY2sgKi8KKwkKKwl3fD0gKDE8PDcpOwkJLyogSGFyZHdhcmUgdm9sdW1lIGNvbnRyb2wgb24gKi8KKwl3fD0gKDE8PDYpOwkJLyogRGVib3VuY2Ugb2ZmOiBlYXNpZXIgdG8gcHVzaCB0aGUgSFdWIGJ1dHRvbnMuICovCisJdyY9figxPDw1KTsJCS8qIEdQSU8gNDo1ICovCisJd3w9ICgxPDw0KTsgICAgICAgICAgICAgLyogRGlzY29ubmVjdCBmcm9tIHRoZSBDSEkuICBFbmFibGluZyB0aGlzIG1hZGUgYSBkZWxsIDc1MDAgd29yay4gKi8KKwl3Jj1+KDE8PDIpOwkJLyogTUlESSBmaXggb2ZmICh1bmRvYykgKi8KKwl3Jj1+KDE8PDEpOwkJLyogcmVzZXJ2ZWQsIGFsd2F5cyB3cml0ZSAwICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgMHg1Miwgdyk7CisJCisJLyoKKwkgKglMZWdhY3kgbW9kZQorCSAqLworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpZGV2LCAweDQwLCAmdyk7CisJd3w9KDE8PDE1KTsJLyogbGVnYWN5IGRlY29kZSBvZmYgKi8KKwl3Jj1+KDE8PDE0KTsJLyogRGlzYWJsZSBTSVJRICovCisJdyY9figweDFmKTsJLyogZGlzYWJsZSBtcHUgaXJxL2lvLCBnYW1lIHBvcnQsIGZtLCBTQiAqLworCSAKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpZGV2LCAweDQwLCB3KTsKKworCS8qIFNldCB1cCA5NzggZG9ja2luZyBjb250cm9sIGNoaXAuICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpZGV2LCAweDU4LCAmdyk7CisJd3w9MTw8MjsJLyogRW5hYmxlIDk3OC4gKi8KKwl3fD0xPDwzOwkvKiBUdXJuIG9uIDk3OCBoYXJkd2FyZSB2b2x1bWUgY29udHJvbC4gKi8KKwl3Jj1+KDE8PDExKTsJLyogVHVybiBvbiA5NzggbWl4ZXIgdm9sdW1lIGNvbnRyb2wuICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgMHg1OCwgdyk7CisJCisJc291bmRfcmVzZXQoaW9iYXNlKTsKKworCS8qCisJICoJUmluZyBCdXMgU2V0dXAKKwkgKi8KKworCS8qIHNldHVwIHVzdWFsIDB4MzQgc3R1ZmYuLiAweDM2IG1heSBiZSBjaGlwIHNwZWNpZmljICovCisgICAgICAgIG91dHcoMHhDMDkwLCBpb2Jhc2UrMHgzNCk7IC8qIGRpcmVjdCBzb3VuZCwgc3RlcmVvICovCisgICAgICAgIHVkZWxheSgyMCk7CisgICAgICAgIG91dHcoMHgzMDAwLCBpb2Jhc2UrMHgzNik7IC8qIGRpcmVjdCBzb3VuZCwgc3RlcmVvICovCisgICAgICAgIHVkZWxheSgyMCk7CisKKworCS8qCisJICoJUmVzZXQgdGhlIENPREVDCisJICovCisJIAorCW1hZXN0cm9fYWM5N19yZXNldChpb2Jhc2UscGNpZGV2KTsKKwkKKwkvKgorCSAqCVJpbmcgQnVzIFNldHVwCisJICovCisJIAkgCisJbj1pbmwoaW9iYXNlKzB4MzQpOworCW4mPX4weEYwMDA7CisJbnw9MTI8PDEyOwkJLyogRGlyZWN0IFNvdW5kLCBTdGVyZW8gKi8KKwlvdXRsKG4sIGlvYmFzZSsweDM0KTsKKworCW49aW5sKGlvYmFzZSsweDM0KTsKKwluJj1+MHgwRjAwOwkJLyogTW9kZW0gb2ZmICovCisJb3V0bChuLCBpb2Jhc2UrMHgzNCk7CisKKwluPWlubChpb2Jhc2UrMHgzNCk7CisJbiY9fjB4MDBGMDsKKwlufD05PDw0OwkJLyogREFDLCBTdGVyZW8gKi8KKwlvdXRsKG4sIGlvYmFzZSsweDM0KTsKKwkKKwluPWlubChpb2Jhc2UrMHgzNCk7CisJbiY9fjB4MDAwRjsJCS8qIEFTU1Agb2ZmICovCisJb3V0bChuLCBpb2Jhc2UrMHgzNCk7CisJCisJbj1pbmwoaW9iYXNlKzB4MzQpOworCW58PSgxPDwyOSk7CQkvKiBFbmFibGUgcmluZyBidXMgKi8KKwlvdXRsKG4sIGlvYmFzZSsweDM0KTsKKwkKKwluPWlubChpb2Jhc2UrMHgzNCk7CisJbnw9KDE8PDI4KTsJCS8qIEVuYWJsZSBzZXJpYWwgYnVzICovCisJb3V0bChuLCBpb2Jhc2UrMHgzNCk7CisJCisJbj1pbmwoaW9iYXNlKzB4MzQpOworCW4mPX4weDAwRjAwMDAwOwkJLyogTUlDIG9mZiAqLworCW91dGwobiwgaW9iYXNlKzB4MzQpOworCQorCW49aW5sKGlvYmFzZSsweDM0KTsKKwluJj1+MHgwMDBGMDAwMDsJCS8qIEkyUyBvZmYgKi8KKwlvdXRsKG4sIGlvYmFzZSsweDM0KTsKKwkKKworCXc9aW53KGlvYmFzZSsweDE4KTsKKwl3Jj1+KDE8PDcpOwkJLyogQ2xrUnVuIG9mZiAqLworCW91dHcodywgaW9iYXNlKzB4MTgpOworCisJdz1pbncoaW9iYXNlKzB4MTgpOworCXcmPX4oMTw8Nik7CQkvKiBIYXJkd2FyZSB2b2x1bWUgY29udHJvbCBpbnRlcnJ1cHQgb2ZmLi4uIGZvciBub3cuICovCisJb3V0dyh3LCBpb2Jhc2UrMHgxOCk7CisJCisJdz1pbncoaW9iYXNlKzB4MTgpOworCXcmPX4oMTw8NCk7CQkvKiBBU1NQIGlycSBvZmYgKi8KKwlvdXR3KHcsIGlvYmFzZSsweDE4KTsKKwkKKwl3PWludyhpb2Jhc2UrMHgxOCk7CisJdyY9figxPDwzKTsJCS8qIElTRE4gaXJxIG9mZiAqLworCW91dHcodywgaW9iYXNlKzB4MTgpOworCQorCXc9aW53KGlvYmFzZSsweDE4KTsKKwl3fD0oMTw8Mik7CQkvKiBEaXJlY3QgU291bmQgSVJRIG9uICovCisJb3V0dyh3LCBpb2Jhc2UrMHgxOCk7CisKKwl3PWludyhpb2Jhc2UrMHgxOCk7CisJdyY9figxPDwxKTsJCS8qIE1QVTQwMSBJUlEgb2ZmICovCisJb3V0dyh3LCBpb2Jhc2UrMHgxOCk7CisKKwl3PWludyhpb2Jhc2UrMHgxOCk7CisJd3w9KDE8PDApOwkJLyogU0IgSVJRIG9uICovCisJb3V0dyh3LCBpb2Jhc2UrMHgxOCk7CisKKwkvKiBTZXQgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2wgcmVnaXN0ZXJzIHRvIG1pZHBvaW50cy4KKwkgICBXZSBjYW4gdGVsbCB3aGljaCBidXR0b24gd2FzIHB1c2hlZCBiYXNlZCBvbiBob3cgdGhleSBjaGFuZ2UuICovCisJb3V0YigweDg4LCBpb2Jhc2UrMHgxYyk7CisJb3V0YigweDg4LCBpb2Jhc2UrMHgxZCk7CisJb3V0YigweDg4LCBpb2Jhc2UrMHgxZSk7CisJb3V0YigweDg4LCBpb2Jhc2UrMHgxZik7CisKKwkvKiBpdCBhcHBlYXJzIHNvbWUgbWFlc3Ryb3MgKGRlbGwgNzUwMCkgb25seSB3b3JrIGlmIHRoZXNlIGFyZSBzZXQsCisJCXJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSB1c2UgdGhlIGFzc3Agb3Igbm90LiAqLworCisJb3V0YigwLCBpb2Jhc2UrMHhBNCk7IAorCW91dGIoMywgaW9iYXNlKzB4QTIpOyAKKwlvdXRiKDAsIGlvYmFzZSsweEE2KTsKKwkKKwlmb3IoYXB1PTA7YXB1PDE2O2FwdSsrKQorCXsKKwkJLyogV3JpdGUgMCBpbnRvIHRoZSBidWZmZXIgYXJlYSAweDFFMC0+MUVGICovCisJCW91dHcoMHgwMUUwK2FwdSwgMHgxMCtpb2Jhc2UpOworCQlvdXR3KDB4MDAwMCwgMHgxMitpb2Jhc2UpOworCQorCQkvKgorCQkgKiBUaGUgMS4xMCB0ZXN0IHByb2dyYW0gc2VlbSB0byB3cml0ZSAwIGludG8gdGhlIGJ1ZmZlciBhcmVhCisJCSAqIDB4MUQwLTB4MURGIHRvby4KKwkJICovCisJCW91dHcoMHgwMUQwK2FwdSwgMHgxMCtpb2Jhc2UpOworCQlvdXR3KDB4MDAwMCwgMHgxMitpb2Jhc2UpOworCX0KKworI2lmIDEKKwl3YXZlX3NldF9yZWdpc3Rlcihlc3MsIElEUjdfV0FWRV9ST01SQU0sIAorCQkod2F2ZV9nZXRfcmVnaXN0ZXIoZXNzLCBJRFI3X1dBVkVfUk9NUkFNKSYweEZGMDApKTsKKwl3YXZlX3NldF9yZWdpc3Rlcihlc3MsIElEUjdfV0FWRV9ST01SQU0sCisJCXdhdmVfZ2V0X3JlZ2lzdGVyKGVzcywgSURSN19XQVZFX1JPTVJBTSl8MHgxMDApOworCXdhdmVfc2V0X3JlZ2lzdGVyKGVzcywgSURSN19XQVZFX1JPTVJBTSwKKwkJd2F2ZV9nZXRfcmVnaXN0ZXIoZXNzLCBJRFI3X1dBVkVfUk9NUkFNKSZ+MHgyMDApOworCXdhdmVfc2V0X3JlZ2lzdGVyKGVzcywgSURSN19XQVZFX1JPTVJBTSwKKwkJd2F2ZV9nZXRfcmVnaXN0ZXIoZXNzLCBJRFI3X1dBVkVfUk9NUkFNKXx+MHg0MDApOworI2Vsc2UJCQorCW1hZXN0cm9fd3JpdGUoZXNzLCBJRFI3X1dBVkVfUk9NUkFNLCAKKwkJKG1hZXN0cm9fcmVhZChlc3MsIElEUjdfV0FWRV9ST01SQU0pJjB4RkYwMCkpOworCW1hZXN0cm9fd3JpdGUoZXNzLCBJRFI3X1dBVkVfUk9NUkFNLAorCQltYWVzdHJvX3JlYWQoZXNzLCBJRFI3X1dBVkVfUk9NUkFNKXwweDEwMCk7CisJbWFlc3Ryb193cml0ZShlc3MsIElEUjdfV0FWRV9ST01SQU0sCisJCW1hZXN0cm9fcmVhZChlc3MsIElEUjdfV0FWRV9ST01SQU0pJn4weDIwMCk7CisJbWFlc3Ryb193cml0ZShlc3MsIElEUjdfV0FWRV9ST01SQU0sCisJCW1hZXN0cm9fcmVhZChlc3MsIElEUjdfV0FWRV9ST01SQU0pfDB4NDAwKTsKKyNlbmRpZgorCQorCW1hZXN0cm9fd3JpdGUoZXNzLCBJRFIyX0NSQU1fREFUQSwgMHgwMDAwKTsKKwltYWVzdHJvX3dyaXRlKGVzcywgMHgwOCwgMHhCMDA0KTsKKwkvKiBOb3cgYmFjayB0byB0aGUgRGlyZWN0U291bmQgc3R1ZmYgKi8KKwltYWVzdHJvX3dyaXRlKGVzcywgMHgwOSwgMHgwMDFCKTsKKwltYWVzdHJvX3dyaXRlKGVzcywgMHgwQSwgMHg4MDAwKTsKKwltYWVzdHJvX3dyaXRlKGVzcywgMHgwQiwgMHgzRjM3KTsKKwltYWVzdHJvX3dyaXRlKGVzcywgMHgwQywgMHgwMDk4KTsKKwkKKwkvKiBwYXJhbGxlbCBvdXQgPz8gKi8KKwltYWVzdHJvX3dyaXRlKGVzcywgMHgwQywgCisJCShtYWVzdHJvX3JlYWQoZXNzLCAweDBDKSZ+MHhGMDAwKXwweDgwMDApOyAKKwkvKiBwYXJhbGxlbCBpbiwgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIHJlY29yZGluZyA6KSAqLworCW1hZXN0cm9fd3JpdGUoZXNzLCAweDBDLCAKKwkJKG1hZXN0cm9fcmVhZChlc3MsIDB4MEMpJn4weDBGMDApfDB4MDUwMCk7CisKKwltYWVzdHJvX3dyaXRlKGVzcywgMHgwRCwgMHg3NjMyKTsKKwkJCQorCS8qIFdhdmUgY2FjaGUgY29udHJvbCBvbiAtIHRlc3Qgb2ZmLCBzZyBvZmYsIAorCQllbmFibGUsIGVuYWJsZSBleHRyYSBjaGFucyAxTWIgKi8KKworCW91dHcoaW53KDB4MTQraW9iYXNlKXwoMTw8OCksMHgxNCtpb2Jhc2UpOworCW91dHcoaW53KDB4MTQraW9iYXNlKSYweEZFMDMsMHgxNCtpb2Jhc2UpOworCW91dHcoKGludygweDE0K2lvYmFzZSkmMHhGRkZDKSwgMHgxNCtpb2Jhc2UpOworCW91dHcoaW53KDB4MTQraW9iYXNlKXwoMTw8NyksMHgxNCtpb2Jhc2UpOworCisJb3V0dygweEExQTAsIDB4MTQraW9iYXNlKTsgICAgICAvKiAwMzAwID8gKi8KKworCS8qIE5vdyBjbGVhciB0aGUgQVBVIGNvbnRyb2wgcmFtICovCQorCWZvcihhcHU9MDthcHU8TlJfQVBVUzthcHUrKykKKwl7CisJCWZvcih3PTA7dzxOUl9BUFVfUkVHUzt3KyspCisJCQlhcHVfc2V0X3JlZ2lzdGVyKGVzcywgYXB1fEVTU19DSEFOX0hBUkQsIHcsIDApOworCQkKKwl9CisKKwlyZXR1cm4gMDsKKwkKK30KKworLyogdGhpcyBndXkgdHJpZXMgdG8gZmluZCB0aGUgcGNpIHBvd2VyIG1hbmFnZW1lbnQKKyAqIHJlZ2lzdGVyIGJhbmsuICB0aGlzIHNob3VsZCByZWFsbHkgYmUgaW4gY29yZQorICogY29kZSBzb21ld2hlcmUuICAxIG9uIHN1Y2Nlc3MuICovCitzdGF0aWMgaW50CitwYXJzZV9wb3dlcihzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJdTMyIG47CisJdTE2IHc7CisJdTggbmV4dDsKKwlpbnQgbWF4ID0gNjQ7ICAvKiBhbiBhIDhiaXQgZ3V5IHBvaW50aW5nIHRvIDMyYml0IGd1eXMKKwkJCQljYW4gb25seSBleHByZXNzIHNvIG11Y2guICovCisKKwljYXJkLT5wb3dlcl9yZWdzID0gMDsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgY2FwYWJpbGl0aWVzIGxpc3QgaW4KKwkJdGhlIGNvbmZpZyByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaWRldiwgUENJX1NUQVRVUywgJncpOworCWlmKCEodyAmIFBDSV9TVEFUVVNfQ0FQX0xJU1QpKSByZXR1cm4gMDsKKworCS8qIHdhbGsgdGhlIGxpc3QsIHN0YXJ0aW5nIGF0IHRoZSBoZWFkLiAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldixQQ0lfQ0FQQUJJTElUWV9MSVNULCZuZXh0KTsKKworCXdoaWxlKG5leHQgJiYgbWF4LS0pIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgbmV4dCAmIH4zLCAmbik7CisJCWlmKChuICYgMHhmZikgPT0gUENJX0NBUF9JRF9QTSkgeworCQkJY2FyZC0+cG93ZXJfcmVncyA9IG5leHQ7CisJCQlicmVhazsKKwkJfQorCQluZXh0ID0gKChuPj44KSAmIDB4ZmYpOworCX0KKworCXJldHVybiBjYXJkLT5wb3dlcl9yZWdzID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CittYWVzdHJvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBkaWQpCit7CisJaW50IGNhcmRfdHlwZSA9IHBkaWQtPmRyaXZlcl9kYXRhOworCXUzMiBuOworCWludCBpb2Jhc2U7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQ7CisJc3RydWN0IGVzc19zdGF0ZSAqZXNzOworCXN0cnVjdCBwbV9kZXYgKnBtZGV2OworCWludCBudW0gPSAwOworCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCS8qIGRvbid0IHBpY2sgdXAgd2VpcmQgbW9kZW0gbWFlc3Ryb3MgKi8KKwlpZigoKHBjaWRldi0+Y2xhc3MgPj4gOCkgJiAweGZmZmYpICE9IFBDSV9DTEFTU19NVUxUSU1FRElBX0FVRElPKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCisJaWYgKChyZXQ9cGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkpCisJCXJldHVybiByZXQ7CisJCQkKKwlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LDApOworCWlmICghaW9iYXNlIHx8ICEocGNpX3Jlc291cmNlX2ZsYWdzKHBjaWRldiwgMCApICYgSU9SRVNPVVJDRV9JTykpCisJCXJldHVybiAtRU5PREVWOworCisJaWYocGNpZGV2LT5pcnEgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBzdGFrZSBvdXIgY2xhaW0gb24gdGhlIGlvc3BhY2UgKi8KKwlpZiggcmVxdWVzdF9yZWdpb24oaW9iYXNlLCAyNTYsIGNhcmRfbmFtZXNbY2FyZF90eXBlXSkgPT0gTlVMTCApCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtYWVzdHJvOiBjYW4ndCBhbGxvY2F0ZSAyNTYgYnl0ZXMgSS9PIGF0IDB4JTQuNHhcbiIsIGlvYmFzZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyoganVzdCB0byBiZSBzdXJlICovCisJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsKKworCWNhcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXNzX2NhcmQpLCBHRlBfS0VSTkVMKTsKKwlpZihjYXJkID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtYWVzdHJvOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oaW9iYXNlLCAyNTYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCisJbWVtc2V0KGNhcmQsIDAsIHNpemVvZigqY2FyZCkpOworCWNhcmQtPnBjaWRldiA9IHBjaWRldjsKKworCXBtZGV2ID0gcG1fcmVnaXN0ZXIoUE1fUENJX0RFViwgUE1fUENJX0lEKHBjaWRldiksCisJCQltYWVzdHJvX3BtX2NhbGxiYWNrKTsKKwlpZiAocG1kZXYpCisJCXBtZGV2LT5kYXRhID0gY2FyZDsKKworCWNhcmQtPmlvYmFzZSA9IGlvYmFzZTsKKwljYXJkLT5jYXJkX3R5cGUgPSBjYXJkX3R5cGU7CisJY2FyZC0+aXJxID0gcGNpZGV2LT5pcnE7CisJY2FyZC0+bWFnaWMgPSBFU1NfQ0FSRF9NQUdJQzsKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+c3VzcGVuZF9xdWV1ZSk7CisKKwljYXJkLT5kb2NrX211dGVfdm9sID0gNTA7CisJCisJLyogaW5pdCBvdXIgZ3JvdXBzIG9mIDYgYXB1cyAqLworCWZvcihpPTA7aTxOUl9EU1BTO2krKykKKwl7CisJCXN0cnVjdCBlc3Nfc3RhdGUgKnM9JmNhcmQtPmNoYW5uZWxzW2ldOworCisJCXMtPmluZGV4ID0gaTsKKworCQlzLT5jYXJkID0gY2FyZDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYy53YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnMtPmxvY2spOworCQlpbml0X01VVEVYKCZzLT5vcGVuX3NlbSk7CisJCXMtPm1hZ2ljID0gRVNTX1NUQVRFX01BR0lDOworCQkKKwkJcy0+YXB1WzBdID0gNippOworCQlzLT5hcHVbMV0gPSAoNippKSsxOworCQlzLT5hcHVbMl0gPSAoNippKSsyOworCQlzLT5hcHVbM10gPSAoNippKSszOworCQlzLT5hcHVbNF0gPSAoNippKSs0OworCQlzLT5hcHVbNV0gPSAoNippKSs1OworCQkKKwkJaWYocy0+ZG1hX2FkYy5yZWFkeSB8fCBzLT5kbWFfZGFjLnJlYWR5IHx8IHMtPmRtYV9hZGMucmF3YnVmKQorCQkJcHJpbnRrKCJtYWVzdHJvOiBCT1RDSCFcbiIpOworCQkvKiByZWdpc3RlciBkZXZpY2VzICovCisJCWlmICgocy0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlc3NfYXVkaW9fZm9wcywgLTEpKSA8IDApCisJCQlicmVhazsKKwl9CisJCisJbnVtID0gaTsKKwkKKwkvKiBjbGVhciB0aGUgcmVzdCBpZiB3ZSByYW4gb3V0IG9mIHNsb3RzIHRvIHJlZ2lzdGVyICovCisJZm9yKDtpPE5SX0RTUFM7aSsrKQorCXsKKwkJc3RydWN0IGVzc19zdGF0ZSAqcz0mY2FyZC0+Y2hhbm5lbHNbaV07CisJCXMtPmRldl9hdWRpbyA9IC0xOworCX0KKwkKKwllc3MgPSAmY2FyZC0+Y2hhbm5lbHNbMF07CisKKwkvKgorCSAqCU9rIGNhcmQgcmVhZHkuIEJlZ2luIHNldHVwIHByb3BlcgorCSAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAibWFlc3RybzogQ29uZmlndXJpbmcgJXMgZm91bmQgYXQgSU8gMHglMDRYIElSUSAlZFxuIiwgCisJCWNhcmRfbmFtZXNbY2FyZF90eXBlXSxpb2Jhc2UsY2FyZC0+aXJxKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJm4pOworCXByaW50ayhLRVJOX0lORk8gIm1hZXN0cm86ICBzdWJ2ZW5kb3IgaWQ6IDB4JTA4eFxuIixuKTsgCisKKwkvKiB0dXJuIG9mZiBwb3dlciBtYW5hZ2VtZW50IHVubGVzczoKKwkgKgktIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrcyBmb3IgaXQKKwkgKiAJCW9yCisJICoJCS0gd2UncmUgbm90IGEgMmUsIGxlc3NlciBjaGlwcHMgc2VlbSB0byBoYXZlIHByb2JsZW1zLgorCSAqCQktIHdlJ3JlIG5vdCBvbiBvdXIgX3ZlcnlfIHNtYWxsIHdoaXRlbGlzdC4gIHNvbWUgaW1wbGVtZW5ldGF0aW9ucworCSAqCQkJcmVhbGx5IGRvbid0IGxpa2UgdGhlIHBtIGNvZGUsIG90aGVycyByZXF1aXJlIGl0LgorCSAqCQkJZmVlbCBmcmVlIHRvIGV4cGFuZCB0aGlzIGFzIHJlcXVpcmVkLgorCSAqLworI2RlZmluZSBTVUJTWVNURU1fVkVORE9SKHgpICh4JjB4ZmZmZikKKwlpZigJKHVzZV9wbSAhPSAxKSAmJiAKKwkJKChjYXJkX3R5cGUgIT0gVFlQRV9NQUVTVFJPMkUpCXx8IChTVUJTWVNURU1fVkVORE9SKG4pICE9IDB4MTAyOCkpKQorCQkJdXNlX3BtID0gMDsKKworCWlmKCF1c2VfcG0pIAorCQlwcmludGsoS0VSTl9JTkZPICJtYWVzdHJvOiBub3QgYXR0ZW1wdGluZyBwb3dlciBtYW5hZ2VtZW50LlxuIik7CisJZWxzZSB7CisJCWlmKCFwYXJzZV9wb3dlcihjYXJkLHBjaWRldikpIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAibWFlc3Rybzogbm8gUENJIHBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGZvdW5kLlxuIik7CisJCWVsc2UgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgY2FyZC0+cG93ZXJfcmVncywgJm4pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAibWFlc3RybzogUENJIHBvd2VyIG1hbmFnZW1lbnQgY2FwYWJpbGl0eTogMHgleFxuIixuPj4xNik7CisJCX0JCisJfQorCisJbWFlc3Ryb19jb25maWcoY2FyZCk7CisKKwlpZihtYWVzdHJvX2FjOTdfZ2V0KGNhcmQsIDB4MDApPT0weDAwODApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWVzdHJvOiBteSBnb29kbmVzcyEgIHlvdSBzZWVtIHRvIGhhdmUgYSBwdDEwMSBjb2RlYywgd2hpY2ggaXMgcXVpdGUgcmFyZS5cbiIKKwkJCQkiXHR5b3Ugc2hvdWxkIHRlbGwgc29tZW9uZSBhYm91dCB0aGlzLlxuIik7CisJfSBlbHNlIHsKKwkJbWFlc3Ryb19hYzk3X2luaXQoY2FyZCk7CisJfQorCisJaWYgKChjYXJkLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmZXNzX21peGVyX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXByaW50aygibWFlc3RybzogY291bGRuJ3QgcmVnaXN0ZXIgbWl4ZXIhXG4iKTsKKwl9IGVsc2UgeworCQltZW1jcHkoY2FyZC0+bWl4Lm1peGVyX3N0YXRlLG1peGVyX2RlZmF1bHRzLHNpemVvZihjYXJkLT5taXgubWl4ZXJfc3RhdGUpKTsKKwkJbWl4ZXJfcHVzaF9zdGF0ZShjYXJkKTsKKwl9CisJCisJaWYoKHJldD1yZXF1ZXN0X2lycShjYXJkLT5pcnEsIGVzc19pbnRlcnJ1cHQsIFNBX1NISVJRLCBjYXJkX25hbWVzW2NhcmRfdHlwZV0sIGNhcmQpKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAibWFlc3RybzogdW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZCxcbiIsIGNhcmQtPmlycSk7CisJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+ZGV2X21peGVyKTsKKwkJZm9yKGk9MDtpPE5SX0RTUFM7aSsrKQorCQl7CisJCQlzdHJ1Y3QgZXNzX3N0YXRlICpzID0gJmNhcmQtPmNoYW5uZWxzW2ldOworCQkJaWYocy0+ZGV2X2F1ZGlvICE9IC0xKQorCQkJCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisJCX0KKwkJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCAyNTYpOwkJCisJCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZtYWVzdHJvX25iKTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogVHVybiBvbiBoYXJkd2FyZSB2b2x1bWUgY29udHJvbCBpbnRlcnJ1cHQuCisJICAgVGhpcyBoYXMgdG8gY29tZSBhZnRlciB3ZSBncmFiIHRoZSBJUlEgYWJvdmUsCisJICAgb3IgYSBjcmFzaCB3aWxsIHJlc3VsdCBvbiBpbnN0YWxsYXRpb24gaWYgYSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZCwKKwkgICBiZWNhdXNlIGluIHRoYXQgY2FzZSB3ZSdsbCBnZXQgYW4gaW1tZWRpYXRlIGludGVycnVwdC4gKi8KKwluID0gaW53KGlvYmFzZSsweDE4KTsKKwlufD0oMTw8Nik7CisJb3V0dyhuLCBpb2Jhc2UrMHgxOCk7CisKKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LGNhcmQpOworCS8qIG5vdyBnbyB0byBzbGVlcCAndGlsbCBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaGFwcGVucyAqLworCW1hZXN0cm9fcG93ZXIoY2FyZCxBQ1BJX0QyKTsKKworCXByaW50ayhLRVJOX0lORk8gIm1hZXN0cm86ICVkIGNoYW5uZWxzIGNvbmZpZ3VyZWQuXG4iLCBudW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYWVzdHJvX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KSB7CisJc3RydWN0IGVzc19jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaWRldik7CisJaW50IGk7CisJdTMyIG47CisJCisJLyogWFhYIG1heWJlIHNob3VsZCBmb3JjZSBzdG9wIGJvYiwgYnV0IHNob3VsZCBiZSBhbGwgCisJCXN0b3BwZWQgYnkgX3JlbGVhc2UgYnkgbm93ICovCisKKwkvKiBUdXJuIG9mZiBoYXJkd2FyZSB2b2x1bWUgY29udHJvbCBpbnRlcnJ1cHQuCisJICAgVGhpcyBoYXMgdG8gY29tZSBiZWZvcmUgd2UgbGVhdmUgdGhlIElSUSBiZWxvdywKKwkgICBvciBhIGNyYXNoIHJlc3VsdHMgaWYgYSBidXR0b24gaXMgcHJlc3NlZCAhICovCisJbiA9IGludyhjYXJkLT5pb2Jhc2UrMHgxOCk7CisJbiY9figxPDw2KTsKKwlvdXR3KG4sIGNhcmQtPmlvYmFzZSsweDE4KTsKKworCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5kZXZfbWl4ZXIpOworCWZvcihpPTA7aTxOUl9EU1BTO2krKykKKwl7CisJCXN0cnVjdCBlc3Nfc3RhdGUgKmVzcyA9ICZjYXJkLT5jaGFubmVsc1tpXTsKKwkJaWYoZXNzLT5kZXZfYXVkaW8gIT0gLTEpCisJCQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChlc3MtPmRldl9hdWRpbyk7CisJfQorCS8qIEdvb2RieWUsIE1yLiBCb25kLiAqLworCW1hZXN0cm9fcG93ZXIoY2FyZCxBQ1BJX0QzKTsKKyAJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCAyNTYpOworCWtmcmVlKGNhcmQpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtYWVzdHJvX3BjaV90YmxbXSA9IHsKKwl7UENJX1ZFTkRPUl9FU1MsIFBDSV9ERVZJQ0VfSURfRVNTX0VTUzE5NjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRZUEVfTUFFU1RSTzJ9LAorCXtQQ0lfVkVORE9SX0VTUywgUENJX0RFVklDRV9JRF9FU1NfRVNTMTk3OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVFlQRV9NQUVTVFJPMkV9LAorCXtQQ0lfVkVORE9SX0VTU19PTEQsIFBDSV9ERVZJQ0VfSURfRVNTX0VTUzAxMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRZUEVfTUFFU1RST30sCisJezAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtYWVzdHJvX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbWFlc3Ryb19wY2lfZHJpdmVyID0geworCS5uYW1lCSAgPSAibWFlc3RybyIsCisJLmlkX3RhYmxlID0gbWFlc3Ryb19wY2lfdGJsLAorCS5wcm9iZQkgID0gbWFlc3Ryb19wcm9iZSwKKwkucmVtb3ZlCSAgPSBtYWVzdHJvX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbWFlc3Rybyh2b2lkKQoreworCWludCByYzsKKworCXJjID0gcGNpX21vZHVsZV9pbml0KCZtYWVzdHJvX3BjaV9kcml2ZXIpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmIChyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJm1hZXN0cm9fbmIpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJtYWVzdHJvOiByZWJvb3Qgbm90aWZpZXIgcmVnaXN0cmF0aW9uIGZhaWxlZDsgbWF5IG5vdCByZWJvb3QgcHJvcGVybHkuXG4iKTsKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKwlpZiAoZHNwc19vcmRlciA8IDApICAgeworCQlkc3BzX29yZGVyID0gMTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWFlc3RybzogY2xpcHBpbmcgZHNwc19vcmRlciB0byAlZFxuIixkc3BzX29yZGVyKTsKKwl9CisJZWxzZSBpZiAoZHNwc19vcmRlciA+IE1BWF9EU1BfT1JERVIpICB7CisJCWRzcHNfb3JkZXIgPSBNQVhfRFNQX09SREVSOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtYWVzdHJvOiBjbGlwcGluZyBkc3BzX29yZGVyIHRvICVkXG4iLGRzcHNfb3JkZXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWVzdHJvX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmJ1ZikKK3sKKwkvKiB0aGlzIG5vdGlmaWVyIGlzIGNhbGxlZCB3aGVuIHRoZSBrZXJuZWwgaXMgcmVhbGx5IHNodXQgZG93bi4gKi8KKwlNX3ByaW50aygibWFlc3Rybzogc2h1dHRpbmcgZG93blxuIik7CisJLyogdGhpcyB3aWxsIHJlbW92ZSBhbGwgY2FyZCBpbnN0YW5jZXMgdG9vICovCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtYWVzdHJvX3BjaV9kcml2ZXIpOworCS8qIFhYWCBkdW5ubyBhYm91dCBwb3dlciBtYW5hZ2VtZW50ICovCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworc3RhdGljIHZvaWQgY2xlYW51cF9tYWVzdHJvKHZvaWQpIHsKKwlNX3ByaW50aygibWFlc3RybzogdW5sb2FkaW5nXG4iKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm1hZXN0cm9fcGNpX2RyaXZlcik7CisJcG1fdW5yZWdpc3Rlcl9hbGwobWFlc3Ryb19wbV9jYWxsYmFjayk7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJm1hZXN0cm9fbmIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorY2hlY2tfc3VzcGVuZChzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlpZighY2FyZC0+aW5fc3VzcGVuZCkgcmV0dXJuOworCisJY2FyZC0+aW5fc3VzcGVuZCsrOworCWFkZF93YWl0X3F1ZXVlKCYoY2FyZC0+c3VzcGVuZF9xdWV1ZSksICZ3YWl0KTsKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlKCk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJihjYXJkLT5zdXNwZW5kX3F1ZXVlKSwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworfQorCitzdGF0aWMgaW50IAorbWFlc3Ryb19zdXNwZW5kKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLGo7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jayxmbGFncyk7IC8qIG92ZXIta2lsbCAqLworCisJTV9wcmludGsoIm1hZXN0cm86IGFwbSBpbiBkZXYgJXBcbiIsY2FyZCk7CisKKwkvKiB3ZSBoYXZlIHRvIHJlYWQgZnJvbSB0aGUgYXB1IHJlZ3MsIG5lZWQKKwkJdG8gcG93ZXIgaXQgdXAgKi8KKwltYWVzdHJvX3Bvd2VyKGNhcmQsQUNQSV9EMCk7CisKKwlmb3IoaT0wO2k8TlJfRFNQUztpKyspIHsKKwkJc3RydWN0IGVzc19zdGF0ZSAqcyA9ICZjYXJkLT5jaGFubmVsc1tpXTsKKworCQlpZihzLT5kZXZfYXVkaW8gPT0gLTEpCisJCQljb250aW51ZTsKKworCQlNX3ByaW50aygibWFlc3Rybzogc3RvcHBpbmcgYXB1cyBmb3IgZGV2aWNlICVkXG4iLGkpOworCQlzdG9wX2RhYyhzKTsKKwkJc3RvcF9hZGMocyk7CisJCWZvcihqPTA7ajw2O2orKykgCisJCQljYXJkLT5hcHVfbWFwW3MtPmFwdVtqXV1bNV09YXB1X2dldF9yZWdpc3RlcihzLGosNSk7CisKKwl9CisKKwkvKiBnZXQgcmlkIG9mIGludGVycnVwdHM/ICovCisJaWYoIGNhcmQtPmRzcHNfb3BlbiA+IDApCisJCXN0b3BfYm9iKCZjYXJkLT5jaGFubmVsc1swXSk7CisKKwljYXJkLT5pbl9zdXNwZW5kKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKKworCS8qIHdlIHRydXN0IGluIHRoZSBiaW9zIHRvIHBvd2VyIGRvd24gdGhlIGNoaXAgb24gc3VzcGVuZC4KKwkgKiBYWFggSSdtIGFsc28gbm90IHN1cmUgdGhhdCBpbl9zdXNwZW5kIHdpbGwgcHJvdGVjdAorCSAqIGFnYWluc3QgYWxsIHJlZyBhY2Nlc3NlcyBmcm9tIGhlcmUgb24gb3V0LiAKKwkgKi8KKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgCittYWVzdHJvX3Jlc3VtZShzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLGZsYWdzKTsgLyogb3Zlci1raWxsICovCisKKwljYXJkLT5pbl9zdXNwZW5kID0gMDsKKworCU1fcHJpbnRrKCJtYWVzdHJvOiByZXN1bWluZyBjYXJkIGF0ICVwXG4iLGNhcmQpOworCisJLyogcmVzdG9yZSBhbGwgb3VyIGNvbmZpZyAqLworCW1hZXN0cm9fY29uZmlnKGNhcmQpOworCS8qIG5lZWQgdG8gcmVzdG9yZSB0aGUgYmFzZSBwb2ludGVycy4uICovIAorCWlmKGNhcmQtPmRtYXBhZ2VzKSAKKwkJc2V0X2Jhc2VfcmVnaXN0ZXJzKCZjYXJkLT5jaGFubmVsc1swXSxjYXJkLT5kbWFwYWdlcyk7CisKKwltaXhlcl9wdXNoX3N0YXRlKGNhcmQpOworCisJLyogc2V0IGVhY2ggY2hhbm5lbHMnIGFwdSBjb250cm9sIHJlZ2lzdGVycyBiZWZvcmUKKwkgKiByZXN0b3JpbmcgYXVkaW8gCisJICovCisJZm9yKGk9MDtpPE5SX0RTUFM7aSsrKSB7CisJCXN0cnVjdCBlc3Nfc3RhdGUgKnMgPSAmY2FyZC0+Y2hhbm5lbHNbaV07CisJCWludCBjaGFuLHJlZzsKKworCQlpZihzLT5kZXZfYXVkaW8gPT0gLTEpCisJCQljb250aW51ZTsKKworCQlmb3IoY2hhbiA9IDAgOyBjaGFuIDwgNiA7IGNoYW4rKykgeworCQkJd2F2ZV9zZXRfcmVnaXN0ZXIocyxzLT5hcHVbY2hhbl08PDMscy0+YXB1X2Jhc2VbY2hhbl0pOworCQkJZm9yKHJlZyA9IDEgOyByZWcgPCBOUl9BUFVfUkVHUyA7IHJlZysrKSAgCisJCQkJYXB1X3NldF9yZWdpc3RlcihzLGNoYW4scmVnLHMtPmNhcmQtPmFwdV9tYXBbcy0+YXB1W2NoYW5dXVtyZWddKTsKKwkJfQorCQlmb3IoY2hhbiA9IDAgOyBjaGFuIDwgNiA7IGNoYW4rKykgIAorCQkJYXB1X3NldF9yZWdpc3RlcihzLGNoYW4sMCxzLT5jYXJkLT5hcHVfbWFwW3MtPmFwdVtjaGFuXV1bMF0gJiAweEZGMEYpOworCX0KKworCS8qIG5vdyB3ZSBmbGlwIG9uIHRoZSBtdXNpYyAqLworCisJaWYoIGNhcmQtPmRzcHNfb3BlbiA8PSAwKSB7CisJCS8qIHRoaXMgY2FyZCdzIGlkbGUgKi8KKwkJbWFlc3Ryb19wb3dlcihjYXJkLEFDUElfRDIpOworCX0gZWxzZSB7CisJCS8qIG9rLCB3ZSdyZSBhY3R1YWxseSBwbGF5aW5nIHRoaW5ncyBvbgorCQkJdGhpcyBjYXJkICovCisJCW1hZXN0cm9fcG93ZXIoY2FyZCxBQ1BJX0QwKTsKKwkJc3RhcnRfYm9iKCZjYXJkLT5jaGFubmVsc1swXSk7CisJCWZvcihpPTA7aTxOUl9EU1BTO2krKykgeworCQkJc3RydWN0IGVzc19zdGF0ZSAqcyA9ICZjYXJkLT5jaGFubmVsc1tpXTsKKworCQkJLyogdGhlc2UgdXNlIHRoZSBhcHVfbW9kZSwgYW5kIGNhbiBoYW5kbGUKKwkJCQlzcHVyaW91cyBjYWxscyAqLworCQkJc3RhcnRfZGFjKHMpOwkKKwkJCXN0YXJ0X2FkYyhzKTsJCisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKKworCS8qIGFsbCByaWdodCwgd2UgdGhpbmsgdGhpbmdzIGFyZSByZWFkeSwgCisJCXdha2UgdXAgcGVvcGxlIHdobyB3ZXJlIHVzaW5nIHRoZSBkZXZpY2UKKwkJd2hlbiB3ZSBzdXNwZW5kZWQgKi8KKwl3YWtlX3VwKCYoY2FyZC0+c3VzcGVuZF9xdWV1ZSkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCAKK21hZXN0cm9fcG1fY2FsbGJhY2soc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSkgCit7CisJc3RydWN0IGVzc19jYXJkICpjYXJkID0gKHN0cnVjdCBlc3NfY2FyZCopIGRldi0+ZGF0YTsKKworCWlmICggISBjYXJkICkgZ290byBvdXQ7CisKKwlNX3ByaW50aygibWFlc3RybzogcG0gZXZlbnQgMHgleCByZWNlaXZlZCBmb3IgY2FyZCAlcFxuIiwgcnFzdCwgY2FyZCk7CisJCisJc3dpdGNoIChycXN0KSB7CisJCWNhc2UgUE1fU1VTUEVORDogCisJCQltYWVzdHJvX3N1c3BlbmQoY2FyZCk7CisJCWJyZWFrOworCQljYXNlIFBNX1JFU1VNRTogCisJCQltYWVzdHJvX3Jlc3VtZShjYXJkKTsKKwkJYnJlYWs7CisJCS8qCisJCSAqIHdlJ2QgYWxzbyBsaWtlIHRvIGZpbmQgb3V0IGFib3V0CisJCSAqIHBvd2VyIGxldmVsIGNoYW5nZXMgYmVjYXVzZSBzb21lIGJpb3NlbgorCQkgKiBkbyBtZWFuIHRoaW5ncyB0byB0aGUgbWFlc3RybyB3aGVuIHRoZXkKKwkJICogY2hhbmdlIHRoZWlyIHBvd2VyIHN0YXRlLgorCQkgKi8KKyAgICAgICAgfQorb3V0OgorCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChpbml0X21hZXN0cm8pOworbW9kdWxlX2V4aXQoY2xlYW51cF9tYWVzdHJvKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tYWVzdHJvLmggYi9zb3VuZC9vc3MvbWFlc3Ryby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyM2VjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbWFlc3Ryby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKglSZWdpc3RlcnMgZm9yIHRoZSBFU1MgUENJIGNhcmRzCisgKi8KKyAKKy8qCisgKglNZW1vcnkgYWNjZXNzCisgKi8KKyAKKyNkZWZpbmUgRVNTX01FTV9EQVRBCQkweDAwCisjZGVmaW5lCUVTU19NRU1fSU5ERVgJCTB4MDIKKworLyoKKyAqCUFDLTk3IENvZGVjIHBvcnQuIERlbGF5IDF1UyBhZnRlciBlYWNoIHdyaXRlLiBUaGlzIGlzIHVzZWQgdG8KKyAqCXRhbGsgQUMtOTcgKHNlZSBpbnRlbC5jb20pLiBXcml0ZSBkYXRhIHRoZW4gcmVnaXN0ZXIuCisgKi8KKyAKKyNkZWZpbmUgRVNTX0FDOTdfSU5ERVgJCTB4MzAJCS8qIGJ5dGUgd2lkZSAqLworI2RlZmluZSBFU1NfQUM5N19EQVRBCQkweDMyCisKKy8qIAorICoJUmVhZGluZyBpcyBhIGJpdCBkaWZmZXJlbnQuIFlvdSB3cml0ZSByZWdpc3RlcnwweDgwIHRvIHViZGV4CisgKglkZWxheSAxdVMgcG9sbCB0aGUgbG93IGJpdCBvZiBpbmRleCwgd2hlbiBpdCBjbGVhcnMgcmVhZCB0aGUKKyAqCWRhdGEgdmFsdWUuCisgKi8KKworLyoKKyAqCUNvbnRyb2wgcG9ydC4gTm90IHlldCBmdWxseSB1bmRlcnN0b29kCisgKglUaGUgdmFsdWUgMHhDMDkwIGdldHMgbG9hZGVkIHRvIGl0IHRoZW4gMHgwMDAwIGFuZCAweDI4MDAKKyAqCXRvIHRoZSBkYXRhIHBvcnQuIFRoZW4gYWZ0ZXIgNHVTIHRoZSB2YWx1ZSAweDMwMCBpcyB3cml0dGVuCisgKi8KKyAKKyNkZWZpbmUgUklOR19CVVNfQ1RSTF9MCQkweDM0CisjZGVmaW5lIFJJTkdfQlVTX0NUUkxfSAkJMHgzNgorCisvKgorICoJVGhpcyBpcyBhbHNvIHVzZWQgZHVyaW5nIHNldHVwLiBUaGUgdmFsdWUgMHgxNyBpcyB3cml0dGVuIHRvIGl0CisgKi8KKyAKKyNkZWZpbmUgRVNTX1NFVFVQXzE4CQkweDE4CisKKy8qCisgKglBbmQgdGhpcyBvbmUgZ2V0cyAweDAwMGIKKyAqLworIAorI2RlZmluZSBFU1NfU0VUVVBfQTIJCTB4QTIKKworLyoKKyAqCUFuZCB0aGlzIDB4MDAwMAorICovCisgCisjZGVmaW5lIEVTU19TRVRVUF9BNAkJMHhBNAorI2RlZmluZSBFU1NfU0VUVVBfQTYJCTB4QTYKKworLyoKKyAqCVN0dWZmIHRvIGRvIHdpdGggSGFycG8gLSB0aGUgd2F2ZSBzdHVmZgorICovCisgCisjZGVmaW5lIEVTU19XQVZFVEFCTEVfU0laRQkweDE0CisjZGVmaW5lIAlFU1NfV0FWRVRBQkxFXzJNCTB4QTE4MAorCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbWFlc3RybzMuYyBiL3NvdW5kL29zcy9tYWVzdHJvMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZGVjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbWFlc3RybzMuYwpAQCAtMCwwICsxLDI5NzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgRVNTIE1hZXN0cm8zL0FsbGVncm8gZHJpdmVyIGZvciBMaW51eCAyLjQueAorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgICAoYykgQ29weXJpZ2h0IDIwMDAgWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4KKyAqCisgKiBJIG5lZWQgdG8gdGhhbmsgbWFueSBwZW9wbGUgZm9yIGhlbHBpbmcgbWFrZSB0aGlzIGRyaXZlciBoYXBwZW4uICAKKyAqIEFzIGFsd2F5cywgRXJpYyBCcm9tYmF1Z2ggd2FzIGEgaGFja2luZyBtYWNoaW5lIGFuZCBraWxsZWQgbWFueSBidWdzCisgKiB0aGF0IEkgd2FzIHRvbyBkdW1iIHRvIG5vdGljZS4gIEhvd2FyZCBLaW0gYXQgRVNTIHByb3ZpZGVkIHJlZmVyZW5jZSBib2FyZHMgCisgKiBhbmQgYXMgbXVjaCBkb2NzIGFzIGhlIGNvdWxkLiAgVG9kZCBhbmQgTWljayBhdCBEZWxsIHRlc3RlZCBzbmFwc2hvdHMgb24gCisgKiBhbiBhcm15IG9mIGxhcHRvcHMuICBtc3cgYW5kIGRldmlhbnQgYXQgUmVkIEhhdCBhbHNvIGh1bW91cmVkIG1lIGJ5IGhhbmdpbmcKKyAqIHRoZWlyIGxhcHRvcHMgZXZlcnkgZmV3IGhvdXJzIGluIHRoZSBuYW1lIG9mIHNjaWVuY2UuCisgKiAKKyAqIFNob3V0cyBnbyBvdXQgdG8gTWlrZSAiREogWFBDb20iIEFuZy4KKyAqCisgKiBIaXN0b3J5CisgKiAgdjEuMjMgLSBKdW4gNSAyMDAyIC0gTWljaGFlbCBPbHNvbiA8b2xzb25AY3Mub2R1LmVkdT4KKyAqICAgYWRkZWQgYSBtb2R1bGUgb3B0aW9uIHRvIGFsbG93IHNlbGVjdGlvbiBvZiBHUElPIHBpbiBudW1iZXIgCisgKiAgIGZvciBleHRlcm5hbCBhbXAgCisgKiAgdjEuMjIgLSBGZWIgMjggMjAwMSAtIFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+CisgKiAgIGFsbG9jYXRlIG1lbSBhdCBpbnNtb2Qvc2V0dXAsIHJhdGhlciB0aGFuIG9wZW4KKyAqICAgbGltaXQgcGNpIGRtYSBhZGRyZXNzZXMgdG8gMjhiaXQsIHRoYW5rcyBndXlzLgorICogIHYxLjIxIC0gRmViIDA0IDIwMDEgLSBaYWNoIEJyb3duIDx6YWJAemFiYm8ubmV0PgorICogICBmaXggdXAgcmVhbGx5IGR1bWIgbm90aWZpZXIgLT4gc3VzcGVuZCBvb3BzCisgKiAgdjEuMjAgLSBKYW4gMzAgMjAwMSAtIFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+CisgKiAgIGdldCByaWQgb2YgcG0gY2FsbGJhY2sgYW5kIHVzZSBwY2lfZGV2IHN1c3BlbmQvcmVzdW1lIGluc3RlYWQKKyAqICAgbTNfcHJvYmUgY2xlYW51cHMsIGluY2x1ZGluZyBwbSBvb3BzIHRoaW5rLW8KKyAqICB2MS4xMCAtIEphbiA2IDIwMDEgLSBaYWNoIEJyb3duIDx6YWJAemFiYm8ubmV0PgorICogICByZXZlcnQgdG8gbGFtZSByZW1hcF9wYWdlX3JhbmdlIG1tYXAoKSBqdXN0IHRvIG1ha2UgaXQgd29yaworICogICByZWNvcmQgbW1hcCBmaXhlZC4KKyAqICAgZml4IHVwIGluY3JlZGlibHkgYnJva2VuIG9wZW4vcmVsZWFzZSByZXNvdXJjZSBtYW5hZ2VtZW50CisgKiAgIGR1aC4gIGZpeCByZWNvcmQgZm9ybWF0IHNldHRpbmcuCisgKiAgIGFkZCBTTVAgbG9ja2luZyBhbmQgY2xlYW51cCBmb3JtYXR0aW5nIGhlcmUgYW5kIHRoZXJlCisgKiAgdjEuMDAgLSBEZWMgMTYgMjAwMCAtIFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+CisgKiAgIHBvcnQgdG8gc2V4eSAyLjQgaW50ZXJmYWNlcworICogICBwcm9wZXJseSBhbGlnbiBpbnN0YW5jZSBhbGxvY2F0aW9ucyBzbyByZWNvcmRpbmcgd29ya3MKKyAqICAgY2xlYW4gdXAgZnVuY3Rpb24gbmFtZXNwYWNlIGEgbGl0dGxlIDovCisgKiAgIHVwZGF0ZSBQQ0kgSURzIGJhc2VkIG9uIG1haWwgZnJvbSBFU1MKKyAqICAgYXJiaXRyYXJpbHkgYnVtcCB2ZXJzaW9uIG51bWJlciB0byBzaG93IGl0cyAyLjQgbm93LCAKKyAqICAgICAgMi4yIHdpbGwgc3RheSAwLiwgb3NzX2F1ZGlvIHBvcnQgZ2V0cyAyLgorICogIHYwLjAzIC0gTm92IDA1IDIwMDAgLSBaYWNoIEJyb3duIDx6YWJAemFiYm8ubmV0PgorICogICBkaXNhYmxlIHJlY29yZGluZyBidXQgYWxsb3cgZHNwIHRvIGJlIG9wZW5lZCByZWFkIAorICogICBwdWxsIG91dCBtb3N0IHNpbGx5IGNvbXBhdCBkZWZpbmVzCisgKiAgdjAuMDIgLSBOb3YgMDQgMjAwMCAtIFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+CisgKiAgIGNoYW5nZWQgY2xvY2tpbmcgc2V0dXAgZm9yIG0zLCBzbG93ZG93biBmaXhlZC4KKyAqICAgY29kZWMgcmVzZXQgaXMgaG9wZWZ1bGx5IHJlbGlhYmxlIG5vdworICogICBydWRpbWVudGFyeSBhcG0vcG93ZXIgbWFuYWdlbWVudCBtYWtlcyBzdXNwZW5kL3Jlc3VtZSB3b3JrCisgKiAgdjAuMDEgLSBPY3QgMzEgMjAwMCAtIFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+CisgKiAgIGZpcnN0IHJlbGVhc2UKKyAqICB2MC4wMCAtIFNlcCAwOSAyMDAwIC0gWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4KKyAqICAgZmlyc3QgcGFzcyBkZXJpdmF0aW9uIGZyb20gbWFlc3Ryby5jCisgKgorICogVE9ETworICogIGluL291dCBhbGxvY2F0ZWQgY29udGlndW91c2x5IHNvIGZ1bGxkdXBsZXggbW1hcCB3aWxsIHdvcms/CisgKiAgbm8gYmVlcCBvbiBpbml0IChtdXRlKQorICogIHJlc2V0dXAgbXNyYyBkYXRhIG1lbW9yeSBpZiBmcmVxIGNoYW5nZXM/CisgKgorICogIC0tCisgKgorICogIEFsbG93IG1lIHRvIHJhbWJsZSBhIGJpdCBhYm91dCB0aGUgbTMgYXJjaGl0ZWN0dXJlLiAgVGhlIGNvcmUgb2YgdGhlCisgKiAgY2hpcCBpcyB0aGUgJ2Fzc3AnLCB0aGUgY3VzdG9tIEVTUyBkc3AgdGhhdCBydW5zIHRoZSBzaG93LiAgSXQgaGFzCisgKiAgYSBzbWFsbCBhbW91bnQgb2YgY29kZSBhbmQgZGF0YSByYW0uICBFU1MgZHJvcHMgYmluYXJ5IGRzcCBjb2RlIGltYWdlcworICogIG9uIG91ciBoZWFkcywgYnV0IHdlIGRvbid0IGdldCB0byBzZWUgc3BlY3Mgb24gdGhlIGRzcC4gIAorICoKKyAqICBUaGUgY29uc3RhbnQgcGllY2Ugb2YgY29kZSBvbiB0aGUgZHNwIGlzIHRoZSAna2VybmVsJy4gIEl0IGFsc28gaGFzIGEgCisgKiAgY2h1bmsgb2YgdGhlIGRzcCBtZW1vcnkgdGhhdCBpcyBzdGF0aWNhbGx5IHNldCBhc2lkZSBmb3IgaXRzIGNvbnRyb2wKKyAqICBpbmZvLiAgVGhpcyBpcyB0aGUgS0RBVEEgZGVmaW5lcyBpbiBtYWVzdHJvMy5oLiAgUGFydCBvZiBpdHMgY29yZQorICogIGRhdGEgaXMgYSBsaXN0IG9mIGNvZGUgYWRkcmVzc2VzIHRoYXQgcG9pbnQgdG8gdGhlIHBpZWNlcyBvZiBEU1AgY29kZQorICogIHRoYXQgaXQgc2hvdWxkIHdhbGsgdGhyb3VnaCBpbiBpdHMgbG9vcC4gIFRoZXNlIG90aGVyIHBpZWNlcyBvZiBjb2RlCisgKiAgZG8gdGhlIHJlYWwgd29yay4gIFRoZSBrZXJuZWwgcHJlc3VtYWJseSBqdW1wcyBpbnRvIGVhY2ggb2YgdGhlbSBpbiB0dXJuLgorICogIFRoZXNlIGNvZGUgaW1hZ2VzIHRlbmQgdG8gaGF2ZSB0aGVpciBvd24gZGF0YSBhcmVhLCBhbmQgb25lIGNhbiBoYXZlCisgKiAgbXVsdGlwbGUgZGF0YSBhcmVhcyByZXByZXNlbnRpbmcgZGlmZmVyZW50IHN0YXRlcyBmb3IgZWFjaCBvZiB0aGUgJ2NsaWVudAorICogIGluc3RhbmNlJyBjb2RlIHBvcnRpb25zLiAgVGhlcmUgaXMgZ2VuZXJhbGx5IGEgbGlzdCBpbiB0aGUga2VybmVsIGRhdGEKKyAqICB0aGF0IHBvaW50cyB0byB0aGUgZGF0YSBpbnN0YW5jZXMgZm9yIGEgZ2l2ZW4gcGllY2Ugb2YgY29kZS4KKyAqCisgKiAgV2UndmUgb25seSBiZWVuIGdpdmVuIHRoZSBiaW5hcnkgaW1hZ2UgZm9yIHRoZSAnbWluaXNyYycsIG1pbmkgc2FtcGxlIAorICogIHJhdGUgY29udmVydGVyLiAgVGhpcyBpcyByYXRoZXIgYW5ub3lpbmcgYmVjYXVzZSBpdCBsaW1pdHMgdGhlIHdvcmsKKyAqICB3ZSBjYW4gZG8gb24gdGhlIGRzcCwgYnV0IGl0IGFsc28gZ3JlYXRseSBzaW1wbGlmaWVzIHRoZSBqb2Igb2YgbWFuYWdpbmcKKyAqICBkc3AgZGF0YSBtZW1vcnkgZm9yIHRoZSBjb2RlIGFuZCBkYXRhIGZvciBvdXIgcGxheWluZyBzdHJlYW1zIDopLiAgV2UKKyAqICBzdGF0aWNhbGx5IGFsbG9jYXRlIHRoZSBtaW5pc3JjIGNvZGUgaW50byBhIHJlZ2lvbiB3ZSAna25vdycgdG8gYmUgZnJlZQorICogIGJhc2VkIG9uIHRoZSBtYXAgb2YgdGhlIGJpbmFyeSBrZXJuZWwgaW1hZ2Ugd2UncmUgbG9hZGluZy4gIFdlIGFsc28gCisgKiAgc3RhdGljYWxseSBhbGxvY2F0ZSB0aGUgZGF0YSBhcmVhcyBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBjbSBzdHJlYW1zCisgKiAgd2UgY2FuIGJlIGRlYWxpbmcgd2l0aC4gIFRoaXMgbWF4IGlzIHNldCBieSB0aGUgbGVuZ3RoIG9mIHRoZSBzdGF0aWMgbGlzdAorICogIGluIHRoZSBrZXJuZWwgZGF0YSB0aGF0IHJlY29yZHMgdGhlIG51bWJlciBvZiBtaW5pc3JjIGRhdGEgcmVnaW9ucyB3ZQorICogIGNhbiBoYXZlLiAgVGhhdHMgcmlnaHQsIGFsbCBzb2Z0d2FyZSBkc3AgbWl4aW5nIHdpdGggc3RhdGljIGNvZGUgbGlzdAorICogIGxpbWl0cy4gIFJvY2suCisgKgorICogIEhvdyBzb3VuZCBnb2VzIGluIGFuZCBvdXQgaXMgc3RpbGwgYSByZWxhdGl2ZSBteXN0ZXJ5LiAgSXQgYXBwZWFycworICogIHRoYXQgdGhlIGRzcCBoYXMgdGhlIGFiaWxpdHkgdG8gZ2V0IGlucHV0IGFuZCBvdXRwdXQgdGhyb3VnaCB2YXJpb3VzCisgKiAgJ2Nvbm5lY3Rpb25zJy4gIFRvIGRvIElPIGZyb20gb3IgdG8gYSBjb25uZWN0aW9uLCB5b3UgcHV0IHRoZSBhZGRyZXNzCisgKiAgb2YgdGhlIG1pbmlzcmMgY2xpZW50IGFyZWEgaW4gdGhlIHN0YXRpYyBrZXJuZWwgZGF0YSBsaXN0cyBmb3IgdGhhdCAKKyAqICBpbnB1dCBvciBvdXRwdXQuICBzbyBmb3IgcGNtIC0+IGRzcCAtPiBtaXhlciwgd2UgcHV0IHRoZSBtaW5pc3JjIGRhdGEKKyAqICBpbnN0YW5jZSBpbiB0aGUgRE1BIGxpc3QgYW5kIGFsc28gaW4gdGhlIGxpc3QgZm9yIHRoZSBtaXhlci4gIEkgZ3Vlc3MKKyAqICBpdCBKdXN0IEtub3dzIHdoaWNoIGlzIGluL291dCwgYW5kIHdlIGdpdmUgc29tZSBkbWEgY29udHJvbCBpbmZvIHRoYXQKKyAqICBoZWxwcy4gIFRoZXJlIGFyZSBhbGwgc29ydHMgb2YgY29vbCBpbnB1dHMvb3V0cHV0cyB0aGF0IGl0IHNlZW1zIHdlIGNhbid0CisgKiAgdXNlIHdpdGhvdXQgZHNwIGNvZGUgaW1hZ2VzIHRoYXQga25vdyBob3cgdG8gdXNlIHRoZW0uCisgKgorICogIFNvIGF0IGluaXQgdGltZSB3ZSBwcmVsb2FkIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gc3R1ZmYgYW5kIHNldCBzb21lCisgKiAgc3lzdGVtIHdpZGUgcGFyYW1ldGVycy4gIFdoZW4gd2UgcmVhbGx5IGdldCBhIHNvdW5kIHRvIHBsYXkgd2UgYnVpbGQKKyAqICB1cCBpdHMgbWluaXNyYyBoZWFkZXIgKHN0cmVhbSBwYXJhbWV0ZXJzLCBidWZmZXIgYWRkcmVzc2VzLCBpbnB1dC9vdXRwdXQKKyAqICBzZXR0aW5ncykuICBUaGVuIHdlIHRocm93IGl0cyBoZWFkZXIgb24gdGhlIHZhcmlvdXMgbGlzdHMuICBXZSBhbHNvCisgKiAgdGlja2xlIHNvbWUgS0RBVEEgc2V0dGluZ3MgdGhhdCBhc2sgdGhlIGFzc3AgdG8gcmFpc2UgY2xvY2sgaW50ZXJydXB0cworICogIGFuZCBkbyBzb21lIGFtb3VudCBvZiBzb2Z0d2FyZSBtaXhpbmcgYmVmb3JlIGhhbmRpbmcgZGF0YSB0byB0aGUgYWM5Ny4KKyAqCisgKiAgU29ycnkgZm9yIHRoZSB2YWd1ZSBkZXRhaWxzLiAgRmVlbCBmcmVlIHRvIGFzayBFcmljIG9yIG15c2VsZiBpZiB5b3UKKyAqICBoYXBwZW4gdG8gYmUgdHJ5aW5nIHRvIHVzZSB0aGlzIGRyaXZlciBlbHNld2hlcmUuICBQbGVhc2UgYWNjZXB0IG15CisgKiAgYXBvbG9naWVzIGZvciB0aGUgcXVhbGl0eSBvZiB0aGUgT1NTIHN1cHBvcnQgY29kZSwgaXRzIHBhc3NlZCB0aHJvdWdoCisgKiAgdG9vIG1hbnkgaGFuZHMgbm93IGFuZCBkZXNwZXJhdGVseSB3YW50cyB0byBiZSByZXRob3VnaHQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJtYWVzdHJvMy5oIgorCisjZGVmaW5lIE1fREVCVUcgMQorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICAgICAgIjEuMjMiCisjZGVmaW5lIE0zX01PRFVMRV9OQU1FICAgICAgIm1hZXN0cm8zIgorI2RlZmluZSBQRlggICAgICAgICAgICAgICAgIE0zX01PRFVMRV9OQU1FICI6ICIKKworI2RlZmluZSBNM19TVEFURV9NQUdJQyAgICAgIDB4NzM0ZDcyNGQKKyNkZWZpbmUgTTNfQ0FSRF9NQUdJQyAgICAgICAweDY0NmU2ZjUwCisKKyNkZWZpbmUgRVNTX0ZNVF9TVEVSRU8gICAgICAweDAxCisjZGVmaW5lIEVTU19GTVRfMTZCSVQgICAgICAgMHgwMgorI2RlZmluZSBFU1NfRk1UX01BU0sgICAgICAgIDB4MDMKKyNkZWZpbmUgRVNTX0RBQ19TSElGVCAgICAgICAwICAgCisjZGVmaW5lIEVTU19BRENfU0hJRlQgICAgICAgNAorCisjZGVmaW5lIERBQ19SVU5OSU5HICAgICAgICAgMQorI2RlZmluZSBBRENfUlVOTklORyAgICAgICAgIDIKKworI2RlZmluZSBTTkRfREVWX0RTUDE2ICAgICAgIDUgCisgICAKKyNpZmRlZiBNX0RFQlVHCitzdGF0aWMgaW50IGRlYnVnOworI2RlZmluZSBEUE1PRCAgIDEgICAvKiBwZXIgbW9kdWxlIGxvYWQgKi8KKyNkZWZpbmUgRFBTVFIgICAyICAgLyogcGVyICdzdHJlYW0nICovCisjZGVmaW5lIERQU1lTICAgMyAgIC8qIHBlciBzeXNjYWxsICovCisjZGVmaW5lIERQQ1JBUCAgNCAgIC8qIHN0dWZmIHRoZSB1c2VyIHNob3VsZG4ndCBzZWUgdW5sZXNzIHRoZXkncmUgcmVhbGx5IGRlYnVnZ2luICovCisjZGVmaW5lIERQSU5UICAgNSAgIC8qIHBlciBpbnRlcnJ1cHQsIExPVFMgKi8KKyNkZWZpbmUgRFBSSU5USyhEUCwgYXJncy4uLikge2lmIChkZWJ1ZyA+PSAoRFApKSBwcmludGsoS0VSTl9ERUJVRyBQRlggYXJncyk7fQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyh4KQorI2VuZGlmCisKK3N0cnVjdCBtM19saXN0IHsKKyAgICBpbnQgY3VybGVuOworICAgIHUxNiBtZW1fYWRkcjsKKyAgICBpbnQgbWF4OworfTsKKworc3RhdGljIGludCBleHRlcm5hbF9hbXAgPSAxOworc3RhdGljIGludCBncGlvX3BpbiA9IC0xOworCitzdHJ1Y3QgbTNfc3RhdGUgeworICAgIHVuc2lnbmVkIGludCBtYWdpYzsKKyAgICBzdHJ1Y3QgbTNfY2FyZCAqY2FyZDsKKyAgICB1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlOworCisgICAgaW50IGluZGV4OworCisgICAgLyogdGhpcyBsb2NrcyBhcm91bmQgdGhlIG9zcyBzdGF0ZSBpbiB0aGUgZHJpdmVyICovCisJLyogbm8sIHRoaXMgbG9jayBpcyByZW1vdmVkIC0gb25seSB1c2UgY2FyZC0+bG9jayAqLworCS8qIG90aGVyd2lzZTogYWdhaW5zdCB3aGF0IGFyZSB5b3UgcHJvdGVjdGluZyBvbiBTTVAgCisJCXdoZW4gaXJxaGFuZGxlciB1c2VzIHMtPmxvY2sKKwkJYW5kIG0zX2Fzc3BfcmVhZCB1c2VzIGNhcmQtPmxvY2sgPworCQkqLworICAgIHN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW07CisgICAgd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworICAgIG1vZGVfdCBvcGVuX21vZGU7CisKKyAgICBpbnQgZGV2X2F1ZGlvOworCisgICAgc3RydWN0IGFzc3BfaW5zdGFuY2UgeworICAgICAgICB1MTYgY29kZSwgZGF0YTsKKyAgICB9IGRhY19pbnN0LCBhZGNfaW5zdDsKKworICAgIC8qIHNob3VsZCBiZSBpbiBkbWFidWYgKi8KKyAgICB1bnNpZ25lZCBpbnQgcmF0ZWFkYywgcmF0ZWRhYzsKKworICAgIHN0cnVjdCBkbWFidWYgeworICAgICAgICB2b2lkICpyYXdidWY7CisgICAgICAgIHVuc2lnbmVkIGJ1Zm9yZGVyOworICAgICAgICB1bnNpZ25lZCBudW1mcmFnOworICAgICAgICB1bnNpZ25lZCBmcmFnc2hpZnQ7CisgICAgICAgIHVuc2lnbmVkIGh3cHRyLCBzd3B0cjsKKyAgICAgICAgdW5zaWduZWQgdG90YWxfYnl0ZXM7CisgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgdW5zaWduZWQgZXJyb3I7IC8qIG92ZXIvdW5kZXJydW4gKi8KKyAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKyAgICAgICAgLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworICAgICAgICB1bnNpZ25lZCBmcmFnc2l6ZTsKKyAgICAgICAgdW5zaWduZWQgZG1hc2l6ZTsKKyAgICAgICAgdW5zaWduZWQgZnJhZ3NhbXBsZXM7CisgICAgICAgIC8qIE9TUyBzdHVmZiAqLworICAgICAgICB1bnNpZ25lZCBtYXBwZWQ6MTsKKyAgICAgICAgdW5zaWduZWQgcmVhZHk6MTsgICAgCisgICAgICAgIHVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKKyAgICAgICAgdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OworICAgICAgICBpbnQgb3NzbWF4ZnJhZ3M7CisgICAgICAgIHVuc2lnbmVkIHN1YmRpdmlzaW9uOworICAgICAgICAvKiBuZXcgaW4gbTMgKi8KKyAgICAgICAgaW50IG1peGVyX2luZGV4LCBkbWFfaW5kZXgsIG1zcmNfaW5kZXgsIGFkYzFfaW5kZXg7CisgICAgICAgIGludCBpbl9saXN0czsKKyAgICAgICAgLyogMi40Li4gKi8KKyAgICAgICAgZG1hX2FkZHJfdCBoYW5kbGU7CisKKyAgICB9IGRtYV9kYWMsIGRtYV9hZGM7Cit9OworICAgIAorc3RydWN0IG0zX2NhcmQgeworICAgIHVuc2lnbmVkIGludCBtYWdpYzsKKworICAgIHN0cnVjdCBtM19jYXJkICpuZXh0OworCisgICAgc3RydWN0IGFjOTdfY29kZWMgKmFjOTc7CisgICAgc3BpbmxvY2tfdCBhYzk3X2xvY2s7CisKKyAgICBpbnQgY2FyZF90eXBlOworCisjZGVmaW5lIE5SX0RTUFMgMQorI2RlZmluZSBNQVhfRFNQUyBOUl9EU1BTCisgICAgc3RydWN0IG0zX3N0YXRlIGNoYW5uZWxzW01BWF9EU1BTXTsKKworICAgIC8qIHRoaXMgbG9ja3MgYXJvdW5kIHRoZSBwaHlzaWNhbCByZWdpc3RlcnMgb24gdGhlIGNhcmQgKi8KKyAgICBzcGlubG9ja190IGxvY2s7CisKKyAgICAvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKyAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworICAgIHUzMiBpb2Jhc2U7CisgICAgdTMyIGlycTsKKworICAgIGludCBkYWNzX2FjdGl2ZTsKKworICAgIGludCB0aW1lcl91c2VyczsKKworICAgIHN0cnVjdCBtM19saXN0ICBtc3JjX2xpc3QsCisgICAgICAgICAgICAgICAgICAgIG1peGVyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgIGFkYzFfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgZG1hX2xpc3Q7CisKKyAgICAvKiBmb3Igc3RvcmluZyByZXNldCBzdGF0ZS4uKi8KKyAgICB1OCByZXNldF9zdGF0ZTsKKworICAgIHUxNiAqc3VzcGVuZF9tZW07CisgICAgaW50IGluX3N1c3BlbmQ7CisgICAgd2FpdF9xdWV1ZV9oZWFkX3Qgc3VzcGVuZF9xdWV1ZTsKK307CisKKy8qCisgKiBhbiBhcmJpdHJhcnkgdm9sdW1lIHdlIHNldCB0aGUgaW50ZXJuYWwKKyAqIHZvbHVtZSBzZXR0aW5ncyB0byBzbyB0aGF0IHRoZSBhYzk3IHZvbHVtZQorICogcmFuZ2UgaXMgYSBsaXR0bGUgbGVzcyBpbnNhbmUuICAweDdmZmYgaXMgCisgKiBtYXguCisgKi8KKyNkZWZpbmUgQVJCX1ZPTFVNRSAoIDB4NjgwMCApCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2hpZnRbXSA9IHsgMCwgMSwgMSwgMiB9OworCitlbnVtIHsKKyAgICBFU1NfQUxMRUdSTywKKyAgICBFU1NfTUFFU1RSTzMsCisgICAgLyoKKyAgICAgKiBhIG1hZXN0cm8zIHdpdGggJ2hhcmR3YXJlIHN0cmFwcGluZycsIG9ubHkKKyAgICAgKiBmb3VuZCBpbnNpZGUgRVNTPworICAgICAqLworICAgIEVTU19NQUVTVFJPM0hXLAorfTsKKworc3RhdGljIGNoYXIgKmNhcmRfbmFtZXNbXSA9IHsKKyAgICBbRVNTX0FMTEVHUk9dID0gIkFsbGVncm8iLAorICAgIFtFU1NfTUFFU1RSTzNdID0gIk1hZXN0cm8zKGkpIiwKKyAgICBbRVNTX01BRVNUUk8zSFddID0gIk1hZXN0cm8zKGkpaHciCit9OworCisjaWZuZGVmIFBDSV9WRU5ET1JfRVNTCisjZGVmaW5lIFBDSV9WRU5ET1JfRVNTICAgICAgMHgxMjVECisjZW5kaWYKKworI2RlZmluZSBNM19ERVZJQ0UoREVWLCBUWVBFKQkJCVwKK3sJCQkJCQlcCisudmVuZG9yCSAgICAgPSBQQ0lfVkVORE9SX0VTUywJCQlcCisuZGV2aWNlCSAgICAgPSBERVYsCQkJCVwKKy5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCQkJXAorLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwJCQlcCisuY2xhc3MJICAgICA9IFBDSV9DTEFTU19NVUxUSU1FRElBX0FVRElPIDw8IDgsCVwKKy5jbGFzc19tYXNrICA9IDB4ZmZmZiA8PCA4LAkJCVwKKy5kcml2ZXJfZGF0YSA9IFRZUEUsCQkJCVwKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG0zX2lkX3RhYmxlW10gPSB7CisgICAgTTNfREVWSUNFKDB4MTk4OCwgRVNTX0FMTEVHUk8pLAorICAgIE0zX0RFVklDRSgweDE5OTgsIEVTU19NQUVTVFJPMyksCisgICAgTTNfREVWSUNFKDB4MTk5YSwgRVNTX01BRVNUUk8zSFcpLAorICAgIHswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgbTNfaWRfdGFibGUpOworCisvKgorICogcmVwb3J0cyBzZWVtIHRvIGluZGljYXRlIHRoYXQgdGhlIG0zIGlzIGxpbWl0ZWQKKyAqIHRvIDI4Yml0IGJ1cyBhZGRyZXNzZXMuICBhYWFhcmdnZ2guLi4KKyAqLworI2RlZmluZSBNM19QQ0lfRE1BX01BU0sgMHgwZmZmZmZmZgorCitzdGF0aWMgdW5zaWduZWQgCitsZDIodW5zaWduZWQgaW50IHgpCit7CisgICAgdW5zaWduZWQgciA9IDA7CisgICAgCisgICAgaWYgKHggPj0gMHgxMDAwMCkgeworICAgICAgICB4ID4+PSAxNjsKKyAgICAgICAgciArPSAxNjsKKyAgICB9CisgICAgaWYgKHggPj0gMHgxMDApIHsKKyAgICAgICAgeCA+Pj0gODsKKyAgICAgICAgciArPSA4OworICAgIH0KKyAgICBpZiAoeCA+PSAweDEwKSB7CisgICAgICAgIHggPj49IDQ7CisgICAgICAgIHIgKz0gNDsKKyAgICB9CisgICAgaWYgKHggPj0gNCkgeworICAgICAgICB4ID4+PSAyOworICAgICAgICByICs9IDI7CisgICAgfQorICAgIGlmICh4ID49IDIpCisgICAgICAgIHIrKzsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCBtM19jYXJkICpkZXZzOworCisvKgorICogSSdtIG5vdCB2ZXJ5IGdvb2QgYXQgbGF5aW5nIG91dCBmdW5jdGlvbnMgaW4gYSBmaWxlIDopCisgKi8KK3N0YXRpYyBpbnQgbTNfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqYnVmKTsKK3N0YXRpYyBpbnQgbTNfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyB2b2lkIGNoZWNrX3N1c3BlbmQoc3RydWN0IG0zX2NhcmQgKmNhcmQpOworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG0zX3JlYm9vdF9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IG0zX25vdGlmaWVyLAorfTsKKworc3RhdGljIHZvaWQgbTNfb3V0dyhzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwKKyAgICAgICAgdTE2IHZhbHVlLCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKyAgICBjaGVja19zdXNwZW5kKGNhcmQpOworICAgIG91dHcodmFsdWUsIGNhcmQtPmlvYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB1MTYgbTNfaW53KHN0cnVjdCBtM19jYXJkICpjYXJkLCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKyAgICBjaGVja19zdXNwZW5kKGNhcmQpOworICAgIHJldHVybiBpbncoY2FyZC0+aW9iYXNlICsgcmVnKTsKK30KK3N0YXRpYyB2b2lkIG0zX291dGIoc3RydWN0IG0zX2NhcmQgKmNhcmQsIAorICAgICAgICB1OCB2YWx1ZSwgdW5zaWduZWQgbG9uZyByZWcpCit7CisgICAgY2hlY2tfc3VzcGVuZChjYXJkKTsKKyAgICBvdXRiKHZhbHVlLCBjYXJkLT5pb2Jhc2UgKyByZWcpOworfQorc3RhdGljIHU4IG0zX2luYihzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwgdW5zaWduZWQgbG9uZyByZWcpCit7CisgICAgY2hlY2tfc3VzcGVuZChjYXJkKTsKKyAgICByZXR1cm4gaW5iKGNhcmQtPmlvYmFzZSArIHJlZyk7Cit9CisKKy8qCisgKiBhY2Nlc3MgMTZiaXQgd29yZHMgdG8gdGhlIGNvZGUgb3IgZGF0YSByZWdpb25zIG9mIHRoZSBkc3AncyBtZW1vcnkuCisgKiBpbmRleCBhZGRyZXNzZXMgMTZiaXQgd29yZHMuCisgKi8KK3N0YXRpYyB1MTYgX19tM19hc3NwX3JlYWQoc3RydWN0IG0zX2NhcmQgKmNhcmQsIHUxNiByZWdpb24sIHUxNiBpbmRleCkKK3sKKyAgICBtM19vdXR3KGNhcmQsIHJlZ2lvbiAmIE1FTVRZUEVfTUFTSywgRFNQX1BPUlRfTUVNT1JZX1RZUEUpOworICAgIG0zX291dHcoY2FyZCwgaW5kZXgsIERTUF9QT1JUX01FTU9SWV9JTkRFWCk7CisgICAgcmV0dXJuIG0zX2ludyhjYXJkLCBEU1BfUE9SVF9NRU1PUllfREFUQSk7Cit9CitzdGF0aWMgdTE2IG0zX2Fzc3BfcmVhZChzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwgdTE2IHJlZ2lvbiwgdTE2IGluZGV4KQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgdTE2IHJldDsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCYoY2FyZC0+bG9jayksIGZsYWdzKTsKKyAgICByZXQgPSBfX20zX2Fzc3BfcmVhZChjYXJkLCByZWdpb24sIGluZGV4KTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoY2FyZC0+bG9jayksIGZsYWdzKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fbTNfYXNzcF93cml0ZShzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwgCisgICAgICAgIHUxNiByZWdpb24sIHUxNiBpbmRleCwgdTE2IGRhdGEpCit7CisgICAgbTNfb3V0dyhjYXJkLCByZWdpb24gJiBNRU1UWVBFX01BU0ssIERTUF9QT1JUX01FTU9SWV9UWVBFKTsKKyAgICBtM19vdXR3KGNhcmQsIGluZGV4LCBEU1BfUE9SVF9NRU1PUllfSU5ERVgpOworICAgIG0zX291dHcoY2FyZCwgZGF0YSwgRFNQX1BPUlRfTUVNT1JZX0RBVEEpOworfQorc3RhdGljIHZvaWQgbTNfYXNzcF93cml0ZShzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwgCisgICAgICAgIHUxNiByZWdpb24sIHUxNiBpbmRleCwgdTE2IGRhdGEpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCYoY2FyZC0+bG9jayksIGZsYWdzKTsKKyAgICBfX20zX2Fzc3Bfd3JpdGUoY2FyZCwgcmVnaW9uLCBpbmRleCwgZGF0YSk7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGNhcmQtPmxvY2spLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG0zX2Fzc3BfaGFsdChzdHJ1Y3QgbTNfY2FyZCAqY2FyZCkKK3sKKyAgICBjYXJkLT5yZXNldF9zdGF0ZSA9IG0zX2luYihjYXJkLCBEU1BfUE9SVF9DT05UUk9MX1JFR19CKSAmIH5SRUdCX1NUT1BfQ0xPQ0s7CisgICAgbWRlbGF5KDEwKTsKKyAgICBtM19vdXRiKGNhcmQsIGNhcmQtPnJlc2V0X3N0YXRlICYgflJFR0JfRU5BQkxFX1JFU0VULCBEU1BfUE9SVF9DT05UUk9MX1JFR19CKTsKK30KKworc3RhdGljIHZvaWQgbTNfYXNzcF9jb250aW51ZShzdHJ1Y3QgbTNfY2FyZCAqY2FyZCkKK3sKKyAgICBtM19vdXRiKGNhcmQsIGNhcmQtPnJlc2V0X3N0YXRlIHwgUkVHQl9FTkFCTEVfUkVTRVQsIERTUF9QT1JUX0NPTlRST0xfUkVHX0IpOworfQorCisvKgorICogVGhpcyBtYWtlcyBtZSBzYWQuIHRoZSBtYWVzdHJvMyBoYXMgbGlzdHMKKyAqIGludGVybmFsbHkgdGhhdCBtdXN0IGJlIHBhY2tlZC4uIDAgdGVybWluYXRlcywKKyAqIGFwcGFyZW50bHksIG9yIG1heWJlIGFsbCB1bnVzZWQgZW50cmllcyBoYXZlCisgKiB0byBiZSAwLCB0aGUgbGlzdHMgaGF2ZSBzdGF0aWMgbGVuZ3RocyBzZXQKKyAqIGJ5IHRoZSBiaW5hcnkgY29kZSBpbWFnZXMuCisgKi8KKworc3RhdGljIGludCBtM19hZGRfbGlzdChzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwKKyAgICAgICAgc3RydWN0IG0zX2xpc3QgKmxpc3QsIHUxNiB2YWwpCit7CisgICAgRFBSSU5USyhEUFNUUiwgImFkZGluZyB2YWwgMHgleCB0byBsaXN0IDB4JXAgYXQgcG9zICVkXG4iLAorICAgICAgICAgICAgdmFsLCBsaXN0LCBsaXN0LT5jdXJsZW4pOworCisgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBsaXN0LT5tZW1fYWRkciArIGxpc3QtPmN1cmxlbiwKKyAgICAgICAgICAgIHZhbCk7CisKKyAgICByZXR1cm4gbGlzdC0+Y3VybGVuKys7CisKK30KKworc3RhdGljIHZvaWQgbTNfcmVtb3ZlX2xpc3Qoc3RydWN0IG0zX2NhcmQgKmNhcmQsCisgICAgICAgIHN0cnVjdCBtM19saXN0ICpsaXN0LCBpbnQgaW5kZXgpCit7CisgICAgdTE2ICB2YWw7CisgICAgaW50IGxhc3RpbmRleCA9IGxpc3QtPmN1cmxlbiAtIDE7CisKKyAgICBEUFJJTlRLKERQU1RSLCAicmVtb3ZpbmcgaW5kICVkIGZyb20gbGlzdCAweCVwXG4iLAorICAgICAgICAgICAgaW5kZXgsIGxpc3QpOworCisgICAgaWYoaW5kZXggIT0gbGFzdGluZGV4KSB7CisgICAgICAgIHZhbCA9IG0zX2Fzc3BfcmVhZChjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICAgICAgbGlzdC0+bWVtX2FkZHIgKyBsYXN0aW5kZXgpOworICAgICAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgICAgICBsaXN0LT5tZW1fYWRkciArIGluZGV4LAorICAgICAgICAgICAgICAgIHZhbCk7CisgICAgfQorCisgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBsaXN0LT5tZW1fYWRkciArIGxhc3RpbmRleCwKKyAgICAgICAgICAgIDApOworCisgICAgbGlzdC0+Y3VybGVuLS07Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mbXQoc3RydWN0IG0zX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyIG1hc2ssIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKyAgICBpbnQgdG1wOworCisgICAgcy0+Zm10ID0gKHMtPmZtdCAmIG1hc2spIHwgZGF0YTsKKworICAgIHRtcCA9IChzLT5mbXQgPj4gRVNTX0RBQ19TSElGVCkgJiBFU1NfRk1UX01BU0s7CisKKyAgICAvKiB3cml0ZSB0byAnbW9ubycgd29yZCAqLworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIFNSQzNfRElSRUNUSU9OX09GRlNFVCArIDEsIAorICAgICAgICAgICAgKHRtcCAmIEVTU19GTVRfU1RFUkVPKSA/IDAgOiAxKTsKKyAgICAvKiB3cml0ZSB0byAnOGJpdCcgd29yZCAqLworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIFNSQzNfRElSRUNUSU9OX09GRlNFVCArIDIsIAorICAgICAgICAgICAgKHRtcCAmIEVTU19GTVRfMTZCSVQpID8gMCA6IDEpOworCisgICAgdG1wID0gKHMtPmZtdCA+PiBFU1NfQURDX1NISUZUKSAmIEVTU19GTVRfTUFTSzsKKworICAgIC8qIHdyaXRlIHRvICdtb25vJyB3b3JkICovCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgU1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMSwgCisgICAgICAgICAgICAodG1wICYgRVNTX0ZNVF9TVEVSRU8pID8gMCA6IDEpOworICAgIC8qIHdyaXRlIHRvICc4Yml0JyB3b3JkICovCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgU1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMiwgCisgICAgICAgICAgICAodG1wICYgRVNTX0ZNVF8xNkJJVCkgPyAwIDogMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kYWNfcmF0ZShzdHJ1Y3QgbTNfc3RhdGUgKnMsIHVuc2lnbmVkIGludCByYXRlKQoreworICAgIHUzMiBmcmVxOworCisgICAgaWYgKHJhdGUgPiA0ODAwMCkKKyAgICAgICAgcmF0ZSA9IDQ4MDAwOworICAgIGlmIChyYXRlIDwgODAwMCkKKyAgICAgICAgcmF0ZSA9IDgwMDA7CisKKyAgICBzLT5yYXRlZGFjID0gcmF0ZTsKKworICAgIGZyZXEgPSAoKHJhdGUgPDwgMTUpICsgMjQwMDAgKSAvIDQ4MDAwOworICAgIGlmKGZyZXEpIAorICAgICAgICBmcmVxLS07CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9GUkVRVUVOQ1ksCisgICAgICAgICAgICBmcmVxKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2FkY19yYXRlKHN0cnVjdCBtM19zdGF0ZSAqcywgdW5zaWduZWQgaW50IHJhdGUpCit7CisgICAgdTMyIGZyZXE7CisKKyAgICBpZiAocmF0ZSA+IDQ4MDAwKQorICAgICAgICByYXRlID0gNDgwMDA7CisgICAgaWYgKHJhdGUgPCA4MDAwKQorICAgICAgICByYXRlID0gODAwMDsKKworICAgIHMtPnJhdGVhZGMgPSByYXRlOworCisgICAgZnJlcSA9ICgocmF0ZSA8PCAxNSkgKyAyNDAwMCApIC8gNDgwMDA7CisgICAgaWYoZnJlcSkgCisgICAgICAgIGZyZXEtLTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX0ZSRVFVRU5DWSwKKyAgICAgICAgICAgIGZyZXEpOworfQorCitzdGF0aWMgdm9pZCBpbmNfdGltZXJfdXNlcnMoc3RydWN0IG0zX2NhcmQgKmNhcmQpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgCisgICAgY2FyZC0+dGltZXJfdXNlcnMrKzsKKyAgICBEUFJJTlRLKERQU1lTLCAiaW5jIHRpbWVyIHVzZXJzIG5vdyAlZFxuIiwKKyAgICAgICAgICAgIGNhcmQtPnRpbWVyX3VzZXJzKTsKKyAgICBpZihjYXJkLT50aW1lcl91c2VycyAhPSAxKSAKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICBfX20zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBLREFUQV9USU1FUl9DT1VOVF9SRUxPQUQsCisgICAgICAgICAyNDAgKSA7CisKKyAgICBfX20zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBLREFUQV9USU1FUl9DT1VOVF9DVVJSRU5ULAorICAgICAgICAgMjQwICkgOworCisgICAgbTNfb3V0dyhjYXJkLCAgCisgICAgICAgICAgICBtM19pbncoY2FyZCwgSE9TVF9JTlRfQ1RSTCkgfCBDTEtSVU5fR0VOX0VOQUJMRSwKKyAgICAgICAgICAgIEhPU1RfSU5UX0NUUkwpOworb3V0OgorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZGVjX3RpbWVyX3VzZXJzKHN0cnVjdCBtM19jYXJkICpjYXJkKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisgICAgY2FyZC0+dGltZXJfdXNlcnMtLTsKKyAgICBEUFJJTlRLKERQU1lTLCAiZGVjIHRpbWVyIHVzZXJzIG5vdyAlZFxuIiwKKyAgICAgICAgICAgIGNhcmQtPnRpbWVyX3VzZXJzKTsKKyAgICBpZihjYXJkLT50aW1lcl91c2VycyA+IDAgKSAKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICBfX20zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBLREFUQV9USU1FUl9DT1VOVF9SRUxPQUQsCisgICAgICAgICAwICkgOworCisgICAgX19tM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgS0RBVEFfVElNRVJfQ09VTlRfQ1VSUkVOVCwKKyAgICAgICAgIDAgKSA7CisKKyAgICBtM19vdXR3KGNhcmQsICBtM19pbncoY2FyZCwgSE9TVF9JTlRfQ1RSTCkgJiB+Q0xLUlVOX0dFTl9FTkFCTEUsCisgICAgICAgICAgICBIT1NUX0lOVF9DVFJMKTsKK291dDoKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiB7c3RhcnQsc3RvcH1fe2FkYyxkYWN9IHNob3VsZCBiZSBjYWxsZWQKKyAqIHdoaWxlIGhvbGRpbmcgdGhlICdzdGF0ZScgbG9jayBhbmQgdGhleQorICogd2lsbCB0cnkgdG8gZ3JhYiB0aGUgJ2NhcmQnIGxvY2suLgorICovCitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgbTNfc3RhdGUgKnMpCit7CisgICAgaWYgKCEgKHMtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSkgCisgICAgICAgIHJldHVybjsKKworICAgIHMtPmVuYWJsZSAmPSB+QURDX1JVTk5JTkc7CisgICAgZGVjX3RpbWVyX3VzZXJzKHMtPmNhcmQpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfSU5TVEFOQ0VfUkVBRFksIDApOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBLREFUQV9BREMxX1JFUVVFU1QsIDApOworfSAgICAKKworc3RhdGljIHZvaWQgc3RvcF9kYWMoc3RydWN0IG0zX3N0YXRlICpzKQoreworICAgIGlmICghIChzLT5lbmFibGUgJiBEQUNfUlVOTklORykpIAorICAgICAgICByZXR1cm47CisKKyAgICBEUFJJTlRLKERQU1lTLCAic3RvcF9kYWMoKVxuIik7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9JTlNUQU5DRV9SRUFEWSwgMCk7CisKKyAgICBzLT5lbmFibGUgJj0gfkRBQ19SVU5OSU5HOworICAgIHMtPmNhcmQtPmRhY3NfYWN0aXZlLS07CisgICAgZGVjX3RpbWVyX3VzZXJzKHMtPmNhcmQpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBLREFUQV9NSVhFUl9UQVNLX05VTUJFUiwgCisgICAgICAgICAgICBzLT5jYXJkLT5kYWNzX2FjdGl2ZSApIDsKK30gICAgCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2RhYyhzdHJ1Y3QgbTNfc3RhdGUgKnMpCit7CisgICAgaWYoICghcy0+ZG1hX2RhYy5tYXBwZWQgJiYgcy0+ZG1hX2RhYy5jb3VudCA8IDEpIHx8CisgICAgICAgICAgICAhcy0+ZG1hX2RhYy5yZWFkeSB8fAorICAgICAgICAgICAgKHMtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSkgCisgICAgICAgIHJldHVybjsKKworICAgIERQUklOVEsoRFBTWVMsICJzdGFydF9kYWMoKVxuIik7CisKKyAgICBzLT5lbmFibGUgfD0gREFDX1JVTk5JTkc7CisgICAgcy0+Y2FyZC0+ZGFjc19hY3RpdmUrKzsKKyAgICBpbmNfdGltZXJfdXNlcnMocy0+Y2FyZCk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9JTlNUQU5DRV9SRUFEWSwgMSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIEtEQVRBX01JWEVSX1RBU0tfTlVNQkVSLCAKKyAgICAgICAgICAgIHMtPmNhcmQtPmRhY3NfYWN0aXZlICkgOworfSAgICAKKworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBtM19zdGF0ZSAqcykKK3sKKyAgICBpZiAoKCEgcy0+ZG1hX2FkYy5tYXBwZWQgJiYKKyAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtIDIqcy0+ZG1hX2FkYy5mcmFnc2l6ZSkpIAorICAgICAgICB8fCAhcy0+ZG1hX2FkYy5yZWFkeSAKKyAgICAgICAgfHwgKHMtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSApIAorICAgICAgICAgICAgcmV0dXJuOworCisgICAgRFBSSU5USyhEUFNZUywgInN0YXJ0X2FkYygpXG4iKTsKKworICAgIHMtPmVuYWJsZSB8PSBBRENfUlVOTklORzsKKyAgICBpbmNfdGltZXJfdXNlcnMocy0+Y2FyZCk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIEtEQVRBX0FEQzFfUkVRVUVTVCwgMSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9JTlNUQU5DRV9SRUFEWSwgMSk7Cit9ICAgIAorCitzdGF0aWMgc3RydWN0IHBsYXlfdmFscyB7CisgICAgdTE2IGFkZHIsIHZhbDsKK30gcHZbXSA9IHsKKyAgICB7Q0RBVEFfTEVGVF9WT0xVTUUsIEFSQl9WT0xVTUV9LAorICAgIHtDREFUQV9SSUdIVF9WT0xVTUUsIEFSQl9WT0xVTUV9LAorICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQsIDB9ICwKKyAgICAvKiArMSwgKzIgYXJlIHN0ZXJlby8xNiBiaXQgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMywgMHgwMDAwfSwgLyogZnJhY3Rpb24/ICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDQsIDB9LCAvKiBmaXJzdCBsICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDUsIDB9LCAvKiBmaXJzdCByICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDYsIDB9LCAvKiBzZWNvbmQgbCAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyA3LCAwfSwgLyogc2Vjb25kIHIgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgOCwgMH0sIC8qIGRlbHRhIGwgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgOSwgMH0sIC8qIGRlbHRhIHIgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTAsIDB4ODAwMH0sIC8qIHJvdW5kICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDExLCAweEZGMDB9LCAvKiBoaWdoZXIgYnV0ZSBtYXJrICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDEzLCAwfSwgLyogdGVtcDAgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTQsIDB9LCAvKiBjIGZyYWN0aW9uICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE1LCAwfSwgLyogY291bnRlciAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxNiwgOH0sIC8qIG51bWluICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE3LCA1MCoyfSwgLyogbnVtb3V0ICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE4LCBNSU5JU1JDX0JJUVVBRF9TVEFHRSAtIDF9LCAvKiBudW1zdGFnZSAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyMCwgMH0sIC8qIGZpbHRlcnRhcCAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyMSwgMH0gLyogYm9vc3RlciAqLworfTsKKworCisvKiB0aGUgbW9kZSBwYXNzZWQgc2hvdWxkIGJlIGFscmVhZHkgc2hpZnRlZCBhbmQgbWFza2VkICovCitzdGF0aWMgdm9pZCBtM19wbGF5X3NldHVwKHN0cnVjdCBtM19zdGF0ZSAqcywgaW50IG1vZGUsIHUzMiByYXRlLCB2b2lkICpidWZmZXIsIGludCBzaXplKQoreworICAgIGludCBkc3BfaW5fc2l6ZSA9IE1JTklTUkNfSU5fQlVGRkVSX1NJWkUgLSAoMHgyMCAqIDIpOworICAgIGludCBkc3Bfb3V0X3NpemUgPSBNSU5JU1JDX09VVF9CVUZGRVJfU0laRSAtICgweDIwICogMik7CisgICAgaW50IGRzcF9pbl9idWZmZXIgPSBzLT5kYWNfaW5zdC5kYXRhICsgKE1JTklTUkNfVE1QX0JVRkZFUl9TSVpFIC8gMik7CisgICAgaW50IGRzcF9vdXRfYnVmZmVyID0gZHNwX2luX2J1ZmZlciArIChkc3BfaW5fc2l6ZSAvIDIpICsgMTsKKyAgICBzdHJ1Y3QgZG1hYnVmICpkYiA9ICZzLT5kbWFfZGFjOworICAgIGludCBpOworCisgICAgRFBSSU5USyhEUFNUUiwgIm1vZGU9JWQgcmF0ZT0lZCBidWY9JXAgbGVuPSVkLlxuIiwKKyAgICAgICAgbW9kZSwgcmF0ZSwgYnVmZmVyLCBzaXplKTsKKworI2RlZmluZSBMTyh4KSAoKHgpICYgMHhmZmZmKQorI2RlZmluZSBISSh4KSBMTygoeCkgPj4gMTYpCisKKyAgICAvKiBob3N0IGRtYSBidWZmZXIgcG9pbnRlcnMgKi8KKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgQ0RBVEFfSE9TVF9TUkNfQUREUkwsCisgICAgICAgIExPKHZpcnRfdG9fYnVzKGJ1ZmZlcikpKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgQ0RBVEFfSE9TVF9TUkNfQUREUkgsCisgICAgICAgIEhJKHZpcnRfdG9fYnVzKGJ1ZmZlcikpKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgQ0RBVEFfSE9TVF9TUkNfRU5EX1BMVVNfMUwsCisgICAgICAgIExPKHZpcnRfdG9fYnVzKGJ1ZmZlcikgKyBzaXplKSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0VORF9QTFVTXzFILAorICAgICAgICBISSh2aXJ0X3RvX2J1cyhidWZmZXIpICsgc2l6ZSkpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19DVVJSRU5UTCwKKyAgICAgICAgTE8odmlydF90b19idXMoYnVmZmVyKSkpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19DVVJSRU5USCwKKyAgICAgICAgSEkodmlydF90b19idXMoYnVmZmVyKSkpOworI3VuZGVmIExPCisjdW5kZWYgSEkKKworICAgIC8qIGRzcCBidWZmZXJzICovCisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0lOX0JVRl9CRUdJTiwKKyAgICAgICAgZHNwX2luX2J1ZmZlcik7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0lOX0JVRl9FTkRfUExVU18xLAorICAgICAgICBkc3BfaW5fYnVmZmVyICsgKGRzcF9pbl9zaXplIC8gMikpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9JTl9CVUZfSEVBRCwKKyAgICAgICAgZHNwX2luX2J1ZmZlcik7CisgICAgCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9JTl9CVUZfVEFJTCwKKyAgICAgICAgZHNwX2luX2J1ZmZlcik7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX09VVF9CVUZfQkVHSU4sCisgICAgICAgIGRzcF9vdXRfYnVmZmVyKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgQ0RBVEFfT1VUX0JVRl9FTkRfUExVU18xLAorICAgICAgICBkc3Bfb3V0X2J1ZmZlciArIChkc3Bfb3V0X3NpemUgLyAyKSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX09VVF9CVUZfSEVBRCwKKyAgICAgICAgZHNwX291dF9idWZmZXIpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9PVVRfQlVGX1RBSUwsCisgICAgICAgIGRzcF9vdXRfYnVmZmVyKTsKKworICAgIC8qCisgICAgICogc29tZSBwZXIgY2xpZW50IGluaXRpYWxpemVycworICAgICAqLworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxMiwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIDQwICsgOCk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIFNSQzNfRElSRUNUSU9OX09GRlNFVCArIDE5LAorICAgICAgICBzLT5kYWNfaW5zdC5jb2RlICsgTUlOSVNSQ19DT0VGX0xPQyk7CisKKyAgICAvKiBlbmFibGUgb3IgZGlzYWJsZSBsb3cgcGFzcyBmaWx0ZXI/ICovCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyMiwKKyAgICAgICAgcy0+cmF0ZWRhYyA+IDQ1MDAwID8gMHhmZiA6IDAgKTsKKyAgICAKKyAgICAvKiB0ZWxsIGl0IHdoaWNoIHdheSBkbWEgaXMgZ29pbmc/ICovCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9ETUFfQ09OVFJPTCwKKyAgICAgICAgRE1BQ09OVFJPTF9BVVRPUkVQRUFUICsgRE1BQ19QQUdFM19TRUxFQ1RPUiArIERNQUNfQkxPQ0tGX1NFTEVDVE9SKTsKKworICAgIC8qCisgICAgICogc2V0IGFuIGFybWxvYWQgb2Ygc3RhdGljIGluaXRpYWxpemVycworICAgICAqLworICAgIGZvcihpID0gMCA7IGkgPCAoc2l6ZW9mKHB2KSAvIHNpemVvZihwdlswXSkpIDsgaSsrKSAKKyAgICAgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgcHZbaV0uYWRkciwgcHZbaV0udmFsKTsKKworICAgIC8qIAorICAgICAqIHB1dCB1cyBpbiB0aGUgbGlzdHMgaWYgd2UncmUgbm90IGFscmVhZHkgdGhlcmUKKyAgICAgKi8KKworICAgIGlmKGRiLT5pbl9saXN0cyA9PSAwKSB7CisKKyAgICAgICAgZGItPm1zcmNfaW5kZXggPSBtM19hZGRfbGlzdChzLT5jYXJkLCAmcy0+Y2FyZC0+bXNyY19saXN0LCAKKyAgICAgICAgICAgICAgICBzLT5kYWNfaW5zdC5kYXRhID4+IERQX1NISUZUX0NPVU5UKTsKKworICAgICAgICBkYi0+ZG1hX2luZGV4ID0gbTNfYWRkX2xpc3Qocy0+Y2FyZCwgJnMtPmNhcmQtPmRtYV9saXN0LCAKKyAgICAgICAgICAgICAgICBzLT5kYWNfaW5zdC5kYXRhID4+IERQX1NISUZUX0NPVU5UKTsKKworICAgICAgICBkYi0+bWl4ZXJfaW5kZXggPSBtM19hZGRfbGlzdChzLT5jYXJkLCAmcy0+Y2FyZC0+bWl4ZXJfbGlzdCwgCisgICAgICAgICAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSA+PiBEUF9TSElGVF9DT1VOVCk7CisKKyAgICAgICAgZGItPmluX2xpc3RzID0gMTsKKyAgICB9CisKKyAgICBzZXRfZGFjX3JhdGUocyxyYXRlKTsKKyAgICBzdGFydF9kYWMocyk7Cit9CisKKy8qCisgKiAgICBOYXRpdmUgcmVjb3JkIGRyaXZlciAKKyAqLworc3RhdGljIHN0cnVjdCByZWNfdmFscyB7CisgICAgdTE2IGFkZHIsIHZhbDsKK30gcnZbXSA9IHsKKyAgICB7Q0RBVEFfTEVGVF9WT0xVTUUsIEFSQl9WT0xVTUV9LAorICAgIHtDREFUQV9SSUdIVF9WT0xVTUUsIEFSQl9WT0xVTUV9LAorICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQsIDF9ICwKKyAgICAvKiArMSwgKzIgYXJlIHN0ZXJlby8xNiBiaXQgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMywgMHgwMDAwfSwgLyogZnJhY3Rpb24/ICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDQsIDB9LCAvKiBmaXJzdCBsICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDUsIDB9LCAvKiBmaXJzdCByICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDYsIDB9LCAvKiBzZWNvbmQgbCAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyA3LCAwfSwgLyogc2Vjb25kIHIgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgOCwgMH0sIC8qIGRlbHRhIGwgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgOSwgMH0sIC8qIGRlbHRhIHIgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTAsIDB4ODAwMH0sIC8qIHJvdW5kICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDExLCAweEZGMDB9LCAvKiBoaWdoZXIgYnV0ZSBtYXJrICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDEzLCAwfSwgLyogdGVtcDAgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTQsIDB9LCAvKiBjIGZyYWN0aW9uICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE1LCAwfSwgLyogY291bnRlciAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxNiwgNTB9LC8qIG51bWluICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE3LCA4fSwgLyogbnVtb3V0ICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE4LCAwfSwgLyogbnVtc3RhZ2UgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTksIDB9LCAvKiBjb2VmICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDIwLCAwfSwgLyogZmlsdGVydGFwICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDIxLCAwfSwgLyogYm9vc3RlciAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyMiwgMHhmZn0gLyogc2tpcCBscGYgKi8KK307CisKKy8qIGFnYWluLCBwYXNzZWQgbW9kZSBpcyBhbHJhZHkgc2hpZnRlZC9tYXNrZWQgKi8KK3N0YXRpYyB2b2lkIG0zX3JlY19zZXR1cChzdHJ1Y3QgbTNfc3RhdGUgKnMsIGludCBtb2RlLCB1MzIgcmF0ZSwgdm9pZCAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgZHNwX2luX3NpemUgPSBNSU5JU1JDX0lOX0JVRkZFUl9TSVpFICsgKDB4MTAgKiAyKTsKKyAgICBpbnQgZHNwX291dF9zaXplID0gTUlOSVNSQ19PVVRfQlVGRkVSX1NJWkUgLSAoMHgxMCAqIDIpOworICAgIGludCBkc3BfaW5fYnVmZmVyID0gcy0+YWRjX2luc3QuZGF0YSArIChNSU5JU1JDX1RNUF9CVUZGRVJfU0laRSAvIDIpOworICAgIGludCBkc3Bfb3V0X2J1ZmZlciA9IGRzcF9pbl9idWZmZXIgKyAoZHNwX2luX3NpemUgLyAyKSArIDE7CisgICAgc3RydWN0IGRtYWJ1ZiAqZGIgPSAmcy0+ZG1hX2FkYzsKKyAgICBpbnQgaTsKKworICAgIERQUklOVEsoRFBTVFIsICJyZWNfc2V0dXAgbW9kZT0lZCByYXRlPSVkIGJ1Zj0lcCBsZW49JWQuXG4iLAorICAgICAgICBtb2RlLCByYXRlLCBidWZmZXIsIHNpemUpOworCisjZGVmaW5lIExPKHgpICgoeCkgJiAweGZmZmYpCisjZGVmaW5lIEhJKHgpIExPKCh4KSA+PiAxNikKKworICAgIC8qIGhvc3QgZG1hIGJ1ZmZlciBwb2ludGVycyAqLworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19BRERSTCwKKyAgICAgICAgTE8odmlydF90b19idXMoYnVmZmVyKSkpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19BRERSSCwKKyAgICAgICAgSEkodmlydF90b19idXMoYnVmZmVyKSkpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19FTkRfUExVU18xTCwKKyAgICAgICAgTE8odmlydF90b19idXMoYnVmZmVyKSArIHNpemUpKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfSE9TVF9TUkNfRU5EX1BMVVNfMUgsCisgICAgICAgIEhJKHZpcnRfdG9fYnVzKGJ1ZmZlcikgKyBzaXplKSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0NVUlJFTlRMLAorICAgICAgICBMTyh2aXJ0X3RvX2J1cyhidWZmZXIpKSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0NVUlJFTlRILAorICAgICAgICBISSh2aXJ0X3RvX2J1cyhidWZmZXIpKSk7CisjdW5kZWYgTE8KKyN1bmRlZiBISQorCisgICAgLyogZHNwIGJ1ZmZlcnMgKi8KKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfSU5fQlVGX0JFR0lOLAorICAgICAgICBkc3BfaW5fYnVmZmVyKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfSU5fQlVGX0VORF9QTFVTXzEsCisgICAgICAgIGRzcF9pbl9idWZmZXIgKyAoZHNwX2luX3NpemUgLyAyKSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX0lOX0JVRl9IRUFELAorICAgICAgICBkc3BfaW5fYnVmZmVyKTsKKyAgICAKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX0lOX0JVRl9UQUlMLAorICAgICAgICBkc3BfaW5fYnVmZmVyKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfT1VUX0JVRl9CRUdJTiwKKyAgICAgICAgZHNwX291dF9idWZmZXIpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9PVVRfQlVGX0VORF9QTFVTXzEsCisgICAgICAgIGRzcF9vdXRfYnVmZmVyICsgKGRzcF9vdXRfc2l6ZSAvIDIpKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfT1VUX0JVRl9IRUFELAorICAgICAgICBkc3Bfb3V0X2J1ZmZlcik7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX09VVF9CVUZfVEFJTCwKKyAgICAgICAgZHNwX291dF9idWZmZXIpOworCisgICAgLyoKKyAgICAgKiBzb21lIHBlciBjbGllbnQgaW5pdGlhbGl6ZXJzCisgICAgICovCisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIFNSQzNfRElSRUNUSU9OX09GRlNFVCArIDEyLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgNDAgKyA4KTsKKworICAgIC8qIHRlbGwgaXQgd2hpY2ggd2F5IGRtYSBpcyBnb2luZz8gKi8KKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX0RNQV9DT05UUk9MLAorICAgICAgICBETUFDT05UUk9MX0RJUkVDVElPTiArIERNQUNPTlRST0xfQVVUT1JFUEVBVCArIAorICAgICAgICBETUFDX1BBR0UzX1NFTEVDVE9SICsgRE1BQ19CTE9DS0ZfU0VMRUNUT1IpOworCisgICAgLyoKKyAgICAgKiBzZXQgYW4gYXJtbG9hZCBvZiBzdGF0aWMgaW5pdGlhbGl6ZXJzCisgICAgICovCisgICAgZm9yKGkgPSAwIDsgaSA8IChzaXplb2YocnYpIC8gc2l6ZW9mKHJ2WzBdKSkgOyBpKyspIAorICAgICAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBydltpXS5hZGRyLCBydltpXS52YWwpOworCisgICAgLyogCisgICAgICogcHV0IHVzIGluIHRoZSBsaXN0cyBpZiB3ZSdyZSBub3QgYWxyZWFkeSB0aGVyZQorICAgICAqLworCisgICAgaWYoZGItPmluX2xpc3RzID09IDApIHsKKworICAgICAgICBkYi0+YWRjMV9pbmRleCA9IG0zX2FkZF9saXN0KHMtPmNhcmQsICZzLT5jYXJkLT5hZGMxX2xpc3QsIAorICAgICAgICAgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgPj4gRFBfU0hJRlRfQ09VTlQpOworCisgICAgICAgIGRiLT5kbWFfaW5kZXggPSBtM19hZGRfbGlzdChzLT5jYXJkLCAmcy0+Y2FyZC0+ZG1hX2xpc3QsIAorICAgICAgICAgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgPj4gRFBfU0hJRlRfQ09VTlQpOworCisgICAgICAgIGRiLT5tc3JjX2luZGV4ID0gbTNfYWRkX2xpc3Qocy0+Y2FyZCwgJnMtPmNhcmQtPm1zcmNfbGlzdCwgCisgICAgICAgICAgICAgICAgcy0+YWRjX2luc3QuZGF0YSA+PiBEUF9TSElGVF9DT1VOVCk7CisKKyAgICAgICAgZGItPmluX2xpc3RzID0gMTsKKyAgICB9CisKKyAgICBzZXRfYWRjX3JhdGUocyxyYXRlKTsKKyAgICBzdGFydF9hZGMocyk7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgc2V0X2RtYWEoc3RydWN0IG0zX3N0YXRlICpzLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQoreworICAgIERQUklOVEsoRFBJTlQsInNldF9kbWFhPz9cbiIpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZG1hYyhzdHJ1Y3QgbTNfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisgICAgRFBSSU5USyhEUElOVCwic2V0X2RtYWM/P1xuIik7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X2RtYV9wb3Moc3RydWN0IG0zX2NhcmQgKmNhcmQsCisJCSAgICAgICBpbnQgaW5zdGFuY2VfYWRkcikKK3sKKyAgICB1MTYgaGkgPSAwLCBsbyA9IDA7CisgICAgaW50IHJldHJ5ID0gMTA7CisKKyAgICAvKgorICAgICAqIHRyeSBhbmQgZ2V0IGEgdmFsaWQgYW5zd2VyCisgICAgICovCisgICAgd2hpbGUocmV0cnktLSkgeworICAgICAgICBoaSA9ICBtM19hc3NwX3JlYWQoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgICAgIGluc3RhbmNlX2FkZHIgKyBDREFUQV9IT1NUX1NSQ19DVVJSRU5USCk7CisKKyAgICAgICAgbG8gPSBtM19hc3NwX3JlYWQoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgICAgIGluc3RhbmNlX2FkZHIgKyBDREFUQV9IT1NUX1NSQ19DVVJSRU5UTCk7CisKKyAgICAgICAgaWYoaGkgPT0gbTNfYXNzcF9yZWFkKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgICAgICBpbnN0YW5jZV9hZGRyICsgQ0RBVEFfSE9TVF9TUkNfQ1VSUkVOVEgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBsbyB8IChoaTw8MTYpOworfQorCitzdGF0aWMgdTMyIGdldF9kbWFhKHN0cnVjdCBtM19zdGF0ZSAqcykKK3sKKyAgICB1MzIgb2Zmc2V0OworCisgICAgb2Zmc2V0ID0gZ2V0X2RtYV9wb3Mocy0+Y2FyZCwgcy0+ZGFjX2luc3QuZGF0YSkgLSAKKyAgICAgICAgdmlydF90b19idXMocy0+ZG1hX2RhYy5yYXdidWYpOworCisgICAgRFBSSU5USyhEUElOVCwiZ2V0X2RtYWE6IDB4JTA4eFxuIixvZmZzZXQpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHUzMiBnZXRfZG1hYyhzdHJ1Y3QgbTNfc3RhdGUgKnMpCit7CisgICAgdTMyIG9mZnNldDsKKworICAgIG9mZnNldCA9IGdldF9kbWFfcG9zKHMtPmNhcmQsIHMtPmFkY19pbnN0LmRhdGEpIC0KKyAgICAgICAgdmlydF90b19idXMocy0+ZG1hX2FkYy5yYXdidWYpOworCisgICAgRFBSSU5USyhEUElOVCwiZ2V0X2RtYWM6IDB4JTA4eFxuIixvZmZzZXQpOworCisgICAgcmV0dXJuIG9mZnNldDsKKworfQorCitzdGF0aWMgaW50IAorcHJvZ19kbWFidWYoc3RydWN0IG0zX3N0YXRlICpzLCB1bnNpZ25lZCByZWMpCit7CisgICAgc3RydWN0IGRtYWJ1ZiAqZGIgPSByZWMgPyAmcy0+ZG1hX2FkYyA6ICZzLT5kbWFfZGFjOworICAgIHVuc2lnbmVkIHJhdGUgPSByZWMgPyBzLT5yYXRlYWRjIDogcy0+cmF0ZWRhYzsKKyAgICB1bnNpZ25lZCBieXRlcGVyc2VjOworICAgIHVuc2lnbmVkIGJ1ZnM7CisgICAgdW5zaWduZWQgY2hhciBmbXQ7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICBmbXQgPSBzLT5mbXQ7CisgICAgaWYgKHJlYykgeworICAgICAgICBzdG9wX2FkYyhzKTsKKyAgICAgICAgZm10ID4+PSBFU1NfQURDX1NISUZUOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3BfZGFjKHMpOworICAgICAgICBmbXQgPj49IEVTU19EQUNfU0hJRlQ7CisgICAgfQorICAgIGZtdCAmPSBFU1NfRk1UX01BU0s7CisKKyAgICBkYi0+aHdwdHIgPSBkYi0+c3dwdHIgPSBkYi0+dG90YWxfYnl0ZXMgPSBkYi0+Y291bnQgPSBkYi0+ZXJyb3IgPSBkYi0+ZW5kY2xlYXJlZCA9IDA7CisKKyAgICBieXRlcGVyc2VjID0gcmF0ZSA8PCBzYW1wbGVfc2hpZnRbZm10XTsKKyAgICBidWZzID0gUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcjsKKyAgICBpZiAoZGItPm9zc2ZyYWdzaGlmdCkgeworICAgICAgICBpZiAoKDEwMDAgPDwgZGItPm9zc2ZyYWdzaGlmdCkgPCBieXRlcGVyc2VjKQorICAgICAgICAgICAgZGItPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjLzEwMDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkYi0+ZnJhZ3NoaWZ0ID0gZGItPm9zc2ZyYWdzaGlmdDsKKyAgICB9IGVsc2UgeworICAgICAgICBkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwLyhkYi0+c3ViZGl2aXNpb24gPyBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CisgICAgICAgIGlmIChkYi0+ZnJhZ3NoaWZ0IDwgMykKKyAgICAgICAgICAgIGRiLT5mcmFnc2hpZnQgPSAzOyAKKyAgICB9CisgICAgZGItPm51bWZyYWcgPSBidWZzID4+IGRiLT5mcmFnc2hpZnQ7CisgICAgd2hpbGUgKGRiLT5udW1mcmFnIDwgNCAmJiBkYi0+ZnJhZ3NoaWZ0ID4gMykgeworICAgICAgICBkYi0+ZnJhZ3NoaWZ0LS07CisgICAgICAgIGRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OworICAgIH0KKyAgICBkYi0+ZnJhZ3NpemUgPSAxIDw8IGRiLT5mcmFnc2hpZnQ7CisgICAgaWYgKGRiLT5vc3NtYXhmcmFncyA+PSA0ICYmIGRiLT5vc3NtYXhmcmFncyA8IGRiLT5udW1mcmFnKQorICAgICAgICBkYi0+bnVtZnJhZyA9IGRiLT5vc3NtYXhmcmFnczsKKyAgICBkYi0+ZnJhZ3NhbXBsZXMgPSBkYi0+ZnJhZ3NpemUgPj4gc2FtcGxlX3NoaWZ0W2ZtdF07CisgICAgZGItPmRtYXNpemUgPSBkYi0+bnVtZnJhZyA8PCBkYi0+ZnJhZ3NoaWZ0OworCisgICAgRFBSSU5USyhEUFNUUiwicHJvZ19kbWFidWY6IG51bWZyYWc6ICVkIGZyYWdzaXplOiAlZCBkbWFzaXplOiAlZFxuIixkYi0+bnVtZnJhZyxkYi0+ZnJhZ3NpemUsZGItPmRtYXNpemUpOworCisgICAgbWVtc2V0KGRiLT5yYXdidWYsIChmbXQgJiBFU1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLCBkYi0+ZG1hc2l6ZSk7CisKKyAgICBpZiAocmVjKSAKKyAgICAgICAgbTNfcmVjX3NldHVwKHMsIGZtdCwgcy0+cmF0ZWFkYywgZGItPnJhd2J1ZiwgZGItPmRtYXNpemUpOworICAgIGVsc2UgCisgICAgICAgIG0zX3BsYXlfc2V0dXAocywgZm10LCBzLT5yYXRlZGFjLCBkYi0+cmF3YnVmLCBkYi0+ZG1hc2l6ZSk7CisKKyAgICBkYi0+cmVhZHkgPSAxOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2FkdmFuY2Uoc3RydWN0IG0zX3N0YXRlICpzKQoreworICAgIHVuc2lnbmVkIGNoYXIgYyA9ICgocy0+Zm10ID4+IEVTU19EQUNfU0hJRlQpICYgRVNTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MDsKKyAgICAKKyAgICB1bnNpZ25lZCBjaGFyICpidWYgPSBzLT5kbWFfZGFjLnJhd2J1ZjsKKyAgICB1bnNpZ25lZCBic2l6ZSA9IHMtPmRtYV9kYWMuZG1hc2l6ZTsKKyAgICB1bnNpZ25lZCBicHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKyAgICB1bnNpZ25lZCBsZW4gPSBzLT5kbWFfZGFjLmZyYWdzaXplOworICAgIAorICAgIGlmIChicHRyICsgbGVuID4gYnNpemUpIHsKKyAgICAgICAgdW5zaWduZWQgeCA9IGJzaXplIC0gYnB0cjsKKyAgICAgICAgbWVtc2V0KGJ1ZiArIGJwdHIsIGMsIHgpOworICAgICAgICAvKiBhY2NvdW50IGZvciB3cmFwcGluZz8gKi8KKyAgICAgICAgYnB0ciA9IDA7CisgICAgICAgIGxlbiAtPSB4OworICAgIH0KKyAgICBtZW1zZXQoYnVmICsgYnB0ciwgYywgbGVuKTsKK30KKworLyogY2FsbCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgdm9pZCBtM191cGRhdGVfcHRyKHN0cnVjdCBtM19zdGF0ZSAqcykKK3sKKyAgICB1bnNpZ25lZCBod3B0cjsKKyAgICBpbnQgZGlmZjsKKworICAgIC8qIHVwZGF0ZSBBREMgcG9pbnRlciAqLworICAgIGlmIChzLT5kbWFfYWRjLnJlYWR5KSB7CisgICAgICAgIGh3cHRyID0gZ2V0X2RtYWMocykgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisgICAgICAgIGRpZmYgPSAocy0+ZG1hX2FkYy5kbWFzaXplICsgaHdwdHIgLSBzLT5kbWFfYWRjLmh3cHRyKSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKyAgICAgICAgcy0+ZG1hX2FkYy5od3B0ciA9IGh3cHRyOworICAgICAgICBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisgICAgICAgIHMtPmRtYV9hZGMuY291bnQgKz0gZGlmZjsKKyAgICAgICAgaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfYWRjLmZyYWdzaXplKSAKKyAgICAgICAgICAgIHdha2VfdXAoJnMtPmRtYV9hZGMud2FpdCk7CisgICAgICAgIGlmICghcy0+ZG1hX2FkYy5tYXBwZWQpIHsKKyAgICAgICAgICAgIGlmIChzLT5kbWFfYWRjLmNvdW50ID4gKHNpZ25lZCkocy0+ZG1hX2FkYy5kbWFzaXplIC0gKCgzICogcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgPj4gMSkpKSB7CisgICAgICAgICAgICAgICAgc3RvcF9hZGMocyk7IAorICAgICAgICAgICAgICAgIC8qIGJydXRlIGZvcmNlIGV2ZXJ5b25lIGJhY2sgaW4gc3luYywgc2lnaCAqLworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuY291bnQgPSAwOworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuc3dwdHIgPSAwOworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuaHdwdHIgPSAwOworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuZXJyb3IrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiB1cGRhdGUgREFDIHBvaW50ZXIgKi8KKyAgICBpZiAocy0+ZG1hX2RhYy5yZWFkeSkgeworICAgICAgICBod3B0ciA9IGdldF9kbWFhKHMpICUgcy0+ZG1hX2RhYy5kbWFzaXplOyAKKyAgICAgICAgZGlmZiA9IChzLT5kbWFfZGFjLmRtYXNpemUgKyBod3B0ciAtIHMtPmRtYV9kYWMuaHdwdHIpICUgcy0+ZG1hX2RhYy5kbWFzaXplOworCisgICAgICAgIERQUklOVEsoRFBJTlQsInVwZGF0aW5nIGRhYzogaHdwdHI6ICU2ZCBkaWZmOiAlNmQgY291bnQ6ICU2ZFxuIiwKKyAgICAgICAgICAgICAgICBod3B0cixkaWZmLHMtPmRtYV9kYWMuY291bnQpOworCisgICAgICAgIHMtPmRtYV9kYWMuaHdwdHIgPSBod3B0cjsKKyAgICAgICAgcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyArPSBkaWZmOworCisgICAgICAgIGlmIChzLT5kbWFfZGFjLm1hcHBlZCkgeworICAgICAgICAgICAgCisgICAgICAgICAgICBzLT5kbWFfZGFjLmNvdW50ICs9IGRpZmY7CisgICAgICAgICAgICBpZiAocy0+ZG1hX2RhYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUpIHsKKyAgICAgICAgICAgICAgICB3YWtlX3VwKCZzLT5kbWFfZGFjLndhaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBzLT5kbWFfZGFjLmNvdW50IC09IGRpZmY7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChzLT5kbWFfZGFjLmNvdW50IDw9IDApIHsKKyAgICAgICAgICAgICAgICBEUFJJTlRLKERQQ1JBUCwidW5kZXJmbG93ISBkaWZmOiAlZCAoMHgleCkgY291bnQ6ICVkICgweCV4KSBodzogJWQgKDB4JXgpIHN3OiAlZCAoMHgleClcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiwgZGlmZiwgCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmNvdW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuY291bnQsIAorICAgICAgICAgICAgICAgICAgICBod3B0ciwgaHdwdHIsCisgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuc3dwdHIsCisgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuc3dwdHIpOworICAgICAgICAgICAgICAgIHN0b3BfZGFjKHMpOworICAgICAgICAgICAgICAgIC8qIGJydXRlIGZvcmNlIGV2ZXJ5b25lIGJhY2sgaW4gc3luYywgc2lnaCAqLworICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuY291bnQgPSAwOyAKKyAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLnN3cHRyID0gaHdwdHI7IAorICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuZXJyb3IrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+ZG1hX2RhYy5jb3VudCA8PSAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUgJiYgIXMtPmRtYV9kYWMuZW5kY2xlYXJlZCkgeworICAgICAgICAgICAgICAgIGNsZWFyX2FkdmFuY2Uocyk7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5lbmRjbGVhcmVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5kbWFfZGFjLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplIDw9IChzaWduZWQpcy0+ZG1hX2RhYy5kbWFzaXplKSB7CisgICAgICAgICAgICAgICAgd2FrZV91cCgmcy0+ZG1hX2RhYy53YWl0KTsKKyAgICAgICAgICAgICAgICBEUFJJTlRLKERQSU5ULCJ3YWtpbmcgdXAgREFDIGNvdW50OiAlZCBzdzogJWQgaHc6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5jb3VudCwgcy0+ZG1hX2RhYy5zd3B0ciwgaHdwdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbTNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgc3RydWN0IG0zX2NhcmQgKmMgPSAoc3RydWN0IG0zX2NhcmQgKilkZXZfaWQ7CisgICAgc3RydWN0IG0zX3N0YXRlICpzID0gJmMtPmNoYW5uZWxzWzBdOworICAgIHU4IHN0YXR1czsKKworICAgIHN0YXR1cyA9IGluYihjLT5pb2Jhc2UrMHgxQSk7CisKKyAgICBpZihzdGF0dXMgPT0gMHhmZikKKwlyZXR1cm4gSVJRX05PTkU7CisgICAKKyAgICAvKiBwcmVzdW1hYmx5IGFja2luZyB0aGUgaW50cz8gKi8KKyAgICBvdXR3KHN0YXR1cywgYy0+aW9iYXNlKzB4MUEpOyAKKworICAgIGlmKGMtPmluX3N1c3BlbmQpCisgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKworICAgIC8qCisgICAgICogYWNrIGFuIGFzc3AgaW50IGlmIGl0cyBydW5uaW5nCisgICAgICogYW5kIGhhcyBhbiBpbnQgcGVuZGluZworICAgICAqLworICAgIGlmKCBzdGF0dXMgJiBBU1NQX0lOVF9QRU5ESU5HKSB7CisgICAgICAgIHU4IGN0bCA9IGluYihjLT5pb2Jhc2UgKyBBU1NQX0NPTlRST0xfQik7CisgICAgICAgIGlmKCAhKGN0bCAmIFNUT1BfQVNTUF9DTE9DSykpIHsKKyAgICAgICAgICAgIGN0bCA9IGluYihjLT5pb2Jhc2UgKyBBU1NQX0hPU1RfSU5UX1NUQVRVUyApOworICAgICAgICAgICAgaWYoY3RsICYgRFNQMkhPU1RfUkVRX1RJTUVSKSB7CisgICAgICAgICAgICAgICAgb3V0YiggRFNQMkhPU1RfUkVRX1RJTUVSLCBjLT5pb2Jhc2UgKyBBU1NQX0hPU1RfSU5UX1NUQVRVUyk7CisgICAgICAgICAgICAgICAgLyogdXBkYXRlIGFkYy9kYWMgaW5mbyBpZiBpdCB3YXMgYSB0aW1lciBpbnQgKi8KKyAgICAgICAgICAgICAgICBzcGluX2xvY2soJmMtPmxvY2spOworICAgICAgICAgICAgICAgIG0zX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmMtPmxvY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogWFhYIGlzIHRoaXMgbmVlZGVkPyAqLworICAgIGlmKHN0YXR1cyAmIDB4NDApIAorICAgICAgICBvdXRiKDB4NDAsIGMtPmlvYmFzZSsweDFBKTsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfbWFnaWNbXSA9IEtFUk5fQ1JJVCBQRlggImludmFsaWQgbWFnaWMgdmFsdWUgaW4gJXNcbiI7CisKKyNkZWZpbmUgVkFMSURBVEVfTUFHSUMoRk9PLE1BRykgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoRk9PKSB8fCAoRk9PKS0+bWFnaWMgIT0gTUFHKSB7IFwKKyAgICAgICAgcHJpbnRrKGludmFsaWRfbWFnaWMsX19GVU5DVElPTl9fKTsgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAtRU5YSU87ICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworI2RlZmluZSBWQUxJREFURV9TVEFURShhKSBWQUxJREFURV9NQUdJQyhhLE0zX1NUQVRFX01BR0lDKQorI2RlZmluZSBWQUxJREFURV9DQVJEKGEpIFZBTElEQVRFX01BR0lDKGEsTTNfQ0FSRF9NQUdJQykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBtM19zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsY3VycmVudCk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgY291bnQ7CisgICAgc2lnbmVkIGxvbmcgdG1vOworCisgICAgaWYgKHMtPmRtYV9kYWMubWFwcGVkIHx8ICFzLT5kbWFfZGFjLnJlYWR5KQorICAgICAgICByZXR1cm4gMDsKKyAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIGNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKG5vbmJsb2NrKSB7CisgICAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorICAgICAgICB0bW8gPSAoY291bnQgKiBIWikgLyBzLT5yYXRlZGFjOworICAgICAgICB0bW8gPj49IHNhbXBsZV9zaGlmdFsocy0+Zm10ID4+IEVTU19EQUNfU0hJRlQpICYgRVNTX0ZNVF9NQVNLXTsKKyAgICAgICAgLyogWFhYIHRoaXMgaXMganVzdCBicm9rZW4uICBzb21lb25lIGlzIHdha2luZyB1cyB1cCBhbG90LCBvciBzY2hlZHVsZV90aW1lb3V0IGlzIGJyb2tlbi4KKyAgICAgICAgICAgIG9yIHNvbWV0aGluZy4gIHdobyBjYXJlcy4gLSB6YWNoICovCisgICAgICAgIGlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyB0bW8gOiAxKSAmJiB0bW8pCisgICAgICAgICAgICBEUFJJTlRLKERQQ1JBUCwiZG1hIHRpbWVkIG91dD8/ICVsZFxuIixqaWZmaWVzKTsKKyAgICB9CisgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgbTNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisgICAgc3RydWN0IG0zX3N0YXRlICpzID0gKHN0cnVjdCBtM19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKyAgICBzc2l6ZV90IHJldDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIHN3cHRyOworICAgIGludCBjbnQ7CisgICAgCisgICAgVkFMSURBVEVfU1RBVEUocyk7CisgICAgaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorICAgICAgICByZXR1cm4gLUVOWElPOworICAgIGlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMSkpKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIHJldCA9IDA7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisgICAgd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICBpbnQgdGltZWRfb3V0OworCisgICAgICAgIHN3cHRyID0gcy0+ZG1hX2FkYy5zd3B0cjsKKyAgICAgICAgY250ID0gcy0+ZG1hX2FkYy5kbWFzaXplLXN3cHRyOworICAgICAgICBpZiAocy0+ZG1hX2FkYy5jb3VudCA8IGNudCkKKyAgICAgICAgICAgIGNudCA9IHMtPmRtYV9hZGMuY291bnQ7CisKKyAgICAgICAgaWYgKGNudCA+IGNvdW50KQorICAgICAgICAgICAgY250ID0gY291bnQ7CisKKyAgICAgICAgaWYgKGNudCA8PSAwKSB7CisgICAgICAgICAgICBzdGFydF9hZGMocyk7CisgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCA9IHJldCA/IHJldCA6IC1FQUdBSU47CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIHRpbWVkX291dCA9IGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmcy0+ZG1hX2FkYy53YWl0LCBIWikgPT0gMDsKKyAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgICAgIGlmKHRpbWVkX291dCkgeworICAgICAgICAgICAgICAgIHByaW50aygicmVhZDogY2hpcCBsb2NrdXA/IGRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAldSBod3B0ciAldSBzd3B0ciAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5kbWFzaXplLCBzLT5kbWFfYWRjLmZyYWdzaXplLCBzLT5kbWFfYWRjLmNvdW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5od3B0ciwgcy0+ZG1hX2FkYy5zd3B0cik7CisgICAgICAgICAgICAgICAgc3RvcF9hZGMocyk7CisgICAgICAgICAgICAgICAgc2V0X2RtYWMocywgdmlydF90b19idXMocy0+ZG1hX2FkYy5yYXdidWYpLCBzLT5kbWFfYWRjLm51bWZyYWcgPDwgcy0+ZG1hX2FkYy5mcmFnc2hpZnQpOworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLmh3cHRyID0gcy0+ZG1hX2FkYy5zd3B0ciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCA9IHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPmRtYV9hZGMucmF3YnVmICsgc3dwdHIsIGNudCkpIHsKKyAgICAgICAgICAgIHJldCA9IHJldCA/IHJldCA6IC1FRkFVTFQ7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworICAgICAgICBzLT5kbWFfYWRjLnN3cHRyID0gc3dwdHI7CisgICAgICAgIHMtPmRtYV9hZGMuY291bnQgLT0gY250OworICAgICAgICBjb3VudCAtPSBjbnQ7CisgICAgICAgIGJ1ZmZlciArPSBjbnQ7CisgICAgICAgIHJldCArPSBjbnQ7CisgICAgICAgIHN0YXJ0X2FkYyhzKTsKKyAgICB9CisKK291dDoKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgbTNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworICAgIHN0cnVjdCBtM19zdGF0ZSAqcyA9IChzdHJ1Y3QgbTNfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgc3NpemVfdCByZXQ7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB1bnNpZ25lZCBzd3B0cjsKKyAgICBpbnQgY250OworICAgIAorICAgIFZBTElEQVRFX1NUQVRFKHMpOworICAgIGlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKyAgICAgICAgcmV0dXJuIC1FTlhJTzsKKyAgICBpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIHJldCA9IDA7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisgICAgd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICBpbnQgdGltZWRfb3V0OworCisgICAgICAgIGlmIChzLT5kbWFfZGFjLmNvdW50IDwgMCkgeworICAgICAgICAgICAgcy0+ZG1hX2RhYy5jb3VudCA9IDA7CisgICAgICAgICAgICBzLT5kbWFfZGFjLnN3cHRyID0gcy0+ZG1hX2RhYy5od3B0cjsKKyAgICAgICAgfQorICAgICAgICBzd3B0ciA9IHMtPmRtYV9kYWMuc3dwdHI7CisKKyAgICAgICAgY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplLXN3cHRyOworCisgICAgICAgIGlmIChzLT5kbWFfZGFjLmNvdW50ICsgY250ID4gcy0+ZG1hX2RhYy5kbWFzaXplKQorICAgICAgICAgICAgY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gcy0+ZG1hX2RhYy5jb3VudDsKKworCisgICAgICAgIGlmIChjbnQgPiBjb3VudCkKKyAgICAgICAgICAgIGNudCA9IGNvdW50OworCisgICAgICAgIGlmIChjbnQgPD0gMCkgeworICAgICAgICAgICAgc3RhcnRfZGFjKHMpOworICAgICAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisgICAgICAgICAgICAgICAgaWYoIXJldCkgcmV0ID0gLUVBR0FJTjsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIHRpbWVkX291dCA9IGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmcy0+ZG1hX2RhYy53YWl0LCBIWikgPT0gMDsKKyAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICBpZih0aW1lZF9vdXQpIHsKKyAgICAgICAgICAgICAgICBEUFJJTlRLKERQQ1JBUCwid3JpdGU6IGNoaXAgbG9ja3VwPyBkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJXUgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuZG1hc2l6ZSwgcy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcy0+ZG1hX2RhYy5jb3VudCwgCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuaHdwdHIsIHMtPmRtYV9kYWMuc3dwdHIpOworICAgICAgICAgICAgICAgIHN0b3BfZGFjKHMpOworICAgICAgICAgICAgICAgIHNldF9kbWFhKHMsIHZpcnRfdG9fYnVzKHMtPmRtYV9kYWMucmF3YnVmKSwgcy0+ZG1hX2RhYy5udW1mcmFnIDw8IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0KTsKKyAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy5od3B0ciA9IHMtPmRtYV9kYWMuc3dwdHIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZXQpIHJldCA9IC1FUkVTVEFSVFNZUzsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKHMtPmRtYV9kYWMucmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgY250KSkgeworICAgICAgICAgICAgaWYgKCFyZXQpIHJldCA9IC1FRkFVTFQ7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgRFBSSU5USyhEUFNZUywid3JvdGUgJTZkIGJ5dGVzIGF0IHN3OiAlNmQgY250OiAlNmQgd2hpbGUgaHc6ICU2ZFxuIiwKKyAgICAgICAgICAgICAgICBjbnQsIHN3cHRyLCBzLT5kbWFfZGFjLmNvdW50LCBzLT5kbWFfZGFjLmh3cHRyKTsKKyAgICAgICAgCisgICAgICAgIHN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKworICAgICAgICBzLT5kbWFfZGFjLnN3cHRyID0gc3dwdHI7CisgICAgICAgIHMtPmRtYV9kYWMuY291bnQgKz0gY250OworICAgICAgICBzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAwOworICAgICAgICBjb3VudCAtPSBjbnQ7CisgICAgICAgIGJ1ZmZlciArPSBjbnQ7CisgICAgICAgIHJldCArPSBjbnQ7CisgICAgICAgIHN0YXJ0X2RhYyhzKTsKKyAgICB9CitvdXQ6CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbTNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworICAgIHN0cnVjdCBtM19zdGF0ZSAqcyA9IChzdHJ1Y3QgbTNfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKyAgICBWQUxJREFURV9TVEFURShzKTsKKyAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisgICAgICAgIHBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2RhYy53YWl0LCB3YWl0KTsKKyAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKyAgICAgICAgcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfYWRjLndhaXQsIHdhaXQpOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICBtM191cGRhdGVfcHRyKHMpOworCisgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKyAgICAgICAgaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfYWRjLmZyYWdzaXplKQorICAgICAgICAgICAgbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworICAgIH0KKyAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKyAgICAgICAgaWYgKHMtPmRtYV9kYWMubWFwcGVkKSB7CisgICAgICAgICAgICBpZiAocy0+ZG1hX2RhYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUpIAorICAgICAgICAgICAgICAgIG1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKHNpZ25lZClzLT5kbWFfZGFjLmRtYXNpemUgPj0gcy0+ZG1hX2RhYy5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkKKyAgICAgICAgICAgICAgICBtYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworICAgICAgICB9CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworICAgIHJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IG0zX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworICAgIHN0cnVjdCBtM19zdGF0ZSAqcyA9IChzdHJ1Y3QgbTNfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgdW5zaWduZWQgbG9uZyBtYXhfc2l6ZSwgc2l6ZSwgc3RhcnQsIG9mZnNldDsKKyAgICBzdHJ1Y3QgZG1hYnVmICpkYjsKKyAgICBpbnQgcmV0ID0gLUVJTlZBTDsKKworICAgIFZBTElEQVRFX1NUQVRFKHMpOworICAgIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKyAgICAgICAgaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAwKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGRiID0gJnMtPmRtYV9kYWM7CisgICAgfSBlbHNlIAorICAgIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgeworICAgICAgICBpZiAoKHJldCA9IHByb2dfZG1hYnVmKHMsIDEpKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZGIgPSAmcy0+ZG1hX2FkYzsKKyAgICB9IGVsc2UgIAorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIG1heF9zaXplID0gZGItPmRtYXNpemU7CisKKyAgICBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisgICAgb2Zmc2V0ID0gKHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCk7CisgICAgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworICAgIGlmKHNpemUgPiBtYXhfc2l6ZSkKKyAgICAgICAgZ290byBvdXQ7CisgICAgaWYob2Zmc2V0ID4gbWF4X3NpemUgLSBzaXplKQorICAgICAgICBnb3RvIG91dDsKKworICAgIC8qCisgICAgICogdGhpcyB3aWxsIGJlIC0+bm9wYWdlKCkgb25jZSBJIGNhbiAKKyAgICAgKiBhc2sgSmVmZiB3aGF0IHRoZSBoZWxsIEknbSBkb2luZyB3cm9uZy4KKyAgICAgKi8KKyAgICByZXQgPSAtRUFHQUlOOworICAgIGlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJdmlydF90b19waHlzKGRiLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQlzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgZGItPm1hcHBlZCA9IDE7CisgICAgcmV0ID0gMDsKKworb3V0OgorICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIGlzIGEgZGlzYXN0ZXIuLgorICovCisjZGVmaW5lIGdldF91c2VyX3JldCh4LCBwdHIsICByZXQpICh7IGlmKGdldF91c2VyKHgsIHB0cikpIHJldHVybiByZXQ7IH0pCitzdGF0aWMgaW50IG0zX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICBzdHJ1Y3QgbTNfc3RhdGUgKnMgPSAoc3RydWN0IG0zX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtM19jYXJkICpjYXJkPXMtPmNhcmQ7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBhdWRpb19idWZfaW5mbyBhYmluZm87CisgICAgY291bnRfaW5mbyBjaW5mbzsKKyAgICBpbnQgdmFsLCBtYXBwZWQsIHJldDsKKyAgICB1bnNpZ25lZCBjaGFyIGZtdG0sIGZtdGQ7CisgICAgdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisgICAgaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKyAgICBWQUxJREFURV9TVEFURShzKTsKKworICAgIG1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIHMtPmRtYV9kYWMubWFwcGVkKSB8fAorICAgICAgICAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIHMtPmRtYV9hZGMubWFwcGVkKTsKKworICAgIERQUklOVEsoRFBTWVMsIm0zX2lvY3RsOiBjbWQgJWRcbiIsIGNtZCk7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgT1NTX0dFVFZFUlNJT046CisgICAgICAgIHJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9TWU5DOgorICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisgICAgICAgICAgICByZXR1cm4gZHJhaW5fZGFjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIAorICAgIGNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisgICAgICAgIC8qIFhYWCBmaXggKi8KKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKyAgICAgICAgcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCwgcCk7CisgICAgICAgIAorICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgICAgICBzdG9wX2RhYyhzKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplX2lycShzLT5jYXJkLT5wY2lkZXYtPmlycSk7CisgICAgICAgICAgICBzLT5kbWFfZGFjLnN3cHRyID0gcy0+ZG1hX2RhYy5od3B0ciA9IHMtPmRtYV9kYWMuY291bnQgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworICAgICAgICAgICAgc3RvcF9hZGMocyk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZV9pcnEocy0+Y2FyZC0+cGNpZGV2LT5pcnEpOworICAgICAgICAgICAgcy0+ZG1hX2FkYy5zd3B0ciA9IHMtPmRtYV9hZGMuaHdwdHIgPSBzLT5kbWFfYWRjLmNvdW50ID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKyAgICAgICAgZ2V0X3VzZXJfcmV0KHZhbCwgcCwgLUVGQVVMVCk7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIGlmICh2YWwgPj0gMCkgeworICAgICAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzdG9wX2FkYyhzKTsKKyAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKyAgICAgICAgICAgICAgICBzZXRfYWRjX3JhdGUocywgdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgICAgIHN0b3BfZGFjKHMpOworICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMucmVhZHkgPSAwOworICAgICAgICAgICAgICAgIHNldF9kYWNfcmF0ZShzLCB2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjLCBwKTsKKyAgICAgICAgCisgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKyAgICAgICAgZ2V0X3VzZXJfcmV0KHZhbCwgcCwgLUVGQVVMVCk7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIGZtdGQgPSAwOworICAgICAgICBmbXRtID0gfjA7CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgICAgICBzdG9wX2FkYyhzKTsKKyAgICAgICAgICAgIHMtPmRtYV9hZGMucmVhZHkgPSAwOworICAgICAgICAgICAgaWYgKHZhbCkKKyAgICAgICAgICAgICAgICBmbXRkIHw9IEVTU19GTVRfU1RFUkVPIDw8IEVTU19BRENfU0hJRlQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm10bSAmPSB+KEVTU19GTVRfU1RFUkVPIDw8IEVTU19BRENfU0hJRlQpOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgc3RvcF9kYWMocyk7CisgICAgICAgICAgICBzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKyAgICAgICAgICAgIGlmICh2YWwpCisgICAgICAgICAgICAgICAgZm10ZCB8PSBFU1NfRk1UX1NURVJFTyA8PCBFU1NfREFDX1NISUZUOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZtdG0gJj0gfihFU1NfRk1UX1NURVJFTyA8PCBFU1NfREFDX1NISUZUKTsKKyAgICAgICAgfQorICAgICAgICBzZXRfZm10KHMsIGZtdG0sIGZtdGQpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorICAgICAgICBnZXRfdXNlcl9yZXQodmFsLCBwLCAtRUZBVUxUKTsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKHZhbCAhPSAwKSB7CisgICAgICAgICAgICBmbXRkID0gMDsKKyAgICAgICAgICAgIGZtdG0gPSB+MDsKKyAgICAgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgICAgICAgICAgc3RvcF9hZGMocyk7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA+PSAyKQorICAgICAgICAgICAgICAgICAgICBmbXRkIHw9IEVTU19GTVRfU1RFUkVPIDw8IEVTU19BRENfU0hJRlQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmbXRtICY9IH4oRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKyAgICAgICAgICAgICAgICBzdG9wX2RhYyhzKTsKKyAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAodmFsID49IDIpCisgICAgICAgICAgICAgICAgICAgIGZtdGQgfD0gRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0RBQ19TSElGVDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZtdG0gJj0gfihFU1NfRk1UX1NURVJFTyA8PCBFU1NfREFDX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldF9mbXQocywgZm10bSwgZm10ZCk7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gcHV0X3VzZXIoKHMtPmZtdCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyAoRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVCkgCisgICAgICAgICAgICAgICAgICAgICAgIDogKEVTU19GTVRfU1RFUkVPIDw8IEVTU19EQUNfU0hJRlQpKSkgPyAyIDogMSwgcCk7CisgICAgICAgIAorICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICByZXR1cm4gcHV0X3VzZXIoQUZNVF9VOHxBRk1UX1MxNl9MRSwgcCk7CisgICAgICAgIAorICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisgICAgICAgIGdldF91c2VyX3JldCh2YWwsIHAsIC1FRkFVTFQpOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKyAgICAgICAgICAgIGZtdGQgPSAwOworICAgICAgICAgICAgZm10bSA9IH4wOworICAgICAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzdG9wX2FkYyhzKTsKKyAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAodmFsID09IEFGTVRfUzE2X0xFKQorICAgICAgICAgICAgICAgICAgICBmbXRkIHw9IEVTU19GTVRfMTZCSVQgPDwgRVNTX0FEQ19TSElGVDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZtdG0gJj0gfihFU1NfRk1UXzE2QklUIDw8IEVTU19BRENfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgICAgICAgICAgc3RvcF9kYWMocyk7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKKyAgICAgICAgICAgICAgICAgICAgZm10ZCB8PSBFU1NfRk1UXzE2QklUIDw8IEVTU19EQUNfU0hJRlQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmbXRtICY9IH4oRVNTX0ZNVF8xNkJJVCA8PCBFU1NfREFDX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldF9mbXQocywgZm10bSwgZm10ZCk7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gcHV0X3VzZXIoKHMtPmZtdCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyAKKyAgICAgICAgICAgIChFU1NfRk1UXzE2QklUIDw8IEVTU19BRENfU0hJRlQpIAorICAgICAgICAgICAgOiAoRVNTX0ZNVF8xNkJJVCA8PCBFU1NfREFDX1NISUZUKSkpID8gCisgICAgICAgICAgICAgICAgQUZNVF9TMTZfTEUgOiAKKyAgICAgICAgICAgICAgICBBRk1UX1U4LCAKKyAgICAgICAgICAgIHApOworICAgICAgICAKKyAgICBjYXNlIFNORENUTF9EU1BfUE9TVDoKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKyAgICAgICAgdmFsID0gMDsKKyAgICAgICAgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiAocy0+ZW5hYmxlICYgQURDX1JVTk5JTkcpKQorICAgICAgICAgICAgdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisgICAgICAgIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChzLT5lbmFibGUgJiBEQUNfUlVOTklORykpIAorICAgICAgICAgICAgdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKyAgICAgICAgCisgICAgY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisgICAgICAgIGdldF91c2VyX3JldCh2YWwsIHAsIC1FRkFVTFQpOworICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworICAgICAgICAgICAgaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9ICBwcm9nX2RtYWJ1ZihzLCAxKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgc3RhcnRfYWRjKHMpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgc3RvcF9hZGMocyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgICAgICBpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBzdGFydF9kYWMocyk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBzdG9wX2RhYyhzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisgICAgICAgIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICBpZiAoIShzLT5lbmFibGUgJiBEQUNfUlVOTklORykgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHMsIDApKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgbTNfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKyAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gcy0+ZG1hX2RhYy5jb3VudDsKKyAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfZGFjLm51bWZyYWc7CisgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2RhYy5mcmFnc2hpZnQ7ICAgICAgCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisgICAgICAgIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGlmICghKHMtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSAmJiAodmFsID0gcHJvZ19kbWFidWYocywgMSkpICE9IDApCisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBtM191cGRhdGVfcHRyKHMpOworICAgICAgICBhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplOworICAgICAgICBhYmluZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLmNvdW50OworICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9hZGMubnVtZnJhZzsKKyAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsgICAgICAKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworICAgICAgICAKKyAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisgICAgICAgIGZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorICAgICAgICBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgbTNfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgdmFsID0gcy0+ZG1hX2RhYy5jb3VudDsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorICAgICAgICBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBtM191cGRhdGVfcHRyKHMpOworICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXM7CisgICAgICAgIGNpbmZvLmJsb2NrcyA9IHMtPmRtYV9hZGMuY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9hZGMuaHdwdHI7CisgICAgICAgIGlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKyAgICAgICAgICAgIHMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZS0xOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorICAgICAgICBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgbTNfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzOworICAgICAgICBjaW5mby5ibG9ja3MgPSBzLT5kbWFfZGFjLmNvdW50ID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworICAgICAgICBjaW5mby5wdHIgPSBzLT5kbWFfZGFjLmh3cHRyOworICAgICAgICBpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisgICAgICAgICAgICBzLT5kbWFfZGFjLmNvdW50ICY9IHMtPmRtYV9kYWMuZnJhZ3NpemUtMTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CisKKyAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgICAgICBpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMuZnJhZ3NpemUsIHApOworICAgICAgICB9CisgICAgICAgIGlmICgodmFsID0gcHJvZ19kbWFidWYocywgMSkpKQorICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9hZGMuZnJhZ3NpemUsIHApOworCisgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorICAgICAgICBnZXRfdXNlcl9yZXQodmFsLCBwLCAtRUZBVUxUKTsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKyAgICAgICAgICAgIHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworICAgICAgICAgICAgcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworICAgICAgICAgICAgaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0IDwgNCkKKyAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDQ7CisgICAgICAgICAgICBpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPiAxNSkKKyAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDE1OworICAgICAgICAgICAgaWYgKHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPCA0KQorICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSA0OworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisgICAgICAgICAgICBzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisgICAgICAgICAgICBpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPCA0KQorICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gNDsKKyAgICAgICAgICAgIGlmIChzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA+IDE1KQorICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gMTU7CisgICAgICAgICAgICBpZiAocy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA8IDQpCisgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisgICAgICAgIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKSB8fAorICAgICAgICAgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24pKQorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZ2V0X3VzZXJfcmV0KHZhbCwgcCwgLUVGQVVMVCk7CisgICAgICAgIGlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMiAmJiB2YWwgIT0gNCkKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKyAgICAgICAgICAgIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSB2YWw7CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKyAgICAgICAgICAgIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSB2YWw7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorICAgICAgICByZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+cmF0ZWFkYyA6IHMtPnJhdGVkYWMsIHApOworCisgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKyAgICAgICAgcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKEVTU19GTVRfU1RFUkVPIDw8IEVTU19BRENfU0hJRlQpIAorICAgICAgICAgICAgICAgICAgICAgICA6IChFU1NfRk1UX1NURVJFTyA8PCBFU1NfREFDX1NISUZUKSkpID8gMiA6IDEsIHApOworCisgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorICAgICAgICByZXR1cm4gcHV0X3VzZXIoKHMtPmZtdCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyAoRVNTX0ZNVF8xNkJJVCA8PCBFU1NfQURDX1NISUZUKSAKKyAgICAgICAgICAgICAgICAgICAgICAgOiAoRVNTX0ZNVF8xNkJJVCA8PCBFU1NfREFDX1NISUZUKSkpID8gMTYgOiA4LCBwKTsKKworICAgIGNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKyAgICBjYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgorICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgCisgICAgfQorICAgIHJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50CithbGxvY2F0ZV9kbWFidWYoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHN0cnVjdCBkbWFidWYgKmRiKQoreworICAgIGludCBvcmRlcjsKKworICAgIERQUklOVEsoRFBTVFIsImFsbG9jYXRpbmcgZm9yIGRtYWJ1ZiAlcFxuIiwgZGIpOworCisgICAgLyogCisgICAgICogYWxsb2MgYXMgYmlnIGEgY2h1bmsgYXMgd2UgY2FuLCBzdGFydCB3aXRoIAorICAgICAqIDY0ayAnY2F1c2Ugd2UncmUgaW5zYW5lLiAgYmFzZWQgb24gb3JkZXIgY2F1c2UKKyAgICAgKiB0aGUgYW1hemluZ2x5IGNvbXBsaWNhdGVkIHByb2dfZG1hYnVmIHdhbnRzIGl0LgorICAgICAqCisgICAgICogcGNpX2FsbG9jX3NvbnNpc3RlbnQgZ3VhcmFudGVlcyB0aGF0IGl0IHdvbid0IGNyb3NzIGEgbmF0dXJhbAorICAgICAqIGJvdW5kYXJ5OyB0aGUgbTMgaGFyZHdhcmUgY2FuJ3QgaGF2ZSBkbWEgY3Jvc3MgYSA2NGsgYnVzCisgICAgICogYWRkcmVzcyBib3VuZGFyeS4KKyAgICAgKi8KKyAgICBmb3IgKG9yZGVyID0gMTYtUEFHRV9TSElGVDsgb3JkZXIgPj0gMTsgb3JkZXItLSkgeworICAgICAgICBkYi0+cmF3YnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgJihkYi0+aGFuZGxlKSk7CisgICAgICAgIGlmKGRiLT5yYXdidWYpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWRiLT5yYXdidWYpCisgICAgICAgIHJldHVybiAxOworCisgICAgRFBSSU5USyhEUFNUUiwiYWxsb2NhdGVkICVsZCAoJWQpIGJ5dGVzIGF0ICVwXG4iLAorICAgICAgICAgICAgUEFHRV9TSVpFPDxvcmRlciwgb3JkZXIsIGRiLT5yYXdidWYpOworCisgICAgeworICAgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CisKKyAgICAgICAgcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBvcmRlcikgLSAxKTsKKyAgICAgICAgZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKyAgICAgICAgICAgIFNldFBhZ2VSZXNlcnZlZChwYWdlKTsKKyAgICB9CisKKworICAgIGRiLT5idWZvcmRlciA9IG9yZGVyOworICAgIGRiLT5yZWFkeSA9IDA7CisgICAgZGItPm1hcHBlZCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK251a2VfbGlzdHMoc3RydWN0IG0zX2NhcmQgKmNhcmQsIHN0cnVjdCBkbWFidWYgKmRiKQoreworICAgIG0zX3JlbW92ZV9saXN0KGNhcmQsICYoY2FyZC0+ZG1hX2xpc3QpLCBkYi0+ZG1hX2luZGV4KTsKKyAgICBtM19yZW1vdmVfbGlzdChjYXJkLCAmKGNhcmQtPm1zcmNfbGlzdCksIGRiLT5tc3JjX2luZGV4KTsKKyAgICBkYi0+aW5fbGlzdHMgPSAwOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9kbWFidWYoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHN0cnVjdCBkbWFidWYgKmRiKQoreworICAgIGlmKGRiLT5yYXdidWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgRFBSSU5USyhEUFNUUiwiZnJlZWluZyAlcCBmcm9tIGRtYWJ1ZiAlcFxuIixkYi0+cmF3YnVmLCBkYik7CisKKyAgICB7CisgICAgICAgIHN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKyAgICAgICAgcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisgICAgICAgIGZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisgICAgICAgICAgICBDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKyAgICB9CisKKworICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlciwKKyAgICAgICAgICAgIGRiLT5yYXdidWYsIGRiLT5oYW5kbGUpOworCisgICAgZGItPnJhd2J1ZiA9IE5VTEw7CisgICAgZGItPmJ1Zm9yZGVyID0gMDsKKyAgICBkYi0+bWFwcGVkID0gMDsKKyAgICBkYi0+cmVhZHkgPSAwOworfQorCitzdGF0aWMgaW50IG0zX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKyAgICBzdHJ1Y3QgbTNfY2FyZCAqYzsKKyAgICBzdHJ1Y3QgbTNfc3RhdGUgKnMgPSBOVUxMOworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgZm10bSA9IH4wLCBmbXRzID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgLyoKKyAgICAgKiAgICBTY2FuIHRoZSBjYXJkcyBhbmQgZmluZCB0aGUgY2hhbm5lbC4gV2Ugb25seQorICAgICAqICAgIGRvIHRoaXMgYXQgb3BlbiB0aW1lIHNvIGl0IGlzIG9rCisgICAgICovCisgICAgZm9yKGMgPSBkZXZzIDsgYyAhPSBOVUxMIDsgYyA9IGMtPm5leHQpIHsKKworICAgICAgICBmb3IoaT0wO2k8TlJfRFNQUztpKyspIHsKKworICAgICAgICAgICAgaWYoYy0+Y2hhbm5lbHNbaV0uZGV2X2F1ZGlvIDwgMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmKChjLT5jaGFubmVsc1tpXS5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBzID0gJmMtPmNoYW5uZWxzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIAorICAgIFZBTElEQVRFX1NUQVRFKHMpOworCisgICAgZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKworICAgIC8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworICAgIGRvd24oJnMtPm9wZW5fc2VtKTsKKyAgICB3aGlsZSAocy0+b3Blbl9tb2RlICYgZmlsZS0+Zl9tb2RlKSB7CisgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworICAgICAgICAgICAgdXAoJnMtPm9wZW5fc2VtKTsKKyAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgdXAoJnMtPm9wZW5fc2VtKTsKKyAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcy0+b3Blbl93YWl0KTsKKyAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKKyAgICAgICAgZG93bigmcy0+b3Blbl9zZW0pOworICAgIH0KKyAgICAKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmYy0+bG9jaywgZmxhZ3MpOworCisgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKyAgICAgICAgZm10bSAmPSB+KChFU1NfRk1UX1NURVJFTyB8IEVTU19GTVRfMTZCSVQpIDw8IEVTU19BRENfU0hJRlQpOworICAgICAgICBpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorICAgICAgICAgICAgZm10cyB8PSBFU1NfRk1UXzE2QklUIDw8IEVTU19BRENfU0hJRlQ7IAorCisgICAgICAgIHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSAwOworICAgICAgICBzZXRfYWRjX3JhdGUocywgODAwMCk7CisgICAgfQorICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworICAgICAgICBmbXRtICY9IH4oKEVTU19GTVRfU1RFUkVPIHwgRVNTX0ZNVF8xNkJJVCkgPDwgRVNTX0RBQ19TSElGVCk7CisgICAgICAgIGlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisgICAgICAgICAgICBmbXRzIHw9IEVTU19GTVRfMTZCSVQgPDwgRVNTX0RBQ19TSElGVDsKKworICAgICAgICBzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSBzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gMDsKKyAgICAgICAgc2V0X2RhY19yYXRlKHMsIDgwMDApOworICAgIH0KKyAgICBzZXRfZm10KHMsIGZtdG0sIGZtdHMpOworICAgIHMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKworICAgIHVwKCZzLT5vcGVuX3NlbSk7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+bG9jaywgZmxhZ3MpOworICAgIHJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBtM19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIHN0cnVjdCBtM19zdGF0ZSAqcyA9IChzdHJ1Y3QgbTNfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG0zX2NhcmQgKmNhcmQ9cy0+Y2FyZDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgVkFMSURBVEVfU1RBVEUocyk7CisgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorICAgICAgICBkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCisgICAgZG93bigmcy0+b3Blbl9zZW0pOworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKyAgICAgICAgc3RvcF9kYWMocyk7CisgICAgICAgIGlmKHMtPmRtYV9kYWMuaW5fbGlzdHMpIHsKKyAgICAgICAgICAgIG0zX3JlbW92ZV9saXN0KHMtPmNhcmQsICYocy0+Y2FyZC0+bWl4ZXJfbGlzdCksIHMtPmRtYV9kYWMubWl4ZXJfaW5kZXgpOworICAgICAgICAgICAgbnVrZV9saXN0cyhzLT5jYXJkLCAmKHMtPmRtYV9kYWMpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworICAgICAgICBzdG9wX2FkYyhzKTsKKyAgICAgICAgaWYocy0+ZG1hX2FkYy5pbl9saXN0cykgeworICAgICAgICAgICAgbTNfcmVtb3ZlX2xpc3Qocy0+Y2FyZCwgJihzLT5jYXJkLT5hZGMxX2xpc3QpLCBzLT5kbWFfYWRjLmFkYzFfaW5kZXgpOworICAgICAgICAgICAgbnVrZV9saXN0cyhzLT5jYXJkLCAmKHMtPmRtYV9hZGMpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgcy0+b3Blbl9tb2RlICY9ICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICB1cCgmcy0+b3Blbl9zZW0pOworICAgIHdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFdhaXQgZm9yIHRoZSBhYzk3IHNlcmlhbCBidXMgdG8gYmUgZnJlZS4KKyAqIHJldHVybiBub256ZXJvIGlmIHRoZSBidXMgaXMgc3RpbGwgYnVzeS4KKyAqLworc3RhdGljIGludCBtM19hYzk3X3dhaXQoc3RydWN0IG0zX2NhcmQgKmNhcmQpCit7CisgICAgaW50IGkgPSAxMDAwMDsKKworICAgIHdoaWxlKCAobTNfaW5iKGNhcmQsIDB4MzApICYgMSkgJiYgaS0tKSA7CisKKyAgICByZXR1cm4gaSA9PSAwOworfQorCitzdGF0aWMgdTE2IG0zX2FjOTdfcmVhZChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZykKK3sKKyAgICB1MTYgcmV0ID0gMDsKKyAgICBzdHJ1Y3QgbTNfY2FyZCAqY2FyZCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisKKyAgICBzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7CisKKyAgICBpZihtM19hYzk3X3dhaXQoY2FyZCkpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAic2VyaWFsIGJ1cyBidXN5IHJlYWRpbmcgcmVnIDB4JXhcbiIscmVnKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgbTNfb3V0YihjYXJkLCAweDgwIHwgKHJlZyAmIDB4N2YpLCAweDMwKTsKKworICAgIGlmKG0zX2FjOTdfd2FpdChjYXJkKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgUEZYICJzZXJpYWwgYnVzIGJ1c3kgZmluaXNoaW5nIHJlYWQgcmVnIDB4JXhcbiIscmVnKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgcmV0ID0gIG0zX2ludyhjYXJkLCAweDMyKTsKKyAgICBEUFJJTlRLKERQQ1JBUCwicmVhZGluZyAweCUwNHggZnJvbSAweCUwMnhcbiIscmV0LCByZWcpOworCitvdXQ6CisgICAgc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbTNfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZywgdTE2IHZhbCkKK3sKKyAgICBzdHJ1Y3QgbTNfY2FyZCAqY2FyZCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisKKyAgICBzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7CisKKyAgICBpZihtM19hYzk3X3dhaXQoY2FyZCkpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAic2VyaWFsIGJ1cyBidXN5IHdyaXRpbmcgMHgleCB0byAweCV4XG4iLHZhbCwgcmVnKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIERQUklOVEsoRFBDUkFQLCJ3cml0aW5nIDB4JTA0eCAgdG8gIDB4JTAyeFxuIiwgdmFsLCByZWcpOworCisgICAgbTNfb3V0dyhjYXJkLCB2YWwsIDB4MzIpOworICAgIG0zX291dGIoY2FyZCwgcmVnICYgMHg3ZiwgMHgzMCk7CitvdXQ6CisgICAgc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7Cit9CisvKiBPU1MgL2Rldi9taXhlciBmaWxlIG9wZXJhdGlvbiBtZXRob2RzICovCitzdGF0aWMgaW50IG0zX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIHVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisgICAgc3RydWN0IG0zX2NhcmQgKmNhcmQgPSBkZXZzOworCisgICAgZm9yIChjYXJkID0gZGV2czsgY2FyZCAhPSBOVUxMOyBjYXJkID0gY2FyZC0+bmV4dCkgeworICAgICAgICBpZigoY2FyZC0+YWM5NyAhPSBOVUxMKSAmJiAoY2FyZC0+YWM5Ny0+ZGV2X21peGVyID09IG1pbm9yKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWNhcmQpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZC0+YWM5NzsKKworICAgIHJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBtM19yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtM19pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICBzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKyAgICByZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG0zX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgID0gbm9fbGxzZWVrLAorCS5pb2N0bAkgPSBtM19pb2N0bF9taXhkZXYsCisJLm9wZW4JID0gbTNfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UgPSBtM19yZWxlYXNlX21peGRldiwKK307CisKK3N0YXRpYyB2b2lkIHJlbW90ZV9jb2RlY19jb25maWcoaW50IGlvLCBpbnQgaXNyZW1vdGUpCit7CisgICAgaXNyZW1vdGUgPSBpc3JlbW90ZSA/IDEgOiAwOworCisgICAgb3V0dyggIChpbncoaW8gKyBSSU5HX0JVU19DVFJMX0IpICYgflNFQ09ORF9DT0RFQ19JRF9NQVNLKSB8IGlzcmVtb3RlLAorICAgICAgICAgICAgaW8gKyBSSU5HX0JVU19DVFJMX0IpOworICAgIG91dHcoICAoaW53KGlvICsgU0RPX09VVF9ERVNUX0NUUkwpICYgfkNPTU1BTkRfQUREUl9PVVQpIHwgaXNyZW1vdGUsCisgICAgICAgICAgICBpbyArIFNET19PVVRfREVTVF9DVFJMKTsKKyAgICBvdXR3KCAgKGludyhpbyArIFNET19JTl9ERVNUX0NUUkwpICYgflNUQVRVU19BRERSX0lOKSB8IGlzcmVtb3RlLAorICAgICAgICAgICAgaW8gKyBTRE9fSU5fREVTVF9DVFJMKTsKK30KKworLyogCisgKiBoYWNrLCByZXR1cm5zIG5vbiB6ZXJvIG9uIGVyciAKKyAqLworc3RhdGljIGludCB0cnlfcmVhZF92ZW5kb3Ioc3RydWN0IG0zX2NhcmQgKmNhcmQpCit7CisgICAgdTE2IHJldDsKKworICAgIGlmKG0zX2FjOTdfd2FpdChjYXJkKSkgCisgICAgICAgIHJldHVybiAxOworCisgICAgbTNfb3V0YihjYXJkLCAweDgwIHwgKEFDOTdfVkVORE9SX0lEMSAmIDB4N2YpLCAweDMwKTsKKworICAgIGlmKG0zX2FjOTdfd2FpdChjYXJkKSkgCisgICAgICAgIHJldHVybiAxOworCisgICAgcmV0ID0gIG0zX2ludyhjYXJkLCAweDMyKTsKKworICAgIHJldHVybiAocmV0ID09IDApIHx8IChyZXQgPT0gMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQgbTNfY29kZWNfcmVzZXQoc3RydWN0IG0zX2NhcmQgKmNhcmQsIGludCBidXN5d2FpdCkKK3sKKyAgICB1MTYgZGlyOworICAgIGludCBkZWxheTEgPSAwLCBkZWxheTIgPSAwLCBpOworICAgIGludCBpbyA9IGNhcmQtPmlvYmFzZTsKKworICAgIHN3aXRjaCAoY2FyZC0+Y2FyZF90eXBlKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIHRoZSBvbmJvYXJkIGNvZGVjIG9uIHRoZSBhbGxlZ3JvIHNlZW1zIAorICAgICAgICAgKiB0byB3YW50IHRvIHdhaXQgYSB2ZXJ5IGxvbmcgdGltZSBiZWZvcmUKKyAgICAgICAgICogY29taW5nIGJhY2sgdG8gbGlmZSAKKyAgICAgICAgICovCisgICAgICAgIGNhc2UgRVNTX0FMTEVHUk86CisgICAgICAgICAgICBkZWxheTEgPSA1MDsKKyAgICAgICAgICAgIGRlbGF5MiA9IDgwMDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVNTX01BRVNUUk8zOgorICAgICAgICBjYXNlIEVTU19NQUVTVFJPM0hXOgorICAgICAgICAgICAgZGVsYXkxID0gMjA7CisgICAgICAgICAgICBkZWxheTIgPSA1MDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IDU7IGkgKyspIHsKKyAgICAgICAgZGlyID0gaW53KGlvICsgR1BJT19ESVJFQ1RJT04pOworICAgICAgICBkaXIgfD0gMHgxMDsgLyogYXNzdW1pbmcgcGNpIGJ1cyBtYXN0ZXI/ICovCisKKyAgICAgICAgcmVtb3RlX2NvZGVjX2NvbmZpZyhpbywgMCk7CisKKyAgICAgICAgb3V0dyhJT19TUkFNX0VOQUJMRSwgaW8gKyBSSU5HX0JVU19DVFJMX0EpOworICAgICAgICB1ZGVsYXkoMjApOworCisgICAgICAgIG91dHcoZGlyICYgfkdQT19QUklNQVJZX0FDOTcgLCBpbyArIEdQSU9fRElSRUNUSU9OKTsKKyAgICAgICAgb3V0dyh+R1BPX1BSSU1BUllfQUM5NyAsIGlvICsgR1BJT19NQVNLKTsKKyAgICAgICAgb3V0dygwLCBpbyArIEdQSU9fREFUQSk7CisgICAgICAgIG91dHcoZGlyIHwgR1BPX1BSSU1BUllfQUM5NywgaW8gKyBHUElPX0RJUkVDVElPTik7CisKKyAgICAgICAgaWYoYnVzeXdhaXQpICB7CisgICAgICAgICAgICBtZGVsYXkoZGVsYXkxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgIHNjaGVkdWxlX3RpbWVvdXQoKGRlbGF5MSAqIEhaKSAvIDEwMDApOworICAgICAgICB9CisKKyAgICAgICAgb3V0dyhHUE9fUFJJTUFSWV9BQzk3LCBpbyArIEdQSU9fREFUQSk7CisgICAgICAgIHVkZWxheSg1KTsKKyAgICAgICAgLyogb2ssIGJyaW5nIGJhY2sgdGhlIGFjLWxpbmsgKi8KKyAgICAgICAgb3V0dyhJT19TUkFNX0VOQUJMRSB8IFNFUklBTF9BQ19MSU5LX0VOQUJMRSwgaW8gKyBSSU5HX0JVU19DVFJMX0EpOworICAgICAgICBvdXR3KH4wLCBpbyArIEdQSU9fTUFTSyk7CisKKyAgICAgICAgaWYoYnVzeXdhaXQpIHsKKyAgICAgICAgICAgIG1kZWxheShkZWxheTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworICAgICAgICAgICAgc2NoZWR1bGVfdGltZW91dCgoZGVsYXkyICogSFopIC8gMTAwMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoISB0cnlfcmVhZF92ZW5kb3IoY2FyZCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWxheTEgKz0gMTA7CisgICAgICAgIGRlbGF5MiArPSAxMDA7CisKKyAgICAgICAgRFBSSU5USyhEUE1PRCwgInJldHJ5aW5nIGNvZGVjIHJlc2V0IHdpdGggZGVsYXlzIG9mICVkIGFuZCAlZCBtc1xuIiwKKyAgICAgICAgICAgICAgICBkZWxheTEsIGRlbGF5Mik7CisgICAgfQorCisjaWYgMAorICAgIC8qIG1vcmUgZ3VuZy1obyByZXNldCB0aGF0IGRvZXNuJ3QKKyAgICAgKiBzZWVtIHRvIHdvcmsgYW55d2hlcmUgOikKKyAgICAgKi8KKyAgICB0bXAgPSBpbncoaW8gKyBSSU5HX0JVU19DVFJMX0EpOworICAgIG91dHcoUkFDX1NERlNfRU5BQkxFfExBQ19TREZTX0VOQUJMRSwgaW8gKyBSSU5HX0JVU19DVFJMX0EpOworICAgIG1kZWxheSgyMCk7CisgICAgb3V0dyh0bXAsIGlvICsgUklOR19CVVNfQ1RSTF9BKTsKKyAgICBtZGVsYXkoNTApOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG0zX2NvZGVjX2luc3RhbGwoc3RydWN0IG0zX2NhcmQgKmNhcmQpCit7CisgICAgc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCisgICAgaWYgKChjb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisKKyAgICBjb2RlYy0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKyAgICBjb2RlYy0+Y29kZWNfcmVhZCA9IG0zX2FjOTdfcmVhZDsKKyAgICBjb2RlYy0+Y29kZWNfd3JpdGUgPSBtM19hYzk3X3dyaXRlOworICAgIC8qIHNvbWVkYXkgd2Ugc2hvdWxkIHN1cHBvcnQgc2Vjb25kYXJ5IGNvZGVjcy4uICovCisgICAgY29kZWMtPmlkID0gMDsKKworICAgIGlmIChhYzk3X3Byb2JlX2NvZGVjKGNvZGVjKSA9PSAwKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiBQRlggImNvZGVjIHByb2JlIGZhaWxlZFxuIik7CisgICAgICAgIGFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKGNvZGVjLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmbTNfbWl4ZXJfZm9wcywgLTEpKSA8IDApIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiY291bGRuJ3QgcmVnaXN0ZXIgbWl4ZXIhXG4iKTsKKyAgICAgICAgYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNhcmQtPmFjOTcgPSBjb2RlYzsKKworICAgIHJldHVybiAwOworfQorCisKKyNkZWZpbmUgTUlOSVNSQ19MUEZfTEVOIDEwCitzdGF0aWMgdTE2IG1pbmlzcmNfbHBmW01JTklTUkNfTFBGX0xFTl0gPSB7CisgICAgMFgwNzQzLCAwWDExMDQsIDBYMEE0QywgMFhGODhELCAwWDI0MkMsCisgICAgMFgxMDIzLCAwWDFBQTksIDBYMEI2MCwgMFhFRkRELCAwWDE4NkYKK307CitzdGF0aWMgdm9pZCBtM19hc3NwX2luaXQoc3RydWN0IG0zX2NhcmQgKmNhcmQpCit7CisgICAgaW50IGk7CisKKyAgICAvKiB6ZXJvIGtlcm5lbCBkYXRhICovCisgICAgZm9yKGkgPSAwIDsgaSA8IChSRVZfQl9EQVRBX01FTU9SWV9VTklUX0xFTkdUSCAqIE5VTV9VTklUU19LRVJORUxfREFUQSkgLyAyOyBpKyspCisgICAgICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLCAKKyAgICAgICAgICAgICAgICBLREFUQV9CQVNFX0FERFIgKyBpLCAwKTsKKworICAgIC8qIHplcm8gbWl4ZXIgZGF0YT8gKi8KKyAgICBmb3IoaSA9IDAgOyBpIDwgKFJFVl9CX0RBVEFfTUVNT1JZX1VOSVRfTEVOR1RIICogTlVNX1VOSVRTX0tFUk5FTF9EQVRBKSAvIDI7IGkrKykKKyAgICAgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsIAorICAgICAgICAgICAgICAgIEtEQVRBX0JBU0VfQUREUjIgKyBpLCAwKTsKKworICAgIC8qIGluaXQgZG1hIHBvaW50ZXIgKi8KKyAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwgCisgICAgICAgICAgICBLREFUQV9DVVJSRU5UX0RNQSwgCisgICAgICAgICAgICBLREFUQV9ETUFfWEZFUjApOworCisgICAgLyogd3JpdGUga2VybmVsIGludG8gY29kZSBtZW1vcnkuLiAqLworICAgIGZvcihpID0gMCA7IGkgPCBzaXplb2YoYXNzcF9rZXJuZWxfaW1hZ2UpIC8gMjsgaSsrKSB7CisgICAgICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9DT0RFLCAKKyAgICAgICAgICAgICAgICBSRVZfQl9DT0RFX01FTU9SWV9CRUdJTiArIGksIAorICAgICAgICAgICAgICAgIGFzc3Bfa2VybmVsX2ltYWdlW2ldKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdlIG9ubHkgaGF2ZSB0aGlzIG9uZSBjbGllbnQgYW5kIHdlIGtub3cgdGhhdCAweDQwMAorICAgICAqIGlzIGZyZWUgaW4gb3VyIGtlcm5lbCdzIG1lbSBtYXAsIHNvIGxldHMganVzdAorICAgICAqIGRyb3AgaXQgdGhlcmUuICBJdCBzZWVtcyB0aGF0IHRoZSBtaW5pc3JjIGRvZXNuJ3QKKyAgICAgKiBuZWVkIHZlY3RvcnMsIHNvIHdlIHdvbid0IGJvdGhlciB3aXRoIHRoZW0uLgorICAgICAqLworICAgIGZvcihpID0gMCA7IGkgPCBzaXplb2YoYXNzcF9taW5pc3JjX2ltYWdlKSAvIDI7IGkrKykgeworICAgICAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfQ09ERSwgCisgICAgICAgICAgICAgICAgMHg0MDAgKyBpLCAKKyAgICAgICAgICAgICAgICBhc3NwX21pbmlzcmNfaW1hZ2VbaV0pOworICAgIH0KKworICAgIC8qCisgICAgICogd3JpdGUgdGhlIGNvZWZmaWNpZW50cyBmb3IgdGhlIGxvdyBwYXNzIGZpbHRlcj8KKyAgICAgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBNSU5JU1JDX0xQRl9MRU4gOyBpKyspIHsKKyAgICAgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0NPREUsCisgICAgICAgICAgICAweDQwMCArIE1JTklTUkNfQ09FRl9MT0MgKyBpLAorICAgICAgICAgICAgbWluaXNyY19scGZbaV0pOworICAgIH0KKworICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9DT0RFLAorICAgICAgICAweDQwMCArIE1JTklTUkNfQ09FRl9MT0MgKyBNSU5JU1JDX0xQRl9MRU4sCisgICAgICAgIDB4ODAwMCk7CisKKyAgICAvKgorICAgICAqIHRoZSBtaW5pc3JjIGlzIHRoZSBvbmx5IHRoaW5nIG9uCisgICAgICogb3VyIHRhc2sgbGlzdC4uCisgICAgICovCisgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsIAorICAgICAgICAgICAgS0RBVEFfVEFTSzAsIAorICAgICAgICAgICAgMHg0MDApOworCisgICAgLyoKKyAgICAgKiBpbml0IHRoZSBtaXhlciBudW1iZXIuLgorICAgICAqLworCisgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBLREFUQV9NSVhFUl9UQVNLX05VTUJFUiwwKTsKKworICAgIC8qCisgICAgICogRVhUUkVNRSBLRVJORUwgTUFTVEVSIFZPTFVNRQorICAgICAqLworICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBLREFUQV9EQUNfTEVGVF9WT0xVTUUsIEFSQl9WT0xVTUUpOworICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBLREFUQV9EQUNfUklHSFRfVk9MVU1FLCBBUkJfVk9MVU1FKTsKKworICAgIGNhcmQtPm1peGVyX2xpc3QubWVtX2FkZHIgPSBLREFUQV9NSVhFUl9YRkVSMDsKKyAgICBjYXJkLT5taXhlcl9saXN0Lm1heCA9IE1BWF9WSVJUVUFMX01JWEVSX0NIQU5ORUxTOworICAgIGNhcmQtPmFkYzFfbGlzdC5tZW1fYWRkciA9IEtEQVRBX0FEQzFfWEZFUjA7CisgICAgY2FyZC0+YWRjMV9saXN0Lm1heCA9IE1BWF9WSVJUVUFMX0FEQzFfQ0hBTk5FTFM7CisgICAgY2FyZC0+ZG1hX2xpc3QubWVtX2FkZHIgPSBLREFUQV9ETUFfWEZFUjA7CisgICAgY2FyZC0+ZG1hX2xpc3QubWF4ID0gTUFYX1ZJUlRVQUxfRE1BX0NIQU5ORUxTOworICAgIGNhcmQtPm1zcmNfbGlzdC5tZW1fYWRkciA9IEtEQVRBX0lOU1RBTkNFMF9NSU5JU1JDOworICAgIGNhcmQtPm1zcmNfbGlzdC5tYXggPSBNQVhfSU5TVEFOQ0VfTUlOSVNSQzsKK30KKworc3RhdGljIGludCBzZXR1cF9tc3JjKHN0cnVjdCBtM19jYXJkICpjYXJkLAorICAgICAgICBzdHJ1Y3QgYXNzcF9pbnN0YW5jZSAqaW5zdCwgaW50IGluZGV4KQoreworICAgIGludCBkYXRhX2J5dGVzID0gMiAqICggTUlOSVNSQ19UTVBfQlVGRkVSX1NJWkUgLyAyICsgCisgICAgICAgICAgICBNSU5JU1JDX0lOX0JVRkZFUl9TSVpFIC8gMiArCisgICAgICAgICAgICAxICsgTUlOSVNSQ19PVVRfQlVGRkVSX1NJWkUgLyAyICsgMSApOworICAgIGludCBhZGRyZXNzLCBpOworCisgICAgLyoKKyAgICAgKiB0aGUgcmV2YiBtZW1vcnkgbWFwIGhhcyAweDExMDAgdGhyb3VnaCAweDFjMDAKKyAgICAgKiBmcmVlLiAgCisgICAgICovCisKKyAgICAvKgorICAgICAqIGFsaWduIGluc3RhbmNlIGFkZHJlc3MgdG8gMjU2IGJ5dGVzIHNvIHRoYXQgaXQncworICAgICAqIHNoaWZ0ZWQgbGlzdCBhZGRyZXNzIGlzIGFsaWduZWQuICAKKyAgICAgKiBsaXN0IGFkZHJlc3MgPSAobWVtIGFkZHJlc3MgPj4gMSkgPj4gNzsKKyAgICAgKi8KKyAgICBkYXRhX2J5dGVzID0gKGRhdGFfYnl0ZXMgKyAyNTUpICYgfjI1NTsKKyAgICBhZGRyZXNzID0gMHgxMTAwICsgKChkYXRhX2J5dGVzLzIpICogaW5kZXgpOworCisgICAgaWYoKGFkZHJlc3MgKyAoZGF0YV9ieXRlcy8yKSkgPj0gMHgxYzAwKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiBQRlggIm5vIG1lbW9yeSBmb3IgJWQgYnl0ZXMgYXQgaW5kICVkIChhZGRyIDB4JXgpXG4iLAorICAgICAgICAgICAgICAgIGRhdGFfYnl0ZXMsIGluZGV4LCBhZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IGRhdGFfYnl0ZXMvMiA7IGkrKykgCisgICAgICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgICAgIGFkZHJlc3MgKyBpLCAwKTsKKworICAgIGluc3QtPmNvZGUgPSAweDQwMDsKKyAgICBpbnN0LT5kYXRhID0gYWRkcmVzczsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG0zX2Fzc3BfY2xpZW50X2luaXQoc3RydWN0IG0zX3N0YXRlICpzKQoreworICAgIHNldHVwX21zcmMocy0+Y2FyZCwgJihzLT5kYWNfaW5zdCksIHMtPmluZGV4ICogMik7CisgICAgc2V0dXBfbXNyYyhzLT5jYXJkLCAmKHMtPmFkY19pbnN0KSwgKHMtPmluZGV4ICogMikgKyAxKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtM19hbXBfZW5hYmxlKHN0cnVjdCBtM19jYXJkICpjYXJkLCBpbnQgZW5hYmxlKQoreworICAgIC8qIAorICAgICAqIHRoaXMgd29ya3MgZm9yIHRoZSByZWZlcmVuY2UgYm9hcmQsIGhhdmUgdG8gZmluZAorICAgICAqIG91dCBhYm91dCBvdGhlcnMKKyAgICAgKgorICAgICAqIHRoaXMgbmVlZHMgbW9yZSBtYWdpYyBmb3IgNCBzcGVha2VyLCBidXQuLgorICAgICAqLworICAgIGludCBpbyA9IGNhcmQtPmlvYmFzZTsKKyAgICB1MTYgZ3BvLCBwb2xhcml0eV9wb3J0LCBwb2xhcml0eTsKKworICAgIGlmKCFleHRlcm5hbF9hbXApCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChncGlvX3BpbiA+PSAwICAmJiBncGlvX3BpbiA8PSAxNSkgeworICAgICAgICBwb2xhcml0eV9wb3J0ID0gMHgxMDAwICsgKDB4MTAwICogZ3Bpb19waW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoY2FyZC0+Y2FyZF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIEVTU19BTExFR1JPOgorICAgICAgICAgICAgICAgIHBvbGFyaXR5X3BvcnQgPSAweDE4MDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHBvbGFyaXR5X3BvcnQgPSAweDExMDA7CisgICAgICAgICAgICAgICAgLyogUGFuYXNvbmljIHRvdWdoYm9vayBDRjcyIGhhcyB0byBiZSBkaWZmZXJlbnQuLi4gKi8KKyAgICAgICAgICAgICAgICBpZihjYXJkLT5wY2lkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMEY3ICYmIGNhcmQtPnBjaWRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDgzM0QpCisgICAgICAgICAgICAgICAgCXBvbGFyaXR5X3BvcnQgPSAweDFEMDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBncG8gPSAocG9sYXJpdHlfcG9ydCA+PiA4KSAmIDB4MEY7CisgICAgcG9sYXJpdHkgPSBwb2xhcml0eV9wb3J0ID4+IDEyOworICAgIGlmICggZW5hYmxlICkKKyAgICAgICAgcG9sYXJpdHkgPSAhcG9sYXJpdHk7CisgICAgcG9sYXJpdHkgPSBwb2xhcml0eSA8PCBncG87CisgICAgZ3BvID0gMSA8PCBncG87CisKKyAgICBvdXR3KH5ncG8gLCBpbyArIEdQSU9fTUFTSyk7CisKKyAgICBvdXR3KCBpbncoaW8gKyBHUElPX0RJUkVDVElPTikgfCBncG8gLAorICAgICAgICAgICAgaW8gKyBHUElPX0RJUkVDVElPTik7CisKKyAgICBvdXR3KCAoR1BPX1NFQ09OREFSWV9BQzk3IHwgR1BPX1BSSU1BUllfQUM5NyB8IHBvbGFyaXR5KSAsCisgICAgICAgICAgICBpbyArIEdQSU9fREFUQSk7CisKKyAgICBvdXR3KDB4ZmZmZiAsIGlvICsgR1BJT19NQVNLKTsKK30KKworc3RhdGljIGludAorbWFlc3Ryb19jb25maWcoc3RydWN0IG0zX2NhcmQgKmNhcmQpIAoreworICAgIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjYXJkLT5wY2lkZXY7CisgICAgdTMyIG47CisgICAgdTggIHQ7IC8qIG1ha2VzIGFzIG11Y2ggc2Vuc2UgYXMgJ24nLCBubz8gKi8KKworICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9BTExFR1JPX0NPTkZJRywgJm4pOworICAgIG4gJj0gUkVEVUNFRF9ERUJPVU5DRTsKKyAgICBuIHw9IFBNX0NUUkxfRU5BQkxFIHwgQ0xLX0RJVl9CWV80OSB8IFVTRV9QQ0lfVElNSU5HOworICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQUxMRUdST19DT05GSUcsIG4pOworCisgICAgb3V0YihSRVNFVF9BU1NQLCBjYXJkLT5pb2Jhc2UgKyBBU1NQX0NPTlRST0xfQik7CisgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0FMTEVHUk9fQ09ORklHLCAmbik7CisgICAgbiAmPSB+SU5UX0NMS19TRUxFQ1Q7CisgICAgaWYoY2FyZC0+Y2FyZF90eXBlID49IEVTU19NQUVTVFJPMykgIHsKKyAgICAgICAgbiAmPSB+SU5UX0NMS19NVUxUX0VOQUJMRTsgCisgICAgICAgIG4gfD0gSU5UX0NMS19TUkNfTk9UX1BDSTsKKyAgICB9CisgICAgbiAmPSAgfiggQ0xLX01VTFRfTU9ERV9TRUxFQ1QgfCBDTEtfTVVMVF9NT0RFX1NFTEVDVF8yICk7CisgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9BTExFR1JPX0NPTkZJRywgbik7CisKKyAgICBpZihjYXJkLT5jYXJkX3R5cGUgPD0gRVNTX0FMTEVHUk8pIHsKKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX1VTRVJfQ09ORklHLCAmbik7CisgICAgICAgIG4gfD0gSU5fQ0xLXzEyTUhaX1NFTEVDVDsKKyAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9VU0VSX0NPTkZJRywgbik7CisgICAgfQorCisgICAgdCA9IGluYihjYXJkLT5pb2Jhc2UgKyBBU1NQX0NPTlRST0xfQSk7CisgICAgdCAmPSB+KCBEU1BfQ0xLXzM2TUhaX1NFTEVDVCAgfCBBU1NQX0NMS180OU1IWl9TRUxFQ1QpOworICAgIHQgfD0gQVNTUF9DTEtfNDlNSFpfU0VMRUNUOworICAgIHQgfD0gQVNTUF8wX1dTX0VOQUJMRTsgCisgICAgb3V0Yih0LCBjYXJkLT5pb2Jhc2UgKyBBU1NQX0NPTlRST0xfQSk7CisKKyAgICBvdXRiKFJVTl9BU1NQLCBjYXJkLT5pb2Jhc2UgKyBBU1NQX0NPTlRST0xfQik7IAorCisgICAgcmV0dXJuIDA7Cit9IAorCitzdGF0aWMgdm9pZCBtM19lbmFibGVfaW50cyhzdHJ1Y3QgbTNfY2FyZCAqY2FyZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGlvID0gY2FyZC0+aW9iYXNlOworCisgICAgb3V0dyhBU1NQX0lOVF9FTkFCTEUsIGlvICsgSE9TVF9JTlRfQ1RSTCk7CisgICAgb3V0YihpbmIoaW8gKyBBU1NQX0NPTlRST0xfQykgfCBBU1NQX0hPU1RfSU5UX0VOQUJMRSwKKyAgICAgICAgICAgIGlvICsgQVNTUF9DT05UUk9MX0MpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtM19hdWRpb19mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCSA9IG5vX2xsc2VlaywKKwkucmVhZAkgPSBtM19yZWFkLAorCS53cml0ZQkgPSBtM193cml0ZSwKKwkucG9sbAkgPSBtM19wb2xsLAorCS5pb2N0bAkgPSBtM19pb2N0bCwKKwkubW1hcAkgPSBtM19tbWFwLAorCS5vcGVuCSA9IG0zX29wZW4sCisJLnJlbGVhc2UgPSBtM19yZWxlYXNlLAorfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhbGxvY19kc3Bfc3VzcGVuZG1lbShzdHJ1Y3QgbTNfY2FyZCAqY2FyZCkKK3sKKyAgICBpbnQgbGVuID0gc2l6ZW9mKHUxNikgKiAoUkVWX0JfQ09ERV9NRU1PUllfTEVOR1RIICsgUkVWX0JfREFUQV9NRU1PUllfTEVOR1RIKTsKKworICAgIGlmKCAoY2FyZC0+c3VzcGVuZF9tZW0gPSB2bWFsbG9jKGxlbikpID09IE5VTEwpCisgICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBmcmVlX2RzcF9zdXNwZW5kbWVtKHN0cnVjdCBtM19jYXJkICpjYXJkKQoreworICAgaWYoY2FyZC0+c3VzcGVuZF9tZW0pCisgICAgICAgdmZyZWUoY2FyZC0+c3VzcGVuZF9tZW0pOworfQorCisjZWxzZQorI2RlZmluZSBhbGxvY19kc3Bfc3VzcGVuZG1lbShhcmdzLi4uKSAwCisjZGVmaW5lIGZyZWVfZHNwX3N1c3BlbmRtZW0oYXJncy4uLikgCisjZW5kaWYKKworLyoKKyAqIGdyZWF0IGRheSEgIHRoaXMgZnVuY3Rpb24gaXMgdWdseSBhcyBoZWxsLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtM19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKyAgICB1MzIgbjsKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgbTNfY2FyZCAqY2FyZCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGNhcmRfdHlwZSA9IHBjaV9pZC0+ZHJpdmVyX2RhdGE7CisKKyAgICBEUFJJTlRLKERQTU9ELCAiaW4gbWFlc3Ryb19pbnN0YWxsXG4iKTsKKworICAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU87CisKKyAgICBpZiAocGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCBNM19QQ0lfRE1BX01BU0spKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiBQRlggImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IGxpbWl0aW5nIHRvIDI4Yml0IFBDSSBidXMgYWRkcmVzc2VzXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgICAgICAKKyAgICBwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKworICAgIGlmKCAoY2FyZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtM19jYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIm91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisgICAgbWVtc2V0KGNhcmQsIDAsIHNpemVvZihzdHJ1Y3QgbTNfY2FyZCkpOworICAgIGNhcmQtPnBjaWRldiA9IHBjaV9kZXY7CisgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+c3VzcGVuZF9xdWV1ZSk7CisKKyAgICBpZiAoICEgcmVxdWVzdF9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLAorICAgICAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4gKHBjaV9kZXYsIDApLCBNM19NT0RVTEVfTkFNRSkpIHsKKworICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAidW5hYmxlIHRvIHJlc2VydmUgSS9PIHNwYWNlLlxuIik7CisgICAgICAgIHJldCA9IC1FQlVTWTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgY2FyZC0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApOworCisgICAgaWYoYWxsb2NfZHNwX3N1c3BlbmRtZW0oY2FyZCkpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyBQRlggImNvdWxkbid0IGFsbG9jICVkIGJ5dGVzIGZvciBzYXZpbmcgZHNwIHN0YXRlIG9uIHN1c3BlbmRcbiIsCisgICAgICAgICAgICAgICAgUkVWX0JfQ09ERV9NRU1PUllfTEVOR1RIICsgUkVWX0JfREFUQV9NRU1PUllfTEVOR1RIKTsKKyAgICAgICAgcmV0ID0gLUVOT01FTTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgY2FyZC0+Y2FyZF90eXBlID0gY2FyZF90eXBlOworICAgIGNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKKyAgICBjYXJkLT5uZXh0ID0gZGV2czsKKyAgICBjYXJkLT5tYWdpYyA9IE0zX0NBUkRfTUFHSUM7CisgICAgc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOworICAgIHNwaW5fbG9ja19pbml0KCZjYXJkLT5hYzk3X2xvY2spOworICAgIGRldnMgPSBjYXJkOworICAgIGZvcihpID0gMDsgaTxOUl9EU1BTOyBpKyspIHsKKyAgICAgICAgc3RydWN0IG0zX3N0YXRlICpzID0gJihjYXJkLT5jaGFubmVsc1tpXSk7CisgICAgICAgIHMtPmRldl9hdWRpbyA9IC0xOworICAgIH0KKworICAgIHByaW50ayhLRVJOX0lORk8gUEZYICJDb25maWd1cmluZyBFU1MgJXMgZm91bmQgYXQgSU8gMHglMDRYIElSUSAlZFxuIiwgCisgICAgICAgIGNhcmRfbmFtZXNbY2FyZC0+Y2FyZF90eXBlXSwgY2FyZC0+aW9iYXNlLCBjYXJkLT5pcnEpOworCisgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmbik7CisgICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggIiBzdWJ2ZW5kb3IgaWQ6IDB4JTA4eFxuIixuKTsgCisKKyAgICBtYWVzdHJvX2NvbmZpZyhjYXJkKTsKKyAgICBtM19hc3NwX2hhbHQoY2FyZCk7CisKKyAgICBtM19jb2RlY19yZXNldChjYXJkLCAwKTsKKworICAgIGlmKG0zX2NvZGVjX2luc3RhbGwoY2FyZCkpICB7CisgICAgICAgIHJldCA9IC1FSU87IAorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBtM19hc3NwX2luaXQoY2FyZCk7CisgICAgbTNfYW1wX2VuYWJsZShjYXJkLCAxKTsKKyAgICAKKyAgICBmb3IoaT0wO2k8TlJfRFNQUztpKyspIHsKKyAgICAgICAgc3RydWN0IG0zX3N0YXRlICpzPSZjYXJkLT5jaGFubmVsc1tpXTsKKworICAgICAgICBzLT5pbmRleCA9IGk7CisKKyAgICAgICAgcy0+Y2FyZCA9IGNhcmQ7CisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9hZGMud2FpdCk7CisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMud2FpdCk7CisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisgICAgICAgIGluaXRfTVVURVgoJihzLT5vcGVuX3NlbSkpOworICAgICAgICBzLT5tYWdpYyA9IE0zX1NUQVRFX01BR0lDOworCisgICAgICAgIG0zX2Fzc3BfY2xpZW50X2luaXQocyk7CisgICAgICAgIAorICAgICAgICBpZihzLT5kbWFfYWRjLnJlYWR5IHx8IHMtPmRtYV9kYWMucmVhZHkgfHwgcy0+ZG1hX2FkYy5yYXdidWYpCisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiaW5pdGluZyBhIGRzcCBkZXZpY2UgdGhhdCBpcyBhbHJlYWR5IGluIHVzZT9cbiIpOworICAgICAgICAvKiByZWdpc3RlciBkZXZpY2VzICovCisgICAgICAgIGlmICgocy0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZtM19hdWRpb19mb3BzLCAtMSkpIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggYWxsb2NhdGVfZG1hYnVmKGNhcmQtPnBjaWRldiwgJihzLT5kbWFfYWRjKSkgfHwKKyAgICAgICAgICAgICAgICBhbGxvY2F0ZV9kbWFidWYoY2FyZC0+cGNpZGV2LCAmKHMtPmRtYV9kYWMpKSkgIHsgCisgICAgICAgICAgICByZXQgPSAtRU5PTUVNOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCBtM19pbnRlcnJ1cHQsIFNBX1NISVJRLCBjYXJkX25hbWVzW2NhcmQtPmNhcmRfdHlwZV0sIGNhcmQpKSB7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZCxcbiIsIGNhcmQtPmlycSk7CisKKyAgICAgICAgcmV0ID0gLUVJTzsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIGNhcmQpOworICAgIAorICAgIG0zX2VuYWJsZV9pbnRzKGNhcmQpOworICAgIG0zX2Fzc3BfY29udGludWUoY2FyZCk7CisKK291dDoKKyAgICBpZihyZXQpIHsKKyAgICAgICAgaWYoY2FyZC0+aW9iYXNlKQorICAgICAgICAgICAgcmVsZWFzZV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKKyAgICAgICAgZnJlZV9kc3Bfc3VzcGVuZG1lbShjYXJkKTsKKyAgICAgICAgaWYoY2FyZC0+YWM5NykgeworICAgICAgICAgICAgdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3LT5kZXZfbWl4ZXIpOworICAgICAgICAgICAga2ZyZWUoY2FyZC0+YWM5Nyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGk9MDtpPE5SX0RTUFM7aSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgbTNfc3RhdGUgKnMgPSAmY2FyZC0+Y2hhbm5lbHNbaV07CisgICAgICAgICAgICBpZihzLT5kZXZfYXVkaW8gIT0gLTEpCisgICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKyAgICAgICAgfQorICAgICAgICBrZnJlZShjYXJkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OyAKK30KKworc3RhdGljIHZvaWQgbTNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworICAgIHN0cnVjdCBtM19jYXJkICpjYXJkOworCisgICAgdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJm0zX3JlYm9vdF9uYik7CisKKyAgICB3aGlsZSAoKGNhcmQgPSBkZXZzKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZGV2cyA9IGRldnMtPm5leHQ7CisgICAgCisgICAgICAgIGZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisgICAgICAgIHVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5Ny0+ZGV2X21peGVyKTsKKyAgICAgICAga2ZyZWUoY2FyZC0+YWM5Nyk7CisKKyAgICAgICAgZm9yKGk9MDtpPE5SX0RTUFM7aSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgbTNfc3RhdGUgKnMgPSAmY2FyZC0+Y2hhbm5lbHNbaV07CisgICAgICAgICAgICBpZihzLT5kZXZfYXVkaW8gPCAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworICAgICAgICAgICAgZnJlZV9kbWFidWYoY2FyZC0+cGNpZGV2LCAmcy0+ZG1hX2FkYyk7CisgICAgICAgICAgICBmcmVlX2RtYWJ1ZihjYXJkLT5wY2lkZXYsICZzLT5kbWFfZGFjKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2KTsKKyAgICAgICAgZnJlZV9kc3Bfc3VzcGVuZG1lbShjYXJkKTsKKyAgICAgICAga2ZyZWUoY2FyZCk7CisgICAgfQorICAgIGRldnMgPSBOVUxMOworfQorCisvKgorICogc29tZSBiaW9zZXMgbGlrZSB0aGUgc291bmQgY2hpcCB0byBiZSBwb3dlcmVkIGRvd24KKyAqIGF0IHNodXRkb3duLiAgV2UncmUganVzdCBjYWxsaW5nIF9zdXNwZW5kIHRvCisgKiBhY2hpZXZlIHRoYXQuLgorICovCitzdGF0aWMgaW50IG0zX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmJ1ZikKK3sKKyAgICBzdHJ1Y3QgbTNfY2FyZCAqY2FyZDsKKworICAgIERQUklOVEsoRFBNT0QsICJub3RpZmllciBzdXNwZW5kaW5nIGFsbCBjYXJkc1xuIik7CisKKyAgICBmb3IoY2FyZCA9IGRldnM7IGNhcmQgIT0gTlVMTDsgY2FyZCA9IGNhcmQtPm5leHQpIHsKKyAgICAgICAgaWYoIWNhcmQtPmluX3N1c3BlbmQpCisgICAgICAgICAgICBtM19zdXNwZW5kKGNhcmQtPnBjaWRldiwgUE1TR19TVVNQRU5EKTsgLyogWFhYIGxlZ2FsPyAqLworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtM19zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgbTNfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKworICAgIC8qIG11c3QgYmUgYSBiZXR0ZXIgd2F5Li4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisgICAgRFBSSU5USyhEUE1PRCwgInBtIGluIGRldiAlcFxuIixjYXJkKTsKKworICAgIGZvcihpPTA7aTxOUl9EU1BTO2krKykgeworICAgICAgICBzdHJ1Y3QgbTNfc3RhdGUgKnMgPSAmY2FyZC0+Y2hhbm5lbHNbaV07CisKKyAgICAgICAgaWYocy0+ZGV2X2F1ZGlvID09IC0xKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgRFBSSU5USyhEUE1PRCwgInN0b3BfYWRjL2RhYygpIGRldmljZSAlZFxuIixpKTsKKyAgICAgICAgc3RvcF9kYWMocyk7CisgICAgICAgIHN0b3BfYWRjKHMpOworICAgIH0KKworICAgIG1kZWxheSgxMCk7IC8qIGdpdmUgdGhlIGFzc3AgYSBjaGFuY2UgdG8gaWRsZS4uICovCisKKyAgICBtM19hc3NwX2hhbHQoY2FyZCk7CisKKyAgICBpZihjYXJkLT5zdXNwZW5kX21lbSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworCisgICAgICAgIERQUklOVEsoRFBNT0QsICJzYXZpbmcgY29kZVxuIik7CisgICAgICAgIGZvcihpID0gUkVWX0JfQ09ERV9NRU1PUllfQkVHSU4gOyBpIDw9IFJFVl9CX0NPREVfTUVNT1JZX0VORDsgaSsrKQorICAgICAgICAgICAgY2FyZC0+c3VzcGVuZF9tZW1baW5kZXgrK10gPSAKKyAgICAgICAgICAgICAgICBtM19hc3NwX3JlYWQoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9DT0RFLCBpKTsKKyAgICAgICAgRFBSSU5USyhEUE1PRCwgInNhdmluZyBkYXRhXG4iKTsKKyAgICAgICAgZm9yKGkgPSBSRVZfQl9EQVRBX01FTU9SWV9CRUdJTiA7IGkgPD0gUkVWX0JfREFUQV9NRU1PUllfRU5EOyBpKyspCisgICAgICAgICAgICBjYXJkLT5zdXNwZW5kX21lbVtpbmRleCsrXSA9IAorICAgICAgICAgICAgICAgIG0zX2Fzc3BfcmVhZChjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsIGkpOworICAgIH0KKworICAgIERQUklOVEsoRFBNT0QsICJwb3dlcmluZyBkb3duIGFwY2kgcmVnc1xuIik7CisgICAgbTNfb3V0dyhjYXJkLCAweGZmZmYsIDB4NTQpOworICAgIG0zX291dHcoY2FyZCwgMHhmZmZmLCAweDU2KTsKKworICAgIGNhcmQtPmluX3N1c3BlbmQgPSAxOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbTNfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IGluZGV4OworICAgIGludCBpOworICAgIHN0cnVjdCBtM19jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICBjYXJkLT5pbl9zdXNwZW5kID0gMDsKKworICAgIERQUklOVEsoRFBNT0QsICJyZXN1bWluZ1xuIik7CisKKyAgICAvKiBmaXJzdCBsZXRzIGp1c3QgYnJpbmcgZXZlcnl0aGluZyBiYWNrLiAuKi8KKworICAgIERQUklOVEsoRFBNT0QsICJicmluZ2luZyBwb3dlciBiYWNrIG9uIGNhcmQgMHglcFxuIixjYXJkKTsKKyAgICBtM19vdXR3KGNhcmQsIDAsIDB4NTQpOworICAgIG0zX291dHcoY2FyZCwgMCwgMHg1Nik7CisKKyAgICBEUFJJTlRLKERQTU9ELCAicmVzdG9yaW5nIHBjaSBjb25maWdzIGFuZCByZXNldGluZyBjb2RlY1xuIik7CisgICAgbWFlc3Ryb19jb25maWcoY2FyZCk7CisgICAgbTNfYXNzcF9oYWx0KGNhcmQpOworICAgIG0zX2NvZGVjX3Jlc2V0KGNhcmQsIDEpOworCisgICAgRFBSSU5USyhEUE1PRCwgInJlc3RvcmluZyBkc3AgY29kZSBjYXJkXG4iKTsKKyAgICBpbmRleCA9IDA7CisgICAgZm9yKGkgPSBSRVZfQl9DT0RFX01FTU9SWV9CRUdJTiA7IGkgPD0gUkVWX0JfQ09ERV9NRU1PUllfRU5EOyBpKyspCisgICAgICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9DT0RFLCBpLCAKKyAgICAgICAgICAgIGNhcmQtPnN1c3BlbmRfbWVtW2luZGV4KytdKTsKKyAgICBmb3IoaSA9IFJFVl9CX0RBVEFfTUVNT1JZX0JFR0lOIDsgaSA8PSBSRVZfQl9EQVRBX01FTU9SWV9FTkQ7IGkrKykKKyAgICAgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsIGksIAorICAgICAgICAgICAgY2FyZC0+c3VzcGVuZF9tZW1baW5kZXgrK10pOworCisgICAgIC8qIHRlbGwgdGhlIGRtYSBlbmdpbmUgdG8gcmVzdGFydCBpdHNlbGYgKi8KKyAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwgCisgICAgICAgIEtEQVRBX0RNQV9BQ1RJVkUsIDApOworCisgICAgRFBSSU5USyhEUE1PRCwgInJlc3VtaW5nIGRzcFxuIik7CisgICAgbTNfYXNzcF9jb250aW51ZShjYXJkKTsKKworICAgIERQUklOVEsoRFBNT0QsICJlbmFibGluZyBpbnRzXG4iKTsKKyAgICBtM19lbmFibGVfaW50cyhjYXJkKTsKKworICAgIC8qIGJyaW5nIGJhY2sgdGhlIG9sZCBzY2hvb2wgZmxhdm9yICovCisgICAgZm9yKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTIDsgaSsrKSB7CisgICAgICAgIGludCBzdGF0ZSA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2ldOworICAgICAgICBpZiAoIXN1cHBvcnRlZF9taXhlcihjYXJkLT5hYzk3LCBpKSkgCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgY2FyZC0+YWM5Ny0+d3JpdGVfbWl4ZXIoY2FyZC0+YWM5NywgaSwgCisgICAgICAgICAgICAgICAgc3RhdGUgJiAweGZmLCAoc3RhdGUgPj4gOCkgJiAweGZmKTsKKyAgICB9CisKKyAgICBtM19hbXBfZW5hYmxlKGNhcmQsIDEpOworCisgICAgLyogCisgICAgICogbm93IHdlIGZsaXAgb24gdGhlIG11c2ljIAorICAgICAqLworICAgIGZvcihpPTA7aTxOUl9EU1BTO2krKykgeworICAgICAgICBzdHJ1Y3QgbTNfc3RhdGUgKnMgPSAmY2FyZC0+Y2hhbm5lbHNbaV07CisgICAgICAgIGlmKHMtPmRldl9hdWRpbyA9PSAtMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvKgorICAgICAgICAgKiBkYi0+cmVhZHkgbWFrZXMgaXQgc28gdGhlc2UgZ3V5cyBjYW4gYmUKKyAgICAgICAgICogY2FsbGVkIHVuY29uZGl0aW9uYWxseS4uCisgICAgICAgICAqLworICAgICAgICBEUFJJTlRLKERQTU9ELCAidHVybmluZyBvbiBkYWNzIGluZCAlZFxuIixpKTsKKyAgICAgICAgc3RhcnRfZGFjKHMpOyAgICAKKyAgICAgICAgc3RhcnRfYWRjKHMpOyAgICAKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICAvKiAKKyAgICAgKiBhbGwgcmlnaHQsIHdlIHRoaW5rIHRoaW5ncyBhcmUgcmVhZHksIAorICAgICAqIHdha2UgdXAgcGVvcGxlIHdobyB3ZXJlIHVzaW5nIHRoZSBkZXZpY2UgCisgICAgICogd2hlbiB3ZSBzdXNwZW5kZWQKKyAgICAgKi8KKyAgICB3YWtlX3VwKCZjYXJkLT5zdXNwZW5kX3F1ZXVlKTsKKworICAgIHJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJaYWNoIEJyb3duIDx6YWJAemFiYm8ubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFU1MgTWFlc3RybzMvQWxsZWdybyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIE1fREVCVUcKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKKyNlbmRpZgorbW9kdWxlX3BhcmFtKGV4dGVybmFsX2FtcCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShncGlvX3BpbiwgaW50LCAwKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG0zX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJICA9ICJlc3NfbTNfYXVkaW8iLAorCS5pZF90YWJsZSA9IG0zX2lkX3RhYmxlLAorCS5wcm9iZQkgID0gbTNfcHJvYmUsCisJLnJlbW92ZQkgID0gbTNfcmVtb3ZlLAorCS5zdXNwZW5kICA9IG0zX3N1c3BlbmQsCisJLnJlc3VtZQkgID0gbTNfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbTNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyAgICBwcmludGsoS0VSTl9JTkZPIFBGWCAidmVyc2lvbiAiIERSSVZFUl9WRVJTSU9OICIgYnVpbHQgYXQgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIik7CisKKyAgICBpZiAocmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZtM19yZWJvb3RfbmIpKSB7CisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJyZWJvb3Qgbm90aWZpZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAtRU5PREVWOyAvKiA/ICovCisgICAgfQorCisgICAgaWYgKHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm0zX3BjaV9kcml2ZXIpKSB7CisgICAgICAgIHVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZtM19yZWJvb3RfbmIpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtM19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbTNfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG0zX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KG0zX2NsZWFudXBfbW9kdWxlKTsKKwordm9pZCBjaGVja19zdXNwZW5kKHN0cnVjdCBtM19jYXJkICpjYXJkKQoreworICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisgICAgaWYoIWNhcmQtPmluX3N1c3BlbmQpIAorICAgICAgICByZXR1cm47CisKKyAgICBjYXJkLT5pbl9zdXNwZW5kKys7CisgICAgYWRkX3dhaXRfcXVldWUoJmNhcmQtPnN1c3BlbmRfcXVldWUsICZ3YWl0KTsKKyAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisgICAgc2NoZWR1bGUoKTsKKyAgICByZW1vdmVfd2FpdF9xdWV1ZSgmY2FyZC0+c3VzcGVuZF9xdWV1ZSwgJndhaXQpOworICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbWFlc3RybzMuaCBiL3NvdW5kL29zcy9tYWVzdHJvMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZTI5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbWFlc3RybzMuaApAQCAtMCwwICsxLDgyMSBAQAorLyoKKyAqICAgICAgRVNTIFRlY2hub2xvZ3kgYWxsZWdybyBhdWRpbyBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTItMjAwMCAgRG9uIEtpbSAoZG9uLmtpbUBlc3N0ZWNoLmNvbSkKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogICAgICBIYWNrZWQgZm9yIHRoZSBtYWVzdHJvMyBkcml2ZXIgYnkgemFiCisgKi8KKworLy8gQWxsZWdybyBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKKyNkZWZpbmUgUENJX0xFR0FDWV9BVURJT19DVFJMICAgMHg0MAorI2RlZmluZSBTT1VORF9CTEFTVEVSX0VOQUJMRSAgICAweDAwMDAwMDAxCisjZGVmaW5lIEZNX1NZTlRIRVNJU19FTkFCTEUgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0FNRV9QT1JUX0VOQUJMRSAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBNUFU0MDFfSU9fRU5BQkxFICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIE1QVTQwMV9JUlFfRU5BQkxFICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQUxJQVNfMTBCSVRfSU8gICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTQl9ETUFfTUFTSyAgICAgICAgICAgICAweDAwMDAwMEMwCisjZGVmaW5lIFNCX0RNQV8wICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU0JfRE1BXzEgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTQl9ETUFfUiAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFNCX0RNQV8zICAgICAgICAgICAgICAgIDB4MDAwMDAwQzAKKyNkZWZpbmUgU0JfSVJRX01BU0sgICAgICAgICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBTQl9JUlFfNSAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFNCX0lSUV83ICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgU0JfSVJRXzkgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBTQl9JUlFfMTAgICAgICAgICAgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIE1JRElfSVJRX01BU0sgICAgICAgICAgIDB4MDAwMDM4MDAKKyNkZWZpbmUgU0VSSUFMX0lSUV9FTkFCTEUgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBESVNBQkxFX0xFR0FDWSAgICAgICAgICAweDAwMDA4MDAwCisKKyNkZWZpbmUgUENJX0FMTEVHUk9fQ09ORklHICAgICAgMHg1MAorI2RlZmluZSBTQl9BRERSXzI0MCAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE1QVV9BRERSX01BU0sgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgTVBVX0FERFJfMzMwICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNUFVfQUREUl8zMDAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIE1QVV9BRERSXzMyMCAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTVBVX0FERFJfMzQwICAgICAgICAgICAgMHgwMDAwMDAxOAorI2RlZmluZSBVU0VfUENJX1RJTUlORyAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFBPU1RFRF9XUklURV9FTkFCTEUgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRE1BX1BPTElDWV9NQVNLICAgICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBETUFfRERNQSAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIERNQV9URE1BICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRE1BX1BDUENJICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBETUFfV0JETUExNiAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIERNQV9XQkRNQTQgICAgICAgICAgICAgIDB4MDAwMDA1MDAKKyNkZWZpbmUgRE1BX1dCRE1BMiAgICAgICAgICAgICAgMHgwMDAwMDYwMAorI2RlZmluZSBETUFfV0JETUExICAgICAgICAgICAgICAweDAwMDAwNzAwCisjZGVmaW5lIERNQV9TQUZFX0dVQVJEICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSElfUEVSRl9HUF9FTkFCTEUgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBQSUNfU05PT1BfTU9ERV8wICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFBJQ19TTk9PUF9NT0RFXzEgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgU09VTkRCTEFTVEVSX0lSUV9NQVNLICAgMHgwMDAwODAwMAorI2RlZmluZSBSSU5HX0lOX0VOQUJMRSAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFNQRElGX1RFU1RfTU9ERSAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQ0xLX01VTFRfTU9ERV9TRUxFQ1RfMiAgMHgwMDA0MDAwMAorI2RlZmluZSBFRVBST01fV1JJVEVfRU5BQkxFICAgICAweDAwMDgwMDAwCisjZGVmaW5lIENPREVDX0RJUl9JTiAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSFZfQlVUVE9OX0ZST01fR0QgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBSRURVQ0VEX0RFQk9VTkNFICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEhWX0NUUkxfRU5BQkxFICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgU1BESUZfRU5BQkxFICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBDTEtfRElWX1NFTEVDVCAgICAgICAgICAweDA2MDAwMDAwCisjZGVmaW5lIENMS19ESVZfQllfNDggICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0xLX0RJVl9CWV80OSAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBDTEtfRElWX0JZXzUwICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIENMS19ESVZfUkVTRVJWRUQgICAgICAgIDB4MDYwMDAwMDAKKyNkZWZpbmUgUE1fQ1RSTF9FTkFCTEUgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBDTEtfTVVMVF9NT0RFX1NFTEVDVCAgICAweDMwMDAwMDAwCisjZGVmaW5lIENMS19NVUxUX01PREVfU0hJRlQgICAgIDI4CisjZGVmaW5lIENMS19NVUxUX01PREVfMCAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0xLX01VTFRfTU9ERV8xICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBDTEtfTVVMVF9NT0RFXzIgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIENMS19NVUxUX01PREVfMyAgICAgICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgSU5UX0NMS19TRUxFQ1QgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBJTlRfQ0xLX01VTFRfUkVTRVQgICAgICAweDgwMDAwMDAwCisKKy8vIE0zCisjZGVmaW5lIElOVF9DTEtfU1JDX05PVF9QQ0kgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSU5UX0NMS19NVUxUX0VOQUJMRSAgICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIFBDSV9BQ1BJX0NPTlRST0wgICAgICAgIDB4NTQKKyNkZWZpbmUgUENJX0FDUElfRDAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQQ0lfQUNQSV9EMSAgICAgICAgICAgICAweEI0RjcwMDAwCisjZGVmaW5lIFBDSV9BQ1BJX0QyICAgICAgICAgICAgIDB4QjRGN0I0RjcKKworI2RlZmluZSBQQ0lfVVNFUl9DT05GSUcgICAgICAgICAweDU4CisjZGVmaW5lIEVYVF9QQ0lfTUFTVEVSX0VOQUJMRSAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU1BESUZfT1VUX1NFTEVDVCAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBURVNUX1BJTl9ESVJfQ1RSTCAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFDOTdfQ09ERUNfVEVTVCAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgVFJJX1NUQVRFX0JVRkZFUiAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBJTl9DTEtfMTJNSFpfU0VMRUNUICAgICAweDAwMDAwMTAwCisjZGVmaW5lIE1VTFRJX0ZVTkNfRElTQUJMRSAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRVhUX01BU1RFUl9QQUlSX1NFTCAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBQQ0lfTUFTVEVSX1NVUFBPUlQgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFNUT1BfQ0xPQ0tfRU5BQkxFICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRUFQRF9EUklWRV9FTkFCTEUgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBSRVFfVFJJX1NUQVRFX0VOQUJMRSAgICAweDAwMDA0MDAwCisjZGVmaW5lIFJFUV9MT1dfRU5BQkxFICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgTUlESV8xX0VOQUJMRSAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBNSURJXzJfRU5BQkxFICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFNCX0FVRElPX1NZTkMgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgSFZfQ1RSTF9URVNUICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBTT1VOREJMQVNURVJfVEVTVCAgICAgICAweDAwNDAwMDAwCisKKyNkZWZpbmUgUENJX1VTRVJfQ09ORklHX0MgICAgICAgMHg1QworCisjZGVmaW5lIFBDSV9ERE1BX0NUUkwgICAgICAgICAgIDB4NjAKKyNkZWZpbmUgRERNQV9FTkFCTEUgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisKKy8vIEFsbGVncm8gcmVnaXN0ZXJzCisjZGVmaW5lIEhPU1RfSU5UX0NUUkwgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgU0JfSU5UX0VOQUJMRSAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1QVTQwMV9JTlRfRU5BQkxFICAgICAgIDB4MDAwMgorI2RlZmluZSBBU1NQX0lOVF9FTkFCTEUgICAgICAgICAweDAwMTAKKyNkZWZpbmUgUklOR19JTlRfRU5BQkxFICAgICAgICAgMHgwMDIwCisjZGVmaW5lIEhWX0lOVF9FTkFCTEUgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBDTEtSVU5fR0VOX0VOQUJMRSAgICAgICAweDAxMDAKKyNkZWZpbmUgSFZfQ1RSTF9UT19QTUUgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFNPRlRXQVJFX1JFU0VUX0VOQUJMRSAgIDB4ODAwMAorCisvKgorICogc2hvdWxkIGJlIHVzaW5nIHRoZSBhYm92ZSBkZWZpbmVzLCBwcm9iYWJseS4KKyAqLworI2RlZmluZSBSRUdCX0VOQUJMRV9SRVNFVCAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkVHQl9TVE9QX0NMT0NLICAgICAgICAgICAgICAgICAweDEwCisKKyNkZWZpbmUgSE9TVF9JTlRfU1RBVFVTICAgICAgICAgMHgxQQorI2RlZmluZSBTQl9JTlRfUEVORElORyAgICAgICAgICAweDAxCisjZGVmaW5lIE1QVTQwMV9JTlRfUEVORElORyAgICAgIDB4MDIKKyNkZWZpbmUgQVNTUF9JTlRfUEVORElORyAgICAgICAgMHgxMAorI2RlZmluZSBSSU5HX0lOVF9QRU5ESU5HICAgICAgICAweDIwCisjZGVmaW5lIEhWX0lOVF9QRU5ESU5HICAgICAgICAgIDB4NDAKKworI2RlZmluZSBIQVJEV0FSRV9WT0xfQ1RSTCAgICAgICAweDFCCisjZGVmaW5lIFNIQURPV19NSVhfUkVHX1ZPSUNFICAgIDB4MUMKKyNkZWZpbmUgSFdfVk9MX0NPVU5URVJfVk9JQ0UgICAgMHgxRAorI2RlZmluZSBTSEFET1dfTUlYX1JFR19NQVNURVIgICAweDFFCisjZGVmaW5lIEhXX1ZPTF9DT1VOVEVSX01BU1RFUiAgIDB4MUYKKworI2RlZmluZSBDT0RFQ19DT01NQU5EICAgICAgICAgICAweDMwCisjZGVmaW5lIENPREVDX1JFQURfQiAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBDT0RFQ19TVEFUVVMgICAgICAgICAgICAweDMwCisjZGVmaW5lIENPREVDX0JVU1lfQiAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBDT0RFQ19EQVRBICAgICAgICAgICAgICAweDMyCisKKyNkZWZpbmUgUklOR19CVVNfQ1RSTF9BICAgICAgICAgMHgzNgorI2RlZmluZSBSQUNfUE1FX0VOQUJMRSAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgUkFDX1NERlNfRU5BQkxFICAgICAgICAgMHgwMjAwCisjZGVmaW5lIExBQ19QTUVfRU5BQkxFICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBMQUNfU0RGU19FTkFCTEUgICAgICAgICAweDA4MDAKKyNkZWZpbmUgU0VSSUFMX0FDX0xJTktfRU5BQkxFICAgMHgxMDAwCisjZGVmaW5lIElPX1NSQU1fRU5BQkxFICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBJSVNfSU5QVVRfRU5BQkxFICAgICAgICAweDgwMDAKKworI2RlZmluZSBSSU5HX0JVU19DVFJMX0IgICAgICAgICAweDM4CisjZGVmaW5lIFNFQ09ORF9DT0RFQ19JRF9NQVNLICAgIDB4MDAwMworI2RlZmluZSBTUERJRl9GVU5DX0VOQUJMRSAgICAgICAweDAwMTAKKyNkZWZpbmUgU0VDT05EX0FDX0VOQUJMRSAgICAgICAgMHgwMDIwCisjZGVmaW5lIFNCX01PRFVMRV9JTlRGX0VOQUJMRSAgIDB4MDA0MAorI2RlZmluZSBTU1BFX0VOQUJMRSAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgTTNJX0RPQ0tfRU5BQkxFICAgICAgICAgMHgwMDgwCisKKyNkZWZpbmUgU0RPX09VVF9ERVNUX0NUUkwgICAgICAgMHgzQQorI2RlZmluZSBDT01NQU5EX0FERFJfT1VUICAgICAgICAweDAwMDMKKyNkZWZpbmUgUENNX0xSX09VVF9MT0NBTCAgICAgICAgMHgwMDAwCisjZGVmaW5lIFBDTV9MUl9PVVRfUkVNT1RFICAgICAgIDB4MDAwNAorI2RlZmluZSBQQ01fTFJfT1VUX01VVEUgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUENNX0xSX09VVF9CT1RIICAgICAgICAgMHgwMDBDCisjZGVmaW5lIExJTkUxX0RBQ19PVVRfTE9DQUwgICAgIDB4MDAwMAorI2RlZmluZSBMSU5FMV9EQUNfT1VUX1JFTU9URSAgICAweDAwMTAKKyNkZWZpbmUgTElORTFfREFDX09VVF9NVVRFICAgICAgMHgwMDIwCisjZGVmaW5lIExJTkUxX0RBQ19PVVRfQk9USCAgICAgIDB4MDAzMAorI2RlZmluZSBQQ01fQ0xTX09VVF9MT0NBTCAgICAgICAweDAwMDAKKyNkZWZpbmUgUENNX0NMU19PVVRfUkVNT1RFICAgICAgMHgwMDQwCisjZGVmaW5lIFBDTV9DTFNfT1VUX01VVEUgICAgICAgIDB4MDA4MAorI2RlZmluZSBQQ01fQ0xTX09VVF9CT1RIICAgICAgICAweDAwQzAKKyNkZWZpbmUgUENNX1JMRl9PVVRfTE9DQUwgICAgICAgMHgwMDAwCisjZGVmaW5lIFBDTV9STEZfT1VUX1JFTU9URSAgICAgIDB4MDEwMAorI2RlZmluZSBQQ01fUkxGX09VVF9NVVRFICAgICAgICAweDAyMDAKKyNkZWZpbmUgUENNX1JMRl9PVVRfQk9USCAgICAgICAgMHgwMzAwCisjZGVmaW5lIExJTkUyX0RBQ19PVVRfTE9DQUwgICAgIDB4MDAwMAorI2RlZmluZSBMSU5FMl9EQUNfT1VUX1JFTU9URSAgICAweDA0MDAKKyNkZWZpbmUgTElORTJfREFDX09VVF9NVVRFICAgICAgMHgwODAwCisjZGVmaW5lIExJTkUyX0RBQ19PVVRfQk9USCAgICAgIDB4MEMwMAorI2RlZmluZSBIQU5EU0VUX09VVF9MT0NBTCAgICAgICAweDAwMDAKKyNkZWZpbmUgSEFORFNFVF9PVVRfUkVNT1RFICAgICAgMHgxMDAwCisjZGVmaW5lIEhBTkRTRVRfT1VUX01VVEUgICAgICAgIDB4MjAwMAorI2RlZmluZSBIQU5EU0VUX09VVF9CT1RIICAgICAgICAweDMwMDAKKyNkZWZpbmUgSU9fQ1RSTF9PVVRfTE9DQUwgICAgICAgMHgwMDAwCisjZGVmaW5lIElPX0NUUkxfT1VUX1JFTU9URSAgICAgIDB4NDAwMAorI2RlZmluZSBJT19DVFJMX09VVF9NVVRFICAgICAgICAweDgwMDAKKyNkZWZpbmUgSU9fQ1RSTF9PVVRfQk9USCAgICAgICAgMHhDMDAwCisKKyNkZWZpbmUgU0RPX0lOX0RFU1RfQ1RSTCAgICAgICAgMHgzQworI2RlZmluZSBTVEFUVVNfQUREUl9JTiAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgUENNX0xSX0lOX0xPQ0FMICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFBDTV9MUl9JTl9SRU1PVEUgICAgICAgIDB4MDAwNAorI2RlZmluZSBQQ01fTFJfUkVTRVJWRUQgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUENNX0xSX0lOX0JPVEggICAgICAgICAgMHgwMDBDCisjZGVmaW5lIExJTkUxX0FEQ19JTl9MT0NBTCAgICAgIDB4MDAwMAorI2RlZmluZSBMSU5FMV9BRENfSU5fUkVNT1RFICAgICAweDAwMTAKKyNkZWZpbmUgTElORTFfQURDX0lOX01VVEUgICAgICAgMHgwMDIwCisjZGVmaW5lIE1JQ19BRENfSU5fTE9DQUwgICAgICAgIDB4MDAwMAorI2RlZmluZSBNSUNfQURDX0lOX1JFTU9URSAgICAgICAweDAwNDAKKyNkZWZpbmUgTUlDX0FEQ19JTl9NVVRFICAgICAgICAgMHgwMDgwCisjZGVmaW5lIExJTkUyX0RBQ19JTl9MT0NBTCAgICAgIDB4MDAwMAorI2RlZmluZSBMSU5FMl9EQUNfSU5fUkVNT1RFICAgICAweDA0MDAKKyNkZWZpbmUgTElORTJfREFDX0lOX01VVEUgICAgICAgMHgwODAwCisjZGVmaW5lIEhBTkRTRVRfSU5fTE9DQUwgICAgICAgIDB4MDAwMAorI2RlZmluZSBIQU5EU0VUX0lOX1JFTU9URSAgICAgICAweDEwMDAKKyNkZWZpbmUgSEFORFNFVF9JTl9NVVRFICAgICAgICAgMHgyMDAwCisjZGVmaW5lIElPX1NUQVRVU19JTl9MT0NBTCAgICAgIDB4MDAwMAorI2RlZmluZSBJT19TVEFUVVNfSU5fUkVNT1RFICAgICAweDQwMDAKKworI2RlZmluZSBTUERJRl9JTl9DVFJMICAgICAgICAgICAweDNFCisjZGVmaW5lIFNQRElGX0lOX0VOQUJMRSAgICAgICAgIDB4MDAwMQorCisjZGVmaW5lIEdQSU9fREFUQSAgICAgICAgICAgICAgIDB4NjAKKyNkZWZpbmUgR1BJT19EQVRBX01BU0sgICAgICAgICAgMHgwRkZGCisjZGVmaW5lIEdQSU9fSFZfU1RBVFVTICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBHUElPX1BNRV9TVEFUVVMgICAgICAgICAweDQwMDAKKworI2RlZmluZSBHUElPX01BU0sgICAgICAgICAgICAgICAweDY0CisjZGVmaW5lIEdQSU9fRElSRUNUSU9OICAgICAgICAgIDB4NjgKKyNkZWZpbmUgR1BPX1BSSU1BUllfQUM5NyAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdQSV9MSU5FT1VUX1NFTlNFICAgICAgIDB4MDAwNAorI2RlZmluZSBHUE9fU0VDT05EQVJZX0FDOTcgICAgICAweDAwMDgKKyNkZWZpbmUgR1BJX1ZPTF9ET1dOICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEdQSV9WT0xfVVAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBHUElfSUlTX0NMSyAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgR1BJX0lJU19MUkNMSyAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEdQSV9JSVNfREFUQSAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBHUElfRE9DS0lOR19TVEFUVVMgICAgICAweDAxMDAKKyNkZWZpbmUgR1BJX0hFQURQSE9ORV9TRU5TRSAgICAgMHgwMjAwCisjZGVmaW5lIEdQT19FWFRfQU1QX1NIVVRET1dOICAgIDB4MTAwMAorCisvLyBNMworI2RlZmluZSBHUE9fTTNfRVhUX0FNUF9TSFVURE4gICAweDAwMDIKKworI2RlZmluZSBBU1NQX0lOREVYX1BPUlQgICAgICAgICAweDgwCisjZGVmaW5lIEFTU1BfTUVNT1JZX1BPUlQgICAgICAgIDB4ODIKKyNkZWZpbmUgQVNTUF9EQVRBX1BPUlQgICAgICAgICAgMHg4NAorCisjZGVmaW5lIE1QVTQwMV9EQVRBX1BPUlQgICAgICAgIDB4OTgKKyNkZWZpbmUgTVBVNDAxX1NUQVRVU19QT1JUICAgICAgMHg5OQorCisjZGVmaW5lIENMS19NVUxUX0RBVEFfUE9SVCAgICAgIDB4OUMKKworI2RlZmluZSBBU1NQX0NPTlRST0xfQSAgICAgICAgICAweEEyCisjZGVmaW5lIEFTU1BfMF9XU19FTkFCTEUgICAgICAgIDB4MDEKKyNkZWZpbmUgQVNTUF9DVFJMX0FfUkVTRVJWRUQxICAgMHgwMgorI2RlZmluZSBBU1NQX0NUUkxfQV9SRVNFUlZFRDIgICAweDA0CisjZGVmaW5lIEFTU1BfQ0xLXzQ5TUhaX1NFTEVDVCAgIDB4MDgKKyNkZWZpbmUgRkFTVF9QTFVfRU5BQkxFICAgICAgICAgMHgxMAorI2RlZmluZSBBU1NQX0NUUkxfQV9SRVNFUlZFRDMgICAweDIwCisjZGVmaW5lIERTUF9DTEtfMzZNSFpfU0VMRUNUICAgIDB4NDAKKworI2RlZmluZSBBU1NQX0NPTlRST0xfQiAgICAgICAgICAweEE0CisjZGVmaW5lIFJFU0VUX0FTU1AgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUlVOX0FTU1AgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBFTkFCTEVfQVNTUF9DTE9DSyAgICAgICAweDAwCisjZGVmaW5lIFNUT1BfQVNTUF9DTE9DSyAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkVTRVRfVE9HR0xFICAgICAgICAgICAgMHg0MAorCisjZGVmaW5lIEFTU1BfQ09OVFJPTF9DICAgICAgICAgIDB4QTYKKyNkZWZpbmUgQVNTUF9IT1NUX0lOVF9FTkFCTEUgICAgMHgwMQorI2RlZmluZSBGTV9BRERSX1JFTUFQX0RJU0FCTEUgICAweDAyCisjZGVmaW5lIEhPU1RfV1JJVEVfUE9SVF9FTkFCTEUgIDB4MDgKKworI2RlZmluZSBBU1NQX0hPU1RfSU5UX1NUQVRVUyAgICAweEFDCisjZGVmaW5lIERTUDJIT1NUX1JFUV9QSU9SRUNPUkQgIDB4MDEKKyNkZWZpbmUgRFNQMkhPU1RfUkVRX0kyU1JBVEUgICAgMHgwMgorI2RlZmluZSBEU1AySE9TVF9SRVFfVElNRVIgICAgICAweDA0CisKKy8vIEFDOTcgcmVnaXN0ZXJzCisvLyBYWFggZml4IHRoaXMgY3JhcCB1cAorLyojZGVmaW5lIEFDOTdfUkVTRVQgICAgICAgICAgICAgIDB4MDAqLworCisjZGVmaW5lIEFDOTdfVk9MX01VVEVfQiAgICAgICAgIDB4ODAwMAorI2RlZmluZSBBQzk3X1ZPTF9NICAgICAgICAgICAgICAweDFGCisjZGVmaW5lIEFDOTdfTEVGVF9WT0xfUyAgICAgICAgIDgKKworI2RlZmluZSBBQzk3X01BU1RFUl9WT0wgICAgICAgICAweDAyCisjZGVmaW5lIEFDOTdfTElORV9MRVZFTF9WT0wgICAgIDB4MDQKKyNkZWZpbmUgQUM5N19NQVNURVJfTU9OT19WT0wgICAgMHgwNgorI2RlZmluZSBBQzk3X1BDX0JFRVBfVk9MICAgICAgICAweDBBCisjZGVmaW5lIEFDOTdfUENfQkVFUF9WT0xfTSAgICAgIDB4MEYKKyNkZWZpbmUgQUM5N19TUk9VTkRfTUFTVEVSX1ZPTCAgMHgzOAorI2RlZmluZSBBQzk3X1BDX0JFRVBfVk9MX1MgICAgICAxCisKKy8qI2RlZmluZSBBQzk3X1BIT05FX1ZPTCAgICAgICAgICAweDBDCisjZGVmaW5lIEFDOTdfTUlDX1ZPTCAgICAgICAgICAgIDB4MEUqLworI2RlZmluZSBBQzk3X01JQ18yMERCX0VOQUJMRSAgICAweDQwCisKKy8qI2RlZmluZSBBQzk3X0xJTkVJTl9WT0wgICAgICAgICAweDEwCisjZGVmaW5lIEFDOTdfQ0RfVk9MICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgQUM5N19WSURFT19WT0wgICAgICAgICAgMHgxNAorI2RlZmluZSBBQzk3X0FVWF9WT0wgICAgICAgICAgICAweDE2Ki8KKyNkZWZpbmUgQUM5N19QQ01fT1VUX1ZPTCAgICAgICAgMHgxOAorLyojZGVmaW5lIEFDOTdfUkVDT1JEX1NFTEVDVCAgICAgIDB4MUEqLworI2RlZmluZSBBQzk3X1JFQ09SRF9NSUMgICAgICAgICAweDAwCisjZGVmaW5lIEFDOTdfUkVDT1JEX0NEICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQUM5N19SRUNPUkRfVklERU8gICAgICAgMHgwMgorI2RlZmluZSBBQzk3X1JFQ09SRF9BVVggICAgICAgICAweDAzCisjZGVmaW5lIEFDOTdfUkVDT1JEX01PTk9fTVVYICAgIDB4MDIKKyNkZWZpbmUgQUM5N19SRUNPUkRfRElHSVRBTCAgICAgMHgwMworI2RlZmluZSBBQzk3X1JFQ09SRF9MSU5FICAgICAgICAweDA0CisjZGVmaW5lIEFDOTdfUkVDT1JEX1NURVJFTyAgICAgIDB4MDUKKyNkZWZpbmUgQUM5N19SRUNPUkRfTU9OTyAgICAgICAgMHgwNgorI2RlZmluZSBBQzk3X1JFQ09SRF9QSE9ORSAgICAgICAweDA3CisKKy8qI2RlZmluZSBBQzk3X1JFQ09SRF9HQUlOICAgICAgICAweDFDKi8KKyNkZWZpbmUgQUM5N19SRUNPUkRfVk9MX00gICAgICAgMHgwRgorCisvKiNkZWZpbmUgQUM5N19HRU5FUkFMX1BVUlBPU0UgICAgMHgyMCovCisjZGVmaW5lIEFDOTdfUE9XRVJfRE9XTl9DVFJMICAgIDB4MjYKKyNkZWZpbmUgQUM5N19BRENfUkVBRFkgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEFDOTdfREFDX1JFQURZICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBBQzk3X0FOQUxPR19SRUFEWSAgICAgICAweDAwMDQKKyNkZWZpbmUgQUM5N19WUkVGX09OICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEFDOTdfUFIwICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBBQzk3X1BSMSAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgQUM5N19QUjIgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEFDOTdfUFIzICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBBQzk3X1BSNCAgICAgICAgICAgICAgICAweDEwMDAKKworI2RlZmluZSBBQzk3X1JFU0VSVkVEMSAgICAgICAgICAweDI4CisKKyNkZWZpbmUgQUM5N19WRU5ET1JfVEVTVCAgICAgICAgMHg1QQorCisjZGVmaW5lIEFDOTdfQ0xPQ0tfREVMQVkgICAgICAgIDB4NUMKKyNkZWZpbmUgQUM5N19MSU5FT1VUX01VWF9TRUwgICAgMHgwMDAxCisjZGVmaW5lIEFDOTdfTU9OT19NVVhfU0VMICAgICAgIDB4MDAwMgorI2RlZmluZSBBQzk3X0NMT0NLX0RFTEFZX1NFTCAgICAweDFGCisjZGVmaW5lIEFDOTdfREFDX0NEU19TSElGVCAgICAgIDYKKyNkZWZpbmUgQUM5N19BRENfQ0RTX1NISUZUICAgICAgMTEKKworI2RlZmluZSBBQzk3X01VTFRJX0NIQU5ORUxfU0VMICAweDc0CisKKy8qI2RlZmluZSBBQzk3X1ZFTkRPUl9JRDEgICAgICAgICAweDdDCisjZGVmaW5lIEFDOTdfVkVORE9SX0lEMiAgICAgICAgIDB4N0UqLworCisvKgorICogQVNTUCBjb250cm9sIHJlZ3MKKyAqLworI2RlZmluZSBEU1BfUE9SVF9USU1FUl9DT1VOVCAgICAweDA2CisKKyNkZWZpbmUgRFNQX1BPUlRfTUVNT1JZX0lOREVYICAgMHg4MAorCisjZGVmaW5lIERTUF9QT1JUX01FTU9SWV9UWVBFICAgIDB4ODIKKyNkZWZpbmUgTUVNVFlQRV9JTlRFUk5BTF9DT0RFICAgMHgwMDAyCisjZGVmaW5lIE1FTVRZUEVfSU5URVJOQUxfREFUQSAgIDB4MDAwMworI2RlZmluZSBNRU1UWVBFX01BU0sgICAgICAgICAgICAweDAwMDMKKworI2RlZmluZSBEU1BfUE9SVF9NRU1PUllfREFUQSAgICAweDg0CisKKyNkZWZpbmUgRFNQX1BPUlRfQ09OVFJPTF9SRUdfQSAgMHhBMgorI2RlZmluZSBEU1BfUE9SVF9DT05UUk9MX1JFR19CICAweEE0CisjZGVmaW5lIERTUF9QT1JUX0NPTlRST0xfUkVHX0MgIDB4QTYKKworI2RlZmluZSBSRVZfQV9DT0RFX01FTU9SWV9CRUdJTiAgICAgICAgIDB4MDAwMAorI2RlZmluZSBSRVZfQV9DT0RFX01FTU9SWV9FTkQgICAgICAgICAgIDB4MEZGRgorI2RlZmluZSBSRVZfQV9DT0RFX01FTU9SWV9VTklUX0xFTkdUSCAgIDB4MDA0MAorI2RlZmluZSBSRVZfQV9DT0RFX01FTU9SWV9MRU5HVEggICAgICAgIChSRVZfQV9DT0RFX01FTU9SWV9FTkQgLSBSRVZfQV9DT0RFX01FTU9SWV9CRUdJTiArIDEpCisKKyNkZWZpbmUgUkVWX0JfQ09ERV9NRU1PUllfQkVHSU4gICAgICAgICAweDAwMDAKKyNkZWZpbmUgUkVWX0JfQ09ERV9NRU1PUllfRU5EICAgICAgICAgICAweDBCRkYKKyNkZWZpbmUgUkVWX0JfQ09ERV9NRU1PUllfVU5JVF9MRU5HVEggICAweDAwNDAKKyNkZWZpbmUgUkVWX0JfQ09ERV9NRU1PUllfTEVOR1RIICAgICAgICAoUkVWX0JfQ09ERV9NRU1PUllfRU5EIC0gUkVWX0JfQ09ERV9NRU1PUllfQkVHSU4gKyAxKQorCisjZGVmaW5lIFJFVl9BX0RBVEFfTUVNT1JZX0JFR0lOICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFJFVl9BX0RBVEFfTUVNT1JZX0VORCAgICAgICAgICAgMHgyRkZGCisjZGVmaW5lIFJFVl9BX0RBVEFfTUVNT1JZX1VOSVRfTEVOR1RIICAgMHgwMDgwCisjZGVmaW5lIFJFVl9BX0RBVEFfTUVNT1JZX0xFTkdUSCAgICAgICAgKFJFVl9BX0RBVEFfTUVNT1JZX0VORCAtIFJFVl9BX0RBVEFfTUVNT1JZX0JFR0lOICsgMSkKKworI2RlZmluZSBSRVZfQl9EQVRBX01FTU9SWV9CRUdJTiAgICAgICAgIDB4MTAwMAorI2RlZmluZSBSRVZfQl9EQVRBX01FTU9SWV9FTkQgICAgICAgICAgIDB4MkJGRgorI2RlZmluZSBSRVZfQl9EQVRBX01FTU9SWV9VTklUX0xFTkdUSCAgIDB4MDA4MAorI2RlZmluZSBSRVZfQl9EQVRBX01FTU9SWV9MRU5HVEggICAgICAgIChSRVZfQl9EQVRBX01FTU9SWV9FTkQgLSBSRVZfQl9EQVRBX01FTU9SWV9CRUdJTiArIDEpCisKKworI2RlZmluZSBOVU1fVU5JVFNfS0VSTkVMX0NPREUgICAgICAgICAgMTYKKyNkZWZpbmUgTlVNX1VOSVRTX0tFUk5FTF9EQVRBICAgICAgICAgICAyCisKKyNkZWZpbmUgTlVNX1VOSVRTX0tFUk5FTF9DT0RFX1dJVEhfSFNQIDE2CisjZGVmaW5lIE5VTV9VTklUU19LRVJORUxfREFUQV9XSVRIX0hTUCAgNQorCisvKgorICogS2VybmVsIGRhdGEgbGF5b3V0CisgKi8KKworI2RlZmluZSBEUF9TSElGVF9DT1VOVCAgICAgICAgICAgICAgICAgIDcKKworI2RlZmluZSBLREFUQV9CQVNFX0FERFIgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBLREFUQV9CQVNFX0FERFIyICAgICAgICAgICAgICAgIDB4MTA4MAorCisjZGVmaW5lIEtEQVRBX1RBU0swICAgICAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwMCkKKyNkZWZpbmUgS0RBVEFfVEFTSzEgICAgICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDAxKQorI2RlZmluZSBLREFUQV9UQVNLMiAgICAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMDIpCisjZGVmaW5lIEtEQVRBX1RBU0szICAgICAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwMykKKyNkZWZpbmUgS0RBVEFfVEFTSzQgICAgICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDA0KQorI2RlZmluZSBLREFUQV9UQVNLNSAgICAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMDUpCisjZGVmaW5lIEtEQVRBX1RBU0s2ICAgICAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwNikKKyNkZWZpbmUgS0RBVEFfVEFTSzcgICAgICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDA3KQorI2RlZmluZSBLREFUQV9UQVNLX0VORE1BUksgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMDgpCisKKyNkZWZpbmUgS0RBVEFfQ1VSUkVOVF9UQVNLICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDA5KQorI2RlZmluZSBLREFUQV9UQVNLX1NXSVRDSCAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMEEpCisKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UwX1BPUzNEICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDBCKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTFfUE9TM0QgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMEMpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMl9QT1MzRCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwRCkKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UzX1BPUzNEICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDBFKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTRfUE9TM0QgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMEYpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFNV9QT1MzRCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxMCkKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0U2X1BPUzNEICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDExKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTdfUE9TM0QgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMTIpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFOF9QT1MzRCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxMykKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0VfUE9TM0RfRU5ETUFSSyAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDE0KQorCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMF9TUEtWSVJUICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxNSkKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0VfU1BLVklSVF9FTkRNQVJLICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDE2KQorCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMF9TUERJRiAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxNykKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0VfU1BESUZfRU5ETUFSSyAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDE4KQorCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMF9NT0RFTSAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxOSkKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0VfTU9ERU1fRU5ETUFSSyAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDFBKQorCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMF9TUkMgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxQikKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UxX1NSQyAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDFDKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRV9TUkNfRU5ETUFSSyAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMUQpCisKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UwX01JTklTUkMgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDFFKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTFfTUlOSVNSQyAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMUYpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMl9NSU5JU1JDICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyMCkKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UzX01JTklTUkMgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDIxKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRV9NSU5JU1JDX0VORE1BUksgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMjIpCisKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UwX0NQWVRIUlUgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDIzKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTFfQ1BZVEhSVSAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMjQpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFX0NQWVRIUlVfRU5ETUFSSyAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyNSkKKworI2RlZmluZSBLREFUQV9DVVJSRU5UX0RNQSAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMjYpCisjZGVmaW5lIEtEQVRBX0RNQV9TV0lUQ0ggICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyNykKKyNkZWZpbmUgS0RBVEFfRE1BX0FDVElWRSAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDI4KQorCisjZGVmaW5lIEtEQVRBX0RNQV9YRkVSMCAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyOSkKKyNkZWZpbmUgS0RBVEFfRE1BX1hGRVIxICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDJBKQorI2RlZmluZSBLREFUQV9ETUFfWEZFUjIgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMkIpCisjZGVmaW5lIEtEQVRBX0RNQV9YRkVSMyAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyQykKKyNkZWZpbmUgS0RBVEFfRE1BX1hGRVI0ICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDJEKQorI2RlZmluZSBLREFUQV9ETUFfWEZFUjUgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMkUpCisjZGVmaW5lIEtEQVRBX0RNQV9YRkVSNiAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyRikKKyNkZWZpbmUgS0RBVEFfRE1BX1hGRVI3ICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDMwKQorI2RlZmluZSBLREFUQV9ETUFfWEZFUjggICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMzEpCisjZGVmaW5lIEtEQVRBX0RNQV9YRkVSX0VORE1BUksgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzMikKKworI2RlZmluZSBLREFUQV9JMlNfU0FNUExFX0NPVU5UICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMzMpCisjZGVmaW5lIEtEQVRBX0kyU19JTlRfTUVURVIgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzNCkKKyNkZWZpbmUgS0RBVEFfSTJTX0FDVElWRSAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDM1KQorCisjZGVmaW5lIEtEQVRBX1RJTUVSX0NPVU5UX1JFTE9BRCAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzNikKKyNkZWZpbmUgS0RBVEFfVElNRVJfQ09VTlRfQ1VSUkVOVCAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDM3KQorCisjZGVmaW5lIEtEQVRBX0hBTFRfU1lOQ0hfQ0xJRU5UICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzOCkKKyNkZWZpbmUgS0RBVEFfSEFMVF9TWU5DSF9ETUEgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDM5KQorI2RlZmluZSBLREFUQV9IQUxUX0FDS05PV0xFREdFICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwM0EpCisKKyNkZWZpbmUgS0RBVEFfQURDMV9YRkVSMCAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDNCKQorI2RlZmluZSBLREFUQV9BREMxX1hGRVJfRU5ETUFSSyAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwM0MpCisjZGVmaW5lIEtEQVRBX0FEQzFfTEVGVF9WT0xVTUUJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDNEKQorI2RlZmluZSBLREFUQV9BREMxX1JJR0hUX1ZPTFVNRSAgCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDNFKQorI2RlZmluZSBLREFUQV9BREMxX0xFRlRfU1VSX1ZPTAkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwM0YpCisjZGVmaW5lIEtEQVRBX0FEQzFfUklHSFRfU1VSX1ZPTAkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0MCkKKworI2RlZmluZSBLREFUQV9BREMyX1hGRVIwICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNDEpCisjZGVmaW5lIEtEQVRBX0FEQzJfWEZFUl9FTkRNQVJLICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0MikKKyNkZWZpbmUgS0RBVEFfQURDMl9MRUZUX1ZPTFVNRQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNDMpCisjZGVmaW5lIEtEQVRBX0FEQzJfUklHSFRfVk9MVU1FCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0NCkKKyNkZWZpbmUgS0RBVEFfQURDMl9MRUZUX1NVUl9WT0wJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDQ1KQorI2RlZmluZSBLREFUQV9BREMyX1JJR0hUX1NVUl9WT0wJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNDYpCisKKyNkZWZpbmUgS0RBVEFfQ0RfWEZFUjAJCQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNDcpCQkJCQkKKyNkZWZpbmUgS0RBVEFfQ0RfWEZFUl9FTkRNQVJLCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0OCkKKyNkZWZpbmUgS0RBVEFfQ0RfTEVGVF9WT0xVTUUJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDQ5KQorI2RlZmluZSBLREFUQV9DRF9SSUdIVF9WT0xVTUUJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDRBKQorI2RlZmluZSBLREFUQV9DRF9MRUZUX1NVUl9WT0wJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDRCKQorI2RlZmluZSBLREFUQV9DRF9SSUdIVF9TVVJfVk9MCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0QykKKworI2RlZmluZSBLREFUQV9NSUNfWEZFUjAJCQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNEQpCisjZGVmaW5lIEtEQVRBX01JQ19YRkVSX0VORE1BUksJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDRFKQorI2RlZmluZSBLREFUQV9NSUNfVk9MVU1FCQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNEYpCisjZGVmaW5lIEtEQVRBX01JQ19TVVJfVk9MCQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNTApCisKKyNkZWZpbmUgS0RBVEFfSTJTX1hGRVIwICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDUxKQorI2RlZmluZSBLREFUQV9JMlNfWEZFUl9FTkRNQVJLICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNTIpCisKKyNkZWZpbmUgS0RBVEFfQ0hJX1hGRVIwICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDUzKQorI2RlZmluZSBLREFUQV9DSElfWEZFUl9FTkRNQVJLICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNTQpCisKKyNkZWZpbmUgS0RBVEFfU1BESUZfWEZFUiAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDU1KQorI2RlZmluZSBLREFUQV9TUERJRl9DVVJSRU5UX0ZSQU1FICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNTYpCisjZGVmaW5lIEtEQVRBX1NQRElGX0ZSQU1FMCAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1NykKKyNkZWZpbmUgS0RBVEFfU1BESUZfRlJBTUUxICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDU4KQorI2RlZmluZSBLREFUQV9TUERJRl9GUkFNRTIgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNTkpCisKKyNkZWZpbmUgS0RBVEFfU1BESUZfUkVRVUVTVCAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDVBKQorI2RlZmluZSBLREFUQV9TUERJRl9URU1QICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNUIpCisKKyNkZWZpbmUgS0RBVEFfU1BESUZJTl9YRkVSMCAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDVDKQorI2RlZmluZSBLREFUQV9TUERJRklOX1hGRVJfRU5ETUFSSyAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNUQpCisjZGVmaW5lIEtEQVRBX1NQRElGSU5fSU5UX01FVEVSICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1RSkKKworI2RlZmluZSBLREFUQV9EU1BfUkVTRVRfQ09VTlQgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNUYpCisjZGVmaW5lIEtEQVRBX0RFQlVHX09VVFBVVCAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2MCkKKworI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0xJU1QgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNjEpCisKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9DQlNSMSAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDYyKQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0NCRVIxICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNjMpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfQ0JDUiAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2NCkKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9BUjAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDY1KQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0FSMSAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNjYpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfQVIyICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2NykKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9BUjMgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDY4KQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0FSNCAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNjkpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfQVI1ICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2QSkKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9CUkNSICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDZCKQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX1BBU1IgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNkMpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfUEFFUiAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2RCkKKworI2RlZmluZSBLREFUQV9DTElFTlRfU0NSQVRDSDAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNkUpCisjZGVmaW5lIEtEQVRBX0NMSUVOVF9TQ1JBVENIMSAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2RikKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX1NDUkFUQ0ggICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDcwKQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX1NDUkFUQ0ggICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNzEpCisKKyNkZWZpbmUgS0RBVEFfT1VFVUVfTEVGVCAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDcyKQorI2RlZmluZSBLREFUQV9RVUVVRV9SSUdIVCAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNzMpCisKKyNkZWZpbmUgS0RBVEFfQURDMV9SRVFVRVNUICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDc0KQorI2RlZmluZSBLREFUQV9BREMyX1JFUVVFU1QgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNzUpCisjZGVmaW5lIEtEQVRBX0NEX1JFUVVFU1QJCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3NikKKyNkZWZpbmUgS0RBVEFfTUlDX1JFUVVFU1QJCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3NykKKworI2RlZmluZSBLREFUQV9BREMxX01JWEVSX1JFUVVFU1QgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNzgpCisjZGVmaW5lIEtEQVRBX0FEQzJfTUlYRVJfUkVRVUVTVCAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3OSkKKyNkZWZpbmUgS0RBVEFfQ0RfTUlYRVJfUkVRVUVTVAkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwN0EpCisjZGVmaW5lIEtEQVRBX01JQ19NSVhFUl9SRVFVRVNUCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3QikKKyNkZWZpbmUgS0RBVEFfTUlDX1NZTkNfQ09VTlRFUgkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwN0MpCisKKy8qCisgKiBzZWNvbmQgJ3NlZ21lbnQnICg/KSByZXNlcnZlZCBmb3IgbWl4ZXIKKyAqIGJ1ZmZlcnMuLgorICovCisKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SRDAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwMCkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SRDEgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwMSkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SRDIgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwMikKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SRDMgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwMykKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SRDQgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwNCkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SRDUgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwNSkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SRDYgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwNikKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SRDcgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwNykKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SRDggICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwOCkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SRDkgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwOSkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SREEgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwQSkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SREIgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwQikKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SREMgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwQykKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SREQgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwRCkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SREUgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwRSkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfV09SREYgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAwRikKKworI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSMCAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDEwKQorI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSMSAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDExKQorI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSMiAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDEyKQorI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSMyAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDEzKQorI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSNCAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDE0KQorI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSNSAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDE1KQorI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSNiAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDE2KQorI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSNyAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDE3KQorI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSOCAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDE4KQorI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSOSAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDE5KQorI2RlZmluZSBLREFUQV9NSVhFUl9YRkVSX0VORE1BUksgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDFBKQorCisjZGVmaW5lIEtEQVRBX01JWEVSX1RBU0tfTlVNQkVSICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMUIpCisjZGVmaW5lIEtEQVRBX0NVUlJFTlRfTUlYRVIgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMUMpCisjZGVmaW5lIEtEQVRBX01JWEVSX0FDVElWRSAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMUQpCisjZGVmaW5lIEtEQVRBX01JWEVSX0JBTktfU1RBVFVTICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMUUpCisjZGVmaW5lIEtEQVRBX0RBQ19MRUZUX1ZPTFVNRQkgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDFGKQorI2RlZmluZSBLREFUQV9EQUNfUklHSFRfVk9MVU1FICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDIwKQorCisjZGVmaW5lIE1BWF9JTlNUQU5DRV9NSU5JU1JDICAgICAgICAgICAgKEtEQVRBX0lOU1RBTkNFX01JTklTUkNfRU5ETUFSSyAtIEtEQVRBX0lOU1RBTkNFMF9NSU5JU1JDKQorI2RlZmluZSBNQVhfVklSVFVBTF9ETUFfQ0hBTk5FTFMgICAgICAgIChLREFUQV9ETUFfWEZFUl9FTkRNQVJLIC0gS0RBVEFfRE1BX1hGRVIwKQorI2RlZmluZSBNQVhfVklSVFVBTF9NSVhFUl9DSEFOTkVMUyAgICAgIChLREFUQV9NSVhFUl9YRkVSX0VORE1BUksgLSBLREFUQV9NSVhFUl9YRkVSMCkKKyNkZWZpbmUgTUFYX1ZJUlRVQUxfQURDMV9DSEFOTkVMUyAgICAgICAoS0RBVEFfQURDMV9YRkVSX0VORE1BUksgLSBLREFUQV9BREMxX1hGRVIwKQorCisvKgorICogY2xpZW50IGRhdGEgYXJlYSBvZmZzZXRzCisgKi8KKyNkZWZpbmUgQ0RBVEFfSU5TVEFOQ0VfUkVBRFkgICAgICAgICAgICAweDAwCisKKyNkZWZpbmUgQ0RBVEFfSE9TVF9TUkNfQUREUkwgICAgICAgICAgICAweDAxCisjZGVmaW5lIENEQVRBX0hPU1RfU1JDX0FERFJIICAgICAgICAgICAgMHgwMgorI2RlZmluZSBDREFUQV9IT1NUX1NSQ19FTkRfUExVU18xTCAgICAgIDB4MDMKKyNkZWZpbmUgQ0RBVEFfSE9TVF9TUkNfRU5EX1BMVVNfMUggICAgICAweDA0CisjZGVmaW5lIENEQVRBX0hPU1RfU1JDX0NVUlJFTlRMICAgICAgICAgMHgwNQorI2RlZmluZSBDREFUQV9IT1NUX1NSQ19DVVJSRU5USCAgICAgICAgIDB4MDYKKworI2RlZmluZSBDREFUQV9JTl9CVUZfQ09OTkVDVCAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgQ0RBVEFfT1VUX0JVRl9DT05ORUNUICAgICAgICAgICAweDA4CisKKyNkZWZpbmUgQ0RBVEFfSU5fQlVGX0JFR0lOICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIENEQVRBX0lOX0JVRl9FTkRfUExVU18xICAgICAgICAgMHgwQQorI2RlZmluZSBDREFUQV9JTl9CVUZfSEVBRCAgICAgICAgICAgICAgIDB4MEIKKyNkZWZpbmUgQ0RBVEFfSU5fQlVGX1RBSUwgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIENEQVRBX09VVF9CVUZfQkVHSU4gICAgICAgICAgICAgMHgwRAorI2RlZmluZSBDREFUQV9PVVRfQlVGX0VORF9QTFVTXzEgICAgICAgIDB4MEUKKyNkZWZpbmUgQ0RBVEFfT1VUX0JVRl9IRUFEICAgICAgICAgICAgICAweDBGCisjZGVmaW5lIENEQVRBX09VVF9CVUZfVEFJTCAgICAgICAgICAgICAgMHgxMAorCisjZGVmaW5lIENEQVRBX0RNQV9DT05UUk9MICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBDREFUQV9SRVNFUlZFRCAgICAgICAgICAgICAgICAgIDB4MTIKKworI2RlZmluZSBDREFUQV9GUkVRVUVOQ1kgICAgICAgICAgICAgICAgIDB4MTMKKyNkZWZpbmUgQ0RBVEFfTEVGVF9WT0xVTUUgICAgICAgICAgICAgICAweDE0CisjZGVmaW5lIENEQVRBX1JJR0hUX1ZPTFVNRSAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBDREFUQV9MRUZUX1NVUl9WT0wgICAgICAgICAgICAgIDB4MTYKKyNkZWZpbmUgQ0RBVEFfUklHSFRfU1VSX1ZPTCAgICAgICAgICAgICAweDE3CisKKyNkZWZpbmUgQ0RBVEFfSEVBREVSX0xFTiAgICAgICAgICAgICAgICAweDE4CisKKyNkZWZpbmUgU1JDM19ESVJFQ1RJT05fT0ZGU0VUICAgICAgICAgICBDREFUQV9IRUFERVJfTEVOCisjZGVmaW5lIFNSQzNfTU9ERV9PRkZTRVQgICAgICAgICAgICAgICAgKENEQVRBX0hFQURFUl9MRU4gKyAxKQorI2RlZmluZSBTUkMzX1dPUkRfTEVOR1RIX09GRlNFVCAgICAgICAgIChDREFUQV9IRUFERVJfTEVOICsgMikKKyNkZWZpbmUgU1JDM19QQVJBTUVURVJfT0ZGU0VUICAgICAgICAgICAoQ0RBVEFfSEVBREVSX0xFTiArIDMpCisjZGVmaW5lIFNSQzNfQ09FRkZfQUREUl9PRkZTRVQgICAgICAgICAgKENEQVRBX0hFQURFUl9MRU4gKyA4KQorI2RlZmluZSBTUkMzX0ZJTFRBUF9BRERSX09GRlNFVCAgICAgICAgIChDREFUQV9IRUFERVJfTEVOICsgMTApCisjZGVmaW5lIFNSQzNfVEVNUF9JTkJVRl9BRERSX09GRlNFVCAgICAgKENEQVRBX0hFQURFUl9MRU4gKyAxNikKKyNkZWZpbmUgU1JDM19URU1QX09VVEJVRl9BRERSX09GRlNFVCAgICAoQ0RBVEFfSEVBREVSX0xFTiArIDE3KQorCisjZGVmaW5lIE1JTklTUkNfSU5fQlVGRkVSX1NJWkUgICAoIDB4NTAgKiAyICkKKyNkZWZpbmUgTUlOSVNSQ19PVVRfQlVGRkVSX1NJWkUgICggMHg1MCAqIDIgKiAyKQorI2RlZmluZSBNSU5JU1JDX09VVF9CVUZGRVJfU0laRSAgKCAweDUwICogMiAqIDIpCisjZGVmaW5lIE1JTklTUkNfVE1QX0JVRkZFUl9TSVpFICAoIDExMiArICggTUlOSVNSQ19CSVFVQURfU1RBR0UgKiAzICsgNCApICogMiAqIDIgKQorI2RlZmluZSBNSU5JU1JDX0JJUVVBRF9TVEFHRSAgICAyCisjZGVmaW5lIE1JTklTUkNfQ09FRl9MT0MgICAgICAgICAgMFgxNzUKKworI2RlZmluZSBETUFDT05UUk9MX0JMT0NLX01BU0sgICAgICAgICAgIDB4MDAwRgorI2RlZmluZSAgRE1BQ19CTE9DSzBfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSAgRE1BQ19CTE9DSzFfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSAgRE1BQ19CTE9DSzJfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSAgRE1BQ19CTE9DSzNfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwMworI2RlZmluZSAgRE1BQ19CTE9DSzRfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSAgRE1BQ19CTE9DSzVfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSAgRE1BQ19CTE9DSzZfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSAgRE1BQ19CTE9DSzdfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwNworI2RlZmluZSAgRE1BQ19CTE9DSzhfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSAgRE1BQ19CTE9DSzlfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSAgRE1BQ19CTE9DS0FfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSAgRE1BQ19CTE9DS0JfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSAgRE1BQ19CTE9DS0NfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwQworI2RlZmluZSAgRE1BQ19CTE9DS0RfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwRAorI2RlZmluZSAgRE1BQ19CTE9DS0VfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSAgRE1BQ19CTE9DS0ZfU0VMRUNUT1IgICAgICAgICAgIDB4MDAwRgorI2RlZmluZSBETUFDT05UUk9MX1BBR0VfTUFTSyAgICAgICAgICAgIDB4MDBGMAorI2RlZmluZSAgRE1BQ19QQUdFMF9TRUxFQ1RPUiAgICAgICAgICAgIDB4MDAzMAorI2RlZmluZSAgRE1BQ19QQUdFMV9TRUxFQ1RPUiAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSAgRE1BQ19QQUdFMl9TRUxFQ1RPUiAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSAgRE1BQ19QQUdFM19TRUxFQ1RPUiAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBETUFDT05UUk9MX0FVVE9SRVBFQVQgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBETUFDT05UUk9MX1NUT1BQRUQgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBETUFDT05UUk9MX0RJUkVDVElPTiAgICAgICAgICAgIDB4MDEwMAorCisKKy8qCisgKiBEU1AgQ29kZSBpbWFnZXMKKyAqLworCitzdGF0aWMgdTE2IGFzc3Bfa2VybmVsX2ltYWdlW10gPSB7CisgICAgMHg3OTgwLCAweDAwMzAsIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAwRkIsIDB4Nzk4MCwgMHgwMERELCAweDc5ODAsIDB4MDNCNCwgCisgICAgMHg3OTgwLCAweDAzMzIsIDB4Nzk4MCwgMHgwMjg3LCAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDNCNCwgCisgICAgMHg3OTgwLCAweDAzMUEsIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDIyRiwgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDNCNCwgCisgICAgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDA2MywgMHg3OTgwLCAweDAwNkIsIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDNCNCwgCisgICAgMHhCRjgwLCAweDJDN0MsIDB4ODgwNiwgMHg4ODA0LCAweEJFNDAsIDB4QkMyMCwgMHhBRTA5LCAweDEwMDAsIDB4QUUwQSwgMHgwMDAxLCAweDY5MzgsIDB4RUIwOCwgCisgICAgMHgwMDUzLCAweDY5NUEsIDB4RUIwOCwgMHgwMEQ2LCAweDAwMDksIDB4OEI4OCwgMHg2OTgwLCAweEUzODgsIDB4MDAzNiwgMHhCRTMwLCAweEJDMjAsIDB4NjkwOSwgCisgICAgMHhCODAxLCAweDkwMDksIDB4QkU0MSwgMHhCRTQxLCAweDY5MjgsIDB4RUI4OCwgMHgwMDc4LCAweEJFNDEsIDB4QkU0MCwgMHg3OTgwLCAweDAwMzgsIDB4QkU0MSwgCisgICAgMHhCRTQxLCAweDkwM0EsIDB4NjkzOCwgMHhFMzA4LCAweDAwNTYsIDB4OTAzQSwgMHhCRTQxLCAweEJFNDAsIDB4RUYwMCwgMHg5MDNBLCAweDY5MzksIDB4RTMwOCwgCisgICAgMHgwMDVFLCAweDkwM0EsIDB4RUYwMCwgMHg2OTBCLCAweDY2MEMsIDB4RUY4QywgMHg2OTBBLCAweDY2MEMsIDB4NjIwQiwgMHg2NjA5LCAweEVGMDAsIDB4NjkxMCwgCisgICAgMHg2NjBGLCAweEVGMDQsIDB4RTM4OCwgMHgwMDc1LCAweDY5MEUsIDB4NjYwRiwgMHg2MjEwLCAweDY2MEQsIDB4RUYwMCwgMHg2OTBFLCAweDY2MEQsIDB4RUYwMCwgCisgICAgMHhBRTcwLCAweDAwMDEsIDB4QkMyMCwgMHhBRTI3LCAweDAwMDEsIDB4NjkzOSwgMHhFQjA4LCAweDAwNUQsIDB4NjkyNiwgMHhCODAxLCAweDkwMjYsIDB4MDAyNiwgCisgICAgMHg4Qjg4LCAweDY5ODAsIDB4RTM4OCwgMHgwMENCLCAweDkwMjgsIDB4MEQyOCwgMHg0MjExLCAweEUxMDAsIDB4MDA3QSwgMHg0NzExLCAweEUxMDAsIDB4MDBBMCwgCisgICAgMHg3QTgwLCAweDAwNjMsIDB4QjgxMSwgMHg2NjBBLCAweDYyMDksIDB4RTMwNCwgMHgwMDdBLCAweDBDMEIsIDB4NDAwNSwgMHgxMDBBLCAweEJBMDEsIDB4OTAxMiwgCisgICAgMHgwQzEyLCAweDQwMDIsIDB4Nzk4MCwgMHgwMEFGLCAweDdBODAsIDB4MDA2QiwgMHhCRTAyLCAweDYyMEUsIDB4NjYwRCwgMHhCQTEwLCAweEUzNDQsIDB4MDA3QSwgCisgICAgMHgwQzEwLCAweDQwMDUsIDB4MTAwRSwgMHhCQTAxLCAweDkwMTIsIDB4MEMxMiwgMHg0MDAyLCAweDEwMDMsIDB4QkEwMiwgMHg5MDEyLCAweDBDMTIsIDB4NDAwMCwgCisgICAgMHgxMDAzLCAweEUzODgsIDB4MDBCQSwgMHgxMDA0LCAweDc5ODAsIDB4MDBCQywgMHgxMDA0LCAweEJBMDEsIDB4OTAxMiwgMHgwQzEyLCAweDQwMDEsIDB4MEMwNSwgCisgICAgMHg0MDAzLCAweDBDMDYsIDB4NDAwNCwgMHgxMDExLCAweEJGQjAsIDB4MDFGRiwgMHg5MDEyLCAweDBDMTIsIDB4NDAwNiwgMHhCQzIwLCAweEVGMDAsIDB4QUUyNiwgCisgICAgMHgxMDI4LCAweDY5NzAsIDB4QkZEMCwgMHgwMDAxLCAweDkwNzAsIDB4RTM4OCwgMHgwMDdBLCAweEFFMjgsIDB4MDAwMCwgMHhFRjAwLCAweEFFNzAsIDB4MDMwMCwgCisgICAgMHgwQzcwLCAweEIwMEMsIDB4QUU1QSwgMHgwMDAwLCAweEVGMDAsIDB4N0E4MCwgMHgwMzhBLCAweDY5N0YsIDB4QjgwMSwgMHg5MDdGLCAweDAwNTYsIDB4OEI4OCwgCisgICAgMHgwQ0EwLCAweEIwMDgsIDB4QUY3MSwgMHhCMDAwLCAweDRFNzEsIDB4RTIwMCwgMHgwMEYzLCAweEFFNTYsIDB4MTA1NywgMHgwMDU2LCAweDBDQTAsIDB4QjAwOCwgCisgICAgMHg4MDU2LCAweDc5ODAsIDB4MDNBMSwgMHgwODEwLCAweEJGQTAsIDB4MTA1OSwgMHhFMzA0LCAweDAzQTEsIDB4ODA1NiwgMHg3OTgwLCAweDAzQTEsIDB4N0E4MCwgCisgICAgMHgwMzhBLCAweEJGMDEsIDB4QkU0MywgMHhCRTU5LCAweDkwN0MsIDB4NjkzNywgMHhFMzg4LCAweDAxMEQsIDB4QkEwMSwgMHhFMzA4LCAweDAxMEMsIDB4QUU3MSwgCisgICAgMHgwMDA0LCAweDBDNzEsIDB4NTAwMCwgMHg2OTM2LCAweDkwMzcsIDB4QkYwQSwgMHgxMDlFLCAweDhCOEEsIDB4QUY4MCwgMHg4MDE0LCAweDRDODAsIDB4QkYwQSwgCisgICAgMHgwNTYwLCAweEY1MDAsIDB4QkYwQSwgMHgwNTIwLCAweEI5MDAsIDB4QkIxNywgMHg5MEEwLCAweDY5MTcsIDB4RTM4OCwgMHgwMTQ4LCAweDBEMTcsIDB4RTEwMCwgCisgICAgMHgwMTI3LCAweEJGMEMsIDB4MDU3OCwgMHhCRjBELCAweDA1N0MsIDB4Nzk4MCwgMHgwMTJCLCAweEJGMEMsIDB4MDUzOCwgMHhCRjBELCAweDA1M0MsIDB4NjkwMCwgCisgICAgMHhFMzA4LCAweDAxMzUsIDB4OEI4QywgMHhCRTU5LCAweEJCMDcsIDB4OTBBMCwgMHhCQzIwLCAweDc5ODAsIDB4MDE1NywgMHgwMzBDLCAweDhCOEIsIDB4QjkwMywgCisgICAgMHg4ODA5LCAweEJFQzYsIDB4MDEzRSwgMHg2OUFDLCAweDkwQUIsIDB4NjlBRCwgMHg5MEFCLCAweDA4MTMsIDB4NjYwQSwgMHhFMzQ0LCAweDAxNDQsIDB4MDMwOSwgCisgICAgMHg4MzBDLCAweEJDMjAsIDB4Nzk4MCwgMHgwMTU3LCAweDY5NTUsIDB4RTM4OCwgMHgwMTU3LCAweDdDMzgsIDB4QkYwQiwgMHgwNTc4LCAweEY1MDAsIDB4QkYwQiwgCisgICAgMHgwNTM4LCAweEI5MDcsIDB4ODgwOSwgMHhCRUM2LCAweDAxNTYsIDB4MTBBQiwgMHg5MEFBLCAweDY5NzQsIDB4RTM4OCwgMHgwMTYzLCAweEFFNzIsIDB4MDU0MCwgCisgICAgMHhGNTAwLCAweEFFNzIsIDB4MDUwMCwgMHhBRTYxLCAweDEwM0IsIDB4N0E4MCwgMHgwMkY2LCAweDY5NzgsIDB4RTM4OCwgMHgwMTgyLCAweDhCOEMsIDB4QkYwQywgCisgICAgMHgwNTYwLCAweEU1MDAsIDB4N0M0MCwgMHgwODE0LCAweEJBMjAsIDB4ODgxMiwgMHg3MzNELCAweDdBODAsIDB4MDM4MCwgMHg3MzNFLCAweDdBODAsIDB4MDM4MCwgCisgICAgMHg4QjhDLCAweEJGMEMsIDB4MDU2QywgMHhFNTAwLCAweDdDNDAsIDB4MDgxNCwgMHhCQTJDLCAweDg4MTIsIDB4NzMzRiwgMHg3QTgwLCAweDAzODAsIDB4NzM0MCwgCisgICAgMHg3QTgwLCAweDAzODAsIDB4Njk3NSwgMHhFMzg4LCAweDAxOEUsIDB4QUU3MiwgMHgwNTQ4LCAweEY1MDAsIDB4QUU3MiwgMHgwNTA4LCAweEFFNjEsIDB4MTA0MSwgCisgICAgMHg3QTgwLCAweDAyRjYsIDB4Njk3OSwgMHhFMzg4LCAweDAxQUQsIDB4OEI4QywgMHhCRjBDLCAweDA1NjAsIDB4RTUwMCwgMHg3QzQwLCAweDA4MTQsIDB4QkExOCwgCisgICAgMHg4ODEyLCAweDczNDMsIDB4N0E4MCwgMHgwMzgwLCAweDczNDQsIDB4N0E4MCwgMHgwMzgwLCAweDhCOEMsIDB4QkYwQywgMHgwNTZDLCAweEU1MDAsIDB4N0M0MCwgCisgICAgMHgwODE0LCAweEJBMjQsIDB4ODgxMiwgMHg3MzQ1LCAweDdBODAsIDB4MDM4MCwgMHg3MzQ2LCAweDdBODAsIDB4MDM4MCwgMHg2OTc2LCAweEUzODgsIDB4MDFCOSwgCisgICAgMHhBRTcyLCAweDA1NTgsIDB4RjUwMCwgMHhBRTcyLCAweDA1MTgsIDB4QUU2MSwgMHgxMDQ3LCAweDdBODAsIDB4MDJGNiwgMHg2OTdBLCAweEUzODgsIDB4MDFEOCwgCisgICAgMHg4QjhDLCAweEJGMEMsIDB4MDU2MCwgMHhFNTAwLCAweDdDNDAsIDB4MDgxNCwgMHhCQTA4LCAweDg4MTIsIDB4NzM0OSwgMHg3QTgwLCAweDAzODAsIDB4NzM0QSwgCisgICAgMHg3QTgwLCAweDAzODAsIDB4OEI4QywgMHhCRjBDLCAweDA1NkMsIDB4RTUwMCwgMHg3QzQwLCAweDA4MTQsIDB4QkExNCwgMHg4ODEyLCAweDczNEIsIDB4N0E4MCwgCisgICAgMHgwMzgwLCAweDczNEMsIDB4N0E4MCwgMHgwMzgwLCAweEJDMjEsIDB4QUUxQywgMHgxMDkwLCAweDhCOEEsIDB4QkYwQSwgMHgwNTYwLCAweEU1MDAsIDB4N0M0MCwgCisgICAgMHgwODEyLCAweEI4MDQsIDB4ODgxMywgMHg4QjhELCAweEJGMEQsIDB4MDU2QywgMHhFNTAwLCAweDdDNDAsIDB4MDgxNSwgMHhCODA0LCAweDg4MTEsIDB4N0E4MCwgCisgICAgMHgwMzRBLCAweDhCOEEsIDB4QkYwQSwgMHgwNTYwLCAweEU1MDAsIDB4N0M0MCwgMHg3MzFGLCAweEI5MDMsIDB4ODgwOSwgMHhCRUM2LCAweDAxRjksIDB4NTQ4QSwgCisgICAgMHhCRTAzLCAweDk4QTAsIDB4NzMyMCwgMHhCOTAzLCAweDg4MDksIDB4QkVDNiwgMHgwMjAxLCAweDU0OEEsIDB4QkUwMywgMHg5OEEwLCAweDFGMjAsIDB4MkYxRiwgCisgICAgMHg5ODI2LCAweEJDMjAsIDB4NjkzNSwgMHhFMzg4LCAweDAzQTEsIDB4NjkzMywgMHhCODAxLCAweDkwMzMsIDB4QkZBMCwgMHgwMkVFLCAweEUzMDgsIDB4MDNBMSwgCisgICAgMHg5MDMzLCAweEJGMDAsIDB4Njk1MSwgMHhFMzg4LCAweDAyMUYsIDB4NzMzNCwgMHhCRTgwLCAweDU3NjAsIDB4QkUwMywgMHg5RjdFLCAweEJFNTksIDB4OTAzNCwgCisgICAgMHg2OTdFLCAweDBENTEsIDB4OTAxMywgMHhCQzIwLCAweDY5NUMsIDB4RTM4OCwgMHgwM0ExLCAweDczNUUsIDB4QkU4MCwgMHg1NzYwLCAweEJFMDMsIDB4OUY3RSwgCisgICAgMHhCRTU5LCAweDkwNUUsIDB4Njk3RSwgMHgwRDVDLCAweDkwMTMsIDB4Nzk4MCwgMHgwM0ExLCAweDdBODAsIDB4MDM4QSwgMHhCRjAxLCAweEJFNDMsIDB4Njk3NywgCisgICAgMHhFMzg4LCAweDAyNEUsIDB4QUU2MSwgMHgxMDRELCAweDAwNjEsIDB4OEI4OCwgMHg2OTgwLCAweEUzODgsIDB4MDI0RSwgMHg5MDcxLCAweDBENzEsIDB4MDAwQiwgCisgICAgMHhBRkEwLCAweDgwMTAsIDB4QUZBMCwgMHg4MDEwLCAweDA4MTAsIDB4NjYwQSwgMHhFMzA4LCAweDAyNDksIDB4MDAwOSwgMHgwODEwLCAweDY2MEMsIDB4RTM4OCwgCisgICAgMHgwMjRFLCAweDgwMEIsIDB4QkMyMCwgMHg2OTdCLCAweEUzODgsIDB4MDNBMSwgMHhCRjBBLCAweDEwOUUsIDB4OEI4QSwgMHhBRjgwLCAweDgwMTQsIDB4NEM4MCwgCisgICAgMHhFMTAwLCAweDAyNjYsIDB4Njk3QywgMHhCRjkwLCAweDA1NjAsIDB4OTA3MiwgMHgwMzcyLCAweDY5N0MsIDB4QkY5MCwgMHgwNTY0LCAweDkwNzMsIDB4MDQ3MywgCisgICAgMHg3OTgwLCAweDAyNzAsIDB4Njk3QywgMHhCRjkwLCAweDA1MjAsIDB4OTA3MiwgMHgwMzcyLCAweDY5N0MsIDB4QkY5MCwgMHgwNTI0LCAweDkwNzMsIDB4MDQ3MywgCisgICAgMHg2OTdDLCAweEI4MDEsIDB4OTA3QywgMHhCRjBBLCAweDEwRkQsIDB4OEI4QSwgMHhBRjgwLCAweDgwMTAsIDB4NzM0RiwgMHg1NDhBLCAweEJFMDMsIDB4OTg4MCwgCisgICAgMHhCQzIxLCAweDczMjYsIDB4NTQ4QiwgMHhCRTAzLCAweDYxOEIsIDB4OTg4QywgMHhCRTAzLCAweDYxODAsIDB4OTg4MCwgMHg3OTgwLCAweDAzQTEsIDB4N0E4MCwgCisgICAgMHgwMzhBLCAweDBEMjgsIDB4NDcxMSwgMHhFMTAwLCAweDAyQkUsIDB4QUYxMiwgMHg0MDA2LCAweDY5MTIsIDB4QkZCMCwgMHgwQzAwLCAweEUzODgsIDB4MDJCNiwgCisgICAgMHhCRkEwLCAweDA4MDAsIDB4RTM4OCwgMHgwMkIyLCAweDY5MTIsIDB4QkZCMCwgMHgwQzAwLCAweEJGQTAsIDB4MDQwMCwgMHhFMzg4LCAweDAyQTMsIDB4NjkwOSwgCisgICAgMHg5MDBCLCAweDc5ODAsIDB4MDJBNSwgMHhBRjBCLCAweDQwMDUsIDB4NjkwMSwgMHg5MDA1LCAweDY5MDIsIDB4OTAwNiwgMHg0MzExLCAweEUxMDAsIDB4MDJFRCwgCisgICAgMHg2OTExLCAweEJGQzAsIDB4MjAwMCwgMHg5MDExLCAweDc5ODAsIDB4MDJFRCwgMHg2OTA5LCAweDkwMEIsIDB4Nzk4MCwgMHgwMkI4LCAweEFGMEIsIDB4NDAwNSwgCisgICAgMHhBRjA1LCAweDQwMDMsIDB4QUYwNiwgMHg0MDA0LCAweDc5ODAsIDB4MDJFRCwgMHhBRjEyLCAweDQwMDYsIDB4NjkxMiwgMHhCRkIwLCAweDBDMDAsIDB4RTM4OCwgCisgICAgMHgwMkU3LCAweEJGQTAsIDB4MDgwMCwgMHhFMzg4LCAweDAyRTMsIDB4NjkxMiwgMHhCRkIwLCAweDBDMDAsIDB4QkZBMCwgMHgwNDAwLCAweEUzODgsIDB4MDJENCwgCisgICAgMHg2OTBELCAweDkwMTAsIDB4Nzk4MCwgMHgwMkQ2LCAweEFGMTAsIDB4NDAwNSwgMHg2OTAxLCAweDkwMDUsIDB4NjkwMiwgMHg5MDA2LCAweDQzMTEsIDB4RTEwMCwgCisgICAgMHgwMkVELCAweDY5MTEsIDB4QkZDMCwgMHgyMDAwLCAweDkwMTEsIDB4Nzk4MCwgMHgwMkVELCAweDY5MEQsIDB4OTAxMCwgMHg3OTgwLCAweDAyRTksIDB4QUYxMCwgCisgICAgMHg0MDA1LCAweEFGMDUsIDB4NDAwMywgMHhBRjA2LCAweDQwMDQsIDB4QkMyMCwgMHg2OTcwLCAweDkwNzEsIDB4N0E4MCwgMHgwMDc4LCAweDY5NzEsIDB4OTA3MCwgCisgICAgMHg3OTgwLCAweDAzQTEsIDB4QkMyMCwgMHgwMzYxLCAweDhCOEIsIDB4Njk4MCwgMHhFRjg4LCAweDAyNzIsIDB4MDM3MiwgMHg3ODA0LCAweDkwNzEsIDB4MEQ3MSwgCisgICAgMHg4QjhBLCAweDAwMEIsIDB4QjkwMywgMHg4ODA5LCAweEJFQzYsIDB4MDMwOSwgMHg2OUE4LCAweDkwQUIsIDB4NjlBOCwgMHg5MEFBLCAweDA4MTAsIDB4NjYwQSwgCisgICAgMHhFMzQ0LCAweDAzMEYsIDB4MDAwOSwgMHgwODEwLCAweDY2MEMsIDB4RTM4OCwgMHgwMzE0LCAweDgwMEIsIDB4QkMyMCwgMHg2OTYxLCAweEI4MDEsIDB4OTA2MSwgCisgICAgMHg3OTgwLCAweDAyRjcsIDB4N0E4MCwgMHgwMzhBLCAweDVEMzUsIDB4MDAwMSwgMHg2OTM0LCAweEI4MDEsIDB4OTAzNCwgMHhCRjBBLCAweDEwOUUsIDB4OEI4QSwgCisgICAgMHhBRjgwLCAweDgwMTQsIDB4NDg4MCwgMHhBRTcyLCAweDA1NTAsIDB4RjUwMCwgMHhBRTcyLCAweDA1MTAsIDB4QUU2MSwgMHgxMDUxLCAweDdBODAsIDB4MDJGNiwgCisgICAgMHg3OTgwLCAweDAzQTEsIDB4N0E4MCwgMHgwMzhBLCAweDVEMzUsIDB4MDAwMiwgMHg2OTVFLCAweEI4MDEsIDB4OTA1RSwgMHhCRjBBLCAweDEwOUUsIDB4OEI4QSwgCisgICAgMHhBRjgwLCAweDgwMTQsIDB4NDc4MCwgMHhBRTcyLCAweDA1NTgsIDB4RjUwMCwgMHhBRTcyLCAweDA1MTgsIDB4QUU2MSwgMHgxMDVDLCAweDdBODAsIDB4MDJGNiwgCisgICAgMHg3OTgwLCAweDAzQTEsIDB4MDAxQywgMHg4Qjg4LCAweDY5ODAsIDB4RUY4OCwgMHg5MDFELCAweDBEMUQsIDB4MTAwRiwgMHg2NjEwLCAweEUzOEMsIDB4MDM1OCwgCisgICAgMHg2OTBFLCAweDY2MTAsIDB4NjIwRiwgMHg2NjBELCAweEJBMEYsIDB4RTMwMSwgMHgwMzdBLCAweDA0MTAsIDB4OEI4QSwgMHhCOTAzLCAweDg4MDksIDB4QkVDNiwgCisgICAgMHgwMzZDLCAweDZBOEMsIDB4NjFBQSwgMHg5OEFCLCAweDZBOEMsIDB4NjFBQiwgMHg5OEFELCAweDZBOEMsIDB4NjFBRCwgMHg5OEE5LCAweDZBOEMsIDB4NjFBOSwgCisgICAgMHg5OEFBLCAweDdDMDQsIDB4OEI4QiwgMHg3QzA0LCAweDhCOEQsIDB4N0MwNCwgMHg4Qjg5LCAweDdDMDQsIDB4MDgxNCwgMHg2NjBFLCAweEUzMDgsIDB4MDM3OSwgCisgICAgMHgwNDBELCAweDg0MTAsIDB4QkMyMSwgMHg2OTFDLCAweEI4MDEsIDB4OTAxQywgMHg3OTgwLCAweDAzNEEsIDB4QjkwMywgMHg4ODA5LCAweDhCOEEsIDB4QkVDNiwgCisgICAgMHgwMzg4LCAweDU0QUMsIDB4QkUwMywgMHg2MThDLCAweDk4QUEsIDB4RUYwMCwgMHhCQzIwLCAweEJFNDYsIDB4MDgwOSwgMHg5MDZCLCAweDA4MEEsIDB4OTA2QywgCisgICAgMHgwODBCLCAweDkwNkQsIDB4MDgxQSwgMHg5MDYyLCAweDA4MUIsIDB4OTA2MywgMHgwODFFLCAweDkwNjQsIDB4QkU1OSwgMHg4ODFFLCAweDgwNjUsIDB4ODE2NiwgCisgICAgMHg4MjY3LCAweDgzNjgsIDB4ODQ2OSwgMHg4NTZBLCAweEVGMDAsIDB4QkMyMCwgMHg2OTZCLCAweDg4MDksIDB4Njk2QywgMHg4ODBBLCAweDY5NkQsIDB4ODgwQiwgCisgICAgMHg2OTYyLCAweDg4MUEsIDB4Njk2MywgMHg4ODFCLCAweDY5NjQsIDB4ODgxRSwgMHgwMDY1LCAweDAxNjYsIDB4MDI2NywgMHgwMzY4LCAweDA0NjksIDB4MDU2QSwgCisgICAgMHhCRTNBLCAKK307CisKKy8qCisgKiBNaW5pIHNhbXBsZSByYXRlIGNvbnZlcnRlciBjb2RlIGltYWdlCisgKiB0aGF0IGlzIHRvIGJlIGxvYWRlZCBhdCAweDQwMCBvbiB0aGUgRFNQLgorICovCitzdGF0aWMgdTE2IGFzc3BfbWluaXNyY19pbWFnZVtdID0geworCisgICAgMHhCRjgwLCAweDEwMUUsIDB4OTA2RSwgMHgwMDZFLCAweDhCODgsIDB4Njk4MCwgMHhFRjg4LCAweDkwNkYsIDB4MEQ2RiwgMHg2OTAwLCAweEVCMDgsIDB4MDQxMiwgCisgICAgMHhCQzIwLCAweDY5NkUsIDB4QjgwMSwgMHg5MDZFLCAweDc5ODAsIDB4MDQwMywgMHhCOTBFLCAweDg4MDcsIDB4QkU0MywgMHhCRjAxLCAweEJFNDcsIDB4QkU0MSwgCisgICAgMHg3QTgwLCAweDAwMkEsIDB4QkU0MCwgMHgzMDI5LCAweEVGQ0MsIDB4QkU0MSwgMHg3QTgwLCAweDAwMjgsIDB4QkU0MCwgMHgzMDI4LCAweEVGQ0MsIDB4NjkwNywgCisgICAgMHhFMzA4LCAweDA0MkEsIDB4NjkwOSwgMHg5MDJDLCAweDc5ODAsIDB4MDQyQywgMHg2OTBELCAweDkwMkMsIDB4MTAwOSwgMHg4ODFBLCAweDEwMEEsIDB4QkEwMSwgCisgICAgMHg4ODFCLCAweDEwMEQsIDB4ODgxQywgMHgxMDBFLCAweEJBMDEsIDB4ODgxRCwgMHhCRjgwLCAweDAwRUQsIDB4ODgxRSwgMHgwNTBDLCAweDAxMjQsIDB4QjkwNCwgCisgICAgMHg5MDI3LCAweDY5MTgsIDB4RTMwOCwgMHgwNEIzLCAweDkwMkQsIDB4NjkxMywgMHhCRkEwLCAweDc1OTgsIDB4RjcwNCwgMHhBRTJELCAweDAwRkYsIDB4OEI4RCwgCisgICAgMHg2OTE5LCAweEUzMDgsIDB4MDQ2MywgMHg2OTFBLCAweEUzMDgsIDB4MDQ1NiwgMHhCOTA3LCAweDg4MDksIDB4QkVDNiwgMHgwNDUzLCAweDEwQTksIDB4OTBBRCwgCisgICAgMHg3OTgwLCAweDA0N0MsIDB4QjkwMywgMHg4ODA5LCAweEJFQzYsIDB4MDQ2MCwgMHgxODg5LCAweDZDMjIsIDB4OTBBRCwgMHgxMEE5LCAweDZFMjMsIDB4NkMyMiwgCisgICAgMHg5MEFELCAweDc5ODAsIDB4MDQ3QywgMHgxMDFBLCAweEUzMDgsIDB4MDQ2RiwgMHhCOTAzLCAweDg4MDksIDB4QkVDNiwgMHgwNDZDLCAweDEwQTksIDB4OTBBMCwgCisgICAgMHg5MEFELCAweDc5ODAsIDB4MDQ3QywgMHhCOTAxLCAweDg4MDksIDB4QkVDNiwgMHgwNDdCLCAweDE4ODksIDB4NkMyMiwgMHg5MEEwLCAweDkwQUQsIDB4MTBBOSwgCisgICAgMHg2RTIzLCAweDZDMjIsIDB4OTBBMCwgMHg5MEFELCAweDY5MkQsIDB4RTMwOCwgMHgwNDlDLCAweDAxMjQsIDB4QjcwMywgMHhCOTAyLCAweDg4MTgsIDB4OEI4OSwgCisgICAgMHgwMjJDLCAweDEwOEEsIDB4N0MwNCwgMHg5MEEwLCAweDY5MkIsIDB4ODgxRiwgMHg3RTgwLCAweDA1NUIsIDB4NjkyQSwgMHg4ODA5LCAweDhCODksIDB4OTlBMCwgCisgICAgMHgxMDhBLCAweDkwQTAsIDB4NjkyQiwgMHg4ODFGLCAweDdFODAsIDB4MDU1QiwgMHg2OTJBLCAweDg4MDksIDB4OEI4OSwgMHg5OUFGLCAweDdCOTksIDB4MDQ4NCwgCisgICAgMHgwMTI0LCAweDA2MEYsIDB4MTAxQiwgMHgyMDEzLCAweDkwMUIsIDB4QkZBMCwgMHg3RkZGLCAweEUzNDQsIDB4MDRBQywgMHg5MDFCLCAweDhCODksIDB4N0E4MCwgCisgICAgMHgwNTFBLCAweDY5MjcsIDB4QkEwMSwgMHg5MDI3LCAweDdBODAsIDB4MDUyMywgMHg2OTI3LCAweEUzMDgsIDB4MDQ5RSwgMHg3OTgwLCAweDA1MEYsIDB4MDYyNCwgCisgICAgMHgxMDI2LCAweDIwMTMsIDB4OTAyNiwgMHhCRkEwLCAweDdGRkYsIDB4RTMwNCwgMHgwNEMwLCAweDhCOEQsIDB4N0E4MCwgMHgwNTFBLCAweDc5ODAsIDB4MDRCNCwgCisgICAgMHg5MDI2LCAweDEwMTMsIDB4MzAyNiwgMHg5MDFCLCAweDhCOEQsIDB4N0E4MCwgMHgwNTFBLCAweDdBODAsIDB4MDUyMywgMHgxMDI3LCAweEJBMDEsIDB4OTAyNywgCisgICAgMHhFMzA4LCAweDA0QjQsIDB4MDEyNCwgMHgwNjBGLCAweDhCODksIDB4NjkxQSwgMHhFMzA4LCAweDA0RUEsIDB4NjkxOSwgMHhFMzg4LCAweDA0RTAsIDB4QjkwMywgCisgICAgMHg4ODA5LCAweEJFQzYsIDB4MDRERCwgMHgxRkEwLCAweDJGQUUsIDB4OThBOSwgMHg3OTgwLCAweDA1MEYsIDB4QjkwMSwgMHg4ODE4LCAweEI5MDcsIDB4ODgwOSwgCisgICAgMHhCRUM2LCAweDA0RTcsIDB4MTBFRSwgMHg5MEE5LCAweDc5ODAsIDB4MDUwRiwgMHg2OTE5LCAweEUzMDgsIDB4MDRGRSwgMHhCOTAzLCAweDg4MDksIDB4QkU0NiwgCisgICAgMHhCRUM2LCAweDA0RkEsIDB4MTdBMCwgMHhCRTFFLCAweDFGQUUsIDB4QkZCRiwgMHhGRjAwLCAweEJFMTMsIDB4QkZERiwgMHg4MDgwLCAweDk5QTksIDB4QkU0NywgCisgICAgMHg3OTgwLCAweDA1MEYsIDB4QjkwMSwgMHg4ODA5LCAweEJFQzYsIDB4MDUwRSwgMHgxNkEwLCAweDI2QTAsIDB4QkZCNywgMHhGRjAwLCAweEJFMUUsIDB4MUVBMCwgCisgICAgMHgyRUFFLCAweEJGQkYsIDB4RkYwMCwgMHhCRTEzLCAweEJGREYsIDB4ODA4MCwgMHg5OUE5LCAweDg1MEMsIDB4ODYwRiwgMHg2OTA3LCAweEUzODgsIDB4MDUxNiwgCisgICAgMHgwRDA3LCAweDg1MTAsIDB4QkU1OSwgMHg4ODFFLCAweEJFNEEsIDB4RUYwMCwgMHgxMDFFLCAweDkwMUMsIDB4MTAxRiwgMHg5MDFELCAweDEwQTAsIDB4OTAxRSwgCisgICAgMHgxMEEwLCAweDkwMUYsIDB4RUYwMCwgMHgxMDFFLCAweDMwMUMsIDB4OTAyMCwgMHg3MzFCLCAweDU0MjAsIDB4QkUwMywgMHg5ODI1LCAweDEwMjUsIDB4MjAxQywgCisgICAgMHg5MDI1LCAweDczMjUsIDB4NTQxNCwgMHhCRTAzLCAweDhCOEUsIDB4OTg4MCwgMHg2OTJGLCAweEUzODgsIDB4MDUzOSwgMHhCRTU5LCAweEJCMDcsIDB4NjE4MCwgCisgICAgMHg5ODgwLCAweDhCQTAsIDB4MTAxRiwgMHgzMDFELCAweDkwMjEsIDB4NzMxQiwgMHg1NDIxLCAweEJFMDMsIDB4OTgyRSwgMHgxMDJFLCAweDIwMUQsIDB4OTAyRSwgCisgICAgMHg3MzJFLCAweDU0MTUsIDB4QkUwMywgMHg5ODgwLCAweDY5MkYsIDB4RTM4OCwgMHgwNTRGLCAweEJFNTksIDB4QkIwNywgMHg2MTgwLCAweDk4ODAsIDB4OEJBMCwgCisgICAgMHg2OTE4LCAweEVGMDgsIDB4NzMyNSwgMHg1NDE2LCAweEJFMDMsIDB4OThBMCwgMHg3MzJFLCAweDU0MTcsIDB4QkUwMywgMHg5OEEwLCAweEVGMDAsIDB4OEJBMCwgCisgICAgMHhCRUM2LCAweDA1NkIsIDB4QkU1OSwgMHhCQjA0LCAweEFBOTAsIDB4QkUwNCwgMHhCRTFFLCAweDk5RTAsIDB4OEJFMCwgMHg2OUEwLCAweDkwRDAsIDB4NjlBMCwgCisgICAgMHg5MEQwLCAweDA4MUYsIDB4QjgwNSwgMHg4ODFGLCAweDhCOTAsIDB4NjlBMCwgMHg5MEQwLCAweDY5QTAsIDB4OTA5MCwgMHg4QkQwLCAweDhCRDgsIDB4QkUxRiwgCisgICAgMHhFRjAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCit9OworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbWF1aS5jIGIvc291bmQvb3NzL21hdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWNmMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL21hdWkuYwpAQCAtMCwwICsxLDQ3OCBAQAorLyoKKyAqIHNvdW5kL21hdWkuYworICoKKyAqIFRoZSBsb3cgbGV2ZWwgZHJpdmVyIGZvciBUdXJ0bGUgQmVhY2ggTWF1aSBhbmQgVHJvcGV6LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKglDaGFuZ2VzOgorICoJCUFsYW4gQ294CQlHZW5lcmFsIGNsZWFuIHVwLCB1c2Uga2VybmVsIElSUSAKKyAqCQkJCQlzeXN0ZW0KKyAqCQlDaHJpc3RvcGggSGVsbHdpZwlBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKgkJQmFydGxvbWllaiBab2xuaWVya2lld2ljegorICoJCQkJCUFkZGVkIF9faW5pdCB0byBkb3dubG9hZF9jb2RlKCkKKyAqCisgKglTdGF0dXM6CisgKgkJQW5kcmV3IEouIEtyb2xsCQlUZXN0ZWQgMDYvMDEvMTk5OSB3aXRoOgorICoJCQkJCSogT1NXRi5NT1QgRmlsZSBWZXJzaW9uOiAxLjE1CisgKgkJCQkJKiBPU1dGLk1PVCBGaWxlIERhdGVkOiAwOS8xMi85NAorICoJCQkJCSogT2xkZXIgdmVyc2lvbnMgd2lsbCBjYXVzZSBwcm9ibGVtcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjZGVmaW5lIFVTRV9TRVFfTUFDUk9TCisjZGVmaW5lIFVTRV9TSU1QTEVfTUFDUk9TCisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJzb3VuZF9maXJtd2FyZS5oIgorCisjaW5jbHVkZSAibXB1NDAxLmgiCisKK3N0YXRpYyBpbnQgICAgICBtYXVpX2Jhc2UgPSAweDMzMDsKKworc3RhdGljIHZvbGF0aWxlIGludCBpcnFfb2s7CitzdGF0aWMgaW50ICAgICAqbWF1aV9vc3A7CisKKyNkZWZpbmUgSE9TVF9EQVRBX1BPUlQJKG1hdWlfYmFzZSArIDIpCisjZGVmaW5lIEhPU1RfU1RBVF9QT1JUCShtYXVpX2Jhc2UgKyAzKQorI2RlZmluZSBIT1NUX0NUUkxfUE9SVAkobWF1aV9iYXNlICsgMykKKworI2RlZmluZSBTVEFUX1RYX0lOVFIJMHg0MAorI2RlZmluZSBTVEFUX1RYX0FWQUlMCTB4MjAKKyNkZWZpbmUgU1RBVF9UWF9JRU5BCTB4MTAKKyNkZWZpbmUgU1RBVF9SWF9JTlRSCTB4MDQKKyNkZWZpbmUgU1RBVF9SWF9BVkFJTAkweDAyCisjZGVmaW5lIFNUQVRfUlhfSUVOQQkweDAxCisKK3N0YXRpYyBpbnQgICAgICAoKm9yaWdfbG9hZF9wYXRjaCkoaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJCQkgICAgICBpbnQgb2ZmcywgaW50IGNvdW50LCBpbnQgcG1ncl9mbGFnKSA9IE5VTEw7CisKKyNpbmNsdWRlICJtYXVpX2Jvb3QuaCIKKworc3RhdGljIGludCBtYXVpX3dhaXQoaW50IG1hc2spCit7CisJaW50IGk7CisKKwkvKgorCSAqIFBlcmZvcm0gYSBzaG9ydCBpbml0aWFsIHdhaXQgd2l0aG91dCBzbGVlcGluZworCSAqLworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorCQlpZiAoaW5iKEhPU1RfU1RBVF9QT1JUKSAmIG1hc2spCisJCQlyZXR1cm4gMTsKKworCS8qCisJICogV2FpdCB1cCB0byAxNSBzZWNvbmRzIHdpdGggc2xlZXBpbmcKKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCAxNTA7IGkrKykgeworCQlpZiAoaW5iKEhPU1RfU1RBVF9QT1JUKSAmIG1hc2spCisJCQlyZXR1cm4gMTsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAxMCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXVpX3JlYWQodm9pZCkKK3sKKwlpZiAobWF1aV93YWl0KFNUQVRfUlhfQVZBSUwpKQorCQlyZXR1cm4gaW5iKEhPU1RfREFUQV9QT1JUKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbWF1aV93cml0ZSh1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJaWYgKG1hdWlfd2FpdChTVEFUX1RYX0FWQUlMKSkgeworCQlvdXRiKChkYXRhKSwgSE9TVF9EQVRBX1BPUlQpOworCQlyZXR1cm4gMTsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiTWF1aTogV3JpdGUgdGltZW91dFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYXVpaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpkdW1teSkKK3sKKwlpcnFfb2sgPSAxOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2luaXQgZG93bmxvYWRfY29kZSh2b2lkKQoreworCWludCBpLCBsaW5lcyA9IDA7CisJaW50IGVvbF9zZWVuID0gMCwgZG9uZSA9IDA7CisJaW50IHNraXAgPSAxOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ29kZSBkb3dubG9hZCAoJWQgYnl0ZXMpOiAiLCBtYXVpX29zTGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXVpX29zTGVuOyBpKyspIHsKKwkJaWYgKG1hdWlfb3NbaV0gIT0gJ1xyJykgeworCQkJaWYgKCFza2lwIHx8IChtYXVpX29zW2ldID09ICdTJyAmJiAoaSA9PSAwIHx8IG1hdWlfb3NbaSAtIDFdID09ICdcbicpKSkgeworCQkJCXNraXAgPSAwOworCisJCQkJaWYgKG1hdWlfb3NbaV0gPT0gJ1xuJykKKwkJCQkJZW9sX3NlZW4gPSBza2lwID0gMTsKKwkJCQllbHNlIGlmIChtYXVpX29zW2ldID09ICdTJykgeworCQkJCQlpZiAobWF1aV9vc1tpICsgMV0gPT0gJzgnKQorCQkJCQkJZG9uZSA9IDE7CisJCQkJCWlmICghbWF1aV93cml0ZSgweEYxKSkKKwkJCQkJCWdvdG8gZmFpbHVyZTsKKwkJCQkJaWYgKCFtYXVpX3dyaXRlKCdTJykpCisJCQkJCQlnb3RvIGZhaWx1cmU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCFtYXVpX3dyaXRlKG1hdWlfb3NbaV0pKQorCQkJCQkJZ290byBmYWlsdXJlOworCQkJCX0KKworCQkJCWlmIChlb2xfc2VlbikgeworCQkJCQlpbnQgYyA9IDA7CisJCQkJCWludCBuOworCisJCQkJCWVvbF9zZWVuID0gMDsKKworCQkJCQlmb3IgKG4gPSAwOyBuIDwgMjsgbisrKSB7CisJCQkJCQlpZiAobWF1aV93YWl0KFNUQVRfUlhfQVZBSUwpKSB7CisJCQkJCQkJYyA9IGluYihIT1NUX0RBVEFfUE9SVCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGMgIT0gMHg4MCkgeworCQkJCQkJcHJpbnRrKCJEb3dubG9hZCBub3QgYWNrbm93bGVkZ2VkXG4iKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKCEobGluZXMrKyAlIDEwKSkKKwkJCQkJCXByaW50aygiLiIpOworCisJCQkJCWlmIChkb25lKSB7CisJCQkJCQlwcmludGsoIlxuIik7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICJEb3dubG9hZCBjb21wbGV0ZVxuIik7CisJCQkJCQlyZXR1cm4gMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworZmFpbHVyZToKKwlwcmludGsoIlxuIik7CisJcHJpbnRrKEtFUk5fRVJSICJEb3dubG9hZCBmYWlsZWQhISFcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtYXVpX2luaXQoaW50IGlycSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisKKwlzd2l0Y2ggKGlycSkgeworCQljYXNlIDk6CisJCQliaXRzID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQliaXRzID0gMHgwODsKKwkJCWJyZWFrOworCQljYXNlIDEyOgorCQkJYml0cyA9IDB4MTA7CisJCQlicmVhazsKKwkJY2FzZSAxNToKKwkJCWJpdHMgPSAweDE4OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiTWF1aTogSW52YWxpZCBJUlEgJWRcbiIsIGlycSk7CisJCQlyZXR1cm4gMDsKKwl9CisJb3V0YigoMHgwMCksIEhPU1RfQ1RSTF9QT1JUKTsJLyogUmVzZXQgKi8KKwlvdXRiKChiaXRzKSwgSE9TVF9EQVRBX1BPUlQpOwkvKiBTZXQgdGhlIElSUSBiaXRzICovCisJb3V0YigoYml0cyB8IDB4ODApLCBIT1NUX0RBVEFfUE9SVCk7CS8qIFNldCB0aGUgSVJRIGJpdHMgYWdhaW4/ICovCisJb3V0YigoMHg4MCksIEhPU1RfQ1RSTF9QT1JUKTsJLyogTGVhdmUgcmVzZXQgKi8KKwlvdXRiKCgweDgwKSwgSE9TVF9DVFJMX1BPUlQpOwkvKiBMZWF2ZSByZXNldCAqLworCW91dGIoKDB4RDApLCBIT1NUX0NUUkxfUE9SVCk7CS8qIENhdXNlIGludGVycnVwdCAqLworCisjaWZkZWYgQ09ORklHX1NNUAorCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDAwICYmICFpcnFfb2s7IGkrKykKKwkJCTsKKwkJaWYgKCFpcnFfb2spCisJCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwlvdXRiKCgweDgwKSwgSE9TVF9DVFJMX1BPUlQpOwkvKiBMZWF2ZSByZXNldCAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAiVHVydGxlIEJlYWNoIE1hdWkgaW5pdGlhbGl6YXRpb25cbiIpOworCisJaWYgKCFkb3dubG9hZF9jb2RlKCkpCisJCXJldHVybiAwOworCisJb3V0YigoMHhFMCksIEhPU1RfQ1RSTF9QT1JUKTsJLyogTm9ybWFsIG9wZXJhdGlvbiAqLworCisJLyogU2VsZWN0IG1wdTQwMSBtb2RlICovCisKKwltYXVpX3dyaXRlKDB4ZjApOworCW1hdWlfd3JpdGUoMSk7CisJaWYgKG1hdWlfcmVhZCgpICE9IDB4ODApIHsKKwkJbWF1aV93cml0ZSgweGYwKTsKKwkJbWF1aV93cml0ZSgxKTsKKwkJaWYgKG1hdWlfcmVhZCgpICE9IDB4ODApCisJCQlwcmludGsoS0VSTl9FUlIgIk1hdWkgZGlkbid0IGFja25vd2xlZGdlIHNldCBIVyBtb2RlIGNvbW1hbmRcbiIpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJNYXVpIGluaXRpYWxpemVkIE9LXG4iKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtYXVpX3Nob3J0X3dhaXQoaW50IG1hc2spIHsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkJaWYgKGluYihIT1NUX1NUQVRfUE9SVCkgJiBtYXNrKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXVpX2xvYWRfcGF0Y2goaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJCWludCBvZmZzLCBpbnQgY291bnQsIGludCBwbWdyX2ZsYWcpCit7CisKKwlzdHJ1Y3Qgc3lzZXhfaW5mbyBoZWFkZXI7CisJdW5zaWduZWQgbG9uZyBsZWZ0LCBzcmNfb2ZmczsKKwlpbnQgaGRyX3NpemUgPSAodW5zaWduZWQgbG9uZykgJmhlYWRlci5kYXRhWzBdIC0gKHVuc2lnbmVkIGxvbmcpICZoZWFkZXI7CisJaW50IGk7CisKKwlpZiAoZm9ybWF0ID09IFNZU0VYX1BBVENIKQkvKiBIYW5kbGVkIGJ5IG1pZGlfc3ludGguYyAqLworCQlyZXR1cm4gb3JpZ19sb2FkX3BhdGNoKGRldiwgZm9ybWF0LCBhZGRyLCBvZmZzLCBjb3VudCwgcG1ncl9mbGFnKTsKKworCWlmIChmb3JtYXQgIT0gTUFVSV9QQVRDSCkKKwl7CisJCSAgcHJpbnRrKEtFUk5fV0FSTklORyAiTWF1aTogVW5rbm93biBwYXRjaCBmb3JtYXRcbiIpOworCX0KKwlpZiAoY291bnQgPCBoZHJfc2l6ZSkgeworLyoJCSAgcHJpbnRrKCJNYXVpIGVycm9yOiBQYXRjaCBoZWFkZXIgdG9vIHNob3J0XG4iKTsqLworCQkgIHJldHVybiAtRUlOVkFMOworCX0KKwljb3VudCAtPSBoZHJfc2l6ZTsKKworCS8qCisJICogQ29weSB0aGUgaGVhZGVyIGZyb20gdXNlciBzcGFjZSBidXQgaWdub3JlIHRoZSBmaXJzdCBieXRlcyB3aGljaCBoYXZlCisJICogYmVlbiB0cmFuc2ZlcnJlZCBhbHJlYWR5LgorCSAqLworCisJaWYoY29weV9mcm9tX3VzZXIoJigoY2hhciAqKSAmaGVhZGVyKVtvZmZzXSwgJihhZGRyKVtvZmZzXSwgaGRyX3NpemUgLSBvZmZzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY291bnQgPCBoZWFkZXIubGVuKSB7CisJCSAgcHJpbnRrKEtFUk5fRVJSICJNYXVpIHdhcm5pbmc6IEhvc3QgY29tbWFuZCByZWNvcmQgdG9vIHNob3J0ICglZDwlZClcbiIsIGNvdW50LCAoaW50KSBoZWFkZXIubGVuKTsKKwkJICBoZWFkZXIubGVuID0gY291bnQ7CisJfQorCWxlZnQgPSBoZWFkZXIubGVuOworCXNyY19vZmZzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZWZ0OyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciAgIGRhdGE7CisKKwkJaWYoZ2V0X3VzZXIoKih1bnNpZ25lZCBjaGFyICopICZkYXRhLCAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgJigoYWRkcilbaGRyX3NpemUgKyBpXSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChpID09IDAgJiYgIShkYXRhICYgMHg4MCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAobWF1aV93cml0ZShkYXRhKSA9PSAtMSkKKwkJCXJldHVybiAtRUlPOworCX0KKworCWlmICgoaSA9IG1hdWlfcmVhZCgpKSAhPSAweDgwKSB7CisJCWlmIChpICE9IC0xKQorCQkJcHJpbnRrKCJNYXVpOiBFcnJvciBzdGF0dXMgJTAyeFxuIiwgaSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfbWF1aShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwlpbnQgdGhpc19kZXY7CisJaW50IGk7CisJaW50IHRtcDEsIHRtcDIsIHJldDsKKworCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyLCAibXB1NDAxIik7CisJaWYgKCFwb3J0cykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSArIDIsIDYsICJNYXVpIikpCisJCWdvdG8gb3V0OworCisJbWF1aV9iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCW1hdWlfb3NwID0gaHdfY29uZmlnLT5vc3A7CisKKwlpZiAocmVxdWVzdF9pcnEoaHdfY29uZmlnLT5pcnEsIG1hdWlpbnRyLCAwLCAiTWF1aSIsIE5VTEwpIDwgMCkKKwkJZ290byBvdXQyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzb3IgaWYgbmVjZXNzYXJ5CisJICovCisKKwlpZiAobWF1aV9vc0xlbiA+IDApIHsKKwkJaWYgKCEoaW5iKEhPU1RfU1RBVF9QT1JUKSAmIFNUQVRfVFhfQVZBSUwpIHx8CisJCQkhbWF1aV93cml0ZSgweDlGKSB8fAkvKiBSZXBvcnQgZmlybXdhcmUgdmVyc2lvbiAqLworCQkJIW1hdWlfc2hvcnRfd2FpdChTVEFUX1JYX0FWQUlMKSB8fAorCQkJbWF1aV9yZWFkKCkgPT0gLTEgfHwgbWF1aV9yZWFkKCkgPT0gLTEpCisJCQlpZiAoIW1hdWlfaW5pdChod19jb25maWctPmlycSkpCisJCQkJZ290byBvdXQzOworCX0KKwlpZiAoIW1hdWlfd3JpdGUoMHhDRikpCS8qIFJlcG9ydCBoYXJkd2FyZSB2ZXJzaW9uICovIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBXYXZlRnJvbnQgZmlybXdhcmUgZGV0ZWN0ZWQgKGNhcmQgdW5pbml0aWFsaXplZD8pXG4iKTsKKwkJZ290byBvdXQzOworCX0KKwlpZiAoKHRtcDEgPSBtYXVpX3JlYWQoKSkgPT0gLTEgfHwgKHRtcDIgPSBtYXVpX3JlYWQoKSkgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBXYXZlRnJvbnQgZmlybXdhcmUgZGV0ZWN0ZWQgKGNhcmQgdW5pbml0aWFsaXplZD8pXG4iKTsKKwkJZ290byBvdXQzOworCX0KKwlpZiAodG1wMSA9PSAweGZmIHx8IHRtcDIgPT0gMHhmZikKKwkJZ290byBvdXQzOworCXByaW50ayhLRVJOX0RFQlVHICJXYXZlRnJvbnQgaGFyZHdhcmUgdmVyc2lvbiAlZC4lZFxuIiwgdG1wMSwgdG1wMik7CisKKwlpZiAoIW1hdWlfd3JpdGUoMHg5RikpCS8qIFJlcG9ydCBmaXJtd2FyZSB2ZXJzaW9uICovCisJCWdvdG8gb3V0MzsKKwlpZiAoKHRtcDEgPSBtYXVpX3JlYWQoKSkgPT0gLTEgfHwgKHRtcDIgPSBtYXVpX3JlYWQoKSkgPT0gLTEpCisJCWdvdG8gb3V0MzsKKworCXByaW50ayhLRVJOX0RFQlVHICJXYXZlRnJvbnQgZmlybXdhcmUgdmVyc2lvbiAlZC4lZFxuIiwgdG1wMSwgdG1wMik7CisKKwlpZiAoIW1hdWlfd3JpdGUoMHg4NSkpCS8qIFJlcG9ydCBmcmVlIERSQU0gKi8KKwkJZ290byBvdXQzOworCXRtcDEgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdG1wMSB8PSBtYXVpX3JlYWQoKSA8PCAoNyAqIGkpOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiQXZhaWxhYmxlIERSQU0gJWRrXG4iLCB0bXAxIC8gMTAyNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorCQlpZiAocHJvYmVfbXB1NDAxKGh3X2NvbmZpZywgcG9ydHMpKQorCQkJYnJlYWs7CisKKwlyZXQgPSBwcm9iZV9tcHU0MDEoaHdfY29uZmlnLCBwb3J0cyk7CisJaWYgKCFyZXQpCisJCWdvdG8gb3V0MzsKKworCWNvbmZfcHJpbnRmKCJNYXVpIiwgaHdfY29uZmlnKTsKKworCWh3X2NvbmZpZy0+aXJxICo9IC0xOworCWh3X2NvbmZpZy0+bmFtZSA9ICJNYXVpIjsKKwlhdHRhY2hfbXB1NDAxKGh3X2NvbmZpZywgVEhJU19NT0RVTEUpOworCisJaWYgKGh3X2NvbmZpZy0+c2xvdHNbMV0gIT0gLTEpCS8qIFRoZSBNUFU0MDEgZHJpdmVyIGluc3RhbGxlZCBpdHNlbGYgKi8geworCQlzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyAqc3ludGg7CisKKwkJdGhpc19kZXYgPSBod19jb25maWctPnNsb3RzWzFdOworCisJCS8qCisJCSAqIEludGVyY2VwdCBwYXRjaCBsb2FkaW5nIGNhbGxzIHNvIHRoYXQgdGhleSBjYW4gYmUgaGFuZGxlZAorCQkgKiBieSB0aGUgTWF1aSBkcml2ZXIuCisJCSAqLworCisJCXN5bnRoID0gbWlkaV9kZXZzW3RoaXNfZGV2XS0+Y29udmVydGVyOworCQlpZiAoc3ludGggIT0gTlVMTCkgeworCQkJc3ludGgtPmlkID0gIk1BVUkiOworCQkJb3JpZ19sb2FkX3BhdGNoID0gc3ludGgtPmxvYWRfcGF0Y2g7CisJCQlzeW50aC0+bG9hZF9wYXRjaCA9ICZtYXVpX2xvYWRfcGF0Y2g7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICJNYXVpOiBDYW4ndCBpbnN0YWxsIHBhdGNoIGxvYWRlclxuIik7CisJfQorCXJldHVybiAxOworCitvdXQzOgorCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCBOVUxMKTsKK291dDI6CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlICsgMiwgNik7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9tYXVpKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgaXJxID0gaHdfY29uZmlnLT5pcnE7CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlICsgMiwgNik7CisJdW5sb2FkX21wdTQwMShod19jb25maWcpOworCisJaWYgKGlycSA8IDApCisJCWlycSA9IC1pcnE7CisJaWYgKGlycSA+IDApCisJCWZyZWVfaXJxKGlycSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgZndfbG9hZDsKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8gPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEgPSAtMTsKKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKKworLyoKKyAqCUluc3RhbGwgYSBNYXVpIGNhcmQuIE5lZWRzIG1wdTQwMSBsb2FkZWQgYWxyZWFkeS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21hdWkodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJUdXJ0bGUgYmVhY2ggTWF1aSBhbmQgVHJvcGV6IGRyaXZlciwgQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NlxuIik7CisKKwljZmcuaW9fYmFzZSA9IGlvOworCWNmZy5pcnEgPSBpcnE7CisKKwlpZiAoY2ZnLmlvX2Jhc2UgPT0gLTEgfHwgY2ZnLmlycSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9JTkZPICJtYXVpOiBpcnEgYW5kIGlvIG11c3QgYmUgc2V0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtYXVpX29zID09IE5VTEwpIHsKKwkJZndfbG9hZCA9IDE7CisJCW1hdWlfb3NMZW4gPSBtb2RfZmlybXdhcmVfbG9hZCgiL2V0Yy9zb3VuZC9vc3dmLm1vdCIsIChjaGFyICoqKSAmbWF1aV9vcyk7CisJfQorCWlmIChwcm9iZV9tYXVpKCZjZmcpID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX21hdWkodm9pZCkKK3sKKwlpZiAoZndfbG9hZCAmJiBtYXVpX29zKQorCQl2ZnJlZShtYXVpX29zKTsKKwl1bmxvYWRfbWF1aSgmY2ZnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9tYXVpKTsKK21vZHVsZV9leGl0KGNsZWFudXBfbWF1aSk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9tYXVpKGNoYXIgKnN0cikKK3sKKyAgICAgICAgLyogaW8sIGlycSAqLworCWludCBpbnRzWzNdOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisJaW8gPSBpbnRzWzFdOworCWlycSA9IGludHNbMl07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibWF1aT0iLCBzZXR1cF9tYXVpKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21pZGlfY3RybC5oIGIvc291bmQvb3NzL21pZGlfY3RybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTNlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbWlkaV9jdHJsLmgKQEAgLTAsMCArMSwyMiBAQAorc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RybF9kZWZfdmFsdWVzWzEyOF0gPQoreworCTB4NDAsMHgwMCwweDQwLDB4NDAsICAweDQwLDB4NDAsMHg0MCwweDdmLAkvKiAgIDAgdG8gICA3ICovCisJMHg0MCwweDQwLDB4NDAsMHg3ZiwgIDB4NDAsMHg0MCwweDQwLDB4NDAsCS8qICAgOCB0byAgMTUgKi8KKwkweDQwLDB4NDAsMHg0MCwweDQwLCAgMHg0MCwweDQwLDB4NDAsMHg0MCwJLyogIDE2IHRvICAyMyAqLworCTB4NDAsMHg0MCwweDQwLDB4NDAsICAweDQwLDB4NDAsMHg0MCwweDQwLAkvKiAgMjQgdG8gIDMxICovCisKKwkweDAwLDB4MDAsMHgwMCwweDAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogIDMyIHRvICAzOSAqLworCTB4MDAsMHgwMCwweDAwLDB4MDAsICAweDAwLDB4MDAsMHgwMCwweDAwLAkvKiAgNDAgdG8gIDQ3ICovCisJMHgwMCwweDAwLDB4MDAsMHgwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qICA0OCB0byAgNTUgKi8KKwkweDAwLDB4MDAsMHgwMCwweDAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogIDU2IHRvICA2MyAqLworCQorCTB4MDAsMHgwMCwweDAwLDB4MDAsICAweDAwLDB4MDAsMHgwMCwweDAwLAkvKiAgNjQgdG8gIDcxICovCisJMHgwMCwweDAwLDB4MDAsMHgwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qICA3MiB0byAgNzkgKi8KKwkweDAwLDB4MDAsMHgwMCwweDAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogIDgwIHRvICA4NyAqLworCTB4MDAsMHgwMCwweDAwLDB4MDAsICAweDAwLDB4MDAsMHgwMCwweDAwLAkvKiAgODggdG8gIDk1ICovCisKKwkweDAwLDB4MDAsMHg3ZiwweDdmLCAgMHg3ZiwweDdmLDB4MDAsMHgwMCwJLyogIDk2IHRvIDEwMyAqLworCTB4MDAsMHgwMCwweDAwLDB4MDAsICAweDAwLDB4MDAsMHgwMCwweDAwLAkvKiAxMDQgdG8gMTExICovCisJMHgwMCwweDAwLDB4MDAsMHgwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIDExMiB0byAxMTkgKi8KKwkweDAwLDB4MDAsMHgwMCwweDAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogMTIwIHRvIDEyNyAqLworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9taWRpX3N5bXMuYyBiL3NvdW5kL29zcy9taWRpX3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjE0NmRkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL21pZGlfc3ltcy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBFeHBvcnRlZCBzeW1ib2xzIGZvciBtaWRpIGRyaXZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK2NoYXIgbWlkaV9zeW1zX3N5bWJvbDsKKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2RlZmluZSBfTUlESV9TWU5USF9DXworI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworRVhQT1JUX1NZTUJPTChkb19taWRpX21zZyk7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfb3Blbik7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfY2xvc2UpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX2lvY3RsKTsKK0VYUE9SVF9TWU1CT0wobWlkaV9zeW50aF9raWxsX25vdGUpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX3N0YXJ0X25vdGUpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX3NldF9pbnN0cik7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfcmVzZXQpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX2h3X2NvbnRyb2wpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX2FmdGVydG91Y2gpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX2NvbnRyb2xsZXIpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX3Bhbm5pbmcpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX3NldHVwX3ZvaWNlKTsKK0VYUE9SVF9TWU1CT0wobWlkaV9zeW50aF9zZW5kX3N5c2V4KTsKK0VYUE9SVF9TWU1CT0wobWlkaV9zeW50aF9iZW5kZXIpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX2xvYWRfcGF0Y2gpOworRVhQT1JUX1NZTUJPTChNSURJYnVmX2F2YWlsKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9taWRpX3N5bnRoLmMgYi9zb3VuZC9vc3MvbWlkaV9zeW50aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MmVkYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbWlkaV9zeW50aC5jCkBAIC0wLDAgKzEsNjk3IEBACisvKgorICogc291bmQvbWlkaV9zeW50aC5jCisgKgorICogSGlnaCBsZXZlbCBtaWRpIHNlcXVlbmNlciBtYW5hZ2VyIGZvciBkdW1iIE1JREkgaW50ZXJmYWNlcy4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisvKgorICogVGhvbWFzIFNhaWxlciAgIDogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICogQW5kcmV3IFZlbGlhdGggIDogZml4ZWQgcnVubmluZyBzdGF0dXMgaW4gTUlESSBpbnB1dCBzdGF0ZSBtYWNoaW5lCisgKi8KKyNkZWZpbmUgVVNFX1NFUV9NQUNST1MKKyNkZWZpbmUgVVNFX1NJTVBMRV9NQUNST1MKKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjZGVmaW5lIF9NSURJX1NZTlRIX0NfCisKKyNpbmNsdWRlICJtaWRpX3N5bnRoLmgiCisKK3N0YXRpYyBpbnQgICAgICBtaWRpMnN5bnRoW01BWF9NSURJX0RFVl07CitzdGF0aWMgaW50ICAgICAgc3lzZXhfc3RhdGVbTUFYX01JRElfREVWXSA9Cit7MH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBwcmV2X291dF9zdGF0dXNbTUFYX01JRElfREVWXTsKKworI2RlZmluZSBTVE9SRShjbWQpIFwKK3sgXAorICBpbnQgbGVuOyBcCisgIHVuc2lnbmVkIGNoYXIgb2J1Zls4XTsgXAorICBjbWQ7IFwKKyAgc2VxX2lucHV0X2V2ZW50KG9idWYsIGxlbik7IFwKK30KKworI2RlZmluZSBfc2VxYnVmIG9idWYKKyNkZWZpbmUgX3NlcWJ1ZnB0ciAwCisjZGVmaW5lIF9TRVFfQURWQlVGKHgpIGxlbj14CisKK3ZvaWQKK2RvX21pZGlfbXNnKGludCBzeW50aG5vLCB1bnNpZ25lZCBjaGFyICptc2csIGludCBtbGVuKQoreworCXN3aXRjaCAobXNnWzBdICYgMHhmMCkKKwkgIHsKKwkgIGNhc2UgMHg5MDoKKwkJICBpZiAobXNnWzJdICE9IDApCisJCSAgICB7CisJCQkgICAgU1RPUkUoU0VRX1NUQVJUX05PVEUoc3ludGhubywgbXNnWzBdICYgMHgwZiwgbXNnWzFdLCBtc2dbMl0pKTsKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKwkJICBtc2dbMl0gPSA2NDsKKworCSAgY2FzZSAweDgwOgorCQkgIFNUT1JFKFNFUV9TVE9QX05PVEUoc3ludGhubywgbXNnWzBdICYgMHgwZiwgbXNnWzFdLCBtc2dbMl0pKTsKKwkJICBicmVhazsKKworCSAgY2FzZSAweEEwOgorCQkgIFNUT1JFKFNFUV9LRVlfUFJFU1NVUkUoc3ludGhubywgbXNnWzBdICYgMHgwZiwgbXNnWzFdLCBtc2dbMl0pKTsKKwkJICBicmVhazsKKworCSAgY2FzZSAweEIwOgorCQkgIFNUT1JFKFNFUV9DT05UUk9MKHN5bnRobm8sIG1zZ1swXSAmIDB4MGYsCisJCQkJICAgIG1zZ1sxXSwgbXNnWzJdKSk7CisJCSAgYnJlYWs7CisKKwkgIGNhc2UgMHhDMDoKKwkJICBTVE9SRShTRVFfU0VUX1BBVENIKHN5bnRobm8sIG1zZ1swXSAmIDB4MGYsIG1zZ1sxXSkpOworCQkgIGJyZWFrOworCisJICBjYXNlIDB4RDA6CisJCSAgU1RPUkUoU0VRX0NITl9QUkVTU1VSRShzeW50aG5vLCBtc2dbMF0gJiAweDBmLCBtc2dbMV0pKTsKKwkJICBicmVhazsKKworCSAgY2FzZSAweEUwOgorCQkgIFNUT1JFKFNFUV9CRU5ERVIoc3ludGhubywgbXNnWzBdICYgMHgwZiwKKwkJCSAgICAgIChtc2dbMV0gJiAweDdmKSB8ICgobXNnWzJdICYgMHg3ZikgPDwgNykpKTsKKwkJICBicmVhazsKKworCSAgZGVmYXVsdDoKKwkJICAvKiBwcmludGsoICJNUFU6IFVua25vd24gbWlkaSBjaGFubmVsIG1lc3NhZ2UgJTAyeFxuIiwgIG1zZ1swXSk7ICovCisJCSAgOworCSAgfQorfQorCitzdGF0aWMgdm9pZAorbWlkaV9vdXRjKGludCBtaWRpX2RldiwgaW50IGRhdGEpCit7CisJaW50ICAgICAgICAgICAgIHRpbWVvdXQ7CisKKwlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgMzIwMDsgdGltZW91dCsrKQorCQlpZiAobWlkaV9kZXZzW21pZGlfZGV2XS0+b3V0cHV0YyhtaWRpX2RldiwgKHVuc2lnbmVkIGNoYXIpIChkYXRhICYgMHhmZikpKQorCQkgIHsKKwkJCSAgaWYgKGRhdGEgJiAweDgwKQkvKgorCQkJCQkJICogU3RhdHVzIGJ5dGUKKwkJCQkJCSAqLworCQkJCSAgcHJldl9vdXRfc3RhdHVzW21pZGlfZGV2XSA9CisJCQkJICAgICAgKHVuc2lnbmVkIGNoYXIpIChkYXRhICYgMHhmZik7CS8qCisJCQkJCQkJCQkgKiBTdG9yZSBmb3IgcnVubmluZyBzdGF0dXMKKwkJCQkJCQkJCSAqLworCQkJICByZXR1cm47CS8qCisJCQkJCSAqIE1pc3Npb24gY29tcGxldGUKKwkJCQkJICovCisJCSAgfQorCS8qCisJICogU29ycnkhIE5vIHNwYWNlIG9uIGJ1ZmZlcnMuCisJICovCisJcHJpbnRrKCJNaWRpIHNlbmQgdGltZWQgb3V0XG4iKTsKK30KKworc3RhdGljIGludAorcHJlZml4X2NtZChpbnQgbWlkaV9kZXYsIHVuc2lnbmVkIGNoYXIgc3RhdHVzKQoreworCWlmICgoY2hhciAqKSBtaWRpX2RldnNbbWlkaV9kZXZdLT5wcmVmaXhfY21kID09IE5VTEwpCisJCXJldHVybiAxOworCisJcmV0dXJuIG1pZGlfZGV2c1ttaWRpX2Rldl0tPnByZWZpeF9jbWQobWlkaV9kZXYsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkCittaWRpX3N5bnRoX2lucHV0KGludCBvcmlnX2RldiwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCWludCAgICAgICAgICAgICBkZXY7CisJc3RydWN0IG1pZGlfaW5wdXRfaW5mbyAqaW5jOworCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVuX3RhYltdID0JLyogIyBvZiBkYXRhIGJ5dGVzIGZvbGxvd2luZyBhIHN0YXR1cworCQkJCQkJICovCisJeworCQkyLAkJLyogOHggKi8KKwkJMiwJCS8qIDl4ICovCisJCTIsCQkvKiBBeCAqLworCQkyLAkJLyogQnggKi8KKwkJMSwJCS8qIEN4ICovCisJCTEsCQkvKiBEeCAqLworCQkyLAkJLyogRXggKi8KKwkJMAkJLyogRnggKi8KKwl9OworCisJaWYgKG9yaWdfZGV2IDwgMCB8fCBvcmlnX2RldiA+IG51bV9taWRpcyB8fCBtaWRpX2RldnNbb3JpZ19kZXZdID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChkYXRhID09IDB4ZmUpCS8qIElnbm9yZSBhY3RpdmUgc2Vuc2luZyAqLworCQlyZXR1cm47CisKKwlkZXYgPSBtaWRpMnN5bnRoW29yaWdfZGV2XTsKKwlpbmMgPSAmbWlkaV9kZXZzW29yaWdfZGV2XS0+aW5faW5mbzsKKworCXN3aXRjaCAoaW5jLT5tX3N0YXRlKQorCSAgeworCSAgY2FzZSBNU1RfSU5JVDoKKwkJICBpZiAoZGF0YSAmIDB4ODApCS8qIE1JREkgc3RhdHVzIGJ5dGUgKi8KKwkJICAgIHsKKwkJCSAgICBpZiAoKGRhdGEgJiAweGYwKSA9PSAweGYwKQkvKiBDb21tb24gbWVzc2FnZSAqLworCQkJICAgICAgeworCQkJCSAgICAgIHN3aXRjaCAoZGF0YSkKKwkJCQkJeworCQkJCQljYXNlIDB4ZjA6CS8qIFN5c2V4ICovCisJCQkJCQlpbmMtPm1fc3RhdGUgPSBNU1RfU1lTRVg7CisJCQkJCQlicmVhazsJLyogU3lzZXggKi8KKworCQkJCQljYXNlIDB4ZjE6CS8qIE1UQyBxdWFydGVyIGZyYW1lICovCisJCQkJCWNhc2UgMHhmMzoJLyogU29uZyBzZWxlY3QgKi8KKwkJCQkJCWluYy0+bV9zdGF0ZSA9IE1TVF9EQVRBOworCQkJCQkJaW5jLT5tX3B0ciA9IDE7CisJCQkJCQlpbmMtPm1fbGVmdCA9IDE7CisJCQkJCQlpbmMtPm1fYnVmWzBdID0gZGF0YTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgMHhmMjoJLyogU29uZyBwb3NpdGlvbiBwb2ludGVyICovCisJCQkJCQlpbmMtPm1fc3RhdGUgPSBNU1RfREFUQTsKKwkJCQkJCWluYy0+bV9wdHIgPSAxOworCQkJCQkJaW5jLT5tX2xlZnQgPSAyOworCQkJCQkJaW5jLT5tX2J1ZlswXSA9IGRhdGE7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJaW5jLT5tX2J1ZlswXSA9IGRhdGE7CisJCQkJCQlpbmMtPm1fcHRyID0gMTsKKwkJCQkJCWRvX21pZGlfbXNnKGRldiwgaW5jLT5tX2J1ZiwgaW5jLT5tX3B0cik7CisJCQkJCQlpbmMtPm1fcHRyID0gMDsKKwkJCQkJCWluYy0+bV9sZWZ0ID0gMDsKKwkJCQkJfQorCQkJICAgIH0gZWxzZQorCQkJICAgICAgeworCQkJCSAgICAgIGluYy0+bV9zdGF0ZSA9IE1TVF9EQVRBOworCQkJCSAgICAgIGluYy0+bV9wdHIgPSAxOworCQkJCSAgICAgIGluYy0+bV9sZWZ0ID0gbGVuX3RhYlsoZGF0YSA+PiA0KSAtIDhdOworCQkJCSAgICAgIGluYy0+bV9idWZbMF0gPSBpbmMtPm1fcHJldl9zdGF0dXMgPSBkYXRhOworCQkJICAgICAgfQorCQkgICAgfSBlbHNlIGlmIChpbmMtPm1fcHJldl9zdGF0dXMgJiAweDgwKSB7CisJCQkgICAgLyogRGF0YSBieXRlICh1c2UgcnVubmluZyBzdGF0dXMpICovCisJCQkgICAgaW5jLT5tX3B0ciA9IDI7CisJCQkgICAgaW5jLT5tX2J1ZlsxXSA9IGRhdGE7CisJCQkgICAgaW5jLT5tX2J1ZlswXSA9IGluYy0+bV9wcmV2X3N0YXR1czsKKwkJCSAgICBpbmMtPm1fbGVmdCA9IGxlbl90YWJbKGluYy0+bV9idWZbMF0gPj4gNCkgLSA4XSAtIDE7CisJCQkgICAgaWYgKGluYy0+bV9sZWZ0ID4gMCkKKwkJCQkgICAgaW5jLT5tX3N0YXRlID0gTVNUX0RBVEE7IC8qIE5vdCBkb25lIHlldCAqLworCQkJICAgIGVsc2UgeworCQkJCSAgICBpbmMtPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJCQkgICAgZG9fbWlkaV9tc2coZGV2LCBpbmMtPm1fYnVmLCBpbmMtPm1fcHRyKTsKKwkJCQkgICAgaW5jLT5tX3B0ciA9IDA7CisJCQkgICAgfQorCQkgICAgfQorCQkgIGJyZWFrOwkvKiBNU1RfSU5JVCAqLworCisJICBjYXNlIE1TVF9EQVRBOgorCQkgIGluYy0+bV9idWZbaW5jLT5tX3B0cisrXSA9IGRhdGE7CisJCSAgaWYgKC0taW5jLT5tX2xlZnQgPD0gMCkKKwkJICAgIHsKKwkJCSAgICBpbmMtPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJCSAgICBkb19taWRpX21zZyhkZXYsIGluYy0+bV9idWYsIGluYy0+bV9wdHIpOworCQkJICAgIGluYy0+bV9wdHIgPSAwOworCQkgICAgfQorCQkgIGJyZWFrOwkvKiBNU1RfREFUQSAqLworCisJICBjYXNlIE1TVF9TWVNFWDoKKwkJICBpZiAoZGF0YSA9PSAweGY3KQkvKiBTeXNleCBlbmQgKi8KKwkJICAgIHsKKwkJCSAgICBpbmMtPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJCSAgICBpbmMtPm1fbGVmdCA9IDA7CisJCQkgICAgaW5jLT5tX3B0ciA9IDA7CisJCSAgICB9CisJCSAgYnJlYWs7CS8qIE1TVF9TWVNFWCAqLworCisJICBkZWZhdWx0OgorCQkgIHByaW50aygiTUlESSVkOiBVbmV4cGVjdGVkIHN0YXRlICVkICglMDJ4KVxuIiwgb3JpZ19kZXYsIGluYy0+bV9zdGF0ZSwgKGludCkgZGF0YSk7CisJCSAgaW5jLT5tX3N0YXRlID0gTVNUX0lOSVQ7CisJICB9Cit9CisKK3N0YXRpYyB2b2lkCitsZWF2ZV9zeXNleChpbnQgZGV2KQoreworCWludCAgICAgICAgICAgICBvcmlnX2RldiA9IHN5bnRoX2RldnNbZGV2XS0+bWlkaV9kZXY7CisJaW50ICAgICAgICAgICAgIHRpbWVvdXQgPSAwOworCisJaWYgKCFzeXNleF9zdGF0ZVtkZXZdKQorCQlyZXR1cm47CisKKwlzeXNleF9zdGF0ZVtkZXZdID0gMDsKKworCXdoaWxlICghbWlkaV9kZXZzW29yaWdfZGV2XS0+b3V0cHV0YyhvcmlnX2RldiwgMHhmNykgJiYKKwkgICAgICAgdGltZW91dCA8IDEwMDApCisJCXRpbWVvdXQrKzsKKworCXN5c2V4X3N0YXRlW2Rldl0gPSAwOworfQorCitzdGF0aWMgdm9pZAorbWlkaV9zeW50aF9vdXRwdXQoaW50IGRldikKK3sKKwkvKgorCSAqIEN1cnJlbnRseSBOT1AKKwkgKi8KK30KKworaW50IG1pZGlfc3ludGhfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwkvKgorCSAqIGludCBvcmlnX2RldiA9IHN5bnRoX2RldnNbZGV2XS0+bWlkaV9kZXY7CisJICovCisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBTTkRDVExfU1lOVEhfSU5GTzoKKwkJaWYgKF9fY29weV90b191c2VyKGFyZywgc3ludGhfZGV2c1tkZXZdLT5pbmZvLCBzaXplb2Yoc3RydWN0IHN5bnRoX2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBTTkRDVExfU1lOVEhfTUVNQVZMOgorCQlyZXR1cm4gMHg3ZmZmZmZmZjsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworaW50CittaWRpX3N5bnRoX2tpbGxfbm90ZShpbnQgZGV2LCBpbnQgY2hhbm5lbCwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSkKK3sKKwlpbnQgICAgICAgICAgICAgb3JpZ19kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCWludCAgICAgICAgICAgICBtc2csIGNobjsKKworCWlmIChub3RlIDwgMCB8fCBub3RlID4gMTI3KQorCQlyZXR1cm4gMDsKKwlpZiAoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+IDE1KQorCQlyZXR1cm4gMDsKKwlpZiAodmVsb2NpdHkgPCAwKQorCQl2ZWxvY2l0eSA9IDA7CisJaWYgKHZlbG9jaXR5ID4gMTI3KQorCQl2ZWxvY2l0eSA9IDEyNzsKKworCWxlYXZlX3N5c2V4KGRldik7CisKKwltc2cgPSBwcmV2X291dF9zdGF0dXNbb3JpZ19kZXZdICYgMHhmMDsKKwljaG4gPSBwcmV2X291dF9zdGF0dXNbb3JpZ19kZXZdICYgMHgwZjsKKworCWlmIChjaG4gPT0gY2hhbm5lbCAmJiAoKG1zZyA9PSAweDkwICYmIHZlbG9jaXR5ID09IDY0KSB8fCBtc2cgPT0gMHg4MCkpCisJICB7CQkJLyoKKwkJCQkgKiBVc2UgcnVubmluZyBzdGF0dXMKKwkJCQkgKi8KKwkJICBpZiAoIXByZWZpeF9jbWQob3JpZ19kZXYsIG5vdGUpKQorCQkJICByZXR1cm4gMDsKKworCQkgIG1pZGlfb3V0YyhvcmlnX2Rldiwgbm90ZSk7CisKKwkJICBpZiAobXNnID09IDB4OTApCS8qCisJCQkJCSAqIFJ1bm5pbmcgc3RhdHVzID0gTm90ZSBvbgorCQkJCQkgKi8KKwkJCSAgbWlkaV9vdXRjKG9yaWdfZGV2LCAwKTsJLyoKKwkJCQkJCQkgICAqIE5vdGUgb24gd2l0aCB2ZWxvY2l0eSAwID09IG5vdGUKKwkJCQkJCQkgICAqIG9mZgorCQkJCQkJCSAqLworCQkgIGVsc2UKKwkJCSAgbWlkaV9vdXRjKG9yaWdfZGV2LCB2ZWxvY2l0eSk7CisJfSBlbHNlCisJICB7CisJCSAgaWYgKHZlbG9jaXR5ID09IDY0KQorCQkgICAgeworCQkJICAgIGlmICghcHJlZml4X2NtZChvcmlnX2RldiwgMHg5MCB8IChjaGFubmVsICYgMHgwZikpKQorCQkJCSAgICByZXR1cm4gMDsKKwkJCSAgICBtaWRpX291dGMob3JpZ19kZXYsIDB4OTAgfCAoY2hhbm5lbCAmIDB4MGYpKTsJLyoKKwkJCQkJCQkJCQkgKiBOb3RlIG9uCisJCQkJCQkJCQkJICovCisJCQkgICAgbWlkaV9vdXRjKG9yaWdfZGV2LCBub3RlKTsKKwkJCSAgICBtaWRpX291dGMob3JpZ19kZXYsIDApOwkvKgorCQkJCQkJCSAqIFplcm8gRworCQkJCQkJCSAqLworCQkgIH0gZWxzZQorCQkgICAgeworCQkJICAgIGlmICghcHJlZml4X2NtZChvcmlnX2RldiwgMHg4MCB8IChjaGFubmVsICYgMHgwZikpKQorCQkJCSAgICByZXR1cm4gMDsKKwkJCSAgICBtaWRpX291dGMob3JpZ19kZXYsIDB4ODAgfCAoY2hhbm5lbCAmIDB4MGYpKTsJLyoKKwkJCQkJCQkJCQkgKiBOb3RlIG9mZgorCQkJCQkJCQkJCSAqLworCQkJICAgIG1pZGlfb3V0YyhvcmlnX2Rldiwgbm90ZSk7CisJCQkgICAgbWlkaV9vdXRjKG9yaWdfZGV2LCB2ZWxvY2l0eSk7CisJCSAgICB9CisJICB9CisKKwlyZXR1cm4gMDsKK30KKworaW50CittaWRpX3N5bnRoX3NldF9pbnN0cihpbnQgZGV2LCBpbnQgY2hhbm5lbCwgaW50IGluc3RyX25vKQoreworCWludCAgICAgICAgICAgICBvcmlnX2RldiA9IHN5bnRoX2RldnNbZGV2XS0+bWlkaV9kZXY7CisKKwlpZiAoaW5zdHJfbm8gPCAwIHx8IGluc3RyX25vID4gMTI3KQorCQlpbnN0cl9ubyA9IDA7CisJaWYgKGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPiAxNSkKKwkJcmV0dXJuIDA7CisKKwlsZWF2ZV9zeXNleChkZXYpOworCisJaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCAweGMwIHwgKGNoYW5uZWwgJiAweDBmKSkpCisJCXJldHVybiAwOworCW1pZGlfb3V0YyhvcmlnX2RldiwgMHhjMCB8IChjaGFubmVsICYgMHgwZikpOwkvKgorCQkJCQkJCSAqIFByb2dyYW0gY2hhbmdlCisJCQkJCQkJICovCisJbWlkaV9vdXRjKG9yaWdfZGV2LCBpbnN0cl9ubyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CittaWRpX3N5bnRoX3N0YXJ0X25vdGUoaW50IGRldiwgaW50IGNoYW5uZWwsIGludCBub3RlLCBpbnQgdmVsb2NpdHkpCit7CisJaW50ICAgICAgICAgICAgIG9yaWdfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKwlpbnQgICAgICAgICAgICAgbXNnLCBjaG47CisKKwlpZiAobm90ZSA8IDAgfHwgbm90ZSA+IDEyNykKKwkJcmV0dXJuIDA7CisJaWYgKGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPiAxNSkKKwkJcmV0dXJuIDA7CisJaWYgKHZlbG9jaXR5IDwgMCkKKwkJdmVsb2NpdHkgPSAwOworCWlmICh2ZWxvY2l0eSA+IDEyNykKKwkJdmVsb2NpdHkgPSAxMjc7CisKKwlsZWF2ZV9zeXNleChkZXYpOworCisJbXNnID0gcHJldl9vdXRfc3RhdHVzW29yaWdfZGV2XSAmIDB4ZjA7CisJY2huID0gcHJldl9vdXRfc3RhdHVzW29yaWdfZGV2XSAmIDB4MGY7CisKKwlpZiAoY2huID09IGNoYW5uZWwgJiYgbXNnID09IDB4OTApCisJICB7CQkJLyoKKwkJCQkgKiBVc2UgcnVubmluZyBzdGF0dXMKKwkJCQkgKi8KKwkJICBpZiAoIXByZWZpeF9jbWQob3JpZ19kZXYsIG5vdGUpKQorCQkJICByZXR1cm4gMDsKKwkJICBtaWRpX291dGMob3JpZ19kZXYsIG5vdGUpOworCQkgIG1pZGlfb3V0YyhvcmlnX2RldiwgdmVsb2NpdHkpOworCX0gZWxzZQorCSAgeworCQkgIGlmICghcHJlZml4X2NtZChvcmlnX2RldiwgMHg5MCB8IChjaGFubmVsICYgMHgwZikpKQorCQkJICByZXR1cm4gMDsKKwkJICBtaWRpX291dGMob3JpZ19kZXYsIDB4OTAgfCAoY2hhbm5lbCAmIDB4MGYpKTsJCS8qCisJCQkJCQkJCQkgKiBOb3RlIG9uCisJCQkJCQkJCQkgKi8KKwkJICBtaWRpX291dGMob3JpZ19kZXYsIG5vdGUpOworCQkgIG1pZGlfb3V0YyhvcmlnX2RldiwgdmVsb2NpdHkpOworCSAgfQorCXJldHVybiAwOworfQorCit2b2lkCittaWRpX3N5bnRoX3Jlc2V0KGludCBkZXYpCit7CisKKwlsZWF2ZV9zeXNleChkZXYpOworfQorCitpbnQKK21pZGlfc3ludGhfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlpbnQgICAgICAgICAgICAgb3JpZ19kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCWludCAgICAgICAgICAgICBlcnI7CisJc3RydWN0IG1pZGlfaW5wdXRfaW5mbyAqaW5jOworCisJaWYgKG9yaWdfZGV2IDwgMCB8fCBvcmlnX2RldiA+IG51bV9taWRpcyB8fCBtaWRpX2RldnNbb3JpZ19kZXZdID09IE5VTEwpCisJCXJldHVybiAtRU5YSU87CisKKwltaWRpMnN5bnRoW29yaWdfZGV2XSA9IGRldjsKKwlzeXNleF9zdGF0ZVtkZXZdID0gMDsKKwlwcmV2X291dF9zdGF0dXNbb3JpZ19kZXZdID0gMDsKKworCWlmICgoZXJyID0gbWlkaV9kZXZzW29yaWdfZGV2XS0+b3BlbihvcmlnX2RldiwgbW9kZSwKKwkJCSAgICAgICBtaWRpX3N5bnRoX2lucHV0LCBtaWRpX3N5bnRoX291dHB1dCkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpbmMgPSAmbWlkaV9kZXZzW29yaWdfZGV2XS0+aW5faW5mbzsKKworCS8qIHNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOyAKKwlkb24ndCBrbm93IGFnYWluc3Qgd2hhdCBpcnFoYW5kbGVyIHRvIHByb3RlY3QqLworCWluYy0+bV9idXN5ID0gMDsKKwlpbmMtPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwlpbmMtPm1fcHRyID0gMDsKKwlpbmMtPm1fbGVmdCA9IDA7CisJaW5jLT5tX3ByZXZfc3RhdHVzID0gMHgwMDsKKwkvKiByZXN0b3JlX2ZsYWdzKGZsYWdzKTsgKi8KKworCXJldHVybiAxOworfQorCit2b2lkCittaWRpX3N5bnRoX2Nsb3NlKGludCBkZXYpCit7CisJaW50ICAgICAgICAgICAgIG9yaWdfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKworCWxlYXZlX3N5c2V4KGRldik7CisKKwkvKgorCSAqIFNodXQgdXAgdGhlIHN5bnRocyBieSBzZW5kaW5nIGp1c3Qgc2luZ2xlIGFjdGl2ZSBzZW5zaW5nIG1lc3NhZ2UuCisJICovCisJbWlkaV9kZXZzW29yaWdfZGV2XS0+b3V0cHV0YyhvcmlnX2RldiwgMHhmZSk7CisKKwltaWRpX2RldnNbb3JpZ19kZXZdLT5jbG9zZShvcmlnX2Rldik7Cit9CisKK3ZvaWQKK21pZGlfc3ludGhfaHdfY29udHJvbChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyICpldmVudCkKK3sKK30KKworaW50CittaWRpX3N5bnRoX2xvYWRfcGF0Y2goaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJCSAgICAgIGludCBvZmZzLCBpbnQgY291bnQsIGludCBwbWdyX2ZsYWcpCit7CisJaW50ICAgICAgICAgICAgIG9yaWdfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKworCXN0cnVjdCBzeXNleF9pbmZvIHN5c2V4OworCWludCAgICAgICAgICAgICBpOworCXVuc2lnbmVkIGxvbmcgICBsZWZ0LCBzcmNfb2ZmcywgZW94X3NlZW4gPSAwOworCWludCAgICAgICAgICAgICBmaXJzdF9ieXRlID0gMTsKKwlpbnQgICAgICAgICAgICAgaGRyX3NpemUgPSAodW5zaWduZWQgbG9uZykgJnN5c2V4LmRhdGFbMF0gLSAodW5zaWduZWQgbG9uZykgJnN5c2V4OworCisJbGVhdmVfc3lzZXgoZGV2KTsKKworCWlmICghcHJlZml4X2NtZChvcmlnX2RldiwgMHhmMCkpCisJCXJldHVybiAwOworCisJaWYgKGZvcm1hdCAhPSBTWVNFWF9QQVRDSCkKKwl7CisvKgkJICBwcmludGsoIk1JREkgRXJyb3I6IEludmFsaWQgcGF0Y2ggZm9ybWF0IChrZXkpIDB4JXhcbiIsIGZvcm1hdCk7Ki8KKwkJICByZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvdW50IDwgaGRyX3NpemUpCisJeworLyoJCXByaW50aygiTUlESSBFcnJvcjogUGF0Y2ggaGVhZGVyIHRvbyBzaG9ydFxuIik7Ki8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNvdW50IC09IGhkcl9zaXplOworCisJLyoKKwkgKiBDb3B5IHRoZSBoZWFkZXIgZnJvbSB1c2VyIHNwYWNlIGJ1dCBpZ25vcmUgdGhlIGZpcnN0IGJ5dGVzIHdoaWNoIGhhdmUKKwkgKiBiZWVuIHRyYW5zZmVycmVkIGFscmVhZHkuCisJICovCisKKwlpZihjb3B5X2Zyb21fdXNlcigmKChjaGFyICopICZzeXNleClbb2Zmc10sICYoYWRkcilbb2Zmc10sIGhkcl9zaXplIC0gb2ZmcykpCisJCXJldHVybiAtRUZBVUxUOworIAorIAlpZiAoY291bnQgPCBzeXNleC5sZW4pCisJeworLyoJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1JREkgV2FybmluZzogU3lzZXggcmVjb3JkIHRvbyBzaG9ydCAoJWQ8JWQpXG4iLCBjb3VudCwgKGludCkgc3lzZXgubGVuKTsqLworCQlzeXNleC5sZW4gPSBjb3VudDsKKwl9CisgIAlsZWZ0ID0gc3lzZXgubGVuOworICAJc3JjX29mZnMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGxlZnQgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpOyBpKyspCisJeworCQl1bnNpZ25lZCBjaGFyICAgZGF0YTsKKworCQlnZXRfdXNlcigqKHVuc2lnbmVkIGNoYXIgKikgJmRhdGEsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKSAmKChhZGRyKVtoZHJfc2l6ZSArIGldKSk7CisKKwkJZW94X3NlZW4gPSAoaSA+IDAgJiYgZGF0YSAmIDB4ODApOwkvKiBFbmQgb2Ygc3lzZXggKi8KKworCQlpZiAoZW94X3NlZW4gJiYgZGF0YSAhPSAweGY3KQorCQkJZGF0YSA9IDB4Zjc7CisKKwkJaWYgKGkgPT0gMCkKKwkJeworCQkJaWYgKGRhdGEgIT0gMHhmMCkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWRpX3N5bnRoOiBTeXNleCBzdGFydCBtaXNzaW5nXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCQl3aGlsZSAoIW1pZGlfZGV2c1tvcmlnX2Rldl0tPm91dHB1dGMob3JpZ19kZXYsICh1bnNpZ25lZCBjaGFyKSAoZGF0YSAmIDB4ZmYpKSAmJgorCQkJIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJc2NoZWR1bGUoKTsKKworCQlpZiAoIWZpcnN0X2J5dGUgJiYgZGF0YSAmIDB4ODApCisJCQlyZXR1cm4gMDsKKwkJZmlyc3RfYnl0ZSA9IDA7CisJfQorCisJaWYgKCFlb3hfc2VlbikKKwkJbWlkaV9vdXRjKG9yaWdfZGV2LCAweGY3KTsKKwlyZXR1cm4gMDsKK30KKyAgCit2b2lkIG1pZGlfc3ludGhfcGFubmluZyhpbnQgZGV2LCBpbnQgY2hhbm5lbCwgaW50IHByZXNzdXJlKQoreworfQorICAKK3ZvaWQgbWlkaV9zeW50aF9hZnRlcnRvdWNoKGludCBkZXYsIGludCBjaGFubmVsLCBpbnQgcHJlc3N1cmUpCit7CisJaW50ICAgICAgICAgICAgIG9yaWdfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKwlpbnQgICAgICAgICAgICAgbXNnLCBjaG47CisKKwlpZiAocHJlc3N1cmUgPCAwIHx8IHByZXNzdXJlID4gMTI3KQorCQlyZXR1cm47CisJaWYgKGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPiAxNSkKKwkJcmV0dXJuOworCisJbGVhdmVfc3lzZXgoZGV2KTsKKworCW1zZyA9IHByZXZfb3V0X3N0YXR1c1tvcmlnX2Rldl0gJiAweGYwOworCWNobiA9IHByZXZfb3V0X3N0YXR1c1tvcmlnX2Rldl0gJiAweDBmOworCisJaWYgKG1zZyAhPSAweGQwIHx8IGNobiAhPSBjaGFubmVsKQkvKgorCQkJCQkJICogVGVzdCBmb3IgcnVubmluZyBzdGF0dXMKKwkJCQkJCSAqLworCSAgeworCQkgIGlmICghcHJlZml4X2NtZChvcmlnX2RldiwgMHhkMCB8IChjaGFubmVsICYgMHgwZikpKQorCQkJICByZXR1cm47CisJCSAgbWlkaV9vdXRjKG9yaWdfZGV2LCAweGQwIHwgKGNoYW5uZWwgJiAweDBmKSk7CQkvKgorCQkJCQkJCQkJICogQ2hhbm5lbCBwcmVzc3VyZQorCQkJCQkJCQkJICovCisJfSBlbHNlIGlmICghcHJlZml4X2NtZChvcmlnX2RldiwgcHJlc3N1cmUpKQorCQlyZXR1cm47CisKKwltaWRpX291dGMob3JpZ19kZXYsIHByZXNzdXJlKTsKK30KKwordm9pZAorbWlkaV9zeW50aF9jb250cm9sbGVyKGludCBkZXYsIGludCBjaGFubmVsLCBpbnQgY3RybF9udW0sIGludCB2YWx1ZSkKK3sKKwlpbnQgICAgICAgICAgICAgb3JpZ19kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCWludCAgICAgICAgICAgICBjaG4sIG1zZzsKKworCWlmIChjdHJsX251bSA8IDAgfHwgY3RybF9udW0gPiAxMjcpCisJCXJldHVybjsKKwlpZiAoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+IDE1KQorCQlyZXR1cm47CisKKwlsZWF2ZV9zeXNleChkZXYpOworCisJbXNnID0gcHJldl9vdXRfc3RhdHVzW29yaWdfZGV2XSAmIDB4ZjA7CisJY2huID0gcHJldl9vdXRfc3RhdHVzW29yaWdfZGV2XSAmIDB4MGY7CisKKwlpZiAobXNnICE9IDB4YjAgfHwgY2huICE9IGNoYW5uZWwpCisJICB7CisJCSAgaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCAweGIwIHwgKGNoYW5uZWwgJiAweDBmKSkpCisJCQkgIHJldHVybjsKKwkJICBtaWRpX291dGMob3JpZ19kZXYsIDB4YjAgfCAoY2hhbm5lbCAmIDB4MGYpKTsKKwl9IGVsc2UgaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCBjdHJsX251bSkpCisJCXJldHVybjsKKworCW1pZGlfb3V0YyhvcmlnX2RldiwgY3RybF9udW0pOworCW1pZGlfb3V0YyhvcmlnX2RldiwgdmFsdWUgJiAweDdmKTsKK30KKwordm9pZAorbWlkaV9zeW50aF9iZW5kZXIoaW50IGRldiwgaW50IGNoYW5uZWwsIGludCB2YWx1ZSkKK3sKKwlpbnQgICAgICAgICAgICAgb3JpZ19kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCWludCAgICAgICAgICAgICBtc2csIHByZXZfY2huOworCisJaWYgKGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPiAxNSkKKwkJcmV0dXJuOworCisJaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDE2MzgzKQorCQlyZXR1cm47CisKKwlsZWF2ZV9zeXNleChkZXYpOworCisJbXNnID0gcHJldl9vdXRfc3RhdHVzW29yaWdfZGV2XSAmIDB4ZjA7CisJcHJldl9jaG4gPSBwcmV2X291dF9zdGF0dXNbb3JpZ19kZXZdICYgMHgwZjsKKworCWlmIChtc2cgIT0gMHhkMCB8fCBwcmV2X2NobiAhPSBjaGFubmVsKQkJLyoKKwkJCQkJCQkgKiBUZXN0IGZvciBydW5uaW5nIHN0YXR1cworCQkJCQkJCSAqLworCSAgeworCQkgIGlmICghcHJlZml4X2NtZChvcmlnX2RldiwgMHhlMCB8IChjaGFubmVsICYgMHgwZikpKQorCQkJICByZXR1cm47CisJCSAgbWlkaV9vdXRjKG9yaWdfZGV2LCAweGUwIHwgKGNoYW5uZWwgJiAweDBmKSk7CisJfSBlbHNlIGlmICghcHJlZml4X2NtZChvcmlnX2RldiwgdmFsdWUgJiAweDdmKSkKKwkJcmV0dXJuOworCisJbWlkaV9vdXRjKG9yaWdfZGV2LCB2YWx1ZSAmIDB4N2YpOworCW1pZGlfb3V0YyhvcmlnX2RldiwgKHZhbHVlID4+IDcpICYgMHg3Zik7Cit9CisKK3ZvaWQKK21pZGlfc3ludGhfc2V0dXBfdm9pY2UoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgY2hhbm5lbCkKK3sKK30KKworaW50CittaWRpX3N5bnRoX3NlbmRfc3lzZXgoaW50IGRldiwgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pCit7CisJaW50ICAgICAgICAgICAgIG9yaWdfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKwlpbnQgICAgICAgICAgICAgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkgIHsKKwkJICBzd2l0Y2ggKGJ5dGVzW2ldKQorCQkgICAgeworCQkgICAgY2FzZSAweGYwOgkvKiBTdGFydCBzeXNleCAqLworCQkJICAgIGlmICghcHJlZml4X2NtZChvcmlnX2RldiwgMHhmMCkpCisJCQkJICAgIHJldHVybiAwOworCQkJICAgIHN5c2V4X3N0YXRlW2Rldl0gPSAxOworCQkJICAgIGJyZWFrOworCisJCSAgICBjYXNlIDB4Zjc6CS8qIEVuZCBzeXNleCAqLworCQkJICAgIGlmICghc3lzZXhfc3RhdGVbZGV2XSkJLyogT3JwaGFuIHN5c2V4IGVuZCAqLworCQkJCSAgICByZXR1cm4gMDsKKwkJCSAgICBzeXNleF9zdGF0ZVtkZXZdID0gMDsKKwkJCSAgICBicmVhazsKKworCQkgICAgZGVmYXVsdDoKKwkJCSAgICBpZiAoIXN5c2V4X3N0YXRlW2Rldl0pCisJCQkJICAgIHJldHVybiAwOworCisJCQkgICAgaWYgKGJ5dGVzW2ldICYgMHg4MCkJLyogRXJyb3IuIEFub3RoZXIgbWVzc2FnZSBiZWZvcmUgc3lzZXggZW5kICovCisJCQkgICAgICB7CisJCQkJICAgICAgYnl0ZXNbaV0gPSAweGY3OwkvKiBTeXNleCBlbmQgKi8KKwkJCQkgICAgICBzeXNleF9zdGF0ZVtkZXZdID0gMDsKKwkJCSAgICAgIH0KKwkJICAgIH0KKworCQkgIGlmICghbWlkaV9kZXZzW29yaWdfZGV2XS0+b3V0cHV0YyhvcmlnX2RldiwgYnl0ZXNbaV0pKQorCQkgICAgeworLyoKKyAqIEhhcmR3YXJlIGxldmVsIGJ1ZmZlciBpcyBmdWxsLiBBYm9ydCB0aGUgc3lzZXggbWVzc2FnZS4KKyAqLworCisJCQkgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXQgPSAwOworCisJCQkgICAgYnl0ZXNbaV0gPSAweGY3OworCQkJICAgIHN5c2V4X3N0YXRlW2Rldl0gPSAwOworCisJCQkgICAgd2hpbGUgKCFtaWRpX2RldnNbb3JpZ19kZXZdLT5vdXRwdXRjKG9yaWdfZGV2LCBieXRlc1tpXSkgJiYKKwkJCQkgICB0aW1lb3V0IDwgMTAwMCkKKwkJCQkgICAgdGltZW91dCsrOworCQkgICAgfQorCQkgIGlmICghc3lzZXhfc3RhdGVbZGV2XSkKKwkJCSAgcmV0dXJuIDA7CisJICB9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9taWRpX3N5bnRoLmggYi9zb3VuZC9vc3MvbWlkaV9zeW50aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzlkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbWlkaV9zeW50aC5oCkBAIC0wLDAgKzEsNDcgQEAKK2ludCBtaWRpX3N5bnRoX2lvY3RsIChpbnQgZGV2LAorCSAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZyk7CitpbnQgbWlkaV9zeW50aF9raWxsX25vdGUgKGludCBkZXYsIGludCBjaGFubmVsLCBpbnQgbm90ZSwgaW50IHZlbG9jaXR5KTsKK2ludCBtaWRpX3N5bnRoX3NldF9pbnN0ciAoaW50IGRldiwgaW50IGNoYW5uZWwsIGludCBpbnN0cl9ubyk7CitpbnQgbWlkaV9zeW50aF9zdGFydF9ub3RlIChpbnQgZGV2LCBpbnQgY2hhbm5lbCwgaW50IG5vdGUsIGludCB2b2x1bWUpOwordm9pZCBtaWRpX3N5bnRoX3Jlc2V0IChpbnQgZGV2KTsKK2ludCBtaWRpX3N5bnRoX29wZW4gKGludCBkZXYsIGludCBtb2RlKTsKK3ZvaWQgbWlkaV9zeW50aF9jbG9zZSAoaW50IGRldik7Cit2b2lkIG1pZGlfc3ludGhfaHdfY29udHJvbCAoaW50IGRldiwgdW5zaWduZWQgY2hhciAqZXZlbnQpOworaW50IG1pZGlfc3ludGhfbG9hZF9wYXRjaCAoaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKiBhZGRyLAorCQkgaW50IG9mZnMsIGludCBjb3VudCwgaW50IHBtZ3JfZmxhZyk7Cit2b2lkIG1pZGlfc3ludGhfcGFubmluZyAoaW50IGRldiwgaW50IGNoYW5uZWwsIGludCBwcmVzc3VyZSk7Cit2b2lkIG1pZGlfc3ludGhfYWZ0ZXJ0b3VjaCAoaW50IGRldiwgaW50IGNoYW5uZWwsIGludCBwcmVzc3VyZSk7Cit2b2lkIG1pZGlfc3ludGhfY29udHJvbGxlciAoaW50IGRldiwgaW50IGNoYW5uZWwsIGludCBjdHJsX251bSwgaW50IHZhbHVlKTsKK3ZvaWQgbWlkaV9zeW50aF9iZW5kZXIgKGludCBkZXYsIGludCBjaG4sIGludCB2YWx1ZSk7Cit2b2lkIG1pZGlfc3ludGhfc2V0dXBfdm9pY2UgKGludCBkZXYsIGludCB2b2ljZSwgaW50IGNobik7CitpbnQgbWlkaV9zeW50aF9zZW5kX3N5c2V4KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmJ5dGVzLGludCBsZW4pOworCisjaWZuZGVmIF9NSURJX1NZTlRIX0NfCitzdGF0aWMgc3RydWN0IHN5bnRoX2luZm8gc3RkX3N5bnRoX2luZm8gPQore01JRElfU1lOVEhfTkFNRSwgMCwgU1lOVEhfVFlQRV9NSURJLCAwLCAwLCAxMjgsIDAsIDEyOCwgTUlESV9TWU5USF9DQVBTfTsKKworc3RhdGljIHN0cnVjdCBzeW50aF9vcGVyYXRpb25zIHN0ZF9taWRpX3N5bnRoID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlkCQk9ICJNSURJIiwKKwkuaW5mbwkJPSAmc3RkX3N5bnRoX2luZm8sCisJLm1pZGlfZGV2CT0gMCwKKwkuc3ludGhfdHlwZQk9IFNZTlRIX1RZUEVfTUlESSwKKwkuc3ludGhfc3VidHlwZQk9IDAsCisJLm9wZW4JCT0gbWlkaV9zeW50aF9vcGVuLAorCS5jbG9zZQkJPSBtaWRpX3N5bnRoX2Nsb3NlLAorCS5pb2N0bAkJPSBtaWRpX3N5bnRoX2lvY3RsLAorCS5raWxsX25vdGUJPSBtaWRpX3N5bnRoX2tpbGxfbm90ZSwKKwkuc3RhcnRfbm90ZQk9IG1pZGlfc3ludGhfc3RhcnRfbm90ZSwKKwkuc2V0X2luc3RyCT0gbWlkaV9zeW50aF9zZXRfaW5zdHIsCisJLnJlc2V0CQk9IG1pZGlfc3ludGhfcmVzZXQsCisJLmh3X2NvbnRyb2wJPSBtaWRpX3N5bnRoX2h3X2NvbnRyb2wsCisJLmxvYWRfcGF0Y2gJPSBtaWRpX3N5bnRoX2xvYWRfcGF0Y2gsCisJLmFmdGVydG91Y2gJPSBtaWRpX3N5bnRoX2FmdGVydG91Y2gsCisJLmNvbnRyb2xsZXIJPSBtaWRpX3N5bnRoX2NvbnRyb2xsZXIsCisJLnBhbm5pbmcJCT0gbWlkaV9zeW50aF9wYW5uaW5nLAorCS5iZW5kZXIJCT0gbWlkaV9zeW50aF9iZW5kZXIsCisJLnNldHVwX3ZvaWNlCT0gbWlkaV9zeW50aF9zZXR1cF92b2ljZSwKKwkuc2VuZF9zeXNleAk9IG1pZGlfc3ludGhfc2VuZF9zeXNleAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21pZGlidWYuYyBiL3NvdW5kL29zcy9taWRpYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2NzZmYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9taWRpYnVmLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBzb3VuZC9taWRpYnVmLmMKKyAqCisgKiBEZXZpY2UgZmlsZSBtYW5hZ2VyIGZvciAvZGV2L21pZGkjCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqLworLyoKKyAqIFRob21hcyBTYWlsZXIgICA6IGlvY3RsIGNvZGUgcmV3b3JrZWQgKHZtYWxsb2MvdmZyZWUgcmVtb3ZlZCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2RlZmluZSBNSURJQlVGX0MKKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisKKy8qCisgKiBEb24ndCBtYWtlIE1BWF9RVUVVRV9TSVpFIGxhcmdlciB0aGFuIDQwMDAKKyAqLworCisjZGVmaW5lIE1BWF9RVUVVRV9TSVpFCTQwMDAKKworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IG1pZGlfc2xlZXBlcltNQVhfTUlESV9ERVZdOworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGlucHV0X3NsZWVwZXJbTUFYX01JRElfREVWXTsKKworc3RydWN0IG1pZGlfYnVmCit7CisJaW50IGxlbiwgaGVhZCwgdGFpbDsKKwl1bnNpZ25lZCBjaGFyIHF1ZXVlW01BWF9RVUVVRV9TSVpFXTsKK307CisKK3N0cnVjdCBtaWRpX3Bhcm1zCit7CisJbG9uZyBwcmVjaF90aW1lb3V0OwkvKgorCQkJCSAqIFRpbWVvdXQgYmVmb3JlIHRoZSBmaXJzdCBjaAorCQkJCSAqLworfTsKKworc3RhdGljIHN0cnVjdCBtaWRpX2J1ZiAqbWlkaV9vdXRfYnVmW01BWF9NSURJX0RFVl0gPSB7TlVMTH07CitzdGF0aWMgc3RydWN0IG1pZGlfYnVmICptaWRpX2luX2J1ZltNQVhfTUlESV9ERVZdID0ge05VTEx9Oworc3RhdGljIHN0cnVjdCBtaWRpX3Bhcm1zIHBhcm1zW01BWF9NSURJX0RFVl07CisKK3N0YXRpYyB2b2lkIG1pZGlfcG9sbCh1bnNpZ25lZCBsb25nIGR1bW15KTsKKworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcG9sbF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKG1pZGlfcG9sbCwgMCwgMCk7CisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgb3Blbl9kZXZzOworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworI2RlZmluZSBEQVRBX0FWQUlMKHEpIChxLT5sZW4pCisjZGVmaW5lIFNQQUNFX0FWQUlMKHEpIChNQVhfUVVFVUVfU0laRSAtIHEtPmxlbikKKworI2RlZmluZSBRVUVVRV9CWVRFKHEsIGRhdGEpIFwKKwlpZiAoU1BBQ0VfQVZBSUwocSkpIFwKKwl7IFwKKwkgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKKwkgIHNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7IFwKKwkgIHEtPnF1ZXVlW3EtPnRhaWxdID0gKGRhdGEpOyBcCisJICBxLT5sZW4rKzsgcS0+dGFpbCA9IChxLT50YWlsKzEpICUgTUFYX1FVRVVFX1NJWkU7IFwKKwkgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsgXAorCX0KKworI2RlZmluZSBSRU1PVkVfQllURShxLCBkYXRhKSBcCisJaWYgKERBVEFfQVZBSUwocSkpIFwKKwl7IFwKKwkgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKKwkgIHNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7IFwKKwkgIGRhdGEgPSBxLT5xdWV1ZVtxLT5oZWFkXTsgXAorCSAgcS0+bGVuLS07IHEtPmhlYWQgPSAocS0+aGVhZCsxKSAlIE1BWF9RVUVVRV9TSVpFOyBcCisJICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7IFwKKwl9CisKK3N0YXRpYyB2b2lkIGRyYWluX21pZGlfcXVldWUoaW50IGRldikKK3sKKworCS8qCisJICogR2l2ZSB0aGUgTWlkaSBkcml2ZXIgdGltZSB0byBkcmFpbiBpdHMgb3V0cHV0IHF1ZXVlcworCSAqLworCisJaWYgKG1pZGlfZGV2c1tkZXZdLT5idWZmZXJfc3RhdHVzICE9IE5VTEwpCisJCXdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgbWlkaV9kZXZzW2Rldl0tPmJ1ZmZlcl9zdGF0dXMoZGV2KSkgCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJm1pZGlfc2xlZXBlcltkZXZdLAorCQkJCQkJICAgICAgIEhaLzEwKTsKK30KKworc3RhdGljIHZvaWQgbWlkaV9pbnB1dF9pbnRyKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlpZiAobWlkaV9pbl9idWZbZGV2XSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoZGF0YSA9PSAweGZlKQkvKgorCQkJCSAqIEFjdGl2ZSBzZW5zaW5nCisJCQkJICovCisJCXJldHVybjsJCS8qCisJCQkJICogSWdub3JlCisJCQkJICovCisKKwlpZiAoU1BBQ0VfQVZBSUwobWlkaV9pbl9idWZbZGV2XSkpIHsKKwkJUVVFVUVfQllURShtaWRpX2luX2J1ZltkZXZdLCBkYXRhKTsKKwkJd2FrZV91cCgmaW5wdXRfc2xlZXBlcltkZXZdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1pZGlfb3V0cHV0X2ludHIoaW50IGRldikKK3sKKwkvKgorCSAqIEN1cnJlbnRseSBOT1AKKwkgKi8KK30KKworc3RhdGljIHZvaWQgbWlkaV9wb2xsKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCWludCAgICAgICAgICAgICBkZXY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCWlmIChvcGVuX2RldnMpCisJeworCQlmb3IgKGRldiA9IDA7IGRldiA8IG51bV9taWRpczsgZGV2KyspCisJCQlpZiAobWlkaV9kZXZzW2Rldl0gIT0gTlVMTCAmJiBtaWRpX291dF9idWZbZGV2XSAhPSBOVUxMKQorCQkJeworCQkJCWludCBvayA9IDE7CisKKwkJCQl3aGlsZSAoREFUQV9BVkFJTChtaWRpX291dF9idWZbZGV2XSkgJiYgb2spCisJCQkJeworCQkJCQlpbnQgYyA9IG1pZGlfb3V0X2J1ZltkZXZdLT5xdWV1ZVttaWRpX291dF9idWZbZGV2XS0+aGVhZF07CisKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7LyogR2l2ZSBzb21lIHRpbWUgdG8gb3RoZXJzICovCisJCQkJCW9rID0gbWlkaV9kZXZzW2Rldl0tPm91dHB1dGMoZGV2LCBjKTsKKwkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJCQkJbWlkaV9vdXRfYnVmW2Rldl0tPmhlYWQgPSAobWlkaV9vdXRfYnVmW2Rldl0tPmhlYWQgKyAxKSAlIE1BWF9RVUVVRV9TSVpFOworCQkJCQltaWRpX291dF9idWZbZGV2XS0+bGVuLS07CisJCQkJfQorCisJCQkJaWYgKERBVEFfQVZBSUwobWlkaV9vdXRfYnVmW2Rldl0pIDwgMTAwKQorCQkJCQl3YWtlX3VwKCZtaWRpX3NsZWVwZXJbZGV2XSk7CisJCQl9CisJCXBvbGxfdGltZXIuZXhwaXJlcyA9ICgxKSArIGppZmZpZXM7CisJCWFkZF90aW1lcigmcG9sbF90aW1lcik7CisJCS8qCisJCSAqIENvbWUgYmFjayBsYXRlcgorCQkgKi8KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworfQorCitpbnQgTUlESWJ1Zl9vcGVuKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtb2RlLCBlcnI7CisKKwlkZXYgPSBkZXYgPj4gNDsKKwltb2RlID0gdHJhbnNsYXRlX21vZGUoZmlsZSk7CisKKwlpZiAobnVtX21pZGlzID4gTUFYX01JRElfREVWKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWRpOiBUb28gbWFueSBtaWRpIGludGVyZmFjZXNcbiIpOworCQludW1fbWlkaXMgPSBNQVhfTUlESV9ERVY7CisJfQorCWlmIChkZXYgPCAwIHx8IGRldiA+PSBudW1fbWlkaXMgfHwgbWlkaV9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJICByZXR1cm4gLUVOWElPOworCS8qCisJICogICAgSW50ZXJydXB0cyBkaXNhYmxlZC4gQmUgY2FyZWZ1bAorCSAqLworCisJbW9kdWxlX3B1dChtaWRpX2RldnNbZGV2XS0+b3duZXIpOworCisJaWYgKChlcnIgPSBtaWRpX2RldnNbZGV2XS0+b3BlbihkZXYsIG1vZGUsCisJCQkJIG1pZGlfaW5wdXRfaW50ciwgbWlkaV9vdXRwdXRfaW50cikpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXBhcm1zW2Rldl0ucHJlY2hfdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCW1pZGlfaW5fYnVmW2Rldl0gPSAoc3RydWN0IG1pZGlfYnVmICopIHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2J1ZikpOworCisJaWYgKG1pZGlfaW5fYnVmW2Rldl0gPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pZGk6IENhbid0IGFsbG9jYXRlIGJ1ZmZlclxuIik7CisJCW1pZGlfZGV2c1tkZXZdLT5jbG9zZShkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbWlkaV9pbl9idWZbZGV2XS0+bGVuID0gbWlkaV9pbl9idWZbZGV2XS0+aGVhZCA9IG1pZGlfaW5fYnVmW2Rldl0tPnRhaWwgPSAwOworCisJbWlkaV9vdXRfYnVmW2Rldl0gPSAoc3RydWN0IG1pZGlfYnVmICopIHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2J1ZikpOworCisJaWYgKG1pZGlfb3V0X2J1ZltkZXZdID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWRpOiBDYW4ndCBhbGxvY2F0ZSBidWZmZXJcbiIpOworCQltaWRpX2RldnNbZGV2XS0+Y2xvc2UoZGV2KTsKKwkJdmZyZWUobWlkaV9pbl9idWZbZGV2XSk7CisJCW1pZGlfaW5fYnVmW2Rldl0gPSBOVUxMOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbWlkaV9vdXRfYnVmW2Rldl0tPmxlbiA9IG1pZGlfb3V0X2J1ZltkZXZdLT5oZWFkID0gbWlkaV9vdXRfYnVmW2Rldl0tPnRhaWwgPSAwOworCW9wZW5fZGV2cysrOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWlkaV9zbGVlcGVyW2Rldl0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlucHV0X3NsZWVwZXJbZGV2XSk7CisKKwlpZiAob3Blbl9kZXZzIDwgMikJLyogVGhpcyB3YXMgZmlyc3Qgb3BlbiAqLworCXsKKwkJcG9sbF90aW1lci5leHBpcmVzID0gMSArIGppZmZpZXM7CisJCWFkZF90aW1lcigmcG9sbF90aW1lcik7CS8qIFN0YXJ0IHBvbGxpbmcgKi8KKwl9CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBNSURJYnVmX3JlbGVhc2UoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1vZGU7CisKKwlkZXYgPSBkZXYgPj4gNDsKKwltb2RlID0gdHJhbnNsYXRlX21vZGUoZmlsZSk7CisKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX21pZGlzIHx8IG1pZGlfZGV2c1tkZXZdID09IE5VTEwpCisJCXJldHVybjsKKworCS8qCisJICogV2FpdCB1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHkKKwkgKi8KKworCWlmIChtb2RlICE9IE9QRU5fUkVBRCkKKwl7CisJCW1pZGlfZGV2c1tkZXZdLT5vdXRwdXRjKGRldiwgMHhmZSk7CS8qCisJCQkJCQkJICAgKiBBY3RpdmUgc2Vuc2luZyB0byBzaHV0IHRoZQorCQkJCQkJCSAgICogZGV2aWNlcworCQkJCQkJCSAqLworCisJCXdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgREFUQV9BVkFJTChtaWRpX291dF9idWZbZGV2XSkpCisJCQkgIGludGVycnVwdGlibGVfc2xlZXBfb24oJm1pZGlfc2xlZXBlcltkZXZdKTsKKwkJLyoKKwkJICoJU3luYworCQkgKi8KKworCQlkcmFpbl9taWRpX3F1ZXVlKGRldik7CS8qCisJCQkJCSAqIEVuc3VyZSB0aGUgb3V0cHV0IHF1ZXVlcyBhcmUgZW1wdHkKKwkJCQkJICovCisJfQorCisJbWlkaV9kZXZzW2Rldl0tPmNsb3NlKGRldik7CisKKwlvcGVuX2RldnMtLTsKKwlpZiAob3Blbl9kZXZzID09IDApCisJCWRlbF90aW1lcl9zeW5jKCZwb2xsX3RpbWVyKTsKKwl2ZnJlZShtaWRpX2luX2J1ZltkZXZdKTsKKwl2ZnJlZShtaWRpX291dF9idWZbZGV2XSk7CisJbWlkaV9pbl9idWZbZGV2XSA9IE5VTEw7CisJbWlkaV9vdXRfYnVmW2Rldl0gPSBOVUxMOworCisJbW9kdWxlX3B1dChtaWRpX2RldnNbZGV2XS0+b3duZXIpOworfQorCitpbnQgTUlESWJ1Zl93cml0ZShpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBjLCBuLCBpOworCXVuc2lnbmVkIGNoYXIgdG1wX2RhdGE7CisKKwlkZXYgPSBkZXYgPj4gNDsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJYyA9IDA7CisKKwl3aGlsZSAoYyA8IGNvdW50KQorCXsKKwkJbiA9IFNQQUNFX0FWQUlMKG1pZGlfb3V0X2J1ZltkZXZdKTsKKworCQlpZiAobiA9PSAwKSB7CS8qCisJCQkJICogTm8gc3BhY2UganVzdCBub3cuCisJCQkJICovCisKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWMgPSAtRUFHQUlOOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZtaWRpX3NsZWVwZXJbZGV2XSk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIAorCQkJeworCQkJCWMgPSAtRUlOVFI7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQluID0gU1BBQ0VfQVZBSUwobWlkaV9vdXRfYnVmW2Rldl0pOworCQl9CisJCWlmIChuID4gKGNvdW50IC0gYykpCisJCQluID0gY291bnQgLSBjOworCisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCXsKKwkJCS8qIEJST0tFIEJST0tFIEJST0tFIC0gQ0FOVCBETyBUSElTIFdJVEggQ0xJICEhICovCisJCQkvKiB5ZXMsIHRoaW5rIHRoZSBzYW1lLCBzbyBJIHJlbW92ZWQgdGhlIGNsaSgpIGJyYWNrZXRzIAorCQkJCVFVRVVFX0JZVEUgaXMgcHJvdGVjdGVkIGFnYWluc3QgaW50ZXJydXB0cyAqLworCQkJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopICZ0bXBfZGF0YSwgJihidWYpW2NdLCAxKSkgeworCQkJCWMgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJUVVFVUVfQllURShtaWRpX291dF9idWZbZGV2XSwgdG1wX2RhdGEpOworCQkJYysrOworCQl9CisJfQorb3V0OgorCXJldHVybiBjOworfQorCisKK2ludCBNSURJYnVmX3JlYWQoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQgbiwgYyA9IDA7CisJdW5zaWduZWQgY2hhciB0bXBfZGF0YTsKKworCWRldiA9IGRldiA+PiA0OworCisJaWYgKCFEQVRBX0FWQUlMKG1pZGlfaW5fYnVmW2Rldl0pKSB7CS8qCisJCQkJCQkgKiBObyBkYXRhIHlldCwgd2FpdAorCQkJCQkJICovCisgCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKyAJCQljID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworIAkJfQorCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmlucHV0X3NsZWVwZXJbZGV2XSwKKwkJCQkJICAgICAgIHBhcm1zW2Rldl0ucHJlY2hfdGltZW91dCk7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYyA9IC1FSU5UUjsJLyogVGhlIHVzZXIgaXMgZ2V0dGluZyByZXN0bGVzcyAqLworCX0KKwlpZiAoYyA9PSAwICYmIERBVEFfQVZBSUwobWlkaV9pbl9idWZbZGV2XSkpCS8qCisJCQkJCQkJICogR290IHNvbWUgYnl0ZXMKKwkJCQkJCQkgKi8KKwl7CisJCW4gPSBEQVRBX0FWQUlMKG1pZGlfaW5fYnVmW2Rldl0pOworCQlpZiAobiA+IGNvdW50KQorCQkJbiA9IGNvdW50OworCQljID0gMDsKKworCQl3aGlsZSAoYyA8IG4pCisJCXsKKwkJCWNoYXIgKmZpeGl0OworCQkJUkVNT1ZFX0JZVEUobWlkaV9pbl9idWZbZGV2XSwgdG1wX2RhdGEpOworCQkJZml4aXQgPSAoY2hhciAqKSAmdG1wX2RhdGE7CisJCQkvKiBCUk9LRSBCUk9LRSBCUk9LRSAqLworCQkJLyogeWVzIHJlbW92ZWQgdGhlIGNsaSgpIGJyYWNrZXRzIGFnYWluCisJCQkgc2hvdWxkIHEtPmxlbix0YWlsJmhlYWQgYmUgYXRvbWljX3Q/ICovCisJCQlpZiAoY29weV90b191c2VyKCYoYnVmKVtjXSwgZml4aXQsIDEpKSB7CisJCQkJYyA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQljKys7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIGM7Cit9CisKK2ludCBNSURJYnVmX2lvY3RsKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHZhbDsKKworCWRldiA9IGRldiA+PiA0OworCQorCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpID09ICdDJykgCisJeworCQlpZiAobWlkaV9kZXZzW2Rldl0tPmNvcHJvYykJLyogQ29wcm9jZXNzb3IgaW9jdGwgKi8KKwkJCXJldHVybiBtaWRpX2RldnNbZGV2XS0+Y29wcm9jLT5pb2N0bChtaWRpX2RldnNbZGV2XS0+Y29wcm9jLT5kZXZjLCBjbWQsIGFyZywgMCk7CisvKgkJcHJpbnRrKCIvZGV2L21pZGklZDogTm8gY29wcm9jZXNzb3IgZm9yIHRoaXMgZGV2aWNlXG4iLCBkZXYpOyovCisJCXJldHVybiAtRU5YSU87CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCAoY21kKSAKKwkJeworCQkJY2FzZSBTTkRDVExfTUlESV9QUkVUSU1FOgorCQkJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKHZhbCA8IDApCisJCQkJCXZhbCA9IDA7CisJCQkJdmFsID0gKEhaICogdmFsKSAvIDEwOworCQkJCXBhcm1zW2Rldl0ucHJlY2hfdGltZW91dCA9IHZhbDsKKwkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCQkKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKCFtaWRpX2RldnNbZGV2XS0+aW9jdGwpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCXJldHVybiBtaWRpX2RldnNbZGV2XS0+aW9jdGwoZGV2LCBjbWQsIGFyZyk7CisJCX0KKwl9Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gZmluZSAqLwordW5zaWduZWQgaW50IE1JRElidWZfcG9sbChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJZGV2ID0gZGV2ID4+IDQ7CisKKwkvKiBpbnB1dCAqLworCXBvbGxfd2FpdChmaWxlLCAmaW5wdXRfc2xlZXBlcltkZXZdLCB3YWl0KTsKKwlpZiAoREFUQV9BVkFJTChtaWRpX2luX2J1ZltkZXZdKSkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJLyogb3V0cHV0ICovCisJcG9sbF93YWl0KGZpbGUsICZtaWRpX3NsZWVwZXJbZGV2XSwgd2FpdCk7CisJaWYgKCFTUEFDRV9BVkFJTChtaWRpX291dF9idWZbZGV2XSkpCisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCisJcmV0dXJuIG1hc2s7Cit9CisKKwordm9pZCBNSURJYnVmX2luaXQodm9pZCkKK3sKKwkvKiBkcmFnIGluIG1pZGlfc3ltcy5vICovCisJeworCQlleHRlcm4gY2hhciBtaWRpX3N5bXNfc3ltYm9sOworCQltaWRpX3N5bXNfc3ltYm9sID0gMDsKKwl9Cit9CisKK2ludCBNSURJYnVmX2F2YWlsKGludCBkZXYpCit7CisJaWYgKG1pZGlfaW5fYnVmW2Rldl0pCisJCXJldHVybiBEQVRBX0FWQUlMIChtaWRpX2luX2J1ZltkZXZdKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tcHU0MDEuYyBiL3NvdW5kL29zcy9tcHU0MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjZmNTNmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL21wdTQwMS5jCkBAIC0wLDAgKzEsMTgyNiBAQAorLyoKKyAqIHNvdW5kL21wdTQwMS5jCisgKgorICogVGhlIGxvdyBsZXZlbCBkcml2ZXIgZm9yIFJvbGFuZCBNUFUtNDAxIGNvbXBhdGlibGUgTWlkaSBjYXJkcy4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBUaG9tYXMgU2FpbGVyCWlvY3RsIGNvZGUgcmV3b3JrZWQgKHZtYWxsb2MvdmZyZWUgcmVtb3ZlZCkKKyAqIEFsYW4gQ294CQltb2R1bGFyaXNhdGlvbiwgdXNlIG5vcm1hbCByZXF1ZXN0X2lycSwgdXNlIGRldl9pZAorICogQmFydGxvbWllaiBab2xuaWVya2lld2ljeglyZW1vdmVkIHNvbWUgX19pbml0IHRvIGFsbG93IHVzaW5nIG1hbnkgZHJpdmVycworICogQ2hyaXMgUmFua2luCQlVcGRhdGUgdGhlIG1vZHVsZS11c2FnZSBjb3VudGVyIGZvciB0aGUgY29wcm9jZXNzb3IKKyAqIFp3YW5lIE13YWlrYW1ibwlDaGFuZ2VkIGF0dGFjaC91bmxvYWQgcmVzb3VyY2UgZnJlZWluZworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNkZWZpbmUgVVNFX1NFUV9NQUNST1MKKyNkZWZpbmUgVVNFX1NJTVBMRV9NQUNST1MKKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiY29wcm9jLmgiCisjaW5jbHVkZSAibXB1NDAxLmgiCisKK3N0YXRpYyBpbnQgICAgICB0aW1lcl9tb2RlID0gVE1SX0lOVEVSTkFMLCB0aW1lcl9jYXBzID0gVE1SX0lOVEVSTkFMOworCitzdHJ1Y3QgbXB1X2NvbmZpZworeworCWludCAgICAgICAgICAgICBiYXNlOwkvKgorCQkJCSAqIEkvTyBiYXNlCisJCQkJICovCisJaW50ICAgICAgICAgICAgIGlycTsKKwlpbnQgICAgICAgICAgICAgb3BlbmVkOwkvKgorCQkJCSAqIE9wZW4gbW9kZQorCQkJCSAqLworCWludCAgICAgICAgICAgICBkZXZubzsKKwlpbnQgICAgICAgICAgICAgc3ludGhubzsKKwlpbnQgICAgICAgICAgICAgdWFydF9tb2RlOworCWludCAgICAgICAgICAgICBpbml0aWFsaXplZDsKKwlpbnQgICAgICAgICAgICAgbW9kZTsKKyNkZWZpbmUgTU9ERV9NSURJCTEKKyNkZWZpbmUgTU9ERV9TWU5USAkyCisJdW5zaWduZWQgY2hhciAgIHZlcnNpb24sIHJldmlzaW9uOworCXVuc2lnbmVkIGludCAgICBjYXBhYmlsaXRpZXM7CisjZGVmaW5lIE1QVV9DQVBfSU5UTEcJMHgxMDAwMDAwMAorI2RlZmluZSBNUFVfQ0FQX1NZTkMJMHgwMDAwMDAxMAorI2RlZmluZSBNUFVfQ0FQX0ZTSwkweDAwMDAwMDIwCisjZGVmaW5lIE1QVV9DQVBfQ0xTCTB4MDAwMDAwNDAKKyNkZWZpbmUgTVBVX0NBUF9TTVBURSAJMHgwMDAwMDA4MAorI2RlZmluZSBNUFVfQ0FQXzJQT1JUCTB4MDAwMDAwMDEKKwlpbnQgICAgICAgICAgICAgdGltZXJfZmxhZzsKKworI2RlZmluZSBNQlVGX01BWAkxMAorI2RlZmluZSBCVUZURVNUKGRjKSBpZiAoZGMtPm1fcHRyID49IE1CVUZfTUFYIHx8IGRjLT5tX3B0ciA8IDApIFwKKwl7cHJpbnRrKCAiTVBVOiBJbnZhbGlkIGJ1ZmZlciBwb2ludGVyICVkLyVkLCBzPSVkXG4iLCAgZGMtPm1fcHRyLCAgZGMtPm1fbGVmdCwgIGRjLT5tX3N0YXRlKTtkYy0+bV9wdHItLTt9CisJICBpbnQgICAgICAgICAgICAgbV9idXN5OworCSAgdW5zaWduZWQgY2hhciAgIG1fYnVmW01CVUZfTUFYXTsKKwkgIGludCAgICAgICAgICAgICBtX3B0cjsKKwkgIGludCAgICAgICAgICAgICBtX3N0YXRlOworCSAgaW50ICAgICAgICAgICAgIG1fbGVmdDsKKwkgIHVuc2lnbmVkIGNoYXIgICBsYXN0X3N0YXR1czsKKwkgIHZvaWQgICAgICAgICAgICAoKmlucHV0aW50cikgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSk7CisJICBpbnQgICAgICAgICAgICAgc2hhcmVkX2lycTsKKwkgIGludCAgICAgICAgICAgICpvc3A7CisJICBzcGlubG9ja190CWxvY2s7CisgIH07CisKKyNkZWZpbmUJREFUQVBPUlQoYmFzZSkgICAoYmFzZSkKKyNkZWZpbmUJQ09NRFBPUlQoYmFzZSkgICAoYmFzZSsxKQorI2RlZmluZQlTVEFUUE9SVChiYXNlKSAgIChiYXNlKzEpCisKKworc3RhdGljIHZvaWQgbXB1NDAxX2Nsb3NlKGludCBkZXYpOworCitzdGF0aWMgaW5saW5lIGludCBtcHU0MDFfc3RhdHVzKHN0cnVjdCBtcHVfY29uZmlnICpkZXZjKQoreworCXJldHVybiBpbmIoU1RBVFBPUlQoZGV2Yy0+YmFzZSkpOworfQorCisjZGVmaW5lIGlucHV0X2F2YWlsKGRldmMpCQkoIShtcHU0MDFfc3RhdHVzKGRldmMpJklOUFVUX0FWQUlMKSkKKyNkZWZpbmUgb3V0cHV0X3JlYWR5KGRldmMpCQkoIShtcHU0MDFfc3RhdHVzKGRldmMpJk9VVFBVVF9SRUFEWSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9jb21tYW5kKHN0cnVjdCBtcHVfY29uZmlnICpkZXZjLCB1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwlvdXRiKGNtZCwgQ09NRFBPUlQoZGV2Yy0+YmFzZSkpOworfQorCitzdGF0aWMgaW5saW5lIGludCByZWFkX2RhdGEoc3RydWN0IG1wdV9jb25maWcgKmRldmMpCit7CisJcmV0dXJuIGluYihEQVRBUE9SVChkZXZjLT5iYXNlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9kYXRhKHN0cnVjdCBtcHVfY29uZmlnICpkZXZjLCB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJb3V0YihieXRlLCBEQVRBUE9SVChkZXZjLT5iYXNlKSk7Cit9CisKKyNkZWZpbmUJT1VUUFVUX1JFQURZCTB4NDAKKyNkZWZpbmUJSU5QVVRfQVZBSUwJMHg4MAorI2RlZmluZQlNUFVfQUNLCQkweEZFCisjZGVmaW5lCU1QVV9SRVNFVAkweEZGCisjZGVmaW5lCVVBUlRfTU9ERV9PTgkweDNGCisKK3N0YXRpYyBzdHJ1Y3QgbXB1X2NvbmZpZyBkZXZfY29uZltNQVhfTUlESV9ERVZdOworCitzdGF0aWMgaW50IG5fbXB1X2RldnM7CisKK3N0YXRpYyBpbnQgcmVzZXRfbXB1NDAxKHN0cnVjdCBtcHVfY29uZmlnICpkZXZjKTsKK3N0YXRpYyB2b2lkIHNldF91YXJ0X21vZGUoaW50IGRldiwgc3RydWN0IG1wdV9jb25maWcgKmRldmMsIGludCBhcmcpOworCitzdGF0aWMgaW50IG1wdV90aW1lcl9pbml0KGludCBtaWRpX2Rldik7CitzdGF0aWMgdm9pZCBtcHVfdGltZXJfaW50ZXJydXB0KHZvaWQpOworc3RhdGljIHZvaWQgdGltZXJfZXh0X2V2ZW50KHN0cnVjdCBtcHVfY29uZmlnICpkZXZjLCBpbnQgZXZlbnQsIGludCBwYXJtKTsKKworc3RhdGljIHN0cnVjdCBzeW50aF9pbmZvIG1wdV9zeW50aF9pbmZvX3Byb3RvID0geworCSJNUFUtNDAxIE1JREkgaW50ZXJmYWNlIiwgCisJMCwgCisJU1lOVEhfVFlQRV9NSURJLCAKKwlNSURJX1RZUEVfTVBVNDAxLCAKKwkwLCAxMjgsIAorCTAsIDEyOCwgCisJU1lOVEhfQ0FQX0lOUFVUCit9OworCitzdGF0aWMgc3RydWN0IHN5bnRoX2luZm8gbXB1X3N5bnRoX2luZm9bTUFYX01JRElfREVWXTsKKworLyoKKyAqIFN0YXRlcyBmb3IgdGhlIGlucHV0IHNjYW5uZXIKKyAqLworCisjZGVmaW5lIFNUX0lOSVQJCQkwCS8qIFJlYWR5IGZvciB0aW1pbmcgYnl0ZSBvciBtc2cgKi8KKyNkZWZpbmUgU1RfVElNRUQJCTEJLyogTGVhZGluZyB0aW1pbmcgYnl0ZSByY3ZkICovCisjZGVmaW5lIFNUX0RBVEFCWVRFCQkyCS8qIFdhaXRpbmcgZm9yIChucl9sZWZ0KSBkYXRhIGJ5dGVzICovCisKKyNkZWZpbmUgU1RfU1lTTVNHCQkxMDAJLyogU3lzdGVtIG1lc3NhZ2UgKHN5c3ggZXRjKS4gKi8KKyNkZWZpbmUgU1RfU1lTRVgJCTEwMQkvKiBTeXN0ZW0gZXhjbHVzaXZlIG1zZyAqLworI2RlZmluZSBTVF9NVEMJCQkxMDIJLyogTWlkaSBUaW1lIENvZGUgKE1UQykgcWZyYW1lIG1zZyAqLworI2RlZmluZSBTVF9TT05HU0VMCQkxMDMJLyogU29uZyBzZWxlY3QgKi8KKyNkZWZpbmUgU1RfU09OR1BPUwkJMTA0CS8qIFNvbmcgcG9zaXRpb24gcG9pbnRlciAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBsZW5fdGFiW10gPQkvKiAjIG9mIGRhdGEgYnl0ZXMgZm9sbG93aW5nIGEgc3RhdHVzCisJCQkJCSAqLworeworCTIsCQkJLyogOHggKi8KKwkyLAkJCS8qIDl4ICovCisJMiwJCQkvKiBBeCAqLworCTIsCQkJLyogQnggKi8KKwkxLAkJCS8qIEN4ICovCisJMSwJCQkvKiBEeCAqLworCTIsCQkJLyogRXggKi8KKwkwCQkJLyogRnggKi8KK307CisKKyNkZWZpbmUgU1RPUkUoY21kKSBcCit7IFwKKwlpbnQgbGVuOyBcCisJdW5zaWduZWQgY2hhciBvYnVmWzhdOyBcCisJY21kOyBcCisJc2VxX2lucHV0X2V2ZW50KG9idWYsIGxlbik7IFwKK30KKworI2RlZmluZSBfc2VxYnVmIG9idWYKKyNkZWZpbmUgX3NlcWJ1ZnB0ciAwCisjZGVmaW5lIF9TRVFfQURWQlVGKHgpIGxlbj14CisKK3N0YXRpYyBpbnQgbXB1X2lucHV0X3NjYW5uZXIoc3RydWN0IG1wdV9jb25maWcgKmRldmMsIHVuc2lnbmVkIGNoYXIgbWlkaWMpCit7CisKKwlzd2l0Y2ggKGRldmMtPm1fc3RhdGUpCisJeworCQljYXNlIFNUX0lOSVQ6CisJCQlzd2l0Y2ggKG1pZGljKQorCQkJeworCQkJCWNhc2UgMHhmODoKKwkJCQkvKiBUaW1lciBvdmVyZmxvdyAqLworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMHhmYzoKKwkJCQkJcHJpbnRrKCI8YWxsIGVuZD4iKTsKKwkJCSAJCWJyZWFrOworCisJCQkJY2FzZSAweGZkOgorCQkJCQlpZiAoZGV2Yy0+dGltZXJfZmxhZykKKwkJCQkJCW1wdV90aW1lcl9pbnRlcnJ1cHQoKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDB4ZmU6CisJCQkJCXJldHVybiBNUFVfQUNLOworCisJCQkJY2FzZSAweGYwOgorCQkJCWNhc2UgMHhmMToKKwkJCQljYXNlIDB4ZjI6CisJCQkJY2FzZSAweGYzOgorCQkJCWNhc2UgMHhmNDoKKwkJCQljYXNlIDB4ZjU6CisJCQkJY2FzZSAweGY2OgorCQkJCWNhc2UgMHhmNzoKKwkJCQkJcHJpbnRrKCI8VHJrIGRhdGEgcnEgIyVkPiIsIG1pZGljICYgMHgwZik7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweGY5OgorCQkJCQlwcmludGsoIjxjb25kdWN0b3IgcnE+Iik7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweGZmOgorCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfU1lTTVNHOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWlmIChtaWRpYyA8PSAweGVmKQorCQkJCQl7CisJCQkJCQkvKiBwcmludGsoICJtcHUgdGltZTogJWQgIiwgIG1pZGljKTsgKi8KKwkJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9USU1FRDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlwcmludGsoIjxNUFU6IFVua25vd24gZXZlbnQgJTAyeD4gIiwgbWlkaWMpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTVF9USU1FRDoKKwkJCXsKKwkJCQlpbnQgbXNnID0gKChpbnQpIChtaWRpYyAmIDB4ZjApID4+IDQpOworCisJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX0RBVEFCWVRFOworCisJCQkJaWYgKG1zZyA8IDgpCS8qIERhdGEgYnl0ZSAqLworCQkJCXsKKwkJCQkJLyogcHJpbnRrKCAibWlkaSBtc2cgKHJ1bm5pbmcgc3RhdHVzKSAiKTsgKi8KKwkJCQkJbXNnID0gKChpbnQpIChkZXZjLT5sYXN0X3N0YXR1cyAmIDB4ZjApID4+IDQpOworCQkJCQltc2cgLT0gODsKKwkJCQkJZGV2Yy0+bV9sZWZ0ID0gbGVuX3RhYlttc2ddIC0gMTsKKworCQkJCQlkZXZjLT5tX3B0ciA9IDI7CisJCQkJCWRldmMtPm1fYnVmWzBdID0gZGV2Yy0+bGFzdF9zdGF0dXM7CisJCQkJCWRldmMtPm1fYnVmWzFdID0gbWlkaWM7CisKKwkJCQkJaWYgKGRldmMtPm1fbGVmdCA8PSAwKQorCQkJCQl7CisJCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwkJCQkJCWRvX21pZGlfbXNnKGRldmMtPnN5bnRobm8sIGRldmMtPm1fYnVmLCBkZXZjLT5tX3B0cik7CisJCQkJCQlkZXZjLT5tX3B0ciA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAobXNnID09IDB4ZikJLyogTVBVIE1BUksgKi8KKwkJCQl7CisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCisJCQkJCXN3aXRjaCAobWlkaWMpCisJCQkJCXsKKwkJCQkJCWNhc2UgMHhmODoKKwkJCQkJCQkvKiBwcmludGsoICJOT1AgIik7ICovCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgMHhmOToKKwkJCQkJCQkvKiBwcmludGsoICJtZWFzIGVuZCAiKTsgKi8KKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAweGZjOgorCQkJCQkJCS8qIHByaW50ayggImRhdGEgZW5kICIpOyAqLworCQkJCQkJCWJyZWFrOworCisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCXByaW50aygiVW5rbm93biBNUFUgbWFyayAlMDJ4XG4iLCBtaWRpYyk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZGV2Yy0+bGFzdF9zdGF0dXMgPSBtaWRpYzsKKwkJCQkJLyogcHJpbnRrKCAibWlkaSBtc2cgIik7ICovCisJCQkJCW1zZyAtPSA4OworCQkJCQlkZXZjLT5tX2xlZnQgPSBsZW5fdGFiW21zZ107CisKKwkJCQkJZGV2Yy0+bV9wdHIgPSAxOworCQkJCQlkZXZjLT5tX2J1ZlswXSA9IG1pZGljOworCisJCQkJCWlmIChkZXZjLT5tX2xlZnQgPD0gMCkKKwkJCQkJeworCQkJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX0lOSVQ7CisJCQkJCQlkb19taWRpX21zZyhkZXZjLT5zeW50aG5vLCBkZXZjLT5tX2J1ZiwgZGV2Yy0+bV9wdHIpOworCQkJCQkJZGV2Yy0+bV9wdHIgPSAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTVF9TWVNNU0c6CisJCQlzd2l0Y2ggKG1pZGljKQorCQkJeworCQkJCWNhc2UgMHhmMDoKKwkJCQkJcHJpbnRrKCI8U1lYPiIpOworCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfU1lTRVg7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweGYxOgorCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfTVRDOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMHhmMjoKKwkJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX1NPTkdQT1M7CisJCQkJCWRldmMtPm1fcHRyID0gMDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDB4ZjM6CisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9TT05HU0VMOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMHhmNjoKKwkJCQkJLyogcHJpbnRrKCAidHVuZV9yZXF1ZXN0XG4iKTsgKi8KKwkJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX0lOSVQ7CisKKwkJCQkJLyoKKwkJCQkJICogICAgUmVhbCB0aW1lIG1lc3NhZ2VzCisJCQkJCSAqLworCQkJCWNhc2UgMHhmODoKKwkJCQkJLyogbWlkaSBjbG9jayAqLworCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwkJCQkJdGltZXJfZXh0X2V2ZW50KGRldmMsIFRNUl9DTE9DSywgMCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweGZBOgorCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwkJCQkJdGltZXJfZXh0X2V2ZW50KGRldmMsIFRNUl9TVEFSVCwgMCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweEZCOgorCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwkJCQkJdGltZXJfZXh0X2V2ZW50KGRldmMsIFRNUl9DT05USU5VRSwgMCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweEZDOgorCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwkJCQkJdGltZXJfZXh0X2V2ZW50KGRldmMsIFRNUl9TVE9QLCAwKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDB4RkU6CisJCQkJCS8qIGFjdGl2ZSBzZW5zaW5nICovCisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMHhmZjoKKwkJCQkJLyogcHJpbnRrKCAibWlkaSBoYXJkIHJlc2V0Iik7ICovCisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXByaW50aygidW5rbm93biBNSURJIHN5c21zZyAlMHhcbiIsIG1pZGljKTsKKwkJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX0lOSVQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNUX01UQzoKKwkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCQkJcHJpbnRrKCJNVEMgZnJhbWUgJXgwMlxuIiwgbWlkaWMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVF9TWVNFWDoKKwkJCWlmIChtaWRpYyA9PSAweGY3KQorCQkJeworCQkJCXByaW50aygiPEVPWD4iKTsKKwkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlwcmludGsoIiUwMnggIiwgbWlkaWMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVF9TT05HUE9TOgorCQkJQlVGVEVTVChkZXZjKTsKKwkJCWRldmMtPm1fYnVmW2RldmMtPm1fcHRyKytdID0gbWlkaWM7CisJCQlpZiAoZGV2Yy0+bV9wdHIgPT0gMikKKwkJCXsKKwkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwkJCQlkZXZjLT5tX3B0ciA9IDA7CisJCQkJdGltZXJfZXh0X2V2ZW50KGRldmMsIFRNUl9TUFAsCisJCQkJCSgoZGV2Yy0+bV9idWZbMV0gJiAweDdmKSA8PCA3KSB8CisJCQkJCShkZXZjLT5tX2J1ZlswXSAmIDB4N2YpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1RfREFUQUJZVEU6CisJCQlCVUZURVNUKGRldmMpOworCQkJZGV2Yy0+bV9idWZbZGV2Yy0+bV9wdHIrK10gPSBtaWRpYzsKKwkJCWlmICgoLS1kZXZjLT5tX2xlZnQpIDw9IDApCisJCQl7CisJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX0lOSVQ7CisJCQkJZG9fbWlkaV9tc2coZGV2Yy0+c3ludGhubywgZGV2Yy0+bV9idWYsIGRldmMtPm1fcHRyKTsKKwkJCQlkZXZjLT5tX3B0ciA9IDA7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJCYWQgc3RhdGUgJWQgIiwgZGV2Yy0+bV9zdGF0ZSk7CisJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIG1wdTQwMV9pbnB1dF9sb29wKHN0cnVjdCBtcHVfY29uZmlnICpkZXZjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGJ1c3k7CisJaW50IG47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJYnVzeSA9IGRldmMtPm1fYnVzeTsKKwlkZXZjLT5tX2J1c3kgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCisJaWYgKGJ1c3kpCQkvKiBBbHJlYWR5IGluc2lkZSB0aGUgc2Nhbm5lciAqLworCQlyZXR1cm47CisKKwluID0gNTA7CisKKwl3aGlsZSAoaW5wdXRfYXZhaWwoZGV2YykgJiYgbi0tID4gMCkKKwl7CisJCXVuc2lnbmVkIGNoYXIgYyA9IHJlYWRfZGF0YShkZXZjKTsKKworCQlpZiAoZGV2Yy0+bW9kZSA9PSBNT0RFX1NZTlRIKQorCQl7CisJCQltcHVfaW5wdXRfc2Nhbm5lcihkZXZjLCBjKTsKKwkJfQorCQllbHNlIGlmIChkZXZjLT5vcGVuZWQgJiBPUEVOX1JFQUQgJiYgZGV2Yy0+aW5wdXRpbnRyICE9IE5VTEwpCisJCQlkZXZjLT5pbnB1dGludHIoZGV2Yy0+ZGV2bm8sIGMpOworCX0KKwlkZXZjLT5tX2J1c3kgPSAwOworfQorCitpbnQgaW50Y2hrX21wdTQwMSh2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1wdV9jb25maWcgKmRldmM7CisJaW50IGRldiA9IChpbnQpIGRldl9pZDsKKworCWRldmMgPSAmZGV2X2NvbmZbZGV2XTsKKwlyZXR1cm4gaW5wdXRfYXZhaWwoZGV2Yyk7Cit9CisKK2lycXJldHVybl90IG1wdWludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpCit7CisJc3RydWN0IG1wdV9jb25maWcgKmRldmM7CisJaW50IGRldiA9IChpbnQpIGRldl9pZDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlkZXZjID0gJmRldl9jb25mW2Rldl07CisKKwlpZiAoaW5wdXRfYXZhaWwoZGV2YykpCisJeworCQloYW5kbGVkID0gMTsKKwkJaWYgKGRldmMtPmJhc2UgIT0gMCAmJiAoZGV2Yy0+b3BlbmVkICYgT1BFTl9SRUFEIHx8IGRldmMtPm1vZGUgPT0gTU9ERV9TWU5USCkpCisJCQltcHU0MDFfaW5wdXRfbG9vcChkZXZjKTsKKwkJZWxzZQorCQl7CisJCQkvKiBEdW1teSByZWFkIChqdXN0IHRvIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQpICovCisJCQlyZWFkX2RhdGEoZGV2Yyk7CisJCX0KKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpbnQgbXB1NDAxX29wZW4oaW50IGRldiwgaW50IG1vZGUsCisJICAgIHZvaWQgICAgICAgICAgICAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKKwkgICAgdm9pZCAgICAgICAgICAgICgqb3V0cHV0KSAoaW50IGRldikKKykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtcHVfY29uZmlnICpkZXZjOworCXN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAqY29wcm9jZXNzb3I7CisKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX21pZGlzIHx8IG1pZGlfZGV2c1tkZXZdID09IE5VTEwpCisJCXJldHVybiAtRU5YSU87CisKKwlkZXZjID0gJmRldl9jb25mW2Rldl07CisKKwlpZiAoZGV2Yy0+b3BlbmVkKQorCQkgIHJldHVybiAtRUJVU1k7CisJLyoKKwkgKiAgVmVyaWZ5IHRoYXQgdGhlIGRldmljZSBpcyByZWFsbHkgcnVubmluZy4KKwkgKiAgU29tZSBkZXZpY2VzIChzdWNoIGFzIEVuc29uaXEgU291bmRTY2FwZSBkb24ndAorCSAqICB3b3JrIGJlZm9yZSB0aGUgb24gYm9hcmQgcHJvY2Vzc29yIChPQlApIGlzIGluaXRpYWxpemVkCisJICogIGJ5IGRvd25sb2FkaW5nIGl0cyBtaWNyb2NvZGUuCisJICovCisKKwlpZiAoIWRldmMtPmluaXRpYWxpemVkKQorCXsKKwkJaWYgKG1wdTQwMV9zdGF0dXMoZGV2YykgPT0gMHhmZikJLyogQnVzIGZsb2F0ICovCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAibXB1NDAxOiBEZXZpY2Ugbm90IGluaXRpYWxpemVkIHByb3Blcmx5XG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXJlc2V0X21wdTQwMShkZXZjKTsKKwl9CisKKwlpZiAoIChjb3Byb2Nlc3NvciA9IG1pZGlfZGV2c1tkZXZdLT5jb3Byb2MpICE9IE5VTEwgKQorCXsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChjb3Byb2Nlc3Nvci0+b3duZXIpKSB7CisJCQltcHU0MDFfY2xvc2UoZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJaWYgKChlcnIgPSBjb3Byb2Nlc3Nvci0+b3Blbihjb3Byb2Nlc3Nvci0+ZGV2YywgQ09QUl9NSURJKSkgPCAwKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJNUFUtNDAxOiBDYW4ndCBhY2Nlc3MgY29wcm9jZXNzb3IgZGV2aWNlXG4iKTsKKwkJCW1wdTQwMV9jbG9zZShkZXYpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwkKKwlzZXRfdWFydF9tb2RlKGRldiwgZGV2YywgMSk7CisJZGV2Yy0+bW9kZSA9IE1PREVfTUlESTsKKwlkZXZjLT5zeW50aG5vID0gMDsKKworCW1wdTQwMV9pbnB1dF9sb29wKGRldmMpOworCisJZGV2Yy0+aW5wdXRpbnRyID0gaW5wdXQ7CisJZGV2Yy0+b3BlbmVkID0gbW9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtcHU0MDFfY2xvc2UoaW50IGRldikKK3sKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YzsKKwlzdHJ1Y3QgY29wcm9jX29wZXJhdGlvbnMgKmNvcHJvY2Vzc29yOworCisJZGV2YyA9ICZkZXZfY29uZltkZXZdOworCWlmIChkZXZjLT51YXJ0X21vZGUpCisJCXJlc2V0X21wdTQwMShkZXZjKTsJLyoKKwkJCQkJICogVGhpcyBkaXNhYmxlcyB0aGUgVUFSVCBtb2RlCisJCQkJCSAqLworCWRldmMtPm1vZGUgPSAwOworCWRldmMtPmlucHV0aW50ciA9IE5VTEw7CisKKwljb3Byb2Nlc3NvciA9IG1pZGlfZGV2c1tkZXZdLT5jb3Byb2M7CisJaWYgKGNvcHJvY2Vzc29yKSB7CisJCWNvcHJvY2Vzc29yLT5jbG9zZShjb3Byb2Nlc3Nvci0+ZGV2YywgQ09QUl9NSURJKTsKKwkJbW9kdWxlX3B1dChjb3Byb2Nlc3Nvci0+b3duZXIpOworCX0KKwlkZXZjLT5vcGVuZWQgPSAwOworfQorCitzdGF0aWMgaW50IG1wdTQwMV9vdXQoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCit7CisJaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN0cnVjdCBtcHVfY29uZmlnICpkZXZjOworCisJZGV2YyA9ICZkZXZfY29uZltkZXZdOworCisJLyoKKwkgKiBTb21ldGltZXMgaXQgdGFrZXMgYWJvdXQgMzAwMDAgbG9vcHMgYmVmb3JlIHRoZSBvdXRwdXQgYmVjb21lcyByZWFkeQorCSAqIChBZnRlciByZXNldCkuIE5vcm1hbGx5IGl0IHRha2VzIGp1c3QgYWJvdXQgMTAgbG9vcHMuCisJICovCisKKwlmb3IgKHRpbWVvdXQgPSAzMDAwMDsgdGltZW91dCA+IDAgJiYgIW91dHB1dF9yZWFkeShkZXZjKTsgdGltZW91dC0tKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlpZiAoIW91dHB1dF9yZWFkeShkZXZjKSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1wdTQwMTogU2VuZCBkYXRhIHRpbWVvdXRcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCXdyaXRlX2RhdGEoZGV2YywgbWlkaV9ieXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtcHU0MDFfY29tbWFuZChpbnQgZGV2LCBtcHVfY29tbWFuZF9yZWMgKiBjbWQpCit7CisJaW50IGksIHRpbWVvdXQsIG9rOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YzsKKworCWRldmMgPSAmZGV2X2NvbmZbZGV2XTsKKworCWlmIChkZXZjLT51YXJ0X21vZGUpCS8qCisJCQkJICogTm90IHBvc3NpYmxlIGluIFVBUlQgbW9kZQorCQkJCSAqLworCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBjb21tYW5kcyBub3QgcG9zc2libGUgaW4gdGhlIFVBUlQgbW9kZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKgorCSAqIFRlc3QgZm9yIGlucHV0IHNpbmNlIHBlbmRpbmcgaW5wdXQgc2VlbXMgdG8gYmxvY2sgdGhlIG91dHB1dC4KKwkgKi8KKwlpZiAoaW5wdXRfYXZhaWwoZGV2YykpCisJCW1wdTQwMV9pbnB1dF9sb29wKGRldmMpOworCisJLyoKKwkgKiBTb21ldGltZXMgaXQgdGFrZXMgYWJvdXQgNTAwMDAgbG9vcHMgYmVmb3JlIHRoZSBvdXRwdXQgYmVjb21lcyByZWFkeQorCSAqIChBZnRlciByZXNldCkuIE5vcm1hbGx5IGl0IHRha2VzIGp1c3QgYWJvdXQgMTAgbG9vcHMuCisJICovCisKKwl0aW1lb3V0ID0gNTAwMDA7CityZXRyeToKKwlpZiAodGltZW91dC0tIDw9IDApCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtcHU0MDE6IENvbW1hbmQgKDB4JXgpIHRpbWVvdXRcbiIsIChpbnQpIGNtZC0+Y21kKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWlmICghb3V0cHV0X3JlYWR5KGRldmMpKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCWdvdG8gcmV0cnk7CisJfQorCXdyaXRlX2NvbW1hbmQoZGV2YywgY21kLT5jbWQpOworCisJb2sgPSAwOworCWZvciAodGltZW91dCA9IDUwMDAwOyB0aW1lb3V0ID4gMCAmJiAhb2s7IHRpbWVvdXQtLSkKKwl7CisJCWlmIChpbnB1dF9hdmFpbChkZXZjKSkKKwkJeworCQkJaWYgKGRldmMtPm9wZW5lZCAmJiBkZXZjLT5tb2RlID09IE1PREVfU1lOVEgpCisJCQl7CisJCQkJaWYgKG1wdV9pbnB1dF9zY2FubmVyKGRldmMsIHJlYWRfZGF0YShkZXZjKSkgPT0gTVBVX0FDSykKKwkJCQkJb2sgPSAxOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIERldmljZSBpcyBub3QgY3VycmVudGx5IG9wZW4uIFVzZSBzaW1wbGVyIG1ldGhvZCAqLworCQkJCWlmIChyZWFkX2RhdGEoZGV2YykgPT0gTVBVX0FDSykKKwkJCQkJb2sgPSAxOworCQkJfQorCQl9CisJfQorCWlmICghb2spCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChjbWQtPm5yX2FyZ3MpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5ucl9hcmdzOyBpKyspCisJCXsKKwkJCWZvciAodGltZW91dCA9IDMwMDA7IHRpbWVvdXQgPiAwICYmICFvdXRwdXRfcmVhZHkoZGV2Yyk7IHRpbWVvdXQtLSk7CisKKwkJCWlmICghbXB1NDAxX291dChkZXYsIGNtZC0+ZGF0YVtpXSkpCisJCQl7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBDb21tYW5kICgweCV4KSwgcGFybSBzZW5kIGZhaWxlZC5cbiIsIChpbnQpIGNtZC0+Y21kKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorCX0KKwlyZXQgPSAwOworCWNtZC0+ZGF0YVswXSA9IDA7CisKKwlpZiAoY21kLT5ucl9yZXR1cm5zKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IGNtZC0+bnJfcmV0dXJuczsgaSsrKQorCQl7CisJCQlvayA9IDA7CisJCQlmb3IgKHRpbWVvdXQgPSA1MDAwOyB0aW1lb3V0ID4gMCAmJiAhb2s7IHRpbWVvdXQtLSkKKwkJCQlpZiAoaW5wdXRfYXZhaWwoZGV2YykpCisJCQkJeworCQkJCQljbWQtPmRhdGFbaV0gPSByZWFkX2RhdGEoZGV2Yyk7CisJCQkJCW9rID0gMTsKKwkJCQl9CisJCQlpZiAoIW9rKQorCQkJeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXB1X2NtZChpbnQgZGV2LCBpbnQgY21kLCBpbnQgZGF0YSkKK3sKKwlpbnQgcmV0OworCisJc3RhdGljIG1wdV9jb21tYW5kX3JlYyByZWM7CisKKwlyZWMuY21kID0gY21kICYgMHhmZjsKKwlyZWMubnJfYXJncyA9ICgoY21kICYgMHhmMCkgPT0gMHhFMCk7CisJcmVjLm5yX3JldHVybnMgPSAoKGNtZCAmIDB4ZjApID09IDB4QTApOworCXJlYy5kYXRhWzBdID0gZGF0YSAmIDB4ZmY7CisKKwlpZiAoKHJldCA9IG1wdTQwMV9jb21tYW5kKGRldiwgJnJlYykpIDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpIHJlYy5kYXRhWzBdOworfQorCitzdGF0aWMgaW50IG1wdTQwMV9wcmVmaXhfY21kKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgc3RhdHVzKQoreworCXN0cnVjdCBtcHVfY29uZmlnICpkZXZjID0gJmRldl9jb25mW2Rldl07CisKKwlpZiAoZGV2Yy0+dWFydF9tb2RlKQorCQlyZXR1cm4gMTsKKworCWlmIChzdGF0dXMgPCAweGYwKQorCXsKKwkJaWYgKG1wdV9jbWQoZGV2LCAweEQwLCAwKSA8IDApCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIDE7CisJfQorCXN3aXRjaCAoc3RhdHVzKQorCXsKKwkJY2FzZSAweEYwOgorCQkJaWYgKG1wdV9jbWQoZGV2LCAweERGLCAwKSA8IDApCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gMTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IG1wdTQwMV9zdGFydF9yZWFkKGludCBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXB1NDAxX2VuZF9yZWFkKGludCBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXB1NDAxX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YzsKKwltcHVfY29tbWFuZF9yZWMgcmVjOworCWludCB2YWwsIHJldDsKKworCWRldmMgPSAmZGV2X2NvbmZbZGV2XTsKKwlzd2l0Y2ggKGNtZCkgCisJeworCQljYXNlIFNORENUTF9NSURJX01QVU1PREU6CisJCQlpZiAoIShkZXZjLT5jYXBhYmlsaXRpZXMgJiBNUFVfQ0FQX0lOVExHKSkgeyAvKiBObyBpbnRlbGxpZ2VudCBtb2RlICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBJbnRlbGxpZ2VudCBtb2RlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEhXXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNldF91YXJ0X21vZGUoZGV2LCBkZXZjLCAhdmFsKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX01JRElfTVBVQ01EOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZWMsIGFyZywgc2l6ZW9mKHJlYykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKChyZXQgPSBtcHU0MDFfY29tbWFuZChkZXYsICZyZWMpKSA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcmVjLCBzaXplb2YocmVjKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdm9pZCBtcHU0MDFfa2ljayhpbnQgZGV2KQoreworfQorCitzdGF0aWMgaW50IG1wdTQwMV9idWZmZXJfc3RhdHVzKGludCBkZXYpCit7CisJcmV0dXJuIDA7CQkvKgorCQkJCSAqIE5vIGRhdGEgaW4gYnVmZmVycworCQkJCSAqLworfQorCitzdGF0aWMgaW50IG1wdV9zeW50aF9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWludCBtaWRpX2RldjsKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YzsKKworCW1pZGlfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKworCWlmIChtaWRpX2RldiA8IDAgfHwgbWlkaV9kZXYgPiBudW1fbWlkaXMgfHwgbWlkaV9kZXZzW21pZGlfZGV2XSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOWElPOworCisJZGV2YyA9ICZkZXZfY29uZlttaWRpX2Rldl07CisKKwlzd2l0Y2ggKGNtZCkKKwl7CisKKwkJY2FzZSBTTkRDVExfU1lOVEhfSU5GTzoKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmbXB1X3N5bnRoX2luZm9bbWlkaV9kZXZdLAorCQkJCQlzaXplb2Yoc3RydWN0IHN5bnRoX2luZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1NZTlRIX01FTUFWTDoKKwkJCXJldHVybiAweDdmZmZmZmZmOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXB1X3N5bnRoX29wZW4oaW50IGRldiwgaW50IG1vZGUpCit7CisJaW50IG1pZGlfZGV2LCBlcnI7CisJc3RydWN0IG1wdV9jb25maWcgKmRldmM7CisJc3RydWN0IGNvcHJvY19vcGVyYXRpb25zICpjb3Byb2Nlc3NvcjsKKworCW1pZGlfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKworCWlmIChtaWRpX2RldiA8IDAgfHwgbWlkaV9kZXYgPiBudW1fbWlkaXMgfHwgbWlkaV9kZXZzW21pZGlfZGV2XSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOWElPOworCisJZGV2YyA9ICZkZXZfY29uZlttaWRpX2Rldl07CisKKwkvKgorCSAqICBWZXJpZnkgdGhhdCB0aGUgZGV2aWNlIGlzIHJlYWxseSBydW5uaW5nLgorCSAqICBTb21lIGRldmljZXMgKHN1Y2ggYXMgRW5zb25pcSBTb3VuZFNjYXBlIGRvbid0CisJICogIHdvcmsgYmVmb3JlIHRoZSBvbiBib2FyZCBwcm9jZXNzb3IgKE9CUCkgaXMgaW5pdGlhbGl6ZWQKKwkgKiAgYnkgZG93bmxvYWRpbmcgaXRzIG1pY3JvY29kZS4KKwkgKi8KKworCWlmICghZGV2Yy0+aW5pdGlhbGl6ZWQpCisJeworCQlpZiAobXB1NDAxX3N0YXR1cyhkZXZjKSA9PSAweGZmKQkvKiBCdXMgZmxvYXQgKi8KKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJtcHU0MDE6IERldmljZSBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHlcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcmVzZXRfbXB1NDAxKGRldmMpOworCX0KKwlpZiAoZGV2Yy0+b3BlbmVkKQorCQlyZXR1cm4gLUVCVVNZOworCWRldmMtPm1vZGUgPSBNT0RFX1NZTlRIOworCWRldmMtPnN5bnRobm8gPSBkZXY7CisKKwlkZXZjLT5pbnB1dGludHIgPSBOVUxMOworCisJY29wcm9jZXNzb3IgPSBtaWRpX2RldnNbbWlkaV9kZXZdLT5jb3Byb2M7CisJaWYgKGNvcHJvY2Vzc29yKSB7CisJCWlmICghdHJ5X21vZHVsZV9nZXQoY29wcm9jZXNzb3ItPm93bmVyKSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCWlmICgoZXJyID0gY29wcm9jZXNzb3ItPm9wZW4oY29wcm9jZXNzb3ItPmRldmMsIENPUFJfTUlESSkpIDwgMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBDYW4ndCBhY2Nlc3MgY29wcm9jZXNzb3IgZGV2aWNlXG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJZGV2Yy0+b3BlbmVkID0gbW9kZTsKKwlyZXNldF9tcHU0MDEoZGV2Yyk7CisKKwlpZiAobW9kZSAmIE9QRU5fUkVBRCkKKwl7CisJCW1wdV9jbWQobWlkaV9kZXYsIDB4OEIsIDApOwkvKiBFbmFibGUgZGF0YSBpbiBzdG9wIG1vZGUgKi8KKwkJbXB1X2NtZChtaWRpX2RldiwgMHgzNCwgMCk7CS8qIFJldHVybiB0aW1pbmcgYnl0ZXMgaW4gc3RvcCBtb2RlICovCisJCW1wdV9jbWQobWlkaV9kZXYsIDB4ODcsIDApOwkvKiBFbmFibGUgcGl0Y2ggJiBjb250cm9sbGVyICovCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtcHVfc3ludGhfY2xvc2UoaW50IGRldikKK3sgCisJaW50IG1pZGlfZGV2OworCXN0cnVjdCBtcHVfY29uZmlnICpkZXZjOworCXN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAqY29wcm9jZXNzb3I7CisKKwltaWRpX2RldiA9IHN5bnRoX2RldnNbZGV2XS0+bWlkaV9kZXY7CisKKwlkZXZjID0gJmRldl9jb25mW21pZGlfZGV2XTsKKwltcHVfY21kKG1pZGlfZGV2LCAweDE1LCAwKTsJLyogU3RvcCByZWNvcmRpbmcsIHBsYXliYWNrIGFuZCBNSURJICovCisJbXB1X2NtZChtaWRpX2RldiwgMHg4YSwgMCk7CS8qIERpc2FibGUgZGF0YSBpbiBzdG9wcGVkIG1vZGUgKi8KKworCWRldmMtPmlucHV0aW50ciA9IE5VTEw7CisKKwljb3Byb2Nlc3NvciA9IG1pZGlfZGV2c1ttaWRpX2Rldl0tPmNvcHJvYzsKKwlpZiAoY29wcm9jZXNzb3IpIHsKKwkJY29wcm9jZXNzb3ItPmNsb3NlKGNvcHJvY2Vzc29yLT5kZXZjLCBDT1BSX01JREkpOworCQltb2R1bGVfcHV0KGNvcHJvY2Vzc29yLT5vd25lcik7CisJfQorCWRldmMtPm9wZW5lZCA9IDA7CisJZGV2Yy0+bW9kZSA9IDA7Cit9CisKKyNkZWZpbmUgTUlESV9TWU5USF9OQU1FCSJNUFUtNDAxIFVBUlQgTWlkaSIKKyNkZWZpbmUgTUlESV9TWU5USF9DQVBTCVNZTlRIX0NBUF9JTlBVVAorI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworc3RhdGljIHN0cnVjdCBzeW50aF9vcGVyYXRpb25zIG1wdTQwMV9zeW50aF9wcm90byA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pZAkJPSAiTVBVNDAxIiwKKwkuaW5mbwkJPSBOVUxMLAorCS5taWRpX2Rldgk9IDAsCisJLnN5bnRoX3R5cGUJPSBTWU5USF9UWVBFX01JREksCisJLnN5bnRoX3N1YnR5cGUJPSAwLAorCS5vcGVuCQk9IG1wdV9zeW50aF9vcGVuLAorCS5jbG9zZQkJPSBtcHVfc3ludGhfY2xvc2UsCisJLmlvY3RsCQk9IG1wdV9zeW50aF9pb2N0bCwKKwkua2lsbF9ub3RlCT0gbWlkaV9zeW50aF9raWxsX25vdGUsCisJLnN0YXJ0X25vdGUJPSBtaWRpX3N5bnRoX3N0YXJ0X25vdGUsCisJLnNldF9pbnN0cgk9IG1pZGlfc3ludGhfc2V0X2luc3RyLAorCS5yZXNldAkJPSBtaWRpX3N5bnRoX3Jlc2V0LAorCS5od19jb250cm9sCT0gbWlkaV9zeW50aF9od19jb250cm9sLAorCS5sb2FkX3BhdGNoCT0gbWlkaV9zeW50aF9sb2FkX3BhdGNoLAorCS5hZnRlcnRvdWNoCT0gbWlkaV9zeW50aF9hZnRlcnRvdWNoLAorCS5jb250cm9sbGVyCT0gbWlkaV9zeW50aF9jb250cm9sbGVyLAorCS5wYW5uaW5nCT0gbWlkaV9zeW50aF9wYW5uaW5nLAorCS5iZW5kZXIJCT0gbWlkaV9zeW50aF9iZW5kZXIsCisJLnNldHVwX3ZvaWNlCT0gbWlkaV9zeW50aF9zZXR1cF92b2ljZSwKKwkuc2VuZF9zeXNleAk9IG1pZGlfc3ludGhfc2VuZF9zeXNleAorfTsKKworc3RhdGljIHN0cnVjdCBzeW50aF9vcGVyYXRpb25zICptcHU0MDFfc3ludGhfb3BlcmF0aW9uc1tNQVhfTUlESV9ERVZdOworCitzdGF0aWMgc3RydWN0IG1pZGlfb3BlcmF0aW9ucyBtcHU0MDFfbWlkaV9wcm90byA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pbmZvCQk9IHsiTVBVLTQwMSBNaWRpIiwgMCwgTUlESV9DQVBfTVBVNDAxLCBTTkRDQVJEX01QVTQwMX0sCisJLmluX2luZm8JPSB7MH0sCisJLm9wZW4JCT0gbXB1NDAxX29wZW4sCisJLmNsb3NlCQk9IG1wdTQwMV9jbG9zZSwKKwkuaW9jdGwJCT0gbXB1NDAxX2lvY3RsLAorCS5vdXRwdXRjCT0gbXB1NDAxX291dCwKKwkuc3RhcnRfcmVhZAk9IG1wdTQwMV9zdGFydF9yZWFkLAorCS5lbmRfcmVhZAk9IG1wdTQwMV9lbmRfcmVhZCwKKwkua2ljawkJPSBtcHU0MDFfa2ljaywKKwkuYnVmZmVyX3N0YXR1cwk9IG1wdTQwMV9idWZmZXJfc3RhdHVzLAorCS5wcmVmaXhfY21kCT0gbXB1NDAxX3ByZWZpeF9jbWQKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIG1wdTQwMV9taWRpX29wZXJhdGlvbnNbTUFYX01JRElfREVWXTsKKworc3RhdGljIHZvaWQgbXB1NDAxX2Noa192ZXJzaW9uKGludCBuLCBzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YykKK3sKKwlpbnQgdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZjLT52ZXJzaW9uID0gZGV2Yy0+cmV2aXNpb24gPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWlmICgodG1wID0gbXB1X2NtZChuLCAweEFDLCAwKSkgPCAwKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCXJldHVybjsKKwl9CisJaWYgKCh0bXAgJiAweGYwKSA+IDB4MjApCS8qIFdoeSBpdCdzIGxhcmdlciB0aGFuIDIueCA/Pz8gKi8KKwl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWRldmMtPnZlcnNpb24gPSB0bXA7CisKKwlpZiAoKHRtcCA9IG1wdV9jbWQobiwgMHhBRCwgMCkpIDwgMCkKKwl7CisJCWRldmMtPnZlcnNpb24gPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlkZXZjLT5yZXZpc2lvbiA9IHRtcDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworaW50IGF0dGFjaF9tcHU0MDEoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgcmV2aXNpb25fY2hhcjsKKworCWludCBtLCByZXQ7CisJc3RydWN0IG1wdV9jb25maWcgKmRldmM7CisKKwlod19jb25maWctPnNsb3RzWzFdID0gLTE7CisJbSA9IHNvdW5kX2FsbG9jX21pZGlkZXYoKTsKKwlpZiAobSA9PSAtMSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1QVS00MDE6IFRvbyBtYW55IG1pZGkgZGV2aWNlcyBkZXRlY3RlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VycjsKKwl9CisJZGV2YyA9ICZkZXZfY29uZlttXTsKKwlkZXZjLT5iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCWRldmMtPm9zcCA9IGh3X2NvbmZpZy0+b3NwOworCWRldmMtPmlycSA9IGh3X2NvbmZpZy0+aXJxOworCWRldmMtPm9wZW5lZCA9IDA7CisJZGV2Yy0+dWFydF9tb2RlID0gMDsKKwlkZXZjLT5pbml0aWFsaXplZCA9IDA7CisJZGV2Yy0+dmVyc2lvbiA9IDA7CisJZGV2Yy0+cmV2aXNpb24gPSAwOworCWRldmMtPmNhcGFiaWxpdGllcyA9IDA7CisJZGV2Yy0+dGltZXJfZmxhZyA9IDA7CisJZGV2Yy0+bV9idXN5ID0gMDsKKwlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwlkZXZjLT5zaGFyZWRfaXJxID0gaHdfY29uZmlnLT5hbHdheXNfZGV0ZWN0OworCWRldmMtPmlycSA9IGh3X2NvbmZpZy0+aXJxOworCXNwaW5fbG9ja19pbml0KCZkZXZjLT5sb2NrKTsKKworCWlmIChkZXZjLT5pcnEgPCAwKQorCXsKKwkJZGV2Yy0+aXJxICo9IC0xOworCQlkZXZjLT5zaGFyZWRfaXJxID0gMTsKKwl9CisKKwlpZiAoIWh3X2NvbmZpZy0+YWx3YXlzX2RldGVjdCkKKwl7CisJCS8qIFZlcmlmeSB0aGUgaGFyZHdhcmUgYWdhaW4gKi8KKwkJaWYgKCFyZXNldF9tcHU0MDEoZGV2YykpCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1wdTQwMTogRGV2aWNlIGRpZG4ndCByZXNwb25kXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dF9taWRpZGV2OworCQl9CisJCWlmICghZGV2Yy0+c2hhcmVkX2lycSkKKwkJeworCQkJaWYgKHJlcXVlc3RfaXJxKGRldmMtPmlycSwgbXB1aW50ciwgMCwgIm1wdTQwMSIsICh2b2lkICopbSkgPCAwKQorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1wdTQwMTogRmFpbGVkIHRvIGFsbG9jYXRlIElSUSVkXG4iLCBkZXZjLT5pcnEpOworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXRfbWlkaWRldjsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCW1wdTQwMV9jaGtfdmVyc2lvbihtLCBkZXZjKTsKKwkJaWYgKGRldmMtPnZlcnNpb24gPT0gMCkKKwkJCW1wdTQwMV9jaGtfdmVyc2lvbihtLCBkZXZjKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCX0KKworCWlmIChkZXZjLT52ZXJzaW9uICE9IDApCisJCWlmIChtcHVfY21kKG0sIDB4QzUsIDApID49IDApCS8qIFNldCB0aW1lYmFzZSBPSyAqLworCQkJaWYgKG1wdV9jbWQobSwgMHhFMCwgMTIwKSA+PSAwKQkJLyogU2V0IHRlbXBvIE9LICovCisJCQkJZGV2Yy0+Y2FwYWJpbGl0aWVzIHw9IE1QVV9DQVBfSU5UTEc7CS8qIFN1cHBvcnRzIGludGVsbGlnZW50IG1vZGUgKi8KKworCisJbXB1NDAxX3N5bnRoX29wZXJhdGlvbnNbbV0gPSAoc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyksIEdGUF9LRVJORUwpOworCisJaWYgKG1wdTQwMV9zeW50aF9vcGVyYXRpb25zW21dID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9FUlIgIm1wdTQwMTogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfaXJxOworCX0KKwlpZiAoIShkZXZjLT5jYXBhYmlsaXRpZXMgJiBNUFVfQ0FQX0lOVExHKSkJLyogTm8gaW50ZWxsaWdlbnQgbW9kZSAqLworCXsKKwkJbWVtY3B5KChjaGFyICopIG1wdTQwMV9zeW50aF9vcGVyYXRpb25zW21dLAorCQkJKGNoYXIgKikgJnN0ZF9taWRpX3N5bnRoLAorCQkJIHNpemVvZihzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucykpOworCX0KKwllbHNlCisJeworCQltZW1jcHkoKGNoYXIgKikgbXB1NDAxX3N5bnRoX29wZXJhdGlvbnNbbV0sCisJCQkoY2hhciAqKSAmbXB1NDAxX3N5bnRoX3Byb3RvLAorCQkJIHNpemVvZihzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucykpOworCX0KKwlpZiAob3duZXIpCisJCW1wdTQwMV9zeW50aF9vcGVyYXRpb25zW21dLT5vd25lciA9IG93bmVyOworCisJbWVtY3B5KChjaGFyICopICZtcHU0MDFfbWlkaV9vcGVyYXRpb25zW21dLAorCSAgICAgICAoY2hhciAqKSAmbXB1NDAxX21pZGlfcHJvdG8sCisJICAgICAgIHNpemVvZihzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSk7CisKKwltcHU0MDFfbWlkaV9vcGVyYXRpb25zW21dLmNvbnZlcnRlciA9IG1wdTQwMV9zeW50aF9vcGVyYXRpb25zW21dOworCisJbWVtY3B5KChjaGFyICopICZtcHVfc3ludGhfaW5mb1ttXSwKKwkgICAgICAgKGNoYXIgKikgJm1wdV9zeW50aF9pbmZvX3Byb3RvLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHN5bnRoX2luZm8pKTsKKworCW5fbXB1X2RldnMrKzsKKworCWlmIChkZXZjLT52ZXJzaW9uID09IDB4MjAgJiYgZGV2Yy0+cmV2aXNpb24gPj0gMHgwNykJLyogTXVzaWNRdWVzdCBpbnRlcmZhY2UgKi8KKwl7CisJCWludCBwb3J0cyA9IChkZXZjLT5yZXZpc2lvbiAmIDB4MDgpID8gMzIgOiAxNjsKKworCQlkZXZjLT5jYXBhYmlsaXRpZXMgfD0gTVBVX0NBUF9TWU5DIHwgTVBVX0NBUF9TTVBURSB8CisJCQkJTVBVX0NBUF9DTFMgfCBNUFVfQ0FQXzJQT1JUOworCisJCXJldmlzaW9uX2NoYXIgPSAoZGV2Yy0+cmV2aXNpb24gPT0gMHg3ZikgPyAnTScgOiAnICc7CisJCXNwcmludGYobXB1X3N5bnRoX2luZm9bbV0ubmFtZSwgIk1RWC0lZCVjIE1JREkgSW50ZXJmYWNlICMlZCIsCisJCQkJcG9ydHMsCisJCQkJcmV2aXNpb25fY2hhciwKKwkJCQluX21wdV9kZXZzKTsKKwl9CisJZWxzZQorCXsKKwkJcmV2aXNpb25fY2hhciA9IGRldmMtPnJldmlzaW9uID8gZGV2Yy0+cmV2aXNpb24gKyAnQCcgOiAnICc7CisJCWlmICgoaW50KSBkZXZjLT5yZXZpc2lvbiA+ICgnWicgLSAnQCcpKQorCQkJcmV2aXNpb25fY2hhciA9ICcrJzsKKworCQlkZXZjLT5jYXBhYmlsaXRpZXMgfD0gTVBVX0NBUF9TWU5DIHwgTVBVX0NBUF9GU0s7CisKKwkJaWYgKGh3X2NvbmZpZy0+bmFtZSkKKwkJCXNwcmludGYobXB1X3N5bnRoX2luZm9bbV0ubmFtZSwgIiVzIChNUFU0MDEpIiwgaHdfY29uZmlnLT5uYW1lKTsKKwkJZWxzZQorCQkJc3ByaW50ZihtcHVfc3ludGhfaW5mb1ttXS5uYW1lLAorCQkJCSJNUFUtNDAxICVkLiVkJWMgTWlkaSBpbnRlcmZhY2UgIyVkIiwKKwkJCQkoaW50KSAoZGV2Yy0+dmVyc2lvbiAmIDB4ZjApID4+IDQsCisJCQkJZGV2Yy0+dmVyc2lvbiAmIDB4MGYsCisJCQkJcmV2aXNpb25fY2hhciwKKwkJCQluX21wdV9kZXZzKTsKKwl9CisKKwlzdHJjcHkobXB1NDAxX21pZGlfb3BlcmF0aW9uc1ttXS5pbmZvLm5hbWUsCisJICAgICAgIG1wdV9zeW50aF9pbmZvW21dLm5hbWUpOworCisJY29uZl9wcmludGYobXB1X3N5bnRoX2luZm9bbV0ubmFtZSwgaHdfY29uZmlnKTsKKworCW1wdTQwMV9zeW50aF9vcGVyYXRpb25zW21dLT5taWRpX2RldiA9IGRldmMtPmRldm5vID0gbTsKKwltcHU0MDFfc3ludGhfb3BlcmF0aW9uc1tkZXZjLT5kZXZub10tPmluZm8gPSAmbXB1X3N5bnRoX2luZm9bZGV2Yy0+ZGV2bm9dOworCisJaWYgKGRldmMtPmNhcGFiaWxpdGllcyAmIE1QVV9DQVBfSU5UTEcpCQkvKiBJbnRlbGxpZ2VudCBtb2RlICovCisJCWh3X2NvbmZpZy0+c2xvdHNbMl0gPSBtcHVfdGltZXJfaW5pdChtKTsKKworCW1pZGlfZGV2c1ttXSA9ICZtcHU0MDFfbWlkaV9vcGVyYXRpb25zW2RldmMtPmRldm5vXTsKKwkKKwlpZiAob3duZXIpCisJCW1pZGlfZGV2c1ttXS0+b3duZXIgPSBvd25lcjsKKworCWh3X2NvbmZpZy0+c2xvdHNbMV0gPSBtOworCXNlcXVlbmNlcl9pbml0KCk7CisJCisJcmV0dXJuIDA7CisKK291dF9pcnE6CisJZnJlZV9pcnEoZGV2Yy0+aXJxLCAodm9pZCAqKW0pOworb3V0X21pZGlkZXY6CisJc291bmRfdW5sb2FkX21pZGlkZXYobSk7CitvdXRfZXJyOgorCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZXNldF9tcHU0MDEoc3RydWN0IG1wdV9jb25maWcgKmRldmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2ssIHRpbWVvdXQsIG47CisJaW50IHRpbWVvdXRfbGltaXQ7CisKKwkvKgorCSAqIFNlbmQgdGhlIFJFU0VUIGNvbW1hbmQuIFRyeSBhZ2FpbiBpZiBubyBzdWNjZXNzIGF0IHRoZSBmaXJzdCB0aW1lLgorCSAqIChJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBVQVJUIG1vZGUsIGl0IHdpbGwgbm90IGFjayB0aGUgcmVzZXQgY21kKS4KKwkgKi8KKworCW9rID0gMDsKKworCXRpbWVvdXRfbGltaXQgPSBkZXZjLT5pbml0aWFsaXplZCA/IDMwMDAwIDogMTAwMDAwOworCWRldmMtPmluaXRpYWxpemVkID0gMTsKKworCWZvciAobiA9IDA7IG4gPCAyICYmICFvazsgbisrKQorCXsKKwkJZm9yICh0aW1lb3V0ID0gdGltZW91dF9saW1pdDsgdGltZW91dCA+IDAgJiYgIW9rOyB0aW1lb3V0LS0pCisJCQkgIG9rID0gb3V0cHV0X3JlYWR5KGRldmMpOworCisJCXdyaXRlX2NvbW1hbmQoZGV2YywgTVBVX1JFU0VUKTsJLyoKKwkJCQkJCQkgICAqIFNlbmQgTVBVLTQwMSBSRVNFVCBDb21tYW5kCisJCQkJCQkJICovCisKKwkJLyoKKwkJICogV2FpdCBhdCBsZWFzdCAyNSBtc2VjLiBUaGlzIG1ldGhvZCBpcyBub3QgYWNjdXJhdGUgc28gbGV0J3MgbWFrZSB0aGUKKwkJICogbG9vcCBiaXQgbG9uZ2VyLiBDYW5ub3Qgc2xlZXAgc2luY2UgdGhpcyBpcyBjYWxsZWQgZHVyaW5nIGJvb3QuCisJCSAqLworCisJCWZvciAodGltZW91dCA9IHRpbWVvdXRfbGltaXQgKiAyOyB0aW1lb3V0ID4gMCAmJiAhb2s7IHRpbWVvdXQtLSkKKwkJeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQkJaWYgKGlucHV0X2F2YWlsKGRldmMpKQorCQkJCWlmIChyZWFkX2RhdGEoZGV2YykgPT0gTVBVX0FDSykKKwkJCQkJb2sgPSAxOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCX0KKworCX0KKworCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCWRldmMtPm1fcHRyID0gMDsKKwlkZXZjLT5tX2xlZnQgPSAwOworCWRldmMtPmxhc3Rfc3RhdHVzID0gMDsKKwlkZXZjLT51YXJ0X21vZGUgPSAwOworCisJcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBzZXRfdWFydF9tb2RlKGludCBkZXYsIHN0cnVjdCBtcHVfY29uZmlnICpkZXZjLCBpbnQgYXJnKQoreworCWlmICghYXJnICYmIChkZXZjLT5jYXBhYmlsaXRpZXMgJiBNUFVfQ0FQX0lOVExHKSkKKwkJcmV0dXJuOworCWlmICgoZGV2Yy0+dWFydF9tb2RlID09IDApID09IChhcmcgPT0gMCkpCisJCXJldHVybjsJCS8qIEFscmVhZHkgc2V0ICovCisJcmVzZXRfbXB1NDAxKGRldmMpOwkvKiBUaGlzIGV4aXRzIHRoZSB1YXJ0IG1vZGUgKi8KKworCWlmIChhcmcpCisJeworCQlpZiAobXB1X2NtZChkZXYsIFVBUlRfTU9ERV9PTiwgMCkgPCAwKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIm1wdTQwMTogQ2FuJ3QgZW50ZXIgVUFSVCBtb2RlXG4iKTsKKwkJCWRldmMtPnVhcnRfbW9kZSA9IDA7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZGV2Yy0+dWFydF9tb2RlID0gYXJnOworCit9CisKK2ludCBwcm9iZV9tcHU0MDEoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzKQoreworCWludCBvayA9IDA7CisJc3RydWN0IG1wdV9jb25maWcgdG1wX2RldmM7CisKKwl0bXBfZGV2Yy5iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCXRtcF9kZXZjLmlycSA9IGh3X2NvbmZpZy0+aXJxOworCXRtcF9kZXZjLmluaXRpYWxpemVkID0gMDsKKwl0bXBfZGV2Yy5vcGVuZWQgPSAwOworCXRtcF9kZXZjLm9zcCA9IGh3X2NvbmZpZy0+b3NwOworCisJaWYgKGh3X2NvbmZpZy0+YWx3YXlzX2RldGVjdCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoaW5iKGh3X2NvbmZpZy0+aW9fYmFzZSArIDEpID09IDB4ZmYpCisJeworCQlEREIocHJpbnRrKCJNUFU0MDE6IFBvcnQgJXggbG9va3MgZGVhZC5cbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSkpOworCQlyZXR1cm4gMDsJLyogSnVzdCBidXMgZmxvYXQ/ICovCisJfQorCW9rID0gcmVzZXRfbXB1NDAxKCZ0bXBfZGV2Yyk7CisKKwlpZiAoIW9rKQorCXsKKwkJRERCKHByaW50aygiTVBVNDAxOiBSZXNldCBmYWlsZWQgb24gcG9ydCAleFxuIiwgaHdfY29uZmlnLT5pb19iYXNlKSk7CisJfQorCXJldHVybiBvazsKK30KKwordm9pZCB1bmxvYWRfbXB1NDAxKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwl2b2lkICpwOworCWludCBuPWh3X2NvbmZpZy0+c2xvdHNbMV07CisJCQorCWlmIChuICE9IC0xKSB7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMik7CisJCWlmIChod19jb25maWctPmFsd2F5c19kZXRlY3QgPT0gMCAmJiBod19jb25maWctPmlycSA+IDApCisJCQlmcmVlX2lycShod19jb25maWctPmlycSwgKHZvaWQgKiluKTsKKwkJcD1tcHU0MDFfc3ludGhfb3BlcmF0aW9uc1tuXTsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYobik7CisJCXNvdW5kX3VubG9hZF90aW1lcmRldihod19jb25maWctPnNsb3RzWzJdKTsKKwkJaWYocCkKKwkJCWtmcmVlKHApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIFRpbWVyIHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvbGF0aWxlIGludCB0aW1lcl9pbml0aWFsaXplZCA9IDAsIHRpbWVyX29wZW4gPSAwLCB0bXJfcnVubmluZyA9IDA7CitzdGF0aWMgdm9sYXRpbGUgaW50IGN1cnJfdGVtcG8sIGN1cnJfdGltZWJhc2UsIGh3X3RpbWViYXNlOworc3RhdGljIGludCAgICAgIG1heF90aW1lYmFzZSA9IDg7CS8qIDgqMjQ9MTkyIHBwcW4gKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIG5leHRfZXZlbnRfdGltZTsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGN1cnJfdGlja3MsIGN1cnJfY2xvY2tzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9ldmVudF90aW1lOworc3RhdGljIGludCAgICAgIG1ldHJvbm9tZV9tb2RlOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbG9ja3MydGlja3ModW5zaWduZWQgbG9uZyBjbG9ja3MpCit7CisJLyoKKwkgKiBUaGUgTVBVLTQwMSBzdXBwb3J0cyBqdXN0IGEgbGltaXRlZCBzZXQgb2YgcG9zc2libGUgdGltZWJhc2UgdmFsdWVzLgorCSAqIFNpbmNlIHRoZSBhcHBsaWNhdGlvbnMgcmVxdWlyZSBtb3JlIGNob2ljZXMsIHRoZSBkcml2ZXIgaGFzIHRvCisJICogcHJvZ3JhbSB0aGUgSFcgdG8gZG8gaXRzIGJlc3QgYW5kIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgSFcgYW5kCisJICogYWN0dWFsIHRpbWViYXNlcy4KKwkgKi8KKwlyZXR1cm4gKChjbG9ja3MgKiBjdXJyX3RpbWViYXNlKSArIChod190aW1lYmFzZSAvIDIpKSAvIGh3X3RpbWViYXNlOworfQorCitzdGF0aWMgdm9pZCBzZXRfdGltZWJhc2UoaW50IG1pZGlfZGV2LCBpbnQgdmFsKQoreworCWludCBod192YWw7CisKKwlpZiAodmFsIDwgNDgpCisJCXZhbCA9IDQ4OworCWlmICh2YWwgPiAxMDAwKQorCQl2YWwgPSAxMDAwOworCisJaHdfdmFsID0gdmFsOworCWh3X3ZhbCA9IChod192YWwgKyAxMikgLyAyNDsKKwlpZiAoaHdfdmFsID4gbWF4X3RpbWViYXNlKQorCQlod192YWwgPSBtYXhfdGltZWJhc2U7CisKKwlpZiAobXB1X2NtZChtaWRpX2RldiwgMHhDMCB8IChod192YWwgJiAweDBmKSwgMCkgPCAwKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBDYW4ndCBzZXQgSFcgdGltZWJhc2UgdG8gJWRcbiIsIGh3X3ZhbCAqIDI0KTsKKwkJcmV0dXJuOworCX0KKwlod190aW1lYmFzZSA9IGh3X3ZhbCAqIDI0OworCWN1cnJfdGltZWJhc2UgPSB2YWw7CisKK30KKworc3RhdGljIHZvaWQgdG1yX3Jlc2V0KHN0cnVjdCBtcHVfY29uZmlnICpkZXZjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJbmV4dF9ldmVudF90aW1lID0gKHVuc2lnbmVkIGxvbmcpIC0xOworCXByZXZfZXZlbnRfdGltZSA9IDA7CisJY3Vycl90aWNrcyA9IGN1cnJfY2xvY2tzID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3RpbWVyX21vZGUoaW50IG1pZGlfZGV2KQoreworCWlmICh0aW1lcl9tb2RlICYgVE1SX01PREVfQ0xTKQorCQltcHVfY21kKG1pZGlfZGV2LCAweDNjLCAwKTsJLyogVXNlIENMUyBzeW5jICovCisJZWxzZSBpZiAodGltZXJfbW9kZSAmIFRNUl9NT0RFX1NNUFRFKQorCQltcHVfY21kKG1pZGlfZGV2LCAweDNkLCAwKTsJLyogVXNlIFNNUFRFIHN5bmMgKi8KKworCWlmICh0aW1lcl9tb2RlICYgVE1SX0lOVEVSTkFMKQorCXsKKwkJICBtcHVfY21kKG1pZGlfZGV2LCAweDgwLCAwKTsJLyogVXNlIE1JREkgc3luYyAqLworCX0KKwllbHNlCisJeworCQlpZiAodGltZXJfbW9kZSAmIChUTVJfTU9ERV9NSURJIHwgVE1SX01PREVfQ0xTKSkKKwkJeworCQkJbXB1X2NtZChtaWRpX2RldiwgMHg4MiwgMCk7CQkvKiBVc2UgTUlESSBzeW5jICovCisJCQltcHVfY21kKG1pZGlfZGV2LCAweDkxLCAwKTsJCS8qIEVuYWJsZSBleHQgTUlESSBjdHJsICovCisJCX0KKwkJZWxzZSBpZiAodGltZXJfbW9kZSAmIFRNUl9NT0RFX0ZTSykKKwkJCW1wdV9jbWQobWlkaV9kZXYsIDB4ODEsIDApOwkvKiBVc2UgRlNLIHN5bmMgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BfbWV0cm9ub21lKGludCBtaWRpX2RldikKK3sKKwltcHVfY21kKG1pZGlfZGV2LCAweDg0LCAwKTsJLyogRGlzYWJsZSBtZXRyb25vbWUgKi8KK30KKworc3RhdGljIHZvaWQgc2V0dXBfbWV0cm9ub21lKGludCBtaWRpX2RldikKK3sKKwlpbnQgbnVtZXJhdG9yLCBkZW5vbWluYXRvcjsKKwlpbnQgY2xrc19wZXJfY2xpY2ssIG51bV8zMm5kc19wZXJfYmVhdDsKKwlpbnQgYmVhdHNfcGVyX21lYXN1cmU7CisKKwludW1lcmF0b3IgPSAoKHVuc2lnbmVkKSBtZXRyb25vbWVfbW9kZSA+PiAyNCkgJiAweGZmOworCWRlbm9taW5hdG9yID0gKCh1bnNpZ25lZCkgbWV0cm9ub21lX21vZGUgPj4gMTYpICYgMHhmZjsKKwljbGtzX3Blcl9jbGljayA9ICgodW5zaWduZWQpIG1ldHJvbm9tZV9tb2RlID4+IDgpICYgMHhmZjsKKwludW1fMzJuZHNfcGVyX2JlYXQgPSAodW5zaWduZWQpIG1ldHJvbm9tZV9tb2RlICYgMHhmZjsKKwliZWF0c19wZXJfbWVhc3VyZSA9IChudW1lcmF0b3IgKiA0KSA+PiBkZW5vbWluYXRvcjsKKworCWlmICghbWV0cm9ub21lX21vZGUpCisJCW1wdV9jbWQobWlkaV9kZXYsIDB4ODQsIDApOwkvKiBEaXNhYmxlIG1ldHJvbm9tZSAqLworCWVsc2UKKwl7CisJCW1wdV9jbWQobWlkaV9kZXYsIDB4RTQsIGNsa3NfcGVyX2NsaWNrKTsKKwkJbXB1X2NtZChtaWRpX2RldiwgMHhFNiwgYmVhdHNfcGVyX21lYXN1cmUpOworCQltcHVfY21kKG1pZGlfZGV2LCAweDgzLCAwKTsJLyogRW5hYmxlIG1ldHJvbm9tZSB3aXRob3V0IGFjY2VudHMgKi8KKwl9Cit9CisKK3N0YXRpYyBpbnQgbXB1X3N0YXJ0X3RpbWVyKGludCBtaWRpX2RldikKK3sKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2Yz0gJmRldl9jb25mW21pZGlfZGV2XTsKKworCXRtcl9yZXNldChkZXZjKTsKKwlzZXRfdGltZXJfbW9kZShtaWRpX2Rldik7CisKKwlpZiAodG1yX3J1bm5pbmcpCisJCXJldHVybiBUSU1FUl9OT1RfQVJNRUQ7CQkvKiBBbHJlYWR5IHJ1bm5pbmcgKi8KKworCWlmICh0aW1lcl9tb2RlICYgVE1SX0lOVEVSTkFMKQorCXsKKwkJbXB1X2NtZChtaWRpX2RldiwgMHgwMiwgMCk7CS8qIFNlbmQgTUlESSBzdGFydCAqLworCQl0bXJfcnVubmluZyA9IDE7CisJCXJldHVybiBUSU1FUl9OT1RfQVJNRUQ7CisJfQorCWVsc2UKKwl7CisJCW1wdV9jbWQobWlkaV9kZXYsIDB4MzUsIDApOwkvKiBFbmFibGUgbW9kZSBtZXNzYWdlcyB0byBQQyAqLworCQltcHVfY21kKG1pZGlfZGV2LCAweDM4LCAwKTsJLyogRW5hYmxlIHN5cyBjb21tb24gbWVzc2FnZXMgdG8gUEMgKi8KKwkJbXB1X2NtZChtaWRpX2RldiwgMHgzOSwgMCk7CS8qIEVuYWJsZSByZWFsIHRpbWUgbWVzc2FnZXMgdG8gUEMgKi8KKwkJbXB1X2NtZChtaWRpX2RldiwgMHg5NywgMCk7CS8qIEVuYWJsZSBzeXN0ZW0gZXhjbHVzaXZlIG1lc3NhZ2VzIHRvIFBDICovCisJfQorCXJldHVybiBUSU1FUl9BUk1FRDsKK30KKworc3RhdGljIGludCBtcHVfdGltZXJfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlpbnQgbWlkaV9kZXYgPSBzb3VuZF90aW1lcl9kZXZzW2Rldl0tPmRldmxpbms7CisJc3RydWN0IG1wdV9jb25maWcgKmRldmM9ICZkZXZfY29uZlttaWRpX2Rldl07CisKKwlpZiAodGltZXJfb3BlbikKKwkJcmV0dXJuIC1FQlVTWTsKKworCXRtcl9yZXNldChkZXZjKTsKKwljdXJyX3RlbXBvID0gNTA7CisJbXB1X2NtZChtaWRpX2RldiwgMHhFMCwgNTApOworCWN1cnJfdGltZWJhc2UgPSBod190aW1lYmFzZSA9IDEyMDsKKwlzZXRfdGltZWJhc2UobWlkaV9kZXYsIDEyMCk7CisJdGltZXJfb3BlbiA9IDE7CisJbWV0cm9ub21lX21vZGUgPSAwOworCXNldF90aW1lcl9tb2RlKG1pZGlfZGV2KTsKKworCW1wdV9jbWQobWlkaV9kZXYsIDB4ZTcsIDB4MDQpOwkvKiBTZW5kIGFsbCBjbG9ja3MgdG8gaG9zdCAqLworCW1wdV9jbWQobWlkaV9kZXYsIDB4OTUsIDApOwkvKiBFbmFibGUgY2xvY2sgdG8gaG9zdCAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1wdV90aW1lcl9jbG9zZShpbnQgZGV2KQoreworCWludCBtaWRpX2RldiA9IHNvdW5kX3RpbWVyX2RldnNbZGV2XS0+ZGV2bGluazsKKworCXRpbWVyX29wZW4gPSB0bXJfcnVubmluZyA9IDA7CisJbXB1X2NtZChtaWRpX2RldiwgMHgxNSwgMCk7CS8qIFN0b3AgYWxsICovCisJbXB1X2NtZChtaWRpX2RldiwgMHg5NCwgMCk7CS8qIERpc2FibGUgY2xvY2sgdG8gaG9zdCAqLworCW1wdV9jbWQobWlkaV9kZXYsIDB4OGMsIDApOwkvKiBEaXNhYmxlIG1lYXN1cmUgZW5kIG1lc3NhZ2VzIHRvIGhvc3QgKi8KKwlzdG9wX21ldHJvbm9tZShtaWRpX2Rldik7Cit9CisKK3N0YXRpYyBpbnQgbXB1X3RpbWVyX2V2ZW50KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KQoreworCXVuc2lnbmVkIGNoYXIgY29tbWFuZCA9IGV2ZW50WzFdOworCXVuc2lnbmVkIGxvbmcgcGFybSA9ICoodW5zaWduZWQgaW50ICopICZldmVudFs0XTsKKwlpbnQgbWlkaV9kZXYgPSBzb3VuZF90aW1lcl9kZXZzW2Rldl0tPmRldmxpbms7CisKKwlzd2l0Y2ggKGNvbW1hbmQpCisJeworCQljYXNlIFRNUl9XQUlUX1JFTDoKKwkJCXBhcm0gKz0gcHJldl9ldmVudF90aW1lOworCQljYXNlIFRNUl9XQUlUX0FCUzoKKwkJCWlmIChwYXJtID4gMCkKKwkJCXsKKwkJCQlsb25nIHRpbWU7CisKKwkJCQlpZiAocGFybSA8PSBjdXJyX3RpY2tzKQkvKiBJdCdzIHRoZSB0aW1lICovCisJCQkJCXJldHVybiBUSU1FUl9OT1RfQVJNRUQ7CisJCQkJdGltZSA9IHBhcm07CisJCQkJbmV4dF9ldmVudF90aW1lID0gcHJldl9ldmVudF90aW1lID0gdGltZTsKKworCQkJCXJldHVybiBUSU1FUl9BUk1FRDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVE1SX1NUQVJUOgorCQkJaWYgKHRtcl9ydW5uaW5nKQorCQkJCWJyZWFrOworCQkJcmV0dXJuIG1wdV9zdGFydF90aW1lcihtaWRpX2Rldik7CisKKwkJY2FzZSBUTVJfU1RPUDoKKwkJCW1wdV9jbWQobWlkaV9kZXYsIDB4MDEsIDApOwkvKiBTZW5kIE1JREkgc3RvcCAqLworCQkJc3RvcF9tZXRyb25vbWUobWlkaV9kZXYpOworCQkJdG1yX3J1bm5pbmcgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfQ09OVElOVUU6CisJCQlpZiAodG1yX3J1bm5pbmcpCisJCQkJYnJlYWs7CisJCQltcHVfY21kKG1pZGlfZGV2LCAweDAzLCAwKTsJLyogU2VuZCBNSURJIGNvbnRpbnVlICovCisJCQlzZXR1cF9tZXRyb25vbWUobWlkaV9kZXYpOworCQkJdG1yX3J1bm5pbmcgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfVEVNUE86CisJCQlpZiAocGFybSkKKwkJCXsKKwkJCQlpZiAocGFybSA8IDgpCisJCQkJCXBhcm0gPSA4OworCQkJIAlpZiAocGFybSA+IDI1MCkKKwkJCQkJcGFybSA9IDI1MDsKKwkJCQlpZiAobXB1X2NtZChtaWRpX2RldiwgMHhFMCwgcGFybSkgPCAwKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtcHU0MDE6IENhbid0IHNldCB0ZW1wbyB0byAlZFxuIiwgKGludCkgcGFybSk7CisJCQkJY3Vycl90ZW1wbyA9IHBhcm07CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRNUl9FQ0hPOgorCQkJc2VxX2NvcHlfdG9faW5wdXQoZXZlbnQsIDgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfVElNRVNJRzoKKwkJCWlmIChtZXRyb25vbWVfbW9kZSkJLyogTWV0cm9ub21lIGVuYWJsZWQgKi8KKwkJCXsKKwkJCQltZXRyb25vbWVfbW9kZSA9IHBhcm07CisJCQkJc2V0dXBfbWV0cm9ub21lKG1pZGlfZGV2KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6OworCX0KKwlyZXR1cm4gVElNRVJfTk9UX0FSTUVEOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtcHVfdGltZXJfZ2V0X3RpbWUoaW50IGRldikKK3sKKwlpZiAoIXRpbWVyX29wZW4pCisJCXJldHVybiAwOworCisJcmV0dXJuIGN1cnJfdGlja3M7Cit9CisKK3N0YXRpYyBpbnQgbXB1X3RpbWVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjb21tYW5kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWludCBtaWRpX2RldiA9IHNvdW5kX3RpbWVyX2RldnNbZGV2XS0+ZGV2bGluazsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNvbW1hbmQpCisJeworCQljYXNlIFNORENUTF9UTVJfU09VUkNFOgorCQkJeworCQkJCWludCBwYXJtOworCisJCQkJaWYgKGdldF91c2VyKHBhcm0sIHApKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlwYXJtICY9IHRpbWVyX2NhcHM7CisKKwkJCQlpZiAocGFybSAhPSAwKQorCQkJCXsKKwkJCQkJdGltZXJfbW9kZSA9IHBhcm07CisJCisJCQkJCWlmICh0aW1lcl9tb2RlICYgVE1SX01PREVfQ0xTKQorCQkJCQkJbXB1X2NtZChtaWRpX2RldiwgMHgzYywgMCk7CQkvKiBVc2UgQ0xTIHN5bmMgKi8KKwkJCQkJZWxzZSBpZiAodGltZXJfbW9kZSAmIFRNUl9NT0RFX1NNUFRFKQorCQkJCQkJbXB1X2NtZChtaWRpX2RldiwgMHgzZCwgMCk7CQkvKiBVc2UgU01QVEUgc3luYyAqLworCQkJCX0KKwkJCQlpZiAocHV0X3VzZXIodGltZXJfbW9kZSwgcCkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXJldHVybiB0aW1lcl9tb2RlOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfVE1SX1NUQVJUOgorCQkJbXB1X3N0YXJ0X3RpbWVyKG1pZGlfZGV2KTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1RNUl9TVE9QOgorCQkJdG1yX3J1bm5pbmcgPSAwOworCQkJbXB1X2NtZChtaWRpX2RldiwgMHgwMSwgMCk7CS8qIFNlbmQgTUlESSBzdG9wICovCisJCQlzdG9wX21ldHJvbm9tZShtaWRpX2Rldik7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9UTVJfQ09OVElOVUU6CisJCQlpZiAodG1yX3J1bm5pbmcpCisJCQkJcmV0dXJuIDA7CisJCQl0bXJfcnVubmluZyA9IDE7CisJCQltcHVfY21kKG1pZGlfZGV2LCAweDAzLCAwKTsJLyogU2VuZCBNSURJIGNvbnRpbnVlICovCisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9UTVJfVElNRUJBU0U6CisJCQl7CisJCQkJaW50IHZhbDsKKwkJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKHZhbCkKKwkJCQkJc2V0X3RpbWViYXNlKG1pZGlfZGV2LCB2YWwpOworCQkJCWlmIChwdXRfdXNlcihjdXJyX3RpbWViYXNlLCBwKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmV0dXJuIGN1cnJfdGltZWJhc2U7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9UTVJfVEVNUE86CisJCQl7CisJCQkJaW50IHZhbDsKKwkJCQlpbnQgcmV0OworCisJCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJaWYgKHZhbCkKKwkJCQl7CisJCQkJCWlmICh2YWwgPCA4KQorCQkJCQkJdmFsID0gODsKKwkJCQkJaWYgKHZhbCA+IDI1MCkKKwkJCQkJCXZhbCA9IDI1MDsKKwkJCQkJaWYgKChyZXQgPSBtcHVfY21kKG1pZGlfZGV2LCAweEUwLCB2YWwpKSA8IDApCisJCQkJCXsKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1wdTQwMTogQ2FuJ3Qgc2V0IHRlbXBvIHRvICVkXG4iLCAoaW50KSB2YWwpOworCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJfQorCQkJCQljdXJyX3RlbXBvID0gdmFsOworCQkJCX0KKwkJCQlpZiAocHV0X3VzZXIoY3Vycl90ZW1wbywgcCkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXJldHVybiBjdXJyX3RlbXBvOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfU0VRX0NUUkxSQVRFOgorCQkJeworCQkJCWludCB2YWw7CisJCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJaWYgKHZhbCAhPSAwKQkJLyogQ2FuJ3QgY2hhbmdlICovCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCXZhbCA9ICgoY3Vycl90ZW1wbyAqIGN1cnJfdGltZWJhc2UpICsgMzApLzYwOworCQkJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlyZXR1cm4gdmFsOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfU0VRX0dFVFRJTUU6CisJCQlpZiAocHV0X3VzZXIoY3Vycl90aWNrcywgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gY3Vycl90aWNrczsKKworCQljYXNlIFNORENUTF9UTVJfTUVUUk9OT01FOgorCQkJaWYgKGdldF91c2VyKG1ldHJvbm9tZV9tb2RlLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNldHVwX21ldHJvbm9tZShtaWRpX2Rldik7CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OjsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIG1wdV90aW1lcl9hcm0oaW50IGRldiwgbG9uZyB0aW1lKQoreworCWlmICh0aW1lIDwgMCkKKwkJdGltZSA9IGN1cnJfdGlja3MgKyAxOworCWVsc2UgaWYgKHRpbWUgPD0gY3Vycl90aWNrcykJLyogSXQncyB0aGUgdGltZSAqLworCQlyZXR1cm47CisJbmV4dF9ldmVudF90aW1lID0gcHJldl9ldmVudF90aW1lID0gdGltZTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc291bmRfdGltZXJfb3BlcmF0aW9ucyBtcHVfdGltZXIgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7Ik1QVS00MDEgVGltZXIiLCAwfSwKKwkucHJpb3JpdHkJPSAxMCwJLyogUHJpb3JpdHkgKi8KKwkuZGV2bGluawk9IDAsCS8qIExvY2FsIGRldmljZSBsaW5rICovCisJLm9wZW4JCT0gbXB1X3RpbWVyX29wZW4sCisJLmNsb3NlCQk9IG1wdV90aW1lcl9jbG9zZSwKKwkuZXZlbnQJCT0gbXB1X3RpbWVyX2V2ZW50LAorCS5nZXRfdGltZQk9IG1wdV90aW1lcl9nZXRfdGltZSwKKwkuaW9jdGwJCT0gbXB1X3RpbWVyX2lvY3RsLAorCS5hcm1fdGltZXIJPSBtcHVfdGltZXJfYXJtCit9OworCitzdGF0aWMgdm9pZCBtcHVfdGltZXJfaW50ZXJydXB0KHZvaWQpCit7CisJaWYgKCF0aW1lcl9vcGVuKQorCQlyZXR1cm47CisKKwlpZiAoIXRtcl9ydW5uaW5nKQorCQlyZXR1cm47CisKKwljdXJyX2Nsb2NrcysrOworCWN1cnJfdGlja3MgPSBjbG9ja3MydGlja3MoY3Vycl9jbG9ja3MpOworCisJaWYgKGN1cnJfdGlja3MgPj0gbmV4dF9ldmVudF90aW1lKQorCXsKKwkJbmV4dF9ldmVudF90aW1lID0gKHVuc2lnbmVkIGxvbmcpIC0xOworCQlzZXF1ZW5jZXJfdGltZXIoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0aW1lcl9leHRfZXZlbnQoc3RydWN0IG1wdV9jb25maWcgKmRldmMsIGludCBldmVudCwgaW50IHBhcm0pCit7CisJaW50IG1pZGlfZGV2ID0gZGV2Yy0+ZGV2bm87CisKKwlpZiAoIWRldmMtPnRpbWVyX2ZsYWcpCisJCXJldHVybjsKKworCXN3aXRjaCAoZXZlbnQpCisJeworCQljYXNlIFRNUl9DTE9DSzoKKwkJCXByaW50aygiPE1JREkgY2xrPiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfU1RBUlQ6CisJCQlwcmludGsoIkV4dCBNSURJIHN0YXJ0XG4iKTsKKwkJCWlmICghdG1yX3J1bm5pbmcpCisJCQl7CisJCQkJaWYgKHRpbWVyX21vZGUgJiBUTVJfRVhURVJOQUwpCisJCQkJeworCQkJCQl0bXJfcnVubmluZyA9IDE7CisJCQkJCXNldHVwX21ldHJvbm9tZShtaWRpX2Rldik7CisJCQkJCW5leHRfZXZlbnRfdGltZSA9IDA7CisJCQkJCVNUT1JFKFNFUV9TVEFSVF9USU1FUigpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRNUl9TVE9QOgorCQkJcHJpbnRrKCJFeHQgTUlESSBzdG9wXG4iKTsKKwkJCWlmICh0aW1lcl9tb2RlICYgVE1SX0VYVEVSTkFMKQorCQkJeworCQkJCXRtcl9ydW5uaW5nID0gMDsKKwkJCQlzdG9wX21ldHJvbm9tZShtaWRpX2Rldik7CisJCQkJU1RPUkUoU0VRX1NUT1BfVElNRVIoKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRNUl9DT05USU5VRToKKwkJCXByaW50aygiRXh0IE1JREkgY29udGludWVcbiIpOworCQkJaWYgKHRpbWVyX21vZGUgJiBUTVJfRVhURVJOQUwpCisJCQl7CisJCQkJdG1yX3J1bm5pbmcgPSAxOworCQkJCXNldHVwX21ldHJvbm9tZShtaWRpX2Rldik7CisJCQkJU1RPUkUoU0VRX0NPTlRJTlVFX1RJTUVSKCkpOworCQkgIAl9CisJCSAgCWJyZWFrOworCisJCWNhc2UgVE1SX1NQUDoKKwkJCXByaW50aygiU29uZ3BvczogJWRcbiIsIHBhcm0pOworCQkJaWYgKHRpbWVyX21vZGUgJiBUTVJfRVhURVJOQUwpCisJCQl7CisJCQkJU1RPUkUoU0VRX1NPTkdQT1MocGFybSkpOworCQkJfQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IG1wdV90aW1lcl9pbml0KGludCBtaWRpX2RldikKK3sKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YzsKKwlpbnQgbjsKKworCWRldmMgPSAmZGV2X2NvbmZbbWlkaV9kZXZdOworCisJaWYgKHRpbWVyX2luaXRpYWxpemVkKQorCQlyZXR1cm4gLTE7CS8qIFRoZXJlIGlzIGFscmVhZHkgYSBzaW1pbGFyIHRpbWVyICovCisKKwl0aW1lcl9pbml0aWFsaXplZCA9IDE7CisKKwltcHVfdGltZXIuZGV2bGluayA9IG1pZGlfZGV2OworCWRldl9jb25mW21pZGlfZGV2XS50aW1lcl9mbGFnID0gMTsKKworCW4gPSBzb3VuZF9hbGxvY190aW1lcmRldigpOworCWlmIChuID09IC0xKQorCQluID0gMDsKKwlzb3VuZF90aW1lcl9kZXZzW25dID0gJm1wdV90aW1lcjsKKworCWlmIChkZXZjLT52ZXJzaW9uIDwgMHgyMCkJLyogT3JpZ2luYWwgTVBVLTQwMSAqLworCQl0aW1lcl9jYXBzID0gVE1SX0lOVEVSTkFMIHwgVE1SX0VYVEVSTkFMIHwgVE1SX01PREVfRlNLIHwgVE1SX01PREVfTUlESTsKKwllbHNlCisJeworCQkvKgorCQkgKiBUaGUgdmVyc2lvbiBudW1iZXIgMi4wIGlzIHVzZWQgKGF0IGxlYXN0KSBieSB0aGUKKwkJICogTXVzaWNRdWVzdCBjYXJkcyBhbmQgdGhlIFJvbGFuZCBTdXBlci1NUFUuCisJCSAqCisJCSAqIE11c2ljUXVlc3QgaGFzIGdpdmVuIGEgc3BlY2lhbCBtZWFuaW5nIHRvIHRoZSBiaXRzIG9mIHRoZQorCQkgKiByZXZpc2lvbiBudW1iZXIuIFRoZSBTdXBlci1NUFUgcmV0dXJucyAwLgorCQkgKi8KKworCQlpZiAoZGV2Yy0+cmV2aXNpb24pCisJCQl0aW1lcl9jYXBzIHw9IFRNUl9FWFRFUk5BTCB8IFRNUl9NT0RFX01JREk7CisKKwkJaWYgKGRldmMtPnJldmlzaW9uICYgMHgwMikKKwkJCXRpbWVyX2NhcHMgfD0gVE1SX01PREVfQ0xTOworCisKKwkJaWYgKGRldmMtPnJldmlzaW9uICYgMHg0MCkKKwkJCW1heF90aW1lYmFzZSA9IDEwOwkvKiBIYXMgdGhlIDIxNiBhbmQgMjQwIHBwcW4gbW9kZXMgKi8KKwl9CisKKwl0aW1lcl9tb2RlID0gKFRNUl9JTlRFUk5BTCB8IFRNUl9NT0RFX01JREkpICYgdGltZXJfY2FwczsKKwlyZXR1cm4gbjsKKworfQorCitFWFBPUlRfU1lNQk9MKHByb2JlX21wdTQwMSk7CitFWFBPUlRfU1lNQk9MKGF0dGFjaF9tcHU0MDEpOworRVhQT1JUX1NZTUJPTCh1bmxvYWRfbXB1NDAxKTsKK0VYUE9SVF9TWU1CT0woaW50Y2hrX21wdTQwMSk7CitFWFBPUlRfU1lNQk9MKG1wdWludHIpOworCitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7CisKK3N0YXRpYyBpbnQgaW8gPSAtMTsKK3N0YXRpYyBpbnQgaXJxID0gLTE7CisKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbXB1NDAxKHZvaWQpCit7CisJaW50IHJldDsKKwkvKiBDYW4gYmUgbG9hZGVkIGVpdGhlciBmb3IgbW9kdWxlIHVzZSBvciB0byBwcm92aWRlIGZ1bmN0aW9ucworCSAgIHRvIG90aGVycyAqLworCWlmIChpbyAhPSAtMSAmJiBpcnEgIT0gLTEpIHsKKwkJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwkgICAgICAgIGNmZy5pcnEgPSBpcnE7CisJCWNmZy5pb19iYXNlID0gaW87CisJCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oaW8sIDIsICJtcHU0MDEiKTsKKwkJaWYgKCFwb3J0cykKKwkJCXJldHVybiAtRUJVU1k7CisJCWlmIChwcm9iZV9tcHU0MDEoJmNmZywgcG9ydHMpID09IDApIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGlvLCAyKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmICgocmV0ID0gYXR0YWNoX21wdTQwMSgmY2ZnLCBUSElTX01PRFVMRSkpKQorCQkJcmV0dXJuIHJldDsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX21wdTQwMSh2b2lkKQoreworCWlmIChpbyAhPSAtMSAmJiBpcnEgIT0gLTEpIHsKKwkJLyogQ2hlY2sgZm9yIHVzZSBieSwgZm9yIGV4YW1wbGUsIHNzY2FwZSBkcml2ZXIgKi8KKwkJdW5sb2FkX21wdTQwMSgmY2ZnKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGluaXRfbXB1NDAxKTsKK21vZHVsZV9leGl0KGNsZWFudXBfbXB1NDAxKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX21wdTQwMShjaGFyICpzdHIpCit7CisgICAgICAgIC8qIGlvLCBpcnEgKi8KKwlpbnQgaW50c1szXTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvID0gaW50c1sxXTsKKwlpcnEgPSBpbnRzWzJdOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm1wdTQwMT0iLCBzZXR1cF9tcHU0MDEpOworI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbXB1NDAxLmggYi9zb3VuZC9vc3MvbXB1NDAxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjNWJkZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tcHU0MDEuaApAQCAtMCwwICsxLDE0IEBACisKKy8qCUZyb20gdWFydDQwMS5jICovCitpbnQgcHJvYmVfdWFydDQwMSAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7Cit2b2lkIHVubG9hZF91YXJ0NDAxIChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOworCitpcnFyZXR1cm5fdCB1YXJ0NDAxaW50ciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIGR1bW15KTsKKworLyoJRnJvbSBtcHU0MDEuYyAqLworaW50IHByb2JlX21wdTQwMShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCByZXNvdXJjZSAqcG9ydHMpOworaW50IGF0dGFjaF9tcHU0MDEoc3RydWN0IGFkZHJlc3NfaW5mbyAqIGh3X2NvbmZpZywgc3RydWN0IG1vZHVsZSAqb3duZXIpOwordm9pZCB1bmxvYWRfbXB1NDAxKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2luZm8pOworCitpbnQgaW50Y2hrX21wdTQwMSh2b2lkICpkZXZfaWQpOworaXJxcmV0dXJuX3QgbXB1aW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogZHVtbXkpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21zbmQuYyBiL3NvdW5kL29zcy9tc25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxZmYxYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tc25kLmMKQEAgLTAsMCArMSw0MTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtc25kLmMgLSBEcml2ZXIgQmFzZQorICoKKyAqIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kIFNvdW5kIENhcmQgRHJpdmVyIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBBbmRyZXcgVmVsaWF0aAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICRJZDogbXNuZC5jLHYgMS4xNyAxOTk5LzAzLzIxIDE2OjUwOjA5IGFuZHJld3R2IEV4cCAkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlICJtc25kLmgiCisKKyNkZWZpbmUgTE9HTkFNRQkJCSJtc25kIgorCisjZGVmaW5lIE1TTkRfTUFYX0RFVlMJCTQKKworc3RhdGljIG11bHRpc291bmRfZGV2X3QJCSpkZXZzW01TTkRfTUFYX0RFVlNdOworc3RhdGljIGludAkJCW51bV9kZXZzOworCitpbnQgX19pbml0IG1zbmRfcmVnaXN0ZXIobXVsdGlzb3VuZF9kZXZfdCAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1TTkRfTUFYX0RFVlM7ICsraSkKKwkJaWYgKGRldnNbaV0gPT0gTlVMTCkKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gTVNORF9NQVhfREVWUykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZzW2ldID0gZGV2OworCSsrbnVtX2RldnM7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXNuZF91bnJlZ2lzdGVyKG11bHRpc291bmRfZGV2X3QgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNU05EX01BWF9ERVZTOyArK2kpCisJCWlmIChkZXZzW2ldID09IGRldikKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gTVNORF9NQVhfREVWUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIExPR05BTUUgIjogVW5yZWdpc3RlcmluZyB1bmtub3duIGRldmljZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZXZzW2ldID0gTlVMTDsKKwktLW51bV9kZXZzOworfQorCit2b2lkIG1zbmRfaW5pdF9xdWV1ZSh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBzdGFydCwgaW50IHNpemUpCit7CisJd3JpdGV3KFBDVE9EU1BfQkFTRUQoc3RhcnQpLCBiYXNlICsgSlFTX3dTdGFydCk7CisJd3JpdGV3KFBDVE9EU1BfT0ZGU0VUKHNpemUpIC0gMSwgYmFzZSArIEpRU193U2l6ZSk7CisJd3JpdGV3KDAsIGJhc2UgKyBKUVNfd0hlYWQpOworCXdyaXRldygwLCBiYXNlICsgSlFTX3dUYWlsKTsKK30KKwordm9pZCBtc25kX2ZpZm9faW5pdChtc25kX2ZpZm8gKmYpCit7CisJZi0+ZGF0YSA9IE5VTEw7Cit9CisKK3ZvaWQgbXNuZF9maWZvX2ZyZWUobXNuZF9maWZvICpmKQoreworCWlmIChmLT5kYXRhKSB7CisJCXZmcmVlKGYtPmRhdGEpOworCQlmLT5kYXRhID0gTlVMTDsKKwl9Cit9CisKK2ludCBtc25kX2ZpZm9fYWxsb2MobXNuZF9maWZvICpmLCBzaXplX3QgbikKK3sKKwltc25kX2ZpZm9fZnJlZShmKTsKKwlmLT5kYXRhID0gKGNoYXIgKil2bWFsbG9jKG4pOworCWYtPm4gPSBuOworCWYtPnRhaWwgPSAwOworCWYtPmhlYWQgPSAwOworCWYtPmxlbiA9IDA7CisKKwlpZiAoIWYtPmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXNuZF9maWZvX21ha2VfZW1wdHkobXNuZF9maWZvICpmKQoreworCWYtPmxlbiA9IGYtPnRhaWwgPSBmLT5oZWFkID0gMDsKK30KKworaW50IG1zbmRfZmlmb193cml0ZV9pbyhtc25kX2ZpZm8gKmYsIGNoYXIgX19pb21lbSAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCBjb3VudCA9IDA7CisKKwl3aGlsZSAoKGNvdW50IDwgbGVuKSAmJiAoZi0+bGVuICE9IGYtPm4pKSB7CisKKwkJaW50IG53cml0dGVuOworCisJCWlmIChmLT5oZWFkIDw9IGYtPnRhaWwpIHsKKwkJCW53cml0dGVuID0gbGVuIC0gY291bnQ7CisJCQlpZiAobndyaXR0ZW4gPiBmLT5uIC0gZi0+dGFpbCkKKwkJCQlud3JpdHRlbiA9IGYtPm4gLSBmLT50YWlsOworCQl9CisJCWVsc2UgeworCQkJbndyaXR0ZW4gPSBmLT5oZWFkIC0gZi0+dGFpbDsKKwkJCWlmIChud3JpdHRlbiA+IGxlbiAtIGNvdW50KQorCQkJCW53cml0dGVuID0gbGVuIC0gY291bnQ7CisJCX0KKworCQltZW1jcHlfZnJvbWlvKGYtPmRhdGEgKyBmLT50YWlsLCBidWYsIG53cml0dGVuKTsKKworCQljb3VudCArPSBud3JpdHRlbjsKKwkJYnVmICs9IG53cml0dGVuOworCQlmLT5sZW4gKz0gbndyaXR0ZW47CisJCWYtPnRhaWwgKz0gbndyaXR0ZW47CisJCWYtPnRhaWwgJT0gZi0+bjsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBtc25kX2ZpZm9fd3JpdGUobXNuZF9maWZvICpmLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IGNvdW50ID0gMDsKKworCXdoaWxlICgoY291bnQgPCBsZW4pICYmIChmLT5sZW4gIT0gZi0+bikpIHsKKworCQlpbnQgbndyaXR0ZW47CisKKwkJaWYgKGYtPmhlYWQgPD0gZi0+dGFpbCkgeworCQkJbndyaXR0ZW4gPSBsZW4gLSBjb3VudDsKKwkJCWlmIChud3JpdHRlbiA+IGYtPm4gLSBmLT50YWlsKQorCQkJCW53cml0dGVuID0gZi0+biAtIGYtPnRhaWw7CisJCX0KKwkJZWxzZSB7CisJCQlud3JpdHRlbiA9IGYtPmhlYWQgLSBmLT50YWlsOworCQkJaWYgKG53cml0dGVuID4gbGVuIC0gY291bnQpCisJCQkJbndyaXR0ZW4gPSBsZW4gLSBjb3VudDsKKwkJfQorCisJCW1lbWNweShmLT5kYXRhICsgZi0+dGFpbCwgYnVmLCBud3JpdHRlbik7CisKKwkJY291bnQgKz0gbndyaXR0ZW47CisJCWJ1ZiArPSBud3JpdHRlbjsKKwkJZi0+bGVuICs9IG53cml0dGVuOworCQlmLT50YWlsICs9IG53cml0dGVuOworCQlmLT50YWlsICU9IGYtPm47CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitpbnQgbXNuZF9maWZvX3JlYWRfaW8obXNuZF9maWZvICpmLCBjaGFyIF9faW9tZW0gKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgY291bnQgPSAwOworCisJd2hpbGUgKChjb3VudCA8IGxlbikgJiYgKGYtPmxlbiA+IDApKSB7CisKKwkJaW50IG5yZWFkOworCisJCWlmIChmLT50YWlsIDw9IGYtPmhlYWQpIHsKKwkJCW5yZWFkID0gbGVuIC0gY291bnQ7CisJCQlpZiAobnJlYWQgPiBmLT5uIC0gZi0+aGVhZCkKKwkJCQlucmVhZCA9IGYtPm4gLSBmLT5oZWFkOworCQl9CisJCWVsc2UgeworCQkJbnJlYWQgPSBmLT50YWlsIC0gZi0+aGVhZDsKKwkJCWlmIChucmVhZCA+IGxlbiAtIGNvdW50KQorCQkJCW5yZWFkID0gbGVuIC0gY291bnQ7CisJCX0KKworCQltZW1jcHlfdG9pbyhidWYsIGYtPmRhdGEgKyBmLT5oZWFkLCBucmVhZCk7CisKKwkJY291bnQgKz0gbnJlYWQ7CisJCWJ1ZiArPSBucmVhZDsKKwkJZi0+bGVuIC09IG5yZWFkOworCQlmLT5oZWFkICs9IG5yZWFkOworCQlmLT5oZWFkICU9IGYtPm47CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitpbnQgbXNuZF9maWZvX3JlYWQobXNuZF9maWZvICpmLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IGNvdW50ID0gMDsKKworCXdoaWxlICgoY291bnQgPCBsZW4pICYmIChmLT5sZW4gPiAwKSkgeworCisJCWludCBucmVhZDsKKworCQlpZiAoZi0+dGFpbCA8PSBmLT5oZWFkKSB7CisJCQlucmVhZCA9IGxlbiAtIGNvdW50OworCQkJaWYgKG5yZWFkID4gZi0+biAtIGYtPmhlYWQpCisJCQkJbnJlYWQgPSBmLT5uIC0gZi0+aGVhZDsKKwkJfQorCQllbHNlIHsKKwkJCW5yZWFkID0gZi0+dGFpbCAtIGYtPmhlYWQ7CisJCQlpZiAobnJlYWQgPiBsZW4gLSBjb3VudCkKKwkJCQlucmVhZCA9IGxlbiAtIGNvdW50OworCQl9CisKKwkJbWVtY3B5KGJ1ZiwgZi0+ZGF0YSArIGYtPmhlYWQsIG5yZWFkKTsKKworCQljb3VudCArPSBucmVhZDsKKwkJYnVmICs9IG5yZWFkOworCQlmLT5sZW4gLT0gbnJlYWQ7CisJCWYtPmhlYWQgKz0gbnJlYWQ7CisJCWYtPmhlYWQgJT0gZi0+bjsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgbXNuZF93YWl0X1RYREUobXVsdGlzb3VuZF9kZXZfdCAqZGV2KQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBpbyA9IGRldi0+aW87CisJcmVnaXN0ZXIgaW50IHRpbWVvdXQgPSAxMDAwOworICAgIAorCXdoaWxlKHRpbWVvdXQtLSA+IDApCisJCWlmIChtc25kX2luYihpbyArIEhQX0lTUikgJiBIUElTUl9UWERFKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBtc25kX3dhaXRfSEMwKG11bHRpc291bmRfZGV2X3QgKmRldikKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW8gPSBkZXYtPmlvOworCXJlZ2lzdGVyIGludCB0aW1lb3V0ID0gMTAwMDsKKworCXdoaWxlKHRpbWVvdXQtLSA+IDApCisJCWlmICghKG1zbmRfaW5iKGlvICsgSFBfQ1ZSKSAmIEhQQ1ZSX0hDKSkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIC1FSU87Cit9CisKK2ludCBtc25kX3NlbmRfZHNwX2NtZChtdWx0aXNvdW5kX2Rldl90ICpkZXYsIEJZVEUgY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJaWYgKG1zbmRfd2FpdF9IQzAoZGV2KSA9PSAwKSB7CisJCW1zbmRfb3V0YihjbWQsIGRldi0+aW8gKyBIUF9DVlIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fREVCVUcgTE9HTkFNRSAiOiBTZW5kIERTUCBjb21tYW5kIHRpbWVvdXRcbiIpOworCisJcmV0dXJuIC1FSU87Cit9CisKK2ludCBtc25kX3NlbmRfd29yZChtdWx0aXNvdW5kX2Rldl90ICpkZXYsIHVuc2lnbmVkIGNoYXIgaGlnaCwKKwkJICAgdW5zaWduZWQgY2hhciBtaWQsIHVuc2lnbmVkIGNoYXIgbG93KQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBpbyA9IGRldi0+aW87CisKKwlpZiAobXNuZF93YWl0X1RYREUoZGV2KSA9PSAwKSB7CisJCW1zbmRfb3V0YihoaWdoLCBpbyArIEhQX1RYSCk7CisJCW1zbmRfb3V0YihtaWQsIGlvICsgSFBfVFhNKTsKKwkJbXNuZF9vdXRiKGxvdywgaW8gKyBIUF9UWEwpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IFNlbmQgaG9zdCB3b3JkIHRpbWVvdXRcbiIpOworCisJcmV0dXJuIC1FSU87Cit9CisKK2ludCBtc25kX3VwbG9hZF9ob3N0KG11bHRpc291bmRfZGV2X3QgKmRldiwgY2hhciAqYmluLCBpbnQgbGVuKQoreworCWludCBpOworCisJaWYgKGxlbiAlIDMgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIExPR05BTUUgIjogVXBsb2FkIGhvc3QgZGF0YSBub3QgbXVsdGlwbGUgb2YgMyFcbiIpOwkJCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykKKwkJaWYgKG1zbmRfc2VuZF93b3JkKGRldiwgYmluW2ldLCBiaW5baSArIDFdLCBiaW5baSArIDJdKSAhPSAwKQorCQkJcmV0dXJuIC1FSU87CisKKwltc25kX2luYihkZXYtPmlvICsgSFBfUlhMKTsKKwltc25kX2luYihkZXYtPmlvICsgSFBfQ1ZSKTsKKworCXJldHVybiAwOworfQorCitpbnQgbXNuZF9lbmFibGVfaXJxKG11bHRpc291bmRfZGV2X3QgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRldi0+aXJxX3JlZisrKQorCQlyZXR1cm4gMDsKKworCXByaW50ayhLRVJOX0RFQlVHIExPR05BTUUgIjogRW5hYmxpbmcgSVJRXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAobXNuZF93YWl0X1RYREUoZGV2KSA9PSAwKSB7CisJCW1zbmRfb3V0Yihtc25kX2luYihkZXYtPmlvICsgSFBfSUNSKSB8IEhQSUNSX1RSRVEsIGRldi0+aW8gKyBIUF9JQ1IpOworCQlpZiAoZGV2LT50eXBlID09IG1zbmRDbGFzc2ljKQorCQkJbXNuZF9vdXRiKGRldi0+aXJxaWQsIGRldi0+aW8gKyBIUF9JUlFNKTsKKwkJbXNuZF9vdXRiKG1zbmRfaW5iKGRldi0+aW8gKyBIUF9JQ1IpICYgfkhQSUNSX1RSRVEsIGRldi0+aW8gKyBIUF9JQ1IpOworCQltc25kX291dGIobXNuZF9pbmIoZGV2LT5pbyArIEhQX0lDUikgfCBIUElDUl9SUkVRLCBkZXYtPmlvICsgSFBfSUNSKTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisJCW1zbmRfaW5pdF9xdWV1ZShkZXYtPkRTUFEsIGRldi0+ZHNwcV9kYXRhX2J1ZmYsIGRldi0+ZHNwcV9idWZmX3NpemUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fREVCVUcgTE9HTkFNRSAiOiBFbmFibGUgSVJRIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gLUVJTzsKK30KKworaW50IG1zbmRfZGlzYWJsZV9pcnEobXVsdGlzb3VuZF9kZXZfdCAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoLS1kZXYtPmlycV9yZWYgPiAwKQorCQlyZXR1cm4gMDsKKworCWlmIChkZXYtPmlycV9yZWYgPCAwKQorCQlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IElSUSByZWYgY291bnQgaXMgJWRcbiIsIGRldi0+aXJxX3JlZik7CisKKwlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IERpc2FibGluZyBJUlFcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCWlmIChtc25kX3dhaXRfVFhERShkZXYpID09IDApIHsKKwkJbXNuZF9vdXRiKG1zbmRfaW5iKGRldi0+aW8gKyBIUF9JQ1IpICYgfkhQSUNSX1JSRVEsIGRldi0+aW8gKyBIUF9JQ1IpOworCQlpZiAoZGV2LT50eXBlID09IG1zbmRDbGFzc2ljKQorCQkJbXNuZF9vdXRiKEhQSVJRX05PTkUsIGRldi0+aW8gKyBIUF9JUlFNKTsKKwkJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fREVCVUcgTE9HTkFNRSAiOiBEaXNhYmxlIElSUSBmYWlsZWRcbiIpOworCisJcmV0dXJuIC1FSU87Cit9CisKKyNpZm5kZWYgTElOVVgyMAorRVhQT1JUX1NZTUJPTChtc25kX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wobXNuZF91bnJlZ2lzdGVyKTsKKworRVhQT1JUX1NZTUJPTChtc25kX2luaXRfcXVldWUpOworCitFWFBPUlRfU1lNQk9MKG1zbmRfZmlmb19pbml0KTsKK0VYUE9SVF9TWU1CT0wobXNuZF9maWZvX2ZyZWUpOworRVhQT1JUX1NZTUJPTChtc25kX2ZpZm9fYWxsb2MpOworRVhQT1JUX1NZTUJPTChtc25kX2ZpZm9fbWFrZV9lbXB0eSk7CitFWFBPUlRfU1lNQk9MKG1zbmRfZmlmb193cml0ZV9pbyk7CitFWFBPUlRfU1lNQk9MKG1zbmRfZmlmb19yZWFkX2lvKTsKK0VYUE9SVF9TWU1CT0wobXNuZF9maWZvX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0wobXNuZF9maWZvX3JlYWQpOworCitFWFBPUlRfU1lNQk9MKG1zbmRfc2VuZF9kc3BfY21kKTsKK0VYUE9SVF9TWU1CT0wobXNuZF9zZW5kX3dvcmQpOworRVhQT1JUX1NZTUJPTChtc25kX3VwbG9hZF9ob3N0KTsKKworRVhQT1JUX1NZTUJPTChtc25kX2VuYWJsZV9pcnEpOworRVhQT1JUX1NZTUJPTChtc25kX2Rpc2FibGVfaXJxKTsKKyNlbmRpZgorCisjaWZkZWYgTU9EVUxFCitNT0RVTEVfQVVUSE9SCQkJCSgiQW5kcmV3IFZlbGlhdGggPGFuZHJld3R2QHVzYS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04JCQkoIlR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kIERyaXZlciBCYXNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21zbmQuaCBiL3NvdW5kL29zcy9tc25kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjZjc4NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tc25kLmgKQEAgLTAsMCArMSwyODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtc25kLmgKKyAqCisgKiBUdXJ0bGUgQmVhY2ggTXVsdGlTb3VuZCBTb3VuZCBDYXJkIERyaXZlciBmb3IgTGludXgKKyAqCisgKiBTb21lIHBhcnRzIG9mIHRoaXMgaGVhZGVyIGZpbGUgd2VyZSBkZXJpdmVkIGZyb20gdGhlIFR1cnRsZSBCZWFjaAorICogTXVsdGlTb3VuZCBEcml2ZXIgRGV2ZWxvcG1lbnQgS2l0LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBBbmRyZXcgVmVsaWF0aAorICogQ29weXJpZ2h0IChDKSAxOTkzIFR1cnRsZSBCZWFjaCBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogJElkOiBtc25kLmgsdiAxLjM2IDE5OTkvMDMvMjEgMTc6MDU6NDIgYW5kcmV3dHYgRXhwICQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9fTVNORF9ICisjZGVmaW5lIF9fTVNORF9ICisKKyNkZWZpbmUgVkVSU0lPTgkJCSIwLjguMy4xIgorCisjZGVmaW5lIERFRlNBTVBMRVJBVEUJCURTUF9ERUZBVUxUX1NQRUVECisjZGVmaW5lIERFRlNBTVBMRVNJWkUJCUFGTVRfVTgKKyNkZWZpbmUgREVGQ0hBTk5FTFMJCTEKKworI2RlZmluZSBERUZGSUZPU0laRQkJMTI4CisKKyNkZWZpbmUgU05EQ0FSRF9NU05ECQkzOAorCisjZGVmaW5lIFNSQU1fQkFOS19TSVpFCQkweDgwMDAKKyNkZWZpbmUgU1JBTV9DTlRMX1NUQVJUCQkweDdGMDAKKworI2RlZmluZSBEU1BfQkFTRV9BRERSCQkweDQwMDAKKyNkZWZpbmUgRFNQX0JBTktfQkFTRQkJMHg0MDAwCisKKyNkZWZpbmUJSFBfSUNSCQkJMHgwMAorI2RlZmluZQlIUF9DVlIJCQkweDAxCisjZGVmaW5lCUhQX0lTUgkJCTB4MDIKKyNkZWZpbmUJSFBfSVZSCQkJMHgwMworI2RlZmluZSBIUF9OVQkJCTB4MDQKKyNkZWZpbmUgSFBfSU5GTwkJCTB4MDQKKyNkZWZpbmUJSFBfVFhICQkJMHgwNQorI2RlZmluZQlIUF9SWEgJCQkweDA1CisjZGVmaW5lCUhQX1RYTQkJCTB4MDYKKyNkZWZpbmUJSFBfUlhNCQkJMHgwNgorI2RlZmluZQlIUF9UWEwJCQkweDA3CisjZGVmaW5lCUhQX1JYTAkJCTB4MDcKKworI2RlZmluZSBIUF9JQ1JfREVGCQkweDAwCisjZGVmaW5lIEhQX0NWUl9ERUYJCTB4MTIKKyNkZWZpbmUgSFBfSVNSX0RFRgkJMHgwNgorI2RlZmluZSBIUF9JVlJfREVGCQkweDBmCisjZGVmaW5lIEhQX05VX0RFRgkJMHgwMAorCisjZGVmaW5lCUhQX0lSUU0JCQkweDA5CisKKyNkZWZpbmUJSFBSX0JMUkMJCTB4MDgKKyNkZWZpbmUJSFBSX1NQUjEJCTB4MDkKKyNkZWZpbmUJSFBSX1NQUjIJCTB4MEEKKyNkZWZpbmUJSFBSX1RDTDAJCTB4MEIKKyNkZWZpbmUJSFBSX1RDTDEJCTB4MEMKKyNkZWZpbmUJSFBSX1RDTDIJCTB4MEQKKyNkZWZpbmUJSFBSX1RDTDMJCTB4MEUKKyNkZWZpbmUJSFBSX1RDTDQJCTB4MEYKKworI2RlZmluZQlIUElDUl9JTklUCQkweDgwCisjZGVmaW5lIEhQSUNSX0hNMQkJMHg0MAorI2RlZmluZSBIUElDUl9ITTAJCTB4MjAKKyNkZWZpbmUgSFBJQ1JfSEYxCQkweDEwCisjZGVmaW5lIEhQSUNSX0hGMAkJMHgwOAorI2RlZmluZQlIUElDUl9UUkVRCQkweDAyCisjZGVmaW5lCUhQSUNSX1JSRVEJCTB4MDEKKworI2RlZmluZSBIUENWUl9IQwkJMHg4MAorCisjZGVmaW5lCUhQSVNSX0hSRVEJCTB4ODAKKyNkZWZpbmUgSFBJU1JfRE1BCQkweDQwCisjZGVmaW5lIEhQSVNSX0hGMwkJMHgxMAorI2RlZmluZSBIUElTUl9IRjIJCTB4MDgKKyNkZWZpbmUJSFBJU1JfVFJEWQkJMHgwNAorI2RlZmluZQlIUElTUl9UWERFCQkweDAyCisjZGVmaW5lCUhQSVNSX1JYREYJCTB4MDEKKworI2RlZmluZQlIUElPXzI5MAkJMAorI2RlZmluZQlIUElPXzI2MAkJMQorI2RlZmluZQlIUElPXzI1MAkJMgorI2RlZmluZQlIUElPXzI0MAkJMworI2RlZmluZQlIUElPXzIzMAkJNAorI2RlZmluZQlIUElPXzIyMAkJNQorI2RlZmluZQlIUElPXzIxMAkJNgorI2RlZmluZQlIUElPXzNFMAkJNworCisjZGVmaW5lCUhQTUVNX05PTkUJCTAKKyNkZWZpbmUJSFBNRU1fQjAwMAkJMQorI2RlZmluZQlIUE1FTV9DODAwCQkyCisjZGVmaW5lCUhQTUVNX0QwMDAJCTMKKyNkZWZpbmUJSFBNRU1fRDQwMAkJNAorI2RlZmluZQlIUE1FTV9EODAwCQk1CisjZGVmaW5lCUhQTUVNX0UwMDAJCTYKKyNkZWZpbmUJSFBNRU1fRTgwMAkJNworCisjZGVmaW5lCUhQSVJRX05PTkUJCTAKKyNkZWZpbmUgSFBJUlFfNQkJCTEKKyNkZWZpbmUgSFBJUlFfNwkJCTIKKyNkZWZpbmUgSFBJUlFfOQkJCTMKKyNkZWZpbmUgSFBJUlFfMTAJCTQKKyNkZWZpbmUgSFBJUlFfMTEJCTUKKyNkZWZpbmUgSFBJUlFfMTIJCTYKKyNkZWZpbmUgSFBJUlFfMTUJCTcKKworI2RlZmluZQlISU1UX1BMQVlfRE9ORQkJMHgwMAorI2RlZmluZQlISU1UX1JFQ09SRF9ET05FCTB4MDEKKyNkZWZpbmUJSElNVF9NSURJX0VPUwkJMHgwMgorI2RlZmluZQlISU1UX01JRElfT1VUCQkweDAzCisKKyNkZWZpbmUJSElNVF9NSURJX0lOX1VDSEFSCTB4MEUKKyNkZWZpbmUJSElNVF9EU1AJCTB4MEYKKworI2RlZmluZQlIREVYX0JBU0UJICAgICAgIAkweDkyCisjZGVmaW5lCUhERVhfUExBWV9TVEFSVAkJKDAgKyBIREVYX0JBU0UpCisjZGVmaW5lCUhERVhfUExBWV9TVE9QCQkoMSArIEhERVhfQkFTRSkKKyNkZWZpbmUJSERFWF9QTEFZX1BBVVNFCQkoMiArIEhERVhfQkFTRSkKKyNkZWZpbmUJSERFWF9QTEFZX1JFU1VNRQkoMyArIEhERVhfQkFTRSkKKyNkZWZpbmUJSERFWF9SRUNPUkRfU1RBUlQJKDQgKyBIREVYX0JBU0UpCisjZGVmaW5lCUhERVhfUkVDT1JEX1NUT1AJKDUgKyBIREVYX0JBU0UpCisjZGVmaW5lCUhERVhfTUlESV9JTl9TVEFSVCAJKDYgKyBIREVYX0JBU0UpCisjZGVmaW5lCUhERVhfTUlESV9JTl9TVE9QCSg3ICsgSERFWF9CQVNFKQorI2RlZmluZQlIREVYX01JRElfT1VUX1NUQVJUCSg4ICsgSERFWF9CQVNFKQorI2RlZmluZQlIREVYX01JRElfT1VUX1NUT1AJKDkgKyBIREVYX0JBU0UpCisjZGVmaW5lCUhERVhfQVVYX1JFUQkJKDEwICsgSERFWF9CQVNFKQorCisjZGVmaW5lIEhJV09SRChsKQkJKChXT1JEKSgoKChEV09SRCkobCkpID4+IDE2KSAmIDB4RkZGRikpCisjZGVmaW5lIExPV09SRChsKQkJKChXT1JEKShEV09SRCkobCkpCisjZGVmaW5lIEhJQllURSh3KQkJKChCWVRFKSgoKFdPUkQpKHcpID4+IDgpICYgMHhGRikpCisjZGVmaW5lIExPQllURSh3KQkJKChCWVRFKSh3KSkKKyNkZWZpbmUgTUFLRUxPTkcobG93LGhpKQkoKGxvbmcpKCgoV09SRCkobG93KSl8KCgoRFdPUkQpKChXT1JEKShoaSkpKTw8MTYpKSkKKyNkZWZpbmUgTUFLRVdPUkQobG93LGhpKQkoKFdPUkQpKCgoQllURSkobG93KSl8KCgoV09SRCkoKEJZVEUpKGhpKSkpPDw4KSkpCisKKyNkZWZpbmUgUENUT0RTUF9PRkZTRVQodykJKFVTSE9SVCkoKHcpLzIpCisjZGVmaW5lIFBDVE9EU1BfQkFTRUQodykJKFVTSE9SVCkoKCh3KS8yKSArIERTUF9CQVNFX0FERFIpCisjZGVmaW5lIERTUFRPUENfQkFTRUQodykJKCgodykgLSBEU1BfQkFTRV9BRERSKSAqIDIpCisKKyNpZmRlZiBTTE9XSU8KKyNkZWZpbmUgbXNuZF9vdXRiCQkJb3V0Yl9wCisjZGVmaW5lIG1zbmRfaW5iCQkJaW5iX3AKKyNlbHNlCisjZGVmaW5lIG1zbmRfb3V0YgkJCW91dGIKKyNkZWZpbmUgbXNuZF9pbmIJCQlpbmIKKyNlbmRpZgorCisvKiBKb2JRdWV1ZVN0cnVjdCAqLworI2RlZmluZSBKUVNfd1N0YXJ0CQkweDAwCisjZGVmaW5lIEpRU193U2l6ZQkJMHgwMgorI2RlZmluZSBKUVNfd0hlYWQJCTB4MDQKKyNkZWZpbmUgSlFTX3dUYWlsCQkweDA2CisjZGVmaW5lIEpRU19fc2l6ZQkJMHgwOAorCisvKiBEQVF1ZXVlRGF0YVN0cnVjdCAqLworI2RlZmluZSBEQVFEU193U3RhcnQJCTB4MDAKKyNkZWZpbmUgREFRRFNfd1NpemUJCTB4MDIKKyNkZWZpbmUgREFRRFNfd0Zvcm1hdAkJMHgwNAorI2RlZmluZSBEQVFEU193U2FtcGxlU2l6ZQkweDA2CisjZGVmaW5lIERBUURTX3dDaGFubmVscwkJMHgwOAorI2RlZmluZSBEQVFEU193U2FtcGxlUmF0ZQkweDBBCisjZGVmaW5lIERBUURTX3dJbnRNc2cJCTB4MEMKKyNkZWZpbmUgREFRRFNfd0ZsYWdzCQkweDBFCisjZGVmaW5lIERBUURTX19zaXplCQkweDEwCisKK3R5cGVkZWYgdTgJCQlCWVRFOwordHlwZWRlZiB1MTYJCQlVU0hPUlQ7Cit0eXBlZGVmIHUxNgkJCVdPUkQ7Cit0eXBlZGVmIHUzMgkJCURXT1JEOwordHlwZWRlZiB2b2lkIF9faW9tZW0gKgkJTFBEQVFEOworCisvKiBHZW5lcmljIEZJRk8gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlzaXplX3QgbiwgbGVuOworCWNoYXIgKmRhdGE7CisJaW50IGhlYWQsIHRhaWw7Cit9IG1zbmRfZmlmbzsKKwordHlwZWRlZiBzdHJ1Y3QgbXVsdGlzb3VuZF9kZXYgeworCS8qIExpbnV4IGRldmljZSBpbmZvICovCisJY2hhciAqbmFtZTsKKwlpbnQgZHNwX21pbm9yLCBtaXhlcl9taW5vcjsKKwlpbnQgZXh0X21pZGlfZGV2LCBoZHJfbWlkaV9kZXY7CisKKwkvKiBIYXJkd2FyZSByZXNvdXJjZXMgKi8KKwlpbnQgaW8sIG51bWlvOworCWludCBtZW1pZCwgaXJxaWQ7CisJaW50IGlycSwgaXJxX3JlZjsKKwl1bnNpZ25lZCBjaGFyIGluZm87CisJdm9pZCBfX2lvbWVtICpiYXNlOworCisJLyogTW90b3JvbGEgNTZrIERTUCBTTUEgKi8KKwl2b2lkIF9faW9tZW0gKlNNQTsKKwl2b2lkIF9faW9tZW0gKkRBUFEsICpEQVJRLCAqTU9EUSwgKk1JRFEsICpEU1BROworCXZvaWQgX19pb21lbSAqcHdEU1BRRGF0YSwgKnB3TUlEUURhdGEsICpwd01PRFFEYXRhOworCWludCBkc3BxX2RhdGFfYnVmZiwgZHNwcV9idWZmX3NpemU7CisKKwkvKiBTdGF0ZSB2YXJpYWJsZXMgKi8KKwllbnVtIHsgbXNuZENsYXNzaWMsIG1zbmRQaW5uYWNsZSB9IHR5cGU7CisJbW9kZV90IG1vZGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNkZWZpbmUgRl9SRVNFVFRJTkcJCQkwCisjZGVmaW5lIEZfSEFWRURJR0lUQUwJCQkxCisjZGVmaW5lIEZfQVVESU9fV1JJVEVfSU5VU0UJCTIKKyNkZWZpbmUgRl9XUklUSU5HCQkJMworI2RlZmluZSBGX1dSSVRFQkxPQ0sJCQk0CisjZGVmaW5lIEZfV1JJVEVGTFVTSAkJCTUKKyNkZWZpbmUgRl9BVURJT19SRUFEX0lOVVNFCQk2CisjZGVmaW5lIEZfUkVBRElORwkJCTcKKyNkZWZpbmUgRl9SRUFEQkxPQ0sJCQk4CisjZGVmaW5lIEZfRVhUX01JRElfSU5VU0UJCTkKKyNkZWZpbmUgRl9IRFJfTUlESV9JTlVTRQkJMTAKKyNkZWZpbmUgRl9ESVNBQkxFX1dSSVRFX05ERUxBWQkJMTEKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZWJsb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHJlYWRibG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZWZsdXNoOworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgbnJlc2V0czsKKwl1bnNpZ25lZCBsb25nIHJlY3NyYzsKKwlpbnQgbGVmdF9sZXZlbHNbMTZdOworCWludCByaWdodF9sZXZlbHNbMTZdOworCWludCBtaXhlcl9tb2RfY291bnQ7CisJaW50IGNhbGlicmF0ZV9zaWduYWw7CisJaW50IHBsYXlfc2FtcGxlX3NpemUsIHBsYXlfc2FtcGxlX3JhdGUsIHBsYXlfY2hhbm5lbHM7CisJaW50IHBsYXlfbmRlbGF5OworCWludCByZWNfc2FtcGxlX3NpemUsIHJlY19zYW1wbGVfcmF0ZSwgcmVjX2NoYW5uZWxzOworCWludCByZWNfbmRlbGF5OworCUJZVEUgYkN1cnJlbnRNaWRpUGF0Y2g7CisKKwkvKiBEaWdpdGFsIGF1ZGlvIEZJRk9zICovCisJbXNuZF9maWZvIERBUEYsIERBUkY7CisJaW50IGZpZm9zaXplOworCWludCBsYXN0X3BsYXliYW5rLCBsYXN0X3JlY2Jhbms7CisKKwkvKiBNSURJIGluIGNhbGxiYWNrICovCisJdm9pZCAoKm1pZGlfaW5faW50ZXJydXB0KShzdHJ1Y3QgbXVsdGlzb3VuZF9kZXYgKik7Cit9IG11bHRpc291bmRfZGV2X3Q7CisKKyNpZm5kZWYgbWRlbGF5CisjICBkZWZpbmUgbWRlbGF5KGEpCQl1ZGVsYXkoKGEpICogMTAwMCkKKyNlbmRpZgorCitpbnQJCQkJbXNuZF9yZWdpc3RlcihtdWx0aXNvdW5kX2Rldl90ICpkZXYpOwordm9pZAkJCQltc25kX3VucmVnaXN0ZXIobXVsdGlzb3VuZF9kZXZfdCAqZGV2KTsKKwordm9pZAkJCQltc25kX2luaXRfcXVldWUodm9pZCBfX2lvbWVtICosIGludCBzdGFydCwgaW50IHNpemUpOworCit2b2lkCQkJCW1zbmRfZmlmb19pbml0KG1zbmRfZmlmbyAqZik7Cit2b2lkCQkJCW1zbmRfZmlmb19mcmVlKG1zbmRfZmlmbyAqZik7CitpbnQJCQkJbXNuZF9maWZvX2FsbG9jKG1zbmRfZmlmbyAqZiwgc2l6ZV90IG4pOwordm9pZAkJCQltc25kX2ZpZm9fbWFrZV9lbXB0eShtc25kX2ZpZm8gKmYpOworaW50CQkJCW1zbmRfZmlmb193cml0ZV9pbyhtc25kX2ZpZm8gKmYsIGNoYXIgX19pb21lbSAqYnVmLCBzaXplX3QgbGVuKTsKK2ludAkJCQltc25kX2ZpZm9fcmVhZF9pbyhtc25kX2ZpZm8gKmYsIGNoYXIgX19pb21lbSAqYnVmLCBzaXplX3QgbGVuKTsKK2ludAkJCQltc25kX2ZpZm9fd3JpdGUobXNuZF9maWZvICpmLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworaW50CQkJCW1zbmRfZmlmb19yZWFkKG1zbmRfZmlmbyAqZiwgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKKworaW50CQkJCW1zbmRfc2VuZF9kc3BfY21kKG11bHRpc291bmRfZGV2X3QgKmRldiwgQllURSBjbWQpOworaW50CQkJCW1zbmRfc2VuZF93b3JkKG11bHRpc291bmRfZGV2X3QgKmRldiwgdW5zaWduZWQgY2hhciBoaWdoLAorCQkJCQkgICAgICAgdW5zaWduZWQgY2hhciBtaWQsIHVuc2lnbmVkIGNoYXIgbG93KTsKK2ludAkJCQltc25kX3VwbG9hZF9ob3N0KG11bHRpc291bmRfZGV2X3QgKmRldiwgY2hhciAqYmluLCBpbnQgbGVuKTsKK2ludAkJCQltc25kX2VuYWJsZV9pcnEobXVsdGlzb3VuZF9kZXZfdCAqZGV2KTsKK2ludAkJCQltc25kX2Rpc2FibGVfaXJxKG11bHRpc291bmRfZGV2X3QgKmRldik7CisKKyNlbmRpZiAvKiBfX01TTkRfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21zbmRfY2xhc3NpYy5jIGIvc291bmQvb3NzL21zbmRfY2xhc3NpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjNhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbXNuZF9jbGFzc2ljLmMKQEAgLTAsMCArMSwzIEBACisvKiBUaGUgd29yayBpcyBpbiBtc25kX3Bpbm5hY2xlLmMsIGp1c3QgZGVmaW5lIE1TTkRfQ0xBU1NJQyBiZWZvcmUgaXQuICovCisjZGVmaW5lIE1TTkRfQ0xBU1NJQworI2luY2x1ZGUgIm1zbmRfcGlubmFjbGUuYyIKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tc25kX2NsYXNzaWMuaCBiL3NvdW5kL29zcy9tc25kX2NsYXNzaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2MzYzQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tc25kX2NsYXNzaWMuaApAQCAtMCwwICsxLDE4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1zbmRfY2xhc3NpYy5oCisgKgorICogVHVydGxlIEJlYWNoIE11bHRpU291bmQgU291bmQgQ2FyZCBEcml2ZXIgZm9yIExpbnV4CisgKgorICogU29tZSBwYXJ0cyBvZiB0aGlzIGhlYWRlciBmaWxlIHdlcmUgZGVyaXZlZCBmcm9tIHRoZSBUdXJ0bGUgQmVhY2gKKyAqIE11bHRpU291bmQgRHJpdmVyIERldmVsb3BtZW50IEtpdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggQW5kcmV3IFZlbGlhdGgKKyAqIENvcHlyaWdodCAoQykgMTk5MyBUdXJ0bGUgQmVhY2ggU3lzdGVtcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogCisgKiAkSWQ6IG1zbmRfY2xhc3NpYy5oLHYgMS4xMCAxOTk5LzAzLzIxIDE3OjM2OjA5IGFuZHJld3R2IEV4cCAkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX01TTkRfQ0xBU1NJQ19ICisjZGVmaW5lIF9fTVNORF9DTEFTU0lDX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjZGVmaW5lIERTUF9OVU1JTwkJCQkweDEwCisKKyNkZWZpbmUJSFBfTUVNTQkJCQkJMHgwOAorCisjZGVmaW5lCUhQX0JJVE0JCQkJCTB4MEUKKyNkZWZpbmUJSFBfV0FJVAkJCQkJMHgwRAorI2RlZmluZQlIUF9EU1BSCQkJCQkweDBBCisjZGVmaW5lCUhQX1BST1IJCQkJCTB4MEIKKyNkZWZpbmUJSFBfQkxLUwkJCQkJMHgwQworCisjZGVmaW5lCUhQUFJPUkVTRVRfT0ZGCQkJCTAKKyNkZWZpbmUgSFBQUk9SRVNFVF9PTgkJCQkxCisKKyNkZWZpbmUgSFBEU1BSRVNFVF9PRkYJCQkJMAorI2RlZmluZSBIUERTUFJFU0VUX09OCQkJCTEKKworI2RlZmluZSBIUEJMS1NFTF8wCQkJCTAKKyNkZWZpbmUgSFBCTEtTRUxfMQkJCQkxCisKKyNkZWZpbmUgSFBXQUlUU1RBVEVfMAkJCQkwCisjZGVmaW5lIEhQV0FJVFNUQVRFXzEJCQkJMQorCisjZGVmaW5lIEhQQklUTU9ERV8xNgkJCQkwCisjZGVmaW5lIEhQQklUTU9ERV84CQkJCTEKKworI2RlZmluZQlISURTUF9JTlRfUExBWV9VTkRFUgkJCTB4MDAKKyNkZWZpbmUJSElEU1BfSU5UX1JFQ09SRF9PVkVSCQkJMHgwMQorI2RlZmluZQlISURTUF9JTlBVVF9DTElQUElORwkJCTB4MDIKKyNkZWZpbmUJSElEU1BfTUlESV9JTl9PVkVSCQkJMHgxMAorI2RlZmluZQlISURTUF9NSURJX09WRVJSVU5fRVJSICAweDEzCisKKyNkZWZpbmUJSERFWEFSX0NMRUFSX1BFQUtTCQkJMQorI2RlZmluZQlIREVYQVJfSU5fU0VUX1BPVFMJCQkyCisjZGVmaW5lCUhERVhBUl9BVVhfU0VUX1BPVFMJCQkzCisjZGVmaW5lCUhERVhBUl9DQUxfQV9UT19ECQkJNAorI2RlZmluZQlIREVYQVJfUkRfRVhUX0RTUF9CSVRTCQkJNQorCisjZGVmaW5lIFRJTUVfUFJPX1JFU0VUX0RPTkUJCQkweDAyOEEKKyNkZWZpbmUgVElNRV9QUk9fU1lTRVgJCQkJMHgwMDQwCisjZGVmaW5lIFRJTUVfUFJPX1JFU0VUCQkJCTB4MDAzMgorCisjZGVmaW5lIEFHTkQJCQkJCTB4MDEKKyNkZWZpbmUgU0lHTkFMCQkJCQkweDAyCisKKyNkZWZpbmUgRVhUX0RTUF9CSVRfRENBTAkJCTB4MDAwMQorI2RlZmluZSBFWFRfRFNQX0JJVF9NSURJX0NPTgkJCTB4MDAwMgorCisjZGVmaW5lIEJVRkZTSVpFCQkJCTB4ODAwMAorI2RlZmluZSBIT1NUUV9TSVpFCQkJCTB4NDAKKworI2RlZmluZSBTUkFNX0NOVExfU1RBUlQJCQkJMHg3RjAwCisjZGVmaW5lIFNNQV9TVFJVQ1RfU1RBUlQJCQkweDdGNDAKKworI2RlZmluZSBEQVBfQlVGRl9TSVpFCQkJCTB4MjQwMAorI2RlZmluZSBEQVJfQlVGRl9TSVpFCQkJCTB4MjAwMAorCisjZGVmaW5lIERBUFFfU1RSVUNUX1NJWkUJCQkweDEwCisjZGVmaW5lIERBUlFfU1RSVUNUX1NJWkUJCQkweDEwCisjZGVmaW5lIERBUFFfQlVGRl9TSVpFCQkJCSgzICogMHgxMCkKKyNkZWZpbmUgREFSUV9CVUZGX1NJWkUJCQkJKDMgKiAweDEwKQorI2RlZmluZSBNT0RRX0JVRkZfU0laRQkJCQkweDQwMAorI2RlZmluZSBNSURRX0JVRkZfU0laRQkJCQkweDIwMAorI2RlZmluZSBEU1BRX0JVRkZfU0laRQkJCQkweDQwCisKKyNkZWZpbmUgREFQUV9EQVRBX0JVRkYJCQkJMHg2QzAwCisjZGVmaW5lIERBUlFfREFUQV9CVUZGCQkJCTB4NkMzMAorI2RlZmluZSBNT0RRX0RBVEFfQlVGRgkJCQkweDZDNjAKKyNkZWZpbmUgTUlEUV9EQVRBX0JVRkYJCQkJMHg3MDYwCisjZGVmaW5lIERTUFFfREFUQV9CVUZGCQkJCTB4NzI2MAorCisjZGVmaW5lIERBUFFfT0ZGU0VUCQkJCVNSQU1fQ05UTF9TVEFSVAorI2RlZmluZSBEQVJRX09GRlNFVAkJCQkoU1JBTV9DTlRMX1NUQVJUICsgMHgwOCkKKyNkZWZpbmUgTU9EUV9PRkZTRVQJCQkJKFNSQU1fQ05UTF9TVEFSVCArIDB4MTApCisjZGVmaW5lIE1JRFFfT0ZGU0VUCQkJCShTUkFNX0NOVExfU1RBUlQgKyAweDE4KQorI2RlZmluZSBEU1BRX09GRlNFVAkJCQkoU1JBTV9DTlRMX1NUQVJUICsgMHgyMCkKKworI2RlZmluZSBNT1BfU1lOVEgJCQkJMHgxMAorI2RlZmluZSBNT1BfRVhUT1VUCQkJCTB4MzIKKyNkZWZpbmUgTU9QX0VYVFRIUlUJCQkJMHgwMgorI2RlZmluZSBNT1BfT1VUTUFTSwkJCQkweDAxCisKKyNkZWZpbmUgTUlQX0VYVElOCQkJCTB4MDEKKyNkZWZpbmUgTUlQX1NZTlRICQkJCTB4MDAKKyNkZWZpbmUgTUlQX0lOTUFTSwkJCQkweDMyCisKKy8qIENsYXNzaWMgU01BIENvbW1vbiBEYXRhICovCisjZGVmaW5lIFNNQV93Q3VyclBsYXlCeXRlcwkJCTB4MDAwMAorI2RlZmluZSBTTUFfd0N1cnJSZWNvcmRCeXRlcwkJCTB4MDAwMgorI2RlZmluZSBTTUFfd0N1cnJQbGF5Vm9sTGVmdAkJCTB4MDAwNAorI2RlZmluZSBTTUFfd0N1cnJQbGF5Vm9sUmlnaHQJCQkweDAwMDYKKyNkZWZpbmUgU01BX3dDdXJySW5Wb2xMZWZ0CQkJMHgwMDA4CisjZGVmaW5lIFNNQV93Q3VyckluVm9sUmlnaHQJCQkweDAwMGEKKyNkZWZpbmUgU01BX3dVc2VyXzMJCQkJMHgwMDBjCisjZGVmaW5lIFNNQV93VXNlcl80CQkJCTB4MDAwZQorI2RlZmluZSBTTUFfZHdVc2VyXzUJCQkJMHgwMDEwCisjZGVmaW5lIFNNQV9kd1VzZXJfNgkJCQkweDAwMTQKKyNkZWZpbmUgU01BX3dVc2VyXzcJCQkJMHgwMDE4CisjZGVmaW5lIFNNQV93UmVzZXJ2ZWRfQQkJCQkweDAwMWEKKyNkZWZpbmUgU01BX3dSZXNlcnZlZF9CCQkJCTB4MDAxYworI2RlZmluZSBTTUFfd1Jlc2VydmVkX0MJCQkJMHgwMDFlCisjZGVmaW5lIFNNQV93UmVzZXJ2ZWRfRAkJCQkweDAwMjAKKyNkZWZpbmUgU01BX3dSZXNlcnZlZF9FCQkJCTB4MDAyMgorI2RlZmluZSBTTUFfd1Jlc2VydmVkX0YJCQkJMHgwMDI0CisjZGVmaW5lIFNNQV93UmVzZXJ2ZWRfRwkJCQkweDAwMjYKKyNkZWZpbmUgU01BX3dSZXNlcnZlZF9ICQkJCTB4MDAyOAorI2RlZmluZSBTTUFfd0N1cnJEU1BTdGF0dXNGbGFncwkJCTB4MDAyYQorI2RlZmluZSBTTUFfd0N1cnJIb3N0U3RhdHVzRmxhZ3MJCTB4MDAyYworI2RlZmluZSBTTUFfd0N1cnJJbnB1dFRhZ0JpdHMJCQkweDAwMmUKKyNkZWZpbmUgU01BX3dDdXJyTGVmdFBlYWsJCQkweDAwMzAKKyNkZWZpbmUgU01BX3dDdXJyUmlnaHRQZWFrCQkJMHgwMDMyCisjZGVmaW5lIFNNQV93RXh0RFNQYml0cwkJCQkweDAwMzQKKyNkZWZpbmUgU01BX2JFeHRIb3N0Yml0cwkJCTB4MDAzNgorI2RlZmluZSBTTUFfYkJvYXJkTGV2ZWwJCQkJMHgwMDM3CisjZGVmaW5lIFNNQV9iSW5Qb3RQb3NSaWdodAkJCTB4MDAzOAorI2RlZmluZSBTTUFfYkluUG90UG9zTGVmdAkJCTB4MDAzOQorI2RlZmluZSBTTUFfYkF1eFBvdFBvc1JpZ2h0CQkJMHgwMDNhCisjZGVmaW5lIFNNQV9iQXV4UG90UG9zTGVmdAkJCTB4MDAzYgorI2RlZmluZSBTTUFfd0N1cnJNYXN0Vm9sTGVmdAkJCTB4MDAzYworI2RlZmluZSBTTUFfd0N1cnJNYXN0Vm9sUmlnaHQJCQkweDAwM2UKKyNkZWZpbmUgU01BX2JVc2VyXzEyCQkJCTB4MDA0MAorI2RlZmluZSBTTUFfYlVzZXJfMTMJCQkJMHgwMDQxCisjZGVmaW5lIFNNQV93VXNlcl8xNAkJCQkweDAwNDIKKyNkZWZpbmUgU01BX3dVc2VyXzE1CQkJCTB4MDA0NAorI2RlZmluZSBTTUFfd0NhbEZyZXFBdG9ECQkJMHgwMDQ2CisjZGVmaW5lIFNNQV93VXNlcl8xNgkJCQkweDAwNDgKKyNkZWZpbmUgU01BX3dVc2VyXzE3CQkJCTB4MDA0YQorI2RlZmluZSBTTUFfX3NpemUJCQkJMHgwMDRjCisKKyNpZmRlZiBIQVZFX0RTUENPREVICisjICBpbmNsdWRlICJtc25kcGVybS5jIgorIyAgaW5jbHVkZSAibXNuZGluaXQuYyIKKyMgIGRlZmluZSBQRVJNQ09ERQkJbXNuZHBlcm0KKyMgIGRlZmluZSBJTklUQ09ERQkJbXNuZGluaXQKKyMgIGRlZmluZSBQRVJNQ09ERVNJWkUJCXNpemVvZihtc25kcGVybSkKKyMgIGRlZmluZSBJTklUQ09ERVNJWkUJCXNpemVvZihtc25kaW5pdCkKKyNlbHNlCisjICBpZm5kZWYgQ09ORklHX01TTkRDTEFTX0lOSVRfRklMRQorIyAgICBkZWZpbmUgQ09ORklHX01TTkRDTEFTX0lOSVRfRklMRQkJCQlcCisJCQkJIi9ldGMvc291bmQvbXNuZGluaXQuYmluIgorIyAgZW5kaWYKKyMgIGlmbmRlZiBDT05GSUdfTVNORENMQVNfUEVSTV9GSUxFCisjICAgIGRlZmluZSBDT05GSUdfTVNORENMQVNfUEVSTV9GSUxFCQkJCVwKKwkJCQkiL2V0Yy9zb3VuZC9tc25kcGVybS5iaW4iCisjICBlbmRpZgorIyAgZGVmaW5lIFBFUk1DT0RFRklMRQkJQ09ORklHX01TTkRDTEFTX1BFUk1fRklMRQorIyAgZGVmaW5lIElOSVRDT0RFRklMRQkJQ09ORklHX01TTkRDTEFTX0lOSVRfRklMRQorIyAgZGVmaW5lIFBFUk1DT0RFCQlkc3BpbmkKKyMgIGRlZmluZSBJTklUQ09ERQkJcGVybWluaQorIyAgZGVmaW5lIFBFUk1DT0RFU0laRQkJc2l6ZW9mX2RzcGluaQorIyAgZGVmaW5lIElOSVRDT0RFU0laRQkJc2l6ZW9mX3Blcm1pbmkKKyNlbmRpZgorI2RlZmluZSBMT05HTkFNRQkJIk11bHRpU291bmQgKENsYXNzaWMvTW9udGVyZXkvVGFoaXRpKSIKKworI2VuZGlmIC8qIF9fTVNORF9DTEFTU0lDX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tc25kX3Bpbm5hY2xlLmMgYi9zb3VuZC9vc3MvbXNuZF9waW5uYWNsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYTAzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbXNuZF9waW5uYWNsZS5jCkBAIC0wLDAgKzEsMTkyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kIFNvdW5kIENhcmQgRHJpdmVyIGZvciBMaW51eAorICogTGludXggMi4wLzIuMiBWZXJzaW9uCisgKgorICogbXNuZF9waW5uYWNsZS5jIC8gbXNuZF9jbGFzc2ljLmMKKyAqCisgKiAtLSBJZiBNU05EX0NMQVNTSUMgaXMgZGVmaW5lZDoKKyAqCisgKiAgICAgLT4gZHJpdmVyIGZvciBUdXJ0bGUgQmVhY2ggQ2xhc3NpYy9Nb250ZXJleS9UYWhpdGkKKyAqCisgKiAtLSBFbHNlCisgKgorICogICAgIC0+IGRyaXZlciBmb3IgVHVydGxlIEJlYWNoIFBpbm5hY2xlL0ZpamkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggQW5kcmV3IFZlbGlhdGgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAkSWQ6IG1zbmRfcGlubmFjbGUuYyx2IDEuOCAyMDAwLzEyLzMwIDAwOjMzOjIxIHN5Y2Ftb3JlIEV4cCAkCisgKgorICogMTItMy0yMDAwICBNb2RpZmllZCBJTyBwb3J0IHZhbGlkYXRpb24gIFN0ZXZlIFN5Y2Ftb3JlCisgKgorICoKKyAqICQkJDogbXNuZF9waW5uYWNsZS5jLHYgMS43NSAxOTk5LzAzLzIxIDE2OjUwOjA5IGFuZHJld3R2ICQkJCAkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAic291bmRfZmlybXdhcmUuaCIKKyNpZmRlZiBNU05EX0NMQVNTSUMKKyMgaWZuZGVmIF9fYWxwaGFfXworIyAgZGVmaW5lIFNMT1dJTworIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSAibXNuZC5oIgorI2lmZGVmIE1TTkRfQ0xBU1NJQworIyAgaWZkZWYgQ09ORklHX01TTkRDTEFTX0hBVkVfQk9PVAorIyAgICBkZWZpbmUgSEFWRV9EU1BDT0RFSAorIyAgZW5kaWYKKyMgIGluY2x1ZGUgIm1zbmRfY2xhc3NpYy5oIgorIyAgZGVmaW5lIExPR05BTUUJCQkibXNuZF9jbGFzc2ljIgorI2Vsc2UKKyMgIGlmZGVmIENPTkZJR19NU05EUElOX0hBVkVfQk9PVAorIyAgICBkZWZpbmUgSEFWRV9EU1BDT0RFSAorIyAgZW5kaWYKKyMgIGluY2x1ZGUgIm1zbmRfcGlubmFjbGUuaCIKKyMgIGRlZmluZSBMT0dOQU1FCQkJIm1zbmRfcGlubmFjbGUiCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfTVNORF9XUklURV9OREVMQVkKKyMgIGRlZmluZSBDT05GSUdfTVNORF9XUklURV9OREVMQVkJMQorI2VuZGlmCisKKyNkZWZpbmUgZ2V0X3BsYXlfZGVsYXlfamlmZmllcyhzaXplKQkoKHNpemUpICogSFogKgkJCVwKKwkJCQkJIGRldi5wbGF5X3NhbXBsZV9zaXplIC8gOCAvCVwKKwkJCQkJIGRldi5wbGF5X3NhbXBsZV9yYXRlIC8JCVwKKwkJCQkJIGRldi5wbGF5X2NoYW5uZWxzKQorCisjZGVmaW5lIGdldF9yZWNfZGVsYXlfamlmZmllcyhzaXplKQkoKHNpemUpICogSFogKgkJCVwKKwkJCQkJIGRldi5yZWNfc2FtcGxlX3NpemUgLyA4IC8JXAorCQkJCQkgZGV2LnJlY19zYW1wbGVfcmF0ZSAvCQlcCisJCQkJCSBkZXYucmVjX2NoYW5uZWxzKQorCitzdGF0aWMgbXVsdGlzb3VuZF9kZXZfdAkJCWRldjsKKworI2lmbmRlZiBIQVZFX0RTUENPREVICitzdGF0aWMgY2hhcgkJCQkqZHNwaW5pLCAqcGVybWluaTsKK3N0YXRpYyBpbnQJCQkJc2l6ZW9mX2RzcGluaSwgc2l6ZW9mX3Blcm1pbmk7CisjZW5kaWYKKworc3RhdGljIGludAkJCQlkc3BfZnVsbF9yZXNldCh2b2lkKTsKK3N0YXRpYyB2b2lkCQkJCWRzcF93cml0ZV9mbHVzaCh2b2lkKTsKKworc3RhdGljIF9faW5saW5lX18gaW50IGNoa19zZW5kX2RzcF9jbWQobXVsdGlzb3VuZF9kZXZfdCAqZGV2LCByZWdpc3RlciBCWVRFIGNtZCkKK3sKKwlpZiAobXNuZF9zZW5kX2RzcF9jbWQoZGV2LCBjbWQpID09IDApCisJCXJldHVybiAwOworCWRzcF9mdWxsX3Jlc2V0KCk7CisJcmV0dXJuIG1zbmRfc2VuZF9kc3BfY21kKGRldiwgY21kKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfcGxheV9xdWV1ZSh2b2lkKQoreworCWludCBuOworCUxQREFRRCBscERBUTsKKworCWRldi5sYXN0X3BsYXliYW5rID0gLTE7CisJd3JpdGV3KFBDVE9EU1BfT0ZGU0VUKDAgKiBEQVFEU19fc2l6ZSksIGRldi5EQVBRICsgSlFTX3dIZWFkKTsKKwl3cml0ZXcoUENUT0RTUF9PRkZTRVQoMCAqIERBUURTX19zaXplKSwgZGV2LkRBUFEgKyBKUVNfd1RhaWwpOworCisJZm9yIChuID0gMCwgbHBEQVEgPSBkZXYuYmFzZSArIERBUFFfREFUQV9CVUZGOyBuIDwgMzsgKytuLCBscERBUSArPSBEQVFEU19fc2l6ZSkgeworCQl3cml0ZXcoUENUT0RTUF9CQVNFRCgoRFdPUkQpKERBUF9CVUZGX1NJWkUgKiBuKSksIGxwREFRICsgREFRRFNfd1N0YXJ0KTsKKwkJd3JpdGV3KDAsIGxwREFRICsgREFRRFNfd1NpemUpOworCQl3cml0ZXcoMSwgbHBEQVEgKyBEQVFEU193Rm9ybWF0KTsKKwkJd3JpdGV3KGRldi5wbGF5X3NhbXBsZV9zaXplLCBscERBUSArIERBUURTX3dTYW1wbGVTaXplKTsKKwkJd3JpdGV3KGRldi5wbGF5X2NoYW5uZWxzLCBscERBUSArIERBUURTX3dDaGFubmVscyk7CisJCXdyaXRldyhkZXYucGxheV9zYW1wbGVfcmF0ZSwgbHBEQVEgKyBEQVFEU193U2FtcGxlUmF0ZSk7CisJCXdyaXRldyhISU1UX1BMQVlfRE9ORSAqIDB4MTAwICsgbiwgbHBEQVEgKyBEQVFEU193SW50TXNnKTsKKwkJd3JpdGV3KG4sIGxwREFRICsgREFRRFNfd0ZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3JlY29yZF9xdWV1ZSh2b2lkKQoreworCWludCBuOworCUxQREFRRCBscERBUTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2Lmxhc3RfcmVjYmFuayA9IDI7CisJd3JpdGV3KFBDVE9EU1BfT0ZGU0VUKDAgKiBEQVFEU19fc2l6ZSksIGRldi5EQVJRICsgSlFTX3dIZWFkKTsKKwl3cml0ZXcoUENUT0RTUF9PRkZTRVQoZGV2Lmxhc3RfcmVjYmFuayAqIERBUURTX19zaXplKSwgZGV2LkRBUlEgKyBKUVNfd1RhaWwpOworCisJLyogQ3JpdGljYWwgc2VjdGlvbjogYmFuayAxIGFjY2VzcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYubG9jaywgZmxhZ3MpOworCW1zbmRfb3V0YihIUEJMS1NFTF8xLCBkZXYuaW8gKyBIUF9CTEtTKTsKKwltZW1zZXRfaW8oZGV2LmJhc2UsIDAsIERBUl9CVUZGX1NJWkUgKiAzKTsKKwltc25kX291dGIoSFBCTEtTRUxfMCwgZGV2LmlvICsgSFBfQkxLUyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LmxvY2ssIGZsYWdzKTsKKworCWZvciAobiA9IDAsIGxwREFRID0gZGV2LmJhc2UgKyBEQVJRX0RBVEFfQlVGRjsgbiA8IDM7ICsrbiwgbHBEQVEgKz0gREFRRFNfX3NpemUpIHsKKwkJd3JpdGV3KFBDVE9EU1BfQkFTRUQoKERXT1JEKShEQVJfQlVGRl9TSVpFICogbikpICsgMHg0MDAwLCBscERBUSArIERBUURTX3dTdGFydCk7CisJCXdyaXRldyhEQVJfQlVGRl9TSVpFLCBscERBUSArIERBUURTX3dTaXplKTsKKwkJd3JpdGV3KDEsIGxwREFRICsgREFRRFNfd0Zvcm1hdCk7CisJCXdyaXRldyhkZXYucmVjX3NhbXBsZV9zaXplLCBscERBUSArIERBUURTX3dTYW1wbGVTaXplKTsKKwkJd3JpdGV3KGRldi5yZWNfY2hhbm5lbHMsIGxwREFRICsgREFRRFNfd0NoYW5uZWxzKTsKKwkJd3JpdGV3KGRldi5yZWNfc2FtcGxlX3JhdGUsIGxwREFRICsgREFRRFNfd1NhbXBsZVJhdGUpOworCQl3cml0ZXcoSElNVF9SRUNPUkRfRE9ORSAqIDB4MTAwICsgbiwgbHBEQVEgKyBEQVFEU193SW50TXNnKTsKKwkJd3JpdGV3KG4sIGxwREFRICsgREFRRFNfd0ZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3F1ZXVlcyh2b2lkKQoreworCWlmIChkZXYubW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCW1zbmRfZmlmb19tYWtlX2VtcHR5KCZkZXYuREFQRik7CisJCXJlc2V0X3BsYXlfcXVldWUoKTsKKwl9CisJaWYgKGRldi5tb2RlICYgRk1PREVfUkVBRCkgeworCQltc25kX2ZpZm9fbWFrZV9lbXB0eSgmZGV2LkRBUkYpOworCQlyZXNldF9yZWNvcmRfcXVldWUoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHNwX3NldF9mb3JtYXQoc3RydWN0IGZpbGUgKmZpbGUsIGludCB2YWwpCit7CisJaW50IGRhdGEsIGk7CisJTFBEQVFEIGxwREFRLCBscERBUlE7CisKKwlscERBUSA9IGRldi5iYXNlICsgREFQUV9EQVRBX0JVRkY7CisJbHBEQVJRID0gZGV2LmJhc2UgKyBEQVJRX0RBVEFfQlVGRjsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBBRk1UX1U4OgorCWNhc2UgQUZNVF9TMTZfTEU6CisJCWRhdGEgPSB2YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRhdGEgPSBERUZTQU1QTEVTSVpFOworCQlicmVhazsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpLCBscERBUSArPSBEQVFEU19fc2l6ZSwgbHBEQVJRICs9IERBUURTX19zaXplKSB7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXdyaXRldyhkYXRhLCBscERBUSArIERBUURTX3dTYW1wbGVTaXplKTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQl3cml0ZXcoZGF0YSwgbHBEQVJRICsgREFRRFNfd1NhbXBsZVNpemUpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWRldi5wbGF5X3NhbXBsZV9zaXplID0gZGF0YTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJZGV2LnJlY19zYW1wbGVfc2l6ZSA9IGRhdGE7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBkc3BfZ2V0X2ZyYWdfc2l6ZSh2b2lkKQoreworCWludCBzaXplOworCXNpemUgPSBkZXYuZmlmb3NpemUgLyA0OworCWlmIChzaXplID4gMzIgKiAxMDI0KQorCQlzaXplID0gMzIgKiAxMDI0OworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGRzcF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHZhbCwgaSwgZGF0YSwgdG1wOworCUxQREFRRCBscERBUSwgbHBEQVJROworICAgICAgICBhdWRpb19idWZfaW5mbyBhYmluZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlscERBUSA9IGRldi5iYXNlICsgREFQUV9EQVRBX0JVRkY7CisJbHBEQVJRID0gZGV2LmJhc2UgKyBEQVJRX0RBVEFfQlVGRjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwljYXNlIFNORENUTF9EU1BfTUFQSU5CVUY6CisJY2FzZSBTTkRDVExfRFNQX01BUE9VVEJVRjoKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi5sb2NrLCBmbGFncyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IGRzcF9nZXRfZnJhZ19zaXplKCk7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gZGV2LkRBUEYubiAtIGRldi5EQVBGLmxlbjsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IGRldi5EQVBGLm4gLyBhYmluZm8uZnJhZ3NpemU7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyAvIGFiaW5mby5mcmFnc2l6ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi5sb2NrLCBmbGFncyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IGRzcF9nZXRfZnJhZ19zaXplKCk7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gZGV2LkRBUkYubiAtIGRldi5EQVJGLmxlbjsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IGRldi5EQVJGLm4gLyBhYmluZm8uZnJhZ3NpemU7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyAvIGFiaW5mby5mcmFnc2l6ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlkZXYubnJlc2V0cyA9IDA7CisJCXJlc2V0X3F1ZXVlcygpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlkc3Bfd3JpdGVfZmx1c2goKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJdG1wID0gZHNwX2dldF9mcmFnX3NpemUoKTsKKwkJaWYgKHB1dF91c2VyKHRtcCwgcCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKKwkJdmFsID0gQUZNVF9TMTZfTEUgfCBBRk1UX1U4OworCQlpZiAocHV0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJZGF0YSA9IHZhbCA9PSBBRk1UX1FVRVJZCisJCQkJPyBkZXYucGxheV9zYW1wbGVfc2l6ZQorCQkJCTogZHNwX3NldF9mb3JtYXQoZmlsZSwgdmFsKTsKKwkJZWxzZQorCQkJZGF0YSA9IHZhbCA9PSBBRk1UX1FVRVJZCisJCQkJPyBkZXYucmVjX3NhbXBsZV9zaXplCisJCQkJOiBkc3Bfc2V0X2Zvcm1hdChmaWxlLCB2YWwpOworCisJCWlmIChwdXRfdXNlcihkYXRhLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKwkJaWYgKCF0ZXN0X2JpdChGX0RJU0FCTEVfV1JJVEVfTkRFTEFZLCAmZGV2LmZsYWdzKSAmJgorCQkgICAgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlkZXYucGxheV9uZGVsYXkgPSAxOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCWRldi5yZWNfbmRlbGF5ID0gMTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJdmFsID0gRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX0JBVENIOworCQlpZiAocHV0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodmFsIDwgODAwMCkKKwkJCXZhbCA9IDgwMDA7CisKKwkJaWYgKHZhbCA+IDQ4MDAwKQorCQkJdmFsID0gNDgwMDA7CisKKwkJZGF0YSA9IHZhbDsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgKytpLCBscERBUSArPSBEQVFEU19fc2l6ZSwgbHBEQVJRICs9IERBUURTX19zaXplKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQkJd3JpdGV3KGRhdGEsIGxwREFRICsgREFRRFNfd1NhbXBsZVJhdGUpOworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQkJd3JpdGV3KGRhdGEsIGxwREFSUSArIERBUURTX3dTYW1wbGVSYXRlKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlkZXYucGxheV9zYW1wbGVfcmF0ZSA9IGRhdGE7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJZGV2LnJlY19zYW1wbGVfcmF0ZSA9IGRhdGE7CisKKwkJaWYgKHB1dF91c2VyKGRhdGEsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNtZCA9PSBTTkRDVExfRFNQX0NIQU5ORUxTKSB7CisJCQlzd2l0Y2ggKHZhbCkgeworCQkJY2FzZSAxOgorCQkJY2FzZSAyOgorCQkJCWRhdGEgPSB2YWw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXZhbCA9IGRhdGEgPSAyOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoICh2YWwpIHsKKwkJCWNhc2UgMDoKKwkJCQlkYXRhID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdmFsID0gMTsKKwkJCWNhc2UgMToKKwkJCQlkYXRhID0gMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCAzOyArK2ksIGxwREFRICs9IERBUURTX19zaXplLCBscERBUlEgKz0gREFRRFNfX3NpemUpIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCQl3cml0ZXcoZGF0YSwgbHBEQVEgKyBEQVFEU193Q2hhbm5lbHMpOworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQkJd3JpdGV3KGRhdGEsIGxwREFSUSArIERBUURTX3dDaGFubmVscyk7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJZGV2LnBsYXlfY2hhbm5lbHMgPSBkYXRhOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCWRldi5yZWNfY2hhbm5lbHMgPSBkYXRhOworCisJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IG1peGVyX2dldChpbnQgZCkKK3sKKwlpZiAoZCA+IDMxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZCkgeworCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCWNhc2UgU09VTkRfTUlYRVJfUENNOgorCWNhc2UgU09VTkRfTUlYRVJfTElORToKKwljYXNlIFNPVU5EX01JWEVSX0lNSVg6CisJY2FzZSBTT1VORF9NSVhFUl9MSU5FMToKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKKyNlbmRpZgorCQlyZXR1cm4gKGRldi5sZWZ0X2xldmVsc1tkXSA+PiA4KSAqIDEwMCAvIDB4ZmYgfCAKKwkJCSgoKGRldi5yaWdodF9sZXZlbHNbZF0gPj4gOCkgKiAxMDAgLyAweGZmKSA8PCA4KTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKyNkZWZpbmUgdXBkYXRlX3ZvbG0oYSxiKQkJCQkJCVwKKwl3cml0ZXcoKGRldi5sZWZ0X2xldmVsc1thXSA+PiAxKSAqCQkJCVwKKwkgICAgICAgcmVhZHcoZGV2LlNNQSArIFNNQV93Q3Vyck1hc3RWb2xMZWZ0KSAvIDB4ZmZmZiwJXAorCSAgICAgICBkZXYuU01BICsgU01BXyMjYiMjTGVmdCk7CQkJCVwKKwl3cml0ZXcoKGRldi5yaWdodF9sZXZlbHNbYV0gPj4gMSkgICoJCQlcCisJICAgICAgIHJlYWR3KGRldi5TTUEgKyBTTUFfd0N1cnJNYXN0Vm9sUmlnaHQpIC8gMHhmZmZmLAlcCisJICAgICAgIGRldi5TTUEgKyBTTUFfIyNiIyNSaWdodCk7CisKKyNkZWZpbmUgdXBkYXRlX3BvdG0oZCxzLGFyKQkJCQkJCVwKKwl3cml0ZWIoKGRldi5sZWZ0X2xldmVsc1tkXSA+PiA4KSAqCQkJCVwKKwkgICAgICAgcmVhZHcoZGV2LlNNQSArIFNNQV93Q3Vyck1hc3RWb2xMZWZ0KSAvIDB4ZmZmZiwJXAorCSAgICAgICBkZXYuU01BICsgU01BXyMjcyMjTGVmdCk7CQkJCVwKKwl3cml0ZWIoKGRldi5yaWdodF9sZXZlbHNbZF0gPj4gOCkgKgkJCQlcCisJICAgICAgIHJlYWR3KGRldi5TTUEgKyBTTUFfd0N1cnJNYXN0Vm9sUmlnaHQpIC8gMHhmZmZmLAlcCisJICAgICAgIGRldi5TTUEgKyBTTUFfIyNzIyNSaWdodCk7CQkJCVwKKwlpZiAobXNuZF9zZW5kX3dvcmQoJmRldiwgMCwgMCwgYXIpID09IDApCQkJXAorCQljaGtfc2VuZF9kc3BfY21kKCZkZXYsIEhERVhfQVVYX1JFUSk7CisKKyNkZWZpbmUgdXBkYXRlX3BvdChkLHMsYXIpCQkJCVwKKwl3cml0ZWIoZGV2LmxlZnRfbGV2ZWxzW2RdID4+IDgsCQlcCisJICAgICAgIGRldi5TTUEgKyBTTUFfIyNzIyNMZWZ0KTsJCVwKKwl3cml0ZWIoZGV2LnJpZ2h0X2xldmVsc1tkXSA+PiA4LAkJXAorCSAgICAgICBkZXYuU01BICsgU01BXyMjcyMjUmlnaHQpOwkJXAorCWlmIChtc25kX3NlbmRfd29yZCgmZGV2LCAwLCAwLCBhcikgPT0gMCkJXAorCQljaGtfc2VuZF9kc3BfY21kKCZkZXYsIEhERVhfQVVYX1JFUSk7CisKK3N0YXRpYyBpbnQgbWl4ZXJfc2V0KGludCBkLCBpbnQgdmFsdWUpCit7CisJaW50IGxlZnQgPSB2YWx1ZSAmIDB4MDAwMDAwZmY7CisJaW50IHJpZ2h0ID0gKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4gODsKKwlpbnQgYkxlZnQsIGJSaWdodDsKKwlpbnQgd0xlZnQsIHdSaWdodDsKKwlpbnQgdXBkYXRlbWFzdGVyID0gMDsKKworCWlmIChkID4gMzEpCisJCXJldHVybiAtRUlOVkFMOworCisJYkxlZnQgPSBsZWZ0ICogMHhmZiAvIDEwMDsKKwl3TGVmdCA9IGxlZnQgKiAweGZmZmYgLyAxMDA7CisKKwliUmlnaHQgPSByaWdodCAqIDB4ZmYgLyAxMDA7CisJd1JpZ2h0ID0gcmlnaHQgKiAweGZmZmYgLyAxMDA7CisKKwlkZXYubGVmdF9sZXZlbHNbZF0gPSB3TGVmdDsKKwlkZXYucmlnaHRfbGV2ZWxzW2RdID0gd1JpZ2h0OworCisJc3dpdGNoIChkKSB7CisJCS8qIG1hc3RlciB2b2x1bWUgdW5zY2FsZWQgY29udHJvbHMgKi8KKwljYXNlIFNPVU5EX01JWEVSX0xJTkU6CQkJLyogbGluZSBwb3QgY29udHJvbCAqLworCQkvKiBzY2FsZWQgYnkgSU1JWCBpbiBkaWdpdGFsIG1peCAqLworCQl3cml0ZWIoYkxlZnQsIGRldi5TTUEgKyBTTUFfYkluUG90UG9zTGVmdCk7CisJCXdyaXRlYihiUmlnaHQsIGRldi5TTUEgKyBTTUFfYkluUG90UG9zUmlnaHQpOworCQlpZiAobXNuZF9zZW5kX3dvcmQoJmRldiwgMCwgMCwgSERFWEFSX0lOX1NFVF9QT1RTKSA9PSAwKQorCQkJY2hrX3NlbmRfZHNwX2NtZCgmZGV2LCBIREVYX0FVWF9SRVEpOworCQlicmVhazsKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJY2FzZSBTT1VORF9NSVhFUl9NSUM6CQkJLyogbWljIHBvdCBjb250cm9sICovCisJCS8qIHNjYWxlZCBieSBJTUlYIGluIGRpZ2l0YWwgbWl4ICovCisJCXdyaXRlYihiTGVmdCwgZGV2LlNNQSArIFNNQV9iTWljUG90UG9zTGVmdCk7CisJCXdyaXRlYihiUmlnaHQsIGRldi5TTUEgKyBTTUFfYk1pY1BvdFBvc1JpZ2h0KTsKKwkJaWYgKG1zbmRfc2VuZF93b3JkKCZkZXYsIDAsIDAsIEhERVhBUl9NSUNfU0VUX1BPVFMpID09IDApCisJCQljaGtfc2VuZF9kc3BfY21kKCZkZXYsIEhERVhfQVVYX1JFUSk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CQkvKiBtYXN0ZXIgdm9sdW1lICovCisJCXdyaXRldyh3TGVmdCwgZGV2LlNNQSArIFNNQV93Q3Vyck1hc3RWb2xMZWZ0KTsKKwkJd3JpdGV3KHdSaWdodCwgZGV2LlNNQSArIFNNQV93Q3Vyck1hc3RWb2xSaWdodCk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBTT1VORF9NSVhFUl9MSU5FMToJCQkvKiBhdXggcG90IGNvbnRyb2wgKi8KKwkJLyogc2NhbGVkIGJ5IG1hc3RlciB2b2x1bWUgKi8KKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJLyogZGlnaXRhbCBjb250cm9scyAqLworCWNhc2UgU09VTkRfTUlYRVJfU1lOVEg6CQkJLyogc3ludGggdm9sIChkc3AgbWl4KSAqLworCWNhc2UgU09VTkRfTUlYRVJfUENNOgkJCS8qIHBjbSB2b2wgKGRzcCBtaXgpICovCisJY2FzZSBTT1VORF9NSVhFUl9JTUlYOgkJCS8qIGlucHV0IG1vbml0b3IgKGRzcCBtaXgpICovCisJCS8qIHNjYWxlZCBieSBtYXN0ZXIgdm9sdW1lICovCisJCXVwZGF0ZW1hc3RlciA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHVwZGF0ZW1hc3RlcikgeworCQkvKiB1cGRhdGUgbWFzdGVyIHZvbHVtZSBzY2FsZWQgY29udHJvbHMgKi8KKwkJdXBkYXRlX3ZvbG0oU09VTkRfTUlYRVJfUENNLCB3Q3VyclBsYXlWb2wpOworCQl1cGRhdGVfdm9sbShTT1VORF9NSVhFUl9JTUlYLCB3Q3VyckluVm9sKTsKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJCXVwZGF0ZV92b2xtKFNPVU5EX01JWEVSX1NZTlRILCB3Q3Vyck1IZHJWb2wpOworI2VuZGlmCisJCXVwZGF0ZV9wb3RtKFNPVU5EX01JWEVSX0xJTkUxLCBiQXV4UG90UG9zLCBIREVYQVJfQVVYX1NFVF9QT1RTKTsKKwl9CisKKwlyZXR1cm4gbWl4ZXJfZ2V0KGQpOworfQorCitzdGF0aWMgdm9pZCBtaXhlcl9zZXR1cCh2b2lkKQoreworCXVwZGF0ZV9wb3QoU09VTkRfTUlYRVJfTElORSwgYkluUG90UG9zLCBIREVYQVJfSU5fU0VUX1BPVFMpOworCXVwZGF0ZV9wb3RtKFNPVU5EX01JWEVSX0xJTkUxLCBiQXV4UG90UG9zLCBIREVYQVJfQVVYX1NFVF9QT1RTKTsKKwl1cGRhdGVfdm9sbShTT1VORF9NSVhFUl9QQ00sIHdDdXJyUGxheVZvbCk7CisJdXBkYXRlX3ZvbG0oU09VTkRfTUlYRVJfSU1JWCwgd0N1cnJJblZvbCk7CisjaWZuZGVmIE1TTkRfQ0xBU1NJQworCXVwZGF0ZV9wb3QoU09VTkRfTUlYRVJfTUlDLCBiTWljUG90UG9zLCBIREVYQVJfTUlDX1NFVF9QT1RTKTsKKwl1cGRhdGVfdm9sbShTT1VORF9NSVhFUl9TWU5USCwgd0N1cnJNSGRyVm9sKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfcmVjc3JjKHVuc2lnbmVkIGxvbmcgcmVjc3JjKQoreworCWlmIChkZXYucmVjc3JjID09IHJlY3NyYykKKwkJcmV0dXJuIGRldi5yZWNzcmM7CisjaWZkZWYgSEFWRV9OT1JFQ1NSQworCWVsc2UgaWYgKHJlY3NyYyA9PSAwKQorCQlkZXYucmVjc3JjID0gMDsKKyNlbmRpZgorCWVsc2UKKwkJZGV2LnJlY3NyYyBePSByZWNzcmM7CisKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJaWYgKGRldi5yZWNzcmMgJiBTT1VORF9NQVNLX0lNSVgpIHsKKwkJaWYgKG1zbmRfc2VuZF93b3JkKCZkZXYsIDAsIDAsIEhERVhBUl9TRVRfQU5BX0lOKSA9PSAwKQorCQkJY2hrX3NlbmRfZHNwX2NtZCgmZGV2LCBIREVYX0FVWF9SRVEpOworCX0KKwllbHNlIGlmIChkZXYucmVjc3JjICYgU09VTkRfTUFTS19TWU5USCkgeworCQlpZiAobXNuZF9zZW5kX3dvcmQoJmRldiwgMCwgMCwgSERFWEFSX1NFVF9TWU5USF9JTikgPT0gMCkKKwkJCWNoa19zZW5kX2RzcF9jbWQoJmRldiwgSERFWF9BVVhfUkVRKTsKKwl9CisJZWxzZSBpZiAoKGRldi5yZWNzcmMgJiBTT1VORF9NQVNLX0RJR0lUQUwxKSAmJiB0ZXN0X2JpdChGX0hBVkVESUdJVEFMLCAmZGV2LmZsYWdzKSkgeworCQlpZiAobXNuZF9zZW5kX3dvcmQoJmRldiwgMCwgMCwgSERFWEFSX1NFVF9EQVRfSU4pID09IDApCisgICAgICAJCQljaGtfc2VuZF9kc3BfY21kKCZkZXYsIEhERVhfQVVYX1JFUSk7CisJfQorCWVsc2UgeworI2lmZGVmIEhBVkVfTk9SRUNTUkMKKwkJLyogU2VsZWN0IG5vIGlucHV0ICg/KSAqLworCQlkZXYucmVjc3JjID0gMDsKKyNlbHNlCisJCWRldi5yZWNzcmMgPSBTT1VORF9NQVNLX0lNSVg7CisJCWlmIChtc25kX3NlbmRfd29yZCgmZGV2LCAwLCAwLCBIREVYQVJfU0VUX0FOQV9JTikgPT0gMCkKKwkJCWNoa19zZW5kX2RzcF9jbWQoJmRldiwgSERFWF9BVVhfUkVRKTsKKyNlbmRpZgorCX0KKyNlbmRpZiAvKiBNU05EX0NMQVNTSUMgKi8KKworCXJldHVybiBkZXYucmVjc3JjOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmb3JjZV9yZWNzcmModW5zaWduZWQgbG9uZyByZWNzcmMpCit7CisJZGV2LnJlY3NyYyA9IDA7CisJcmV0dXJuIHNldF9yZWNzcmMocmVjc3JjKTsKK30KKworI2RlZmluZSBzZXRfbWl4ZXJfaW5mbygpCQkJCQkJCVwKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwkJCQkJXAorCQlzdHJsY3B5KGluZm8uaWQsICJNU05ETUlYRVIiLCBzaXplb2YoaW5mby5pZCkpOwkJCVwKKwkJc3RybGNweShpbmZvLm5hbWUsICJNdWx0aVNvdW5kIE1peGVyIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCitzdGF0aWMgaW50IG1peGVyX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfSU5GTykgeworCQltaXhlcl9pbmZvIGluZm87CisJCXNldF9taXhlcl9pbmZvKCk7CisJCWluZm8ubW9kaWZ5X2NvdW50ZXIgPSBkZXYubWl4ZXJfbW9kX2NvdW50OworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChjbWQgPT0gU09VTkRfT0xEX01JWEVSX0lORk8pIHsKKwkJX29sZF9taXhlcl9pbmZvIGluZm87CisJCXNldF9taXhlcl9pbmZvKCk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMSkgeworCQlkZXYubnJlc2V0cyA9IDA7CisJCWRzcF9mdWxsX3Jlc2V0KCk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoKChjbWQgPj4gOCkgJiAweGZmKSA9PSAnTScpIHsKKwkJaW50IHZhbCA9IDA7CisKKwkJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpIHsKKwkJCXN3aXRjaCAoY21kICYgMHhmZikgeworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl2YWwgPSBzZXRfcmVjc3JjKHZhbCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl2YWwgPSBtaXhlcl9zZXQoY21kICYgMHhmZiwgdmFsKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCSsrZGV2Lm1peGVyX21vZF9jb3VudDsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoY21kICYgMHhmZikgeworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQkJdmFsID0gZGV2LnJlY3NyYzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJCXZhbCA9ICAgU09VTkRfTUFTS19QQ00gfAorCQkJCQlTT1VORF9NQVNLX0xJTkUgfAorCQkJCQlTT1VORF9NQVNLX0lNSVggfAorCQkJCQlTT1VORF9NQVNLX0xJTkUxIHwKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJCQkJCVNPVU5EX01BU0tfTUlDIHwKKwkJCQkJU09VTkRfTUFTS19TWU5USCB8CisjZW5kaWYKKwkJCQkJU09VTkRfTUFTS19WT0xVTUU7CisJCQkJYnJlYWs7CisJCQkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKyNpZmRlZiBNU05EX0NMQVNTSUMKKwkJCQl2YWwgPSAgIDA7CisjZWxzZQorCQkJCXZhbCA9ICAgU09VTkRfTUFTS19JTUlYIHwKKwkJCQkJU09VTkRfTUFTS19TWU5USDsKKwkJCQlpZiAodGVzdF9iaXQoRl9IQVZFRElHSVRBTCwgJmRldi5mbGFncykpCisJCQkJCXZhbCB8PSBTT1VORF9NQVNLX0RJR0lUQUwxOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCQl2YWwgPSAgIFNPVU5EX0NBUF9FWENMX0lOUFVUOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWlmICgodmFsID0gbWl4ZXJfZ2V0KGNtZCAmIDB4ZmYpKSA8IDApCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOyAKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisKKwlpZiAoY21kID09IE9TU19HRVRWRVJTSU9OKSB7CisJCWludCBzb3VuZF92ZXJzaW9uID0gU09VTkRfVkVSU0lPTjsKKwkJcmV0dXJuIHB1dF91c2VyKHNvdW5kX3ZlcnNpb24sIChpbnQgX191c2VyICopYXJnKTsKKwl9CisKKwlpZiAobWlub3IgPT0gZGV2LmRzcF9taW5vcikKKwkJcmV0dXJuIGRzcF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJZWxzZSBpZiAobWlub3IgPT0gZGV2Lm1peGVyX21pbm9yKQorCQlyZXR1cm4gbWl4ZXJfaW9jdGwoY21kLCBhcmcpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGRzcF93cml0ZV9mbHVzaCh2b2lkKQoreworCWlmICghKGRldi5tb2RlICYgRk1PREVfV1JJVEUpIHx8ICF0ZXN0X2JpdChGX1dSSVRJTkcsICZkZXYuZmxhZ3MpKQorCQlyZXR1cm47CisJc2V0X2JpdChGX1dSSVRFRkxVU0gsICZkZXYuZmxhZ3MpOworCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgKKwkJJmRldi53cml0ZWZsdXNoLAorCQlnZXRfcGxheV9kZWxheV9qaWZmaWVzKGRldi5EQVBGLmxlbikpOworCWNsZWFyX2JpdChGX1dSSVRFRkxVU0gsICZkZXYuZmxhZ3MpOworCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoZ2V0X3BsYXlfZGVsYXlfamlmZmllcyhEQVBfQlVGRl9TSVpFKSk7CisJfQorCWNsZWFyX2JpdChGX1dSSVRJTkcsICZkZXYuZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkc3BfaGFsdChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoKGZpbGUgPyBmaWxlLT5mX21vZGUgOiBkZXYubW9kZSkgJiBGTU9ERV9SRUFEKSB7CisJCWNsZWFyX2JpdChGX1JFQURJTkcsICZkZXYuZmxhZ3MpOworCQljaGtfc2VuZF9kc3BfY21kKCZkZXYsIEhERVhfUkVDT1JEX1NUT1ApOworCQltc25kX2Rpc2FibGVfaXJxKCZkZXYpOworCQlpZiAoZmlsZSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgTE9HTkFNRSAiOiBTdG9wcGluZyByZWFkIGZvciAlcFxuIiwgZmlsZSk7CisJCQlkZXYubW9kZSAmPSB+Rk1PREVfUkVBRDsKKwkJfQorCQljbGVhcl9iaXQoRl9BVURJT19SRUFEX0lOVVNFLCAmZGV2LmZsYWdzKTsKKwl9CisJaWYgKChmaWxlID8gZmlsZS0+Zl9tb2RlIDogZGV2Lm1vZGUpICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHRlc3RfYml0KEZfV1JJVElORywgJmRldi5mbGFncykpIHsKKwkJCWRzcF93cml0ZV9mbHVzaCgpOworCQkJY2hrX3NlbmRfZHNwX2NtZCgmZGV2LCBIREVYX1BMQVlfU1RPUCk7CisJCX0KKwkJbXNuZF9kaXNhYmxlX2lycSgmZGV2KTsKKwkJaWYgKGZpbGUpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHIExPR05BTUUgIjogU3RvcHBpbmcgd3JpdGUgZm9yICVwXG4iLCBmaWxlKTsKKwkJCWRldi5tb2RlICY9IH5GTU9ERV9XUklURTsKKwkJfQorCQljbGVhcl9iaXQoRl9BVURJT19XUklURV9JTlVTRSwgJmRldi5mbGFncyk7CisJfQorfQorCitzdGF0aWMgaW50IGRzcF9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWRzcF9oYWx0KGZpbGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzcF9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICgoZmlsZSA/IGZpbGUtPmZfbW9kZSA6IGRldi5tb2RlKSAmIEZNT0RFX1dSSVRFKSB7CisJCXNldF9iaXQoRl9BVURJT19XUklURV9JTlVTRSwgJmRldi5mbGFncyk7CisJCWNsZWFyX2JpdChGX1dSSVRJTkcsICZkZXYuZmxhZ3MpOworCQltc25kX2ZpZm9fbWFrZV9lbXB0eSgmZGV2LkRBUEYpOworCQlyZXNldF9wbGF5X3F1ZXVlKCk7CisJCWlmIChmaWxlKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IFN0YXJ0aW5nIHdyaXRlIGZvciAlcFxuIiwgZmlsZSk7CisJCQlkZXYubW9kZSB8PSBGTU9ERV9XUklURTsKKwkJfQorCQltc25kX2VuYWJsZV9pcnEoJmRldik7CisJfQorCWlmICgoZmlsZSA/IGZpbGUtPmZfbW9kZSA6IGRldi5tb2RlKSAmIEZNT0RFX1JFQUQpIHsKKwkJc2V0X2JpdChGX0FVRElPX1JFQURfSU5VU0UsICZkZXYuZmxhZ3MpOworCQljbGVhcl9iaXQoRl9SRUFESU5HLCAmZGV2LmZsYWdzKTsKKwkJbXNuZF9maWZvX21ha2VfZW1wdHkoJmRldi5EQVJGKTsKKwkJcmVzZXRfcmVjb3JkX3F1ZXVlKCk7CisJCWlmIChmaWxlKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IFN0YXJ0aW5nIHJlYWQgZm9yICVwXG4iLCBmaWxlKTsKKwkJCWRldi5tb2RlIHw9IEZNT0RFX1JFQUQ7CisJCX0KKwkJbXNuZF9lbmFibGVfaXJxKCZkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfcGxheV9hdWRpb19wYXJhbWV0ZXJzKHZvaWQpCit7CisJZGV2LnBsYXlfc2FtcGxlX3NpemUgPSBERUZTQU1QTEVTSVpFOworCWRldi5wbGF5X3NhbXBsZV9yYXRlID0gREVGU0FNUExFUkFURTsKKwlkZXYucGxheV9jaGFubmVscyA9IERFRkNIQU5ORUxTOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF9yZWNfYXVkaW9fcGFyYW1ldGVycyh2b2lkKQoreworCWRldi5yZWNfc2FtcGxlX3NpemUgPSBERUZTQU1QTEVTSVpFOworCWRldi5yZWNfc2FtcGxlX3JhdGUgPSBERUZTQU1QTEVSQVRFOworCWRldi5yZWNfY2hhbm5lbHMgPSBERUZDSEFOTkVMUzsKK30KKworc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfYXVkaW9fcGFyYW1ldGVycyh2b2lkKQoreworCXNldF9kZWZhdWx0X3BsYXlfYXVkaW9fcGFyYW1ldGVycygpOworCXNldF9kZWZhdWx0X3JlY19hdWRpb19wYXJhbWV0ZXJzKCk7Cit9CisKK3N0YXRpYyBpbnQgZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChtaW5vciA9PSBkZXYuZHNwX21pbm9yKSB7CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYKKwkJICAgICB0ZXN0X2JpdChGX0FVRElPX1dSSVRFX0lOVVNFLCAmZGV2LmZsYWdzKSkgfHwKKwkJICAgIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmCisJCSAgICAgdGVzdF9iaXQoRl9BVURJT19SRUFEX0lOVVNFLCAmZGV2LmZsYWdzKSkpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmICgoZXJyID0gZHNwX29wZW4oZmlsZSkpID49IDApIHsKKwkJCWRldi5ucmVzZXRzID0gMDsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXNldF9kZWZhdWx0X3BsYXlfYXVkaW9fcGFyYW1ldGVycygpOworCQkJCWlmICghdGVzdF9iaXQoRl9ESVNBQkxFX1dSSVRFX05ERUxBWSwgJmRldi5mbGFncykpCisJCQkJCWRldi5wbGF5X25kZWxheSA9IChmaWxlLT5mX2ZsYWdzICYgT19OREVMQVkpID8gMSA6IDA7CisJCQkJZWxzZQorCQkJCQlkZXYucGxheV9uZGVsYXkgPSAwOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzZXRfZGVmYXVsdF9yZWNfYXVkaW9fcGFyYW1ldGVycygpOworCQkJCWRldi5yZWNfbmRlbGF5ID0gKGZpbGUtPmZfZmxhZ3MgJiBPX05ERUxBWSkgPyAxIDogMDsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmIChtaW5vciA9PSBkZXYubWl4ZXJfbWlub3IpIHsKKwkJLyogbm90aGluZyAqLworCX0gZWxzZQorCQllcnIgPSAtRUlOVkFMOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludCBlcnIgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAobWlub3IgPT0gZGV2LmRzcF9taW5vcikKKwkJZXJyID0gZHNwX3JlbGVhc2UoZmlsZSk7CisJZWxzZSBpZiAobWlub3IgPT0gZGV2Lm1peGVyX21pbm9yKSB7CisJCS8qIG5vdGhpbmcgKi8KKwl9IGVsc2UKKwkJZXJyID0gLUVJTlZBTDsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHBhY2tfREFSUV90b19EQVJGKHJlZ2lzdGVyIGludCBiYW5rKQoreworCXJlZ2lzdGVyIGludCBzaXplLCB0aW1lb3V0ID0gMzsKKwlyZWdpc3RlciBXT1JEIHdUbXA7CisJTFBEQVFEIERBUUQ7CisKKwkvKiBJbmNyZW1lbnQgdGhlIHRhaWwgYW5kIGNoZWNrIGZvciBxdWV1ZSB3cmFwICovCisJd1RtcCA9IHJlYWR3KGRldi5EQVJRICsgSlFTX3dUYWlsKSArIFBDVE9EU1BfT0ZGU0VUKERBUURTX19zaXplKTsKKwlpZiAod1RtcCA+IHJlYWR3KGRldi5EQVJRICsgSlFTX3dTaXplKSkKKwkJd1RtcCA9IDA7CisJd2hpbGUgKHdUbXAgPT0gcmVhZHcoZGV2LkRBUlEgKyBKUVNfd0hlYWQpICYmIHRpbWVvdXQtLSkKKwkJdWRlbGF5KDEpOworCXdyaXRldyh3VG1wLCBkZXYuREFSUSArIEpRU193VGFpbCk7CisKKwkvKiBHZXQgb3VyIGRpZ2l0YWwgYXVkaW8gcXVldWUgc3RydWN0ICovCisJREFRRCA9IGJhbmsgKiBEQVFEU19fc2l6ZSArIGRldi5iYXNlICsgREFSUV9EQVRBX0JVRkY7CisKKwkvKiBHZXQgbGVuZ3RoIG9mIGRhdGEgKi8KKwlzaXplID0gcmVhZHcoREFRRCArIERBUURTX3dTaXplKTsKKworCS8qIFJlYWQgZGF0YSBmcm9tIHRoZSBoZWFkICh1bnByb3RlY3RlZCBiYW5rIDEgYWNjZXNzIG9rYXkKKyAgICAgICAgICAgc2luY2UgdGhpcyBpcyBvbmx5IGNhbGxlZCBpbnNpZGUgYW4gaW50ZXJydXB0KSAqLworCW1zbmRfb3V0YihIUEJMS1NFTF8xLCBkZXYuaW8gKyBIUF9CTEtTKTsKKwltc25kX2ZpZm9fd3JpdGVfaW8oCisJCSZkZXYuREFSRiwKKwkJZGV2LmJhc2UgKyBiYW5rICogREFSX0JVRkZfU0laRSwKKwkJc2l6ZSk7CisJbXNuZF9vdXRiKEhQQkxLU0VMXzAsIGRldi5pbyArIEhQX0JMS1MpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBwYWNrX0RBUEZfdG9fREFQUShyZWdpc3RlciBpbnQgc3RhcnQpCit7CisJcmVnaXN0ZXIgV09SRCBEQVBRX3RhaWw7CisJcmVnaXN0ZXIgaW50IHByb3RlY3QgPSBzdGFydCwgbmJhbmtzID0gMDsKKwlMUERBUUQgREFRRDsKKworCURBUFFfdGFpbCA9IHJlYWR3KGRldi5EQVBRICsgSlFTX3dUYWlsKTsKKwl3aGlsZSAoREFQUV90YWlsICE9IHJlYWR3KGRldi5EQVBRICsgSlFTX3dIZWFkKSB8fCBzdGFydCkgeworCQlyZWdpc3RlciBpbnQgYmFua19udW0gPSBEQVBRX3RhaWwgLyBQQ1RPRFNQX09GRlNFVChEQVFEU19fc2l6ZSk7CisJCXJlZ2lzdGVyIGludCBuOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCS8qIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBuZXcgdGFpbCAqLworCQlpZiAocHJvdGVjdCkgeworCQkJLyogQ3JpdGljYWwgc2VjdGlvbjogcHJvdGVjdCBmaWZvIGluIG5vbi1pbnRlcnJ1cHQgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYubG9jaywgZmxhZ3MpOworCQkJbiA9IG1zbmRfZmlmb19yZWFkX2lvKAorCQkJCSZkZXYuREFQRiwKKwkJCQlkZXYuYmFzZSArIGJhbmtfbnVtICogREFQX0JVRkZfU0laRSwKKwkJCQlEQVBfQlVGRl9TSVpFKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi5sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQluID0gbXNuZF9maWZvX3JlYWRfaW8oCisJCQkJJmRldi5EQVBGLAorCQkJCWRldi5iYXNlICsgYmFua19udW0gKiBEQVBfQlVGRl9TSVpFLAorCQkJCURBUF9CVUZGX1NJWkUpOworCQl9CisJCWlmICghbikKKwkJCWJyZWFrOworCisJCWlmIChzdGFydCkKKwkJCXN0YXJ0ID0gMDsKKworCQkvKiBHZXQgb3VyIGRpZ2l0YWwgYXVkaW8gcXVldWUgc3RydWN0ICovCisJCURBUUQgPSBiYW5rX251bSAqIERBUURTX19zaXplICsgZGV2LmJhc2UgKyBEQVBRX0RBVEFfQlVGRjsKKworCQkvKiBXcml0ZSBzaXplIG9mIHRoaXMgYmFuayAqLworCQl3cml0ZXcobiwgREFRRCArIERBUURTX3dTaXplKTsKKwkJKytuYmFua3M7CisKKwkJLyogVGhlbiBhZHZhbmNlIHRoZSB0YWlsICovCisJCURBUFFfdGFpbCA9ICgrK2JhbmtfbnVtICUgMykgKiBQQ1RPRFNQX09GRlNFVChEQVFEU19fc2l6ZSk7CisJCXdyaXRldyhEQVBRX3RhaWwsIGRldi5EQVBRICsgSlFTX3dUYWlsKTsKKwkJLyogVGVsbCB0aGUgRFNQIHRvIHBsYXkgdGhlIGJhbmsgKi8KKwkJbXNuZF9zZW5kX2RzcF9jbWQoJmRldiwgSERFWF9QTEFZX1NUQVJUKTsKKwl9CisJcmV0dXJuIG5iYW5rczsKK30KKworc3RhdGljIGludCBkc3BfcmVhZChjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCBjb3VudCA9IGxlbjsKKwljaGFyICpwYWdlID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoUEFHRV9TSVpFKTsKKworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWludCBuLCBrOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWsgPSBQQUdFX1NJWkU7CisJCWlmIChrID4gY291bnQpCisJCQlrID0gY291bnQ7CisKKwkJLyogQ3JpdGljYWwgc2VjdGlvbjogcHJvdGVjdCBmaWZvIGluIG5vbi1pbnRlcnJ1cHQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi5sb2NrLCBmbGFncyk7CisJCW4gPSBtc25kX2ZpZm9fcmVhZCgmZGV2LkRBUkYsIHBhZ2UsIGspOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYubG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgcGFnZSwgbikpIHsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJ1ZiArPSBuOworCQljb3VudCAtPSBuOworCisJCWlmIChuID09IGsgJiYgY291bnQpCisJCQljb250aW51ZTsKKworCQlpZiAoIXRlc3RfYml0KEZfUkVBRElORywgJmRldi5mbGFncykgJiYgZGV2Lm1vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlkZXYubGFzdF9yZWNiYW5rID0gLTE7CisJCQlpZiAoY2hrX3NlbmRfZHNwX2NtZCgmZGV2LCBIREVYX1JFQ09SRF9TVEFSVCkgPT0gMCkKKwkJCQlzZXRfYml0KEZfUkVBRElORywgJmRldi5mbGFncyk7CisJCX0KKworCQlpZiAoZGV2LnJlY19uZGVsYXkpIHsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwkJCXJldHVybiBjb3VudCA9PSBsZW4gPyAtRUFHQUlOIDogbGVuIC0gY291bnQ7CisJCX0KKworCQlpZiAoY291bnQgPiAwKSB7CisJCQlzZXRfYml0KEZfUkVBREJMT0NLLCAmZGV2LmZsYWdzKTsKKwkJCWlmICghaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KAorCQkJCSZkZXYucmVhZGJsb2NrLAorCQkJCWdldF9yZWNfZGVsYXlfamlmZmllcyhEQVJfQlVGRl9TSVpFKSkpCisJCQkJY2xlYXJfYml0KEZfUkVBRElORywgJmRldi5mbGFncyk7CisJCQljbGVhcl9iaXQoRl9SRUFEQkxPQ0ssICZkZXYuZmxhZ3MpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCQkJCXJldHVybiAtRUlOVFI7CisJCQl9CisJCX0KKwl9CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCXJldHVybiBsZW4gLSBjb3VudDsKK30KKworc3RhdGljIGludCBkc3Bfd3JpdGUoY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgY291bnQgPSBsZW47CisJY2hhciAqcGFnZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJaW50IG4sIGs7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJayA9IFBBR0VfU0laRTsKKwkJaWYgKGsgPiBjb3VudCkKKwkJCWsgPSBjb3VudDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgYnVmLCBrKSkgeworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBDcml0aWNhbCBzZWN0aW9uOiBwcm90ZWN0IGZpZm8gaW4gbm9uLWludGVycnVwdCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LmxvY2ssIGZsYWdzKTsKKwkJbiA9IG1zbmRfZmlmb193cml0ZSgmZGV2LkRBUEYsIHBhZ2UsIGspOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYubG9jaywgZmxhZ3MpOworCQlidWYgKz0gbjsKKwkJY291bnQgLT0gbjsKKworCQlpZiAoY291bnQgJiYgbiA9PSBrKQorCQkJY29udGludWU7CisKKwkJaWYgKCF0ZXN0X2JpdChGX1dSSVRJTkcsICZkZXYuZmxhZ3MpICYmIChkZXYubW9kZSAmIEZNT0RFX1dSSVRFKSkgeworCQkJZGV2Lmxhc3RfcGxheWJhbmsgPSAtMTsKKwkJCWlmIChwYWNrX0RBUEZfdG9fREFQUSgxKSA+IDApCisJCQkJc2V0X2JpdChGX1dSSVRJTkcsICZkZXYuZmxhZ3MpOworCQl9CisKKwkJaWYgKGRldi5wbGF5X25kZWxheSkgeworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCQkJcmV0dXJuIGNvdW50ID09IGxlbiA/IC1FQUdBSU4gOiBsZW4gLSBjb3VudDsKKwkJfQorCisJCWlmIChjb3VudCA+IDApIHsKKwkJCXNldF9iaXQoRl9XUklURUJMT0NLLCAmZGV2LmZsYWdzKTsKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgKKwkJCQkmZGV2LndyaXRlYmxvY2ssCisJCQkJZ2V0X3BsYXlfZGVsYXlfamlmZmllcyhEQVBfQlVGRl9TSVpFKSk7CisJCQljbGVhcl9iaXQoRl9XUklURUJMT0NLLCAmZGV2LmZsYWdzKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorCQl9CisJfQorCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCXJldHVybiBsZW4gLSBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpZiAobWlub3IgPT0gZGV2LmRzcF9taW5vcikKKwkJcmV0dXJuIGRzcF9yZWFkKGJ1ZiwgY291bnQpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRldl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmIChtaW5vciA9PSBkZXYuZHNwX21pbm9yKQorCQlyZXR1cm4gZHNwX3dyaXRlKGJ1ZiwgY291bnQpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZXZhbF9kc3BfbXNnKHJlZ2lzdGVyIFdPUkQgd01lc3NhZ2UpCit7CisJc3dpdGNoIChISUJZVEUod01lc3NhZ2UpKSB7CisJY2FzZSBISU1UX1BMQVlfRE9ORToKKwkJaWYgKGRldi5sYXN0X3BsYXliYW5rID09IExPQllURSh3TWVzc2FnZSkgfHwgIXRlc3RfYml0KEZfV1JJVElORywgJmRldi5mbGFncykpCisJCQlicmVhazsKKwkJZGV2Lmxhc3RfcGxheWJhbmsgPSBMT0JZVEUod01lc3NhZ2UpOworCisJCWlmIChwYWNrX0RBUEZfdG9fREFQUSgwKSA8PSAwKSB7CisJCQlpZiAoIXRlc3RfYml0KEZfV1JJVEVCTE9DSywgJmRldi5mbGFncykpIHsKKwkJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZfV1JJVEVGTFVTSCwgJmRldi5mbGFncykpCisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LndyaXRlZmx1c2gpOworCQkJfQorCQkJY2xlYXJfYml0KEZfV1JJVElORywgJmRldi5mbGFncyk7CisJCX0KKworCQlpZiAodGVzdF9iaXQoRl9XUklURUJMT0NLLCAmZGV2LmZsYWdzKSkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LndyaXRlYmxvY2spOworCQlicmVhazsKKworCWNhc2UgSElNVF9SRUNPUkRfRE9ORToKKwkJaWYgKGRldi5sYXN0X3JlY2JhbmsgPT0gTE9CWVRFKHdNZXNzYWdlKSkKKwkJCWJyZWFrOworCQlkZXYubGFzdF9yZWNiYW5rID0gTE9CWVRFKHdNZXNzYWdlKTsKKworCQlwYWNrX0RBUlFfdG9fREFSRihkZXYubGFzdF9yZWNiYW5rKTsKKworCQlpZiAodGVzdF9iaXQoRl9SRUFEQkxPQ0ssICZkZXYuZmxhZ3MpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYucmVhZGJsb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIEhJTVRfRFNQOgorCQlzd2l0Y2ggKExPQllURSh3TWVzc2FnZSkpIHsKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJCWNhc2UgSElEU1BfUExBWV9VTkRFUjoKKyNlbmRpZgorCQljYXNlIEhJRFNQX0lOVF9QTEFZX1VOREVSOgorLyoJCQlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IFBsYXkgdW5kZXJmbG93XG4iKTsgKi8KKwkJCWNsZWFyX2JpdChGX1dSSVRJTkcsICZkZXYuZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBISURTUF9JTlRfUkVDT1JEX09WRVI6CisvKgkJCXByaW50ayhLRVJOX0RFQlVHIExPR05BTUUgIjogUmVjb3JkIG92ZXJmbG93XG4iKTsgKi8KKwkJCWNsZWFyX2JpdChGX1JFQURJTkcsICZkZXYuZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKy8qCQkJcHJpbnRrKEtFUk5fREVCVUcgTE9HTkFNRSAiOiBEU1AgbWVzc2FnZSAlZCAweCUwMnhcbiIsCisJCQlMT0JZVEUod01lc3NhZ2UpLCBMT0JZVEUod01lc3NhZ2UpKTsgKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisgICAgICAgIGNhc2UgSElNVF9NSURJX0lOX1VDSEFSOgorCQlpZiAoZGV2Lm1pZGlfaW5faW50ZXJydXB0KQorCQkJKCpkZXYubWlkaV9pbl9pbnRlcnJ1cHQpKCZkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisvKgkJcHJpbnRrKEtFUk5fREVCVUcgTE9HTkFNRSAiOiBISU1UIG1lc3NhZ2UgJWQgMHglMDJ4XG4iLCBISUJZVEUod01lc3NhZ2UpLCBISUJZVEUod01lc3NhZ2UpKTsgKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIFNlbmQgYWNrIHRvIERTUCAqLworCW1zbmRfaW5iKGRldi5pbyArIEhQX1JYTCk7CisKKwkvKiBFdmFsdWF0ZSBxdWV1ZWQgRFNQIG1lc3NhZ2VzICovCisJd2hpbGUgKHJlYWR3KGRldi5EU1BRICsgSlFTX3dUYWlsKSAhPSByZWFkdyhkZXYuRFNQUSArIEpRU193SGVhZCkpIHsKKwkJcmVnaXN0ZXIgV09SRCB3VG1wOworCisJCWV2YWxfZHNwX21zZyhyZWFkdyhkZXYucHdEU1BRRGF0YSArIDIqcmVhZHcoZGV2LkRTUFEgKyBKUVNfd0hlYWQpKSk7CisKKwkJaWYgKCh3VG1wID0gcmVhZHcoZGV2LkRTUFEgKyBKUVNfd0hlYWQpICsgMSkgPiByZWFkdyhkZXYuRFNQUSArIEpRU193U2l6ZSkpCisJCQl3cml0ZXcoMCwgZGV2LkRTUFEgKyBKUVNfd0hlYWQpOworCQllbHNlCisJCQl3cml0ZXcod1RtcCwgZGV2LkRTUFEgKyBKUVNfd0hlYWQpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldl9maWxlb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucmVhZAkJPSBkZXZfcmVhZCwKKwkud3JpdGUJCT0gZGV2X3dyaXRlLAorCS5pb2N0bAkJPSBkZXZfaW9jdGwsCisJLm9wZW4JCT0gZGV2X29wZW4sCisJLnJlbGVhc2UJPSBkZXZfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgcmVzZXRfZHNwKHZvaWQpCit7CisJaW50IHRpbWVvdXQgPSAxMDA7CisKKwltc25kX291dGIoSFBEU1BSRVNFVF9PTiwgZGV2LmlvICsgSFBfRFNQUik7CisJbWRlbGF5KDEpOworI2lmbmRlZiBNU05EX0NMQVNTSUMKKwlkZXYuaW5mbyA9IG1zbmRfaW5iKGRldi5pbyArIEhQX0lORk8pOworI2VuZGlmCisJbXNuZF9vdXRiKEhQRFNQUkVTRVRfT0ZGLCBkZXYuaW8gKyBIUF9EU1BSKTsKKwltZGVsYXkoMSk7CisJd2hpbGUgKHRpbWVvdXQtLSA+IDApIHsKKwkJaWYgKG1zbmRfaW5iKGRldi5pbyArIEhQX0NWUikgPT0gSFBfQ1ZSX0RFRikKKwkJCXJldHVybiAwOworCQltZGVsYXkoMSk7CisJfQorCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IENhbm5vdCByZXNldCBEU1BcbiIpOworCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX211bHRpc291bmQodm9pZCkKK3sKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJY2hhciAqeHYsICpyZXYgPSBOVUxMOworCWNoYXIgKnBpbiA9ICJQaW5uYWNsZSIsICpmaWppID0gIkZpamkiOworCWNoYXIgKnBpbmZpamkgPSAiUGlubmFjbGUvRmlqaSI7CisjZW5kaWYKKworCWlmICghcmVxdWVzdF9yZWdpb24oZGV2LmlvLCBkZXYubnVtaW8sICJwcm9iaW5nIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAocmVzZXRfZHNwKCkgPCAwKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldi5pbywgZGV2Lm51bWlvKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisjaWZkZWYgTVNORF9DTEFTU0lDCisJZGV2Lm5hbWUgPSAiQ2xhc3NpYy9UYWhpdGkvTW9udGVyZXkiOworCXByaW50ayhLRVJOX0lORk8gTE9HTkFNRSAiOiAlcywgIgorI2Vsc2UKKwlzd2l0Y2ggKGRldi5pbmZvID4+IDQpIHsKKwljYXNlIDB4ZjogeHYgPSAiPD0gMS4xNSI7IGJyZWFrOworCWNhc2UgMHgxOiB4diA9ICIxLjE4LzEuMiI7IGJyZWFrOworCWNhc2UgMHgyOiB4diA9ICIxLjMiOyBicmVhazsKKwljYXNlIDB4MzogeHYgPSAiMS40IjsgYnJlYWs7CisJZGVmYXVsdDogeHYgPSAidW5rbm93biI7IGJyZWFrOworCX0KKworCXN3aXRjaCAoZGV2LmluZm8gJiAweDcpIHsKKwljYXNlIDB4MDogcmV2ID0gIkkiOyBkZXYubmFtZSA9IHBpbjsgYnJlYWs7CisJY2FzZSAweDE6IHJldiA9ICJGIjsgZGV2Lm5hbWUgPSBwaW47IGJyZWFrOworCWNhc2UgMHgyOiByZXYgPSAiRyI7IGRldi5uYW1lID0gcGluOyBicmVhazsKKwljYXNlIDB4MzogcmV2ID0gIkgiOyBkZXYubmFtZSA9IHBpbjsgYnJlYWs7CisJY2FzZSAweDQ6IHJldiA9ICJFIjsgZGV2Lm5hbWUgPSBmaWppOyBicmVhazsKKwljYXNlIDB4NTogcmV2ID0gIkMiOyBkZXYubmFtZSA9IGZpamk7IGJyZWFrOworCWNhc2UgMHg2OiByZXYgPSAiRCI7IGRldi5uYW1lID0gZmlqaTsgYnJlYWs7CisJY2FzZSAweDc6CisJCXJldiA9ICJBLUIgKEZpamkpIG9yIEEtRSAoUGlubmFjbGUpIjsKKwkJZGV2Lm5hbWUgPSBwaW5maWppOworCQlicmVhazsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyBMT0dOQU1FICI6ICVzIHJldmlzaW9uICVzLCBYaWxpbnggdmVyc2lvbiAlcywgIgorI2VuZGlmIC8qIE1TTkRfQ0xBU1NJQyAqLworCSAgICAgICAiSS9PIDB4JXgtMHgleCwgSVJRICVkLCBtZW1vcnkgbWFwcGVkIHRvICVwLSVwXG4iLAorCSAgICAgICBkZXYubmFtZSwKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJICAgICAgIHJldiwgeHYsCisjZW5kaWYKKwkgICAgICAgZGV2LmlvLCBkZXYuaW8gKyBkZXYubnVtaW8gLSAxLAorCSAgICAgICBkZXYuaXJxLAorCSAgICAgICBkZXYuYmFzZSwgZGV2LmJhc2UgKyAweDdmZmYpOworCisJcmVsZWFzZV9yZWdpb24oZGV2LmlvLCBkZXYubnVtaW8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfc21hKHZvaWQpCit7CisJc3RhdGljIGludCBpbml0dGVkOworCVdPUkQgbWFzdFZvbExlZnQsIG1hc3RWb2xSaWdodDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgTVNORF9DTEFTU0lDCisJbXNuZF9vdXRiKGRldi5tZW1pZCwgZGV2LmlvICsgSFBfTUVNTSk7CisjZW5kaWYKKwltc25kX291dGIoSFBCTEtTRUxfMCwgZGV2LmlvICsgSFBfQkxLUyk7CisJaWYgKGluaXR0ZWQpIHsKKwkJbWFzdFZvbExlZnQgPSByZWFkdyhkZXYuU01BICsgU01BX3dDdXJyTWFzdFZvbExlZnQpOworCQltYXN0Vm9sUmlnaHQgPSByZWFkdyhkZXYuU01BICsgU01BX3dDdXJyTWFzdFZvbFJpZ2h0KTsKKwl9IGVsc2UKKwkJbWFzdFZvbExlZnQgPSBtYXN0Vm9sUmlnaHQgPSAwOworCW1lbXNldF9pbyhkZXYuYmFzZSwgMCwgMHg4MDAwKTsKKworCS8qIENyaXRpY2FsIHNlY3Rpb246IGJhbmsgMSBhY2Nlc3MgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LmxvY2ssIGZsYWdzKTsKKwltc25kX291dGIoSFBCTEtTRUxfMSwgZGV2LmlvICsgSFBfQkxLUyk7CisJbWVtc2V0X2lvKGRldi5iYXNlLCAwLCAweDgwMDApOworCW1zbmRfb3V0YihIUEJMS1NFTF8wLCBkZXYuaW8gKyBIUF9CTEtTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYubG9jaywgZmxhZ3MpOworCisJZGV2LnB3RFNQUURhdGEgPSAoZGV2LmJhc2UgKyBEU1BRX0RBVEFfQlVGRik7CisJZGV2LnB3TU9EUURhdGEgPSAoZGV2LmJhc2UgKyBNT0RRX0RBVEFfQlVGRik7CisJZGV2LnB3TUlEUURhdGEgPSAoZGV2LmJhc2UgKyBNSURRX0RBVEFfQlVGRik7CisKKwkvKiBNb3Rvcm9sYSA1Nmsgc2hhcmVkIG1lbW9yeSBiYXNlICovCisJZGV2LlNNQSA9IGRldi5iYXNlICsgU01BX1NUUlVDVF9TVEFSVDsKKworCS8qIERpZ2l0YWwgYXVkaW8gcGxheSBxdWV1ZSAqLworCWRldi5EQVBRID0gZGV2LmJhc2UgKyBEQVBRX09GRlNFVDsKKwltc25kX2luaXRfcXVldWUoZGV2LkRBUFEsIERBUFFfREFUQV9CVUZGLCBEQVBRX0JVRkZfU0laRSk7CisKKwkvKiBEaWdpdGFsIGF1ZGlvIHJlY29yZCBxdWV1ZSAqLworCWRldi5EQVJRID0gZGV2LmJhc2UgKyBEQVJRX09GRlNFVDsKKwltc25kX2luaXRfcXVldWUoZGV2LkRBUlEsIERBUlFfREFUQV9CVUZGLCBEQVJRX0JVRkZfU0laRSk7CisKKwkvKiBNSURJIG91dCBxdWV1ZSAqLworCWRldi5NT0RRID0gZGV2LmJhc2UgKyBNT0RRX09GRlNFVDsKKwltc25kX2luaXRfcXVldWUoZGV2Lk1PRFEsIE1PRFFfREFUQV9CVUZGLCBNT0RRX0JVRkZfU0laRSk7CisKKwkvKiBNSURJIGluIHF1ZXVlICovCisJZGV2Lk1JRFEgPSBkZXYuYmFzZSArIE1JRFFfT0ZGU0VUOworCW1zbmRfaW5pdF9xdWV1ZShkZXYuTUlEUSwgTUlEUV9EQVRBX0JVRkYsIE1JRFFfQlVGRl9TSVpFKTsKKworCS8qIERTUCAtPiBob3N0IG1lc3NhZ2UgcXVldWUgKi8KKwlkZXYuRFNQUSA9IGRldi5iYXNlICsgRFNQUV9PRkZTRVQ7CisJbXNuZF9pbml0X3F1ZXVlKGRldi5EU1BRLCBEU1BRX0RBVEFfQlVGRiwgRFNQUV9CVUZGX1NJWkUpOworCisJLyogU2V0dXAgc29tZSBEU1AgdmFsdWVzICovCisjaWZuZGVmIE1TTkRfQ0xBU1NJQworCXdyaXRldygxLCBkZXYuU01BICsgU01BX3dDdXJyUGxheUZvcm1hdCk7CisJd3JpdGV3KGRldi5wbGF5X3NhbXBsZV9zaXplLCBkZXYuU01BICsgU01BX3dDdXJyUGxheVNhbXBsZVNpemUpOworCXdyaXRldyhkZXYucGxheV9jaGFubmVscywgZGV2LlNNQSArIFNNQV93Q3VyclBsYXlDaGFubmVscyk7CisJd3JpdGV3KGRldi5wbGF5X3NhbXBsZV9yYXRlLCBkZXYuU01BICsgU01BX3dDdXJyUGxheVNhbXBsZVJhdGUpOworI2VuZGlmCisJd3JpdGV3KGRldi5wbGF5X3NhbXBsZV9yYXRlLCBkZXYuU01BICsgU01BX3dDYWxGcmVxQXRvRCk7CisJd3JpdGV3KG1hc3RWb2xMZWZ0LCBkZXYuU01BICsgU01BX3dDdXJyTWFzdFZvbExlZnQpOworCXdyaXRldyhtYXN0Vm9sUmlnaHQsIGRldi5TTUEgKyBTTUFfd0N1cnJNYXN0Vm9sUmlnaHQpOworI2lmbmRlZiBNU05EX0NMQVNTSUMKKwl3cml0ZWwoMHgwMDAxMDAwMCwgZGV2LlNNQSArIFNNQV9kd0N1cnJQbGF5UGl0Y2gpOworCXdyaXRlbCgweDAwMDAwMDAxLCBkZXYuU01BICsgU01BX2R3Q3VyclBsYXlSYXRlKTsKKyNlbmRpZgorCXdyaXRldygweDMwMywgZGV2LlNNQSArIFNNQV93Q3VycklucHV0VGFnQml0cyk7CisKKwlpbml0dGVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjYWxpYnJhdGVfYWRjKFdPUkQgc3JhdGUpCit7CisJd3JpdGV3KHNyYXRlLCBkZXYuU01BICsgU01BX3dDYWxGcmVxQXRvRCk7CisJaWYgKGRldi5jYWxpYnJhdGVfc2lnbmFsID09IDApCisJCXdyaXRldyhyZWFkdyhkZXYuU01BICsgU01BX3dDdXJySG9zdFN0YXR1c0ZsYWdzKQorCQkgICAgICAgfCAweDAwMDEsIGRldi5TTUEgKyBTTUFfd0N1cnJIb3N0U3RhdHVzRmxhZ3MpOworCWVsc2UKKwkJd3JpdGV3KHJlYWR3KGRldi5TTUEgKyBTTUFfd0N1cnJIb3N0U3RhdHVzRmxhZ3MpCisJCSAgICAgICAmIH4weDAwMDEsIGRldi5TTUEgKyBTTUFfd0N1cnJIb3N0U3RhdHVzRmxhZ3MpOworCWlmIChtc25kX3NlbmRfd29yZCgmZGV2LCAwLCAwLCBIREVYQVJfQ0FMX0FfVE9fRCkgPT0gMCAmJgorCSAgICBjaGtfc2VuZF9kc3BfY21kKCZkZXYsIEhERVhfQVVYX1JFUSkgPT0gMCkgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGVfdGltZW91dChIWiAvIDMpOworCQlyZXR1cm4gMDsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyBMT0dOQU1FICI6IEFEQyBjYWxpYnJhdGlvbiBmYWlsZWRcbiIpOworCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgdXBsb2FkX2RzcF9jb2RlKHZvaWQpCit7CisJbXNuZF9vdXRiKEhQQkxLU0VMXzAsIGRldi5pbyArIEhQX0JMS1MpOworI2lmbmRlZiBIQVZFX0RTUENPREVICisJSU5JVENPREVTSVpFID0gbW9kX2Zpcm13YXJlX2xvYWQoSU5JVENPREVGSUxFLCAmSU5JVENPREUpOworCWlmICghSU5JVENPREUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogRXJyb3IgbG9hZGluZyAiIElOSVRDT0RFRklMRSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJUEVSTUNPREVTSVpFID0gbW9kX2Zpcm13YXJlX2xvYWQoUEVSTUNPREVGSUxFLCAmUEVSTUNPREUpOworCWlmICghUEVSTUNPREUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogRXJyb3IgbG9hZGluZyAiIFBFUk1DT0RFRklMRSk7CisJCXZmcmVlKElOSVRDT0RFKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisjZW5kaWYKKwltZW1jcHlfdG9pbyhkZXYuYmFzZSwgUEVSTUNPREUsIFBFUk1DT0RFU0laRSk7CisJaWYgKG1zbmRfdXBsb2FkX2hvc3QoJmRldiwgSU5JVENPREUsIElOSVRDT0RFU0laRSkgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgTE9HTkFNRSAiOiBFcnJvciB1cGxvYWRpbmcgdG8gRFNQXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2lmZGVmIEhBVkVfRFNQQ09ERUgKKwlwcmludGsoS0VSTl9JTkZPIExPR05BTUUgIjogRFNQIGZpcm13YXJlIHVwbG9hZGVkIChyZXNpZGVudClcbiIpOworI2Vsc2UKKwlwcmludGsoS0VSTl9JTkZPIExPR05BTUUgIjogRFNQIGZpcm13YXJlIHVwbG9hZGVkXG4iKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfRFNQQ09ERUgKKwl2ZnJlZShJTklUQ09ERSk7CisJdmZyZWUoUEVSTUNPREUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1TTkRfQ0xBU1NJQworc3RhdGljIHZvaWQgcmVzZXRfcHJvdGV1cyh2b2lkKQoreworCW1zbmRfb3V0YihIUFBST1JFU0VUX09OLCBkZXYuaW8gKyBIUF9QUk9SKTsKKwltZGVsYXkoVElNRV9QUk9fUkVTRVQpOworCW1zbmRfb3V0YihIUFBST1JFU0VUX09GRiwgZGV2LmlvICsgSFBfUFJPUik7CisJbWRlbGF5KFRJTUVfUFJPX1JFU0VUX0RPTkUpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZSh2b2lkKQoreworCWludCBlcnIsIHRpbWVvdXQ7CisKKyNpZmRlZiBNU05EX0NMQVNTSUMKKwltc25kX291dGIoSFBXQUlUU1RBVEVfMCwgZGV2LmlvICsgSFBfV0FJVCk7CisJbXNuZF9vdXRiKEhQQklUTU9ERV8xNiwgZGV2LmlvICsgSFBfQklUTSk7CisKKwlyZXNldF9wcm90ZXVzKCk7CisjZW5kaWYKKwlpZiAoKGVyciA9IGluaXRfc21hKCkpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIExPR05BTUUgIjogQ2Fubm90IGluaXRpYWxpemUgU01BXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGVyciA9IHJlc2V0X2RzcCgpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoKGVyciA9IHVwbG9hZF9kc3BfY29kZSgpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBMT0dOQU1FICI6IENhbm5vdCB1cGxvYWQgRFNQIGNvZGVcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXRpbWVvdXQgPSAyMDA7CisJd2hpbGUgKHJlYWR3KGRldi5iYXNlKSkgeworCQltZGVsYXkoMSk7CisJCWlmICghdGltZW91dC0tKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IERTUCByZXNldCB0aW1lb3V0XG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJbWl4ZXJfc2V0dXAoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzcF9mdWxsX3Jlc2V0KHZvaWQpCit7CisJaW50IHJ2OworCisJaWYgKHRlc3RfYml0KEZfUkVTRVRUSU5HLCAmZGV2LmZsYWdzKSB8fCArK2Rldi5ucmVzZXRzID4gMTApCisJCXJldHVybiAwOworCisJc2V0X2JpdChGX1JFU0VUVElORywgJmRldi5mbGFncyk7CisJcHJpbnRrKEtFUk5fSU5GTyBMT0dOQU1FICI6IERTUCByZXNldFxuIik7CisJZHNwX2hhbHQoTlVMTCk7CQkJLyogVW5jb25kaXRpb25hbGx5IGhhbHQgKi8KKwlpZiAoKHJ2ID0gaW5pdGlhbGl6ZSgpKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBMT0dOQU1FICI6IERTUCByZXNldCBmYWlsZWRcbiIpOworCWZvcmNlX3JlY3NyYyhkZXYucmVjc3JjKTsKKwlkc3Bfb3BlbihOVUxMKTsKKwljbGVhcl9iaXQoRl9SRVNFVFRJTkcsICZkZXYuZmxhZ3MpOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IF9faW5pdCBhdHRhY2hfbXVsdGlzb3VuZCh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHJlcXVlc3RfaXJxKGRldi5pcnEsIGludHIsIDAsIGRldi5uYW1lLCAmZGV2KSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IENvdWxkbid0IGdyYWIgSVJRICVkXG4iLCBkZXYuaXJxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmVxdWVzdF9yZWdpb24oZGV2LmlvLCBkZXYubnVtaW8sIGRldi5uYW1lKTsKKworICAgICAgICBpZiAoKGVyciA9IGRzcF9mdWxsX3Jlc2V0KCkpIDwgMCkgeworCQlyZWxlYXNlX3JlZ2lvbihkZXYuaW8sIGRldi5udW1pbyk7CisJCWZyZWVfaXJxKGRldi5pcnEsICZkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gbXNuZF9yZWdpc3RlcigmZGV2KSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IFVuYWJsZSB0byByZWdpc3RlciBNdWx0aVNvdW5kXG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LmlvLCBkZXYubnVtaW8pOworCQlmcmVlX2lycShkZXYuaXJxLCAmZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGRldi5kc3BfbWlub3IgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmRldl9maWxlb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRSAiOiBVbmFibGUgdG8gcmVnaXN0ZXIgRFNQIG9wZXJhdGlvbnNcbiIpOworCQltc25kX3VucmVnaXN0ZXIoJmRldik7CisJCXJlbGVhc2VfcmVnaW9uKGRldi5pbywgZGV2Lm51bWlvKTsKKwkJZnJlZV9pcnEoZGV2LmlycSwgJmRldik7CisJCXJldHVybiBkZXYuZHNwX21pbm9yOworCX0KKworCWlmICgoZGV2Lm1peGVyX21pbm9yID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmRldl9maWxlb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRSAiOiBVbmFibGUgdG8gcmVnaXN0ZXIgbWl4ZXIgb3BlcmF0aW9uc1xuIik7CisJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoZGV2Lm1peGVyX21pbm9yKTsKKwkJbXNuZF91bnJlZ2lzdGVyKCZkZXYpOworCQlyZWxlYXNlX3JlZ2lvbihkZXYuaW8sIGRldi5udW1pbyk7CisJCWZyZWVfaXJxKGRldi5pcnEsICZkZXYpOworCQlyZXR1cm4gZGV2Lm1peGVyX21pbm9yOworCX0KKworCWRldi5leHRfbWlkaV9kZXYgPSBkZXYuaGRyX21pZGlfZGV2ID0gLTE7CisKKwlkaXNhYmxlX2lycShkZXYuaXJxKTsKKwljYWxpYnJhdGVfYWRjKGRldi5wbGF5X3NhbXBsZV9yYXRlKTsKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJZm9yY2VfcmVjc3JjKFNPVU5EX01BU0tfSU1JWCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX211bHRpc291bmQodm9pZCkKK3sKKwlyZWxlYXNlX3JlZ2lvbihkZXYuaW8sIGRldi5udW1pbyk7CisJZnJlZV9pcnEoZGV2LmlycSwgJmRldik7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihkZXYubWl4ZXJfbWlub3IpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldi5kc3BfbWlub3IpOworCW1zbmRfdW5yZWdpc3RlcigmZGV2KTsKK30KKworI2lmbmRlZiBNU05EX0NMQVNTSUMKKworLyogUGlubmFjbGUvRmlqaSBMb2dpY2FsIERldmljZSBDb25maWd1cmF0aW9uICovCisKK3N0YXRpYyBpbnQgX19pbml0IG1zbmRfd3JpdGVfY2ZnKGludCBjZmcsIGludCByZWcsIGludCB2YWx1ZSkKK3sKKwltc25kX291dGIocmVnLCBjZmcpOworCW1zbmRfb3V0Yih2YWx1ZSwgY2ZnICsgMSk7CisJaWYgKHZhbHVlICE9IG1zbmRfaW5iKGNmZyArIDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IG1zbmRfd3JpdGVfY2ZnOiBJL08gZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbmRfd3JpdGVfY2ZnX2lvMChpbnQgY2ZnLCBpbnQgbnVtLCBXT1JEIGlvKQoreworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfTE9HREVWSUNFLCBudW0pKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF93cml0ZV9jZmcoY2ZnLCBJUkVHX0lPMF9CQVNFSEksIEhJQllURShpbykpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF93cml0ZV9jZmcoY2ZnLCBJUkVHX0lPMF9CQVNFTE8sIExPQllURShpbykpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXNuZF93cml0ZV9jZmdfaW8xKGludCBjZmcsIGludCBudW0sIFdPUkQgaW8pCit7CisJaWYgKG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19MT0dERVZJQ0UsIG51bSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfSU8xX0JBU0VISSwgSElCWVRFKGlvKSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfSU8xX0JBU0VMTywgTE9CWVRFKGlvKSkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtc25kX3dyaXRlX2NmZ19pcnEoaW50IGNmZywgaW50IG51bSwgV09SRCBpcnEpCit7CisJaWYgKG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19MT0dERVZJQ0UsIG51bSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfSVJRX05VTUJFUiwgTE9CWVRFKGlycSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF93cml0ZV9jZmcoY2ZnLCBJUkVHX0lSUV9UWVBFLCBJUlFUWVBFX0VER0UpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXNuZF93cml0ZV9jZmdfbWVtKGludCBjZmcsIGludCBudW0sIGludCBtZW0pCit7CisJV09SRCB3bWVtOworCisJbWVtID4+PSA4OworCW1lbSAmPSAweGZmZjsKKwl3bWVtID0gKFdPUkQpbWVtOworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfTE9HREVWSUNFLCBudW0pKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF93cml0ZV9jZmcoY2ZnLCBJUkVHX01FTUJBU0VISSwgSElCWVRFKHdtZW0pKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19NRU1CQVNFTE8sIExPQllURSh3bWVtKSkpCisJCXJldHVybiAtRUlPOworCWlmICh3bWVtICYmIG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19NRU1DT05UUk9MLCAoTUVNVFlQRV9ISUFERFIgfCBNRU1UWVBFXzE2QklUKSkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtc25kX2FjdGl2YXRlX2xvZ2ljYWwoaW50IGNmZywgaW50IG51bSkKK3sKKwlpZiAobXNuZF93cml0ZV9jZmcoY2ZnLCBJUkVHX0xPR0RFVklDRSwgbnVtKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19BQ1RJVkFURSwgTERfQUNUSVZBVEUpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXNuZF93cml0ZV9jZmdfbG9naWNhbChpbnQgY2ZnLCBpbnQgbnVtLCBXT1JEIGlvMCwgV09SRCBpbzEsIFdPUkQgaXJxLCBpbnQgbWVtKQoreworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfTE9HREVWSUNFLCBudW0pKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF93cml0ZV9jZmdfaW8wKGNmZywgbnVtLCBpbzApKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF93cml0ZV9jZmdfaW8xKGNmZywgbnVtLCBpbzEpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF93cml0ZV9jZmdfaXJxKGNmZywgbnVtLCBpcnEpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF93cml0ZV9jZmdfbWVtKGNmZywgbnVtLCBtZW0pKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF9hY3RpdmF0ZV9sb2dpY2FsKGNmZywgbnVtKSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IG1zbmRfcGlubmFjbGVfY2ZnX2RldmljZSB7CisJV09SRCBpbzAsIGlvMSwgaXJxOworCWludCBtZW07Cit9IG1zbmRfcGlubmFjbGVfY2ZnX3RbNF07CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbmRfcGlubmFjbGVfY2ZnX2RldmljZXMoaW50IGNmZywgaW50IHJlc2V0LCBtc25kX3Bpbm5hY2xlX2NmZ190IGRldmljZSkKK3sKKwlpbnQgaTsKKworCS8qIFJlc2V0IGRldmljZXMgaWYgdG9sZCB0byAqLworCWlmIChyZXNldCkgeworCQlwcmludGsoS0VSTl9JTkZPIExPR05BTUUgIjogUmVzZXR0aW5nIGFsbCBkZXZpY2VzXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwkJCWlmIChtc25kX3dyaXRlX2NmZ19sb2dpY2FsKGNmZywgaSwgMCwgMCwgMCwgMCkpCisJCQkJcmV0dXJuIC1FSU87CisJfQorCisJLyogQ29uZmlndXJlIHNwZWNpZmllZCBkZXZpY2VzICovCisJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CQkvKiBEU1AgKi8KKwkJCWlmICghKGRldmljZVtpXS5pbzAgJiYgZGV2aWNlW2ldLmlycSAmJiBkZXZpY2VbaV0ubWVtKSkKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQljYXNlIDE6CQkvKiBNUFUgKi8KKwkJCWlmICghKGRldmljZVtpXS5pbzAgJiYgZGV2aWNlW2ldLmlycSkpCisJCQkJY29udGludWU7CisJCQlwcmludGsoS0VSTl9JTkZPIExPR05BTUUKKwkJCSAgICAgICAiOiBDb25maWd1cmluZyBNUFUgdG8gSS9PIDB4JXggSVJRICVkXG4iLAorCQkJICAgICAgIGRldmljZVtpXS5pbzAsIGRldmljZVtpXS5pcnEpOworCQkJYnJlYWs7CisJCWNhc2UgMjoJCS8qIElERSAqLworCQkJaWYgKCEoZGV2aWNlW2ldLmlvMCAmJiBkZXZpY2VbaV0uaW8xICYmIGRldmljZVtpXS5pcnEpKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRrKEtFUk5fSU5GTyBMT0dOQU1FCisJCQkgICAgICAgIjogQ29uZmlndXJpbmcgSURFIHRvIEkvTyAweCV4LCAweCV4IElSUSAlZFxuIiwKKwkJCSAgICAgICBkZXZpY2VbaV0uaW8wLCBkZXZpY2VbaV0uaW8xLCBkZXZpY2VbaV0uaXJxKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CQkvKiBKb3lzdGljayAqLworCQkJaWYgKCEoZGV2aWNlW2ldLmlvMCkpCisJCQkJY29udGludWU7CisJCQlwcmludGsoS0VSTl9JTkZPIExPR05BTUUKKwkJCSAgICAgICAiOiBDb25maWd1cmluZyBqb3lzdGljayB0byBJL08gMHgleFxuIiwKKwkJCSAgICAgICBkZXZpY2VbaV0uaW8wKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQ29uZmlndXJlIHRoZSBkZXZpY2UgKi8KKwkJaWYgKG1zbmRfd3JpdGVfY2ZnX2xvZ2ljYWwoY2ZnLCBpLCBkZXZpY2VbaV0uaW8wLCBkZXZpY2VbaV0uaW8xLCBkZXZpY2VbaV0uaXJxLCBkZXZpY2VbaV0ubWVtKSkKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKK01PRFVMRV9BVVRIT1IJCQkJKCJBbmRyZXcgVmVsaWF0aCA8YW5kcmV3dHZAdXNhLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTgkJCSgiVHVydGxlIEJlYWNoICIgTE9OR05BTUUgIiBMaW51eCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBpbyBfX2luaXRkYXRhID0JCS0xOworc3RhdGljIGludCBpcnEgX19pbml0ZGF0YSA9CQktMTsKK3N0YXRpYyBpbnQgbWVtIF9faW5pdGRhdGEgPQkJLTE7CitzdGF0aWMgaW50IHdyaXRlX25kZWxheSBfX2luaXRkYXRhID0JLTE7CisKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisvKiBQaW5uYWNsZS9GaWppIG5vbi1QblAgQ29uZmlnIFBvcnQgKi8KK3N0YXRpYyBpbnQgY2ZnIF9faW5pdGRhdGEgPQkJLTE7CisKKy8qIEV4dHJhIFBlcmlwaGVyYWwgQ29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCByZXNldCBfX2luaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgbXB1X2lvIF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBtcHVfaXJxIF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBpZGVfaW8wIF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBpZGVfaW8xIF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBpZGVfaXJxIF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBqb3lzdGlja19pbyBfX2luaXRkYXRhID0gMDsKKworLyogSWYgd2UgaGF2ZSB0aGUgZGlnaXRhbCBkYXVnaGVyYm9hcmQuLi4gKi8KK3N0YXRpYyBpbnQgZGlnaXRhbCBfX2luaXRkYXRhID0gMDsKKyNlbmRpZgorCitzdGF0aWMgaW50IGZpZm9zaXplIF9faW5pdGRhdGEgPQlERUZGSUZPU0laRTsKK3N0YXRpYyBpbnQgY2FsaWJyYXRlX3NpZ25hbCBfX2luaXRkYXRhID0gMDsKKworI2Vsc2UgLyogbm90IGEgbW9kdWxlICovCisKK3N0YXRpYyBpbnQgd3JpdGVfbmRlbGF5IF9faW5pdGRhdGEgPQktMTsKKworI2lmZGVmIE1TTkRfQ0xBU1NJQworc3RhdGljIGludCBpbyBfX2luaXRkYXRhID0JCUNPTkZJR19NU05EQ0xBU19JTzsKK3N0YXRpYyBpbnQgaXJxIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRDTEFTX0lSUTsKK3N0YXRpYyBpbnQgbWVtIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRDTEFTX01FTTsKKyNlbHNlIC8qIFBpbm5hY2xlL0ZpamkgKi8KKworc3RhdGljIGludCBpbyBfX2luaXRkYXRhID0JCUNPTkZJR19NU05EUElOX0lPOworc3RhdGljIGludCBpcnEgX19pbml0ZGF0YSA9CQlDT05GSUdfTVNORFBJTl9JUlE7CitzdGF0aWMgaW50IG1lbSBfX2luaXRkYXRhID0JCUNPTkZJR19NU05EUElOX01FTTsKKworLyogUGlubmFjbGUvRmlqaSBub24tUG5QIENvbmZpZyBQb3J0ICovCisjaWZkZWYgQ09ORklHX01TTkRQSU5fTk9OUE5QCisjICBpZm5kZWYgQ09ORklHX01TTkRQSU5fQ0ZHCisjICAgIGRlZmluZSBDT05GSUdfTVNORFBJTl9DRkcJCTB4MjUwCisjICBlbmRpZgorI2Vsc2UKKyMgIGlmZGVmIENPTkZJR19NU05EUElOX0NGRworIyAgICB1bmRlZiBDT05GSUdfTVNORFBJTl9DRkcKKyMgIGVuZGlmCisjICBkZWZpbmUgQ09ORklHX01TTkRQSU5fQ0ZHCQktMQorI2VuZGlmCitzdGF0aWMgaW50IGNmZyBfX2luaXRkYXRhID0JCUNPTkZJR19NU05EUElOX0NGRzsKKy8qIElmIG5vdCBhIG1vZHVsZSwgd2UgZG9uJ3QgbmVlZCB0byBib3RoZXIgd2l0aCByZXNldD0xICovCitzdGF0aWMgaW50IHJlc2V0OworCisvKiBFeHRyYSBQZXJpcGhlcmFsIENvbmZpZ3VyYXRpb24gKERlZmF1bHQ6IERpc2FibGUpICovCisjaWZuZGVmIENPTkZJR19NU05EUElOX01QVV9JTworIyAgZGVmaW5lIENPTkZJR19NU05EUElOX01QVV9JTwkJMAorI2VuZGlmCitzdGF0aWMgaW50IG1wdV9pbyBfX2luaXRkYXRhID0JCUNPTkZJR19NU05EUElOX01QVV9JTzsKKworI2lmbmRlZiBDT05GSUdfTVNORFBJTl9NUFVfSVJRCisjICBkZWZpbmUgQ09ORklHX01TTkRQSU5fTVBVX0lSUQkwCisjZW5kaWYKK3N0YXRpYyBpbnQgbXB1X2lycSBfX2luaXRkYXRhID0JCUNPTkZJR19NU05EUElOX01QVV9JUlE7CisKKyNpZm5kZWYgQ09ORklHX01TTkRQSU5fSURFX0lPMAorIyAgZGVmaW5lIENPTkZJR19NU05EUElOX0lERV9JTzAJMAorI2VuZGlmCitzdGF0aWMgaW50IGlkZV9pbzAgX19pbml0ZGF0YSA9CQlDT05GSUdfTVNORFBJTl9JREVfSU8wOworCisjaWZuZGVmIENPTkZJR19NU05EUElOX0lERV9JTzEKKyMgIGRlZmluZSBDT05GSUdfTVNORFBJTl9JREVfSU8xCTAKKyNlbmRpZgorc3RhdGljIGludCBpZGVfaW8xIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRQSU5fSURFX0lPMTsKKworI2lmbmRlZiBDT05GSUdfTVNORFBJTl9JREVfSVJRCisjICBkZWZpbmUgQ09ORklHX01TTkRQSU5fSURFX0lSUQkwCisjZW5kaWYKK3N0YXRpYyBpbnQgaWRlX2lycSBfX2luaXRkYXRhID0JCUNPTkZJR19NU05EUElOX0lERV9JUlE7CisKKyNpZm5kZWYgQ09ORklHX01TTkRQSU5fSk9ZU1RJQ0tfSU8KKyMgIGRlZmluZSBDT05GSUdfTVNORFBJTl9KT1lTVElDS19JTwkwCisjZW5kaWYKK3N0YXRpYyBpbnQgam95c3RpY2tfaW8gX19pbml0ZGF0YSA9CUNPTkZJR19NU05EUElOX0pPWVNUSUNLX0lPOworCisvKiBIYXZlIFNQRElGIChEaWdpdGFsKSBEYXVnaHRlcmJvYXJkICovCisjaWZuZGVmIENPTkZJR19NU05EUElOX0RJR0lUQUwKKyMgIGRlZmluZSBDT05GSUdfTVNORFBJTl9ESUdJVEFMCTAKKyNlbmRpZgorc3RhdGljIGludCBkaWdpdGFsIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRQSU5fRElHSVRBTDsKKworI2VuZGlmIC8qIE1TTkRfQ0xBU1NJQyAqLworCisjaWZuZGVmIENPTkZJR19NU05EX0ZJRk9TSVpFCisjICBkZWZpbmUgQ09ORklHX01TTkRfRklGT1NJWkUJCURFRkZJRk9TSVpFCisjZW5kaWYKK3N0YXRpYyBpbnQgZmlmb3NpemUgX19pbml0ZGF0YSA9CUNPTkZJR19NU05EX0ZJRk9TSVpFOworCisjaWZuZGVmIENPTkZJR19NU05EX0NBTFNJR05BTAorIyAgZGVmaW5lIENPTkZJR19NU05EX0NBTFNJR05BTAkJMAorI2VuZGlmCitzdGF0aWMgaW50CitjYWxpYnJhdGVfc2lnbmFsIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRfQ0FMU0lHTkFMOworI2VuZGlmIC8qIE1PRFVMRSAqLworCittb2R1bGVfcGFyYW0JCQkJKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtCQkJCShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKG1lbSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbQkJCQkod3JpdGVfbmRlbGF5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtCQkJCShmaWZvc2l6ZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbQkJCQkoY2FsaWJyYXRlX3NpZ25hbCwgaW50LCAwKTsKKyNpZm5kZWYgTVNORF9DTEFTU0lDCittb2R1bGVfcGFyYW0JCQkJKGRpZ2l0YWwsIGJvb2wsIDApOworbW9kdWxlX3BhcmFtCQkJCShjZmcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKHJlc2V0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtCQkJCShtcHVfaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKG1wdV9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKGlkZV9pbzAsIGludCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKGlkZV9pbzEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKGlkZV9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKGpveXN0aWNrX2lvLCBpbnQsIDApOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IG1zbmRfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisjaWZuZGVmIE1TTkRfQ0xBU1NJQworCXN0YXRpYyBtc25kX3Bpbm5hY2xlX2NmZ190IHBpbm5hY2xlX2RldnM7CisjZW5kaWYgLyogTVNORF9DTEFTU0lDICovCisKKwlwcmludGsoS0VSTl9JTkZPIExPR05BTUUgIjogVHVydGxlIEJlYWNoICIgTE9OR05BTUUgIiBMaW51eCBEcml2ZXIgVmVyc2lvbiAiCisJICAgICAgIFZFUlNJT04gIiwgQ29weXJpZ2h0IChDKSAxOTk4IEFuZHJldyBWZWxpYXRoXG4iKTsKKworCWlmIChpbyA9PSAtMSB8fCBpcnEgPT0gLTEgfHwgbWVtID09IC0xKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIExPR05BTUUgIjogaW8sIGlycSBhbmQgbWVtIG11c3QgYmUgc2V0XG4iKTsKKworI2lmZGVmIE1TTkRfQ0xBU1NJQworCWlmIChpbyA9PSAtMSB8fAorCSAgICAhKGlvID09IDB4MjkwIHx8CisJICAgICAgaW8gPT0gMHgyNjAgfHwKKwkgICAgICBpbyA9PSAweDI1MCB8fAorCSAgICAgIGlvID09IDB4MjQwIHx8CisJICAgICAgaW8gPT0gMHgyMzAgfHwKKwkgICAgICBpbyA9PSAweDIyMCB8fAorCSAgICAgIGlvID09IDB4MjEwIHx8CisJICAgICAgaW8gPT0gMHgzZTApKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IFwiaW9cIiAtIERTUCBJL08gYmFzZSBtdXN0IGJlIHNldCB0byAweDIxMCwgMHgyMjAsIDB4MjMwLCAweDI0MCwgMHgyNTAsIDB4MjYwLCAweDI5MCwgb3IgMHgzRTBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjZWxzZQorCWlmIChpbyA9PSAtMSB8fAorCQlpbyA8IDB4MTAwIHx8CisJCWlvID4gMHgzZTAgfHwKKwkJKGlvICUgMHgxMCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogXCJpb1wiIC0gRFNQIEkvTyBiYXNlIG11c3Qgd2l0aGluIHRoZSByYW5nZSAweDEwMCB0byAweDNFMCBhbmQgbXVzdCBiZSBldmVubHkgZGl2aXNpYmxlIGJ5IDB4MTBcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmIC8qIE1TTkRfQ0xBU1NJQyAqLworCisJaWYgKGlycSA9PSAtMSB8fAorCSAgICAhKGlycSA9PSA1IHx8CisJICAgICAgaXJxID09IDcgfHwKKwkgICAgICBpcnEgPT0gOSB8fAorCSAgICAgIGlycSA9PSAxMCB8fAorCSAgICAgIGlycSA9PSAxMSB8fAorCSAgICAgIGlycSA9PSAxMikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogXCJpcnFcIiAtIG11c3QgYmUgc2V0IHRvIDUsIDcsIDksIDEwLCAxMSBvciAxMlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtZW0gPT0gLTEgfHwKKwkgICAgIShtZW0gPT0gMHhiMDAwMCB8fAorCSAgICAgIG1lbSA9PSAweGM4MDAwIHx8CisJICAgICAgbWVtID09IDB4ZDAwMDAgfHwKKwkgICAgICBtZW0gPT0gMHhkODAwMCB8fAorCSAgICAgIG1lbSA9PSAweGUwMDAwIHx8CisJICAgICAgbWVtID09IDB4ZTgwMDApKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IFwibWVtXCIgLSBtdXN0IGJlIHNldCB0byAiCisJCSAgICAgICAiMHhiMDAwMCwgMHhjODAwMCwgMHhkMDAwMCwgMHhkODAwMCwgMHhlMDAwMCBvciAweGU4MDAwXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgTVNORF9DTEFTU0lDCisJc3dpdGNoIChpcnEpIHsKKwljYXNlIDU6IGRldi5pcnFpZCA9IEhQSVJRXzU7IGJyZWFrOworCWNhc2UgNzogZGV2LmlycWlkID0gSFBJUlFfNzsgYnJlYWs7CisJY2FzZSA5OiBkZXYuaXJxaWQgPSBIUElSUV85OyBicmVhazsKKwljYXNlIDEwOiBkZXYuaXJxaWQgPSBIUElSUV8xMDsgYnJlYWs7CisJY2FzZSAxMTogZGV2LmlycWlkID0gSFBJUlFfMTE7IGJyZWFrOworCWNhc2UgMTI6IGRldi5pcnFpZCA9IEhQSVJRXzEyOyBicmVhazsKKwl9CisKKwlzd2l0Y2ggKG1lbSkgeworCWNhc2UgMHhiMDAwMDogZGV2Lm1lbWlkID0gSFBNRU1fQjAwMDsgYnJlYWs7CisJY2FzZSAweGM4MDAwOiBkZXYubWVtaWQgPSBIUE1FTV9DODAwOyBicmVhazsKKwljYXNlIDB4ZDAwMDA6IGRldi5tZW1pZCA9IEhQTUVNX0QwMDA7IGJyZWFrOworCWNhc2UgMHhkODAwMDogZGV2Lm1lbWlkID0gSFBNRU1fRDgwMDsgYnJlYWs7CisJY2FzZSAweGUwMDAwOiBkZXYubWVtaWQgPSBIUE1FTV9FMDAwOyBicmVhazsKKwljYXNlIDB4ZTgwMDA6IGRldi5tZW1pZCA9IEhQTUVNX0U4MDA7IGJyZWFrOworCX0KKyNlbHNlCisJaWYgKGNmZyA9PSAtMSkgeworCQlwcmludGsoS0VSTl9JTkZPIExPR05BTUUgIjogQXNzdW1pbmcgUG5QIG1vZGVcbiIpOworCX0gZWxzZSBpZiAoY2ZnICE9IDB4MjUwICYmIGNmZyAhPSAweDI2MCAmJiBjZmcgIT0gMHgyNzApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBMT0dOQU1FICI6IENvbmZpZyBwb3J0IG11c3QgYmUgMHgyNTAsIDB4MjYwIG9yIDB4MjcwIChvciB1bnNwZWNpZmllZCBmb3IgUG5QIG1vZGUpXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBMT0dOQU1FICI6IE5vbi1QblAgbW9kZTogY29uZmlndXJpbmcgYXQgcG9ydCAweCV4XG4iLCBjZmcpOworCisJCS8qIERTUCAqLworCQlwaW5uYWNsZV9kZXZzWzBdLmlvMCA9IGlvOworCQlwaW5uYWNsZV9kZXZzWzBdLmlycSA9IGlycTsKKwkJcGlubmFjbGVfZGV2c1swXS5tZW0gPSBtZW07CisKKwkJLyogVGhlIGZvbGxvd2luZyBhcmUgUGlubmFjbGUgc3BlY2lmaWMgKi8KKworCQkvKiBNUFUgKi8KKwkJcGlubmFjbGVfZGV2c1sxXS5pbzAgPSBtcHVfaW87CisJCXBpbm5hY2xlX2RldnNbMV0uaXJxID0gbXB1X2lycTsKKworCQkvKiBJREUgKi8KKwkJcGlubmFjbGVfZGV2c1syXS5pbzAgPSBpZGVfaW8wOworCQlwaW5uYWNsZV9kZXZzWzJdLmlvMSA9IGlkZV9pbzE7CisJCXBpbm5hY2xlX2RldnNbMl0uaXJxID0gaWRlX2lycTsKKworCQkvKiBKb3lzdGljayAqLworCQlwaW5uYWNsZV9kZXZzWzNdLmlvMCA9IGpveXN0aWNrX2lvOworCisJCWlmICghcmVxdWVzdF9yZWdpb24oY2ZnLCAyLCAiUGlubmFjbGUvRmlqaSBDb25maWciKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogQ29uZmlnIHBvcnQgMHgleCBjb25mbGljdFxuIiwgY2ZnKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaWYgKG1zbmRfcGlubmFjbGVfY2ZnX2RldmljZXMoY2ZnLCByZXNldCwgcGlubmFjbGVfZGV2cykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IERldmljZSBjb25maWd1cmF0aW9uIGVycm9yXG4iKTsKKwkJCXJlbGVhc2VfcmVnaW9uKGNmZywgMik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbihjZmcsIDIpOworCX0KKyNlbmRpZiAvKiBNU05EX0NMQVNTSUMgKi8KKworCWlmIChmaWZvc2l6ZSA8IDE2KQorCQlmaWZvc2l6ZSA9IDE2OworCisJaWYgKGZpZm9zaXplID4gMTAyNCkKKwkJZmlmb3NpemUgPSAxMDI0OworCisJc2V0X2RlZmF1bHRfYXVkaW9fcGFyYW1ldGVycygpOworI2lmZGVmIE1TTkRfQ0xBU1NJQworCWRldi50eXBlID0gbXNuZENsYXNzaWM7CisjZWxzZQorCWRldi50eXBlID0gbXNuZFBpbm5hY2xlOworI2VuZGlmCisJZGV2LmlvID0gaW87CisJZGV2Lm51bWlvID0gRFNQX05VTUlPOworCWRldi5pcnEgPSBpcnE7CisJZGV2LmJhc2UgPSBpb3JlbWFwKG1lbSwgMHg4MDAwKTsKKwlkZXYuZmlmb3NpemUgPSBmaWZvc2l6ZSAqIDEwMjQ7CisJZGV2LmNhbGlicmF0ZV9zaWduYWwgPSBjYWxpYnJhdGVfc2lnbmFsID8gMSA6IDA7CisJZGV2LnJlY3NyYyA9IDA7CisJZGV2LmRzcHFfZGF0YV9idWZmID0gRFNQUV9EQVRBX0JVRkY7CisJZGV2LmRzcHFfYnVmZl9zaXplID0gRFNQUV9CVUZGX1NJWkU7CisJaWYgKHdyaXRlX25kZWxheSA9PSAtMSkKKwkJd3JpdGVfbmRlbGF5ID0gQ09ORklHX01TTkRfV1JJVEVfTkRFTEFZOworCWlmICh3cml0ZV9uZGVsYXkpCisJCWNsZWFyX2JpdChGX0RJU0FCTEVfV1JJVEVfTkRFTEFZLCAmZGV2LmZsYWdzKTsKKwllbHNlCisJCXNldF9iaXQoRl9ESVNBQkxFX1dSSVRFX05ERUxBWSwgJmRldi5mbGFncyk7CisjaWZuZGVmIE1TTkRfQ0xBU1NJQworCWlmIChkaWdpdGFsKQorCQlzZXRfYml0KEZfSEFWRURJR0lUQUwsICZkZXYuZmxhZ3MpOworI2VuZGlmCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LndyaXRlYmxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi5yZWFkYmxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi53cml0ZWZsdXNoKTsKKwltc25kX2ZpZm9faW5pdCgmZGV2LkRBUEYpOworCW1zbmRfZmlmb19pbml0KCZkZXYuREFSRik7CisJc3Bpbl9sb2NrX2luaXQoJmRldi5sb2NrKTsKKwlwcmludGsoS0VSTl9JTkZPIExPR05BTUUgIjogJXUgYnl0ZSBhdWRpbyBGSUZPcyAoeDIpXG4iLCBkZXYuZmlmb3NpemUpOworCWlmICgoZXJyID0gbXNuZF9maWZvX2FsbG9jKCZkZXYuREFQRiwgZGV2LmZpZm9zaXplKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IENvdWxkbid0IGFsbG9jYXRlIHdyaXRlIEZJRk9cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gbXNuZF9maWZvX2FsbG9jKCZkZXYuREFSRiwgZGV2LmZpZm9zaXplKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IENvdWxkbid0IGFsbG9jYXRlIHJlYWQgRklGT1xuIik7CisJCW1zbmRfZmlmb19mcmVlKCZkZXYuREFQRik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBwcm9iZV9tdWx0aXNvdW5kKCkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRSAiOiBQcm9iZSBmYWlsZWRcbiIpOworCQltc25kX2ZpZm9fZnJlZSgmZGV2LkRBUEYpOworCQltc25kX2ZpZm9fZnJlZSgmZGV2LkRBUkYpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gYXR0YWNoX211bHRpc291bmQoKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IEF0dGFjaCBmYWlsZWRcbiIpOworCQltc25kX2ZpZm9fZnJlZSgmZGV2LkRBUEYpOworCQltc25kX2ZpZm9fZnJlZSgmZGV2LkRBUkYpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNkbl9jbGVhbnVwKHZvaWQpCit7CisJdW5sb2FkX211bHRpc291bmQoKTsKKwltc25kX2ZpZm9fZnJlZSgmZGV2LkRBUEYpOworCW1zbmRfZmlmb19mcmVlKCZkZXYuREFSRik7Cit9CisKK21vZHVsZV9pbml0KG1zbmRfaW5pdCk7Cittb2R1bGVfZXhpdChtc2RuX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21zbmRfcGlubmFjbGUuaCBiL3NvdW5kL29zcy9tc25kX3Bpbm5hY2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1YWVmNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tc25kX3Bpbm5hY2xlLmgKQEAgLTAsMCArMSwyNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtc25kX3Bpbm5hY2xlLmgKKyAqCisgKiBUdXJ0bGUgQmVhY2ggTXVsdGlTb3VuZCBTb3VuZCBDYXJkIERyaXZlciBmb3IgTGludXgKKyAqCisgKiBTb21lIHBhcnRzIG9mIHRoaXMgaGVhZGVyIGZpbGUgd2VyZSBkZXJpdmVkIGZyb20gdGhlIFR1cnRsZSBCZWFjaAorICogTXVsdGlTb3VuZCBEcml2ZXIgRGV2ZWxvcG1lbnQgS2l0LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBBbmRyZXcgVmVsaWF0aAorICogQ29weXJpZ2h0IChDKSAxOTkzIFR1cnRsZSBCZWFjaCBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogJElkOiBtc25kX3Bpbm5hY2xlLmgsdiAxLjExIDE5OTkvMDMvMjEgMTc6MzY6MDkgYW5kcmV3dHYgRXhwICQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9fTVNORF9QSU5OQUNMRV9ICisjZGVmaW5lIF9fTVNORF9QSU5OQUNMRV9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZSBEU1BfTlVNSU8JCQkJMHgwOAorCisjZGVmaW5lIElSRUdfTE9HREVWSUNFCQkJCTB4MDcKKyNkZWZpbmUgSVJFR19BQ1RJVkFURQkJCQkweDMwCisjZGVmaW5lIExEX0FDVElWQVRFCQkJCTB4MDEKKyNkZWZpbmUgTERfRElTQUNUSVZBVEUJCQkJMHgwMAorI2RlZmluZSBJUkVHX0VFQ09OVFJPTAkJCQkweDNGCisjZGVmaW5lIElSRUdfTUVNQkFTRUhJCQkJCTB4NDAKKyNkZWZpbmUgSVJFR19NRU1CQVNFTE8JCQkJMHg0MQorI2RlZmluZSBJUkVHX01FTUNPTlRST0wJCQkJMHg0MgorI2RlZmluZSBJUkVHX01FTVJBTkdFSEkJCQkJMHg0MworI2RlZmluZSBJUkVHX01FTVJBTkdFTE8JCQkJMHg0NAorI2RlZmluZSBNRU1UWVBFXzhCSVQJCQkJMHgwMAorI2RlZmluZSBNRU1UWVBFXzE2QklUCQkJCTB4MDIKKyNkZWZpbmUgTUVNVFlQRV9SQU5HRQkJCQkweDAwCisjZGVmaW5lIE1FTVRZUEVfSElBRERSCQkJCTB4MDEKKyNkZWZpbmUgSVJFR19JTzBfQkFTRUhJCQkJCTB4NjAKKyNkZWZpbmUgSVJFR19JTzBfQkFTRUxPCQkJCTB4NjEKKyNkZWZpbmUgSVJFR19JTzFfQkFTRUhJCQkJCTB4NjIKKyNkZWZpbmUgSVJFR19JTzFfQkFTRUxPCQkJCTB4NjMKKyNkZWZpbmUgSVJFR19JUlFfTlVNQkVSCQkJCTB4NzAKKyNkZWZpbmUgSVJFR19JUlFfVFlQRQkJCQkweDcxCisjZGVmaW5lIElSUVRZUEVfSElHSAkJCQkweDAyCisjZGVmaW5lIElSUVRZUEVfTE9XCQkJCTB4MDAKKyNkZWZpbmUgSVJRVFlQRV9MRVZFTAkJCQkweDAxCisjZGVmaW5lIElSUVRZUEVfRURHRQkJCQkweDAwCisKKyNkZWZpbmUJSFBfRFNQUgkJCQkJMHgwNAorI2RlZmluZQlIUF9CTEtTCQkJCQkweDA0CisKKyNkZWZpbmUgSFBEU1BSRVNFVF9PRkYJCQkJMgorI2RlZmluZSBIUERTUFJFU0VUX09OCQkJCTAKKworI2RlZmluZSBIUEJMS1NFTF8wCQkJCTIKKyNkZWZpbmUgSFBCTEtTRUxfMQkJCQkzCisKKyNkZWZpbmUJSElNVF9EQVRfT0ZGCQkJCTB4MDMKKworI2RlZmluZQlISURTUF9QTEFZX1VOREVSCQkJMHgwMAorI2RlZmluZQlISURTUF9JTlRfUExBWV9VTkRFUgkJCTB4MDEKKyNkZWZpbmUJSElEU1BfU1NJX1RYX1VOREVSICAJCQkweDAyCisjZGVmaW5lIEhJRFNQX1JFQ1FfT1ZFUkZMT1cJCQkweDA4CisjZGVmaW5lIEhJRFNQX0lOVF9SRUNPUkRfT1ZFUgkJCTB4MDkKKyNkZWZpbmUgSElEU1BfU1NJX1JYX09WRVJGTE9XCQkJMHgwYQorCisjZGVmaW5lCUhJRFNQX01JRElfSU5fT1ZFUgkJCTB4MTAKKworI2RlZmluZQlISURTUF9NSURJX0ZSQU1FX0VSUgkJCTB4MTEKKyNkZWZpbmUJSElEU1BfTUlESV9QQVJJVFlfRVJSCQkJMHgxMgorI2RlZmluZQlISURTUF9NSURJX09WRVJSVU5fRVJSCQkJMHgxMworCisjZGVmaW5lIEhJRFNQX0lOUFVUX0NMSVBQSU5HCQkJMHgyMAorI2RlZmluZQlISURTUF9NSVhfQ0xJUFBJTkcJCQkweDMwCisjZGVmaW5lIEhJRFNQX0RBVF9JTl9PRkYJCQkweDIxCisKKyNkZWZpbmUJSERFWEFSX1NFVF9BTkFfSU4JCQkwCisjZGVmaW5lCUhERVhBUl9DTEVBUl9QRUFLUwkJCTEKKyNkZWZpbmUJSERFWEFSX0lOX1NFVF9QT1RTCQkJMgorI2RlZmluZQlIREVYQVJfQVVYX1NFVF9QT1RTCQkJMworI2RlZmluZQlIREVYQVJfQ0FMX0FfVE9fRAkJCTQKKyNkZWZpbmUJSERFWEFSX1JEX0VYVF9EU1BfQklUUwkJCTUKKworI2RlZmluZQlIREVYQVJfU0VUX1NZTlRIX0lOCQkJNAorI2RlZmluZQlIREVYQVJfUkVBRF9EQVRfSU4JCQk1CisjZGVmaW5lCUhERVhBUl9NSUNfU0VUX1BPVFMJCQk2CisjZGVmaW5lCUhERVhBUl9TRVRfREFUX0lOCQkJNworCisjZGVmaW5lIEhERVhBUl9TRVRfU1lOVEhfNDgJCQk4CisjZGVmaW5lIEhERVhBUl9TRVRfU1lOVEhfNDQJCQk5CisKKyNkZWZpbmUgVElNRV9QUk9fUkVTRVRfRE9ORQkJCTB4MDI4QQorI2RlZmluZSBUSU1FX1BST19TWVNFWAkJCQkweDAwMUUKKyNkZWZpbmUgVElNRV9QUk9fUkVTRVQJCQkJMHgwMDMyCisKKyNkZWZpbmUgQUdORAkJCQkJMHgwMQorI2RlZmluZSBTSUdOQUwJCQkJCTB4MDIKKworI2RlZmluZSBFWFRfRFNQX0JJVF9EQ0FMCQkJMHgwMDAxCisjZGVmaW5lIEVYVF9EU1BfQklUX01JRElfQ09OCQkJMHgwMDAyCisKKyNkZWZpbmUgQlVGRlNJWkUJCQkJMHg4MDAwCisjZGVmaW5lIEhPU1RRX1NJWkUJCQkJMHg0MAorCisjZGVmaW5lIFNSQU1fQ05UTF9TVEFSVAkJCQkweDdGMDAKKyNkZWZpbmUgU01BX1NUUlVDVF9TVEFSVAkJCTB4N0Y0MAorCisjZGVmaW5lIERBUF9CVUZGX1NJWkUJCQkJMHgyNDAwCisjZGVmaW5lIERBUl9CVUZGX1NJWkUJCQkJMHgyMDAwCisKKyNkZWZpbmUgREFQUV9TVFJVQ1RfU0laRQkJCTB4MTAKKyNkZWZpbmUgREFSUV9TVFJVQ1RfU0laRQkJCTB4MTAKKyNkZWZpbmUgREFQUV9CVUZGX1NJWkUJCQkJKDMgKiAweDEwKQorI2RlZmluZSBEQVJRX0JVRkZfU0laRQkJCQkoMyAqIDB4MTApCisjZGVmaW5lIE1PRFFfQlVGRl9TSVpFCQkJCTB4NDAwCisjZGVmaW5lIE1JRFFfQlVGRl9TSVpFCQkJCTB4ODAwCisjZGVmaW5lIERTUFFfQlVGRl9TSVpFCQkJCTB4NUEwCisKKyNkZWZpbmUgREFQUV9EQVRBX0JVRkYJCQkJMHg2QzAwCisjZGVmaW5lIERBUlFfREFUQV9CVUZGCQkJCTB4NkMzMAorI2RlZmluZSBNT0RRX0RBVEFfQlVGRgkJCQkweDZDNjAKKyNkZWZpbmUgTUlEUV9EQVRBX0JVRkYJCQkJMHg3MDYwCisjZGVmaW5lIERTUFFfREFUQV9CVUZGCQkJCTB4Nzg2MAorCisjZGVmaW5lIERBUFFfT0ZGU0VUCQkJCVNSQU1fQ05UTF9TVEFSVAorI2RlZmluZSBEQVJRX09GRlNFVAkJCQkoU1JBTV9DTlRMX1NUQVJUICsgMHgwOCkKKyNkZWZpbmUgTU9EUV9PRkZTRVQJCQkJKFNSQU1fQ05UTF9TVEFSVCArIDB4MTApCisjZGVmaW5lIE1JRFFfT0ZGU0VUCQkJCShTUkFNX0NOVExfU1RBUlQgKyAweDE4KQorI2RlZmluZSBEU1BRX09GRlNFVAkJCQkoU1JBTV9DTlRMX1NUQVJUICsgMHgyMCkKKworI2RlZmluZSBNT1BfV0FWRUhEUgkJCQkwCisjZGVmaW5lIE1PUF9FWFRPVVQJCQkJMQorI2RlZmluZSBNT1BfSFdJTklUCQkJCTB4ZmUKKyNkZWZpbmUgTU9QX05PTkUJCQkJMHhmZgorI2RlZmluZSBNT1BfTUFYCQkJCQkxCisKKyNkZWZpbmUgTUlQX0VYVElOCQkJCTAKKyNkZWZpbmUgTUlQX1dBVkVIRFIJCQkJMQorI2RlZmluZSBNSVBfSFdJTklUCQkJCTB4ZmUKKyNkZWZpbmUgTUlQX01BWAkJCQkJMQorCisvKiBQaW5uYWNsZS9GaWppIFNNQSBDb21tb24gRGF0YSAqLworI2RlZmluZSBTTUFfd0N1cnJQbGF5Qnl0ZXMJCQkweDAwMDAKKyNkZWZpbmUgU01BX3dDdXJyUmVjb3JkQnl0ZXMJCQkweDAwMDIKKyNkZWZpbmUgU01BX3dDdXJyUGxheVZvbExlZnQJCQkweDAwMDQKKyNkZWZpbmUgU01BX3dDdXJyUGxheVZvbFJpZ2h0CQkJMHgwMDA2CisjZGVmaW5lIFNNQV93Q3VyckluVm9sTGVmdAkJCTB4MDAwOAorI2RlZmluZSBTTUFfd0N1cnJJblZvbFJpZ2h0CQkJMHgwMDBhCisjZGVmaW5lIFNNQV93Q3Vyck1IZHJWb2xMZWZ0CQkJMHgwMDBjCisjZGVmaW5lIFNNQV93Q3Vyck1IZHJWb2xSaWdodAkJCTB4MDAwZQorI2RlZmluZSBTTUFfZHdDdXJyUGxheVBpdGNoCQkJMHgwMDEwCisjZGVmaW5lIFNNQV9kd0N1cnJQbGF5UmF0ZQkJCTB4MDAxNAorI2RlZmluZSBTTUFfd0N1cnJNSURJSU9QYXRjaAkJCTB4MDAxOAorI2RlZmluZSBTTUFfd0N1cnJQbGF5Rm9ybWF0CQkJMHgwMDFhCisjZGVmaW5lIFNNQV93Q3VyclBsYXlTYW1wbGVTaXplCQkJMHgwMDFjCisjZGVmaW5lIFNNQV93Q3VyclBsYXlDaGFubmVscwkJCTB4MDAxZQorI2RlZmluZSBTTUFfd0N1cnJQbGF5U2FtcGxlUmF0ZQkJCTB4MDAyMAorI2RlZmluZSBTTUFfd0N1cnJSZWNvcmRGb3JtYXQJCQkweDAwMjIKKyNkZWZpbmUgU01BX3dDdXJyUmVjb3JkU2FtcGxlU2l6ZQkJMHgwMDI0CisjZGVmaW5lIFNNQV93Q3VyclJlY29yZENoYW5uZWxzCQkJMHgwMDI2CisjZGVmaW5lIFNNQV93Q3VyclJlY29yZFNhbXBsZVJhdGUJCTB4MDAyOAorI2RlZmluZSBTTUFfd0N1cnJEU1BTdGF0dXNGbGFncwkJCTB4MDAyYQorI2RlZmluZSBTTUFfd0N1cnJIb3N0U3RhdHVzRmxhZ3MJCTB4MDAyYworI2RlZmluZSBTTUFfd0N1cnJJbnB1dFRhZ0JpdHMJCQkweDAwMmUKKyNkZWZpbmUgU01BX3dDdXJyTGVmdFBlYWsJCQkweDAwMzAKKyNkZWZpbmUgU01BX3dDdXJyUmlnaHRQZWFrCQkJMHgwMDMyCisjZGVmaW5lIFNNQV9iTWljUG90UG9zTGVmdAkJCTB4MDAzNAorI2RlZmluZSBTTUFfYk1pY1BvdFBvc1JpZ2h0CQkJMHgwMDM1CisjZGVmaW5lIFNNQV9iTWljUG90TWF4TGVmdAkJCTB4MDAzNgorI2RlZmluZSBTTUFfYk1pY1BvdE1heFJpZ2h0CQkJMHgwMDM3CisjZGVmaW5lIFNNQV9iSW5Qb3RQb3NMZWZ0CQkJMHgwMDM4CisjZGVmaW5lIFNNQV9iSW5Qb3RQb3NSaWdodAkJCTB4MDAzOQorI2RlZmluZSBTTUFfYkF1eFBvdFBvc0xlZnQJCQkweDAwM2EKKyNkZWZpbmUgU01BX2JBdXhQb3RQb3NSaWdodAkJCTB4MDAzYgorI2RlZmluZSBTTUFfYkluUG90TWF4TGVmdAkJCTB4MDAzYworI2RlZmluZSBTTUFfYkluUG90TWF4UmlnaHQJCQkweDAwM2QKKyNkZWZpbmUgU01BX2JBdXhQb3RNYXhMZWZ0CQkJMHgwMDNlCisjZGVmaW5lIFNNQV9iQXV4UG90TWF4UmlnaHQJCQkweDAwM2YKKyNkZWZpbmUgU01BX2JJblBvdE1heE1ldGhvZAkJCTB4MDA0MAorI2RlZmluZSBTTUFfYkF1eFBvdE1heE1ldGhvZAkJCTB4MDA0MQorI2RlZmluZSBTTUFfd0N1cnJNYXN0Vm9sTGVmdAkJCTB4MDA0MgorI2RlZmluZSBTTUFfd0N1cnJNYXN0Vm9sUmlnaHQJCQkweDAwNDQKKyNkZWZpbmUgU01BX3dDYWxGcmVxQXRvRAkJCTB4MDA0NgorI2RlZmluZSBTTUFfd0N1cnJBdXhWb2xMZWZ0CQkJMHgwMDQ4CisjZGVmaW5lIFNNQV93Q3VyckF1eFZvbFJpZ2h0CQkJMHgwMDRhCisjZGVmaW5lIFNNQV93Q3VyclBsYXkxVm9sTGVmdAkJCTB4MDA0YworI2RlZmluZSBTTUFfd0N1cnJQbGF5MVZvbFJpZ2h0CQkJMHgwMDRlCisjZGVmaW5lIFNNQV93Q3VyclBsYXkyVm9sTGVmdAkJCTB4MDA1MAorI2RlZmluZSBTTUFfd0N1cnJQbGF5MlZvbFJpZ2h0CQkJMHgwMDUyCisjZGVmaW5lIFNNQV93Q3VyclBsYXkzVm9sTGVmdAkJCTB4MDA1NAorI2RlZmluZSBTTUFfd0N1cnJQbGF5M1ZvbFJpZ2h0CQkJMHgwMDU2CisjZGVmaW5lIFNNQV93Q3VyclBsYXk0Vm9sTGVmdAkJCTB4MDA1OAorI2RlZmluZSBTTUFfd0N1cnJQbGF5NFZvbFJpZ2h0CQkJMHgwMDVhCisjZGVmaW5lIFNNQV93Q3VyclBsYXkxUGVha0xlZnQJCQkweDAwNWMKKyNkZWZpbmUgU01BX3dDdXJyUGxheTFQZWFrUmlnaHQJCQkweDAwNWUKKyNkZWZpbmUgU01BX3dDdXJyUGxheTJQZWFrTGVmdAkJCTB4MDA2MAorI2RlZmluZSBTTUFfd0N1cnJQbGF5MlBlYWtSaWdodAkJCTB4MDA2MgorI2RlZmluZSBTTUFfd0N1cnJQbGF5M1BlYWtMZWZ0CQkJMHgwMDY0CisjZGVmaW5lIFNNQV93Q3VyclBsYXkzUGVha1JpZ2h0CQkJMHgwMDY2CisjZGVmaW5lIFNNQV93Q3VyclBsYXk0UGVha0xlZnQJCQkweDAwNjgKKyNkZWZpbmUgU01BX3dDdXJyUGxheTRQZWFrUmlnaHQJCQkweDAwNmEKKyNkZWZpbmUgU01BX3dDdXJyUGxheVBlYWtMZWZ0CQkJMHgwMDZjCisjZGVmaW5lIFNNQV93Q3VyclBsYXlQZWFrUmlnaHQJCQkweDAwNmUKKyNkZWZpbmUgU01BX3dDdXJyREFUU1IJCQkJMHgwMDcwCisjZGVmaW5lIFNNQV93Q3VyckRBVFJYQ0hOTAkJCTB4MDA3MgorI2RlZmluZSBTTUFfd0N1cnJEQVRUWENITkwJCQkweDAwNzQKKyNkZWZpbmUgU01BX3dDdXJyREFUUlhSYXRlCQkJMHgwMDc2CisjZGVmaW5lIFNNQV9kd0RTUFBsYXlDb3VudAkJCTB4MDA3OAorI2RlZmluZSBTTUFfX3NpemUJCQkJMHgwMDdjCisKKyNpZmRlZiBIQVZFX0RTUENPREVICisjICBpbmNsdWRlICJwbmRzcGVybS5jIgorIyAgaW5jbHVkZSAicG5kc3BpbmkuYyIKKyMgIGRlZmluZSBQRVJNQ09ERQkJcG5kc3Blcm0KKyMgIGRlZmluZSBJTklUQ09ERQkJcG5kc3BpbmkKKyMgIGRlZmluZSBQRVJNQ09ERVNJWkUJCXNpemVvZihwbmRzcGVybSkKKyMgIGRlZmluZSBJTklUQ09ERVNJWkUJCXNpemVvZihwbmRzcGluaSkKKyNlbHNlCisjICBpZm5kZWYgQ09ORklHX01TTkRQSU5fSU5JVF9GSUxFCisjICAgIGRlZmluZSBDT05GSUdfTVNORFBJTl9JTklUX0ZJTEUJCQkJXAorCQkJCSIvZXRjL3NvdW5kL3BuZHNwaW5pLmJpbiIKKyMgIGVuZGlmCisjICBpZm5kZWYgQ09ORklHX01TTkRQSU5fUEVSTV9GSUxFCisjICAgIGRlZmluZSBDT05GSUdfTVNORFBJTl9QRVJNX0ZJTEUJCQkJXAorCQkJCSIvZXRjL3NvdW5kL3BuZHNwZXJtLmJpbiIKKyMgIGVuZGlmCisjICBkZWZpbmUgUEVSTUNPREVGSUxFCQlDT05GSUdfTVNORFBJTl9QRVJNX0ZJTEUKKyMgIGRlZmluZSBJTklUQ09ERUZJTEUJCUNPTkZJR19NU05EUElOX0lOSVRfRklMRQorIyAgZGVmaW5lIFBFUk1DT0RFCQlkc3BpbmkKKyMgIGRlZmluZSBJTklUQ09ERQkJcGVybWluaQorIyAgZGVmaW5lIFBFUk1DT0RFU0laRQkJc2l6ZW9mX2RzcGluaQorIyAgZGVmaW5lIElOSVRDT0RFU0laRQkJc2l6ZW9mX3Blcm1pbmkKKyNlbmRpZgorI2RlZmluZSBMT05HTkFNRQkJIk11bHRpU291bmQgKFBpbm5hY2xlL0ZpamkpIgorCisjZW5kaWYgLyogX19NU05EX1BJTk5BQ0xFX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9uZWNfdnJjNTQ3Ny5jIGIvc291bmQvb3NzL25lY192cmM1NDc3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4MWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9uZWNfdnJjNTQ3Ny5jCkBAIC0wLDAgKzEsMjA1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogSnVuIFN1biwganN1bkBtdmlzdGEuY29tIG9yIGpzdW5AanVuc3VuLm5ldAorICoKKyAqIGRyaXZlcnMvc291bmQvbmVjX3ZyYzU0NzcuYworICogICAgIEFDOTcgc291bmQgZGlydmVyIGZvciBORUMgVnJjNTQ3NyBjaGlwIChhbiBpbnRlZ3JhdGVkLCAKKyAqICAgICBtdWx0aS1mdW5jdGlvbiBjb250cm9sbGVyIGNoaXAgZm9yIE1JUFMgQ1BVcykKKyAqCisgKiBWUkEgc3VwcG9ydCBDb3B5cmlnaHQgMjAwMSBCcmFkbGV5IEQuIExhUm9uZGUgPGJyYWRAbHRjLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gaXRlODE3Mi5jLCB3aGljaCBpcyB3cml0dGVuIGJ5IFN0ZXZlIExvbmdlcmJlYW0uCisgKgorICogRmVhdHVyZXM6CisgKiAgIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBjYXBhYmlsaXRpZXM6CisgKgkuIG1vbm8gb3V0cHV0IHRvIFBDTSBML1IgKGxpbmUgb3V0KS4KKyAqCS4gc3RlcmVvIG91dHB1dCB0byBQQ00gTC9SIChsaW5lIG91dCkuCisgKgkuIG1vbm8gaW5wdXQgZnJvbSBQQ00gTCAobGluZSBpbikuCisgKgkuIHN0ZXJlbyBvdXRwdXQgZnJvbSBQQ00gKGxpbmUgaW4pLgorICoJLiBzYW1wbGluZyByYXRlIGF0IDQ4ayBvciB2YXJpYWJsZSBzYW1wbGluZyByYXRlIAorICoJLiBzdXBwb3J0IC9kZXYvZHNwLCAvZGV2L21peGVyIGRldmljZXMsIHN0YW5kYXJkIE9TUyBkZXZpY2VzLgorICoJLiBvbmx5IHN1cHBvcnQgMTYtYml0IFBDTSBmb3JtYXQgKGhhcmR3YXJlIGxpbWl0LCBubyBzb2Z0d2FyZQorICoJICB0cmFuc2xhdGlvbikgCisgKgkuIHN1cHBvcnQgZHVwbGV4LCBidXQgbm8gdHJpZ2dlciBvciByZWFsdGltZS4KKyAqCQorICogICBTcGVjaWZpY2FsbHkgdGhlIGZvbGxvd2luZyBhcmUgbm90IHN1cHBvcnRlZDoKKyAqCS4gYXBwLXNldCBmcmFnIHNpemUuCisgKgkuIG1tYXAnZWQgYnVmZmVyIGFjY2VzcworICovCisKKy8qIAorICogT3JpZ2luYWwgY29tbWVudHMgZnJvbSBpdGU4MTcyLmMgZmlsZS4KKyAqLworCisvKgorICoKKyAqIE5vdGVzOgorICoKKyAqICAxLiBNdWNoIG9mIHRoZSBPU1MgYnVmZmVyIGFsbG9jYXRpb24sIGlvY3RsJ3MsIGFuZCBtbWFwJ2luZyBhcmUKKyAqICAgICB0YWtlbiwgc2xpZ2h0bHkgbW9kaWZpZWQgb3Igbm90IGF0IGFsbCwgZnJvbSB0aGUgRVMxMzcxIGRyaXZlciwKKyAqICAgICBzbyByZWZlciB0byB0aGUgY3JlZGl0cyBpbiBlczEzNzEuYyBmb3IgdGhvc2UuIFRoZSByZXN0IG9mIHRoZQorICogICAgIGNvZGUgKHByb2JlLCBvcGVuLCByZWFkLCB3cml0ZSwgdGhlIElTUiwgZXRjLikgaXMgbmV3LgorICogIDIuIFRoZSBmb2xsb3dpbmcgc3VwcG9ydCBpcyB1bnRlc3RlZDoKKyAqICAgICAgKiBNZW1vcnkgbWFwcGluZyB0aGUgYXVkaW8gYnVmZmVycywgYW5kIHRoZSBpb2N0bCBjb250cm9scyB0aGF0IGdvCisgKiAgICAgICAgd2l0aCBpdC4KKyAqICAgICAgKiBTL1BESUYgb3V0cHV0LgorICogIDMuIFRoZSBmb2xsb3dpbmcgaXMgbm90IHN1cHBvcnRlZDoKKyAqICAgICAgKiBJMlMgaW5wdXQuCisgKiAgICAgICogbGVnYWN5IGF1ZGlvIG1vZGUuCisgKiAgNC4gU3VwcG9ydCBmb3Igdm9sdW1lIGJ1dHRvbiBpbnRlcnJ1cHRzIGlzIGltcGxlbWVudGVkIGJ1dCBkb2Vzbid0CisgKiAgICAgd29yayB5ZXQuCisgKgorICogIFJldmlzaW9uIGhpc3RvcnkKKyAqICAgIDAyLjA4LjIwMDEgIDAuMSAgIEluaXRpYWwgcmVsZWFzZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLWRlYnVnIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogI3VuZGVmIFZSQzU0NzdfQUM5N19ERUJVRyAqLworI2RlZmluZSBWUkM1NDc3X0FDOTdfREVCVUcKKworI3VuZGVmIFZSQzU0NzdfQUM5N19WRVJCT1NFX0RFQlVHCisvKiAjZGVmaW5lIFZSQzU0NzdfQUM5N19WRVJCT1NFX0RFQlVHICovCisKKyNpZiBkZWZpbmVkKFZSQzU0NzdfQUM5N19WRVJCT1NFX0RFQlVHKQorI2RlZmluZSBWUkM1NDc3X0FDOTdfREVCVUcKKyNlbmRpZgorCisjaWYgZGVmaW5lZChWUkM1NDc3X0FDOTdfREVCVUcpCisjZGVmaW5lIEFTU0VSVCh4KSAgaWYgKCEoeCkpIHsgXAorCXBhbmljKCJhc3NlcnRpb24gZmFpbGVkIGF0ICVzOiVkOiAlc1xuIiwgX19GSUxFX18sIF9fTElORV9fLCAjeCk7IH0KKyNlbHNlCisjZGVmaW5lCUFTU0VSVCh4KQorI2VuZGlmIC8qIFZSQzU0NzdfQUM5N19ERUJVRyAqLworCisjaWYgZGVmaW5lZChWUkM1NDc3X0FDOTdfVkVSQk9TRV9ERUJVRykKK3N0YXRpYyB1MTYgaW5UaWNrZXQ7IAkJLyogY2hlY2sgc3luYyBiZXR3ZWVuIGludHIgJiB3cml0ZSAqLworc3RhdGljIHUxNiBvdXRUaWNrZXQ7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyN1bmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAwLCAxLCAxLCAyIH07CisKKyNkZWZpbmUgICAgICAgICBWUkM1NDc3X0lOVF9DTFIgICAgICAgICAweDAKKyNkZWZpbmUgICAgICAgICBWUkM1NDc3X0lOVF9TVEFUVVMJMHgwCisjZGVmaW5lICAgICAgICAgVlJDNTQ3N19DT0RFQ19XUiAgICAgICAgMHg0CisjZGVmaW5lICAgICAgICAgVlJDNTQ3N19DT0RFQ19SRCAgICAgICAgMHg4CisjZGVmaW5lICAgICAgICAgVlJDNTQ3N19DVFJMICAgICAgICAgICAgMHgxOAorI2RlZmluZSAgICAgICAgIFZSQzU0NzdfQUNMSU5LX0NUUkwgICAgIDB4MWMKKyNkZWZpbmUgICAgICAgICBWUkM1NDc3X0lOVF9NQVNLICAgICAgICAweDI0CisKKyNkZWZpbmUJCVZSQzU0NzdfREFDMV9DVFJMCTB4MzAKKyNkZWZpbmUJCVZSQzU0NzdfREFDMUwJCTB4MzQKKyNkZWZpbmUJCVZSQzU0NzdfREFDMV9CQUREUgkweDM4CisjZGVmaW5lCQlWUkM1NDc3X0RBQzJfQ1RSTAkweDNjCisjZGVmaW5lCQlWUkM1NDc3X0RBQzJMCQkweDQwCisjZGVmaW5lCQlWUkM1NDc3X0RBQzJfQkFERFIJMHg0NAorI2RlZmluZQkJVlJDNTQ3N19EQUMzX0NUUkwJMHg0OAorI2RlZmluZQkJVlJDNTQ3N19EQUMzTAkJMHg0YworI2RlZmluZQkJVlJDNTQ3N19EQUMzX0JBRERSCTB4NTAKKworI2RlZmluZQkJVlJDNTQ3N19BREMxX0NUUkwJMHg1NAorI2RlZmluZQkJVlJDNTQ3N19BREMxTAkJMHg1OAorI2RlZmluZQkJVlJDNTQ3N19BREMxX0JBRERSCTB4NWMKKyNkZWZpbmUJCVZSQzU0NzdfQURDMl9DVFJMCTB4NjAKKyNkZWZpbmUJCVZSQzU0NzdfQURDMkwJCTB4NjQKKyNkZWZpbmUJCVZSQzU0NzdfQURDMl9CQUREUgkweDY4CisjZGVmaW5lCQlWUkM1NDc3X0FEQzNfQ1RSTAkweDZjCisjZGVmaW5lCQlWUkM1NDc3X0FEQzNMCQkweDcwCisjZGVmaW5lCQlWUkM1NDc3X0FEQzNfQkFERFIJMHg3NAorCisjZGVmaW5lCQlWUkM1NDc3X0NPREVDX1dSX1JXQwkoMSA8PCAyMykKKworI2RlZmluZQkJVlJDNTQ3N19DT0RFQ19SRF9SUkRZQQkoMSA8PCAzMSkKKyNkZWZpbmUJCVZSQzU0NzdfQ09ERUNfUkRfUlJEWUQJKDEgPDwgMzApCisKKyNkZWZpbmUJCVZSQzU0NzdfQUNMSU5LX0NUUkxfUlNUX09OCSgxIDw8IDE1KQorI2RlZmluZQkJVlJDNTQ3N19BQ0xJTktfQ1RSTF9SU1RfVElNRQkweDdmCisjZGVmaW5lCQlWUkM1NDc3X0FDTElOS19DVFJMX1NZTkNfT04JKDEgPDwgMzApCisjZGVmaW5lCQlWUkM1NDc3X0FDTElOS19DVFJMX0NLX1NUT1BfT04JKDEgPDwgMzEpCisKKyNkZWZpbmUJCVZSQzU0NzdfQ1RSTF9EQUMyRU5CCQkoMSA8PCAxNSkgCisjZGVmaW5lCQlWUkM1NDc3X0NUUkxfQURDMkVOQgkJKDEgPDwgMTQpIAorI2RlZmluZQkJVlJDNTQ3N19DVFJMX0RBQzFFTkIJCSgxIDw8IDEzKSAKKyNkZWZpbmUJCVZSQzU0NzdfQ1RSTF9BREMxRU5CCQkoMSA8PCAxMikgCisKKyNkZWZpbmUJCVZSQzU0NzdfSU5UX01BU0tfTk1BU0sJCSgxIDw8IDMxKSAKKyNkZWZpbmUJCVZSQzU0NzdfSU5UX01BU0tfREFDMUVORAkoMSA8PCA1KSAKKyNkZWZpbmUJCVZSQzU0NzdfSU5UX01BU0tfREFDMkVORAkoMSA8PCA0KSAKKyNkZWZpbmUJCVZSQzU0NzdfSU5UX01BU0tfREFDM0VORAkoMSA8PCAzKSAKKyNkZWZpbmUJCVZSQzU0NzdfSU5UX01BU0tfQURDMUVORAkoMSA8PCAyKSAKKyNkZWZpbmUJCVZSQzU0NzdfSU5UX01BU0tfQURDMkVORAkoMSA8PCAxKSAKKyNkZWZpbmUJCVZSQzU0NzdfSU5UX01BU0tfQURDM0VORAkoMSA8PCAwKSAKKworI2RlZmluZQkJVlJDNTQ3N19ETUFfQUNUSVZBVElPTgkJKDEgPDwgMzEpCisjZGVmaW5lCQlWUkM1NDc3X0RNQV9XSVAJCQkoMSA8PCAzMCkKKworCisjZGVmaW5lIFZSQzU0NzdfQUM5N19NT0RVTEVfTkFNRSAiTkVDX1ZyYzU0NzdfYXVkaW8iCisjZGVmaW5lIFBGWCBWUkM1NDc3X0FDOTdfTU9EVUxFX05BTUUgIjogIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSB7CisJLyogbGlzdCBvZiB2cmM1NDc3X2FjOTcgZGV2aWNlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2czsKKworCS8qIHRoZSBjb3JyZXNwb25kaW5nIHBjaV9kZXYgc3RydWN0dXJlICovCisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfYXVkaW87CisKKwkvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBsb25nIGlvOworCXVuc2lnbmVkIGludCBpcnE7CisKKyNpZmRlZiBWUkM1NDc3X0FDOTdfREVCVUcKKwkvKiBkZWJ1ZyAvcHJvYyBlbnRyeSAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHM7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICphYzk3X3BzOworI2VuZGlmIC8qIFZSQzU0NzdfQUM5N19ERUJVRyAqLworCisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCisJdW5zaWduZWQgZGFjQ2hhbm5lbHMsIGFkY0NoYW5uZWxzOworCXVuc2lnbmVkIHNob3J0IGRhY1JhdGUsIGFkY1JhdGU7CisJdW5zaWduZWQgc2hvcnQgZXh0ZW5kZWRfc3RhdHVzOworCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW07CisJbW9kZV90IG9wZW5fbW9kZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwlzdHJ1Y3QgZG1hYnVmIHsKKwkJdm9pZCAqbGJ1ZiwgKnJidWY7CisJCWRtYV9hZGRyX3QgbGJ1ZkRtYSwgcmJ1ZkRtYTsKKwkJdW5zaWduZWQgYnVmT3JkZXI7CisJCXVuc2lnbmVkIG51bUZyYWc7CisJCXVuc2lnbmVkIGZyYWdTaGlmdDsKKwkJdW5zaWduZWQgZnJhZ1NpemU7CS8qIHJlZHVuZGFudCAqLworCQl1bnNpZ25lZCBmcmFnVG90YWxTaXplOwkvKiA9IG51bUZyYWcgKiBmcmFnU2l6ZShyZWFsKSAgKi8KKwkJdW5zaWduZWQgbmV4dEluOworCQl1bnNpZ25lZCBuZXh0T3V0OworCQlpbnQgY291bnQ7CisJCXVuc2lnbmVkIGVycm9yOyAvKiBvdmVyL3VuZGVycnVuICovCisJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJCS8qIE9TUyBzdHVmZiAqLworCQl1bnNpZ25lZCBzdG9wcGVkOjE7CisJCXVuc2lnbmVkIHJlYWR5OjE7CisJfSBkbWFfZGFjLCBkbWFfYWRjOworCisJI2RlZmluZQlXT1JLX0JVRl9TSVpFCTIwNDgKKwlzdHJ1Y3QgeworCQl1MTYgbGNoYW5uZWw7CisJCXUxNiByY2hhbm5lbDsKKwl9IHdvcmtCdWZbV09SS19CVUZfU0laRS80XTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgTElTVF9IRUFEKGRldnMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsZDIodW5zaWduZWQgaW50IHgpCit7CisgICAgdW5zaWduZWQgciA9IDA7CisJCisgICAgaWYgKHggPj0gMHgxMDAwMCkgeworCXggPj49IDE2OworCXIgKz0gMTY7CisgICAgfQorICAgIGlmICh4ID49IDB4MTAwKSB7CisJeCA+Pj0gODsKKwlyICs9IDg7CisgICAgfQorICAgIGlmICh4ID49IDB4MTApIHsKKwl4ID4+PSA0OworCXIgKz0gNDsKKyAgICB9CisgICAgaWYgKHggPj0gNCkgeworCXggPj49IDI7CisJciArPSAyOworICAgIH0KKyAgICBpZiAoeCA+PSAyKQorCXIrKzsKKyAgICByZXR1cm4gcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1MTYgcmRjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IGFkZHIpCit7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcyA9IAorCQkoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcmVzdWx0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCS8qIHdhaXQgdW50aWwgd2UgY2FuIGFjY2VzcyBjb2RlYyByZWdpc3RlcnMgKi8KKwl3aGlsZSAoaW5sKHMtPmlvICsgVlJDNTQ3N19DT0RFQ19XUikgJiAweDgwMDAwMDAwKTsKKworCS8qIHdyaXRlIHRoZSBhZGRyZXNzIGFuZCAicmVhZCIgY29tbWFuZCB0byBjb2RlYyAqLworCWFkZHIgPSBhZGRyICYgMHg3ZjsKKwlvdXRsKChhZGRyIDw8IDE2KSB8IFZSQzU0NzdfQ09ERUNfV1JfUldDLCBzLT5pbyArIFZSQzU0NzdfQ09ERUNfV1IpOworCisJLyogZ2V0IHRoZSByZXR1cm4gcmVzdWx0ICovCisJdWRlbGF5KDEwMCk7IC8qIHdvcmthcm91bmQgaGFyZHdhcmUgYnVnICovCisJd2hpbGUgKCAocmVzdWx0ID0gaW5sKHMtPmlvICsgVlJDNTQ3N19DT0RFQ19SRCkpICYgCisgICAgICAgICAgICAgICAgKFZSQzU0NzdfQ09ERUNfUkRfUlJEWUEgfCBWUkM1NDc3X0NPREVDX1JEX1JSRFlEKSApIHsKKwkJLyogd2UgZ2V0IGVpdGhlciBhZGRyIG9yIGRhdGEsIG9yIGJvdGggKi8KKwkJaWYgKHJlc3VsdCAmIFZSQzU0NzdfQ09ERUNfUkRfUlJEWUEpIHsKKwkJCUFTU0VSVChhZGRyID09ICgocmVzdWx0ID4+IDE2KSAmIDB4N2YpICk7CisJCX0KKwkJaWYgKHJlc3VsdCAmIFZSQzU0NzdfQ09ERUNfUkRfUlJEWUQpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJlc3VsdCAmIDB4ZmZmZjsKK30KKworCitzdGF0aWMgdm9pZCB3cmNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggYWRkciwgdTE2IGRhdGEpCit7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcyA9IAorCQkoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkvKiB3YWl0IHVudGlsIHdlIGNhbiBhY2Nlc3MgY29kZWMgcmVnaXN0ZXJzICovCisJd2hpbGUgKGlubChzLT5pbyArIFZSQzU0NzdfQ09ERUNfV1IpICYgMHg4MDAwMDAwMCk7CisKKwkvKiB3cml0ZSB0aGUgYWRkcmVzcyBhbmQgdmFsdWUgdG8gY29kZWMgKi8KKwlvdXRsKChhZGRyIDw8IDE2KSB8IGRhdGEsIHMtPmlvICsgVlJDNTQ3N19DT0RFQ19XUik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgd2FpdGNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzID0gCisJCShzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKworCS8qIHdhaXQgdW50aWwgd2UgY2FuIGFjY2VzcyBjb2RlYyByZWdpc3RlcnMgKi8KKwl3aGlsZSAoaW5sKHMtPmlvICsgVlJDNTQ3N19DT0RFQ19XUikgJiAweDgwMDAwMDAwKTsKK30KKworc3RhdGljIGludCBhYzk3X2NvZGVjX25vdF9wcmVzZW50KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzID0gCisJCShzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IGNvdW50ICA9IDB4ZmZmZjsgCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJLyogd2FpdCB1bnRpbCB3ZSBjYW4gYWNjZXNzIGNvZGVjIHJlZ2lzdGVycyAqLworCWRvIHsKKwkgICAgICAgaWYgKCEoaW5sKHMtPmlvICsgVlJDNTQ3N19DT0RFQ19XUikgJiAweDgwMDAwMDAwKSkKKwkJICAgICAgIGJyZWFrOworCX0gd2hpbGUgKC0tY291bnQpOworCisJaWYgKGNvdW50ID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogd3JpdGUgMCB0byByZXNldCAqLworCW91dGwoKEFDOTdfUkVTRVQgPDwgMTYpIHwgMCwgcy0+aW8gKyBWUkM1NDc3X0NPREVDX1dSKTsKKworCS8qIHRlc3Qgd2hldGhlciB3ZSBnZXQgYSByZXNwb25zZSBmcm9tIGFjOTcgY2hpcCAqLworCWNvdW50ICA9IDB4ZmZmZjsgCisJZG8geyAKKwkgICAgICAgaWYgKCEoaW5sKHMtPmlvICsgVlJDNTQ3N19DT0RFQ19XUikgJiAweDgwMDAwMDAwKSkKKwkJICAgICAgIGJyZWFrOworCX0gd2hpbGUgKC0tY291bnQpOworCisJaWYgKGNvdW50ID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHZyYzU0NzdfYWM5N19kZWxheShpbnQgbXNlYykKK3sKKwl1bnNpZ25lZCBsb25nIHRtbzsKKwlzaWduZWQgbG9uZyB0bW8yOworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CisgICAgCisJdG1vID0gamlmZmllcyArIChtc2VjKkhaKS8xMDAwOworCWZvciAoOzspIHsKKwkJdG1vMiA9IHRtbyAtIGppZmZpZXM7CisJCWlmICh0bW8yIDw9IDApCisJCQlicmVhazsKKwkJc2NoZWR1bGVfdGltZW91dCh0bW8yKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgc2V0X2FkY19yYXRlKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fTFJfQURDX1JBVEUsIHJhdGUpOworCXMtPmFkY1JhdGUgPSByYXRlOworfQorCisKK3N0YXRpYyB2b2lkIHNldF9kYWNfcmF0ZShzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCWlmKHMtPmV4dGVuZGVkX3N0YXR1cyAmIEFDOTdfRVhUU1RBVF9WUkEpIHsKKwl3cmNvZGVjKHMtPmNvZGVjLCBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSwgcmF0ZSk7CisJCXMtPmRhY1JhdGUgPSByZGNvZGVjKHMtPmNvZGVjLCBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSk7CisJfQorfQorCitzdGF0aWMgaW50IGFjOTdfY29kZWNfbm90X3ByZXNlbnQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMgPQorCQkoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBjb3VudCAgPSAweGZmZmY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJLyogd2FpdCB1bnRpbCB3ZSBjYW4gYWNjZXNzIGNvZGVjIHJlZ2lzdGVycyAqLworCWRvIHsKKwkgICAgICAgaWYgKCEoaW5sKHMtPmlvICsgVlJDNTQ3N19DT0RFQ19XUikgJiAweDgwMDAwMDAwKSkKKwkJICAgICAgIGJyZWFrOworCX0gd2hpbGUgKC0tY291bnQpOworCisJaWYgKGNvdW50ID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogd3JpdGUgMCB0byByZXNldCAqLworCW91dGwoKEFDOTdfUkVTRVQgPDwgMTYpIHwgMCwgcy0+aW8gKyBWUkM1NDc3X0NPREVDX1dSKTsKKworCS8qIHRlc3Qgd2hldGhlciB3ZSBnZXQgYSByZXNwb25zZSBmcm9tIGFjOTcgY2hpcCAqLworCWNvdW50ICA9IDB4ZmZmZjsKKwlkbyB7CisJICAgICAgIGlmICghKGlubChzLT5pbyArIFZSQzU0NzdfQ09ERUNfV1IpICYgMHg4MDAwMDAwMCkpCisJCSAgICAgICBicmVhazsKKwl9IHdoaWxlICgtLWNvdW50KTsKKworCWlmIChjb3VudCA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gaW5saW5lIHZvaWQKK3N0b3BfZGFjKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiogZGIgPSAmcy0+ZG1hX2RhYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0ZW1wOworICAgIAorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZGItPnN0b3BwZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZGVhY3RpdmF0ZSB0aGUgZG1hICovCisJb3V0bCgwLCBzLT5pbyArIFZSQzU0NzdfREFDMV9DVFJMKTsKKwlvdXRsKDAsIHMtPmlvICsgVlJDNTQ3N19EQUMyX0NUUkwpOworCisJLyogd2FpdCBmb3IgREFNIGNvbXBsZXRlbHkgc3RvcCAqLworCXdoaWxlIChpbmwocy0+aW8gKyBWUkM1NDc3X0RBQzFfQ1RSTCkgJiBWUkM1NDc3X0RNQV9XSVApOworCXdoaWxlIChpbmwocy0+aW8gKyBWUkM1NDc3X0RBQzJfQ1RSTCkgJiBWUkM1NDc3X0RNQV9XSVApOworCisJLyogZGlzYWJsZSBkYWMgc2xvdHMgaW4gYWNsaW5rICovCisJdGVtcCA9IGlubChzLT5pbyArIFZSQzU0NzdfQ1RSTCk7CisJdGVtcCAmPSB+IChWUkM1NDc3X0NUUkxfREFDMUVOQiB8IFZSQzU0NzdfQ1RSTF9EQUMyRU5CKTsKKwlvdXRsICh0ZW1wLCBzLT5pbyArIFZSQzU0NzdfQ1RSTCk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl0ZW1wID0gaW5sKHMtPmlvICsgVlJDNTQ3N19JTlRfTUFTSyk7CisJdGVtcCAmPSB+IChWUkM1NDc3X0lOVF9NQVNLX0RBQzFFTkQgfCBWUkM1NDc3X0lOVF9NQVNLX0RBQzJFTkQpOyAKKwlvdXRsICh0ZW1wLCBzLT5pbyArIFZSQzU0NzdfSU5UX01BU0spOworCisJLyogY2xlYXIgcGVuZGluZyBvbmVzICovCisJb3V0bChWUkM1NDc3X0lOVF9NQVNLX0RBQzFFTkQgfCBWUkM1NDc3X0lOVF9NQVNLX0RBQzJFTkQsIAorCSAgICAgcy0+aW8gKyAgVlJDNTQ3N19JTlRfQ0xSKTsKKyAgICAKKwlkYi0+c3RvcHBlZCA9IDE7CisgICAgCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiogZGIgPSAmcy0+ZG1hX2RhYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBkbWFMZW5ndGg7CisJdTMyIHRlbXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFkYi0+c3RvcHBlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiB3ZSBzaG91bGQgaGF2ZSBzb21lIGRhdGEgdG8gZG8gdGhlIERNQSB0cmFzbmZlciAqLworCUFTU0VSVChkYi0+Y291bnQgPj0gZGItPmZyYWdTaXplKTsKKworCS8qIGNsZWFyIHBlbmRpbmcgZmFsZXMgaW50ZXJydXB0cyAqLworCW91dGwoVlJDNTQ3N19JTlRfTUFTS19EQUMxRU5EIHwgVlJDNTQ3N19JTlRfTUFTS19EQUMyRU5ELCAKKwkgICAgIHMtPmlvICsgIFZSQzU0NzdfSU5UX0NMUik7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCXRlbXAgPSBpbmwocy0+aW8gKyBWUkM1NDc3X0lOVF9NQVNLKTsKKwl0ZW1wIHw9IFZSQzU0NzdfSU5UX01BU0tfREFDMUVORCB8IFZSQzU0NzdfSU5UX01BU0tfREFDMkVORDsKKwlvdXRsKHRlbXAsIHMtPmlvICsgIFZSQzU0NzdfSU5UX01BU0spOworCisJLyogc2V0dXAgZG1hIGJhc2UgYWRkciAqLworCW91dGwoZGItPmxidWZEbWEgKyBkYi0+bmV4dE91dCwgcy0+aW8gKyBWUkM1NDc3X0RBQzFfQkFERFIpOworCWlmIChzLT5kYWNDaGFubmVscyA9PSAxKSB7CisJCW91dGwoZGItPmxidWZEbWEgKyBkYi0+bmV4dE91dCwgcy0+aW8gKyBWUkM1NDc3X0RBQzJfQkFERFIpOworCX0gZWxzZSB7CisJCW91dGwoZGItPnJidWZEbWEgKyBkYi0+bmV4dE91dCwgcy0+aW8gKyBWUkM1NDc3X0RBQzJfQkFERFIpOworCX0KKworCS8qIHNldCBkbWEgbGVuZ3RoLCBpbiB0aGUgdW5pdCBvZiAweDEwIGJ5dGVzICovCisJZG1hTGVuZ3RoID0gZGItPmZyYWdTaXplID4+IDQ7CisJb3V0bChkbWFMZW5ndGgsIHMtPmlvICsgVlJDNTQ3N19EQUMxTCk7CisJb3V0bChkbWFMZW5ndGgsIHMtPmlvICsgVlJDNTQ3N19EQUMyTCk7CisKKwkvKiBhY3RpdmF0ZSBkbWEgKi8KKwlvdXRsKFZSQzU0NzdfRE1BX0FDVElWQVRJT04sIHMtPmlvICsgVlJDNTQ3N19EQUMxX0NUUkwpOworCW91dGwoVlJDNTQ3N19ETUFfQUNUSVZBVElPTiwgcy0+aW8gKyBWUkM1NDc3X0RBQzJfQ1RSTCk7CisKKwkvKiBlbmFibGUgZGFjIHNsb3RzIC0gd2Ugc2hvdWxkIGhlYXIgdGhlIG11c2ljIG5vdyEgKi8KKwl0ZW1wID0gaW5sKHMtPmlvICsgVlJDNTQ3N19DVFJMKTsKKwl0ZW1wIHw9IChWUkM1NDc3X0NUUkxfREFDMUVOQiB8IFZSQzU0NzdfQ1RSTF9EQUMyRU5CKTsKKwlvdXRsICh0ZW1wLCBzLT5pbyArIFZSQzU0NzdfQ1RSTCk7CisKKwkvKiBpdCBpcyB0aW1lIHRvIHNldHVwIG5leHQgZG1hIHRyYW5zZmVyICovCisJQVNTRVJUKGlubChzLT5pbyArIFZSQzU0NzdfREFDMV9DVFJMKSAmIFZSQzU0NzdfRE1BX1dJUCk7CisJQVNTRVJUKGlubChzLT5pbyArIFZSQzU0NzdfREFDMl9DVFJMKSAmIFZSQzU0NzdfRE1BX1dJUCk7CisKKwl0ZW1wID0gZGItPm5leHRPdXQgKyBkYi0+ZnJhZ1NpemU7CisJaWYgKHRlbXAgPj0gZGItPmZyYWdUb3RhbFNpemUpIHsKKwkJQVNTRVJUKHRlbXAgPT0gZGItPmZyYWdUb3RhbFNpemUpOworCQl0ZW1wID0gMDsKKwl9CisKKwlvdXRsKGRiLT5sYnVmRG1hICsgdGVtcCwgcy0+aW8gKyBWUkM1NDc3X0RBQzFfQkFERFIpOworCWlmIChzLT5kYWNDaGFubmVscyA9PSAxKSB7CisJCW91dGwoZGItPmxidWZEbWEgKyB0ZW1wLCBzLT5pbyArIFZSQzU0NzdfREFDMl9CQUREUik7CisJfSBlbHNlIHsKKwkJb3V0bChkYi0+cmJ1ZkRtYSArIHRlbXAsIHMtPmlvICsgVlJDNTQ3N19EQUMyX0JBRERSKTsKKwl9CisKKwlkYi0+c3RvcHBlZCA9IDA7CisKKyNpZiBkZWZpbmVkKFZSQzU0NzdfQUM5N19WRVJCT1NFX0RFQlVHKQorCW91dFRpY2tldCA9ICoodTE2KikoZGItPmxidWYrZGItPm5leHRPdXQpOworCWlmIChkYi0+Y291bnQgPiBkYi0+ZnJhZ1NpemUpIHsKKwkJQVNTRVJUKCh1MTYpKG91dFRpY2tldCsxKSA9PSAqKHUxNiopKGRiLT5sYnVmK3RlbXApKTsKKwl9CisjZW5kaWYKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK2V4dGVybiBpbmxpbmUgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYqIGRiID0gJnMtPmRtYV9hZGM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdGVtcDsKKyAgICAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRiLT5zdG9wcGVkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGRlYWN0aXZhdGUgdGhlIGRtYSAqLworCW91dGwoMCwgcy0+aW8gKyBWUkM1NDc3X0FEQzFfQ1RSTCk7CisJb3V0bCgwLCBzLT5pbyArIFZSQzU0NzdfQURDMl9DVFJMKTsKKworCS8qIGRpc2FibGUgYWRjIHNsb3RzIGluIGFjbGluayAqLworCXRlbXAgPSBpbmwocy0+aW8gKyBWUkM1NDc3X0NUUkwpOworCXRlbXAgJj0gfiAoVlJDNTQ3N19DVFJMX0FEQzFFTkIgfCBWUkM1NDc3X0NUUkxfQURDMkVOQik7CisJb3V0bCAodGVtcCwgcy0+aW8gKyBWUkM1NDc3X0NUUkwpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICAgIHRlbXAgPSBpbmwocy0+aW8gKyBWUkM1NDc3X0lOVF9NQVNLKTsKKyAgICAgICAgdGVtcCAmPSB+IChWUkM1NDc3X0lOVF9NQVNLX0FEQzFFTkQgfCBWUkM1NDc3X0lOVF9NQVNLX0FEQzJFTkQpOyAKKyAgICAgICAgb3V0bCAodGVtcCwgcy0+aW8gKyBWUkM1NDc3X0lOVF9NQVNLKTsKKworCS8qIGNsZWFyIHBlbmRpbmcgb25lcyAqLworCW91dGwoVlJDNTQ3N19JTlRfTUFTS19BREMxRU5EIHwgVlJDNTQ3N19JTlRfTUFTS19BREMyRU5ELCAKKwkgICAgIHMtPmlvICsgIFZSQzU0NzdfSU5UX0NMUik7CisgICAgCisJZGItPnN0b3BwZWQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiogZGIgPSAmcy0+ZG1hX2FkYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBkbWFMZW5ndGg7CisJdTMyIHRlbXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFkYi0+c3RvcHBlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiB3ZSBzaG91bGQgYXQgbGVhc3QgaGF2ZSBzb21lIGZyZWUgc3BhY2UgaW4gdGhlIGJ1ZmZlciAqLworCUFTU0VSVChkYi0+Y291bnQgPCBkYi0+ZnJhZ1RvdGFsU2l6ZSAtIGRiLT5mcmFnU2l6ZSAqIDIpOworCisJLyogY2xlYXIgcGVuZGluZyBvbmVzICovCisJb3V0bChWUkM1NDc3X0lOVF9NQVNLX0FEQzFFTkQgfCBWUkM1NDc3X0lOVF9NQVNLX0FEQzJFTkQsIAorCSAgICAgcy0+aW8gKyAgVlJDNTQ3N19JTlRfQ0xSKTsKKworICAgICAgICAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworICAgICAgICB0ZW1wID0gaW5sKHMtPmlvICsgVlJDNTQ3N19JTlRfTUFTSyk7CisgICAgICAgIHRlbXAgfD0gVlJDNTQ3N19JTlRfTUFTS19BREMxRU5EIHwgVlJDNTQ3N19JTlRfTUFTS19BREMyRU5EOworICAgICAgICBvdXRsKHRlbXAsIHMtPmlvICsgIFZSQzU0NzdfSU5UX01BU0spOworCisJLyogc2V0dXAgZG1hIGJhc2UgYWRkciAqLworCW91dGwoZGItPmxidWZEbWEgKyBkYi0+bmV4dEluLCBzLT5pbyArIFZSQzU0NzdfQURDMV9CQUREUik7CisJb3V0bChkYi0+cmJ1ZkRtYSArIGRiLT5uZXh0SW4sIHMtPmlvICsgVlJDNTQ3N19BREMyX0JBRERSKTsKKworCS8qIHNldHVwIGRtYSBsZW5ndGggKi8KKwlkbWFMZW5ndGggPSBkYi0+ZnJhZ1NpemUgPj4gNDsKKwlvdXRsKGRtYUxlbmd0aCwgcy0+aW8gKyBWUkM1NDc3X0FEQzFMKTsKKwlvdXRsKGRtYUxlbmd0aCwgcy0+aW8gKyBWUkM1NDc3X0FEQzJMKTsKKworCS8qIGFjdGl2YXRlIGRtYSAqLworCW91dGwoVlJDNTQ3N19ETUFfQUNUSVZBVElPTiwgcy0+aW8gKyBWUkM1NDc3X0FEQzFfQ1RSTCk7CisJb3V0bChWUkM1NDc3X0RNQV9BQ1RJVkFUSU9OLCBzLT5pbyArIFZSQzU0NzdfQURDMl9DVFJMKTsKKworCS8qIGVuYWJsZSBhZGMgc2xvdHMgKi8KKwl0ZW1wID0gaW5sKHMtPmlvICsgVlJDNTQ3N19DVFJMKTsKKwl0ZW1wIHw9IChWUkM1NDc3X0NUUkxfQURDMUVOQiB8IFZSQzU0NzdfQ1RSTF9BREMyRU5CKTsKKwlvdXRsICh0ZW1wLCBzLT5pbyArIFZSQzU0NzdfQ1RSTCk7CisKKwkvKiBpdCBpcyB0aW1lIHRvIHNldHVwIG5leHQgZG1hIHRyYW5zZmVyICovCisJdGVtcCA9IGRiLT5uZXh0SW4gKyBkYi0+ZnJhZ1NpemU7CisJaWYgKHRlbXAgPj0gZGItPmZyYWdUb3RhbFNpemUpIHsKKwkJQVNTRVJUKHRlbXAgPT0gZGItPmZyYWdUb3RhbFNpemUpOworCQl0ZW1wID0gMDsKKwl9CisJb3V0bChkYi0+bGJ1ZkRtYSArIHRlbXAsIHMtPmlvICsgVlJDNTQ3N19BREMxX0JBRERSKTsKKwlvdXRsKGRiLT5yYnVmRG1hICsgdGVtcCwgcy0+aW8gKyBWUkM1NDc3X0FEQzJfQkFERFIpOworCisJZGItPnN0b3BwZWQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAoMTYtUEFHRV9TSElGVCkKKyNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKKworZXh0ZXJuIGlubGluZSB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMsCisJCQkJICBzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlpZiAoZGItPmxidWYpIHsKKwkJQVNTRVJUKGRiLT5yYnVmKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBkYi0+YnVmT3JkZXIsCisJCQkJICAgIGRiLT5sYnVmLCBkYi0+bGJ1ZkRtYSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocy0+ZGV2LCBQQUdFX1NJWkUgPDwgZGItPmJ1Zk9yZGVyLAorCQkJCSAgICBkYi0+cmJ1ZiwgZGItPnJidWZEbWEpOworCQlkYi0+bGJ1ZiA9IGRiLT5yYnVmID0gTlVMTDsKKwl9CisJZGItPm5leHRJbiA9IGRiLT5uZXh0T3V0ID0gMDsKKwlkYi0+cmVhZHkgPSAwOworfQorCitzdGF0aWMgaW50IHByb2dfZG1hYnVmKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMsIAorCQkgICAgICAgc3RydWN0IGRtYWJ1ZiAqZGIsCisJCSAgICAgICB1bnNpZ25lZCByYXRlKQoreworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBidWZzaXplOworCisJaWYgKCFkYi0+bGJ1ZikgeworCQlBU1NFUlQoIWRiLT5yYnVmKTsKKworCQlkYi0+cmVhZHkgPSAwOworCQlmb3IgKG9yZGVyID0gRE1BQlVGX0RFRkFVTFRPUkRFUjsgCisJCSAgICAgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyAKKwkJICAgICBvcmRlci0tKSB7CisJCQlkYi0+bGJ1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHMtPmRldiwKKwkJCQkJCQlQQUdFX1NJWkUgPDwgb3JkZXIsCisJCQkJCQkJJmRiLT5sYnVmRG1hKTsKKwkJCWRiLT5yYnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocy0+ZGV2LAorCQkJCQkJCVBBR0VfU0laRSA8PCBvcmRlciwKKwkJCQkJCQkmZGItPnJidWZEbWEpOworCQkJaWYgKGRiLT5sYnVmICYmIGRiLT5yYnVmKSBicmVhazsKKwkJCWlmIChkYi0+bGJ1ZikgeworCQkJICAgIEFTU0VSVCghZGItPnJidWYpOworCQkJICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocy0+ZGV2LCAKKwkJCQkJCVBBR0VfU0laRSA8PCBvcmRlciwKKwkJCQkJCWRiLT5sYnVmLAorCQkJCQkJZGItPmxidWZEbWEpOworCQkJfQorCQl9CisJCWlmICghZGItPmxidWYpIHsKKwkJCUFTU0VSVCghZGItPnJidWYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlkYi0+YnVmT3JkZXIgPSBvcmRlcjsKKwl9CisKKwlkYi0+Y291bnQgPSAwOworCWRiLT5uZXh0SW4gPSBkYi0+bmV4dE91dCA9IDA7CisgICAgCisJYnVmc2l6ZSA9IFBBR0VfU0laRSA8PCBkYi0+YnVmT3JkZXI7CisJZGItPmZyYWdTaGlmdCA9IGxkMihyYXRlICogMiAvIDEwMCk7CisJaWYgKGRiLT5mcmFnU2hpZnQgPCA0KSBkYi0+ZnJhZ1NoaWZ0ID0gNDsKKworCWRiLT5udW1GcmFnID0gYnVmc2l6ZSA+PiBkYi0+ZnJhZ1NoaWZ0OworCXdoaWxlIChkYi0+bnVtRnJhZyA8IDQgJiYgZGItPmZyYWdTaGlmdCA+IDQpIHsKKwkJZGItPmZyYWdTaGlmdC0tOworCQlkYi0+bnVtRnJhZyA9IGJ1ZnNpemUgPj4gZGItPmZyYWdTaGlmdDsKKwl9CisJZGItPmZyYWdTaXplID0gMSA8PCBkYi0+ZnJhZ1NoaWZ0OworCWRiLT5mcmFnVG90YWxTaXplID0gZGItPm51bUZyYWcgPDwgZGItPmZyYWdTaGlmdDsKKwltZW1zZXQoZGItPmxidWYsIDAsIGRiLT5mcmFnVG90YWxTaXplKTsKKwltZW1zZXQoZGItPnJidWYsIDAsIGRiLT5mcmFnVG90YWxTaXplKTsKKyAgICAKKwlkYi0+cmVhZHkgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2FkYyhzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzKQoreworICAgIHN0b3BfYWRjKHMpOworICAgIHJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYywgcy0+YWRjUmF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2RhYyhzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzKQoreworICAgIHN0b3BfZGFjKHMpOworICAgIHJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYywgcy0+ZGFjUmF0ZSk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBob2xkIHNwaW5sb2NrIGZvciB0aGUgZm9sbG93aW5nISAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdnJjNTQ3N19hYzk3X2FkY19pbnRlcnJ1cHQoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1hYnVmKiBhZGMgPSAmcy0+ZG1hX2FkYzsKKwl1bnNpZ25lZCB0ZW1wOworCisJLyogd2UgbmVlZCB0d28gZnJhZ3MgYXZhaWFibGUgYmVjYXVzZSBvbmUgaXMgYWxyZWFkeSBiZWluZyB1c2VkCisJICogYW5kIHRoZSBvdGhlciB3aWxsIGJlIHVzZWQgd2hlbiBuZXh0IGludGVycnVwdCBoYXBwZW5zLgorCSAqLworCWlmIChhZGMtPmNvdW50ID49IGFkYy0+ZnJhZ1RvdGFsU2l6ZSAtIGFkYy0+ZnJhZ1NpemUpIHsKKwkJc3RvcF9hZGMocyk7CisJCWFkYy0+ZXJyb3IrKzsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImFkYyBvdmVycnVuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHNldCB0aGUgYmFzZSBhZGRyIGZvciBuZXh0IERNQSB0cmFuc2ZlciAqLworCXRlbXAgPSBhZGMtPm5leHRJbiArIDIqYWRjLT5mcmFnU2l6ZTsKKwlpZiAodGVtcCA+PSBhZGMtPmZyYWdUb3RhbFNpemUpIHsKKwkJQVNTRVJUKCAodGVtcCA9PSBhZGMtPmZyYWdUb3RhbFNpemUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wID09IGFkYy0+ZnJhZ1RvdGFsU2l6ZSArIGFkYy0+ZnJhZ1NpemUpICk7CisJCXRlbXAgLT0gYWRjLT5mcmFnVG90YWxTaXplOworCX0KKwlvdXRsKGFkYy0+bGJ1ZkRtYSArIHRlbXAsIHMtPmlvICsgVlJDNTQ3N19BREMxX0JBRERSKTsKKwlvdXRsKGFkYy0+cmJ1ZkRtYSArIHRlbXAsIHMtPmlvICsgVlJDNTQ3N19BREMyX0JBRERSKTsKKworCS8qIGFkanVzdCBuZXh0SW4gKi8KKwlhZGMtPm5leHRJbiArPSBhZGMtPmZyYWdTaXplOworCWlmIChhZGMtPm5leHRJbiA+PSBhZGMtPmZyYWdUb3RhbFNpemUpIHsKKwkJQVNTRVJUKGFkYy0+bmV4dEluID09IGFkYy0+ZnJhZ1RvdGFsU2l6ZSk7CisJCWFkYy0+bmV4dEluID0gMDsKKwl9CisKKwkvKiBhZGp1c3QgY291bnQgKi8KKwlhZGMtPmNvdW50ICs9IGFkYy0+ZnJhZ1NpemU7CisKKwkvKiB3YWtlIHVwIGFueWJvZHkgbGlzdGVuaW5nICovCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmFkYy0+d2FpdCkpIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhZGMtPndhaXQpOworCX0JCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2cmM1NDc3X2FjOTdfZGFjX2ludGVycnVwdChzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYqIGRhYyA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkIHRlbXA7CisKKwkvKiBuZXh0IERNQSB0cmFuc2ZlciBzaG91bGQgYWxyZWFkeSBzdGFydGVkICovCisJLy8gQVNTRVJUKGlubChzLT5pbyArIFZSQzU0NzdfREFDMV9DVFJMKSAmIFZSQzU0NzdfRE1BX1dJUCk7CisJLy8gQVNTRVJUKGlubChzLT5pbyArIFZSQzU0NzdfREFDMl9DVFJMKSAmIFZSQzU0NzdfRE1BX1dJUCk7CisKKwkvKiBsZXQgdXMgc2V0IGZvciBuZXh0IG5leHQgRE1BIHRyYW5zZmVyICovCisJdGVtcCA9IGRhYy0+bmV4dE91dCArIGRhYy0+ZnJhZ1NpemUqMjsKKwlpZiAodGVtcCA+PSBkYWMtPmZyYWdUb3RhbFNpemUpIHsKKwkJQVNTRVJUKCAodGVtcCA9PSBkYWMtPmZyYWdUb3RhbFNpemUpIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcCA9PSBkYWMtPmZyYWdUb3RhbFNpemUgKyBkYWMtPmZyYWdTaXplKSApOworCQl0ZW1wIC09IGRhYy0+ZnJhZ1RvdGFsU2l6ZTsKKwl9CisJb3V0bChkYWMtPmxidWZEbWEgKyB0ZW1wLCBzLT5pbyArIFZSQzU0NzdfREFDMV9CQUREUik7CisJaWYgKHMtPmRhY0NoYW5uZWxzID09IDEpIHsKKwkJb3V0bChkYWMtPmxidWZEbWEgKyB0ZW1wLCBzLT5pbyArIFZSQzU0NzdfREFDMl9CQUREUik7CisJfSBlbHNlIHsKKwkJb3V0bChkYWMtPnJidWZEbWEgKyB0ZW1wLCBzLT5pbyArIFZSQzU0NzdfREFDMl9CQUREUik7CisJfQorCisjaWYgZGVmaW5lZChWUkM1NDc3X0FDOTdfVkVSQk9TRV9ERUJVRykKKwlpZiAoKih1MTYqKShkYWMtPmxidWYgKyAgZGFjLT5uZXh0T3V0KSAhPSBvdXRUaWNrZXQpIHsKKwkJcHJpbnRrKCJhc3NlcnQgZmFpbDogLSAlZCB2cyAlZFxuIiwgCisJCSAgICAgICAgKih1MTYqKShkYWMtPmxidWYgKyAgZGFjLT5uZXh0T3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFRpY2tldCk7CisgICAgICAgICAgICAgICAgQVNTRVJUKDEgPT0gMCk7CisJfQorI2VuZGlmCisKKwkvKiBhZGp1c3QgbmV4dE91dCBwb2ludGVyICovCisJZGFjLT5uZXh0T3V0ICs9IGRhYy0+ZnJhZ1NpemU7CisJaWYgKGRhYy0+bmV4dE91dCA+PSBkYWMtPmZyYWdUb3RhbFNpemUpIHsKKwkJQVNTRVJUKGRhYy0+bmV4dE91dCA9PSBkYWMtPmZyYWdUb3RhbFNpemUpOworCQlkYWMtPm5leHRPdXQgPSAwOworCX0KKworCS8qIGFkanVzdCBjb3VudCAqLworCWRhYy0+Y291bnQgLT0gZGFjLT5mcmFnU2l6ZTsKKwlpZiAoZGFjLT5jb3VudCA8PTAgKSB7CisJCS8qIGJ1ZmZlciB1bmRlciBydW4gKi8KKwkJZGFjLT5jb3VudCA9IDA7CisJCWRhYy0+bmV4dEluID0gZGFjLT5uZXh0T3V0OworCQlzdG9wX2RhYyhzKTsKKwl9CisKKyNpZiBkZWZpbmVkKFZSQzU0NzdfQUM5N19WRVJCT1NFX0RFQlVHKQorCWlmIChkYWMtPmNvdW50KSB7CisJCW91dFRpY2tldCArKzsKKwkJQVNTRVJUKCoodTE2KikoZGFjLT5sYnVmICsgIGRhYy0+bmV4dE91dCkgPT0gb3V0VGlja2V0KTsKKwl9CisjZW5kaWYKKwkKKwkvKiB3ZSBjYW5ub3QgaGF2ZSBib3RoIHVuZGVyIHJ1biBhbmQgc29tZW9uZSBpcyB3YWl0aW5nIG9uIHVzICovCisJQVNTRVJUKCEgKHdhaXRxdWV1ZV9hY3RpdmUoJmRhYy0+d2FpdCkgJiYgKGRhYy0+Y291bnQgPD0gMCkpICk7CisKKwkvKiB3YWtlIHVwIGFueWJvZHkgbGlzdGVuaW5nICovCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmRhYy0+d2FpdCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGFjLT53YWl0KTsKK30KKworc3RhdGljIGlycXJldHVybl90IHZyYzU0NzdfYWM5N19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzID0gKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKilkZXZfaWQ7CisJdTMyIGlycVN0YXR1czsKKwl1MzIgYWRjSW50ZXJydXB0cywgZGFjSW50ZXJydXB0czsKKworCXNwaW5fbG9jaygmcy0+bG9jayk7CisKKwkvKiBnZXQgaXJxU3RhdHVzIGFuZCBjbGVhciB0aGUgZGV0ZWN0ZWQgb25lcyAqLworCWlycVN0YXR1cyA9IGlubChzLT5pbyArIFZSQzU0NzdfSU5UX1NUQVRVUyk7CisJb3V0bChpcnFTdGF0dXMsIHMtPmlvICsgVlJDNTQ3N19JTlRfQ0xSKTsKKworCS8qIGxldCB1cyBzZWUgd2hhdCB3ZSBnZXQgKi8KKwlkYWNJbnRlcnJ1cHRzID0gVlJDNTQ3N19JTlRfTUFTS19EQUMxRU5EIHwgVlJDNTQ3N19JTlRfTUFTS19EQUMyRU5EOworCWFkY0ludGVycnVwdHMgPSBWUkM1NDc3X0lOVF9NQVNLX0FEQzFFTkQgfCBWUkM1NDc3X0lOVF9NQVNLX0FEQzJFTkQ7CisJaWYgKGlycVN0YXR1cyAmIGRhY0ludGVycnVwdHMpIHsKKwkJLyogd2Ugc2hvdWxkIGdldCBib3RoIGludGVycnVwdHMsIGJ1dCBqdXN0IGluIGNhc2UgLi4uICAqLworCQlpZiAoaXJxU3RhdHVzICYgVlJDNTQ3N19JTlRfTUFTS19EQUMxRU5EKSB7CisJCQl2cmM1NDc3X2FjOTdfZGFjX2ludGVycnVwdChzKTsKKwkJfQorCQlpZiAoIChpcnFTdGF0dXMgJiBkYWNJbnRlcnJ1cHRzKSAhPSBkYWNJbnRlcnJ1cHRzICkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidnJjNTQ3N19hYzk3IDogZGFjIGludGVycnVwdHMgbm90IGluIHN5bmMhISFcbiIpOworCQkJc3RvcF9kYWMocyk7CisJCQlzdGFydF9kYWMocyk7CisJCX0KKwl9IGVsc2UgaWYgKGlycVN0YXR1cyAmIGFkY0ludGVycnVwdHMpIHsKKwkJLyogd2Ugc2hvdWxkIGdldCBib3RoIGludGVycnVwdHMsIGJ1dCBqdXN0IGluIGNhc2UgLi4uICAqLworCQlpZihpcnFTdGF0dXMgJiBWUkM1NDc3X0lOVF9NQVNLX0FEQzFFTkQpIHsKKwkJCXZyYzU0NzdfYWM5N19hZGNfaW50ZXJydXB0KHMpOworCQl9IAorCQlpZiAoIChpcnFTdGF0dXMgJiBhZGNJbnRlcnJ1cHRzKSAhPSBhZGNJbnRlcnJ1cHRzICkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidnJjNTQ3N19hYzk3IDogYWRjIGludGVycnVwdHMgbm90IGluIHN5bmMhISFcbiIpOworCQkJc3RvcF9hZGMocyk7CisJCQlzdGFydF9hZGMocyk7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB2cmM1NDc3X2FjOTdfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSwgZGV2cyk7CisJCWlmIChzLT5jb2RlYy0+ZGV2X21peGVyID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHZyYzU0NzdfYWM5N19yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG1peGRldl9pb2N0bChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgdnJjNTQ3N19hYzk3X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMgPSAKKwkgICAgKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gcy0+Y29kZWM7CisKKyAgICByZXR1cm4gbWl4ZGV2X2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2cmM1NDc3X2FjOTdfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IHZyYzU0NzdfYWM5N19pb2N0bF9taXhkZXYsCisJLm9wZW4JCT0gdnJjNTQ3N19hYzk3X29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlCT0gdnJjNTQ3N19hYzk3X3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCwgdG1vOworCQorCWlmICghcy0+ZG1hX2RhYy5yZWFkeSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKDs7KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJaWYgKG5vbmJsb2NrKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJdG1vID0gMTAwMCAqIGNvdW50IC8gcy0+ZGFjUmF0ZSAvIDI7CisJCXZyYzU0NzdfYWM5N19kZWxheSh0bW8pOworCX0KKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIGludAorY29weV90d29fY2hhbm5lbF9hZGNfdG9fdXNlcihzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzLCAKKwkJICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgCisJCQkgICAgIGludCBjb3B5Q291bnQpCit7CisJc3RydWN0IGRtYWJ1ZiAqZGIgPSAmcy0+ZG1hX2FkYzsKKwlpbnQgYnVmU3RhcnQgPSBkYi0+bmV4dE91dDsKKwlmb3IgKDsgY29weUNvdW50ID4gMDsgKSB7CisJCWludCBpOworCQlpbnQgY291bnQgPSBjb3B5Q291bnQ7CisJCWlmIChjb3VudCA+IFdPUktfQlVGX1NJWkUvMikgY291bnQgPSBXT1JLX0JVRl9TSVpFLzI7CisJCWZvciAoaT0wOyBpPCBjb3VudC8yOyBpKyspIHsKKwkJCXMtPndvcmtCdWZbaV0ubGNoYW5uZWwgPSAKKwkJCQkqKHUxNiopKGRiLT5sYnVmICsgYnVmU3RhcnQgKyBpKjIpOworCQkJcy0+d29ya0J1ZltpXS5yY2hhbm5lbCA9IAorCQkJCSoodTE2KikoZGItPnJidWYgKyBidWZTdGFydCArIGkqMik7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPndvcmtCdWYsIGNvdW50KjIpKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQljb3B5Q291bnQgLT0gY291bnQ7CisJCWJ1ZlN0YXJ0ICs9IGNvdW50OworCQlBU1NFUlQoYnVmU3RhcnQgPD0gZGItPmZyYWdUb3RhbFNpemUpOworCQlidWZmZXIgKz0gY291bnQgKjI7CisJfQorCXJldHVybiAwOworfQorCisvKiByZXR1cm4gdGhlIHRvdGFsIGJ5dGVzIHRoYXQgaXMgY29waWVkICovCitzdGF0aWMgaW5saW5lIGludAorY29weV9hZGNfdG9fdXNlcihzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzLAorCQkgY2hhciAqIGJ1ZmZlciwKKwkJIHNpemVfdCBjb3VudCwKKwkJIGludCBhdmFpbCkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9ICZzLT5kbWFfYWRjOworCWludCBjb3B5Q291bnQ9MDsKKwlpbnQgY29weUZyYWdDb3VudD0wOworCWludCB0b3RhbENvcHlDb3VudCA9IDA7CisJaW50IHRvdGFsQ29weUZyYWdDb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGFkanVzdCBjb3VudCB0byBzaWduZWwgY2hhbm5lbCBieXRlIGNvdW50ICovCisJY291bnQgPj49IHMtPmFkY0NoYW5uZWxzIC0gMTsKKworCS8qIHdlIG1heSBoYXZlIHRvICJjb3B5IiB0d2ljZSBhcyByaW5nIGJ1ZmZlciB3cmFwcyBhcm91bmQgKi8KKwlmb3IgKDsgKGF2YWlsID4gMCkgJiYgKGNvdW50ID4gMCk7ICkgeworCQkvKiBkZXRlcm1pbmUgbWF4IHBvc3NpYmxlIGNvcHkgY291bnQgZm9yIHNpbmdsZSBjaGFubmVsICovCisJCWNvcHlDb3VudCA9IGNvdW50OworCQlpZiAoY29weUNvdW50ID4gYXZhaWwpIHsKKwkJCWNvcHlDb3VudCA9IGF2YWlsOworCQl9CisJCWlmIChjb3B5Q291bnQgKyBkYi0+bmV4dE91dCA+IGRiLT5mcmFnVG90YWxTaXplKSB7CisJCQljb3B5Q291bnQgPSBkYi0+ZnJhZ1RvdGFsU2l6ZSAtIGRiLT5uZXh0T3V0OworCQkJQVNTRVJUKChjb3B5Q291bnQgJSBkYi0+ZnJhZ1NpemUpID09IDApOworCQl9CisKKwkJY29weUZyYWdDb3VudCA9IChjb3B5Q291bnQtMSkgPj4gZGItPmZyYWdTaGlmdDsKKwkJY29weUZyYWdDb3VudCA9IChjb3B5RnJhZ0NvdW50KzEpIDw8IGRiLT5mcmFnU2hpZnQ7CisJCUFTU0VSVChjb3B5RnJhZ0NvdW50ID49IGNvcHlDb3VudCk7CisKKwkJLyogd2UgY29weSBkaWZmZXJlbnRseSBiYXNlZCBvbiBhZGMgY2hhbm5lbHMgKi8KKwkJaWYgKHMtPmFkY0NoYW5uZWxzID09IDEpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCAKKwkJCQkJIGRiLT5sYnVmICsgZGItPm5leHRPdXQsIAorCQkJCQkgY29weUNvdW50KSkgCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJLyogKnNpZ2gqIHdlIGhhdmUgdG8gbWl4IHR3byBzdHJlYW1zIGludG8gb25lICAqLworCQkJaWYgKGNvcHlfdHdvX2NoYW5uZWxfYWRjX3RvX3VzZXIocywgYnVmZmVyLCBjb3B5Q291bnQpKQorCQkJCXJldHVybiAtMTsKKwkJfQkKKworCQljb3VudCAtPSBjb3B5Q291bnQ7CisJCXRvdGFsQ29weUNvdW50ICs9IGNvcHlDb3VudDsKKwkJYXZhaWwgLT0gY29weUZyYWdDb3VudDsKKwkJdG90YWxDb3B5RnJhZ0NvdW50ICs9IGNvcHlGcmFnQ291bnQ7CisKKwkJYnVmZmVyICs9IGNvcHlDb3VudCA8PCAocy0+YWRjQ2hhbm5lbHMtMSk7CisKKwkJZGItPm5leHRPdXQgKz0gY29weUZyYWdDb3VudDsKKwkJaWYgKGRiLT5uZXh0T3V0ID49IGRiLT5mcmFnVG90YWxTaXplKSB7CisJCQlBU1NFUlQoZGItPm5leHRPdXQgPT0gZGItPmZyYWdUb3RhbFNpemUpOworCQkJZGItPm5leHRPdXQgPSAwOworCQl9CisKKwkJQVNTRVJUKChjb3B5RnJhZ0NvdW50ICUgZGItPmZyYWdTaXplKSA9PSAwKTsKKwkJQVNTRVJUKCAoY291bnQgPT0gMCkgfHwgKGNvcHlDb3VudCA9PSBjb3B5RnJhZ0NvdW50KSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgZGItPmNvdW50IC09IHRvdGFsQ29weUZyYWdDb3VudDsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHRvdGFsQ29weUNvdW50IDw8IChzLT5hZGNDaGFubmVscy0xKTsKK30KKworc3RhdGljIHNzaXplX3QgCit2cmM1NDc3X2FjOTdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgCisJCSAgY2hhciAqYnVmZmVyLAorCQkgIHNpemVfdCBjb3VudCwgCisJCSAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMgPSAKKwkJKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYWJ1ZiAqZGIgPSAmcy0+ZG1hX2FkYzsKKwlzc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY29weUNvdW50OworCXNpemVfdCBhdmFpbDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJQVNTRVJUKGRiLT5yZWFkeSk7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8vIHdhaXQgZm9yIHNhbXBsZXMgaW4gY2FwdHVyZSBidWZmZXIKKwkJZG8geworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChkYi0+c3RvcHBlZCkKKwkJCQlzdGFydF9hZGMocyk7CisJCQlhdmFpbCA9IGRiLT5jb3VudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChhdmFpbCA8PSAwKSB7CisJCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJCWlmICghcmV0KQorCQkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmZGItPndhaXQpOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKGF2YWlsIDw9IDApOworCisJCUFTU0VSVCggKGF2YWlsICUgZGItPmZyYWdTaXplKSA9PSAwKTsKKwkJY29weUNvdW50ID0gY29weV9hZGNfdG9fdXNlcihzLCBidWZmZXIsIGNvdW50LCBhdmFpbCk7CisJCWlmIChjb3B5Q291bnQgPD0wICkgeworCQkJaWYgKCFyZXQpIHJldCA9IC1FRkFVTFQ7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJY291bnQgLT0gY29weUNvdW50OworCQlidWZmZXIgKz0gY29weUNvdW50OworCQlyZXQgKz0gY29weUNvdW50OworCX0gLy8gd2hpbGUgKGNvdW50ID4gMCkKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citjb3B5X3R3b19jaGFubmVsX2RhY19mcm9tX3VzZXIoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcywgCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmZmVyLCAKKwkJCSAgICAgICBpbnQgY29weUNvdW50KQoreworCXN0cnVjdCBkbWFidWYgKmRiID0gJnMtPmRtYV9kYWM7CisJaW50IGJ1ZlN0YXJ0ID0gZGItPm5leHRJbjsKKworCUFTU0VSVChkYi0+cmVhZHkpOworCisgICAgICAgIGZvciAoOyBjb3B5Q291bnQgPiAwOyApIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBjb3B5Q291bnQ7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gV09SS19CVUZfU0laRS8yKSBjb3VudCA9IFdPUktfQlVGX1NJWkUvMjsKKyAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIocy0+d29ya0J1ZiwgYnVmZmVyLCBjb3VudCoyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwgY291bnQvMjsgaSsrKSB7CisJCQkqKHUxNiopKGRiLT5sYnVmICsgYnVmU3RhcnQgKyBpKjIpID0gCisJCQkJcy0+d29ya0J1ZltpXS5sY2hhbm5lbDsKKwkJCSoodTE2KikoZGItPnJidWYgKyBidWZTdGFydCArIGkqMikgPSAKKwkJCQlzLT53b3JrQnVmW2ldLnJjaGFubmVsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvcHlDb3VudCAtPSBjb3VudDsKKwkJYnVmU3RhcnQgKz0gY291bnQ7CisJCUFTU0VSVChidWZTdGFydCA8PSBkYi0+ZnJhZ1RvdGFsU2l6ZSk7CisgICAgICAgICAgICAgICAgYnVmZmVyICs9IGNvdW50ICoyOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworCit9CisKKy8qIHJldHVybiB0aGUgdG90YWwgYnl0ZXMgdGhhdCBpcyBjb3BpZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citjb3B5X2RhY19mcm9tX3VzZXIoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcywgCisJCSAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgCisJCSAgIHNpemVfdCBjb3VudCwgCisJCSAgIGludCBhdmFpbCkKK3sJCisgICAgICAgIHN0cnVjdCBkbWFidWYgKmRiID0gJnMtPmRtYV9kYWM7CisgICAgICAgIGludCBjb3B5Q291bnQ9MDsKKyAgICAgICAgaW50IGNvcHlGcmFnQ291bnQ9MDsKKyAgICAgICAgaW50IHRvdGFsQ29weUNvdW50ID0gMDsKKyAgICAgICAgaW50IHRvdGFsQ29weUZyYWdDb3VudCA9IDA7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWYgZGVmaW5lZChWUkM1NDc3X0FDOTdfVkVSQk9TRV9ERUJVRykKKwlpbnQgaTsKKyNlbmRpZgorCisgICAgICAgIC8qIGFkanVzdCBjb3VudCB0byBzaWduZWwgY2hhbm5lbCBieXRlIGNvdW50ICovCisgICAgICAgIGNvdW50ID4+PSBzLT5kYWNDaGFubmVscyAtIDE7CisKKyAgICAgICAgLyogd2UgbWF5IGhhdmUgdG8gImNvcHkiIHR3aWNlIGFzIHJpbmcgYnVmZmVyIHdyYXBzIGFyb3VuZCAqLworICAgICAgICBmb3IgKDsgKGF2YWlsID4gMCkgJiYgKGNvdW50ID4gMCk7ICkgeworICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSBtYXggcG9zc2libGUgY29weSBjb3VudCBmb3Igc2luZ2xlIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICBjb3B5Q291bnQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoY29weUNvdW50ID4gYXZhaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlDb3VudCA9IGF2YWlsOworCQl9CisgICAgICAgICAgICAgICAgaWYgKGNvcHlDb3VudCArIGRiLT5uZXh0SW4gPiBkYi0+ZnJhZ1RvdGFsU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29weUNvdW50ID0gZGItPmZyYWdUb3RhbFNpemUgLSBkYi0+bmV4dEluOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGNvcHlDb3VudCA+IDApOworICAgICAgICAgICAgICAgIH0KKworCQljb3B5RnJhZ0NvdW50ID0gY29weUNvdW50OworCQlBU1NFUlQoY29weUZyYWdDb3VudCA+PSBjb3B5Q291bnQpOworCisJCS8qIHdlIGNvcHkgZGlmZmVyZW50bHkgYmFzZWQgb24gdGhlIG51bWJlciBjaGFubmVscyAqLworCQlpZiAocy0+ZGFjQ2hhbm5lbHMgPT0gMSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRiLT5sYnVmICsgZGItPm5leHRJbiwKKwkJCQkJICAgYnVmZmVyLAorCQkJCQkgICBjb3B5Q291bnQpKSAKKwkJCQlyZXR1cm4gLTE7CisJCQkvKiBmaWxsIGdhcHMgd2l0aCAwICovCisJCQltZW1zZXQoZGItPmxidWYgKyBkYi0+bmV4dEluICsgY29weUNvdW50LAorCQkJICAgICAgIDAsCisJCQkgICAgICAgY29weUZyYWdDb3VudCAtIGNvcHlDb3VudCk7CisJCX0gZWxzZSB7CisJCQkvKiB3ZSBoYXZlIGRlbXV4IHRoZSBzdHJlYW0gaW50byB0d28gc2VwYXJhdGUgb25lcyAqLworCQkJaWYgKGNvcHlfdHdvX2NoYW5uZWxfZGFjX2Zyb21fdXNlcihzLCBidWZmZXIsIGNvcHlDb3VudCkpCisJCQkJcmV0dXJuIC0xOworCQkJLyogZmlsbCBnYXBzIHdpdGggMCAqLworCQkJbWVtc2V0KGRiLT5sYnVmICsgZGItPm5leHRJbiArIGNvcHlDb3VudCwKKwkJCSAgICAgICAwLAorCQkJICAgICAgIGNvcHlGcmFnQ291bnQgLSBjb3B5Q291bnQpOworCQkJbWVtc2V0KGRiLT5yYnVmICsgZGItPm5leHRJbiArIGNvcHlDb3VudCwKKwkJCSAgICAgICAwLAorCQkJICAgICAgIGNvcHlGcmFnQ291bnQgLSBjb3B5Q291bnQpOworCQl9CisKKyNpZiBkZWZpbmVkKFZSQzU0NzdfQUM5N19WRVJCT1NFX0RFQlVHKQorCQlmb3IgKGk9MDsgaTwgY29weUZyYWdDb3VudDsgaSs9IGRiLT5mcmFnU2l6ZSkgeworCQkJKih1MTYqKShkYi0+bGJ1ZiArIGRiLT5uZXh0SW4gKyBpKSA9IGluVGlja2V0ICsrOworCQl9CisjZW5kaWYKKworCQljb3VudCAtPSBjb3B5Q291bnQ7CisJCXRvdGFsQ29weUNvdW50ICs9IGNvcHlDb3VudDsKKwkJYXZhaWwgLT0gY29weUZyYWdDb3VudDsKKwkJdG90YWxDb3B5RnJhZ0NvdW50ICs9IGNvcHlGcmFnQ291bnQ7CisKKwkJYnVmZmVyICs9IGNvcHlDb3VudCA8PCAocy0+ZGFjQ2hhbm5lbHMgLSAxKTsKKworCQlkYi0+bmV4dEluICs9IGNvcHlGcmFnQ291bnQ7CisJCWlmIChkYi0+bmV4dEluID49IGRiLT5mcmFnVG90YWxTaXplKSB7CisJCQlBU1NFUlQoZGItPm5leHRJbiA9PSBkYi0+ZnJhZ1RvdGFsU2l6ZSk7CisJCQlkYi0+bmV4dEluID0gMDsKKwkJfQorCisJCUFTU0VSVCggKGNvdW50ID09IDApIHx8IChjb3B5Q291bnQgPT0gY29weUZyYWdDb3VudCkpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgIGRiLT5jb3VudCArPSB0b3RhbENvcHlGcmFnQ291bnQ7CisJaWYgKGRiLT5zdG9wcGVkKSB7CisJCXN0YXJ0X2RhYyhzKTsKKwl9CisKKwkvKiBuZXh0SW4gc2hvdWxkIG5vdCBiZSBlcXVhbCB0byBuZXh0T3V0IHVubGVzcyB3ZSBhcmUgZnVsbCAqLworCUFTU0VSVCggKCAoZGItPmNvdW50ID09IGRiLT5mcmFnVG90YWxTaXplKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgKGRiLT5uZXh0SW4gPT0gZGItPm5leHRPdXQpICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICggKGRiLT5jb3VudCA8IGRiLT5mcmFnVG90YWxTaXplKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAoZGItPm5leHRJbiAhPSBkYi0+bmV4dE91dCkgKSApOworCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworICAgICAgICByZXR1cm4gdG90YWxDb3B5Q291bnQgPDwgKHMtPmRhY0NoYW5uZWxzLTEpOworCit9CisKK3N0YXRpYyBzc2l6ZV90IHZyYzU0NzdfYWM5N193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcyA9IAorCQkoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9ICZzLT5kbWFfZGFjOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvcHlDb3VudCwgYXZhaWw7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisgICAgCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkvLyB3YWl0IGZvciBzcGFjZSBpbiBwbGF5YmFjayBidWZmZXIKKwkJZG8geworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWF2YWlsID0gZGItPmZyYWdUb3RhbFNpemUgLSBkYi0+Y291bnQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoYXZhaWwgPD0gMCkgeworCQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmRiLT53YWl0KTsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChhdmFpbCA8PSAwKTsKKwkKKwkJY29weUNvdW50ID0gY29weV9kYWNfZnJvbV91c2VyKHMsIGJ1ZmZlciwgY291bnQsIGF2YWlsKTsKKwkJaWYgKGNvcHlDb3VudCA8IDApIHsKKwkJCWlmICghcmV0KSByZXQgPSAtRUZBVUxUOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWNvdW50IC09IGNvcHlDb3VudDsKKwkJYnVmZmVyICs9IGNvcHlDb3VudDsKKwkJcmV0ICs9IGNvcHlDb3VudDsKKwl9IC8vIHdoaWxlIChjb3VudCA+IDApCisJCisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdnJjNTQ3N19hYzk3X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMgPSAoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfZGFjLndhaXQsIHdhaXQpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ1NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdUb3RhbFNpemUgPj0KKwkJICAgIHMtPmRtYV9kYWMuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ1NpemUpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKKyNpZmRlZiBWUkM1NDc3X0FDOTdfREVCVUcKK3N0YXRpYyBzdHJ1Y3QgaW9jdGxfc3RyX3QgeworICAgIHVuc2lnbmVkIGludCBjbWQ7CisgICAgY29uc3QgY2hhciogc3RyOworfSBpb2N0bF9zdHJbXSA9IHsKKyAgICB7U05EQ1RMX0RTUF9SRVNFVCwgIlNORENUTF9EU1BfUkVTRVQifSwKKyAgICB7U05EQ1RMX0RTUF9TWU5DLCAiU05EQ1RMX0RTUF9TWU5DIn0sCisgICAge1NORENUTF9EU1BfU1BFRUQsICJTTkRDVExfRFNQX1NQRUVEIn0sCisgICAge1NORENUTF9EU1BfU1RFUkVPLCAiU05EQ1RMX0RTUF9TVEVSRU8ifSwKKyAgICB7U05EQ1RMX0RTUF9HRVRCTEtTSVpFLCAiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIn0sCisgICAge1NORENUTF9EU1BfU0VURk1ULCAiU05EQ1RMX0RTUF9TRVRGTVQifSwKKyAgICB7U05EQ1RMX0RTUF9TQU1QTEVTSVpFLCAiU05EQ1RMX0RTUF9TQU1QTEVTSVpFIn0sCisgICAge1NORENUTF9EU1BfQ0hBTk5FTFMsICJTTkRDVExfRFNQX0NIQU5ORUxTIn0sCisgICAge1NPVU5EX1BDTV9XUklURV9DSEFOTkVMUywgIlNPVU5EX1BDTV9XUklURV9DSEFOTkVMUyJ9LAorICAgIHtTT1VORF9QQ01fV1JJVEVfRklMVEVSLCAiU09VTkRfUENNX1dSSVRFX0ZJTFRFUiJ9LAorICAgIHtTTkRDVExfRFNQX1BPU1QsICJTTkRDVExfRFNQX1BPU1QifSwKKyAgICB7U05EQ1RMX0RTUF9TVUJESVZJREUsICJTTkRDVExfRFNQX1NVQkRJVklERSJ9LAorICAgIHtTTkRDVExfRFNQX1NFVEZSQUdNRU5ULCAiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVCJ9LAorICAgIHtTTkRDVExfRFNQX0dFVEZNVFMsICJTTkRDVExfRFNQX0dFVEZNVFMifSwKKyAgICB7U05EQ1RMX0RTUF9HRVRPU1BBQ0UsICJTTkRDVExfRFNQX0dFVE9TUEFDRSJ9LAorICAgIHtTTkRDVExfRFNQX0dFVElTUEFDRSwgIlNORENUTF9EU1BfR0VUSVNQQUNFIn0sCisgICAge1NORENUTF9EU1BfTk9OQkxPQ0ssICJTTkRDVExfRFNQX05PTkJMT0NLIn0sCisgICAge1NORENUTF9EU1BfR0VUQ0FQUywgIlNORENUTF9EU1BfR0VUQ0FQUyJ9LAorICAgIHtTTkRDVExfRFNQX0dFVFRSSUdHRVIsICJTTkRDVExfRFNQX0dFVFRSSUdHRVIifSwKKyAgICB7U05EQ1RMX0RTUF9TRVRUUklHR0VSLCAiU05EQ1RMX0RTUF9TRVRUUklHR0VSIn0sCisgICAge1NORENUTF9EU1BfR0VUSVBUUiwgIlNORENUTF9EU1BfR0VUSVBUUiJ9LAorICAgIHtTTkRDVExfRFNQX0dFVE9QVFIsICJTTkRDVExfRFNQX0dFVE9QVFIifSwKKyAgICB7U05EQ1RMX0RTUF9NQVBJTkJVRiwgIlNORENUTF9EU1BfTUFQSU5CVUYifSwKKyAgICB7U05EQ1RMX0RTUF9NQVBPVVRCVUYsICJTTkRDVExfRFNQX01BUE9VVEJVRiJ9LAorICAgIHtTTkRDVExfRFNQX1NFVFNZTkNSTywgIlNORENUTF9EU1BfU0VUU1lOQ1JPIn0sCisgICAge1NORENUTF9EU1BfU0VURFVQTEVYLCAiU05EQ1RMX0RTUF9TRVREVVBMRVgifSwKKyAgICB7U05EQ1RMX0RTUF9HRVRPREVMQVksICJTTkRDVExfRFNQX0dFVE9ERUxBWSJ9LAorICAgIHtTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLLCAiU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSyJ9LAorICAgIHtTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTCwgIlNORENUTF9EU1BfQklORF9DSEFOTkVMIn0sCisgICAge09TU19HRVRWRVJTSU9OLCAiT1NTX0dFVFZFUlNJT04ifSwKKyAgICB7U09VTkRfUENNX1JFQURfUkFURSwgIlNPVU5EX1BDTV9SRUFEX1JBVEUifSwKKyAgICB7U09VTkRfUENNX1JFQURfQ0hBTk5FTFMsICJTT1VORF9QQ01fUkVBRF9DSEFOTkVMUyJ9LAorICAgIHtTT1VORF9QQ01fUkVBRF9CSVRTLCAiU09VTkRfUENNX1JFQURfQklUUyJ9LAorICAgIHtTT1VORF9QQ01fUkVBRF9GSUxURVIsICJTT1VORF9QQ01fUkVBRF9GSUxURVIifQorfTsKKyNlbmRpZiAgICAKKworc3RhdGljIGludCB2cmM1NDc3X2FjOTdfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzID0gKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhdWRpb19idWZfaW5mbyBhYmluZm87CisJaW50IGNvdW50OworCWludCB2YWwsIHJldDsKKworI2lmZGVmIFZSQzU0NzdfQUM5N19ERUJVRworCWZvciAoY291bnQ9MDsgY291bnQ8c2l6ZW9mKGlvY3RsX3N0cikvc2l6ZW9mKGlvY3RsX3N0clswXSk7IGNvdW50KyspIHsKKwkJaWYgKGlvY3RsX3N0cltjb3VudF0uY21kID09IGNtZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoY291bnQgPCBzaXplb2YoaW9jdGxfc3RyKS9zaXplb2YoaW9jdGxfc3RyWzBdKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImlvY3RsICVzXG4iLCBpb2N0bF9zdHJbY291bnRdLnN0cik7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW9jdGwgdW5rbm93biwgMHgleFxuIiwgY21kKTsKKyNlbmRpZgorICAgIAorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYLCAoaW50ICopYXJnKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfZGFjLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMubmV4dEluID0gcy0+ZG1hX2RhYy5uZXh0T3V0ID0gMDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9hZGMuY291bnQgPSAwOworCQkJcy0+ZG1hX2FkYy5uZXh0SW4gPSBzLT5kbWFfYWRjLm5leHRPdXQgPSAwOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJc2V0X2FkY19yYXRlKHMsIHZhbCk7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMocyk7CisJCQkJc2V0X2RhY19yYXRlKHMsIHZhbCk7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPworCQkJCXMtPmFkY1JhdGUgOiBzLT5kYWNSYXRlLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCWlmICh2YWwpCisJCQkJcy0+YWRjQ2hhbm5lbHMgPSAyOworCQkJZWxzZQorCQkJCXMtPmFkY0NoYW5uZWxzID0gMTsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMocyk7CisJCQlpZiAodmFsKQorCQkJCXMtPmRhY0NoYW5uZWxzID0gMjsKKwkJCWVsc2UKKwkJCQlzLT5kYWNDaGFubmVscyA9IDE7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlpZiAoICh2YWwgIT0gMSkgJiYgKHZhbCAhPSAyKSkgdmFsID0gMjsKKworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kYWNDaGFubmVscyA9IHZhbDsKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kYWNDaGFubmVscyA9IHZhbDsKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKWFyZyk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEUsIChpbnQgKilhcmcpOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3RzIE9ORSBmbXQqLworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWlmICh2YWwgIT0gQUZNVF9TMTZfTEUpIHJldHVybiAtRUlOVkFMOworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2YWwgPSBBRk1UX1MxNl9MRTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCS8qIE5PIHRyaWdnZXIgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYy5mcmFnU2l6ZSA8PCAocy0+ZGFjQ2hhbm5lbHMtMSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlhYmluZm8uYnl0ZXMgPSAocy0+ZG1hX2RhYy5mcmFnVG90YWxTaXplIC0gY291bnQpIDw8IAorCQkJKHMtPmRhY0NoYW5uZWxzLTEpOworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMubnVtRnJhZzsKKwkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjLmZyYWdTaGlmdCA+PiAKKwkJCShzLT5kYWNDaGFubmVscy0xKTsgICAgICAKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdTaXplIDw8IChzLT5hZGNDaGFubmVscy0xKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCWFiaW5mby5ieXRlcyA9IGNvdW50IDw8IChzLT5hZGNDaGFubmVscy0xKTsKKwkJYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bUZyYWc7CisJCWFiaW5mby5mcmFnbWVudHMgPSAoYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ1NoaWZ0KSA+PgorCQkJKHMtPmFkY0NoYW5uZWxzLTEpOyAgICAgIAorCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwkJCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcHV0X3VzZXIoY291bnQsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCS8qIHdlIGNhbm5vdCBnZXQgRE1BIHB0ciAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnU2l6ZSA8PCAocy0+ZGFjQ2hhbm5lbHMtMSksIChpbnQgKilhcmcpOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnU2l6ZSA8PCAocy0+YWRjQ2hhbm5lbHMtMSksIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQkvKiB3ZSBpZ25vcmUgZnJhZ21lbnQgc2l6ZSByZXF1ZXN0ICovCisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJLyogd2hhdCBpcyB0aGlzIGZvcj8gW2pzdW5dICovCisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KKwkJCQlzLT5hZGNSYXRlIDogcy0+ZGFjUmF0ZSwgKGludCAqKWFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXJldHVybiBwdXRfdXNlcihzLT5hZGNDaGFubmVscywgKGludCAqKWFyZyk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kYWNDaGFubmVscyA/IDIgOiAxLCAoaW50ICopYXJnKTsKKwkgICAgCisJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlyZXR1cm4gcHV0X3VzZXIoMTYsIChpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBtaXhkZXZfaW9jdGwocy0+Y29kZWMsIGNtZCwgYXJnKTsKK30KKworCitzdGF0aWMgaW50IHZyYzU0NzdfYWM5N19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnM7CisJaW50IHJldD0wOworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7ICAgIAorCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlLCBkZXZzKTsKKwkJaWYgKCEoKHMtPmRldl9hdWRpbyBeIG1pbm9yKSAmIH4weGYpKQorCQkJYnJlYWs7CisJfQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkvKiBzZXQgZGVmYXVsdCBzZXR0aW5ncyAqLworCQlzZXRfYWRjX3JhdGUocywgNDgwMDApOworCQlzLT5hZGNDaGFubmVscyA9IDI7CisKKwkJcmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpOworCQlpZiAocmV0KSBnb3RvIGJhaWxvdXQ7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkvKiBzZXQgZGVmYXVsdCBzZXR0aW5ncyAqLworCQlzZXRfZGFjX3JhdGUocywgNDgwMDApOworCQlzLT5kYWNDaGFubmVscyA9IDI7CisKKwkJcmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpOworCQlpZiAocmV0KSBnb3RvIGJhaWxvdXQ7CisJfQorCisJcy0+b3Blbl9tb2RlIHw9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCisgYmFpbG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdnJjNTQ3N19hYzk3X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcyA9IAorCQkoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RvcF9kYWMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RvcF9hZGMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKKwl9CisJcy0+b3Blbl9tb2RlICY9ICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdnJjNTQ3N19hYzk3X2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHZyYzU0NzdfYWM5N19yZWFkLAorCS53cml0ZQkJPSB2cmM1NDc3X2FjOTdfd3JpdGUsCisJLnBvbGwJCT0gdnJjNTQ3N19hYzk3X3BvbGwsCisJLmlvY3RsCQk9IHZyYzU0NzdfYWM5N19pb2N0bCwKKwkvLyAubW1hcAk9IHZyYzU0NzdfYWM5N19tbWFwLAorCS5vcGVuCQk9IHZyYzU0NzdfYWM5N19vcGVuLAorCS5yZWxlYXNlCT0gdnJjNTQ3N19hYzk3X3JlbGVhc2UsCit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UnbGwgY3JlYXRlIGEgcHJvYyBkZXZpY2UgdGhhdCBkdW1wcyB0aGUKKyAqIENPREVDIGNoaXBzdGF0ZQorICovCisKKyNpZmRlZiBWUkM1NDc3X0FDOTdfREVCVUcKKworc3RydWN0IHsKKyAgICAgICBjb25zdCBjaGFyICpyZWduYW1lOworICAgICAgIHVuc2lnbmVkIHJlZ2FkZHI7Cit9IHZyYzU0NzdfYWM5N19yZWdzW10gPSB7CisJeyJWUkM1NDc3X0lOVF9TVEFUVVMiLCBWUkM1NDc3X0lOVF9TVEFUVVN9LAorCXsiVlJDNTQ3N19DT0RFQ19XUiIsIFZSQzU0NzdfQ09ERUNfV1J9LAorCXsiVlJDNTQ3N19DT0RFQ19SRCIsIFZSQzU0NzdfQ09ERUNfUkR9LAorCXsiVlJDNTQ3N19DVFJMIiwgVlJDNTQ3N19DVFJMfSwKKwl7IlZSQzU0NzdfQUNMSU5LX0NUUkwiLCBWUkM1NDc3X0FDTElOS19DVFJMfSwKKwl7IlZSQzU0NzdfSU5UX01BU0siLCBWUkM1NDc3X0lOVF9NQVNLfSwKKwl7IlZSQzU0NzdfREFDMV9DVFJMIiwgVlJDNTQ3N19EQUMxX0NUUkx9LAorCXsiVlJDNTQ3N19EQUMxTCIsIFZSQzU0NzdfREFDMUx9LAorCXsiVlJDNTQ3N19EQUMxX0JBRERSIiwgVlJDNTQ3N19EQUMxX0JBRERSfSwKKwl7IlZSQzU0NzdfREFDMl9DVFJMIiwgVlJDNTQ3N19EQUMyX0NUUkx9LAorCXsiVlJDNTQ3N19EQUMyTCIsIFZSQzU0NzdfREFDMkx9LAorCXsiVlJDNTQ3N19EQUMyX0JBRERSIiwgVlJDNTQ3N19EQUMyX0JBRERSfSwKKwl7IlZSQzU0NzdfREFDM19DVFJMIiwgVlJDNTQ3N19EQUMzX0NUUkx9LAorCXsiVlJDNTQ3N19EQUMzTCIsIFZSQzU0NzdfREFDM0x9LAorCXsiVlJDNTQ3N19EQUMzX0JBRERSIiwgVlJDNTQ3N19EQUMzX0JBRERSfSwKKwl7IlZSQzU0NzdfQURDMV9DVFJMIiwgVlJDNTQ3N19BREMxX0NUUkx9LAorCXsiVlJDNTQ3N19BREMxTCIsIFZSQzU0NzdfQURDMUx9LAorCXsiVlJDNTQ3N19BREMxX0JBRERSIiwgVlJDNTQ3N19BREMxX0JBRERSfSwKKwl7IlZSQzU0NzdfQURDMl9DVFJMIiwgVlJDNTQ3N19BREMyX0NUUkx9LAorCXsiVlJDNTQ3N19BREMyTCIsIFZSQzU0NzdfQURDMkx9LAorCXsiVlJDNTQ3N19BREMyX0JBRERSIiwgVlJDNTQ3N19BREMyX0JBRERSfSwKKwl7IlZSQzU0NzdfQURDM19DVFJMIiwgVlJDNTQ3N19BREMzX0NUUkx9LAorCXsiVlJDNTQ3N19BREMzTCIsIFZSQzU0NzdfQURDM0x9LAorCXsiVlJDNTQ3N19BREMzX0JBRERSIiwgVlJDNTQ3N19BREMzX0JBRERSfSwKKwl7TlVMTCwgMHgwfQorfTsKKworc3RhdGljIGludCBwcm9jX3ZyYzU0NzdfYWM5N19kdW1wIChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3QgZnBvcywKKwkJCQkgICBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzOworCWludCBjbnQsIGxlbiA9IDA7CisKKwlpZiAobGlzdF9lbXB0eSgmZGV2cykpCisJCXJldHVybiAwOworCXMgPSBsaXN0X2VudHJ5KGRldnMubmV4dCwgc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSwgZGV2cyk7CisKKwkvKiBwcmludCBvdXQgaGVhZGVyICovCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXG5cdFx0VnJjNTQ3NyBBdWRpbyBEZWJ1Z1xuXG4iKTsKKworCS8vIHByaW50IG91dCBkaWdpdGFsIGNvbnRyb2xsZXIgc3RhdGUKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiTkVDIFZyYzU0NzcgQXVkaW8gQ29udHJvbGxlciByZWdpc3RlcnNcbiIpOworCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWZvciAoY250PTA7IHZyYzU0NzdfYWM5N19yZWdzW2NudF0ucmVnbmFtZSAhPSBOVUxMOyBjbnQrKykgeworCQlsZW4rPSBzcHJpbnRmIChidWYgKyBsZW4sICIlLTIwcyA9ICUwOHhcbiIsCisJCQkgICAgICAgdnJjNTQ3N19hYzk3X3JlZ3NbY250XS5yZWduYW1lLAorCQkJICAgICAgIGlubChzLT5pbyArIHZyYzU0NzdfYWM5N19yZWdzW2NudF0ucmVnYWRkcikpOworCX0KKyAgIAorCS8qIHByaW50IG91dCBkcml2ZXIgc3RhdGUgKi8KKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiTkVDIFZyYzU0NzcgQXVkaW8gZHJpdmVyIHN0YXRlc1xuIik7CisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRhY0NoYW5uZWxzICA9ICVkXG4iLCBzLT5kYWNDaGFubmVscyk7CisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImFkY0NoYW5uZWxzICA9ICVkXG4iLCBzLT5hZGNDaGFubmVscyk7CisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRhY1JhdGUgID0gJWRcbiIsIHMtPmRhY1JhdGUpOworCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJhZGNSYXRlICA9ICVkXG4iLCBzLT5hZGNSYXRlKTsKKworCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfZGFjIGlzICVzIHJlYWR5XG4iLCAgCisJICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMucmVhZHk/ICIiIDogIm5vdCIpOworICAgICAgICBpZiAocy0+ZG1hX2RhYy5yZWFkeSkgeworCQlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZG1hX2RhYyBpcyAlcyBzdG9wcGVkLlxuIiwgIAorCSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuc3RvcHBlZD8gIiIgOiAibm90Iik7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfZGFjLmZyYWdTaXplID0gJXhcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmZyYWdTaXplKTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9kYWMuZnJhZ1NoaWZ0ID0gJXhcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmZyYWdTaGlmdCk7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfZGFjLm51bUZyYWcgPSAleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMubnVtRnJhZyk7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfZGFjLmZyYWdUb3RhbFNpemUgPSAleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuZnJhZ1RvdGFsU2l6ZSk7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfZGFjLm5leHRJbiA9ICV4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5uZXh0SW4pOworCQlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZG1hX2RhYy5uZXh0T3V0ID0gJXhcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLm5leHRPdXQpOworCQlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZG1hX2RhYy5jb3VudCA9ICV4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5jb3VudCk7CisJfQorCisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9hZGMgaXMgJXMgcmVhZHlcbiIsICAKKwkgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5yZWFkeT8gIiIgOiAibm90Iik7CisgICAgICAgIGlmIChzLT5kbWFfYWRjLnJlYWR5KSB7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfYWRjIGlzICVzIHN0b3BwZWQuXG4iLCAgCisJICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5zdG9wcGVkPyAiIiA6ICJub3QiKTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9hZGMuZnJhZ1NpemUgPSAleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuZnJhZ1NpemUpOworCQlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZG1hX2FkYy5mcmFnU2hpZnQgPSAleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuZnJhZ1NoaWZ0KTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9hZGMubnVtRnJhZyA9ICV4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5udW1GcmFnKTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9hZGMuZnJhZ1RvdGFsU2l6ZSA9ICV4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5mcmFnVG90YWxTaXplKTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9hZGMubmV4dEluID0gJXhcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLm5leHRJbik7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfYWRjLm5leHRPdXQgPSAleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMubmV4dE91dCk7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfYWRjLmNvdW50ID0gJXhcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLmNvdW50KTsKKwl9CisJIAorCS8qIHByaW50IG91dCBDT0RFQyBzdGF0ZSAqLworCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJcbkFDOTcgQ09ERUMgcmVnaXN0ZXJzXG4iKTsKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yIChjbnQ9MDsgY250IDw9IDB4N2U7IGNudCA9IGNudCArMikKKwkJbGVuKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAicmVnICUwMnggPSAlMDR4XG4iLAorCQkJICAgICAgIGNudCwgcmRjb2RlYyhzLT5jb2RlYywgY250KSk7CisKKwlpZiAoZnBvcyA+PWxlbil7CisJCSpzdGFydCA9IGJ1ZjsKKwkJKmVvZiA9MTsKKwkJcmV0dXJuIDA7CisJfQorCSpzdGFydCA9IGJ1ZiArIGZwb3M7CisJaWYgKChsZW4gLT0gZnBvcykgPiBsZW5ndGgpCisJCXJldHVybiBsZW5ndGg7CisJKmVvZiA9MTsKKwlyZXR1cm4gbGVuOworCit9CisjZW5kaWYgLyogVlJDNTQ3N19BQzk3X0RFQlVHICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzOyBvbmx5IHVzZWQgZm9yIGNvbW1hbmQgbGluZSBwYXJhbXMgKi8KKyNkZWZpbmUgTlJfREVWSUNFIDUKKworc3RhdGljIHVuc2lnbmVkIGludCBkZXZpbmRleDsKKworTU9EVUxFX0FVVEhPUigiTW9udGEgVmlzdGEgU29mdHdhcmUsIGpzdW5AbXZpc3RhLmNvbSBvciBqc3VuQGp1bnN1bi5uZXQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTkVDIFZyYzU0NzcgYXVkaW8gKEFDOTcpIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2cmM1NDc3X2FjOTdfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQoreworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnM7CisjaWZkZWYgVlJDNTQ3N19BQzk3X0RFQlVHCisJY2hhciBwcm9jX3N0cls4MF07CisjZW5kaWYKKworCWlmIChwY2lkZXYtPmlycSA9PSAwKSAKKwkJcmV0dXJuIC0xOworCisJaWYgKCEocyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUpLCBHRlBfS0VSTkVMKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYWxsb2Mgb2YgZGV2aWNlIHN0cnVjdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSkpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKworCXMtPmRldiA9IHBjaWRldjsKKwlzLT5pbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOworCXMtPmlycSA9IHBjaWRldi0+aXJxOworCQorCXMtPmNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpOworCisJcy0+Y29kZWMtPnByaXZhdGVfZGF0YSA9IHM7CisJcy0+Y29kZWMtPmlkID0gMDsKKwlzLT5jb2RlYy0+Y29kZWNfcmVhZCA9IHJkY29kZWM7CisJcy0+Y29kZWMtPmNvZGVjX3dyaXRlID0gd3Jjb2RlYzsKKwlzLT5jb2RlYy0+Y29kZWNfd2FpdCA9IHdhaXRjb2RlYzsKKworCS8qIHNldHRpbmcgc29tZSBvdGhlciBkZWZhdWx0IHZhbHVlcyBzdWNoIGFzCisJICogYWRjQ2hhbm5lbHMsIGFkY1JhdGUgaXMgZG9uZSBpbiBvcGVuKCkgc28gdGhhdAorICAgICAgICAgKiBubyBwZXJzaXN0ZW50IHN0YXRlIGFjcm9zcyBmaWxlIG9wZW5zLgorCSAqLworCisJLyogdGVzdCBpZiBnZXQgcmVzcG9uc2UgZnJvbSBhYzk3LCBpZiBub3QgcmV0dXJuICovCisgICAgICAgIGlmIChhYzk3X2NvZGVjX25vdF9wcmVzZW50KHMtPmNvZGVjKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJubyBhYzk3IGNvZGVjXG4iKTsKKwkJZ290byBlcnJfcmVnaW9uOworCisgICAgICAgIH0KKworCS8qIHRlc3QgaWYgZ2V0IHJlc3BvbnNlIGZyb20gYWM5NywgaWYgbm90IHJldHVybiAqLworICAgICAgICBpZiAoYWM5N19jb2RlY19ub3RfcHJlc2VudCgmKHMtPmNvZGVjKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm8gYWM5NyBjb2RlY1xuIik7CisJCWdvdG8gZXJyX3JlZ2lvbjsKKworICAgICAgICB9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvLCBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwwKSwKKwkJCSAgICBWUkM1NDc3X0FDOTdfTU9EVUxFX05BTUUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImlvIHBvcnRzICUjbHgtPiUjbHggaW4gdXNlXG4iLAorCQkgICAgICAgcy0+aW8sIHMtPmlvICsgcGNpX3Jlc291cmNlX2xlbihwY2lkZXYsMCktMSk7CisJCWdvdG8gZXJyX3JlZ2lvbjsKKwl9CisJaWYgKHJlcXVlc3RfaXJxKHMtPmlycSwgdnJjNTQ3N19hYzk3X2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCQkJVlJDNTQ3N19BQzk3X01PRFVMRV9OQU1FLCBzKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpcnEgJXUgaW4gdXNlXG4iLCBzLT5pcnEpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIklPIGF0ICUjbHgsIElSUSAlZFxuIiwgcy0+aW8sIHMtPmlycSk7CisKKwkvKiByZWdpc3RlciBkZXZpY2VzICovCisJaWYgKChzLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJnZyYzU0NzdfYWM5N19hdWRpb19mb3BzLCAtMSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MTsKKwlpZiAoKHMtPmNvZGVjLT5kZXZfbWl4ZXIgPQorCSAgICAgcmVnaXN0ZXJfc291bmRfbWl4ZXIoJnZyYzU0NzdfYWM5N19taXhlcl9mb3BzLCAtMSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MjsKKworI2lmZGVmIFZSQzU0NzdfQUM5N19ERUJVRworCS8qIGluaXRpYWxpemUgdGhlIGRlYnVnIHByb2MgZGV2aWNlICovCisJcy0+cHMgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KFZSQzU0NzdfQUM5N19NT0RVTEVfTkFNRSwgMCwgTlVMTCwKKwkJCQkgICAgICAgcHJvY192cmM1NDc3X2FjOTdfZHVtcCwgTlVMTCk7CisjZW5kaWYgLyogVlJDNTQ3N19BQzk3X0RFQlVHICovCisJCisJLyogZW5hYmxlIHBjaSBpbyBhbmQgYnVzIG1hc3RlcmluZyAqLworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKQorCQlnb3RvIGVycl9kZXYzOworCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CisKKwkvKiBjb2xkIHJlc2V0IHRoZSBBQzk3ICovCisJb3V0bChWUkM1NDc3X0FDTElOS19DVFJMX1JTVF9PTiB8IFZSQzU0NzdfQUNMSU5LX0NUUkxfUlNUX1RJTUUsCisJICAgICBzLT5pbyArIFZSQzU0NzdfQUNMSU5LX0NUUkwpOworCXdoaWxlIChpbmwocy0+aW8gKyBWUkM1NDc3X0FDTElOS19DVFJMKSAmIFZSQzU0NzdfQUNMSU5LX0NUUkxfUlNUX09OKTsKKworCS8qIGNvZGVjIGluaXQgKi8KKwlpZiAoIWFjOTdfcHJvYmVfY29kZWMocy0+Y29kZWMpKQorCQlnb3RvIGVycl9kZXYzOworCisjaWZkZWYgVlJDNTQ3N19BQzk3X0RFQlVHCisJc3ByaW50Zihwcm9jX3N0ciwgImRyaXZlci8lcy8lZC9hYzk3IiwgCisJCVZSQzU0NzdfQUM5N19NT0RVTEVfTkFNRSwgcy0+Y29kZWMtPmlkKTsKKwlzLT5hYzk3X3BzID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAocHJvY19zdHIsIDAsIE5VTEwsCisJCQkJCSAgICAgYWM5N19yZWFkX3Byb2MsIHMtPmNvZGVjKTsKKwkvKiBUT0RPIDogd2h5IHRoaXMgcHJvYyBmaWxlIGRvZXMgbm90IHNob3cgdXA/ICovCisjZW5kaWYKKworCS8qIFRyeSB0byBlbmFibGUgdmFyaWFibGUgcmF0ZSBhdWRpbyBtb2RlLiAqLworCXdyY29kZWMocy0+Y29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLAorCQlyZGNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUykgfCBBQzk3X0VYVFNUQVRfVlJBKTsKKwkvKiBEaWQgd2UgZW5hYmxlIGl0PyAqLworCWlmKHJkY29kZWMocy0+Y29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKSAmIEFDOTdfRVhUU1RBVF9WUkEpCisJCXMtPmV4dGVuZGVkX3N0YXR1cyB8PSBBQzk3X0VYVFNUQVRfVlJBOworCWVsc2UgeworCQlzLT5kYWNSYXRlID0gNDgwMDA7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJWUkEgbW9kZSBub3QgZW5hYmxlZDsgcmF0ZSBmaXhlZCBhdCAlZC4iLAorCQkJcy0+ZGFjUmF0ZSk7CisJfQorCisgICAgICAgIC8qIGxldCB1cyBnZXQgdGhlIGRlZmF1bHQgdm9sdW1uZSBsb3VkZXIgKi8KKyAgICAgICAgd3Jjb2RlYyhzLT5jb2RlYywgMHgyLCAweDEwMTApOwkvKiBtYXN0ZXIgdm9sdW1lLCBtaWRkbGUgKi8KKyAgICAgICAgd3Jjb2RlYyhzLT5jb2RlYywgMHhjLCAweDEwKTsJCS8qIHBob25lIHZvbHVtZSwgbWlkZGxlICovCisgICAgICAgIC8vIHdyY29kZWMocy0+Y29kZWMsIDB4ZSwgMHgxMCk7CQkvKiBtaXNjIHZvbHVtZSwgbWlkZGxlICovCisJd3Jjb2RlYyhzLT5jb2RlYywgMHgxMCwgMHg4MDAwKTsJLyogbGluZS1pbiAyIGxpbmUtb3V0IGRpc2FibGUgKi8KKyAgICAgICAgd3Jjb2RlYyhzLT5jb2RlYywgMHgxOCwgMHgwNzA3KTsJLyogUENNIG91dCAobGluZSBvdXQpIG1pZGRsZSAqLworCisKKwkvKiBieSBkZWZhdWx0IHdlIHNlbGVjdCBsaW5lIGluIHRoZSBpbnB1dCAqLworCXdyY29kZWMocy0+Y29kZWMsIDB4MWEsIDB4MDQwNCk7CisJd3Jjb2RlYyhzLT5jb2RlYywgMHgxYywgMHgwZjBmKTsKKwl3cmNvZGVjKHMtPmNvZGVjLCAweDFlLCAweDA3KTsKKworCS8qIGVuYWJsZSB0aGUgbWFzdGVyIGludGVycnVwdCBidXQgZGlzYWJsZSBhbGwgb3RoZXJzICovCisJb3V0bChWUkM1NDc3X0lOVF9NQVNLX05NQVNLLCBzLT5pbyArIFZSQzU0NzdfSU5UX01BU0spOworCisJLyogc3RvcmUgaXQgaW4gdGhlIGRyaXZlciBmaWVsZCAqLworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHMpOworCXBjaWRldi0+ZG1hX21hc2sgPSAweGZmZmZmZmZmOworCS8qIHB1dCBpdCBpbnRvIGRyaXZlciBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmcy0+ZGV2cywgJmRldnMpOworCS8qIGluY3JlbWVudCBkZXZpbmRleCAqLworCWlmIChkZXZpbmRleCA8IE5SX0RFVklDRS0xKQorCQlkZXZpbmRleCsrOworCXJldHVybiAwOworCisgZXJyX2RldjM6CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5jb2RlYy0+ZGV2X21peGVyKTsKKyBlcnJfZGV2MjoKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworIGVycl9kZXYxOgorCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjIGRldmljZVxuIik7CisJZnJlZV9pcnEocy0+aXJxLCBzKTsKKyBlcnJfaXJxOgorCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwwKSk7CisgZXJyX3JlZ2lvbjoKKyAJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKKwlrZnJlZShzKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2cmM1NDc3X2FjOTdfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFzKQorCQlyZXR1cm47CisJbGlzdF9kZWwoJnMtPmRldnMpOworCisjaWZkZWYgVlJDNTQ3N19BQzk3X0RFQlVHCisJaWYgKHMtPnBzKQorCQlyZW1vdmVfcHJvY19lbnRyeShWUkM1NDc3X0FDOTdfTU9EVUxFX05BTUUsIE5VTEwpOworI2VuZGlmIC8qIFZSQzU0NzdfQUM5N19ERUJVRyAqLworCisJc3luY2hyb25pemVfaXJxKCk7CisJZnJlZV9pcnEocy0+aXJxLCBzKTsKKwlyZWxlYXNlX3JlZ2lvbihzLT5pbywgcGNpX3Jlc291cmNlX2xlbihkZXYsMCkpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5jb2RlYy0+ZGV2X21peGVyKTsKKwlhYzk3X3JlbGVhc2VfY29kZWMocy0+Y29kZWMpOworCWtmcmVlKHMpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpZF90YWJsZVtdID0geworICAgIHsgUENJX1ZFTkRPUl9JRF9ORUMsIFBDSV9ERVZJQ0VfSURfTkVDX1ZSQzU0NzdfQUM5NywgCisgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwIH0sCisgICAgeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdnJjNTQ3N19hYzk3X2RyaXZlciA9IHsKKwkubmFtZQkJPSBWUkM1NDc3X0FDOTdfTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlCT0gaWRfdGFibGUsCisJLnByb2JlCQk9IHZyYzU0NzdfYWM5N19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHZyYzU0NzdfYWM5N19yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3ZyYzU0NzdfYWM5Nyh2b2lkKQoreworCXByaW50aygiVnJjNTQ3NyBBQzk3IGRyaXZlcjogdmVyc2lvbiB2MC4yIHRpbWUgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIiBieSBKdW4gU3VuXG4iKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ2cmM1NDc3X2FjOTdfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfdnJjNTQ3N19hYzk3KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggInVubG9hZGluZ1xuIik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2cmM1NDc3X2FjOTdfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF92cmM1NDc3X2FjOTcpOworbW9kdWxlX2V4aXQoY2xlYW51cF92cmM1NDc3X2FjOTcpOworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvbm0yNTYuaCBiL3NvdW5kL29zcy9ubTI1Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZTdkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvbm0yNTYuaApAQCAtMCwwICsxLDI5NSBAQAorI2lmbmRlZiBfTk0yNTZfSF8KKyNkZWZpbmUgX05NMjU2X0hfCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAiYWM5Ny5oIgorCisvKiBUaGUgcmV2aXNpb25zIHRoYXQgd2UgY3VycmVudGx5IGhhbmRsZS4gICovCitlbnVtIG5tMjU2cmV2IHsKKyAgICBSRVZfTk0yNTZBViwgUkVWX05NMjU2WlgKK307CisKKy8qIFBlci1jYXJkIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBubTI1Nl9pbmZvIAoreworICAgIC8qIE1hZ2ljIG51bWJlciB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoaXMgc3RydWN0IGlzIHZhbGlkLiAqLworI2RlZmluZSBOTV9NQUdJQ19TSUcgMHg1NWFhMDBmZgorICAgIGludCBtYWdzaWc7CisKKyAgICAvKiBSZXZpc2lvbiBudW1iZXIgKi8KKyAgICBlbnVtIG5tMjU2cmV2IHJldjsKKworICAgIHN0cnVjdCBhYzk3X2h3aW50IG1kZXY7CisKKyAgICAvKiBPdXIgYXVkaW8gZGV2aWNlIG51bWJlcnMuICovCisgICAgaW50IGRldlsyXTsKKworICAgIC8qIFRoZSAjIG9mIHRpbWVzIGVhY2ggZGV2aWNlIGhhcyBiZWVuIG9wZW5lZC4gKFNob3VsZCBvbmx5IGJlIAorICAgICAgIDAgb3IgMSkuICovCisgICAgaW50IG9wZW5jbnRbMl07CisKKyAgICAvKiBXZSB1c2UgdHdvIGRldmljZXMsIGJlY2F1c2Ugd2UgY2FuIGRvIHNpbXVsdGFuZW91cyBwbGF5IGFuZCByZWNvcmQuCisgICAgICAgVGhpcyBrZWVwcyB0cmFjayBvZiB3aGljaCBkZXZpY2UgaXMgYmVpbmcgdXNlZCBmb3Igd2hhdCBwdXJwb3NlOworICAgICAgIHRoZXNlIGFyZSB0aGUgYWN0dWFsIGRldmljZSBudW1iZXJzLiAqLworICAgIGludCBkZXZfZm9yX3BsYXk7CisgICAgaW50IGRldl9mb3JfcmVjb3JkOworCisJc3BpbmxvY2tfdCBsb2NrOworCQorICAgIC8qIFRoZSBtaXhlciBkZXZpY2UuICovCisgICAgaW50IG1peGVyX29zc19kZXY7CisKKyAgICAvKiAKKyAgICAgKiBDYW4gb25seSBiZSBvcGVuZWQgb25jZSBmb3IgZWFjaCBvcGVyYXRpb24uICBUaGVzZSBhcmVuJ3Qgc2V0CisgICAgICogdW50aWwgYW4gYWN0dWFsIEkvTyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkOyB0aGlzIGFsbG93cyBvbmUKKyAgICAgKiBkZXZpY2UgdG8gYmUgb3BlbiBmb3IgcmVhZC93cml0ZSB3aXRob3V0IGluaGliaXRpbmcgSS9PIHRvCisgICAgICogdGhlIG90aGVyIGRldmljZS4KKyAgICAgKi8KKyAgICBpbnQgaXNfb3Blbl9wbGF5OworICAgIGludCBpc19vcGVuX3JlY29yZDsKKworICAgIC8qIE5vbi16ZXJvIGlmIHdlJ3JlIGN1cnJlbnRseSBwbGF5aW5nIGEgc2FtcGxlLiAqLworICAgIGludCBwbGF5aW5nOworICAgIC8qIERpdHRvIGZvciByZWNvcmRpbmcgYSBzYW1wbGUuICovCisgICAgaW50IHJlY29yZGluZzsKKworICAgIC8qIFRoZSB0d28gbWVtb3J5IHBvcnRzLiAgKi8KKyAgICBzdHJ1Y3Qgbm0yNTZfcG9ydHMgeworCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHBvcnQuICovCisJdTMyIHBoeXNhZGRyOworCS8qIE91ciBtYXBwZWQtaW4gcG9pbnRlci4gKi8KKwljaGFyIF9faW9tZW0gKnB0cjsKKwkvKiBQVFIncyBvZmZzZXQgd2l0aGluIHRoZSBwaHlzaWNhbCBwb3J0LiAgKi8KKwl1MzIgc3RhcnRfb2Zmc2V0OworCS8qIEFuZCB0aGUgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gICovCisJdTMyIGVuZF9vZmZzZXQ7CisgICAgfSBwb3J0WzJdOworCisgICAgLyogVGhlIGZvbGxvd2luZyBhcmUgb2Zmc2V0cyB3aXRoaW4gbWVtb3J5IHBvcnQgMS4gKi8KKyAgICB1MzIgY29lZmZCdWY7CisgICAgdTMyIGFsbENvZWZmQnVmOworCisgICAgLyogUmVjb3JkIGFuZCBwbGF5YmFjayBidWZmZXJzLiAqLworICAgIHUzMiBhYnVmMSwgYWJ1ZjI7CisKKyAgICAvKiBPZmZzZXQgb2YgdGhlIEFDOTcgbWl4ZXIgaW4gbWVtb3J5IHBvcnQgMi4gKi8KKyAgICB1MzIgbWl4ZXI7CisKKyAgICAvKiBPZmZzZXQgb2YgdGhlIG1peGVyIHN0YXR1cyByZWdpc3RlciBpbiBtZW1vcnkgcG9ydCAyLiAgKi8KKyAgICB1MzIgbWl4ZXJfc3RhdHVzX29mZnNldDsKKworICAgIC8qIE5vbi16ZXJvIGlmIHdlIGhhdmUgd3JpdHRlbiBpbml0aWFsIHZhbHVlcyB0byB0aGUgbWl4ZXIuICovCisgICAgdTggbWl4ZXJfdmFsdWVzX2luaXQ7CisKKyAgICAvKiAKKyAgICAgKiBTdGF0dXMgbWFzayBiaXQ7ICgqbWl4ZXJfc3RhdHVzX2xvYyAmIG1peGVyX3N0YXR1c19tYXNrKSA9PSAwIG1lYW5zCisgICAgICogaXQncyByZWFkeS4gIAorICAgICAqLworICAgIHUxNiBtaXhlcl9zdGF0dXNfbWFzazsKKworICAgIC8qIFRoZSBzaXplcyBvZiB0aGUgcGxheWJhY2sgYW5kIHJlY29yZCByaW5nIGJ1ZmZlcnMuICovCisgICAgdTMyIHBsYXliYWNrQnVmZmVyU2l6ZTsKKyAgICB1MzIgcmVjb3JkQnVmZmVyU2l6ZTsKKworICAgIC8qIEFyZSB0aGUgY29lZmZpY2llbnQgdmFsdWVzIGluIHRoZSBtZW1vcnkgY2FjaGUgY3VycmVudD8gKi8KKyAgICB1OCBjb2VmZnNDdXJyZW50OworCisgICAgLyogRm9yIHdyaXRlcywgdGhlIGFtb3VudCB3ZSBsYXN0IHdyb3RlLiAqLworICAgIHUzMiByZXF1ZXN0ZWRfYW10OworICAgIC8qIFRoZSBzdGFydCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHBsYXlpbmcuICovCisgICAgdTMyIGN1clBsYXlQb3M7CisKKyAgICAvKiBUaGUgYW1vdW50IG9mIGRhdGEgd2Ugd2VyZSByZXF1ZXN0ZWQgdG8gcmVjb3JkLiAqLworICAgIHUzMiByZXF1ZXN0ZWRSZWNBbXQ7CisgICAgLyogVGhlIG9mZnNldCBvZiB0aGUgY3VycmVudGx5LXJlY29yZGluZyBibG9jay4gKi8KKyAgICB1MzIgY3VyUmVjUG9zOworICAgIC8qIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICovCisgICAgY2hhciAqcmVjQnVmOworCisgICAgLyogT3VyIElSUSBudW1iZXIuICovCisgICAgaW50IGlycTsKKworICAgIC8qIEEgZmxhZyBpbmRpY2F0aW5nIGhvdyBtYW55IHRpbWVzIHdlJ3ZlIGdyYWJiZWQgdGhlIElSUS4gKi8KKyAgICBpbnQgaGFzX2lycTsKKworICAgIC8qIFRoZSBjYXJkIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuICovCisgICAgaXJxcmV0dXJuX3QgKCppbnRyb3V0aW5lKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCisgICAgLyogQ3VycmVudCBhdWRpbyBjb25maWcsIGNhY2hlZC4gKi8KKyAgICBzdHJ1Y3Qgc2luZm8geworCXUzMiBzYW1wbGVyYXRlOworCXU4IGJpdHM7CisJdTggc3RlcmVvOworICAgIH0gc2luZm9bMl07IC8qIGdvZXMgd2l0aCBlYWNoIGRldmljZSAqLworCisgICAgLyogVGhlIGNhcmRzIGFyZSBzdG9yZWQgaW4gYSBjaGFpbjsgIHRoaXMgaXMgdGhlIG5leHQgY2FyZC4gKi8KKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqbmV4dF9jYXJkOworfTsKKworLyogRGVidWcgZmxhZy0tYmlnZ2VyIG51bWJlcnMgbWVhbiBtb3JlIG91dHB1dC4gKi8KK2V4dGVybiBpbnQgbm0yNTZfZGVidWc7CisKKy8qIFRoZSBCSU9TIHNpZ25hdHVyZS4gKi8KKyNkZWZpbmUgTk1fU0lHTkFUVVJFIDB4NGU0ZDAwMDAKKy8qIFNpZ25hdHVyZSBtYXNrLiAqLworI2RlZmluZSBOTV9TSUdfTUFTSyAweGZmZmYwMDAwCisKKy8qIFNpemUgb2YgdGhlIHNlY29uZCBtZW1vcnkgYXJlYS4gKi8KKyNkZWZpbmUgTk1fUE9SVDJfU0laRSA0MDk2CisKKy8qIFRoZSBiYXNlIG9mZnNldCBvZiB0aGUgbWl4ZXIgaW4gdGhlIHNlY29uZCBtZW1vcnkgYXJlYS4gKi8KKyNkZWZpbmUgTk1fTUlYRVJfT0ZGU0VUIDB4NjAwCisKKy8qIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBjb2VmZmljaWVudCBlbnRyeS4gKi8KKyNkZWZpbmUgTk1fTUFYX0NPRUZGSUNJRU5UIDB4NTAwMAorCisvKiBUaGUgaW50ZXJydXB0IHJlZ2lzdGVyLiAqLworI2RlZmluZSBOTV9JTlRfUkVHIDB4YTA0CisvKiBBbmQgaXRzIGJpdHMuICovCisjZGVmaW5lIE5NX1BMQVlCQUNLX0lOVCAweDQwCisjZGVmaW5lIE5NX1JFQ09SRF9JTlQgMHgxMDAKKyNkZWZpbmUgTk1fTUlTQ19JTlRfMSAweDQwMDAKKyNkZWZpbmUgTk1fTUlTQ19JTlRfMiAweDEKKyNkZWZpbmUgTk1fQUNLX0lOVChDQVJELCBYKSBubTI1Nl93cml0ZVBvcnQxNigoQ0FSRCksIDIsIE5NX0lOVF9SRUcsIChYKSA8PCAxKQorCisvKiBUaGUgQVYncyAibWl4ZXIgcmVhZHkiIHN0YXR1cyBiaXQgYW5kIGxvY2F0aW9uLiAqLworI2RlZmluZSBOTV9NSVhFUl9TVEFUVVNfT0ZGU0VUIDB4YTA0CisjZGVmaW5lIE5NX01JWEVSX1JFQURZX01BU0sgMHgwODAwCisjZGVmaW5lIE5NX01JWEVSX1BSRVNFTkNFIDB4YTA2CisjZGVmaW5lIE5NX1BSRVNFTkNFX01BU0sgMHgwMDUwCisjZGVmaW5lIE5NX1BSRVNFTkNFX1ZBTFVFIDB4MDA0MAorCisvKgorICogRm9yIHRoZSBaWC4gIEl0IHVzZXMgdGhlIHNhbWUgaW50ZXJydXB0IHJlZ2lzdGVyLCBidXQgaXQgaG9sZHMgMzIKKyAqIGJpdHMgaW5zdGVhZCBvZiAxNi4KKyAqLworI2RlZmluZSBOTTJfUExBWUJBQ0tfSU5UIDB4MTAwMDAKKyNkZWZpbmUgTk0yX1JFQ09SRF9JTlQgMHg4MDAwMAorI2RlZmluZSBOTTJfTUlTQ19JTlRfMSAweDgKKyNkZWZpbmUgTk0yX01JU0NfSU5UXzIgMHgyCisjZGVmaW5lIE5NMl9BQ0tfSU5UKENBUkQsIFgpIG5tMjU2X3dyaXRlUG9ydDMyKChDQVJEKSwgMiwgTk1fSU5UX1JFRywgKFgpKQorCisvKiBUaGUgWlgncyAibWl4ZXIgcmVhZHkiIHN0YXR1cyBiaXQgYW5kIGxvY2F0aW9uLiAqLworI2RlZmluZSBOTTJfTUlYRVJfU1RBVFVTX09GRlNFVCAweGEwNgorI2RlZmluZSBOTTJfTUlYRVJfUkVBRFlfTUFTSyAweDA4MDAKKworLyogVGhlIHBsYXliYWNrIHJlZ2lzdGVycyBzdGFydCBmcm9tIGhlcmUuICovCisjZGVmaW5lIE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgMHgwCisvKiBUaGUgcmVjb3JkIHJlZ2lzdGVycyBzdGFydCBmcm9tIGhlcmUuICovCisjZGVmaW5lIE5NX1JFQ09SRF9SRUdfT0ZGU0VUIDB4MjAwCisKKy8qIFRoZSByYXRlIHJlZ2lzdGVyIGlzIGxvY2F0ZWQgMiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcmVnaXN0ZXIgYXJlYS4gKi8KKyNkZWZpbmUgTk1fUkFURV9SRUdfT0ZGU0VUIDIKKworLyogTW9uby9zdGVyZW8gZmxhZywgbnVtYmVyIG9mIGJpdHMgb24gcGxheWJhY2ssIGFuZCByYXRlIG1hc2suICovCisjZGVmaW5lIE5NX1JBVEVfU1RFUkVPIDEKKyNkZWZpbmUgTk1fUkFURV9CSVRTXzE2IDIKKyNkZWZpbmUgTk1fUkFURV9NQVNLIDB4ZjAKKworLyogUGxheWJhY2sgZW5hYmxlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBOTV9QTEFZQkFDS19FTkFCTEVfUkVHIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHgxKQorI2RlZmluZSBOTV9QTEFZQkFDS19FTkFCTEVfRkxBRyAxCisjZGVmaW5lIE5NX1BMQVlCQUNLX09ORVNIT1QgMgorI2RlZmluZSBOTV9QTEFZQkFDS19GUkVFUlVOIDQKKworLyogTXV0ZXMgdGhlIGF1ZGlvIG91dHB1dC4gKi8KKyNkZWZpbmUgTk1fQVVESU9fTVVURV9SRUcgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDE4KQorI2RlZmluZSBOTV9BVURJT19NVVRFX0xFRlQgMHg4MDAwCisjZGVmaW5lIE5NX0FVRElPX01VVEVfUklHSFQgMHgwMDgwCisKKy8qIFJlY29yZGluZyBlbmFibGUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE5NX1JFQ09SRF9FTkFCTEVfUkVHIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDApCisjZGVmaW5lIE5NX1JFQ09SRF9FTkFCTEVfRkxBRyAxCisjZGVmaW5lIE5NX1JFQ09SRF9GUkVFUlVOIDIKKworI2RlZmluZSBOTV9SQlVGRkVSX1NUQVJUIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDB4NCkKKyNkZWZpbmUgTk1fUkJVRkZFUl9FTkQgICAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAweDEwKQorI2RlZmluZSBOTV9SQlVGRkVSX1dNQVJLIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDB4YykKKyNkZWZpbmUgTk1fUkJVRkZFUl9DVVJSUCAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAweDgpCisKKyNkZWZpbmUgTk1fUEJVRkZFUl9TVEFSVCAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4NCkKKyNkZWZpbmUgTk1fUEJVRkZFUl9FTkQgICAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4MTQpCisjZGVmaW5lIE5NX1BCVUZGRVJfV01BUksgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweGMpCisjZGVmaW5lIE5NX1BCVUZGRVJfQ1VSUlAgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDgpCisKKy8qIEEgZmV3IHRyaXZpYWwgcm91dGluZXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd29yayB3aXRoIHRoZSByZWdpc3RlcnMKKyAgIG9uIHRoZSBjaGlwLiAqLworCisvKiBUaGlzIGlzIGEgY29tbW9uIGNvZGUgcG9ydGlvbiB1c2VkIHRvIGZpeCB1cCB0aGUgcG9ydCBvZmZzZXRzLiAqLworI2RlZmluZSBOTV9GSVhfUE9SVCBcCisgIGlmIChwb3J0IDwgMSB8fCBwb3J0ID4gMiB8fCBjYXJkID09IE5VTEwpIFwKKyAgICAgIHJldHVybiAtMTsgXAorXAorICAgIGlmIChvZmZzZXQgPCBjYXJkLT5wb3J0W3BvcnQgLSAxXS5zdGFydF9vZmZzZXQgXAorCXx8IG9mZnNldCA+PSBjYXJkLT5wb3J0W3BvcnQgLSAxXS5lbmRfb2Zmc2V0KSB7IFwKKwlwcmludGsgKEtFUk5fRVJSICJCYWQgYWNjZXNzOiBwb3J0ICVkLCBvZmZzZXQgMHgleFxuIiwgcG9ydCwgb2Zmc2V0KTsgXAorCXJldHVybiAtMTsgXAorICAgIH0gXAorICAgIG9mZnNldCAtPSBjYXJkLT5wb3J0W3BvcnQgLSAxXS5zdGFydF9vZmZzZXQ7CisKKyNkZWZpbmUgREVGd3JpdGVQb3J0WChYLCBmdW5jKSBcCitzdGF0aWMgaW5saW5lIGludCBubTI1Nl93cml0ZVBvcnQjI1ggKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLFwKKwkJCQkgICAgICBpbnQgcG9ydCwgaW50IG9mZnNldCwgaW50IHZhbHVlKVwKK3tcCisgICAgdSMjWCBfX2lvbWVtICphZGRyO1wKK1wKKyAgICBpZiAobm0yNTZfZGVidWcgPiAxKVwKKyAgICAgICAgcHJpbnRrIChLRVJOX0RFQlVHICJXcml0aW5nIDB4JXggdG8gJWQ6MHgleFxuIiwgdmFsdWUsIHBvcnQsIG9mZnNldCk7XAorXAorICAgIE5NX0ZJWF9QT1JUO1wKK1wKKyAgICBhZGRyID0gKHUjI1ggX19pb21lbSAqKShjYXJkLT5wb3J0W3BvcnQgLSAxXS5wdHIgKyBvZmZzZXQpO1wKKyAgICBmdW5jICh2YWx1ZSwgYWRkcik7XAorICAgIHJldHVybiAwO1wKK30KKworREVGd3JpdGVQb3J0WCAoOCwgd3JpdGViKQorREVGd3JpdGVQb3J0WCAoMTYsIHdyaXRldykKK0RFRndyaXRlUG9ydFggKDMyLCB3cml0ZWwpCisKKyNkZWZpbmUgREVGcmVhZFBvcnRYKFgsIGZ1bmMpIFwKK3N0YXRpYyBpbmxpbmUgdSMjWCBubTI1Nl9yZWFkUG9ydCMjWCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsXAorCQkJCQlpbnQgcG9ydCwgaW50IG9mZnNldClcCit7XAorICAgIHUjI1ggX19pb21lbSAqYWRkcjtcCitcCisgICAgTk1fRklYX1BPUlRcCitcCisgICAgYWRkciA9ICh1IyNYIF9faW9tZW0gKikoY2FyZC0+cG9ydFtwb3J0IC0gMV0ucHRyICsgb2Zmc2V0KTtcCisgICAgcmV0dXJuIGZ1bmMoYWRkcik7XAorfQorCitERUZyZWFkUG9ydFggKDgsIHJlYWRiKQorREVGcmVhZFBvcnRYICgxNiwgcmVhZHcpCitERUZyZWFkUG9ydFggKDMyLCByZWFkbCkKKworc3RhdGljIGlubGluZSBpbnQKK25tMjU2X3dyaXRlQnVmZmVyOCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIHU4ICpzcmMsIGludCBwb3J0LCBpbnQgb2Zmc2V0LAorCQkgICAgICBpbnQgYW10KQoreworICAgIE5NX0ZJWF9QT1JUOworICAgIG1lbWNweV90b2lvIChjYXJkLT5wb3J0W3BvcnQgLSAxXS5wdHIgKyBvZmZzZXQsIHNyYywgYW10KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25tMjU2X3JlYWRCdWZmZXI4IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgdTggKmRzdCwgaW50IHBvcnQsIGludCBvZmZzZXQsCisJCSAgICAgaW50IGFtdCkKK3sKKyAgICBOTV9GSVhfUE9SVDsKKyAgICBtZW1jcHlfZnJvbWlvIChkc3QsIGNhcmQtPnBvcnRbcG9ydCAtIDFdLnB0ciArIG9mZnNldCwgYW10KTsKKyAgICByZXR1cm4gMDsKK30KKworLyogUmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIGlmIHdlIHNob3VsZCB1c2UgdGhlIGNvZWZmaWNpZW50IGNhY2hlLiAqLworZXh0ZXJuIGludCBubTI1Nl9jYWNoZWRDb2VmZmljaWVudHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKTsKKworI2VuZGlmCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL25tMjU2X2F1ZGlvLmMgYi9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTE2NmUxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL25tMjU2X2F1ZGlvLmMKQEAgLTAsMCArMSwxNzA3IEBACisvKiAKKyAqIEF1ZGlvIGRyaXZlciBmb3IgdGhlIE5lb01hZ2ljIDI1NkFWIGFuZCAyNTZaWCBjaGlwc2V0cyBpbiBuYXRpdmUKKyAqIG1vZGUsIHdpdGggQUM5NyBtaXhlciBzdXBwb3J0LgorICoKKyAqIE92ZXJhbGwgZGVzaWduIGFuZCBwYXJ0cyBvZiB0aGlzIGNvZGUgc3RvbGVuIGZyb20gdmlkY18qLmMgYW5kCisgKiBza2VsZXRvbi5jLgorICoKKyAqIFllYWgsIHRoZXJlIGFyZSBhIGxvdCBvZiBtYWdpYyBjb25zdGFudHMgaW4gaGVyZS4gIFlvdSB0ZWxsIE1FIHdoYXQKKyAqIHRoZXkgYXJlLiAgSSBqdXN0IGdldCB0aGlzIHN0dWZmIHBzeWNoaWNhbGx5LCByZW1lbWJlcj8gCisgKgorICogVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gYnkgc29tZW9uZSB3aG8gd2lzaGVzIHRvIHJlbWFpbiBhbm9ueW1vdXMuIAorICogSXQgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIHNoYXJlIGFuZCBlbmpveS4gIFRyeSB0byBtYWtlIGEgcHJvZml0CisgKiBvZmYgb2YgaXQ7IGdvIG9uLCBJIGRhcmUgeW91LiAgCisgKgorICogQ2hhbmdlczoKKyAqIDExLTEwLTIwMDAJQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Ymt6QGxpbnV4LWlkZS5vcmc+CisgKgkJQWRkZWQgc29tZSBfX2luaXQKKyAqIDE5LTA0LTIwMDEJTWFyY3VzIE1laXNzbmVyIDxtbUBjYWxkZXJhLmRlPgorICoJCVBvcnRlZCB0byAyLjQgUENJIEFQSS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgIm5tMjU2LmgiCisjaW5jbHVkZSAibm0yNTZfY29lZmYuaCIKKworaW50IG5tMjU2X2RlYnVnOworc3RhdGljIGludCBmb3JjZV9sb2FkOworCisvKiAKKyAqIFRoZSBzaXplIG9mIHRoZSBwbGF5YmFjayByZXNlcnZlLiAgV2hlbiB0aGUgcGxheWJhY2sgYnVmZmVyIGhhcyBsZXNzCisgKiB0aGFuIE5NMjU2X1BMQVlfV01BUktfU0laRSBieXRlcyB0byBvdXRwdXQsIHdlIHJlcXVlc3QgYSBuZXcKKyAqIGJ1ZmZlci4KKyAqLworI2RlZmluZSBOTTI1Nl9QTEFZX1dNQVJLX1NJWkUgNTEyCisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIG5tMjU2X2F1ZGlvX2RyaXZlcjsKKworc3RhdGljIGludCBubTI1Nl9ncmFiSW50ZXJydXB0IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCk7CitzdGF0aWMgaW50IG5tMjU2X3JlbGVhc2VJbnRlcnJ1cHQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBubTI1Nl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBubTI1Nl9pbnRlcnJ1cHRfenggKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KTsKK3N0YXRpYyBpbnQgaGFuZGxlX3BtX2V2ZW50IChzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKTsKKworLyogVGhlc2UgYmVsb25nIGluIGxpbnV4L3BjaS5oLiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2QVZfQVVESU8gMHg4MDA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZaWF9BVURJTyAweDgwMDYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlhMX1BMVVNfQVVESU8gMHg4MDE2CisKKy8qIExpc3Qgb2YgY2FyZHMuICAqLworc3RhdGljIHN0cnVjdCBubTI1Nl9pbmZvICpubWNhcmRfbGlzdDsKKworLyogUmVsZWFzZSB0aGUgbWFwcGVkLWluIG1lbW9yeSBmb3IgQ0FSRC4gICovCitzdGF0aWMgdm9pZAorbm0yNTZfcmVsZWFzZV9wb3J0cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgaW50IHg7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7CisJaWYgKGNhcmQtPnBvcnRbeF0ucHRyICE9IE5VTEwpIHsKKwkgICAgaW91bm1hcCAoY2FyZC0+cG9ydFt4XS5wdHIpOworCSAgICBjYXJkLT5wb3J0W3hdLnB0ciA9IE5VTEw7CisJfQorICAgIH0KK30KKworLyogCisgKiBNYXAgaW4gdGhlIG1lbW9yeSBwb3J0cyBmb3IgQ0FSRCwgaWYgdGhleSBhcmVuJ3QgYWxyZWFkeSBtYXBwZWQgaW4KKyAqIGFuZCBoYXZlIGJlZW4gY29uZmlndXJlZC4gIElmIHN1Y2Nlc3NmdWwsIGEgemVybyB2YWx1ZSBpcyByZXR1cm5lZDsKKyAqIG90aGVyd2lzZSBhbnkgcHJldmlvdXNseSBtYXBwZWQtaW4gYXJlYXMgYXJlIHJlbGVhc2VkIGFuZCBhIG5vbi16ZXJvCisgKiB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqCisgKiBUaGlzIGlzIGludm9rZWQgdHdpY2UsIG9uY2UgZm9yIGVhY2ggcG9ydC4gIElkZWFsbHkgaXQgd291bGQgb25seSBiZQorICogY2FsbGVkIG9uY2UsIGJ1dCB3ZSBub3cgbmVlZCB0byBtYXAgaW4gdGhlIHNlY29uZCBwb3J0IGluIG9yZGVyIHRvCisgKiBjaGVjayBob3cgbXVjaCBtZW1vcnkgdGhlIGNhcmQgaGFzIG9uIHRoZSAyNTZaWC4KKyAqLworc3RhdGljIGludAorbm0yNTZfcmVtYXBfcG9ydHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIGludCB4OworCisgICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgeworCWlmIChjYXJkLT5wb3J0W3hdLnB0ciA9PSBOVUxMICYmIGNhcmQtPnBvcnRbeF0uZW5kX29mZnNldCA+IDApIHsKKwkgICAgdTMyIHBoeXNhZGRyIAorCQk9IGNhcmQtPnBvcnRbeF0ucGh5c2FkZHIgKyBjYXJkLT5wb3J0W3hdLnN0YXJ0X29mZnNldDsKKwkgICAgdTMyIHNpemUgCisJCT0gY2FyZC0+cG9ydFt4XS5lbmRfb2Zmc2V0IC0gY2FyZC0+cG9ydFt4XS5zdGFydF9vZmZzZXQ7CisKKwkgICAgY2FyZC0+cG9ydFt4XS5wdHIgPSBpb3JlbWFwX25vY2FjaGUgKHBoeXNhZGRyLCBzaXplKTsKKwkJCQkJCSAgCisJICAgIGlmIChjYXJkLT5wb3J0W3hdLnB0ciA9PSBOVUxMKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBVbmFibGUgdG8gcmVtYXAgcG9ydCAlZFxuIiwgeCArIDEpOworCQlubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogTG9jYXRlIHRoZSBjYXJkIGluIG91ciBsaXN0LiAqLworc3RhdGljIHN0cnVjdCBubTI1Nl9pbmZvICoKK25tMjU2X2ZpbmRfY2FyZCAoaW50IGRldikKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZDsKKworICAgIGZvciAoY2FyZCA9IG5tY2FyZF9saXN0OyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0X2NhcmQpCisJaWYgKGNhcmQtPmRldlswXSA9PSBkZXYgfHwgY2FyZC0+ZGV2WzFdID09IGRldikKKwkgICAgcmV0dXJuIGNhcmQ7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIERpdHRvLCBidXQgZmluZCB0aGUgY2FyZCBzdHJ1Y3QgY29ycmVzcG9uZGluZyB0byB0aGUgbWl4ZXIgZGV2aWNlIERFViAKKyAqIGluc3RlYWQuIAorICovCitzdGF0aWMgc3RydWN0IG5tMjU2X2luZm8gKgorbm0yNTZfZmluZF9jYXJkX2Zvcl9taXhlciAoaW50IGRldikKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZDsKKworICAgIGZvciAoY2FyZCA9IG5tY2FyZF9saXN0OyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0X2NhcmQpCisJaWYgKGNhcmQtPm1peGVyX29zc19kZXYgPT0gZGV2KQorCSAgICByZXR1cm4gY2FyZDsKKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHVzZWNhY2hlOworc3RhdGljIGludCBidWZmZXJ0b3A7CisKKy8qIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSB1c2luZyB0aGUgYmFuayBvZiBjYWNoZWQgY29lZmZpY2llbnRzLiAqLworaW50CitubTI1Nl9jYWNoZWRDb2VmZmljaWVudHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIHJldHVybiB1c2VjYWNoZTsKK30KKworLyogVGhlIGFjdHVhbCByYXRlcyBzdXBwb3J0ZWQgYnkgdGhlIGNhcmQuICovCitzdGF0aWMgaW50IHNhbXBsZXJhdGVzWzldID0geworICAgIDgwMDAsIDExMDI1LCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA5OTk5OTk5OQorfTsKKworLyoKKyAqIFNldCB0aGUgY2FyZCBzYW1wbGVyYXRlLCB3b3JkIHNpemUgYW5kIHN0ZXJlbyBtb2RlIHRvIGNvcnJlc3BvbmQgdG8KKyAqIHRoZSBzZXR0aW5ncyBpbiB0aGUgQ0FSRCBzdHJ1Y3QgZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGluIERFVi4KKyAqIFdlIGtlZXAgdHdvIHNlcGFyYXRlIHNldHMgb2YgaW5mb3JtYXRpb24sIG9uZSBmb3IgZWFjaCBkZXZpY2U7IHRoZQorICogaGFyZHdhcmUgaXMgbm90IGFjdHVhbGx5IGNvbmZpZ3VyZWQgdW50aWwgYSByZWFkIG9yIHdyaXRlIGlzCisgKiBhdHRlbXB0ZWQuCisgKi8KKworc3RhdGljIGludAorbm0yNTZfc2V0SW5mbyAoaW50IGRldiwgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgaW50IHg7CisgICAgaW50IHc7CisgICAgaW50IHRhcmdldHJhdGU7CisKKyAgICBpZiAoY2FyZC0+ZGV2WzBdID09IGRldikKKwl3ID0gMDsKKyAgICBlbHNlIGlmIChjYXJkLT5kZXZbMV0gPT0gZGV2KQorCXcgPSAxOworICAgIGVsc2UKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIHRhcmdldHJhdGUgPSBjYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlOworCisgICAgaWYgKChjYXJkLT5zaW5mb1t3XS5iaXRzICE9IDggJiYgY2FyZC0+c2luZm9bd10uYml0cyAhPSAxNikKKwl8fCB0YXJnZXRyYXRlIDwgc2FtcGxlcmF0ZXNbMF0KKwl8fCB0YXJnZXRyYXRlID4gc2FtcGxlcmF0ZXNbN10pCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorCWlmICh0YXJnZXRyYXRlIDwgKChzYW1wbGVyYXRlc1t4XSArIHNhbXBsZXJhdGVzW3ggKyAxXSkgLyAyKSkKKwkgICAgYnJlYWs7CisKKyAgICBpZiAoeCA8IDgpIHsKKwl1OCByYXRlYml0cyA9ICgoeCA8PCA0KSAmIE5NX1JBVEVfTUFTSyk7CisJaWYgKGNhcmQtPnNpbmZvW3ddLmJpdHMgPT0gMTYpCisJICAgIHJhdGViaXRzIHw9IE5NX1JBVEVfQklUU18xNjsKKwlpZiAoY2FyZC0+c2luZm9bd10uc3RlcmVvKQorCSAgICByYXRlYml0cyB8PSBOTV9SQVRFX1NURVJFTzsKKworCWNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGUgPSBzYW1wbGVyYXRlc1t4XTsKKworCisJaWYgKGNhcmQtPmRldl9mb3JfcGxheSA9PSBkZXYgJiYgY2FyZC0+cGxheWluZykgeworCSAgICBpZiAobm0yNTZfZGVidWcpCisJCXByaW50ayAoS0VSTl9ERUJVRyAiU2V0dGluZyBwbGF5IHJhdGViaXRzIHRvIDB4JXhcbiIsCisJCQlyYXRlYml0cyk7CisJICAgIG5tMjU2X2xvYWRDb2VmZmljaWVudCAoY2FyZCwgMCwgeCk7CisJICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsCisJCQkgICAgICBOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgTk1fUkFURV9SRUdfT0ZGU0VULAorCQkJICAgICAgcmF0ZWJpdHMpOworCX0KKworCWlmIChjYXJkLT5kZXZfZm9yX3JlY29yZCA9PSBkZXYgJiYgY2FyZC0+cmVjb3JkaW5nKSB7CisJICAgIGlmIChubTI1Nl9kZWJ1ZykKKwkJcHJpbnRrIChLRVJOX0RFQlVHICJTZXR0aW5nIHJlY29yZCByYXRlYml0cyB0byAweCV4XG4iLAorCQkJcmF0ZWJpdHMpOworCSAgICBubTI1Nl9sb2FkQ29lZmZpY2llbnQgKGNhcmQsIDEsIHgpOworCSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLAorCQkJICAgICAgTk1fUkVDT1JEX1JFR19PRkZTRVQgKyBOTV9SQVRFX1JFR19PRkZTRVQsCisJCQkgICAgICByYXRlYml0cyk7CisJfQorCXJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIFN0YXJ0IHRoZSBwbGF5IHByb2Nlc3MgZ29pbmcuICovCitzdGF0aWMgdm9pZAorc3RhcnRQbGF5IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKK3sKKyAgICBpZiAoISBjYXJkLT5wbGF5aW5nKSB7CisJY2FyZC0+cGxheWluZyA9IDE7CisJaWYgKG5tMjU2X2dyYWJJbnRlcnJ1cHQgKGNhcmQpID09IDApIHsKKwkgICAgbm0yNTZfc2V0SW5mbyAoY2FyZC0+ZGV2X2Zvcl9wbGF5LCBjYXJkKTsKKworCSAgICAvKiBFbmFibGUgcGxheWJhY2sgZW5naW5lIGFuZCBpbnRlcnJ1cHRzLiAqLworCSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCBOTV9QTEFZQkFDS19FTkFCTEVfUkVHLAorCQkJICAgICAgTk1fUExBWUJBQ0tfRU5BQkxFX0ZMQUcgfCBOTV9QTEFZQkFDS19GUkVFUlVOKTsKKworCSAgICAvKiBFbmFibGUgYm90aCBjaGFubmVscy4gKi8KKwkgICAgbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIE5NX0FVRElPX01VVEVfUkVHLCAweDApOworCX0KKyAgICB9Cit9CisKKy8qIAorICogUmVxdWVzdCBvbmUgY2h1bmsgb2YgQU1UIGJ5dGVzIGZyb20gdGhlIHJlY29yZGluZyBkZXZpY2UuICBXaGVuIHRoZQorICogb3BlcmF0aW9uIGlzIGNvbXBsZXRlLCB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBpbnRvIEJVRkZFUiBhbmQgdGhlCisgKiBmdW5jdGlvbiBETUFidWZfaW5wdXRpbnRyIHdpbGwgYmUgaW52b2tlZC4KKyAqLworCitzdGF0aWMgdm9pZAorbm0yNTZfc3RhcnRSZWNvcmRpbmcgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCBjaGFyICpidWZmZXIsIHUzMiBhbXQpCit7CisgICAgdTMyIGVuZHBvczsKKyAgICBpbnQgZW5hYmxlRW5naW5lID0gMDsKKyAgICB1MzIgcmluZ3NpemUgPSBjYXJkLT5yZWNvcmRCdWZmZXJTaXplOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBpZiAoYW10ID4gKHJpbmdzaXplIC8gMikpIHsKKwkvKgorCSAqIE9mIGNvdXJzZSB0aGlzIHdvbid0IGFjdHVhbGx5IHdvcmsgcmlnaHQsIGJlY2F1c2UgdGhlCisJICogY2FsbGVyIGlzIGdvaW5nIHRvIGFzc3VtZSB3ZSB3aWxsIGdpdmUgd2hhdCB3ZSBnb3QgYXNrZWQKKwkgKiBmb3IuCisJICovCisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFJlYWQgcmVxdWVzdCB0b28gbGFyZ2U6ICVkXG4iLCBhbXQpOworCWFtdCA9IHJpbmdzaXplIC8gMjsKKyAgICB9CisKKyAgICBpZiAoYW10IDwgOCkgeworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBSZWFkIHJlcXVlc3QgdG9vIHNtYWxsOyAlZFxuIiwgYW10KTsKKwlyZXR1cm47CisgICAgfQorCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworICAgIC8qCisgICAgICogSWYgd2UncmUgbm90IGN1cnJlbnRseSByZWNvcmRpbmcsIHNldCB1cCB0aGUgc3RhcnQgYW5kIGVuZCByZWdpc3RlcnMKKyAgICAgKiBmb3IgdGhlIHJlY29yZGluZyBlbmdpbmUuCisgICAgICovCisgICAgaWYgKCEgY2FyZC0+cmVjb3JkaW5nKSB7CisJY2FyZC0+cmVjb3JkaW5nID0gMTsKKwlpZiAobm0yNTZfZ3JhYkludGVycnVwdCAoY2FyZCkgPT0gMCkgeworCSAgICBjYXJkLT5jdXJSZWNQb3MgPSAwOworCSAgICBubTI1Nl9zZXRJbmZvIChjYXJkLT5kZXZfZm9yX3JlY29yZCwgY2FyZCk7CisJICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9SQlVGRkVSX1NUQVJULCBjYXJkLT5hYnVmMik7CisJICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9SQlVGRkVSX0VORCwKKwkJCQkgY2FyZC0+YWJ1ZjIgKyByaW5nc2l6ZSk7CisKKwkgICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfQ1VSUlAsCisJCQkJIGNhcmQtPmFidWYyICsgY2FyZC0+Y3VyUmVjUG9zKTsKKwkgICAgZW5hYmxlRW5naW5lID0gMTsKKwl9CisJZWxzZSB7CisJICAgIC8qIE5vdCBzdXJlIHdoYXQgZWxzZSB0byBkbyBoZXJlLiAgKi8KKwkgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jayxmbGFncyk7CisJICAgIHJldHVybjsKKwl9CisgICAgfQorCisgICAgLyogCisgICAgICogSWYgd2UgaGFwcGVuIHRvIGdvIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGEgYml0IChkdWUgdG8gYQorICAgICAqIGRlbGF5ZWQgaW50ZXJydXB0KSBpdCdzIE9LLiAgU28gbWlnaHQgYXMgd2VsbCBzZXQgdGhlIHdhdGVybWFyaworICAgICAqIHJpZ2h0IGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgd2Ugd2FudC4KKyAgICAgKi8KKyAgICBlbmRwb3MgPSBjYXJkLT5hYnVmMiArICgoY2FyZC0+Y3VyUmVjUG9zICsgYW10KSAlIHJpbmdzaXplKTsKKworICAgIGNhcmQtPnJlY0J1ZiA9IGJ1ZmZlcjsKKyAgICBjYXJkLT5yZXF1ZXN0ZWRSZWNBbXQgPSBhbXQ7CisgICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfV01BUkssIGVuZHBvcyk7CisgICAgLyogRW5hYmxlIHJlY29yZGluZyBlbmdpbmUgYW5kIGludGVycnVwdHMuICovCisgICAgaWYgKGVuYWJsZUVuZ2luZSkKKwlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCBOTV9SRUNPUkRfRU5BQkxFX1JFRywKKwkJCSAgICBOTV9SRUNPUkRfRU5BQkxFX0ZMQUcgfCBOTV9SRUNPUkRfRlJFRVJVTik7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKK30KKworLyogU3RvcCB0aGUgcGxheSBlbmdpbmUuICovCitzdGF0aWMgdm9pZAorc3RvcFBsYXkgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIC8qIFNodXQgb2ZmIHNvdW5kIGZyb20gYm90aCBjaGFubmVscy4gKi8KKyAgICBubTI1Nl93cml0ZVBvcnQxNiAoY2FyZCwgMiwgTk1fQVVESU9fTVVURV9SRUcsCisJCSAgICAgICBOTV9BVURJT19NVVRFX0xFRlQgfCBOTV9BVURJT19NVVRFX1JJR0hUKTsKKyAgICAvKiBEaXNhYmxlIHBsYXkgZW5naW5lLiAqLworICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1BMQVlCQUNLX0VOQUJMRV9SRUcsIDApOworICAgIGlmIChjYXJkLT5wbGF5aW5nKSB7CisJbm0yNTZfcmVsZWFzZUludGVycnVwdCAoY2FyZCk7CisKKwkvKiBSZXNldCB0aGUgcmVsZXZhbnQgc3RhdGUgYml0cy4gKi8KKwljYXJkLT5wbGF5aW5nID0gMDsKKwljYXJkLT5jdXJQbGF5UG9zID0gMDsKKyAgICB9Cit9CisKKy8qIFN0b3AgcmVjb3JkaW5nLiAqLworc3RhdGljIHZvaWQKK3N0b3BSZWNvcmQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIC8qIERpc2FibGUgcmVjb3JkaW5nIGVuZ2luZS4gKi8KKyAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCBOTV9SRUNPUkRfRU5BQkxFX1JFRywgMCk7CisKKyAgICBpZiAoY2FyZC0+cmVjb3JkaW5nKSB7CisJbm0yNTZfcmVsZWFzZUludGVycnVwdCAoY2FyZCk7CisKKwljYXJkLT5yZWNvcmRpbmcgPSAwOworCWNhcmQtPmN1clJlY1BvcyA9IDA7CisgICAgfQorfQorCisvKgorICogUmluZyBidWZmZXJzLCBtYW4uICBUaGF0J3Mgd2hlcmUgdGhlIGhpcC1ob3AsIHdpbGQtbi13b29seSBhY3Rpb24ncyBhdC4KKyAqIDE5NzI/ICAoV2VsbCwgSSBzdXBwb3NlIGl0IHdhcyBjaGVlcC1uLWVhc3kgdG8gaW1wbGVtZW50LikKKyAqCisgKiBXcml0ZSBBTVQgYnl0ZXMgb2YgQlVGRkVSIHRvIHRoZSBwbGF5YmFjayByaW5nIGJ1ZmZlciwgYW5kIHN0YXJ0IHRoZQorICogcGxheWJhY2sgZW5naW5lIHJ1bm5pbmcuICBJdCB3aWxsIG9ubHkgYWNjZXB0IHVwIHRvIDEvMiBvZiB0aGUgdG90YWwKKyAqIHNpemUgb2YgdGhlIHJpbmcgYnVmZmVyLiAgTm8gY2hlY2sgaXMgbWFkZSB0aGF0IHdlJ3JlIGFib3V0IHRvIG92ZXJ3cml0ZQorICogdGhlIGN1cnJlbnRseS1wbGF5aW5nIHNhbXBsZS4KKyAqLworCitzdGF0aWMgdm9pZAorbm0yNTZfd3JpdGVfYmxvY2sgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCBjaGFyICpidWZmZXIsIHUzMiBhbXQpCit7CisgICAgdTMyIHJpbmdzaXplID0gY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplOworICAgIHUzMiBlbmRzdG9wOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBpZiAoYW10ID4gKHJpbmdzaXplIC8gMikpIHsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogV3JpdGUgcmVxdWVzdCB0b28gbGFyZ2U6ICVkXG4iLCBhbXQpOworCWFtdCA9IChyaW5nc2l6ZSAvIDIpOworICAgIH0KKworICAgIGlmIChhbXQgPCBOTTI1Nl9QTEFZX1dNQVJLX1NJWkUpIHsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogV3JpdGUgcmVxdWVzdCB0b28gc21hbGw6ICVkXG4iLCBhbXQpOworCXJldHVybjsKKyAgICB9CisKKyAgICBjYXJkLT5jdXJQbGF5UG9zICU9IHJpbmdzaXplOworCisgICAgY2FyZC0+cmVxdWVzdGVkX2FtdCA9IGFtdDsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLGZsYWdzKTsKKworICAgIGlmICgoY2FyZC0+Y3VyUGxheVBvcyArIGFtdCkgPj0gcmluZ3NpemUpIHsKKwl1MzIgcmVtID0gcmluZ3NpemUgLSBjYXJkLT5jdXJQbGF5UG9zOworCisJbm0yNTZfd3JpdGVCdWZmZXI4IChjYXJkLCBidWZmZXIsIDEsCisJCQkgICAgICBjYXJkLT5hYnVmMSArIGNhcmQtPmN1clBsYXlQb3MsCisJCQkgICAgICByZW0pOworCWlmIChhbXQgPiByZW0pCisJICAgIG5tMjU2X3dyaXRlQnVmZmVyOCAoY2FyZCwgYnVmZmVyICsgcmVtLCAxLCBjYXJkLT5hYnVmMSwKKwkJCQkgIGFtdCAtIHJlbSk7CisgICAgfSAKKyAgICBlbHNlCisJbm0yNTZfd3JpdGVCdWZmZXI4IChjYXJkLCBidWZmZXIsIDEsCisJCQkgICAgICBjYXJkLT5hYnVmMSArIGNhcmQtPmN1clBsYXlQb3MsCisJCQkgICAgICBhbXQpOworCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgc3RhcnQtbi1zdG9wLW4tbGltaXQgcmVnaXN0ZXJzLCBhbmQgc3RhcnQgdGhhdCBlbmdpbmUKKyAgICAgKiBnb2luJy4gCisgICAgICoKKyAgICAgKiBOb3JtYWxseSB3ZSBqdXN0IGxldCBpdCB3cmFwIGFyb3VuZCB0byBhdm9pZCB0aGUgY2xpY2stY2xpY2sKKyAgICAgKiBhY3Rpb24gc2NlbmUuCisgICAgICovCisgICAgaWYgKCEgY2FyZC0+cGxheWluZykgeworCS8qIFRoZSBQQlVGRkVSX0VORCByZWdpc3RlciBpbiB0aGlzIGNhc2UgcG9pbnRzIHRvIG9uZSBzYW1wbGUKKwkgICBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLworCWludCB3ID0gKGNhcmQtPmRldl9mb3JfcGxheSA9PSBjYXJkLT5kZXZbMF0gPyAwIDogMSk7CisJaW50IHNhbXBzaXplID0gKGNhcmQtPnNpbmZvW3ddLmJpdHMgPT0gMTYgPyAyIDogMSk7CisKKwlpZiAoY2FyZC0+c2luZm9bd10uc3RlcmVvKQorCSAgICBzYW1wc2l6ZSAqPSAyOworCisJLyogTmVlZCB0byBzZXQgdGhlIG5vdC1ub3JtYWxseS1jaGFuZ2luZy1yZWdpc3RlcnMgdXAuICovCisJbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfU1RBUlQsCisJCQkgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcyk7CisJbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfRU5ELAorCQkJICAgICBjYXJkLT5hYnVmMSArIHJpbmdzaXplIC0gc2FtcHNpemUpOworCW5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9QQlVGRkVSX0NVUlJQLAorCQkJICAgICBjYXJkLT5hYnVmMSArIGNhcmQtPmN1clBsYXlQb3MpOworICAgIH0KKyAgICBlbmRzdG9wID0gKGNhcmQtPmN1clBsYXlQb3MgKyBhbXQgLSBOTTI1Nl9QTEFZX1dNQVJLX1NJWkUpICUgcmluZ3NpemU7CisgICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfV01BUkssIGNhcmQtPmFidWYxICsgZW5kc3RvcCk7CisKKyAgICBpZiAoISBjYXJkLT5wbGF5aW5nKQorCXN0YXJ0UGxheSAoY2FyZCk7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKK30KKworLyogIFdlIGp1c3QgZ290IGEgY2FyZCBwbGF5YmFjayBpbnRlcnJ1cHQ7IHByb2Nlc3MgaXQuICAqLworc3RhdGljIHZvaWQKK25tMjU2X2dldF9uZXdfYmxvY2sgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIC8qIENoZWNrIHRvIHNlZSBob3cgbXVjaCBnb3QgcGxheWVkIHNvIGZhci4gKi8KKyAgICB1MzIgYW10ID0gbm0yNTZfcmVhZFBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9DVVJSUCkgLSBjYXJkLT5hYnVmMTsKKworICAgIGlmIChhbXQgPj0gY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplKSB7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFNvdW5kIHBsYXliYWNrIHBvaW50ZXIgaW52YWxpZCFcbiIpOworCWFtdCA9IDA7CisgICAgfQorCisgICAgaWYgKGFtdCA8IGNhcmQtPmN1clBsYXlQb3MpCisJYW10ID0gKGNhcmQtPnBsYXliYWNrQnVmZmVyU2l6ZSAtIGNhcmQtPmN1clBsYXlQb3MpICsgYW10OworICAgIGVsc2UKKwlhbXQgLT0gY2FyZC0+Y3VyUGxheVBvczsKKworICAgIGlmIChjYXJkLT5yZXF1ZXN0ZWRfYW10ID4gKGFtdCArIE5NMjU2X1BMQVlfV01BUktfU0laRSkpIHsKKwl1MzIgZW5kc3RvcCA9CisJICAgIGNhcmQtPmN1clBsYXlQb3MgKyBjYXJkLT5yZXF1ZXN0ZWRfYW10IC0gTk0yNTZfUExBWV9XTUFSS19TSVpFOworCW5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBOTV9QQlVGRkVSX1dNQVJLLCBjYXJkLT5hYnVmMSArIGVuZHN0b3ApOworICAgIH0gCisgICAgZWxzZSB7CisJY2FyZC0+Y3VyUGxheVBvcyArPSBjYXJkLT5yZXF1ZXN0ZWRfYW10OworCS8qIEdldCBhIG5ldyBibG9jayB0byB3cml0ZS4gIFRoaXMgd2lsbCBldmVudHVhbGx5IGludm9rZQorCSAgIG5tMjU2X3dyaXRlX2Jsb2NrICgpIG9yIHN0b3BQbGF5ICgpLiAgKi8KKwlETUFidWZfb3V0cHV0aW50ciAoY2FyZC0+ZGV2X2Zvcl9wbGF5LCAxKTsKKyAgICB9Cit9CisKKy8qIAorICogUmVhZCB0aGUgbGFzdC1yZWNvcmRlZCBibG9jayBmcm9tIHRoZSByaW5nIGJ1ZmZlciwgY29weSBpdCBpbnRvIHRoZQorICogc2F2ZWQgYnVmZmVyIHBvaW50ZXIsIGFuZCBpbnZva2UgRE1BdWZfaW5wdXRpbnRyKCkgd2l0aCB0aGUgcmVjb3JkaW5nCisgKiBkZXZpY2UuIAorICovCisKK3N0YXRpYyB2b2lkCitubTI1Nl9yZWFkX2Jsb2NrIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKK3sKKyAgICAvKiBHcmFiIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSByZWNvcmRpbmcgcG9pbnRlci4gKi8KKyAgICB1MzIgY3VycnB0ciA9IG5tMjU2X3JlYWRQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfQ1VSUlApIC0gY2FyZC0+YWJ1ZjI7CisgICAgdTMyIGFtdFRvUmVhZCA9IGNhcmQtPnJlcXVlc3RlZFJlY0FtdDsKKyAgICB1MzIgcmluZ3NpemUgPSBjYXJkLT5yZWNvcmRCdWZmZXJTaXplOworCisgICAgaWYgKGN1cnJwdHIgPj0gY2FyZC0+cmVjb3JkQnVmZmVyU2l6ZSkgeworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBTb3VuZCBidWZmZXIgcmVjb3JkIHBvaW50ZXIgaW52YWxpZCFcbiIpOworICAgICAgICBjdXJycHRyID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoaXMgdGVzdCBpcyBwcm9iYWJseSByZWR1bmRhbnQ7IHdlIHNob3VsZG4ndCBiZSBoZXJlIHVubGVzcworICAgICAqIGl0J3MgdHJ1ZS4KKyAgICAgKi8KKyAgICBpZiAoY2FyZC0+cmVjb3JkaW5nKSB7CisJLyogSWYgd2Ugd3JhcHBlZCBhcm91bmQsIGNvcHkgZXZlcnl0aGluZyBmcm9tIHRoZSBzdGFydCBvZiBvdXIKKwkgICByZWNvcmRpbmcgYnVmZmVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KKwlpZiAoY3VycnB0ciA8IGNhcmQtPmN1clJlY1BvcykgeworCSAgICB1MzIgYW10ID0gbWluIChyaW5nc2l6ZSAtIGNhcmQtPmN1clJlY1BvcywgYW10VG9SZWFkKTsKKworCSAgICBubTI1Nl9yZWFkQnVmZmVyOCAoY2FyZCwgY2FyZC0+cmVjQnVmLCAxLAorCQkJCSBjYXJkLT5hYnVmMiArIGNhcmQtPmN1clJlY1BvcywKKwkJCQkgYW10KTsKKwkgICAgYW10VG9SZWFkIC09IGFtdDsKKwkgICAgY2FyZC0+Y3VyUmVjUG9zICs9IGFtdDsKKwkgICAgY2FyZC0+cmVjQnVmICs9IGFtdDsKKwkgICAgaWYgKGNhcmQtPmN1clJlY1BvcyA9PSByaW5nc2l6ZSkKKwkJY2FyZC0+Y3VyUmVjUG9zID0gMDsKKwl9CisKKwlpZiAoKGNhcmQtPmN1clJlY1BvcyA8IGN1cnJwdHIpICYmIChhbXRUb1JlYWQgPiAwKSkgeworCSAgICB1MzIgYW10ID0gbWluIChjdXJycHRyIC0gY2FyZC0+Y3VyUmVjUG9zLCBhbXRUb1JlYWQpOworCSAgICBubTI1Nl9yZWFkQnVmZmVyOCAoY2FyZCwgY2FyZC0+cmVjQnVmLCAxLAorCQkJCSBjYXJkLT5hYnVmMiArIGNhcmQtPmN1clJlY1BvcywgYW10KTsKKwkgICAgY2FyZC0+Y3VyUmVjUG9zID0gKChjYXJkLT5jdXJSZWNQb3MgKyBhbXQpICUgcmluZ3NpemUpOworCX0KKwljYXJkLT5yZWNCdWYgPSBOVUxMOworCWNhcmQtPnJlcXVlc3RlZFJlY0FtdCA9IDA7CisJRE1BYnVmX2lucHV0aW50ciAoY2FyZC0+ZGV2X2Zvcl9yZWNvcmQpOworICAgIH0KK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlLiAKKyAqLworc3RhdGljIHZvaWQKK25tMjU2X2luaXRIdyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgLyogUmVzZXQgZXZlcnl0aGluZy4gKi8KKyAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDAsIDB4MTEpOworICAgIG5tMjU2X3dyaXRlUG9ydDE2IChjYXJkLCAyLCAweDIxNCwgMCk7CisKKyAgICBzdG9wUmVjb3JkIChjYXJkKTsKKyAgICBzdG9wUGxheSAoY2FyZCk7Cit9CisKKy8qIAorICogSGFuZGxlIGEgcG90ZW50aWFsIGludGVycnVwdCBmb3IgdGhlIGRldmljZSByZWZlcnJlZCB0byBieSBERVZfSUQuIAorICoKKyAqIEkgZG9uJ3QgbGlrZSB0aGUgY3V0LW4tcGFzdGUgam9iIGhlcmUgZWl0aGVyIGJldHdlZW4gdGhlIHR3byByb3V0aW5lcywKKyAqIGJ1dCB0aGVyZSBhcmUgc3VmZmljaWVudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gaW50ZXJydXB0IGhhbmRsZXJzCisgKiB0aGF0IHBhcmFtZXRlcml6aW5nIGl0IGlzbid0IGFsbCB0aGF0IGdyZWF0IGVpdGhlci4gIChDb3VsZCB1c2UgYSBtYWNybywKKyAqIEkgc3VwcG9zZS4uLnl1Y2t5IGJsZWFoLikKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK25tMjU2X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpCit7CisgICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXZfaWQ7CisgICAgdTE2IHN0YXR1czsKKyAgICBzdGF0aWMgaW50IGJhZGludHJjb3VudDsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CisKKyAgICBpZiAoKGNhcmQgPT0gTlVMTCkgfHwgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpKSB7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBjYXJkIHBvaW50ZXJcbiIpOworCXJldHVybiBJUlFfTk9ORTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBubTI1Nl9yZWFkUG9ydDE2IChjYXJkLCAyLCBOTV9JTlRfUkVHKTsKKworICAgIC8qIE5vdCBvdXJzLiAqLworICAgIGlmIChzdGF0dXMgPT0gMCkgeworCWlmIChiYWRpbnRyY291bnQrKyA+IDEwMDApIHsKKwkgICAgLyoKKwkgICAgICogSSdtIG5vdCBzdXJlIGlmIHRoZSBiZXN0IHRoaW5nIGlzIHRvIHN0b3AgdGhlIGNhcmQgZnJvbQorCSAgICAgKiBwbGF5aW5nIG9yIGp1c3QgcmVsZWFzZSB0aGUgaW50ZXJydXB0IChhZnRlciBhbGwsIHdlJ3JlIGluCisJICAgICAqIGEgYmFkIHNpdHVhdGlvbiwgc28gZG9pbmcgZmFuY3kgc3R1ZmYgbWF5IG5vdCBiZSBzdWNoIGEgZ29vZAorCSAgICAgKiBpZGVhKS4KKwkgICAgICoKKwkgICAgICogSSB3b3JyeSBhYm91dCB0aGUgY2FyZCBlbmdpbmUgY29udGludWluZyB0byBwbGF5IG5vaXNlCisJICAgICAqIG92ZXIgYW5kIG92ZXIsIGhvd2V2ZXItLXRoYXQgY291bGQgYmVjb21lIGEgdmVyeQorCSAgICAgKiBvYm5veGlvdXMgcHJvYmxlbS4gIEFuZCB3ZSBrbm93IHRoYXQgd2hlbiB0aGlzIHVzdWFsbHkKKwkgICAgICogaGFwcGVucyB0aGluZ3MgYXJlIGZhaXJseSBzYWZlLCBpdCBqdXN0IG1lYW5zIHRoZSB1c2VyJ3MKKwkgICAgICogaW5zZXJ0ZWQgYSBQQ01DSUEgY2FyZCBhbmQgc29tZW9uZSdzIHNwYW1taW5nIHVzIHdpdGggSVJRIDlzLgorCSAgICAgKi8KKworCSAgICBoYW5kbGVkID0gMTsKKwkgICAgaWYgKGNhcmQtPnBsYXlpbmcpCisJCXN0b3BQbGF5IChjYXJkKTsKKwkgICAgaWYgKGNhcmQtPnJlY29yZGluZykKKwkJc3RvcFJlY29yZCAoY2FyZCk7CisJICAgIGJhZGludHJjb3VudCA9IDA7CisJfQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworICAgIH0KKworICAgIGJhZGludHJjb3VudCA9IDA7CisKKyAgICAvKiBSYXRoZXIgYm9yaW5nOyBjaGVjayBmb3IgaW5kaXZpZHVhbCBpbnRlcnJ1cHRzIGFuZCBwcm9jZXNzIHRoZW0uICovCisKKyAgICBpZiAoc3RhdHVzICYgTk1fUExBWUJBQ0tfSU5UKSB7CisJaGFuZGxlZCA9IDE7CisJc3RhdHVzICY9IH5OTV9QTEFZQkFDS19JTlQ7CisJTk1fQUNLX0lOVCAoY2FyZCwgTk1fUExBWUJBQ0tfSU5UKTsKKworCWlmIChjYXJkLT5wbGF5aW5nKQorCSAgICBubTI1Nl9nZXRfbmV3X2Jsb2NrIChjYXJkKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICYgTk1fUkVDT1JEX0lOVCkgeworCWhhbmRsZWQgPSAxOworCXN0YXR1cyAmPSB+Tk1fUkVDT1JEX0lOVDsKKwlOTV9BQ0tfSU5UIChjYXJkLCBOTV9SRUNPUkRfSU5UKTsKKworCWlmIChjYXJkLT5yZWNvcmRpbmcpCisJICAgIG5tMjU2X3JlYWRfYmxvY2sgKGNhcmQpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgJiBOTV9NSVNDX0lOVF8xKSB7CisJdTggY2J5dGU7CisKKwloYW5kbGVkID0gMTsKKwlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzE7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEdvdCBtaXNjIGludGVycnVwdCAjMVxuIik7CisJTk1fQUNLX0lOVCAoY2FyZCwgTk1fTUlTQ19JTlRfMSk7CisJbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIE5NX0lOVF9SRUcsIDB4ODAwMCk7CisJY2J5dGUgPSBubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4NDAwKTsKKwlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDQwMCwgY2J5dGUgfCAyKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMikgeworCXU4IGNieXRlOworCisJaGFuZGxlZCA9IDE7CisJc3RhdHVzICY9IH5OTV9NSVNDX0lOVF8yOworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOworCU5NX0FDS19JTlQgKGNhcmQsIE5NX01JU0NfSU5UXzIpOworCWNieXRlID0gbm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCAweDQwMCk7CisJbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg0MDAsIGNieXRlICYgfjIpOworICAgIH0KKworICAgIC8qIFVua25vd24gaW50ZXJydXB0LiAqLworICAgIGlmIChzdGF0dXMpIHsKKwloYW5kbGVkID0gMTsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogRmlyZSBpbiB0aGUgaG9sZSEgVW5rbm93biBzdGF0dXMgMHgleFxuIiwKKwkJc3RhdHVzKTsKKwkvKiBQcmF5LiAqLworCU5NX0FDS19JTlQgKGNhcmQsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICogSGFuZGxlIGEgcG90ZW50aWFsIGludGVycnVwdCBmb3IgdGhlIGRldmljZSByZWZlcnJlZCB0byBieSBERVZfSUQuCisgKiBUaGlzIGhhbmRsZXIgaXMgZm9yIHRoZSAyNTZaWCwgYW5kIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgbm9uLVpYCisgKiByb3V0aW5lLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorbm0yNTZfaW50ZXJydXB0X3p4IChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpkdW1teSkKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldl9pZDsKKyAgICB1MzIgc3RhdHVzOworICAgIHN0YXRpYyBpbnQgYmFkaW50cmNvdW50OworICAgIGludCBoYW5kbGVkID0gMDsKKworICAgIGlmICgoY2FyZCA9PSBOVUxMKSB8fCAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykpIHsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIGNhcmQgcG9pbnRlclxuIik7CisJcmV0dXJuIElSUV9OT05FOworICAgIH0KKworICAgIHN0YXR1cyA9IG5tMjU2X3JlYWRQb3J0MzIgKGNhcmQsIDIsIE5NX0lOVF9SRUcpOworCisgICAgLyogTm90IG91cnMuICovCisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisJaWYgKGJhZGludHJjb3VudCsrID4gMTAwMCkgeworCSAgICBwcmludGsgKEtFUk5fRVJSICJOTTI1NjogUmVsZWFzaW5nIGludGVycnVwdCwgb3ZlciAxMDAwIGludmFsaWQgaW50ZXJydXB0c1xuIik7CisJICAgIC8qCisJICAgICAqIEknbSBub3Qgc3VyZSBpZiB0aGUgYmVzdCB0aGluZyBpcyB0byBzdG9wIHRoZSBjYXJkIGZyb20KKwkgICAgICogcGxheWluZyBvciBqdXN0IHJlbGVhc2UgdGhlIGludGVycnVwdCAoYWZ0ZXIgYWxsLCB3ZSdyZSBpbgorCSAgICAgKiBhIGJhZCBzaXR1YXRpb24sIHNvIGRvaW5nIGZhbmN5IHN0dWZmIG1heSBub3QgYmUgc3VjaCBhIGdvb2QKKwkgICAgICogaWRlYSkuCisJICAgICAqCisJICAgICAqIEkgd29ycnkgYWJvdXQgdGhlIGNhcmQgZW5naW5lIGNvbnRpbnVpbmcgdG8gcGxheSBub2lzZQorCSAgICAgKiBvdmVyIGFuZCBvdmVyLCBob3dldmVyLS10aGF0IGNvdWxkIGJlY29tZSBhIHZlcnkKKwkgICAgICogb2Jub3hpb3VzIHByb2JsZW0uICBBbmQgd2Uga25vdyB0aGF0IHdoZW4gdGhpcyB1c3VhbGx5CisJICAgICAqIGhhcHBlbnMgdGhpbmdzIGFyZSBmYWlybHkgc2FmZSwgaXQganVzdCBtZWFucyB0aGUgdXNlcidzCisJICAgICAqIGluc2VydGVkIGEgUENNQ0lBIGNhcmQgYW5kIHNvbWVvbmUncyBzcGFtbWluZyB1cyB3aXRoIAorCSAgICAgKiBJUlEgOXMuCisJICAgICAqLworCisJICAgIGhhbmRsZWQgPSAxOworCSAgICBpZiAoY2FyZC0+cGxheWluZykKKwkJc3RvcFBsYXkgKGNhcmQpOworCSAgICBpZiAoY2FyZC0+cmVjb3JkaW5nKQorCQlzdG9wUmVjb3JkIChjYXJkKTsKKwkgICAgYmFkaW50cmNvdW50ID0gMDsKKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CisgICAgfQorCisgICAgYmFkaW50cmNvdW50ID0gMDsKKworICAgIC8qIFJhdGhlciBib3Jpbmc7IGNoZWNrIGZvciBpbmRpdmlkdWFsIGludGVycnVwdHMgYW5kIHByb2Nlc3MgdGhlbS4gKi8KKworICAgIGlmIChzdGF0dXMgJiBOTTJfUExBWUJBQ0tfSU5UKSB7CisJaGFuZGxlZCA9IDE7CisJc3RhdHVzICY9IH5OTTJfUExBWUJBQ0tfSU5UOworCU5NMl9BQ0tfSU5UIChjYXJkLCBOTTJfUExBWUJBQ0tfSU5UKTsKKworCWlmIChjYXJkLT5wbGF5aW5nKQorCSAgICBubTI1Nl9nZXRfbmV3X2Jsb2NrIChjYXJkKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICYgTk0yX1JFQ09SRF9JTlQpIHsKKwloYW5kbGVkID0gMTsKKwlzdGF0dXMgJj0gfk5NMl9SRUNPUkRfSU5UOworCU5NMl9BQ0tfSU5UIChjYXJkLCBOTTJfUkVDT1JEX0lOVCk7CisKKwlpZiAoY2FyZC0+cmVjb3JkaW5nKQorCSAgICBubTI1Nl9yZWFkX2Jsb2NrIChjYXJkKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzEpIHsKKwl1OCBjYnl0ZTsKKworCWhhbmRsZWQgPSAxOworCXN0YXR1cyAmPSB+Tk0yX01JU0NfSU5UXzE7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEdvdCBtaXNjIGludGVycnVwdCAjMVxuIik7CisJTk0yX0FDS19JTlQgKGNhcmQsIE5NMl9NSVNDX0lOVF8xKTsKKwljYnl0ZSA9IG5tMjU2X3JlYWRQb3J0OCAoY2FyZCwgMiwgMHg0MDApOworCW5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NDAwLCBjYnl0ZSB8IDIpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgJiBOTTJfTUlTQ19JTlRfMikgeworCXU4IGNieXRlOworCisJaGFuZGxlZCA9IDE7CisJc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMjsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMyXG4iKTsKKwlOTTJfQUNLX0lOVCAoY2FyZCwgTk0yX01JU0NfSU5UXzIpOworCWNieXRlID0gbm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCAweDQwMCk7CisJbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg0MDAsIGNieXRlICYgfjIpOworICAgIH0KKworICAgIC8qIFVua25vd24gaW50ZXJydXB0LiAqLworICAgIGlmIChzdGF0dXMpIHsKKwloYW5kbGVkID0gMTsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogRmlyZSBpbiB0aGUgaG9sZSEgVW5rbm93biBzdGF0dXMgMHgleFxuIiwKKwkJc3RhdHVzKTsKKwkvKiBQcmF5LiAqLworCU5NMl9BQ0tfSU5UIChjYXJkLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyogCisgKiBSZXF1ZXN0IG91ciBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyBpbnQKK25tMjU2X2dyYWJJbnRlcnJ1cHQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIGlmIChjYXJkLT5oYXNfaXJxKysgPT0gMCkgeworCWlmIChyZXF1ZXN0X2lycSAoY2FyZC0+aXJxLCBjYXJkLT5pbnRyb3V0aW5lLCBTQV9TSElSUSwKKwkJCSAiTk0yNTZfYXVkaW8iLCBjYXJkKSA8IDApIHsKKwkgICAgcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IGNhbid0IG9idGFpbiBJUlEgJWRcbiIsIGNhcmQtPmlycSk7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiAKKyAqIFJlbGVhc2Ugb3VyIGludGVycnVwdC4gCisgKi8KK3N0YXRpYyBpbnQKK25tMjU2X3JlbGVhc2VJbnRlcnJ1cHQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIGlmIChjYXJkLT5oYXNfaXJxIDw9IDApIHsKKwlwcmludGsgKEtFUk5fRVJSICJubTI1NjogdG9vIG1hbnkgY2FsbHMgdG8gcmVsZWFzZUludGVycnVwdFxuIik7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBjYXJkLT5oYXNfaXJxLS07CisgICAgaWYgKGNhcmQtPmhhc19pcnEgPT0gMCkgeworCWZyZWVfaXJxIChjYXJkLT5pcnEsIGNhcmQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFdhaXRzIGZvciB0aGUgbWl4ZXIgdG8gYmVjb21lIHJlYWR5IHRvIGJlIHdyaXR0ZW47IHJldHVybnMgYSB6ZXJvIHZhbHVlCisgKiBpZiBpdCB0aW1lZCBvdXQuCisgKi8KKworc3RhdGljIGludAorbm0yNTZfaXNSZWFkeSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldikKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldi0+ZHJpdmVyX3ByaXZhdGU7CisgICAgaW50IHQyID0gMTA7CisgICAgdTMyIHRlc3RhZGRyOworICAgIHUxNiB0ZXN0YjsKKyAgICBpbnQgZG9uZSA9IDA7CisKKyAgICBpZiAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykgeworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgbWFnaWMgc2lnbmF0dXJlIGluIGlzUmVhZHkhXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICB0ZXN0YWRkciA9IGNhcmQtPm1peGVyX3N0YXR1c19vZmZzZXQ7CisgICAgdGVzdGIgPSBjYXJkLT5taXhlcl9zdGF0dXNfbWFzazsKKworICAgIC8qIAorICAgICAqIExvb3AgYXJvdW5kIHdhaXRpbmcgZm9yIHRoZSBtaXhlciB0byBiZWNvbWUgcmVhZHkuIAorICAgICAqLworICAgIHdoaWxlICghIGRvbmUgJiYgdDItLSA+IDApIHsKKwlpZiAoKG5tMjU2X3JlYWRQb3J0MTYgKGNhcmQsIDIsIHRlc3RhZGRyKSAmIHRlc3RiKSA9PSAwKQorCSAgICBkb25lID0gMTsKKwllbHNlCisJICAgIHVkZWxheSAoMTAwKTsKKyAgICB9CisgICAgcmV0dXJuIGRvbmU7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBBQzk3IG1peGVyIHJlZ2lzdGVyIFJFRy4gIFJldHVybnMgYSBwb3NpdGl2ZQorICogdmFsdWUgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50CitubTI1Nl9yZWFkQUM5N1JlZyAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnKQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2LT5kcml2ZXJfcHJpdmF0ZTsKKworICAgIGlmIChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSB7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBtYWdpYyBzaWduYXR1cmUgaW4gcmVhZEFDOTdSZWchXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAocmVnIDwgMTI4KSB7CisJaW50IHJlczsKKworCW5tMjU2X2lzUmVhZHkgKGRldik7CisJcmVzID0gbm0yNTZfcmVhZFBvcnQxNiAoY2FyZCwgMiwgY2FyZC0+bWl4ZXIgKyByZWcpOworCS8qIE1hZ2ljIGRlbGF5LiAgQmxlYWggeXVja3kuICAqLworICAgICAgICB1ZGVsYXkgKDEwMDApOworCXJldHVybiByZXM7CisgICAgfQorICAgIGVsc2UKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogCisgKiBXcml0ZXMgVkFMVUUgdG8gQUM5NyBtaXhlciByZWdpc3RlciBSRUcuICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IKKyAqIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gCisgKi8KK3N0YXRpYyBpbnQKK25tMjU2X3dyaXRlQUM5N1JlZyAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnLCB1MTYgdmFsdWUpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgdHJpZXMgPSAyOworICAgIGludCBkb25lID0gMDsKKyAgICB1MzIgYmFzZTsKKworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2LT5kcml2ZXJfcHJpdmF0ZTsKKworICAgIGlmIChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSB7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBtYWdpYyBzaWduYXR1cmUgaW4gd3JpdGVBQzk3UmVnIVxuIik7CisJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgYmFzZSA9IGNhcmQtPm1peGVyOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCisgICAgbm0yNTZfaXNSZWFkeSAoZGV2KTsKKworICAgIC8qIFdhaXQgZm9yIHRoZSB3cml0ZSB0byB0YWtlLCB0b28uICovCisgICAgd2hpbGUgKCh0cmllcy0tID4gMCkgJiYgIWRvbmUpIHsKKwlubTI1Nl93cml0ZVBvcnQxNiAoY2FyZCwgMiwgYmFzZSArIHJlZywgdmFsdWUpOworCWlmIChubTI1Nl9pc1JlYWR5IChkZXYpKSB7CisJICAgIGRvbmUgPSAxOworCSAgICBicmVhazsKKwl9CisKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKKyAgICB1ZGVsYXkgKDEwMDApOworCisgICAgcmV0dXJuICEgZG9uZTsKK30KKworLyogCisgKiBJbml0aWFsIHJlZ2lzdGVyIHZhbHVlcyB0byBiZSB3cml0dGVuIHRvIHRoZSBBQzk3IG1peGVyLgorICogV2hpbGUgbW9zdCBvZiB0aGVzZSBhcmUgaWRlbnRpY2FsIHRvIHRoZSByZXNldCB2YWx1ZXMsIHdlIGRvIHRoaXMKKyAqIHNvIHRoYXQgd2UgaGF2ZSBtb3N0IG9mIHRoZSByZWdpc3RlciBjb250ZW50cyBjYWNoZWQtLXRoaXMgYXZvaWRzCisgKiByZWFkaW5nIGZyb20gdGhlIG1peGVyIGRpcmVjdGx5ICh3aGljaCBzZWVtcyB0byBiZSBwcm9ibGVtYXRpYywKKyAqIHByb2JhYmx5IGR1ZSB0byBpZ25vcmFuY2UpLgorICovCitzdHJ1Y3QgaW5pdGlhbFZhbHVlcyAKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBwb3J0OworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOworfTsKKworc3RhdGljIHN0cnVjdCBpbml0aWFsVmFsdWVzIG5tMjU2X2FjOTdfaW5pdGlhbF92YWx1ZXNbXSA9IAoreworICAgIHsgQUM5N19NQVNURVJfVk9MX1NURVJFTywgMHg4MDAwIH0sCisgICAgeyBBQzk3X0hFQURQSE9ORV9WT0wsICAgICAweDgwMDAgfSwKKyAgICB7IEFDOTdfTUFTVEVSX1ZPTF9NT05PLCAgIDB4MDAwMCB9LAorICAgIHsgQUM5N19QQ0JFRVBfVk9MLCAgICAgICAgMHgwMDAwIH0sCisgICAgeyBBQzk3X1BIT05FX1ZPTCwgICAgICAgICAweDAwMDggfSwKKyAgICB7IEFDOTdfTUlDX1ZPTCwgICAgICAgICAgIDB4ODAwMCB9LAorICAgIHsgQUM5N19MSU5FSU5fVk9MLCAgICAgICAgMHg4ODA4IH0sCisgICAgeyBBQzk3X0NEX1ZPTCwgICAgICAgICAgICAweDg4MDggfSwKKyAgICB7IEFDOTdfVklERU9fVk9MLCAgICAgICAgIDB4ODgwOCB9LAorICAgIHsgQUM5N19BVVhfVk9MLCAgICAgICAgICAgMHg4ODA4IH0sCisgICAgeyBBQzk3X1BDTU9VVF9WT0wsICAgICAgICAweDA4MDggfSwKKyAgICB7IEFDOTdfUkVDT1JEX1NFTEVDVCwgICAgIDB4MDAwMCB9LAorICAgIHsgQUM5N19SRUNPUkRfR0FJTiwgICAgICAgMHgwQjBCIH0sCisgICAgeyBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgICAweDAwMDAgfSwKKyAgICB7IDB4ZmZmZiwgMHhmZmZmIH0KK307CisKKy8qIEluaXRpYWxpemUgdGhlIEFDOTcgaW50byBhIGtub3duIHN0YXRlLiAgKi8KK3N0YXRpYyBpbnQKK25tMjU2X3Jlc2V0QUM5NyAoc3RydWN0IGFjOTdfaHdpbnQgKmRldikKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldi0+ZHJpdmVyX3ByaXZhdGU7CisgICAgaW50IHg7CisKKyAgICBpZiAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykgeworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgbWFnaWMgc2lnbmF0dXJlIGluIHJlc2V0QUM5NyFcbiIpOworCXJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8qIFJlc2V0IHRoZSBtaXhlci4gICdUaXMgbWFnaWMhICAqLworICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NmMwLCAxKTsKKy8vICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDZjYywgMHg4Nyk7CS8qIFRoaXMgY3Jhc2hlcyBEZWxsIGxhdGl0dWRlcyAqLworICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NmNjLCAweDgwKTsKKyAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDZjYywgMHgwKTsKKworICAgIGlmICghIGNhcmQtPm1peGVyX3ZhbHVlc19pbml0KSB7CisJZm9yICh4ID0gMDsgbm0yNTZfYWM5N19pbml0aWFsX3ZhbHVlc1t4XS5wb3J0ICE9IDB4ZmZmZjsgeCsrKSB7CisJICAgIGFjOTdfcHV0X3JlZ2lzdGVyIChkZXYsCisJCQkgICAgICAgbm0yNTZfYWM5N19pbml0aWFsX3ZhbHVlc1t4XS5wb3J0LAorCQkJICAgICAgIG5tMjU2X2FjOTdfaW5pdGlhbF92YWx1ZXNbeF0udmFsdWUpOworCSAgICBjYXJkLT5taXhlcl92YWx1ZXNfaW5pdCA9IDE7CisJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogV2UgZG9uJ3QgZG8gYW55dGhpbmcgcGFydGljdWxhcmx5IHNwZWNpYWwgaGVyZTsgaXQganVzdCBwYXNzZXMgdGhlCisgKiBtaXhlciBpb2N0bCB0byB0aGUgQUM5NyBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQKK25tMjU2X2RlZmF1bHRfbWl4ZXJfaW9jdGwgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisgICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmRfZm9yX21peGVyIChkZXYpOworICAgIGlmIChjYXJkICE9IE5VTEwpCisJcmV0dXJuIGFjOTdfbWl4ZXJfaW9jdGwgKCYoY2FyZC0+bWRldiksIGNtZCwgYXJnKTsKKyAgICBlbHNlCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBubTI1Nl9taXhlcl9vcGVyYXRpb25zID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5pZAk9ICJOZW9NYWdpYyIsCisJLm5hbWUJPSAiTk0yNTZBQzk3TWl4ZXIiLAorCS5pb2N0bAk9IG5tMjU2X2RlZmF1bHRfbWl4ZXJfaW9jdGwKK307CisKKy8qCisgKiBEZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgT1NTIG1peGVyLiAgVGhlc2UgYXJlIHNldCBsYXN0LCBhZnRlciB0aGUKKyAqIG1peGVyIGlzIGluaXRpYWxpemVkLgorICoKKyAqIEkgImxvdmUiIEMgc29tZXRpbWVzLiAgR290IGJyYWNlcz8KKyAqLworc3RhdGljIHN0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QgbWl4ZXJfZGVmYXVsdHNbXSA9IHsKKyAgICB7IFNPVU5EX01JWEVSX1ZPTFVNRSwgIHsgeyA4NSwgODUgfSB9IH0sCisgICAgeyBTT1VORF9NSVhFUl9TUEVBS0VSLCB7IHsgMTAwIH0gfSB9LAorICAgIHsgU09VTkRfTUlYRVJfUENNLCAgICAgeyB7IDY1LCA2NSB9IH0gfSwKKyAgICB7IFNPVU5EX01JWEVSX0NELCAgICAgIHsgeyA2NSwgNjUgfSB9IH0sCisgICAgeyAtMSwgICAgICAgICAgICAgICAgICB7ICB7IDAsICAwIH0gfSB9Cit9OworCisKKy8qIEluc3RhbGxzIHRoZSBBQzk3IG1peGVyIGludG8gQ0FSRC4gICovCitzdGF0aWMgaW50IF9faW5pdAorbm0yNTZfaW5zdGFsbF9taXhlciAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgaW50IG1peGVyOworCisgICAgY2FyZC0+bWRldi5yZXNldF9kZXZpY2UgPSBubTI1Nl9yZXNldEFDOTc7CisgICAgY2FyZC0+bWRldi5yZWFkX3JlZyA9IG5tMjU2X3JlYWRBQzk3UmVnOworICAgIGNhcmQtPm1kZXYud3JpdGVfcmVnID0gbm0yNTZfd3JpdGVBQzk3UmVnOworICAgIGNhcmQtPm1kZXYuZHJpdmVyX3ByaXZhdGUgPSAodm9pZCAqKWNhcmQ7CisKKyAgICBpZiAoYWM5N19pbml0ICgmKGNhcmQtPm1kZXYpKSkKKwlyZXR1cm4gLTE7CisKKyAgICBtaXhlciA9IHNvdW5kX2FsbG9jX21peGVyZGV2KCk7CisgICAgaWYgKG51bV9taXhlcnMgPj0gTUFYX01JWEVSX0RFVikgeworCXByaW50ayAoIk5NMjU2IG1peGVyOiBVbmFibGUgdG8gYWxsb2MgbWl4ZXJkZXZcbiIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBtaXhlcl9kZXZzW21peGVyXSA9ICZubTI1Nl9taXhlcl9vcGVyYXRpb25zOworICAgIGNhcmQtPm1peGVyX29zc19kZXYgPSBtaXhlcjsKKworICAgIC8qIFNvbWUgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcy4gICovCisgICAgYWM5N19zZXRfdmFsdWVzICgmKGNhcmQtPm1kZXYpLCBtaXhlcl9kZWZhdWx0cyk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXplZCBBQzk3IG1peGVyXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogUGVyZm9ybSBhIGZ1bGwgcmVzZXQgb24gdGhlIGhhcmR3YXJlOyB0aGlzIGlzIGludm9rZWQgd2hlbiBhbiBBUE0KKyAgIHJlc3VtZSBldmVudCBvY2N1cnMuICAqLworc3RhdGljIHZvaWQKK25tMjU2X2Z1bGxfcmVzZXQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIG5tMjU2X2luaXRIdyAoY2FyZCk7CisgICAgYWM5N19yZXNldCAoJihjYXJkLT5tZGV2KSk7Cit9CisKKy8qIAorICogU2VlIGlmIHRoZSBzaWduYXR1cmUgbGVmdCBieSB0aGUgTk0yNTYgQklPUyBpcyBpbnRhY3Q7IGlmIHNvLCB3ZSB1c2UKKyAqIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgYXMgdGhlIGVuZCBvZiBvdXIgYXVkaW8gYnVmZmVyIGluIHRoZSB2aWRlbworICogUkFNLgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdAorbm0yNTZfcGVla19mb3Jfc2lnIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKK3sKKyAgICB1MzIgcG9ydDFvZmZzZXQgCisJPSBjYXJkLT5wb3J0WzBdLnBoeXNhZGRyICsgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0IC0gMHgwNDAwOworICAgIC8qIFRoZSBzaWduYXR1cmUgaXMgbG9jYXRlZCAxSyBiZWxvdyB0aGUgZW5kIG9mIHZpZGVvIFJBTS4gICovCisgICAgY2hhciBfX2lvbWVtICp0ZW1wID0gaW9yZW1hcF9ub2NhY2hlIChwb3J0MW9mZnNldCwgMTYpOworICAgIC8qIERlZmF1bHQgYnVmZmVyIGVuZCBpcyA1MTIwIGJ5dGVzIGJlbG93IHRoZSB0b3Agb2YgUkFNLiAgKi8KKyAgICB1MzIgZGVmYXVsdF92YWx1ZSA9IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCAtIDB4MTQwMDsKKyAgICB1MzIgc2lnOworCisgICAgLyogSW5zdGFsbCB0aGUgZGVmYXVsdCB2YWx1ZSBmaXJzdCwgc28gd2UgZG9uJ3QgaGF2ZSB0byByZXBlYXRlZGx5CisgICAgICAgZG8gaXQgaWYgdGhlcmUgaXMgYSBwcm9ibGVtLiAgKi8KKyAgICBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSBkZWZhdWx0X3ZhbHVlOworCisgICAgaWYgKHRlbXAgPT0gTlVMTCkgeworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBVbmFibGUgdG8gc2NhbiBmb3IgY2FyZCBzaWduYXR1cmUgaW4gdmlkZW8gUkFNXG4iKTsKKwlyZXR1cm47CisgICAgfQorICAgIHNpZyA9IHJlYWRsICh0ZW1wKTsKKyAgICBpZiAoKHNpZyAmIE5NX1NJR19NQVNLKSA9PSBOTV9TSUdOQVRVUkUpIHsKKwl1MzIgcG9pbnRlciA9IHJlYWRsICh0ZW1wICsgNCk7CisKKwkvKgorCSAqIElmIGl0J3Mgb2J2aW91c2x5IGludmFsaWQsIGRvbid0IHVzZSBpdCAodGhlIHBvcnQgYWxyZWFkeSBoYXMgYQorCSAqIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgc2V0KS4KKwkgKi8KKwlpZiAocG9pbnRlciAhPSAweGZmZmZmZmZmKQorCSAgICBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSBwb2ludGVyOworCisJcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBGb3VuZCBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU06IDB4JXhcbiIsCisJCXBvaW50ZXIpOworICAgIH0KKworICAgIGlvdW5tYXAgKHRlbXApOworfQorCisvKiAKKyAqIEluc3RhbGwgYSBkcml2ZXIgZm9yIHRoZSBQQ0kgZGV2aWNlIHJlZmVyZW5jZWQgYnkgUENJREVWLgorICogVkVSU1RSIGlzIGEgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBzdHJpbmcuCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQKK25tMjU2X2luc3RhbGwoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgZW51bSBubTI1NnJldiByZXYsIGNoYXIgKnZlcnN0cikKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZDsKKyAgICBzdHJ1Y3QgcG1fZGV2ICpwbWRldjsKKyAgICBpbnQgeDsKKworICAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKQorCSAgICByZXR1cm4gMDsKKworICAgIGNhcmQgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBubTI1Nl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKGNhcmQgPT0gTlVMTCkgeworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBvdXQgb2YgbWVtb3J5IVxuIik7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgY2FyZC0+bWFnc2lnID0gTk1fTUFHSUNfU0lHOworICAgIGNhcmQtPnBsYXlpbmcgID0gMDsKKyAgICBjYXJkLT5yZWNvcmRpbmcgPSAwOworICAgIGNhcmQtPnJldiA9IHJldjsKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CisKKyAgICAvKiBJbml0IHRoZSBtZW1vcnkgcG9ydCBpbmZvLiAgKi8KKyAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7CisJY2FyZC0+cG9ydFt4XS5waHlzYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGNpZGV2LCB4KTsKKwljYXJkLT5wb3J0W3hdLnB0ciA9IE5VTEw7CisJY2FyZC0+cG9ydFt4XS5zdGFydF9vZmZzZXQgPSAwOworCWNhcmQtPnBvcnRbeF0uZW5kX29mZnNldCA9IDA7CisgICAgfQorCisgICAgLyogUG9ydCAyIGlzIGVhc3kuICAqLworICAgIGNhcmQtPnBvcnRbMV0uc3RhcnRfb2Zmc2V0ID0gMDsKKyAgICBjYXJkLT5wb3J0WzFdLmVuZF9vZmZzZXQgPSBOTV9QT1JUMl9TSVpFOworCisgICAgLyogWXVjay4gIEJ1dCB3ZSBoYXZlIHRvIG1hcCBpbiBwb3J0IDIgc28gd2UgY2FuIGNoZWNrIGhvdyBtdWNoIFJBTSB0aGUKKyAgICAgICBjYXJkIGhhcy4gICovCisgICAgaWYgKG5tMjU2X3JlbWFwX3BvcnRzIChjYXJkKSkgeworCWtmcmVlIChjYXJkKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiAKKyAgICAgKiBUaGUgTk0yNTYgaGFzIHR3byBtZW1vcnkgcG9ydHMuICBUaGUgZmlyc3QgcG9ydCBpcyBub3RoaW5nCisgICAgICogbW9yZSB0aGFuIGEgY2h1bmsgb2YgdmlkZW8gUkFNLCB3aGljaCBpcyB1c2VkIGFzIHRoZSBJL08gcmluZworICAgICAqIGJ1ZmZlci4gIFRoZSBzZWNvbmQgcG9ydCBoYXMgdGhlIGFjdHVhbCBqdWljeSBzdHVmZiAobGlrZSB0aGUKKyAgICAgKiBtaXhlciBhbmQgdGhlIHBsYXliYWNrIGVuZ2luZSBjb250cm9sIHJlZ2lzdGVycykuCisgICAgICovCisKKyAgICBpZiAoY2FyZC0+cmV2ID09IFJFVl9OTTI1NkFWKSB7CisJLyogT2ssIHRyeSB0byBzZWUgaWYgdGhpcyBpcyBhIG5vbi1BQzk3IHZlcnNpb24gb2YgdGhlIGhhcmR3YXJlLiAqLworCWludCBwdmFsID0gbm0yNTZfcmVhZFBvcnQxNiAoY2FyZCwgMiwgTk1fTUlYRVJfUFJFU0VOQ0UpOworCWlmICgocHZhbCAmIE5NX1BSRVNFTkNFX01BU0spICE9IE5NX1BSRVNFTkNFX1ZBTFVFKSB7CisJICAgIGlmICghIGZvcmNlX2xvYWQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFRoaXMgZG9lc24ndCBsb29rIHRvIG1lIGxpa2UgdGhlIEFDOTctY29tcGF0aWJsZSB2ZXJzaW9uLlxuIik7CisJCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBZb3UgY2FuIGZvcmNlIHRoZSBkcml2ZXIgdG8gbG9hZCBieSBwYXNzaW5nIGluIHRoZSBtb2R1bGVcbiIpOworCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgcGFyYW1ldGVyOlxuIik7CisJCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICAgICAgICAgZm9yY2VfbG9hZCA9IDFcbiIpOworCQlwcmludGsgKEtFUk5fRVJSICJcbiIpOworCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgTW9yZSBsaWtlbHksIHlvdSBzaG91bGQgYmUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFNCLTE2IG9yXG4iKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgIENTNDIzMiBkcml2ZXIgaW5zdGVhZC4gIChJZiB5b3VyIEJJT1MgaGFzIHNldHRpbmdzIGZvclxuIik7CisJCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBJUlEgYW5kL29yIERNQSBmb3IgdGhlIHNvdW5kIGNhcmQsIHRoaXMgaXMgKm5vdCogdGhlIGNvcnJlY3RcbiIpOworCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgZHJpdmVyIHRvIHVzZS4pXG4iKTsKKwkJbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7CisJCWtmcmVlIChjYXJkKTsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJOTTI1NjogRm9yY2luZyBkcml2ZXIgbG9hZCBhcyBwZXIgdXNlciByZXF1ZXN0LlxuIik7CisJICAgIH0KKwl9CisJZWxzZSB7CisJIC8qICAgcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBDb25ncmF0dWxhdGlvbnMuIFlvdSdyZSBub3QgcnVubmluZyBFdW5pY2UuXG4iKSovOworCX0KKwljYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSAyNTYwICogMTAyNDsKKwljYXJkLT5pbnRyb3V0aW5lID0gbm0yNTZfaW50ZXJydXB0OworCWNhcmQtPm1peGVyX3N0YXR1c19vZmZzZXQgPSBOTV9NSVhFUl9TVEFUVVNfT0ZGU0VUOworCWNhcmQtPm1peGVyX3N0YXR1c19tYXNrID0gTk1fTUlYRVJfUkVBRFlfTUFTSzsKKyAgICB9IAorICAgIGVsc2UgeworCS8qIE5vdCBzdXJlIGlmIHRoZXJlIGlzIGFueSByZWxldmFudCBkZXRlY3QgZm9yIHRoZSBaWCBvciBub3QuICAqLworCWlmIChubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4YTBiKSAhPSAwKQorCSAgICBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSA2MTQ0ICogMTAyNDsKKwllbHNlCisJICAgIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IDQwOTYgKiAxMDI0OworCisJY2FyZC0+aW50cm91dGluZSA9IG5tMjU2X2ludGVycnVwdF96eDsKKwljYXJkLT5taXhlcl9zdGF0dXNfb2Zmc2V0ID0gTk0yX01JWEVSX1NUQVRVU19PRkZTRVQ7CisJY2FyZC0+bWl4ZXJfc3RhdHVzX21hc2sgPSBOTTJfTUlYRVJfUkVBRFlfTUFTSzsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVydG9wID49IDk4MzA0ICYmIGJ1ZmZlcnRvcCA8IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCkKKwljYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSBidWZmZXJ0b3A7CisgICAgZWxzZQorCW5tMjU2X3BlZWtfZm9yX3NpZyAoY2FyZCk7CisKKyAgICBjYXJkLT5wb3J0WzBdLnN0YXJ0X29mZnNldCA9IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCAtIDk4MzA0OworCisgICAgcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBNYXBwaW5nIHBvcnQgMSBmcm9tIDB4JXggLSAweCV4XG4iLAorCSAgICBjYXJkLT5wb3J0WzBdLnN0YXJ0X29mZnNldCwgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0KTsKKworICAgIGlmIChubTI1Nl9yZW1hcF9wb3J0cyAoY2FyZCkpIHsKKwlrZnJlZSAoY2FyZCk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogU2VlIGlmIHdlIGNhbiBnZXQgdGhlIGludGVycnVwdC4gKi8KKworICAgIGNhcmQtPmlycSA9IHBjaWRldi0+aXJxOworICAgIGNhcmQtPmhhc19pcnEgPSAwOworCisgICAgaWYgKG5tMjU2X2dyYWJJbnRlcnJ1cHQgKGNhcmQpICE9IDApIHsKKwlubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKKwlrZnJlZSAoY2FyZCk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgbm0yNTZfcmVsZWFzZUludGVycnVwdCAoY2FyZCk7CisKKyAgICAvKgorICAgICAqCUluaXQgdGhlIGJvYXJkLgorICAgICAqLworCisgICAgY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplID0gMTYzODQ7CisgICAgY2FyZC0+cmVjb3JkQnVmZmVyU2l6ZSA9IDE2Mzg0OworCisgICAgY2FyZC0+Y29lZmZCdWYgPSBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgLSBOTV9NQVhfQ09FRkZJQ0lFTlQ7CisgICAgY2FyZC0+YWJ1ZjIgPSBjYXJkLT5jb2VmZkJ1ZiAtIGNhcmQtPnJlY29yZEJ1ZmZlclNpemU7CisgICAgY2FyZC0+YWJ1ZjEgPSBjYXJkLT5hYnVmMiAtIGNhcmQtPnBsYXliYWNrQnVmZmVyU2l6ZTsKKyAgICBjYXJkLT5hbGxDb2VmZkJ1ZiA9IGNhcmQtPmFidWYyIC0gKE5NX1RPVEFMX0NPRUZGX0NPVU5UICogNCk7CisKKyAgICAvKiBGaXhlZCBzZXR0aW5nLiAqLworICAgIGNhcmQtPm1peGVyID0gTk1fTUlYRVJfT0ZGU0VUOworICAgIGNhcmQtPm1peGVyX3ZhbHVlc19pbml0ID0gMDsKKworICAgIGNhcmQtPmlzX29wZW5fcGxheSA9IDA7CisgICAgY2FyZC0+aXNfb3Blbl9yZWNvcmQgPSAwOworCisgICAgY2FyZC0+Y29lZmZzQ3VycmVudCA9IDA7CisKKyAgICBjYXJkLT5vcGVuY250WzBdID0gMDsgY2FyZC0+b3BlbmNudFsxXSA9IDA7CisKKyAgICAvKiBSZWFzb25hYmxlIGRlZmF1bHQgc2V0dGluZ3MsIGJ1dCBsYXJnZWx5IHVubmVjZXNzYXJ5LiAqLworICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKKwljYXJkLT5zaW5mb1t4XS5iaXRzID0gODsKKwljYXJkLT5zaW5mb1t4XS5zdGVyZW8gPSAwOworCWNhcmQtPnNpbmZvW3hdLnNhbXBsZXJhdGUgPSA4MDAwOworICAgIH0KKworICAgIG5tMjU2X2luaXRIdyAoY2FyZCk7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7CisJaWYgKChjYXJkLT5kZXZbeF0gPQorCSAgICAgc291bmRfaW5zdGFsbF9hdWRpb2RydihBVURJT19EUklWRVJfVkVSU0lPTiwKKwkJCQkgICAgIk5NMjU2IiwgJm5tMjU2X2F1ZGlvX2RyaXZlciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19kcml2ZXIpLAorCQkJCSAgICBETUFfTk9ETUEsIEFGTVRfVTggfCBBRk1UX1MxNl9MRSwKKwkJCQkgICAgTlVMTCwgLTEsIC0xKSkgPj0gMCkgeworCSAgICAvKiAxSyBtaW5pbXVtIGJ1ZmZlciBzaXplLiAqLworCSAgICBhdWRpb19kZXZzW2NhcmQtPmRldlt4XV0tPm1pbl9mcmFnbWVudCA9IDEwOworCSAgICAvKiBNYXhpbXVtIG9mIDhLIGJ1ZmZlciBzaXplLiAqLworCSAgICBhdWRpb19kZXZzW2NhcmQtPmRldlt4XV0tPm1heF9mcmFnbWVudCA9IDEzOworCX0KKwllbHNlIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJOTTI1NjogVG9vIG1hbnkgUENNIGRldmljZXMgYXZhaWxhYmxlXG4iKTsKKwkgICAgbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7CisJICAgIGtmcmVlIChjYXJkKTsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICAgIHBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsY2FyZCk7CisKKyAgICAvKiBJbnNlcnQgdGhlIGNhcmQgaW4gdGhlIGxpc3QuICAqLworICAgIGNhcmQtPm5leHRfY2FyZCA9IG5tY2FyZF9saXN0OworICAgIG5tY2FyZF9saXN0ID0gY2FyZDsKKworICAgIHByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemVkIE5lb01hZ2ljICVzIGF1ZGlvIGluIFBDSSBuYXRpdmUgbW9kZVxuIiwKKwkgICB2ZXJzdHIpOworCisgICAgLyogCisgICAgICogQW5kIG91ciBtaXhlci4gIChXZSBzaG91bGQgYWxsb3cgc3VwcG9ydCBmb3Igb3RoZXIgbWl4ZXJzLCBtYXliZS4pCisgICAgICovCisKKyAgICBubTI1Nl9pbnN0YWxsX21peGVyIChjYXJkKTsKKworICAgIHBtZGV2ID0gcG1fcmVnaXN0ZXIoUE1fUENJX0RFViwgUE1fUENJX0lEKHBjaWRldiksIGhhbmRsZV9wbV9ldmVudCk7CisgICAgaWYgKHBtZGV2KQorICAgICAgICBwbWRldi0+ZGF0YSA9IGNhcmQ7CisKKyAgICByZXR1cm4gMTsKK30KKworCisvKgorICogUE0gZXZlbnQgaGFuZGxlciwgc28gdGhlIGNhcmQgaXMgcHJvcGVybHkgcmVpbml0aWFsaXplZCBhZnRlciBhIHBvd2VyCisgKiBldmVudC4KKyAqLworc3RhdGljIGludAoraGFuZGxlX3BtX2V2ZW50IChzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjcmQgPSAoc3RydWN0IG5tMjU2X2luZm8qKSBkZXYtPmRhdGE7CisgICAgaWYgKGNyZCkgeworICAgICAgICBzd2l0Y2ggKHJxc3QpIHsKKwljYXNlIFBNX1NVU1BFTkQ6CisJICAgIGJyZWFrOworCWNhc2UgUE1fUkVTVU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwbGF5aW5nID0gY3JkLT5wbGF5aW5nOworICAgICAgICAgICAgICAgIG5tMjU2X2Z1bGxfcmVzZXQgKGNyZCk7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBIGxpdHRsZSB1Z2x5LCBidXQgdGhhdCdzIG9rOyBwcmV0ZW5kIHRoZQorICAgICAgICAgICAgICAgICAqIGJsb2NrIHdlIHdlcmUgcGxheWluZyBpcyBkb25lLiAKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAocGxheWluZykKKyAgICAgICAgICAgICAgICAgICAgRE1BYnVmX291dHB1dGludHIgKGNyZC0+ZGV2X2Zvcl9wbGF5LCAxKTsKKyAgICAgICAgICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK25tMjU2X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQoreworICAgIGlmIChwY2lkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2QVZfQVVESU8pCisJcmV0dXJuIG5tMjU2X2luc3RhbGwocGNpZGV2LCBSRVZfTk0yNTZBViwgIjI1NkFWIik7CisgICAgaWYgKHBjaWRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZaWF9BVURJTykKKwlyZXR1cm4gbm0yNTZfaW5zdGFsbChwY2lkZXYsIFJFVl9OTTI1NlpYLCAiMjU2WlgiKTsKKyAgICBpZiAocGNpZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlhMX1BMVVNfQVVESU8pCisJcmV0dXJuIG5tMjU2X2luc3RhbGwocGNpZGV2LCBSRVZfTk0yNTZaWCwgIjI1NlhMKyIpOworICAgIHJldHVybiAtMTsgLyogc2hvdWxkIG5vdCBjb21lIGhlcmUgLi4uICovCit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorbm0yNTZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpIHsKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqeGNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwqbmV4dF9jYXJkID0gTlVMTDsKKworICAgIGZvciAoY2FyZCA9IG5tY2FyZF9saXN0OyBjYXJkICE9IE5VTEw7IGNhcmQgPSBuZXh0X2NhcmQpIHsKKwluZXh0X2NhcmQgPSBjYXJkLT5uZXh0X2NhcmQ7CisJaWYgKGNhcmQgPT0geGNhcmQpIHsKKwkgICAgc3RvcFBsYXkgKGNhcmQpOworCSAgICBzdG9wUmVjb3JkIChjYXJkKTsKKwkgICAgaWYgKGNhcmQtPmhhc19pcnEpCisJCWZyZWVfaXJxIChjYXJkLT5pcnEsIGNhcmQpOworCSAgICBubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKKwkgICAgc291bmRfdW5sb2FkX21peGVyZGV2IChjYXJkLT5taXhlcl9vc3NfZGV2KTsKKwkgICAgc291bmRfdW5sb2FkX2F1ZGlvZGV2IChjYXJkLT5kZXZbMF0pOworCSAgICBzb3VuZF91bmxvYWRfYXVkaW9kZXYgKGNhcmQtPmRldlsxXSk7CisJICAgIGtmcmVlIChjYXJkKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAobm1jYXJkX2xpc3QgPT0gY2FyZCkKKyAgICAJbm1jYXJkX2xpc3QgPSBuZXh0X2NhcmQ7Cit9CisKKy8qCisgKiBPcGVuIHRoZSBkZXZpY2UKKyAqCisgKiBERVYgIC0gZGV2aWNlCisgKiBNT0RFIC0gbW9kZSB0byBvcGVuIGRldmljZSAobG9naWNhbCBPUiBvZiBPUEVOX1JFQUQgYW5kIE9QRU5fV1JJVEUpCisgKgorICogQ2FsbGVkIHdoZW4gb3BlbmluZyB0aGUgRE1BYnVmICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjI1OSkKKyAqLworc3RhdGljIGludAorbm0yNTZfYXVkaW9fb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKKyAgICBpbnQgdzsKKwkKKyAgICBpZiAoY2FyZCA9PSBOVUxMKQorCXJldHVybiAtRU5PREVWOworCisgICAgaWYgKGNhcmQtPmRldlswXSA9PSBkZXYpCisJdyA9IDA7CisgICAgZWxzZSBpZiAoY2FyZC0+ZGV2WzFdID09IGRldikKKwl3ID0gMTsKKyAgICBlbHNlCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBpZiAoY2FyZC0+b3BlbmNudFt3XSA+IDApCisJcmV0dXJuIC1FQlVTWTsKKworICAgIC8qIE5vIGJpdHMgc2V0PyBIdWg/ICovCisgICAgaWYgKCEgKChtb2RlICYgT1BFTl9SRUFEKSB8fCAobW9kZSAmIE9QRU5fV1JJVEUpKSkKKwlyZXR1cm4gLUVJTzsKKworICAgIC8qCisgICAgICogSWYgaXQncyBvcGVuIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlLCBhbmQgdGhlIGNhcmQncyBjdXJyZW50bHkKKyAgICAgKiBiZWluZyByZWFkIG9yIHdyaXR0ZW4gdG8sIHRoZW4gZG8gdGhlIG9wcG9zaXRlIG9mIHdoYXQgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGRvbmUuICBPdGhlcndpc2UsIGRvbid0IHNwZWNpZnkgYW55IG1vZGUgdW50aWwgdGhlCisgICAgICogdXNlciBhY3R1YWxseSB0cmllcyB0byBkbyBJL08uICAoU29tZSBwcm9ncmFtcyBvcGVuIHRoZSBkZXZpY2UKKyAgICAgKiBmb3IgYm90aCByZWFkIGFuZCB3cml0ZSwgYnV0IG9ubHkgYWN0dWFsbHkgZG8gcmVhZGluZyBvciB3cml0aW5nLikKKyAgICAgKi8KKworICAgIGlmICgobW9kZSAmIE9QRU5fV1JJVEUpICYmIChtb2RlICYgT1BFTl9SRUFEKSkgeworCWlmIChjYXJkLT5pc19vcGVuX3BsYXkpCisJICAgIG1vZGUgPSBPUEVOX1dSSVRFOworCWVsc2UgaWYgKGNhcmQtPmlzX29wZW5fcmVjb3JkKQorCSAgICBtb2RlID0gT1BFTl9SRUFEOworCWVsc2UgbW9kZSA9IDA7CisgICAgfQorCQorICAgIGlmIChtb2RlICYgT1BFTl9XUklURSkgeworCWlmIChjYXJkLT5pc19vcGVuX3BsYXkgPT0gMCkgeworCSAgICBjYXJkLT5kZXZfZm9yX3BsYXkgPSBkZXY7CisJICAgIGNhcmQtPmlzX29wZW5fcGxheSA9IDE7CisJfQorCWVsc2UKKwkgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisKKyAgICBpZiAobW9kZSAmIE9QRU5fUkVBRCkgeworCWlmIChjYXJkLT5pc19vcGVuX3JlY29yZCA9PSAwKSB7CisJICAgIGNhcmQtPmRldl9mb3JfcmVjb3JkID0gZGV2OworCSAgICBjYXJkLT5pc19vcGVuX3JlY29yZCA9IDE7CisJfQorCWVsc2UKKwkgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisKKyAgICBjYXJkLT5vcGVuY250W3ddKys7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbG9zZSB0aGUgZGV2aWNlCisgKgorICogREVWICAtIGRldmljZQorICoKKyAqIENhbGxlZCB3aGVuIGNsb3NpbmcgdGhlIERNQWJ1ZiAgICAgICAgICAgICAgIChkbWFidWYuYzo0NzcpCisgKiAgICAgIGFmdGVyIGhhbHRfeGZlcgorICovCitzdGF0aWMgdm9pZAorbm0yNTZfYXVkaW9fY2xvc2UoaW50IGRldikKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKKwkKKyAgICBpZiAoY2FyZCAhPSBOVUxMKSB7CisJaW50IHc7CisKKwlpZiAoY2FyZC0+ZGV2WzBdID09IGRldikKKwkgICAgdyA9IDA7CisJZWxzZSBpZiAoY2FyZC0+ZGV2WzFdID09IGRldikKKwkgICAgdyA9IDE7CisJZWxzZQorCSAgICByZXR1cm47CisKKwljYXJkLT5vcGVuY250W3ddLS07CisJaWYgKGNhcmQtPm9wZW5jbnRbd10gPD0gMCkgeworCSAgICBjYXJkLT5vcGVuY250W3ddID0gMDsKKworCSAgICBpZiAoY2FyZC0+ZGV2X2Zvcl9wbGF5ID09IGRldikgeworCQlzdG9wUGxheSAoY2FyZCk7CisJCWNhcmQtPmlzX29wZW5fcGxheSA9IDA7CisJCWNhcmQtPmRldl9mb3JfcGxheSA9IC0xOworCSAgICB9CisKKwkgICAgaWYgKGNhcmQtPmRldl9mb3JfcmVjb3JkID09IGRldikgeworCQlzdG9wUmVjb3JkIChjYXJkKTsKKwkJY2FyZC0+aXNfb3Blbl9yZWNvcmQgPSAwOworCQljYXJkLT5kZXZfZm9yX3JlY29yZCA9IC0xOworCSAgICB9CisJfQorICAgIH0KK30KKworLyogU3RhbmRhcmQgaW9jdGwgaGFuZGxlci4gKi8KK3N0YXRpYyBpbnQKK25tMjU2X2F1ZGlvX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisgICAgaW50IHJldDsKKyAgICB1MzIgb2xkaW5mbzsKKyAgICBpbnQgdzsKKworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOworCisgICAgaWYgKGNhcmQgPT0gTlVMTCkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGlmIChkZXYgPT0gY2FyZC0+ZGV2WzBdKQorCXcgPSAwOworICAgIGVsc2UKKwl3ID0gMTsKKworICAgIC8qIAorICAgICAqIFRoZSBjb2RlIGhlcmUgaXMgbWVzc3kuICBUaGVyZSBhcmUgcHJvYmFibHkgYmV0dGVyIHdheXMgdG8gZG8KKyAgICAgKiBpdC4gIChJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaGFuZGxlIGl0IHRoZSBzYW1lIHdheSB0aGUgQUM5NyBtaXhlciAKKyAgICAgKiBpcyBkb25lLikKKyAgICAgKi8KKyAgICBzd2l0Y2ggKGNtZCkKKwl7CisJY2FzZSBTT1VORF9QQ01fV1JJVEVfUkFURToKKwkgICAgaWYgKGdldF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkgICAgaWYgKHJldCAhPSAwKSB7CisJCW9sZGluZm8gPSBjYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlOworCQljYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlID0gcmV0OworCQlyZXQgPSBubTI1Nl9zZXRJbmZvKGRldiwgY2FyZCk7CisJCWlmIChyZXQgIT0gMCkKKwkJICAgIGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGUgPSBvbGRpbmZvOworCSAgICB9CisJICAgIGlmIChyZXQgPT0gMCkKKwkJcmV0ID0gY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJICAgIHJldCA9IGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGU7CisJICAgIGJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkgICAgaWYgKGdldF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkgICAgY2FyZC0+c2luZm9bd10uc3RlcmVvID0gcmV0ID8gMSA6IDA7CisJICAgIHJldCA9IG5tMjU2X3NldEluZm8gKGRldiwgY2FyZCk7CisJICAgIGlmIChyZXQgPT0gMCkKKwkJcmV0ID0gY2FyZC0+c2luZm9bd10uc3RlcmVvOworCisJICAgIGJyZWFrOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFM6CisJICAgIGlmIChnZXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZykpCisJCXJldHVybiAtRUZBVUxUOworCisJICAgIGlmIChyZXQgPCAxIHx8IHJldCA+IDMpCisJCXJldCA9IGNhcmQtPnNpbmZvW3ddLnN0ZXJlbyArIDE7CisJICAgIGVsc2UgeworCQljYXJkLT5zaW5mb1t3XS5zdGVyZW8gPSByZXQgLSAxOworCQlyZXQgPSBubTI1Nl9zZXRJbmZvIChkZXYsIGNhcmQpOworCQlpZiAocmV0ID09IDApCisJCSAgICByZXQgPSBjYXJkLT5zaW5mb1t3XS5zdGVyZW8gKyAxOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkgICAgcmV0ID0gY2FyZC0+c2luZm9bd10uc3RlcmVvICsgMTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOgorCSAgICBpZiAoZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCSAgICBpZiAocmV0ICE9IDApIHsKKwkJb2xkaW5mbyA9IGNhcmQtPnNpbmZvW3ddLmJpdHM7CisJCWNhcmQtPnNpbmZvW3ddLmJpdHMgPSByZXQ7CisJCXJldCA9IG5tMjU2X3NldEluZm8gKGRldiwgY2FyZCk7CisJCWlmIChyZXQgIT0gMCkKKwkJICAgIGNhcmQtPnNpbmZvW3ddLmJpdHMgPSBvbGRpbmZvOworCSAgICB9CisJICAgIGlmIChyZXQgPT0gMCkKKwkJcmV0ID0gY2FyZC0+c2luZm9bd10uYml0czsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJICAgIHJldCA9IGNhcmQtPnNpbmZvW3ddLmJpdHM7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorICAgIHJldHVybiBwdXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZyk7Cit9CisKKy8qCisgKiBHaXZlbiB0aGUgc291bmQgZGV2aWNlIERFViBhbmQgYW4gYXNzb2NpYXRlZCBwaHlzaWNhbCBidWZmZXIgUEhZU0JVRiwgCisgKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgYnVmZmVyIGluIGtlcm5lbCBzcGFjZS4gCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBleGlzdCBhcyBwYXJ0IG9mIHRoZSBzb3VuZGNvcmUgcm91dGluZXMuCisgKi8KKworc3RhdGljIGNoYXIgKgorbm0yNTZfZ2V0RE1BYnVmZmVyIChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIHBoeXNidWYpCit7CisgICAgc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisgICAgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSBhZGV2LT5kbWFwX291dDsKKyAgICBjaGFyICpkbWFfc3RhcnQgPQorCShjaGFyICopKHBoeXNidWYgLSAodW5zaWduZWQgbG9uZylkbWFwLT5yYXdfYnVmX3BoeXMgCisJCSArICh1bnNpZ25lZCBsb25nKWRtYXAtPnJhd19idWYpOworCisgICAgcmV0dXJuIGRtYV9zdGFydDsKK30KKworCisvKgorICogT3V0cHV0IGEgYmxvY2sgdG8gc291bmQgZGV2aWNlCisgKgorICogZGV2ICAgICAgICAgIC0gZGV2aWNlIG51bWJlcgorICogYnVmICAgICAgICAgIC0gcGh5c2ljYWwgYWRkcmVzcyBvZiBidWZmZXIKKyAqIHRvdGFsX2NvdW50ICAtIHRvdGFsIGJ5dGUgY291bnQgaW4gYnVmZmVyCisgKiBpbnRyZmxhZyAgICAgLSBzZXQgaWYgdGhpcyBoYXMgYmVlbiBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgCisgKgkJCQkgICh2aWEgRE1BYnVmX291dHB1dGludHIpCisgKiByZXN0YXJ0X2RtYSAgLSBzZXQgaWYgZW5naW5lIG5lZWRzIHRvIGJlIHJlLWluaXRpYWxpc2VkCisgKgorICogQ2FsbGVkIHdoZW46CisgKiAgMS4gU3RhcnRpbmcgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkbWFidWYuYzoxMzI3KQorICogIDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG1hYnVmLmM6MTUwNCkKKyAqICAzLiBBIG5ldyBidWZmZXIgbmVlZHMgdG8gYmUgc2VudCB0byB0aGUgZGV2aWNlICAgICAgKGRtYWJ1Zi5jOjE1NzkpCisgKi8KK3N0YXRpYyB2b2lkCitubTI1Nl9hdWRpb19vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBwaHlzYnVmLAorCQkJCSAgICAgICBpbnQgdG90YWxfY291bnQsIGludCBpbnRyZmxhZykKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKKworICAgIGlmIChjYXJkICE9IE5VTEwpIHsKKwljaGFyICpkbWFfYnVmID0gbm0yNTZfZ2V0RE1BYnVmZmVyIChkZXYsIHBoeXNidWYpOworCWNhcmQtPmlzX29wZW5fcGxheSA9IDE7CisJY2FyZC0+ZGV2X2Zvcl9wbGF5ID0gZGV2OworCW5tMjU2X3dyaXRlX2Jsb2NrIChjYXJkLCBkbWFfYnVmLCB0b3RhbF9jb3VudCk7CisgICAgfQorfQorCisvKiBEaXR0bywgYnV0IGRvIHJlY29yZGluZyBpbnN0ZWFkLiAgKi8KK3N0YXRpYyB2b2lkCitubTI1Nl9hdWRpb19zdGFydF9pbnB1dChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIHBoeXNidWYsIGludCBjb3VudCwKKwkJCWludCBpbnRyZmxhZykKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKKworICAgIGlmIChjYXJkICE9IE5VTEwpIHsKKwljaGFyICpkbWFfYnVmID0gbm0yNTZfZ2V0RE1BYnVmZmVyIChkZXYsIHBoeXNidWYpOworCWNhcmQtPmlzX29wZW5fcmVjb3JkID0gMTsKKwljYXJkLT5kZXZfZm9yX3JlY29yZCA9IGRldjsKKwlubTI1Nl9zdGFydFJlY29yZGluZyAoY2FyZCwgZG1hX2J1ZiwgY291bnQpOworICAgIH0KK30KKworLyogCisgKiBQcmVwYXJlIGZvciBpbnB1dHRpbmcgc2FtcGxlcyB0byBERVYuIAorICogRWFjaCByZXF1ZXN0ZWQgYnVmZmVyIHdpbGwgYmUgQlNJWkUgYnllcyBsb25nLCB3aXRoIGEgdG90YWwgb2YKKyAqIEJDT1VOVCBidWZmZXJzLiAKKyAqLworCitzdGF0aWMgaW50CitubTI1Nl9hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisgICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7CisKKyAgICBpZiAoY2FyZCA9PSBOVUxMKSAKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGlmIChjYXJkLT5pc19vcGVuX3JlY29yZCAmJiBjYXJkLT5kZXZfZm9yX3JlY29yZCAhPSBkZXYpCisJcmV0dXJuIC1FQlVTWTsKKworICAgIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZmxhZ3MgfD0gRE1BX05PRE1BOworICAgIHJldHVybiAwOworfQorCisvKgorICogUHJlcGFyZSBmb3Igb3V0cHV0dGluZyBzYW1wbGVzIHRvIGBkZXYnCisgKgorICogRWFjaCBidWZmZXIgdGhhdCB3aWxsIGJlIHBhc3NlZCB3aWxsIGJlIGBic2l6ZScgYnl0ZXMgbG9uZywKKyAqIHdpdGggYSB0b3RhbCBvZiBgYmNvdW50JyBidWZmZXJzLgorICoKKyAqIENhbGxlZCB3aGVuOgorICogIDEuIEEgdHJpZ2dlciBlbmFibGVzIGF1ZGlvIG91dHB1dCAgICAgICAgICAgICAgICAgICAoZG1hYnVmLmM6OTc4KQorICogIDIuIFdlIGdldCBhIHdyaXRlIGJ1ZmZlciB3aXRob3V0IGRtYV9tb2RlIHNldHVwICAgICAoZG1hYnVmLmM6MTE1MikKKyAqICAzLiBXZSByZXN0YXJ0IGEgdHJhbnNmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjEzMjQpCisgKi8KKworc3RhdGljIGludAorbm0yNTZfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKKworICAgIGlmIChjYXJkID09IE5VTEwpCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBpZiAoY2FyZC0+aXNfb3Blbl9wbGF5ICYmIGNhcmQtPmRldl9mb3JfcGxheSAhPSBkZXYpCisJcmV0dXJuIC1FQlVTWTsKKworICAgIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmZsYWdzIHw9IERNQV9OT0RNQTsKKyAgICByZXR1cm4gMDsKK30KKworLyogU3RvcCB0aGUgY3VycmVudCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCBERVYuICAqLworc3RhdGljIHZvaWQKK25tMjU2X2F1ZGlvX3Jlc2V0KGludCBkZXYpCit7CisgICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7CisKKyAgICBpZiAoY2FyZCAhPSBOVUxMKSB7CisJaWYgKGNhcmQtPmRldl9mb3JfcGxheSA9PSBkZXYpCisJICAgIHN0b3BQbGF5IChjYXJkKTsKKwlpZiAoY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPT0gZGV2KQorCSAgICBzdG9wUmVjb3JkIChjYXJkKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK25tMjU2X2F1ZGlvX2xvY2FsX3FsZW4oaW50IGRldikKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgbm0yNTZfYXVkaW9fZHJpdmVyID0KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBubTI1Nl9hdWRpb19vcGVuLAorCS5jbG9zZQkJCT0gbm0yNTZfYXVkaW9fY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBubTI1Nl9hdWRpb19vdXRwdXRfYmxvY2ssCisJLnN0YXJ0X2lucHV0CQk9IG5tMjU2X2F1ZGlvX3N0YXJ0X2lucHV0LAorCS5pb2N0bAkJCT0gbm0yNTZfYXVkaW9faW9jdGwsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gbm0yNTZfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQsCisJLnByZXBhcmVfZm9yX291dHB1dAk9IG5tMjU2X2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dCwKKwkuaGFsdF9pbwkJPSBubTI1Nl9hdWRpb19yZXNldCwKKwkubG9jYWxfcWxlbgkJPSBubTI1Nl9hdWRpb19sb2NhbF9xbGVuLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5tMjU2X3BjaV90YmxbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9ORU9NQUdJQywgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NkFWX0FVRElPLAorCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX05FT01BR0lDLCBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WlhfQVVESU8sCisJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTkVPTUFHSUMsIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZYTF9QTFVTX0FVRElPLAorCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDB9LAorCXswLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbm0yNTZfcGNpX3RibCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG5tMjU2X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIm5tMjU2X2F1ZGlvIiwKKwkuaWRfdGFibGUJPSBubTI1Nl9wY2lfdGJsLAorCS5wcm9iZQkJPSBubTI1Nl9wcm9iZSwKKwkucmVtb3ZlCQk9IG5tMjU2X3JlbW92ZSwKK307CisKK21vZHVsZV9wYXJhbSh1c2VjYWNoZSwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oYnVmZmVydG9wLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG5tMjU2X2RlYnVnLCBib29sLCAwNjQ0KTsKK21vZHVsZV9wYXJhbShmb3JjZV9sb2FkLCBib29sLCAwKTsKKworc3RhdGljIGludCBfX2luaXQgZG9faW5pdF9ubTI1Nih2b2lkKQoreworICAgIHByaW50ayAoS0VSTl9JTkZPICJOZW9NYWdpYyAyNTZBVi8yNTZaWCBhdWRpbyBkcml2ZXIsIHZlcnNpb24gMS4xcFxuIik7CisgICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmbm0yNTZfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX25tMjU2ICh2b2lkKQoreworICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbm0yNTZfcGNpX2RyaXZlcik7CisgICAgcG1fdW5yZWdpc3Rlcl9hbGwgKCZoYW5kbGVfcG1fZXZlbnQpOworfQorCittb2R1bGVfaW5pdChkb19pbml0X25tMjU2KTsKK21vZHVsZV9leGl0KGNsZWFudXBfbm0yNTYpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ubTI1Nl9jb2VmZi5oIGIvc291bmQvb3NzL25tMjU2X2NvZWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlZWNjMgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9ubTI1Nl9jb2VmZi5oCkBAIC0wLDAgKzEsNDY5NyBAQAorI2lmbmRlZiBOTTI1Nl9DT0VGRl9ICisjZGVmaW5lIE5NMjU2X0NPRUZGX0gKKworI2RlZmluZSBOTV9UT1RBTF9DT0VGRl9DT1VOVCAweDMxNTgKKworc3RhdGljIGNoYXIgY29lZmZpY2llbnRzW05NX1RPVEFMX0NPRUZGX0NPVU5UICogNF0gPSB7IAorCTB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QTUsIDB4MDEsIDB4RUYsIDB4RkMsIDB4MjEsCisJMHgwNSwgMHg4NywgMHhGNywgMHg2MiwgMHgxMSwgMHhFOSwgMHg0NSwgMHg1RSwgMHhGOSwgMHhCNSwgMHgwMSwKKwkweERFLCAweEZGLCAweEE0LCAweEZGLCAweDYwLCAweDAwLCAweENBLCAweEZGLCAweDBELCAweDAwLCAweEZELAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0QsIDB4RkMsIDB4RDYsIDB4MDYsCisJMHg0QywgMHhGMywgMHhFRCwgMHgyMCwgMHgzRCwgMHgzRCwgMHg0QSwgMHhGMywgMHg0RSwgMHgwNSwgMHhCMSwKKwkweEZELCAweEUxLCAweDAwLCAweEMzLCAweEZGLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweEZELCAweEZGLAorCTB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4QUEsIDB4MDEsIDB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsIDB4N0UsCisJMHhGMSwgMHg0NCwgMHgzMCwgMHg0NCwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwNywgMHgwNywgMHg3MSwgMHhGQywKKwkweEFBLCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweEZELCAweEZGLCAweDAyLCAweDAwLCAweDA1LAorCTB4MDAsIDB4QzMsIDB4RkYsIDB4RTEsIDB4MDAsIDB4QjEsIDB4RkQsIDB4NEUsIDB4MDUsIDB4NEEsIDB4RjMsCisJMHgzRCwgMHgzRCwgMHhFRCwgMHgyMCwgMHg0QywgMHhGMywgMHhENiwgMHgwNiwgMHgzRCwgMHhGQywgMHhFNiwKKwkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweENBLCAweEZGLAorCTB4NjAsIDB4MDAsIDB4QTQsIDB4RkYsIDB4REUsIDB4RkYsIDB4QjUsIDB4MDEsIDB4NUUsIDB4RjksIDB4RTksCisJMHg0NSwgMHg2MiwgMHgxMSwgMHg4NywgMHhGNywgMHgyMSwgMHgwNSwgMHhFRiwgMHhGQywgMHhBNSwgMHgwMSwKKwkweDRCLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LAorCTB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsCisJMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwKKwkweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLAorCTB4Q0EsIDB4MDEsIDB4OTUsIDB4RkMsIDB4RUEsIDB4MDUsIDB4QkIsIDB4RjUsIDB4MjUsIDB4MTcsIDB4M0MsCisJMHg0MywgMHg4RCwgMHhGNiwgMHg0MywgMHgwMywgMHhGNSwgMHhGRSwgMHgyNiwgMHgwMCwgMHgyMCwgMHgwMCwKKwkweEUyLCAweEZGLCAweDA4LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRELCAweEZGLCAweEM1LAorCTB4MDEsIDB4NEMsIDB4RkMsIDB4MjYsIDB4MDcsIDB4QTMsIDB4RjEsIDB4QUIsIDB4MkMsIDB4QkIsIDB4MzMsCisJMHg4RiwgMHhGMSwgMHhDQSwgMHgwNiwgMHhBNiwgMHhGQywgMHg4NSwgMHgwMSwgMHg2RiwgMHhGRiwgMHgyNCwKKwkweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZFLCAweEZGLCAweEQ1LCAweEZGLCAweEJDLCAweDAwLAorCTB4RjAsIDB4RkQsIDB4RUMsIDB4MDQsIDB4RDksIDB4RjMsIDB4QjEsIDB4M0UsIDB4Q0QsIDB4MUUsIDB4QzEsCisJMHhGMywgMHhBRiwgMHgwNiwgMHg0OSwgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE2LCAweEZGLCAweEJCLCAweDAwLCAweEU5LCAweEZFLCAweDM4LAorCTB4MDEsIDB4NEIsIDB4RkYsIDB4MjgsIDB4RkUsIDB4M0EsIDB4NDgsIDB4MDQsIDB4MEEsIDB4MkUsIDB4RkEsCisJMHhERiwgMHgwMywgMHg4QSwgMHhGRCwgMHg2MCwgMHgwMSwgMHg2NSwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDUwLCAweEZGLCAweDk4LCAweDAxLCAweDBELCAweEZELAorCTB4RTAsIDB4MDQsIDB4MTQsIDB4RjgsIDB4QzMsIDB4MEYsIDB4ODksIDB4NDYsIDB4NEMsIDB4RkEsIDB4MzgsCisJMHgwMSwgMHgyNSwgMHgwMCwgMHg3RCwgMHhGRiwgMHg3MywgMHgwMCwgMHhDMiwgMHhGRiwgMHgwRiwgMHgwMCwKKwkweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDBGLAorCTB4MDcsIDB4ODQsIDB4RjIsIDB4MjksIDB4MjUsIDB4MUEsIDB4M0EsIDB4NjcsIDB4RjIsIDB4RjYsIDB4MDUsCisJMHg0MSwgMHhGRCwgMHgyNCwgMHgwMSwgMHhBMSwgMHhGRiwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDE1LCAweDAwLCAweDk3LCAweEZGLCAweDM3LCAweDAxLCAweDIyLCAweEZELCAweDIzLCAweDA2LAorCTB4MkYsIDB4RjIsIDB4MTEsIDB4MzksIDB4N0IsIDB4MjYsIDB4NTAsIDB4RjIsIDB4MUIsIDB4MDcsIDB4MzIsCisJMHhGQywgMHhFMSwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwKKwkweEM4LCAweEZGLCAweDY0LCAweDAwLCAweDlCLCAweEZGLCAweEVFLCAweEZGLCAweDk4LCAweDAxLCAweDkzLAorCTB4RjksIDB4MTAsIDB4NDYsIDB4MDMsIDB4MTEsIDB4QTcsIDB4RjcsIDB4MTIsIDB4MDUsIDB4RjYsIDB4RkMsCisJMHhBMiwgMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwKKwkweDAwLCAweDZBLCAweEZGLCAweDUzLCAweDAxLCAweEE2LCAweEZELCAweEE2LCAweDAzLCAweEExLCAweEZBLAorCTB4REUsIDB4MDgsIDB4NzYsIDB4NDgsIDB4MEMsIDB4RkYsIDB4REUsIDB4RkUsIDB4NzMsIDB4MDEsIDB4QzksCisJMHhGRSwgMHhDQSwgMHgwMCwgMHhBMCwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM2LCAweEZGLCAweEUxLCAweDAxLCAweDUyLCAweEZDLCAweDkzLCAweDA2LCAweDEwLCAweEY0LCAweDc4LAorCTB4MUQsIDB4OTAsIDB4M0YsIDB4M0UsIDB4RjQsIDB4QUEsIDB4MDQsIDB4MTksIDB4RkUsIDB4QTQsIDB4MDAsCisJMHhFMiwgMHhGRiwgMHhGQSwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNiwgMHgwMCwgMHg2OCwKKwkweEZGLCAweDkzLCAweDAxLCAweDkyLCAweEZDLCAweEUyLCAweDA2LCAweDgzLCAweEYxLCAweDhDLCAweDMyLAorCTB4RUQsIDB4MkQsIDB4OTAsIDB4RjEsIDB4MUUsIDB4MDcsIDB4NTcsIDB4RkMsIDB4QkQsIDB4MDEsIDB4NTEsCisJMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFOCwgMHhGRiwgMHgxMiwgMHgwMCwKKwkweDQyLCAweDAwLCAweEM0LCAweEZFLCAweDk0LCAweDAzLCAweDAyLCAweEY2LCAweDg5LCAweDQyLCAweDc2LAorCTB4MTgsIDB4NUMsIDB4RjUsIDB4MTIsIDB4MDYsIDB4ODQsIDB4RkMsIDB4RDEsIDB4MDEsIDB4M0IsIDB4RkYsCisJMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgwMywgMHgwMSwgMHg1MywKKwkweEZFLCAweDUzLCAweDAyLCAweDM5LCAweEZELCAweEE5LCAweDAyLCAweEYyLCAweDQ4LCAweEI5LCAweDA0LAorCTB4NTQsIDB4RkMsIDB4Q0EsIDB4MDIsIDB4MTYsIDB4RkUsIDB4MjAsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MjAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwgMHhGRiwgMHhDMywgMHgwMSwKKwkweEE3LCAweEZDLCAweEMwLCAweDA1LCAweDFFLCAweEY2LCAweEQ4LCAweDE1LCAweEU3LCAweDQzLCAweDIwLAorCTB4RjcsIDB4RUYsIDB4MDIsIDB4MjcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MkUsIDB4MDAsIDB4REQsIDB4RkYsCisJMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0OCwgMHhGRiwgMHhDRCwgMHgwMSwgMHg0MywKKwkweEZDLCAweDJBLCAweDA3LCAweEJDLCAweEYxLCAweDY0LCAweDJCLCAweEUzLCAweDM0LCAweEEzLCAweEYxLAorCTB4QUUsIDB4MDYsIDB4QkQsIDB4RkMsIDB4NzcsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHhDQSwgMHhGRiwgMHhENCwgMHgwMCwgMHhDOCwgMHhGRCwKKwkweDJBLCAweDA1LCAweDdELCAweEYzLCAweENBLCAweDNELCAweDIyLCAweDIwLCAweDc2LCAweEYzLCAweEM4LAorCTB4MDYsIDB4NDEsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgxNCwgMHgwMCwgMHhBQywgMHhGRiwgMHhBQywgMHgwMCwgMHgwOCwgMHhGRiwgMHhGRCwgMHgwMCwgMHhCNSwKKwkweEZGLCAweDRCLCAweEZELCAweEY0LCAweDQ3LCAweDMwLCAweDBCLCAweEJDLCAweEY5LCAweDE3LCAweDA0LAorCTB4NkUsIDB4RkQsIDB4NkQsIDB4MDEsIDB4NjAsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgyQywgMHgwMCwgMHg1NCwgMHhGRiwgMHg4RCwgMHgwMSwgMHgyNiwgMHhGRCwgMHhBRCwgMHgwNCwKKwkweDgyLCAweEY4LCAweDg3LCAweDBFLCAweEY5LCAweDQ2LCAweDBDLCAweEZCLCAweEQ0LCAweDAwLCAweDVELAorCTB4MDAsIDB4NUUsIDB4RkYsIDB4ODIsIDB4MDAsIDB4QkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMywgMHhGQywgMHgwMSwgMHgwNywgMHhCRSwKKwkweEYyLCAweEQ2LCAweDIzLCAweDFGLCAweDNCLCAweEE1LCAweEYyLCAweEM1LCAweDA1LCAweDYyLCAweEZELAorCTB4MTAsIDB4MDEsIDB4QUIsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTksCisJMHgwMCwgMHg4RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHgwNCwgMHhGRCwgMHg0RCwgMHgwNiwgMHgwMCwgMHhGMiwKKwkweEZFLCAweDM3LCAweENCLCAweDI3LCAweDIxLCAweEYyLCAweDIzLCAweDA3LCAweDM0LCAweEZDLCAweERELAorCTB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4Q0UsIDB4RkYsCisJMHg1NiwgMHgwMCwgMHhCOSwgMHhGRiwgMHhCOCwgMHhGRiwgMHhGNywgMHgwMSwgMHhFMiwgMHhGOCwgMHg4RCwKKwkweDQ1LCAweDQ2LCAweDEyLCAweDNDLCAweEY3LCAweDQzLCAweDA1LCAweERGLCAweEZDLCAweEFDLCAweDAxLAorCTB4NDgsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzAsCisJMHhGRiwgMHg0NiwgMHgwMSwgMHhDMywgMHhGRCwgMHg2RCwgMHgwMywgMHgxNCwgMHhGQiwgMHhCRSwgMHgwNywKKwkweEE2LCAweDQ4LCAweEY4LCAweEZGLCAweDcwLCAweEZFLCAweEFFLCAweDAxLCAweEFBLCAweEZFLCAweEQ5LAorCTB4MDAsIDB4OUEsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCisJMHhERSwgMHgwMSwgMHg1RCwgMHhGQywgMHg3NCwgMHgwNiwgMHg2MywgMHhGNCwgMHgyMywgMHgxQywgMHg2NiwKKwkweDQwLCAweEFBLCAweEY0LCAweDY1LCAweDA0LCAweDQ0LCAweEZFLCAweDhCLCAweDAwLCAweEVFLCAweEZGLAorCTB4RjUsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NjEsIDB4RkYsIDB4OUYsCisJMHgwMSwgMHg4MCwgMHhGQywgMHhGNywgMHgwNiwgMHg3RCwgMHhGMSwgMHg1QSwgMHgzMSwgMHgyQywgMHgyRiwKKwkweDgzLCAweEYxLCAweDEzLCAweDA3LCAweDY0LCAweEZDLCAweEIzLCAweDAxLCAweDU3LCAweEZGLCAweDJDLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4NUQsIDB4MDAsCisJMHg5NSwgMHhGRSwgMHhFMiwgMHgwMywgMHg3RiwgMHhGNSwgMHhDQywgMHg0MSwgMHhDNywgMHgxOSwgMHhGRiwKKwkweEY0LCAweDM3LCAweDA2LCAweDc1LCAweEZDLCAweEQ2LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTAsIDB4RkYsIDB4RjQsIDB4MDAsIDB4NzIsIDB4RkUsIDB4MTgsCisJMHgwMiwgMHhBQSwgMHhGRCwgMHhBQiwgMHgwMSwgMHhERiwgMHg0OCwgMHhDQSwgMHgwNSwgMHhFMSwgMHhGQiwKKwkweDA1LCAweDAzLCAweEY3LCAweEZELCAweDJFLCAweDAxLCAweDc5LCAweEZGLCAweDIxLCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDMsIDB4RkYsIDB4QkIsIDB4MDEsIDB4QkEsIDB4RkMsCisJMHg5NSwgMHgwNSwgMHg4MywgMHhGNiwgMHg4QywgMHgxNCwgMHg4NywgMHg0NCwgMHhCQiwgMHhGNywgMHg5OCwKKwkweDAyLCAweDVBLCAweEZGLCAweEVFLCAweEZGLCAweDNDLCAweDAwLCAweEQ4LCAweEZGLCAweDBBLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4RDMsIDB4MDEsIDB4M0MsIDB4RkMsIDB4MkEsCisJMHgwNywgMHhEQywgMHhGMSwgMHgxQSwgMHgyQSwgMHgwNiwgMHgzNiwgMHhCRSwgMHhGMSwgMHg4RSwgMHgwNiwKKwkweEQ1LCAweEZDLCAweDY3LCAweDAxLCAweDdGLCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDAxLAorCTB4MDAsIDB4MDcsIDB4MDAsIDB4QkUsIDB4RkYsIDB4RUEsIDB4MDAsIDB4QTIsIDB4RkQsIDB4NjUsIDB4MDUsCisJMHgyOCwgMHhGMywgMHhEQiwgMHgzQywgMHg3OCwgMHgyMSwgMHgzMCwgMHhGMywgMHhERiwgMHgwNiwgMHgzQSwKKwkweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLAorCTB4QjIsIDB4RkYsIDB4OUQsIDB4MDAsIDB4MjcsIDB4RkYsIDB4QzMsIDB4MDAsIDB4MUYsIDB4MDAsIDB4NzYsCisJMHhGQywgMHhBMywgMHg0NywgMHg2MCwgMHgwQywgMHg0QSwgMHhGOSwgMHg0RSwgMHgwNCwgMHg1MywgMHhGRCwKKwkweDc5LCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLAorCTB4MDAsIDB4NTgsIDB4RkYsIDB4ODIsIDB4MDEsIDB4M0YsIDB4RkQsIDB4NzgsIDB4MDQsIDB4RjIsIDB4RjgsCisJMHg1MCwgMHgwRCwgMHg1RSwgMHg0NywgMHhENSwgMHhGQiwgMHg2RiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg0MCwKKwkweEZGLCAweDkxLCAweDAwLCAweEI3LCAweEZGLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAorCTB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkMsIDB4RUYsIDB4MDYsIDB4RkMsIDB4RjIsIDB4ODEsCisJMHgyMiwgMHgxQywgMHgzQywgMHhFQywgMHhGMiwgMHg5MCwgMHgwNSwgMHg4NSwgMHhGRCwgMHhGQiwgMHgwMCwKKwkweEI2LCAweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDg1LAorCTB4RkYsIDB4NUIsIDB4MDEsIDB4RTksIDB4RkMsIDB4NzMsIDB4MDYsIDB4RDgsIDB4RjEsIDB4RTUsIDB4MzYsCisJMHgxOSwgMHgyOSwgMHhGOCwgMHhGMSwgMHgyOSwgMHgwNywgMHgzNywgMHhGQywgMHhEOCwgMHgwMSwgMHg0MiwKKwkweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQzLCAweEZGLCAweDQ3LCAweDAwLAorCTB4RDcsIDB4RkYsIDB4ODIsIDB4RkYsIDB4NTMsIDB4MDIsIDB4MzksIDB4RjgsIDB4RkQsIDB4NDQsIDB4OEQsCisJMHgxMywgMHhEMywgMHhGNiwgMHg3MiwgMHgwNSwgMHhDQSwgMHhGQywgMHhCNSwgMHgwMSwgMHg0NSwgMHhGRiwKKwkweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDc1LCAweEZGLCAweDM5LAorCTB4MDEsIDB4RTAsIDB4RkQsIDB4MzMsIDB4MDMsIDB4ODcsIDB4RkIsIDB4QTIsIDB4MDYsIDB4Q0IsIDB4NDgsCisJMHhFQSwgMHgwMCwgMHgwMSwgMHhGRSwgMHhFOSwgMHgwMSwgMHg4QSwgMHhGRSwgMHhFOCwgMHgwMCwgMHg5NSwKKwkweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM4LCAweEZGLCAweERBLCAweDAxLAorCTB4NkEsIDB4RkMsIDB4NTMsIDB4MDYsIDB4QkEsIDB4RjQsIDB4Q0UsIDB4MUEsIDB4MzIsIDB4NDEsIDB4MUYsCisJMHhGNSwgMHgxRCwgMHgwNCwgMHg3MSwgMHhGRSwgMHg3MSwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGMCwgMHhGRiwKKwkweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJCLCAweDAwLCAweDVCLCAweEZGLCAweEFCLCAweDAxLCAweDZGLAorCTB4RkMsIDB4MDgsIDB4MDcsIDB4N0UsIDB4RjEsIDB4MjEsIDB4MzAsIDB4NjcsIDB4MzAsIDB4N0QsIDB4RjEsCisJMHgwNSwgMHgwNywgMHg3MywgMHhGQywgMHhBOCwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDA1LCAweDAwLCAweEYyLCAweEZGLCAweEY4LCAweEZGLCAweDc3LCAweDAwLCAweDY3LCAweEZFLAorCTB4MkQsIDB4MDQsIDB4MDQsIDB4RjUsIDB4MDcsIDB4NDEsIDB4MUIsIDB4MUIsIDB4QTYsIDB4RjQsIDB4NUEsCisJMHgwNiwgMHg2NywgMHhGQywgMHhEQiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDFBLCAweDAwLCAweDk2LCAweEZGLCAweEU1LCAweDAwLCAweDkxLCAweEZFLCAweERDLCAweDAxLCAweDFBLAorCTB4RkUsIDB4QjMsIDB4MDAsIDB4QzMsIDB4NDgsIDB4RTEsIDB4MDYsIDB4NkUsIDB4RkIsIDB4NDAsIDB4MDMsCisJMHhEQSwgMHhGRCwgMHgzQywgMHgwMSwgMHg3NCwgMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLCAweEIzLCAweDAxLCAweENGLCAweEZDLCAweDY3LCAweDA1LAorCTB4RUEsIDB4RjYsIDB4NDQsIDB4MTMsIDB4MUUsIDB4NDUsIDB4NUUsIDB4RjgsIDB4M0YsIDB4MDIsIDB4OEUsCisJMHhGRiwgMHhEMCwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMiwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDMzLCAweDAwLCAweDQxLCAweEZGLCAweEQ5LCAweDAxLCAweDM2LCAweEZDLCAweDI4LCAweDA3LCAweDAxLAorCTB4RjIsIDB4Q0UsIDB4MjgsIDB4MjMsIDB4MzcsIDB4RTAsIDB4RjEsIDB4NkIsIDB4MDYsIDB4RUYsIDB4RkMsCisJMHg1NywgMHgwMSwgMHg4NywgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQiwKKwkweDAwLCAweEI0LCAweEZGLCAweDAwLCAweDAxLCAweDdFLCAweEZELCAweDlDLCAweDA1LCAweERDLCAweEYyLAorCTB4RTQsIDB4M0IsIDB4Q0QsIDB4MjIsIDB4RUUsIDB4RjIsIDB4RjMsIDB4MDYsIDB4MzUsIDB4RkMsIDB4RTYsCisJMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCOCwgMHhGRiwKKwkweDhFLCAweDAwLCAweDQ2LCAweEZGLCAweDhBLCAweDAwLCAweDg2LCAweDAwLCAweEE3LCAweEZCLCAweDQ4LAorCTB4NDcsIDB4OTUsIDB4MEQsIDB4RDksIDB4RjgsIDB4ODQsIDB4MDQsIDB4MzksIDB4RkQsIDB4ODUsIDB4MDEsCisJMHg1NywgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RCwKKwkweEZGLCAweDc2LCAweDAxLCAweDU5LCAweEZELCAweDQyLCAweDA0LCAweDYzLCAweEY5LCAweDFDLCAweDBDLAorCTB4QjYsIDB4NDcsIDB4QTQsIDB4RkMsIDB4MDcsIDB4MDAsIDB4RDAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4QTAsCisJMHgwMCwgMHhCMSwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwKKwkweEU2LCAweDAxLCAweDNCLCAweEZDLCAweERBLCAweDA2LCAweDNGLCAweEYzLCAweDJDLCAweDIxLCAweDExLAorCTB4M0QsIDB4M0EsIDB4RjMsIDB4NTgsIDB4MDUsIDB4QUEsIDB4RkQsIDB4RTUsIDB4MDAsIDB4QzEsIDB4RkYsCisJMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRiwgMHgwMCwgMHg3RCwgMHhGRiwgMHg2QiwKKwkweDAxLCAweENGLCAweEZDLCAweDk2LCAweDA2LCAweEI3LCAweEYxLCAweEM2LCAweDM1LCAweDY0LCAweDJBLAorCTB4RDQsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0QsIDB4RkMsIDB4RDIsIDB4MDEsIDB4NDUsIDB4RkYsIDB4MzIsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgzOSwgMHgwMCwgMHhGNCwgMHhGRiwKKwkweDRFLCAweEZGLCAweEFDLCAweDAyLCAweDk4LCAweEY3LCAweDY1LCAweDQ0LCAweEQ2LCAweDE0LCAweDZDLAorCTB4RjYsIDB4OUYsIDB4MDUsIDB4QjYsIDB4RkMsIDB4QkQsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzIsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QSwgMHhGRiwgMHgyQiwgMHgwMSwgMHhGRSwKKwkweEZELCAweEY4LCAweDAyLCAweEZCLCAweEZCLCAweDhELCAweDA1LCAweEU1LCAweDQ4LCAweEUzLCAweDAxLAorCTB4OTEsIDB4RkQsIDB4MjUsIDB4MDIsIDB4NkIsIDB4RkUsIDB4RjcsIDB4MDAsIDB4OEYsIDB4RkYsIDB4MUMsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENSwgMHgwMSwgMHg3OCwgMHhGQywKKwkweDJGLCAweDA2LCAweDEzLCAweEY1LCAweDdDLCAweDE5LCAweEY3LCAweDQxLCAweDlCLCAweEY1LCAweEQxLAorCTB4MDMsIDB4OUYsIDB4RkUsIDB4NTcsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1NSwgMHhGRiwgMHhCNSwgMHgwMSwgMHg2MSwgMHhGQywgMHgxNiwKKwkweDA3LCAweDg1LCAweEYxLCAweEU2LCAweDJFLCAweDlFLCAweDMxLCAweDdELCAweEYxLCAweEYzLCAweDA2LAorCTB4ODQsIDB4RkMsIDB4OUQsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsCisJMHgwMCwgMHhGNiwgMHhGRiwgMHhFQiwgMHhGRiwgMHg5MSwgMHgwMCwgMHgzQiwgMHhGRSwgMHg3NSwgMHgwNCwKKwkweDkyLCAweEY0LCAweDM2LCAweDQwLCAweDZFLCAweDFDLCAweDUwLCAweEY0LCAweDdCLCAweDA2LCAweDVCLAorCTB4RkMsIDB4REYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTgsIDB4MDAsCisJMHg5QywgMHhGRiwgMHhENiwgMHgwMCwgMHhCMSwgMHhGRSwgMHhBMSwgMHgwMSwgMHg4OSwgMHhGRSwgMHhDMywKKwkweEZGLCAweDlDLCAweDQ4LCAweEZELCAweDA3LCAweEZBLCAweEZBLCAweDdBLCAweDAzLCAweEJDLCAweEZELAorCTB4NDksIDB4MDEsIDB4NkUsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsCisJMHgwMCwgMHg0OSwgMHhGRiwgMHhBQSwgMHgwMSwgMHhFNCwgMHhGQywgMHgzOCwgMHgwNSwgMHg1NCwgMHhGNywKKwkweEZFLCAweDExLCAweEFBLCAweDQ1LCAweDA5LCAweEY5LCAweEUyLCAweDAxLCAweEM0LCAweEZGLCAweEIzLAorCTB4RkYsIDB4NTksIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHgzRSwgMHhGRiwgMHhERSwgMHgwMSwgMHgzMywgMHhGQywgMHgyMiwgMHgwNywgMHgyQiwgMHhGMiwgMHg4MCwKKwkweDI3LCAweDNCLCAweDM4LCAweDBBLCAweEYyLCAweDQ0LCAweDA2LCAweDBCLCAweEZELCAweDQ1LCAweDAxLAorCTB4OTAsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QTksCisJMHhGRiwgMHgxNSwgMHgwMSwgMHg1QiwgMHhGRCwgMHhEMCwgMHgwNSwgMHg5NywgMHhGMiwgMHhFNiwgMHgzQSwKKwkweDIxLCAweDI0LCAweEIxLCAweEYyLCAweDA0LCAweDA3LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM5LAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkUsIDB4RkYsIDB4N0YsIDB4MDAsCisJMHg2NSwgMHhGRiwgMHg1MSwgMHgwMCwgMHhFQiwgMHgwMCwgMHhFMSwgMHhGQSwgMHhFMSwgMHg0NiwgMHhDRCwKKwkweDBFLCAweDZBLCAweEY4LCAweEI4LCAweDA0LCAweDIwLCAweEZELCAweDkwLCAweDAxLCAweDUzLCAweEZGLAorCTB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4NjIsIDB4RkYsIDB4NkEsCisJMHgwMSwgMHg3NCwgMHhGRCwgMHgwQSwgMHgwNCwgMHhENSwgMHhGOSwgMHhFRCwgMHgwQSwgMHgwMywgMHg0OCwKKwkweDdDLCAweEZELCAweDlFLCAweEZGLCAweDBBLCAweDAxLCAweDAxLCAweEZGLCAweEFGLCAweDAwLCAweEFCLAorCTB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsCisJMHg0MiwgMHhGQywgMHhDMywgMHgwNiwgMHg4NywgMHhGMywgMHhENywgMHgxRiwgMHhGRSwgMHgzRCwgMHg5MSwKKwkweEYzLCAweDFELCAweDA1LCAweEQxLCAweEZELCAweENFLCAweDAwLCAweENDLCAweEZGLCAweDAyLCAweDAwLAorCTB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4NzUsIDB4RkYsIDB4N0EsIDB4MDEsIDB4QjgsCisJMHhGQywgMHhCNCwgMHgwNiwgMHg5RSwgMHhGMSwgMHhBMiwgMHgzNCwgMHhBRCwgMHgyQiwgMHhCNiwgMHhGMSwKKwkweDI5LCAweDA3LCAweDQ1LCAweEZDLCAweENCLCAweDAxLCAweDQ5LCAweEZGLCAweDMxLCAweDAwLCAweEZELAorCTB4RkYsIDB4MDksIDB4MDAsIDB4REUsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MUIsIDB4RkYsCisJMHgwMiwgMHgwMywgMHhGRSwgMHhGNiwgMHhDMywgMHg0MywgMHgyMiwgMHgxNiwgMHgwNywgMHhGNiwgMHhDQSwKKwkweDA1LCAweEEzLCAweEZDLCAweEM1LCAweDAxLCAweDNGLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4ODAsIDB4RkYsIDB4MUMsIDB4MDEsIDB4MUMsIDB4RkUsIDB4QkQsCisJMHgwMiwgMHg2RSwgMHhGQywgMHg3RCwgMHgwNCwgMHhGMywgMHg0OCwgMHhFMiwgMHgwMiwgMHgxRiwgMHhGRCwKKwkweDYwLCAweDAyLCAweDRDLCAweEZFLCAweDA2LCAweDAxLCAweDg5LCAweEZGLCAweDFELCAweDAwLCAweEZFLAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4Q0YsIDB4MDEsIDB4ODgsIDB4RkMsIDB4MDksIDB4MDYsCisJMHg3MSwgMHhGNSwgMHgyQiwgMHgxOCwgMHhCMiwgMHg0MiwgMHgyMCwgMHhGNiwgMHg4MywgMHgwMywgMHhDRiwKKwkweEZFLCAweDNDLCAweDAwLCAweDE1LCAweDAwLCAweEU2LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLAorCTB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4QkYsIDB4MDEsIDB4NTQsIDB4RkMsIDB4MjAsIDB4MDcsIDB4OTQsCisJMHhGMSwgMHhBNiwgMHgyRCwgMHhEMCwgMHgzMiwgMHg4NSwgMHhGMSwgMHhERCwgMHgwNiwgMHg5NiwgMHhGQywKKwkweDkwLCAweDAxLCAweDY5LCAweEZGLCAweDI2LCAweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZCLAorCTB4RkYsIDB4REYsIDB4RkYsIDB4QTksIDB4MDAsIDB4MTAsIDB4RkUsIDB4QjksIDB4MDQsIDB4MjcsIDB4RjQsCisJMHg1RSwgMHgzRiwgMHhDMywgMHgxRCwgMHhGRSwgMHhGMywgMHg5OSwgMHgwNiwgMHg1MCwgMHhGQywgMHhFMiwKKwkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LCAweDAwLCAweEEyLCAweEZGLAorCTB4QzcsIDB4MDAsIDB4RDAsIDB4RkUsIDB4NjUsIDB4MDEsIDB4RjYsIDB4RkUsIDB4RDksIDB4RkUsIDB4NkEsCisJMHg0OCwgMHgxRiwgMHgwOSwgMHg4NywgMHhGQSwgMHhCMywgMHgwMywgMHhBMCwgMHhGRCwgMHg1NiwgMHgwMSwKKwkweDY5LCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRELAorCTB4RkYsIDB4QTAsIDB4MDEsIDB4RkIsIDB4RkMsIDB4MDcsIDB4MDUsIDB4QkYsIDB4RjcsIDB4QkIsIDB4MTAsCisJMHgyQiwgMHg0NiwgMHhCQiwgMHhGOSwgMHg4MywgMHgwMSwgMHhGQSwgMHhGRiwgMHg5NSwgMHhGRiwgMHg2OCwKKwkweDAwLCAweEM3LCAweEZGLCAweDBFLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLAorCTB4RTEsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTksIDB4MDcsIDB4NUIsIDB4RjIsIDB4MzAsIDB4MjYsIDB4NEIsCisJMHgzOSwgMHgzQiwgMHhGMiwgMHgxQSwgMHgwNiwgMHgyOSwgMHhGRCwgMHgzMywgMHgwMSwgMHg5OSwgMHhGRiwKKwkweDE1LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDlGLCAweEZGLCAweDI4LAorCTB4MDEsIDB4M0EsIDB4RkQsIDB4MDAsIDB4MDYsIDB4NUEsIDB4RjIsIDB4REYsIDB4MzksIDB4NzMsIDB4MjUsCisJMHg3OSwgMHhGMiwgMHgxMiwgMHgwNywgMHgzMSwgMHhGQywgMHhFMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwKKwkweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEM0LCAweEZGLCAweDcwLCAweDAwLCAweDg0LCAweEZGLAorCTB4MTksIDB4MDAsIDB4NEQsIDB4MDEsIDB4MjIsIDB4RkEsIDB4NzAsIDB4NDYsIDB4MEEsIDB4MTAsIDB4RkMsCisJMHhGNywgMHhFQiwgMHgwNCwgMHgwOCwgMHhGRCwgMHg5QSwgMHgwMSwgMHg0RiwgMHhGRiwgMHgyRSwgMHgwMCwKKwkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDVFLCAweDAxLCAweDkwLAorCTB4RkQsIDB4RDIsIDB4MDMsIDB4NDcsIDB4RkEsIDB4QzMsIDB4MDksIDB4NDgsIDB4NDgsIDB4NUEsIDB4RkUsCisJMHgzMywgMHhGRiwgMHg0NSwgMHgwMSwgMHhFMiwgMHhGRSwgMHhCRSwgMHgwMCwgMHhBNSwgMHhGRiwgMHgxNiwKKwkweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRCLCAweEZDLAorCTB4QTksIDB4MDYsIDB4RDIsIDB4RjMsIDB4ODEsIDB4MUUsIDB4RTQsIDB4M0UsIDB4RUYsIDB4RjMsIDB4REUsCisJMHgwNCwgMHhGOSwgMHhGRCwgMHhCNywgMHgwMCwgMHhEOCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwKKwkweEZELCAweEZGLCAweDI0LCAweDAwLCAweDZELCAweEZGLCAweDg4LCAweDAxLCAweEEyLCAweEZDLCAweEQwLAorCTB4MDYsIDB4OEMsIDB4RjEsIDB4NzgsIDB4MzMsIDB4RjIsIDB4MkMsIDB4OUUsIDB4RjEsIDB4MjQsIDB4MDcsCisJMHg0RSwgMHhGQywgMHhDMywgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwKKwkweDAwLCAweEU0LCAweEZGLCAweDFELCAweDAwLCAweDJELCAweDAwLCAweEVBLCAweEZFLCAweDU2LCAweDAzLAorCTB4NkQsIDB4RjYsIDB4MTcsIDB4NDMsIDB4NzAsIDB4MTcsIDB4QTYsIDB4RjUsIDB4RjMsIDB4MDUsIDB4OTEsCisJMHhGQywgMHhDQywgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwKKwkweDg2LCAweEZGLCAweDBFLCAweDAxLCAweDNCLCAweEZFLCAweDgyLCAweDAyLCAweEUwLCAweEZDLCAweDczLAorCTB4MDMsIDB4RjYsIDB4NDgsIDB4RTksIDB4MDMsIDB4QUQsIDB4RkMsIDB4OUMsIDB4MDIsIDB4MkQsIDB4RkUsCisJMHgxNCwgMHgwMSwgMHg4MywgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywKKwkweDAwLCAweDNFLCAweEZGLCAweEM5LCAweDAxLCAweDk5LCAweEZDLCAweEUxLCAweDA1LCAweEQxLCAweEY1LAorCTB4REMsIDB4MTYsIDB4NjUsIDB4NDMsIDB4QUQsIDB4RjYsIDB4MzEsIDB4MDMsIDB4MDAsIDB4RkYsIDB4MjAsCisJMHgwMCwgMHgyMywgMHgwMCwgMHhFMSwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwKKwkweDRDLCAweEZGLCAweEM3LCAweDAxLCAweDRBLCAweEZDLCAweDI3LCAweDA3LCAweEE4LCAweEYxLCAweDYyLAorCTB4MkMsIDB4RkQsIDB4MzMsIDB4OTMsIDB4RjEsIDB4QzQsIDB4MDYsIDB4QUIsIDB4RkMsIDB4ODIsIDB4MDEsCisJMHg3MSwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhEMywKKwkweEZGLCAweEMxLCAweDAwLCAweEU3LCAweEZELCAweEZBLCAweDA0LCAweEM0LCAweEYzLCAweDdFLCAweDNFLAorCTB4MTksIDB4MUYsIDB4QjAsIDB4RjMsIDB4QjUsIDB4MDYsIDB4NDcsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOCwgMHhGRiwgMHhCOCwgMHgwMCwKKwkweEYwLCAweEZFLCAweDJCLCAweDAxLCAweDYzLCAweEZGLCAweEY2LCAweEZELCAweDJDLCAweDQ4LCAweDQ3LAorCTB4MEEsIDB4MTQsIDB4RkEsIDB4RUIsIDB4MDMsIDB4ODQsIDB4RkQsIDB4NjMsIDB4MDEsIDB4NjQsIDB4RkYsCisJMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MSwgMHhGRiwgMHg5NiwKKwkweDAxLCAweDEzLCAweEZELCAweEQ1LCAweDA0LCAweDJDLCAweEY4LCAweDdELCAweDBGLCAweEEzLCAweDQ2LAorCTB4NzYsIDB4RkEsIDB4MjIsIDB4MDEsIDB4MzIsIDB4MDAsIDB4NzYsIDB4RkYsIDB4NzYsIDB4MDAsIDB4QzEsCisJMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzQSwgMHhGRiwgMHhFNCwgMHgwMSwKKwkweDMyLCAweEZDLCAweDBDLCAweDA3LCAweDkxLCAweEYyLCAweERELCAweDI0LCAweDU0LCAweDNBLCAweDc0LAorCTB4RjIsIDB4RUIsIDB4MDUsIDB4NDksIDB4RkQsIDB4MjAsIDB4MDEsIDB4QTMsIDB4RkYsIDB4MTEsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHg5NSwgMHhGRiwgMHgzQiwgMHgwMSwgMHgxQiwKKwkweEZELCAweDJELCAweDA2LCAweDI0LCAweEYyLCAweEQzLCAweDM4LCAweEM2LCAweDI2LCAweDQ1LCAweEYyLAorCTB4MUQsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTAsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwRCwgMHgwMCwgMHhDOSwgMHhGRiwgMHg2MSwgMHgwMCwgMHhBMiwgMHhGRiwgMHhFMiwgMHhGRiwKKwkweEFFLCAweDAxLCAweDZCLCAweEY5LCAweEYyLCAweDQ1LCAweDRBLCAweDExLCAweDhGLCAweEY3LCAweDFELAorCTB4MDUsIDB4RjEsIDB4RkMsIDB4QTQsIDB4MDEsIDB4NEIsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QywgMHhGRiwgMHg1MSwgMHgwMSwgMHhBQywgMHhGRCwgMHg5QSwKKwkweDAzLCAweEJBLCAweEZBLCAweDlFLCAweDA4LCAweDgxLCAweDQ4LCAweDQwLCAweEZGLCAweEM2LCAweEZFLAorCTB4ODAsIDB4MDEsIDB4QzIsIDB4RkUsIDB4Q0UsIDB4MDAsIDB4OUYsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMSwgMHgwMSwgMHg1NSwgMHhGQywgMHg4QywgMHgwNiwKKwkweDIyLCAweEY0LCAweDJDLCAweDFELCAweEMwLCAweDNGLCAweDU1LCAweEY0LCAweDlCLCAweDA0LCAweDIzLAorCTB4RkUsIDB4OUYsIDB4MDAsIDB4RTQsIDB4RkYsIDB4RjksIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwgMHg5NiwgMHgwMSwgMHg4RSwgMHhGQywgMHhFNywgMHgwNiwgMHg4MSwKKwkweEYxLCAweDQ4LCAweDMyLCAweDM0LCAweDJFLCAweDhELCAweEYxLCAweDFDLCAweDA3LCAweDVBLCAweEZDLAorCTB4QkIsIDB4MDEsIDB4NTMsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTksCisJMHhGRiwgMHgwRiwgMHgwMCwgMHg0OCwgMHgwMCwgMHhCOSwgMHhGRSwgMHhBNiwgMHgwMywgMHhFNCwgMHhGNSwKKwkweDYwLCAweDQyLCAweEMxLCAweDE4LCAweDQ3LCAweEY1LCAweDFBLCAweDA2LCAweDgxLCAweEZDLCAweEQyLAorCTB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEIsIDB4RkYsCisJMHhGRiwgMHgwMCwgMHg1QSwgMHhGRSwgMHg0NiwgMHgwMiwgMHg1MiwgMHhGRCwgMHg3MCwgMHgwMiwgMHhFRCwKKwkweDQ4LCAweEY1LCAweDA0LCAweDNCLCAweEZDLCAweEQ3LCAweDAyLCAweDBGLCAweEZFLCAweDIzLCAweDAxLAorCTB4N0UsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsCisJMHhGRiwgMHhDMSwgMHgwMSwgMHhBQiwgMHhGQywgMHhCNywgMHgwNSwgMHgzNCwgMHhGNiwgMHg4RSwgMHgxNSwKKwkweDBCLCAweDQ0LCAweDQyLCAweEY3LCAweERDLCAweDAyLCAweDMyLCAweEZGLCAweDA0LCAweDAwLCAweDMxLAorCTB4MDAsIDB4REMsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDcsIDB4RkYsCisJMHhDRSwgMHgwMSwgMHg0MSwgMHhGQywgMHgyQSwgMHgwNywgMHhDMiwgMHhGMSwgMHgxQiwgMHgyQiwgMHgyNSwKKwkweDM1LCAweEE4LCAweEYxLCAweEE3LCAweDA2LCAweEMyLCAweEZDLCAweDc0LCAweDAxLCAweDc4LCAweEZGLAorCTB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsIDB4QzcsIDB4RkYsIDB4RDksCisJMHgwMCwgMHhCRiwgMHhGRCwgMHgzOCwgMHgwNSwgMHg2OSwgMHhGMywgMHg5NiwgMHgzRCwgMHg2RiwgMHgyMCwKKwkweDY2LCAweEYzLCAweENFLCAweDA2LCAweDNGLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUUsIDB4RkYsIDB4QTksIDB4MDAsIDB4MEYsIDB4RkYsCisJMHhGMCwgMHgwMCwgMHhDRCwgMHhGRiwgMHgxQiwgMHhGRCwgMHhFNCwgMHg0NywgMHg3MywgMHgwQiwgMHhBMiwKKwkweEY5LCAweDIzLCAweDA0LCAweDY4LCAweEZELCAweDcwLCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTUsIDB4RkYsIDB4OEIsIDB4MDEsIDB4MkIsCisJMHhGRCwgMHhBMSwgMHgwNCwgMHg5QiwgMHhGOCwgMHg0MiwgMHgwRSwgMHgwRiwgMHg0NywgMHgzOCwgMHhGQiwKKwkweEJFLCAweDAwLCAweDZBLCAweDAwLCAweDU4LCAweEZGLCAweDg1LCAweDAwLCAweEJCLCAweEZGLCAweDEwLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzQsIDB4RkMsCisJMHhGRCwgMHgwNiwgMHhDQiwgMHhGMiwgMHg4QSwgMHgyMywgMHg1OCwgMHgzQiwgMHhCNCwgMHhGMiwgMHhCQSwKKwkweDA1LCAweDZBLCAweEZELCAweDBCLCAweDAxLCAweEFFLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MTksIDB4MDAsIDB4OEMsIDB4RkYsIDB4NEQsIDB4MDEsIDB4RkUsIDB4RkMsIDB4NTYsCisJMHgwNiwgMHhGNywgMHhGMSwgMHhCRiwgMHgzNywgMHgxNSwgMHgyOCwgMHgxOCwgMHhGMiwgMHgyNSwgMHgwNywKKwkweDM0LCAweEZDLCAweERDLCAweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLAorCTB4MDAsIDB4Q0YsIDB4RkYsIDB4NTIsIDB4MDAsIDB4QzAsIDB4RkYsIDB4QUMsIDB4RkYsIDB4MEMsIDB4MDIsCisJMHhCQywgMHhGOCwgMHg2RCwgMHg0NSwgMHg4RSwgMHgxMiwgMHgyNCwgMHhGNywgMHg0RCwgMHgwNSwgMHhEQiwKKwkweEZDLCAweEFFLCAweDAxLCAweDQ4LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorCTB4MjQsIDB4MDAsIDB4NzEsIDB4RkYsIDB4NDMsIDB4MDEsIDB4QzksIDB4RkQsIDB4NjAsIDB4MDMsIDB4MkUsCisJMHhGQiwgMHg3RSwgMHgwNywgMHhBRiwgMHg0OCwgMHgyRCwgMHgwMCwgMHg1OCwgMHhGRSwgMHhCQiwgMHgwMSwKKwkweEEzLCAweEZFLCAweERELCAweDAwLCAweDk5LCAweEZGLCAweDE5LCAweDAwLCAweEZFLCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzcsIDB4RkYsIDB4REQsIDB4MDEsIDB4NjAsIDB4RkMsIDB4NkQsIDB4MDYsIDB4NzYsIDB4RjQsCisJMHhEOCwgMHgxQiwgMHg5NSwgMHg0MCwgMHhDMywgMHhGNCwgMHg1NiwgMHgwNCwgMHg0RSwgMHhGRSwgMHg4NSwKKwkweDAwLCAweEYxLCAweEZGLCAweEY0LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI5LCAweDAwLAorCTB4NjAsIDB4RkYsIDB4QTIsIDB4MDEsIDB4N0MsIDB4RkMsIDB4RkIsIDB4MDYsIDB4N0MsIDB4RjEsIDB4MTUsCisJMHgzMSwgMHg3MywgMHgyRiwgMHg4MSwgMHhGMSwgMHgxMCwgMHgwNywgMHg2NywgMHhGQywgMHhCMSwgMHgwMSwKKwkweDU4LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVFLCAweEZGLCAweDAyLAorCTB4MDAsIDB4NjMsIDB4MDAsIDB4OEEsIDB4RkUsIDB4RjMsIDB4MDMsIDB4NjMsIDB4RjUsIDB4QTEsIDB4NDEsCisJMHgxMiwgMHgxQSwgMHhFQiwgMHhGNCwgMHgzRiwgMHgwNiwgMHg3MiwgMHhGQywgMHhENywgMHgwMSwgMHgzOSwKKwkweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDkxLCAweEZGLCAweEYxLCAweDAwLAorCTB4NzksIDB4RkUsIDB4MEEsIDB4MDIsIDB4QzMsIDB4RkQsIDB4NzMsIDB4MDEsIDB4REIsIDB4NDgsIDB4MDcsCisJMHgwNiwgMHhDNywgMHhGQiwgMHgxMiwgMHgwMywgMHhGMSwgMHhGRCwgMHgzMSwgMHgwMSwgMHg3OCwgMHhGRiwKKwkweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQzLCAweEZGLCAweEJBLAorCTB4MDEsIDB4QkYsIDB4RkMsIDB4OEIsIDB4MDUsIDB4OTksIDB4RjYsIDB4NDMsIDB4MTQsIDB4QTksIDB4NDQsCisJMHhERSwgMHhGNywgMHg4NSwgMHgwMiwgMHg2NSwgMHhGRiwgMHhFNywgMHhGRiwgMHgzRiwgMHgwMCwgMHhENiwKKwkweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEQ1LCAweDAxLAorCTB4M0EsIDB4RkMsIDB4MkEsIDB4MDcsIDB4RTMsIDB4RjEsIDB4RDEsIDB4MjksIDB4NDYsIDB4MzYsIDB4QzUsCisJMHhGMSwgMHg4NywgMHgwNiwgMHhEQSwgMHhGQywgMHg2NCwgMHgwMSwgMHg4MCwgMHhGRiwgMHgxRSwgMHgwMCwKKwkweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweEJDLCAweEZGLCAweEVGLCAweDAwLCAweDlBLAorCTB4RkQsIDB4NzIsIDB4MDUsIDB4MTYsIDB4RjMsIDB4QTUsIDB4M0MsIDB4QzQsIDB4MjEsIDB4MjEsIDB4RjMsCisJMHhFNCwgMHgwNiwgMHgzOSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDEyLCAweDAwLCAweEIzLCAweEZGLCAweDk5LCAweDAwLCAweDJFLCAweEZGLCAweEI2LCAweDAwLAorCTB4MzYsIDB4MDAsIDB4NDcsIDB4RkMsIDB4OTAsIDB4NDcsIDB4QTQsIDB4MEMsIDB4MzEsIDB4RjksIDB4NUEsCisJMHgwNCwgMHg0RSwgMHhGRCwgMHg3QywgMHgwMSwgMHg1QiwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU5LCAweEZGLCAweDgwLCAweDAxLCAweDQ1LCAweEZELCAweDZDLAorCTB4MDQsIDB4MEIsIDB4RjksIDB4MEIsIDB4MEQsIDB4NzMsIDB4NDcsIDB4MDIsIDB4RkMsIDB4NTgsIDB4MDAsCisJMHhBMywgMHgwMCwgMHgzOSwgMHhGRiwgMHg5NCwgMHgwMCwgMHhCNSwgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM3LCAweEZDLCAweEVCLCAweDA2LAorCTB4MEIsIDB4RjMsIDB4MzUsIDB4MjIsIDB4NTIsIDB4M0MsIDB4RkQsIDB4RjIsIDB4ODQsIDB4MDUsIDB4OEQsCisJMHhGRCwgMHhGNiwgMHgwMCwgMHhCOCwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDFELCAweDAwLCAweDgzLCAweEZGLCAweDVFLCAweDAxLCAweEUzLCAweEZDLCAweDdCLCAweDA2LCAweEQwLAorCTB4RjEsIDB4QTUsIDB4MzYsIDB4NjIsIDB4MjksIDB4RUYsIDB4RjEsIDB4MjksIDB4MDcsIDB4MzksIDB4RkMsCisJMHhENywgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhENSwKKwkweEZGLCAweDQ0LCAweDAwLCAweERELCAweEZGLCAweDc3LCAweEZGLCAweDY3LCAweDAyLCAweDE0LCAweEY4LAorCTB4REMsIDB4NDQsIDB4RDUsIDB4MTMsIDB4QkMsIDB4RjYsIDB4N0MsIDB4MDUsIDB4QzUsIDB4RkMsIDB4QjcsCisJMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwKKwkweDc2LCAweEZGLCAweDM1LCAweDAxLCAweEU3LCAweEZELCAweDI2LCAweDAzLCAweEExLCAweEZCLCAweDY0LAorCTB4MDYsIDB4RDIsIDB4NDgsIDB4MjEsIDB4MDEsIDB4RTgsIDB4RkQsIDB4RjcsIDB4MDEsIDB4ODMsIDB4RkUsCisJMHhFQywgMHgwMCwgMHg5MywgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwKKwkweEZGLCAweEQ5LCAweDAxLCAweDZELCAweEZDLCAweDRCLCAweDA2LCAweENELCAweEY0LCAweDgzLCAweDFBLAorCTB4NUYsIDB4NDEsIDB4M0EsIDB4RjUsIDB4MEMsIDB4MDQsIDB4N0IsIDB4RkUsIDB4NkMsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHhFRiwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwgMHgwMCwgMHg1QSwgMHhGRiwKKwkweEFELCAweDAxLCAweDZDLCAweEZDLCAweDBDLCAweDA3LCAweDdGLCAweEYxLCAweERDLCAweDJGLCAweEFELAorCTB4MzAsIDB4N0QsIDB4RjEsIDB4MDEsIDB4MDcsIDB4NzYsIDB4RkMsIDB4QTYsIDB4MDEsIDB4NUUsIDB4RkYsCisJMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGMywgMHhGRiwgMHhGNSwgMHhGRiwgMHg3RCwKKwkweDAwLCAweDVELCAweEZFLCAweDNFLCAweDA0LCAweEVBLCAweEY0LCAweEQ5LCAweDQwLCAweDY2LCAweDFCLAorCTB4OTMsIDB4RjQsIDB4NjIsIDB4MDYsIDB4NjQsIDB4RkMsIDB4REMsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5NywgMHhGRiwgMHhFMiwgMHgwMCwgMHg5OCwgMHhGRSwKKwkweENGLCAweDAxLCAweDMzLCAweEZFLCAweDdELCAweDAwLCAweEJCLCAweDQ4LCAweDFGLCAweDA3LCAweDU0LAorCTB4RkIsIDB4NEMsIDB4MDMsIDB4RDMsIDB4RkQsIDB4M0YsIDB4MDEsIDB4NzMsIDB4RkYsIDB4MjMsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NiwgMHhGRiwgMHhCMSwgMHgwMSwgMHhEMywKKwkweEZDLCAweDVELCAweDA1LCAweDAxLCAweEY3LCAweEZCLCAweDEyLCAweDNGLCAweDQ1LCAweDgzLCAweEY4LAorCTB4MkEsIDB4MDIsIDB4OUEsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4NEUsIDB4MDAsIDB4RDEsIDB4RkYsIDB4MEMsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHg0MCwgMHhGRiwgMHhEQSwgMHgwMSwgMHgzNSwgMHhGQywKKwkweDI3LCAweDA3LCAweDA5LCAweEYyLCAweDg1LCAweDI4LCAweDYzLCAweDM3LCAweEU5LCAweEYxLCAweDYzLAorCTB4MDYsIDB4RjUsIDB4RkMsIDB4NTMsIDB4MDEsIDB4ODksIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhCMSwgMHhGRiwgMHgwNCwgMHgwMSwgMHg3NiwgMHhGRCwgMHhBOCwKKwkweDA1LCAweENDLCAweEYyLCAweEFCLCAweDNCLCAweDE4LCAweDIzLCAweEUwLCAweEYyLCAweEY3LCAweDA2LAorCTB4MzUsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTEsCisJMHgwMCwgMHhCOSwgMHhGRiwgMHg4QSwgMHgwMCwgMHg0RCwgMHhGRiwgMHg3RCwgMHgwMCwgMHg5QywgMHgwMCwKKwkweDdCLCAweEZCLCAweDMxLCAweDQ3LCAweEQ5LCAweDBELCAweEMwLCAweEY4LCAweDhGLCAweDA0LCAweDM0LAorCTB4RkQsIDB4ODcsIDB4MDEsIDB4NTYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgyOSwgMHgwMCwgMHg1RSwgMHhGRiwgMHg3NCwgMHgwMSwgMHg1RiwgMHhGRCwgMHgzNSwgMHgwNCwgMHg3QywKKwkweEY5LCAweEQ4LCAweDBCLCAweEM5LCAweDQ3LCAweEQ0LCAweEZDLCAweEYwLCAweEZGLCAweERELCAweDAwLAorCTB4MTksIDB4RkYsIDB4QTQsIDB4MDAsIDB4QUYsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRCwgMHhGQywgMHhENSwgMHgwNiwgMHg0RiwgMHhGMywKKwkweEUwLCAweDIwLCAweDQ1LCAweDNELCAweDRELCAweEYzLCAweDRCLCAweDA1LCAweEIzLCAweEZELCAweEUwLAorCTB4MDAsIDB4QzMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjAsIDB4MDAsCisJMHg3QiwgMHhGRiwgMHg2RSwgMHgwMSwgMHhDQSwgMHhGQywgMHg5RCwgMHgwNiwgMHhCMSwgMHhGMSwgMHg4NiwKKwkweDM1LCAweEFFLCAweDJBLCAweENELCAweEYxLCAweDJCLCAweDA3LCAweDNGLCAweEZDLCAweEQxLCAweDAxLAorCTB4NDYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4REEsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGQSwgMHhGRiwgMHg0MywgMHhGRiwgMHhCRiwgMHgwMiwgMHg3NSwgMHhGNywgMHg0MiwgMHg0NCwKKwkweDIwLCAweDE1LCAweDU1LCAweEY2LCAweEE5LCAweDA1LCAweEIyLCAweEZDLCAweEJGLCAweDAxLCAweDQxLAorCTB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0MsIDB4RkYsCisJMHgyNywgMHgwMSwgMHgwNSwgMHhGRSwgMHhFQiwgMHgwMiwgMHgxNCwgMHhGQywgMHg1MCwgMHgwNSwgMHhFQSwKKwkweDQ4LCAweDFCLCAweDAyLCAweDc4LCAweEZELCAweDMyLCAweDAyLCAweDY0LCAweEZFLCAweEZBLCAweDAwLAorCTB4OEQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDQsCisJMHgwMSwgMHg3QywgMHhGQywgMHgyNywgMHgwNiwgMHgyOCwgMHhGNSwgMHgzMSwgMHgxOSwgMHgyMSwgMHg0MiwKKwkweEI4LCAweEY1LCAweEMwLCAweDAzLCAweEFBLCAweEZFLCAweDUxLCAweDAwLCAweDBCLCAweDAwLCAweEVBLAorCTB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTQsIDB4RkYsIDB4QjcsIDB4MDEsCisJMHg1RSwgMHhGQywgMHgxOSwgMHgwNywgMHg4OCwgMHhGMSwgMHg5RiwgMHgyRSwgMHhFMywgMHgzMSwgMHg3RSwKKwkweEYxLCAweEVFLCAweDA2LCAweDg4LCAweEZDLCAweDlBLCAweDAxLCAweDY0LCAweEZGLCAweDI4LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RTgsIDB4RkYsIDB4OTYsIDB4MDAsIDB4MzEsCisJMHhGRSwgMHg4NCwgMHgwNCwgMHg3OSwgMHhGNCwgMHgwNywgMHg0MCwgMHhCQSwgMHgxQywgMHgzRSwgMHhGNCwKKwkweDgyLCAweDA2LCAweDU4LCAweEZDLCAweEUwLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAorCTB4RkYsIDB4MTgsIDB4MDAsIDB4OUQsIDB4RkYsIDB4RDMsIDB4MDAsIDB4QjgsIDB4RkUsIDB4OTMsIDB4MDEsCisJMHhBMSwgMHhGRSwgMHg4RSwgMHhGRiwgMHg5MiwgMHg0OCwgMHgzRCwgMHgwOCwgMHhFMSwgMHhGQSwgMHg4NiwKKwkweDAzLCAweEI2LCAweEZELCAweDRDLCAweDAxLCAweDZELCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsIDB4QTgsIDB4MDEsIDB4RTksIDB4RkMsIDB4MkQsCisJMHgwNSwgMHg2QiwgMHhGNywgMHhCNiwgMHgxMSwgMHhDOCwgMHg0NSwgMHgzMCwgMHhGOSwgMHhDRCwgMHgwMSwKKwkweEQwLCAweEZGLCAweEFDLCAweEZGLCAweDVDLCAweDAwLCAweENCLCAweEZGLCAweDBELCAweDAwLCAweEZELAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4REYsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjAsIDB4MDcsCisJMHgzNSwgMHhGMiwgMHgzNiwgMHgyNywgMHg3OCwgMHgzOCwgMHgxNCwgMHhGMiwgMHgzQiwgMHgwNiwgMHgxMSwKKwkweEZELCAweDQxLCAweDAxLCAweDkyLCAweEZGLCAweDE3LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorCTB4MTAsIDB4MDAsIDB4QTcsIDB4RkYsIDB4MTksIDB4MDEsIDB4NTMsIDB4RkQsIDB4REIsIDB4MDUsIDB4ODgsCisJMHhGMiwgMHhBRCwgMHgzQSwgMHg2RCwgMHgyNCwgMHhBNCwgMHhGMiwgMHgwOCwgMHgwNywgMHgzMiwgMHhGQywKKwkweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJGLAorCTB4RkYsIDB4N0IsIDB4MDAsIDB4NkMsIDB4RkYsIDB4NDQsIDB4MDAsIDB4MDEsIDB4MDEsIDB4QjYsIDB4RkEsCisJMHhDOCwgMHg0NiwgMHgxMywgMHgwRiwgMHg1MSwgMHhGOCwgMHhDNCwgMHgwNCwgMHgxQiwgMHhGRCwgMHg5MiwKKwkweDAxLCAweDUyLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLAorCTB4NjMsIDB4RkYsIDB4NjcsIDB4MDEsIDB4N0EsIDB4RkQsIDB4RkUsIDB4MDMsIDB4RUUsIDB4RjksIDB4QUEsCisJMHgwQSwgMHgxNiwgMHg0OCwgMHhBQywgMHhGRCwgMHg4NiwgMHhGRiwgMHgxNywgMHgwMSwgMHhGQSwgMHhGRSwKKwkweEIzLCAweDAwLCAweEFBLCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LAorCTB4RkYsIDB4RTUsIDB4MDEsIDB4NDQsIDB4RkMsIDB4QkQsIDB4MDYsIDB4OTcsIDB4RjMsIDB4OEEsIDB4MUYsCisJMHgzMSwgMHgzRSwgMHhBNSwgMHhGMywgMHgwRiwgMHgwNSwgMHhEQSwgMHhGRCwgMHhDOSwgMHgwMCwgMHhDRiwKKwkweEZGLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIyLCAweDAwLCAweDczLCAweEZGLAorCTB4N0QsIDB4MDEsIDB4QjMsIDB4RkMsIDB4QkIsIDB4MDYsIDB4OUEsIDB4RjEsIDB4NjAsIDB4MzQsIDB4RjUsCisJMHgyQiwgMHhCMCwgMHhGMSwgMHgyOCwgMHgwNywgMHg0NywgMHhGQywgMHhDQSwgMHgwMSwgMHg0QSwgMHhGRiwKKwkweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERGLCAweEZGLCAweDI4LCAweDAwLCAweDE3LAorCTB4MDAsIDB4MTAsIDB4RkYsIDB4MTUsIDB4MDMsIDB4REQsIDB4RjYsIDB4OUUsIDB4NDMsIDB4NkMsIDB4MTYsCisJMHhGMSwgMHhGNSwgMHhEMywgMHgwNSwgMHg5RiwgMHhGQywgMHhDNiwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywKKwkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgxLCAweEZGLCAweDE5LCAweDAxLAorCTB4MjMsIDB4RkUsIDB4QjAsIDB4MDIsIDB4ODcsIDB4RkMsIDB4NDEsIDB4MDQsIDB4RjQsIDB4NDgsIDB4MUMsCisJMHgwMywgMHgwNiwgMHhGRCwgMHg2RSwgMHgwMiwgMHg0NSwgMHhGRSwgMHgwOSwgMHgwMSwgMHg4OCwgMHhGRiwKKwkweDFELCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLCAweENFLCAweDAxLCAweDhDLAorCTB4RkMsIDB4MDAsIDB4MDYsIDB4ODYsIDB4RjUsIDB4RTAsIDB4MTcsIDB4REIsIDB4NDIsIDB4M0YsIDB4RjYsCisJMHg3MSwgMHgwMywgMHhEOSwgMHhGRSwgMHgzNiwgMHgwMCwgMHgxOCwgMHgwMCwgMHhFNSwgMHhGRiwgMHgwNywKKwkweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLCAweDRGLCAweEZGLCAweEMxLCAweDAxLCAweDUyLCAweEZDLAorCTB4MjIsIDB4MDcsIDB4OTgsIDB4RjEsIDB4NUUsIDB4MkQsIDB4MTMsIDB4MzMsIDB4ODcsIDB4RjEsIDB4RDgsCisJMHgwNiwgMHg5QiwgMHhGQywgMHg4RCwgMHgwMSwgMHg2QiwgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDAzLCAweDAwLCAweEZDLCAweEZGLCAweERDLCAweEZGLCAweEFGLCAweDAwLCAweDA3LCAweEZFLCAweEM4LAorCTB4MDQsIDB4MTAsIDB4RjQsIDB4MkQsIDB4M0YsIDB4MEYsIDB4MUUsIDB4RUQsIDB4RjMsIDB4QTAsIDB4MDYsCisJMHg0RSwgMHhGQywgMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNiwKKwkweDAwLCAweEEzLCAweEZGLCAweEMzLCAweDAwLCAweEQ3LCAweEZFLCAweDU4LCAweDAxLCAweDBGLCAweEZGLAorCTB4QTYsIDB4RkUsIDB4NUQsIDB4NDgsIDB4NjEsIDB4MDksIDB4NkUsIDB4RkEsIDB4QzAsIDB4MDMsIDB4OTksCisJMHhGRCwgMHg1OSwgMHgwMSwgMHg2OCwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlFLCAweDAxLCAweDAwLCAweEZELCAweEZDLCAweDA0LCAweEQ3LAorCTB4RjcsIDB4NzUsIDB4MTAsIDB4NDgsIDB4NDYsIDB4RTQsIDB4RjksIDB4NkUsIDB4MDEsIDB4MDYsIDB4MDAsCisJMHg4RSwgMHhGRiwgMHg2QiwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwKKwkweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE2LCAweDA3LCAweDY3LCAweEYyLAorCTB4RTUsIDB4MjUsIDB4ODcsIDB4MzksIDB4NDcsIDB4RjIsIDB4MTAsIDB4MDYsIDB4MzAsIDB4RkQsIDB4MkYsCisJMHgwMSwgMHg5QywgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMCwKKwkweDlELCAweEZGLCAweDJELCAweDAxLCAweDMzLCAweEZELCAweDBCLCAweDA2LCAweDRELCAweEYyLCAweEE1LAorCTB4MzksIDB4QkYsIDB4MjUsIDB4NkQsIDB4RjIsIDB4MTUsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsCisJMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwgMHhDNSwgMHhGRiwgMHg2RCwKKwkweDAwLCAweDhCLCAweEZGLCAweDBELCAweDAwLCAweDYzLCAweDAxLCAweEY5LCAweEY5LCAweDU1LCAweDQ2LAorCTB4NTEsIDB4MTAsIDB4RTMsIDB4RjcsIDB4RjcsIDB4MDQsIDB4MDMsIDB4RkQsIDB4OUQsIDB4MDEsIDB4NEUsCisJMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OCwgMHhGRiwKKwkweDVCLCAweDAxLCAweDk2LCAweEZELCAweEM2LCAweDAzLCAweDYxLCAweEZBLCAweDgxLCAweDA5LCAweDU3LAorCTB4NDgsIDB4OEQsIDB4RkUsIDB4MUIsIDB4RkYsIDB4NTIsIDB4MDEsIDB4REIsIDB4RkUsIDB4QzIsIDB4MDAsCisJMHhBNCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMywKKwkweDAxLCAweDRELCAweEZDLCAweEEzLCAweDA2LCAweEU0LCAweEYzLCAweDM2LCAweDFFLCAweDE2LCAweDNGLAorCTB4MDUsIDB4RjQsIDB4Q0YsIDB4MDQsIDB4MDIsIDB4RkUsIDB4QjIsIDB4MDAsIDB4REIsIDB4RkYsIDB4RkMsCisJMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QywgMHhGRiwgMHg4QiwgMHgwMSwKKwkweDlELCAweEZDLCAweEQ1LCAweDA2LCAweDg5LCAweEYxLCAweDM1LCAweDMzLCAweDNBLCAweDJELCAweDlBLAorCTB4RjEsIDB4MjMsIDB4MDcsIDB4NTEsIDB4RkMsIDB4QzIsIDB4MDEsIDB4NEYsIDB4RkYsIDB4MkYsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFNSwgMHhGRiwgMHgxQSwgMHgwMCwgMHgzMywgMHgwMCwgMHhERiwKKwkweEZFLCAweDY4LCAweDAzLCAweDRFLCAweEY2LCAweEVFLCAweDQyLCAweEJCLCAweDE3LCAweDkwLCAweEY1LAorCTB4RkMsIDB4MDUsIDB4OEUsIDB4RkMsIDB4Q0QsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgxRSwgMHgwMCwgMHg4NywgMHhGRiwgMHgwQiwgMHgwMSwgMHg0MiwgMHhGRSwgMHg3NCwgMHgwMiwKKwkweEY5LCAweEZDLCAweDM5LCAweDAzLCAweEY1LCAweDQ4LCAweDI0LCAweDA0LCAweDk0LCAweEZDLCAweEE5LAorCTB4MDIsIDB4MjcsIDB4RkUsIDB4MTgsIDB4MDEsIDB4ODIsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRSwgMHhGRiwgMHhDNywgMHgwMSwgMHg5RCwgMHhGQywgMHhEOCwKKwkweDA1LCAweEU3LCAweEY1LCAweDkxLCAweDE2LCAweDg5LCAweDQzLCAweENELCAweEY2LCAweDFFLCAweDAzLAorCTB4MEIsIDB4RkYsIDB4MUEsIDB4MDAsIDB4MjYsIDB4MDAsIDB4RTAsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzMCwgMHgwMCwgMHg0QiwgMHhGRiwgMHhDOSwgMHgwMSwgMHg0OCwgMHhGQywgMHgyOCwgMHgwNywKKwkweEFELCAweEYxLCAweDE5LCAweDJDLCAweDNGLCAweDM0LCAweDk3LCAweEYxLCAweEJFLCAweDA2LCAweEIwLAorCTB4RkMsIDB4N0YsIDB4MDEsIDB4NzIsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhGRiwgMHhDNywgMHgwMCwgMHhERSwgMHhGRCwgMHgwOCwgMHgwNSwgMHhCMCwKKwkweEYzLCAweDRBLCAweDNFLCAweDY0LCAweDFGLCAweEEwLCAweEYzLCAweEJCLCAweDA2LCAweDQ1LCAweEZDLAorCTB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTksCisJMHhGRiwgMHhCNCwgMHgwMCwgMHhGNywgMHhGRSwgMHgxRCwgMHgwMSwgMHg3QSwgMHhGRiwgMHhDNSwgMHhGRCwKKwkweDFELCAweDQ4LCAweDg5LCAweDBBLCAweEZCLCAweEY5LCAweEY4LCAweDAzLCAweDdELCAweEZELCAweDY2LAorCTB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsCisJMHg1MiwgMHhGRiwgMHg5MywgMHgwMSwgMHgxOCwgMHhGRCwgMHhDOSwgMHgwNCwgMHg0NSwgMHhGOCwgMHgzNiwKKwkweDBGLCAweEJCLCAweDQ2LCAweEExLCAweEZBLCAweDBDLCAweDAxLCAweDNFLCAweDAwLCAweDcwLCAweEZGLAorCTB4N0EsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksCisJMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwOSwgMHgwNywgMHg5RCwgMHhGMiwgMHg5MiwgMHgyNCwKKwkweDhGLCAweDNBLCAweDgyLCAweEYyLCAweEUxLCAweDA1LCAweDUwLCAweEZELCAweDFCLCAweDAxLCAweEE2LAorCTB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTcsIDB4MDAsIDB4OTMsIDB4RkYsCisJMHgzRiwgMHgwMSwgMHgxNSwgMHhGRCwgMHgzNiwgMHgwNiwgMHgxOSwgMHhGMiwgMHg5NywgMHgzOCwgMHgxMSwKKwkweDI3LCAweDNCLCAweEYyLCAweDFGLCAweDA3LCAweDMyLCAweEZDLCAweERGLCAweDAxLCAweDNELCAweEZGLAorCTB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4NUUsIDB4MDAsIDB4QTksCisJMHhGRiwgMHhENiwgMHhGRiwgMHhDMywgMHgwMSwgMHg0MywgMHhGOSwgMHhENywgMHg0NSwgMHg5MiwgMHgxMSwKKwkweDc3LCAweEY3LCAweDI4LCAweDA1LCAweEVDLCAweEZDLCAweEE3LCAweDAxLCAweDRBLCAweEZGLCAweDJGLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkQsIDB4RkYsIDB4NEUsIDB4MDEsCisJMHhCMywgMHhGRCwgMHg4RCwgMHgwMywgMHhENCwgMHhGQSwgMHg1RCwgMHgwOCwgMHg4RCwgMHg0OCwgMHg3NCwKKwkweEZGLCAweEFFLCAweEZFLCAweDhELCAweDAxLCAweEJCLCAweEZFLCAweEQxLCAweDAwLCAweDlFLCAweEZGLAorCTB4MTgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTAsIDB4MDEsIDB4NTcsCisJMHhGQywgMHg4NSwgMHgwNiwgMHgzNCwgMHhGNCwgMHhFMCwgMHgxQywgMHhGMCwgMHgzRiwgMHg2RCwgMHhGNCwKKwkweDhDLCAweDA0LCAweDJDLCAweEZFLCAweDk5LCAweDAwLCAweEU3LCAweEZGLCAweEY4LCAweEZGLCAweDA0LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjcsIDB4MDAsIDB4NjUsIDB4RkYsIDB4OTgsIDB4MDEsIDB4OEEsIDB4RkMsCisJMHhFQywgMHgwNiwgMHg3RiwgMHhGMSwgMHgwNCwgMHgzMiwgMHg3QiwgMHgyRSwgMHg4QSwgMHhGMSwgMHgxQSwKKwkweDA3LCAweDVELCAweEZDLCAweEI4LCAweDAxLCAweDU0LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLAorCTB4MDYsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4NEUsIDB4MDAsIDB4QUYsIDB4RkUsIDB4QjgsCisJMHgwMywgMHhDNywgMHhGNSwgMHgzOCwgMHg0MiwgMHgwQywgMHgxOSwgMHgzMiwgMHhGNSwgMHgyMywgMHgwNiwKKwkweDdELCAweEZDLCAweEQzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFDLAorCTB4MDAsIDB4OEQsIDB4RkYsIDB4RkMsIDB4MDAsIDB4NjEsIDB4RkUsIDB4MzksIDB4MDIsIDB4NkIsIDB4RkQsCisJMHgzNywgMHgwMiwgMHhFQiwgMHg0OCwgMHgzMSwgMHgwNSwgMHgyMSwgMHhGQywgMHhFNCwgMHgwMiwgMHgwOCwKKwkweEZFLCAweDI2LCAweDAxLCAweDdDLCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAorCTB4MzIsIDB4MDAsIDB4NDEsIDB4RkYsIDB4QzAsIDB4MDEsIDB4QUYsIDB4RkMsIDB4QUQsIDB4MDUsIDB4NEEsCisJMHhGNiwgMHg0NCwgMHgxNSwgMHgyRiwgMHg0NCwgMHg2NCwgMHhGNywgMHhDOSwgMHgwMiwgMHgzRCwgMHhGRiwKKwkweEZFLCAweEZGLCAweDM0LCAweDAwLCAweERCLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMyLAorCTB4MDAsIDB4NDcsIDB4RkYsIDB4RDAsIDB4MDEsIDB4NDAsIDB4RkMsIDB4MkEsIDB4MDcsIDB4Q0EsIDB4RjEsCisJMHhEMSwgMHgyQSwgMHg2NSwgMHgzNSwgMHhBRSwgMHhGMSwgMHhBMCwgMHgwNiwgMHhDNywgMHhGQywgMHg3MCwKKwkweDAxLCAweDdBLCAweEZGLCAweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDA1LCAweDAwLAorCTB4QzUsIDB4RkYsIDB4REUsIDB4MDAsIDB4QjcsIDB4RkQsIDB4NDUsIDB4MDUsIDB4NTYsIDB4RjMsIDB4NjEsCisJMHgzRCwgMHhCQSwgMHgyMCwgMHg1NiwgMHhGMywgMHhEMywgMHgwNiwgMHgzRSwgMHhGQywgMHhFNiwgMHgwMSwKKwkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLCAweEFGLCAweEZGLCAweEE1LAorCTB4MDAsIDB4MTYsIDB4RkYsIDB4RTMsIDB4MDAsIDB4RTQsIDB4RkYsIDB4RUIsIDB4RkMsIDB4RDIsIDB4NDcsCisJMHhCNiwgMHgwQiwgMHg4OSwgMHhGOSwgMHgyRiwgMHgwNCwgMHg2MiwgMHhGRCwgMHg3MiwgMHgwMSwgMHg1RSwKKwkweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU2LCAweEZGLAorCTB4ODgsIDB4MDEsIDB4MzEsIDB4RkQsIDB4OTUsIDB4MDQsIDB4QjQsIDB4RjgsIDB4RkMsIDB4MEQsIDB4MjYsCisJMHg0NywgMHg2NCwgMHhGQiwgMHhBNywgMHgwMCwgMHg3NywgMHgwMCwgMHg1MSwgMHhGRiwgMHg4OSwgMHgwMCwKKwkweEJBLCAweEZGLCAweDExLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU2LAorCTB4MDEsIDB4MzQsIDB4RkMsIDB4RjksIDB4MDYsIDB4RDksIDB4RjIsIDB4M0YsIDB4MjMsIDB4OTAsIDB4M0IsCisJMHhDNCwgMHhGMiwgMHhBRSwgMHgwNSwgMHg3MiwgMHhGRCwgMHgwNywgMHgwMSwgMHhCMCwgMHhGRiwgMHgwQywKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDFBLCAweDAwLCAweDhBLCAweEZGLCAweDUxLCAweDAxLAorCTB4RjgsIDB4RkMsIDB4NUUsIDB4MDYsIDB4RUQsIDB4RjEsIDB4ODIsIDB4MzcsIDB4NjAsIDB4MjgsIDB4MEUsCisJMHhGMiwgMHgyNiwgMHgwNywgMHgzNSwgMHhGQywgMHhEQiwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweEZELCAweEZGLCAweDBDLCAweDAwLCAweEQwLCAweEZGLCAweDRGLCAweDAwLCAweEM3LCAweEZGLCAweEEwLAorCTB4RkYsIDB4MjAsIDB4MDIsIDB4OTYsIDB4RjgsIDB4NEUsIDB4NDUsIDB4RDcsIDB4MTIsIDB4MEQsIDB4RjcsCisJMHg1OCwgMHgwNSwgMHhENiwgMHhGQywgMHhCMCwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDcyLCAweEZGLCAweDQwLCAweDAxLCAweEQwLCAweEZELAorCTB4NTMsIDB4MDMsIDB4NDcsIDB4RkIsIDB4M0YsIDB4MDcsIDB4QjgsIDB4NDgsIDB4NjIsIDB4MDAsIDB4M0YsCisJMHhGRSwgMHhDOCwgMHgwMSwgMHg5QywgMHhGRSwgMHhFMCwgMHgwMCwgMHg5OCwgMHhGRiwgMHgxOSwgMHgwMCwKKwkweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERDLCAweDAxLCAweDYzLCAweEZDLCAweDY2LAorCTB4MDYsIDB4ODksIDB4RjQsIDB4OEMsIDB4MUIsIDB4QzMsIDB4NDAsIDB4REQsIDB4RjQsIDB4NDYsIDB4MDQsCisJMHg1OCwgMHhGRSwgMHg4MCwgMHgwMCwgMHhGNCwgMHhGRiwgMHhGMywgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweEE1LCAweDAxLCAweDc4LCAweEZDLCAweEZGLCAweDA2LAorCTB4N0QsIDB4RjEsIDB4Q0YsIDB4MzAsIDB4QjgsIDB4MkYsIDB4ODAsIDB4RjEsIDB4MEQsIDB4MDcsIDB4NkEsCisJMHhGQywgMHhBRSwgMHgwMSwgMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwKKwkweEVGLCAweEZGLCAweEZGLCAweEZGLCAweDY5LCAweDAwLCAweDgwLCAweEZFLCAweDA0LCAweDA0LCAweDQ4LAorCTB4RjUsIDB4NzQsIDB4NDEsIDB4NUQsIDB4MUEsIDB4RDcsIDB4RjQsIDB4NDcsIDB4MDYsIDB4NkYsIDB4RkMsCisJMHhEOCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MywKKwkweEZGLCAweEVELCAweDAwLCAweDgwLCAweEZFLCAweEZELCAweDAxLCAweERDLCAweEZELCAweDNDLCAweDAxLAorCTB4RDUsIDB4NDgsIDB4NDUsIDB4MDYsIDB4QUUsIDB4RkIsIDB4MUYsIDB4MDMsIDB4RUEsIDB4RkQsIDB4MzQsCisJMHgwMSwgMHg3NywgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwKKwkweDQ0LCAweEZGLCAweEI4LCAweDAxLCAweEMzLCAweEZDLCAweDgxLCAweDA1LCAweEIwLCAweEY2LCAweEZBLAorCTB4MTMsIDB4Q0MsIDB4NDQsIDB4MDIsIDB4RjgsIDB4NzEsIDB4MDIsIDB4NzEsIDB4RkYsIDB4RTEsIDB4RkYsCisJMHg0MiwgMHgwMCwgMHhENSwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MywKKwkweEZGLCAweEQ2LCAweDAxLCAweDM5LCAweEZDLCAweDJBLCAweDA3LCAweEVCLCAweEYxLCAweDg3LCAweDI5LAorCTB4ODUsIDB4MzYsIDB4Q0MsIDB4RjEsIDB4N0YsIDB4MDYsIDB4RTAsIDB4RkMsIDB4NjAsIDB4MDEsIDB4ODIsCisJMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCQSwgMHhGRiwKKwkweEY0LCAweDAwLCAweDkxLCAweEZELCAweDdFLCAweDA1LCAweDA1LCAweEYzLCAweDZFLCAweDNDLCAweDEwLAorCTB4MjIsIDB4MTIsIDB4RjMsIDB4RTksIDB4MDYsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNSwgMHhGRiwgMHg5NiwgMHgwMCwgMHgzNSwKKwkweEZGLCAweEE5LCAweDAwLCAweDRELCAweDAwLCAweDE5LCAweEZDLCAweDdDLCAweDQ3LCAweEU4LCAweDBDLAorCTB4MTgsIDB4RjksIDB4NjYsIDB4MDQsIDB4NDgsIDB4RkQsIDB4N0UsIDB4MDEsIDB4NUEsIDB4RkYsIDB4MkIsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QSwgMHhGRiwgMHg3RCwgMHgwMSwKKwkweDRCLCAweEZELCAweDYwLCAweDA0LCAweDI0LCAweEY5LCAweEM2LCAweDBDLCAweDg2LCAweDQ3LCAweDMwLAorCTB4RkMsIDB4NDEsIDB4MDAsIDB4QjAsIDB4MDAsIDB4MzIsIDB4RkYsIDB4OTgsIDB4MDAsIDB4QjQsIDB4RkYsCisJMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzOCwKKwkweEZDLCAweEU2LCAweDA2LCAweDE5LCAweEYzLCAweEVBLCAweDIxLCAweDhBLCAweDNDLCAweDBFLCAweEYzLAorCTB4NzgsIDB4MDUsIDB4OTYsIDB4RkQsIDB4RjEsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDEsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4MSwgMHhGRiwgMHg2MiwgMHgwMSwgMHhERCwgMHhGQywKKwkweDgzLCAweDA2LCAweEM5LCAweEYxLCAweDY2LCAweDM2LCAweEFDLCAweDI5LCAweEU3LCAweEYxLCAweDJBLAorCTB4MDcsIDB4M0EsIDB4RkMsIDB4RDUsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwQiwgMHgwMCwgMHhENiwgMHhGRiwgMHg0MSwgMHgwMCwgMHhFNCwgMHhGRiwgMHg2QiwgMHhGRiwgMHg3QiwKKwkweDAyLCAweEYwLCAweEY3LCAweEJBLCAweDQ0LCAweDFFLCAweDE0LCAweEE1LCAweEY2LCAweDg2LCAweDA1LAorCTB4QzEsIDB4RkMsIDB4QjksIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgyMiwgMHgwMCwgMHg3NywgMHhGRiwgMHgzMiwgMHgwMSwgMHhFRCwgMHhGRCwgMHgxOSwgMHgwMywKKwkweEJCLCAweEZCLCAweDI2LCAweDA2LCAweEQ3LCAweDQ4LCAweDU4LCAweDAxLCAweENGLCAweEZELCAweDA0LAorCTB4MDIsIDB4N0QsIDB4RkUsIDB4RUYsIDB4MDAsIDB4OTIsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhEOCwgMHgwMSwgMHg3MCwgMHhGQywgMHg0MywgMHgwNiwgMHhFMSwKKwkweEY0LCAweDM4LCAweDFBLCAweDhDLCAweDQxLCAweDU1LCAweEY1LCAweEZDLCAweDAzLCAweDg1LCAweEZFLAorCTB4NjYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsCisJMHgwMCwgMHg1OSwgMHhGRiwgMHhCMCwgMHgwMSwgMHg2OSwgMHhGQywgMHgwRiwgMHgwNywgMHg4MCwgMHhGMSwKKwkweDk2LCAweDJGLCAweEYyLCAweDMwLCAweDdDLCAweEYxLCAweEZELCAweDA2LCAweDdBLCAweEZDLCAweEEzLAorCTB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjQsIDB4RkYsCisJMHhGMiwgMHhGRiwgMHg4MywgMHgwMCwgMHg1MywgMHhGRSwgMHg0RSwgMHgwNCwgMHhEMCwgMHhGNCwgMHhBQiwKKwkweDQwLCAweEIyLCAweDFCLCAweDdGLCAweEY0LCAweDY5LCAweDA2LCAweDYyLCAweEZDLCAweERELCAweDAxLAorCTB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsIDB4OTgsIDB4RkYsIDB4REUsCisJMHgwMCwgMHg5RiwgMHhGRSwgMHhDMiwgMHgwMSwgMHg0QiwgMHhGRSwgMHg0OCwgMHgwMCwgMHhCMywgMHg0OCwKKwkweDVFLCAweDA3LCAweDNCLCAweEZCLCAweDU5LCAweDAzLCAweENELCAweEZELCAweDQyLCAweDAxLCAweDcxLAorCTB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDcsIDB4RkYsCisJMHhBRiwgMHgwMSwgMHhEOCwgMHhGQywgMHg1MiwgMHgwNSwgMHgxOSwgMHhGNywgMHhCMiwgMHgxMiwgMHg1QywKKwkweDQ1LCAweEE5LCAweEY4LCAweDE2LCAweDAyLCAweEE2LCAweEZGLCAweEMzLCAweEZGLCAweDUxLCAweDAwLAorCTB4RDAsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4NDAsIDB4RkYsIDB4REIsCisJMHgwMSwgMHgzNSwgMHhGQywgMHgyNSwgMHgwNywgMHgxMywgMHhGMiwgMHgzQSwgMHgyOCwgMHhBMCwgMHgzNywKKwkweEYyLCAweEYxLCAweDVBLCAweDA2LCAweEZCLCAweEZDLCAweDRGLCAweDAxLCAweDhCLCAweEZGLCAweDFBLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4QUYsIDB4RkYsIDB4MDksIDB4MDEsCisJMHg2RSwgMHhGRCwgMHhCNCwgMHgwNSwgMHhCQywgMHhGMiwgMHg3MywgMHgzQiwgMHg2NCwgMHgyMywgMHhEMiwKKwkweEYyLCAweEZCLCAweDA2LCAweDM0LCAweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QkIsIDB4RkYsIDB4ODcsIDB4MDAsIDB4NTQsIDB4RkYsIDB4NzAsCisJMHgwMCwgMHhCMywgMHgwMCwgMHg0RSwgMHhGQiwgMHgxQSwgMHg0NywgMHgxRiwgMHgwRSwgMHhBOCwgMHhGOCwKKwkweDlCLCAweDA0LCAweDJFLCAweEZELCAweDhBLCAweDAxLCAweDU1LCAweEZGLCAweDJDLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4NzEsIDB4MDEsIDB4NjUsIDB4RkQsCisJMHgyOSwgMHgwNCwgMHg5NiwgMHhGOSwgMHg5NSwgMHgwQiwgMHhEQywgMHg0NywgMHgwMywgMHhGRCwgMHhEOSwKKwkweEZGLCAweEVBLCAweDAwLCAweDEyLCAweEZGLCAweEE3LCAweDAwLCAweEFFLCAweEZGLCAweDE0LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0UsIDB4RkMsIDB4RDAsCisJMHgwNiwgMHg1RSwgMHhGMywgMHg5NCwgMHgyMCwgMHg3QiwgMHgzRCwgMHg2MCwgMHhGMywgMHgzRSwgMHgwNSwKKwkweEJCLCAweEZELCAweERCLCAweDAwLCAweEM2LCAweEZGLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweEZFLAorCTB4RkYsIDB4MjAsIDB4MDAsIDB4NzksIDB4RkYsIDB4NzIsIDB4MDEsIDB4QzQsIDB4RkMsIDB4QTQsIDB4MDYsCisJMHhBQiwgMHhGMSwgMHg0NiwgMHgzNSwgMHhGNywgMHgyQSwgMHhDNiwgMHhGMSwgMHgyQSwgMHgwNywgMHg0MCwKKwkweEZDLCAweENGLCAweDAxLCAweDQ3LCAweEZGLCAweDMxLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLAorCTB4REIsIDB4RkYsIDB4MzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RDMsIDB4MDIsIDB4NTMsCisJMHhGNywgMHgxRiwgMHg0NCwgMHg2OSwgMHgxNSwgMHgzRiwgMHhGNiwgMHhCMiwgMHgwNSwgMHhBRCwgMHhGQywKKwkweEMxLCAweDAxLCAweDQxLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIwLAorCTB4MDAsIDB4N0QsIDB4RkYsIDB4MjQsIDB4MDEsIDB4MEMsIDB4RkUsIDB4REUsIDB4MDIsIDB4MkUsIDB4RkMsCisJMHgxMywgMHgwNSwgMHhFQywgMHg0OCwgMHg1NCwgMHgwMiwgMHg1RSwgMHhGRCwgMHgzRiwgMHgwMiwgMHg1RCwKKwkweEZFLCAweEZFLCAweDAwLCAweDhDLCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAorCTB4M0IsIDB4RkYsIDB4RDMsIDB4MDEsIDB4N0YsIDB4RkMsIDB4MUYsIDB4MDYsIDB4M0MsIDB4RjUsIDB4RTYsCisJMHgxOCwgMHg0RCwgMHg0MiwgMHhENSwgMHhGNSwgMHhBRiwgMHgwMywgMHhCNCwgMHhGRSwgMHg0QiwgMHgwMCwKKwkweDBFLCAweDAwLCAweEU5LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDUzLAorCTB4RkYsIDB4QkEsIDB4MDEsIDB4NUIsIDB4RkMsIDB4MUIsIDB4MDcsIDB4OEIsIDB4RjEsIDB4NTgsIDB4MkUsCisJMHgyNiwgMHgzMiwgMHg4MCwgMHhGMSwgMHhFQSwgMHgwNiwgMHg4QywgMHhGQywgMHg5NywgMHgwMSwgMHg2NiwKKwkweEZGLCAweDI3LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY4LCAweEZGLCAweEU2LCAweEZGLAorCTB4OUMsIDB4MDAsIDB4MjcsIDB4RkUsIDB4OTQsIDB4MDQsIDB4NjEsIDB4RjQsIDB4RDcsIDB4M0YsIDB4MDYsCisJMHgxRCwgMHgyQiwgMHhGNCwgMHg4OSwgMHgwNiwgMHg1NiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzNywgMHhGRiwKKwkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LCAweDAwLCAweDlFLCAweEZGLCAweENGLCAweDAwLCAweEJGLAorCTB4RkUsIDB4ODYsIDB4MDEsIDB4QkEsIDB4RkUsIDB4NUEsIDB4RkYsIDB4ODYsIDB4NDgsIDB4N0QsIDB4MDgsCisJMHhDNywgMHhGQSwgMHg5MywgMHgwMywgMHhCMCwgMHhGRCwgMHg0RiwgMHgwMSwgMHg2QywgMHhGRiwgMHgyNSwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRCLCAweEZGLCAweEE2LCAweDAxLAorCTB4RUUsIDB4RkMsIDB4MjMsIDB4MDUsIDB4ODMsIDB4RjcsIDB4NkUsIDB4MTEsIDB4RTUsIDB4NDUsIDB4NTcsCisJMHhGOSwgMHhCOCwgMHgwMSwgMHhEQywgMHhGRiwgMHhBNSwgMHhGRiwgMHg1RiwgMHgwMCwgMHhDQSwgMHhGRiwKKwkweDBELCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNELCAweEZGLCAweERGLCAweDAxLCAweDMyLAorCTB4RkMsIDB4MUUsIDB4MDcsIDB4NDAsIDB4RjIsIDB4RUIsIDB4MjYsIDB4QjUsIDB4MzgsIDB4MUYsIDB4RjIsCisJMHgzMiwgMHgwNiwgMHgxOCwgMHhGRCwgMHgzRCwgMHgwMSwgMHg5NCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweEE0LCAweEZGLCAweDFELCAweDAxLCAweDRDLCAweEZELAorCTB4RTYsIDB4MDUsIDB4N0IsIDB4RjIsIDB4NzEsIDB4M0EsIDB4QjgsIDB4MjQsIDB4OTcsIDB4RjIsIDB4MEIsCisJMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDBGLCAweDAwLCAweEMwLCAweEZGLCAweDc4LCAweDAwLCAweDczLCAweEZGLCAweDM4LCAweDAwLCAweDE3LAorCTB4MDEsIDB4OEIsIDB4RkEsIDB4QUYsIDB4NDYsIDB4NTksIDB4MEYsIDB4MzksIDB4RjgsIDB4Q0YsIDB4MDQsCisJMHgxNSwgMHhGRCwgMHg5NSwgMHgwMSwgMHg1MSwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDI4LCAweDAwLCAweDY0LCAweEZGLCAweDY1LCAweDAxLCAweDgxLCAweEZELCAweEYyLCAweDAzLAorCTB4MDgsIDB4RkEsIDB4NjgsIDB4MEEsIDB4MjUsIDB4NDgsIDB4REUsIDB4RkQsIDB4NkUsIDB4RkYsIDB4MjQsCisJMHgwMSwgMHhGMywgMHhGRSwgMHhCNiwgMHgwMCwgMHhBOCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQ2LCAweEZDLCAweEI4LCAweDA2LCAweEE4LAorCTB4RjMsIDB4M0YsIDB4MUYsIDB4NjQsIDB4M0UsIDB4QkEsIDB4RjMsIDB4MDEsIDB4MDUsIDB4RTIsIDB4RkQsCisJMHhDNCwgMHgwMCwgMHhEMiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMywKKwkweDAwLCAweDcxLCAweEZGLCAweDgxLCAweDAxLCAweEFFLCAweEZDLCAweEMxLCAweDA2LCAweDk1LCAweEYxLAorCTB4MUUsIDB4MzQsIDB4M0UsIDB4MkMsIDB4QUIsIDB4RjEsIDB4MjcsIDB4MDcsIDB4NDksIDB4RkMsIDB4QzgsCisJMHgwMSwgMHg0QiwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMSwgMHhGRiwKKwkweDI1LCAweDAwLCAweDFELCAweDAwLCAweDA1LCAweEZGLCAweDI4LCAweDAzLCAweEJELCAweEY2LCAweDc3LAorCTB4NDMsIDB4QjYsIDB4MTYsIDB4REMsIDB4RjUsIDB4REQsIDB4MDUsIDB4OUIsIDB4RkMsIDB4QzgsIDB4MDEsCisJMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MywKKwkweEZGLCAweDE2LCAweDAxLCAweDJBLCAweEZFLCAweEEzLCAweDAyLCAweEExLCAweEZDLCAweDA2LCAweDA0LAorCTB4RjUsIDB4NDgsIDB4NTYsIDB4MDMsIDB4RUQsIDB4RkMsIDB4N0IsIDB4MDIsIDB4M0UsIDB4RkUsIDB4MEMsCisJMHgwMSwgMHg4NiwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwKKwkweENDLCAweDAxLCAweDhGLCAweEZDLCAweEY4LCAweDA1LCAweDlCLCAweEY1LCAweDk2LCAweDE3LCAweDAyLAorCTB4NDMsIDB4NUUsIDB4RjYsIDB4NUYsIDB4MDMsIDB4RTQsIDB4RkUsIDB4MzAsIDB4MDAsIDB4MUIsIDB4MDAsCisJMHhFNCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0RSwgMHhGRiwgMHhDMywKKwkweDAxLCAweDRGLCAweEZDLCAweDI0LCAweDA3LCAweDlDLCAweEYxLCAweDE3LCAweDJELCAweDU3LCAweDMzLAorCTB4OEEsIDB4RjEsIDB4RDMsIDB4MDYsIDB4OUYsIDB4RkMsIDB4OEEsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjUsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHhEOSwgMHhGRiwgMHhCNCwgMHgwMCwKKwkweEZELCAweEZELCAweEQ3LCAweDA0LCAweEZBLCAweEYzLCAweEZDLCAweDNFLCAweDVCLCAweDFFLCAweERCLAorCTB4RjMsIDB4QTYsIDB4MDYsIDB4NEMsIDB4RkMsIDB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNCwgMHhGRiwgMHhDMCwgMHgwMCwgMHhERSwgMHhGRSwgMHg0QiwKKwkweDAxLCAweDI3LCAweEZGLCAweDczLCAweEZFLCAweDRGLCAweDQ4LCAweEEyLCAweDA5LCAweDU0LCAweEZBLAorCTB4Q0MsIDB4MDMsIDB4OTMsIDB4RkQsIDB4NUMsIDB4MDEsIDB4NjcsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5QywgMHgwMSwgMHgwNSwgMHhGRCwKKwkweEYxLCAweDA0LCAweEYwLCAweEY3LCAweDJELCAweDEwLCAweDYxLCAweDQ2LCAweDBELCAweEZBLCAweDU4LAorCTB4MDEsIDB4MTMsIDB4MDAsIDB4ODcsIDB4RkYsIDB4NkUsIDB4MDAsIDB4QzQsIDB4RkYsIDB4MEUsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywgMHgxNCwKKwkweDA3LCAweDczLCAweEYyLCAweDk5LCAweDI1LCAweEMyLCAweDM5LCAweDU0LCAweEYyLCAweDA1LCAweDA2LAorCTB4MzcsIDB4RkQsIDB4MkIsIDB4MDEsIDB4OUUsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHgxNCwgMHgwMCwgMHg5QiwgMHhGRiwgMHgzMSwgMHgwMSwgMHgyQywgMHhGRCwgMHgxNSwgMHgwNiwKKwkweDQxLCAweEYyLCAweDZBLCAweDM5LCAweDBBLCAweDI2LCAweDYxLCAweEYyLCAweDE3LCAweDA3LCAweDMxLAorCTB4RkMsIDB4RTIsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsCisJMHhDNiwgMHhGRiwgMHg2OSwgMHgwMCwgMHg5MSwgMHhGRiwgMHgwMCwgMHgwMCwgMHg3OCwgMHgwMSwgMHhEMCwKKwkweEY5LCAweDM5LCAweDQ2LCAweDk4LCAweDEwLCAweENCLCAweEY3LCAweDAyLCAweDA1LCAweEZFLCAweEZDLAorCTB4OUYsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsCisJMHgwMCwgMHg2OSwgMHhGRiwgMHg1OCwgMHgwMSwgMHg5RCwgMHhGRCwgMHhCOSwgMHgwMywgMHg3QiwgMHhGQSwKKwkweDQwLCAweDA5LCAweDYzLCAweDQ4LCAweEJGLCAweEZFLCAweDAzLCAweEZGLCAweDVGLCAweDAxLCAweEQ0LAorCTB4RkUsIDB4QzUsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzNiwgMHhGRiwgMHhFMiwgMHgwMSwgMHg0RiwgMHhGQywgMHg5QywgMHgwNiwgMHhGNSwgMHhGMywgMHhFQSwKKwkweDFELCAweDQ3LCAweDNGLCAweDFCLCAweEY0LCAweEMxLCAweDA0LCAweDBCLCAweEZFLCAweEFDLCAweDAwLAorCTB4REUsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkEsCisJMHhGRiwgMHg4RSwgMHgwMSwgMHg5OSwgMHhGQywgMHhEQiwgMHgwNiwgMHg4NiwgMHhGMSwgMHhGMiwgMHgzMiwKKwkweDgyLCAweDJELCAweDk2LCAweEYxLCAweDIxLCAweDA3LCAweDUzLCAweEZDLCAweEMwLCAweDAxLCAweDUwLAorCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTYsIDB4RkYsIDB4MTcsIDB4MDAsCisJMHgzOSwgMHgwMCwgMHhENCwgMHhGRSwgMHg3QSwgMHgwMywgMHgyRiwgMHhGNiwgMHhDNywgMHg0MiwgMHgwNiwKKwkweDE4LCAweDdCLCAweEY1LCAweDA1LCAweDA2LCAweDhBLCAweEZDLCAweENGLCAweDAxLCAweDNDLCAweEZGLAorCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODgsIDB4RkYsIDB4MDcsIDB4MDEsIDB4NDksCisJMHhGRSwgMHg2NywgMHgwMiwgMHgxMywgMHhGRCwgMHhGRiwgMHgwMiwgMHhGNCwgMHg0OCwgMHg1RiwgMHgwNCwKKwkweDdBLCAweEZDLCAweEI2LCAweDAyLCAweDIwLCAweEZFLCAweDFCLCAweDAxLCAweDgxLCAweEZGLCAweDFGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0YsIDB4RkYsIDB4QzYsIDB4MDEsCisJMHhBMSwgMHhGQywgMHhDRiwgMHgwNSwgMHhGQywgMHhGNSwgMHg0NywgMHgxNiwgMHhCMCwgMHg0MywgMHhFRSwKKwkweEY2LCAweDBDLCAweDAzLCAweDE2LCAweEZGLCAweDE0LCAweDAwLCAweDI5LCAweDAwLCAweERGLCAweEZGLAorCTB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsIDB4Q0EsIDB4MDEsIDB4NDYsCisJMHhGQywgMHgyOSwgMHgwNywgMHhCMywgMHhGMSwgMHhEMSwgMHgyQiwgMHg4MSwgMHgzNCwgMHg5QywgMHhGMSwKKwkweEI4LCAweDA2LCAweEI1LCAweEZDLCAweDdDLCAweDAxLCAweDc0LCAweEZGLCAweDIyLCAweDAwLCAweEZFLAorCTB4RkYsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4Q0MsIDB4MDAsIDB4RDUsIDB4RkQsCisJMHgxNiwgMHgwNSwgMHg5QiwgMHhGMywgMHgxOCwgMHgzRSwgMHhCMSwgMHgxRiwgMHg4RiwgMHhGMywgMHhDMCwKKwkweDA2LCAweDQzLCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAorCTB4MTUsIDB4MDAsIDB4QUEsIDB4RkYsIDB4QjEsIDB4MDAsIDB4RkUsIDB4RkUsIDB4MTAsIDB4MDEsIDB4OTIsCisJMHhGRiwgMHg5NCwgMHhGRCwgMHgwRCwgMHg0OCwgMHhDQiwgMHgwQSwgMHhFMiwgMHhGOSwgMHgwNCwgMHgwNCwKKwkweDc3LCAweEZELCAweDY5LCAweDAxLCAweDYyLCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MkQsIDB4MDAsIDB4NTIsIDB4RkYsIDB4OTEsIDB4MDEsIDB4MUUsIDB4RkQsIDB4QkUsIDB4MDQsCisJMHg1RSwgMHhGOCwgMHhGMCwgMHgwRSwgMHhEMywgMHg0NiwgMHhDQiwgMHhGQSwgMHhGNiwgMHgwMCwgMHg0QiwKKwkweDAwLCAweDY5LCAweEZGLCAweDdELCAweDAwLCAweEJFLCAweEZGLCAweDEwLCAweDAwLCAweEZELCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MDYsIDB4MDcsIDB4QUEsCisJMHhGMiwgMHg0NiwgMHgyNCwgMHhDOCwgMHgzQSwgMHg5MCwgMHhGMiwgMHhENiwgMHgwNSwgMHg1NywgMHhGRCwKKwkweDE3LCAweDAxLCAweEE4LCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE4LAorCTB4MDAsIDB4OTEsIDB4RkYsIDB4NDMsIDB4MDEsIDB4MEUsIDB4RkQsIDB4NDAsIDB4MDYsIDB4MEYsIDB4RjIsCisJMHg1QiwgMHgzOCwgMHg1QywgMHgyNywgMHgzMCwgMHhGMiwgMHgyMSwgMHgwNywgMHgzMywgMHhGQywgMHhERSwKKwkweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweENDLCAweEZGLAorCTB4NUEsIDB4MDAsIDB4QUYsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4RDgsIDB4MDEsIDB4MUMsIDB4RjksIDB4QjgsCisJMHg0NSwgMHhEQSwgMHgxMSwgMHg2MCwgMHhGNywgMHgzMywgMHgwNSwgMHhFNywgMHhGQywgMHhBOSwgMHgwMSwKKwkweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZFLAorCTB4RkYsIDB4NEIsIDB4MDEsIDB4QjksIDB4RkQsIDB4ODAsIDB4MDMsIDB4RUUsIDB4RkEsIDB4MUQsIDB4MDgsCisJMHg5OCwgMHg0OCwgMHhBOCwgMHhGRiwgMHg5NSwgMHhGRSwgMHg5QSwgMHgwMSwgMHhCNCwgMHhGRSwgMHhENCwKKwkweDAwLCAweDlDLCAweEZGLCAweDE4LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAorCTB4REYsIDB4MDEsIDB4NUEsIDB4RkMsIDB4N0UsIDB4MDYsIDB4NDcsIDB4RjQsIDB4OTQsIDB4MUMsIDB4MUYsCisJMHg0MCwgMHg4NSwgMHhGNCwgMHg3RCwgMHgwNCwgMHgzNiwgMHhGRSwgMHg5MywgMHgwMCwgMHhFQSwgMHhGRiwKKwkweEY3LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDlCLAorCTB4MDEsIDB4ODYsIDB4RkMsIDB4RjEsIDB4MDYsIDB4N0UsIDB4RjEsIDB4QzAsIDB4MzEsIDB4QzIsIDB4MkUsCisJMHg4NywgMHhGMSwgMHgxNywgMHgwNywgMHg1RiwgMHhGQywgMHhCNiwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyRCwKKwkweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVCLCAweEZGLCAweDA5LCAweDAwLCAweDU0LCAweDAwLAorCTB4QTQsIDB4RkUsIDB4QzksIDB4MDMsIDB4QUEsIDB4RjUsIDB4MEMsIDB4NDIsIDB4NTYsIDB4MTksIDB4MUUsCisJMHhGNSwgMHgyQiwgMHgwNiwgMHg3QSwgMHhGQywgMHhENCwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwKKwkweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhFLCAweEZGLCAweEY5LCAweDAwLCAweDY4LCAweEZFLCAweDJDLAorCTB4MDIsIDB4ODQsIDB4RkQsIDB4RkYsIDB4MDEsIDB4RTYsIDB4NDgsIDB4NkUsIDB4MDUsIDB4MDcsIDB4RkMsCisJMHhGMSwgMHgwMiwgMHgwMSwgMHhGRSwgMHgyOSwgMHgwMSwgMHg3QiwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJFLCAweDAxLCAweEI0LCAweEZDLAorCTB4QTQsIDB4MDUsIDB4NjEsIDB4RjYsIDB4RkIsIDB4MTQsIDB4NTMsIDB4NDQsIDB4ODYsIDB4RjcsIDB4QjYsCisJMHgwMiwgMHg0OSwgMHhGRiwgMHhGNywgMHhGRiwgMHgzNywgMHgwMCwgMHhEOSwgMHhGRiwgMHgwQSwgMHgwMCwKKwkweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ2LCAweEZGLCAweEQxLCAweDAxLCAweDNFLCAweEZDLCAweDJCLAorCTB4MDcsIDB4RDAsIDB4RjEsIDB4ODksIDB4MkEsIDB4QTYsIDB4MzUsIDB4QjQsIDB4RjEsIDB4OTksIDB4MDYsCisJMHhDRCwgMHhGQywgMHg2RCwgMHgwMSwgMHg3QywgMHhGRiwgMHgxRiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwKKwkweDAwLCAweDA2LCAweDAwLCAweEMyLCAweEZGLCAweEUzLCAweDAwLCAweEFFLCAweEZELCAweDUyLCAweDA1LAorCTB4NDQsIDB4RjMsIDB4MkEsIDB4M0QsIDB4MDYsIDB4MjEsIDB4NDcsIDB4RjMsIDB4RDgsIDB4MDYsIDB4M0MsCisJMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwKKwkweEIwLCAweEZGLCAweEEyLCAweDAwLCAweDFELCAweEZGLCAweEQ2LCAweDAwLCAweEZDLCAweEZGLCAweEJDLAorCTB4RkMsIDB4QzAsIDB4NDcsIDB4RkEsIDB4MEIsIDB4NzAsIDB4RjksIDB4M0MsIDB4MDQsIDB4NUMsIDB4RkQsCisJMHg3NSwgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwKKwkweDAwLCAweDU3LCAweEZGLCAweDg2LCAweDAxLCAweDM2LCAweEZELCAweDg5LCAweDA0LCAweENELCAweEY4LAorCTB4QjcsIDB4MEQsIDB4M0QsIDB4NDcsIDB4OTEsIDB4RkIsIDB4OTEsIDB4MDAsIDB4ODMsIDB4MDAsIDB4NEEsCisJMHhGRiwgMHg4QywgMHgwMCwgMHhCOSwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM1LCAweEZDLCAweEY1LCAweDA2LCAweEU3LCAweEYyLCAweEYyLAorCTB4MjIsIDB4QzcsIDB4M0IsIDB4RDQsIDB4RjIsIDB4QTIsIDB4MDUsIDB4N0EsIDB4RkQsIDB4MDIsIDB4MDEsCisJMHhCMiwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg4OCwKKwkweEZGLCAweDU1LCAweDAxLCAweEYyLCAweEZDLCAweDY3LCAweDA2LCAweEU0LCAweEYxLCAweDQ0LCAweDM3LAorCTB4QUEsIDB4MjgsIDB4MDUsIDB4RjIsIDB4MjcsIDB4MDcsIDB4MzYsIDB4RkMsIDB4REEsIDB4MDEsIDB4NDEsCisJMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhEMiwgMHhGRiwgMHg0QywgMHgwMCwKKwkweENELCAweEZGLCAweDk0LCAweEZGLCAweDM0LCAweDAyLCAweDcwLCAweEY4LCAweDJFLCAweDQ1LCAweDIwLAorCTB4MTMsIDB4RjYsIDB4RjYsIDB4NjIsIDB4MDUsIDB4RDEsIDB4RkMsIDB4QjIsIDB4MDEsIDB4NDYsIDB4RkYsCisJMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHg3MywgMHhGRiwgMHgzRCwKKwkweDAxLCAweEQ2LCAweEZELCAweDQ2LCAweDAzLCAweDYxLCAweEZCLCAweDAwLCAweDA3LCAweEJGLCAweDQ4LAorCTB4OTgsIDB4MDAsIDB4MjYsIDB4RkUsIDB4RDUsIDB4MDEsIDB4OTUsIDB4RkUsIDB4RTMsIDB4MDAsIDB4OTYsCisJMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEQiwgMHgwMSwKKwkweDY2LCAweEZDLCAweDVFLCAweDA2LCAweDlDLCAweEY0LCAweDQwLCAweDFCLCAweEVGLCAweDQwLCAweEY3LAorCTB4RjQsIDB4MzUsIDB4MDQsIDB4NjIsIDB4RkUsIDB4N0EsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RjIsIDB4RkYsCisJMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1RCwgMHhGRiwgMHhBNywgMHgwMSwgMHg3NSwKKwkweEZDLCAweDAzLCAweDA3LCAweDdELCAweEYxLCAweDhBLCAweDMwLCAweEZGLCAweDJGLCAweDdFLCAweEYxLAorCTB4MEEsIDB4MDcsIDB4NkUsIDB4RkMsIDB4QUMsIDB4MDEsIDB4NUEsIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwNSwgMHgwMCwgMHhGMCwgMHhGRiwgMHhGQywgMHhGRiwgMHg2RSwgMHgwMCwgMHg3NiwgMHhGRSwKKwkweDE1LCAweDA0LCAweDJDLCAweEY1LCAweDQ5LCAweDQxLCAweEE5LCAweDFBLCAweEMzLCAweEY0LCAweDRGLAorCTB4MDYsIDB4NkMsIDB4RkMsIDB4RDksIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgxQSwgMHgwMCwgMHg5NCwgMHhGRiwgMHhFQSwgMHgwMCwgMHg4NywgMHhGRSwgMHhGMCwgMHgwMSwgMHhGNSwKKwkweEZELCAweDA1LCAweDAxLCAweENFLCAweDQ4LCAweDgzLCAweDA2LCAweDk0LCAweEZCLCAweDJDLCAweDAzLAorCTB4RTQsIDB4RkQsIDB4MzcsIDB4MDEsIDB4NzYsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgzMSwgMHgwMCwgMHg0NSwgMHhGRiwgMHhCNiwgMHgwMSwgMHhDOCwgMHhGQywgMHg3NywgMHgwNSwKKwkweEM3LCAweEY2LCAweEIxLCAweDEzLCAweEVELCAweDQ0LCAweDI2LCAweEY4LCAweDVELCAweDAyLCAweDdELAorCTB4RkYsIDB4REEsIDB4RkYsIDB4NDYsIDB4MDAsIDB4RDQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzMywgMHgwMCwgMHg0MiwgMHhGRiwgMHhENywgMHgwMSwgMHgzOCwgMHhGQywgMHgyOSwgMHgwNywgMHhGMywKKwkweEYxLCAweDNFLCAweDI5LCAweEM2LCAweDM2LCAweEQ0LCAweEYxLCAweDc3LCAweDA2LCAweEU2LCAweEZDLAorCTB4NUMsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEEsCisJMHgwMCwgMHhCNywgMHhGRiwgMHhGOSwgMHgwMCwgMHg4OSwgMHhGRCwgMHg4QSwgMHgwNSwgMHhGNCwgMHhGMiwKKwkweDM3LCAweDNDLCAweDVCLCAweDIyLCAweDAzLCAweEYzLCAweEVELCAweDA2LCAweDM3LCAweEZDLCAweEU2LAorCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjYsIDB4RkYsCisJMHg5MywgMHgwMCwgMHgzQywgMHhGRiwgMHg5RCwgMHgwMCwgMHg2MywgMHgwMCwgMHhFQiwgMHhGQiwgMHg2OSwKKwkweDQ3LCAweDJELCAweDBELCAweEZGLCAweEY4LCAweDcyLCAweDA0LCAweDQyLCAweEZELCAweDgxLCAweDAxLAorCTB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUIsCisJMHhGRiwgMHg3QSwgMHgwMSwgMHg1MCwgMHhGRCwgMHg1NCwgMHgwNCwgMHgzRCwgMHhGOSwgMHg4MiwgMHgwQywKKwkweDlBLCAweDQ3LCAweDVFLCAweEZDLCAweDJBLCAweDAwLCAweEJELCAweDAwLCAweDJCLCAweEZGLCAweDlCLAorCTB4MDAsIDB4QjMsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCisJMHhFNiwgMHgwMSwgMHgzQSwgMHhGQywgMHhFMiwgMHgwNiwgMHgyOCwgMHhGMywgMHg5RSwgMHgyMSwgMHhDMCwKKwkweDNDLCAweDFGLCAweEYzLCAweDZDLCAweDA1LCAweDlFLCAweEZELCAweEVELCAweDAwLCAweEJELCAweEZGLAorCTB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsIDB4ODAsIDB4RkYsIDB4NjYsCisJMHgwMSwgMHhEOCwgMHhGQywgMHg4QiwgMHgwNiwgMHhDMSwgMHhGMSwgMHgyNywgMHgzNiwgMHhGNiwgMHgyOSwKKwkweERGLCAweEYxLCAweDJBLCAweDA3LCAweDNCLCAweEZDLCAweEQ0LCAweDAxLCAweDQ0LCAweEZGLCAweDMyLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RDcsIDB4RkYsIDB4M0UsIDB4MDAsIDB4RUEsIDB4RkYsCisJMHg2MCwgMHhGRiwgMHg4RiwgMHgwMiwgMHhDRCwgMHhGNywgMHg5OSwgMHg0NCwgMHg2OCwgMHgxNCwgMHg4RSwKKwkweEY2LCAweDkwLCAweDA1LCAweEJDLCAweEZDLCAweEJBLCAweDAxLCAweDQzLCAweEZGLCAweDMyLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzksIDB4RkYsIDB4MkYsIDB4MDEsIDB4RjQsCisJMHhGRCwgMHgwQywgMHgwMywgMHhENCwgMHhGQiwgMHhFOSwgMHgwNSwgMHhERSwgMHg0OCwgMHg4RiwgMHgwMSwKKwkweEI2LCAweEZELCAweDExLCAweDAyLCAweDc2LCAweEZFLCAweEYyLCAweDAwLCAweDkxLCAweEZGLCAweDFCLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDcsIDB4MDEsIDB4NzMsIDB4RkMsCisJMHgzQiwgMHgwNiwgMHhGNSwgMHhGNCwgMHhFRCwgMHgxOSwgMHhCNywgMHg0MSwgMHg3MSwgMHhGNSwgMHhFQiwKKwkweDAzLCAweDkwLCAweEZFLCAweDYwLCAweDAwLCAweDA0LCAweDAwLCAweEVELCAweEZGLCAweDA2LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTcsIDB4RkYsIDB4QjIsIDB4MDEsIDB4NjUsIDB4RkMsIDB4MTIsCisJMHgwNywgMHg4MiwgMHhGMSwgMHg1MCwgMHgyRiwgMHgzOCwgMHgzMSwgMHg3QywgMHhGMSwgMHhGOSwgMHgwNiwKKwkweDdFLCAweEZDLCAweEExLCAweDAxLCAweDYxLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDA0LAorCTB4MDAsIDB4RjUsIDB4RkYsIDB4RUYsIDB4RkYsIDB4ODgsIDB4MDAsIDB4NDksIDB4RkUsIDB4NUQsIDB4MDQsCisJMHhCNywgMHhGNCwgMHg3RCwgMHg0MCwgMHhGRCwgMHgxQiwgMHg2QywgMHhGNCwgMHg3MCwgMHgwNiwgMHg1RiwKKwkweEZDLCAweERFLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLAorCTB4OUEsIDB4RkYsIDB4REIsIDB4MDAsIDB4QTYsIDB4RkUsIDB4QjQsIDB4MDEsIDB4NjQsIDB4RkUsIDB4MTIsCisJMHgwMCwgMHhBQSwgMHg0OCwgMHg5RSwgMHgwNywgMHgyMSwgMHhGQiwgMHg2NiwgMHgwMywgMHhDNiwgMHhGRCwKKwkweDQ1LCAweDAxLCAweDcwLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLAorCTB4MDAsIDB4NDgsIDB4RkYsIDB4QUQsIDB4MDEsIDB4REQsIDB4RkMsIDB4NDgsIDB4MDUsIDB4MzAsIDB4RjcsCisJMHg2QiwgMHgxMiwgMHg3RCwgMHg0NSwgMHhDRiwgMHhGOCwgMHgwMSwgMHgwMiwgMHhCMiwgMHhGRiwgMHhCRCwKKwkweEZGLCAweDU0LCAweDAwLCAweENFLCAweEZGLCAweDBDLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAorCTB4M0YsIDB4RkYsIDB4REMsIDB4MDEsIDB4MzQsIDB4RkMsIDB4MjQsIDB4MDcsIDB4MUMsIDB4RjIsIDB4RjAsCisJMHgyNywgMHhERiwgMHgzNywgMHhGQiwgMHhGMSwgMHg1MSwgMHgwNiwgMHgwMSwgMHhGRCwgMHg0QiwgMHgwMSwKKwkweDhELCAweEZGLCAweDE5LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEFDLAorCTB4RkYsIDB4MEUsIDB4MDEsIDB4NjYsIDB4RkQsIDB4QkYsIDB4MDUsIDB4QUQsIDB4RjIsIDB4M0IsIDB4M0IsCisJMHhCMCwgMHgyMywgMHhDNCwgMHhGMiwgMHhGRiwgMHgwNiwgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOCwKKwkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJDLCAweEZGLCAweDg0LCAweDAwLAorCTB4NUIsIDB4RkYsIDB4NjQsIDB4MDAsIDB4QzksIDB4MDAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NDcsIDB4NjQsCisJMHgwRSwgMHg4RiwgMHhGOCwgMHhBNywgMHgwNCwgMHgyOSwgMHhGRCwgMHg4QywgMHgwMSwgMHg1NCwgMHhGRiwKKwkweDJDLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDYwLCAweEZGLCAweDZFLAorCTB4MDEsIDB4NkIsIDB4RkQsIDB4MUQsIDB4MDQsIDB4QUYsIDB4RjksIDB4NTEsIDB4MEIsIDB4RUMsIDB4NDcsCisJMHgzMywgMHhGRCwgMHhDMSwgMHhGRiwgMHhGNywgMHgwMCwgMHgwQywgMHhGRiwgMHhBQSwgMHgwMCwgMHhBRCwKKwkweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLAorCTB4NDAsIDB4RkMsIDB4Q0IsIDB4MDYsIDB4NkUsIDB4RjMsIDB4NDksIDB4MjAsIDB4QjAsIDB4M0QsIDB4NzMsCisJMHhGMywgMHgzMSwgMHgwNSwgMHhDNCwgMHhGRCwgMHhENiwgMHgwMCwgMHhDOCwgMHhGRiwgMHgwMywgMHgwMCwKKwkweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIxLCAweDAwLCAweDc3LCAweEZGLCAweDc1LCAweDAxLCAweEJGLAorCTB4RkMsIDB4QUIsIDB4MDYsIDB4QTYsIDB4RjEsIDB4MDUsIDB4MzUsIDB4NDAsIDB4MkIsIDB4QkYsIDB4RjEsCisJMHgyQSwgMHgwNywgMHg0MiwgMHhGQywgMHhDRSwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDA5LCAweDAwLCAweERDLCAweEZGLCAweDJGLCAweDAwLCAweDA3LCAweDAwLCAweDJDLCAweEZGLAorCTB4RTYsIDB4MDIsIDB4MzEsIDB4RjcsIDB4RkEsIDB4NDMsIDB4QjMsIDB4MTUsIDB4MjksIDB4RjYsIDB4QkMsCisJMHgwNSwgMHhBOSwgMHhGQywgMHhDMiwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdFLCAweEZGLCAweDIxLCAweDAxLCAweDEyLCAweEZFLCAweEQxLAorCTB4MDIsIDB4NDcsIDB4RkMsIDB4RDcsIDB4MDQsIDB4RjAsIDB4NDgsIDB4OEQsIDB4MDIsIDB4NDUsIDB4RkQsCisJMHg0RCwgMHgwMiwgMHg1NiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDM0LCAweDAwLCAweDNCLCAweEZGLCAweEQxLCAweDAxLCAweDgzLCAweEZDLCAweDE2LCAweDA2LAorCTB4NTEsIDB4RjUsIDB4OUIsIDB4MTgsIDB4NzUsIDB4NDIsIDB4RjMsIDB4RjUsIDB4OUQsIDB4MDMsIDB4QkYsCisJMHhGRSwgMHg0NSwgMHgwMCwgMHgxMSwgMHgwMCwgMHhFOCwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDJFLCAweDAwLCAweDUyLCAweEZGLCAweEJDLCAweDAxLCAweDU4LCAweEZDLCAweDFELCAweDA3LCAweDhFLAorCTB4RjEsIDB4MTEsIDB4MkUsIDB4NkIsIDB4MzIsIDB4ODEsIDB4RjEsIDB4RTUsIDB4MDYsIDB4OTAsIDB4RkMsCisJMHg5NCwgMHgwMSwgMHg2NywgMHhGRiwgMHgyNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGOSwKKwkweEZGLCAweEUzLCAweEZGLCAweEExLCAweDAwLCAweDFFLCAweEZFLCAweEEzLCAweDA0LCAweDQ5LCAweEY0LAorCTB4QTgsIDB4M0YsIDB4NTIsIDB4MUQsIDB4MTksIDB4RjQsIDB4OTAsIDB4MDYsIDB4NTMsIDB4RkMsIDB4RTEsCisJMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMCwgMHhGRiwKKwkweENDLCAweDAwLCAweEM2LCAweEZFLCAweDc5LCAweDAxLCAweEQyLCAweEZFLCAweDI2LCAweEZGLCAweDdDLAorCTB4NDgsIDB4QkUsIDB4MDgsIDB4QUUsIDB4RkEsIDB4QTAsIDB4MDMsIDB4QTksIDB4RkQsIDB4NTIsIDB4MDEsCisJMHg2QiwgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QywKKwkweEZGLCAweEEzLCAweDAxLCAweEYzLCAweEZDLCAweDE4LCAweDA1LCAweDlCLCAweEY3LCAweDI3LCAweDExLAorCTB4MDIsIDB4NDYsIDB4N0YsIDB4RjksIDB4QTMsIDB4MDEsIDB4RTgsIDB4RkYsIDB4OUYsIDB4RkYsIDB4NjMsCisJMHgwMCwgMHhDOSwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwKKwkweEUwLCAweDAxLCAweDMyLCAweEZDLCAweDFDLCAweDA3LCAweDRCLCAweEYyLCAweEEwLCAweDI2LCAweEYyLAorCTB4MzgsIDB4MkEsIDB4RjIsIDB4MjgsIDB4MDYsIDB4MUYsIDB4RkQsIDB4MzksIDB4MDEsIDB4OTYsIDB4RkYsCisJMHgxNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHhBMiwgMHhGRiwgMHgyMiwKKwkweDAxLCAweDQ1LCAweEZELCAweEYxLCAweDA1LCAweDZELCAweEYyLCAweDM4LCAweDNBLCAweDAzLCAweDI1LAorCTB4OEIsIDB4RjIsIDB4MEUsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMiwgMHhGRiwgMHg3NSwgMHgwMCwgMHg3QSwgMHhGRiwKKwkweDJCLCAweDAwLCAweDJELCAweDAxLCAweDYxLCAweEZBLCAweDk3LCAweDQ2LCAweEEwLCAweDBGLCAweDIwLAorCTB4RjgsIDB4REEsIDB4MDQsIDB4MTAsIDB4RkQsIDB4OTcsIDB4MDEsIDB4NTAsIDB4RkYsIDB4MkUsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NSwgMHhGRiwgMHg2MiwgMHgwMSwgMHg4NywKKwkweEZELCAweEU1LCAweDAzLCAweDIxLCAweEZBLCAweDI1LCAweDBBLCAweDMzLCAweDQ4LCAweDBGLCAweEZFLAorCTB4NTcsIDB4RkYsIDB4MzEsIDB4MDEsIDB4RUMsIDB4RkUsIDB4QjksIDB4MDAsIDB4QTcsIDB4RkYsIDB4MTUsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwgMHgwMSwgMHg0OCwgMHhGQywKKwkweEIyLCAweDA2LCAweEI5LCAweEYzLCAweEYzLCAweDFFLCAweDk4LCAweDNFLCAweENGLCAweEYzLCAweEYzLAorCTB4MDQsIDB4RUIsIDB4RkQsIDB4QkYsIDB4MDAsIDB4RDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgyMywgMHgwMCwgMHg3MCwgMHhGRiwgMHg4NCwgMHgwMSwgMHhBOSwgMHhGQywgMHhDNywKKwkweDA2LCAweDkxLCAweEYxLCAweERDLCAweDMzLCAweDg3LCAweDJDLCAweEE1LCAweEYxLCAweDI2LCAweDA3LAorCTB4NEIsIDB4RkMsIDB4QzYsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsCisJMHgwMCwgMHhFMiwgMHhGRiwgMHgyMSwgMHgwMCwgMHgyMywgMHgwMCwgMHhGQSwgMHhGRSwgMHgzQSwgMHgwMywKKwkweDlELCAweEY2LCAweDUwLCAweDQzLCAweDAwLCAweDE3LCAweEM2LCAweEY1LCAweEU2LCAweDA1LCAweDk3LAorCTB4RkMsIDB4QzksIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMywgMHgwMSwgMHgzMSwgMHhGRSwgMHg5NSwgMHgwMiwgMHhCQSwKKwkweEZDLCAweENCLCAweDAzLCAweEY3LCAweDQ4LCAweDkxLCAweDAzLCAweEQzLCAweEZDLCAweDg4LCAweDAyLAorCTB4MzgsIDB4RkUsIDB4MTAsIDB4MDEsIDB4ODUsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsCisJMHgwMCwgMHgzRCwgMHhGRiwgMHhDQiwgMHgwMSwgMHg5MywgMHhGQywgMHhFRiwgMHgwNSwgMHhCMCwgMHhGNSwKKwkweDRCLCAweDE3LCAweDJBLCAweDQzLCAweDdELCAweEY2LCAweDRELCAweDAzLCAweEVGLCAweEZFLCAweDJBLAorCTB4MDAsIDB4MUUsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsCisJMHg0RCwgMHhGRiwgMHhDNCwgMHgwMSwgMHg0RCwgMHhGQywgMHgyNSwgMHgwNywgMHhBMSwgMHhGMSwgMHhDRSwKKwkweDJDLCAweDk5LCAweDMzLCAweDhFLCAweEYxLCAweENELCAweDA2LCAweEE0LCAweEZDLCAweDg3LCAweDAxLAorCTB4NkUsIDB4RkYsIDB4MjQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RDcsCisJMHhGRiwgMHhCQSwgMHgwMCwgMHhGNCwgMHhGRCwgMHhFNSwgMHgwNCwgMHhFNCwgMHhGMywgMHhDQSwgMHgzRSwKKwkweEE3LCAweDFFLCAweENBLCAweEYzLCAweEFDLCAweDA2LCAweDRBLCAweEZDLCAweEU0LCAweDAxLCAweDM2LAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTYsIDB4RkYsIDB4QkQsIDB4MDAsCisJMHhFNSwgMHhGRSwgMHgzRSwgMHgwMSwgMHgzRiwgMHhGRiwgMHg0MSwgMHhGRSwgMHg0MSwgMHg0OCwgMHhFNCwKKwkweDA5LCAweDNCLCAweEZBLCAweEQ5LCAweDAzLCAweDhELCAweEZELCAweDVGLCAweDAxLCAweDY2LCAweEZGLAorCTB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEYsIDB4RkYsIDB4OTksCisJMHgwMSwgMHgwQiwgMHhGRCwgMHhFNiwgMHgwNCwgMHgwOCwgMHhGOCwgMHhFNywgMHgwRiwgMHg3QywgMHg0NiwKKwkweDM3LCAweEZBLCAweDQyLCAweDAxLCAweDFGLCAweDAwLCAweDgxLCAweEZGLCAweDcxLCAweDAwLCAweEMzLAorCTB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RTMsIDB4MDEsCisJMHgzMSwgMHhGQywgMHgxMSwgMHgwNywgMHg3RiwgMHhGMiwgMHg0RSwgMHgyNSwgMHhGRCwgMHgzOSwgMHg2MCwKKwkweEYyLCAweEZCLCAweDA1LCAweDNFLCAweEZELCAweDI2LCAweDAxLCAweEEwLCAweEZGLCAweDEyLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTUsIDB4MDAsIDB4OTgsIDB4RkYsIDB4MzUsIDB4MDEsIDB4MjUsCisJMHhGRCwgMHgxRSwgMHgwNiwgMHgzNSwgMHhGMiwgMHgyRSwgMHgzOSwgMHg1NSwgMHgyNiwgMHg1NiwgMHhGMiwKKwkweDFBLCAweDA3LCAweDMxLCAweEZDLCAweEUxLCAweDAxLCAweDNDLCAweEZGLCAweDM1LCAweDAwLCAweEZELAorCTB4RkYsIDB4MEUsIDB4MDAsIDB4QzcsIDB4RkYsIDB4NjYsIDB4MDAsIDB4OTgsIDB4RkYsIDB4RjQsIDB4RkYsCisJMHg4RSwgMHgwMSwgMHhBNywgMHhGOSwgMHgxRCwgMHg0NiwgMHhERiwgMHgxMCwgMHhCMywgMHhGNywgMHgwRCwKKwkweDA1LCAweEY4LCAweEZDLCAweEExLCAweDAxLCAweDRDLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NkEsIDB4RkYsIDB4NTUsIDB4MDEsIDB4QTMsIDB4RkQsIDB4QUQsCisJMHgwMywgMHg5NCwgMHhGQSwgMHhGRiwgMHgwOCwgMHg3MCwgMHg0OCwgMHhGMywgMHhGRSwgMHhFQSwgMHhGRSwKKwkweDZDLCAweDAxLCAweENELCAweEZFLCAweEM5LCAweDAwLCAweEExLCAweEZGLCAweDE3LCAweDAwLCAweEZFLAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTIsIDB4MDEsIDB4NTEsIDB4RkMsIDB4OTYsIDB4MDYsCisJMHgwNywgMHhGNCwgMHg5RSwgMHgxRCwgMHg3NywgMHgzRiwgMHgzMiwgMHhGNCwgMHhCMiwgMHgwNCwgMHgxNSwKKwkweEZFLCAweEE3LCAweDAwLCAweEUwLCAweEZGLCAweEZBLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLAorCTB4MjYsIDB4MDAsIDB4NjksIDB4RkYsIDB4OTEsIDB4MDEsIDB4OTQsIDB4RkMsIDB4RTAsIDB4MDYsIDB4ODQsCisJMHhGMSwgMHhBRiwgMHgzMiwgMHhDQSwgMHgyRCwgMHg5MiwgMHhGMSwgMHgxRiwgMHgwNywgMHg1NiwgMHhGQywKKwkweEJFLCAweDAxLCAweDUxLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU3LAorCTB4RkYsIDB4MTQsIDB4MDAsIDB4M0YsIDB4MDAsIDB4QzksIDB4RkUsIDB4OEMsIDB4MDMsIDB4MTEsIDB4RjYsCisJMHg5RSwgMHg0MiwgMHg1MCwgMHgxOCwgMHg2NiwgMHhGNSwgMHgwRCwgMHgwNiwgMHg4NiwgMHhGQywgMHhEMCwKKwkweDAxLCAweDNCLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDhBLCAweEZGLAorCTB4MDQsIDB4MDEsIDB4NTAsIDB4RkUsIDB4NUEsIDB4MDIsIDB4MkMsIDB4RkQsIDB4QzYsIDB4MDIsIDB4RjIsCisJMHg0OCwgMHg5QiwgMHgwNCwgMHg2MSwgMHhGQywgMHhDMywgMHgwMiwgMHgxOSwgMHhGRSwgMHgxRSwgMHgwMSwKKwkweDdGLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLAorCTB4RkYsIDB4QzQsIDB4MDEsIDB4QTUsIDB4RkMsIDB4QzUsIDB4MDUsIDB4MTMsIDB4RjYsIDB4RkQsIDB4MTUsCisJMHhENCwgMHg0MywgMHgwRiwgMHhGNywgMHhGOSwgMHgwMiwgMHgyMSwgMHhGRiwgMHgwRCwgMHgwMCwgMHgyQywKKwkweDAwLCAweERFLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ5LCAweEZGLAorCTB4Q0MsIDB4MDEsIDB4NDQsIDB4RkMsIDB4MjksIDB4MDcsIDB4QjksIDB4RjEsIDB4ODksIDB4MkIsIDB4QzMsCisJMHgzNCwgMHhBMCwgMHhGMSwgMHhCMSwgMHgwNiwgMHhCQSwgMHhGQywgMHg3OSwgMHgwMSwgMHg3NiwgMHhGRiwKKwkweDIxLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweENCLCAweEZGLCAweEQxLAorCTB4MDAsIDB4Q0MsIDB4RkQsIDB4MjQsIDB4MDUsIDB4ODcsIDB4RjMsIDB4RTQsIDB4M0QsIDB4RkQsIDB4MUYsCisJMHg3RiwgMHhGMywgMHhDNiwgMHgwNiwgMHg0MSwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLCAweEFDLCAweEZGLCAweEFFLCAweDAwLCAweDA1LCAweEZGLAorCTB4MDMsIDB4MDEsIDB4QUEsIDB4RkYsIDB4NjMsIDB4RkQsIDB4RkQsIDB4NDcsIDB4MEUsIDB4MEIsIDB4QzgsCisJMHhGOSwgMHgxMSwgMHgwNCwgMHg3MSwgMHhGRCwgMHg2QywgMHgwMSwgMHg2MSwgMHhGRiwgMHgyOCwgMHgwMCwKKwkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUzLCAweEZGLCAweDhGLCAweDAxLCAweDIzLAorCTB4RkQsIDB4QjIsIDB4MDQsIDB4NzYsIDB4RjgsIDB4QUEsIDB4MEUsIDB4RUQsIDB4NDYsIDB4RjcsIDB4RkEsCisJMHhERiwgMHgwMCwgMHg1NywgMHgwMCwgMHg2MiwgMHhGRiwgMHg4MCwgMHgwMCwgMHhCRCwgMHhGRiwgMHgxMCwKKwkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LCAweDAxLCAweDMzLCAweEZDLAorCTB4MDMsIDB4MDcsIDB4QjcsIDB4RjIsIDB4RkMsIDB4MjMsIDB4MDMsIDB4M0IsIDB4OUUsIDB4RjIsIDB4Q0IsCisJMHgwNSwgMHg1RiwgMHhGRCwgMHgxMiwgMHgwMSwgMHhBQSwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDE4LCAweDAwLCAweDhGLCAweEZGLCAweDQ3LCAweDAxLCAweDA4LCAweEZELCAweDQ5LAorCTB4MDYsIDB4MDUsIDB4RjIsIDB4MUQsIDB4MzgsIDB4QTYsIDB4MjcsIDB4MjYsIDB4RjIsIDB4MjMsIDB4MDcsCisJMHgzMywgMHhGQywgMHhERCwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywKKwkweDAwLCAweENELCAweEZGLCAweDU3LCAweDAwLCAweEI2LCAweEZGLCAweEJFLCAweEZGLCAweEVELCAweDAxLAorCTB4RjUsIDB4RjgsIDB4OUIsIDB4NDUsIDB4MjIsIDB4MTIsIDB4NDgsIDB4RjcsIDB4M0QsIDB4MDUsIDB4RTIsCisJMHhGQywgMHhBQiwgMHgwMSwgMHg0OSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDI0LCAweDAwLCAweDZGLCAweEZGLCAweDQ4LCAweDAxLCAweEMwLCAweEZELCAweDczLCAweDAzLCAweDA3LAorCTB4RkIsIDB4REQsIDB4MDcsIDB4QTEsIDB4NDgsIDB4REQsIDB4RkYsIDB4N0QsIDB4RkUsIDB4QTcsIDB4MDEsCisJMHhBRCwgMHhGRSwgMHhEOCwgMHgwMCwgMHg5QiwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM3LCAweEZGLCAweERGLCAweDAxLCAweDVDLCAweEZDLCAweDc4LCAweDA2LCAweDVBLCAweEY0LAorCTB4NDksIDB4MUMsIDB4NEUsIDB4NDAsIDB4OUUsIDB4RjQsIDB4NkQsIDB4MDQsIDB4M0YsIDB4RkUsIDB4OEUsCisJMHgwMCwgMHhFRCwgMHhGRiwgMHhGNiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwKKwkweDYyLCAweEZGLCAweDlFLCAweDAxLCAweDgyLCAweEZDLCAweEY1LCAweDA2LCAweDdELCAweEYxLCAweDdCLAorCTB4MzEsIDB4MDksIDB4MkYsIDB4ODQsIDB4RjEsIDB4MTUsIDB4MDcsIDB4NjIsIDB4RkMsIDB4QjQsIDB4MDEsCisJMHg1NiwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwKKwkweDAwLCAweDVBLCAweDAwLCAweDlBLCAweEZFLCAweERBLCAweDAzLCAweDhELCAweEY1LCAweEUxLCAweDQxLAorCTB4QTEsIDB4MTksIDB4MDksIDB4RjUsIDB4MzMsIDB4MDYsIDB4NzcsIDB4RkMsIDB4RDYsIDB4MDEsIDB4M0EsCisJMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg4RiwgMHhGRiwgMHhGNSwgMHgwMCwKKwkweDZGLCAweEZFLCAweDFFLCAweDAyLCAweDlELCAweEZELCAweEM3LCAweDAxLCAweEUxLCAweDQ4LCAweEFCLAorCTB4MDUsIDB4RUUsIDB4RkIsIDB4RkUsIDB4MDIsIDB4RkIsIDB4RkQsIDB4MkMsIDB4MDEsIDB4N0EsIDB4RkYsCisJMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MiwgMHhGRiwgMHhCQywKKwkweDAxLCAweEI4LCAweEZDLCAweDlBLCAweDA1LCAweDc3LCAweEY2LCAweEIxLCAweDE0LCAweDc3LCAweDQ0LAorCTB4QTksIDB4RjcsIDB4QTIsIDB4MDIsIDB4NTQsIDB4RkYsIDB4RjEsIDB4RkYsIDB4M0EsIDB4MDAsIDB4RDgsCisJMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NSwgMHhGRiwgMHhEMywgMHgwMSwKKwkweDNDLCAweEZDLCAweDJBLCAweDA3LCAweEQ4LCAweEYxLCAweDNGLCAweDJBLCAweEU2LCAweDM1LCAweEJCLAorCTB4RjEsIDB4OTIsIDB4MDYsIDB4RDIsIDB4RkMsIDB4NjksIDB4MDEsIDB4N0UsIDB4RkYsIDB4MUYsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHhDMCwgMHhGRiwgMHhFOCwgMHgwMCwgMHhBNiwKKwkweEZELCAweDVGLCAweDA1LCAweDMxLCAweEYzLCAweEY2LCAweDNDLCAweDUyLCAweDIxLCAweDM3LCAweEYzLAorCTB4REQsIDB4MDYsIDB4M0IsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgxMywgMHgwMCwgMHhCMSwgMHhGRiwgMHg5RiwgMHgwMCwgMHgyNCwgMHhGRiwgMHhDOSwgMHgwMCwKKwkweDEzLCAweDAwLCAweDhELCAweEZDLCAweEFFLCAweDQ3LCAweDNFLCAweDBDLCAweDU2LCAweEY5LCAweDQ4LAorCTB4MDQsIDB4NTYsIDB4RkQsIDB4NzgsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1OCwgMHhGRiwgMHg4MywgMHgwMSwgMHgzQywgMHhGRCwgMHg3RSwKKwkweDA0LCAweEU2LCAweEY4LCAweDcyLCAweDBELCAweDUyLCAweDQ3LCAweEJFLCAweEZCLCAweDdBLCAweDAwLAorCTB4OTAsIDB4MDAsIDB4NDMsIDB4RkYsIDB4OEYsIDB4MDAsIDB4QjcsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNiwgMHhGQywgMHhGMSwgMHgwNiwKKwkweEY1LCAweEYyLCAweEE3LCAweDIyLCAweEZGLCAweDNCLCAweEU0LCAweEYyLCAweDk2LCAweDA1LCAweDgxLAorCTB4RkQsIDB4RkQsIDB4MDAsIDB4QjUsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgxQywgMHgwMCwgMHg4NiwgMHhGRiwgMHg1OSwgMHgwMSwgMHhFQywgMHhGQywgMHg2RiwgMHgwNiwgMHhEQywKKwkweEYxLCAweDA0LCAweDM3LCAweEYzLCAweDI4LCAweEZDLCAweEYxLCAweDI4LCAweDA3LCAweDM3LCAweEZDLAorCTB4RDgsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDMsCisJMHhGRiwgMHg0OSwgMHgwMCwgMHhENCwgMHhGRiwgMHg4OCwgMHhGRiwgMHg0OSwgMHgwMiwgMHg0QiwgMHhGOCwKKwkweDBELCAweDQ1LCAweDY4LCAweDEzLCAweERGLCAweEY2LCAweDZDLCAweDA1LCAweENDLCAweEZDLCAweEI0LAorCTB4MDEsIDB4NDUsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsCisJMHg3NCwgMHhGRiwgMHgzQSwgMHgwMSwgMHhERCwgMHhGRCwgMHgzOSwgMHgwMywgMHg3QiwgMHhGQiwgMHhDMSwKKwkweDA2LCAweEM3LCAweDQ4LCAweENGLCAweDAwLCAweDBELCAweEZFLCAweEUzLCAweDAxLCAweDhFLCAweEZFLAorCTB4RTcsIDB4MDAsIDB4OTUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsCisJMHhGRiwgMHhEQSwgMHgwMSwgMHg2OSwgMHhGQywgMHg1NywgMHgwNiwgMHhBRiwgMHhGNCwgMHhGNSwgMHgxQSwKKwkweDFELCAweDQxLCAweDExLCAweEY1LCAweDI1LCAweDA0LCAweDZDLCAweEZFLCAweDc0LCAweDAwLCAweEY5LAorCTB4RkYsIDB4RjEsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsCisJMHhBQSwgMHgwMSwgMHg3MSwgMHhGQywgMHgwNywgMHgwNywgMHg3RSwgMHhGMSwgMHg0NCwgMHgzMCwgMHg0NCwKKwkweDMwLCAweDdFLCAweEYxLCAweDA3LCAweDA3LCAweDcxLCAweEZDLCAweEFBLCAweDAxLCAweDVDLCAweEZGLAorCTB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjEsIDB4RkYsIDB4RjksIDB4RkYsIDB4NzQsCisJMHgwMCwgMHg2QywgMHhGRSwgMHgyNSwgMHgwNCwgMHgxMSwgMHhGNSwgMHgxRCwgMHg0MSwgMHhGNSwgMHgxQSwKKwkweEFGLCAweEY0LCAweDU3LCAweDA2LCAweDY5LCAweEZDLCAweERBLCAweDAxLCAweDM4LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTUsIDB4RkYsIDB4RTcsIDB4MDAsIDB4OEUsIDB4RkUsCisJMHhFMywgMHgwMSwgMHgwRCwgMHhGRSwgMHhDRiwgMHgwMCwgMHhDNywgMHg0OCwgMHhDMSwgMHgwNiwgMHg3QiwKKwkweEZCLCAweDM5LCAweDAzLCAweERELCAweEZELCAweDNBLCAweDAxLCAweDc0LCAweEZGLCAweDIzLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDUsIDB4RkYsIDB4QjQsIDB4MDEsIDB4Q0MsCisJMHhGQywgMHg2QywgMHgwNSwgMHhERiwgMHhGNiwgMHg2OCwgMHgxMywgMHgwRCwgMHg0NSwgMHg0QiwgMHhGOCwKKwkweDQ5LCAweDAyLCAweDg4LCAweEZGLCAweEQ0LCAweEZGLCAweDQ5LCAweDAwLCAweEQzLCAweEZGLCAweDBCLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4RDgsIDB4MDEsIDB4MzcsIDB4RkMsCisJMHgyOCwgMHgwNywgMHhGQywgMHhGMSwgMHhGMywgMHgyOCwgMHgwNCwgMHgzNywgMHhEQywgMHhGMSwgMHg2RiwKKwkweDA2LCAweEVDLCAweEZDLCAweDU5LCAweDAxLCAweDg2LCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLAorCTB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QjUsIDB4RkYsIDB4RkQsIDB4MDAsIDB4ODEsIDB4RkQsIDB4OTYsCisJMHgwNSwgMHhFNCwgMHhGMiwgMHhGRiwgMHgzQiwgMHhBNywgMHgyMiwgMHhGNSwgMHhGMiwgMHhGMSwgMHgwNiwKKwkweDM2LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDExLAorCTB4MDAsIDB4QjcsIDB4RkYsIDB4OEYsIDB4MDAsIDB4NDMsIDB4RkYsIDB4OTAsIDB4MDAsIDB4N0EsIDB4MDAsCisJMHhCRSwgMHhGQiwgMHg1MiwgMHg0NywgMHg3MiwgMHgwRCwgMHhFNiwgMHhGOCwgMHg3RSwgMHgwNCwgMHgzQywKKwkweEZELCAweDgzLCAweDAxLCAweDU4LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4NzgsIDB4MDEsIDB4NTYsIDB4RkQsIDB4NDgsIDB4MDQsIDB4NTYsCisJMHhGOSwgMHgzRSwgMHgwQywgMHhBRSwgMHg0NywgMHg4RCwgMHhGQywgMHgxMywgMHgwMCwgMHhDOSwgMHgwMCwKKwkweDI0LCAweEZGLCAweDlGLCAweDAwLCAweEIxLCAweEZGLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0IsIDB4RkMsIDB4REQsIDB4MDYsIDB4MzcsIDB4RjMsCisJMHg1MiwgMHgyMSwgMHhGNiwgMHgzQywgMHgzMSwgMHhGMywgMHg1RiwgMHgwNSwgMHhBNiwgMHhGRCwgMHhFOCwKKwkweDAwLCAweEMwLCAweEZGLCAweDA3LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFGLCAweDAwLAorCTB4N0UsIDB4RkYsIDB4NjksIDB4MDEsIDB4RDIsIDB4RkMsIDB4OTIsIDB4MDYsIDB4QkIsIDB4RjEsIDB4RTYsCisJMHgzNSwgMHgzRiwgMHgyQSwgMHhEOCwgMHhGMSwgMHgyQSwgMHgwNywgMHgzQywgMHhGQywgMHhEMywgMHgwMSwKKwkweDQ1LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweEQ4LCAweEZGLCAweDNBLAorCTB4MDAsIDB4RjEsIDB4RkYsIDB4NTQsIDB4RkYsIDB4QTIsIDB4MDIsIDB4QTksIDB4RjcsIDB4NzcsIDB4NDQsCisJMHhCMSwgMHgxNCwgMHg3NywgMHhGNiwgMHg5QSwgMHgwNSwgMHhCOCwgMHhGQywgMHhCQywgMHgwMSwgMHg0MiwKKwkweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdBLCAweEZGLAorCTB4MkMsIDB4MDEsIDB4RkIsIDB4RkQsIDB4RkUsIDB4MDIsIDB4RUUsIDB4RkIsIDB4QUIsIDB4MDUsIDB4RTEsCisJMHg0OCwgMHhDNywgMHgwMSwgMHg5RCwgMHhGRCwgMHgxRSwgMHgwMiwgMHg2RiwgMHhGRSwgMHhGNSwgMHgwMCwKKwkweDhGLCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ2LAorCTB4MDEsIDB4NzcsIDB4RkMsIDB4MzMsIDB4MDYsIDB4MDksIDB4RjUsIDB4QTEsIDB4MTksIDB4RTEsIDB4NDEsCisJMHg4RCwgMHhGNSwgMHhEQSwgMHgwMywgMHg5QSwgMHhGRSwgMHg1QSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFQywKKwkweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU2LCAweEZGLCAweEI0LCAweDAxLAorCTB4NjIsIDB4RkMsIDB4MTUsIDB4MDcsIDB4ODQsIDB4RjEsIDB4MDksIDB4MkYsIDB4N0IsIDB4MzEsIDB4N0QsCisJMHhGMSwgMHhGNSwgMHgwNiwgMHg4MiwgMHhGQywgMHg5RSwgMHgwMSwgMHg2MiwgMHhGRiwgMHgyOCwgMHgwMCwKKwkweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY2LCAweEZGLCAweEVELCAweEZGLCAweDhFLCAweDAwLCAweDNGLAorCTB4RkUsIDB4NkQsIDB4MDQsIDB4OUUsIDB4RjQsIDB4NEUsIDB4NDAsIDB4NDksIDB4MUMsIDB4NUEsIDB4RjQsCisJMHg3OCwgMHgwNiwgMHg1QywgMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDE4LCAweDAwLCAweDlCLCAweEZGLCAweEQ4LCAweDAwLCAweEFELCAweEZFLCAweEE3LCAweDAxLAorCTB4N0QsIDB4RkUsIDB4REQsIDB4RkYsIDB4QTEsIDB4NDgsIDB4REQsIDB4MDcsIDB4MDcsIDB4RkIsIDB4NzMsCisJMHgwMywgMHhDMCwgMHhGRCwgMHg0OCwgMHgwMSwgMHg2RiwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ5LCAweEZGLCAweEFCLCAweDAxLCAweEUyLCAweEZDLCAweDNELAorCTB4MDUsIDB4NDgsIDB4RjcsIDB4MjIsIDB4MTIsIDB4OUIsIDB4NDUsIDB4RjUsIDB4RjgsIDB4RUQsIDB4MDEsCisJMHhCRSwgMHhGRiwgMHhCNiwgMHhGRiwgMHg1NywgMHgwMCwgMHhDRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweERELCAweDAxLCAweDMzLCAweEZDLCAweDIzLCAweDA3LAorCTB4MjYsIDB4RjIsIDB4QTYsIDB4MjcsIDB4MUQsIDB4MzgsIDB4MDUsIDB4RjIsIDB4NDksIDB4MDYsIDB4MDgsCisJMHhGRCwgMHg0NywgMHgwMSwgMHg4RiwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDBFLCAweDAwLCAweEFBLCAweEZGLCAweDEyLCAweDAxLCAweDVGLCAweEZELCAweENCLCAweDA1LCAweDlFLAorCTB4RjIsIDB4MDMsIDB4M0IsIDB4RkMsIDB4MjMsIDB4QjcsIDB4RjIsIDB4MDMsIDB4MDcsIDB4MzMsIDB4RkMsCisJMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRCwKKwkweEZGLCAweDgwLCAweDAwLCAweDYyLCAweEZGLCAweDU3LCAweDAwLCAweERGLCAweDAwLCAweEY3LCAweEZBLAorCTB4RUQsIDB4NDYsIDB4QUEsIDB4MEUsIDB4NzYsIDB4RjgsIDB4QjIsIDB4MDQsIDB4MjMsIDB4RkQsIDB4OEYsCisJMHgwMSwgMHg1MywgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwKKwkweDYxLCAweEZGLCAweDZDLCAweDAxLCAweDcxLCAweEZELCAweDExLCAweDA0LCAweEM4LCAweEY5LCAweDBFLAorCTB4MEIsIDB4RkQsIDB4NDcsIDB4NjMsIDB4RkQsIDB4QUEsIDB4RkYsIDB4MDMsIDB4MDEsIDB4MDUsIDB4RkYsCisJMHhBRSwgMHgwMCwgMHhBQywgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwKKwkweEZGLCAweEU1LCAweDAxLCAweDQxLCAweEZDLCAweEM2LCAweDA2LCAweDdGLCAweEYzLCAweEZELCAweDFGLAorCTB4RTQsIDB4M0QsIDB4ODcsIDB4RjMsIDB4MjQsIDB4MDUsIDB4Q0MsIDB4RkQsIDB4RDEsIDB4MDAsIDB4Q0IsCisJMHhGRiwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMSwgMHgwMCwgMHg3NiwgMHhGRiwKKwkweDc5LCAweDAxLCAweEJBLCAweEZDLCAweEIxLCAweDA2LCAweEEwLCAweEYxLCAweEMzLCAweDM0LCAweDg5LAorCTB4MkIsIDB4QjksIDB4RjEsIDB4MjksIDB4MDcsIDB4NDQsIDB4RkMsIDB4Q0MsIDB4MDEsIDB4NDksIDB4RkYsCisJMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERSwgMHhGRiwgMHgyQywgMHgwMCwgMHgwRCwKKwkweDAwLCAweDIxLCAweEZGLCAweEY5LCAweDAyLCAweDBGLCAweEY3LCAweEQ0LCAweDQzLCAweEZELCAweDE1LAorCTB4MTMsIDB4RjYsIDB4QzUsIDB4MDUsIDB4QTUsIDB4RkMsIDB4QzQsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMSwKKwkweDE5LCAweEZFLCAweEMzLCAweDAyLCAweDYxLCAweEZDLCAweDlCLCAweDA0LCAweEYyLCAweDQ4LCAweEM2LAorCTB4MDIsIDB4MkMsIDB4RkQsIDB4NUEsIDB4MDIsIDB4NTAsIDB4RkUsIDB4MDQsIDB4MDEsIDB4OEEsIDB4RkYsCisJMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMCwgMHgwMSwgMHg4NiwKKwkweEZDLCAweDBELCAweDA2LCAweDY2LCAweEY1LCAweDUwLCAweDE4LCAweDlFLCAweDQyLCAweDExLCAweEY2LAorCTB4OEMsIDB4MDMsIDB4QzksIDB4RkUsIDB4M0YsIDB4MDAsIDB4MTQsIDB4MDAsIDB4RTcsIDB4RkYsIDB4MDcsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MSwgMHhGRiwgMHhCRSwgMHgwMSwgMHg1NiwgMHhGQywKKwkweDFGLCAweDA3LCAweDkyLCAweEYxLCAweENBLCAweDJELCAweEFGLCAweDMyLCAweDg0LCAweEYxLCAweEUwLAorCTB4MDYsIDB4OTQsIDB4RkMsIDB4OTEsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwMywgMHgwMCwgMHhGQSwgMHhGRiwgMHhFMCwgMHhGRiwgMHhBNywgMHgwMCwgMHgxNSwgMHhGRSwgMHhCMiwKKwkweDA0LCAweDMyLCAweEY0LCAweDc3LCAweDNGLCAweDlFLCAweDFELCAweDA3LCAweEY0LCAweDk2LCAweDA2LAorCTB4NTEsIDB4RkMsIDB4RTIsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsCisJMHgwMCwgMHhBMSwgMHhGRiwgMHhDOSwgMHgwMCwgMHhDRCwgMHhGRSwgMHg2QywgMHgwMSwgMHhFQSwgMHhGRSwKKwkweEYzLCAweEZFLCAweDcwLCAweDQ4LCAweEZGLCAweDA4LCAweDk0LCAweEZBLCAweEFELCAweDAzLCAweEEzLAorCTB4RkQsIDB4NTUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgyRiwgMHgwMCwgMHg0QywgMHhGRiwgMHhBMSwgMHgwMSwgMHhGOCwgMHhGQywgMHgwRCwgMHgwNSwgMHhCMywKKwkweEY3LCAweERGLCAweDEwLCAweDFELCAweDQ2LCAweEE3LCAweEY5LCAweDhFLCAweDAxLCAweEY0LCAweEZGLAorCTB4OTgsIDB4RkYsIDB4NjYsIDB4MDAsIDB4QzcsIDB4RkYsIDB4MEUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsCisJMHgwMCwgMHgzQywgMHhGRiwgMHhFMSwgMHgwMSwgMHgzMSwgMHhGQywgMHgxQSwgMHgwNywgMHg1NiwgMHhGMiwKKwkweDU1LCAweDI2LCAweDJFLCAweDM5LCAweDM1LCAweEYyLCAweDFFLCAweDA2LCAweDI1LCAweEZELCAweDM1LAorCTB4MDEsIDB4OTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsCisJMHhBMCwgMHhGRiwgMHgyNiwgMHgwMSwgMHgzRSwgMHhGRCwgMHhGQiwgMHgwNSwgMHg2MCwgMHhGMiwgMHhGRCwKKwkweDM5LCAweDRFLCAweDI1LCAweDdGLCAweEYyLCAweDExLCAweDA3LCAweDMxLCAweEZDLCAweEUzLCAweDAxLAorCTB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzMsIDB4RkYsIDB4NzEsCisJMHgwMCwgMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwgMHg0MiwgMHgwMSwgMHgzNywgMHhGQSwgMHg3QywgMHg0NiwKKwkweEU3LCAweDBGLCAweDA4LCAweEY4LCAweEU2LCAweDA0LCAweDBCLCAweEZELCAweDk5LCAweDAxLCAweDRGLAorCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsCisJMHg1RiwgMHgwMSwgMHg4RCwgMHhGRCwgMHhEOSwgMHgwMywgMHgzQiwgMHhGQSwgMHhFNCwgMHgwOSwgMHg0MSwKKwkweDQ4LCAweDQxLCAweEZFLCAweDNGLCAweEZGLCAweDNFLCAweDAxLCAweEU1LCAweEZFLCAweEJELCAweDAwLAorCTB4QTYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsCisJMHgwMSwgMHg0QSwgMHhGQywgMHhBQywgMHgwNiwgMHhDQSwgMHhGMywgMHhBNywgMHgxRSwgMHhDQSwgMHgzRSwKKwkweEU0LCAweEYzLCAweEU1LCAweDA0LCAweEY0LCAweEZELCAweEJBLCAweDAwLCAweEQ3LCAweEZGLCAweEZFLAorCTB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4ODcsIDB4MDEsCisJMHhBNCwgMHhGQywgMHhDRCwgMHgwNiwgMHg4RSwgMHhGMSwgMHg5OSwgMHgzMywgMHhDRSwgMHgyQywgMHhBMSwKKwkweEYxLCAweDI1LCAweDA3LCAweDRELCAweEZDLCAweEM0LCAweDAxLCAweDRELCAweEZGLCAweDJGLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MkEsIDB4MDAsIDB4RUYsCisJMHhGRSwgMHg0RCwgMHgwMywgMHg3RCwgMHhGNiwgMHgyQSwgMHg0MywgMHg0QiwgMHgxNywgMHhCMCwgMHhGNSwKKwkweEVGLCAweDA1LCAweDkzLCAweEZDLCAweENCLCAweDAxLCAweDNELCAweEZGLCAweDM0LCAweDAwLCAweEZFLAorCTB4RkYsIDB4MUUsIDB4MDAsIDB4ODUsIDB4RkYsIDB4MTAsIDB4MDEsIDB4MzgsIDB4RkUsIDB4ODgsIDB4MDIsCisJMHhEMywgMHhGQywgMHg5MSwgMHgwMywgMHhGNywgMHg0OCwgMHhDQiwgMHgwMywgMHhCQSwgMHhGQywgMHg5NSwKKwkweDAyLCAweDMxLCAweEZFLCAweDEzLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDAwLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4QzksIDB4MDEsIDB4OTcsIDB4RkMsIDB4RTYsCisJMHgwNSwgMHhDNiwgMHhGNSwgMHgwMCwgMHgxNywgMHg1MCwgMHg0MywgMHg5RCwgMHhGNiwgMHgzQSwgMHgwMywKKwkweEZBLCAweEZFLCAweDIzLCAweDAwLCAweDIxLCAweDAwLCAweEUyLCAweEZGLCAweDA4LCAweDAwLCAweEZELAorCTB4RkYsIDB4MzAsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QzYsIDB4MDEsIDB4NEIsIDB4RkMsIDB4MjYsIDB4MDcsCisJMHhBNSwgMHhGMSwgMHg4NywgMHgyQywgMHhEQywgMHgzMywgMHg5MSwgMHhGMSwgMHhDNywgMHgwNiwgMHhBOSwKKwkweEZDLCAweDg0LCAweDAxLCAweDcwLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweDAzLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4RDQsIDB4RkYsIDB4QkYsIDB4MDAsIDB4RUIsIDB4RkQsIDB4RjMsIDB4MDQsIDB4Q0YsCisJMHhGMywgMHg5OCwgMHgzRSwgMHhGMywgMHgxRSwgMHhCOSwgMHhGMywgMHhCMiwgMHgwNiwgMHg0OCwgMHhGQywKKwkweEU0LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE1LCAweDAwLCAweEE3LAorCTB4RkYsIDB4QjksIDB4MDAsIDB4RUMsIDB4RkUsIDB4MzEsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MEYsIDB4RkUsCisJMHgzMywgMHg0OCwgMHgyNSwgMHgwQSwgMHgyMSwgMHhGQSwgMHhFNSwgMHgwMywgMHg4NywgMHhGRCwgMHg2MiwKKwkweDAxLCAweDY1LCAweEZGLCAweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLAorCTB4NTAsIDB4RkYsIDB4OTcsIDB4MDEsIDB4MTAsIDB4RkQsIDB4REEsIDB4MDQsIDB4MjAsIDB4RjgsIDB4QTAsCisJMHgwRiwgMHg5NywgMHg0NiwgMHg2MSwgMHhGQSwgMHgyRCwgMHgwMSwgMHgyQiwgMHgwMCwgMHg3QSwgMHhGRiwKKwkweDc1LCAweDAwLCAweEMyLCAweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDNBLAorCTB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MEUsIDB4MDcsIDB4OEIsIDB4RjIsIDB4MDMsIDB4MjUsCisJMHgzOCwgMHgzQSwgMHg2RCwgMHhGMiwgMHhGMSwgMHgwNSwgMHg0NSwgMHhGRCwgMHgyMiwgMHgwMSwgMHhBMiwKKwkweEZGLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk2LCAweEZGLAorCTB4MzksIDB4MDEsIDB4MUYsIDB4RkQsIDB4MjgsIDB4MDYsIDB4MkEsIDB4RjIsIDB4RjIsIDB4MzgsIDB4QTAsCisJMHgyNiwgMHg0QiwgMHhGMiwgMHgxQywgMHgwNywgMHgzMiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzQywgMHhGRiwKKwkweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweEM5LCAweEZGLCAweDYzLCAweDAwLCAweDlGLAorCTB4RkYsIDB4RTgsIDB4RkYsIDB4QTMsIDB4MDEsIDB4N0YsIDB4RjksIDB4MDIsIDB4NDYsIDB4MjcsIDB4MTEsCisJMHg5QiwgMHhGNywgMHgxOCwgMHgwNSwgMHhGMywgMHhGQywgMHhBMywgMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwKKwkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZCLCAweEZGLCAweDUyLCAweDAxLAorCTB4QTksIDB4RkQsIDB4QTAsIDB4MDMsIDB4QUUsIDB4RkEsIDB4QkUsIDB4MDgsIDB4N0MsIDB4NDgsIDB4MjYsCisJMHhGRiwgMHhEMiwgMHhGRSwgMHg3OSwgMHgwMSwgMHhDNiwgMHhGRSwgMHhDQywgMHgwMCwgMHhBMCwgMHhGRiwKKwkweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUxLCAweDAxLCAweDUzLAorCTB4RkMsIDB4OTAsIDB4MDYsIDB4MTksIDB4RjQsIDB4NTIsIDB4MUQsIDB4QTgsIDB4M0YsIDB4NDksIDB4RjQsCisJMHhBMywgMHgwNCwgMHgxRSwgMHhGRSwgMHhBMSwgMHgwMCwgMHhFMywgMHhGRiwgMHhGOSwgMHhGRiwgMHgwNCwKKwkweDAwLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY3LCAweEZGLCAweDk0LCAweDAxLCAweDkwLCAweEZDLAorCTB4RTUsIDB4MDYsIDB4ODEsIDB4RjEsIDB4NkIsIDB4MzIsIDB4MTEsIDB4MkUsIDB4OEUsIDB4RjEsIDB4MUQsCisJMHgwNywgMHg1OCwgMHhGQywgMHhCQywgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDA3LCAweDAwLCAweEU4LCAweEZGLCAweDExLCAweDAwLCAweDQ1LCAweDAwLCAweEJGLCAweEZFLCAweDlELAorCTB4MDMsIDB4RjMsIDB4RjUsIDB4NzUsIDB4NDIsIDB4OUIsIDB4MTgsIDB4NTEsIDB4RjUsIDB4MTYsIDB4MDYsCisJMHg4MywgMHhGQywgMHhEMSwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwKKwkweDAwLCAweDhCLCAweEZGLCAweDAxLCAweDAxLCAweDU2LCAweEZFLCAweDRELCAweDAyLCAweDQ1LCAweEZELAorCTB4OEQsIDB4MDIsIDB4RjAsIDB4NDgsIDB4RDcsIDB4MDQsIDB4NDcsIDB4RkMsIDB4RDEsIDB4MDIsIDB4MTIsCisJMHhGRSwgMHgyMSwgMHgwMSwgMHg3RSwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDMzLCAweDAwLCAweDQwLCAweEZGLCAweEMyLCAweDAxLCAweEE5LCAweEZDLCAweEJDLCAweDA1LCAweDI5LAorCTB4RjYsIDB4QjMsIDB4MTUsIDB4RkEsIDB4NDMsIDB4MzEsIDB4RjcsIDB4RTYsIDB4MDIsIDB4MkMsIDB4RkYsCisJMHgwNywgMHgwMCwgMHgyRiwgMHgwMCwgMHhEQywgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwKKwkweDAwLCAweDQ4LCAweEZGLCAweENFLCAweDAxLCAweDQyLCAweEZDLCAweDJBLCAweDA3LCAweEJGLCAweEYxLAorCTB4NDAsIDB4MkIsIDB4MDUsIDB4MzUsIDB4QTYsIDB4RjEsIDB4QUIsIDB4MDYsIDB4QkYsIDB4RkMsIDB4NzUsCisJMHgwMSwgMHg3NywgMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwKKwkweEM4LCAweEZGLCAweEQ2LCAweDAwLCAweEM0LCAweEZELCAweDMxLCAweDA1LCAweDczLCAweEYzLCAweEIwLAorCTB4M0QsIDB4NDksIDB4MjAsIDB4NkUsIDB4RjMsIDB4Q0IsIDB4MDYsIDB4NDAsIDB4RkMsIDB4RTYsIDB4MDEsCisJMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBRCwgMHhGRiwgMHhBQSwKKwkweDAwLCAweDBDLCAweEZGLCAweEY3LCAweDAwLCAweEMxLCAweEZGLCAweDMzLCAweEZELCAweEVDLCAweDQ3LAorCTB4NTEsIDB4MEIsIDB4QUYsIDB4RjksIDB4MUQsIDB4MDQsIDB4NkIsIDB4RkQsIDB4NkUsIDB4MDEsIDB4NjAsCisJMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NCwgMHhGRiwKKwkweDhDLCAweDAxLCAweDI5LCAweEZELCAweEE3LCAweDA0LCAweDhGLCAweEY4LCAweDY0LCAweDBFLCAweDAyLAorCTB4NDcsIDB4MjIsIDB4RkIsIDB4QzksIDB4MDAsIDB4NjQsIDB4MDAsIDB4NUIsIDB4RkYsIDB4ODQsIDB4MDAsCisJMHhCQywgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNSwKKwkweDAxLCAweDMzLCAweEZDLCAweEZGLCAweDA2LCAweEM0LCAweEYyLCAweEIwLCAweDIzLCAweDNCLCAweDNCLAorCTB4QUQsIDB4RjIsIDB4QkYsIDB4MDUsIDB4NjYsIDB4RkQsIDB4MEUsIDB4MDEsIDB4QUMsIDB4RkYsIDB4MEUsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOSwgMHgwMCwgMHg4RCwgMHhGRiwgMHg0QiwgMHgwMSwKKwkweDAxLCAweEZELCAweDUxLCAweDA2LCAweEZCLCAweEYxLCAweERGLCAweDM3LCAweEYwLCAweDI3LCAweDFDLAorCTB4RjIsIDB4MjQsIDB4MDcsIDB4MzQsIDB4RkMsIDB4REMsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhDRSwgMHhGRiwgMHg1NCwgMHgwMCwgMHhCRCwgMHhGRiwgMHhCMiwKKwkweEZGLCAweDAxLCAweDAyLCAweENGLCAweEY4LCAweDdELCAweDQ1LCAweDZCLCAweDEyLCAweDMwLCAweEY3LAorCTB4NDgsIDB4MDUsIDB4REQsIDB4RkMsIDB4QUQsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MCwgMHhGRiwgMHg0NSwgMHgwMSwgMHhDNiwgMHhGRCwKKwkweDY2LCAweDAzLCAweDIxLCAweEZCLCAweDlFLCAweDA3LCAweEFBLCAweDQ4LCAweDEyLCAweDAwLCAweDY0LAorCTB4RkUsIDB4QjQsIDB4MDEsIDB4QTYsIDB4RkUsIDB4REIsIDB4MDAsIDB4OUEsIDB4RkYsIDB4MTksIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERSwgMHgwMSwgMHg1RiwgMHhGQywgMHg3MCwKKwkweDA2LCAweDZDLCAweEY0LCAweEZELCAweDFCLCAweDdELCAweDQwLCAweEI3LCAweEY0LCAweDVELCAweDA0LAorCTB4NDksIDB4RkUsIDB4ODgsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RjUsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgyOSwgMHgwMCwgMHg2MSwgMHhGRiwgMHhBMSwgMHgwMSwgMHg3RSwgMHhGQywgMHhGOSwgMHgwNiwKKwkweDdDLCAweEYxLCAweDM4LCAweDMxLCAweDUwLCAweDJGLCAweDgyLCAweEYxLCAweDEyLCAweDA3LCAweDY1LAorCTB4RkMsIDB4QjIsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsCisJMHhFRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg5MCwgMHhGRSwgMHhFQiwgMHgwMywgMHg3MSwKKwkweEY1LCAweEI3LCAweDQxLCAweEVELCAweDE5LCAweEY1LCAweEY0LCAweDNCLCAweDA2LCAweDczLCAweEZDLAorCTB4RDcsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTEsCisJMHhGRiwgMHhGMiwgMHgwMCwgMHg3NiwgMHhGRSwgMHgxMSwgMHgwMiwgMHhCNiwgMHhGRCwgMHg4RiwgMHgwMSwKKwkweERFLCAweDQ4LCAweEU5LCAweDA1LCAweEQ0LCAweEZCLCAweDBDLCAweDAzLCAweEY0LCAweEZELCAweDJGLAorCTB4MDEsIDB4NzksIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsCisJMHg0MywgMHhGRiwgMHhCQSwgMHgwMSwgMHhCQywgMHhGQywgMHg5MCwgMHgwNSwgMHg4RSwgMHhGNiwgMHg2OCwKKwkweDE0LCAweDk5LCAweDQ0LCAweENELCAweEY3LCAweDhGLCAweDAyLCAweDYwLCAweEZGLCAweEVBLCAweEZGLAorCTB4M0UsIDB4MDAsIDB4RDcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsCisJMHhGRiwgMHhENCwgMHgwMSwgMHgzQiwgMHhGQywgMHgyQSwgMHgwNywgMHhERiwgMHhGMSwgMHhGNiwgMHgyOSwKKwkweDI3LCAweDM2LCAweEMxLCAweEYxLCAweDhCLCAweDA2LCAweEQ4LCAweEZDLCAweDY2LCAweDAxLCAweDgwLAorCTB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QkQsIDB4RkYsCisJMHhFRCwgMHgwMCwgMHg5RSwgMHhGRCwgMHg2QywgMHgwNSwgMHgxRiwgMHhGMywgMHhDMCwgMHgzQywgMHg5RSwKKwkweDIxLCAweDI4LCAweEYzLCAweEUyLCAweDA2LCAweDNBLCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OUIsIDB4MDAsIDB4MkIsCisJMHhGRiwgMHhCRCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RSwgMHhGQywgMHg5QSwgMHg0NywgMHg4MiwgMHgwQywKKwkweDNELCAweEY5LCAweDU0LCAweDA0LCAweDUwLCAweEZELCAweDdBLCAweDAxLCAweDVCLCAweEZGLCAweDJBLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4ODEsIDB4MDEsCisJMHg0MiwgMHhGRCwgMHg3MiwgMHgwNCwgMHhGRiwgMHhGOCwgMHgyRCwgMHgwRCwgMHg2OSwgMHg0NywgMHhFQiwKKwkweEZCLCAweDYzLCAweDAwLCAweDlELCAweDAwLCAweDNDLCAweEZGLCAweDkzLCAweDAwLCAweEI2LCAweEZGLAorCTB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzcsCisJMHhGQywgMHhFRCwgMHgwNiwgMHgwMywgMHhGMywgMHg1QiwgMHgyMiwgMHgzNywgMHgzQywgMHhGNCwgMHhGMiwKKwkweDhBLCAweDA1LCAweDg5LCAweEZELCAweEY5LCAweDAwLCAweEI3LCAweEZGLCAweDBBLCAweDAwLCAweDAxLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4ODQsIDB4RkYsIDB4NUMsIDB4MDEsIDB4RTYsIDB4RkMsCisJMHg3NywgMHgwNiwgMHhENCwgMHhGMSwgMHhDNiwgMHgzNiwgMHgzRSwgMHgyOSwgMHhGMywgMHhGMSwgMHgyOSwKKwkweDA3LCAweDM4LCAweEZDLCAweEQ3LCAweDAxLCAweDQyLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLAorCTB4MEIsIDB4MDAsIDB4RDQsIDB4RkYsIDB4NDYsIDB4MDAsIDB4REEsIDB4RkYsIDB4N0QsIDB4RkYsIDB4NUQsCisJMHgwMiwgMHgyNiwgMHhGOCwgMHhFRCwgMHg0NCwgMHhCMSwgMHgxMywgMHhDNywgMHhGNiwgMHg3NywgMHgwNSwKKwkweEM4LCAweEZDLCAweEI2LCAweDAxLCAweDQ1LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAorCTB4MDAsIDB4MjIsIDB4MDAsIDB4NzYsIDB4RkYsIDB4MzcsIDB4MDEsIDB4RTQsIDB4RkQsIDB4MkMsIDB4MDMsCisJMHg5NCwgMHhGQiwgMHg4MywgMHgwNiwgMHhDRSwgMHg0OCwgMHgwNSwgMHgwMSwgMHhGNSwgMHhGRCwgMHhGMCwKKwkweDAxLCAweDg3LCAweEZFLCAweEVBLCAweDAwLCAweDk0LCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLAorCTB4MzUsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RDksIDB4MDEsIDB4NkMsIDB4RkMsIDB4NEYsIDB4MDYsIDB4QzMsCisJMHhGNCwgMHhBOSwgMHgxQSwgMHg0OSwgMHg0MSwgMHgyQywgMHhGNSwgMHgxNSwgMHgwNCwgMHg3NiwgMHhGRSwKKwkweDZFLCAweDAwLCAweEZDLCAweEZGLCAweEYwLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJCLAorCTB4MDAsIDB4NUEsIDB4RkYsIDB4QUMsIDB4MDEsIDB4NkUsIDB4RkMsIDB4MEEsIDB4MDcsIDB4N0UsIDB4RjEsCisJMHhGRiwgMHgyRiwgMHg4QSwgMHgzMCwgMHg3RCwgMHhGMSwgMHgwMywgMHgwNywgMHg3NSwgMHhGQywgMHhBNywKKwkweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEYyLCAweEZGLAorCTB4RjcsIDB4RkYsIDB4N0EsIDB4MDAsIDB4NjIsIDB4RkUsIDB4MzUsIDB4MDQsIDB4RjcsIDB4RjQsIDB4RUYsCisJMHg0MCwgMHg0MCwgMHgxQiwgMHg5QywgMHhGNCwgMHg1RSwgMHgwNiwgMHg2NiwgMHhGQywgMHhEQiwgMHgwMSwKKwkweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDFBLCAweDAwLCAweDk2LCAweEZGLCAweEUzLAorCTB4MDAsIDB4OTUsIDB4RkUsIDB4RDUsIDB4MDEsIDB4MjYsIDB4RkUsIDB4OTgsIDB4MDAsIDB4QkYsIDB4NDgsCisJMHgwMCwgMHgwNywgMHg2MSwgMHhGQiwgMHg0NiwgMHgwMywgMHhENiwgMHhGRCwgMHgzRCwgMHgwMSwgMHg3MywKKwkweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLAorCTB4QjIsIDB4MDEsIDB4RDEsIDB4RkMsIDB4NjIsIDB4MDUsIDB4RjYsIDB4RjYsIDB4MjAsIDB4MTMsIDB4MkUsCisJMHg0NSwgMHg3MCwgMHhGOCwgMHgzNCwgMHgwMiwgMHg5NCwgMHhGRiwgMHhDRCwgMHhGRiwgMHg0QywgMHgwMCwKKwkweEQyLCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweERBLAorCTB4MDEsIDB4MzYsIDB4RkMsIDB4MjcsIDB4MDcsIDB4MDUsIDB4RjIsIDB4QUEsIDB4MjgsIDB4NDQsIDB4MzcsCisJMHhFNCwgMHhGMSwgMHg2NywgMHgwNiwgMHhGMiwgMHhGQywgMHg1NSwgMHgwMSwgMHg4OCwgMHhGRiwgMHgxQiwKKwkweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBCLCAweDAwLCAweEIyLCAweEZGLCAweDAyLCAweDAxLAorCTB4N0EsIDB4RkQsIDB4QTIsIDB4MDUsIDB4RDQsIDB4RjIsIDB4QzcsIDB4M0IsIDB4RjIsIDB4MjIsIDB4RTcsCisJMHhGMiwgMHhGNSwgMHgwNiwgMHgzNSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweEZELCAweEZGLCAweDExLCAweDAwLCAweEI5LCAweEZGLCAweDhDLCAweDAwLCAweDRBLCAweEZGLCAweDgzLAorCTB4MDAsIDB4OTEsIDB4MDAsIDB4OTEsIDB4RkIsIDB4M0QsIDB4NDcsIDB4QjcsIDB4MEQsIDB4Q0QsIDB4RjgsCisJMHg4OSwgMHgwNCwgMHgzNiwgMHhGRCwgMHg4NiwgMHgwMSwgMHg1NywgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVELCAweEZGLCAweDc1LCAweDAxLCAweDVDLCAweEZELAorCTB4M0MsIDB4MDQsIDB4NzAsIDB4RjksIDB4RkEsIDB4MEIsIDB4QzAsIDB4NDcsIDB4QkMsIDB4RkMsIDB4RkMsCisJMHhGRiwgMHhENiwgMHgwMCwgMHgxRCwgMHhGRiwgMHhBMiwgMHgwMCwgMHhCMCwgMHhGRiwgMHgxMywgMHgwMCwKKwkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNDLCAweEZDLCAweEQ4LAorCTB4MDYsIDB4NDcsIDB4RjMsIDB4MDYsIDB4MjEsIDB4MkEsIDB4M0QsIDB4NDQsIDB4RjMsIDB4NTIsIDB4MDUsCisJMHhBRSwgMHhGRCwgMHhFMywgMHgwMCwgMHhDMiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDFGLCAweDAwLCAweDdDLCAweEZGLCAweDZELCAweDAxLCAweENELCAweEZDLCAweDk5LCAweDA2LAorCTB4QjQsIDB4RjEsIDB4QTYsIDB4MzUsIDB4ODksIDB4MkEsIDB4RDAsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0UsCisJMHhGQywgMHhEMSwgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwKKwkweEQ5LCAweEZGLCAweDM3LCAweDAwLCAweEY3LCAweEZGLCAweDQ5LCAweEZGLCAweEI2LCAweDAyLCAweDg2LAorCTB4RjcsIDB4NTMsIDB4NDQsIDB4RkIsIDB4MTQsIDB4NjEsIDB4RjYsIDB4QTQsIDB4MDUsIDB4QjQsIDB4RkMsCisJMHhCRSwgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwKKwkweDAwLCAweDdCLCAweEZGLCAweDI5LCAweDAxLCAweDAxLCAweEZFLCAweEYxLCAweDAyLCAweDA3LCAweEZDLAorCTB4NkUsIDB4MDUsIDB4RTYsIDB4NDgsIDB4RkYsIDB4MDEsIDB4ODQsIDB4RkQsIDB4MkMsIDB4MDIsIDB4NjgsCisJMHhGRSwgMHhGOSwgMHgwMCwgMHg4RSwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKKwkweDNBLCAweEZGLCAweEQ0LCAweDAxLCAweDdBLCAweEZDLCAweDJCLCAweDA2LCAweDFFLCAweEY1LCAweDU2LAorCTB4MTksIDB4MEMsIDB4NDIsIDB4QUEsIDB4RjUsIDB4QzksIDB4MDMsIDB4QTQsIDB4RkUsIDB4NTQsIDB4MDAsCisJMHgwOSwgMHgwMCwgMHhFQiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1NSwKKwkweEZGLCAweEI2LCAweDAxLCAweDVGLCAweEZDLCAweDE3LCAweDA3LCAweDg3LCAweEYxLCAweEMyLCAweDJFLAorCTB4QzAsIDB4MzEsIDB4N0UsIDB4RjEsIDB4RjEsIDB4MDYsIDB4ODYsIDB4RkMsIDB4OUIsIDB4MDEsIDB4NjMsCisJMHhGRiwgMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNywgMHhGRiwgMHhFQSwgMHhGRiwKKwkweDkzLCAweDAwLCAweDM2LCAweEZFLCAweDdELCAweDA0LCAweDg1LCAweEY0LCAweDFGLCAweDQwLCAweDk0LAorCTB4MUMsIDB4NDcsIDB4RjQsIDB4N0UsIDB4MDYsIDB4NUEsIDB4RkMsIDB4REYsIDB4MDEsIDB4MzcsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5QywgMHhGRiwgMHhENCwgMHgwMCwgMHhCNCwKKwkweEZFLCAweDlBLCAweDAxLCAweDk1LCAweEZFLCAweEE4LCAweEZGLCAweDk4LCAweDQ4LCAweDFELCAweDA4LAorCTB4RUUsIDB4RkEsIDB4ODAsIDB4MDMsIDB4QjksIDB4RkQsIDB4NEIsIDB4MDEsIDB4NkUsIDB4RkYsIDB4MjUsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhBOSwgMHgwMSwKKwkweEU3LCAweEZDLCAweDMzLCAweDA1LCAweDYwLCAweEY3LCAweERBLCAweDExLCAweEI4LCAweDQ1LCAweDFDLAorCTB4RjksIDB4RDgsIDB4MDEsIDB4Q0EsIDB4RkYsIDB4QUYsIDB4RkYsIDB4NUEsIDB4MDAsIDB4Q0MsIDB4RkYsCisJMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhERSwgMHgwMSwgMHgzMywKKwkweEZDLCAweDIxLCAweDA3LCAweDMwLCAweEYyLCAweDVDLCAweDI3LCAweDVCLCAweDM4LCAweDBGLCAweEYyLAorCTB4NDAsIDB4MDYsIDB4MEUsIDB4RkQsIDB4NDMsIDB4MDEsIDB4OTEsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHgxNywgMHgwMSwgMHg1NywgMHhGRCwKKwkweEQ2LCAweDA1LCAweDkwLCAweEYyLCAweEM4LCAweDNBLCAweDQ2LCAweDI0LCAweEFBLCAweEYyLCAweDA2LAorCTB4MDcsIDB4MzIsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgxMCwgMHgwMCwgMHhCRSwgMHhGRiwgMHg3RCwgMHgwMCwgMHg2OSwgMHhGRiwgMHg0QiwgMHgwMCwgMHhGNiwKKwkweDAwLCAweENCLCAweEZBLCAweEQzLCAweDQ2LCAweEYwLCAweDBFLCAweDVFLCAweEY4LCAweEJFLCAweDA0LAorCTB4MUUsIDB4RkQsIDB4OTEsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgyOCwgMHgwMCwgMHg2MiwgMHhGRiwgMHg2OSwgMHgwMSwgMHg3NywgMHhGRCwgMHgwNCwgMHgwNCwKKwkweEUyLCAweEY5LCAweENCLCAweDBBLCAweDBELCAweDQ4LCAweDk0LCAweEZELCAweDkyLCAweEZGLCAweDEwLAorCTB4MDEsIDB4RkUsIDB4RkUsIDB4QjEsIDB4MDAsIDB4QUEsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0MywgMHhGQywgMHhDMCwgMHgwNiwgMHg4RiwKKwkweEYzLCAweEIxLCAweDFGLCAweDE4LCAweDNFLCAweDlCLCAweEYzLCAweDE2LCAweDA1LCAweEQ1LCAweEZELAorCTB4Q0MsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjIsCisJMHgwMCwgMHg3NCwgMHhGRiwgMHg3QywgMHgwMSwgMHhCNSwgMHhGQywgMHhCOCwgMHgwNiwgMHg5QywgMHhGMSwKKwkweDgxLCAweDM0LCAweEQxLCAweDJCLCAweEIzLCAweEYxLCAweDI5LCAweDA3LCAweDQ2LCAweEZDLCAweENBLAorCTB4MDEsIDB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REYsIDB4RkYsCisJMHgyOSwgMHgwMCwgMHgxNCwgMHgwMCwgMHgxNiwgMHhGRiwgMHgwQywgMHgwMywgMHhFRSwgMHhGNiwgMHhCMCwKKwkweDQzLCAweDQ3LCAweDE2LCAweEZDLCAweEY1LCAweENGLCAweDA1LCAweEExLCAweEZDLCAweEM2LCAweDAxLAorCTB4M0YsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODEsCisJMHhGRiwgMHgxQiwgMHgwMSwgMHgyMCwgMHhGRSwgMHhCNiwgMHgwMiwgMHg3QSwgMHhGQywgMHg1RiwgMHgwNCwKKwkweEY0LCAweDQ4LCAweEZGLCAweDAyLCAweDEzLCAweEZELCAweDY3LCAweDAyLCAweDQ5LCAweEZFLCAweDA3LAorCTB4MDEsIDB4ODgsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsCisJMHhDRiwgMHgwMSwgMHg4QSwgMHhGQywgMHgwNSwgMHgwNiwgMHg3QiwgMHhGNSwgMHgwNiwgMHgxOCwgMHhDNywKKwkweDQyLCAweDJGLCAweEY2LCAweDdBLCAweDAzLCAweEQ0LCAweEZFLCAweDM5LCAweDAwLCAweDE3LCAweDAwLAorCTB4RTYsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4QzAsCisJMHgwMSwgMHg1MywgMHhGQywgMHgyMSwgMHgwNywgMHg5NiwgMHhGMSwgMHg4MiwgMHgyRCwgMHhGMiwgMHgzMiwKKwkweDg2LCAweEYxLCAweERCLCAweDA2LCAweDk5LCAweEZDLCAweDhFLCAweDAxLCAweDZBLCAweEZGLCAweDI1LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkIsIDB4RkYsIDB4REUsIDB4RkYsIDB4QUMsIDB4MDAsCisJMHgwQiwgMHhGRSwgMHhDMSwgMHgwNCwgMHgxQiwgMHhGNCwgMHg0NywgMHgzRiwgMHhFQSwgMHgxRCwgMHhGNSwKKwkweEYzLCAweDlDLCAweDA2LCAweDRGLCAweEZDLCAweEUyLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTIsIDB4RkYsIDB4QzUsIDB4MDAsIDB4RDQsIDB4RkUsIDB4NUYsCisJMHgwMSwgMHgwMywgMHhGRiwgMHhCRiwgMHhGRSwgMHg2MywgMHg0OCwgMHg0MCwgMHgwOSwgMHg3QiwgMHhGQSwKKwkweEI5LCAweDAzLCAweDlELCAweEZELCAweDU4LCAweDAxLCAweDY5LCAweEZGLCAweDI2LCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEQsIDB4RkYsIDB4OUYsIDB4MDEsIDB4RkUsIDB4RkMsCisJMHgwMiwgMHgwNSwgMHhDQiwgMHhGNywgMHg5OCwgMHgxMCwgMHgzOSwgMHg0NiwgMHhEMCwgMHhGOSwgMHg3OCwKKwkweDAxLCAweDAwLCAweDAwLCAweDkxLCAweEZGLCAweDY5LCAweDAwLCAweEM2LCAweEZGLCAweDBFLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTcsCisJMHgwNywgMHg2MSwgMHhGMiwgMHgwQSwgMHgyNiwgMHg2QSwgMHgzOSwgMHg0MSwgMHhGMiwgMHgxNSwgMHgwNiwKKwkweDJDLCAweEZELCAweDMxLCAweDAxLCAweDlCLCAweEZGLCAweDE0LCAweDAwLCAweEZGLCAweEZGLCAweEZGLAorCTB4RkYsIDB4MTMsIDB4MDAsIDB4OUUsIDB4RkYsIDB4MkIsIDB4MDEsIDB4MzcsIDB4RkQsIDB4MDUsIDB4MDYsCisJMHg1NCwgMHhGMiwgMHhDMiwgMHgzOSwgMHg5OSwgMHgyNSwgMHg3MywgMHhGMiwgMHgxNCwgMHgwNywgMHgzMSwKKwkweEZDLCAweEUzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLAorCTB4QzQsIDB4RkYsIDB4NkUsIDB4MDAsIDB4ODcsIDB4RkYsIDB4MTMsIDB4MDAsIDB4NTgsIDB4MDEsIDB4MEQsCisJMHhGQSwgMHg2MSwgMHg0NiwgMHgyRCwgMHgxMCwgMHhGMCwgMHhGNywgMHhGMSwgMHgwNCwgMHgwNSwgMHhGRCwKKwkweDlDLCAweDAxLCAweDRFLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LAorCTB4MDAsIDB4NjcsIDB4RkYsIDB4NUMsIDB4MDEsIDB4OTMsIDB4RkQsIDB4Q0MsIDB4MDMsIDB4NTQsIDB4RkEsCisJMHhBMiwgMHgwOSwgMHg0RiwgMHg0OCwgMHg3MywgMHhGRSwgMHgyNywgMHhGRiwgMHg0QiwgMHgwMSwgMHhERSwKKwkweEZFLCAweEMwLCAweDAwLCAweEE0LCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAorCTB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEMsIDB4RkMsIDB4QTYsIDB4MDYsIDB4REIsIDB4RjMsIDB4NUIsCisJMHgxRSwgMHhGQywgMHgzRSwgMHhGQSwgMHhGMywgMHhENywgMHgwNCwgMHhGRCwgMHhGRCwgMHhCNCwgMHgwMCwKKwkweEQ5LCAweEZGLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZELAorCTB4RkYsIDB4OEEsIDB4MDEsIDB4OUYsIDB4RkMsIDB4RDMsIDB4MDYsIDB4OEEsIDB4RjEsIDB4NTcsIDB4MzMsCisJMHgxNywgMHgyRCwgMHg5QywgMHhGMSwgMHgyNCwgMHgwNywgMHg0RiwgMHhGQywgMHhDMywgMHgwMSwgMHg0RSwKKwkweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweDA4LCAweDAwLCAweEU0LCAweEZGLCAweDFCLCAweDAwLAorCTB4MzAsIDB4MDAsIDB4RTQsIDB4RkUsIDB4NUYsIDB4MDMsIDB4NUUsIDB4RjYsIDB4MDIsIDB4NDMsIDB4OTYsCisJMHgxNywgMHg5QiwgMHhGNSwgMHhGOCwgMHgwNSwgMHg4RiwgMHhGQywgMHhDQywgMHgwMSwgMHgzRCwgMHhGRiwKKwkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLCAweDg2LCAweEZGLCAweDBDLCAweDAxLCAweDNFLAorCTB4RkUsIDB4N0IsIDB4MDIsIDB4RUQsIDB4RkMsIDB4NTYsIDB4MDMsIDB4RjUsIDB4NDgsIDB4MDYsIDB4MDQsCisJMHhBMSwgMHhGQywgMHhBMywgMHgwMiwgMHgyQSwgMHhGRSwgMHgxNiwgMHgwMSwgMHg4MywgMHhGRiwgMHgxRiwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNFLCAweEZGLCAweEM4LCAweDAxLAorCTB4OUIsIDB4RkMsIDB4REQsIDB4MDUsIDB4REMsIDB4RjUsIDB4QjYsIDB4MTYsIDB4NzcsIDB4NDMsIDB4QkQsCisJMHhGNiwgMHgyOCwgMHgwMywgMHgwNSwgMHhGRiwgMHgxRCwgMHgwMCwgMHgyNSwgMHgwMCwgMHhFMSwgMHhGRiwKKwkweDA4LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRCLCAweEZGLCAweEM4LCAweDAxLCAweDQ5LAorCTB4RkMsIDB4MjcsIDB4MDcsIDB4QUIsIDB4RjEsIDB4M0UsIDB4MkMsIDB4MUUsIDB4MzQsIDB4OTUsIDB4RjEsCisJMHhDMSwgMHgwNiwgMHhBRSwgMHhGQywgMHg4MSwgMHgwMSwgMHg3MSwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwKKwkweEZGLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEZGLCAweEM0LCAweDAwLCAweEUyLCAweEZELAorCTB4MDEsIDB4MDUsIDB4QkEsIDB4RjMsIDB4NjQsIDB4M0UsIDB4M0YsIDB4MUYsIDB4QTgsIDB4RjMsIDB4QjgsCisJMHgwNiwgMHg0NiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDE1LCAweDAwLCAweEE4LCAweEZGLCAweEI2LCAweDAwLCAweEYzLCAweEZFLCAweDI0LCAweDAxLCAweDZFLAorCTB4RkYsIDB4REUsIDB4RkQsIDB4MjUsIDB4NDgsIDB4NjgsIDB4MEEsIDB4MDgsIDB4RkEsIDB4RjIsIDB4MDMsCisJMHg4MSwgMHhGRCwgMHg2NSwgMHgwMSwgMHg2NCwgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDJELCAweDAwLCAweDUxLCAweEZGLCAweDk1LCAweDAxLCAweDE1LCAweEZELCAweENGLCAweDA0LAorCTB4MzksIDB4RjgsIDB4NTksIDB4MEYsIDB4QUYsIDB4NDYsIDB4OEIsIDB4RkEsIDB4MTcsIDB4MDEsIDB4MzgsCisJMHgwMCwgMHg3MywgMHhGRiwgMHg3OCwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDBCLCAweDA3LCAweDk3LAorCTB4RjIsIDB4QjgsIDB4MjQsIDB4NzEsIDB4M0EsIDB4N0IsIDB4RjIsIDB4RTYsIDB4MDUsIDB4NEMsIDB4RkQsCisJMHgxRCwgMHgwMSwgMHhBNCwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNiwKKwkweDAwLCAweDk0LCAweEZGLCAweDNELCAweDAxLCAweDE4LCAweEZELCAweDMyLCAweDA2LCAweDFGLCAweEYyLAorCTB4QjUsIDB4MzgsIDB4RUIsIDB4MjYsIDB4NDAsIDB4RjIsIDB4MUUsIDB4MDcsIDB4MzIsIDB4RkMsIDB4REYsCisJMHgwMSwgMHgzRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDQSwgMHhGRiwKKwkweDVGLCAweDAwLCAweEE1LCAweEZGLCAweERDLCAweEZGLCAweEI4LCAweDAxLCAweDU3LCAweEY5LCAweEU1LAorCTB4NDUsIDB4NkUsIDB4MTEsIDB4ODMsIDB4RjcsIDB4MjMsIDB4MDUsIDB4RUUsIDB4RkMsIDB4QTYsIDB4MDEsCisJMHg0QiwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QywKKwkweEZGLCAweDRGLCAweDAxLCAweEIwLCAweEZELCAweDkzLCAweDAzLCAweEM3LCAweEZBLCAweDdELCAweDA4LAorCTB4ODYsIDB4NDgsIDB4NUEsIDB4RkYsIDB4QkEsIDB4RkUsIDB4ODYsIDB4MDEsIDB4QkYsIDB4RkUsIDB4Q0YsCisJMHgwMCwgMHg5RSwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKKwkweEUwLCAweDAxLCAweDU2LCAweEZDLCAweDg5LCAweDA2LCAweDJCLCAweEY0LCAweDA2LCAweDFELCAweEQ3LAorCTB4M0YsIDB4NjEsIDB4RjQsIDB4OTQsIDB4MDQsIDB4MjcsIDB4RkUsIDB4OUMsIDB4MDAsIDB4RTYsIDB4RkYsCisJMHhGOCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwgMHg5NywKKwkweDAxLCAweDhDLCAweEZDLCAweEVBLCAweDA2LCAweDgwLCAweEYxLCAweDI2LCAweDMyLCAweDU4LCAweDJFLAorCTB4OEIsIDB4RjEsIDB4MUIsIDB4MDcsIDB4NUIsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NTMsIDB4RkYsIDB4MkQsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFOSwgMHhGRiwgMHgwRSwgMHgwMCwgMHg0QiwgMHgwMCwKKwkweEI0LCAweEZFLCAweEFGLCAweDAzLCAweEQ1LCAweEY1LCAweDRELCAweDQyLCAweEU2LCAweDE4LCAweDNDLAorCTB4RjUsIDB4MUYsIDB4MDYsIDB4N0YsIDB4RkMsIDB4RDMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4QywgMHhGRiwgMHhGRSwgMHgwMCwgMHg1RCwgMHhGRSwgMHgzRiwKKwkweDAyLCAweDVFLCAweEZELCAweDU0LCAweDAyLCAweEVDLCAweDQ4LCAweDEzLCAweDA1LCAweDJFLCAweEZDLAorCTB4REUsIDB4MDIsIDB4MEMsIDB4RkUsIDB4MjQsIDB4MDEsIDB4N0QsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MSwgMHhGRiwgMHhDMSwgMHgwMSwgMHhBRCwgMHhGQywKKwkweEIyLCAweDA1LCAweDNGLCAweEY2LCAweDY5LCAweDE1LCAweDFGLCAweDQ0LCAweDUzLCAweEY3LCAweEQzLAorCTB4MDIsIDB4MzgsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MzMsIDB4MDAsIDB4REIsIDB4RkYsIDB4MDksIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NywgMHhGRiwgMHhDRiwgMHgwMSwgMHg0MCwgMHhGQywgMHgyQSwKKwkweDA3LCAweEM2LCAweEYxLCAweEY3LCAweDJBLCAweDQ2LCAweDM1LCAweEFCLCAweEYxLCAweEE0LCAweDA2LAorCTB4QzQsIDB4RkMsIDB4NzIsIDB4MDEsIDB4NzksIDB4RkYsIDB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsCisJMHgwMCwgMHgwNCwgMHgwMCwgMHhDNiwgMHhGRiwgMHhEQiwgMHgwMCwgMHhCQiwgMHhGRCwgMHgzRSwgMHgwNSwKKwkweDYwLCAweEYzLCAweDdCLCAweDNELCAweDk0LCAweDIwLCAweDVFLCAweEYzLCAweEQwLCAweDA2LCAweDNFLAorCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsCisJMHhBRSwgMHhGRiwgMHhBNywgMHgwMCwgMHgxMiwgMHhGRiwgMHhFQSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwMywKKwkweEZELCAweERDLCAweDQ3LCAweDk1LCAweDBCLCAweDk2LCAweEY5LCAweDI5LCAweDA0LCAweDY1LCAweEZELAorCTB4NzEsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsCisJMHgwMCwgMHg1NSwgMHhGRiwgMHg4QSwgMHgwMSwgMHgyRSwgMHhGRCwgMHg5QiwgMHgwNCwgMHhBOCwgMHhGOCwKKwkweDFGLCAweDBFLCAweDFBLCAweDQ3LCAweDRFLCAweEZCLCAweEIzLCAweDAwLCAweDcwLCAweDAwLCAweDU0LAorCTB4RkYsIDB4ODcsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNCwgMHhGQywgMHhGQiwgMHgwNiwgMHhEMiwgMHhGMiwgMHg2NCwKKwkweDIzLCAweDczLCAweDNCLCAweEJDLCAweEYyLCAweEI0LCAweDA1LCAweDZFLCAweEZELCAweDA5LCAweDAxLAorCTB4QUYsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OEIsCisJMHhGRiwgMHg0RiwgMHgwMSwgMHhGQiwgMHhGQywgMHg1QSwgMHgwNiwgMHhGMiwgMHhGMSwgMHhBMCwgMHgzNywKKwkweDNBLCAweDI4LCAweDEzLCAweEYyLCAweDI1LCAweDA3LCAweDM1LCAweEZDLCAweERCLCAweDAxLCAweDQwLAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NTEsIDB4MDAsCisJMHhDMywgMHhGRiwgMHhBNiwgMHhGRiwgMHgxNiwgMHgwMiwgMHhBOSwgMHhGOCwgMHg1QywgMHg0NSwgMHhCMiwKKwkweDEyLCAweDE5LCAweEY3LCAweDUyLCAweDA1LCAweEQ4LCAweEZDLCAweEFGLCAweDAxLCAweDQ3LCAweEZGLAorCTB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzEsIDB4RkYsIDB4NDIsCisJMHgwMSwgMHhDRCwgMHhGRCwgMHg1OSwgMHgwMywgMHgzQiwgMHhGQiwgMHg1RSwgMHgwNywgMHhCMywgMHg0OCwKKwkweDQ4LCAweDAwLCAweDRCLCAweEZFLCAweEMyLCAweDAxLCAweDlGLCAweEZFLCAweERFLCAweDAwLCAweDk4LAorCTB4RkYsIDB4MTksIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REQsIDB4MDEsCisJMHg2MiwgMHhGQywgMHg2OSwgMHgwNiwgMHg3RiwgMHhGNCwgMHhCMiwgMHgxQiwgMHhBQiwgMHg0MCwgMHhEMCwKKwkweEY0LCAweDRFLCAweDA0LCAweDUzLCAweEZFLCAweDgzLCAweDAwLCAweEYyLCAweEZGLCAweEY0LCAweEZGLAorCTB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4QTMsIDB4MDEsIDB4N0EsCisJMHhGQywgMHhGRCwgMHgwNiwgMHg3QywgMHhGMSwgMHhGMiwgMHgzMCwgMHg5NiwgMHgyRiwgMHg4MCwgMHhGMSwKKwkweDBGLCAweDA3LCAweDY5LCAweEZDLCAweEIwLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweEZELAorCTB4RkYsIDB4MDYsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4NjYsIDB4MDAsIDB4ODUsIDB4RkUsCisJMHhGQywgMHgwMywgMHg1NSwgMHhGNSwgMHg4QywgMHg0MSwgMHgzOCwgMHgxQSwgMHhFMSwgMHhGNCwgMHg0MywKKwkweDA2LCAweDcwLCAweEZDLCAweEQ4LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLAorCTB4MUIsIDB4MDAsIDB4OTIsIDB4RkYsIDB4RUYsIDB4MDAsIDB4N0QsIDB4RkUsIDB4MDQsIDB4MDIsIDB4Q0YsCisJMHhGRCwgMHg1OCwgMHgwMSwgMHhENywgMHg0OCwgMHgyNiwgMHgwNiwgMHhCQiwgMHhGQiwgMHgxOSwgMHgwMywKKwkweEVELCAweEZELCAweDMyLCAweDAxLCAweDc3LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4QjksIDB4MDEsIDB4QzEsIDB4RkMsIDB4ODYsIDB4MDUsCisJMHhBNSwgMHhGNiwgMHgxRSwgMHgxNCwgMHhCQSwgMHg0NCwgMHhGMCwgMHhGNywgMHg3QiwgMHgwMiwgMHg2QiwKKwkweEZGLCAweEU0LCAweEZGLCAweDQxLCAweDAwLCAweEQ2LCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLAorCTB4MzMsIDB4MDAsIDB4NDMsIDB4RkYsIDB4RDUsIDB4MDEsIDB4M0EsIDB4RkMsIDB4MkEsIDB4MDcsIDB4RTcsCisJMHhGMSwgMHhBQywgMHgyOSwgMHg2NiwgMHgzNiwgMHhDOSwgMHhGMSwgMHg4MywgMHgwNiwgMHhERCwgMHhGQywKKwkweDYyLCAweDAxLCAweDgxLCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA4LAorCTB4MDAsIDB4QkIsIDB4RkYsIDB4RjEsIDB4MDAsIDB4OTYsIDB4RkQsIDB4NzgsIDB4MDUsIDB4MEUsIDB4RjMsCisJMHg4QSwgMHgzQywgMHhFQSwgMHgyMSwgMHgxOSwgMHhGMywgMHhFNiwgMHgwNiwgMHgzOCwgMHhGQywgMHhFNiwKKwkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEI0LCAweEZGLAorCTB4OTgsIDB4MDAsIDB4MzIsIDB4RkYsIDB4QjAsIDB4MDAsIDB4NDEsIDB4MDAsIDB4MzAsIDB4RkMsIDB4ODYsCisJMHg0NywgMHhDNiwgMHgwQywgMHgyNCwgMHhGOSwgMHg2MCwgMHgwNCwgMHg0QiwgMHhGRCwgMHg3RCwgMHgwMSwKKwkweDVBLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDVBLAorCTB4RkYsIDB4N0UsIDB4MDEsIDB4NDgsIDB4RkQsIDB4NjYsIDB4MDQsIDB4MTgsIDB4RjksIDB4RTgsIDB4MEMsCisJMHg3QywgMHg0NywgMHgxOSwgMHhGQywgMHg0RCwgMHgwMCwgMHhBOSwgMHgwMCwgMHgzNSwgMHhGRiwgMHg5NiwKKwkweDAwLCAweEI1LCAweEZGLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAorCTB4RTYsIDB4MDEsIDB4MzgsIDB4RkMsIDB4RTksIDB4MDYsIDB4MTIsIDB4RjMsIDB4MTAsIDB4MjIsIDB4NkUsCisJMHgzQywgMHgwNSwgMHhGMywgMHg3RSwgMHgwNSwgMHg5MSwgMHhGRCwgMHhGNCwgMHgwMCwgMHhCQSwgMHhGRiwKKwkweDA5LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDgyLCAweEZGLCAweDYwLAorCTB4MDEsIDB4RTAsIDB4RkMsIDB4N0YsIDB4MDYsIDB4Q0MsIDB4RjEsIDB4ODUsIDB4MzYsIDB4ODcsIDB4MjksCisJMHhFQiwgMHhGMSwgMHgyQSwgMHgwNywgMHgzOSwgMHhGQywgMHhENiwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMywKKwkweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQ1LCAweEZGLCAweDQyLCAweDAwLCAweEUxLCAweEZGLAorCTB4NzEsIDB4RkYsIDB4NzEsIDB4MDIsIDB4MDIsIDB4RjgsIDB4Q0MsIDB4NDQsIDB4RkEsIDB4MTMsIDB4QjAsCisJMHhGNiwgMHg4MSwgMHgwNSwgMHhDMywgMHhGQywgMHhCOCwgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHgwMCwKKwkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc3LCAweEZGLCAweDM0LCAweDAxLCAweEVBLAorCTB4RkQsIDB4MUYsIDB4MDMsIDB4QUUsIDB4RkIsIDB4NDUsIDB4MDYsIDB4RDUsIDB4NDgsIDB4M0MsIDB4MDEsCisJMHhEQywgMHhGRCwgMHhGRCwgMHgwMSwgMHg4MCwgMHhGRSwgMHhFRCwgMHgwMCwgMHg5MywgMHhGRiwgMHgxQiwKKwkweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ4LCAweDAxLCAweDZGLCAweEZDLAorCTB4NDcsIDB4MDYsIDB4RDcsIDB4RjQsIDB4NUQsIDB4MUEsIDB4NzQsIDB4NDEsIDB4NDgsIDB4RjUsIDB4MDQsCisJMHgwNCwgMHg4MCwgMHhGRSwgMHg2OSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHgwNSwgMHgwMCwKKwkweEZELCAweEZGLCAweDJCLCAweDAwLCAweDU5LCAweEZGLCAweEFFLCAweDAxLCAweDZBLCAweEZDLCAweDBELAorCTB4MDcsIDB4ODAsIDB4RjEsIDB4QjgsIDB4MkYsIDB4Q0YsIDB4MzAsIDB4N0QsIDB4RjEsIDB4RkYsIDB4MDYsCisJMHg3OCwgMHhGQywgMHhBNSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwKKwkweDAwLCAweEYzLCAweEZGLCAweEY0LCAweEZGLCAweDgwLCAweDAwLCAweDU4LCAweEZFLCAweDQ2LCAweDA0LAorCTB4REQsIDB4RjQsIDB4QzMsIDB4NDAsIDB4OEMsIDB4MUIsIDB4ODksIDB4RjQsIDB4NjYsIDB4MDYsIDB4NjMsCisJMHhGQywgMHhEQywgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwKKwkweDk4LCAweEZGLCAweEUwLCAweDAwLCAweDlDLCAweEZFLCAweEM4LCAweDAxLCAweDNGLCAweEZFLCAweDYyLAorCTB4MDAsIDB4QjgsIDB4NDgsIDB4M0YsIDB4MDcsIDB4NDcsIDB4RkIsIDB4NTMsIDB4MDMsIDB4RDAsIDB4RkQsCisJMHg0MCwgMHgwMSwgMHg3MiwgMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwKKwkweDAwLCAweDQ3LCAweEZGLCAweEIwLCAweDAxLCAweEQ2LCAweEZDLCAweDU4LCAweDA1LCAweDBELCAweEY3LAorCTB4RDcsIDB4MTIsIDB4NEUsIDB4NDUsIDB4OTYsIDB4RjgsIDB4MjAsIDB4MDIsIDB4QTAsIDB4RkYsIDB4QzcsCisJMHhGRiwgMHg0RiwgMHgwMCwgMHhEMCwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweDQwLCAweEZGLCAweERCLCAweDAxLCAweDM1LCAweEZDLCAweDI2LCAweDA3LCAweDBFLCAweEYyLCAweDYwLAorCTB4MjgsIDB4ODIsIDB4MzcsIDB4RUQsIDB4RjEsIDB4NUUsIDB4MDYsIDB4RjgsIDB4RkMsIDB4NTEsIDB4MDEsCisJMHg4QSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhCMCwKKwkweEZGLCAweDA3LCAweDAxLCAweDcyLCAweEZELCAweEFFLCAweDA1LCAweEM0LCAweEYyLCAweDkwLCAweDNCLAorCTB4M0YsIDB4MjMsIDB4RDksIDB4RjIsIDB4RjksIDB4MDYsIDB4MzQsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCQSwgMHhGRiwgMHg4OSwgMHgwMCwKKwkweDUxLCAweEZGLCAweDc3LCAweDAwLCAweEE3LCAweDAwLCAweDY0LCAweEZCLCAweDI2LCAweDQ3LCAweEZDLAorCTB4MEQsIDB4QjQsIDB4RjgsIDB4OTUsIDB4MDQsIDB4MzEsIDB4RkQsIDB4ODgsIDB4MDEsIDB4NTYsIDB4RkYsCisJMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg1RSwgMHhGRiwgMHg3MiwKKwkweDAxLCAweDYyLCAweEZELCAweDJGLCAweDA0LCAweDg5LCAweEY5LCAweEI2LCAweDBCLCAweEQyLCAweDQ3LAorCTB4RUIsIDB4RkMsIDB4RTQsIDB4RkYsIDB4RTMsIDB4MDAsIDB4MTYsIDB4RkYsIDB4QTUsIDB4MDAsIDB4QUYsCisJMHhGRiwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwKKwkweDNFLCAweEZDLCAweEQzLCAweDA2LCAweDU2LCAweEYzLCAweEJBLCAweDIwLCAweDYxLCAweDNELCAweDU2LAorCTB4RjMsIDB4NDUsIDB4MDUsIDB4QjcsIDB4RkQsIDB4REUsIDB4MDAsIDB4QzUsIDB4RkYsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwgMHg3QSwgMHhGRiwgMHg3MCwgMHgwMSwgMHhDNywKKwkweEZDLCAweEEwLCAweDA2LCAweEFFLCAweEYxLCAweDY1LCAweDM1LCAweEQxLCAweDJBLCAweENBLCAweEYxLAorCTB4MkEsIDB4MDcsIDB4NDAsIDB4RkMsIDB4RDAsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwOSwgMHgwMCwgMHhEQiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzRCwgMHhGRiwKKwkweEM5LCAweDAyLCAweDY0LCAweEY3LCAweDJGLCAweDQ0LCAweDQ0LCAweDE1LCAweDRBLCAweEY2LCAweEFELAorCTB4MDUsIDB4QUYsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QywgMHhGRiwgMHgyNiwgMHgwMSwgMHgwOCwgMHhGRSwgMHhFNCwKKwkweDAyLCAweDIxLCAweEZDLCAweDMxLCAweDA1LCAweEVCLCAweDQ4LCAweDM3LCAweDAyLCAweDZCLCAweEZELAorCTB4MzksIDB4MDIsIDB4NjEsIDB4RkUsIDB4RkMsIDB4MDAsIDB4OEQsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhEMywgMHgwMSwgMHg3RCwgMHhGQywgMHgyMywgMHgwNiwKKwkweDMyLCAweEY1LCAweDBDLCAweDE5LCAweDM4LCAweDQyLCAweEM3LCAweEY1LCAweEI4LCAweDAzLCAweEFGLAorCTB4RkUsIDB4NEUsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgyRCwgMHgwMCwgMHg1NCwgMHhGRiwgMHhCOCwgMHgwMSwgMHg1RCwgMHhGQywgMHgxQSwgMHgwNywgMHg4QSwKKwkweEYxLCAweDdCLCAweDJFLCAweDA0LCAweDMyLCAweDdGLCAweEYxLCAweEVDLCAweDA2LCAweDhBLCAweEZDLAorCTB4OTgsIDB4MDEsIDB4NjUsIDB4RkYsIDB4MjcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjgsCisJMHhGRiwgMHhFNywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyQywgMHhGRSwgMHg4QywgMHgwNCwgMHg2RCwgMHhGNCwKKwkweEYwLCAweDNGLCAweEUwLCAweDFDLCAweDM0LCAweEY0LCAweDg1LCAweDA2LCAweDU3LCAweEZDLCAweEUwLAorCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OUUsIDB4RkYsCisJMHhEMSwgMHgwMCwgMHhCQiwgMHhGRSwgMHg4RCwgMHgwMSwgMHhBRSwgMHhGRSwgMHg3NCwgMHhGRiwgMHg4RCwKKwkweDQ4LCAweDVELCAweDA4LCAweEQ0LCAweEZBLCAweDhELCAweDAzLCAweEIzLCAweEZELCAweDRFLCAweDAxLAorCTB4NkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEEsCisJMHhGRiwgMHhBNywgMHgwMSwgMHhFQywgMHhGQywgMHgyOCwgMHgwNSwgMHg3NywgMHhGNywgMHg5MiwgMHgxMSwKKwkweEQ3LCAweDQ1LCAweDQzLCAweEY5LCAweEMzLCAweDAxLCAweEQ2LCAweEZGLCAweEE5LCAweEZGLCAweDVFLAorCTB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsCisJMHhERiwgMHgwMSwgMHgzMiwgMHhGQywgMHgxRiwgMHgwNywgMHgzQiwgMHhGMiwgMHgxMSwgMHgyNywgMHg5NywKKwkweDM4LCAweDE5LCAweEYyLCAweDM2LCAweDA2LCAweDE1LCAweEZELCAweDNGLCAweDAxLCAweDkzLCAweEZGLAorCTB4MTcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4QTYsIDB4RkYsIDB4MUIsCisJMHgwMSwgMHg1MCwgMHhGRCwgMHhFMSwgMHgwNSwgMHg4MiwgMHhGMiwgMHg4RiwgMHgzQSwgMHg5MiwgMHgyNCwKKwkweDlELCAweEYyLCAweDA5LCAweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLCAweDM5LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzAsIDB4RkYsIDB4N0EsIDB4MDAsIDB4NzAsIDB4RkYsCisJMHgzRSwgMHgwMCwgMHgwQywgMHgwMSwgMHhBMSwgMHhGQSwgMHhCQiwgMHg0NiwgMHgzNiwgMHgwRiwgMHg0NSwKKwkweEY4LCAweEM5LCAweDA0LCAweDE4LCAweEZELCAweDkzLCAweDAxLCAweDUyLCAweEZGLCAweDJELCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4NjYsIDB4MDEsIDB4N0QsCisJMHhGRCwgMHhGOCwgMHgwMywgMHhGQiwgMHhGOSwgMHg4OSwgMHgwQSwgMHgxRCwgMHg0OCwgMHhDNSwgMHhGRCwKKwkweDdBLCAweEZGLCAweDFELCAweDAxLCAweEY3LCAweEZFLCAweEI0LCAweDAwLCAweEE5LCAweEZGLCAweDE1LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDUsIDB4RkMsCisJMHhCQiwgMHgwNiwgMHhBMCwgMHhGMywgMHg2NCwgMHgxRiwgMHg0QSwgMHgzRSwgMHhCMCwgMHhGMywgMHgwOCwKKwkweDA1LCAweERFLCAweEZELCAweEM3LCAweDAwLCAweEQwLCAweEZGLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MjMsIDB4MDAsIDB4NzIsIDB4RkYsIDB4N0YsIDB4MDEsIDB4QjAsIDB4RkMsIDB4QkUsCisJMHgwNiwgMHg5NywgMHhGMSwgMHgzRiwgMHgzNCwgMHgxOSwgMHgyQywgMHhBRCwgMHhGMSwgMHgyOCwgMHgwNywKKwkweDQ4LCAweEZDLCAweEM5LCAweDAxLCAweDRCLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA4LAorCTB4MDAsIDB4RTAsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MUEsIDB4MDAsIDB4MEIsIDB4RkYsIDB4MUUsIDB4MDMsCisJMHhDRCwgMHhGNiwgMHg4OSwgMHg0MywgMHg5MSwgMHgxNiwgMHhFNywgMHhGNSwgMHhEOCwgMHgwNSwgMHg5RCwKKwkweEZDLCAweEM3LCAweDAxLCAweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorCTB4MUYsIDB4MDAsIDB4ODIsIDB4RkYsIDB4MTgsIDB4MDEsIDB4MjcsIDB4RkUsIDB4QTksIDB4MDIsIDB4OTQsCisJMHhGQywgMHgyNCwgMHgwNCwgMHhGNSwgMHg0OCwgMHgzOSwgMHgwMywgMHhGOSwgMHhGQywgMHg3NCwgMHgwMiwKKwkweDQyLCAweEZFLCAweDBCLCAweDAxLCAweDg3LCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDM0LAorCTB4MDAsIDB4M0MsIDB4RkYsIDB4Q0QsIDB4MDEsIDB4OEUsIDB4RkMsIDB4RkMsIDB4MDUsIDB4OTAsIDB4RjUsCisJMHhCQiwgMHgxNywgMHhFRSwgMHg0MiwgMHg0RSwgMHhGNiwgMHg2OCwgMHgwMywgMHhERiwgMHhGRSwgMHgzMywKKwkweDAwLCAweDFBLCAweDAwLCAweEU1LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLAorCTB4NEYsIDB4RkYsIDB4QzIsIDB4MDEsIDB4NTEsIDB4RkMsIDB4MjMsIDB4MDcsIDB4OUEsIDB4RjEsIDB4M0EsCisJMHgyRCwgMHgzNSwgMHgzMywgMHg4OSwgMHhGMSwgMHhENSwgMHgwNiwgMHg5RCwgMHhGQywgMHg4QiwgMHgwMSwKKwkweDZDLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZDLCAweEZGLCAweERCLAorCTB4RkYsIDB4QjIsIDB4MDAsIDB4MDIsIDB4RkUsIDB4Q0YsIDB4MDQsIDB4MDUsIDB4RjQsIDB4MTYsIDB4M0YsCisJMHgzNiwgMHgxRSwgMHhFNCwgMHhGMywgMHhBMywgMHgwNiwgMHg0RCwgMHhGQywgMHhFMywgMHgwMSwgMHgzNiwKKwkweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE0LCAweEZGLCAweEMyLCAweDAwLAorCTB4REIsIDB4RkUsIDB4NTIsIDB4MDEsIDB4MUIsIDB4RkYsIDB4OEQsIDB4RkUsIDB4NTcsIDB4NDgsIDB4ODEsCisJMHgwOSwgMHg2MSwgMHhGQSwgMHhDNiwgMHgwMywgMHg5NiwgMHhGRCwgMHg1QiwgMHgwMSwgMHg2OCwgMHhGRiwKKwkweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlELAorCTB4MDEsIDB4MDMsIDB4RkQsIDB4RjcsIDB4MDQsIDB4RTMsIDB4RjcsIDB4NTEsIDB4MTAsIDB4NTUsIDB4NDYsCisJMHhGOSwgMHhGOSwgMHg2MywgMHgwMSwgMHgwRCwgMHgwMCwgMHg4QiwgMHhGRiwgMHg2RCwgMHgwMCwgMHhDNSwKKwkweEZGLCAweDBFLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLAorCTB4MzEsIDB4RkMsIDB4MTUsIDB4MDcsIDB4NkQsIDB4RjIsIDB4QkYsIDB4MjUsIDB4QTUsIDB4MzksIDB4NEQsCisJMHhGMiwgMHgwQiwgMHgwNiwgMHgzMywgMHhGRCwgMHgyRCwgMHgwMSwgMHg5RCwgMHhGRiwgMHgxMywgMHgwMCwKKwkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDE0LCAweDAwLCAweDlDLCAweEZGLCAweDJGLCAweDAxLCAweDMwLAorCTB4RkQsIDB4MTAsIDB4MDYsIDB4NDcsIDB4RjIsIDB4ODcsIDB4MzksIDB4RTUsIDB4MjUsIDB4NjcsIDB4RjIsCisJMHgxNiwgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDBFLCAweDAwLCAweEM2LCAweEZGLCAweDZCLCAweDAwLCAweDhFLCAweEZGLCAweDA2LCAweDAwLAorCTB4NkUsIDB4MDEsIDB4RTQsIDB4RjksIDB4NDgsIDB4NDYsIDB4NzUsIDB4MTAsIDB4RDcsIDB4RjcsIDB4RkMsCisJMHgwNCwgMHgwMCwgMHhGRCwgMHg5RSwgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY4LCAweEZGLCAweDU5LCAweDAxLCAweDk5LCAweEZELCAweEMwLAorCTB4MDMsIDB4NkUsIDB4RkEsIDB4NjEsIDB4MDksIDB4NUQsIDB4NDgsIDB4QTYsIDB4RkUsIDB4MEYsIDB4RkYsCisJMHg1OCwgMHgwMSwgMHhENywgMHhGRSwgMHhDMywgMHgwMCwgMHhBMywgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRFLCAweEZDLCAweEEwLCAweDA2LAorCTB4RUQsIDB4RjMsIDB4MEYsIDB4MUUsIDB4MkQsIDB4M0YsIDB4MTAsIDB4RjQsIDB4QzgsIDB4MDQsIDB4MDcsCisJMHhGRSwgMHhBRiwgMHgwMCwgMHhEQywgMHhGRiwgMHhGQywgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDI1LCAweDAwLCAweDZCLCAweEZGLCAweDhELCAweDAxLCAweDlCLCAweEZDLCAweEQ4LCAweDA2LCAweDg3LAorCTB4RjEsIDB4MTMsIDB4MzMsIDB4NUUsIDB4MkQsIDB4OTgsIDB4RjEsIDB4MjIsIDB4MDcsIDB4NTIsIDB4RkMsCisJMHhDMSwgMHgwMSwgMHg0RiwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFNSwKKwkweEZGLCAweDE4LCAweDAwLCAweDM2LCAweDAwLCAweEQ5LCAweEZFLCAweDcxLCAweDAzLCAweDNGLCAweEY2LAorCTB4REIsIDB4NDIsIDB4RTAsIDB4MTcsIDB4ODYsIDB4RjUsIDB4MDAsIDB4MDYsIDB4OEMsIDB4RkMsIDB4Q0UsCisJMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4OCwgMHhGRiwKKwkweDA5LCAweDAxLCAweDQ1LCAweEZFLCAweDZFLCAweDAyLCAweDA2LCAweEZELCAweDFDLCAweDAzLCAweEY0LAorCTB4NDgsIDB4NDEsIDB4MDQsIDB4ODcsIDB4RkMsIDB4QjAsIDB4MDIsIDB4MjMsIDB4RkUsIDB4MTksIDB4MDEsCisJMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRiwKKwkweEZGLCAweEM2LCAweDAxLCAweDlGLCAweEZDLCAweEQzLCAweDA1LCAweEYxLCAweEY1LCAweDZDLCAweDE2LAorCTB4OUUsIDB4NDMsIDB4REQsIDB4RjYsIDB4MTUsIDB4MDMsIDB4MTAsIDB4RkYsIDB4MTcsIDB4MDAsIDB4MjgsCisJMHgwMCwgMHhERiwgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwKKwkweENBLCAweDAxLCAweDQ3LCAweEZDLCAweDI4LCAweDA3LCAweEIwLCAweEYxLCAweEY1LCAweDJCLCAweDYwLAorCTB4MzQsIDB4OUEsIDB4RjEsIDB4QkIsIDB4MDYsIDB4QjMsIDB4RkMsIDB4N0QsIDB4MDEsIDB4NzMsIDB4RkYsCisJMHgyMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhDRiwgMHhGRiwgMHhDOSwKKwkweDAwLCAweERBLCAweEZELCAweDBGLCAweDA1LCAweEE1LCAweEYzLCAweDMxLCAweDNFLCAweDhBLCAweDFGLAorCTB4OTcsIDB4RjMsIDB4QkQsIDB4MDYsIDB4NDQsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBQSwgMHhGRiwgMHhCMywgMHgwMCwgMHhGQSwgMHhGRSwKKwkweDE3LCAweDAxLCAweDg2LCAweEZGLCAweEFDLCAweEZELCAweDE2LCAweDQ4LCAweEFBLCAweDBBLCAweEVFLAorCTB4RjksIDB4RkUsIDB4MDMsIDB4N0EsIDB4RkQsIDB4NjcsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MiwgMHhGRiwgMHg5MiwgMHgwMSwgMHgxQiwKKwkweEZELCAweEM0LCAweDA0LCAweDUxLCAweEY4LCAweDEzLCAweDBGLCAweEM4LCAweDQ2LCAweEI2LCAweEZBLAorCTB4MDEsIDB4MDEsIDB4NDQsIDB4MDAsIDB4NkMsIDB4RkYsIDB4N0IsIDB4MDAsIDB4QkYsIDB4RkYsIDB4MTAsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMiwgMHhGQywKKwkweDA4LCAweDA3LCAweEE0LCAweEYyLCAweDZELCAweDI0LCAweEFELCAweDNBLCAweDg4LCAweEYyLCAweERCLAorCTB4MDUsIDB4NTMsIDB4RkQsIDB4MTksIDB4MDEsIDB4QTcsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgxNywgMHgwMCwgMHg5MiwgMHhGRiwgMHg0MSwgMHgwMSwgMHgxMSwgMHhGRCwgMHgzQiwKKwkweDA2LCAweDE0LCAweEYyLCAweDc4LCAweDM4LCAweDM2LCAweDI3LCAweDM1LCAweEYyLCAweDIwLCAweDA3LAorCTB4MzMsIDB4RkMsIDB4REYsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsCisJMHgwMCwgMHhDQiwgMHhGRiwgMHg1QywgMHgwMCwgMHhBQywgMHhGRiwgMHhEMCwgMHhGRiwgMHhDRCwgMHgwMSwKKwkweDMwLCAweEY5LCAweEM4LCAweDQ1LCAweEI2LCAweDExLCAweDZCLCAweEY3LCAweDJELCAweDA1LCAweEU5LAorCTB4RkMsIDB4QTgsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgyNSwgMHgwMCwgMHg2RCwgMHhGRiwgMHg0QywgMHgwMSwgMHhCNiwgMHhGRCwgMHg4NiwgMHgwMywgMHhFMSwKKwkweEZBLCAweDNELCAweDA4LCAweDkyLCAweDQ4LCAweDhFLCAweEZGLCAweEExLCAweEZFLCAweDkzLCAweDAxLAorCTB4QjgsIDB4RkUsIDB4RDMsIDB4MDAsIDB4OUQsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzNywgMHhGRiwgMHhFMCwgMHgwMSwgMHg1OCwgMHhGQywgMHg4MiwgMHgwNiwgMHgzRSwgMHhGNCwKKwkweEJBLCAweDFDLCAweDA3LCAweDQwLCAweDc5LCAweEY0LCAweDg0LCAweDA0LCAweDMxLCAweEZFLCAweDk2LAorCTB4MDAsIDB4RTgsIDB4RkYsIDB4RjcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsCisJMHg2NCwgMHhGRiwgMHg5QSwgMHgwMSwgMHg4OCwgMHhGQywgMHhFRSwgMHgwNiwgMHg3RSwgMHhGMSwgMHhFMywKKwkweDMxLCAweDlGLCAweDJFLCAweDg4LCAweEYxLCAweDE5LCAweDA3LCAweDVFLCAweEZDLCAweEI3LCAweDAxLAorCTB4NTQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MEIsCisJMHgwMCwgMHg1MSwgMHgwMCwgMHhBQSwgMHhGRSwgMHhDMCwgMHgwMywgMHhCOCwgMHhGNSwgMHgyMSwgMHg0MiwKKwkweDMxLCAweDE5LCAweDI4LCAweEY1LCAweDI3LCAweDA2LCAweDdDLCAweEZDLCAweEQ0LCAweDAxLCAweDNBLAorCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEQsIDB4RkYsIDB4RkEsIDB4MDAsCisJMHg2NCwgMHhGRSwgMHgzMiwgMHgwMiwgMHg3OCwgMHhGRCwgMHgxQiwgMHgwMiwgMHhFQSwgMHg0OCwgMHg1MCwKKwkweDA1LCAweDE0LCAweEZDLCAweEVCLCAweDAyLCAweDA1LCAweEZFLCAweDI3LCAweDAxLCAweDdDLCAweEZGLAorCTB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDEsIDB4RkYsIDB4QkYsCisJMHgwMSwgMHhCMiwgMHhGQywgMHhBOSwgMHgwNSwgMHg1NSwgMHhGNiwgMHgyMCwgMHgxNSwgMHg0MiwgMHg0NCwKKwkweDc1LCAweEY3LCAweEJGLCAweDAyLCAweDQzLCAweEZGLCAweEZBLCAweEZGLCAweDM2LCAweDAwLCAweERBLAorCTB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDYsIDB4RkYsIDB4RDEsIDB4MDEsCisJMHgzRiwgMHhGQywgMHgyQiwgMHgwNywgMHhDRCwgMHhGMSwgMHhBRSwgMHgyQSwgMHg4NiwgMHgzNSwgMHhCMSwKKwkweEYxLCAweDlELCAweDA2LCAweENBLCAweEZDLCAweDZFLCAweDAxLCAweDdCLCAweEZGLCAweDIwLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4QzMsIDB4RkYsIDB4RTAsIDB4MDAsIDB4QjMsCisJMHhGRCwgMHg0QiwgMHgwNSwgMHg0RCwgMHhGMywgMHg0NSwgMHgzRCwgMHhFMCwgMHgyMCwgMHg0RiwgMHhGMywKKwkweEQ1LCAweDA2LCAweDNELCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELAorCTB4RkYsIDB4MTMsIDB4MDAsIDB4QUYsIDB4RkYsIDB4QTQsIDB4MDAsIDB4MTksIDB4RkYsIDB4REQsIDB4MDAsCisJMHhGMCwgMHhGRiwgMHhENCwgMHhGQywgMHhDOSwgMHg0NywgMHhEOCwgMHgwQiwgMHg3QywgMHhGOSwgMHgzNSwKKwkweDA0LCAweDVGLCAweEZELCAweDc0LCAweDAxLCAweDVFLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkYsIDB4ODcsIDB4MDEsIDB4MzQsIDB4RkQsIDB4OEYsCisJMHgwNCwgMHhDMCwgMHhGOCwgMHhEOSwgMHgwRCwgMHgzMSwgMHg0NywgMHg3QiwgMHhGQiwgMHg5QywgMHgwMCwKKwkweDdELCAweDAwLCAweDRELCAweEZGLCAweDhBLCAweDAwLCAweEI5LCAweEZGLCAweDExLCAweDAwLCAweEZELAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsIDB4RkMsIDB4RjcsIDB4MDYsCisJMHhFMCwgMHhGMiwgMHgxOCwgMHgyMywgMHhBQiwgMHgzQiwgMHhDQywgMHhGMiwgMHhBOCwgMHgwNSwgMHg3NiwKKwkweEZELCAweDA0LCAweDAxLCAweEIxLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLAorCTB4MUEsIDB4MDAsIDB4ODksIDB4RkYsIDB4NTMsIDB4MDEsIDB4RjUsIDB4RkMsIDB4NjMsIDB4MDYsIDB4RTksCisJMHhGMSwgMHg2MywgMHgzNywgMHg4NSwgMHgyOCwgMHgwOSwgMHhGMiwgMHgyNywgMHgwNywgMHgzNSwgMHhGQywKKwkweERBLCAweDAxLCAweDQwLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLCAweDAwLCAweEQxLAorCTB4RkYsIDB4NEUsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4OUEsIDB4RkYsIDB4MkEsIDB4MDIsIDB4ODMsIDB4RjgsCisJMHgzRiwgMHg0NSwgMHhGQiwgMHgxMiwgMHgwMSwgMHhGNywgMHg1RCwgMHgwNSwgMHhEMywgMHhGQywgMHhCMSwKKwkweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLAorCTB4NzMsIDB4RkYsIDB4M0YsIDB4MDEsIDB4RDMsIDB4RkQsIDB4NEMsIDB4MDMsIDB4NTQsIDB4RkIsIDB4MUYsCisJMHgwNywgMHhCQiwgMHg0OCwgMHg3RCwgMHgwMCwgMHgzMywgMHhGRSwgMHhDRiwgMHgwMSwgMHg5OCwgMHhGRSwKKwkweEUyLCAweDAwLCAweDk3LCAweEZGLCAweDE5LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LAorCTB4RkYsIDB4REMsIDB4MDEsIDB4NjQsIDB4RkMsIDB4NjIsIDB4MDYsIDB4OTMsIDB4RjQsIDB4NjYsIDB4MUIsCisJMHhEOSwgMHg0MCwgMHhFQSwgMHhGNCwgMHgzRSwgMHgwNCwgMHg1RCwgMHhGRSwgMHg3RCwgMHgwMCwgMHhGNSwKKwkweEZGLCAweEYzLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVFLCAweEZGLAorCTB4QTYsIDB4MDEsIDB4NzYsIDB4RkMsIDB4MDEsIDB4MDcsIDB4N0QsIDB4RjEsIDB4QUQsIDB4MzAsIDB4REMsCisJMHgyRiwgMHg3RiwgMHhGMSwgMHgwQywgMHgwNywgMHg2QywgMHhGQywgMHhBRCwgMHgwMSwgMHg1QSwgMHhGRiwKKwkweDJCLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweDZDLAorCTB4MDAsIDB4N0IsIDB4RkUsIDB4MEMsIDB4MDQsIDB4M0EsIDB4RjUsIDB4NUYsIDB4NDEsIDB4ODMsIDB4MUEsCisJMHhDRCwgMHhGNCwgMHg0QiwgMHgwNiwgMHg2RCwgMHhGQywgMHhEOSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwKKwkweDAwLCAweEZFLCAweEZGLCAweDFBLCAweDAwLCAweDkzLCAweEZGLCAweEVDLCAweDAwLCAweDgzLCAweEZFLAorCTB4RjcsIDB4MDEsIDB4RTgsIDB4RkQsIDB4MjEsIDB4MDEsIDB4RDIsIDB4NDgsIDB4NjQsIDB4MDYsIDB4QTEsCisJMHhGQiwgMHgyNiwgMHgwMywgMHhFNywgMHhGRCwgMHgzNSwgMHgwMSwgMHg3NiwgMHhGRiwgMHgyMiwgMHgwMCwKKwkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ0LCAweEZGLCAweEI3LCAweDAxLCAweEM1LAorCTB4RkMsIDB4N0MsIDB4MDUsIDB4QkMsIDB4RjYsIDB4RDUsIDB4MTMsIDB4REMsIDB4NDQsIDB4MTQsIDB4RjgsCisJMHg2NywgMHgwMiwgMHg3NywgMHhGRiwgMHhERCwgMHhGRiwgMHg0NCwgMHgwMCwgMHhENSwgMHhGRiwgMHgwQiwKKwkweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQyLCAweEZGLCAweEQ3LCAweDAxLCAweDM5LCAweEZDLAorCTB4MjksIDB4MDcsIDB4RUYsIDB4RjEsIDB4NjIsIDB4MjksIDB4QTUsIDB4MzYsIDB4RDAsIDB4RjEsIDB4N0IsCisJMHgwNiwgMHhFMywgMHhGQywgMHg1RSwgMHgwMSwgMHg4MywgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDAxLCAweDAwLCAweDA5LCAweDAwLCAweEI4LCAweEZGLCAweEY2LCAweDAwLCAweDhELCAweEZELCAweDg0LAorCTB4MDUsIDB4RkQsIDB4RjIsIDB4NTIsIDB4M0MsIDB4MzUsIDB4MjIsIDB4MEIsIDB4RjMsIDB4RUIsIDB4MDYsCisJMHgzNywgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwKKwkweDAwLCAweEI1LCAweEZGLCAweDk0LCAweDAwLCAweDM5LCAweEZGLCAweEEzLCAweDAwLCAweDU4LCAweDAwLAorCTB4MDIsIDB4RkMsIDB4NzMsIDB4NDcsIDB4MEIsIDB4MEQsIDB4MEIsIDB4RjksIDB4NkMsIDB4MDQsIDB4NDUsCisJMHhGRCwgMHg4MCwgMHgwMSwgMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDJBLCAweDAwLCAweDVCLCAweEZGLCAweDdDLCAweDAxLCAweDRFLCAweEZELCAweDVBLCAweDA0LCAweDMxLAorCTB4RjksIDB4QTQsIDB4MEMsIDB4OTAsIDB4NDcsIDB4NDcsIDB4RkMsIDB4MzYsIDB4MDAsIDB4QjYsIDB4MDAsCisJMHgyRSwgMHhGRiwgMHg5OSwgMHgwMCwgMHhCMywgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM5LCAweEZDLCAweEU0LCAweDA2LCAweDIxLCAweEYzLAorCTB4QzQsIDB4MjEsIDB4QTUsIDB4M0MsIDB4MTYsIDB4RjMsIDB4NzIsIDB4MDUsIDB4OUEsIDB4RkQsIDB4RUYsCisJMHgwMCwgMHhCQywgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwKKwkweDgwLCAweEZGLCAweDY0LCAweDAxLCAweERBLCAweEZDLCAweDg3LCAweDA2LCAweEM1LCAweEYxLCAweDQ2LAorCTB4MzYsIDB4RDEsIDB4MjksIDB4RTMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0EsIDB4RkMsIDB4RDUsIDB4MDEsCisJMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhENiwgMHhGRiwgMHgzRiwKKwkweDAwLCAweEU3LCAweEZGLCAweDY1LCAweEZGLCAweDg1LCAweDAyLCAweERFLCAweEY3LCAweEE5LCAweDQ0LAorCTB4NDMsIDB4MTQsIDB4OTksIDB4RjYsIDB4OEIsIDB4MDUsIDB4QkYsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NDMsCisJMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3OCwgMHhGRiwKKwkweDMxLCAweDAxLCAweEYxLCAweEZELCAweDEyLCAweDAzLCAweEM3LCAweEZCLCAweDA3LCAweDA2LCAweERCLAorCTB4NDgsIDB4NzMsIDB4MDEsIDB4QzMsIDB4RkQsIDB4MEEsIDB4MDIsIDB4NzksIDB4RkUsIDB4RjEsIDB4MDAsCisJMHg5MSwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhENywKKwkweDAxLCAweDcyLCAweEZDLCAweDNGLCAweDA2LCAweEVCLCAweEY0LCAweDEyLCAweDFBLCAweEExLCAweDQxLAorCTB4NjMsIDB4RjUsIDB4RjMsIDB4MDMsIDB4OEEsIDB4RkUsIDB4NjMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RUUsCisJMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1OCwgMHhGRiwgMHhCMSwgMHgwMSwKKwkweDY3LCAweEZDLCAweDEwLCAweDA3LCAweDgxLCAweEYxLCAweDczLCAweDJGLCAweDE1LCAweDMxLCAweDdDLAorCTB4RjEsIDB4RkIsIDB4MDYsIDB4N0MsIDB4RkMsIDB4QTIsIDB4MDEsIDB4NjAsIDB4RkYsIDB4MjksIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNCwgMHhGRiwgMHhGMSwgMHhGRiwgMHg4NSwgMHgwMCwgMHg0RSwKKwkweEZFLCAweDU2LCAweDA0LCAweEMzLCAweEY0LCAweDk1LCAweDQwLCAweEQ4LCAweDFCLCAweDc2LCAweEY0LAorCTB4NkQsIDB4MDYsIDB4NjAsIDB4RkMsIDB4REQsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgxOSwgMHgwMCwgMHg5OSwgMHhGRiwgMHhERCwgMHgwMCwgMHhBMywgMHhGRSwgMHhCQiwgMHgwMSwKKwkweDU4LCAweEZFLCAweDJELCAweDAwLCAweEFGLCAweDQ4LCAweDdFLCAweDA3LCAweDJFLCAweEZCLCAweDYwLAorCTB4MDMsIDB4QzksIDB4RkQsIDB4NDMsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0OCwgMHhGRiwgMHhBRSwgMHgwMSwgMHhEQiwgMHhGQywgMHg0RCwKKwkweDA1LCAweDI0LCAweEY3LCAweDhFLCAweDEyLCAweDZELCAweDQ1LCAweEJDLCAweEY4LCAweDBDLCAweDAyLAorCTB4QUMsIDB4RkYsIDB4QzAsIDB4RkYsIDB4NTIsIDB4MDAsIDB4Q0YsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhEQywgMHgwMSwgMHgzNCwgMHhGQywgMHgyNSwgMHgwNywKKwkweDE4LCAweEYyLCAweDE1LCAweDI4LCAweEJGLCAweDM3LCAweEY3LCAweEYxLCAweDU2LCAweDA2LCAweEZFLAorCTB4RkMsIDB4NEQsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgwRCwgMHgwMCwgMHhBRSwgMHhGRiwgMHgwQiwgMHgwMSwgMHg2QSwgMHhGRCwgMHhCQSwgMHgwNSwgMHhCNCwKKwkweEYyLCAweDU4LCAweDNCLCAweDhBLCAweDIzLCAweENCLCAweEYyLCAweEZELCAweDA2LCAweDM0LCAweEZDLAorCTB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkIsCisJMHhGRiwgMHg4NSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg2QSwgMHgwMCwgMHhCRSwgMHgwMCwgMHgzOCwgMHhGQiwKKwkweDBGLCAweDQ3LCAweDQyLCAweDBFLCAweDlCLCAweEY4LCAweEExLCAweDA0LCAweDJCLCAweEZELCAweDhCLAorCTB4MDEsIDB4NTUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsCisJMHg1RiwgMHhGRiwgMHg3MCwgMHgwMSwgMHg2OCwgMHhGRCwgMHgyMywgMHgwNCwgMHhBMiwgMHhGOSwgMHg3MywKKwkweDBCLCAweEU0LCAweDQ3LCAweDFCLCAweEZELCAweENELCAweEZGLCAweEYwLCAweDAwLCAweDBGLCAweEZGLAorCTB4QTksIDB4MDAsIDB4QUUsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsCisJMHhGRiwgMHhFNiwgMHgwMSwgMHgzRiwgMHhGQywgMHhDRSwgMHgwNiwgMHg2NiwgMHhGMywgMHg2RiwgMHgyMCwKKwkweDk2LCAweDNELCAweDY5LCAweEYzLCAweDM4LCAweDA1LCAweEJGLCAweEZELCAweEQ5LCAweDAwLCAweEM3LAorCTB4RkYsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjAsIDB4MDAsIDB4NzgsIDB4RkYsCisJMHg3NCwgMHgwMSwgMHhDMiwgMHhGQywgMHhBNywgMHgwNiwgMHhBOCwgMHhGMSwgMHgyNSwgMHgzNSwgMHgxQiwKKwkweDJCLCAweEMyLCAweEYxLCAweDJBLCAweDA3LCAweDQxLCAweEZDLCAweENFLCAweDAxLCAweDQ3LCAweEZGLAorCTB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REMsIDB4RkYsIDB4MzEsIDB4MDAsIDB4MDQsCisJMHgwMCwgMHgzMiwgMHhGRiwgMHhEQywgMHgwMiwgMHg0MiwgMHhGNywgMHgwQiwgMHg0NCwgMHg4RSwgMHgxNSwKKwkweDM0LCAweEY2LCAweEI3LCAweDA1LCAweEFCLCAweEZDLCAweEMxLCAweDAxLCAweDQwLCAweEZGLCAweDMzLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0UsIDB4RkYsIDB4MjMsIDB4MDEsCisJMHgwRiwgMHhGRSwgMHhENywgMHgwMiwgMHgzQiwgMHhGQywgMHhGNSwgMHgwNCwgMHhFRCwgMHg0OCwgMHg3MCwKKwkweDAyLCAweDUyLCAweEZELCAweDQ2LCAweDAyLCAweDVBLCAweEZFLCAweEZGLCAweDAwLCAweDhCLCAweEZGLAorCTB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDIsIDB4MDEsIDB4ODEsCisJMHhGQywgMHgxQSwgMHgwNiwgMHg0NywgMHhGNSwgMHhDMSwgMHgxOCwgMHg2MCwgMHg0MiwgMHhFNCwgMHhGNSwKKwkweEE2LCAweDAzLCAweEI5LCAweEZFLCAweDQ4LCAweDAwLCAweDBGLCAweDAwLCAweEU5LCAweEZGLCAweDA3LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTMsIDB4RkYsIDB4QkIsIDB4MDEsIDB4NUEsIDB4RkMsCisJMHgxQywgMHgwNywgMHg4RCwgMHhGMSwgMHgzNCwgMHgyRSwgMHg0OCwgMHgzMiwgMHg4MSwgMHhGMSwgMHhFNywKKwkweDA2LCAweDhFLCAweEZDLCAweDk2LCAweDAxLCAweDY2LCAweEZGLCAweDI3LCAweDAwLCAweEZELCAweEZGLAorCTB4MDQsIDB4MDAsIDB4RjksIDB4RkYsIDB4RTQsIDB4RkYsIDB4OUYsIDB4MDAsIDB4MjMsIDB4RkUsIDB4OUIsCisJMHgwNCwgMHg1NSwgMHhGNCwgMHhDMCwgMHgzRiwgMHgyQywgMHgxRCwgMHgyMiwgMHhGNCwgMHg4QywgMHgwNiwKKwkweDU1LCAweEZDLCAweEUxLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LAorCTB4MDAsIDB4OUYsIDB4RkYsIDB4Q0UsIDB4MDAsIDB4QzIsIDB4RkUsIDB4ODAsIDB4MDEsIDB4QzYsIDB4RkUsCisJMHg0MCwgMHhGRiwgMHg4MSwgMHg0OCwgMHg5RSwgMHgwOCwgMHhCQSwgMHhGQSwgMHg5QSwgMHgwMywgMHhBQywKKwkweEZELCAweDUxLCAweDAxLCAweDZDLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAorCTB4MkYsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QTQsIDB4MDEsIDB4RjEsIDB4RkMsIDB4MUQsIDB4MDUsIDB4OEYsCisJMHhGNywgMHg0QSwgMHgxMSwgMHhGMiwgMHg0NSwgMHg2QiwgMHhGOSwgMHhBRSwgMHgwMSwgMHhFMiwgMHhGRiwKKwkweEEyLCAweEZGLCAweDYxLCAweDAwLCAweEM5LCAweEZGLCAweDBELCAweDAwLCAweEZELCAweEZGLCAweDM1LAorCTB4MDAsIDB4M0QsIDB4RkYsIDB4RTAsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUQsIDB4MDcsIDB4NDUsIDB4RjIsCisJMHhDNiwgMHgyNiwgMHhEMywgMHgzOCwgMHgyNCwgMHhGMiwgMHgyRCwgMHgwNiwgMHgxQiwgMHhGRCwgMHgzQiwKKwkweDAxLCAweDk1LCAweEZGLCAweDE2LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDExLCAweDAwLAorCTB4QTMsIDB4RkYsIDB4MjAsIDB4MDEsIDB4NDksIDB4RkQsIDB4RUIsIDB4MDUsIDB4NzQsIDB4RjIsIDB4NTQsCisJMHgzQSwgMHhERCwgMHgyNCwgMHg5MSwgMHhGMiwgMHgwQywgMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwKKwkweDNBLCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEMxLCAweEZGLCAweDc2LAorCTB4MDAsIDB4NzYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4MjIsIDB4MDEsIDB4NzYsIDB4RkEsIDB4QTMsIDB4NDYsCisJMHg3RCwgMHgwRiwgMHgyQywgMHhGOCwgMHhENSwgMHgwNCwgMHgxMywgMHhGRCwgMHg5NiwgMHgwMSwgMHg1MSwKKwkweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY0LCAweEZGLAorCTB4NjMsIDB4MDEsIDB4ODQsIDB4RkQsIDB4RUIsIDB4MDMsIDB4MTQsIDB4RkEsIDB4NDcsIDB4MEEsIDB4MkMsCisJMHg0OCwgMHhGNiwgMHhGRCwgMHg2MywgMHhGRiwgMHgyQiwgMHgwMSwgMHhGMCwgMHhGRSwgMHhCOCwgMHgwMCwKKwkweEE4LCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LAorCTB4MDEsIDB4NDcsIDB4RkMsIDB4QjUsIDB4MDYsIDB4QjAsIDB4RjMsIDB4MTksIDB4MUYsIDB4N0UsIDB4M0UsCisJMHhDNCwgMHhGMywgMHhGQSwgMHgwNCwgMHhFNywgMHhGRCwgMHhDMSwgMHgwMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkweEZGLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIzLCAweDAwLCAweDcxLCAweEZGLCAweDgyLCAweDAxLAorCTB4QUIsIDB4RkMsIDB4QzQsIDB4MDYsIDB4OTMsIDB4RjEsIDB4RkQsIDB4MzMsIDB4NjIsIDB4MkMsIDB4QTgsCisJMHhGMSwgMHgyNywgMHgwNywgMHg0QSwgMHhGQywgMHhDNywgMHgwMSwgMHg0QywgMHhGRiwgMHgzMCwgMHgwMCwKKwkweEZELCAweEZGLCAweDA4LCAweDAwLCAweEUxLCAweEZGLCAweDIzLCAweDAwLCAweDIwLCAweDAwLCAweDAwLAorCTB4RkYsIDB4MzEsIDB4MDMsIDB4QUQsIDB4RjYsIDB4NjUsIDB4NDMsIDB4REMsIDB4MTYsIDB4RDEsIDB4RjUsCisJMHhFMSwgMHgwNSwgMHg5OSwgMHhGQywgMHhDOSwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwKKwkweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgzLCAweEZGLCAweDE0LCAweDAxLCAweDJELCAweEZFLAorCTB4OUMsIDB4MDIsIDB4QUQsIDB4RkMsIDB4RTksIDB4MDMsIDB4RjYsIDB4NDgsIDB4NzMsIDB4MDMsIDB4RTAsCisJMHhGQywgMHg4MiwgMHgwMiwgMHgzQiwgMHhGRSwgMHgwRSwgMHgwMSwgMHg4NiwgMHhGRiwgMHgxRSwgMHgwMCwKKwkweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLCAweENDLCAweDAxLCAweDkxLCAweEZDLCAweEYzLAorCTB4MDUsIDB4QTYsIDB4RjUsIDB4NzAsIDB4MTcsIDB4MTcsIDB4NDMsIDB4NkQsIDB4RjYsIDB4NTYsIDB4MDMsCisJMHhFQSwgMHhGRSwgMHgyRCwgMHgwMCwgMHgxRCwgMHgwMCwgMHhFNCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDJGLCAweDAwLCAweDRFLCAweEZGLCAweEMzLCAweDAxLCAweDRFLCAweEZDLCAweDI0LCAweDA3LAorCTB4OUUsIDB4RjEsIDB4RjIsIDB4MkMsIDB4NzgsIDB4MzMsIDB4OEMsIDB4RjEsIDB4RDAsIDB4MDYsIDB4QTIsCisJMHhGQywgMHg4OCwgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwKKwkweEZELCAweEZGLCAweEQ4LCAweEZGLCAweEI3LCAweDAwLCAweEY5LCAweEZELCAweERFLCAweDA0LCAweEVGLAorCTB4RjMsIDB4RTQsIDB4M0UsIDB4ODEsIDB4MUUsIDB4RDIsIDB4RjMsIDB4QTksIDB4MDYsIDB4NEIsIDB4RkMsCisJMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNSwKKwkweEZGLCAweEJFLCAweDAwLCAweEUyLCAweEZFLCAweDQ1LCAweDAxLCAweDMzLCAweEZGLCAweDVBLCAweEZFLAorCTB4NDgsIDB4NDgsIDB4QzMsIDB4MDksIDB4NDcsIDB4RkEsIDB4RDIsIDB4MDMsIDB4OTAsIDB4RkQsIDB4NUUsCisJMHgwMSwgMHg2NiwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwKKwkweDRGLCAweEZGLCAweDlBLCAweDAxLCAweDA4LCAweEZELCAweEVCLCAweDA0LCAweEZDLCAweEY3LCAweDBBLAorCTB4MTAsIDB4NzAsIDB4NDYsIDB4MjIsIDB4RkEsIDB4NEQsIDB4MDEsIDB4MTksIDB4MDAsIDB4ODQsIDB4RkYsCisJMHg3MCwgMHgwMCwgMHhDNCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwKKwkweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDEyLCAweDA3LCAweDc5LCAweEYyLCAweDczLCAweDI1LAorCTB4REYsIDB4MzksIDB4NUEsIDB4RjIsIDB4MDAsIDB4MDYsIDB4M0EsIDB4RkQsIDB4MjgsIDB4MDEsIDB4OUYsCisJMHhGRiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNSwgMHgwMCwgMHg5OSwgMHhGRiwKKwkweDMzLCAweDAxLCAweDI5LCAweEZELCAweDFBLCAweDA2LCAweDNCLCAweEYyLCAweDRCLCAweDM5LCAweDMwLAorCTB4MjYsIDB4NUIsIDB4RjIsIDB4MTksIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTEsIDB4MDEsIDB4M0MsIDB4RkYsCisJMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwgMHhDNywgMHhGRiwgMHg2OCwgMHgwMCwgMHg5NSwKKwkweEZGLCAweEZBLCAweEZGLCAweDgzLCAweDAxLCAweEJCLCAweEY5LCAweDJCLCAweDQ2LCAweEJCLCAweDEwLAorCTB4QkYsIDB4RjcsIDB4MDcsIDB4MDUsIDB4RkIsIDB4RkMsIDB4QTAsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MkYsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OSwgMHhGRiwgMHg1NiwgMHgwMSwKKwkweEEwLCAweEZELCAweEIzLCAweDAzLCAweDg3LCAweEZBLCAweDFGLCAweDA5LCAweDZBLCAweDQ4LCAweEQ5LAorCTB4RkUsIDB4RjYsIDB4RkUsIDB4NjUsIDB4MDEsIDB4RDAsIDB4RkUsIDB4QzcsIDB4MDAsIDB4QTIsIDB4RkYsCisJMHgxNywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMiwgMHgwMSwgMHg1MCwKKwkweEZDLCAweDk5LCAweDA2LCAweEZFLCAweEYzLCAweEMzLCAweDFELCAweDVFLCAweDNGLCAweDI3LCAweEY0LAorCTB4QjksIDB4MDQsIDB4MTAsIDB4RkUsIDB4QTksIDB4MDAsIDB4REYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MDMsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgyNiwgMHgwMCwgMHg2OSwgMHhGRiwgMHg5MCwgMHgwMSwgMHg5NiwgMHhGQywKKwkweERELCAweDA2LCAweDg1LCAweEYxLCAweEQwLCAweDMyLCAweEE2LCAweDJELCAweDk0LCAweEYxLCAweDIwLAorCTB4MDcsIDB4NTQsIDB4RkMsIDB4QkYsIDB4MDEsIDB4NTAsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwNywgMHgwMCwgMHhFNiwgMHhGRiwgMHgxNSwgMHgwMCwgMHgzQywgMHgwMCwgMHhDRiwgMHhGRSwgMHg4MywKKwkweDAzLCAweDIwLCAweEY2LCAweEIyLCAweDQyLCAweDJCLCAweDE4LCAweDcxLCAweEY1LCAweDA5LCAweDA2LAorCTB4ODgsIDB4RkMsIDB4Q0YsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsCisJMHgwMCwgMHg4OSwgMHhGRiwgMHgwNiwgMHgwMSwgMHg0QywgMHhGRSwgMHg2MCwgMHgwMiwgMHgxRiwgMHhGRCwKKwkweEUyLCAweDAyLCAweEYzLCAweDQ4LCAweDdELCAweDA0LCAweDZFLCAweEZDLCAweEJELCAweDAyLCAweDFDLAorCTB4RkUsIDB4MUMsIDB4MDEsIDB4ODAsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgzMywgMHgwMCwgMHgzRiwgMHhGRiwgMHhDNSwgMHgwMSwgMHhBMywgMHhGQywgMHhDQSwgMHgwNSwgMHgwNywKKwkweEY2LCAweDIyLCAweDE2LCAweEMzLCAweDQzLCAweEZFLCAweEY2LCAweDAyLCAweDAzLCAweDFCLCAweEZGLAorCTB4MTEsIDB4MDAsIDB4MkIsIDB4MDAsIDB4REUsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsCisJMHgwMCwgMHg0OSwgMHhGRiwgMHhDQiwgMHgwMSwgMHg0NSwgMHhGQywgMHgyOSwgMHgwNywgMHhCNiwgMHhGMSwKKwkweEFELCAweDJCLCAweEEyLCAweDM0LCAweDlFLCAweEYxLCAweEI0LCAweDA2LCAweEI4LCAweEZDLCAweDdBLAorCTB4MDEsIDB4NzUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsCisJMHhDQywgMHhGRiwgMHhDRSwgMHgwMCwgMHhEMSwgMHhGRCwgMHgxRCwgMHgwNSwgMHg5MSwgMHhGMywgMHhGRSwKKwkweDNELCAweEQ3LCAweDFGLCAweDg3LCAweEYzLCAweEMzLCAweDA2LCAweDQyLCAweEZDLCAweEU1LCAweDAxLAorCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUIsIDB4RkYsIDB4QUYsCisJMHgwMCwgMHgwMSwgMHhGRiwgMHgwQSwgMHgwMSwgMHg5RSwgMHhGRiwgMHg3QywgMHhGRCwgMHgwMywgMHg0OCwKKwkweEVELCAweDBBLCAweEQ1LCAweEY5LCAweDBBLCAweDA0LCAweDc0LCAweEZELCAweDZBLCAweDAxLCAweDYyLAorCTB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsIDB4RkYsCisJMHg5MCwgMHgwMSwgMHgyMCwgMHhGRCwgMHhCOCwgMHgwNCwgMHg2QSwgMHhGOCwgMHhDRCwgMHgwRSwgMHhFMSwKKwkweDQ2LCAweEUxLCAweEZBLCAweEVCLCAweDAwLCAweDUxLCAweDAwLCAweDY1LCAweEZGLCAweDdGLCAweDAwLAorCTB4QkUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsCisJMHgwMSwgMHgzMywgMHhGQywgMHgwNCwgMHgwNywgMHhCMSwgMHhGMiwgMHgyMSwgMHgyNCwgMHhFNiwgMHgzQSwKKwkweDk3LCAweEYyLCAweEQwLCAweDA1LCAweDVCLCAweEZELCAweDE1LCAweDAxLCAweEE5LCAweEZGLCAweDBGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OTAsIDB4RkYsIDB4NDUsIDB4MDEsCisJMHgwQiwgMHhGRCwgMHg0NCwgMHgwNiwgMHgwQSwgMHhGMiwgMHgzQiwgMHgzOCwgMHg4MCwgMHgyNywgMHgyQiwKKwkweEYyLCAweDIyLCAweDA3LCAweDMzLCAweEZDLCAweERFLCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4NTksIDB4MDAsIDB4QjMsIDB4RkYsIDB4QzQsCisJMHhGRiwgMHhFMiwgMHgwMSwgMHgwOSwgMHhGOSwgMHhBQSwgMHg0NSwgMHhGRSwgMHgxMSwgMHg1NCwgMHhGNywKKwkweDM4LCAweDA1LCAweEU0LCAweEZDLCAweEFBLCAweDAxLCAweDQ5LCAweEZGLCAweDMwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4NDksIDB4MDEsIDB4QkMsIDB4RkQsCisJMHg3QSwgMHgwMywgMHhGQSwgMHhGQSwgMHhGRCwgMHgwNywgMHg5QywgMHg0OCwgMHhDMywgMHhGRiwgMHg4OSwKKwkweEZFLCAweEExLCAweDAxLCAweEIxLCAweEZFLCAweEQ2LCAweDAwLCAweDlDLCAweEZGLCAweDE4LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsIDB4NUIsIDB4RkMsIDB4N0IsCisJMHgwNiwgMHg1MCwgMHhGNCwgMHg2RSwgMHgxQywgMHgzNiwgMHg0MCwgMHg5MiwgMHhGNCwgMHg3NSwgMHgwNCwKKwkweDNCLCAweEZFLCAweDkxLCAweDAwLCAweEVCLCAweEZGLCAweEY2LCAweEZGLCAweDA0LCAweDAwLCAweEZELAorCTB4RkYsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4OUQsIDB4MDEsIDB4ODQsIDB4RkMsIDB4RjMsIDB4MDYsCisJMHg3RCwgMHhGMSwgMHg5RSwgMHgzMSwgMHhFNiwgMHgyRSwgMHg4NSwgMHhGMSwgMHgxNiwgMHgwNywgMHg2MSwKKwkweEZDLCAweEI1LCAweDAxLCAweDU1LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLAorCTB4RUMsIDB4RkYsIDB4MDgsIDB4MDAsIDB4NTcsIDB4MDAsIDB4OUYsIDB4RkUsIDB4RDEsIDB4MDMsIDB4OUIsCisJMHhGNSwgMHhGNywgMHg0MSwgMHg3QywgMHgxOSwgMHgxMywgMHhGNSwgMHgyRiwgMHgwNiwgMHg3OCwgMHhGQywKKwkweEQ1LCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhGLAorCTB4RkYsIDB4RjcsIDB4MDAsIDB4NkIsIDB4RkUsIDB4MjUsIDB4MDIsIDB4OTEsIDB4RkQsIDB4RTMsIDB4MDEsCisJMHhFNSwgMHg0OCwgMHg4RCwgMHgwNSwgMHhGQiwgMHhGQiwgMHhGOCwgMHgwMiwgMHhGRSwgMHhGRCwgMHgyQiwKKwkweDAxLCAweDdBLCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLAorCTB4NDIsIDB4RkYsIDB4QkQsIDB4MDEsIDB4QjYsIDB4RkMsIDB4OUYsIDB4MDUsIDB4NkMsIDB4RjYsIDB4RDYsCisJMHgxNCwgMHg2NSwgMHg0NCwgMHg5OCwgMHhGNywgMHhBQywgMHgwMiwgMHg0RSwgMHhGRiwgMHhGNCwgMHhGRiwKKwkweDM5LCAweDAwLCAweEQ5LCAweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ1LAorCTB4RkYsIDB4RDIsIDB4MDEsIDB4M0QsIDB4RkMsIDB4MkIsIDB4MDcsIDB4RDQsIDB4RjEsIDB4NjQsIDB4MkEsCisJMHhDNiwgMHgzNSwgMHhCNywgMHhGMSwgMHg5NiwgMHgwNiwgMHhDRiwgMHhGQywgMHg2QiwgMHgwMSwgMHg3RCwKKwkweEZGLCAweDFGLCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA2LCAweDAwLCAweEMxLCAweEZGLAorCTB4RTUsIDB4MDAsIDB4QUEsIDB4RkQsIDB4NTgsIDB4MDUsIDB4M0EsIDB4RjMsIDB4MTEsIDB4M0QsIDB4MkMsCisJMHgyMSwgMHgzRiwgMHhGMywgMHhEQSwgMHgwNiwgMHgzQiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwKKwkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLCAweEIxLCAweEZGLCAweEEwLCAweDAwLCAweDIwLAorCTB4RkYsIDB4RDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QTQsIDB4RkMsIDB4QjYsIDB4NDcsIDB4MUMsIDB4MEMsCisJMHg2MywgMHhGOSwgMHg0MiwgMHgwNCwgMHg1OSwgMHhGRCwgMHg3NiwgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU3LCAweEZGLCAweDg1LCAweDAxLAorCTB4MzksIDB4RkQsIDB4ODQsIDB4MDQsIDB4RDksIDB4RjgsIDB4OTUsIDB4MEQsIDB4NDgsIDB4NDcsIDB4QTcsCisJMHhGQiwgMHg4NiwgMHgwMCwgMHg4QSwgMHgwMCwgMHg0NiwgMHhGRiwgMHg4RSwgMHgwMCwgMHhCOCwgMHhGRiwKKwkweDExLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM1LAorCTB4RkMsIDB4RjMsIDB4MDYsIDB4RUUsIDB4RjIsIDB4Q0QsIDB4MjIsIDB4RTQsIDB4M0IsIDB4REMsIDB4RjIsCisJMHg5QywgMHgwNSwgMHg3RSwgMHhGRCwgMHgwMCwgMHgwMSwgMHhCNCwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwKKwkweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDg3LCAweEZGLCAweDU3LCAweDAxLCAweEVGLCAweEZDLAorCTB4NkIsIDB4MDYsIDB4RTAsIDB4RjEsIDB4MjMsIDB4MzcsIDB4Q0UsIDB4MjgsIDB4MDEsIDB4RjIsIDB4MjgsCisJMHgwNywgMHgzNiwgMHhGQywgMHhEOSwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDBCLCAweDAwLCAweEQyLCAweEZGLCAweDRBLCAweDAwLCAweEQwLCAweEZGLCAweDhFLCAweEZGLCAweDNGLAorCTB4MDIsIDB4NUUsIDB4RjgsIDB4MUUsIDB4NDUsIDB4NDQsIDB4MTMsIDB4RUEsIDB4RjYsIDB4NjcsIDB4MDUsCisJMHhDRiwgMHhGQywgMHhCMywgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDIzLCAweDAwLCAweDc0LCAweEZGLCAweDNDLCAweDAxLCAweERBLCAweEZELCAweDQwLCAweDAzLAorCTB4NkUsIDB4RkIsIDB4RTEsIDB4MDYsIDB4QzMsIDB4NDgsIDB4QjMsIDB4MDAsIDB4MUEsIDB4RkUsIDB4REMsCisJMHgwMSwgMHg5MSwgMHhGRSwgMHhFNSwgMHgwMCwgMHg5NiwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERCLCAweDAxLCAweDY3LCAweEZDLCAweDVBLCAweDA2LCAweEE2LAorCTB4RjQsIDB4MUIsIDB4MUIsIDB4MDcsIDB4NDEsIDB4MDQsIDB4RjUsIDB4MkQsIDB4MDQsIDB4NjcsIDB4RkUsCisJMHg3NywgMHgwMCwgMHhGOCwgMHhGRiwgMHhGMiwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwKKwkweDAwLCAweDVDLCAweEZGLCAweEE4LCAweDAxLCAweDczLCAweEZDLCAweDA1LCAweDA3LCAweDdELCAweEYxLAorCTB4NjcsIDB4MzAsIDB4MjEsIDB4MzAsIDB4N0UsIDB4RjEsIDB4MDgsIDB4MDcsIDB4NkYsIDB4RkMsIDB4QUIsCisJMHgwMSwgMHg1QiwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGMCwgMHhGRiwKKwkweEZCLCAweEZGLCAweDcxLCAweDAwLCAweDcxLCAweEZFLCAweDFELCAweDA0LCAweDFGLCAweEY1LCAweDMyLAorCTB4NDEsIDB4Q0UsIDB4MUEsIDB4QkEsIDB4RjQsIDB4NTMsIDB4MDYsIDB4NkEsIDB4RkMsIDB4REEsIDB4MDEsCisJMHgzOCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5NSwgMHhGRiwgMHhFOCwKKwkweDAwLCAweDhBLCAweEZFLCAweEU5LCAweDAxLCAweDAxLCAweEZFLCAweEVBLCAweDAwLCAweENCLCAweDQ4LAorCTB4QTIsIDB4MDYsIDB4ODcsIDB4RkIsIDB4MzMsIDB4MDMsIDB4RTAsIDB4RkQsIDB4MzksIDB4MDEsIDB4NzUsCisJMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NSwgMHhGRiwKKwkweEI1LCAweDAxLCAweENBLCAweEZDLCAweDcyLCAweDA1LCAweEQzLCAweEY2LCAweDhELCAweDEzLCAweEZELAorCTB4NDQsIDB4MzksIDB4RjgsIDB4NTMsIDB4MDIsIDB4ODIsIDB4RkYsIDB4RDcsIDB4RkYsIDB4NDcsIDB4MDAsCisJMHhEMywgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MiwgMHhGRiwgMHhEOCwKKwkweDAxLCAweDM3LCAweEZDLCAweDI5LCAweDA3LCAweEY4LCAweEYxLCAweDE5LCAweDI5LCAweEU1LCAweDM2LAorCTB4RDgsIDB4RjEsIDB4NzMsIDB4MDYsIDB4RTksIDB4RkMsIDB4NUIsIDB4MDEsIDB4ODUsIDB4RkYsIDB4MUMsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhCNiwgMHhGRiwgMHhGQiwgMHgwMCwKKwkweDg1LCAweEZELCAweDkwLCAweDA1LCAweEVDLCAweEYyLCAweDFDLCAweDNDLCAweDgxLCAweDIyLCAweEZDLAorCTB4RjIsIDB4RUYsIDB4MDYsIDB4MzYsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNywgMHhGRiwgMHg5MSwgMHgwMCwgMHg0MCwgMHhGRiwgMHg5NiwKKwkweDAwLCAweDZGLCAweDAwLCAweEQ1LCAweEZCLCAweDVFLCAweDQ3LCAweDUwLCAweDBELCAweEYyLCAweEY4LAorCTB4NzgsIDB4MDQsIDB4M0YsIDB4RkQsIDB4ODIsIDB4MDEsIDB4NTgsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHg3OSwgMHgwMSwgMHg1MywgMHhGRCwKKwkweDRFLCAweDA0LCAweDRBLCAweEY5LCAweDYwLCAweDBDLCAweEEzLCAweDQ3LCAweDc2LCAweEZDLCAweDFGLAorCTB4MDAsIDB4QzMsIDB4MDAsIDB4MjcsIDB4RkYsIDB4OUQsIDB4MDAsIDB4QjIsIDB4RkYsIDB4MTMsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQSwgMHhGQywgMHhERiwKKwkweDA2LCAweDMwLCAweEYzLCAweDc4LCAweDIxLCAweERCLCAweDNDLCAweDI4LCAweEYzLCAweDY1LCAweDA1LAorCTB4QTIsIDB4RkQsIDB4RUEsIDB4MDAsIDB4QkUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgxRSwgMHgwMCwgMHg3RiwgMHhGRiwgMHg2NywgMHgwMSwgMHhENSwgMHhGQywgMHg4RSwgMHgwNiwKKwkweEJFLCAweEYxLCAweDA2LCAweDM2LCAweDFBLCAweDJBLCAweERDLCAweEYxLCAweDJBLCAweDA3LCAweDNDLAorCTB4RkMsIDB4RDMsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsCisJMHhEOCwgMHhGRiwgMHgzQywgMHgwMCwgMHhFRSwgMHhGRiwgMHg1QSwgMHhGRiwgMHg5OCwgMHgwMiwgMHhCQiwKKwkweEY3LCAweDg3LCAweDQ0LCAweDhDLCAweDE0LCAweDgzLCAweEY2LCAweDk1LCAweDA1LCAweEJBLCAweEZDLAorCTB4QkIsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsCisJMHgwMCwgMHg3OSwgMHhGRiwgMHgyRSwgMHgwMSwgMHhGNywgMHhGRCwgMHgwNSwgMHgwMywgMHhFMSwgMHhGQiwKKwkweENBLCAweDA1LCAweERGLCAweDQ4LCAweEFCLCAweDAxLCAweEFBLCAweEZELCAweDE4LCAweDAyLCAweDcyLAorCTB4RkUsIDB4RjQsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCisJMHgzOSwgMHhGRiwgMHhENiwgMHgwMSwgMHg3NSwgMHhGQywgMHgzNywgMHgwNiwgMHhGRiwgMHhGNCwgMHhDNywKKwkweDE5LCAweENDLCAweDQxLCAweDdGLCAweEY1LCAweEUyLCAweDAzLCAweDk1LCAweEZFLCAweDVELCAweDAwLAorCTB4MDUsIDB4MDAsIDB4RUQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTcsCisJMHhGRiwgMHhCMywgMHgwMSwgMHg2NCwgMHhGQywgMHgxMywgMHgwNywgMHg4MywgMHhGMSwgMHgyQywgMHgyRiwKKwkweDVBLCAweDMxLCAweDdELCAweEYxLCAweEY3LCAweDA2LCAweDgwLCAweEZDLCAweDlGLCAweDAxLCAweDYxLAorCTB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjUsIDB4RkYsIDB4RUUsIDB4RkYsCisJMHg4QiwgMHgwMCwgMHg0NCwgMHhGRSwgMHg2NSwgMHgwNCwgMHhBQSwgMHhGNCwgMHg2NiwgMHg0MCwgMHgyMywKKwkweDFDLCAweDYzLCAweEY0LCAweDc0LCAweDA2LCAweDVELCAweEZDLCAweERFLCAweDAxLCAweDM3LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsIDB4OUEsIDB4RkYsIDB4RDksIDB4MDAsIDB4QUEsCisJMHhGRSwgMHhBRSwgMHgwMSwgMHg3MCwgMHhGRSwgMHhGOCwgMHhGRiwgMHhBNiwgMHg0OCwgMHhCRSwgMHgwNywKKwkweDE0LCAweEZCLCAweDZELCAweDAzLCAweEMzLCAweEZELCAweDQ2LCAweDAxLCAweDcwLCAweEZGLCAweDI0LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDgsIDB4RkYsIDB4QUMsIDB4MDEsCisJMHhERiwgMHhGQywgMHg0MywgMHgwNSwgMHgzQywgMHhGNywgMHg0NiwgMHgxMiwgMHg4RCwgMHg0NSwgMHhFMiwKKwkweEY4LCAweEY3LCAweDAxLCAweEI4LCAweEZGLCAweEI5LCAweEZGLCAweDU2LCAweDAwLCAweENFLCAweEZGLAorCTB4MEMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsIDB4REQsIDB4MDEsIDB4MzQsCisJMHhGQywgMHgyMywgMHgwNywgMHgyMSwgMHhGMiwgMHhDQiwgMHgyNywgMHhGRSwgMHgzNywgMHgwMCwgMHhGMiwKKwkweDRELCAweDA2LCAweDA0LCAweEZELCAweDQ5LCAweDAxLCAweDhFLCAweEZGLCAweDE5LCAweDAwLCAweEZGLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QUIsIDB4RkYsIDB4MTAsIDB4MDEsIDB4NjIsIDB4RkQsCisJMHhDNSwgMHgwNSwgMHhBNSwgMHhGMiwgMHgxRiwgMHgzQiwgMHhENiwgMHgyMywgMHhCRSwgMHhGMiwgMHgwMSwKKwkweDA3LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAorCTB4MTAsIDB4MDAsIDB4QkQsIDB4RkYsIDB4ODIsIDB4MDAsIDB4NUUsIDB4RkYsIDB4NUQsIDB4MDAsIDB4RDQsCisJMHgwMCwgMHgwQywgMHhGQiwgMHhGOSwgMHg0NiwgMHg4NywgMHgwRSwgMHg4MiwgMHhGOCwgMHhBRCwgMHgwNCwKKwkweDI2LCAweEZELCAweDhELCAweDAxLCAweDU0LCAweEZGLCAweDJDLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAorCTB4MDAsIDB4MjksIDB4MDAsIDB4NjAsIDB4RkYsIDB4NkQsIDB4MDEsIDB4NkUsIDB4RkQsIDB4MTcsIDB4MDQsCisJMHhCQywgMHhGOSwgMHgzMCwgMHgwQiwgMHhGNCwgMHg0NywgMHg0QiwgMHhGRCwgMHhCNSwgMHhGRiwgMHhGRCwKKwkweDAwLCAweDA4LCAweEZGLCAweEFDLCAweDAwLCAweEFDLCAweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4NDEsIDB4RkMsIDB4QzgsIDB4MDYsIDB4NzYsCisJMHhGMywgMHgyMiwgMHgyMCwgMHhDQSwgMHgzRCwgMHg3RCwgMHhGMywgMHgyQSwgMHgwNSwgMHhDOCwgMHhGRCwKKwkweEQ0LCAweDAwLCAweENBLCAweEZGLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIxLAorCTB4MDAsIDB4NzcsIDB4RkYsIDB4NzcsIDB4MDEsIDB4QkQsIDB4RkMsIDB4QUUsIDB4MDYsIDB4QTMsIDB4RjEsCisJMHhFMywgMHgzNCwgMHg2NCwgMHgyQiwgMHhCQywgMHhGMSwgMHgyQSwgMHgwNywgMHg0MywgMHhGQywgMHhDRCwKKwkweDAxLCAweDQ4LCAweEZGLCAweDMxLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERELCAweEZGLAorCTB4MkUsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MjcsIDB4RkYsIDB4RUYsIDB4MDIsIDB4MjAsIDB4RjcsIDB4RTcsCisJMHg0MywgMHhEOCwgMHgxNSwgMHgxRSwgMHhGNiwgMHhDMCwgMHgwNSwgMHhBNywgMHhGQywgMHhDMywgMHgwMSwKKwkweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdGLAorCTB4RkYsIDB4MjAsIDB4MDEsIDB4MTYsIDB4RkUsIDB4Q0EsIDB4MDIsIDB4NTQsIDB4RkMsIDB4QjksIDB4MDQsCisJMHhGMiwgMHg0OCwgMHhBOSwgMHgwMiwgMHgzOSwgMHhGRCwgMHg1MywgMHgwMiwgMHg1MywgMHhGRSwgMHgwMywKKwkweDAxLCAweDhBLCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNCLCAweEZGLAorCTB4RDEsIDB4MDEsIDB4ODQsIDB4RkMsIDB4MTIsIDB4MDYsIDB4NUMsIDB4RjUsIDB4NzYsIDB4MTgsIDB4ODksCisJMHg0MiwgMHgwMiwgMHhGNiwgMHg5NCwgMHgwMywgMHhDNCwgMHhGRSwgMHg0MiwgMHgwMCwgMHgxMiwgMHgwMCwKKwkweEU4LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUxLCAweEZGLCAweEJELAorCTB4MDEsIDB4NTcsIDB4RkMsIDB4MUUsIDB4MDcsIDB4OTAsIDB4RjEsIDB4RUQsIDB4MkQsIDB4OEMsIDB4MzIsCisJMHg4MywgMHhGMSwgMHhFMiwgMHgwNiwgMHg5MiwgMHhGQywgMHg5MywgMHgwMSwgMHg2OCwgMHhGRiwgMHgyNiwKKwkweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZBLCAweEZGLCAweEUyLCAweEZGLCAweEE0LCAweDAwLAorCTB4MTksIDB4RkUsIDB4QUEsIDB4MDQsIDB4M0UsIDB4RjQsIDB4OTAsIDB4M0YsIDB4NzgsIDB4MUQsIDB4MTAsCisJMHhGNCwgMHg5MywgMHgwNiwgMHg1MiwgMHhGQywgMHhFMSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweEZFLCAweEZGLCAweDE3LCAweDAwLCAweEEwLCAweEZGLCAweENBLCAweDAwLCAweEM5LCAweEZFLCAweDczLAorCTB4MDEsIDB4REUsIDB4RkUsIDB4MEMsIDB4RkYsIDB4NzYsIDB4NDgsIDB4REUsIDB4MDgsIDB4QTEsIDB4RkEsCisJMHhBNiwgMHgwMywgMHhBNiwgMHhGRCwgMHg1MywgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRDLCAweEZGLCAweEEyLCAweDAxLCAweEY2LCAweEZDLAorCTB4MTIsIDB4MDUsIDB4QTcsIDB4RjcsIDB4MDMsIDB4MTEsIDB4MTAsIDB4NDYsIDB4OTMsIDB4RjksIDB4OTgsCisJMHgwMSwgMHhFRSwgMHhGRiwgMHg5QiwgMHhGRiwgMHg2NCwgMHgwMCwgMHhDOCwgMHhGRiwgMHgwRSwgMHgwMCwKKwkweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLCAweEUxLCAweDAxLCAweDMyLCAweEZDLCAweDFCLAorCTB4MDcsIDB4NTAsIDB4RjIsIDB4N0IsIDB4MjYsIDB4MTEsIDB4MzksIDB4MkYsIDB4RjIsIDB4MjMsIDB4MDYsCisJMHgyMiwgMHhGRCwgMHgzNywgMHgwMSwgMHg5NywgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDEyLCAweDAwLCAweEExLCAweEZGLCAweDI0LCAweDAxLCAweDQxLCAweEZELCAweEY2LCAweDA1LAorCTB4NjcsIDB4RjIsIDB4MUEsIDB4M0EsIDB4MjksIDB4MjUsIDB4ODQsIDB4RjIsIDB4MEYsIDB4MDcsIDB4MzEsCisJMHhGQywgMHhFMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwKKwkweEMyLCAweEZGLCAweDczLCAweDAwLCAweDdELCAweEZGLCAweDI1LCAweDAwLCAweDM4LCAweDAxLCAweDRDLAorCTB4RkEsIDB4ODksIDB4NDYsIDB4QzMsIDB4MEYsIDB4MTQsIDB4RjgsIDB4RTAsIDB4MDQsIDB4MEQsIDB4RkQsCisJMHg5OCwgMHgwMSwgMHg1MCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywKKwkweDAwLCAweDY1LCAweEZGLCAweDYwLCAweDAxLCAweDhBLCAweEZELCAweERGLCAweDAzLCAweDJFLCAweEZBLAorCTB4MDQsIDB4MEEsIDB4M0EsIDB4NDgsIDB4MjgsIDB4RkUsIDB4NEIsIDB4RkYsIDB4MzgsIDB4MDEsIDB4RTksCisJMHhGRSwgMHhCQiwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM2LCAweEZGLCAweEU0LCAweDAxLCAweDQ5LCAweEZDLCAweEFGLCAweDA2LCAweEMxLCAweEYzLCAweENELAorCTB4MUUsIDB4QjEsIDB4M0UsIDB4RDksIDB4RjMsIDB4RUMsIDB4MDQsIDB4RjAsIDB4RkQsIDB4QkMsIDB4MDAsCisJMHhENSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNCwgMHgwMCwgMHg2RiwKKwkweEZGLCAweDg1LCAweDAxLCAweEE2LCAweEZDLCAweENBLCAweDA2LCAweDhGLCAweEYxLCAweEJCLCAweDMzLAorCTB4QUIsIDB4MkMsIDB4QTMsIDB4RjEsIDB4MjYsIDB4MDcsIDB4NEMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4NEQsCisJMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMiwgMHhGRiwgMHgyMCwgMHgwMCwKKwkweDI2LCAweDAwLCAweEY1LCAweEZFLCAweDQzLCAweDAzLCAweDhELCAweEY2LCAweDNDLCAweDQzLCAweDI1LAorCTB4MTcsIDB4QkIsIDB4RjUsIDB4RUEsIDB4MDUsIDB4OTUsIDB4RkMsIDB4Q0EsIDB4MDEsIDB4M0QsIDB4RkYsCisJMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMSwKKwkweDAxLCAweDM0LCAweEZFLCAweDhGLCAweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLCAweEY3LCAweDQ4LAorCTB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsIDB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsIDB4MDEsIDB4ODQsCisJMHhGRiwgMHgxRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwKKwkweDNELCAweEZDLCAweEQ2LCAweDA2LCAweDRDLCAweEYzLCAweEVELCAweDIwLCAweDNELCAweDNELCAweDRBLAorCTB4RjMsIDB4NEUsIDB4MDUsIDB4QjEsIDB4RkQsIDB4RTEsIDB4MDAsIDB4QzMsIDB4RkYsIDB4MDUsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDMywgMHhGRiwgMHhFMSwgMHgwMCwgMHhCMSwKKwkweEZELCAweDRFLCAweDA1LCAweDRBLCAweEYzLCAweDNELCAweDNELCAweEVELCAweDIwLCAweDRDLCAweEYzLAorCTB4RDYsIDB4MDYsIDB4M0QsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwgMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwKKwkweDhGLCAweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLCAweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LAorCTB4RkMsIDB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0RCwgMHhGRiwgMHhDNSwgMHgwMSwgMHg0QywgMHhGQywgMHgyNiwKKwkweDA3LCAweEEzLCAweEYxLCAweEFCLCAweDJDLCAweEJCLCAweDMzLCAweDhGLCAweEYxLCAweENBLCAweDA2LAorCTB4QTYsIDB4RkMsIDB4ODUsIDB4MDEsIDB4NkYsIDB4RkYsIDB4MjQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTYsCisJMHgwMCwgMHhBNiwgMHhGRiwgMHhCQiwgMHgwMCwgMHhFOSwgMHhGRSwgMHgzOCwgMHgwMSwgMHg0QiwgMHhGRiwKKwkweDI4LCAweEZFLCAweDNBLCAweDQ4LCAweDA0LCAweDBBLCAweDJFLCAweEZBLCAweERGLCAweDAzLCAweDhBLAorCTB4RkQsIDB4NjAsIDB4MDEsIDB4NjUsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywgMHgwRiwgMHgwNywgMHg4NCwKKwkweEYyLCAweDI5LCAweDI1LCAweDFBLCAweDNBLCAweDY3LCAweEYyLCAweEY2LCAweDA1LCAweDQxLCAweEZELAorCTB4MjQsIDB4MDEsIDB4QTEsIDB4RkYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QzgsCisJMHhGRiwgMHg2NCwgMHgwMCwgMHg5QiwgMHhGRiwgMHhFRSwgMHhGRiwgMHg5OCwgMHgwMSwgMHg5MywgMHhGOSwKKwkweDEwLCAweDQ2LCAweDAzLCAweDExLCAweEE3LCAweEY3LCAweDEyLCAweDA1LCAweEY2LCAweEZDLCAweEEyLAorCTB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzNiwgMHhGRiwgMHhFMSwgMHgwMSwgMHg1MiwgMHhGQywgMHg5MywgMHgwNiwgMHgxMCwgMHhGNCwgMHg3OCwKKwkweDFELCAweDkwLCAweDNGLCAweDNFLCAweEY0LCAweEFBLCAweDA0LCAweDE5LCAweEZFLCAweEE0LCAweDAwLAorCTB4RTIsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MTIsCisJMHgwMCwgMHg0MiwgMHgwMCwgMHhDNCwgMHhGRSwgMHg5NCwgMHgwMywgMHgwMiwgMHhGNiwgMHg4OSwgMHg0MiwKKwkweDc2LCAweDE4LCAweDVDLCAweEY1LCAweDEyLCAweDA2LCAweDg0LCAweEZDLCAweEQxLCAweDAxLCAweDNCLAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsIDB4RkYsCisJMHhDMywgMHgwMSwgMHhBNywgMHhGQywgMHhDMCwgMHgwNSwgMHgxRSwgMHhGNiwgMHhEOCwgMHgxNSwgMHhFNywKKwkweDQzLCAweDIwLCAweEY3LCAweEVGLCAweDAyLCAweDI3LCAweEZGLCAweDBBLCAweDAwLCAweDJFLCAweDAwLAorCTB4REQsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4RDQsCisJMHgwMCwgMHhDOCwgMHhGRCwgMHgyQSwgMHgwNSwgMHg3RCwgMHhGMywgMHhDQSwgMHgzRCwgMHgyMiwgMHgyMCwKKwkweDc2LCAweEYzLCAweEM4LCAweDA2LCAweDQxLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTQsIDB4RkYsIDB4OEQsIDB4MDEsCisJMHgyNiwgMHhGRCwgMHhBRCwgMHgwNCwgMHg4MiwgMHhGOCwgMHg4NywgMHgwRSwgMHhGOSwgMHg0NiwgMHgwQywKKwkweEZCLCAweEQ0LCAweDAwLCAweDVELCAweDAwLCAweDVFLCAweEZGLCAweDgyLCAweDAwLCAweEJELCAweEZGLAorCTB4MTAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTksIDB4MDAsIDB4OEUsIDB4RkYsIDB4NDksIDB4MDEsIDB4MDQsCisJMHhGRCwgMHg0RCwgMHgwNiwgMHgwMCwgMHhGMiwgMHhGRSwgMHgzNywgMHhDQiwgMHgyNywgMHgyMSwgMHhGMiwKKwkweDIzLCAweDA3LCAweDM0LCAweEZDLCAweERELCAweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLCAweEZELAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzAsIDB4RkYsIDB4NDYsIDB4MDEsIDB4QzMsIDB4RkQsCisJMHg2RCwgMHgwMywgMHgxNCwgMHhGQiwgMHhCRSwgMHgwNywgMHhBNiwgMHg0OCwgMHhGOCwgMHhGRiwgMHg3MCwKKwkweEZFLCAweEFFLCAweDAxLCAweEFBLCAweEZFLCAweEQ5LCAweDAwLCAweDlBLCAweEZGLCAweDE5LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NjEsIDB4RkYsIDB4OUYsIDB4MDEsIDB4ODAsIDB4RkMsIDB4RjcsCisJMHgwNiwgMHg3RCwgMHhGMSwgMHg1QSwgMHgzMSwgMHgyQywgMHgyRiwgMHg4MywgMHhGMSwgMHgxMywgMHgwNywKKwkweDY0LCAweEZDLCAweEIzLCAweDAxLCAweDU3LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDFCLAorCTB4MDAsIDB4OTAsIDB4RkYsIDB4RjQsIDB4MDAsIDB4NzIsIDB4RkUsIDB4MTgsIDB4MDIsIDB4QUEsIDB4RkQsCisJMHhBQiwgMHgwMSwgMHhERiwgMHg0OCwgMHhDQSwgMHgwNSwgMHhFMSwgMHhGQiwgMHgwNSwgMHgwMywgMHhGNywKKwkweEZELCAweDJFLCAweDAxLCAweDc5LCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAorCTB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4RDMsIDB4MDEsIDB4M0MsIDB4RkMsIDB4MkEsIDB4MDcsIDB4REMsCisJMHhGMSwgMHgxQSwgMHgyQSwgMHgwNiwgMHgzNiwgMHhCRSwgMHhGMSwgMHg4RSwgMHgwNiwgMHhENSwgMHhGQywKKwkweDY3LCAweDAxLCAweDdGLCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDEzLCAweDAwLCAweEIyLAorCTB4RkYsIDB4OUQsIDB4MDAsIDB4MjcsIDB4RkYsIDB4QzMsIDB4MDAsIDB4MUYsIDB4MDAsIDB4NzYsIDB4RkMsCisJMHhBMywgMHg0NywgMHg2MCwgMHgwQywgMHg0QSwgMHhGOSwgMHg0RSwgMHgwNCwgMHg1MywgMHhGRCwgMHg3OSwKKwkweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAorCTB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkMsIDB4RUYsIDB4MDYsIDB4RkMsIDB4RjIsIDB4ODEsCisJMHgyMiwgMHgxQywgMHgzQywgMHhFQywgMHhGMiwgMHg5MCwgMHgwNSwgMHg4NSwgMHhGRCwgMHhGQiwgMHgwMCwKKwkweEI2LCAweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweDBCLCAweDAwLCAweEQzLCAweEZGLCAweDQ3LAorCTB4MDAsIDB4RDcsIDB4RkYsIDB4ODIsIDB4RkYsIDB4NTMsIDB4MDIsIDB4MzksIDB4RjgsIDB4RkQsIDB4NDQsCisJMHg4RCwgMHgxMywgMHhEMywgMHhGNiwgMHg3MiwgMHgwNSwgMHhDQSwgMHhGQywgMHhCNSwgMHgwMSwgMHg0NSwKKwkweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM4LCAweEZGLAorCTB4REEsIDB4MDEsIDB4NkEsIDB4RkMsIDB4NTMsIDB4MDYsIDB4QkEsIDB4RjQsIDB4Q0UsIDB4MUEsIDB4MzIsCisJMHg0MSwgMHgxRiwgMHhGNSwgMHgxRCwgMHgwNCwgMHg3MSwgMHhGRSwgMHg3MSwgMHgwMCwgMHhGQiwgMHhGRiwKKwkweEYwLCAweEZGLCAweDA1LCAweDAwLCAweDA1LCAweDAwLCAweEYyLCAweEZGLCAweEY4LCAweEZGLCAweDc3LAorCTB4MDAsIDB4NjcsIDB4RkUsIDB4MkQsIDB4MDQsIDB4MDQsIDB4RjUsIDB4MDcsIDB4NDEsIDB4MUIsIDB4MUIsCisJMHhBNiwgMHhGNCwgMHg1QSwgMHgwNiwgMHg2NywgMHhGQywgMHhEQiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLCAweEIzLCAweDAxLAorCTB4Q0YsIDB4RkMsIDB4NjcsIDB4MDUsIDB4RUEsIDB4RjYsIDB4NDQsIDB4MTMsIDB4MUUsIDB4NDUsIDB4NUUsCisJMHhGOCwgMHgzRiwgMHgwMiwgMHg4RSwgMHhGRiwgMHhEMCwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMiwgMHhGRiwKKwkweDBCLCAweDAwLCAweDAxLCAweDAwLCAweDBCLCAweDAwLCAweEI0LCAweEZGLCAweDAwLCAweDAxLCAweDdFLAorCTB4RkQsIDB4OUMsIDB4MDUsIDB4REMsIDB4RjIsIDB4RTQsIDB4M0IsIDB4Q0QsIDB4MjIsIDB4RUUsIDB4RjIsCisJMHhGMywgMHgwNiwgMHgzNSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVELCAweEZGLCAweDc2LCAweDAxLCAweDU5LCAweEZELAorCTB4NDIsIDB4MDQsIDB4NjMsIDB4RjksIDB4MUMsIDB4MEMsIDB4QjYsIDB4NDcsIDB4QTQsIDB4RkMsIDB4MDcsCisJMHgwMCwgMHhEMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhBMCwgMHgwMCwgMHhCMSwgMHhGRiwgMHgxMywgMHgwMCwKKwkweEZFLCAweEZGLCAweDFGLCAweDAwLCAweDdELCAweEZGLCAweDZCLCAweDAxLCAweENGLCAweEZDLCAweDk2LAorCTB4MDYsIDB4QjcsIDB4RjEsIDB4QzYsIDB4MzUsIDB4NjQsIDB4MkEsIDB4RDQsIDB4RjEsIDB4MkIsIDB4MDcsCisJMHgzRCwgMHhGQywgMHhEMiwgMHgwMSwgMHg0NSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDIxLCAweDAwLCAweDdBLCAweEZGLCAweDJCLCAweDAxLCAweEZFLCAweEZELCAweEY4LCAweDAyLAorCTB4RkIsIDB4RkIsIDB4OEQsIDB4MDUsIDB4RTUsIDB4NDgsIDB4RTMsIDB4MDEsIDB4OTEsIDB4RkQsIDB4MjUsCisJMHgwMiwgMHg2QiwgMHhGRSwgMHhGNywgMHgwMCwgMHg4RiwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDJELCAweDAwLCAweDU1LCAweEZGLCAweEI1LCAweDAxLCAweDYxLCAweEZDLCAweDE2LCAweDA3LCAweDg1LAorCTB4RjEsIDB4RTYsIDB4MkUsIDB4OUUsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjMsIDB4MDYsIDB4ODQsIDB4RkMsCisJMHg5RCwgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5QywKKwkweEZGLCAweEQ2LCAweDAwLCAweEIxLCAweEZFLCAweEExLCAweDAxLCAweDg5LCAweEZFLCAweEMzLCAweEZGLAorCTB4OUMsIDB4NDgsIDB4RkQsIDB4MDcsIDB4RkEsIDB4RkEsIDB4N0EsIDB4MDMsIDB4QkMsIDB4RkQsIDB4NDksCisJMHgwMSwgMHg2RSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweDNFLCAweEZGLCAweERFLCAweDAxLCAweDMzLCAweEZDLCAweDIyLCAweDA3LCAweDJCLCAweEYyLCAweDgwLAorCTB4MjcsIDB4M0IsIDB4MzgsIDB4MEEsIDB4RjIsIDB4NDQsIDB4MDYsIDB4MEIsIDB4RkQsIDB4NDUsIDB4MDEsCisJMHg5MCwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRSwgMHhGRiwgMHg3RiwKKwkweDAwLCAweDY1LCAweEZGLCAweDUxLCAweDAwLCAweEVCLCAweDAwLCAweEUxLCAweEZBLCAweEUxLCAweDQ2LAorCTB4Q0QsIDB4MEUsIDB4NkEsIDB4RjgsIDB4QjgsIDB4MDQsIDB4MjAsIDB4RkQsIDB4OTAsIDB4MDEsIDB4NTMsCisJMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwKKwkweEU1LCAweDAxLCAweDQyLCAweEZDLCAweEMzLCAweDA2LCAweDg3LCAweEYzLCAweEQ3LCAweDFGLCAweEZFLAorCTB4M0QsIDB4OTEsIDB4RjMsIDB4MUQsIDB4MDUsIDB4RDEsIDB4RkQsIDB4Q0UsIDB4MDAsIDB4Q0MsIDB4RkYsCisJMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhERSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgxMSwKKwkweDAwLCAweDFCLCAweEZGLCAweDAyLCAweDAzLCAweEZFLCAweEY2LCAweEMzLCAweDQzLCAweDIyLCAweDE2LAorCTB4MDcsIDB4RjYsIDB4Q0EsIDB4MDUsIDB4QTMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwgMHhDRiwgMHgwMSwKKwkweDg4LCAweEZDLCAweDA5LCAweDA2LCAweDcxLCAweEY1LCAweDJCLCAweDE4LCAweEIyLCAweDQyLCAweDIwLAorCTB4RjYsIDB4ODMsIDB4MDMsIDB4Q0YsIDB4RkUsIDB4M0MsIDB4MDAsIDB4MTUsIDB4MDAsIDB4RTYsIDB4RkYsCisJMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHhGQiwgMHhGRiwgMHhERiwgMHhGRiwgMHhBOSwgMHgwMCwgMHgxMCwKKwkweEZFLCAweEI5LCAweDA0LCAweDI3LCAweEY0LCAweDVFLCAweDNGLCAweEMzLCAweDFELCAweEZFLCAweEYzLAorCTB4OTksIDB4MDYsIDB4NTAsIDB4RkMsIDB4RTIsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0RCwgMHhGRiwgMHhBMCwgMHgwMSwgMHhGQiwgMHhGQywKKwkweDA3LCAweDA1LCAweEJGLCAweEY3LCAweEJCLCAweDEwLCAweDJCLCAweDQ2LCAweEJCLCAweEY5LCAweDgzLAorCTB4MDEsIDB4RkEsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NjgsIDB4MDAsIDB4QzcsIDB4RkYsIDB4MEUsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5RiwgMHhGRiwgMHgyOCwgMHgwMSwgMHgzQSwgMHhGRCwgMHgwMCwKKwkweDA2LCAweDVBLCAweEYyLCAweERGLCAweDM5LCAweDczLCAweDI1LCAweDc5LCAweEYyLCAweDEyLCAweDA3LAorCTB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwgMHg1RSwgMHgwMSwgMHg5MCwgMHhGRCwgMHhEMiwgMHgwMywKKwkweDQ3LCAweEZBLCAweEMzLCAweDA5LCAweDQ4LCAweDQ4LCAweDVBLCAweEZFLCAweDMzLCAweEZGLCAweDQ1LAorCTB4MDEsIDB4RTIsIDB4RkUsIDB4QkUsIDB4MDAsIDB4QTUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgyNCwgMHgwMCwgMHg2RCwgMHhGRiwgMHg4OCwgMHgwMSwgMHhBMiwgMHhGQywgMHhEMCwgMHgwNiwgMHg4QywKKwkweEYxLCAweDc4LCAweDMzLCAweEYyLCAweDJDLCAweDlFLCAweEYxLCAweDI0LCAweDA3LCAweDRFLCAweEZDLAorCTB4QzMsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4ODYsCisJMHhGRiwgMHgwRSwgMHgwMSwgMHgzQiwgMHhGRSwgMHg4MiwgMHgwMiwgMHhFMCwgMHhGQywgMHg3MywgMHgwMywKKwkweEY2LCAweDQ4LCAweEU5LCAweDAzLCAweEFELCAweEZDLCAweDlDLCAweDAyLCAweDJELCAweEZFLCAweDE0LAorCTB4MDEsIDB4ODMsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsCisJMHg0QywgMHhGRiwgMHhDNywgMHgwMSwgMHg0QSwgMHhGQywgMHgyNywgMHgwNywgMHhBOCwgMHhGMSwgMHg2MiwKKwkweDJDLCAweEZELCAweDMzLCAweDkzLCAweEYxLCAweEM0LCAweDA2LCAweEFCLCAweEZDLCAweDgyLCAweDAxLAorCTB4NzEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTgsIDB4RkYsIDB4QjgsCisJMHgwMCwgMHhGMCwgMHhGRSwgMHgyQiwgMHgwMSwgMHg2MywgMHhGRiwgMHhGNiwgMHhGRCwgMHgyQywgMHg0OCwKKwkweDQ3LCAweDBBLCAweDE0LCAweEZBLCAweEVCLCAweDAzLCAweDg0LCAweEZELCAweDYzLCAweDAxLCAweDY0LAorCTB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4M0EsIDB4RkYsCisJMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwQywgMHgwNywgMHg5MSwgMHhGMiwgMHhERCwgMHgyNCwgMHg1NCwKKwkweDNBLCAweDc0LCAweEYyLCAweEVCLCAweDA1LCAweDQ5LCAweEZELCAweDIwLCAweDAxLCAweEEzLCAweEZGLAorCTB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4QzksIDB4RkYsIDB4NjEsIDB4MDAsIDB4QTIsCisJMHhGRiwgMHhFMiwgMHhGRiwgMHhBRSwgMHgwMSwgMHg2QiwgMHhGOSwgMHhGMiwgMHg0NSwgMHg0QSwgMHgxMSwKKwkweDhGLCAweEY3LCAweDFELCAweDA1LCAweEYxLCAweEZDLCAweEE0LCAweDAxLCAweDRCLCAweEZGLCAweDJGLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTEsIDB4MDEsCisJMHg1NSwgMHhGQywgMHg4QywgMHgwNiwgMHgyMiwgMHhGNCwgMHgyQywgMHgxRCwgMHhDMCwgMHgzRiwgMHg1NSwKKwkweEY0LCAweDlCLCAweDA0LCAweDIzLCAweEZFLCAweDlGLCAweDAwLCAweEU0LCAweEZGLCAweEY5LCAweEZGLAorCTB4MDQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4RTksIDB4RkYsIDB4MEYsIDB4MDAsIDB4NDgsIDB4MDAsIDB4QjksCisJMHhGRSwgMHhBNiwgMHgwMywgMHhFNCwgMHhGNSwgMHg2MCwgMHg0MiwgMHhDMSwgMHgxOCwgMHg0NywgMHhGNSwKKwkweDFBLCAweDA2LCAweDgxLCAweEZDLCAweEQyLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZFLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsIDB4RkYsIDB4QzEsIDB4MDEsIDB4QUIsIDB4RkMsCisJMHhCNywgMHgwNSwgMHgzNCwgMHhGNiwgMHg4RSwgMHgxNSwgMHgwQiwgMHg0NCwgMHg0MiwgMHhGNywgMHhEQywKKwkweDAyLCAweDMyLCAweEZGLCAweDA0LCAweDAwLCAweDMxLCAweDAwLCAweERDLCAweEZGLCAweDA5LCAweDAwLAorCTB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsIDB4QzcsIDB4RkYsIDB4RDksIDB4MDAsIDB4QkYsIDB4RkQsIDB4MzgsCisJMHgwNSwgMHg2OSwgMHhGMywgMHg5NiwgMHgzRCwgMHg2RiwgMHgyMCwgMHg2NiwgMHhGMywgMHhDRSwgMHgwNiwKKwkweDNGLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLAorCTB4RkYsIDB4MkMsIDB4MDAsIDB4NTUsIDB4RkYsIDB4OEIsIDB4MDEsIDB4MkIsIDB4RkQsIDB4QTEsIDB4MDQsCisJMHg5QiwgMHhGOCwgMHg0MiwgMHgwRSwgMHgwRiwgMHg0NywgMHgzOCwgMHhGQiwgMHhCRSwgMHgwMCwgMHg2QSwKKwkweDAwLCAweDU4LCAweEZGLCAweDg1LCAweDAwLCAweEJCLCAweEZGLCAweDEwLCAweDAwLCAweEZGLCAweEZGLAorCTB4MTksIDB4MDAsIDB4OEMsIDB4RkYsIDB4NEQsIDB4MDEsIDB4RkUsIDB4RkMsIDB4NTYsIDB4MDYsIDB4RjcsCisJMHhGMSwgMHhCRiwgMHgzNywgMHgxNSwgMHgyOCwgMHgxOCwgMHhGMiwgMHgyNSwgMHgwNywgMHgzNCwgMHhGQywKKwkweERDLCAweDAxLCAweDNGLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI0LAorCTB4MDAsIDB4NzEsIDB4RkYsIDB4NDMsIDB4MDEsIDB4QzksIDB4RkQsIDB4NjAsIDB4MDMsIDB4MkUsIDB4RkIsCisJMHg3RSwgMHgwNywgMHhBRiwgMHg0OCwgMHgyRCwgMHgwMCwgMHg1OCwgMHhGRSwgMHhCQiwgMHgwMSwgMHhBMywKKwkweEZFLCAweERELCAweDAwLCAweDk5LCAweEZGLCAweDE5LCAweDAwLCAweEZELCAweEZGLCAweDI5LCAweDAwLAorCTB4NjAsIDB4RkYsIDB4QTIsIDB4MDEsIDB4N0MsIDB4RkMsIDB4RkIsIDB4MDYsIDB4N0MsIDB4RjEsIDB4MTUsCisJMHgzMSwgMHg3MywgMHgyRiwgMHg4MSwgMHhGMSwgMHgxMCwgMHgwNywgMHg2NywgMHhGQywgMHhCMSwgMHgwMSwKKwkweDU4LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDFCLCAweDAwLCAweDkxLCAweEZGLCAweEYxLAorCTB4MDAsIDB4NzksIDB4RkUsIDB4MEEsIDB4MDIsIDB4QzMsIDB4RkQsIDB4NzMsIDB4MDEsIDB4REIsIDB4NDgsCisJMHgwNywgMHgwNiwgMHhDNywgMHhGQiwgMHgxMiwgMHgwMywgMHhGMSwgMHhGRCwgMHgzMSwgMHgwMSwgMHg3OCwKKwkweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLAorCTB4RDUsIDB4MDEsIDB4M0EsIDB4RkMsIDB4MkEsIDB4MDcsIDB4RTMsIDB4RjEsIDB4RDEsIDB4MjksIDB4NDYsCisJMHgzNiwgMHhDNSwgMHhGMSwgMHg4NywgMHgwNiwgMHhEQSwgMHhGQywgMHg2NCwgMHgwMSwgMHg4MCwgMHhGRiwKKwkweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDEyLCAweDAwLCAweEIzLCAweEZGLCAweDk5LCAweDAwLCAweDJFLAorCTB4RkYsIDB4QjYsIDB4MDAsIDB4MzYsIDB4MDAsIDB4NDcsIDB4RkMsIDB4OTAsIDB4NDcsIDB4QTQsIDB4MEMsCisJMHgzMSwgMHhGOSwgMHg1QSwgMHgwNCwgMHg0RSwgMHhGRCwgMHg3QywgMHgwMSwgMHg1QiwgMHhGRiwgMHgyQSwKKwkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLAorCTB4MzcsIDB4RkMsIDB4RUIsIDB4MDYsIDB4MEIsIDB4RjMsIDB4MzUsIDB4MjIsIDB4NTIsIDB4M0MsIDB4RkQsCisJMHhGMiwgMHg4NCwgMHgwNSwgMHg4RCwgMHhGRCwgMHhGNiwgMHgwMCwgMHhCOCwgMHhGRiwgMHgwOSwgMHgwMCwKKwkweDAxLCAweDAwLCAweDBCLCAweDAwLCAweEQ1LCAweEZGLCAweDQ0LCAweDAwLCAweERELCAweEZGLCAweDc3LAorCTB4RkYsIDB4NjcsIDB4MDIsIDB4MTQsIDB4RjgsIDB4REMsIDB4NDQsIDB4RDUsIDB4MTMsIDB4QkMsIDB4RjYsCisJMHg3QywgMHgwNSwgMHhDNSwgMHhGQywgMHhCNywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwKKwkweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ5LCAweDAxLCAweDZELCAweEZDLAorCTB4NEIsIDB4MDYsIDB4Q0QsIDB4RjQsIDB4ODMsIDB4MUEsIDB4NUYsIDB4NDEsIDB4M0EsIDB4RjUsIDB4MEMsCisJMHgwNCwgMHg3QiwgMHhGRSwgMHg2QywgMHgwMCwgMHhGRSwgMHhGRiwgMHhFRiwgMHhGRiwgMHgwNSwgMHgwMCwKKwkweDA1LCAweDAwLCAweEYzLCAweEZGLCAweEY1LCAweEZGLCAweDdELCAweDAwLCAweDVELCAweEZFLCAweDNFLAorCTB4MDQsIDB4RUEsIDB4RjQsIDB4RDksIDB4NDAsIDB4NjYsIDB4MUIsIDB4OTMsIDB4RjQsIDB4NjIsIDB4MDYsCisJMHg2NCwgMHhGQywgMHhEQywgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwKKwkweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLCAweEIxLCAweDAxLCAweEQzLCAweEZDLCAweDVELCAweDA1LAorCTB4MDEsIDB4RjcsIDB4RkIsIDB4MTIsIDB4M0YsIDB4NDUsIDB4ODMsIDB4RjgsIDB4MkEsIDB4MDIsIDB4OUEsCisJMHhGRiwgMHhDQSwgMHhGRiwgMHg0RSwgMHgwMCwgMHhEMSwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDBDLCAweDAwLCAweEIxLCAweEZGLCAweDA0LCAweDAxLCAweDc2LCAweEZELCAweEE4LCAweDA1LCAweENDLAorCTB4RjIsIDB4QUIsIDB4M0IsIDB4MTgsIDB4MjMsIDB4RTAsIDB4RjIsIDB4RjcsIDB4MDYsIDB4MzUsIDB4RkMsCisJMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwKKwkweDAwLCAweDVFLCAweEZGLCAweDc0LCAweDAxLCAweDVGLCAweEZELCAweDM1LCAweDA0LCAweDdDLCAweEY5LAorCTB4RDgsIDB4MEIsIDB4QzksIDB4NDcsIDB4RDQsIDB4RkMsIDB4RjAsIDB4RkYsIDB4REQsIDB4MDAsIDB4MTksCisJMHhGRiwgMHhBNCwgMHgwMCwgMHhBRiwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwKKwkweDdCLCAweEZGLCAweDZFLCAweDAxLCAweENBLCAweEZDLCAweDlELCAweDA2LCAweEIxLCAweEYxLCAweDg2LAorCTB4MzUsIDB4QUUsIDB4MkEsIDB4Q0QsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0YsIDB4RkMsIDB4RDEsIDB4MDEsCisJMHg0NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QywKKwkweEZGLCAweDI3LCAweDAxLCAweDA1LCAweEZFLCAweEVCLCAweDAyLCAweDE0LCAweEZDLCAweDUwLCAweDA1LAorCTB4RUEsIDB4NDgsIDB4MUIsIDB4MDIsIDB4NzgsIDB4RkQsIDB4MzIsIDB4MDIsIDB4NjQsIDB4RkUsIDB4RkEsCisJMHgwMCwgMHg4RCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1NCwgMHhGRiwKKwkweEI3LCAweDAxLCAweDVFLCAweEZDLCAweDE5LCAweDA3LCAweDg4LCAweEYxLCAweDlGLCAweDJFLCAweEUzLAorCTB4MzEsIDB4N0UsIDB4RjEsIDB4RUUsIDB4MDYsIDB4ODgsIDB4RkMsIDB4OUEsIDB4MDEsIDB4NjQsIDB4RkYsCisJMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5RCwgMHhGRiwgMHhEMywgMHgwMCwgMHhCOCwKKwkweEZFLCAweDkzLCAweDAxLCAweEExLCAweEZFLCAweDhFLCAweEZGLCAweDkyLCAweDQ4LCAweDNELCAweDA4LAorCTB4RTEsIDB4RkEsIDB4ODYsIDB4MDMsIDB4QjYsIDB4RkQsIDB4NEMsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjUsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhERiwgMHgwMSwKKwkweDMzLCAweEZDLCAweDIwLCAweDA3LCAweDM1LCAweEYyLCAweDM2LCAweDI3LCAweDc4LCAweDM4LCAweDE0LAorCTB4RjIsIDB4M0IsIDB4MDYsIDB4MTEsIDB4RkQsIDB4NDEsIDB4MDEsIDB4OTIsIDB4RkYsIDB4MTcsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRiwgMHhGRiwgMHg3QiwgMHgwMCwgMHg2QywgMHhGRiwgMHg0NCwKKwkweDAwLCAweDAxLCAweDAxLCAweEI2LCAweEZBLCAweEM4LCAweDQ2LCAweDEzLCAweDBGLCAweDUxLCAweEY4LAorCTB4QzQsIDB4MDQsIDB4MUIsIDB4RkQsIDB4OTIsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0NCwgMHhGQywKKwkweEJELCAweDA2LCAweDk3LCAweEYzLCAweDhBLCAweDFGLCAweDMxLCAweDNFLCAweEE1LCAweEYzLCAweDBGLAorCTB4MDUsIDB4REEsIDB4RkQsIDB4QzksIDB4MDAsIDB4Q0YsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsCisJMHgwOSwgMHgwMCwgMHhERiwgMHhGRiwgMHgyOCwgMHgwMCwgMHgxNywgMHgwMCwgMHgxMCwgMHhGRiwgMHgxNSwKKwkweDAzLCAweERELCAweEY2LCAweDlFLCAweDQzLCAweDZDLCAweDE2LCAweEYxLCAweEY1LCAweEQzLCAweDA1LAorCTB4OUYsIDB4RkMsIDB4QzYsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwgMHhDRSwgMHgwMSwgMHg4QywgMHhGQywgMHgwMCwgMHgwNiwKKwkweDg2LCAweEY1LCAweEUwLCAweDE3LCAweERCLCAweDQyLCAweDNGLCAweEY2LCAweDcxLCAweDAzLCAweEQ5LAorCTB4RkUsIDB4MzYsIDB4MDAsIDB4MTgsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsCisJMHhGQywgMHhGRiwgMHhEQywgMHhGRiwgMHhBRiwgMHgwMCwgMHgwNywgMHhGRSwgMHhDOCwgMHgwNCwgMHgxMCwKKwkweEY0LCAweDJELCAweDNGLCAweDBGLCAweDFFLCAweEVELCAweEYzLCAweEEwLCAweDA2LCAweDRFLCAweEZDLAorCTB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkUsCisJMHgwMCwgMHg0RSwgMHhGRiwgMHg5RSwgMHgwMSwgMHgwMCwgMHhGRCwgMHhGQywgMHgwNCwgMHhENywgMHhGNywKKwkweDc1LCAweDEwLCAweDQ4LCAweDQ2LCAweEU0LCAweEY5LCAweDZFLCAweDAxLCAweDA2LCAweDAwLCAweDhFLAorCTB4RkYsIDB4NkIsIDB4MDAsIDB4QzYsIDB4RkYsIDB4MEUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDAsCisJMHg5RCwgMHhGRiwgMHgyRCwgMHgwMSwgMHgzMywgMHhGRCwgMHgwQiwgMHgwNiwgMHg0RCwgMHhGMiwgMHhBNSwKKwkweDM5LCAweEJGLCAweDI1LCAweDZELCAweEYyLCAweDE1LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLAorCTB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjgsCisJMHhGRiwgMHg1QiwgMHgwMSwgMHg5NiwgMHhGRCwgMHhDNiwgMHgwMywgMHg2MSwgMHhGQSwgMHg4MSwgMHgwOSwKKwkweDU3LCAweDQ4LCAweDhELCAweEZFLCAweDFCLCAweEZGLCAweDUyLCAweDAxLCAweERCLCAweEZFLCAweEMyLAorCTB4MDAsIDB4QTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkMsIDB4RkYsCisJMHg4QiwgMHgwMSwgMHg5RCwgMHhGQywgMHhENSwgMHgwNiwgMHg4OSwgMHhGMSwgMHgzNSwgMHgzMywgMHgzQSwKKwkweDJELCAweDlBLCAweEYxLCAweDIzLCAweDA3LCAweDUxLCAweEZDLCAweEMyLCAweDAxLCAweDRGLCAweEZGLAorCTB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4ODcsIDB4RkYsIDB4MEIsIDB4MDEsIDB4NDIsCisJMHhGRSwgMHg3NCwgMHgwMiwgMHhGOSwgMHhGQywgMHgzOSwgMHgwMywgMHhGNSwgMHg0OCwgMHgyNCwgMHgwNCwKKwkweDk0LCAweEZDLCAweEE5LCAweDAyLCAweDI3LCAweEZFLCAweDE4LCAweDAxLCAweDgyLCAweEZGLCAweDFGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QzksIDB4MDEsCisJMHg0OCwgMHhGQywgMHgyOCwgMHgwNywgMHhBRCwgMHhGMSwgMHgxOSwgMHgyQywgMHgzRiwgMHgzNCwgMHg5NywKKwkweEYxLCAweEJFLCAweDA2LCAweEIwLCAweEZDLCAweDdGLCAweDAxLCAweDcyLCAweEZGLCAweDIzLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTksIDB4RkYsIDB4QjQsIDB4MDAsIDB4RjcsIDB4RkUsIDB4MUQsCisJMHgwMSwgMHg3QSwgMHhGRiwgMHhDNSwgMHhGRCwgMHgxRCwgMHg0OCwgMHg4OSwgMHgwQSwgMHhGQiwgMHhGOSwKKwkweEY4LCAweDAzLCAweDdELCAweEZELCAweDY2LCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsCisJMHgwOSwgMHgwNywgMHg5RCwgMHhGMiwgMHg5MiwgMHgyNCwgMHg4RiwgMHgzQSwgMHg4MiwgMHhGMiwgMHhFMSwKKwkweDA1LCAweDUwLCAweEZELCAweDFCLCAweDAxLCAweEE2LCAweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MEQsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4NUUsIDB4MDAsIDB4QTksIDB4RkYsIDB4RDYsIDB4RkYsIDB4QzMsCisJMHgwMSwgMHg0MywgMHhGOSwgMHhENywgMHg0NSwgMHg5MiwgMHgxMSwgMHg3NywgMHhGNywgMHgyOCwgMHgwNSwKKwkweEVDLCAweEZDLCAweEE3LCAweDAxLCAweDRBLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweEZFLAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTAsIDB4MDEsIDB4NTcsIDB4RkMsIDB4ODUsIDB4MDYsCisJMHgzNCwgMHhGNCwgMHhFMCwgMHgxQywgMHhGMCwgMHgzRiwgMHg2RCwgMHhGNCwgMHg4QywgMHgwNCwgMHgyQywKKwkweEZFLCAweDk5LCAweDAwLCAweEU3LCAweEZGLCAweEY4LCAweEZGLCAweDA0LCAweDAwLCAweDA2LCAweDAwLAorCTB4RUEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4NEUsIDB4MDAsIDB4QUYsIDB4RkUsIDB4QjgsIDB4MDMsIDB4QzcsCisJMHhGNSwgMHgzOCwgMHg0MiwgMHgwQywgMHgxOSwgMHgzMiwgMHhGNSwgMHgyMywgMHgwNiwgMHg3RCwgMHhGQywKKwkweEQzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMyLAorCTB4MDAsIDB4NDEsIDB4RkYsIDB4QzAsIDB4MDEsIDB4QUYsIDB4RkMsIDB4QUQsIDB4MDUsIDB4NEEsIDB4RjYsCisJMHg0NCwgMHgxNSwgMHgyRiwgMHg0NCwgMHg2NCwgMHhGNywgMHhDOSwgMHgwMiwgMHgzRCwgMHhGRiwgMHhGRSwKKwkweEZGLCAweDM0LCAweDAwLCAweERCLCAweEZGLCAweDA5LCAweDAwLCAweDAyLCAweDAwLCAweDA1LCAweDAwLAorCTB4QzUsIDB4RkYsIDB4REUsIDB4MDAsIDB4QjcsIDB4RkQsIDB4NDUsIDB4MDUsIDB4NTYsIDB4RjMsIDB4NjEsCisJMHgzRCwgMHhCQSwgMHgyMCwgMHg1NiwgMHhGMywgMHhEMywgMHgwNiwgMHgzRSwgMHhGQywgMHhFNiwgMHgwMSwKKwkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU2LAorCTB4RkYsIDB4ODgsIDB4MDEsIDB4MzEsIDB4RkQsIDB4OTUsIDB4MDQsIDB4QjQsIDB4RjgsIDB4RkMsIDB4MEQsCisJMHgyNiwgMHg0NywgMHg2NCwgMHhGQiwgMHhBNywgMHgwMCwgMHg3NywgMHgwMCwgMHg1MSwgMHhGRiwgMHg4OSwKKwkweDAwLCAweEJBLCAweEZGLCAweDExLCAweDAwLCAweEZGLCAweEZGLCAweDFBLCAweDAwLCAweDhBLCAweEZGLAorCTB4NTEsIDB4MDEsIDB4RjgsIDB4RkMsIDB4NUUsIDB4MDYsIDB4RUQsIDB4RjEsIDB4ODIsIDB4MzcsIDB4NjAsCisJMHgyOCwgMHgwRSwgMHhGMiwgMHgyNiwgMHgwNywgMHgzNSwgMHhGQywgMHhEQiwgMHgwMSwgMHg0MCwgMHhGRiwKKwkweDM0LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDcyLCAweEZGLCAweDQwLAorCTB4MDEsIDB4RDAsIDB4RkQsIDB4NTMsIDB4MDMsIDB4NDcsIDB4RkIsIDB4M0YsIDB4MDcsIDB4QjgsIDB4NDgsCisJMHg2MiwgMHgwMCwgMHgzRiwgMHhGRSwgMHhDOCwgMHgwMSwgMHg5QywgMHhGRSwgMHhFMCwgMHgwMCwgMHg5OCwKKwkweEZGLCAweDE5LCAweDAwLCAweEZELCAweEZGLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweEE1LCAweDAxLAorCTB4NzgsIDB4RkMsIDB4RkYsIDB4MDYsIDB4N0QsIDB4RjEsIDB4Q0YsIDB4MzAsIDB4QjgsIDB4MkYsIDB4ODAsCisJMHhGMSwgMHgwRCwgMHgwNywgMHg2QSwgMHhGQywgMHhBRSwgMHgwMSwgMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwKKwkweEZELCAweEZGLCAweDFCLCAweDAwLCAweDkzLCAweEZGLCAweEVELCAweDAwLCAweDgwLCAweEZFLCAweEZELAorCTB4MDEsIDB4REMsIDB4RkQsIDB4M0MsIDB4MDEsIDB4RDUsIDB4NDgsIDB4NDUsIDB4MDYsIDB4QUUsIDB4RkIsCisJMHgxRiwgMHgwMywgMHhFQSwgMHhGRCwgMHgzNCwgMHgwMSwgMHg3NywgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQzLCAweEZGLCAweEQ2LCAweDAxLCAweDM5LCAweEZDLAorCTB4MkEsIDB4MDcsIDB4RUIsIDB4RjEsIDB4ODcsIDB4MjksIDB4ODUsIDB4MzYsIDB4Q0MsIDB4RjEsIDB4N0YsCisJMHgwNiwgMHhFMCwgMHhGQywgMHg2MCwgMHgwMSwgMHg4MiwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDEyLCAweDAwLCAweEI1LCAweEZGLCAweDk2LCAweDAwLCAweDM1LCAweEZGLCAweEE5LCAweDAwLCAweDRELAorCTB4MDAsIDB4MTksIDB4RkMsIDB4N0MsIDB4NDcsIDB4RTgsIDB4MEMsIDB4MTgsIDB4RjksIDB4NjYsIDB4MDQsCisJMHg0OCwgMHhGRCwgMHg3RSwgMHgwMSwgMHg1QSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM4LCAweEZDLCAweEU2LCAweDA2LAorCTB4MTksIDB4RjMsIDB4RUEsIDB4MjEsIDB4OEEsIDB4M0MsIDB4MEUsIDB4RjMsIDB4NzgsIDB4MDUsIDB4OTYsCisJMHhGRCwgMHhGMSwgMHgwMCwgMHhCQiwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwKKwkweEQ2LCAweEZGLCAweDQxLCAweDAwLCAweEU0LCAweEZGLCAweDZCLCAweEZGLCAweDdCLCAweDAyLCAweEYwLAorCTB4RjcsIDB4QkEsIDB4NDQsIDB4MUUsIDB4MTQsIDB4QTUsIDB4RjYsIDB4ODYsIDB4MDUsIDB4QzEsIDB4RkMsCisJMHhCOSwgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwKKwkweDAwLCAweDM5LCAweEZGLCAweEQ4LCAweDAxLCAweDcwLCAweEZDLCAweDQzLCAweDA2LCAweEUxLCAweEY0LAorCTB4MzgsIDB4MUEsIDB4OEMsIDB4NDEsIDB4NTUsIDB4RjUsIDB4RkMsIDB4MDMsIDB4ODUsIDB4RkUsIDB4NjYsCisJMHgwMCwgMHgwMSwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwNSwgMHgwMCwgMHhGNCwgMHhGRiwKKwkweEYyLCAweEZGLCAweDgzLCAweDAwLCAweDUzLCAweEZFLCAweDRFLCAweDA0LCAweEQwLCAweEY0LCAweEFCLAorCTB4NDAsIDB4QjIsIDB4MUIsIDB4N0YsIDB4RjQsIDB4NjksIDB4MDYsIDB4NjIsIDB4RkMsIDB4REQsIDB4MDEsCisJMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0NywKKwkweEZGLCAweEFGLCAweDAxLCAweEQ4LCAweEZDLCAweDUyLCAweDA1LCAweDE5LCAweEY3LCAweEIyLCAweDEyLAorCTB4NUMsIDB4NDUsIDB4QTksIDB4RjgsIDB4MTYsIDB4MDIsIDB4QTYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NTEsCisJMHgwMCwgMHhEMCwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhBRiwgMHhGRiwKKwkweDA5LCAweDAxLCAweDZFLCAweEZELCAweEI0LCAweDA1LCAweEJDLCAweEYyLCAweDczLCAweDNCLCAweDY0LAorCTB4MjMsIDB4RDIsIDB4RjIsIDB4RkIsIDB4MDYsIDB4MzQsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHg3MSwKKwkweDAxLCAweDY1LCAweEZELCAweDI5LCAweDA0LCAweDk2LCAweEY5LCAweDk1LCAweDBCLCAweERDLCAweDQ3LAorCTB4MDMsIDB4RkQsIDB4RDksIDB4RkYsIDB4RUEsIDB4MDAsIDB4MTIsIDB4RkYsIDB4QTcsIDB4MDAsIDB4QUUsCisJMHhGRiwgMHgxNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwgMHg3OSwgMHhGRiwgMHg3MiwgMHgwMSwKKwkweEM0LCAweEZDLCAweEE0LCAweDA2LCAweEFCLCAweEYxLCAweDQ2LCAweDM1LCAweEY3LCAweDJBLCAweEM2LAorCTB4RjEsIDB4MkEsIDB4MDcsIDB4NDAsIDB4RkMsIDB4Q0YsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzEsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RCwgMHhGRiwgMHgyNCwgMHgwMSwgMHgwQywKKwkweEZFLCAweERFLCAweDAyLCAweDJFLCAweEZDLCAweDEzLCAweDA1LCAweEVDLCAweDQ4LCAweDU0LCAweDAyLAorCTB4NUUsIDB4RkQsIDB4M0YsIDB4MDIsIDB4NUQsIDB4RkUsIDB4RkUsIDB4MDAsIDB4OEMsIDB4RkYsIDB4MUMsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywgMHhGRiwgMHhCQSwgMHgwMSwgMHg1QiwgMHhGQywKKwkweDFCLCAweDA3LCAweDhCLCAweEYxLCAweDU4LCAweDJFLCAweDI2LCAweDMyLCAweDgwLCAweEYxLCAweEVBLAorCTB4MDYsIDB4OEMsIDB4RkMsIDB4OTcsIDB4MDEsIDB4NjYsIDB4RkYsIDB4MjcsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgxNywgMHgwMCwgMHg5RSwgMHhGRiwgMHhDRiwgMHgwMCwgMHhCRiwgMHhGRSwgMHg4NiwgMHgwMSwgMHhCQSwKKwkweEZFLCAweDVBLCAweEZGLCAweDg2LCAweDQ4LCAweDdELCAweDA4LCAweEM3LCAweEZBLCAweDkzLCAweDAzLAorCTB4QjAsIDB4RkQsIDB4NEYsIDB4MDEsIDB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNSwgMHgwMCwgMHgzRCwgMHhGRiwgMHhERiwgMHgwMSwgMHgzMiwgMHhGQywgMHgxRSwgMHgwNywKKwkweDQwLCAweEYyLCAweEVCLCAweDI2LCAweEI1LCAweDM4LCAweDFGLCAweEYyLCAweDMyLCAweDA2LCAweDE4LAorCTB4RkQsIDB4M0QsIDB4MDEsIDB4OTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MDAsCisJMHhDMCwgMHhGRiwgMHg3OCwgMHgwMCwgMHg3MywgMHhGRiwgMHgzOCwgMHgwMCwgMHgxNywgMHgwMSwgMHg4QiwKKwkweEZBLCAweEFGLCAweDQ2LCAweDU5LCAweDBGLCAweDM5LCAweEY4LCAweENGLCAweDA0LCAweDE1LCAweEZELAorCTB4OTUsIDB4MDEsIDB4NTEsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0NiwgMHhGQywgMHhCOCwgMHgwNiwgMHhBOCwgMHhGMywKKwkweDNGLCAweDFGLCAweDY0LCAweDNFLCAweEJBLCAweEYzLCAweDAxLCAweDA1LCAweEUyLCAweEZELCAweEM0LAorCTB4MDAsIDB4RDIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RTEsIDB4RkYsCisJMHgyNSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgwNSwgMHhGRiwgMHgyOCwgMHgwMywgMHhCRCwgMHhGNiwgMHg3NywKKwkweDQzLCAweEI2LCAweDE2LCAweERDLCAweEY1LCAweERELCAweDA1LCAweDlCLCAweEZDLCAweEM4LCAweDAxLAorCTB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsCisJMHhGRiwgMHhDQywgMHgwMSwgMHg4RiwgMHhGQywgMHhGOCwgMHgwNSwgMHg5QiwgMHhGNSwgMHg5NiwgMHgxNywKKwkweDAyLCAweDQzLCAweDVFLCAweEY2LCAweDVGLCAweDAzLCAweEU0LCAweEZFLCAweDMwLCAweDAwLCAweDFCLAorCTB4MDAsIDB4RTQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RDksIDB4RkYsCisJMHhCNCwgMHgwMCwgMHhGRCwgMHhGRCwgMHhENywgMHgwNCwgMHhGQSwgMHhGMywgMHhGQywgMHgzRSwgMHg1QiwKKwkweDFFLCAweERCLCAweEYzLCAweEE2LCAweDA2LCAweDRDLCAweEZDLCAweEUzLCAweDAxLCAweDM2LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUMsCisJMHgwMSwgMHgwNSwgMHhGRCwgMHhGMSwgMHgwNCwgMHhGMCwgMHhGNywgMHgyRCwgMHgxMCwgMHg2MSwgMHg0NiwKKwkweDBELCAweEZBLCAweDU4LCAweDAxLCAweDEzLCAweDAwLCAweDg3LCAweEZGLCAweDZFLCAweDAwLCAweEM0LAorCTB4RkYsIDB4MEUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsIDB4OUIsIDB4RkYsIDB4MzEsIDB4MDEsCisJMHgyQywgMHhGRCwgMHgxNSwgMHgwNiwgMHg0MSwgMHhGMiwgMHg2QSwgMHgzOSwgMHgwQSwgMHgyNiwgMHg2MSwKKwkweEYyLCAweDE3LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjksIDB4RkYsIDB4NTgsIDB4MDEsIDB4OUQsCisJMHhGRCwgMHhCOSwgMHgwMywgMHg3QiwgMHhGQSwgMHg0MCwgMHgwOSwgMHg2MywgMHg0OCwgMHhCRiwgMHhGRSwKKwkweDAzLCAweEZGLCAweDVGLCAweDAxLCAweEQ0LCAweEZFLCAweEM1LCAweDAwLCAweEEyLCAweEZGLCAweDE2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkEsIDB4RkYsIDB4OEUsIDB4MDEsIDB4OTksIDB4RkMsCisJMHhEQiwgMHgwNiwgMHg4NiwgMHhGMSwgMHhGMiwgMHgzMiwgMHg4MiwgMHgyRCwgMHg5NiwgMHhGMSwgMHgyMSwKKwkweDA3LCAweDUzLCAweEZDLCAweEMwLCAweDAxLCAweDUwLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLAorCTB4MUQsIDB4MDAsIDB4ODgsIDB4RkYsIDB4MDcsIDB4MDEsIDB4NDksIDB4RkUsIDB4NjcsIDB4MDIsIDB4MTMsCisJMHhGRCwgMHhGRiwgMHgwMiwgMHhGNCwgMHg0OCwgMHg1RiwgMHgwNCwgMHg3QSwgMHhGQywgMHhCNiwgMHgwMiwKKwkweDIwLCAweEZFLCAweDFCLCAweDAxLCAweDgxLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweEZELAorCTB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsIDB4Q0EsIDB4MDEsIDB4NDYsIDB4RkMsIDB4MjksIDB4MDcsCisJMHhCMywgMHhGMSwgMHhEMSwgMHgyQiwgMHg4MSwgMHgzNCwgMHg5QywgMHhGMSwgMHhCOCwgMHgwNiwgMHhCNSwKKwkweEZDLCAweDdDLCAweDAxLCAweDc0LCAweEZGLCAweDIyLCAweDAwLCAweEZFLCAweEZGLCAweDE1LCAweDAwLAorCTB4QUEsIDB4RkYsIDB4QjEsIDB4MDAsIDB4RkUsIDB4RkUsIDB4MTAsIDB4MDEsIDB4OTIsIDB4RkYsIDB4OTQsCisJMHhGRCwgMHgwRCwgMHg0OCwgMHhDQiwgMHgwQSwgMHhFMiwgMHhGOSwgMHgwNCwgMHgwNCwgMHg3NywgMHhGRCwKKwkweDY5LCAweDAxLCAweDYyLCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzksIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MDYsIDB4MDcsIDB4QUEsIDB4RjIsCisJMHg0NiwgMHgyNCwgMHhDOCwgMHgzQSwgMHg5MCwgMHhGMiwgMHhENiwgMHgwNSwgMHg1NywgMHhGRCwgMHgxNywKKwkweDAxLCAweEE4LCAweEZGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweENDLCAweEZGLAorCTB4NUEsIDB4MDAsIDB4QUYsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4RDgsIDB4MDEsIDB4MUMsIDB4RjksIDB4QjgsCisJMHg0NSwgMHhEQSwgMHgxMSwgMHg2MCwgMHhGNywgMHgzMywgMHgwNSwgMHhFNywgMHhGQywgMHhBOSwgMHgwMSwKKwkweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LAorCTB4RkYsIDB4REYsIDB4MDEsIDB4NUEsIDB4RkMsIDB4N0UsIDB4MDYsIDB4NDcsIDB4RjQsIDB4OTQsIDB4MUMsCisJMHgxRiwgMHg0MCwgMHg4NSwgMHhGNCwgMHg3RCwgMHgwNCwgMHgzNiwgMHhGRSwgMHg5MywgMHgwMCwgMHhFQSwKKwkweEZGLCAweEY3LCAweEZGLCAweDA0LCAweDAwLCAweDA2LCAweDAwLCAweEVCLCAweEZGLCAweDA5LCAweDAwLAorCTB4NTQsIDB4MDAsIDB4QTQsIDB4RkUsIDB4QzksIDB4MDMsIDB4QUEsIDB4RjUsIDB4MEMsIDB4NDIsIDB4NTYsCisJMHgxOSwgMHgxRSwgMHhGNSwgMHgyQiwgMHgwNiwgMHg3QSwgMHhGQywgMHhENCwgMHgwMSwgMHgzQSwgMHhGRiwKKwkweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJFLAorCTB4MDEsIDB4QjQsIDB4RkMsIDB4QTQsIDB4MDUsIDB4NjEsIDB4RjYsIDB4RkIsIDB4MTQsIDB4NTMsIDB4NDQsCisJMHg4NiwgMHhGNywgMHhCNiwgMHgwMiwgMHg0OSwgMHhGRiwgMHhGNywgMHhGRiwgMHgzNywgMHgwMCwgMHhEOSwKKwkweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweDA2LCAweDAwLCAweEMyLCAweEZGLCAweEUzLCAweDAwLAorCTB4QUUsIDB4RkQsIDB4NTIsIDB4MDUsIDB4NDQsIDB4RjMsIDB4MkEsIDB4M0QsIDB4MDYsIDB4MjEsIDB4NDcsCisJMHhGMywgMHhEOCwgMHgwNiwgMHgzQywgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU3LCAweEZGLCAweDg2LCAweDAxLCAweDM2LAorCTB4RkQsIDB4ODksIDB4MDQsIDB4Q0QsIDB4RjgsIDB4QjcsIDB4MEQsIDB4M0QsIDB4NDcsIDB4OTEsIDB4RkIsCisJMHg5MSwgMHgwMCwgMHg4MywgMHgwMCwgMHg0QSwgMHhGRiwgMHg4QywgMHgwMCwgMHhCOSwgMHhGRiwgMHgxMSwKKwkweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDg4LCAweEZGLCAweDU1LCAweDAxLCAweEYyLCAweEZDLAorCTB4NjcsIDB4MDYsIDB4RTQsIDB4RjEsIDB4NDQsIDB4MzcsIDB4QUEsIDB4MjgsIDB4MDUsIDB4RjIsIDB4MjcsCisJMHgwNywgMHgzNiwgMHhGQywgMHhEQSwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDczLCAweEZGLCAweDNELCAweDAxLCAweEQ2LCAweEZELCAweDQ2LAorCTB4MDMsIDB4NjEsIDB4RkIsIDB4MDAsIDB4MDcsIDB4QkYsIDB4NDgsIDB4OTgsIDB4MDAsIDB4MjYsIDB4RkUsCisJMHhENSwgMHgwMSwgMHg5NSwgMHhGRSwgMHhFMywgMHgwMCwgMHg5NiwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDJBLCAweDAwLCAweDVELCAweEZGLCAweEE3LCAweDAxLCAweDc1LCAweEZDLCAweDAzLCAweDA3LAorCTB4N0QsIDB4RjEsIDB4OEEsIDB4MzAsIDB4RkYsIDB4MkYsIDB4N0UsIDB4RjEsIDB4MEEsIDB4MDcsIDB4NkUsCisJMHhGQywgMHhBQywgMHgwMSwgMHg1QSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQSwgMHgwMCwKKwkweDk0LCAweEZGLCAweEVBLCAweDAwLCAweDg3LCAweEZFLCAweEYwLCAweDAxLCAweEY1LCAweEZELCAweDA1LAorCTB4MDEsIDB4Q0UsIDB4NDgsIDB4ODMsIDB4MDYsIDB4OTQsIDB4RkIsIDB4MkMsIDB4MDMsIDB4RTQsIDB4RkQsCisJMHgzNywgMHgwMSwgMHg3NiwgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywKKwkweDAwLCAweDQyLCAweEZGLCAweEQ3LCAweDAxLCAweDM4LCAweEZDLCAweDI5LCAweDA3LCAweEYzLCAweEYxLAorCTB4M0UsIDB4MjksIDB4QzYsIDB4MzYsIDB4RDQsIDB4RjEsIDB4NzcsIDB4MDYsIDB4RTYsIDB4RkMsIDB4NUMsCisJMHgwMSwgMHg4NCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNiwgMHhGRiwKKwkweDkzLCAweDAwLCAweDNDLCAweEZGLCAweDlELCAweDAwLCAweDYzLCAweDAwLCAweEVCLCAweEZCLCAweDY5LAorCTB4NDcsIDB4MkQsIDB4MEQsIDB4RkYsIDB4RjgsIDB4NzIsIDB4MDQsIDB4NDIsIDB4RkQsIDB4ODEsIDB4MDEsCisJMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywKKwkweEZGLCAweEU2LCAweDAxLCAweDNBLCAweEZDLCAweEUyLCAweDA2LCAweDI4LCAweEYzLCAweDlFLCAweDIxLAorCTB4QzAsIDB4M0MsIDB4MUYsIDB4RjMsIDB4NkMsIDB4MDUsIDB4OUUsIDB4RkQsIDB4RUQsIDB4MDAsIDB4QkQsCisJMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhENywgMHhGRiwgMHgzRSwgMHgwMCwKKwkweEVBLCAweEZGLCAweDYwLCAweEZGLCAweDhGLCAweDAyLCAweENELCAweEY3LCAweDk5LCAweDQ0LCAweDY4LAorCTB4MTQsIDB4OEUsIDB4RjYsIDB4OTAsIDB4MDUsIDB4QkMsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NDMsIDB4RkYsCisJMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhENywKKwkweDAxLCAweDczLCAweEZDLCAweDNCLCAweDA2LCAweEY1LCAweEY0LCAweEVELCAweDE5LCAweEI3LCAweDQxLAorCTB4NzEsIDB4RjUsIDB4RUIsIDB4MDMsIDB4OTAsIDB4RkUsIDB4NjAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RUQsCisJMHhGRiwgMHgwNiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGNSwgMHhGRiwgMHhFRiwgMHhGRiwgMHg4OCwgMHgwMCwKKwkweDQ5LCAweEZFLCAweDVELCAweDA0LCAweEI3LCAweEY0LCAweDdELCAweDQwLCAweEZELCAweDFCLCAweDZDLAorCTB4RjQsIDB4NzAsIDB4MDYsIDB4NUYsIDB4RkMsIDB4REUsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0OCwgMHhGRiwgMHhBRCwgMHgwMSwgMHhERCwKKwkweEZDLCAweDQ4LCAweDA1LCAweDMwLCAweEY3LCAweDZCLCAweDEyLCAweDdELCAweDQ1LCAweENGLCAweEY4LAorCTB4MDEsIDB4MDIsIDB4QjIsIDB4RkYsIDB4QkQsIDB4RkYsIDB4NTQsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4MEMsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhBQywgMHhGRiwgMHgwRSwgMHgwMSwgMHg2NiwgMHhGRCwKKwkweEJGLCAweDA1LCAweEFELCAweEYyLCAweDNCLCAweDNCLCAweEIwLCAweDIzLCAweEM0LCAweEYyLCAweEZGLAorCTB4MDYsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg2MCwgMHhGRiwgMHg2RSwgMHgwMSwgMHg2QiwgMHhGRCwgMHgxRCwKKwkweDA0LCAweEFGLCAweEY5LCAweDUxLCAweDBCLCAweEVDLCAweDQ3LCAweDMzLCAweEZELCAweEMxLCAweEZGLAorCTB4RjcsIDB4MDAsIDB4MEMsIDB4RkYsIDB4QUEsIDB4MDAsIDB4QUQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgyMSwgMHgwMCwgMHg3NywgMHhGRiwgMHg3NSwgMHgwMSwgMHhCRiwgMHhGQywgMHhBQiwgMHgwNiwKKwkweEE2LCAweEYxLCAweDA1LCAweDM1LCAweDQwLCAweDJCLCAweEJGLCAweEYxLCAweDJBLCAweDA3LCAweDQyLAorCTB4RkMsIDB4Q0UsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgyMCwgMHgwMCwgMHg3RSwgMHhGRiwgMHgyMSwgMHgwMSwgMHgxMiwgMHhGRSwgMHhEMSwgMHgwMiwgMHg0NywKKwkweEZDLCAweEQ3LCAweDA0LCAweEYwLCAweDQ4LCAweDhELCAweDAyLCAweDQ1LCAweEZELCAweDRELCAweDAyLAorCTB4NTYsIDB4RkUsIDB4MDEsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsCisJMHgwMCwgMHg1MiwgMHhGRiwgMHhCQywgMHgwMSwgMHg1OCwgMHhGQywgMHgxRCwgMHgwNywgMHg4RSwgMHhGMSwKKwkweDExLCAweDJFLCAweDZCLCAweDMyLCAweDgxLCAweEYxLCAweEU1LCAweDA2LCAweDkwLCAweEZDLCAweDk0LAorCTB4MDEsIDB4NjcsIDB4RkYsIDB4MjYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTAsIDB4RkYsCisJMHhDQywgMHgwMCwgMHhDNiwgMHhGRSwgMHg3OSwgMHgwMSwgMHhEMiwgMHhGRSwgMHgyNiwgMHhGRiwgMHg3QywKKwkweDQ4LCAweEJFLCAweDA4LCAweEFFLCAweEZBLCAweEEwLCAweDAzLCAweEE5LCAweEZELCAweDUyLCAweDAxLAorCTB4NkIsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsCisJMHhGRiwgMHhFMCwgMHgwMSwgMHgzMiwgMHhGQywgMHgxQywgMHgwNywgMHg0QiwgMHhGMiwgMHhBMCwgMHgyNiwKKwkweEYyLCAweDM4LCAweDJBLCAweEYyLCAweDI4LCAweDA2LCAweDFGLCAweEZELCAweDM5LCAweDAxLCAweDk2LAorCTB4RkYsIDB4MTYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzIsIDB4RkYsIDB4NzUsIDB4MDAsCisJMHg3QSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgyRCwgMHgwMSwgMHg2MSwgMHhGQSwgMHg5NywgMHg0NiwgMHhBMCwKKwkweDBGLCAweDIwLCAweEY4LCAweERBLCAweDA0LCAweDEwLCAweEZELCAweDk3LCAweDAxLCAweDUwLCAweEZGLAorCTB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsCisJMHgwMSwgMHg0OCwgMHhGQywgMHhCMiwgMHgwNiwgMHhCOSwgMHhGMywgMHhGMywgMHgxRSwgMHg5OCwgMHgzRSwKKwkweENGLCAweEYzLCAweEYzLCAweDA0LCAweEVCLCAweEZELCAweEJGLCAweDAwLCAweEQ0LCAweEZGLCAweEZGLAorCTB4RkYsIDB4MDMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MjMsIDB4MDAsCisJMHhGQSwgMHhGRSwgMHgzQSwgMHgwMywgMHg5RCwgMHhGNiwgMHg1MCwgMHg0MywgMHgwMCwgMHgxNywgMHhDNiwKKwkweEY1LCAweEU2LCAweDA1LCAweDk3LCAweEZDLCAweEM5LCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsIDB4Q0IsIDB4MDEsIDB4OTMsCisJMHhGQywgMHhFRiwgMHgwNSwgMHhCMCwgMHhGNSwgMHg0QiwgMHgxNywgMHgyQSwgMHg0MywgMHg3RCwgMHhGNiwKKwkweDRELCAweDAzLCAweEVGLCAweEZFLCAweDJBLCAweDAwLCAweDFFLCAweDAwLCAweEUzLCAweEZGLCAweDA4LAorCTB4MDAsIDB4MDMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RDcsIDB4RkYsIDB4QkEsIDB4MDAsIDB4RjQsIDB4RkQsCisJMHhFNSwgMHgwNCwgMHhFNCwgMHhGMywgMHhDQSwgMHgzRSwgMHhBNywgMHgxRSwgMHhDQSwgMHhGMywgMHhBQywKKwkweDA2LCAweDRBLCAweEZDLCAweEU0LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLAorCTB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEYsIDB4RkYsIDB4OTksIDB4MDEsIDB4MEIsIDB4RkQsIDB4RTYsCisJMHgwNCwgMHgwOCwgMHhGOCwgMHhFNywgMHgwRiwgMHg3QywgMHg0NiwgMHgzNywgMHhGQSwgMHg0MiwgMHgwMSwKKwkweDFGLCAweDAwLCAweDgxLCAweEZGLCAweDcxLCAweDAwLCAweEMzLCAweEZGLCAweDBGLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MTUsIDB4MDAsIDB4OTgsIDB4RkYsIDB4MzUsIDB4MDEsIDB4MjUsIDB4RkQsIDB4MUUsIDB4MDYsCisJMHgzNSwgMHhGMiwgMHgyRSwgMHgzOSwgMHg1NSwgMHgyNiwgMHg1NiwgMHhGMiwgMHgxQSwgMHgwNywgMHgzMSwKKwkweEZDLCAweEUxLCAweDAxLCAweDNDLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLAorCTB4MjYsIDB4MDAsIDB4NkEsIDB4RkYsIDB4NTUsIDB4MDEsIDB4QTMsIDB4RkQsIDB4QUQsIDB4MDMsIDB4OTQsCisJMHhGQSwgMHhGRiwgMHgwOCwgMHg3MCwgMHg0OCwgMHhGMywgMHhGRSwgMHhFQSwgMHhGRSwgMHg2QywgMHgwMSwKKwkweENELCAweEZFLCAweEM5LCAweDAwLCAweEExLCAweEZGLCAweDE3LCAweDAwLCAweEZELCAweEZGLCAweDI2LAorCTB4MDAsIDB4NjksIDB4RkYsIDB4OTEsIDB4MDEsIDB4OTQsIDB4RkMsIDB4RTAsIDB4MDYsIDB4ODQsIDB4RjEsCisJMHhBRiwgMHgzMiwgMHhDQSwgMHgyRCwgMHg5MiwgMHhGMSwgMHgxRiwgMHgwNywgMHg1NiwgMHhGQywgMHhCRSwKKwkweDAxLCAweDUxLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDFELCAweDAwLCAweDhBLCAweEZGLAorCTB4MDQsIDB4MDEsIDB4NTAsIDB4RkUsIDB4NUEsIDB4MDIsIDB4MkMsIDB4RkQsIDB4QzYsIDB4MDIsIDB4RjIsCisJMHg0OCwgMHg5QiwgMHgwNCwgMHg2MSwgMHhGQywgMHhDMywgMHgwMiwgMHgxOSwgMHhGRSwgMHgxRSwgMHgwMSwKKwkweDdGLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ5LAorCTB4RkYsIDB4Q0MsIDB4MDEsIDB4NDQsIDB4RkMsIDB4MjksIDB4MDcsIDB4QjksIDB4RjEsIDB4ODksIDB4MkIsCisJMHhDMywgMHgzNCwgMHhBMCwgMHhGMSwgMHhCMSwgMHgwNiwgMHhCQSwgMHhGQywgMHg3OSwgMHgwMSwgMHg3NiwKKwkweEZGLCAweDIxLCAweDAwLCAweEZFLCAweEZGLCAweDE0LCAweDAwLCAweEFDLCAweEZGLCAweEFFLCAweDAwLAorCTB4MDUsIDB4RkYsIDB4MDMsIDB4MDEsIDB4QUEsIDB4RkYsIDB4NjMsIDB4RkQsIDB4RkQsIDB4NDcsIDB4MEUsCisJMHgwQiwgMHhDOCwgMHhGOSwgMHgxMSwgMHgwNCwgMHg3MSwgMHhGRCwgMHg2QywgMHgwMSwgMHg2MSwgMHhGRiwKKwkweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LAorCTB4MDEsIDB4MzMsIDB4RkMsIDB4MDMsIDB4MDcsIDB4QjcsIDB4RjIsIDB4RkMsIDB4MjMsIDB4MDMsIDB4M0IsCisJMHg5RSwgMHhGMiwgMHhDQiwgMHgwNSwgMHg1RiwgMHhGRCwgMHgxMiwgMHgwMSwgMHhBQSwgMHhGRiwgMHgwRSwKKwkweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweENELCAweEZGLCAweDU3LCAweDAwLCAweEI2LCAweEZGLAorCTB4QkUsIDB4RkYsIDB4RUQsIDB4MDEsIDB4RjUsIDB4RjgsIDB4OUIsIDB4NDUsIDB4MjIsIDB4MTIsIDB4NDgsCisJMHhGNywgMHgzRCwgMHgwNSwgMHhFMiwgMHhGQywgMHhBQiwgMHgwMSwgMHg0OSwgMHhGRiwgMHgzMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERGLCAweDAxLCAweDVDLAorCTB4RkMsIDB4NzgsIDB4MDYsIDB4NUEsIDB4RjQsIDB4NDksIDB4MUMsIDB4NEUsIDB4NDAsIDB4OUUsIDB4RjQsCisJMHg2RCwgMHgwNCwgMHgzRiwgMHhGRSwgMHg4RSwgMHgwMCwgMHhFRCwgMHhGRiwgMHhGNiwgMHhGRiwgMHgwNCwKKwkweDAwLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LCAweDAwLCAweDVBLCAweDAwLCAweDlBLCAweEZFLAorCTB4REEsIDB4MDMsIDB4OEQsIDB4RjUsIDB4RTEsIDB4NDEsIDB4QTEsIDB4MTksIDB4MDksIDB4RjUsIDB4MzMsCisJMHgwNiwgMHg3NywgMHhGQywgMHhENiwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJDLCAweDAxLCAweEI4LCAweEZDLCAweDlBLAorCTB4MDUsIDB4NzcsIDB4RjYsIDB4QjEsIDB4MTQsIDB4NzcsIDB4NDQsIDB4QTksIDB4RjcsIDB4QTIsIDB4MDIsCisJMHg1NCwgMHhGRiwgMHhGMSwgMHhGRiwgMHgzQSwgMHgwMCwgMHhEOCwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwKKwkweDAwLCAweDA3LCAweDAwLCAweEMwLCAweEZGLCAweEU4LCAweDAwLCAweEE2LCAweEZELCAweDVGLCAweDA1LAorCTB4MzEsIDB4RjMsIDB4RjYsIDB4M0MsIDB4NTIsIDB4MjEsIDB4MzcsIDB4RjMsIDB4REQsIDB4MDYsIDB4M0IsCisJMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDJCLCAweDAwLCAweDU4LCAweEZGLCAweDgzLCAweDAxLCAweDNDLCAweEZELCAweDdFLCAweDA0LCAweEU2LAorCTB4RjgsIDB4NzIsIDB4MEQsIDB4NTIsIDB4NDcsIDB4QkUsIDB4RkIsIDB4N0EsIDB4MDAsIDB4OTAsIDB4MDAsCisJMHg0MywgMHhGRiwgMHg4RiwgMHgwMCwgMHhCNywgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywKKwkweDAwLCAweDg2LCAweEZGLCAweDU5LCAweDAxLCAweEVDLCAweEZDLCAweDZGLCAweDA2LCAweERDLCAweEYxLAorCTB4MDQsIDB4MzcsIDB4RjMsIDB4MjgsIDB4RkMsIDB4RjEsIDB4MjgsIDB4MDcsIDB4MzcsIDB4RkMsIDB4RDgsCisJMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwKKwkweDc0LCAweEZGLCAweDNBLCAweDAxLCAweERELCAweEZELCAweDM5LCAweDAzLCAweDdCLCAweEZCLCAweEMxLAorCTB4MDYsIDB4QzcsIDB4NDgsIDB4Q0YsIDB4MDAsIDB4MEQsIDB4RkUsIDB4RTMsIDB4MDEsIDB4OEUsIDB4RkUsCisJMHhFNywgMHgwMCwgMHg5NSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1QywKKwkweEZGLCAweEFBLCAweDAxLCAweDcxLCAweEZDLCAweDA3LCAweDA3LCAweDdFLCAweEYxLCAweDQ0LCAweDMwLAorCTB4NDQsIDB4MzAsIDB4N0UsIDB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NUMsCisJMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5NSwgMHhGRiwgMHhFNywgMHgwMCwKKwkweDhFLCAweEZFLCAweEUzLCAweDAxLCAweDBELCAweEZFLCAweENGLCAweDAwLCAweEM3LCAweDQ4LCAweEMxLAorCTB4MDYsIDB4N0IsIDB4RkIsIDB4MzksIDB4MDMsIDB4REQsIDB4RkQsIDB4M0EsIDB4MDEsIDB4NzQsIDB4RkYsCisJMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEOCwKKwkweDAxLCAweDM3LCAweEZDLCAweDI4LCAweDA3LCAweEZDLCAweEYxLCAweEYzLCAweDI4LCAweDA0LCAweDM3LAorCTB4REMsIDB4RjEsIDB4NkYsIDB4MDYsIDB4RUMsIDB4RkMsIDB4NTksIDB4MDEsIDB4ODYsIDB4RkYsIDB4MUMsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCNywgMHhGRiwgMHg4RiwgMHgwMCwgMHg0MywgMHhGRiwKKwkweDkwLCAweDAwLCAweDdBLCAweDAwLCAweEJFLCAweEZCLCAweDUyLCAweDQ3LCAweDcyLCAweDBELCAweEU2LAorCTB4RjgsIDB4N0UsIDB4MDQsIDB4M0MsIDB4RkQsIDB4ODMsIDB4MDEsIDB4NTgsIDB4RkYsIDB4MkIsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQiwKKwkweEZDLCAweERELCAweDA2LCAweDM3LCAweEYzLCAweDUyLCAweDIxLCAweEY2LCAweDNDLCAweDMxLCAweEYzLAorCTB4NUYsIDB4MDUsIDB4QTYsIDB4RkQsIDB4RTgsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsCisJMHgwMCwgMHgwQSwgMHgwMCwgMHhEOCwgMHhGRiwgMHgzQSwgMHgwMCwgMHhGMSwgMHhGRiwgMHg1NCwgMHhGRiwKKwkweEEyLCAweDAyLCAweEE5LCAweEY3LCAweDc3LCAweDQ0LCAweEIxLCAweDE0LCAweDc3LCAweEY2LCAweDlBLAorCTB4MDUsIDB4QjgsIDB4RkMsIDB4QkMsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENiwgMHgwMSwgMHg3NywgMHhGQywgMHgzMywKKwkweDA2LCAweDA5LCAweEY1LCAweEExLCAweDE5LCAweEUxLCAweDQxLCAweDhELCAweEY1LCAweERBLCAweDAzLAorCTB4OUEsIDB4RkUsIDB4NUEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDQsCisJMHgwMCwgMHhGNiwgMHhGRiwgMHhFRCwgMHhGRiwgMHg4RSwgMHgwMCwgMHgzRiwgMHhGRSwgMHg2RCwgMHgwNCwKKwkweDlFLCAweEY0LCAweDRFLCAweDQwLCAweDQ5LCAweDFDLCAweDVBLCAweEY0LCAweDc4LCAweDA2LCAweDVDLAorCTB4RkMsIDB4REYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHgzMCwgMHgwMCwgMHg0OSwgMHhGRiwgMHhBQiwgMHgwMSwgMHhFMiwgMHhGQywgMHgzRCwgMHgwNSwgMHg0OCwKKwkweEY3LCAweDIyLCAweDEyLCAweDlCLCAweDQ1LCAweEY1LCAweEY4LCAweEVELCAweDAxLCAweEJFLCAweEZGLAorCTB4QjYsIDB4RkYsIDB4NTcsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsCisJMHgwMCwgMHhBQSwgMHhGRiwgMHgxMiwgMHgwMSwgMHg1RiwgMHhGRCwgMHhDQiwgMHgwNSwgMHg5RSwgMHhGMiwKKwkweDAzLCAweDNCLCAweEZDLCAweDIzLCAweEI3LCAweEYyLCAweDAzLCAweDA3LCAweDMzLCAweEZDLCAweEU1LAorCTB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsCisJMHg2MSwgMHhGRiwgMHg2QywgMHgwMSwgMHg3MSwgMHhGRCwgMHgxMSwgMHgwNCwgMHhDOCwgMHhGOSwgMHgwRSwKKwkweDBCLCAweEZELCAweDQ3LCAweDYzLCAweEZELCAweEFBLCAweEZGLCAweDAzLCAweDAxLCAweDA1LCAweEZGLAorCTB4QUUsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjEsIDB4MDAsIDB4NzYsCisJMHhGRiwgMHg3OSwgMHgwMSwgMHhCQSwgMHhGQywgMHhCMSwgMHgwNiwgMHhBMCwgMHhGMSwgMHhDMywgMHgzNCwKKwkweDg5LCAweDJCLCAweEI5LCAweEYxLCAweDI5LCAweDA3LCAweDQ0LCAweEZDLCAweENDLCAweDAxLCAweDQ5LAorCTB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0YsIDB4RkYsCisJMHgxRSwgMHgwMSwgMHgxOSwgMHhGRSwgMHhDMywgMHgwMiwgMHg2MSwgMHhGQywgMHg5QiwgMHgwNCwgMHhGMiwKKwkweDQ4LCAweEM2LCAweDAyLCAweDJDLCAweEZELCAweDVBLCAweDAyLCAweDUwLCAweEZFLCAweDA0LCAweDAxLAorCTB4OEEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTEsIDB4RkYsIDB4QkUsCisJMHgwMSwgMHg1NiwgMHhGQywgMHgxRiwgMHgwNywgMHg5MiwgMHhGMSwgMHhDQSwgMHgyRCwgMHhBRiwgMHgzMiwKKwkweDg0LCAweEYxLCAweEUwLCAweDA2LCAweDk0LCAweEZDLCAweDkxLCAweDAxLCAweDY5LCAweEZGLCAweDI2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4QzksIDB4MDAsIDB4Q0QsIDB4RkUsCisJMHg2QywgMHgwMSwgMHhFQSwgMHhGRSwgMHhGMywgMHhGRSwgMHg3MCwgMHg0OCwgMHhGRiwgMHgwOCwgMHg5NCwKKwkweEZBLCAweEFELCAweDAzLCAweEEzLCAweEZELCAweDU1LCAweDAxLCAweDZBLCAweEZGLCAweDI2LCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsIDB4RTEsIDB4MDEsIDB4MzEsCisJMHhGQywgMHgxQSwgMHgwNywgMHg1NiwgMHhGMiwgMHg1NSwgMHgyNiwgMHgyRSwgMHgzOSwgMHgzNSwgMHhGMiwKKwkweDFFLCAweDA2LCAweDI1LCAweEZELCAweDM1LCAweDAxLCAweDk4LCAweEZGLCAweDE1LCAweDAwLCAweEZGLAorCTB4RkYsIDB4MEYsIDB4MDAsIDB4QzMsIDB4RkYsIDB4NzEsIDB4MDAsIDB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsCisJMHg0MiwgMHgwMSwgMHgzNywgMHhGQSwgMHg3QywgMHg0NiwgMHhFNywgMHgwRiwgMHgwOCwgMHhGOCwgMHhFNiwKKwkweDA0LCAweDBCLCAweEZELCAweDk5LCAweDAxLCAweDRGLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLAorCTB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4NEEsIDB4RkMsIDB4QUMsCisJMHgwNiwgMHhDQSwgMHhGMywgMHhBNywgMHgxRSwgMHhDQSwgMHgzRSwgMHhFNCwgMHhGMywgMHhFNSwgMHgwNCwKKwkweEY0LCAweEZELCAweEJBLCAweDAwLCAweEQ3LCAweEZGLCAweEZFLCAweEZGLCAweDAzLCAweDAwLCAweDA4LAorCTB4MDAsIDB4RTMsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MkEsIDB4MDAsIDB4RUYsIDB4RkUsIDB4NEQsIDB4MDMsCisJMHg3RCwgMHhGNiwgMHgyQSwgMHg0MywgMHg0QiwgMHgxNywgMHhCMCwgMHhGNSwgMHhFRiwgMHgwNSwgMHg5MywKKwkweEZDLCAweENCLCAweDAxLCAweDNELCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweEZFLCAweEZGLAorCTB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4QzksIDB4MDEsIDB4OTcsIDB4RkMsIDB4RTYsIDB4MDUsIDB4QzYsCisJMHhGNSwgMHgwMCwgMHgxNywgMHg1MCwgMHg0MywgMHg5RCwgMHhGNiwgMHgzQSwgMHgwMywgMHhGQSwgMHhGRSwKKwkweDIzLCAweDAwLCAweDIxLCAweDAwLCAweEUyLCAweEZGLCAweDA4LCAweDAwLCAweDAzLCAweDAwLCAweEZGLAorCTB4RkYsIDB4RDQsIDB4RkYsIDB4QkYsIDB4MDAsIDB4RUIsIDB4RkQsIDB4RjMsIDB4MDQsIDB4Q0YsIDB4RjMsCisJMHg5OCwgMHgzRSwgMHhGMywgMHgxRSwgMHhCOSwgMHhGMywgMHhCMiwgMHgwNiwgMHg0OCwgMHhGQywgMHhFNCwKKwkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDJFLCAweDAwLAorCTB4NTAsIDB4RkYsIDB4OTcsIDB4MDEsIDB4MTAsIDB4RkQsIDB4REEsIDB4MDQsIDB4MjAsIDB4RjgsIDB4QTAsCisJMHgwRiwgMHg5NywgMHg0NiwgMHg2MSwgMHhGQSwgMHgyRCwgMHgwMSwgMHgyQiwgMHgwMCwgMHg3QSwgMHhGRiwKKwkweDc1LCAweDAwLCAweEMyLCAweEZGLCAweDBGLCAweDAwLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk2LAorCTB4RkYsIDB4MzksIDB4MDEsIDB4MUYsIDB4RkQsIDB4MjgsIDB4MDYsIDB4MkEsIDB4RjIsIDB4RjIsIDB4MzgsCisJMHhBMCwgMHgyNiwgMHg0QiwgMHhGMiwgMHgxQywgMHgwNywgMHgzMiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzQywKKwkweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZCLCAweEZGLAorCTB4NTIsIDB4MDEsIDB4QTksIDB4RkQsIDB4QTAsIDB4MDMsIDB4QUUsIDB4RkEsIDB4QkUsIDB4MDgsIDB4N0MsCisJMHg0OCwgMHgyNiwgMHhGRiwgMHhEMiwgMHhGRSwgMHg3OSwgMHgwMSwgMHhDNiwgMHhGRSwgMHhDQywgMHgwMCwKKwkweEEwLCAweEZGLCAweDE3LCAweDAwLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY3LCAweEZGLCAweDk0LAorCTB4MDEsIDB4OTAsIDB4RkMsIDB4RTUsIDB4MDYsIDB4ODEsIDB4RjEsIDB4NkIsIDB4MzIsIDB4MTEsIDB4MkUsCisJMHg4RSwgMHhGMSwgMHgxRCwgMHgwNywgMHg1OCwgMHhGQywgMHhCQywgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRSwKKwkweDAwLCAweEZELCAweEZGLCAweDFELCAweDAwLCAweDhCLCAweEZGLCAweDAxLCAweDAxLCAweDU2LCAweEZFLAorCTB4NEQsIDB4MDIsIDB4NDUsIDB4RkQsIDB4OEQsIDB4MDIsIDB4RjAsIDB4NDgsIDB4RDcsIDB4MDQsIDB4NDcsCisJMHhGQywgMHhEMSwgMHgwMiwgMHgxMiwgMHhGRSwgMHgyMSwgMHgwMSwgMHg3RSwgMHhGRiwgMHgyMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ4LCAweEZGLCAweENFLCAweDAxLCAweDQyLAorCTB4RkMsIDB4MkEsIDB4MDcsIDB4QkYsIDB4RjEsIDB4NDAsIDB4MkIsIDB4MDUsIDB4MzUsIDB4QTYsIDB4RjEsCisJMHhBQiwgMHgwNiwgMHhCRiwgMHhGQywgMHg3NSwgMHgwMSwgMHg3NywgMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDE0LCAweDAwLCAweEFELCAweEZGLCAweEFBLCAweDAwLCAweDBDLCAweEZGLCAweEY3LCAweDAwLAorCTB4QzEsIDB4RkYsIDB4MzMsIDB4RkQsIDB4RUMsIDB4NDcsIDB4NTEsIDB4MEIsIDB4QUYsIDB4RjksIDB4MUQsCisJMHgwNCwgMHg2QiwgMHhGRCwgMHg2RSwgMHgwMSwgMHg2MCwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU1LCAweDAxLCAweDMzLCAweEZDLCAweEZGLAorCTB4MDYsIDB4QzQsIDB4RjIsIDB4QjAsIDB4MjMsIDB4M0IsIDB4M0IsIDB4QUQsIDB4RjIsIDB4QkYsIDB4MDUsCisJMHg2NiwgMHhGRCwgMHgwRSwgMHgwMSwgMHhBQywgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywKKwkweDAwLCAweENFLCAweEZGLCAweDU0LCAweDAwLCAweEJELCAweEZGLCAweEIyLCAweEZGLCAweDAxLCAweDAyLAorCTB4Q0YsIDB4RjgsIDB4N0QsIDB4NDUsIDB4NkIsIDB4MTIsIDB4MzAsIDB4RjcsIDB4NDgsIDB4MDUsIDB4REQsCisJMHhGQywgMHhBRCwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERFLCAweDAxLCAweDVGLCAweEZDLCAweDcwLCAweDA2LCAweDZDLAorCTB4RjQsIDB4RkQsIDB4MUIsIDB4N0QsIDB4NDAsIDB4QjcsIDB4RjQsIDB4NUQsIDB4MDQsIDB4NDksIDB4RkUsCisJMHg4OCwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFRCwKKwkweEZGLCAweDA0LCAweDAwLCAweDYwLCAweDAwLCAweDkwLCAweEZFLCAweEVCLCAweDAzLCAweDcxLCAweEY1LAorCTB4QjcsIDB4NDEsIDB4RUQsIDB4MTksIDB4RjUsIDB4RjQsIDB4M0IsIDB4MDYsIDB4NzMsIDB4RkMsIDB4RDcsCisJMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwKKwkweDQzLCAweEZGLCAweEJBLCAweDAxLCAweEJDLCAweEZDLCAweDkwLCAweDA1LCAweDhFLCAweEY2LCAweDY4LAorCTB4MTQsIDB4OTksIDB4NDQsIDB4Q0QsIDB4RjcsIDB4OEYsIDB4MDIsIDB4NjAsIDB4RkYsIDB4RUEsIDB4RkYsCisJMHgzRSwgMHgwMCwgMHhENywgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHhCRCwKKwkweEZGLCAweEVELCAweDAwLCAweDlFLCAweEZELCAweDZDLCAweDA1LCAweDFGLCAweEYzLCAweEMwLCAweDNDLAorCTB4OUUsIDB4MjEsIDB4MjgsIDB4RjMsIDB4RTIsIDB4MDYsIDB4M0EsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwKKwkweDgxLCAweDAxLCAweDQyLCAweEZELCAweDcyLCAweDA0LCAweEZGLCAweEY4LCAweDJELCAweDBELCAweDY5LAorCTB4NDcsIDB4RUIsIDB4RkIsIDB4NjMsIDB4MDAsIDB4OUQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OTMsIDB4MDAsCisJMHhCNiwgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4NCwgMHhGRiwgMHg1QywKKwkweDAxLCAweEU2LCAweEZDLCAweDc3LCAweDA2LCAweEQ0LCAweEYxLCAweEM2LCAweDM2LCAweDNFLCAweDI5LAorCTB4RjMsIDB4RjEsIDB4MjksIDB4MDcsIDB4MzgsIDB4RkMsIDB4RDcsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3NiwgMHhGRiwgMHgzNywgMHgwMSwKKwkweEU0LCAweEZELCAweDJDLCAweDAzLCAweDk0LCAweEZCLCAweDgzLCAweDA2LCAweENFLCAweDQ4LCAweDA1LAorCTB4MDEsIDB4RjUsIDB4RkQsIDB4RjAsIDB4MDEsIDB4ODcsIDB4RkUsIDB4RUEsIDB4MDAsIDB4OTQsIDB4RkYsCisJMHgxQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwgMHgwMCwgMHg1QSwgMHhGRiwgMHhBQywgMHgwMSwgMHg2RSwKKwkweEZDLCAweDBBLCAweDA3LCAweDdFLCAweEYxLCAweEZGLCAweDJGLCAweDhBLCAweDMwLCAweDdELCAweEYxLAorCTB4MDMsIDB4MDcsIDB4NzUsIDB4RkMsIDB4QTcsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgxQSwgMHgwMCwgMHg5NiwgMHhGRiwgMHhFMywgMHgwMCwgMHg5NSwgMHhGRSwgMHhENSwgMHgwMSwKKwkweDI2LCAweEZFLCAweDk4LCAweDAwLCAweEJGLCAweDQ4LCAweDAwLCAweDA3LCAweDYxLCAweEZCLCAweDQ2LAorCTB4MDMsIDB4RDYsIDB4RkQsIDB4M0QsIDB4MDEsIDB4NzMsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEQSwgMHgwMSwgMHgzNiwgMHhGQywgMHgyNywKKwkweDA3LCAweDA1LCAweEYyLCAweEFBLCAweDI4LCAweDQ0LCAweDM3LCAweEU0LCAweEYxLCAweDY3LCAweDA2LAorCTB4RjIsIDB4RkMsIDB4NTUsIDB4MDEsIDB4ODgsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTEsCisJMHgwMCwgMHhCOSwgMHhGRiwgMHg4QywgMHgwMCwgMHg0QSwgMHhGRiwgMHg4MywgMHgwMCwgMHg5MSwgMHgwMCwKKwkweDkxLCAweEZCLCAweDNELCAweDQ3LCAweEI3LCAweDBELCAweENELCAweEY4LCAweDg5LCAweDA0LCAweDM2LAorCTB4RkQsIDB4ODYsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQywgMHhGQywgMHhEOCwgMHgwNiwgMHg0NywKKwkweEYzLCAweDA2LCAweDIxLCAweDJBLCAweDNELCAweDQ0LCAweEYzLCAweDUyLCAweDA1LCAweEFFLCAweEZELAorCTB4RTMsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4RDksCisJMHhGRiwgMHgzNywgMHgwMCwgMHhGNywgMHhGRiwgMHg0OSwgMHhGRiwgMHhCNiwgMHgwMiwgMHg4NiwgMHhGNywKKwkweDUzLCAweDQ0LCAweEZCLCAweDE0LCAweDYxLCAweEY2LCAweEE0LCAweDA1LCAweEI0LCAweEZDLCAweEJFLAorCTB4MDEsIDB4NDIsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCisJMHgzQSwgMHhGRiwgMHhENCwgMHgwMSwgMHg3QSwgMHhGQywgMHgyQiwgMHgwNiwgMHgxRSwgMHhGNSwgMHg1NiwKKwkweDE5LCAweDBDLCAweDQyLCAweEFBLCAweEY1LCAweEM5LCAweDAzLCAweEE0LCAweEZFLCAweDU0LCAweDAwLAorCTB4MDksIDB4MDAsIDB4RUIsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RUEsCisJMHhGRiwgMHg5MywgMHgwMCwgMHgzNiwgMHhGRSwgMHg3RCwgMHgwNCwgMHg4NSwgMHhGNCwgMHgxRiwgMHg0MCwKKwkweDk0LCAweDFDLCAweDQ3LCAweEY0LCAweDdFLCAweDA2LCAweDVBLCAweEZDLCAweERGLCAweDAxLCAweDM3LAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsCisJMHhBOSwgMHgwMSwgMHhFNywgMHhGQywgMHgzMywgMHgwNSwgMHg2MCwgMHhGNywgMHhEQSwgMHgxMSwgMHhCOCwKKwkweDQ1LCAweDFDLCAweEY5LCAweEQ4LCAweDAxLCAweENBLCAweEZGLCAweEFGLCAweEZGLCAweDVBLCAweDAwLAorCTB4Q0MsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QTgsIDB4RkYsIDB4MTcsCisJMHgwMSwgMHg1NywgMHhGRCwgMHhENiwgMHgwNSwgMHg5MCwgMHhGMiwgMHhDOCwgMHgzQSwgMHg0NiwgMHgyNCwKKwkweEFBLCAweEYyLCAweDA2LCAweDA3LCAweDMyLCAweEZDLCAweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4NjIsIDB4RkYsIDB4NjksIDB4MDEsCisJMHg3NywgMHhGRCwgMHgwNCwgMHgwNCwgMHhFMiwgMHhGOSwgMHhDQiwgMHgwQSwgMHgwRCwgMHg0OCwgMHg5NCwKKwkweEZELCAweDkyLCAweEZGLCAweDEwLCAweDAxLCAweEZFLCAweEZFLCAweEIxLCAweDAwLCAweEFBLCAweEZGLAorCTB4MTUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4NzQsIDB4RkYsIDB4N0MsIDB4MDEsIDB4QjUsCisJMHhGQywgMHhCOCwgMHgwNiwgMHg5QywgMHhGMSwgMHg4MSwgMHgzNCwgMHhEMSwgMHgyQiwgMHhCMywgMHhGMSwKKwkweDI5LCAweDA3LCAweDQ2LCAweEZDLCAweENBLCAweDAxLCAweDRBLCAweEZGLCAweDMwLCAweDAwLCAweEZELAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4MUIsIDB4MDEsIDB4MjAsIDB4RkUsCisJMHhCNiwgMHgwMiwgMHg3QSwgMHhGQywgMHg1RiwgMHgwNCwgMHhGNCwgMHg0OCwgMHhGRiwgMHgwMiwgMHgxMywKKwkweEZELCAweDY3LCAweDAyLCAweDQ5LCAweEZFLCAweDA3LCAweDAxLCAweDg4LCAweEZGLCAweDFELCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4QzAsIDB4MDEsIDB4NTMsIDB4RkMsIDB4MjEsCisJMHgwNywgMHg5NiwgMHhGMSwgMHg4MiwgMHgyRCwgMHhGMiwgMHgzMiwgMHg4NiwgMHhGMSwgMHhEQiwgMHgwNiwKKwkweDk5LCAweEZDLCAweDhFLCAweDAxLCAweDZBLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLCAweDE2LAorCTB4MDAsIDB4QTIsIDB4RkYsIDB4QzUsIDB4MDAsIDB4RDQsIDB4RkUsIDB4NUYsIDB4MDEsIDB4MDMsIDB4RkYsCisJMHhCRiwgMHhGRSwgMHg2MywgMHg0OCwgMHg0MCwgMHgwOSwgMHg3QiwgMHhGQSwgMHhCOSwgMHgwMywgMHg5RCwKKwkweEZELCAweDU4LCAweDAxLCAweDY5LCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAorCTB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTcsIDB4MDcsIDB4NjEsCisJMHhGMiwgMHgwQSwgMHgyNiwgMHg2QSwgMHgzOSwgMHg0MSwgMHhGMiwgMHgxNSwgMHgwNiwgMHgyQywgMHhGRCwKKwkweDMxLCAweDAxLCAweDlCLCAweEZGLCAweDE0LCAweDAwLCAweEZGLCAweEZGLCAweDBFLCAweDAwLCAweEM0LAorCTB4RkYsIDB4NkUsIDB4MDAsIDB4ODcsIDB4RkYsIDB4MTMsIDB4MDAsIDB4NTgsIDB4MDEsIDB4MEQsIDB4RkEsCisJMHg2MSwgMHg0NiwgMHgyRCwgMHgxMCwgMHhGMCwgMHhGNywgMHhGMSwgMHgwNCwgMHgwNSwgMHhGRCwgMHg5QywKKwkweDAxLCAweDRFLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAorCTB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEMsIDB4RkMsIDB4QTYsIDB4MDYsIDB4REIsIDB4RjMsIDB4NUIsCisJMHgxRSwgMHhGQywgMHgzRSwgMHhGQSwgMHhGMywgMHhENywgMHgwNCwgMHhGRCwgMHhGRCwgMHhCNCwgMHgwMCwKKwkweEQ5LCAweEZGLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweDA4LCAweDAwLCAweEU0LCAweEZGLCAweDFCLAorCTB4MDAsIDB4MzAsIDB4MDAsIDB4RTQsIDB4RkUsIDB4NUYsIDB4MDMsIDB4NUUsIDB4RjYsIDB4MDIsIDB4NDMsCisJMHg5NiwgMHgxNywgMHg5QiwgMHhGNSwgMHhGOCwgMHgwNSwgMHg4RiwgMHhGQywgMHhDQywgMHgwMSwgMHgzRCwKKwkweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNFLCAweEZGLAorCTB4QzgsIDB4MDEsIDB4OUIsIDB4RkMsIDB4REQsIDB4MDUsIDB4REMsIDB4RjUsIDB4QjYsIDB4MTYsIDB4NzcsCisJMHg0MywgMHhCRCwgMHhGNiwgMHgyOCwgMHgwMywgMHgwNSwgMHhGRiwgMHgxRCwgMHgwMCwgMHgyNSwgMHgwMCwKKwkweEUxLCAweEZGLCAweDA4LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEZGLCAweEM0LAorCTB4MDAsIDB4RTIsIDB4RkQsIDB4MDEsIDB4MDUsIDB4QkEsIDB4RjMsIDB4NjQsIDB4M0UsIDB4M0YsIDB4MUYsCisJMHhBOCwgMHhGMywgMHhCOCwgMHgwNiwgMHg0NiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUxLCAweEZGLCAweDk1LCAweDAxLAorCTB4MTUsIDB4RkQsIDB4Q0YsIDB4MDQsIDB4MzksIDB4RjgsIDB4NTksIDB4MEYsIDB4QUYsIDB4NDYsIDB4OEIsCisJMHhGQSwgMHgxNywgMHgwMSwgMHgzOCwgMHgwMCwgMHg3MywgMHhGRiwgMHg3OCwgMHgwMCwgMHhDMCwgMHhGRiwKKwkweDBGLCAweDAwLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk0LCAweEZGLCAweDNELCAweDAxLCAweDE4LAorCTB4RkQsIDB4MzIsIDB4MDYsIDB4MUYsIDB4RjIsIDB4QjUsIDB4MzgsIDB4RUIsIDB4MjYsIDB4NDAsIDB4RjIsCisJMHgxRSwgMHgwNywgMHgzMiwgMHhGQywgMHhERiwgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZDLCAweEZGLCAweDRGLCAweDAxLCAweEIwLCAweEZELAorCTB4OTMsIDB4MDMsIDB4QzcsIDB4RkEsIDB4N0QsIDB4MDgsIDB4ODYsIDB4NDgsIDB4NUEsIDB4RkYsIDB4QkEsCisJMHhGRSwgMHg4NiwgMHgwMSwgMHhCRiwgMHhGRSwgMHhDRiwgMHgwMCwgMHg5RSwgMHhGRiwgMHgxNywgMHgwMCwKKwkweEZELCAweEZGLCAweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDk3LCAweDAxLCAweDhDLCAweEZDLCAweEVBLAorCTB4MDYsIDB4ODAsIDB4RjEsIDB4MjYsIDB4MzIsIDB4NTgsIDB4MkUsIDB4OEIsIDB4RjEsIDB4MUIsIDB4MDcsCisJMHg1QiwgMHhGQywgMHhCQSwgMHgwMSwgMHg1MywgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQywKKwkweDAwLCAweDhDLCAweEZGLCAweEZFLCAweDAwLCAweDVELCAweEZFLCAweDNGLCAweDAyLCAweDVFLCAweEZELAorCTB4NTQsIDB4MDIsIDB4RUMsIDB4NDgsIDB4MTMsIDB4MDUsIDB4MkUsIDB4RkMsIDB4REUsIDB4MDIsIDB4MEMsCisJMHhGRSwgMHgyNCwgMHgwMSwgMHg3RCwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDMxLCAweDAwLCAweDQ3LCAweEZGLCAweENGLCAweDAxLCAweDQwLCAweEZDLCAweDJBLCAweDA3LCAweEM2LAorCTB4RjEsIDB4RjcsIDB4MkEsIDB4NDYsIDB4MzUsIDB4QUIsIDB4RjEsIDB4QTQsIDB4MDYsIDB4QzQsIDB4RkMsCisJMHg3MiwgMHgwMSwgMHg3OSwgMHhGRiwgMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBRSwKKwkweEZGLCAweEE3LCAweDAwLCAweDEyLCAweEZGLCAweEVBLCAweDAwLCAweEQ5LCAweEZGLCAweDAzLCAweEZELAorCTB4REMsIDB4NDcsIDB4OTUsIDB4MEIsIDB4OTYsIDB4RjksIDB4MjksIDB4MDQsIDB4NjUsIDB4RkQsIDB4NzEsCisJMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM0LCAweEZDLCAweEZCLCAweDA2LCAweEQyLCAweEYyLCAweDY0LAorCTB4MjMsIDB4NzMsIDB4M0IsIDB4QkMsIDB4RjIsIDB4QjQsIDB4MDUsIDB4NkUsIDB4RkQsIDB4MDksIDB4MDEsCisJMHhBRiwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhEMCwgMHhGRiwgMHg1MSwKKwkweDAwLCAweEMzLCAweEZGLCAweEE2LCAweEZGLCAweDE2LCAweDAyLCAweEE5LCAweEY4LCAweDVDLCAweDQ1LAorCTB4QjIsIDB4MTIsIDB4MTksIDB4RjcsIDB4NTIsIDB4MDUsIDB4RDgsIDB4RkMsIDB4QUYsIDB4MDEsIDB4NDcsCisJMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwKKwkweERELCAweDAxLCAweDYyLCAweEZDLCAweDY5LCAweDA2LCAweDdGLCAweEY0LCAweEIyLCAweDFCLCAweEFCLAorCTB4NDAsIDB4RDAsIDB4RjQsIDB4NEUsIDB4MDQsIDB4NTMsIDB4RkUsIDB4ODMsIDB4MDAsIDB4RjIsIDB4RkYsCisJMHhGNCwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHg2NiwKKwkweDAwLCAweDg1LCAweEZFLCAweEZDLCAweDAzLCAweDU1LCAweEY1LCAweDhDLCAweDQxLCAweDM4LCAweDFBLAorCTB4RTEsIDB4RjQsIDB4NDMsIDB4MDYsIDB4NzAsIDB4RkMsIDB4RDgsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhCOSwgMHgwMSwKKwkweEMxLCAweEZDLCAweDg2LCAweDA1LCAweEE1LCAweEY2LCAweDFFLCAweDE0LCAweEJBLCAweDQ0LCAweEYwLAorCTB4RjcsIDB4N0IsIDB4MDIsIDB4NkIsIDB4RkYsIDB4RTQsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RDYsIDB4RkYsCisJMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGMSwgMHgwMCwgMHg5NiwKKwkweEZELCAweDc4LCAweDA1LCAweDBFLCAweEYzLCAweDhBLCAweDNDLCAweEVBLCAweDIxLCAweDE5LCAweEYzLAorCTB4RTYsIDB4MDYsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1QSwgMHhGRiwgMHg3RSwgMHgwMSwgMHg0OCwgMHhGRCwKKwkweDY2LCAweDA0LCAweDE4LCAweEY5LCAweEU4LCAweDBDLCAweDdDLCAweDQ3LCAweDE5LCAweEZDLCAweDRELAorCTB4MDAsIDB4QTksIDB4MDAsIDB4MzUsIDB4RkYsIDB4OTYsIDB4MDAsIDB4QjUsIDB4RkYsIDB4MTIsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4MiwgMHhGRiwgMHg2MCwgMHgwMSwgMHhFMCwgMHhGQywgMHg3RiwKKwkweDA2LCAweENDLCAweEYxLCAweDg1LCAweDM2LCAweDg3LCAweDI5LCAweEVCLCAweEYxLCAweDJBLCAweDA3LAorCTB4MzksIDB4RkMsIDB4RDYsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgyMiwgMHgwMCwgMHg3NywgMHhGRiwgMHgzNCwgMHgwMSwgMHhFQSwgMHhGRCwgMHgxRiwgMHgwMywKKwkweEFFLCAweEZCLCAweDQ1LCAweDA2LCAweEQ1LCAweDQ4LCAweDNDLCAweDAxLCAweERDLCAweEZELCAweEZELAorCTB4MDEsIDB4ODAsIDB4RkUsIDB4RUQsIDB4MDAsIDB4OTMsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHhBRSwgMHgwMSwgMHg2QSwgMHhGQywgMHgwRCwgMHgwNywgMHg4MCwKKwkweEYxLCAweEI4LCAweDJGLCAweENGLCAweDMwLCAweDdELCAweEYxLCAweEZGLCAweDA2LCAweDc4LCAweEZDLAorCTB4QTUsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTksIDB4MDAsIDB4OTgsCisJMHhGRiwgMHhFMCwgMHgwMCwgMHg5QywgMHhGRSwgMHhDOCwgMHgwMSwgMHgzRiwgMHhGRSwgMHg2MiwgMHgwMCwKKwkweEI4LCAweDQ4LCAweDNGLCAweDA3LCAweDQ3LCAweEZCLCAweDUzLCAweDAzLCAweEQwLCAweEZELCAweDQwLAorCTB4MDEsIDB4NzIsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHg0MCwgMHhGRiwgMHhEQiwgMHgwMSwgMHgzNSwgMHhGQywgMHgyNiwgMHgwNywgMHgwRSwgMHhGMiwgMHg2MCwKKwkweDI4LCAweDgyLCAweDM3LCAweEVELCAweEYxLCAweDVFLCAweDA2LCAweEY4LCAweEZDLCAweDUxLCAweDAxLAorCTB4OEEsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QkEsIDB4RkYsIDB4ODksCisJMHgwMCwgMHg1MSwgMHhGRiwgMHg3NywgMHgwMCwgMHhBNywgMHgwMCwgMHg2NCwgMHhGQiwgMHgyNiwgMHg0NywKKwkweEZDLCAweDBELCAweEI0LCAweEY4LCAweDk1LCAweDA0LCAweDMxLCAweEZELCAweDg4LCAweDAxLCAweDU2LAorCTB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsCisJMHhFNiwgMHgwMSwgMHgzRSwgMHhGQywgMHhEMywgMHgwNiwgMHg1NiwgMHhGMywgMHhCQSwgMHgyMCwgMHg2MSwKKwkweDNELCAweDU2LCAweEYzLCAweDQ1LCAweDA1LCAweEI3LCAweEZELCAweERFLCAweDAwLCAweEM1LCAweEZGLAorCTB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDksIDB4MDAsIDB4REIsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgzRCwgMHhGRiwgMHhDOSwgMHgwMiwgMHg2NCwgMHhGNywgMHgyRiwgMHg0NCwgMHg0NCwgMHgxNSwKKwkweDRBLCAweEY2LCAweEFELCAweDA1LCAweEFGLCAweEZDLCAweEMwLCAweDAxLCAweDQxLCAweEZGLCAweDMyLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDMsIDB4MDEsCisJMHg3RCwgMHhGQywgMHgyMywgMHgwNiwgMHgzMiwgMHhGNSwgMHgwQywgMHgxOSwgMHgzOCwgMHg0MiwgMHhDNywKKwkweEY1LCAweEI4LCAweDAzLCAweEFGLCAweEZFLCAweDRFLCAweDAwLCAweDBDLCAweDAwLCAweEVBLCAweEZGLAorCTB4MDYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RTcsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkMsCisJMHhGRSwgMHg4QywgMHgwNCwgMHg2RCwgMHhGNCwgMHhGMCwgMHgzRiwgMHhFMCwgMHgxQywgMHgzNCwgMHhGNCwKKwkweDg1LCAweDA2LCAweDU3LCAweEZDLCAweEUwLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEEsIDB4RkYsIDB4QTcsIDB4MDEsIDB4RUMsIDB4RkMsCisJMHgyOCwgMHgwNSwgMHg3NywgMHhGNywgMHg5MiwgMHgxMSwgMHhENywgMHg0NSwgMHg0MywgMHhGOSwgMHhDMywKKwkweDAxLCAweEQ2LCAweEZGLCAweEE5LCAweEZGLCAweDVFLCAweDAwLCAweENCLCAweEZGLCAweDBELCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4QTYsIDB4RkYsIDB4MUIsIDB4MDEsIDB4NTAsIDB4RkQsIDB4RTEsCisJMHgwNSwgMHg4MiwgMHhGMiwgMHg4RiwgMHgzQSwgMHg5MiwgMHgyNCwgMHg5RCwgMHhGMiwgMHgwOSwgMHgwNywKKwkweDMyLCAweEZDLCAweEU0LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLAorCTB4MDAsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4NjYsIDB4MDEsIDB4N0QsIDB4RkQsIDB4RjgsIDB4MDMsCisJMHhGQiwgMHhGOSwgMHg4OSwgMHgwQSwgMHgxRCwgMHg0OCwgMHhDNSwgMHhGRCwgMHg3QSwgMHhGRiwgMHgxRCwKKwkweDAxLCAweEY3LCAweEZFLCAweEI0LCAweDAwLCAweEE5LCAweEZGLCAweDE1LCAweDAwLCAweEZFLCAweEZGLAorCTB4MjMsIDB4MDAsIDB4NzIsIDB4RkYsIDB4N0YsIDB4MDEsIDB4QjAsIDB4RkMsIDB4QkUsIDB4MDYsIDB4OTcsCisJMHhGMSwgMHgzRiwgMHgzNCwgMHgxOSwgMHgyQywgMHhBRCwgMHhGMSwgMHgyOCwgMHgwNywgMHg0OCwgMHhGQywKKwkweEM5LCAweDAxLCAweDRCLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDFGLAorCTB4MDAsIDB4ODIsIDB4RkYsIDB4MTgsIDB4MDEsIDB4MjcsIDB4RkUsIDB4QTksIDB4MDIsIDB4OTQsIDB4RkMsCisJMHgyNCwgMHgwNCwgMHhGNSwgMHg0OCwgMHgzOSwgMHgwMywgMHhGOSwgMHhGQywgMHg3NCwgMHgwMiwgMHg0MiwKKwkweEZFLCAweDBCLCAweDAxLCAweDg3LCAweEZGLCAweDFFLCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLAorCTB4NEYsIDB4RkYsIDB4QzIsIDB4MDEsIDB4NTEsIDB4RkMsIDB4MjMsIDB4MDcsIDB4OUEsIDB4RjEsIDB4M0EsCisJMHgyRCwgMHgzNSwgMHgzMywgMHg4OSwgMHhGMSwgMHhENSwgMHgwNiwgMHg5RCwgMHhGQywgMHg4QiwgMHgwMSwKKwkweDZDLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLCAweDE2LCAweDAwLCAweEE0LCAweEZGLCAweEMyLAorCTB4MDAsIDB4REIsIDB4RkUsIDB4NTIsIDB4MDEsIDB4MUIsIDB4RkYsIDB4OEQsIDB4RkUsIDB4NTcsIDB4NDgsCisJMHg4MSwgMHgwOSwgMHg2MSwgMHhGQSwgMHhDNiwgMHgwMywgMHg5NiwgMHhGRCwgMHg1QiwgMHgwMSwgMHg2OCwKKwkweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLAorCTB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTUsIDB4MDcsIDB4NkQsIDB4RjIsIDB4QkYsIDB4MjUsIDB4QTUsCisJMHgzOSwgMHg0RCwgMHhGMiwgMHgwQiwgMHgwNiwgMHgzMywgMHhGRCwgMHgyRCwgMHgwMSwgMHg5RCwgMHhGRiwKKwkweDEzLCAweDAwLCAweEZGLCAweEZGLCAweDBFLCAweDAwLCAweEM2LCAweEZGLCAweDZCLCAweDAwLCAweDhFLAorCTB4RkYsIDB4MDYsIDB4MDAsIDB4NkUsIDB4MDEsIDB4RTQsIDB4RjksIDB4NDgsIDB4NDYsIDB4NzUsIDB4MTAsCisJMHhENywgMHhGNywgMHhGQywgMHgwNCwgMHgwMCwgMHhGRCwgMHg5RSwgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRSwKKwkweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLCAweDAxLAorCTB4NEUsIDB4RkMsIDB4QTAsIDB4MDYsIDB4RUQsIDB4RjMsIDB4MEYsIDB4MUUsIDB4MkQsIDB4M0YsIDB4MTAsCisJMHhGNCwgMHhDOCwgMHgwNCwgMHgwNywgMHhGRSwgMHhBRiwgMHgwMCwgMHhEQywgMHhGRiwgMHhGQywgMHhGRiwKKwkweDAzLCAweDAwLCAweDA3LCAweDAwLCAweEU1LCAweEZGLCAweDE4LCAweDAwLCAweDM2LCAweDAwLCAweEQ5LAorCTB4RkUsIDB4NzEsIDB4MDMsIDB4M0YsIDB4RjYsIDB4REIsIDB4NDIsIDB4RTAsIDB4MTcsIDB4ODYsIDB4RjUsCisJMHgwMCwgMHgwNiwgMHg4QywgMHhGQywgMHhDRSwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwKKwkweEZGLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNGLCAweEZGLCAweEM2LCAweDAxLCAweDlGLCAweEZDLAorCTB4RDMsIDB4MDUsIDB4RjEsIDB4RjUsIDB4NkMsIDB4MTYsIDB4OUUsIDB4NDMsIDB4REQsIDB4RjYsIDB4MTUsCisJMHgwMywgMHgxMCwgMHhGRiwgMHgxNywgMHgwMCwgMHgyOCwgMHgwMCwgMHhERiwgMHhGRiwgMHgwOSwgMHgwMCwKKwkweDAyLCAweDAwLCAweDAxLCAweDAwLCAweENGLCAweEZGLCAweEM5LCAweDAwLCAweERBLCAweEZELCAweDBGLAorCTB4MDUsIDB4QTUsIDB4RjMsIDB4MzEsIDB4M0UsIDB4OEEsIDB4MUYsIDB4OTcsIDB4RjMsIDB4QkQsIDB4MDYsCisJMHg0NCwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwKKwkweEZGLCAweDJELCAweDAwLCAweDUyLCAweEZGLCAweDkyLCAweDAxLCAweDFCLCAweEZELCAweEM0LCAweDA0LAorCTB4NTEsIDB4RjgsIDB4MTMsIDB4MEYsIDB4QzgsIDB4NDYsIDB4QjYsIDB4RkEsIDB4MDEsIDB4MDEsIDB4NDQsCisJMHgwMCwgMHg2QywgMHhGRiwgMHg3QiwgMHgwMCwgMHhCRiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDE3LCAweDAwLCAweDkyLCAweEZGLCAweDQxLCAweDAxLCAweDExLCAweEZELCAweDNCLCAweDA2LCAweDE0LAorCTB4RjIsIDB4NzgsIDB4MzgsIDB4MzYsIDB4MjcsIDB4MzUsIDB4RjIsIDB4MjAsIDB4MDcsIDB4MzMsIDB4RkMsCisJMHhERiwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwKKwkweDAwLCAweDZELCAweEZGLCAweDRDLCAweDAxLCAweEI2LCAweEZELCAweDg2LCAweDAzLCAweEUxLCAweEZBLAorCTB4M0QsIDB4MDgsIDB4OTIsIDB4NDgsIDB4OEUsIDB4RkYsIDB4QTEsIDB4RkUsIDB4OTMsIDB4MDEsIDB4QjgsCisJMHhGRSwgMHhEMywgMHgwMCwgMHg5RCwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwKKwkweDY0LCAweEZGLCAweDlBLCAweDAxLCAweDg4LCAweEZDLCAweEVFLCAweDA2LCAweDdFLCAweEYxLCAweEUzLAorCTB4MzEsIDB4OUYsIDB4MkUsIDB4ODgsIDB4RjEsIDB4MTksIDB4MDcsIDB4NUUsIDB4RkMsIDB4QjcsIDB4MDEsCisJMHg1NCwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RCwgMHhGRiwgMHhGQSwKKwkweDAwLCAweDY0LCAweEZFLCAweDMyLCAweDAyLCAweDc4LCAweEZELCAweDFCLCAweDAyLCAweEVBLCAweDQ4LAorCTB4NTAsIDB4MDUsIDB4MTQsIDB4RkMsIDB4RUIsIDB4MDIsIDB4MDUsIDB4RkUsIDB4MjcsIDB4MDEsIDB4N0MsCisJMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NiwgMHhGRiwKKwkweEQxLCAweDAxLCAweDNGLCAweEZDLCAweDJCLCAweDA3LCAweENELCAweEYxLCAweEFFLCAweDJBLCAweDg2LAorCTB4MzUsIDB4QjEsIDB4RjEsIDB4OUQsIDB4MDYsIDB4Q0EsIDB4RkMsIDB4NkUsIDB4MDEsIDB4N0IsIDB4RkYsCisJMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMywgMHgwMCwgMHhBRiwgMHhGRiwgMHhBNCwgMHgwMCwgMHgxOSwKKwkweEZGLCAweERELCAweDAwLCAweEYwLCAweEZGLCAweEQ0LCAweEZDLCAweEM5LCAweDQ3LCAweEQ4LCAweDBCLAorCTB4N0MsIDB4RjksIDB4MzUsIDB4MDQsIDB4NUYsIDB4RkQsIDB4NzQsIDB4MDEsIDB4NUUsIDB4RkYsIDB4MjksCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwKKwkweDM1LCAweEZDLCAweEY3LCAweDA2LCAweEUwLCAweEYyLCAweDE4LCAweDIzLCAweEFCLCAweDNCLCAweENDLAorCTB4RjIsIDB4QTgsIDB4MDUsIDB4NzYsIDB4RkQsIDB4MDQsIDB4MDEsIDB4QjEsIDB4RkYsIDB4MEMsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhEMSwgMHhGRiwgMHg0RSwgMHgwMCwgMHhDQSwgMHhGRiwgMHg5QSwKKwkweEZGLCAweDJBLCAweDAyLCAweDgzLCAweEY4LCAweDNGLCAweDQ1LCAweEZCLCAweDEyLCAweDAxLCAweEY3LAorCTB4NUQsIDB4MDUsIDB4RDMsIDB4RkMsIDB4QjEsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEQywgMHgwMSwgMHg2NCwgMHhGQywKKwkweDYyLCAweDA2LCAweDkzLCAweEY0LCAweDY2LCAweDFCLCAweEQ5LCAweDQwLCAweEVBLCAweEY0LCAweDNFLAorCTB4MDQsIDB4NUQsIDB4RkUsIDB4N0QsIDB4MDAsIDB4RjUsIDB4RkYsIDB4RjMsIDB4RkYsIDB4MDUsIDB4MDAsCisJMHgwNSwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHg2QywgMHgwMCwgMHg3QiwgMHhGRSwgMHgwQywKKwkweDA0LCAweDNBLCAweEY1LCAweDVGLCAweDQxLCAweDgzLCAweDFBLCAweENELCAweEY0LCAweDRCLCAweDA2LAorCTB4NkQsIDB4RkMsIDB4RDksIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHgzMSwgMHgwMCwgMHg0NCwgMHhGRiwgMHhCNywgMHgwMSwgMHhDNSwgMHhGQywgMHg3QywgMHgwNSwKKwkweEJDLCAweEY2LCAweEQ1LCAweDEzLCAweERDLCAweDQ0LCAweDE0LCAweEY4LCAweDY3LCAweDAyLCAweDc3LAorCTB4RkYsIDB4REQsIDB4RkYsIDB4NDQsIDB4MDAsIDB4RDUsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsCisJMHgwOSwgMHgwMCwgMHhCOCwgMHhGRiwgMHhGNiwgMHgwMCwgMHg4RCwgMHhGRCwgMHg4NCwgMHgwNSwgMHhGRCwKKwkweEYyLCAweDUyLCAweDNDLCAweDM1LCAweDIyLCAweDBCLCAweEYzLCAweEVCLCAweDA2LCAweDM3LCAweEZDLAorCTB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MkEsCisJMHgwMCwgMHg1QiwgMHhGRiwgMHg3QywgMHgwMSwgMHg0RSwgMHhGRCwgMHg1QSwgMHgwNCwgMHgzMSwgMHhGOSwKKwkweEE0LCAweDBDLCAweDkwLCAweDQ3LCAweDQ3LCAweEZDLCAweDM2LCAweDAwLCAweEI2LCAweDAwLCAweDJFLAorCTB4RkYsIDB4OTksIDB4MDAsIDB4QjMsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsCisJMHg4MCwgMHhGRiwgMHg2NCwgMHgwMSwgMHhEQSwgMHhGQywgMHg4NywgMHgwNiwgMHhDNSwgMHhGMSwgMHg0NiwKKwkweDM2LCAweEQxLCAweDI5LCAweEUzLCAweEYxLCAweDJBLCAweDA3LCAweDNBLCAweEZDLCAweEQ1LCAweDAxLAorCTB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzgsCisJMHhGRiwgMHgzMSwgMHgwMSwgMHhGMSwgMHhGRCwgMHgxMiwgMHgwMywgMHhDNywgMHhGQiwgMHgwNywgMHgwNiwKKwkweERCLCAweDQ4LCAweDczLCAweDAxLCAweEMzLCAweEZELCAweDBBLCAweDAyLCAweDc5LCAweEZFLCAweEYxLAorCTB4MDAsIDB4OTEsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTgsIDB4RkYsCisJMHhCMSwgMHgwMSwgMHg2NywgMHhGQywgMHgxMCwgMHgwNywgMHg4MSwgMHhGMSwgMHg3MywgMHgyRiwgMHgxNSwKKwkweDMxLCAweDdDLCAweEYxLCAweEZCLCAweDA2LCAweDdDLCAweEZDLCAweEEyLCAweDAxLCAweDYwLCAweEZGLAorCTB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTksIDB4MDAsIDB4OTksIDB4RkYsIDB4REQsIDB4MDAsIDB4QTMsCisJMHhGRSwgMHhCQiwgMHgwMSwgMHg1OCwgMHhGRSwgMHgyRCwgMHgwMCwgMHhBRiwgMHg0OCwgMHg3RSwgMHgwNywKKwkweDJFLCAweEZCLCAweDYwLCAweDAzLCAweEM5LCAweEZELCAweDQzLCAweDAxLCAweDcxLCAweEZGLCAweDI0LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsIDB4REMsIDB4MDEsCisJMHgzNCwgMHhGQywgMHgyNSwgMHgwNywgMHgxOCwgMHhGMiwgMHgxNSwgMHgyOCwgMHhCRiwgMHgzNywgMHhGNywKKwkweEYxLCAweDU2LCAweDA2LCAweEZFLCAweEZDLCAweDRELCAweDAxLCAweDhDLCAweEZGLCAweDE5LCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkIsIDB4RkYsIDB4ODUsIDB4MDAsIDB4NTgsIDB4RkYsIDB4NkEsCisJMHgwMCwgMHhCRSwgMHgwMCwgMHgzOCwgMHhGQiwgMHgwRiwgMHg0NywgMHg0MiwgMHgwRSwgMHg5QiwgMHhGOCwKKwkweEExLCAweDA0LCAweDJCLCAweEZELCAweDhCLCAweDAxLCAweDU1LCAweEZGLCAweDJDLCAweDAwLCAweEZGLAorCTB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0YsIDB4RkMsCisJMHhDRSwgMHgwNiwgMHg2NiwgMHhGMywgMHg2RiwgMHgyMCwgMHg5NiwgMHgzRCwgMHg2OSwgMHhGMywgMHgzOCwKKwkweDA1LCAweEJGLCAweEZELCAweEQ5LCAweDAwLCAweEM3LCAweEZGLCAweDA0LCAweDAwLCAweDAyLCAweDAwLAorCTB4MDksIDB4MDAsIDB4REMsIDB4RkYsIDB4MzEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MzIsIDB4RkYsIDB4REMsCisJMHgwMiwgMHg0MiwgMHhGNywgMHgwQiwgMHg0NCwgMHg4RSwgMHgxNSwgMHgzNCwgMHhGNiwgMHhCNywgMHgwNSwKKwkweEFCLCAweEZDLCAweEMxLCAweDAxLCAweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweEZFLAorCTB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDIsIDB4MDEsIDB4ODEsIDB4RkMsIDB4MUEsIDB4MDYsCisJMHg0NywgMHhGNSwgMHhDMSwgMHgxOCwgMHg2MCwgMHg0MiwgMHhFNCwgMHhGNSwgMHhBNiwgMHgwMywgMHhCOSwKKwkweEZFLCAweDQ4LCAweDAwLCAweDBGLCAweDAwLCAweEU5LCAweEZGLCAweDA3LCAweDAwLCAweDA0LCAweDAwLAorCTB4RjksIDB4RkYsIDB4RTQsIDB4RkYsIDB4OUYsIDB4MDAsIDB4MjMsIDB4RkUsIDB4OUIsIDB4MDQsIDB4NTUsCisJMHhGNCwgMHhDMCwgMHgzRiwgMHgyQywgMHgxRCwgMHgyMiwgMHhGNCwgMHg4QywgMHgwNiwgMHg1NSwgMHhGQywKKwkweEUxLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDJGLAorCTB4MDAsIDB4NEIsIDB4RkYsIDB4QTQsIDB4MDEsIDB4RjEsIDB4RkMsIDB4MUQsIDB4MDUsIDB4OEYsIDB4RjcsCisJMHg0QSwgMHgxMSwgMHhGMiwgMHg0NSwgMHg2QiwgMHhGOSwgMHhBRSwgMHgwMSwgMHhFMiwgMHhGRiwgMHhBMiwKKwkweEZGLCAweDYxLCAweDAwLCAweEM5LCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDAwLAorCTB4QTMsIDB4RkYsIDB4MjAsIDB4MDEsIDB4NDksIDB4RkQsIDB4RUIsIDB4MDUsIDB4NzQsIDB4RjIsIDB4NTQsCisJMHgzQSwgMHhERCwgMHgyNCwgMHg5MSwgMHhGMiwgMHgwQywgMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwKKwkweDNBLCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY0LAorCTB4RkYsIDB4NjMsIDB4MDEsIDB4ODQsIDB4RkQsIDB4RUIsIDB4MDMsIDB4MTQsIDB4RkEsIDB4NDcsIDB4MEEsCisJMHgyQywgMHg0OCwgMHhGNiwgMHhGRCwgMHg2MywgMHhGRiwgMHgyQiwgMHgwMSwgMHhGMCwgMHhGRSwgMHhCOCwKKwkweDAwLCAweEE4LCAweEZGLCAweDE1LCAweDAwLCAweEZFLCAweEZGLCAweDIzLCAweDAwLCAweDcxLCAweEZGLAorCTB4ODIsIDB4MDEsIDB4QUIsIDB4RkMsIDB4QzQsIDB4MDYsIDB4OTMsIDB4RjEsIDB4RkQsIDB4MzMsIDB4NjIsCisJMHgyQywgMHhBOCwgMHhGMSwgMHgyNywgMHgwNywgMHg0QSwgMHhGQywgMHhDNywgMHgwMSwgMHg0QywgMHhGRiwKKwkweDMwLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgzLCAweEZGLCAweDE0LAorCTB4MDEsIDB4MkQsIDB4RkUsIDB4OUMsIDB4MDIsIDB4QUQsIDB4RkMsIDB4RTksIDB4MDMsIDB4RjYsIDB4NDgsCisJMHg3MywgMHgwMywgMHhFMCwgMHhGQywgMHg4MiwgMHgwMiwgMHgzQiwgMHhGRSwgMHgwRSwgMHgwMSwgMHg4NiwKKwkweEZGLCAweDFFLCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLCAweDRFLCAweEZGLCAweEMzLCAweDAxLAorCTB4NEUsIDB4RkMsIDB4MjQsIDB4MDcsIDB4OUUsIDB4RjEsIDB4RjIsIDB4MkMsIDB4NzgsIDB4MzMsIDB4OEMsCisJMHhGMSwgMHhEMCwgMHgwNiwgMHhBMiwgMHhGQywgMHg4OCwgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNCwgMHgwMCwKKwkweEZELCAweEZGLCAweDE2LCAweDAwLCAweEE1LCAweEZGLCAweEJFLCAweDAwLCAweEUyLCAweEZFLCAweDQ1LAorCTB4MDEsIDB4MzMsIDB4RkYsIDB4NUEsIDB4RkUsIDB4NDgsIDB4NDgsIDB4QzMsIDB4MDksIDB4NDcsIDB4RkEsCisJMHhEMiwgMHgwMywgMHg5MCwgMHhGRCwgMHg1RSwgMHgwMSwgMHg2NiwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLAorCTB4MTIsIDB4MDcsIDB4NzksIDB4RjIsIDB4NzMsIDB4MjUsIDB4REYsIDB4MzksIDB4NUEsIDB4RjIsIDB4MDAsCisJMHgwNiwgMHgzQSwgMHhGRCwgMHgyOCwgMHgwMSwgMHg5RiwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDBFLCAweDAwLCAweEM3LCAweEZGLCAweDY4LCAweDAwLCAweDk1LCAweEZGLCAweEZBLCAweEZGLCAweDgzLAorCTB4MDEsIDB4QkIsIDB4RjksIDB4MkIsIDB4NDYsIDB4QkIsIDB4MTAsIDB4QkYsIDB4RjcsIDB4MDcsIDB4MDUsCisJMHhGQiwgMHhGQywgMHhBMCwgMHgwMSwgMHg0RCwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwKKwkweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUyLCAweDAxLCAweDUwLCAweEZDLCAweDk5LCAweDA2LAorCTB4RkUsIDB4RjMsIDB4QzMsIDB4MUQsIDB4NUUsIDB4M0YsIDB4MjcsIDB4RjQsIDB4QjksIDB4MDQsIDB4MTAsCisJMHhGRSwgMHhBOSwgMHgwMCwgMHhERiwgMHhGRiwgMHhGQiwgMHhGRiwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwKKwkweEU2LCAweEZGLCAweDE1LCAweDAwLCAweDNDLCAweDAwLCAweENGLCAweEZFLCAweDgzLCAweDAzLCAweDIwLAorCTB4RjYsIDB4QjIsIDB4NDIsIDB4MkIsIDB4MTgsIDB4NzEsIDB4RjUsIDB4MDksIDB4MDYsIDB4ODgsIDB4RkMsCisJMHhDRiwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywKKwkweDAwLCAweDNGLCAweEZGLCAweEM1LCAweDAxLCAweEEzLCAweEZDLCAweENBLCAweDA1LCAweDA3LCAweEY2LAorCTB4MjIsIDB4MTYsIDB4QzMsIDB4NDMsIDB4RkUsIDB4RjYsIDB4MDIsIDB4MDMsIDB4MUIsIDB4RkYsIDB4MTEsCisJMHgwMCwgMHgyQiwgMHgwMCwgMHhERSwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweENDLCAweEZGLCAweENFLCAweDAwLCAweEQxLCAweEZELCAweDFELCAweDA1LCAweDkxLCAweEYzLCAweEZFLAorCTB4M0QsIDB4RDcsIDB4MUYsIDB4ODcsIDB4RjMsIDB4QzMsIDB4MDYsIDB4NDIsIDB4RkMsIDB4RTUsIDB4MDEsCisJMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywKKwkweEZGLCAweDkwLCAweDAxLCAweDIwLCAweEZELCAweEI4LCAweDA0LCAweDZBLCAweEY4LCAweENELCAweDBFLAorCTB4RTEsIDB4NDYsIDB4RTEsIDB4RkEsIDB4RUIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4NjUsIDB4RkYsIDB4N0YsCisJMHgwMCwgMHhCRSwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5MCwgMHhGRiwKKwkweDQ1LCAweDAxLCAweDBCLCAweEZELCAweDQ0LCAweDA2LCAweDBBLCAweEYyLCAweDNCLCAweDM4LCAweDgwLAorCTB4MjcsIDB4MkIsIDB4RjIsIDB4MjIsIDB4MDcsIDB4MzMsIDB4RkMsIDB4REUsIDB4MDEsIDB4M0UsIDB4RkYsCisJMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg0OSwKKwkweDAxLCAweEJDLCAweEZELCAweDdBLCAweDAzLCAweEZBLCAweEZBLCAweEZELCAweDA3LCAweDlDLCAweDQ4LAorCTB4QzMsIDB4RkYsIDB4ODksIDB4RkUsIDB4QTEsIDB4MDEsIDB4QjEsIDB4RkUsIDB4RDYsIDB4MDAsIDB4OUMsCisJMHhGRiwgMHgxOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg5RCwgMHgwMSwKKwkweDg0LCAweEZDLCAweEYzLCAweDA2LCAweDdELCAweEYxLCAweDlFLCAweDMxLCAweEU2LCAweDJFLCAweDg1LAorCTB4RjEsIDB4MTYsIDB4MDcsIDB4NjEsIDB4RkMsIDB4QjUsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkQsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RiwgMHhGRiwgMHhGNywgMHgwMCwgMHg2QiwgMHhGRSwgMHgyNSwKKwkweDAyLCAweDkxLCAweEZELCAweEUzLCAweDAxLCAweEU1LCAweDQ4LCAweDhELCAweDA1LCAweEZCLCAweEZCLAorCTB4RjgsIDB4MDIsIDB4RkUsIDB4RkQsIDB4MkIsIDB4MDEsIDB4N0EsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NSwgMHhGRiwgMHhEMiwgMHgwMSwgMHgzRCwgMHhGQywKKwkweDJCLCAweDA3LCAweEQ0LCAweEYxLCAweDY0LCAweDJBLCAweEM2LCAweDM1LCAweEI3LCAweEYxLCAweDk2LAorCTB4MDYsIDB4Q0YsIDB4RkMsIDB4NkIsIDB4MDEsIDB4N0QsIDB4RkYsIDB4MUYsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgxMywgMHgwMCwgMHhCMSwgMHhGRiwgMHhBMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwNywKKwkweDAwLCAweEE0LCAweEZDLCAweEI2LCAweDQ3LCAweDFDLCAweDBDLCAweDYzLCAweEY5LCAweDQyLCAweDA0LAorCTB4NTksIDB4RkQsIDB4NzYsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwgMHhGQywgMHhGMywgMHgwNiwKKwkweEVFLCAweEYyLCAweENELCAweDIyLCAweEU0LCAweDNCLCAweERDLCAweEYyLCAweDlDLCAweDA1LCAweDdFLAorCTB4RkQsIDB4MDAsIDB4MDEsIDB4QjQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsCisJMHhEMiwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMCwgMHhGRiwgMHg4RSwgMHhGRiwgMHgzRiwgMHgwMiwgMHg1RSwKKwkweEY4LCAweDFFLCAweDQ1LCAweDQ0LCAweDEzLCAweEVBLCAweEY2LCAweDY3LCAweDA1LCAweENGLCAweEZDLAorCTB4QjMsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzOCwgMHhGRiwgMHhEQiwgMHgwMSwgMHg2NywgMHhGQywgMHg1QSwgMHgwNiwgMHhBNiwgMHhGNCwKKwkweDFCLCAweDFCLCAweDA3LCAweDQxLCAweDA0LCAweEY1LCAweDJELCAweDA0LCAweDY3LCAweEZFLCAweDc3LAorCTB4MDAsIDB4RjgsIDB4RkYsIDB4RjIsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RjAsIDB4RkYsCisJMHhGQiwgMHhGRiwgMHg3MSwgMHgwMCwgMHg3MSwgMHhGRSwgMHgxRCwgMHgwNCwgMHgxRiwgMHhGNSwgMHgzMiwKKwkweDQxLCAweENFLCAweDFBLCAweEJBLCAweEY0LCAweDUzLCAweDA2LCAweDZBLCAweEZDLCAweERBLCAweDAxLAorCTB4MzgsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDUsCisJMHhGRiwgMHhCNSwgMHgwMSwgMHhDQSwgMHhGQywgMHg3MiwgMHgwNSwgMHhEMywgMHhGNiwgMHg4RCwgMHgxMywKKwkweEZELCAweDQ0LCAweDM5LCAweEY4LCAweDUzLCAweDAyLCAweDgyLCAweEZGLCAweEQ3LCAweEZGLCAweDQ3LAorCTB4MDAsIDB4RDMsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEEsIDB4MDAsIDB4QjYsIDB4RkYsCisJMHhGQiwgMHgwMCwgMHg4NSwgMHhGRCwgMHg5MCwgMHgwNSwgMHhFQywgMHhGMiwgMHgxQywgMHgzQywgMHg4MSwKKwkweDIyLCAweEZDLCAweEYyLCAweEVGLCAweDA2LCAweDM2LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4NzksCisJMHgwMSwgMHg1MywgMHhGRCwgMHg0RSwgMHgwNCwgMHg0QSwgMHhGOSwgMHg2MCwgMHgwQywgMHhBMywgMHg0NywKKwkweDc2LCAweEZDLCAweDFGLCAweDAwLCAweEMzLCAweDAwLCAweDI3LCAweEZGLCAweDlELCAweDAwLCAweEIyLAorCTB4RkYsIDB4MTMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsIDB4N0YsIDB4RkYsIDB4NjcsIDB4MDEsCisJMHhENSwgMHhGQywgMHg4RSwgMHgwNiwgMHhCRSwgMHhGMSwgMHgwNiwgMHgzNiwgMHgxQSwgMHgyQSwgMHhEQywKKwkweEYxLCAweDJBLCAweDA3LCAweDNDLCAweEZDLCAweEQzLCAweDAxLCAweDQ0LCAweEZGLCAweDMyLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4NzksIDB4RkYsIDB4MkUsIDB4MDEsIDB4RjcsCisJMHhGRCwgMHgwNSwgMHgwMywgMHhFMSwgMHhGQiwgMHhDQSwgMHgwNSwgMHhERiwgMHg0OCwgMHhBQiwgMHgwMSwKKwkweEFBLCAweEZELCAweDE4LCAweDAyLCAweDcyLCAweEZFLCAweEY0LCAweDAwLCAweDkwLCAweEZGLCAweDFCLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTcsIDB4RkYsIDB4QjMsIDB4MDEsIDB4NjQsIDB4RkMsCisJMHgxMywgMHgwNywgMHg4MywgMHhGMSwgMHgyQywgMHgyRiwgMHg1QSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGNywKKwkweDA2LCAweDgwLCAweEZDLCAweDlGLCAweDAxLCAweDYxLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLAorCTB4MTksIDB4MDAsIDB4OUEsIDB4RkYsIDB4RDksIDB4MDAsIDB4QUEsIDB4RkUsIDB4QUUsIDB4MDEsIDB4NzAsCisJMHhGRSwgMHhGOCwgMHhGRiwgMHhBNiwgMHg0OCwgMHhCRSwgMHgwNywgMHgxNCwgMHhGQiwgMHg2RCwgMHgwMywKKwkweEMzLCAweEZELCAweDQ2LCAweDAxLCAweDcwLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZELAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsIDB4REQsIDB4MDEsIDB4MzQsIDB4RkMsIDB4MjMsIDB4MDcsCisJMHgyMSwgMHhGMiwgMHhDQiwgMHgyNywgMHhGRSwgMHgzNywgMHgwMCwgMHhGMiwgMHg0RCwgMHgwNiwgMHgwNCwKKwkweEZELCAweDQ5LCAweDAxLCAweDhFLCAweEZGLCAweDE5LCAweDAwLCAweEZGLCAweEZGLCAweDEwLCAweDAwLAorCTB4QkQsIDB4RkYsIDB4ODIsIDB4MDAsIDB4NUUsIDB4RkYsIDB4NUQsIDB4MDAsIDB4RDQsIDB4MDAsIDB4MEMsCisJMHhGQiwgMHhGOSwgMHg0NiwgMHg4NywgMHgwRSwgMHg4MiwgMHhGOCwgMHhBRCwgMHgwNCwgMHgyNiwgMHhGRCwKKwkweDhELCAweDAxLCAweDU0LCAweEZGLCAweDJDLCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4NDEsIDB4RkMsIDB4QzgsIDB4MDYsIDB4NzYsIDB4RjMsCisJMHgyMiwgMHgyMCwgMHhDQSwgMHgzRCwgMHg3RCwgMHhGMywgMHgyQSwgMHgwNSwgMHhDOCwgMHhGRCwgMHhENCwKKwkweDAwLCAweENBLCAweEZGLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDA5LCAweDAwLCAweERELCAweEZGLAorCTB4MkUsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MjcsIDB4RkYsIDB4RUYsIDB4MDIsIDB4MjAsIDB4RjcsIDB4RTcsCisJMHg0MywgMHhEOCwgMHgxNSwgMHgxRSwgMHhGNiwgMHhDMCwgMHgwNSwgMHhBNywgMHhGQywgMHhDMywgMHgwMSwKKwkweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNCLAorCTB4RkYsIDB4RDEsIDB4MDEsIDB4ODQsIDB4RkMsIDB4MTIsIDB4MDYsIDB4NUMsIDB4RjUsIDB4NzYsIDB4MTgsCisJMHg4OSwgMHg0MiwgMHgwMiwgMHhGNiwgMHg5NCwgMHgwMywgMHhDNCwgMHhGRSwgMHg0MiwgMHgwMCwgMHgxMiwKKwkweDAwLCAweEU4LCAweEZGLCAweDA3LCAweDAwLCAweDAzLCAweDAwLCAweEZBLCAweEZGLCAweEUyLCAweEZGLAorCTB4QTQsIDB4MDAsIDB4MTksIDB4RkUsIDB4QUEsIDB4MDQsIDB4M0UsIDB4RjQsIDB4OTAsIDB4M0YsIDB4NzgsCisJMHgxRCwgMHgxMCwgMHhGNCwgMHg5MywgMHgwNiwgMHg1MiwgMHhGQywgMHhFMSwgMHgwMSwgMHgzNiwgMHhGRiwKKwkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRDLCAweEZGLCAweEEyLAorCTB4MDEsIDB4RjYsIDB4RkMsIDB4MTIsIDB4MDUsIDB4QTcsIDB4RjcsIDB4MDMsIDB4MTEsIDB4MTAsIDB4NDYsCisJMHg5MywgMHhGOSwgMHg5OCwgMHgwMSwgMHhFRSwgMHhGRiwgMHg5QiwgMHhGRiwgMHg2NCwgMHgwMCwgMHhDOCwKKwkweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweEExLCAweEZGLCAweDI0LCAweDAxLAorCTB4NDEsIDB4RkQsIDB4RjYsIDB4MDUsIDB4NjcsIDB4RjIsIDB4MUEsIDB4M0EsIDB4MjksIDB4MjUsIDB4ODQsCisJMHhGMiwgMHgwRiwgMHgwNywgMHgzMSwgMHhGQywgMHhFMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwKKwkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY1LCAweEZGLCAweDYwLCAweDAxLCAweDhBLAorCTB4RkQsIDB4REYsIDB4MDMsIDB4MkUsIDB4RkEsIDB4MDQsIDB4MEEsIDB4M0EsIDB4NDgsIDB4MjgsIDB4RkUsCisJMHg0QiwgMHhGRiwgMHgzOCwgMHgwMSwgMHhFOSwgMHhGRSwgMHhCQiwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxNiwKKwkweDAwLCAweEZELCAweEZGLCAweDI0LCAweDAwLCAweDZGLCAweEZGLCAweDg1LCAweDAxLCAweEE2LCAweEZDLAorCTB4Q0EsIDB4MDYsIDB4OEYsIDB4RjEsIDB4QkIsIDB4MzMsIDB4QUIsIDB4MkMsIDB4QTMsIDB4RjEsIDB4MjYsCisJMHgwNywgMHg0QywgMHhGQywgMHhDNSwgMHgwMSwgMHg0RCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLCAweDhGLAorCTB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsCisJMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDJBLCAweDAwLCAweDVDLCAweEZGLCAweEFBLCAweDAxLCAweDcxLCAweEZDLCAweDA3LCAweDA3LAorCTB4N0UsIDB4RjEsIDB4NDQsIDB4MzAsIDB4NDQsIDB4MzAsIDB4N0UsIDB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsCisJMHhGQywgMHhBQSwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLCAweDhGLCAweDAyLCAweEM3LAorCTB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsIDB4OEYsIDB4MDIsCisJMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNSwKKwkweDAwLCAweEMzLCAweEZGLCAweEUxLCAweDAwLCAweEIxLCAweEZELCAweDRFLCAweDA1LCAweDRBLCAweEYzLAorCTB4M0QsIDB4M0QsIDB4RUQsIDB4MjAsIDB4NEMsIDB4RjMsIDB4RDYsIDB4MDYsIDB4M0QsIDB4RkMsIDB4RTYsCisJMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNELCAweEZDLCAweEQ2LCAweDA2LCAweDRDLCAweEYzLCAweEVELAorCTB4MjAsIDB4M0QsIDB4M0QsIDB4NEEsIDB4RjMsIDB4NEUsIDB4MDUsIDB4QjEsIDB4RkQsIDB4RTEsIDB4MDAsCisJMHhDMywgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NCwKKwkweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLCAweDhGLCAweDAyLCAweEM3LCAweEZDLCAweEFFLCAweDAzLAorCTB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsIDB4OEYsIDB4MDIsIDB4MzQsIDB4RkUsIDB4MTEsCisJMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHgxNiwgMHgwMCwgMHhBNiwgMHhGRiwgMHhCQiwgMHgwMCwKKwkweEU5LCAweEZFLCAweDM4LCAweDAxLCAweDRCLCAweEZGLCAweDI4LCAweEZFLCAweDNBLCAweDQ4LCAweDA0LAorCTB4MEEsIDB4MkUsIDB4RkEsIDB4REYsIDB4MDMsIDB4OEEsIDB4RkQsIDB4NjAsIDB4MDEsIDB4NjUsIDB4RkYsCisJMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhDOCwgMHhGRiwgMHg2NCwgMHgwMCwgMHg5QiwKKwkweEZGLCAweEVFLCAweEZGLCAweDk4LCAweDAxLCAweDkzLCAweEY5LCAweDEwLCAweDQ2LCAweDAzLCAweDExLAorCTB4QTcsIDB4RjcsIDB4MTIsIDB4MDUsIDB4RjYsIDB4RkMsIDB4QTIsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMCwgMHhFOCwgMHhGRiwgMHgxMiwgMHgwMCwgMHg0MiwgMHgwMCwKKwkweEM0LCAweEZFLCAweDk0LCAweDAzLCAweDAyLCAweEY2LCAweDg5LCAweDQyLCAweDc2LCAweDE4LCAweDVDLAorCTB4RjUsIDB4MTIsIDB4MDYsIDB4ODQsIDB4RkMsIDB4RDEsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHhDQSwgMHhGRiwgMHhENCwgMHgwMCwgMHhDOCwKKwkweEZELCAweDJBLCAweDA1LCAweDdELCAweEYzLCAweENBLCAweDNELCAweDIyLCAweDIwLCAweDc2LCAweEYzLAorCTB4QzgsIDB4MDYsIDB4NDEsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHgxOSwgMHgwMCwgMHg4RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHgwNCwgMHhGRCwKKwkweDRELCAweDA2LCAweDAwLCAweEYyLCAweEZFLCAweDM3LCAweENCLCAweDI3LCAweDIxLCAweEYyLCAweDIzLAorCTB4MDcsIDB4MzQsIDB4RkMsIDB4REQsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2MSwgMHhGRiwgMHg5RiwgMHgwMSwgMHg4MCwgMHhGQywgMHhGNywKKwkweDA2LCAweDdELCAweEYxLCAweDVBLCAweDMxLCAweDJDLCAweDJGLCAweDgzLCAweEYxLCAweDEzLCAweDA3LAorCTB4NjQsIDB4RkMsIDB4QjMsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsCisJMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhEMywgMHgwMSwgMHgzQywgMHhGQywgMHgyQSwgMHgwNywKKwkweERDLCAweEYxLCAweDFBLCAweDJBLCAweDA2LCAweDM2LCAweEJFLCAweEYxLCAweDhFLCAweDA2LCAweEQ1LAorCTB4RkMsIDB4NjcsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNiwgMHhGQywgMHhFRiwgMHgwNiwgMHhGQywKKwkweEYyLCAweDgxLCAweDIyLCAweDFDLCAweDNDLCAweEVDLCAweEYyLCAweDkwLCAweDA1LCAweDg1LCAweEZELAorCTB4RkIsIDB4MDAsIDB4QjYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsCisJMHgwMCwgMHgzOCwgMHhGRiwgMHhEQSwgMHgwMSwgMHg2QSwgMHhGQywgMHg1MywgMHgwNiwgMHhCQSwgMHhGNCwKKwkweENFLCAweDFBLCAweDMyLCAweDQxLCAweDFGLCAweEY1LCAweDFELCAweDA0LCAweDcxLCAweEZFLCAweDcxLAorCTB4MDAsIDB4RkIsIDB4RkYsIDB4RjAsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsCisJMHg0NiwgMHhGRiwgMHhCMywgMHgwMSwgMHhDRiwgMHhGQywgMHg2NywgMHgwNSwgMHhFQSwgMHhGNiwgMHg0NCwKKwkweDEzLCAweDFFLCAweDQ1LCAweDVFLCAweEY4LCAweDNGLCAweDAyLCAweDhFLCAweEZGLCAweEQwLCAweEZGLAorCTB4NEEsIDB4MDAsIDB4RDIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUQsCisJMHhGRiwgMHg3NiwgMHgwMSwgMHg1OSwgMHhGRCwgMHg0MiwgMHgwNCwgMHg2MywgMHhGOSwgMHgxQywgMHgwQywKKwkweEI2LCAweDQ3LCAweEE0LCAweEZDLCAweDA3LCAweDAwLCAweEQwLCAweDAwLCAweDIwLCAweEZGLCAweEEwLAorCTB4MDAsIDB4QjEsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0EsIDB4RkYsCisJMHgyQiwgMHgwMSwgMHhGRSwgMHhGRCwgMHhGOCwgMHgwMiwgMHhGQiwgMHhGQiwgMHg4RCwgMHgwNSwgMHhFNSwKKwkweDQ4LCAweEUzLCAweDAxLCAweDkxLCAweEZELCAweDI1LCAweDAyLCAweDZCLCAweEZFLCAweEY3LCAweDAwLAorCTB4OEYsIDB4RkYsIDB4MUMsIDB4MDAsIDB4MTgsIDB4MDAsIDB4OUMsIDB4RkYsIDB4RDYsIDB4MDAsIDB4QjEsCisJMHhGRSwgMHhBMSwgMHgwMSwgMHg4OSwgMHhGRSwgMHhDMywgMHhGRiwgMHg5QywgMHg0OCwgMHhGRCwgMHgwNywKKwkweEZBLCAweEZBLCAweDdBLCAweDAzLCAweEJDLCAweEZELCAweDQ5LCAweDAxLCAweDZFLCAweEZGLCAweDI0LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4QkUsIDB4RkYsIDB4N0YsIDB4MDAsIDB4NjUsIDB4RkYsCisJMHg1MSwgMHgwMCwgMHhFQiwgMHgwMCwgMHhFMSwgMHhGQSwgMHhFMSwgMHg0NiwgMHhDRCwgMHgwRSwgMHg2QSwKKwkweEY4LCAweEI4LCAweDA0LCAweDIwLCAweEZELCAweDkwLCAweDAxLCAweDUzLCAweEZGLCAweDJELCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MDksIDB4MDAsIDB4REUsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MUIsCisJMHhGRiwgMHgwMiwgMHgwMywgMHhGRSwgMHhGNiwgMHhDMywgMHg0MywgMHgyMiwgMHgxNiwgMHgwNywgMHhGNiwKKwkweENBLCAweDA1LCAweEEzLCAweEZDLCAweEM1LCAweDAxLCAweDNGLCAweEZGLCAweDMzLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MDMsIDB4MDAsIDB4RkIsIDB4RkYsIDB4REYsIDB4RkYsIDB4QTksIDB4MDAsIDB4MTAsIDB4RkUsCisJMHhCOSwgMHgwNCwgMHgyNywgMHhGNCwgMHg1RSwgMHgzRiwgMHhDMywgMHgxRCwgMHhGRSwgMHhGMywgMHg5OSwKKwkweDA2LCAweDUwLCAweEZDLCAweEUyLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OUYsIDB4RkYsIDB4MjgsIDB4MDEsIDB4M0EsIDB4RkQsIDB4MDAsCisJMHgwNiwgMHg1QSwgMHhGMiwgMHhERiwgMHgzOSwgMHg3MywgMHgyNSwgMHg3OSwgMHhGMiwgMHgxMiwgMHgwNywKKwkweDMxLCAweEZDLCAweEUzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweEZELAorCTB4RkYsIDB4MjQsIDB4MDAsIDB4NkQsIDB4RkYsIDB4ODgsIDB4MDEsIDB4QTIsIDB4RkMsIDB4RDAsIDB4MDYsCisJMHg4QywgMHhGMSwgMHg3OCwgMHgzMywgMHhGMiwgMHgyQywgMHg5RSwgMHhGMSwgMHgyNCwgMHgwNywgMHg0RSwKKwkweEZDLCAweEMzLCAweDAxLCAweDRFLCAweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLAorCTB4MzAsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QzcsIDB4MDEsIDB4NEEsIDB4RkMsIDB4MjcsIDB4MDcsIDB4QTgsCisJMHhGMSwgMHg2MiwgMHgyQywgMHhGRCwgMHgzMywgMHg5MywgMHhGMSwgMHhDNCwgMHgwNiwgMHhBQiwgMHhGQywKKwkweDgyLCAweDAxLCAweDcxLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweDM2LAorCTB4MDAsIDB4M0EsIDB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MEMsIDB4MDcsIDB4OTEsIDB4RjIsCisJMHhERCwgMHgyNCwgMHg1NCwgMHgzQSwgMHg3NCwgMHhGMiwgMHhFQiwgMHgwNSwgMHg0OSwgMHhGRCwgMHgyMCwKKwkweDAxLCAweEEzLCAweEZGLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAorCTB4MzcsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTUsIDB4RkMsIDB4OEMsIDB4MDYsIDB4MjIsIDB4RjQsIDB4MkMsCisJMHgxRCwgMHhDMCwgMHgzRiwgMHg1NSwgMHhGNCwgMHg5QiwgMHgwNCwgMHgyMywgMHhGRSwgMHg5RiwgMHgwMCwKKwkweEU0LCAweEZGLCAweEY5LCAweEZGLCAweDA0LCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLAorCTB4RkYsIDB4QzEsIDB4MDEsIDB4QUIsIDB4RkMsIDB4QjcsIDB4MDUsIDB4MzQsIDB4RjYsIDB4OEUsIDB4MTUsCisJMHgwQiwgMHg0NCwgMHg0MiwgMHhGNywgMHhEQywgMHgwMiwgMHgzMiwgMHhGRiwgMHgwNCwgMHgwMCwgMHgzMSwKKwkweDAwLCAweERDLCAweEZGLCAweDA5LCAweDAwLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU1LCAweEZGLAorCTB4OEIsIDB4MDEsIDB4MkIsIDB4RkQsIDB4QTEsIDB4MDQsIDB4OUIsIDB4RjgsIDB4NDIsIDB4MEUsIDB4MEYsCisJMHg0NywgMHgzOCwgMHhGQiwgMHhCRSwgMHgwMCwgMHg2QSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg4NSwgMHgwMCwKKwkweEJCLCAweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcxLCAweEZGLCAweDQzLAorCTB4MDEsIDB4QzksIDB4RkQsIDB4NjAsIDB4MDMsIDB4MkUsIDB4RkIsIDB4N0UsIDB4MDcsIDB4QUYsIDB4NDgsCisJMHgyRCwgMHgwMCwgMHg1OCwgMHhGRSwgMHhCQiwgMHgwMSwgMHhBMywgMHhGRSwgMHhERCwgMHgwMCwgMHg5OSwKKwkweEZGLCAweDE5LCAweDAwLCAweDFCLCAweDAwLCAweDkxLCAweEZGLCAweEYxLCAweDAwLCAweDc5LCAweEZFLAorCTB4MEEsIDB4MDIsIDB4QzMsIDB4RkQsIDB4NzMsIDB4MDEsIDB4REIsIDB4NDgsIDB4MDcsIDB4MDYsIDB4QzcsCisJMHhGQiwgMHgxMiwgMHgwMywgMHhGMSwgMHhGRCwgMHgzMSwgMHgwMSwgMHg3OCwgMHhGRiwgMHgyMiwgMHgwMCwKKwkweDAwLCAweDAwLCAweDEyLCAweDAwLCAweEIzLCAweEZGLCAweDk5LCAweDAwLCAweDJFLCAweEZGLCAweEI2LAorCTB4MDAsIDB4MzYsIDB4MDAsIDB4NDcsIDB4RkMsIDB4OTAsIDB4NDcsIDB4QTQsIDB4MEMsIDB4MzEsIDB4RjksCisJMHg1QSwgMHgwNCwgMHg0RSwgMHhGRCwgMHg3QywgMHgwMSwgMHg1QiwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDBCLCAweDAwLCAweEQ1LCAweEZGLCAweDQ0LCAweDAwLCAweERELCAweEZGLCAweDc3LCAweEZGLAorCTB4NjcsIDB4MDIsIDB4MTQsIDB4RjgsIDB4REMsIDB4NDQsIDB4RDUsIDB4MTMsIDB4QkMsIDB4RjYsIDB4N0MsCisJMHgwNSwgMHhDNSwgMHhGQywgMHhCNywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDA1LCAweDAwLCAweEYzLCAweEZGLCAweEY1LCAweEZGLCAweDdELCAweDAwLCAweDVELCAweEZFLCAweDNFLAorCTB4MDQsIDB4RUEsIDB4RjQsIDB4RDksIDB4NDAsIDB4NjYsIDB4MUIsIDB4OTMsIDB4RjQsIDB4NjIsIDB4MDYsCisJMHg2NCwgMHhGQywgMHhEQywgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDBDLCAweDAwLCAweEIxLCAweEZGLCAweDA0LCAweDAxLCAweDc2LCAweEZELCAweEE4LCAweDA1LAorCTB4Q0MsIDB4RjIsIDB4QUIsIDB4M0IsIDB4MTgsIDB4MjMsIDB4RTAsIDB4RjIsIDB4RjcsIDB4MDYsIDB4MzUsCisJMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwKKwkweDIwLCAweDAwLCAweDdCLCAweEZGLCAweDZFLCAweDAxLCAweENBLCAweEZDLCAweDlELCAweDA2LCAweEIxLAorCTB4RjEsIDB4ODYsIDB4MzUsIDB4QUUsIDB4MkEsIDB4Q0QsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0YsIDB4RkMsCisJMHhEMSwgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyRCwKKwkweDAwLCAweDU0LCAweEZGLCAweEI3LCAweDAxLCAweDVFLCAweEZDLCAweDE5LCAweDA3LCAweDg4LCAweEYxLAorCTB4OUYsIDB4MkUsIDB4RTMsIDB4MzEsIDB4N0UsIDB4RjEsIDB4RUUsIDB4MDYsIDB4ODgsIDB4RkMsIDB4OUEsCisJMHgwMSwgMHg2NCwgMHhGRiwgMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweDNFLCAweEZGLCAweERGLCAweDAxLCAweDMzLCAweEZDLCAweDIwLCAweDA3LCAweDM1LCAweEYyLCAweDM2LAorCTB4MjcsIDB4NzgsIDB4MzgsIDB4MTQsIDB4RjIsIDB4M0IsIDB4MDYsIDB4MTEsIDB4RkQsIDB4NDEsIDB4MDEsCisJMHg5MiwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwKKwkweEZGLCAweEU1LCAweDAxLCAweDQ0LCAweEZDLCAweEJELCAweDA2LCAweDk3LCAweEYzLCAweDhBLCAweDFGLAorCTB4MzEsIDB4M0UsIDB4QTUsIDB4RjMsIDB4MEYsIDB4MDUsIDB4REEsIDB4RkQsIDB4QzksIDB4MDAsIDB4Q0YsCisJMHhGRiwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwKKwkweENFLCAweDAxLCAweDhDLCAweEZDLCAweDAwLCAweDA2LCAweDg2LCAweEY1LCAweEUwLCAweDE3LCAweERCLAorCTB4NDIsIDB4M0YsIDB4RjYsIDB4NzEsIDB4MDMsIDB4RDksIDB4RkUsIDB4MzYsIDB4MDAsIDB4MTgsIDB4MDAsCisJMHhFNSwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5RSwKKwkweDAxLCAweDAwLCAweEZELCAweEZDLCAweDA0LCAweEQ3LCAweEY3LCAweDc1LCAweDEwLCAweDQ4LCAweDQ2LAorCTB4RTQsIDB4RjksIDB4NkUsIDB4MDEsIDB4MDYsIDB4MDAsIDB4OEUsIDB4RkYsIDB4NkIsIDB4MDAsIDB4QzYsCisJMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OCwgMHhGRiwgMHg1QiwgMHgwMSwKKwkweDk2LCAweEZELCAweEM2LCAweDAzLCAweDYxLCAweEZBLCAweDgxLCAweDA5LCAweDU3LCAweDQ4LCAweDhELAorCTB4RkUsIDB4MUIsIDB4RkYsIDB4NTIsIDB4MDEsIDB4REIsIDB4RkUsIDB4QzIsIDB4MDAsIDB4QTQsIDB4RkYsCisJMHgxNiwgMHgwMCwgMHgxRSwgMHgwMCwgMHg4NywgMHhGRiwgMHgwQiwgMHgwMSwgMHg0MiwgMHhGRSwgMHg3NCwKKwkweDAyLCAweEY5LCAweEZDLCAweDM5LCAweDAzLCAweEY1LCAweDQ4LCAweDI0LCAweDA0LCAweDk0LCAweEZDLAorCTB4QTksIDB4MDIsIDB4MjcsIDB4RkUsIDB4MTgsIDB4MDEsIDB4ODIsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgxNSwgMHgwMCwgMHhBOSwgMHhGRiwgMHhCNCwgMHgwMCwgMHhGNywgMHhGRSwgMHgxRCwgMHgwMSwKKwkweDdBLCAweEZGLCAweEM1LCAweEZELCAweDFELCAweDQ4LCAweDg5LCAweDBBLCAweEZCLCAweEY5LCAweEY4LAorCTB4MDMsIDB4N0QsIDB4RkQsIDB4NjYsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwRCwgMHgwMCwgMHhDQiwgMHhGRiwgMHg1RSwgMHgwMCwgMHhBOSwgMHhGRiwgMHhENiwgMHhGRiwgMHhDMywKKwkweDAxLCAweDQzLCAweEY5LCAweEQ3LCAweDQ1LCAweDkyLCAweDExLCAweDc3LCAweEY3LCAweDI4LCAweDA1LAorCTB4RUMsIDB4RkMsIDB4QTcsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDYsCisJMHgwMCwgMHhFQSwgMHhGRiwgMHgwQywgMHgwMCwgMHg0RSwgMHgwMCwgMHhBRiwgMHhGRSwgMHhCOCwgMHgwMywKKwkweEM3LCAweEY1LCAweDM4LCAweDQyLCAweDBDLCAweDE5LCAweDMyLCAweEY1LCAweDIzLCAweDA2LCAweDdELAorCTB4RkMsIDB4RDMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsCisJMHgwNSwgMHgwMCwgMHhDNSwgMHhGRiwgMHhERSwgMHgwMCwgMHhCNywgMHhGRCwgMHg0NSwgMHgwNSwgMHg1NiwKKwkweEYzLCAweDYxLCAweDNELCAweEJBLCAweDIwLCAweDU2LCAweEYzLCAweEQzLCAweDA2LCAweDNFLCAweEZDLAorCTB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUEsCisJMHgwMCwgMHg4QSwgMHhGRiwgMHg1MSwgMHgwMSwgMHhGOCwgMHhGQywgMHg1RSwgMHgwNiwgMHhFRCwgMHhGMSwKKwkweDgyLCAweDM3LCAweDYwLCAweDI4LCAweDBFLCAweEYyLCAweDI2LCAweDA3LCAweDM1LCAweEZDLCAweERCLAorCTB4MDEsIDB4NDAsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsCisJMHg1RiwgMHhGRiwgMHhBNSwgMHgwMSwgMHg3OCwgMHhGQywgMHhGRiwgMHgwNiwgMHg3RCwgMHhGMSwgMHhDRiwKKwkweDMwLCAweEI4LCAweDJGLCAweDgwLCAweEYxLCAweDBELCAweDA3LCAweDZBLCAweEZDLCAweEFFLCAweDAxLAorCTB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDMsCisJMHhGRiwgMHhENiwgMHgwMSwgMHgzOSwgMHhGQywgMHgyQSwgMHgwNywgMHhFQiwgMHhGMSwgMHg4NywgMHgyOSwKKwkweDg1LCAweDM2LCAweENDLCAweEYxLCAweDdGLCAweDA2LCAweEUwLCAweEZDLCAweDYwLCAweDAxLCAweDgyLAorCTB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCisJMHhFNiwgMHgwMSwgMHgzOCwgMHhGQywgMHhFNiwgMHgwNiwgMHgxOSwgMHhGMywgMHhFQSwgMHgyMSwgMHg4QSwKKwkweDNDLCAweDBFLCAweEYzLCAweDc4LCAweDA1LCAweDk2LCAweEZELCAweEYxLCAweDAwLCAweEJCLCAweEZGLAorCTB4MDgsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDgsCisJMHgwMSwgMHg3MCwgMHhGQywgMHg0MywgMHgwNiwgMHhFMSwgMHhGNCwgMHgzOCwgMHgxQSwgMHg4QywgMHg0MSwKKwkweDU1LCAweEY1LCAweEZDLCAweDAzLCAweDg1LCAweEZFLCAweDY2LCAweDAwLCAweDAxLCAweDAwLCAweEVFLAorCTB4RkYsIDB4MDYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDcsIDB4RkYsIDB4QUYsIDB4MDEsCisJMHhEOCwgMHhGQywgMHg1MiwgMHgwNSwgMHgxOSwgMHhGNywgMHhCMiwgMHgxMiwgMHg1QywgMHg0NSwgMHhBOSwKKwkweEY4LCAweDE2LCAweDAyLCAweEE2LCAweEZGLCAweEMzLCAweEZGLCAweDUxLCAweDAwLCAweEQwLCAweEZGLAorCTB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4NzEsIDB4MDEsIDB4NjUsCisJMHhGRCwgMHgyOSwgMHgwNCwgMHg5NiwgMHhGOSwgMHg5NSwgMHgwQiwgMHhEQywgMHg0NywgMHgwMywgMHhGRCwKKwkweEQ5LCAweEZGLCAweEVBLCAweDAwLCAweDEyLCAweEZGLCAweEE3LCAweDAwLCAweEFFLCAweEZGLCAweDE0LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0QsIDB4RkYsIDB4MjQsIDB4MDEsIDB4MEMsIDB4RkUsCisJMHhERSwgMHgwMiwgMHgyRSwgMHhGQywgMHgxMywgMHgwNSwgMHhFQywgMHg0OCwgMHg1NCwgMHgwMiwgMHg1RSwKKwkweEZELCAweDNGLCAweDAyLCAweDVELCAweEZFLCAweEZFLCAweDAwLCAweDhDLCAweEZGLCAweDFDLCAweDAwLAorCTB4MTcsIDB4MDAsIDB4OUUsIDB4RkYsIDB4Q0YsIDB4MDAsIDB4QkYsIDB4RkUsIDB4ODYsIDB4MDEsIDB4QkEsCisJMHhGRSwgMHg1QSwgMHhGRiwgMHg4NiwgMHg0OCwgMHg3RCwgMHgwOCwgMHhDNywgMHhGQSwgMHg5MywgMHgwMywKKwkweEIwLCAweEZELCAweDRGLCAweDAxLCAweDZDLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDBGLAorCTB4MDAsIDB4QzAsIDB4RkYsIDB4NzgsIDB4MDAsIDB4NzMsIDB4RkYsIDB4MzgsIDB4MDAsIDB4MTcsIDB4MDEsCisJMHg4QiwgMHhGQSwgMHhBRiwgMHg0NiwgMHg1OSwgMHgwRiwgMHgzOSwgMHhGOCwgMHhDRiwgMHgwNCwgMHgxNSwKKwkweEZELCAweDk1LCAweDAxLCAweDUxLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDA4LCAweDAwLAorCTB4RTEsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDUsIDB4RkYsIDB4MjgsIDB4MDMsIDB4QkQsCisJMHhGNiwgMHg3NywgMHg0MywgMHhCNiwgMHgxNiwgMHhEQywgMHhGNSwgMHhERCwgMHgwNSwgMHg5QiwgMHhGQywKKwkweEM4LCAweDAxLCAweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAzLCAweDAwLCAweEZELAorCTB4RkYsIDB4RDksIDB4RkYsIDB4QjQsIDB4MDAsIDB4RkQsIDB4RkQsIDB4RDcsIDB4MDQsIDB4RkEsIDB4RjMsCisJMHhGQywgMHgzRSwgMHg1QiwgMHgxRSwgMHhEQiwgMHhGMywgMHhBNiwgMHgwNiwgMHg0QywgMHhGQywgMHhFMywKKwkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDE0LCAweDAwLAorCTB4OUIsIDB4RkYsIDB4MzEsIDB4MDEsIDB4MkMsIDB4RkQsIDB4MTUsIDB4MDYsIDB4NDEsIDB4RjIsIDB4NkEsCisJMHgzOSwgMHgwQSwgMHgyNiwgMHg2MSwgMHhGMiwgMHgxNywgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwKKwkweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZBLAorCTB4RkYsIDB4OEUsIDB4MDEsIDB4OTksIDB4RkMsIDB4REIsIDB4MDYsIDB4ODYsIDB4RjEsIDB4RjIsIDB4MzIsCisJMHg4MiwgMHgyRCwgMHg5NiwgMHhGMSwgMHgyMSwgMHgwNywgMHg1MywgMHhGQywgMHhDMCwgMHgwMSwgMHg1MCwKKwkweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLAorCTB4Q0EsIDB4MDEsIDB4NDYsIDB4RkMsIDB4MjksIDB4MDcsIDB4QjMsIDB4RjEsIDB4RDEsIDB4MkIsIDB4ODEsCisJMHgzNCwgMHg5QywgMHhGMSwgMHhCOCwgMHgwNiwgMHhCNSwgMHhGQywgMHg3QywgMHgwMSwgMHg3NCwgMHhGRiwKKwkweDIyLCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LAorCTB4MDEsIDB4MzIsIDB4RkMsIDB4MDYsIDB4MDcsIDB4QUEsIDB4RjIsIDB4NDYsIDB4MjQsIDB4QzgsIDB4M0EsCisJMHg5MCwgMHhGMiwgMHhENiwgMHgwNSwgMHg1NywgMHhGRCwgMHgxNywgMHgwMSwgMHhBOCwgMHhGRiwgMHgwRiwKKwkweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERGLCAweDAxLAorCTB4NUEsIDB4RkMsIDB4N0UsIDB4MDYsIDB4NDcsIDB4RjQsIDB4OTQsIDB4MUMsIDB4MUYsIDB4NDAsIDB4ODUsCisJMHhGNCwgMHg3RCwgMHgwNCwgMHgzNiwgMHhGRSwgMHg5MywgMHgwMCwgMHhFQSwgMHhGRiwgMHhGNywgMHhGRiwKKwkweDA0LCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJFLCAweDAxLCAweEI0LAorCTB4RkMsIDB4QTQsIDB4MDUsIDB4NjEsIDB4RjYsIDB4RkIsIDB4MTQsIDB4NTMsIDB4NDQsIDB4ODYsIDB4RjcsCisJMHhCNiwgMHgwMiwgMHg0OSwgMHhGRiwgMHhGNywgMHhGRiwgMHgzNywgMHgwMCwgMHhEOSwgMHhGRiwgMHgwQSwKKwkweDAwLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU3LCAweEZGLCAweDg2LCAweDAxLCAweDM2LCAweEZELAorCTB4ODksIDB4MDQsIDB4Q0QsIDB4RjgsIDB4QjcsIDB4MEQsIDB4M0QsIDB4NDcsIDB4OTEsIDB4RkIsIDB4OTEsCisJMHgwMCwgMHg4MywgMHgwMCwgMHg0QSwgMHhGRiwgMHg4QywgMHgwMCwgMHhCOSwgMHhGRiwgMHgxMSwgMHgwMCwKKwkweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDczLCAweEZGLCAweDNELCAweDAxLCAweEQ2LCAweEZELCAweDQ2LAorCTB4MDMsIDB4NjEsIDB4RkIsIDB4MDAsIDB4MDcsIDB4QkYsIDB4NDgsIDB4OTgsIDB4MDAsIDB4MjYsIDB4RkUsCisJMHhENSwgMHgwMSwgMHg5NSwgMHhGRSwgMHhFMywgMHgwMCwgMHg5NiwgMHhGRiwgMHgxQSwgMHgwMCwgMHgxQSwKKwkweDAwLCAweDk0LCAweEZGLCAweEVBLCAweDAwLCAweDg3LCAweEZFLCAweEYwLCAweDAxLCAweEY1LCAweEZELAorCTB4MDUsIDB4MDEsIDB4Q0UsIDB4NDgsIDB4ODMsIDB4MDYsIDB4OTQsIDB4RkIsIDB4MkMsIDB4MDMsIDB4RTQsCisJMHhGRCwgMHgzNywgMHgwMSwgMHg3NiwgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwKKwkweEI2LCAweEZGLCAweDkzLCAweDAwLCAweDNDLCAweEZGLCAweDlELCAweDAwLCAweDYzLCAweDAwLCAweEVCLAorCTB4RkIsIDB4NjksIDB4NDcsIDB4MkQsIDB4MEQsIDB4RkYsIDB4RjgsIDB4NzIsIDB4MDQsIDB4NDIsIDB4RkQsCisJMHg4MSwgMHgwMSwgMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHhENywKKwkweEZGLCAweDNFLCAweDAwLCAweEVBLCAweEZGLCAweDYwLCAweEZGLCAweDhGLCAweDAyLCAweENELCAweEY3LAorCTB4OTksIDB4NDQsIDB4NjgsIDB4MTQsIDB4OEUsIDB4RjYsIDB4OTAsIDB4MDUsIDB4QkMsIDB4RkMsIDB4QkEsCisJMHgwMSwgMHg0MywgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNSwgMHhGRiwKKwkweEVGLCAweEZGLCAweDg4LCAweDAwLCAweDQ5LCAweEZFLCAweDVELCAweDA0LCAweEI3LCAweEY0LCAweDdELAorCTB4NDAsIDB4RkQsIDB4MUIsIDB4NkMsIDB4RjQsIDB4NzAsIDB4MDYsIDB4NUYsIDB4RkMsIDB4REUsIDB4MDEsCisJMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhBQywKKwkweEZGLCAweDBFLCAweDAxLCAweDY2LCAweEZELCAweEJGLCAweDA1LCAweEFELCAweEYyLCAweDNCLCAweDNCLAorCTB4QjAsIDB4MjMsIDB4QzQsIDB4RjIsIDB4RkYsIDB4MDYsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzgsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgyMSwgMHgwMCwgMHg3NywgMHhGRiwKKwkweDc1LCAweDAxLCAweEJGLCAweEZDLCAweEFCLCAweDA2LCAweEE2LCAweEYxLCAweDA1LCAweDM1LCAweDQwLAorCTB4MkIsIDB4QkYsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDIsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4NDgsIDB4RkYsCisJMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MiwgMHhGRiwgMHhCQywKKwkweDAxLCAweDU4LCAweEZDLCAweDFELCAweDA3LCAweDhFLCAweEYxLCAweDExLCAweDJFLCAweDZCLCAweDMyLAorCTB4ODEsIDB4RjEsIDB4RTUsIDB4MDYsIDB4OTAsIDB4RkMsIDB4OTQsIDB4MDEsIDB4NjcsIDB4RkYsIDB4MjYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwgMHhFMCwgMHgwMSwKKwkweDMyLCAweEZDLCAweDFDLCAweDA3LCAweDRCLCAweEYyLCAweEEwLCAweDI2LCAweEYyLCAweDM4LCAweDJBLAorCTB4RjIsIDB4MjgsIDB4MDYsIDB4MUYsIDB4RkQsIDB4MzksIDB4MDEsIDB4OTYsIDB4RkYsIDB4MTYsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwgMHgwMSwgMHg0OCwKKwkweEZDLCAweEIyLCAweDA2LCAweEI5LCAweEYzLCAweEYzLCAweDFFLCAweDk4LCAweDNFLCAweENGLCAweEYzLAorCTB4RjMsIDB4MDQsIDB4RUIsIDB4RkQsIDB4QkYsIDB4MDAsIDB4RDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDMsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwgMHhDQiwgMHgwMSwgMHg5MywgMHhGQywKKwkweEVGLCAweDA1LCAweEIwLCAweEY1LCAweDRCLCAweDE3LCAweDJBLCAweDQzLCAweDdELCAweEY2LCAweDRELAorCTB4MDMsIDB4RUYsIDB4RkUsIDB4MkEsIDB4MDAsIDB4MUUsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MDgsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RiwgMHhGRiwgMHg5OSwgMHgwMSwgMHgwQiwgMHhGRCwgMHhFNiwKKwkweDA0LCAweDA4LCAweEY4LCAweEU3LCAweDBGLCAweDdDLCAweDQ2LCAweDM3LCAweEZBLCAweDQyLCAweDAxLAorCTB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4QzMsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgyNiwgMHgwMCwgMHg2QSwgMHhGRiwgMHg1NSwgMHgwMSwgMHhBMywgMHhGRCwgMHhBRCwgMHgwMywKKwkweDk0LCAweEZBLCAweEZGLCAweDA4LCAweDcwLCAweDQ4LCAweEYzLCAweEZFLCAweEVBLCAweEZFLCAweDZDLAorCTB4MDEsIDB4Q0QsIDB4RkUsIDB4QzksIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTcsIDB4MDAsIDB4MUQsIDB4MDAsCisJMHg4QSwgMHhGRiwgMHgwNCwgMHgwMSwgMHg1MCwgMHhGRSwgMHg1QSwgMHgwMiwgMHgyQywgMHhGRCwgMHhDNiwKKwkweDAyLCAweEYyLCAweDQ4LCAweDlCLCAweDA0LCAweDYxLCAweEZDLCAweEMzLCAweDAyLCAweDE5LCAweEZFLAorCTB4MUUsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4QUMsCisJMHhGRiwgMHhBRSwgMHgwMCwgMHgwNSwgMHhGRiwgMHgwMywgMHgwMSwgMHhBQSwgMHhGRiwgMHg2MywgMHhGRCwKKwkweEZELCAweDQ3LCAweDBFLCAweDBCLCAweEM4LCAweEY5LCAweDExLCAweDA0LCAweDcxLCAweEZELCAweDZDLAorCTB4MDEsIDB4NjEsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4Q0QsIDB4RkYsCisJMHg1NywgMHgwMCwgMHhCNiwgMHhGRiwgMHhCRSwgMHhGRiwgMHhFRCwgMHgwMSwgMHhGNSwgMHhGOCwgMHg5QiwKKwkweDQ1LCAweDIyLCAweDEyLCAweDQ4LCAweEY3LCAweDNELCAweDA1LCAweEUyLCAweEZDLCAweEFCLCAweDAxLAorCTB4NDksIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsCisJMHgwMCwgMHg1QSwgMHgwMCwgMHg5QSwgMHhGRSwgMHhEQSwgMHgwMywgMHg4RCwgMHhGNSwgMHhFMSwgMHg0MSwKKwkweEExLCAweDE5LCAweDA5LCAweEY1LCAweDMzLCAweDA2LCAweDc3LCAweEZDLCAweEQ2LCAweDAxLCAweDNBLAorCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzAsIDB4RkYsCisJMHhFOCwgMHgwMCwgMHhBNiwgMHhGRCwgMHg1RiwgMHgwNSwgMHgzMSwgMHhGMywgMHhGNiwgMHgzQywgMHg1MiwKKwkweDIxLCAweDM3LCAweEYzLCAweERELCAweDA2LCAweDNCLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4ODYsIDB4RkYsIDB4NTksCisJMHgwMSwgMHhFQywgMHhGQywgMHg2RiwgMHgwNiwgMHhEQywgMHhGMSwgMHgwNCwgMHgzNywgMHhGMywgMHgyOCwKKwkweEZDLCAweEYxLCAweDI4LCAweDA3LCAweDM3LCAweEZDLCAweEQ4LCAweDAxLCAweDQxLCAweEZGLCAweDMzLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4QUEsIDB4MDEsCisJMHg3MSwgMHhGQywgMHgwNywgMHgwNywgMHg3RSwgMHhGMSwgMHg0NCwgMHgzMCwgMHg0NCwgMHgzMCwgMHg3RSwKKwkweEYxLCAweDA3LCAweDA3LCAweDcxLCAweEZDLCAweEFBLCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4RDgsIDB4MDEsIDB4MzcsCisJMHhGQywgMHgyOCwgMHgwNywgMHhGQywgMHhGMSwgMHhGMywgMHgyOCwgMHgwNCwgMHgzNywgMHhEQywgMHhGMSwKKwkweDZGLCAweDA2LCAweEVDLCAweEZDLCAweDU5LCAweDAxLCAweDg2LCAweEZGLCAweDFDLCAweDAwLCAweEZFLAorCTB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0IsIDB4RkMsCisJMHhERCwgMHgwNiwgMHgzNywgMHhGMywgMHg1MiwgMHgyMSwgMHhGNiwgMHgzQywgMHgzMSwgMHhGMywgMHg1RiwKKwkweDA1LCAweEE2LCAweEZELCAweEU4LCAweDAwLCAweEMwLCAweEZGLCAweDA3LCAweDAwLCAweDAxLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDYsIDB4MDEsIDB4NzcsIDB4RkMsIDB4MzMsCisJMHgwNiwgMHgwOSwgMHhGNSwgMHhBMSwgMHgxOSwgMHhFMSwgMHg0MSwgMHg4RCwgMHhGNSwgMHhEQSwgMHgwMywKKwkweDlBLCAweEZFLCAweDVBLCAweDAwLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LCAweDAwLCAweEZGLAorCTB4RkYsIDB4MzAsIDB4MDAsIDB4NDksIDB4RkYsIDB4QUIsIDB4MDEsIDB4RTIsIDB4RkMsIDB4M0QsIDB4MDUsCisJMHg0OCwgMHhGNywgMHgyMiwgMHgxMiwgMHg5QiwgMHg0NSwgMHhGNSwgMHhGOCwgMHhFRCwgMHgwMSwgMHhCRSwKKwkweEZGLCAweEI2LCAweEZGLCAweDU3LCAweDAwLCAweENELCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLAorCTB4MjgsIDB4MDAsIDB4NjEsIDB4RkYsIDB4NkMsIDB4MDEsIDB4NzEsIDB4RkQsIDB4MTEsIDB4MDQsIDB4QzgsCisJMHhGOSwgMHgwRSwgMHgwQiwgMHhGRCwgMHg0NywgMHg2MywgMHhGRCwgMHhBQSwgMHhGRiwgMHgwMywgMHgwMSwKKwkweDA1LCAweEZGLCAweEFFLCAweDAwLCAweEFDLCAweEZGLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDIwLAorCTB4MDAsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDEsIDB4MTksIDB4RkUsIDB4QzMsIDB4MDIsIDB4NjEsIDB4RkMsCisJMHg5QiwgMHgwNCwgMHhGMiwgMHg0OCwgMHhDNiwgMHgwMiwgMHgyQywgMHhGRCwgMHg1QSwgMHgwMiwgMHg1MCwKKwkweEZFLCAweDA0LCAweDAxLCAweDhBLCAweEZGLCAweDFELCAweDAwLCAweDE3LCAweDAwLCAweEExLCAweEZGLAorCTB4QzksIDB4MDAsIDB4Q0QsIDB4RkUsIDB4NkMsIDB4MDEsIDB4RUEsIDB4RkUsIDB4RjMsIDB4RkUsIDB4NzAsCisJMHg0OCwgMHhGRiwgMHgwOCwgMHg5NCwgMHhGQSwgMHhBRCwgMHgwMywgMHhBMywgMHhGRCwgMHg1NSwgMHgwMSwKKwkweDZBLCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEMzLCAweEZGLCAweDcxLAorCTB4MDAsIDB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsIDB4NDIsIDB4MDEsIDB4MzcsIDB4RkEsIDB4N0MsIDB4NDYsCisJMHhFNywgMHgwRiwgMHgwOCwgMHhGOCwgMHhFNiwgMHgwNCwgMHgwQiwgMHhGRCwgMHg5OSwgMHgwMSwgMHg0RiwKKwkweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDA4LCAweDAwLCAweEUzLCAweEZGLCAweDFFLCAweDAwLAorCTB4MkEsIDB4MDAsIDB4RUYsIDB4RkUsIDB4NEQsIDB4MDMsIDB4N0QsIDB4RjYsIDB4MkEsIDB4NDMsIDB4NEIsCisJMHgxNywgMHhCMCwgMHhGNSwgMHhFRiwgMHgwNSwgMHg5MywgMHhGQywgMHhDQiwgMHgwMSwgMHgzRCwgMHhGRiwKKwkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDAzLCAweDAwLCAweEZGLCAweEZGLCAweEQ0LCAweEZGLCAweEJGLAorCTB4MDAsIDB4RUIsIDB4RkQsIDB4RjMsIDB4MDQsIDB4Q0YsIDB4RjMsIDB4OTgsIDB4M0UsIDB4RjMsIDB4MUUsCisJMHhCOSwgMHhGMywgMHhCMiwgMHgwNiwgMHg0OCwgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk2LCAweEZGLCAweDM5LCAweDAxLAorCTB4MUYsIDB4RkQsIDB4MjgsIDB4MDYsIDB4MkEsIDB4RjIsIDB4RjIsIDB4MzgsIDB4QTAsIDB4MjYsIDB4NEIsCisJMHhGMiwgMHgxQywgMHgwNywgMHgzMiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNSwgMHgwMCwKKwkweEZELCAweEZGLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY3LCAweEZGLCAweDk0LCAweDAxLCAweDkwLAorCTB4RkMsIDB4RTUsIDB4MDYsIDB4ODEsIDB4RjEsIDB4NkIsIDB4MzIsIDB4MTEsIDB4MkUsIDB4OEUsIDB4RjEsCisJMHgxRCwgMHgwNywgMHg1OCwgMHhGQywgMHhCQywgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ4LCAweEZGLCAweENFLCAweDAxLCAweDQyLCAweEZDLAorCTB4MkEsIDB4MDcsIDB4QkYsIDB4RjEsIDB4NDAsIDB4MkIsIDB4MDUsIDB4MzUsIDB4QTYsIDB4RjEsIDB4QUIsCisJMHgwNiwgMHhCRiwgMHhGQywgMHg3NSwgMHgwMSwgMHg3NywgMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU1LCAweDAxLCAweDMzLCAweEZDLCAweEZGLAorCTB4MDYsIDB4QzQsIDB4RjIsIDB4QjAsIDB4MjMsIDB4M0IsIDB4M0IsIDB4QUQsIDB4RjIsIDB4QkYsIDB4MDUsCisJMHg2NiwgMHhGRCwgMHgwRSwgMHgwMSwgMHhBQywgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERFLCAweDAxLCAweDVGLCAweEZDLCAweDcwLCAweDA2LAorCTB4NkMsIDB4RjQsIDB4RkQsIDB4MUIsIDB4N0QsIDB4NDAsIDB4QjcsIDB4RjQsIDB4NUQsIDB4MDQsIDB4NDksCisJMHhGRSwgMHg4OCwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDMyLCAweDAwLCAweDQzLCAweEZGLCAweEJBLCAweDAxLCAweEJDLCAweEZDLCAweDkwLCAweDA1LCAweDhFLAorCTB4RjYsIDB4NjgsIDB4MTQsIDB4OTksIDB4NDQsIDB4Q0QsIDB4RjcsIDB4OEYsIDB4MDIsIDB4NjAsIDB4RkYsCisJMHhFQSwgMHhGRiwgMHgzRSwgMHgwMCwgMHhENywgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwKKwkweDAwLCAweDU5LCAweEZGLCAweDgxLCAweDAxLCAweDQyLCAweEZELCAweDcyLCAweDA0LCAweEZGLCAweEY4LAorCTB4MkQsIDB4MEQsIDB4NjksIDB4NDcsIDB4RUIsIDB4RkIsIDB4NjMsIDB4MDAsIDB4OUQsIDB4MDAsIDB4M0MsCisJMHhGRiwgMHg5MywgMHgwMCwgMHhCNiwgMHhGRiwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwKKwkweDc2LCAweEZGLCAweDM3LCAweDAxLCAweEU0LCAweEZELCAweDJDLCAweDAzLCAweDk0LCAweEZCLCAweDgzLAorCTB4MDYsIDB4Q0UsIDB4NDgsIDB4MDUsIDB4MDEsIDB4RjUsIDB4RkQsIDB4RjAsIDB4MDEsIDB4ODcsIDB4RkUsCisJMHhFQSwgMHgwMCwgMHg5NCwgMHhGRiwgMHgxQSwgMHgwMCwgMHgxQSwgMHgwMCwgMHg5NiwgMHhGRiwgMHhFMywKKwkweDAwLCAweDk1LCAweEZFLCAweEQ1LCAweDAxLCAweDI2LCAweEZFLCAweDk4LCAweDAwLCAweEJGLCAweDQ4LAorCTB4MDAsIDB4MDcsIDB4NjEsIDB4RkIsIDB4NDYsIDB4MDMsIDB4RDYsIDB4RkQsIDB4M0QsIDB4MDEsIDB4NzMsCisJMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHhCOSwgMHhGRiwgMHg4QywgMHgwMCwKKwkweDRBLCAweEZGLCAweDgzLCAweDAwLCAweDkxLCAweDAwLCAweDkxLCAweEZCLCAweDNELCAweDQ3LCAweEI3LAorCTB4MEQsIDB4Q0QsIDB4RjgsIDB4ODksIDB4MDQsIDB4MzYsIDB4RkQsIDB4ODYsIDB4MDEsIDB4NTcsIDB4RkYsCisJMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgzNywgMHgwMCwgMHhGNywKKwkweEZGLCAweDQ5LCAweEZGLCAweEI2LCAweDAyLCAweDg2LCAweEY3LCAweDUzLCAweDQ0LCAweEZCLCAweDE0LAorCTB4NjEsIDB4RjYsIDB4QTQsIDB4MDUsIDB4QjQsIDB4RkMsIDB4QkUsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzIsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNywgMHhGRiwgMHhFQSwgMHhGRiwgMHg5MywgMHgwMCwKKwkweDM2LCAweEZFLCAweDdELCAweDA0LCAweDg1LCAweEY0LCAweDFGLCAweDQwLCAweDk0LCAweDFDLCAweDQ3LAorCTB4RjQsIDB4N0UsIDB4MDYsIDB4NUEsIDB4RkMsIDB4REYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHgxNywgMHgwMSwgMHg1NywKKwkweEZELCAweEQ2LCAweDA1LCAweDkwLCAweEYyLCAweEM4LCAweDNBLCAweDQ2LCAweDI0LCAweEFBLCAweEYyLAorCTB4MDYsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHhGRSwgMHhGRiwgMHgyMiwgMHgwMCwgMHg3NCwgMHhGRiwgMHg3QywgMHgwMSwgMHhCNSwgMHhGQywKKwkweEI4LCAweDA2LCAweDlDLCAweEYxLCAweDgxLCAweDM0LCAweEQxLCAweDJCLCAweEIzLCAweEYxLCAweDI5LAorCTB4MDcsIDB4NDYsIDB4RkMsIDB4Q0EsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhDMCwgMHgwMSwgMHg1MywgMHhGQywgMHgyMSwKKwkweDA3LCAweDk2LCAweEYxLCAweDgyLCAweDJELCAweEYyLCAweDMyLCAweDg2LCAweEYxLCAweERCLCAweDA2LAorCTB4OTksIDB4RkMsIDB4OEUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsCisJMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNywgMHgwNywKKwkweDYxLCAweEYyLCAweDBBLCAweDI2LCAweDZBLCAweDM5LCAweDQxLCAweEYyLCAweDE1LCAweDA2LCAweDJDLAorCTB4RkQsIDB4MzEsIDB4MDEsIDB4OUIsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0QywgMHhGQywgMHhBNiwgMHgwNiwgMHhEQiwKKwkweEYzLCAweDVCLCAweDFFLCAweEZDLCAweDNFLCAweEZBLCAweEYzLCAweEQ3LCAweDA0LCAweEZELCAweEZELAorCTB4QjQsIDB4MDAsIDB4RDksIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHgzRSwgMHhGRiwgMHhDOCwgMHgwMSwgMHg5QiwgMHhGQywgMHhERCwgMHgwNSwgMHhEQywgMHhGNSwKKwkweEI2LCAweDE2LCAweDc3LCAweDQzLCAweEJELCAweEY2LCAweDI4LCAweDAzLCAweDA1LCAweEZGLCAweDFELAorCTB4MDAsIDB4MjUsIDB4MDAsIDB4RTEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsCisJMHg1MSwgMHhGRiwgMHg5NSwgMHgwMSwgMHgxNSwgMHhGRCwgMHhDRiwgMHgwNCwgMHgzOSwgMHhGOCwgMHg1OSwKKwkweDBGLCAweEFGLCAweDQ2LCAweDhCLCAweEZBLCAweDE3LCAweDAxLCAweDM4LCAweDAwLCAweDczLCAweEZGLAorCTB4NzgsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkMsCisJMHhGRiwgMHg0RiwgMHgwMSwgMHhCMCwgMHhGRCwgMHg5MywgMHgwMywgMHhDNywgMHhGQSwgMHg3RCwgMHgwOCwKKwkweDg2LCAweDQ4LCAweDVBLCAweEZGLCAweEJBLCAweEZFLCAweDg2LCAweDAxLCAweEJGLCAweEZFLCAweENGLAorCTB4MDAsIDB4OUUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4MUMsIDB4MDAsIDB4OEMsIDB4RkYsIDB4RkUsIDB4MDAsCisJMHg1RCwgMHhGRSwgMHgzRiwgMHgwMiwgMHg1RSwgMHhGRCwgMHg1NCwgMHgwMiwgMHhFQywgMHg0OCwgMHgxMywKKwkweDA1LCAweDJFLCAweEZDLCAweERFLCAweDAyLCAweDBDLCAweEZFLCAweDI0LCAweDAxLCAweDdELCAweEZGLAorCTB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4QUUsIDB4RkYsIDB4QTcsIDB4MDAsIDB4MTIsCisJMHhGRiwgMHhFQSwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwMywgMHhGRCwgMHhEQywgMHg0NywgMHg5NSwgMHgwQiwKKwkweDk2LCAweEY5LCAweDI5LCAweDA0LCAweDY1LCAweEZELCAweDcxLCAweDAxLCAweDVGLCAweEZGLCAweDI5LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NTEsIDB4MDAsIDB4QzMsIDB4RkYsCisJMHhBNiwgMHhGRiwgMHgxNiwgMHgwMiwgMHhBOSwgMHhGOCwgMHg1QywgMHg0NSwgMHhCMiwgMHgxMiwgMHgxOSwKKwkweEY3LCAweDUyLCAweDA1LCAweEQ4LCAweEZDLCAweEFGLCAweDAxLCAweDQ3LCAweEZGLCAweDMwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4NjYsIDB4MDAsIDB4ODUsCisJMHhGRSwgMHhGQywgMHgwMywgMHg1NSwgMHhGNSwgMHg4QywgMHg0MSwgMHgzOCwgMHgxQSwgMHhFMSwgMHhGNCwKKwkweDQzLCAweDA2LCAweDcwLCAweEZDLCAweEQ4LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLAorCTB4RkYsIDB4MDEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RjEsIDB4MDAsIDB4OTYsIDB4RkQsCisJMHg3OCwgMHgwNSwgMHgwRSwgMHhGMywgMHg4QSwgMHgzQywgMHhFQSwgMHgyMSwgMHgxOSwgMHhGMywgMHhFNiwKKwkweDA2LCAweDM4LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAorCTB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODIsIDB4RkYsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RkMsIDB4N0YsCisJMHgwNiwgMHhDQywgMHhGMSwgMHg4NSwgMHgzNiwgMHg4NywgMHgyOSwgMHhFQiwgMHhGMSwgMHgyQSwgMHgwNywKKwkweDM5LCAweEZDLCAweEQ2LCAweDAxLCAweDQzLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweEZELAorCTB4RkYsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4QUUsIDB4MDEsIDB4NkEsIDB4RkMsIDB4MEQsIDB4MDcsCisJMHg4MCwgMHhGMSwgMHhCOCwgMHgyRiwgMHhDRiwgMHgzMCwgMHg3RCwgMHhGMSwgMHhGRiwgMHgwNiwgMHg3OCwKKwkweEZDLCAweEE1LCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLAorCTB4MzQsIDB4MDAsIDB4NDAsIDB4RkYsIDB4REIsIDB4MDEsIDB4MzUsIDB4RkMsIDB4MjYsIDB4MDcsIDB4MEUsCisJMHhGMiwgMHg2MCwgMHgyOCwgMHg4MiwgMHgzNywgMHhFRCwgMHhGMSwgMHg1RSwgMHgwNiwgMHhGOCwgMHhGQywKKwkweDUxLCAweDAxLCAweDhBLCAweEZGLCAweDFBLCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0UsIDB4RkMsIDB4RDMsIDB4MDYsIDB4NTYsIDB4RjMsCisJMHhCQSwgMHgyMCwgMHg2MSwgMHgzRCwgMHg1NiwgMHhGMywgMHg0NSwgMHgwNSwgMHhCNywgMHhGRCwgMHhERSwKKwkweDAwLCAweEM1LCAweEZGLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAorCTB4M0EsIDB4RkYsIDB4RDMsIDB4MDEsIDB4N0QsIDB4RkMsIDB4MjMsIDB4MDYsIDB4MzIsIDB4RjUsIDB4MEMsCisJMHgxOSwgMHgzOCwgMHg0MiwgMHhDNywgMHhGNSwgMHhCOCwgMHgwMywgMHhBRiwgMHhGRSwgMHg0RSwgMHgwMCwKKwkweDBDLCAweDAwLCAweEVBLCAweEZGLCAweDA2LCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRBLAorCTB4RkYsIDB4QTcsIDB4MDEsIDB4RUMsIDB4RkMsIDB4MjgsIDB4MDUsIDB4NzcsIDB4RjcsIDB4OTIsIDB4MTEsCisJMHhENywgMHg0NSwgMHg0MywgMHhGOSwgMHhDMywgMHgwMSwgMHhENiwgMHhGRiwgMHhBOSwgMHhGRiwgMHg1RSwKKwkweDAwLCAweENCLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDYzLCAweEZGLAorCTB4NjYsIDB4MDEsIDB4N0QsIDB4RkQsIDB4RjgsIDB4MDMsIDB4RkIsIDB4RjksIDB4ODksIDB4MEEsIDB4MUQsCisJMHg0OCwgMHhDNSwgMHhGRCwgMHg3QSwgMHhGRiwgMHgxRCwgMHgwMSwgMHhGNywgMHhGRSwgMHhCNCwgMHgwMCwKKwkweEE5LCAweEZGLCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgyLCAweEZGLCAweDE4LAorCTB4MDEsIDB4MjcsIDB4RkUsIDB4QTksIDB4MDIsIDB4OTQsIDB4RkMsIDB4MjQsIDB4MDQsIDB4RjUsIDB4NDgsCisJMHgzOSwgMHgwMywgMHhGOSwgMHhGQywgMHg3NCwgMHgwMiwgMHg0MiwgMHhGRSwgMHgwQiwgMHgwMSwgMHg4NywKKwkweEZGLCAweDFFLCAweDAwLCAweDE2LCAweDAwLCAweEE0LCAweEZGLCAweEMyLCAweDAwLCAweERCLCAweEZFLAorCTB4NTIsIDB4MDEsIDB4MUIsIDB4RkYsIDB4OEQsIDB4RkUsIDB4NTcsIDB4NDgsIDB4ODEsIDB4MDksIDB4NjEsCisJMHhGQSwgMHhDNiwgMHgwMywgMHg5NiwgMHhGRCwgMHg1QiwgMHgwMSwgMHg2OCwgMHhGRiwgMHgyNiwgMHgwMCwKKwkweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEM2LCAweEZGLCAweDZCLCAweDAwLCAweDhFLCAweEZGLCAweDA2LAorCTB4MDAsIDB4NkUsIDB4MDEsIDB4RTQsIDB4RjksIDB4NDgsIDB4NDYsIDB4NzUsIDB4MTAsIDB4RDcsIDB4RjcsCisJMHhGQywgMHgwNCwgMHgwMCwgMHhGRCwgMHg5RSwgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDA3LCAweDAwLCAweEU1LCAweEZGLCAweDE4LCAweDAwLCAweDM2LCAweDAwLCAweEQ5LCAweEZFLAorCTB4NzEsIDB4MDMsIDB4M0YsIDB4RjYsIDB4REIsIDB4NDIsIDB4RTAsIDB4MTcsIDB4ODYsIDB4RjUsIDB4MDAsCisJMHgwNiwgMHg4QywgMHhGQywgMHhDRSwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDAyLCAweDAwLCAweDAxLCAweDAwLCAweENGLCAweEZGLCAweEM5LCAweDAwLCAweERBLCAweEZELCAweDBGLAorCTB4MDUsIDB4QTUsIDB4RjMsIDB4MzEsIDB4M0UsIDB4OEEsIDB4MUYsIDB4OTcsIDB4RjMsIDB4QkQsIDB4MDYsCisJMHg0NCwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwKKwkweEZGLCAweDE3LCAweDAwLCAweDkyLCAweEZGLCAweDQxLCAweDAxLCAweDExLCAweEZELCAweDNCLCAweDA2LAorCTB4MTQsIDB4RjIsIDB4NzgsIDB4MzgsIDB4MzYsIDB4MjcsIDB4MzUsIDB4RjIsIDB4MjAsIDB4MDcsIDB4MzMsCisJMHhGQywgMHhERiwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwKKwkweDI4LCAweDAwLCAweDY0LCAweEZGLCAweDlBLCAweDAxLCAweDg4LCAweEZDLCAweEVFLCAweDA2LCAweDdFLAorCTB4RjEsIDB4RTMsIDB4MzEsIDB4OUYsIDB4MkUsIDB4ODgsIDB4RjEsIDB4MTksIDB4MDcsIDB4NUUsIDB4RkMsCisJMHhCNywgMHgwMSwgMHg1NCwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzMiwKKwkweDAwLCAweDQ2LCAweEZGLCAweEQxLCAweDAxLCAweDNGLCAweEZDLCAweDJCLCAweDA3LCAweENELCAweEYxLAorCTB4QUUsIDB4MkEsIDB4ODYsIDB4MzUsIDB4QjEsIDB4RjEsIDB4OUQsIDB4MDYsIDB4Q0EsIDB4RkMsIDB4NkUsCisJMHgwMSwgMHg3QiwgMHhGRiwgMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM1LCAweEZDLCAweEY3LCAweDA2LCAweEUwLCAweEYyLCAweDE4LAorCTB4MjMsIDB4QUIsIDB4M0IsIDB4Q0MsIDB4RjIsIDB4QTgsIDB4MDUsIDB4NzYsIDB4RkQsIDB4MDQsIDB4MDEsCisJMHhCMSwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwKKwkweEZGLCAweERDLCAweDAxLCAweDY0LCAweEZDLCAweDYyLCAweDA2LCAweDkzLCAweEY0LCAweDY2LCAweDFCLAorCTB4RDksIDB4NDAsIDB4RUEsIDB4RjQsIDB4M0UsIDB4MDQsIDB4NUQsIDB4RkUsIDB4N0QsIDB4MDAsIDB4RjUsCisJMHhGRiwgMHhGMywgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NCwgMHhGRiwKKwkweEI3LCAweDAxLCAweEM1LCAweEZDLCAweDdDLCAweDA1LCAweEJDLCAweEY2LCAweEQ1LCAweDEzLCAweERDLAorCTB4NDQsIDB4MTQsIDB4RjgsIDB4NjcsIDB4MDIsIDB4NzcsIDB4RkYsIDB4REQsIDB4RkYsIDB4NDQsIDB4MDAsCisJMHhENSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QiwgMHhGRiwgMHg3QywKKwkweDAxLCAweDRFLCAweEZELCAweDVBLCAweDA0LCAweDMxLCAweEY5LCAweEE0LCAweDBDLCAweDkwLCAweDQ3LAorCTB4NDcsIDB4RkMsIDB4MzYsIDB4MDAsIDB4QjYsIDB4MDAsIDB4MkUsIDB4RkYsIDB4OTksIDB4MDAsIDB4QjMsCisJMHhGRiwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3OCwgMHhGRiwgMHgzMSwgMHgwMSwKKwkweEYxLCAweEZELCAweDEyLCAweDAzLCAweEM3LCAweEZCLCAweDA3LCAweDA2LCAweERCLCAweDQ4LCAweDczLAorCTB4MDEsIDB4QzMsIDB4RkQsIDB4MEEsIDB4MDIsIDB4NzksIDB4RkUsIDB4RjEsIDB4MDAsIDB4OTEsIDB4RkYsCisJMHgxQiwgMHgwMCwgMHgxOSwgMHgwMCwgMHg5OSwgMHhGRiwgMHhERCwgMHgwMCwgMHhBMywgMHhGRSwgMHhCQiwKKwkweDAxLCAweDU4LCAweEZFLCAweDJELCAweDAwLCAweEFGLCAweDQ4LCAweDdFLCAweDA3LCAweDJFLCAweEZCLAorCTB4NjAsIDB4MDMsIDB4QzksIDB4RkQsIDB4NDMsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgxMCwgMHgwMCwgMHhCQiwgMHhGRiwgMHg4NSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg2QSwgMHgwMCwKKwkweEJFLCAweDAwLCAweDM4LCAweEZCLCAweDBGLCAweDQ3LCAweDQyLCAweDBFLCAweDlCLCAweEY4LCAweEExLAorCTB4MDQsIDB4MkIsIDB4RkQsIDB4OEIsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgwOSwgMHgwMCwgMHhEQywgMHhGRiwgMHgzMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgzMiwgMHhGRiwgMHhEQywKKwkweDAyLCAweDQyLCAweEY3LCAweDBCLCAweDQ0LCAweDhFLCAweDE1LCAweDM0LCAweEY2LCAweEI3LCAweDA1LAorCTB4QUIsIDB4RkMsIDB4QzEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDQsCisJMHgwMCwgMHhGOSwgMHhGRiwgMHhFNCwgMHhGRiwgMHg5RiwgMHgwMCwgMHgyMywgMHhGRSwgMHg5QiwgMHgwNCwKKwkweDU1LCAweEY0LCAweEMwLCAweDNGLCAweDJDLCAweDFELCAweDIyLCAweEY0LCAweDhDLCAweDA2LCAweDU1LAorCTB4RkMsIDB4RTEsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgxMSwgMHgwMCwgMHhBMywgMHhGRiwgMHgyMCwgMHgwMSwgMHg0OSwgMHhGRCwgMHhFQiwgMHgwNSwgMHg3NCwKKwkweEYyLCAweDU0LCAweDNBLCAweERELCAweDI0LCAweDkxLCAweEYyLCAweDBDLCAweDA3LCAweDMyLCAweEZDLAorCTB4RTQsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MjMsCisJMHgwMCwgMHg3MSwgMHhGRiwgMHg4MiwgMHgwMSwgMHhBQiwgMHhGQywgMHhDNCwgMHgwNiwgMHg5MywgMHhGMSwKKwkweEZELCAweDMzLCAweDYyLCAweDJDLCAweEE4LCAweEYxLCAweDI3LCAweDA3LCAweDRBLCAweEZDLCAweEM3LAorCTB4MDEsIDB4NEMsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsCisJMHg0RSwgMHhGRiwgMHhDMywgMHgwMSwgMHg0RSwgMHhGQywgMHgyNCwgMHgwNywgMHg5RSwgMHhGMSwgMHhGMiwKKwkweDJDLCAweDc4LCAweDMzLCAweDhDLCAweEYxLCAweEQwLCAweDA2LCAweEEyLCAweEZDLCAweDg4LCAweDAxLAorCTB4NkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsCisJMHhGRiwgMHhFMywgMHgwMSwgMHgzMSwgMHhGQywgMHgxMiwgMHgwNywgMHg3OSwgMHhGMiwgMHg3MywgMHgyNSwKKwkweERGLCAweDM5LCAweDVBLCAweEYyLCAweDAwLCAweDA2LCAweDNBLCAweEZELCAweDI4LCAweDAxLCAweDlGLAorCTB4RkYsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsCisJMHhFMiwgMHgwMSwgMHg1MCwgMHhGQywgMHg5OSwgMHgwNiwgMHhGRSwgMHhGMywgMHhDMywgMHgxRCwgMHg1RSwKKwkweDNGLCAweDI3LCAweEY0LCAweEI5LCAweDA0LCAweDEwLCAweEZFLCAweEE5LCAweDAwLCAweERGLCAweEZGLAorCTB4RkIsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0YsIDB4RkYsIDB4QzUsCisJMHgwMSwgMHhBMywgMHhGQywgMHhDQSwgMHgwNSwgMHgwNywgMHhGNiwgMHgyMiwgMHgxNiwgMHhDMywgMHg0MywKKwkweEZFLCAweEY2LCAweDAyLCAweDAzLCAweDFCLCAweEZGLCAweDExLCAweDAwLCAweDJCLCAweDAwLCAweERFLAorCTB4RkYsIDB4MDksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsIDB4RkYsIDB4OTAsIDB4MDEsCisJMHgyMCwgMHhGRCwgMHhCOCwgMHgwNCwgMHg2QSwgMHhGOCwgMHhDRCwgMHgwRSwgMHhFMSwgMHg0NiwgMHhFMSwKKwkweEZBLCAweEVCLCAweDAwLCAweDUxLCAweDAwLCAweDY1LCAweEZGLCAweDdGLCAweDAwLCAweEJFLCAweEZGLAorCTB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4NDksIDB4MDEsIDB4QkMsCisJMHhGRCwgMHg3QSwgMHgwMywgMHhGQSwgMHhGQSwgMHhGRCwgMHgwNywgMHg5QywgMHg0OCwgMHhDMywgMHhGRiwKKwkweDg5LCAweEZFLCAweEExLCAweDAxLCAweEIxLCAweEZFLCAweEQ2LCAweDAwLCAweDlDLCAweEZGLCAweDE4LAorCTB4MDAsIDB4MUMsIDB4MDAsIDB4OEYsIDB4RkYsIDB4RjcsIDB4MDAsIDB4NkIsIDB4RkUsIDB4MjUsIDB4MDIsCisJMHg5MSwgMHhGRCwgMHhFMywgMHgwMSwgMHhFNSwgMHg0OCwgMHg4RCwgMHgwNSwgMHhGQiwgMHhGQiwgMHhGOCwKKwkweDAyLCAweEZFLCAweEZELCAweDJCLCAweDAxLCAweDdBLCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLAorCTB4MTMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4QTAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4RDAsIDB4MDAsIDB4MDcsCisJMHgwMCwgMHhBNCwgMHhGQywgMHhCNiwgMHg0NywgMHgxQywgMHgwQywgMHg2MywgMHhGOSwgMHg0MiwgMHgwNCwKKwkweDU5LCAweEZELCAweDc2LCAweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDBCLAorCTB4MDAsIDB4RDIsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDAsIDB4RkYsIDB4OEUsIDB4RkYsIDB4M0YsIDB4MDIsCisJMHg1RSwgMHhGOCwgMHgxRSwgMHg0NSwgMHg0NCwgMHgxMywgMHhFQSwgMHhGNiwgMHg2NywgMHgwNSwgMHhDRiwKKwkweEZDLCAweEIzLCAweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDA1LCAweDAwLAorCTB4RjAsIDB4RkYsIDB4RkIsIDB4RkYsIDB4NzEsIDB4MDAsIDB4NzEsIDB4RkUsIDB4MUQsIDB4MDQsIDB4MUYsCisJMHhGNSwgMHgzMiwgMHg0MSwgMHhDRSwgMHgxQSwgMHhCQSwgMHhGNCwgMHg1MywgMHgwNiwgMHg2QSwgMHhGQywKKwkweERBLCAweDAxLCAweDM4LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBBLAorCTB4MDAsIDB4QjYsIDB4RkYsIDB4RkIsIDB4MDAsIDB4ODUsIDB4RkQsIDB4OTAsIDB4MDUsIDB4RUMsIDB4RjIsCisJMHgxQywgMHgzQywgMHg4MSwgMHgyMiwgMHhGQywgMHhGMiwgMHhFRiwgMHgwNiwgMHgzNiwgMHhGQywgMHhFNiwKKwkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLCAweDFFLCAweDAwLAorCTB4N0YsIDB4RkYsIDB4NjcsIDB4MDEsIDB4RDUsIDB4RkMsIDB4OEUsIDB4MDYsIDB4QkUsIDB4RjEsIDB4MDYsCisJMHgzNiwgMHgxQSwgMHgyQSwgMHhEQywgMHhGMSwgMHgyQSwgMHgwNywgMHgzQywgMHhGQywgMHhEMywgMHgwMSwKKwkweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU3LAorCTB4RkYsIDB4QjMsIDB4MDEsIDB4NjQsIDB4RkMsIDB4MTMsIDB4MDcsIDB4ODMsIDB4RjEsIDB4MkMsIDB4MkYsCisJMHg1QSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGNywgMHgwNiwgMHg4MCwgMHhGQywgMHg5RiwgMHgwMSwgMHg2MSwKKwkweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLAorCTB4REQsIDB4MDEsIDB4MzQsIDB4RkMsIDB4MjMsIDB4MDcsIDB4MjEsIDB4RjIsIDB4Q0IsIDB4MjcsIDB4RkUsCisJMHgzNywgMHgwMCwgMHhGMiwgMHg0RCwgMHgwNiwgMHgwNCwgMHhGRCwgMHg0OSwgMHgwMSwgMHg4RSwgMHhGRiwKKwkweDE5LCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LAorCTB4MDEsIDB4NDEsIDB4RkMsIDB4QzgsIDB4MDYsIDB4NzYsIDB4RjMsIDB4MjIsIDB4MjAsIDB4Q0EsIDB4M0QsCisJMHg3RCwgMHhGMywgMHgyQSwgMHgwNSwgMHhDOCwgMHhGRCwgMHhENCwgMHgwMCwgMHhDQSwgMHhGRiwgMHgwMywKKwkweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNCLCAweEZGLCAweEQxLCAweDAxLAorCTB4ODQsIDB4RkMsIDB4MTIsIDB4MDYsIDB4NUMsIDB4RjUsIDB4NzYsIDB4MTgsIDB4ODksIDB4NDIsIDB4MDIsCisJMHhGNiwgMHg5NCwgMHgwMywgMHhDNCwgMHhGRSwgMHg0MiwgMHgwMCwgMHgxMiwgMHgwMCwgMHhFOCwgMHhGRiwKKwkweDA3LCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRDLCAweEZGLCAweEEyLCAweDAxLCAweEY2LAorCTB4RkMsIDB4MTIsIDB4MDUsIDB4QTcsIDB4RjcsIDB4MDMsIDB4MTEsIDB4MTAsIDB4NDYsIDB4OTMsIDB4RjksCisJMHg5OCwgMHgwMSwgMHhFRSwgMHhGRiwgMHg5QiwgMHhGRiwgMHg2NCwgMHgwMCwgMHhDOCwgMHhGRiwgMHgwRSwKKwkweDAwLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY1LCAweEZGLCAweDYwLCAweDAxLCAweDhBLCAweEZELAorCTB4REYsIDB4MDMsIDB4MkUsIDB4RkEsIDB4MDQsIDB4MEEsIDB4M0EsIDB4NDgsIDB4MjgsIDB4RkUsIDB4NEIsCisJMHhGRiwgMHgzOCwgMHgwMSwgMHhFOSwgMHhGRSwgMHhCQiwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxNiwgMHgwMCwKKwkweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLCAweDhGLAorCTB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsIDB4RkMsCisJMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEY0LCAweEZGLCAweDFBLCAweDAwLCAweEZGLCAweDAwLCAweDA3LCAweDAzLCAweDE2LCAweDA2LAorCTB4N0MsIDB4MDksIDB4MkEsIDB4MEMsIDB4MkUsIDB4MEQsIDB4MkEsIDB4MEMsIDB4N0MsIDB4MDksIDB4MTYsCisJMHgwNiwgMHgwNywgMHgwMywgMHhGRiwgMHgwMCwgMHgxQSwgMHgwMCwgMHhGNCwgMHhGRiwgMHhGMiwgMHhGRiwKKwkweEEwLCAweEZGLCAweDcxLCAweEZGLCAweDcxLCAweDAwLCAweDg2LCAweDAzLCAweDczLCAweDA4LCAweDg4LAorCTB4MEQsIDB4NzgsIDB4MTAsIDB4QzksIDB4MEYsIDB4RDUsIDB4MEIsIDB4OEIsIDB4MDYsIDB4MjgsIDB4MDIsCisJMHhERiwgMHhGRiwgMHg2RiwgMHhGRiwgMHhDMywgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQywKKwkweEZGLCAweDgwLCAweEZGLCAweDlBLCAweEZGLCAweDQ2LCAweDAxLCAweDFFLCAweDA1LCAweDVBLCAweDBBLAorCTB4RUQsIDB4MEUsIDB4QUEsIDB4MTAsIDB4QUYsIDB4MEUsIDB4RkQsIDB4MDksIDB4Q0IsIDB4MDQsIDB4MTgsCisJMHgwMSwgMHg4RSwgMHhGRiwgMHg4NSwgMHhGRiwgMHhFMSwgMHhGRiwgMHhGQywgMHhGRiwgMHhCRCwgMHhGRiwKKwkweDZELCAweEZGLCAweEY2LCAweEZGLCAweDY1LCAweDAyLCAweEU1LCAweDA2LCAweDJCLCAweDBDLCAweEYzLAorCTB4MEYsIDB4NjAsIDB4MTAsIDB4M0IsIDB4MEQsIDB4MTYsIDB4MDgsIDB4M0YsIDB4MDMsIDB4NTAsIDB4MDAsCisJMHg2RSwgMHhGRiwgMHhBNywgMHhGRiwgMHhGNSwgMHhGRiwgMHhFRiwgMHhGRiwgMHg5QSwgMHhGRiwgMHg3NSwKKwkweEZGLCAweDkxLCAweDAwLCAweEM5LCAweDAzLCAweEM4LCAweDA4LCAweENDLCAweDBELCAweDg5LCAweDEwLAorCTB4OUYsIDB4MEYsIDB4ODUsIDB4MEIsIDB4M0IsIDB4MDYsIDB4RjQsIDB4MDEsIDB4Q0QsIDB4RkYsIDB4NzIsCisJMHhGRiwgMHhDOSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhENywgMHhGRiwgMHg3QiwgMHhGRiwKKwkweEE1LCAweEZGLCAweDczLCAweDAxLCAweDZBLCAweDA1LCAweEFELCAweDBBLCAweDIxLCAweDBGLCAweEE2LAorCTB4MTAsIDB4NzQsIDB4MEUsIDB4QTksIDB4MDksIDB4ODMsIDB4MDQsIDB4RjAsIDB4MDAsIDB4ODUsIDB4RkYsCisJMHg4QiwgMHhGRiwgMHhFNSwgMHhGRiwgMHhGQSwgMHhGRiwgMHhCNywgMHhGRiwgMHg2QywgMHhGRiwgMHgwQywKKwkweDAwLCAweDlELCAweDAyLCAweDM3LCAweDA3LCAweDc4LCAweDBDLCAweDE1LCAweDEwLCAweDQ3LCAweDEwLAorCTB4RjMsIDB4MEMsIDB4QzIsIDB4MDcsIDB4MDEsIDB4MDMsIDB4MzUsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUQsCisJMHhGRiwgMHhGNywgMHhGRiwgMHhFQiwgMHhGRiwgMHg5NCwgMHhGRiwgMHg3QSwgMHhGRiwgMHhCMywgMHgwMCwKKwkweDBELCAweDA0LCAweDFDLCAweDA5LCAweDBELCAweDBFLCAweDk3LCAweDEwLCAweDczLCAweDBGLCAweDM1LAorCTB4MEIsIDB4RUIsIDB4MDUsIDB4QzEsIDB4MDEsIDB4QkQsIDB4RkYsIDB4NzUsIDB4RkYsIDB4Q0UsIDB4RkYsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMiwgMHhGRiwgMHg3NywgMHhGRiwgMHhCMywgMHhGRiwgMHhBMSwKKwkweDAxLCAweEI3LCAweDA1LCAweEZGLCAweDBBLCAweDUzLCAweDBGLCAweDlFLCAweDEwLCAweDM3LCAweDBFLAorCTB4NTUsIDB4MDksIDB4M0IsIDB4MDQsIDB4Q0IsIDB4MDAsIDB4N0UsIDB4RkYsIDB4OTAsIDB4RkYsIDB4RTksCisJMHhGRiwgMHhGOCwgMHhGRiwgMHhCMSwgMHhGRiwgMHg2QywgMHhGRiwgMHgyNCwgMHgwMCwgMHhEOCwgMHgwMiwKKwkweDhBLCAweDA3LCAweEMyLCAweDBDLCAweDM0LCAweDEwLCAweDJBLCAweDEwLCAweEFBLCAweDBDLCAweDZGLAorCTB4MDcsIDB4QzQsIDB4MDIsIDB4MUMsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjMsIDB4RkYsIDB4RjksIDB4RkYsCisJMHhFOCwgMHhGRiwgMHg4RSwgMHhGRiwgMHg4MCwgMHhGRiwgMHhENywgMHgwMCwgMHg1MywgMHgwNCwgMHg3MSwKKwkweDA5LCAweDRDLCAweDBFLCAweEExLCAweDEwLCAweDQzLCAweDBGLCAweEUzLCAweDBBLCAweDlELCAweDA1LAorCTB4OTEsIDB4MDEsIDB4QUUsIDB4RkYsIDB4NzksIDB4RkYsIDB4RDQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHhDRCwgMHhGRiwgMHg3NCwgMHhGRiwgMHhDMiwgMHhGRiwgMHhEMiwgMHgwMSwgMHgwNiwgMHgwNiwKKwkweDUwLCAweDBCLCAweDgyLCAweDBGLCAweDkzLCAweDEwLCAweEY4LCAweDBELCAweDAwLCAweDA5LCAweEY2LAorCTB4MDMsIDB4QTcsIDB4MDAsIDB4NzgsIDB4RkYsIDB4OTYsIDB4RkYsIDB4RUMsIDB4RkYsIDB4RjYsIDB4RkYsCisJMHhBQiwgMHhGRiwgMHg2RCwgMHhGRiwgMHgzRSwgMHgwMCwgMHgxNSwgMHgwMywgMHhERSwgMHgwNywgMHgwQiwKKwkweDBELCAweDUwLCAweDEwLCAweDBBLCAweDEwLCAweDVFLCAweDBDLCAweDFDLCAweDA3LCAweDhBLCAweDAyLAorCTB4MDQsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjksIDB4RkYsIDB4RkIsIDB4RkYsIDB4RTQsIDB4RkYsIDB4ODksCisJMHhGRiwgMHg4OCwgMHhGRiwgMHhGRCwgMHgwMCwgMHg5QiwgMHgwNCwgMHhDNSwgMHgwOSwgMHg4OCwgMHgwRSwKKwkweEE4LCAweDEwLCAweDEwLCAweDBGLCAweDkxLCAweDBBLCAweDUwLCAweDA1LCAweDY0LCAweDAxLCAweEExLAorCTB4RkYsIDB4N0QsIDB4RkYsIDB4RDksIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzcsIDB4RkYsCisJMHg3MSwgMHhGRiwgMHhEMywgMHhGRiwgMHgwNSwgMHgwMiwgMHg1NSwgMHgwNiwgMHhBMCwgMHgwQiwgMHhBRCwKKwkweDBGLCAweDg0LCAweDEwLCAweEI2LCAweDBELCAweEFDLCAweDA4LCAweEIzLCAweDAzLCAweDg2LCAweDAwLAorCTB4NzQsIDB4RkYsIDB4OUMsIDB4RkYsIDB4RjAsIDB4RkYsIDB4RjQsIDB4RkYsIDB4QTUsIDB4RkYsIDB4NkYsCisJMHhGRiwgMHg1QSwgMHgwMCwgMHg1NCwgMHgwMywgMHgzMiwgMHgwOCwgMHg1MiwgMHgwRCwgMHg2OCwgMHgxMCwKKwkweEU2LCAweDBGLCAweDExLCAweDBDLCAweENBLCAweDA2LCAweDUyLCAweDAyLCAweEVGLCAweEZGLCAweDZFLAorCTB4RkYsIDB4QkYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4REYsIDB4RkYsIDB4ODQsIDB4RkYsIDB4OTEsIDB4RkYsCisJMHgyNSwgMHgwMSwgMHhFNCwgMHgwNCwgMHgxOSwgMHgwQSwgMHhDMiwgMHgwRSwgMHhBQSwgMHgxMCwgMHhEQSwKKwkweDBFLCAweDNFLCAweDBBLCAweDA1LCAweDA1LCAweDM4LCAweDAxLCAweDk2LCAweEZGLCAweDgxLCAweEZGLAorCTB4REQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4QzEsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RTYsCisJMHhGRiwgMHgzQSwgMHgwMiwgMHhBNiwgMHgwNiwgMHhFRiwgMHgwQiwgMHhENiwgMHgwRiwgMHg3MSwgMHgxMCwKKwkweDcxLCAweDBELCAweDU3LCAweDA4LCAweDcxLCAweDAzLCAweDY3LCAweDAwLCAweDcwLCAweEZGLCAweEEyLAorCTB4RkYsIDB4RjMsIDB4RkYsIDB4RjEsIDB4RkYsIDB4OUYsIDB4RkYsIDB4NzIsIDB4RkYsIDB4NzgsIDB4MDAsCisJMHg5NSwgMHgwMywgMHg4NiwgMHgwOCwgMHg5OCwgMHgwRCwgMHg3QywgMHgxMCwgMHhDMCwgMHgwRiwgMHhDMywKKwkweDBCLCAweDc5LCAweDA2LCAweDFDLCAweDAyLCAweERCLCAweEZGLCAweDcwLCAweEZGLCAweEM1LCAweEZGLAorCTB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REIsIDB4RkYsIDB4N0YsIDB4RkYsIDB4OUMsIDB4RkYsIDB4NTAsCisJMHgwMSwgMHgyRiwgMHgwNSwgMHg2QywgMHgwQSwgMHhGOSwgMHgwRSwgMHhBOSwgMHgxMCwgMHhBMiwgMHgwRSwKKwkweEVBLCAweDA5LCAweEJCLCAweDA0LCAweDBGLCAweDAxLCAweDhDLCAweEZGLCAweDg3LCAweEZGLCAweEUyLAorCTB4RkYsIDB4RkMsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NkQsIDB4RkYsIDB4RkEsIDB4RkYsIDB4NzEsIDB4MDIsCisJMHhGNywgMHgwNiwgMHgzQywgMHgwQywgMHhGQiwgMHgwRiwgMHg1QiwgMHgxMCwgMHgyQiwgMHgwRCwgMHgwMywKKwkweDA4LCAweDMxLCAweDAzLCAweDRBLCAweDAwLCAweDZFLCAweEZGLCAweEE4LCAweEZGLCAweEY1LCAweEZGLAorCTB4RUUsIDB4RkYsIDB4OTksIDB4RkYsIDB4NzYsIDB4RkYsIDB4OTgsIDB4MDAsIDB4RDgsIDB4MDMsIDB4REIsCisJMHgwOCwgMHhEQiwgMHgwRCwgMHg4RCwgMHgxMCwgMHg5NiwgMHgwRiwgMHg3MywgMHgwQiwgMHgyOSwgMHgwNiwKKwkweEU4LCAweDAxLCAweEM5LCAweEZGLCAweDcyLCAweEZGLCAweENBLCAweEZGLCAweEZFLCAweEZGLCAweDAwLAorCTB4MDAsIDB4RDYsIDB4RkYsIDB4N0EsIDB4RkYsIDB4QTgsIDB4RkYsIDB4N0QsIDB4MDEsIDB4N0IsIDB4MDUsCisJMHhCRiwgMHgwQSwgMHgyRCwgMHgwRiwgMHhBNSwgMHgxMCwgMHg2NywgMHgwRSwgMHg5NiwgMHgwOSwgMHg3MywKKwkweDA0LCAweEU3LCAweDAwLCAweDg0LCAweEZGLCAweDhDLCAweEZGLCAweEU2LCAweEZGLCAweEZBLCAweEZGLAorCTB4QjYsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QUEsIDB4MDIsIDB4NEEsIDB4MDcsIDB4ODgsCisJMHgwQywgMHgxQywgMHgxMCwgMHg0MSwgMHgxMCwgMHhFMywgMHgwQywgMHhBRiwgMHgwNywgMHhGMywgMHgwMiwKKwkweDJGLCAweDAwLCAweDZDLCAweEZGLCAweEFFLCAweEZGLCAweEY3LCAweEZGLCAweEVBLCAweEZGLCAweDkzLAorCTB4RkYsIDB4N0IsIDB4RkYsIDB4QkIsIDB4MDAsIDB4MUMsIDB4MDQsIDB4MkYsIDB4MDksIDB4MUIsIDB4MEUsCisJMHg5QSwgMHgxMCwgMHg2OCwgMHgwRiwgMHgyMywgMHgwQiwgMHhEQSwgMHgwNSwgMHhCNywgMHgwMSwgMHhCOSwKKwkweEZGLCAweDc2LCAweEZGLCAweEQwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQxLCAweEZGLAorCTB4NzYsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QUMsIDB4MDEsIDB4QzgsIDB4MDUsIDB4MTEsIDB4MEIsIDB4NUUsCisJMHgwRiwgMHg5QywgMHgxMCwgMHgyOSwgMHgwRSwgMHg0MiwgMHgwOSwgMHgyQywgMHgwNCwgMHhDMiwgMHgwMCwKKwkweDdELCAweEZGLCAweDkyLCAweEZGLCAweEVBLCAweEZGLCAweEY4LCAweEZGLCAweEIwLCAweEZGLCAweDZDLAorCTB4RkYsIDB4MjksIDB4MDAsIDB4RTYsIDB4MDIsIDB4OUQsIDB4MDcsIDB4RDMsIDB4MEMsIDB4M0IsIDB4MTAsCisJMHgyMywgMHgxMCwgMHg5OSwgMHgwQywgMHg1QywgMHgwNywgMHhCNywgMHgwMiwgMHgxNiwgMHgwMCwgMHg2QywKKwkweEZGLCAweEI0LCAweEZGLCAweEY5LCAweEZGLCAweEU3LCAweEZGLCAweDhELCAweEZGLCAweDgyLCAweEZGLAorCTB4REYsIDB4MDAsIDB4NjMsIDB4MDQsIDB4ODQsIDB4MDksIDB4NTksIDB4MEUsIDB4QTMsIDB4MTAsIDB4MzgsCisJMHgwRiwgMHhEMSwgMHgwQSwgMHg4QywgMHgwNSwgMHg4NywgMHgwMSwgMHhBQiwgMHhGRiwgMHg3OSwgMHhGRiwKKwkweEQ1LCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweENCLCAweEZGLCAweDczLCAweEZGLCAweEM2LAorCTB4RkYsIDB4REQsIDB4MDEsIDB4MTcsIDB4MDYsIDB4NjIsIDB4MEIsIDB4OEMsIDB4MEYsIDB4OTAsIDB4MTAsCisJMHhFOSwgMHgwRCwgMHhFRCwgMHgwOCwgMHhFNywgMHgwMywgMHhBMCwgMHgwMCwgMHg3NywgMHhGRiwgMHg5NywKKwkweEZGLCAweEVELCAweEZGLCAweEY2LCAweEZGLCAweEE5LCAweEZGLCAweDZELCAweEZGLCAweDQ0LCAweDAwLAorCTB4MjMsIDB4MDMsIDB4RjEsIDB4MDcsIDB4MUIsIDB4MEQsIDB4NTUsIDB4MTAsIDB4MDIsIDB4MTAsIDB4NEQsCisJMHgwQywgMHgwQSwgMHgwNywgMHg3RSwgMHgwMiwgMHhGRiwgMHhGRiwgMHg2RCwgMHhGRiwgMHhCQSwgMHhGRiwKKwkweEZCLCAweEZGLCAweEUzLCAweEZGLCAweDg4LCAweEZGLCAweDhBLCAweEZGLCAweDA2LCAweDAxLCAweEFCLAorCTB4MDQsIDB4RDgsIDB4MDksIDB4OTUsIDB4MEUsIDB4QTksIDB4MTAsIDB4MDUsIDB4MEYsIDB4N0YsIDB4MEEsCisJMHg0MCwgMHgwNSwgMHg1QSwgMHgwMSwgMHg5RiwgMHhGRiwgMHg3RSwgMHhGRiwgMHhEQSwgMHhGRiwgMHgwMCwKKwkweDAwLCAweEZFLCAweEZGLCAweEM2LCAweEZGLCAweDcwLCAweEZGLCAweEQ3LCAweEZGLCAweDEwLCAweDAyLAorCTB4NjcsIDB4MDYsIDB4QjEsIDB4MEIsIDB4QjcsIDB4MEYsIDB4ODAsIDB4MTAsIDB4QTcsIDB4MEQsIDB4OTksCisJMHgwOCwgMHhBNCwgMHgwMywgMHg3RiwgMHgwMCwgMHg3MywgMHhGRiwgMHg5RCwgMHhGRiwgMHhGMCwgMHhGRiwKKwkweEYzLCAweEZGLCAweEEzLCAweEZGLCAweDcwLCAweEZGLCAweDYwLCAweDAwLCAweDYyLCAweDAzLCAweDQ1LAorCTB4MDgsIDB4NjIsIDB4MEQsIDB4NkMsIDB4MTAsIDB4REUsIDB4MEYsIDB4MDAsIDB4MEMsIDB4QjgsIDB4MDYsCisJMHg0NiwgMHgwMiwgMHhFQSwgMHhGRiwgMHg2RSwgMHhGRiwgMHhDMCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwKKwkweDAwLCAweERFLCAweEZGLCAweDgzLCAweEZGLCAweDk0LCAweEZGLCAweDJGLCAweDAxLCAweEY0LCAweDA0LAorCTB4MkIsIDB4MEEsIDB4Q0UsIDB4MEUsIDB4QUEsIDB4MTAsIDB4Q0UsIDB4MEUsIDB4MkIsIDB4MEEsIDB4RjQsCisJMHgwNCwgMHgyRiwgMHgwMSwgMHg5NCwgMHhGRiwgMHg4MywgMHhGRiwgMHhERSwgMHhGRiwgMHhGRCwgMHhGRiwKKwkweEMwLCAweEZGLCAweDZFLCAweEZGLCAweEVBLCAweEZGLCAweDQ2LCAweDAyLCAweEI4LCAweDA2LCAweDAwLAorCTB4MEMsIDB4REUsIDB4MEYsIDB4NkMsIDB4MTAsIDB4NjIsIDB4MEQsIDB4NDUsIDB4MDgsIDB4NjIsIDB4MDMsCisJMHg2MCwgMHgwMCwgMHg3MCwgMHhGRiwgMHhBMywgMHhGRiwgMHhGMywgMHhGRiwgMHhGMCwgMHhGRiwgMHg5RCwKKwkweEZGLCAweDczLCAweEZGLCAweDdGLCAweDAwLCAweEE0LCAweDAzLCAweDk5LCAweDA4LCAweEE3LCAweDBELAorCTB4ODAsIDB4MTAsIDB4QjcsIDB4MEYsIDB4QjEsIDB4MEIsIDB4NjcsIDB4MDYsIDB4MTAsIDB4MDIsIDB4RDcsCisJMHhGRiwgMHg3MCwgMHhGRiwgMHhDNiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQSwgMHhGRiwKKwkweDdFLCAweEZGLCAweDlGLCAweEZGLCAweDVBLCAweDAxLCAweDQwLCAweDA1LCAweDdGLCAweDBBLCAweDA1LAorCTB4MEYsIDB4QTksIDB4MTAsIDB4OTUsIDB4MEUsIDB4RDgsIDB4MDksIDB4QUIsIDB4MDQsIDB4MDYsIDB4MDEsCisJMHg4QSwgMHhGRiwgMHg4OCwgMHhGRiwgMHhFMywgMHhGRiwgMHhGQiwgMHhGRiwgMHhCQSwgMHhGRiwgMHg2RCwKKwkweEZGLCAweEZGLCAweEZGLCAweDdFLCAweDAyLCAweDBBLCAweDA3LCAweDRELCAweDBDLCAweDAyLCAweDEwLAorCTB4NTUsIDB4MTAsIDB4MUIsIDB4MEQsIDB4RjEsIDB4MDcsIDB4MjMsIDB4MDMsIDB4NDQsIDB4MDAsIDB4NkQsCisJMHhGRiwgMHhBOSwgMHhGRiwgMHhGNiwgMHhGRiwgMHhFRCwgMHhGRiwgMHg5NywgMHhGRiwgMHg3NywgMHhGRiwKKwkweEEwLCAweDAwLCAweEU3LCAweDAzLCAweEVELCAweDA4LCAweEU5LCAweDBELCAweDkwLCAweDEwLCAweDhDLAorCTB4MEYsIDB4NjIsIDB4MEIsIDB4MTcsIDB4MDYsIDB4REQsIDB4MDEsIDB4QzYsIDB4RkYsIDB4NzMsIDB4RkYsCisJMHhDQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhENSwgMHhGRiwgMHg3OSwgMHhGRiwgMHhBQiwKKwkweEZGLCAweDg3LCAweDAxLCAweDhDLCAweDA1LCAweEQxLCAweDBBLCAweDM4LCAweDBGLCAweEEzLCAweDEwLAorCTB4NTksIDB4MEUsIDB4ODQsIDB4MDksIDB4NjMsIDB4MDQsIDB4REYsIDB4MDAsIDB4ODIsIDB4RkYsIDB4OEQsCisJMHhGRiwgMHhFNywgMHhGRiwgMHhGOSwgMHhGRiwgMHhCNCwgMHhGRiwgMHg2QywgMHhGRiwgMHgxNiwgMHgwMCwKKwkweEI3LCAweDAyLCAweDVDLCAweDA3LCAweDk5LCAweDBDLCAweDIzLCAweDEwLCAweDNCLCAweDEwLCAweEQzLAorCTB4MEMsIDB4OUQsIDB4MDcsIDB4RTYsIDB4MDIsIDB4MjksIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjAsIDB4RkYsCisJMHhGOCwgMHhGRiwgMHhFQSwgMHhGRiwgMHg5MiwgMHhGRiwgMHg3RCwgMHhGRiwgMHhDMiwgMHgwMCwgMHgyQywKKwkweDA0LCAweDQyLCAweDA5LCAweDI5LCAweDBFLCAweDlDLCAweDEwLCAweDVFLCAweDBGLCAweDExLCAweDBCLAorCTB4QzgsIDB4MDUsIDB4QUMsIDB4MDEsIDB4QjYsIDB4RkYsIDB4NzYsIDB4RkYsIDB4RDEsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhEMCwgMHhGRiwgMHg3NiwgMHhGRiwgMHhCOSwgMHhGRiwgMHhCNywgMHgwMSwKKwkweERBLCAweDA1LCAweDIzLCAweDBCLCAweDY4LCAweDBGLCAweDlBLCAweDEwLCAweDFCLCAweDBFLCAweDJGLAorCTB4MDksIDB4MUMsIDB4MDQsIDB4QkIsIDB4MDAsIDB4N0IsIDB4RkYsIDB4OTMsIDB4RkYsIDB4RUEsIDB4RkYsCisJMHhGNywgMHhGRiwgMHhBRSwgMHhGRiwgMHg2QywgMHhGRiwgMHgyRiwgMHgwMCwgMHhGMywgMHgwMiwgMHhBRiwKKwkweDA3LCAweEUzLCAweDBDLCAweDQxLCAweDEwLCAweDFDLCAweDEwLCAweDg4LCAweDBDLCAweDRBLCAweDA3LAorCTB4QUEsIDB4MDIsIDB4MTEsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RTYsCisJMHhGRiwgMHg4QywgMHhGRiwgMHg4NCwgMHhGRiwgMHhFNywgMHgwMCwgMHg3MywgMHgwNCwgMHg5NiwgMHgwOSwKKwkweDY3LCAweDBFLCAweEE1LCAweDEwLCAweDJELCAweDBGLCAweEJGLCAweDBBLCAweDdCLCAweDA1LCAweDdELAorCTB4MDEsIDB4QTgsIDB4RkYsIDB4N0EsIDB4RkYsIDB4RDYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHhDQSwgMHhGRiwgMHg3MiwgMHhGRiwgMHhDOSwgMHhGRiwgMHhFOCwgMHgwMSwgMHgyOSwgMHgwNiwgMHg3MywKKwkweDBCLCAweDk2LCAweDBGLCAweDhELCAweDEwLCAweERCLCAweDBELCAweERCLCAweDA4LCAweEQ4LCAweDAzLAorCTB4OTgsIDB4MDAsIDB4NzYsIDB4RkYsIDB4OTksIDB4RkYsIDB4RUUsIDB4RkYsIDB4RjUsIDB4RkYsIDB4QTgsCisJMHhGRiwgMHg2RSwgMHhGRiwgMHg0QSwgMHgwMCwgMHgzMSwgMHgwMywgMHgwMywgMHgwOCwgMHgyQiwgMHgwRCwKKwkweDVCLCAweDEwLCAweEZCLCAweDBGLCAweDNDLCAweDBDLCAweEY3LCAweDA2LCAweDcxLCAweDAyLCAweEZBLAorCTB4RkYsIDB4NkQsIDB4RkYsIDB4QkMsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RTIsIDB4RkYsIDB4ODcsIDB4RkYsCisJMHg4QywgMHhGRiwgMHgwRiwgMHgwMSwgMHhCQiwgMHgwNCwgMHhFQSwgMHgwOSwgMHhBMiwgMHgwRSwgMHhBOSwKKwkweDEwLCAweEY5LCAweDBFLCAweDZDLCAweDBBLCAweDJGLCAweDA1LCAweDUwLCAweDAxLCAweDlDLCAweEZGLAorCTB4N0YsIDB4RkYsIDB4REIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzUsIDB4RkYsIDB4NzAsCisJMHhGRiwgMHhEQiwgMHhGRiwgMHgxQywgMHgwMiwgMHg3OSwgMHgwNiwgMHhDMywgMHgwQiwgMHhDMCwgMHgwRiwKKwkweDdDLCAweDEwLCAweDk4LCAweDBELCAweDg2LCAweDA4LCAweDk1LCAweDAzLCAweDc4LCAweDAwLCAweDcyLAorCTB4RkYsIDB4OUYsIDB4RkYsIDB4RjEsIDB4RkYsIDB4RjMsIDB4RkYsIDB4QTIsIDB4RkYsIDB4NzAsIDB4RkYsCisJMHg2NywgMHgwMCwgMHg3MSwgMHgwMywgMHg1NywgMHgwOCwgMHg3MSwgMHgwRCwgMHg3MSwgMHgxMCwgMHhENiwKKwkweDBGLCAweEVGLCAweDBCLCAweEE2LCAweDA2LCAweDNBLCAweDAyLCAweEU2LCAweEZGLCAweDZFLCAweEZGLAorCTB4QzEsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REQsIDB4RkYsIDB4ODEsIDB4RkYsIDB4OTYsCisJMHhGRiwgMHgzOCwgMHgwMSwgMHgwNSwgMHgwNSwgMHgzRSwgMHgwQSwgMHhEQSwgMHgwRSwgMHhBQSwgMHgxMCwKKwkweEMyLCAweDBFLCAweDE5LCAweDBBLCAweEU0LCAweDA0LCAweDI1LCAweDAxLCAweDkxLCAweEZGLCAweDg0LAorCTB4RkYsIDB4REYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4QkYsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RUYsIDB4RkYsCisJMHg1MiwgMHgwMiwgMHhDQSwgMHgwNiwgMHgxMSwgMHgwQywgMHhFNiwgMHgwRiwgMHg2OCwgMHgxMCwgMHg1MiwKKwkweDBELCAweDMyLCAweDA4LCAweDU0LCAweDAzLCAweDVBLCAweDAwLCAweDZGLCAweEZGLCAweEE1LCAweEZGLAorCTB4RjQsIDB4RkYsIDB4RjAsIDB4RkYsIDB4OUMsIDB4RkYsIDB4NzQsIDB4RkYsIDB4ODYsIDB4MDAsIDB4QjMsCisJMHgwMywgMHhBQywgMHgwOCwgMHhCNiwgMHgwRCwgMHg4NCwgMHgxMCwgMHhBRCwgMHgwRiwgMHhBMCwgMHgwQiwKKwkweDU1LCAweDA2LCAweDA1LCAweDAyLCAweEQzLCAweEZGLCAweDcxLCAweEZGLCAweEM3LCAweEZGLCAweEZFLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4RDksIDB4RkYsIDB4N0QsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NjQsIDB4MDEsCisJMHg1MCwgMHgwNSwgMHg5MSwgMHgwQSwgMHgxMCwgMHgwRiwgMHhBOCwgMHgxMCwgMHg4OCwgMHgwRSwgMHhDNSwKKwkweDA5LCAweDlCLCAweDA0LCAweEZELCAweDAwLCAweDg4LCAweEZGLCAweDg5LCAweEZGLCAweEU0LCAweEZGLAorCTB4RkIsIDB4RkYsIDB4QjksIDB4RkYsIDB4NkMsIDB4RkYsIDB4MDQsIDB4MDAsIDB4OEEsIDB4MDIsIDB4MUMsCisJMHgwNywgMHg1RSwgMHgwQywgMHgwQSwgMHgxMCwgMHg1MCwgMHgxMCwgMHgwQiwgMHgwRCwgMHhERSwgMHgwNywKKwkweDE1LCAweDAzLCAweDNFLCAweDAwLCAweDZELCAweEZGLCAweEFCLCAweEZGLCAweEY2LCAweEZGLCAweEVDLAorCTB4RkYsIDB4OTYsIDB4RkYsIDB4NzgsIDB4RkYsIDB4QTcsIDB4MDAsIDB4RjYsIDB4MDMsIDB4MDAsIDB4MDksCisJMHhGOCwgMHgwRCwgMHg5MywgMHgxMCwgMHg4MiwgMHgwRiwgMHg1MCwgMHgwQiwgMHgwNiwgMHgwNiwgMHhEMiwKKwkweDAxLCAweEMyLCAweEZGLCAweDc0LCAweEZGLCAweENELCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorCTB4RDQsIDB4RkYsIDB4NzksIDB4RkYsIDB4QUUsIDB4RkYsIDB4OTEsIDB4MDEsIDB4OUQsIDB4MDUsIDB4RTMsCisJMHgwQSwgMHg0MywgMHgwRiwgMHhBMSwgMHgxMCwgMHg0QywgMHgwRSwgMHg3MSwgMHgwOSwgMHg1MywgMHgwNCwKKwkweEQ3LCAweDAwLCAweDgwLCAweEZGLCAweDhFLCAweEZGLCAweEU4LCAweEZGLCAweEY5LCAweEZGLCAweEIzLAorCTB4RkYsIDB4NkMsIDB4RkYsIDB4MUMsIDB4MDAsIDB4QzQsIDB4MDIsIDB4NkYsIDB4MDcsIDB4QUEsIDB4MEMsCisJMHgyQSwgMHgxMCwgMHgzNCwgMHgxMCwgMHhDMiwgMHgwQywgMHg4QSwgMHgwNywgMHhEOCwgMHgwMiwgMHgyNCwKKwkweDAwLCAweDZDLCAweEZGLCAweEIxLCAweEZGLCAweEY4LCAweEZGLCAweEU5LCAweEZGLCAweDkwLCAweEZGLAorCTB4N0UsIDB4RkYsIDB4Q0IsIDB4MDAsIDB4M0IsIDB4MDQsIDB4NTUsIDB4MDksIDB4MzcsIDB4MEUsIDB4OUUsCisJMHgxMCwgMHg1MywgMHgwRiwgMHhGRiwgMHgwQSwgMHhCNywgMHgwNSwgMHhBMSwgMHgwMSwgMHhCMywgMHhGRiwKKwkweDc3LCAweEZGLCAweEQyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENFLCAweEZGLCAweDc1LAorCTB4RkYsIDB4QkQsIDB4RkYsIDB4QzEsIDB4MDEsIDB4RUIsIDB4MDUsIDB4MzUsIDB4MEIsIDB4NzMsIDB4MEYsCisJMHg5NywgMHgxMCwgMHgwRCwgMHgwRSwgMHgxQywgMHgwOSwgMHgwRCwgMHgwNCwgMHhCMywgMHgwMCwgMHg3QSwKKwkweEZGLCAweDk0LCAweEZGLCAweEVCLCAweEZGLCAweEY3LCAweEZGLCAweEFELCAweEZGLCAweDZELCAweEZGLAorCTB4MzUsIDB4MDAsIDB4MDEsIDB4MDMsIDB4QzIsIDB4MDcsIDB4RjMsIDB4MEMsIDB4NDcsIDB4MTAsIDB4MTUsCisJMHgxMCwgMHg3OCwgMHgwQywgMHgzNywgMHgwNywgMHg5RCwgMHgwMiwgMHgwQywgMHgwMCwgMHg2QywgMHhGRiwKKwkweEI3LCAweEZGLCAweEZBLCAweEZGLCAweEU1LCAweEZGLCAweDhCLCAweEZGLCAweDg1LCAweEZGLCAweEYwLAorCTB4MDAsIDB4ODMsIDB4MDQsIDB4QTksIDB4MDksIDB4NzQsIDB4MEUsIDB4QTYsIDB4MTAsIDB4MjEsIDB4MEYsCisJMHhBRCwgMHgwQSwgMHg2QSwgMHgwNSwgMHg3MywgMHgwMSwgMHhBNSwgMHhGRiwgMHg3QiwgMHhGRiwgMHhENywKKwkweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM5LCAweEZGLCAweDcyLCAweEZGLCAweENELCAweEZGLAorCTB4RjQsIDB4MDEsIDB4M0IsIDB4MDYsIDB4ODUsIDB4MEIsIDB4OUYsIDB4MEYsIDB4ODksIDB4MTAsIDB4Q0MsCisJMHgwRCwgMHhDOCwgMHgwOCwgMHhDOSwgMHgwMywgMHg5MSwgMHgwMCwgMHg3NSwgMHhGRiwgMHg5QSwgMHhGRiwKKwkweEVGLCAweEZGLCAweEY1LCAweEZGLCAweEE3LCAweEZGLCAweDZFLCAweEZGLCAweDUwLCAweDAwLCAweDNGLAorCTB4MDMsIDB4MTYsIDB4MDgsIDB4M0IsIDB4MEQsIDB4NjAsIDB4MTAsIDB4RjMsIDB4MEYsIDB4MkIsIDB4MEMsCisJMHhFNSwgMHgwNiwgMHg2NSwgMHgwMiwgMHhGNiwgMHhGRiwgMHg2RCwgMHhGRiwgMHhCRCwgMHhGRiwgMHhGQywKKwkweEZGLCAweEUxLCAweEZGLCAweDg1LCAweEZGLCAweDhFLCAweEZGLCAweDE4LCAweDAxLCAweENCLCAweDA0LAorCTB4RkQsIDB4MDksIDB4QUYsIDB4MEUsIDB4QUEsIDB4MTAsIDB4RUQsIDB4MEUsIDB4NUEsIDB4MEEsIDB4MUUsCisJMHgwNSwgMHg0NiwgMHgwMSwgMHg5QSwgMHhGRiwgMHg4MCwgMHhGRiwgMHhEQywgMHhGRiwgMHgwMCwgMHgwMCwKKwkweEZELCAweEZGLCAweEMzLCAweEZGLCAweDZGLCAweEZGLCAweERGLCAweEZGLCAweDI4LCAweDAyLCAweDhCLAorCTB4MDYsIDB4RDUsIDB4MEIsIDB4QzksIDB4MEYsIDB4NzgsIDB4MTAsIDB4ODgsIDB4MEQsIDB4NzMsIDB4MDgsCisJMHg4NiwgMHgwMywgMHg3MSwgMHgwMCwgMHg3MSwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGMiwgMHhGRiwgMHhGMiwKKwkweEZGLCAweEExLCAweEZGLCAweDcxLCAweEZGLCAweDZFLCAweDAwLCAweDdGLCAweDAzLCAweDZBLCAweDA4LAorCTB4ODEsIDB4MEQsIDB4NzYsIDB4MTAsIDB4Q0QsIDB4MEYsIDB4REQsIDB4MEIsIDB4OTQsIDB4MDYsIDB4MkUsCisJMHgwMiwgMHhFMSwgMHhGRiwgMHg2RiwgMHhGRiwgMHhDMywgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweERDLCAweEZGLCAweDgwLCAweEZGLCAweDk4LCAweEZGLCAweDQyLCAweDAxLCAweDE2LCAweDA1LCAweDUwLAorCTB4MEEsIDB4RTcsIDB4MEUsIDB4QUEsIDB4MTAsIDB4QjUsIDB4MEUsIDB4MDYsIDB4MEEsIDB4RDMsIDB4MDQsCisJMHgxQywgMHgwMSwgMHg4RiwgMHhGRiwgMHg4NSwgMHhGRiwgMHhFMCwgMHhGRiwgMHhGQywgMHhGRiwgMHhCRSwKKwkweEZGLCAweDZELCAweEZGLCAweEYzLCAweEZGLCAweDVFLCAweDAyLCAweERDLCAweDA2LCAweDIzLCAweDBDLAorCTB4RUYsIDB4MEYsIDB4NjMsIDB4MTAsIDB4NDMsIDB4MEQsIDB4MUYsIDB4MDgsIDB4NDYsIDB4MDMsIDB4NTMsCisJMHgwMCwgMHg2RSwgMHhGRiwgMHhBNiwgMHhGRiwgMHhGNCwgMHhGRiwgMHhFRiwgMHhGRiwgMHg5QiwgMHhGRiwKKwkweDc1LCAweEZGLCAweDhELCAweDAwLCAweEMxLCAweDAzLCAweEJFLCAweDA4LCAweEM0LCAweDBELCAweDg4LAorCTB4MTAsIDB4QTQsIDB4MEYsIDB4OEUsIDB4MEIsIDB4NDMsIDB4MDYsIDB4RjksIDB4MDEsIDB4Q0YsIDB4RkYsCisJMHg3MSwgMHhGRiwgMHhDOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEOCwgMHhGRiwgMHg3QywKKwkweEZGLCAweEE0LCAweEZGLCAweDZFLCAweDAxLCAweDYxLCAweDA1LCAweEEzLCAweDBBLCAweDFDLCAweDBGLAorCTB4QTcsIDB4MTAsIDB4N0IsIDB4MEUsIDB4QjIsIDB4MDksIDB4OEIsIDB4MDQsIDB4RjQsIDB4MDAsIDB4ODYsCisJMHhGRiwgMHg4QSwgMHhGRiwgMHhFNCwgMHhGRiwgMHhGQSwgMHhGRiwgMHhCOCwgMHhGRiwgMHg2QywgMHhGRiwKKwkweDA5LCAweDAwLCAweDk3LCAweDAyLCAweDJFLCAweDA3LCAweDZGLCAweDBDLCAweDExLCAweDEwLCAweDRBLAorCTB4MTAsIDB4RkIsIDB4MEMsIDB4Q0IsIDB4MDcsIDB4MDcsIDB4MDMsIDB4MzgsIDB4MDAsIDB4NkQsIDB4RkYsCisJMHhBQywgMHhGRiwgMHhGNywgMHhGRiwgMHhFQywgMHhGRiwgMHg5NSwgMHhGRiwgMHg3OSwgMHhGRiwgMHhBRiwKKwkweDAwLCAweDA1LCAweDA0LCAweDEzLCAweDA5LCAweDA2LCAweDBFLCAweDk2LCAweDEwLCAweDc4LCAweDBGLAorCTB4M0UsIDB4MEIsIDB4RjQsIDB4MDUsIDB4QzcsIDB4MDEsIDB4QkYsIDB4RkYsIDB4NzQsIDB4RkYsIDB4Q0UsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMiwgMHhGRiwgMHg3OCwgMHhGRiwgMHhCMSwgMHhGRiwKKwkweDlDLCAweDAxLCAweEFFLCAweDA1LCAweEY2LCAweDBBLCAweDRFLCAweDBGLCAweDlGLCAweDEwLCAweDNFLAorCTB4MEUsIDB4NUUsIDB4MDksIDB4NDMsIDB4MDQsIDB4Q0YsIDB4MDAsIDB4N0YsIDB4RkYsIDB4OTAsIDB4RkYsCisJMHhFOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHhCMiwgMHhGRiwgMHg2QywgMHhGRiwgMHgyMSwgMHgwMCwgMHhEMiwKKwkweDAyLCAweDgxLCAweDA3LCAweEJBLCAweDBDLCAweDMxLCAweDEwLCAweDJFLCAweDEwLCAweEIyLCAweDBDLAorCTB4NzgsIDB4MDcsIDB4Q0IsIDB4MDIsIDB4MUUsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjIsIDB4RkYsIDB4RjksCisJMHhGRiwgMHhFOCwgMHhGRiwgMHg4RiwgMHhGRiwgMHg4MCwgMHhGRiwgMHhEMywgMHgwMCwgMHg0QiwgMHgwNCwKKwkweDY3LCAweDA5LCAweDQ1LCAweDBFLCAweEEwLCAweDEwLCAweDQ4LCAweDBGLCAweEVDLCAweDBBLCAweEE2LAorCTB4MDUsIDB4OTcsIDB4MDEsIDB4QjAsIDB4RkYsIDB4NzgsIDB4RkYsIDB4RDMsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHhDRCwgMHhGRiwgMHg3NCwgMHhGRiwgMHhDMCwgMHhGRiwgMHhDQywgMHgwMSwgMHhGRCwKKwkweDA1LCAweDQ3LCAweDBCLCAweDdELCAweDBGLCAweDk0LCAweDEwLCAweEZGLCAweDBELCAweDBBLCAweDA5LAorCTB4RkUsIDB4MDMsIDB4QUIsIDB4MDAsIDB4NzksIDB4RkYsIDB4OTUsIDB4RkYsIDB4RUMsIDB4RkYsIDB4RjcsCisJMHhGRiwgMHhBQywgMHhGRiwgMHg2RCwgMHhGRiwgMHgzQiwgMHgwMCwgMHgwRSwgMHgwMywgMHhENSwgMHgwNywKKwkweDAzLCAweDBELCAweDRELCAweDEwLCAweDBFLCAweDEwLCAweDY3LCAweDBDLCAweDI1LCAweDA3LCAweDkxLAorCTB4MDIsIDB4MDcsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjgsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RTQsIDB4RkYsCisJMHg4OSwgMHhGRiwgMHg4NywgMHhGRiwgMHhGOSwgMHgwMCwgMHg5MywgMHgwNCwgMHhCQywgMHgwOSwgMHg4MiwKKwkweDBFLCAweEE3LCAweDEwLCAweDE2LCAweDBGLCAweDlBLCAweDBBLCAweDU5LCAweDA1LCAweDY5LCAweDAxLAorCTB4QTMsIDB4RkYsIDB4N0MsIDB4RkYsIDB4RDgsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzgsCisJMHhGRiwgMHg3MSwgMHhGRiwgMHhEMSwgMHhGRiwgMHhGRiwgMHgwMSwgMHg0QywgMHgwNiwgMHg5NywgMHgwQiwKKwkweEE5LCAweDBGLCAweDg2LCAweDEwLCAweEJELCAweDBELCAweEI1LCAweDA4LCAweEJBLCAweDAzLCAweDhBLAorCTB4MDAsIDB4NzQsIDB4RkYsIDB4OUIsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RjQsIDB4RkYsIDB4QTUsIDB4RkYsCisJMHg2RiwgMHhGRiwgMHg1NywgMHgwMCwgMHg0RCwgMHgwMywgMHgyOSwgMHgwOCwgMHg0QiwgMHgwRCwgMHg2NSwKKwkweDEwLCAweEVCLCAweDBGLCAweDFBLCAweDBDLCAweEQzLCAweDA2LCAweDU4LCAweDAyLCAweEYxLCAweEZGLAorCTB4NkQsIDB4RkYsIDB4QkUsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RTAsIDB4RkYsIDB4ODQsIDB4RkYsIDB4OTAsCisJMHhGRiwgMHgyMSwgMHgwMSwgMHhEQywgMHgwNCwgMHgxMCwgMHgwQSwgMHhCQiwgMHgwRSwgMHhBQSwgMHgxMCwKKwkweEUxLCAweDBFLCAweDQ3LCAweDBBLCAweDBELCAweDA1LCAweDNELCAweDAxLCAweDk3LCAweEZGLCAweDgxLAorCTB4RkYsIDB4REQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4QzIsIDB4RkYsIDB4NkYsIDB4RkYsCisJMHhFNCwgMHhGRiwgMHgzNCwgMHgwMiwgMHg5RCwgMHgwNiwgMHhFNiwgMHgwQiwgMHhEMSwgMHgwRiwgMHg3MywKKwkweDEwLCAweDc5LCAweDBELCAweDYxLCAweDA4LCAweDc4LCAweDAzLCAweDZBLCAweDAwLCAweDcwLCAweEZGLAorCTB4QTEsIDB4RkYsIDB4RjIsIDB4RkYsIDB4RjEsIDB4RkYsIDB4OUYsIDB4RkYsIDB4NzIsIDB4RkYsIDB4NzQsCisJMHgwMCwgMHg4RSwgMHgwMywgMHg3RCwgMHgwOCwgMHg5MCwgMHgwRCwgMHg3QSwgMHgxMCwgMHhDNCwgMHgwRiwKKwkweENDLCAweDBCLCAweDgyLCAweDA2LCAweDIyLCAweDAyLCAweERELCAweEZGLCAweDZGLCAweEZGLCAweEM0LAorCTB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REIsIDB4RkYsIDB4N0YsIDB4RkYsIDB4OUIsIDB4RkYsCisJMHg0QiwgMHgwMSwgMHgyNiwgMHgwNSwgMHg2MywgMHgwQSwgMHhGMywgMHgwRSwgMHhBQSwgMHgxMCwgMHhBOCwKKwkweDBFLCAweEY0LCAweDA5LCAweEMzLCAweDA0LCAweDEzLCAweDAxLCAweDhELCAweEZGLCAweDg2LCAweEZGLAorCTB4RTEsIDB4RkYsIDB4RkMsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NkQsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NkIsCisJMHgwMiwgMHhFRSwgMHgwNiwgMHgzNCwgMHgwQywgMHhGNywgMHgwRiwgMHg1RCwgMHgxMCwgMHgzMywgMHgwRCwKKwkweDBELCAweDA4LCAweDM4LCAweDAzLCAweDRELCAweDAwLCAweDZFLCAweEZGLCAweEE3LCAweEZGLCAweEY1LAorCTB4RkYsIDB4RUUsIDB4RkYsIDB4OTksIDB4RkYsIDB4NzYsIDB4RkYsIDB4OTQsIDB4MDAsIDB4RDAsIDB4MDMsCisJMHhEMSwgMHgwOCwgMHhEMywgMHgwRCwgMHg4QiwgMHgxMCwgMHg5QSwgMHgwRiwgMHg3QywgMHgwQiwgMHgzMiwKKwkweDA2LCAweEVFLCAweDAxLCAweENCLCAweEZGLCAweDcyLCAweEZGLCAweENBLCAweEZGLCAweEZFLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4RDYsIDB4RkYsIDB4N0IsIDB4RkYsIDB4QTcsIDB4RkYsIDB4NzgsIDB4MDEsIDB4NzIsCisJMHgwNSwgMHhCNiwgMHgwQSwgMHgyNywgMHgwRiwgMHhBNSwgMHgxMCwgMHg2RSwgMHgwRSwgMHhBMCwgMHgwOSwKKwkweDdCLCAweDA0LCAweEVDLCAweDAwLCAweDg1LCAweEZGLCAweDhCLCAweEZGLCAweEU1LCAweEZGLCAweEZBLAorCTB4RkYsIDB4QjYsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QTQsIDB4MDIsIDB4NDEsIDB4MDcsCisJMHg4MCwgMHgwQywgMHgxOSwgMHgxMCwgMHg0NCwgMHgxMCwgMHhFQiwgMHgwQywgMHhCOSwgMHgwNywgMHhGQSwKKwkweDAyLCAweDMyLCAweDAwLCAweDZELCAweEZGLCAweEFFLCAweEZGLCAweEY3LCAweEZGLCAweEVCLCAweEZGLAorCTB4OTMsIDB4RkYsIDB4N0IsIDB4RkYsIDB4QjcsIDB4MDAsIDB4MTUsIDB4MDQsIDB4MjYsIDB4MDksIDB4MTQsCisJMHgwRSwgMHg5OCwgMHgxMCwgMHg2RCwgMHgwRiwgMHgyQywgMHgwQiwgMHhFMywgMHgwNSwgMHhCQywgMHgwMSwKKwkweEJCLCAweEZGLCAweDc1LCAweEZGLCAweENGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQxLAorCTB4RkYsIDB4NzcsIDB4RkYsIDB4QjUsIDB4RkYsIDB4QTYsIDB4MDEsIDB4QzAsIDB4MDUsIDB4MDgsIDB4MEIsCisJMHg1OCwgMHgwRiwgMHg5RCwgMHgxMCwgMHgzMCwgMHgwRSwgMHg0QiwgMHgwOSwgMHgzNCwgMHgwNCwgMHhDNiwKKwkweDAwLCAweDdELCAweEZGLCAweDkxLCAweEZGLCAweEU5LCAweEZGLCAweEY4LCAweEZGLCAweEIwLCAweEZGLAorCTB4NkMsIDB4RkYsIDB4MjcsIDB4MDAsIDB4REYsIDB4MDIsIDB4OTQsIDB4MDcsIDB4Q0EsIDB4MEMsIDB4MzcsCisJMHgxMCwgMHgyNywgMHgxMCwgMHhBMSwgMHgwQywgMHg2NSwgMHgwNywgMHhCRSwgMHgwMiwgMHgxOSwgMHgwMCwKKwkweDZDLCAweEZGLCAweEI0LCAweEZGLCAweEY5LCAweEZGLCAweEU3LCAweEZGLCAweDhFLCAweEZGLCAweDgxLAorCTB4RkYsIDB4REIsIDB4MDAsIDB4NUIsIDB4MDQsIDB4N0EsIDB4MDksIDB4NTMsIDB4MEUsIDB4QTIsIDB4MTAsCisJMHgzRCwgMHgwRiwgMHhEQSwgMHgwQSwgMHg5NSwgMHgwNSwgMHg4QywgMHgwMSwgMHhBRCwgMHhGRiwgMHg3OSwKKwkweEZGLCAweEQ0LCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweENDLCAweEZGLCAweDczLCAweEZGLAorCTB4QzQsIDB4RkYsIDB4RDcsIDB4MDEsIDB4MEUsIDB4MDYsIDB4NTksIDB4MEIsIDB4ODcsIDB4MEYsIDB4OTEsCisJMHgxMCwgMHhGMCwgMHgwRCwgMHhGNywgMHgwOCwgMHhFRiwgMHgwMywgMHhBMywgMHgwMCwgMHg3OCwgMHhGRiwKKwkweDk3LCAweEZGLCAweEVELCAweEZGLCAweEY2LCAweEZGLCAweEFBLCAweEZGLCAweDZELCAweEZGLCAweDQxLAorCTB4MDAsIDB4MUMsIDB4MDMsIDB4RTcsIDB4MDcsIDB4MTMsIDB4MEQsIDB4NTIsIDB4MTAsIDB4MDYsIDB4MTAsCisJMHg1NiwgMHgwQywgMHgxMywgMHgwNywgMHg4NCwgMHgwMiwgMHgwMiwgMHgwMCwgMHg2RCwgMHhGRiwgMHhCQSwKKwkweEZGLCAweEZCLCAweEZGLCAweEUzLCAweEZGLCAweDg4LCAweEZGLCAweDg5LCAweEZGLCAweDAxLCAweDAxLAorCTB4QTMsIDB4MDQsIDB4Q0UsIDB4MDksIDB4OEYsIDB4MEUsIDB4QTgsIDB4MTAsIDB4MEEsIDB4MEYsIDB4ODgsCisJMHgwQSwgMHg0OCwgMHgwNSwgMHg1RiwgMHgwMSwgMHhBMCwgMHhGRiwgMHg3RCwgMHhGRiwgMHhEOSwgMHhGRiwKKwkweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEM3LCAweEZGLCAweDcwLCAweEZGLCAweEQ1LCAweEZGLCAweDBCLAorCTB4MDIsIDB4NUUsIDB4MDYsIDB4QTksIDB4MEIsIDB4QjIsIDB4MEYsIDB4ODIsIDB4MTAsIDB4QUUsIDB4MEQsCisJMHhBMiwgMHgwOCwgMHhBQiwgMHgwMywgMHg4MiwgMHgwMCwgMHg3MywgMHhGRiwgMHg5RCwgMHhGRiwgMHhGMCwKKwkweEZGLCAweEYzLCAweEZGLCAweEE0LCAweEZGLCAweDZGLCAweEZGLCAweDVELCAweDAwLCAweDVCLCAweDAzLAorCTB4M0IsIDB4MDgsIDB4NUEsIDB4MEQsIDB4NkEsIDB4MTAsIDB4RTIsIDB4MEYsIDB4MDksIDB4MEMsIDB4QzEsCisJMHgwNiwgMHg0QywgMHgwMiwgMHhFQywgMHhGRiwgMHg2RSwgMHhGRiwgMHhDMCwgMHhGRiwgMHhGQywgMHhGRiwKKwkweERGLCAweEZGLCAweDgzLCAweEZGLCAweDkzLCAweEZGLCAweDJBLCAweDAxLCAweEVDLCAweDA0LCAweDIyLAorCTB4MEEsIDB4QzgsIDB4MEUsIDB4QUIsIDB4MTAsIDB4RDQsIDB4MEUsIDB4MzUsIDB4MEEsIDB4RkQsIDB4MDQsCisJMHgzMywgMHgwMSwgMHg5NSwgMHhGRiwgMHg4MiwgMHhGRiwgMHhERSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweEMxLCAweEZGLCAweDZFLCAweEZGLCAweEU4LCAweEZGLCAweDQwLCAweDAyLCAweEFGLCAweDA2LAorCTB4RjcsIDB4MEIsIDB4REEsIDB4MEYsIDB4NkYsIDB4MTAsIDB4NkEsIDB4MEQsIDB4NEUsIDB4MDgsIDB4NkEsCisJMHgwMywgMHg2NCwgMHgwMCwgMHg3MCwgMHhGRiwgMHhBMywgMHhGRiwgMHhGMywgMHhGRiwgMHhGMSwgMHhGRiwKKwkweDlFLCAweEZGLCAweDcyLCAweEZGLCAweDdCLCAweDAwLCAweDlDLCAweDAzLCAweDkwLCAweDA4LCAweDlGLAorCTB4MEQsIDB4N0UsIDB4MTAsIDB4QkIsIDB4MEYsIDB4QkEsIDB4MEIsIDB4NzAsIDB4MDYsIDB4MTYsIDB4MDIsCisJMHhEOSwgMHhGRiwgMHg3MCwgMHhGRiwgMHhDNSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQSwKKwkweEZGLCAweDdFLCAweEZGLCAweDlELCAweEZGLCAweDU1LCAweDAxLCAweDM3LCAweDA1LCAweDc1LCAweDBBLAorCTB4RkYsIDB4MEUsIDB4QTksIDB4MTAsIDB4OUMsIDB4MEUsIDB4RTEsIDB4MDksIDB4QjMsIDB4MDQsIDB4MEEsCisJMHgwMSwgMHg4QiwgMHhGRiwgMHg4NywgMHhGRiwgMHhFMiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhCQiwgMHhGRiwKKwkweDZELCAweEZGLCAweEZELCAweEZGLCAweDc3LCAweDAyLCAweDAxLCAweDA3LCAweDQ1LCAweDBDLCAweEZGLAorCTB4MEYsIDB4NTgsIDB4MTAsIDB4MjMsIDB4MEQsIDB4RkEsIDB4MDcsIDB4MkEsIDB4MDMsIDB4NDcsIDB4MDAsCisJMHg2RSwgMHhGRiwgMHhBOSwgMHhGRiwgMHhGNSwgMHhGRiwgMHhFRCwgMHhGRiwgMHg5OCwgMHhGRiwgMHg3NywKKwkweEZGLCAweDlDLCAweDAwLCAweERGLCAweDAzLCAweEU0LCAweDA4LCAweEUyLCAweDBELCAweDhFLCAweDEwLAorCTB4OTEsIDB4MEYsIDB4NkIsIDB4MEIsIDB4MjAsIDB4MDYsIDB4RTMsIDB4MDEsIDB4QzgsIDB4RkYsIDB4NzMsCisJMHhGRiwgMHhDQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhENSwgMHhGRiwgMHg3QSwgMHhGRiwKKwkweEFBLCAweEZGLCAweDgyLCAweDAxLCAweDgzLCAweDA1LCAweEM4LCAweDBBLCAweDMyLCAweDBGLCAweEE0LAorCTB4MTAsIDB4NjAsIDB4MEUsIDB4OEQsIDB4MDksIDB4NkIsIDB4MDQsIDB4RTMsIDB4MDAsIDB4ODMsIDB4RkYsCisJMHg4RCwgMHhGRiwgMHhFNiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhCNSwgMHhGRiwgMHg2QywgMHhGRiwgMHgxNCwKKwkweDAwLCAweEIxLCAweDAyLCAweDUzLCAweDA3LCAweDkxLCAweDBDLCAweDIwLCAweDEwLCAweDNFLCAweDEwLAorCTB4REIsIDB4MEMsIDB4QTYsIDB4MDcsIDB4RUMsIDB4MDIsIDB4MkMsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QUYsCisJMHhGRiwgMHhGOCwgMHhGRiwgMHhFQSwgMHhGRiwgMHg5MiwgMHhGRiwgMHg3QywgMHhGRiwgMHhCRSwgMHgwMCwKKwkweDI0LCAweDA0LCAweDM4LCAweDA5LCAweDIyLCAweDBFLCAweDlCLCAweDEwLCAweDYzLCAweDBGLCAweDFBLAorCTB4MEIsIDB4RDEsIDB4MDUsIDB4QjEsIDB4MDEsIDB4QjgsIDB4RkYsIDB4NzYsIDB4RkYsIDB4RDAsIDB4RkYsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhEMCwgMHhGRiwgMHg3NiwgMHhGRiwgMHhCOCwgMHhGRiwgMHhCMSwKKwkweDAxLCAweEQxLCAweDA1LCAweDFBLCAweDBCLCAweDYzLCAweDBGLCAweDlCLCAweDEwLCAweDIyLCAweDBFLAorCTB4MzgsIDB4MDksIDB4MjQsIDB4MDQsIDB4QkUsIDB4MDAsIDB4N0MsIDB4RkYsIDB4OTIsIDB4RkYsIDB4RUEsCisJMHhGRiwgMHhGOCwgMHhGRiwgMHhBRiwgMHhGRiwgMHg2QywgMHhGRiwgMHgyQywgMHgwMCwgMHhFQywgMHgwMiwKKwkweEE2LCAweDA3LCAweERCLCAweDBDLCAweDNFLCAweDEwLCAweDIwLCAweDEwLCAweDkxLCAweDBDLCAweDUzLAorCTB4MDcsIDB4QjEsIDB4MDIsIDB4MTQsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjUsIDB4RkYsIDB4RkEsIDB4RkYsCisJMHhFNiwgMHhGRiwgMHg4RCwgMHhGRiwgMHg4MywgMHhGRiwgMHhFMywgMHgwMCwgMHg2QiwgMHgwNCwgMHg4RCwKKwkweDA5LCAweDYwLCAweDBFLCAweEE0LCAweDEwLCAweDMyLCAweDBGLCAweEM4LCAweDBBLCAweDgzLCAweDA1LAorCTB4ODIsIDB4MDEsIDB4QUEsIDB4RkYsIDB4N0EsIDB4RkYsIDB4RDUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHhDQiwgMHhGRiwgMHg3MywgMHhGRiwgMHhDOCwgMHhGRiwgMHhFMywgMHgwMSwgMHgyMCwgMHgwNiwKKwkweDZCLCAweDBCLCAweDkxLCAweDBGLCAweDhFLCAweDEwLCAweEUyLCAweDBELCAweEU0LCAweDA4LCAweERGLAorCTB4MDMsIDB4OUMsIDB4MDAsIDB4NzcsIDB4RkYsIDB4OTgsIDB4RkYsIDB4RUQsIDB4RkYsIDB4RjUsIDB4RkYsCisJMHhBOSwgMHhGRiwgMHg2RSwgMHhGRiwgMHg0NywgMHgwMCwgMHgyQSwgMHgwMywgMHhGQSwgMHgwNywgMHgyMywKKwkweDBELCAweDU4LCAweDEwLCAweEZGLCAweDBGLCAweDQ1LCAweDBDLCAweDAxLCAweDA3LCAweDc3LCAweDAyLAorCTB4RkQsIDB4RkYsIDB4NkQsIDB4RkYsIDB4QkIsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RTIsIDB4RkYsIDB4ODcsCisJMHhGRiwgMHg4QiwgMHhGRiwgMHgwQSwgMHgwMSwgMHhCMywgMHgwNCwgMHhFMSwgMHgwOSwgMHg5QywgMHgwRSwKKwkweEE5LCAweDEwLCAweEZGLCAweDBFLCAweDc1LCAweDBBLCAweDM3LCAweDA1LCAweDU1LCAweDAxLCAweDlELAorCTB4RkYsIDB4N0UsIDB4RkYsIDB4REEsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzUsIDB4RkYsCisJMHg3MCwgMHhGRiwgMHhEOSwgMHhGRiwgMHgxNiwgMHgwMiwgMHg3MCwgMHgwNiwgMHhCQSwgMHgwQiwgMHhCQiwKKwkweDBGLCAweDdFLCAweDEwLCAweDlGLCAweDBELCAweDkwLCAweDA4LCAweDlDLCAweDAzLCAweDdCLCAweDAwLAorCTB4NzIsIDB4RkYsIDB4OUUsIDB4RkYsIDB4RjEsIDB4RkYsIDB4RjMsIDB4RkYsIDB4QTMsIDB4RkYsIDB4NzAsCisJMHhGRiwgMHg2NCwgMHgwMCwgMHg2QSwgMHgwMywgMHg0RSwgMHgwOCwgMHg2QSwgMHgwRCwgMHg2RiwgMHgxMCwKKwkweERBLCAweDBGLCAweEY3LCAweDBCLCAweEFGLCAweDA2LCAweDQwLCAweDAyLCAweEU4LCAweEZGLCAweDZFLAorCTB4RkYsIDB4QzEsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4REUsIDB4RkYsIDB4ODIsIDB4RkYsCisJMHg5NSwgMHhGRiwgMHgzMywgMHgwMSwgMHhGRCwgMHgwNCwgMHgzNSwgMHgwQSwgMHhENCwgMHgwRSwgMHhBQiwKKwkweDEwLCAweEM4LCAweDBFLCAweDIyLCAweDBBLCAweEVDLCAweDA0LCAweDJBLCAweDAxLCAweDkzLCAweEZGLAorCTB4ODMsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkMsIDB4RkYsIDB4QzAsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RUMsCisJMHhGRiwgMHg0QywgMHgwMiwgMHhDMSwgMHgwNiwgMHgwOSwgMHgwQywgMHhFMiwgMHgwRiwgMHg2QSwgMHgxMCwKKwkweDVBLCAweDBELCAweDNCLCAweDA4LCAweDVCLCAweDAzLCAweDVELCAweDAwLCAweDZGLCAweEZGLCAweEE0LAorCTB4RkYsIDB4RjMsIDB4RkYsIDB4RjAsIDB4RkYsIDB4OUQsIDB4RkYsIDB4NzMsIDB4RkYsIDB4ODIsIDB4MDAsCisJMHhBQiwgMHgwMywgMHhBMiwgMHgwOCwgMHhBRSwgMHgwRCwgMHg4MiwgMHgxMCwgMHhCMiwgMHgwRiwgMHhBOSwKKwkweDBCLCAweDVFLCAweDA2LCAweDBCLCAweDAyLCAweEQ1LCAweEZGLCAweDcwLCAweEZGLCAweEM3LCAweEZGLAorCTB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RDksIDB4RkYsIDB4N0QsIDB4RkYsIDB4QTAsIDB4RkYsIDB4NUYsCisJMHgwMSwgMHg0OCwgMHgwNSwgMHg4OCwgMHgwQSwgMHgwQSwgMHgwRiwgMHhBOCwgMHgxMCwgMHg4RiwgMHgwRSwKKwkweENFLCAweDA5LCAweEEzLCAweDA0LCAweDAxLCAweDAxLCAweDg5LCAweEZGLCAweDg4LCAweEZGLCAweEUzLAorCTB4RkYsIDB4RkIsIDB4RkYsIDB4QkEsIDB4RkYsIDB4NkQsIDB4RkYsIDB4MDIsIDB4MDAsIDB4ODQsIDB4MDIsCisJMHgxMywgMHgwNywgMHg1NiwgMHgwQywgMHgwNiwgMHgxMCwgMHg1MiwgMHgxMCwgMHgxMywgMHgwRCwgMHhFNywKKwkweDA3LCAweDFDLCAweDAzLCAweDQxLCAweDAwLCAweDZELCAweEZGLCAweEFBLCAweEZGLCAweEY2LCAweEZGLAorCTB4RUQsIDB4RkYsIDB4OTcsIDB4RkYsIDB4NzgsIDB4RkYsIDB4QTMsIDB4MDAsIDB4RUYsIDB4MDMsIDB4RjcsCisJMHgwOCwgMHhGMCwgMHgwRCwgMHg5MSwgMHgxMCwgMHg4NywgMHgwRiwgMHg1OSwgMHgwQiwgMHgwRSwgMHgwNiwKKwkweEQ3LCAweDAxLCAweEM0LCAweEZGLCAweDczLCAweEZGLCAweENDLCAweEZGLCAweEZGLCAweEZGLCAweDAwLAorCTB4MDAsIDB4RDQsIDB4RkYsIDB4NzksIDB4RkYsIDB4QUQsIDB4RkYsIDB4OEMsIDB4MDEsIDB4OTUsIDB4MDUsCisJMHhEQSwgMHgwQSwgMHgzRCwgMHgwRiwgMHhBMiwgMHgxMCwgMHg1MywgMHgwRSwgMHg3QSwgMHgwOSwgMHg1QiwKKwkweDA0LCAweERCLCAweDAwLCAweDgxLCAweEZGLCAweDhFLCAweEZGLCAweEU3LCAweEZGLCAweEY5LCAweEZGLAorCTB4QjQsIDB4RkYsIDB4NkMsIDB4RkYsIDB4MTksIDB4MDAsIDB4QkUsIDB4MDIsIDB4NjUsIDB4MDcsIDB4QTEsCisJMHgwQywgMHgyNywgMHgxMCwgMHgzNywgMHgxMCwgMHhDQSwgMHgwQywgMHg5NCwgMHgwNywgMHhERiwgMHgwMiwKKwkweDI3LCAweDAwLCAweDZDLCAweEZGLCAweEIwLCAweEZGLCAweEY4LCAweEZGLCAweEU5LCAweEZGLCAweDkxLAorCTB4RkYsIDB4N0QsIDB4RkYsIDB4QzYsIDB4MDAsIDB4MzQsIDB4MDQsIDB4NEIsIDB4MDksIDB4MzAsIDB4MEUsCisJMHg5RCwgMHgxMCwgMHg1OCwgMHgwRiwgMHgwOCwgMHgwQiwgMHhDMCwgMHgwNSwgMHhBNiwgMHgwMSwgMHhCNSwKKwkweEZGLCAweDc3LCAweEZGLCAweEQxLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEZGLAorCTB4NzUsIDB4RkYsIDB4QkIsIDB4RkYsIDB4QkMsIDB4MDEsIDB4RTMsIDB4MDUsIDB4MkMsIDB4MEIsIDB4NkQsCisJMHgwRiwgMHg5OCwgMHgxMCwgMHgxNCwgMHgwRSwgMHgyNiwgMHgwOSwgMHgxNSwgMHgwNCwgMHhCNywgMHgwMCwKKwkweDdCLCAweEZGLCAweDkzLCAweEZGLCAweEVCLCAweEZGLCAweEY3LCAweEZGLCAweEFFLCAweEZGLCAweDZELAorCTB4RkYsIDB4MzIsIDB4MDAsIDB4RkEsIDB4MDIsIDB4QjksIDB4MDcsIDB4RUIsIDB4MEMsIDB4NDQsIDB4MTAsCisJMHgxOSwgMHgxMCwgMHg4MCwgMHgwQywgMHg0MSwgMHgwNywgMHhBNCwgMHgwMiwgMHgwRSwgMHgwMCwgMHg2QywKKwkweEZGLCAweEI2LCAweEZGLCAweEZBLCAweEZGLCAweEU1LCAweEZGLCAweDhCLCAweEZGLCAweDg1LCAweEZGLAorCTB4RUMsIDB4MDAsIDB4N0IsIDB4MDQsIDB4QTAsIDB4MDksIDB4NkUsIDB4MEUsIDB4QTUsIDB4MTAsIDB4MjcsCisJMHgwRiwgMHhCNiwgMHgwQSwgMHg3MiwgMHgwNSwgMHg3OCwgMHgwMSwgMHhBNywgMHhGRiwgMHg3QiwgMHhGRiwKKwkweEQ2LCAweEZGLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweENBLCAweEZGLCAweDcyLCAweEZGLCAweENCLAorCTB4RkYsIDB4RUUsIDB4MDEsIDB4MzIsIDB4MDYsIDB4N0MsIDB4MEIsIDB4OUEsIDB4MEYsIDB4OEIsIDB4MTAsCisJMHhEMywgMHgwRCwgMHhEMSwgMHgwOCwgMHhEMCwgMHgwMywgMHg5NCwgMHgwMCwgMHg3NiwgMHhGRiwgMHg5OSwKKwkweEZGLCAweEVFLCAweEZGLCAweEY1LCAweEZGLCAweEE3LCAweEZGLCAweDZFLCAweEZGLCAweDRELCAweDAwLAorCTB4MzgsIDB4MDMsIDB4MEQsIDB4MDgsIDB4MzMsIDB4MEQsIDB4NUQsIDB4MTAsIDB4RjcsIDB4MEYsIDB4MzQsCisJMHgwQywgMHhFRSwgMHgwNiwgMHg2QiwgMHgwMiwgMHhGOCwgMHhGRiwgMHg2RCwgMHhGRiwgMHhCQywgMHhGRiwKKwkweEZDLCAweEZGLCAweEUxLCAweEZGLCAweDg2LCAweEZGLCAweDhELCAweEZGLCAweDEzLCAweDAxLCAweEMzLAorCTB4MDQsIDB4RjQsIDB4MDksIDB4QTgsIDB4MEUsIDB4QUEsIDB4MTAsIDB4RjMsIDB4MEUsIDB4NjMsIDB4MEEsCisJMHgyNiwgMHgwNSwgMHg0QiwgMHgwMSwgMHg5QiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhEQiwgMHhGRiwgMHgwMCwKKwkweDAwLCAweEZELCAweEZGLCAweEM0LCAweEZGLCAweDZGLCAweEZGLCAweERELCAweEZGLCAweDIyLCAweDAyLAorCTB4ODIsIDB4MDYsIDB4Q0MsIDB4MEIsIDB4QzQsIDB4MEYsIDB4N0EsIDB4MTAsIDB4OTAsIDB4MEQsIDB4N0QsCisJMHgwOCwgMHg4RSwgMHgwMywgMHg3NCwgMHgwMCwgMHg3MiwgMHhGRiwgMHg5RiwgMHhGRiwgMHhGMSwgMHhGRiwKKwkweEYyLCAweEZGLCAweEExLCAweEZGLCAweDcwLCAweEZGLCAweDZBLCAweDAwLCAweDc4LCAweDAzLCAweDYxLAorCTB4MDgsIDB4NzksIDB4MEQsIDB4NzMsIDB4MTAsIDB4RDEsIDB4MEYsIDB4RTYsIDB4MEIsIDB4OUQsIDB4MDYsCisJMHgzNCwgMHgwMiwgMHhFNCwgMHhGRiwgMHg2RiwgMHhGRiwgMHhDMiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwKKwkweDAwLCAweERELCAweEZGLCAweDgxLCAweEZGLCAweDk3LCAweEZGLCAweDNELCAweDAxLCAweDBELCAweDA1LAorCTB4NDcsIDB4MEEsIDB4RTEsIDB4MEUsIDB4QUEsIDB4MTAsIDB4QkIsIDB4MEUsIDB4MTAsIDB4MEEsIDB4REMsCisJMHgwNCwgMHgyMSwgMHgwMSwgMHg5MCwgMHhGRiwgMHg4NCwgMHhGRiwgMHhFMCwgMHhGRiwgMHhGQywgMHhGRiwKKwkweEJFLCAweEZGLCAweDZELCAweEZGLCAweEYxLCAweEZGLCAweDU4LCAweDAyLCAweEQzLCAweDA2LCAweDFBLAorCTB4MEMsIDB4RUIsIDB4MEYsIDB4NjUsIDB4MTAsIDB4NEIsIDB4MEQsIDB4MjksIDB4MDgsIDB4NEQsIDB4MDMsCisJMHg1NywgMHgwMCwgMHg2RiwgMHhGRiwgMHhBNSwgMHhGRiwgMHhGNCwgMHhGRiwgMHhFRiwgMHhGRiwgMHg5QiwKKwkweEZGLCAweDc0LCAweEZGLCAweDhBLCAweDAwLCAweEJBLCAweDAzLCAweEI1LCAweDA4LCAweEJELCAweDBELAorCTB4ODYsIDB4MTAsIDB4QTksIDB4MEYsIDB4OTcsIDB4MEIsIDB4NEMsIDB4MDYsIDB4RkYsIDB4MDEsIDB4RDEsCisJMHhGRiwgMHg3MSwgMHhGRiwgMHhDOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEOCwgMHhGRiwKKwkweDdDLCAweEZGLCAweEEzLCAweEZGLCAweDY5LCAweDAxLCAweDU5LCAweDA1LCAweDlBLCAweDBBLCAweDE2LAorCTB4MEYsIDB4QTcsIDB4MTAsIDB4ODIsIDB4MEUsIDB4QkMsIDB4MDksIDB4OTMsIDB4MDQsIDB4RjksIDB4MDAsCisJMHg4NywgMHhGRiwgMHg4OSwgMHhGRiwgMHhFNCwgMHhGRiwgMHhGQiwgMHhGRiwgMHhCOCwgMHhGRiwgMHg2QywKKwkweEZGLCAweDA3LCAweDAwLCAweDkxLCAweDAyLCAweDI1LCAweDA3LCAweDY3LCAweDBDLCAweDBFLCAweDEwLAorCTB4NEQsIDB4MTAsIDB4MDMsIDB4MEQsIDB4RDUsIDB4MDcsIDB4MEUsIDB4MDMsIDB4M0IsIDB4MDAsIDB4NkQsCisJMHhGRiwgMHhBQywgMHhGRiwgMHhGNywgMHhGRiwgMHhFQywgMHhGRiwgMHg5NSwgMHhGRiwgMHg3OSwgMHhGRiwKKwkweEFCLCAweDAwLCAweEZFLCAweDAzLCAweDBBLCAweDA5LCAweEZGLCAweDBELCAweDk0LCAweDEwLCAweDdELAorCTB4MEYsIDB4NDcsIDB4MEIsIDB4RkQsIDB4MDUsIDB4Q0MsIDB4MDEsIDB4QzAsIDB4RkYsIDB4NzQsIDB4RkYsCisJMHhDRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEMywgMHhGRiwgMHg3OCwgMHhGRiwgMHhCMCwKKwkweEZGLCAweDk3LCAweDAxLCAweEE2LCAweDA1LCAweEVDLCAweDBBLCAweDQ4LCAweDBGLCAweEEwLCAweDEwLAorCTB4NDUsIDB4MEUsIDB4NjcsIDB4MDksIDB4NEIsIDB4MDQsIDB4RDMsIDB4MDAsIDB4ODAsIDB4RkYsIDB4OEYsCisJMHhGRiwgMHhFOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHhCMiwgMHhGRiwgMHg2QywgMHhGRiwgMHgxRSwgMHgwMCwKKwkweENCLCAweDAyLCAweDc4LCAweDA3LCAweEIyLCAweDBDLCAweDJFLCAweDEwLCAweDMxLCAweDEwLCAweEJBLAorCTB4MEMsIDB4ODEsIDB4MDcsIDB4RDIsIDB4MDIsIDB4MjEsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjIsIDB4RkYsCisJMHhGOSwgMHhGRiwgMHhFOCwgMHhGRiwgMHg5MCwgMHhGRiwgMHg3RiwgMHhGRiwgMHhDRiwgMHgwMCwgMHg0MywKKwkweDA0LCAweDVFLCAweDA5LCAweDNFLCAweDBFLCAweDlGLCAweDEwLCAweDRFLCAweDBGLCAweEY2LCAweDBBLAorCTB4QUUsIDB4MDUsIDB4OUMsIDB4MDEsIDB4QjEsIDB4RkYsIDB4NzgsIDB4RkYsIDB4RDIsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhDRSwgMHhGRiwgMHg3NCwgMHhGRiwgMHhCRiwgMHhGRiwgMHhDNywgMHgwMSwKKwkweEY0LCAweDA1LCAweDNFLCAweDBCLCAweDc4LCAweDBGLCAweDk2LCAweDEwLCAweDA2LCAweDBFLCAweDEzLAorCTB4MDksIDB4MDUsIDB4MDQsIDB4QUYsIDB4MDAsIDB4NzksIDB4RkYsIDB4OTUsIDB4RkYsIDB4RUMsIDB4RkYsCisJMHhGNywgMHhGRiwgMHhBQywgMHhGRiwgMHg2RCwgMHhGRiwgMHgzOCwgMHgwMCwgMHgwNywgMHgwMywgMHhDQiwKKwkweDA3LCAweEZCLCAweDBDLCAweDRBLCAweDEwLCAweDExLCAweDEwLCAweDZGLCAweDBDLCAweDJFLCAweDA3LAorCTB4OTcsIDB4MDIsIDB4MDksIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjgsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RTQsCisJMHhGRiwgMHg4QSwgMHhGRiwgMHg4NiwgMHhGRiwgMHhGNCwgMHgwMCwgMHg4QiwgMHgwNCwgMHhCMiwgMHgwOSwKKwkweDdCLCAweDBFLCAweEE3LCAweDEwLCAweDFDLCAweDBGLCAweEEzLCAweDBBLCAweDYxLCAweDA1LCAweDZFLAorCTB4MDEsIDB4QTQsIDB4RkYsIDB4N0MsIDB4RkYsIDB4RDgsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHhDOCwgMHhGRiwgMHg3MSwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGOSwgMHgwMSwgMHg0MywgMHgwNiwgMHg4RSwKKwkweDBCLCAweEE0LCAweDBGLCAweDg4LCAweDEwLCAweEM0LCAweDBELCAweEJFLCAweDA4LCAweEMxLCAweDAzLAorCTB4OEQsIDB4MDAsIDB4NzUsIDB4RkYsIDB4OUIsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RjQsIDB4RkYsIDB4QTYsCisJMHhGRiwgMHg2RSwgMHhGRiwgMHg1MywgMHgwMCwgMHg0NiwgMHgwMywgMHgxRiwgMHgwOCwgMHg0MywgMHgwRCwKKwkweDYzLCAweDEwLCAweEVGLCAweDBGLCAweDIzLCAweDBDLCAweERDLCAweDA2LCAweDVFLCAweDAyLCAweEYzLAorCTB4RkYsIDB4NkQsIDB4RkYsIDB4QkUsIDB4RkYsIDB4RkMsIDB4RkYsIDB4RTAsIDB4RkYsIDB4ODUsIDB4RkYsCisJMHg4RiwgMHhGRiwgMHgxQywgMHgwMSwgMHhEMywgMHgwNCwgMHgwNiwgMHgwQSwgMHhCNSwgMHgwRSwgMHhBQSwKKwkweDEwLCAweEU3LCAweDBFLCAweDUwLCAweDBBLCAweDE2LCAweDA1LCAweDQyLCAweDAxLCAweDk4LCAweEZGLAorCTB4ODAsIDB4RkYsIDB4REMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NkYsCisJMHhGRiwgMHhFMSwgMHhGRiwgMHgyRSwgMHgwMiwgMHg5NCwgMHgwNiwgMHhERCwgMHgwQiwgMHhDRCwgMHgwRiwKKwkweDc2LCAweDEwLCAweDgxLCAweDBELCAweDZBLCAweDA4LCAweDdGLCAweDAzLCAweDZFLCAweDAwLCAweDcxLAorCTB4RkYsIDB4QTEsIDB4RkYsIDB4RjIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTUsIDB4MDAsIDB4RDEsIDB4RkYsCisJMHg4QiwgMHhGRSwgMHhCQywgMHhGRCwgMHhFMSwgMHgwMCwgMHg4NCwgMHgwOSwgMHhCMCwgMHgxMywgMHg0NywKKwkweDE4LCAweEIwLCAweDEzLCAweDg0LCAweDA5LCAweEUxLCAweDAwLCAweEJDLCAweEZELCAweDhCLCAweEZFLAorCTB4RDEsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4REEsIDB4MDAsIDB4MzAsCisJMHgwMCwgMHg1RCwgMHhGQywgMHhCMywgMHhGQywgMHgzNSwgMHgwQSwgMHhDMiwgMHgxQywgMHgyNCwgMHgyMCwKKwkweDQ4LCAweDEwLCAweDVELCAweEZGLCAweDc0LCAweEZCLCAweDNBLCAweEZGLCAweEZCLCAweDAwLCAweDQyLAorCTB4MDAsIDB4RjgsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RjMsIDB4MDAsIDB4QUQsIDB4RkYsCisJMHhDNSwgMHhGQiwgMHgxMSwgMHhGRSwgMHhBRiwgMHgwRCwgMHhFRiwgMHgxRSwgMHg2OCwgMHgxRSwgMHhCQywKKwkweDBDLCAweEE3LCAweEZELCAweEVBLCAweEZCLCAweEQzLCAweEZGLCAweEVFLCAweDAwLCAweDI0LCAweDAwLAorCTB4RkEsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NEMsIDB4MDAsIDB4RkIsIDB4MDAsIDB4MEMsIDB4RkYsIDB4NUYsCisJMHhGQiwgMHhFOCwgMHhGRiwgMHgzRCwgMHgxMSwgMHg3RSwgMHgyMCwgMHgxMywgMHgxQywgMHg0QywgMHgwOSwKKwkweDZBLCAweEZDLCAweDhDLCAweEZDLCAweDRFLCAweDAwLCAweEQxLCAweDAwLCAweDBFLCAweDAwLCAweEZELAorCTB4RkYsIDB4RjcsIDB4RkYsIDB4NzIsIDB4MDAsIDB4RUMsIDB4MDAsIDB4NTUsIDB4RkUsIDB4M0QsIDB4RkIsCisJMHgzNywgMHgwMiwgMHhCRSwgMHgxNCwgMHg1RCwgMHgyMSwgMHg0MCwgMHgxOSwgMHgxOCwgMHgwNiwgMHhBMiwKKwkweEZCLCAweDQ3LCAweEZELCAweEE3LCAweDAwLCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkMsIDB4RkYsIDB4OUIsIDB4MDAsIDB4QzAsIDB4MDAsIDB4OTIsIDB4RkQsIDB4NzMsCisJMHhGQiwgMHhGMiwgMHgwNCwgMHgwRSwgMHgxOCwgMHg4MSwgMHgyMSwgMHgwQywgMHgxNiwgMHgzNywgMHgwMywKKwkweDQ3LCAweEZCLCAweDBCLCAweEZFLCAweERGLCAweDAwLCAweDgyLCAweDAwLCAweEY5LCAweEZGLCAweEZFLAorCTB4RkYsIDB4MDgsIDB4MDAsIDB4QzMsIDB4MDAsIDB4NzQsIDB4MDAsIDB4RDIsIDB4RkMsIDB4MTAsIDB4RkMsCisJMHgwOCwgMHgwOCwgMHgwQSwgMHgxQiwgMHhFOSwgMHgyMCwgMHg5QSwgMHgxMiwgMHhCRSwgMHgwMCwgMHg0OSwKKwkweEZCLCAweEM4LCAweEZFLCAweEY5LCAweDAwLCAweDVBLCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLAorCTB4MUIsIDB4MDAsIDB4RTQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MjQsIDB4RkMsIDB4MUUsIDB4RkQsIDB4NjUsCisJMHgwQiwgMHg5NCwgMHgxRCwgMHg5RCwgMHgxRiwgMHgwRCwgMHgwRiwgMHhCOCwgMHhGRSwgMHg5NiwgMHhGQiwKKwkweDcyLCAweEZGLCAweEY5LCAweDAwLCAweDM3LCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RjgsIDB4MDAsIDB4NzgsIDB4RkYsIDB4OUIsIDB4RkIsIDB4QTYsIDB4RkUsIDB4RTksIDB4MEUsCisJMHg4RCwgMHgxRiwgMHhBQSwgMHgxRCwgMHg4NywgMHgwQiwgMHgyQiwgMHhGRCwgMHgxRSwgMHhGQywgMHgwMiwKKwkweDAwLCAweEU1LCAweDAwLCAweDFDLCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDU4LCAweDAwLAorCTB4RjksIDB4MDAsIDB4Q0YsIDB4RkUsIDB4NEEsIDB4RkIsIDB4QTcsIDB4MDAsIDB4NzcsIDB4MTIsIDB4RTAsCisJMHgyMCwgMHgyNiwgMHgxQiwgMHgyOCwgMHgwOCwgMHgxOCwgMHhGQywgMHhDQiwgMHhGQywgMHg3MSwgMHgwMCwKKwkweEM1LCAweDAwLCAweDA4LCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDgwLCAweDAwLCAweEUxLAorCTB4MDAsIDB4MTMsIDB4RkUsIDB4NDUsIDB4RkIsIDB4MUQsIDB4MDMsIDB4RUIsIDB4MTUsIDB4N0YsIDB4MjEsCisJMHgyRCwgMHgxOCwgMHgwRSwgMHgwNSwgMHg3NywgMHhGQiwgMHg4QiwgMHhGRCwgMHhCRSwgMHgwMCwgMHg5RCwKKwkweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEE5LCAweDAwLAorCTB4QUEsIDB4MDAsIDB4NEYsIDB4RkQsIDB4OUQsIDB4RkIsIDB4RkEsIDB4MDUsIDB4MjIsIDB4MTksIDB4NjIsCisJMHgyMSwgMHhFMCwgMHgxNCwgMHg1MCwgMHgwMiwgMHgzRSwgMHhGQiwgMHg0RSwgMHhGRSwgMHhFQiwgMHgwMCwKKwkweDczLCAweDAwLCAweEY3LCAweEZGLCAweEZFLCAweEZGLCAweDBELCAweDAwLCAweEQwLCAweDAwLCAweDUyLAorCTB4MDAsIDB4OTMsIDB4RkMsIDB4NjAsIDB4RkMsIDB4MkMsIDB4MDksIDB4RkEsIDB4MUIsIDB4OEEsIDB4MjAsCisJMHg2MCwgMHgxMSwgMHhGRCwgMHhGRiwgMHg1QywgMHhGQiwgMHgwNiwgMHhGRiwgMHhGQiwgMHgwMCwgMHg0RCwKKwkweDAwLCAweEY3LCAweEZGLCAweEZBLCAweEZGLCAweDIzLCAweDAwLCAweEVELCAweDAwLCAweEQ5LCAweEZGLAorCTB4RUYsIDB4RkIsIDB4OTgsIDB4RkQsIDB4OTksIDB4MEMsIDB4NTQsIDB4MUUsIDB4MDIsIDB4MUYsIDB4RDIsCisJMHgwRCwgMHgyMCwgMHhGRSwgMHhDMCwgMHhGQiwgMHhBNywgMHhGRiwgMHhGNCwgMHgwMCwgMHgyRCwgMHgwMCwKKwkweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDQxLCAweDAwLCAweEZCLCAweDAwLCAweDQxLCAweEZGLCAweDc4LAorCTB4RkIsIDB4NEEsIDB4RkYsIDB4MjUsIDB4MTAsIDB4MTYsIDB4MjAsIDB4REEsIDB4MUMsIDB4NTYsIDB4MEEsCisJMHhCRSwgMHhGQywgMHg1NiwgMHhGQywgMHgyQywgMHgwMCwgMHhEQiwgMHgwMCwgMHgxNCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweEY3LCAweEZGLCAweDY2LCAweDAwLCAweEY0LCAweDAwLCAweDhGLCAweEZFLCAweDNGLCAweEZCLAorCTB4NzUsIDB4MDEsIDB4QUUsIDB4MTMsIDB4MkMsIDB4MjEsIDB4MkEsIDB4MUEsIDB4MEQsIDB4MDcsIDB4RDQsCisJMHhGQiwgMHgwQywgMHhGRCwgMHg4RiwgMHgwMCwgMHhCNywgMHgwMCwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweEZBLCAweEZGLCAweDhFLCAweDAwLCAweEQxLCAweDAwLCAweENGLCAweEZELCAweDU4LAorCTB4RkIsIDB4MTAsIDB4MDQsIDB4MTAsIDB4MTcsIDB4OEEsIDB4MjEsIDB4MTAsIDB4MTcsIDB4MTAsIDB4MDQsCisJMHg1OCwgMHhGQiwgMHhDRiwgMHhGRCwgMHhEMSwgMHgwMCwgMHg4RSwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGRiwKKwkweEZGLCAweDAzLCAweDAwLCAweEI3LCAweDAwLCAweDhGLCAweDAwLCAweDBDLCAweEZELCAweEQ0LCAweEZCLAorCTB4MEQsIDB4MDcsIDB4MkEsIDB4MUEsIDB4MkMsIDB4MjEsIDB4QUUsIDB4MTMsIDB4NzUsIDB4MDEsIDB4M0YsCisJMHhGQiwgMHg4RiwgMHhGRSwgMHhGNCwgMHgwMCwgMHg2NiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwKKwkweDE0LCAweDAwLCAweERCLCAweDAwLCAweDJDLCAweDAwLCAweDU2LCAweEZDLCAweEJFLCAweEZDLCAweDU2LAorCTB4MEEsIDB4REEsIDB4MUMsIDB4MTYsIDB4MjAsIDB4MjUsIDB4MTAsIDB4NEEsIDB4RkYsIDB4NzgsIDB4RkIsCisJMHg0MSwgMHhGRiwgMHhGQiwgMHgwMCwgMHg0MSwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgyRCwKKwkweDAwLCAweEY0LCAweDAwLCAweEE3LCAweEZGLCAweEMwLCAweEZCLCAweDIwLCAweEZFLCAweEQyLCAweDBELAorCTB4MDIsIDB4MUYsIDB4NTQsIDB4MUUsIDB4OTksIDB4MEMsIDB4OTgsIDB4RkQsIDB4RUYsIDB4RkIsIDB4RDksCisJMHhGRiwgMHhFRCwgMHgwMCwgMHgyMywgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0RCwgMHgwMCwKKwkweEZCLCAweDAwLCAweDA2LCAweEZGLCAweDVDLCAweEZCLCAweEZELCAweEZGLCAweDYwLCAweDExLCAweDhBLAorCTB4MjAsIDB4RkEsIDB4MUIsIDB4MkMsIDB4MDksIDB4NjAsIDB4RkMsIDB4OTMsIDB4RkMsIDB4NTIsIDB4MDAsCisJMHhEMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGNywgMHhGRiwgMHg3MywgMHgwMCwgMHhFQiwKKwkweDAwLCAweDRFLCAweEZFLCAweDNFLCAweEZCLCAweDUwLCAweDAyLCAweEUwLCAweDE0LCAweDYyLCAweDIxLAorCTB4MjIsIDB4MTksIDB4RkEsIDB4MDUsIDB4OUQsIDB4RkIsIDB4NEYsIDB4RkQsIDB4QUEsIDB4MDAsIDB4QTksCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHg5RCwgMHgwMCwKKwkweEJFLCAweDAwLCAweDhCLCAweEZELCAweDc3LCAweEZCLCAweDBFLCAweDA1LCAweDJELCAweDE4LCAweDdGLAorCTB4MjEsIDB4RUIsIDB4MTUsIDB4MUQsIDB4MDMsIDB4NDUsIDB4RkIsIDB4MTMsIDB4RkUsIDB4RTEsIDB4MDAsCisJMHg4MCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwOCwgMHgwMCwgMHhDNSwgMHgwMCwgMHg3MSwKKwkweDAwLCAweENCLCAweEZDLCAweDE4LCAweEZDLCAweDI4LCAweDA4LCAweDI2LCAweDFCLCAweEUwLCAweDIwLAorCTB4NzcsIDB4MTIsIDB4QTcsIDB4MDAsIDB4NEEsIDB4RkIsIDB4Q0YsIDB4RkUsIDB4RjksIDB4MDAsIDB4NTgsCisJMHgwMCwgMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgxQywgMHgwMCwgMHhFNSwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweDFFLCAweEZDLCAweDJCLCAweEZELCAweDg3LCAweDBCLCAweEFBLCAweDFELCAweDhELCAweDFGLCAweEU5LAorCTB4MEUsIDB4QTYsIDB4RkUsIDB4OUIsIDB4RkIsIDB4NzgsIDB4RkYsIDB4RjgsIDB4MDAsIDB4MzYsIDB4MDAsCisJMHhGOSwgMHhGRiwgMHhGOCwgMHhGRiwgMHgzNywgMHgwMCwgMHhGOSwgMHgwMCwgMHg3MiwgMHhGRiwgMHg5NiwKKwkweEZCLCAweEI4LCAweEZFLCAweDBELCAweDBGLCAweDlELCAweDFGLCAweDk0LCAweDFELCAweDY1LCAweDBCLAorCTB4MUUsIDB4RkQsIDB4MjQsIDB4RkMsIDB4MDYsIDB4MDAsIDB4RTQsIDB4MDAsIDB4MUIsIDB4MDAsIDB4RkMsCisJMHhGRiwgMHhGNywgMHhGRiwgMHg1QSwgMHgwMCwgMHhGOSwgMHgwMCwgMHhDOCwgMHhGRSwgMHg0OSwgMHhGQiwKKwkweEJFLCAweDAwLCAweDlBLCAweDEyLCAweEU5LCAweDIwLCAweDBBLCAweDFCLCAweDA4LCAweDA4LCAweDEwLAorCTB4RkMsIDB4RDIsIDB4RkMsIDB4NzQsIDB4MDAsIDB4QzMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHhGOSwgMHhGRiwgMHg4MiwgMHgwMCwgMHhERiwgMHgwMCwgMHgwQiwgMHhGRSwgMHg0NywgMHhGQiwgMHgzNywKKwkweDAzLCAweDBDLCAweDE2LCAweDgxLCAweDIxLCAweDBFLCAweDE4LCAweEYyLCAweDA0LCAweDczLCAweEZCLAorCTB4OTIsIDB4RkQsIDB4QzAsIDB4MDAsIDB4OUIsIDB4MDAsIDB4RkMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHgwMCwgMHhBNywgMHgwMCwgMHg0NywgMHhGRCwgMHhBMiwgMHhGQiwKKwkweDE4LCAweDA2LCAweDQwLCAweDE5LCAweDVELCAweDIxLCAweEJFLCAweDE0LCAweDM3LCAweDAyLCAweDNELAorCTB4RkIsIDB4NTUsIDB4RkUsIDB4RUMsIDB4MDAsIDB4NzIsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsCisJMHgwRSwgMHgwMCwgMHhEMSwgMHgwMCwgMHg0RSwgMHgwMCwgMHg4QywgMHhGQywgMHg2QSwgMHhGQywgMHg0QywKKwkweDA5LCAweDEzLCAweDFDLCAweDdFLCAweDIwLCAweDNELCAweDExLCAweEU4LCAweEZGLCAweDVGLCAweEZCLAorCTB4MEMsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NEMsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjQsCisJMHgwMCwgMHhFRSwgMHgwMCwgMHhEMywgMHhGRiwgMHhFQSwgMHhGQiwgMHhBNywgMHhGRCwgMHhCQywgMHgwQywKKwkweDY4LCAweDFFLCAweEVGLCAweDFFLCAweEFGLCAweDBELCAweDExLCAweEZFLCAweEM1LCAweEZCLCAweEFELAorCTB4RkYsIDB4RjMsIDB4MDAsIDB4MkMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NDIsIDB4MDAsCisJMHhGQiwgMHgwMCwgMHgzQSwgMHhGRiwgMHg3NCwgMHhGQiwgMHg1RCwgMHhGRiwgMHg0OCwgMHgxMCwgMHgyNCwKKwkweDIwLCAweEMyLCAweDFDLCAweDM1LCAweDBBLCAweEIzLCAweEZDLCAweDVELCAweEZDLCAweDMwLCAweDAwLAorCTB4REEsIDB4MDAsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NjcsIDB4MDAsIDB4RjMsCisJMHgwMCwgMHg4OCwgMHhGRSwgMHgzRSwgMHhGQiwgMHg4QywgMHgwMSwgMHhEMCwgMHgxMywgMHgzMywgMHgyMSwKKwkweDBELCAweDFBLCAweEVFLCAweDA2LCAweENELCAweEZCLCAweDEzLCAweEZELCAweDkyLCAweDAwLCAweEI2LAorCTB4MDAsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RkYsIDB4OTAsIDB4MDAsCisJMHhDRiwgMHgwMCwgMHhDNywgMHhGRCwgMHg1QiwgMHhGQiwgMHgyQiwgMHgwNCwgMHgzMSwgMHgxNywgMHg4QSwKKwkweDIxLCAweEYwLCAweDE2LCAweEY0LCAweDAzLCAweDU2LCAweEZCLCAweEQ2LCAweEZELCAweEQzLCAweDAwLAorCTB4OEQsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4QjksIDB4MDAsIDB4OEMsCisJMHgwMCwgMHgwNSwgMHhGRCwgMHhEQiwgMHhGQiwgMHgyQywgMHgwNywgMHg0NywgMHgxQSwgMHgyNSwgMHgyMSwKKwkweDhCLCAweDEzLCAweDVELCAweDAxLCAweDQwLCAweEZCLCAweDk3LCAweEZFLCAweEY1LCAweDAwLCAweDY0LAorCTB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MTUsIDB4MDAsIDB4REMsIDB4MDAsIDB4MjcsIDB4MDAsCisJMHg1MCwgMHhGQywgMHhDQSwgMHhGQywgMHg3OCwgMHgwQSwgMHhGMiwgMHgxQywgMHgwNywgMHgyMCwgMHgwMiwKKwkweDEwLCAweDM3LCAweEZGLCAweDdCLCAweEZCLCAweDQ3LCAweEZGLCAweEZCLCAweDAwLCAweDQwLCAweDAwLAorCTB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MkUsIDB4MDAsIDB4RjUsIDB4MDAsIDB4QTIsIDB4RkYsIDB4QkIsCisJMHhGQiwgMHgzMSwgMHhGRSwgMHhGNSwgMHgwRCwgMHgxNCwgMHgxRiwgMHgzRiwgMHgxRSwgMHg3NywgMHgwQywKKwkweDhBLCAweEZELCAweEY1LCAweEZCLCAweERFLCAweEZGLCAweEVDLCAweDAwLCAweDIyLCAweDAwLCAweEZCLAorCTB4RkYsIDB4RjcsIDB4RkYsIDB4NEUsIDB4MDAsIDB4RkIsIDB4MDAsIDB4RkYsIDB4RkUsIDB4NTksIDB4RkIsCisJMHgxMSwgMHgwMCwgMHg4MywgMHgxMSwgMHg5NiwgMHgyMCwgMHhFMCwgMHgxQiwgMHgwQiwgMHgwOSwgMHg1NiwKKwkweEZDLCAweDk5LCAweEZDLCAweDU2LCAweDAwLCAweENFLCAweDAwLCAweDBELCAweDAwLCAweEZFLCAweEZGLAorCTB4RjgsIDB4RkYsIDB4NzUsIDB4MDAsIDB4RUEsIDB4MDAsIDB4NDcsIDB4RkUsIDB4M0UsIDB4RkIsIDB4NjksCisJMHgwMiwgMHgwMiwgMHgxNSwgMHg2NiwgMHgyMSwgMHgwNCwgMHgxOSwgMHhEQywgMHgwNSwgMHg5OCwgMHhGQiwKKwkweDU2LCAweEZELCAweEFELCAweDAwLCAweEE4LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4OUUsIDB4MDAsIDB4QkMsIDB4MDAsIDB4ODMsIDB4RkQsIDB4N0IsIDB4RkIsCisJMHgyQiwgMHgwNSwgMHg0QywgMHgxOCwgMHg3QywgMHgyMSwgMHhDQSwgMHgxNSwgMHgwMywgMHgwMywgMHg0NCwKKwkweEZCLCAweDFBLCAweEZFLCAweEUyLCAweDAwLCAweDdFLCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLAorCTB4MDksIDB4MDAsIDB4QzYsIDB4MDAsIDB4NkQsIDB4MDAsIDB4QzMsIDB4RkMsIDB4MjAsIDB4RkMsIDB4NDksCisJMHgwOCwgMHg0MSwgMHgxQiwgMHhENiwgMHgyMCwgMHg1NCwgMHgxMiwgMHg5MiwgMHgwMCwgMHg0QywgMHhGQiwKKwkweEQ2LCAweEZFLCAweEZBLCAweDAwLCAweDU3LCAweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDFELAorCTB4MDAsIDB4RTYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTgsIDB4RkMsIDB4MzgsIDB4RkQsIDB4QTksIDB4MEIsCisJMHhDMCwgMHgxRCwgMHg3QywgMHgxRiwgMHhDNiwgMHgwRSwgMHg5NSwgMHhGRSwgMHg5RiwgMHhGQiwgMHg3RSwKKwkweEZGLCAweEY4LCAweDAwLCAweDM1LCAweDAwLCAweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDM4LCAweDAwLAorCTB4RjksIDB4MDAsIDB4NkMsIDB4RkYsIDB4OTIsIDB4RkIsIDB4QzksIDB4RkUsIDB4MkYsIDB4MEYsIDB4QUQsCisJMHgxRiwgMHg3RCwgMHgxRCwgMHg0MiwgMHgwQiwgMHgxMiwgMHhGRCwgMHgyQSwgMHhGQywgMHgwQiwgMHgwMCwKKwkweEUzLCAweDAwLCAweDFBLCAweDAwLCAweEZDLCAweEZGLCAweEY3LCAweEZGLCAweDVCLCAweDAwLCAweEY4LAorCTB4MDAsIDB4QzEsIDB4RkUsIDB4NDcsIDB4RkIsIDB4RDQsIDB4MDAsIDB4QkMsIDB4MTIsIDB4RjMsIDB4MjAsCisJMHhFRiwgMHgxQSwgMHhFOSwgMHgwNywgMHgwOCwgMHhGQywgMHhEOSwgMHhGQywgMHg3OCwgMHgwMCwgMHhDMiwKKwkweDAwLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweEY5LCAweEZGLCAweDgzLCAweDAwLCAweERELCAweDAwLAorCTB4MDQsIDB4RkUsIDB4NDksIDB4RkIsIDB4NTIsIDB4MDMsIDB4MkQsIDB4MTYsIDB4ODMsIDB4MjEsIDB4RUYsCisJMHgxNywgMHhENSwgMHgwNCwgMHg2RiwgMHhGQiwgMHg5QSwgMHhGRCwgMHhDMywgMHgwMCwgMHg5QSwgMHgwMCwKKwkweEZDLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEFELCAweDAwLCAweEE0LAorCTB4MDAsIDB4NDAsIDB4RkQsIDB4QTgsIDB4RkIsIDB4MzYsIDB4MDYsIDB4NUUsIDB4MTksIDB4NTgsIDB4MjEsCisJMHg5QywgMHgxNCwgMHgxRSwgMHgwMiwgMHgzRCwgMHhGQiwgMHg1RCwgMHhGRSwgMHhFRCwgMHgwMCwgMHg3MCwKKwkweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEQyLCAweDAwLCAweDRBLCAweDAwLAorCTB4ODUsIDB4RkMsIDB4NzQsIDB4RkMsIDB4NkQsIDB4MDksIDB4MkQsIDB4MUMsIDB4NzIsIDB4MjAsIDB4MUEsCisJMHgxMSwgMHhENCwgMHhGRiwgMHg2MSwgMHhGQiwgMHgxMywgMHhGRiwgMHhGQywgMHgwMCwgMHg0QSwgMHgwMCwKKwkweEY3LCAweEZGLCAweEZBLCAweEZGLCAweDI1LCAweDAwLCAweEVGLCAweDAwLCAweENFLCAweEZGLCAweEU0LAorCTB4RkIsIDB4QjUsIDB4RkQsIDB4REUsIDB4MEMsIDB4N0MsIDB4MUUsIDB4REQsIDB4MUUsIDB4OEMsIDB4MEQsCisJMHgwMSwgMHhGRSwgMHhDQSwgMHhGQiwgMHhCMywgMHhGRiwgMHhGMywgMHgwMCwgMHgyQiwgMHgwMCwgMHhGQSwKKwkweEZGLCAweEY4LCAweEZGLCAweDQ0LCAweDAwLCAweEZCLCAweDAwLCAweDM0LCAweEZGLCAweDcxLCAweEZCLAorCTB4NzEsIDB4RkYsIDB4NkIsIDB4MTAsIDB4MzIsIDB4MjAsIDB4QTksIDB4MUMsIDB4MTMsIDB4MEEsIDB4QTgsCisJMHhGQywgMHg2MywgMHhGQywgMHgzNSwgMHgwMCwgMHhEOSwgMHgwMCwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweEY3LCAweEZGLCAweDY5LCAweDAwLCAweEYyLCAweDAwLCAweDgxLCAweEZFLCAweDNFLCAweEZCLCAweEE0LAorCTB4MDEsIDB4RjIsIDB4MTMsIDB4M0EsIDB4MjEsIDB4RjAsIDB4MTksIDB4Q0YsIDB4MDYsIDB4QzcsIDB4RkIsCisJMHgxQiwgMHhGRCwgMHg5NiwgMHgwMCwgMHhCNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKKwkweDAwLCAweEZCLCAweEZGLCAweDkyLCAweDAwLCAweENELCAweDAwLCAweEMwLCAweEZELCAweDVFLCAweEZCLAorCTB4NDcsIDB4MDQsIDB4NTEsIDB4MTcsIDB4OEEsIDB4MjEsIDB4RDAsIDB4MTYsIDB4RDksIDB4MDMsIDB4NTMsCisJMHhGQiwgMHhERSwgMHhGRCwgMHhENSwgMHgwMCwgMHg4QiwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweDA0LCAweDAwLCAweEJBLCAweDAwLCAweDg5LCAweDAwLCAweEZELCAweEZDLCAweEUyLCAweEZCLCAweDRCLAorCTB4MDcsIDB4NjMsIDB4MUEsIDB4MUQsIDB4MjEsIDB4NjksIDB4MTMsIDB4NDYsIDB4MDEsIDB4NDEsIDB4RkIsCisJMHg5RSwgMHhGRSwgMHhGNSwgMHgwMCwgMHg2MywgMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxNiwKKwkweDAwLCAweERELCAweDAwLCAweDIzLCAweDAwLCAweDQ5LCAweEZDLCAweEQ1LCAweEZDLCAweDk5LCAweDBBLAorCTB4MDksIDB4MUQsIDB4RjksIDB4MUYsIDB4REYsIDB4MEYsIDB4MjQsIDB4RkYsIDB4N0YsIDB4RkIsIDB4NEQsCisJMHhGRiwgMHhGQiwgMHgwMCwgMHgzRiwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgyRiwgMHgwMCwKKwkweEY1LCAweDAwLCAweDlDLCAweEZGLCAweEI2LCAweEZCLCAweDQxLCAweEZFLCAweDE3LCAweDBFLCAweDI2LAorCTB4MUYsIDB4MkIsIDB4MUUsIDB4NTQsIDB4MEMsIDB4N0MsIDB4RkQsIDB4RkEsIDB4RkIsIDB4RTMsIDB4RkYsCisJMHhFQiwgMHgwMCwgMHgyMSwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywgMHhGRiwgMHg1MCwgMHgwMCwgMHhGQiwKKwkweDAwLCAweEY4LCAweEZFLCAweDU3LCAweEZCLCAweDI2LCAweDAwLCAweEE2LCAweDExLCAweEExLCAweDIwLAorCTB4QzYsIDB4MUIsIDB4RUEsIDB4MDgsIDB4NEQsIDB4RkMsIDB4QTAsIDB4RkMsIDB4NUEsIDB4MDAsIDB4Q0QsCisJMHgwMCwgMHgwQywgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3NywgMHgwMCwgMHhFOSwgMHgwMCwKKwkweDNGLCAweEZFLCAweDNGLCAweEZCLCAweDgyLCAweDAyLCAweDIzLCAweDE1LCAweDZCLCAweDIxLCAweEU1LAorCTB4MTgsIDB4QkUsIDB4MDUsIDB4OTMsIDB4RkIsIDB4NUUsIDB4RkQsIDB4QUYsIDB4MDAsIDB4QTYsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhBMCwgMHgwMCwgMHhCOSwKKwkweDAwLCAweDdDLCAweEZELCAweDgwLCAweEZCLCAweDQ4LCAweDA1LCAweDZCLCAweDE4LCAweDc5LCAweDIxLAorCTB4QTksIDB4MTUsIDB4RTksIDB4MDIsIDB4NDMsIDB4RkIsIDB4MjEsIDB4RkUsIDB4RTMsIDB4MDAsIDB4N0QsCisJMHgwMCwgMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwOSwgMHgwMCwgMHhDNywgMHgwMCwgMHg2OSwgMHgwMCwKKwkweEJDLCAweEZDLCAweDI5LCAweEZDLCAweDY5LCAweDA4LCAweDVDLCAweDFCLCAweENDLCAweDIwLCAweDMyLAorCTB4MTIsIDB4N0MsIDB4MDAsIDB4NEUsIDB4RkIsIDB4REQsIDB4RkUsIDB4RkEsIDB4MDAsIDB4NTYsIDB4MDAsCisJMHhGNywgMHhGRiwgMHhGQiwgMHhGRiwgMHgxRCwgMHgwMCwgMHhFNywgMHgwMCwgMHhGOCwgMHhGRiwgMHgxMiwKKwkweEZDLCAweDQ1LCAweEZELCAweENCLCAweDBCLCAweEQ2LCAweDFELCAweDZDLCAweDFGLCAweEEzLCAweDBFLAorCTB4ODQsIDB4RkUsIDB4QTQsIDB4RkIsIDB4ODQsIDB4RkYsIDB4RjcsIDB4MDAsIDB4MzQsIDB4MDAsIDB4RjksCisJMHhGRiwgMHhGOCwgMHhGRiwgMHgzQSwgMHgwMCwgMHhGQSwgMHgwMCwgMHg2NiwgMHhGRiwgMHg4RSwgMHhGQiwKKwkweERCLCAweEZFLCAweDUzLCAweDBGLCAweEJELCAweDFGLCAweDY2LCAweDFELCAweDIxLCAweDBCLCAweDA1LAorCTB4RkQsIDB4MzAsIDB4RkMsIDB4MTAsIDB4MDAsIDB4RTIsIDB4MDAsIDB4MTksIDB4MDAsIDB4RkMsIDB4RkYsCisJMHhGNywgMHhGRiwgMHg1RCwgMHgwMCwgMHhGOCwgMHgwMCwgMHhCQSwgMHhGRSwgMHg0NiwgMHhGQiwgMHhFQSwKKwkweDAwLCAweERGLCAweDEyLCAweEZDLCAweDIwLCAweEQzLCAweDFBLCAweEM5LCAweDA3LCAweDAwLCAweEZDLAorCTB4RTAsIDB4RkMsIDB4N0IsIDB4MDAsIDB4QzAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RjksCisJMHhGRiwgMHg4NSwgMHgwMCwgMHhEQywgMHgwMCwgMHhGQywgMHhGRCwgMHg0QSwgMHhGQiwgMHg2QywgMHgwMywKKwkweDRFLCAweDE2LCAweDg1LCAweDIxLCAweENGLCAweDE3LCAweEI4LCAweDA0LCAweDZDLCAweEZCLCAweEEyLAorCTB4RkQsIDB4QzUsIDB4MDAsIDB4OTgsIDB4MDAsIDB4RkMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgwMSwgMHgwMCwgMHhBRSwgMHgwMCwgMHhBMSwgMHgwMCwgMHgzOCwgMHhGRCwgMHhBRSwgMHhGQiwgMHg1NCwKKwkweDA2LCAweDdDLCAweDE5LCAweDUzLCAweDIxLCAweDdCLCAweDE0LCAweDA1LCAweDAyLCAweDNELCAweEZCLAorCTB4NjQsIDB4RkUsIDB4RUUsIDB4MDAsIDB4NkYsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MEYsCisJMHgwMCwgMHhENCwgMHgwMCwgMHg0NiwgMHgwMCwgMHg3RSwgMHhGQywgMHg3RSwgMHhGQywgMHg4RSwgMHgwOSwKKwkweDQ2LCAweDFDLCAweDY2LCAweDIwLCAweEY3LCAweDEwLCAweEMwLCAweEZGLCAweDY0LCAweEZCLCAweDFBLAorCTB4RkYsIDB4RkMsIDB4MDAsIDB4NDksIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjYsIDB4MDAsCisJMHhGMCwgMHgwMCwgMHhDOSwgMHhGRiwgMHhERiwgMHhGQiwgMHhDNCwgMHhGRCwgMHgwMSwgMHgwRCwgMHg5MCwKKwkweDFFLCAweENBLCAweDFFLCAweDY5LCAweDBELCAweEYxLCAweEZELCAweENGLCAweEZCLCAweEI4LCAweEZGLAorCTB4RjIsIDB4MDAsIDB4MjksIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NDUsIDB4MDAsIDB4RkMsCisJMHgwMCwgMHgyRCwgMHhGRiwgMHg2RCwgMHhGQiwgMHg4NCwgMHhGRiwgMHg4RSwgMHgxMCwgMHgzRiwgMHgyMCwKKwkweDkxLCAweDFDLCAweEYyLCAweDA5LCAweDlELCAweEZDLCAweDZBLCAweEZDLCAweDM5LCAweDAwLCAweEQ3LAorCTB4MDAsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NkEsIDB4MDAsIDB4RjEsIDB4MDAsCisJMHg3QSwgMHhGRSwgMHgzRCwgMHhGQiwgMHhCQywgMHgwMSwgMHgxNCwgMHgxNCwgMHg0MSwgMHgyMSwgMHhENCwKKwkweDE5LCAweEIwLCAweDA2LCAweEMwLCAweEZCLCAweDIyLCAweEZELCAweDk5LCAweDAwLCAweEIzLCAweDAwLAorCTB4MDIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RkYsIDB4OTMsIDB4MDAsIDB4Q0IsCisJMHgwMCwgMHhCOCwgMHhGRCwgMHg2MSwgMHhGQiwgMHg2MywgMHgwNCwgMHg3MSwgMHgxNywgMHg4OSwgMHgyMSwKKwkweEIwLCAweDE2LCAweEJELCAweDAzLCAweDUxLCAweEZCLCAweEU2LCAweEZELCAweEQ3LCAweDAwLCAweDhBLAorCTB4MDAsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDAsIDB4QkMsIDB4MDAsIDB4ODYsIDB4MDAsCisJMHhGNiwgMHhGQywgMHhFOSwgMHhGQiwgMHg2QSwgMHgwNywgMHg4MCwgMHgxQSwgMHgxNSwgMHgyMSwgMHg0NywKKwkweDEzLCAweDJGLCAweDAxLCAweDQyLCAweEZCLCAweEE1LCAweEZFLCAweEY2LCAweDAwLCAweDYxLCAweDAwLAorCTB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsIDB4MTYsIDB4MDAsIDB4REYsIDB4MDAsIDB4MUUsIDB4MDAsIDB4NDMsCisJMHhGQywgMHhFMSwgMHhGQywgMHhCQiwgMHgwQSwgMHgyMSwgMHgxRCwgMHhFQSwgMHgxRiwgMHhCQywgMHgwRiwKKwkweDEyLCAweEZGLCAweDgyLCAweEZCLCAweDU0LCAweEZGLCAweEZBLCAweDAwLCAweDNELCAweDAwLCAweEY4LAorCTB4RkYsIDB4RjksIDB4RkYsIDB4MzAsIDB4MDAsIDB4RjYsIDB4MDAsIDB4OTYsIDB4RkYsIDB4QjEsIDB4RkIsCisJMHg1MSwgMHhGRSwgMHgzQSwgMHgwRSwgMHgzOCwgMHgxRiwgMHgxNiwgMHgxRSwgMHgzMiwgMHgwQywgMHg2RSwKKwkweEZELCAweDAwLCAweEZDLCAweEU4LCAweEZGLCAweEVBLCAweDAwLCAweDIwLCAweDAwLCAweEZCLCAweEZGLAorCTB4RjcsIDB4RkYsIDB4NTEsIDB4MDAsIDB4RkIsIDB4MDAsIDB4RjEsIDB4RkUsIDB4NTQsIDB4RkIsIDB4M0IsCisJMHgwMCwgMHhDOSwgMHgxMSwgMHhBRCwgMHgyMCwgMHhBQywgMHgxQiwgMHhDQSwgMHgwOCwgMHg0NCwgMHhGQywKKwkweEE3LCAweEZDLCAweDVFLCAweDAwLCAweENDLCAweDAwLCAweDBCLCAweDAwLCAweEZFLCAweEZGLCAweEY4LAorCTB4RkYsIDB4NzgsIDB4MDAsIDB4RTcsIDB4MDAsIDB4MzgsIDB4RkUsIDB4NDAsIDB4RkIsIDB4OUIsIDB4MDIsCisJMHg0NSwgMHgxNSwgMHg2RiwgMHgyMSwgMHhDNywgMHgxOCwgMHhBMSwgMHgwNSwgMHg4RSwgMHhGQiwgMHg2NSwKKwkweEZELCAweEIyLCAweDAwLCAweEE1LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4QTIsIDB4MDAsIDB4QjcsIDB4MDAsIDB4NzQsIDB4RkQsIDB4ODQsIDB4RkIsIDB4NjYsCisJMHgwNSwgMHg4QSwgMHgxOCwgMHg3NiwgMHgyMSwgMHg4NywgMHgxNSwgMHhDRiwgMHgwMiwgMHg0MSwgMHhGQiwKKwkweDI5LCAweEZFLCAweEU1LCAweDAwLCAweDdCLCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDBBLAorCTB4MDAsIDB4QzksIDB4MDAsIDB4NjYsIDB4MDAsIDB4QjUsIDB4RkMsIDB4MzIsIDB4RkMsIDB4ODksIDB4MDgsCisJMHg3NywgMHgxQiwgMHhDMiwgMHgyMCwgMHgwRiwgMHgxMiwgMHg2NiwgMHgwMCwgMHg1MCwgMHhGQiwgMHhFNCwKKwkweEZFLCAweEZBLCAweDAwLCAweDU0LCAweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDFFLCAweDAwLAorCTB4RTgsIDB4MDAsIDB4RjMsIDB4RkYsIDB4MEMsIDB4RkMsIDB4NTMsIDB4RkQsIDB4RUQsIDB4MEIsIDB4RUIsCisJMHgxRCwgMHg1QSwgMHgxRiwgMHg4MCwgMHgwRSwgMHg3MywgMHhGRSwgMHhBOCwgMHhGQiwgMHg4QSwgMHhGRiwKKwkweEY3LCAweDAwLCAweDMyLCAweDAwLCAweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDNCLCAweDAwLCAweEZBLAorCTB4MDAsIDB4NjAsIDB4RkYsIDB4OEEsIDB4RkIsIDB4RUQsIDB4RkUsIDB4NzYsIDB4MEYsIDB4Q0MsIDB4MUYsCisJMHg0RiwgMHgxRCwgMHhGRiwgMHgwQSwgMHhGOSwgMHhGQywgMHgzNiwgMHhGQywgMHgxNSwgMHgwMCwgMHhFMSwKKwkweDAwLCAweDE4LCAweDAwLCAweEZDLCAweEZGLCAweEY3LCAweEZGLCAweDVFLCAweDAwLCAweEY3LCAweDAwLAorCTB4QjMsIDB4RkUsIDB4NDQsIDB4RkIsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTMsIDB4MDQsIDB4MjEsIDB4QjgsCisJMHgxQSwgMHhBOSwgMHgwNywgMHhGOCwgMHhGQiwgMHhFNywgMHhGQywgMHg3RiwgMHgwMCwgMHhCRiwgMHgwMCwKKwkweDA2LCAweDAwLCAweEZGLCAweEZGLCAweEY5LCAweEZGLCAweDg2LCAweDAwLCAweERBLCAweDAwLCAweEY1LAorCTB4RkQsIDB4NEMsIDB4RkIsIDB4ODcsIDB4MDMsIDB4NkUsIDB4MTYsIDB4ODYsIDB4MjEsIDB4QjAsIDB4MTcsCisJMHg5QywgMHgwNCwgMHg2OCwgMHhGQiwgMHhBOSwgMHhGRCwgMHhDNywgMHgwMCwgMHg5NiwgMHgwMCwgMHhGQiwKKwkweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAxLCAweDAwLCAweEIwLCAweDAwLCAweDlGLCAweDAwLAorCTB4MzEsIDB4RkQsIDB4QjQsIDB4RkIsIDB4NzMsIDB4MDYsIDB4OTksIDB4MTksIDB4NEQsIDB4MjEsIDB4NTksCisJMHgxNCwgMHhFRCwgMHgwMSwgMHgzRCwgMHhGQiwgMHg2QiwgMHhGRSwgMHhFRiwgMHgwMCwgMHg2RCwgMHgwMCwKKwkweEY3LCAweEZGLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEQ1LCAweDAwLCAweDQyLCAweDAwLCAweDc3LAorCTB4RkMsIDB4ODgsIDB4RkMsIDB4QUYsIDB4MDksIDB4NUYsIDB4MUMsIDB4NTksIDB4MjAsIDB4RDQsIDB4MTAsCisJMHhBQywgMHhGRiwgMHg2NywgMHhGQiwgMHgyMCwgMHhGRiwgMHhGQywgMHgwMCwgMHg0OCwgMHgwMCwgMHhGNywKKwkweEZGLCAweEZBLCAweEZGLCAweDI3LCAweDAwLCAweEYwLCAweDAwLCAweEMzLCAweEZGLCAweEQ5LCAweEZCLAorCTB4RDMsIDB4RkQsIDB4MjQsIDB4MEQsIDB4QTMsIDB4MUUsIDB4QjcsIDB4MUUsIDB4NDYsIDB4MEQsIDB4RTIsCisJMHhGRCwgMHhENCwgMHhGQiwgMHhCRSwgMHhGRiwgMHhGMSwgMHgwMCwgMHgyOCwgMHgwMCwgMHhGQSwgMHhGRiwKKwkweEY3LCAweEZGLCAweDQ2LCAweDAwLCAweEZDLCAweDAwLCAweDI3LCAweEZGLCAweDZBLCAweEZCLCAweDk4LAorCTB4RkYsIDB4QjEsIDB4MTAsIDB4NEMsIDB4MjAsIDB4NzgsIDB4MUMsIDB4RDEsIDB4MDksIDB4OTMsIDB4RkMsCisJMHg3MSwgMHhGQywgMHgzRCwgMHgwMCwgMHhENiwgMHgwMCwgMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywKKwkweEZGLCAweDZDLCAweDAwLCAweEYwLCAweDAwLCAweDcyLCAweEZFLCAweDNELCAweEZCLCAweEQ0LCAweDAxLAorCTB4MzYsIDB4MTQsIDB4NDcsIDB4MjEsIDB4QjYsIDB4MTksIDB4OTEsIDB4MDYsIDB4QkEsIDB4RkIsIDB4MjksCisJMHhGRCwgMHg5QywgMHgwMCwgMHhCMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweEZCLCAweEZGLCAweDk1LCAweDAwLCAweEM5LCAweDAwLCAweEIxLCAweEZELCAweDY1LCAweEZCLCAweDgwLAorCTB4MDQsIDB4OTAsIDB4MTcsIDB4ODgsIDB4MjEsIDB4OEYsIDB4MTYsIDB4QTIsIDB4MDMsIDB4NEUsIDB4RkIsCisJMHhFRCwgMHhGRCwgMHhEOSwgMHgwMCwgMHg4OCwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNSwKKwkweDAwLCAweEJELCAweDAwLCAweDgyLCAweDAwLCAweEVGLCAweEZDLCAweEYwLCAweEZCLCAweDhBLCAweDA3LAorCTB4OUMsIDB4MUEsIDB4MEQsIDB4MjEsIDB4MjQsIDB4MTMsIDB4MTgsIDB4MDEsIDB4NDMsIDB4RkIsIDB4QUMsCisJMHhGRSwgMHhGNywgMHgwMCwgMHg2MCwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxNywgMHgwMCwKKwkweEUwLCAweDAwLCAweDFBLCAweDAwLCAweDNELCAweEZDLCAweEVELCAweEZDLCAweERELCAweDBBLCAweDM4LAorCTB4MUQsIDB4REIsIDB4MUYsIDB4OTksIDB4MEYsIDB4RkYsIDB4RkUsIDB4ODYsIDB4RkIsIDB4NUEsIDB4RkYsCisJMHhGQSwgMHgwMCwgMHgzQywgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGNiwKKwkweDAwLCAweDkwLCAweEZGLCAweEFELCAweEZCLCAweDYyLCAweEZFLCAweDVELCAweDBFLCAweDQ5LCAweDFGLAorCTB4MDEsIDB4MUUsIDB4MTAsIDB4MEMsIDB4NjAsIDB4RkQsIDB4MDYsIDB4RkMsIDB4RUUsIDB4RkYsIDB4RTksCisJMHgwMCwgMHgxRiwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywgMHhGRiwgMHg1MywgMHgwMCwgMHhGQiwgMHgwMCwKKwkweEVCLCAweEZFLCAweDUyLCAweEZCLCAweDUxLCAweDAwLCAweEVDLCAweDExLCAweEI3LCAweDIwLCAweDkxLAorCTB4MUIsIDB4QTksIDB4MDgsIDB4M0IsIDB4RkMsIDB4QUUsIDB4RkMsIDB4NjIsIDB4MDAsIDB4Q0EsIDB4MDAsCisJMHgwQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3QSwgMHgwMCwgMHhFNiwgMHgwMCwgMHgzMCwKKwkweEZFLCAweDQwLCAweEZCLCAweEI1LCAweDAyLCAweDY2LCAweDE1LCAweDczLCAweDIxLCAweEE5LCAweDE4LAorCTB4ODMsIDB4MDUsIDB4ODksIDB4RkIsIDB4NkQsIDB4RkQsIDB4QjQsIDB4MDAsIDB4QTMsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhBMywgMHgwMCwgMHhCNCwgMHgwMCwKKwkweDZELCAweEZELCAweDg5LCAweEZCLCAweDgzLCAweDA1LCAweEE5LCAweDE4LCAweDczLCAweDIxLCAweDY2LAorCTB4MTUsIDB4QjUsIDB4MDIsIDB4NDAsIDB4RkIsIDB4MzAsIDB4RkUsIDB4RTYsIDB4MDAsIDB4N0EsIDB4MDAsCisJMHhGOCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgwQiwgMHgwMCwgMHhDQSwgMHgwMCwgMHg2MiwgMHgwMCwgMHhBRSwKKwkweEZDLCAweDNCLCAweEZDLCAweEE5LCAweDA4LCAweDkxLCAweDFCLCAweEI3LCAweDIwLCAweEVDLCAweDExLAorCTB4NTEsIDB4MDAsIDB4NTIsIDB4RkIsIDB4RUIsIDB4RkUsIDB4RkIsIDB4MDAsIDB4NTMsIDB4MDAsIDB4RjcsCisJMHhGRiwgMHhGQiwgMHhGRiwgMHgxRiwgMHgwMCwgMHhFOSwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwNiwgMHhGQywKKwkweDYwLCAweEZELCAweDEwLCAweDBDLCAweDAxLCAweDFFLCAweDQ5LCAweDFGLCAweDVELCAweDBFLCAweDYyLAorCTB4RkUsIDB4QUQsIDB4RkIsIDB4OTAsIDB4RkYsIDB4RjYsIDB4MDAsIDB4MzEsIDB4MDAsIDB4RjksIDB4RkYsCisJMHhGOCwgMHhGRiwgMHgzQywgMHgwMCwgMHhGQSwgMHgwMCwgMHg1QSwgMHhGRiwgMHg4NiwgMHhGQiwgMHhGRiwKKwkweEZFLCAweDk5LCAweDBGLCAweERCLCAweDFGLCAweDM4LCAweDFELCAweERELCAweDBBLCAweEVELCAweEZDLAorCTB4M0QsIDB4RkMsIDB4MUEsIDB4MDAsIDB4RTAsIDB4MDAsIDB4MTcsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsCisJMHhGRiwgMHg2MCwgMHgwMCwgMHhGNywgMHgwMCwgMHhBQywgMHhGRSwgMHg0MywgMHhGQiwgMHgxOCwgMHgwMSwKKwkweDI0LCAweDEzLCAweDBELCAweDIxLCAweDlDLCAweDFBLCAweDhBLCAweDA3LCAweEYwLCAweEZCLCAweEVGLAorCTB4RkMsIDB4ODIsIDB4MDAsIDB4QkQsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RjksIDB4RkYsCisJMHg4OCwgMHgwMCwgMHhEOSwgMHgwMCwgMHhFRCwgMHhGRCwgMHg0RSwgMHhGQiwgMHhBMiwgMHgwMywgMHg4RiwKKwkweDE2LCAweDg4LCAweDIxLCAweDkwLCAweDE3LCAweDgwLCAweDA0LCAweDY1LCAweEZCLCAweEIxLCAweEZELAorCTB4QzksIDB4MDAsIDB4OTUsIDB4MDAsIDB4RkIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDIsCisJMHgwMCwgMHhCMSwgMHgwMCwgMHg5QywgMHgwMCwgMHgyOSwgMHhGRCwgMHhCQSwgMHhGQiwgMHg5MSwgMHgwNiwKKwkweEI2LCAweDE5LCAweDQ3LCAweDIxLCAweDM2LCAweDE0LCAweEQ0LCAweDAxLCAweDNELCAweEZCLCAweDcyLAorCTB4RkUsIDB4RjAsIDB4MDAsIDB4NkMsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsCisJMHhENiwgMHgwMCwgMHgzRCwgMHgwMCwgMHg3MSwgMHhGQywgMHg5MywgMHhGQywgMHhEMSwgMHgwOSwgMHg3OCwKKwkweDFDLCAweDRDLCAweDIwLCAweEIxLCAweDEwLCAweDk4LCAweEZGLCAweDZBLCAweEZCLCAweDI3LCAweEZGLAorCTB4RkMsIDB4MDAsIDB4NDYsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjgsIDB4MDAsIDB4RjEsCisJMHgwMCwgMHhCRSwgMHhGRiwgMHhENCwgMHhGQiwgMHhFMiwgMHhGRCwgMHg0NiwgMHgwRCwgMHhCNywgMHgxRSwKKwkweEEzLCAweDFFLCAweDI0LCAweDBELCAweEQzLCAweEZELCAweEQ5LCAweEZCLCAweEMzLCAweEZGLCAweEYwLAorCTB4MDAsIDB4MjcsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NDgsIDB4MDAsIDB4RkMsIDB4MDAsCisJMHgyMCwgMHhGRiwgMHg2NywgMHhGQiwgMHhBQywgMHhGRiwgMHhENCwgMHgxMCwgMHg1OSwgMHgyMCwgMHg1RiwKKwkweDFDLCAweEFGLCAweDA5LCAweDg4LCAweEZDLCAweDc3LCAweEZDLCAweDQyLCAweDAwLCAweEQ1LCAweDAwLAorCTB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NkQsIDB4MDAsIDB4RUYsIDB4MDAsIDB4NkIsCisJMHhGRSwgMHgzRCwgMHhGQiwgMHhFRCwgMHgwMSwgMHg1OSwgMHgxNCwgMHg0RCwgMHgyMSwgMHg5OSwgMHgxOSwKKwkweDczLCAweDA2LCAweEI0LCAweEZCLCAweDMxLCAweEZELCAweDlGLCAweDAwLCAweEIwLCAweDAwLCAweDAxLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RkYsIDB4OTYsIDB4MDAsIDB4QzcsIDB4MDAsCisJMHhBOSwgMHhGRCwgMHg2OCwgMHhGQiwgMHg5QywgMHgwNCwgMHhCMCwgMHgxNywgMHg4NiwgMHgyMSwgMHg2RSwKKwkweDE2LCAweDg3LCAweDAzLCAweDRDLCAweEZCLCAweEY1LCAweEZELCAweERBLCAweDAwLCAweDg2LCAweDAwLAorCTB4RjksIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDAsIDB4QkYsIDB4MDAsIDB4N0YsIDB4MDAsIDB4RTcsCisJMHhGQywgMHhGOCwgMHhGQiwgMHhBOSwgMHgwNywgMHhCOCwgMHgxQSwgMHgwNCwgMHgyMSwgMHgwMiwgMHgxMywKKwkweDAxLCAweDAxLCAweDQ0LCAweEZCLCAweEIzLCAweEZFLCAweEY3LCAweDAwLCAweDVFLCAweDAwLCAweEY3LAorCTB4RkYsIDB4RkMsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RTEsIDB4MDAsIDB4MTUsIDB4MDAsIDB4MzYsIDB4RkMsCisJMHhGOSwgMHhGQywgMHhGRiwgMHgwQSwgMHg0RiwgMHgxRCwgMHhDQywgMHgxRiwgMHg3NiwgMHgwRiwgMHhFRCwKKwkweEZFLCAweDhBLCAweEZCLCAweDYwLCAweEZGLCAweEZBLCAweDAwLCAweDNCLCAweDAwLCAweEY4LCAweEZGLAorCTB4RjksIDB4RkYsIDB4MzIsIDB4MDAsIDB4RjcsIDB4MDAsIDB4OEEsIDB4RkYsIDB4QTgsIDB4RkIsIDB4NzMsCisJMHhGRSwgMHg4MCwgMHgwRSwgMHg1QSwgMHgxRiwgMHhFQiwgMHgxRCwgMHhFRCwgMHgwQiwgMHg1MywgMHhGRCwKKwkweDBDLCAweEZDLCAweEYzLCAweEZGLCAweEU4LCAweDAwLCAweDFFLCAweDAwLCAweEZCLCAweEZGLCAweEY3LAorCTB4RkYsIDB4NTQsIDB4MDAsIDB4RkEsIDB4MDAsIDB4RTQsIDB4RkUsIDB4NTAsIDB4RkIsIDB4NjYsIDB4MDAsCisJMHgwRiwgMHgxMiwgMHhDMiwgMHgyMCwgMHg3NywgMHgxQiwgMHg4OSwgMHgwOCwgMHgzMiwgMHhGQywgMHhCNSwKKwkweEZDLCAweDY2LCAweDAwLCAweEM5LCAweDAwLCAweDBBLCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLAorCTB4N0IsIDB4MDAsIDB4RTUsIDB4MDAsIDB4MjksIDB4RkUsIDB4NDEsIDB4RkIsIDB4Q0YsIDB4MDIsIDB4ODcsCisJMHgxNSwgMHg3NiwgMHgyMSwgMHg4QSwgMHgxOCwgMHg2NiwgMHgwNSwgMHg4NCwgMHhGQiwgMHg3NCwgMHhGRCwKKwkweEI3LCAweDAwLCAweEEyLCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZFLAorCTB4RkYsIDB4QTUsIDB4MDAsIDB4QjIsIDB4MDAsIDB4NjUsIDB4RkQsIDB4OEUsIDB4RkIsIDB4QTEsIDB4MDUsCisJMHhDNywgMHgxOCwgMHg2RiwgMHgyMSwgMHg0NSwgMHgxNSwgMHg5QiwgMHgwMiwgMHg0MCwgMHhGQiwgMHgzOCwKKwkweEZFLCAweEU3LCAweDAwLCAweDc4LCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDBCLCAweDAwLAorCTB4Q0MsIDB4MDAsIDB4NUUsIDB4MDAsIDB4QTcsIDB4RkMsIDB4NDQsIDB4RkMsIDB4Q0EsIDB4MDgsIDB4QUMsCisJMHgxQiwgMHhBRCwgMHgyMCwgMHhDOSwgMHgxMSwgMHgzQiwgMHgwMCwgMHg1NCwgMHhGQiwgMHhGMSwgMHhGRSwKKwkweEZCLCAweDAwLCAweDUxLCAweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDIwLCAweDAwLCAweEVBLAorCTB4MDAsIDB4RTgsIDB4RkYsIDB4MDAsIDB4RkMsIDB4NkUsIDB4RkQsIDB4MzIsIDB4MEMsIDB4MTYsIDB4MUUsCisJMHgzOCwgMHgxRiwgMHgzQSwgMHgwRSwgMHg1MSwgMHhGRSwgMHhCMSwgMHhGQiwgMHg5NiwgMHhGRiwgMHhGNiwKKwkweDAwLCAweDMwLCAweDAwLCAweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDNELCAweDAwLCAweEZBLCAweDAwLAorCTB4NTQsIDB4RkYsIDB4ODIsIDB4RkIsIDB4MTIsIDB4RkYsIDB4QkMsIDB4MEYsIDB4RUEsIDB4MUYsIDB4MjEsCisJMHgxRCwgMHhCQiwgMHgwQSwgMHhFMSwgMHhGQywgMHg0MywgMHhGQywgMHgxRSwgMHgwMCwgMHhERiwgMHgwMCwKKwkweDE2LCAweDAwLCAweEZDLCAweEZGLCAweEY3LCAweEZGLCAweDYxLCAweDAwLCAweEY2LCAweDAwLCAweEE1LAorCTB4RkUsIDB4NDIsIDB4RkIsIDB4MkYsIDB4MDEsIDB4NDcsIDB4MTMsIDB4MTUsIDB4MjEsIDB4ODAsIDB4MUEsCisJMHg2QSwgMHgwNywgMHhFOSwgMHhGQiwgMHhGNiwgMHhGQywgMHg4NiwgMHgwMCwgMHhCQywgMHgwMCwgMHgwNSwKKwkweDAwLCAweEZGLCAweEZGLCAweEZBLCAweEZGLCAweDhBLCAweDAwLCAweEQ3LCAweDAwLCAweEU2LCAweEZELAorCTB4NTEsIDB4RkIsIDB4QkQsIDB4MDMsIDB4QjAsIDB4MTYsIDB4ODksIDB4MjEsIDB4NzEsIDB4MTcsIDB4NjMsCisJMHgwNCwgMHg2MSwgMHhGQiwgMHhCOCwgMHhGRCwgMHhDQiwgMHgwMCwgMHg5MywgMHgwMCwgMHhGQiwgMHhGRiwKKwkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAyLCAweDAwLCAweEIzLCAweDAwLCAweDk5LCAweDAwLCAweDIyLAorCTB4RkQsIDB4QzAsIDB4RkIsIDB4QjAsIDB4MDYsIDB4RDQsIDB4MTksIDB4NDEsIDB4MjEsIDB4MTQsIDB4MTQsCisJMHhCQywgMHgwMSwgMHgzRCwgMHhGQiwgMHg3QSwgMHhGRSwgMHhGMSwgMHgwMCwgMHg2QSwgMHgwMCwgMHhGNywKKwkweEZGLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEQ3LCAweDAwLCAweDM5LCAweDAwLCAweDZBLCAweEZDLAorCTB4OUQsIDB4RkMsIDB4RjIsIDB4MDksIDB4OTEsIDB4MUMsIDB4M0YsIDB4MjAsIDB4OEUsIDB4MTAsIDB4ODQsCisJMHhGRiwgMHg2RCwgMHhGQiwgMHgyRCwgMHhGRiwgMHhGQywgMHgwMCwgMHg0NSwgMHgwMCwgMHhGNywgMHhGRiwKKwkweEZBLCAweEZGLCAweDI5LCAweDAwLCAweEYyLCAweDAwLCAweEI4LCAweEZGLCAweENGLCAweEZCLCAweEYxLAorCTB4RkQsIDB4NjksIDB4MEQsIDB4Q0EsIDB4MUUsIDB4OTAsIDB4MUUsIDB4MDEsIDB4MEQsIDB4QzQsIDB4RkQsCisJMHhERiwgMHhGQiwgMHhDOSwgMHhGRiwgMHhGMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywKKwkweEZGLCAweDQ5LCAweDAwLCAweEZDLCAweDAwLCAweDFBLCAweEZGLCAweDY0LCAweEZCLCAweEMwLCAweEZGLAorCTB4RjcsIDB4MTAsIDB4NjYsIDB4MjAsIDB4NDYsIDB4MUMsIDB4OEUsIDB4MDksIDB4N0UsIDB4RkMsIDB4N0UsCisJMHhGQywgMHg0NiwgMHgwMCwgMHhENCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwKKwkweDZGLCAweDAwLCAweEVFLCAweDAwLCAweDY0LCAweEZFLCAweDNELCAweEZCLCAweDA1LCAweDAyLCAweDdCLAorCTB4MTQsIDB4NTMsIDB4MjEsIDB4N0MsIDB4MTksIDB4NTQsIDB4MDYsIDB4QUUsIDB4RkIsIDB4MzgsIDB4RkQsCisJMHhBMSwgMHgwMCwgMHhBRSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQywKKwkweEZGLCAweDk4LCAweDAwLCAweEM1LCAweDAwLCAweEEyLCAweEZELCAweDZDLCAweEZCLCAweEI4LCAweDA0LAorCTB4Q0YsIDB4MTcsIDB4ODUsIDB4MjEsIDB4NEUsIDB4MTYsIDB4NkMsIDB4MDMsIDB4NEEsIDB4RkIsIDB4RkMsCisJMHhGRCwgMHhEQywgMHgwMCwgMHg4NSwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMCwKKwkweEMwLCAweDAwLCAweDdCLCAweDAwLCAweEUwLCAweEZDLCAweDAwLCAweEZDLCAweEM5LCAweDA3LCAweEQzLAorCTB4MUEsIDB4RkMsIDB4MjAsIDB4REYsIDB4MTIsIDB4RUEsIDB4MDAsIDB4NDYsIDB4RkIsIDB4QkEsIDB4RkUsCisJMHhGOCwgMHgwMCwgMHg1RCwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxOSwgMHgwMCwgMHhFMiwKKwkweDAwLCAweDEwLCAweDAwLCAweDMwLCAweEZDLCAweDA1LCAweEZELCAweDIxLCAweDBCLCAweDY2LCAweDFELAorCTB4QkQsIDB4MUYsIDB4NTMsIDB4MEYsIDB4REIsIDB4RkUsIDB4OEUsIDB4RkIsIDB4NjYsIDB4RkYsIDB4RkEsCisJMHgwMCwgMHgzQSwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGNywgMHgwMCwKKwkweDg0LCAweEZGLCAweEE0LCAweEZCLCAweDg0LCAweEZFLCAweEEzLCAweDBFLCAweDZDLCAweDFGLCAweEQ2LAorCTB4MUQsIDB4Q0IsIDB4MEIsIDB4NDUsIDB4RkQsIDB4MTIsIDB4RkMsIDB4RjgsIDB4RkYsIDB4RTcsIDB4MDAsCisJMHgxRCwgMHgwMCwgMHhGQiwgMHhGRiwgMHhGNywgMHhGRiwgMHg1NiwgMHgwMCwgMHhGQSwgMHgwMCwgMHhERCwKKwkweEZFLCAweDRFLCAweEZCLCAweDdDLCAweDAwLCAweDMyLCAweDEyLCAweENDLCAweDIwLCAweDVDLCAweDFCLAorCTB4NjksIDB4MDgsIDB4MjksIDB4RkMsIDB4QkMsIDB4RkMsIDB4NjksIDB4MDAsIDB4QzcsIDB4MDAsIDB4MDksCisJMHgwMCwgMHhGRSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg3RCwgMHgwMCwgMHhFMywgMHgwMCwgMHgyMSwgMHhGRSwKKwkweDQzLCAweEZCLCAweEU5LCAweDAyLCAweEE5LCAweDE1LCAweDc5LCAweDIxLCAweDZCLCAweDE4LCAweDQ4LAorCTB4MDUsIDB4ODAsIDB4RkIsIDB4N0MsIDB4RkQsIDB4QjksIDB4MDAsIDB4QTAsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhBNiwgMHgwMCwgMHhBRiwgMHgwMCwgMHg1RSwKKwkweEZELCAweDkzLCAweEZCLCAweEJFLCAweDA1LCAweEU1LCAweDE4LCAweDZCLCAweDIxLCAweDIzLCAweDE1LAorCTB4ODIsIDB4MDIsIDB4M0YsIDB4RkIsIDB4M0YsIDB4RkUsIDB4RTksIDB4MDAsIDB4NzcsIDB4MDAsIDB4RjgsCisJMHhGRiwgMHhGRSwgMHhGRiwgMHgwQywgMHgwMCwgMHhDRCwgMHgwMCwgMHg1QSwgMHgwMCwgMHhBMCwgMHhGQywKKwkweDRELCAweEZDLCAweEVBLCAweDA4LCAweEM2LCAweDFCLCAweEExLCAweDIwLCAweEE2LCAweDExLCAweDI2LAorCTB4MDAsIDB4NTcsIDB4RkIsIDB4RjgsIDB4RkUsIDB4RkIsIDB4MDAsIDB4NTAsIDB4MDAsIDB4RjcsIDB4RkYsCisJMHhGQiwgMHhGRiwgMHgyMSwgMHgwMCwgMHhFQiwgMHgwMCwgMHhFMywgMHhGRiwgMHhGQSwgMHhGQiwgMHg3QywKKwkweEZELCAweDU0LCAweDBDLCAweDJCLCAweDFFLCAweDI2LCAweDFGLCAweDE3LCAweDBFLCAweDQxLCAweEZFLAorCTB4QjYsIDB4RkIsIDB4OUMsIDB4RkYsIDB4RjUsIDB4MDAsIDB4MkYsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsCisJMHhGRiwgMHgzRiwgMHgwMCwgMHhGQiwgMHgwMCwgMHg0RCwgMHhGRiwgMHg3RiwgMHhGQiwgMHgyNCwgMHhGRiwKKwkweERGLCAweDBGLCAweEY5LCAweDFGLCAweDA5LCAweDFELCAweDk5LCAweDBBLCAweEQ1LCAweEZDLCAweDQ5LAorCTB4RkMsIDB4MjMsIDB4MDAsIDB4REQsIDB4MDAsIDB4MTYsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsCisJMHg2MywgMHgwMCwgMHhGNSwgMHgwMCwgMHg5RSwgMHhGRSwgMHg0MSwgMHhGQiwgMHg0NiwgMHgwMSwgMHg2OSwKKwkweDEzLCAweDFELCAweDIxLCAweDYzLCAweDFBLCAweDRCLCAweDA3LCAweEUyLCAweEZCLCAweEZELCAweEZDLAorCTB4ODksIDB4MDAsIDB4QkEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4OEIsCisJMHgwMCwgMHhENSwgMHgwMCwgMHhERSwgMHhGRCwgMHg1MywgMHhGQiwgMHhEOSwgMHgwMywgMHhEMCwgMHgxNiwKKwkweDhBLCAweDIxLCAweDUxLCAweDE3LCAweDQ3LCAweDA0LCAweDVFLCAweEZCLCAweEMwLCAweEZELCAweENELAorCTB4MDAsIDB4OTIsIDB4MDAsIDB4RkIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDAsCisJMHhCNCwgMHgwMCwgMHg5NiwgMHgwMCwgMHgxQiwgMHhGRCwgMHhDNywgMHhGQiwgMHhDRiwgMHgwNiwgMHhGMCwKKwkweDE5LCAweDNBLCAweDIxLCAweEYyLCAweDEzLCAweEE0LCAweDAxLCAweDNFLCAweEZCLCAweDgxLCAweEZFLAorCTB4RjIsIDB4MDAsIDB4NjksIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RDksCisJMHgwMCwgMHgzNSwgMHgwMCwgMHg2MywgMHhGQywgMHhBOCwgMHhGQywgMHgxMywgMHgwQSwgMHhBOSwgMHgxQywKKwkweDMyLCAweDIwLCAweDZCLCAweDEwLCAweDcxLCAweEZGLCAweDcxLCAweEZCLCAweDM0LCAweEZGLCAweEZCLAorCTB4MDAsIDB4NDQsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MkIsIDB4MDAsIDB4RjMsIDB4MDAsCisJMHhCMywgMHhGRiwgMHhDQSwgMHhGQiwgMHgwMSwgMHhGRSwgMHg4QywgMHgwRCwgMHhERCwgMHgxRSwgMHg3QywKKwkweDFFLCAweERFLCAweDBDLCAweEI1LCAweEZELCAweEU0LCAweEZCLCAweENFLCAweEZGLCAweEVGLCAweDAwLAorCTB4MjUsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RkMsIDB4MDAsIDB4MTMsCisJMHhGRiwgMHg2MSwgMHhGQiwgMHhENCwgMHhGRiwgMHgxQSwgMHgxMSwgMHg3MiwgMHgyMCwgMHgyRCwgMHgxQywKKwkweDZELCAweDA5LCAweDc0LCAweEZDLCAweDg1LCAweEZDLCAweDRBLCAweDAwLCAweEQyLCAweDAwLCAweDBGLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NzAsIDB4MDAsIDB4RUQsIDB4MDAsIDB4NUQsIDB4RkUsCisJMHgzRCwgMHhGQiwgMHgxRSwgMHgwMiwgMHg5QywgMHgxNCwgMHg1OCwgMHgyMSwgMHg1RSwgMHgxOSwgMHgzNiwKKwkweDA2LCAweEE4LCAweEZCLCAweDQwLCAweEZELCAweEE0LCAweDAwLCAweEFELCAweDAwLCAweDAwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RkYsIDB4OUEsIDB4MDAsIDB4QzMsIDB4MDAsIDB4OUEsCisJMHhGRCwgMHg2RiwgMHhGQiwgMHhENSwgMHgwNCwgMHhFRiwgMHgxNywgMHg4MywgMHgyMSwgMHgyRCwgMHgxNiwKKwkweDUyLCAweDAzLCAweDQ5LCAweEZCLCAweDA0LCAweEZFLCAweERELCAweDAwLCAweDgzLCAweDAwLCAweEY5LAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDAsIDB4QzIsIDB4MDAsIDB4NzgsIDB4MDAsIDB4RDksIDB4RkMsCisJMHgwOCwgMHhGQywgMHhFOSwgMHgwNywgMHhFRiwgMHgxQSwgMHhGMywgMHgyMCwgMHhCQywgMHgxMiwgMHhENCwKKwkweDAwLCAweDQ3LCAweEZCLCAweEMxLCAweEZFLCAweEY4LCAweDAwLCAweDVCLCAweDAwLCAweEY3LCAweEZGLAorCTB4RkMsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RTMsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MkEsIDB4RkMsIDB4MTIsCisJMHhGRCwgMHg0MiwgMHgwQiwgMHg3RCwgMHgxRCwgMHhBRCwgMHgxRiwgMHgyRiwgMHgwRiwgMHhDOSwgMHhGRSwKKwkweDkyLCAweEZCLCAweDZDLCAweEZGLCAweEY5LCAweDAwLCAweDM4LCAweDAwLCAweEY4LCAweEZGLCAweEY5LAorCTB4RkYsIDB4MzUsIDB4MDAsIDB4RjgsIDB4MDAsIDB4N0UsIDB4RkYsIDB4OUYsIDB4RkIsIDB4OTUsIDB4RkUsCisJMHhDNiwgMHgwRSwgMHg3QywgMHgxRiwgMHhDMCwgMHgxRCwgMHhBOSwgMHgwQiwgMHgzOCwgMHhGRCwgMHgxOCwKKwkweEZDLCAweEZELCAweEZGLCAweEU2LCAweDAwLCAweDFELCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLAorCTB4NTcsIDB4MDAsIDB4RkEsIDB4MDAsIDB4RDYsIDB4RkUsIDB4NEMsIDB4RkIsIDB4OTIsIDB4MDAsIDB4NTQsCisJMHgxMiwgMHhENiwgMHgyMCwgMHg0MSwgMHgxQiwgMHg0OSwgMHgwOCwgMHgyMCwgMHhGQywgMHhDMywgMHhGQywKKwkweDZELCAweDAwLCAweEM2LCAweDAwLCAweDA5LCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDdFLAorCTB4MDAsIDB4RTIsIDB4MDAsIDB4MUEsIDB4RkUsIDB4NDQsIDB4RkIsIDB4MDMsIDB4MDMsIDB4Q0EsIDB4MTUsCisJMHg3QywgMHgyMSwgMHg0QywgMHgxOCwgMHgyQiwgMHgwNSwgMHg3QiwgMHhGQiwgMHg4MywgMHhGRCwgMHhCQywKKwkweDAwLCAweDlFLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAorCTB4QTgsIDB4MDAsIDB4QUQsIDB4MDAsIDB4NTYsIDB4RkQsIDB4OTgsIDB4RkIsIDB4REMsIDB4MDUsIDB4MDQsCisJMHgxOSwgMHg2NiwgMHgyMSwgMHgwMiwgMHgxNSwgMHg2OSwgMHgwMiwgMHgzRSwgMHhGQiwgMHg0NywgMHhGRSwKKwkweEVBLCAweDAwLCAweDc1LCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDBELCAweDAwLCAweENFLAorCTB4MDAsIDB4NTYsIDB4MDAsIDB4OTksIDB4RkMsIDB4NTYsIDB4RkMsIDB4MEIsIDB4MDksIDB4RTAsIDB4MUIsCisJMHg5NiwgMHgyMCwgMHg4MywgMHgxMSwgMHgxMSwgMHgwMCwgMHg1OSwgMHhGQiwgMHhGRiwgMHhGRSwgMHhGQiwKKwkweDAwLCAweDRFLCAweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDIyLCAweDAwLCAweEVDLCAweDAwLAorCTB4REUsIDB4RkYsIDB4RjUsIDB4RkIsIDB4OEEsIDB4RkQsIDB4NzcsIDB4MEMsIDB4M0YsIDB4MUUsIDB4MTQsCisJMHgxRiwgMHhGNSwgMHgwRCwgMHgzMSwgMHhGRSwgMHhCQiwgMHhGQiwgMHhBMiwgMHhGRiwgMHhGNSwgMHgwMCwKKwkweDJFLCAweDAwLCAweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDQwLCAweDAwLCAweEZCLCAweDAwLCAweDQ3LAorCTB4RkYsIDB4N0IsIDB4RkIsIDB4MzcsIDB4RkYsIDB4MDIsIDB4MTAsIDB4MDcsIDB4MjAsIDB4RjIsIDB4MUMsCisJMHg3OCwgMHgwQSwgMHhDQSwgMHhGQywgMHg1MCwgMHhGQywgMHgyNywgMHgwMCwgMHhEQywgMHgwMCwgMHgxNSwKKwkweDAwLCAweEZDLCAweEZGLCAweEY3LCAweEZGLCAweDY0LCAweDAwLCAweEY1LCAweDAwLCAweDk3LCAweEZFLAorCTB4NDAsIDB4RkIsIDB4NUQsIDB4MDEsIDB4OEIsIDB4MTMsIDB4MjUsIDB4MjEsIDB4NDcsIDB4MUEsIDB4MkMsCisJMHgwNywgMHhEQiwgMHhGQiwgMHgwNSwgMHhGRCwgMHg4QywgMHgwMCwgMHhCOSwgMHgwMCwgMHgwNCwgMHgwMCwKKwkweEZGLCAweEZGLCAweEZBLCAweEZGLCAweDhELCAweDAwLCAweEQzLCAweDAwLCAweEQ2LCAweEZELCAweDU2LAorCTB4RkIsIDB4RjQsIDB4MDMsIDB4RjAsIDB4MTYsIDB4OEEsIDB4MjEsIDB4MzEsIDB4MTcsIDB4MkIsIDB4MDQsCisJMHg1QiwgMHhGQiwgMHhDNywgMHhGRCwgMHhDRiwgMHgwMCwgMHg5MCwgMHgwMCwgMHhGQSwgMHhGRiwgMHgwMCwKKwkweDAwLCAweEZGLCAweEZGLCAweDAzLCAweDAwLCAweEI2LCAweDAwLCAweDkyLCAweDAwLCAweDEzLCAweEZELAorCTB4Q0QsIDB4RkIsIDB4RUUsIDB4MDYsIDB4MEQsIDB4MUEsIDB4MzMsIDB4MjEsIDB4RDAsIDB4MTMsIDB4OEMsCisJMHgwMSwgMHgzRSwgMHhGQiwgMHg4OCwgMHhGRSwgMHhGMywgMHgwMCwgMHg2NywgMHgwMCwgMHhGNywgMHhGRiwKKwkweDA2LCAweDAwLCAweDFELCAweDAwLCAweDAzLCAweEZGLCAweEZFLCAweDAwLCAweEExLCAweDAyLCAweEE2LAorCTB4RjgsIDB4NTYsIDB4MDIsIDB4QTUsIDB4MjgsIDB4QTUsIDB4MjgsIDB4NTYsIDB4MDIsIDB4QTYsIDB4RjgsCisJMHhBMSwgMHgwMiwgMHhGRSwgMHgwMCwgMHgwMywgMHhGRiwgMHgxRCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDIxLCAweDAwLCAweEE2LCAweEZGLCAweDNGLCAweEZGLCAweDBCLCAweDAzLCAweDQyLCAweEZFLAorCTB4M0UsIDB4RjgsIDB4N0YsIDB4MTUsIDB4QUMsIDB4MzAsIDB4N0YsIDB4MTUsIDB4M0UsIDB4RjgsIDB4NDIsCisJMHhGRSwgMHgwQiwgMHgwMywgMHgzRiwgMHhGRiwgMHhBNiwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZBLCAweEZGLCAweENFLCAweEZGLCAweDE0LCAweDAxLCAweDAwLCAweEZELCAweDM1LCAweDA2LCAweEQ1LAorCTB4RjQsIDB4REEsIDB4MTUsIDB4OTIsIDB4NDAsIDB4QUUsIDB4RkUsIDB4RjMsIDB4RkMsIDB4NjgsIDB4MDMsCisJMHg4NiwgMHhGRCwgMHg1MSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFQywKKwkweEZGLCAweEY5LCAweEZGLCAweEM2LCAweDAwLCAweDU1LCAweEZELCAweDM1LCAweDA2LCAweDkwLCAweEYzLAorCTB4RTUsIDB4MUMsIDB4NkIsIDB4M0QsIDB4NzEsIDB4RkEsIDB4MzQsIDB4RkYsIDB4NDYsIDB4MDIsIDB4RkYsCisJMHhGRCwgMHgyRCwgMHgwMSwgMHg5MCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhEQiwgMHhGRiwKKwkweDJELCAweDAwLCAweDYwLCAweDAwLCAweEUxLCAweEZELCAweENFLCAweDA1LCAweEVELCAweEYyLCAweEYzLAorCTB4MjMsIDB4MjAsIDB4MzksIDB4MjIsIDB4RjcsIDB4NDQsIDB4MDEsIDB4MUYsIDB4MDEsIDB4ODksIDB4RkUsCisJMHhGQiwgMHgwMCwgMHg5QywgMHhGRiwgMHgwRCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDOSwgMHhGRiwgMHg2OCwKKwkweDAwLCAweEU1LCAweEZGLCAweEEwLCAweEZFLCAweEZCLCAweDA0LCAweDBDLCAweEYzLCAweEM1LCAweDJBLAorCTB4RDgsIDB4MzMsIDB4QzksIDB4RjQsIDB4MEIsIDB4MDMsIDB4MDUsIDB4MDAsIDB4MUEsIDB4RkYsIDB4QzEsCisJMHgwMCwgMHhBRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCNSwgMHhGRiwgMHhBNSwgMHgwMCwKKwkweDVDLCAweEZGLCAweDhDLCAweEZGLCAweEJGLCAweDAzLCAweDA2LCAweEY0LCAweDIyLCAweDMxLCAweEM4LAorCTB4MkQsIDB4NjMsIDB4RjMsIDB4NzYsIDB4MDQsIDB4MDgsIDB4RkYsIDB4QTcsIDB4RkYsIDB4ODQsIDB4MDAsCisJMHhDMCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwQywgMHgwMCwgMHhBNCwgMHhGRiwgMHhFMSwgMHgwMCwgMHhDQiwKKwkweEZFLCAweDlCLCAweDAwLCAweDIxLCAweDAyLCAweEVFLCAweEY1LCAweENELCAweDM2LCAweDI0LCAweDI3LAorCTB4RTEsIDB4RjIsIDB4N0EsIDB4MDUsIDB4MzMsIDB4RkUsIDB4MkEsIDB4MDAsIDB4NDcsIDB4MDAsIDB4RDMsCisJMHhGRiwgMHgwNCwgMHgwMCwgMHgwRiwgMHgwMCwgMHg5NSwgMHhGRiwgMHgxNywgMHgwMSwgMHgzRCwgMHhGRSwKKwkweEJELCAweDAxLCAweDMwLCAweDAwLCAweENDLCAweEY4LCAweDkyLCAweDNCLCAweDJBLCAweDIwLCAweDJFLAorCTB4RjMsIDB4MTIsIDB4MDYsIDB4OEYsIDB4RkQsIDB4OUEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4RTUsIDB4RkYsCisJMHgwMiwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4QywgMHhGRiwgMHg0MiwgMHgwMSwgMHhCQiwgMHhGRCwgMHhFNCwKKwkweDAyLCAweDAxLCAweEZFLCAweDlDLCAweEZDLCAweDQ1LCAweDNGLCAweDE2LCAweDE5LCAweDJELCAweEY0LAorCTB4NDEsIDB4MDYsIDB4MjEsIDB4RkQsIDB4RjMsIDB4MDAsIDB4RTAsIDB4RkYsIDB4RjQsIDB4RkYsIDB4MDEsCisJMHgwMCwgMHgxMCwgMHgwMCwgMHg4QiwgMHhGRiwgMHg1RCwgMHgwMSwgMHg0RiwgMHhGRCwgMHhGQiwgMHgwMywKKwkweEIyLCAweEZCLCAweDUzLCAweDAxLCAweEMyLCAweDQxLCAweDI0LCAweDEyLCAweEJBLCAweEY1LCAweDBGLAorCTB4MDYsIDB4RTksIDB4RkMsIDB4MzMsIDB4MDEsIDB4QkIsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwRCwgMHgwMCwgMHg5MywgMHhGRiwgMHg2MywgMHgwMSwgMHgwNCwgMHhGRCwgMHhFRiwgMHgwNCwgMHg2MiwKKwkweEY5LCAweEQ3LCAweDA2LCAweEYyLCAweDQyLCAweDhELCAweDBCLCAweEIwLCAweEY3LCAweDg3LCAweDA1LAorCTB4RTYsIDB4RkMsIDB4NTgsIDB4MDEsIDB4QTAsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwNywgMHgwMCwgMHhBNSwgMHhGRiwgMHg1MiwgMHgwMSwgMHhFMiwgMHhGQywgMHhBRCwgMHgwNSwKKwkweDM1LCAweEY3LCAweDA4LCAweDBELCAweENCLCAweDQyLCAweDgxLCAweDA1LCAweEU4LCAweEY5LCAweEJCLAorCTB4MDQsIDB4MTIsIDB4RkQsIDB4NjQsIDB4MDEsIDB4OTAsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHhDMiwgMHhGRiwgMHgyNywgMHgwMSwgMHhGMSwgMHhGQywgMHgyMiwgMHgwNiwgMHg1NCwKKwkweEY1LCAweEI4LCAweDEzLCAweDRBLCAweDQxLCAweDI5LCAweDAwLCAweDNDLCAweEZDLCAweEJELCAweDAzLAorCTB4NjYsIDB4RkQsIDB4NTgsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjEsCisJMHhGRiwgMHhFQiwgMHhGRiwgMHhFMSwgMHgwMCwgMHgzNSwgMHhGRCwgMHg0MCwgMHgwNiwgMHhFNCwgMHhGMywKKwkweEI3LCAweDFBLCAweDg1LCAweDNFLCAweEE2LCAweEZCLCAweDg2LCAweEZFLCAweEEwLCAweDAyLCAweEQ3LAorCTB4RkQsIDB4MzksIDB4MDEsIDB4OEUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RTEsIDB4RkYsCisJMHgxQywgMHgwMCwgMHg4MiwgMHgwMCwgMHhCMCwgMHhGRCwgMHhGOSwgMHgwNSwgMHgwQywgMHhGMywgMHhDQiwKKwkweDIxLCAweDhGLCAweDNBLCAweDBELCAweEY4LCAweEE5LCAweDAwLCAweDc5LCAweDAxLCAweDVELCAweEZFLAorCTB4MEIsIDB4MDEsIDB4OTgsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4NTUsCisJMHgwMCwgMHgwRCwgMHgwMCwgMHg2MCwgMHhGRSwgMHg0OCwgMHgwNSwgMHhFQywgMHhGMiwgMHhCNiwgMHgyOCwKKwkweDkxLCAweDM1LCAweDY4LCAweEY1LCAweDg4LCAweDAyLCAweDVBLCAweDAwLCAweEVELCAweEZFLCAweEQ0LAorCTB4MDAsIDB4QTgsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkIsIDB4RkYsIDB4OTIsIDB4MDAsCisJMHg4NywgMHhGRiwgMHgzRiwgMHhGRiwgMHgyQiwgMHgwNCwgMHhBMSwgMHhGMywgMHgzRCwgMHgyRiwgMHhCOCwKKwkweDJGLCAweEI4LCAweEYzLCAweDExLCAweDA0LCAweDUyLCAweEZGLCAweDdDLCAweEZGLCAweDk3LCAweDAwLAorCTB4QkEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QTksIDB4RkYsIDB4Q0YsIDB4MDAsIDB4RjgsCisJMHhGRSwgMHg0NCwgMHgwMCwgMHhBQSwgMHgwMiwgMHgzRSwgMHhGNSwgMHgyNCwgMHgzNSwgMHgzQiwgMHgyOSwKKwkweEYyLCAweEYyLCAweDM1LCAweDA1LCAweDcwLCAweEZFLCAweDAzLCAweDAwLCAweDVBLCAweDAwLCAweENELAorCTB4RkYsIDB4MDUsIDB4MDAsIDB4MEUsIDB4MDAsIDB4OTksIDB4RkYsIDB4MDcsIDB4MDEsIDB4NjgsIDB4RkUsCisJMHg2MywgMHgwMSwgMHhEMCwgMHgwMCwgMHhEMCwgMHhGNywgMHgzNSwgMHgzQSwgMHg1NSwgMHgyMiwgMHgwMiwKKwkweEYzLCAweEVGLCAweDA1LCAweEJDLCAweEZELCAweDdBLCAweDAwLCAweDIwLCAweDAwLCAweERGLCAweEZGLAorCTB4MDMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4OEUsIDB4RkYsIDB4MzYsIDB4MDEsIDB4RTEsIDB4RkQsIDB4OEEsCisJMHgwMiwgMHhCMiwgMHhGRSwgMHg1NiwgMHhGQiwgMHg0MCwgMHgzRSwgMHg0MiwgMHgxQiwgMHhDRSwgMHhGMywKKwkweDNFLCAweDA2LCAweDNELCAweEZELCAweERCLCAweDAwLCAweEVFLCAweEZGLCAweEYwLCAweEZGLCAweDAxLAorCTB4MDAsIDB4MTEsIDB4MDAsIDB4OEEsIDB4RkYsIDB4NTcsIDB4MDEsIDB4NkQsIDB4RkQsIDB4QTgsIDB4MDMsCisJMHg2OSwgMHhGQywgMHhDOCwgMHhGRiwgMHgyMCwgMHg0MSwgMHg0MCwgMHgxNCwgMHgzMywgMHhGNSwgMHgyOCwKKwkweDA2LCAweEY1LCAweEZDLCAweDIyLCAweDAxLCAweEM1LCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLAorCTB4MEYsIDB4MDAsIDB4OEYsIDB4RkYsIDB4NjQsIDB4MDEsIDB4MTcsIDB4RkQsIDB4QTksIDB4MDQsIDB4MTYsCisJMHhGQSwgMHgxMCwgMHgwNSwgMHhCOCwgMHg0MiwgMHg4NywgMHgwRCwgMHgwRCwgMHhGNywgMHhCOSwgMHgwNSwKKwkweEUyLCAweEZDLCAweDUwLCAweDAxLCAweEE3LCAweEZGLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MEEsIDB4MDAsIDB4OUUsIDB4RkYsIDB4NUEsIDB4MDEsIDB4RTgsIDB4RkMsIDB4N0EsIDB4MDUsCisJMHhEQSwgMHhGNywgMHgxMCwgMHgwQiwgMHhGQiwgMHg0MiwgMHg0QiwgMHgwNywgMHgzNSwgMHhGOSwgMHgwMCwKKwkweDA1LCAweDAwLCAweEZELCAweDYzLCAweDAxLCAweDk0LCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLAorCTB4MDEsIDB4MDAsIDB4QjgsIDB4RkYsIDB4MzcsIDB4MDEsIDB4RTcsIDB4RkMsIDB4MDcsIDB4MDYsIDB4REUsCisJMHhGNSwgMHg5RiwgMHgxMSwgMHhFNCwgMHg0MSwgMHhCOCwgMHgwMSwgMHg4NCwgMHhGQiwgMHgwRiwgMHgwNCwKKwkweDQ4LCAweEZELCAweDVFLCAweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY1LAorCTB4RkYsIDB4REQsIDB4RkYsIDB4RjksIDB4MDAsIDB4MUIsIDB4RkQsIDB4NDEsIDB4MDYsIDB4NDcsIDB4RjQsCisJMHg4QiwgMHgxOCwgMHg4MSwgMHgzRiwgMHhGMSwgMHhGQywgMHhENSwgMHhGRCwgMHhGQSwgMHgwMiwgMHhCMiwKKwkweEZELCAweDQ1LCAweDAxLCAweDhDLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEU2LCAweEZGLAorCTB4MEMsIDB4MDAsIDB4QTIsIDB4MDAsIDB4ODUsIDB4RkQsIDB4MUEsIDB4MDYsIDB4M0MsIDB4RjMsIDB4OUYsCisJMHgxRiwgMHhFNiwgMHgzQiwgMHgwRSwgMHhGOSwgMHgwNywgMHgwMCwgMHhENCwgMHgwMSwgMHgzMywgMHhGRSwKKwkweDFCLCAweDAxLCAweDk0LCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ0LCAweEZGLCAweDQzLAorCTB4MDAsIDB4MzMsIDB4MDAsIDB4MjUsIDB4RkUsIDB4ODksIDB4MDUsIDB4RTAsIDB4RjIsIDB4OUMsIDB4MjYsCisJMHgzMywgMHgzNywgMHgxRSwgMHhGNiwgMHhGRCwgMHgwMSwgMHhCMCwgMHgwMCwgMHhDMCwgMHhGRSwgMHhFNiwKKwkweDAwLCAweEEyLCAweEZGLCAweDBDLCAweDAwLCAweDA3LCAweDAwLCAweEMxLCAweEZGLCAweDdGLCAweDAwLAorCTB4QjIsIDB4RkYsIDB4RjYsIDB4RkUsIDB4OEUsIDB4MDQsIDB4NTEsIDB4RjMsIDB4NDksIDB4MkQsIDB4OTgsCisJMHgzMSwgMHgyMywgMHhGNCwgMHhBMiwgMHgwMywgMHhBMCwgMHhGRiwgMHg1MSwgMHhGRiwgMHhBQSwgMHgwMCwKKwkweEI0LCAweEZGLCAweDA5LCAweDAwLCAweDBBLCAweDAwLCAweEFFLCAweEZGLCAweEJELCAweDAwLCAweDI1LAorCTB4RkYsIDB4RjEsIDB4RkYsIDB4MkIsIDB4MDMsIDB4QTUsIDB4RjQsIDB4NjgsIDB4MzMsIDB4NDgsIDB4MkIsCisJMHgxNywgMHhGMywgMHhFNywgMHgwNCwgMHhCMSwgMHhGRSwgMHhEQiwgMHhGRiwgMHg2QywgMHgwMCwgMHhDNywKKwkweEZGLCAweDA2LCAweDAwLCAweDBELCAweDAwLCAweDlFLCAweEZGLCAweEY3LCAweDAwLCAweDk0LCAweEZFLAorCTB4MDksIDB4MDEsIDB4NkEsIDB4MDEsIDB4RUIsIDB4RjYsIDB4QzEsIDB4MzgsIDB4N0QsIDB4MjQsIDB4RTgsCisJMHhGMiwgMHhDMSwgMHgwNSwgMHhFRSwgMHhGRCwgMHg1NywgMHgwMCwgMHgzMSwgMHgwMCwgMHhEQSwgMHhGRiwKKwkweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDkxLCAweEZGLCAweDI5LCAweDAxLCAweDA5LCAweEZFLCAweDJGLAorCTB4MDIsIDB4NUYsIDB4RkYsIDB4MjcsIDB4RkEsIDB4MjAsIDB4M0QsIDB4NzAsIDB4MUQsIDB4N0QsIDB4RjMsCisJMHgzMSwgMHgwNiwgMHg1RSwgMHhGRCwgMHhCRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhFQiwgMHhGRiwgMHgwMiwKKwkweDAwLCAweDExLCAweDAwLCAweDhCLCAweEZGLCAweDRFLCAweDAxLCAweDhFLCAweEZELCAweDUyLCAweDAzLAorCTB4MjAsIDB4RkQsIDB4NTIsIDB4RkUsIDB4NjAsIDB4NDAsIDB4NjMsIDB4MTYsIDB4QjcsIDB4RjQsIDB4MzksCisJMHgwNiwgMHgwNSwgMHhGRCwgMHgwRiwgMHgwMSwgMHhEMSwgMHhGRiwgMHhGOSwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDEwLCAweDAwLCAweDhELCAweEZGLCAweDYyLCAweDAxLCAweDJFLCAweEZELCAweDVFLCAweDA0LCAweENDLAorCTB4RkEsIDB4NUIsIDB4MDMsIDB4NUUsIDB4NDIsIDB4OEUsIDB4MEYsIDB4NzEsIDB4RjYsIDB4RTQsIDB4MDUsCisJMHhFMiwgMHhGQywgMHg0NSwgMHgwMSwgMHhBRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDBCLCAweDAwLCAweDk5LCAweEZGLCAweDYwLCAweDAxLCAweEYyLCAweEZDLCAweDQwLCAweDA1LAorCTB4ODUsIDB4RjgsIDB4MjYsIDB4MDksIDB4MEMsIDB4NDMsIDB4MjYsIDB4MDksIDB4ODUsIDB4RjgsIDB4NDAsCisJMHgwNSwgMHhGMiwgMHhGQywgMHg2MCwgMHgwMSwgMHg5OSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDA0LCAweDAwLCAweEFGLCAweEZGLCAweDQ1LCAweDAxLCAweEUyLCAweEZDLCAweEU0LCAweDA1LCAweDcxLAorCTB4RjYsIDB4OEUsIDB4MEYsIDB4NUUsIDB4NDIsIDB4NUIsIDB4MDMsIDB4Q0MsIDB4RkEsIDB4NUUsIDB4MDQsCisJMHgyRSwgMHhGRCwgMHg2MiwgMHgwMSwgMHg4RCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwKKwkweEZGLCAweEQxLCAweEZGLCAweDBGLCAweDAxLCAweDA1LCAweEZELCAweDM5LCAweDA2LCAweEI3LCAweEY0LAorCTB4NjMsIDB4MTYsIDB4NjAsIDB4NDAsIDB4NTIsIDB4RkUsIDB4MjAsIDB4RkQsIDB4NTIsIDB4MDMsIDB4OEUsCisJMHhGRCwgMHg0RSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFQiwgMHhGRiwKKwkweEZELCAweEZGLCAweEJGLCAweDAwLCAweDVFLCAweEZELCAweDMxLCAweDA2LCAweDdELCAweEYzLCAweDcwLAorCTB4MUQsIDB4MjAsIDB4M0QsIDB4MjcsIDB4RkEsIDB4NUYsIDB4RkYsIDB4MkYsIDB4MDIsIDB4MDksIDB4RkUsCisJMHgyOSwgMHgwMSwgMHg5MSwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhEQSwgMHhGRiwgMHgzMSwKKwkweDAwLCAweDU3LCAweDAwLCAweEVFLCAweEZELCAweEMxLCAweDA1LCAweEU4LCAweEYyLCAweDdELCAweDI0LAorCTB4QzEsIDB4MzgsIDB4RUIsIDB4RjYsIDB4NkEsIDB4MDEsIDB4MDksIDB4MDEsIDB4OTQsIDB4RkUsIDB4RjcsCisJMHgwMCwgMHg5RSwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDNywgMHhGRiwgMHg2QywgMHgwMCwKKwkweERCLCAweEZGLCAweEIxLCAweEZFLCAweEU3LCAweDA0LCAweDE3LCAweEYzLCAweDQ4LCAweDJCLCAweDY4LAorCTB4MzMsIDB4QTUsIDB4RjQsIDB4MkIsIDB4MDMsIDB4RjEsIDB4RkYsIDB4MjUsIDB4RkYsIDB4QkQsIDB4MDAsCisJMHhBRSwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCNCwgMHhGRiwgMHhBQSwgMHgwMCwgMHg1MSwKKwkweEZGLCAweEEwLCAweEZGLCAweEEyLCAweDAzLCAweDIzLCAweEY0LCAweDk4LCAweDMxLCAweDQ5LCAweDJELAorCTB4NTEsIDB4RjMsIDB4OEUsIDB4MDQsIDB4RjYsIDB4RkUsIDB4QjIsIDB4RkYsIDB4N0YsIDB4MDAsIDB4QzEsCisJMHhGRiwgMHgwNywgMHgwMCwgMHgwQywgMHgwMCwgMHhBMiwgMHhGRiwgMHhFNiwgMHgwMCwgMHhDMCwgMHhGRSwKKwkweEIwLCAweDAwLCAweEZELCAweDAxLCAweDFFLCAweEY2LCAweDMzLCAweDM3LCAweDlDLCAweDI2LCAweEUwLAorCTB4RjIsIDB4ODksIDB4MDUsIDB4MjUsIDB4RkUsIDB4MzMsIDB4MDAsIDB4NDMsIDB4MDAsIDB4RDQsIDB4RkYsCisJMHgwNCwgMHgwMCwgMHgwRiwgMHgwMCwgMHg5NCwgMHhGRiwgMHgxQiwgMHgwMSwgMHgzMywgMHhGRSwgMHhENCwKKwkweDAxLCAweDA3LCAweDAwLCAweDBFLCAweEY5LCAweEU2LCAweDNCLCAweDlGLCAweDFGLCAweDNDLCAweEYzLAorCTB4MUEsIDB4MDYsIDB4ODUsIDB4RkQsIDB4QTIsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RTYsIDB4RkYsIDB4MDIsCisJMHgwMCwgMHgxMSwgMHgwMCwgMHg4QywgMHhGRiwgMHg0NSwgMHgwMSwgMHhCMiwgMHhGRCwgMHhGQSwgMHgwMiwKKwkweEQ1LCAweEZELCAweEYxLCAweEZDLCAweDgxLCAweDNGLCAweDhCLCAweDE4LCAweDQ3LCAweEY0LCAweDQxLAorCTB4MDYsIDB4MUIsIDB4RkQsIDB4RjksIDB4MDAsIDB4REQsIDB4RkYsIDB4RjUsIDB4RkYsIDB4MDEsIDB4MDAsCisJMHgxMCwgMHgwMCwgMHg4QiwgMHhGRiwgMHg1RSwgMHgwMSwgMHg0OCwgMHhGRCwgMHgwRiwgMHgwNCwgMHg4NCwKKwkweEZCLCAweEI4LCAweDAxLCAweEU0LCAweDQxLCAweDlGLCAweDExLCAweERFLCAweEY1LCAweDA3LCAweDA2LAorCTB4RTcsIDB4RkMsIDB4MzcsIDB4MDEsIDB4QjgsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsCisJMHgwMCwgMHg5NCwgMHhGRiwgMHg2MywgMHgwMSwgMHgwMCwgMHhGRCwgMHgwMCwgMHgwNSwgMHgzNSwgMHhGOSwKKwkweDRCLCAweDA3LCAweEZCLCAweDQyLCAweDEwLCAweDBCLCAweERBLCAweEY3LCAweDdBLCAweDA1LCAweEU4LAorCTB4RkMsIDB4NUEsIDB4MDEsIDB4OUUsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwNywgMHgwMCwgMHhBNywgMHhGRiwgMHg1MCwgMHgwMSwgMHhFMiwgMHhGQywgMHhCOSwgMHgwNSwgMHgwRCwKKwkweEY3LCAweDg3LCAweDBELCAweEI4LCAweDQyLCAweDEwLCAweDA1LCAweDE2LCAweEZBLCAweEE5LCAweDA0LAorCTB4MTcsIDB4RkQsIDB4NjQsIDB4MDEsIDB4OEYsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHhDNSwgMHhGRiwgMHgyMiwgMHgwMSwgMHhGNSwgMHhGQywgMHgyOCwgMHgwNiwgMHgzMywgMHhGNSwKKwkweDQwLCAweDE0LCAweDIwLCAweDQxLCAweEM4LCAweEZGLCAweDY5LCAweEZDLCAweEE4LCAweDAzLCAweDZELAorCTB4RkQsIDB4NTcsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjAsIDB4RkYsCisJMHhFRSwgMHhGRiwgMHhEQiwgMHgwMCwgMHgzRCwgMHhGRCwgMHgzRSwgMHgwNiwgMHhDRSwgMHhGMywgMHg0MiwKKwkweDFCLCAweDQwLCAweDNFLCAweDU2LCAweEZCLCAweEIyLCAweEZFLCAweDhBLCAweDAyLCAweEUxLCAweEZELAorCTB4MzYsIDB4MDEsIDB4OEUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4REYsIDB4RkYsIDB4MjAsCisJMHgwMCwgMHg3QSwgMHgwMCwgMHhCQywgMHhGRCwgMHhFRiwgMHgwNSwgMHgwMiwgMHhGMywgMHg1NSwgMHgyMiwKKwkweDM1LCAweDNBLCAweEQwLCAweEY3LCAweEQwLCAweDAwLCAweDYzLCAweDAxLCAweDY4LCAweEZFLCAweDA3LAorCTB4MDEsIDB4OTksIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4NUEsIDB4MDAsCisJMHgwMywgMHgwMCwgMHg3MCwgMHhGRSwgMHgzNSwgMHgwNSwgMHhGMiwgMHhGMiwgMHgzQiwgMHgyOSwgMHgyNCwKKwkweDM1LCAweDNFLCAweEY1LCAweEFBLCAweDAyLCAweDQ0LCAweDAwLCAweEY4LCAweEZFLCAweENGLCAweDAwLAorCTB4QTksIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkEsIDB4RkYsIDB4OTcsIDB4MDAsIDB4N0MsCisJMHhGRiwgMHg1MiwgMHhGRiwgMHgxMSwgMHgwNCwgMHhCOCwgMHhGMywgMHhCOCwgMHgyRiwgMHgzRCwgMHgyRiwKKwkweEExLCAweEYzLCAweDJCLCAweDA0LCAweDNGLCAweEZGLCAweDg3LCAweEZGLCAweDkyLCAweDAwLCAweEJCLAorCTB4RkYsIDB4MDgsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RDQsIDB4MDAsIDB4RUQsIDB4RkUsCisJMHg1QSwgMHgwMCwgMHg4OCwgMHgwMiwgMHg2OCwgMHhGNSwgMHg5MSwgMHgzNSwgMHhCNiwgMHgyOCwgMHhFQywKKwkweEYyLCAweDQ4LCAweDA1LCAweDYwLCAweEZFLCAweDBELCAweDAwLCAweDU1LCAweDAwLCAweENFLCAweEZGLAorCTB4MDUsIDB4MDAsIDB4MEUsIDB4MDAsIDB4OTgsIDB4RkYsIDB4MEIsIDB4MDEsIDB4NUQsIDB4RkUsIDB4NzksCisJMHgwMSwgMHhBOSwgMHgwMCwgMHgwRCwgMHhGOCwgMHg4RiwgMHgzQSwgMHhDQiwgMHgyMSwgMHgwQywgMHhGMywKKwkweEY5LCAweDA1LCAweEIwLCAweEZELCAweDgyLCAweDAwLCAweDFDLCAweDAwLCAweEUxLCAweEZGLCAweDAzLAorCTB4MDAsIDB4MTAsIDB4MDAsIDB4OEUsIDB4RkYsIDB4MzksIDB4MDEsIDB4RDcsIDB4RkQsIDB4QTAsIDB4MDIsCisJMHg4NiwgMHhGRSwgMHhBNiwgMHhGQiwgMHg4NSwgMHgzRSwgMHhCNywgMHgxQSwgMHhFNCwgMHhGMywgMHg0MCwKKwkweDA2LCAweDM1LCAweEZELCAweEUxLCAweDAwLCAweEVCLCAweEZGLCAweEYxLCAweEZGLCAweDAxLCAweDAwLAorCTB4MTEsIDB4MDAsIDB4OEEsIDB4RkYsIDB4NTgsIDB4MDEsIDB4NjYsIDB4RkQsIDB4QkQsIDB4MDMsIDB4M0MsCisJMHhGQywgMHgyOSwgMHgwMCwgMHg0QSwgMHg0MSwgMHhCOCwgMHgxMywgMHg1NCwgMHhGNSwgMHgyMiwgMHgwNiwKKwkweEYxLCAweEZDLCAweDI3LCAweDAxLCAweEMyLCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDBFLAorCTB4MDAsIDB4OTAsIDB4RkYsIDB4NjQsIDB4MDEsIDB4MTIsIDB4RkQsIDB4QkIsIDB4MDQsIDB4RTgsIDB4RjksCisJMHg4MSwgMHgwNSwgMHhDQiwgMHg0MiwgMHgwOCwgMHgwRCwgMHgzNSwgMHhGNywgMHhBRCwgMHgwNSwgMHhFMiwKKwkweEZDLCAweDUyLCAweDAxLCAweEE1LCAweEZGLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDksIDB4MDAsIDB4QTAsIDB4RkYsIDB4NTgsIDB4MDEsIDB4RTYsIDB4RkMsIDB4ODcsIDB4MDUsIDB4QjAsCisJMHhGNywgMHg4RCwgMHgwQiwgMHhGMiwgMHg0MiwgMHhENywgMHgwNiwgMHg2MiwgMHhGOSwgMHhFRiwgMHgwNCwKKwkweDA0LCAweEZELCAweDYzLCAweDAxLCAweDkzLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4QkIsIDB4RkYsIDB4MzMsIDB4MDEsIDB4RTksIDB4RkMsIDB4MEYsIDB4MDYsIDB4QkEsIDB4RjUsCisJMHgyNCwgMHgxMiwgMHhDMiwgMHg0MSwgMHg1MywgMHgwMSwgMHhCMiwgMHhGQiwgMHhGQiwgMHgwMywgMHg0RiwKKwkweEZELCAweDVELCAweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY0LCAweEZGLAorCTB4RTAsIDB4RkYsIDB4RjMsIDB4MDAsIDB4MjEsIDB4RkQsIDB4NDEsIDB4MDYsIDB4MkQsIDB4RjQsIDB4MTYsCisJMHgxOSwgMHg0NSwgMHgzRiwgMHg5QywgMHhGQywgMHgwMSwgMHhGRSwgMHhFNCwgMHgwMiwgMHhCQiwgMHhGRCwKKwkweDQyLCAweDAxLCAweDhDLCAweEZGLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweEU1LCAweEZGLCAweDEwLAorCTB4MDAsIDB4OUEsIDB4MDAsIDB4OEYsIDB4RkQsIDB4MTIsIDB4MDYsIDB4MkUsIDB4RjMsIDB4MkEsIDB4MjAsCisJMHg5MiwgMHgzQiwgMHhDQywgMHhGOCwgMHgzMCwgMHgwMCwgMHhCRCwgMHgwMSwgMHgzRCwgMHhGRSwgMHgxNywKKwkweDAxLCAweDk1LCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQzLCAweEZGLCAweDQ3LCAweDAwLAorCTB4MkEsIDB4MDAsIDB4MzMsIDB4RkUsIDB4N0EsIDB4MDUsIDB4RTEsIDB4RjIsIDB4MjQsIDB4MjcsIDB4Q0QsCisJMHgzNiwgMHhFRSwgMHhGNSwgMHgyMSwgMHgwMiwgMHg5QiwgMHgwMCwgMHhDQiwgMHhGRSwgMHhFMSwgMHgwMCwKKwkweEE0LCAweEZGLCAweDBDLCAweDAwLCAweDA3LCAweDAwLCAweEMwLCAweEZGLCAweDg0LCAweDAwLCAweEE3LAorCTB4RkYsIDB4MDgsIDB4RkYsIDB4NzYsIDB4MDQsIDB4NjMsIDB4RjMsIDB4QzgsIDB4MkQsIDB4MjIsIDB4MzEsCisJMHgwNiwgMHhGNCwgMHhCRiwgMHgwMywgMHg4QywgMHhGRiwgMHg1QywgMHhGRiwgMHhBNSwgMHgwMCwgMHhCNSwKKwkweEZGLCAweDA5LCAweDAwLCAweDBBLCAweDAwLCAweEFELCAweEZGLCAweEMxLCAweDAwLCAweDFBLCAweEZGLAorCTB4MDUsIDB4MDAsIDB4MEIsIDB4MDMsIDB4QzksIDB4RjQsIDB4RDgsIDB4MzMsIDB4QzUsIDB4MkEsIDB4MEMsCisJMHhGMywgMHhGQiwgMHgwNCwgMHhBMCwgMHhGRSwgMHhFNSwgMHhGRiwgMHg2OCwgMHgwMCwgMHhDOSwgMHhGRiwKKwkweDA2LCAweDAwLCAweDBELCAweDAwLCAweDlDLCAweEZGLCAweEZCLCAweDAwLCAweDg5LCAweEZFLCAweDFGLAorCTB4MDEsIDB4NDQsIDB4MDEsIDB4MjIsIDB4RjcsIDB4MjAsIDB4MzksIDB4RjMsIDB4MjMsIDB4RUQsIDB4RjIsCisJMHhDRSwgMHgwNSwgMHhFMSwgMHhGRCwgMHg2MCwgMHgwMCwgMHgyRCwgMHgwMCwgMHhEQiwgMHhGRiwgMHgwMywKKwkweDAwLCAweDEwLCAweDAwLCAweDkwLCAweEZGLCAweDJELCAweDAxLCAweEZGLCAweEZELCAweDQ2LCAweDAyLAorCTB4MzQsIDB4RkYsIDB4NzEsIDB4RkEsIDB4NkIsIDB4M0QsIDB4RTUsIDB4MUMsIDB4OTAsIDB4RjMsIDB4MzUsCisJMHgwNiwgMHg1NSwgMHhGRCwgMHhDNiwgMHgwMCwgMHhGOSwgMHhGRiwgMHhFQywgMHhGRiwgMHgwMSwgMHgwMCwKKwkweDExLCAweDAwLCAweDhCLCAweEZGLCAweDUxLCAweDAxLCAweDg2LCAweEZELCAweDY4LCAweDAzLCAweEYzLAorCTB4RkMsIDB4QUUsIDB4RkUsIDB4OTIsIDB4NDAsIDB4REEsIDB4MTUsIDB4RDUsIDB4RjQsIDB4MzUsIDB4MDYsCisJMHgwMCwgMHhGRCwgMHgxNCwgMHgwMSwgMHhDRSwgMHhGRiwgMHhGQSwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwKKwkweDAwLCAweDhELCAweEZGLCAweDYzLCAweDAxLCAweDI4LCAweEZELCAweDcxLCAweDA0LCAweDlFLCAweEZBLAorCTB4QzcsIDB4MDMsIDB4NzksIDB4NDIsIDB4MEIsIDB4MEYsIDB4OTcsIDB4RjYsIDB4REEsIDB4MDUsIDB4RTIsCisJMHhGQywgMHg0OCwgMHgwMSwgMHhBRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDBCLCAweDAwLCAweDlBLCAweEZGLCAweDVGLCAweDAxLCAweEVGLCAweEZDLCAweDRGLCAweDA1LCAweDVBLAorCTB4RjgsIDB4OUYsIDB4MDksIDB4MEEsIDB4NDMsIDB4QUUsIDB4MDgsIDB4QjEsIDB4RjgsIDB4MzAsIDB4MDUsCisJMHhGNSwgMHhGQywgMHg2MSwgMHgwMSwgMHg5NywgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywKKwkweDAwLCAweEIxLCAweEZGLCAweDQxLCAweDAxLCAweEUzLCAweEZDLCAweEVELCAweDA1LCAweDRDLCAweEY2LAorCTB4MTEsIDB4MTAsIDB4NDIsIDB4NDIsIDB4RjEsIDB4MDIsIDB4RkEsIDB4RkEsIDB4NEIsIDB4MDQsIDB4MzQsCisJMHhGRCwgMHg2MSwgMHgwMSwgMHg4QywgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGOCwgMHhGRiwKKwkweEQ0LCAweEZGLCAweDBBLCAweDAxLCAweDBBLCAweEZELCAweDNDLCAweDA2LCAweDlBLCAweEY0LCAweEVELAorCTB4MTYsIDB4MkEsIDB4NDAsIDB4RjgsIDB4RkQsIDB4NEQsIDB4RkQsIDB4M0MsIDB4MDMsIDB4OTcsIDB4RkQsCisJMHg0QywgMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwMCwKKwkweDAwLCAweEI4LCAweDAwLCAweDY3LCAweEZELCAweDJDLCAweDA2LCAweDZCLCAweEYzLCAweEZDLCAweDFELAorCTB4RDMsIDB4M0MsIDB4REYsIDB4RjksIDB4ODksIDB4RkYsIDB4MTgsIDB4MDIsIDB4MTMsIDB4RkUsIDB4MjYsCisJMHgwMSwgMHg5MiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhEOSwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDRFLCAweDAwLCAweEZCLCAweEZELCAweEI0LCAweDA1LCAweEU0LCAweEYyLCAweDA0LCAweDI1LCAweDVGLAorCTB4MzgsIDB4QjYsIDB4RjYsIDB4OTAsIDB4MDEsIDB4RjMsIDB4MDAsIDB4OUYsIDB4RkUsIDB4RjMsIDB4MDAsCisJMHg5RiwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDNiwgMHhGRiwgMHg3MSwgMHgwMCwgMHhEMSwKKwkweEZGLCAweEMyLCAweEZFLCAweEQxLCAweDA0LCAweDIzLCAweEYzLCAweEM5LCAweDJCLCAweEY1LCAweDMyLAorCTB4ODMsIDB4RjQsIDB4NDksIDB4MDMsIDB4REMsIDB4RkYsIDB4MzAsIDB4RkYsIDB4QjgsIDB4MDAsIDB4QjAsCisJMHhGRiwgMHgwQSwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCMywgMHhGRiwgMHhBRSwgMHgwMCwgMHg0NiwgMHhGRiwKKwkweEI0LCAweEZGLCAweDg1LCAweDAzLCAweDQyLCAweEY0LCAweDBFLCAweDMyLCAweENBLCAweDJDLCAweDQxLAorCTB4RjMsIDB4QTUsIDB4MDQsIDB4RTQsIDB4RkUsIDB4QkMsIDB4RkYsIDB4N0EsIDB4MDAsIDB4QzMsIDB4RkYsCisJMHgwNywgMHgwMCwgMHgwRCwgMHgwMCwgMHhBMSwgMHhGRiwgMHhFQSwgMHgwMCwgMHhCNSwgMHhGRSwgMHhDNiwKKwkweDAwLCAweEQ5LCAweDAxLCAweDRGLCAweEY2LCAweDk5LCAweDM3LCAweDE2LCAweDI2LCAweEUwLCAweEYyLAorCTB4OTgsIDB4MDUsIDB4MTYsIDB4RkUsIDB4M0MsIDB4MDAsIDB4M0YsIDB4MDAsIDB4RDYsIDB4RkYsIDB4MDQsCisJMHgwMCwgMHgwRiwgMHgwMCwgMHg5MywgMHhGRiwgMHgxRiwgMHgwMSwgMHgyOCwgMHhGRSwgMHhFQiwgMHgwMSwKKwkweERELCAweEZGLCAweDUyLCAweEY5LCAweDM2LCAweDNDLCAweDEzLCAweDFGLCAweDRCLCAweEYzLCAweDIwLAorCTB4MDYsIDB4N0IsIDB4RkQsIDB4QTksIDB4MDAsIDB4MDgsIDB4MDAsIDB4RTcsIDB4RkYsIDB4MDIsIDB4MDAsCisJMHgxMSwgMHgwMCwgMHg4QywgMHhGRiwgMHg0NywgMHgwMSwgMHhBOSwgMHhGRCwgMHgxMCwgMHgwMywgMHhBOCwKKwkweEZELCAweDQ3LCAweEZELCAweEJCLCAweDNGLCAweDAxLCAweDE4LCAweDYyLCAweEY0LCAweDQwLCAweDA2LAorCTB4MTUsIDB4RkQsIDB4RkYsIDB4MDAsIDB4REEsIDB4RkYsIDB4RjYsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsCisJMHgwMCwgMHg4QiwgMHhGRiwgMHg1RiwgMHgwMSwgMHg0MSwgMHhGRCwgMHgyMywgMHgwNCwgMHg1NiwgMHhGQiwKKwkweDFGLCAweDAyLCAweDA2LCAweDQyLCAweDE5LCAweDExLCAweDAyLCAweEY2LCAweEZGLCAweDA1LCAweEU1LAorCTB4RkMsIDB4M0IsIDB4MDEsIDB4QjYsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsCisJMHg5NSwgMHhGRiwgMHg2MiwgMHgwMSwgMHhGQywgMHhGQywgMHgxMCwgMHgwNSwgMHgwOSwgMHhGOSwgMHhDMSwKKwkweDA3LCAweDAzLCAweDQzLCAweDk0LCAweDBBLCAweDA1LCAweEY4LCAweDZDLCAweDA1LCAweEVBLCAweEZDLAorCTB4NUMsIDB4MDEsIDB4OUQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsCisJMHgwMCwgMHhBOSwgMHhGRiwgMHg0RCwgMHgwMSwgMHhFMSwgMHhGQywgMHhDNCwgMHgwNSwgMHhFNiwgMHhGNiwKKwkweDA4LCAweDBFLCAweEE1LCAweDQyLCAweEExLCAweDA0LCAweDQzLCAweEZBLCAweDk3LCAweDA0LCAweDFELAorCTB4RkQsIDB4NjQsIDB4MDEsIDB4OEYsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RkYsCisJMHhDOCwgMHhGRiwgMHgxRSwgMHgwMSwgMHhGOCwgMHhGQywgMHgyRCwgMHgwNiwgMHgxMywgMHhGNSwgMHhDOCwKKwkweDE0LCAweEYyLCAweDQwLCAweDY5LCAweEZGLCAweDk3LCAweEZDLCAweDkyLCAweDAzLCAweDc1LCAweEZELAorCTB4NTUsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RjIsCisJMHhGRiwgMHhENCwgMHgwMCwgMHg0NSwgMHhGRCwgMHgzQiwgMHgwNiwgMHhCOCwgMHhGMywgMHhDRSwgMHgxQiwKKwkweEZCLCAweDNELCAweDA4LCAweEZCLCAweERFLCAweEZFLCAweDczLCAweDAyLCAweEVCLCAweEZELCAweDMzLAorCTB4MDEsIDB4OEYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4REUsIDB4RkYsIDB4MjUsIDB4MDAsCisJMHg3MSwgMHgwMCwgMHhDOCwgMHhGRCwgMHhFNSwgMHgwNSwgMHhGQSwgMHhGMiwgMHhERiwgMHgyMiwgMHhEQiwKKwkweDM5LCAweDk0LCAweEY3LCAweEY3LCAweDAwLCAweDRDLCAweDAxLCAweDczLCAweEZFLCAweDAzLCAweDAxLAorCTB4OUEsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4Q0MsIDB4RkYsIDB4NUUsIDB4MDAsIDB4RjksCisJMHhGRiwgMHg4MCwgMHhGRSwgMHgyMywgMHgwNSwgMHhGOSwgMHhGMiwgMHhDMCwgMHgyOSwgMHhCOCwgMHgzNCwKKwkweDE2LCAweEY1LCAweENCLCAweDAyLCAweDJGLCAweDAwLCAweDAzLCAweEZGLCAweENBLCAweDAwLCAweEFBLAorCTB4RkYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QjgsIDB4RkYsIDB4OUIsIDB4MDAsIDB4NzIsIDB4RkYsCisJMHg2NSwgMHhGRiwgMHhGNiwgMHgwMywgMHhEMSwgMHhGMywgMHgzMSwgMHgzMCwgMHhDMSwgMHgyRSwgMHg4QiwKKwkweEYzLCAweDQ1LCAweDA0LCAweDJELCAweEZGLCAweDkyLCAweEZGLCAweDhELCAweDAwLCAweEJELCAweEZGLAorCTB4MDgsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QTYsIDB4RkYsIDB4RDgsIDB4MDAsIDB4RTIsIDB4RkUsIDB4NkYsCisJMHgwMCwgMHg2NiwgMHgwMiwgMHg5MywgMHhGNSwgMHhGQiwgMHgzNSwgMHgzMSwgMHgyOCwgMHhFNywgMHhGMiwKKwkweDU5LCAweDA1LCAweDUxLCAweEZFLCAweDE3LCAweDAwLCAweDUwLCAweDAwLCAweEQwLCAweEZGLCAweDA1LAorCTB4MDAsIDB4MEUsIDB4MDAsIDB4OTcsIDB4RkYsIDB4MEYsIDB4MDEsIDB4NTMsIDB4RkUsIDB4OTAsIDB4MDEsCisJMHg4MSwgMHgwMCwgMHg0QiwgMHhGOCwgMHhFNiwgMHgzQSwgMHgzRiwgMHgyMSwgMHgxNiwgMHhGMywgMHgwMiwKKwkweDA2LCAweEE1LCAweEZELCAweDhBLCAweDAwLCAweDE4LCAweDAwLCAweEUyLCAweEZGLCAweDAyLCAweDAwLAorCTB4MTAsIDB4MDAsIDB4OEQsIDB4RkYsIDB4M0MsIDB4MDEsIDB4Q0UsIDB4RkQsIDB4QjcsIDB4MDIsIDB4NUEsCisJMHhGRSwgMHhGNywgMHhGQiwgMHhDNiwgMHgzRSwgMHgyQywgMHgxQSwgMHhGQywgMHhGMywgMHg0MSwgMHgwNiwKKwkweDJFLCAweEZELCAweEU3LCAweDAwLCAweEU3LCAweEZGLCAweEYyLCAweEZGLCAweDAxLCAweDAwLCAweDEwLAorCTB4MDAsIDB4OEIsIDB4RkYsIDB4NUEsIDB4MDEsIDB4NUUsIDB4RkQsIDB4RDIsIDB4MDMsIDB4MEUsIDB4RkMsCisJMHg4QiwgMHgwMCwgMHg3NSwgMHg0MSwgMHgzMiwgMHgxMywgMHg3NSwgMHhGNSwgMHgxQywgMHgwNiwgMHhFRSwKKwkweEZDLCAweDJCLCAweDAxLCAweEMwLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBFLCAweDAwLAorCTB4OTEsIDB4RkYsIDB4NjQsIDB4MDEsIDB4MEQsIDB4RkQsIDB4Q0QsIDB4MDQsIDB4QkIsIDB4RjksIDB4RjIsCisJMHgwNSwgMHhEOSwgMHg0MiwgMHg4OCwgMHgwQywgMHg1RSwgMHhGNywgMHhBMSwgMHgwNSwgMHhFMywgMHhGQywKKwkweDU0LCAweDAxLCAweEEzLCAweEZGLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA5LAorCTB4MDAsIDB4QTIsIDB4RkYsIDB4NTYsIDB4MDEsIDB4RTUsIDB4RkMsIDB4OTQsIDB4MDUsIDB4ODcsIDB4RjcsCisJMHgwQSwgMHgwQywgMHhFNiwgMHg0MiwgMHg2NCwgMHgwNiwgMHg4RSwgMHhGOSwgMHhERSwgMHgwNCwgMHgwOSwKKwkweEZELCAweDY0LCAweDAxLCAweDkyLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4QkQsIDB4RkYsIDB4MkYsIDB4MDEsIDB4RUMsIDB4RkMsIDB4MTYsIDB4MDYsIDB4OTgsIDB4RjUsIDB4QUIsCisJMHgxMiwgMHg5QywgMHg0MSwgMHhFRSwgMHgwMCwgMHhFMCwgMHhGQiwgMHhFNiwgMHgwMywgMHg1NywgMHhGRCwKKwkweDVCLCAweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEYzLCAweEZGLCAweEU0LAorCTB4RkYsIDB4RUQsIDB4MDAsIDB4MjcsIDB4RkQsIDB4NDEsIDB4MDYsIDB4MTQsIDB4RjQsIDB4QTEsIDB4MTksCisJMHgwNiwgMHgzRiwgMHg0OSwgMHhGQywgMHgyRSwgMHhGRSwgMHhDRCwgMHgwMiwgMHhDNCwgMHhGRCwgMHgzRiwKKwkweDAxLCAweDhELCAweEZGLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweEUzLCAweEZGLCAweDE0LCAweDAwLAorCTB4OTIsIDB4MDAsIDB4OUEsIDB4RkQsIDB4MEEsIDB4MDYsIDB4MjIsIDB4RjMsIDB4QjQsIDB4MjAsIDB4M0MsCisJMHgzQiwgMHg4QiwgMHhGOCwgMHg1OCwgMHgwMCwgMHhBNywgMHgwMSwgMHg0OCwgMHhGRSwgMHgxMywgMHgwMSwKKwkweDk2LCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQxLCAweEZGLCAweDRDLCAweDAwLCAweDIwLAorCTB4MDAsIDB4NDIsIDB4RkUsIDB4NkEsIDB4MDUsIDB4RTMsIDB4RjIsIDB4QUIsIDB4MjcsIDB4NjYsIDB4MzYsCisJMHhDMCwgMHhGNSwgMHg0NCwgMHgwMiwgMHg4NSwgMHgwMCwgMHhENywgMHhGRSwgMHhERCwgMHgwMCwgMHhBNSwKKwkweEZGLCAweDBDLCAweDAwLCAweDA3LCAweDAwLCAweEJFLCAweEZGLCAweDg5LCAweDAwLCAweDlELCAweEZGLAorCTB4MUEsIDB4RkYsIDB4NUUsIDB4MDQsIDB4NzYsIDB4RjMsIDB4NDUsIDB4MkUsIDB4QUEsIDB4MzAsIDB4RUIsCisJMHhGMywgMHhEQiwgMHgwMywgMHg3OSwgMHhGRiwgMHg2NywgMHhGRiwgMHhBMCwgMHgwMCwgMHhCNywgMHhGRiwKKwkweDA5LCAweDAwLCAweDBCLCAweDAwLCAweEFDLCAweEZGLCAweEM2LCAweDAwLCAweDBFLCAweEZGLCAweDFBLAorCTB4MDAsIDB4RUIsIDB4MDIsIDB4RUYsIDB4RjQsIDB4NDksIDB4MzQsIDB4NDMsIDB4MkEsIDB4MDIsIDB4RjMsCisJMHgwRiwgMHgwNSwgMHg5MCwgMHhGRSwgMHhFRiwgMHhGRiwgMHg2MywgMHgwMCwgMHhDQSwgMHhGRiwgMHgwNiwKKwkweDAwLCAweDBFLCAweDAwLCAweDlCLCAweEZGLCAweEZGLCAweDAwLCAweDdFLCAweEZFLCAweDM2LCAweDAxLAorCTB4MUUsIDB4MDEsIDB4NUIsIDB4RjcsIDB4N0UsIDB4MzksIDB4NjksIDB4MjMsIDB4RjMsIDB4RjIsIDB4RDksCisJMHgwNSwgMHhENCwgMHhGRCwgMHg2OSwgMHgwMCwgMHgyOSwgMHgwMCwgMHhERCwgMHhGRiwgMHgwMywgMHgwMCwKKwkweDEwLCAweDAwLCAweDkwLCAweEZGLCAweDMwLCAweDAxLCAweEY1LCAweEZELCAweDVDLCAweDAyLCAweDA5LAorCTB4RkYsIDB4QkMsIDB4RkEsIDB4QjUsIDB4M0QsIDB4NUEsIDB4MUMsIDB4QTMsIDB4RjMsIDB4MzgsIDB4MDYsCisJMHg0RCwgMHhGRCwgMHhDRCwgMHgwMCwgMHhGNSwgMHhGRiwgMHhFRCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMSwKKwkweDAwLCAweDhCLCAweEZGLCAweDUzLCAweDAxLCAweDdFLCAweEZELCAweDdELCAweDAzLCAweEM1LCAweEZDLAorCTB4MEIsIDB4RkYsIDB4QzMsIDB4NDAsIDB4NTEsIDB4MTUsIDB4RjQsIDB4RjQsIDB4MzEsIDB4MDYsIDB4RkMsCisJMHhGQywgMHgxOSwgMHgwMSwgMHhDQiwgMHhGRiwgMHhGQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwKKwkweDhFLCAweEZGLCAweDYzLCAweDAxLCAweDIyLCAweEZELCAweDg0LCAweDA0LCAweDcxLCAweEZBLCAweDM0LAorCTB4MDQsIDB4OTAsIDB4NDIsIDB4ODksIDB4MEUsIDB4QkUsIDB4RjYsIDB4Q0YsIDB4MDUsIDB4RTEsIDB4RkMsCisJMHg0QSwgMHgwMSwgMHhBQiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwKKwkweDAwLCAweDlCLCAweEZGLCAweDVELCAweDAxLCAweEVDLCAweEZDLCAweDVELCAweDA1LCAweDJGLCAweEY4LAorCTB4MTksIDB4MEEsIDB4MDcsIDB4NDMsIDB4MzcsIDB4MDgsIDB4REQsIDB4RjgsIDB4MjEsIDB4MDUsIDB4RjgsCisJMHhGQywgMHg2MiwgMHgwMSwgMHg5NiwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwKKwkweEI0LCAweEZGLCAweDNFLCAweDAxLCAweEU0LCAweEZDLCAweEY2LCAweDA1LCAweDI2LCAweEY2LCAweDk1LAorCTB4MTAsIDB4MjYsIDB4NDIsIDB4ODcsIDB4MDIsIDB4MjgsIDB4RkIsIDB4MzcsIDB4MDQsIDB4M0IsIDB4RkQsCisJMHg2MCwgMHgwMSwgMHg4QywgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGNywgMHhGRiwgMHhENywKKwkweEZGLCAweDA0LCAweDAxLCAweDBGLCAweEZELCAweDNFLCAweDA2LCAweDdELCAweEY0LCAweDc2LCAweDE3LAorCTB4RjQsIDB4M0YsIDB4OUYsIDB4RkQsIDB4N0IsIDB4RkQsIDB4MjYsIDB4MDMsIDB4QTAsIDB4RkQsIDB4NEEsCisJMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwNCwgMHgwMCwKKwkweEIxLCAweDAwLCAweDcxLCAweEZELCAweDI2LCAweDA2LCAweDVBLCAweEYzLCAweDg4LCAweDFFLCAweDg3LAorCTB4M0MsIDB4OTgsIDB4RjksIDB4QjMsIDB4RkYsIDB4MDIsIDB4MDIsIDB4MUUsIDB4RkUsIDB4MjIsIDB4MDEsCisJMHg5MywgMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhENywgMHhGRiwgMHgzQSwgMHgwMCwgMHg0NSwKKwkweDAwLCAweDA5LCAweEZFLCAweEE3LCAweDA1LCAweEUxLCAweEYyLCAweDhELCAweDI1LCAweEZELCAweDM3LAorCTB4ODIsIDB4RjYsIDB4QjUsIDB4MDEsIDB4REMsIDB4MDAsIDB4QUEsIDB4RkUsIDB4RUUsIDB4MDAsIDB4QTAsCisJMHhGRiwgMHgwRCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDNCwgMHhGRiwgMHg3NiwgMHgwMCwgMHhDNywgMHhGRiwKKwkweEQzLCAweEZFLCAweEJDLCAweDA0LCAweDMxLCAweEYzLCAweDRBLCAweDJDLCAweDgzLCAweDMyLCAweDYxLAorCTB4RjQsIDB4NjgsIDB4MDMsIDB4QzgsIDB4RkYsIDB4M0IsIDB4RkYsIDB4QjMsIDB4MDAsIDB4QjEsIDB4RkYsCisJMHgwQSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhCMSwgMHhGRiwgMHhCMywgMHgwMCwgMHgzQiwgMHhGRiwgMHhDOCwKKwkweEZGLCAweDY4LCAweDAzLCAweDYxLCAweEY0LCAweDgzLCAweDMyLCAweDRBLCAweDJDLCAweDMxLCAweEYzLAorCTB4QkMsIDB4MDQsIDB4RDMsIDB4RkUsIDB4QzcsIDB4RkYsIDB4NzYsIDB4MDAsIDB4QzQsIDB4RkYsIDB4MDYsCisJMHgwMCwgMHgwRCwgMHgwMCwgMHhBMCwgMHhGRiwgMHhFRSwgMHgwMCwgMHhBQSwgMHhGRSwgMHhEQywgMHgwMCwKKwkweEI1LCAweDAxLCAweDgyLCAweEY2LCAweEZELCAweDM3LCAweDhELCAweDI1LCAweEUxLCAweEYyLCAweEE3LAorCTB4MDUsIDB4MDksIDB4RkUsIDB4NDUsIDB4MDAsIDB4M0EsIDB4MDAsIDB4RDcsIDB4RkYsIDB4MDQsIDB4MDAsCisJMHgwRiwgMHgwMCwgMHg5MywgMHhGRiwgMHgyMiwgMHgwMSwgMHgxRSwgMHhGRSwgMHgwMiwgMHgwMiwgMHhCMywKKwkweEZGLCAweDk4LCAweEY5LCAweDg3LCAweDNDLCAweDg4LCAweDFFLCAweDVBLCAweEYzLCAweDI2LCAweDA2LAorCTB4NzEsIDB4RkQsIDB4QjEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDIsIDB4MDAsIDB4MTEsCisJMHgwMCwgMHg4QiwgMHhGRiwgMHg0QSwgMHgwMSwgMHhBMCwgMHhGRCwgMHgyNiwgMHgwMywgMHg3QiwgMHhGRCwKKwkweDlGLCAweEZELCAweEY0LCAweDNGLCAweDc2LCAweDE3LCAweDdELCAweEY0LCAweDNFLCAweDA2LCAweDBGLAorCTB4RkQsIDB4MDQsIDB4MDEsIDB4RDcsIDB4RkYsIDB4RjcsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsCisJMHg4QywgMHhGRiwgMHg2MCwgMHgwMSwgMHgzQiwgMHhGRCwgMHgzNywgMHgwNCwgMHgyOCwgMHhGQiwgMHg4NywKKwkweDAyLCAweDI2LCAweDQyLCAweDk1LCAweDEwLCAweDI2LCAweEY2LCAweEY2LCAweDA1LCAweEU0LCAweEZDLAorCTB4M0UsIDB4MDEsIDB4QjQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4OTYsCisJMHhGRiwgMHg2MiwgMHgwMSwgMHhGOCwgMHhGQywgMHgyMSwgMHgwNSwgMHhERCwgMHhGOCwgMHgzNywgMHgwOCwKKwkweDA3LCAweDQzLCAweDE5LCAweDBBLCAweDJGLCAweEY4LCAweDVELCAweDA1LCAweEVDLCAweEZDLCAweDVELAorCTB4MDEsIDB4OUIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsCisJMHhBQiwgMHhGRiwgMHg0QSwgMHgwMSwgMHhFMSwgMHhGQywgMHhDRiwgMHgwNSwgMHhCRSwgMHhGNiwgMHg4OSwKKwkweDBFLCAweDkwLCAweDQyLCAweDM0LCAweDA0LCAweDcxLCAweEZBLCAweDg0LCAweDA0LCAweDIyLCAweEZELAorCTB4NjMsIDB4MDEsIDB4OEUsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RkYsIDB4Q0IsCisJMHhGRiwgMHgxOSwgMHgwMSwgMHhGQywgMHhGQywgMHgzMSwgMHgwNiwgMHhGNCwgMHhGNCwgMHg1MSwgMHgxNSwKKwkweEMzLCAweDQwLCAweDBCLCAweEZGLCAweEM1LCAweEZDLCAweDdELCAweDAzLCAweDdFLCAweEZELCAweDUzLAorCTB4MDEsIDB4OEIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUQsIDB4RkYsIDB4RjUsIDB4RkYsCisJMHhDRCwgMHgwMCwgMHg0RCwgMHhGRCwgMHgzOCwgMHgwNiwgMHhBMywgMHhGMywgMHg1QSwgMHgxQywgMHhCNSwKKwkweDNELCAweEJDLCAweEZBLCAweDA5LCAweEZGLCAweDVDLCAweDAyLCAweEY1LCAweEZELCAweDMwLCAweDAxLAorCTB4OTAsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4REQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NjksCisJMHgwMCwgMHhENCwgMHhGRCwgMHhEOSwgMHgwNSwgMHhGMywgMHhGMiwgMHg2OSwgMHgyMywgMHg3RSwgMHgzOSwKKwkweDVCLCAweEY3LCAweDFFLCAweDAxLCAweDM2LCAweDAxLCAweDdFLCAweEZFLCAweEZGLCAweDAwLCAweDlCLAorCTB4RkYsIDB4MEUsIDB4MDAsIDB4MDYsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4NjMsIDB4MDAsIDB4RUYsIDB4RkYsCisJMHg5MCwgMHhGRSwgMHgwRiwgMHgwNSwgMHgwMiwgMHhGMywgMHg0MywgMHgyQSwgMHg0OSwgMHgzNCwgMHhFRiwKKwkweEY0LCAweEVCLCAweDAyLCAweDFBLCAweDAwLCAweDBFLCAweEZGLCAweEM2LCAweDAwLCAweEFDLCAweEZGLAorCTB4MEIsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjcsIDB4RkYsIDB4QTAsIDB4MDAsIDB4NjcsIDB4RkYsIDB4NzksCisJMHhGRiwgMHhEQiwgMHgwMywgMHhFQiwgMHhGMywgMHhBQSwgMHgzMCwgMHg0NSwgMHgyRSwgMHg3NiwgMHhGMywKKwkweDVFLCAweDA0LCAweDFBLCAweEZGLCAweDlELCAweEZGLCAweDg5LCAweDAwLCAweEJFLCAweEZGLCAweDA3LAorCTB4MDAsIDB4MEMsIDB4MDAsIDB4QTUsIDB4RkYsIDB4REQsIDB4MDAsIDB4RDcsIDB4RkUsIDB4ODUsIDB4MDAsCisJMHg0NCwgMHgwMiwgMHhDMCwgMHhGNSwgMHg2NiwgMHgzNiwgMHhBQiwgMHgyNywgMHhFMywgMHhGMiwgMHg2QSwKKwkweDA1LCAweDQyLCAweEZFLCAweDIwLCAweDAwLCAweDRDLCAweDAwLCAweEQxLCAweEZGLCAweDA0LCAweDAwLAorCTB4MEYsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MTMsIDB4MDEsIDB4NDgsIDB4RkUsIDB4QTcsIDB4MDEsIDB4NTgsCisJMHgwMCwgMHg4QiwgMHhGOCwgMHgzQywgMHgzQiwgMHhCNCwgMHgyMCwgMHgyMiwgMHhGMywgMHgwQSwgMHgwNiwKKwkweDlBLCAweEZELCAweDkyLCAweDAwLCAweDE0LCAweDAwLCAweEUzLCAweEZGLCAweDAyLCAweDAwLCAweDEwLAorCTB4MDAsIDB4OEQsIDB4RkYsIDB4M0YsIDB4MDEsIDB4QzQsIDB4RkQsIDB4Q0QsIDB4MDIsIDB4MkUsIDB4RkUsCisJMHg0OSwgMHhGQywgMHgwNiwgMHgzRiwgMHhBMSwgMHgxOSwgMHgxNCwgMHhGNCwgMHg0MSwgMHgwNiwgMHgyNywKKwkweEZELCAweEVELCAweDAwLCAweEU0LCAweEZGLCAweEYzLCAweEZGLCAweDAxLCAweDAwLCAweDEwLCAweDAwLAorCTB4OEIsIDB4RkYsIDB4NUIsIDB4MDEsIDB4NTcsIDB4RkQsIDB4RTYsIDB4MDMsIDB4RTAsIDB4RkIsIDB4RUUsCisJMHgwMCwgMHg5QywgMHg0MSwgMHhBQiwgMHgxMiwgMHg5OCwgMHhGNSwgMHgxNiwgMHgwNiwgMHhFQywgMHhGQywKKwkweDJGLCAweDAxLCAweEJELCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDkyLAorCTB4RkYsIDB4NjQsIDB4MDEsIDB4MDksIDB4RkQsIDB4REUsIDB4MDQsIDB4OEUsIDB4RjksIDB4NjQsIDB4MDYsCisJMHhFNiwgMHg0MiwgMHgwQSwgMHgwQywgMHg4NywgMHhGNywgMHg5NCwgMHgwNSwgMHhFNSwgMHhGQywgMHg1NiwKKwkweDAxLCAweEEyLCAweEZGLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLAorCTB4QTMsIDB4RkYsIDB4NTQsIDB4MDEsIDB4RTMsIDB4RkMsIDB4QTEsIDB4MDUsIDB4NUUsIDB4RjcsIDB4ODgsCisJMHgwQywgMHhEOSwgMHg0MiwgMHhGMiwgMHgwNSwgMHhCQiwgMHhGOSwgMHhDRCwgMHgwNCwgMHgwRCwgMHhGRCwKKwkweDY0LCAweDAxLCAweDkxLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEMwLAorCTB4RkYsIDB4MkIsIDB4MDEsIDB4RUUsIDB4RkMsIDB4MUMsIDB4MDYsIDB4NzUsIDB4RjUsIDB4MzIsIDB4MTMsCisJMHg3NSwgMHg0MSwgMHg4QiwgMHgwMCwgMHgwRSwgMHhGQywgMHhEMiwgMHgwMywgMHg1RSwgMHhGRCwgMHg1QSwKKwkweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEYyLCAweEZGLCAweEU3LCAweEZGLAorCTB4RTcsIDB4MDAsIDB4MkUsIDB4RkQsIDB4NDEsIDB4MDYsIDB4RkMsIDB4RjMsIDB4MkMsIDB4MUEsIDB4QzYsCisJMHgzRSwgMHhGNywgMHhGQiwgMHg1QSwgMHhGRSwgMHhCNywgMHgwMiwgMHhDRSwgMHhGRCwgMHgzQywgMHgwMSwKKwkweDhELCAweEZGLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweEUyLCAweEZGLCAweDE4LCAweDAwLCAweDhBLAorCTB4MDAsIDB4QTUsIDB4RkQsIDB4MDIsIDB4MDYsIDB4MTYsIDB4RjMsIDB4M0YsIDB4MjEsIDB4RTYsIDB4M0EsCisJMHg0QiwgMHhGOCwgMHg4MSwgMHgwMCwgMHg5MCwgMHgwMSwgMHg1MywgMHhGRSwgMHgwRiwgMHgwMSwgMHg5NywKKwkweEZGLCAweDBFLCAweDAwLCAweDA1LCAweDAwLCAweEQwLCAweEZGLCAweDUwLCAweDAwLCAweDE3LCAweDAwLAorCTB4NTEsIDB4RkUsIDB4NTksIDB4MDUsIDB4RTcsIDB4RjIsIDB4MzEsIDB4MjgsIDB4RkIsIDB4MzUsIDB4OTMsCisJMHhGNSwgMHg2NiwgMHgwMiwgMHg2RiwgMHgwMCwgMHhFMiwgMHhGRSwgMHhEOCwgMHgwMCwgMHhBNiwgMHhGRiwKKwkweDBDLCAweDAwLCAweDA4LCAweDAwLCAweEJELCAweEZGLCAweDhELCAweDAwLCAweDkyLCAweEZGLCAweDJELAorCTB4RkYsIDB4NDUsIDB4MDQsIDB4OEIsIDB4RjMsIDB4QzEsIDB4MkUsIDB4MzEsIDB4MzAsIDB4RDEsIDB4RjMsCisJMHhGNiwgMHgwMywgMHg2NSwgMHhGRiwgMHg3MiwgMHhGRiwgMHg5QiwgMHgwMCwgMHhCOCwgMHhGRiwgMHgwOCwKKwkweDAwLCAweDBCLCAweDAwLCAweEFBLCAweEZGLCAweENBLCAweDAwLCAweDAzLCAweEZGLCAweDJGLCAweDAwLAorCTB4Q0IsIDB4MDIsIDB4MTYsIDB4RjUsIDB4QjgsIDB4MzQsIDB4QzAsIDB4MjksIDB4RjksIDB4RjIsIDB4MjMsCisJMHgwNSwgMHg4MCwgMHhGRSwgMHhGOSwgMHhGRiwgMHg1RSwgMHgwMCwgMHhDQywgMHhGRiwgMHgwNSwgMHgwMCwKKwkweDBFLCAweDAwLCAweDlBLCAweEZGLCAweDAzLCAweDAxLCAweDczLCAweEZFLCAweDRDLCAweDAxLCAweEY3LAorCTB4MDAsIDB4OTQsIDB4RjcsIDB4REIsIDB4MzksIDB4REYsIDB4MjIsIDB4RkEsIDB4RjIsIDB4RTUsIDB4MDUsCisJMHhDOCwgMHhGRCwgMHg3MSwgMHgwMCwgMHgyNSwgMHgwMCwgMHhERSwgMHhGRiwgMHgwMywgMHgwMCwgMHgxMCwKKwkweDAwLCAweDhGLCAweEZGLCAweDMzLCAweDAxLCAweEVCLCAweEZELCAweDczLCAweDAyLCAweERFLCAweEZFLAorCTB4MDgsIDB4RkIsIDB4RkIsIDB4M0QsIDB4Q0UsIDB4MUIsIDB4QjgsIDB4RjMsIDB4M0IsIDB4MDYsIDB4NDUsCisJMHhGRCwgMHhENCwgMHgwMCwgMHhGMiwgMHhGRiwgMHhFRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMSwgMHgwMCwKKwkweDhBLCAweEZGLCAweDU1LCAweDAxLCAweDc1LCAweEZELCAweDkyLCAweDAzLCAweDk3LCAweEZDLCAweDY5LAorCTB4RkYsIDB4RjIsIDB4NDAsIDB4QzgsIDB4MTQsIDB4MTMsIDB4RjUsIDB4MkQsIDB4MDYsIDB4RjgsIDB4RkMsCisJMHgxRSwgMHgwMSwgMHhDOCwgMHhGRiwgMHhGQywgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHg4RiwKKwkweEZGLCAweDY0LCAweDAxLCAweDFELCAweEZELCAweDk3LCAweDA0LCAweDQzLCAweEZBLCAweEExLCAweDA0LAorCTB4QTUsIDB4NDIsIDB4MDgsIDB4MEUsIDB4RTYsIDB4RjYsIDB4QzQsIDB4MDUsIDB4RTEsIDB4RkMsIDB4NEQsCisJMHgwMSwgMHhBOSwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwKKwkweDlELCAweEZGLCAweDVDLCAweDAxLCAweEVBLCAweEZDLCAweDZDLCAweDA1LCAweDA1LCAweEY4LCAweDk0LAorCTB4MEEsIDB4MDMsIDB4NDMsIDB4QzEsIDB4MDcsIDB4MDksIDB4RjksIDB4MTAsIDB4MDUsIDB4RkMsIDB4RkMsCisJMHg2MiwgMHgwMSwgMHg5NSwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhCNiwKKwkweEZGLCAweDNCLCAweDAxLCAweEU1LCAweEZDLCAweEZGLCAweDA1LCAweDAyLCAweEY2LCAweDE5LCAweDExLAorCTB4MDYsIDB4NDIsIDB4MUYsIDB4MDIsIDB4NTYsIDB4RkIsIDB4MjMsIDB4MDQsIDB4NDEsIDB4RkQsIDB4NUYsCisJMHgwMSwgMHg4QiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGNiwgMHhGRiwgMHhEQSwgMHhGRiwKKwkweEZGLCAweDAwLCAweDE1LCAweEZELCAweDQwLCAweDA2LCAweDYyLCAweEY0LCAweDAxLCAweDE4LCAweEJCLAorCTB4M0YsIDB4NDcsIDB4RkQsIDB4QTgsIDB4RkQsIDB4MTAsIDB4MDMsIDB4QTksIDB4RkQsIDB4NDcsIDB4MDEsCisJMHg4QywgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhFNywgMHhGRiwgMHgwOCwgMHgwMCwgMHhBOSwKKwkweDAwLCAweDdCLCAweEZELCAweDIwLCAweDA2LCAweDRCLCAweEYzLCAweDEzLCAweDFGLCAweDM2LCAweDNDLAorCTB4NTIsIDB4RjksIDB4REQsIDB4RkYsIDB4RUIsIDB4MDEsIDB4MjgsIDB4RkUsIDB4MUYsIDB4MDEsIDB4OTMsCisJMHhGRiwgMHgwRiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhENiwgMHhGRiwgMHgzRiwgMHgwMCwgMHgzQywgMHgwMCwKKwkweDE2LCAweEZFLCAweDk4LCAweDA1LCAweEUwLCAweEYyLCAweDE2LCAweDI2LCAweDk5LCAweDM3LCAweDRGLAorCTB4RjYsIDB4RDksIDB4MDEsIDB4QzYsIDB4MDAsIDB4QjUsIDB4RkUsIDB4RUEsIDB4MDAsIDB4QTEsIDB4RkYsCisJMHgwRCwgMHgwMCwgMHgwNywgMHgwMCwgMHhDMywgMHhGRiwgMHg3QSwgMHgwMCwgMHhCQywgMHhGRiwgMHhFNCwKKwkweEZFLCAweEE1LCAweDA0LCAweDQxLCAweEYzLCAweENBLCAweDJDLCAweDBFLCAweDMyLCAweDQyLCAweEY0LAorCTB4ODUsIDB4MDMsIDB4QjQsIDB4RkYsIDB4NDYsIDB4RkYsIDB4QUUsIDB4MDAsIDB4QjMsIDB4RkYsIDB4MDksCisJMHgwMCwgMHgwQSwgMHgwMCwgMHhCMCwgMHhGRiwgMHhCOCwgMHgwMCwgMHgzMCwgMHhGRiwgMHhEQywgMHhGRiwKKwkweDQ5LCAweDAzLCAweDgzLCAweEY0LCAweEY1LCAweDMyLCAweEM5LCAweDJCLCAweDIzLCAweEYzLCAweEQxLAorCTB4MDQsIDB4QzIsIDB4RkUsIDB4RDEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4QzYsIDB4RkYsIDB4MDYsIDB4MDAsCisJMHgwRCwgMHgwMCwgMHg5RiwgMHhGRiwgMHhGMywgMHgwMCwgMHg5RiwgMHhGRSwgMHhGMywgMHgwMCwgMHg5MCwKKwkweDAxLCAweEI2LCAweEY2LCAweDVGLCAweDM4LCAweDA0LCAweDI1LCAweEU0LCAweEYyLCAweEI0LCAweDA1LAorCTB4RkIsIDB4RkQsIDB4NEUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksIDB4RkYsIDB4MDQsIDB4MDAsIDB4MEYsCisJMHgwMCwgMHg5MiwgMHhGRiwgMHgyNiwgMHgwMSwgMHgxMywgMHhGRSwgMHgxOCwgMHgwMiwgMHg4OSwgMHhGRiwKKwkweERGLCAweEY5LCAweEQzLCAweDNDLCAweEZDLCAweDFELCAweDZCLCAweEYzLCAweDJDLCAweDA2LCAweDY3LAorCTB4RkQsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MTEsIDB4MDAsCisJMHg4QiwgMHhGRiwgMHg0QywgMHgwMSwgMHg5NywgMHhGRCwgMHgzQywgMHgwMywgMHg0RCwgMHhGRCwgMHhGOCwKKwkweEZELCAweDJBLCAweDQwLCAweEVELCAweDE2LCAweDlBLCAweEY0LCAweDNDLCAweDA2LCAweDBBLCAweEZELAorCTB4MEEsIDB4MDEsIDB4RDQsIDB4RkYsIDB4RjgsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4OEMsCisJMHhGRiwgMHg2MSwgMHgwMSwgMHgzNCwgMHhGRCwgMHg0QiwgMHgwNCwgMHhGQSwgMHhGQSwgMHhGMSwgMHgwMiwKKwkweDQyLCAweDQyLCAweDExLCAweDEwLCAweDRDLCAweEY2LCAweEVELCAweDA1LCAweEUzLCAweEZDLCAweDQxLAorCTB4MDEsIDB4QjEsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4OTcsIDB4RkYsCisJMHg2MSwgMHgwMSwgMHhGNSwgMHhGQywgMHgzMCwgMHgwNSwgMHhCMSwgMHhGOCwgMHhBRSwgMHgwOCwgMHgwQSwKKwkweDQzLCAweDlGLCAweDA5LCAweDVBLCAweEY4LCAweDRGLCAweDA1LCAweEVGLCAweEZDLCAweDVGLCAweDAxLAorCTB4OUEsIDB4RkYsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4QUQsCisJMHhGRiwgMHg0OCwgMHgwMSwgMHhFMiwgMHhGQywgMHhEQSwgMHgwNSwgMHg5NywgMHhGNiwgMHgwQiwgMHgwRiwKKwkweDc5LCAweDQyLCAweEM3LCAweDAzLCAweDlFLCAweEZBLCAweDcxLCAweDA0LCAweDI4LCAweEZELCAweDYzLAorCTB4MDEsIDB4OEQsIDB4RkYsIDB4MEYsIDB4MDAgCit9OworCitzdGF0aWMgdTE2CitDb2VmZmljaWVudFNpemVzW10gPSB7CisgICAgLyogUGxheWJhY2sgKi8KKyAgICAweDAwQzAsIDB4NTAwMCwgMHgwMDYwLCAweDI4MDAsIDB4MDA0MCwgMHgwMDYwLCAweDE0MDAsIDB4MDAwMCwKKyAgICAvKiBSZWNvcmQgKi8KKyAgICAweDAwMjAsIDB4MTI2MCwgMHgwMDIwLCAweDEyNjAsIDB4MDAwMCwgMHgwMDQwLCAweDEyNjAsIDB4MDAwMCwKK307CisKKyNpZm5kZWYgSlVTVF9EQVRBCisKK3N0YXRpYyB1MTYKK25tMjU2X2dldFN0YXJ0T2Zmc2V0ICh1OCB3aGljaCkKK3sKKyAgICB1MTYgb2Zmc2V0ID0gMDsKKworICAgIHdoaWxlICh3aGljaC0tID4gMCkKKwlvZmZzZXQgKz0gQ29lZmZpY2llbnRTaXplc1t3aGljaF07CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZAorbm0yNTZfbG9hZE9uZUNvZWZmaWNpZW50IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgaW50IGRldm51bSwgdTMyIHBvcnQsIAorCQkJICB1MTYgd2hpY2gpCit7CisgICAgdTMyIGNvZWZmQnVmID0gKHdoaWNoIDwgOCkgPyBjYXJkLT5jb2VmZkJ1ZiA6IGNhcmQtPmFsbENvZWZmQnVmOworICAgIHUxNiBvZmZzZXQgPSBubTI1Nl9nZXRTdGFydE9mZnNldCAod2hpY2gpOworICAgIHUxNiBzaXplID0gQ29lZmZpY2llbnRTaXplc1t3aGljaF07CisKKyAgICBjYXJkLT5jb2VmZnNDdXJyZW50ID0gMDsKKworICAgIGlmIChubTI1Nl9kZWJ1ZykKKwlwcmludGsgKEtFUk5fSU5GTyAiTk0yNTY6IExvYWRpbmcgY29lZmZpY2llbnQgYnVmZmVyIDB4JXgtMHgleCB3aXRoIGNvZWZmaWNpZW50ICVkLCBzaXplICVkLCBwb3J0IDB4JXhcbiIsCisJCWNvZWZmQnVmLCBjb2VmZkJ1ZiArIHNpemUgLSAxLCB3aGljaCwgc2l6ZSwgcG9ydCk7CisgICAgbm0yNTZfd3JpdGVCdWZmZXI4IChjYXJkLCBjb2VmZmljaWVudHMgKyBvZmZzZXQsIDEsIGNvZWZmQnVmLCBzaXplKTsKKyAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgcG9ydCArIDAsIGNvZWZmQnVmKTsKKyAgICAvKiA/Pz8gIFJlY29yZCBzZWVtcyB0byBiZWhhdmUgZGlmZmVyZW50bHkgdGhhbiBwbGF5YmFjay4gICovCisgICAgaWYgKGRldm51bSA9PSAwKQorCXNpemUtLTsKKyAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgcG9ydCArIDQsIGNvZWZmQnVmICsgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitubTI1Nl9sb2FkQWxsQ29lZmZpY2llbnRzIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKK3sKKyAgICBubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGNvZWZmaWNpZW50cywgMSwgY2FyZC0+YWxsQ29lZmZCdWYsCisJCQkgIE5NX1RPVEFMX0NPRUZGX0NPVU5UICogNCk7CisgICAgY2FyZC0+Y29lZmZzQ3VycmVudCA9IDE7Cit9CisKK3ZvaWQKK25tMjU2X2xvYWRDb2VmZmljaWVudCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGludCB3aGljaCwgaW50IG51bWJlcikKK3sKKyAgICBzdGF0aWMgdTE2IGFkZHJzWzNdID0geyAweDFjLCAweDIxYywgMHg0MDggfTsKKyAgICAvKiBUaGUgZW5hYmxlIHJlZ2lzdGVyIGZvciB0aGUgc3BlY2lmaWVkIGVuZ2luZS4gICovCisgICAgdTMyIHBvZmZzZXQgPSAod2hpY2ggPT0gMSA/IDB4MjAwIDogMSk7CisKKyAgICBpZiAobm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCBwb2Zmc2V0KSAmIDEpIHsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogRW5naW5lIHdhcyBlbmFibGVkIHdoaWxlIGxvYWRpbmcgY29lZmZpY2llbnRzIVxuIik7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIFRoZSByZWNvcmRpbmcgZW5naW5lIHVzZXMgY29lZmZpY2llbnQgdmFsdWVzIDgtMTUuICAqLworICAgIGlmICh3aGljaCA9PSAxKQorCW51bWJlciArPSA4OworCisgICAgaWYgKCEgbm0yNTZfY2FjaGVkQ29lZmZpY2llbnRzIChjYXJkKSkKKwlubTI1Nl9sb2FkT25lQ29lZmZpY2llbnQgKGNhcmQsIHdoaWNoLCBhZGRyc1t3aGljaF0sIG51bWJlcik7CisgICAgZWxzZSB7CisJdTMyIGJhc2UgPSBjYXJkLT5hbGxDb2VmZkJ1ZjsKKwl1MzIgb2Zmc2V0ID0gbm0yNTZfZ2V0U3RhcnRPZmZzZXQgKG51bWJlcik7CisJdTMyIGVuZE9mZnNldCA9IG9mZnNldCArIENvZWZmaWNpZW50U2l6ZXNbbnVtYmVyXTsKKworCWlmIChubTI1Nl9kZWJ1ZykKKwkgICAgcHJpbnRrIChLRVJOX0RFQlVHICJsb2FkaW5nIGNvZWZmaWNpZW50ICVkIGF0IHBvcnQgMHgleCwgb2Zmc2V0ICVkICgweCV4LTB4JXgpXG4iLAorCQkgICAgbnVtYmVyLCBhZGRyc1t3aGljaF0sIG9mZnNldCwgYmFzZSArIG9mZnNldCwKKwkJICAgIGJhc2UgKyBlbmRPZmZzZXQgLSAxKTsKKworCWlmICghIGNhcmQtPmNvZWZmc0N1cnJlbnQpCisJICAgIG5tMjU2X2xvYWRBbGxDb2VmZmljaWVudHMgKGNhcmQpOworCisJbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIGFkZHJzW3doaWNoXSwgYmFzZSArIG9mZnNldCk7CisJbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIGFkZHJzW3doaWNoXSArIDQsIGJhc2UgKyBlbmRPZmZzZXQgLSAxKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBKVVNUX0RBVEEgKi8KKworI2VuZGlmCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcGwzLmMgYi9zb3VuZC9vc3Mvb3BsMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMTczNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvb3BsMy5jCkBAIC0wLDAgKzEsMTI1NyBAQAorLyoKKyAqIHNvdW5kL29wbDMuYworICoKKyAqIEEgbG93IGxldmVsIGRyaXZlciBmb3IgWWFtYWhhIFlNMzgxMiBhbmQgT1BMLTMgLWNoaXBzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBDaGFuZ2VzCisgKglUaG9tYXMgU2FpbGVyICAgCWlvY3RsIGNvZGUgcmV3b3JrZWQgKHZtYWxsb2MvdmZyZWUgcmVtb3ZlZCkKKyAqCUFsYW4gQ294CQltb2R1bGFyaXNhdGlvbiwgZml4ZWQgc291bmRfbWVtIGFsbG9jcy4KKyAqCUNocmlzdG9waCBIZWxsd2lnCUFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQKKyAqCUFybmFsZG8gQy4gZGUgTWVsbwlnZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbiwgdXNlIHJlcXVlc3RfcmVnaW9uIGZvcgorICoJCQkJT1BMNCwgcmVsZWFzZSBpdCBvbiBleGl0LCBzb21lIGNsZWFudXBzLgorICoKKyAqIFN0YXR1cworICoJQmVsaWV2ZWQgdG8gd29yay4gQmFkbHkgbmVlZHMgcmV3cml0aW5nIGEgYml0IHRvIHN1cHBvcnQgbXVsdGlwbGUKKyAqCU9QTDMgZGV2aWNlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKy8qCisgKiBNYWpvciBpbXByb3ZlbWVudHMgdG8gdGhlIEZNIGhhbmRsaW5nIDMwQVVHOTIgYnkgUm9iIEhvb2Z0LAorICogaG9vZnRAY2hlbS5ydXUubmwKKyAqLworCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJvcGwzLmgiCisjaW5jbHVkZSAib3BsM19ody5oIgorCisjZGVmaW5lIE1BWF9WT0lDRQkxOAorI2RlZmluZSBPRkZTXzRPUAkxMQorCitzdHJ1Y3Qgdm9pY2VfaW5mbworeworCXVuc2lnbmVkIGNoYXIgICBrZXlvbl9ieXRlOworCWxvbmcgICAgICAgICAgICBiZW5kZXI7CisJbG9uZyAgICAgICAgICAgIGJlbmRlcl9yYW5nZTsKKwl1bnNpZ25lZCBsb25nICAgb3JpZ19mcmVxOworCXVuc2lnbmVkIGxvbmcgICBjdXJyZW50X2ZyZXE7CisJaW50ICAgICAgICAgICAgIHZvbHVtZTsKKwlpbnQgICAgICAgICAgICAgbW9kZTsKKwlpbnQgICAgICAgICAgICAgcGFubmluZzsJLyogMHhmZmZmIG1lYW5zIG5vdCBzZXQgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IG9wbF9kZXZpbmZvCit7CisJaW50ICAgICAgICAgICAgIGJhc2U7CisJaW50ICAgICAgICAgICAgIGxlZnRfaW8sIHJpZ2h0X2lvOworCWludCAgICAgICAgICAgICBucl92b2ljZTsKKwlpbnQgICAgICAgICAgICAgbHZfbWFwW01BWF9WT0lDRV07CisKKwlzdHJ1Y3Qgdm9pY2VfaW5mbyB2b2NbTUFYX1ZPSUNFXTsKKwlzdHJ1Y3Qgdm9pY2VfYWxsb2NfaW5mbyAqdl9hbGxvYzsKKwlzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaG5faW5mbzsKKworCXN0cnVjdCBzYmlfaW5zdHJ1bWVudCBpX21hcFtTQkZNX01BWElOU1RSXTsKKwlzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgKmFjdF9pW01BWF9WT0lDRV07CisKKwlzdHJ1Y3Qgc3ludGhfaW5mbyBmbV9pbmZvOworCisJaW50ICAgICAgICAgICAgIGJ1c3k7CisJaW50ICAgICAgICAgICAgIG1vZGVsOworCXVuc2lnbmVkIGNoYXIgICBjbWFzazsKKworCWludCAgICAgICAgICAgICBpc19vcGw0OworCWludCAgICAgICAgICAgICpvc3A7Cit9IG9wbF9kZXZpbmZvOworCitzdGF0aWMgc3RydWN0IG9wbF9kZXZpbmZvICpkZXZjID0gTlVMTDsKKworc3RhdGljIGludCAgICAgIGRldGVjdGVkX21vZGVsOworCitzdGF0aWMgaW50ICAgICAgc3RvcmVfaW5zdHIoaW50IGluc3RyX25vLCBzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgKmluc3RyKTsKK3N0YXRpYyB2b2lkICAgICBmcmVxX3RvX2ZudW0oaW50IGZyZXEsIGludCAqYmxvY2ssIGludCAqZm51bSk7CitzdGF0aWMgdm9pZCAgICAgb3BsM19jb21tYW5kKGludCBpb19hZGRyLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IHZhbCk7CitzdGF0aWMgaW50ICAgICAgb3BsM19raWxsX25vdGUoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgbm90ZSwgaW50IHZlbG9jaXR5KTsKKworc3RhdGljIHZvaWQgZW50ZXJfNG9wX21vZGUodm9pZCkKK3sKKwlpbnQgaTsKKwlzdGF0aWMgaW50IHY0b3BbTUFYX1ZPSUNFXSA9IHsKKwkJMCwgMSwgMiwgOSwgMTAsIDExLCA2LCA3LCA4LCAxNSwgMTYsIDE3CisJfTsKKworCWRldmMtPmNtYXNrID0gMHgzZjsJLyogQ29ubmVjdCBhbGwgcG9zc2libGUgNCBPUCB2b2ljZSBvcGVyYXRvcnMgKi8KKwlvcGwzX2NvbW1hbmQoZGV2Yy0+cmlnaHRfaW8sIENPTk5FQ1RJT05fU0VMRUNUX1JFR0lTVEVSLCAweDNmKTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCXB2X21hcFtpXS52b2ljZV9tb2RlID0gNDsKKwlmb3IgKGkgPSAzOyBpIDwgNjsgaSsrKQorCQlwdl9tYXBbaV0udm9pY2VfbW9kZSA9IDA7CisKKwlmb3IgKGkgPSA5OyBpIDwgMTI7IGkrKykKKwkJcHZfbWFwW2ldLnZvaWNlX21vZGUgPSA0OworCWZvciAoaSA9IDEyOyBpIDwgMTU7IGkrKykKKwkJcHZfbWFwW2ldLnZvaWNlX21vZGUgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisJCWRldmMtPmx2X21hcFtpXSA9IHY0b3BbaV07CisJZGV2Yy0+dl9hbGxvYy0+bWF4X3ZvaWNlID0gZGV2Yy0+bnJfdm9pY2UgPSAxMjsKK30KKworc3RhdGljIGludCBvcGwzX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQoreworCXN0cnVjdCBzYmlfaW5zdHJ1bWVudCBpbnM7CisJCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTTkRDVExfRk1fTE9BRF9JTlNUUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6IE9ic29sZXRlIGlvY3RsKFNORENUTF9GTV9MT0FEX0lOU1RSKSB1c2VkLiBGaXggdGhlIHByb2dyYW0uXG4iKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zLCBhcmcsIHNpemVvZihpbnMpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChpbnMuY2hhbm5lbCA8IDAgfHwgaW5zLmNoYW5uZWwgPj0gU0JGTV9NQVhJTlNUUikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZNIEVycm9yOiBJbnZhbGlkIGluc3RydW1lbnQgbnVtYmVyICVkXG4iLCBpbnMuY2hhbm5lbCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlyZXR1cm4gc3RvcmVfaW5zdHIoaW5zLmNoYW5uZWwsICZpbnMpOworCisJCWNhc2UgU05EQ1RMX1NZTlRIX0lORk86CisJCQlkZXZjLT5mbV9pbmZvLm5yX3ZvaWNlcyA9IChkZXZjLT5ucl92b2ljZSA9PSAxMikgPyA2IDogZGV2Yy0+bnJfdm9pY2U7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJmRldmMtPmZtX2luZm8sIHNpemVvZihkZXZjLT5mbV9pbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9TWU5USF9NRU1BVkw6CisJCQlyZXR1cm4gMHg3ZmZmZmZmZjsKKworCQljYXNlIFNORENUTF9GTV80T1BfRU5BQkxFOgorCQkJaWYgKGRldmMtPm1vZGVsID09IDIpCisJCQkJZW50ZXJfNG9wX21vZGUoKTsKKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK2ludCBvcGwzX2RldGVjdChpbnQgaW9hZGRyLCBpbnQgKm9zcCkKK3sKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHRoZSBGTSBjaGlwIGlzIHByZXNlbnQgYXQgdGhlIGdpdmVuIEkvTyBwb3J0CisJICogVGhlIGRldGVjdGlvbiBhbGdvcml0aG0gcGxheXMgd2l0aCB0aGUgdGltZXIgYnVpbHQgaW4gdGhlIEZNIGNoaXAgYW5kCisJICogbG9va3MgZm9yIGEgY2hhbmdlIGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIuCisJICoKKwkgKiBOb3RlISBUaGUgdGltZXJzIG9mIHRoZSBGTSBjaGlwIGFyZSBub3QgY29ubmVjdGVkIHRvIEFkTGliIChhbmQgY29tcGF0aWJsZSkKKwkgKiBib2FyZHMuCisJICoKKwkgKiBOb3RlMiEgVGhlIGNoaXAgaXMgaW5pdGlhbGl6ZWQgaWYgZGV0ZWN0ZWQuCisJICovCisKKwl1bnNpZ25lZCBjaGFyIHN0YXQxLCBzaWduYXR1cmU7CisJaW50IGk7CisKKwlpZiAoZGV2YyAhPSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJvcGwzOiBPbmx5IG9uZSBPUEwzIHN1cHBvcnRlZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZjID0gKHN0cnVjdCBvcGxfZGV2aW5mbyAqKWttYWxsb2Moc2l6ZW9mKCpkZXZjKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoZGV2YyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJvcGwzOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBkZXZpY2UgY29udHJvbCAiCisJCQkic3RydWN0dXJlIFxuICIpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQoZGV2YywgMCwgc2l6ZW9mKCpkZXZjKSk7CisJc3RyY3B5KGRldmMtPmZtX2luZm8ubmFtZSwgIk9QTDIiKTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCA0LCBkZXZjLT5mbV9pbmZvLm5hbWUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9wbDM6IEkvTyBwb3J0IDB4JXggYWxyZWFkeSBpbiB1c2VcbiIsIGlvYWRkcik7CisJCWdvdG8gY2xlYW51cF9kZXZjOworCX0KKworCWRldmMtPm9zcCA9IG9zcDsKKwlkZXZjLT5iYXNlID0gaW9hZGRyOworCisJLyogUmVzZXQgdGltZXJzIDEgYW5kIDIgKi8KKwlvcGwzX2NvbW1hbmQoaW9hZGRyLCBUSU1FUl9DT05UUk9MX1JFR0lTVEVSLCBUSU1FUjFfTUFTSyB8IFRJTUVSMl9NQVNLKTsKKworCS8qIFJlc2V0IHRoZSBJUlEgb2YgdGhlIEZNIGNoaXAgKi8KKwlvcGwzX2NvbW1hbmQoaW9hZGRyLCBUSU1FUl9DT05UUk9MX1JFR0lTVEVSLCBJUlFfUkVTRVQpOworCisJc2lnbmF0dXJlID0gc3RhdDEgPSBpbmIoaW9hZGRyKTsJLyogU3RhdHVzIHJlZ2lzdGVyICovCisKKwlpZiAoc2lnbmF0dXJlICE9IDB4MDAgJiYgc2lnbmF0dXJlICE9IDB4MDYgJiYgc2lnbmF0dXJlICE9IDB4MDIgJiYKKwkJc2lnbmF0dXJlICE9IDB4MGYpCisJeworCQlNREIocHJpbnRrKEtFUk5fSU5GTyAiT1BMMyBub3QgZGV0ZWN0ZWQgJXhcbiIsIHNpZ25hdHVyZSkpOworCQlnb3RvIGNsZWFudXBfcmVnaW9uOworCX0KKworCWlmIChzaWduYXR1cmUgPT0gMHgwNikJCS8qIE9QTDIgKi8KKwl7CisJCWRldGVjdGVkX21vZGVsID0gMjsKKwl9CisJZWxzZSBpZiAoc2lnbmF0dXJlID09IDB4MDAgfHwgc2lnbmF0dXJlID09IDB4MGYpCS8qIE9QTDMgb3IgT1BMNCAqLworCXsKKwkJdW5zaWduZWQgY2hhciB0bXA7CisKKwkJZGV0ZWN0ZWRfbW9kZWwgPSAzOworCisJCS8qCisJCSAqIERldGVjdCBhdmFpbGFiaWxpdHkgb2YgT1BMNCAoX2V4cGVyaW1lbnRhbF8pLiBXb3JrcyBwcm9iYWJseQorCQkgKiBvbmx5IGFmdGVyIGEgY29sZCBib290LiBJbiBhZGRpdGlvbiB0aGUgT1BMNCBwb3J0CisJCSAqIG9mIHRoZSBjaGlwIG1heSBub3QgYmUgY29ubmVjdGVkIHRvIHRoZSBQQyBidXMgYXQgYWxsLgorCQkgKi8KKworCQlvcGwzX2NvbW1hbmQoaW9hZGRyICsgMiwgT1BMM19NT0RFX1JFR0lTVEVSLCAweDAwKTsKKwkJb3BsM19jb21tYW5kKGlvYWRkciArIDIsIE9QTDNfTU9ERV9SRUdJU1RFUiwgT1BMM19FTkFCTEUgfCBPUEw0X0VOQUJMRSk7CisKKwkJaWYgKCh0bXAgPSBpbmIoaW9hZGRyKSkgPT0gMHgwMikJLyogSGF2ZSBhIE9QTDQgKi8KKwkJeworCQkJZGV0ZWN0ZWRfbW9kZWwgPSA0OworCQl9CisKKwkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvYWRkciAtIDgsIDIsICJPUEw0IikpCS8qIE9QTDQgcG9ydCB3YXMgZnJlZSAqLworCQl7CisJCQlpbnQgdG1wOworCisJCQlvdXRiKCgweDAyKSwgaW9hZGRyIC0gOCk7CS8qIFNlbGVjdCBPUEw0IElEIHJlZ2lzdGVyICovCisJCQl1ZGVsYXkoMTApOworCQkJdG1wID0gaW5iKGlvYWRkciAtIDcpOwkJLyogUmVhZCBpdCAqLworCQkJdWRlbGF5KDEwKTsKKworCQkJaWYgKHRtcCA9PSAweDIwKQkvKiBPUEw0IHNob3VsZCByZXR1cm4gMHgyMCBoZXJlICovCisJCQl7CisJCQkJZGV0ZWN0ZWRfbW9kZWwgPSA0OworCQkJCW91dGIoKDB4RjgpLCBpb2FkZHIgLSA4KTsJLyogU2VsZWN0IE9QTDQgRk0gbWl4ZXIgY29udHJvbCAqLworCQkJCXVkZWxheSgxMCk7CisJCQkJb3V0YigoMHgxQiksIGlvYWRkciAtIDcpOwkvKiBXcml0ZSB2YWx1ZSAqLworCQkJCXVkZWxheSgxMCk7CisJCQl9CisJCQllbHNlCisJCQl7IC8qIHJlbGVhc2UgT1BMNCBwb3J0ICovCisJCQkJcmVsZWFzZV9yZWdpb24oaW9hZGRyIC0gOCwgMik7CisJCQkJZGV0ZWN0ZWRfbW9kZWwgPSAzOworCQkJfQorCQl9CisJCW9wbDNfY29tbWFuZChpb2FkZHIgKyAyLCBPUEwzX01PREVfUkVHSVNURVIsIDApOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQlvcGwzX2NvbW1hbmQoaW9hZGRyLCBLRVlPTl9CTE9DSyArIGksIDApOwkvKgorCQkJCQkJCQkgKiBOb3RlIG9mZgorCQkJCQkJCQkgKi8KKworCW9wbDNfY29tbWFuZChpb2FkZHIsIFRFU1RfUkVHSVNURVIsIEVOQUJMRV9XQVZFX1NFTEVDVCk7CisJb3BsM19jb21tYW5kKGlvYWRkciwgUEVSQ09TU0lPTl9SRUdJU1RFUiwgMHgwMCk7CS8qCisJCQkJCQkJCSAqIE1lbG9kaWMgbW9kZS4KKwkJCQkJCQkJICovCisJcmV0dXJuIDE7CitjbGVhbnVwX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIDQpOworY2xlYW51cF9kZXZjOgorCWtmcmVlKGRldmMpOworCWRldmMgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wbDNfa2lsbF9ub3RlICAoaW50IGRldm5vLCBpbnQgdm9pY2UsIGludCBub3RlLCBpbnQgdmVsb2NpdHkpCit7CisJIHN0cnVjdCBwaHlzaWNhbF92b2ljZV9pbmZvICptYXA7CisKKwkgaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBkZXZjLT5ucl92b2ljZSkKKwkJIHJldHVybiAwOworCisJIGRldmMtPnZfYWxsb2MtPm1hcFt2b2ljZV0gPSAwOworCisJIG1hcCA9ICZwdl9tYXBbZGV2Yy0+bHZfbWFwW3ZvaWNlXV07CisJIERFQihwcmludGsoIktpbGwgbm90ZSAlZFxuIiwgdm9pY2UpKTsKKworCSBpZiAobWFwLT52b2ljZV9tb2RlID09IDApCisJCSByZXR1cm4gMDsKKworCSBvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEtFWU9OX0JMT0NLICsgbWFwLT52b2ljZV9udW0sIGRldmMtPnZvY1t2b2ljZV0ua2V5b25fYnl0ZSAmIH4weDIwKTsKKwkgZGV2Yy0+dm9jW3ZvaWNlXS5rZXlvbl9ieXRlID0gMDsKKwkgZGV2Yy0+dm9jW3ZvaWNlXS5iZW5kZXIgPSAwOworCSBkZXZjLT52b2Nbdm9pY2VdLnZvbHVtZSA9IDY0OworCSBkZXZjLT52b2Nbdm9pY2VdLnBhbm5pbmcgPSAweGZmZmY7CS8qIE5vdCBzZXQgKi8KKwkgZGV2Yy0+dm9jW3ZvaWNlXS5iZW5kZXJfcmFuZ2UgPSAyMDA7CisJIGRldmMtPnZvY1t2b2ljZV0ub3JpZ19mcmVxID0gMDsKKwkgZGV2Yy0+dm9jW3ZvaWNlXS5jdXJyZW50X2ZyZXEgPSAwOworCSBkZXZjLT52b2Nbdm9pY2VdLm1vZGUgPSAwOworCSByZXR1cm4gMDsKK30KKworI2RlZmluZSBISUhBVAkJCTAKKyNkZWZpbmUgQ1lNQkFMCQkJMQorI2RlZmluZSBUT01UT00JCQkyCisjZGVmaW5lIFNOQVJFCQkJMworI2RlZmluZSBCRFJVTQkJCTQKKyNkZWZpbmUgVU5ERUZJTkVECQlUT01UT00KKyNkZWZpbmUgREVGQVVMVAkJCVRPTVRPTQorCitzdGF0aWMgaW50IHN0b3JlX2luc3RyKGludCBpbnN0cl9ubywgc3RydWN0IHNiaV9pbnN0cnVtZW50ICppbnN0cikKK3sKKwlpZiAoaW5zdHItPmtleSAhPSBGTV9QQVRDSCAmJiAoaW5zdHItPmtleSAhPSBPUEwzX1BBVENIIHx8IGRldmMtPm1vZGVsICE9IDIpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJGTSB3YXJuaW5nOiBJbnZhbGlkIHBhdGNoIGZvcm1hdCBmaWVsZCAoa2V5KSAweCV4XG4iLCBpbnN0ci0+a2V5KTsKKwltZW1jcHkoKGNoYXIgKikgJihkZXZjLT5pX21hcFtpbnN0cl9ub10pLCAoY2hhciAqKSBpbnN0ciwgc2l6ZW9mKCppbnN0cikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wbDNfc2V0X2luc3RyICAoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgaW5zdHJfbm8pCit7CisJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBkZXZjLT5ucl92b2ljZSkKKwkJcmV0dXJuIDA7CisJaWYgKGluc3RyX25vIDwgMCB8fCBpbnN0cl9ubyA+PSBTQkZNX01BWElOU1RSKQorCQlpbnN0cl9ubyA9IDA7CS8qIEFjb3VzdGljIHBpYW5vICh1c3VhbGx5KSAqLworCisJZGV2Yy0+YWN0X2lbdm9pY2VdID0gJmRldmMtPmlfbWFwW2luc3RyX25vXTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBuZXh0IHRhYmxlIGxvb2tzIG1hZ2ljYWwsIGJ1dCBpdCBjZXJ0YWlubHkgaXMgbm90LiBJdHMgdmFsdWVzIGhhdmUKKyAqIGJlZW4gY2FsY3VsYXRlZCBhcyB0YWJsZVtpXT04KmxvZyhpLzY0KS9sb2coMikgd2l0aCBhbiBvYnZpb3VzIGV4Y2VwdGlvbgorICogZm9yIGk9MC4gVGhpcyBsb2ctdGFibGUgY29udmVydHMgYSBsaW5lYXIgdm9sdW1lLXNjYWxpbmcgKDAuLjEyNykgdG8gYQorICogbG9nYXJpdGhtaWMgc2NhbGluZyBhcyBwcmVzZW50IGluIHRoZSBGTS1zeW50aGVzaXplciBjaGlwcy4gc28gOiAgICBWb2x1bWUKKyAqIDY0ID0gIDAgZGIgPSByZWxhdGl2ZSB2b2x1bWUgIDAgYW5kOiAgICBWb2x1bWUgMzIgPSAtNiBkYiA9IHJlbGF0aXZlCisgKiB2b2x1bWUgLTggaXQgd2FzIGltcGxlbWVudGVkIGFzIGEgdGFibGUgYmVjYXVzZSBpdCBpcyBvbmx5IDEyOCBieXRlcyBhbmQKKyAqIGl0IHNhdmVzIGEgbG90IG9mIGxvZygpIGNhbGN1bGF0aW9ucy4gKFJIKQorICovCisKK3N0YXRpYyBjaGFyIGZtX3ZvbHVtZV90YWJsZVsxMjhdID0KK3sKKwktNjQsIC00OCwgLTQwLCAtMzUsIC0zMiwgLTI5LCAtMjcsIC0yNiwKKwktMjQsIC0yMywgLTIxLCAtMjAsIC0xOSwgLTE4LCAtMTgsIC0xNywKKwktMTYsIC0xNSwgLTE1LCAtMTQsIC0xMywgLTEzLCAtMTIsIC0xMiwKKwktMTEsIC0xMSwgLTEwLCAtMTAsIC0xMCwgLTksIC05LCAtOCwKKwktOCwgLTgsIC03LCAtNywgLTcsIC02LCAtNiwgLTYsCisJLTUsIC01LCAtNSwgLTUsIC00LCAtNCwgLTQsIC00LAorCS0zLCAtMywgLTMsIC0zLCAtMiwgLTIsIC0yLCAtMiwKKwktMiwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsCisJMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwKKwkxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDQsCisJNCwgNCwgNCwgNCwgNCwgNCwgNCwgNSwKKwk1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisJNiwgNywgNywgNywgNywgNywgNywgNywKKwk3LCA3LCA3LCA4LCA4LCA4LCA4LCA4Cit9OworCitzdGF0aWMgdm9pZCBjYWxjX3ZvbCh1bnNpZ25lZCBjaGFyICpyZWdieXRlLCBpbnQgdm9sdW1lLCBpbnQgbWFpbl92b2wpCit7CisJaW50IGxldmVsID0gKH4qcmVnYnl0ZSAmIDB4M2YpOworCisJaWYgKG1haW5fdm9sID4gMTI3KQorCQltYWluX3ZvbCA9IDEyNzsKKwl2b2x1bWUgPSAodm9sdW1lICogbWFpbl92b2wpIC8gMTI3OworCisJaWYgKGxldmVsKQorCQlsZXZlbCArPSBmbV92b2x1bWVfdGFibGVbdm9sdW1lXTsKKworCWlmIChsZXZlbCA+IDB4M2YpCisJCWxldmVsID0gMHgzZjsKKwlpZiAobGV2ZWwgPCAwKQorCQlsZXZlbCA9IDA7CisKKwkqcmVnYnl0ZSA9ICgqcmVnYnl0ZSAmIDB4YzApIHwgKH5sZXZlbCAmIDB4M2YpOworfQorCitzdGF0aWMgdm9pZCBzZXRfdm9pY2Vfdm9sdW1lKGludCB2b2ljZSwgaW50IHZvbHVtZSwgaW50IG1haW5fdm9sKQoreworCXVuc2lnbmVkIGNoYXIgdm9sMSwgdm9sMiwgdm9sMywgdm9sNDsKKwlzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgKmluc3RyOworCXN0cnVjdCBwaHlzaWNhbF92b2ljZV9pbmZvICptYXA7CisKKwlpZiAodm9pY2UgPCAwIHx8IHZvaWNlID49IGRldmMtPm5yX3ZvaWNlKQorCQlyZXR1cm47CisKKwltYXAgPSAmcHZfbWFwW2RldmMtPmx2X21hcFt2b2ljZV1dOworCWluc3RyID0gZGV2Yy0+YWN0X2lbdm9pY2VdOworCisJaWYgKCFpbnN0cikKKwkJaW5zdHIgPSAmZGV2Yy0+aV9tYXBbMF07CisKKwlpZiAoaW5zdHItPmNoYW5uZWwgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoZGV2Yy0+dm9jW3ZvaWNlXS5tb2RlID09IDApCisJCXJldHVybjsKKworCWlmIChkZXZjLT52b2Nbdm9pY2VdLm1vZGUgPT0gMikKKwl7CisJCXZvbDEgPSBpbnN0ci0+b3BlcmF0b3JzWzJdOworCQl2b2wyID0gaW5zdHItPm9wZXJhdG9yc1szXTsKKwkJaWYgKChpbnN0ci0+b3BlcmF0b3JzWzEwXSAmIDB4MDEpKQorCQl7CisJCQljYWxjX3ZvbCgmdm9sMSwgdm9sdW1lLCBtYWluX3ZvbCk7CisJCQljYWxjX3ZvbCgmdm9sMiwgdm9sdW1lLCBtYWluX3ZvbCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQljYWxjX3ZvbCgmdm9sMiwgdm9sdW1lLCBtYWluX3ZvbCk7CisJCX0KKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLU0xfTEVWRUwgKyBtYXAtPm9wWzBdLCB2b2wxKTsKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLU0xfTEVWRUwgKyBtYXAtPm9wWzFdLCB2b2wyKTsKKwl9CisJZWxzZQorCXsJLyoKKwkJICogNCBPUCB2b2ljZQorCQkgKi8KKwkJaW50IGNvbm5lY3Rpb247CisKKwkJdm9sMSA9IGluc3RyLT5vcGVyYXRvcnNbMl07CisJCXZvbDIgPSBpbnN0ci0+b3BlcmF0b3JzWzNdOworCQl2b2wzID0gaW5zdHItPm9wZXJhdG9yc1tPRkZTXzRPUCArIDJdOworCQl2b2w0ID0gaW5zdHItPm9wZXJhdG9yc1tPRkZTXzRPUCArIDNdOworCisJCS8qCisJCSAqIFRoZSBjb25uZWN0aW9uIG1ldGhvZCBmb3IgNCBPUCBkZXZjLT52b2MgaXMgZGVmaW5lZCBieSB0aGUgcmlnaHRtb3N0CisJCSAqIGJpdHMgYXQgdGhlIG9mZnNldHMgMTAgYW5kIDEwK09GRlNfNE9QCisJCSAqLworCisJCWNvbm5lY3Rpb24gPSAoKGluc3RyLT5vcGVyYXRvcnNbMTBdICYgMHgwMSkgPDwgMSkgfCAoaW5zdHItPm9wZXJhdG9yc1sxMCArIE9GRlNfNE9QXSAmIDB4MDEpOworCisJCXN3aXRjaCAoY29ubmVjdGlvbikKKwkJeworCQkJY2FzZSAwOgorCQkJCWNhbGNfdm9sKCZ2b2w0LCB2b2x1bWUsIG1haW5fdm9sKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAxOgorCQkJCWNhbGNfdm9sKCZ2b2wyLCB2b2x1bWUsIG1haW5fdm9sKTsKKwkJCQljYWxjX3ZvbCgmdm9sNCwgdm9sdW1lLCBtYWluX3ZvbCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCQljYWxjX3ZvbCgmdm9sMSwgdm9sdW1lLCBtYWluX3ZvbCk7CisJCQkJY2FsY192b2woJnZvbDQsIHZvbHVtZSwgbWFpbl92b2wpOworCQkJCWJyZWFrOworCisJCQljYXNlIDM6CisJCQkJY2FsY192b2woJnZvbDEsIHZvbHVtZSwgbWFpbl92b2wpOworCQkJCWNhbGNfdm9sKCZ2b2wzLCB2b2x1bWUsIG1haW5fdm9sKTsKKwkJCQljYWxjX3ZvbCgmdm9sNCwgdm9sdW1lLCBtYWluX3ZvbCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJOworCQl9CisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS1NMX0xFVkVMICsgbWFwLT5vcFswXSwgdm9sMSk7CisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS1NMX0xFVkVMICsgbWFwLT5vcFsxXSwgdm9sMik7CisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS1NMX0xFVkVMICsgbWFwLT5vcFsyXSwgdm9sMyk7CisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS1NMX0xFVkVMICsgbWFwLT5vcFszXSwgdm9sNCk7CisJfQorfQorCitzdGF0aWMgaW50IG9wbDNfc3RhcnRfbm90ZSAoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgbm90ZSwgaW50IHZvbHVtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGEsIGZwYzsKKwlpbnQgYmxvY2ssIGZudW0sIGZyZXEsIHZvaWNlX21vZGUsIHBhbjsKKwlzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgKmluc3RyOworCXN0cnVjdCBwaHlzaWNhbF92b2ljZV9pbmZvICptYXA7CisKKwlpZiAodm9pY2UgPCAwIHx8IHZvaWNlID49IGRldmMtPm5yX3ZvaWNlKQorCQlyZXR1cm4gMDsKKworCW1hcCA9ICZwdl9tYXBbZGV2Yy0+bHZfbWFwW3ZvaWNlXV07CisJcGFuID0gZGV2Yy0+dm9jW3ZvaWNlXS5wYW5uaW5nOworCisJaWYgKG1hcC0+dm9pY2VfbW9kZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChub3RlID09IDI1NSkJLyoKKwkJCQkgKiBKdXN0IGNoYW5nZSB0aGUgdm9sdW1lCisJCQkJICovCisJeworCQlzZXRfdm9pY2Vfdm9sdW1lKHZvaWNlLCB2b2x1bWUsIGRldmMtPnZvY1t2b2ljZV0udm9sdW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBLaWxsIHByZXZpb3VzIG5vdGUgYmVmb3JlIHBsYXlpbmcKKwkgKi8KKwkKKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEtTTF9MRVZFTCArIG1hcC0+b3BbMV0sIDB4ZmYpOwkvKgorCQkJCQkJCQkJICogQ2FycmllcgorCQkJCQkJCQkJICogdm9sdW1lIHRvCisJCQkJCQkJCQkgKiBtaW4KKwkJCQkJCQkJCSAqLworCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS1NMX0xFVkVMICsgbWFwLT5vcFswXSwgMHhmZik7CS8qCisJCQkJCQkJCQkgKiBNb2R1bGF0b3IKKwkJCQkJCQkJCSAqIHZvbHVtZSB0bworCQkJCQkJCQkJICovCisKKwlpZiAobWFwLT52b2ljZV9tb2RlID09IDQpCisJeworCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEtTTF9MRVZFTCArIG1hcC0+b3BbMl0sIDB4ZmYpOworCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEtTTF9MRVZFTCArIG1hcC0+b3BbM10sIDB4ZmYpOworCX0KKworCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS0VZT05fQkxPQ0sgKyBtYXAtPnZvaWNlX251bSwgMHgwMCk7CS8qCisJCQkJCQkJCQkgKiBOb3RlCisJCQkJCQkJCQkgKiBvZmYKKwkJCQkJCQkJCSAqLworCisJaW5zdHIgPSBkZXZjLT5hY3RfaVt2b2ljZV07CisJCisJaWYgKCFpbnN0cikKKwkJaW5zdHIgPSAmZGV2Yy0+aV9tYXBbMF07CisKKwlpZiAoaW5zdHItPmNoYW5uZWwgPCAwKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3BsMzogSW5pdGlhbGl6aW5nIHZvaWNlICVkIHdpdGggdW5kZWZpbmVkIGluc3RydW1lbnRcbiIsIHZvaWNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1hcC0+dm9pY2VfbW9kZSA9PSAyICYmIGluc3RyLT5rZXkgPT0gT1BMM19QQVRDSCkKKwkJcmV0dXJuIDA7CS8qCisJCQkJICogQ2Fubm90IHBsYXkKKwkJCQkgKi8KKworCXZvaWNlX21vZGUgPSBtYXAtPnZvaWNlX21vZGU7CisKKwlpZiAodm9pY2VfbW9kZSA9PSA0KQorCXsKKwkJaW50IHZvaWNlX3NoaWZ0OworCisJCXZvaWNlX3NoaWZ0ID0gKG1hcC0+aW9hZGRyID09IGRldmMtPmxlZnRfaW8pID8gMCA6IDM7CisJCXZvaWNlX3NoaWZ0ICs9IG1hcC0+dm9pY2VfbnVtOworCisJCWlmIChpbnN0ci0+a2V5ICE9IE9QTDNfUEFUQ0gpCS8qCisJCQkJCQkgKiBKdXN0IDIgT1AgcGF0Y2gKKwkJCQkJCSAqLworCQl7CisJCQl2b2ljZV9tb2RlID0gMjsKKwkJCWRldmMtPmNtYXNrICY9IH4oMSA8PCB2b2ljZV9zaGlmdCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkZXZjLT5jbWFzayB8PSAoMSA8PCB2b2ljZV9zaGlmdCk7CisJCX0KKworCQlvcGwzX2NvbW1hbmQoZGV2Yy0+cmlnaHRfaW8sIENPTk5FQ1RJT05fU0VMRUNUX1JFR0lTVEVSLCBkZXZjLT5jbWFzayk7CisJfQorCisJLyoKKwkgKiBTZXQgU291bmQgQ2hhcmFjdGVyaXN0aWNzCisJICovCisJCisJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBBTV9WSUIgKyBtYXAtPm9wWzBdLCBpbnN0ci0+b3BlcmF0b3JzWzBdKTsKKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEFNX1ZJQiArIG1hcC0+b3BbMV0sIGluc3RyLT5vcGVyYXRvcnNbMV0pOworCisJLyoKKwkgKiBTZXQgQXR0YWNrL0RlY2F5CisJICovCisJCisJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBBVFRBQ0tfREVDQVkgKyBtYXAtPm9wWzBdLCBpbnN0ci0+b3BlcmF0b3JzWzRdKTsKKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEFUVEFDS19ERUNBWSArIG1hcC0+b3BbMV0sIGluc3RyLT5vcGVyYXRvcnNbNV0pOworCisJLyoKKwkgKiBTZXQgU3VzdGFpbi9SZWxlYXNlCisJICovCisJCisJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBTVVNUQUlOX1JFTEVBU0UgKyBtYXAtPm9wWzBdLCBpbnN0ci0+b3BlcmF0b3JzWzZdKTsKKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIFNVU1RBSU5fUkVMRUFTRSArIG1hcC0+b3BbMV0sIGluc3RyLT5vcGVyYXRvcnNbN10pOworCisJLyoKKwkgKiBTZXQgV2F2ZSBTZWxlY3QKKwkgKi8KKworCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgV0FWRV9TRUxFQ1QgKyBtYXAtPm9wWzBdLCBpbnN0ci0+b3BlcmF0b3JzWzhdKTsKKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIFdBVkVfU0VMRUNUICsgbWFwLT5vcFsxXSwgaW5zdHItPm9wZXJhdG9yc1s5XSk7CisKKwkvKgorCSAqIFNldCBGZWVkYmFjay9Db25uZWN0aW9uCisJICovCisJCisJZnBjID0gaW5zdHItPm9wZXJhdG9yc1sxMF07CisKKwlpZiAocGFuICE9IDB4ZmZmZikKKwl7CisJCWZwYyAmPSB+U1RFUkVPX0JJVFM7CisJCWlmIChwYW4gPCAtNjQpCisJCQlmcGMgfD0gVk9JQ0VfVE9fTEVGVDsKKwkJZWxzZQorCQkJaWYgKHBhbiA+IDY0KQorCQkJCWZwYyB8PSBWT0lDRV9UT19SSUdIVDsKKwkJCWVsc2UKKwkJCQlmcGMgfD0gKFZPSUNFX1RPX0xFRlQgfCBWT0lDRV9UT19SSUdIVCk7CisJfQorCisJaWYgKCEoZnBjICYgMHgzMCkpCisJCWZwYyB8PSAweDMwOwkvKgorCQkJCSAqIEVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBjaG4gaXMgZW5hYmxlZAorCQkJCSAqLworCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgRkVFREJBQ0tfQ09OTkVDVElPTiArIG1hcC0+dm9pY2VfbnVtLCBmcGMpOworCisJLyoKKwkgKiBJZiB0aGUgdm9pY2UgaXMgYSA0IE9QIG9uZSwgaW5pdGlhbGl6ZSB0aGUgb3BlcmF0b3JzIDMgYW5kIDQgYWxzbworCSAqLworCisJaWYgKHZvaWNlX21vZGUgPT0gNCkKKwl7CisJCS8qCisJCSAqIFNldCBTb3VuZCBDaGFyYWN0ZXJpc3RpY3MKKwkJICovCisJCisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgQU1fVklCICsgbWFwLT5vcFsyXSwgaW5zdHItPm9wZXJhdG9yc1tPRkZTXzRPUCArIDBdKTsKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBBTV9WSUIgKyBtYXAtPm9wWzNdLCBpbnN0ci0+b3BlcmF0b3JzW09GRlNfNE9QICsgMV0pOworCisJCS8qCisJCSAqIFNldCBBdHRhY2svRGVjYXkKKwkJICovCisJCQorCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEFUVEFDS19ERUNBWSArIG1hcC0+b3BbMl0sIGluc3RyLT5vcGVyYXRvcnNbT0ZGU180T1AgKyA0XSk7CisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgQVRUQUNLX0RFQ0FZICsgbWFwLT5vcFszXSwgaW5zdHItPm9wZXJhdG9yc1tPRkZTXzRPUCArIDVdKTsKKworCQkvKgorCQkgKiBTZXQgU3VzdGFpbi9SZWxlYXNlCisJCSAqLworCQkKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBTVVNUQUlOX1JFTEVBU0UgKyBtYXAtPm9wWzJdLCBpbnN0ci0+b3BlcmF0b3JzW09GRlNfNE9QICsgNl0pOworCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIFNVU1RBSU5fUkVMRUFTRSArIG1hcC0+b3BbM10sIGluc3RyLT5vcGVyYXRvcnNbT0ZGU180T1AgKyA3XSk7CisKKwkJLyoKKwkJICogU2V0IFdhdmUgU2VsZWN0CisJCSAqLworCQkKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBXQVZFX1NFTEVDVCArIG1hcC0+b3BbMl0sIGluc3RyLT5vcGVyYXRvcnNbT0ZGU180T1AgKyA4XSk7CisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgV0FWRV9TRUxFQ1QgKyBtYXAtPm9wWzNdLCBpbnN0ci0+b3BlcmF0b3JzW09GRlNfNE9QICsgOV0pOworCisJCS8qCisJCSAqIFNldCBGZWVkYmFjay9Db25uZWN0aW9uCisJCSAqLworCQkKKwkJZnBjID0gaW5zdHItPm9wZXJhdG9yc1tPRkZTXzRPUCArIDEwXTsKKwkJaWYgKCEoZnBjICYgMHgzMCkpCisJCQkgZnBjIHw9IDB4MzA7CS8qCisJCQkJCSAqIEVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBjaG4gaXMgZW5hYmxlZAorCQkJCQkgKi8KKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBGRUVEQkFDS19DT05ORUNUSU9OICsgbWFwLT52b2ljZV9udW0gKyAzLCBmcGMpOworCX0KKworCWRldmMtPnZvY1t2b2ljZV0ubW9kZSA9IHZvaWNlX21vZGU7CisJc2V0X3ZvaWNlX3ZvbHVtZSh2b2ljZSwgdm9sdW1lLCBkZXZjLT52b2Nbdm9pY2VdLnZvbHVtZSk7CisKKwlmcmVxID0gZGV2Yy0+dm9jW3ZvaWNlXS5vcmlnX2ZyZXEgPSBub3RlX3RvX2ZyZXEobm90ZSkgLyAxMDAwOworCisJLyoKKwkgKiBTaW5jZSB0aGUgcGl0Y2ggYmVuZGVyIG1heSBoYXZlIGJlZW4gc2V0IGJlZm9yZSBwbGF5aW5nIHRoZSBub3RlLCB3ZQorCSAqIGhhdmUgdG8gY2FsY3VsYXRlIHRoZSBiZW5kaW5nIG5vdy4KKwkgKi8KKworCWZyZXEgPSBjb21wdXRlX2ZpbmV0dW5lKGRldmMtPnZvY1t2b2ljZV0ub3JpZ19mcmVxLCBkZXZjLT52b2Nbdm9pY2VdLmJlbmRlciwgZGV2Yy0+dm9jW3ZvaWNlXS5iZW5kZXJfcmFuZ2UsIDApOworCWRldmMtPnZvY1t2b2ljZV0uY3VycmVudF9mcmVxID0gZnJlcTsKKworCWZyZXFfdG9fZm51bShmcmVxLCAmYmxvY2ssICZmbnVtKTsKKworCS8qCisJICogUGxheSBub3RlCisJICovCisKKwlkYXRhID0gZm51bSAmIDB4ZmY7CS8qCisJCQkJICogTGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBmbnVtYmVyCisJCQkJICovCisJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBGTlVNX0xPVyArIG1hcC0+dm9pY2VfbnVtLCBkYXRhKTsKKworCWRhdGEgPSAweDIwIHwgKChibG9jayAmIDB4NykgPDwgMikgfCAoKGZudW0gPj4gOCkgJiAweDMpOworCQkgZGV2Yy0+dm9jW3ZvaWNlXS5rZXlvbl9ieXRlID0gZGF0YTsKKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEtFWU9OX0JMT0NLICsgbWFwLT52b2ljZV9udW0sIGRhdGEpOworCWlmICh2b2ljZV9tb2RlID09IDQpCisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS0VZT05fQkxPQ0sgKyBtYXAtPnZvaWNlX251bSArIDMsIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZXFfdG9fZm51bSAgICAoaW50IGZyZXEsIGludCAqYmxvY2ssIGludCAqZm51bSkKK3sKKwlpbnQgZiwgb2N0YXZlOworCisJLyoKKwkgKiBDb252ZXJ0cyB0aGUgbm90ZSBmcmVxdWVuY3kgdG8gYmxvY2sgYW5kIGZudW0gdmFsdWVzIGZvciB0aGUgRk0gY2hpcAorCSAqLworCS8qCisJICogRmlyc3QgdHJ5IHRvIGNvbXB1dGUgdGhlIGJsb2NrIC12YWx1ZSAob2N0YXZlKSB3aGVyZSB0aGUgbm90ZSBiZWxvbmdzCisJICovCisKKwlmID0gZnJlcTsKKworCW9jdGF2ZSA9IDU7CisKKwlpZiAoZiA9PSAwKQorCQlvY3RhdmUgPSAwOworCWVsc2UgaWYgKGYgPCAyNjEpCisJeworCQl3aGlsZSAoZiA8IDI2MSkKKwkJeworCQkJb2N0YXZlLS07CisJCQlmIDw8PSAxOworCQl9CisJfQorCWVsc2UgaWYgKGYgPiA0OTMpCisJeworCQl3aGlsZSAoZiA+IDQ5MykKKwkJeworCQkJIG9jdGF2ZSsrOworCQkJIGYgPj49IDE7CisJCX0KKwl9CisKKwlpZiAob2N0YXZlID4gNykKKwkJb2N0YXZlID0gNzsKKworCSpmbnVtID0gZnJlcSAqICgxIDw8ICgyMCAtIG9jdGF2ZSkpIC8gNDk3MTY7CisJKmJsb2NrID0gb2N0YXZlOworfQorCitzdGF0aWMgdm9pZCBvcGwzX2NvbW1hbmQgICAgKGludCBpb19hZGRyLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwkgaW50IGk7CisKKwkvKgorCSAqIFRoZSBvcmlnaW5hbCAyLU9QIHN5bnRoIHJlcXVpcmVzIGEgcXVpdGUgbG9uZyBkZWxheSBhZnRlciB3cml0aW5nIHRvIGEKKwkgKiByZWdpc3Rlci4gVGhlIE9QTC0zIHN1cnZpdmVzIHdpdGgganVzdCB0d28gSU5CcworCSAqLworCisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIChhZGRyICYgMHhmZikpLCBpb19hZGRyKTsKKworCWlmIChkZXZjLT5tb2RlbCAhPSAyKQorCQl1ZGVsYXkoMTApOworCWVsc2UKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJCWluYihpb19hZGRyKTsKKworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAodmFsICYgMHhmZikpLCBpb19hZGRyICsgMSk7CisKKwlpZiAoZGV2Yy0+bW9kZWwgIT0gMikKKwkJdWRlbGF5KDMwKTsKKwllbHNlCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCQlpbmIoaW9fYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG9wbDNfcmVzZXQoaW50IGRldm5vKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDE4OyBpKyspCisJCWRldmMtPmx2X21hcFtpXSA9IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2Yy0+bnJfdm9pY2U7IGkrKykKKwl7CisJCW9wbDNfY29tbWFuZChwdl9tYXBbZGV2Yy0+bHZfbWFwW2ldXS5pb2FkZHIsCisJCQlLU0xfTEVWRUwgKyBwdl9tYXBbZGV2Yy0+bHZfbWFwW2ldXS5vcFswXSwgMHhmZik7CisKKwkJb3BsM19jb21tYW5kKHB2X21hcFtkZXZjLT5sdl9tYXBbaV1dLmlvYWRkciwKKwkJCUtTTF9MRVZFTCArIHB2X21hcFtkZXZjLT5sdl9tYXBbaV1dLm9wWzFdLCAweGZmKTsKKworCQlpZiAocHZfbWFwW2RldmMtPmx2X21hcFtpXV0udm9pY2VfbW9kZSA9PSA0KQorCQl7CisJCQlvcGwzX2NvbW1hbmQocHZfbWFwW2RldmMtPmx2X21hcFtpXV0uaW9hZGRyLAorCQkJCUtTTF9MRVZFTCArIHB2X21hcFtkZXZjLT5sdl9tYXBbaV1dLm9wWzJdLCAweGZmKTsKKworCQkJb3BsM19jb21tYW5kKHB2X21hcFtkZXZjLT5sdl9tYXBbaV1dLmlvYWRkciwKKwkJCQlLU0xfTEVWRUwgKyBwdl9tYXBbZGV2Yy0+bHZfbWFwW2ldXS5vcFszXSwgMHhmZik7CisJCX0KKworCQlvcGwzX2tpbGxfbm90ZShkZXZubywgaSwgMCwgNjQpOworCX0KKworCWlmIChkZXZjLT5tb2RlbCA9PSAyKQorCXsKKwkJZGV2Yy0+dl9hbGxvYy0+bWF4X3ZvaWNlID0gZGV2Yy0+bnJfdm9pY2UgPSAxODsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTg7IGkrKykKKwkJCXB2X21hcFtpXS52b2ljZV9tb2RlID0gMjsKKworCX0KK30KKworc3RhdGljIGludCBvcGwzX29wZW4oaW50IGRldiwgaW50IG1vZGUpCit7CisJaW50IGk7CisKKwlpZiAoZGV2Yy0+YnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlkZXZjLT5idXN5ID0gMTsKKworCWRldmMtPnZfYWxsb2MtPm1heF92b2ljZSA9IGRldmMtPm5yX3ZvaWNlID0gKGRldmMtPm1vZGVsID09IDIpID8gMTggOiA5OworCWRldmMtPnZfYWxsb2MtPnRpbWVzdGFtcCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTg7IGkrKykKKwl7CisJCWRldmMtPnZfYWxsb2MtPm1hcFtpXSA9IDA7CisJCWRldmMtPnZfYWxsb2MtPmFsbG9jX3RpbWVzW2ldID0gMDsKKwl9CisKKwlkZXZjLT5jbWFzayA9IDB4MDA7CS8qCisJCQkJICogSnVzdCAyIE9QIG1vZGUKKwkJCQkgKi8KKwlpZiAoZGV2Yy0+bW9kZWwgPT0gMikKKwkJb3BsM19jb21tYW5kKGRldmMtPnJpZ2h0X2lvLCBDT05ORUNUSU9OX1NFTEVDVF9SRUdJU1RFUiwgZGV2Yy0+Y21hc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvcGwzX2Nsb3NlKGludCBkZXYpCit7CisJZGV2Yy0+YnVzeSA9IDA7CisJZGV2Yy0+dl9hbGxvYy0+bWF4X3ZvaWNlID0gZGV2Yy0+bnJfdm9pY2UgPSAoZGV2Yy0+bW9kZWwgPT0gMikgPyAxOCA6IDk7CisKKwlkZXZjLT5mbV9pbmZvLm5yX2RydW1zID0gMDsKKwlkZXZjLT5mbV9pbmZvLnBlcmNfbW9kZSA9IDA7CisKKwlvcGwzX3Jlc2V0KGRldik7Cit9CisKK3N0YXRpYyB2b2lkIG9wbDNfaHdfY29udHJvbChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyICpldmVudCkKK3sKK30KKworc3RhdGljIGludCBvcGwzX2xvYWRfcGF0Y2goaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJCWludCBvZmZzLCBpbnQgY291bnQsIGludCBwbWdyX2ZsYWcpCit7CisJc3RydWN0IHNiaV9pbnN0cnVtZW50IGluczsKKworCWlmIChjb3VudCA8c2l6ZW9mKGlucykpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJGTSBFcnJvcjogUGF0Y2ggcmVjb3JkIHRvbyBzaG9ydFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogV2hhdCB0aGUgZnVjayBpcyBnb2luZyBvbiBoZXJlPyAgV2UgbGVhdmUganVuayBpbiB0aGUgYmVnaW5uaW5nCisJICogb2YgaW5zIGFuZCB0aGVuIGNoZWNrIHRoZSBmaWVsZCBwcmV0dHkgY2xvc2UgdG8gdGhhdCBiZWdpbm5pbmc/CisJICovCisJaWYoY29weV9mcm9tX3VzZXIoJigoY2hhciAqKSAmaW5zKVtvZmZzXSwgYWRkciArIG9mZnMsIHNpemVvZihpbnMpIC0gb2ZmcykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGlucy5jaGFubmVsIDwgMCB8fCBpbnMuY2hhbm5lbCA+PSBTQkZNX01BWElOU1RSKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRk0gRXJyb3I6IEludmFsaWQgaW5zdHJ1bWVudCBudW1iZXIgJWRcbiIsIGlucy5jaGFubmVsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlucy5rZXkgPSBmb3JtYXQ7CisKKwlyZXR1cm4gc3RvcmVfaW5zdHIoaW5zLmNoYW5uZWwsICZpbnMpOworfQorCitzdGF0aWMgdm9pZCBvcGwzX3Bhbm5pbmcoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgdmFsdWUpCit7CisJZGV2Yy0+dm9jW3ZvaWNlXS5wYW5uaW5nID0gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIG9wbDNfdm9sdW1lX21ldGhvZChpbnQgZGV2LCBpbnQgbW9kZSkKK3sKK30KKworI2RlZmluZSBTRVRfVklCUkFUTyhjZWxsKSB7IFwKKwl0bXAgPSBpbnN0ci0+b3BlcmF0b3JzWyhjZWxsLTEpKygoKGNlbGwtMSkvMikqT0ZGU180T1ApXTsgXAorCWlmIChwcmVzc3VyZSA+IDExMCkgXAorCQl0bXAgfD0gMHg0MDsJCS8qIFZpYnJhdG8gb24gKi8gXAorCW9wbDNfY29tbWFuZCAobWFwLT5pb2FkZHIsIEFNX1ZJQiArIG1hcC0+b3BbY2VsbC0xXSwgdG1wKTt9CisKK3N0YXRpYyB2b2lkIG9wbDNfYWZ0ZXJ0b3VjaChpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBwcmVzc3VyZSkKK3sKKwlpbnQgdG1wOworCXN0cnVjdCBzYmlfaW5zdHJ1bWVudCAqaW5zdHI7CisJc3RydWN0IHBoeXNpY2FsX3ZvaWNlX2luZm8gKm1hcDsKKworCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gZGV2Yy0+bnJfdm9pY2UpCisJCXJldHVybjsKKworCW1hcCA9ICZwdl9tYXBbZGV2Yy0+bHZfbWFwW3ZvaWNlXV07CisKKwlERUIocHJpbnRrKCJBZnRlcnRvdWNoICVkXG4iLCB2b2ljZSkpOworCisJaWYgKG1hcC0+dm9pY2VfbW9kZSA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEFkanVzdCB0aGUgYW1vdW50IG9mIHZpYnJhdG8gZGVwZW5kaW5nIHRoZSBwcmVzc3VyZQorCSAqLworCisJaW5zdHIgPSBkZXZjLT5hY3RfaVt2b2ljZV07CisKKwlpZiAoIWluc3RyKQorCQlpbnN0ciA9ICZkZXZjLT5pX21hcFswXTsKKworCWlmIChkZXZjLT52b2Nbdm9pY2VdLm1vZGUgPT0gNCkKKwl7CisJCWludCBjb25uZWN0aW9uID0gKChpbnN0ci0+b3BlcmF0b3JzWzEwXSAmIDB4MDEpIDw8IDEpIHwgKGluc3RyLT5vcGVyYXRvcnNbMTAgKyBPRkZTXzRPUF0gJiAweDAxKTsKKworCQlzd2l0Y2ggKGNvbm5lY3Rpb24pCisJCXsKKwkJCWNhc2UgMDoKKwkJCQlTRVRfVklCUkFUTyg0KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAxOgorCQkJCVNFVF9WSUJSQVRPKDIpOworCQkJCVNFVF9WSUJSQVRPKDQpOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CisJCQkJU0VUX1ZJQlJBVE8oMSk7CisJCQkJU0VUX1ZJQlJBVE8oNCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzoKKwkJCQlTRVRfVklCUkFUTygxKTsKKwkJCQlTRVRfVklCUkFUTygzKTsKKwkJCQlTRVRfVklCUkFUTyg0KTsKKwkJCQlicmVhazsKKworCQl9CisJCS8qCisJCSAqIE5vdCBpbXBsZW1lbnRlZCB5ZXQKKwkJICovCisJfQorCWVsc2UKKwl7CisJCVNFVF9WSUJSQVRPKDEpOworCisJCWlmICgoaW5zdHItPm9wZXJhdG9yc1sxMF0gJiAweDAxKSkJLyoKKwkJCQkJCQkgKiBBZGRpdGl2ZSBzeW50aGVzaXMKKwkJCQkJCQkgKi8KKwkJCVNFVF9WSUJSQVRPKDIpOworCX0KK30KKworI3VuZGVmIFNFVF9WSUJSQVRPCisKK3N0YXRpYyB2b2lkIGJlbmRfcGl0Y2goaW50IGRldiwgaW50IHZvaWNlLCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBkYXRhOworCWludCBibG9jaywgZm51bSwgZnJlcTsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9pY2VfaW5mbyAqbWFwOworCisJbWFwID0gJnB2X21hcFtkZXZjLT5sdl9tYXBbdm9pY2VdXTsKKworCWlmIChtYXAtPnZvaWNlX21vZGUgPT0gMCkKKwkJcmV0dXJuOworCisJZGV2Yy0+dm9jW3ZvaWNlXS5iZW5kZXIgPSB2YWx1ZTsKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm47CisJaWYgKCEoZGV2Yy0+dm9jW3ZvaWNlXS5rZXlvbl9ieXRlICYgMHgyMCkpCisJCXJldHVybjsJLyoKKwkJCSAqIE5vdCBrZXllZCBvbgorCQkJICovCisKKwlmcmVxID0gY29tcHV0ZV9maW5ldHVuZShkZXZjLT52b2Nbdm9pY2VdLm9yaWdfZnJlcSwgZGV2Yy0+dm9jW3ZvaWNlXS5iZW5kZXIsIGRldmMtPnZvY1t2b2ljZV0uYmVuZGVyX3JhbmdlLCAwKTsKKwlkZXZjLT52b2Nbdm9pY2VdLmN1cnJlbnRfZnJlcSA9IGZyZXE7CisKKwlmcmVxX3RvX2ZudW0oZnJlcSwgJmJsb2NrLCAmZm51bSk7CisKKwlkYXRhID0gZm51bSAmIDB4ZmY7CS8qCisJCQkJICogTGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBmbnVtYmVyCisJCQkJICovCisJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBGTlVNX0xPVyArIG1hcC0+dm9pY2VfbnVtLCBkYXRhKTsKKworCWRhdGEgPSAweDIwIHwgKChibG9jayAmIDB4NykgPDwgMikgfCAoKGZudW0gPj4gOCkgJiAweDMpOworCWRldmMtPnZvY1t2b2ljZV0ua2V5b25fYnl0ZSA9IGRhdGE7CisJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLRVlPTl9CTE9DSyArIG1hcC0+dm9pY2VfbnVtLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgb3BsM19jb250cm9sbGVyIChpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBjdHJsX251bSwgaW50IHZhbHVlKQoreworCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gZGV2Yy0+bnJfdm9pY2UpCisJCXJldHVybjsKKworCXN3aXRjaCAoY3RybF9udW0pCisJeworCQljYXNlIENUUkxfUElUQ0hfQkVOREVSOgorCQkJYmVuZF9waXRjaChkZXYsIHZvaWNlLCB2YWx1ZSk7CisJCQlicmVhazsKKworCQljYXNlIENUUkxfUElUQ0hfQkVOREVSX1JBTkdFOgorCQkJZGV2Yy0+dm9jW3ZvaWNlXS5iZW5kZXJfcmFuZ2UgPSB2YWx1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1RMX01BSU5fVk9MVU1FOgorCQkJZGV2Yy0+dm9jW3ZvaWNlXS52b2x1bWUgPSB2YWx1ZSAvIDEyODsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1RMX1BBTjoKKwkJCWRldmMtPnZvY1t2b2ljZV0ucGFubmluZyA9ICh2YWx1ZSAqIDIpIC0gMTI4OworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBvcGwzX2JlbmRlcihpbnQgZGV2LCBpbnQgdm9pY2UsIGludCB2YWx1ZSkKK3sKKwlpZiAodm9pY2UgPCAwIHx8IHZvaWNlID49IGRldmMtPm5yX3ZvaWNlKQorCQlyZXR1cm47CisKKwliZW5kX3BpdGNoKGRldiwgdm9pY2UsIHZhbHVlIC0gODE5Mik7Cit9CisKK3N0YXRpYyBpbnQgb3BsM19hbGxvY192b2ljZShpbnQgZGV2LCBpbnQgY2huLCBpbnQgbm90ZSwgc3RydWN0IHZvaWNlX2FsbG9jX2luZm8gKmFsbG9jKQoreworCWludCBpLCBwLCBiZXN0LCBmaXJzdCwgYXZhaWwsIGJlc3RfdGltZSA9IDB4N2ZmZmZmZmY7CisJc3RydWN0IHNiaV9pbnN0cnVtZW50ICppbnN0cjsKKwlpbnQgaXM0b3A7CisJaW50IGluc3RyX25vOworCisJaWYgKGNobiA8IDAgfHwgY2huID4gMTUpCisJCWluc3RyX25vID0gMDsKKwllbHNlCisJCWluc3RyX25vID0gZGV2Yy0+Y2huX2luZm9bY2huXS5wZ21fbnVtOworCisJaW5zdHIgPSAmZGV2Yy0+aV9tYXBbaW5zdHJfbm9dOworCWlmIChpbnN0ci0+Y2hhbm5lbCA8IDAgfHwJLyogSW5zdHJ1bWVudCBub3QgbG9hZGVkICovCisJCWRldmMtPm5yX3ZvaWNlICE9IDEyKQkvKiBOb3QgaW4gNCBPUCBtb2RlICovCisJCWlzNG9wID0gMDsKKwllbHNlIGlmIChkZXZjLT5ucl92b2ljZSA9PSAxMikJLyogNCBPUCBtb2RlICovCisJCWlzNG9wID0gKGluc3RyLT5rZXkgPT0gT1BMM19QQVRDSCk7CisJZWxzZQorCQlpczRvcCA9IDA7CisKKwlpZiAoaXM0b3ApCisJeworCQlmaXJzdCA9IHAgPSAwOworCQlhdmFpbCA9IDY7CisJfQorCWVsc2UKKwl7CisJCWlmIChkZXZjLT5ucl92b2ljZSA9PSAxMikJLyogNCBPUCBtb2RlLiBVc2UgdGhlICcyIE9QIG9ubHknIG9wZXJhdG9ycyBmaXJzdCAqLworCQkJZmlyc3QgPSBwID0gNjsKKwkJZWxzZQorCQkJZmlyc3QgPSBwID0gMDsKKwkJYXZhaWwgPSBkZXZjLT5ucl92b2ljZTsKKwl9CisKKwkvKgorCSAqICAgIE5vdyB0cnkgdG8gZmluZCBhIGZyZWUgdm9pY2UKKwkgKi8KKwliZXN0ID0gZmlyc3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXZhaWw7IGkrKykKKwl7CisJCWlmIChhbGxvYy0+bWFwW3BdID09IDApCisJCXsKKwkJCXJldHVybiBwOworCQl9CisJCWlmIChhbGxvYy0+YWxsb2NfdGltZXNbcF0gPCBiZXN0X3RpbWUpCQkvKiBGaW5kIG9sZGVzdCBwbGF5aW5nIG5vdGUgKi8KKwkJeworCQkJYmVzdF90aW1lID0gYWxsb2MtPmFsbG9jX3RpbWVzW3BdOworCQkJYmVzdCA9IHA7CisJCX0KKwkJcCA9IChwICsgMSkgJSBhdmFpbDsKKwl9CisKKwkvKgorCSAqICAgIEluc2VydCBzb21lIGtpbmQgb2YgcHJpb3JpdHkgbWVjaGFuaXNtIGhlcmUuCisJICovCisKKwlpZiAoYmVzdCA8IDApCisJCWJlc3QgPSAwOworCWlmIChiZXN0ID4gZGV2Yy0+bnJfdm9pY2UpCisJCWJlc3QgLT0gZGV2Yy0+bnJfdm9pY2U7CisKKwlyZXR1cm4gYmVzdDsJLyogQWxsIGRldmMtPnZvYyBpbiB1c2UuIFNlbGVjdCB0aGUgZmlyc3Qgb25lLiAqLworfQorCitzdGF0aWMgdm9pZCBvcGwzX3NldHVwX3ZvaWNlKGludCBkZXYsIGludCB2b2ljZSwgaW50IGNobikKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9pbmZvICppbmZvID0KKwkmc3ludGhfZGV2c1tkZXZdLT5jaG5faW5mb1tjaG5dOworCisJb3BsM19zZXRfaW5zdHIoZGV2LCB2b2ljZSwgaW5mby0+cGdtX251bSk7CisKKwlkZXZjLT52b2Nbdm9pY2VdLmJlbmRlciA9IDA7CisJZGV2Yy0+dm9jW3ZvaWNlXS5iZW5kZXJfcmFuZ2UgPSBpbmZvLT5iZW5kZXJfcmFuZ2U7CisJZGV2Yy0+dm9jW3ZvaWNlXS52b2x1bWUgPSBpbmZvLT5jb250cm9sbGVyc1tDVExfTUFJTl9WT0xVTUVdOworCWRldmMtPnZvY1t2b2ljZV0ucGFubmluZyA9IChpbmZvLT5jb250cm9sbGVyc1tDVExfUEFOXSAqIDIpIC0gMTI4OworfQorCitzdGF0aWMgc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgb3BsM19vcGVyYXRpb25zID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlkCQk9ICJPUEwiLAorCS5pbmZvCQk9IE5VTEwsCisJLm1pZGlfZGV2CT0gMCwKKwkuc3ludGhfdHlwZQk9IFNZTlRIX1RZUEVfRk0sCisJLnN5bnRoX3N1YnR5cGUJPSBGTV9UWVBFX0FETElCLAorCS5vcGVuCQk9IG9wbDNfb3BlbiwKKwkuY2xvc2UJCT0gb3BsM19jbG9zZSwKKwkuaW9jdGwJCT0gb3BsM19pb2N0bCwKKwkua2lsbF9ub3RlCT0gb3BsM19raWxsX25vdGUsCisJLnN0YXJ0X25vdGUJPSBvcGwzX3N0YXJ0X25vdGUsCisJLnNldF9pbnN0cgk9IG9wbDNfc2V0X2luc3RyLAorCS5yZXNldAkJPSBvcGwzX3Jlc2V0LAorCS5od19jb250cm9sCT0gb3BsM19od19jb250cm9sLAorCS5sb2FkX3BhdGNoCT0gb3BsM19sb2FkX3BhdGNoLAorCS5hZnRlcnRvdWNoCT0gb3BsM19hZnRlcnRvdWNoLAorCS5jb250cm9sbGVyCT0gb3BsM19jb250cm9sbGVyLAorCS5wYW5uaW5nCT0gb3BsM19wYW5uaW5nLAorCS52b2x1bWVfbWV0aG9kCT0gb3BsM192b2x1bWVfbWV0aG9kLAorCS5iZW5kZXIJCT0gb3BsM19iZW5kZXIsCisJLmFsbG9jX3ZvaWNlCT0gb3BsM19hbGxvY192b2ljZSwKKwkuc2V0dXBfdm9pY2UJPSBvcGwzX3NldHVwX3ZvaWNlCit9OworCitpbnQgb3BsM19pbml0KGludCBpb2FkZHIsIGludCAqb3NwLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlpbnQgaTsKKwlpbnQgbWU7CisKKwlpZiAoZGV2YyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJvcGwzOiBEZXZpY2UgY29udHJvbCBzdHJ1Y3R1cmUgbm90IGluaXRpYWxpemVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKG1lID0gc291bmRfYWxsb2Nfc3ludGhkZXYoKSkgPT0gLTEpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcGwzOiBUb28gbWFueSBzeW50aGVzaXplcnNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2Yy0+bnJfdm9pY2UgPSA5OworCisJZGV2Yy0+Zm1faW5mby5kZXZpY2UgPSAwOworCWRldmMtPmZtX2luZm8uc3ludGhfdHlwZSA9IFNZTlRIX1RZUEVfRk07CisJZGV2Yy0+Zm1faW5mby5zeW50aF9zdWJ0eXBlID0gRk1fVFlQRV9BRExJQjsKKwlkZXZjLT5mbV9pbmZvLnBlcmNfbW9kZSA9IDA7CisJZGV2Yy0+Zm1faW5mby5ucl92b2ljZXMgPSA5OworCWRldmMtPmZtX2luZm8ubnJfZHJ1bXMgPSAwOworCWRldmMtPmZtX2luZm8uaW5zdHJfYmFua19zaXplID0gU0JGTV9NQVhJTlNUUjsKKwlkZXZjLT5mbV9pbmZvLmNhcGFiaWxpdGllcyA9IDA7CisJZGV2Yy0+bGVmdF9pbyA9IGlvYWRkcjsKKwlkZXZjLT5yaWdodF9pbyA9IGlvYWRkciArIDI7CisKKwlpZiAoZGV0ZWN0ZWRfbW9kZWwgPD0gMikKKwkJZGV2Yy0+bW9kZWwgPSAxOworCWVsc2UKKwl7CisJCWRldmMtPm1vZGVsID0gMjsKKwkJaWYgKGRldGVjdGVkX21vZGVsID09IDQpCisJCQlkZXZjLT5pc19vcGw0ID0gMTsKKwl9CisKKwlvcGwzX29wZXJhdGlvbnMuaW5mbyA9ICZkZXZjLT5mbV9pbmZvOworCisJc3ludGhfZGV2c1ttZV0gPSAmb3BsM19vcGVyYXRpb25zOworCisJaWYgKG93bmVyKQorCQlzeW50aF9kZXZzW21lXS0+b3duZXIgPSBvd25lcjsKKwkKKwlzZXF1ZW5jZXJfaW5pdCgpOworCWRldmMtPnZfYWxsb2MgPSAmb3BsM19vcGVyYXRpb25zLmFsbG9jOworCWRldmMtPmNobl9pbmZvID0gJm9wbDNfb3BlcmF0aW9ucy5jaG5faW5mb1swXTsKKworCWlmIChkZXZjLT5tb2RlbCA9PSAyKQorCXsKKwkJaWYgKGRldmMtPmlzX29wbDQpIAorCQkJc3RyY3B5KGRldmMtPmZtX2luZm8ubmFtZSwgIllhbWFoYSBPUEw0L09QTDMgRk0iKTsKKwkJZWxzZSAKKwkJCXN0cmNweShkZXZjLT5mbV9pbmZvLm5hbWUsICJZYW1haGEgT1BMMyIpOworCisJCWRldmMtPnZfYWxsb2MtPm1heF92b2ljZSA9IGRldmMtPm5yX3ZvaWNlID0gMTg7CisJCWRldmMtPmZtX2luZm8ubnJfZHJ1bXMgPSAwOworCQlkZXZjLT5mbV9pbmZvLnN5bnRoX3N1YnR5cGUgPSBGTV9UWVBFX09QTDM7CisJCWRldmMtPmZtX2luZm8uY2FwYWJpbGl0aWVzIHw9IFNZTlRIX0NBUF9PUEwzOworCisJCWZvciAoaSA9IDA7IGkgPCAxODsgaSsrKQorCQl7CisJCQlpZiAocHZfbWFwW2ldLmlvYWRkciA9PSBVU0VfTEVGVCkKKwkJCQlwdl9tYXBbaV0uaW9hZGRyID0gZGV2Yy0+bGVmdF9pbzsKKwkJCWVsc2UKKwkJCQlwdl9tYXBbaV0uaW9hZGRyID0gZGV2Yy0+cmlnaHRfaW87CisJCX0KKwkJb3BsM19jb21tYW5kKGRldmMtPnJpZ2h0X2lvLCBPUEwzX01PREVfUkVHSVNURVIsIE9QTDNfRU5BQkxFKTsKKwkJb3BsM19jb21tYW5kKGRldmMtPnJpZ2h0X2lvLCBDT05ORUNUSU9OX1NFTEVDVF9SRUdJU1RFUiwgMHgwMCk7CisJfQorCWVsc2UKKwl7CisJCXN0cmNweShkZXZjLT5mbV9pbmZvLm5hbWUsICJZYW1haGEgT1BMMiIpOworCQlkZXZjLT52X2FsbG9jLT5tYXhfdm9pY2UgPSBkZXZjLT5ucl92b2ljZSA9IDk7CisJCWRldmMtPmZtX2luZm8ubnJfZHJ1bXMgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCAxODsgaSsrKQorCQkJcHZfbWFwW2ldLmlvYWRkciA9IGRldmMtPmxlZnRfaW87CisJfTsKKwljb25mX3ByaW50ZjIoZGV2Yy0+Zm1faW5mby5uYW1lLCBpb2FkZHIsIDAsIC0xLCAtMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0JGTV9NQVhJTlNUUjsgaSsrKQorCQlkZXZjLT5pX21hcFtpXS5jaGFubmVsID0gLTE7CisKKwlyZXR1cm4gbWU7Cit9CisKK0VYUE9SVF9TWU1CT0wob3BsM19pbml0KTsKK0VYUE9SVF9TWU1CT0wob3BsM19kZXRlY3QpOworCitzdGF0aWMgaW50IG1lOworCitzdGF0aWMgaW50IGlvID0gLTE7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9vcGwzICh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIllNMzgxMiBhbmQgT1BMLTMgZHJpdmVyIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiwgUm9iIEhvb2Z0IDE5OTMtMTk5NlxuIik7CisKKwlpZiAoaW8gIT0gLTEpCS8qIFVzZXIgbG9hZGluZyBwdXJlIE9QTDMgbW9kdWxlICovCisJeworCQlpZiAoIW9wbDNfZGV0ZWN0KGlvLCBOVUxMKSkKKwkJeworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQltZSA9IG9wbDNfaW5pdChpbywgTlVMTCwgVEhJU19NT0RVTEUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9vcGwzKHZvaWQpCit7CisJaWYgKGRldmMgJiYgaW8gIT0gLTEpCisJeworCQlpZiAoZGV2Yy0+YmFzZSkgeworCQkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSw0KTsKKwkJCWlmIChkZXZjLT5pc19vcGw0KQorCQkJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UgLSA4LCAyKTsKKwkJfQorCQlrZnJlZShkZXZjKTsKKwkJZGV2YyA9IE5VTEw7CisJCXNvdW5kX3VubG9hZF9zeW50aGRldihtZSk7CisJfQorfQorCittb2R1bGVfaW5pdChpbml0X29wbDMpOworbW9kdWxlX2V4aXQoY2xlYW51cF9vcGwzKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX29wbDMoY2hhciAqc3RyKQoreworICAgICAgICAvKiBpbyAgKi8KKwlpbnQgaW50c1syXTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvID0gaW50c1sxXTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJvcGwzPSIsIHNldHVwX29wbDMpOworI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvb3BsMy5oIGIvc291bmQvb3NzL29wbDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM5YTRiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL29wbDMuaApAQCAtMCwwICsxLDUgQEAKKworaW50IG9wbDNfZGV0ZWN0IChpbnQgaW9hZGRyLCBpbnQgKm9zcCk7CitpbnQgb3BsM19pbml0KGludCBpb2FkZHIsIGludCAqb3NwLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7CisKK3ZvaWQgZW5hYmxlX29wbDNfbW9kZShpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgYm90aCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvb3BsM19ody5oIGIvc291bmQvb3NzL29wbDNfaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjExYzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL29wbDNfaHcuaApAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqCW9wbDNfaHcuaAktIERlZmluaXRpb25zIG9mIHRoZSBPUEwtMyByZWdpc3RlcnMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICoKKyAqCVRoZSBPUEwtMyBtb2RlIGlzIHN3aXRjaGVkIG9uIGJ5IHdyaXRpbmcgMHgwMSwgdG8gdGhlIG9mZnNldCA1CisgKglvZiB0aGUgcmlnaHQgc2lkZS4KKyAqCisgKglBbm90aGVyIHNwZWNpYWwgcmVnaXN0ZXIgYXQgdGhlIHJpZ2h0IHNpZGUgaXMgYXQgb2Zmc2V0IDQuIEl0IGNvbnRhaW5zCisgKglhIGJpdCBtYXNrIGRlZmluaW5nIHdoaWNoIHZvaWNlcyBhcmUgdXNlZCBhcyA0IE9QIHZvaWNlcy4KKyAqCisgKglUaGUgcGVyY3Vzc2l2ZSBtb2RlIGlzIGltcGxlbWVudGVkIGluIHRoZSBsZWZ0IHNpZGUgb25seS4KKyAqCisgKglXaXRoIHRoZSBhYm92ZSBleGNlcHRpb25zIHRoZSBib3RoIHNpZGVzIGNhbiBiZSBvcGVyYXRlZCBpbmRlcGVuZGVudGx5LgorICoJCisgKglBIDQgT1Agdm9pY2UgY2FuIGJlIGNyZWF0ZWQgYnkgc2V0dGluZyB0aGUgY29ycmVzcG9uZGluZworICoJYml0IGF0IG9mZnNldCA0IG9mIHRoZSByaWdodCBzaWRlLgorICoKKyAqCUZvciBleGFtcGxlIHNldHRpbmcgdGhlIHJpZ2h0bW9zdCBiaXQgKDB4MDEpIGNoYW5nZXMgdGhlCisgKglmaXJzdCB2b2ljZSBvbiB0aGUgcmlnaHQgc2lkZSB0byB0aGUgNCBPUCBtb2RlLiBUaGUgZm91cnRoCisgKgl2b2ljZSBpcyBtYWRlIGluYWNjZXNzaWJsZS4KKyAqCisgKglJZiBhIHZvaWNlIGlzIHNldCB0byB0aGUgMiBPUCBtb2RlLCBpdCB3b3JrcyBsaWtlIDIgT1AgbW9kZXMKKyAqCW9mIHRoZSBvcmlnaW5hbCBZTTM4MTIgKEFkTGliKS4gSW4gYWRkaXRpb24gdGhlIHZvaWNlIGNhbiAKKyAqCWJlIGNvbm5lY3RlZCB0aGUgbGVmdCwgcmlnaHQgb3IgYm90aCBzdGVyZW8gY2hhbm5lbHMuIEl0IGNhbgorICoJZXZlbiBiZSBsZWZ0IHVuY29ubmVjdGVkLiBUaGlzIHdvcmtzIHdpdGggNCBPUCB2b2ljZXMgYWxzby4KKyAqCisgKglUaGUgc3RlcmVvIGNvbm5lY3Rpb24gYml0cyBhcmUgbG9jYXRlZCBpbiB0aGUgRkVFREJBQ0tfQ09OTkVDVElPTgorICoJcmVnaXN0ZXIgb2YgdGhlIHZvaWNlICgweEMwLTB4QzgpLiBJbiA0IE9QIHZvaWNlcyB0aGVzZSBiaXRzIGFyZQorICoJaW4gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB2b2ljZS4KKyAqLworCisvKgorICoJUmVnaXN0ZXIgbnVtYmVycyBmb3IgdGhlIGdsb2JhbCByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIFRFU1RfUkVHSVNURVIJCQkJMHgwMQorI2RlZmluZSAgIEVOQUJMRV9XQVZFX1NFTEVDVAkJMHgyMAorCisjZGVmaW5lIFRJTUVSMV9SRUdJU1RFUgkJCQkweDAyCisjZGVmaW5lIFRJTUVSMl9SRUdJU1RFUgkJCQkweDAzCisjZGVmaW5lIFRJTUVSX0NPTlRST0xfUkVHSVNURVIJCQkweDA0CS8qIExlZnQgc2lkZSAqLworI2RlZmluZSAgIElSUV9SRVNFVAkJCTB4ODAKKyNkZWZpbmUgICBUSU1FUjFfTUFTSwkJCTB4NDAKKyNkZWZpbmUgICBUSU1FUjJfTUFTSwkJCTB4MjAKKyNkZWZpbmUgICBUSU1FUjFfU1RBUlQJCQkweDAxCisjZGVmaW5lICAgVElNRVIyX1NUQVJUCQkJMHgwMgorCisjZGVmaW5lIENPTk5FQ1RJT05fU0VMRUNUX1JFR0lTVEVSCQkweDA0CS8qIFJpZ2h0IHNpZGUgKi8KKyNkZWZpbmUgICBSSUdIVF80T1BfMAkJCTB4MDEKKyNkZWZpbmUgICBSSUdIVF80T1BfMQkJCTB4MDIKKyNkZWZpbmUgICBSSUdIVF80T1BfMgkJCTB4MDQKKyNkZWZpbmUgICBMRUZUXzRPUF8wCQkJMHgwOAorI2RlZmluZSAgIExFRlRfNE9QXzEJCQkweDEwCisjZGVmaW5lICAgTEVGVF80T1BfMgkJCTB4MjAKKworI2RlZmluZSBPUEwzX01PREVfUkVHSVNURVIJCQkweDA1CS8qIFJpZ2h0IHNpZGUgKi8KKyNkZWZpbmUgICBPUEwzX0VOQUJMRQkJCTB4MDEKKyNkZWZpbmUgICBPUEw0X0VOQUJMRQkJCTB4MDIKKworI2RlZmluZSBLQkRfU1BMSVRfUkVHSVNURVIJCQkweDA4CS8qIExlZnQgc2lkZSAqLworI2RlZmluZSAgIENPTVBPU0lURV9TSU5FX1dBVkVfTU9ERQkweDgwCQkvKiBEb24ndCB1c2Ugd2l0aCBPUEwtMz8gKi8KKyNkZWZpbmUgICBLRVlCT0FSRF9TUExJVAkJMHg0MAorCisjZGVmaW5lIFBFUkNPU1NJT05fUkVHSVNURVIJCQkweGJkCS8qIExlZnQgc2lkZSBvbmx5ICovCisjZGVmaW5lICAgVFJFTU9MT19ERVBUSAkJCTB4ODAKKyNkZWZpbmUgICBWSUJSQVRPX0RFUFRICQkJMHg0MAorI2RlZmluZQkgIFBFUkNPU1NJT05fRU5BQkxFCQkweDIwCisjZGVmaW5lICAgQkFTU0RSVU1fT04JCQkweDEwCisjZGVmaW5lICAgU05BUkVEUlVNX09OCQkJMHgwOAorI2RlZmluZSAgIFRPTVRPTV9PTgkJCTB4MDQKKyNkZWZpbmUgICBDWU1CQUxfT04JCQkweDAyCisjZGVmaW5lICAgSElIQVRfT04JCQkweDAxCisKKy8qCisgKglPZmZzZXRzIHRvIHRoZSByZWdpc3RlciBiYW5rcyBmb3Igb3BlcmF0b3JzLiBUbyBnZXQgdGhlCisgKglyZWdpc3RlciBudW1iZXIganVzdCBhZGQgdGhlIG9wZXJhdG9yIG9mZnNldCB0byB0aGUgYmFuayBvZmZzZXQKKyAqCisgKglBTS9WSUIvRUcvS1NSL011bHRpcGxlICgweDIwIHRvIDB4MzUpCisgKi8KKyNkZWZpbmUgQU1fVklCCQkJCQkweDIwCisjZGVmaW5lICAgVFJFTU9MT19PTgkJCTB4ODAKKyNkZWZpbmUgICBWSUJSQVRPX09OCQkJMHg0MAorI2RlZmluZSAgIFNVU1RBSU5fT04JCQkweDIwCisjZGVmaW5lICAgS1NSCQkJCTB4MTAgCS8qIEtleSBzY2FsaW5nIHJhdGUgKi8KKyNkZWZpbmUgICBNVUxUSVBMRV9NQVNLCQkweDBmCS8qIEZyZXF1ZW5jeSBtdWx0aXBsaWVyICovCisKKyAvKgorICAqCUtTTC9Ub3RhbCBsZXZlbCAoMHg0MCB0byAweDU1KQorICAqLworI2RlZmluZSBLU0xfTEVWRUwJCQkJMHg0MAorI2RlZmluZSAgIEtTTF9NQVNLCQkJMHhjMAkvKiBFbnZlbG9wZSBzY2FsaW5nIGJpdHMgKi8KKyNkZWZpbmUgICBUT1RBTF9MRVZFTF9NQVNLCQkweDNmCS8qIFN0cmVuZ3RoICh2b2x1bWUpIG9mIE9QICovCisKKy8qCisgKglBdHRhY2sgLyBEZWNheSByYXRlICgweDYwIHRvIDB4NzUpCisgKi8KKyNkZWZpbmUgQVRUQUNLX0RFQ0FZCQkJCTB4NjAKKyNkZWZpbmUgICBBVFRBQ0tfTUFTSwkJCTB4ZjAKKyNkZWZpbmUgICBERUNBWV9NQVNLCQkJMHgwZgorCisvKgorICogU3VzdGFpbiBsZXZlbCAvIFJlbGVhc2UgcmF0ZSAoMHg4MCB0byAweDk1KQorICovCisjZGVmaW5lIFNVU1RBSU5fUkVMRUFTRQkJCQkweDgwCisjZGVmaW5lICAgU1VTVEFJTl9NQVNLCQkJMHhmMAorI2RlZmluZSAgIFJFTEVBU0VfTUFTSwkJCTB4MGYKKworLyoKKyAqIFdhdmUgc2VsZWN0ICgweEUwIHRvIDB4RjUpCisgKi8KKyNkZWZpbmUgV0FWRV9TRUxFQ1QJCQkweGUwCisKKy8qCisgKglPZmZzZXRzIHRvIHRoZSByZWdpc3RlciBiYW5rcyBmb3Igdm9pY2VzLiBKdXN0IGFkZCB0byB0aGUKKyAqCXZvaWNlIG51bWJlciB0byBnZXQgdGhlIHJlZ2lzdGVyIG51bWJlci4KKyAqCisgKglGLU51bWJlciBsb3cgYml0cyAoMHhBMCB0byAweEE4KS4KKyAqLworI2RlZmluZSBGTlVNX0xPVwkJCQkweGEwCisKKy8qCisgKglGLW51bWJlciBoaWdoIGJpdHMgLyBLZXkgb24gLyBCbG9jayAob2N0YXZlKSAoMHhCMCB0byAweEI4KQorICovCisjZGVmaW5lIEtFWU9OX0JMT0NLCQkJCQkweGIwCisjZGVmaW5lCSAgS0VZT05fQklUCQkJCTB4MjAKKyNkZWZpbmUJICBCTE9DS05VTV9NQVNLCQkJCTB4MWMKKyNkZWZpbmUgICBGTlVNX0hJR0hfTUFTSwkJCTB4MDMKKworLyoKKyAqCUZlZWRiYWNrIC8gQ29ubmVjdGlvbiAoMHhjMCB0byAweGM4KQorICoKKyAqCVRoZXNlIHJlZ2lzdGVycyBoYXZlIHR3byBuZXcgYml0cyB3aGVuIHRoZSBPUEwtMyBtb2RlCisgKglpcyBzZWxlY3RlZC4gVGhlc2UgYml0cyBjb250cm9scyBjb25uZWN0aW5nIHRoZSB2b2ljZQorICoJdG8gdGhlIHN0ZXJlbyBjaGFubmVscy4gRm9yIDQgT1Agdm9pY2VzIHRoaXMgYml0IGlzCisgKglkZWZpbmVkIGluIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgdm9pY2UgKGFkZCAzIHRvIHRoZQorICoJcmVnaXN0ZXIgb2Zmc2V0KS4KKyAqCisgKglGb3IgNCBPUCB2b2ljZXMgdGhlIGNvbm5lY3Rpb24gYml0IGlzIHVzZWQgaW4gdGhlCisgKglib3RoIGhhbHZlcyAoZ2l2ZXMgNCB3YXlzIHRvIGNvbm5lY3QgdGhlIG9wZXJhdG9ycykuCisgKi8KKyNkZWZpbmUgRkVFREJBQ0tfQ09OTkVDVElPTgkJCQkweGMwCisjZGVmaW5lICAgRkVFREJBQ0tfTUFTSwkJCQkweDBlCS8qIFZhbGlkIGp1c3QgZm9yIDFzdCBPUCBvZiBhIHZvaWNlICovCisjZGVmaW5lICAgQ09OTkVDVElPTl9CSVQJCQkweDAxCisvKgorICoJSW4gdGhlIDQgT1AgbW9kZSB0aGVyZSBpcyBmb3VyIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb25zIGhvdyB0aGUKKyAqCW9wZXJhdG9ycyBjYW4gYmUgY29ubmVjdGVkIHRvZ2V0aGVyIChpbiAyIE9QIG1vZGVzIHRoZXJlIGlzIGp1c3QKKyAqCUFNIG9yIEZNKS4gVGhlIDQgT1AgY29ubmVjdGlvbiBtb2RlIGlzIGRlZmluZWQgYnkgdGhlIHJpZ2h0bW9zdAorICoJYml0IG9mIHRoZSBGRUVEQkFDS19DT05ORUNUSU9OICgweEMwLTB4QzgpIG9uIHRoZSBib3RoIGhhbHZlcy4KKyAqCisgKglGaXJzdCBoYWxmCVNlY29uZCBoYWxmCU1vZGUKKyAqCisgKgkJCQkJICstLS0rCisgKgkJCQkJIHYgICB8CisgKgkwCQkwCQk+Ky0xLSstLTItLTMtLTQtLT4KKyAqCisgKgorICoJCQkJCQorICoJCQkJCSArLS0tKworICoJCQkJCSB8ICAgfAorICoJMAkJMQkJPistMS0rLS0yLSsKKyAqCQkJCQkJICB8LT4KKyAqCQkJCQk+LS0zLS0tLTQtKworICoJCQkJCQorICoJCQkJCSArLS0tKworICoJCQkJCSB8ICAgfAorICoJMQkJMAkJPistMS0rLS0tLS0rCisgKgkJCQkJCSAgIHwtPgorICoJCQkJCT4tLTItLTMtLTQtKworICoKKyAqCQkJCQkgKy0tLSsKKyAqCQkJCQkgfCAgIHwKKyAqCTEJCTEJCT4rLTEtKy0tKworICoJCQkJCQl8CisgKgkJCQkJPi0tMi0tMy0rLT4KKyAqCQkJCQkJfAorICoJCQkJCT4tLTQtLS0tKworICovCisjZGVmaW5lICAgU1RFUkVPX0JJVFMJCQkJMHgzMAkvKiBPUEwtMyBvbmx5ICovCisjZGVmaW5lICAgICBWT0lDRV9UT19MRUZUCQkweDEwCisjZGVmaW5lICAgICBWT0lDRV9UT19SSUdIVAkJMHgyMAorCisvKgorICogCURlZmluaXRpb24gdGFibGUgZm9yIHRoZSBwaHlzaWNhbCB2b2ljZXMKKyAqLworCitzdHJ1Y3QgcGh5c2ljYWxfdm9pY2VfaW5mbyB7CisJCXVuc2lnbmVkIGNoYXIgdm9pY2VfbnVtOworCQl1bnNpZ25lZCBjaGFyIHZvaWNlX21vZGU7IC8qIDA9dW5hdmFpbGFibGUsIDI9MiBPUCwgND00IE9QICovCisJCXVuc2lnbmVkIHNob3J0IGlvYWRkcjsgLyogSS9PIHBvcnQgKGxlZnQgb3IgcmlnaHQgc2lkZSkgKi8KKwkJdW5zaWduZWQgY2hhciBvcFs0XTsgLyogT3BlcmF0b3Igb2Zmc2V0cyAqLworCX07CisKKy8qCisgKglUaGVyZSBpcyAxOCBwb3NzaWJsZSAyIE9QIHZvaWNlcworICoJKDkgaW4gdGhlIGxlZnQgYW5kIDkgaW4gdGhlIHJpZ2h0KS4KKyAqCVRoZSBmaXJzdCBPUCBpcyB0aGUgbW9kdWxhdG9yIGFuZCAybmQgaXMgdGhlIGNhcnJpZXIuCisgKgorICoJVGhlIGZpcnN0IHRocmVlIHZvaWNlcyBpbiB0aGUgYm90aCBzaWRlcyBtYXkgYmUgY29ubmVjdGVkCisgKgl3aXRoIGFub3RoZXIgdm9pY2UgdG8gYSA0IE9QIHZvaWNlLiBGb3IgZXhhbXBsZSB2b2ljZSAwCisgKgljYW4gYmUgY29ubmVjdGVkIHdpdGggdm9pY2UgMy4gVGhlIG9wZXJhdG9ycyBvZiB2b2ljZSAzIGFyZQorICoJdXNlZCBhcyBvcGVyYXRvcnMgMyBhbmQgNCBvZiB0aGUgbmV3IDQgT1Agdm9pY2UuCisgKglJbiB0aGlzIGNhc2UgdGhlIDIgT1Agdm9pY2UgbnVtYmVyIDAgaXMgdGhlICdmaXJzdCBoYWxmJyBhbmQKKyAqCXZvaWNlIDMgaXMgdGhlIHNlY29uZC4KKyAqLworCisjZGVmaW5lIFVTRV9MRUZUCTAKKyNkZWZpbmUgVVNFX1JJR0hUCTEKKworc3RhdGljIHN0cnVjdCBwaHlzaWNhbF92b2ljZV9pbmZvIHB2X21hcFsxOF0gPQoreworLyogICAgICAgTm8gTW9kZSBTaWRlCQlPUDEJT1AyCU9QMyAgIE9QNAkqLworLyoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisJeyAwLCAgMiwgVVNFX0xFRlQsCXsweDAwLAkweDAzLAkweDA4LCAweDBifX0sCisJeyAxLCAgMiwgVVNFX0xFRlQsCXsweDAxLAkweDA0LAkweDA5LCAweDBjfX0sCisJeyAyLCAgMiwgVVNFX0xFRlQsCXsweDAyLAkweDA1LAkweDBhLCAweDBkfX0sCisKKwl7IDMsICAyLCBVU0VfTEVGVCwJezB4MDgsCTB4MGIsCTB4MDAsIDB4MDB9fSwKKwl7IDQsICAyLCBVU0VfTEVGVCwJezB4MDksCTB4MGMsCTB4MDAsIDB4MDB9fSwKKwl7IDUsICAyLCBVU0VfTEVGVCwJezB4MGEsCTB4MGQsCTB4MDAsIDB4MDB9fSwKKworCXsgNiwgIDIsIFVTRV9MRUZULAl7MHgxMCwJMHgxMywJMHgwMCwgMHgwMH19LCAvKiBVc2VkIGJ5IHBlcmN1c3NpdmUgdm9pY2VzICovCisJeyA3LCAgMiwgVVNFX0xFRlQsCXsweDExLAkweDE0LAkweDAwLCAweDAwfX0sIC8qIGlmIHRoZSBwZXJjdXNzaXZlIG1vZGUgKi8KKwl7IDgsICAyLCBVU0VfTEVGVCwJezB4MTIsCTB4MTUsCTB4MDAsIDB4MDB9fSwgLyogaXMgc2VsZWN0ZWQgKi8KKworCXsgMCwgIDIsIFVTRV9SSUdIVCwJezB4MDAsCTB4MDMsCTB4MDgsIDB4MGJ9fSwKKwl7IDEsICAyLCBVU0VfUklHSFQsCXsweDAxLAkweDA0LAkweDA5LCAweDBjfX0sCisJeyAyLCAgMiwgVVNFX1JJR0hULAl7MHgwMiwJMHgwNSwJMHgwYSwgMHgwZH19LAorCisJeyAzLCAgMiwgVVNFX1JJR0hULAl7MHgwOCwJMHgwYiwJMHgwMCwgMHgwMH19LAorCXsgNCwgIDIsIFVTRV9SSUdIVCwJezB4MDksCTB4MGMsCTB4MDAsIDB4MDB9fSwKKwl7IDUsICAyLCBVU0VfUklHSFQsCXsweDBhLAkweDBkLAkweDAwLCAweDAwfX0sCisKKwl7IDYsICAyLCBVU0VfUklHSFQsCXsweDEwLAkweDEzLAkweDAwLCAweDAwfX0sCisJeyA3LCAgMiwgVVNFX1JJR0hULAl7MHgxMSwJMHgxNCwJMHgwMCwgMHgwMH19LAorCXsgOCwgIDIsIFVTRV9SSUdIVCwJezB4MTIsCTB4MTUsCTB4MDAsIDB4MDB9fQorfTsKKy8qCisgKglETUEgYnVmZmVyIGNhbGxzCisgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcGwzc2EuYyBiL3NvdW5kL29zcy9vcGwzc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTQ5MDdjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL29wbDNzYS5jCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogc291bmQvb3BsM3NhLmMKKyAqCisgKiBMb3cgbGV2ZWwgZHJpdmVyIGZvciBZYW1haGEgWU1GNzAxQiBha2EgT1BMMy1TQSBjaGlwCisgKiAKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICogQ2hhbmdlczoKKyAqCUFsYW4gQ294CQlNb2R1bGFyaXNhdGlvbgorICoJQ2hyaXN0b3BoIEhlbGx3aWcJQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdAorICoJQXJuYWxkbyBDLiBkZSBNZWxvCWdvdCByaWQgb2YgYXR0YWNoX3VhcnQ0MDEKKyAqCisgKiBGSVhNRToKKyAqIAlDaGVjayBmb3IgaW5zdGFsbCBvZiBtcHUgZXRjIGlzIHdyb25nLCBzaG91bGQgY2hlY2sgcmVzdWx0IG9mIHRoZSBtc3Mgc3R1ZmYKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyN1bmRlZiAgU0JfT0sKKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiYWQxODQ4LmgiCisjaW5jbHVkZSAibXB1NDAxLmgiCisKKyNpZmRlZiBTQl9PSworI2luY2x1ZGUgInNiLmgiCitzdGF0aWMgaW50IHNiX2luaXRpYWxpemVkOworI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG9wbDNzYV9yZWFkKGludCBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB0bXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisJb3V0YigoMHgxZCksIDB4Zjg2KTsJLyogcGFzc3dvcmQgKi8KKwlvdXRiKCgodW5zaWduZWQgY2hhcikgYWRkciksIDB4Zjg2KTsJLyogYWRkcmVzcyAqLworCXRtcCA9IGluYigweGY4Nyk7CS8qIGRhdGEgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKworCXJldHVybiB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIG9wbDNzYV93cml0ZShpbnQgYWRkciwgaW50IGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwlvdXRiKCgweDFkKSwgMHhmODYpOwkvKiBwYXNzd29yZCAqLworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSBhZGRyKSwgMHhmODYpOwkvKiBhZGRyZXNzICovCisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIGRhdGEpLCAweGY4Nyk7CS8qIGRhdGEgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX2luaXQgb3BsM3NhX2RldGVjdCh2b2lkKQoreworCWludCB0bXA7CisKKwlpZiAoKCh0bXAgPSBvcGwzc2FfcmVhZCgweDAxKSkgJiAweGM0KSAhPSAweDA0KQorCXsKKwkJRERCKHByaW50aygiT1BMMy1TQSBkZXRlY3QgZXJyb3IgMSAoJXgpXG4iLCBvcGwzc2FfcmVhZCgweDAxKSkpOworCQkvKiByZXR1cm4gMDsgKi8KKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIHBhc3N3b3JkIGZlYXR1cmUgaGFzIGFueSBlZmZlY3QKKwkgKi8KKwkKKwlpZiAoaW5iKDB4Zjg3KSA9PSB0bXApCisJeworCQlEREIocHJpbnRrKCJPUEwzLVNBIGRldGVjdCBmYWlsZWQgMiAoJXgvJXgpXG4iLCB0bXAsIGluYigweGY4NykpKTsKKwkJcmV0dXJuIDA7CisJfQorCXRtcCA9IChvcGwzc2FfcmVhZCgweDA0KSAmIDB4ZTApID4+IDU7CisKKwlpZiAodG1wICE9IDAgJiYgdG1wICE9IDEpCisJeworCQlEREIocHJpbnRrKCJPUEwzLVNBIGRldGVjdCBmYWlsZWQgMyAoJWQpXG4iLCB0bXApKTsKKwkJcmV0dXJuIDA7CisJfQorCUREQihwcmludGsoIk9QTDMtU0EgbW9kZSAleCBkZXRlY3RlZFxuIiwgdG1wKSk7CisKKwlvcGwzc2Ffd3JpdGUoMHgwMSwgMHgwMCk7CS8qIERpc2FibGUgTVNTICovCisJb3BsM3NhX3dyaXRlKDB4MDIsIDB4MDApOwkvKiBEaXNhYmxlIFNCICovCisJb3BsM3NhX3dyaXRlKDB4MDMsIDB4MDApOwkvKiBEaXNhYmxlIE1QVSAqLworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiAgICBQcm9iZSBhbmQgYXR0YWNoIHJvdXRpbmVzIGZvciB0aGUgV2luZG93cyBTb3VuZCBTeXN0ZW0gbW9kZSBvZgorICogICAgIE9QTDMtU0EKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV9vcGwzc2Ffd3NzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IHJlc291cmNlICpwb3J0cykKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcCA9IDB4MjQ7CS8qIFdTUyBlbmFibGUgKi8KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIElPIHBvcnQgcmV0dXJucyB2YWxpZCBzaWduYXR1cmUuIFRoZSBvcmlnaW5hbCBNUyBTb3VuZAorCSAqIHN5c3RlbSByZXR1cm5zIDB4MDQgd2hpbGUgc29tZSBjYXJkcyAoT1BMMy1TQSBmb3IgZXhhbXBsZSkKKwkgKiByZXR1cm4gMHgwMC4KKwkgKi8KKworCWlmICghb3BsM3NhX2RldGVjdCgpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJPU1M6IE9QTDMtU0EgY2hpcCBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJCisJc3dpdGNoIChod19jb25maWctPmlvX2Jhc2UpCisJeworCQljYXNlIDB4NTMwOgorCQkJdG1wIHw9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAweGU4MDoKKwkJCXRtcCB8PSAweDA4OworCQkJYnJlYWs7CisJCWNhc2UgMHhmNDA6CisJCQl0bXAgfD0gMHgxMDsKKwkJCWJyZWFrOworCQljYXNlIDB4NjA0OgorCQkJdG1wIHw9IDB4MTg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiT1NTOiBVbnN1cHBvcnRlZCBPUEwzLVNBL1dTUyBiYXNlICV4XG4iLCBod19jb25maWctPmlvX2Jhc2UpOworCQkgIHJldHVybiAwOworCX0KKworCW9wbDNzYV93cml0ZSgweDAxLCB0bXApOwkvKiBXU1Mgc2V0dXAgcmVnaXN0ZXIgKi8KKworCXJldHVybiBwcm9iZV9tc19zb3VuZChod19jb25maWcsIHBvcnRzKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF9vcGwzc2Ffd3NzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IHJlc291cmNlICpwb3J0cykKK3sKKwlpbnQgbm0gPSBudW1fbWl4ZXJzOworCisJLyogRklYTUUgKi8KKwlhdHRhY2hfbXNfc291bmQoaHdfY29uZmlnLCBwb3J0cywgVEhJU19NT0RVTEUpOworCWlmIChudW1fbWl4ZXJzID4gbm0pCS8qIEEgbWl4ZXIgd2FzIGluc3RhbGxlZCAqLworCXsKKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTEsIFNPVU5EX01JWEVSX0NEKTsKKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTIsIFNPVU5EX01JWEVSX1NZTlRIKTsKKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX0xJTkUpOworCX0KK30KKworCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV9vcGwzc2FfbXB1KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwl1bnNpZ25lZCBjaGFyIGNvbmY7CisJc3RhdGljIHNpZ25lZCBjaGFyIGlycV9iaXRzW10gPSB7CisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgMSwgLTEsIDIsIC0xLCAzLCA0CisJfTsKKworCWlmIChod19jb25maWctPmlycSA+IDEwKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJPUEwzLVNBOiBCYWQgTVBVIElSUSAlZFxuIiwgaHdfY29uZmlnLT5pcnEpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlycV9iaXRzW2h3X2NvbmZpZy0+aXJxXSA9PSAtMSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiT1BMMy1TQTogQmFkIE1QVSBJUlEgJWRcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCXN3aXRjaCAoaHdfY29uZmlnLT5pb19iYXNlKQorCXsKKwkJY2FzZSAweDMzMDoKKwkJCWNvbmYgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgzMzI6CisJCQljb25mID0gMHgyMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MzM0OgorCQkJY29uZiA9IDB4NDA7CisJCQlicmVhazsKKwkJY2FzZSAweDMwMDoKKwkJCWNvbmYgPSAweDYwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsJLyogSW52YWxpZCBwb3J0ICovCisJfQorCisJY29uZiB8PSAweDgzOwkJLyogTVBVICYgT1BMMyAoc3ludGgpICYgZ2FtZSBwb3J0IGVuYWJsZSAqLworCWNvbmYgfD0gaXJxX2JpdHNbaHdfY29uZmlnLT5pcnFdIDw8IDI7CisKKwlvcGwzc2Ffd3JpdGUoMHgwMywgY29uZik7CisKKwlod19jb25maWctPm5hbWUgPSAiT1BMMy1TQSAoTVBVNDAxKSI7CisKKwlyZXR1cm4gcHJvYmVfdWFydDQwMShod19jb25maWcsIFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9vcGwzc2Ffd3NzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgZG1hMiA9IGh3X2NvbmZpZy0+ZG1hMjsKKworCWlmIChkbWEyID09IC0xKQorCQlkbWEyID0gaHdfY29uZmlnLT5kbWE7CisKKwlyZWxlYXNlX3JlZ2lvbigweGY4NiwgMik7CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKKworCWFkMTg0OF91bmxvYWQoaHdfY29uZmlnLT5pb19iYXNlICsgNCwKKwkJICAgICAgaHdfY29uZmlnLT5pcnEsCisJCSAgICAgIGh3X2NvbmZpZy0+ZG1hLAorCQkgICAgICBkbWEyLAorCQkgICAgICAwKTsKKwlzb3VuZF91bmxvYWRfYXVkaW9kZXYoaHdfY29uZmlnLT5zbG90c1swXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQgdW5sb2FkX29wbDNzYV9tcHUoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVubG9hZF91YXJ0NDAxKGh3X2NvbmZpZyk7Cit9CisKKyNpZmRlZiBTQl9PSworc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCB1bmxvYWRfb3BsM3NhX3NiKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlzYl9kc3BfdW5sb2FkKGh3X2NvbmZpZyk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBmb3VuZF9tcHU7CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZ19tcHU7CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpbwk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGlycQk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGRtYQk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGRtYTIJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfaW8JPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfaXJxCT0gLTE7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYTIsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXB1X2lvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1wdV9pcnEsIGludCwgMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfb3BsM3NhKHZvaWQpCit7CisJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwlpZiAoaW8gPT0gLTEgfHwgaXJxID09IC0xIHx8IGRtYSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9wbDNzYTogZG1hLCBpcnEgYW5kIGlvIG11c3QgYmUgc2V0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNmZy5pb19iYXNlID0gaW87CisJY2ZnLmlycSA9IGlycTsKKwljZmcuZG1hID0gZG1hOworCWNmZy5kbWEyID0gZG1hMjsKKwkKKwljZmdfbXB1LmlvX2Jhc2UgPSBtcHVfaW87CisJY2ZnX21wdS5pcnEgPSBtcHVfaXJxOworCisJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihpbyArIDQsIDQsICJhZDE4NDgiKTsKKwlpZiAoIXBvcnRzKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbigweGY4NiwgMiwgIk9QTDMtU0EiKSkvKiBDb250cm9sIHBvcnQgaXMgYnVzeSAqLyB7CisJCXJlbGVhc2VfcmVnaW9uKGlvICsgNCwgNCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDQsICJXU1MgY29uZmlnIikpIHsKKwkJcmVsZWFzZV9yZWdpb24oMHg4NiwgMik7CisJCXJlbGVhc2VfcmVnaW9uKGlvICsgNCwgNCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcm9iZV9vcGwzc2Ffd3NzKCZjZmcsIHBvcnRzKSA9PSAwKSB7CisJCXJlbGVhc2VfcmVnaW9uKDB4Zjg2LCAyKTsKKwkJcmVsZWFzZV9yZWdpb24oaW8sIDQpOworCQlyZWxlYXNlX3JlZ2lvbihpbyArIDQsIDQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3VuZF9tcHU9cHJvYmVfb3BsM3NhX21wdSgmY2ZnX21wdSk7CisKKwlhdHRhY2hfb3BsM3NhX3dzcygmY2ZnLCBwb3J0cyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX29wbDNzYSh2b2lkKQoreworCWlmKGZvdW5kX21wdSkKKwkJdW5sb2FkX29wbDNzYV9tcHUoJmNmZ19tcHUpOworCXVubG9hZF9vcGwzc2Ffd3NzKCZjZmcpOworfQorCittb2R1bGVfaW5pdChpbml0X29wbDNzYSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX29wbDNzYSk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9vcGwzc2EoY2hhciAqc3RyKQoreworCS8qIGlvLCBpcnEsIGRtYSwgZG1hMiwgbXB1X2lvLCBtcHVfaXJxICovCisJaW50IGludHNbN107CisJCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKwkKKwlpbwk9IGludHNbMV07CisJaXJxCT0gaW50c1syXTsKKwlkbWEJPSBpbnRzWzNdOworCWRtYTIJPSBpbnRzWzRdOworCW1wdV9pbwk9IGludHNbNV07CisJbXB1X2lycQk9IGludHNbNl07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgib3BsM3NhPSIsIHNldHVwX29wbDNzYSk7CisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcGwzc2EyLmMgYi9zb3VuZC9vc3Mvb3BsM3NhMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDk5NmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL29wbDNzYTIuYwpAQCAtMCwwICsxLDExMjkgQEAKKy8qCisgKiBzb3VuZC9vcGwzc2EyLmMKKyAqCisgKiBBIGxvdyBsZXZlbCBkcml2ZXIgZm9yIFlhbWFoYSBPUEwzLVNBMiBhbmQgU0EzIGNhcmRzLgorICogTk9URTogQWxsIHRyYWNlcyBvZiB0aGUgbmFtZSBPUEwzLVNBeCBoYXZlIG5vdyAoRGVjZW1iZXIgMjAwMCkgYmVlbgorICogICAgICAgcmVtb3ZlZCBmcm9tIHRoZSBkcml2ZXIgY29kZSwgYXMgYW4gZW1haWwgZXhjaGFuZ2Ugd2l0aCBZYW1haGEKKyAqICAgICAgIHByb3ZpZGVkIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBZTUYtNzE5IGlzIGluZGVlZCBqdXN0IGEKKyAqICAgICAgIHJlLWJhZGdlZCA3MTUuCisgKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMSBTY290dCBNdXJyYXkgPHNjb3R0QHNwaXRlZnVsLm9yZz4KKyAqCisgKiBPcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBDUzQyMzIgZHJpdmVyIChpbiBjczQyMzIuYykgYnkgSGFubnUgU2F2b2xhaW5lbgorICogYW5kIG90aGVycy4gIE5vdyBpbmNvcnBvcmF0ZXMgY29kZS9pZGVhcyBmcm9tIHBzcy5jLCBhbHNvIGJ5IEhhbm51CisgKiBTYXZvbGFpbmVuLiAgQm90aCBvZiB0aG9zZSBmaWxlcyBhcmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgZm9sbG93aW5nCisgKiBsaWNlbnNlOgorICoKKyAqICJDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqICBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiAgZm9yIG1vcmUgaW5mby4iCisgKgorICogQXMgc3VjaCwgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBhYm92ZSBsaWNlbnNlLCB0aGlzIGZpbGUsIG9wbDNzYTIuYywgaXMKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKSBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuCisgKiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBDaGFuZ2UgSGlzdG9yeQorICogLS0tLS0tLS0tLS0tLS0KKyAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIE9yaWdpbmFsIGRyaXZlciAoSnVuIDE0LCAxOTk4KQorICogUGF1bCBKLlkuIExhaGFpZSAgICAgICAgQ2hhbmdlZCBwcm9iaW5nIC8gYXR0YWNoIGNvZGUgb3JkZXIKKyAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEFkZGVkIG1peGVyIHN1cHBvcnQgKERlYyAwMywgMTk5OCkKKyAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIENoYW5nZWQgZGV0ZWN0aW9uIGNvZGUgdG8gYmUgbW9yZSBmb3JnaXZpbmcsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBmb3JjZSBvcHRpb24gYXMgbGFzdCByZXNvcnQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCBpb2N0bCByZXR1cm4gdmFsdWVzLiAoRGVjIDMwLCAxOTk4KQorICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgU2ltcGxlciBkZXRlY3Rpb24gY29kZSBzaG91bGQgd29yayBhbGwgdGhlIHRpbWUgbm93CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAod2l0aCB0aGFua3MgdG8gQmVuIEh1dGNoaW5ncyBmb3IgdGhlIGhldXJpc3RpYyksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIG5vdyB1bm5lY2Vzc2FyeSBmb3JjZSBvcHRpb24uIChKYW4gNSwgMTk5OSkKKyAqIENocmlzdG9waCBIZWxsd2lnCSAgIEFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQgKE1hciA0LCAyMDAwKQorICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgUmV3b3JrZWQgU0EyIHZlcnN1cyBTQTMgbWl4ZXIgY29kZSwgdXBkYXRlZCBjaGlwc2V0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIGRldGVjdGlvbiBjb2RlIChhZ2FpbiEpLiAoRGVjIDUsIDIwMDApCisgKiBTY290dCBNdXJyYXkgICAgICAgICAgICBBZGp1c3RlZCBtYXN0ZXIgdm9sdW1lIG1peGVyIHNjYWxpbmcuIChEZWMgNiwgMjAwMCkKKyAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEJhc2VkIG9uIGEgcGF0Y2ggYnkgSm9lbCBZbGlsdW9tYSAoYWthIEJpc3F3aXQpLAorICogICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRlZCB3aWRlIG1peGVyIGFuZCBhZGp1c3RlZCBtaWMsIGJhc3MsIHRyZWJsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGluZy4gKERlYyA2LCAyMDAwKQorICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQmFzZWQgb24gYSBwYXRjaCBieSBQZXRlciBFbmdsbWFpZXIsIGludGVncmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHltb2RlIGFuZCBsb29wYmFjayBvcHRpb25zLiAoRGVjIDYsIDIwMDApCisgKiBTY290dCBNdXJyYXkgICAgICAgICAgICBJbnNwaXJlZCBieSBhIHBhdGNoIGJ5IFBldGVyIEVuZ2xtYWllciwgYW5kIGJhc2VkIG9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0IEFMU0EgZG9lcywgYWRkZWQgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IERNQSBhbmQgSVJRIHNldHRpbmdzLiAoRGVjIDYsIDIwMDApCisgKiBTY290dCBNdXJyYXkgICAgICAgICAgICBBZGRlZCBzb21lIG1vcmUgY2hlY2tzIHRvIHRoZSBjYXJkIGRldGVjdGlvbiBjb2RlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gd2hhdCBBTFNBIGRvZXMuIChEZWMgMTIsIDIwMDApCisgKiBTY290dCBNdXJyYXkgICAgICAgICAgICBJbnNwaXJlZCBieSBzaW1pbGFyIHBhdGNoZXMgZnJvbSBKb2huIEZyZW1saW4sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBKaW0gUmFkZm9yZCwgTWlrZSBSb2xpZywgYW5kIEluZ21hciBTdGVlbiwgYWRkZWQgMi40CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBJU0EgUG5QIEFQSSBzdXBwb3J0LCBtYWlubHkgYmFzZWQgb24gYml0cyBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzYl9jYXJkLmMgYW5kIGF3ZV93YXZlLmMuIChEZWMgMTIsIDIwMDApCisgKiBTY290dCBNdXJyYXkgICAgICAgICAgICBTb21lIHNtYWxsIGNsZWFudXBzIHRvIHRoZSBpbml0IGNvZGUgb3V0cHV0LgorICogICAgICAgICAgICAgICAgICAgICAgICAgKEphbiA3LCAyMDAxKQorICogWndhbmUgTXdhaWthbWJvCSAgIEFkZGVkIFBNIHN1cHBvcnQuIChEZWMgNCAyMDAxKQorICoKKyAqIEFkYW0gQmVsYXkgICAgICAgICAgICAgIENvbnZlcnRlZCBkcml2ZXIgdG8gbmV3IFBuUCBMYXllciAoT2N0IDEyLCAyMDAyKQorICogWndhbmUgTXdhaWthbWJvCSAgIENvZGUsIGRhdGEgc3RydWN0dXJlIGNsZWFudXBzLiAoRmViIDE1IDIwMDIpCisgKiBad2FuZSBNd2Fpa2FtYm8JICAgRnJlZSByZXNvdXJjZXMgZHVyaW5nIGF1eGlsaWFyeSBkZXZpY2UgcHJvYmUKKyAqIAkJCSAgIGZhaWx1cmVzIChBcHIgMjkgMjAwMikKKyAqICAgCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJhZDE4NDguaCIKKyNpbmNsdWRlICJtcHU0MDEuaCIKKworI2RlZmluZSBPUEwzU0EyX01PRFVMRV9OQU1FCSJvcGwzc2EyIgorI2RlZmluZSBQRlgJCQlPUEwzU0EyX01PRFVMRV9OQU1FICI6ICIKKworLyogVXNlZnVsIGNvbnRyb2wgcG9ydCBpbmRleGVzOiAqLworI2RlZmluZSBPUEwzU0EyX1BNCSAgICAgMHgwMQorI2RlZmluZSBPUEwzU0EyX1NZU19DVFJMICAgICAweDAyCisjZGVmaW5lIE9QTDNTQTJfSVJRX0NPTkZJRyAgIDB4MDMKKyNkZWZpbmUgT1BMM1NBMl9ETUFfQ09ORklHICAgMHgwNgorI2RlZmluZSBPUEwzU0EyX01BU1RFUl9MRUZUICAweDA3CisjZGVmaW5lIE9QTDNTQTJfTUFTVEVSX1JJR0hUIDB4MDgKKyNkZWZpbmUgT1BMM1NBMl9NSUMgICAgICAgICAgMHgwOQorI2RlZmluZSBPUEwzU0EyX01JU0MgICAgICAgICAweDBBCisKKyNkZWZpbmUgT1BMM1NBM19XSURFICAgICAgICAgMHgxNAorI2RlZmluZSBPUEwzU0EzX0JBU1MgICAgICAgICAweDE1CisjZGVmaW5lIE9QTDNTQTNfVFJFQkxFICAgICAgIDB4MTYKKworLyogVXNlZnVsIGNvbnN0YW50czogKi8KKyNkZWZpbmUgREVGQVVMVF9WT0xVTUUgNTAKKyNkZWZpbmUgREVGQVVMVF9NSUMgICAgNTAKKyNkZWZpbmUgREVGQVVMVF9USU1CUkUgMAorCisvKiBQb3dlciBzYXZpbmcgbW9kZXMgKi8KKyNkZWZpbmUgT1BMM1NBMl9QTV9NT0RFMAkweDAwCisjZGVmaW5lIE9QTDNTQTJfUE1fTU9ERTEJMHgwNAkvKiBQU1YgKi8KKyNkZWZpbmUgT1BMM1NBMl9QTV9NT0RFMgkweDA1CS8qIFBTViB8IFBEWCAqLworI2RlZmluZSBPUEwzU0EyX1BNX01PREUzCTB4MjcJLyogQURPV04gfCBQU1YgfCBQRE4gfCBQRFggKi8KKworCisvKiBGb3IgY2hlY2tpbmcgYWdhaW5zdCB3aGF0IHRoZSBjYXJkIHJldHVybnM6ICovCisjZGVmaW5lIFZFUlNJT05fVU5LTk9XTiAwCisjZGVmaW5lIFZFUlNJT05fWU1GNzExICAxCisjZGVmaW5lIFZFUlNJT05fWU1GNzE1ICAyCisjZGVmaW5lIFZFUlNJT05fWU1GNzE1QiAzCisjZGVmaW5lIFZFUlNJT05fWU1GNzE1RSA0CisvKiBhbHNvIGFzc3VtaW5nIHRoYXQgYW55dGhpbmcgPiA0IGJ1dCA8PSA3IGlzIGEgNzE1RSAqLworCisvKiBDaGlwc2V0IHR5cGUgY29uc3RhbnRzIGZvciB1c2UgYmVsb3cgKi8KKyNkZWZpbmUgQ0hJUFNFVF9VTktOT1dOIC0xCisjZGVmaW5lIENISVBTRVRfT1BMM1NBMiAwCisjZGVmaW5lIENISVBTRVRfT1BMM1NBMyAxCitzdGF0aWMgY29uc3QgY2hhciAqQ0hJUFNFVF9UQUJMRVtdID0geyJPUEwzLVNBMiIsICJPUEwzLVNBMyJ9OworCisjaWZkZWYgQ09ORklHX1BOUAorI2RlZmluZSBPUEwzU0EyX0NBUkRTX01BWCA0CisjZWxzZQorI2RlZmluZSBPUEwzU0EyX0NBUkRTX01BWCAxCisjZW5kaWYKKworLyogVGhpcyBzaG91bGQgYmUgcHJldHR5IG9idmlvdXMgKi8KK3N0YXRpYyBpbnQgb3BsM3NhMl9jYXJkc19udW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBkZXZpY2UgcmVzb3VyY2VzICovCisJdW5zaWduZWQgc2hvcnQgY2ZnX3BvcnQ7CisJc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7CisJc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXNzOworCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21wdTsKKyNpZmRlZiBDT05GSUdfUE5QCisJLyogUG5QIFN0dWZmICovCisJc3RydWN0IHBucF9kZXYqIHBkZXY7CisJaW50IGFjdGl2YXRlZDsJCQkvKiBXaGV0aGVyIHNhaWQgZGV2aWNlcyBoYXZlIGJlZW4gYWN0aXZhdGVkICovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUE0KKwl1bnNpZ25lZCBpbnQJaW5fc3VzcGVuZDsKKwlzdHJ1Y3QgcG1fZGV2CSpwbWRldjsKKyNlbmRpZgorCXVuc2lnbmVkIGludAljYXJkOworCWludAkJY2hpcHNldDsJLyogV2hhdCdzIG15IHZlcnNpb24ocyk/ICovCisJY2hhcgkJKmNoaXBzZXRfbmFtZTsKKworCS8qIG1peGVyIGRhdGEgKi8KKwlpbnQJCW1peGVyOworCXVuc2lnbmVkIGludAl2b2x1bWVfbDsKKwl1bnNpZ25lZCBpbnQJdm9sdW1lX3I7CisJdW5zaWduZWQgaW50CW1pYzsKKwl1bnNpZ25lZCBpbnQJYmFzc19sOworCXVuc2lnbmVkIGludAliYXNzX3I7CisJdW5zaWduZWQgaW50CXRyZWJsZV9sOworCXVuc2lnbmVkIGludAl0cmVibGVfcjsKKwl1bnNpZ25lZCBpbnQJd2lkZV9sOworCXVuc2lnbmVkIGludAl3aWRlX3I7Cit9IG9wbDNzYTJfc3RhdGVfdDsKK3N0YXRpYyBvcGwzc2EyX3N0YXRlX3Qgb3BsM3NhMl9zdGF0ZVtPUEwzU0EyX0NBUkRTX01BWF07CisKKwkKKworLyogT3VyIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpbwk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIG1zc19pbwk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIG1wdV9pbwk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGlycQk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGRtYQk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGRtYTIJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSB5bW9kZQk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGxvb3BiYWNrCT0gLTE7CisKKyNpZmRlZiBDT05GSUdfUE5QCisvKiBQblAgc3BlY2lmaWMgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBfX2luaXRkYXRhIGlzYXBucCA9IDE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXVsdGlwbGUgPSAxOworCisvKiBXaGV0aGVyIHNhaWQgZGV2aWNlcyBoYXZlIGJlZW4gYWN0aXZhdGVkICovCitzdGF0aWMgaW50IG9wbDNzYTJfYWN0aXZhdGVkW09QTDNTQTJfQ0FSRFNfTUFYXTsKKyNlbHNlCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXNhcG5wOyAvKiA9IDAgKi8KK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtdWx0aXBsZTsgLyogPSAwICovCisjZW5kaWYKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb2R1bGUgZm9yIE9QTDMtU0EyIGFuZCBTQTMgc291bmQgY2FyZHMgKHVzZXMgQUQxODQ4IE1TUyBkcml2ZXIpLiIpOworTU9EVUxFX0FVVEhPUigiU2NvdHQgTXVycmF5IDxzY290dEBzcGl0ZWZ1bC5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIlNldCBJL08gYmFzZSBvZiBPUEwzLVNBMiBvciBTQTMgY2FyZCAodXN1YWxseSAweDM3MC4gIEFkZHJlc3MgbXVzdCBiZSBldmVuIGFuZCBtdXN0IGJlIGZyb20gMHgxMDAgdG8gMHhGRkUpIik7CisKK21vZHVsZV9wYXJhbShtc3NfaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1zc19pbywgIlNldCBNU1MgKGF1ZGlvKSBJL08gYmFzZSAoMHg1MzAsIDB4RTgwLCBvciBvdGhlci4gQWRkcmVzcyBtdXN0IGVuZCBpbiAwIG9yIDQgYW5kIG11c3QgYmUgZnJvbSAweDUzMCB0byAweEY0OCkiKTsKKworbW9kdWxlX3BhcmFtKG1wdV9pbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXB1X2lvLCAiU2V0IE1JREkgSS9PIGJhc2UgKDB4MzMwIG9yIG90aGVyLiBBZGRyZXNzIG11c3QgYmUgZXZlbiBhbmQgbXVzdCBiZSBmcm9tIDB4MzAwIHRvIDB4MzM0KSIpOworCittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtc3NfaXJxLCAiU2V0IE1TUyAoYXVkaW8pIElSUSAoNSwgNywgOSwgMTAsIDExLCAxMikiKTsKKworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hLCAiU2V0IE1TUyAoYXVkaW8pIGZpcnN0IERNQSBjaGFubmVsICgwLCAxLCAzKSIpOworCittb2R1bGVfcGFyYW0oZG1hMiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hMiwgIlNldCBNU1MgKGF1ZGlvKSBzZWNvbmQgRE1BIGNoYW5uZWwgKDAsIDEsIDMpIik7CisKK21vZHVsZV9wYXJhbSh5bW9kZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoeW1vZGUsICJTZXQgWWFtYWhhIDNEIGVuaGFuY2VtZW50IG1vZGUgKDAgPSBEZXNrdG9wL05vcm1hbCwgMSA9IE5vdGVib29rIFBDICgxKSwgMiA9IE5vdGVib29rIFBDICgyKSwgMyA9IEhpLUZpKSIpOworCittb2R1bGVfcGFyYW0obG9vcGJhY2ssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxvb3BiYWNrLCAiU2V0IEEvRCBpbnB1dCBzb3VyY2UuIFVzZWZ1bCBmb3IgZWNobyBjYW5jZWxsYXRpb24gKDAgPSBNaWMgUmNoIChkZWZhdWx0KSwgMSA9IE1vbm8gb3V0cHV0IGxvb3BiYWNrKSIpOworCisjaWZkZWYgQ09ORklHX1BOUAorbW9kdWxlX3BhcmFtKGlzYXBucCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlzYXBucCwgIldoZW4gc2V0IHRvIDAsIElTQSBQblAgc3VwcG9ydCB3aWxsIGJlIGRpc2FibGVkIik7CisKK21vZHVsZV9wYXJhbShtdWx0aXBsZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG11bHRpcGxlLCAiV2hlbiBzZXQgdG8gMCwgd2lsbCBub3Qgc2VhcmNoIGZvciBtdWx0aXBsZSBjYXJkcyIpOworI2VuZGlmCisKKworLyoKKyAqIFN0YW5kYXJkIHJlYWQgYW5kIHdyaXRlIGZ1bmN0aW9ucworKi8KKworc3RhdGljIGlubGluZSB2b2lkIG9wbDNzYTJfd3JpdGUodW5zaWduZWQgc2hvcnQgcG9ydCwKKwkJCQkgdW5zaWduZWQgY2hhciAgaW5kZXgsCisJCQkJIHVuc2lnbmVkIGNoYXIgIGRhdGEpCit7CisJb3V0Yl9wKGluZGV4LCBwb3J0KTsKKwlvdXRiKGRhdGEsIHBvcnQgKyAxKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgb3BsM3NhMl9yZWFkKHVuc2lnbmVkIHNob3J0IHBvcnQsCisJCQkJdW5zaWduZWQgY2hhciAgaW5kZXgsCisJCQkJdW5zaWduZWQgY2hhciogZGF0YSkKK3sKKwlvdXRiX3AoaW5kZXgsIHBvcnQpOworCSpkYXRhID0gaW5iKHBvcnQgKyAxKTsKK30KKworCisvKgorICogQWxsIG9mIHRoZSBtaXhlciBmdW5jdGlvbnMuLi4KKyAqLworCitzdGF0aWMgdm9pZCBvcGwzc2EyX3NldF92b2x1bWUob3BsM3NhMl9zdGF0ZV90KiBkZXZjLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNjYWxlWzEwMV0gPSB7CisJCTB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGUsIDB4MGUsIDB4MGUsCisJCTB4MGUsIDB4MGUsIDB4MGUsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGMsCisJCTB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsCisJCTB4MGIsIDB4MGIsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDksIDB4MDksCisJCTB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCisJCTB4MDgsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDYsIDB4MDYsIDB4MDYsCisJCTB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDUsCisJCTB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsCisJCTB4MDMsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDEsCisJCTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAKKwl9OworCXVuc2lnbmVkIGNoYXIgdm9sOworCisJdm9sID0gc2NhbGVbbGVmdF07CisKKwkvKiBJZiBsZXZlbCBpcyB6ZXJvLCB0dXJuIG9uIG11dGUgKi8KKwlpZighbGVmdCkKKwkJdm9sIHw9IDB4ODA7CisKKwlvcGwzc2EyX3dyaXRlKGRldmMtPmNmZ19wb3J0LCBPUEwzU0EyX01BU1RFUl9MRUZULCB2b2wpOworCisJdm9sID0gc2NhbGVbcmlnaHRdOworCisJLyogSWYgbGV2ZWwgaXMgemVybywgdHVybiBvbiBtdXRlICovCisJaWYoIXJpZ2h0KQorCQl2b2wgfD0gMHg4MDsKKworCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTJfTUFTVEVSX1JJR0hULCB2b2wpOworfQorCisKK3N0YXRpYyB2b2lkIG9wbDNzYTJfc2V0X21pYyhvcGwzc2EyX3N0YXRlX3QqIGRldmMsIGludCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZvbCA9IDB4MUY7CisKKwlpZigobGV2ZWwgPj0gMCkgJiYgKGxldmVsIDw9IDEwMCkpCisJCXZvbCA9IDB4MUYgLSAodW5zaWduZWQgY2hhcikgKDMyICogbGV2ZWwgLyAxMDEpOworCisJLyogSWYgbGV2ZWwgaXMgemVybywgdHVybiBvbiBtdXRlICovCisJaWYoIWxldmVsKQorCQl2b2wgfD0gMHg4MDsKKworCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTJfTUlDLCB2b2wpOworfQorCisKK3N0YXRpYyB2b2lkIG9wbDNzYTNfc2V0X2Jhc3Mob3BsM3NhMl9zdGF0ZV90KiBkZXZjLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQoreworCXVuc2lnbmVkIGNoYXIgYmFzczsKKworCWJhc3MgPSBsZWZ0ID8gKCh1bnNpZ25lZCBjaGFyKSAoOCAqIGxlZnQgLyAxMDEpKSA6IDA7IAorCWJhc3MgfD0gKHJpZ2h0ID8gKCh1bnNpZ25lZCBjaGFyKSAoOCAqIHJpZ2h0IC8gMTAxKSkgOiAwKSA8PCA0OworCisJb3BsM3NhMl93cml0ZShkZXZjLT5jZmdfcG9ydCwgT1BMM1NBM19CQVNTLCBiYXNzKTsKK30KKworCitzdGF0aWMgdm9pZCBvcGwzc2EzX3NldF90cmVibGUob3BsM3NhMl9zdGF0ZV90KiBkZXZjLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQorewkKKwl1bnNpZ25lZCBjaGFyIHRyZWJsZTsKKworCXRyZWJsZSA9IGxlZnQgPyAoKHVuc2lnbmVkIGNoYXIpICg4ICogbGVmdCAvIDEwMSkpIDogMDsgCisJdHJlYmxlIHw9IChyaWdodCA/ICgodW5zaWduZWQgY2hhcikgKDggKiByaWdodCAvIDEwMSkpIDogMCkgPDwgNDsKKworCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTNfVFJFQkxFLCB0cmVibGUpOworfQorCisKKworCitzdGF0aWMgdm9pZCBvcGwzc2EyX21peGVyX3Jlc2V0KG9wbDNzYTJfc3RhdGVfdCogZGV2YykKK3sKKwlpZiAoZGV2YykgeworCQlvcGwzc2EyX3NldF92b2x1bWUoZGV2YywgREVGQVVMVF9WT0xVTUUsIERFRkFVTFRfVk9MVU1FKTsKKwkJZGV2Yy0+dm9sdW1lX2wgPSBkZXZjLT52b2x1bWVfciA9IERFRkFVTFRfVk9MVU1FOworCisJCW9wbDNzYTJfc2V0X21pYyhkZXZjLCBERUZBVUxUX01JQyk7CisJCWRldmMtPm1pYyA9IERFRkFVTFRfTUlDOworCisJCWlmIChkZXZjLT5jaGlwc2V0ID09IENISVBTRVRfT1BMM1NBMykgeworCQkJb3BsM3NhM19zZXRfYmFzcyhkZXZjLCBERUZBVUxUX1RJTUJSRSwgREVGQVVMVF9USU1CUkUpOworCQkJZGV2Yy0+YmFzc19sID0gZGV2Yy0+YmFzc19yID0gREVGQVVMVF9USU1CUkU7CisJCQlvcGwzc2EzX3NldF90cmVibGUoZGV2YywgREVGQVVMVF9USU1CUkUsIERFRkFVTFRfVElNQlJFKTsKKwkJCWRldmMtPnRyZWJsZV9sID0gZGV2Yy0+dHJlYmxlX3IgPSBERUZBVUxUX1RJTUJSRTsKKwkJfQorCX0KK30KKworLyogQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgcG93ZXIgbWFuYWdlbWVudCAqLworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQgb3BsM3NhMl9taXhlcl9yZXN0b3JlKG9wbDNzYTJfc3RhdGVfdCogZGV2YykKK3sKKwlpZiAoZGV2YykgeworCQlvcGwzc2EyX3NldF92b2x1bWUoZGV2YywgZGV2Yy0+dm9sdW1lX2wsIGRldmMtPnZvbHVtZV9yKTsKKwkJb3BsM3NhMl9zZXRfbWljKGRldmMsIGRldmMtPm1pYyk7CisKKwkJaWYgKGRldmMtPmNoaXBzZXQgPT0gQ0hJUFNFVF9PUEwzU0EzKSB7CisJCQlvcGwzc2EzX3NldF9iYXNzKGRldmMsIGRldmMtPmJhc3NfbCwgZGV2Yy0+YmFzc19yKTsKKwkJCW9wbDNzYTNfc2V0X3RyZWJsZShkZXZjLCBkZXZjLT50cmVibGVfbCwgZGV2Yy0+dHJlYmxlX3IpOworCQl9CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmdfdG9fdm9sX21vbm8odW5zaWduZWQgaW50IHZvbCwgaW50KiB2YWx1ZSkKK3sKKwlpbnQgbGVmdDsKKwkKKwlsZWZ0ID0gdm9sICYgMHgwMGZmOworCWlmIChsZWZ0ID4gMTAwKQorCQlsZWZ0ID0gMTAwOworCSp2YWx1ZSA9IGxlZnQ7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGFyZ190b192b2xfc3RlcmVvKHVuc2lnbmVkIGludCB2b2wsIGludCogYWxlZnQsIGludCogYXJpZ2h0KQoreworCWFyZ190b192b2xfbW9ubyh2b2wsIGFsZWZ0KTsKKwlhcmdfdG9fdm9sX21vbm8odm9sID4+IDgsIGFyaWdodCk7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgcmV0X3ZvbF9tb25vKGludCB2b2wpCit7CisJcmV0dXJuICgodm9sIDw8IDgpIHwgdm9sKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCByZXRfdm9sX3N0ZXJlbyhpbnQgbGVmdCwgaW50IHJpZ2h0KQoreworCXJldHVybiAoKHJpZ2h0IDw8IDgpIHwgbGVmdCk7Cit9CisKKworc3RhdGljIGludCBvcGwzc2EyX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHJldHZhbCwgdmFsdWUsIGNtZGYgPSBjbWQgJiAweGZmOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCW9wbDNzYTJfc3RhdGVfdCogZGV2YyA9ICZvcGwzc2EyX3N0YXRlW2Rldl07CisJCisJc3dpdGNoIChjbWRmKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQljYXNlIFNPVU5EX01JWEVSX01JQzoKKwkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6IAorCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6IAorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwlpZiAoKChjbWQgPj4gOCkgJiAweGZmKSAhPSAnTScpCisJCXJldHVybiAtRUlOVkFMOworCQkKKwlyZXR2YWwgPSAwOworCWlmIChfU0lPQ19ESVIgKGNtZCkgJiBfU0lPQ19XUklURSkgeworCQlzd2l0Y2ggKGNtZGYpIHsKKwkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJCXJldHZhbCA9IGdldF91c2VyKHZhbHVlLCAodW5zaWduZWQgX191c2VyICopIGFyZyk7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJYnJlYWs7CisJCQkJYXJnX3RvX3ZvbF9zdGVyZW8odmFsdWUsICZkZXZjLT52b2x1bWVfbCwgJmRldmMtPnZvbHVtZV9yKTsKKwkJCQlvcGwzc2EyX3NldF92b2x1bWUoZGV2YywgZGV2Yy0+dm9sdW1lX2wsIGRldmMtPnZvbHVtZV9yKTsKKwkJCQl2YWx1ZSA9IHJldF92b2xfc3RlcmVvKGRldmMtPnZvbHVtZV9sLCBkZXZjLT52b2x1bWVfcik7CisJCQkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIHApOworCQkJCWJyZWFrOworCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQkJcmV0dmFsID0gZ2V0X3VzZXIodmFsdWUsICh1bnNpZ25lZCBfX3VzZXIgKikgYXJnKTsKKwkJCQlpZiAocmV0dmFsKQorCQkJCQlicmVhazsKKwkJCQlhcmdfdG9fdm9sX21vbm8odmFsdWUsICZkZXZjLT5taWMpOworCQkJCW9wbDNzYTJfc2V0X21pYyhkZXZjLCBkZXZjLT5taWMpOworCQkJCXZhbHVlID0gcmV0X3ZvbF9tb25vKGRldmMtPm1pYyk7CisJCQkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIHApOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qCisJCSAqIFJldHVybiBwYXJhbWV0ZXJzCisJCSAqLworCQlzd2l0Y2ggKGNtZGYpIHsKKwkJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKKwkJCQlyZXR2YWwgPSBwdXRfdXNlcihTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfTUlDLCBwKTsKKwkJCQlicmVhazsKKwkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoKKwkJCQlyZXR2YWwgPSBwdXRfdXNlcihTT1VORF9NQVNLX1ZPTFVNRSwgcCk7CisJCQkJYnJlYWs7CisJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQkJLyogTm8gcmVjb3JkaW5nIGRldmljZXMgKi8KKwkJCQlyZXR2YWwgPSBwdXRfdXNlcigwLCBwKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJCXJldHZhbCA9IHB1dF91c2VyKFNPVU5EX0NBUF9FWENMX0lOUFVULCBwKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQkJLyogTm8gcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJCXJldHZhbCA9IHB1dF91c2VyKDAsIHApOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwkJCQl2YWx1ZSA9IHJldF92b2xfc3RlcmVvKGRldmMtPnZvbHVtZV9sLCBkZXZjLT52b2x1bWVfcik7CisJCQkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIHApOworCQkJCWJyZWFrOworCQkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQkJCXZhbHVlID0gcmV0X3ZvbF9tb25vKGRldmMtPm1pYyk7CisJCQkJcHV0X3VzZXIodmFsdWUsIHApOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKy8qIG9wbDNzYTJfbWl4ZXJfaW9jdGwgZW5kICovCisKKworc3RhdGljIGludCBvcGwzc2EzX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQoreworCWludCB2YWx1ZSwgcmV0dmFsLCBjbWRmID0gY21kICYgMHhmZjsKKworCW9wbDNzYTJfc3RhdGVfdCogZGV2YyA9ICZvcGwzc2EyX3N0YXRlW2Rldl07CisKKwlzd2l0Y2ggKGNtZGYpIHsKKwljYXNlIFNPVU5EX01JWEVSX0JBU1M6CisJCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+YmFzc19sLCBkZXZjLT5iYXNzX3IpOworCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgKGludCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgU09VTkRfTUlYRVJfVFJFQkxFOgorCQl2YWx1ZSA9IHJldF92b2xfc3RlcmVvKGRldmMtPnRyZWJsZV9sLCBkZXZjLT50cmVibGVfcik7CisJCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCAoaW50IF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfRElHSVRBTDE6CisJCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+d2lkZV9sLCBkZXZjLT53aWRlX3IpOworCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgKGludCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorLyogb3BsM3NhM19taXhlcl9pb2N0bCBlbmQgKi8KKworCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgb3BsM3NhMl9taXhlcl9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWQJPSAiT1BMMy1TQTIiLAorCS5uYW1lCT0gIllhbWFoYSBPUEwzLVNBMiIsCisJLmlvY3RsCT0gb3BsM3NhMl9taXhlcl9pb2N0bAorfTsKKworc3RhdGljIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zIG9wbDNzYTNfbWl4ZXJfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmlkCT0gIk9QTDMtU0EzIiwKKwkubmFtZQk9ICJZYW1haGEgT1BMMy1TQTMiLAorCS5pb2N0bAk9IG9wbDNzYTNfbWl4ZXJfaW9jdGwKK307CisKKy8qIEVuZCBvZiBtaXhlci1yZWxhdGVkIHN0dWZmICovCisKKworLyoKKyAqIENvbXBvbmVudCBwcm9iZSwgYXR0YWNoLCB1bmxvYWQgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCB1bmxvYWRfb3BsM3NhMl9tcHUoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVubG9hZF9tcHU0MDEoaHdfY29uZmlnKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX29wbDNzYTJfbXNzKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgc3RydWN0IHJlc291cmNlICpwb3J0cykKK3sKKwlpbnQgaW5pdGlhbF9taXhlcnM7CisKKwlpbml0aWFsX21peGVycyA9IG51bV9taXhlcnM7CisJYXR0YWNoX21zX3NvdW5kKGh3X2NvbmZpZywgcG9ydHMsIFRISVNfTU9EVUxFKTsJLyogU2xvdCAwICovCisJaWYgKGh3X2NvbmZpZy0+c2xvdHNbMF0gIT0gLTEpIHsKKwkJLyogRGlkIHRoZSBNU1MgZHJpdmVyIGluc3RhbGw/ICovCisJCWlmKG51bV9taXhlcnMgPT0gKGluaXRpYWxfbWl4ZXJzICsgMSkpIHsKKwkJCS8qIFRoZSBNU1MgbWl4ZXIgaXMgaW5zdGFsbGVkLCByZXJvdXRlIG1peGVycyBhcHByb3BpYXRlbHkgKi8KKwkJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUxLCBTT1VORF9NSVhFUl9DRCk7CisJCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMiwgU09VTkRfTUlYRVJfU1lOVEgpOworCQkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX0xJTkUpOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTVNTIG1peGVyIG5vdCBpbnN0YWxsZWQ/XG4iKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF9vcGwzc2EyX21zcyhzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcpCit7CisJdW5sb2FkX21zX3NvdW5kKGh3X2NvbmZpZyk7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfb3BsM3NhMihzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCBjYXJkKQoreworCXVuc2lnbmVkIGNoYXIgbWlzYzsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwl1bnNpZ25lZCBjaGFyIHZlcnNpb247CisKKwkvKgorCSAqIFRyeSBhbmQgYWxsb2NhdGUgb3VyIEkvTyBwb3J0IHJhbmdlLgorCSAqLworCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyLCBPUEwzU0EyX01PRFVMRV9OQU1FKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb250cm9sIEkvTyBwb3J0ICUjeCBub3QgZnJlZVxuIiwKKwkJICAgICAgIGh3X2NvbmZpZy0+aW9fYmFzZSk7CisJCWdvdG8gb3V0X25vZGV2OworCX0KKworCS8qCisJICogQ2hlY2sgaWYgd3JpdGluZyB0byB0aGUgcmVhZC1vbmx5IHZlcnNpb24gYml0cyBvZiB0aGUgbWlzY2VsbGFuZW91cworCSAqIHJlZ2lzdGVyIHN1Y2NlZWRzIG9yIG5vdCAoaXQgc2hvdWxkIG5vdCkuCisJICovCisJb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSVNDLCAmbWlzYyk7CisJb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgbWlzYyBeIDB4MDcpOworCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgJnRtcCk7CisJaWYodG1wICE9IG1pc2MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ29udHJvbCBJL08gcG9ydCAlI3ggaXMgbm90IGEgWU1GN3h4IGNoaXBzZXQhXG4iLAorCQkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlKTsKKwkJZ290byBvdXRfcmVnaW9uOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIE1JQyByZWdpc3RlciBpcyBhY2Nlc3NpYmxlLgorCSAqLworCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlDLCAmdG1wKTsKKwlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSUMsIDB4OGEpOworCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlDLCAmdG1wKTsKKwlpZigodG1wICYgMHg5ZikgIT0gMHg4YSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgIFBGWCAiQ29udHJvbCBJL08gcG9ydCAlI3ggaXMgbm90IGEgWU1GN3h4IGNoaXBzZXQhXG4iLAorCQkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlKTsKKwkJZ290byBvdXRfcmVnaW9uOworCX0KKwlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSUMsIHRtcCk7CisKKwkvKgorCSAqIERldGVybWluZSBjaGlwc2V0IHR5cGUgKFNBMiBvciBTQTMpCisJICoKKwkgKiBUaGlzIGlzIGRvbmUgYnkgbG9va2luZyBhdCB0aGUgY2hpcHNldCB2ZXJzaW9uIGluIHRoZSBsb3dlciAzIGJpdHMKKwkgKiBvZiB0aGUgbWlzY2VsbGFuZW91cyByZWdpc3Rlci4KKwkgKi8KKwl2ZXJzaW9uID0gbWlzYyAmIDB4MDc7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJDaGlwc2V0IHZlcnNpb24gPSAlI3hcbiIsIHZlcnNpb24pOworCXN3aXRjaCAodmVyc2lvbikgeworCQljYXNlIDA6CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX1VOS05PV047CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICBQRlggIlVua25vd24gWWFtYWhhIGF1ZGlvIGNvbnRyb2xsZXIgdmVyc2lvblxuIik7CisJCQlicmVhazsKKworCQljYXNlIFZFUlNJT05fWU1GNzExOgorCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ID0gQ0hJUFNFVF9PUEwzU0EyOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIE9QTDMtU0EyIChZTUY3MTEpXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVkVSU0lPTl9ZTUY3MTU6CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX09QTDNTQTM7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgUEZYICJGb3VuZCBPUEwzLVNBMyAoWU1GNzE1IG9yIFlNRjcxOSlcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBWRVJTSU9OX1lNRjcxNUI6CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX09QTDNTQTM7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgUEZYICJGb3VuZCBPUEwzLVNBMyAoWU1GNzE1QiBvciBZTUY3MTlCKVxuIik7CisJCQlicmVhazsKKworCQljYXNlIFZFUlNJT05fWU1GNzE1RToKKwkJZGVmYXVsdDoKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9IENISVBTRVRfT1BMM1NBMzsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICBQRlggIkZvdW5kIE9QTDMtU0EzIChZTUY3MTVFIG9yIFlNRjcxOUUpXG4iKTsKKwkJCWJyZWFrOworCX0KKworCWlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgIT0gQ0hJUFNFVF9VTktOT1dOKSB7CisJCS8qIEdlbmVyYXRlIGEgcHJldHR5IG5hbWUgKi8KKwkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0X25hbWUgPSAoY2hhciAqKUNISVBTRVRfVEFCTEVbb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0XTsKKwkJcmV0dXJuIDA7CisJfQorCitvdXRfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMik7CitvdXRfbm9kZXY6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF9vcGwzc2EyKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgaW50IGNhcmQpCit7CisJLyogSW5pdGlhbGl6ZSBJUlEgY29uZmlndXJhdGlvbiB0byBJUlEtQjogLSwgSVJRLUE6IFdTUytNUFUrT1BMMyAqLworCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX0lSUV9DT05GSUcsIDB4MGQpOworCisJLyogSW5pdGlhbGl6ZSBETUEgY29uZmlndXJhdGlvbiAqLworCWlmKGh3X2NvbmZpZy0+ZG1hMiA9PSBod19jb25maWctPmRtYSkgeworCQkvKiBXYW50IERNQSBjb25maWd1cmF0aW9uIERNQS1COiAtLCBETUEtQTogV1NTLVArV1NTLVIgKi8KKwkJb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfRE1BX0NPTkZJRywgMHgwMyk7CisJfQorCWVsc2UgeworCQkvKiBXYW50IERNQSBjb25maWd1cmF0aW9uIERNQS1COiBXU1MtUiwgRE1BLUE6IFdTUy1QICovCisJCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX0RNQV9DT05GSUcsIDB4MjEpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX29wbDNzYTJfbWl4ZXIoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBpbnQgY2FyZCkKK3sKKwlzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyogbWl4ZXJfb3BlcmF0aW9uczsKKwlvcGwzc2EyX3N0YXRlX3QqIGRldmMgPSAmb3BsM3NhMl9zdGF0ZVtjYXJkXTsKKworCS8qIEluc3RhbGwgbWFzdGVyIG1peGVyICovCisJaWYgKGRldmMtPmNoaXBzZXQgPT0gQ0hJUFNFVF9PUEwzU0EzKSB7CisJCW1peGVyX29wZXJhdGlvbnMgPSAmb3BsM3NhM19taXhlcl9vcGVyYXRpb25zOworCX0KKwllbHNlIHsKKwkJbWl4ZXJfb3BlcmF0aW9ucyA9ICZvcGwzc2EyX21peGVyX29wZXJhdGlvbnM7CisJfQorCisJZGV2Yy0+Y2ZnX3BvcnQgPSBod19jb25maWctPmlvX2Jhc2U7CisJZGV2Yy0+bWl4ZXIgPSBzb3VuZF9pbnN0YWxsX21peGVyKE1JWEVSX0RSSVZFUl9WRVJTSU9OLAorCQkJCQkgIG1peGVyX29wZXJhdGlvbnMtPm5hbWUsCisJCQkJCSAgbWl4ZXJfb3BlcmF0aW9ucywKKwkJCQkJICBzaXplb2Yoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLAorCQkJCQkgIGRldmMpOworCWlmKGRldmMtPm1peGVyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgaW5zdGFsbCAlcyBtYXN0ZXIgbWl4ZXJcbiIsCisJCQkgbWl4ZXJfb3BlcmF0aW9ucy0+bmFtZSk7CisJfQorCWVsc2UgeworCQkJb3BsM3NhMl9taXhlcl9yZXNldChkZXZjKTsKKworCX0KK30KKworCitzdGF0aWMgdm9pZCBvcGwzc2EyX2NsZWFyX3Nsb3RzKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZykKK3sKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IDY7IGkrKykgeworCQlod19jb25maWctPnNsb3RzW2ldID0gLTE7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBvcGwzc2EyX3NldF95bW9kZShzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCB5bW9kZSkKK3sKKwkvKgorCSAqIFNldCB0aGUgWWFtYWhhIDNEIGVuaGFuY2VtZW50IG1vZGUgKGFrYSBZbWVyc2lvbikgaWYgYXNrZWQgdG8gYW5kCisJICogaXQncyBzdXBwb3J0ZWQuCisJICoKKwkgKiAwOiBEZXNrdG9wIChha2Egbm9ybWFsKSAgIDUtMTIgY20gc3BlYWtlcnMKKwkgKiAxOiBOb3RlYm9vayBQQyBtb2RlIDEgICAgIDMgY20gc3BlYWtlcnMKKwkgKiAyOiBOb3RlYm9vayBQQyBtb2RlIDIgICAgIDEuNSBjbSBzcGVha2VycworCSAqIDM6IEhpLWZpICAgICAgICAgICAgICAgICAgMTYtMzggY20gc3BlYWtlcnMKKwkgKi8KKwlpZih5bW9kZSA+PSAwICYmIHltb2RlIDw9IDMpIHsKKwkJdW5zaWduZWQgY2hhciBzeXNfY3RybDsKKworCQlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX1NZU19DVFJMLCAmc3lzX2N0cmwpOworCQlzeXNfY3RybCA9IChzeXNfY3RybCAmIDB4Y2YpIHwgKCh5bW9kZSAmIDMpIDw8IDQpOworCQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9TWVNfQ1RSTCwgc3lzX2N0cmwpOworCX0KKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm90IHNldHRpbmcgeW1vZGUsIGl0IG11c3QgYmUgb25lIG9mIDAsMSwyLDNcbiIpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBfX2luaXQgb3BsM3NhMl9zZXRfbG9vcGJhY2soc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBpbnQgbG9vcGJhY2spCit7CisJaWYobG9vcGJhY2sgPj0gMCAmJiBsb29wYmFjayA8PSAxKSB7CisJCXVuc2lnbmVkIGNoYXIgbWlzYzsKKworCQlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JU0MsICZtaXNjKTsKKwkJbWlzYyA9IChtaXNjICYgMHhlZikgfCAoKGxvb3BiYWNrICYgMSkgPDwgNCk7CisJCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JU0MsIG1pc2MpOworCX0KKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm90IHNldHRpbmcgbG9vcGJhY2ssIGl0IG11c3QgYmUgZWl0aGVyIDAgb3IgMVxuIik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfb3BsM3NhMihzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCBjYXJkKQoreworICAgICAgICAvKiBSZWxlYXNlIGNvbnRyb2wgcG9ydHMgKi8KKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIpOworCisJLyogVW5sb2FkIG1peGVyICovCisJaWYob3BsM3NhMl9zdGF0ZVtjYXJkXS5taXhlciA+PSAwKQorCQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYob3BsM3NhMl9zdGF0ZVtjYXJkXS5taXhlcik7CisKK30KKworI2lmZGVmIENPTkZJR19QTlAKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RldmljZV9pZCBwbnBfb3BsM3NhMl9saXN0W10gPSB7CisJey5pZCA9ICJZTUgwMDIxIiwgLmRyaXZlcl9kYXRhID0gMH0sCisJey5pZCA9ICIifQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHBucF9vcGwzc2EyX2xpc3QpOworCitzdGF0aWMgaW50IG9wbDNzYTJfcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCit7CisJaW50IGNhcmQgPSBvcGwzc2EyX2NhcmRzX251bTsKKworCS8qIHdlIGRvbid0IGFjdHVhbGx5IHdhbnQgdG8gcmV0dXJuIGFuIGVycm9yIGFzIHRoZSB1c2VyIG1heSBoYXZlIHNwZWNpZmllZAorCSAqIG5vIG11bHRpcGxlIGNhcmQgc2VhcmNoCisJICovCisKKwlpZiAob3BsM3NhMl9jYXJkc19udW0gPT0gT1BMM1NBMl9DQVJEU19NQVgpCisJCXJldHVybiAwOworCW9wbDNzYTJfYWN0aXZhdGVkW2NhcmRdID0gMTsKKworCS8qIE91ciBvd24gY29uZmlnOiAqLworCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChkZXYsIDQpOworCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlycSAgICAgPSBwbnBfaXJxKGRldiwgMCk7CisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuZG1hICAgICA9IHBucF9kbWEoZGV2LCAwKTsKKwlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5kbWEyICAgID0gcG5wX2RtYShkZXYsIDEpOworCisJLyogVGhlIE1TUyBjb25maWc6ICovCisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlvX2Jhc2UgICAgICA9IHBucF9wb3J0X3N0YXJ0KGRldiwgMSk7CisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlycSAgICAgICAgICA9IHBucF9pcnEoZGV2LCAwKTsKKwlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuZG1hICAgICAgICAgID0gcG5wX2RtYShkZXYsIDApOworCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5kbWEyICAgICAgICAgPSBwbnBfZG1hKGRldiwgMSk7CisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmNhcmRfc3VidHlwZSA9IDE7IC8qIE5vIElSUSBvciBETUEgc2V0dXAgKi8KKworCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlICAgICAgID0gcG5wX3BvcnRfc3RhcnQoZGV2LCAzKTsKKwlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaXJxICAgICAgICAgICA9IHBucF9pcnEoZGV2LCAwKTsKKwlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuZG1hICAgICAgICAgICA9IC0xOworCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5kbWEyICAgICAgICAgID0gLTE7CisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmFsd2F5c19kZXRlY3QgPSAxOyAvKiBJdCdzIHRoZXJlLCBzbyB1c2Ugc2hhcmVkIElSUXMgKi8KKworCS8qIENhbGwgbWUgcGFyYW5vaWQ6ICovCisJb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcpOworCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcyk7CisJb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1KTsKKworCW9wbDNzYTJfc3RhdGVbY2FyZF0ucGRldiA9IGRldjsKKwlvcGwzc2EyX2NhcmRzX251bSsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RyaXZlciBvcGwzc2EyX2RyaXZlciA9IHsKKwkubmFtZQkJPSAib3BsM3NhMiIsCisJLmlkX3RhYmxlCT0gcG5wX29wbDNzYTJfbGlzdCwKKwkucHJvYmUJCT0gb3BsM3NhMl9wbnBfcHJvYmUsCit9OworCisjZW5kaWYgLyogQ09ORklHX1BOUCAqLworCisvKiBFbmQgb2YgY29tcG9uZW50IGZ1bmN0aW9ucyAqLworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG9wbDNzYTJfbG9jayk7CisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgb3BsM3NhMl9zdXNwZW5kKHN0cnVjdCBwbV9kZXYgKnBkZXYsIHVuc2lnbmVkIGludCBwbV9tb2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJb3BsM3NhMl9zdGF0ZV90ICpwOworCisJaWYgKCFwZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvcGwzc2EyX2xvY2ssZmxhZ3MpOworCisJcCA9IChvcGwzc2EyX3N0YXRlX3QgKikgcGRldi0+ZGF0YTsKKwlzd2l0Y2ggKHBtX21vZGUpIHsKKwljYXNlIDE6CisJCXBtX21vZGUgPSBPUEwzU0EyX1BNX01PREUxOworCQlicmVhazsKKwljYXNlIDI6CisJCXBtX21vZGUgPSBPUEwzU0EyX1BNX01PREUyOworCQlicmVhazsKKwljYXNlIDM6CisJCXBtX21vZGUgPSBPUEwzU0EyX1BNX01PREUzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiB3ZSBkb24ndCBrbm93IGhvd3RvIGhhbmRsZSB0aGlzLi4uICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wbDNzYTJfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXAtPmluX3N1c3BlbmQgPSAxOworCisJLyogaXRzIHN1cHBvc2VkIHRvIGF1dG9tdXRlIGJlZm9yZSBzdXNwZW5kaW5nLCBzbyB3ZSB3b24ndCBib3RoZXIgKi8KKwlvcGwzc2EyX3dyaXRlKHAtPmNmZ19wb3J0LCBPUEwzU0EyX1BNLCBwbV9tb2RlKTsKKwkvKiB3YWl0IGEgd2hpbGUgZm9yIHRoZSBjbG9jayBvc2NpbGxhdG9yIHRvIHN0YWJpbGlzZSAqLworCW1kZWxheSgxMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvcGwzc2EyX2xvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wbDNzYTJfcmVzdW1lKHN0cnVjdCBwbV9kZXYgKnBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlvcGwzc2EyX3N0YXRlX3QgKnA7CisKKyAJaWYgKCFwZGV2KQorIAkJcmV0dXJuIC1FSU5WQUw7CisKKwlwID0gKG9wbDNzYTJfc3RhdGVfdCAqKSBwZGV2LT5kYXRhOworCXNwaW5fbG9ja19pcnFzYXZlKCZvcGwzc2EyX2xvY2ssZmxhZ3MpOworCisgCS8qIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyBuZWNlc3NhcnkgKi8KKwlvcGwzc2EyX3dyaXRlKHAtPmNmZ19wb3J0LCBPUEwzU0EyX1BNLCBPUEwzU0EyX1BNX01PREUwKTsKKwlvcGwzc2EyX21peGVyX3Jlc3RvcmUocCk7CisgCXAtPmluX3N1c3BlbmQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3BsM3NhMl9sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcGwzc2EyX3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKnBkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgbW9kZSA9ICh1bnNpZ25lZCAgbG9uZylkYXRhOworCisJc3dpdGNoIChycXN0KSB7CisJCWNhc2UgUE1fU1VTUEVORDoKKwkJCXJldHVybiBvcGwzc2EyX3N1c3BlbmQocGRldiwgbW9kZSk7CisKKwkJY2FzZSBQTV9SRVNVTUU6CisJCQlyZXR1cm4gb3BsM3NhMl9yZXN1bWUocGRldik7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisvKgorICogSW5zdGFsbCBPUEwzLVNBMiBiYXNlZCBjYXJkKHMpLgorICoKKyAqIE5lZWQgdG8gaGF2ZSBhZDE4NDggYW5kIG1wdTQwMSBsb2FkZWQgcmVhZHkuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfb3BsM3NhMih2b2lkKQoreworCWludCBjYXJkLCBtYXg7CisKKwkvKiBTYW5pdGl6ZSBpc2FwbnAgYW5kIG11bHRpcGxlIHNldHRpbmdzICovCisJaXNhcG5wID0gaXNhcG5wICE9IDAgPyAxIDogMDsKKwltdWx0aXBsZSA9IG11bHRpcGxlICE9IDAgPyAxIDogMDsKKworCW1heCA9IChtdWx0aXBsZSAmJiBpc2FwbnApID8gT1BMM1NBMl9DQVJEU19NQVggOiAxOworCisjaWZkZWYgQ09ORklHX1BOUAorCWlmIChpc2FwbnApeworCQlwbnBfcmVnaXN0ZXJfZHJpdmVyKCZvcGwzc2EyX2RyaXZlcik7CisJCWlmKCFvcGwzc2EyX2NhcmRzX251bSl7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiTm8gUG5QIGNhcmRzIGZvdW5kXG4iKTsKKwkJCWlzYXBucCA9IDA7CisJCX0KKwkJbWF4ID0gb3BsM3NhMl9jYXJkc19udW07CisJfQorI2VuZGlmCisKKwlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgbWF4OyBjYXJkKyspIHsKKwkJLyogSWYgYSB1c2VyIHdhbnRzIGFuIEkvTyB0aGVuIGFzc3VtZSB0aGV5IG1lYW50IGl0ICovCisJCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7CisJCWludCBiYXNlOworCQkKKwkJaWYgKCFpc2FwbnApIHsKKwkJCWlmIChpbyA9PSAtMSB8fCBpcnEgPT0gLTEgfHwgZG1hID09IC0xIHx8CisJCQkgICAgZG1hMiA9PSAtMSB8fCBtc3NfaW8gPT0gLTEpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgUEZYICJpbywgbXNzX2lvLCBpcnEsIGRtYSwgYW5kIGRtYTIgbXVzdCBiZSBzZXRcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJb3BsM3NhMl9jYXJkc19udW0rKzsKKworCQkJLyoKKwkJCSAqIE91ciBvd24gY29uZmlnOgorCQkJICogKE5PVEU6IElSUSBhbmQgRE1BIGFyZW4ndCB1c2VkLCBzbyB0aGV5J3JlIHNldCB0bworCQkJICogIGdpdmUgcHJldHR5IG91dHB1dCBmcm9tIGNvbmZfcHJpbnRmLiA6KQorCQkJICovCisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pb19iYXNlID0gaW87CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pcnEgICAgID0gaXJxOworCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuZG1hICAgICA9IGRtYTsKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmRtYTIgICAgPSBkbWEyOworCQorCQkJLyogVGhlIE1TUyBjb25maWc6ICovCisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaW9fYmFzZSAgICAgID0gbXNzX2lvOworCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlycSAgICAgICAgICA9IGlycTsKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5kbWEgICAgICAgICAgPSBkbWE7CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuZG1hMiAgICAgICAgID0gZG1hMjsKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5jYXJkX3N1YnR5cGUgPSAxOyAvKiBObyBJUlEgb3IgRE1BIHNldHVwICovCisKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlICAgICAgID0gbXB1X2lvOworCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmlycSAgICAgICAgICAgPSBpcnE7CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuZG1hICAgICAgICAgICA9IC0xOworCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmFsd2F5c19kZXRlY3QgPSAxOyAvKiBVc2Ugc2hhcmVkIElSUXMgKi8KKworCQkJLyogQ2FsbCBtZSBwYXJhbm9pZDogKi8KKwkJCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnKTsKKwkJCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcyk7CisJCQlvcGwzc2EyX2NsZWFyX3Nsb3RzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUpOworCQl9CisKKwkJLyogRklYTUU6IGxlYWsgKi8KKwkJaWYgKHByb2JlX29wbDNzYTIoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCBjYXJkKSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCWJhc2UgPSBvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaW9fYmFzZTsKKworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIDQsICJXU1MgY29uZmlnIikpCisJCQlnb3RvIGZhaWxlZDsKKworCQlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGJhc2UgKyA0LCA0LCAiYWQxODQ4Iik7CisJCWlmICghcG9ydHMpCisJCQlnb3RvIGZhaWxlZDI7CisKKwkJaWYgKCFwcm9iZV9tc19zb3VuZCgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLCBwb3J0cykpIHsKKwkJCS8qCisJCQkgKiBJZiBvbmUgb3IgbW9yZSBjYXJkcyBhcmUgYWxyZWFkeSByZWdpc3RlcmVkLCBkb24ndAorCQkJICogcmV0dXJuIGFuIGVycm9yIGJ1dCBwcmludCBhIHdhcm5pbmcuICBOb3RlLCB0aGlzCisJCQkgKiBzaG91bGQgbmV2ZXIgcmVhbGx5IGhhcHBlbiB1bmxlc3MgdGhlIGhhcmR3YXJlIG9yCisJCQkgKiBJU0EgUG5QIHNjcmV3ZWQgdXAuCisJCQkgKi8KKwkJCXJlbGVhc2VfcmVnaW9uKGJhc2UgKyA0LCA0KTsKKwkJZmFpbGVkMjoKKwkJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDQpOworCQlmYWlsZWQ6CisJCQlyZWxlYXNlX3JlZ2lvbihvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pb19iYXNlLCAyKTsKKworCQkJaWYgKG9wbDNzYTJfY2FyZHNfbnVtKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICBQRlggIlRoZXJlIHdhcyBhIHByb2JsZW0gcHJvYmluZyBvbmUgIgorCQkJCSAgICAgICAiIG9mIHRoZSBJU0EgUE5QIGNhcmRzLCBjb250aW51aW5nXG4iKTsKKwkJCQlvcGwzc2EyX2NhcmRzX251bS0tOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlhdHRhY2hfb3BsM3NhMigmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGNhcmQpOworCQljb25mX3ByaW50ZihvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXRfbmFtZSwgJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnKTsKKwkJYXR0YWNoX29wbDNzYTJfbWl4ZXIoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCBjYXJkKTsKKwkJYXR0YWNoX29wbDNzYTJfbXNzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MsIHBvcnRzKTsKKworCQkvKiBld3d3ID0pICovCisJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2FyZCA9IGNhcmQ7CisjaWZkZWYgQ09ORklHX1BNCisJCS8qIHJlZ2lzdGVyIG91ciBwb3dlciBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyAqLworCQlvcGwzc2EyX3N0YXRlW2NhcmRdLnBtZGV2ID0gcG1fcmVnaXN0ZXIoUE1fSVNBX0RFViwgY2FyZCwgb3BsM3NhMl9wbV9jYWxsYmFjayk7CisJCWlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLnBtZGV2KQorCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5wbWRldi0+ZGF0YSA9ICZvcGwzc2EyX3N0YXRlW2NhcmRdOworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisJCS8qCisJCSAqIFNldCB0aGUgWWFtYWhhIDNEIGVuaGFuY2VtZW50IG1vZGUgKGFrYSBZbWVyc2lvbikgaWYgYXNrZWQgdG8gYW5kCisJCSAqIGl0J3Mgc3VwcG9ydGVkLgorCQkgKi8KKwkJaWYgKHltb2RlICE9IC0xKSB7CisJCQlpZiAob3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ID09IENISVBTRVRfT1BMM1NBMikgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICBQRlggInltb2RlIG5vdCBzdXBwb3J0ZWQgb24gT1BMMy1TQTJcbiIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJb3BsM3NhMl9zZXRfeW1vZGUoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCB5bW9kZSk7CisJCQl9CisJCX0KKworCisJCS8qIFNldCBBL0QgaW5wdXQgdG8gTW9ubyBsb29wYmFjayBpZiBhc2tlZCB0by4gKi8KKwkJaWYgKGxvb3BiYWNrICE9IC0xKSB7CisJCQlvcGwzc2EyX3NldF9sb29wYmFjaygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGxvb3BiYWNrKTsKKwkJfQorCQkKKwkJLyogQXR0YWNoIE1QVSBpZiB3ZSd2ZSBiZWVuIGFza2VkIHRvIGRvIHNvLCBmYWlsdXJlIGlzbid0IGZhdGFsICovCisJCWlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaW9fYmFzZSAhPSAtMSkgeworCQkJaW50IGJhc2UgPSBvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaW9fYmFzZTsKKwkJCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7CisJCQlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGJhc2UsIDIsICJtcHU0MDEiKTsKKwkJCWlmICghcG9ydHMpCisJCQkJZ290byBvdXQ7CisJCQlpZiAoIXByb2JlX21wdTQwMSgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LCBwb3J0cykpIHsKKwkJCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCAyKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChhdHRhY2hfbXB1NDAxKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUsIFRISVNfTU9EVUxFKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBhdHRhY2ggTVBVNDAxXG4iKTsKKwkJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuc2xvdHNbMV0gPSAtMTsKKwkJCX0KKwkJfQorCX0KKworb3V0OgorCWlmIChpc2FwbnApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFIFBGWCAiJWQgUG5QIGNhcmQocykgZm91bmQuXG4iLCBvcGwzc2EyX2NhcmRzX251bSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFVuaW5zdGFsbCBPUEwzLVNBMiBiYXNlZCBjYXJkKHMpLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9vcGwzc2EyKHZvaWQpCit7CisJaW50IGNhcmQ7CisKKwlmb3IoY2FyZCA9IDA7IGNhcmQgPCBvcGwzc2EyX2NhcmRzX251bTsgY2FyZCsrKSB7CisjaWZkZWYgQ09ORklHX1BNCisJCWlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLnBtZGV2KQorCQkJcG1fdW5yZWdpc3RlcihvcGwzc2EyX3N0YXRlW2NhcmRdLnBtZGV2KTsKKyNlbmRpZgorCSAgICAgICAgaWYgKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5zbG90c1sxXSAhPSAtMSkgeworCQkJdW5sb2FkX29wbDNzYTJfbXB1KCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUpOworIAkJfQorCQl1bmxvYWRfb3BsM3NhMl9tc3MoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcyk7CisJCXVubG9hZF9vcGwzc2EyKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZywgY2FyZCk7CisjaWZkZWYgQ09ORklHX1BOUAorCQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJm9wbDNzYTJfZHJpdmVyKTsKKyNlbmRpZgorCX0KK30KKworbW9kdWxlX2luaXQoaW5pdF9vcGwzc2EyKTsKK21vZHVsZV9leGl0KGNsZWFudXBfb3BsM3NhMik7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9vcGwzc2EyKGNoYXIgKnN0cikKK3sKKwkvKiBpbywgaXJxLCBkbWEsIGRtYTIsLi4uICovCisjaWZkZWYgQ09ORklHX1BOUAorCWludCBpbnRzWzExXTsKKyNlbHNlCisJaW50IGludHNbOV07CisjZW5kaWYKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvICAgICAgID0gaW50c1sxXTsKKwlpcnEgICAgICA9IGludHNbMl07CisJZG1hICAgICAgPSBpbnRzWzNdOworCWRtYTIgICAgID0gaW50c1s0XTsKKwltc3NfaW8gICA9IGludHNbNV07CisJbXB1X2lvICAgPSBpbnRzWzZdOworCXltb2RlICAgID0gaW50c1s3XTsKKwlsb29wYmFjayA9IGludHNbOF07CisjaWZkZWYgQ09ORklHX1BOUAorCWlzYXBucCAgID0gaW50c1s5XTsKKwltdWx0aXBsZSA9IGludHNbMTBdOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm9wbDNzYTI9Iiwgc2V0dXBfb3BsM3NhMik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcy5oIGIvc291bmQvb3NzL29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiOTYyOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9vcy5oCkBAIC0wLDAgKzEsNTEgQEAKKyNkZWZpbmUgQUxMT1dfU0VMRUNUCisjdW5kZWYgTk9fSU5MSU5FX0FTTQorI2RlZmluZSBTSE9SVF9CQU5ORVJTCisjZGVmaW5lIE1BTlVBTF9QTlAKKyN1bmRlZiAgRE9fVElNSU5HUworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpZmRlZiBfX2FscGhhX18KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKworI2RlZmluZSBGQUxTRQkwCisjZGVmaW5lIFRSVUUJMQorCitleHRlcm4gaW50IHNvdW5kX2FsbG9jX2RtYShpbnQgY2huLCBjaGFyICpkZXZpY2VJRCk7CitleHRlcm4gaW50IHNvdW5kX29wZW5fZG1hKGludCBjaG4sIGNoYXIgKmRldmljZUlEKTsKK2V4dGVybiB2b2lkIHNvdW5kX2ZyZWVfZG1hKGludCBjaG4pOworZXh0ZXJuIHZvaWQgc291bmRfY2xvc2VfZG1hKGludCBjaG4pOworCitleHRlcm4gdm9pZCByZXByb2dyYW1fdGltZXIodm9pZCk7CisKKyNkZWZpbmUgVVNFX0FVVE9JTklUX0RNQQorCitleHRlcm4gdm9pZCAqc291bmRfbWVtX2Jsb2Nrc1sxMDI0XTsKK2V4dGVybiBpbnQgc291bmRfbmJsb2NrczsKKworI3VuZGVmIFBTRVVET19ETUFfQVVUT0lOSVQKKyNkZWZpbmUgQUxMT1dfQlVGRkVSX01BUFBJTkcKKworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb3NzX3NvdW5kX2ZvcHM7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvcGFzMi5oIGIvc291bmQvb3NzL3BhczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTEyYzU1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3BhczIuaApAQCAtMCwwICsxLDE3IEBACisKKy8qCUZyb20gcGFzX2NhcmQuYwkqLworaW50IHBhc19zZXRfaW50cihpbnQgbWFzayk7CitpbnQgcGFzX3JlbW92ZV9pbnRyKGludCBtYXNrKTsKK3Vuc2lnbmVkIGNoYXIgcGFzX3JlYWQoaW50IGlvYWRkcik7Cit2b2lkIHBhc193cml0ZSh1bnNpZ25lZCBjaGFyIGRhdGEsIGludCBpb2FkZHIpOworCisvKglGcm9tIHBhc19hdWRpby5jICovCit2b2lkIHBhc19wY21faW50ZXJydXB0KHVuc2lnbmVkIGNoYXIgc3RhdHVzLCBpbnQgY2F1c2UpOwordm9pZCBwYXNfcGNtX2luaXQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKTsKKworLyoJRnJvbSBwYXNfbWl4ZXIuYyAqLworaW50IHBhc19pbml0X21peGVyKHZvaWQpOworCisvKglGcm9tIHBhc19taWRpLmMgKi8KK3ZvaWQgcGFzX21pZGlfaW5pdCh2b2lkKTsKK3ZvaWQgcGFzX21pZGlfaW50ZXJydXB0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3BhczJfY2FyZC5jIGIvc291bmQvb3NzL3BhczJfY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Njk2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvcGFzMl9jYXJkLmMKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiBzb3VuZC9wYXMyX2NhcmQuYworICoKKyAqIERldGVjdGlvbiByb3V0aW5lIGZvciB0aGUgUHJvIEF1ZGlvIFNwZWN0cnVtIGNhcmRzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgInBhczIuaCIKKyNpbmNsdWRlICJzYi5oIgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBkbWFfYml0c1tdID0geworCTQsIDEsIDIsIDMsIDAsIDUsIDYsIDcKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlycV9iaXRzW10gPSB7CisJMCwgMCwgMSwgMiwgMywgNCwgNSwgNiwgMCwgMSwgNywgOCwgOSwgMCwgMTAsIDExCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzYl9pcnFfYml0c1tdID0geworCTB4MDAsIDB4MDAsIDB4MDgsIDB4MTAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MjAsIAorCTB4MDAsIDB4MDgsIDB4MjgsIDB4MzAsIDB4MzgsIDAsIDAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNiX2RtYV9iaXRzW10gPSB7CisJMHgwMCwgMHg0MCwgMHg4MCwgMHhDMCwgMCwgMCwgMCwgMAorfTsKKworLyoKKyAqIFRoZSBBZGRyZXNzIFRyYW5zbGF0aW9uIGNvZGUgaXMgdXNlZCB0byBjb252ZXJ0IEkvTyByZWdpc3RlciBhZGRyZXNzZXMgdG8KKyAqIGJlIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBiYXNlIC1yZWdpc3RlcgorICovCisKK2ludCAgICAgIAlwYXNfdHJhbnNsYXRlX2NvZGUgPSAwOworc3RhdGljIGludCAgICAgIHBhc19pbnRyX21hc2s7CitzdGF0aWMgaW50ICAgICAgcGFzX2lycTsKK3N0YXRpYyBpbnQgICAgICBwYXNfc2JfYmFzZTsKK0RFRklORV9TUElOTE9DSyhwYXNfbG9jayk7CisjaWZuZGVmIENPTkZJR19QQVNfSk9ZU1RJQ0sKK3N0YXRpYyBpbnQJam95c3RpY2s7CisjZWxzZQorc3RhdGljIGludCAJam95c3RpY2sgPSAxOworI2VuZGlmCisjaWZkZWYgU1lNUEhPTllfUEFTCitzdGF0aWMgaW50IAlzeW1waG9ueSA9IDE7CisjZWxzZQorc3RhdGljIGludCAJc3ltcGhvbnk7CisjZW5kaWYKKyNpZmRlZiBCUk9LRU5fQlVTX0NMT0NLCitzdGF0aWMgaW50CWJyb2tlbl9idXNfY2xvY2sgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQJYnJva2VuX2J1c19jbG9jazsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7CitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmcyOworCitjaGFyICAgICAgICAgICAgcGFzX21vZGVsID0gMDsKK3N0YXRpYyBjaGFyICAgICpwYXNfbW9kZWxfbmFtZXNbXSA9IHsKKwkiIiwgCisJIlBybyBBdWRpb1NwZWN0cnVtKyIsIAorCSJDRFBDIiwgCisJIlBybyBBdWRpb1NwZWN0cnVtIDE2IiwgCisJIlBybyBBdWRpb1NwZWN0cnVtIDE2RCIKK307CisKKy8qCisgKiBwYXNfcmVhZCgpIGFuZCBwYXNfd3JpdGUoKSBhcmUgZXF1aXZhbGVudHMgb2YgaW5iIGFuZCBvdXRiIAorICogVGhlc2Ugcm91dGluZXMgcGVyZm9ybSB0aGUgSS9PIGFkZHJlc3MgdHJhbnNsYXRpb24gcmVxdWlyZWQKKyAqIHRvIHN1cHBvcnQgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBiYXNlIGFkZHJlc3MKKyAqLworCitleHRlcm4gdm9pZCAgICAgbWl4X3dyaXRlKHVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGlvYWRkcik7CisKK3Vuc2lnbmVkIGNoYXIgcGFzX3JlYWQoaW50IGlvYWRkcikKK3sKKwlyZXR1cm4gaW5iKGlvYWRkciArIHBhc190cmFuc2xhdGVfY29kZSk7Cit9CisKK3ZvaWQgcGFzX3dyaXRlKHVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGlvYWRkcikKK3sKKwlvdXRiKChkYXRhKSwgaW9hZGRyICsgcGFzX3RyYW5zbGF0ZV9jb2RlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKiogQmVnaW4gb2YgdGhlIEludGVycnVwdCBIYW5kbGVyICoqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgcGFzaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpkdW1teSkKK3sKKwlpbnQgICAgICAgICAgICAgc3RhdHVzOworCisJc3RhdHVzID0gcGFzX3JlYWQoMHgwQjg5KTsKKwlwYXNfd3JpdGUoc3RhdHVzLCAweDBCODkpOwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKworCWlmIChzdGF0dXMgJiAweDA4KQorCXsKKwkJICBwYXNfcGNtX2ludGVycnVwdChzdGF0dXMsIDEpOworCQkgIHN0YXR1cyAmPSB+MHgwODsKKwl9CisJaWYgKHN0YXR1cyAmIDB4MTApCisJeworCQkgIHBhc19taWRpX2ludGVycnVwdCgpOworCQkgIHN0YXR1cyAmPSB+MHgxMDsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgcGFzX3NldF9pbnRyKGludCBtYXNrKQoreworCWlmICghbWFzaykKKwkJcmV0dXJuIDA7CisKKwlwYXNfaW50cl9tYXNrIHw9IG1hc2s7CisKKwlwYXNfd3JpdGUocGFzX2ludHJfbWFzaywgMHgwQjhCKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhc19yZW1vdmVfaW50cihpbnQgbWFzaykKK3sKKwlpZiAoIW1hc2spCisJCXJldHVybiAwOworCisJcGFzX2ludHJfbWFzayAmPSB+bWFzazsKKwlwYXNfd3JpdGUocGFzX2ludHJfbWFzaywgMHgwQjhCKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgdGhlIEludGVycnVwdCBoYW5kbGVyICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqIEJlZ2luIG9mIHRoZSBJbml0aWFsaXphdGlvbiBDb2RlICoqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2luaXQgY29uZmlnX3Bhc19odyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJY2hhciAgICAgICAgICAgIG9rID0gMTsKKwl1bnNpZ25lZCAgICAgICAgaW50X3B0cnM7CS8qIHNjc2kvc291bmQgaW50ZXJydXB0IHBvaW50ZXJzICovCisKKwlwYXNfaXJxID0gaHdfY29uZmlnLT5pcnE7CisKKwlwYXNfd3JpdGUoMHgwMCwgMHgwQjhCKTsKKwlwYXNfd3JpdGUoMHgzNiwgMHgxMzhCKTsKKwlwYXNfd3JpdGUoMHgzNiwgMHgxMzg4KTsKKwlwYXNfd3JpdGUoMCwgMHgxMzg4KTsKKwlwYXNfd3JpdGUoMHg3NCwgMHgxMzhCKTsKKwlwYXNfd3JpdGUoMHg3NCwgMHgxMzg5KTsKKwlwYXNfd3JpdGUoMCwgMHgxMzg5KTsKKworCXBhc193cml0ZSgweDgwIHwgMHg0MCB8IDB4MjAgfCAxLCAweDBCOEEpOworCXBhc193cml0ZSgweDgwIHwgMHgyMCB8IDB4MTAgfCAweDA4IHwgMHgwMSwgMHhGOEEpOworCXBhc193cml0ZSgweDAxIHwgMHgwMiB8IDB4MDQgfCAweDEwCS8qCisJCQkJCQkgKiB8CisJCQkJCQkgKiAweDgwCisJCQkJCQkgKi8gLCAweEI4OCk7CisKKwlwYXNfd3JpdGUoMHg4MAorCQkgIHwgam95c3RpY2s/MHg0MDowCisJCSAgLDB4RjM4OCk7CisKKwlpZiAocGFzX2lycSA8IDAgfHwgcGFzX2lycSA+IDE1KQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQVMxNjogSW52YWxpZCBJUlEgJWQiLCBwYXNfaXJxKTsKKwkJaHdfY29uZmlnLT5pcnE9LTE7CisJCW9rID0gMDsKKwl9CisJZWxzZQorCXsKKwkJaW50X3B0cnMgPSBwYXNfcmVhZCgweEYzOEEpOworCQlpbnRfcHRycyA9IChpbnRfcHRycyAmIDB4ZjApIHwgaXJxX2JpdHNbcGFzX2lycV07CisJCXBhc193cml0ZShpbnRfcHRycywgMHhGMzhBKTsKKwkJaWYgKCFpcnFfYml0c1twYXNfaXJxXSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJQQVMxNjogSW52YWxpZCBJUlEgJWQiLCBwYXNfaXJxKTsKKwkJCWh3X2NvbmZpZy0+aXJxPS0xOworCQkJb2sgPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHJlcXVlc3RfaXJxKHBhc19pcnEsIHBhc2ludHIsIDAsICJQQVMxNiIsaHdfY29uZmlnKSA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlBBUzE2OiBDYW5ub3QgYWxsb2NhdGUgSVJRICVkXG4iLHBhc19pcnEpOworCQkJCWh3X2NvbmZpZy0+aXJxPS0xOworCQkJCW9rID0gMDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChod19jb25maWctPmRtYSA8IDAgfHwgaHdfY29uZmlnLT5kbWEgPiA3KQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQVMxNjogSW52YWxpZCBETUEgc2VsZWN0aW9uICVkIiwgaHdfY29uZmlnLT5kbWEpOworCQlod19jb25maWctPmRtYT0tMTsKKwkJb2sgPSAwOworCX0KKwllbHNlCisJeworCQlwYXNfd3JpdGUoZG1hX2JpdHNbaHdfY29uZmlnLT5kbWFdLCAweEYzODkpOworCQlpZiAoIWRtYV9iaXRzW2h3X2NvbmZpZy0+ZG1hXSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJQQVMxNjogSW52YWxpZCBETUEgc2VsZWN0aW9uICVkIiwgaHdfY29uZmlnLT5kbWEpOworCQkJaHdfY29uZmlnLT5kbWE9LTE7CisJCQlvayA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoc291bmRfYWxsb2NfZG1hKGh3X2NvbmZpZy0+ZG1hLCAiUEFTMTYiKSkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgInBhczJfY2FyZC5jOiBDYW4ndCBhbGxvY2F0ZSBETUEgY2hhbm5lbFxuIik7CisJCQkJaHdfY29uZmlnLT5kbWE9LTE7CisJCQkJb2sgPSAwOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBUaGlzIGZpeGVzIHRoZSB0aW1pbmcgcHJvYmxlbXMgb2YgdGhlIFBBUyBkdWUgdG8gdGhlIFN5bXBob255IGNoaXBzZXQKKwkgKiBhcyBwZXIgTWVkaWEgVmlzaW9uLiAgT25seSBkZWZpbmUgdGhpcyBpZiB5b3VyIFBBUyBkb2Vzbid0IHdvcmsgY29ycmVjdGx5LgorCSAqLworCisJaWYoc3ltcGhvbnkpCisJeworCQlvdXRiKCgweDA1KSwgMHhhOCk7CisJCW91dGIoKDB4NjApLCAweGE5KTsKKwl9CisKKwlpZihicm9rZW5fYnVzX2Nsb2NrKQorCQlwYXNfd3JpdGUoMHgwMSB8IDB4MTAgfCAweDIwIHwgMHgwNCwgMHg4Mzg4KTsKKwllbHNlCisJCS8qCisJCSAqIHBhc193cml0ZSgweDAxLCAweDgzODgpOworCQkgKi8KKwkJcGFzX3dyaXRlKDB4MDEgfCAweDEwIHwgMHgyMCwgMHg4Mzg4KTsKKworCXBhc193cml0ZSgweDE4LCAweDgzOEEpOwkvKiA/Pz8gKi8KKwlwYXNfd3JpdGUoMHgyMCB8IDB4MDEsIDB4MEI4QSk7CQkvKiBNdXRlIG9mZiwgZmlsdGVyID0gMTcuODk3IGtIeiAqLworCXBhc193cml0ZSg4LCAweEJGOEEpOworCisJbWl4X3dyaXRlKDB4ODAgfCA1LCAweDA3OEIpOworCW1peF93cml0ZSg1LCAweDA3OEIpOworCisJeworCQlzdHJ1Y3QgYWRkcmVzc19pbmZvICpzYl9jb25maWc7CisKKwkJc2JfY29uZmlnID0gJmNmZzI7CisJCWlmIChzYl9jb25maWctPmlvX2Jhc2UpCisJCXsKKwkJCXVuc2lnbmVkIGNoYXIgICBpcnFfZG1hOworCisJCQkvKgorCQkJICogVHVybiBvbiBTb3VuZCBCbGFzdGVyIGNvbXBhdGliaWxpdHkKKwkJCSAqIGJpdCAxID0gU0IgZW11bGF0aW9uCisJCQkgKiBiaXQgMCA9IE1QVTQwMSBlbXVsYXRpb24gKENEUEMgb25seSA6LSggKQorCQkJICovCisJCQkKKwkJCXBhc193cml0ZSgweDAyLCAweEY3ODgpOworCisJCQkvKgorCQkJICogIkVtdWxhdGlvbiBhZGRyZXNzIgorCQkJICovCisJCQkKKwkJCXBhc193cml0ZSgoc2JfY29uZmlnLT5pb19iYXNlID4+IDQpICYgMHgwZiwgMHhGNzg5KTsKKwkJCXBhc19zYl9iYXNlID0gc2JfY29uZmlnLT5pb19iYXNlOworCisJCQlpZiAoIXNiX2RtYV9iaXRzW3NiX2NvbmZpZy0+ZG1hXSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIlBBUzE2IFdhcm5pbmc6IEludmFsaWQgU0IgRE1BICVkXG5cbiIsIHNiX2NvbmZpZy0+ZG1hKTsKKworCQkJaWYgKCFzYl9pcnFfYml0c1tzYl9jb25maWctPmlycV0pCisJCQkJcHJpbnRrKEtFUk5fRVJSICJQQVMxNiBXYXJuaW5nOiBJbnZhbGlkIFNCIElSUSAlZFxuXG4iLCBzYl9jb25maWctPmlycSk7CisKKwkJCWlycV9kbWEgPSBzYl9kbWFfYml0c1tzYl9jb25maWctPmRtYV0gfAorCQkJCXNiX2lycV9iaXRzW3NiX2NvbmZpZy0+aXJxXTsKKworCQkJcGFzX3dyaXRlKGlycV9kbWEsIDB4RkI4QSk7CisJCX0KKwkJZWxzZQorCQkJcGFzX3dyaXRlKDB4MDAsIDB4Rjc4OCk7CisJfQorCisJaWYgKCFvaykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUEFTMTY6IERyaXZlciBub3QgZW5hYmxlZFxuIik7CisKKwlyZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRldGVjdF9wYXNfaHcoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIGNoYXIgICBib2FyZF9pZCwgZm9vOworCisJLyoKKwkgKiBXQVJOSU5HOiBTZXR0aW5nIGFuIG9wdGlvbiBsaWtlIFc6MSBvciBzbyB0aGF0IGRpc2FibGVzIHdhcm0gYm9vdCByZXNldAorCSAqIG9mIHRoZSBjYXJkIHdpbGwgc2NyZXcgdXAgdGhpcyBkZXRlY3QgY29kZSBzb21ldGhpbmcgZmllcmNlLiBBZGRpbmcgY29kZQorCSAqIHRvIGhhbmRsZSB0aGlzIG1lYW5zIHBvc3NpYmx5IGludGVyZmVyaW5nIHdpdGggb3RoZXIgY2FyZHMgb24gdGhlIGJ1cyBpZgorCSAqIHlvdSBoYXZlIHNvbWV0aGluZyBvbiBiYXNlIHBvcnQgMHgzODguIFNPIGJlIGZvcmV3YXJuZWQuCisJICovCisKKwlvdXRiKCgweEJDKSwgMHg5QTAxKTsJLyogQWN0aXZhdGUgZmlyc3QgYm9hcmQgKi8KKwlvdXRiKChod19jb25maWctPmlvX2Jhc2UgPj4gMiksIDB4OUEwMSk7CS8qIFNldCBiYXNlIGFkZHJlc3MgKi8KKwlwYXNfdHJhbnNsYXRlX2NvZGUgPSBod19jb25maWctPmlvX2Jhc2UgLSAweDM4ODsKKwlwYXNfd3JpdGUoMSwgMHhCRjg4KTsJLyogU2VsZWN0IG9uZSB3YWl0IHN0YXRlcyAqLworCisJYm9hcmRfaWQgPSBwYXNfcmVhZCgweDBCOEIpOworCisJaWYgKGJvYXJkX2lkID09IDB4ZmYpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXZSBwcm9iYWJseSBoYXZlIGEgUEFTLXNlcmllcyBib2FyZCwgbm93IGNoZWNrIGZvciBhIFBBUzE2LXNlcmllcyBib2FyZAorCSAqIGJ5IHRyeWluZyB0byBjaGFuZ2UgdGhlIGJvYXJkIHJldmlzaW9uIGJpdHMuIFBBUzE2LXNlcmllcyBoYXJkd2FyZSB3b24ndAorCSAqIGxldCB5b3UgZG8gdGhpcyAtIHRoZSBiaXRzIGFyZSByZWFkLW9ubHkuCisJICovCisKKwlmb28gPSBib2FyZF9pZCBeIDB4ZTA7CisKKwlwYXNfd3JpdGUoZm9vLCAweDBCOEIpOworCWZvbyA9IHBhc19yZWFkKDB4MEI4Qik7CisJcGFzX3dyaXRlKGJvYXJkX2lkLCAweDBCOEIpOworCisJaWYgKGJvYXJkX2lkICE9IGZvbykKKwkJcmV0dXJuIDA7CisKKwlwYXNfbW9kZWwgPSBwYXNfcmVhZCgweEZGODgpOworCisJcmV0dXJuIHBhc19tb2RlbDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF9wYXNfY2FyZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJcGFzX2lycSA9IGh3X2NvbmZpZy0+aXJxOworCisJaWYgKGRldGVjdF9wYXNfaHcoaHdfY29uZmlnKSkKKwl7CisKKwkJaWYgKChwYXNfbW9kZWwgPSBwYXNfcmVhZCgweEZGODgpKSkKKwkJeworCQkJY2hhciAgICAgICAgICAgIHRlbXBbMTAwXTsKKworCQkJc3ByaW50Zih0ZW1wLAorCQkJICAgICIlcyByZXYgJWQiLCBwYXNfbW9kZWxfbmFtZXNbKGludCkgcGFzX21vZGVsXSwKKwkJCQkgICAgcGFzX3JlYWQoMHgyNzg5KSk7CisJCQljb25mX3ByaW50Zih0ZW1wLCBod19jb25maWcpOworCQl9CisJCWlmIChjb25maWdfcGFzX2h3KGh3X2NvbmZpZykpCisJCXsKKwkJCXBhc19wY21faW5pdChod19jb25maWcpOworCQkJcGFzX21pZGlfaW5pdCgpOworCQkJcGFzX2luaXRfbWl4ZXIoKTsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgX19pbml0IHByb2JlX3BhcyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJcmV0dXJuIGRldGVjdF9wYXNfaHcoaHdfY29uZmlnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9wYXMoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWV4dGVybiBpbnQgcGFzX2F1ZGlvZGV2OworCWV4dGVybiBpbnQgcGFzMl9taWRpZGV2OworCisJaWYgKGh3X2NvbmZpZy0+ZG1hPjApCisJCXNvdW5kX2ZyZWVfZG1hKGh3X2NvbmZpZy0+ZG1hKTsKKwlpZiAoaHdfY29uZmlnLT5pcnE+MCkKKwkJZnJlZV9pcnEoaHdfY29uZmlnLT5pcnEsIGh3X2NvbmZpZyk7CisKKwlpZihwYXNfYXVkaW9kZXYhPS0xKQorCQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYoYXVkaW9fZGV2c1twYXNfYXVkaW9kZXZdLT5taXhlcl9kZXYpOworCWlmKHBhczJfbWlkaWRldiE9LTEpCisJICAgICAgICBzb3VuZF91bmxvYWRfbWlkaWRldihwYXMyX21pZGlkZXYpOworCWlmKHBhc19hdWRpb2RldiE9LTEpCisJCXNvdW5kX3VubG9hZF9hdWRpb2RldihwYXNfYXVkaW9kZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8JPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWExNgk9IC0xOwkvKiBTZXQgdGhpcyBmb3IgbW9kdWxlcyB0aGF0IG5lZWQgaXQgKi8KKworc3RhdGljIGludCBfX2luaXRkYXRhIHNiX2lvCT0gMDsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzYl9pcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzYl9kbWEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzYl9kbWExNgk9IC0xOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWExNiwgaW50LCAwKTsKKworbW9kdWxlX3BhcmFtKHNiX2lvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNiX2lycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzYl9kbWEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc2JfZG1hMTYsIGludCwgMCk7CisKK21vZHVsZV9wYXJhbShqb3lzdGljaywgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oc3ltcGhvbnksIGJvb2wsIDApOworbW9kdWxlX3BhcmFtKGJyb2tlbl9idXNfY2xvY2ssIGJvb2wsIDApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcGFzMih2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlBybyBBdWRpbyBTcGVjdHJ1bSBkcml2ZXIgQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NlxuIik7CisKKwljZmcuaW9fYmFzZSA9IGlvOworCWNmZy5pcnEgPSBpcnE7CisJY2ZnLmRtYSA9IGRtYTsKKwljZmcuZG1hMiA9IGRtYTE2OworCisJY2ZnMi5pb19iYXNlID0gc2JfaW87CisJY2ZnMi5pcnEgPSBzYl9pcnE7CisJY2ZnMi5kbWEgPSBzYl9kbWE7CisJY2ZnMi5kbWEyID0gc2JfZG1hMTY7CisKKwlpZiAoY2ZnLmlvX2Jhc2UgPT0gLTEgfHwgY2ZnLmRtYSA9PSAtMSB8fCBjZmcuaXJxID09IC0xKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkkvTywgSVJRLCBETUEgYW5kIHR5cGUgYXJlIG1hbmRhdG9yeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcHJvYmVfcGFzKCZjZmcpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlhdHRhY2hfcGFzX2NhcmQoJmNmZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfcGFzMih2b2lkKQoreworCXVubG9hZF9wYXMoJmNmZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcGFzMik7Cittb2R1bGVfZXhpdChjbGVhbnVwX3BhczIpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfcGFzMihjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSwgZG1hLCBkbWEyLCBzYl9pbywgc2JfaXJxLCBzYl9kbWEsIHNiX2RtYTIgKi8KKwlpbnQgaW50c1s5XTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJaW8JPSBpbnRzWzFdOworCWlycQk9IGludHNbMl07CisJZG1hCT0gaW50c1szXTsKKwlkbWExNgk9IGludHNbNF07CisKKwlzYl9pbwk9IGludHNbNV07CisJc2JfaXJxCT0gaW50c1s2XTsKKwlzYl9kbWEJPSBpbnRzWzddOworCXNiX2RtYTE2ID0gaW50c1s4XTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJwYXMyPSIsIHNldHVwX3BhczIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvcGFzMl9taWRpLmMgYi9zb3VuZC9vc3MvcGFzMl9taWRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkNmE1OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9wYXMyX21pZGkuYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIHNvdW5kL3BhczJfbWlkaS5jCisgKgorICogVGhlIGxvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSBQQVMgTWlkaSBJbnRlcmZhY2UuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6CTogQWRkZWQgX19pbml0IHRvIHBhc19pbml0X21peGVyKCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJwYXMyLmgiCisKK2V4dGVybiBzcGlubG9ja190IHBhc19sb2NrOworCitzdGF0aWMgaW50ICAgICAgbWlkaV9idXN5LCBpbnB1dF9vcGVuZWQ7CitzdGF0aWMgaW50ICAgICAgbXlfZGV2OworCitpbnQgcGFzMl9taWRpZGV2PS0xOworCitzdGF0aWMgdW5zaWduZWQgY2hhciB0bXBfcXVldWVbMjU2XTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcWxlbjsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHFoZWFkLCBxdGFpbDsKKworc3RhdGljIHZvaWQgICAgICgqbWlkaV9pbnB1dF9pbnRyKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKTsKKworc3RhdGljIGludCBwYXNfbWlkaV9vcGVuKGludCBkZXYsIGludCBtb2RlLAorCSAgICAgIHZvaWQgICAgICAgICAgICAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKKwkgICAgICB2b2lkICAgICAgICAgICAgKCpvdXRwdXQpIChpbnQgZGV2KQorKQoreworCWludCAgICAgICAgICAgICBlcnI7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgICBjdHJsOworCisKKwlpZiAobWlkaV9idXN5KQorCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgKiBSZXNldCBpbnB1dCBhbmQgb3V0cHV0IEZJRk8gcG9pbnRlcnMKKwkgKi8KKwlwYXNfd3JpdGUoMHgyMCB8IDB4NDAsCisJCSAgMHgxNzhiKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYXNfbG9jaywgZmxhZ3MpOworCisJaWYgKChlcnIgPSBwYXNfc2V0X2ludHIoMHgxMCkpIDwgMCkKKwl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhc19sb2NrLCBmbGFncyk7CisJCXJldHVybiBlcnI7CisJfQorCS8qCisJICogRW5hYmxlIGlucHV0IGF2YWlsYWJsZSBhbmQgb3V0cHV0IEZJRk8gZW1wdHkgaW50ZXJydXB0cworCSAqLworCisJY3RybCA9IDA7CisJaW5wdXRfb3BlbmVkID0gMDsKKwltaWRpX2lucHV0X2ludHIgPSBpbnB1dDsKKworCWlmIChtb2RlID09IE9QRU5fUkVBRCB8fCBtb2RlID09IE9QRU5fUkVBRFdSSVRFKQorCXsKKwkJY3RybCB8PSAweDA0OwkvKiBFbmFibGUgaW5wdXQgKi8KKwkJaW5wdXRfb3BlbmVkID0gMTsKKwl9CisJaWYgKG1vZGUgPT0gT1BFTl9XUklURSB8fCBtb2RlID09IE9QRU5fUkVBRFdSSVRFKQorCXsKKwkJY3RybCB8PSAweDA4IHwgMHgxMDsJLyogRW5hYmxlIG91dHB1dCAqLworCX0KKwlwYXNfd3JpdGUoY3RybCwgMHgxNzhiKTsKKworCS8qCisJICogQWNrbm93bGVkZ2UgYW55IHBlbmRpbmcgaW50ZXJydXB0cworCSAqLworCisJcGFzX3dyaXRlKDB4ZmYsIDB4MUI4OCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXNfbG9jaywgZmxhZ3MpOworCisJbWlkaV9idXN5ID0gMTsKKwlxbGVuID0gcWhlYWQgPSBxdGFpbCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhc19taWRpX2Nsb3NlKGludCBkZXYpCit7CisKKwkvKgorCSAqIFJlc2V0IEZJRk8gcG9pbnRlcnMsIGRpc2FibGUgaW50cnMKKwkgKi8KKwlwYXNfd3JpdGUoMHgyMCB8IDB4NDAsIDB4MTc4Yik7CisKKwlwYXNfcmVtb3ZlX2ludHIoMHgxMCk7CisJbWlkaV9idXN5ID0gMDsKK30KKworc3RhdGljIGludCBkdW1wX3RvX21pZGkodW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCit7CisJaW50IGZpZm9fc3BhY2UsIHg7CisKKwlmaWZvX3NwYWNlID0gKCh4ID0gcGFzX3JlYWQoMHgxQjg5KSkgPj4gNCkgJiAweDBmOworCisJLyoKKwkgKiBUaGUgTUlESSBGSUZPIHNwYWNlIHJlZ2lzdGVyIGFuZCBpdCdzIGRvY3VtZW50YXRpb24gaXMgbm9udW5kZXJzdGFuZGFibGUuCisJICogVGhlcmUgc2VlbSB0byBiZSBubyB3YXkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGJ1ZmZlciBmdWxsIGFuZCBidWZmZXIKKwkgKiBlbXB0eSBzaXR1YXRpb25zLiBGb3IgdGhpcyByZWFzb24gd2UgZG9uJ3QgbmV2ZXIgd3JpdGUgdGhlIGJ1ZmZlcgorCSAqIGNvbXBsZXRlbHkgZnVsbC4gSW4gdGhpcyB3YXkgd2UgY2FuIGFzc3VtZSB0aGF0IDAgKG9yIGlzIGl0IDE1KQorCSAqIG1lYW5zIHRoYXQgdGhlIGJ1ZmZlciBpcyBlbXB0eS4KKwkgKi8KKworCWlmIChmaWZvX3NwYWNlIDwgMiAmJiBmaWZvX3NwYWNlICE9IDApCS8qIEZ1bGwgKGFsbW9zdCkgKi8KKwkJcmV0dXJuIDA7CS8qIEFzayB1cHBlciBsYXllcnMgdG8gcmV0cnkgYWZ0ZXIgc29tZSB0aW1lICovCisKKwlwYXNfd3JpdGUobWlkaV9ieXRlLCAweDE3OEEpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFzX21pZGlfb3V0KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKQoreworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogRHJhaW4gdGhlIGxvY2FsIHF1ZXVlIGZpcnN0CisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGFzX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlIChxbGVuICYmIGR1bXBfdG9fbWlkaSh0bXBfcXVldWVbcWhlYWRdKSkKKwl7CisJCXFsZW4tLTsKKwkJcWhlYWQrKzsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXNfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKglPdXRwdXQgdGhlIGJ5dGUgaWYgdGhlIGxvY2FsIHF1ZXVlIGlzIGVtcHR5LgorCSAqLworCisJaWYgKCFxbGVuKQorCQlpZiAoZHVtcF90b19taWRpKG1pZGlfYnl0ZSkpCisJCQlyZXR1cm4gMTsKKworCS8qCisJICoJUHV0IHRvIHRoZSBsb2NhbCBxdWV1ZQorCSAqLworCisJaWYgKHFsZW4gPj0gMjU2KQorCQlyZXR1cm4gMDsJLyogTG9jYWwgcXVldWUgZnVsbCAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBhc19sb2NrLCBmbGFncyk7CisKKwl0bXBfcXVldWVbcXRhaWxdID0gbWlkaV9ieXRlOworCXFsZW4rKzsKKwlxdGFpbCsrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFzX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhc19taWRpX3N0YXJ0X3JlYWQoaW50IGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXNfbWlkaV9lbmRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYXNfbWlkaV9raWNrKGludCBkZXYpCit7Cit9CisKK3N0YXRpYyBpbnQgcGFzX2J1ZmZlcl9zdGF0dXMoaW50IGRldikKK3sKKwlyZXR1cm4gcWxlbjsKK30KKworI2RlZmluZSBNSURJX1NZTlRIX05BTUUJIlBybyBBdWRpbyBTcGVjdHJ1bSBNaWRpIgorI2RlZmluZSBNSURJX1NZTlRIX0NBUFMJU1lOVEhfQ0FQX0lOUFVUCisjaW5jbHVkZSAibWlkaV9zeW50aC5oIgorCitzdGF0aWMgc3RydWN0IG1pZGlfb3BlcmF0aW9ucyBwYXNfbWlkaV9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmluZm8JCT0geyJQcm8gQXVkaW8gU3BlY3RydW0iLCAwLCAwLCBTTkRDQVJEX1BBU30sCisJLmNvbnZlcnRlcgk9ICZzdGRfbWlkaV9zeW50aCwKKwkuaW5faW5mbwk9IHswfSwKKwkub3BlbgkJPSBwYXNfbWlkaV9vcGVuLAorCS5jbG9zZQkJPSBwYXNfbWlkaV9jbG9zZSwKKwkub3V0cHV0Ywk9IHBhc19taWRpX291dCwKKwkuc3RhcnRfcmVhZAk9IHBhc19taWRpX3N0YXJ0X3JlYWQsCisJLmVuZF9yZWFkCT0gcGFzX21pZGlfZW5kX3JlYWQsCisJLmtpY2sJCT0gcGFzX21pZGlfa2ljaywKKwkuYnVmZmVyX3N0YXR1cwk9IHBhc19idWZmZXJfc3RhdHVzLAorfTsKKwordm9pZCBfX2luaXQgcGFzX21pZGlfaW5pdCh2b2lkKQoreworCWludCBkZXYgPSBzb3VuZF9hbGxvY19taWRpZGV2KCk7CisKKwlpZiAoZGV2ID09IC0xKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGFzX21pZGlfaW5pdDogVG9vIG1hbnkgbWlkaSBkZXZpY2VzIGRldGVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzdGRfbWlkaV9zeW50aC5taWRpX2RldiA9IG15X2RldiA9IGRldjsKKwltaWRpX2RldnNbZGV2XSA9ICZwYXNfbWlkaV9vcGVyYXRpb25zOworCXBhczJfbWlkaWRldiA9IGRldjsKKwlzZXF1ZW5jZXJfaW5pdCgpOworfQorCit2b2lkIHBhc19taWRpX2ludGVycnVwdCh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgICBzdGF0OworCWludCAgICAgICAgICAgICBpLCBpbmNvdW50OworCisJc3RhdCA9IHBhc19yZWFkKDB4MUI4OCk7CisKKwlpZiAoc3RhdCAmIDB4MDQpCS8qIElucHV0IGRhdGEgYXZhaWxhYmxlICovCisJeworCQlpbmNvdW50ID0gcGFzX3JlYWQoMHgxQjg5KSAmIDB4MGY7CS8qIElucHV0IEZJRk8gc2l6ZSAqLworCQlpZiAoIWluY291bnQpCisJCQlpbmNvdW50ID0gMTY7CisKKwkJZm9yIChpID0gMDsgaSA8IGluY291bnQ7IGkrKykKKwkJCWlmIChpbnB1dF9vcGVuZWQpCisJCQl7CisJCQkJbWlkaV9pbnB1dF9pbnRyKG15X2RldiwgcGFzX3JlYWQoMHgxNzhBKSk7CisJCQl9IGVsc2UKKwkJCQlwYXNfcmVhZCgweDE3OEEpOwkvKiBGbHVzaCAqLworCX0KKwlpZiAoc3RhdCAmICgweDA4IHwgMHgxMCkpCisJeworCQlzcGluX2xvY2soJnBhc19sb2NrKTsvKiBjYWxsZWQgaW4gaXJxIGNvbnRleHQgKi8KKworCQl3aGlsZSAocWxlbiAmJiBkdW1wX3RvX21pZGkodG1wX3F1ZXVlW3FoZWFkXSkpCisJCXsKKwkJCXFsZW4tLTsKKwkJCXFoZWFkKys7CisJCX0KKworCQlzcGluX3VubG9jaygmcGFzX2xvY2spOworCX0KKwlpZiAoc3RhdCAmIDB4NDApCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNSURJIG91dHB1dCBvdmVycnVuICV4LCV4XG4iLCBwYXNfcmVhZCgweDFCODkpLCBzdGF0KTsKKwl9CisJcGFzX3dyaXRlKHN0YXQsIDB4MUI4OCk7CS8qIEFja25vd2xlZGdlIGludGVycnVwdHMgKi8KK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9wYXMyX21peGVyLmMgYi9zb3VuZC9vc3MvcGFzMl9taXhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYWRlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvcGFzMl9taXhlci5jCkBAIC0wLDAgKzEsMzM2IEBACisKKy8qCisgKiBzb3VuZC9wYXMyX21peGVyLmMKKyAqCisgKiBNaXhlciByb3V0aW5lcyBmb3IgdGhlIFBybyBBdWRpbyBTcGVjdHJ1bSBjYXJkcy4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKy8qCisgKiBUaG9tYXMgU2FpbGVyICAgOiBpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKiBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDogYWRkZWQgX19pbml0IHRvIHBhc19pbml0X21peGVyKCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgInBhczIuaCIKKworI2lmbmRlZiBERUIKKyNkZWZpbmUgREVCKHdoYXQpCQkvKiAod2hhdCkgKi8KKyNlbmRpZgorCitleHRlcm4gaW50ICAgICAgcGFzX3RyYW5zbGF0ZV9jb2RlOworZXh0ZXJuIGNoYXIgICAgIHBhc19tb2RlbDsKK2V4dGVybiBpbnQgICAgICpwYXNfb3NwOworZXh0ZXJuIGludCAgICAgIHBhc19hdWRpb2RldjsKKworc3RhdGljIGludCAgICAgIHJlY19kZXZpY2VzID0gKFNPVU5EX01BU0tfTUlDKTsJCS8qIERlZmF1bHQgcmVjb3JkaW5nIHNvdXJjZSAqLworc3RhdGljIGludCAgICAgIG1vZGVfY29udHJvbDsKKworI2RlZmluZSBQT1NTSUJMRV9SRUNPUkRJTkdfREVWSUNFUwkoU09VTkRfTUFTS19TWU5USCB8IFNPVU5EX01BU0tfU1BFQUtFUiB8IFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgXAorCQkJCQkgU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfQUxUUENNKQorCisjZGVmaW5lIFNVUFBPUlRFRF9NSVhFUl9ERVZJQ0VTCQkoU09VTkRfTUFTS19TWU5USCB8IFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19TUEVBS0VSIHwgU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19NSUMgfCBcCisJCQkJCSBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19BTFRQQ00gfCBTT1VORF9NQVNLX0lNSVggfCBcCisJCQkJCSBTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfQkFTUyB8IFNPVU5EX01BU0tfVFJFQkxFIHwgU09VTkRfTUFTS19SRUNMRVYpCisKK3N0YXRpYyBpbnQgICAgICpsZXZlbHM7CisKK3N0YXRpYyBpbnQgICAgICBkZWZhdWx0X2xldmVsc1szMl0gPQoreworCTB4MzIzMiwJCQkvKiBNYXN0ZXIgVm9sdW1lICovCisJMHgzMjMyLAkJCS8qIEJhc3MgKi8KKwkweDMyMzIsCQkJLyogVHJlYmxlICovCisJMHg1MDUwLAkJCS8qIEZNICovCisJMHg0YjRiLAkJCS8qIFBDTSAqLworCTB4MzIzMiwJCQkvKiBQQyBTcGVha2VyICovCisJMHg0YjRiLAkJCS8qIEV4dCBMaW5lICovCisJMHg0YjRiLAkJCS8qIE1pYyAqLworCTB4NGI0YiwJCQkvKiBDRCAqLworCTB4NjQ2NCwJCQkvKiBSZWNvcmRpbmcgbW9uaXRvciAqLworCTB4NGI0YiwJCQkvKiBTQiBQQ00gKi8KKwkweDY0NjQJCQkvKiBSZWNvcmRpbmcgbGV2ZWwgKi8KK307CisKK3ZvaWQKK21peF93cml0ZSh1bnNpZ25lZCBjaGFyIGRhdGEsIGludCBpb2FkZHIpCit7CisJLyoKKwkgKiBUaGUgUmV2aXNpb24gRCBjYXJkcyBoYXZlIGEgcHJvYmxlbSB3aXRoIHRoZWlyIE1WQTUwOCBpbnRlcmZhY2UuIFRoZQorCSAqIGtsdWRnZS1vLXJhbWEgZml4IGlzIHRvIG1ha2UgYSAxNi1iaXQgcXVhbnRpdHkgd2l0aCBpZGVudGljYWwgTFNCIGFuZAorCSAqIE1TQnMgb3V0IG9mIHRoZSBvdXRwdXQgYnl0ZSBhbmQgdG8gZG8gYSAxNi1iaXQgb3V0IHRvIHRoZSBtaXhlciBwb3J0IC0KKwkgKiAxLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBpdCBpc24ndCB0aW1pbmcgcHJvYmxlbSBidXQgY2hpcCBhY2Nlc3MKKwkgKiBzZXF1ZW5jZSBwcm9ibGVtLgorCSAqLworCisJaWYgKHBhc19tb2RlbCA9PSA0KQorCSAgeworCQkgIG91dHcoZGF0YSB8IChkYXRhIDw8IDgpLCAoaW9hZGRyICsgcGFzX3RyYW5zbGF0ZV9jb2RlKSAtIDEpOworCQkgIG91dGIoKDB4ODApLCAwKTsKKwl9IGVsc2UKKwkJcGFzX3dyaXRlKGRhdGEsIGlvYWRkcik7Cit9CisKK3N0YXRpYyBpbnQKK21peGVyX291dHB1dChpbnQgcmlnaHRfdm9sLCBpbnQgbGVmdF92b2wsIGludCBkaXYsIGludCBiaXRzLAorCSAgICAgaW50IG1peGVyKQkJLyogSW5wdXQgb3Igb3V0cHV0IG1peGVyICovCit7CisJaW50ICAgICAgICAgICAgIGxlZnQgPSBsZWZ0X3ZvbCAqIGRpdiAvIDEwMDsKKwlpbnQgICAgICAgICAgICAgcmlnaHQgPSByaWdodF92b2wgKiBkaXYgLyAxMDA7CisKKworCWlmIChiaXRzICYgMHgxMCkKKwkgIHsKKwkJICBsZWZ0IHw9IG1peGVyOworCQkgIHJpZ2h0IHw9IG1peGVyOworCSAgfQorCWlmIChiaXRzID09IDB4MDMgfHwgYml0cyA9PSAweDA0KQorCSAgeworCQkgIG1peF93cml0ZSgweDgwIHwgYml0cywgMHgwNzhCKTsKKwkJICBtaXhfd3JpdGUobGVmdCwgMHgwNzhCKTsKKwkJICByaWdodF92b2wgPSBsZWZ0X3ZvbDsKKwl9IGVsc2UKKwkgIHsKKwkJICBtaXhfd3JpdGUoMHg4MCB8IDB4MjAgfCBiaXRzLCAweDA3OEIpOworCQkgIG1peF93cml0ZShsZWZ0LCAweDA3OEIpOworCQkgIG1peF93cml0ZSgweDgwIHwgMHg0MCB8IGJpdHMsIDB4MDc4Qik7CisJCSAgbWl4X3dyaXRlKHJpZ2h0LCAweDA3OEIpOworCSAgfQorCisJcmV0dXJuIChsZWZ0X3ZvbCB8IChyaWdodF92b2wgPDwgOCkpOworfQorCitzdGF0aWMgdm9pZAorc2V0X21vZGUoaW50IG5ld19tb2RlKQoreworCW1peF93cml0ZSgweDgwIHwgMHgwNSwgMHgwNzhCKTsKKwltaXhfd3JpdGUobmV3X21vZGUsIDB4MDc4Qik7CisKKwltb2RlX2NvbnRyb2wgPSBuZXdfbW9kZTsKK30KKworc3RhdGljIGludAorcGFzX21peGVyX3NldChpbnQgd2hpY2hEZXYsIHVuc2lnbmVkIGludCBsZXZlbCkKK3sKKwlpbnQgICAgICAgICAgICAgbGVmdCwgcmlnaHQsIGRldm1hc2ssIGNoYW5nZWQsIGksIG1peGVyID0gMDsKKworCURFQihwcmludGsoInN0YXRpYyBpbnQgcGFzX21peGVyX3NldChpbnQgd2hpY2hEZXYgPSAlZCwgdW5zaWduZWQgaW50IGxldmVsID0gJVgpXG4iLCB3aGljaERldiwgbGV2ZWwpKTsKKworCWxlZnQgPSBsZXZlbCAmIDB4N2Y7CisJcmlnaHQgPSAobGV2ZWwgJiAweDdmMDApID4+IDg7CisKKwlpZiAod2hpY2hEZXYgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMpIHsKKwkJaWYgKCgxIDw8IHdoaWNoRGV2KSAmIHJlY19kZXZpY2VzKQorCQkJbWl4ZXIgPSAweDIwOworCQllbHNlCisJCQltaXhlciA9IDB4MDA7CisJfQorCisJc3dpdGNoICh3aGljaERldikKKwkgIHsKKwkgIGNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgkvKiBNYXN0ZXIgdm9sdW1lICgwLTYzKSAqLworCQkgIGxldmVsc1t3aGljaERldl0gPSBtaXhlcl9vdXRwdXQocmlnaHQsIGxlZnQsIDYzLCAweDAxLCAwKTsKKwkJICBicmVhazsKKworCQkgIC8qCisJCSAgICogTm90ZSEgQmFzcyBhbmQgVHJlYmxlIGFyZSBtb25vIGRldmljZXMuIFdpbGwgdXNlIGp1c3QgdGhlIGxlZnQKKwkJICAgKiBjaGFubmVsLgorCQkgICAqLworCSAgY2FzZSBTT1VORF9NSVhFUl9CQVNTOgkvKiBCYXNzICgwLTEyKSAqLworCQkgIGxldmVsc1t3aGljaERldl0gPSBtaXhlcl9vdXRwdXQocmlnaHQsIGxlZnQsIDEyLCAweDAzLCAwKTsKKwkJICBicmVhazsKKwkgIGNhc2UgU09VTkRfTUlYRVJfVFJFQkxFOgkvKiBUcmVibGUgKDAtMTIpICovCisJCSAgbGV2ZWxzW3doaWNoRGV2XSA9IG1peGVyX291dHB1dChyaWdodCwgbGVmdCwgMTIsIDB4MDQsIDApOworCQkgIGJyZWFrOworCisJICBjYXNlIFNPVU5EX01JWEVSX1NZTlRIOgkvKiBJbnRlcm5hbCBzeW50aGVzaXplciAoMC0zMSkgKi8KKwkJICBsZXZlbHNbd2hpY2hEZXZdID0gbWl4ZXJfb3V0cHV0KHJpZ2h0LCBsZWZ0LCAzMSwgMHgxMCB8IDB4MDAsIG1peGVyKTsKKwkJICBicmVhazsKKwkgIGNhc2UgU09VTkRfTUlYRVJfUENNOgkvKiBQQVMgUENNICgwLTMxKSAqLworCQkgIGxldmVsc1t3aGljaERldl0gPSBtaXhlcl9vdXRwdXQocmlnaHQsIGxlZnQsIDMxLCAweDEwIHwgMHgwNSwgbWl4ZXIpOworCQkgIGJyZWFrOworCSAgY2FzZSBTT1VORF9NSVhFUl9BTFRQQ006CS8qIFNCIFBDTSAoMC0zMSkgKi8KKwkJICBsZXZlbHNbd2hpY2hEZXZdID0gbWl4ZXJfb3V0cHV0KHJpZ2h0LCBsZWZ0LCAzMSwgMHgxMCB8IDB4MDcsIG1peGVyKTsKKwkJICBicmVhazsKKwkgIGNhc2UgU09VTkRfTUlYRVJfU1BFQUtFUjoJLyogUEMgc3BlYWtlciAoMC0zMSkgKi8KKwkJICBsZXZlbHNbd2hpY2hEZXZdID0gbWl4ZXJfb3V0cHV0KHJpZ2h0LCBsZWZ0LCAzMSwgMHgxMCB8IDB4MDYsIG1peGVyKTsKKwkJICBicmVhazsKKwkgIGNhc2UgU09VTkRfTUlYRVJfTElORToJLyogRXh0ZXJuYWwgbGluZSAoMC0zMSkgKi8KKwkJICBsZXZlbHNbd2hpY2hEZXZdID0gbWl4ZXJfb3V0cHV0KHJpZ2h0LCBsZWZ0LCAzMSwgMHgxMCB8IDB4MDIsIG1peGVyKTsKKwkJICBicmVhazsKKwkgIGNhc2UgU09VTkRfTUlYRVJfQ0Q6CS8qIENEICgwLTMxKSAqLworCQkgIGxldmVsc1t3aGljaERldl0gPSBtaXhlcl9vdXRwdXQocmlnaHQsIGxlZnQsIDMxLCAweDEwIHwgMHgwMywgbWl4ZXIpOworCQkgIGJyZWFrOworCSAgY2FzZSBTT1VORF9NSVhFUl9NSUM6CS8qIEV4dGVybmFsIG1pY3JvcGhvbmUgKDAtMzEpICovCisJCSAgbGV2ZWxzW3doaWNoRGV2XSA9IG1peGVyX291dHB1dChyaWdodCwgbGVmdCwgMzEsIDB4MTAgfCAweDA0LCBtaXhlcik7CisJCSAgYnJlYWs7CisJICBjYXNlIFNPVU5EX01JWEVSX0lNSVg6CS8qIFJlY29yZGluZyBtb25pdG9yICgwLTMxKSAoT3V0cHV0IG1peGVyIG9ubHkpICovCisJCSAgbGV2ZWxzW3doaWNoRGV2XSA9IG1peGVyX291dHB1dChyaWdodCwgbGVmdCwgMzEsIDB4MTAgfCAweDAxLAorCQkJCQkJICAweDAwKTsKKwkJICBicmVhazsKKwkgIGNhc2UgU09VTkRfTUlYRVJfUkVDTEVWOgkvKiBSZWNvcmRpbmcgbGV2ZWwgKDAtMTUpICovCisJCSAgbGV2ZWxzW3doaWNoRGV2XSA9IG1peGVyX291dHB1dChyaWdodCwgbGVmdCwgMTUsIDB4MDIsIDApOworCQkgIGJyZWFrOworCisKKwkgIGNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkgIGRldm1hc2sgPSBsZXZlbCAmIFBPU1NJQkxFX1JFQ09SRElOR19ERVZJQ0VTOworCisJCSAgY2hhbmdlZCA9IGRldm1hc2sgXiByZWNfZGV2aWNlczsKKwkJICByZWNfZGV2aWNlcyA9IGRldm1hc2s7CisKKwkJICBmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspCisJCQkgIGlmIChjaGFuZ2VkICYgKDEgPDwgaSkpCisJCQkgICAgeworCQkJCSAgICBwYXNfbWl4ZXJfc2V0KGksIGxldmVsc1tpXSk7CisJCQkgICAgfQorCQkgIHJldHVybiByZWNfZGV2aWNlczsKKwkJICBicmVhazsKKworCSAgZGVmYXVsdDoKKwkJICByZXR1cm4gLUVJTlZBTDsKKwkgIH0KKworCXJldHVybiAobGV2ZWxzW3doaWNoRGV2XSk7Cit9CisKKy8qKioqKi8KKworc3RhdGljIHZvaWQKK3Bhc19taXhlcl9yZXNldCh2b2lkKQoreworCWludCAgICAgICAgICAgICBmb287CisKKwlERUIocHJpbnRrKCJwYXMyX21peGVyLmM6IHZvaWQgcGFzX21peGVyX3Jlc2V0KHZvaWQpXG4iKSk7CisKKwlmb3IgKGZvbyA9IDA7IGZvbyA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgZm9vKyspCisJCXBhc19taXhlcl9zZXQoZm9vLCBsZXZlbHNbZm9vXSk7CisKKwlzZXRfbW9kZSgweDA0IHwgMHgwMSk7Cit9CisKK3N0YXRpYyBpbnQgcGFzX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IGxldmVsLHYgOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCURFQihwcmludGsoInBhczJfbWl4ZXIuYzogaW50IHBhc19taXhlcl9pb2N0bCh1bnNpZ25lZCBpbnQgY21kID0gJVgsIHVuc2lnbmVkIGludCBhcmcgPSAlWClcbiIsIGNtZCwgYXJnKSk7CisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMSkgeyAvKiBTZXQgbG91ZG5lc3MgYml0ICovCisJCWlmIChnZXRfdXNlcihsZXZlbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGxldmVsID09IC0xKSAgLyogUmV0dXJuIGN1cnJlbnQgc2V0dGluZ3MgKi8KKwkJCWxldmVsID0gKG1vZGVfY29udHJvbCAmIDB4MDQpOworCQllbHNlIHsKKwkJCW1vZGVfY29udHJvbCAmPSB+MHgwNDsKKwkJCWlmIChsZXZlbCkKKwkJCQltb2RlX2NvbnRyb2wgfD0gMHgwNDsKKwkJCXNldF9tb2RlKG1vZGVfY29udHJvbCk7CisJCX0KKwkJbGV2ZWwgPSAhIWxldmVsOworCQlyZXR1cm4gcHV0X3VzZXIobGV2ZWwsIHApOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUyKSB7IC8qIFNldCBlbmhhbmNlIGJpdCAqLworCQlpZiAoZ2V0X3VzZXIobGV2ZWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChsZXZlbCA9PSAtMSkgeyAvKiBSZXR1cm4gY3VycmVudCBzZXR0aW5ncyAqLworCQkJaWYgKCEobW9kZV9jb250cm9sICYgMHgwMykpCisJCQkJbGV2ZWwgPSAwOworCQkJZWxzZQorCQkJCWxldmVsID0gKChtb2RlX2NvbnRyb2wgJiAweDAzKSArIDEpICogMjA7CisJCX0gZWxzZSB7CisJCQlpbnQgaSA9IDA7CisJCQkKKwkJCWxldmVsICY9IDB4N2Y7CisJCQlpZiAobGV2ZWwpCisJCQkJaSA9IChsZXZlbCAvIDIwKSAtIDE7CisJCQltb2RlX2NvbnRyb2wgJj0gfjB4MDM7CisJCQltb2RlX2NvbnRyb2wgfD0gaSAmIDB4MDM7CisJCQlzZXRfbW9kZShtb2RlX2NvbnRyb2wpOworCQkJaWYgKGkpCisJCQkJaSA9IChpICsgMSkgKiAyMDsKKwkJCWxldmVsID0gaTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIobGV2ZWwsIHApOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUzKSB7IC8qIFNldCBtdXRlIGJpdCAqLworCQlpZiAoZ2V0X3VzZXIobGV2ZWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChsZXZlbCA9PSAtMSkJLyogUmV0dXJuIGN1cnJlbnQgc2V0dGluZ3MgKi8KKwkJCWxldmVsID0gIShwYXNfcmVhZCgweDBCOEEpICYgMHgyMCk7CisJCWVsc2UgeworCQkJaWYgKGxldmVsKQorCQkJCXBhc193cml0ZShwYXNfcmVhZCgweDBCOEEpICYgKH4weDIwKSwgMHgwQjhBKTsKKwkJCWVsc2UKKwkJCQlwYXNfd3JpdGUocGFzX3JlYWQoMHgwQjhBKSB8IDB4MjAsIDB4MEI4QSk7CisKKwkJCWxldmVsID0gIShwYXNfcmVhZCgweDBCOEEpICYgMHgyMCk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKGxldmVsLCBwKTsKKwl9CisJaWYgKCgoY21kID4+IDgpICYgMHhmZikgPT0gJ00nKSB7CisJCWlmIChnZXRfdXNlcih2LCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkgeworCQkJdiA9IHBhc19taXhlcl9zZXQoY21kICYgMHhmZiwgdik7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpIHsKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCXYgPSByZWNfZGV2aWNlczsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoKKwkJCQl2ID0gU1VQUE9SVEVEX01JWEVSX0RFVklDRVMgJiB+KFNPVU5EX01BU0tfQkFTUyB8IFNPVU5EX01BU0tfVFJFQkxFKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKKwkJCQl2ID0gU1VQUE9SVEVEX01JWEVSX0RFVklDRVM7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQkJdiA9IFBPU1NJQkxFX1JFQ09SRElOR19ERVZJQ0VTICYgU1VQUE9SVEVEX01JWEVSX0RFVklDRVM7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQkJdiA9IDA7CS8qIE5vIHNwZWNpYWwgY2FwYWJpbGl0aWVzICovCisJCQkJYnJlYWs7CisJCQkJCisJCQlkZWZhdWx0OgorCQkJCXYgPSBsZXZlbHNbY21kICYgMHhmZl07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHYsIHApOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zIHBhc19taXhlcl9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWQJPSAiUEFTMTYiLAorCS5uYW1lCT0gIlBybyBBdWRpbyBTcGVjdHJ1bSAxNiIsCisJLmlvY3RsCT0gcGFzX21peGVyX2lvY3RsCit9OworCitpbnQgX19pbml0CitwYXNfaW5pdF9taXhlcih2b2lkKQoreworCWludCAgICAgICAgICAgICBkOworCisJbGV2ZWxzID0gbG9hZF9taXhlcl92b2x1bWVzKCJQQVMxNl8xIiwgZGVmYXVsdF9sZXZlbHMsIDEpOworCisJcGFzX21peGVyX3Jlc2V0KCk7CisKKwlpZiAoKGQgPSBzb3VuZF9hbGxvY19taXhlcmRldigpKSAhPSAtMSkKKwkgIHsKKwkJICBhdWRpb19kZXZzW3Bhc19hdWRpb2Rldl0tPm1peGVyX2RldiA9IGQ7CisJCSAgbWl4ZXJfZGV2c1tkXSA9ICZwYXNfbWl4ZXJfb3BlcmF0aW9uczsKKwkgIH0KKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9wYXMyX3BjbS5jIGIvc291bmQvb3NzL3BhczJfcGNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNmFhZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9wYXMyX3BjbS5jCkBAIC0wLDAgKzEsNDM3IEBACisvKgorICogcGFzMl9wY20uYyBBdWRpbyByb3V0aW5lcyBmb3IgUEFTMTYKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICoKKyAqIFRob21hcyBTYWlsZXIgICA6IGlvY3RsIGNvZGUgcmV3b3JrZWQgKHZtYWxsb2MvdmZyZWUgcmVtb3ZlZCkKKyAqIEFsYW4gQ294CSAgIDogU3dhdHRlZCBhIGRvdWJsZSBhbGxvY2F0aW9uIG9mIGRldmljZSBidWcuIE1hZGUgYSBmZXcKKyAqCQkgICAgIG1vcmUgdGhpbmdzIG1vZHVsZSBvcHRpb25zLgorICogQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA6IEFkZGVkIF9faW5pdCB0byBwYXNfcGNtX2luaXQoKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vdGltZXguaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgInBhczIuaCIKKworI2lmbmRlZiBERUIKKyNkZWZpbmUgREVCKFdIQVQpCisjZW5kaWYKKworI2RlZmluZSBQQVNfUENNX0lOVFJCSVRTICgweDA4KQorLyoKKyAqIFNhbXBsZSBidWZmZXIgdGltZXIgaW50ZXJydXB0IGVuYWJsZQorICovCisKKyNkZWZpbmUgUENNX05PTgkwCisjZGVmaW5lIFBDTV9EQUMJMQorI2RlZmluZSBQQ01fQURDCTIKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNtX3NwZWVkOyAJLyogc2FtcGxpbmcgcmF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGNtX2NoYW5uZWxzID0gMTsJLyogY2hhbm5lbHMgKDEgb3IgMikgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBjbV9iaXRzID0gODsJLyogYml0cy9zYW1wbGUgKDggb3IgMTYpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBwY21fZmlsdGVyOwkvKiBmaWx0ZXIgRkxBRyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGNtX21vZGUgPSBQQ01fTk9OOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNtX2NvdW50Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBjbV9iaXRzb2sgPSA4OwkvKiBtYXNrIG9mIE9LIGJpdHMgKi8KK3N0YXRpYyBpbnQgICAgICBwY21fYnVzeTsKK2ludCAgICAgICAgICAgICBwYXNfYXVkaW9kZXYgPSAtMTsKK3N0YXRpYyBpbnQgICAgICBvcGVuX21vZGU7CisKK2V4dGVybiBzcGlubG9ja190IHBhc19sb2NrOworCitzdGF0aWMgaW50IHBjbV9zZXRfc3BlZWQoaW50IGFyZykKK3sKKwlpbnQgZm9vLCB0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChhcmcgPT0gMCkKKwkJcmV0dXJuIHBjbV9zcGVlZDsKKworCWlmIChhcmcgPiA0NDEwMCkKKwkJYXJnID0gNDQxMDA7CisJaWYgKGFyZyA8IDUwMDApCisJCWFyZyA9IDUwMDA7CisKKwlpZiAocGNtX2NoYW5uZWxzICYgMikKKwl7CisJCWZvbyA9ICgoQ0xPQ0tfVElDS19SQVRFIC8gMikgKyAoYXJnIC8gMikpIC8gYXJnOworCQlhcmcgPSAoKENMT0NLX1RJQ0tfUkFURSAvIDIpICsgKGZvbyAvIDIpKSAvIGZvbzsKKwl9CisJZWxzZQorCXsKKwkJZm9vID0gKENMT0NLX1RJQ0tfUkFURSArIChhcmcgLyAyKSkgLyBhcmc7CisJCWFyZyA9IChDTE9DS19USUNLX1JBVEUgKyAoZm9vIC8gMikpIC8gZm9vOworCX0KKworCXBjbV9zcGVlZCA9IGFyZzsKKworCXRtcCA9IHBhc19yZWFkKDB4MEI4QSk7CisKKwkvKgorCSAqIFNldCBhbnRpLWFsaWFzaW5nIGZpbHRlcnMgYWNjb3JkaW5nIHRvIHNhbXBsZSByYXRlLiBZb3UgcmVhbGx5ICpORUVEKgorCSAqIHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUgZm9yIGFsbCBub3JtYWwgcmVjb3JkaW5nIHVubGVzcyB5b3Ugd2FudCB0bworCSAqIGV4cGVyaW1lbnQgd2l0aCBhbGlhc2luZyBlZmZlY3RzLgorCSAqIFRoZXNlIGZpbHRlcnMgYXBwbHkgdG8gdGhlIHNlbGVjdGVkICJyZWNvcmRpbmciIHNvdXJjZS4KKwkgKiBJIChwZncpIGRvbid0IGtub3cgdGhlIGVuY29kaW5nIG9mIHRoZXNlIDUgYml0cy4gVGhlIHZhbHVlcyBzaG93bgorCSAqIGNvbWUgZnJvbSB0aGUgU0RLIGZvdW5kIG9uIGZ0cC51d3AuZWR1Oi9wdWIvbXNkb3MvcHJvYXVkaW8vLgorCSAqCisJICogSSBjbGVhcmVkIGJpdCA1IG9mIHRoZXNlIHZhbHVlcywgc2luY2UgdGhhdCBiaXQgY29udHJvbHMgdGhlIG1hc3RlcgorCSAqIG11dGUgZmxhZy4gKE9sYXYgV/ZsZmVsc2NobmVpZGVyKQorCSAqCisJICovCisjaWYgIWRlZmluZWQgTk9fQVVUT19GSUxURVJfU0VUCisJdG1wICY9IDB4ZTA7CisJaWYgKHBjbV9zcGVlZCA+PSAyICogMTc4OTcpCisJCXRtcCB8PSAweDAxOworCWVsc2UgaWYgKHBjbV9zcGVlZCA+PSAyICogMTU5MDkpCisJCXRtcCB8PSAweDAyOworCWVsc2UgaWYgKHBjbV9zcGVlZCA+PSAyICogMTE5MzEpCisJCXRtcCB8PSAweDA5OworCWVsc2UgaWYgKHBjbV9zcGVlZCA+PSAyICogODk0OCkKKwkJdG1wIHw9IDB4MTE7CisJZWxzZSBpZiAocGNtX3NwZWVkID49IDIgKiA1OTY1KQorCQl0bXAgfD0gMHgxOTsKKwllbHNlIGlmIChwY21fc3BlZWQgPj0gMiAqIDI5ODIpCisJCXRtcCB8PSAweDA0OworCXBjbV9maWx0ZXIgPSB0bXA7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYXNfbG9jaywgZmxhZ3MpOworCisJcGFzX3dyaXRlKHRtcCAmIH4oMHg0MCB8IDB4ODApLCAweDBCOEEpOworCXBhc193cml0ZSgweDAwIHwgMHgzMCB8IDB4MDQsIDB4MTM4Qik7CisJcGFzX3dyaXRlKGZvbyAmIDB4ZmYsIDB4MTM4OCk7CisJcGFzX3dyaXRlKChmb28gPj4gOCkgJiAweGZmLCAweDEzODgpOworCXBhc193cml0ZSh0bXAsIDB4MEI4QSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHBjbV9zcGVlZDsKK30KKworc3RhdGljIGludCBwY21fc2V0X2NoYW5uZWxzKGludCBhcmcpCit7CisKKwlpZiAoKGFyZyAhPSAxKSAmJiAoYXJnICE9IDIpKQorCQlyZXR1cm4gcGNtX2NoYW5uZWxzOworCisJaWYgKGFyZyAhPSBwY21fY2hhbm5lbHMpCisJeworCQlwYXNfd3JpdGUocGFzX3JlYWQoMHhGOEEpIF4gMHgyMCwgMHhGOEEpOworCisJCXBjbV9jaGFubmVscyA9IGFyZzsKKwkJcGNtX3NldF9zcGVlZChwY21fc3BlZWQpOwkvKiBUaGUgc3BlZWQgbXVzdCBiZSByZWluaXRpYWxpemVkICovCisJfQorCXJldHVybiBwY21fY2hhbm5lbHM7Cit9CisKK3N0YXRpYyBpbnQgcGNtX3NldF9iaXRzKGludCBhcmcpCit7CisJaWYgKGFyZyA9PSAwKQorCQlyZXR1cm4gcGNtX2JpdHM7CisKKwlpZiAoKGFyZyAmIHBjbV9iaXRzb2spICE9IGFyZykKKwkJcmV0dXJuIHBjbV9iaXRzOworCisJaWYgKGFyZyAhPSBwY21fYml0cykKKwl7CisJCXBhc193cml0ZShwYXNfcmVhZCgweDgzODkpIF4gMHgwNCwgMHg4Mzg5KTsKKworCQlwY21fYml0cyA9IGFyZzsKKwl9CisJcmV0dXJuIHBjbV9iaXRzOworfQorCitzdGF0aWMgaW50IHBhc19hdWRpb19pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWludCB2YWwsIHJldDsKKwlpbnQgX191c2VyICpwID0gYXJnOworCisJREVCKHByaW50aygicGFzMl9wY20uYzogc3RhdGljIGludCBwYXNfYXVkaW9faW9jdGwodW5zaWduZWQgaW50IGNtZCA9ICVYLCB1bnNpZ25lZCBpbnQgYXJnID0gJVgpXG4iLCBjbWQsIGFyZykpOworCisJc3dpdGNoIChjbWQpIAorCXsKKwljYXNlIFNPVU5EX1BDTV9XUklURV9SQVRFOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0ID0gcGNtX3NldF9zcGVlZCh2YWwpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJcmV0ID0gcGNtX3NwZWVkOworCQlicmVhazsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpIAorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldCA9IHBjbV9zZXRfY2hhbm5lbHModmFsICsgMSkgLSAxOworCQlicmVhazsKKworCWNhc2UgU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0ID0gcGNtX3NldF9jaGFubmVscyh2YWwpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldCA9IHBjbV9jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXQgPSBwY21fc2V0X2JpdHModmFsKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0ID0gcGNtX2JpdHM7CisJCWJyZWFrOworICAKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHB1dF91c2VyKHJldCwgcCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhc19hdWRpb19yZXNldChpbnQgZGV2KQoreworCURFQihwcmludGsoInBhczJfcGNtLmM6IHN0YXRpYyB2b2lkIHBhc19hdWRpb19yZXNldCh2b2lkKVxuIikpOworCisJcGFzX3dyaXRlKHBhc19yZWFkKDB4RjhBKSAmIH4weDQwLCAweEY4QSk7CS8qIERpc2FibGUgUENNICovCit9CisKK3N0YXRpYyBpbnQgcGFzX2F1ZGlvX29wZW4oaW50IGRldiwgaW50IG1vZGUpCit7CisJaW50ICAgICAgICAgICAgIGVycjsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlERUIocHJpbnRrKCJwYXMyX3BjbS5jOiBzdGF0aWMgaW50IHBhc19hdWRpb19vcGVuKGludCBtb2RlID0gJVgpXG4iLCBtb2RlKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGFzX2xvY2ssIGZsYWdzKTsKKwlpZiAocGNtX2J1c3kpCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXNfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlwY21fYnVzeSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFzX2xvY2ssIGZsYWdzKTsKKworCWlmICgoZXJyID0gcGFzX3NldF9pbnRyKFBBU19QQ01fSU5UUkJJVFMpKSA8IDApCisJCXJldHVybiBlcnI7CisKKworCXBjbV9jb3VudCA9IDA7CisJb3Blbl9tb2RlID0gbW9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYXNfYXVkaW9fY2xvc2UoaW50IGRldikKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlERUIocHJpbnRrKCJwYXMyX3BjbS5jOiBzdGF0aWMgdm9pZCBwYXNfYXVkaW9fY2xvc2Uodm9pZClcbiIpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYXNfbG9jaywgZmxhZ3MpOworCisJcGFzX2F1ZGlvX3Jlc2V0KGRldik7CisJcGFzX3JlbW92ZV9pbnRyKFBBU19QQ01fSU5UUkJJVFMpOworCXBjbV9tb2RlID0gUENNX05PTjsKKworCXBjbV9idXN5ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwYXNfYXVkaW9fb3V0cHV0X2Jsb2NrKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgY291bnQsCisJCSAgICAgICBpbnQgaW50cmZsYWcpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzLCBjbnQ7CisKKwlERUIocHJpbnRrKCJwYXMyX3BjbS5jOiBzdGF0aWMgdm9pZCBwYXNfYXVkaW9fb3V0cHV0X2Jsb2NrKGNoYXIgKmJ1ZiA9ICVQLCBpbnQgY291bnQgPSAlWClcbiIsIGJ1ZiwgY291bnQpKTsKKworCWNudCA9IGNvdW50OworCWlmIChhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPiAzKQorCQljbnQgPj49IDE7CisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9BVVRPTU9ERSAmJgorCSAgICBpbnRyZmxhZyAmJgorCSAgICBjbnQgPT0gcGNtX2NvdW50KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGFzX2xvY2ssIGZsYWdzKTsKKworCXBhc193cml0ZShwYXNfcmVhZCgweEY4QSkgJiB+MHg0MCwKKwkJICAweEY4QSk7CisKKwkvKiBETUFidWZfc3RhcnRfZG1hIChkZXYsIGJ1ZiwgY291bnQsIERNQV9NT0RFX1dSSVRFKTsgKi8KKworCWlmIChhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPiAzKQorCQljb3VudCA+Pj0gMTsKKworCWlmIChjb3VudCAhPSBwY21fY291bnQpCisJeworCQlwYXNfd3JpdGUocGFzX3JlYWQoMHgwQjhBKSAmIH4weDgwLCAweDBCOEEpOworCQlwYXNfd3JpdGUoMHg0MCB8IDB4MzAgfCAweDA0LCAweDEzOEIpOworCQlwYXNfd3JpdGUoY291bnQgJiAweGZmLCAweDEzODkpOworCQlwYXNfd3JpdGUoKGNvdW50ID4+IDgpICYgMHhmZiwgMHgxMzg5KTsKKwkJcGFzX3dyaXRlKHBhc19yZWFkKDB4MEI4QSkgfCAweDgwLCAweDBCOEEpOworCisJCXBjbV9jb3VudCA9IGNvdW50OworCX0KKwlwYXNfd3JpdGUocGFzX3JlYWQoMHgwQjhBKSB8IDB4ODAgfCAweDQwLCAweDBCOEEpOworI2lmZGVmIE5PX1RSSUdHRVIKKwlwYXNfd3JpdGUocGFzX3JlYWQoMHhGOEEpIHwgMHg0MCB8IDB4MTAsIDB4RjhBKTsKKyNlbmRpZgorCisJcGNtX21vZGUgPSBQQ01fREFDOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcGFzX2F1ZGlvX3N0YXJ0X2lucHV0KGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgY291bnQsCisJCSAgICAgIGludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgIGNudDsKKworCURFQihwcmludGsoInBhczJfcGNtLmM6IHN0YXRpYyB2b2lkIHBhc19hdWRpb19zdGFydF9pbnB1dChjaGFyICpidWYgPSAlUCwgaW50IGNvdW50ID0gJVgpXG4iLCBidWYsIGNvdW50KSk7CisKKwljbnQgPSBjb3VudDsKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID4gMykKKwkJY250ID4+PSAxOworCisJaWYgKGF1ZGlvX2RldnNbcGFzX2F1ZGlvZGV2XS0+ZmxhZ3MgJiBETUFfQVVUT01PREUgJiYKKwkgICAgaW50cmZsYWcgJiYKKwkgICAgY250ID09IHBjbV9jb3VudCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBhc19sb2NrLCBmbGFncyk7CisKKwkvKiBETUFidWZfc3RhcnRfZG1hIChkZXYsIGJ1ZiwgY291bnQsIERNQV9NT0RFX1JFQUQpOyAqLworCisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA+IDMpCisJCWNvdW50ID4+PSAxOworCisJaWYgKGNvdW50ICE9IHBjbV9jb3VudCkKKwl7CisJCXBhc193cml0ZShwYXNfcmVhZCgweDBCOEEpICYgfjB4ODAsIDB4MEI4QSk7CisJCXBhc193cml0ZSgweDQwIHwgMHgzMCB8IDB4MDQsIDB4MTM4Qik7CisJCXBhc193cml0ZShjb3VudCAmIDB4ZmYsIDB4MTM4OSk7CisJCXBhc193cml0ZSgoY291bnQgPj4gOCkgJiAweGZmLCAweDEzODkpOworCQlwYXNfd3JpdGUocGFzX3JlYWQoMHgwQjhBKSB8IDB4ODAsIDB4MEI4QSk7CisKKwkJcGNtX2NvdW50ID0gY291bnQ7CisJfQorCXBhc193cml0ZShwYXNfcmVhZCgweDBCOEEpIHwgMHg4MCB8IDB4NDAsIDB4MEI4QSk7CisjaWZkZWYgTk9fVFJJR0dFUgorCXBhc193cml0ZSgocGFzX3JlYWQoMHhGOEEpIHwgMHg0MCkgJiB+MHgxMCwgMHhGOEEpOworI2VuZGlmCisKKwlwY21fbW9kZSA9IFBDTV9BREM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXNfbG9jaywgZmxhZ3MpOworfQorCisjaWZuZGVmIE5PX1RSSUdHRVIKK3N0YXRpYyB2b2lkIHBhc19hdWRpb190cmlnZ2VyKGludCBkZXYsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGFzX2xvY2ssIGZsYWdzKTsKKwlzdGF0ZSAmPSBvcGVuX21vZGU7CisKKwlpZiAoc3RhdGUgJiBQQ01fRU5BQkxFX09VVFBVVCkKKwkJcGFzX3dyaXRlKHBhc19yZWFkKDB4RjhBKSB8IDB4NDAgfCAweDEwLCAweEY4QSk7CisJZWxzZSBpZiAoc3RhdGUgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQlwYXNfd3JpdGUoKHBhc19yZWFkKDB4RjhBKSB8IDB4NDApICYgfjB4MTAsIDB4RjhBKTsKKwllbHNlCisJCXBhc193cml0ZShwYXNfcmVhZCgweEY4QSkgJiB+MHg0MCwgMHhGOEEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFzX2xvY2ssIGZsYWdzKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHBhc19hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJcGFzX2F1ZGlvX3Jlc2V0KGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFzX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJcGFzX2F1ZGlvX3Jlc2V0KGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIHBhc19hdWRpb19kcml2ZXIgPQoreworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCQk9IHBhc19hdWRpb19vcGVuLAorCS5jbG9zZQkJCT0gcGFzX2F1ZGlvX2Nsb3NlLAorCS5vdXRwdXRfYmxvY2sJCT0gcGFzX2F1ZGlvX291dHB1dF9ibG9jaywKKwkuc3RhcnRfaW5wdXQJCT0gcGFzX2F1ZGlvX3N0YXJ0X2lucHV0LAorCS5pb2N0bAkJCT0gcGFzX2F1ZGlvX2lvY3RsLAorCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IHBhc19hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dCwKKwkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gcGFzX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dCwKKwkuaGFsdF9pbwkJPSBwYXNfYXVkaW9fcmVzZXQsCisJLnRyaWdnZXIJCT0gcGFzX2F1ZGlvX3RyaWdnZXIKK307CisKK3ZvaWQgX19pbml0IHBhc19wY21faW5pdChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJREVCKHByaW50aygicGFzMl9wY20uYzogbG9uZyBwYXNfcGNtX2luaXQoKVxuIikpOworCisJcGNtX2JpdHNvayA9IDg7CisJaWYgKHBhc19yZWFkKDB4RUY4QikgJiAweDA4KQorCQlwY21fYml0c29rIHw9IDE2OworCisJcGNtX3NldF9zcGVlZChEU1BfREVGQVVMVF9TUEVFRCk7CisKKwlpZiAoKHBhc19hdWRpb2RldiA9IHNvdW5kX2luc3RhbGxfYXVkaW9kcnYoQVVESU9fRFJJVkVSX1ZFUlNJT04sCisJCQkJCSJQcm8gQXVkaW8gU3BlY3RydW0iLAorCQkJCQkmcGFzX2F1ZGlvX2RyaXZlciwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19kcml2ZXIpLAorCQkJCQlETUFfQVVUT01PREUsCisJCQkJCUFGTVRfVTggfCBBRk1UX1MxNl9MRSwKKwkJCQkJTlVMTCwKKwkJCQkJaHdfY29uZmlnLT5kbWEsCisJCQkJCWh3X2NvbmZpZy0+ZG1hKSkgPCAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQVMxNjogVG9vIG1hbnkgUENNIGRldmljZXMgYXZhaWxhYmxlXG4iKTsKK30KKwordm9pZCBwYXNfcGNtX2ludGVycnVwdCh1bnNpZ25lZCBjaGFyIHN0YXR1cywgaW50IGNhdXNlKQoreworCWlmIChjYXVzZSA9PSAxKQorCXsKKwkJLyoKKwkJICogSGFsdCB0aGUgUENNIGZpcnN0LiBPdGhlcndpc2Ugd2UgZG9uJ3QgaGF2ZSB0aW1lIHRvIHN0YXJ0IGEgbmV3CisJCSAqIGJsb2NrIGJlZm9yZSB0aGUgUENNIGNoaXAgcHJvY2VlZHMgdG8gdGhlIG5leHQgc2FtcGxlCisJCSAqLworCisJCWlmICghKGF1ZGlvX2RldnNbcGFzX2F1ZGlvZGV2XS0+ZmxhZ3MgJiBETUFfQVVUT01PREUpKQorCQkJcGFzX3dyaXRlKHBhc19yZWFkKDB4RjhBKSAmIH4weDQwLCAweEY4QSk7CisKKwkJc3dpdGNoIChwY21fbW9kZSkKKwkJeworCQkJY2FzZSBQQ01fREFDOgorCQkJCURNQWJ1Zl9vdXRwdXRpbnRyKHBhc19hdWRpb2RldiwgMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUENNX0FEQzoKKwkJCQlETUFidWZfaW5wdXRpbnRyKHBhc19hdWRpb2Rldik7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUEFTOiBVbmV4cGVjdGVkIFBDTSBpbnRlcnJ1cHRcbiIpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3Bzcy5jIGIvc291bmQvb3NzL3Bzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDM4NzYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvcHNzLmMKQEAgLTAsMCArMSwxMjgzIEBACisvKgorICogc291bmQvcHNzLmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgdGhlIFBlcnNvbmFsIFNvdW5kIFN5c3RlbSAoRUNITyBFU0M2MTQpLgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKgorICogVGhvbWFzIFNhaWxlcglpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKiBBbGFuIENveAkJbW9kdWxhcmlzYXRpb24sIGNsZWFuIHVwLgorICoKKyAqIDk4LTAyLTIxOiBWbGFkaW1pciBNaWNobCA8dmxhZGltaXIubWljaGxAdXBvbC5jej4KKyAqICAgICAgICAgIEFkZGVkIG1peGVyIGRldmljZSBmb3IgQmVldGhvdmVuIEFEU1AtMTYgKG1hc3RlciB2b2x1bWUsCisgKgkgICAgYmFzcywgdHJlYmxlLCBzeW50aCksIG9ubHkgZm9yIHNwZWFrZXJzLgorICogICAgICAgICAgRml4ZWQgYnVnIGluIHBzc193cml0ZSAoZXhjaGFuZ2UgcGFyYW1ldGVycykKKyAqICAgICAgICAgIEZpeGVkIGNvbmZpZyBwb3J0IG9mIFNCCisgKiAgICAgICAgICBSZXF1ZXN0ZWQgdHdvIHJlZ2lvbnMgZm9yIFBTUyAoUFNTIG1peGVyLCBQU1MgY29uZmlnKQorICogICAgICAgICAgTW9kaWZpZWQgcHNzX2Rvd25sb2FkX2Jvb3QKKyAqICAgICAgICAgIFRvIHByb2JlX3Bzc19tc3MgYWRkZWQgdGVzdCBmb3IgaW5pdGlhbGl6ZSBBRDE4NDgKKyAqIDk4LTA1LTI4OiBWbGFkaW1pciBNaWNobCA8dmxhZGltaXIubWljaGxAdXBvbC5jej4KKyAqICAgICAgICAgIEZpeGVkIGNvbXB1dGF0aW9uIG9mIG1peGVyIHZvbHVtZXMKKyAqIDA0LTA1LTE5OTk6IEFudGhvbnkgQmFyYmFjaGFuIDxiYXJiY29kZUB4bWVuLmNpcy5mb3JkaGFtLmVkdT4KKyAqICAgICAgICAgIEFkZGVkIGNvZGUgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gZW5hYmxlIGhpcyBjZHJvbSBhbmQvb3IgCisgKiAgICAgICAgICBqb3lzdGljayB0aHJvdWdoIHRoZSBtb2R1bGUgcGFyYW1ldGVycyBwc3NfY2Ryb21fcG9ydCBhbmQgCisgKiAgICAgICAgICBwc3NfZW5hYmxlX2pveXN0aWNrLiAgcHNzX2Nkcm9tX3BvcnQgdGFrZXMgYSBwb3J0IGFkZHJlc3MgYXMgaXRzCisgKiAgICAgICAgICBhcmd1bWVudC4gIHBzc19lbmFibGVfam95c3RpY2sgdGFrZXMgZWl0aGVyIGEgMCBvciBhIG5vbi0wIGFzIGl0cworICogICAgICAgICAgYXJndW1lbnQuCisgKiAwNC0wNi0xOTk5OiBBbnRob255IEJhcmJhY2hhbiA8YmFyYmNvZGVAeG1lbi5jaXMuZm9yZGhhbS5lZHU+CisgKiAgICAgICAgICBTZXBhcmF0ZWQgc29tZSBjb2RlIGludG8gbmV3IGZ1bmN0aW9ucyBmb3IgZWFzaWVyIHJldXNlLiAgCisgKiAgICAgICAgICBDbGVhbmVkIHVwIGFuZCBzdHJlYW1saW5lZCBuZXcgY29kZS4gIEFkZGVkIGNvZGUgdG8gYWxsb3cgYSB1c2VyIAorICogICAgICAgICAgdG8gb25seSB1c2UgdGhpcyBkcml2ZXIgZm9yIGVuYWJsaW5nIG5vbi1zb3VuZCBjb21wb25lbnRzIAorICogICAgICAgICAgdGhyb3VnaCB0aGUgbmV3IG1vZHVsZSBwYXJhbWV0ZXIgcHNzX25vX3NvdW5kIChmbGFnKS4gIEFkZGVkIAorICogICAgICAgICAgY29kZSB0aGF0IHdvdWxkIGFsbG93IGEgdXNlciB0byBkZWNpZGUgd2hldGhlciB0aGUgZHJpdmVyIHNob3VsZCAKKyAqICAgICAgICAgIHJlc2V0IHRoZSBjb25maWd1cmVkIGhhcmR3YXJlIHNldHRpbmdzIGZvciB0aGUgUFNTIGJvYXJkIHRocm91Z2ggCisgKiAgICAgICAgICB0aGUgbW9kdWxlIHBhcmFtZXRlciBwc3Nfa2VlcF9zZXR0aW5ncyAoZmxhZykuICAgVGhpcyBmbGFnIHdpbGwgCisgKiAgICAgICAgICBhbGxvdyBhIHVzZXIgdG8gZnJlZSB1cCByZXNvdXJjZXMgaW4gdXNlIGJ5IHRoaXMgY2FyZCBpZiBuZWVkYmUsIAorICogICAgICAgICAgZnVydGhlcm1vcmUgaXQgYWxsb3dzIGhpbSB0byB1c2UgdGhpcyBkcml2ZXIgdG8ganVzdCBlbmFibGUgdGhlIAorICogICAgICAgICAgZW11bGF0aW9ucyBhbmQgdGhlbiBiZSB1bmxvYWRlZCBhcyBpdCBpcyBubyBsb25nZXIgbmVlZGVkLiAgQm90aCAKKyAqICAgICAgICAgIG5ldyBzZXR0aW5ncyBhcmUgb25seSBhdmFpbGFibGUgdG8gdGhpcyBkcml2ZXIgaWYgY29tcGlsZWQgYXMgYSAKKyAqICAgICAgICAgIG1vZHVsZS4gIFRoZSBkZWZhdWx0IHNldHRpbmdzIG9mIGFsbCBuZXcgcGFyYW1ldGVycyBhcmUgc2V0IHRvIAorICogICAgICAgICAgbG9hZCB0aGUgZHJpdmVyIGFzIGl0IGRpZCBpbiBwcmV2aW91cyB2ZXJzaW9ucy4KKyAqIDA0LTA3LTE5OTk6IEFudGhvbnkgQmFyYmFjaGFuIDxiYXJiY29kZUB4bWVuLmNpcy5mb3JkaGFtLmVkdT4KKyAqICAgICAgICAgIEFkZGVkIG1vZHVsZSBwYXJhbWV0ZXIgcHNzX2Zpcm13YXJlIHRvIGFsbG93IHRoZSB1c2VyIHRvIHRlbGwgCisgKiAgICAgICAgICB0aGUgZHJpdmVyIHdoZXJlIHRoZSBmaXJld2FyZSBmaWxlIGlzIGxvY2F0ZWQuICBUaGUgZGVmYXVsdCAKKyAqICAgICAgICAgIHNldHRpbmcgaXMgdGhlIHByZXZpb3VzIGhhcmRjb2RlZCBzZXR0aW5nICIvZXRjL3NvdW5kL3Bzc19zeW50aCIuCisgKiAwMC0wMy0wMzogQ2hyaXN0b3BoIEhlbGx3aWcgPGNoaGVsbHdpZ0BpbmZyYWRlYWQub3JnPgorICoJICAgIEFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQKKyAqIDExLTEwLTIwMDA6IEJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGJrekBsaW51eC1pZGUub3JnPgorICoJICAgIEFkZGVkIF9faW5pdCB0byBwcm9iZV9wc3MoKSwgYXR0YWNoX3BzcygpIGFuZCBwcm9iZV9wc3NfbXB1KCkKKyAqIDAyLUphbi0yMDAxOiBDaHJpcyBSYW5raW4KKyAqICAgICAgICAgIFNwZWNpZnkgdGhhdCB0aGlzIG1vZHVsZSBvd25zIHRoZSBjb3Byb2Nlc3NvcgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAic291bmRfZmlybXdhcmUuaCIKKworI2luY2x1ZGUgImFkMTg0OC5oIgorI2luY2x1ZGUgIm1wdTQwMS5oIgorCisvKgorICogUFNTIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBSRUcoeCkJKGRldmMtPmJhc2UreCkKKyNkZWZpbmUJUFNTX0RBVEEJMAorI2RlZmluZQlQU1NfU1RBVFVTCTIKKyNkZWZpbmUgUFNTX0NPTlRST0wJMgorI2RlZmluZQlQU1NfSUQJCTQKKyNkZWZpbmUJUFNTX0lSUUFDSwk0CisjZGVmaW5lCVBTU19QSU8JCTB4MWEKKworLyoKKyAqIENvbmZpZyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBDT05GX1BTUwkweDEwCisjZGVmaW5lIENPTkZfV1NTCTB4MTIKKyNkZWZpbmUgQ09ORl9TQgkJMHgxNAorI2RlZmluZSBDT05GX0NEUk9NCTB4MTYKKyNkZWZpbmUgQ09ORl9NSURJCTB4MTgKKworLyoKKyAqIFN0YXR1cyBiaXRzLgorICovCisjZGVmaW5lIFBTU19GTEFHMyAgICAgMHgwODAwCisjZGVmaW5lIFBTU19GTEFHMiAgICAgMHgwNDAwCisjZGVmaW5lIFBTU19GTEFHMSAgICAgMHgxMDAwCisjZGVmaW5lIFBTU19GTEFHMCAgICAgMHgwODAwCisjZGVmaW5lIFBTU19XUklURV9FTVBUWSAgMHg4MDAwCisjZGVmaW5lIFBTU19SRUFEX0ZVTEwgICAgMHg0MDAwCisKKy8qCisgKiBXU1MgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgV1NTX0lOREVYIDQKKyNkZWZpbmUgV1NTX0RBVEEgNQorCisvKgorICogV1NTIHN0YXR1cyBiaXRzCisgKi8KKyNkZWZpbmUgV1NTX0lOSVRJQUxJWklORyAweDgwCisjZGVmaW5lIFdTU19BVVRPQ0FMSUJSQVRJT04gMHgyMAorCisjZGVmaW5lIE5PX1dTU19NSVhFUgktMQorCisjaW5jbHVkZSAiY29wcm9jLmgiCisKKyNpbmNsdWRlICJwc3NfYm9vdC5oIgorCisvKiBJZiBjb21waWxlZCBpbnRvIGtlcm5lbCwgaXQgZW5hYmxlIG9yIGRpc2FibGUgcHNzIG1peGVyICovCisjaWZkZWYgQ09ORklHX1BTU19NSVhFUgorc3RhdGljIGludCBwc3NfbWl4ZXIgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgcHNzX21peGVyOworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgcHNzX21peGVyZGF0YSB7CisJdW5zaWduZWQgaW50IHZvbHVtZV9sOworCXVuc2lnbmVkIGludCB2b2x1bWVfcjsKKwl1bnNpZ25lZCBpbnQgYmFzczsKKwl1bnNpZ25lZCBpbnQgdHJlYmxlOworCXVuc2lnbmVkIGludCBzeW50aDsKK30gcHNzX21peGVyZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgcHNzX2NvbmZkYXRhIHsKKwlpbnQgICAgICAgICAgICAgYmFzZTsKKwlpbnQgICAgICAgICAgICAgaXJxOworCWludCAgICAgICAgICAgICBkbWE7CisJaW50ICAgICAgICAgICAgKm9zcDsKKwlwc3NfbWl4ZXJkYXRhICAgbWl4ZXI7CisJaW50ICAgICAgICAgICAgIGFkX21peGVyX2RldjsKK30gcHNzX2NvbmZkYXRhOworICAKK3N0YXRpYyBwc3NfY29uZmRhdGEgcHNzX2RhdGE7CitzdGF0aWMgcHNzX2NvbmZkYXRhICpkZXZjID0gJnBzc19kYXRhOworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworc3RhdGljIGludCAgICAgIHBzc19pbml0aWFsaXplZDsKK3N0YXRpYyBpbnQgICAgICBub25zdGFuZGFyZF9taWNyb2NvZGU7CitzdGF0aWMgaW50CXBzc19jZHJvbV9wb3J0ID0gLTE7CS8qIFBhcmFtZXRlciBmb3IgdGhlIFBTUyBjZHJvbSBwb3J0ICovCitzdGF0aWMgaW50CXBzc19lbmFibGVfam95c3RpY2s7ICAgIC8qIFBhcmFtZXRlciBmb3IgZW5hYmxpbmcgdGhlIGpveXN0aWNrICovCitzdGF0aWMgY29wcm9jX29wZXJhdGlvbnMgcHNzX2NvcHJvY19vcGVyYXRpb25zOworCitzdGF0aWMgdm9pZCBwc3Nfd3JpdGUocHNzX2NvbmZkYXRhICpkZXZjLCBpbnQgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGksIGxpbWl0OworCisJbGltaXQgPSBqaWZmaWVzICsgSFovMTA7CS8qIFRoZSB0aW1lb3V0IGlzIDAuMSBzZWNvbmRzICovCisJLyoKKwkgKiBOb3RlISB0aGUgaTw1MDAwMDAwIGlzIGFuIGVtZXJnZW5jeSBleGl0LiBUaGUgZHNwX2NvbW1hbmQoKSBpcyBzb21ldGltZXMKKwkgKiBjYWxsZWQgd2hpbGUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGltZXIgaXMKKwkgKiBkaXNhYmxlZCBhbHNvLiBIb3dldmVyIHRoZSB0aW1lb3V0IHNpdHVhdGlvbiBpcyBhIGFibm9ybWFsIGNvbmRpdGlvbi4KKwkgKiBOb3JtYWxseSB0aGUgRFNQIHNob3VsZCBiZSByZWFkeSB0byBhY2NlcHQgY29tbWFuZHMgYWZ0ZXIganVzdCBjb3VwbGUgb2YKKwkgKiBsb29wcy4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCA1MDAwMDAwICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIGxpbWl0KTsgaSsrKQorIAl7CisgCQlpZiAoaW53KFJFRyhQU1NfU1RBVFVTKSkgJiBQU1NfV1JJVEVfRU1QVFkpCisgCQl7CisgCQkJb3V0dyhkYXRhLCBSRUcoUFNTX0RBVEEpKTsKKyAJCQlyZXR1cm47CisgCQl9CisgCX0KKyAJcHJpbnRrKEtFUk5fV0FSTklORyAiUFNTOiBEU1AgQ29tbWFuZCAoJTA0eCkgVGltZW91dC5cbiIsIGRhdGEpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV9wc3Moc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIHNob3J0IGlkOworCWludCBpcnEsIGRtYTsKKworCWRldmMtPmJhc2UgPSBod19jb25maWctPmlvX2Jhc2U7CisJaXJxID0gZGV2Yy0+aXJxID0gaHdfY29uZmlnLT5pcnE7CisJZG1hID0gZGV2Yy0+ZG1hID0gaHdfY29uZmlnLT5kbWE7CisJZGV2Yy0+b3NwID0gaHdfY29uZmlnLT5vc3A7CisKKwlpZiAoZGV2Yy0+YmFzZSAhPSAweDIyMCAmJiBkZXZjLT5iYXNlICE9IDB4MjQwKQorCQlpZiAoZGV2Yy0+YmFzZSAhPSAweDIzMCAmJiBkZXZjLT5iYXNlICE9IDB4MjUwKQkJLyogU29tZSBjYXJkcyB1c2UgdGhlc2UgKi8KKwkJCXJldHVybiAwOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXZjLT5iYXNlLCAweDEwLCAiUFNTIG1peGVyLCBTQiBlbXVsYXRpb24iKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlBTUzogSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWQgPSBpbncoUkVHKFBTU19JRCkpOworCWlmICgoaWQgPj4gOCkgIT0gJ0UnKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gUFNTIHNpZ25hdHVyZSBkZXRlY3RlZCBhdCAweCV4ICgweCV4KVxuIiwgIGRldmMtPmJhc2UsICBpZCk7IAorCQlyZWxlYXNlX3JlZ2lvbihkZXZjLT5iYXNlLCAweDEwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oZGV2Yy0+YmFzZSArIDB4MTAsIDB4OSwgIlBTUyBjb25maWciKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlBTUzogSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlyZWxlYXNlX3JlZ2lvbihkZXZjLT5iYXNlLCAweDEwKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNldF9pcnEocHNzX2NvbmZkYXRhICogZGV2YywgaW50IGRldiwgaW50IGlycSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgaXJxX2JpdHNbMTZdID0KKwl7CisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwOCwKKwkJMHgwMDAwLCAweDAwMTAsIDB4MDAwMCwgMHgwMDE4LAorCQkweDAwMDAsIDB4MDAyMCwgMHgwMDI4LCAweDAwMzAsCisJCTB4MDAzOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMAorCX07CisKKwl1bnNpZ25lZCBzaG9ydCAgdG1wLCBiaXRzOworCisJaWYgKGlycSA8IDAgfHwgaXJxID4gMTUpCisJCXJldHVybiAwOworCisJdG1wID0gaW53KFJFRyhkZXYpKSAmIH4weDM4OwkvKiBMb2FkIGNvbmZyZWcsIG1hc2sgSVJRIGJpdHMgb3V0ICovCisKKwlpZiAoKGJpdHMgPSBpcnFfYml0c1tpcnFdKSA9PSAwICYmIGlycSAhPSAwKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IEludmFsaWQgSVJRICVkXG4iLCBpcnEpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0dyh0bXAgfCBiaXRzLCBSRUcoZGV2KSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2lvX2Jhc2UocHNzX2NvbmZkYXRhICogZGV2YywgaW50IGRldiwgaW50IGJhc2UpCit7CisJdW5zaWduZWQgc2hvcnQgIHRtcCA9IGludyhSRUcoZGV2KSkgJiAweDAwM2Y7CisJdW5zaWduZWQgc2hvcnQgIGJpdHMgPSAoYmFzZSAmIDB4MGZmYykgPDwgNDsKKworCW91dHcoYml0cyB8IHRtcCwgUkVHKGRldikpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2RtYShwc3NfY29uZmRhdGEgKiBkZXZjLCBpbnQgZGV2LCBpbnQgZG1hKQoreworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBkbWFfYml0c1s4XSA9CisJeworCQkweDAwMDEsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDMsCisJCTB4MDAwMCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNworCX07CisKKwl1bnNpZ25lZCBzaG9ydCAgdG1wLCBiaXRzOworCisJaWYgKGRtYSA8IDAgfHwgZG1hID4gNykKKwkJcmV0dXJuIDA7CisKKwl0bXAgPSBpbncoUkVHKGRldikpICYgfjB4MDc7CS8qIExvYWQgY29uZnJlZywgbWFzayBETUEgYml0cyBvdXQgKi8KKworCWlmICgoYml0cyA9IGRtYV9iaXRzW2RtYV0pID09IDAgJiYgZG1hICE9IDQpCisJeworCQkgIHByaW50ayhLRVJOX0VSUiAiUFNTOiBJbnZhbGlkIERNQSAlZFxuIiwgZG1hKTsKKwkJICByZXR1cm4gMDsKKwl9CisJb3V0dyh0bXAgfCBiaXRzLCBSRUcoZGV2KSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcHNzX3Jlc2V0X2RzcChwc3NfY29uZmRhdGEgKiBkZXZjKQoreworCXVuc2lnbmVkIGxvbmcgICBpLCBsaW1pdCA9IGppZmZpZXMgKyBIWi8xMDsKKworCW91dHcoMHgyMDAwLCBSRUcoUFNTX0NPTlRST0wpKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI3NjggJiYgKGxpbWl0LWppZmZpZXMgPj0gMCk7IGkrKykKKwkJaW53KFJFRyhQU1NfQ09OVFJPTCkpOworCW91dHcoMHgwMDAwLCBSRUcoUFNTX0NPTlRST0wpKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwc3NfcHV0X2RzcHdvcmQocHNzX2NvbmZkYXRhICogZGV2YywgdW5zaWduZWQgc2hvcnQgd29yZCkKK3sKKwlpbnQgaSwgdmFsOworCisJZm9yIChpID0gMDsgaSA8IDMyNzY4MDsgaSsrKQorCXsKKwkJdmFsID0gaW53KFJFRyhQU1NfU1RBVFVTKSk7CisJCWlmICh2YWwgJiBQU1NfV1JJVEVfRU1QVFkpCisJCXsKKwkJCW91dHcod29yZCwgUkVHKFBTU19EQVRBKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwc3NfZ2V0X2RzcHdvcmQocHNzX2NvbmZkYXRhICogZGV2YywgdW5zaWduZWQgc2hvcnQgKndvcmQpCit7CisJaW50IGksIHZhbDsKKworCWZvciAoaSA9IDA7IGkgPCAzMjc2ODA7IGkrKykKKwl7CisJCXZhbCA9IGludyhSRUcoUFNTX1NUQVRVUykpOworCQlpZiAodmFsICYgUFNTX1JFQURfRlVMTCkKKwkJeworCQkJKndvcmQgPSBpbncoUkVHKFBTU19EQVRBKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwc3NfZG93bmxvYWRfYm9vdChwc3NfY29uZmRhdGEgKiBkZXZjLCB1bnNpZ25lZCBjaGFyICpibG9jaywgaW50IHNpemUsIGludCBmbGFncykKK3sKKwlpbnQgaSwgdmFsLCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIGxpbWl0OworCisJaWYgKGZsYWdzICYgQ1BGX0ZJUlNUKQorCXsKKy8qX19fX18gV2FybiBEU1Agc29mdHdhcmUgdGhhdCBhIGJvb3QgaXMgY29taW5nICovCisJCW91dHcoMHgwMGZlLCBSRUcoUFNTX0RBVEEpKTsKKworCQlsaW1pdCA9IGppZmZpZXMgKyBIWi8xMDsKKwkJZm9yIChpID0gMDsgaSA8IDMyNzY4ICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIGxpbWl0KTsgaSsrKQorCQkJaWYgKGludyhSRUcoUFNTX0RBVEEpKSA9PSAweDU1MDApCisJCQkJYnJlYWs7CisKKwkJb3V0dygqYmxvY2srKywgUkVHKFBTU19EQVRBKSk7CisJCXBzc19yZXNldF9kc3AoZGV2Yyk7CisJfQorCWNvdW50ID0gMTsKKwl3aGlsZSAoKGZsYWdzJkNQRl9MQVNUKSB8fCBjb3VudDxzaXplICkKKwl7CisJCWludCBqOworCisJCWZvciAoaiA9IDA7IGogPCAzMjc2NzA7IGorKykKKwkJeworLypfX19fXyBXYWl0IGZvciBCRyB0byBhcHBlYXIgKi8KKwkJCWlmIChpbncoUkVHKFBTU19TVEFUVVMpKSAmIFBTU19GTEFHMykKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChqID09IDMyNzY3MCkKKwkJeworCQkJLyogSXQncyBvayB3ZSB0aW1lZCBvdXQgd2hlbiB0aGUgZmlsZSB3YXMgZW1wdHkgKi8KKwkJCWlmIChjb3VudCA+PSBzaXplICYmIGZsYWdzICYgQ1BGX0xBU1QpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQl7CisJCQkJcHJpbnRrKCJcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBEb3dubG9hZCB0aW1lb3V0IHByb2JsZW1zLCBieXRlICVkPSVkXG4iLCBjb3VudCwgc2l6ZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKy8qX19fX18gU2VuZCB0aGUgbmV4dCBieXRlICovCisJCWlmIChjb3VudCA+PSBzaXplKSAKKwkJeworCQkJLyogSWYgbm90IGRhdGEgaW4gYmxvY2sgc2VuZCAweGZmZmYgKi8KKwkJCW91dHcgKDB4ZmZmZiwgUkVHIChQU1NfREFUQSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLypfX19fXyBTZW5kIHRoZSBuZXh0IGJ5dGUgKi8KKwkJCW91dHcgKCpibG9jaysrLCBSRUcgKFBTU19EQVRBKSk7CisJCX07CisJCWNvdW50Kys7CisJfQorCisJaWYgKGZsYWdzICYgQ1BGX0xBU1QpCisJeworLypfX19fXyBXaHkgKi8KKwkJb3V0dygwLCBSRUcoUFNTX0RBVEEpKTsKKworCQlsaW1pdCA9IGppZmZpZXMgKyBIWi8xMDsKKwkJZm9yIChpID0gMDsgaSA8IDMyNzY4ICYmIChsaW1pdCAtIGppZmZpZXMgPj0gMCk7IGkrKykKKwkJCXZhbCA9IGludyhSRUcoUFNTX1NUQVRVUykpOworCisJCWxpbWl0ID0gamlmZmllcyArIEhaLzEwOworCQlmb3IgKGkgPSAwOyBpIDwgMzI3NjggJiYgKGxpbWl0LWppZmZpZXMgPj0gMCk7IGkrKykKKwkJeworCQkJdmFsID0gaW53KFJFRyhQU1NfU1RBVFVTKSk7CisJCQlpZiAodmFsICYgMHg0MDAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogbm93IHJlYWQgdGhlIHZlcnNpb24gKi8KKwkJZm9yIChpID0gMDsgaSA8IDMyMDAwOyBpKyspCisJCXsKKwkJCXZhbCA9IGludyhSRUcoUFNTX1NUQVRVUykpOworCQkJaWYgKHZhbCAmIFBTU19SRUFEX0ZVTEwpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gMzIwMDApCisJCQlyZXR1cm4gMDsKKworCQl2YWwgPSBpbncoUkVHKFBTU19EQVRBKSk7CisJCS8qIHByaW50ayggIjxQU1M6IG1pY3JvY29kZSB2ZXJzaW9uICVkLiVkIGxvYWRlZD4iLCAgdmFsLzE2LCAgdmFsICUgMTYpOyAqLworCX0KKwlyZXR1cm4gMTsKK30KKworLyogTWl4ZXIgKi8KK3N0YXRpYyB2b2lkIHNldF9tYXN0ZXJfdm9sdW1lKHBzc19jb25mZGF0YSAqZGV2YywgaW50IGxlZnQsIGludCByaWdodCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBsb2dfc2NhbGVbMTAxXSA9ICB7CisJCTB4ZGIsIDB4ZTAsIDB4ZTMsIDB4ZTUsIDB4ZTcsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWQsIDB4ZWUsCisJCTB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjIsIDB4ZjIsIDB4ZjIsIDB4ZjMsIDB4ZjMsIDB4ZjMsCisJCTB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjcsCisJCTB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjksIDB4ZjksIDB4ZjksCisJCTB4ZjksIDB4ZjksIDB4ZjksIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsIDB4ZmIsCisJCTB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsCisJCTB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsCisJCTB4ZmQsIDB4ZmQsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsCisJCTB4ZmUsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYKKwl9OworCXBzc193cml0ZShkZXZjLCAweDAwMTApOworCXBzc193cml0ZShkZXZjLCBsb2dfc2NhbGVbbGVmdF0gfCAweDAwMDApOworCXBzc193cml0ZShkZXZjLCAweDAwMTApOworCXBzc193cml0ZShkZXZjLCBsb2dfc2NhbGVbcmlnaHRdIHwgMHgwMTAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3N5bnRoX3ZvbHVtZShwc3NfY29uZmRhdGEgKmRldmMsIGludCB2b2x1bWUpCit7CisJaW50IHZvbCA9ICgoMHg4MDAwKnZvbHVtZSkvMTAwTCk7CisJcHNzX3dyaXRlKGRldmMsIDB4MDA4MCk7CisJcHNzX3dyaXRlKGRldmMsIHZvbCk7CisJcHNzX3dyaXRlKGRldmMsIDB4MDA4MSk7CisJcHNzX3dyaXRlKGRldmMsIHZvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9iYXNzKHBzc19jb25mZGF0YSAqZGV2YywgaW50IGxldmVsKQoreworCWludCB2b2wgPSAoaW50KSgoKDB4ZmQgLSAweGYwKSAqIGxldmVsKS8xMDBMKSArIDB4ZjA7CisJcHNzX3dyaXRlKGRldmMsIDB4MDAxMCk7CisJcHNzX3dyaXRlKGRldmMsIHZvbCB8IDB4MDIwMCk7Cit9OworCitzdGF0aWMgdm9pZCBzZXRfdHJlYmxlKHBzc19jb25mZGF0YSAqZGV2YywgaW50IGxldmVsKQorewkKKwlpbnQgdm9sID0gKCgoMHhmZCAtIDB4ZjApICogbGV2ZWwpLzEwMEwpICsgMHhmMDsKKwlwc3Nfd3JpdGUoZGV2YywgMHgwMDEwKTsKKwlwc3Nfd3JpdGUoZGV2Yywgdm9sIHwgMHgwMzAwKTsKK307CisKK3N0YXRpYyB2b2lkIHBzc19taXhlcl9yZXNldChwc3NfY29uZmRhdGEgKmRldmMpCit7CisJc2V0X21hc3Rlcl92b2x1bWUoZGV2YywgMzMsIDMzKTsKKwlzZXRfYmFzcyhkZXZjLCA1MCk7CisJc2V0X3RyZWJsZShkZXZjLCA1MCk7CisJc2V0X3N5bnRoX3ZvbHVtZShkZXZjLCAzMCk7CisJcHNzX3dyaXRlIChkZXZjLCAweDAwMTApOworCXBzc193cml0ZSAoZGV2YywgMHgwODAwIHwgMHhjZSk7CS8qIFN0ZXJlbyAqLworCQorCWlmKHBzc19taXhlcikKKwl7CisJCWRldmMtPm1peGVyLnZvbHVtZV9sID0gZGV2Yy0+bWl4ZXIudm9sdW1lX3IgPSAzMzsKKwkJZGV2Yy0+bWl4ZXIuYmFzcyA9IDUwOworCQlkZXZjLT5taXhlci50cmVibGUgPSA1MDsKKwkJZGV2Yy0+bWl4ZXIuc3ludGggPSAzMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2V0X3ZvbHVtZV9tb25vKHVuc2lnbmVkIF9fdXNlciAqcCwgaW50ICphbGVmdCkKK3sKKwlpbnQgbGVmdDsKKwl1bnNpZ25lZCB2b2x1bWU7CisJaWYgKGdldF91c2VyKHZvbHVtZSwgcCkpCisJCXJldHVybiAtRUZBVUxUOworCQorCWxlZnQgPSB2b2x1bWUgJiAweGZmOworCWlmIChsZWZ0ID4gMTAwKQorCQlsZWZ0ID0gMTAwOworCSphbGVmdCA9IGxlZnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3ZvbHVtZV9zdGVyZW8odW5zaWduZWQgX191c2VyICpwLCBpbnQgKmFsZWZ0LCBpbnQgKmFyaWdodCkKK3sKKwlpbnQgbGVmdCwgcmlnaHQ7CisJdW5zaWduZWQgdm9sdW1lOworCWlmIChnZXRfdXNlcih2b2x1bWUsIHApKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxlZnQgPSB2b2x1bWUgJiAweGZmOworCWlmIChsZWZ0ID4gMTAwKQorCQlsZWZ0ID0gMTAwOworCXJpZ2h0ID0gKHZvbHVtZSA+PiA4KSAmIDB4ZmY7CisJaWYgKHJpZ2h0ID4gMTAwKQorCQlyaWdodCA9IDEwMDsKKwkqYWxlZnQgPSBsZWZ0OworCSphcmlnaHQgPSByaWdodDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXRfdm9sX21vbm8oaW50IGxlZnQpCit7CisJcmV0dXJuICgobGVmdCA8PCA4KSB8IGxlZnQpOworfQorCitzdGF0aWMgaW50IHJldF92b2xfc3RlcmVvKGludCBsZWZ0LCBpbnQgcmlnaHQpCit7CisJcmV0dXJuICgocmlnaHQgPDwgOCkgfCBsZWZ0KTsKK30KKworc3RhdGljIGludCBjYWxsX2FkX21peGVyKHBzc19jb25mZGF0YSAqZGV2Yyx1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWlmIChkZXZjLT5hZF9taXhlcl9kZXYgIT0gTk9fV1NTX01JWEVSKSAKKwkJcmV0dXJuIG1peGVyX2RldnNbZGV2Yy0+YWRfbWl4ZXJfZGV2XS0+aW9jdGwoZGV2Yy0+YWRfbWl4ZXJfZGV2LCBjbWQsIGFyZyk7CisJZWxzZSAKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcHNzX21peGVyX2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXBzc19jb25mZGF0YSAqZGV2YyA9IG1peGVyX2RldnNbZGV2XS0+ZGV2YzsKKwlpbnQgY21kZiA9IGNtZCAmIDB4ZmY7CisJCisJaWYgKChjbWRmICE9IFNPVU5EX01JWEVSX1ZPTFVNRSkgJiYgKGNtZGYgIT0gU09VTkRfTUlYRVJfQkFTUykgJiYKKwkJKGNtZGYgIT0gU09VTkRfTUlYRVJfVFJFQkxFKSAmJiAoY21kZiAhPSBTT1VORF9NSVhFUl9TWU5USCkgJiYKKwkJKGNtZGYgIT0gU09VTkRfTUlYRVJfREVWTUFTSykgJiYgKGNtZGYgIT0gU09VTkRfTUlYRVJfU1RFUkVPREVWUykgJiYKKwkJKGNtZGYgIT0gU09VTkRfTUlYRVJfUkVDTUFTSykgJiYgKGNtZGYgIT0gU09VTkRfTUlYRVJfQ0FQUykgJiYKKwkJKGNtZGYgIT0gU09VTkRfTUlYRVJfUkVDU1JDKSkgCisJeworCQlyZXR1cm4gY2FsbF9hZF9taXhlcihkZXZjLCBjbWQsIGFyZyk7CisJfQorCQorCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpICE9ICdNJykJCisJCXJldHVybiAtRUlOVkFMOworCQkKKwlpZiAoX1NJT0NfRElSIChjbWQpICYgX1NJT0NfV1JJVEUpCisJeworCQlzd2l0Y2ggKGNtZGYpCQorCQl7CisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQlpZiAoZGV2Yy0+YWRfbWl4ZXJfZGV2ICE9IE5PX1dTU19NSVhFUikKKwkJCQkJcmV0dXJuIGNhbGxfYWRfbWl4ZXIoZGV2YywgY21kLCBhcmcpOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWludCB2OworCQkJCQlpZiAoZ2V0X3VzZXIodiwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCWlmICh2ICE9IDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCQkJaWYgKHNldF92b2x1bWVfc3RlcmVvKGFyZywKKwkJCQkJJmRldmMtPm1peGVyLnZvbHVtZV9sLAorCQkJCQkmZGV2Yy0+bWl4ZXIudm9sdW1lX3IpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlzZXRfbWFzdGVyX3ZvbHVtZShkZXZjLCBkZXZjLT5taXhlci52b2x1bWVfbCwKKwkJCQkJZGV2Yy0+bWl4ZXIudm9sdW1lX3IpOworCQkJCXJldHVybiByZXRfdm9sX3N0ZXJlbyhkZXZjLT5taXhlci52b2x1bWVfbCwKKwkJCQkJZGV2Yy0+bWl4ZXIudm9sdW1lX3IpOworCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9CQVNTOgorCQkJCWlmIChzZXRfdm9sdW1lX21vbm8oYXJnLCAmZGV2Yy0+bWl4ZXIuYmFzcykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXNldF9iYXNzKGRldmMsIGRldmMtPm1peGVyLmJhc3MpOworCQkJCXJldHVybiByZXRfdm9sX21vbm8oZGV2Yy0+bWl4ZXIuYmFzcyk7CisJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX1RSRUJMRToKKwkJCQlpZiAoc2V0X3ZvbHVtZV9tb25vKGFyZywgJmRldmMtPm1peGVyLnRyZWJsZSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXNldF90cmVibGUoZGV2YywgZGV2Yy0+bWl4ZXIudHJlYmxlKTsKKwkJCQlyZXR1cm4gcmV0X3ZvbF9tb25vKGRldmMtPm1peGVyLnRyZWJsZSk7CisJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQkJCWlmIChzZXRfdm9sdW1lX21vbm8oYXJnLCAmZGV2Yy0+bWl4ZXIuc3ludGgpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlzZXRfc3ludGhfdm9sdW1lKGRldmMsIGRldmMtPm1peGVyLnN5bnRoKTsKKwkJCQlyZXR1cm4gcmV0X3ZvbF9tb25vKGRldmMtPm1peGVyLnN5bnRoKTsKKwkJICAKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJZWxzZQkJCQorCXsKKwkJaW50IHZhbCwgYW5kX21hc2sgPSAwLCBvcl9tYXNrID0gMDsKKwkJLyoKKwkJICogUmV0dXJuIHBhcmFtZXRlcnMKKwkJICovCisJCXN3aXRjaCAoY21kZikKKwkJeworCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJCWlmIChjYWxsX2FkX21peGVyKGRldmMsIGNtZCwgYXJnKSA9PSAtRUlOVkFMKQorCQkJCQlicmVhazsKKwkJCQlhbmRfbWFzayA9IH4wOworCQkJCW9yX21hc2sgPSBTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfQkFTUyB8IFNPVU5EX01BU0tfVFJFQkxFIHwgU09VTkRfTUFTS19TWU5USDsKKwkJCQlicmVhazsKKwkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoKKwkJCQlpZiAoY2FsbF9hZF9taXhlcihkZXZjLCBjbWQsIGFyZykgPT0gLUVJTlZBTCkKKwkJCQkJYnJlYWs7CisJCQkJYW5kX21hc2sgPSB+MDsKKwkJCQlvcl9tYXNrID0gU09VTkRfTUFTS19WT0xVTUU7CisJCQkJYnJlYWs7CisJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQkJaWYgKGRldmMtPmFkX21peGVyX2RldiAhPSBOT19XU1NfTUlYRVIpCisJCQkJCXJldHVybiBjYWxsX2FkX21peGVyKGRldmMsIGNtZCwgYXJnKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJCWlmIChkZXZjLT5hZF9taXhlcl9kZXYgIT0gTk9fV1NTX01JWEVSKQorCQkJCQlyZXR1cm4gY2FsbF9hZF9taXhlcihkZXZjLCBjbWQsIGFyZyk7CisJCQkJb3JfbWFzayA9IFNPVU5EX0NBUF9FWENMX0lOUFVUOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQlpZiAoZGV2Yy0+YWRfbWl4ZXJfZGV2ICE9IE5PX1dTU19NSVhFUikKKwkJCQkJcmV0dXJuIGNhbGxfYWRfbWl4ZXIoZGV2YywgY21kLCBhcmcpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwkJCQlvcl9tYXNrID0gIHJldF92b2xfc3RlcmVvKGRldmMtPm1peGVyLnZvbHVtZV9sLCBkZXZjLT5taXhlci52b2x1bWVfcik7CisJCQkJYnJlYWs7CisJCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9CQVNTOgorCQkJCW9yX21hc2sgPSAgcmV0X3ZvbF9tb25vKGRldmMtPm1peGVyLmJhc3MpOworCQkJCWJyZWFrOworCQkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfVFJFQkxFOgorCQkJCW9yX21hc2sgPSByZXRfdm9sX21vbm8oZGV2Yy0+bWl4ZXIudHJlYmxlKTsKKwkJCQlicmVhazsKKwkJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQkJCW9yX21hc2sgPSByZXRfdm9sX21vbm8oZGV2Yy0+bWl4ZXIuc3ludGgpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdmFsICY9IGFuZF9tYXNrOworCQl2YWwgfD0gb3JfbWFzazsKKwkJaWYgKHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiB2YWw7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgcHNzX21peGVyX29wZXJhdGlvbnMgPQoreworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5pZAk9ICJTT1VORFBPUlQiLAorCS5uYW1lCT0gIlBTUy1BRDE4NDgiLAorCS5pb2N0bAk9IHBzc19taXhlcl9pb2N0bAorfTsKKworc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfZW11bGF0aW9ucyh2b2lkKQoreworCW91dHcoMHgwMDAwLCBSRUcoQ09ORl9QU1MpKTsJLyogMHgwNDAwIGVuYWJsZXMgam95c3RpY2sgKi8KKwlvdXR3KDB4MDAwMCwgUkVHKENPTkZfV1NTKSk7CisJb3V0dygweDAwMDAsIFJFRyhDT05GX1NCKSk7CisJb3V0dygweDAwMDAsIFJFRyhDT05GX01JREkpKTsKKwlvdXR3KDB4MDAwMCwgUkVHKENPTkZfQ0RST00pKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlndXJlX25vbnNvdW5kX2NvbXBvbmVudHModm9pZCkKK3sKKwkvKiBDb25maWd1cmUgSm95c3RpY2sgcG9ydCAqLworCisJaWYocHNzX2VuYWJsZV9qb3lzdGljaykKKwl7CisJCW91dHcoMHgwNDAwLCBSRUcoQ09ORl9QU1MpKTsJLyogMHgwNDAwIGVuYWJsZXMgam95c3RpY2sgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiUFNTOiBqb3lzdGljayBlbmFibGVkLlxuIik7CisJfQorCWVsc2UKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIlBTUzogam95c3RpY2sgcG9ydCBub3QgZW5hYmxlZC5cbiIpOworCX0KKworCS8qIENvbmZpZ3VyZSBDRFJPTSBwb3J0ICovCisKKwlpZihwc3NfY2Ryb21fcG9ydCA9PSAtMSkJLyogSWYgY2Ryb20gcG9ydCBlbmFibGF0aW9uIHdhc24ndCByZXF1ZXN0ZWQgKi8KKwl7CisJCXByaW50ayhLRVJOX0lORk8gIlBTUzogQ0RST00gcG9ydCBub3QgZW5hYmxlZC5cbiIpOworCX0KKwllbHNlIGlmKGNoZWNrX3JlZ2lvbihwc3NfY2Ryb21fcG9ydCwgMikpCisJeworCQlwcmludGsoS0VSTl9FUlIgIlBTUzogQ0RST00gSS9PIHBvcnQgY29uZmxpY3QuXG4iKTsKKwl9CisJZWxzZSBpZighc2V0X2lvX2Jhc2UoZGV2YywgQ09ORl9DRFJPTSwgcHNzX2Nkcm9tX3BvcnQpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IENEUk9NIEkvTyBwb3J0IGNvdWxkIG5vdCBiZSBzZXQuXG4iKTsKKwl9CisJZWxzZQkJCQkJLyogQ0RST00gcG9ydCBzdWNjZXNzZnVsbHkgY29uZmlndXJlZCAqLworCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUFNTOiBDRFJPTSBJL08gcG9ydCBzZXQgdG8gMHgleC5cbiIsIHBzc19jZHJvbV9wb3J0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGF0dGFjaF9wc3Moc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIHNob3J0ICBpZDsKKwljaGFyIHRtcFsxMDBdOworCisJZGV2Yy0+YmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKwlkZXZjLT5pcnEgPSBod19jb25maWctPmlycTsKKwlkZXZjLT5kbWEgPSBod19jb25maWctPmRtYTsKKwlkZXZjLT5vc3AgPSBod19jb25maWctPm9zcDsKKwlkZXZjLT5hZF9taXhlcl9kZXYgPSBOT19XU1NfTUlYRVI7CisKKwlpZiAoIXByb2JlX3Bzcyhod19jb25maWcpKQorCQlyZXR1cm4gMDsKKworCWlkID0gaW53KFJFRyhQU1NfSUQpKSAmIDB4MDBmZjsKKworCS8qCisJICogRGlzYWJsZSBhbGwgZW11bGF0aW9ucy4gV2lsbCBiZSBlbmFibGVkIGxhdGVyIChpZiByZXF1aXJlZCkuCisJICovCisJIAorCWRpc2FibGVfYWxsX2VtdWxhdGlvbnMoKTsKKworI2lmIFlPVV9SRUFMTFlfV0FOVF9UT19BTExPQ0FURV9USEVTRV9SRVNPVVJDRVMKKwlpZiAoc291bmRfYWxsb2NfZG1hKGh3X2NvbmZpZy0+ZG1hLCAiUFNTIikpCisJeworCQlwcmludGsoInBzcy5jOiBDYW4ndCBhbGxvY2F0ZSBETUEgY2hhbm5lbC5cbiIpOworCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDB4MTApOworCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UrMHgxMCwgMHg5KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc2V0X2lycShkZXZjLCBDT05GX1BTUywgZGV2Yy0+aXJxKSkKKwl7CisJCXByaW50aygiUFNTOiBJUlEgYWxsb2NhdGlvbiBlcnJvci5cbiIpOworCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDB4MTApOworCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UrMHgxMCwgMHg5KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc2V0X2RtYShkZXZjLCBDT05GX1BTUywgZGV2Yy0+ZG1hKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBETUEgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMHgxMCk7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSsweDEwLCAweDkpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCWNvbmZpZ3VyZV9ub25zb3VuZF9jb21wb25lbnRzKCk7CisJcHNzX2luaXRpYWxpemVkID0gMTsKKwlzcHJpbnRmKHRtcCwgIkVDSE8tUFNTICBSZXYuICVkIiwgaWQpOworCWNvbmZfcHJpbnRmKHRtcCwgaHdfY29uZmlnKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfcHNzX21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwlpbnQgdGltZW91dDsKKworCWlmICghcHNzX2luaXRpYWxpemVkKQorCQlyZXR1cm4gMDsKKworCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyLCAibXB1NDAxIik7CisKKwlpZiAoIXBvcnRzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBNUFUgSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzZXRfaW9fYmFzZShkZXZjLCBDT05GX01JREksIGh3X2NvbmZpZy0+aW9fYmFzZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IE1JREkgYmFzZSBjb3VsZCBub3QgYmUgc2V0LlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKCFzZXRfaXJxKGRldmMsIENPTkZfTUlESSwgaHdfY29uZmlnLT5pcnEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBNSURJIElSUSBhbGxvY2F0aW9uIGVycm9yLlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKCFwc3Nfc3ludGhMZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IENhbid0IGVuYWJsZSBNUFUuIE1JREkgc3ludGggbWljcm9jb2RlIG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoIXBzc19kb3dubG9hZF9ib290KGRldmMsIHBzc19zeW50aCwgcHNzX3N5bnRoTGVuLCBDUEZfRklSU1QgfCBDUEZfTEFTVCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IFVuYWJsZSB0byBsb2FkIE1JREkgc3ludGggbWljcm9jb2RlIHRvIERTUC5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBGaW5hbGx5IHdhaXQgdW50aWwgdGhlIERTUCBhbGdvcml0aG0gaGFzIGluaXRpYWxpemVkIGl0c2VsZiBhbmQKKwkgKiBkZWFjdGl2YXRlcyByZWNlaXZlIGludGVycnVwdC4KKwkgKi8KKworCWZvciAodGltZW91dCA9IDkwMDAwMDsgdGltZW91dCA+IDA7IHRpbWVvdXQtLSkKKwl7CisJCWlmICgoaW5iKGh3X2NvbmZpZy0+aW9fYmFzZSArIDEpICYgMHg4MCkgPT0gMCkJLyogSW5wdXQgZGF0YSBhdmFpbCAqLworCQkJaW5iKGh3X2NvbmZpZy0+aW9fYmFzZSk7CS8qIERpc2NhcmQgaXQgKi8KKwkJZWxzZQorCQkJYnJlYWs7CS8qIE5vIG1vcmUgaW5wdXQgKi8KKwl9CisKKwlpZiAoIXByb2JlX21wdTQwMShod19jb25maWcsIHBvcnRzKSkKKwkJZ290byBmYWlsOworCisJYXR0YWNoX21wdTQwMShod19jb25maWcsIFRISVNfTU9EVUxFKTsJLyogU2xvdCAxICovCisJaWYgKGh3X2NvbmZpZy0+c2xvdHNbMV0gIT0gLTEpCS8qIFRoZSBNUFUgZHJpdmVyIGluc3RhbGxlZCBpdHNlbGYgKi8KKwkJbWlkaV9kZXZzW2h3X2NvbmZpZy0+c2xvdHNbMV1dLT5jb3Byb2MgPSAmcHNzX2NvcHJvY19vcGVyYXRpb25zOworCXJldHVybiAxOworZmFpbDoKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzc19jb3Byb2Nfb3Blbih2b2lkICpkZXZfaW5mbywgaW50IHN1Yl9kZXZpY2UpCit7CisJc3dpdGNoIChzdWJfZGV2aWNlKQorCXsKKwkJY2FzZSBDT1BSX01JREk6CisJCQlpZiAocHNzX3N5bnRoTGVuID09IDApCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IE1JREkgc3ludGggbWljcm9jb2RlIG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWlmIChub25zdGFuZGFyZF9taWNyb2NvZGUpCisJCQkJaWYgKCFwc3NfZG93bmxvYWRfYm9vdChkZXZjLCBwc3Nfc3ludGgsIHBzc19zeW50aExlbiwgQ1BGX0ZJUlNUIHwgQ1BGX0xBU1QpKQorCQkJeworCQkJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBVbmFibGUgdG8gbG9hZCBNSURJIHN5bnRoIG1pY3JvY29kZSB0byBEU1AuXG4iKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCW5vbnN0YW5kYXJkX21pY3JvY29kZSA9IDA7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwc3NfY29wcm9jX2Nsb3NlKHZvaWQgKmRldl9pbmZvLCBpbnQgc3ViX2RldmljZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHBzc19jb3Byb2NfcmVzZXQodm9pZCAqZGV2X2luZm8pCit7CisJaWYgKHBzc19zeW50aExlbikKKwkJaWYgKCFwc3NfZG93bmxvYWRfYm9vdChkZXZjLCBwc3Nfc3ludGgsIHBzc19zeW50aExlbiwgQ1BGX0ZJUlNUIHwgQ1BGX0xBU1QpKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIlBTUzogVW5hYmxlIHRvIGxvYWQgTUlESSBzeW50aCBtaWNyb2NvZGUgdG8gRFNQLlxuIik7CisJCX0KKwlub25zdGFuZGFyZF9taWNyb2NvZGUgPSAwOworfQorCitzdGF0aWMgaW50IGRvd25sb2FkX2Jvb3RfYmxvY2sodm9pZCAqZGV2X2luZm8sIGNvcHJfYnVmZmVyICogYnVmKQoreworCWlmIChidWYtPmxlbiA8PSAwIHx8IGJ1Zi0+bGVuID4gc2l6ZW9mKGJ1Zi0+ZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFwc3NfZG93bmxvYWRfYm9vdChkZXZjLCBidWYtPmRhdGEsIGJ1Zi0+bGVuLCBidWYtPmZsYWdzKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBVbmFibGUgdG8gbG9hZCBtaWNyb2NvZGUgYmxvY2sgdG8gRFNQLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlub25zdGFuZGFyZF9taWNyb2NvZGUgPSAxOwkvKiBUaGUgTUlESSBtaWNyb2NvZGUgaGFzIGJlZW4gb3ZlcndyaXR0ZW4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwc3NfY29wcm9jX2lvY3RsKHZvaWQgKmRldl9pbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnLCBpbnQgbG9jYWwpCit7CisJY29wcl9idWZmZXIgKmJ1ZjsKKwljb3ByX21zZyAqbWJ1ZjsKKwljb3ByX2RlYnVnX2J1ZiBkYnVmOworCXVuc2lnbmVkIHNob3J0IHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0ICpkYXRhOworCWludCBpLCBlcnI7CisJLyogcHJpbnRrKCAiUFNTIGNvcHJvYyBpb2N0bCAleCAleCAlZFxuIiwgIGNtZCwgIGFyZywgIGxvY2FsKTsgKi8KKwkKKwlzd2l0Y2ggKGNtZCkgCisJeworCQljYXNlIFNORENUTF9DT1BSX1JFU0VUOgorCQkJcHNzX2NvcHJvY19yZXNldChkZXZfaW5mbyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9DT1BSX0xPQUQ6CisJCQlidWYgPSAoY29wcl9idWZmZXIgKikgdm1hbGxvYyhzaXplb2YoY29wcl9idWZmZXIpKTsKKwkJCWlmIChidWYgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGFyZywgc2l6ZW9mKGNvcHJfYnVmZmVyKSkpIHsKKwkJCQl2ZnJlZShidWYpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJZXJyID0gZG93bmxvYWRfYm9vdF9ibG9jayhkZXZfaW5mbywgYnVmKTsKKwkJCXZmcmVlKGJ1Zik7CisJCQlyZXR1cm4gZXJyOworCQkKKwkJY2FzZSBTTkRDVExfQ09QUl9TRU5ETVNHOgorCQkJbWJ1ZiA9IChjb3ByX21zZyAqKXZtYWxsb2Moc2l6ZW9mKGNvcHJfbXNnKSk7CisJCQlpZiAobWJ1ZiA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PU1BDOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKG1idWYsIGFyZywgc2l6ZW9mKGNvcHJfbXNnKSkpIHsKKwkJCQl2ZnJlZShtYnVmKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWRhdGEgPSAodW5zaWduZWQgc2hvcnQgKikobWJ1Zi0+ZGF0YSk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQkJZm9yIChpID0gMDsgaSA8IG1idWYtPmxlbjsgaSsrKSB7CisJCQkJaWYgKCFwc3NfcHV0X2RzcHdvcmQoZGV2YywgKmRhdGErKykpIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJCW1idWYtPmxlbiA9IGk7CS8qIGZlZWQgYmFjayBudW1iZXIgb2YgV09SRHMgc2VudCAqLworCQkJCQllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCBtYnVmLCBzaXplb2YoY29wcl9tc2cpKTsKKwkJCQkJdmZyZWUobWJ1Zik7CisJCQkJCXJldHVybiBlcnIgPyAtRUZBVUxUIDogLUVJTzsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCXZmcmVlKG1idWYpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfQ09QUl9SQ1ZNU0c6CisJCQllcnIgPSAwOworCQkJbWJ1ZiA9IChjb3ByX21zZyAqKXZtYWxsb2Moc2l6ZW9mKGNvcHJfbXNnKSk7CisJCQlpZiAobWJ1ZiA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PU1BDOworCQkJZGF0YSA9ICh1bnNpZ25lZCBzaG9ydCAqKW1idWYtPmRhdGE7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihtYnVmLT5kYXRhKS9zaXplb2YodW5zaWduZWQgc2hvcnQpOyBpKyspIHsKKwkJCQltYnVmLT5sZW4gPSBpOwkvKiBmZWVkIGJhY2sgbnVtYmVyIG9mIFdPUkRzIHJlYWQgKi8KKwkJCQlpZiAoIXBzc19nZXRfZHNwd29yZChkZXZjLCBkYXRhKyspKSB7CisJCQkJCWlmIChpID09IDApCisJCQkJCQllcnIgPSAtRUlPOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBtYnVmLCBzaXplb2YoY29wcl9tc2cpKSkKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJdmZyZWUobWJ1Zik7CisJCQlyZXR1cm4gZXJyOworCQkKKwkJY2FzZSBTTkRDVExfQ09QUl9SREFUQToKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZGJ1ZiwgYXJnLCBzaXplb2YoZGJ1ZikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJCWlmICghcHNzX3B1dF9kc3B3b3JkKGRldmMsIDB4MDBkMCkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWlmICghcHNzX3B1dF9kc3B3b3JkKGRldmMsICh1bnNpZ25lZCBzaG9ydCkoZGJ1Zi5wYXJtMSAmIDB4ZmZmZikpKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlpZiAoIXBzc19nZXRfZHNwd29yZChkZXZjLCAmdG1wKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJZGJ1Zi5wYXJtMSA9IHRtcDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZkYnVmLCBzaXplb2YoZGJ1ZikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIFNORENUTF9DT1BSX1dEQVRBOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYnVmLCBhcmcsIHNpemVvZihkYnVmKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQkJaWYgKCFwc3NfcHV0X2RzcHdvcmQoZGV2YywgMHgwMGQxKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKCFwc3NfcHV0X2RzcHdvcmQoZGV2YywgKHVuc2lnbmVkIHNob3J0KSAoZGJ1Zi5wYXJtMSAmIDB4ZmZmZikpKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQl0bXAgPSAodW5zaWduZWQgaW50KWRidWYucGFybTIgJiAweGZmZmY7CisJCQlpZiAoIXBzc19wdXRfZHNwd29yZChkZXZjLCB0bXApKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCXJldHVybiAwOworCQkKKwkJY2FzZSBTTkRDVExfQ09QUl9XQ09ERToKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZGJ1ZiwgYXJnLCBzaXplb2YoZGJ1ZikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJCWlmICghcHNzX3B1dF9kc3B3b3JkKGRldmMsIDB4MDBkMykpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWlmICghcHNzX3B1dF9kc3B3b3JkKGRldmMsICh1bnNpZ25lZCBzaG9ydCkoZGJ1Zi5wYXJtMSAmIDB4ZmZmZikpKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQl0bXAgPSAodW5zaWduZWQgaW50KWRidWYucGFybTIgJiAweDAwZmY7CisJCQlpZiAoIXBzc19wdXRfZHNwd29yZChkZXZjLCB0bXApKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQl0bXAgPSAoKHVuc2lnbmVkIGludClkYnVmLnBhcm0yID4+IDgpICYgMHhmZmZmOworCQkJaWYgKCFwc3NfcHV0X2RzcHdvcmQoZGV2YywgdG1wKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJCisJCWNhc2UgU05EQ1RMX0NPUFJfUkNPREU6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmRidWYsIGFyZywgc2l6ZW9mKGRidWYpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJCQlpZiAoIXBzc19wdXRfZHNwd29yZChkZXZjLCAweDAwZDIpKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlpZiAoIXBzc19wdXRfZHNwd29yZChkZXZjLCAodW5zaWduZWQgc2hvcnQpKGRidWYucGFybTEgJiAweGZmZmYpKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKCFwc3NfZ2V0X2RzcHdvcmQoZGV2YywgJnRtcCkpIHsgLyogUmVhZCBNU0IgKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWRidWYucGFybTEgPSB0bXAgPDwgODsKKwkJCWlmICghcHNzX2dldF9kc3B3b3JkKGRldmMsICZ0bXApKSB7IC8qIFJlYWQgTFNCICovCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlkYnVmLnBhcm0xIHw9IHRtcCAmIDB4MDBmZjsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZkYnVmLCBzaXplb2YoZGJ1ZikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvcHJvY19vcGVyYXRpb25zIHBzc19jb3Byb2Nfb3BlcmF0aW9ucyA9Cit7CisJIkFEU1AtMjExNSIsCisJVEhJU19NT0RVTEUsCisJcHNzX2NvcHJvY19vcGVuLAorCXBzc19jb3Byb2NfY2xvc2UsCisJcHNzX2NvcHJvY19pb2N0bCwKKwlwc3NfY29wcm9jX3Jlc2V0LAorCSZwc3NfZGF0YQorfTsKKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfcHNzX21zcyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdm9sYXRpbGUgaW50IHRpbWVvdXQ7CisJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwlpbnQgICAgICAgIG15X21peCA9IC05OTk7CS8qIGdjYyBzaHV0IHVwICovCisKKwlpZiAoIXBzc19pbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCwgIldTUyBjb25maWciKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlBTUzogV1NTIEkvTyBwb3J0IGNvbmZsaWN0cy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UgKyA0LCA0LCAiYWQxODQ4Iik7CisJaWYgKCFwb3J0cykgeworCQlwcmludGsoS0VSTl9FUlIgIlBTUzogV1NTIEkvTyBwb3J0IGNvbmZsaWN0cy5cbiIpOworCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDQpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzZXRfaW9fYmFzZShkZXZjLCBDT05GX1dTUywgaHdfY29uZmlnLT5pb19iYXNlKSkgeworCQlwcmludGsoIlBTUzogV1NTIGJhc2Ugbm90IHNldHRhYmxlLlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKCFzZXRfaXJxKGRldmMsIENPTkZfV1NTLCBod19jb25maWctPmlycSkpIHsKKwkJcHJpbnRrKCJQU1M6IFdTUyBJUlEgYWxsb2NhdGlvbiBlcnJvci5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCWlmICghc2V0X2RtYShkZXZjLCBDT05GX1dTUywgaHdfY29uZmlnLT5kbWEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBXU1MgRE1BIGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCS8qCisJICogRm9yIHNvbWUgcmVhc29uIHRoZSBjYXJkIHJldHVybnMgMHhmZiBpbiB0aGUgV1NTIHN0YXR1cyByZWdpc3RlcgorCSAqIGltbWVkaWF0ZWx5IGFmdGVyIGJvb3QuIFByb2JhYmx5IE1JREkrU0IgZW11bGF0aW9uIGFsZ29yaXRobQorCSAqIGRvd25sb2FkZWQgdG8gdGhlIEFEU1AyMTE1IHNwZW5kcyBzb21lIHRpbWUgaW5pdGlhbGl6aW5nIHRoZSBjYXJkLgorCSAqIExldCdzIHRyeSB0byB3YWl0IHVudGlsIGl0IGZpbmlzaGVzIHRoaXMgdGFzay4KKwkgKi8KKwlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgMTAwMDAwICYmIChpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgV1NTX0lOREVYKSAmCisJICBXU1NfSU5JVElBTElaSU5HKTsgdGltZW91dCsrKQorCQk7CisKKwlvdXRiKCgweDBiKSwgaHdfY29uZmlnLT5pb19iYXNlICsgV1NTX0lOREVYKTsJLyogUmVxdWlyZWQgYnkgc29tZSBjYXJkcyAqLworCisJZm9yICh0aW1lb3V0ID0gMDsgKGluYihod19jb25maWctPmlvX2Jhc2UgKyBXU1NfREFUQSkgJiBXU1NfQVVUT0NBTElCUkFUSU9OKSAmJgorCSAgKHRpbWVvdXQgPCAxMDAwMDApOyB0aW1lb3V0KyspCisJCTsKKworCWlmICghcHJvYmVfbXNfc291bmQoaHdfY29uZmlnLCBwb3J0cykpCisJCWdvdG8gZmFpbDsKKworCWRldmMtPmFkX21peGVyX2RldiA9IE5PX1dTU19NSVhFUjsKKwlpZiAocHNzX21peGVyKSAKKwl7CisJCWlmICgobXlfbWl4ID0gc291bmRfaW5zdGFsbF9taXhlciAoTUlYRVJfRFJJVkVSX1ZFUlNJT04sCisJCQkiUFNTLVNQRUFLRVJTIGFuZCBBRDE4NDggKHRocm91Z2ggTVNTIGF1ZGlvIGNvZGVjKSIsCisJCQkmcHNzX21peGVyX29wZXJhdGlvbnMsCisJCQlzaXplb2YgKHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKSwKKwkJCWRldmMpKSA8IDApIAorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBpbnN0YWxsIFBTUyBtaXhlclxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJcHNzX21peGVyX3Jlc2V0KGRldmMpOworCWF0dGFjaF9tc19zb3VuZChod19jb25maWcsIHBvcnRzLCBUSElTX01PRFVMRSk7CS8qIFNsb3QgMCAqLworCisJaWYgKGh3X2NvbmZpZy0+c2xvdHNbMF0gIT0gLTEpCisJeworCQkvKiBUaGUgTVNTIGRyaXZlciBpbnN0YWxsZWQgaXRzZWxmICovCisJCWF1ZGlvX2RldnNbaHdfY29uZmlnLT5zbG90c1swXV0tPmNvcHJvYyA9ICZwc3NfY29wcm9jX29wZXJhdGlvbnM7CisJCWlmIChwc3NfbWl4ZXIgJiYgKG51bV9taXhlcnMgPT0gKG15X21peCArIDIpKSkKKwkJeworCQkJLyogVGhlIE1TUyBtaXhlciBpbnN0YWxsZWQgKi8KKwkJCWRldmMtPmFkX21peGVyX2RldiA9IGF1ZGlvX2RldnNbaHdfY29uZmlnLT5zbG90c1swXV0tPm1peGVyX2RldjsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK2ZhaWw6CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlICsgNCwgNCk7CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCB1bmxvYWRfcHNzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDB4MTApOworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSsweDEwLCAweDkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF9wc3NfbXB1KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwl1bmxvYWRfbXB1NDAxKGh3X2NvbmZpZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQgdW5sb2FkX3Bzc19tc3Moc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVubG9hZF9tc19zb3VuZChod19jb25maWcpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzI7CitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXB1OworCitzdGF0aWMgaW50IHBzc19pbyBfX2luaXRkYXRhCT0gLTE7CitzdGF0aWMgaW50IG1zc19pbyBfX2luaXRkYXRhCT0gLTE7CitzdGF0aWMgaW50IG1zc19pcnEgX19pbml0ZGF0YQk9IC0xOworc3RhdGljIGludCBtc3NfZG1hIF9faW5pdGRhdGEJPSAtMTsKK3N0YXRpYyBpbnQgbXB1X2lvIF9faW5pdGRhdGEJPSAtMTsKK3N0YXRpYyBpbnQgbXB1X2lycSBfX2luaXRkYXRhCT0gLTE7CitzdGF0aWMgaW50IHBzc19ub19zb3VuZCA9IDA7CS8qIEp1c3QgY29uZmlndXJlIG5vbi1zb3VuZCBjb21wb25lbnRzICovCitzdGF0aWMgaW50IHBzc19rZWVwX3NldHRpbmdzICA9IDE7CS8qIEtlZXAgaGFyZHdhcmUgc2V0dGluZ3MgYXQgbW9kdWxlIGV4aXQgKi8KK3N0YXRpYyBjaGFyICpwc3NfZmlybXdhcmUgPSAiL2V0Yy9zb3VuZC9wc3Nfc3ludGgiOworCittb2R1bGVfcGFyYW0ocHNzX2lvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwc3NfaW8sICJTZXQgaS9vIGJhc2Ugb2YgUFNTIGNhcmQgKHByb2JhYmx5IDB4MjIwIG9yIDB4MjQwKSIpOworbW9kdWxlX3BhcmFtKG1zc19pbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXNzX2lvLCAiU2V0IFdTUyAoYXVkaW8pIGkvbyBiYXNlICgweDUzMCwgMHg2MDQsIDB4RTgwLCAweEY0MCwgb3Igb3RoZXIuIEFkZHJlc3MgbXVzdCBlbmQgaW4gMCBvciA0IGFuZCBtdXN0IGJlIGZyb20gMHgxMDAgdG8gMHhGRjQpIik7Cittb2R1bGVfcGFyYW0obXNzX2lycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXNzX2lycSwgIlNldCBXU1MgKGF1ZGlvKSBJUlEgKDMsIDUsIDcsIDksIDEwLCAxMSwgMTIpIik7Cittb2R1bGVfcGFyYW0obXNzX2RtYSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXNzX2RtYSwgIlNldCBXU1MgKGF1ZGlvKSBETUEgKDAsIDEsIDMpIik7Cittb2R1bGVfcGFyYW0obXB1X2lvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtcHVfaW8sICJTZXQgTUlESSBpL28gYmFzZSAoMHgzMzAgb3Igb3RoZXIuIEFkZHJlc3MgbXVzdCBiZSBvbiA0IGxvY2F0aW9uIGJvdW5kYXJpZXMgYW5kIG11c3QgYmUgZnJvbSAweDEwMCB0byAweEZGQykiKTsKK21vZHVsZV9wYXJhbShtcHVfaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtcHVfaXJxLCAiU2V0IE1JREkgSVJRICgzLCA1LCA3LCA5LCAxMCwgMTEsIDEyKSIpOworbW9kdWxlX3BhcmFtKHBzc19jZHJvbV9wb3J0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwc3NfY2Ryb21fcG9ydCwgIlNldCB0aGUgUFNTIENEUk9NIHBvcnQgaS9vIGJhc2UgKDB4MzQwIG9yIG90aGVyKSIpOworbW9kdWxlX3BhcmFtKHBzc19lbmFibGVfam95c3RpY2ssIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhwc3NfZW5hYmxlX2pveXN0aWNrLCAiRW5hYmxlcyB0aGUgUFNTIGpveXN0aWNrIHBvcnQgKDEgdG8gZW5hYmxlLCAwIHRvIGRpc2FibGUpIik7Cittb2R1bGVfcGFyYW0ocHNzX25vX3NvdW5kLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHNzX25vX3NvdW5kLCAiQ29uZmlndXJlIHNvdW5kIGNvbXBvZW50cyAoMCAtIG5vLCAxIC0geWVzKSIpOworbW9kdWxlX3BhcmFtKHBzc19rZWVwX3NldHRpbmdzLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHNzX2tlZXBfc2V0dGluZ3MsICJLZWVwIGhhcmR3YXJlIHNldHRpbmcgYXQgZHJpdmVyIHVubG9hZGluZyAoMCAtIG5vLCAxIC0geWVzKSIpOworbW9kdWxlX3BhcmFtKHBzc19maXJtd2FyZSwgY2hhcnAsIDApOworTU9EVUxFX1BBUk1fREVTQyhwc3NfZmlybXdhcmUsICJMb2NhdGlvbiBvZiB0aGUgZmlybXdhcmUgZmlsZSAoZGVmYXVsdCAtIC9ldGMvc291bmQvcHNzX3N5bnRoKSIpOworbW9kdWxlX3BhcmFtKHBzc19taXhlciwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBzc19taXhlciwgIkVuYWJsZSAoMSkgb3IgZGlzYWJsZSAoMCkgUFNTIG1peGVyIChjb250cm9sbGluZyBvZiBvdXRwdXQgdm9sdW1lLCBiYXNzLCB0cmVibGUsIHN5bnRoIHZvbHVtZSkuIFRoZSBtaXhlciBpcyBub3QgYXZhaWxhYmxlIG9uIGFsbCBQU1MgY2FyZHMuIik7CitNT0RVTEVfQVVUSE9SKCJIYW5udSBTYXZvbGFpbmVuLCBWbGFkaW1pciBNaWNobCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb2R1bGUgZm9yIFBTUyBzb3VuZCBjYXJkcyAoYmFzZWQgb24gQUQxODQ4LCBBRFNQLTIxMTUgYW5kIEVTQzYxNCkuIFRoaXMgbW9kdWxlIGluY2x1ZGVzIGNvbnRyb2wgb2Ygb3V0cHV0IGFtcGxpZmllciBhbmQgc3ludGggdm9sdW1lIG9mIHRoZSBCZWV0aG92ZW4gQURTUC0xNiBjYXJkICh0aGlzIG1heSB3b3JrIHdpdGggb3RoZXIgUFNTIGNhcmRzKS4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitzdGF0aWMgaW50IGZ3X2xvYWQgPSAwOworc3RhdGljIGludCBwc3NtcHUgPSAwLCBwc3Ntc3MgPSAwOworCisvKgorICogICAgTG9hZCBhIFBTUyBzb3VuZCBjYXJkIG1vZHVsZQorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcHNzKHZvaWQpCit7CisKKwlpZihwc3Nfbm9fc291bmQpCQkvKiBJZiBjb25maWd1cmluZyBvbmx5IG5vbnNvdW5kIGNvbXBvbmVudHMgKi8KKwl7CisJCWNmZy5pb19iYXNlID0gcHNzX2lvOworCQlpZighcHJvYmVfcHNzKCZjZmcpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXByaW50ayhLRVJOX0lORk8gIkVDSE8tUFNTICBSZXYuICVkXG4iLCBpbncoUkVHKFBTU19JRCkpICYgMHgwMGZmKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUFNTOiBsb2FkaW5nIGluIG5vIHNvdW5kIG1vZGUuXG4iKTsKKwkJZGlzYWJsZV9hbGxfZW11bGF0aW9ucygpOworCQljb25maWd1cmVfbm9uc291bmRfY29tcG9uZW50cygpOworCQlyZWxlYXNlX3JlZ2lvbihwc3NfaW8sIDB4MTApOworCQlyZWxlYXNlX3JlZ2lvbihwc3NfaW8gKyAweDEwLCAweDkpOworCQlyZXR1cm4gMDsKKwl9CisKKwljZmcuaW9fYmFzZSA9IHBzc19pbzsKKworCWNmZzIuaW9fYmFzZSA9IG1zc19pbzsKKwljZmcyLmlycSA9IG1zc19pcnE7CisJY2ZnMi5kbWEgPSBtc3NfZG1hOworCisJY2ZnX21wdS5pb19iYXNlID0gbXB1X2lvOworCWNmZ19tcHUuaXJxID0gbXB1X2lycTsKKworCWlmIChjZmcuaW9fYmFzZSA9PSAtMSB8fCBjZmcyLmlvX2Jhc2UgPT0gLTEgfHwgY2ZnMi5pcnEgPT0gLTEgfHwgY2ZnLmRtYSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9JTkZPICJwc3M6IG1zc19pbywgbXNzX2RtYSwgbXNzX2lycSBhbmQgcHNzX2lvIG11c3QgYmUgc2V0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcHNzX3N5bnRoKSB7CisJCWZ3X2xvYWQgPSAxOworCQlwc3Nfc3ludGhMZW4gPSBtb2RfZmlybXdhcmVfbG9hZChwc3NfZmlybXdhcmUsICh2b2lkICopICZwc3Nfc3ludGgpOworCX0KKwlpZiAoIWF0dGFjaF9wc3MoJmNmZykpCisJCXJldHVybiAtRU5PREVWOworCS8qCisJICogICAgQXR0YWNoIHN0dWZmCisJICovCisJaWYgKHByb2JlX3Bzc19tcHUoJmNmZ19tcHUpKQorCQlwc3NtcHUgPSAxOworCisJaWYgKHByb2JlX3Bzc19tc3MoJmNmZzIpKQorCQlwc3Ntc3MgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3Bzcyh2b2lkKQoreworCWlmKCFwc3Nfbm9fc291bmQpCisJeworCQlpZihmd19sb2FkICYmIHBzc19zeW50aCkKKwkJCXZmcmVlKHBzc19zeW50aCk7CisJCWlmKHBzc21zcykKKwkJCXVubG9hZF9wc3NfbXNzKCZjZmcyKTsKKwkJaWYocHNzbXB1KQorCQkJdW5sb2FkX3Bzc19tcHUoJmNmZ19tcHUpOworCQl1bmxvYWRfcHNzKCZjZmcpOworCX0KKworCWlmKCFwc3Nfa2VlcF9zZXR0aW5ncykJLyogS2VlcCBoYXJkd2FyZSBzZXR0aW5ncyBpZiBhc2tlZCAqLworCXsKKwkJZGlzYWJsZV9hbGxfZW11bGF0aW9ucygpOworCQlwcmludGsoS0VSTl9JTkZPICJSZXNldHRpbmcgUFNTIHNvdW5kIGNhcmQgY29uZmlndXJhdGlvbnMuXG4iKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGluaXRfcHNzKTsKK21vZHVsZV9leGl0KGNsZWFudXBfcHNzKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3BzcyhjaGFyICpzdHIpCit7CisJLyogaW8sIG1zc19pbywgbXNzX2lycSwgbXNzX2RtYSwgbXB1X2lvLCBtcHVfaXJxICovCisJaW50IGludHNbN107CisJCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCXBzc19pbwk9IGludHNbMV07CisJbXNzX2lvCT0gaW50c1syXTsKKwltc3NfaXJxCT0gaW50c1szXTsKKwltc3NfZG1hCT0gaW50c1s0XTsKKwltcHVfaW8JPSBpbnRzWzVdOworCW1wdV9pcnEJPSBpbnRzWzZdOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInBzcz0iLCBzZXR1cF9wc3MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvcm1lOTZ4eC5jIGIvc291bmQvb3NzL3JtZTk2eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc3NGJiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3JtZTk2eHguYwpAQCAtMCwwICsxLDE4NjEgQEAKKy8qIChDKSAyMDAwIEd1ZW50ZXIgR2VpZ2VyIDxnZWlnZXJAZGViaWFuLm9yZz4KKyAgIHdpdGggY29weS9wYXN0ZXMgZnJvbSB0aGUgZHJpdmVyIG9mIFdpbmZyaWVkIFJpdHNjaCA8cml0c2NoQGllbS5rdWcuYWMuYXQ+CisgICBiYXNlZCBvbiBlczEzNzAuYworCisKKworICAgKiAgMTAgSmFuIDIwMDE6IDAuMSBpbml0aWFsIHZlcnNpb24KKyAgICogIDE5IEphbiAyMDAxOiAwLjIgZml4ZWQgYnVnIGluIHNlbGVjdCgpCisgICAqICAyNyBBcHIgMjAwMTogMC4zIG1vcmUgdGhhbiBvbmUgY2FyZCB1c2FibGUKKyAgICogIDExIE1heSAyMDAxOiAwLjQgZml4ZWQgZm9yIFNNUCwgaW5jbHVkZWQgaW50byBrZXJuZWwgc291cmNlIHRyZWUKKyAgICogIDE3IE1heSAyMDAxOiAwLjUgZHJhaW5pbmcgY29kZSBkaWRuJ3Qgd29yayBvbiBuZXcgY2FyZHMKKyAgICogIDE4IE1heSAyMDAxOiAwLjYgcmVtb3ZlIHN5bmNocm9uaXplX2lycSgpIGNhbGwgCisgICAqICAxNyBKdWwgMjAwMTogMC43IHVwZGF0ZWQgeHJtZWN0cmwgdG8gbWFrZSBpdCB3b3JrIGZvciBuZXdlciBjYXJkcworICAgKiAgIDIgZmViIDIwMDI6IDAuOCBmaXhlZCBwY2kgZGV2aWNlIGhhbmRsaW5nLCBzZWUgYmVsb3cgZm9yIHBhdGNoZXMgZnJvbSBIZWlrbyAoVGhhbmtzISkKKyAgICAgICAgICAgICAgICAgICAgICAgTWFyY3VzIE1laXNzbmVyIDxNYXJjdXMuTWVpc3NuZXJAY2FsZGVyYS5kZT4KKworCQkgICAgICAgTW9kaWZpY2F0aW9ucyAtIEhlaWtvIFB1cm5oYWdlbiA8cHVybmhhZ2VAdG50LnVuaS1oYW5ub3Zlci5kZT4KKwkJICAgICAgIEhQMjAwMjAxMDggZml4ZWQgaGFuZGxpbmcgb2YgImxhcmdlIiByZWFkKCkKKwkJICAgICAgIEhQMjAwMjAxMTYgdG93YXJkcyBSRVYgMS41IHN1cHBvcnQsIGJhc2VkIG9uIEFMU0EncyBjYXJkLXJtZTk2NTIuYworCQkgICAgICAgSFAyMDAyMDExOCBtYWRlIG1peGVyIGlvY3RsIGFuZCBoYW5kbGluZyBvZiBkZXZpY2VzPjEgbW9yZSBzYWZlCisJCSAgICAgICBIUDIwMDIwMjAxIGZpeGVkIGhhbmRsaW5nIG9mICJsYXJnZSIgcmVhZCgpIHByb3Blcmx5CisJCSAgICAgICBhZGRlZCBSRVYgMS41IFMvUC1ESUYgcmVjZWl2ZXIgc3VwcG9ydAorCQkgICAgICAgU05EQ1RMX0RTUF9TUEVFRCBub3cgcmV0dXJucyB0aGUgYWN0dWFsIHNwZWVkCisgICAqICAxMCBBdWcgMjAwMjogYWRkZWQgc3luY2hyb25pemVfaXJxKCkgYWdhaW4KKworVE9ETzoKKyAgIC0gdGVzdCBtb3JlIHRoYW4gb25lIGNhcmQgLS0tIGRvbmUKKyAgIC0gY2hlY2sgZm9yIHBjaSBJT1JFR0lPTiAoc2VlIGVzMTM3MCkgaW4gcm1lOTZ4eF9wcm9iZSA/PworICAgLSBlcnJvciBkZXRlY3Rpb24KKyAgIC0gbW1hcCBpbnRlcmZhY2UKKyAgIC0gbWl4ZXIgbW1hcCBpbnRlcmZhY2UKKyAgIC0gbWl4ZXIgaW9jdGwKKyAgIC0gZ2V0IHJpZCBvZiBub2lzZSB1cG9uIGZpcnN0IG9wZW4gKHdoeSA/PykKKyAgIC0gYWxsb3cgbXVsdGlwbGUgb3BlbiAoYXQgbGVhc3QgZm9yIHJlYWQpCisgICAtIGFsbG93IG11bHRpcGxlIG9wZW4gZm9yIG5vbiBvdmVybGFwcGluZyByZWdpb25zCisgICAtIHJlY2hlY2sgdGhlIG11bHRpcGxlIGRldmljZXMgcGFydCAob2Zmc2V0cyBvZiBkaWZmZXJlbnQgZGV2aWNlcywgZXRjKQorICAgLSBkbyBkZWNlbnQgZHJhaW5pbmcgaW4gX3JlbGVhc2UgLS0tIGRvbmUKKyAgIC0gU01QIHN1cHBvcnQKKyAgIC0gd2hhdCBhYm91dCB1c2luZyBmcmFnc3RvdGFsPjIgZm9yIHNtYWxsIGZyYWdzaXplPyAoSFAyMDAyMDExOCkKKyAgIC0gYWRkIHN1cHBvcnQgZm9yIEFGTVRfUzMyX0xFCisqLworCisjaWZuZGVmIFJNRVZFUlNJT04KKyNkZWZpbmUgUk1FVkVSU0lPTiAiMC44IgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworI2luY2x1ZGUgInJtZTk2eHguaCIKKworI2RlZmluZSBOUl9ERVZJQ0UgMgorCitzdGF0aWMgaW50IGRldmljZXMgPSAxOworbW9kdWxlX3BhcmFtKGRldmljZXMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldmljZXMsICJudW1iZXIgb2YgZHNwIGRldmljZXMgYWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIiKTsKKworCitNT0RVTEVfQVVUSE9SKCJHdWVudGVyIEdlaWdlciwgZ2VpZ2VyQGRlYmlhbi5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiUk1FOTY1Mi8zNiBcIkhhbW1lcmZhbGxcIiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKHgpIHByaW50aygiUk1FX0RFQlVHOiIpO3gKKyNkZWZpbmUgQ09NTSh4KSBwcmludGsoIlJNRV9DT01NOiAiIHggIlxuIik7CisjZWxzZQorI2RlZmluZSBEQkcoeCkgd2hpbGUgKDApIHt9CisjZGVmaW5lIENPTU0oeCkKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgICAgICAgICAgICAgICAgICAgICAgUHJlcG9yY2Vzc29yIE1hY3JvcyBhbmQgRGVmaW5pdGlvbnMKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgUk1FOTZ4eF9NQUdJQyAweDY0NzMKKworLyogUmVnaXN0ZXJzLVNwYWNlIGluIG9mZnNldHMgZnJvbSBiYXNlIGFkZHJlc3Mgd2l0aCAxNk1CeXRlIHNpemUgKi8KKworI2RlZmluZSBSTUU5Nnh4X0lPX0VYVEVOVCAgICAgMTZsKjEwMjRsKjEwMjRsCisjZGVmaW5lIFJNRTk2eHhfQ0hBTk5FTFNfUEVSX0NBUkQgMjYKKworLyogICAgICAgICAgICAgICAgICBXcml0ZSAtIFJlZ2lzdGVyICovCisKKy8qIDAsNCw4LDEyLDE2LDIwLDI0LDI4IC4uLiBoYXJkd2FyZSBpbml0IChlcmFzaW5nIGZpZm8tcG9pbnRlciBpbnRlcm4pICovCisjZGVmaW5lIFJNRTk2eHhfbnVtX29mX2luaXRfcmVncyAgIDgKKworI2RlZmluZSBSTUU5Nnh4X2luaXRfYnVmZmVyICAgICAgICgwLzQpCisjZGVmaW5lIFJNRTk2eHhfcGxheV9idWZmZXIgICAgICAgKDMyLzQpICAvKiBwb2ludGVyIHRvIDI2eDY0a0JpdCBSQU0gZnJvbSBtYWluYm9hcmQgKi8KKyNkZWZpbmUgUk1FOTZ4eF9yZWNfYnVmZmVyICAgICAgICAoMzYvNCkgIC8qIHBvaW50ZXIgdG8gMjZ4NjRrQml0IFJBTSBmcm9tIG1haW5ib2FyZCAqLworI2RlZmluZSBSTUU5Nnh4X2NvbnRyb2xfcmVnaXN0ZXIgICg2NC80KSAgLyogZXhhY3QgbWVhbmluZyBzZWUgYmVsb3cgKi8KKyNkZWZpbmUgUk1FOTZ4eF9pcnFfY2xlYXIgICAgICAgICAoOTYvNCkgIC8qIGlycSBhY2tub3dsZWRnZSAqLworI2RlZmluZSBSTUU5Nnh4X3RpbWVfY29kZSAgICAgICAgICgxMDAvNCkgLyogaWYgdXNlZCB3aXRoIGFsZXNpcyBhZGF0ICovCisjZGVmaW5lIFJNRTk2eHhfdGhydV9iYXNlICAgICAgICAgKDEyOC80KSAvKiAxMzIuLi4yMjggVGhydSBmb3IgMjYgY2hhbm5lbHMgKi8KKyNkZWZpbmUgUk1FOTZ4eF90aHJ1X2NoYW5uZWxzICAgICBSTUU5Nnh4X0NIQU5ORUxTX1BFUl9DQVJECisKKy8qICAgICAgICAgICAgICAgICAgICAgUmVhZCBSZWdpc3RlciAqLworCisjZGVmaW5lIFJNRTk2eHhfc3RhdHVzX3JlZ2lzdGVyICAgIDAgICAgIC8qIG1lYW5pbmcgc2VlIGJlbG93ICovCisKKworCisvKiBTdGF0dXMgUmVnaXN0ZXI6ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUk1FOTZ4eF9JUlEgICAgICAgICAgMHgwMDAwMDAxIC8qIElSUSBpcyBIaWdoIGlmIG5vdCByZXNldCBieSBSTUV4eF9pcnFfY2xlYXIgKi8KKyNkZWZpbmUgUk1FOTZ4eF9sb2NrXzIgICAgICAgMHgwMDAwMDAyIC8qIEFEQVQgMy1QTEw6IDE9bG9ja2VkLCAwPXVubG9ja2VkICovCisjZGVmaW5lIFJNRTk2eHhfbG9ja18xICAgICAgIDB4MDAwMDAwNCAvKiBBREFUIDItUExMOiAxPWxvY2tlZCwgMD11bmxvY2tlZCAqLworI2RlZmluZSBSTUU5Nnh4X2xvY2tfMCAgICAgICAweDAwMDAwMDggLyogQURBVCAxLVBMTDogMT1sb2NrZWQsIDA9dW5sb2NrZWQgKi8KKworI2RlZmluZSBSTUU5Nnh4X2ZzNDggICAgICAgICAweDAwMDAwMTAgLyogc2FtcGxlIHJhdGUgMCAuLi40NC4xLzg4LjIsICAxIC4uLiA0OC85NiBLaHogKi8KKyNkZWZpbmUgUk1FOTZ4eF93c2VsX3JkICAgICAgMHgwMDAwMDIwIC8qIGlmIFdvcmQtQ2xvY2sgaXMgdXNlZCBhbmQgdmFsaWQgdGhlbiAxICovCisjZGVmaW5lIFJNRTk2eHhfYnVmX3BvczEgICAgIDB4MDAwMDA0MCAvKiBCaXQgNi4uMTUgOiBQb3NpdGlvbiBvZiBidWZmZXItcG9pbnRlciBpbiA2NEJ5dGVzLWJsb2NrcyAqLworI2RlZmluZSBSTUU5Nnh4X2J1Zl9wb3MyICAgICAweDAwMDAwODAgLyogcmVzb2x1dGlvbiArLy0gMSA2NEJ5dGUvYmxvY2sgKHNpbmNlIDY0Qnl0ZXMgYnVyc3RzKSAqLworIAorI2RlZmluZSBSTUU5Nnh4X2J1Zl9wb3MzICAgICAweDAwMDAxMDAgLyogMTAgYml0cyA9IDEwMjQgdmFsdWVzICovCisjZGVmaW5lIFJNRTk2eHhfYnVmX3BvczQgICAgIDB4MDAwMDIwMCAvKiBpZiB3ZSBtYXNrIG9mZiB0aGUgZmlyc3QgNiBiaXRzLCB3ZSBjYW4gdGFrZSB0aGUgc3RhdHVzICovCisjZGVmaW5lIFJNRTk2eHhfYnVmX3BvczUgICAgIDB4MDAwMDQwMCAvKiByZWdpc3RlciBhcyBzYW1wbGUgY291bnRlciBpbiB0aGUgaGFyZHdhcmUgYnVmZmVyICovCisjZGVmaW5lIFJNRTk2eHhfYnVmX3BvczYgICAgIDB4MDAwMDgwMCAKKworI2RlZmluZSBSTUU5Nnh4X2J1Zl9wb3M3ICAgICAweDAwMDEwMDAgCisjZGVmaW5lIFJNRTk2eHhfYnVmX3BvczggICAgIDB4MDAwMjAwMCAKKyNkZWZpbmUgUk1FOTZ4eF9idWZfcG9zOSAgICAgMHgwMDA0MDAwCisjZGVmaW5lIFJNRTk2eHhfYnVmX3BvczEwICAgIDB4MDAwODAwMCAKKworI2RlZmluZSBSTUU5Nnh4X3N5bmNfMiAgICAgICAweDAwMTAwMDAgLyogaWYgQURBVC1JTjMgc3luY2VkIHRvIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSTUU5Nnh4X3N5bmNfMSAgICAgICAweDAwMjAwMDAgLyogaWYgQURBVC1JTjIgc3luY2VkIHRvIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSTUU5Nnh4X3N5bmNfMCAgICAgICAweDAwNDAwMDAgLyogaWYgQURBVC1JTjEgc3luY2VkIHRvIHN5c3RlbSBjbG9jayAqLworI2RlZmluZSBSTUU5Nnh4X0RTX3JkICAgICAgICAweDAwODAwMDAgLyogMT1Eb3VibGUgU3BlZWQsIDA9Tm9ybWFsIFNwZWVkICovCisKKyNkZWZpbmUgUk1FOTZ4eF90Y19idXN5ICAgICAgMHgwMTAwMDAwIC8qIDE9dGltZS1jb2RlIGNvcHkgaW4gcHJvZ3Jlc3MgKDk2MG1zKSAqLworI2RlZmluZSBSTUU5Nnh4X3RjX291dCAgICAgICAweDAyMDAwMDAgLyogdGltZS1jb2RlIG91dCBiaXQgKi8KKyNkZWZpbmUgUk1FOTZ4eF9GXzAgICAgICAgICAgMHgwNDAwMDAwIC8qICAwMDA9NjRrSHosIDEwMD04OC4ya0h6LCAwMTE9OTZrSHogICovCisjZGVmaW5lIFJNRTk2eHhfRl8xICAgICAgICAgIDB4MDgwMDAwMCAvKiAgMTExPTMya0h6LCAxMTA9NDQuMWtIeiwgMTAxPTQ4a0h6LCAqLworCisjZGVmaW5lIFJNRTk2eHhfRl8yICAgICAgICAgIDB4MTAwMDAwMCAvKiAgMDAxPVJldiAxLjUrIGV4dGVybmFsIENyeXN0YWwgQ2hpcCAqLworI2RlZmluZSBSTUU5Nnh4X0VSRiAgICAgICAgICAweDIwMDAwMDAgLyogRXJyb3ItRmxhZyBvZiBTRFBJRiBSZWNlaXZlciAoMT1ObyBMb2NrKSovCisjZGVmaW5lIFJNRTk2eHhfYnVmZmVyX2lkICAgIDB4NDAwMDAwMCAvKiB0b2dnbGVzIGJ5IGVhY2ggaW50ZXJydXB0IG9uIHJlYy9wbGF5ICovCisjZGVmaW5lIFJNRTk2eHhfdGNfdmFsaWQgICAgIDB4ODAwMDAwMCAvKiAxID0gYSBzaWduYWwgaXMgZGV0ZWN0ZWQgb24gdGltZS1jb2RlIGlucHV0ICovCisjZGVmaW5lIFJNRTk2eHhfU1BESUZfUkVBRCAgMHgxMDAwMDAwMCAvKiBieXRlIGF2YWlsYWJsZSBmcm9tIFJldiAxLjUrIFNQRElGIGludGVyZmFjZSAqLworCisvKiBTdGF0dXMgUmVnaXN0ZXIgRmllbGRzICovCisKKyNkZWZpbmUgUk1FOTZ4eF9sb2NrICAgICAgICAgICAgKFJNRTk2eHhfbG9ja18wfFJNRTk2eHhfbG9ja18xfFJNRTk2eHhfbG9ja18yKQorI2RlZmluZSBSTUU5Nnh4X3N5bmMgICAgICAgICAgICAoUk1FOTZ4eF9zeW5jXzB8Uk1FOTZ4eF9zeW5jXzF8Uk1FOTZ4eF9zeW5jXzIpCisjZGVmaW5lIFJNRTk2eHhfRiAgICAgICAgICAgICAgIChSTUU5Nnh4X0ZfMHxSTUU5Nnh4X0ZfMXxSTUU5Nnh4X0ZfMikKKyNkZWZpbmUgcm1lOTZ4eF9kZWNvZGVfc3BkaWZfcmF0ZSh4KSAoKHgpPj4yMikKKworLyogQml0IDYuLjE1IDogaC93IGJ1ZmZlciBwb2ludGVyICovCisjZGVmaW5lIFJNRTk2eHhfYnVmX3BvcyAgICAgICAgICAweDAwMEZGQzAgCisvKiBCaXRzIDMxLDMwLDI5IGFyZSBiaXRzIDUsNCwzIG9mIGgvdyBwb2ludGVyIHBvc2l0aW9uIG9uIGxhdGVyCisgICBSZXYgRyBFRVBST01TIGFuZCBSZXYgMS41IGNhcmRzIG9yIGxhdGVyLgorKi8gCisjZGVmaW5lIFJNRTk2eHhfUkVWMTVfYnVmX3Bvcyh4KSAoKCgoeCkmMHhFMDAwMDAwMCk+PjI2KXwoKHgpJlJNRTk2eHhfYnVmX3BvcykpCisKKworLyogQ29udHJvbC1SZWdpc3RlcjogKi8JCQkgICAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBSTUU5Nnh4X3N0YXJ0X2JpdAkweDAwMDEgLyogc3RhcnQgcmVjb3JkL3BsYXkgKi8KKyNkZWZpbmUgUk1FOTZ4eF9sYXRlbmN5MAkweDAwMDIgLyogQnVmZmVyIHNpemUgLyBsYXRlbmN5ICovCisjZGVmaW5lIFJNRTk2eHhfbGF0ZW5jeTEJMHgwMDA0IC8qICAgYnVmZmVyc2l6ZSA9IDUxMkJ5dGVzICogMl5uICovCisjZGVmaW5lIFJNRTk2eHhfbGF0ZW5jeTIJMHgwMDA4IC8qICAgMD02NHNhbXBsZXMgLi4uIDc9ODE5MnNhbXBsZXMgKi8KKworI2RlZmluZSBSTUU5Nnh4X01hc3RlcgkJMHgwMDEwIC8qIENsb2NrIE1vZGUgMT1NYXN0ZXIsIDA9U2xhdmUvQXV0byAqLworI2RlZmluZSBSTUU5Nnh4X0lFCQkweDAwMjAgLyogSW50ZXJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFJNRTk2eHhfZnJlcQkJMHgwMDQwIC8qIHNhbXBsZXJhdGUgMD00NC4xLzg4LjIsIDE9NDgvOTYga0h6Ki8KKyNkZWZpbmUgUk1FOTZ4eF9mcmVxMQkJMHgwMDgwIC8qIHNhbXBsZXJhdGUgMD0zMiBrSHosIDE9b3RoZXIgcmF0ZXMgPz8/IChmcm9tIEFMU0EsIGJ1dCBtYXkgYmUgd3JvbmcpICovCisjZGVmaW5lIFJNRTk2eHhfRFMgICAgICAgICAgICAgIDB4MDEwMCAvKiBkb3VibGUgc3BlZWQgMD00NC4xLzQ4LCAxPTg4LjIvOTYgS2h6ICovCisjZGVmaW5lIFJNRTk2eHhfUFJPCQkweDAyMDAgLyogU1BESUYtT1VUIDA9Y29uc3VtZXIsIDE9cHJvZmVzc2lvbmFsICovCisjZGVmaW5lIFJNRTk2eHhfRU1QCQkweDA0MDAgLyogU1BESUYtT1VUIGVtcGhhc2lzIDA9b2ZmLCAxPW9uICovCisjZGVmaW5lIFJNRTk2eHhfRG9sYnkJCTB4MDgwMCAvKiBTUERJRi1PVVQgbm9uLWF1ZGlvIGJpdCAxPXNldCwgMD11bnNldCAqLworCisjZGVmaW5lIFJNRTk2eHhfb3B0X291dAkgICAgICAgIDB4MTAwMCAvKiB1c2UgMXN0IG9wdGljYWwgT1VUIGFzIFNQRElGOiAxPXllcywgMD1ubyAqLworI2RlZmluZSBSTUU5Nnh4X3dzZWwgICAgICAgICAgICAweDIwMDAgLyogdXNlIFdvcmRjbG9jayBhcyBzeW5jIChvdmVyd3JpdGVzIG1hc3RlcikgKi8KKyNkZWZpbmUgUk1FOTZ4eF9pbnBfMCAgICAgICAgICAgMHg0MDAwIC8qIFNQRElGLUlOIDAwPW9wdGljYWwgKEFEQVQxKSwgKi8KKyNkZWZpbmUgUk1FOTZ4eF9pbnBfMSAgICAgICAgICAgMHg4MDAwIC8qIDAxPWNvYXhpYWwgKENpbmNoKSwgMTA9aW50ZXJuYWwgQ0RST00gKi8KKworI2RlZmluZSBSTUU5Nnh4X1N5bmNSZWYwICAgICAgIDB4MTAwMDAgLyogcHJlZmVycmVkIHN5bmMtc291cmNlIGluIGF1dG9zeW5jICovCisjZGVmaW5lIFJNRTk2eHhfU3luY1JlZjEgICAgICAgMHgyMDAwMCAvKiAwMD1BREFUMSwgMDE9QURBVDIsIDEwPUFEQVQzLCAxMT1TUERJRiAqLworCisjZGVmaW5lIFJNRTk2eHhfU1BESUZfUkVTRVQgICAgKDE8PDE4KSAvKiBSZXYgMS41KzogaC93IFNQRElGIHJlY2VpdmVyICovCisjZGVmaW5lIFJNRTk2eHhfU1BESUZfU0VMRUNUICAgKDE8PDE5KQorI2RlZmluZSBSTUU5Nnh4X1NQRElGX0NMT0NLICAgICgxPDwyMCkKKyNkZWZpbmUgUk1FOTZ4eF9TUERJRl9XUklURSAgICAoMTw8MjEpCisjZGVmaW5lIFJNRTk2eHhfQURBVDFfSU5URVJOQUwgKDE8PDIyKSAvKiBSZXYgMS41KzogaWYgc2V0LCBpbnRlcm5hbCBDRCBjb25uZWN0b3IgY2FycmllcyBBREFUICovCisKKworI2RlZmluZSBSTUU5Nnh4X2N0cmxfaW5pdCAgICAgICAgICAgIChSTUU5Nnh4X2xhdGVuY3kwIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk1FOTZ4eF9NYXN0ZXIgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSTUU5Nnh4X2lucF8xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKworLyogQ29udHJvbCByZWdpc3RlciBmaWVsZHMgYW5kIHNob3J0Y3V0cyAqLworCisjZGVmaW5lIFJNRTk2eHhfbGF0ZW5jeSAoUk1FOTZ4eF9sYXRlbmN5MHxSTUU5Nnh4X2xhdGVuY3kxfFJNRTk2eHhfbGF0ZW5jeTIpCisjZGVmaW5lIFJNRTk2eHhfaW5wICAgICAgICAgKFJNRTk2eHhfaW5wXzB8Uk1FOTZ4eF9pbnBfMSkKKyNkZWZpbmUgUk1FOTZ4eF9TeW5jUmVmICAgIChSTUU5Nnh4X1N5bmNSZWYwfFJNRTk2eHhfU3luY1JlZjEpCisjZGVmaW5lIFJNRTk2eHhfbWl4ZXJfYWxsb3dlZCAoUk1FOTZ4eF9NYXN0ZXJ8Uk1FOTZ4eF9QUk98Uk1FOTZ4eF9FTVB8Uk1FOTZ4eF9Eb2xieXxSTUU5Nnh4X29wdF9vdXR8Uk1FOTZ4eF93c2VsfFJNRTk2eHhfaW5wfFJNRTk2eHhfU3luY1JlZnxSTUU5Nnh4X0FEQVQxX0lOVEVSTkFMKQorCisvKiBsYXRlbmN5ID0gNTEyQnl0ZXMgKiAyXm4sIHdoZXJlIG4gaXMgbWFkZSBmcm9tIEJpdDMgLi4uIEJpdDEgICg/Pz8gSFAyMDAyMDIwMSkgKi8KKworI2RlZmluZSBSTUU5Nnh4X1NFVF9MQVRFTkNZKHgpICAgKCgoeCkmMHg3KTw8MSkKKyNkZWZpbmUgUk1FOTZ4eF9HRVRfTEFURU5DWSh4KSAgICgoKHgpPj4xKSYweDcpCisjZGVmaW5lIFJNRTk2eHhfU0VUX2lucCh4KSAoKCh4KSYweDMpPDwxNCkKKyNkZWZpbmUgUk1FOTZ4eF9HRVRfaW5wKHgpICAgKCgoeCk+PjE0KSYweDMpCisjZGVmaW5lIFJNRTk2eHhfU0VUX1N5bmNSZWYoeCkgKCgoeCkmMHgzKTw8MTcpCisjZGVmaW5lIFJNRTk2eHhfR0VUX1N5bmNSZWYoeCkgICAoKCh4KT4+MTcpJjB4MykKKworCisvKiBidWZmZXIgc2l6ZXMgKi8KKyNkZWZpbmUgUk1FOTZ4eF9CWVRFU19QRVJfU0FNUExFICA0IC8qIHNpemVvZih1MzIpICovCisjZGVmaW5lIFJNRV8xNksgMTYqMTAyNAorCisjZGVmaW5lIFJNRTk2eHhfRE1BX01BWF9TQU1QTEVTICAoUk1FXzE2SykKKyNkZWZpbmUgUk1FOTZ4eF9ETUFfTUFYX1NJWkUgICAgIChSTUVfMTZLICogUk1FOTZ4eF9CWVRFU19QRVJfU0FNUExFKQorI2RlZmluZSBSTUU5Nnh4X0RNQV9NQVhfU0laRV9BTEwgKFJNRTk2eHhfRE1BX01BWF9TSVpFICogUk1FOTZ4eF9DSEFOTkVMU19QRVJfQ0FSRCkKKworI2RlZmluZSBSTUU5Nnh4X05VTV9PRl9GUkFHTUVOVFMgICAgIDIKKyNkZWZpbmUgUk1FOTZ4eF9GUkFHTUVOVF9NQVhfU0laRSAgICAoUk1FOTZ4eF9ETUFfTUFYX1NJWkUvMikKKyNkZWZpbmUgUk1FOTZ4eF9GUkFHTUVOVF9NQVhfU0FNUExFUyAoUk1FOTZ4eF9ETUFfTUFYX1NBTVBMRVMvMikKKyNkZWZpbmUgUk1FOTZ4eF9NQVhfTEFURU5DWSAgICAgICA3ICAgLyogMTZrIHNhbXBsZXMgKi8KKworCisjZGVmaW5lIFJNRTk2eHhfTUFYX0RFVlMgNCAvKiB3ZSBwcm92aWRlIHNvbWUgT1NTIHN0ZXJlb2RldnMgKi8KKyNkZWZpbmUgUk1FOTZ4eF9NQVNLX0RFVlMgMHgzIC8qIFJNRTk2eHhfTUFYX0RFVlMtMSAqLworCisjZGVmaW5lIFJNRV9NRVNTICJybWU5Nnh4OiIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgICAgICAgICAgICAgICAgVHlwZXMsIHN0cnVjdCBhbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfbWFnaWNbXSA9IEtFUk5fQ1JJVCBSTUVfTUVTUyIgaW52YWxpZCBtYWdpYyB2YWx1ZVxuIjsKKworI2RlZmluZSBWQUxJREFURV9TVEFURShzKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoIShzKSB8fCAocyktPm1hZ2ljICE9IFJNRTk2eHhfTUFHSUMpIHsgXAorCQlwcmludGsoaW52YWxpZF9tYWdpYyk7ICAgICAgICAgICAgXAorCQlyZXR1cm4gLUVOWElPOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJtZTk2eHhfYXVkaW9fZm9wczsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJtZTk2eHhfbWl4ZXJfZm9wczsKK3N0YXRpYyBpbnQgbnVtY2FyZHM7CisKK3R5cGVkZWYgaW50MzJfdCByYXdfc2FtcGxlX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9ybWU5Nnh4X2luZm8geworCisJLyogaGFyZHdhcmUgc2V0dGluZ3MgKi8KKwlpbnQgbWFnaWM7CisJc3RydWN0IHBjaV9kZXYgKiBwY2lkZXY7IC8qIHBjaV9kZXYgc3RydWN0dXJlICovCisJdW5zaWduZWQgbG9uZyBfX2lvbWVtICppb2Jhc2U7CQorCXVuc2lnbmVkIGludCBpcnE7CisKKwkvKiBsaXN0IG9mIHJtZTk2eHggZGV2aWNlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2czsKKworCXNwaW5sb2NrX3QgbG9jazsKKworCXUzMiAqcmVjYnVmOyAgICAgICAgICAgICAvKiBtZW1vcnkgZm9yIHJlYyBidWZmZXIgKi8KKwl1MzIgKnBsYXlidWY7ICAgICAgICAgICAgLyogbWVtb3J5IGZvciBwbGF5IGJ1ZmZlciAqLworCisJdTMyIGNvbnRyb2xfcmVnaXN0ZXI7CisKKwl1MzIgdGhydV9iaXRzOyAvKiB0aHJ1IDE9b24sIDA9b2ZmIGNoYW5uZWwgMT1CaXQxLi4uIGNoYW5uZWwgMjY9IEJpdDI2ICovCisKKwlpbnQgaHdfcmV2OyAgICAgICAgICAgICAvKiBoL3cgcmV2ICogMTAgKGkuZS4gMS41IGhhcyBod19yZXYgPSAxNSkgKi8KKwljaGFyICpjYXJkX25hbWU7CS8qIGhhbW1lcmZhbGwgb3IgaGFtbWVyZmFsbCBsaWdodCBuYW1lcyAqLworCisJaW50IG9wZW5fY291bnQ7ICAgICAgICAgLyogdW51c2VkID8/PyAgIEhQMjAwMjAyMDEgKi8KKworCWludCByYXRlOworCWludCBsYXRlbmN5OworCXVuc2lnbmVkIGludCBmcmFnc2l6ZTsKKwlpbnQgc3RhcnRlZDsKKworCWludCBod3B0cjsgLyogY2FuIGJlIG5lZ2F0aXYgYmVjYXVzZSBvZiBwY2kgYnVyc3Qgb2Zmc2V0ICAqLworCXVuc2lnbmVkIGludCBod2J1ZmlkOyAgLyogc2V0IGJ5IGludGVycnVwdCwgYnVmZmVyIHdoaWNoIGlzIHdyaXR0ZW4vcmVhZCBub3cgKi8KKwkKKwlzdHJ1Y3QgZG1hYnVmIHsKKworCQl1bnNpZ25lZCBpbnQgZm9ybWF0OworCQlpbnQgZm9ybWF0c2hpZnQ7CisJCWludCBpbmNoYW5uZWxzOyAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIGRldmljZSAqLworCQlpbnQgb3V0Y2hhbm5lbHM7ICAgICAgIC8qIG51bWJlciBvZiBjaGFubmVscyBmb3IgZGV2aWNlICovCisJCWludCBtb25vOyAvKiBpZiB0cnVlLCB3ZSBwbGF5IG1vbm8gb24gMiBjaGFubmVscyAqLworCQlpbnQgaW5vZmZzZXQ7IC8qIHdoaWNoIGNoYW5uZWwgaXMgY29uc2lkZXJlZCB0aGUgZmlyc3Qgb25lICovCisgICAgICAgICAJaW50IG91dG9mZnNldDsKKwkJCisJCS8qIHN0YXRlICovCisJCWludCBvcGVuZWQ7ICAgICAgICAgICAgICAgLyogb3BlbigpIG1hZGUgKi8KKwkJaW50IHN0YXJ0ZWQ7ICAgICAgICAgICAgICAvKiBmaXJzdCB3cml0ZS9yZWFkICovCisJCWludCBtbWFwcGVkOyAgICAgICAgICAgICAgLyogbW1hcCAqLworCQlpbnQgb3Blbl9tb2RlOworCisJCXN0cnVjdCBfcm1lOTZ4eF9pbmZvICpzOyAgCisKKwkJLyogcG9pbnRlciB0byByZWFkL3dyaXRlIHBvc2l0aW9uIGluIGJ1ZmZlciAqLworCQl1bnNpZ25lZCByZWFkcHRyOyAgICAgICAgICAKKwkJdW5zaWduZWQgd3JpdGVwdHI7ICAgICAgICAgIAorCisJCXVuc2lnbmVkIGVycm9yOyAvKiBvdmVyL3VuZGVycnVucyBjbGVhcmVkIG9uIHN5bmMgYWdhaW4gKi8KKworCQkvKiB3YWl0aW5nIGFuZCBsb2NraW5nICovCisJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJCXN0cnVjdCBzZW1hcGhvcmUgIG9wZW5fc2VtOworCQl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwl9IGRtYVtSTUU5Nnh4X01BWF9ERVZTXTsgCisKKwlpbnQgZHNwbnVtW1JNRTk2eHhfTUFYX0RFVlNdOyAgLyogcmVnaXN0ZXIgd2l0aCBzb3VuZCBzdWJzeXN0ZW0gKi8gCisJaW50IG1peGVyOyAgLyogcmVnaXN0ZXIgd2l0aCBzb3VuZCBzdWJzeXN0ZW0gKi8gCit9IHJtZTk2eHhfaW5mbzsKKworCisvKiBmaWRkbGluZyB3aXRoIHRoZSBjYXJkIChmaXJzdCBsZXZlbCBoYXJkd2FyZSBjb250cm9sKSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcm1lOTZ4eF9zZXRfY3RybChybWU5Nnh4X2luZm8qIHMsaW50IG1hc2spCit7CisKKwlzLT5jb250cm9sX3JlZ2lzdGVyfD1tYXNrOworCXdyaXRlbChzLT5jb250cm9sX3JlZ2lzdGVyLHMtPmlvYmFzZSArIFJNRTk2eHhfY29udHJvbF9yZWdpc3Rlcik7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJtZTk2eHhfdW5zZXRfY3RybChybWU5Nnh4X2luZm8qIHMsaW50IG1hc2spCit7CisKKwlzLT5jb250cm9sX3JlZ2lzdGVyJj0ofm1hc2spOworCXdyaXRlbChzLT5jb250cm9sX3JlZ2lzdGVyLHMtPmlvYmFzZSArIFJNRTk2eHhfY29udHJvbF9yZWdpc3Rlcik7CisKK30KKworc3RhdGljIGlubGluZSBpbnQgcm1lOTZ4eF9nZXRfc2FtcGxlX3JhdGVfc3RhdHVzKHJtZTk2eHhfaW5mbyogcykKK3sKKwlpbnQgdmFsOworCXUzMiBzdGF0dXM7CisJc3RhdHVzID0gcmVhZGwocy0+aW9iYXNlICsgUk1FOTZ4eF9zdGF0dXNfcmVnaXN0ZXIpOworCXZhbCA9IChzdGF0dXMgJiBSTUU5Nnh4X2ZzNDgpID8gNDgwMDAgOiA0NDEwMDsKKwlpZiAoc3RhdHVzICYgUk1FOTZ4eF9EU19yZCkKKwkJdmFsICo9IDI7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcm1lOTZ4eF9nZXRfc2FtcGxlX3JhdGVfY3RybChybWU5Nnh4X2luZm8qIHMpCit7CisJaW50IHZhbDsKKwl2YWwgPSAocy0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2eHhfZnJlcSkgPyA0ODAwMCA6IDQ0MTAwOworCWlmIChzLT5jb250cm9sX3JlZ2lzdGVyICYgUk1FOTZ4eF9EUykKKwkJdmFsICo9IDI7CisJcmV0dXJuIHZhbDsKK30KKworCisvKiBjb2RlIGZyb20gQUxTQSBjYXJkLXJtZTk2NTIuYyBmb3IgcmV2IDEuNSBTUERJRiByZWNlaXZlciAgIEhQIDIwMDIwMjAxICovCisKK3N0YXRpYyB2b2lkIHJtZTk2eHhfc3BkaWZfc2V0X2JpdCAocm1lOTZ4eF9pbmZvKiBzLCBpbnQgbWFzaywgaW50IG9ub2ZmKQoreworCWlmIChvbm9mZikgCisJCXMtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gbWFzazsKKwllbHNlIAorCQlzLT5jb250cm9sX3JlZ2lzdGVyICY9IH5tYXNrOworCQkKKwl3cml0ZWwocy0+Y29udHJvbF9yZWdpc3RlcixzLT5pb2Jhc2UgKyBSTUU5Nnh4X2NvbnRyb2xfcmVnaXN0ZXIpOworfQorCitzdGF0aWMgdm9pZCBybWU5Nnh4X3NwZGlmX3dyaXRlX2J5dGUgKHJtZTk2eHhfaW5mbyogcywgY29uc3QgaW50IHZhbCkKK3sKKwlsb25nIG1hc2s7CisJbG9uZyBpOworCisJZm9yIChpID0gMCwgbWFzayA9IDB4ODA7IGkgPCA4OyBpKyssIG1hc2sgPj49IDEpIHsKKwkJaWYgKHZhbCAmIG1hc2spCisJCQlybWU5Nnh4X3NwZGlmX3NldF9iaXQgKHMsIFJNRTk2eHhfU1BESUZfV1JJVEUsIDEpOworCQllbHNlIAorCQkJcm1lOTZ4eF9zcGRpZl9zZXRfYml0IChzLCBSTUU5Nnh4X1NQRElGX1dSSVRFLCAwKTsKKworCQlybWU5Nnh4X3NwZGlmX3NldF9iaXQgKHMsIFJNRTk2eHhfU1BESUZfQ0xPQ0ssIDEpOworCQlybWU5Nnh4X3NwZGlmX3NldF9iaXQgKHMsIFJNRTk2eHhfU1BESUZfQ0xPQ0ssIDApOworCX0KK30KKworc3RhdGljIGludCBybWU5Nnh4X3NwZGlmX3JlYWRfYnl0ZSAocm1lOTZ4eF9pbmZvKiBzKQoreworCWxvbmcgbWFzazsKKwlsb25nIHZhbDsKKwlsb25nIGk7CisKKwl2YWwgPSAwOworCisJZm9yIChpID0gMCwgbWFzayA9IDB4ODA7ICBpIDwgODsgaSsrLCBtYXNrID4+PSAxKSB7CisJCXJtZTk2eHhfc3BkaWZfc2V0X2JpdCAocywgUk1FOTZ4eF9TUERJRl9DTE9DSywgMSk7CisJCWlmIChyZWFkbChzLT5pb2Jhc2UgKyBSTUU5Nnh4X3N0YXR1c19yZWdpc3RlcikgJiBSTUU5Nnh4X1NQRElGX1JFQUQpCisJCQl2YWwgfD0gbWFzazsKKwkJcm1lOTZ4eF9zcGRpZl9zZXRfYml0IChzLCBSTUU5Nnh4X1NQRElGX0NMT0NLLCAwKTsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBybWU5Nnh4X3dyaXRlX3NwZGlmX2NvZGVjIChybWU5Nnh4X2luZm8qIHMsIGNvbnN0IGludCBhZGRyZXNzLCBjb25zdCBpbnQgZGF0YSkKK3sKKwlybWU5Nnh4X3NwZGlmX3NldF9iaXQgKHMsIFJNRTk2eHhfU1BESUZfU0VMRUNULCAxKTsKKwlybWU5Nnh4X3NwZGlmX3dyaXRlX2J5dGUgKHMsIDB4MjApOworCXJtZTk2eHhfc3BkaWZfd3JpdGVfYnl0ZSAocywgYWRkcmVzcyk7CisJcm1lOTZ4eF9zcGRpZl93cml0ZV9ieXRlIChzLCBkYXRhKTsKKwlybWU5Nnh4X3NwZGlmX3NldF9iaXQgKHMsIFJNRTk2eHhfU1BESUZfU0VMRUNULCAwKTsKK30KKworCitzdGF0aWMgaW50IHJtZTk2eHhfc3BkaWZfcmVhZF9jb2RlYyAocm1lOTZ4eF9pbmZvKiBzLCBjb25zdCBpbnQgYWRkcmVzcykKK3sKKwlpbnQgcmV0OworCisJcm1lOTZ4eF9zcGRpZl9zZXRfYml0IChzLCBSTUU5Nnh4X1NQRElGX1NFTEVDVCwgMSk7CisJcm1lOTZ4eF9zcGRpZl93cml0ZV9ieXRlIChzLCAweDIwKTsKKwlybWU5Nnh4X3NwZGlmX3dyaXRlX2J5dGUgKHMsIGFkZHJlc3MpOworCXJtZTk2eHhfc3BkaWZfc2V0X2JpdCAocywgUk1FOTZ4eF9TUERJRl9TRUxFQ1QsIDApOworCXJtZTk2eHhfc3BkaWZfc2V0X2JpdCAocywgUk1FOTZ4eF9TUERJRl9TRUxFQ1QsIDEpOworCisJcm1lOTZ4eF9zcGRpZl93cml0ZV9ieXRlIChzLCAweDIxKTsKKwlyZXQgPSBybWU5Nnh4X3NwZGlmX3JlYWRfYnl0ZSAocyk7CisJcm1lOTZ4eF9zcGRpZl9zZXRfYml0IChzLCBSTUU5Nnh4X1NQRElGX1NFTEVDVCwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBybWU5Nnh4X2luaXRpYWxpemVfc3BkaWZfcmVjZWl2ZXIgKHJtZTk2eHhfaW5mbyogcykKK3sKKwkvKiBYWFggd2hhdCB1bnNldHMgdGhpcyA/ICovCisJLyogbm8gaWRlYSA/Pz8gICBIUCAyMDAyMDIwMSAqLworCisJcy0+Y29udHJvbF9yZWdpc3RlciB8PSBSTUU5Nnh4X1NQRElGX1JFU0VUOworCisJcm1lOTZ4eF93cml0ZV9zcGRpZl9jb2RlYyAocywgNCwgMHg0MCk7CisJcm1lOTZ4eF93cml0ZV9zcGRpZl9jb2RlYyAocywgMTcsIDB4MTMpOworCXJtZTk2eHhfd3JpdGVfc3BkaWZfY29kZWMgKHMsIDYsIDB4MDIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBybWU5Nnh4X3NwZGlmX3NhbXBsZV9yYXRlIChybWU5Nnh4X2luZm8gKnMsIGludCAqc3BkaWZyYXRlKQoreworCXVuc2lnbmVkIGludCByYXRlX2JpdHM7CisKKwkqc3BkaWZyYXRlID0gMHgxOworCWlmIChyZWFkbChzLT5pb2Jhc2UgKyBSTUU5Nnh4X3N0YXR1c19yZWdpc3RlcikgJiBSTUU5Nnh4X0VSRikgeworCQlyZXR1cm4gLTE7CS8qIGVycm9yIGNvbmRpdGlvbiAqLworCX0KKwkKKwlpZiAocy0+aHdfcmV2ID09IDE1KSB7CisKKwkJaW50IHgsIHksIHJldDsKKwkJCisJCXggPSBybWU5Nnh4X3NwZGlmX3JlYWRfY29kZWMgKHMsIDMwKTsKKworCQlpZiAoeCAhPSAwKSAKKwkJCXkgPSA0ODAwMCAqIDY0IC8geDsKKwkJZWxzZQorCQkJeSA9IDA7CisKKwkJaWYgICAgICAoeSA+IDMwNDAwICYmIHkgPCAzMzYwMCkgIHtyZXQgPSAzMjAwMDsgKnNwZGlmcmF0ZSA9IDB4Nzt9CisJCWVsc2UgaWYgKHkgPiA0MTkwMCAmJiB5IDwgNDYwMDApICB7cmV0ID0gNDQxMDA7ICpzcGRpZnJhdGUgPSAweDY7fQorCQllbHNlIGlmICh5ID4gNDYwMDAgJiYgeSA8IDUwNDAwKSAge3JldCA9IDQ4MDAwOyAqc3BkaWZyYXRlID0gMHg1O30KKwkJZWxzZSBpZiAoeSA+IDYwODAwICYmIHkgPCA2NzIwMCkgIHtyZXQgPSA2NDAwMDsgKnNwZGlmcmF0ZSA9IDB4MDt9CisJCWVsc2UgaWYgKHkgPiA4MzcwMCAmJiB5IDwgOTIwMDApICB7cmV0ID0gODgyMDA7ICpzcGRpZnJhdGUgPSAweDQ7fQorCQllbHNlIGlmICh5ID4gOTIwMDAgJiYgeSA8IDEwMDAwMCkge3JldCA9IDk2MDAwOyAqc3BkaWZyYXRlID0gMHgzO30KKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXQgPSAwOyAqc3BkaWZyYXRlID0gMHgxO30KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyYXRlX2JpdHMgPSByZWFkbChzLT5pb2Jhc2UgKyBSTUU5Nnh4X3N0YXR1c19yZWdpc3RlcikgJiBSTUU5Nnh4X0Y7CisKKwlzd2l0Y2ggKCpzcGRpZnJhdGUgPSBybWU5Nnh4X2RlY29kZV9zcGRpZl9yYXRlKHJhdGVfYml0cykpIHsKKwljYXNlIDB4NzoKKwkJcmV0dXJuIDMyMDAwOworCQlicmVhazsKKworCWNhc2UgMHg2OgorCQlyZXR1cm4gNDQxMDA7CisJCWJyZWFrOworCisJY2FzZSAweDU6CisJCXJldHVybiA0ODAwMDsKKwkJYnJlYWs7CisKKwljYXNlIDB4NDoKKwkJcmV0dXJuIDg4MjAwOworCQlicmVhazsKKworCWNhc2UgMHgzOgorCQlyZXR1cm4gOTYwMDA7CisJCWJyZWFrOworCisJY2FzZSAweDA6CisJCXJldHVybiA2NDAwMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiB3YXMgYW4gQUxTQSB3YXJuaW5nIC4uLgorCQkgIHNuZF9wcmludGsoIiVzOiB1bmtub3duIFMvUERJRiBpbnB1dCByYXRlIChiaXRzID0gMHgleClcbiIsCisJCSAgcy0+Y2FyZF9uYW1lLCByYXRlX2JpdHMpOworCQkqLworCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorfQorCisvKiBlbmQgb2YgY29kZSBmcm9tIEFMU0EgY2FyZC1ybWU5NjUyLmMgKi8KKworCisKKy8qIHRoZSBod2J1ZiBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyIHNlZW1zIHRvIGhhdmUgc29tZSBqaXR0ZXIsIHRvIGdldCByaWQgb2YKKyAgIGl0LCB3ZSBmaXJzdCBvbmx5IGxldCB0aGUgbnVtYmVycyBncm93LCB0byBiZSBvbiB0aGUgc2VjdXJlIHNpZGUgd2UgCisgICBzdWJ0cmFjdCBhIGNlcnRhaW4gYW1vdW50IFJNRTk2eHhfQlVSU1RCWVRFUyBmcm9tIHRoZSByZXN1bHRpbmcgbnVtYmVyICovCisKKy8qIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBoYXJkd2FyZSBwb2ludGVyIGluIGJ5dGVzICovCisjZGVmaW5lIFJNRTk2eHhfQlVSU1RCWVRFUyAtNjQgIC8qIGJ5dGVzIGJ5IHdoaWNoIGh3cHRyIGNvdWxkIGJlIG9mZiAqLworCitzdGF0aWMgaW5saW5lIGludCBybWU5Nnh4X2dldGh3cHRyKHJtZTk2eHhfaW5mbyogcyxpbnQgZXhhY3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZiAoZXhhY3QpIHsKKwkJdW5zaWduZWQgaW50IGh3cDsKKy8qIHRoZSBod3B0ciBzZWVtcyB0byBiZSByYXRoZXIgdW5yZWxpYWJsZSA6KCwgc28gd2UgZG9uJ3QgdXNlIGl0ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLGZsYWdzKTsKKwkJCisJCWh3cCAgPSByZWFkbChzLT5pb2Jhc2UgKyBSTUU5Nnh4X3N0YXR1c19yZWdpc3RlcikgJiAweGZmYzA7CisJCXMtPmh3cHRyID0gKGh3cCA8IHMtPmh3cHRyKSA/IHMtPmh3cHRyIDogaHdwOworLy8JCXMtPmh3cHRyID0gaHdwOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssZmxhZ3MpOworCQlyZXR1cm4gKHMtPmh3cHRyK1JNRTk2eHhfQlVSU1RCWVRFUykgJiAoKHMtPmZyYWdzaXplPDwxKS0xKTsKKwl9CisJcmV0dXJuIChzLT5od2J1ZmlkID8gcy0+ZnJhZ3NpemUgOiAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJtZTk2eHhfc2V0bGF0ZW5jeShybWU5Nnh4X2luZm8qIHMsaW50IGwpCit7CisJcy0+bGF0ZW5jeSA9IGw7CisJcy0+ZnJhZ3NpemUgPSAxPDwoOCtsKTsKKwlybWU5Nnh4X3Vuc2V0X2N0cmwocyxSTUU5Nnh4X2xhdGVuY3kpOworCXJtZTk2eHhfc2V0X2N0cmwocyxSTUU5Nnh4X1NFVF9MQVRFTkNZKGwpKTsJCit9CisKKworc3RhdGljIHZvaWQgcm1lOTZ4eF9jbGVhcmJ1ZnMoc3RydWN0IGRtYWJ1ZiogZG1hKQoreworCWludCBpLGo7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGNsZWFyIGRtYWJ1ZnMgKi8KKwlmb3IoaT0wO2k8ZGV2aWNlcztpKyspIHsKKwkJZm9yIChqPTA7ajxkbWEtPm91dGNoYW5uZWxzICsgZG1hLT5tb25vO2orKykKKwkJCW1lbXNldCgmZG1hLT5zLT5wbGF5YnVmWyhkbWEtPm91dG9mZnNldCArIGopKlJNRTk2eHhfRE1BX01BWF9TQU1QTEVTXSwgCisJCQkgICAgICAgMCwgUk1FOTZ4eF9ETUFfTUFYX1NJWkUpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hLT5zLT5sb2NrLGZsYWdzKTsKKwlkbWEtPndyaXRlcHRyID0gMDsKKwlkbWEtPnJlYWRwdHIgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYS0+cy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcm1lOTZ4eF9zdGFydGNhcmQocm1lOTZ4eF9pbmZvICpzLGludCBzdG9wKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlDT01NICAgICAgICgic3RhcnRjYXJkIik7CisJaWYocy0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2eHhfSUUpeworCQkvKiBkaXNhYmxlIGludGVycnVwdCBmaXJzdCAqLworCQkKKwkJcm1lOTZ4eF91bnNldF9jdHJsKCBzLFJNRTk2eHhfc3RhcnRfYml0ICk7CisJCXVkZWxheSgxMCk7CisJCXJtZTk2eHhfdW5zZXRfY3RybCggcyxSTUU5Nnh4X0lFKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssZmxhZ3MpOyAvKiB0aW1pbmcgaXMgY3JpdGljYWwgKi8KKwkJcy0+c3RhcnRlZCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssZmxhZ3MpOworCQlpZiAoc3RvcCkgeworCQkgICAgIENPTU0oIlNvdW5kIGNhcmQgc3RvcHBlZCIpOworCQkgICAgIHJldHVybiAxOworCQl9CisJfQorCUNPTU0gICAgICAgKCJpbnRlcnJ1cHQgZGlzYWJsZWQiKTsKKwkvKiBmaXJzdCBpbml0aWFsaXplIGFsbCBwb2ludGVycyBvbiBjYXJkICovCisJZm9yKGk9MDtpPFJNRTk2eHhfbnVtX29mX2luaXRfcmVncztpKyspeworCQl3cml0ZWwoMCxzLT5pb2Jhc2UgKyBpKTsKKwkJdWRlbGF5KDEwKTsgLyogPz8gKi8KKwl9CisJQ09NTSAgICAgICAoInJlZ3MgY2xlYW5lZCIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssZmxhZ3MpOyAvKiB0aW1pbmcgaXMgY3JpdGljYWwgKi8KKwl1ZGVsYXkoMTApOworCXMtPnN0YXJ0ZWQgPSAxOworCXMtPmh3cHRyID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLGZsYWdzKTsKKworCXJtZTk2eHhfc2V0X2N0cmwoIHMsIFJNRTk2eHhfSUUgfCBSTUU5Nnh4X3N0YXJ0X2JpdCk7CisKKworCUNPTU0oIlNvdW5kIGNhcmQgc3RhcnRlZCIpOworICAKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBybWU5Nnh4X2dldG9zcGFjZShzdHJ1Y3QgZG1hYnVmICogZG1hLCB1bnNpZ25lZCBpbnQgaHdwKQoreworCWludCBjbnQ7CisJaW50ICBzd3B0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYS0+cy0+bG9jayxmbGFncyk7IAorCXN3cHRyID0gZG1hLT53cml0ZXB0cjsKKwljbnQgPSAoaHdwIC0gc3dwdHIpOworCQorCWlmIChjbnQgPCAwKSB7CisJICAgICBjbnQgPSAoKGRtYS0+cy0+ZnJhZ3NpemU8PDEpIC0gc3dwdHIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWEtPnMtPmxvY2ssZmxhZ3MpOworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJtZTk2eHhfZ2V0aXNwYWNlKHN0cnVjdCBkbWFidWYgKiBkbWEsIHVuc2lnbmVkIGludCBod3ApCit7CisJaW50IGNudDsKKwlpbnQgIHN3cHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hLT5zLT5sb2NrLGZsYWdzKTsgCisJc3dwdHIgPSBkbWEtPnJlYWRwdHI7CisJY250ID0gKGh3cCAtIHN3cHRyKTsKKwkgCisJaWYgKGNudCA8IDApIHsKKwkJY250ID0gKChkbWEtPnMtPmZyYWdzaXplPDwxKSAtIHN3cHRyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hLT5zLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gY250OworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHJtZTk2eHhfY29weWZyb211c2VyKHN0cnVjdCBkbWFidWYqIGRtYSxjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlcixpbnQgY291bnQsaW50IGhvcCkKK3sKKwlpbnQgc3dwdHIgPSBkbWEtPndyaXRlcHRyOworCXN3aXRjaCAoZG1hLT5mb3JtYXQpIHsKKwljYXNlIEFGTVRfUzMyX0JMT0NLRUQ6CisJeworCSAgICAgY2hhciBfX3VzZXIgKiBidWYgPSAoY2hhciBfX3VzZXIgKilidWZmZXI7CisJICAgICBpbnQgY250ID0gY291bnQvZG1hLT5vdXRjaGFubmVsczsKKwkgICAgIGludCBpOworCSAgICAgZm9yIChpPTA7aSA8IGRtYS0+b3V0Y2hhbm5lbHM7aSsrKSB7CisJCSAgY2hhciogaHdidWYgPShjaGFyKikgJmRtYS0+cy0+cGxheWJ1ZlsoZG1hLT5vdXRvZmZzZXQgKyBpKSpSTUU5Nnh4X0RNQV9NQVhfU0FNUExFU107CisJCSAgaHdidWYrPXN3cHRyOworCisJCSAgaWYgKGNvcHlfZnJvbV91c2VyKGh3YnVmLGJ1ZiwgY250KSkKKwkJICAgICAgIHJldHVybiAtMTsKKwkJICBidWYrPWhvcDsKKwkgICAgIH0KKwkgICAgIHN3cHRyKz1jbnQ7CisJICAgICBicmVhazsKKwl9CisJY2FzZSBBRk1UX1MxNl9MRToKKwl7CisJICAgICBpbnQgaSxqOworCSAgICAgaW50IGNudCA9IGNvdW50L2RtYS0+b3V0Y2hhbm5lbHM7CisJICAgICBmb3IgKGk9MDtpIDwgZG1hLT5vdXRjaGFubmVscyArIGRtYS0+bW9ubztpKyspIHsKKwkJICAgICBzaG9ydCBfX3VzZXIgKiBzYnVmID0gKHNob3J0IF9fdXNlciAqKWJ1ZmZlciArIGkqKCFkbWEtPm1vbm8pOworCQkgICAgIHNob3J0KiBod2J1ZiA9KHNob3J0KikgJmRtYS0+cy0+cGxheWJ1ZlsoZG1hLT5vdXRvZmZzZXQgKyBpKSpSTUU5Nnh4X0RNQV9NQVhfU0FNUExFU107CSAgICAgCisJCSAgICAgaHdidWYrPShzd3B0cj4+MSk7CisJCSAgICAgZm9yIChqPTA7ajwoY250Pj4xKTtqKyspIHsKKwkJCSAgICAgaHdidWYrKzsgLyogc2tpcCB0aGUgbG93IDE2IGJpdHMgKi8KKwkJCSAgICAgX19nZXRfdXNlcigqaHdidWYrKyxzYnVmKyspOworCQkJICAgICBzYnVmKz0oZG1hLT5vdXRjaGFubmVscy0xKTsKKwkJICAgICB9CisJICAgICB9CisJICAgICBzd3B0ciArPSAoY250PDwxKTsKKwkgICAgIGJyZWFrOworCX0KKwlkZWZhdWx0OgorCSAgICAgcHJpbnRrKFJNRV9NRVNTIiB1bnN1cHBvcnRlZCBmb3JtYXRcbiIpOworCSAgICAgcmV0dXJuIC0xOworCX0gLyogc3dpdGNoICovCisKKwlzd3B0ciY9KChkbWEtPnMtPmZyYWdzaXplPDwxKSAtMSk7CisJZG1hLT53cml0ZXB0ciA9IHN3cHRyOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBjb3VudCBhcmd1bWVudCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzICovCitzdGF0aWMgaW5saW5lIGludCBybWU5Nnh4X2NvcHl0b3VzZXIoc3RydWN0IGRtYWJ1ZiogZG1hLGNvbnN0IGNoYXIgX191c2VyKiBidWZmZXIsaW50IGNvdW50LGludCBob3ApCit7CisJaW50IHN3cHRyID0gZG1hLT5yZWFkcHRyOworCXN3aXRjaCAoZG1hLT5mb3JtYXQpIHsKKwljYXNlIEFGTVRfUzMyX0JMT0NLRUQ6CisJeworCSAgICAgY2hhciBfX3VzZXIgKiBidWYgPSAoY2hhciBfX3VzZXIgKilidWZmZXI7CisJICAgICBpbnQgY250ID0gY291bnQvZG1hLT5pbmNoYW5uZWxzOworCSAgICAgaW50IGk7CisKKwkgICAgIGZvciAoaT0wO2kgPCBkbWEtPmluY2hhbm5lbHM7aSsrKSB7CisJCSAgY2hhciogaHdidWYgPShjaGFyKikgJmRtYS0+cy0+cmVjYnVmWyhkbWEtPmlub2Zmc2V0ICsgaSkqUk1FOTZ4eF9ETUFfTUFYX1NBTVBMRVNdOworCQkgIGh3YnVmKz1zd3B0cjsKKworCQkgIGlmIChjb3B5X3RvX3VzZXIoYnVmLGh3YnVmLGNudCkpCisJCSAgICAgICByZXR1cm4gLTE7CisJCSAgYnVmKz1ob3A7CisJICAgICB9CisJICAgICBzd3B0cis9Y250OworCSAgICAgYnJlYWs7CisJfQorCWNhc2UgQUZNVF9TMTZfTEU6CisJeworCSAgICAgaW50IGksajsKKwkgICAgIGludCBjbnQgPSBjb3VudC9kbWEtPmluY2hhbm5lbHM7CisJICAgICBmb3IgKGk9MDtpIDwgZG1hLT5pbmNoYW5uZWxzO2krKykgeworCQkgIHNob3J0IF9fdXNlciAqIHNidWYgPSAoc2hvcnQgX191c2VyICopYnVmZmVyICsgaTsKKwkJICBzaG9ydCogaHdidWYgPShzaG9ydCopICZkbWEtPnMtPnJlY2J1ZlsoZG1hLT5pbm9mZnNldCArIGkpKlJNRTk2eHhfRE1BX01BWF9TQU1QTEVTXTsJICAgICAKKwkJICBod2J1Zis9KHN3cHRyPj4xKTsKKwkJICBmb3IgKGo9MDtqPChjbnQ+PjEpO2orKykgeworCQkgICAgICAgaHdidWYrKzsKKwkJICAgICAgIF9fcHV0X3VzZXIoKmh3YnVmKyssc2J1ZisrKTsKKwkJICAgICAgIHNidWYrPShkbWEtPmluY2hhbm5lbHMtMSk7CisJCSAgfQorCSAgICAgfQorCSAgICAgc3dwdHIgKz0gKGNudDw8MSk7CisJICAgICBicmVhazsKKwl9CisJZGVmYXVsdDoKKwkgICAgIHByaW50ayhSTUVfTUVTUyIgdW5zdXBwb3J0ZWQgZm9ybWF0XG4iKTsKKwkgICAgIHJldHVybiAtMTsKKwl9IC8qIHN3aXRjaCAqLworCQorCXN3cHRyJj0oKGRtYS0+cy0+ZnJhZ3NpemU8PDEpIC0xKTsJCisJZG1hLT5yZWFkcHRyID0gc3dwdHI7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHJtZTk2eHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGk7CisJcm1lOTZ4eF9pbmZvICpzID0gKHJtZTk2eHhfaW5mbyAqKWRldl9pZDsKKwlzdHJ1Y3QgZG1hYnVmICpkYjsKKwl1MzIgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdGF0dXMgPSByZWFkbChzLT5pb2Jhc2UgKyBSTUU5Nnh4X3N0YXR1c19yZWdpc3Rlcik7CisJaWYgKCEoc3RhdHVzICYgUk1FOTZ4eF9JUlEpKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jayxmbGFncyk7CisJd3JpdGVsKDAscy0+aW9iYXNlICsgUk1FOTZ4eF9pcnFfY2xlYXIpOworCisJcy0+aHdidWZpZCA9IChzdGF0dXMgJiBSTUU5Nnh4X2J1ZmZlcl9pZCk+PjI2OwkKKwlpZiAoKHN0YXR1cyAmIDB4ZmZjMCkgPD0gMjU2KSBzLT5od3B0ciA9IDA7IAorCWZvcihpPTA7aTxkZXZpY2VzO2krKykKKwl7CisJCWRiID0gJihzLT5kbWFbaV0pOworCQlpZihkYi0+c3RhcnRlZCA+IDApCisJCQl3YWtlX3VwKCYoZGItPndhaXQpKTsJCQorCX0gIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyBQQ0kgZGV0ZWN0aW9uIGFuZCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gc3R1ZmYgCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkKiBidXNtYXN0ZXJfbWFsbG9jKGludCBzaXplKSB7CisgICAgIGludCBwZzsgLyogMiBzIGV4cG9uZW50IG9mIG1lbW9yeSBzaXplICovCisgICAgICAgIGNoYXIgKmJ1ZjsKKworICAgICAgICBEQkcocHJpbnRrKCJrZXJuZWwgbWFsbG9jIHBhZ2VzIC4uXG4iKSk7CisgICAgICAgIAorICAgICAgICBmb3IgKHBnID0gMDsgUEFHRV9TSVpFICogKDEgPDwgcGcpIDwgc2l6ZTsgcGcrKyk7CisKKyAgICAgICAgYnVmID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgR0ZQX0RNQSwgcGcpOworCisgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcGFnZSogcGFnZSwgKmxhc3RfcGFnZTsKKworICAgICAgICAgICAgICAgIHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYnVmKTsKKyAgICAgICAgICAgICAgICBsYXN0X3BhZ2UgPSB2aXJ0X3RvX3BhZ2UoYnVmICsgKDEgPDwgcGcpKTsKKyAgICAgICAgICAgICAgICBEQkcocHJpbnRrKCJzZXR0aW5nIHJlc2VydmVkIGJpdFxuIikpOworICAgICAgICAgICAgICAgIHdoaWxlIChwYWdlIDwgbGFzdF9wYWdlKSB7CisJCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlKys7CisgICAgICAgICAgICAgICAgfQorCQlyZXR1cm4gYnVmOworICAgICAgICB9CisJREJHKHByaW50aygiYWxsb2NhdGVkICVsZCIsKGxvbmcpYnVmKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGJ1c21hc3Rlcl9mcmVlKHZvaWQqIHB0cixpbnQgc2l6ZSkgeworICAgICAgICBpbnQgcGc7CisJc3RydWN0IHBhZ2UqIHBhZ2UsICpsYXN0X3BhZ2U7CisKKyAgICAgICAgaWYgKHB0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IgKHBnID0gMDsgUEFHRV9TSVpFICogKDEgPDwgcGcpIDwgc2l6ZTsgcGcrKyk7CisKKyAgICAgICAgcGFnZSA9IHZpcnRfdG9fcGFnZShwdHIpOworICAgICAgICBsYXN0X3BhZ2UgPSBwYWdlICsgKDEgPDwgcGcpOworICAgICAgICB3aGlsZSAocGFnZSA8IGxhc3RfcGFnZSkgeworCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcGFnZSsrOworCX0KKwlEQkcocHJpbnRrKCJmcmVlaW5nIHBhZ2VzXG4iKSk7CisgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHB0ciwgcGcpOworCURCRyhwcmludGsoImRvbmVcbiIpKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aG9zZSBwYXJ0cyBvZiB0aGUgaW5mbyBzdHJ1Y3R1cmUgd2hpY2ggYXJlIG5vdCBwY2kgZGV0ZWN0YWJsZSByZXNvdXJjZXMgKi8KKworc3RhdGljIGludCBybWU5Nnh4X2RtYWJ1Zl9pbml0KHJtZTk2eHhfaW5mbyAqIHMsc3RydWN0IGRtYWJ1ZiogZG1hLGludCBpb2Zmc2V0LGludCBvb2Zmc2V0KSB7CisKKwlpbml0X01VVEVYKCZkbWEtPm9wZW5fc2VtKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWEtPm9wZW5fd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hLT53YWl0KTsKKwlkbWEtPnMgPSBzOyAKKwlkbWEtPmVycm9yID0gMDsKKworCWRtYS0+Zm9ybWF0ID0gQUZNVF9TMzJfQkxPQ0tFRDsKKwlkbWEtPmZvcm1hdHNoaWZ0ID0gMDsKKwlkbWEtPmluY2hhbm5lbHMgPSBkbWEtPm91dGNoYW5uZWxzID0gMTsKKwlkbWEtPmlub2Zmc2V0ID0gaW9mZnNldDsKKwlkbWEtPm91dG9mZnNldCA9IG9vZmZzZXQ7CisKKwlkbWEtPm9wZW5lZD0wOworCWRtYS0+c3RhcnRlZD0wOworCWRtYS0+bW1hcHBlZD0wOworCWRtYS0+b3Blbl9tb2RlPTA7CisJZG1hLT5tb25vPTA7CisKKwlybWU5Nnh4X2NsZWFyYnVmcyhkbWEpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcm1lOTZ4eF9pbml0KHJtZTk2eHhfaW5mbyogcykKK3sKKwlpbnQgaTsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IHJldjsKKworCURCRyhwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwludW1jYXJkcysrOworCisJcy0+bWFnaWMgPSBSTUU5Nnh4X01BR0lDOyAKKworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKworCUNPTU0gICAgICAgICAgICAoInNldHVwIGJ1c21hc3RlciBtZW1vcnkiKQorCXMtPnJlY2J1ZiA9IGJ1c21hc3Rlcl9tYWxsb2MoUk1FOTZ4eF9ETUFfTUFYX1NJWkVfQUxMKTsKKwlzLT5wbGF5YnVmID0gYnVzbWFzdGVyX21hbGxvYyhSTUU5Nnh4X0RNQV9NQVhfU0laRV9BTEwpOworCisJaWYgKCFzLT5yZWNidWYgfHwgIXMtPnBsYXlidWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFJNRV9NRVNTIiBVbmFibGUgdG8gYWxsb2NhdGUgYnVzbWFzdGVyIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCUNPTU0gICAgICAgICAgICAoInNldHRpbmcgcmVjIGFuZCBwbGF5YnVmZmVycyIpCisKKwl3cml0ZWwoKHUzMikgdmlydF90b19idXMocy0+cmVjYnVmKSxzLT5pb2Jhc2UgKyBSTUU5Nnh4X3JlY19idWZmZXIpOworICAJd3JpdGVsKCh1MzIpIHZpcnRfdG9fYnVzKHMtPnBsYXlidWYpLHMtPmlvYmFzZSArIFJNRTk2eHhfcGxheV9idWZmZXIpOworCisJQ09NTSAgICAgICAgICAgICAoImluaXRpYWxpemluZyBjb250cm9sIHJlZ2lzdGVyIikKKwlybWU5Nnh4X3Vuc2V0X2N0cmwocywweGZmZmZmZmZmKTsKKwlybWU5Nnh4X3NldF9jdHJsKHMsUk1FOTZ4eF9jdHJsX2luaXQpOworCisKKwlDT01NICAgICAgICAgICAgICAoInNldHVwIGRldmljZXMiKQkKKwlmb3IgKGk9MDtpIDwgZGV2aWNlcztpKyspIHsKKwkJc3RydWN0IGRtYWJ1ZiAqIGRtYSA9ICZzLT5kbWFbaV07CisJCXJtZTk2eHhfZG1hYnVmX2luaXQocyxkbWEsMippLDIqaSk7CisJfQorCisJLyogY29kZSBmcm9tIEFMU0EgY2FyZC1ybWU5NjUyLmMgICBIUCAyMDAyMDIwMSAqLworICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGgvdyByZXYgbGV2ZWwgb2YgdGhlIGNhcmQuIFRoaXMgc2VlbXMgbGlrZQorCSAgIGEgcGFydGljdWxhcmx5IGtsdWRneSB3YXkgdG8gZW5jb2RlIGl0LCBidXQgaXRzIHdoYXQgUk1FCisJICAgY2hvc2UgdG8gZG8sIHNvIHdlIGZvbGxvdyB0aGVtIC4uLgorCSovCisKKwlzdGF0dXMgPSByZWFkbChzLT5pb2Jhc2UgKyBSTUU5Nnh4X3N0YXR1c19yZWdpc3Rlcik7CisJaWYgKHJtZTk2eHhfZGVjb2RlX3NwZGlmX3JhdGUoc3RhdHVzJlJNRTk2eHhfRikgPT0gMSkgeworCQlzLT5od19yZXYgPSAxNTsKKwl9IGVsc2UgeworCQlzLT5od19yZXYgPSAxMTsKKwl9CisKKwkvKiBEaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHN0YW5kYXJkIEhhbW1lcmZhbGwsIGFuZCB0aGUKKwkgICAiTGlnaHQiLCB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZSBleHBhbnNpb24gYm9hcmQuIFRoaXMKKwkgICBtZXRob2QgY29tZXMgZnJvbSBpbmZvcm1hdGlvbiByZWNlaXZlZCBmcm9tIE1hdGhoaWFzCisJICAgQ2xhdXNlbiBhdCBSTUUuIERpc3BsYXkgdGhlIEVFUFJPTSBhbmQgaC93IHJldklEIHdoZXJlCisJICAgcmVsZXZhbnQuICAKKwkqLworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocy0+cGNpZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZyZXYpOworCXN3aXRjaCAocmV2ICYgMHhmZikgeworCWNhc2UgODogLyogb3JpZ2luYWwgZXByb20gKi8KKwkJaWYgKHMtPmh3X3JldiA9PSAxNSkgeworCQkJcy0+Y2FyZF9uYW1lID0gIlJNRSBEaWdpOTYzNiAoUmV2IDEuNSkiOworCQl9IGVsc2UgeworCQkJcy0+Y2FyZF9uYW1lID0gIlJNRSBEaWdpOTYzNiI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA5OiAvKiBXMzZfRyBFUFJPTSAqLworCQlzLT5jYXJkX25hbWUgPSAiUk1FIERpZ2k5NjM2IChSZXYgRykiOworCQlicmVhazsKKwljYXNlIDQ6IC8qIFc1Ml9HIEVQUk9NICovCisJCXMtPmNhcmRfbmFtZSA9ICJSTUUgRGlnaTk2NTIgKFJldiBHKSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSAzOiAvKiBvcmlnaW5hbCBlcHJvbSAqLworCQlpZiAocy0+aHdfcmV2ID09IDE1KSB7CisJCQlzLT5jYXJkX25hbWUgPSAiUk1FIERpZ2k5NjUyIChSZXYgMS41KSI7CisJCX0gZWxzZSB7CisJCQlzLT5jYXJkX25hbWUgPSAiUk1FIERpZ2k5NjUyIjsKKwkJfQorCQlicmVhazsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFJNRV9NRVNTIiBkZXRlY3RlZCAlcyAoaHdfcmV2ICVkKVxuIixzLT5jYXJkX25hbWUscy0+aHdfcmV2KTsgCisKKwlpZiAocy0+aHdfcmV2ID09IDE1KQorCQlybWU5Nnh4X2luaXRpYWxpemVfc3BkaWZfcmVjZWl2ZXIgKHMpOworCisJcy0+c3RhcnRlZCA9IDA7CisJcm1lOTZ4eF9zZXRsYXRlbmN5KHMsNyk7CisKKwlwcmludGsoS0VSTl9JTkZPIFJNRV9NRVNTIiBjYXJkICVkIGluaXRpYWxpemVkXG4iLG51bWNhcmRzKTsgCisJcmV0dXJuIDA7Cit9CisKKworLyogb3BlbiB1c2VzIHRoaXMgdG8gZmlndXJlIG91dCB3aGljaCBkZXZpY2Ugd2FzIG9wZW5lZCAuLiB0aGlzIHNlZW1zIHRvIGJlIAorICAgdW5uZWNlc3NhcnkgY29tcGxleCAqLworCitzdGF0aWMgTElTVF9IRUFEKGRldnMpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBybWU5Nnh4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKK3sKKwlpbnQgaTsKKwlybWU5Nnh4X2luZm8gKnM7CisKKwlEQkcocHJpbnRrKCIlc1xuIiwgX19GVU5DVElPTl9fKSk7CisJCisJaWYgKHBjaWRldi0+aXJxID09IDApIAorCQlyZXR1cm4gLTE7CisJaWYgKCFwY2lfZG1hX3N1cHBvcnRlZChwY2lkZXYsIDB4ZmZmZmZmZmYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUk1FX01FU1MiIGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIShzID0ga21hbGxvYyhzaXplb2Yocm1lOTZ4eF9pbmZvKSwgR0ZQX0tFUk5FTCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUk1FX01FU1MiIG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChzLCAwLCBzaXplb2Yocm1lOTZ4eF9pbmZvKSk7CisKKwlzLT5wY2lkZXYgPSBwY2lkZXY7CisJcy0+aW9iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKSxSTUU5Nnh4X0lPX0VYVEVOVCk7CisJcy0+aXJxID0gcGNpZGV2LT5pcnE7CisKKyAgICAgICAgREJHKHByaW50aygicmVtYXBwZWQgaW9iYXNlOiAlbHggaXJxICVkXG4iLChsb25nKXMtPmlvYmFzZSxzLT5pcnEpKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKQorCQlnb3RvIGVycl9pcnE7CisJaWYgKHJlcXVlc3RfaXJxKHMtPmlycSwgcm1lOTZ4eF9pbnRlcnJ1cHQsIFNBX1NISVJRLCAicm1lOTZ4eCIsIHMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBSTUVfTUVTUyIgaXJxICV1IGluIHVzZVxuIiwgcy0+aXJxKTsKKwkJZ290byBlcnJfaXJxOworCX0KKwkKKwkvKiBpbml0aWFsaXplIHRoZSBjYXJkICovCisKKwlpID0gMDsKKwlpZiAocm1lOTZ4eF9pbml0KHMpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUk1FX01FU1MiIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2RldmljZXM7CisJfQorCWZvciAoaT0wO2k8ZGV2aWNlcztpKyspIHsKKwkJaWYgKChzLT5kc3BudW1baV0gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJnJtZTk2eHhfYXVkaW9fZm9wcywgLTEpKSA8IDApCisJCQlnb3RvIGVycl9kZXZpY2VzOworCX0KKworCWlmICgocy0+bWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmcm1lOTZ4eF9taXhlcl9mb3BzLCAtMSkpIDwgMCkKKwkJZ290byBlcnJfZGV2aWNlczsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHMpOworCXBjaWRldi0+ZG1hX21hc2sgPSAweGZmZmZmZmZmOyAvKiA/Pz8/PyAqLworCS8qIHB1dCBpdCBpbnRvIGRyaXZlciBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmcy0+ZGV2cywgJmRldnMpOworCisJREJHKHByaW50aygiaW5pdGlhbGl6YXRpb24gc3VjY2Vzc2Z1bFxuIikpOworCXJldHVybiAwOworCisJLyogZXJyb3IgaGFuZGxlciAqLworIGVycl9kZXZpY2VzOgorCXdoaWxlIChpLS0pIAorCQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kc3BudW1baV0pOworCWZyZWVfaXJxKHMtPmlycSxzKTsKKyBlcnJfaXJxOgorCWtmcmVlKHMpOworCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcm1lOTZ4eF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgaTsKKwlybWU5Nnh4X2luZm8gKnMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghcykgeworCQlwcmludGsoS0VSTl9FUlIiZGV2aWNlIHN0cnVjdHVyZSBub3QgdmFsaWRcbiIpOworCQlyZXR1cm4gOworCX0KKworCWlmIChzLT5zdGFydGVkKSBybWU5Nnh4X3N0YXJ0Y2FyZChzLDApOworCisJaSA9IGRldmljZXM7CisJd2hpbGUgKGkpIHsKKwkJaS0tOworCQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kc3BudW1baV0pOworCX0KKwkKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPm1peGVyKTsKKwlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwlmcmVlX2lycShzLT5pcnEscyk7CisJYnVzbWFzdGVyX2ZyZWUocy0+cmVjYnVmLFJNRTk2eHhfRE1BX01BWF9TSVpFX0FMTCk7CisJYnVzbWFzdGVyX2ZyZWUocy0+cGxheWJ1ZixSTUU5Nnh4X0RNQV9NQVhfU0laRV9BTEwpOworCWtmcmVlKHMpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9STUUgCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUk1FIDB4MTBlZQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUk1FOTY1MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JNRTk2NTIgMHgzZmM0CisjZW5kaWYKKyNpZm5kZWYgUENJX0FOWV9JRAorI2RlZmluZSBQQ0lfQU5ZX0lEIDAKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwl7CisJCS52ZW5kb3IJICAgPSBQQ0lfVkVORE9SX0lEX1JNRSwKKwkJLmRldmljZQkgICA9IFBDSV9ERVZJQ0VfSURfUk1FOTY1MiwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCX0sCisJeyAwLCB9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJtZTk2eHhfZHJpdmVyID0geworCS5uYW1lCSAgPSAgInJtZTk2eHgiLAorCS5pZF90YWJsZSA9IGlkX3RhYmxlLAorCS5wcm9iZQkgID0gcm1lOTZ4eF9wcm9iZSwKKwkucmVtb3ZlCSAgPSBfX2RldmV4aXRfcChybWU5Nnh4X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3JtZTk2eHgodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIFJNRV9NRVNTIiB2ZXJzaW9uICJSTUVWRVJTSU9OIiB0aW1lICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOworCWRldmljZXMgPSAoKGRldmljZXMtMSkgJiBSTUU5Nnh4X01BU0tfREVWUykgKyAxOworCXByaW50ayhLRVJOX0lORk8gUk1FX01FU1MiIHJlc2VydmluZyAlZCBkc3AgZGV2aWNlKHMpXG4iLGRldmljZXMpOworICAgICAgICBudW1jYXJkcyA9IDA7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcm1lOTZ4eF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9ybWU5Nnh4KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBSTUVfTUVTUyIgdW5sb2FkaW5nXG4iKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnJtZTk2eHhfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ybWU5Nnh4KTsKK21vZHVsZV9leGl0KGNsZWFudXBfcm1lOTZ4eCk7CisKKworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgIEltcGxlbWVudGF0aW9uIG9mIGZpbGUgb3BlcmF0aW9ucyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgUk1FOTZ4eF9GTVQgKEFGTVRfUzE2X0xFfEFGTVRfVTh8QUZNVF9TMzJfQkxPQ0tFRCkKKy8qIEFGVE1fVTggaXMgbm90ICh5ZXQ/KSBzdXBwb3J0ZWQgLi4uICBIUDIwMDIwMjAxICovCisKK3N0YXRpYyBpbnQgcm1lOTZ4eF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmluLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGRtYWJ1ZiAqIGRtYSA9IChzdHJ1Y3QgZG1hYnVmICopZmlsZS0+cHJpdmF0ZV9kYXRhOyAKKwlybWU5Nnh4X2luZm8gKnMgPSBkbWEtPnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgYXVkaW9fYnVmX2luZm8gYWJpbmZvOworICAgICAgICBjb3VudF9pbmZvIGNpbmZvOworCWludCBjb3VudDsKKwlpbnQgdmFsID0gMDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCisJREJHKHByaW50aygiaW9jdGwgJXVkXG4iLGNtZCkpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKyNpZiAwCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMyKHMsIDAvKmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKi8pOworI2VuZGlmCisJCXJldHVybiAwOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKy8vCQlybWU5Nnh4X2NsZWFyYnVmcyhkbWEpOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisvKiBnZW5lcmFsbHkgaXQncyBub3QgYSBwcm9ibGVtIGlmIHdlIGNoYW5nZSB0aGUgc3BlZWQgCisJCQlpZiAoZG1hLT5vcGVuX21vZGUgJiAofmZpbGUtPmZfbW9kZSkgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCQkJc3dpdGNoICh2YWwpIHsKKwkJCWNhc2UgNDQxMDA6CisJCQljYXNlIDg4MjAwOgorCQkJCXJtZTk2eHhfdW5zZXRfY3RybChzLFJNRTk2eHhfZnJlcSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ4MDAwOiAKKwkJCWNhc2UgOTYwMDA6IAorCQkJCXJtZTk2eHhfc2V0X2N0cmwocyxSTUU5Nnh4X2ZyZXEpOworCQkJCWJyZWFrOworCQkJLyoganVzdCByZXBvcnQgY3VycmVudCByYXRlIGFzIGRlZmF1bHQKKwkJCSAgIGUuZy4gdXNlIDAgdG8gInNlbGVjdCIgY3VycmVudCBkaWdpdGFsIGlucHV0IHJhdGUKKwkJCWRlZmF1bHQ6CisJCQkJcm1lOTZ4eF91bnNldF9jdHJsKHMsUk1FOTZ4eF9mcmVxKTsKKwkJCQl2YWwgPSA0NDEwMDsKKwkJCSovCisJCQl9CisJCQlpZiAodmFsID4gNTAwMDApCisJCQkJcm1lOTZ4eF9zZXRfY3RybChzLFJNRTk2eHhfRFMpOworCQkJZWxzZQorCQkJCXJtZTk2eHhfdW5zZXRfY3RybChzLFJNRTk2eHhfRFMpOworCQkJLyogc2V0IHZhbCB0byBhY3R1YWwgdmFsdWUgIEhQIDIwMDIwMjAxICovCisJCQkvKiBOT1RFOiBpZiBub3QgIlN5bmMgTWFzdGVyIiwgcmVwb3J0ZWQgcmF0ZSBtaWdodCBiZSBub3QgeWV0ICJ1cGRhdGVkIiAuLi4gYnV0IEkgZG9uJ3Qgd2FudCB0byBpbnNlcnQgYSBsb25nIHVkZWxheSgpIGhlcmUgKi8KKwkJCWlmICgocy0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2eHhfTWFzdGVyKSAmJiAhKHMtPmNvbnRyb2xfcmVnaXN0ZXIgJiBSTUU5Nnh4X3dzZWwpKQorCQkJCXZhbCA9IHJtZTk2eHhfZ2V0X3NhbXBsZV9yYXRlX2N0cmwocyk7CisJCQllbHNlCisJCQkJdmFsID0gcm1lOTZ4eF9nZXRfc2FtcGxlX3JhdGVfc3RhdHVzKHMpOworCQkJcy0+cmF0ZSA9IHZhbDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlEQkcocHJpbnRrKCJzcGVlZCBzZXQgdG8gJWRcbiIsdmFsKSk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzogLyogdGhpcyBwbGF5cyBhIG1vbm8gZmlsZSBvbiB0d28gY2hhbm5lbHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQkKKwkJaWYgKCF2YWwpIHsKKwkJCURCRyhwcmludGsoInNldHRpbmcgdG8gbW9ub1xuIikpOyAKKwkJCWRtYS0+bW9ubz0xOyAKKwkJCWRtYS0+aW5jaGFubmVscyA9IDE7CisJCQlkbWEtPm91dGNoYW5uZWxzID0gMTsKKwkJfQorCQllbHNlIHsKKwkJCURCRyhwcmludGsoInNldHRpbmcgdG8gc3RlcmVvXG4iKSk7IAorCQkJZG1hLT5tb25vID0gMDsKKwkJCWRtYS0+aW5jaGFubmVscyA9IDI7CisJCQlkbWEtPm91dGNoYW5uZWxzID0gMjsKKwkJfQorCQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQkvKiByZW1lbWJlciB0byBjaGVjayBmb3IgcmVzb25hYmxlIG9mZnNldC9jaGFubmVsIHBhaXJzIGhlcmUgKi8KKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeyAJCQkKKwkJCWlmICh2YWwgPiAwICYmIChkbWEtPm91dG9mZnNldCArIHZhbCkgPD0gUk1FOTZ4eF9DSEFOTkVMU19QRVJfQ0FSRCkgCisJCQkJZG1hLT5vdXRjaGFubmVscyA9IHZhbDsKKwkJCWVsc2UKKwkJCQlkbWEtPm91dGNoYW5uZWxzID0gdmFsID0gMjsKKwkJCURCRyhwcmludGsoInNldHRpbmcgdG8gb3V0Y2hhbm5lbHMgJWRcbiIsdmFsKSk7IAorCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAodmFsID4gMCAmJiAoZG1hLT5pbm9mZnNldCArIHZhbCkgPD0gUk1FOTZ4eF9DSEFOTkVMU19QRVJfQ0FSRCkgCisJCQkJZG1hLT5pbmNoYW5uZWxzID0gdmFsOworCQkJZWxzZQorCQkJCWRtYS0+aW5jaGFubmVscyA9IHZhbCA9IDI7CisJCQlEQkcocHJpbnRrKCJzZXR0aW5nIHRvIGluY2hhbm5lbHMgJWRcbiIsdmFsKSk7IAorCQl9CisKKwkJZG1hLT5tb25vPTA7CisKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihSTUU5Nnh4X0ZNVCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCURCRyhwcmludGsoInNldHRpbmcgdG8gZm9ybWF0ICV4XG4iLHZhbCkpOyAKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlpZiAodmFsICYgUk1FOTZ4eF9GTVQpCisJCQkJZG1hLT5mb3JtYXQgPSB2YWw7CisJCQlzd2l0Y2ggKGRtYS0+Zm9ybWF0KSB7CisJCQljYXNlIEFGTVRfUzE2X0xFOgorCQkJCWRtYS0+Zm9ybWF0c2hpZnQ9MTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUZNVF9TMzJfQkxPQ0tFRDoKKwkJCQlkbWEtPmZvcm1hdHNoaWZ0PTA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKGRtYS0+Zm9ybWF0LCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCXZhbCA9IDA7CisjaWYgMAorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5jdHJsICYgQ1RSTF9BRENfRU4pIAorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5jdHJsICYgQ1RSTF9EQUMyX0VOKSAKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisjaWYgMAorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9hZGMocyk7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzdGFydF9kYWMyKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9kYWMyKHMpOworCQl9CisjZW5kaWYKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl2YWwgPSBybWU5Nnh4X2dldGh3cHRyKGRtYS0+cywwKTsKKworCisJCWNvdW50ID0gcm1lOTZ4eF9nZXRvc3BhY2UoZG1hLHZhbCk7CisJCWlmICghcy0+c3RhcnRlZCkgY291bnQgPSBzLT5mcmFnc2l6ZSoyOworCQlhYmluZm8uZnJhZ3NpemUgPShzLT5mcmFnc2l6ZSpkbWEtPm91dGNoYW5uZWxzKT4+ZG1hLT5mb3JtYXRzaGlmdDsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSAoY291bnQqZG1hLT5vdXRjaGFubmVscyk+PmRtYS0+Zm9ybWF0c2hpZnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSAyOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSAoY291bnQgPiBzLT5mcmFnc2l6ZSk7IAorCisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXZhbCA9IHJtZTk2eHhfZ2V0aHdwdHIoZG1hLT5zLDApOworCisJCWNvdW50ID0gcm1lOTZ4eF9nZXRpc3BhY2UoZG1hLHZhbCk7CisKKwkJYWJpbmZvLmZyYWdzaXplID0gKHMtPmZyYWdzaXplKmRtYS0+aW5jaGFubmVscyk+PmRtYS0+Zm9ybWF0c2hpZnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gKGNvdW50KmRtYS0+aW5jaGFubmVscyk+PmRtYS0+Zm9ybWF0c2hpZnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSAyOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBjb3VudCA+IHMtPmZyYWdzaXplOyAKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKyAgICAgICAgICAgICAgICBmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWTogLyogV2hhdCBzaG91bGQgdGhpcyBleGFjdGx5IGRvID8gLAorCQkJCSAgICAgIEFUTSBpdCBpcyBqdXN0IGFiaW5mby5ieXRlcyAqLworCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl2YWwgPSBybWU5Nnh4X2dldGh3cHRyKGRtYS0+cywwKTsKKwkJY291bnQgPSB2YWwgLSBkbWEtPnJlYWRwdHI7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCArPSBzLT5mcmFnc2l6ZTw8MTsKKworCQlyZXR1cm4gcHV0X3VzZXIoY291bnQsIHApOworCisKKy8qIGNoZWNrIG91dCBob3cgdG8gdXNlIG1tYXBlZCBtb2RlIChjYW4gb25seSBiZSBibG9ja2VkICEhISkgKi8KKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCA9IHJtZTk2eHhfZ2V0aHdwdHIoZG1hLT5zLDApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jayxmbGFncyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5mcmFnc2l6ZTw8MTsKKwkJY291bnQgPSB2YWwgLSBkbWEtPnJlYWRwdHI7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCArPSBzLT5mcmFnc2l6ZTw8MTsKKworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IChjb3VudCA+IHMtPmZyYWdzaXplKTsgCisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gdmFsOworCQlpZiAoZG1hLT5tbWFwcGVkKQorCQkJZG1hLT5yZWFkcHRyICY9IHMtPmZyYWdzaXplPDwxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLGZsYWdzKTsKKworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdmFsID0gcm1lOTZ4eF9nZXRod3B0cihkbWEtPnMsMCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLGZsYWdzKTsKKyAgICAgICAgICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmZyYWdzaXplPDwxOworCQljb3VudCA9IHZhbCAtIGRtYS0+d3JpdGVwdHI7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCArPSBzLT5mcmFnc2l6ZTw8MTsKKworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IChjb3VudCA+IHMtPmZyYWdzaXplKTsgCisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gdmFsOworCQlpZiAoZG1hLT5tbWFwcGVkKQorCQkJZG1hLT53cml0ZXB0ciAmPSBzLT5mcmFnc2l6ZTw8MTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jayxmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkgICAgIHJldHVybiBwdXRfdXNlcihzLT5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXZhbCY9MHhmZmZmOworCQl2YWwgLT0gNzsKKwkJaWYgKHZhbCA8IDApIHZhbCA9IDA7CisJCWlmICh2YWwgPiA3KSB2YWwgPSA3OworCQlybWU5Nnh4X3NldGxhdGVuY3kocyx2YWwpOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorI2lmIDAKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24pIHx8CisJCSAgICAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcy0+ZG1hX2RhYzIuc3ViZGl2aXNpb24gPSB2YWw7CisjZW5kaWYJCQorCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCS8qIEhQMjAwMjAyMDEgKi8KKwkJcy0+cmF0ZSA9IHJtZTk2eHhfZ2V0X3NhbXBsZV9yYXRlX3N0YXR1cyhzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHMtPnJhdGUsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcihkbWEtPm91dGNoYW5uZWxzLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCXN3aXRjaCAoZG1hLT5mb3JtYXQpIHsKKwkJCWNhc2UgQUZNVF9TMzJfQkxPQ0tFRDoKKwkJCQl2YWwgPSAzMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUZNVF9TMTZfTEU6CisJCQkJdmFsID0gMTY7CisJCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgorICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCisJfQorCisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCisKK3N0YXRpYyBpbnQgcm1lOTZ4eF9vcGVuKHN0cnVjdCBpbm9kZSAqaW4sIHN0cnVjdCBmaWxlICpmKQoreworCWludCBtaW5vciA9IGltaW5vcihpbik7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlpbnQgZGV2bnVtOworCXJtZTk2eHhfaW5mbyAqczsKKwlzdHJ1Y3QgZG1hYnVmKiBkbWE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7IAorCisJREJHKHByaW50aygiZGV2aWNlIG51bSAlZCBvcGVuXG4iLGRldm51bSkpOworCisJbm9uc2Vla2FibGVfb3BlbihpbiwgZik7CisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHJtZTk2eHhfaW5mbywgZGV2cyk7CisJCWZvciAoZGV2bnVtPTA7IGRldm51bTxkZXZpY2VzOyBkZXZudW0rKykKKwkJCWlmICghKChzLT5kc3BudW1bZGV2bnVtXSBeIG1pbm9yKSAmIH4weGYpKSAKKwkJCQlicmVhazsKKwkJaWYgKGRldm51bTxkZXZpY2VzKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKworCWRtYSA9ICZzLT5kbWFbZGV2bnVtXTsKKwlmLT5wcml2YXRlX2RhdGEgPSBkbWE7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmZG1hLT5vcGVuX3NlbSk7CisJd2hpbGUgKGRtYS0+b3Blbl9tb2RlICYgZi0+Zl9tb2RlKSB7CisJCWlmIChmLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJmRtYS0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmZG1hLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmZG1hLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWEtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZkbWEtPm9wZW5fc2VtKTsKKwl9CisKKwlDT01NICAgICAgICAgICAgICAgICgiaGFyZHdhcmUgb3BlbiIpCisKKwlpZiAoIWRtYS0+b3BlbmVkKSBybWU5Nnh4X2RtYWJ1Zl9pbml0KGRtYS0+cyxkbWEsZG1hLT5pbm9mZnNldCxkbWEtPm91dG9mZnNldCk7CisKKwlkbWEtPm9wZW5fbW9kZSB8PSAoZi0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpOworCWRtYS0+b3BlbmVkID0gMTsKKwl1cCgmZG1hLT5vcGVuX3NlbSk7CisKKwlEQkcocHJpbnRrKCJkZXZpY2UgbnVtICVkIG9wZW4gZmluaXNoZWRcbiIsZGV2bnVtKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm1lOTZ4eF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW4sIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkbWFidWYgKiBkbWEgPSAoc3RydWN0IGRtYWJ1ZiopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwkvKiBpbnQgaHdwOyAgLi4uIHdhcyB1bnVzZWQgICBIUDIwMDIwMjAxICovCisJREJHKHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXykpOworCisJQ09NTSAgICAgICAgICAoImRyYWluaW5nIikKKwlpZiAoZG1hLT5vcGVuX21vZGUgJiBGTU9ERV9XUklURSkgeworI2lmIDAgLyogV2h5IGRvZXNuJ3QgdGhpcyB3b3JrIHdpdGggc29tZSBjYXJkcyA/PyAqLworCSAgICAgaHdwID0gcm1lOTZ4eF9nZXRod3B0cihkbWEtPnMsMCk7CisJICAgICB3aGlsZSAocm1lOTZ4eF9nZXRvc3BhY2UoZG1hLGh3cCkpIHsKKwkJICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCYoZG1hLT53YWl0KSk7CisJCSAgaHdwID0gcm1lOTZ4eF9nZXRod3B0cihkbWEtPnMsMCk7CisJICAgICB9CisjZW5kaWYKKwkgICAgIHJtZTk2eHhfY2xlYXJidWZzKGRtYSk7CisJfQorCisJZG1hLT5vcGVuX21vZGUgJj0gKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCisJaWYgKCEoZG1hLT5vcGVuX21vZGUgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpKSB7CisJICAgICBkbWEtPm9wZW5lZCA9IDA7CisJICAgICBpZiAoZG1hLT5zLT5zdGFydGVkKSBybWU5Nnh4X3N0YXJ0Y2FyZChkbWEtPnMsMSk7CisJfQorCisJd2FrZV91cCgmZG1hLT5vcGVuX3dhaXQpOworCXVwKCZkbWEtPm9wZW5fc2VtKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHJtZTk2eHhfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkbWFidWYgKmRtYSA9IChzdHJ1Y3QgZG1hYnVmICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmV0ID0gMDsKKwlpbnQgY250OyAvKiBudW1iZXIgb2YgYnl0ZXMgZnJvbSAiYnVmZmVyIiB0aGF0IHdpbGwvY2FuIGJlIHVzZWQgKi8KKwlpbnQgaG9wID0gY291bnQvZG1hLT5vdXRjaGFubmVsczsKKwlpbnQgaHdwOworCWludCBleGFjdCA9IChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7IAorCisKKwlpZihkbWEgPT0gTlVMTCB8fCAoZG1hLT5zKSA9PSBOVUxMKSAKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmIChkbWEtPm1tYXBwZWQgfHwgIWRtYS0+b3BlbmVkKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghIChkbWEtPm9wZW5fbW9kZSAgJiBGTU9ERV9XUklURSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKKworCWlmICghZG1hLT5zLT5zdGFydGVkKSBybWU5Nnh4X3N0YXJ0Y2FyZChkbWEtPnMsZXhhY3QpOworCWh3cCA9IHJtZTk2eHhfZ2V0aHdwdHIoZG1hLT5zLDApOworCisJaWYoIShkbWEtPnN0YXJ0ZWQpKXsJCSAKKwkJQ09NTSAgICAgICAgICAoImZpcnN0IHdyaXRlIikKKwkJCQorCQlkbWEtPnJlYWRwdHIgPSBod3A7CisJCWRtYS0+d3JpdGVwdHIgPSBod3A7CisJCWRtYS0+c3RhcnRlZCA9IDE7CisJfQorCisgIAl3aGlsZSAoY291bnQgPiAwKSB7CisJCWNudCA9IHJtZTk2eHhfZ2V0b3NwYWNlKGRtYSxod3ApOwkJCisJCWNudD4+PWRtYS0+Zm9ybWF0c2hpZnQ7CisJCWNudCo9ZG1hLT5vdXRjaGFubmVsczsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisKKwkJaWYgKGNudCAhPSAwKSB7CisJCSAgICAgICAgaWYgKHJtZTk2eHhfY29weWZyb211c2VyKGRtYSxidWZmZXIsY250LGhvcCkpCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisJCQljb3VudCAtPSBjbnQ7CisJCQlidWZmZXIgKz0gY250OworCQkJcmV0ICs9IGNudDsKKwkJCWlmIChjb3VudCA9PSAwKSByZXR1cm4gcmV0OworCQl9CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOworCQkKKwkJaWYgKChod3AgLSBkbWEtPndyaXRlcHRyKSA8PSAwKSB7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCYoZG1hLT53YWl0KSk7CisJCQkKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCQl9CQkJCisKKwkJaHdwID0gcm1lOTZ4eF9nZXRod3B0cihkbWEtPnMsZXhhY3QpOworCisJfTsgLyogY291bnQgPiAwICovCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBybWU5Nnh4X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreyAKKwlzdHJ1Y3QgZG1hYnVmICpkbWEgPSAoc3RydWN0IGRtYWJ1ZiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJldCA9IDA7CisJaW50IGNudDsgLyogbnVtYmVyIG9mIGJ5dGVzIGZyb20gImJ1ZmZlciIgdGhhdCB3aWxsL2NhbiBiZSB1c2VkICovCisJaW50IGhvcCA9IGNvdW50L2RtYS0+aW5jaGFubmVsczsKKwlpbnQgaHdwOworCWludCBleGFjdCA9IChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7IAorCisKKwlpZihkbWEgPT0gTlVMTCB8fCAoZG1hLT5zKSA9PSBOVUxMKSAKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmIChkbWEtPm1tYXBwZWQgfHwgIWRtYS0+b3BlbmVkKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoISAoZG1hLT5vcGVuX21vZGUgICYgRk1PREVfUkVBRCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKKworCWlmICghZG1hLT5zLT5zdGFydGVkKSBybWU5Nnh4X3N0YXJ0Y2FyZChkbWEtPnMsZXhhY3QpOworCWh3cCA9IHJtZTk2eHhfZ2V0aHdwdHIoZG1hLT5zLDApOworCisJaWYoIShkbWEtPnN0YXJ0ZWQpKXsJCSAKKwkJQ09NTSAgICAgICAgICAoImZpcnN0IHJlYWQiKQorCQkgICAgIAorCQlkbWEtPndyaXRlcHRyID0gaHdwOworCQlkbWEtPnJlYWRwdHIgPSBod3A7CisJCWRtYS0+c3RhcnRlZCA9IDE7CisJfQorCisgIAl3aGlsZSAoY291bnQgPiAwKSB7CisJCWNudCA9IHJtZTk2eHhfZ2V0aXNwYWNlKGRtYSxod3ApOwkJCisJCWNudD4+PWRtYS0+Zm9ybWF0c2hpZnQ7CisJCWNudCo9ZG1hLT5pbmNoYW5uZWxzOworCisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCisJCWlmIChjbnQgIT0gMCkgeworCQkgICAgICAgIAorCQkJaWYgKHJtZTk2eHhfY29weXRvdXNlcihkbWEsYnVmZmVyLGNudCxob3ApKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOworCQkJCisJCQljb3VudCAtPSBjbnQ7CisJCQlidWZmZXIgKz0gY250OworCQkJcmV0ICs9IGNudDsKKwkJCWlmIChjb3VudCA9PSAwKSByZXR1cm4gcmV0OworCQl9CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOworCQkKKwkJaWYgKChod3AgLSBkbWEtPnJlYWRwdHIpIDw9IDApIHsKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJihkbWEtPndhaXQpKTsKKwkJCQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisJCX0JCQkKKwkJaHdwID0gcm1lOTZ4eF9nZXRod3B0cihkbWEtPnMsZXhhY3QpOworCisJfTsgLyogY291bnQgPiAwICovCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJtOTZ4eF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkgeworCXN0cnVjdCBkbWFidWYgKmRtYSA9IChzdHJ1Y3QgZG1hYnVmICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJtZTk2eHhfaW5mbyogcyA9IGRtYS0+czsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gUk1FOTZ4eF9ETUFfTUFYX1NJWkUpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJaWYgKCFzLT5zdGFydGVkKSBybWU5Nnh4X3N0YXJ0Y2FyZChzLDEpOworCisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2aXJ0X3RvX3BoeXMocy0+cGxheWJ1ZiArIGRtYS0+b3V0b2Zmc2V0KlJNRTk2eHhfRE1BX01BWF9TSVpFKSA+PiBQQUdFX1NISUZULCBzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJfSAKKwllbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgeworCQlpZiAoIXMtPnN0YXJ0ZWQpIHJtZTk2eHhfc3RhcnRjYXJkKHMsMSk7CisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2aXJ0X3RvX3BoeXMocy0+cGxheWJ1ZiArIGRtYS0+aW5vZmZzZXQqUk1FOTZ4eF9ETUFfTUFYX1NJWkUpID4+IFBBR0VfU0hJRlQsIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9IGVsc2UgIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKworLyogdGhpcyBpcyB0aGUgbWFwcGluZyAqLworCXZtYS0+dm1fZmxhZ3MgJj0gflZNX0lPOworCWRtYS0+bW1hcHBlZCA9IDE7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJtZTk2eHhfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBkbWFidWYgKmRtYSA9IChzdHJ1Y3QgZG1hYnVmICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJtZTk2eHhfaW5mbyogcyA9IGRtYS0+czsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGh3cCxjbnQ7CisKKyAgICAgICAgREJHKHByaW50aygicm1lOTZ4eCBwb2xsX3dhaXQgLi4uXG4iKSk7CisJVkFMSURBVEVfU1RBVEUocyk7CisKKwlpZiAoIXMtPnN0YXJ0ZWQpIHsKKwkJICBtYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKwlwb2xsX3dhaXQoZmlsZSwgJmRtYS0+d2FpdCwgd2FpdCk7CisKKwlod3AgPSBybWU5Nnh4X2dldGh3cHRyKGRtYS0+cywwKTsKKworICAgICAgICBEQkcocHJpbnRrKCJybWU5Nnh4IHBvbGw6IC4uY250ICVkID4gJWRcbiIsY250LHMtPmZyYWdzaXplKSk7CQorCisJY250ID0gcm1lOTZ4eF9nZXRpc3BhY2UoZG1hLGh3cCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgCisJICAgICBpZiAoY250ID4gMCkKKwkJICBtYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKworCisJY250ID0gcm1lOTZ4eF9nZXRvc3BhY2UoZG1hLGh3cCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIAorCSAgICAgaWYgKGNudCA+IDApCisJCSAgbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCisvLyAgICAgICAgcHJpbnRrKCJybWU5Nnh4IHBvbGxfd2FpdCAuLi4lZCA+ICVkXG4iLHJtZTk2eHhfZ2V0b3NwYWNlKGRtYSxod3ApLHJtZTk2eHhfZ2V0aXNwYWNlKGRtYSxod3ApKTsKKworCXJldHVybiBtYXNrOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJtZTk2eHhfYXVkaW9fZm9wcyA9IHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApCisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorI2VuZGlmCisJLnJlYWQJID0gcm1lOTZ4eF9yZWFkLAorCS53cml0ZQkgPSBybWU5Nnh4X3dyaXRlLAorCS5wb2xsCSA9IHJtZTk2eHhfcG9sbCwKKwkuaW9jdGwJID0gcm1lOTZ4eF9pb2N0bCwgIAorCS5tbWFwCSA9IHJtOTZ4eF9tbWFwLAorCS5vcGVuCSA9IHJtZTk2eHhfb3BlbiwgIAorCS5yZWxlYXNlID0gcm1lOTZ4eF9yZWxlYXNlIAorfTsKKworc3RhdGljIGludCBybWU5Nnh4X21peGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXJtZTk2eHhfaW5mbyAqczsKKworCUNPTU0gICgibWl4ZXIgb3BlbiIpOworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHJtZTk2eHhfaW5mbywgZGV2cyk7CisJCWlmIChzLT5taXhlcj09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCisJQ09NTSAgICAgICAgICAgICAgICAgICAgICAgKCJtaXhlciBvcGVuZWQiKQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJtZTk2eHhfbWl4ZXJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJtZTk2eHhfaW5mbyAqcyA9IChybWU5Nnh4X2luZm8gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdTMyIHN0YXR1czsKKwlpbnQgc3BkaWZyYXRlOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisJc3RhdHVzID0gcmVhZGwocy0+aW9iYXNlICsgUk1FOTZ4eF9zdGF0dXNfcmVnaXN0ZXIpOworCS8qIGhhY2sgdG8gY29udmVydCByZXYgMS41IFNQRElGIHJhdGUgdG8gImNyeXN0YWxyYXRlIiBmb3JtYXQgICBIUCAyMDAyMDIwMSAqLworCXJtZTk2eHhfc3BkaWZfc2FtcGxlX3JhdGUocywmc3BkaWZyYXRlKTsKKwlzdGF0dXMgPSAoc3RhdHVzICYgflJNRTk2eHhfRikgfCAoKHNwZGlmcmF0ZTw8MjIpICYgUk1FOTZ4eF9GKTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfUFJJVkFURTEpIHsKKwkJcm1lX21peGVyIG1peGVyOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm1peGVyLGFyZ3Asc2l6ZW9mKG1peGVyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCisJCW1peGVyLmRldm5yICY9IFJNRTk2eHhfTUFTS19ERVZTOworCQlpZiAobWl4ZXIuZGV2bnIgPj0gZGV2aWNlcykKKwkJCW1peGVyLmRldm5yID0gZGV2aWNlcy0xOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgIXMtPmRtYVttaXhlci5kZXZucl0ub3BlbmVkKSB7CisJCQkvKiBtb2RpZnkgb25seSBpZiBkZXZpY2Ugbm90IG9wZW4gKi8KKwkJCWlmIChtaXhlci5vX29mZnNldCA8IDApCisJCQkJbWl4ZXIub19vZmZzZXQgPSAwOworCQkJaWYgKG1peGVyLm9fb2Zmc2V0ID49IFJNRTk2eHhfQ0hBTk5FTFNfUEVSX0NBUkQpCisJCQkJbWl4ZXIub19vZmZzZXQgPSBSTUU5Nnh4X0NIQU5ORUxTX1BFUl9DQVJELTE7CisJCQlpZiAobWl4ZXIuaV9vZmZzZXQgPCAwKQorCQkJCW1peGVyLmlfb2Zmc2V0ID0gMDsKKwkJCWlmIChtaXhlci5pX29mZnNldCA+PSBSTUU5Nnh4X0NIQU5ORUxTX1BFUl9DQVJEKQorCQkJCW1peGVyLmlfb2Zmc2V0ID0gUk1FOTZ4eF9DSEFOTkVMU19QRVJfQ0FSRC0xOworCQkJcy0+ZG1hW21peGVyLmRldm5yXS5vdXRvZmZzZXQgPSBtaXhlci5vX29mZnNldDsKKwkJCXMtPmRtYVttaXhlci5kZXZucl0uaW5vZmZzZXQgPSBtaXhlci5pX29mZnNldDsKKwkJfQorCisJCW1peGVyLm9fb2Zmc2V0ID0gcy0+ZG1hW21peGVyLmRldm5yXS5vdXRvZmZzZXQ7CisJCW1peGVyLmlfb2Zmc2V0ID0gcy0+ZG1hW21peGVyLmRldm5yXS5pbm9mZnNldDsKKworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZtaXhlciwgc2l6ZW9mKG1peGVyKSkgPyAtRUZBVUxUIDogMDsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMikgeworCQlyZXR1cm4gcHV0X3VzZXIoc3RhdHVzLCBwKTsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMykgeworCQl1MzIgY29udHJvbDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb250cm9sLGFyZ3Asc2l6ZW9mKGNvbnRyb2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXMtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gflJNRTk2eHhfbWl4ZXJfYWxsb3dlZDsKKwkJCXMtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gY29udHJvbCAmIFJNRTk2eHhfbWl4ZXJfYWxsb3dlZDsKKwkJCXdyaXRlbChjb250cm9sLHMtPmlvYmFzZSArIFJNRTk2eHhfY29udHJvbF9yZWdpc3Rlcik7CisJCX0KKworCSAgICAgcmV0dXJuIHB1dF91c2VyKHMtPmNvbnRyb2xfcmVnaXN0ZXIsIHApOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKworCitzdGF0aWMgaW50IHJtZTk2eHhfbWl4ZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJtZTk2eHhfbWl4ZXJfZm9wcyA9IHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApCisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorI2VuZGlmCisJLmlvY3RsCSA9IHJtZTk2eHhfbWl4ZXJfaW9jdGwsCisJLm9wZW4JID0gcm1lOTZ4eF9taXhlcl9vcGVuLAorCS5yZWxlYXNlID0gcm1lOTZ4eF9taXhlcl9yZWxlYXNlLAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ybWU5Nnh4LmggYi9zb3VuZC9vc3Mvcm1lOTZ4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhM2MxODgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvcm1lOTZ4eC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIChDKSAyMDAwIEd1ZW50ZXIgR2VpZ2VyIDxnZWlnZXJAZGViaWFuLm9yZz4KKyAgIHdpdGggY29weS9wYXN0ZXMgZnJvbSB0aGUgZHJpdmVyIG9mIFdpbmZyaWVkIFJpdHNjaCA8cml0c2NoQGllbS5rdWcuYWMuYXQ+CisKK01vZGlmaWNhdGlvbnMgLSBIZWlrbyBQdXJuaGFnZW4gPHB1cm5oYWdlQHRudC51bmktaGFubm92ZXIuZGU+CisgICBIUDIwMDIwMTE2IHRvd2FyZHMgUkVWIDEuNSBzdXBwb3J0LCBiYXNlZCBvbiBBTFNBJ3MgY2FyZC1ybWU5NjUyLmMKKyAgIEhQMjAwMjAyMDEgY29tcGxldGVkPworCitBIHRleHQvZ3JhcGhpYyBjb250cm9sIHBhbmVsIChybWVjdHJsL3hybWVjdHJsKSBpcyBhdmFpbGFibGUgZnJvbQorICAgaHR0cDovL2dpZ2UueGR2Lm9yZy9wYWdlcy9zb2Z0L3BhZ2VzL3JtZQorKi8KKworCisjaWZuZGVmIEFGTVRfUzMyX0JMT0NLRUQKKyNkZWZpbmUgQUZNVF9TMzJfQkxPQ0tFRCAweDAwMDA0MDAKKyNlbmRpZgorCisvKiBBRk1UX1MxNl9CTE9DS0VEIG5vdCB5ZXQgc3VwcG9ydGVkICovCisjaWZuZGVmIEFGTVRfUzE2X0JMT0NLRUQgCisjZGVmaW5lIEFGTVRfUzE2X0JMT0NLRUQgMHgwMDAwODAwCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBybWVfc3RhdHVzIHsKKwl1bnNpZ25lZCBpbnQgaXJxOjE7CisJdW5zaWduZWQgaW50IGxvY2ttYXNrOjM7ICAgICAvKiBBREFUIGlucHV0IFBMTHMgbG9ja2VkICovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDEwMD1BREFUMSwgMDEwPUFEQVQyLCAwMDE9QURBVDMgKi8KKwl1bnNpZ25lZCBpbnQgc3I0ODoxOyAgICAgICAgIC8qIHNhbXBsZSByYXRlOiAwPTQ0LjEvODguMiAxPTQ4Lzk2IGtIeiAqLworCXVuc2lnbmVkIGludCB3Y2xvY2s6MTsgICAgICAgLyogMT13b3JkY2xvY2sgdXNlZCAqLworCXVuc2lnbmVkIGludCBidWZwb2ludDoxMDsKKwl1bnNpZ25lZCBpbnQgc3luY21hc2s6MzsgICAgIC8qIEFEQVQgaW5wdXQgaW4gc3luYyB3aXRoIHN5c3RlbSBjbG9jayAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwPUFEQVQxLCAwMTA9QURBVDIsIDAwMT1BREFUMyAqLworCXVuc2lnbmVkIGludCBkb3VibGVzcGVlZDoxOyAgLyogc2FtcGxlIHJhdGU6IDA9NDQuMS80OCAxPTg4LjIvOTYga0h6ICovCisJdW5zaWduZWQgaW50IHRjX2J1c3k6MTsKKwl1bnNpZ25lZCBpbnQgdGNfb3V0OjE7CisJdW5zaWduZWQgaW50IGNyeXN0YWxyYXRlOjM7ICAvKiBzcGRpZiBpbnB1dCBzYW1wbGUgcmF0ZTogKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMDAwPTY0a0h6LCAxMDA9ODguMmtIeiwgMDExPTk2a0h6ICovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDExMT0zMmtIeiwgMTEwPTQ0LjFrSHosIDEwMT00OGtIeiAqLworCXVuc2lnbmVkIGludCBzcGRpZl9lcnJvcjoxOyAgLyogMT1ubyBzcGRpZiBsb2NrICovCisJdW5zaWduZWQgaW50IGJ1ZmlkOjE7CisJdW5zaWduZWQgaW50IHRjX3ZhbGlkOjE7ICAgICAvKiAxPXRpbWVjb2RlIGlucHV0IGRldGVjdGVkICovCisJdW5zaWduZWQgaW50IHNwZGlmX3JlYWQ6MTsKK30gcm1lX3N0YXR1c190OworCisKKy8qIG9ubHkgZmllbGRzIG1hcmtlZCBXOiBjYW4gYmUgbW9kaWZpZWQgYnkgd3JpdGluZyB0byBTT1VORF9NSVhFUl9QUklWQVRFMyAqLwordHlwZWRlZiBzdHJ1Y3Qgcm1lX2NvbnRyb2wgeworCXVuc2lnbmVkIGludCBzdGFydDoxOworCXVuc2lnbmVkIGludCBsYXRlbmN5OjM7ICAgICAgLyogYnVmZmVyIHNpemUgLyBsYXRlbmN5IFtzYW1wbGVzXTogKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMD02NCAuLi4gNz04MTkyICovCisJdW5zaWduZWQgaW50IG1hc3RlcjoxOyAgICAgICAvKiBXOiBjbG9jayBtb2RlOiAxPW1hc3RlciAwPXNsYXZlL2F1dG8gKi8KKwl1bnNpZ25lZCBpbnQgaWU6MTsKKwl1bnNpZ25lZCBpbnQgc3I0ODoxOyAgICAgICAgIC8qIHNhbXBsZXJhdGUgMD00NC4xLzg4LjIsIDE9NDgvOTYga0h6ICovCisJdW5zaWduZWQgaW50IHNwYXJlOjE7CisJdW5zaWduZWQgaW50IGRvdWJsZXNwZWVkOjE7ICAvKiBkb3VibGUgc3BlZWQgMD00NC4xLzQ4LCAxPTg4LjIvOTYgS2h6ICovCisJdW5zaWduZWQgaW50IHBybzoxOyAgICAgICAgICAvKiBXOiBTUERJRi1PVVQgMD1jb25zdW1lciwgMT1wcm9mZXNzaW9uYWwgKi8KKwl1bnNpZ25lZCBpbnQgZW1waGFzaXM6MTsgICAgIC8qIFc6IFNQRElGLU9VVCBlbXBoYXNpcyAwPW9mZiwgMT1vbiAqLworCXVuc2lnbmVkIGludCBkb2xieToxOyAgICAgICAgLyogVzogU1BESUYtT1VUIG5vbi1hdWRpbyBiaXQgMT1zZXQsIDA9dW5zZXQgKi8KKwl1bnNpZ25lZCBpbnQgb3B0X291dDoxOyAgICAgIC8qIFc6IHVzZSAxc3Qgb3B0aWNhbCBPVVQgYXMgU1BESUY6IDE9eWVzLCAwPW5vICovCisJdW5zaWduZWQgaW50IHdvcmRjbG9jazoxOyAgICAvKiBXOiB1c2UgV29yZGNsb2NrIGFzIHN5bmMgKG92ZXJ3cml0ZXMgbWFzdGVyKSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgc3BkaWZfaW46MjsgICAgIC8qIFc6IFNQRElGLUlOOiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDAwPW9wdGljYWwgKEFEQVQxKSwgMDE9Y29heGlhbCAoQ2luY2gpLCAxMD1pbnRlcm5hbCBDRFJPTSAqLworCXVuc2lnbmVkIGludCBzeW5jX3JlZjoyOyAgICAgLyogVzogcHJlZmVycmVkIHN5bmMtc291cmNlIGluIGF1dG9zeW5jICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMDA9QURBVDEsIDAxPUFEQVQyLCAxMD1BREFUMywgMTE9U1BESUYgKi8KKwl1bnNpZ25lZCBpbnQgc3BkaWZfcmVzZXQ6MTsKKwl1bnNpZ25lZCBpbnQgc3BkaWZfc2VsZWN0OjE7CisJdW5zaWduZWQgaW50IHNwZGlmX2Nsb2NrOjE7CisJdW5zaWduZWQgaW50IHNwZGlmX3dyaXRlOjE7CisJdW5zaWduZWQgaW50IGFkYXQxX2NkOjE7ICAgICAvKiBXOiBSZXYgMS41KzogaWYgc2V0LCBpbnRlcm5hbCBDRCBjb25uZWN0b3IgY2FycmllcyBBREFUICovCit9IHJtZV9jdHJsX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX3JtZV9taXhlciB7CisJaW50IGlfb2Zmc2V0OworCWludCBvX29mZnNldDsKKwlpbnQgZGV2bnI7CisJaW50IHNwYXJlWzhdOworfSBybWVfbWl4ZXI7CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYi5oIGIvc291bmQvb3NzL3NiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlODg5MQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zYi5oCkBAIC0wLDAgKzEsMTg1IEBACisjZGVmaW5lIERTUF9SRVNFVAkoZGV2Yy0+YmFzZSArIDB4NikKKyNkZWZpbmUgRFNQX1JFQUQJKGRldmMtPmJhc2UgKyAweEEpCisjZGVmaW5lIERTUF9XUklURQkoZGV2Yy0+YmFzZSArIDB4QykKKyNkZWZpbmUgRFNQX0NPTU1BTkQJKGRldmMtPmJhc2UgKyAweEMpCisjZGVmaW5lIERTUF9TVEFUVVMJKGRldmMtPmJhc2UgKyAweEMpCisjZGVmaW5lIERTUF9EQVRBX0FWQUlMCShkZXZjLT5iYXNlICsgMHhFKQorI2RlZmluZSBEU1BfREFUQV9BVkwxNgkoZGV2Yy0+YmFzZSArIDB4RikKKyNkZWZpbmUgTUlYRVJfQUREUgkoZGV2Yy0+YmFzZSArIDB4NCkKKyNkZWZpbmUgTUlYRVJfREFUQQkoZGV2Yy0+YmFzZSArIDB4NSkKKyNkZWZpbmUgT1BMM19MRUZUCShkZXZjLT5iYXNlICsgMHgwKQorI2RlZmluZSBPUEwzX1JJR0hUCShkZXZjLT5iYXNlICsgMHgyKQorI2RlZmluZSBPUEwzX0JPVEgJKGRldmMtPmJhc2UgKyAweDgpCisvKiBEU1AgQ29tbWFuZHMgKi8KKworI2RlZmluZSBEU1BfQ01EX1NQS09OCQkweEQxCisjZGVmaW5lIERTUF9DTURfU1BLT0ZGCQkweEQzCisjZGVmaW5lIERTUF9DTURfRE1BT04JCTB4RDAKKyNkZWZpbmUgRFNQX0NNRF9ETUFPRkYJCTB4RDQKKworI2RlZmluZSBJTU9ERV9OT05FCQkwCisjZGVmaW5lIElNT0RFX09VVFBVVAkJUENNX0VOQUJMRV9PVVRQVVQKKyNkZWZpbmUgSU1PREVfSU5QVVQJCVBDTV9FTkFCTEVfSU5QVVQKKyNkZWZpbmUgSU1PREVfSU5JVAkJMworI2RlZmluZSBJTU9ERV9NSURJCQk0CisKKyNkZWZpbmUgTk9STUFMX01JREkJMAorI2RlZmluZSBVQVJUX01JREkJMQorCisKKy8qCisgKiBEZXZpY2UgbW9kZWxzCisgKi8KKyNkZWZpbmUgTURMX05PTkUJMAorI2RlZmluZSBNRExfU0IxCQkxCS8qIFNCMS4wIG9yIDEuNSAqLworI2RlZmluZSBNRExfU0IyCQkyCS8qIFNCMi4wICovCisjZGVmaW5lIE1ETF9TQjIwMQkzCS8qIFNCMi4wMSAqLworI2RlZmluZSBNRExfU0JQUk8JNAkvKiBTQiBQcm8gKi8KKyNkZWZpbmUgTURMX1NCMTYJNQkvKiBTQjE2LzMyL0FXRSAqLworI2RlZmluZSBNRExfU0JQTlAgCTYJLyogU0IxNi8zMi9BV0UgUG5QICovCisjZGVmaW5lIE1ETF9KQVpaCTEwCS8qIE1lZGlhIFZpc2lvbiBKYXp6MTYgKi8KKyNkZWZpbmUgTURMX1NNVwkJMTEJLyogTG9naXRlY2ggU291bmRNYW4gV2F2ZSAoSmF6ejE2KSAqLworI2RlZmluZSBNRExfRVNTCQkxMgkvKiBFU1MgRVM2ODggYW5kIEVTMTY4OCAqLworI2RlZmluZSBNRExfQVpURUNICTEzCS8qIEF6dGVjaCBTb3VuZCBHYWxheHkgZmFtaWx5ICovCisjZGVmaW5lIE1ETF9FUzE4NjhNSURJCTE0CS8qIE1JREkgcG9ydCBvZiBFU1MxODY4ICovCisjZGVmaW5lIE1ETF9BRURTUAkxNQkvKiBBdWRpbyBFeGNlbCBEU1AgMTYgKi8KKyNkZWZpbmUgTURMX0VTU1BDSQkxNgkvKiBFU1MgUENJIGNhcmQgKi8KKyNkZWZpbmUgTURMX1lNUENJCTE3CS8qIFlhbWFoYSBQQ0kgc2IgaW4gZW11bGF0aW9uICovCisKKyNkZWZpbmUgU1VCTURMX0FMUzAwNwk0MgkvKiBBTFMtMDA3IGRpZmZlcnMgZnJvbSBTQjE2IG9ubHkgaW4gbWl4ZXIgKi8KKwkJCQkvKiByZWdpc3RlciBhc3NpZ25tZW50ICovCisjZGVmaW5lIFNVQk1ETF9BTFMxMDAJNDMJLyogQUxTLTEwMCBhbGxvd3Mgc2FtcGxpbmcgcmF0ZXMgb2YgdXAgKi8KKwkJCQkvKiB0byA0OGtIeiAqLworCQkJCQorLyoKKyAqIENvbmZpZyBmbGFncworICovCisjZGVmaW5lIFNCX05PX01JREkJMHgwMDAwMDAwMQorI2RlZmluZSBTQl9OT19NSVhFUgkweDAwMDAwMDAyCisjZGVmaW5lIFNCX05PX0FVRElPCTB4MDAwMDAwMDQKKyNkZWZpbmUgU0JfTk9fUkVDT1JESU5HCTB4MDAwMDAwMDggLyogTm8gYXVkaW8gcmVjb3JkaW5nICovCisjZGVmaW5lIFNCX01JRElfT05MWQkoU0JfTk9fQVVESU98U0JfTk9fTUlYRVIpCisjZGVmaW5lIFNCX1BDSV9JUlEJMHgwMDAwMDAxMCAvKiBQQ0kgc2hhcmVkIElSUSAqLworCitzdHJ1Y3QgbWl4ZXJfZGVmIHsKKwl1bnNpZ25lZCBpbnQgcmVnbm86IDg7CisJdW5zaWduZWQgaW50IGJpdG9mZnM6NDsKKwl1bnNpZ25lZCBpbnQgbmJpdHM6NDsKK307CisKK3R5cGVkZWYgc3RydWN0IG1peGVyX2RlZiBtaXhlcl90YWJbMzJdWzJdOwordHlwZWRlZiBzdHJ1Y3QgbWl4ZXJfZGVmIG1peGVyX2VudDsKKworc3RydWN0IHNiX21vZHVsZV9vcHRpb25zCit7CisJaW50ICBlc3N0eXBlOwkvKiBFU1MgY2hpcCB0eXBlICovCisJaW50ICBhY2VyOwkvKiBEbyBhY2VyIG5vdGVib29rIGluaXQ/ICovCisJaW50ICBzbV9nYW1lczsJLyogTG9naXRlY2ggc291bmRtYW4gZ2FtZXM/ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBzYl9kZXZjIHsKKwkgICBpbnQgZGV2OworCisJLyogSGFyZHdhcmUgcGFyYW1ldGVycyAqLworCSAgIGludCAqb3NwOworCSAgIGludCBtaW5vciwgbWFqb3I7CisJICAgaW50IHR5cGU7CisJICAgaW50IG1vZGVsLCBzdWJtb2RlbDsKKwkgICBpbnQgY2FwczsKKyMJZGVmaW5lIFNCQ0FQX1NURVJFTwkweDAwMDAwMDAxCisjCWRlZmluZSBTQkNBUF8xNkJJVFMJMHgwMDAwMDAwMgorCisJLyogSGFyZHdhcmUgcmVzb3VyY2VzICovCisJICAgaW50IGJhc2U7CisJICAgaW50IGlycTsKKwkgICBpbnQgZG1hOCwgZG1hMTY7CisJICAgCisJICAgaW50IHBjaWJhc2U7CQkvKiBGb3IgRVNTIE1hZXN0cm8gZXRjICovCisKKwkvKiBTdGF0ZSB2YXJpYWJsZXMgKi8KKyAJICAgaW50IG9wZW5lZDsKKwkvKiBuZXcgYXVkaW8gZmllbGRzIGZvciBmdWxsIGR1cGxleCBzdXBwb3J0ICovCisJICAgaW50IGZ1bGxkdXBsZXg7CisJICAgaW50IGR1cGxleDsKKwkgICBpbnQgc3BlZWQsIGJpdHMsIGNoYW5uZWxzOworCSAgIHZvbGF0aWxlIGludCBpcnFfb2s7CisJICAgdm9sYXRpbGUgaW50IGludHJfYWN0aXZlLCBpcnFfbW9kZTsKKwkvKiBkdXBsaWNhdGUgYXVkaW8gZmllbGRzIGZvciBmdWxsIGR1cGxleCBzdXBwb3J0ICovCisJICAgdm9sYXRpbGUgaW50IGludHJfYWN0aXZlXzE2LCBpcnFfbW9kZV8xNjsKKworCS8qIE1peGVyIGZpZWxkcyAqLworCSAgIGludCAqbGV2ZWxzOworCSAgIG1peGVyX3RhYiAqaW9tYXA7CisJICAgc2l6ZV90IGlvbWFwX3N6OyAvKiBudW1iZXIgb3IgcmVjb3JkcyBpbiB0aGUgaW9tYXAgdGFibGUgKi8KKwkgICBpbnQgbWl4ZXJfY2FwcywgcmVjbWFzaywgb3V0bWFzaywgc3VwcG9ydGVkX2RldmljZXM7CisJICAgaW50IHN1cHBvcnRlZF9yZWNfZGV2aWNlcywgc3VwcG9ydGVkX291dF9kZXZpY2VzOworCSAgIGludCBteV9taXhlcmRldjsKKwkgICBpbnQgc2JtaXhudW07CisKKwkvKiBBdWRpbyBmaWVsZHMgKi8KKwkgICB1bnNpZ25lZCBsb25nIHRyZ19idWY7CisJICAgaW50ICAgICAgdHJpZ2dlcl9iaXRzOworCSAgIGludCAgICAgIHRyZ19ieXRlczsKKwkgICBpbnQgICAgICB0cmdfaW50cmZsYWc7CisJICAgaW50ICAgICAgdHJnX3Jlc3RhcnQ7CisJLyogZHVwbGljYXRlIGF1ZGlvIGZpZWxkcyBmb3IgZnVsbCBkdXBsZXggc3VwcG9ydCAqLworCSAgIHVuc2lnbmVkIGxvbmcgdHJnX2J1Zl8xNjsKKwkgICBpbnQgICAgICB0cmlnZ2VyX2JpdHNfMTY7CisJICAgaW50ICAgICAgdHJnX2J5dGVzXzE2OworCSAgIGludCAgICAgIHRyZ19pbnRyZmxhZ18xNjsKKwkgICBpbnQgICAgICB0cmdfcmVzdGFydF8xNjsKKworCSAgIHVuc2lnbmVkIGNoYXIgdGNvbnN0OworCQorCS8qIE1JREkgZmllbGRzICovCisJICAgaW50IG15X21pZGlkZXY7CisJICAgaW50IGlucHV0X29wZW5lZDsKKwkgICBpbnQgbWlkaV9icm9rZW47CisJICAgdm9pZCAoKm1pZGlfaW5wdXRfaW50cikgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSk7CisJICAgdm9pZCAqbWlkaV9pcnFfY29va2llOwkJLyogSVJRIGNvb2tpZSBmb3IgdGhlIG1pZGkgKi8KKworCSAgIHNwaW5sb2NrX3QgbG9jazsKKworCSAgIHN0cnVjdCBzYl9tb2R1bGVfb3B0aW9ucyBzYm1vOwkvKiBNb2R1bGUgb3B0aW9ucyAqLworCisJfSBzYl9kZXZjOworCQorLyoKKyAqCVBDSSBjYXJkIHR5cGVzCisgKi8KKworI2RlZmluZQlTQl9QQ0lfRVNTTUFFU1RSTwkxCS8qIEVTUyBNYWVzdHJvIExlZ2FjeSAqLworI2RlZmluZQlTQl9QQ0lfWUFNQUhBCQkyCS8qIFlhbWFoYSBMZWdhY3kgKi8KKworLyogCisgKglGdW5jdGlvbnMKKyAqLworIAoraW50IHNiX2RzcF9jb21tYW5kIChzYl9kZXZjICpkZXZjLCB1bnNpZ25lZCBjaGFyIHZhbCk7CitpbnQgc2JfZHNwX2dldF9ieXRlKHNiX2RldmMgKiBkZXZjKTsKK2ludCBzYl9kc3BfcmVzZXQgKHNiX2RldmMgKmRldmMpOwordm9pZCBzYl9zZXRtaXhlciAoc2JfZGV2YyAqZGV2YywgdW5zaWduZWQgaW50IHBvcnQsIHVuc2lnbmVkIGludCB2YWx1ZSk7Cit1bnNpZ25lZCBpbnQgc2JfZ2V0bWl4ZXIgKHNiX2RldmMgKmRldmMsIHVuc2lnbmVkIGludCBwb3J0KTsKK2ludCBzYl9kc3BfZGV0ZWN0IChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIGludCBwY2ksIGludCBwY2lpbywgc3RydWN0IHNiX21vZHVsZV9vcHRpb25zICpzYm1vKTsKK2ludCBzYl9kc3BfaW5pdCAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7Cit2b2lkIHNiX2RzcF91bmxvYWQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBpbnQgc2JtcHUpOworaW50IHNiX21peGVyX2luaXQoc2JfZGV2YyAqZGV2Yywgc3RydWN0IG1vZHVsZSAqb3duZXIpOwordm9pZCBzYl9taXhlcl91bmxvYWQoc2JfZGV2YyAqZGV2Yyk7Cit2b2lkIHNiX21peGVyX3NldF9zdGVyZW8gKHNiX2RldmMgKmRldmMsIGludCBtb2RlKTsKK3ZvaWQgc213X21peGVyX2luaXQoc2JfZGV2YyAqZGV2Yyk7Cit2b2lkIHNiX2RzcF9taWRpX2luaXQgKHNiX2RldmMgKmRldmMsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKK3ZvaWQgc2JfYXVkaW9faW5pdCAoc2JfZGV2YyAqZGV2YywgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqb3duZXIpOwordm9pZCBzYl9taWRpX2ludGVycnVwdCAoc2JfZGV2YyAqZGV2Yyk7Cit2b2lkIHNiX2NoZ21peGVyIChzYl9kZXZjICogZGV2YywgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNiX2NvbW1vbl9taXhlcl9zZXQoc2JfZGV2YyAqIGRldmMsIGludCBkZXYsIGludCBsZWZ0LCBpbnQgcmlnaHQpOworCitpbnQgc2JfYXVkaW9fb3BlbihpbnQgZGV2LCBpbnQgbW9kZSk7Cit2b2lkIHNiX2F1ZGlvX2Nsb3NlKGludCBkZXYpOworCisvKglGcm9tIHNiX2NvbW1vbi5jICovCit2b2lkIHNiX2RzcF9kaXNhYmxlX21pZGkoaW50IHBvcnQpOworaW50IHByb2JlX3NibXB1IChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKK3ZvaWQgdW5sb2FkX3NibXB1IChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOworCit2b2lkIHVubG9hZF9zYjE2KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2luZm8pOwordm9pZCB1bmxvYWRfc2IxNm1pZGkoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfaW5mbyk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2JfYXVkaW8uYyBiL3NvdW5kL29zcy9zYl9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZTU0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2JfYXVkaW8uYwpAQCAtMCwwICsxLDEwOTggQEAKKy8qCisgKiBzb3VuZC9zYl9hdWRpby5jCisgKgorICogQXVkaW8gcm91dGluZXMgZm9yIFNvdW5kIEJsYXN0ZXIgY29tcGF0aWJsZSBjYXJkcy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICogQ2hhbmdlcworICoJQWxhbiBDb3gJOglGb3JtYXR0aW5nIGFuZCBjbGVhbiB1cHMKKyAqCisgKiBTdGF0dXMKKyAqCU1vc3RseSB3b3JraW5nLiBXZWlyZCB1YXJ0IGJ1ZyBjYXVzaW5nIGlycSBzdG9ybXMKKyAqCisgKiBEYW5pZWwgSi4gUm9kcmlrc3NvbjogQ2hhbmdlcyB0byBtYWtlIHNiMTYgd29yayBmdWxsIGR1cGxleC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBNYXliZSBvdGhlciAxNiBiaXQgY2FyZHMgaW4gdGhpcyBjb2RlIGNvdWxkIGJlaGF2ZQorICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lLgorICogQ2hyaXMgUmFua2luOiAgICAgICAgIFVzZSBzcGlubG9ja3MgaW5zdGVhZCBvZiBDTEkvU1RJCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgInNiX21peGVyLmgiCisjaW5jbHVkZSAic2IuaCIKKworI2luY2x1ZGUgInNiX2Vzcy5oIgorCitpbnQgc2JfYXVkaW9fb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGV2YyA9PSBOVUxMKQorCXsKKwkJICBwcmludGsoS0VSTl9FUlIgIlNvdW5kIEJsYXN0ZXI6IGluY29tcGxldGUgaW5pdGlhbGl6YXRpb24uXG4iKTsKKwkJICByZXR1cm4gLUVOWElPOworCX0KKwlpZiAoZGV2Yy0+Y2FwcyAmIFNCX05PX1JFQ09SRElORyAmJiBtb2RlICYgT1BFTl9SRUFEKQorCXsKKwkJaWYgKG1vZGUgPT0gT1BFTl9SRUFEKQorCQkJcmV0dXJuIC1FUEVSTTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZGV2Yy0+b3BlbmVkKQorCXsKKwkJICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJCSAgcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKGRldmMtPmRtYTE2ICE9IC0xICYmIGRldmMtPmRtYTE2ICE9IGRldmMtPmRtYTggJiYgIWRldmMtPmR1cGxleCkKKwl7CisJCWlmIChzb3VuZF9vcGVuX2RtYShkZXZjLT5kbWExNiwgIlNvdW5kIEJsYXN0ZXIgMTYgYml0IikpCisJCXsKKwkJICAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwlkZXZjLT5vcGVuZWQgPSBtb2RlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCWRldmMtPmlycV9tb2RlID0gSU1PREVfTk9ORTsKKwlkZXZjLT5pcnFfbW9kZV8xNiA9IElNT0RFX05PTkU7CisJZGV2Yy0+ZnVsbGR1cGxleCA9IGRldmMtPmR1cGxleCAmJgorCQkoKG1vZGUgJiBPUEVOX1JFQUQpICYmIChtb2RlICYgT1BFTl9XUklURSkpOworCXNiX2RzcF9yZXNldChkZXZjKTsKKworCS8qIEF0IGZpcnN0IGdsYW5jZSB0aGlzIGNoZWNrIGlzbid0IGVub3VnaCwgc29tZSBFU1MgY2hpcHMgbWlnaHQgbm90IAorCSAqIGhhdmUgYSBSRUNMRVYuIEhvd2V2ZXIgaWYgdGhleSBkb24ndCBjb21tb25fbWl4ZXJfc2V0IHdpbGwgcmVmdXNlIAorCSAqIGNhdXNlIGRldmMtPmlvbWFwIGhhcyBubyByZWdpc3RlciBtYXBwaW5nIGZvciBSRUNMRVYKKwkgKi8KKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX0VTUykgZXNzX21peGVyX3JlbG9hZCAoZGV2YywgU09VTkRfTUlYRVJfUkVDTEVWKTsKKworCS8qIFRoZSBBTFMwMDcgc2VlbXMgdG8gcmVxdWlyZSB0aGF0IHRoZSBEU1AgYmUgcmVtb3ZlZCBmcm9tIHRoZSBvdXRwdXQgKi8KKwkvKiBpbiBvcmRlciBmb3IgcmVjb3JkaW5nIHRvIGJlIGFjdGl2YXRlZCBwcm9wZXJseS4gIFRoaXMgaXMgZG9uZSBieSAgICovCisJLyogc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgYml0cyBvZiB0aGUgb3V0cHV0IGNvbnRyb2wgcmVnaXN0ZXIgNGNoIHRvICAqLworCS8qIHplcm8uICBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBvdXRwdXQgY29udHJvbCByZWdpc3RlcnMgYXJlIG5vdCAgKi8KKwkvKiB1c2VkIGFueXdoZXJlIGVsc2UgYW5kIHRoZXJlZm9yZSB0aGUgRFNQIGJpdHMgYXJlICphbHdheXMqIE9OIGZvciAgICovCisJLyogb3V0cHV0IGFuZCBPRkYgZm9yIHNhbXBsaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJaWYgKGRldmMtPnN1Ym1vZGVsID09IFNVQk1ETF9BTFMwMDcpIAorCXsKKwkJaWYgKG1vZGUgJiBPUEVOX1JFQUQpIAorCQkJc2Jfc2V0bWl4ZXIoZGV2YyxBTFMwMDdfT1VUUFVUX0NUUkwyLAorCQkJCXNiX2dldG1peGVyKGRldmMsQUxTMDA3X09VVFBVVF9DVFJMMikgJiAweGY5KTsKKwkJZWxzZQorCQkJc2Jfc2V0bWl4ZXIoZGV2YyxBTFMwMDdfT1VUUFVUX0NUUkwyLAorCQkJCXNiX2dldG1peGVyKGRldmMsQUxTMDA3X09VVFBVVF9DVFJMMikgfCAweDA2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2JfYXVkaW9fY2xvc2UoaW50IGRldikKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJLyogZml4IHRoaW5ncyBpZiBtbWFwIHR1cm5lZCBvZmYgZnVsbGR1cGxleCAqLworCWlmKGRldmMtPmR1cGxleAorCSAgICYmICFkZXZjLT5mdWxsZHVwbGV4CisJICAgJiYgKGRldmMtPm9wZW5lZCAmIE9QRU5fUkVBRCkgJiYgKGRldmMtPm9wZW5lZCAmIE9QRU5fV1JJVEUpKQorCXsKKwkJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXBfdGVtcDsKKwkJZG1hcF90ZW1wID0gYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dDsKKwkJYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dCA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbjsKKwkJYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luID0gZG1hcF90ZW1wOworCX0KKwlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPSBkZXZjLT5kbWE4OworCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hID0gKCBkZXZjLT5kdXBsZXggKSA/CisJCWRldmMtPmRtYTE2IDogZGV2Yy0+ZG1hODsKKworCWlmIChkZXZjLT5kbWExNiAhPSAtMSAmJiBkZXZjLT5kbWExNiAhPSBkZXZjLT5kbWE4ICYmICFkZXZjLT5kdXBsZXgpCisJCXNvdW5kX2Nsb3NlX2RtYShkZXZjLT5kbWExNik7CisKKwkvKiBGb3IgQUxTMDA3LCB0dXJuIERTUCBvdXRwdXQgYmFjayBvbiBpZiBjbG9zaW5nIHRoZSBkZXZpY2UgZm9yIHJlYWQgKi8KKwkKKwlpZiAoKGRldmMtPnN1Ym1vZGVsID09IFNVQk1ETF9BTFMwMDcpICYmIChkZXZjLT5vcGVuZWQgJiBPUEVOX1JFQUQpKSAKKwl7CisJCXNiX3NldG1peGVyKGRldmMsQUxTMDA3X09VVFBVVF9DVFJMMiwKKwkJCXNiX2dldG1peGVyKGRldmMsQUxTMDA3X09VVFBVVF9DVFJMMikgfCAweDA2KTsKKwl9CisJZGV2Yy0+b3BlbmVkID0gMDsKK30KKworc3RhdGljIHZvaWQgc2Jfc2V0X291dHB1dF9wYXJtcyhpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IG5yX2J5dGVzLAorCQkgICAgaW50IGludHJmbGFnKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoIWRldmMtPmZ1bGxkdXBsZXggfHwgZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSkKKwl7CisJCWRldmMtPnRyZ19idWYgPSBidWY7CisJCWRldmMtPnRyZ19ieXRlcyA9IG5yX2J5dGVzOworCQlkZXZjLT50cmdfaW50cmZsYWcgPSBpbnRyZmxhZzsKKwkJZGV2Yy0+aXJxX21vZGUgPSBJTU9ERV9PVVRQVVQ7CisJfQorCWVsc2UKKwl7CisJCWRldmMtPnRyZ19idWZfMTYgPSBidWY7CisJCWRldmMtPnRyZ19ieXRlc18xNiA9IG5yX2J5dGVzOworCQlkZXZjLT50cmdfaW50cmZsYWdfMTYgPSBpbnRyZmxhZzsKKwkJZGV2Yy0+aXJxX21vZGVfMTYgPSBJTU9ERV9PVVRQVVQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBzYl9zZXRfaW5wdXRfcGFybXMoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwgaW50IGludHJmbGFnKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoIWRldmMtPmZ1bGxkdXBsZXggfHwgZGV2Yy0+Yml0cyAhPSBBRk1UX1MxNl9MRSkKKwl7CisJCWRldmMtPnRyZ19idWYgPSBidWY7CisJCWRldmMtPnRyZ19ieXRlcyA9IGNvdW50OworCQlkZXZjLT50cmdfaW50cmZsYWcgPSBpbnRyZmxhZzsKKwkJZGV2Yy0+aXJxX21vZGUgPSBJTU9ERV9JTlBVVDsKKwl9CisJZWxzZQorCXsKKwkJZGV2Yy0+dHJnX2J1Zl8xNiA9IGJ1ZjsKKwkJZGV2Yy0+dHJnX2J5dGVzXzE2ID0gY291bnQ7CisJCWRldmMtPnRyZ19pbnRyZmxhZ18xNiA9IGludHJmbGFnOworCQlkZXZjLT5pcnFfbW9kZV8xNiA9IElNT0RFX0lOUFVUOworCX0KK30KKworLyoKKyAqIFNCMS54IGNvbXBhdGlibGUgcm91dGluZXMgCisgKi8KKworc3RhdGljIHZvaWQgc2IxX2F1ZGlvX291dHB1dF9ibG9jayhpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IG5yX2J5dGVzLCBpbnQgaW50cmZsYWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQgPSBucl9ieXRlczsKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJLyogRE1BYnVmX3N0YXJ0X2RtYSAoZGV2LCBidWYsIGNvdW50LCBETUFfTU9ERV9XUklURSk7ICovCisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID4gMykKKwkJY291bnQgPj49IDE7CisJY291bnQtLTsKKworCWRldmMtPmlycV9tb2RlID0gSU1PREVfT1VUUFVUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc2JfZHNwX2NvbW1hbmQoZGV2YywgMHgxNCkpCQkvKiA4IGJpdCBEQUMgdXNpbmcgRE1BICovCisJeworCQlzYl9kc3BfY29tbWFuZChkZXZjLCAodW5zaWduZWQgY2hhcikgKGNvdW50ICYgMHhmZikpOworCQlzYl9kc3BfY29tbWFuZChkZXZjLCAodW5zaWduZWQgY2hhcikgKChjb3VudCA+PiA4KSAmIDB4ZmYpKTsKKwl9CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZCBCbGFzdGVyOiAgdW5hYmxlIHRvIHN0YXJ0IERBQy5cbiIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNiMV9hdWRpb19zdGFydF9pbnB1dChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IG5yX2J5dGVzLCBpbnQgaW50cmZsYWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQgPSBucl9ieXRlczsKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJLyoKKwkgKiBTdGFydCBhIERNQSBpbnB1dCB0byB0aGUgYnVmZmVyIHBvaW50ZWQgYnkgZG1hcXRhaWwKKwkgKi8KKworCS8qIERNQWJ1Zl9zdGFydF9kbWEgKGRldiwgYnVmLCBjb3VudCwgRE1BX01PREVfUkVBRCk7ICovCisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID4gMykKKwkJY291bnQgPj49IDE7CisJY291bnQtLTsKKworCWRldmMtPmlycV9tb2RlID0gSU1PREVfSU5QVVQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWlmIChzYl9kc3BfY29tbWFuZChkZXZjLCAweDI0KSkJCS8qIDggYml0IEFEQyB1c2luZyBETUEgKi8KKwl7CisJCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoY291bnQgJiAweGZmKSk7CisJCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoKGNvdW50ID4+IDgpICYgMHhmZikpOworCX0KKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiU291bmQgQmxhc3RlcjogIHVuYWJsZSB0byBzdGFydCBBREMuXG4iKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisKKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNiMV9hdWRpb190cmlnZ2VyKGludCBkZXYsIGludCBiaXRzKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwliaXRzICY9IGRldmMtPmlycV9tb2RlOworCisJaWYgKCFiaXRzKQorCQlzYl9kc3BfY29tbWFuZChkZXZjLCAweGQwKTsJLyogSGFsdCBETUEgKi8KKwllbHNlCisJeworCQlzd2l0Y2ggKGRldmMtPmlycV9tb2RlKQorCQl7CisJCQljYXNlIElNT0RFX0lOUFVUOgorCQkJCXNiMV9hdWRpb19zdGFydF9pbnB1dChkZXYsIGRldmMtPnRyZ19idWYsIGRldmMtPnRyZ19ieXRlcywKKwkJCQkJCWRldmMtPnRyZ19pbnRyZmxhZyk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSU1PREVfT1VUUFVUOgorCQkJCXNiMV9hdWRpb19vdXRwdXRfYmxvY2soZGV2LCBkZXZjLT50cmdfYnVmLCBkZXZjLT50cmdfYnl0ZXMsCisJCQkJCQlkZXZjLT50cmdfaW50cmZsYWcpOworCQkJCWJyZWFrOworCQl9CisJfQorCWRldmMtPnRyaWdnZXJfYml0cyA9IGJpdHM7Cit9CisKK3N0YXRpYyBpbnQgc2IxX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWlmIChzYl9kc3BfY29tbWFuZChkZXZjLCAweDQwKSkKKwkJc2JfZHNwX2NvbW1hbmQoZGV2YywgZGV2Yy0+dGNvbnN0KTsKKwlzYl9kc3BfY29tbWFuZChkZXZjLCBEU1BfQ01EX1NQS09GRik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJZGV2Yy0+dHJpZ2dlcl9iaXRzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYjFfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWlmIChzYl9kc3BfY29tbWFuZChkZXZjLCAweDQwKSkKKwkJc2JfZHNwX2NvbW1hbmQoZGV2YywgZGV2Yy0+dGNvbnN0KTsKKwlzYl9kc3BfY29tbWFuZChkZXZjLCBEU1BfQ01EX1NQS09OKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJZGV2Yy0+dHJpZ2dlcl9iaXRzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYjFfYXVkaW9fc2V0X3NwZWVkKGludCBkZXYsIGludCBzcGVlZCkKK3sKKwlpbnQgbWF4X3NwZWVkID0gMjMwMDA7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlpbnQgdG1wOworCisJaWYgKGRldmMtPm9wZW5lZCAmIE9QRU5fUkVBRCkKKwkJbWF4X3NwZWVkID0gMTMwMDA7CisKKwlpZiAoc3BlZWQgPiAwKQorCXsKKwkJaWYgKHNwZWVkIDwgNDAwMCkKKwkJCXNwZWVkID0gNDAwMDsKKworCQlpZiAoc3BlZWQgPiBtYXhfc3BlZWQpCisJCQlzcGVlZCA9IG1heF9zcGVlZDsKKworCQlkZXZjLT50Y29uc3QgPSAoMjU2IC0gKCgxMDAwMDAwICsgc3BlZWQgLyAyKSAvIHNwZWVkKSkgJiAweGZmOworCQl0bXAgPSAyNTYgLSBkZXZjLT50Y29uc3Q7CisJCXNwZWVkID0gKDEwMDAwMDAgKyB0bXAgLyAyKSAvIHRtcDsKKworCQlkZXZjLT5zcGVlZCA9IHNwZWVkOworCX0KKwlyZXR1cm4gZGV2Yy0+c3BlZWQ7Cit9CisKK3N0YXRpYyBzaG9ydCBzYjFfYXVkaW9fc2V0X2NoYW5uZWxzKGludCBkZXYsIHNob3J0IGNoYW5uZWxzKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJcmV0dXJuIGRldmMtPmNoYW5uZWxzID0gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzYjFfYXVkaW9fc2V0X2JpdHMoaW50IGRldiwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJc2JfZGV2YyAgICAgICAgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJcmV0dXJuIGRldmMtPmJpdHMgPSA4OworfQorCitzdGF0aWMgdm9pZCBzYjFfYXVkaW9faGFsdF94ZmVyKGludCBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlzYl9kc3BfcmVzZXQoZGV2Yyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogU0IgMi4wIGFuZCBTQiAyLjAxIGNvbXBhdGlibGUgcm91dGluZXMKKyAqLworCitzdGF0aWMgdm9pZCBzYjIwX2F1ZGlvX291dHB1dF9ibG9jayhpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IG5yX2J5dGVzLAorCQkJaW50IGludHJmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50ID0gbnJfYnl0ZXM7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBjaGFyIGNtZDsKKworCS8qIERNQWJ1Zl9zdGFydF9kbWEgKGRldiwgYnVmLCBjb3VudCwgRE1BX01PREVfV1JJVEUpOyAqLworCisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA+IDMpCisJCWNvdW50ID4+PSAxOworCWNvdW50LS07CisKKwlkZXZjLT5pcnFfbW9kZSA9IElNT0RFX09VVFBVVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJaWYgKHNiX2RzcF9jb21tYW5kKGRldmMsIDB4NDgpKQkJLyogRFNQIEJsb2NrIHNpemUgKi8KKwl7CisJCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoY291bnQgJiAweGZmKSk7CisJCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoKGNvdW50ID4+IDgpICYgMHhmZikpOworCisJCWlmIChkZXZjLT5zcGVlZCAqIGRldmMtPmNoYW5uZWxzIDw9IDIzMDAwKQorCQkJY21kID0gMHgxYzsJLyogOCBiaXQgUENNIG91dHB1dCAqLworCQllbHNlCisJCQljbWQgPSAweDkwOwkvKiA4IGJpdCBoaWdoIHNwZWVkIFBDTSBvdXRwdXQgKFNCMi4wMS9Qcm8pICovCisKKwkJaWYgKCFzYl9kc3BfY29tbWFuZChkZXZjLCBjbWQpKQorCQkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZCBCbGFzdGVyOiAgdW5hYmxlIHRvIHN0YXJ0IERBQy5cbiIpOworCX0KKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiU291bmQgQmxhc3RlcjogdW5hYmxlIHRvIHN0YXJ0IERBQy5cbiIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNiMjBfYXVkaW9fc3RhcnRfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBucl9ieXRlcywgaW50IGludHJmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50ID0gbnJfYnl0ZXM7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBjaGFyIGNtZDsKKworCS8qCisJICogU3RhcnQgYSBETUEgaW5wdXQgdG8gdGhlIGJ1ZmZlciBwb2ludGVkIGJ5IGRtYXF0YWlsCisJICovCisKKwkvKiBETUFidWZfc3RhcnRfZG1hIChkZXYsIGJ1ZiwgY291bnQsIERNQV9NT0RFX1JFQUQpOyAqLworCisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA+IDMpCisJCWNvdW50ID4+PSAxOworCWNvdW50LS07CisKKwlkZXZjLT5pcnFfbW9kZSA9IElNT0RFX0lOUFVUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc2JfZHNwX2NvbW1hbmQoZGV2YywgMHg0OCkpCQkvKiBEU1AgQmxvY2sgc2l6ZSAqLworCXsKKwkJc2JfZHNwX2NvbW1hbmQoZGV2YywgKHVuc2lnbmVkIGNoYXIpIChjb3VudCAmIDB4ZmYpKTsKKwkJc2JfZHNwX2NvbW1hbmQoZGV2YywgKHVuc2lnbmVkIGNoYXIpICgoY291bnQgPj4gOCkgJiAweGZmKSk7CisKKwkJaWYgKGRldmMtPnNwZWVkICogZGV2Yy0+Y2hhbm5lbHMgPD0gKGRldmMtPm1ham9yID09IDMgPyAyMzAwMCA6IDEzMDAwKSkKKwkJCWNtZCA9IDB4MmM7CS8qIDggYml0IFBDTSBpbnB1dCAqLworCQllbHNlCisJCQljbWQgPSAweDk4OwkvKiA4IGJpdCBoaWdoIHNwZWVkIFBDTSBpbnB1dCAoU0IyLjAxL1BybykgKi8KKworCQlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIGNtZCkpCisJCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kIEJsYXN0ZXI6ICB1bmFibGUgdG8gc3RhcnQgQURDLlxuIik7CisJfQorCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZCBCbGFzdGVyOiAgdW5hYmxlIHRvIHN0YXJ0IEFEQy5cbiIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNiMjBfYXVkaW9fdHJpZ2dlcihpbnQgZGV2LCBpbnQgYml0cykKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCWJpdHMgJj0gZGV2Yy0+aXJxX21vZGU7CisKKwlpZiAoIWJpdHMpCisJCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4ZDApOwkvKiBIYWx0IERNQSAqLworCWVsc2UKKwl7CisJCXN3aXRjaCAoZGV2Yy0+aXJxX21vZGUpCisJCXsKKwkJCWNhc2UgSU1PREVfSU5QVVQ6CisJCQkJc2IyMF9hdWRpb19zdGFydF9pbnB1dChkZXYsIGRldmMtPnRyZ19idWYsIGRldmMtPnRyZ19ieXRlcywKKwkJCQkJCWRldmMtPnRyZ19pbnRyZmxhZyk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSU1PREVfT1VUUFVUOgorCQkJCXNiMjBfYXVkaW9fb3V0cHV0X2Jsb2NrKGRldiwgZGV2Yy0+dHJnX2J1ZiwgZGV2Yy0+dHJnX2J5dGVzLAorCQkJCQkJZGV2Yy0+dHJnX2ludHJmbGFnKTsKKwkJCSAgICBicmVhazsKKwkJfQorCX0KKwlkZXZjLT50cmlnZ2VyX2JpdHMgPSBiaXRzOworfQorCisvKgorICogU0IyLjAxIHNwZWNpZmljIHNwZWVkIHNldHVwCisgKi8KKworc3RhdGljIGludCBzYjIwMV9hdWRpb19zZXRfc3BlZWQoaW50IGRldiwgaW50IHNwZWVkKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJaW50IHRtcDsKKwlpbnQgcyA9IHNwZWVkICogZGV2Yy0+Y2hhbm5lbHM7CisKKwlpZiAoc3BlZWQgPiAwKQorCXsKKwkJaWYgKHNwZWVkIDwgNDAwMCkKKwkJCXNwZWVkID0gNDAwMDsKKwkJaWYgKHNwZWVkID4gNDQxMDApCisJCQlzcGVlZCA9IDQ0MTAwOworCQlpZiAoZGV2Yy0+b3BlbmVkICYgT1BFTl9SRUFEICYmIHNwZWVkID4gMTUwMDApCisJCQlzcGVlZCA9IDE1MDAwOworCQlkZXZjLT50Y29uc3QgPSAoMjU2IC0gKCgxMDAwMDAwICsgcyAvIDIpIC8gcykpICYgMHhmZjsKKwkJdG1wID0gMjU2IC0gZGV2Yy0+dGNvbnN0OworCQlzcGVlZCA9ICgoMTAwMDAwMCArIHRtcCAvIDIpIC8gdG1wKSAvIGRldmMtPmNoYW5uZWxzOworCisJCWRldmMtPnNwZWVkID0gc3BlZWQ7CisJfQorCXJldHVybiBkZXZjLT5zcGVlZDsKK30KKworLyoKKyAqIFNCIFBybyBzcGVjaWZpYyByb3V0aW5lcworICovCisKK3N0YXRpYyBpbnQgc2Jwcm9fYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQorewkJCQkvKiBGb3IgU0IgUHJvIGFuZCBKYXp6MTYgKi8KKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBiaXRzID0gMDsKKworCWlmIChkZXZjLT5kbWExNiA+PSAwICYmIGRldmMtPmRtYTE2ICE9IGRldmMtPmRtYTgpCisJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hID0KKwkJCWRldmMtPmJpdHMgPT0gMTYgPyBkZXZjLT5kbWExNiA6IGRldmMtPmRtYTg7CisKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX0pBWlogfHwgZGV2Yy0+bW9kZWwgPT0gTURMX1NNVykKKwkJaWYgKGRldmMtPmJpdHMgPT0gQUZNVF9TMTZfTEUpCisJCQliaXRzID0gMHgwNDsJLyogMTYgYml0IG1vZGUgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJaWYgKHNiX2RzcF9jb21tYW5kKGRldmMsIDB4NDApKQorCQlzYl9kc3BfY29tbWFuZChkZXZjLCBkZXZjLT50Y29uc3QpOworCXNiX2RzcF9jb21tYW5kKGRldmMsIERTUF9DTURfU1BLT0ZGKTsKKwlpZiAoZGV2Yy0+Y2hhbm5lbHMgPT0gMSkKKwkJc2JfZHNwX2NvbW1hbmQoZGV2YywgMHhhMCB8IGJpdHMpOwkvKiBNb25vIGlucHV0ICovCisJZWxzZQorCQlzYl9kc3BfY29tbWFuZChkZXZjLCAweGE4IHwgYml0cyk7CS8qIFN0ZXJlbyBpbnB1dCAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCWRldmMtPnRyaWdnZXJfYml0cyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Jwcm9fYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sJCQkJLyogRm9yIFNCIFBybyBhbmQgSmF6ejE2ICovCisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdG1wOworCXVuc2lnbmVkIGNoYXIgYml0cyA9IDA7CisKKwlpZiAoZGV2Yy0+ZG1hMTYgPj0gMCAmJiBkZXZjLT5kbWExNiAhPSBkZXZjLT5kbWE4KQorCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPSBhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSA9IGRldmMtPmJpdHMgPT0gMTYgPyBkZXZjLT5kbWExNiA6IGRldmMtPmRtYTg7CisJaWYgKGRldmMtPm1vZGVsID09IE1ETF9TQlBSTykKKwkJc2JfbWl4ZXJfc2V0X3N0ZXJlbyhkZXZjLCBkZXZjLT5jaGFubmVscyA9PSAyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJaWYgKHNiX2RzcF9jb21tYW5kKGRldmMsIDB4NDApKQorCQlzYl9kc3BfY29tbWFuZChkZXZjLCBkZXZjLT50Y29uc3QpOworCXNiX2RzcF9jb21tYW5kKGRldmMsIERTUF9DTURfU1BLT04pOworCisJaWYgKGRldmMtPm1vZGVsID09IE1ETF9KQVpaIHx8IGRldmMtPm1vZGVsID09IE1ETF9TTVcpCisJeworCQlpZiAoZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSkKKwkJCWJpdHMgPSAweDA0OwkvKiAxNiBiaXQgbW9kZSAqLworCisJCWlmIChkZXZjLT5jaGFubmVscyA9PSAxKQorCQkJc2JfZHNwX2NvbW1hbmQoZGV2YywgMHhhMCB8IGJpdHMpOwkvKiBNb25vIG91dHB1dCAqLworCQllbHNlCisJCQlzYl9kc3BfY29tbWFuZChkZXZjLCAweGE4IHwgYml0cyk7CS8qIFN0ZXJlbyBvdXRwdXQgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCX0KKwllbHNlCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJCXRtcCA9IHNiX2dldG1peGVyKGRldmMsIDB4MGUpOworCQlpZiAoZGV2Yy0+Y2hhbm5lbHMgPT0gMSkKKwkJCXRtcCAmPSB+MHgwMjsKKwkJZWxzZQorCQkJdG1wIHw9IDB4MDI7CisJCXNiX3NldG1peGVyKGRldmMsIDB4MGUsIHRtcCk7CisJfQorCWRldmMtPnRyaWdnZXJfYml0cyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Jwcm9fYXVkaW9fc2V0X3NwZWVkKGludCBkZXYsIGludCBzcGVlZCkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKHNwZWVkID4gMCkKKwl7CisJCWlmIChzcGVlZCA8IDQwMDApCisJCQlzcGVlZCA9IDQwMDA7CisJCWlmIChzcGVlZCA+IDQ0MTAwKQorCQkJc3BlZWQgPSA0NDEwMDsKKwkJaWYgKGRldmMtPmNoYW5uZWxzID4gMSAmJiBzcGVlZCA+IDIyMDUwKQorCQkJc3BlZWQgPSAyMjA1MDsKKwkJc2IyMDFfYXVkaW9fc2V0X3NwZWVkKGRldiwgc3BlZWQpOworCX0KKwlyZXR1cm4gZGV2Yy0+c3BlZWQ7Cit9CisKK3N0YXRpYyBzaG9ydCBzYnByb19hdWRpb19zZXRfY2hhbm5lbHMoaW50IGRldiwgc2hvcnQgY2hhbm5lbHMpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmIChjaGFubmVscyA9PSAxIHx8IGNoYW5uZWxzID09IDIpCisJeworCQlpZiAoY2hhbm5lbHMgIT0gZGV2Yy0+Y2hhbm5lbHMpCisJCXsKKwkJCWRldmMtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisJCQlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX1NCUFJPICYmIGRldmMtPmNoYW5uZWxzID09IDIpCisJCQkJc2Jwcm9fYXVkaW9fc2V0X3NwZWVkKGRldiwgZGV2Yy0+c3BlZWQpOworCQl9CisJfQorCXJldHVybiBkZXZjLT5jaGFubmVsczsKK30KKworc3RhdGljIGludCBqYXp6MTZfYXVkaW9fc2V0X3NwZWVkKGludCBkZXYsIGludCBzcGVlZCkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKHNwZWVkID4gMCkKKwl7CisJCWludCB0bXA7CisJCWludCBzID0gc3BlZWQgKiBkZXZjLT5jaGFubmVsczsKKworCQlpZiAoc3BlZWQgPCA1MDAwKQorCQkJc3BlZWQgPSA1MDAwOworCQlpZiAoc3BlZWQgPiA0NDEwMCkKKwkJCXNwZWVkID0gNDQxMDA7CisKKwkJZGV2Yy0+dGNvbnN0ID0gKDI1NiAtICgoMTAwMDAwMCArIHMgLyAyKSAvIHMpKSAmIDB4ZmY7CisKKwkJdG1wID0gMjU2IC0gZGV2Yy0+dGNvbnN0OworCQlzcGVlZCA9ICgoMTAwMDAwMCArIHRtcCAvIDIpIC8gdG1wKSAvIGRldmMtPmNoYW5uZWxzOworCisJCWRldmMtPnNwZWVkID0gc3BlZWQ7CisJfQorCXJldHVybiBkZXZjLT5zcGVlZDsKK30KKworLyoKKyAqIFNCMTYgc3BlY2lmaWMgcm91dGluZXMKKyAqLworCitzdGF0aWMgaW50IHNiMTZfYXVkaW9fc2V0X3NwZWVkKGludCBkZXYsIGludCBzcGVlZCkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCWludAltYXhfc3BlZWQgPSBkZXZjLT5zdWJtb2RlbCA9PSBTVUJNRExfQUxTMTAwID8gNDgwMDAgOiA0NDEwMDsKKworCWlmIChzcGVlZCA+IDApCisJeworCQlpZiAoc3BlZWQgPCA1MDAwKQorCQkJc3BlZWQgPSA1MDAwOworCisJCWlmIChzcGVlZCA+IG1heF9zcGVlZCkKKwkJCXNwZWVkID0gbWF4X3NwZWVkOworCisJCWRldmMtPnNwZWVkID0gc3BlZWQ7CisJfQorCXJldHVybiBkZXZjLT5zcGVlZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzYjE2X2F1ZGlvX3NldF9iaXRzKGludCBkZXYsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoYml0cyAhPSAwKQorCXsKKwkJaWYgKGJpdHMgPT0gQUZNVF9VOCB8fCBiaXRzID09IEFGTVRfUzE2X0xFKQorCQkJZGV2Yy0+Yml0cyA9IGJpdHM7CisJCWVsc2UKKwkJCWRldmMtPmJpdHMgPSBBRk1UX1U4OworCX0KKworCXJldHVybiBkZXZjLT5iaXRzOworfQorCitzdGF0aWMgaW50IHNiMTZfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoIWRldmMtPmZ1bGxkdXBsZXgpCisJeworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPQorCQkJYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEgPQorCQkJCWRldmMtPmJpdHMgPT0gQUZNVF9TMTZfTEUgPworCQkJCQlkZXZjLT5kbWExNiA6IGRldmMtPmRtYTg7CisJfQorCWVsc2UgaWYgKGRldmMtPmJpdHMgPT0gQUZNVF9TMTZfTEUpCisJeworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPSBkZXZjLT5kbWE4OworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSA9IGRldmMtPmRtYTE2OworCX0KKwllbHNlCisJeworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPSBkZXZjLT5kbWExNjsKKwkJYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEgPSBkZXZjLT5kbWE4OworCX0KKworCWRldmMtPnRyaWdnZXJfYml0cyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2IxNl9hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoIWRldmMtPmZ1bGxkdXBsZXgpCisJeworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPQorCQkJYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEgPQorCQkJCWRldmMtPmJpdHMgPT0gQUZNVF9TMTZfTEUgPworCQkJCQlkZXZjLT5kbWExNiA6IGRldmMtPmRtYTg7CisJfQorCWVsc2UgaWYgKGRldmMtPmJpdHMgPT0gQUZNVF9TMTZfTEUpCisJeworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPSBkZXZjLT5kbWE4OworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSA9IGRldmMtPmRtYTE2OworCX0KKwllbHNlCisJeworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPSBkZXZjLT5kbWExNjsKKwkJYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEgPSBkZXZjLT5kbWE4OworCX0KKworCWRldmMtPnRyaWdnZXJfYml0cyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNiMTZfYXVkaW9fb3V0cHV0X2Jsb2NrKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgY291bnQsCisJCQlpbnQgaW50cmZsYWcpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzLCBjbnQ7CisJc2JfZGV2YyAgICAgICAgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJdW5zaWduZWQgbG9uZyAgIGJpdHM7CisKKwlpZiAoIWRldmMtPmZ1bGxkdXBsZXggfHwgZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSkKKwl7CisJCWRldmMtPmlycV9tb2RlID0gSU1PREVfT1VUUFVUOworCQlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7CisJfQorCWVsc2UKKwl7CisJCWRldmMtPmlycV9tb2RlXzE2ID0gSU1PREVfT1VUUFVUOworCQlkZXZjLT5pbnRyX2FjdGl2ZV8xNiA9IDE7CisJfQorCisJLyogc2F2ZSB2YWx1ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJYml0cyA9IGRldmMtPmJpdHM7CisJaWYgKGRldmMtPmZ1bGxkdXBsZXgpCisJCWRldmMtPmJpdHMgPSAoZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSkgPworCQkJQUZNVF9VOCA6IEFGTVRfUzE2X0xFOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCWNudCA9IGNvdW50OworCWlmIChkZXZjLT5iaXRzID09IEFGTVRfUzE2X0xFKQorCQljbnQgPj49IDE7CisJY250LS07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJLyogRE1BYnVmX3N0YXJ0X2RtYSAoZGV2LCBidWYsIGNvdW50LCBETUFfTU9ERV9XUklURSk7ICovCisKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAweDQxKTsKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAodW5zaWduZWQgY2hhcikgKChkZXZjLT5zcGVlZCA+PiA4KSAmIDB4ZmYpKTsKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAodW5zaWduZWQgY2hhcikgKGRldmMtPnNwZWVkICYgMHhmZikpOworCisJc2JfZHNwX2NvbW1hbmQoZGV2YywgKGRldmMtPmJpdHMgPT0gQUZNVF9TMTZfTEUgPyAweGI2IDogMHhjNikpOworCXNiX2RzcF9jb21tYW5kKGRldmMsICgoZGV2Yy0+Y2hhbm5lbHMgPT0gMiA/IDB4MjAgOiAwKSArCisJCQkgICAgICAoZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSA/IDB4MTAgOiAwKSkpOworCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoY250ICYgMHhmZikpOworCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoY250ID4+IDgpKTsKKworCS8qIHJlc3RvcmUgcmVhbCB2YWx1ZSBhZnRlciBhbGwgcHJvZ3JhbW1pbmcgKi8KKwlkZXZjLT5iaXRzID0gYml0czsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Cit9CisKKworLyoKKyAqCVRoaXMgZmFpbHMgb24gdGhlIEN5cml4IE1lZGlhR1guIElmIHlvdSBkb24ndCBoYXZlIHRoZSBETUEgZW5hYmxlZAorICoJYmVmb3JlIHRoZSBmaXJzdCBzYW1wbGUgYXJyaXZlcyBpdCBsb2NrcyB1cC4gSG93ZXZlciBldmVuIGlmIHlvdQorICoJZG8gZW5hYmxlIHRoZSBETUEgaW4gdGltZSB5b3UganVzdCBnZXQgRE1BIHRpbWVvdXRzIGFuZCBtaXNzaW5nCisgKglpbnRlcnJ1cHRzIGFuZCBzdHVmZiwgc28gZm9yIG5vdyBJJ3ZlIG5vdCBib3RoZXJlZCBmaXhpbmcgdGhpcyBlaXRoZXIuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNiMTZfYXVkaW9fc3RhcnRfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwgaW50IGludHJmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFncywgY250OworCXNiX2RldmMgICAgICAgICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKCFkZXZjLT5mdWxsZHVwbGV4IHx8IGRldmMtPmJpdHMgIT0gQUZNVF9TMTZfTEUpCisJeworCQlkZXZjLT5pcnFfbW9kZSA9IElNT0RFX0lOUFVUOworCQlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7CisJfQorCWVsc2UKKwl7CisJCWRldmMtPmlycV9tb2RlXzE2ID0gSU1PREVfSU5QVVQ7CisJCWRldmMtPmludHJfYWN0aXZlXzE2ID0gMTsKKwl9CisKKwljbnQgPSBjb3VudDsKKwlpZiAoZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSkKKwkJY250ID4+PSAxOworCWNudC0tOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCS8qIERNQWJ1Zl9zdGFydF9kbWEgKGRldiwgYnVmLCBjb3VudCwgRE1BX01PREVfUkVBRCk7ICovCisKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAweDQyKTsKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAodW5zaWduZWQgY2hhcikgKChkZXZjLT5zcGVlZCA+PiA4KSAmIDB4ZmYpKTsKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAodW5zaWduZWQgY2hhcikgKGRldmMtPnNwZWVkICYgMHhmZikpOworCisJc2JfZHNwX2NvbW1hbmQoZGV2YywgKGRldmMtPmJpdHMgPT0gQUZNVF9TMTZfTEUgPyAweGJlIDogMHhjZSkpOworCXNiX2RzcF9jb21tYW5kKGRldmMsICgoZGV2Yy0+Y2hhbm5lbHMgPT0gMiA/IDB4MjAgOiAwKSArCisJCQkgICAgICAoZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSA/IDB4MTAgOiAwKSkpOworCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoY250ICYgMHhmZikpOworCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoY250ID4+IDgpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2IxNl9hdWRpb190cmlnZ2VyKGludCBkZXYsIGludCBiaXRzKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpbnQgYml0c18xNiA9IGJpdHMgJiBkZXZjLT5pcnFfbW9kZV8xNjsKKwliaXRzICY9IGRldmMtPmlycV9tb2RlOworCisJaWYgKCFiaXRzICYmICFiaXRzXzE2KQorCQlzYl9kc3BfY29tbWFuZChkZXZjLCAweGQwKTsJLyogSGFsdCBETUEgKi8KKwllbHNlCisJeworCQlpZiAoYml0cykKKwkJeworCQkJc3dpdGNoIChkZXZjLT5pcnFfbW9kZSkKKwkJCXsKKwkJCQljYXNlIElNT0RFX0lOUFVUOgorCQkJCQlzYjE2X2F1ZGlvX3N0YXJ0X2lucHV0KGRldiwKKwkJCQkJCQlkZXZjLT50cmdfYnVmLAorCQkJCQkJCWRldmMtPnRyZ19ieXRlcywKKwkJCQkJCQlkZXZjLT50cmdfaW50cmZsYWcpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgSU1PREVfT1VUUFVUOgorCQkJCQlzYjE2X2F1ZGlvX291dHB1dF9ibG9jayhkZXYsCisJCQkJCQkJZGV2Yy0+dHJnX2J1ZiwKKwkJCQkJCQlkZXZjLT50cmdfYnl0ZXMsCisJCQkJCQkJZGV2Yy0+dHJnX2ludHJmbGFnKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGJpdHNfMTYpCisJCXsKKwkJCXN3aXRjaCAoZGV2Yy0+aXJxX21vZGVfMTYpCisJCQl7CisJCQkJY2FzZSBJTU9ERV9JTlBVVDoKKwkJCQkJc2IxNl9hdWRpb19zdGFydF9pbnB1dChkZXYsCisJCQkJCQkJZGV2Yy0+dHJnX2J1Zl8xNiwKKwkJCQkJCQlkZXZjLT50cmdfYnl0ZXNfMTYsCisJCQkJCQkJZGV2Yy0+dHJnX2ludHJmbGFnXzE2KTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIElNT0RFX09VVFBVVDoKKwkJCQkJc2IxNl9hdWRpb19vdXRwdXRfYmxvY2soZGV2LAorCQkJCQkJCWRldmMtPnRyZ19idWZfMTYsCisJCQkJCQkJZGV2Yy0+dHJnX2J5dGVzXzE2LAorCQkJCQkJCWRldmMtPnRyZ19pbnRyZmxhZ18xNik7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZGV2Yy0+dHJpZ2dlcl9iaXRzID0gYml0cyB8IGJpdHNfMTY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxidWY4WzIwNDhdOworc3RhdGljIHNpZ25lZCBzaG9ydCAqbGJ1ZjE2ID0gKHNpZ25lZCBzaG9ydCAqKWxidWY4OworI2RlZmluZSBMQlVGQ09QWVNJWkUgMTAyNAorc3RhdGljIHZvaWQKK3NiMTZfY29weV9mcm9tX3VzZXIoaW50IGRldiwKKwkJY2hhciAqbG9jYWxidWYsIGludCBsb2NhbG9mZnMsCisJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLCBpbnQgdXNlcm9mZnMsCisJCWludCBtYXhfaW4sIGludCBtYXhfb3V0LAorCQlpbnQgKnVzZWQsIGludCAqcmV0dXJuZWQsCisJCWludCBsZW4pCit7CisJc2JfZGV2YyAgICAgICAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlpbnQgICAgICAgICAgIGksIGMsIHAsIGxvY2FsbGVuOworCXVuc2lnbmVkIGNoYXIgKmJ1Zjg7CisJc2lnbmVkIHNob3J0ICAqYnVmMTY7CisKKwkvKiBpZiBub3QgZHVwbGV4IG5vIGNvbnZlcnNpb24gKi8KKwlpZiAoIWRldmMtPmZ1bGxkdXBsZXgpCisJeworCQlpZiAoY29weV9mcm9tX3VzZXIobG9jYWxidWYgKyBsb2NhbG9mZnMsCisJCQkJICAgdXNlcmJ1ZiArIHVzZXJvZmZzLCBsZW4pKQorCQkJcmV0dXJuOworCQkqdXNlZCA9IGxlbjsKKwkJKnJldHVybmVkID0gbGVuOworCX0KKwllbHNlIGlmIChkZXZjLT5iaXRzID09IEFGTVRfUzE2X0xFKQorCXsKKwkJLyogMTYgLT4gOCAqLworCQkvKiBtYXhfaW4gPj4gMSwgbWF4IG51bWJlciBvZiBzYW1wbGVzIGluICggMTYgYml0cyApICovCisJCS8qIG1heF9vdXQsIG1heCBudW1iZXIgb2Ygc2FtcGxlcyBvdXQgKCA4IGJpdHMgKSAqLworCQkvKiBsZW4sIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgd2lsbCBiZSB0YWtlbiAoIDE2IGJpdHMgKSovCisJCS8qIGMsIGNvdW50IG9mIHNhbXBsZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAoIDE2IGJpdHMgKSovCisJCS8qIHAsIGNvdW50IG9mIHNhbXBsZXMgYWxyZWFkeSBwcm9jZXNzZWQgKCAxNiBiaXRzICkqLworCQlsZW4gPSAoIChtYXhfaW4gPj4gMSkgPiBtYXhfb3V0KSA/IG1heF9vdXQgOiAobWF4X2luID4+IDEpOworCQljID0gbGVuOworCQlwID0gMDsKKwkJYnVmOCA9ICh1bnNpZ25lZCBjaGFyICopKGxvY2FsYnVmICsgbG9jYWxvZmZzKTsKKwkJd2hpbGUgKGMpCisJCXsKKwkJCWxvY2FsbGVuID0gKGMgPj0gTEJVRkNPUFlTSVpFID8gTEJVRkNPUFlTSVpFIDogYyk7CisJCQkvKiA8PCAxIGluIG9yZGVyIHRvIGdldCAxNiBiaXQgc2FtcGxlcyAqLworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGxidWYxNiwKKwkJCQkJICAgdXNlcmJ1ZiArIHVzZXJvZmZzICsgKHAgPDwgMSksCisJCQkJCSAgIGxvY2FsbGVuIDw8IDEpKQorCQkJCXJldHVybjsKKwkJCWZvciAoaSA9IDA7IGkgPCBsb2NhbGxlbjsgaSsrKQorCQkJeworCQkJCWJ1ZjhbcCtpXSA9IH4oKGxidWYxNltpXSA+PiA4KSAmIDB4ZmYpIF4gMHg4MDsKKwkJCX0KKwkJCWMgLT0gbG9jYWxsZW47IHAgKz0gbG9jYWxsZW47CisJCX0KKwkJLyogdXNlZCA9ICggc2FtcGxlcyAqIDE2IGJpdHMgc2l6ZSApICovCisJCSp1c2VkID0gIG1heF9pbiAgPiAoIG1heF9vdXQgPDwgMSkgPyAobWF4X291dCA8PCAxKSA6IG1heF9pbjsKKwkJLyogcmV0dXJuZWQgPSAoIHNhbXBsZXMgKiA4IGJpdHMgc2l6ZSApICovCisJCSpyZXR1cm5lZCA9IGxlbjsKKwl9CisJZWxzZQorCXsKKwkJLyogOCAtPiAxNiAqLworCQkvKiBtYXhfaW4sIG1heCBudW1iZXIgb2Ygc2FtcGxlcyBpbiAoIDggYml0cyApICovCisJCS8qIG1heF9vdXQgPj4gMSwgbWF4IG51bWJlciBvZiBzYW1wbGVzIG91dCAoIDE2IGJpdHMgKSAqLworCQkvKiBsZW4sIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgd2lsbCBiZSB0YWtlbiAoIDggYml0cyApKi8KKwkJLyogYywgY291bnQgb2Ygc2FtcGxlcyByZW1haW5pbmcgaW4gYnVmZmVyICggOCBiaXRzICkqLworCQkvKiBwLCBjb3VudCBvZiBzYW1wbGVzIGFscmVhZHkgcHJvY2Vzc2VkICggOCBiaXRzICkqLworCQlsZW4gPSBtYXhfaW4gPiAobWF4X291dCA+PiAxKSA/IChtYXhfb3V0ID4+IDEpIDogbWF4X2luOworCQljID0gbGVuOworCQlwID0gMDsKKwkJYnVmMTYgPSAoc2lnbmVkIHNob3J0ICopKGxvY2FsYnVmICsgbG9jYWxvZmZzKTsKKwkJd2hpbGUgKGMpCisJCXsKKwkJCWxvY2FsbGVuID0gKGMgPj0gTEJVRkNPUFlTSVpFID8gTEJVRkNPUFlTSVpFIDogYyk7CisJCQlpZiAoY29weV9mcm9tX3VzZXIobGJ1ZjgsCisJCQkJCSAgIHVzZXJidWYrdXNlcm9mZnMgKyBwLAorCQkJCQkgICBsb2NhbGxlbikpCisJCQkJcmV0dXJuOworCQkJZm9yIChpID0gMDsgaSA8IGxvY2FsbGVuOyBpKyspCisJCQl7CisJCQkJYnVmMTZbcCtpXSA9ICh+bGJ1ZjhbaV0gXiAweDgwKSA8PCA4OworCQkJfQorCSAgICAgIAkJYyAtPSBsb2NhbGxlbjsgcCArPSBsb2NhbGxlbjsKKwkJfQorCQkvKiB1c2VkID0gKCBzYW1wbGVzICogOCBiaXRzIHNpemUgKSAqLworCQkqdXNlZCA9IGxlbjsKKwkJLyogcmV0dXJuZWQgPSAoIHNhbXBsZXMgKiAxNiBiaXRzIHNpemUgKSAqLworCQkqcmV0dXJuZWQgPSBsZW4gPDwgMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzYjE2X2F1ZGlvX21tYXAoaW50IGRldikKK3sKKwlzYl9kZXZjICAgICAgICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCWRldmMtPmZ1bGxkdXBsZXggPSAwOworfQorCitzdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBzYjFfYXVkaW9fZHJpdmVyID0JLyogU0IxLnggKi8KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBzYl9hdWRpb19vcGVuLAorCS5jbG9zZQkJCT0gc2JfYXVkaW9fY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBzYl9zZXRfb3V0cHV0X3Bhcm1zLAorCS5zdGFydF9pbnB1dAkJPSBzYl9zZXRfaW5wdXRfcGFybXMsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gc2IxX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBzYjFfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0LAorCS5oYWx0X2lvCQk9IHNiMV9hdWRpb19oYWx0X3hmZXIsCisJLnRyaWdnZXIJCT0gc2IxX2F1ZGlvX3RyaWdnZXIsCisJLnNldF9zcGVlZAkJPSBzYjFfYXVkaW9fc2V0X3NwZWVkLAorCS5zZXRfYml0cwkJPSBzYjFfYXVkaW9fc2V0X2JpdHMsCisJLnNldF9jaGFubmVscwkJPSBzYjFfYXVkaW9fc2V0X2NoYW5uZWxzCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBzYjIwX2F1ZGlvX2RyaXZlciA9CS8qIFNCMi4wICovCit7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gc2JfYXVkaW9fb3BlbiwKKwkuY2xvc2UJCQk9IHNiX2F1ZGlvX2Nsb3NlLAorCS5vdXRwdXRfYmxvY2sJCT0gc2Jfc2V0X291dHB1dF9wYXJtcywKKwkuc3RhcnRfaW5wdXQJCT0gc2Jfc2V0X2lucHV0X3Bhcm1zLAorCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IHNiMV9hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dCwKKwkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gc2IxX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dCwKKwkuaGFsdF9pbwkJPSBzYjFfYXVkaW9faGFsdF94ZmVyLAorCS50cmlnZ2VyCQk9IHNiMjBfYXVkaW9fdHJpZ2dlciwKKwkuc2V0X3NwZWVkCQk9IHNiMV9hdWRpb19zZXRfc3BlZWQsCisJLnNldF9iaXRzCQk9IHNiMV9hdWRpb19zZXRfYml0cywKKwkuc2V0X2NoYW5uZWxzCQk9IHNiMV9hdWRpb19zZXRfY2hhbm5lbHMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIHNiMjAxX2F1ZGlvX2RyaXZlciA9CQkvKiBTQjIuMDEgKi8KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBzYl9hdWRpb19vcGVuLAorCS5jbG9zZQkJCT0gc2JfYXVkaW9fY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBzYl9zZXRfb3V0cHV0X3Bhcm1zLAorCS5zdGFydF9pbnB1dAkJPSBzYl9zZXRfaW5wdXRfcGFybXMsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gc2IxX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBzYjFfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0LAorCS5oYWx0X2lvCQk9IHNiMV9hdWRpb19oYWx0X3hmZXIsCisJLnRyaWdnZXIJCT0gc2IyMF9hdWRpb190cmlnZ2VyLAorCS5zZXRfc3BlZWQJCT0gc2IyMDFfYXVkaW9fc2V0X3NwZWVkLAorCS5zZXRfYml0cwkJPSBzYjFfYXVkaW9fc2V0X2JpdHMsCisJLnNldF9jaGFubmVscwkJPSBzYjFfYXVkaW9fc2V0X2NoYW5uZWxzCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBzYnByb19hdWRpb19kcml2ZXIgPQkJLyogU0IgUHJvICovCit7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gc2JfYXVkaW9fb3BlbiwKKwkuY2xvc2UJCQk9IHNiX2F1ZGlvX2Nsb3NlLAorCS5vdXRwdXRfYmxvY2sJCT0gc2Jfc2V0X291dHB1dF9wYXJtcywKKwkuc3RhcnRfaW5wdXQJCT0gc2Jfc2V0X2lucHV0X3Bhcm1zLAorCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IHNicHJvX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBzYnByb19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQsCisJLmhhbHRfaW8JCT0gc2IxX2F1ZGlvX2hhbHRfeGZlciwKKwkudHJpZ2dlcgkJPSBzYjIwX2F1ZGlvX3RyaWdnZXIsCisJLnNldF9zcGVlZAkJPSBzYnByb19hdWRpb19zZXRfc3BlZWQsCisJLnNldF9iaXRzCQk9IHNiMV9hdWRpb19zZXRfYml0cywKKwkuc2V0X2NoYW5uZWxzCQk9IHNicHJvX2F1ZGlvX3NldF9jaGFubmVscworfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgamF6ejE2X2F1ZGlvX2RyaXZlciA9CS8qIEphenoxNiBhbmQgU00gV2F2ZSAqLworeworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCQk9IHNiX2F1ZGlvX29wZW4sCisJLmNsb3NlCQkJPSBzYl9hdWRpb19jbG9zZSwKKwkub3V0cHV0X2Jsb2NrCQk9IHNiX3NldF9vdXRwdXRfcGFybXMsCisJLnN0YXJ0X2lucHV0CQk9IHNiX3NldF9pbnB1dF9wYXJtcywKKwkucHJlcGFyZV9mb3JfaW5wdXQJPSBzYnByb19hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dCwKKwkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gc2Jwcm9fYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0LAorCS5oYWx0X2lvCQk9IHNiMV9hdWRpb19oYWx0X3hmZXIsCisJLnRyaWdnZXIJCT0gc2IyMF9hdWRpb190cmlnZ2VyLAorCS5zZXRfc3BlZWQJCT0gamF6ejE2X2F1ZGlvX3NldF9zcGVlZCwKKwkuc2V0X2JpdHMJCT0gc2IxNl9hdWRpb19zZXRfYml0cywKKwkuc2V0X2NoYW5uZWxzCQk9IHNicHJvX2F1ZGlvX3NldF9jaGFubmVscworfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgc2IxNl9hdWRpb19kcml2ZXIgPQkvKiBTQjE2ICovCit7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gc2JfYXVkaW9fb3BlbiwKKwkuY2xvc2UJCQk9IHNiX2F1ZGlvX2Nsb3NlLAorCS5vdXRwdXRfYmxvY2sJCT0gc2Jfc2V0X291dHB1dF9wYXJtcywKKwkuc3RhcnRfaW5wdXQJCT0gc2Jfc2V0X2lucHV0X3Bhcm1zLAorCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IHNiMTZfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQsCisJLnByZXBhcmVfZm9yX291dHB1dAk9IHNiMTZfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0LAorCS5oYWx0X2lvCQk9IHNiMV9hdWRpb19oYWx0X3hmZXIsCisJLmNvcHlfdXNlcgkJPSBzYjE2X2NvcHlfZnJvbV91c2VyLAorCS50cmlnZ2VyCQk9IHNiMTZfYXVkaW9fdHJpZ2dlciwKKwkuc2V0X3NwZWVkCQk9IHNiMTZfYXVkaW9fc2V0X3NwZWVkLAorCS5zZXRfYml0cwkJPSBzYjE2X2F1ZGlvX3NldF9iaXRzLAorCS5zZXRfY2hhbm5lbHMJCT0gc2Jwcm9fYXVkaW9fc2V0X2NoYW5uZWxzLAorCS5tbWFwCQkJPSBzYjE2X2F1ZGlvX21tYXAKK307CisKK3ZvaWQgc2JfYXVkaW9faW5pdChzYl9kZXZjICogZGV2YywgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJaW50IGF1ZGlvX2ZsYWdzID0gMDsKKwlpbnQgZm9ybWF0X21hc2sgPSBBRk1UX1U4OworCisJc3RydWN0IGF1ZGlvX2RyaXZlciAqZHJpdmVyID0gJnNiMV9hdWRpb19kcml2ZXI7CisKKwlzd2l0Y2ggKGRldmMtPm1vZGVsKQorCXsKKwkJY2FzZSBNRExfU0IxOgkvKiBTQjEuMCBvciBTQiAxLjUgKi8KKwkJCUREQihwcmludGsoIldpbGwgdXNlIHN0YW5kYXJkIFNCMS54IGRyaXZlclxuIikpOworCQkJYXVkaW9fZmxhZ3MgPSBETUFfSEFSRFNUT1A7CisJCQlicmVhazsKKworCQljYXNlIE1ETF9TQjI6CisJCQlEREIocHJpbnRrKCJXaWxsIHVzZSBTQjIuMCBkcml2ZXJcbiIpKTsKKwkJCWF1ZGlvX2ZsYWdzID0gRE1BX0FVVE9NT0RFOworCQkJZHJpdmVyID0gJnNiMjBfYXVkaW9fZHJpdmVyOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRExfU0IyMDE6CisJCQlEREIocHJpbnRrKCJXaWxsIHVzZSBTQjIuMDEgKGhpZ2ggc3BlZWQpIGRyaXZlclxuIikpOworCQkJYXVkaW9fZmxhZ3MgPSBETUFfQVVUT01PREU7CisJCQlkcml2ZXIgPSAmc2IyMDFfYXVkaW9fZHJpdmVyOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRExfSkFaWjoKKwkJY2FzZSBNRExfU01XOgorCQkJRERCKHByaW50aygiV2lsbCB1c2UgSmF6ejE2IGRyaXZlclxuIikpOworCQkJYXVkaW9fZmxhZ3MgPSBETUFfQVVUT01PREU7CisJCQlmb3JtYXRfbWFzayB8PSBBRk1UX1MxNl9MRTsKKwkJCWRyaXZlciA9ICZqYXp6MTZfYXVkaW9fZHJpdmVyOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRExfRVNTOgorCQkJRERCKHByaW50aygiV2lsbCB1c2UgRVNTIEVTNjg4LzE2ODggZHJpdmVyXG4iKSk7CisJCQlkcml2ZXIgPSBlc3NfYXVkaW9faW5pdCAoZGV2YywgJmF1ZGlvX2ZsYWdzLCAmZm9ybWF0X21hc2spOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRExfU0IxNjoKKwkJCUREQihwcmludGsoIldpbGwgdXNlIFNCMTYgZHJpdmVyXG4iKSk7CisJCQlhdWRpb19mbGFncyA9IERNQV9BVVRPTU9ERTsKKwkJCWZvcm1hdF9tYXNrIHw9IEFGTVRfUzE2X0xFOworCQkJaWYgKGRldmMtPmRtYTggIT0gZGV2Yy0+ZG1hMTYgJiYgZGV2Yy0+ZG1hMTYgIT0gLTEpCisJCQl7CisJCQkJYXVkaW9fZmxhZ3MgfD0gRE1BX0RVUExFWDsKKwkJCQlkZXZjLT5kdXBsZXggPSAxOworCQkJfQorCQkJZHJpdmVyID0gJnNiMTZfYXVkaW9fZHJpdmVyOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUREQihwcmludGsoIldpbGwgdXNlIFNCIFBybyBkcml2ZXJcbiIpKTsKKwkJCWF1ZGlvX2ZsYWdzID0gRE1BX0FVVE9NT0RFOworCQkJZHJpdmVyID0gJnNicHJvX2F1ZGlvX2RyaXZlcjsKKwl9CisKKwlpZiAob3duZXIpCisJCQlkcml2ZXItPm93bmVyID0gb3duZXI7CisJCisJaWYgKChkZXZjLT5kZXYgPSBzb3VuZF9pbnN0YWxsX2F1ZGlvZHJ2KEFVRElPX0RSSVZFUl9WRVJTSU9OLAorCQkJCW5hbWUsZHJpdmVyLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2RyaXZlciksCisJCQkJYXVkaW9fZmxhZ3MsIGZvcm1hdF9tYXNrLCBkZXZjLAorCQkJCWRldmMtPmRtYTgsCisJCQkJZGV2Yy0+ZHVwbGV4ID8gZGV2Yy0+ZG1hMTYgOiBkZXZjLT5kbWE4KSkgPCAwKQorCXsKKwkJICBwcmludGsoS0VSTl9FUlIgIlNvdW5kIEJsYXN0ZXI6ICB1bmFibGUgdG8gaW5zdGFsbCBhdWRpby5cbiIpOworCQkgIHJldHVybjsKKwl9CisJYXVkaW9fZGV2c1tkZXZjLT5kZXZdLT5taXhlcl9kZXYgPSBkZXZjLT5teV9taXhlcmRldjsKKwlhdWRpb19kZXZzW2RldmMtPmRldl0tPm1pbl9mcmFnbWVudCA9IDU7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2JfY2FyZC5jIGIvc291bmQvb3NzL3NiX2NhcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBiODJlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NiX2NhcmQuYwpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIHNvdW5kL29zcy9zYl9jYXJkLmMKKyAqCisgKiBEZXRlY3Rpb24gcm91dGluZSBmb3IgdGhlIElTQSBTb3VuZCBCbGFzdGVyIGFuZCBjb21wYXRhYmxlIHNvdW5kCisgKiBjYXJkcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiBzb2Z0d2FyZSBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFRoaXMgaXMgYSBjb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBkZXRlY3Rpb24gcm91dGluZXMuIFRoaXMgd2FzCisgKiBwcm9tcHRlZCBieSB0aGUgUG5QIEFQSSBjaGFuZ2UgZHVyaW5nIHYyLjUgYW5kIHRoZSB1Z2x5IHN0YXRlIHRoZQorICogY29kZSB3YXMgaW4uCisgKgorICogQ29weXJpZ2h0IChDKSBieSBQYXVsIExhdWZlciAyMDAyLiBCYXNlZCBvbiBjb2RlIG9yaWdpbmFsbHkgYnkKKyAqIEhhbm51IFNhdm9sYWluZW4gd2hpY2ggd2FzIG1vZGlmaWVkIGJ5IG1hbnkgb3RoZXJzIG92ZXIgdGhlCisgKiB5ZWFycy4gQXV0aG9ycyBzcGVjaWZpY2FsbHkgbWVudGlvbmVkIGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uIHdlcmU6CisgKiBEYW5pZWwgU3RvbmUsIEFsZXNzYW5kcm8gWnVtbW8sIEplZmYgR2FyemlrLCBBcm5hbGRvIENhcnZhbGhvIGRlCisgKiBNZWxvLCBEYW5pZWwgQ2h1cmNoLCBhbmQgbXlzZWxmLgorICoKKyAqIDAyLTA1LTIwMDMgT3JpZ2luYWwgUmVsZWFzZSwgUGF1bCBMYXVmZXIgPHBhdWxAbGF1ZmVybmV0LmNvbT4KKyAqIDAyLTA3LTIwMDMgQnVnIG1hZGUgaXQgaW50byBmaXJzdCByZWxlYXNlLiBUYWtlIHR3by4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAic2JfbWl4ZXIuaCIKKyNpbmNsdWRlICJzYi5oIgorI2lmZGVmIENPTkZJR19QTlAKKyNpbmNsdWRlIDxsaW51eC9wbnAuaD4KKyNlbmRpZiAvKiBDT05GSUdfUE5QICovCisjaW5jbHVkZSAic2JfY2FyZC5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIk9TUyBTb3VuZGJsYXN0ZXIgSVNBIFBuUCBhbmQgbGVnYWN5IHNvdW5kIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitleHRlcm4gdm9pZCAqc213X2ZyZWU7CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfaW8JPSAwOworc3RhdGljIGludCBfX2luaXRkYXRhIGlvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMTYJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSB0eXBlCT0gMDsgLyogQ2FuIHNldCB0aGlzIHRvIGEgc3BlY2lmaWMgY2FyZCB0eXBlICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgZXNzdHlwZSAgID0gMDsgLyogRVNTIGNoaXAgdHlwZSAqLworc3RhdGljIGludCBfX2luaXRkYXRhIGFjZXIgCT0gMDsgLyogRG8gYWNlciBub3RlYm9vayBpbml0PyAqLworc3RhdGljIGludCBfX2luaXRkYXRhIHNtX2dhbWVzIAk9IDA7IC8qIExvZ2l0ZWNoIHNvdW5kbWFuIGdhbWVzPyAqLworCitzdGF0aWMgc3RydWN0IHNiX2NhcmRfY29uZmlnICpsZWdhY3kgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1BOUAorc3RhdGljIGludCBfX2luaXRkYXRhIHBucCAgICAgICA9IDE7CisvKgorc3RhdGljIGludCBfX2luaXRkYXRhIHVhcnQ0MDEJPSAwOworKi8KKyNlbHNlCitzdGF0aWMgaW50IF9faW5pdGRhdGEgcG5wICAgICAgID0gMDsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oaW8sIGludCwgMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICAgICAgICJTb3VuZGJsYXN0ZXIgaS9vIGJhc2UgYWRkcmVzcyAoMHgyMjAsMHgyNDAsMHgyNjAsMHgyODApIik7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwJICAgIklSUSAoNSw3LDksMTApIik7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRtYSwJICAgIjgtYml0IERNQSBjaGFubmVsICgwLDEsMykiKTsKK21vZHVsZV9wYXJhbShkbWExNiwgaW50LCAwMDApOworTU9EVUxFX1BBUk1fREVTQyhkbWExNiwJICAgIjE2LWJpdCBETUEgY2hhbm5lbCAoNSw2LDcpIik7Cittb2R1bGVfcGFyYW0obXB1X2lvLCBpbnQsIDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1wdV9pbywgICAiTVBVIGJhc2UgYWRkcmVzcyIpOworbW9kdWxlX3BhcmFtKHR5cGUsIGludCwgMDAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHlwZSwJICAgIllvdSBjYW4gc2V0IHRoaXMgdG8gc3BlY2lmaWMgY2FyZCB0eXBlIChkb2Vzbid0ICIgXAorCQkgIndvcmsgd2l0aCBwbnApIik7Cittb2R1bGVfcGFyYW0oc21fZ2FtZXMsIGludCwgMDAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc21fZ2FtZXMsICJFbmFibGUgc3VwcG9ydCBmb3IgTG9naXRlY2ggc291bmRtYW4gZ2FtZXMgIiBcCisJCSAiKGRvZXNuJ3Qgd29yayB3aXRoIHBucCkiKTsKK21vZHVsZV9wYXJhbShlc3N0eXBlLCBpbnQsIDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGVzc3R5cGUsICAiRVNTIGNoaXAgdHlwZSAoZG9lc24ndCB3b3JrIHdpdGggcG5wKSIpOworbW9kdWxlX3BhcmFtKGFjZXIsIGludCwgMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWNlciwJICAgIlNldCB0aGlzIHRvIGRldGVjdCBjYXJkcyBpbiBzb21lIEFDRVIgbm90ZWJvb2tzICJcCisJCSAiKGRvZXNuJ3Qgd29yayB3aXRoIHBucCkiKTsKKworI2lmZGVmIENPTkZJR19QTlAKK21vZHVsZV9wYXJhbShwbnAsIGludCwgMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG5wLCAgICAgIldlbnQgc2V0IHRvIDAgd2lsbCBkaXNhYmxlIGRldGVjdGlvbiB1c2luZyBQblAuICJcCisJCSAgIkRlZmF1bHQgaXMgMS5cbiIpOworLyogTm90IGRvbmUgeWV0Li4uLiAqLworLyoKK21vZHVsZV9wYXJhbSh1YXJ0NDAxLCBpbnQsIDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHVhcnQ0MDEsICAiV2hlbiBzZXQgdG8gMSwgd2lsbCBhdHRlbXB0IHRvIGRldGVjdCBhbmQgZW5hYmxlIlwKKwkJICJ0aGUgbXB1IG9uIHNvbWUgY2xvbmVzIik7CisqLworI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KKworLyogT1NTIHN1YnN5c3RlbSBjYXJkIHJlZ2lzdHJhdGlvbiBzaGFyZWQgYnkgUG5QIGFuZCBsZWdhY3kgcm91dGluZXMgKi8KK3N0YXRpYyBpbnQgc2JfcmVnaXN0ZXJfb3NzKHN0cnVjdCBzYl9jYXJkX2NvbmZpZyAqc2NjLCBzdHJ1Y3Qgc2JfbW9kdWxlX29wdGlvbnMgKnNibW8pCit7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzY2MtPmNvbmYuaW9fYmFzZSwgMTYsICJzb3VuZGJsYXN0ZXIiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNiOiBwb3J0cyBidXN5LlxuIik7CisJCWtmcmVlKHNjYyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKCFzYl9kc3BfZGV0ZWN0KCZzY2MtPmNvbmYsIDAsIDAsIHNibW8pKSB7CisJCXJlbGVhc2VfcmVnaW9uKHNjYy0+Y29uZi5pb19iYXNlLCAxNik7CisJCXByaW50ayhLRVJOX0VSUiAic2I6IEZhaWxlZCBEU1AgRGV0ZWN0LlxuIik7CisJCWtmcmVlKHNjYyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZighc2JfZHNwX2luaXQoJnNjYy0+Y29uZiwgVEhJU19NT0RVTEUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2I6IEZhaWxlZCBEU1AgaW5pdC5cbiIpOworCQlrZnJlZShzY2MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYoc2NjLT5tcHVjbmYuaW9fYmFzZSA+IDApIHsKKwkJc2NjLT5tcHUgPSAxOworCQlwcmludGsoS0VSTl9JTkZPICJzYjogVHVybmluZyBvbiBNUFVcbiIpOworCQlpZighcHJvYmVfc2JtcHUoJnNjYy0+bXB1Y25mLCBUSElTX01PRFVMRSkpCisJCQlzY2MtPm1wdSA9IDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHNiX3VubG9hZChzdHJ1Y3Qgc2JfY2FyZF9jb25maWcgKnNjYykKK3sKKwlzYl9kc3BfdW5sb2FkKCZzY2MtPmNvbmYsIDApOworCWlmKHNjYy0+bXB1KQorCQl1bmxvYWRfc2JtcHUoJnNjYy0+bXB1Y25mKTsKKwlrZnJlZShzY2MpOworfQorCisvKiBSZWdpc3RlciBsZWdhY3kgY2FyZCB3aXRoIE9TUyBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBpbnQgc2JfaW5pdF9sZWdhY3kodm9pZCkKK3sKKwlzdHJ1Y3Qgc2JfbW9kdWxlX29wdGlvbnMgc2JtbyA9IHswfTsKKworCWlmKChsZWdhY3kgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2JfY2FyZF9jb25maWcpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInNiOiBFcnJvcjogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQobGVnYWN5LCAwLCBzaXplb2Yoc3RydWN0IHNiX2NhcmRfY29uZmlnKSk7CisKKwlsZWdhY3ktPmNvbmYuaW9fYmFzZSAgICAgID0gaW87CisJbGVnYWN5LT5jb25mLmlycSAgICAgICAgICA9IGlycTsKKwlsZWdhY3ktPmNvbmYuZG1hICAgICAgICAgID0gZG1hOworCWxlZ2FjeS0+Y29uZi5kbWEyICAgICAgICAgPSBkbWExNjsKKwlsZWdhY3ktPmNvbmYuY2FyZF9zdWJ0eXBlID0gdHlwZTsKKworCWxlZ2FjeS0+bXB1Y25mLmlvX2Jhc2UgPSBtcHVfaW87CisJbGVnYWN5LT5tcHVjbmYuaXJxICAgICA9IC0xOworCWxlZ2FjeS0+bXB1Y25mLmRtYSAgICAgPSAtMTsKKwlsZWdhY3ktPm1wdWNuZi5kbWEyICAgID0gLTE7CisKKwlzYm1vLmVzc3R5cGUgID0gZXNzdHlwZTsKKwlzYm1vLnNtX2dhbWVzID0gc21fZ2FtZXM7CisJc2Jtby5hY2VyICAgICA9IGFjZXI7CisKKwlyZXR1cm4gc2JfcmVnaXN0ZXJfb3NzKGxlZ2FjeSwgJnNibW8pOworfQorCisjaWZkZWYgQ09ORklHX1BOUAorCisvKiBQb3B1bGF0ZSB0aGUgT1NTIHN1YnN5c3RlbSBzdHJ1Y3R1cmVzIHdpdGggaW5mb3JtYXRpb24gZnJvbSBQblAgKi8KK3N0YXRpYyB2b2lkIHNiX2RldjJjZmcoc3RydWN0IHBucF9kZXYgKmRldiwgc3RydWN0IHNiX2NhcmRfY29uZmlnICpzY2MpCit7CisJc2NjLT5jb25mLmlvX2Jhc2UgICA9IC0xOworCXNjYy0+Y29uZi5pcnEgICAgICAgPSAtMTsKKwlzY2MtPmNvbmYuZG1hICAgICAgID0gLTE7CisJc2NjLT5jb25mLmRtYTIgICAgICA9IC0xOworCXNjYy0+bXB1Y25mLmlvX2Jhc2UgPSAtMTsKKwlzY2MtPm1wdWNuZi5pcnEgICAgID0gLTE7CisJc2NjLT5tcHVjbmYuZG1hICAgICA9IC0xOworCXNjYy0+bXB1Y25mLmRtYTIgICAgPSAtMTsKKworCS8qIEFsbCBjbG9uZXMgbGF5b3V0IHRoZWlyIFBuUCB0YWJsZXMgZGlmZmVyZW50bHkgYW5kIHNvbWUgdXNlCisJICAgZGlmZmVyZW50IGxvZ2ljYWwgZGV2aWNlcyBmb3IgdGhlIE1QVSAqLworCWlmKCFzdHJuY21wKCJDVEwiLHNjYy0+Y2FyZF9pZCwzKSkgeworCQlzY2MtPmNvbmYuaW9fYmFzZSAgID0gcG5wX3BvcnRfc3RhcnQoZGV2LDApOworCQlzY2MtPmNvbmYuaXJxICAgICAgID0gcG5wX2lycShkZXYsMCk7CisJCXNjYy0+Y29uZi5kbWEgICAgICAgPSBwbnBfZG1hKGRldiwwKTsKKwkJc2NjLT5jb25mLmRtYTIgICAgICA9IHBucF9kbWEoZGV2LDEpOworCQlzY2MtPm1wdWNuZi5pb19iYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2LDEpOworCQlyZXR1cm47CisJfQorCWlmKCFzdHJuY21wKCJ0QkEiLHNjYy0+Y2FyZF9pZCwzKSkgeworCQlzY2MtPmNvbmYuaW9fYmFzZSAgID0gcG5wX3BvcnRfc3RhcnQoZGV2LDApOworCQlzY2MtPmNvbmYuaXJxICAgICAgID0gcG5wX2lycShkZXYsMCk7CisJCXNjYy0+Y29uZi5kbWEgICAgICAgPSBwbnBfZG1hKGRldiwwKTsKKwkJc2NjLT5jb25mLmRtYTIgICAgICA9IHBucF9kbWEoZGV2LDEpOworCQlyZXR1cm47CisJfQorCWlmKCFzdHJuY21wKCJFU1MiLHNjYy0+Y2FyZF9pZCwzKSkgeworCQlzY2MtPmNvbmYuaW9fYmFzZSAgID0gcG5wX3BvcnRfc3RhcnQoZGV2LDApOworCQlzY2MtPmNvbmYuaXJxICAgICAgID0gcG5wX2lycShkZXYsMCk7CisJCXNjYy0+Y29uZi5kbWEgICAgICAgPSBwbnBfZG1hKGRldiwwKTsKKwkJc2NjLT5jb25mLmRtYTIgICAgICA9IHBucF9kbWEoZGV2LDEpOworCSAgICAgICAJc2NjLT5tcHVjbmYuaW9fYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldiwyKTsKKwkJcmV0dXJuOworCX0KKwlpZighc3RybmNtcCgiQ01JIixzY2MtPmNhcmRfaWQsMykpIHsKKwkJc2NjLT5jb25mLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChkZXYsMCk7CisJCXNjYy0+Y29uZi5pcnEgICAgID0gcG5wX2lycShkZXYsMCk7CisJCXNjYy0+Y29uZi5kbWEgICAgID0gcG5wX2RtYShkZXYsMCk7CisJCXNjYy0+Y29uZi5kbWEyICAgID0gcG5wX2RtYShkZXYsMSk7CisJCXJldHVybjsKKwl9CisJaWYoIXN0cm5jbXAoIlJXQiIsc2NjLT5jYXJkX2lkLDMpKSB7CisJCXNjYy0+Y29uZi5pb19iYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2LDApOworCQlzY2MtPmNvbmYuaXJxICAgICA9IHBucF9pcnEoZGV2LDApOworCQlzY2MtPmNvbmYuZG1hICAgICA9IHBucF9kbWEoZGV2LDApOworCQlyZXR1cm47CisJfQorCWlmKCFzdHJuY21wKCJBTFMiLHNjYy0+Y2FyZF9pZCwzKSkgeworCQlpZighc3RybmNtcCgiQUxTMDAwNyIsc2NjLT5jYXJkX2lkLDcpKSB7CisJCQlzY2MtPmNvbmYuaW9fYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldiwwKTsKKwkJCXNjYy0+Y29uZi5pcnEgICAgID0gcG5wX2lycShkZXYsMCk7CisJCQlzY2MtPmNvbmYuZG1hICAgICA9IHBucF9kbWEoZGV2LDApOworCQl9IGVsc2UgeworCQkJc2NjLT5jb25mLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChkZXYsMCk7CisJCQlzY2MtPmNvbmYuaXJxICAgICA9IHBucF9pcnEoZGV2LDApOworCQkJc2NjLT5jb25mLmRtYSAgICAgPSBwbnBfZG1hKGRldiwxKTsKKwkJCXNjYy0+Y29uZi5kbWEyICAgID0gcG5wX2RtYShkZXYsMCk7CisJCX0KKwkJcmV0dXJuOworCX0KKwlpZighc3RybmNtcCgiUlRMIixzY2MtPmNhcmRfaWQsMykpIHsKKwkJc2NjLT5jb25mLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChkZXYsMCk7CisJCXNjYy0+Y29uZi5pcnEgICAgID0gcG5wX2lycShkZXYsMCk7CisJCXNjYy0+Y29uZi5kbWEgICAgID0gcG5wX2RtYShkZXYsMSk7CisJCXNjYy0+Y29uZi5kbWEyICAgID0gcG5wX2RtYShkZXYsMCk7CisJfQorfQorCisvKiBQcm9iZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIFBuUCBBUEkgKi8KK3N0YXRpYyBpbnQgc2JfcG5wX3Byb2JlKHN0cnVjdCBwbnBfY2FyZF9saW5rICpjYXJkLCBjb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICpjYXJkX2lkKQoreworCXN0cnVjdCBzYl9jYXJkX2NvbmZpZyAqc2NjOworCXN0cnVjdCBzYl9tb2R1bGVfb3B0aW9ucyBzYm1vID0gezB9OyAvKiBEZWZhdWx0IHRvIDAgZm9yIFBuUCAqLworCXN0cnVjdCBwbnBfZGV2ICpkZXYgPSBwbnBfcmVxdWVzdF9jYXJkX2RldmljZShjYXJkLCBjYXJkX2lkLT5kZXZzWzBdLmlkLCBOVUxMKTsKKwkKKwlpZighZGV2KXsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZigoc2NjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNiX2NhcmRfY29uZmlnKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYjogRXJyb3I6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHNjYywgMCwgc2l6ZW9mKHN0cnVjdCBzYl9jYXJkX2NvbmZpZykpOworCisJcHJpbnRrKEtFUk5fSU5GTyAic2I6IFBuUDogRm91bmQgQ2FyZCBOYW1lZCA9IFwiJXNcIiwgQ2FyZCBQblAgaWQgPSAiIFwKKwkgICAgICAgIiVzLCBEZXZpY2UgUG5QIGlkID0gJXNcbiIsIGNhcmQtPmNhcmQtPm5hbWUsIGNhcmRfaWQtPmlkLAorCSAgICAgICBkZXYtPmlkLT5pZCk7CisKKwlzY2MtPmNhcmRfaWQgPSBjYXJkX2lkLT5pZDsKKwlzY2MtPmRldl9pZCA9IGRldi0+aWQtPmlkOworCXNiX2RldjJjZmcoZGV2LCBzY2MpOworCisJcHJpbnRrKEtFUk5fSU5GTyAic2I6IFBuUDogICAgICBEZXRlY3RlZCBhdDogaW89MHgleCwgaXJxPSVkLCAiIFwKKwkgICAgICAgImRtYT0lZCwgZG1hMTY9JWRcbiIsIHNjYy0+Y29uZi5pb19iYXNlLCBzY2MtPmNvbmYuaXJxLAorCSAgICAgICBzY2MtPmNvbmYuZG1hLCBzY2MtPmNvbmYuZG1hMik7CisKKwlwbnBfc2V0X2NhcmRfZHJ2ZGF0YShjYXJkLCBzY2MpOworCisJcmV0dXJuIHNiX3JlZ2lzdGVyX29zcyhzY2MsICZzYm1vKTsKK30KKworc3RhdGljIHZvaWQgc2JfcG5wX3JlbW92ZShzdHJ1Y3QgcG5wX2NhcmRfbGluayAqY2FyZCkKK3sKKwlzdHJ1Y3Qgc2JfY2FyZF9jb25maWcgKnNjYyA9IHBucF9nZXRfY2FyZF9kcnZkYXRhKGNhcmQpOworCisJaWYoIXNjYykKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fSU5GTyAic2I6IFBuUDogUmVtb3ZpbmcgJXNcbiIsIHNjYy0+Y2FyZF9pZCk7CisKKwlzYl91bmxvYWQoc2NjKTsKK30KKworc3RhdGljIHN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgc2JfcG5wX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgICA9ICJPU1MgU25kQmxzdHIiLCAvKiAxNiBjaGFyYWN0ZXIgbGltaXQgKi8KKwkuaWRfdGFibGUgICAgICA9IHNiX3BucF9jYXJkX3RhYmxlLAorCS5wcm9iZSAgICAgICAgID0gc2JfcG5wX3Byb2JlLAorCS5yZW1vdmUgICAgICAgID0gc2JfcG5wX3JlbW92ZSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBucF9jYXJkLCBzYl9wbnBfY2FyZF90YWJsZSk7CisjZW5kaWYgLyogQ09ORklHX1BOUCAqLworCitzdGF0aWMgaW50IF9faW5pdCBzYl9pbml0KHZvaWQpCit7CisJaW50IGxyZXMgPSAwOworCWludCBwcmVzID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gInNiOiBJbml0OiBTdGFydGluZyBQcm9iZS4uLlxuIik7CisKKwlpZihpbyAhPSAtMSAmJiBpcnEgIT0gLTEgJiYgZG1hICE9IC0xKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNiOiBQcm9iaW5nIGxlZ2FjeSBjYXJkIHdpdGggaW89JXgsICJcCisJCSAgICAgICAiaXJxPSVkLCBkbWE9JWQsIGRtYTE2PSVkXG4iLGlvLCBpcnEsIGRtYSwgZG1hMTYpOworCQlscmVzID0gc2JfaW5pdF9sZWdhY3koKTsKKwl9IGVsc2UgaWYoKGlvICE9IC0xIHx8IGlycSAhPSAtMSB8fCBkbWEgIT0gLTEpIHx8CisJCSAgKCFwbnAgJiYgKGlvID09IC0xICYmIGlycSA9PSAtMSAmJiBkbWEgPT0gLTEpKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJzYjogRXJyb3I6IEF0IGxlYXN0IGlvLCBpcnEsIGFuZCBkbWEgIlwKKwkJICAgICAgICJtdXN0IGJlIHNldCBmb3IgbGVnYWN5IGNhcmRzLlxuIik7CisKKyNpZmRlZiBDT05GSUdfUE5QCisJaWYocG5wKSB7CisJCXByZXMgPSBwbnBfcmVnaXN0ZXJfY2FyZF9kcml2ZXIoJnNiX3BucF9kcml2ZXIpOworCX0KKyNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gInNiOiBJbml0OiBEb25lXG4iKTsKKworCS8qIElmIGVpdGhlciBQblAgb3IgTGVnYWN5IHJlZ2lzdGVyZWQgYSBjYXJkIHRoZW4gcmV0dXJuCisJICogc3VjY2VzcyAqLworCWlmIChwcmVzIDw9IDAgJiYgbHJlcyA8PSAwKSB7CisjaWZkZWYgQ09ORklHX1BOUAorCQlwbnBfdW5yZWdpc3Rlcl9jYXJkX2RyaXZlcigmc2JfcG5wX2RyaXZlcik7CisjZW5kaWYKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2JfZXhpdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gInNiOiBVbmxvYWRpbmcuLi5cbiIpOworCisJLyogVW5sb2FkIGxlZ2FjeSBjYXJkICovCisJaWYgKGxlZ2FjeSkgeworCQlwcmludGsgKEtFUk5fSU5GTyAic2I6IFVubG9hZGluZyBsZWdhY3kgY2FyZFxuIik7CisJCXNiX3VubG9hZChsZWdhY3kpOworCX0KKworI2lmZGVmIENPTkZJR19QTlAKKwlwbnBfdW5yZWdpc3Rlcl9jYXJkX2RyaXZlcigmc2JfcG5wX2RyaXZlcik7CisjZW5kaWYKKworCWlmIChzbXdfZnJlZSkgeworCQl2ZnJlZShzbXdfZnJlZSk7CisJCXNtd19mcmVlID0gTlVMTDsKKwl9Cit9CisKK21vZHVsZV9pbml0KHNiX2luaXQpOworbW9kdWxlX2V4aXQoc2JfZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2JfY2FyZC5oIGIvc291bmQvb3NzL3NiX2NhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTM1Y2ZmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NiX2NhcmQuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIHNvdW5kL29zcy9zYl9jYXJkLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiBzb2Z0d2FyZSBmb3IgbW9yZSBpbmZvLgorICoKKyAqIDAyLTA1LTIwMDIgT3JpZ2luYWwgUmVsZWFzZSwgUGF1bCBMYXVmZXIgPHBhdWxAbGF1ZmVybmV0LmNvbT4KKyAqLworCitzdHJ1Y3Qgc2JfY2FyZF9jb25maWcgeworCXN0cnVjdCBhZGRyZXNzX2luZm8gY29uZjsKKwlzdHJ1Y3QgYWRkcmVzc19pbmZvIG1wdWNuZjsKKwljb25zdCAgY2hhciAgICAgICAgICpjYXJkX2lkOworCWNvbnN0ICBjaGFyICAgICAgICAgKmRldl9pZDsKKwlpbnQgICAgICAgICAgICAgICAgIG1wdTsKK307CisKKyNpZmRlZiBDT05GSUdfUE5QCisKKy8qCisgKiBTb3VuZEJsYXN0ZXIgUG5QIHRhYmxlcyBhbmQgc3RydWN0dXJlcy4KKyAqLworCisvKiBDYXJkIFBuUCBJRCBUYWJsZSAqLworc3RhdGljIHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgc2JfcG5wX2NhcmRfdGFibGVbXSA9IHsKKwkvKiBTb3VuZCBCbGFzdGVyIDE2ICovCisJey5pZCA9ICJDVEwwMDI0IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgMTYgKi8KKwl7LmlkID0gIkNUTDAwMjUiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciAxNiAqLworCXsuaWQgPSAiQ1RMMDAyNiIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDMxIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIDE2ICovCisJey5pZCA9ICJDVEwwMDI3IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgMTYgKi8KKwl7LmlkID0gIkNUTDAwMjgiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciAxNiAqLworCXsuaWQgPSAiQ1RMMDAyOSIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDMxIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIDE2ICovCisJey5pZCA9ICJDVEwwMDJhIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgMTYgKi8KKwl7LmlkID0gIkNUTDAwMmIiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciAxNiAqLworCXsuaWQgPSAiQ1RMMDAyYyIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDMxIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIDE2ICovCisJey5pZCA9ICJDVEwwMGVkIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwNDEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgMTYgKi8KKwl7LmlkID0gIkNUTDAwODYiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0MSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBWaWJyYTE2UyAqLworCXsuaWQgPSAiQ1RMMDA1MSIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDAxIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIFZpYnJhMTZDICovCisJey5pZCA9ICJDVEwwMDcwIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMDEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgVmlicmExNkNMICovCisJey5pZCA9ICJDVEwwMDgwIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwNDEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgVmlicmExNkNMICovCisJey5pZCA9ICJDVEwwMEYwIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwNDMifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDMyICovCisJey5pZCA9ICJDVEwwMDM5IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDMyICovCisJey5pZCA9ICJDVEwwMDQyIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDMyICovCisJey5pZCA9ICJDVEwwMDQzIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDMyICovCisJey5pZCA9ICJDVEwwMDQ0IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDMyICovCisJey5pZCA9ICJDVEwwMDQ1IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDMyICovCisJey5pZCA9ICJDVEwwMDQ2IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDMyICovCisJey5pZCA9ICJDVEwwMDQ3IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDMyICovCisJey5pZCA9ICJDVEwwMDQ4IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDMyICovCisJey5pZCA9ICJDVEwwMDU0IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDMyICovCisJey5pZCA9ICJDVEwwMDlDIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwNDEifSwgfSB9LAorCS8qIENyZWF0ZWl2ZSBTQjMyIFBuUCAqLworCXsuaWQgPSAiQ1RMMDA5RiIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDQxIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIEFXRSA2NCAqLworCXsuaWQgPSAiQ1RMMDA5RCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDQyIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIEFXRSA2NCBHb2xkICovCisJey5pZCA9ICJDVEwwMDlFIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwNDQifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDY0IEdvbGQgKi8KKwl7LmlkID0gIkNUTDAwQjIiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0NCJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgNjQgKi8KKwl7LmlkID0gIkNUTDAwQzEiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0MiJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgNjQgKi8KKwl7LmlkID0gIkNUTDAwQzMiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0NSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgNjQgKi8KKwl7LmlkID0gIkNUTDAwQzUiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0NSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgNjQgKi8KKwl7LmlkID0gIkNUTDAwQzciLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0NSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgNjQgKi8KKwl7LmlkID0gIkNUTDAwRTQiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0NSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgNjQgKi8KKwl7LmlkID0gIkNUTDAwRTkiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0NSJ9LCB9IH0sCisJLyogRVNTIDE4NjggKi8KKwl7LmlkID0gIkVTUzA5NjgiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iRVNTMDk2OCJ9LCB9IH0sCisJLyogRVNTIDE4NjggKi8KKwl7LmlkID0gIkVTUzE4NjgiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iRVNTMTg2OCJ9LCB9IH0sCisJLyogRVNTIDE4NjggKi8KKwl7LmlkID0gIkVTUzE4NjgiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iRVNTODYxMSJ9LCB9IH0sCisJLyogRVNTIDE4NjkgUG5QIEF1ZGlvRHJpdmUgKi8KKwl7LmlkID0gIkVTUzAwMDMiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iRVNTMTg2OSJ9LCB9IH0sCisJLyogRVNTIDE4NjkgKi8KKwl7LmlkID0gIkVTUzE4NjkiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iRVNTMTg2OSJ9LCB9IH0sCisJLyogRVNTIDE4NzggKi8KKwl7LmlkID0gIkVTUzE4NzgiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iRVNTMTg3OCJ9LCB9IH0sCisJLyogRVNTIDE4NzkgKi8KKwl7LmlkID0gIkVTUzE4NzkiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iRVNTMTg3OSJ9LCB9IH0sCisJLyogQ01JIDgzMzAgU291bmRQUk8gKi8KKwl7LmlkID0gIkNNSTAwMDEiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQFhAMDAwMSJ9LAorCQkJCQkJICAgICB7LmlkPSJASEAwMDAxIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBAQDAwMDEifSwgfSB9LAorCS8qIERpYW1vbmQgRFQwMTk3SCAqLworCXsuaWQgPSAiUldSMTY4OCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJAQEAwMDAxIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBYQDAwMDEifSwKKwkJCQkJCSAgICAgey5pZD0iQEhAMDAwMSJ9LCB9IH0sCisJLyogQUxTMDA3ICovCisJey5pZCA9ICJBTFMwMDA3IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkBAQDAwMDEifSwKKwkJCQkJCSAgICAgey5pZD0iQFhAMDAwMSJ9LAorCQkJCQkJICAgICB7LmlkPSJASEAwMDAxIn0sIH0gfSwKKwkvKiBBTFMxMDAgKi8KKwl7LmlkID0gIkFMUzAwMDEiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQEBAMDAwMSJ9LAorCQkJCQkJICAgICB7LmlkPSJAWEAwMDAxIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBIQDAwMDEifSwgfSB9LAorCS8qIEFMUzExMCAqLworCXsuaWQgPSAiQUxTMDExMCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJAQEAxMDAxIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBYQDEwMDEifSwKKwkJCQkJCSAgICAgey5pZD0iQEhAMDAwMSJ9LCB9IH0sCisJLyogQUxTMTIwICovCisJey5pZCA9ICJBTFMwMTIwIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkBAQDIwMDEifSwKKwkJCQkJCSAgICAgey5pZD0iQFhAMjAwMSJ9LAorCQkJCQkJICAgICB7LmlkPSJASEAwMDAxIn0sIH0gfSwKKwkvKiBBTFMyMDAgKi8KKwl7LmlkID0gIkFMUzAyMDAiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQEBAMDAyMCJ9LAorCQkJCQkJICAgICB7LmlkPSJAWEAwMDMwIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBIQDAwMDEifSwgfSB9LAorCS8qIEFMUzIwMCAqLworCXsuaWQgPSAiUlRMMzAwMCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJAQEAyMDAxIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBYQDIwMDEifSwKKwkJCQkJCSAgICAgey5pZD0iQEhAMDAwMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciAxNiAoVmlydHVhbCBQQyAyMDA0KSAqLworCXsuaWQgPSAidEJBMDNiMCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJQTlBiMDAzIn0sIH0gfSwKKwkvKiAtZW5kLSAqLworCXsuaWQgPSAiIiwgfQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2JfY29tbW9uLmMgYi9zb3VuZC9vc3Mvc2JfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzNTllNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zYl9jb21tb24uYwpAQCAtMCwwICsxLDEyOTEgQEAKKy8qCisgKiBzb3VuZC9zYl9jb21tb24uYworICoKKyAqIENvbW1vbiByb3V0aW5lcyBmb3IgU291bmQgQmxhc3RlciBjb21wYXRpYmxlIGNhcmRzLgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKgorICogRGFuaWVsIEouIFJvZHJpa3Nzb246IE1vZGlmaWVkIHNiaW50ciB0byBoYW5kbGUgOCBhbmQgMTYgYml0IGludGVycnVwdHMKKyAqICAgICAgICAgICAgICAgICAgICAgICBmb3IgZnVsbCBkdXBsZXggc3VwcG9ydCAoIG9ubHkgc2IxNiBieSBub3cgKQorICogUm9sZiBGb2trZW5zOgkgQWRkZWQgKEJFVEE/KSBzdXBwb3J0IGZvciBFUzE4ODcgY2hpcHMuCisgKiAoZm9ra2Vuc3JAdmVydGlzLm5sKQkgV2hpY2ggbWVhbnM6IFlvdSBjYW4gYWRqdXN0IHRoZSByZWNvcmRpbmcgbGV2ZWxzLgorICoKKyAqIDIwMDAvMDEvMTggLSBzZXBhcmF0ZWQgc2JfY2FyZCBhbmQgc2JfY29tbW9uIC0KKyAqIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKyAqCisgKiAyMDAwLzA5LzE4IC0gZ290IHJpZCBvZiBhdHRhY2hfdWFydDQwMQorICogQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKgorICogMjAwMS8wMS8yNiAtIHJlcGxhY2VkIENMSS9TVEkgd2l0aCBzcGlubG9ja3MKKyAqIENocmlzIFJhbmtpbiA8cmFua2luY0B6aXB3b3JsZC5jb20uYXU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJzb3VuZF9maXJtd2FyZS5oIgorCisjaW5jbHVkZSAibXB1NDAxLmgiCisKKyNpbmNsdWRlICJzYl9taXhlci5oIgorI2luY2x1ZGUgInNiLmgiCisjaW5jbHVkZSAic2JfZXNzLmgiCisKKy8qCisgKiBnbG9iYWwgbW9kdWxlIGZsYWcKKyAqLworCitpbnQgc2JfYmVfcXVpZXQ7CisKK3N0YXRpYyBzYl9kZXZjICpkZXRlY3RlZF9kZXZjOwkvKiBGb3IgY29tbXVuaWNhdGlvbiBmcm9tIHByb2JlIHRvIGluaXQgKi8KK3N0YXRpYyBzYl9kZXZjICpsYXN0X2RldmM7CS8qIEZvciBNUFU0MDEgaW5pdGlhbGl6YXRpb24gKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgamF6el9pcnFfYml0c1tdID0geworCTAsIDAsIDIsIDMsIDAsIDEsIDAsIDQsIDAsIDIsIDUsIDAsIDAsIDAsIDAsIDYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGphenpfZG1hX2JpdHNbXSA9IHsKKwkwLCAxLCAwLCAyLCAwLCAzLCAwLCA0Cit9OworCit2b2lkICpzbXdfZnJlZTsKKworLyoKKyAqIEphenoxNiBjaGlwc2V0IHNwZWNpZmljIGNvbnRyb2wgdmFyaWFibGVzCisgKi8KKworc3RhdGljIGludCBqYXp6MTZfYmFzZTsJCQkvKiBOb3QgZGV0ZWN0ZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGphenoxNl9iaXRzOwkvKiBJL08gcmVsb2NhdGlvbiBiaXRzICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGphenoxNl9sb2NrKTsKKworLyoKKyAqIExvZ2l0ZWNoIFNvdW5kbWFuIFdhdmUgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gY29kZQorICovCisKKyNpZmRlZiBTTVdfTUlESTAwMDFfSU5DTFVERUQKKyNpbmNsdWRlICJzbXctbWlkaTAwMDEuaCIKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgY2hhciAqc213X3Vjb2RlOworc3RhdGljIGludCAgICAgIHNtd191Y29kZUxlbjsKKworI2VuZGlmCisKK3N0YXRpYyBzYl9kZXZjICpsYXN0X3NiOwkJLyogTGFzdCBzYiBsb2FkZWQgKi8KKworaW50IHNiX2RzcF9jb21tYW5kKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxpbWl0OworCisJbGltaXQgPSBqaWZmaWVzICsgSFogLyAxMDsJLyogVGltZW91dCAqLworCQorCS8qCisJICogTm90ZSEgdGhlIGk8NTAwMDAwIGlzIGFuIGVtZXJnZW5jeSBleGl0LiBUaGUgc2JfZHNwX2NvbW1hbmQoKSBpcyBzb21ldGltZXMKKwkgKiBjYWxsZWQgd2hpbGUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGltZXIgaXMKKwkgKiBkaXNhYmxlZCBhbHNvLiBIb3dldmVyIHRoZSB0aW1lb3V0IHNpdHVhdGlvbiBpcyBhIGFibm9ybWFsIGNvbmRpdGlvbi4KKwkgKiBOb3JtYWxseSB0aGUgRFNQIHNob3VsZCBiZSByZWFkeSB0byBhY2NlcHQgY29tbWFuZHMgYWZ0ZXIganVzdCBjb3VwbGUgb2YKKwkgKiBsb29wcy4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCA1MDAwMDAgJiYgKGxpbWl0LWppZmZpZXMpPjA7IGkrKykKKwl7CisJCWlmICgoaW5iKERTUF9TVEFUVVMpICYgMHg4MCkgPT0gMCkKKwkJeworCQkJb3V0YigodmFsKSwgRFNQX0NPTU1BTkQpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQgQmxhc3RlcjogIERTUCBjb21tYW5kKCV4KSB0aW1lb3V0LlxuIiwgdmFsKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNiX2RzcF9nZXRfYnl0ZShzYl9kZXZjICogZGV2YykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDEwMDA7IGk7IGktLSkKKwl7CisJCWlmIChpbmIoRFNQX0RBVEFfQVZBSUwpICYgMHg4MCkKKwkJCXJldHVybiBpbmIoRFNQX1JFQUQpOworCX0KKwlyZXR1cm4gMHhmZmZmOworfQorCitzdGF0aWMgdm9pZCBzYl9pbnRyIChzYl9kZXZjICpkZXZjKQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgY2hhciAgIHNyYyA9IDB4ZmY7CisKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX1NCMTYpCisJeworCQlzcmMgPSBzYl9nZXRtaXhlcihkZXZjLCBJUlFfU1RBVCk7CS8qIEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKi8KKworCQlpZiAoc3JjICYgNCkJCQkJCQkvKiBNUFU0MDEgaW50ZXJydXB0ICovCisJCQlpZihkZXZjLT5taWRpX2lycV9jb29raWUpCisJCQkJdWFydDQwMWludHIoZGV2Yy0+aXJxLCBkZXZjLT5taWRpX2lycV9jb29raWUsIE5VTEwpOworCisJCWlmICghKHNyYyAmIDMpKQorCQkJcmV0dXJuOwkvKiBOb3QgYSBEU1AgaW50ZXJydXB0ICovCisJfQorCWlmIChkZXZjLT5pbnRyX2FjdGl2ZSAmJiAoIWRldmMtPmZ1bGxkdXBsZXggfHwgKHNyYyAmIDB4MDEpKSkKKwl7CisJCXN3aXRjaCAoZGV2Yy0+aXJxX21vZGUpCisJCXsKKwkJCWNhc2UgSU1PREVfT1VUUFVUOgorCQkJCURNQWJ1Zl9vdXRwdXRpbnRyKGRldmMtPmRldiwgMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSU1PREVfSU5QVVQ6CisJCQkJRE1BYnVmX2lucHV0aW50cihkZXZjLT5kZXYpOworCQkJCWJyZWFrOworCisJCQljYXNlIElNT0RFX0lOSVQ6CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSU1PREVfTUlESToKKwkJCQlzYl9taWRpX2ludGVycnVwdChkZXZjKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkvKiBwcmludGsoS0VSTl9XQVJOICJTb3VuZCBCbGFzdGVyOiBVbmV4cGVjdGVkIGludGVycnVwdFxuIik7ICovCisJCQkJOworCQl9CisJfQorCWVsc2UgaWYgKGRldmMtPmludHJfYWN0aXZlXzE2ICYmIChzcmMgJiAweDAyKSkKKwl7CisJCXN3aXRjaCAoZGV2Yy0+aXJxX21vZGVfMTYpCisJCXsKKwkJCWNhc2UgSU1PREVfT1VUUFVUOgorCQkJCURNQWJ1Zl9vdXRwdXRpbnRyKGRldmMtPmRldiwgMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSU1PREVfSU5QVVQ6CisJCQkJRE1BYnVmX2lucHV0aW50cihkZXZjLT5kZXYpOworCQkJCWJyZWFrOworCisJCQljYXNlIElNT0RFX0lOSVQ6CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJLyogcHJpbnRrKEtFUk5fV0FSTiAiU291bmQgQmxhc3RlcjogVW5leHBlY3RlZCBpbnRlcnJ1cHRcbiIpOyAqLworCQkJCTsKKwkJfQorCX0KKwkvKgorCSAqIEFja25vd2xlZGdlIGludGVycnVwdHMgCisJICovCisKKwlpZiAoc3JjICYgMHgwMSkKKwkJc3RhdHVzID0gaW5iKERTUF9EQVRBX0FWQUlMKTsKKworCWlmIChkZXZjLT5tb2RlbCA9PSBNRExfU0IxNiAmJiBzcmMgJiAweDAyKQorCQlzdGF0dXMgPSBpbmIoRFNQX0RBVEFfQVZMMTYpOworfQorCitzdGF0aWMgdm9pZCBwY2lfaW50cihzYl9kZXZjICpkZXZjKQoreworCWludCBzcmMgPSBpbmIoZGV2Yy0+cGNpYmFzZSsweDFBKTsKKwlzcmMmPTM7CisJaWYoc3JjKQorCQlzYl9pbnRyKGRldmMpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2JpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KQoreworCXNiX2RldmMgKmRldmMgPSBkZXZfaWQ7CisKKwlkZXZjLT5pcnFfb2sgPSAxOworCisJc3dpdGNoIChkZXZjLT5tb2RlbCkgeworCWNhc2UgTURMX0VTU1BDSToKKwkJcGNpX2ludHIgKGRldmMpOworCQlicmVhazsKKwkJCisJY2FzZSBNRExfRVNTOgorCQllc3NfaW50ciAoZGV2Yyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNiX2ludHIgKGRldmMpOworCQlicmVhazsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgc2JfZHNwX3Jlc2V0KHNiX2RldmMgKiBkZXZjKQoreworCWludCBsb29wYzsKKworCURFQihwcmludGsoIkVudGVyZWQgc2JfZHNwX3Jlc2V0KClcbiIpKTsKKworCWlmIChkZXZjLT5tb2RlbCA9PSBNRExfRVNTKSByZXR1cm4gZXNzX2RzcF9yZXNldCAoZGV2Yyk7CisKKwkvKiBUaGlzIGlzIG9ubHkgZm9yIG5vbi1FU1MgY2hpcHMgKi8KKworCW91dGIoMSwgRFNQX1JFU0VUKTsKKworCXVkZWxheSgxMCk7CisJb3V0YigwLCBEU1BfUkVTRVQpOworCXVkZWxheSgzMCk7CisKKwlmb3IgKGxvb3BjID0gMDsgbG9vcGMgPCAxMDAwICYmICEoaW5iKERTUF9EQVRBX0FWQUlMKSAmIDB4ODApOyBsb29wYysrKTsKKworCWlmIChpbmIoRFNQX1JFQUQpICE9IDB4QUEpCisJeworCQlEREIocHJpbnRrKCJzYjogTm8gcmVzcG9uc2UgdG8gUkVTRVRcbiIpKTsKKwkJcmV0dXJuIDA7CS8qIFNvcnJ5ICovCisJfQorCisJREVCKHByaW50aygic2JfZHNwX3Jlc2V0KCkgT0tcbiIpKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkc3BfZ2V0X3ZlcnMoc2JfZGV2YyAqIGRldmMpCit7CisJaW50IGk7CisKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlEREIocHJpbnRrKCJFbnRlcmVkIGRzcF9nZXRfdmVycygpXG4iKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlkZXZjLT5tYWpvciA9IGRldmMtPm1pbm9yID0gMDsKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAweGUxKTsJLyogR2V0IHZlcnNpb24gKi8KKworCWZvciAoaSA9IDEwMDAwMDsgaTsgaS0tKQorCXsKKwkJaWYgKGluYihEU1BfREFUQV9BVkFJTCkgJiAweDgwKQorCQl7CisJCQlpZiAoZGV2Yy0+bWFqb3IgPT0gMCkKKwkJCQlkZXZjLT5tYWpvciA9IGluYihEU1BfUkVBRCk7CisJCQllbHNlCisJCQl7CisJCQkJZGV2Yy0+bWlub3IgPSBpbmIoRFNQX1JFQUQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlEREIocHJpbnRrKCJEU1AgdmVyc2lvbiAlZC4lMDJkXG4iLCBkZXZjLT5tYWpvciwgZGV2Yy0+bWlub3IpKTsKK30KKworc3RhdGljIGludCBzYjE2X3NldF9kbWFfaHcoc2JfZGV2YyAqIGRldmMpCit7CisJaW50IGJpdHM7CisKKwlpZiAoZGV2Yy0+ZG1hOCAhPSAwICYmIGRldmMtPmRtYTggIT0gMSAmJiBkZXZjLT5kbWE4ICE9IDMpCisJeworCQlwcmludGsoS0VSTl9FUlIgIlNCMTY6IEludmFsaWQgOCBiaXQgRE1BICglZClcbiIsIGRldmMtPmRtYTgpOworCQlyZXR1cm4gMDsKKwl9CisJYml0cyA9ICgxIDw8IGRldmMtPmRtYTgpOworCisJaWYgKGRldmMtPmRtYTE2ID49IDUgJiYgZGV2Yy0+ZG1hMTYgPD0gNykKKwkJYml0cyB8PSAoMSA8PCBkZXZjLT5kbWExNik7CisKKwlzYl9zZXRtaXhlcihkZXZjLCBETUFfTlIsIGJpdHMpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzYjE2X3NldF9tcHVfcG9ydChzYl9kZXZjICogZGV2Yywgc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCS8qCisJICogVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIG5ldyBNSURJIHBvcnQgc2V0dXAgcmVnaXN0ZXIgb2YgU0IgVmlicmEgKENUMjUwMikuCisJICovCisJdW5zaWduZWQgY2hhciAgIGJpdHMgPSBzYl9nZXRtaXhlcihkZXZjLCAweDg0KSAmIH4weDA2OworCisJc3dpdGNoIChod19jb25maWctPmlvX2Jhc2UpCisJeworCQljYXNlIDB4MzAwOgorCQkJc2Jfc2V0bWl4ZXIoZGV2YywgMHg4NCwgYml0cyB8IDB4MDQpOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDMzMDoKKwkJCXNiX3NldG1peGVyKGRldmMsIDB4ODQsIGJpdHMgfCAweDAwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzYl9zZXRtaXhlcihkZXZjLCAweDg0LCBiaXRzIHwgMHgwMik7CQkvKiBEaXNhYmxlIE1QVSAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJTQjE2OiBJbnZhbGlkIE1JREkgSS9PIHBvcnQgJXhcbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSk7CisJfQorfQorCitzdGF0aWMgaW50IHNiMTZfc2V0X2lycV9odyhzYl9kZXZjICogZGV2YywgaW50IGxldmVsKQoreworCWludCBpdmFsOworCisJc3dpdGNoIChsZXZlbCkKKwl7CisJCWNhc2UgNToKKwkJCWl2YWwgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWl2YWwgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCWl2YWwgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQlpdmFsID0gODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJTQjE2OiBJbnZhbGlkIElSUSVkXG4iLCBsZXZlbCk7CisJCQlyZXR1cm4gMDsKKwl9CisJc2Jfc2V0bWl4ZXIoZGV2YywgSVJRX05SLCBpdmFsKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcmVsb2NhdGVfSmF6ejE2KHNiX2RldmMgKiBkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5zaWduZWQgY2hhciBiaXRzID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGphenoxNl9iYXNlICE9IDAgJiYgamF6ejE2X2Jhc2UgIT0gaHdfY29uZmlnLT5pb19iYXNlKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGh3X2NvbmZpZy0+aW9fYmFzZSkKKwl7CisJCWNhc2UgMHgyMjA6CisJCQliaXRzID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDB4MjQwOgorCQkJYml0cyA9IDI7CisJCQlicmVhazsKKwkJY2FzZSAweDI2MDoKKwkJCWJpdHMgPSAzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJfQorCWJpdHMgPSBqYXp6MTZfYml0cyA9IGJpdHMgPDwgNTsKKwlqYXp6MTZfYmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKworCS8qCisJICoJTWFnaWMgd2FrZSB1cCBzZXF1ZW5jZSBieSB3cml0aW5nIHRvIDB4MjAxIChha2EgSm95c3RpY2sgcG9ydCkKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmamF6ejE2X2xvY2ssIGZsYWdzKTsKKwlvdXRiKCgweEFGKSwgMHgyMDEpOworCW91dGIoKDB4NTApLCAweDIwMSk7CisJb3V0YigoYml0cyksIDB4MjAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZqYXp6MTZfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGluaXRfSmF6ejE2KHNiX2RldmMgKiBkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJY2hhciBuYW1lWzEwMF07CisJLyoKKwkgKiBGaXJzdCB0cnkgdG8gY2hlY2sgdGhhdCB0aGUgY2FyZCBoYXMgSmF6ejE2IGNoaXAuIEl0IGlkZW50aWZpZXMgaXRzZWxmCisJICogYnkgcmV0dXJuaW5nIDB4MTIgYXMgcmVzcG9uc2UgdG8gRFNQIGNvbW1hbmQgMHhmYS4KKwkgKi8KKworCWlmICghc2JfZHNwX2NvbW1hbmQoZGV2YywgMHhmYSkpCisJCXJldHVybiAwOworCisJaWYgKHNiX2RzcF9nZXRfYnl0ZShkZXZjKSAhPSAweDEyKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogT0sgc28gZmFyLiBOb3cgY29uZmlndXJlIHRoZSBJUlEgYW5kIERNQSBjaGFubmVsIHVzZWQgYnkgdGhlIGNhcmQuCisJICovCisJaWYgKGh3X2NvbmZpZy0+aXJxIDwgMSB8fCBod19jb25maWctPmlycSA+IDE1IHx8IGphenpfaXJxX2JpdHNbaHdfY29uZmlnLT5pcnFdID09IDApCisJeworCQlwcmludGsoS0VSTl9FUlIgIkphenoxNjogSW52YWxpZCBpbnRlcnJ1cHQgKElSUSVkKVxuIiwgaHdfY29uZmlnLT5pcnEpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGh3X2NvbmZpZy0+ZG1hIDwgMCB8fCBod19jb25maWctPmRtYSA+IDMgfHwgamF6el9kbWFfYml0c1tod19jb25maWctPmRtYV0gPT0gMCkKKwl7CisJCSAgcHJpbnRrKEtFUk5fRVJSICJKYXp6MTY6IEludmFsaWQgOCBiaXQgRE1BIChETUElZClcbiIsIGh3X2NvbmZpZy0+ZG1hKTsKKwkJICByZXR1cm4gMDsKKwl9CisJaWYgKGh3X2NvbmZpZy0+ZG1hMiA8IDApCisJeworCQlwcmludGsoS0VSTl9FUlIgIkphenoxNjogTm8gMTYgYml0IERNQSBjaGFubmVsIGRlZmluZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGh3X2NvbmZpZy0+ZG1hMiA8IDUgfHwgaHdfY29uZmlnLT5kbWEyID4gNyB8fCBqYXp6X2RtYV9iaXRzW2h3X2NvbmZpZy0+ZG1hMl0gPT0gMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiSmF6ejE2OiBJbnZhbGlkIDE2IGJpdCBETUEgKERNQSVkKVxuIiwgaHdfY29uZmlnLT5kbWEyKTsKKwkJcmV0dXJuIDA7CisJfQorCWRldmMtPmRtYTE2ID0gaHdfY29uZmlnLT5kbWEyOworCisJaWYgKCFzYl9kc3BfY29tbWFuZChkZXZjLCAweGZiKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIGphenpfZG1hX2JpdHNbaHdfY29uZmlnLT5kbWFdIHwKKwkJCShqYXp6X2RtYV9iaXRzW2h3X2NvbmZpZy0+ZG1hMl0gPDwgNCkpKQorCQlyZXR1cm4gMDsKKworCWlmICghc2JfZHNwX2NvbW1hbmQoZGV2YywgamF6el9pcnFfYml0c1tod19jb25maWctPmlycV0pKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogTm93IHdlIGhhdmUgY29uZmlndXJlZCBhIHN0YW5kYXJkIEphenoxNiBkZXZpY2UuIAorCSAqLworCWRldmMtPm1vZGVsID0gTURMX0pBWlo7CisJc3RyY3B5KG5hbWUsICJKYXp6MTYiKTsKKworCWh3X2NvbmZpZy0+bmFtZSA9ICJKYXp6MTYiOworCWRldmMtPmNhcHMgfD0gU0JfTk9fTUlESTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcmVsb2NhdGVfZXNzMTY4OChzYl9kZXZjICogZGV2YykKK3sKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisKKwlzd2l0Y2ggKGRldmMtPmJhc2UpCisJeworCQljYXNlIDB4MjIwOgorCQkJYml0cyA9IDB4MDQ7CisJCQlicmVhazsKKwkJY2FzZSAweDIzMDoKKwkJCWJpdHMgPSAweDA1OworCQkJYnJlYWs7CisJCWNhc2UgMHgyNDA6CisJCQliaXRzID0gMHgwNjsKKwkJCWJyZWFrOworCQljYXNlIDB4MjUwOgorCQkJYml0cyA9IDB4MDc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsJLyogV3JvbmcgcG9ydCAqLworCX0KKworCUREQihwcmludGsoIkRvaW5nIEVTUzE2ODggYWRkcmVzcyBzZWxlY3Rpb25cbiIpKTsKKwkKKwkvKgorCSAqIEVTMTY4OCBzdXBwb3J0cyB0d28gYWx0ZXJuYXRpdmUgd2F5cyBmb3Igc29mdHdhcmUgYWRkcmVzcyBjb25maWcuCisJICogRmlyc3QgdHJ5IHRoZSBzbyBjYWxsZWQgUmVhZC1TZXF1ZW5jZS1LZXkgbWV0aG9kLgorCSAqLworCisJLyogUmVzZXQgdGhlIHNlcXVlbmNlIGxvZ2ljICovCisJaW5iKDB4MjI5KTsKKwlpbmIoMHgyMjkpOworCWluYigweDIyOSk7CisKKwkvKiBQZXJmb3JtIHRoZSByZWFkIHNlcXVlbmNlICovCisJaW5iKDB4MjJiKTsKKwlpbmIoMHgyMjkpOworCWluYigweDIyYik7CisJaW5iKDB4MjI5KTsKKwlpbmIoMHgyMjkpOworCWluYigweDIyYik7CisJaW5iKDB4MjI5KTsKKworCS8qIFNlbGVjdCB0aGUgYmFzZSBhZGRyZXNzIGJ5IHJlYWRpbmcgZnJvbSBpdC4gVGhlbiBwcm9iZSB1c2luZyB0aGUgcG9ydC4gKi8KKwlpbmIoZGV2Yy0+YmFzZSk7CisJaWYgKHNiX2RzcF9yZXNldChkZXZjKSkJLyogQmluZ28gKi8KKwkJcmV0dXJuOworCisjaWYgMAkJCQkvKiBUaGlzIGNhdXNlcyBzeXN0ZW0gbG9ja3VwcyAoTm9raWEgMzg2LzI1IGF0IGxlYXN0KSAqLworCS8qCisJICogVGhlIGxhc3QgcmVzb3J0IGlzIHRoZSBzeXN0ZW0gY29udHJvbCByZWdpc3RlciBtZXRob2QuCisJICovCisKKwlvdXRiKCgweDAwKSwgMHhmYik7CS8qIDB4RkIgaXMgdGhlIHVubG9jayByZWdpc3RlciAqLworCW91dGIoKDB4MDApLCAweGUwKTsJLyogU2VsZWN0IGluZGV4IDAgKi8KKwlvdXRiKChiaXRzKSwgMHhlMSk7CS8qIFdyaXRlIHRoZSBjb25maWcgYml0cyAqLworCW91dGIoKDB4MDApLCAweGY5KTsJLyogMHhGQiBpcyB0aGUgbG9jayByZWdpc3RlciAqLworI2VuZGlmCit9CisKK2ludCBzYl9kc3BfZGV0ZWN0KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgaW50IHBjaSwgaW50IHBjaWlvLCBzdHJ1Y3Qgc2JfbW9kdWxlX29wdGlvbnMgKnNibW8pCit7CisJc2JfZGV2YyBzYl9pbmZvOworCXNiX2RldmMgKmRldmMgPSAmc2JfaW5mbzsKKworCW1lbXNldCgoY2hhciAqKSAmc2JfaW5mbywgMCwgc2l6ZW9mKHNiX2luZm8pKTsJLyogWmVybyBldmVyeXRoaW5nICovCisKKwkvKiBDb3B5IG1vZHVsZSBvcHRpb25zIGluIHBsYWNlICovCisJaWYoc2JtbykgbWVtY3B5KCZkZXZjLT5zYm1vLCBzYm1vLCBzaXplb2Yoc3RydWN0IHNiX21vZHVsZV9vcHRpb25zKSk7CisKKwlzYl9pbmZvLm15X21pZGlkZXYgPSAtMTsKKwlzYl9pbmZvLm15X21peGVyZGV2ID0gLTE7CisJc2JfaW5mby5kZXYgPSAtMTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgCisJICovCisJCisJRERCKHByaW50aygic2JfZHNwX2RldGVjdCgleCkgZW50ZXJlZFxuIiwgaHdfY29uZmlnLT5pb19iYXNlKSk7CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+bG9jayk7CisJZGV2Yy0+dHlwZSA9IGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlOworCisJZGV2Yy0+YmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKwlkZXZjLT5pcnEgPSBod19jb25maWctPmlycTsKKwlkZXZjLT5kbWE4ID0gaHdfY29uZmlnLT5kbWE7CisKKwlkZXZjLT5kbWExNiA9IC0xOworCWRldmMtPnBjaWJhc2UgPSBwY2lpbzsKKwkKKwlpZihwY2kgPT0gU0JfUENJX0VTU01BRVNUUk8pCisJeworCQlkZXZjLT5tb2RlbCA9IE1ETF9FU1NQQ0k7CisJCWRldmMtPmNhcHMgfD0gU0JfUENJX0lSUTsKKwkJaHdfY29uZmlnLT5kcml2ZXJfdXNlXzEgfD0gU0JfUENJX0lSUTsKKwkJaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUJPSBNRExfRVNTUENJOworCX0KKwkKKwlpZihwY2kgPT0gU0JfUENJX1lBTUFIQSkKKwl7CisJCWRldmMtPm1vZGVsID0gTURMX1lNUENJOworCQlkZXZjLT5jYXBzIHw9IFNCX1BDSV9JUlE7CisJCWh3X2NvbmZpZy0+ZHJpdmVyX3VzZV8xIHw9IFNCX1BDSV9JUlE7CisJCWh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlCT0gTURMX1lNUENJOworCQkKKwkJcHJpbnRrKCJZYW1haGEgUENJIG1vZGUuXG4iKTsKKwl9CisJCisJaWYgKGRldmMtPnNibW8uYWNlcikKKwl7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDA5KTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDA5KTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDA5KTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDBiKTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDA5KTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDBiKTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDA5KTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDA5KTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDBiKTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDA5KTsKKwkJaW5iKGRldmMtPmJhc2UgKyAweDAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCX0KKwkvKgorCSAqIERldGVjdCB0aGUgZGV2aWNlCisJICovCisKKwlpZiAoc2JfZHNwX3Jlc2V0KGRldmMpKQorCQlkc3BfZ2V0X3ZlcnMoZGV2Yyk7CisJZWxzZQorCQlkZXZjLT5tYWpvciA9IDA7CisKKwlpZiAoZGV2Yy0+dHlwZSA9PSAwIHx8IGRldmMtPnR5cGUgPT0gTURMX0pBWlogfHwgZGV2Yy0+dHlwZSA9PSBNRExfU01XKQorCQlpZiAoZGV2Yy0+bWFqb3IgPT0gMCB8fCAoZGV2Yy0+bWFqb3IgPT0gMyAmJiBkZXZjLT5taW5vciA9PSAxKSkKKwkJCXJlbG9jYXRlX0phenoxNihkZXZjLCBod19jb25maWcpOworCisJaWYgKGRldmMtPm1ham9yID09IDAgJiYgKGRldmMtPnR5cGUgPT0gTURMX0VTUyB8fCBkZXZjLT50eXBlID09IDApKQorCQlyZWxvY2F0ZV9lc3MxNjg4KGRldmMpOworCisJaWYgKCFzYl9kc3BfcmVzZXQoZGV2YykpCisJeworCQlEREIocHJpbnRrKCJTQiByZXNldCBmYWlsZWRcbiIpKTsKKyNpZmRlZiBNT0RVTEUKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2I6IGRzcCByZXNldCBmYWlsZWQuXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJaWYgKGRldmMtPm1ham9yID09IDApCisJCWRzcF9nZXRfdmVycyhkZXZjKTsKKworCWlmIChkZXZjLT5tYWpvciA9PSAzICYmIGRldmMtPm1pbm9yID09IDEpCisJeworCQlpZiAoZGV2Yy0+dHlwZSA9PSBNRExfQVpURUNIKQkJLyogU0cgV2FzaGluZ3Rvbj8gKi8KKwkJeworCQkJaWYgKHNiX2RzcF9jb21tYW5kKGRldmMsIDB4MDkpKQorCQkJCWlmIChzYl9kc3BfY29tbWFuZChkZXZjLCAweDAwKSkJLyogRW50ZXIgV1NTIG1vZGUgKi8KKwkJCQl7CisJCQkJCWludCBpOworCisJCQkJCS8qIEhhdmUgc29tZSBkZWxheSAqLworCQkJCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKwkJCQkJCWluYihEU1BfREFUQV9BVkFJTCk7CisJCQkJCWRldmMtPmNhcHMgPSBTQl9OT19BVURJTyB8IFNCX05PX01JREk7CS8qIE1peGVyIG9ubHkgKi8KKwkJCQkJZGV2Yy0+bW9kZWwgPSBNRExfQVpURUNIOworCQkJCX0KKwkJfQorCX0KKwkKKwlpZihkZXZjLT50eXBlID09IE1ETF9FU1NQQ0kpCisJCWRldmMtPm1vZGVsID0gTURMX0VTU1BDSTsKKwkJCisJaWYoZGV2Yy0+dHlwZSA9PSBNRExfWU1QQ0kpCisJeworCQlwcmludGsoIllNUENJIHNlbGVjdGVkXG4iKTsKKwkJZGV2Yy0+bW9kZWwgPSBNRExfWU1QQ0k7CisJfQorCQkKKwkvKgorCSAqIFNhdmUgZGV2aWNlIGluZm9ybWF0aW9uIGZvciBzYl9kc3BfaW5pdCgpCisJICovCisKKworCWRldGVjdGVkX2RldmMgPSAoc2JfZGV2YyAqKWttYWxsb2Moc2l6ZW9mKHNiX2RldmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV0ZWN0ZWRfZGV2YyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYjogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2UgaW5mb3JtYXRpb25cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KGRldGVjdGVkX2RldmMsIGRldmMsIHNpemVvZihzYl9kZXZjKSk7CisJTURCKHByaW50ayhLRVJOX0lORk8gIlNCICVkLiUwMmQgZGV0ZWN0ZWQgT0sgKCV4KVxuIiwgZGV2Yy0+bWFqb3IsIGRldmMtPm1pbm9yLCBod19jb25maWctPmlvX2Jhc2UpKTsKKwlyZXR1cm4gMTsKK30KKworaW50IHNiX2RzcF9pbml0KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJc2JfZGV2YyAqZGV2YzsKKwljaGFyIG5hbWVbMTAwXTsKKwlleHRlcm4gaW50IHNiX2JlX3F1aWV0OworCWludAltaXhlcjIyLCBtaXhlcjMwOworCQorLyoKKyAqIENoZWNrIGlmIHdlIGhhZCBkZXRlY3RlZCBhIFNCIGRldmljZSBlYXJsaWVyCisgKi8KKwlEREIocHJpbnRrKCJzYl9kc3BfaW5pdCgleCkgZW50ZXJlZFxuIiwgaHdfY29uZmlnLT5pb19iYXNlKSk7CisJbmFtZVswXSA9IDA7CisKKwlpZiAoZGV0ZWN0ZWRfZGV2YyA9PSBOVUxMKQorCXsKKwkJTURCKHByaW50aygiTm8gZGV0ZWN0ZWQgZGV2aWNlXG4iKSk7CisJCXJldHVybiAwOworCX0KKwlkZXZjID0gZGV0ZWN0ZWRfZGV2YzsKKwlkZXRlY3RlZF9kZXZjID0gTlVMTDsKKworCWlmIChkZXZjLT5iYXNlICE9IGh3X2NvbmZpZy0+aW9fYmFzZSkKKwl7CisJCUREQihwcmludGsoIkkvTyBwb3J0IG1pc21hdGNoXG4iKSk7CisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDE2KTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogTm93IGNvbnRpbnVlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBkZXZpY2UKKwkgKi8KKworCWRldmMtPmNhcHMgPSBod19jb25maWctPmRyaXZlcl91c2VfMTsKKworCWlmICghKChkZXZjLT5jYXBzICYgU0JfTk9fQVVESU8pICYmIChkZXZjLT5jYXBzICYgU0JfTk9fTUlESSkpICYmIGh3X2NvbmZpZy0+aXJxID4gMCkKKwl7CQkJLyogSVJRIHNldHVwICovCisJCQorCQkvKgorCQkgKglFU1MgUENJIGNhcmRzIGRvIHNoYXJlZCBQQ0kgSVJRIHN0dWZmLiBTaW5jZSB0aGV5CisJCSAqCXdpbGwgZ2V0IHNoYXJlZCBQQ0kgaXJxIGxpbmVzIHdlIG11c3QgY29wZS4KKwkJICovCisJCSAKKwkJaW50IGk9KGRldmMtPmNhcHMmU0JfUENJX0lSUSk/U0FfU0hJUlE6MDsKKwkJCisJCWlmIChyZXF1ZXN0X2lycShod19jb25maWctPmlycSwgc2JpbnRyLCBpLCAic291bmRibGFzdGVyIiwgZGV2YykgPCAwKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIlNCOiBDYW4ndCBhbGxvY2F0ZSBJUlElZFxuIiwgaHdfY29uZmlnLT5pcnEpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSwgMTYpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZGV2Yy0+aXJxX29rID0gMDsKKworCQlpZiAoZGV2Yy0+bWFqb3IgPT0gNCkKKwkJCWlmICghc2IxNl9zZXRfaXJxX2h3KGRldmMsIGRldmMtPmlycSkpCS8qIFVuc3VwcG9ydGVkIElSUSAqLworCQkJeworCQkJCWZyZWVfaXJxKGRldmMtPmlycSwgZGV2Yyk7CisJCQkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSwgMTYpOworCQkJCXJldHVybiAwOworCQkJfQorCQlpZiAoKGRldmMtPnR5cGUgPT0gMCB8fCBkZXZjLT50eXBlID09IE1ETF9FU1MpICYmCisJCQlkZXZjLT5tYWpvciA9PSAzICYmIGRldmMtPm1pbm9yID09IDEpCisJCXsJCS8qIEhhbmRsZSB2YXJpb3VzIGNoaXBzZXRzIHdoaWNoIGNsYWltIHRoZXkgYXJlIFNCIFBybyBjb21wYXRpYmxlICovCisJCQlpZiAoKGRldmMtPnR5cGUgIT0gMCAmJiBkZXZjLT50eXBlICE9IE1ETF9FU1MpIHx8CisJCQkJIWVzc19pbml0KGRldmMsIGh3X2NvbmZpZykpCisJCQl7CisJCQkJaWYgKChkZXZjLT50eXBlICE9IDAgJiYgZGV2Yy0+dHlwZSAhPSBNRExfSkFaWiAmJgorCQkJCQkgZGV2Yy0+dHlwZSAhPSBNRExfU01XKSB8fCAhaW5pdF9KYXp6MTYoZGV2YywgaHdfY29uZmlnKSkKKwkJCQl7CisJCQkJCUREQihwcmludGsoIlRoaXMgaXMgYSBnZW51aW5lIFNCIFByb1xuIikpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZGV2Yy0+bWFqb3IgPT0gNCAmJiBkZXZjLT5taW5vciA8PSAxMSApCS8qIFdvbid0IHdvcmsgKi8KKwkJCWRldmMtPmlycV9vayA9IDE7CisJCWVsc2UKKwkJeworCQkJaW50IG47CisKKwkJCWZvciAobiA9IDA7IG4gPCAzICYmIGRldmMtPmlycV9vayA9PSAwOyBuKyspCisJCQl7CisJCQkJaWYgKHNiX2RzcF9jb21tYW5kKGRldmMsIDB4ZjIpKQkvKiBDYXVzZSBpbnRlcnJ1cHQgaW1tZWRpYXRlbHkgKi8KKwkJCQl7CisJCQkJCWludCBpOworCisJCQkJCWZvciAoaSA9IDA7ICFkZXZjLT5pcnFfb2sgJiYgaSA8IDEwMDAwOyBpKyspOworCQkJCX0KKwkJCX0KKwkJCWlmICghZGV2Yy0+aXJxX29rKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNiOiBJbnRlcnJ1cHQgdGVzdCBvbiBJUlElZCBmYWlsZWQgLSBQcm9iYWJsZSBJUlEgY29uZmxpY3RcbiIsIGRldmMtPmlycSk7CisJCQllbHNlCisJCQl7CisJCQkJRERCKHByaW50aygiSVJRIHRlc3QgT0sgKElSUSVkKVxuIiwgZGV2Yy0+aXJxKSk7CisJCQl9CisJCX0KKwl9CQkJLyogSVJRIHNldHVwICovCisKKwlsYXN0X3NiID0gZGV2YzsKKwkKKwlzd2l0Y2ggKGRldmMtPm1ham9yKQorCXsKKwkJY2FzZSAxOgkJLyogU0IgMS4wIG9yIDEuNSAqLworCQkJZGV2Yy0+bW9kZWwgPSBod19jb25maWctPmNhcmRfc3VidHlwZSA9IE1ETF9TQjE7CisJCQlicmVhazsKKworCQljYXNlIDI6CQkvKiBTQiAyLnggKi8KKwkJCWlmIChkZXZjLT5taW5vciA9PSAwKQorCQkJCWRldmMtPm1vZGVsID0gaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUgPSBNRExfU0IyOworCQkJZWxzZQorCQkJCWRldmMtPm1vZGVsID0gaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUgPSBNRExfU0IyMDE7CisJCQlicmVhazsKKworCQljYXNlIDM6CQkvKiBTQiBQcm8gYW5kIG1vc3QgY2xvbmVzICovCisJCQlzd2l0Y2ggKGRldmMtPm1vZGVsKSB7CisJCQljYXNlIDA6CisJCQkJZGV2Yy0+bW9kZWwgPSBod19jb25maWctPmNhcmRfc3VidHlwZSA9IE1ETF9TQlBSTzsKKwkJCQlpZiAoaHdfY29uZmlnLT5uYW1lID09IE5VTEwpCisJCQkJCWh3X2NvbmZpZy0+bmFtZSA9ICJTb3VuZCBCbGFzdGVyIFBybyAoOCBCSVQgT05MWSkiOworCQkJCWJyZWFrOworCQkJY2FzZSBNRExfRVNTOgorCQkJCWVzc19kc3BfaW5pdChkZXZjLCBod19jb25maWcpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSA0OgorCQkJZGV2Yy0+bW9kZWwgPSBod19jb25maWctPmNhcmRfc3VidHlwZSA9IE1ETF9TQjE2OworCQkJLyogCisJCQkgKiBBTFMwMDcgYW5kIEFMUzEwMCByZXR1cm4gRFNQIHZlcnNpb24gNC4yIGFuZCBoYXZlIDIgcG9zdC1yZXNldCAhPTAKKwkJCSAqIHJlZ2lzdGVycyBhdCAweDNjIGFuZCAweDRjIChvdXRwdXQgY3RybCByZWdpc3RlcnMgb24gQUxTMDA3KSB3aGVyZWFzCisJCQkgKiBhICJzdGFuZGFyZCIgU0IxNiBkb2Vzbid0IGhhdmUgYSByZWdpc3RlciBhdCAweDRjLiAgQUxTMTAwIGFjdGl2ZWx5CisJCQkgKiB1cGRhdGVzIHJlZ2lzdGVyIDB4MjIgd2hlbmV2ZXIgMHgzMCBjaGFuZ2VzLCBhcyBwZXIgdGhlIFNCMTYgc3BlYy4KKwkJCSAqIFNpbmNlIEFMUzAwNyBkb2Vzbid0LCB0aGlzIGNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIDIgY2FyZHMuCisJCQkgKi8KKwkJCWlmICgoZGV2Yy0+bWlub3IgPT0gMikgJiYgc2JfZ2V0bWl4ZXIoZGV2YywweDNjKSAmJiBzYl9nZXRtaXhlcihkZXZjLDB4NGMpKSAKKwkJCXsKKwkJCQltaXhlcjMwID0gc2JfZ2V0bWl4ZXIoZGV2YywweDMwKTsKKwkJCQlzYl9zZXRtaXhlcihkZXZjLDB4MjIsKG1peGVyMjI9c2JfZ2V0bWl4ZXIoZGV2YywweDIyKSkgJiAweDBmKTsKKwkJCQlzYl9zZXRtaXhlcihkZXZjLDB4MzAsMHhmZik7CisJCQkJLyogQUxTMTAwIHdpbGwgZm9yY2UgMHgzMCB0byAweGY4IGxpa2UgU0IxNjsgQUxTMDA3IHdpbGwgYWxsb3cgMHhmZi4gKi8KKwkJCQkvKiBSZWdpc3RlciAweDIyICYgMHhmMCBvbiBBTFMxMDAgPT0gMHhmMDsgb24gQUxTMDA3IGl0ID09IDB4MTAuICAgICAqLworCQkJCWlmICgoc2JfZ2V0bWl4ZXIoZGV2YywweDMwKSAhPSAweGZmKSB8fCAoKHNiX2dldG1peGVyKGRldmMsMHgyMikgJiAweGYwKSAhPSAweDEwKSkgCisJCQkJeworCQkJCQlkZXZjLT5zdWJtb2RlbCA9IFNVQk1ETF9BTFMxMDA7CisJCQkJCWlmIChod19jb25maWctPm5hbWUgPT0gTlVMTCkKKwkJCQkJCWh3X2NvbmZpZy0+bmFtZSA9ICJTb3VuZCBCbGFzdGVyIDE2IChBTFMtMTAwKSI7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkJZWxzZQorICAgICAgICAJCQl7CisgICAgICAgIAkJCQlzYl9zZXRtaXhlcihkZXZjLDB4M2MsMHgxZik7ICAgIC8qIEVuYWJsZSBhbGwgaW5wdXRzICovCisJCQkJCXNiX3NldG1peGVyKGRldmMsMHg0YywweDFmKTsKKwkJCQkJc2Jfc2V0bWl4ZXIoZGV2YywweDIyLG1peGVyMjIpOyAvKiBSZXN0b3JlIDB4MjIgdG8gb3JpZ2luYWwgdmFsdWUgKi8KKwkJCQkJZGV2Yy0+c3VibW9kZWwgPSBTVUJNRExfQUxTMDA3OworCQkJCQlpZiAoaHdfY29uZmlnLT5uYW1lID09IE5VTEwpCisJCQkJCQlod19jb25maWctPm5hbWUgPSAiU291bmQgQmxhc3RlciAxNiAoQUxTLTAwNykiOworCQkJCX0KKwkJCQlzYl9zZXRtaXhlcihkZXZjLDB4MzAsbWl4ZXIzMCk7CisJCQl9CisJCQllbHNlIGlmIChod19jb25maWctPm5hbWUgPT0gTlVMTCkKKwkJCQlod19jb25maWctPm5hbWUgPSAiU291bmQgQmxhc3RlciAxNiI7CisKKwkJCWlmIChod19jb25maWctPmRtYTIgPT0gLTEpCisJCQkJZGV2Yy0+ZG1hMTYgPSBkZXZjLT5kbWE4OworCQkJZWxzZSBpZiAoaHdfY29uZmlnLT5kbWEyIDwgNSB8fCBod19jb25maWctPmRtYTIgPiA3KQorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgICJTQjE2OiBCYWQgb3IgbWlzc2luZyAxNiBiaXQgRE1BIGNoYW5uZWxcbiIpOworCQkJCWRldmMtPmRtYTE2ID0gZGV2Yy0+ZG1hODsKKwkJCX0KKwkJCWVsc2UKKwkJCQlkZXZjLT5kbWExNiA9IGh3X2NvbmZpZy0+ZG1hMjsKKworCQkJaWYoIXNiMTZfc2V0X2RtYV9odyhkZXZjKSkgeworCQkJCWZyZWVfaXJxKGRldmMtPmlycSwgZGV2Yyk7CisJCQkgICAgICAgIHJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMTYpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlkZXZjLT5jYXBzIHw9IFNCX05PX01JREk7CisJfQorCisJaWYgKCEoZGV2Yy0+Y2FwcyAmIFNCX05PX01JWEVSKSkKKwkJaWYgKGRldmMtPm1ham9yID09IDMgfHwgZGV2Yy0+bWFqb3IgPT0gNCkKKwkJCXNiX21peGVyX2luaXQoZGV2Yywgb3duZXIpOworCisJaWYgKCEoZGV2Yy0+Y2FwcyAmIFNCX05PX01JREkpKQorCQlzYl9kc3BfbWlkaV9pbml0KGRldmMsIG93bmVyKTsKKworCWlmIChod19jb25maWctPm5hbWUgPT0gTlVMTCkKKwkJaHdfY29uZmlnLT5uYW1lID0gIlNvdW5kIEJsYXN0ZXIgKDggQklUL01PTk8gT05MWSkiOworCisJc3ByaW50ZihuYW1lLCAiJXMgKCVkLiUwMmQpIiwgaHdfY29uZmlnLT5uYW1lLCBkZXZjLT5tYWpvciwgZGV2Yy0+bWlub3IpOworCWNvbmZfcHJpbnRmKG5hbWUsIGh3X2NvbmZpZyk7CisKKwkvKgorCSAqIEFzc3VtaW5nIHRoYXQgYSBzb3VuZCBjYXJkIGlzIFNvdW5kIEJsYXN0ZXIgKGNvbXBhdGlibGUpIGlzIHRoZSBtb3N0IGNvbW1vbgorCSAqIGNvbmZpZ3VyYXRpb24gZXJyb3IgYW5kIHRoZSBtb3RoZXIgb2YgYWxsIHByb2JsZW1zLiBVc3VhbGx5IHNvdW5kIGNhcmRzCisJICogZW11bGF0ZSBTQiBQcm8gYnV0IGluIGFkZGl0aW9uIHRoZXkgaGF2ZSBhIDE2IGJpdCBuYXRpdmUgbW9kZSB3aGljaCBzaG91bGQgYmUKKwkgKiB1c2VkIGluIFVuaXguIFNlZSBSZWFkbWUuY2FyZHMgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZmlndXJpbmcgT1NTL0ZyZWUKKwkgKiBwcm9wZXJseS4KKwkgKi8KKwlpZiAoZGV2Yy0+bW9kZWwgPD0gTURMX1NCUFJPKQorCXsKKwkJaWYgKGRldmMtPm1ham9yID09IDMgJiYgZGV2Yy0+bWlub3IgIT0gMSkJLyogIlRydWUiIFNCIFBybyBzaG91bGQgaGF2ZSB2My4xIChyYXJlIG9uZXMgbWF5IGhhdmUgMy4yKS4gKi8KKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiVGhpcyBzb3VuZCBjYXJkIG1heSBub3QgYmUgZnVsbHkgU291bmQgQmxhc3RlciBQcm8gY29tcGF0aWJsZS5cbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSW4gbWFueSBjYXNlcyB0aGVyZSBpcyBhbm90aGVyIHdheSB0byBjb25maWd1cmUgT1NTIHNvIHRoYXRcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXQgd29ya3MgcHJvcGVybHkgd2l0aCBPU1MgKGZvciBleGFtcGxlIGluIDE2IGJpdCBtb2RlKS5cbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIGlnbm9yZSB0aGlzIG1lc3NhZ2UgaWYgeW91IF9yZWFsbHlfIGhhdmUgYSBTQiBQcm8uXG4iKTsKKwkJfQorCQllbHNlIGlmICghc2JfYmVfcXVpZXQgJiYgZGV2Yy0+bW9kZWwgPT0gTURMX1NCUFJPKQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICJTQiBEU1AgdmVyc2lvbiBpcyBqdXN0ICVkLiUwMmQgd2hpY2ggbWVhbnMgdGhhdCB5b3VyIGNhcmQgaXNcbiIsIGRldmMtPm1ham9yLCBkZXZjLT5taW5vcik7CisJCQlwcmludGsoS0VSTl9JTkZPICJzZXZlcmFsIHllYXJzIG9sZCAoOCBiaXQgb25seSBkZXZpY2UpIG9yIGFsdGVybmF0aXZlbHkgdGhlIHNvdW5kIGRyaXZlclxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkLlxuIik7CisJCX0KKwl9CisJaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUgPSBkZXZjLT5tb2RlbDsKKwlod19jb25maWctPnNsb3RzWzBdPWRldmMtPmRldjsKKwlsYXN0X2RldmMgPSBkZXZjOwkvKiBGb3IgU0IgTVBVIGRldGVjdGlvbiAqLworCisJaWYgKCEoZGV2Yy0+Y2FwcyAmIFNCX05PX0FVRElPKSAmJiBkZXZjLT5kbWE4ID49IDApCisJeworCQlpZiAoc291bmRfYWxsb2NfZG1hKGRldmMtPmRtYTgsICJTb3VuZEJsYXN0ZXI4IikpCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNvdW5kIEJsYXN0ZXI6IENhbid0IGFsbG9jYXRlIDggYml0IERNQSBjaGFubmVsICVkXG4iLCBkZXZjLT5kbWE4KTsKKwkJfQorCQlpZiAoZGV2Yy0+ZG1hMTYgPj0gMCAmJiBkZXZjLT5kbWExNiAhPSBkZXZjLT5kbWE4KQorCQl7CisJCQlpZiAoc291bmRfYWxsb2NfZG1hKGRldmMtPmRtYTE2LCAiU291bmRCbGFzdGVyMTYiKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZCBCbGFzdGVyOiAgY2FuJ3QgYWxsb2NhdGUgMTYgYml0IERNQSBjaGFubmVsICVkLlxuIiwgZGV2Yy0+ZG1hMTYpOworCQl9CisJCXNiX2F1ZGlvX2luaXQoZGV2YywgbmFtZSwgb3duZXIpOworCQlod19jb25maWctPnNsb3RzWzBdPWRldmMtPmRldjsKKwl9CisJZWxzZQorCXsKKwkJTURCKHByaW50aygiU291bmQgQmxhc3RlcjogIG5vIGF1ZGlvIGRldmljZXMgZm91bmQuXG4iKSk7CisJfQorCXJldHVybiAxOworfQorCisvKiBpZiAoc2JtcHUpIGJlbG93IHdlIGFsbG93IG1wdTQwMSB0byBtYW5hZ2UgdGhlIG1pZGkgZGV2cworICAgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gdW5sb2FkIHRoZW0uIChBbmRyemVqIEtyenlzenRvZm93aWN6KSAqLworICAgCit2b2lkIHNiX2RzcF91bmxvYWQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBpbnQgc2JtcHUpCit7CisJc2JfZGV2YyAqZGV2YzsKKworCWRldmMgPSBhdWRpb19kZXZzW2h3X2NvbmZpZy0+c2xvdHNbMF1dLT5kZXZjOworCisJaWYgKGRldmMgJiYgZGV2Yy0+YmFzZSA9PSBod19jb25maWctPmlvX2Jhc2UpCisJeworCQlpZiAoKGRldmMtPm1vZGVsICYgTURMX0VTUykgJiYgZGV2Yy0+cGNpYmFzZSkKKwkJCXJlbGVhc2VfcmVnaW9uKGRldmMtPnBjaWJhc2UsIDgpOworCisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDE2KTsKKworCQlpZiAoIShkZXZjLT5jYXBzICYgU0JfTk9fQVVESU8pKQorCQl7CisJCQlzb3VuZF9mcmVlX2RtYShkZXZjLT5kbWE4KTsKKwkJCWlmIChkZXZjLT5kbWExNiA+PSAwKQorCQkJCXNvdW5kX2ZyZWVfZG1hKGRldmMtPmRtYTE2KTsKKwkJfQorCQlpZiAoIShkZXZjLT5jYXBzICYgU0JfTk9fQVVESU8gJiYgZGV2Yy0+Y2FwcyAmIFNCX05PX01JREkpKQorCQl7CisJCQlpZiAoZGV2Yy0+aXJxID4gMCkKKwkJCQlmcmVlX2lycShkZXZjLT5pcnEsIGRldmMpOworCisJCQlzYl9taXhlcl91bmxvYWQoZGV2Yyk7CisJCQkvKiBXZSBkb24ndCBoYXZlIHRvIGRvIHRoaXMgYml0IGFueSBtb3JlIHRoZSBVQVJUNDAxIGlzIGl0cyBvd24KKwkJCQltYXN0ZXIgIC0tIEtyenlzenRvZiBIYWxhc2EgKi8KKwkJCS8qIEJ1dCB3ZSBoYXZlIHRvIGRvIGl0LCBpZiBVQVJUNDAxIGlzIG5vdCBkZXRlY3RlZCAqLworCQkJaWYgKCFzYm1wdSkKKwkJCQlzb3VuZF91bmxvYWRfbWlkaWRldihkZXZjLT5teV9taWRpZGV2KTsKKwkJCXNvdW5kX3VubG9hZF9hdWRpb2RldihkZXZjLT5kZXYpOworCQl9CisJCWtmcmVlKGRldmMpOworCX0KKwllbHNlCisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMTYpOworCWlmKGRldGVjdGVkX2RldmMpCisJCWtmcmVlKGRldGVjdGVkX2RldmMpOworfQorCisvKgorICoJTWl4ZXIgYWNjZXNzIHJvdXRpbmVzCisgKgorICoJRVMxODg3IG1vZGlmaWNhdGlvbnM6IHNvbWUgbWl4ZXIgcmVnaXN0ZXJzIHJlc2lkZSBpbiB0aGUKKyAqCXJhbmdlIGFib3ZlIDB4YTAuIFRoZXNlIG11c3QgYmUgYWNjZXNzZWQgaW4gYW5vdGhlciB3YXkuCisgKi8KKwordm9pZCBzYl9zZXRtaXhlcihzYl9kZXZjICogZGV2YywgdW5zaWduZWQgaW50IHBvcnQsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRldmMtPm1vZGVsID09IE1ETF9FU1MpIHsKKwkJZXNzX3NldG1peGVyIChkZXZjLCBwb3J0LCB2YWx1ZSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIChwb3J0ICYgMHhmZikpLCBNSVhFUl9BRERSKTsKKwl1ZGVsYXkoMjApOworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAodmFsdWUgJiAweGZmKSksIE1JWEVSX0RBVEEpOworCXVkZWxheSgyMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Cit9CisKK3Vuc2lnbmVkIGludCBzYl9nZXRtaXhlcihzYl9kZXZjICogZGV2YywgdW5zaWduZWQgaW50IHBvcnQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRldmMtPm1vZGVsID09IE1ETF9FU1MpIHJldHVybiBlc3NfZ2V0bWl4ZXIgKGRldmMsIHBvcnQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAocG9ydCAmIDB4ZmYpKSwgTUlYRVJfQUREUik7CisJdWRlbGF5KDIwKTsKKwl2YWwgPSBpbmIoTUlYRVJfREFUQSk7CisJdWRlbGF5KDIwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB2YWw7Cit9CisKK3ZvaWQgc2JfY2hnbWl4ZXIKKwkoc2JfZGV2YyAqIGRldmMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWludCB2YWx1ZTsKKworCXZhbHVlID0gc2JfZ2V0bWl4ZXIoZGV2YywgcmVnKTsKKwl2YWx1ZSA9ICh2YWx1ZSAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKKwlzYl9zZXRtaXhlcihkZXZjLCByZWcsIHZhbHVlKTsKK30KKworLyoKKyAqCU1QVTQwMSBNSURJIGluaXRpYWxpemF0aW9uLgorICovCisKK3N0YXRpYyB2b2lkIHNtd19wdXRtZW0oc2JfZGV2YyAqIGRldmMsIGludCBiYXNlLCBpbnQgYWRkciwgdW5zaWduZWQgY2hhciB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZqYXp6MTZfbG9jaywgZmxhZ3MpOyAgLyogTk9UIHRoZSBTQiBjYXJkPyAqLworCisJb3V0YigoYWRkciAmIDB4ZmYpLCBiYXNlICsgMSk7CS8qIExvdyBhZGRyZXNzIGJpdHMgKi8KKwlvdXRiKChhZGRyID4+IDgpLCBiYXNlICsgMik7CS8qIEhpZ2ggYWRkcmVzcyBiaXRzICovCisJb3V0YigodmFsKSwgYmFzZSk7CS8qIERhdGEgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmphenoxNl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNtd19nZXRtZW0oc2JfZGV2YyAqIGRldmMsIGludCBiYXNlLCBpbnQgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmphenoxNl9sb2NrLCBmbGFncyk7ICAvKiBOT1QgdGhlIFNCIGNhcmQ/ICovCisKKwlvdXRiKChhZGRyICYgMHhmZiksIGJhc2UgKyAxKTsJLyogTG93IGFkZHJlc3MgYml0cyAqLworCW91dGIoKGFkZHIgPj4gOCksIGJhc2UgKyAyKTsJLyogSGlnaCBhZGRyZXNzIGJpdHMgKi8KKwl2YWwgPSBpbmIoYmFzZSk7CS8qIERhdGEgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmphenoxNl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBzbXdfbWlkaV9pbml0KHNiX2RldmMgKiBkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJaW50IG1wdV9iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCWludCBtcF9iYXNlID0gbXB1X2Jhc2UgKyA0OwkJLyogTWljcm9jb250cm9sbGVyIGJhc2UgKi8KKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGNvbnRyb2w7CisKKworCS8qCisJICogIFJlc2V0IHRoZSBtaWNyb2NvbnRyb2xsZXIgc28gdGhhdCB0aGUgUkFNIGNhbiBiZSBhY2Nlc3NlZAorCSAqLworCisJY29udHJvbCA9IGluYihtcHVfYmFzZSArIDcpOworCW91dGIoKGNvbnRyb2wgfCAzKSwgbXB1X2Jhc2UgKyA3KTsJLyogU2V0IGxhc3QgdHdvIGJpdHMgdG8gMSAoPykgKi8KKwlvdXRiKCgoY29udHJvbCAmIDB4ZmUpIHwgMiksIG1wdV9iYXNlICsgNyk7CS8qIHh4eHh4eHgwIHJlc2V0cyB0aGUgbWMgKi8KKworCW1kZWxheSgzKTsJLyogV2FpdCBhdCBsZWFzdCAxbXMgKi8KKworCW91dGIoKGNvbnRyb2wgJiAweGZjKSwgbXB1X2Jhc2UgKyA3KTsJLyogeHh4eHh4MDAgZW5hYmxlcyBSQU0gKi8KKworCS8qCisJICogIERldGVjdCBtaWNyb2NvbnRyb2xsZXIgYnkgcHJvYmluZyB0aGUgOGsgUkFNIGFyZWEKKwkgKi8KKwlzbXdfcHV0bWVtKGRldmMsIG1wX2Jhc2UsIDAsIDB4MDApOworCXNtd19wdXRtZW0oZGV2YywgbXBfYmFzZSwgMSwgMHhmZik7CisJdWRlbGF5KDEwKTsKKworCWlmIChzbXdfZ2V0bWVtKGRldmMsIG1wX2Jhc2UsIDApICE9IDB4MDAgfHwgc213X2dldG1lbShkZXZjLCBtcF9iYXNlLCAxKSAhPSAweGZmKQorCXsKKwkJRERCKHByaW50aygiU00gV2F2ZTogTm8gbWljcm9jb250cm9sbGVyIFJBTSBkZXRlY3RlZCAoJTAyeCwgJTAyeClcbiIsIHNtd19nZXRtZW0oZGV2YywgbXBfYmFzZSwgMCksIHNtd19nZXRtZW0oZGV2YywgbXBfYmFzZSwgMSkpKTsKKwkJcmV0dXJuIDA7CS8qIE5vIFJBTSAqLworCX0KKwkvKgorCSAqICBUaGVyZSBpcyBSQU0gc28gYXNzdW1lIGl0J3MgcmVhbGx5IGEgU00gV2F2ZQorCSAqLworCisJZGV2Yy0+bW9kZWwgPSBNRExfU01XOworCXNtd19taXhlcl9pbml0KGRldmMpOworCisjaWZkZWYgTU9EVUxFCisJaWYgKCFzbXdfdWNvZGUpCisJeworCQlzbXdfdWNvZGVMZW4gPSBtb2RfZmlybXdhcmVfbG9hZCgiL2V0Yy9zb3VuZC9taWRpMDAwMS5iaW4iLCAodm9pZCAqKSAmc213X3Vjb2RlKTsKKwkJc213X2ZyZWUgPSBzbXdfdWNvZGU7CisJfQorI2VuZGlmCisJaWYgKHNtd191Y29kZUxlbiA+IDApCisJeworCQlpZiAoc213X3Vjb2RlTGVuICE9IDgxOTIpCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiU00gV2F2ZTogSW52YWxpZCBtaWNyb2NvZGUgKE1JREkwMDAxLkJJTikgbGVuZ3RoXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qCisJCSAqICBEb3dubG9hZCBtaWNyb2NvZGUKKwkJICovCisKKwkJZm9yIChpID0gMDsgaSA8IDgxOTI7IGkrKykKKwkJCXNtd19wdXRtZW0oZGV2YywgbXBfYmFzZSwgaSwgc213X3Vjb2RlW2ldKTsKKworCQkvKgorCQkgKiAgVmVyaWZ5IG1pY3JvY29kZQorCQkgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgODE5MjsgaSsrKQorCQkJaWYgKHNtd19nZXRtZW0oZGV2YywgbXBfYmFzZSwgaSkgIT0gc213X3Vjb2RlW2ldKQorCQkJeworCQkJCXByaW50ayhLRVJOX0VSUiAiU00gV2F2ZTogTWljcm9jb2RlIHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCX0KKwljb250cm9sID0gMDsKKyNpZmRlZiBTTVdfU0NTSV9JUlEKKwkvKgorCSAqIFNldCB0aGUgU0NTSSBpbnRlcnJ1cHQgKElSUTIvOSwgSVJRMyBvciBJUlExMCkuIFRoZSBTQ1NJIGludGVycnVwdAorCSAqIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisJICoKKwkgKiBGSVhNRSAtIG1ha2UgdGhpcyBhIG1vZHVsZSBvcHRpb24KKwkgKgorCSAqIEJUVyB0aGUgWmlsb2cgNTM4MCBTQ1NJIGNvbnRyb2xsZXIgaXMgbG9jYXRlZCBhdCBNUFUgYmFzZSArIDB4MTAuCisJICovCisJeworCQlzdGF0aWMgdW5zaWduZWQgY2hhciBzY3NpX2lycV9iaXRzW10gPSB7CisJCQkwLCAwLCAzLCAxLCAwLCAwLCAwLCAwLCAwLCAzLCAyLCAwLCAwLCAwLCAwLCAwCisJCX07CisJCWNvbnRyb2wgfD0gc2NzaV9pcnFfYml0c1tTTVdfU0NTSV9JUlFdIDw8IDY7CisJfQorI2VuZGlmCisKKyNpZmRlZiBTTVdfT1BMNF9FTkFCTEUKKwkvKgorCSAqICBNYWtlIHRoZSBPUEw0IGNoaXAgdmlzaWJsZSBvbiB0aGUgUEMgYnVzIGF0IDB4MzgwLgorCSAqCisJICogIFRoZXJlIGlzIG5vIG5lZWQgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZSBzaW5jZSB0aGlzIGRyaXZlcgorCSAqICBkb2Vzbid0IHN1cHBvcnQgT1BMNCB5ZXQuIEFsc28gdGhlcmUgaXMgbm8gUkFNIGluIFNNIFdhdmUgc28KKwkgKiAgZW5hYmxpbmcgT1BMNCBpcyBwcmV0dHkgdXNlbGVzcy4KKwkgKi8KKwljb250cm9sIHw9IDB4MTA7CS8qIFVzZXMgSVJRMTIgaWYgYml0IDB4MjAgPT0gMCAqLworCS8qIGNvbnRyb2wgfD0gMHgyMDsgICAgICBVbmNvbW1lbnQgdGhpcyBpZiB5b3Ugd2FudCB0byB1c2UgSVJRNyAqLworI2VuZGlmCisJb3V0YigoY29udHJvbCB8IDB4MDMpLCBtcHVfYmFzZSArIDcpOwkvKiB4eHh4eHgxMSByZXN0YXJ0cyAqLworCWh3X2NvbmZpZy0+bmFtZSA9ICJTb3VuZE1hbiBXYXZlIjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpbml0X0phenoxNl9taWRpKHNiX2RldmMgKiBkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJaW50IG1wdV9iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCWludCBzYl9iYXNlID0gZGV2Yy0+YmFzZTsKKwlpbnQgaXJxID0gaHdfY29uZmlnLT5pcnE7CisKKwl1bnNpZ25lZCBjaGFyIGJpdHMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaXJxIDwgMCkKKwkJaXJxICo9IC0xOworCisJaWYgKGlycSA8IDEgfHwgaXJxID4gMTUgfHwKKwkgICAgamF6el9pcnFfYml0c1tpcnFdID09IDApCisJeworCQlwcmludGsoS0VSTl9FUlIgIkphenoxNjogSW52YWxpZCBNSURJIGludGVycnVwdCAoSVJRJWQpXG4iLCBpcnEpOworCQlyZXR1cm4gMDsKKwl9CisJc3dpdGNoIChzYl9iYXNlKQorCXsKKwkJY2FzZSAweDIyMDoKKwkJCWJpdHMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMHgyNDA6CisJCQliaXRzID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDB4MjYwOgorCQkJYml0cyA9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KKwliaXRzID0gamF6ejE2X2JpdHMgPSBiaXRzIDw8IDU7CisJc3dpdGNoIChtcHVfYmFzZSkKKwl7CisJCWNhc2UgMHgzMTA6CisJCQliaXRzIHw9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweDMyMDoKKwkJCWJpdHMgfD0gMjsKKwkJCWJyZWFrOworCQljYXNlIDB4MzMwOgorCQkJYml0cyB8PSAzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIkphenoxNjogSW52YWxpZCBNSURJIEkvTyBwb3J0ICV4XG4iLCBtcHVfYmFzZSk7CisJCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKglNYWdpYyB3YWtlIHVwIHNlcXVlbmNlIGJ5IHdyaXRpbmcgdG8gMHgyMDEgKGFrYSBKb3lzdGljayBwb3J0KQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZqYXp6MTZfbG9jaywgZmxhZ3MpOworCW91dGIoMHhBRiwgMHgyMDEpOworCW91dGIoMHg1MCwgMHgyMDEpOworCW91dGIoYml0cywgMHgyMDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmphenoxNl9sb2NrLCBmbGFncyk7CisKKwlod19jb25maWctPm5hbWUgPSAiSmF6ejE2IjsKKwlzbXdfbWlkaV9pbml0KGRldmMsIGh3X2NvbmZpZyk7CisKKwlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIDB4ZmIpKQorCQlyZXR1cm4gMDsKKworCWlmICghc2JfZHNwX2NvbW1hbmQoZGV2YywgamF6el9kbWFfYml0c1tkZXZjLT5kbWE4XSB8CisJCQkgICAgKGphenpfZG1hX2JpdHNbZGV2Yy0+ZG1hMTZdIDw8IDQpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIGphenpfaXJxX2JpdHNbZGV2Yy0+aXJxXSB8CisJCQkgICAgKGphenpfaXJxX2JpdHNbaXJxXSA8PCA0KSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBwcm9iZV9zYm1wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCXNiX2RldmMgKmRldmMgPSBsYXN0X2RldmM7CisJaW50IHJldDsKKworCWlmIChsYXN0X2RldmMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlsYXN0X2RldmMgPSBOVUxMOworCisJaWYgKGh3X2NvbmZpZy0+aW9fYmFzZSA8PSAwKQorCXsKKwkJLyogVGhlIHJlYWwgdmlicmExNiBpcyBmaW5lIGFib3V0IHRoaXMsIGJ1dCB3ZSBoYXZlIHRvIGdvCisJCSAgIHdpcGUgdXAgYWZ0ZXIgQ3lyaXggYWdhaW4gKi8KKwkJICAgCSAgIAorCQlpZihkZXZjLT5tb2RlbCA9PSBNRExfU0IxNiAmJiBkZXZjLT5taW5vciA+PSAxMikKKwkJeworCQkJdW5zaWduZWQgY2hhciAgIGJpdHMgPSBzYl9nZXRtaXhlcihkZXZjLCAweDg0KSAmIH4weDA2OworCQkJc2Jfc2V0bWl4ZXIoZGV2YywgMHg4NCwgYml0cyB8IDB4MDIpOwkJLyogRGlzYWJsZSBNUFUgKi8KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TT1VORF9NUFU0MDEpCisJaWYgKGRldmMtPm1vZGVsID09IE1ETF9FU1MpCisJeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCQlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMiwgIm1wdTQwMSIpOworCQlpZiAoIXBvcnRzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNibXB1OiBJL08gcG9ydCBjb25mbGljdCAoJXgpXG4iLCBod19jb25maWctPmlvX2Jhc2UpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFlc3NfbWlkaV9pbml0KGRldmMsIGh3X2NvbmZpZykpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlod19jb25maWctPm5hbWUgPSAiRVNTMXh4eCBNUFUiOworCQlkZXZjLT5taWRpX2lycV9jb29raWUgPSBOVUxMOworCQlpZiAoIXByb2JlX21wdTQwMShod19jb25maWcsIHBvcnRzKSkgeworCQkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyKTsKKwkJCXJldHVybiAwOworCQl9CisJCWF0dGFjaF9tcHU0MDEoaHdfY29uZmlnLCBvd25lcik7CisJCWlmIChsYXN0X3NiLT5pcnEgPT0gLWh3X2NvbmZpZy0+aXJxKQorCQkJbGFzdF9zYi0+bWlkaV9pcnFfY29va2llPSh2b2lkICopaHdfY29uZmlnLT5zbG90c1sxXTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKKwlzd2l0Y2ggKGRldmMtPm1vZGVsKQorCXsKKwkJY2FzZSBNRExfU0IxNjoKKwkJCWlmIChod19jb25maWctPmlvX2Jhc2UgIT0gMHgzMDAgJiYgaHdfY29uZmlnLT5pb19iYXNlICE9IDB4MzMwKQorCQkJeworCQkJCXByaW50ayhLRVJOX0VSUiAiU0IxNjogSW52YWxpZCBNSURJIHBvcnQgJXhcbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlod19jb25maWctPm5hbWUgPSAiU291bmQgQmxhc3RlciAxNiI7CisJCQlpZiAoaHdfY29uZmlnLT5pcnEgPCAzIHx8IGh3X2NvbmZpZy0+aXJxID09IGRldmMtPmlycSkKKwkJCQlod19jb25maWctPmlycSA9IC1kZXZjLT5pcnE7CisJCQlpZiAoZGV2Yy0+bWlub3IgPiAxMikJCS8qIFdoYXQgaXMgVmlicmEncyB2ZXJzaW9uPz8/ICovCisJCQkJc2IxNl9zZXRfbXB1X3BvcnQoZGV2YywgaHdfY29uZmlnKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTURMX0pBWlo6CisJCQlpZiAoaHdfY29uZmlnLT5pcnEgPCAzIHx8IGh3X2NvbmZpZy0+aXJxID09IGRldmMtPmlycSkKKwkJCQlod19jb25maWctPmlycSA9IC1kZXZjLT5pcnE7CisJCQlpZiAoIWluaXRfSmF6ejE2X21pZGkoZGV2YywgaHdfY29uZmlnKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgTURMX1lNUENJOgorCQkJaHdfY29uZmlnLT5uYW1lID0gIllhbWFoYSBQQ0kgTGVnYWN5IjsKKwkJCXByaW50aygiWWFtYWhhIFBDSSBsZWdhY3kgVUFSVDQwMSBjaGVjay5cbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9CisJCisJcmV0ID0gcHJvYmVfdWFydDQwMShod19jb25maWcsIG93bmVyKTsKKwlpZiAocmV0KQorCQlsYXN0X3NiLT5taWRpX2lycV9jb29raWU9bWlkaV9kZXZzW2h3X2NvbmZpZy0+c2xvdHNbNF1dLT5kZXZjOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgdW5sb2FkX3NibXB1KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19TT1VORF9NUFU0MDEpCisJaWYgKCFzdHJjbXAgKGh3X2NvbmZpZy0+bmFtZSwgIkVTUzF4eHggTVBVIikpIHsKKwkJdW5sb2FkX21wdTQwMShod19jb25maWcpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJdW5sb2FkX3VhcnQ0MDEoaHdfY29uZmlnKTsKK30KKworRVhQT1JUX1NZTUJPTChzYl9kc3BfaW5pdCk7CitFWFBPUlRfU1lNQk9MKHNiX2RzcF9kZXRlY3QpOworRVhQT1JUX1NZTUJPTChzYl9kc3BfdW5sb2FkKTsKK0VYUE9SVF9TWU1CT0woc2JfYmVfcXVpZXQpOworRVhQT1JUX1NZTUJPTChwcm9iZV9zYm1wdSk7CitFWFBPUlRfU1lNQk9MKHVubG9hZF9zYm1wdSk7CitFWFBPUlRfU1lNQk9MKHNtd19mcmVlKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9lc3MuYyBiL3NvdW5kL29zcy9zYl9lc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWUwNWZlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NiX2Vzcy5jCkBAIC0wLDAgKzEsMTgzMiBAQAorI3VuZGVmIEZLU19MT0dHSU5HCisjdW5kZWYgRktTX1RFU1QKKworLyoKKyAqIHRhYnMgc2hvdWxkIGJlIDQgc3BhY2VzLCBpbiB2aShtKTogc2V0IHRhYnN0b3A9NAorICoKKyAqIFRPRE86IAljb25zaXN0ZW5jeSBzcGVlZCBjYWxjdWxhdGlvbnMhIQorICoJCQljbGVhbnVwIQorICogPz8/PzoJRGlkIEkgYnJlYWsgTUlESSBzdXBwb3J0PworICoKKyAqIEhpc3Rvcnk6CisgKgorICogUm9sZiBGb2trZW5zCSAoRGVjIDIwIDE5OTgpOglFUzE4OHggcmVjb3JkaW5nIGxldmVsIHN1cHBvcnQgb24gYSBwZXIKKyAqIGZva2tlbnNyQHZlcnRpcy5ubAkJCWlucHV0IGJhc2lzLgorICoJCQkJIChEZWMgMjQgMTk5OCk6CVJlY29nbml0aW9uIG9mIEVTMTc4OCwgRVMxODg3LCBFUzE4ODgsCisgKgkJCQkJCQkJRVMxODY4LCBFUzE4NjkgYW5kIEVTMTg3OC4gQ291bGQgYmUgdXNlZCBmb3IKKyAqCQkJCQkJCQlzcGVjaWZpYyBoYW5kbGluZyBpbiB0aGUgZnV0dXJlLiBBbGwgZXhjZXB0CisgKgkJCQkJCQkJRVMxODg3IGFuZCBFUzE4ODggYW5kIEVTNjg4IGFyZSBoYW5kbGVkIGxpa2UKKyAqCQkJCQkJCQlFUzE2ODguCisgKgkJCQkgKERlYyAyNyAxOTk4KToJUkVDTEVWIGZvciBhbGwgKD8pIEVTMTY4OCsgY2hpcHMuIEVTMTg4eCBub3cKKyAqCQkJCQkJCQloYXZlIHRoZSAiRGVjIDIwIiBzdXBwb3J0ICsgUkVDTEVWCisgKgkJCQkgKEphbiAgMiAxOTk5KToJUHJlcGFyYXRpb24gZm9yIEZ1bGwgRHVwbGV4LiBUaGlzIG1lYW5zCisgKgkJCQkJCQkJQXVkaW8gMiBpcyBub3cgdXNlZCBmb3IgcGxheWJhY2sgd2hlbiBkbWExNgorICoJCQkJCQkJCWlzIHNwZWNpZmllZC4gVGhlIG5leHQgc3RlcCB3b3VsZCBiZSB0byB1c2UKKyAqCQkJCQkJCQlBdWRpbyAxIGFuZCBBdWRpbyAyIGF0IHRoZSBzYW1lIHRpbWUuCisgKgkJCQkgKEphbiAgOSAxOTk5KToJUHV0IGFsbCBFU1Mgc3R1ZmYgaW50byBzYl9lc3MuW2NoXSwgdGhpcworICoJCQkJCQkJCWluY2x1ZGVzIGJvdGggdGhlIEVTUyBzdHVmZiB0aGF0IGhhcyBiZWVuIGluCisgKgkJCQkJCQkJc2JfKltjaF0gYmVmb3JlIEkgdG91Y2hlZCBpdCBhbmQgdGhlIEVTUyBzdXBwb3J0CisgKgkJCQkJCQkJSSBhZGRlZCBsYXRlcgorICoJCQkJIChKYW4gMjMgMTk5OSk6CUZ1bGwgRHVwbGV4IHNlZW1zIHRvIHdvcmsuIEkgd3JvdGUgYSBzbWFsbAorICoJCQkJCQkJCXRlc3QgcHJvZ2d5IHdoaWNoIHdvcmtzIE9LLiBIYXZlbid0IGZvdW5kCisgKgkJCQkJCQkJYW55IGFwcGxpY2F0aW9ucyB0byB0ZXN0IGl0IHRob3VnaC4gU28gd2h5IGRpZAorICoJCQkJCQkJCUkgYm90aGVyIHRvIGNyZWF0ZSBpdCBhbnl3YXk/PyA6KSBKdXN0IGZvcgorICoJCQkJCQkJCWZ1bi4KKyAqCQkJCSAoTWF5ICAyIDE5OTkpOglJIHRyaWVkIHRvIGJlIHRvbyBzbWFydCBieSAiaW50cm9kdWNpbmciCisgKgkJCQkJCQkJZXNzX2NhbGNfYmVzdF9zcGVlZCAoKS4gVGhlIGlkZWEgd2FzIHRoYXQgdHdvCisgKgkJCQkJCQkJZGl2aWRlcnMgY291bGQgYmUgdXNlZCB0byBzZXR1cCBhIHNhbXBsZXJhdGUsCisgKgkJCQkJCQkJZXNzX2NhbGNfYmVzdF9zcGVlZCAoKSB3b3VsZCBjaG9vc2UgdGhlIGJlc3QuCisgKgkJCQkJCQkJVGhpcyB3b3JrcyBmb3IgcGxheWJhY2ssIGJ1dCByZXN1bHRzIGluCisgKgkJCQkJCQkJcmVjb3JkaW5nIHByb2JsZW1zIGZvciBoaWdoIHNhbXBsZXJhdGVzLiBJCisgKgkJCQkJCQkJZml4ZWQgdGhpcyBieSByZW1vdmluZyBlc3NfY2FsY19iZXN0X3NwZWVkICgpCisgKgkJCQkJCQkJYW5kIGp1c3QgZG9pbmcgd2hhdCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzLiAKKyAqIEFuZHkgU2xvYW5lICAgKEp1biAgNCAxOTk5KTogU3RvbGUgc29tZSBjb2RlIGZyb20gQUxTQSB0byBmaXggdGhlIHBsYXliYWNrCisgKiBhbmR5QGd1aWxkc29mdHdhcmUuY29tCQlzcGVlZCBvbiBFUzE4NjksIEVTMTg3OSwgRVMxODg3LCBhbmQgRVMxODg4LgorICogCQkJCQkJCQkxODc5J3Mgd2VyZSBwcmV2aW91c2x5IGlnbm9yZWQgYnkgdGhpcyBkcml2ZXI7CisgKiAJCQkJCQkJCWFkZGVkICh1bnRlc3RlZCkgc3VwcG9ydCBmb3IgdGhvc2UuCisgKiBDdmV0YW4gSXZhbm92IChPY3QgMjcgMTk5OSk6IEZpeGVkIGVzc19kc3BfaW5pdCB0byBjYWxsIGVzc19zZXRfZG1hX2h3IGZvcgorICogemV6b0BpbmV0LmJnCQkJCQlfQUxMXyBFU1MgbW9kZWxzLCBub3Qgb25seSBFUzE4ODcKKyAqCisgKiBUaGlzIGZpbGVzIGNvbnRhaW5zIEVTUyBjaGlwIHNwZWNpZmljcy4gSXQncyBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgRVNTCisgKiBoYW5kbGluZyBhcyBpdCByZXNpZGVkIGluIHNiX2NvbW1vbi5jLCBzYl9taXhlci5jIGFuZCBzYl9hdWRpby5jLiBUaGlzCisgKiBmaWxlIGFkZHMgZmVhdHVyZXMgbGlrZToKKyAqIC0gQ2hpcCBJZGVudGlmaWNhdGlvbiAoYXMgc2hvd24gaW4gL3Byb2Mvc291bmQpCisgKiAtIFJFQ0xFViBzdXBwb3J0IGZvciBFUzE2ODggYW5kIGxhdGVyCisgKiAtIDYgYml0cyBwbGF5YmFjayBsZXZlbCBzdXBwb3J0IGNoaXBzIGxhdGVyIHRoYW4gRVMxNjg4CisgKiAtIFJlY29yZGluZyBsZXZlbCBzdXBwb3J0IG9uIGEgcGVyLWRldmljZSBiYXNpcyBmb3IgRVMxODg3CisgKiAtIEZ1bGwtRHVwbGV4IGZvciBFUzE4ODcKKyAqCisgKiBGdWxsIGR1cGxleCBpcyBlbmFibGVkIGJ5IHNwZWNpZnlpbmcgZG1hMTYuIFdoaWxlIHRoZSBub3JtYWwgZG1hIG11c3QKKyAqIGJlIG9uZSBvZiAwLCAxIG9yIDMsIGRtYTE2IGNhbiBiZSBvbmUgb2YgMCwgMSwgMyBvciA1LiBETUEgNSBpcyBhIDE2IGJpdAorICogRE1BIGNoYW5uZWwsIHdoaWxlIHRoZSBvdGhlcnMgYXJlIDggYml0Li4KKyAqCisgKiBFU1MgZGV0ZWN0aW9uIGlzbid0IGZ1bGwgcHJvb2YgKHlldCkuIElmIGl0IGZhaWxzIGFuIGFkZGl0aW9uYWwgbW9kdWxlCisgKiBwYXJhbWV0ZXIgZXNzdHlwZSBjYW4gYmUgc3BlY2lmaWVkIHRvIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogLTEsIDAsIDY4OCwgMTY4OCwgMTg2OCwgMTg2OSwgMTc4OCwgMTg4NywgMTg4OAorICogLTEgbWVhbnM6IG1pbWljIDIuMCBiZWhhdmlvdXIsIAorICogIDAgbWVhbnM6IGF1dG8gZGV0ZWN0LgorICogICBvdGhlcnM6IGV4cGxpY2l0bHkgc3BlY2lmeSBjaGlwCisgKiAtMSBpcyBkZWZhdWx0LCBjYXVzZSBhdXRvIGRldGVjdCBzdGlsbCBkb2Vzbid0IHdvcmsuCisgKi8KKworLyoKKyAqIEFib3V0IHRoZSBkb2N1bWVudGF0aW9uCisgKgorICogSSBkb24ndCBrbm93IGlmIHRoZSBjaGlwcyBhbGwgYXJlIE9LLCBidXQgdGhlIGRvY3VtZW50YXRpb24gaXMgYnVnZ3kuICdjYXVzZQorICogSSBkb24ndCBoYXZlIGFsbCB0aGUgY2lwcyBteXNlbGYsIHRoZXJlJ3MgYSBsb3QgSSBjYW5ub3QgdmVyaWZ5LiBJJ2xsIHRyeSB0bworICoga2VlcCB0cmFjayBvZiBteSBsYXRlc3QgaW5zaWdodHMgYWJvdXQgaGlzIGhlcmUuIElmIHlvdSBoYXZlIGFkZGl0aW9uYWwgaW5mbywKKyAqIHBsZWFzZSBlbmxpZ2h0ZW4gbWUgKGZva2tlbnNyQHZlcnRpcy5ubCkhCisgKgorICogSSBoYWQgdGhlIGltcHJlc3Npb24gdGhhdCBFUzE2ODggYWxzbyBoYXMgNiBiaXQgbWFzdGVyIHZvbHVtZSBjb250cm9sLiBUaGUKKyAqIGRvY3VtZW50YXRpb24gYWJvdXQgRVMxODg4IChyZXYgQywgb2N0b2JlciAnOTUpIGNsYWltcyB0aGF0IEVTMTg4OCBoYXMKKyAqIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgRVMxNjg4IGRvZXNuJ3QgaGF2ZToKKyAqIC0gNiBiaXQgbWFzdGVyIHZvbHVtZQorICogLSBGdWxsIER1cGxleAorICogU28gRVMxNjg4IGFwcGFyZW50bHkgZG9lc24ndCBoYXZlIDYgYml0IG1hc3RlciB2b2x1bWUgY29udHJvbCwgYnV0IHRoZQorICogRVMxNjg4IGRvZXMgaGF2ZSBSRUNMRVYgY29udHJvbC4gTWFrZXMgbWUgd29uZGVyOiBkb2VzIEVTNjg4IGhhdmUgaXQgdG9vPworICogV2l0aG91dCBSRUNMRVYgRVM2ODggd29uJ3QgYmUgbXVjaCBmdW4gSSBndWVzcy4KKyAqCisgKiBGcm9tIHRoZSBFUzE4ODggKHJldiBDLCBvY3RvYmVyICc5NSkgZG9jdW1lbnRhdGlvbiBJIGdvdCB0aGUgaW1wcmVzc2lvbgorICogdGhhdCByZWdpc3RlcnMgMHg2OCB0byAweDZlIGRvbid0IGV4aXN0IHdoaWNoIG1lYW5zOiBubyByZWNvcmRpbmcgdm9sdW1lCisgKiBjb250cm9scy4gVG8gbXkgc3VycHJpc2UgdGhlIEVTODg4IGRvY3VtZW50YXRpb24gKDEvMTQvOTYpIGNsYWltcyB0aGF0CisgKiBFUzg4OCBkb2VzIGhhdmUgdGhlc2UgcmVjb3JkIG1peGVyIHJlZ2lzdGVycywgYnV0IHRoYXQgRVMxODg4IGRvZXNuJ3QgaGF2ZQorICogMHg2OSBhbmQgMHg2Yi4gU28gdGhlIHJlc3Qgc2hvdWxkIGJlIHRoZXJlLgorICoKKyAqIEknbSB0cnlpbmcgdG8gZ2V0IEVTMTg4NyBGdWxsIER1cGxleC4gQXVkaW8gMiBpcyBwbGF5YmFjayBvbmx5LCB3aGlsZSBBdWRpbyAyCisgKiBpcyBib3RoIHJlY29yZCBhbmQgcGxheWJhY2suIEkgdGhpbmsgSSBzaG91bGQgdXNlIEF1ZGlvIDIgZm9yIGFsbCBwbGF5YmFjay4KKyAqCisgKiBUaGUgZG9jdW1lbnRhdGlvbiBpcyBhbiBhZHZlbnR1cmU6IGl0J3MgY2xvc2UgYnV0IG5vdCBmdWxseSBhY2N1cmF0ZS4gSQorICogZm91bmQgb3V0IHRoYXQgYWZ0ZXIgYSByZXNldCBzb21lIHJlZ2lzdGVycyBhcmUgKk5PVCogcmVzZXQsIHRob3VnaCB0aGUKKyAqIGRvY3Mgc2F5IHRoZSB3b3VsZCBiZS4gSW50ZXJyZXN0aW5nIG9uZXMgYXJlIDB4N2YsIDB4N2QgYW5kIDB4N2EuIFRoZXkgYXJlCisgKiByZWxhdGVkIHRvIHRoZSBBdWRpbyAyIGNoYW5uZWwuIEkgYWxzbyB3YXMgc3VwcmlzZWQgYWJvdXQgdGhlIGNvbnNlcXVlbnNlcworICogb2Ygd3JpdGluZyAweDAwIHRvIDB4N2YgKHdoaWNoIHNob3VsZCBiZSBkb25lIGJ5IHJlc2V0KTogVGhlIEVTMTg4NyBtb3ZlcworICogaW50byBFUzE4ODggbW9kZS4gVGhpcyBtZWFucyB0aGF0IGl0IGNsYWltcyBJUlEgMTEsIHdoaWNoIGhhcHBlbnMgdG8gYmUgbXkKKyAqIElTRE4gYWRhcHRlci4gTmVlZGxlc3MgdG8gc2F5IGl0IG5vIGxvbmdlciB3b3JrZWQuIEkgbm93IHVuZGVyc3RhbmQgd2h5CisgKiBhZnRlciByZWJvb3RpbmcgMHg3ZiBhbHJlYWR5IHdhcyAweDA1LCB0aGUgdmFsdWUgb2YgbXkgY2hvaWNlOiB0aGUgQklPUworICogZGlkIGl0LgorICoKKyAqIE9oLCBhbmQgdGhpcyBpcyBhbm90aGVyIHRyYXA6IGluIEVTMTg4NyBkb2NzIG1peGVyIHJlZ2lzdGVyIDB4NzAgaXMgZGVjcmliZWQKKyAqIGFzIGlmIGl0J3MgZXhhY3RseSB0aGUgc2FtZSBhcyByZWdpc3RlciAweGExLiBUaGlzIGlzICpOT1QqIHRydWUuIFRoZQorICogZGVzY3JpcHRpb24gb2YgMHg3MCBpbiBFUzE4NjkgZG9jcyBpcyBhY2N1cmF0ZSBob3dldmVyLgorICogV2VsbCwgdGhlIGFzc3VtcHRpb24gYWJvdXQgRVMxODY5IHdhcyB3cm9uZzogcmVnaXN0ZXIgMHg3MCBpcyB2ZXJ5IG11Y2gKKyAqIGxpa2UgcmVnaXN0ZXIgMHhhMSwgZXhjZXB0IHRoYXQgYml0IDcgaXMgYWxsd2F5cyAxLCB3aGF0ZXZlciB5b3Ugd2FudAorICogaXQgdG8gYmUuCisgKgorICogV2hlbiB1c2luZyBhdWRpbyAyIG1peGVyIHJlZ2lzdGVyIDB4NzIgc2VlbXMgdGUgYmUgbWVhbmluZ2xlc3MuIE9ubHkgMHhhMgorICogaGFzIGVmZmVjdC4KKyAqCisgKiBTb2Z0d2FyZSByZXNldCBub3QgYmVpbmcgYWJsZSB0byByZXNldCBhbGwgcmVnaXN0ZXJzIGlzIGdyZWF0ISBFc3BlY2lhbGx5CisgKiB0aGUgZmFjdCB0aGF0IHJlZ2lzdGVyIDB4NzggaXNuJ3QgcmVzZXQgaXMgZ3JlYXQgd2hlbiB5b3Ugd2FubmEgY2hhbmdlIGJhY2sKKyAqIHRvIHNpbmdsZSBkbWEgb3BlcmF0aW9uIChzaW1wbGV4KTogYXVkaW8gMiBpcyBzdGlsbCBvcGVyYXRpb24sIGFuZCB1c2VzIHRoZQorICogc2FtZSBkbWEgYXMgYXVkaW8gMTogeW91ciBlc3MgY2hhbmdlcyBpbnRvIGEgZnVubnkgZWNobyBtYWNoaW5lLgorICoKKyAqIFJlY2VpdmVkIHRoZSBuZXcgdGhhdCBFUzE2ODggaXMgZGV0ZWN0ZWQgYXMgYSBFUzE3ODguIERpZCBzb21lIHRoaW5raW5nOgorICogdGhlIEVTMTg4NyBkZXRlY3Rpb24gc2NoZW1lIHN1Z2dlc3RzIGluIHN0ZXAgMiB0byB0cnkgaWYgYml0IDMgb2YgcmVnaXN0ZXIKKyAqIDB4NjQgY2FuIGJlIGNoYW5nZWQuIFRoaXMgaXMgaW5hY2N1cmF0ZSwgZmlyc3QgSSBpbnZlcnRlZCB0aGUgKiBjaGVjazogIklmCisgKiBjYW4gYmUgbW9kaWZpZWQsIGl0J3MgYSAxNjg4Iiwgd2hpY2ggbGVhZCB0byBhIGNvcnJlY3QgZGV0ZWN0aW9uCisgKiBvZiBteSBFUzE4ODcuIEl0IHJlc3VsdGVkIGhvd2V2ZXIgaW4gYmFkIGRldGVjdGlvbiBvZiAxNjg4IChyZXBvcnRlZCBieSBtYWlsKQorICogYW5kIDE4NjggKGlmIG5vIFBuUCBkZXRlY3Rpb24gZmlyc3QpOiB0aGV5IHJlc3VsdCBpbiBhIDE3ODggYmVpbmcgZGV0ZWN0ZWQuCisgKiBJIGRvbid0IGhhdmUgZG9jcyBvbiAxNjg4LCBidXQgSSBkbyBoYXZlIGRvY3Mgb24gMTg2ODogVGhlIGRvY3VtZW50YXRpb24gaXMKKyAqIHByb2JhYmx5IGluYWNjdXJhdGUgaW4gdGhlIGZhY3QgdGhhdCBJIHNob3VsZCBjaGVjayBiaXQgMiwgbm90IGJpdCAzLiBUaGlzCisgKiBpcyB3aGF0IEkgZG8gbm93LgorICovCisKKy8qCisgKiBBYm91dCByZWNvZ25pdGlvbiBvZiBFU1MgY2hpcHMKKyAqCisgKiBUaGUgZGlzdGluY3Rpb24gb2YgRVM2ODgsIEVTMTY4OCwgRVMxNzg4LCBFUzE4ODcgYW5kIEVTMTg4OCBpcyBkZXNjcmliZWQgaW4KKyAqIGEgKHByZWxpbWluYXJ5ID8/KSBkYXRhc2hlZXQgb24gRVMxODg3LiBJdCdzIGFpbSBpcyB0byBpZGVudGlmeSBFUzE4ODcsIGJ1dAorICogZHVyaW5nIGRldGVjdGlvbiB0aGUgdGV4dCBjbGFpbXMgdGhhdCAidGhpcyBjaGlwIG1heSBiZSAuLi4iIHdoZW4gYSBzdGVwCisgKiBmYWlscy4gVGhpcyBzY2hlbWUgaXMgdXNlZCB0byBkaXN0aW5jdCBiZXR3ZWVuIHRoZSBhYm92ZSBjaGlwcy4KKyAqIEl0IGFwcGVhcnMgaG93ZXZlciB0aGF0IHNvbWUgUG5QIGNoaXBzIGxpa2UgRVMxODY4IGFyZSByZWNvZ25pemVkIGFzIEVTMTc4OAorICogYnkgdGhlIEVTMTg4NyBkZXRlY3Rpb24gc2NoZW1lLiBUaGVzZSBQblAgY2hpcHMgY2FuIGJlIGRldGVjdGVkIGluIGFub3RoZXIKKyAqIHdheSBob3dldmVyOiBFUzE4NjgsIEVTMTg2OSBhbmQgRVMxODc4IGNhbiBiZSByZWNvZ25pemVkIChmdWxsIHByb29mIEkgdGhpbmspCisgKiBieSByZXBlYXRlZGx5IHJlYWRpbmcgbWl4ZXIgcmVnaXN0ZXIgMHg0MC4gVGhpcyBpcyBkb25lIGJ5IGVzc19pZGVudGlmeSBpbgorICogc2JfY29tbW9uLmMuCisgKiBUaGlzIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBkZXRlY3Rpb24gc3RlcHM6CisgKiAtIGRpc3RpbmN0IGJldHdlZW4gRVM2ODggYW5kIEVTMTY4OCsgKGFzIGFsd2F5cyBkb25lIGluIHRoaXMgZHJpdmVyKQorICogICBpZiBFUzY4OCB3ZSdyZSByZWFkeQorICogLSB0cnkgdG8gZGV0ZWN0IEVTMTg2OCwgRVMxODY5IG9yIEVTMTg3OAorICogICBpZiBzdWNjZXNzZnVsIHdlJ3JlIHJlYWR5CisgKiAtIHRyeSB0byBkZXRlY3QgRVMxODg4LCBFUzE4ODcgb3IgRVMxNzg4CisgKiAgIGlmIHN1Y2Nlc3NmdWwgd2UncmUgcmVhZHkKKyAqIC0gRHVubm8uIE11c3QgYmUgMTY4OC4gV2lsbCBkbyBpbiBnZW5lcmFsCisgKgorICogQWJvdXQgUkVDTEVWIHN1cHBvcnQ6CisgKgorICogVGhlIGV4aXN0aW5nIEVTMTY4OCBzdXBwb3J0IGRpZG4ndCB0YWtlIGNhcmUgb2YgdGhlIEVTMTY4OCsgcmVjb3JkaW5nCisgKiBsZXZlbHMgdmVyeSB3ZWxsLiBXaGVuZXZlciBhIGRldmljZSB3YXMgc2VsZWN0ZWQgKHJlY21hc2spIGZvciByZWNvcmRpbmcKKyAqIGl0J3MgcmVjb3JkaW5nIGxldmVsIHdhcyBsb3VkLCBhbmQgaXQgY291bGRuJ3QgYmUgY2hhbmdlZC4gVGhlIGZhY3QgdGhhdAorICogaW50ZXJuYWwgcmVnaXN0ZXIgMHhiNCBjb3VsZCB0YWtlIGNhcmUgb2YgUkVDTEVWLCBkaWRuJ3Qgd29yayBtZWFuaW5nIHVudGlsCisgKiBpdCdzIHZhbHVlIHdhcyByZXN0b3JlZCBldmVyeSB0aW1lIHRoZSBjaGlwIHdhcyByZXNldDsgdGhpcyByZXNldCB0aGUKKyAqIHZhbHVlIG9mIDB4YjQgdG9vLiBJIGd1ZXNzIHRoYXQncyB3aGF0IDRmcm9udCBhbHNvIGhhZCAoaGF2ZT8pIHRyb3VibGUgd2l0aC4KKyAqCisgKiBBYm91dCBFUzE4ODcgc3VwcG9ydDoKKyAqCisgKiBUaGUgRVMxODg3IGhhcyBzZXBhcmF0ZSByZWdpc3RlcnMgdG8gY29udHJvbCB0aGUgcmVjb3JkaW5nIGxldmVscywgZm9yIGFsbAorICogaW5wdXRzLiBUaGUgRVMxODg3IHNwZWNpZmljIHNvZnR3YXJlIG1ha2VzIHRoZXNlIGxldmVscyB0aGUgc2FtZSBhcyB0aGVpcgorICogY29ycmVzcG9uZGluZyBwbGF5YmFjayBsZXZlbHMsIHVubGVzcyByZWNtYXNrIHNheXMgdGhleSBhcmVuJ3QgcmVjb3JkZWQuIEluCisgKiB0aGUgbGF0dGVyIGNhc2UgdGhlIHJlY29yZGluZyB2b2x1bWVzIGFyZSAwLgorICogTm93IHJlY29yZGluZyBsZXZlbHMgb2YgaW5wdXRzIGNhbiBiZSBjb250cm9sbGVkLCBieSBjaGFuZ2luZyB0aGUgcGxheWJhY2sKKyAqIGxldmVscy4gRnV0aGVybW9yZSBzZXZlcmFsIGRldmljZXMgY2FuIGJlIHJlY29yZGVkIHRvZ2V0aGVyICh3aGljaCBpcyBub3QKKyAqIHBvc3NpYmxlIHdpdGggdGhlIEVTMTY4OC4KKyAqIEJlc2lkZXMgdGhlIHNlcGFyYXRlIHJlY29yZGluZyBsZXZlbCBjb250cm9sIGZvciBlYWNoIGlucHV0LCB0aGUgY29tbW9uCisgKiByZWNvcmRpZyBsZXZlbCBjYW4gYWxzbyBiZSBjb250cm9sbGVkIGJ5IFJFQ0xFViBhcyBkZXNjcmliZWQgYWJvdmUuCisgKgorICogTm90IG9ubHkgRVMxODg3IGhhdmUgdGhpcyByZWNvcmRpbmcgbWl4ZXIuIEkga25vdyB0aGUgZm9sbG93aW5nIGZyb20gdGhlCisgKiBkb2N1bWVudGF0aW9uOgorICogRVM2ODgJbm8KKyAqIEVTMTY4OAlubworICogRVMxODY4CW5vCisgKiBFUzE4NjkJeWVzCisgKiBFUzE4NzgJbm8KKyAqIEVTMTg3OQl5ZXMKKyAqIEVTMTg4OAluby95ZXMJQ29udHJhZGljdGluZyBkb2N1bWVudGF0aW9uOyBtb3N0IHJlY2VudDogeWVzCisgKiBFUzE5NDYJeWVzCQlUaGlzIGlzIGEgUENJIGNoaXA7IG5vdCBoYW5kbGVkIGJ5IHRoaXMgZHJpdmVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInNiX21peGVyLmgiCisjaW5jbHVkZSAic2IuaCIKKworI2luY2x1ZGUgInNiX2Vzcy5oIgorCisjZGVmaW5lIEVTU1RZUEVfTElLRTIwCS0xCQkvKiBNaW1pYyAyLjAgYmVoYXZpb3VyCQkJCQkqLworI2RlZmluZSBFU1NUWVBFX0RFVEVDVAkwCQkvKiBNaW1pYyAyLjAgYmVoYXZpb3VyCQkJCQkqLworCisjZGVmaW5lIFNVQk1ETF9FUzE3ODgJMHgxMAkvKiBTdWJ0eXBlIEVTMTc4OCBmb3Igc3BlY2lmaWMgaGFuZGxpbmcgKi8KKyNkZWZpbmUgU1VCTURMX0VTMTg2OAkweDExCS8qIFN1YnR5cGUgRVMxODY4IGZvciBzcGVjaWZpYyBoYW5kbGluZyAqLworI2RlZmluZSBTVUJNRExfRVMxODY5CTB4MTIJLyogU3VidHlwZSBFUzE4NjkgZm9yIHNwZWNpZmljIGhhbmRsaW5nICovCisjZGVmaW5lIFNVQk1ETF9FUzE4NzgJMHgxMwkvKiBTdWJ0eXBlIEVTMTg3OCBmb3Igc3BlY2lmaWMgaGFuZGxpbmcgKi8KKyNkZWZpbmUgU1VCTURMX0VTMTg3OQkweDE2ICAgIC8qIEVTMTg3OSB3YXMgaW5pdGlhbGx5IGZvcmdvdHRlbiAqLworI2RlZmluZSBTVUJNRExfRVMxODg3CTB4MTQJLyogU3VidHlwZSBFUzE4ODcgZm9yIHNwZWNpZmljIGhhbmRsaW5nICovCisjZGVmaW5lIFNVQk1ETF9FUzE4ODgJMHgxNQkvKiBTdWJ0eXBlIEVTMTg4OCBmb3Igc3BlY2lmaWMgaGFuZGxpbmcgKi8KKworI2RlZmluZSBTQl9DQVBfRVMxOFhYX1JBVEUgMHgxMDAKKworI2RlZmluZSBFUzE2ODhfQ0xPQ0sxIDc5NTQ0NCAvKiAxMjggLSBkaXYgKi8KKyNkZWZpbmUgRVMxNjg4X0NMT0NLMiAzOTc3MjIgLyogMjU2IC0gZGl2ICovCisjZGVmaW5lIEVTMThYWF9DTE9DSzEgNzkzODAwIC8qIDEyOCAtIGRpdiAqLworI2RlZmluZSBFUzE4WFhfQ0xPQ0syIDc2ODAwMCAvKiAyNTYgLSBkaXYgKi8KKworI2lmZGVmIEZLU19MT0dHSU5HCitzdGF0aWMgdm9pZCBlc3Nfc2hvd19taXhlcnJlZ3MgKHNiX2RldmMgKmRldmMpOworI2VuZGlmCitzdGF0aWMgaW50IGVzc19yZWFkIChzYl9kZXZjICogZGV2YywgdW5zaWduZWQgY2hhciByZWcpOworc3RhdGljIGludCBlc3Nfd3JpdGUgKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciBkYXRhKTsKK3N0YXRpYyB2b2lkIGVzc19jaGdtaXhlcgorCShzYl9kZXZjICogZGV2YywgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCB2YWwpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkJCQkJCQkJCQkJKgorICoJCQkJCQkJCQlFU1MgYXVkaW8JCQkJCQkJCSoKKyAqCQkJCQkJCQkJCQkJCQkJCQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXNzX2NvbW1hbmQge3Nob3J0IGNtZDsgc2hvcnQgZGF0YTt9OworCisvKgorICogQ29tbWFuZHMgZm9yIGluaXRpYWxpemluZyBBdWRpbyAxIGZvciBpbnB1dCAocmVjb3JkKQorICovCitzdGF0aWMgc3RydWN0IGVzc19jb21tYW5kIGVzc19pMDhtW10gPQkJLyogaW5wdXQgOCBiaXQgbW9ubyAqLworCXsgezB4YjcsIDB4NTF9LCB7MHhiNywgMHhkMH0sIHstMSwgMH0gfTsKK3N0YXRpYyBzdHJ1Y3QgZXNzX2NvbW1hbmQgZXNzX2kxNm1bXSA9CQkvKiBpbnB1dCAxNiBiaXQgbW9ubyAqLworCXsgezB4YjcsIDB4NzF9LCB7MHhiNywgMHhmNH0sIHstMSwgMH0gfTsKK3N0YXRpYyBzdHJ1Y3QgZXNzX2NvbW1hbmQgZXNzX2kwOHNbXSA9CQkvKiBpbnB1dCA4IGJpdCBzdGVyZW8gKi8KKwl7IHsweGI3LCAweDUxfSwgezB4YjcsIDB4OTh9LCB7LTEsIDB9IH07CitzdGF0aWMgc3RydWN0IGVzc19jb21tYW5kIGVzc19pMTZzW10gPQkJLyogaW5wdXQgMTYgYml0IHN0ZXJlbyAqLworCXsgezB4YjcsIDB4NzF9LCB7MHhiNywgMHhiY30sIHstMSwgMH0gfTsKKworc3RhdGljIHN0cnVjdCBlc3NfY29tbWFuZCAqZXNzX2lucF9jbWRzW10gPQorCXsgZXNzX2kwOG0sIGVzc19pMTZtLCBlc3NfaTA4cywgZXNzX2kxNnMgfTsKKworCisvKgorICogQ29tbWFuZHMgZm9yIGluaXRpYWxpemluZyBBdWRpbyAxIGZvciBvdXRwdXQgKHBsYXliYWNrKQorICovCitzdGF0aWMgc3RydWN0IGVzc19jb21tYW5kIGVzc19vMDhtW10gPQkJLyogb3V0cHV0IDggYml0IG1vbm8gKi8KKwl7IHsweGI2LCAweDgwfSwgezB4YjcsIDB4NTF9LCB7MHhiNywgMHhkMH0sIHstMSwgMH0gfTsKK3N0YXRpYyBzdHJ1Y3QgZXNzX2NvbW1hbmQgZXNzX28xNm1bXSA9CQkvKiBvdXRwdXQgMTYgYml0IG1vbm8gKi8KKwl7IHsweGI2LCAweDAwfSwgezB4YjcsIDB4NzF9LCB7MHhiNywgMHhmNH0sIHstMSwgMH0gfTsKK3N0YXRpYyBzdHJ1Y3QgZXNzX2NvbW1hbmQgZXNzX28wOHNbXSA9CQkvKiBvdXRwdXQgOCBiaXQgc3RlcmVvICovCisJeyB7MHhiNiwgMHg4MH0sIHsweGI3LCAweDUxfSwgezB4YjcsIDB4OTh9LCB7LTEsIDB9IH07CitzdGF0aWMgc3RydWN0IGVzc19jb21tYW5kIGVzc19vMTZzW10gPQkJLyogb3V0cHV0IDE2IGJpdCBzdGVyZW8gKi8KKwl7IHsweGI2LCAweDAwfSwgezB4YjcsIDB4NzF9LCB7MHhiNywgMHhiY30sIHstMSwgMH0gfTsKKworc3RhdGljIHN0cnVjdCBlc3NfY29tbWFuZCAqZXNzX291dF9jbWRzW10gPQorCXsgZXNzX28wOG0sIGVzc19vMTZtLCBlc3NfbzA4cywgZXNzX28xNnMgfTsKKworc3RhdGljIHZvaWQgZXNzX2V4ZWNfY29tbWFuZHMKKwkoc2JfZGV2YyAqZGV2Yywgc3RydWN0IGVzc19jb21tYW5kICpjbWR0YWJbXSkKK3sKKwlzdHJ1Y3QgZXNzX2NvbW1hbmQgKmNtZDsKKworCWNtZCA9IGNtZHRhYiBbICgoZGV2Yy0+Y2hhbm5lbHMgIT0gMSkgPDwgMSkgKyAoZGV2Yy0+Yml0cyAhPSBBRk1UX1U4KSBdOworCisJd2hpbGUgKGNtZC0+Y21kICE9IC0xKSB7CisJCWVzc193cml0ZSAoZGV2YywgY21kLT5jbWQsIGNtZC0+ZGF0YSk7CisJCWNtZCsrOworCX0KK30KKworc3RhdGljIHZvaWQgZXNzX2NoYW5nZQorCShzYl9kZXZjICpkZXZjLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpbnQgdmFsdWU7CisKKwl2YWx1ZSA9IGVzc19yZWFkIChkZXZjLCByZWcpOworCXZhbHVlID0gKHZhbHVlICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOworCWVzc193cml0ZSAoZGV2YywgcmVnLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGVzc19zZXRfb3V0cHV0X3Bhcm1zCisJKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgbnJfYnl0ZXMsIGludCBpbnRyZmxhZykKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGRldmMtPmR1cGxleCkgeworCQlkZXZjLT50cmdfYnVmXzE2ID0gYnVmOworCQlkZXZjLT50cmdfYnl0ZXNfMTYgPSBucl9ieXRlczsKKwkJZGV2Yy0+dHJnX2ludHJmbGFnXzE2ID0gaW50cmZsYWc7CisJCWRldmMtPmlycV9tb2RlXzE2ID0gSU1PREVfT1VUUFVUOworCX0gZWxzZSB7CisJCWRldmMtPnRyZ19idWYgPSBidWY7CisJCWRldmMtPnRyZ19ieXRlcyA9IG5yX2J5dGVzOworCQlkZXZjLT50cmdfaW50cmZsYWcgPSBpbnRyZmxhZzsKKwkJZGV2Yy0+aXJxX21vZGUgPSBJTU9ERV9PVVRQVVQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBlc3Nfc2V0X2lucHV0X3Bhcm1zCisJKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgY291bnQsIGludCBpbnRyZmxhZykKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJZGV2Yy0+dHJnX2J1ZiA9IGJ1ZjsKKwlkZXZjLT50cmdfYnl0ZXMgPSBjb3VudDsKKwlkZXZjLT50cmdfaW50cmZsYWcgPSBpbnRyZmxhZzsKKwlkZXZjLT5pcnFfbW9kZSA9IElNT0RFX0lOUFVUOworfQorCitzdGF0aWMgaW50IGVzc19jYWxjX2RpdiAoaW50IGNsb2NrLCBpbnQgcmV2ZXJ0LCBpbnQgKnNwZWVkcCwgaW50ICpkaWZmcCkKK3sKKwlpbnQgZGl2aWRlcjsKKwlpbnQgc3BlZWQsIGRpZmY7CisJaW50IHJldHZhbDsKKworCXNwZWVkICAgPSAqc3BlZWRwOworCWRpdmlkZXIgPSAoY2xvY2sgKyBzcGVlZCAvIDIpIC8gc3BlZWQ7CisJcmV0dmFsICA9IHJldmVydCAtIGRpdmlkZXI7CisJaWYgKHJldHZhbCA+IHJldmVydCAtIDEpIHsKKwkJcmV0dmFsICA9IHJldmVydCAtIDE7CisJCWRpdmlkZXIgPSByZXZlcnQgLSByZXR2YWw7CisJfQorCS8qIFRoaXMgbGluZSBpcyBzdWdnZXN0ZWQuIE11c3QgYmUgd3JvbmcgSSB0aGluaworCSpzcGVlZHAgPSAoY2xvY2sgKyBkaXZpZGVyIC8gMikgLyBkaXZpZGVyOworCVNvIEkgY2hvc2UgdGhlIG5leHQgb25lICovCisKKwkqc3BlZWRwCT0gY2xvY2sgLyBkaXZpZGVyOworCWRpZmYJPSBzcGVlZCAtICpzcGVlZHA7CisJaWYgKGRpZmYgPCAwKSBkaWZmID0tZGlmZjsKKwkqZGlmZnAgID0gZGlmZjsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZXNzX2NhbGNfYmVzdF9zcGVlZAorCShpbnQgY2xvY2sxLCBpbnQgcmV2MSwgaW50IGNsb2NrMiwgaW50IHJldjIsIGludCAqZGl2cCwgaW50ICpzcGVlZHApCit7CisJaW50IHNwZWVkMSA9ICpzcGVlZHAsIHNwZWVkMiA9ICpzcGVlZHA7CisJaW50IGRpdjEsIGRpdjI7CisJaW50IGRpZmYxLCBkaWZmMjsKKwlpbnQgcmV0dmFsOworCisJZGl2MSA9IGVzc19jYWxjX2RpdiAoY2xvY2sxLCByZXYxLCAmc3BlZWQxLCAmZGlmZjEpOworCWRpdjIgPSBlc3NfY2FsY19kaXYgKGNsb2NrMiwgcmV2MiwgJnNwZWVkMiwgJmRpZmYyKTsKKworCWlmIChkaWZmMSA8IGRpZmYyKSB7CisJCSpkaXZwICAgPSBkaXYxOworCQkqc3BlZWRwID0gc3BlZWQxOworCQlyZXR2YWwgID0gMTsKKwl9IGVsc2UgeworCS8qCSpkaXZwICAgPSBkaXYyOyAqLworCQkqZGl2cCAgID0gMHg4MCB8IGRpdjI7CisJCSpzcGVlZHAgPSBzcGVlZDI7CisJCXJldHZhbCAgPSAyOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBEZXBlbmRpbmcgb24gdGhlIGF1ZGlvY2hhbm5lbCBFU1MgZGV2aWNlcyBjYW4KKyAqIGhhdmUgZGlmZmVyZW50IGNsb2NrIHNldHRpbmdzLiBUaGVzZSBhcmUgbWFkZSBjb25zaXN0ZW50IGZvciBkdXBsZXgKKyAqIGhvd2V2ZXIuCisgKiBjYWxsZXJzIG9mIGVzc19zcGVlZCBvbmx5IGRvIGFuIGF1ZGlvbnVtIHN1Z2dlc3Rpb24sIHdoaWNoIG1lYW5zCisgKiBpbnB1dCBzdWdnZXN0cyAxLCBvdXRwdXQgc3VnZ2VzdHMgMi4gVGhpcyBzdWdnZXN0aW9uIGlzIG9ubHkgdHJ1ZQorICogaG93ZXZlciB3aGVuIGRvaW5nIGR1cGxleC4KKyAqLworc3RhdGljIHZvaWQgZXNzX2NvbW1vbl9zcGVlZCAoc2JfZGV2YyAqZGV2YywgaW50ICpzcGVlZHAsIGludCAqZGl2cCkKK3sKKwlpbnQgZGlmZiA9IDAsIGRpdjsKKworCWlmIChkZXZjLT5kdXBsZXgpIHsKKwkJLyoKKwkJICogVGhlIDB4ODAgaXMgaW1wb3J0YW50IGZvciB0aGUgZmlyc3QgYXVkaW8gY2hhbm5lbAorCQkgKi8KKwkJaWYgKGRldmMtPnN1Ym1vZGVsID09IFNVQk1ETF9FUzE4ODgpIHsKKwkJCWRpdiA9IDB4ODAgfCBlc3NfY2FsY19kaXYgKDc5NTUwMCwgMjU2LCBzcGVlZHAsICZkaWZmKTsKKwkJfSBlbHNlIHsKKwkJCWRpdiA9IDB4ODAgfCBlc3NfY2FsY19kaXYgKDc5NTUwMCwgMTI4LCBzcGVlZHAsICZkaWZmKTsKKwkJfQorCX0gZWxzZSBpZihkZXZjLT5jYXBzICYgU0JfQ0FQX0VTMThYWF9SQVRFKSB7CisJCWlmIChkZXZjLT5zdWJtb2RlbCA9PSBTVUJNRExfRVMxODg4KSB7CisJCQllc3NfY2FsY19iZXN0X3NwZWVkKDM5NzcwMCwgMTI4LCA3OTU1MDAsIDI1NiwgCisJCQkJCQkmZGl2LCBzcGVlZHApOworCQl9IGVsc2UgeworCQkJZXNzX2NhbGNfYmVzdF9zcGVlZChFUzE4WFhfQ0xPQ0sxLCAxMjgsIEVTMThYWF9DTE9DSzIsIDI1NiwgCisJCQkJCQkmZGl2LCBzcGVlZHApOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCpzcGVlZHAgPiAyMjAwMCkgeworCQkJZGl2ID0gMHg4MCB8IGVzc19jYWxjX2RpdiAoRVMxNjg4X0NMT0NLMSwgMjU2LCBzcGVlZHAsICZkaWZmKTsKKwkJfSBlbHNlIHsKKwkJCWRpdiA9IDB4MDAgfCBlc3NfY2FsY19kaXYgKEVTMTY4OF9DTE9DSzIsIDEyOCwgc3BlZWRwLCAmZGlmZik7CisJCX0KKwl9CisJKmRpdnAgPSBkaXY7Cit9CisKK3N0YXRpYyB2b2lkIGVzc19zcGVlZCAoc2JfZGV2YyAqZGV2YywgaW50IGF1ZGlvbnVtKQoreworCWludCBzcGVlZDsKKwlpbnQgZGl2LCBkaXYyOworCisJZXNzX2NvbW1vbl9zcGVlZCAoZGV2YywgJihkZXZjLT5zcGVlZCksICZkaXYpOworCisjaWZkZWYgRktTX1JFR19MT0dHSU5HCitwcmludGsgKEtFUk5fSU5GTyAiRktTOiBlc3Nfc3BlZWQgKCVkKSBiIHNwZWVkID0gJWQsIGRpdj0leFxuIiwgYXVkaW9udW0sIGRldmMtPnNwZWVkLCBkaXYpOworI2VuZGlmCisKKwkvKiBTZXQgZmlsdGVyIHJvbGwtb2ZmIHRvIDkwJSBvZiBzcGVlZC8yICovCisJc3BlZWQgPSAoZGV2Yy0+c3BlZWQgKiA5KSAvIDIwOworCisJZGl2MiA9IDI1NiAtIDcxNjAwMDAgLyAoc3BlZWQgKiA4Mik7CisKKwlpZiAoIWRldmMtPmR1cGxleCkgYXVkaW9udW0gPSAxOworCisJaWYgKGF1ZGlvbnVtID09IDEpIHsKKwkJLyogQ2hhbmdlIGJlaGF2aW91ciBvZiByZWdpc3RlciBBMSAqCisJCXNiX2NoZ19taXhlcihkZXZjLCAweDcxLCAweDIwLCAweDIwKQorCQkqIEZvciBFUzE4Njkgb25seT8/PyAqLworCQllc3Nfd3JpdGUgKGRldmMsIDB4YTEsIGRpdik7CisJCWVzc193cml0ZSAoZGV2YywgMHhhMiwgZGl2Mik7CisJfSBlbHNlIHsKKwkJZXNzX3NldG1peGVyIChkZXZjLCAweDcwLCBkaXYpOworCQkvKgorCQkgKiBGS1M6IGZhc2NpbmF0aW5nOiAweDcyIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLgorCQkgKi8KKwkJZXNzX3dyaXRlIChkZXZjLCAweGEyLCBkaXYyKTsKKwkJZXNzX3NldG1peGVyIChkZXZjLCAweDcyLCBkaXYyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXNzX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJZXNzX3NwZWVkKGRldmMsIDEpOworCisJc2JfZHNwX2NvbW1hbmQoZGV2YywgRFNQX0NNRF9TUEtPRkYpOworCisJZXNzX3dyaXRlIChkZXZjLCAweGI4LCAweDBlKTsJLyogQXV0byBpbml0IERNQSBtb2RlICovCisJZXNzX2NoYW5nZSAoZGV2YywgMHhhOCwgMHgwMywgMyAtIGRldmMtPmNoYW5uZWxzKTsJLyogTW9uby9zdGVyZW8gKi8KKwllc3Nfd3JpdGUgKGRldmMsIDB4YjksIDIpOwkvKiBEZW1hbmQgbW9kZSAoNCBieXRlcy9ETUEgcmVxdWVzdCkgKi8KKworCWVzc19leGVjX2NvbW1hbmRzIChkZXZjLCBlc3NfaW5wX2NtZHMpOworCisJZXNzX2NoYW5nZSAoZGV2YywgMHhiMSwgMHhmMCwgMHg1MCk7CisJZXNzX2NoYW5nZSAoZGV2YywgMHhiMiwgMHhmMCwgMHg1MCk7CisKKwlkZXZjLT50cmlnZ2VyX2JpdHMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzc19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXRfYXVkaW8xIChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCXNiX2RzcF9yZXNldChkZXZjKTsKKwllc3Nfc3BlZWQoZGV2YywgMSk7CisJZXNzX3dyaXRlIChkZXZjLCAweGI4LCA0KTsJLyogQXV0byBpbml0IERNQSBtb2RlICovCisJZXNzX2NoYW5nZSAoZGV2YywgMHhhOCwgMHgwMywgMyAtIGRldmMtPmNoYW5uZWxzKTsJLyogTW9uby9zdGVyZW8gKi8KKwllc3Nfd3JpdGUgKGRldmMsIDB4YjksIDIpOwkvKiBEZW1hbmQgbW9kZSAoNCBieXRlcy9yZXF1ZXN0KSAqLworCisJZXNzX2V4ZWNfY29tbWFuZHMgKGRldmMsIGVzc19vdXRfY21kcyk7CisKKwllc3NfY2hhbmdlIChkZXZjLCAweGIxLCAweGYwLCAweDUwKTsJLyogRW5hYmxlIERNQSAqLworCWVzc19jaGFuZ2UgKGRldmMsIDB4YjIsIDB4ZjAsIDB4NTApOwkvKiBFbmFibGUgSVJRICovCisKKwlzYl9kc3BfY29tbWFuZChkZXZjLCBEU1BfQ01EX1NQS09OKTsJLyogVGhlcmUgYmUgc291bmQhICovCisKKwlkZXZjLT50cmlnZ2VyX2JpdHMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzc19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXRfYXVkaW8yIChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisKKy8qIEZLUzogcXFxCisJc2JfZHNwX3Jlc2V0KGRldmMpOworKi8KKworCS8qCisJICogQXV0by1Jbml0aWFsaXplOgorCSAqIERNQSBtb2RlICsgZGVtYW5kIG1vZGUgKDggYnl0ZXMvcmVxdWVzdCwgeWVzIEkgd2FudCBpdCBhbGwhKQorCSAqIEJ1dCBsZWF2ZSAxNi1iaXQgRE1BIGJpdCB1bnRvdWNoZWQhCisJICovCisJZXNzX2NoZ21peGVyIChkZXZjLCAweDc4LCAweGQwLCAweGQwKTsKKworCWVzc19zcGVlZChkZXZjLCAyKTsKKworCS8qIGJpdHMgNDozIG9uIEVTMTg4NyByZXByZXNlbnQgcmVjb3JkaW5nIHNvdXJjZS4gS2VlcCB0aGVtISAqLworCWJpdHMgPSBlc3NfZ2V0bWl4ZXIgKGRldmMsIDB4N2EpICYgMHgxODsKKworCS8qIFNldCBzdGVyZW8vbW9ubyAqLworCWlmIChkZXZjLT5jaGFubmVscyAhPSAxKSBiaXRzIHw9IDB4MDI7CisKKwkvKiBJbml0IERBQ3M7IFVOU0lHTkVEIG1vZGUgZm9yIDggYml0OyBTSUdORUQgbW9kZSBmb3IgMTYgYml0ICovCisJaWYgKGRldmMtPmJpdHMgIT0gQUZNVF9VOCkgYml0cyB8PSAweDA1OwkvKiAxNiBiaXQgKi8KKworCS8qIEVuYWJsZSBETUEsIElSUSB3aWxsIGJlIHNoYXJlZCAoaG9wZWZ1bGx5KSovCisJYml0cyB8PSAweDYwOworCisJZXNzX3NldG1peGVyIChkZXZjLCAweDdhLCBiaXRzKTsKKworCWVzc19taXhlcl9yZWxvYWQgKGRldmMsIFNPVU5EX01JWEVSX1BDTSk7CS8qIFRoZXJlIGJlIHNvdW5kISAqLworCisJZGV2Yy0+dHJpZ2dlcl9iaXRzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlc3NfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisjaWZkZWYgRktTX1JFR19MT0dHSU5HCitwcmludGsoS0VSTl9JTkZPICJlc3NfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0OiBkbWFfb3V0PSVkLGRtYV9pbj0lZFxuIgorLCBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEsIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hKTsKKyNlbmRpZgorCisJaWYgKGRldmMtPmR1cGxleCkgeworCQlyZXR1cm4gZXNzX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dF9hdWRpbzIgKGRldiwgYnNpemUsIGJjb3VudCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGVzc19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXRfYXVkaW8xIChkZXYsIGJzaXplLCBiY291bnQpOworCX0KK30KKworc3RhdGljIHZvaWQgZXNzX2F1ZGlvX2hhbHRfeGZlcihpbnQgZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJc2JfZHNwX3Jlc2V0KGRldmMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogQXVkaW8gMiBtYXkgc3RpbGwgYmUgb3BlcmF0aW9uYWwhIENyZWF0ZXMgYXdmdWwgc291bmRzIQorCSAqLworCWlmIChkZXZjLT5kdXBsZXgpIGVzc19jaGdtaXhlcihkZXZjLCAweDc4LCAweDAzLCAweDAwKTsKK30KKworc3RhdGljIHZvaWQgZXNzX2F1ZGlvX3N0YXJ0X2lucHV0CisJKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgbnJfYnl0ZXMsIGludCBpbnRyZmxhZykKK3sKKwlpbnQgY291bnQgPSBucl9ieXRlczsKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXNob3J0IGMgPSAtbnJfYnl0ZXM7CisKKwkvKgorCSAqIFN0YXJ0IGEgRE1BIGlucHV0IHRvIHRoZSBidWZmZXIgcG9pbnRlZCBieSBkbWFxdGFpbAorCSAqLworCisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hID4gMykgY291bnQgPj49IDE7CisJY291bnQtLTsKKworCWRldmMtPmlycV9tb2RlID0gSU1PREVfSU5QVVQ7CisKKwllc3Nfd3JpdGUgKGRldmMsIDB4YTQsICh1bnNpZ25lZCBjaGFyKSAoKHVuc2lnbmVkIHNob3J0KSBjICYgMHhmZikpOworCWVzc193cml0ZSAoZGV2YywgMHhhNSwgKHVuc2lnbmVkIGNoYXIpICgoKHVuc2lnbmVkIHNob3J0KSBjID4+IDgpICYgMHhmZikpOworCisJZXNzX2NoYW5nZSAoZGV2YywgMHhiOCwgMHgwZiwgMHgwZik7CS8qIEdvICovCisJZGV2Yy0+aW50cl9hY3RpdmUgPSAxOworfQorCitzdGF0aWMgdm9pZCBlc3NfYXVkaW9fb3V0cHV0X2Jsb2NrX2F1ZGlvMQorCShpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IG5yX2J5dGVzLCBpbnQgaW50cmZsYWcpCit7CisJaW50IGNvdW50ID0gbnJfYnl0ZXM7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlzaG9ydCBjID0gLW5yX2J5dGVzOworCisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA+IDMpCisJCWNvdW50ID4+PSAxOworCWNvdW50LS07CisKKwlkZXZjLT5pcnFfbW9kZSA9IElNT0RFX09VVFBVVDsKKworCWVzc193cml0ZSAoZGV2YywgMHhhNCwgKHVuc2lnbmVkIGNoYXIpICgodW5zaWduZWQgc2hvcnQpIGMgJiAweGZmKSk7CisJZXNzX3dyaXRlIChkZXZjLCAweGE1LCAodW5zaWduZWQgY2hhcikgKCgodW5zaWduZWQgc2hvcnQpIGMgPj4gOCkgJiAweGZmKSk7CisKKwllc3NfY2hhbmdlIChkZXZjLCAweGI4LCAweDA1LCAweDA1KTsJLyogR28gKi8KKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGVzc19hdWRpb19vdXRwdXRfYmxvY2tfYXVkaW8yCisJKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgbnJfYnl0ZXMsIGludCBpbnRyZmxhZykKK3sKKwlpbnQgY291bnQgPSBucl9ieXRlczsKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXNob3J0IGMgPSAtbnJfYnl0ZXM7CisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID4gMykgY291bnQgPj49IDE7CisJY291bnQtLTsKKworCWVzc19zZXRtaXhlciAoZGV2YywgMHg3NCwgKHVuc2lnbmVkIGNoYXIpICgodW5zaWduZWQgc2hvcnQpIGMgJiAweGZmKSk7CisJZXNzX3NldG1peGVyIChkZXZjLCAweDc2LCAodW5zaWduZWQgY2hhcikgKCgodW5zaWduZWQgc2hvcnQpIGMgPj4gOCkgJiAweGZmKSk7CisJZXNzX2NoZ21peGVyIChkZXZjLCAweDc4LCAweDAzLCAweDAzKTsgICAvKiBHbyAqLworCisJZGV2Yy0+aXJxX21vZGVfMTYgPSBJTU9ERV9PVVRQVVQ7CisJCWRldmMtPmludHJfYWN0aXZlXzE2ID0gMTsKK30KKworc3RhdGljIHZvaWQgZXNzX2F1ZGlvX291dHB1dF9ibG9jaworCShpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IG5yX2J5dGVzLCBpbnQgaW50cmZsYWcpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmIChkZXZjLT5kdXBsZXgpIHsKKwkJZXNzX2F1ZGlvX291dHB1dF9ibG9ja19hdWRpbzIgKGRldiwgYnVmLCBucl9ieXRlcywgaW50cmZsYWcpOworCX0gZWxzZSB7CisJCWVzc19hdWRpb19vdXRwdXRfYmxvY2tfYXVkaW8xIChkZXYsIGJ1ZiwgbnJfYnl0ZXMsIGludHJmbGFnKTsKKwl9Cit9CisKKy8qCisgKiBGS1M6IHRoZSBpZi1zdGF0ZW1lbnRzIGZvciBib3RoIGJpdHMgYW5kIGJpdHNfMTYgYXJlIHF1aXRlIGFsaWtlLgorICogQ29tYmluZSB0aGlzLi4uCisgKi8KK3N0YXRpYyB2b2lkIGVzc19hdWRpb190cmlnZ2VyKGludCBkZXYsIGludCBiaXRzKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpbnQgYml0c18xNiA9IGJpdHMgJiBkZXZjLT5pcnFfbW9kZV8xNjsKKwliaXRzICY9IGRldmMtPmlycV9tb2RlOworCisJaWYgKCFiaXRzICYmICFiaXRzXzE2KSB7CisJCS8qIEZLUyBvaCBvaC4uLi4gd3Jvbmc/PyBmb3IgZG1hIDE2PyAqLworCQlzYl9kc3BfY29tbWFuZChkZXZjLCAweGQwKTsJLyogSGFsdCBETUEgKi8KKwl9CisKKwlpZiAoYml0cykgeworCQlzd2l0Y2ggKGRldmMtPmlycV9tb2RlKQorCQl7CisJCQljYXNlIElNT0RFX0lOUFVUOgorCQkJCWVzc19hdWRpb19zdGFydF9pbnB1dChkZXYsIGRldmMtPnRyZ19idWYsIGRldmMtPnRyZ19ieXRlcywKKwkJCQkJZGV2Yy0+dHJnX2ludHJmbGFnKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJTU9ERV9PVVRQVVQ6CisJCQkJZXNzX2F1ZGlvX291dHB1dF9ibG9jayhkZXYsIGRldmMtPnRyZ19idWYsIGRldmMtPnRyZ19ieXRlcywKKwkJCQkJZGV2Yy0+dHJnX2ludHJmbGFnKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChiaXRzXzE2KSB7CisJCXN3aXRjaCAoZGV2Yy0+aXJxX21vZGVfMTYpIHsKKwkJY2FzZSBJTU9ERV9JTlBVVDoKKwkJCWVzc19hdWRpb19zdGFydF9pbnB1dChkZXYsIGRldmMtPnRyZ19idWZfMTYsIGRldmMtPnRyZ19ieXRlc18xNiwKKwkJCQkJZGV2Yy0+dHJnX2ludHJmbGFnXzE2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU1PREVfT1VUUFVUOgorCQkJZXNzX2F1ZGlvX291dHB1dF9ibG9jayhkZXYsIGRldmMtPnRyZ19idWZfMTYsIGRldmMtPnRyZ19ieXRlc18xNiwKKwkJCQkJZGV2Yy0+dHJnX2ludHJmbGFnXzE2KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGV2Yy0+dHJpZ2dlcl9iaXRzID0gYml0cyB8IGJpdHNfMTY7Cit9CisKK3N0YXRpYyBpbnQgZXNzX2F1ZGlvX3NldF9zcGVlZChpbnQgZGV2LCBpbnQgc3BlZWQpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlpbnQgbWluc3BlZWQsIG1heHNwZWVkLCBkdW1teWRpdjsKKworCWlmIChzcGVlZCA+IDApIHsKKwkJbWluc3BlZWQgPSAoZGV2Yy0+ZHVwbGV4ID8gNjIxNSAgOiA1MDAwICk7CisJCW1heHNwZWVkID0gKGRldmMtPmR1cGxleCA/IDQ0MTAwIDogNDgwMDApOworCQlpZiAoc3BlZWQgPCBtaW5zcGVlZCkgc3BlZWQgPSBtaW5zcGVlZDsKKwkJaWYgKHNwZWVkID4gbWF4c3BlZWQpIHNwZWVkID0gbWF4c3BlZWQ7CisKKwkJZXNzX2NvbW1vbl9zcGVlZCAoZGV2YywgJnNwZWVkLCAmZHVtbXlkaXYpOworCisJCWRldmMtPnNwZWVkID0gc3BlZWQ7CisJfQorCXJldHVybiBkZXZjLT5zcGVlZDsKK30KKworLyoKKyAqIEZLUzogVGhpcyBpcyBhIG9uZS1vbi1vbmUgY29weSBvZiBzYjFfYXVkaW9fc2V0X2JpdHMKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBlc3NfYXVkaW9fc2V0X2JpdHMoaW50IGRldiwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmIChiaXRzICE9IDApIHsKKwkJaWYgKGJpdHMgPT0gQUZNVF9VOCB8fCBiaXRzID09IEFGTVRfUzE2X0xFKSB7CisJCQlkZXZjLT5iaXRzID0gYml0czsKKwkJfSBlbHNlIHsKKwkJCWRldmMtPmJpdHMgPSBBRk1UX1U4OworCQl9CisJfQorCisJcmV0dXJuIGRldmMtPmJpdHM7Cit9CisKKy8qCisgKiBGS1M6IFRoaXMgaXMgYSBvbmUtb24tb25lIGNvcHkgb2Ygc2Jwcm9fYXVkaW9fc2V0X2NoYW5uZWxzCisgKiAoKikgTW9kaWZpZWQgaXQhIQorICovCitzdGF0aWMgc2hvcnQgZXNzX2F1ZGlvX3NldF9jaGFubmVscyhpbnQgZGV2LCBzaG9ydCBjaGFubmVscykKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGNoYW5uZWxzID09IDEgfHwgY2hhbm5lbHMgPT0gMikgZGV2Yy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKworCXJldHVybiBkZXZjLT5jaGFubmVsczsKK30KKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgZXNzX2F1ZGlvX2RyaXZlciA9ICAgLyogRVNTIEVTNjg4LzE2ODggKi8KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBzYl9hdWRpb19vcGVuLAorCS5jbG9zZQkJCT0gc2JfYXVkaW9fY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBlc3Nfc2V0X291dHB1dF9wYXJtcywKKwkuc3RhcnRfaW5wdXQJCT0gZXNzX3NldF9pbnB1dF9wYXJtcywKKwkucHJlcGFyZV9mb3JfaW5wdXQJPSBlc3NfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQsCisJLnByZXBhcmVfZm9yX291dHB1dAk9IGVzc19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQsCisJLmhhbHRfaW8JCT0gZXNzX2F1ZGlvX2hhbHRfeGZlciwKKwkudHJpZ2dlcgkJPSBlc3NfYXVkaW9fdHJpZ2dlciwKKwkuc2V0X3NwZWVkCQk9IGVzc19hdWRpb19zZXRfc3BlZWQsCisJLnNldF9iaXRzCQk9IGVzc19hdWRpb19zZXRfYml0cywKKwkuc2V0X2NoYW5uZWxzCQk9IGVzc19hdWRpb19zZXRfY2hhbm5lbHMKK307CisKKy8qCisgKiBlc3NfYXVkaW9faW5pdCBtdXN0IGJlIGNhbGxlZCBmcm9tIHNiX2F1ZGlvX2luaXQKKyAqLworc3RydWN0IGF1ZGlvX2RyaXZlciAqZXNzX2F1ZGlvX2luaXQKKwkJKHNiX2RldmMgKmRldmMsIGludCAqYXVkaW9fZmxhZ3MsIGludCAqZm9ybWF0X21hc2spCit7CisJKmF1ZGlvX2ZsYWdzID0gRE1BX0FVVE9NT0RFOworCSpmb3JtYXRfbWFzayB8PSBBRk1UX1MxNl9MRTsKKworCWlmIChkZXZjLT5kdXBsZXgpIHsKKwkJaW50IHRtcF9kbWE7CisJCS8qCisJCSAqIHNiX2F1ZGlvX2luaXQgdGhpbmtzIGRtYTggaXMgZm9yIHBsYXliYWNrIGFuZAorCQkgKiBkbWExNiBpcyBmb3IgcmVjb3JkLiBOb3Qgbm93ISBTbyBzd2FwIHRoZW0uCisJCSAqLworCQl0bXBfZG1hCQk9IGRldmMtPmRtYTE2OworCQlkZXZjLT5kbWExNgk9IGRldmMtPmRtYTg7CisJCWRldmMtPmRtYTgJPSB0bXBfZG1hOworCisJCSphdWRpb19mbGFncyB8PSBETUFfRFVQTEVYOworCX0KKworCXJldHVybiAmZXNzX2F1ZGlvX2RyaXZlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQkJCQkJCQkJCQkJCQkJCSoKKyAqCQkJCQkJCQlFU1MgY29tbW9uCQkJCQkJCQkJKgorICoJCQkJCQkJCQkJCQkJCQkJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBlc3NfaGFuZGxlX2NoYW5uZWwKKwkoY2hhciAqY2hhbm5lbCwgaW50IGRldiwgaW50IGludHJfYWN0aXZlLCB1bnNpZ25lZCBjaGFyIGZsYWcsIGludCBpcnFfbW9kZSkKK3sKKwlpZiAoIWludHJfYWN0aXZlIHx8ICFmbGFnKSByZXR1cm47CisjaWZkZWYgRktTX1JFR19MT0dHSU5HCitwcmludGsoS0VSTl9JTkZPICJGS1M6IGVzc19oYW5kbGVfY2hhbm5lbCAlcyBpcnFfbW9kZT0lZFxuIiwgY2hhbm5lbCwgaXJxX21vZGUpOworI2VuZGlmCisJc3dpdGNoIChpcnFfbW9kZSkgeworCQljYXNlIElNT0RFX09VVFBVVDoKKwkJCURNQWJ1Zl9vdXRwdXRpbnRyIChkZXYsIDEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJTU9ERV9JTlBVVDoKKwkJCURNQWJ1Zl9pbnB1dGludHIgKGRldik7CisJCQlicmVhazsKKworCQljYXNlIElNT0RFX0lOSVQ6CisJCQlicmVhazsKKworCQlkZWZhdWx0OjsKKwkJCS8qIHByaW50ayhLRVJOX1dBUk4gIkVTUzogVW5leHBlY3RlZCBpbnRlcnJ1cHRcbiIpOyAqLworCX0KK30KKworLyoKKyAqIEZLUzogVE9ETyEhISBGaW5pc2ggdGhpcyEKKyAqCisgKiBJIHRoaW5rIG1pZGkgc3R1ZmYgdXNlcyB1YXJ0NDAxLCB3aXRob3V0IGludGVycnVwdHMuCisgKiBTbyBJTU9ERV9NSURJIGlzbid0IGEgdmFsdWUgZm9yIGRldmMtPmlycV9tb2RlLgorICovCit2b2lkIGVzc19pbnRyIChzYl9kZXZjICpkZXZjKQoreworCWludAkJCQlzdGF0dXM7CisJdW5zaWduZWQgY2hhcglzcmM7CisKKwlpZiAoZGV2Yy0+c3VibW9kZWwgPT0gU1VCTURMX0VTMTg4NykgeworCQlzcmMgPSBlc3NfZ2V0bWl4ZXIgKGRldmMsIDB4N2YpID4+IDQ7CisJfSBlbHNlIHsKKwkJc3JjID0gMHhmZjsKKwl9CisKKyNpZmRlZiBGS1NfUkVHX0xPR0dJTkcKK3ByaW50ayhLRVJOX0lORk8gIkZLUzogc2JpbnRyIHNyYz0leFxuIiwoaW50KXNyYyk7CisjZW5kaWYKKwllc3NfaGFuZGxlX2NoYW5uZWwKKwkJKCAiQXVkaW8gMSIKKwkJLCBkZXZjLT5kZXYsIGRldmMtPmludHJfYWN0aXZlICAgLCBzcmMgJiAweDAxLCBkZXZjLT5pcnFfbW9kZSAgICk7CisJZXNzX2hhbmRsZV9jaGFubmVsCisJCSggIkF1ZGlvIDIiCisJCSwgZGV2Yy0+ZGV2LCBkZXZjLT5pbnRyX2FjdGl2ZV8xNiwgc3JjICYgMHgwMiwgZGV2Yy0+aXJxX21vZGVfMTYpOworCS8qCisJICogQWNrbm93bGVkZ2UgaW50ZXJydXB0cworCSAqLworCWlmIChkZXZjLT5zdWJtb2RlbCA9PSBTVUJNRExfRVMxODg3ICYmIChzcmMgJiAweDAyKSkgeworCQllc3NfY2hnbWl4ZXIgKGRldmMsIDB4N2EsIDB4ODAsIDB4MDApOworCX0KKworCWlmIChzcmMgJiAweDAxKSB7CisJCXN0YXR1cyA9IGluYihEU1BfREFUQV9BVkFJTCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlc3NfZXh0ZW5kZWQgKHNiX2RldmMgKiBkZXZjKQoreworCS8qIEVuYWJsZSBleHRlbmRlZCBtb2RlICovCisKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAweGM2KTsKK30KKworc3RhdGljIGludCBlc3Nfd3JpdGUgKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciBkYXRhKQoreworI2lmZGVmIEZLU19SRUdfTE9HR0lORworcHJpbnRrKEtFUk5fSU5GTyAiRktTOiB3cml0ZSByZWcgJXg6ICV4XG4iLCByZWcsIGRhdGEpOworI2VuZGlmCisJLyogV3JpdGUgYSBieXRlIHRvIGFuIGV4dGVuZGVkIG1vZGUgcmVnaXN0ZXIgb2YgRVMxNjg4ICovCisKKwlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIHJlZykpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNiX2RzcF9jb21tYW5kKGRldmMsIGRhdGEpOworfQorCitzdGF0aWMgaW50IGVzc19yZWFkIChzYl9kZXZjICogZGV2YywgdW5zaWduZWQgY2hhciByZWcpCit7CisJLyogUmVhZCBhIGJ5dGUgZnJvbSBhbiBleHRlbmRlZCBtb2RlIHJlZ2lzdGVyIG9mIEVTMTY4OCAqLworCisJLyogUmVhZCByZWdpc3RlciBjb21tYW5kICovCisJaWYgKCFzYl9kc3BfY29tbWFuZChkZXZjLCAweGMwKSkgcmV0dXJuIC0xOworCisJaWYgKCFzYl9kc3BfY29tbWFuZChkZXZjLCByZWcgKSkgcmV0dXJuIC0xOworCisJcmV0dXJuIHNiX2RzcF9nZXRfYnl0ZShkZXZjKTsKK30KKworaW50IGVzc19kc3BfcmVzZXQoc2JfZGV2YyAqIGRldmMpCit7CisJaW50IGxvb3BjOworCisjaWZkZWYgRktTX1JFR19MT0dHSU5HCitwcmludGsoS0VSTl9JTkZPICJGS1M6IGVzc19kc3BfcmVzZXQgMVxuIik7Citlc3Nfc2hvd19taXhlcnJlZ3MgKGRldmMpOworI2VuZGlmCisKKwlERUIocHJpbnRrKCJFbnRlcmVkIGVzc19kc3BfcmVzZXQoKVxuIikpOworCisJb3V0YigzLCBEU1BfUkVTRVQpOyAvKiBSZXNldCBGSUZPIHRvbyAqLworCisJdWRlbGF5KDEwKTsKKwlvdXRiKDAsIERTUF9SRVNFVCk7CisJdWRlbGF5KDMwKTsKKworCWZvciAobG9vcGMgPSAwOyBsb29wYyA8IDEwMDAgJiYgIShpbmIoRFNQX0RBVEFfQVZBSUwpICYgMHg4MCk7IGxvb3BjKyspOworCisJaWYgKGluYihEU1BfUkVBRCkgIT0gMHhBQSkgeworCQlEREIocHJpbnRrKCJzYjogTm8gcmVzcG9uc2UgdG8gUkVTRVRcbiIpKTsKKwkJcmV0dXJuIDA7ICAgLyogU29ycnkgKi8KKwl9CisJZXNzX2V4dGVuZGVkIChkZXZjKTsKKworCURFQihwcmludGsoInNiX2RzcF9yZXNldCgpIE9LXG4iKSk7CisKKyNpZmRlZiBGS1NfTE9HR0lORworcHJpbnRrKEtFUk5fSU5GTyAiRktTOiBkc3BfcmVzZXQgMlxuIik7Citlc3Nfc2hvd19taXhlcnJlZ3MgKGRldmMpOworI2VuZGlmCisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBlc3NfaXJxX2JpdHMgKGludCBpcnEpCit7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIDI6CisJY2FzZSA5OgorCQlyZXR1cm4gMDsKKworCWNhc2UgNToKKwkJcmV0dXJuIDE7CisKKwljYXNlIDc6CisJCXJldHVybiAyOworCisJY2FzZSAxMDoKKwkJcmV0dXJuIDM7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIkVTUzE2ODg6IEludmFsaWQgSVJRICVkXG4iLCBpcnEpOworCQlyZXR1cm4gLTE7CisJfQorfQorCisvKgorICoJU2V0IElSUSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGZvciBhbGwgRVNTIG1vZGVscworICovCitzdGF0aWMgaW50IGVzc19jb21tb25fc2V0X2lycV9odyAoc2JfZGV2YyAqIGRldmMpCit7CisJaW50IGlycV9iaXRzOworCisJaWYgKChpcnFfYml0cyA9IGVzc19pcnFfYml0cyAoZGV2Yy0+aXJxKSkgPT0gLTEpIHJldHVybiAwOworCisJaWYgKCFlc3Nfd3JpdGUgKGRldmMsIDB4YjEsIDB4NTAgfCAoaXJxX2JpdHMgPDwgMikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVMxNjg4OiBGYWlsZWQgdG8gd3JpdGUgdG8gSVJRIGNvbmZpZyByZWdpc3RlclxuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEkgd2FubmEgdXNlIG1vZGVybiBFUzE4ODcgbWl4ZXIgaXJxIGhhbmRsaW5nLiBGdW5ueSBpcyB0aGUKKyAqIGZhY3QgdGhhdCBteSBCSU9TIHdhbnRzIHRoZSBzYW1lLiBCdXQgc3VwcG9zZSBzb21lb25lJ3MgQklPUworICogZG9lc24ndCBkbyB0aGlzIQorICogVGhpcyBpcyBpbmRlcGVuZGVudCBvZiBkdXBsZXguIElmIHRoZXJlJ3MgYSAxODg3IHRoaXMgd2lsbAorICogcHJldmVudCBpdCBmcm9tIGdvaW5nIGludG8gMTg4OCBtb2RlLgorICovCitzdGF0aWMgdm9pZCBlc3NfZXMxODg3X3NldF9pcnFfaHcgKHNiX2RldmMgKiBkZXZjKQoreworCWludCBpcnFfYml0czsKKworCWlmICgoaXJxX2JpdHMgPSBlc3NfaXJxX2JpdHMgKGRldmMtPmlycSkpID09IC0xKSByZXR1cm47CisKKwllc3NfY2hnbWl4ZXIgKGRldmMsIDB4N2YsIDB4MGYsIDB4MDEgfCAoKGlycV9iaXRzICsgMSkgPDwgMSkpOworfQorCitzdGF0aWMgaW50IGVzc19zZXRfaXJxX2h3IChzYl9kZXZjICogZGV2YykKK3sKKwlpZiAoZGV2Yy0+c3VibW9kZWwgPT0gU1VCTURMX0VTMTg4NykgZXNzX2VzMTg4N19zZXRfaXJxX2h3IChkZXZjKTsKKworCXJldHVybiBlc3NfY29tbW9uX3NldF9pcnFfaHcgKGRldmMpOworfQorCisjaWZkZWYgRktTX1RFU1QKKworLyoKKyAqIEZLU190ZXN0OgorICoJZm9yIEVTMTg4NzogMDAsIDE4LCBub24gd3IgYml0czogMDAwMSAxMDAwCisgKglmb3IgRVMxODY4OiAwMCwgYjgsIG5vbiB3ciBiaXRzOiAxMDExIDEwMDAKKyAqCWZvciBFUzE4ODg6IDAwLCBmOCwgbm9uIHdyIGJpdHM6IDExMTEgMTAwMAorICoJZm9yIEVTMTY4ODogMDAsIGY4LCBub24gd3IgYml0czogMTExMSAxMDAwCisgKgkrICAgRVM5NjgKKyAqLworCitzdGF0aWMgdm9pZCBGS1NfdGVzdCAoc2JfZGV2YyAqIGRldmMpCit7CisJaW50IHZhbDEsIHZhbDI7CisJdmFsMSA9IGVzc19nZXRtaXhlciAoZGV2YywgMHg2NCk7CisJZXNzX3NldG1peGVyIChkZXZjLCAweDY0LCB+dmFsMSk7CisJdmFsMiA9IGVzc19nZXRtaXhlciAoZGV2YywgMHg2NCkgXiB+dmFsMTsKKwllc3Nfc2V0bWl4ZXIgKGRldmMsIDB4NjQsIHZhbDEpOworCXZhbDEgXj0gZXNzX2dldG1peGVyIChkZXZjLCAweDY0KTsKK3ByaW50ayAoS0VSTl9JTkZPICJGS1M6IEZLU190ZXN0ICUwMngsICUwMnhcbiIsICh2YWwxICYgMHgwZmYpLCAodmFsMiAmIDB4MGZmKSk7Cit9OworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXNzX2lkZW50aWZ5IChzYl9kZXZjICogZGV2YykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAoMHg0MCAmIDB4ZmYpKSwgTUlYRVJfQUREUik7CisKKwl1ZGVsYXkoMjApOworCXZhbCAgPSBpbmIoTUlYRVJfREFUQSkgPDwgODsKKwl1ZGVsYXkoMjApOworCXZhbCB8PSBpbmIoTUlYRVJfREFUQSk7CisJdWRlbGF5KDIwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogRVNTIHRlY2hub2xvZ3kgZGVzY3JpYmVzIGEgZGV0ZWN0aW9uIHNjaGVtZSBpbiB0aGVpciBkb2NzLiBJdCBpbnZvbHZlcworICogZmlkZGxpbmcgd2l0aCB0aGUgYml0cyBpbiBjZXJ0YWluIG1peGVyIHJlZ2lzdGVycy4gZXNzX3Byb2JlIGlzIHN1cHBvc2VkCisgKiB0byBoZWxwLgorICoKKyAqIEZLUzogdHJhY2luZyBzaG93cyBlc3NfcHJvYmUgd3JpdGVzIHdyb25nIHZhbHVlIHRvIDB4NjQuIEJpdCAzIHJlYWRzIDEsIGJ1dAorICogc2hvdWxkIGJlIHdyaXR0ZW4gMCBvbmx5LiBDaGVjayB0aGlzLgorICovCitzdGF0aWMgaW50IGVzc19wcm9iZSAoc2JfZGV2YyAqIGRldmMsIGludCByZWcsIGludCB4b3J2YWwpCit7CisJaW50ICB2YWwxLCB2YWwyLCB2YWwzOworCisJdmFsMSA9IGVzc19nZXRtaXhlciAoZGV2YywgcmVnKTsKKwl2YWwyID0gdmFsMSBeIHhvcnZhbDsKKwllc3Nfc2V0bWl4ZXIgKGRldmMsIHJlZywgdmFsMik7CisJdmFsMyA9IGVzc19nZXRtaXhlciAoZGV2YywgcmVnKTsKKwllc3Nfc2V0bWl4ZXIgKGRldmMsIHJlZywgdmFsMSk7CisKKwlyZXR1cm4gKHZhbDIgPT0gdmFsMyk7Cit9CisKK2ludCBlc3NfaW5pdChzYl9kZXZjICogZGV2Yywgc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIGNoYXIgY2ZnOworCWludCBlc3NfbWFqb3IgPSAwLCBlc3NfbWlub3IgPSAwOworCWludCBpOworCXN0YXRpYyBjaGFyIG5hbWVbMTAwXSwgbW9kZWxuYW1lWzEwXTsKKworCS8qCisJICogVHJ5IHRvIGRldGVjdCBFU1MgY2hpcHMuCisJICovCisKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAweGU3KTsgLyogUmV0dXJuIGlkZW50aWZpY2F0aW9uICovCisKKwlmb3IgKGkgPSAxMDAwOyBpOyBpLS0pIHsKKwkJaWYgKGluYihEU1BfREFUQV9BVkFJTCkgJiAweDgwKSB7CisJCQlpZiAoZXNzX21ham9yID09IDApIHsKKwkJCQllc3NfbWFqb3IgPSBpbmIoRFNQX1JFQUQpOworCQkJfSBlbHNlIHsKKwkJCQllc3NfbWlub3IgPSBpbmIoRFNQX1JFQUQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGVzc19tYWpvciA9PSAwKSByZXR1cm4gMDsKKworCWlmIChlc3NfbWFqb3IgPT0gMHg0OCAmJiAoZXNzX21pbm9yICYgMHhmMCkgPT0gMHg4MCkgeworCQlzcHJpbnRmKG5hbWUsICJFU1MgRVM0ODggQXVkaW9Ecml2ZSAocmV2ICVkKSIsCisJCQllc3NfbWlub3IgJiAweDBmKTsKKwkJaHdfY29uZmlnLT5uYW1lID0gbmFtZTsKKwkJZGV2Yy0+bW9kZWwgPSBNRExfU0JQUk87CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogVGhpcyB0aGUgZGV0ZWN0aW9uIGhldXJpc3RpYyBvZiBFU1MgdGVjaG5vbG9neSwgdGhvdWdoIHNvbWV3aGF0CisJICogY2hhbmdlZCB0byBhY3R1YWxseSBtYWtlIGl0IHdvcmsuCisJICogVGhpcyByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgZGV0ZWN0aW9uIHN0ZXBzOgorCSAqIC0gZGlzdGluY3QgYmV0d2VlbiBFUzY4OCBhbmQgRVMxNjg4KyAoYXMgYWx3YXlzIGRvbmUgaW4gdGhpcyBkcml2ZXIpCisJICogICBpZiBFUzY4OCB3ZSdyZSByZWFkeQorCSAqIC0gdHJ5IHRvIGRldGVjdCBFUzE4NjgsIEVTMTg2OSBvciBFUzE4NzggKGVzc19pZGVudGlmeSkKKwkgKiAgIGlmIHN1Y2Nlc3NmdWwgd2UncmUgcmVhZHkKKwkgKiAtIHRyeSB0byBkZXRlY3QgRVMxODg4LCBFUzE4ODcgb3IgRVMxNzg4IChhaW06IGRldGVjdCBFUzE4ODcpCisJICogICBpZiBzdWNjZXNzZnVsIHdlJ3JlIHJlYWR5CisJICogLSBEdW5uby4gTXVzdCBiZSAxNjg4LiBXaWxsIGRvIGluIGdlbmVyYWwKKwkgKgorCSAqIFRoaXMgaXMgdGhlIG1vc3QgQkVUQSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZTogV2lsbCB0aGUgZGV0ZWN0aW9uCisJICogYWx3YXlzIHdvcms/CisJICovCisJZGV2Yy0+bW9kZWwgPSBNRExfRVNTOworCWRldmMtPnN1Ym1vZGVsID0gZXNzX21pbm9yICYgMHgwZjsKKworCWlmIChlc3NfbWFqb3IgPT0gMHg2OCAmJiAoZXNzX21pbm9yICYgMHhmMCkgPT0gMHg4MCkgeworCQljaGFyICpjaGlwID0gTlVMTDsKKwkJaW50IHN1Ym1vZGVsID0gLTE7CisKKwkJc3dpdGNoIChkZXZjLT5zYm1vLmVzc3R5cGUpIHsKKwkJY2FzZSBFU1NUWVBFX0RFVEVDVDoKKwkJY2FzZSBFU1NUWVBFX0xJS0UyMDoKKwkJCWJyZWFrOworCQljYXNlIDY4ODoKKwkJCXN1Ym1vZGVsID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIDE2ODg6CisJCQlzdWJtb2RlbCA9IDB4MDg7CisJCQlicmVhazsKKwkJY2FzZSAxODY4OgorCQkJc3VibW9kZWwgPSBTVUJNRExfRVMxODY4OworCQkJYnJlYWs7CisJCWNhc2UgMTg2OToKKwkJCXN1Ym1vZGVsID0gU1VCTURMX0VTMTg2OTsKKwkJCWJyZWFrOworCQljYXNlIDE3ODg6CisJCQlzdWJtb2RlbCA9IFNVQk1ETF9FUzE3ODg7CisJCQlicmVhazsKKwkJY2FzZSAxODc4OgorCQkJc3VibW9kZWwgPSBTVUJNRExfRVMxODc4OworCQkJYnJlYWs7CisJCWNhc2UgMTg3OToKKwkJCXN1Ym1vZGVsID0gU1VCTURMX0VTMTg3OTsKKwkJCWJyZWFrOworCQljYXNlIDE4ODc6CisJCQlzdWJtb2RlbCA9IFNVQk1ETF9FUzE4ODc7CisJCQlicmVhazsKKwkJY2FzZSAxODg4OgorCQkJc3VibW9kZWwgPSBTVUJNRExfRVMxODg4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsgKEtFUk5fRVJSICJJbnZhbGlkIGVzc3R5cGU9JWQgc3BlY2lmaWVkXG4iLCBkZXZjLT5zYm1vLmVzc3R5cGUpOworCQkJcmV0dXJuIDA7CisJCX07CisJCWlmIChzdWJtb2RlbCAhPSAtMSkgeworCQkJZGV2Yy0+c3VibW9kZWwgPSBzdWJtb2RlbDsKKwkJCXNwcmludGYgKG1vZGVsbmFtZSwgIkVTJWQiLCBkZXZjLT5zYm1vLmVzc3R5cGUpOworCQkJY2hpcCA9IG1vZGVsbmFtZTsKKwkJfTsKKwkJaWYgKGNoaXAgPT0gTlVMTCAmJiAoZXNzX21pbm9yICYgMHgwZikgPCA4KSB7CisJCQljaGlwID0gIkVTNjg4IjsKKwkJfTsKKyNpZmRlZiBGS1NfVEVTVAorRktTX3Rlc3QgKGRldmMpOworI2VuZGlmCisJCS8qCisJCSAqIElmIE5vdGhpbmcgZGV0ZWN0ZWQgeWV0LCBhbmQgd2Ugd2FudCAyLjAgYmVoYXZpb3VyLi4uCisJCSAqIFRoZW4gbGV0J3MgYXNzdW1lIGl0J3MgRVMxNjg4LgorCQkgKi8KKwkJaWYgKGNoaXAgPT0gTlVMTCAmJiBkZXZjLT5zYm1vLmVzc3R5cGUgPT0gRVNTVFlQRV9MSUtFMjApIHsKKwkJCWNoaXAgPSAiRVMxNjg4IjsKKwkJfTsKKworCQlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCQlpbnQgdHlwZTsKKworCQkJdHlwZSA9IGVzc19pZGVudGlmeSAoZGV2Yyk7CisKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSAweDE4Njg6CisJCQkJY2hpcCA9ICJFUzE4NjgiOworCQkJCWRldmMtPnN1Ym1vZGVsID0gU1VCTURMX0VTMTg2ODsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgxODY5OgorCQkJCWNoaXAgPSAiRVMxODY5IjsKKwkJCQlkZXZjLT5zdWJtb2RlbCA9IFNVQk1ETF9FUzE4Njk7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MTg3ODoKKwkJCQljaGlwID0gIkVTMTg3OCI7CisJCQkJZGV2Yy0+c3VibW9kZWwgPSBTVUJNRExfRVMxODc4OworCQkJCWJyZWFrOworCQkJY2FzZSAweDE4Nzk6CisJCQkJY2hpcCA9ICJFUzE4NzkiOworCQkJCWRldmMtPnN1Ym1vZGVsID0gU1VCTURMX0VTMTg3OTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKCh0eXBlICYgMHgwMGZmKSAhPSAoKHR5cGUgPj4gOCkgJiAweDAwZmYpKSB7CisJCQkJCXByaW50ayAoImVzc19pbml0OiBVbnJlY29nbml6ZWQgJTA0eFxuIiwgdHlwZSk7CisJCQkJfQorCQkJfTsKKwkJfTsKKyNpZiAwCisJCS8qCisJCSAqIHRoaXMgb25lIGZhaWxlZDoKKwkJICogdGhlIHByb2Jpbmcgb2YgYml0IDQgaXMgYW5vdGhlciB0aG91Z2h0OiBmcm9tIEVTMTc4OCBhbmQgdXAsIGFsbAorCQkgKiBjaGlwcyBzZWVtIHRvIGhhdmUgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2wuIEJpdCA0IGlzIHJlYWRvbmx5IHRvCisJCSAqIGNoZWNrIGlmIGEgaGFyZHdhcmUgdm9sdW1lIGludGVycnVwdCBoYXMgZmlyZWQuCisJCSAqIENhdXNlIEVTNjg4L0VTMTY4OCBkb24ndCBoYXZlIHRoaXMgZmVhdHVyZSwgYml0IDQgbWlnaHQgYmUgd3JpdGVhYmxlCisJCSAqIGZvciB0aGVzZSBjaGlwcy4KKwkJICovCisJCWlmIChjaGlwID09IE5VTEwgJiYgIWVzc19wcm9iZShkZXZjLCAweDY0LCAoMSA8PCA0KSkpIHsKKyNlbmRpZgorCQkvKgorCQkgKiB0aGUgcHJvYmluZyBvZiBiaXQgMiBpcyBteSBpZGVhLiBUaGUgRVMxODg3IGRvY3Mgd2FudCBtZSB0byBwcm9iZQorCQkgKiBiaXQgMy4gVGhpcyByZXN1bHRzIGluIEVTMTY4OCBiZWluZyBkZXRlY3RlZCBhcyBFUzE3ODguCisJCSAqIEJpdCAyIGlzIGZvciAiRW5hYmxlIEhXViBJUlFFIiwgYnV0IGFzIEVTKDEpNjg4IGNoaXBzIGRvbid0IGhhdmUKKwkJICogSGFyZFdhcmUgVm9sdW1lLCBJIHRoaW5rIHRoZXkgZG9uJ3QgaGF2ZSB0aGlzIElSUUUuCisJCSAqLworCQlpZiAoY2hpcCA9PSBOVUxMICYmIGVzc19wcm9iZShkZXZjLCAweDY0LCAoMSA8PCAyKSkpIHsKKwkJCWlmIChlc3NfcHJvYmUgKGRldmMsIDB4NzAsIDB4N2YpKSB7CisJCQkJaWYgKGVzc19wcm9iZSAoZGV2YywgMHg2NCwgKDEgPDwgNSkpKSB7CisJCQkJCWNoaXAgPSAiRVMxODg3IjsKKwkJCQkJZGV2Yy0+c3VibW9kZWwgPSBTVUJNRExfRVMxODg3OworCQkJCX0gZWxzZSB7CisJCQkJCWNoaXAgPSAiRVMxODg4IjsKKwkJCQkJZGV2Yy0+c3VibW9kZWwgPSBTVUJNRExfRVMxODg4OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY2hpcCA9ICJFUzE3ODgiOworCQkJCWRldmMtPnN1Ym1vZGVsID0gU1VCTURMX0VTMTc4ODsKKwkJCX0KKwkJfTsKKwkJaWYgKGNoaXAgPT0gTlVMTCkgeworCQkJY2hpcCA9ICJFUzE2ODgiOworCQl9OworCisJICAgIHByaW50ayAoIEtFUk5fSU5GTyAiRVNTIGNoaXAgJXMgJXMlc1xuIgorICAgICAgICAgICAgICAgLCBjaGlwCisgICAgICAgICAgICAgICAsICggZGV2Yy0+c2Jtby5lc3N0eXBlID09IEVTU1RZUEVfREVURUNUIHx8IGRldmMtPnNibW8uZXNzdHlwZSA9PSBFU1NUWVBFX0xJS0UyMAorICAgICAgICAgICAgICAgICA/ICJkZXRlY3RlZCIKKyAgICAgICAgICAgICAgICAgOiAic3BlY2lmaWVkIgorICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAsICggZGV2Yy0+c2Jtby5lc3N0eXBlID09IEVTU1RZUEVfTElLRTIwCisgICAgICAgICAgICAgICAgID8gIiAoa2VybmVsIDIuMCBjb21wYXRpYmxlKSIKKyAgICAgICAgICAgICAgICAgOiAiIgorICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICApOworCisJCXNwcmludGYobmFtZSwiRVNTICVzIEF1ZGlvRHJpdmUgKHJldiAlZCkiLCBjaGlwLCBlc3NfbWlub3IgJiAweDBmKTsKKwl9IGVsc2UgeworCQlzdHJjcHkobmFtZSwgIkphenoxNiIpOworCX0KKworCS8qIEFBUzogaW5mbyBzdG9sZW4gZnJvbSBBTFNBOiB0aGVzZSBib2FyZHMgaGF2ZSBkaWZmZXJlbnQgY2xvY2tzICovCisJc3dpdGNoKGRldmMtPnN1Ym1vZGVsKSB7CisvKiBBUFBBUkVOVExZIE5PVCAxODY5IEFORCAxODg3CisJCWNhc2UgU1VCTURMX0VTMTg2OToKKwkJY2FzZSBTVUJNRExfRVMxODg3OgorKi8JCQorCQljYXNlIFNVQk1ETF9FUzE4ODg6CisJCQlkZXZjLT5jYXBzIHw9IFNCX0NBUF9FUzE4WFhfUkFURTsKKwkJCWJyZWFrOworCX0KKworCWh3X2NvbmZpZy0+bmFtZSA9IG5hbWU7CisJLyogRktTOiBzYl9kc3BfcmVzZXQgdG8gZW5hYmxlIGV4dGVuZGVkIG1vZGU/Pz8/ICovCisJc2JfZHNwX3Jlc2V0KGRldmMpOyAvKiBUdXJuIG9uIGV4dGVuZGVkIG1vZGUgKi8KKworCS8qCisJICogIEVuYWJsZSBqb3lzdGljayBhbmQgT1BMMworCSAqLworCWNmZyA9IGVzc19nZXRtaXhlciAoZGV2YywgMHg0MCk7CisJZXNzX3NldG1peGVyIChkZXZjLCAweDQwLCBjZmcgfCAweDAzKTsKKwlpZiAoZGV2Yy0+c3VibW9kZWwgPj0gOCkgewkJLyogRVMxNjg4ICovCisJCWRldmMtPmNhcHMgfD0gU0JfTk9fTUlESTsgICAvKiBFUzE2ODggdXNlcyBNUFU0MDEgTUlESSBtb2RlICovCisJfQorCXNiX2RzcF9yZXNldCAoZGV2Yyk7CisKKwkvKgorCSAqIFRoaXMgaXMgaW1wb3J0YW50ISBJZiBpdCdzIG5vdCBkb25lLCB0aGUgSVJRIHByb2JlIGluIHNiX2RzcF9pbml0CisJICogbWF5IGZhaWwuCisJICovCisJcmV0dXJuIGVzc19zZXRfaXJxX2h3IChkZXZjKTsKK30KKworc3RhdGljIGludCBlc3Nfc2V0X2RtYV9odyhzYl9kZXZjICogZGV2YykKK3sKKwl1bnNpZ25lZCBjaGFyIGNmZywgZG1hX2JpdHMgPSAwLCBkbWExNl9iaXRzOworCWludCBkbWE7CisKKyNpZmRlZiBGS1NfTE9HR0lORworcHJpbnRrKEtFUk5fSU5GTyAiZXNzX3NldF9kbWFfaHc6IGRtYTg9JWQsZG1hMTY9JWQsZHVwPSVkXG4iCissIGRldmMtPmRtYTgsIGRldmMtPmRtYTE2LCBkZXZjLT5kdXBsZXgpOworI2VuZGlmCisKKwkvKgorCSAqIEZLUzogSXQgc2VlbXMgYXMgaWYgdGhpcyBkdXBsZXggZmxhZyBpc24ndCBzZXQgeWV0LiBDaGVjayBpdC4KKwkgKi8KKwlkbWEgPSBkZXZjLT5kbWE4OworCisJaWYgKGRtYSA+IDMgfHwgZG1hIDwgMCB8fCBkbWEgPT0gMikgeworCQlkbWFfYml0cyA9IDA7CisJCXByaW50ayhLRVJOX0VSUiAiRVNTMTY4ODogSW52YWxpZCBETUE4ICVkXG4iLCBkbWEpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBFeHRlbmRlZCBtb2RlIERNQSBlbmFibGUgKi8KKwkJY2ZnID0gMHg1MDsKKworCQlpZiAoZG1hID09IDMpIHsKKwkJCWRtYV9iaXRzID0gMzsKKwkJfSBlbHNlIHsKKwkJCWRtYV9iaXRzID0gZG1hICsgMTsKKwkJfQorCX0KKworCWlmICghZXNzX3dyaXRlIChkZXZjLCAweGIyLCBjZmcgfCAoZG1hX2JpdHMgPDwgMikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVNTMTY4ODogRmFpbGVkIHRvIHdyaXRlIHRvIERNQSBjb25maWcgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGV2Yy0+ZHVwbGV4KSB7CisJCWRtYSA9IGRldmMtPmRtYTE2OworCQlkbWExNl9iaXRzID0gMDsKKworCQlpZiAoZG1hID49IDApIHsKKwkJCXN3aXRjaCAoZG1hKSB7CisJCQljYXNlIDA6CisJCQkJZG1hX2JpdHMgPSAweDA0OworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWRtYV9iaXRzID0gMHgwNTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlkbWFfYml0cyA9IDB4MDY7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJZG1hX2JpdHMgICA9IDB4MDc7CisJCQkJZG1hMTZfYml0cyA9IDB4MjA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAiRVNTMTg4NzogSW52YWxpZCBETUExNiAlZFxuIiwgZG1hKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX07CisJCQllc3NfY2hnbWl4ZXIgKGRldmMsIDB4NzgsIDB4MjAsIGRtYTE2X2JpdHMpOworCQkJZXNzX2NoZ21peGVyIChkZXZjLCAweDdkLCAweDA3LCBkbWFfYml0cyk7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGlzIG9uZSBpcyBjYWxsZWQgZnJvbSBzYl9kc3BfaW5pdC4KKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogIDA6IEZhaWxlZAorICogIDE6IFN1Y2NlZWRlZCBvciBkb2Vzbid0IGFwcGx5IChub3QgU1VCTURMX0VTMTg4NykKKyAqLworaW50IGVzc19kc3BfaW5pdCAoc2JfZGV2YyAqZGV2Yywgc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCS8qCisJICogQ2FsbGVyIGFsc28gY2hlY2tzIHRoaXMsIGJ1dCBhbnl3YXkKKwkgKi8KKwlpZiAoZGV2Yy0+bW9kZWwgIT0gTURMX0VTUykgeworCQlwcmludGsgKEtFUk5fSU5GTyAiZXNzX2RzcF9pbml0IGZvciBub24gRVNTIGNoaXBcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLyoKKwkgKiBUaGlzIGZvciBFUzE4ODcgdG8gcnVuIEZ1bGwgRHVwbGV4LiBBY3R1YWxseSBFUzE4ODgKKwkgKiBpcyBhbGxvd2VkIHRvIGRvIHNvIHRvby4gSSBoYXZlIG5vIGlkZWEgeWV0IGlmIHRoaXMKKwkgKiB3aWxsIHdvcmsgZm9yIEVTMTg4OCBob3dldmVyLgorCSAqCisJICogRm9yIFNCMTYgaGF2aW5nIGJvdGggZG1hOCBhbmQgZG1hMTYgbWVhbnMgZW5hYmxlCisJICogRnVsbCBEdXBsZXguIExldCdzIHRyeSB0aGlzIGZvciBFUzE4ODcgdG9vCisJICoKKwkgKi8KKwlpZiAoZGV2Yy0+c3VibW9kZWwgPT0gU1VCTURMX0VTMTg4NykgeworCQlpZiAoaHdfY29uZmlnLT5kbWEyICE9IC0xKSB7CisJCQlkZXZjLT5kbWExNiA9IGh3X2NvbmZpZy0+ZG1hMjsKKwkJfQorCQkvKgorCQkgKiBkZXZjLT5kdXBsZXggaW5pdGlhbGl6YXRpb24gaXMgcHV0IGhlcmUsIGNhdXNlCisJCSAqIGVzc19zZXRfZG1hX2h3IG5lZWRzIGl0LgorCQkgKi8KKwkJaWYgKGRldmMtPmRtYTggIT0gZGV2Yy0+ZG1hMTYgJiYgZGV2Yy0+ZG1hMTYgIT0gLTEpIHsKKwkJCWRldmMtPmR1cGxleCA9IDE7CisJCX0KKwl9CisJaWYgKCFlc3Nfc2V0X2RtYV9odyAoZGV2YykpIHsKKwkJZnJlZV9pcnEoZGV2Yy0+aXJxLCBkZXZjKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkJCQkJCQkJCQkJKgorICoJCQkJCQkJCQlFU1MgbWl4ZXIJCQkJCQkJCSoKKyAqCQkJCQkJCQkJCQkJCQkJCQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVTNjg4X1JFQ09SRElOR19ERVZJQ0VTCVwKKwkJCSggU09VTkRfTUFTS19MSU5FCXwgU09VTkRfTUFTS19NSUMJfCBTT1VORF9NQVNLX0NECQkpCisjZGVmaW5lIEVTNjg4X01JWEVSX0RFVklDRVMJCVwKKwkJCSggU09VTkRfTUFTS19TWU5USAl8IFNPVU5EX01BU0tfUENNCXwgU09VTkRfTUFTS19MSU5FCVwKKwkJCXwgU09VTkRfTUFTS19NSUMJfCBTT1VORF9NQVNLX0NECQl8IFNPVU5EX01BU0tfVk9MVU1FCVwKKwkJCXwgU09VTkRfTUFTS19MSU5FMgl8IFNPVU5EX01BU0tfU1BFQUtFUgkJCQkJKQorCisjZGVmaW5lIEVTMTY4OF9SRUNPUkRJTkdfREVWSUNFUwlcCisJCQkoIEVTNjg4X1JFQ09SRElOR19ERVZJQ0VTCQkJCQkpCisjZGVmaW5lIEVTMTY4OF9NSVhFUl9ERVZJQ0VTCQlcCisJCQkoIEVTNjg4X01JWEVSX0RFVklDRVMgfCBTT1VORF9NQVNLX1JFQ0xFVgkpCisKKyNkZWZpbmUgRVMxODg3X1JFQ09SRElOR19ERVZJQ0VTCVwKKwkJCSggRVMxNjg4X1JFQ09SRElOR19ERVZJQ0VTIHwgU09VTkRfTUFTS19MSU5FMiB8IFNPVU5EX01BU0tfU1lOVEgpCisjZGVmaW5lIEVTMTg4N19NSVhFUl9ERVZJQ0VTCQlcCisJCQkoIEVTMTY4OF9NSVhFUl9ERVZJQ0VTCQkJCQkJCQkJCQkpCisKKy8qCisgKiBNaXhlciByZWdpc3RlcnMgb2YgRVMxODg3CisgKgorICogVGhlc2UgcmVnaXN0ZXJzIHNwZWNpZmljYWxseSB0YWtlIGNhcmUgb2YgcmVjb3JkaW5nIGxldmVscy4gVG8gbWFrZSB0aGUKKyAqIG1hcHBpbmcgZnJvbSBwbGF5YmFjayBkZXZpY2VzIHRvIHJlY29yZGluZyBkZXZpY2VzIGV2ZXJ5IHJlY29yZGluZworICogZGV2aWNlcyA9IHBsYXliYWNrIGRldmljZSArIEVTX1JFQ19NSVhFUl9SRUNESUZGCisgKi8KKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ0JBU0UJKFNPVU5EX01JWEVSX0xJTkUzICsgMSkKKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ0RJRkYJKEVTX1JFQ19NSVhFUl9SRUNCQVNFIC0gU09VTkRfTUlYRVJfU1lOVEgpCisKKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ1NZTlRICShTT1VORF9NSVhFUl9TWU5USAkgKyBFU19SRUNfTUlYRVJfUkVDRElGRikKKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ1BDTQkJKFNPVU5EX01JWEVSX1BDTQkgKyBFU19SRUNfTUlYRVJfUkVDRElGRikKKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ1NQRUFLRVIJKFNPVU5EX01JWEVSX1NQRUFLRVIgKyBFU19SRUNfTUlYRVJfUkVDRElGRikKKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ0xJTkUJKFNPVU5EX01JWEVSX0xJTkUJICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYpCisjZGVmaW5lIEVTX1JFQ19NSVhFUl9SRUNNSUMJCShTT1VORF9NSVhFUl9NSUMJICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYpCisjZGVmaW5lIEVTX1JFQ19NSVhFUl9SRUNDRAkJKFNPVU5EX01JWEVSX0NECQkgKyBFU19SRUNfTUlYRVJfUkVDRElGRikKKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ0lNSVgJKFNPVU5EX01JWEVSX0lNSVgJICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYpCisjZGVmaW5lIEVTX1JFQ19NSVhFUl9SRUNBTFRQQ00JKFNPVU5EX01JWEVSX0FMVFBDTQkgKyBFU19SRUNfTUlYRVJfUkVDRElGRikKKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ1JFQ0xFVgkoU09VTkRfTUlYRVJfUkVDTEVWCSArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDSUdBSU4JKFNPVU5EX01JWEVSX0lHQUlOCSArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDT0dBSU4JKFNPVU5EX01JWEVSX09HQUlOCSArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDTElORTEJKFNPVU5EX01JWEVSX0xJTkUxCSArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDTElORTIJKFNPVU5EX01JWEVSX0xJTkUyCSArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDTElORTMJKFNPVU5EX01JWEVSX0xJTkUzCSArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorCitzdGF0aWMgbWl4ZXJfdGFiIGVzNjg4X21peCA9IHsKK01JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkJCTB4MzIsIDcsIDQsIDB4MzIsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9UUkVCTEUsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkJCTB4MzYsIDcsIDQsIDB4MzYsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCQkJMHgxNCwgNywgNCwgMHgxNCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NQRUFLRVIsCQkweDNjLCAyLCAzLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORSwJCQkweDNlLCA3LCA0LCAweDNlLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkJCTB4MWEsIDcsIDQsIDB4MWEsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9DRCwJCQkJMHgzOCwgNywgNCwgMHgzOCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lNSVgsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfUkVDTEVWLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9JR0FJTiwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUxLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMiwJCQkweDNhLCA3LCA0LCAweDNhLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCkKK307CisKKy8qCisgKiBUaGUgRVMxNjg4IHNwZWNpZmljcy4uLiBob3BlZnVsbHkgY29ycmVjdC4uLgorICogLSA2IGJpdCBtYXN0ZXIgdm9sdW1lCisgKiAgIEkgd2FzIHdyb25nLCBFUzE4ODggZG9jcyBzYXkgRVMxNjg4IGRpZG4ndCBoYXZlIGl0LgorICogLSBSRUNMRVYgY29udHJvbAorICogVGhlc2UgbWF5IGFwcGx5IHRvIEVTNjg4IHRvby4gSSBoYXZlIG5vIGlkZWEuCisgKi8KK3N0YXRpYyBtaXhlcl90YWIgZXMxNjg4X21peCA9IHsKK01JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkJCTB4MzIsIDcsIDQsIDB4MzIsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9UUkVCTEUsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkJCTB4MzYsIDcsIDQsIDB4MzYsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCQkJMHgxNCwgNywgNCwgMHgxNCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NQRUFLRVIsCQkweDNjLCAyLCAzLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORSwJCQkweDNlLCA3LCA0LCAweDNlLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkJCTB4MWEsIDcsIDQsIDB4MWEsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9DRCwJCQkJMHgzOCwgNywgNCwgMHgzOCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lNSVgsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfUkVDTEVWLAkJCTB4YjQsIDcsIDQsIDB4YjQsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9JR0FJTiwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUxLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMiwJCQkweDNhLCA3LCA0LCAweDNhLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCkKK307CisKK3N0YXRpYyBtaXhlcl90YWIgZXMxNjg4bGF0ZXJfbWl4ID0geworTUlYX0VOVChTT1VORF9NSVhFUl9WT0xVTUUsCQkJMHg2MCwgNSwgNiwgMHg2MiwgNSwgNiksCitNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1RSRUJMRSwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1lOVEgsCQkJMHgzNiwgNywgNCwgMHgzNiwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJCQkweDE0LCA3LCA0LCAweDE0LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1BFQUtFUiwJCTB4M2MsIDIsIDMsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FLAkJCTB4M2UsIDcsIDQsIDB4M2UsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9NSUMsCQkJMHgxYSwgNywgNCwgMHgxYSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJCQkweDM4LCA3LCA0LCAweDM4LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQUxUUENNLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCQkJMHhiNCwgNywgNCwgMHhiNCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9PR0FJTiwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUyLAkJCTB4M2EsIDcsIDQsIDB4M2EsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMywJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKQorfTsKKworLyoKKyAqIFRoaXMgb25lIGlzIGZvciBhbGwgRVNTIGNoaXBzIHdpdGggYSByZWNvcmQgbWl4ZXIuCisgKiBJdCdzIG5vdCB1c2VkICh5ZXQpIGhvd2V2ZXIKKyAqLworc3RhdGljIG1peGVyX3RhYiBlc19yZWNfbWl4ID0geworTUlYX0VOVChTT1VORF9NSVhFUl9WT0xVTUUsCQkJMHg2MCwgNSwgNiwgMHg2MiwgNSwgNiksCitNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1RSRUJMRSwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1lOVEgsCQkJMHgzNiwgNywgNCwgMHgzNiwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJCQkweDE0LCA3LCA0LCAweDE0LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1BFQUtFUiwJCTB4M2MsIDIsIDMsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FLAkJCTB4M2UsIDcsIDQsIDB4M2UsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9NSUMsCQkJMHgxYSwgNywgNCwgMHgxYSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJCQkweDM4LCA3LCA0LCAweDM4LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQUxUUENNLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCQkJMHhiNCwgNywgNCwgMHhiNCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9PR0FJTiwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUyLAkJCTB4M2EsIDcsIDQsIDB4M2EsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMywJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ1NZTlRILAkJMHg2YiwgNywgNCwgMHg2YiwgMywgNCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNQQ00sCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ1NQRUFLRVIsCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDTElORSwJCTB4NmUsIDcsIDQsIDB4NmUsIDMsIDQpLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDTUlDLAkJMHg2OCwgNywgNCwgMHg2OCwgMywgNCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNDRCwJCQkweDZhLCA3LCA0LCAweDZhLCAzLCA0KSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0lNSVgsCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0FMVFBDTSwJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDUkVDTEVWLAkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNJR0FJTiwJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDT0dBSU4sCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0xJTkUxLAkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNMSU5FMiwJCTB4NmMsIDcsIDQsIDB4NmMsIDMsIDQpLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDTElORTMsCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKQorfTsKKworLyoKKyAqIFRoaXMgb25lIGlzIGZvciBFUzE4ODcuIEl0J3MgbGl0dGxlIGRpZmZlcmVudCBmcm9tIGVzX3JlY19taXg6IGl0CisgKiBoYXMgMHg3YyBmb3IgUENNIHBsYXliYWNrIGxldmVsLiBUaGlzIGlzIGJlY2F1c2UgRVMxODg3IHVzZXMKKyAqIEF1ZGlvIDIgZm9yIHBsYXliYWNrLgorICovCitzdGF0aWMgbWl4ZXJfdGFiIGVzMTg4N19taXggPSB7CitNSVhfRU5UKFNPVU5EX01JWEVSX1ZPTFVNRSwJCQkweDYwLCA1LCA2LCAweDYyLCA1LCA2KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQkFTUywJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9TWU5USCwJCQkweDM2LCA3LCA0LCAweDM2LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfUENNLAkJCTB4N2MsIDcsIDQsIDB4N2MsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkJMHgzYywgMiwgMywgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCQkJMHgzZSwgNywgNCwgMHgzZSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX01JQywJCQkweDFhLCA3LCA0LCAweDFhLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQ0QsCQkJCTB4MzgsIDcsIDQsIDB4MzgsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9JTUlYLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9BTFRQQ00sCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1JFQ0xFViwJCQkweGI0LCA3LCA0LCAweGI0LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX09HQUlOLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMSwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTIsCQkJMHgzYSwgNywgNCwgMHgzYSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUzLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDU1lOVEgsCQkweDZiLCA3LCA0LCAweDZiLCAzLCA0KSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ1BDTSwJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDU1BFQUtFUiwJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNMSU5FLAkJMHg2ZSwgNywgNCwgMHg2ZSwgMywgNCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNNSUMsCQkweDY4LCA3LCA0LCAweDY4LCAzLCA0KSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0NELAkJCTB4NmEsIDcsIDQsIDB4NmEsIDMsIDQpLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDSU1JWCwJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDQUxUUENNLAkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNSRUNMRVYsCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0lHQUlOLAkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNPR0FJTiwJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDTElORTEsCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0xJTkUyLAkJMHg2YywgNywgNCwgMHg2YywgMywgNCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNMSU5FMywJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApCit9OworCitzdGF0aWMgaW50IGVzc19oYXNfcmVjX21peGVyIChpbnQgc3VibW9kZWwpCit7CisJc3dpdGNoIChzdWJtb2RlbCkgeworCWNhc2UgU1VCTURMX0VTMTg4NzoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfTsKK307CisKKyNpZmRlZiBGS1NfTE9HR0lORworc3RhdGljIGludCBlc3NfbWl4ZXJfbW9uX3JlZ3NbXQorCT0geyAweDcwLCAweDcxLCAweDcyLCAweDc0LCAweDc2LCAweDc4LCAweDdhLCAweDdjLCAweDdkLCAweDdmCisJICAsIDB4YTEsIDB4YTIsIDB4YTQsIDB4YTUsIDB4YTgsIDB4YTkKKwkgICwgMHhiMSwgMHhiMiwgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOQorCSAgLCAweDAwfTsKKworc3RhdGljIHZvaWQgZXNzX3Nob3dfbWl4ZXJyZWdzIChzYl9kZXZjICpkZXZjKQoreworCWludCAqbXAgPSBlc3NfbWl4ZXJfbW9uX3JlZ3M7CisKK3JldHVybjsKKworCXdoaWxlICgqbXAgIT0gMCkgeworCQlwcmludGsgKEtFUk5fSU5GTyAicmVzICgleCk9JXhcbiIsICptcCwgKGludCkoZXNzX2dldG1peGVyIChkZXZjLCAqbXApKSk7CisJCW1wKys7CisJfQorfQorI2VuZGlmCisKK3ZvaWQgZXNzX3NldG1peGVyIChzYl9kZXZjICogZGV2YywgdW5zaWduZWQgaW50IHBvcnQsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgRktTX0xPR0dJTkcKK3ByaW50ayhLRVJOX0lORk8gIkZLUzogd3JpdGUgbWl4ZXIgJXg6ICV4XG4iLCBwb3J0LCB2YWx1ZSk7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJaWYgKHBvcnQgPj0gMHhhMCkgeworCQllc3Nfd3JpdGUgKGRldmMsIHBvcnQsIHZhbHVlKTsKKwl9IGVsc2UgeworCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKHBvcnQgJiAweGZmKSksIE1JWEVSX0FERFIpOworCisJCXVkZWxheSgyMCk7CisJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAodmFsdWUgJiAweGZmKSksIE1JWEVSX0RBVEEpOworCQl1ZGVsYXkoMjApOworCX07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworfQorCit1bnNpZ25lZCBpbnQgZXNzX2dldG1peGVyIChzYl9kZXZjICogZGV2YywgdW5zaWduZWQgaW50IHBvcnQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChwb3J0ID49IDB4YTApIHsKKwkJdmFsID0gZXNzX3JlYWQgKGRldmMsIHBvcnQpOworCX0gZWxzZSB7CisJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAocG9ydCAmIDB4ZmYpKSwgTUlYRVJfQUREUik7CisKKwkJdWRlbGF5KDIwKTsKKwkJdmFsID0gaW5iKE1JWEVSX0RBVEEpOworCQl1ZGVsYXkoMjApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBlc3NfY2hnbWl4ZXIKKwkoc2JfZGV2YyAqIGRldmMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWludCB2YWx1ZTsKKworCXZhbHVlID0gZXNzX2dldG1peGVyIChkZXZjLCByZWcpOworCXZhbHVlID0gKHZhbHVlICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOworCWVzc19zZXRtaXhlciAoZGV2YywgcmVnLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBlc3NfbWl4ZXJfaW5pdCBtdXN0IGJlIGNhbGxlZCBmcm9tIHNiX21peGVyX2luaXQKKyAqLwordm9pZCBlc3NfbWl4ZXJfaW5pdCAoc2JfZGV2YyAqIGRldmMpCit7CisJZGV2Yy0+bWl4ZXJfY2FwcyA9IFNPVU5EX0NBUF9FWENMX0lOUFVUOworCisJLyoKKwkqIFRha2UgY2FyZSBvZiBFUzE4ODcgc3BlY2lmaWNzLi4uCisJKi8KKwlzd2l0Y2ggKGRldmMtPnN1Ym1vZGVsKSB7CisJY2FzZSBTVUJNRExfRVMxODg3OgorCQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcwkJPSBFUzE4ODdfTUlYRVJfREVWSUNFUzsKKwkJZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzCT0gRVMxODg3X1JFQ09SRElOR19ERVZJQ0VTOworI2lmZGVmIEZLU19MT0dHSU5HCitwcmludGsgKEtFUk5fSU5GTyAiRktTOiBlc3NfbWl4ZXJfaW5pdCBkdXAgPSAlZFxuIiwgZGV2Yy0+ZHVwbGV4KTsKKyNlbmRpZgorCQlpZiAoZGV2Yy0+ZHVwbGV4KSB7CisJCQlkZXZjLT5pb21hcAkJCQk9ICZlczE4ODdfbWl4OworCQkJZGV2Yy0+aW9tYXBfc3ogICAgICAgICAgICAgICAgICAgICAgICAgID0gQVJSQVlfU0laRShlczE4ODdfbWl4KTsKKwkJfSBlbHNlIHsKKwkJCWRldmMtPmlvbWFwCQkJCT0gJmVzX3JlY19taXg7CisJCQlkZXZjLT5pb21hcF9zeiAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBUlJBWV9TSVpFKGVzX3JlY19taXgpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChkZXZjLT5zdWJtb2RlbCA8IDgpIHsKKwkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzCQk9IEVTNjg4X01JWEVSX0RFVklDRVM7CisJCQlkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMJPSBFUzY4OF9SRUNPUkRJTkdfREVWSUNFUzsKKwkJCWRldmMtPmlvbWFwCQkJCQk9ICZlczY4OF9taXg7CisJCQlkZXZjLT5pb21hcF9zeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFSUkFZX1NJWkUoZXM2ODhfbWl4KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBlczE2ODggaGFzIDQgYml0cyBtYXN0ZXIgdm9sLgorCQkJICogbGF0ZXIgY2hpcHMgaGF2ZSA2IGJpdHMgKD8pCisJCQkgKi8KKwkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzCQk9IEVTMTY4OF9NSVhFUl9ERVZJQ0VTOworCQkJZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzCT0gRVMxNjg4X1JFQ09SRElOR19ERVZJQ0VTOworCQkJaWYgKGRldmMtPnN1Ym1vZGVsIDwgMHgxMCkgeworCQkJCWRldmMtPmlvbWFwCQkJCT0gJmVzMTY4OF9taXg7CisJCQkJZGV2Yy0+aW9tYXBfc3ogICAgICAgICAgICAgICAgICAgICAgICAgID0gQVJSQVlfU0laRShlczY4OF9taXgpOworCQkJfSBlbHNlIHsKKwkJCQlkZXZjLT5pb21hcAkJCQk9ICZlczE2ODhsYXRlcl9taXg7CisJCQkJZGV2Yy0+aW9tYXBfc3ogICAgICAgICAgICAgICAgICAgICAgICAgID0gQVJSQVlfU0laRShlczE2ODhsYXRlcl9taXgpOworCQkJfQorCQl9CisJfQorfQorCisvKgorICogQ2hhbmdpbmcgcGxheWJhY2sgbGV2ZWxzIGF0IGFuIEVTUyBjaGlwIHdpdGggcmVjb3JkIG1peGVyIG1lYW5zIGhhdmluZyB0bworICogdGFrZSBjYXJlIG9mIHJlY29yZGluZyBsZXZlbHMgb2YgcmVjb3JkZWQgaW5wdXRzIChkZXZjLT5yZWNtYXNrKSB0b28hCisgKi8KK2ludCBlc3NfbWl4ZXJfc2V0KHNiX2RldmMgKmRldmMsIGludCBkZXYsIGludCBsZWZ0LCBpbnQgcmlnaHQpCit7CisJaWYgKGVzc19oYXNfcmVjX21peGVyIChkZXZjLT5zdWJtb2RlbCkgJiYgKGRldmMtPnJlY21hc2sgJiAoMSA8PCBkZXYpKSkgeworCQlzYl9jb21tb25fbWl4ZXJfc2V0IChkZXZjLCBkZXYgKyBFU19SRUNfTUlYRVJfUkVDRElGRiwgbGVmdCwgcmlnaHQpOworCX0KKwlyZXR1cm4gc2JfY29tbW9uX21peGVyX3NldCAoZGV2YywgZGV2LCBsZWZ0LCByaWdodCk7Cit9CisKKy8qCisgKiBBZnRlciBhIHNiX2RzcF9yZXNldCBleHRlbmRlZCByZWdpc3RlciAweGI0IChSRUNMRVYpIGlzIHJlc2V0IHRvby4gQWZ0ZXIKKyAqIHNiX2RzcF9yZXNldCBSRUNMRVYgaGFzIHRvIGJlIHJlc3RvcmVkLiBUaGlzIGlzIHdoZXJlIGVzc19taXhlcl9yZWxvYWQKKyAqIGhlbHBzLgorICovCit2b2lkIGVzc19taXhlcl9yZWxvYWQgKHNiX2RldmMgKmRldmMsIGludCBkZXYpCit7CisJaW50IGxlZnQsIHJpZ2h0LCB2YWx1ZTsKKworCXZhbHVlID0gZGV2Yy0+bGV2ZWxzW2Rldl07CisJbGVmdCAgPSB2YWx1ZSAmIDB4MDAwMDAwZmY7CisJcmlnaHQgPSAodmFsdWUgJiAweDAwMDBmZjAwKSA+PiA4OworCisJc2JfY29tbW9uX21peGVyX3NldChkZXZjLCBkZXYsIGxlZnQsIHJpZ2h0KTsKK30KKworc3RhdGljIGludCBlc19yZWNfc2V0X3JlY21hc2soc2JfZGV2YyAqIGRldmMsIGludCBtYXNrKQoreworCWludCBpLCBpX21hc2ssIGN1cl9tYXNrLCBkaWZmX21hc2s7CisJaW50IHZhbHVlLCBsZWZ0LCByaWdodDsKKworI2lmZGVmIEZLU19MT0dHSU5HCitwcmludGsgKEtFUk5fSU5GTyAiRktTOiBlc19yZWNfc2V0X3JlY21hc2sgbWFzayA9ICV4XG4iLCBtYXNrKTsKKyNlbmRpZgorCS8qCisJICogQ2hhbmdpbmcgdGhlIHJlY21hc2sgb24gYW4gRVNTIGNoaXAgd2l0aCByZWNvcmRpbmcgbWl4ZXIgbWVhbnM6CisJICogKDEpIEZpbmQgdGhlIGRpZmZlcmVuY2VzCisJICogKDIpIEZvciAidHVybmVkLW9uIiAgaW5wdXRzOiBtYWtlIHRoZSByZWNvcmRpbmcgbGV2ZWwgdGhlIHBsYXliYWNrIGxldmVsCisJICogKDMpIEZvciAidHVybmVkLW9mZiIgaW5wdXRzOiBtYWtlIHRoZSByZWNvcmRpbmcgbGV2ZWwgemVybworCSAqLworCWN1cl9tYXNrICA9IGRldmMtPnJlY21hc2s7CisJZGlmZl9tYXNrID0gKGN1cl9tYXNrIF4gbWFzayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlpX21hc2sgPSAoMSA8PCBpKTsKKwkJaWYgKGRpZmZfbWFzayAmIGlfbWFzaykgewkvKiBEaWZmZXJlbmNlPyAoMSkgICovCisJCQlpZiAobWFzayAmIGlfbWFzaykgewkvKiBUdXJuIGl0IG9uICAoMikgICovCisJCQkJdmFsdWUgPSBkZXZjLT5sZXZlbHNbaV07CisJCQkJbGVmdCAgPSB2YWx1ZSAmIDB4MDAwMDAwZmY7CisJCQkJcmlnaHQgPSAodmFsdWUgJiAweDAwMDBmZjAwKSA+PiA4OworCQkJfSBlbHNlIHsJCQkJLyogVHVybiBpdCBvZmYgKDMpICAqLworCQkJCWxlZnQgID0gMDsKKwkJCQlsZWZ0ICA9IDA7CisJCQkJcmlnaHQgPSAwOworCQkJfQorCQkJc2JfY29tbW9uX21peGVyX3NldChkZXZjLCBpICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYsIGxlZnQsIHJpZ2h0KTsKKwkJfQorCX0KKwlyZXR1cm4gbWFzazsKK30KKworaW50IGVzc19zZXRfcmVjbWFzayhzYl9kZXZjICogZGV2YywgaW50ICptYXNrKQoreworCS8qIFRoaXMgYXBwbGllcyB0byBFU1MgY2hpcHMgd2l0aCByZWNvcmQgbWl4ZXJzIG9ubHkhICovCisKKwlpZiAoZXNzX2hhc19yZWNfbWl4ZXIgKGRldmMtPnN1Ym1vZGVsKSkgeworCQkqbWFzawk9IGVzX3JlY19zZXRfcmVjbWFzayAoZGV2YywgKm1hc2spOworCQlyZXR1cm4gMTsJCQkJCQkJCQkvKiBBcHBsaWVkCQkqLworCX0gZWxzZSB7CisJCXJldHVybiAwOwkJCQkJCQkJCS8qIE5vdCBhcHBsaWVkCSovCisJfQorfQorCisvKgorICogZXNzX21peGVyX3Jlc2V0IG11c3QgYmUgY2FsbGVkIGZyb20gc2JfbWl4ZXJfcmVzZXQKKyAqLworaW50IGVzc19taXhlcl9yZXNldCAoc2JfZGV2YyAqIGRldmMpCit7CisJLyoKKwkgKiBTZXBhcmF0ZSBhY3Rpb25zIGZvciBFU1MgY2hpcHMgd2l0aCBhIHJlY29yZCBtaXhlcjoKKwkgKi8KKwlpZiAoZXNzX2hhc19yZWNfbWl4ZXIgKGRldmMtPnN1Ym1vZGVsKSkgeworCQlzd2l0Y2ggKGRldmMtPnN1Ym1vZGVsKSB7CisJCWNhc2UgU1VCTURMX0VTMTg4NzoKKwkJCS8qCisJCQkgKiBTZXBhcmF0ZSBhY3Rpb25zIGZvciBFUzE4ODc6CisJCQkgKiBDaGFuZ2UgcmVnaXN0ZXJzIDdhIGFuZCAxYyB0byBtYWtlIHRoZSByZWNvcmQgbWl4ZXIgdGhlCisJCQkgKiBhY3R1YWwgcmVjb3JkaW5nIHNvdXJjZS4KKwkJCSAqLworCQkJZXNzX2NoZ21peGVyKGRldmMsIDB4N2EsIDB4MTgsIDB4MDgpOworCQkJZXNzX2NoZ21peGVyKGRldmMsIDB4MWMsIDB4MDcsIDB4MDcpOworCQkJYnJlYWs7CisJCX07CisJCS8qCisJCSAqIENhbGwgc2V0X3JlY21hc2sgZm9yIHByb3BlciBpbml0aWFsaXphdGlvbgorCQkgKi8KKwkJZGV2Yy0+cmVjbWFzayA9IGRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlczsKKwkJZXNfcmVjX3NldF9yZWNtYXNrKGRldmMsIDApOworCQlkZXZjLT5yZWNtYXNrID0gMDsKKworCQlyZXR1cm4gMTsJLyogV2UgdG9vayBjYXJlIG9mIHJlY21hc2suCQkJCSovCisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CS8qIFdlIGRpZG4ndCB0YWtlIGNhcmU7IGNhbGxlciBkbyBpdAkqLworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQkJCQkJCQkJCQkJCQkJCSoKKyAqCQkJCQkJCQlFU1MgbWlkaQkJCQkJCQkJCSoKKyAqCQkJCQkJCQkJCQkJCQkJCQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRktTOiBJUlEgbWF5IGJlIHNoYXJlZC4gSG0uIEFuZCBpZiBzbz8gVGhlbiBXaGF0PworICovCitpbnQgZXNzX21pZGlfaW5pdChzYl9kZXZjICogZGV2Yywgc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIGNoYXIgICBjZmcsIHRtcDsKKworCWNmZyA9IGVzc19nZXRtaXhlciAoZGV2YywgMHg0MCkgJiAweDAzOworCisJaWYgKGRldmMtPnN1Ym1vZGVsIDwgOCkgeworCQllc3Nfc2V0bWl4ZXIgKGRldmMsIDB4NDAsIGNmZyB8IDB4MDMpOwkvKiBFbmFibGUgT1BMMyAmIGpveXN0aWNrICovCisJCXJldHVybiAwOyAgCQkJCQkgLyogRVM2ODggZG9lc24ndCBzdXBwb3J0IE1QVTQwMSBtb2RlICovCisJfQorCXRtcCA9IChod19jb25maWctPmlvX2Jhc2UgJiAweDBmMCkgPj4gNDsKKworCWlmICh0bXAgPiAzKSB7CisJCWVzc19zZXRtaXhlciAoZGV2YywgMHg0MCwgY2ZnKTsKKwkJcmV0dXJuIDA7CisJfQorCWNmZyB8PSB0bXAgPDwgMzsKKworCXRtcCA9IDE7CQkvKiBNUFUgZW5hYmxlZCB3aXRob3V0IGludGVycnVwdHMgKi8KKworCS8qIE1heSBiZSBzaGFyZWQ6IGlmIHNvIHRoZSB2YWx1ZSBpcyAtdmUgKi8KKworCXN3aXRjaCAoYWJzKGh3X2NvbmZpZy0+aXJxKSkgeworCQljYXNlIDk6CisJCQl0bXAgPSAweDQ7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJdG1wID0gMHg1OworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCXRtcCA9IDB4NjsKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJdG1wID0gMHg3OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9CisKKwljZmcgfD0gdG1wIDw8IDU7CisJZXNzX3NldG1peGVyIChkZXZjLCAweDQwLCBjZmcgfCAweDAzKTsKKworCXJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2JfZXNzLmggYi9zb3VuZC9vc3Mvc2JfZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhYTA3MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zYl9lc3MuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ3JlYXRlZDogOS1KYW4tMTk5OSBSb2xmIEZva2tlbnMKKyAqLworCitleHRlcm4gdm9pZCBlc3NfaW50cgorCQkoc2JfZGV2YyAqZGV2Yyk7CitleHRlcm4gaW50IGVzc19kc3BfaW5pdAorCQkoc2JfZGV2YyAqZGV2Yywgc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKTsKKworZXh0ZXJuIHN0cnVjdCBhdWRpb19kcml2ZXIgKmVzc19hdWRpb19pbml0CisJCShzYl9kZXZjICpkZXZjLCBpbnQgKmF1ZGlvX2ZsYWdzLCBpbnQgKmZvcm1hdF9tYXNrKTsKK2V4dGVybiBpbnQgZXNzX21pZGlfaW5pdAorCQkoc2JfZGV2YyAqZGV2Yywgc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKTsKK2V4dGVybiB2b2lkIGVzc19taXhlcl9pbml0CisJCShzYl9kZXZjICpkZXZjKTsKKworZXh0ZXJuIGludCBlc3NfaW5pdAorCQkoc2JfZGV2YyAqZGV2Yywgc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKTsKK2V4dGVybiBpbnQgZXNzX2RzcF9yZXNldAorCQkoc2JfZGV2YyAqZGV2Yyk7CisKK2V4dGVybiB2b2lkIGVzc19zZXRtaXhlcgorCQkoc2JfZGV2YyAqZGV2YywgdW5zaWduZWQgaW50IHBvcnQsIHVuc2lnbmVkIGludCB2YWx1ZSk7CitleHRlcm4gdW5zaWduZWQgaW50IGVzc19nZXRtaXhlcgorCQkoc2JfZGV2YyAqZGV2YywgdW5zaWduZWQgaW50IHBvcnQpOworZXh0ZXJuIGludCBlc3NfbWl4ZXJfc2V0CisJCShzYl9kZXZjICpkZXZjLCBpbnQgZGV2LCBpbnQgbGVmdCwgaW50IHJpZ2h0KTsKK2V4dGVybiBpbnQgZXNzX21peGVyX3Jlc2V0CisJCShzYl9kZXZjICpkZXZjKTsKK2V4dGVybiB2b2lkIGVzc19taXhlcl9yZWxvYWQKKwkJKHNiX2RldmMgKiBkZXZjLCBpbnQgZGV2KTsKK2V4dGVybiBpbnQgZXNzX3NldF9yZWNtYXNrCisJCShzYl9kZXZjICpkZXZjLCBpbnQgKm1hc2spOworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2JfbWlkaS5jIGIvc291bmQvb3NzL3NiX21pZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDNiZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NiX21pZGkuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIHNvdW5kL3NiX2RzcC5jCisgKgorICogVGhlIGxvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSBTb3VuZCBCbGFzdGVyIERTIGNoaXBzLgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAic2IuaCIKKyN1bmRlZiBTQl9URVNUX0lSUQorCisvKgorICogVGhlIERTUCBjaGFubmVsIGNhbiBiZSB1c2VkIGVpdGhlciBmb3IgaW5wdXQgb3Igb3V0cHV0LiBWYXJpYWJsZQorICogJ3NiX2lycV9tb2RlJyB3aWxsIGJlIHNldCB3aGVuIHRoZSBwcm9ncmFtIGNhbGxzIHJlYWQgb3Igd3JpdGUgZmlyc3QgdGltZQorICogYWZ0ZXIgb3Blbi4gQ3VycmVudCB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCBtb2RlIGNoYW5nZXMgd2l0aG91dCBjbG9zaW5nCisgKiBhbmQgcmVvcGVuaW5nIHRoZSBkZXZpY2UuIFN1cHBvcnQgZm9yIHRoaXMgZmVhdHVyZSBtYXkgYmUgaW1wbGVtZW50ZWQgaW4gYQorICogZnV0dXJlIHZlcnNpb24gb2YgdGhpcyBkcml2ZXIuCisgKi8KKworCitzdGF0aWMgaW50IHNiX21pZGlfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSwKKwkgICAgIHZvaWQgICAgICAgICAgICAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKKwkgICAgIHZvaWQgICAgICAgICAgICAoKm91dHB1dCkgKGludCBkZXYpCispCit7CisJc2JfZGV2YyAqZGV2YyA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGV2YyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOWElPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZGV2Yy0+b3BlbmVkKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlkZXZjLT5vcGVuZWQgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCWRldmMtPmlycV9tb2RlID0gSU1PREVfTUlESTsKKwlkZXZjLT5taWRpX2Jyb2tlbiA9IDA7CisKKwlzYl9kc3BfcmVzZXQoZGV2Yyk7CisKKwlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIDB4MzUpKQkvKiBTdGFydCBNSURJIFVBUlQgbW9kZSAqLworCXsKKwkJICBkZXZjLT5vcGVuZWQgPSAwOworCQkgIHJldHVybiAtRUlPOworCX0KKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7CisKKwlpZiAobW9kZSAmIE9QRU5fUkVBRCkKKwl7CisJCWRldmMtPmlucHV0X29wZW5lZCA9IDE7CisJCWRldmMtPm1pZGlfaW5wdXRfaW50ciA9IGlucHV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2JfbWlkaV9jbG9zZShpbnQgZGV2KQoreworCXNiX2RldmMgKmRldmMgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRldmMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlzYl9kc3BfcmVzZXQoZGV2Yyk7CisJZGV2Yy0+aW50cl9hY3RpdmUgPSAwOworCWRldmMtPmlucHV0X29wZW5lZCA9IDA7CisJZGV2Yy0+b3BlbmVkID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc2JfbWlkaV9vdXQoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCit7CisJc2JfZGV2YyAqZGV2YyA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGRldmMgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZGV2Yy0+bWlkaV9icm9rZW4pCisJCXJldHVybiAxOworCisJaWYgKCFzYl9kc3BfY29tbWFuZChkZXZjLCBtaWRpX2J5dGUpKQorCXsKKwkJZGV2Yy0+bWlkaV9icm9rZW4gPSAxOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2JfbWlkaV9zdGFydF9yZWFkKGludCBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JfbWlkaV9lbmRfcmVhZChpbnQgZGV2KQoreworCXNiX2RldmMgKmRldmMgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmIChkZXZjID09IE5VTEwpCisJCXJldHVybiAtRU5YSU87CisKKwlzYl9kc3BfcmVzZXQoZGV2Yyk7CisJZGV2Yy0+aW50cl9hY3RpdmUgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNiX21pZGlfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworICAgICAgICByZXR1cm4gLUVJTlZBTDsKK30KKwordm9pZCBzYl9taWRpX2ludGVycnVwdChzYl9kZXZjICogZGV2YykKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJdW5zaWduZWQgY2hhciAgIGRhdGE7CisKKwlpZiAoZGV2YyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJZGF0YSA9IGluYihEU1BfUkVBRCk7CisJaWYgKGRldmMtPmlucHV0X29wZW5lZCkKKwkJZGV2Yy0+bWlkaV9pbnB1dF9pbnRyKGRldmMtPm15X21pZGlkZXYsIGRhdGEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lIE1JRElfU1lOVEhfTkFNRQkiU291bmQgQmxhc3RlciBNaWRpIgorI2RlZmluZSBNSURJX1NZTlRIX0NBUFMJMAorI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgc2JfbWlkaV9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmluZm8JCT0geyJTb3VuZCBCbGFzdGVyIiwgMCwgMCwgU05EQ0FSRF9TQn0sCisJLmNvbnZlcnRlcgk9ICZzdGRfbWlkaV9zeW50aCwKKwkuaW5faW5mbwk9IHswfSwKKwkub3BlbgkJPSBzYl9taWRpX29wZW4sCisJLmNsb3NlCQk9IHNiX21pZGlfY2xvc2UsCisJLmlvY3RsCQk9IHNiX21pZGlfaW9jdGwsCisJLm91dHB1dGMJPSBzYl9taWRpX291dCwKKwkuc3RhcnRfcmVhZAk9IHNiX21pZGlfc3RhcnRfcmVhZCwKKwkuZW5kX3JlYWQJPSBzYl9taWRpX2VuZF9yZWFkLAorfTsKKwordm9pZCBzYl9kc3BfbWlkaV9pbml0KHNiX2RldmMgKiBkZXZjLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlpbnQgZGV2OworCisJaWYgKGRldmMtPm1vZGVsIDwgMikJLyogTm8gTUlESSBzdXBwb3J0IGZvciBTQiAxLnggKi8KKwkJcmV0dXJuOworCisJZGV2ID0gc291bmRfYWxsb2NfbWlkaWRldigpOworCisJaWYgKGRldiA9PSAtMSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAic2JfbWlkaTogdG9vIG1hbnkgTUlESSBkZXZpY2VzIGRldGVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzdGRfbWlkaV9zeW50aC5taWRpX2RldiA9IGRldmMtPm15X21pZGlkZXYgPSBkZXY7CisJbWlkaV9kZXZzW2Rldl0gPSAoc3RydWN0IG1pZGlfb3BlcmF0aW9ucyAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAobWlkaV9kZXZzW2Rldl0gPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNvdW5kIEJsYXN0ZXI6ICBmYWlsZWQgdG8gYWxsb2NhdGUgTUlESSBtZW1vcnkuXG4iKTsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYoZGV2KTsKKwkJICByZXR1cm47CisJfQorCW1lbWNweSgoY2hhciAqKSBtaWRpX2RldnNbZGV2XSwgKGNoYXIgKikgJnNiX21pZGlfb3BlcmF0aW9ucywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpKTsKKworCWlmIChvd25lcikKKwkJCW1pZGlfZGV2c1tkZXZdLT5vd25lciA9IG93bmVyOworCQorCW1pZGlfZGV2c1tkZXZdLT5kZXZjID0gZGV2YzsKKworCisJbWlkaV9kZXZzW2Rldl0tPmNvbnZlcnRlciA9IChzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG1pZGlfZGV2c1tkZXZdLT5jb252ZXJ0ZXIgPT0gTlVMTCkKKwl7CisJCSAgcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQgQmxhc3RlcjogIGZhaWxlZCB0byBhbGxvY2F0ZSBNSURJIG1lbW9yeS5cbiIpOworCQkgIGtmcmVlKG1pZGlfZGV2c1tkZXZdKTsKKwkJICBzb3VuZF91bmxvYWRfbWlkaWRldihkZXYpOworCQkgIHJldHVybjsKKwl9CisJbWVtY3B5KChjaGFyICopIG1pZGlfZGV2c1tkZXZdLT5jb252ZXJ0ZXIsIChjaGFyICopICZzdGRfbWlkaV9zeW50aCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zKSk7CisKKwltaWRpX2RldnNbZGV2XS0+Y29udmVydGVyLT5pZCA9ICJTQk1JREkiOworCXNlcXVlbmNlcl9pbml0KCk7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2JfbWl4ZXIuYyBiL3NvdW5kL29zcy9zYl9taXhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Njg5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2JfbWl4ZXIuYwpAQCAtMCwwICsxLDc2OCBAQAorLyoKKyAqIHNvdW5kL3NiX21peGVyLmMKKyAqCisgKiBUaGUgbG93IGxldmVsIG1peGVyIGRyaXZlciBmb3IgdGhlIFNvdW5kIEJsYXN0ZXIgY29tcGF0aWJsZSBjYXJkcy4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBUaG9tYXMgU2FpbGVyCQkJCTogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICogUm9sZiBGb2trZW5zIChEZWMgMjAgMTk5OCkJOiBNb3ZlZCBFU1Mgc3R1ZmYgaW50byBzYl9lc3MuW2NoXQorICogU3RhbmlzbGF2IFZvcm9ueWkgPHN0YXNAZXNjLmtoYXJrb3YuY29tPgk6IFN1cHBvcnQgZm9yIEFXRSAzRFNFIGRldmljZSAoSnVuIDcgMTk5OSkKKyAqLworCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNkZWZpbmUgX19TQl9NSVhFUl9DX18KKworI2luY2x1ZGUgInNiLmgiCisjaW5jbHVkZSAic2JfbWl4ZXIuaCIKKworI2luY2x1ZGUgInNiX2Vzcy5oIgorCisjZGVmaW5lIFNCUFJPX1JFQ09SRElOR19ERVZJQ0VTCShTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QpCisKKy8qIFNhbWUgYXMgU0IgUHJvLCB1bmxlc3MgSSBmaW5kIG90aGVyd2lzZSAqLworI2RlZmluZSBTR05YUFJPX1JFQ09SRElOR19ERVZJQ0VTIFNCUFJPX1JFQ09SRElOR19ERVZJQ0VTCisKKyNkZWZpbmUgU0JQUk9fTUlYRVJfREVWSUNFUwkJKFNPVU5EX01BU0tfU1lOVEggfCBTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgXAorCQkJCQkgU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfVk9MVU1FKQorCisvKiBTRyBOWCBQcm8gaGFzIHRyZWJsZSBhbmQgYmFzcyBzZXR0aW5ncyBvbiB0aGUgbWl4ZXIuIFRoZSAnc3BlYWtlcicKKyAqIGNoYW5uZWwgaXMgdGhlIENPVk9YL0Rpc25leVNvdW5kU291cmNlIGVtdWxhdGlvbiB2b2x1bWUgY29udHJvbAorICogb24gdGhlIG1peGVyLiBJdCBkb2VzIE5PVCBjb250cm9sIHNwZWFrZXIgdm9sdW1lLiBTaG91bGQgaGF2ZSBvd24KKyAqIG1hc2sgZXZlbnR1YWxseT8KKyAqLworI2RlZmluZSBTR05YUFJPX01JWEVSX0RFVklDRVMJKFNCUFJPX01JWEVSX0RFVklDRVN8U09VTkRfTUFTS19CQVNTfCBcCisJCQkJIFNPVU5EX01BU0tfVFJFQkxFfFNPVU5EX01BU0tfU1BFQUtFUiApCisKKyNkZWZpbmUgU0IxNl9SRUNPUkRJTkdfREVWSUNFUwkJKFNPVU5EX01BU0tfU1lOVEggfCBTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX01JQyB8IFwKKwkJCQkJIFNPVU5EX01BU0tfQ0QpCisKKyNkZWZpbmUgU0IxNl9PVVRGSUxURVJfREVWSUNFUwkJKFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgXAorCQkJCQkgU09VTkRfTUFTS19DRCkKKworI2RlZmluZSBTQjE2X01JWEVSX0RFVklDRVMJCShTT1VORF9NQVNLX1NZTlRIIHwgU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX1NQRUFLRVIgfCBTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX01JQyB8IFwKKwkJCQkJIFNPVU5EX01BU0tfQ0QgfCBcCisJCQkJCSBTT1VORF9NQVNLX0lHQUlOIHwgU09VTkRfTUFTS19PR0FJTiB8IFwKKwkJCQkJIFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19CQVNTIHwgU09VTkRfTUFTS19UUkVCTEUgfCBcCisJCQkJCVNPVU5EX01BU0tfSU1JWCkKKworLyogVGhlc2UgYXJlIHRoZSBvbmx5IGRldmljZXMgdGhhdCBhcmUgd29ya2luZyBhdCB0aGUgbW9tZW50LiAgT3RoZXJzIGNvdWxkCisgKiBiZSBhZGRlZCBvbmNlIHRoZXkgYXJlIGlkZW50aWZpZWQgYW5kIGEgbWV0aG9kIGlzIGZvdW5kIHRvIGNvbnRyb2wgdGhlbS4KKyAqLworI2RlZmluZSBBTFMwMDdfTUlYRVJfREVWSUNFUwkoU09VTkRfTUFTS19TWU5USCB8IFNPVU5EX01BU0tfTElORSB8IFwKKwkJCQkgU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX01JQyB8IFwKKwkJCQkgU09VTkRfTUFTS19DRCB8IFwKKwkJCQkgU09VTkRfTUFTS19WT0xVTUUpCisKK3N0YXRpYyBtaXhlcl90YWIgc2Jwcm9fbWl4ID0geworTUlYX0VOVChTT1VORF9NSVhFUl9WT0xVTUUsCTB4MjIsIDcsIDQsIDB4MjIsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1lOVEgsCTB4MjYsIDcsIDQsIDB4MjYsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCTB4MDQsIDcsIDQsIDB4MDQsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORSwJMHgyZSwgNywgNCwgMHgyZSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX01JQywJMHgwYSwgMiwgMywgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJMHgyOCwgNywgNCwgMHgyOCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lNSVgsCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9BTFRQQ00sCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApCit9OworCitzdGF0aWMgbWl4ZXJfdGFiIHNiMTZfbWl4ID0geworTUlYX0VOVChTT1VORF9NSVhFUl9WT0xVTUUsCTB4MzAsIDcsIDUsIDB4MzEsIDcsIDUpLAorTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkweDQ2LCA3LCA0LCAweDQ3LCA3LCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkweDQ0LCA3LCA0LCAweDQ1LCA3LCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1lOVEgsCTB4MzQsIDcsIDUsIDB4MzUsIDcsIDUpLAorTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCTB4MzIsIDcsIDUsIDB4MzMsIDcsIDUpLAorTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkweDNiLCA3LCAyLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORSwJMHgzOCwgNywgNSwgMHgzOSwgNywgNSksCitNSVhfRU5UKFNPVU5EX01JWEVSX01JQywJMHgzYSwgNywgNSwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJMHgzNiwgNywgNSwgMHgzNywgNywgNSksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lNSVgsCTB4M2MsIDAsIDEsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9BTFRQQ00sCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCTB4M2YsIDcsIDIsIDB4NDAsIDcsIDIpLCAvKiBPYnNvbGV0ZS4gVXNlIElHQUlOICovCitNSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkweDNmLCA3LCAyLCAweDQwLCA3LCAyKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCTB4NDEsIDcsIDIsIDB4NDIsIDcsIDIpCit9OworCitzdGF0aWMgbWl4ZXJfdGFiIGFsczAwN19taXggPSAKK3sKK01JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkweDYyLCA3LCA0LCAweDYyLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQkFTUywJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1RSRUJMRSwJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkweDY2LCA3LCA0LCAweDY2LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfUENNLAkweDY0LCA3LCA0LCAweDY0LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1BFQUtFUiwJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTB4NmUsIDcsIDQsIDB4NmUsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9NSUMsCTB4NmEsIDIsIDMsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9DRCwJCTB4NjgsIDcsIDQsIDB4NjgsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9JTUlYLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQUxUUENNLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfUkVDTEVWLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwgLyogT2Jzb2xldGUuIFVzZSBJR0FJTiAqLworTUlYX0VOVChTT1VORF9NSVhFUl9JR0FJTiwJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX09HQUlOLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKQorfTsKKworCisvKiBTTV9HQU1FUyAgICAgICAgICBNYXN0ZXIgdm9sdW1lIGlzIGxvd2VyIGFuZCBQQ00gJiBGTSB2b2x1bWVzCisJCQkgICAgIGhpZ2hlciB0aGFuIHdpdGggU0IgUHJvLiBUaGlzIGltcHJvdmVzIHRoZQorCQkJICAgICBzb3VuZCBxdWFsaXR5ICovCisKK3N0YXRpYyBpbnQgc21nX2RlZmF1bHRfbGV2ZWxzWzMyXSA9Cit7CisgIDB4MjAyMCwJCQkvKiBNYXN0ZXIgVm9sdW1lICovCisgIDB4NGI0YiwJCQkvKiBCYXNzICovCisgIDB4NGI0YiwJCQkvKiBUcmVibGUgKi8KKyAgMHg2NDY0LAkJCS8qIEZNICovCisgIDB4NjQ2NCwJCQkvKiBQQ00gKi8KKyAgMHg0YjRiLAkJCS8qIFBDIFNwZWFrZXIgKi8KKyAgMHg0YjRiLAkJCS8qIEV4dCBMaW5lICovCisgIDB4MDAwMCwJCQkvKiBNaWMgKi8KKyAgMHg0YjRiLAkJCS8qIENEICovCisgIDB4NGI0YiwJCQkvKiBSZWNvcmRpbmcgbW9uaXRvciAqLworICAweDRiNGIsCQkJLyogU0IgUENNICovCisgIDB4NGI0YiwJCQkvKiBSZWNvcmRpbmcgbGV2ZWwgKi8KKyAgMHg0YjRiLAkJCS8qIElucHV0IGdhaW4gKi8KKyAgMHg0YjRiLAkJCS8qIE91dHB1dCBnYWluICovCisgIDB4NDA0MCwJCQkvKiBMaW5lMSAqLworICAweDQwNDAsCQkJLyogTGluZTIgKi8KKyAgMHgxNTE1CQkJLyogTGluZTMgKi8KK307CisKK3N0YXRpYyBpbnQgc2JfZGVmYXVsdF9sZXZlbHNbMzJdID0KK3sKKyAgMHg1YTVhLAkJCS8qIE1hc3RlciBWb2x1bWUgKi8KKyAgMHg0YjRiLAkJCS8qIEJhc3MgKi8KKyAgMHg0YjRiLAkJCS8qIFRyZWJsZSAqLworICAweDRiNGIsCQkJLyogRk0gKi8KKyAgMHg0YjRiLAkJCS8qIFBDTSAqLworICAweDRiNGIsCQkJLyogUEMgU3BlYWtlciAqLworICAweDRiNGIsCQkJLyogRXh0IExpbmUgKi8KKyAgMHgxMDEwLAkJCS8qIE1pYyAqLworICAweDRiNGIsCQkJLyogQ0QgKi8KKyAgMHgwMDAwLAkJCS8qIFJlY29yZGluZyBtb25pdG9yICovCisgIDB4NGI0YiwJCQkvKiBTQiBQQ00gKi8KKyAgMHg0YjRiLAkJCS8qIFJlY29yZGluZyBsZXZlbCAqLworICAweDRiNGIsCQkJLyogSW5wdXQgZ2FpbiAqLworICAweDRiNGIsCQkJLyogT3V0cHV0IGdhaW4gKi8KKyAgMHg0MDQwLAkJCS8qIExpbmUxICovCisgIDB4NDA0MCwJCQkvKiBMaW5lMiAqLworICAweDE1MTUJCQkvKiBMaW5lMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2IxNl9yZWNtYXNrc19MW1NPVU5EX01JWEVSX05SREVWSUNFU10gPQoreworCTB4MDAsCS8qIFNPVU5EX01JWEVSX1ZPTFVNRQkqLworCTB4MDAsCS8qIFNPVU5EX01JWEVSX0JBU1MJKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9UUkVCTEUJKi8KKwkweDQwLAkvKiBTT1VORF9NSVhFUl9TWU5USAkqLworCTB4MDAsCS8qIFNPVU5EX01JWEVSX1BDTQkqLworCTB4MDAsCS8qIFNPVU5EX01JWEVSX1NQRUFLRVIJKi8KKwkweDEwLAkvKiBTT1VORF9NSVhFUl9MSU5FCSovCisJMHgwMSwJLyogU09VTkRfTUlYRVJfTUlDCSovCisJMHgwNCwJLyogU09VTkRfTUlYRVJfQ0QJKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9JTUlYCSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfQUxUUENNCSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfUkVDTEVWCSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfSUdBSU4JKi8KKwkweDAwCS8qIFNPVU5EX01JWEVSX09HQUlOCSovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzYjE2X3JlY21hc2tzX1JbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9Cit7CisJMHgwMCwJLyogU09VTkRfTUlYRVJfVk9MVU1FCSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfQkFTUwkqLworCTB4MDAsCS8qIFNPVU5EX01JWEVSX1RSRUJMRQkqLworCTB4MjAsCS8qIFNPVU5EX01JWEVSX1NZTlRICSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfUENNCSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfU1BFQUtFUgkqLworCTB4MDgsCS8qIFNPVU5EX01JWEVSX0xJTkUJKi8KKwkweDAxLAkvKiBTT1VORF9NSVhFUl9NSUMJKi8KKwkweDAyLAkvKiBTT1VORF9NSVhFUl9DRAkqLworCTB4MDAsCS8qIFNPVU5EX01JWEVSX0lNSVgJKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9BTFRQQ00JKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9SRUNMRVYJKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9JR0FJTgkqLworCTB4MDAJLyogU09VTkRfTUlYRVJfT0dBSU4JKi8KK307CisKK3N0YXRpYyBjaGFyICAgICBzbXdfbWl4X3JlZ3NbXSA9CS8qIExlZnQgbWl4ZXIgcmVnaXN0ZXJzICovCit7CisgIDB4MGIsCQkJCS8qIFNPVU5EX01JWEVSX1ZPTFVNRSAqLworICAweDBkLAkJCQkvKiBTT1VORF9NSVhFUl9CQVNTICovCisgIDB4MGQsCQkJCS8qIFNPVU5EX01JWEVSX1RSRUJMRSAqLworICAweDA1LAkJCQkvKiBTT1VORF9NSVhFUl9TWU5USCAqLworICAweDA5LAkJCQkvKiBTT1VORF9NSVhFUl9QQ00gKi8KKyAgMHgwMCwJCQkJLyogU09VTkRfTUlYRVJfU1BFQUtFUiAqLworICAweDAzLAkJCQkvKiBTT1VORF9NSVhFUl9MSU5FICovCisgIDB4MDEsCQkJCS8qIFNPVU5EX01JWEVSX01JQyAqLworICAweDA3LAkJCQkvKiBTT1VORF9NSVhFUl9DRCAqLworICAweDAwLAkJCQkvKiBTT1VORF9NSVhFUl9JTUlYICovCisgIDB4MDAsCQkJCS8qIFNPVU5EX01JWEVSX0FMVFBDTSAqLworICAweDAwLAkJCQkvKiBTT1VORF9NSVhFUl9SRUNMRVYgKi8KKyAgMHgwMCwJCQkJLyogU09VTkRfTUlYRVJfSUdBSU4gKi8KKyAgMHgwMCwJCQkJLyogU09VTkRfTUlYRVJfT0dBSU4gKi8KKyAgMHgwMCwJCQkJLyogU09VTkRfTUlYRVJfTElORTEgKi8KKyAgMHgwMCwJCQkJLyogU09VTkRfTUlYRVJfTElORTIgKi8KKyAgMHgwMAkJCQkvKiBTT1VORF9NSVhFUl9MSU5FMyAqLworfTsKKworc3RhdGljIGludCAgICAgIHNibWl4bnVtID0gMTsKKworc3RhdGljIHZvaWQgICAgIHNiX21peGVyX3Jlc2V0KHNiX2RldmMgKiBkZXZjKTsKKwordm9pZCBzYl9taXhlcl9zZXRfc3RlcmVvKHNiX2RldmMgKiBkZXZjLCBpbnQgbW9kZSkKK3sKKwlzYl9jaGdtaXhlcihkZXZjLCBPVVRfRklMVEVSLCBTVEVSRU9fREFDLCAobW9kZSA/IFNURVJFT19EQUMgOiBNT05PX0RBQykpOworfQorCitzdGF0aWMgaW50IGRldGVjdF9taXhlcihzYl9kZXZjICogZGV2YykKK3sKKwkvKiBKdXN0IHRydXN0IHRoZSBtaXhlciBpcyB0aGVyZSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfYml0cyhzYl9kZXZjICogZGV2YywgdW5zaWduZWQgY2hhciAqcmVndmFsLCBpbnQgZGV2LCBpbnQgY2huLCBpbnQgbmV3dmFsKQoreworCXVuc2lnbmVkIGNoYXIgbWFzazsKKwlpbnQgc2hpZnQ7CisKKwltYXNrID0gKDEgPDwgKCpkZXZjLT5pb21hcClbZGV2XVtjaG5dLm5iaXRzKSAtIDE7CisJbmV3dmFsID0gKGludCkgKChuZXd2YWwgKiBtYXNrKSArIDUwKSAvIDEwMDsJLyogU2NhbGUgKi8KKworCXNoaWZ0ID0gKCpkZXZjLT5pb21hcClbZGV2XVtjaG5dLmJpdG9mZnMgLSAoKmRldmMtPmlvbWFwKVtkZXZdW0xFRlRfQ0hOXS5uYml0cyArIDE7CisKKwkqcmVndmFsICY9IH4obWFzayA8PCBzaGlmdCk7CS8qIE1hc2sgb3V0IHByZXZpb3VzIHZhbHVlICovCisJKnJlZ3ZhbCB8PSAobmV3dmFsICYgbWFzaykgPDwgc2hpZnQ7CS8qIFNldCB0aGUgbmV3IHZhbHVlICovCit9CisKK3N0YXRpYyBpbnQgc2JfbWl4ZXJfZ2V0KHNiX2RldmMgKiBkZXZjLCBpbnQgZGV2KQoreworCWlmICghKCgxIDw8IGRldikgJiBkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcykpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBkZXZjLT5sZXZlbHNbZGV2XTsKK30KKwordm9pZCBzbXdfbWl4ZXJfaW5pdChzYl9kZXZjICogZGV2YykKK3sKKwlpbnQgaTsKKworCXNiX3NldG1peGVyKGRldmMsIDB4MDAsIDB4MTgpOwkvKiBNdXRlIHVudXNlZCAoVGVsZXBob25lKSBsaW5lICovCisJc2Jfc2V0bWl4ZXIoZGV2YywgMHgxMCwgMHgzOCk7CS8qIENvbmZpZyByZWdpc3RlciAyICovCisKKwlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzbXdfbWl4X3JlZ3MpOyBpKyspCisJCWlmIChzbXdfbWl4X3JlZ3NbaV0gIT0gMCkKKwkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzIHw9ICgxIDw8IGkpOworCisJZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzID0gZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJgorCQl+KFNPVU5EX01BU0tfQkFTUyB8IFNPVU5EX01BU0tfVFJFQkxFIHwgU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX1ZPTFVNRSk7CisJc2JfbWl4ZXJfcmVzZXQoZGV2Yyk7Cit9CisKK2ludCBzYl9jb21tb25fbWl4ZXJfc2V0KHNiX2RldmMgKiBkZXZjLCBpbnQgZGV2LCBpbnQgbGVmdCwgaW50IHJpZ2h0KQoreworCWludCByZWdvZmZzOworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJcmVnb2ZmcyA9ICgqZGV2Yy0+aW9tYXApW2Rldl1bTEVGVF9DSE5dLnJlZ25vOworCisJaWYgKHJlZ29mZnMgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGRldiA8IDApIHx8IChkZXYgPj0gZGV2Yy0+aW9tYXBfc3opKQorCSAgICByZXR1cm4gLUVJTlZBTDsKKworCXZhbCA9IHNiX2dldG1peGVyKGRldmMsIHJlZ29mZnMpOworCWNoYW5nZV9iaXRzKGRldmMsICZ2YWwsIGRldiwgTEVGVF9DSE4sIGxlZnQpOworCisJaWYgKCgqZGV2Yy0+aW9tYXApW2Rldl1bUklHSFRfQ0hOXS5yZWdubyAhPSByZWdvZmZzKQkvKgorCQkJCQkJCQkgKiBDaGFuZ2UgcmVnaXN0ZXIKKwkJCQkJCQkJICovCisJeworCQlzYl9zZXRtaXhlcihkZXZjLCByZWdvZmZzLCB2YWwpOwkvKgorCQkJCQkJCSAqIFNhdmUgdGhlIG9sZCBvbmUKKwkJCQkJCQkgKi8KKwkJcmVnb2ZmcyA9ICgqZGV2Yy0+aW9tYXApW2Rldl1bUklHSFRfQ0hOXS5yZWdubzsKKworCQlpZiAocmVnb2ZmcyA9PSAwKQorCQkJcmV0dXJuIGxlZnQgfCAobGVmdCA8PCA4KTsJLyoKKwkJCQkJCQkgKiBKdXN0IGxlZnQgY2hhbm5lbCBwcmVzZW50CisJCQkJCQkJICovCisKKwkJdmFsID0gc2JfZ2V0bWl4ZXIoZGV2YywgcmVnb2Zmcyk7CS8qCisJCQkJCQkJICogUmVhZCB0aGUgbmV3IG9uZQorCQkJCQkJCSAqLworCX0KKwljaGFuZ2VfYml0cyhkZXZjLCAmdmFsLCBkZXYsIFJJR0hUX0NITiwgcmlnaHQpOworCisJc2Jfc2V0bWl4ZXIoZGV2YywgcmVnb2ZmcywgdmFsKTsKKworCXJldHVybiBsZWZ0IHwgKHJpZ2h0IDw8IDgpOworfQorCitzdGF0aWMgaW50IHNtd19taXhlcl9zZXQoc2JfZGV2YyAqIGRldmMsIGludCBkZXYsIGludCBsZWZ0LCBpbnQgcmlnaHQpCit7CisJaW50IHJlZywgdmFsOworCisJc3dpdGNoIChkZXYpCisJeworCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwkJCXNiX3NldG1peGVyKGRldmMsIDB4MGIsIDk2IC0gKDk2ICogbGVmdCAvIDEwMCkpOwkvKiA5Nj1tdXRlLCAwPW1heCAqLworCQkJc2Jfc2V0bWl4ZXIoZGV2YywgMHgwYywgOTYgLSAoOTYgKiByaWdodCAvIDEwMCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9CQVNTOgorCQljYXNlIFNPVU5EX01JWEVSX1RSRUJMRToKKwkJCWRldmMtPmxldmVsc1tkZXZdID0gbGVmdCB8IChyaWdodCA8PCA4KTsKKwkJCS8qIFNldCBsZWZ0IGJhc3MgYW5kIHRyZWJsZSB2YWx1ZXMgKi8KKwkJCXZhbCA9ICgoZGV2Yy0+bGV2ZWxzW1NPVU5EX01JWEVSX1RSRUJMRV0gJiAweGZmKSAqIDE2IC8gKHVuc2lnbmVkKSAxMDApIDw8IDQ7CisJCQl2YWwgfD0gKChkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfQkFTU10gJiAweGZmKSAqIDE2IC8gKHVuc2lnbmVkKSAxMDApICYgMHgwZjsKKwkJCXNiX3NldG1peGVyKGRldmMsIDB4MGQsIHZhbCk7CisKKwkJCS8qIFNldCByaWdodCBiYXNzIGFuZCB0cmVibGUgdmFsdWVzICovCisJCQl2YWwgPSAoKChkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfVFJFQkxFXSA+PiA4KSAmIDB4ZmYpICogMTYgLyAodW5zaWduZWQpIDEwMCkgPDwgNDsKKwkJCXZhbCB8PSAoKChkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfQkFTU10gPj4gOCkgJiAweGZmKSAqIDE2IC8gKHVuc2lnbmVkKSAxMDApICYgMHgwZjsKKwkJCXNiX3NldG1peGVyKGRldmMsIDB4MGUsIHZhbCk7CisJCQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIGJvdW5kcyBjaGVjayAqLworCQkJaWYgKGRldiA8IDAgfHwgZGV2ID49IEFSUkFZX1NJWkUoc213X21peF9yZWdzKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJlZyA9IHNtd19taXhfcmVnc1tkZXZdOworCQkJaWYgKHJlZyA9PSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc2Jfc2V0bWl4ZXIoZGV2YywgcmVnLCAoMjQgLSAoMjQgKiBsZWZ0IC8gMTAwKSkgfCAweDIwKTsJLyogMjQ9bXV0ZSwgMD1tYXggKi8KKwkJCXNiX3NldG1peGVyKGRldmMsIHJlZyArIDEsICgyNCAtICgyNCAqIHJpZ2h0IC8gMTAwKSkgfCAweDQwKTsKKwl9CisKKwlkZXZjLT5sZXZlbHNbZGV2XSA9IGxlZnQgfCAocmlnaHQgPDwgOCk7CisJcmV0dXJuIGxlZnQgfCAocmlnaHQgPDwgOCk7Cit9CisKK3N0YXRpYyBpbnQgc2JfbWl4ZXJfc2V0KHNiX2RldmMgKiBkZXZjLCBpbnQgZGV2LCBpbnQgdmFsdWUpCit7CisJaW50IGxlZnQgPSB2YWx1ZSAmIDB4MDAwMDAwZmY7CisJaW50IHJpZ2h0ID0gKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4gODsKKwlpbnQgcmV0dmFsOworCisJaWYgKGxlZnQgPiAxMDApCisJCWxlZnQgPSAxMDA7CisJaWYgKHJpZ2h0ID4gMTAwKQorCQlyaWdodCA9IDEwMDsKKworCWlmICgoZGV2IDwgMCkgfHwgKGRldiA+IDMxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIShkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmICgxIDw8IGRldikpKQkvKgorCQkJCQkJCSAqIE5vdCBzdXBwb3J0ZWQKKwkJCQkJCQkgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEaWZmZXJlbnRpYXRlIGRlcGVuZGluZyBvbiB0aGUgY2hpcHNldHMgKi8KKwlzd2l0Y2ggKGRldmMtPm1vZGVsKSB7CisJY2FzZSBNRExfU01XOgorCQlyZXR2YWwgPSBzbXdfbWl4ZXJfc2V0KGRldmMsIGRldiwgbGVmdCwgcmlnaHQpOworCQlicmVhazsKKwljYXNlIE1ETF9FU1M6CisJCXJldHZhbCA9IGVzc19taXhlcl9zZXQoZGV2YywgZGV2LCBsZWZ0LCByaWdodCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHZhbCA9IHNiX2NvbW1vbl9taXhlcl9zZXQoZGV2YywgZGV2LCBsZWZ0LCByaWdodCk7CisJfQorCWlmIChyZXR2YWwgPj0gMCkgZGV2Yy0+bGV2ZWxzW2Rldl0gPSByZXR2YWw7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogc2V0X3JlY3NyYyBkb2Vzbid0IGFwcGx5IHRvIEVTMTg4eAorICovCitzdGF0aWMgdm9pZCBzZXRfcmVjc3JjKHNiX2RldmMgKiBkZXZjLCBpbnQgc3JjKQoreworCXNiX3NldG1peGVyKGRldmMsIFJFQ09SRF9TUkMsIChzYl9nZXRtaXhlcihkZXZjLCBSRUNPUkRfU1JDKSAmIH43KSB8IChzcmMgJiAweDcpKTsKK30KKworc3RhdGljIGludCBzZXRfcmVjbWFzayhzYl9kZXZjICogZGV2YywgaW50IG1hc2spCit7CisJaW50IGRldm1hc2ssIGk7CisJdW5zaWduZWQgY2hhciAgcmVnaW1hZ2VMLCByZWdpbWFnZVI7CisKKwlkZXZtYXNrID0gbWFzayAmIGRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlczsKKworCXN3aXRjaCAoZGV2Yy0+bW9kZWwpCisJeworCQljYXNlIE1ETF9TQlBSTzoKKwkJY2FzZSBNRExfRVNTOgorCQljYXNlIE1ETF9KQVpaOgorCQljYXNlIE1ETF9TTVc6CisJCQlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX0VTUyAmJiBlc3Nfc2V0X3JlY21hc2sgKGRldmMsICZkZXZtYXNrKSkgeworCQkJCWJyZWFrOworCQkJfTsKKwkJCWlmIChkZXZtYXNrICE9IFNPVU5EX01BU0tfTUlDICYmCisJCQkJZGV2bWFzayAhPSBTT1VORF9NQVNLX0xJTkUgJiYKKwkJCQlkZXZtYXNrICE9IFNPVU5EX01BU0tfQ0QpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBNb3JlIHRoYW4gb25lIGRldmljZSBzZWxlY3RlZC4gRHJvcCB0aGUKKwkJCQkgKiBwcmV2aW91cyBzZWxlY3Rpb24KKwkJCQkgKi8KKwkJCQlkZXZtYXNrICY9IH5kZXZjLT5yZWNtYXNrOworCQkJfQorCQkJaWYgKGRldm1hc2sgIT0gU09VTkRfTUFTS19NSUMgJiYKKwkJCQlkZXZtYXNrICE9IFNPVU5EX01BU0tfTElORSAmJgorCQkJCWRldm1hc2sgIT0gU09VTkRfTUFTS19DRCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIE1vcmUgdGhhbiBvbmUgZGV2aWNlIHNlbGVjdGVkLiBEZWZhdWx0IHRvCisJCQkJICogbWljCisJCQkJICovCisJCQkJZGV2bWFzayA9IFNPVU5EX01BU0tfTUlDOworCQkJfQorCQkJaWYgKGRldm1hc2sgXiBkZXZjLT5yZWNtYXNrKQkvKgorCQkJCQkJCSAqCUlucHV0IHNvdXJjZSBjaGFuZ2VkCisJCQkJCQkJICovCisJCQl7CisJCQkJc3dpdGNoIChkZXZtYXNrKQorCQkJCXsKKwkJCQkJY2FzZSBTT1VORF9NQVNLX01JQzoKKwkJCQkJCXNldF9yZWNzcmMoZGV2YywgU1JDX19NSUMpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTT1VORF9NQVNLX0xJTkU6CisJCQkJCQlzZXRfcmVjc3JjKGRldmMsIFNSQ19fTElORSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNPVU5EX01BU0tfQ0Q6CisJCQkJCQlzZXRfcmVjc3JjKGRldmMsIFNSQ19fQ0QpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXNldF9yZWNzcmMoZGV2YywgU1JDX19NSUMpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTURMX1NCMTY6CisJCQlpZiAoIWRldm1hc2spCisJCQkJZGV2bWFzayA9IFNPVU5EX01BU0tfTUlDOworCisJCQlpZiAoZGV2Yy0+c3VibW9kZWwgPT0gU1VCTURMX0FMUzAwNykgCisJCQl7CisJCQkJc3dpdGNoIChkZXZtYXNrKSAKKwkJCQl7CisJCQkJCWNhc2UgU09VTkRfTUFTS19MSU5FOgorCQkJCQkJc2Jfc2V0bWl4ZXIoZGV2YywgQUxTMDA3X1JFQ09SRF9TUkMsIEFMUzAwN19MSU5FKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNPVU5EX01BU0tfQ0Q6CisJCQkJCQlzYl9zZXRtaXhlcihkZXZjLCBBTFMwMDdfUkVDT1JEX1NSQywgQUxTMDA3X0NEKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNPVU5EX01BU0tfU1lOVEg6CisJCQkJCQlzYl9zZXRtaXhlcihkZXZjLCBBTFMwMDdfUkVDT1JEX1NSQywgQUxTMDA3X1NZTlRIKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OiAgICAgICAgICAgLyogQWxzbyB0YWtlcyBjYXJlIG9mIFNPVU5EX01BU0tfTUlDIGNhc2UgKi8KKwkJCQkJCXNiX3NldG1peGVyKGRldmMsIEFMUzAwN19SRUNPUkRfU1JDLCBBTFMwMDdfTUlDKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZWdpbWFnZUwgPSByZWdpbWFnZVIgPSAwOworCQkJCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCQl7CisJCQkJCWlmICgoMSA8PCBpKSAmIGRldm1hc2spCisJCQkJCXsKKwkJCQkJCXJlZ2ltYWdlTCB8PSBzYjE2X3JlY21hc2tzX0xbaV07CisJCQkJCQlyZWdpbWFnZVIgfD0gc2IxNl9yZWNtYXNrc19SW2ldOworCQkJCQl9CisJCQkJCXNiX3NldG1peGVyIChkZXZjLCBTQjE2X0lNQVNLX0wsIHJlZ2ltYWdlTCk7CisJCQkJCXNiX3NldG1peGVyIChkZXZjLCBTQjE2X0lNQVNLX1IsIHJlZ2ltYWdlUik7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCWRldmMtPnJlY21hc2sgPSBkZXZtYXNrOworCXJldHVybiBkZXZjLT5yZWNtYXNrOworfQorCitzdGF0aWMgaW50IHNldF9vdXRtYXNrKHNiX2RldmMgKiBkZXZjLCBpbnQgbWFzaykKK3sKKwlpbnQgZGV2bWFzaywgaTsKKwl1bnNpZ25lZCBjaGFyICByZWdpbWFnZTsKKworCWRldm1hc2sgPSBtYXNrICYgZGV2Yy0+c3VwcG9ydGVkX291dF9kZXZpY2VzOworCisJc3dpdGNoIChkZXZjLT5tb2RlbCkKKwl7CisJCWNhc2UgTURMX1NCMTY6CisJCQlpZiAoZGV2Yy0+c3VibW9kZWwgPT0gU1VCTURMX0FMUzAwNykgCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQl7CisJCQkJcmVnaW1hZ2UgPSAwOworCQkJCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCQl7CisJCQkJCWlmICgoMSA8PCBpKSAmIGRldm1hc2spCisJCQkJCXsKKwkJCQkJCXJlZ2ltYWdlIHw9IChzYjE2X3JlY21hc2tzX0xbaV0gfCBzYjE2X3JlY21hc2tzX1JbaV0pOworCQkJCQl9CisJCQkJCXNiX3NldG1peGVyIChkZXZjLCBTQjE2X09NQVNLLCByZWdpbWFnZSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlkZXZjLT5vdXRtYXNrID0gZGV2bWFzazsKKwlyZXR1cm4gZGV2Yy0+b3V0bWFzazsKK30KKworc3RhdGljIGludCBzYl9taXhlcl9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXNiX2RldmMgKmRldmMgPSBtaXhlcl9kZXZzW2Rldl0tPmRldmM7CisJaW50IHZhbCwgcmV0OworCWludCBfX3VzZXIgKnAgPSBhcmc7CisKKwkvKgorCSAqIFVzZSBpb2N0bChmZCwgU09VTkRfTUlYRVJfQUdDLCAmbW9kZSkgdG8gdHVybiBBR0Mgb2ZmICgwKSBvciBvbiAoMSkuCisJICogVXNlIGlvY3RsKGZkLCBTT1VORF9NSVhFUl8zRFNFLCAmbW9kZSkgdG8gdHVybiAzRFNFIG9mZiAoMCkgb3Igb24gKDEpCisJICoJCQkJCSAgICAgIG9yIG1vZGU9PTIgcHV0IDNEU0Ugc3RhdGUgdG8gbW9kZS4KKwkgKi8KKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX1NCMTYpIHsKKwkJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9BR0MpIAorCQl7CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNiX3NldG1peGVyKGRldmMsIDB4NDMsICh+dmFsKSAmIDB4MDEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl8zRFNFKSAKKwkJeworCQkJLyogSSBwdXQgaGVyZSAxNSwgYnV0IEkgZG9uJ3Qga25vdyB0aGUgZXhhY3QgdmVyc2lvbi4KKwkJCSAgIEF0IGxlYXN0IG15IDQuMTMgaGF2bid0IDNEU0UsIDQuMTYgaGFzIGl0LiAqLworCQkJaWYgKGRldmMtPm1pbm9yIDwgMTUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh2YWwgPT0gMCB8fCB2YWwgPT0gMSkKKwkJCQlzYl9jaGdtaXhlcihkZXZjLCBBV0VfM0RTRSwgMHgwMSwgdmFsKTsKKwkJCWVsc2UgaWYgKHZhbCA9PSAyKQorCQkJeworCQkJCXJldCA9IHNiX2dldG1peGVyKGRldmMsIEFXRV8zRFNFKSYweDAxOworCQkJCXJldHVybiBwdXRfdXNlcihyZXQsIHApOworCQkJfQorCQkJZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKCgoY21kID4+IDgpICYgMHhmZikgPT0gJ00nKSAKKwl7CisJCWlmIChfU0lPQ19ESVIoY21kKSAmIF9TSU9DX1dSSVRFKSAKKwkJeworCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpIAorCQkJeworCQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCQlyZXQgPSBzZXRfcmVjbWFzayhkZXZjLCB2YWwpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOgorCQkJCQlyZXQgPSBzZXRfb3V0bWFzayhkZXZjLCB2YWwpOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXJldCA9IHNiX21peGVyX3NldChkZXZjLCBjbWQgJiAweGZmLCB2YWwpOworCQkJfQorCQl9CisJCWVsc2Ugc3dpdGNoIChjbWQgJiAweGZmKSAKKwkJeworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQkJcmV0ID0gZGV2Yy0+cmVjbWFzazsKKwkJCQlicmVhazsKKwkJCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6CisJCQkJcmV0ID0gZGV2Yy0+b3V0bWFzazsKKwkJCQlicmVhazsKKwkJCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJCXJldCA9IGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzOworCQkJCWJyZWFrOworCQkJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6CisJCQkJcmV0ID0gZGV2Yy0+c3VwcG9ydGVkX2RldmljZXM7CisJCQkJLyogVGhlIEVTUyBzZWVtcyB0byBoYXZlIHN0ZXJlbyBtaWMgY29udHJvbHMgKi8KKwkJCQlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX0VTUykKKwkJCQkJcmV0ICY9IH4oU09VTkRfTUFTS19TUEVBS0VSfFNPVU5EX01BU0tfSU1JWCk7CisJCQkJZWxzZSBpZiAoZGV2Yy0+bW9kZWwgIT0gTURMX0pBWlogJiYgZGV2Yy0+bW9kZWwgIT0gTURMX1NNVykKKwkJCQkJcmV0ICY9IH4oU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX1NQRUFLRVIgfCBTT1VORF9NQVNLX0lNSVgpOworCQkJCWJyZWFrOworCQkJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQkJcmV0ID0gZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOworCQkJCWJyZWFrOworCQkJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX09VVE1BU0s6CisJCQkJcmV0ID0gZGV2Yy0+c3VwcG9ydGVkX291dF9kZXZpY2VzOworCQkJCWJyZWFrOworCQkJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQkJcmV0ID0gZGV2Yy0+bWl4ZXJfY2FwczsKKwkJCQlicmVhazsKKwkJCQkgICAgCisJCQlkZWZhdWx0OgorCQkJCXJldCA9IHNiX21peGVyX2dldChkZXZjLCBjbWQgJiAweGZmKTsKKwkJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIocmV0LCBwKTsgCisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgc2JfbWl4ZXJfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmlkCT0gIlNCIiwKKwkubmFtZQk9ICJTb3VuZCBCbGFzdGVyIiwKKwkuaW9jdGwJPSBzYl9taXhlcl9pb2N0bAorfTsKKworc3RhdGljIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zIGFsczAwN19taXhlcl9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWQJPSAiQUxTMDA3IiwKKwkubmFtZQk9ICJBdmFuY2UgQUxTLTAwNyIsCisJLmlvY3RsCT0gc2JfbWl4ZXJfaW9jdGwKK307CisKK3N0YXRpYyB2b2lkIHNiX21peGVyX3Jlc2V0KHNiX2RldmMgKiBkZXZjKQoreworCWNoYXIgbmFtZVszMl07CisJaW50IGk7CisKKwlzcHJpbnRmKG5hbWUsICJTQl8lZCIsIGRldmMtPnNibWl4bnVtKTsKKworCWlmIChkZXZjLT5zYm1vLnNtX2dhbWVzKQorCQlkZXZjLT5sZXZlbHMgPSBsb2FkX21peGVyX3ZvbHVtZXMobmFtZSwgc21nX2RlZmF1bHRfbGV2ZWxzLCAxKTsKKwllbHNlCisJCWRldmMtPmxldmVscyA9IGxvYWRfbWl4ZXJfdm9sdW1lcyhuYW1lLCBzYl9kZWZhdWx0X2xldmVscywgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspCisJCXNiX21peGVyX3NldChkZXZjLCBpLCBkZXZjLT5sZXZlbHNbaV0pOworCisJaWYgKGRldmMtPm1vZGVsICE9IE1ETF9FU1MgfHwgIWVzc19taXhlcl9yZXNldCAoZGV2YykpIHsKKwkJc2V0X3JlY21hc2soZGV2YywgU09VTkRfTUFTS19NSUMpOworCX07Cit9CisKK2ludCBzYl9taXhlcl9pbml0KHNiX2RldmMgKiBkZXZjLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlpbnQgbWl4ZXJfdHlwZSA9IDA7CisJaW50IG07CisKKwlkZXZjLT5zYm1peG51bSA9IHNibWl4bnVtKys7CisJZGV2Yy0+bGV2ZWxzID0gTlVMTDsKKworCXNiX3NldG1peGVyKGRldmMsIDB4MDAsIDApOwkvKiBSZXNldCBtaXhlciAqLworCisJaWYgKCEobWl4ZXJfdHlwZSA9IGRldGVjdF9taXhlcihkZXZjKSkpCisJCXJldHVybiAwOwkvKiBObyBtaXhlci4gV2h5PyAqLworCisJc3dpdGNoIChkZXZjLT5tb2RlbCkKKwl7CisJCWNhc2UgTURMX0VTU1BDSToKKwkJY2FzZSBNRExfWU1QQ0k6CisJCWNhc2UgTURMX1NCUFJPOgorCQljYXNlIE1ETF9BWlRFQ0g6CisJCWNhc2UgTURMX0pBWlo6CisJCQlkZXZjLT5taXhlcl9jYXBzID0gU09VTkRfQ0FQX0VYQ0xfSU5QVVQ7CisJCQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IFNCUFJPX01JWEVSX0RFVklDRVM7CisJCQlkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMgPSBTQlBST19SRUNPUkRJTkdfREVWSUNFUzsKKwkJCWRldmMtPmlvbWFwID0gJnNicHJvX21peDsKKwkJCWRldmMtPmlvbWFwX3N6ID0gQVJSQVlfU0laRShzYnByb19taXgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRExfRVNTOgorCQkJZXNzX21peGVyX2luaXQgKGRldmMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRExfU01XOgorCQkJZGV2Yy0+bWl4ZXJfY2FwcyA9IFNPVU5EX0NBUF9FWENMX0lOUFVUOworCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSAwOworCQkJZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzID0gMDsKKwkJCWRldmMtPmlvbWFwID0gJnNicHJvX21peDsKKwkJCWRldmMtPmlvbWFwX3N6ID0gQVJSQVlfU0laRShzYnByb19taXgpOworCQkJc213X21peGVyX2luaXQoZGV2Yyk7CisJCQlicmVhazsKKworCQljYXNlIE1ETF9TQjE2OgorCQkJZGV2Yy0+bWl4ZXJfY2FwcyA9IDA7CisJCQlkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMgPSBTQjE2X1JFQ09SRElOR19ERVZJQ0VTOworCQkJZGV2Yy0+c3VwcG9ydGVkX291dF9kZXZpY2VzID0gU0IxNl9PVVRGSUxURVJfREVWSUNFUzsKKwkJCWlmIChkZXZjLT5zdWJtb2RlbCAhPSBTVUJNRExfQUxTMDA3KQorCQkJeworCQkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzID0gU0IxNl9NSVhFUl9ERVZJQ0VTOworCQkJCWRldmMtPmlvbWFwID0gJnNiMTZfbWl4OworCQkJCWRldmMtPmlvbWFwX3N6ID0gQVJSQVlfU0laRShzYjE2X21peCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSBBTFMwMDdfTUlYRVJfREVWSUNFUzsKKwkJCQlkZXZjLT5pb21hcCA9ICZhbHMwMDdfbWl4OworCQkJCWRldmMtPmlvbWFwX3N6ID0gQVJSQVlfU0laRShhbHMwMDdfbWl4KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzYl9taXhlcjogVW5zdXBwb3J0ZWQgbWl4ZXIgdHlwZSAlZFxuIiwgZGV2Yy0+bW9kZWwpOworCQkJcmV0dXJuIDA7CisJfQorCisJbSA9IHNvdW5kX2FsbG9jX21peGVyZGV2KCk7CisJaWYgKG0gPT0gLTEpCisJCXJldHVybiAwOworCisJbWl4ZXJfZGV2c1ttXSA9IChzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG1peGVyX2RldnNbbV0gPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAic2JfbWl4ZXI6IENhbid0IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXNvdW5kX3VubG9hZF9taXhlcmRldihtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRldmMtPnN1Ym1vZGVsICE9IFNVQk1ETF9BTFMwMDcpCisJCW1lbWNweSAoKGNoYXIgKikgbWl4ZXJfZGV2c1ttXSwgKGNoYXIgKikgJnNiX21peGVyX29wZXJhdGlvbnMsIHNpemVvZiAoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpKTsKKwllbHNlCisJCW1lbWNweSAoKGNoYXIgKikgbWl4ZXJfZGV2c1ttXSwgKGNoYXIgKikgJmFsczAwN19taXhlcl9vcGVyYXRpb25zLCBzaXplb2YgKHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKSk7CisKKwltaXhlcl9kZXZzW21dLT5kZXZjID0gZGV2YzsKKworCWlmIChvd25lcikKKwkJCSBtaXhlcl9kZXZzW21dLT5vd25lciA9IG93bmVyOworCQorCWRldmMtPm15X21peGVyZGV2ID0gbTsKKwlzYl9taXhlcl9yZXNldChkZXZjKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBzYl9taXhlcl91bmxvYWQoc2JfZGV2YyAqZGV2YykKK3sKKwlpZiAoZGV2Yy0+bXlfbWl4ZXJkZXYgPT0gLTEpCisJCXJldHVybjsKKworCWtmcmVlKG1peGVyX2RldnNbZGV2Yy0+bXlfbWl4ZXJkZXZdKTsKKwlzb3VuZF91bmxvYWRfbWl4ZXJkZXYoZGV2Yy0+bXlfbWl4ZXJkZXYpOworCXNibWl4bnVtLS07Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2JfbWl4ZXIuaCBiL3NvdW5kL29zcy9zYl9taXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNzQ0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2JfbWl4ZXIuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIHNvdW5kL3NiX21peGVyLmgKKyAqIAorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBTQiBQcm8gYW5kIFNCMTYgbWl4ZXJzCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqLworCisvKgorICogTW9kaWZpZWQ6CisgKglIdW55dWUgWWF1CUphbiA2IDE5OTQKKyAqCUFkZGVkIGRlZmluZXMgZm9yIHRoZSBTb3VuZCBHYWxheHkgTlggUHJvIG1peGVyLgorICoKKyAqCVJvbGYgRm9ra2VucwlEZWMgMjAgMTk5OAorICoJQWRkZWQgZGVmaW5lcyBmb3Igc29tZSBFUzE4OHggY2hpcHMuCisgKgorICoJUm9sZiBGb2trZW5zCURlYyAyNyAxOTk4CisgKglNb3ZlZCBzdGF0aWMgc3R1ZmYgdG8gc2JfbWl4ZXIuYworICoKKyAqLworLyoKKyAqIE1peGVyIHJlZ2lzdGVycworICogCisgKiBOT1RFIQlSRUNPUkRfU1JDID09IElOX0ZJTFRFUgorICovCisKKy8qIAorICogTWl4ZXIgcmVnaXN0ZXJzIG9mIFNCIFBybworICovCisjZGVmaW5lIFZPQ19WT0wJCTB4MDQKKyNkZWZpbmUgTUlDX1ZPTAkJMHgwQQorI2RlZmluZSBNSUNfTUlYCQkweDBBCisjZGVmaW5lIFJFQ09SRF9TUkMJMHgwQworI2RlZmluZSBJTl9GSUxURVIJMHgwQworI2RlZmluZSBPVVRfRklMVEVSCTB4MEUKKyNkZWZpbmUgTUFTVEVSX1ZPTAkweDIyCisjZGVmaW5lIEZNX1ZPTAkJMHgyNgorI2RlZmluZSBDRF9WT0wJCTB4MjgKKyNkZWZpbmUgTElORV9WT0wJMHgyRQorI2RlZmluZSBJUlFfTlIJCTB4ODAKKyNkZWZpbmUgRE1BX05SCQkweDgxCisjZGVmaW5lIElSUV9TVEFUCTB4ODIKKyNkZWZpbmUgT1BTVwkJMHgzYworCisvKgorICogQWRkaXRpb25hbCByZWdpc3RlcnMgb24gdGhlIFNHIE5YIFBybyAKKyAqLworI2RlZmluZSBDT1ZPWF9WT0wJMHg0MgorI2RlZmluZSBUUkVCTEVfTFZMCTB4NDQKKyNkZWZpbmUgQkFTU19MVkwJMHg0NgorCisjZGVmaW5lIEZSRVFfSEkgICAgICAgICAoMSA8PCAzKS8qIFVzZSBIaWdoLWZyZXF1ZW5jeSBBTkZJIGZpbHRlcnMgKi8KKyNkZWZpbmUgRlJFUV9MT1cgICAgICAgIDAJLyogVXNlIExvdy1mcmVxdWVuY3kgQU5GSSBmaWx0ZXJzICovCisjZGVmaW5lIEZJTFRfT04gICAgICAgICAwCS8qIFllcywgMCB0byB0dXJuIGl0IG9uLCAxIGZvciBvZmYgKi8KKyNkZWZpbmUgRklMVF9PRkYgICAgICAgICgxIDw8IDUpCisKKyNkZWZpbmUgTU9OT19EQUMJMHgwMAorI2RlZmluZSBTVEVSRU9fREFDCTB4MDIKKworLyoKKyAqIE1peGVyIHJlZ2lzdGVycyBvZiBTQjE2CisgKi8KKyNkZWZpbmUgU0IxNl9PTUFTSwkweDNjCisjZGVmaW5lIFNCMTZfSU1BU0tfTAkweDNkCisjZGVmaW5lIFNCMTZfSU1BU0tfUgkweDNlCisKKyNkZWZpbmUgTEVGVF9DSE4JMAorI2RlZmluZSBSSUdIVF9DSE4JMQorCisvKgorICogM0RTRSByZWdpc3RlciBvZiBBV0UzMi82NAorICovCisjZGVmaW5lIEFXRV8zRFNFCTB4OTAKKworLyoKKyAqIE1peGVyIHJlZ2lzdGVycyBvZiBBTFMwMDcKKyAqLworI2RlZmluZSBBTFMwMDdfUkVDT1JEX1NSQwkweDZjCisjZGVmaW5lIEFMUzAwN19PVVRQVVRfQ1RSTDEJMHgzYworI2RlZmluZSBBTFMwMDdfT1VUUFVUX0NUUkwyCTB4NGMKKworI2RlZmluZSBNSVhfRU5UKG5hbWUsIHJlZ19sLCBiaXRfbCwgbGVuX2wsIHJlZ19yLCBiaXRfciwgbGVuX3IpCVwKKwl7e3JlZ19sLCBiaXRfbCwgbGVuX2x9LCB7cmVnX3IsIGJpdF9yLCBsZW5fcn19CisKKy8qCisgKglSZWNvcmRpbmcgc291cmNlcyAoU0IgUHJvKQorICovCisKKyNkZWZpbmUgU1JDX19NSUMgICAgICAgICAxCS8qIFNlbGVjdCBNaWNyb3Bob25lIHJlY29yZGluZyBzb3VyY2UgKi8KKyNkZWZpbmUgU1JDX19DRCAgICAgICAgICAzCS8qIFNlbGVjdCBDRCByZWNvcmRpbmcgc291cmNlICovCisjZGVmaW5lIFNSQ19fTElORSAgICAgICAgNwkvKiBVc2UgTGluZS1pbiBmb3IgcmVjb3JkaW5nIHNvdXJjZSAqLworCisvKgorICoJUmVjb3JkaW5nIHNvdXJjZXMgZm9yIEFMUy0wMDcKKyAqLworCisjZGVmaW5lIEFMUzAwN19NSUMJNAorI2RlZmluZSBBTFMwMDdfTElORQk2CisjZGVmaW5lIEFMUzAwN19DRAkyCisjZGVmaW5lIEFMUzAwN19TWU5USAk3CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2VxdWVuY2VyLmMgYi9zb3VuZC9vc3Mvc2VxdWVuY2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4NjE0MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zZXF1ZW5jZXIuYwpAQCAtMCwwICsxLDE2ODQgQEAKKy8qCisgKiBzb3VuZC9zZXF1ZW5jZXIuYworICoKKyAqIFRoZSBzZXF1ZW5jZXIgcGVyc29uYWxpdHkgbWFuYWdlci4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisvKgorICogVGhvbWFzIFNhaWxlciAgIDogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICogQWxhbiBDb3gJICAgOiByZWZvcm1hdHRlZCBhbmQgZml4ZWQgYSBwYWlyIG9mIG51bGwgcG9pbnRlciBidWdzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNkZWZpbmUgU0VRVUVOQ0VSX0MKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgIm1pZGlfY3RybC5oIgorCitzdGF0aWMgaW50ICAgICAgc2VxdWVuY2VyX29rOworc3RhdGljIHN0cnVjdCBzb3VuZF90aW1lcl9vcGVyYXRpb25zICp0bXI7CitzdGF0aWMgaW50ICAgICAgdG1yX25vID0gLTE7CS8qIEN1cnJlbnRseSBzZWxlY3RlZCB0aW1lciAqLworc3RhdGljIGludCAgICAgIHBlbmRpbmdfdGltZXIgPSAtMTsJLyogRm9yIHRpbWVyIGNoYW5nZSBvcGVyYXRpb24gKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHNlcV90aW1lOworCitzdGF0aWMgaW50ICAgICAgb2Jzb2xldGVfYXBpX3VzZWQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOworCisvKgorICogTG9jYWwgY291bnRzIGZvciBudW1iZXIgb2Ygc3ludGggYW5kIE1JREkgZGV2aWNlcy4gVGhlc2UgYXJlIGluaXRpYWxpemVkCisgKiBieSB0aGUgc2VxdWVuY2VyX29wZW4uCisgKi8KK3N0YXRpYyBpbnQgICAgICBtYXhfbWlkaWRldjsKK3N0YXRpYyBpbnQgICAgICBtYXhfc3ludGhkZXY7CisKKy8qCisgKiBUaGUgc2VxX21vZGUgZ2l2ZXMgdGhlIG9wZXJhdGluZyBtb2RlIG9mIHRoZSBzZXF1ZW5jZXI6CisgKiAgICAgIDEgPSBsZXZlbDEgKHRoZSBkZWZhdWx0KQorICogICAgICAyID0gbGV2ZWwyIChleHRlbmRlZCBjYXBhYmlsaXRpZXMpCisgKi8KKworI2RlZmluZSBTRVFfMQkxCisjZGVmaW5lIFNFUV8yCTIKK3N0YXRpYyBpbnQgICAgICBzZXFfbW9kZSA9IFNFUV8xOworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoc2VxX3NsZWVwZXIpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKG1pZGlfc2xlZXBlcik7CisKK3N0YXRpYyBpbnQgICAgICBtaWRpX29wZW5lZFtNQVhfTUlESV9ERVZdOworCitzdGF0aWMgaW50ICAgICAgbWlkaV93cml0dGVuW01BWF9NSURJX0RFVl07CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHByZXZfaW5wdXRfdGltZTsKK3N0YXRpYyBpbnQgICAgICBwcmV2X2V2ZW50X3RpbWU7CisKKyNpbmNsdWRlICJ0dW5pbmcuaCIKKworI2RlZmluZSBFVl9TWgk4CisjZGVmaW5lIElFVl9TWgk4CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpxdWV1ZTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICppcXVldWU7CisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcWhlYWQsIHF0YWlsLCBxbGVuOworc3RhdGljIHZvbGF0aWxlIGludCBpcWhlYWQsIGlxdGFpbCwgaXFsZW47CitzdGF0aWMgdm9sYXRpbGUgaW50IHNlcV9wbGF5aW5nOworc3RhdGljIHZvbGF0aWxlIGludCBzZXF1ZW5jZXJfYnVzeTsKK3N0YXRpYyBpbnQgICAgICBvdXRwdXRfdGhyZXNob2xkOworc3RhdGljIGxvbmcgICAgIHByZV9ldmVudF90aW1lb3V0Oworc3RhdGljIHVuc2lnbmVkIHN5bnRoX29wZW5fbWFzazsKKworc3RhdGljIGludCAgICAgIHNlcV9xdWV1ZSh1bnNpZ25lZCBjaGFyICpub3RlLCBjaGFyIG5vbmJsb2NrKTsKK3N0YXRpYyB2b2lkICAgICBzZXFfc3RhcnRwbGF5KHZvaWQpOworc3RhdGljIGludCAgICAgIHNlcV9zeW5jKHZvaWQpOworc3RhdGljIHZvaWQgICAgIHNlcV9yZXNldCh2b2lkKTsKKworI2lmIE1BWF9TWU5USF9ERVYgPiAxNQorI2Vycm9yIFRvbyBtYW55IHN5bnRoZXNpemVyIGRldmljZXMgZW5hYmxlZC4KKyNlbmRpZgorCitpbnQgc2VxdWVuY2VyX3JlYWQoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQgYyA9IGNvdW50LCBwID0gMDsKKwlpbnQgZXZfbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXYgPSBkZXYgPj4gNDsKKworCWV2X2xlbiA9IHNlcV9tb2RlID09IFNFUV8xID8gNCA6IDg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisKKwlpZiAoIWlxbGVuKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisgCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKyAgCQkJcmV0dXJuIC1FQUdBSU47CisgIAkJfQorCisgCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJm1pZGlfc2xlZXBlciwKKwkJCQkJICAgICAgIHByZV9ldmVudF90aW1lb3V0KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCQlpZiAoIWlxbGVuKQorCQl7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXdoaWxlIChpcWxlbiAmJiBjID49IGV2X2xlbikKKwl7CisJCWNoYXIgKmZpeGl0ID0gKGNoYXIgKikgJmlxdWV1ZVtpcWhlYWQgKiBJRVZfU1pdOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigmKGJ1ZilbcF0sIGZpeGl0LCBldl9sZW4pKQorCQkJcmV0dXJuIGNvdW50IC0gYzsKKwkJcCArPSBldl9sZW47CisJCWMgLT0gZXZfbGVuOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwkJaXFoZWFkID0gKGlxaGVhZCArIDEpICUgU0VRX01BWF9RVUVVRTsKKwkJaXFsZW4tLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJcmV0dXJuIGNvdW50IC0gYzsKK30KKworc3RhdGljIHZvaWQgc2VxdWVuY2VyX21pZGlfb3V0cHV0KGludCBkZXYpCit7CisJLyoKKwkgKiBDdXJyZW50bHkgTk9QCisJICovCit9CisKK3ZvaWQgc2VxX2NvcHlfdG9faW5wdXQodW5zaWduZWQgY2hhciAqZXZlbnRfcmVjLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IHRoZSBsZW4gaXMgdmFsaWQgZm9yIHRoZSBjdXJyZW50IG1vZGUuCisJICovCisKKwlpZiAobGVuICE9IDQgJiYgbGVuICE9IDgpCisJCXJldHVybjsKKwlpZiAoKHNlcV9tb2RlID09IFNFUV8xKSAhPSAobGVuID09IDQpKQorCQlyZXR1cm47CisKKwlpZiAoaXFsZW4gPj0gKFNFUV9NQVhfUVVFVUUgLSAxKSkKKwkJcmV0dXJuOwkJLyogT3ZlcmZsb3cgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwltZW1jcHkoJmlxdWV1ZVtpcXRhaWwgKiBJRVZfU1pdLCBldmVudF9yZWMsIGxlbik7CisJaXFsZW4rKzsKKwlpcXRhaWwgPSAoaXF0YWlsICsgMSkgJSBTRVFfTUFYX1FVRVVFOworCXdha2VfdXAoJm1pZGlfc2xlZXBlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcXVlbmNlcl9taWRpX2lucHV0KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgdHN0YW1wOworCXVuc2lnbmVkIGNoYXIgZXZlbnRfcmVjWzRdOworCisJaWYgKGRhdGEgPT0gMHhmZSkJLyogSWdub3JlIGFjdGl2ZSBzZW5zaW5nICovCisJCXJldHVybjsKKworCXRzdGFtcCA9IGppZmZpZXMgLSBzZXFfdGltZTsKKworCWlmICh0c3RhbXAgIT0gcHJldl9pbnB1dF90aW1lKQorCXsKKwkJdHN0YW1wID0gKHRzdGFtcCA8PCA4KSB8IFNFUV9XQUlUOworCQlzZXFfY29weV90b19pbnB1dCgodW5zaWduZWQgY2hhciAqKSAmdHN0YW1wLCA0KTsKKwkJcHJldl9pbnB1dF90aW1lID0gdHN0YW1wOworCX0KKwlldmVudF9yZWNbMF0gPSBTRVFfTUlESVBVVEM7CisJZXZlbnRfcmVjWzFdID0gZGF0YTsKKwlldmVudF9yZWNbMl0gPSBkZXY7CisJZXZlbnRfcmVjWzNdID0gMDsKKworCXNlcV9jb3B5X3RvX2lucHV0KGV2ZW50X3JlYywgNCk7Cit9CisKK3ZvaWQgc2VxX2lucHV0X2V2ZW50KHVuc2lnbmVkIGNoYXIgKmV2ZW50X3JlYywgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIHRoaXNfdGltZTsKKworCWlmIChzZXFfbW9kZSA9PSBTRVFfMikKKwkJdGhpc190aW1lID0gdG1yLT5nZXRfdGltZSh0bXJfbm8pOworCWVsc2UKKwkJdGhpc190aW1lID0gamlmZmllcyAtIHNlcV90aW1lOworCisJaWYgKHRoaXNfdGltZSAhPSBwcmV2X2lucHV0X3RpbWUpCisJeworCQl1bnNpZ25lZCBjaGFyICAgdG1wX2V2ZW50WzhdOworCisJCXRtcF9ldmVudFswXSA9IEVWX1RJTUlORzsKKwkJdG1wX2V2ZW50WzFdID0gVE1SX1dBSVRfQUJTOworCQl0bXBfZXZlbnRbMl0gPSAwOworCQl0bXBfZXZlbnRbM10gPSAwOworCQkqKHVuc2lnbmVkIGludCAqKSAmdG1wX2V2ZW50WzRdID0gdGhpc190aW1lOworCisJCXNlcV9jb3B5X3RvX2lucHV0KHRtcF9ldmVudCwgOCk7CisJCXByZXZfaW5wdXRfdGltZSA9IHRoaXNfdGltZTsKKwl9CisJc2VxX2NvcHlfdG9faW5wdXQoZXZlbnRfcmVjLCBsZW4pOworfQorCitpbnQgc2VxdWVuY2VyX3dyaXRlKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgY2hhciBldmVudF9yZWNbRVZfU1pdLCBldl9jb2RlOworCWludCBwID0gMCwgYywgZXZfc2l6ZTsKKwlpbnQgZXJyOworCWludCBtb2RlID0gdHJhbnNsYXRlX21vZGUoZmlsZSk7CisKKwlkZXYgPSBkZXYgPj4gNDsKKworCURFQihwcmludGsoInNlcXVlbmNlcl93cml0ZShkZXY9JWQsIGNvdW50PSVkKVxuIiwgZGV2LCBjb3VudCkpOworCisJaWYgKG1vZGUgPT0gT1BFTl9SRUFEKQorCQlyZXR1cm4gLUVJTzsKKworCWMgPSBjb3VudDsKKworCXdoaWxlIChjID49IDQpCisJeworCQlpZiAoY29weV9mcm9tX3VzZXIoKGNoYXIgKikgZXZlbnRfcmVjLCAmKGJ1ZilbcF0sIDQpKQorCQkJZ290byBvdXQ7CisJCWV2X2NvZGUgPSBldmVudF9yZWNbMF07CisKKwkJaWYgKGV2X2NvZGUgPT0gU0VRX0ZVTExTSVpFKQorCQl7CisJCQlpbnQgZXJyLCBmbXQ7CisKKwkJCWRldiA9ICoodW5zaWduZWQgc2hvcnQgKikgJmV2ZW50X3JlY1syXTsKKwkJCWlmIChkZXYgPCAwIHx8IGRldiA+PSBtYXhfc3ludGhkZXYgfHwgc3ludGhfZGV2c1tkZXZdID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTlhJTzsKKworCQkJaWYgKCEoc3ludGhfb3Blbl9tYXNrICYgKDEgPDwgZGV2KSkpCisJCQkJcmV0dXJuIC1FTlhJTzsKKworCQkJZm10ID0gKCooc2hvcnQgKikgJmV2ZW50X3JlY1swXSkgJiAweGZmZmY7CisJCQllcnIgPSBzeW50aF9kZXZzW2Rldl0tPmxvYWRfcGF0Y2goZGV2LCBmbXQsIGJ1ZiwgcCArIDQsIGMsIDApOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZiAoZXZfY29kZSA+PSAxMjgpCisJCXsKKwkJCWlmIChzZXFfbW9kZSA9PSBTRVFfMiAmJiBldl9jb2RlID09IFNFUV9FWFRFTkRFRCkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTZXF1ZW5jZXI6IEludmFsaWQgbGV2ZWwgMiBldmVudCAleFxuIiwgZXZfY29kZSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlldl9zaXplID0gODsKKworCQkJaWYgKGMgPCBldl9zaXplKQorCQkJeworCQkJCWlmICghc2VxX3BsYXlpbmcpCisJCQkJCXNlcV9zdGFydHBsYXkoKTsKKwkJCQlyZXR1cm4gY291bnQgLSBjOworCQkJfQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopJmV2ZW50X3JlY1s0XSwKKwkJCQkJICAgJihidWYpW3AgKyA0XSwgNCkpCisJCQkJZ290byBvdXQ7CisKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChzZXFfbW9kZSA9PSBTRVFfMikKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTZXF1ZW5jZXI6IDQgYnl0ZSBldmVudCBpbiBsZXZlbCAyIG1vZGVcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJZXZfc2l6ZSA9IDQ7CisKKwkJCWlmIChldmVudF9yZWNbMF0gIT0gU0VRX01JRElQVVRDKQorCQkJCW9ic29sZXRlX2FwaV91c2VkID0gMTsKKwkJfQorCisJCWlmIChldmVudF9yZWNbMF0gPT0gU0VRX01JRElQVVRDKQorCQl7CisJCQlpZiAoIW1pZGlfb3BlbmVkW2V2ZW50X3JlY1syXV0pCisJCQl7CisJCQkJaW50IG1vZGU7CisJCQkJaW50IGRldiA9IGV2ZW50X3JlY1syXTsKKworCQkJCWlmIChkZXYgPj0gbWF4X21pZGlkZXYgfHwgbWlkaV9kZXZzW2Rldl09PU5VTEwpCisJCQkJeworCQkJCQkvKnByaW50aygiU2VxdWVuY2VyIEVycm9yOiBOb25leGlzdGVudCBNSURJIGRldmljZSAlZFxuIiwgZGV2KTsqLworCQkJCQlyZXR1cm4gLUVOWElPOworCQkJCX0KKwkJCQltb2RlID0gdHJhbnNsYXRlX21vZGUoZmlsZSk7CisKKwkJCQlpZiAoKGVyciA9IG1pZGlfZGV2c1tkZXZdLT5vcGVuKGRldiwgbW9kZSwKKwkJCQkJCQkJc2VxdWVuY2VyX21pZGlfaW5wdXQsIHNlcXVlbmNlcl9taWRpX291dHB1dCkpIDwgMCkKKwkJCQl7CisJCQkJCXNlcV9yZXNldCgpOworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTZXF1ZW5jZXIgRXJyb3I6IFVuYWJsZSB0byBvcGVuIE1pZGkgIyVkXG4iLCBkZXYpOworCQkJCQlyZXR1cm4gZXJyOworCQkJCX0KKwkJCQltaWRpX29wZW5lZFtkZXZdID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoIXNlcV9xdWV1ZShldmVudF9yZWMsIChmaWxlLT5mX2ZsYWdzICYgKE9fTk9OQkxPQ0spID8gMSA6IDApKSkKKwkJeworCQkJaW50IHByb2Nlc3NlZCA9IGNvdW50IC0gYzsKKworCQkJaWYgKCFzZXFfcGxheWluZykKKwkJCQlzZXFfc3RhcnRwbGF5KCk7CisKKwkJCWlmICghcHJvY2Vzc2VkICYmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQllbHNlCisJCQkJcmV0dXJuIHByb2Nlc3NlZDsKKwkJfQorCQlwICs9IGV2X3NpemU7CisJCWMgLT0gZXZfc2l6ZTsKKwl9CisKKwlpZiAoIXNlcV9wbGF5aW5nKQorCQlzZXFfc3RhcnRwbGF5KCk7CitvdXQ6CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHNlcV9xdWV1ZSh1bnNpZ25lZCBjaGFyICpub3RlLCBjaGFyIG5vbmJsb2NrKQoreworCisJLyoKKwkgKiBUZXN0IGlmIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBxdWV1ZQorCSAqLworCisJaWYgKHFsZW4gPj0gU0VRX01BWF9RVUVVRSkKKwkJaWYgKCFzZXFfcGxheWluZykKKwkJCXNlcV9zdGFydHBsYXkoKTsJLyoKKwkJCQkJCSAqIEdpdmUgY2hhbmNlIHRvIGRyYWluIHRoZSBxdWV1ZQorCQkJCQkJICovCisKKwlpZiAoIW5vbmJsb2NrICYmIHFsZW4gPj0gU0VRX01BWF9RVUVVRSAmJiAhd2FpdHF1ZXVlX2FjdGl2ZSgmc2VxX3NsZWVwZXIpKSB7CisJCS8qCisJCSAqIFNsZWVwIHVudGlsIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBvbiB0aGUgcXVldWUKKwkJICovCisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnNlcV9zbGVlcGVyKTsKKwl9CisJaWYgKHFsZW4gPj0gU0VRX01BWF9RVUVVRSkKKwl7CisJCXJldHVybiAwOwkvKgorCQkJCSAqIFRvIGJlIHN1cmUKKwkJCQkgKi8KKwl9CisJbWVtY3B5KCZxdWV1ZVtxdGFpbCAqIEVWX1NaXSwgbm90ZSwgRVZfU1opOworCisJcXRhaWwgPSAocXRhaWwgKyAxKSAlIFNFUV9NQVhfUVVFVUU7CisJcWxlbisrOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXh0ZW5kZWRfZXZlbnQodW5zaWduZWQgY2hhciAqcSkKK3sKKwlpbnQgZGV2ID0gcVsyXTsKKworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBtYXhfc3ludGhkZXYpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoIShzeW50aF9vcGVuX21hc2sgJiAoMSA8PCBkZXYpKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXN3aXRjaCAocVsxXSkKKwl7CisJCWNhc2UgU0VRX05PVEVPRkY6CisJCQlzeW50aF9kZXZzW2Rldl0tPmtpbGxfbm90ZShkZXYsIHFbM10sIHFbNF0sIHFbNV0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfTk9URU9OOgorCQkJaWYgKHFbNF0gPiAxMjcgJiYgcVs0XSAhPSAyNTUpCisJCQkJcmV0dXJuIDA7CisKKwkJCWlmIChxWzVdID09IDApCisJCQl7CisJCQkJc3ludGhfZGV2c1tkZXZdLT5raWxsX25vdGUoZGV2LCBxWzNdLCBxWzRdLCBxWzVdKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN5bnRoX2RldnNbZGV2XS0+c3RhcnRfbm90ZShkZXYsIHFbM10sIHFbNF0sIHFbNV0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfUEdNQ0hBTkdFOgorCQkJc3ludGhfZGV2c1tkZXZdLT5zZXRfaW5zdHIoZGV2LCBxWzNdLCBxWzRdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0FGVEVSVE9VQ0g6CisJCQlzeW50aF9kZXZzW2Rldl0tPmFmdGVydG91Y2goZGV2LCBxWzNdLCBxWzRdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0JBTEFOQ0U6CisJCQlzeW50aF9kZXZzW2Rldl0tPnBhbm5pbmcoZGV2LCBxWzNdLCAoY2hhcikgcVs0XSk7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9DT05UUk9MTEVSOgorCQkJc3ludGhfZGV2c1tkZXZdLT5jb250cm9sbGVyKGRldiwgcVszXSwgcVs0XSwgKHNob3J0KSAocVs1XSB8IChxWzZdIDw8IDgpKSk7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9WT0xNT0RFOgorCQkJaWYgKHN5bnRoX2RldnNbZGV2XS0+dm9sdW1lX21ldGhvZCAhPSBOVUxMKQorCQkJCXN5bnRoX2RldnNbZGV2XS0+dm9sdW1lX21ldGhvZChkZXYsIHFbM10pOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW5kX3ZvaWNlKGludCBkZXYsIGludCBjaG4sIGludCBub3RlKQoreworCXVuc2lnbmVkIHNob3J0IGtleTsKKwlpbnQgaTsKKworCWtleSA9IChjaG4gPDwgOCkgfCAobm90ZSArIDEpOworCWZvciAoaSA9IDA7IGkgPCBzeW50aF9kZXZzW2Rldl0tPmFsbG9jLm1heF92b2ljZTsgaSsrKQorCQlpZiAoc3ludGhfZGV2c1tkZXZdLT5hbGxvYy5tYXBbaV0gPT0ga2V5KQorCQkJcmV0dXJuIGk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGFsbG9jX3ZvaWNlKGludCBkZXYsIGludCBjaG4sIGludCBub3RlKQoreworCXVuc2lnbmVkIHNob3J0ICBrZXk7CisJaW50IHZvaWNlOworCisJa2V5ID0gKGNobiA8PCA4KSB8IChub3RlICsgMSk7CisKKwl2b2ljZSA9IHN5bnRoX2RldnNbZGV2XS0+YWxsb2Nfdm9pY2UoZGV2LCBjaG4sIG5vdGUsCisJCQkJCSAgICAgJnN5bnRoX2RldnNbZGV2XS0+YWxsb2MpOworCXN5bnRoX2RldnNbZGV2XS0+YWxsb2MubWFwW3ZvaWNlXSA9IGtleTsKKwlzeW50aF9kZXZzW2Rldl0tPmFsbG9jLmFsbG9jX3RpbWVzW3ZvaWNlXSA9CisJCQlzeW50aF9kZXZzW2Rldl0tPmFsbG9jLnRpbWVzdGFtcCsrOworCXJldHVybiB2b2ljZTsKK30KKworc3RhdGljIHZvaWQgc2VxX2Nobl92b2ljZV9ldmVudCh1bnNpZ25lZCBjaGFyICpldmVudF9yZWMpCit7CisjZGVmaW5lIGRldiBldmVudF9yZWNbMV0KKyNkZWZpbmUgY21kIGV2ZW50X3JlY1syXQorI2RlZmluZSBjaG4gZXZlbnRfcmVjWzNdCisjZGVmaW5lIG5vdGUgZXZlbnRfcmVjWzRdCisjZGVmaW5lIHBhcm0gZXZlbnRfcmVjWzVdCisKKwlpbnQgdm9pY2UgPSAtMTsKKworCWlmICgoaW50KSBkZXYgPiBtYXhfc3ludGhkZXYgfHwgc3ludGhfZGV2c1tkZXZdID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoIShzeW50aF9vcGVuX21hc2sgJiAoMSA8PCBkZXYpKSkKKwkJcmV0dXJuOworCWlmICghc3ludGhfZGV2c1tkZXZdKQorCQlyZXR1cm47CisKKwlpZiAoc2VxX21vZGUgPT0gU0VRXzIpCisJeworCQlpZiAoc3ludGhfZGV2c1tkZXZdLT5hbGxvY192b2ljZSkKKwkJCXZvaWNlID0gZmluZF92b2ljZShkZXYsIGNobiwgbm90ZSk7CisKKwkJaWYgKGNtZCA9PSBNSURJX05PVEVPTiAmJiBwYXJtID09IDApCisJCXsKKwkJCWNtZCA9IE1JRElfTk9URU9GRjsKKwkJCXBhcm0gPSA2NDsKKwkJfQorCX0KKworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSBNSURJX05PVEVPTjoKKwkJCWlmIChub3RlID4gMTI3ICYmIG5vdGUgIT0gMjU1KQkvKiBOb3QgYSBzZXEyIGZlYXR1cmUgKi8KKwkJCQlyZXR1cm47CisKKwkJCWlmICh2b2ljZSA9PSAtMSAmJiBzZXFfbW9kZSA9PSBTRVFfMiAmJiBzeW50aF9kZXZzW2Rldl0tPmFsbG9jX3ZvaWNlKQorCQkJeworCQkJCS8qIEludGVybmFsIHN5bnRoZXNpemVyIChGTSwgR1VTLCBldGMpICovCisJCQkJdm9pY2UgPSBhbGxvY192b2ljZShkZXYsIGNobiwgbm90ZSk7CisJCQl9CisJCQlpZiAodm9pY2UgPT0gLTEpCisJCQkJdm9pY2UgPSBjaG47CisKKwkJCWlmIChzZXFfbW9kZSA9PSBTRVFfMiAmJiAoaW50KSBkZXYgPCBudW1fc3ludGhzKQorCQkJeworCQkJCS8qCisJCQkJICogVGhlIE1JREkgY2hhbm5lbCAxMCBpcyBhIHBlcmN1c3NpdmUgY2hhbm5lbC4gVXNlIHRoZSBub3RlCisJCQkJICogbnVtYmVyIHRvIHNlbGVjdCB0aGUgcHJvcGVyIHBhdGNoICgxMjggdG8gMjU1KSB0byBwbGF5LgorCQkJCSAqLworCisJCQkJaWYgKGNobiA9PSA5KQorCQkJCXsKKwkJCQkJc3ludGhfZGV2c1tkZXZdLT5zZXRfaW5zdHIoZGV2LCB2b2ljZSwgMTI4ICsgbm90ZSk7CisJCQkJCXN5bnRoX2RldnNbZGV2XS0+Y2huX2luZm9bY2huXS5wZ21fbnVtID0gMTI4ICsgbm90ZTsKKwkJCQl9CisJCQkJc3ludGhfZGV2c1tkZXZdLT5zZXR1cF92b2ljZShkZXYsIHZvaWNlLCBjaG4pOworCQkJfQorCQkJc3ludGhfZGV2c1tkZXZdLT5zdGFydF9ub3RlKGRldiwgdm9pY2UsIG5vdGUsIHBhcm0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNSURJX05PVEVPRkY6CisJCQlpZiAodm9pY2UgPT0gLTEpCisJCQkJdm9pY2UgPSBjaG47CisJCQlzeW50aF9kZXZzW2Rldl0tPmtpbGxfbm90ZShkZXYsIHZvaWNlLCBub3RlLCBwYXJtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUlESV9LRVlfUFJFU1NVUkU6CisJCQlpZiAodm9pY2UgPT0gLTEpCisJCQkJdm9pY2UgPSBjaG47CisJCQlzeW50aF9kZXZzW2Rldl0tPmFmdGVydG91Y2goZGV2LCB2b2ljZSwgcGFybSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OjsKKwl9CisjdW5kZWYgZGV2CisjdW5kZWYgY21kCisjdW5kZWYgY2huCisjdW5kZWYgbm90ZQorI3VuZGVmIHBhcm0KK30KKworCitzdGF0aWMgdm9pZCBzZXFfY2huX2NvbW1vbl9ldmVudCh1bnNpZ25lZCBjaGFyICpldmVudF9yZWMpCit7CisJdW5zaWduZWQgY2hhciBkZXYgPSBldmVudF9yZWNbMV07CisJdW5zaWduZWQgY2hhciBjbWQgPSBldmVudF9yZWNbMl07CisJdW5zaWduZWQgY2hhciBjaG4gPSBldmVudF9yZWNbM107CisJdW5zaWduZWQgY2hhciBwMSA9IGV2ZW50X3JlY1s0XTsKKworCS8qIHVuc2lnbmVkIGNoYXIgcDIgPSBldmVudF9yZWNbNV07ICovCisJdW5zaWduZWQgc2hvcnQgdzE0ID0gKihzaG9ydCAqKSAmZXZlbnRfcmVjWzZdOworCisJaWYgKChpbnQpIGRldiA+IG1heF9zeW50aGRldiB8fCBzeW50aF9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmICghKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IGRldikpKQorCQlyZXR1cm47CisJaWYgKCFzeW50aF9kZXZzW2Rldl0pCisJCXJldHVybjsKKworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSBNSURJX1BHTV9DSEFOR0U6CisJCQlpZiAoc2VxX21vZGUgPT0gU0VRXzIpCisJCQl7CisJCQkJc3ludGhfZGV2c1tkZXZdLT5jaG5faW5mb1tjaG5dLnBnbV9udW0gPSBwMTsKKwkJCQlpZiAoKGludCkgZGV2ID49IG51bV9zeW50aHMpCisJCQkJCXN5bnRoX2RldnNbZGV2XS0+c2V0X2luc3RyKGRldiwgY2huLCBwMSk7CisJCQl9CisJCQllbHNlCisJCQkJc3ludGhfZGV2c1tkZXZdLT5zZXRfaW5zdHIoZGV2LCBjaG4sIHAxKTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBNSURJX0NUTF9DSEFOR0U6CisJCQlpZiAoc2VxX21vZGUgPT0gU0VRXzIpCisJCQl7CisJCQkJaWYgKGNobiA+IDE1IHx8IHAxID4gMTI3KQorCQkJCQlicmVhazsKKworCQkJCXN5bnRoX2RldnNbZGV2XS0+Y2huX2luZm9bY2huXS5jb250cm9sbGVyc1twMV0gPSB3MTQgJiAweDdmOworCisJCQkJaWYgKHAxIDwgMzIpCS8qIFNldHRpbmcgTVNCIHNob3VsZCBjbGVhciBMU0IgdG8gMCAqLworCQkJCQlzeW50aF9kZXZzW2Rldl0tPmNobl9pbmZvW2Nobl0uY29udHJvbGxlcnNbcDEgKyAzMl0gPSAwOworCisJCQkJaWYgKChpbnQpIGRldiA8IG51bV9zeW50aHMpCisJCQkJeworCQkJCQlpbnQgdmFsID0gdzE0ICYgMHg3ZjsKKwkJCQkJaW50IGksIGtleTsKKworCQkJCQlpZiAocDEgPCA2NCkJLyogQ29tYmluZSBNU0IgYW5kIExTQiAqLworCQkJCQl7CisJCQkJCQl2YWwgPSAoKHN5bnRoX2RldnNbZGV2XS0+CisJCQkJCQkJY2huX2luZm9bY2huXS5jb250cm9sbGVyc1twMSAmIH4zMl0gJiAweDdmKSA8PCA3KQorCQkJCQkJCXwgKHN5bnRoX2RldnNbZGV2XS0+CisJCQkJCQkJY2huX2luZm9bY2huXS5jb250cm9sbGVyc1twMSB8IDMyXSAmIDB4N2YpOworCQkJCQkJcDEgJj0gfjMyOworCQkJCQl9CisJCQkJCS8qIEhhbmRsZSBhbGwgcGxheWluZyBub3RlcyBvbiB0aGlzIGNoYW5uZWwgKi8KKworCQkJCQlrZXkgPSAoKGludCkgY2huIDw8IDgpOworCisJCQkJCWZvciAoaSA9IDA7IGkgPCBzeW50aF9kZXZzW2Rldl0tPmFsbG9jLm1heF92b2ljZTsgaSsrKQorCQkJCQkJaWYgKChzeW50aF9kZXZzW2Rldl0tPmFsbG9jLm1hcFtpXSAmIDB4ZmYwMCkgPT0ga2V5KQorCQkJCQkJCXN5bnRoX2RldnNbZGV2XS0+Y29udHJvbGxlcihkZXYsIGksIHAxLCB2YWwpOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXN5bnRoX2RldnNbZGV2XS0+Y29udHJvbGxlcihkZXYsIGNobiwgcDEsIHcxNCk7CisJCQl9CisJCQllbHNlCS8qIE1vZGUgMSAqLworCQkJCXN5bnRoX2RldnNbZGV2XS0+Y29udHJvbGxlcihkZXYsIGNobiwgcDEsIHcxNCk7CisJCQlicmVhazsKKworCQljYXNlIE1JRElfUElUQ0hfQkVORDoKKwkJCWlmIChzZXFfbW9kZSA9PSBTRVFfMikKKwkJCXsKKwkJCQlzeW50aF9kZXZzW2Rldl0tPmNobl9pbmZvW2Nobl0uYmVuZGVyX3ZhbHVlID0gdzE0OworCisJCQkJaWYgKChpbnQpIGRldiA8IG51bV9zeW50aHMpCisJCQkJeworCQkJCQkvKiBIYW5kbGUgYWxsIHBsYXlpbmcgbm90ZXMgb24gdGhpcyBjaGFubmVsICovCisJCQkJCWludCBpLCBrZXk7CisKKwkJCQkJa2V5ID0gKGNobiA8PCA4KTsKKworCQkJCQlmb3IgKGkgPSAwOyBpIDwgc3ludGhfZGV2c1tkZXZdLT5hbGxvYy5tYXhfdm9pY2U7IGkrKykKKwkJCQkJCWlmICgoc3ludGhfZGV2c1tkZXZdLT5hbGxvYy5tYXBbaV0gJiAweGZmMDApID09IGtleSkKKwkJCQkJCQlzeW50aF9kZXZzW2Rldl0tPmJlbmRlcihkZXYsIGksIHcxNCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJc3ludGhfZGV2c1tkZXZdLT5iZW5kZXIoZGV2LCBjaG4sIHcxNCk7CisJCQl9CisJCQllbHNlCS8qIE1PREUgMSAqLworCQkJCXN5bnRoX2RldnNbZGV2XS0+YmVuZGVyKGRldiwgY2huLCB3MTQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDo7CisJfQorfQorCitzdGF0aWMgaW50IHNlcV90aW1pbmdfZXZlbnQodW5zaWduZWQgY2hhciAqZXZlbnRfcmVjKQoreworCXVuc2lnbmVkIGNoYXIgY21kID0gZXZlbnRfcmVjWzFdOworCXVuc2lnbmVkIGludCBwYXJtID0gKihpbnQgKikgJmV2ZW50X3JlY1s0XTsKKworCWlmIChzZXFfbW9kZSA9PSBTRVFfMikKKwl7CisJCWludCByZXQ7CisKKwkJaWYgKChyZXQgPSB0bXItPmV2ZW50KHRtcl9ubywgZXZlbnRfcmVjKSkgPT0gVElNRVJfQVJNRUQpCisJCQlpZiAoKFNFUV9NQVhfUVVFVUUgLSBxbGVuKSA+PSBvdXRwdXRfdGhyZXNob2xkKQorCQkJCXdha2VfdXAoJnNlcV9zbGVlcGVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIFRNUl9XQUlUX1JFTDoKKwkJCXBhcm0gKz0gcHJldl9ldmVudF90aW1lOworCisJCQkvKgorCQkJICogTk9URSEgIE5vIGJyZWFrIGhlcmUuIEV4ZWN1dGlvbiBvZiBUTVJfV0FJVF9SRUwgY29udGludWVzIGluIHRoZQorCQkJICogbmV4dCBjYXNlIChUTVJfV0FJVF9BQlMpCisJCQkgKi8KKworCQljYXNlIFRNUl9XQUlUX0FCUzoKKwkJCWlmIChwYXJtID4gMCkKKwkJCXsKKwkJCQlsb25nIHRpbWU7CisKKwkJCQl0aW1lID0gcGFybTsKKwkJCQlwcmV2X2V2ZW50X3RpbWUgPSB0aW1lOworCisJCQkJc2VxX3BsYXlpbmcgPSAxOworCQkJCXJlcXVlc3Rfc291bmRfdGltZXIodGltZSk7CisKKwkJCQlpZiAoKFNFUV9NQVhfUVVFVUUgLSBxbGVuKSA+PSBvdXRwdXRfdGhyZXNob2xkKQorCQkJCQl3YWtlX3VwKCZzZXFfc2xlZXBlcik7CisJCQkJcmV0dXJuIFRJTUVSX0FSTUVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfU1RBUlQ6CisJCQlzZXFfdGltZSA9IGppZmZpZXM7CisJCQlwcmV2X2lucHV0X3RpbWUgPSAwOworCQkJcHJldl9ldmVudF90aW1lID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgVE1SX1NUT1A6CisJCQlicmVhazsKKworCQljYXNlIFRNUl9DT05USU5VRToKKwkJCWJyZWFrOworCisJCWNhc2UgVE1SX1RFTVBPOgorCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfRUNITzoKKwkJCWlmIChzZXFfbW9kZSA9PSBTRVFfMikKKwkJCQlzZXFfY29weV90b19pbnB1dChldmVudF9yZWMsIDgpOworCQkJZWxzZQorCQkJeworCQkJCXBhcm0gPSAocGFybSA8PCA4IHwgU0VRX0VDSE8pOworCQkJCXNlcV9jb3B5X3RvX2lucHV0KCh1bnNpZ25lZCBjaGFyICopICZwYXJtLCA0KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6OworCX0KKworCXJldHVybiBUSU1FUl9OT1RfQVJNRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNlcV9sb2NhbF9ldmVudCh1bnNpZ25lZCBjaGFyICpldmVudF9yZWMpCit7CisJdW5zaWduZWQgY2hhciAgIGNtZCA9IGV2ZW50X3JlY1sxXTsKKwl1bnNpZ25lZCBpbnQgICAgcGFybSA9ICooKHVuc2lnbmVkIGludCAqKSAmZXZlbnRfcmVjWzRdKTsKKworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSBMT0NMX1NUQVJUQVVESU86CisJCQlETUFidWZfc3RhcnRfZGV2aWNlcyhwYXJtKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6OworCX0KK30KKworc3RhdGljIHZvaWQgc2VxX3N5c2V4X21lc3NhZ2UodW5zaWduZWQgY2hhciAqZXZlbnRfcmVjKQoreworCWludCBkZXYgPSBldmVudF9yZWNbMV07CisJaW50IGksIGwgPSAwOworCXVuc2lnbmVkIGNoYXIgICpidWYgPSAmZXZlbnRfcmVjWzJdOworCisJaWYgKChpbnQpIGRldiA+IG1heF9zeW50aGRldikKKwkJcmV0dXJuOworCWlmICghKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IGRldikpKQorCQlyZXR1cm47CisJaWYgKCFzeW50aF9kZXZzW2Rldl0pCisJCXJldHVybjsKKworCWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCA2ICYmIGJ1ZltpXSAhPSAweGZmOyBpKyspCisJCWwgPSBpICsgMTsKKworCWlmICghc3ludGhfZGV2c1tkZXZdLT5zZW5kX3N5c2V4KQorCQlyZXR1cm47CisJaWYgKGwgPiAwKQorCQlzeW50aF9kZXZzW2Rldl0tPnNlbmRfc3lzZXgoZGV2LCBidWYsIGwpOworfQorCitzdGF0aWMgaW50IHBsYXlfZXZlbnQodW5zaWduZWQgY2hhciAqcSkKK3sKKwkvKgorCSAqIE5PVEUhIFRoaXMgcm91dGluZSByZXR1cm5zCisJICogICAwID0gbm9ybWFsIGV2ZW50IHBsYXllZC4KKwkgKiAgIDEgPSBUaW1lciBhcm1lZC4gU3VzcGVuZCBwbGF5YmFjayB1bnRpbCB0aW1lciBjYWxsYmFjay4KKwkgKiAgIDIgPSBNSURJIG91dHB1dCBidWZmZXIgZnVsbC4gUmVzdG9yZSBxdWV1ZSBhbmQgc3VzcGVuZCB1bnRpbCB0aW1lcgorCSAqLworCXVuc2lnbmVkIGludCAqZGVsYXk7CisKKwlzd2l0Y2ggKHFbMF0pCisJeworCQljYXNlIFNFUV9OT1RFT0ZGOgorCQkJaWYgKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IDApKQorCQkJCWlmIChzeW50aF9kZXZzWzBdKQorCQkJCQlzeW50aF9kZXZzWzBdLT5raWxsX25vdGUoMCwgcVsxXSwgMjU1LCBxWzNdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX05PVEVPTjoKKwkJCWlmIChxWzRdIDwgMTI4IHx8IHFbNF0gPT0gMjU1KQorCQkJCWlmIChzeW50aF9vcGVuX21hc2sgJiAoMSA8PCAwKSkKKwkJCQkJaWYgKHN5bnRoX2RldnNbMF0pCisJCQkJCQlzeW50aF9kZXZzWzBdLT5zdGFydF9ub3RlKDAsIHFbMV0sIHFbMl0sIHFbM10pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfV0FJVDoKKwkJCWRlbGF5ID0gKHVuc2lnbmVkIGludCAqKSBxOwkvKgorCQkJCQkJCSAqIEJ5dGVzIDEgdG8gMyBhcmUgY29udGFpbmluZyB0aGUgKgorCQkJCQkJCSAqIGRlbGF5IGluICd0aWNrcycKKwkJCQkJCQkgKi8KKwkJCSpkZWxheSA9ICgqZGVsYXkgPj4gOCkgJiAweGZmZmZmZjsKKworCQkJaWYgKCpkZWxheSA+IDApCisJCQl7CisJCQkJbG9uZyB0aW1lOworCisJCQkJc2VxX3BsYXlpbmcgPSAxOworCQkJCXRpbWUgPSAqZGVsYXk7CisJCQkJcHJldl9ldmVudF90aW1lID0gdGltZTsKKworCQkJCXJlcXVlc3Rfc291bmRfdGltZXIodGltZSk7CisKKwkJCQlpZiAoKFNFUV9NQVhfUVVFVUUgLSBxbGVuKSA+PSBvdXRwdXRfdGhyZXNob2xkKQorCQkJCQl3YWtlX3VwKCZzZXFfc2xlZXBlcik7CisJCQkJLyoKKwkJCQkgKiBUaGUgdGltZXIgaXMgbm93IGFjdGl2ZSBhbmQgd2lsbCByZWludm9rZSB0aGlzIGZ1bmN0aW9uCisJCQkJICogYWZ0ZXIgdGhlIHRpbWVyIGV4cGlyZXMuIFJldHVybiB0byB0aGUgY2FsbGVyIG5vdy4KKwkJCQkgKi8KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX1BHTUNIQU5HRToKKwkJCWlmIChzeW50aF9vcGVuX21hc2sgJiAoMSA8PCAwKSkKKwkJCQlpZiAoc3ludGhfZGV2c1swXSkKKwkJCQkJc3ludGhfZGV2c1swXS0+c2V0X2luc3RyKDAsIHFbMV0sIHFbMl0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfU1lOQ1RJTUVSOiAJLyoKKwkJCQkJICogUmVzZXQgdGltZXIKKwkJCQkJICovCisJCQlzZXFfdGltZSA9IGppZmZpZXM7CisJCQlwcmV2X2lucHV0X3RpbWUgPSAwOworCQkJcHJldl9ldmVudF90aW1lID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX01JRElQVVRDOgkvKgorCQkJCQkgKiBQdXQgYSBtaWRpIGNoYXJhY3RlcgorCQkJCQkgKi8KKwkJCWlmIChtaWRpX29wZW5lZFtxWzJdXSkKKwkJCXsKKwkJCQlpbnQgZGV2OworCisJCQkJZGV2ID0gcVsyXTsKKworCQkJCWlmIChkZXYgPCAwIHx8IGRldiA+PSBudW1fbWlkaXMgfHwgbWlkaV9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisKKwkJCQlpZiAoIW1pZGlfZGV2c1tkZXZdLT5vdXRwdXRjKGRldiwgcVsxXSkpCisJCQkJeworCQkJCQkvKgorCQkJCQkgKiBPdXRwdXQgRklGTyBpcyBmdWxsLiBXYWl0IG9uZSB0aW1lciBjeWNsZSBhbmQgdHJ5IGFnYWluLgorCQkJCQkgKi8KKworCQkJCQlzZXFfcGxheWluZyA9IDE7CisJCQkJCXJlcXVlc3Rfc291bmRfdGltZXIoLTEpOworCQkJCQlyZXR1cm4gMjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQltaWRpX3dyaXR0ZW5bZGV2XSA9IDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNFUV9FQ0hPOgorCQkJc2VxX2NvcHlfdG9faW5wdXQocSwgNCk7CS8qCisJCQkJCQkJICogRWNobyBiYWNrIHRvIHRoZSBwcm9jZXNzCisJCQkJCQkJICovCisJCQlicmVhazsKKworCQljYXNlIFNFUV9QUklWQVRFOgorCQkJaWYgKChpbnQpIHFbMV0gPCBtYXhfc3ludGhkZXYpCisJCQkJc3ludGhfZGV2c1txWzFdXS0+aHdfY29udHJvbChxWzFdLCBxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0VYVEVOREVEOgorCQkJZXh0ZW5kZWRfZXZlbnQocSk7CisJCQlicmVhazsKKworCQljYXNlIEVWX0NITl9WT0lDRToKKwkJCXNlcV9jaG5fdm9pY2VfZXZlbnQocSk7CisJCQlicmVhazsKKworCQljYXNlIEVWX0NITl9DT01NT046CisJCQlzZXFfY2huX2NvbW1vbl9ldmVudChxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVZfVElNSU5HOgorCQkJaWYgKHNlcV90aW1pbmdfZXZlbnQocSkgPT0gVElNRVJfQVJNRUQpCisJCQl7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEVWX1NFUV9MT0NBTDoKKwkJCXNlcV9sb2NhbF9ldmVudChxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVZfU1lTRVg6CisJCQlzZXFfc3lzZXhfbWVzc2FnZShxKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGVkIGFsc28gYXMgdGltZXIgaW4gaXJxIGNvbnRleHQgKi8KK3N0YXRpYyB2b2lkIHNlcV9zdGFydHBsYXkodm9pZCkKK3sKKwlpbnQgdGhpc19vbmUsIGFjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd2hpbGUgKHFsZW4gPiAwKQorCXsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisJCXFoZWFkID0gKCh0aGlzX29uZSA9IHFoZWFkKSArIDEpICUgU0VRX01BWF9RVUVVRTsKKwkJcWxlbi0tOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKworCQlzZXFfcGxheWluZyA9IDE7CisKKwkJaWYgKChhY3Rpb24gPSBwbGF5X2V2ZW50KCZxdWV1ZVt0aGlzX29uZSAqIEVWX1NaXSkpKQorCQl7CQkvKiBTdXNwZW5kIHBsYXliYWNrLiBOZXh0IHRpbWVyIHJvdXRpbmUgaW52b2tlcyB0aGlzIHJvdXRpbmUgYWdhaW4gKi8KKwkJCWlmIChhY3Rpb24gPT0gMikKKwkJCXsKKwkJCQlxbGVuKys7CisJCQkJcWhlYWQgPSB0aGlzX29uZTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCX0KKworCXNlcV9wbGF5aW5nID0gMDsKKworCWlmICgoU0VRX01BWF9RVUVVRSAtIHFsZW4pID49IG91dHB1dF90aHJlc2hvbGQpCisJCXdha2VfdXAoJnNlcV9zbGVlcGVyKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfY29udHJvbGxlcnMoaW50IGRldiwgdW5zaWduZWQgY2hhciAqY29udHJvbGxlciwgaW50IHVwZGF0ZV9kZXYpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorCQljb250cm9sbGVyW2ldID0gY3RybF9kZWZfdmFsdWVzW2ldOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9tb2RlMih2b2lkKQoreworCWludCBkZXY7CisKKwltYXhfc3ludGhkZXYgPSBudW1fc3ludGhzOworCisJZm9yIChkZXYgPSAwOyBkZXYgPCBudW1fbWlkaXM7IGRldisrKQorCXsKKwkJaWYgKG1pZGlfZGV2c1tkZXZdICYmIG1pZGlfZGV2c1tkZXZdLT5jb252ZXJ0ZXIgIT0gTlVMTCkKKwkJeworCQkJc3ludGhfZGV2c1ttYXhfc3ludGhkZXYrK10gPSBtaWRpX2RldnNbZGV2XS0+Y29udmVydGVyOworCQl9CisJfQorCisJZm9yIChkZXYgPSAwOyBkZXYgPCBtYXhfc3ludGhkZXY7IGRldisrKQorCXsKKwkJaW50IGNobjsKKworCQlzeW50aF9kZXZzW2Rldl0tPnN5c2V4X3B0ciA9IDA7CisJCXN5bnRoX2RldnNbZGV2XS0+ZW11bGF0aW9uID0gMDsKKworCQlmb3IgKGNobiA9IDA7IGNobiA8IDE2OyBjaG4rKykKKwkJeworCQkJc3ludGhfZGV2c1tkZXZdLT5jaG5faW5mb1tjaG5dLnBnbV9udW0gPSAwOworCQkJcmVzZXRfY29udHJvbGxlcnMoZGV2LAorCQkJCXN5bnRoX2RldnNbZGV2XS0+Y2huX2luZm9bY2huXS5jb250cm9sbGVycywwKTsKKwkJCXN5bnRoX2RldnNbZGV2XS0+Y2huX2luZm9bY2huXS5iZW5kZXJfdmFsdWUgPSAoMSA8PCA3KTsJLyogTmV1dHJhbCAqLworCQkJc3ludGhfZGV2c1tkZXZdLT5jaG5faW5mb1tjaG5dLmJlbmRlcl9yYW5nZSA9IDIwMDsKKwkJfQorCX0KKwltYXhfbWlkaWRldiA9IDA7CisJc2VxX21vZGUgPSBTRVFfMjsKK30KKworaW50IHNlcXVlbmNlcl9vcGVuKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByZXR2YWwsIG1vZGUsIGk7CisJaW50IGxldmVsLCB0bXA7CisKKwlpZiAoIXNlcXVlbmNlcl9vaykKKwkJc2VxdWVuY2VyX2luaXQoKTsKKworCWxldmVsID0gKChkZXYgJiAweDBmKSA9PSBTTkRfREVWX1NFUTIpID8gMiA6IDE7CisKKwlkZXYgPSBkZXYgPj4gNDsKKwltb2RlID0gdHJhbnNsYXRlX21vZGUoZmlsZSk7CisKKwlERUIocHJpbnRrKCJzZXF1ZW5jZXJfb3BlbihkZXY9JWQpXG4iLCBkZXYpKTsKKworCWlmICghc2VxdWVuY2VyX29rKQorCXsKKy8qCQlwcmludGsoIlNvdW5kIGNhcmQ6IHNlcXVlbmNlciBub3QgaW5pdGlhbGl6ZWRcbiIpOyovCisJCXJldHVybiAtRU5YSU87CisJfQorCWlmIChkZXYpCQkvKiBQYXRjaCBtYW5hZ2VyIGRldmljZSAob2Jzb2xldGUpICovCisJCXJldHVybiAtRU5YSU87CisKKwlpZihzeW50aF9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJcmVxdWVzdF9tb2R1bGUoInN5bnRoMCIpOworCisJaWYgKG1vZGUgPT0gT1BFTl9SRUFEKQorCXsKKwkJaWYgKCFudW1fbWlkaXMpCisJCXsKKwkJCS8qcHJpbnRrKCJTZXF1ZW5jZXI6IE5vIE1JREkgZGV2aWNlcy4gSW5wdXQgbm90IHBvc3NpYmxlXG4iKTsqLworCQkJc2VxdWVuY2VyX2J1c3kgPSAwOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCX0KKwlpZiAoc2VxdWVuY2VyX2J1c3kpCisJeworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzZXF1ZW5jZXJfYnVzeSA9IDE7CisJb2Jzb2xldGVfYXBpX3VzZWQgPSAwOworCisJbWF4X21pZGlkZXYgPSBudW1fbWlkaXM7CisJbWF4X3N5bnRoZGV2ID0gbnVtX3N5bnRoczsKKwlwcmVfZXZlbnRfdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCXNlcV9tb2RlID0gU0VRXzE7CisKKwlpZiAocGVuZGluZ190aW1lciAhPSAtMSkKKwl7CisJCXRtcl9ubyA9IHBlbmRpbmdfdGltZXI7CisJCXBlbmRpbmdfdGltZXIgPSAtMTsKKwl9CisJaWYgKHRtcl9ubyA9PSAtMSkJLyogTm90IHNlbGVjdGVkIHlldCAqLworCXsKKwkJaW50IGksIGJlc3Q7CisKKwkJYmVzdCA9IC0xOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3NvdW5kX3RpbWVyczsgaSsrKQorCQkJaWYgKHNvdW5kX3RpbWVyX2RldnNbaV0gJiYgc291bmRfdGltZXJfZGV2c1tpXS0+cHJpb3JpdHkgPiBiZXN0KQorCQkJeworCQkJCXRtcl9ubyA9IGk7CisJCQkJYmVzdCA9IHNvdW5kX3RpbWVyX2RldnNbaV0tPnByaW9yaXR5OworCQkJfQorCQlpZiAodG1yX25vID09IC0xKQkvKiBTaG91bGQgbm90IGJlICovCisJCQl0bXJfbm8gPSAwOworCX0KKwl0bXIgPSBzb3VuZF90aW1lcl9kZXZzW3Rtcl9ub107CisKKwlpZiAobGV2ZWwgPT0gMikKKwl7CisJCWlmICh0bXIgPT0gTlVMTCkKKwkJeworCQkJLypwcmludGsoInNlcXVlbmNlcjogTm8gdGltZXIgZm9yIGxldmVsIDJcbiIpOyovCisJCQlzZXF1ZW5jZXJfYnVzeSA9IDA7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCXNldHVwX21vZGUyKCk7CisJfQorCWlmICghbWF4X3N5bnRoZGV2ICYmICFtYXhfbWlkaWRldikKKwl7CisJCXNlcXVlbmNlcl9idXN5PTA7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJc3ludGhfb3Blbl9tYXNrID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhfbWlkaWRldjsgaSsrKQorCXsKKwkJbWlkaV9vcGVuZWRbaV0gPSAwOworCQltaWRpX3dyaXR0ZW5baV0gPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtYXhfc3ludGhkZXY7IGkrKykKKwl7CisJCWlmIChzeW50aF9kZXZzW2ldPT1OVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChzeW50aF9kZXZzW2ldLT5vd25lcikpCisJCQljb250aW51ZTsKKworCQlpZiAoKHRtcCA9IHN5bnRoX2RldnNbaV0tPm9wZW4oaSwgbW9kZSkpIDwgMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2VxdWVuY2VyOiBXYXJuaW5nISBDYW5ub3Qgb3BlbiBzeW50aCBkZXZpY2UgIyVkICglZClcbiIsIGksIHRtcCk7CisJCQlpZiAoc3ludGhfZGV2c1tpXS0+bWlkaV9kZXYpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiKE1hcHMgdG8gTUlESSBkZXYgIyVkKVxuIiwgc3ludGhfZGV2c1tpXS0+bWlkaV9kZXYpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3ludGhfb3Blbl9tYXNrIHw9ICgxIDw8IGkpOworCQkJaWYgKHN5bnRoX2RldnNbaV0tPm1pZGlfZGV2KQorCQkJCW1pZGlfb3BlbmVkW3N5bnRoX2RldnNbaV0tPm1pZGlfZGV2XSA9IDE7CisJCX0KKwl9CisKKwlzZXFfdGltZSA9IGppZmZpZXM7CisKKwlwcmV2X2lucHV0X3RpbWUgPSAwOworCXByZXZfZXZlbnRfdGltZSA9IDA7CisKKwlpZiAoc2VxX21vZGUgPT0gU0VRXzEgJiYgKG1vZGUgPT0gT1BFTl9SRUFEIHx8IG1vZGUgPT0gT1BFTl9SRUFEV1JJVEUpKQorCXsKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSBtaWRpIGlucHV0IGRldmljZXMKKwkJICovCisKKwkJZm9yIChpID0gMDsgaSA8IG1heF9taWRpZGV2OyBpKyspCisJCQlpZiAoIW1pZGlfb3BlbmVkW2ldICYmIG1pZGlfZGV2c1tpXSkKKwkJCXsKKwkJCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KG1pZGlfZGV2c1tpXS0+b3duZXIpKQorCQkJCQljb250aW51ZTsKKwkKKwkJCQlpZiAoKHJldHZhbCA9IG1pZGlfZGV2c1tpXS0+b3BlbihpLCBtb2RlLAorCQkJCQlzZXF1ZW5jZXJfbWlkaV9pbnB1dCwgc2VxdWVuY2VyX21pZGlfb3V0cHV0KSkgPj0gMCkKKwkJCQl7CisJCQkJCW1pZGlfb3BlbmVkW2ldID0gMTsKKwkJCQl9CisJCQl9CisJfQorCisJaWYgKHNlcV9tb2RlID09IFNFUV8yKSB7CisJCWlmICh0cnlfbW9kdWxlX2dldCh0bXItPm93bmVyKSkKKwkJCXRtci0+b3Blbih0bXJfbm8sIHNlcV9tb2RlKTsKKwl9CisKKyAJaW5pdF93YWl0cXVldWVfaGVhZCgmc2VxX3NsZWVwZXIpOworIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX3NsZWVwZXIpOworCW91dHB1dF90aHJlc2hvbGQgPSBTRVFfTUFYX1FVRVVFIC8gMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXFfZHJhaW5fbWlkaV9xdWV1ZXModm9pZCkKK3sKKwlpbnQgaSwgbjsKKworCS8qCisJICogR2l2ZSB0aGUgTWlkaSBkcml2ZXJzIHRpbWUgdG8gZHJhaW4gdGhlaXIgb3V0cHV0IHF1ZXVlcworCSAqLworCisJbiA9IDE7CisKKwl3aGlsZSAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIG4pCisJeworCQluID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbWF4X21pZGlkZXY7IGkrKykKKwkJCWlmIChtaWRpX29wZW5lZFtpXSAmJiBtaWRpX3dyaXR0ZW5baV0pCisJCQkJaWYgKG1pZGlfZGV2c1tpXS0+YnVmZmVyX3N0YXR1cyAhPSBOVUxMKQorCQkJCQlpZiAobWlkaV9kZXZzW2ldLT5idWZmZXJfc3RhdHVzKGkpKQorCQkJCQkJbisrOworCisJCS8qCisJCSAqIExldCdzIGhhdmUgYSBkZWxheQorCQkgKi8KKworIAkJaWYgKG4pCisgCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzZXFfc2xlZXBlciwKKwkJCQkJCSAgICAgICBIWi8xMCk7CisJfQorfQorCit2b2lkIHNlcXVlbmNlcl9yZWxlYXNlKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpOworCWludCBtb2RlID0gdHJhbnNsYXRlX21vZGUoZmlsZSk7CisKKwlkZXYgPSBkZXYgPj4gNDsKKworCURFQihwcmludGsoInNlcXVlbmNlcl9yZWxlYXNlKGRldj0lZClcbiIsIGRldikpOworCisJLyoKKwkgKiBXYWl0IHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eSAoaWYgd2UgZG9uJ3QgaGF2ZSBub25ibG9jaykKKwkgKi8KKworCWlmIChtb2RlICE9IE9QRU5fUkVBRCAmJiAhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwl7CisJCXdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgcWxlbiA+IDApCisJCXsKKyAgCQkJc2VxX3N5bmMoKTsKKyAJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnNlcV9zbGVlcGVyLAorCQkJCQkJICAgICAgIDMqSFopOworIAkJCS8qIEV4dHJhIGRlbGF5ICovCisJCX0KKwl9CisKKwlpZiAobW9kZSAhPSBPUEVOX1JFQUQpCisJCXNlcV9kcmFpbl9taWRpX3F1ZXVlcygpOwkvKgorCQkJCQkJICogRW5zdXJlIHRoZSBvdXRwdXQgcXVldWVzIGFyZSBlbXB0eQorCQkJCQkJICovCisJc2VxX3Jlc2V0KCk7CisJaWYgKG1vZGUgIT0gT1BFTl9SRUFEKQorCQlzZXFfZHJhaW5fbWlkaV9xdWV1ZXMoKTsJLyoKKwkJCQkJCSAqIEZsdXNoIHRoZSBhbGwgbm90ZXMgb2ZmIG1lc3NhZ2VzCisJCQkJCQkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBtYXhfc3ludGhkZXY7IGkrKykKKwl7CisJCWlmIChzeW50aF9vcGVuX21hc2sgJiAoMSA8PCBpKSkJLyoKKwkJCQkJCSAqIEFjdHVhbGx5IG9wZW5lZAorCQkJCQkJICovCisJCQlpZiAoc3ludGhfZGV2c1tpXSkKKwkJCXsKKwkJCQlzeW50aF9kZXZzW2ldLT5jbG9zZShpKTsKKworCQkJCW1vZHVsZV9wdXQoc3ludGhfZGV2c1tpXS0+b3duZXIpOworCisJCQkJaWYgKHN5bnRoX2RldnNbaV0tPm1pZGlfZGV2KQorCQkJCQltaWRpX29wZW5lZFtzeW50aF9kZXZzW2ldLT5taWRpX2Rldl0gPSAwOworCQkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBtYXhfbWlkaWRldjsgaSsrKQorCXsKKwkJaWYgKG1pZGlfb3BlbmVkW2ldKSB7CisJCQltaWRpX2RldnNbaV0tPmNsb3NlKGkpOworCQkJbW9kdWxlX3B1dChtaWRpX2RldnNbaV0tPm93bmVyKTsKKwkJfQorCX0KKworCWlmIChzZXFfbW9kZSA9PSBTRVFfMikgeworCQl0bXItPmNsb3NlKHRtcl9ubyk7CisJCW1vZHVsZV9wdXQodG1yLT5vd25lcik7CisJfQorCisJaWYgKG9ic29sZXRlX2FwaV91c2VkKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIvZGV2L211c2ljOiBPYnNvbGV0ZSAoNCBieXRlKSBBUEkgd2FzIHVzZWQgYnkgJXNcbiIsIGN1cnJlbnQtPmNvbW0pOworCXNlcXVlbmNlcl9idXN5ID0gMDsKK30KKworc3RhdGljIGludCBzZXFfc3luYyh2b2lkKQoreworCWlmIChxbGVuICYmICFzZXFfcGxheWluZyAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXNlcV9zdGFydHBsYXkoKTsKKworIAlpZiAocWxlbiA+IDApCisgCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnNlcV9zbGVlcGVyLCBIWik7CisJcmV0dXJuIHFsZW47Cit9CisKK3N0YXRpYyB2b2lkIG1pZGlfb3V0YyhpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJLyoKKwkgKiBOT1RFISBDYWxscyBzbGVlcCgpLiBEb24ndCBjYWxsIHRoaXMgZnJvbSBpbnRlcnJ1cHQuCisJICovCisKKwlpbnQgbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgc2VuZHMgb25lIGJ5dGUgdG8gdGhlIE1pZGkgY2hhbm5lbC4KKwkgKiBJZiB0aGUgb3V0cHV0IEZJRk8gaXMgZnVsbCwgaXQgd2FpdHMgdW50aWwgdGhlcmUKKwkgKiBpcyBzcGFjZSBpbiB0aGUgcXVldWUKKwkgKi8KKworCW4gPSAzICogSFo7CQkvKiBUaW1lb3V0ICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisgCXdoaWxlIChuICYmICFtaWRpX2RldnNbZGV2XS0+b3V0cHV0YyhkZXYsIGRhdGEpKSB7CisgCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnNlcV9zbGVlcGVyLCBIWi8yNSk7CisgIAkJbi0tOworICAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzZXFfcmVzZXQodm9pZCkKK3sKKwkvKgorCSAqIE5PVEUhIENhbGxzIHNsZWVwKCkuIERvbid0IGNhbGwgdGhpcyBmcm9tIGludGVycnVwdC4KKwkgKi8KKworCWludCBpOworCWludCBjaG47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNvdW5kX3N0b3BfdGltZXIoKTsKKworCXNlcV90aW1lID0gamlmZmllczsKKwlwcmV2X2lucHV0X3RpbWUgPSAwOworCXByZXZfZXZlbnRfdGltZSA9IDA7CisKKwlxbGVuID0gcWhlYWQgPSBxdGFpbCA9IDA7CisJaXFsZW4gPSBpcWhlYWQgPSBpcXRhaWwgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG1heF9zeW50aGRldjsgaSsrKQorCQlpZiAoc3ludGhfb3Blbl9tYXNrICYgKDEgPDwgaSkpCisJCQlpZiAoc3ludGhfZGV2c1tpXSkKKwkJCQlzeW50aF9kZXZzW2ldLT5yZXNldChpKTsKKworCWlmIChzZXFfbW9kZSA9PSBTRVFfMikKKwl7CisJCWZvciAoY2huID0gMDsgY2huIDwgMTY7IGNobisrKQorCQkJZm9yIChpID0gMDsgaSA8IG1heF9zeW50aGRldjsgaSsrKQorCQkJCWlmIChzeW50aF9vcGVuX21hc2sgJiAoMSA8PCBpKSkKKwkJCQkJaWYgKHN5bnRoX2RldnNbaV0pCisJCQkJCXsKKwkJCQkJCXN5bnRoX2RldnNbaV0tPmNvbnRyb2xsZXIoaSwgY2huLCAxMjMsIDApOwkvKiBBbGwgbm90ZXMgb2ZmICovCisJCQkJCQlzeW50aF9kZXZzW2ldLT5jb250cm9sbGVyKGksIGNobiwgMTIxLCAwKTsJLyogUmVzZXQgYWxsIGN0bCAqLworCQkJCQkJc3ludGhfZGV2c1tpXS0+YmVuZGVyKGksIGNobiwgMSA8PCAxMyk7CS8qIEJlbmRlciBvZmYgKi8KKwkJCQkJfQorCX0KKwllbHNlCS8qIHNlcV9tb2RlID09IFNFUV8xICovCisJeworCQlmb3IgKGkgPSAwOyBpIDwgbWF4X21pZGlkZXY7IGkrKykKKwkJCWlmIChtaWRpX3dyaXR0ZW5baV0pCS8qCisJCQkJCQkgKiBNaWRpIHVzZWQuIFNvbWUgbm90ZXMgbWF5IHN0aWxsIGJlIHBsYXlpbmcKKwkJCQkJCSAqLworCQkJeworCQkJCS8qCisJCQkJICogICAgICBTZW5kaW5nIGp1c3QgYSBBQ1RJVkUgU0VOU0lORyBtZXNzYWdlIHNob3VsZCBiZSBlbm91Z2ggdG8gc3RvcCBhbGwKKwkJCQkgKiAgICAgIHBsYXlpbmcgbm90ZXMuIFNpbmNlIHRoZXJlIGFyZSBkZXZpY2VzIG5vdCByZWNvZ25pemluZyB0aGUKKwkJCQkgKiAgICAgIGFjdGl2ZSBzZW5zaW5nLCB3ZSBoYXZlIHRvIHNlbmQgc29tZSBhbGwgbm90ZXMgb2ZmIG1lc3NhZ2VzIGFsc28uCisJCQkJICovCisJCQkJbWlkaV9vdXRjKGksIDB4ZmUpOworCisJCQkJZm9yIChjaG4gPSAwOyBjaG4gPCAxNjsgY2huKyspCisJCQkJeworCQkJCQltaWRpX291dGMoaSwgKHVuc2lnbmVkIGNoYXIpICgweGIwICsgKGNobiAmIDB4MGYpKSk7CQkvKiBjb250cm9sIGNoYW5nZSAqLworCQkJCQltaWRpX291dGMoaSwgMHg3Yik7CS8qIEFsbCBub3RlcyBvZmYgKi8KKwkJCQkJbWlkaV9vdXRjKGksIDApOwkvKiBEdW1teSBwYXJhbWV0ZXIgKi8KKwkJCQl9CisKKwkJCQltaWRpX2RldnNbaV0tPmNsb3NlKGkpOworCisJCQkJbWlkaV93cml0dGVuW2ldID0gMDsKKwkJCQltaWRpX29wZW5lZFtpXSA9IDA7CisJCQl9CisJfQorCisJc2VxX3BsYXlpbmcgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnNlcV9zbGVlcGVyKSkgeworCQkvKiAgICAgIHByaW50ayggIlNlcXVlbmNlciBXYXJuaW5nOiBVbmV4cGVjdGVkIHNsZWVwaW5nIHByb2Nlc3MgLSBXYWtpbmcgdXBcbiIpOyAqLworCQl3YWtlX3VwKCZzZXFfc2xlZXBlcik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzZXFfcGFuaWModm9pZCkKK3sKKwkvKgorCSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGluIGNhc2UgdGhlIHVzZXIKKwkgKiB3YW50cyB0byByZXNldCB0aGUgc3lzdGVtIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgorCSAqLworCisJc2VxX3Jlc2V0KCk7CisKKwkvKgorCSAqIFNpbmNlIHNvbWUgb2YgdGhlIGRldmljZXMgZG9uJ3QgcmVjb2duaXplIHRoZSBhY3RpdmUgc2Vuc2luZyBhbmQKKwkgKiBhbGwgbm90ZXMgb2ZmIG1lc3NhZ2VzLCB3ZSBoYXZlIHRvIHNodXQgYWxsIG5vdGVzIG1hbnVhbGx5LgorCSAqCisJICogICAgICBUTyBCRSBJTVBMRU1FTlRFRCBMQVRFUgorCSAqLworCisJLyoKKwkgKiBBbHNvIHJldHVybiB0aGUgY29udHJvbGxlcnMgdG8gdGhlaXIgZGVmYXVsdCBzdGF0ZXMKKwkgKi8KK30KKworaW50IHNlcXVlbmNlcl9pb2N0bChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgbWlkaV9kZXYsIG9yaWdfZGV2LCB2YWwsIGVycjsKKwlpbnQgbW9kZSA9IHRyYW5zbGF0ZV9tb2RlKGZpbGUpOworCXN0cnVjdCBzeW50aF9pbmZvIGluZjsKKwlzdHJ1Y3Qgc2VxX2V2ZW50X3JlYyBldmVudF9yZWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgX191c2VyICpwID0gYXJnOworCisJb3JpZ19kZXYgPSBkZXYgPSBkZXYgPj4gNDsKKworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSBTTkRDVExfVE1SX1RJTUVCQVNFOgorCQljYXNlIFNORENUTF9UTVJfVEVNUE86CisJCWNhc2UgU05EQ1RMX1RNUl9TVEFSVDoKKwkJY2FzZSBTTkRDVExfVE1SX1NUT1A6CisJCWNhc2UgU05EQ1RMX1RNUl9DT05USU5VRToKKwkJY2FzZSBTTkRDVExfVE1SX01FVFJPTk9NRToKKwkJY2FzZSBTTkRDVExfVE1SX1NPVVJDRToKKwkJCWlmIChzZXFfbW9kZSAhPSBTRVFfMikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiB0bXItPmlvY3RsKHRtcl9ubywgY21kLCBhcmcpOworCisJCWNhc2UgU05EQ1RMX1RNUl9TRUxFQ1Q6CisJCQlpZiAoc2VxX21vZGUgIT0gU0VRXzIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZ2V0X3VzZXIocGVuZGluZ190aW1lciwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAocGVuZGluZ190aW1lciA8IDAgfHwgcGVuZGluZ190aW1lciA+PSBudW1fc291bmRfdGltZXJzIHx8IHNvdW5kX3RpbWVyX2RldnNbcGVuZGluZ190aW1lcl0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwZW5kaW5nX3RpbWVyID0gLTE7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQl2YWwgPSBwZW5kaW5nX3RpbWVyOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfU0VRX1BBTklDOgorCQkJc2VxX3BhbmljKCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljYXNlIFNORENUTF9TRVFfU1lOQzoKKwkJCWlmIChtb2RlID09IE9QRU5fUkVBRCkKKwkJCQlyZXR1cm4gMDsKKwkJCXdoaWxlIChxbGVuID4gMCAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJc2VxX3N5bmMoKTsKKwkJCXJldHVybiBxbGVuID8gLUVJTlRSIDogMDsKKworCQljYXNlIFNORENUTF9TRVFfUkVTRVQ6CisJCQlzZXFfcmVzZXQoKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1NFUV9URVNUTUlESToKKwkJCWlmIChfX2dldF91c2VyKG1pZGlfZGV2LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChtaWRpX2RldiA8IDAgfHwgbWlkaV9kZXYgPj0gbWF4X21pZGlkZXYgfHwgIW1pZGlfZGV2c1ttaWRpX2Rldl0pCisJCQkJcmV0dXJuIC1FTlhJTzsKKworCQkJaWYgKCFtaWRpX29wZW5lZFttaWRpX2Rldl0gJiYKKwkJCQkoZXJyID0gbWlkaV9kZXZzW21pZGlfZGV2XS0+b3BlbihtaWRpX2RldiwgbW9kZSwgc2VxdWVuY2VyX21pZGlfaW5wdXQsCisJCQkJCQkgICAgIHNlcXVlbmNlcl9taWRpX291dHB1dCkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJbWlkaV9vcGVuZWRbbWlkaV9kZXZdID0gMTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1NFUV9HRVRJTkNPVU5UOgorCQkJaWYgKG1vZGUgPT0gT1BFTl9XUklURSkKKwkJCQlyZXR1cm4gMDsKKwkJCXZhbCA9IGlxbGVuOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfU0VRX0dFVE9VVENPVU5UOgorCQkJaWYgKG1vZGUgPT0gT1BFTl9SRUFEKQorCQkJCXJldHVybiAwOworCQkJdmFsID0gU0VRX01BWF9RVUVVRSAtIHFsZW47CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9TRVFfR0VUVElNRToKKwkJCWlmIChzZXFfbW9kZSA9PSBTRVFfMikKKwkJCQlyZXR1cm4gdG1yLT5pb2N0bCh0bXJfbm8sIGNtZCwgYXJnKTsKKwkJCXZhbCA9IGppZmZpZXMgLSBzZXFfdGltZTsKKwkJCWJyZWFrOworCisJCWNhc2UgU05EQ1RMX1NFUV9DVFJMUkFURToKKwkJCS8qCisJCQkgKiBJZiAqYXJnID09IDAsIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHJhdGUKKwkJCSAqLworCQkJaWYgKHNlcV9tb2RlID09IFNFUV8yKQorCQkJCXJldHVybiB0bXItPmlvY3RsKHRtcl9ubywgY21kLCBhcmcpOworCisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh2YWwgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXZhbCA9IEhaOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfU0VRX1JFU0VUU0FNUExFUzoKKwkJY2FzZSBTTkRDVExfU1lOVEhfUkVNT1ZFU0FNUExFOgorCQljYXNlIFNORENUTF9TWU5USF9DT05UUk9MOgorCQkJaWYgKGdldF91c2VyKGRldiwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX3N5bnRocyB8fCBzeW50aF9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJaWYgKCEoc3ludGhfb3Blbl9tYXNrICYgKDEgPDwgZGV2KSkgJiYgIW9yaWdfZGV2KQorCQkJCXJldHVybiAtRUJVU1k7CisJCQlyZXR1cm4gc3ludGhfZGV2c1tkZXZdLT5pb2N0bChkZXYsIGNtZCwgYXJnKTsKKworCQljYXNlIFNORENUTF9TRVFfTlJTWU5USFM6CisJCQl2YWwgPSBtYXhfc3ludGhkZXY7CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9TRVFfTlJNSURJUzoKKwkJCXZhbCA9IG1heF9taWRpZGV2OworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfU1lOVEhfTUVNQVZMOgorCQkJaWYgKGdldF91c2VyKGRldiwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX3N5bnRocyB8fCBzeW50aF9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJaWYgKCEoc3ludGhfb3Blbl9tYXNrICYgKDEgPDwgZGV2KSkgJiYgIW9yaWdfZGV2KQorCQkJCXJldHVybiAtRUJVU1k7CisJCQl2YWwgPSBzeW50aF9kZXZzW2Rldl0tPmlvY3RsKGRldiwgY21kLCBhcmcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfRk1fNE9QX0VOQUJMRToKKwkJCWlmIChnZXRfdXNlcihkZXYsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGRldiA8IDAgfHwgZGV2ID49IG51bV9zeW50aHMgfHwgc3ludGhfZGV2c1tkZXZdID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCWlmICghKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IGRldikpKQorCQkJCXJldHVybiAtRU5YSU87CisJCQlzeW50aF9kZXZzW2Rldl0tPmlvY3RsKGRldiwgY21kLCBhcmcpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfU1lOVEhfSU5GTzoKKwkJCWlmIChnZXRfdXNlcihkZXYsICYoKHN0cnVjdCBzeW50aF9pbmZvIF9fdXNlciAqKWFyZyktPmRldmljZSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbWF4X3N5bnRoZGV2KQorCQkJCXJldHVybiAtRU5YSU87CisJCQlpZiAoIShzeW50aF9vcGVuX21hc2sgJiAoMSA8PCBkZXYpKSAmJiAhb3JpZ19kZXYpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCXJldHVybiBzeW50aF9kZXZzW2Rldl0tPmlvY3RsKGRldiwgY21kLCBhcmcpOworCisJCS8qIExpa2UgU1lOVEhfSU5GTyBidXQgcmV0dXJucyBJRCBpbiB0aGUgbmFtZSBmaWVsZCAqLworCQljYXNlIFNORENUTF9TWU5USF9JRDoKKwkJCWlmIChnZXRfdXNlcihkZXYsICYoKHN0cnVjdCBzeW50aF9pbmZvIF9fdXNlciAqKWFyZyktPmRldmljZSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbWF4X3N5bnRoZGV2KQorCQkJCXJldHVybiAtRU5YSU87CisJCQlpZiAoIShzeW50aF9vcGVuX21hc2sgJiAoMSA8PCBkZXYpKSAmJiAhb3JpZ19kZXYpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCW1lbWNweSgmaW5mLCBzeW50aF9kZXZzW2Rldl0tPmluZm8sIHNpemVvZihpbmYpKTsKKwkJCXN0cmxjcHkoaW5mLm5hbWUsIHN5bnRoX2RldnNbZGV2XS0+aWQsIHNpemVvZihpbmYubmFtZSkpOworCQkJaW5mLmRldmljZSA9IGRldjsKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJnLCAmaW5mLCBzaXplb2YoaW5mKSk/LUVGQVVMVDowOworCisJCWNhc2UgU05EQ1RMX1NFUV9PVVRPRkJBTkQ6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmV2ZW50X3JlYywgYXJnLCBzaXplb2YoZXZlbnRfcmVjKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisJCQlwbGF5X2V2ZW50KGV2ZW50X3JlYy5hcnIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9NSURJX0lORk86CisJCQlpZiAoZ2V0X3VzZXIoZGV2LCAmKChzdHJ1Y3QgbWlkaV9pbmZvIF9fdXNlciAqKWFyZyktPmRldmljZSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbWF4X21pZGlkZXYgfHwgIW1pZGlfZGV2c1tkZXZdKQorCQkJCXJldHVybiAtRU5YSU87CisJCQltaWRpX2RldnNbZGV2XS0+aW5mby5kZXZpY2UgPSBkZXY7CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZywgJm1pZGlfZGV2c1tkZXZdLT5pbmZvLCBzaXplb2Yoc3RydWN0IG1pZGlfaW5mbykpPy1FRkFVTFQ6MDsKKworCQljYXNlIFNORENUTF9TRVFfVEhSRVNIT0xEOgorCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAodmFsIDwgMSkKKwkJCQl2YWwgPSAxOworCQkJaWYgKHZhbCA+PSBTRVFfTUFYX1FVRVVFKQorCQkJCXZhbCA9IFNFUV9NQVhfUVVFVUUgLSAxOworCQkJb3V0cHV0X3RocmVzaG9sZCA9IHZhbDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX01JRElfUFJFVElNRToKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHZhbCA8IDApCisJCQkJdmFsID0gMDsKKwkJCXZhbCA9IChIWiAqIHZhbCkgLyAxMDsKKwkJCXByZV9ldmVudF90aW1lb3V0ID0gdmFsOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChtb2RlID09IE9QRU5fUkVBRCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWlmICghc3ludGhfZGV2c1swXSkKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJaWYgKCEoc3ludGhfb3Blbl9tYXNrICYgKDEgPDwgMCkpKQorCQkJCXJldHVybiAtRU5YSU87CisJCQlpZiAoIXN5bnRoX2RldnNbMF0tPmlvY3RsKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIHN5bnRoX2RldnNbMF0tPmlvY3RsKDAsIGNtZCwgYXJnKTsKKwl9CisJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UncmUgdXNpbmcgdGhlIGdsb2JhbCBpcnEgbG9jayBoZXJlICovCit1bnNpZ25lZCBpbnQgc2VxdWVuY2VyX3BvbGwoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJZGV2ID0gZGV2ID4+IDQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisJLyogaW5wdXQgKi8KKwlwb2xsX3dhaXQoZmlsZSwgJm1pZGlfc2xlZXBlciwgd2FpdCk7CisJaWYgKGlxbGVuKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwkvKiBvdXRwdXQgKi8KKwlwb2xsX3dhaXQoZmlsZSwgJnNlcV9zbGVlcGVyLCB3YWl0KTsKKwlpZiAoKFNFUV9NQVhfUVVFVUUgLSBxbGVuKSA+PSBvdXRwdXRfdGhyZXNob2xkKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCisKK3ZvaWQgc2VxdWVuY2VyX3RpbWVyKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisJc2VxX3N0YXJ0cGxheSgpOworfQorCitpbnQgbm90ZV90b19mcmVxKGludCBub3RlX251bSkKK3sKKworCS8qCisJICogVGhpcyByb3V0aW5lIGNvbnZlcnRzIGEgbWlkaSBub3RlIHRvIGEgZnJlcXVlbmN5IChtdWx0aXBsaWVkIGJ5IDEwMDApCisJICovCisKKwlpbnQgbm90ZSwgb2N0YXZlLCBub3RlX2ZyZXE7CisJc3RhdGljIGludCBub3Rlc1tdID0KKwl7CisJCTI2MTYzMiwgMjc3MTg5LCAyOTM2NzEsIDMxMTEzMiwgMzI5NjMyLCAzNDkyMzIsCisJCTM2OTk5OCwgMzkxOTk4LCA0MTUzMDYsIDQ0MDAwMCwgNDY2MTYyLCA0OTM4ODAKKwl9OworCisjZGVmaW5lIEJBU0VfT0NUQVZFCTUKKworCW9jdGF2ZSA9IG5vdGVfbnVtIC8gMTI7CisJbm90ZSA9IG5vdGVfbnVtICUgMTI7CisKKwlub3RlX2ZyZXEgPSBub3Rlc1tub3RlXTsKKworCWlmIChvY3RhdmUgPCBCQVNFX09DVEFWRSkKKwkJbm90ZV9mcmVxID4+PSAoQkFTRV9PQ1RBVkUgLSBvY3RhdmUpOworCWVsc2UgaWYgKG9jdGF2ZSA+IEJBU0VfT0NUQVZFKQorCQlub3RlX2ZyZXEgPDw9IChvY3RhdmUgLSBCQVNFX09DVEFWRSk7CisKKwkvKgorCSAqIG5vdGVfZnJlcSA+Pj0gMTsKKwkgKi8KKworCXJldHVybiBub3RlX2ZyZXE7Cit9CisKK3Vuc2lnbmVkIGxvbmcgY29tcHV0ZV9maW5ldHVuZSh1bnNpZ25lZCBsb25nIGJhc2VfZnJlcSwgaW50IGJlbmQsIGludCByYW5nZSwKKwkJIGludCB2aWJyYXRvX2NlbnRzKQoreworCXVuc2lnbmVkIGxvbmcgYW1vdW50OworCWludCBuZWdhdGl2ZSwgc2VtaXRvbmVzLCBjZW50cywgbXVsdGlwbGllciA9IDE7CisKKwlpZiAoIWJlbmQpCisJCXJldHVybiBiYXNlX2ZyZXE7CisJaWYgKCFyYW5nZSkKKwkJcmV0dXJuIGJhc2VfZnJlcTsKKworCWlmICghYmFzZV9mcmVxKQorCQlyZXR1cm4gYmFzZV9mcmVxOworCisJaWYgKHJhbmdlID49IDgxOTIpCisJCXJhbmdlID0gODE5MjsKKworCWJlbmQgPSBiZW5kICogcmFuZ2UgLyA4MTkyOwkvKiBDb252ZXJ0IHRvIGNlbnRzICovCisJYmVuZCArPSB2aWJyYXRvX2NlbnRzOworCisJaWYgKCFiZW5kKQorCQlyZXR1cm4gYmFzZV9mcmVxOworCisJbmVnYXRpdmUgPSBiZW5kIDwgMCA/IDEgOiAwOworCisJaWYgKGJlbmQgPCAwKQorCQliZW5kICo9IC0xOworCWlmIChiZW5kID4gcmFuZ2UpCisJCWJlbmQgPSByYW5nZTsKKworCS8qCisJICAgaWYgKGJlbmQgPiAyMzk5KQorCSAgIGJlbmQgPSAyMzk5OworCSAqLworCXdoaWxlIChiZW5kID4gMjM5OSkKKwl7CisJCW11bHRpcGxpZXIgKj0gNDsKKwkJYmVuZCAtPSAyNDAwOworCX0KKworCXNlbWl0b25lcyA9IGJlbmQgLyAxMDA7CisJaWYgKHNlbWl0b25lcyA+IDk5KQorCQlzZW1pdG9uZXMgPSA5OTsKKwljZW50cyA9IGJlbmQgJSAxMDA7CisKKwlhbW91bnQgPSAoaW50KSAoc2VtaXRvbmVfdHVuaW5nW3NlbWl0b25lc10gKiBtdWx0aXBsaWVyICogY2VudF90dW5pbmdbY2VudHNdKSAvIDEwMDAwOworCisJaWYgKG5lZ2F0aXZlKQorCQlyZXR1cm4gKGJhc2VfZnJlcSAqIDEwMDAwKSAvIGFtb3VudDsJLyogQmVuZCBkb3duICovCisJZWxzZQorCQlyZXR1cm4gKGJhc2VfZnJlcSAqIGFtb3VudCkgLyAxMDAwMDsJLyogQmVuZCB1cCAqLworfQorCisKK3ZvaWQgc2VxdWVuY2VyX2luaXQodm9pZCkKK3sKKwkvKiBkcmFnIGluIHNlcXVlbmNlcl9zeW1zLm8gKi8KKwl7CisJCWV4dGVybiBjaGFyIHNlcXVlbmNlcl9zeW1zX3N5bWJvbDsKKwkJc2VxdWVuY2VyX3N5bXNfc3ltYm9sID0gMDsKKwl9CisKKwlpZiAoc2VxdWVuY2VyX29rKQorCQlyZXR1cm47CisJTUlESWJ1Zl9pbml0KCk7CisJcXVldWUgPSAodW5zaWduZWQgY2hhciAqKXZtYWxsb2MoU0VRX01BWF9RVUVVRSAqIEVWX1NaKTsKKwlpZiAocXVldWUgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAic2VxdWVuY2VyOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNlcXVlbmNlciBvdXRwdXQgcXVldWVcbiIpOworCQlyZXR1cm47CisJfQorCWlxdWV1ZSA9ICh1bnNpZ25lZCBjaGFyICopdm1hbGxvYyhTRVFfTUFYX1FVRVVFICogSUVWX1NaKTsKKwlpZiAoaXF1ZXVlID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9FUlIgInNlcXVlbmNlcjogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzZXF1ZW5jZXIgaW5wdXQgcXVldWVcbiIpOworCQl2ZnJlZShxdWV1ZSk7CisJCXJldHVybjsKKwl9CisJc2VxdWVuY2VyX29rID0gMTsKK30KKwordm9pZCBzZXF1ZW5jZXJfdW5sb2FkKHZvaWQpCit7CisJaWYocXVldWUpCisJeworCQl2ZnJlZShxdWV1ZSk7CisJCXF1ZXVlPU5VTEw7CisJfQorCWlmKGlxdWV1ZSkKKwl7CisJCXZmcmVlKGlxdWV1ZSk7CisJCWlxdWV1ZT1OVUxMOworCX0KK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zZXF1ZW5jZXJfc3ltcy5jIGIvc291bmQvb3NzL3NlcXVlbmNlcl9zeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlZGZkNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zZXF1ZW5jZXJfc3ltcy5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBFeHBvcnRlZCBzeW1ib2xzIGZvciBzZXF1ZW5jZXIgZHJpdmVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworY2hhciBzZXF1ZW5jZXJfc3ltc19zeW1ib2w7CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJzb3VuZF9jYWxscy5oIgorCitFWFBPUlRfU1lNQk9MKG5vdGVfdG9fZnJlcSk7CitFWFBPUlRfU1lNQk9MKGNvbXB1dGVfZmluZXR1bmUpOworRVhQT1JUX1NZTUJPTChzZXFfY29weV90b19pbnB1dCk7CitFWFBPUlRfU1lNQk9MKHNlcV9pbnB1dF9ldmVudCk7CitFWFBPUlRfU1lNQk9MKHNlcXVlbmNlcl9pbml0KTsKK0VYUE9SVF9TWU1CT0woc2VxdWVuY2VyX3RpbWVyKTsKKworRVhQT1JUX1NZTUJPTChzb3VuZF90aW1lcl9pbml0KTsKK0VYUE9SVF9TWU1CT0woc291bmRfdGltZXJfaW50ZXJydXB0KTsKK0VYUE9SVF9TWU1CT0woc291bmRfdGltZXJfc3luY2ludGVydmFsKTsKK0VYUE9SVF9TWU1CT0wocmVwcm9ncmFtX3RpbWVyKTsKKworLyogVHVuaW5nICovCisKKyNkZWZpbmUgX1NFUVVFTkNFUl9DXworI2luY2x1ZGUgInR1bmluZy5oIgorCitFWFBPUlRfU1lNQk9MKGNlbnRfdHVuaW5nKTsKK0VYUE9SVF9TWU1CT0woc2VtaXRvbmVfdHVuaW5nKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zZ2FsYXh5LmMgYi9zb3VuZC9vc3Mvc2dhbGF4eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzJkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2dhbGF4eS5jCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogc291bmQvc2dhbGF4eS5jCisgKgorICogTG93IGxldmVsIGRyaXZlciBmb3IgQXp0ZWNoIFNvdW5kIEdhbGF4eSBjYXJkcy4KKyAqIENvcHlyaWdodCAxOTk4IEFydHVyIFNrYXdpbmEgPHNrYXdpbmFAZ2VvY2l0aWVzLmNvbT4KKyAqCisgKiBTdXBwb3J0ZWQgY2FyZHM6CisgKiAgICBBenRlY2ggU291bmQgR2FsYXh5IFdhdmVyaWRlciBQcm8gMzIgLSAzRAorICogICAgQXp0ZWNoIFNvdW5kIEdhbGF4eSBXYXNoaW5ndG9uIDE2CisgKgorICogQmFzZWQgb24gY3M0MjMyLmMgYnkgSGFubnUgU2F2b2xhaW5lbiBhbmQgQWxhbiBDb3guCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqIENoYW5nZXM6CisgKiAxMS0xMC0yMDAwCUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGJrekBsaW51eC1pZGUub3JnPgorICoJCUFkZGVkIF9faW5pdCB0byBzYl9yc3QoKSBhbmQgc2JfY21kKCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAiYWQxODQ4LmgiCisKK3N0YXRpYyB2b2lkIHNsZWVwKCB1bnNpZ25lZCBob3dsb25nICkKK3sKKwljdXJyZW50LT5zdGF0ZSAgID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlX3RpbWVvdXQoaG93bG9uZyk7Cit9CisKKyNkZWZpbmUgRFBPUlQgMHg4MAorCisvKiBTb3VuZCBCbGFzdGVyIHJlZ3MgKi8KKworI2RlZmluZSBTQkRTUF9SRVNFVCAgICAgIDB4NgorI2RlZmluZSBTQkRTUF9SRUFEICAgICAgIDB4QQorI2RlZmluZSBTQkRTUF9DT01NQU5EICAgIDB4QworI2RlZmluZSBTQkRTUF9TVEFUVVMgICAgIFNCRFNQX0NPTU1BTkQKKyNkZWZpbmUgU0JEU1BfREFUQV9BVkFJTCAweEUKKworc3RhdGljIGludCBfX2luaXQgc2JfcnN0KGludCBiYXNlKQoreworCWludCAgIGk7CisgICAKKwlvdXRiKCAxLCBiYXNlK1NCRFNQX1JFU0VUICk7ICAgICAvKiByZXNldCB0aGUgRFNQICovCisJb3V0YiggMCwgYmFzZStTQkRTUF9SRVNFVCApOworICAgIAorCWZvciAoIGk9MDsgaTw1MDA7IGkrKyApICAgICAgICAgIC8qIGRlbGF5ICovCisJCWluYihEUE9SVCk7CisgICAgICAKKwlmb3IgKCBpPTA7IGk8MTAwMDAwOyBpKysgKQorCXsKKwkJaWYgKCBpbmIoIGJhc2UrU0JEU1BfREFUQV9BVkFJTCApJjB4ODAgKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCBpbmIoIGJhc2UrU0JEU1BfUkVBRCApIT0weEFBICkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2JfY21kKCBpbnQgYmFzZSwgdW5zaWduZWQgY2hhciB2YWwgKQoreworCWludCAgaTsKKworCWZvciAoIGk9MTAwMDAwOyBpOyBpLS0gKQorCXsKKwkJaWYgKCAoaW5iKCBiYXNlK1NCRFNQX1NUQVRVUyApJjB4ODApPT0wICkKKwkJeworICAgICAgICAJCW91dGIoIHZhbCwgYmFzZStTQkRTUF9DT01NQU5EICk7CisgICAgICAgIAkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGk7ICAgICAgLyogaT4wID09IHN1Y2Nlc3MgKi8KK30KKworCisjZGVmaW5lIGFpX3NnYmFzZSAgICBkcml2ZXJfdXNlXzEKKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfc2dhbGF4eSggc3RydWN0IGFkZHJlc3NfaW5mbyAqYWkgKQoreworCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7CisJaW50IG47CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFpLT5pb19iYXNlLCA0LCAiV1NTIGNvbmZpZyIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2dhbGF4eTogV1NTIElPIHBvcnQgMHglMDN4IG5vdCBhdmFpbGFibGVcbiIsIGFpLT5pb19iYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihhaS0+aW9fYmFzZSArIDQsIDQsICJhZDE4NDgiKTsKKwlpZiAoIXBvcnRzKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2dhbGF4eTogV1NTIElPIHBvcnQgMHglMDN4IG5vdCBhdmFpbGFibGVcbiIsIGFpLT5pb19iYXNlKTsKKwkJcmVsZWFzZV9yZWdpb24oYWktPmlvX2Jhc2UsIDQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKCBhaS0+YWlfc2diYXNlLCAweDEwLCAiU291bmRHYWxheHkgU0IiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNnYWxheHk6IFNCIElPIHBvcnQgMHglMDN4IG5vdCBhdmFpbGFibGVcbiIsIGFpLT5haV9zZ2Jhc2UpOworCQlyZWxlYXNlX3JlZ2lvbihhaS0+aW9fYmFzZSArIDQsIDQpOworCQlyZWxlYXNlX3JlZ2lvbihhaS0+aW9fYmFzZSwgNCk7CisJCXJldHVybiAwOworCX0KKyAgICAgICAgCisJaWYgKGFkMTg0OF9kZXRlY3QocG9ydHMsIE5VTEwsIGFpLT5vc3ApKQorCQlnb3RvIG91dDsgIC8qIFRoZSBjYXJkIGlzIGFscmVhZHkgYWN0aXZlLCBjaGVjayBpcnEgZXRjLi4uICovCisgICAgICAgIAorCS8qIHN3aXRjaCB0byBNU1MvV1NTIG1vZGUgKi8KKyAgIAorCXNiX3JzdCggYWktPmFpX3NnYmFzZSApOworICAgCisJc2JfY21kKCBhaS0+YWlfc2diYXNlLCA5ICk7CisJc2JfY21kKCBhaS0+YWlfc2diYXNlLCAwICk7CisKKwlzbGVlcCggSFovMTAgKTsKKworb3V0OgorICAgICAgCWlmICghcHJvYmVfbXNfc291bmQoYWksIHBvcnRzKSkgeworCQlyZWxlYXNlX3JlZ2lvbihhaS0+aW9fYmFzZSArIDQsIDQpOworCQlyZWxlYXNlX3JlZ2lvbihhaS0+aW9fYmFzZSwgNCk7CisJCXJlbGVhc2VfcmVnaW9uKGFpLT5haV9zZ2Jhc2UsIDB4MTApOworCQlyZXR1cm4gMDsKKwl9CisKKwlhdHRhY2hfbXNfc291bmQoYWksIHBvcnRzLCBUSElTX01PRFVMRSk7CisJbj1haS0+c2xvdHNbMF07CisJCisJaWYgKG4hPS0xICYmIGF1ZGlvX2RldnNbbl0tPm1peGVyX2RldiAhPSAtMSApIHsKKwkJQUQxODQ4X1JFUk9VVEUoIFNPVU5EX01JWEVSX0xJTkUxLCBTT1VORF9NSVhFUl9MSU5FICk7ICAgLyogTGluZS1pbiAqLworCQlBRDE4NDhfUkVST1VURSggU09VTkRfTUlYRVJfTElORTIsIFNPVU5EX01JWEVSX1NZTlRIICk7ICAvKiBGTStXYXZldGFibGUqLworCQlBRDE4NDhfUkVST1VURSggU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX0NEICk7ICAgICAvKiBDRCAqLworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9zZ2FsYXh5KCBzdHJ1Y3QgYWRkcmVzc19pbmZvICphaSApCit7CisJdW5sb2FkX21zX3NvdW5kKCBhaSApOworCXJlbGVhc2VfcmVnaW9uKCBhaS0+YWlfc2diYXNlLCAweDEwICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGlvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMgk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIHNnYmFzZQk9IC0xOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNnYmFzZSwgaW50LCAwKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zZ2FsYXh5KHZvaWQpCit7CisJY2ZnLmlvX2Jhc2UgICA9IGlvOworCWNmZy5pcnEgICAgICAgPSBpcnE7CisJY2ZnLmRtYSAgICAgICA9IGRtYTsKKwljZmcuZG1hMiAgICAgID0gZG1hMjsKKwljZmcuYWlfc2diYXNlID0gc2diYXNlOworCisJaWYgKGNmZy5pb19iYXNlID09IC0xIHx8IGNmZy5pcnEgPT0gLTEgfHwgY2ZnLmRtYSA9PSAtMSB8fCBjZmcuYWlfc2diYXNlID09IC0xICkgeworCQlwcmludGsoS0VSTl9FUlIgInNnYWxheHk6IGlvLCBpcnEsIGRtYSBhbmQgc2diYXNlIG11c3QgYmUgc2V0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICggcHJvYmVfc2dhbGF4eSgmY2ZnKSA9PSAwICkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfc2dhbGF4eSh2b2lkKQoreworCXVubG9hZF9zZ2FsYXh5KCZjZmcpOworfQorCittb2R1bGVfaW5pdChpbml0X3NnYWxheHkpOworbW9kdWxlX2V4aXQoY2xlYW51cF9zZ2FsYXh5KTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3NnYWxheHkoY2hhciAqc3RyKQoreworCS8qIGlvLCBpcnEsIGRtYSwgZG1hMiwgc2diYXNlICovCisJaW50IGludHNbNl07CisJCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKwlpbwk9IGludHNbMV07CisJaXJxCT0gaW50c1syXTsKKwlkbWEJPSBpbnRzWzNdOworCWRtYTIJPSBpbnRzWzRdOworCXNnYmFzZQk9IGludHNbNV07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgic2dhbGF4eT0iLCBzZXR1cF9zZ2FsYXh5KTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NoX2RhY19hdWRpby5jIGIvc291bmQvb3NzL3NoX2RhY19hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWNkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2hfZGFjX2F1ZGlvLmMKQEAgLTAsMCArMSwzMjUgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vY3B1L2RhYy5oPgorCisjaWZkZWYgTUFDSF9IUDYwMAorI2luY2x1ZGUgPGFzbS9ocDZ4eC9ocDZ4eC5oPgorI2luY2x1ZGUgPGFzbS9oZDY0NDYxL2hkNjQ0NjEuaD4KKyNlbmRpZgorCisjZGVmaW5lIE1PRE5BTUUgInNoX2RhY19hdWRpbyIKKworI2RlZmluZSBUTVVfVE9DUl9JTklUCTB4MDAKKworI2RlZmluZSBUTVUxX1RDUl9JTklUCTB4MDAyMAkvKiBDbG9jay80LCByaXNpbmcgZWRnZTsgaW50ZXJydXB0IG9uICovCisjZGVmaW5lIFRNVTFfVFNUUl9JTklUICAweDAyCS8qIEJpdCB0byB0dXJuIG9uIFRNVTEgKi8KKworI2RlZmluZSBUTVVfVFNUUgkweGZmZmZmZTkyCisjZGVmaW5lIFRNVTFfVENPUgkweGZmZmZmZWEwCisjZGVmaW5lIFRNVTFfVENOVAkweGZmZmZmZWE0CisjZGVmaW5lIFRNVTFfVENSCTB4ZmZmZmZlYTgKKworI2RlZmluZSBCVUZGRVJfU0laRSA0ODAwMAorCitzdGF0aWMgaW50IHJhdGU7CitzdGF0aWMgaW50IGVtcHR5Oworc3RhdGljIGNoYXIgKmRhdGFfYnVmZmVyLCAqYnVmZmVyX2JlZ2luLCAqYnVmZmVyX2VuZDsKK3N0YXRpYyBpbnQgaW5fdXNlLCBkZXZpY2VfbWFqb3I7CisKK3N0YXRpYyB2b2lkIGRhY19hdWRpb19zdGFydF90aW1lcih2b2lkKQoreworCXU4IHRzdHI7CisKKwl0c3RyID0gY3RybF9pbmIoVE1VX1RTVFIpOworCXRzdHIgfD0gVE1VMV9UU1RSX0lOSVQ7CisJY3RybF9vdXRiKHRzdHIsIFRNVV9UU1RSKTsKK30KKworc3RhdGljIHZvaWQgZGFjX2F1ZGlvX3N0b3BfdGltZXIodm9pZCkKK3sKKwl1OCB0c3RyOworCisJdHN0ciA9IGN0cmxfaW5iKFRNVV9UU1RSKTsKKwl0c3RyICY9IH5UTVUxX1RTVFJfSU5JVDsKKwljdHJsX291dGIodHN0ciwgVE1VX1RTVFIpOworfQorCitzdGF0aWMgdm9pZCBkYWNfYXVkaW9fcmVzZXQodm9pZCkKK3sKKwlkYWNfYXVkaW9fc3RvcF90aW1lcigpOworCWJ1ZmZlcl9iZWdpbiA9IGJ1ZmZlcl9lbmQgPSBkYXRhX2J1ZmZlcjsKKwllbXB0eSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGRhY19hdWRpb19zeW5jKHZvaWQpCit7CisJd2hpbGUgKCFlbXB0eSkKKwkJc2NoZWR1bGUoKTsKK30KKworc3RhdGljIHZvaWQgZGFjX2F1ZGlvX3N0YXJ0KHZvaWQpCit7CisjaWZkZWYgTUFDSF9IUDYwMAorCXUxNiB2OworCXYgPSBpbncoSEQ2NDQ2MV9HUEFEUik7CisJdiAmPSB+SEQ2NDQ2MV9HUEFEUl9TUEVBS0VSOworCW91dHcodiwgSEQ2NDQ2MV9HUEFEUik7CisjZW5kaWYKKwlzaF9kYWNfZW5hYmxlKENPTkZJR19TT1VORF9TSF9EQUNfQVVESU9fQ0hBTk5FTCk7CisJY3RybF9vdXR3KFRNVTFfVENSX0lOSVQsIFRNVTFfVENSKTsKK30KK3N0YXRpYyB2b2lkIGRhY19hdWRpb19zdG9wKHZvaWQpCit7CisjaWZkZWYgTUFDSF9IUDYwMAorCXUxNiB2OworI2VuZGlmCisJZGFjX2F1ZGlvX3N0b3BfdGltZXIoKTsKKyNpZmRlZiBNQUNIX0hQNjAwCisJdiA9IGludyhIRDY0NDYxX0dQQURSKTsKKwl2IHw9IEhENjQ0NjFfR1BBRFJfU1BFQUtFUjsKKwlvdXR3KHYsIEhENjQ0NjFfR1BBRFIpOworI2VuZGlmCisJc2hfZGFjX2Rpc2FibGUoQ09ORklHX1NPVU5EX1NIX0RBQ19BVURJT19DSEFOTkVMKTsKK30KKworc3RhdGljIHZvaWQgZGFjX2F1ZGlvX3NldF9yYXRlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKKworCWludGVydmFsID0gKGN1cnJlbnRfY3B1X2RhdGEubW9kdWxlX2Nsb2NrIC8gNCkgLyByYXRlOworCWN0cmxfb3V0bChpbnRlcnZhbCwgVE1VMV9UQ09SKTsKKwljdHJsX291dGwoaW50ZXJ2YWwsIFRNVTFfVENOVCk7Cit9CisKK3N0YXRpYyBpbnQgZGFjX2F1ZGlvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWRhY19hdWRpb19zeW5jKCk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlkYWNfYXVkaW9fcmVzZXQoKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfVTgsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfVTgsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfUkFURToKKwkJdmFsID0gKihpbnQgKilhcmc7CisJCWlmICh2YWwgPiAwKSB7CisJCQlyYXRlID0gdmFsOworCQkJZGFjX2F1ZGlvX3NldF9yYXRlKCk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHJhdGUsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIChpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcigxLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTTkRDVExfRFNQX1BST0ZJTEU6CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCXJldHVybiBwdXRfdXNlcihCVUZGRVJfU0laRSwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJzaF9kYWNfYXVkaW86IHVuaW1wbGVtZW50ZWQgaW9jdGw9MHgleFxuIiwKKwkJICAgICAgIGNtZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QgZGFjX2F1ZGlvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgICBsb2ZmX3QgKiBwcG9zKQoreworCWludCBmcmVlOworCWludCBuYnl0ZXM7CisKKwlpZiAoY291bnQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY291bnQpIHsKKwkJZGFjX2F1ZGlvX3N5bmMoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZnJlZSA9IGJ1ZmZlcl9iZWdpbiAtIGJ1ZmZlcl9lbmQ7CisKKwlpZiAoZnJlZSA8IDApCisJCWZyZWUgKz0gQlVGRkVSX1NJWkU7CisJaWYgKChmcmVlID09IDApICYmIChlbXB0eSkpCisJCWZyZWUgPSBCVUZGRVJfU0laRTsKKwlpZiAoY291bnQgPiBmcmVlKQorCQljb3VudCA9IGZyZWU7CisJaWYgKGJ1ZmZlcl9iZWdpbiA+IGJ1ZmZlcl9lbmQpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopYnVmZmVyX2VuZCwgYnVmLCBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlidWZmZXJfZW5kICs9IGNvdW50OworCX0gZWxzZSB7CisJCW5ieXRlcyA9IGRhdGFfYnVmZmVyICsgQlVGRkVSX1NJWkUgLSBidWZmZXJfZW5kOworCQlpZiAobmJ5dGVzID4gY291bnQpIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKWJ1ZmZlcl9lbmQsIGJ1ZiwgY291bnQpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnVmZmVyX2VuZCArPSBjb3VudDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKWJ1ZmZlcl9lbmQsIGJ1ZiwgbmJ5dGVzKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgodm9pZCAqKWRhdGFfYnVmZmVyLCBidWYgKyBuYnl0ZXMsIGNvdW50IC0gbmJ5dGVzKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJ1ZmZlcl9lbmQgPSBkYXRhX2J1ZmZlciArIGNvdW50IC0gbmJ5dGVzOworCQl9CisJfQorCisJaWYgKGVtcHR5KSB7CisJCWVtcHR5ID0gMDsKKwkJZGFjX2F1ZGlvX3N0YXJ0X3RpbWVyKCk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBkYWNfYXVkaW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgICAgICBsb2ZmX3QgKiBwcG9zKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGRhY19hdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoaW5fdXNlKQorCQlyZXR1cm4gLUVCVVNZOworCisJaW5fdXNlID0gMTsKKworCWRhY19hdWRpb19zdGFydCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFjX2F1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZGFjX2F1ZGlvX3N5bmMoKTsKKwlkYWNfYXVkaW9fc3RvcCgpOworCWluX3VzZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkYWNfYXVkaW9fZm9wcyA9IHsKKyAgICAgIC5yZWFkID0JCWRhY19hdWRpb19yZWFkLAorICAgICAgLndyaXRlID0JZGFjX2F1ZGlvX3dyaXRlLAorICAgICAgLmlvY3RsID0JZGFjX2F1ZGlvX2lvY3RsLAorICAgICAgLm9wZW4gPQkJZGFjX2F1ZGlvX29wZW4sCisgICAgICAucmVsZWFzZSA9CWRhY19hdWRpb19yZWxlYXNlLAorfTsKKworc3RhdGljIGlycXJldHVybl90IHRpbWVyMV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXR1czsKKworCXRpbWVyX3N0YXR1cyA9IGN0cmxfaW53KFRNVTFfVENSKTsKKwl0aW1lcl9zdGF0dXMgJj0gfjB4MTAwOworCWN0cmxfb3V0dyh0aW1lcl9zdGF0dXMsIFRNVTFfVENSKTsKKworCWlmICghZW1wdHkpIHsKKwkJc2hfZGFjX291dHB1dCgqYnVmZmVyX2JlZ2luLCBDT05GSUdfU09VTkRfU0hfREFDX0FVRElPX0NIQU5ORUwpOworCQlidWZmZXJfYmVnaW4rKzsKKworCQlpZiAoYnVmZmVyX2JlZ2luID09IGRhdGFfYnVmZmVyICsgQlVGRkVSX1NJWkUpCisJCQlidWZmZXJfYmVnaW4gPSBkYXRhX2J1ZmZlcjsKKwkJaWYgKGJ1ZmZlcl9iZWdpbiA9PSBidWZmZXJfZW5kKSB7CisJCQllbXB0eSA9IDE7CisJCQlkYWNfYXVkaW9fc3RvcF90aW1lcigpOworCQl9CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2luaXQgZGFjX2F1ZGlvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKChkZXZpY2VfbWFqb3IgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmRhY19hdWRpb19mb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCByZWdpc3RlciBkc3AgZGV2aWNlIik7CisJCXJldHVybiBkZXZpY2VfbWFqb3I7CisJfQorCisJaW5fdXNlID0gMDsKKworCWRhdGFfYnVmZmVyID0gKGNoYXIgKilrbWFsbG9jKEJVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YV9idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYWNfYXVkaW9fcmVzZXQoKTsKKwlyYXRlID0gODAwMDsKKwlkYWNfYXVkaW9fc2V0X3JhdGUoKTsKKworCXJldHZhbCA9CisJICAgIHJlcXVlc3RfaXJxKFRJTUVSMV9JUlEsIHRpbWVyMV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgTU9ETkFNRSwgMCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzaF9kYWNfYXVkaW86IElSUSAlZCByZXF1ZXN0IGZhaWxlZFxuIiwKKwkJICAgICAgIFRJTUVSMV9JUlEpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGFjX2F1ZGlvX2V4aXQodm9pZCkKK3sKKwlmcmVlX2lycShUSU1FUjFfSVJRLCAwKTsKKworCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldmljZV9tYWpvcik7CisJa2ZyZWUoKHZvaWQgKilkYXRhX2J1ZmZlcik7Cit9CisKK21vZHVsZV9pbml0KGRhY19hdWRpb19pbml0KTsKK21vZHVsZV9leGl0KGRhY19hdWRpb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kcml5IFNrdWx5c2gsIGFza3VseXNoQGltYWdlLmtpZXYudWEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0ggREFDIHNvdW5kIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NrZWxldG9uLmMgYi9zb3VuZC9vc3Mvc2tlbGV0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmVhNzgzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NrZWxldG9uLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKglQQ0kgc291bmQgc2tlbGV0b24gZXhhbXBsZQorICoKKyAqCShjKSAxOTk4IFJlZCBIYXQgU29mdHdhcmUKKyAqCisgKglUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIAorICoJdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IAorICoJcmVmZXJlbmNlLgorICoKKyAqCVRoaXMgZXhhbXBsZSBpcyBkZXNpZ25lZCB0byBiZSBidWlsdCBpbiB0aGUgbGludXgvZHJpdmVycy9zb3VuZAorICoJZGlyZWN0b3J5IGFzIHBhcnQgb2YgYSBrZXJuZWwgYnVpbGQuIFRoZSBleGFtcGxlIGlzIG1vZHVsYXIgb25seQorICoJZHJvcCBtZSBhIG5vdGUgb25jZSB5b3UgaGF2ZSBhIHdvcmtpbmcgbW9kdWxhciBkcml2ZXIgYW5kIHdhbnQKKyAqCXRvIGludGVncmF0ZSBpdCB3aXRoIHRoZSBtYWluIGNvZGUuCisgKgkJLS0gQWxhbiA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqCVRoaXMgaXMgYSBmaXJzdCBkcmFmdC4gUGxlYXNlIHJlcG9ydCBhbnkgZXJyb3JzLCBjb3JyZWN0aW9ucyBvcgorICoJaW1wcm92ZW1lbnRzIHRvIG1lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKy8qCisgKglEZWZpbmUgb3VyIFBDSSB2ZW5kb3IgSUQgaGVyZQorICovCisgCisjaWZuZGVmIFBDSV9WRU5ET1JfTVlJREVOVAorI2RlZmluZSBQQ0lfVkVORE9SX01ZSURFTlQJCQkweDEyNUQKKworLyoKKyAqCVBDSSBpZGVudGl0eSBmb3IgdGhlIGNhcmQuCisgKi8KKyAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NWUlERU5UX01ZQ0FSRDEJCTB4MTk2OQorI2VuZGlmCisKKyNkZWZpbmUgQ0FSRF9OQU1FCSJFeGFtcGxlV2F2ZSAzRCBQcm8gVWx0cmEgVGhpbmd5V290c2l0IgorCisjZGVmaW5lIE1BWF9DQVJEUwk4CisKKy8qCisgKglFYWNoIGFkZHJlc3NfaW5mbyBvYmplY3QgaG9sZHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvZgorICoJb3VyIGNhcmQgcmVzb3VyY2VzLiBJbiB0aGlzIGNhc2UgdGhlIE1TUyBlbXVsYXRpb24gb2Ygb3VyCisgKglmaWN0aWNpb3VzIGNhcmQuIEl0cyB1c2VkIHRvIG1hbmFnZSBhbmQgYXR0YWNoIHRoaW5ncy4KKyAqLworIAorc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8JbXNzX2RhdGFbTUFYX0NBUkRTXTsKK3N0YXRpYyBpbnQgCQkJY2FyZHM7CisKKy8qCisgKglJbnN0YWxsIHRoZSBhY3R1YWwgY2FyZC4gVGhpcyBpcyBhbiBleGFtcGxlCisgKi8KKworc3RhdGljIGludCBteWNhcmRfaW5zdGFsbChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCWludCBpb2Jhc2U7CisJaW50IG1zc2Jhc2U7CisJaW50IG1wdWJhc2U7CisJdTggeDsKKwl1MTYgdzsKKwl1MzIgdjsKKwlpbnQgaTsKKwlpbnQgZG1hOworCisJLyoKKwkgKglPdXIgaW1hZ2luYXJ5IGNvZGUgaGFzIGl0cyBJL08gb24gUENJIGFkZHJlc3MgMCwgYQorCSAqCU1TUyBvbiBQQ0kgYWRkcmVzcyAxIGFuZCBhbiBNUFUgb24gYWRkcmVzcyAyCisJICoKKwkgKglGb3IgdGhlIGV4YW1wbGUgd2Ugd2lsbCBvbmx5IGluaXRpYWxpc2UgdGhlIE1TUworCSAqLworCSAJCisJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CisJbXNzYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDEpOworCW1wdWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAyKTsKKwkKKwkvKgorCSAqCVJlc2V0IHRoZSBib2FyZAorCSAqLworCSAKKwkvKgorCSAqCVdhaXQgZm9yIGNvbXBsZXRpb24uIHVkZWxheSgpIHdhaXRzIGluIG1pY3Jvc2Vjb25kcworCSAqLworCSAKKwl1ZGVsYXkoMTAwKTsKKwkKKwkvKgorCSAqCU9rIGNhcmQgcmVhZHkuIEJlZ2luIHNldHVwIHByb3Blci4gWW91IG1pZ2h0IGZvciBleGFtcGxlCisJICoJbG9hZCB0aGUgZmlybXdhcmUgaGVyZQorCSAqLworCQorCWRtYSA9IGNhcmRfc3BlY2lmaWNfbWFnaWMoaW9hZGRyKTsKKwkKKwkvKgorCSAqCVR1cm4gb24gbGVnYWN5IG1vZGUgKGV4YW1wbGUpLCBUaGVyZSBhcmUgYWxzbyBieXRlIGFuZAorCSAqCWR3b3JkICgzMmJpdCkgUENJIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gY2FsbHMKKwkgKi8KKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaWRldiwgMHg0MCwgJncpOworCXcmPX4oMTw8MTUpOwkJCS8qIGxlZ2FjeSBkZWNvZGUgb24gKi8KKwl3fD0oMTw8MTQpOwkJCS8qIFJlc2VydmVkIHdyaXRlIGFzIDEgaW4gdGhpcyBjYXNlICovCisJd3w9KDE8PDMpfCgxPDwxKXwoMTw8MCk7CS8qIFNCIG9uICwgRk0gb24sIE1QVSBvbiAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIDB4NDAsIHcpOworCQorCS8qCisJICoJTGV0IHRoZSB1c2VyIGtub3cgd2UgZm91bmQgaGlzIHRveS4KKwkgKi8KKwkgCisJcHJpbnRrKEtFUk5fSU5GTyAiUHJvZ3JhbW1lZCAiQ0FSRF9OQU1FIiBhdCAweCVYIHRvIGxlZ2FjeSBtb2RlLlxuIiwKKwkJaW9iYXNlKTsKKwkJCisJLyoKKwkgKglOb3cgc2V0IGl0IHVwIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY2FyZAorCSAqLworCSAKKwltc3NfZGF0YVtjYXJkc10uaW9fYmFzZSA9IG1zc2Jhc2U7CisJbXNzX2RhdGFbY2FyZHNdLmlycSA9IHBjaWRldi0+aXJxOworCW1zc19kYXRhW2NhcmRzXS5kbWEgPSBkbWE7CisJCisJLyoKKwkgKglDaGVjayB0aGVyZSBpcyBhbiBNU1MgcHJlc2VudAorCSAqLworCisJaWYoYWQxODQ4X2RldGVjdChtc3NiYXNlLCBOVUxMLCBtc3NfZGF0YVtjYXJkc10ub3NwKT09MCkKKwkJcmV0dXJuIDA7CisJCQorCS8qCisJICoJSW5pdGlhbGl6ZSBpdAorCSAqLworCSAKKwltc3NfZGF0YVtjYXJkc10uc2xvdHNbM10gPSBhZDE4NDhfaW5pdCgiTXlDYXJkIE1TUyAxNmJpdCIsIAorCQkJbXNzYmFzZSwKKwkJCW1zc19kYXRhW2NhcmRzXS5pcnEsCisJCQltc3NfZGF0YVtjYXJkc10uZG1hLAorCQkJbXNzX2RhdGFbY2FyZHNdLmRtYSwKKwkJCTAsCisJCQkwLAorCQkJVEhJU19NT0RVTEUpOworCisJY2FyZHMrKzsJCisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIAlUaGlzIGxvb3Agd2Fsa3MgdGhlIFBDSSBjb25maWd1cmF0aW9uIGRhdGFiYXNlIGFuZCBmaW5kcyB3aGVyZQorICoJdGhlIHNvdW5kIGNhcmRzIGFyZS4KKyAqLworIAoraW50IGluaXRfbXljYXJkKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldj1OVUxMOworCWludCBjb3VudD0wOworCQkKKwl3aGlsZSgocGNpZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfTVlJREVOVCwgUENJX0RFVklDRV9JRF9NWUlERU5UX01ZQ0FSRDEsIHBjaWRldikpIT1OVUxMKQorCXsKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpCisJCQljb250aW51ZTsKKwkJY291bnQrPW15Y2FyZF9pbnN0YWxsKHBjaWRldik7CisJCWlmKGNvdW50KQorCQkJcmV0dXJuIDA7CisJCWlmKGNvdW50PT1NQVhfQ0FSRFMpCisJCQlicmVhazsKKwl9CisJCisJaWYoY291bnQ9PTApCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCisvKgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBvciBrZXJuZWwgbG9hZHMgdGhlIAorICoJbW9kdWxlIGludG8gbWVtb3J5LgorICovCisKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaWYoaW5pdF9teWNhcmQoKTwwKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyAiQ0FSRF9OQU1FIiBjYXJkcyBmb3VuZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVRoaXMgaXMgY2FsbGVkIHdoZW4gaXQgaXMgcmVtb3ZlZC4gSXQgd2lsbCBvbmx5IGJlIHJlbW92ZWQgCisgKgl3aGVuIGl0cyB1c2UgY291bnQgaXMgMC4KKyAqLworIAordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWZvcihpPTA7aTwgY2FyZHM7IGkrKykKKwl7CisJCS8qCisJCSAqCUZyZWUgYXR0YWNoZWQgcmVzb3VyY2VzCisJCSAqLworCQkgCisJCWFkMTg0OF91bmxvYWQobXNzX2RhdGFbaV0uaW9fYmFzZSwKKwkJCSAgICAgIG1zc19kYXRhW2ldLmlycSwKKwkJCSAgICAgIG1zc19kYXRhW2ldLmRtYSwKKwkJCSAgICAgIG1zc19kYXRhW2ldLmRtYSwKKwkJCSAgICAgIDApOworCQkvKgorCQkgKglBbmQgZGlzY29ubmVjdCB0aGUgZGV2aWNlIGZyb20gdGhlIGtlcm5lbAorCQkgKi8KKwkJc291bmRfdW5sb2FkX2F1ZGlvZGV2aWNlKG1zc19kYXRhW2ldLnNsb3RzWzNdKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zb25pY3ZpYmVzLmMgYi9zb3VuZC9vc3Mvc29uaWN2aWJlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDY5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc29uaWN2aWJlcy5jCkBAIC0wLDAgKzEsMjc5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgICBzb25pY3ZpYmVzLmMgIC0tICBTMyBTb25pYyBWaWJlcyBhdWRpbyBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSwgMjAwMyAgVGhvbWFzIFNhaWxlciAodC5zYWlsZXJAYWx1bW5pLmV0aHouY2gpCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIERhdmlkIEMuIE5pZW1pCisgKgorICoKKyAqIE1vZHVsZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyczoKKyAqICAgbm9uZSBzbyBmYXIKKyAqCisgKgorICogIFN1cHBvcnRlZCBkZXZpY2VzOgorICogIC9kZXYvZHNwICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21peGVyICBzdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21pZGkgICBzaW1wbGUgTUlESSBVQVJUIGludGVyZmFjZSwgbm8gaW9jdGwKKyAqCisgKiAgVGhlIGNhcmQgaGFzIGJvdGggYW4gRk0gYW5kIGEgV2F2ZXRhYmxlIHN5bnRoLCBidXQgSSBoYXZlIHRvIGZpZ3VyZQorICogIG91dCBmaXJzdCBob3cgdG8gZHJpdmUgdGhlbS4uLgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAwNi4wNS4xOTk4ICAgMC4xICAgSW5pdGlhbCByZWxlYXNlCisgKiAgICAxMC4wNS4xOTk4ICAgMC4yICAgRml4ZWQgbWFueSBidWdzLCBlc3AuIEFEQyByYXRlIGNhbGN1bGF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgRmlyc3Qgc3RhYiBhdCBhIHNpbXBsZSBtaWRpIGludGVyZmFjZSAobm8gYmVsbHMmd2hpc3RsZXMpCisgKiAgICAxMy4wNS4xOTk4ICAgMC4zICAgRml4IHN0dXBpZCBjdXQmcGFzdGUgZXJyb3I6IHNldF9hZGNfcmF0ZSB3YXMgY2FsbGVkIGluc3RlYWQgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGFjX3JhdGUgaW4gdGhlIEZNT0RFX1dSSVRFIGNhc2UgaW4gc3Zfb3BlbgorICogICAgICAgICAgICAgICAgICAgICAgIEZpeCBod3B0ciBvdXQgb2YgYm91bmRzIChub3cgbXBnMTIzIHdvcmtzKQorICogICAgMTQuMDUuMTk5OCAgIDAuNCAgIERvbid0IGFsbG93IGV4Y2Vzc2l2ZSBpbnRlcnJ1cHQgcmF0ZXMKKyAqICAgIDA4LjA2LjE5OTggICAwLjUgICBGaXJzdCByZWxlYXNlIHVzaW5nIEFsYW4gQ294JyBzb3VuZGNvcmUgaW5zdGVhZCBvZiBtaXNjZGV2aWNlCisgKiAgICAwMy4wOC4xOTk4ICAgMC42ICAgRG8gbm90IGluY2x1ZGUgbW9kdmVyc2lvbnMuaAorICogICAgICAgICAgICAgICAgICAgICAgIE5vdyBtaXhlciBiZWhhdmlvdXIgY2FuIGJhc2ljYWxseSBiZSBzZWxlY3RlZCBiZXR3ZWVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIk9TUyBkb2N1bWVudGVkIiBhbmQgIk9TUyBhY3R1YWwiIGJlaGF2aW91cgorICogICAgMzEuMDguMTk5OCAgIDAuNyAgIEZpeCByZWFscGxheWVyIHByb2JsZW1zIC0gZGFjLmNvdW50IGlzc3VlcworICogICAgMTAuMTIuMTk5OCAgIDAuOCAgIEZpeCBkcmFpbl9kYWMgdHJ5aW5nIHRvIHdhaXQgb24gbm90IHlldCBpbml0aWFsaXplZCBETUEKKyAqICAgIDE2LjEyLjE5OTggICAwLjkgICBGaXggYSBmZXcgZl9maWxlICYgRk1PREVfIGJ1Z3MKKyAqICAgIDA2LjAxLjE5OTkgICAwLjEwICByZW1vdmUgdGhlIHNpbGx5IFNBX0lOVEVSUlVQVCBmbGFnLgorICogICAgICAgICAgICAgICAgICAgICAgIGhvcGVmdWxseSBraWxsZWQgdGhlIGVnY3Mgc2VjdGlvbiB0eXBlIGNvbmZsaWN0CisgKiAgICAxMi4wMy4xOTk5ICAgMC4xMSAgY2luZm8uYmxvY2tzIHNob3VsZCBiZSByZXNldCBhZnRlciBHRVR4UFRSIGlvY3RsLgorICogICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEpvaGFuIE1hZXMgPGpvbWFAdGVsaW5kdXMuYmU+CisgKiAgICAyMi4wMy4xOTk5ICAgMC4xMiAgcmV0dXJuIEVBR0FJTiBpbnN0ZWFkIG9mIEVCVVNZIHdoZW4gT19OT05CTE9DSworICogICAgICAgICAgICAgICAgICAgICAgIHJlYWQvd3JpdGUgY2Fubm90IGJlIGV4ZWN1dGVkCisgKiAgICAwNS4wNC4xOTk5ICAgMC4xMyAgYWRkZWQgY29kZSB0byBzdl9yZWFkIGFuZCBzdl93cml0ZSB3aGljaCBzaG91bGQgZGV0ZWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgbG9ja3VwcyBvZiB0aGUgc291bmQgY2hpcCBhbmQgcmV2aXZlIGl0LiBUaGlzIGlzIGJhc2ljYWxseQorICogICAgICAgICAgICAgICAgICAgICAgIGFuIHVnbHkgaGFjaywgYnV0IGF0IGxlYXN0IGFwcGxpY2F0aW9ucyB1c2luZyB0aGlzIGRyaXZlcgorICogICAgICAgICAgICAgICAgICAgICAgIHdvbid0IGhhbmcgZm9yZXZlci4gSSBkb24ndCBrbm93IHdoeSB0aGVzZSBsb2NrdXBzIGhhcHBlbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICBpdCBtaWdodCB3ZWxsIGJlIHRoZSBtb3RoZXJib2FyZCBjaGlwc2V0IChhbiBlYXJseSA0ODYgUENJCisgKiAgICAgICAgICAgICAgICAgICAgICAgYm9hcmQgd2l0aCBBTEkgY2hpcHNldCksIHNpbmNlIGV2ZXJ5IGJ1c21hc3RlcmluZyAxMDBNQgorICogICAgICAgICAgICAgICAgICAgICAgIGV0aGVybmV0IGNhcmQgSSd2ZSB0cmllZCAoUmVhbHRlayA4MTM5IGFuZCBNYWNyb25peCB0dWxpcCBjbG9uZSkKKyAqICAgICAgICAgICAgICAgICAgICAgICBleGhpYml0IHNpbWlsYXIgYmVoYXZpb3VyICh0aGV5IHdvcmsgZm9yIGEgY291cGxlIG9mIHBhY2tldHMKKyAqICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBsb2NrIHVwIGFuZCBjYW4gYmUgcmV2aXZlZCBieSBpZmNvbmZpZyBkb3duL3VwKS4KKyAqICAgIDA3LjA0LjE5OTkgICAwLjE0ICBpbXBsZW1lbnRlZCB0aGUgZm9sbG93aW5nIGlvY3RsJ3M6IFNPVU5EX1BDTV9SRUFEX1JBVEUsIAorICogICAgICAgICAgICAgICAgICAgICAgIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTLCBTT1VORF9QQ01fUkVBRF9CSVRTOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICBBbHBoYSBmaXhlcyByZXBvcnRlZCBieSBQZXRlciBKb25lcyA8cGpvbmVzQHJlZGhhdC5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogZG1haW8gaGFjayBtaWdodCBzdGlsbCBiZSB3cm9uZyBvbiBhcmNocyBvdGhlciB0aGFuIGkzODYKKyAqICAgIDE1LjA2LjE5OTkgICAwLjE1ICBGaXggYmFkIGFsbG9jYXRpb24gYnVnLgorICogICAgICAgICAgICAgICAgICAgICAgIFRoYW5rcyB0byBEZXRpIEZsaWVnbCA8ZmxpZWdsQGluLnR1bS5kZT4KKyAqICAgIDI4LjA2LjE5OTkgICAwLjE2ICBBZGQgcGNpX3NldF9tYXN0ZXIKKyAqICAgIDAzLjA4LjE5OTkgICAwLjE3ICBhZGFwdCB0byBMaW51cycgbmV3IF9fc2V0dXAvX19pbml0Y2FsbAorICogICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9ucyAic29uaWN2aWJlcz1yZXZlcmIiIGFuZCAic29uaWN2aWJlc2RtYWlvPWRtYWlvYWRkciIKKyAqICAgIDEyLjA4LjE5OTkgICAwLjE4ICBtb2R1bGVfaW5pdC9fX3NldHVwIGZpeGVzCisgKiAgICAyNC4wOC4xOTk5ICAgMC4xOSAgZ2V0IHJpZCBvZiB0aGUgZG1haW8ga2x1ZGdlLCByZXBsYWNlIHdpdGggYWxsb2NhdGVfcmVzb3VyY2UKKyAqICAgIDMxLjA4LjE5OTkgICAwLjIwICBhZGQgc3Bpbl9sb2NrX2luaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICB1c2UgbmV3IHJlc291cmNlIGFsbG9jYXRpb24gdG8gYWxsb2NhdGUgRERNQSBJTyBzcGFjZQorICogICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGN1cnJlbnQtPnN0YXRlID0geCB3aXRoIHNldF9jdXJyZW50X3N0YXRlKHgpCisgKiAgICAwMy4wOS4xOTk5ICAgMC4yMSAgY2hhbmdlIHJlYWQgc2VtYW50aWNzIGZvciBNSURJIHRvIG1hdGNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgT1NTIG1vcmUgY2xvc2VseTsgcmVtb3ZlIHBvc3NpYmxlIHdha2V1cCByYWNlCisgKiAgICAyOC4xMC4xOTk5ICAgMC4yMiAgTW9yZSB3YWl0cXVldWUgcmFjZXMgZml4ZWQKKyAqICAgIDAxLjEyLjE5OTkgICAwLjIzICBOZXcgYXJndW1lbnQgdG8gYWxsb2NhdGVfcmVzb3VyY2UKKyAqICAgIDA3LjEyLjE5OTkgICAwLjI0ICBNb3JlIGFsbG9jYXRlX3Jlc291cmNlIHNlbWFudGljcyBjaGFuZ2UKKyAqICAgIDA4LjAxLjIwMDAgICAwLjI1ICBQcmV2ZW50IHNvbWUgaW9jdGwncyBmcm9tIHJldHVybmluZyBiYWQgY291bnQgdmFsdWVzIG9uIHVuZGVycnVuL292ZXJydW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgVGltIEphbmlrJ3MgQlNFIChCZWRldmlsbGVkIFNvdW5kIEVuZ2luZSkgZm91bmQgdGhpcworICogICAgICAgICAgICAgICAgICAgICAgIHVzZSBNYXJ0aW4gTWFyZXMnIHBjaV9hc3NpZ25fcmVzb3VyY2UKKyAqICAgIDA3LjAyLjIwMDAgICAwLjI2ICBVc2UgcGNpX2FsbG9jX2NvbnNpc3RlbnQgYW5kIHBjaV9yZWdpc3Rlcl9kcml2ZXIKKyAqICAgIDIxLjExLjIwMDAgICAwLjI3ICBJbml0aWFsaXplIGRtYSBidWZmZXJzIGluIHBvbGwsIG90aGVyd2lzZSBwb2xsIG1heSByZXR1cm4gYSBib2d1cyBtYXNrCisgKiAgICAxMi4xMi4yMDAwICAgMC4yOCAgTW9yZSBkbWEgYnVmZmVyIGluaXRpYWxpemF0aW9ucywgcGF0Y2ggZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgIFRqZWVyZCBNdWxkZXIgPHRqZWVyZC5tdWxkZXJAZnVqaXRzdS1zaWVtZW5zLmNvbT4KKyAqICAgIDMxLjAxLjIwMDEgICAwLjI5ICBSZWdpc3Rlci9VbnJlZ2lzdGVyIGdhbWVwb3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgRml4IFNFVFRSSUdHRVIgbm9uIE9TUyBBUEkgY29uZm9ybWl0eQorICogICAgMTguMDUuMjAwMSAgIDAuMzAgIFBDSSBwcm9iaW5nIGFuZCBlcnJvciB2YWx1ZXMgY2xlYW5lZCB1cCBieSBNYXJjdXMKKyAqICAgICAgICAgICAgICAgICAgICAgICBNZWlzc25lciA8bW1AY2FsZGVyYS5kZT4KKyAqICAgIDAzLjAxLjIwMDMgICAwLjMxICBvcGVuX21vZGUgZml4ZXMgZnJvbSBHZW9yZyBBY2hlciA8YWNoZXJAaW4udHVtLmRlPgorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZG0uaCIKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI3VuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1MzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUzMgICAgICAgICAgICAgMHg1MzMzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9TM19TT05JQ1ZJQkVTCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfU09OSUNWSUJFUyAgMHhjYTAwCisjZW5kaWYKKworI2RlZmluZSBTVl9NQUdJQyAgKChQQ0lfVkVORE9SX0lEX1MzPDwxNil8UENJX0RFVklDRV9JRF9TM19TT05JQ1ZJQkVTKQorCisjZGVmaW5lIFNWX0VYVEVOVF9TQiAgICAgIDB4MTAKKyNkZWZpbmUgU1ZfRVhURU5UX0VOSCAgICAgMHgxMAorI2RlZmluZSBTVl9FWFRFTlRfU1lOVEggICAweDQKKyNkZWZpbmUgU1ZfRVhURU5UX01JREkgICAgMHg0CisjZGVmaW5lIFNWX0VYVEVOVF9HQU1FICAgIDB4OAorI2RlZmluZSBTVl9FWFRFTlRfRE1BICAgICAweDEwCisKKy8qCisgKiB3ZSBhcmUgbm90IGEgYnJpZGdlIGFuZCB0aHVzIHVzZSBhIHJlc291cmNlIGZvciBERE1BIHRoYXQgaXMgdXNlZCBmb3IgYnJpZGdlcyBidXQKKyAqIGxlZnQgZW1wdHkgZm9yIG5vcm1hbCBkZXZpY2VzCisgKi8KKyNkZWZpbmUgUkVTT1VSQ0VfU0IgICAgICAgMAorI2RlZmluZSBSRVNPVVJDRV9FTkggICAgICAxCisjZGVmaW5lIFJFU09VUkNFX1NZTlRIICAgIDIKKyNkZWZpbmUgUkVTT1VSQ0VfTUlESSAgICAgMworI2RlZmluZSBSRVNPVVJDRV9HQU1FICAgICA0CisjZGVmaW5lIFJFU09VUkNFX0RETUEgICAgIDcKKworI2RlZmluZSBTVl9NSURJX0RBVEEgICAgICAwCisjZGVmaW5lIFNWX01JRElfQ09NTUFORCAgIDEKKyNkZWZpbmUgU1ZfTUlESV9TVEFUVVMgICAgMQorCisjZGVmaW5lIFNWX0RNQV9BRERSMCAgICAgIDAKKyNkZWZpbmUgU1ZfRE1BX0FERFIxICAgICAgMQorI2RlZmluZSBTVl9ETUFfQUREUjIgICAgICAyCisjZGVmaW5lIFNWX0RNQV9BRERSMyAgICAgIDMKKyNkZWZpbmUgU1ZfRE1BX0NPVU5UMCAgICAgNAorI2RlZmluZSBTVl9ETUFfQ09VTlQxICAgICA1CisjZGVmaW5lIFNWX0RNQV9DT1VOVDIgICAgIDYKKyNkZWZpbmUgU1ZfRE1BX01PREUgICAgICAgMHhiCisjZGVmaW5lIFNWX0RNQV9SRVNFVCAgICAgIDB4ZAorI2RlZmluZSBTVl9ETUFfTUFTSyAgICAgICAweGYKKworLyoKKyAqIERPTlQgcmVzZXQgdGhlIERNQSBjb250cm9sbGVycyB1bmxlc3MgeW91IHVuZGVyc3RhbmQKKyAqIHRoZSByZXNldCBzZW1hbnRpY3MuIEFzc3VtaW5nIHJlc2V0IHNlbWFudGljcyBhcyBpbgorICogdGhlIDgyMzcgZG9lcyBub3Qgd29yay4KKyAqLworCisjZGVmaW5lIERNQV9NT0RFX0FVVE9JTklUIDB4MTAKKyNkZWZpbmUgRE1BX01PREVfUkVBRCAgICAgMHg0NCAgICAvKiBJL08gdG8gbWVtb3J5LCBubyBhdXRvaW5pdCwgaW5jcmVtZW50LCBzaW5nbGUgbW9kZSAqLworI2RlZmluZSBETUFfTU9ERV9XUklURSAgICAweDQ4ICAgIC8qIG1lbW9yeSB0byBJL08sIG5vIGF1dG9pbml0LCBpbmNyZW1lbnQsIHNpbmdsZSBtb2RlICovCisKKyNkZWZpbmUgU1ZfQ09ERUNfQ09OVFJPTCAgMAorI2RlZmluZSBTVl9DT0RFQ19JTlRNQVNLICAxCisjZGVmaW5lIFNWX0NPREVDX1NUQVRVUyAgIDIKKyNkZWZpbmUgU1ZfQ09ERUNfSUFERFIgICAgNAorI2RlZmluZSBTVl9DT0RFQ19JREFUQSAgICA1CisKKyNkZWZpbmUgU1ZfQ0NUUkxfUkVTRVQgICAgICAweDgwCisjZGVmaW5lIFNWX0NDVFJMX0lOVEFEUklWRSAgMHgyMAorI2RlZmluZSBTVl9DQ1RSTF9XQVZFVEFCTEUgIDB4MDgKKyNkZWZpbmUgU1ZfQ0NUUkxfUkVWRVJCICAgICAweDA0CisjZGVmaW5lIFNWX0NDVFJMX0VOSEFOQ0VEICAgMHgwMQorCisjZGVmaW5lIFNWX0NJTlRNQVNLX0RNQUEgICAgMHgwMQorI2RlZmluZSBTVl9DSU5UTUFTS19ETUFDICAgIDB4MDQKKyNkZWZpbmUgU1ZfQ0lOVE1BU0tfU1BFQ0lBTCAweDA4CisjZGVmaW5lIFNWX0NJTlRNQVNLX1VQRE9XTiAgMHg0MAorI2RlZmluZSBTVl9DSU5UTUFTS19NSURJICAgIDB4ODAKKworI2RlZmluZSBTVl9DU1RBVF9ETUFBICAgICAgIDB4MDEKKyNkZWZpbmUgU1ZfQ1NUQVRfRE1BQwkgICAgMHgwNAorI2RlZmluZSBTVl9DU1RBVF9TUEVDSUFMICAgIDB4MDgKKyNkZWZpbmUgU1ZfQ1NUQVRfVVBET1dOCSAgICAweDQwCisjZGVmaW5lIFNWX0NTVEFUX01JREkJICAgIDB4ODAKKworI2RlZmluZSBTVl9DSUFERFJfVFJEICAgICAgIDB4ODAKKyNkZWZpbmUgU1ZfQ0lBRERSX01DRSAgICAgICAweDQwCisKKy8qIGNvZGVjIGluZGlyZWN0IHJlZ2lzdGVycyAqLworI2RlZmluZSBTVl9DSU1JWF9BRENJTkwgICAgIDB4MDAKKyNkZWZpbmUgU1ZfQ0lNSVhfQURDSU5SICAgICAweDAxCisjZGVmaW5lIFNWX0NJTUlYX0FVWDFJTkwgICAgMHgwMgorI2RlZmluZSBTVl9DSU1JWF9BVVgxSU5SICAgIDB4MDMKKyNkZWZpbmUgU1ZfQ0lNSVhfQ0RJTkwgICAgICAweDA0CisjZGVmaW5lIFNWX0NJTUlYX0NESU5SICAgICAgMHgwNQorI2RlZmluZSBTVl9DSU1JWF9MSU5FSU5MICAgIDB4MDYKKyNkZWZpbmUgU1ZfQ0lNSVhfTElORUlOUiAgICAweDA3CisjZGVmaW5lIFNWX0NJTUlYX01JQ0lOICAgICAgMHgwOAorI2RlZmluZSBTVl9DSU1JWF9TWU5USElOTCAgIDB4MEEKKyNkZWZpbmUgU1ZfQ0lNSVhfU1lOVEhJTlIgICAweDBCCisjZGVmaW5lIFNWX0NJTUlYX0FVWDJJTkwgICAgMHgwQworI2RlZmluZSBTVl9DSU1JWF9BVVgySU5SICAgIDB4MEQKKyNkZWZpbmUgU1ZfQ0lNSVhfQU5BTE9HSU5MICAweDBFCisjZGVmaW5lIFNWX0NJTUlYX0FOQUxPR0lOUiAgMHgwRgorI2RlZmluZSBTVl9DSU1JWF9QQ01JTkwgICAgIDB4MTAKKyNkZWZpbmUgU1ZfQ0lNSVhfUENNSU5SICAgICAweDExCisKKyNkZWZpbmUgU1ZfQ0lHQU1FQ09OVFJPTCAgICAweDA5CisjZGVmaW5lIFNWX0NJREFUQUZNVCAgICAgICAgMHgxMgorI2RlZmluZSBTVl9DSUVOQUJMRSAgICAgICAgIDB4MTMKKyNkZWZpbmUgU1ZfQ0lVUERPV04gICAgICAgICAweDE0CisjZGVmaW5lIFNWX0NJUkVWSVNJT04gICAgICAgMHgxNQorI2RlZmluZSBTVl9DSUFEQ09VVFBVVCAgICAgIDB4MTYKKyNkZWZpbmUgU1ZfQ0lETUFBQkFTRUNPVU5UMSAweDE4CisjZGVmaW5lIFNWX0NJRE1BQUJBU0VDT1VOVDAgMHgxOQorI2RlZmluZSBTVl9DSURNQUNCQVNFQ09VTlQxIDB4MWMKKyNkZWZpbmUgU1ZfQ0lETUFDQkFTRUNPVU5UMCAweDFkCisjZGVmaW5lIFNWX0NJUENNU1IwICAgICAgICAgMHgxZQorI2RlZmluZSBTVl9DSVBDTVNSMSAgICAgICAgIDB4MWYKKyNkZWZpbmUgU1ZfQ0lTWU5USFNSMCAgICAgICAweDIwCisjZGVmaW5lIFNWX0NJU1lOVEhTUjEgICAgICAgMHgyMQorI2RlZmluZSBTVl9DSUFEQ0NMS1NPVVJDRSAgIDB4MjIKKyNkZWZpbmUgU1ZfQ0lBRENBTFRTUiAgICAgICAweDIzCisjZGVmaW5lIFNWX0NJQURDUExMTSAgICAgICAgMHgyNAorI2RlZmluZSBTVl9DSUFEQ1BMTE4gICAgICAgIDB4MjUKKyNkZWZpbmUgU1ZfQ0lTWU5USFBMTE0gICAgICAweDI2CisjZGVmaW5lIFNWX0NJU1lOVEhQTExOICAgICAgMHgyNworI2RlZmluZSBTVl9DSVVBUlRDT05UUk9MICAgIDB4MmEKKyNkZWZpbmUgU1ZfQ0lEUklWRUNPTlRST0wgICAweDJiCisjZGVmaW5lIFNWX0NJU1JTU1BBQ0UgICAgICAgMHgyYworI2RlZmluZSBTVl9DSVNSU0NFTlRFUiAgICAgIDB4MmQKKyNkZWZpbmUgU1ZfQ0lXQVZFVEFCTEVTUkMgICAweDJlCisjZGVmaW5lIFNWX0NJQU5BTE9HUFdSRE9XTiAgMHgzMAorI2RlZmluZSBTVl9DSURJR0lUQUxQV1JET1dOIDB4MzEKKworCisjZGVmaW5lIFNWX0NJTUlYX0FEQ1NSQ19DRCAgICAgMHgyMAorI2RlZmluZSBTVl9DSU1JWF9BRENTUkNfREFDICAgIDB4NDAKKyNkZWZpbmUgU1ZfQ0lNSVhfQURDU1JDX0FVWDIgICAweDYwCisjZGVmaW5lIFNWX0NJTUlYX0FEQ1NSQ19MSU5FICAgMHg4MAorI2RlZmluZSBTVl9DSU1JWF9BRENTUkNfQVVYMSAgIDB4YTAKKyNkZWZpbmUgU1ZfQ0lNSVhfQURDU1JDX01JQyAgICAweGMwCisjZGVmaW5lIFNWX0NJTUlYX0FEQ1NSQ19NSVhPVVQgMHhlMAorI2RlZmluZSBTVl9DSU1JWF9BRENTUkNfTUFTSyAgIDB4ZTAKKworI2RlZmluZSBTVl9DRk1UX1NURVJFTyAgICAgMHgwMQorI2RlZmluZSBTVl9DRk1UXzE2QklUICAgICAgMHgwMgorI2RlZmluZSBTVl9DRk1UX01BU0sgICAgICAgMHgwMworI2RlZmluZSBTVl9DRk1UX0FTSElGVCAgICAgMCAgIAorI2RlZmluZSBTVl9DRk1UX0NTSElGVCAgICAgNAorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NpemVbXSA9IHsgMSwgMiwgMiwgNCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAwLCAxLCAxLCAyIH07CisKKyNkZWZpbmUgU1ZfQ0VOQUJMRV9QUEUgICAgIDB4NAorI2RlZmluZSBTVl9DRU5BQkxFX1JFICAgICAgMHgyCisjZGVmaW5lIFNWX0NFTkFCTEVfUEUgICAgICAweDEKKworCisvKiBNSURJIGJ1ZmZlciBzaXplcyAqLworCisjZGVmaW5lIE1JRElJTkJVRiAgMjU2CisjZGVmaW5lIE1JRElPVVRCVUYgMjU2CisKKyNkZWZpbmUgRk1PREVfTUlESV9TSElGVCAyCisjZGVmaW5lIEZNT0RFX01JRElfUkVBRCAgKEZNT0RFX1JFQUQgPDwgRk1PREVfTUlESV9TSElGVCkKKyNkZWZpbmUgRk1PREVfTUlESV9XUklURSAoRk1PREVfV1JJVEUgPDwgRk1PREVfTUlESV9TSElGVCkKKworI2RlZmluZSBGTU9ERV9ETUZNIDB4MTAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBzdl9zdGF0ZSB7CisJLyogbWFnaWMgKi8KKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisKKwkvKiBsaXN0IG9mIHNvbmljdmliZXMgZGV2aWNlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2czsKKworCS8qIHRoZSBjb3JyZXNwb25kaW5nIHBjaV9kZXYgc3RydWN0dXJlICovCisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfYXVkaW87CisJaW50IGRldl9taXhlcjsKKwlpbnQgZGV2X21pZGk7CisJaW50IGRldl9kbWZtOworCisJLyogaGFyZHdhcmUgcmVzb3VyY2VzICovCisJdW5zaWduZWQgbG9uZyBpb3NiLCBpb2VuaCwgaW9zeW50aCwgaW9taWRpOyAgLyogbG9uZyBmb3IgU1BBUkMgKi8KKwl1bnNpZ25lZCBpbnQgaW9kbWFhLCBpb2RtYWMsIGlycTsKKworICAgICAgICAvKiBtaXhlciBzdHVmZiAqLworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RjbnQ7CisjaWZuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQl1bnNpZ25lZCBzaG9ydCB2b2xbMTNdOworI2VuZGlmIC8qIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUyAqLworICAgICAgICB9IG1peDsKKworCS8qIHdhdmUgc3R1ZmYgKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZWFkYywgcmF0ZWRhYzsKKwl1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlOworCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW07CisJbW9kZV90IG9wZW5fbW9kZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwlzdHJ1Y3QgZG1hYnVmIHsKKwkJdm9pZCAqcmF3YnVmOworCQlkbWFfYWRkcl90IGRtYWFkZHI7CisJCXVuc2lnbmVkIGJ1Zm9yZGVyOworCQl1bnNpZ25lZCBudW1mcmFnOworCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CisJCXVuc2lnbmVkIGh3cHRyLCBzd3B0cjsKKwkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CisJCWludCBjb3VudDsKKwkJdW5zaWduZWQgZXJyb3I7IC8qIG92ZXIvdW5kZXJydW4gKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQl1bnNpZ25lZCBmcmFnc2l6ZTsKKwkJdW5zaWduZWQgZG1hc2l6ZTsKKwkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7CisJCS8qIE9TUyBzdHVmZiAqLworCQl1bnNpZ25lZCBtYXBwZWQ6MTsKKwkJdW5zaWduZWQgcmVhZHk6MTsKKwkJdW5zaWduZWQgZW5kY2xlYXJlZDoxOworCQl1bnNpZ25lZCBlbmFibGVkOjE7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwl9IGRtYV9kYWMsIGRtYV9hZGM7CisKKwkvKiBtaWRpIHN0dWZmICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaXJkLCBpd3IsIGljbnQ7CisJCXVuc2lnbmVkIG9yZCwgb3dyLCBvY250OworCQl3YWl0X3F1ZXVlX2hlYWRfdCBpd2FpdDsKKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgb3dhaXQ7CisJCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCQl1bnNpZ25lZCBjaGFyIGlidWZbTUlESUlOQlVGXTsKKwkJdW5zaWduZWQgY2hhciBvYnVmW01JRElPVVRCVUZdOworCX0gbWlkaTsKKworCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIExJU1RfSEVBRChkZXZzKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdhdmV0YWJsZV9tZW07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxkMih1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCByID0gMDsKKwkKKwlpZiAoeCA+PSAweDEwMDAwKSB7CisJCXggPj49IDE2OworCQlyICs9IDE2OworCX0KKwlpZiAoeCA+PSAweDEwMCkgeworCQl4ID4+PSA4OworCQlyICs9IDg7CisJfQorCWlmICh4ID49IDB4MTApIHsKKwkJeCA+Pj0gNDsKKwkJciArPSA0OworCX0KKwlpZiAoeCA+PSA0KSB7CisJCXggPj49IDI7CisJCXIgKz0gMjsKKwl9CisJaWYgKHggPj0gMikKKwkJcisrOworCXJldHVybiByOworfQorCisvKgorICogaHdlaWdodE46IHJldHVybnMgdGhlIGhhbW1pbmcgd2VpZ2h0IChpLmUuIHRoZSBudW1iZXIKKyAqIG9mIGJpdHMgc2V0KSBvZiBhIE4tYml0IHdvcmQKKyAqLworCisjaWZkZWYgaHdlaWdodDMyCisjdW5kZWYgaHdlaWdodDMyCisjZW5kaWYKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaHdlaWdodDMyKHVuc2lnbmVkIGludCB3KQoreworICAgICAgICB1bnNpZ25lZCBpbnQgcmVzID0gKHcgJiAweDU1NTU1NTU1KSArICgodyA+PiAxKSAmIDB4NTU1NTU1NTUpOworICAgICAgICByZXMgPSAocmVzICYgMHgzMzMzMzMzMykgKyAoKHJlcyA+PiAyKSAmIDB4MzMzMzMzMzMpOworICAgICAgICByZXMgPSAocmVzICYgMHgwRjBGMEYwRikgKyAoKHJlcyA+PiA0KSAmIDB4MEYwRjBGMEYpOworICAgICAgICByZXMgPSAocmVzICYgMHgwMEZGMDBGRikgKyAoKHJlcyA+PiA4KSAmIDB4MDBGRjAwRkYpOworICAgICAgICByZXR1cm4gKHJlcyAmIDB4MDAwMEZGRkYpICsgKChyZXMgPj4gMTYpICYgMHgwMDAwRkZGRik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogV2h5IHVzZSBieXRlIElPPyBOb2JvZHkga25vd3MsIGJ1dCBTMyBkb2VzIGl0IGFsc28gaW4gdGhlaXIgV2luZG93cyBkcml2ZXIuCisgKi8KKworI3VuZGVmIERNQUJZVEVJTworCitzdGF0aWMgdm9pZCBzZXRfZG1hYShzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisjaWZkZWYgRE1BQllURUlPCisJdW5zaWduZWQgaW8gPSBzLT5pb2RtYWEsIHU7CisKKwljb3VudC0tOworCWZvciAodSA9IDQ7IHUgPiAwOyB1LS0sIGFkZHIgPj49IDgsIGlvKyspCisJCW91dGIoYWRkciAmIDB4ZmYsIGlvKTsKKwlmb3IgKHUgPSAzOyB1ID4gMDsgdS0tLCBjb3VudCA+Pj0gOCwgaW8rKykKKwkJb3V0Yihjb3VudCAmIDB4ZmYsIGlvKTsKKyNlbHNlIC8qIERNQUJZVEVJTyAqLworCWNvdW50LS07CisJb3V0bChhZGRyLCBzLT5pb2RtYWEgKyBTVl9ETUFfQUREUjApOworCW91dGwoY291bnQsIHMtPmlvZG1hYSArIFNWX0RNQV9DT1VOVDApOworI2VuZGlmIC8qIERNQUJZVEVJTyAqLworCW91dGIoMHgxOCwgcy0+aW9kbWFhICsgU1ZfRE1BX01PREUpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZG1hYyhzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisjaWZkZWYgRE1BQllURUlPCisJdW5zaWduZWQgaW8gPSBzLT5pb2RtYWMsIHU7CisKKwljb3VudCA+Pj0gMTsKKwljb3VudC0tOworCWZvciAodSA9IDQ7IHUgPiAwOyB1LS0sIGFkZHIgPj49IDgsIGlvKyspCisJCW91dGIoYWRkciAmIDB4ZmYsIGlvKTsKKwlmb3IgKHUgPSAzOyB1ID4gMDsgdS0tLCBjb3VudCA+Pj0gOCwgaW8rKykKKwkJb3V0Yihjb3VudCAmIDB4ZmYsIGlvKTsKKyNlbHNlIC8qIERNQUJZVEVJTyAqLworCWNvdW50ID4+PSAxOworCWNvdW50LS07CisJb3V0bChhZGRyLCBzLT5pb2RtYWMgKyBTVl9ETUFfQUREUjApOworCW91dGwoY291bnQsIHMtPmlvZG1hYyArIFNWX0RNQV9DT1VOVDApOworI2VuZGlmIC8qIERNQUJZVEVJTyAqLworCW91dGIoMHgxNCwgcy0+aW9kbWFjICsgU1ZfRE1BX01PREUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF9kbWFhKHN0cnVjdCBzdl9zdGF0ZSAqcykKK3sKKyNpZmRlZiBETUFCWVRFSU8KKwl1bnNpZ25lZCBpbyA9IHMtPmlvZG1hYSs2LCB2ID0gMCwgdTsKKworCWZvciAodSA9IDM7IHUgPiAwOyB1LS0sIGlvLS0pIHsKKwkJdiA8PD0gODsKKwkJdiB8PSBpbmIoaW8pOworCX0KKwlyZXR1cm4gdiArIDE7CisjZWxzZSAvKiBETUFCWVRFSU8gKi8KKwlyZXR1cm4gKGlubChzLT5pb2RtYWEgKyBTVl9ETUFfQ09VTlQwKSAmIDB4ZmZmZmZmKSArIDE7CisjZW5kaWYgLyogRE1BQllURUlPICovCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X2RtYWMoc3RydWN0IHN2X3N0YXRlICpzKQoreworI2lmZGVmIERNQUJZVEVJTworCXVuc2lnbmVkIGlvID0gcy0+aW9kbWFjKzYsIHYgPSAwLCB1OworCisJZm9yICh1ID0gMzsgdSA+IDA7IHUtLSwgaW8tLSkgeworCQl2IDw8PSA4OworCQl2IHw9IGluYihpbyk7CisJfQorCXJldHVybiAodiArIDEpIDw8IDE7CisjZWxzZSAvKiBETUFCWVRFSU8gKi8KKwlyZXR1cm4gKChpbmwocy0+aW9kbWFjICsgU1ZfRE1BX0NPVU5UMCkgJiAweGZmZmZmZikgKyAxKSA8PCAxOworI2VuZGlmIC8qIERNQUJZVEVJTyAqLworfQorCitzdGF0aWMgdm9pZCB3cmluZGlyKHN0cnVjdCBzdl9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciBpZHgsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlvdXRiKGlkeCAmIDB4M2YsIHMtPmlvZW5oICsgU1ZfQ09ERUNfSUFERFIpOworCXVkZWxheSgxMCk7CisJb3V0YihkYXRhLCBzLT5pb2VuaCArIFNWX0NPREVDX0lEQVRBKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciByZGluZGlyKHN0cnVjdCBzdl9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciBpZHgpCit7CisJdW5zaWduZWQgY2hhciB2OworCisJb3V0YihpZHggJiAweDNmLCBzLT5pb2VuaCArIFNWX0NPREVDX0lBRERSKTsKKwl1ZGVsYXkoMTApOworCXYgPSBpbmIocy0+aW9lbmggKyBTVl9DT0RFQ19JREFUQSk7CisJdWRlbGF5KDEwKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZtdChzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgbWFzaywgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCW91dGIoU1ZfQ0lEQVRBRk1UIHwgU1ZfQ0lBRERSX01DRSwgcy0+aW9lbmggKyBTVl9DT0RFQ19JQUREUik7CisJaWYgKG1hc2spIHsKKwkJcy0+Zm10ID0gaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfSURBVEEpOworCQl1ZGVsYXkoMTApOworCX0KKwlzLT5mbXQgPSAocy0+Zm10ICYgbWFzaykgfCBkYXRhOworCW91dGIocy0+Zm10LCBzLT5pb2VuaCArIFNWX0NPREVDX0lEQVRBKTsKKwl1ZGVsYXkoMTApOworCW91dGIoMCwgcy0+aW9lbmggKyBTVl9DT0RFQ19JQUREUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXVkZWxheSgxMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyb2JpbmRpcihzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgaWR4LCB1bnNpZ25lZCBjaGFyIG1hc2ssIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlvdXRiKGlkeCAmIDB4M2YsIHMtPmlvZW5oICsgU1ZfQ09ERUNfSUFERFIpOworCXVkZWxheSgxMCk7CisJb3V0YigoaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfSURBVEEpICYgbWFzaykgXiBkYXRhLCBzLT5pb2VuaCArIFNWX0NPREVDX0lEQVRBKTsKKwl1ZGVsYXkoMTApOworfQorCisjZGVmaW5lIFJFRkZSRVFVRU5DWSAgMjQ1NzYwMDAKKyNkZWZpbmUgQURDTVVMVCA1MTIKKyNkZWZpbmUgRlVMTFJBVEUgNDgwMDAKKworc3RhdGljIHVuc2lnbmVkIHNldHBsbChzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciByLCBtPTAsIG49MDsKKwl1bnNpZ25lZCB4bSwgeG4sIHhyLCB4ZCwgbWV0cmljID0gfjBVOworCS8qIHRoZSB3YXJuaW5ncyBhYm91dCBtIGFuZCBuIHVzZWQgdW5pbml0aWFsaXplZCBhcmUgYm9ndXMgYW5kIG1heSBzYWZlbHkgYmUgaWdub3JlZCAqLworCisJaWYgKHJhdGUgPCA2MjUwMDAvQURDTVVMVCkKKwkJcmF0ZSA9IDYyNTAwMC9BRENNVUxUOworCWlmIChyYXRlID4gMTUwMDAwMDAwL0FEQ01VTFQpCisJCXJhdGUgPSAxNTAwMDAwMDAvQURDTVVMVDsKKwkvKiBzbGlnaHQgdmlvbGF0aW9uIG9mIHNwZWNzLCBuZWVkZWQgZm9yIGNvbnRpbnVvdXMgc2FtcGxpbmcgcmF0ZXMgKi8KKwlmb3IgKHIgPSAwOyByYXRlIDwgNzUwMDAwMDAvQURDTVVMVDsgciArPSAweDIwLCByYXRlIDw8PSAxKTsKKwlmb3IgKHhuID0gMzsgeG4gPCAzNTsgeG4rKykKKwkJZm9yICh4bSA9IDM7IHhtIDwgMTMwOyB4bSsrKSB7CisJCQl4ciA9IFJFRkZSRVFVRU5DWS9BRENNVUxUICogeG0gLyB4bjsKKwkJCXhkID0gYWJzKChzaWduZWQpKHhyIC0gcmF0ZSkpOworCQkJaWYgKHhkIDwgbWV0cmljKSB7CisJCQkJbWV0cmljID0geGQ7CisJCQkJbSA9IHhtIC0gMjsKKwkJCQluID0geG4gLSAyOworCQkJfQorCQl9CisJcmVnICY9IDB4M2Y7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlvdXRiKHJlZywgcy0+aW9lbmggKyBTVl9DT0RFQ19JQUREUik7CisJdWRlbGF5KDEwKTsKKwlvdXRiKG0sIHMtPmlvZW5oICsgU1ZfQ09ERUNfSURBVEEpOworCXVkZWxheSgxMCk7CisJb3V0YihyZWcrMSwgcy0+aW9lbmggKyBTVl9DT0RFQ19JQUREUik7CisJdWRlbGF5KDEwKTsKKwlvdXRiKHIgfCBuLCBzLT5pb2VuaCArIFNWX0NPREVDX0lEQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJdWRlbGF5KDEwKTsKKwlyZXR1cm4gKFJFRkZSRVFVRU5DWS9BRENNVUxUICogKG0gKyAyKSAvIChuICsgMikpID4+ICgociA+PiA1KSAmIDcpOworfQorCisjaWYgMAorCitzdGF0aWMgdW5zaWduZWQgZ2V0cGxsKHN0cnVjdCBzdl9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciByZWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIG0sIG47CisKKwlyZWcgJj0gMHgzZjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCW91dGIocmVnLCBzLT5pb2VuaCArIFNWX0NPREVDX0lBRERSKTsKKwl1ZGVsYXkoMTApOworCW0gPSBpbmIocy0+aW9lbmggKyBTVl9DT0RFQ19JREFUQSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKHJlZysxLCBzLT5pb2VuaCArIFNWX0NPREVDX0lBRERSKTsKKwl1ZGVsYXkoMTApOworCW4gPSBpbmIocy0+aW9lbmggKyBTVl9DT0RFQ19JREFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXVkZWxheSgxMCk7CisJcmV0dXJuIChSRUZGUkVRVUVOQ1kvQURDTVVMVCAqIChtICsgMikgLyAoKG4gJiAweDFmKSArIDIpKSA+PiAoKG4gPj4gNSkgJiA3KTsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNldF9kYWNfcmF0ZShzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJdW5zaWduZWQgZGl2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA0MDAwKQorCQlyYXRlID0gNDAwMDsKKwlkaXYgPSAocmF0ZSAqIDY1NTM2ICsgRlVMTFJBVEUvMikgLyBGVUxMUkFURTsKKwlpZiAoZGl2ID4gNjU1MzUpCisJCWRpdiA9IDY1NTM1OworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJd3JpbmRpcihzLCBTVl9DSVBDTVNSMSwgZGl2ID4+IDgpOworCXdyaW5kaXIocywgU1ZfQ0lQQ01TUjAsIGRpdik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPnJhdGVkYWMgPSAoZGl2ICogRlVMTFJBVEUgKyAzMjc2OCkgLyA2NTUzNjsKK30KKworc3RhdGljIHZvaWQgc2V0X2FkY19yYXRlKHN0cnVjdCBzdl9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHJhdGUxLCByYXRlMiwgZGl2OworCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgNDAwMCkKKwkJcmF0ZSA9IDQwMDA7CisJcmF0ZTEgPSBzZXRwbGwocywgU1ZfQ0lBRENQTExNLCByYXRlKTsKKwlkaXYgPSAoNDgwMDAgKyByYXRlLzIpIC8gcmF0ZTsKKwlpZiAoZGl2ID4gOCkKKwkJZGl2ID0gODsKKwlyYXRlMiA9ICg0ODAwMCArIGRpdi8yKSAvIGRpdjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXdyaW5kaXIocywgU1ZfQ0lBRENBTFRTUiwgKGRpdi0xKSA8PCA0KTsKKwlpZiAoYWJzKChzaWduZWQpKHJhdGUtcmF0ZTIpKSA8PSBhYnMoKHNpZ25lZCkocmF0ZS1yYXRlMSkpKSB7CisJCXdyaW5kaXIocywgU1ZfQ0lBRENDTEtTT1VSQ0UsIDB4MTApOworCQlzLT5yYXRlYWRjID0gcmF0ZTI7CisJfSBlbHNlIHsKKwkJd3JpbmRpcihzLCBTVl9DSUFEQ0NMS1NPVVJDRSwgMHgwMCk7CisJCXMtPnJhdGVhZGMgPSByYXRlMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfYWRjKHN0cnVjdCBzdl9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5lbmFibGUgJj0gflNWX0NFTkFCTEVfUkU7CisJd3JpbmRpcihzLCBTVl9DSUVOQUJMRSwgcy0+ZW5hYmxlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9kYWMoc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmVuYWJsZSAmPSB+KFNWX0NFTkFCTEVfUFBFIHwgU1ZfQ0VOQUJMRV9QRSk7CisJd3JpbmRpcihzLCBTVl9DSUVOQUJMRSwgcy0+ZW5hYmxlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICgocy0+ZG1hX2RhYy5tYXBwZWQgfHwgcy0+ZG1hX2RhYy5jb3VudCA+IDApICYmIHMtPmRtYV9kYWMucmVhZHkpIHsKKwkJcy0+ZW5hYmxlID0gKHMtPmVuYWJsZSAmIH5TVl9DRU5BQkxFX1BQRSkgfCBTVl9DRU5BQkxFX1BFOworCQl3cmluZGlyKHMsIFNWX0NJRU5BQkxFLCBzLT5lbmFibGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICgocy0+ZG1hX2FkYy5tYXBwZWQgfHwgcy0+ZG1hX2FkYy5jb3VudCA8IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtIDIqcy0+ZG1hX2FkYy5mcmFnc2l6ZSkpIAorCSAgICAmJiBzLT5kbWFfYWRjLnJlYWR5KSB7CisJCXMtPmVuYWJsZSB8PSBTVl9DRU5BQkxFX1JFOworCQl3cmluZGlyKHMsIFNWX0NJRU5BQkxFLCBzLT5lbmFibGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNy1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCitzdGF0aWMgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWlmIChkYi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIsIGRiLT5yYXdidWYsIGRiLT5kbWFhZGRyKTsKKwl9CisJZGItPnJhd2J1ZiA9IE5VTEw7CisJZGItPm1hcHBlZCA9IGRiLT5yZWFkeSA9IDA7Cit9CisKKworLyogRE1BQSBpcyB1c2VkIGZvciBwbGF5YmFjaywgRE1BQyBpcyB1c2VkIGZvciByZWNvcmRpbmcgKi8KKworc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9IHJlYyA/ICZzLT5kbWFfYWRjIDogJnMtPmRtYV9kYWM7CisJdW5zaWduZWQgcmF0ZSA9IHJlYyA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjOworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBieXRlcGVyc2VjOworCXVuc2lnbmVkIGJ1ZnM7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCXVuc2lnbmVkIGNoYXIgZm10OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWZtdCA9IHMtPmZtdDsKKwlpZiAocmVjKSB7CisJCXMtPmVuYWJsZSAmPSB+U1ZfQ0VOQUJMRV9SRTsKKwkJZm10ID4+PSBTVl9DRk1UX0NTSElGVDsKKwl9IGVsc2UgeworCQlzLT5lbmFibGUgJj0gflNWX0NFTkFCTEVfUEU7CisJCWZtdCA+Pj0gU1ZfQ0ZNVF9BU0hJRlQ7CisJfQorCXdyaW5kaXIocywgU1ZfQ0lFTkFCTEUsIHMtPmVuYWJsZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCWZtdCAmPSBTVl9DRk1UX01BU0s7CisJZGItPmh3cHRyID0gZGItPnN3cHRyID0gZGItPnRvdGFsX2J5dGVzID0gZGItPmNvdW50ID0gZGItPmVycm9yID0gZGItPmVuZGNsZWFyZWQgPSAwOworCWlmICghZGItPnJhd2J1ZikgeworCQlkYi0+cmVhZHkgPSBkYi0+bWFwcGVkID0gMDsKKwkJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkKKwkJCWlmICgoZGItPnJhd2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHMtPmRldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAmZGItPmRtYWFkZHIpKSkKKwkJCQlicmVhazsKKwkJaWYgKCFkYi0+cmF3YnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWRiLT5idWZvcmRlciA9IG9yZGVyOworCQlpZiAoKHZpcnRfdG9fYnVzKGRiLT5yYXdidWYpIF4gKHZpcnRfdG9fYnVzKGRiLT5yYXdidWYpICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSkpICYgfjB4ZmZmZikKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzdjogRE1BIGJ1ZmZlciBjcm9zc2VzIDY0ayBib3VuZGFyeTogYnVzYWRkciAweCVseCAgc2l6ZSAlbGRcbiIsIAorCQkJICAgICAgIHZpcnRfdG9fYnVzKGRiLT5yYXdidWYpLCBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKTsKKwkJaWYgKCh2aXJ0X3RvX2J1cyhkYi0+cmF3YnVmKSArIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpICYgfjB4ZmZmZmZmKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgInN2OiBETUEgYnVmZmVyIGJleW9uZCAxNk1COiBidXNhZGRyIDB4JWx4ICBzaXplICVsZFxuIiwgCisJCQkgICAgICAgdmlydF90b19idXMoZGItPnJhd2J1ZiksIFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpOworCQkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisJfQorCWJ5dGVwZXJzZWMgPSByYXRlIDw8IHNhbXBsZV9zaGlmdFtmbXRdOworCWJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworCWlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVwZXJzZWMpCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwMCk7CisJCWVsc2UKKwkJCWRiLT5mcmFnc2hpZnQgPSBkYi0+b3NzZnJhZ3NoaWZ0OworCX0gZWxzZSB7CisJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAvKGRiLT5zdWJkaXZpc2lvbiA/IGRiLT5zdWJkaXZpc2lvbiA6IDEpKTsKKwkJaWYgKGRiLT5mcmFnc2hpZnQgPCAzKQorCQkJZGItPmZyYWdzaGlmdCA9IDM7CisJfQorCWRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl9CisJZGItPmZyYWdzaXplID0gMSA8PCBkYi0+ZnJhZ3NoaWZ0OworCWlmIChkYi0+b3NzbWF4ZnJhZ3MgPj0gNCAmJiBkYi0+b3NzbWF4ZnJhZ3MgPCBkYi0+bnVtZnJhZykKKwkJZGItPm51bWZyYWcgPSBkYi0+b3NzbWF4ZnJhZ3M7CisJZGItPmZyYWdzYW1wbGVzID0gZGItPmZyYWdzaXplID4+IHNhbXBsZV9zaGlmdFtmbXRdOworCWRiLT5kbWFzaXplID0gZGItPm51bWZyYWcgPDwgZGItPmZyYWdzaGlmdDsKKwltZW1zZXQoZGItPnJhd2J1ZiwgKGZtdCAmIFNWX0NGTVRfMTZCSVQpID8gMCA6IDB4ODAsIGRiLT5kbWFzaXplKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmIChyZWMpIHsKKwkJc2V0X2RtYWMocywgZGItPmRtYWFkZHIsIGRiLT5udW1mcmFnIDw8IGRiLT5mcmFnc2hpZnQpOworCQkvKiBwcm9ncmFtIGVuaGFuY2VkIG1vZGUgcmVnaXN0ZXJzICovCisJCXdyaW5kaXIocywgU1ZfQ0lETUFDQkFTRUNPVU5UMSwgKGRiLT5mcmFnc2FtcGxlcy0xKSA+PiA4KTsKKwkJd3JpbmRpcihzLCBTVl9DSURNQUNCQVNFQ09VTlQwLCBkYi0+ZnJhZ3NhbXBsZXMtMSk7CisJfSBlbHNlIHsKKwkJc2V0X2RtYWEocywgZGItPmRtYWFkZHIsIGRiLT5udW1mcmFnIDw8IGRiLT5mcmFnc2hpZnQpOworCQkvKiBwcm9ncmFtIGVuaGFuY2VkIG1vZGUgcmVnaXN0ZXJzICovCisJCXdyaW5kaXIocywgU1ZfQ0lETUFBQkFTRUNPVU5UMSwgKGRiLT5mcmFnc2FtcGxlcy0xKSA+PiA4KTsKKwkJd3JpbmRpcihzLCBTVl9DSURNQUFCQVNFQ09VTlQwLCBkYi0+ZnJhZ3NhbXBsZXMtMSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlkYi0+ZW5hYmxlZCA9IDE7CisJZGItPnJlYWR5ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2FkdmFuY2Uoc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGNoYXIgYyA9IChzLT5mbXQgJiAoU1ZfQ0ZNVF8xNkJJVCA8PCBTVl9DRk1UX0FTSElGVCkpID8gMCA6IDB4ODA7CisJdW5zaWduZWQgY2hhciAqYnVmID0gcy0+ZG1hX2RhYy5yYXdidWY7CisJdW5zaWduZWQgYnNpemUgPSBzLT5kbWFfZGFjLmRtYXNpemU7CisJdW5zaWduZWQgYnB0ciA9IHMtPmRtYV9kYWMuc3dwdHI7CisJdW5zaWduZWQgbGVuID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKworCWlmIChicHRyICsgbGVuID4gYnNpemUpIHsKKwkJdW5zaWduZWQgeCA9IGJzaXplIC0gYnB0cjsKKwkJbWVtc2V0KGJ1ZiArIGJwdHIsIGMsIHgpOworCQlicHRyID0gMDsKKwkJbGVuIC09IHg7CisJfQorCW1lbXNldChidWYgKyBicHRyLCBjLCBsZW4pOworfQorCisvKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCEgKi8KK3N0YXRpYyB2b2lkIHN2X3VwZGF0ZV9wdHIoc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGh3cHRyOworCWludCBkaWZmOworCisJLyogdXBkYXRlIEFEQyBwb2ludGVyICovCisJaWYgKHMtPmRtYV9hZGMucmVhZHkpIHsKKwkJaHdwdHIgPSAocy0+ZG1hX2FkYy5kbWFzaXplIC0gZ2V0X2RtYWMocykpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlkaWZmID0gKHMtPmRtYV9hZGMuZG1hc2l6ZSArIGh3cHRyIC0gcy0+ZG1hX2FkYy5od3B0cikgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisJCXMtPmRtYV9hZGMuaHdwdHIgPSBod3B0cjsKKwkJcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQlzLT5kbWFfYWRjLmNvdW50ICs9IGRpZmY7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgCisJCQl3YWtlX3VwKCZzLT5kbWFfYWRjLndhaXQpOworCQlpZiAoIXMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtICgoMyAqIHMtPmRtYV9hZGMuZnJhZ3NpemUpID4+IDEpKSkgeworCQkJCXMtPmVuYWJsZSAmPSB+U1ZfQ0VOQUJMRV9SRTsKKwkJCQl3cmluZGlyKHMsIFNWX0NJRU5BQkxFLCBzLT5lbmFibGUpOworCQkJCXMtPmRtYV9hZGMuZXJyb3IrKzsKKwkJCX0KKwkJfQorCX0KKwkvKiB1cGRhdGUgREFDIHBvaW50ZXIgKi8KKwlpZiAocy0+ZG1hX2RhYy5yZWFkeSkgeworCQlod3B0ciA9IChzLT5kbWFfZGFjLmRtYXNpemUgLSBnZXRfZG1hYShzKSkgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCWRpZmYgPSAocy0+ZG1hX2RhYy5kbWFzaXplICsgaHdwdHIgLSBzLT5kbWFfZGFjLmh3cHRyKSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJcy0+ZG1hX2RhYy5od3B0ciA9IGh3cHRyOworCQlzLT5kbWFfZGFjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkgeworCQkJcy0+ZG1hX2RhYy5jb3VudCArPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMud2FpdCk7CisJCX0gZWxzZSB7CisJCQlzLT5kbWFfZGFjLmNvdW50IC09IGRpZmY7CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA8PSAwKSB7CisJCQkJcy0+ZW5hYmxlICY9IH5TVl9DRU5BQkxFX1BFOworCQkJCXdyaW5kaXIocywgU1ZfQ0lFTkFCTEUsIHMtPmVuYWJsZSk7CisJCQkJcy0+ZG1hX2RhYy5lcnJvcisrOworCQkJfSBlbHNlIGlmIChzLT5kbWFfZGFjLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSAmJiAhcy0+ZG1hX2RhYy5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzKTsKKwkJCQlzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAxOworCQkJfQorCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUgPD0gKHNpZ25lZClzLT5kbWFfZGFjLmRtYXNpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYy53YWl0KTsKKwkJfQorCX0KK30KKworLyogaG9sZCBzcGlubG9jayBmb3IgdGhlIGZvbGxvd2luZyEgKi8KK3N0YXRpYyB2b2lkIHN2X2hhbmRsZV9taWRpKHN0cnVjdCBzdl9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCWludCB3YWtlOworCisJd2FrZSA9IDA7CisJd2hpbGUgKCEoaW5iKHMtPmlvbWlkaSsxKSAmIDB4ODApKSB7CisJCWNoID0gaW5iKHMtPmlvbWlkaSk7CisJCWlmIChzLT5taWRpLmljbnQgPCBNSURJSU5CVUYpIHsKKwkJCXMtPm1pZGkuaWJ1ZltzLT5taWRpLml3cl0gPSBjaDsKKwkJCXMtPm1pZGkuaXdyID0gKHMtPm1pZGkuaXdyICsgMSkgJSBNSURJSU5CVUY7CisJCQlzLT5taWRpLmljbnQrKzsKKwkJfQorCQl3YWtlID0gMTsKKwl9CisJaWYgKHdha2UpCisJCXdha2VfdXAoJnMtPm1pZGkuaXdhaXQpOworCXdha2UgPSAwOworCXdoaWxlICghKGluYihzLT5pb21pZGkrMSkgJiAweDQwKSAmJiBzLT5taWRpLm9jbnQgPiAwKSB7CisJCW91dGIocy0+bWlkaS5vYnVmW3MtPm1pZGkub3JkXSwgcy0+aW9taWRpKTsKKwkJcy0+bWlkaS5vcmQgPSAocy0+bWlkaS5vcmQgKyAxKSAlIE1JRElPVVRCVUY7CisJCXMtPm1pZGkub2NudC0tOworCQlpZiAocy0+bWlkaS5vY250IDwgTUlESU9VVEJVRi0xNikKKwkJCXdha2UgPSAxOworCX0KKwlpZiAod2FrZSkKKwkJd2FrZV91cCgmcy0+bWlkaS5vd2FpdCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IHN2X3N0YXRlICpzID0gKHN0cnVjdCBzdl9zdGF0ZSAqKWRldl9pZDsKKwl1bnNpZ25lZCBpbnQgaW50c3JjOworCQorCS8qIGZhc3RwYXRoIG91dCwgdG8gZWFzZSBpbnRlcnJ1cHQgc2hhcmluZyAqLworCWludHNyYyA9IGluYihzLT5pb2VuaCArIFNWX0NPREVDX1NUQVRVUyk7CisJaWYgKCEoaW50c3JjICYgKFNWX0NTVEFUX0RNQUEgfCBTVl9DU1RBVF9ETUFDIHwgU1ZfQ1NUQVRfTUlESSkpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwlzdl91cGRhdGVfcHRyKHMpOworCXN2X2hhbmRsZV9taWRpKHMpOworCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHN2X21pZGlfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzdl9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc3Zfc3RhdGUgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzdl9oYW5kbGVfbWlkaShzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+bWlkaS50aW1lci5leHBpcmVzID0gamlmZmllcysxOworCWFkZF90aW1lcigmcy0+bWlkaS50aW1lcik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPSBLRVJOX0NSSVQgInN2OiBpbnZhbGlkIG1hZ2ljIHZhbHVlXG4iOworCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICghKHMpIHx8IChzKS0+bWFnaWMgIT0gU1ZfTUFHSUMpIHsgXAorCQlwcmludGsoaW52YWxpZF9tYWdpYyk7ICAgICAgICAgICAgXAorCQlyZXR1cm4gLUVOWElPOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1UXzQgICAgICAgICAgMQorI2RlZmluZSBNVF81TVVURSAgICAgIDIKKyNkZWZpbmUgTVRfNE1VVEVNT05PICAzCisjZGVmaW5lIE1UXzZNVVRFICAgICAgNAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBsZWZ0OjU7CisJdW5zaWduZWQgcmlnaHQ6NTsKKwl1bnNpZ25lZCB0eXBlOjM7CisJdW5zaWduZWQgcmVjOjM7Cit9IG1peHRhYmxlW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7CisJW1NPVU5EX01JWEVSX1JFQ0xFVl0gPSB7IFNWX0NJTUlYX0FEQ0lOTCwgICAgU1ZfQ0lNSVhfQURDSU5SLCAgICBNVF80LCAgICAgICAgIDAgfSwKKwlbU09VTkRfTUlYRVJfTElORTFdICA9IHsgU1ZfQ0lNSVhfQVVYMUlOTCwgICBTVl9DSU1JWF9BVVgxSU5SLCAgIE1UXzVNVVRFLCAgICAgNSB9LAorCVtTT1VORF9NSVhFUl9DRF0gICAgID0geyBTVl9DSU1JWF9DRElOTCwgICAgIFNWX0NJTUlYX0NESU5SLCAgICAgTVRfNU1VVEUsICAgICAxIH0sCisJW1NPVU5EX01JWEVSX0xJTkVdICAgPSB7IFNWX0NJTUlYX0xJTkVJTkwsICAgU1ZfQ0lNSVhfTElORUlOUiwgICBNVF81TVVURSwgICAgIDQgfSwKKwlbU09VTkRfTUlYRVJfTUlDXSAgICA9IHsgU1ZfQ0lNSVhfTUlDSU4sICAgICBTVl9DSU1JWF9BRENJTkwsICAgIE1UXzRNVVRFTU9OTywgNiB9LAorCVtTT1VORF9NSVhFUl9TWU5USF0gID0geyBTVl9DSU1JWF9TWU5USElOTCwgIFNWX0NJTUlYX1NZTlRISU5SLCAgTVRfNU1VVEUsICAgICAyIH0sCisJW1NPVU5EX01JWEVSX0xJTkUyXSAgPSB7IFNWX0NJTUlYX0FVWDJJTkwsICAgU1ZfQ0lNSVhfQVVYMklOUiwgICBNVF81TVVURSwgICAgIDMgfSwKKwlbU09VTkRfTUlYRVJfVk9MVU1FXSA9IHsgU1ZfQ0lNSVhfQU5BTE9HSU5MLCBTVl9DSU1JWF9BTkFMT0dJTlIsIE1UXzVNVVRFLCAgICAgNyB9LAorCVtTT1VORF9NSVhFUl9QQ01dICAgID0geyBTVl9DSU1JWF9QQ01JTkwsICAgIFNWX0NJTUlYX1BDTUlOUiwgICAgTVRfNk1VVEUsICAgICAwIH0KK307CisKKyNpZmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKworc3RhdGljIGludCByZXR1cm5fbWl4dmFsKHN0cnVjdCBzdl9zdGF0ZSAqcywgdW5zaWduZWQgaSwgaW50ICphcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGwsIHIsIHJsLCBycjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJbCA9IHJkaW5kaXIocywgbWl4dGFibGVbaV0ubGVmdCk7CisJciA9IHJkaW5kaXIocywgbWl4dGFibGVbaV0ucmlnaHQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKG1peHRhYmxlW2ldLnR5cGUpIHsKKwljYXNlIE1UXzQ6CisJCXIgJj0gMHhmOworCQlsICY9IDB4ZjsKKwkJcmwgPSAxMCArIDYgKiAobCAmIDE1KTsKKwkJcnIgPSAxMCArIDYgKiAociAmIDE1KTsKKwkJYnJlYWs7CisKKwljYXNlIE1UXzRNVVRFTU9OTzoKKwkJcmwgPSA1NSAtIDMgKiAobCAmIDE1KTsKKwkJaWYgKHIgJiAweDEwKQorCQkJcmwgKz0gNDU7CisJCXJyID0gcmw7CisJCXIgPSBsOworCQlicmVhazsKKworCWNhc2UgTVRfNU1VVEU6CisJZGVmYXVsdDoKKwkJcmwgPSAxMDAgLSAzICogKGwgJiAzMSk7CisJCXJyID0gMTAwIC0gMyAqIChyICYgMzEpOworCQlicmVhazsKKwkJCQkKKwljYXNlIE1UXzZNVVRFOgorCQlybCA9IDEwMCAtIDMgKiAobCAmIDYzKSAvIDI7CisJCXJyID0gMTAwIC0gMyAqIChyICYgNjMpIC8gMjsKKwkJYnJlYWs7CisJfQorCWlmIChsICYgMHg4MCkKKwkJcmwgPSAwOworCWlmIChyICYgMHg4MCkKKwkJcnIgPSAwOworCXJldHVybiBwdXRfdXNlcigocnIgPDwgOCkgfCBybCwgYXJnKTsKK30KKworI2Vsc2UgLyogT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHZvbGlkeFtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0gCit7CisJW1NPVU5EX01JWEVSX1JFQ0xFVl0gPSAxLAorCVtTT1VORF9NSVhFUl9MSU5FMV0gID0gMiwKKwlbU09VTkRfTUlYRVJfQ0RdICAgICA9IDMsCisJW1NPVU5EX01JWEVSX0xJTkVdICAgPSA0LAorCVtTT1VORF9NSVhFUl9NSUNdICAgID0gNSwKKwlbU09VTkRfTUlYRVJfU1lOVEhdICA9IDYsCisJW1NPVU5EX01JWEVSX0xJTkUyXSAgPSA3LAorCVtTT1VORF9NSVhFUl9WT0xVTUVdID0gOCwKKwlbU09VTkRfTUlYRVJfUENNXSAgICA9IDkKK307CisKKyNlbmRpZiAvKiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MgKi8KKworc3RhdGljIHVuc2lnbmVkIG1peGVyX3JlY21hc2soc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIGo7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWogPSByZGluZGlyKHMsIFNWX0NJTUlYX0FEQ0lOTCkgPj4gNTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJaiAmPSA3OworCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMgJiYgbWl4dGFibGVbaV0ucmVjICE9IGo7IGkrKyk7CisJcmV0dXJuIDEgPDwgaTsKK30KKworc3RhdGljIGludCBtaXhlcl9pb2N0bChzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIHZhbDsKKwl1bnNpZ25lZCBjaGFyIGwsIHIsIHJsLCBycjsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAgaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCW1peGVyX2luZm8gaW5mbzsKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQlzdHJsY3B5KGluZm8uaWQsICJTb25pY1ZpYmVzIiwgc2l6ZW9mKGluZm8uaWQpKTsKKwkJc3RybGNweShpbmZvLm5hbWUsICJTMyBTb25pY1ZpYmVzIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpbmZvLm1vZGlmeV9jb3VudGVyID0gcy0+bWl4Lm1vZGNudDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CisJCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCXN0cmxjcHkoaW5mby5pZCwgIlNvbmljVmliZXMiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgIlMzIFNvbmljVmliZXMiLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfUFJJVkFURTEpIHsgIC8qIFNSUyBzZXR0aW5ncyAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAodmFsICYgMSkgeworCQkJaWYgKHZhbCAmIDIpIHsKKwkJCQlsID0gNCAtICgodmFsID4+IDIpICYgNyk7CisJCQkJaWYgKGwgJiB+MykKKwkJCQkJbCA9IDQ7CisJCQkJciA9IDQgLSAoKHZhbCA+PiA1KSAmIDcpOworCQkJCWlmIChyICYgfjMpCisJCQkJCXIgPSA0OworCQkJCXdyaW5kaXIocywgU1ZfQ0lTUlNTUEFDRSwgbCk7CisJCQkJd3JpbmRpcihzLCBTVl9DSVNSU0NFTlRFUiwgcik7CisJCQl9IGVsc2UKKwkJCQl3cmluZGlyKHMsIFNWX0NJU1JTU1BBQ0UsIDB4ODApOworCQl9CisJCWwgPSByZGluZGlyKHMsIFNWX0NJU1JTU1BBQ0UpOworCQlyID0gcmRpbmRpcihzLCBTVl9DSVNSU0NFTlRFUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGwgJiAweDgwKQorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCQlyZXR1cm4gcHV0X3VzZXIoKCg0IC0gKGwgJiA3KSkgPDwgMikgfCAoKDQgLSAociAmIDcpKSA8PCA1KSB8IDIsIHApOworCX0KKwlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ00nIHx8IF9TSU9DX1NJWkUoY21kKSAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgaWYgKF9TSU9DX0RJUihjbWQpID09IF9TSU9DX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJcmV0dXJuIHB1dF91c2VyKG1peGVyX3JlY21hc2socyksIHApOworCQkJCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIGRldmljZSAqLworCQkJZm9yICh2YWwgPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQkJCWlmIChtaXh0YWJsZVtpXS50eXBlKQorCQkJCQl2YWwgfD0gMSA8PCBpOworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJZm9yICh2YWwgPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQkJCWlmIChtaXh0YWJsZVtpXS5yZWMpCisJCQkJCXZhbCB8PSAxIDw8IGk7CisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCQorICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogLyogTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gKi8KKwkJCWZvciAodmFsID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCQlpZiAobWl4dGFibGVbaV0udHlwZSAmJiBtaXh0YWJsZVtpXS50eXBlICE9IE1UXzRNVVRFTU9OTykKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkJCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX0NBUF9FWENMX0lOUFVULCBwKTsKKworCQlkZWZhdWx0OgorCQkJaSA9IF9JT0NfTlIoY21kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCAhbWl4dGFibGVbaV0udHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCQlyZXR1cm4gcmV0dXJuX21peHZhbChzLCBpLCBwKTsKKyNlbHNlIC8qIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUyAqLworCQkJaWYgKCF2b2xpZHhbaV0pCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFt2b2xpZHhbaV0tMV0sIHApOworI2VuZGlmIC8qIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUyAqLworCQl9CisJfQorICAgICAgICBpZiAoX1NJT0NfRElSKGNtZCkgIT0gKF9TSU9DX1JFQUR8X1NJT0NfV1JJVEUpKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisJcy0+bWl4Lm1vZGNudCsrOworCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWkgPSBod2VpZ2h0MzIodmFsKTsKKwkJaWYgKGkgPT0gMCkKKwkJCXJldHVybiAwOyAvKnZhbCA9IG1peGVyX3JlY21hc2socyk7Ki8KKwkJZWxzZSBpZiAoaSA+IDEpIAorCQkJdmFsICY9IH5taXhlcl9yZWNtYXNrKHMpOworCQlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspIHsKKwkJCWlmICghKHZhbCAmICgxIDw8IGkpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChtaXh0YWJsZVtpXS5yZWMpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFtaXh0YWJsZVtpXS5yZWMpCisJCQlyZXR1cm4gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZnJvYmluZGlyKHMsIFNWX0NJTUlYX0FEQ0lOTCwgMHgxZiwgbWl4dGFibGVbaV0ucmVjIDw8IDUpOworCQlmcm9iaW5kaXIocywgU1ZfQ0lNSVhfQURDSU5SLCAweDFmLCBtaXh0YWJsZVtpXS5yZWMgPDwgNSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlpID0gX0lPQ19OUihjbWQpOworCQlpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgIW1peHRhYmxlW2ldLnR5cGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbCA9IHZhbCAmIDB4ZmY7CisJCXIgPSAodmFsID4+IDgpICYgMHhmZjsKKwkJaWYgKG1peHRhYmxlW2ldLnR5cGUgPT0gTVRfNE1VVEVNT05PKQorCQkJbCA9IChyICsgbCkgLyAyOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCWlmIChyID4gMTAwKQorCQkJciA9IDEwMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc3dpdGNoIChtaXh0YWJsZVtpXS50eXBlKSB7CisJCWNhc2UgTVRfNDoKKwkJCWlmIChsID49IDEwKQorCQkJCWwgLT0gMTA7CisJCQlpZiAociA+PSAxMCkKKwkJCQlyIC09IDEwOworCQkJZnJvYmluZGlyKHMsIG1peHRhYmxlW2ldLmxlZnQsIDB4ZjAsIGwgLyA2KTsKKwkJCWZyb2JpbmRpcihzLCBtaXh0YWJsZVtpXS5yaWdodCwgMHhmMCwgbCAvIDYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNVF80TVVURU1PTk86CisJCQlyciA9IDA7CisJCQlpZiAobCA8IDEwKQorCQkJCXJsID0gMHg4MDsKKwkJCWVsc2UgeworCQkJCWlmIChsID49IDU1KSB7CisJCQkJCXJyID0gMHgxMDsKKwkJCQkJbCAtPSA0NTsKKwkJCQl9CisJCQkJcmwgPSAoNTUgLSBsKSAvIDM7CisJCQl9CisJCQl3cmluZGlyKHMsIG1peHRhYmxlW2ldLmxlZnQsIHJsKTsKKwkJCWZyb2JpbmRpcihzLCBtaXh0YWJsZVtpXS5yaWdodCwgfjB4MTAsIHJyKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgTVRfNU1VVEU6CisJCQlpZiAobCA8IDcpCisJCQkJcmwgPSAweDgwOworCQkJZWxzZQorCQkJCXJsID0gKDEwMCAtIGwpIC8gMzsKKwkJCWlmIChyIDwgNykKKwkJCQlyciA9IDB4ODA7CisJCQllbHNlCisJCQkJcnIgPSAoMTAwIC0gcikgLyAzOworCQkJd3JpbmRpcihzLCBtaXh0YWJsZVtpXS5sZWZ0LCBybCk7CisJCQl3cmluZGlyKHMsIG1peHRhYmxlW2ldLnJpZ2h0LCBycik7CisJCQlicmVhazsKKwkJCQkKKwkJY2FzZSBNVF82TVVURToKKwkJCWlmIChsIDwgNikKKwkJCQlybCA9IDB4ODA7CisJCQllbHNlCisJCQkJcmwgPSAoMTAwIC0gbCkgKiAyIC8gMzsKKwkJCWlmIChyIDwgNikKKwkJCQlyciA9IDB4ODA7CisJCQllbHNlCisJCQkJcnIgPSAoMTAwIC0gcikgKiAyIC8gMzsKKwkJCXdyaW5kaXIocywgbWl4dGFibGVbaV0ubGVmdCwgcmwpOworCQkJd3JpbmRpcihzLCBtaXh0YWJsZVtpXS5yaWdodCwgcnIpOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5fbWl4dmFsKHMsIGksIHApOworI2Vsc2UgLyogT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTICovCisJCWlmICghdm9saWR4W2ldKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXMtPm1peC52b2xbdm9saWR4W2ldLTFdID0gdmFsOworCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFt2b2xpZHhbaV0tMV0sIHApOworI2VuZGlmIC8qIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUyAqLworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc3Zfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBzdl9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc3Zfc3RhdGUsIGRldnMpOworCQlpZiAocy0+ZGV2X21peGVyID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzdl9yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCQorCVZBTElEQVRFX1NUQVRFKHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN2X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIG1peGVyX2lvY3RsKChzdHJ1Y3Qgc3Zfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGEsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN2X21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBzdl9pb2N0bF9taXhkZXYsCisJLm9wZW4JCT0gc3Zfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSBzdl9yZWxlYXNlX21peGRldiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGRyYWluX2RhYyhzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCwgdG1vOworCisJaWYgKHMtPmRtYV9kYWMubWFwcGVkIHx8ICFzLT5kbWFfZGFjLnJlYWR5KQorCQlyZXR1cm4gMDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgICAgICBmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9kYWMuY291bnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobm9uYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICAgICAgICAgIH0KKwkJdG1vID0gMyAqIEhaICogKGNvdW50ICsgcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgLyAyIC8gcy0+cmF0ZWRhYzsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPmZtdCA+PiBTVl9DRk1UX0FTSElGVCkgJiBTVl9DRk1UX01BU0tdOworCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vICsgMSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAic3Y6IGRtYSB0aW1lZCBvdXQ/P1xuIik7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCBzdl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDEpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSAwOworI2lmIDAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXN2X3VwZGF0ZV9wdHIocyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworI2VuZGlmCisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXN3cHRyID0gcy0+ZG1hX2FkYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2FkYy5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA8IGNudCkKKwkJCWNudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5lbmFibGVkKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KEhaKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzdjogcmVhZDogY2hpcCBsb2NrdXA/IGRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKKwkJCQkgICAgICAgcy0+ZG1hX2FkYy5kbWFzaXplLCBzLT5kbWFfYWRjLmZyYWdzaXplLCBzLT5kbWFfYWRjLmNvdW50LCAKKwkJCQkgICAgICAgcy0+ZG1hX2FkYy5od3B0ciwgcy0+ZG1hX2FkYy5zd3B0cik7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlzZXRfZG1hYyhzLCB2aXJ0X3RvX2J1cyhzLT5kbWFfYWRjLnJhd2J1ZiksIHMtPmRtYV9hZGMubnVtZnJhZyA8PCBzLT5kbWFfYWRjLmZyYWdzaGlmdCk7CisJCQkJLyogcHJvZ3JhbSBlbmhhbmNlZCBtb2RlIHJlZ2lzdGVycyAqLworCQkJCXdyaW5kaXIocywgU1ZfQ0lETUFDQkFTRUNPVU5UMSwgKHMtPmRtYV9hZGMuZnJhZ3NhbXBsZXMtMSkgPj4gOCk7CisJCQkJd3JpbmRpcihzLCBTVl9DSURNQUNCQVNFQ09VTlQwLCBzLT5kbWFfYWRjLmZyYWdzYW1wbGVzLTEpOworCQkJCXMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLmh3cHRyID0gcy0+ZG1hX2FkYy5zd3B0ciA9IDA7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfYWRjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9hZGMuY291bnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKKwkJCXN0YXJ0X2FkYyhzKTsKKwl9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN2X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisjaWYgMAorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc3ZfdXBkYXRlX3B0cihzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisjZW5kaWYKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHMtPmRtYV9kYWMuY291bnQgPCAwKSB7CisJCQlzLT5kbWFfZGFjLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+ZG1hX2RhYy5jb3VudCArIGNudCA+IHMtPmRtYV9kYWMuZG1hc2l6ZSkKKwkJCWNudCA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIHMtPmRtYV9kYWMuY291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5lbmFibGVkKQorCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KEhaKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzdjogd3JpdGU6IGNoaXAgbG9ja3VwPyBkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCisJCQkJICAgICAgIHMtPmRtYV9kYWMuZG1hc2l6ZSwgcy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcy0+ZG1hX2RhYy5jb3VudCwgCisJCQkJICAgICAgIHMtPmRtYV9kYWMuaHdwdHIsIHMtPmRtYV9kYWMuc3dwdHIpOworCQkJCXN0b3BfZGFjKHMpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJc2V0X2RtYWEocywgdmlydF90b19idXMocy0+ZG1hX2RhYy5yYXdidWYpLCBzLT5kbWFfZGFjLm51bWZyYWcgPDwgcy0+ZG1hX2RhYy5mcmFnc2hpZnQpOworCQkJCS8qIHByb2dyYW0gZW5oYW5jZWQgbW9kZSByZWdpc3RlcnMgKi8KKwkJCQl3cmluZGlyKHMsIFNWX0NJRE1BQUJBU0VDT1VOVDEsIChzLT5kbWFfZGFjLmZyYWdzYW1wbGVzLTEpID4+IDgpOworCQkJCXdyaW5kaXIocywgU1ZfQ0lETUFBQkFTRUNPVU5UMCwgcy0+ZG1hX2RhYy5mcmFnc2FtcGxlcy0xKTsKKwkJCQlzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy5od3B0ciA9IHMtPmRtYV9kYWMuc3dwdHIgPSAwOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYy5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfZGFjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9kYWMuY291bnQgKz0gY250OworCQlzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9kYWMuZW5hYmxlZCkKKwkJCXN0YXJ0X2RhYyhzKTsKKwl9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50IHN2X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1ZihzLCAxKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1ZihzLCAwKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc3ZfdXBkYXRlX3B0cihzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2lnbmVkKXMtPmRtYV9kYWMuZG1hc2l6ZSA+PSBzLT5kbWFfZGFjLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IHN2X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzdl9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc3Zfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYWJ1ZiAqZGI7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWYocywgMSkpICE9IDApCisJCQlnb3RvIG91dDsKKwkJZGIgPSAmcy0+ZG1hX2RhYzsKKwl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWYocywgMCkpICE9IDApCisJCQlnb3RvIG91dDsKKwkJZGIgPSAmcy0+ZG1hX2FkYzsKKwl9IGVsc2UgCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkKKwkJZ290byBvdXQ7CisJcmV0ID0gLUVBR0FJTjsKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQl2aXJ0X3RvX3BoeXMoZGItPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCQlzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCWdvdG8gb3V0OworCWRiLT5tYXBwZWQgPSAxOworCXJldCA9IDA7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3ZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzdl9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc3Zfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgYXVkaW9fYnVmX2luZm8gYWJpbmZvOworICAgICAgICBjb3VudF9pbmZvIGNpbmZvOworCWludCBjb3VudDsKKwlpbnQgdmFsLCBtYXBwZWQsIHJldDsKKwl1bnNpZ25lZCBjaGFyIGZtdG0sIGZtdGQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAgbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYy5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywgMC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sqLyk7CisJCXJldHVybiAwOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQkJcy0+ZG1hX2RhYy5zd3B0ciA9IHMtPmRtYV9kYWMuaHdwdHIgPSBzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9IDA7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2FkYy5od3B0ciA9IHMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCXNldF9hZGNfcmF0ZShzLCB2YWwpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMocyk7CisJCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQkJc2V0X2RhY19yYXRlKHMsIHZhbCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZm10ZCA9IDA7CisJCWZtdG0gPSB+MDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQlpZiAodmFsKQorCQkJCWZtdGQgfD0gU1ZfQ0ZNVF9TVEVSRU8gPDwgU1ZfQ0ZNVF9DU0hJRlQ7CisJCQllbHNlCisJCQkJZm10bSAmPSB+KFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQ1NISUZUKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQlpZiAodmFsKQorCQkJCWZtdGQgfD0gU1ZfQ0ZNVF9TVEVSRU8gPDwgU1ZfQ0ZNVF9BU0hJRlQ7CisJCQllbHNlCisJCQkJZm10bSAmPSB+KFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQVNISUZUKTsKKwkJfQorCQlzZXRfZm10KHMsIGZtdG0sIGZtdGQpOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlmbXRkID0gMDsKKwkJCWZtdG0gPSB+MDsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlmbXRkIHw9IFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQ1NISUZUOworCQkJCWVsc2UKKwkJCQkJZm10bSAmPSB+KFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQ1NISUZUKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJZm10ZCB8PSBTVl9DRk1UX1NURVJFTyA8PCBTVl9DRk1UX0FTSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihTVl9DRk1UX1NURVJFTyA8PCBTVl9DRk1UX0FTSElGVCk7CisJCQl9CisJCQlzZXRfZm10KHMsIGZtdG0sIGZtdGQpOworCQl9CisJCXJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChTVl9DRk1UX1NURVJFTyA8PCBTVl9DRk1UX0NTSElGVCkgCisJCQkJCSAgIDogKFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQVNISUZUKSkpID8gMiA6IDEsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9VOCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJZm10ZCA9IDA7CisJCQlmbXRtID0gfjA7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCWZtdGQgfD0gU1ZfQ0ZNVF8xNkJJVCA8PCBTVl9DRk1UX0NTSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihTVl9DRk1UXzE2QklUIDw8IFNWX0NGTVRfQ1NISUZUKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCWZtdGQgfD0gU1ZfQ0ZNVF8xNkJJVCA8PCBTVl9DRk1UX0FTSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihTVl9DRk1UXzE2QklUIDw8IFNWX0NGTVRfQVNISUZUKTsKKwkJCX0KKwkJCXNldF9mbXQocywgZm10bSwgZm10ZCk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKFNWX0NGTVRfMTZCSVQgPDwgU1ZfQ0ZNVF9DU0hJRlQpIAorCQkJCQkgICA6IChTVl9DRk1UXzE2QklUIDw8IFNWX0NGTVRfQVNISUZUKSkpID8gQUZNVF9TMTZfTEUgOiBBRk1UX1U4LCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCXZhbCA9IDA7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmVuYWJsZSAmIFNWX0NFTkFCTEVfUkUpIAorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5lbmFibGUgJiBTVl9DRU5BQkxFX1BFKSAKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9ICBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJcy0+ZG1hX2FkYy5lbmFibGVkID0gMTsKKwkJCQlzdGFydF9hZGMocyk7CisJCQl9IGVsc2UgeworCQkJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDA7CisJCQkJc3RvcF9hZGMocyk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzLT5kbWFfZGFjLmVuYWJsZWQgPSAxOworCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCX0gZWxzZSB7CisJCQkJcy0+ZG1hX2RhYy5lbmFibGVkID0gMDsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHMsIDApKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc3ZfdXBkYXRlX3B0cihzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIGNvdW50OworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYy5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2RhYy5mcmFnc2hpZnQ7ICAgICAgCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYocywgMSkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzdl91cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bWZyYWc7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsgICAgICAKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorICAgICAgICAgICAgICAgIGZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAwKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXN2X3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCXJldHVybiBwdXRfdXNlcihjb3VudCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYocywgMSkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzdl91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9hZGMuaHdwdHI7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYocywgMCkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzdl91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJCXMtPmRtYV9kYWMuY291bnQgJj0gcy0+ZG1hX2RhYy5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICgodmFsID0gcHJvZ19kbWFidWYocywgMCkpKQorCQkJCXJldHVybiB2YWw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcCk7CisJCX0KKwkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCQlyZXR1cm4gdmFsOworCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSA0OworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc21heGZyYWdzIDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gNDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSA0OworCQl9CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKSB8fAorCQkgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+cmF0ZWFkYyA6IHMtPnJhdGVkYWMsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChTVl9DRk1UX1NURVJFTyA8PCBTVl9DRk1UX0NTSElGVCkgCisJCQkJCSAgIDogKFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQVNISUZUKSkpID8gMiA6IDEsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKFNWX0NGTVRfMTZCSVQgPDwgU1ZfQ0ZNVF9DU0hJRlQpIAorCQkJCQkgICA6IChTVl9DRk1UXzE2QklUIDw8IFNWX0NGTVRfQVNISUZUKSkpID8gMTYgOiA4LCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkKKwl9CisJcmV0dXJuIG1peGVyX2lvY3RsKHMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBzdl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgY2hhciBmbXRtID0gfjAsIGZtdHMgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IHN2X3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzdl9zdGF0ZSwgZGV2cyk7CisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJZm10bSAmPSB+KChTVl9DRk1UX1NURVJFTyB8IFNWX0NGTVRfMTZCSVQpIDw8IFNWX0NGTVRfQ1NISUZUKTsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCWZtdHMgfD0gU1ZfQ0ZNVF8xNkJJVCA8PCBTVl9DRk1UX0NTSElGVDsKKwkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IDA7CisJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDE7CisJCXNldF9hZGNfcmF0ZShzLCA4MDAwKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWZtdG0gJj0gfigoU1ZfQ0ZNVF9TVEVSRU8gfCBTVl9DRk1UXzE2QklUKSA8PCBTVl9DRk1UX0FTSElGVCk7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlmbXRzIHw9IFNWX0NGTVRfMTZCSVQgPDwgU1ZfQ0ZNVF9BU0hJRlQ7CisJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSAwOworCQlzLT5kbWFfZGFjLmVuYWJsZWQgPSAxOworCQlzZXRfZGFjX3JhdGUocywgODAwMCk7CisJfQorCXNldF9mbXQocywgZm10bSwgZm10cyk7CisJcy0+b3Blbl9tb2RlIHw9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHN2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN2X3N0YXRlICpzID0gKHN0cnVjdCBzdl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RvcF9kYWMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RvcF9hZGMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKKwl9CisJcy0+b3Blbl9tb2RlICY9IH4oZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3ZfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gc3ZfcmVhZCwKKwkud3JpdGUJCT0gc3Zfd3JpdGUsCisJLnBvbGwJCT0gc3ZfcG9sbCwKKwkuaW9jdGwJCT0gc3ZfaW9jdGwsCisJLm1tYXAJCT0gc3ZfbW1hcCwKKwkub3BlbgkJPSBzdl9vcGVuLAorCS5yZWxlYXNlCT0gc3ZfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCBzdl9taWRpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzdl9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc3Zfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXQgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLml3YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlwdHIgPSBzLT5taWRpLmlyZDsKKwkJY250ID0gTUlESUlOQlVGIC0gcHRyOworCQlpZiAocy0+bWlkaS5pY250IDwgY250KQorCQkJY250ID0gcy0+bWlkaS5pY250OworCQlpZiAoY250IDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUFHQUlOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPm1pZGkuaWJ1ZiArIHB0ciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESUlOQlVGOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5taWRpLmlyZCA9IHB0cjsKKwkJcy0+bWlkaS5pY250IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWJyZWFrOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkuaXdhaXQsICZ3YWl0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzdl9taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXQgPSAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcHRyID0gcy0+bWlkaS5vd3I7CisJCWNudCA9IE1JRElPVVRCVUYgLSBwdHI7CisJCWlmIChzLT5taWRpLm9jbnQgKyBjbnQgPiBNSURJT1VUQlVGKQorCQkJY250ID0gTUlESU9VVEJVRiAtIHMtPm1pZGkub2NudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzdl9oYW5kbGVfbWlkaShzKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+bWlkaS5vYnVmICsgcHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlwdHIgPSAocHRyICsgY250KSAlIE1JRElPVVRCVUY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPm1pZGkub3dyID0gcHRyOworCQlzLT5taWRpLm9jbnQgKz0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc3ZfaGFuZGxlX21pZGkocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3ZfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHN2X3N0YXRlICpzID0gKHN0cnVjdCBzdl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5taWRpLm93YWl0LCB3YWl0KTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5taWRpLml3YWl0LCB3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5taWRpLmljbnQgPiAwKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHMtPm1pZGkub2NudCA8IE1JRElPVVRCVUYpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgc3ZfbWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBzdl9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc3Zfc3RhdGUsIGRldnMpOworCQlpZiAocy0+ZGV2X21pZGkgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiAoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPm9wZW5fbW9kZSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKSkpIHsKKwkJcy0+bWlkaS5pcmQgPSBzLT5taWRpLml3ciA9IHMtPm1pZGkuaWNudCA9IDA7CisJCXMtPm1pZGkub3JkID0gcy0+bWlkaS5vd3IgPSBzLT5taWRpLm9jbnQgPSAwOworCQkvL291dGIoaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfQ09OVFJPTCkgfCBTVl9DQ1RSTF9XQVZFVEFCTEUsIHMtPmlvZW5oICsgU1ZfQ09ERUNfQ09OVFJPTCk7CisJCW91dGIoaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfSU5UTUFTSykgfCBTVl9DSU5UTUFTS19NSURJLCBzLT5pb2VuaCArIFNWX0NPREVDX0lOVE1BU0spOworCQl3cmluZGlyKHMsIFNWX0NJVUFSVENPTlRST0wsIDUpOyAvKiBvdXRwdXQgTUlESSBkYXRhIHRvIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBzeW50aCAqLworCQl3cmluZGlyKHMsIFNWX0NJV0FWRVRBQkxFU1JDLCAxKTsgLyogV2F2ZXRhYmxlIGluIFBDIFJBTSAqLworCQlvdXRiKDB4ZmYsIHMtPmlvbWlkaSsxKTsgLyogcmVzZXQgY29tbWFuZCAqLworCQlvdXRiKDB4M2YsIHMtPmlvbWlkaSsxKTsgLyogdWFydCBjb21tYW5kICovCisJCWlmICghKGluYihzLT5pb21pZGkrMSkgJiAweDgwKSkKKwkJCWluYihzLT5pb21pZGkpOworCQlzLT5taWRpLmlyZCA9IHMtPm1pZGkuaXdyID0gcy0+bWlkaS5pY250ID0gMDsKKwkJaW5pdF90aW1lcigmcy0+bWlkaS50aW1lcik7CisJCXMtPm1pZGkudGltZXIuZXhwaXJlcyA9IGppZmZpZXMrMTsKKwkJcy0+bWlkaS50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpczsKKwkJcy0+bWlkaS50aW1lci5mdW5jdGlvbiA9IHN2X21pZGlfdGltZXI7CisJCWFkZF90aW1lcigmcy0+bWlkaS50aW1lcik7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+bWlkaS5vcmQgPSBzLT5taWRpLm93ciA9IHMtPm1pZGkub2NudCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzdl9taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN2X3N0YXRlICpzID0gKHN0cnVjdCBzdl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNvdW50LCB0bW87CisKKwlWQUxJREFURV9TVEFURShzKTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCWZvciAoOzspIHsKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQljb3VudCA9IHMtPm1pZGkub2NudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChjb3VudCA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCXVubG9ja19rZXJuZWwoKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJdG1vID0gKGNvdW50ICogSFopIC8gMzEwMDsKKwkJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyA6IDEpICYmIHRtbykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAic3Y6IG1pZGkgdGltZWQgb3V0Pz9cbiIpOworCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJfQorCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlzLT5vcGVuX21vZGUgJj0gfigoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRHxGTU9ERV9NSURJX1dSSVRFKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCW91dGIoaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfSU5UTUFTSykgJiB+U1ZfQ0lOVE1BU0tfTUlESSwgcy0+aW9lbmggKyBTVl9DT0RFQ19JTlRNQVNLKTsKKwkJZGVsX3RpbWVyKCZzLT5taWRpLnRpbWVyKTsJCQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN2X21pZGlfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gc3ZfbWlkaV9yZWFkLAorCS53cml0ZQkJPSBzdl9taWRpX3dyaXRlLAorCS5wb2xsCQk9IHN2X21pZGlfcG9sbCwKKwkub3BlbgkJPSBzdl9taWRpX29wZW4sCisJLnJlbGVhc2UJPSBzdl9taWRpX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzdl9kbWZtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvcF9vZmZzZXRbMThdID0geworCQkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAorCQkweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELAorCQkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1CisJfTsKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbV9mbV92b2ljZSB2OworCXN0cnVjdCBkbV9mbV9ub3RlIG47CisJc3RydWN0IGRtX2ZtX3BhcmFtcyBwOworCXVuc2lnbmVkIGludCBpbzsKKwl1bnNpZ25lZCBpbnQgcmVnYjsKKworCXN3aXRjaCAoY21kKSB7CQkKKwljYXNlIEZNX0lPQ1RMX1JFU0VUOgorCQlmb3IgKHJlZ2IgPSAweGIwOyByZWdiIDwgMHhiOTsgcmVnYisrKSB7CisJCQlvdXRiKHJlZ2IsIHMtPmlvc3ludGgpOworCQkJb3V0YigwLCBzLT5pb3N5bnRoKzEpOworCQkJb3V0YihyZWdiLCBzLT5pb3N5bnRoKzIpOworCQkJb3V0YigwLCBzLT5pb3N5bnRoKzMpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBGTV9JT0NUTF9QTEFZX05PVEU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YobikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChuLnZvaWNlID49IDE4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChuLnZvaWNlID49IDkpIHsKKwkJCXJlZ2IgPSBuLnZvaWNlIC0gOTsKKwkJCWlvID0gcy0+aW9zeW50aCsyOworCQl9IGVsc2UgeworCQkJcmVnYiA9IG4udm9pY2U7CisJCQlpbyA9IHMtPmlvc3ludGg7CisJCX0KKwkJb3V0YigweGEwICsgcmVnYiwgaW8pOworCQlvdXRiKG4uZm51bSAmIDB4ZmYsIGlvKzEpOworCQlvdXRiKDB4YjAgKyByZWdiLCBpbyk7CisJCW91dGIoKChuLmZudW0gPj4gOCkgJiAzKSB8ICgobi5vY3RhdmUgJiA3KSA8PCAyKSB8ICgobi5rZXlfb24gJiAxKSA8PCA1KSwgaW8rMSk7CisJCXJldHVybiAwOworCisJY2FzZSBGTV9JT0NUTF9TRVRfVk9JQ0U6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2LnZvaWNlID49IDE4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJlZ2IgPSBvcF9vZmZzZXRbdi52b2ljZV07CisJCWlvID0gcy0+aW9zeW50aCArICgodi5vcCAmIDEpIDw8IDEpOworCQlvdXRiKDB4MjAgKyByZWdiLCBpbyk7CisJCW91dGIoKCh2LmFtICYgMSkgPDwgNykgfCAoKHYudmlicmF0byAmIDEpIDw8IDYpIHwgKCh2LmRvX3N1c3RhaW4gJiAxKSA8PCA1KSB8IAorCQkgICAgICgodi5rYmRfc2NhbGUgJiAxKSA8PCA0KSB8ICh2Lmhhcm1vbmljICYgMHhmKSwgaW8rMSk7CisJCW91dGIoMHg0MCArIHJlZ2IsIGlvKTsKKwkJb3V0YigoKHYuc2NhbGVfbGV2ZWwgJiAweDMpIDw8IDYpIHwgKHYudm9sdW1lICYgMHgzZiksIGlvKzEpOworCQlvdXRiKDB4NjAgKyByZWdiLCBpbyk7CisJCW91dGIoKCh2LmF0dGFjayAmIDB4ZikgPDwgNCkgfCAodi5kZWNheSAmIDB4ZiksIGlvKzEpOworCQlvdXRiKDB4ODAgKyByZWdiLCBpbyk7CisJCW91dGIoKCh2LnN1c3RhaW4gJiAweGYpIDw8IDQpIHwgKHYucmVsZWFzZSAmIDB4ZiksIGlvKzEpOworCQlvdXRiKDB4ZTAgKyByZWdiLCBpbyk7CisJCW91dGIodi53YXZlZm9ybSAmIDB4NywgaW8rMSk7CisJCWlmIChuLnZvaWNlID49IDkpIHsKKwkJCXJlZ2IgPSBuLnZvaWNlIC0gOTsKKwkJCWlvID0gcy0+aW9zeW50aCsyOworCQl9IGVsc2UgeworCQkJcmVnYiA9IG4udm9pY2U7CisJCQlpbyA9IHMtPmlvc3ludGg7CisJCX0KKwkJb3V0YigweGMwICsgcmVnYiwgaW8pOworCQlvdXRiKCgodi5yaWdodCAmIDEpIDw8IDUpIHwgKCh2LmxlZnQgJiAxKSA8PCA0KSB8ICgodi5mZWVkYmFjayAmIDcpIDw8IDEpIHwKKwkJICAgICAodi5jb25uZWN0aW9uICYgMSksIGlvKzEpOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBGTV9JT0NUTF9TRVRfUEFSQU1TOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsICh2b2lkICpfX3VzZXIgKWFyZywgc2l6ZW9mKHApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlvdXRiKDB4MDgsIHMtPmlvc3ludGgpOworCQlvdXRiKChwLmtiZF9zcGxpdCAmIDEpIDw8IDYsIHMtPmlvc3ludGgrMSk7CisJCW91dGIoMHhiZCwgcy0+aW9zeW50aCk7CisJCW91dGIoKChwLmFtX2RlcHRoICYgMSkgPDwgNykgfCAoKHAudmliX2RlcHRoICYgMSkgPDwgNikgfCAoKHAucmh5dGhtICYgMSkgPDwgNSkgfCAoKHAuYmFzcyAmIDEpIDw8IDQpIHwKKwkJICAgICAoKHAuc25hcmUgJiAxKSA8PCAzKSB8ICgocC50b210b20gJiAxKSA8PCAyKSB8ICgocC5jeW1iYWwgJiAxKSA8PCAxKSB8IChwLmhpaGF0ICYgMSksIHMtPmlvc3ludGgrMSk7CisJCXJldHVybiAwOworCisJY2FzZSBGTV9JT0NUTF9TRVRfT1BMOgorCQlvdXRiKDQsIHMtPmlvc3ludGgrMik7CisJCW91dGIoYXJnLCBzLT5pb3N5bnRoKzMpOworCQlyZXR1cm4gMDsKKworCWNhc2UgRk1fSU9DVExfU0VUX01PREU6CisJCW91dGIoNSwgcy0+aW9zeW50aCsyKTsKKwkJb3V0YihhcmcgJiAxLCBzLT5pb3N5bnRoKzMpOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBzdl9kbWZtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBzdl9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc3Zfc3RhdGUsIGRldnMpOworCQlpZiAocy0+ZGV2X2RtZm0gPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBGTU9ERV9ETUZNKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKwkvKiBpbml0IHRoZSBzdHVmZiAqLworCW91dGIoMSwgcy0+aW9zeW50aCk7CisJb3V0YigweDIwLCBzLT5pb3N5bnRoKzEpOyAvKiBlbmFibGUgd2F2ZWZvcm1zICovCisJb3V0Yig0LCBzLT5pb3N5bnRoKzIpOworCW91dGIoMCwgcy0+aW9zeW50aCszKTsgIC8qIG5vIDRvcCBlbmFibGVkICovCisJb3V0Yig1LCBzLT5pb3N5bnRoKzIpOworCW91dGIoMSwgcy0+aW9zeW50aCszKTsgIC8qIGVuYWJsZSBPUEwzICovCisJcy0+b3Blbl9tb2RlIHw9IEZNT0RFX0RNRk07CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgc3ZfZG1mbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzdl9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc3Zfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHJlZ2I7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlzLT5vcGVuX21vZGUgJj0gfkZNT0RFX0RNRk07CisJZm9yIChyZWdiID0gMHhiMDsgcmVnYiA8IDB4Yjk7IHJlZ2IrKykgeworCQlvdXRiKHJlZ2IsIHMtPmlvc3ludGgpOworCQlvdXRiKDAsIHMtPmlvc3ludGgrMSk7CisJCW91dGIocmVnYiwgcy0+aW9zeW50aCsyKTsKKwkJb3V0YigwLCBzLT5pb3N5bnRoKzMpOworCX0KKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3ZfZG1mbV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gc3ZfZG1mbV9pb2N0bCwKKwkub3BlbgkJPSBzdl9kbWZtX29wZW4sCisJLnJlbGVhc2UJPSBzdl9kbWZtX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbWF4aW11bSBudW1iZXIgb2YgZGV2aWNlczsgb25seSB1c2VkIGZvciBjb21tYW5kIGxpbmUgcGFyYW1zICovCisjZGVmaW5lIE5SX0RFVklDRSA1CisKK3N0YXRpYyBpbnQgcmV2ZXJiW05SX0RFVklDRV07CisKKyNpZiAwCitzdGF0aWMgaW50IHdhdmV0YWJsZVtOUl9ERVZJQ0VdOworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGV2aW5kZXg7CisKK21vZHVsZV9wYXJhbV9hcnJheShyZXZlcmIsIGJvb2wsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZXZlcmIsICJpZiAxIGVuYWJsZXMgdGhlIHJldmVyYiBjaXJjdWl0cnkuIE5PVEU6IHlvdXIgY2FyZCBtdXN0IGhhdmUgdGhlIHJldmVyYiBSQU0iKTsKKyNpZiAwCitNT0RVTEVfUEFSTSh3YXZldGFibGUsICIxLSIgX19NT0RVTEVfU1RSSU5HKE5SX0RFVklDRSkgImkiKTsKK01PRFVMRV9QQVJNX0RFU0Mod2F2ZXRhYmxlLCAiaWYgMSB0aGUgd2F2ZXRhYmxlIHN5bnRoIGlzIGVuYWJsZWQiKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgTS4gU2FpbGVyLCBzYWlsZXJAaWZlLmVlLmV0aHouY2gsIGhiOWpueEBoYjl3LmNoZS5ldSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTMyBTb25pY1ZpYmVzIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGluaXR2b2wgeworCWludCBtaXhjaDsKKwlpbnQgdm9sOworfSBpbml0dm9sW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1JFQ0xFViwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FMSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9DRCwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX01JQywgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9TWU5USCwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FMiwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfUENNLCAweDQwNDAgfQorfTsKKworI2RlZmluZSBSU1JDSVNJT1JFR0lPTihkZXYsbnVtKSAocGNpX3Jlc291cmNlX3N0YXJ0KChkZXYpLCAobnVtKSkgIT0gMCAmJiBcCisJCQkJIChwY2lfcmVzb3VyY2VfZmxhZ3MoKGRldiksIChudW0pKSAmIElPUkVTT1VSQ0VfSU8pKQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdl9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIGludCBpb19wb3J0KQoreworCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvX3BvcnQsIFNWX0VYVEVOVF9HQU1FLCAiUzMgU29uaWNWaWJlcyBHYW1lcG9ydCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Y6IGdhbWVwb3J0IGlvIHBvcnRzIGFyZSBpbiB1c2VcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CisJaWYgKCFncCkgeworCQlwcmludGsoS0VSTl9FUlIgInN2OiBjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3JlZ2lvbihpb19wb3J0LCBTVl9FWFRFTlRfR0FNRSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWdhbWVwb3J0X3NldF9uYW1lKGdwLCAiUzMgU29uaWNWaWJlcyBHYW1lcG9ydCIpOworCWdhbWVwb3J0X3NldF9waHlzKGdwLCAiaXNhJTA0eC9nYW1lcG9ydDAiLCBpb19wb3J0KTsKKwlncC0+ZGV2LnBhcmVudCA9ICZzLT5kZXYtPmRldjsKKwlncC0+aW8gPSBpb19wb3J0OworCisJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc3ZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQoreworCXN0YXRpYyBjaGFyIF9fZGV2aW5pdGRhdGEgc3ZfZGRtYV9uYW1lW10gPSAiUzMgSW5jLiBTb25pY1ZpYmVzIERETUEgQ29udHJvbGxlciI7CisgICAgICAgCXN0cnVjdCBzdl9zdGF0ZSAqczsKKwltbV9zZWdtZW50X3QgZnM7CisJaW50IGksIHZhbCwgcmV0OworCWludCBncGlvOworCWNoYXIgKmRkbWFuYW1lOworCXVuc2lnbmVkIGRkbWFuYW1lbGVuOworCisJaWYgKChyZXQ9cGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIVJTUkNJU0lPUkVHSU9OKHBjaWRldiwgUkVTT1VSQ0VfU0IpIHx8CisJICAgICFSU1JDSVNJT1JFR0lPTihwY2lkZXYsIFJFU09VUkNFX0VOSCkgfHwKKwkgICAgIVJTUkNJU0lPUkVHSU9OKHBjaWRldiwgUkVTT1VSQ0VfU1lOVEgpIHx8CisJICAgICFSU1JDSVNJT1JFR0lPTihwY2lkZXYsIFJFU09VUkNFX01JREkpIHx8CisJICAgICFSU1JDSVNJT1JFR0lPTihwY2lkZXYsIFJFU09VUkNFX0dBTUUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocGNpZGV2LT5pcnEgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCAweDAwZmZmZmZmKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzb25pY3ZpYmVzOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyNGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiB0cnkgdG8gYWxsb2NhdGUgYSBERE1BIHJlc291cmNlIGlmIG5vdCBhbHJlYWR5IGF2YWlsYWJsZSAqLworCWlmICghUlNSQ0lTSU9SRUdJT04ocGNpZGV2LCBSRVNPVVJDRV9ERE1BKSkgeworCQlwY2lkZXYtPnJlc291cmNlW1JFU09VUkNFX0RETUFdLnN0YXJ0ID0gMDsKKwkJcGNpZGV2LT5yZXNvdXJjZVtSRVNPVVJDRV9ERE1BXS5lbmQgPSAyKlNWX0VYVEVOVF9ETUEtMTsKKwkJcGNpZGV2LT5yZXNvdXJjZVtSRVNPVVJDRV9ERE1BXS5mbGFncyA9IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8gfCBJT1JFU09VUkNFX0lPOworCQlkZG1hbmFtZWxlbiA9IHN0cmxlbihzdl9kZG1hX25hbWUpKzE7CisJCWlmICghKGRkbWFuYW1lID0ga21hbGxvYyhkZG1hbmFtZWxlbiwgR0ZQX0tFUk5FTCkpKQorCQkJcmV0dXJuIC0xOworCQltZW1jcHkoZGRtYW5hbWUsIHN2X2RkbWFfbmFtZSwgZGRtYW5hbWVsZW4pOworCQlwY2lkZXYtPnJlc291cmNlW1JFU09VUkNFX0RETUFdLm5hbWUgPSBkZG1hbmFtZTsKKwkJaWYgKHBjaV9hc3NpZ25fcmVzb3VyY2UocGNpZGV2LCBSRVNPVVJDRV9ERE1BKSkgeworCQkJcGNpZGV2LT5yZXNvdXJjZVtSRVNPVVJDRV9ERE1BXS5uYW1lID0gTlVMTDsKKwkJCWtmcmVlKGRkbWFuYW1lKTsKKwkJCXByaW50ayhLRVJOX0VSUiAic3Y6IGNhbm5vdCBhbGxvY2F0ZSBERE1BIGNvbnRyb2xsZXIgaW8gcG9ydHNcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwlpZiAoIShzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN2X3N0YXRlKSwgR0ZQX0tFUk5FTCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInN2OiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IHN2X3N0YXRlKSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5pd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5vd2FpdCk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5tYWdpYyA9IFNWX01BR0lDOworCXMtPmRldiA9IHBjaWRldjsKKwlzLT5pb3NiID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgUkVTT1VSQ0VfU0IpOworCXMtPmlvZW5oID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgUkVTT1VSQ0VfRU5IKTsKKwlzLT5pb3N5bnRoID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgUkVTT1VSQ0VfU1lOVEgpOworCXMtPmlvbWlkaSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIFJFU09VUkNFX01JREkpOworCXMtPmlvZG1hYSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIFJFU09VUkNFX0RETUEpOworCXMtPmlvZG1hYyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIFJFU09VUkNFX0RETUEpICsgU1ZfRVhURU5UX0RNQTsKKwlncGlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgUkVTT1VSQ0VfR0FNRSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIDB4NDAsIHMtPmlvZG1hYSB8IDkpOyAgLyogZW5hYmxlIGFuZCB1c2UgZXh0ZW5kZWQgbW9kZSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCAweDQ4LCBzLT5pb2RtYWMgfCA5KTsgIC8qIGVuYWJsZSAqLworCXByaW50ayhLRVJOX0RFQlVHICJzdjogaW8gcG9ydHM6ICUjbHggJSNseCAlI2x4ICUjbHggJSN4ICUjeCAlI3hcbiIsCisJICAgICAgIHMtPmlvc2IsIHMtPmlvZW5oLCBzLT5pb3N5bnRoLCBzLT5pb21pZGksIGdwaW8sIHMtPmlvZG1hYSwgcy0+aW9kbWFjKTsKKwlzLT5pcnEgPSBwY2lkZXYtPmlycTsKKwkKKwkvKiBoYWNrICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIDB4NjAsIHdhdmV0YWJsZV9tZW0gPj4gMTIpOyAgLyogd2F2ZXRhYmxlIGJhc2UgYWRkcmVzcyAqLworCisJcmV0ID0gLUVCVVNZOworCWlmICghcmVxdWVzdF9yZWdpb24ocy0+aW9lbmgsIFNWX0VYVEVOVF9FTkgsICJTMyBTb25pY1ZpYmVzIFBDTSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Y6IGlvIHBvcnRzICUjbHgtJSNseCBpbiB1c2VcbiIsIHMtPmlvZW5oLCBzLT5pb2VuaCtTVl9FWFRFTlRfRU5ILTEpOworCQlnb3RvIGVycl9yZWdpb241OworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvZG1hYSwgU1ZfRVhURU5UX0RNQSwgIlMzIFNvbmljVmliZXMgRE1BQSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Y6IGlvIHBvcnRzICUjeC0lI3ggaW4gdXNlXG4iLCBzLT5pb2RtYWEsIHMtPmlvZG1hYStTVl9FWFRFTlRfRE1BLTEpOworCQlnb3RvIGVycl9yZWdpb240OworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvZG1hYywgU1ZfRVhURU5UX0RNQSwgIlMzIFNvbmljVmliZXMgRE1BQyIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Y6IGlvIHBvcnRzICUjeC0lI3ggaW4gdXNlXG4iLCBzLT5pb2RtYWMsIHMtPmlvZG1hYytTVl9FWFRFTlRfRE1BLTEpOworCQlnb3RvIGVycl9yZWdpb24zOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvbWlkaSwgU1ZfRVhURU5UX01JREksICJTMyBTb25pY1ZpYmVzIE1pZGkiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInN2OiBpbyBwb3J0cyAlI2x4LSUjbHggaW4gdXNlXG4iLCBzLT5pb21pZGksIHMtPmlvbWlkaStTVl9FWFRFTlRfTUlESS0xKTsKKwkJZ290byBlcnJfcmVnaW9uMjsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzLT5pb3N5bnRoLCBTVl9FWFRFTlRfU1lOVEgsICJTMyBTb25pY1ZpYmVzIFN5bnRoIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdjogaW8gcG9ydHMgJSNseC0lI2x4IGluIHVzZVxuIiwgcy0+aW9zeW50aCwgcy0+aW9zeW50aCtTVl9FWFRFTlRfU1lOVEgtMSk7CisJCWdvdG8gZXJyX3JlZ2lvbjE7CisJfQorCisJLyogaW5pdGlhbGl6ZSBjb2RlYyByZWdpc3RlcnMgKi8KKwlvdXRiKDB4ODAsIHMtPmlvZW5oICsgU1ZfQ09ERUNfQ09OVFJPTCk7IC8qIGFzc2VydCByZXNldCAqLworCXVkZWxheSg1MCk7CisJb3V0YigweDAwLCBzLT5pb2VuaCArIFNWX0NPREVDX0NPTlRST0wpOyAvKiBkZWFzc2VydCByZXNldCAqLworCXVkZWxheSg1MCk7CisJb3V0YihTVl9DQ1RSTF9JTlRBRFJJVkUgfCBTVl9DQ1RSTF9FTkhBTkNFRCAvKnwgU1ZfQ0NUUkxfV0FWRVRBQkxFICovCisJICAgICB8IChyZXZlcmJbZGV2aW5kZXhdID8gU1ZfQ0NUUkxfUkVWRVJCIDogMCksIHMtPmlvZW5oICsgU1ZfQ09ERUNfQ09OVFJPTCk7CisJaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfU1RBVFVTKTsgLyogY2xlYXIgaW50cyAqLworCXdyaW5kaXIocywgU1ZfQ0lEUklWRUNPTlRST0wsIDApOyAgLyogZHJpdmUgY3VycmVudCAxNm1BICovCisJd3JpbmRpcihzLCBTVl9DSUVOQUJMRSwgcy0+ZW5hYmxlID0gMCk7ICAvKiBkaXNhYmxlIERNQUEgYW5kIERNQUMgKi8KKwlvdXRiKH4oU1ZfQ0lOVE1BU0tfRE1BQSB8IFNWX0NJTlRNQVNLX0RNQUMpLCBzLT5pb2VuaCArIFNWX0NPREVDX0lOVE1BU0spOworCS8qIG91dGIoMHhmZiwgcy0+aW9kbWFhICsgU1ZfRE1BX1JFU0VUKTsgKi8KKwkvKiBvdXRiKDB4ZmYsIHMtPmlvZG1hYyArIFNWX0RNQV9SRVNFVCk7ICovCisJaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfU1RBVFVTKTsgLyogYWNrIGludGVycnVwdHMgKi8KKwl3cmluZGlyKHMsIFNWX0NJQURDQ0xLU09VUkNFLCAwKTsgLyogdXNlIHBsbCBhcyBBREMgY2xvY2sgc291cmNlICovCisJd3JpbmRpcihzLCBTVl9DSUFOQUxPR1BXUkRPV04sIDApOyAvKiBwb3dlciB1cCB0aGUgYW5hbG9nIHBhcnRzIG9mIHRoZSBkZXZpY2UgKi8KKwl3cmluZGlyKHMsIFNWX0NJRElHSVRBTFBXUkRPV04sIDApOyAvKiBwb3dlciB1cCB0aGUgZGlnaXRhbCBwYXJ0cyBvZiB0aGUgZGV2aWNlICovCisJc2V0cGxsKHMsIFNWX0NJQURDUExMTSwgODAwMCk7CisJd3JpbmRpcihzLCBTVl9DSVNSU1NQQUNFLCAweDgwKTsgLyogU1JTIG9mZiAqLworCXdyaW5kaXIocywgU1ZfQ0lQQ01TUjAsICg4MDAwICogNjU1MzYgLyBGVUxMUkFURSkgJiAweGZmKTsKKwl3cmluZGlyKHMsIFNWX0NJUENNU1IxLCAoKDgwMDAgKiA2NTUzNiAvIEZVTExSQVRFKSA+PiA4KSAmIDB4ZmYpOworCXdyaW5kaXIocywgU1ZfQ0lBRENPVVRQVVQsIDApOworCS8qIHJlcXVlc3QgaXJxICovCisJaWYgKChyZXQ9cmVxdWVzdF9pcnEocy0+aXJxLHN2X2ludGVycnVwdCxTQV9TSElSUSwiUzMgU29uaWNWaWJlcyIscykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Y6IGlycSAldSBpbiB1c2VcbiIsIHMtPmlycSk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAic3Y6IGZvdW5kIGFkYXB0ZXIgYXQgaW8gJSNseCBpcnEgJXUgZG1hYSAlIzA2eCBkbWFjICUjMDZ4IHJldmlzaW9uICV1XG4iLAorCSAgICAgICBzLT5pb2VuaCwgcy0+aXJxLCBzLT5pb2RtYWEsIHMtPmlvZG1hYywgcmRpbmRpcihzLCBTVl9DSVJFVklTSU9OKSk7CisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCWlmICgocy0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZzdl9hdWRpb19mb3BzLCAtMSkpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfYXVkaW87CisJCWdvdG8gZXJyX2RldjE7CisJfQorCWlmICgocy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJnN2X21peGVyX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXJldCA9IHMtPmRldl9taXhlcjsKKwkJZ290byBlcnJfZGV2MjsKKwl9CisJaWYgKChzLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJnN2X21pZGlfZm9wcywgLTEpKSA8IDApIHsKKwkJcmV0ID0gcy0+ZGV2X21pZGk7CisJCWdvdG8gZXJyX2RldjM7CisJfQorCWlmICgocy0+ZGV2X2RtZm0gPSByZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKCZzdl9kbWZtX2ZvcHMsIDE1IC8qID8/ICovKSkgPCAwKSB7CisJCXJldCA9IHMtPmRldl9kbWZtOworCQlnb3RvIGVycl9kZXY0OworCX0KKwlwY2lfc2V0X21hc3RlcihwY2lkZXYpOyAgLyogZW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KKwkvKiBpbml0aWFsaXplIHRoZSBjaGlwcyAqLworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJdmFsID0gU09VTkRfTUFTS19MSU5FfFNPVU5EX01BU0tfU1lOVEg7CisJbWl4ZXJfaW9jdGwocywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGluaXR2b2wpL3NpemVvZihpbml0dm9sWzBdKTsgaSsrKSB7CisJCXZhbCA9IGluaXR2b2xbaV0udm9sOworCQltaXhlcl9pb2N0bChzLCBpbml0dm9sW2ldLm1peGNoLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwl9CisJc2V0X2ZzKGZzKTsKKwkvKiByZWdpc3RlciBnYW1lcG9ydCAqLworCXN2X3JlZ2lzdGVyX2dhbWVwb3J0KHMsIGdwaW8pOworCS8qIHN0b3JlIGl0IGluIHRoZSBkcml2ZXIgZmllbGQgKi8KKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBzKTsKKwkvKiBwdXQgaXQgaW50byBkcml2ZXIgbGlzdCAqLworCWxpc3RfYWRkX3RhaWwoJnMtPmRldnMsICZkZXZzKTsKKwkvKiBpbmNyZW1lbnQgZGV2aW5kZXggKi8KKwlpZiAoZGV2aW5kZXggPCBOUl9ERVZJQ0UtMSkKKwkJZGV2aW5kZXgrKzsKKwlyZXR1cm4gMDsKKworIGVycl9kZXY0OgorCXVucmVnaXN0ZXJfc291bmRfbWlkaShzLT5kZXZfbWlkaSk7CisgZXJyX2RldjM6CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5kZXZfbWl4ZXIpOworIGVycl9kZXYyOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisgZXJyX2RldjE6CisJcHJpbnRrKEtFUk5fRVJSICJzdjogY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworIGVycl9pcnE6CisJcmVsZWFzZV9yZWdpb24ocy0+aW9zeW50aCwgU1ZfRVhURU5UX1NZTlRIKTsKKyBlcnJfcmVnaW9uMToKKwlyZWxlYXNlX3JlZ2lvbihzLT5pb21pZGksIFNWX0VYVEVOVF9NSURJKTsKKyBlcnJfcmVnaW9uMjoKKwlyZWxlYXNlX3JlZ2lvbihzLT5pb2RtYWMsIFNWX0VYVEVOVF9ETUEpOworIGVycl9yZWdpb24zOgorCXJlbGVhc2VfcmVnaW9uKHMtPmlvZG1hYSwgU1ZfRVhURU5UX0RNQSk7CisgZXJyX3JlZ2lvbjQ6CisJcmVsZWFzZV9yZWdpb24ocy0+aW9lbmgsIFNWX0VYVEVOVF9FTkgpOworIGVycl9yZWdpb241OgorCWtmcmVlKHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzdl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghcykKKwkJcmV0dXJuOworCWxpc3RfZGVsKCZzLT5kZXZzKTsKKwlvdXRiKH4wLCBzLT5pb2VuaCArIFNWX0NPREVDX0lOVE1BU0spOyAgLyogZGlzYWJsZSBpbnRzICovCisJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfU1RBVFVTKTsgLyogYWNrIGludGVycnVwdHMgKi8KKwl3cmluZGlyKHMsIFNWX0NJRU5BQkxFLCAwKTsgICAgIC8qIGRpc2FibGUgRE1BQSBhbmQgRE1BQyAqLworCS8qb3V0YigwLCBzLT5pb2RtYWEgKyBTVl9ETUFfUkVTRVQpOyovCisJLypvdXRiKDAsIHMtPmlvZG1hYyArIFNWX0RNQV9SRVNFVCk7Ki8KKwlmcmVlX2lycShzLT5pcnEsIHMpOworCWlmIChzLT5nYW1lcG9ydCkgeworCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKKwkJcmVsZWFzZV9yZWdpb24oZ3BpbywgU1ZfRVhURU5UX0dBTUUpOworCX0KKwlyZWxlYXNlX3JlZ2lvbihzLT5pb2RtYWMsIFNWX0VYVEVOVF9ETUEpOworCXJlbGVhc2VfcmVnaW9uKHMtPmlvZG1hYSwgU1ZfRVhURU5UX0RNQSk7CisJcmVsZWFzZV9yZWdpb24ocy0+aW9lbmgsIFNWX0VYVEVOVF9FTkgpOworCXJlbGVhc2VfcmVnaW9uKHMtPmlvbWlkaSwgU1ZfRVhURU5UX01JREkpOworCXJlbGVhc2VfcmVnaW9uKHMtPmlvc3ludGgsIFNWX0VYVEVOVF9TWU5USCk7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmRldl9taXhlcik7CisJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKHMtPmRldl9taWRpKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX3NwZWNpYWwocy0+ZGV2X2RtZm0pOworCWtmcmVlKHMpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKyAgICAgICB7IFBDSV9WRU5ET1JfSURfUzMsIFBDSV9ERVZJQ0VfSURfUzNfU09OSUNWSUJFUywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCB9LAorICAgICAgIHsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHN2X2RyaXZlciA9IHsKKyAgICAgICAubmFtZQkJPSAic29uaWN2aWJlcyIsCisgICAgICAgLmlkX3RhYmxlCT0gaWRfdGFibGUsCisgICAgICAgLnByb2JlCQk9IHN2X3Byb2JlLAorICAgICAgIC5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3ZfcmVtb3ZlKSwKK307CisgCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NvbmljdmliZXModm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJzdjogdmVyc2lvbiB2MC4zMSB0aW1lICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOworI2lmIDAKKwlpZiAoISh3YXZldGFibGVfbWVtID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCAyMC1QQUdFX1NISUZUKSkpCisJCXByaW50ayhLRVJOX0lORk8gInN2OiBjYW5ub3QgYWxsb2NhdGUgMU1CIG9mIGNvbnRpZ3VvdXMgbm9ucGFnZWFibGUgbWVtb3J5IGZvciB3YXZldGFibGUgZGF0YVxuIik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzdl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zb25pY3ZpYmVzKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAic3Y6IHVubG9hZGluZ1xuIik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzdl9kcml2ZXIpOworIAlpZiAod2F2ZXRhYmxlX21lbSkKKwkJZnJlZV9wYWdlcyh3YXZldGFibGVfbWVtLCAyMC1QQUdFX1NISUZUKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9zb25pY3ZpYmVzKTsKK21vZHVsZV9leGl0KGNsZWFudXBfc29uaWN2aWJlcyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE1PRFVMRQorCisvKiBmb3JtYXQgaXM6IHNvbmljdmliZXM9W3JldmVyYl0gc29uaWN2aWJlc2RtYWlvPWRtYWlvYWRkciAqLworCitzdGF0aWMgaW50IF9faW5pdCBzb25pY3ZpYmVzX3NldHVwKGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgdW5zaWduZWQgX19pbml0ZGF0YSBucl9kZXYgPSAwOworCisJaWYgKG5yX2RldiA+PSBOUl9ERVZJQ0UpCisJCXJldHVybiAwOworI2lmIDAKKwlpZiAoZ2V0X29wdGlvbigmc3RyLCAmcmV2ZXJiW25yX2Rldl0pID09IDIpCisJCSh2b2lkKWdldF9vcHRpb24oJnN0ciwgJndhdmV0YWJsZVtucl9kZXZdKTsKKyNlbHNlCisJKHZvaWQpZ2V0X29wdGlvbigmc3RyLCAmcmV2ZXJiW25yX2Rldl0pOworI2VuZGlmCisKKwlucl9kZXYrKzsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgic29uaWN2aWJlcz0iLCBzb25pY3ZpYmVzX3NldHVwKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kX2NhbGxzLmggYi9zb3VuZC9vc3Mvc291bmRfY2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWUwNzUwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NvdW5kX2NhbGxzLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqCURNQSBidWZmZXIgY2FsbHMKKyAqLworCitpbnQgRE1BYnVmX29wZW4oaW50IGRldiwgaW50IG1vZGUpOworaW50IERNQWJ1Zl9yZWxlYXNlKGludCBkZXYsIGludCBtb2RlKTsKK2ludCBETUFidWZfZ2V0d3JidWZmZXIoaW50IGRldiwgY2hhciAqKmJ1ZiwgaW50ICpzaXplLCBpbnQgZG9udGJsb2NrKTsKK2ludCBETUFidWZfZ2V0cmRidWZmZXIoaW50IGRldiwgY2hhciAqKmJ1ZiwgaW50ICpsZW4sIGludCBkb250YmxvY2spOworaW50IERNQWJ1Zl9ybWNoYXJzKGludCBkZXYsIGludCBidWZmX25vLCBpbnQgYyk7CitpbnQgRE1BYnVmX3N0YXJ0X291dHB1dChpbnQgZGV2LCBpbnQgYnVmZl9ubywgaW50IGwpOworaW50IERNQWJ1Zl9tb3ZlX3dycG9pbnRlcihpbnQgZGV2LCBpbnQgbCk7CisvKiBpbnQgRE1BYnVmX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcsIGludCBsb2NhbCk7ICovCit2b2lkIERNQWJ1Zl9pbml0KGludCBkZXYsIGludCBkbWExLCBpbnQgZG1hMik7Cit2b2lkIERNQWJ1Zl9kZWluaXQoaW50IGRldik7CitpbnQgRE1BYnVmX3N0YXJ0X2RtYSAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBwaHlzYWRkciwgaW50IGNvdW50LCBpbnQgZG1hX21vZGUpOworaW50IERNQWJ1Zl9vcGVuX2RtYSAoaW50IGRldik7Cit2b2lkIERNQWJ1Zl9jbG9zZV9kbWEgKGludCBkZXYpOwordm9pZCBETUFidWZfaW5wdXRpbnRyKGludCBkZXYpOwordm9pZCBETUFidWZfb3V0cHV0aW50cihpbnQgZGV2LCBpbnQgdW5kZXJmbG93X2ZsYWcpOworc3RydWN0IGRtYV9idWZmcGFybXM7CitpbnQgRE1BYnVmX3NwYWNlX2luX3F1ZXVlIChpbnQgZGV2KTsKK2ludCBETUFidWZfYWN0aXZhdGVfcmVjb3JkaW5nIChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCk7CitpbnQgRE1BYnVmX2dldF9idWZmZXJfcG9pbnRlciAoaW50IGRldiwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAsIGludCBkaXJlY3Rpb24pOwordm9pZCBETUFidWZfbGF1bmNoX291dHB1dChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCk7Cit1bnNpZ25lZCBpbnQgRE1BYnVmX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkZXYsIHBvbGxfdGFibGUgKndhaXQpOwordm9pZCBETUFidWZfc3RhcnRfZGV2aWNlcyh1bnNpZ25lZCBpbnQgZGV2bWFzayk7Cit2b2lkIERNQWJ1Zl9yZXNldCAoaW50IGRldik7CitpbnQgRE1BYnVmX3N5bmMgKGludCBkZXYpOworCisvKgorICoJU3lzdGVtIGNhbGxzIGZvciAvZGV2L2RzcCBhbmQgL2Rldi9hdWRpbyAoYXVkaW8uYykKKyAqLworCitpbnQgYXVkaW9fcmVhZCAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCk7CitpbnQgYXVkaW9fd3JpdGUgKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgY291bnQpOworaW50IGF1ZGlvX29wZW4gKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3ZvaWQgYXVkaW9fcmVsZWFzZSAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpOworaW50IGF1ZGlvX2lvY3RsIChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKK3ZvaWQgYXVkaW9faW5pdF9kZXZpY2VzICh2b2lkKTsKK3ZvaWQgcmVvcmdhbml6ZV9idWZmZXJzIChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCwgaW50IHJlY29yZGluZyk7CisKKy8qCisgKglTeXN0ZW0gY2FsbHMgZm9yIHRoZSAvZGV2L3NlcXVlbmNlcgorICovCisKK2ludCBzZXF1ZW5jZXJfcmVhZCAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCk7CitpbnQgc2VxdWVuY2VyX3dyaXRlIChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGNvdW50KTsKK2ludCBzZXF1ZW5jZXJfb3BlbiAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpOwordm9pZCBzZXF1ZW5jZXJfcmVsZWFzZSAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpOworaW50IHNlcXVlbmNlcl9pb2N0bCAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOwordW5zaWduZWQgaW50IHNlcXVlbmNlcl9wb2xsKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCk7CisKK3ZvaWQgc2VxdWVuY2VyX2luaXQgKHZvaWQpOwordm9pZCBzZXF1ZW5jZXJfdW5sb2FkICh2b2lkKTsKK3ZvaWQgc2VxdWVuY2VyX3RpbWVyKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworaW50IG5vdGVfdG9fZnJlcShpbnQgbm90ZV9udW0pOwordW5zaWduZWQgbG9uZyBjb21wdXRlX2ZpbmV0dW5lKHVuc2lnbmVkIGxvbmcgYmFzZV9mcmVxLCBpbnQgYmVuZCwgaW50IHJhbmdlLAorCQkJICAgICAgIGludCB2aWJyYXRvX2JlbmQpOwordm9pZCBzZXFfaW5wdXRfZXZlbnQodW5zaWduZWQgY2hhciAqZXZlbnQsIGludCBsZW4pOwordm9pZCBzZXFfY29weV90b19pbnB1dCAodW5zaWduZWQgY2hhciAqZXZlbnQsIGludCBsZW4pOworCisvKgorICoJU3lzdGVtIGNhbGxzIGZvciB0aGUgL2Rldi9taWRpCisgKi8KKworaW50IE1JRElidWZfcmVhZCAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCk7CitpbnQgTUlESWJ1Zl93cml0ZSAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCk7CitpbnQgTUlESWJ1Zl9vcGVuIChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Cit2b2lkIE1JRElidWZfcmVsZWFzZSAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpOworaW50IE1JRElidWZfaW9jdGwgKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKK3Vuc2lnbmVkIGludCBNSURJYnVmX3BvbGwoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KTsKK2ludCBNSURJYnVmX2F2YWlsKGludCBkZXYpOworCit2b2lkIE1JRElidWZfYnl0ZXNfcmVjZWl2ZWQoaW50IGRldiwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwordm9pZCBNSURJYnVmX2luaXQodm9pZCk7CisKKworLyoJRnJvbSBzb3VuZGNhcmQuYwkqLwordm9pZCByZXF1ZXN0X3NvdW5kX3RpbWVyIChpbnQgY291bnQpOwordm9pZCBzb3VuZF9zdG9wX3RpbWVyKHZvaWQpOwordm9pZCBjb25mX3ByaW50ZihjaGFyICpuYW1lLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOwordm9pZCBjb25mX3ByaW50ZjIoY2hhciAqbmFtZSwgaW50IGJhc2UsIGludCBpcnEsIGludCBkbWEsIGludCBkbWEyKTsKKworLyoJRnJvbSBzb3VuZF90aW1lci5jICovCit2b2lkIHNvdW5kX3RpbWVyX2ludGVycnVwdCh2b2lkKTsKK3ZvaWQgc291bmRfdGltZXJfc3luY2ludGVydmFsKHVuc2lnbmVkIGludCBuZXdfdXNlY3MpOworCisvKiAgICAgIEZyb20gbWlkaV9zeW50aC5jICAgICAgICovCit2b2lkIGRvX21pZGlfbXNnIChpbnQgc3ludGhubywgdW5zaWduZWQgY2hhciAqbXNnLCBpbnQgbWxlbik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc291bmRfY29uZmlnLmggYi9zb3VuZC9vc3Mvc291bmRfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5MTJiOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zb3VuZF9jb25maWcuaApAQCAtMCwwICsxLDE1NCBAQAorLyogc291bmRfY29uZmlnLmgKKyAqCisgKiBBIGRyaXZlciBmb3Igc291bmQgY2FyZHMsIG1pc2MuIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisKKworI2lmbmRlZiAgX1NPVU5EX0NPTkZJR19IXworI2RlZmluZSAgX1NPVU5EX0NPTkZJR19IXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorCisjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJzb3VuZHZlcnMuaCIKKworCisjaWZuZGVmIFNORF9ERUZBVUxUX0VOQUJMRQorI2RlZmluZSBTTkRfREVGQVVMVF9FTkFCTEUJMQorI2VuZGlmCisKKyNpZm5kZWYgTUFYX1JFQUxUSU1FX0ZBQ1RPUgorI2RlZmluZSBNQVhfUkVBTFRJTUVfRkFDVE9SCTQKKyNlbmRpZgorCisvKgorICogVXNlIGFsd2F5cyA2NGsgYnVmZmVyIHNpemUuIFRoZXJlIGlzIG5vIHJlYXNvbiB0byB1c2Ugc2hvcnRlci4KKyAqLworI3VuZGVmIERTUF9CVUZGU0laRQorI2RlZmluZSBEU1BfQlVGRlNJWkUJCSg2NCoxMDI0KQorCisjaWZuZGVmIERTUF9CVUZGQ09VTlQKKyNkZWZpbmUgRFNQX0JVRkZDT1VOVAkJMQkvKiAxIGlzIHJlY29tbWVuZGVkLiAqLworI2VuZGlmCisKKyNkZWZpbmUgRk1fTU9OTwkJMHgzODgJLyogVGhpcyBpcyB0aGUgSS9PIGFkZHJlc3MgdXNlZCBieSBBZExpYiAqLworCisjaWZuZGVmIENPTkZJR19QQVNfQkFTRQorI2RlZmluZSBDT05GSUdfUEFTX0JBU0UJMHgzODgKKyNlbmRpZgorCisvKiBTRVFfTUFYX1FVRVVFIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXF1ZW5jZXIgZXZlbnRzIGJ1ZmZlcmVkIGJ5IHRoZQorICAgZHJpdmVyLiAoVGhlcmUgaXMgbm8gbmVlZCB0byBhbHRlciB0aGlzKSAqLworI2RlZmluZSBTRVFfTUFYX1FVRVVFCTEwMjQKKworI2RlZmluZSBTQkZNX01BWElOU1RSCQkoMjU2KQkvKiBTaXplIG9mIHRoZSBGTSBJbnN0cnVtZW50IGJhbmsgKi8KKy8qIDEyOCBpbnN0cnVtZW50cyBmb3IgZ2VuZXJhbCBNSURJIHNldHVwIGFuZCAxNiB1bmFzc2lnbmVkCSAqLworCisjZGVmaW5lIFNORF9OREVWUwkyNTYJLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBkZXZpY2VzICovCisKKyNkZWZpbmUgRFNQX0RFRkFVTFRfU1BFRUQJODAwMAorCisjZGVmaW5lIE1BWF9BVURJT19ERVYJNQorI2RlZmluZSBNQVhfTUlYRVJfREVWCTUKKyNkZWZpbmUgTUFYX1NZTlRIX0RFVgk1CisjZGVmaW5lIE1BWF9NSURJX0RFVgk2CisjZGVmaW5lIE1BWF9USU1FUl9ERVYJNAorCitzdHJ1Y3QgYWRkcmVzc19pbmZvIHsKKwlpbnQgaW9fYmFzZTsKKwlpbnQgaXJxOworCWludCBkbWE7CisJaW50IGRtYTI7CisJaW50IGFsd2F5c19kZXRlY3Q7CS8qIDE9VHJ1c3QgbWUsIGl0J3MgdGhlcmUgKi8KKwljaGFyICpuYW1lOworCWludCBkcml2ZXJfdXNlXzE7CS8qIERyaXZlciBkZWZpbmVkIGZpZWxkIDEgKi8KKwlpbnQgZHJpdmVyX3VzZV8yOwkvKiBEcml2ZXIgZGVmaW5lZCBmaWVsZCAyICovCisJaW50ICpvc3A7CS8qIE9TIHNwZWNpZmljIGluZm8gKi8KKwlpbnQgY2FyZF9zdWJ0eXBlOwkvKiBEcml2ZXIgc3BlY2lmaWMuIFVzdWFsbHkgMCAqLworCXZvaWQgKm1lbXB0cjsgICAgICAgICAgIC8qIE1vZHVsZSBtZW1vcnkgY2hhaW5lciAqLworCWludCBzbG90c1s2XTsgICAgICAgICAgIC8qIFRvIHJlbWVtYmVyIGRyaXZlciBzbG90IGlkcyAqLworfTsKKworI2RlZmluZSBTWU5USF9NQVhfVk9JQ0VTCTMyCisKK3N0cnVjdCB2b2ljZV9hbGxvY19pbmZvIHsKKwkJaW50IG1heF92b2ljZTsKKwkJaW50IHVzZWRfdm9pY2VzOworCQlpbnQgcHRyOwkJLyogRm9yIGRldmljZSBzcGVjaWZpYyB1c2UgKi8KKwkJdW5zaWduZWQgc2hvcnQgbWFwW1NZTlRIX01BWF9WT0lDRVNdOyAvKiAoY2ggPDwgOCkgfCAobm90ZSsxKSAqLworCQlpbnQgdGltZXN0YW1wOworCQlpbnQgYWxsb2NfdGltZXNbU1lOVEhfTUFYX1ZPSUNFU107CisJfTsKKworc3RydWN0IGNoYW5uZWxfaW5mbyB7CisJCWludCBwZ21fbnVtOworCQlpbnQgYmVuZGVyX3ZhbHVlOworCQlpbnQgYmVuZGVyX3JhbmdlOworCQl1bnNpZ25lZCBjaGFyIGNvbnRyb2xsZXJzWzEyOF07CisJfTsKKworLyoKKyAqIFByb2Nlc3Mgd2FrZXVwIHJlYXNvbnMKKyAqLworI2RlZmluZSBXS19OT05FCQkweDAwCisjZGVmaW5lIFdLX1dBS0VVUAkweDAxCisjZGVmaW5lIFdLX1RJTUVPVVQJMHgwMgorI2RlZmluZSBXS19TSUdOQUwJMHgwNAorI2RlZmluZSBXS19TTEVFUAkweDA4CisjZGVmaW5lIFdLX1NFTEVDVAkweDEwCisjZGVmaW5lIFdLX0FCT1JUCTB4MjAKKworI2RlZmluZSBPUEVOX1JFQUQJUENNX0VOQUJMRV9JTlBVVAorI2RlZmluZSBPUEVOX1dSSVRFCVBDTV9FTkFCTEVfT1VUUFVUCisjZGVmaW5lIE9QRU5fUkVBRFdSSVRFCShPUEVOX1JFQUR8T1BFTl9XUklURSkKKworI2lmIE9QRU5fUkVBRCA9PSBGTU9ERV9SRUFEICYmIE9QRU5fV1JJVEUgPT0gRk1PREVfV1JJVEUKKworc3RhdGljIGlubGluZSBpbnQgdHJhbnNsYXRlX21vZGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIGZpbGUtPmZfbW9kZTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgdHJhbnNsYXRlX21vZGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBPUEVOX1JFQUQgOiAwKSB8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8gT1BFTl9XUklURSA6IDApOworfQorCisjZW5kaWYKKworCisjaW5jbHVkZSAic291bmRfY2FsbHMuaCIKKyNpbmNsdWRlICJkZXZfdGFibGUuaCIKKworI2lmbmRlZiBERUIKKyNkZWZpbmUgREVCKHgpCisjZW5kaWYKKworI2lmbmRlZiBEREIKKyNkZWZpbmUgRERCKHgpIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgTURCCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1EQih4KSB4CisjZWxzZQorI2RlZmluZSBNREIoeCkKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgVElNRVJfQVJNRUQJMTIxMjM0CisjZGVmaW5lIFRJTUVSX05PVF9BUk1FRAkxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kX2Zpcm13YXJlLmggYi9zb3VuZC9vc3Mvc291bmRfZmlybXdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTBjYmZkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NvdW5kX2Zpcm13YXJlLmgKQEAgLTAsMCArMSwyIEBACitleHRlcm4gaW50IG1vZF9maXJtd2FyZV9sb2FkKGNvbnN0IGNoYXIgKmZuLCBjaGFyICoqZnApOworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc291bmRfc3ltcy5jIGIvc291bmQvb3NzL3NvdW5kX3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjdjMzNmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NvdW5kX3N5bXMuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICoJVGhlIHNvdW5kIGNvcmUgZXhwb3J0cyB0aGUgZm9sbG93aW5nIHN5bWJvbHMgdG8gdGhlIHJlc3Qgb2YKKyAqCW1vZHVsZXNwYWNlLgorICoKKyAqICAgICAgKEMpIENvcHlyaWdodCAxOTk3ICAgICAgQWxhbiBDb3gsIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR1BMCisgKgorICoJVGh1IE1heSAyNyAxOTk5IEFuZHJldyBKLiBLcm9sbCA8YWc3ODRAZnJlZW5ldC4uYnVmZmFsby4uZWR1PgorICoJbGVmdCBvdXQgZXhwb3J0ZWQgc3ltYm9sLi4uIGZpeGVkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInNvdW5kX2NhbGxzLmgiCisKK2NoYXIgc291bmRfc3ltc19zeW1ib2w7CisKK0VYUE9SVF9TWU1CT0wobWl4ZXJfZGV2cyk7CitFWFBPUlRfU1lNQk9MKGF1ZGlvX2RldnMpOworRVhQT1JUX1NZTUJPTChudW1fbWl4ZXJzKTsKK0VYUE9SVF9TWU1CT0wobnVtX2F1ZGlvZGV2cyk7CisKK0VYUE9SVF9TWU1CT0wobWlkaV9kZXZzKTsKK0VYUE9SVF9TWU1CT0wobnVtX21pZGlzKTsKK0VYUE9SVF9TWU1CT0woc3ludGhfZGV2cyk7CisKK0VYUE9SVF9TWU1CT0woc291bmRfdGltZXJfZGV2cyk7CisKK0VYUE9SVF9TWU1CT0woc291bmRfaW5zdGFsbF9hdWRpb2Rydik7CitFWFBPUlRfU1lNQk9MKHNvdW5kX2luc3RhbGxfbWl4ZXIpOworRVhQT1JUX1NZTUJPTChzb3VuZF9hbGxvY19kbWEpOworRVhQT1JUX1NZTUJPTChzb3VuZF9mcmVlX2RtYSk7CitFWFBPUlRfU1lNQk9MKHNvdW5kX29wZW5fZG1hKTsKK0VYUE9SVF9TWU1CT0woc291bmRfY2xvc2VfZG1hKTsKK0VYUE9SVF9TWU1CT0woc291bmRfYWxsb2NfbWlkaWRldik7CitFWFBPUlRfU1lNQk9MKHNvdW5kX2FsbG9jX21peGVyZGV2KTsKK0VYUE9SVF9TWU1CT0woc291bmRfYWxsb2NfdGltZXJkZXYpOworRVhQT1JUX1NZTUJPTChzb3VuZF9hbGxvY19zeW50aGRldik7CitFWFBPUlRfU1lNQk9MKHNvdW5kX3VubG9hZF9hdWRpb2Rldik7CitFWFBPUlRfU1lNQk9MKHNvdW5kX3VubG9hZF9taWRpZGV2KTsKK0VYUE9SVF9TWU1CT0woc291bmRfdW5sb2FkX21peGVyZGV2KTsKK0VYUE9SVF9TWU1CT0woc291bmRfdW5sb2FkX3RpbWVyZGV2KTsKK0VYUE9SVF9TWU1CT0woc291bmRfdW5sb2FkX3N5bnRoZGV2KTsKKworRVhQT1JUX1NZTUJPTChsb2FkX21peGVyX3ZvbHVtZXMpOworCitFWFBPUlRfU1lNQk9MKGNvbmZfcHJpbnRmKTsKK0VYUE9SVF9TWU1CT0woY29uZl9wcmludGYyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPU1MgU291bmQgc3Vic3lzdGVtIik7CitNT0RVTEVfQVVUSE9SKCJIYW5udSBTYXZvbGFpbmVuLCBldCBhbC4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zb3VuZF90aW1lci5jIGIvc291bmQvb3NzL3NvdW5kX3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyNzc3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zb3VuZF90aW1lci5jCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogc291bmQvc291bmRfdGltZXIuYworICovCisvKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKy8qCisgKiBUaG9tYXMgU2FpbGVyICAgOiBpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgaW5pdGlhbGl6ZWQsIG9wZW5lZCwgdG1yX3J1bm5pbmc7CitzdGF0aWMgdm9sYXRpbGUgdGltZV90IHRtcl9vZmZzLCB0bXJfY3RyOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGlja3Nfb2ZmczsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgY3Vycl90ZW1wbywgY3Vycl90aW1lYmFzZTsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGN1cnJfdGlja3M7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBuZXh0X2V2ZW50X3RpbWU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X2V2ZW50X3RpbWU7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1c2Vjc19wZXJfdG1yOwkvKiBMZW5ndGggb2YgdGhlIGN1cnJlbnQgaW50ZXJ2YWwgKi8KKworc3RhdGljIHN0cnVjdCBzb3VuZF9sb3dsZXZfdGltZXIgKnRtcjsKK3N0YXRpYyBzcGlubG9ja190IGxvY2s7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRtcjJ0aWNrcyhpbnQgdG1yX3ZhbHVlKQoreworCS8qCisJICogICAgQ29udmVydCB0aW1lciB0aWNrcyB0byBNSURJIHRpY2tzCisJICovCisKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIHNjYWxlOworCisJdG1wID0gdG1yX3ZhbHVlICogdXNlY3NfcGVyX3RtcjsJLyogQ29udmVydCB0byB1c2VjcyAqLworCXNjYWxlID0gKDYwICogMTAwMDAwMCkgLyAoY3Vycl90ZW1wbyAqIGN1cnJfdGltZWJhc2UpOwkvKiB1c2VjcyBwZXIgTUlESSB0aWNrICovCisJcmV0dXJuICh0bXAgKyAoc2NhbGUgLyAyKSkgLyBzY2FsZTsKK30KKwordm9pZCByZXByb2dyYW1fdGltZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nICAgdXNlY3NfcGVyX3RpY2s7CisKKwkvKgorCSAqCVRoZSB1c2VyIGlzIGNoYW5naW5nIHRoZSB0aW1lciByYXRlIGJlZm9yZSBzZXR0aW5nIGEgdGltZXIKKwkgKglzbGFwLCBiYWQgYmFkIG5vdCBhbGxvd2VkLgorCSAqLworCSAKKwlpZighdG1yKQorCQlyZXR1cm47CisJCQorCXVzZWNzX3Blcl90aWNrID0gKDYwICogMTAwMDAwMCkgLyAoY3Vycl90ZW1wbyAqIGN1cnJfdGltZWJhc2UpOworCisJLyoKKwkgKiBEb24ndCBraWxsIHRoZSBzeXN0ZW0gYnkgc2V0dGluZyB0b28gaGlnaCB0aW1lciByYXRlCisJICovCisJaWYgKHVzZWNzX3Blcl90aWNrIDwgMjAwMCkKKwkJdXNlY3NfcGVyX3RpY2sgPSAyMDAwOworCisJdXNlY3NfcGVyX3RtciA9IHRtci0+dG1yX3N0YXJ0KHRtci0+ZGV2LCB1c2Vjc19wZXJfdGljayk7Cit9CisKK3ZvaWQgc291bmRfdGltZXJfc3luY2ludGVydmFsKHVuc2lnbmVkIGludCBuZXdfdXNlY3MpCit7CisJLyoKKwkgKiAgICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBoYXJkd2FyZSBsZXZlbCBpZgorCSAqICAgICAgdGhlIGNsb2NrIGZyZXF1ZW5jeSBoYXMgY2hhbmdlZCBmb3Igc29tZSByZWFzb24uCisJICovCisJdG1yX29mZnMgPSB0bXJfY3RyOworCXRpY2tzX29mZnMgKz0gdG1yMnRpY2tzKHRtcl9jdHIpOworCXRtcl9jdHIgPSAwOworCXVzZWNzX3Blcl90bXIgPSBuZXdfdXNlY3M7Cit9CisKK3N0YXRpYyB2b2lkIHRtcl9yZXNldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwl0bXJfb2ZmcyA9IDA7CisJdGlja3Nfb2ZmcyA9IDA7CisJdG1yX2N0ciA9IDA7CisJbmV4dF9ldmVudF90aW1lID0gKHVuc2lnbmVkIGxvbmcpIC0xOworCXByZXZfZXZlbnRfdGltZSA9IDA7CisJY3Vycl90aWNrcyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdGltZXJfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlpZiAob3BlbmVkKQorCQlyZXR1cm4gLUVCVVNZOworCXRtcl9yZXNldCgpOworCWN1cnJfdGVtcG8gPSA2MDsKKwljdXJyX3RpbWViYXNlID0gMTAwOworCW9wZW5lZCA9IDE7CisJcmVwcm9ncmFtX3RpbWVyKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2Nsb3NlKGludCBkZXYpCit7CisJb3BlbmVkID0gdG1yX3J1bm5pbmcgPSAwOworCXRtci0+dG1yX2Rpc2FibGUodG1yLT5kZXYpOworfQorCitzdGF0aWMgaW50IHRpbWVyX2V2ZW50KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KQoreworCXVuc2lnbmVkIGNoYXIgY21kID0gZXZlbnRbMV07CisJdW5zaWduZWQgbG9uZyBwYXJtID0gKihpbnQgKikgJmV2ZW50WzRdOworCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIFRNUl9XQUlUX1JFTDoKKwkJCXBhcm0gKz0gcHJldl9ldmVudF90aW1lOworCQljYXNlIFRNUl9XQUlUX0FCUzoKKwkJCWlmIChwYXJtID4gMCkKKwkJCXsKKwkJCQlsb25nIHRpbWU7CisKKwkJCQlpZiAocGFybSA8PSBjdXJyX3RpY2tzKQkvKiBJdCdzIHRoZSB0aW1lICovCisJCQkJCXJldHVybiBUSU1FUl9OT1RfQVJNRUQ7CisJCQkJdGltZSA9IHBhcm07CisJCQkJbmV4dF9ldmVudF90aW1lID0gcHJldl9ldmVudF90aW1lID0gdGltZTsKKwkJCQlyZXR1cm4gVElNRVJfQVJNRUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRNUl9TVEFSVDoKKwkJCXRtcl9yZXNldCgpOworCQkJdG1yX3J1bm5pbmcgPSAxOworCQkJcmVwcm9ncmFtX3RpbWVyKCk7CisJCQlicmVhazsKKworCQljYXNlIFRNUl9TVE9QOgorCQkJdG1yX3J1bm5pbmcgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfQ09OVElOVUU6CisJCQl0bXJfcnVubmluZyA9IDE7CisJCQlyZXByb2dyYW1fdGltZXIoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVE1SX1RFTVBPOgorCQkJaWYgKHBhcm0pCisJCQl7CisJCQkJaWYgKHBhcm0gPCA4KQorCQkJCQlwYXJtID0gODsKKwkJCQlpZiAocGFybSA+IDI1MCkKKwkJCQkJcGFybSA9IDI1MDsKKwkJCQl0bXJfb2ZmcyA9IHRtcl9jdHI7CisJCQkJdGlja3Nfb2ZmcyArPSB0bXIydGlja3ModG1yX2N0cik7CisJCQkJdG1yX2N0ciA9IDA7CisJCQkJY3Vycl90ZW1wbyA9IHBhcm07CisJCQkJcmVwcm9ncmFtX3RpbWVyKCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRNUl9FQ0hPOgorCQkJc2VxX2NvcHlfdG9faW5wdXQoZXZlbnQsIDgpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDo7CisJfQorCXJldHVybiBUSU1FUl9OT1RfQVJNRUQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2dldF90aW1lKGludCBkZXYpCit7CisJaWYgKCFvcGVuZWQpCisJCXJldHVybiAwOworCXJldHVybiBjdXJyX3RpY2tzOworfQorCitzdGF0aWMgaW50IHRpbWVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IF9fdXNlciAqcCA9IGFyZzsKKwlpbnQgdmFsOworCisJc3dpdGNoIChjbWQpIAorCXsKKwkJY2FzZSBTTkRDVExfVE1SX1NPVVJDRToKKwkJCXZhbCA9IFRNUl9JTlRFUk5BTDsKKwkJCWJyZWFrOworCisJCWNhc2UgU05EQ1RMX1RNUl9TVEFSVDoKKwkJCXRtcl9yZXNldCgpOworCQkJdG1yX3J1bm5pbmcgPSAxOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIFNORENUTF9UTVJfU1RPUDoKKwkJCXRtcl9ydW5uaW5nID0gMDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1RNUl9DT05USU5VRToKKwkJCXRtcl9ydW5uaW5nID0gMTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1RNUl9USU1FQkFTRToKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHZhbCkgCisJCQl7CisJCQkJaWYgKHZhbCA8IDEpCisJCQkJCXZhbCA9IDE7CisJCQkJaWYgKHZhbCA+IDEwMDApCisJCQkJCXZhbCA9IDEwMDA7CisJCQkJY3Vycl90aW1lYmFzZSA9IHZhbDsKKwkJCX0KKwkJCXZhbCA9IGN1cnJfdGltZWJhc2U7CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9UTVJfVEVNUE86CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh2YWwpIAorCQkJeworCQkJCWlmICh2YWwgPCA4KQorCQkJCQl2YWwgPSA4OworCQkJCWlmICh2YWwgPiAyNTApCisJCQkJCXZhbCA9IDI1MDsKKwkJCQl0bXJfb2ZmcyA9IHRtcl9jdHI7CisJCQkJdGlja3Nfb2ZmcyArPSB0bXIydGlja3ModG1yX2N0cik7CisJCQkJdG1yX2N0ciA9IDA7CisJCQkJY3Vycl90ZW1wbyA9IHZhbDsKKwkJCQlyZXByb2dyYW1fdGltZXIoKTsKKwkJCX0KKwkJCXZhbCA9IGN1cnJfdGVtcG87CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9TRVFfQ1RSTFJBVEU6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh2YWwgIT0gMCkJLyogQ2FuJ3QgY2hhbmdlICovCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl2YWwgPSAoKGN1cnJfdGVtcG8gKiBjdXJyX3RpbWViYXNlKSArIDMwKSAvIDYwOworCQkJYnJlYWs7CisJCQorCQljYXNlIFNORENUTF9TRVFfR0VUVElNRToKKwkJCXZhbCA9IGN1cnJfdGlja3M7CisJCQlicmVhazsKKwkJCisJCWNhc2UgU05EQ1RMX1RNUl9NRVRST05PTUU6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2FybShpbnQgZGV2LCBsb25nIHRpbWUpCit7CisJaWYgKHRpbWUgPCAwKQorCQl0aW1lID0gY3Vycl90aWNrcyArIDE7CisJZWxzZSBpZiAodGltZSA8PSBjdXJyX3RpY2tzKQkvKiBJdCdzIHRoZSB0aW1lICovCisJCXJldHVybjsKKworCW5leHRfZXZlbnRfdGltZSA9IHByZXZfZXZlbnRfdGltZSA9IHRpbWU7CisJcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IHNvdW5kX3RpbWVyX29wZXJhdGlvbnMgc291bmRfdGltZXIgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7IlNvdW5kIFRpbWVyIiwgMH0sCisJLnByaW9yaXR5CT0gMSwJLyogUHJpb3JpdHkgKi8KKwkuZGV2bGluawk9IDAsCS8qIExvY2FsIGRldmljZSBsaW5rICovCisJLm9wZW4JCT0gdGltZXJfb3BlbiwKKwkuY2xvc2UJCT0gdGltZXJfY2xvc2UsCisJLmV2ZW50CQk9IHRpbWVyX2V2ZW50LAorCS5nZXRfdGltZQk9IHRpbWVyX2dldF90aW1lLAorCS5pb2N0bAkJPSB0aW1lcl9pb2N0bCwKKwkuYXJtX3RpbWVyCT0gdGltZXJfYXJtCit9OworCit2b2lkIHNvdW5kX3RpbWVyX2ludGVycnVwdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCFvcGVuZWQpCisJCXJldHVybjsKKworCXRtci0+dG1yX3Jlc3RhcnQodG1yLT5kZXYpOworCisJaWYgKCF0bXJfcnVubmluZykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCXRtcl9jdHIrKzsKKwljdXJyX3RpY2tzID0gdGlja3Nfb2ZmcyArIHRtcjJ0aWNrcyh0bXJfY3RyKTsKKworCWlmIChjdXJyX3RpY2tzID49IG5leHRfZXZlbnRfdGltZSkKKwl7CisJCW5leHRfZXZlbnRfdGltZSA9ICh1bnNpZ25lZCBsb25nKSAtMTsKKwkJc2VxdWVuY2VyX3RpbWVyKDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKK30KKwordm9pZCAgc291bmRfdGltZXJfaW5pdChzdHJ1Y3Qgc291bmRfbG93bGV2X3RpbWVyICp0LCBjaGFyICpuYW1lKQoreworCWludCBuOworCisJaWYgKGluaXRpYWxpemVkKQorCXsKKwkJaWYgKHQtPnByaW9yaXR5IDw9IHRtci0+cHJpb3JpdHkpCisJCQlyZXR1cm47CS8qIFRoZXJlIGlzIGFscmVhZHkgYSBzaW1pbGFyIG9yIGJldHRlciB0aW1lciAqLworCQl0bXIgPSB0OworCQlyZXR1cm47CisJfQorCWluaXRpYWxpemVkID0gMTsKKwl0bXIgPSB0OworCisJbiA9IHNvdW5kX2FsbG9jX3RpbWVyZGV2KCk7CisJaWYgKG4gPT0gLTEpCisJCW4gPSAwOwkJLyogT3ZlcndyaXRlIHRoZSBzeXN0ZW0gdGltZXIgKi8KKwlzdHJjcHkoc291bmRfdGltZXIuaW5mby5uYW1lLCBuYW1lKTsKKwlzb3VuZF90aW1lcl9kZXZzW25dID0gJnNvdW5kX3RpbWVyOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kY2FyZC5jIGIvc291bmQvb3NzL3NvdW5kY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTFjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc291bmRjYXJkLmMKQEAgLTAsMCArMSw3NTEgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3NvdW5kL3NvdW5kY2FyZC5jCisgKgorICogU291bmQgY2FyZCBkcml2ZXIgZm9yIExpbnV4CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBUaG9tYXMgU2FpbGVyICAgICA6IGlvY3RsIGNvZGUgcmV3b3JrZWQgKHZtYWxsb2MvdmZyZWUgcmVtb3ZlZCkKKyAqICAgICAgICAgICAgICAgICAgIGludGVncmF0ZWQgc291bmRfc3dpdGNoLmMKKyAqIFN0ZWZhbiBSZWluYXVlciAgIDogaW50ZWdyYXRlZCAvcHJvYy9zb3VuZCAoZXF1YWxzIHRvIC9kZXYvc25kc3RhdCwKKyAqICAgICAgICAgICAgICAgICAgIHdoaWNoIHNob3VsZCBkaXNhcHBlYXIgaW4gdGhlIG5lYXIgZnV0dXJlKQorICogRXJpYyBEdW1hcwkgICAgIDogZGV2ZnMgc3VwcG9ydCAoMjItSmFuLTk4KSA8ZHVtYXNAbGludXguZXUub3JnPiB3aXRoCisgKiAgICAgICAgICAgICAgICAgICBmaXh1cHMgYnkgQy4gU2NvdHQgQW5hbmlhbiA8Y2FuYW5pYW5AYWx1bW5pLnByaW5jZXRvbi5lZHU+CisgKiBSaWNoYXJkIEdvb2NoICAgICA6IG1vdmVkIGNvbW1vbiAobm9uIE9TUy1zcGVjaWZpYykgZGV2aWNlcyB0byBzb3VuZF9jb3JlLmMKKyAqIFJvYiBSaWdncwkgICAgIDogQWRkZWQgcGVyc2lzdGVudCBETUEgYnVmZmVycyBzdXBwb3J0ICgxOTk4LzEwLzE3KQorICogQ2hyaXN0b3BoIEhlbGx3aWcgOiBTb21lIGNsZWFudXAgd29yayAoMjAwMC8wMy8wMSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisvKgorICogVGhpcyBvdWdodCB0byBiZSBtb3ZlZCBpbnRvIGluY2x1ZGUvYXNtL2RtYS5oCisgKi8KKyNpZm5kZWYgdmFsaWRfZG1hCisjZGVmaW5lIHZhbGlkX2RtYShuKSAoKG4pID49IDAgJiYgKG4pIDwgTUFYX0RNQV9DSEFOTkVMUyAmJiAobikgIT0gNCkKKyNlbmRpZgorCisvKgorICogVGFibGUgZm9yIHBlcm1hbmVudGx5IGFsbG9jYXRlZCBtZW1vcnkgKHVzZWQgd2hlbiB1bmxvYWRpbmcgdGhlIG1vZHVsZSkKKyAqLwordm9pZCAqICAgICAgICAgIHNvdW5kX21lbV9ibG9ja3NbMTAyNF07CitpbnQgICAgICAgICAgICAgc291bmRfbmJsb2NrcyA9IDA7CisKKy8qIFBlcnNpc3RlbnQgRE1BIGJ1ZmZlcnMgKi8KKyNpZmRlZiBDT05GSUdfU09VTkRfRE1BUAoraW50ICAgICAgICAgICAgIHNvdW5kX2RtYXBfZmxhZyA9IDE7CisjZWxzZQoraW50ICAgICAgICAgICAgIHNvdW5kX2RtYXBfZmxhZyA9IDA7CisjZW5kaWYKKworc3RhdGljIGNoYXIgICAgIGRtYV9hbGxvY19tYXBbTUFYX0RNQV9DSEFOTkVMU107CisKKyNkZWZpbmUgRE1BX01BUF9VTkFWQUlMCQkwCisjZGVmaW5lIERNQV9NQVBfRlJFRQkJMQorI2RlZmluZSBETUFfTUFQX0JVU1kJCTIKKworCit1bnNpZ25lZCBsb25nIHNlcV90aW1lID0gMDsJLyogVGltZSBmb3IgL2Rldi9zZXF1ZW5jZXIgKi8KK2V4dGVybiBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICpzb3VuZF9jbGFzczsKKworLyoKKyAqIFRhYmxlIGZvciBjb25maWd1cmFibGUgbWl4ZXIgdm9sdW1lIGhhbmRsaW5nCisgKi8KK3N0YXRpYyBtaXhlcl92b2xfdGFibGUgbWl4ZXJfdm9sc1tNQVhfTUlYRVJfREVWXTsKK3N0YXRpYyBpbnQgbnVtX21peGVyX3ZvbHVtZXM7CisKK2ludCAqbG9hZF9taXhlcl92b2x1bWVzKGNoYXIgKm5hbWUsIGludCAqbGV2ZWxzLCBpbnQgcHJlc2VudCkKK3sKKwlpbnQgICAgICAgICAgICAgaSwgbjsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbWl4ZXJfdm9sdW1lczsgaSsrKSB7CisJCWlmIChzdHJjbXAobmFtZSwgbWl4ZXJfdm9sc1tpXS5uYW1lKSA9PSAwKSB7CisJCQlpZiAocHJlc2VudCkKKwkJCQltaXhlcl92b2xzW2ldLm51bSA9IGk7CisJCQlyZXR1cm4gbWl4ZXJfdm9sc1tpXS5sZXZlbHM7CisJCX0KKwl9CisJaWYgKG51bV9taXhlcl92b2x1bWVzID49IE1BWF9NSVhFUl9ERVYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogVG9vIG1hbnkgbWl4ZXJzICglcylcbiIsIG5hbWUpOworCQlyZXR1cm4gbGV2ZWxzOworCX0KKwluID0gbnVtX21peGVyX3ZvbHVtZXMrKzsKKworCXN0cmNweShtaXhlcl92b2xzW25dLm5hbWUsIG5hbWUpOworCisJaWYgKHByZXNlbnQpCisJCW1peGVyX3ZvbHNbbl0ubnVtID0gbjsKKwllbHNlCisJCW1peGVyX3ZvbHNbbl0ubnVtID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJbWl4ZXJfdm9sc1tuXS5sZXZlbHNbaV0gPSBsZXZlbHNbaV07CisJcmV0dXJuIG1peGVyX3ZvbHNbbl0ubGV2ZWxzOworfQorCitzdGF0aWMgaW50IHNldF9taXhlcl9sZXZlbHModm9pZCBfX3VzZXIgKiBhcmcpCit7CisgICAgICAgIC8qIG1peGVyX3ZvbF90YWJsZSBpcyAxNzQgYnl0ZXMsIHNvIElNSE8gbm8gcmVhc29uIHRvIG5vdCBhbGxvY2F0ZSBpdCBvbiB0aGUgc3RhY2sgKi8KKwltaXhlcl92b2xfdGFibGUgYnVmOyAgIAorCisJaWYgKF9fY29weV9mcm9tX3VzZXIoJmJ1ZiwgYXJnLCBzaXplb2YoYnVmKSkpCisJCXJldHVybiAtRUZBVUxUOworCWxvYWRfbWl4ZXJfdm9sdW1lcyhidWYubmFtZSwgYnVmLmxldmVscywgMCk7CisJaWYgKF9fY29weV90b191c2VyKGFyZywgJmJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbWl4ZXJfbGV2ZWxzKHZvaWQgX191c2VyICogYXJnKQoreworCWludCBuOworCisJaWYgKF9fZ2V0X3VzZXIobiwgKGludCBfX3VzZXIgKikoJigoKG1peGVyX3ZvbF90YWJsZSBfX3VzZXIgKilhcmcpLT5udW0pKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChuIDwgMCB8fCBuID49IG51bV9taXhlcl92b2x1bWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoX19jb3B5X3RvX3VzZXIoYXJnLCAmbWl4ZXJfdm9sc1tuXSwgc2l6ZW9mKG1peGVyX3ZvbF90YWJsZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyogNEsgcGFnZSBzaXplIGJ1dCBvdXIgb3V0cHV0IHJvdXRpbmVzIHVzZSBzb21lIHNsYWNrIGZvciBvdmVycnVucyAqLworI2RlZmluZSBQUk9DX0JMT0NLX1NJWkUgKDMqMTAyNCkKKworc3RhdGljIHNzaXplX3Qgc291bmRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGRldiA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwkvKgorCSAqCVRoZSBPU1MgZHJpdmVycyBhcmVuJ3QgcmVtb3RlbHkgaGFwcHkgd2l0aG91dCB0aGlzIGxvY2tpbmcsCisJICoJYW5kIHVubGVzcyBzb21lb25lIGZpeGVzIHRoZW0gd2hlbiB0aGV5IGFyZSBhYm91dCB0byBiaXRlIHRoZQorCSAqCWJpZyBvbmUgYW55d2F5LCB3ZSBtaWdodCBhcyB3ZWxsIGJhbmRhZ2UgaGVyZS4uCisJICovCisJIAorCWxvY2tfa2VybmVsKCk7CisJCisJREVCKHByaW50aygic291bmRfcmVhZChkZXY9JWQsIGNvdW50PSVkKVxuIiwgZGV2LCBjb3VudCkpOworCXN3aXRjaCAoZGV2ICYgMHgwZikgeworCWNhc2UgU05EX0RFVl9EU1A6CisJY2FzZSBTTkRfREVWX0RTUDE2OgorCWNhc2UgU05EX0RFVl9BVURJTzoKKwkJcmV0ID0gYXVkaW9fcmVhZChkZXYsIGZpbGUsIGJ1ZiwgY291bnQpOworCQlicmVhazsKKworCWNhc2UgU05EX0RFVl9TRVE6CisJY2FzZSBTTkRfREVWX1NFUTI6CisJCXJldCA9IHNlcXVlbmNlcl9yZWFkKGRldiwgZmlsZSwgYnVmLCBjb3VudCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfREVWX01JRElOOgorCQlyZXQgPSBNSURJYnVmX3JlYWQoZGV2LCBmaWxlLCBidWYsIGNvdW50KTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvdW5kX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgZGV2ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwkKKwlsb2NrX2tlcm5lbCgpOworCURFQihwcmludGsoInNvdW5kX3dyaXRlKGRldj0lZCwgY291bnQ9JWQpXG4iLCBkZXYsIGNvdW50KSk7CisJc3dpdGNoIChkZXYgJiAweDBmKSB7CisJY2FzZSBTTkRfREVWX1NFUToKKwljYXNlIFNORF9ERVZfU0VRMjoKKwkJcmV0ID0gIHNlcXVlbmNlcl93cml0ZShkZXYsIGZpbGUsIGJ1ZiwgY291bnQpOworCQlicmVhazsKKworCWNhc2UgU05EX0RFVl9EU1A6CisJY2FzZSBTTkRfREVWX0RTUDE2OgorCWNhc2UgU05EX0RFVl9BVURJTzoKKwkJcmV0ID0gYXVkaW9fd3JpdGUoZGV2LCBmaWxlLCBidWYsIGNvdW50KTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9ERVZfTUlESU46CisJCXJldCA9ICBNSURJYnVmX3dyaXRlKGRldiwgZmlsZSwgYnVmLCBjb3VudCk7CisJCWJyZWFrOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzb3VuZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpOworCWludCByZXR2YWw7CisKKwlERUIocHJpbnRrKCJzb3VuZF9vcGVuKGRldj0lZClcbiIsIGRldikpOworCWlmICgoZGV2ID49IFNORF9OREVWUykgfHwgKGRldiA8IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBtaW5vciBkZXZpY2UgJWRcbiIsIGRldik7CisJCXJldHVybiAtRU5YSU87CisJfQorCXN3aXRjaCAoZGV2ICYgMHgwZikgeworCWNhc2UgU05EX0RFVl9DVEw6CisJCWRldiA+Pj0gNDsKKwkJaWYgKGRldiA+PSAwICYmIGRldiA8IE1BWF9NSVhFUl9ERVYgJiYgbWl4ZXJfZGV2c1tkZXZdID09IE5VTEwpIHsKKwkJCXJlcXVlc3RfbW9kdWxlKCJtaXhlciVkIiwgZGV2KTsKKwkJfQorCQlpZiAoZGV2ICYmIChkZXYgPj0gbnVtX21peGVycyB8fCBtaXhlcl9kZXZzW2Rldl0gPT0gTlVMTCkpCisJCQlyZXR1cm4gLUVOWElPOworCQorCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KG1peGVyX2RldnNbZGV2XS0+b3duZXIpKQorCQkJcmV0dXJuIC1FTlhJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9ERVZfU0VROgorCWNhc2UgU05EX0RFVl9TRVEyOgorCQlpZiAoKHJldHZhbCA9IHNlcXVlbmNlcl9vcGVuKGRldiwgZmlsZSkpIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJCWJyZWFrOworCisJY2FzZSBTTkRfREVWX01JRElOOgorCQlpZiAoKHJldHZhbCA9IE1JRElidWZfb3BlbihkZXYsIGZpbGUpKSA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCQlicmVhazsKKworCWNhc2UgU05EX0RFVl9EU1A6CisJY2FzZSBTTkRfREVWX0RTUDE2OgorCWNhc2UgU05EX0RFVl9BVURJTzoKKwkJaWYgKChyZXR2YWwgPSBhdWRpb19vcGVuKGRldiwgZmlsZSkpIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIG1pbm9yIGRldmljZSAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb3VuZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpOworCisJbG9ja19rZXJuZWwoKTsKKwlERUIocHJpbnRrKCJzb3VuZF9yZWxlYXNlKGRldj0lZClcbiIsIGRldikpOworCXN3aXRjaCAoZGV2ICYgMHgwZikgeworCWNhc2UgU05EX0RFVl9DVEw6CisJCW1vZHVsZV9wdXQobWl4ZXJfZGV2c1tkZXYgPj4gNF0tPm93bmVyKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgU05EX0RFVl9TRVE6CisJY2FzZSBTTkRfREVWX1NFUTI6CisJCXNlcXVlbmNlcl9yZWxlYXNlKGRldiwgZmlsZSk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfREVWX01JRElOOgorCQlNSURJYnVmX3JlbGVhc2UoZGV2LCBmaWxlKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9ERVZfRFNQOgorCWNhc2UgU05EX0RFVl9EU1AxNjoKKwljYXNlIFNORF9ERVZfQVVESU86CisJCWF1ZGlvX3JlbGVhc2UoZGV2LCBmaWxlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kIGVycm9yOiBSZWxlYXNpbmcgdW5rbm93biBkZXZpY2UgMHglMDJ4XG4iLCBkZXYpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbWl4ZXJfaW5mbyhpbnQgZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCW1peGVyX2luZm8gaW5mbzsKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJc3RybGNweShpbmZvLmlkLCBtaXhlcl9kZXZzW2Rldl0tPmlkLCBzaXplb2YoaW5mby5pZCkpOworCXN0cmxjcHkoaW5mby5uYW1lLCBtaXhlcl9kZXZzW2Rldl0tPm5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKKwlpbmZvLm1vZGlmeV9jb3VudGVyID0gbWl4ZXJfZGV2c1tkZXZdLT5tb2RpZnlfY291bnRlcjsKKwlpZiAoX19jb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgIHNpemVvZihpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9vbGRfbWl4ZXJfaW5mbyhpbnQgZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKyAJc3RybGNweShpbmZvLmlkLCBtaXhlcl9kZXZzW2Rldl0tPmlkLCBzaXplb2YoaW5mby5pZCkpOworIAlzdHJsY3B5KGluZm8ubmFtZSwgbWl4ZXJfZGV2c1tkZXZdLT5uYW1lLCBzaXplb2YoaW5mby5uYW1lKSk7CisgCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgIHNpemVvZihpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvdW5kX21peGVyX2lvY3RsKGludCBtaXhkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisgCWlmIChtaXhkZXYgPCAwIHx8IG1peGRldiA+PSBNQVhfTUlYRVJfREVWKQorIAkJcmV0dXJuIC1FTlhJTzsKKyAJLyogVHJ5IHRvIGxvYWQgdGhlIG1peGVyLi4uICovCisgCWlmIChtaXhlcl9kZXZzW21peGRldl0gPT0gTlVMTCkgeworIAkJcmVxdWVzdF9tb2R1bGUoIm1peGVyJWQiLCBtaXhkZXYpOworIAl9CisgCWlmIChtaXhkZXYgPj0gbnVtX21peGVycyB8fCAhbWl4ZXJfZGV2c1ttaXhkZXZdKQorIAkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pCisJCXJldHVybiBnZXRfbWl4ZXJfaW5mbyhtaXhkZXYsIGFyZyk7CisJaWYgKGNtZCA9PSBTT1VORF9PTERfTUlYRVJfSU5GTykKKwkJcmV0dXJuIGdldF9vbGRfbWl4ZXJfaW5mbyhtaXhkZXYsIGFyZyk7CisJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpCisJCW1peGVyX2RldnNbbWl4ZGV2XS0+bW9kaWZ5X2NvdW50ZXIrKzsKKwlpZiAoIW1peGVyX2RldnNbbWl4ZGV2XS0+aW9jdGwpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBtaXhlcl9kZXZzW21peGRldl0tPmlvY3RsKG1peGRldiwgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IHNvdW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGxlbiA9IDAsIGR0eXBlOworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpOworCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKF9TSU9DX0RJUihjbWQpICE9IF9TSU9DX05PTkUgJiYgX1NJT0NfRElSKGNtZCkgIT0gMCkgeworCQkvKgorCQkgKiBIYXZlIHRvIHZhbGlkYXRlIHRoZSBhZGRyZXNzIGdpdmVuIGJ5IHRoZSBwcm9jZXNzLgorCQkgKi8KKwkJbGVuID0gX1NJT0NfU0laRShjbWQpOworCQlpZiAobGVuIDwgMSB8fCBsZW4gPiA2NTUzNiB8fCAhcCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkKKwkJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBwLCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19SRUFEKQorCQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBwLCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCX0KKwlERUIocHJpbnRrKCJzb3VuZF9pb2N0bChkZXY9JWQsIGNtZD0weCV4LCBhcmc9MHgleClcbiIsIGRldiwgY21kLCBhcmcpKTsKKwlpZiAoY21kID09IE9TU19HRVRWRVJTSU9OKQorCQlyZXR1cm4gX19wdXRfdXNlcihTT1VORF9WRVJTSU9OLCAoaW50IF9fdXNlciAqKXApOworCQorCWlmIChfSU9DX1RZUEUoY21kKSA9PSAnTScgJiYgbnVtX21peGVycyA+IDAgJiYgICAvKiBNaXhlciBpb2N0bCAqLworCSAgICAoZGV2ICYgMHgwZikgIT0gU05EX0RFVl9DVEwpIHsgICAgICAgICAgICAgIAorCQlkdHlwZSA9IGRldiAmIDB4MGY7CisJCXN3aXRjaCAoZHR5cGUpIHsKKwkJY2FzZSBTTkRfREVWX0RTUDoKKwkJY2FzZSBTTkRfREVWX0RTUDE2OgorCQljYXNlIFNORF9ERVZfQVVESU86CisJCQlyZXR1cm4gc291bmRfbWl4ZXJfaW9jdGwoYXVkaW9fZGV2c1tkZXYgPj4gNF0tPm1peGVyX2RldiwKKwkJCQkJCSBjbWQsIHApOworCQkJCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gc291bmRfbWl4ZXJfaW9jdGwoZGV2ID4+IDQsIGNtZCwgcCk7CisJCX0KKwl9CisJc3dpdGNoIChkZXYgJiAweDBmKSB7CisJY2FzZSBTTkRfREVWX0NUTDoKKwkJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9HRVRMRVZFTFMpCisJCQlyZXR1cm4gZ2V0X21peGVyX2xldmVscyhwKTsKKwkJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9TRVRMRVZFTFMpCisJCQlyZXR1cm4gc2V0X21peGVyX2xldmVscyhwKTsKKwkJcmV0dXJuIHNvdW5kX21peGVyX2lvY3RsKGRldiA+PiA0LCBjbWQsIHApOworCisJY2FzZSBTTkRfREVWX1NFUToKKwljYXNlIFNORF9ERVZfU0VRMjoKKwkJcmV0dXJuIHNlcXVlbmNlcl9pb2N0bChkZXYsIGZpbGUsIGNtZCwgcCk7CisKKwljYXNlIFNORF9ERVZfRFNQOgorCWNhc2UgU05EX0RFVl9EU1AxNjoKKwljYXNlIFNORF9ERVZfQVVESU86CisJCXJldHVybiBhdWRpb19pb2N0bChkZXYsIGZpbGUsIGNtZCwgcCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfREVWX01JRElOOgorCQlyZXR1cm4gTUlESWJ1Zl9pb2N0bChkZXYsIGZpbGUsIGNtZCwgcCk7CisJCWJyZWFrOworCisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNvdW5kX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKTsKKworCURFQihwcmludGsoInNvdW5kX3BvbGwoZGV2PSVkKVxuIiwgZGV2KSk7CisJc3dpdGNoIChkZXYgJiAweDBmKSB7CisJY2FzZSBTTkRfREVWX1NFUToKKwljYXNlIFNORF9ERVZfU0VRMjoKKwkJcmV0dXJuIHNlcXVlbmNlcl9wb2xsKGRldiwgZmlsZSwgd2FpdCk7CisKKwljYXNlIFNORF9ERVZfTUlESU46CisJCXJldHVybiBNSURJYnVmX3BvbGwoZGV2LCBmaWxlLCB3YWl0KTsKKworCWNhc2UgU05EX0RFVl9EU1A6CisJY2FzZSBTTkRfREVWX0RTUDE2OgorCWNhc2UgU05EX0RFVl9BVURJTzoKKwkJcmV0dXJuIERNQWJ1Zl9wb2xsKGZpbGUsIGRldiA+PiA0LCB3YWl0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc291bmRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaW50IGRldl9jbGFzczsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSBOVUxMOworCWludCBkZXYgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCisJZGV2X2NsYXNzID0gZGV2ICYgMHgwZjsKKwlkZXYgPj49IDQ7CisKKwlpZiAoZGV2X2NsYXNzICE9IFNORF9ERVZfRFNQICYmIGRldl9jbGFzcyAhPSBTTkRfREVWX0RTUDE2ICYmIGRldl9jbGFzcyAhPSBTTkRfREVWX0FVRElPKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IG1tYXAoKSBub3Qgc3VwcG9ydGVkIGZvciBvdGhlciB0aGFuIGF1ZGlvIGRldmljZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbG9ja19rZXJuZWwoKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQkvKiBNYXAgd3JpdGUgYW5kIHJlYWQvd3JpdGUgdG8gdGhlIG91dHB1dCBidWYgKi8KKwkJZG1hcCA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQ7CisJZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpCisJCWRtYXAgPSBhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW47CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IFVuZGVmaW5lZCBtbWFwKCkgYWNjZXNzXG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZG1hcCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IG1tYXAoKSBlcnJvci4gZG1hcCA9PSBOVUxMXG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGRtYXAtPnJhd19idWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBtbWFwKCkgY2FsbGVkIHdoZW4gcmF3X2J1ZiA9PSBOVUxMXG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGRtYXAtPm1hcHBpbmdfZmxhZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogbW1hcCgpIGNhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgRE1BIGJ1ZmZlclxuIik7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogbW1hcCgpIG9mZnNldCBtdXN0IGJlIDAuXG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworCWlmIChzaXplICE9IGRtYXAtPmJ5dGVzX2luX3VzZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZDogbW1hcCgpIHNpemUgPSAlbGQuIFNob3VsZCBiZSAlZFxuIiwgc2l6ZSwgZG1hcC0+Ynl0ZXNfaW5fdXNlKTsKKwl9CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQl2aXJ0X3RvX3BoeXMoZG1hcC0+cmF3X2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCXZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJZG1hcC0+bWFwcGluZ19mbGFncyB8PSBETUFfTUFQX01BUFBFRDsKKworCWlmKCBhdWRpb19kZXZzW2Rldl0tPmQtPm1tYXApCisJCWF1ZGlvX2RldnNbZGV2XS0+ZC0+bW1hcChkZXYpOworCisJbWVtc2V0KGRtYXAtPnJhd19idWYsCisJICAgICAgIGRtYXAtPm5ldXRyYWxfYnl0ZSwKKwkgICAgICAgZG1hcC0+Ynl0ZXNfaW5fdXNlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgb3NzX3NvdW5kX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHNvdW5kX3JlYWQsCisJLndyaXRlCQk9IHNvdW5kX3dyaXRlLAorCS5wb2xsCQk9IHNvdW5kX3BvbGwsCisJLmlvY3RsCQk9IHNvdW5kX2lvY3RsLAorCS5tbWFwCQk9IHNvdW5kX21tYXAsCisJLm9wZW4JCT0gc291bmRfb3BlbiwKKwkucmVsZWFzZQk9IHNvdW5kX3JlbGVhc2UsCit9OworCisvKgorICoJQ3JlYXRlIHRoZSByZXF1aXJlZCBzcGVjaWFsIHN1YmRldmljZXMKKyAqLworIAorc3RhdGljIGludCBjcmVhdGVfc3BlY2lhbF9kZXZpY2VzKHZvaWQpCit7CisJaW50IHNlcTEsc2VxMjsKKwlzZXExPXJlZ2lzdGVyX3NvdW5kX3NwZWNpYWwoJm9zc19zb3VuZF9mb3BzLCAxKTsKKwlpZihzZXExPT0tMSkKKwkJZ290byBiYWQ7CisJc2VxMj1yZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKCZvc3Nfc291bmRfZm9wcywgOCk7CisJaWYoc2VxMiE9LTEpCisJCXJldHVybiAwOworCXVucmVnaXN0ZXJfc291bmRfc3BlY2lhbCgxKTsKK2JhZDoKKwlyZXR1cm4gLTE7Cit9CisKKworLyogVGhlc2UgZGV2aWNlIG5hbWVzIGZvbGxvdyB0aGUgb2ZmaWNpYWwgTGludXggZGV2aWNlIGxpc3QsCisgKiBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0LiAgTGV0IHVzIGtub3cgaWYgdGhlcmUgYXJlIG90aGVyCisgKiBjb21tb24gbmFtZXMgd2Ugc2hvdWxkIHN1cHBvcnQgZm9yIGNvbXBhdGliaWxpdHkuCisgKiBPbmx5IHRob3NlIGRldmljZXMgbm90IGNyZWF0ZWQgYnkgdGhlIGdlbmVyaWMgY29kZSBpbiBzb3VuZF9jb3JlLmMgYXJlCisgKiByZWdpc3RlcmVkIGhlcmUuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IG1pbm9yOworCWNoYXIgKm5hbWU7CisJdW1vZGVfdCBtb2RlOworCWludCAqbnVtOworfSBkZXZfbGlzdFtdID0geyAvKiBsaXN0IG9mIG1pbm9yIGRldmljZXMgKi8KKy8qIHNlZW1zIHRvIGJlIHNvbWUgY29uZnVzaW9uIGhlcmUgLS0gdGhpcyBkZXZpY2UgaXMgbm90IGluIHRoZSBkZXZpY2UgbGlzdCAqLworCXtTTkRfREVWX0RTUDE2LCAgICAgImRzcFciLAkgU19JV1VHTyB8IFNfSVJVU1IgfCBTX0lSR1JQLAorCSAmbnVtX2F1ZGlvZGV2c30sCisJe1NORF9ERVZfQVVESU8sICAgICAiYXVkaW8iLAkgU19JV1VHTyB8IFNfSVJVU1IgfCBTX0lSR1JQLAorCSAmbnVtX2F1ZGlvZGV2c30sCit9OworCitzdGF0aWMgaW50IGRtYWJ1ZjsKK3N0YXRpYyBpbnQgZG1hYnVnOworCittb2R1bGVfcGFyYW0oZG1hYnVmLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGRtYWJ1ZywgaW50LCAwNDQ0KTsKKworc3RhdGljIGludCBfX2luaXQgb3NzX2luaXQodm9pZCkKK3sKKwlpbnQgICAgICAgICAgICAgZXJyOworCWludCBpLCBqOworCQorCS8qIGRyYWcgaW4gc291bmRfc3ltcy5vICovCisJeworCQlleHRlcm4gY2hhciBzb3VuZF9zeW1zX3N5bWJvbDsKKwkJc291bmRfc3ltc19zeW1ib2wgPSAwOworCX0KKworI2lmZGVmIENPTkZJR19QQ0kKKwlpZihkbWFidWcpCisJCWlzYV9kbWFfYnJpZGdlX2J1Z2d5ID0gZG1hYnVnOworI2VuZGlmCisKKwllcnIgPSBjcmVhdGVfc3BlY2lhbF9kZXZpY2VzKCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kOiBkcml2ZXIgYWxyZWFkeSBsb2FkZWQvaW5jbHVkZWQgaW4ga2VybmVsXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBQcm90ZWN0aW5nIHRoZSBpbm5vY2VudCAqLworCXNvdW5kX2RtYXBfZmxhZyA9IChkbWFidWYgPiAwID8gMSA6IDApOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZGV2X2xpc3QpIC8gc2l6ZW9mICpkZXZfbGlzdDsgaSsrKSB7CisJCWRldmZzX21rX2NkZXYoTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yKSwKKwkJCQlTX0lGQ0hSIHwgZGV2X2xpc3RbaV0ubW9kZSwKKwkJCQkic291bmQvJXMiLCBkZXZfbGlzdFtpXS5uYW1lKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoc291bmRfY2xhc3MsIAorCQkJCQlNS0RFVihTT1VORF9NQUpPUiwgZGV2X2xpc3RbaV0ubWlub3IpLAorCQkJCQlOVUxMLCAiJXMiLCBkZXZfbGlzdFtpXS5uYW1lKTsKKworCQlpZiAoIWRldl9saXN0W2ldLm51bSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaiA9IDE7IGogPCAqZGV2X2xpc3RbaV0ubnVtOyBqKyspIHsKKwkJCWRldmZzX21rX2NkZXYoTUtERVYoU09VTkRfTUFKT1IsCisJCQkJCQlkZXZfbGlzdFtpXS5taW5vciArIChqKjB4MTApKSwKKwkJCQkJU19JRkNIUiB8IGRldl9saXN0W2ldLm1vZGUsCisJCQkJCSJzb3VuZC8lcyVkIiwgZGV2X2xpc3RbaV0ubmFtZSwgaik7CisJCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChzb3VuZF9jbGFzcywKKwkJCQkJTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yICsgKGoqMHgxMCkpLAorCQkJCQlOVUxMLAorCQkJCQkiJXMlZCIsIGRldl9saXN0W2ldLm5hbWUsIGopOworCQl9CisJfQorCisJaWYgKHNvdW5kX25ibG9ja3MgPj0gMTAyNCkKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZCB3YXJuaW5nOiBEZWFsbG9jYXRpb24gdGFibGUgd2FzIHRvbyBzbWFsbC5cbiIpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3NzX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRldl9saXN0KSAvIHNpemVvZiAqZGV2X2xpc3Q7IGkrKykgeworCQlkZXZmc19yZW1vdmUoInNvdW5kLyVzIiwgZGV2X2xpc3RbaV0ubmFtZSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFNPVU5EX01BSk9SLCBkZXZfbGlzdFtpXS5taW5vcikpOworCQlpZiAoIWRldl9saXN0W2ldLm51bSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAxOyBqIDwgKmRldl9saXN0W2ldLm51bTsgaisrKSB7CisJCQlkZXZmc19yZW1vdmUoInNvdW5kLyVzJWQiLCBkZXZfbGlzdFtpXS5uYW1lLCBqKTsKKwkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFNPVU5EX01BSk9SLCBkZXZfbGlzdFtpXS5taW5vciArIChqKjB4MTApKSk7CisJCX0KKwl9CisJCisJdW5yZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKDEpOworCXVucmVnaXN0ZXJfc291bmRfc3BlY2lhbCg4KTsKKworCXNvdW5kX3N0b3BfdGltZXIoKTsKKworCXNlcXVlbmNlcl91bmxvYWQoKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX0NIQU5ORUxTOyBpKyspCisJCWlmIChkbWFfYWxsb2NfbWFwW2ldICE9IERNQV9NQVBfVU5BVkFJTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogSG1tLCBETUElZCB3YXMgbGVmdCBhbGxvY2F0ZWQgLSBmaXhlZFxuIiwgaSk7CisJCQlzb3VuZF9mcmVlX2RtYShpKTsKKwkJfQorCisJZm9yIChpID0gMDsgaSA8IHNvdW5kX25ibG9ja3M7IGkrKykKKwkJdmZyZWUoc291bmRfbWVtX2Jsb2Nrc1tpXSk7CisKK30KKworbW9kdWxlX2luaXQob3NzX2luaXQpOworbW9kdWxlX2V4aXQob3NzX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK2ludCBzb3VuZF9hbGxvY19kbWEoaW50IGNobiwgY2hhciAqZGV2aWNlSUQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcmVxdWVzdF9kbWEoY2huLCBkZXZpY2VJRCkpICE9IDApCisJCXJldHVybiBlcnI7CisKKwlkbWFfYWxsb2NfbWFwW2Nobl0gPSBETUFfTUFQX0ZSRUU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNvdW5kX29wZW5fZG1hKGludCBjaG4sIGNoYXIgKmRldmljZUlEKQoreworCWlmICghdmFsaWRfZG1hKGNobikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZF9vcGVuX2RtYTogSW52YWxpZCBETUEgY2hhbm5lbCAlZFxuIiwgY2huKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRtYV9hbGxvY19tYXBbY2huXSAhPSBETUFfTUFQX0ZSRUUpIHsKKwkJcHJpbnRrKCJzb3VuZF9vcGVuX2RtYTogRE1BIGNoYW5uZWwgJWQgYnVzeSBvciBub3QgYWxsb2NhdGVkICglZClcbiIsIGNobiwgZG1hX2FsbG9jX21hcFtjaG5dKTsKKwkJcmV0dXJuIDE7CisJfQorCWRtYV9hbGxvY19tYXBbY2huXSA9IERNQV9NQVBfQlVTWTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzb3VuZF9mcmVlX2RtYShpbnQgY2huKQoreworCWlmIChkbWFfYWxsb2NfbWFwW2Nobl0gPT0gRE1BX01BUF9VTkFWQUlMKSB7CisJCS8qIHByaW50ayggInNvdW5kX2ZyZWVfZG1hOiBCYWQgYWNjZXNzIHRvIERNQSBjaGFubmVsICVkXG4iLCAgY2huKTsgKi8KKwkJcmV0dXJuOworCX0KKwlmcmVlX2RtYShjaG4pOworCWRtYV9hbGxvY19tYXBbY2huXSA9IERNQV9NQVBfVU5BVkFJTDsKK30KKwordm9pZCBzb3VuZF9jbG9zZV9kbWEoaW50IGNobikKK3sKKwlpZiAoZG1hX2FsbG9jX21hcFtjaG5dICE9IERNQV9NQVBfQlVTWSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kX2Nsb3NlX2RtYTogQmFkIGFjY2VzcyB0byBETUEgY2hhbm5lbCAlZFxuIiwgY2huKTsKKwkJcmV0dXJuOworCX0KKwlkbWFfYWxsb2NfbWFwW2Nobl0gPSBETUFfTUFQX0ZSRUU7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3NlcXVlbmNlcl90aW1lcih1bnNpZ25lZCBsb25nIGR1bW15KQoreworCXNlcXVlbmNlcl90aW1lcigwKTsKK30KKworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2VxX3RpbWVyID0KKwkJVElNRVJfSU5JVElBTElaRVIoZG9fc2VxdWVuY2VyX3RpbWVyLCAwLCAwKTsKKwordm9pZCByZXF1ZXN0X3NvdW5kX3RpbWVyKGludCBjb3VudCkKK3sKKwlleHRlcm4gdW5zaWduZWQgbG9uZyBzZXFfdGltZTsKKworCWlmIChjb3VudCA8IDApIHsKKwkJc2VxX3RpbWVyLmV4cGlyZXMgPSAoLWNvdW50KSArIGppZmZpZXM7CisJCWFkZF90aW1lcigmc2VxX3RpbWVyKTsKKwkJcmV0dXJuOworCX0KKwljb3VudCArPSBzZXFfdGltZTsKKworCWNvdW50IC09IGppZmZpZXM7CisKKwlpZiAoY291bnQgPCAxKQorCQljb3VudCA9IDE7CisKKwlzZXFfdGltZXIuZXhwaXJlcyA9IChjb3VudCkgKyBqaWZmaWVzOworCWFkZF90aW1lcigmc2VxX3RpbWVyKTsKK30KKwordm9pZCBzb3VuZF9zdG9wX3RpbWVyKHZvaWQpCit7CisJZGVsX3RpbWVyKCZzZXFfdGltZXIpOworfQorCit2b2lkIGNvbmZfcHJpbnRmKGNoYXIgKm5hbWUsIHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKyNpZm5kZWYgQ09ORklHX1NPVU5EX1RSQUNFSU5JVAorCXJldHVybjsKKyNlbHNlCisJcHJpbnRrKCI8JXM+IGF0IDB4JTAzeCIsIG5hbWUsIGh3X2NvbmZpZy0+aW9fYmFzZSk7CisKKwlpZiAoaHdfY29uZmlnLT5pcnEpCisJCXByaW50aygiIGlycSAlZCIsIChod19jb25maWctPmlycSA+IDApID8gaHdfY29uZmlnLT5pcnEgOiAtaHdfY29uZmlnLT5pcnEpOworCisJaWYgKGh3X2NvbmZpZy0+ZG1hICE9IC0xIHx8IGh3X2NvbmZpZy0+ZG1hMiAhPSAtMSkKKwl7CisJCXByaW50aygiIGRtYSAlZCIsIGh3X2NvbmZpZy0+ZG1hKTsKKwkJaWYgKGh3X2NvbmZpZy0+ZG1hMiAhPSAtMSkKKwkJCXByaW50aygiLCVkIiwgaHdfY29uZmlnLT5kbWEyKTsKKwl9CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCit9CisKK3ZvaWQgY29uZl9wcmludGYyKGNoYXIgKm5hbWUsIGludCBiYXNlLCBpbnQgaXJxLCBpbnQgZG1hLCBpbnQgZG1hMikKK3sKKyNpZm5kZWYgQ09ORklHX1NPVU5EX1RSQUNFSU5JVAorCXJldHVybjsKKyNlbHNlCisJcHJpbnRrKCI8JXM+IGF0IDB4JTAzeCIsIG5hbWUsIGJhc2UpOworCisJaWYgKGlycSkKKwkJcHJpbnRrKCIgaXJxICVkIiwgKGlycSA+IDApID8gaXJxIDogLWlycSk7CisKKwlpZiAoZG1hICE9IC0xIHx8IGRtYTIgIT0gLTEpCisJeworCQkgIHByaW50aygiIGRtYSAlZCIsIGRtYSk7CisJCSAgaWYgKGRtYTIgIT0gLTEpCisJCQkgIHByaW50aygiLCVkIiwgZG1hMik7CisJfQorCXByaW50aygiXG4iKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kdmVycy5oIGIvc291bmQvb3NzL3NvdW5kdmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDg0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc291bmR2ZXJzLmgKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIFNPVU5EX1ZFUlNJT05fU1RSSU5HICIzLjhzMisrLTk3MTEzMCIKKyNkZWZpbmUgU09VTkRfSU5URVJOQUxfVkVSU0lPTiAweDAzMDgwNApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NzY2FwZS5jIGIvc291bmQvb3NzL3NzY2FwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2E2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc3NjYXBlLmMKQEAgLTAsMCArMSwxNDg1IEBACisvKgorICogc291bmQvc3NjYXBlLmMKKyAqCisgKiBMb3cgbGV2ZWwgZHJpdmVyIGZvciBFbnNvbmlxIFNvdW5kU2NhcGUKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICoKKyAqIFRob21hcyBTYWlsZXIgICAJOiBpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKiBTZXJnZXkgU21pdGllbmtvCTogZW5zb25pcSBwJ24ncCBzdXBwb3J0CisgKiBDaHJpc3RvcGggSGVsbHdpZwk6IGFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQKKyAqIEJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogOiBhZGRlZCBfX2luaXQgdG8gYXR0YWNoX3NzY2FwZSgpCisgKiBDaHJpcyBSYW5raW4JCTogU3BlY2lmeSB0aGF0IHRoaXMgbW9kdWxlIG93bnMgdGhlIGNvcHJvY2Vzc29yCisgKiBBcm5hbGRvIEMuIGRlIE1lbG8JOiBhZGRlZCBtaXNzaW5nIHJlc3RvcmVfZmxhZ3MgaW4gc3NjYXBlX3BucF91cGxvYWRfZmlsZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJzb3VuZF9maXJtd2FyZS5oIgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgImNvcHJvYy5oIgorCisjaW5jbHVkZSAiYWQxODQ4LmgiCisjaW5jbHVkZSAibXB1NDAxLmgiCisKKy8qCisgKiAgICBJL08gcG9ydHMKKyAqLworI2RlZmluZSBNSURJX0RBVEEgICAgICAgMAorI2RlZmluZSBNSURJX0NUUkwgICAgICAgMQorI2RlZmluZSBIT1NUX0NUUkwgICAgICAgMgorI2RlZmluZSBUWF9SRUFEWQkweDAyCisjZGVmaW5lIFJYX1JFQURZCTB4MDEKKyNkZWZpbmUgSE9TVF9EQVRBICAgICAgIDMKKyNkZWZpbmUgT0RJRV9BRERSICAgICAgIDQKKyNkZWZpbmUgT0RJRV9EQVRBICAgICAgIDUKKworLyoKKyAqICAgIEluZGlyZWN0IHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgR0FfSU5UU1RBVF9SRUcJMAorI2RlZmluZSBHQV9JTlRFTkFfUkVHCTEKKyNkZWZpbmUgR0FfRE1BQV9SRUcJMgorI2RlZmluZSBHQV9ETUFCX1JFRwkzCisjZGVmaW5lIEdBX0lOVENGR19SRUcJNAorI2RlZmluZSBHQV9ETUFDRkdfUkVHCTUKKyNkZWZpbmUgR0FfQ0RDRkdfUkVHCTYKKyNkZWZpbmUgR0FfU01DRkdBX1JFRwk3CisjZGVmaW5lIEdBX1NNQ0ZHQl9SRUcJOAorI2RlZmluZSBHQV9ITUNUTF9SRUcJOQorCisvKgorICogRE1BIGNoYW5uZWwgaWRlbnRpZmllcnMgKEEgYW5kIEIpCisgKi8KKworI2RlZmluZSBTU0NBUEVfRE1BX0EJMAorI2RlZmluZSBTU0NBUEVfRE1BX0IJMQorCisjZGVmaW5lIFBPUlQobmFtZSkJKGRldmMtPmJhc2UrbmFtZSkKKworLyoKKyAqIEhvc3QgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgT0JQIG1pY3JvY29kZQorICovCisgCisjZGVmaW5lIENNRF9HRU5fSE9TVF9BQ0sJMHg4MAorI2RlZmluZSBDTURfR0VOX01QVV9BQ0sJCTB4ODEKKyNkZWZpbmUgQ01EX0dFVF9CT0FSRF9UWVBFCTB4ODIKKyNkZWZpbmUgQ01EX1NFVF9DT05UUk9MCQkweDg4CS8qIE9sZCBmaXJtd2FyZSBvbmx5ICovCisjZGVmaW5lIENNRF9HRVRfQ09OVFJPTAkJMHg4OQkvKiBPbGQgZmlybXdhcmUgb25seSAqLworI2RlZmluZSBDVExfTUFTVEVSX1ZPTAkJMAorI2RlZmluZSBDVExfTUlDX01PREUJCTIKKyNkZWZpbmUgQ1RMX1NZTlRIX1ZPTAkJNAorI2RlZmluZSBDVExfV0FWRV9WT0wJCTcKKyNkZWZpbmUgQ01EX1NFVF9FWFRNSURJCQkweDhhCisjZGVmaW5lIENNRF9HRVRfRVhUTUlESQkJMHg4YgorI2RlZmluZSBDTURfU0VUX01UMzIJCTB4OGMKKyNkZWZpbmUgQ01EX0dFVF9NVDMyCQkweDhkCisKKyNkZWZpbmUgQ01EX0FDSwkJCTB4ODAKKworI2RlZmluZQlJQ19PRElFCQkJMQorI2RlZmluZQlJQ19PUFVTCQkJMgorCit0eXBlZGVmIHN0cnVjdCBzc2NhcGVfaW5mbworeworCWludAliYXNlLCBpcnEsIGRtYTsKKwkKKwlpbnQJY29kZWMsIGNvZGVjX2lycTsJLyogcmVxdWlyZWQgdG8gc2V0dXAgcG5wIGNhcmRzKi8KKwlpbnQJY29kZWNfdHlwZTsKKwlpbnQJaWNfdHlwZTsKKwljaGFyKglyYXdfYnVmOworCXVuc2lnbmVkIGxvbmcJcmF3X2J1Zl9waHlzOworCWludAlidWZmc2l6ZTsJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJc3BpbmxvY2tfdCBsb2NrOworCWludAlvazsJLyogUHJvcGVybHkgZGV0ZWN0ZWQgKi8KKwlpbnQJZmFpbGVkOworCWludAlkbWFfYWxsb2NhdGVkOworCWludAljb2RlY19hdWRpb2RldjsKKwlpbnQJb3BlbmVkOworCWludAkqb3NwOworCWludAlteV9hdWRpb2RldjsKK30gc3NjYXBlX2luZm87CisKK3N0YXRpYyBzdHJ1Y3Qgc3NjYXBlX2luZm8gYWRldl9pbmZvID0geworCTAKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMgPSAmYWRldl9pbmZvOworc3RhdGljIGludCBzc2NhcGVfbWlkaWRldiA9IC0xOworCisvKiBTb21lIG9sZGVyIGNhcmRzIGhhdmUgYXNzaWduZWQgaW50ZXJydXB0IGJpdHMgZGlmZmVyZW50bHkgdGhhbiBuZXcgb25lcyAqLworc3RhdGljIGNoYXIgdmFsaWRfaW50ZXJydXB0c19vbGRbXSA9IHsKKwk5LCA3LCA1LCAxNQorfTsKKworc3RhdGljIGNoYXIgdmFsaWRfaW50ZXJydXB0c19uZXdbXSA9IHsKKwk5LCA1LCA3LCAxMAorfTsKKworc3RhdGljIGNoYXIgKnZhbGlkX2ludGVycnVwdHMgPSB2YWxpZF9pbnRlcnJ1cHRzX25ldzsKKworLyoKKyAqCVNlZSB0aGUgYm90dG9tIG9mIHRoZSBkcml2ZXIuIFRoaXMgY2FuIGJlIHNldCBieSBzcGVhID0wLzEuCisgKi8KKyAKKyNpZmRlZiBSRVZFQUxfU1BFQQorc3RhdGljIGNoYXIgb2xkX2hhcmR3YXJlID0gMTsKKyNlbHNlCitzdGF0aWMgY2hhciBvbGRfaGFyZHdhcmU7CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2xlZXAodW5zaWduZWQgaG93bG9uZykKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KGhvd2xvbmcpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBzc2NhcGVfcmVhZChzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCByZWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlvdXRiKHJlZywgUE9SVChPRElFX0FERFIpKTsKKwl2YWwgPSBpbmIoUE9SVChPRElFX0RBVEEpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBfX3NzY2FwZV93cml0ZShpbnQgcmVnLCBpbnQgZGF0YSkKK3sKKwlvdXRiKHJlZywgUE9SVChPRElFX0FERFIpKTsKKwlvdXRiKGRhdGEsIFBPUlQoT0RJRV9EQVRBKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNzY2FwZV93cml0ZShzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCByZWcsIGludCBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJX19zc2NhcGVfd3JpdGUocmVnLCBkYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc3NjYXBlX3BucF9yZWFkX2NvZGVjKHNzY2FwZV9pbmZvKiBkZXZjLCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIHJlczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCW91dGIoIHJlZywgZGV2YyAtPiBjb2RlYyk7CisJcmVzID0gaW5iIChkZXZjIC0+IGNvZGVjICsgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJcmV0dXJuIHJlczsKKworfQorCitzdGF0aWMgdm9pZCBzc2NhcGVfcG5wX3dyaXRlX2NvZGVjKHNzY2FwZV9pbmZvKiBkZXZjLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCW91dGIoIHJlZywgZGV2YyAtPiBjb2RlYyk7CisJb3V0YiggZGF0YSwgZGV2YyAtPiBjb2RlYyArIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBob3N0X29wZW4oc3RydWN0IHNzY2FwZV9pbmZvICpkZXZjKQoreworCW91dGIoKDB4MDApLCBQT1JUKEhPU1RfQ1RSTCkpOwkvKiBQdXQgdGhlIGJvYXJkIHRvIHRoZSBob3N0IG1vZGUgKi8KK30KKworc3RhdGljIHZvaWQgaG9zdF9jbG9zZShzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMpCit7CisJb3V0YigoMHgwMyksIFBPUlQoSE9TVF9DVFJMKSk7CS8qIFB1dCB0aGUgYm9hcmQgdG8gdGhlIE1JREkgbW9kZSAqLworfQorCitzdGF0aWMgaW50IGhvc3Rfd3JpdGUoc3RydWN0IHNzY2FwZV9pbmZvICpkZXZjLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgdGltZW91dF92YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJLyoKKwkgKiBTZW5kIHRoZSBjb21tYW5kIGFuZCBkYXRhIGJ5dGVzCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwl7CisJCWZvciAodGltZW91dF92YWwgPSAxMDAwMDsgdGltZW91dF92YWwgPiAwOyB0aW1lb3V0X3ZhbC0tKQorCQkJaWYgKGluYihQT1JUKEhPU1RfQ1RSTCkpICYgVFhfUkVBRFkpCisJCQkJYnJlYWs7CisKKwkJaWYgKHRpbWVvdXRfdmFsIDw9IDApCisJCXsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJCSAgICByZXR1cm4gMDsKKwkJfQorCQlvdXRiKGRhdGFbaV0sIFBPUlQoSE9TVF9EQVRBKSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhvc3RfcmVhZChzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdGltZW91dF92YWw7CisJdW5zaWduZWQgY2hhciBkYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCS8qCisJICogUmVhZCBhIGJ5dGUKKwkgKi8KKworCWZvciAodGltZW91dF92YWwgPSAxMDAwMDsgdGltZW91dF92YWwgPiAwOyB0aW1lb3V0X3ZhbC0tKQorCQlpZiAoaW5iKFBPUlQoSE9TVF9DVFJMKSkgJiBSWF9SRUFEWSkKKwkJCWJyZWFrOworCisJaWYgKHRpbWVvdXRfdmFsIDw9IDApCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkYXRhID0gaW5iKFBPUlQoSE9TVF9EQVRBKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJcmV0dXJuIGRhdGE7Cit9CisKKyNpZiAwIC8qIHVudXNlZCAqLworc3RhdGljIGludCBob3N0X2NvbW1hbmQxKHN0cnVjdCBzc2NhcGVfaW5mbyAqZGV2YywgaW50IGNtZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisJYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpIChjbWQgJiAweGZmKTsKKwlyZXR1cm4gaG9zdF93cml0ZShkZXZjLCBidWYsIDEpOworfQorI2VuZGlmIC8qIHVudXNlZCAqLworCisKK3N0YXRpYyBpbnQgaG9zdF9jb21tYW5kMihzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCBjbWQsIGludCBwYXJtMSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisKKwlidWZbMF0gPSAodW5zaWduZWQgY2hhcikgKGNtZCAmIDB4ZmYpOworCWJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFyKSAocGFybTEgJiAweGZmKTsKKworCXJldHVybiBob3N0X3dyaXRlKGRldmMsIGJ1ZiwgMik7Cit9CisKK3N0YXRpYyBpbnQgaG9zdF9jb21tYW5kMyhzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCBjbWQsIGludCBwYXJtMSwgaW50IHBhcm0yKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzEwXTsKKworCWJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSAoY21kICYgMHhmZik7CisJYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpIChwYXJtMSAmIDB4ZmYpOworCWJ1ZlsyXSA9ICh1bnNpZ25lZCBjaGFyKSAocGFybTIgJiAweGZmKTsKKwlyZXR1cm4gaG9zdF93cml0ZShkZXZjLCBidWYsIDMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfbXQzMihzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCB2YWx1ZSkKK3sKKwlob3N0X29wZW4oZGV2Yyk7CisJaG9zdF9jb21tYW5kMihkZXZjLCBDTURfU0VUX01UMzIsIHZhbHVlID8gMSA6IDApOworCWlmIChob3N0X3JlYWQoZGV2YykgIT0gQ01EX0FDSykKKwl7CisJCS8qIHByaW50ayggIlNORFNDQVBFOiBTZXR0aW5nIE1UMzIgbW9kZSBmYWlsZWRcbiIpOyAqLworCX0KKwlob3N0X2Nsb3NlKGRldmMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfY29udHJvbChzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCBjdHJsLCBpbnQgdmFsdWUpCit7CisJaG9zdF9vcGVuKGRldmMpOworCWhvc3RfY29tbWFuZDMoZGV2YywgQ01EX1NFVF9DT05UUk9MLCBjdHJsLCB2YWx1ZSk7CisJaWYgKGhvc3RfcmVhZChkZXZjKSAhPSBDTURfQUNLKQorCXsKKwkJLyogcHJpbnRrKCAiU05EU0NBUEU6IFNldHRpbmcgY29udHJvbCAoJWQpIGZhaWxlZFxuIiwgIGN0cmwpOyAqLworCX0KKwlob3N0X2Nsb3NlKGRldmMpOworfQorCitzdGF0aWMgdm9pZCBkb19kbWEoc3RydWN0IHNzY2FwZV9pbmZvICpkZXZjLCBpbnQgZG1hX2NoYW4sIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgYmxrX3NpemUsIGludCBtb2RlKQoreworCXVuc2lnbmVkIGNoYXIgdGVtcDsKKworCWlmIChkbWFfY2hhbiAhPSBTU0NBUEVfRE1BX0EpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzb3VuZHNjYXBlOiBUcmllZCB0byB1c2UgRE1BIGNoYW5uZWwgICE9IEEuIFdoeT9cbiIpOworCQlyZXR1cm47CisJfQorCWF1ZGlvX2RldnNbZGV2Yy0+Y29kZWNfYXVkaW9kZXZdLT5mbGFncyAmPSB+RE1BX0FVVE9NT0RFOworCURNQWJ1Zl9zdGFydF9kbWEoZGV2Yy0+Y29kZWNfYXVkaW9kZXYsIGJ1ZiwgYmxrX3NpemUsIG1vZGUpOworCWF1ZGlvX2RldnNbZGV2Yy0+Y29kZWNfYXVkaW9kZXZdLT5mbGFncyB8PSBETUFfQVVUT01PREU7CisKKwl0ZW1wID0gZGV2Yy0+ZG1hIDw8IDQ7CS8qIFNldHVwIERNQSBjaGFubmVsIHNlbGVjdCBiaXRzICovCisJaWYgKGRldmMtPmRtYSA8PSAzKQorCQl0ZW1wIHw9IDB4ODA7CS8qIDggYml0IERNQSBjaGFubmVsICovCisKKwl0ZW1wIHw9IDE7CQkvKiBUcmlnZ2VyIERNQSAqLworCXNzY2FwZV93cml0ZShkZXZjLCBHQV9ETUFBX1JFRywgdGVtcCk7CisJdGVtcCAmPSAweGZlOwkJLyogQ2xlYXIgRE1BIHRyaWdnZXIgKi8KKwlzc2NhcGVfd3JpdGUoZGV2YywgR0FfRE1BQV9SRUcsIHRlbXApOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9tcHUoc3RydWN0IHNzY2FwZV9pbmZvICpkZXZjKQoreworCS8qCisJICogVGhlIFNvdW5kU2NhcGUgYm9hcmQgY291bGQgYmUgaW4gdGhyZWUgbW9kZXMgKE1QVSwgODI1MCBhbmQgaG9zdCkuCisJICogSWYgdGhlIGNhcmQgaXMgbm90IGluIHRoZSBNUFUgbW9kZSwgZW5hYmxpbmcgdGhlIE1QVSBkcml2ZXIgd2lsbAorCSAqIGNhdXNlIGluZmluaXRlIGxvb3AgKHRoZSBkcml2ZXIgYmVsaWV2ZXMgdGhhdCB0aGVyZSBpcyBhbHdheXMgc29tZQorCSAqIHJlY2VpdmVkIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKwkgKgorCSAqIERldGVjdCB0aGlzIGJ5IGxvb2tpbmcgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAxMCByZWNlaXZlZCBNSURJIGJ5dGVzCisJICogKDB4MDApIGluIHRoZSBidWZmZXIuCisJICovCisKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCXsKKwkJaWYgKGluYihkZXZjLT5iYXNlICsgSE9TVF9DVFJMKSAmIDB4ODApCisJCQlyZXR1cm4gMTsKKworCQlpZiAoaW5iKGRldmMtPmJhc2UpICE9IDB4MDApCisJCQlyZXR1cm4gMTsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmRTY2FwZTogVGhlIGRldmljZSBpcyBub3QgaW4gdGhlIE1QVS00MDEgbW9kZVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3NjYXBlX2NvcHJvY19vcGVuKHZvaWQgKmRldl9pbmZvLCBpbnQgc3ViX2RldmljZSkKK3sKKwlpZiAoc3ViX2RldmljZSA9PSBDT1BSX01JREkpCisJeworCQlzZXRfbXQzMihkZXZjLCAwKTsKKwkJaWYgKCF2ZXJpZnlfbXB1KGRldmMpKQorCQkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc2NhcGVfY29wcm9jX2Nsb3NlKHZvaWQgKmRldl9pbmZvLCBpbnQgc3ViX2RldmljZSkKK3sKKwlzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMgPSBkZXZfaW5mbzsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJaWYgKGRldmMtPmRtYV9hbGxvY2F0ZWQpCisJeworCQlfX3NzY2FwZV93cml0ZShHQV9ETUFBX1JFRywgMHgyMCk7CS8qIERNQSBjaGFubmVsIGRpc2FibGVkICovCisJCWRldmMtPmRtYV9hbGxvY2F0ZWQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNzY2FwZV9jb3Byb2NfcmVzZXQodm9pZCAqZGV2X2luZm8pCit7Cit9CisKK3N0YXRpYyBpbnQgc3NjYXBlX2Rvd25sb2FkX2Jvb3Qoc3RydWN0IHNzY2FwZV9pbmZvICpkZXZjLCB1bnNpZ25lZCBjaGFyICpibG9jaywgaW50IHNpemUsIGludCBmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB0ZW1wOworCXZvbGF0aWxlIGludCBkb25lLCB0aW1lb3V0X3ZhbDsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBjb2RlY19kbWFfYml0czsKKworCWlmIChmbGFnICYgQ1BGX0ZJUlNUKQorCXsKKwkJLyoKKwkJICogRmlyc3QgYmxvY2suIEhhdmUgdG8gYWxsb2NhdGUgRE1BIGFuZCB0byByZXNldCB0aGUgYm9hcmQKKwkJICogYmVmb3JlIGNvbnRpbnVpbmcuCisJCSAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJY29kZWNfZG1hX2JpdHMgPSBzc2NhcGVfcmVhZChkZXZjLCBHQV9DRENGR19SRUcpOworCisJCWlmIChkZXZjLT5kbWFfYWxsb2NhdGVkID09IDApCisJCQlkZXZjLT5kbWFfYWxsb2NhdGVkID0gMTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCQlzc2NhcGVfd3JpdGUoZGV2YywgR0FfSE1DVExfUkVHLCAKKwkJCSh0ZW1wID0gc3NjYXBlX3JlYWQoZGV2YywgR0FfSE1DVExfUkVHKSkgJiAweDNmKTsJLypSZXNldCAqLworCisJCWZvciAodGltZW91dF92YWwgPSAxMDAwMDsgdGltZW91dF92YWwgPiAwOyB0aW1lb3V0X3ZhbC0tKQorCQkJc3NjYXBlX3JlYWQoZGV2YywgR0FfSE1DVExfUkVHKTsJLyogRGVsYXkgKi8KKworCQkvKiBUYWtlIGJvYXJkIG91dCBvZiByZXNldCAqLworCQlzc2NhcGVfd3JpdGUoZGV2YywgR0FfSE1DVExfUkVHLAorCQkJKHRlbXAgPSBzc2NhcGVfcmVhZChkZXZjLCBHQV9ITUNUTF9SRUcpKSB8IDB4ODApOworCX0KKwkvKgorCSAqIFRyYW5zZmVyIG9uZSBjb2RlIGJsb2NrIHVzaW5nIERNQQorCSAqLworCWlmIChhdWRpb19kZXZzW2RldmMtPmNvZGVjX2F1ZGlvZGV2XS0+ZG1hcF9vdXQtPnJhd19idWYgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvdW5kc2NhcGU6IERNQSBidWZmZXIgbm90IGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkoYXVkaW9fZGV2c1tkZXZjLT5jb2RlY19hdWRpb2Rldl0tPmRtYXBfb3V0LT5yYXdfYnVmLCBibG9jaywgc2l6ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCisJLyoqKioqKioqIElOVEVSUlVQVFMgRElTQUJMRUQgTk9XICoqKioqKioqLworCQorCWRvX2RtYShkZXZjLCBTU0NBUEVfRE1BX0EsCisJICAgICAgIGF1ZGlvX2RldnNbZGV2Yy0+Y29kZWNfYXVkaW9kZXZdLT5kbWFwX291dC0+cmF3X2J1Zl9waHlzLAorCSAgICAgICBzaXplLCBETUFfTU9ERV9XUklURSk7CisKKwkvKgorCSAqIFdhaXQgdW50aWwgdHJhbnNmZXIgY29tcGxldGVzLgorCSAqLworCQorCWRvbmUgPSAwOworCXRpbWVvdXRfdmFsID0gMzA7CisJd2hpbGUgKCFkb25lICYmIHRpbWVvdXRfdmFsLS0gPiAwKQorCXsKKwkJaW50IHJlc2lkOworCisJCWlmIChIWiAvIDUwKQorCQkJc2xlZXAoSFogLyA1MCk7CisJCWNsZWFyX2RtYV9mZihkZXZjLT5kbWEpOworCQlpZiAoKHJlc2lkID0gZ2V0X2RtYV9yZXNpZHVlKGRldmMtPmRtYSkpID09IDApCisJCQlkb25lID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlpZiAoIWRvbmUpCisJCXJldHVybiAwOworCisJaWYgKGZsYWcgJiBDUEZfTEFTVCkKKwl7CisJCS8qCisJCSAqIFRha2UgdGhlIGJvYXJkIG91dCBvZiByZXNldAorCQkgKi8KKwkJb3V0YigoMHgwMCksIFBPUlQoSE9TVF9DVFJMKSk7CisJCW91dGIoKDB4MDApLCBQT1JUKE1JRElfQ1RSTCkpOworCisJCXRlbXAgPSBzc2NhcGVfcmVhZChkZXZjLCBHQV9ITUNUTF9SRUcpOworCQl0ZW1wIHw9IDB4NDA7CisJCXNzY2FwZV93cml0ZShkZXZjLCBHQV9ITUNUTF9SRUcsIHRlbXApOwkvKiBLaWNrc3RhcnQgdGhlIGJvYXJkICovCisKKwkJLyoKKwkJICogV2FpdCB1bnRpbCB0aGUgT0RCIHdha2VzIHVwCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCWRvbmUgPSAwOworCQl0aW1lb3V0X3ZhbCA9IDUgKiBIWjsKKwkJd2hpbGUgKCFkb25lICYmIHRpbWVvdXRfdmFsLS0gPiAwKQorCQl7CisJCQl1bnNpZ25lZCBjaGFyIHg7CisJCQkKKwkJCXNsZWVwKDEpOworCQkJeCA9IGluYihQT1JUKEhPU1RfREFUQSkpOworCQkJaWYgKHggPT0gMHhmZiB8fCB4ID09IDB4ZmUpCQkvKiBPQlAgc3RhcnR1cCBhY2tub3dsZWRnZSAqLworCQkJeworCQkJCUREQihwcmludGsoIlNvdW5kc2NhcGU6IEFja25vd2xlZGdlID0gJXhcbiIsIHgpKTsKKwkJCQlkb25lID0gMTsKKwkJCX0KKwkJfQorCQlzc2NhcGVfd3JpdGUoZGV2YywgR0FfQ0RDRkdfUkVHLCBjb2RlY19kbWFfYml0cyk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCWlmICghZG9uZSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZHNjYXBlOiBUaGUgT0JQIGRpZG4ndCByZXNwb25kIGFmdGVyIGNvZGUgZG93bmxvYWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQlkb25lID0gMDsKKwkJdGltZW91dF92YWwgPSA1ICogSFo7CisJCXdoaWxlICghZG9uZSAmJiB0aW1lb3V0X3ZhbC0tID4gMCkKKwkJeworCQkJc2xlZXAoMSk7CisJCQlpZiAoaW5iKFBPUlQoSE9TVF9EQVRBKSkgPT0gMHhmZSkJLyogSG9zdCBzdGFydHVwIGFja25vd2xlZGdlICovCisJCQkJZG9uZSA9IDE7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCWlmICghZG9uZSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZHNjYXBlOiBPQlAgSW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJTb3VuZFNjYXBlIGJvYXJkIGluaXRpYWxpemVkIE9LXG4iKTsKKwkJc2V0X2NvbnRyb2woZGV2YywgQ1RMX01BU1RFUl9WT0wsIDEwMCk7CisJCXNldF9jb250cm9sKGRldmMsIENUTF9TWU5USF9WT0wsIDEwMCk7CisKKyNpZmRlZiBTU0NBUEVfREVCVUczCisJCS8qCisJCSAqIFRlbXBvcmFyeSBkZWJ1Z2dpbmcgYWlkLiBQcmludCBjb250ZW50cyBvZiB0aGUgcmVnaXN0ZXJzIGFmdGVyCisJCSAqIGRvd25sb2FkaW5nIHRoZSBjb2RlLgorCQkgKi8KKwkJeworCQkJaW50IGk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorCQkJCXByaW50aygiSSVkID0gJTAyeCAobmV3IHZhbHVlKVxuIiwgaSwgc3NjYXBlX3JlYWQoZGV2YywgaSkpOworCQl9CisjZW5kaWYKKworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkb3dubG9hZF9ib290X2Jsb2NrKHZvaWQgKmRldl9pbmZvLCBjb3ByX2J1ZmZlciAqIGJ1ZikKK3sKKwlpZiAoYnVmLT5sZW4gPD0gMCB8fCBidWYtPmxlbiA+IHNpemVvZihidWYtPmRhdGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc3NjYXBlX2Rvd25sb2FkX2Jvb3QoZGV2YywgYnVmLT5kYXRhLCBidWYtPmxlbiwgYnVmLT5mbGFncykpCisJeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kc2NhcGU6IFVuYWJsZSB0byBsb2FkIG1pY3JvY29kZSBibG9jayB0byB0aGUgT0JQLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc2NhcGVfY29wcm9jX2lvY3RsKHZvaWQgKmRldl9pbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnLCBpbnQgbG9jYWwpCit7CisJY29wcl9idWZmZXIgKmJ1ZjsKKwlpbnQgZXJyOworCisJc3dpdGNoIChjbWQpIAorCXsKKwkJY2FzZSBTTkRDVExfQ09QUl9SRVNFVDoKKwkJCXNzY2FwZV9jb3Byb2NfcmVzZXQoZGV2X2luZm8pOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfQ09QUl9MT0FEOgorCQkJYnVmID0gKGNvcHJfYnVmZmVyICopIHZtYWxsb2Moc2l6ZW9mKGNvcHJfYnVmZmVyKSk7CisJCQlpZiAoYnVmID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBhcmcsIHNpemVvZihjb3ByX2J1ZmZlcikpKSAKKwkJCXsKKwkJCQl2ZnJlZShidWYpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJZXJyID0gZG93bmxvYWRfYm9vdF9ibG9jayhkZXZfaW5mbywgYnVmKTsKKwkJCXZmcmVlKGJ1Zik7CisJCQlyZXR1cm4gZXJyOworCQkKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGNvcHJvY19vcGVyYXRpb25zIHNzY2FwZV9jb3Byb2Nfb3BlcmF0aW9ucyA9Cit7CisJIlNvdW5kU2NhcGUgTTY4SyIsCisJVEhJU19NT0RVTEUsCisJc3NjYXBlX2NvcHJvY19vcGVuLAorCXNzY2FwZV9jb3Byb2NfY2xvc2UsCisJc3NjYXBlX2NvcHJvY19pb2N0bCwKKwlzc2NhcGVfY29wcm9jX3Jlc2V0LAorCSZhZGV2X2luZm8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKnNzY2FwZV9wb3J0czsKK3N0YXRpYyBpbnQgc3NjYXBlX2lzX3BucDsKKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF9zc2NhcGUoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworI2lmbmRlZiBTU0NBUEVfUkVHUworCS8qCisJICogQ29uZmlnIHJlZ2lzdGVyIHZhbHVlcyBmb3IgU3BlYS9WNyBNZWRpYSBGWCBhbmQgRW5zb25pcSBTLTIwMDAuCisJICogVGhlc2UgdmFsdWVzIGFyZSBjYXJkCisJICogZGVwZW5kZW50LiBJZiB5b3UgaGF2ZSBhbm90aGVyIFNvdW5kU2NhcGUgYmFzZWQgY2FyZCwgeW91IGhhdmUgdG8KKwkgKiBmaW5kIHRoZSBjb3JyZWN0IHZhbHVlcy4gRG8gdGhlIGZvbGxvd2luZzoKKwkgKiAgLSBDb21waWxlIHRoaXMgZHJpdmVyIHdpdGggU1NDQVBFX0RFQlVHMSBkZWZpbmVkLgorCSAqICAtIFNodXQgZG93biBhbmQgcG93ZXIgb2ZmIHlvdXIgbWFjaGluZS4KKwkgKiAgLSBCb290IHdpdGggRE9TIHNvIHRoYXQgdGhlIFNTSU5JVC5FWEUgcHJvZ3JhbSBpcyBydW4uCisJICogIC0gV2FybSBib290IHRvIHtMaW51eHxTWVNWfEJTRH0gYW5kIHdyaXRlIGRvd24gdGhlIGxpbmVzIGRpc3BsYXllZAorCSAqICAgIHdoZW4gZGV0ZWN0aW5nIHRoZSBTb3VuZFNjYXBlLgorCSAqICAtIE1vZGlmeSB0aGUgZm9sbG93aW5nIGxpc3QgdG8gdXNlIHRoZSB2YWx1ZXMgcHJpbnRlZCBkdXJpbmcgYm9vdC4KKwkgKiAgICBVbmRlZmluZSB0aGUgU1NDQVBFX0RFQlVHMQorCSAqLworI2RlZmluZSBTU0NBUEVfUkVHUyB7IFwKKy8qIEkwICovCTB4MDAsIFwKKy8qIEkxICovCTB4ZjAsIC8qIE5vdGUhIElnbm9yZWQuIFNldCBhbHdheXMgdG8gMHhmMCAqLyBcCisvKiBJMiAqLwkweDIwLCAvKiBOb3RlISBJZ25vcmVkLiBTZXQgYWx3YXlzIHRvIDB4MjAgKi8gXAorLyogSTMgKi8JMHgyMCwgLyogTm90ZSEgSWdub3JlZC4gU2V0IGFsd2F5cyB0byAweDIwICovIFwKKy8qIEk0ICovCTB4ZjUsIC8qIElnbm9yZWQgKi8gXAorLyogSTUgKi8JMHgxMCwgXAorLyogSTYgKi8JMHgwMCwgXAorLyogSTcgKi8JMHgyZSwgLyogSTcgTUVNIGNvbmZpZyBBLiBMaWtlbHkgdG8gdmFyeSBiZXR3ZWVuIG1vZGVscyAqLyBcCisvKiBJOCAqLwkweDAwLCAvKiBJOCBNRU0gY29uZmlnIEIuIExpa2VseSB0byB2YXJ5IGJldHdlZW4gbW9kZWxzICovIFwKKy8qIEk5ICovCTB4NDAgLyogSWdub3JlZCAqLyBcCisJfQorI2VuZGlmCisKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVnc1sxMF0gPSBTU0NBUEVfUkVHUzsKKworCWludCBpLCBpcnFfYml0cyA9IDB4ZmY7CisKKwlpZiAob2xkX2hhcmR3YXJlKQorCXsKKwkJdmFsaWRfaW50ZXJydXB0cyA9IHZhbGlkX2ludGVycnVwdHNfb2xkOworCQljb25mX3ByaW50ZigiRW5zb25pcSBTb3VuZFNjYXBlIChvbGQpIiwgaHdfY29uZmlnKTsKKwl9CisJZWxzZQorCQljb25mX3ByaW50ZigiRW5zb25pcSBTb3VuZFNjYXBlIiwgaHdfY29uZmlnKTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlpZiAoaHdfY29uZmlnLT5pcnEgPT0gdmFsaWRfaW50ZXJydXB0c1tpXSkKKwkJeworCQkJaXJxX2JpdHMgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGh3X2NvbmZpZy0+aXJxID4gMTUgfHwgKHJlZ3NbNF0gPSBpcnFfYml0cyA9PSAweGZmKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBJUlElZFxuIiwgaHdfY29uZmlnLT5pcnEpOworCQlyZWxlYXNlX3JlZ2lvbihkZXZjLT5iYXNlLCAyKTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSArIDIsIDYpOworCQlpZiAoc3NjYXBlX2lzX3BucCkKKwkJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmNvZGVjLCAyKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIXNzY2FwZV9pc19wbnApIHsKKwkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQkvKiBIb3N0IGludGVycnVwdCBlbmFibGUgKi8KKwkJc3NjYXBlX3dyaXRlKGRldmMsIDEsIDB4ZjApOwkvKiBBbGwgaW50ZXJydXB0cyBlbmFibGVkICovCisJCS8qIERNQSBBIHN0YXR1cy90cmlnZ2VyIHJlZ2lzdGVyICovCisJCXNzY2FwZV93cml0ZShkZXZjLCAyLCAweDIwKTsJLyogRE1BIGNoYW5uZWwgZGlzYWJsZWQgKi8KKwkJLyogRE1BIEIgc3RhdHVzL3RyaWdnZXIgcmVnaXN0ZXIgKi8KKwkJc3NjYXBlX3dyaXRlKGRldmMsIDMsIDB4MjApOwkvKiBETUEgY2hhbm5lbCBkaXNhYmxlZCAqLworCQkvKiBIb3N0IGludGVycnVwdCBjb25maWcgcmVnICovCisJCXNzY2FwZV93cml0ZShkZXZjLCA0LCAweGYwIHwgKGlycV9iaXRzIDw8IDIpIHwgaXJxX2JpdHMpOworCQkvKiBEb24ndCBkZXN0cm95IENELVJPTSBETUEgY29uZmlnIGJpdHMgKDB4YzApICovCisJCXNzY2FwZV93cml0ZShkZXZjLCA1LCAocmVnc1s1XSAmIDB4M2YpIHwgKHNzY2FwZV9yZWFkKGRldmMsIDUpICYgMHhjMCkpOworCQkvKiBDRC1ST00gY29uZmlnIChXU1MgY29kZWMgYWN0dWFsbHkpICovCisJCXNzY2FwZV93cml0ZShkZXZjLCA2LCByZWdzWzZdKTsKKwkJc3NjYXBlX3dyaXRlKGRldmMsIDcsIHJlZ3NbN10pOworCQlzc2NhcGVfd3JpdGUoZGV2YywgOCwgcmVnc1s4XSk7CisJCS8qIE1hc3RlciBjb250cm9sIHJlZy4gRG9uJ3QgbW9kaWZ5IENSLVJPTSBiaXRzLiBEaXNhYmxlIFNCIGVtdWwgKi8KKwkJc3NjYXBlX3dyaXRlKGRldmMsIDksIChzc2NhcGVfcmVhZChkZXZjLCA5KSAmIDB4ZjApIHwgMHgwOCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCX0KKyNpZmRlZiBTU0NBUEVfREVCVUcyCisJLyoKKwkgKiBUZW1wb3JhcnkgZGVidWdnaW5nIGFpZC4gUHJpbnQgY29udGVudHMgb2YgdGhlIHJlZ2lzdGVycyBhZnRlcgorCSAqIGNoYW5naW5nIHRoZW0uCisJICovCisJeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykKKwkJCXByaW50aygiSSVkID0gJTAyeCAobmV3IHZhbHVlKVxuIiwgaSwgc3NjYXBlX3JlYWQoZGV2YywgaSkpOworCX0KKyNlbmRpZgorCisJaWYgKHByb2JlX21wdTQwMShod19jb25maWcsIHNzY2FwZV9wb3J0cykpCisJCWh3X2NvbmZpZy0+YWx3YXlzX2RldGVjdCA9IDE7CisJaHdfY29uZmlnLT5uYW1lID0gIlNvdW5kU2NhcGUiOworCisJaHdfY29uZmlnLT5pcnEgKj0gLTE7CS8qIE5lZ2F0aXZlIHZhbHVlIHNpZ25hbHMgSVJRIHNoYXJpbmcgKi8KKwlhdHRhY2hfbXB1NDAxKGh3X2NvbmZpZywgVEhJU19NT0RVTEUpOworCWh3X2NvbmZpZy0+aXJxICo9IC0xOwkvKiBSZXN0b3JlIGl0ICovCisKKwlpZiAoaHdfY29uZmlnLT5zbG90c1sxXSAhPSAtMSkJLyogVGhlIE1QVSBkcml2ZXIgaW5zdGFsbGVkIGl0c2VsZiAqLworCXsKKwkJc3NjYXBlX21pZGlkZXYgPSBod19jb25maWctPnNsb3RzWzFdOworCQltaWRpX2RldnNbaHdfY29uZmlnLT5zbG90c1sxXV0tPmNvcHJvYyA9ICZzc2NhcGVfY29wcm9jX29wZXJhdGlvbnM7CisJfQorCXNzY2FwZV93cml0ZShkZXZjLCBHQV9JTlRFTkFfUkVHLCAweDgwKTsJLyogTWFzdGVyIElSUSBlbmFibGUgKi8KKwlkZXZjLT5vayA9IDE7CisJZGV2Yy0+ZmFpbGVkID0gMDsKK30KKworc3RhdGljIGludCBkZXRlY3RfZ2Eoc3NjYXBlX2luZm8gKiBkZXZjKQoreworCXVuc2lnbmVkIGNoYXIgc2F2ZTsKKworCUREQihwcmludGsoIkVudGVyZWQgU291bmRzY2FwZSBkZXRlY3RfZ2EoJXgpXG4iLCBkZXZjLT5iYXNlKSk7CisKKwkvKgorCSAqIEZpcnN0IGNoZWNrIHRoYXQgdGhlIGFkZHJlc3MgcmVnaXN0ZXIgb2YgIk9ESUUiIGlzCisJICogdGhlcmUgYW5kIHRoYXQgaXQgaGFzIGV4YWN0bHkgNCB3cml0YWJsZSBiaXRzLgorCSAqIEZpcnN0IDQgYml0cworCSAqLworCQorCWlmICgoc2F2ZSA9IGluYihQT1JUKE9ESUVfQUREUikpKSAmIDB4ZjApCisJeworCQlEREIocHJpbnRrKCJzb3VuZHNjYXBlOiBEZXRlY3QgZXJyb3IgQVxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0YigoMHgwMCksIFBPUlQoT0RJRV9BRERSKSk7CisJaWYgKGluYihQT1JUKE9ESUVfQUREUikpICE9IDB4MDApCisJeworCQlEREIocHJpbnRrKCJzb3VuZHNjYXBlOiBEZXRlY3QgZXJyb3IgQlxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0YigoMHhmZiksIFBPUlQoT0RJRV9BRERSKSk7CisJaWYgKGluYihQT1JUKE9ESUVfQUREUikpICE9IDB4MGYpCisJeworCQlEREIocHJpbnRrKCJzb3VuZHNjYXBlOiBEZXRlY3QgZXJyb3IgQ1xuIikpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0Yigoc2F2ZSksIFBPUlQoT0RJRV9BRERSKSk7CisKKwkvKgorCSAqIE5vdyB2ZXJpZnkgdGhhdCBzb21lIGluZGlyZWN0IHJlZ2lzdGVycyByZXR1cm4gemVybyBvbiBzb21lIGJpdHMuCisJICogVGhpcyBtYXkgYnJlYWsgdGhlIGRyaXZlciB3aXRoIHNvbWUgZnV0dXJlIHJldmlzaW9ucyBvZiAiT0RJRSIgYnV0Li4uCisJICovCisKKwlpZiAoc3NjYXBlX3JlYWQoZGV2YywgMCkgJiAweDBjKQorCXsKKwkJRERCKHByaW50aygic291bmRzY2FwZTogRGV0ZWN0IGVycm9yIEQgKCV4KVxuIiwgc3NjYXBlX3JlYWQoZGV2YywgMCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzc2NhcGVfcmVhZChkZXZjLCAxKSAmIDB4MGYpCisJeworCQlEREIocHJpbnRrKCJzb3VuZHNjYXBlOiBEZXRlY3QgZXJyb3IgRVxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHNzY2FwZV9yZWFkKGRldmMsIDUpICYgMHgwZikKKwl7CisJCUREQihwcmludGsoInNvdW5kc2NhcGU6IERldGVjdCBlcnJvciBGXG4iKSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljCWludCBzc2NhcGVfcmVhZF9ob3N0X2N0cmwoc3NjYXBlX2luZm8qIGRldmMpCit7CisJcmV0dXJuIGhvc3RfcmVhZChkZXZjKTsKK30KKworc3RhdGljCXZvaWQgc3NjYXBlX3dyaXRlX2hvc3RfY3RybDIoc3NjYXBlX2luZm8gKmRldmMsIGludCBhLCBpbnQgYikKK3sKKwlob3N0X2NvbW1hbmQyKGRldmMsIGEsIGIpOworfQorCitzdGF0aWMgaW50IHNzY2FwZV9hbGxvY19kbWEoc3NjYXBlX2luZm8gKmRldmMpCit7CisJY2hhciAqc3RhcnRfYWRkciwgKmVuZF9hZGRyOworCWludCBkbWFfcGFnZXNpemU7CisJaW50IHN6LCBzaXplOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKGRldmMtPnJhd19idWYgIT0gTlVMTCkgcmV0dXJuIDA7CS8qIEFscmVhZHkgZG9uZSAqLworCWRtYV9wYWdlc2l6ZSA9IChkZXZjLT5kbWEgPCA0KSA/ICg2NCAqIDEwMjQpIDogKDEyOCAqIDEwMjQpOworCWRldmMtPnJhd19idWYgPSBOVUxMOworCWRldmMtPmJ1ZmZzaXplID0gODE5Mio0OworCWlmIChkZXZjLT5idWZmc2l6ZSA+IGRtYV9wYWdlc2l6ZSkgZGV2Yy0+YnVmZnNpemUgPSBkbWFfcGFnZXNpemU7CisJc3RhcnRfYWRkciA9IE5VTEw7CisJLyoKKwkgKiBOb3cgbG9vcCB1bnRpbCB3ZSBnZXQgYSBmcmVlIGJ1ZmZlci4gVHJ5IHRvIGdldCBzbWFsbGVyIGJ1ZmZlciBpZgorCSAqIGl0IGZhaWxzLiBEb24ndCBhY2NlcHQgc21hbGxlciB0aGFuIDhrIGJ1ZmZlciBmb3IgcGVyZm9ybWFuY2UKKwkgKiByZWFzb25zLgorCSAqLworCXdoaWxlIChzdGFydF9hZGRyID09IE5VTEwgJiYgZGV2Yy0+YnVmZnNpemUgPiBQQUdFX1NJWkUpIHsKKwkJZm9yIChzeiA9IDAsIHNpemUgPSBQQUdFX1NJWkU7IHNpemUgPCBkZXZjLT5idWZmc2l6ZTsgc3orKywgc2l6ZSA8PD0gMSk7CisJCWRldmMtPmJ1ZmZzaXplID0gUEFHRV9TSVpFICogKDEgPDwgc3opOworCQlzdGFydF9hZGRyID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDfEdGUF9ETUEsIHN6KTsKKwkJaWYgKHN0YXJ0X2FkZHIgPT0gTlVMTCkgZGV2Yy0+YnVmZnNpemUgLz0gMjsKKwl9CisKKwlpZiAoc3RhcnRfYWRkciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3NjYXBlIHBucCBpbml0IGVycm9yOiBDb3VsZG4ndCBhbGxvY2F0ZSBETUEgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogbWFrZSBzb21lIGNoZWNrcyAqLworCQllbmRfYWRkciA9IHN0YXJ0X2FkZHIgKyBkZXZjLT5idWZmc2l6ZSAtIDE7CQkKKwkJLyogbm93IGNoZWNrIGlmIGl0IGZpdHMgaW50byB0aGUgc2FtZSBkbWEtcGFnZXNpemUgKi8KKworCQlpZiAoKChsb25nKSBzdGFydF9hZGRyICYgfihkbWFfcGFnZXNpemUgLSAxKSkgIT0gKChsb25nKSBlbmRfYWRkciAmIH4oZG1hX3BhZ2VzaXplIC0gMSkpCisJCSAgICB8fCBlbmRfYWRkciA+PSAoY2hhciAqKSAoTUFYX0RNQV9BRERSRVNTKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzc2NhcGUgcG5wOiBHb3QgaW52YWxpZCBhZGRyZXNzIDB4JWx4IGZvciAlZGIgRE1BLWJ1ZmZlclxuIiwgKGxvbmcpIHN0YXJ0X2FkZHIsIGRldmMtPmJ1ZmZzaXplKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWRldmMtPnJhd19idWYgPSBzdGFydF9hZGRyOworCWRldmMtPnJhd19idWZfcGh5cyA9IHZpcnRfdG9fYnVzKHN0YXJ0X2FkZHIpOworCisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHN0YXJ0X2FkZHIpOyBwYWdlIDw9IHZpcnRfdG9fcGFnZShlbmRfYWRkcik7IHBhZ2UrKykKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzc2NhcGVfZnJlZV9kbWEoc3NjYXBlX2luZm8gKmRldmMpCit7CisJaW50IHN6LCBzaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgZW5kX2FkZHI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoZGV2Yy0+cmF3X2J1ZiA9PSBOVUxMKSByZXR1cm47CisJZm9yIChzeiA9IDAsIHNpemUgPSBQQUdFX1NJWkU7IHNpemUgPCBkZXZjLT5idWZmc2l6ZTsgc3orKywgc2l6ZSA8PD0gMSk7CisJc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBkZXZjLT5yYXdfYnVmOworCWVuZF9hZGRyID0gc3RhcnRfYWRkciArIGRldmMtPmJ1ZmZzaXplOworCisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHN0YXJ0X2FkZHIpOyBwYWdlIDw9IHZpcnRfdG9fcGFnZShlbmRfYWRkcik7IHBhZ2UrKykKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBkZXZjLT5yYXdfYnVmLCBzeik7CisJZGV2Yy0+cmF3X2J1ZiA9IE5VTEw7Cit9CisKKy8qIEludGVsIHZlcnNpb24gISEhISEhISEhICovCisKK3N0YXRpYyBpbnQgc3NjYXBlX3N0YXJ0X2RtYShpbnQgY2hhbiwgdW5zaWduZWQgbG9uZyBwaHlzYWRkciwgaW50IGNvdW50LCBpbnQgZG1hX21vZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShjaGFuKTsKKwljbGVhcl9kbWFfZmYoY2hhbik7CisJc2V0X2RtYV9tb2RlKGNoYW4sIGRtYV9tb2RlKTsKKwlzZXRfZG1hX2FkZHIoY2hhbiwgcGh5c2FkZHIpOworCXNldF9kbWFfY291bnQoY2hhbiwgY291bnQpOworCWVuYWJsZV9kbWEoY2hhbik7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNzY2FwZV9wbnBfc3RhcnRfZG1hKHNzY2FwZV9pbmZvKiBkZXZjLCBpbnQgYXJnICkKK3sKKwlpbnQgcmVnOworCWlmIChhcmcgPT0gMCkgcmVnID0gMjsKKwllbHNlIHJlZyA9IDM7CisKKwlzc2NhcGVfd3JpdGUoZGV2YywgcmVnLCBzc2NhcGVfcmVhZCggZGV2YywgcmVnKSB8IDB4MDEpOworCXNzY2FwZV93cml0ZShkZXZjLCByZWcsIHNzY2FwZV9yZWFkKCBkZXZjLCByZWcpICYgMHhGRSk7Cit9CisKK3N0YXRpYyBpbnQgc3NjYXBlX3BucF93YWl0X2RtYSAoc3NjYXBlX2luZm8qIGRldmMsIGludCBhcmcgKQoreworCWludAkJcmVnOworCXVuc2lnbmVkIGxvbmcJaTsKKwl1bnNpZ25lZCBjaGFyCWQ7CisKKwlpZiAoYXJnID09IDApIHJlZyA9IDI7CisJZWxzZSByZWcgPSAzOworCisJc2xlZXAgKCAxICk7CisJaSA9IDA7CisJZG8geworCQlkID0gc3NjYXBlX3JlYWQoZGV2YywgcmVnKSAmIDE7CisJCWlmICggZCA9PSAxKSAgYnJlYWs7CisJCWkrKzsKKwl9IHdoaWxlIChpIDwgNTAwMDAwKTsKKwlkID0gc3NjYXBlX3JlYWQoZGV2YywgcmVnKSAmIDE7IAorCXJldHVybiBkOworfQorCitzdGF0aWMJaW50CXNzY2FwZV9wbnBfYWxsb2NfZG1hKHNzY2FwZV9pbmZvKiBkZXZjKQoreworCS8qIHByaW50ayhLRVJOX0lORk8gInNzY2FwZTogcmVxdWVzdGluZyBkbWFcbiIpOyAqLworCWlmIChyZXF1ZXN0X2RtYShkZXZjIC0+IGRtYSwgInNzY2FwZSIpKSByZXR1cm4gMDsKKwkvKiBwcmludGsoS0VSTl9JTkZPICJzc2NhcGU6IGRtYSBjaGFubmVsIGFsbG9jYXRlZFxuIik7ICovCisJaWYgKCFzc2NhcGVfYWxsb2NfZG1hKGRldmMpKSB7CisJCWZyZWVfZG1hKGRldmMgLT4gZG1hKTsKKwkJcmV0dXJuIDA7CisJfTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljCXZvaWQJc3NjYXBlX3BucF9mcmVlX2RtYShzc2NhcGVfaW5mbyogZGV2YykKK3sKKwlzc2NhcGVfZnJlZV9kbWEoIGRldmMpOworCWZyZWVfZG1hKGRldmMgLT4gZG1hICk7CQorCS8qIHByaW50ayhLRVJOX0lORk8gInNzY2FwZTogZG1hIHJlbGVhc2VkXG4iKTsgKi8KK30KKworc3RhdGljCWludAlzc2NhcGVfcG5wX3VwbG9hZF9maWxlKHNzY2FwZV9pbmZvKiBkZXZjLCBjaGFyKiBmbikKK3sJCisJaW50CSAgICAgCWRvbmUgPSAwOworCWludAkgICAgIAl0aW1lb3V0X3ZhbDsKKwljaGFyKgkgICAgIAlkYXRhLCpkdDsKKwlpbnQJICAgICAJbGVuLGw7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNzY2FwZV93cml0ZSggZGV2YywgOSwgc3NjYXBlX3JlYWQoZGV2YywgOSApICAmIDB4M0YgKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDIsIChkZXZjIC0+IGRtYSA8PCA0KSB8IDB4ODAgKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDMsIDB4MjAgKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDksIHNzY2FwZV9yZWFkKCBkZXZjLCA5ICkgIHwgMHg4MCApOworCQorCWxlbiA9IG1vZF9maXJtd2FyZV9sb2FkKGZuLCAmZGF0YSk7CisJaWYgKGxlbiA9PSAwKSB7CisJCSAgICBwcmludGsoS0VSTl9FUlIgInNzY2FwZTogZmlsZSBub3QgZm91bmQ6ICVzXG4iLCBmbik7CisJCSAgICByZXR1cm4gMDsKKwl9CisJZHQgPSBkYXRhOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwl3aGlsZSAoIGxlbiA+IDAgKSB7CisJCWlmIChsZW4gPiBkZXZjIC0+IGJ1ZmZzaXplKSBsID0gZGV2Yy0+YnVmZnNpemU7CisJCWVsc2UgbCA9IGxlbjsKKwkJbGVuIC09IGw7CQkKKwkJbWVtY3B5KGRldmMtPnJhd19idWYsIGR0LCBsKTsgZHQgKz0gbDsKKwkJc3NjYXBlX3N0YXJ0X2RtYShkZXZjLT5kbWEsIGRldmMtPnJhd19idWZfcGh5cywgbCwgMHg0OCk7CisJCXNzY2FwZV9wbnBfc3RhcnRfZG1hICggZGV2YywgMCApOworCQlpZiAoc3NjYXBlX3BucF93YWl0X2RtYSAoIGRldmMsIDAgKSA9PSAwKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCXZmcmVlKGRhdGEpOworCQorCW91dGIoMCwgZGV2YyAtPiBiYXNlICsgMik7CisJb3V0YigwLCBkZXZjIC0+IGJhc2UpOworCisJc3NjYXBlX3dyaXRlICggZGV2YywgOSwgc3NjYXBlX3JlYWQoIGRldmMsIDkgKSB8IDB4NDApOworCisJdGltZW91dF92YWwgPSA1ICogSFo7IAorCXdoaWxlICghZG9uZSAmJiB0aW1lb3V0X3ZhbC0tID4gMCkKKwl7CisJCXVuc2lnbmVkIGNoYXIgeDsKKwkJc2xlZXAoMSk7CisJCXggPSBpbmIoIGRldmMgLT4gYmFzZSArIDMpOworCQlpZiAoeCA9PSAweGZmIHx8IHggPT0gMHhmZSkJCS8qIE9CUCBzdGFydHVwIGFja25vd2xlZGdlICovCisJCXsKKwkJCS8vcHJpbnRrKEtFUk5fRVJSICJTb3VuZHNjYXBlOiBBY2tub3dsZWRnZSA9ICV4XG4iLCB4KTsKKwkJCWRvbmUgPSAxOworCQl9CisJfQorCXRpbWVvdXRfdmFsID0gNSAqIEhaOworCWRvbmUgPSAwOworCXdoaWxlICghZG9uZSAmJiB0aW1lb3V0X3ZhbC0tID4gMCkKKwl7CisJCXVuc2lnbmVkIGNoYXIgeDsKKwkJc2xlZXAoMSk7CisJCXggPSBpbmIoIGRldmMgLT4gYmFzZSArIDMpOworCQlpZiAoeCA9PSAweGZlKQkJLyogT0JQIHN0YXJ0dXAgYWNrbm93bGVkZ2UgKi8KKwkJeworCQkJLy9wcmludGsoS0VSTl9FUlIgIlNvdW5kc2NhcGU6IEFja25vd2xlZGdlID0gJXhcbiIsIHgpOworCQkJZG9uZSA9IDE7CisJCX0KKwl9CisKKwlpZiAoICFkb25lICkgcHJpbnRrKEtFUk5fRVJSICJzb3VuZHNjYXBlOiBPQlAgSW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDIsIGRldmMtPmljX3R5cGUgPT0gSUNfT0RJRSA/IDB4NzAgOiAweDQwKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDMsIChkZXZjIC0+IGRtYSA8PCA0KSArIDB4ODApOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc3NjYXBlX3BucF9pbml0X2h3KHNzY2FwZV9pbmZvKiBkZXZjKQorewkKKwl1bnNpZ25lZCBjaGFyIG1pZGlfaXJxID0gMCwgc2JfaXJxID0gMDsKKwl1bnNpZ25lZCBpOworCXN0YXRpYwljaGFyIGNvZGVfZmlsZV9uYW1lWzIzXSA9ICIvc25kc2NhcGUvc25kc2NhcGUuY294IjsKKwkKKwlpbnQgc3NjYXBlX3NiX2VuYWJsZQkJPSAwOworCWludCBzc2NhcGVfam95c3RpY19lbmFibGUJPSAweDdmOworCWludCBzc2NhcGVfbWljX2VuYWJsZQkJPSAwOworCWludCBzc2NhcGVfZXh0X21pZGkJCT0gMDsJCQorCisJaWYgKCAhc3NjYXBlX3BucF9hbGxvY19kbWEoZGV2YykgKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3NjYXBlOiBmYWlsZCB0byBhbGxvY2F0ZSBkbWFcbiIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAoIGRldmMgLT4gaXJxICAgPT0gdmFsaWRfaW50ZXJydXB0c1tpXSApIAorCQkJbWlkaV9pcnEgPSBpOworCQlpZiAoIGRldmMgLT4gY29kZWNfaXJxID09IHZhbGlkX2ludGVycnVwdHNbaV0gKSAKKwkJCXNiX2lycSA9IGk7CisJfQorCisJc3NjYXBlX3dyaXRlKCBkZXZjLCA1LCAweDUwKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDcsIDB4MmUpOworCXNzY2FwZV93cml0ZSggZGV2YywgOCwgMHgwMCk7CisKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDIsIGRldmMtPmljX3R5cGUgPT0gSUNfT0RJRSA/IDB4NzAgOiAweDQwKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDMsICggZGV2YyAtPiBkbWEgPDwgNCkgfCAweDgwKTsKKworCWlmICggc3NjYXBlX3NiX2VuYWJsZSApCisJCXNzY2FwZV93cml0ZSAoZGV2YywgNCwgMHhGMCB8IChzYl9pcnEgPDwgMikgfCBtaWRpX2lycSk7CisJZWxzZQkKKwkJc3NjYXBlX3dyaXRlIChkZXZjLCA0LCAweEYwIHwgKG1pZGlfaXJxPDwyKSB8IG1pZGlfaXJxKTsKKworCWkgPSAweDEwOyAvL3NzY2FwZV9yZWFkKGRldmMsIDkpICYgKGRldmMtPmljX3R5cGUgPT0gSUNfT0RJRSA/IDB4ZjAgOiAweGMwKTsKKwlpZiAoIHNzY2FwZV9zYl9lbmFibGUgKQorCQlpIHw9IGRldmMtPmljX3R5cGUgPT0gSUNfT0RJRSA/IDB4MDUgOiAweDA3OwkgICAgCisJaWYgKHNzY2FwZV9qb3lzdGljX2VuYWJsZSkgaSB8PSA4OworCQorCXNzY2FwZV93cml0ZSAoZGV2YywgOSwgaSk7CisJc3NjYXBlX3dyaXRlIChkZXZjLCA2LCAweDgwKTsKKwlzc2NhcGVfd3JpdGUgKGRldmMsIDEsIDB4ODApOworCisJaWYgKGRldmMgLT4gY29kZWNfdHlwZSA9PSAyKSB7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMoIGRldmMsIDB4MEMsIDB4NTApOworCQlzc2NhcGVfcG5wX3dyaXRlX2NvZGVjKCBkZXZjLCAweDEwLCBzc2NhcGVfcG5wX3JlYWRfY29kZWMoIGRldmMsIDB4MTApICYgMHgzRik7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMoIGRldmMsIDB4MTEsIHNzY2FwZV9wbnBfcmVhZF9jb2RlYyggZGV2YywgMHgxMSkgfCAweEMwKTsKKwkJc3NjYXBlX3BucF93cml0ZV9jb2RlYyggZGV2YywgMjksIDB4MjApOworCX0KKworCWlmIChzc2NhcGVfcG5wX3VwbG9hZF9maWxlKGRldmMsICIvc25kc2NhcGUvc2NvcGUuY29kIikgPT0gMCApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzc2NhcGU6IGZhaWxkIHRvIHVwbG9hZCBmaWxlIC9zbmRzY2FwZS9zY29wZS5jb2RcbiIpOworCQlzc2NhcGVfcG5wX2ZyZWVfZG1hKGRldmMpOworCQlyZXR1cm47CisJfQorCisJaSA9IHNzY2FwZV9yZWFkX2hvc3RfY3RybCggZGV2YyApOworCQorCWlmICggKGkgJiAweDBGKSA+ICA3ICkgeworCQlwcmludGsoS0VSTl9FUlIgInNzY2FwZTogc2NvcGUuY29kIGZhaWxkXG4iKTsKKwkJc3NjYXBlX3BucF9mcmVlX2RtYShkZXZjKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIGkgJiAweDEwICkgc3NjYXBlX3dyaXRlKCBkZXZjLCA3LCAweDJGKTsKKwljb2RlX2ZpbGVfbmFtZVsyMV0gPSAoY2hhcikgKCBpICYgMHgwRikgKyAweDMwOworCWlmIChzc2NhcGVfcG5wX3VwbG9hZF9maWxlKCBkZXZjLCBjb2RlX2ZpbGVfbmFtZSkgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInNzY2FwZTogZmFpbGQgdG8gdXBsb2FkIGZpbGUgJXNcbiIsIGNvZGVfZmlsZV9uYW1lKTsKKwkJc3NjYXBlX3BucF9mcmVlX2RtYShkZXZjKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoZGV2Yy0+aWNfdHlwZSAhPSBJQ19PRElFKSB7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMoIGRldmMsIDEwLCAoc3NjYXBlX3BucF9yZWFkX2NvZGVjKGRldmMsIDEwKSAmIDB4N2YpIHwKKwkJICggc3NjYXBlX21pY19lbmFibGUgPT0gMCA/IDB4MDAgOiAweDgwKSApOworCX0KKwlzc2NhcGVfd3JpdGVfaG9zdF9jdHJsMiggZGV2YywgMHg4NCwgMHg2NCApOyAgLyogTUlESSB2b2x1bWUgKi8KKwlzc2NhcGVfd3JpdGVfaG9zdF9jdHJsMiggZGV2YywgMHg4NiwgMHg2NCApOyAgLyogTUlESSB2b2x1bWU/PyAqLworCXNzY2FwZV93cml0ZV9ob3N0X2N0cmwyKCBkZXZjLCAweDhBLCBzc2NhcGVfZXh0X21pZGkpOworCisJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDYsIDB4M2YgKTsgLy9XQVZfVk9MCisJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDcsIDB4M2YgKTsgLy9XQVZfVk9MCisJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDIsIDB4MUYgKTsgLy9XRF9DRFhWT0xMCisJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDMsIDB4MUYgKTsgLy9XRF9DRFhWT0xSCisKKwlpZiAoZGV2YyAtPiBjb2RlY190eXBlID09IDEpIHsKKwkJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDQsIDB4MUYgKTsKKwkJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDUsIDB4MUYgKTsKKwkJc3NjYXBlX3dyaXRlX2hvc3RfY3RybDIoIGRldmMsIDB4ODgsIHNzY2FwZV9taWNfZW5hYmxlKTsKKwl9IGVsc2UgeworCQlpbnQgdDsKKwkJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDB4MTAsIDB4MUYgPDwgMSk7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMgKCBkZXZjLCAweDExLCAweEMwIHwgKDB4MUYgPDwgMSkpOworCisJCXQgPSBzc2NhcGVfcG5wX3JlYWRfY29kZWMoIGRldmMsIDB4MDApICYgMHhERjsKKwkJaWYgKCAoc3NjYXBlX21pY19lbmFibGUgPT0gMCkpIHQgfD0gMDsKKwkJZWxzZSB0IHw9IDB4MjA7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMgKCBkZXZjLCAweDAwLCB0KTsKKwkJdCA9IHNzY2FwZV9wbnBfcmVhZF9jb2RlYyggZGV2YywgMHgwMSkgJiAweERGOworCQlpZiAoIChzc2NhcGVfbWljX2VuYWJsZSA9PSAwKSApIHQgfD0gMDsKKwkJZWxzZSB0IHw9IDB4MjA7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMgKCBkZXZjLCAweDAxLCB0KTsKKwkJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDB4NDAgfCAyOSAsIDB4MjApOworCQlvdXRiKDAsIGRldmMgLT4gY29kZWMpOworCX0KKwlpZiAoZGV2YyAtPiBpY190eXBlID09IElDX09QVVMgKSB7CisJCWludCBpID0gc3NjYXBlX3JlYWQoIGRldmMsIDkgKTsKKwkJc3NjYXBlX3dyaXRlKCBkZXZjLCA5LCBpIHwgMyApOworCQlzc2NhcGVfd3JpdGUoIGRldmMsIDMsIDB4NDApOworCisJCWlmIChyZXF1ZXN0X3JlZ2lvbigweDIyOCwgMSwgInNzY2FwZSBzZXR1cCBqdW5rIikpIHsKKwkJCW91dGIoMCwgMHgyMjgpOworCQkJcmVsZWFzZV9yZWdpb24oMHgyMjgsMSk7CisJCX0KKwkJc3NjYXBlX3dyaXRlKCBkZXZjLCAzLCAoZGV2YyAtPiBkbWEgPDwgNCkgfCAweDgwKTsKKwkJc3NjYXBlX3dyaXRlKCBkZXZjLCA5LCBpICk7CisJfQorCQorCWhvc3RfY2xvc2UgKCBkZXZjICk7CisJc3NjYXBlX3BucF9mcmVlX2RtYShkZXZjKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZGV0ZWN0X3NzY2FwZV9wbnAoc3NjYXBlX2luZm8qIGRldmMpCit7CisJbG9uZwkgaSwgaXJxX2JpdHMgPSAweGZmOworCXVuc2lnbmVkIGludCBkOworCisJRERCKHByaW50aygiRW50ZXJlZCBkZXRlY3Rfc3NjYXBlX3BucCgleClcbiIsIGRldmMtPmJhc2UpKTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oZGV2Yy0+Y29kZWMsIDIsICJzc2NhcGUgY29kZWMiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImRldGVjdF9zc2NhcGVfcG5wOiBwb3J0ICV4IGlzIG5vdCBmcmVlXG4iLCBkZXZjLT5jb2RlYyk7CQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGluYihkZXZjLT5iYXNlICsgMikgJiAweDc4KSAhPSAwKQorCQlnb3RvIGZhaWw7CisKKwlkID0gaW5iICggZGV2YyAtPiBiYXNlICsgNCkgJiAweEYwOworCWlmIChkICYgMHg4MCkKKwkJZ290byBmYWlsOworCQorCWlmIChkID09IDApIHsKKwkJZGV2Yy0+Y29kZWNfdHlwZSA9IDE7CisJCWRldmMtPmljX3R5cGUgPSBJQ19PRElFOworCX0gZWxzZSBpZiAoIChkICYgMHg2MCkgIT0gMCkgeworCQlkZXZjLT5jb2RlY190eXBlID0gMjsKKwkJZGV2Yy0+aWNfdHlwZSA9IElDX09QVVM7CisJfSBlbHNlIGlmICggKGQgJiAweDQwKSAhPSAwKSB7CS8qIFdURj8gKi8KKwkJZGV2Yy0+Y29kZWNfdHlwZSA9IDI7CisJCWRldmMtPmljX3R5cGUgPSBJQ19PRElFOworCX0gZWxzZQorCQlnb3RvIGZhaWw7CisJCisJc3NjYXBlX2lzX3BucCA9IDE7CisJCQorCW91dGIoMHhGQSwgZGV2YyAtPiBiYXNlKzQpOworCWlmICAoKGluYiggZGV2YyAtPiBiYXNlKzQpICYgMHg5RikgIT0gMHgwQSkKKwkJZ290byBmYWlsOworCW91dGIoMHhGRSwgZGV2YyAtPiBiYXNlKzQpOworCWlmICAoIChpbmIoZGV2YyAtPiBiYXNlKzQpICYgMHg5RikgIT0gMHgwRSkKKwkJZ290byBmYWlsOworCWlmICAoIChpbmIoZGV2YyAtPiBiYXNlKzUpICYgMHg5RikgIT0gMHgwRSkKKwkJZ290byBmYWlsOworCisJaWYgKGRldmMtPmNvZGVjX3R5cGUgPT0gMikgeworCQlpZiAoZGV2Yy0+Y29kZWMgIT0gZGV2Yy0+YmFzZSArIDgpIHsKKwkJCXByaW50aygic291bmRzY2FwZSB3YXJuaW5nOiBpbmNvcnJlY3QgY29kZWMgcG9ydCBzcGVjaWZpZWRcbiIpOworCQkJZ290byBmYWlsOworCQl9CisJCWQgPSAweDEwIHwgKHNzY2FwZV9yZWFkKGRldmMsIDkpICAmIDB4Q0YpOworCQlzc2NhcGVfd3JpdGUoZGV2YywgOSwgZCk7CisJCXNzY2FwZV93cml0ZShkZXZjLCA2LCAweDgwKTsKKwl9IGVsc2UgeworCQkvL3RvZG86IGNoZWNrIGNvZGVjIGlzIG5vdCBiYXNlICsgOAorCX0KKworCWQgID0gKHNzY2FwZV9yZWFkKGRldmMsIDkpICYgMHgzRikgfCAweEMwOworCXNzY2FwZV93cml0ZShkZXZjLCA5LCBkKTsKKworCWZvciAoaSA9IDA7IGkgPCA1NTAwMDA7IGkrKykKKwkJaWYgKCAhKGluYihkZXZjIC0+IGNvZGVjKSAmIDB4ODApICkgYnJlYWs7CisKKwlkID0gaW5iKGRldmMgLT4gY29kZWMpOworCWlmIChkICYgMHg4MCkKKwkJZ290byBmYWlsOworCWlmICggaW5iKGRldmMgLT4gY29kZWMgKyAyKSA9PSAweEZGKQorCQlnb3RvIGZhaWw7CisKKwlzc2NhcGVfd3JpdGUoZGV2YywgOSwgc3NjYXBlX3JlYWQoZGV2YywgOSkgICYgMHgzRiApOworCisJZCAgPSBpbmIoZGV2YyAtPiBjb2RlYykgJiAweDgwOworCWlmICggZCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNvdW5kc2NhcGU6IGhhcmR3YXJlIGRldGVjdGVkXG4iKTsKKwkJdmFsaWRfaW50ZXJydXB0cyA9IHZhbGlkX2ludGVycnVwdHNfbmV3OworCX0gZWxzZQl7CisJCXByaW50ayhLRVJOX0lORk8gInNvdW5kc2NhcGU6IGJvYXJkIGxvb2tzIGxpa2UgbWVkaWEgZnhcbiIpOworCQl2YWxpZF9pbnRlcnJ1cHRzID0gdmFsaWRfaW50ZXJydXB0c19vbGQ7CisJCW9sZF9oYXJkd2FyZSA9IDE7CisJfQorCisJc3NjYXBlX3dyaXRlKCBkZXZjLCA5LCAweEMwIHwgKHNzY2FwZV9yZWFkKGRldmMsIDkpICAmIDB4M0YpICk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTUwMDAwOyBpKyspCisJCWlmICggIShpbmIoZGV2YyAtPiBjb2RlYykgJiAweDgwKSkgCisJCQlicmVhazsKKwkJCisJc3NjYXBlX3BucF9pbml0X2h3KGRldmMpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCWlmIChkZXZjLT5jb2RlY19pcnEgPT0gdmFsaWRfaW50ZXJydXB0c1tpXSkgeworCQkJaXJxX2JpdHMgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CQorCXNzY2FwZV93cml0ZShkZXZjLCBHQV9JTlRFTkFfUkVHLCAweDAwKTsKKwlzc2NhcGVfd3JpdGUoZGV2YywgR0FfRE1BQ0ZHX1JFRywgMHg1MCk7CisJc3NjYXBlX3dyaXRlKGRldmMsIEdBX0RNQUFfUkVHLCAweDcwKTsKKwlzc2NhcGVfd3JpdGUoZGV2YywgR0FfRE1BQl9SRUcsIDB4MjApOworCXNzY2FwZV93cml0ZShkZXZjLCBHQV9JTlRDRkdfUkVHLCAweGYwKTsKKwlzc2NhcGVfd3JpdGUoZGV2YywgR0FfQ0RDRkdfUkVHLCAweDg5IHwgKGRldmMtPmRtYSA8PCA0KSB8IChpcnFfYml0cyA8PCAxKSk7CisKKwlzc2NhcGVfcG5wX3dyaXRlX2NvZGVjKCBkZXZjLCAwLCBzc2NhcGVfcG5wX3JlYWRfY29kZWMoIGRldmMsIDApIHwgMHgyMCk7CisJc3NjYXBlX3BucF93cml0ZV9jb2RlYyggZGV2YywgMCwgc3NjYXBlX3BucF9yZWFkX2NvZGVjKCBkZXZjLCAxKSB8IDB4MjApOworCisJcmV0dXJuIDE7CitmYWlsOgorCXJlbGVhc2VfcmVnaW9uKGRldmMtPmNvZGVjLCAyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfc3NjYXBlKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlkZXZjLT5iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCWRldmMtPmlycSA9IGh3X2NvbmZpZy0+aXJxOworCWRldmMtPmRtYSA9IGh3X2NvbmZpZy0+ZG1hOworCWRldmMtPm9zcCA9IGh3X2NvbmZpZy0+b3NwOworCisjaWZkZWYgU1NDQVBFX0RFQlVHMQorCS8qCisJICogVGVtcG9yYXJ5IGRlYnVnZ2luZyBhaWQuIFByaW50IGNvbnRlbnRzIG9mIHRoZSByZWdpc3RlcnMgYmVmb3JlCisJICogY2hhbmdpbmcgdGhlbS4KKwkgKi8KKwl7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorCQkJcHJpbnRrKCJJJWQgPSAlMDJ4IChvbGQgdmFsdWUpXG4iLCBpLCBzc2NhcGVfcmVhZChkZXZjLCBpKSk7CisJfQorI2VuZGlmCisJZGV2Yy0+ZmFpbGVkID0gMTsKKworCXNzY2FwZV9wb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGRldmMtPmJhc2UsIDIsICJtcHU0MDEiKTsKKwlpZiAoIXNzY2FwZV9wb3J0cykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldmMtPmJhc2UgKyAyLCA2LCAiU291bmRTY2FwZSIpKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRldGVjdF9nYShkZXZjKSkgeworCQlpZiAoZGV0ZWN0X3NzY2FwZV9wbnAoZGV2YykpCisJCQlyZXR1cm4gMTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSwgMik7CisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UgKyAyLCA2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9sZF9oYXJkd2FyZSkJLyogQ2hlY2sgdGhhdCBpdCdzIHJlYWxseSBhbiBvbGQgU3BlYS9SZXZlYWwgY2FyZC4gKi8KKwl7CisJCXVuc2lnbmVkIGNoYXIgICB0bXA7CisJCWludCAgICAgICAgICAgICBjYzsKKworCQlpZiAoISgodG1wID0gc3NjYXBlX3JlYWQoZGV2YywgR0FfSE1DVExfUkVHKSkgJiAweGMwKSkKKwkJeworCQkJc3NjYXBlX3dyaXRlKGRldmMsIEdBX0hNQ1RMX1JFRywgdG1wIHwgMHg4MCk7CisJCQlmb3IgKGNjID0gMDsgY2MgPCAyMDAwMDA7ICsrY2MpCisJCQkJaW5iKGRldmMtPmJhc2UgKyBPRElFX0FERFIpOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NzX21zX3NvdW5kKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgaSwgaXJxX2JpdHMgPSAweGZmOworCWludCBhZF9mbGFncyA9IDA7CisJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwkKKwlpZiAoZGV2Yy0+ZmFpbGVkKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZHNjYXBlOiBDYXJkIG5vdCBkZXRlY3RlZFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoZGV2Yy0+b2sgPT0gMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAic291bmRzY2FwZTogSW52YWxpZCBpbml0aWFsaXphdGlvbiBvcmRlci5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCWlmIChod19jb25maWctPmlycSA9PSB2YWxpZF9pbnRlcnJ1cHRzW2ldKQorCQl7CisJCQlpcnFfYml0cyA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaXJxX2JpdHMgPT0gMHhmZikgeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kc2NhcGU6IEludmFsaWQgTVNTIElSUSVkXG4iLCBod19jb25maWctPmlycSk7CisJCXJldHVybiAwOworCX0KKwkKKwlpZiAob2xkX2hhcmR3YXJlKQorCQlhZF9mbGFncyA9IDB4MTIzNDU2Nzc7CS8qIFRlbGwgdGhhdCB3ZSBtYXkgaGF2ZSBhIENTNDI0OCBjaGlwIChTcGVhLVY3IE1lZGlhIEZYKSAqLworCWVsc2UgaWYgKHNzY2FwZV9pc19wbnApCisJCWFkX2ZsYWdzID0gMHg4NzY1NDMyMTsgIC8qIFRlbGwgdGhhdCB3ZSBoYXZlIGEgc291bmRzY2FwZSBwbnAgd2l0aCAxODQ1IGNoaXAgKi8KKworCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0LCAiYWQxODQ4Iik7CisJaWYgKCFwb3J0cykgeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kc2NhcGU6IHBvcnRzIGJ1c3lcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFkMTg0OF9kZXRlY3QocG9ydHMsICZhZF9mbGFncywgaHdfY29uZmlnLT5vc3ApKSB7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCk7CisJCXJldHVybiAwOworCX0KKworIAlpZiAoIXNzY2FwZV9pc19wbnApICAvKnBucCBpcyBhbHJlYWR5IHNldHVwKi8KKyAJeworIAkJLyoKKyAgICAgCQkgKiBTZXR1cCB0aGUgRE1BIHBvbGFyaXR5LgorIAkgICAgCSAqLworIAkJc3NjYXBlX3dyaXRlKGRldmMsIEdBX0RNQUNGR19SRUcsIDB4NTApOworIAkKKyAJCS8qCisgCQkgKiBUYWtlIHRoZSBnYXRlLWFycmF5IG9mZiBvZiB0aGUgRE1BIGNoYW5uZWwuCisgCQkgKi8KKyAJCXNzY2FwZV93cml0ZShkZXZjLCBHQV9ETUFCX1JFRywgMHgyMCk7CisgCQorIAkJLyoKKyAJCSAqIEluaXQgdGhlIEFEMTg0OCAoQ0QtUk9NKSBjb25maWcgcmVnLgorIAkJICovCisgCQlzc2NhcGVfd3JpdGUoZGV2YywgR0FfQ0RDRkdfUkVHLCAweDg5IHwgKGh3X2NvbmZpZy0+ZG1hIDw8IDQpIHwgKGlycV9iaXRzIDw8IDEpKTsKKyAJfQorIAkKKyAJaWYgKGh3X2NvbmZpZy0+aXJxID09IGRldmMtPmlycSkKKyAJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvdW5kc2NhcGU6IFdhcm5pbmchIFRoZSBXU1MgbW9kZSBjYW4ndCBzaGFyZSBJUlEgd2l0aCBNSURJXG4iKTsKKyAJCQkJCisJaHdfY29uZmlnLT5zbG90c1swXSA9IGFkMTg0OF9pbml0KAorCQkJc3NjYXBlX2lzX3BucCA/ICJTb3VuZFNjYXBlIiA6ICJTb3VuZFNjYXBlIFBOUCIsCisJCQlwb3J0cywKKwkJCWh3X2NvbmZpZy0+aXJxLAorCQkJaHdfY29uZmlnLT5kbWEsCisJCQlod19jb25maWctPmRtYSwKKwkJCTAsCisJCQlkZXZjLT5vc3AsCisJCQlUSElTX01PRFVMRSk7CisKKyAJCQkJCSAgCisJaWYgKGh3X2NvbmZpZy0+c2xvdHNbMF0gIT0gLTEpCS8qIFRoZSBBRDE4NDggZHJpdmVyIGluc3RhbGxlZCBpdHNlbGYgKi8KKwl7CisJCWF1ZGlvX2RldnNbaHdfY29uZmlnLT5zbG90c1swXV0tPmNvcHJvYyA9ICZzc2NhcGVfY29wcm9jX29wZXJhdGlvbnM7CisJCWRldmMtPmNvZGVjX2F1ZGlvZGV2ID0gaHdfY29uZmlnLT5zbG90c1swXTsKKwkJZGV2Yy0+bXlfYXVkaW9kZXYgPSBod19jb25maWctPnNsb3RzWzBdOworCisJCS8qIFNldCBwcm9wZXIgcm91dGluZ3MgaGVyZSAod2hhdCBhcmUgdGhleSkgKi8KKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTEsIFNPVU5EX01JWEVSX0xJTkUpOworCX0KKwkJCisjaWZkZWYgU1NDQVBFX0RFQlVHNQorCS8qCisJICogVGVtcG9yYXJ5IGRlYnVnZ2luZyBhaWQuIFByaW50IGNvbnRlbnRzIG9mIHRoZSByZWdpc3RlcnMKKwkgKiBhZnRlciB0aGUgQUQxODQ4IGRldmljZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KKwkgKi8KKwl7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorCQkJcHJpbnRrKCJJJWQgPSAlMDJ4XG4iLCBpLCBzc2NhcGVfcmVhZChkZXZjLCBpKSk7CisJfQorI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfc3NjYXBlKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlyZWxlYXNlX3JlZ2lvbihkZXZjLT5iYXNlICsgMiwgNik7CisJdW5sb2FkX21wdTQwMShod19jb25maWcpOworCWlmIChzc2NhcGVfaXNfcG5wKQorCQlyZWxlYXNlX3JlZ2lvbihkZXZjLT5jb2RlYywgMik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfc3NfbXNfc291bmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWFkMTg0OF91bmxvYWQoaHdfY29uZmlnLT5pb19iYXNlLAorCQkgICAgICBod19jb25maWctPmlycSwKKwkJICAgICAgZGV2Yy0+ZG1hLAorCQkgICAgICBkZXZjLT5kbWEsCisJCSAgICAgIDApOworCXNvdW5kX3VubG9hZF9hdWRpb2Rldihod19jb25maWctPnNsb3RzWzBdKTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21wdTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIHNwZWEgPSAtMTsKK3N0YXRpYyBpbnQgbXNzID0gMDsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpbyA9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIG1wdV9pcnEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfaW8gPSAtMTsKKworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3BlYSwgaW50LCAwKTsJCS8qIHNwZWE9MC8xIHNldCB0aGUgb2xkX2hhcmR3YXJlICovCittb2R1bGVfcGFyYW0obXB1X2lycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtcHVfaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXNzLCBpbnQsIDApOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NzY2FwZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlNvdW5kc2NhcGUgZHJpdmVyIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTZcbiIpOworCQorCWNmZy5pcnEgPSBpcnE7CisJY2ZnLmRtYSA9IGRtYTsKKwljZmcuaW9fYmFzZSA9IGlvOworCisJY2ZnX21wdS5pcnEgPSBtcHVfaXJxOworCWNmZ19tcHUuaW9fYmFzZSA9IG1wdV9pbzsKKwkvKiBXRUggLSBUcnkgdG8gZ2V0IHJpZ2h0IGRtYSBjaGFubmVsICovCisgICAgICAgIGNmZ19tcHUuZG1hID0gZG1hOworCQorCWRldmMtPmNvZGVjID0gY2ZnLmlvX2Jhc2U7CisJZGV2Yy0+Y29kZWNfaXJxID0gY2ZnLmlycTsKKwlkZXZjLT5jb2RlY190eXBlID0gMDsKKwlkZXZjLT5pY190eXBlID0gMDsKKwlkZXZjLT5yYXdfYnVmID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+bG9jayk7CisKKwlpZiAoY2ZnLmRtYSA9PSAtMSB8fCBjZmcuaXJxID09IC0xIHx8IGNmZy5pb19iYXNlID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BLCBJUlEsIGFuZCBJTyBwb3J0IG11c3QgYmUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwlpZiAoY2ZnX21wdS5pcnEgPT0gLTEgJiYgY2ZnX21wdS5pb19iYXNlICE9IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTVBVX0lSUSBtdXN0IGJlIHNwZWNpZmllZCBpZiBNUFVfSU8gaXMgc2V0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwlpZihzcGVhICE9IC0xKSB7CisJCW9sZF9oYXJkd2FyZSA9IHNwZWE7CisJCXByaW50ayhLRVJOX0lORk8gIkZvcmNpbmcgJXMgaGFyZHdhcmUgc3VwcG9ydC5cbiIsCisJCQlzcGVhPyJuZXciOiJvbGQiKTsKKwl9CQorCWlmIChwcm9iZV9zc2NhcGUoJmNmZ19tcHUpID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJYXR0YWNoX3NzY2FwZSgmY2ZnX21wdSk7CisJCisJbXNzID0gaW5pdF9zc19tc19zb3VuZCgmY2ZnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zc2NhcGUodm9pZCkKK3sKKwlpZiAobXNzKQorCQl1bmxvYWRfc3NfbXNfc291bmQoJmNmZyk7CisJdW5sb2FkX3NzY2FwZSgmY2ZnX21wdSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfc3NjYXBlKTsKK21vZHVsZV9leGl0KGNsZWFudXBfc3NjYXBlKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3NzY2FwZShjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSwgZG1hLCBtcHVfaW8sIG1wdV9pcnEgKi8KKwlpbnQgaW50c1s2XTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvCT0gaW50c1sxXTsKKwlpcnEJPSBpbnRzWzJdOworCWRtYQk9IGludHNbM107CisJbXB1X2lvCT0gaW50c1s0XTsKKwltcHVfaXJxCT0gaW50c1s1XTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJzc2NhcGU9Iiwgc2V0dXBfc3NjYXBlKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3N3YXJtX2NzNDI5N2EuYyBiL3NvdW5kL29zcy9zd2FybV9jczQyOTdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0ZDM3NwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zd2FybV9jczQyOTdhLmMKQEAgLTAsMCArMSwyNzQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICJzd2FybV9jczQyOTdhLmMiIC0tICBDaXJydXMgTG9naWMtQ3J5c3RhbCBDUzQyOTdhIGxpbnV4IGF1ZGlvIGRyaXZlci4KKyoKKyogICAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEJyb2FkY29tIENvcnBvcmF0aW9uLgorKiAgICAgIENvcHlyaWdodCAoQykgMjAwMCwyMDAxICBDaXJydXMgTG9naWMgQ29ycC4gIAorKiAgICAgICAgICAgIC0tIGFkYXB0ZWQgZnJvbSBkcml2ZXJzIGJ5IFRob21hcyBTYWlsZXIsIAorKiAgICAgICAgICAgIC0tIGJ1dCBkb24ndCBidWcgaGltOyBQcm9ibGVtcyBzaG91bGQgZ28gdG86CisqICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCisqICAgICAgICAgICAgICAgKGF1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbSkuCisqICAgICAgICAgICAgLS0gYWRhcHRlZCBmcm9tIGNzNDI4MSBQQ0kgZHJpdmVyIGZvciBjczQyOTdhIG9uCisqICAgICAgICAgICAgICAgQkNNMTI1MCBTeW5jaHJvbm91cyBTZXJpYWwgaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgKEtpcCBXYWxrZXIsIEJyb2FkY29tIENvcnAuKQorKiAgICAgIENvcHlyaWdodCAoQykgMjAwNCAgTWFjaWVqIFcuIFJvenlja2kKKyogICAgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqIE1vZHVsZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyczoKKyogICBub25lCisqCisqICBTdXBwb3J0ZWQgZGV2aWNlczoKKyogIC9kZXYvZHNwICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyogIC9kZXYvbWl4ZXIgIHN0YW5kYXJkIC9kZXYvbWl4ZXIgZGV2aWNlLCAobW9zdGx5KSBPU1MgY29tcGF0aWJsZQorKiAgL2Rldi9taWRpICAgc2ltcGxlIE1JREkgVUFSVCBpbnRlcmZhY2UsIG5vIGlvY3RsCisqCisqIE1vZGlmaWNhdGlvbiBIaXN0b3J5CisqIDA4LzIwLzAwIHRydyAtIHNpbGVuY2UgYW5kIG5vIHN0b3BwaW5nIERBQyB1bnRpbCByZWxlYXNlCisqIDA4LzIzLzAwIHRydyAtIGFkZGVkIENTX0RCRyBzdGF0ZW1lbnRzLCBmaXggaW50ZXJydXB0IGhhbmcgaXNzdWUgb24gREFDIHN0b3AuCisqIDA5LzE4LzAwIHRydyAtIGFkZGVkIDE2Yml0IG9ubHkgcmVjb3JkIHdpdGggY29udmVyc2lvbiAKKyogMDkvMjQvMDAgdHJ3IC0gYWRkZWQgRW5oYW5jZWQgRnVsbCBkdXBsZXggKHNlcGFyYXRlIHNpbXVsdGFuZW91cyAKKyogICAgICAgICAgICAgICAgY2FwdHVyZS9wbGF5YmFjayByYXRlcykKKyogMTAvMDMvMDAgdHJ3IC0gZml4ZWQgbW1hcCAoZml4ZWQgR1JFQ09SRCBhbmQgdGhlIFhNTVMgbW1hcCB0ZXN0IHBsdWdpbiAgCisqICAgICAgICAgICAgICAgIGxpYk9TU20uc28pCisqIDEwLzExLzAwIHRydyAtIG1vZGlmaWVkIGZvciAyLjQuMC10ZXN0OSBrZXJuZWwgZW5oYW5jZW1lbnRzIChOUl9NQVAgcmVtb3ZhbCkKKyogMTEvMDMvMDAgdHJ3IC0gZml4ZWQgaW50ZXJydXB0IGxvc3Mvc3R1dHRlciwgYWRkZWQgZGVidWcuCisqIDExLzEwLzAwIGJreiAtIGFkZGVkIF9fZGV2aW5pdCB0byBjczQyOTdhX2h3X2luaXQoKQorKiAxMS8xMC8wMCB0cncgLSBmaXhlZCBTTVAgYW5kIGNhcHR1cmUgc3BpbmxvY2sgaGFuZy4KKyogMTIvMDQvMDAgdHJ3IC0gY2xlYW5lZCB1cCBDU0RFQlVHIGZsYWdzIGFuZCBhZGRlZCAiZGVmYXVsdG9yZGVyIiBtb2R1bGVwYXJtLgorKiAxMi8wNS8wMCB0cncgLSBmaXhlZCBwb2xsaW5nIChteXRoMiksIGFuZCBhZGRlZCB1bmRlcnJ1biBzd3B0ciBmaXguCisqIDEyLzA4LzAwIHRydyAtIGFkZGVkIFBNIHN1cHBvcnQuIAorKiAxMi8xNC8wMCB0cncgLSBhZGRlZCB3cmFwcGVyIGNvZGUsIGJ1aWxkcyB1bmRlciAyLjQuMCwgMi4yLjE3LTIwLCAyLjIuMTctOCAKKyoJCSAoUkgvRGVsbCBiYXNlKSwgMi4yLjE4LCAyLjIuMTIuICBjbGVhbmVkIHVwIGNvZGUgbW9kcyBieSBpZGVudC4KKyogMTIvMTkvMDAgdHJ3IC0gYWRkZWQgUE0gc3VwcG9ydCBmb3IgMi4yIGJhc2UgKGFwbV9jYWxsYmFjaykuIG90aGVyIFBNIGNsZWFudXAuCisqIDEyLzIxLzAwIHRydyAtIGFkZGVkIGZyYWN0aW9uYWwgImRlZmF1bHRvcmRlciIgaW5wdXRzLiBpZiA+MTAwIHRoZW4gdXNlIAorKgkJIGRlZmF1bHRvcmRlci0xMDAgYXMgcG93ZXIgb2YgMiBmb3IgdGhlIGJ1ZmZlciBzaXplLiBleGFtcGxlOgorKgkJIDEwNiA9IDJeKDEwNi0xMDApID0gMl42ID0gNjQgYnl0ZXMgZm9yIHRoZSBidWZmZXIgc2l6ZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfaW50Lmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfZG1hLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfc2NkLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfc3luY3Nlci5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX21hYy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwLmg+CisKK3N0cnVjdCBjczQyOTdhX3N0YXRlOworCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpOworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBjczQyOTdhX3N0YXRlICpzKTsKKyN1bmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisjZGVmaW5lIENTNDI5N2FfTUFHSUMgICAgICAgICAgIDB4ZjAwYmVlZjEKKworLy8gYnVmZmVyIG9yZGVyIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGRtYSBidWZmZXIgZm9yIHRoZSBkcml2ZXIuCisvLyB1bmRlciBMaW51eCwgYSBzbWFsbGVyIGJ1ZmZlciBhbGxvd3MgbW9yZSByZXNwb25zaXZlbmVzcyBmcm9tIG1hbnkgb2YgdGhlIAorLy8gYXBwbGljYXRpb25zIChlLmcuIGdhbWVzKS4gIEEgbGFyZ2VyIGJ1ZmZlciBhbGxvd3Mgc29tZSBvZiB0aGUgYXBwcyAoZXNvdW5kKSAKKy8vIHRvIG5vdCB1bmRlcnJ1biB0aGUgZG1hIGJ1ZmZlciBhcyBlYXNpbHkuICBBcyBkZWZhdWx0LCB1c2UgMzJrIChvcmRlcj0zKQorLy8gcmF0aGVyIHRoYW4gNjRrIGFzIHNvbWUgb2YgdGhlIGdhbWVzIHdvcmsgbW9yZSByZXNwb25zaXZlbHkuCisvLyBsb2cgYmFzZSAyKCBidWZmIHN6ID0gMzJrKS4KKworLy9zdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0b3JkZXIgPSAzOworLy9NT0RVTEVfUEFSTShkZWZhdWx0b3JkZXIsICJpIik7CisKKy8vCisvLyBUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgY29tcGlsYXRpb24gYnkgY29tbWVudGluZyBvdXQgIiNkZWZpbmUgQ1NERUJVRyIKKy8vCisjZGVmaW5lIENTREVCVUcgMAorI2lmIENTREVCVUcKKyNkZWZpbmUgQ1NERUJVR19JTlRFUkZBQ0UgMQorI2Vsc2UKKyN1bmRlZiBDU0RFQlVHX0lOVEVSRkFDRQorI2VuZGlmCisvLworLy8gY3NfZGVidWdtYXNrIGFyZWFzCisvLworI2RlZmluZSBDU19JTklUCSAJMHgwMDAwMDAwMQkvLyBpbml0aWFsaXphdGlvbiBhbmQgcHJvYmUgZnVuY3Rpb25zCisjZGVmaW5lIENTX0VSUk9SIAkweDAwMDAwMDAyCS8vIHRtcCBkZWJ1Z2dpbmcgYml0IHBsYWNlaG9sZGVyCisjZGVmaW5lIENTX0lOVEVSUlVQVAkweDAwMDAwMDA0CS8vIGludGVycnVwdCBoYW5kbGVyIChzZXBhcmF0ZSBmcm9tIGFsbCBvdGhlcikKKyNkZWZpbmUgQ1NfRlVOQ1RJT04gCTB4MDAwMDAwMDgJLy8gZW50ZXIvbGVhdmUgZnVuY3Rpb25zCisjZGVmaW5lIENTX1dBVkVfV1JJVEUgCTB4MDAwMDAwMTAJLy8gd3JpdGUgaW5mb3JtYXRpb24gZm9yIHdhdmUKKyNkZWZpbmUgQ1NfV0FWRV9SRUFEIAkweDAwMDAwMDIwCS8vIHJlYWQgaW5mb3JtYXRpb24gZm9yIHdhdmUKKyNkZWZpbmUgQ1NfQUM5NyAgICAgICAgIDB4MDAwMDAwNDAgICAgICAvLyBBQzk3IHJlZ2lzdGVyIGFjY2VzcworI2RlZmluZSBDU19ERVNDUiAgICAgICAgMHgwMDAwMDA4MCAgICAgIC8vIGRlc2NyaXB0b3IgbWFuYWdlbWVudAorI2RlZmluZSBDU19PUEVOCQkweDAwMDAwNDAwCS8vIGFsbCBvcGVuIGZ1bmN0aW9ucyBpbiB0aGUgZHJpdmVyCisjZGVmaW5lIENTX1JFTEVBU0UJMHgwMDAwMDgwMAkvLyBhbGwgcmVsZWFzZSBmdW5jdGlvbnMgaW4gdGhlIGRyaXZlcgorI2RlZmluZSBDU19QQVJNUwkweDAwMDAxMDAwCS8vIGZ1bmN0aW9uYWwgYW5kIG9wZXJhdGlvbmFsIHBhcmFtZXRlcnMKKyNkZWZpbmUgQ1NfSU9DVEwJMHgwMDAwMjAwMAkvLyBpb2N0bCAobm9uLW1peGVyKQorI2RlZmluZSBDU19UTVAJCTB4MTAwMDAwMDAJLy8gdG1wIGRlYnVnIG1hc2sgYml0CisKKy8vCisvLyBDU0RFQlVHIGlzIHVzdWFsIG1vZGUgaXMgc2V0IHRvIDEsIHRoZW4gdXNlIHRoZQorLy8gY3NfZGVidWdsZXZlbCBhbmQgY3NfZGVidWdtYXNrIHRvIHR1cm4gb24gb3Igb2ZmIGRlYnVnZ2luZy4KKy8vIERlYnVnIGxldmVsIG9mIDEgaGFzIGJlZW4gZGVmaW5lZCB0byBiZSBrZXJuZWwgZXJyb3JzIGFuZCBpbmZvCisvLyB0aGF0IHNob3VsZCBiZSBwcmludGVkIG9uIGFueSByZWxlYXNlZCBkcml2ZXIuCisvLworI2lmIENTREVCVUcKKyNkZWZpbmUgQ1NfREJHT1VUKG1hc2ssbGV2ZWwseCkgaWYoKGNzX2RlYnVnbGV2ZWwgPj0gKGxldmVsKSkgJiYgKChtYXNrKSAmIGNzX2RlYnVnbWFzaykgKSB7eDt9CisjZWxzZQorI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KQorI2VuZGlmCisKKyNpZiBDU0RFQlVHCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z2xldmVsID0gNDsJLy8gbGV2ZWxzIHJhbmdlIGZyb20gMS05CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z21hc2sgPSBDU19JTklUIC8qfCBDU19JT0NUTCovOworTU9EVUxFX1BBUk0oY3NfZGVidWdsZXZlbCwgImkiKTsKK01PRFVMRV9QQVJNKGNzX2RlYnVnbWFzaywgImkiKTsKKyNlbmRpZgorI2RlZmluZSBDU19UUlVFIAkxCisjZGVmaW5lIENTX0ZBTFNFIAkwCisKKyNkZWZpbmUgQ1NfVFlQRV9BREMgMAorI2RlZmluZSBDU19UWVBFX0RBQyAxCisKKyNkZWZpbmUgU0VSX0JBU0UgICAgKEFfU0VSX0JBU0VfMSArIEtTRUcxKQorI2RlZmluZSBTU19DU1IodCkgICAoU0VSX0JBU0UrdCkKKyNkZWZpbmUgU1NfVFhUQkwodCkgKFNFUl9CQVNFK1JfU0VSX1RYX1RBQkxFX0JBU0UrKHQqOCkpCisjZGVmaW5lIFNTX1JYVEJMKHQpIChTRVJfQkFTRStSX1NFUl9SWF9UQUJMRV9CQVNFKyh0KjgpKQorCisjZGVmaW5lIEZSQU1FX0JZVEVTICAgICAgICAgICAgMzIKKyNkZWZpbmUgRlJBTUVfU0FNUExFX0JZVEVTICAgICAgNAorCisvKiBTaG91bGQgdGhpcyBiZSB2YXJpYWJsZT8gKi8KKyNkZWZpbmUgU0FNUExFX0JVRl9TSVpFICAgICAgICAoMTYqMTAyNCkKKyNkZWZpbmUgU0FNUExFX0ZSQU1FX0NPVU5UICAgICAoU0FNUExFX0JVRl9TSVpFIC8gRlJBTUVfU0FNUExFX0JZVEVTKQorLyogVGhlIGRyaXZlciBjYW4gZXhwbG9kZS9zaHJpbmsgdGhlIGZyYW1lcyB0by9mcm9tIGEgc21hbGxlciBzYW1wbGUKKyAgIGJ1ZmZlciAqLworI2RlZmluZSBETUFfQkxPQVRfRkFDVE9SICAgICAgIDEKKyNkZWZpbmUgRE1BX0RFU0NSICAgICAgICAgICAgICAoU0FNUExFX0ZSQU1FX0NPVU5UIC8gRE1BX0JMT0FUX0ZBQ1RPUikKKyNkZWZpbmUgRE1BX0JVRl9TSVpFICAgICAgICAgICAoRE1BX0RFU0NSICogRlJBTUVfQllURVMpCisKKy8qIFVzZSB0aGUgbWF4bWl1bSBjb3VudCAoMjU1ID09IDUuMSBtcyBiZXR3ZWVuIGludGVycnVwdHMpICovCisjZGVmaW5lIERNQV9JTlRfQ05UICAgICAgICAgICAgKCgxIDw8IFNfRE1BX0lOVF9QS1RDTlQpIC0gMSkKKworLyogRmlndXJlIHRoaXMgb3V0OiBob3cgbWFueSBUWCBETUFzIGFoZWFkIHRvIHNjaGVkdWxlIGEgcmVnIGFjY2VzcyAqLworI2RlZmluZSBSRUdfTEFURU5DWSAgICAgICAgICAgIDE1MAorCisjZGVmaW5lIEZSQU1FX1RYX1VTICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgU0VSRE1BX05FWFRCVUYoZCxmKSAoKChkKS0+ZisxKSAlIChkKS0+cmluZ3N6KQorCitzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPQorICAgIEtFUk5fQ1JJVCAiY3M0Mjk3YTogaW52YWxpZCBtYWdpYyB2YWx1ZVxuIjsKKworI2RlZmluZSBWQUxJREFURV9TVEFURShzKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShzKSB8fCAocyktPm1hZ2ljICE9IENTNDI5N2FfTUFHSUMpIHsgXAorICAgICAgICAgICAgICAgIHByaW50ayhpbnZhbGlkX21hZ2ljKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworc3RydWN0IGxpc3RfaGVhZCBjczQyOTdhX2RldnMgPSB7ICZjczQyOTdhX2RldnMsICZjczQyOTdhX2RldnMgfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2VyZG1hX2Rlc2NyX3MgeworICAgICAgICB1NjQgZGVzY3JfYTsKKyAgICAgICAgdTY0IGRlc2NyX2I7Cit9IHNlcmRtYV9kZXNjcl90OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGFkZHJfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2VyZG1hX3MgeworICAgICAgICB1bnNpZ25lZCAgICAgICAgIHJpbmdzejsKKyAgICAgICAgc2VyZG1hX2Rlc2NyX3QgICpkZXNjcnRhYjsKKyAgICAgICAgc2VyZG1hX2Rlc2NyX3QgICpkZXNjcnRhYl9lbmQ7CisgICAgICAgIHBhZGRyX3QgICAgICAgICAgZGVzY3J0YWJfcGh5czsKKyAgICAgICAgCisgICAgICAgIHNlcmRtYV9kZXNjcl90ICAqZGVzY3JfYWRkOworICAgICAgICBzZXJkbWFfZGVzY3JfdCAgKmRlc2NyX3JlbTsKKyAgICAgICAgCisgICAgICAgIHU2NCAgKmRtYV9idWY7ICAgICAgICAgICAvLyBidWZmZXIgZm9yIERNQSBjb250ZW50cyAoZnJhbWVzKQorICAgICAgICBwYWRkcl90ICAgICAgICAgIGRtYV9idWZfcGh5czsKKyAgICAgICAgdTE2ICAqc2FtcGxlX2J1ZjsJCS8vIHRtcCBidWZmZXIgZm9yIHNhbXBsZSBjb252ZXJzaW9ucworICAgICAgICB1MTYgICpzYl9zd3B0cjsKKyAgICAgICAgdTE2ICAqc2JfaHdwdHI7CisgICAgICAgIHUxNiAgKnNiX2VuZDsKKworICAgICAgICBkbWFfYWRkcl90IGRtYWFkZHI7CisvLyAgICAgICAgdW5zaWduZWQgYnVmb3JkZXI7CS8vIExvZyBiYXNlIDIgb2YgJ2RtYV9idWYnIHNpemUgaW4gYnl0ZXMuLgorICAgICAgICB1bnNpZ25lZCBudW1mcmFnOwkvLyAjIG9mICdmcmFnbWVudHMnIGluIHRoZSBidWZmZXIuCisgICAgICAgIHVuc2lnbmVkIGZyYWdzaGlmdDsJLy8gTG9nIGJhc2UgMiBvZiBmcmFnbWVudCBzaXplLgorICAgICAgICB1bnNpZ25lZCBod3B0ciwgc3dwdHI7CisgICAgICAgIHVuc2lnbmVkIHRvdGFsX2J5dGVzOwkvLyAjIGJ5dGVzIHByb2Nlc3Mgc2luY2Ugb3Blbi4KKyAgICAgICAgdW5zaWduZWQgYmxvY2tzOwkvLyBsYXN0IHJldHVybmVkIGJsb2NrcyB2YWx1ZSBHRVRPUFRSCisgICAgICAgIHVuc2lnbmVkIHdha2V1cDsJLy8gaW50ZXJydXB0IG9jY3VycmVkIG9uIGJsb2NrIAorICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIHVuc2lnbmVkIHVuZGVycnVuOwkvLyB1bmRlcnJ1biBmbGFnCisgICAgICAgIHVuc2lnbmVkIGVycm9yOwkvLyBvdmVyL3VuZGVycnVuIAorICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCByZWdfd2FpdDsKKyAgICAgICAgLy8gcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAKKyAgICAgICAgdW5zaWduZWQgZnJhZ3NpemU7CS8vIDIqKmZyYWdzaGlmdC4uCisgICAgICAgIHVuc2lnbmVkIHNidWZzejsJLy8gMioqYnVmb3JkZXIuCisgICAgICAgIHVuc2lnbmVkIGZyYWdzYW1wbGVzOworICAgICAgICAvLyBPU1Mgc3R1ZmYgCisgICAgICAgIHVuc2lnbmVkIG1hcHBlZDoxOwkvLyBCdWZmZXIgbWFwcGVkIGluIGNzNDI5N2FfbW1hcCgpPworICAgICAgICB1bnNpZ25lZCByZWFkeToxOwkvLyBwcm9nX2RtYWJ1Zl9kYWMoKS9hZGMoKSBzdWNjZXNzZnVsPworICAgICAgICB1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CisgICAgICAgIHVuc2lnbmVkIHR5cGU6MTsJLy8gYWRjIG9yIGRhYyBidWZmZXIgKENTX1RZUEVfWFhYKQorICAgICAgICB1bnNpZ25lZCBvc3NmcmFnc2hpZnQ7CisgICAgICAgIGludCBvc3NtYXhmcmFnczsKKyAgICAgICAgdW5zaWduZWQgc3ViZGl2aXNpb247Cit9IHNlcmRtYV90OworCitzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSB7CisJLy8gbWFnaWMgCisJdW5zaWduZWQgaW50IG1hZ2ljOworCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLy8gc291bmRjb3JlIHN0dWZmIAorCWludCBkZXZfYXVkaW87CisJaW50IGRldl9taXhlcjsKKworCS8vIGhhcmR3YXJlIHJlc291cmNlcyAKKwl1bnNpZ25lZCBpbnQgaXJxOworCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJ4X292cnJuOyAvKiBGSUZPICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJ4X292ZXJmbG93OyAvKiBzdGFnaW5nIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0eF91bmRlcnJ1bjsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcnhfYmFkOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByeF9nb29kOworICAgICAgICB9IHN0YXRzOworCisJLy8gbWl4ZXIgcmVnaXN0ZXJzIAorCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0IHZvbFsxMF07CisJCXVuc2lnbmVkIGludCByZWNzcmM7CisJCXVuc2lnbmVkIGludCBtb2RjbnQ7CisJCXVuc2lnbmVkIHNob3J0IG1pY3ByZWFtcDsKKwl9IG1peDsKKworCS8vIHdhdmUgc3R1ZmYgICAKKwlzdHJ1Y3QgcHJvcGVydGllcyB7CisJCXVuc2lnbmVkIGZtdDsKKwkJdW5zaWduZWQgZm10X29yaWdpbmFsOwkvLyBvcmlnaW5hbCByZXF1ZXN0ZWQgZm9ybWF0CisJCXVuc2lnbmVkIGNoYW5uZWxzOworCQl1bnNpZ25lZCByYXRlOworCX0gcHJvcF9kYWMsIHByb3BfYWRjOworCXVuc2lnbmVkIGNvbnZlcnNpb246MTsJLy8gY29udmVyc2lvbiBmcm9tIDE2IHRvIDggYml0IGluIHByb2dyZXNzCisJdW5zaWduZWQgZW5hOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW1fYWRjOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW1fZGFjOworCW1vZGVfdCBvcGVuX21vZGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdF9hZGM7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0X2RhYzsKKworCWRtYV9hZGRyX3QgZG1hYWRkcl9zYW1wbGVfYnVmOworCXVuc2lnbmVkIGJ1Zm9yZGVyX3NhbXBsZV9idWY7CS8vIExvZyBiYXNlIDIgb2YgJ2RtYV9idWYnIHNpemUgaW4gYnl0ZXMuLgorCisgICAgICAgIHNlcmRtYV90IGRtYV9kYWMsIGRtYV9hZGM7CisKKyAgICAgICAgdm9sYXRpbGUgdTE2IHJlYWRfdmFsdWU7CisgICAgICAgIHZvbGF0aWxlIHUxNiByZWFkX3JlZzsKKyAgICAgICAgdm9sYXRpbGUgdTY0IHJlZ19yZXF1ZXN0OworfTsKKworI2lmIDEKKyNkZWZpbmUgcHJvZ19jb2RlYyhhLGIpCisjZGVmaW5lIGRlYWxsb2NfZG1hYnVmKGEsYik7CisjZW5kaWYKKworc3RhdGljIGludCBwcm9nX2RtYWJ1Zl9hZGMoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpCit7CisJcy0+ZG1hX2FkYy5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcm9nX2RtYWJ1Zl9kYWMoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpCit7CisJcy0+ZG1hX2RhYy5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2FkdmFuY2Uodm9pZCAqYnVmLCB1bnNpZ25lZCBic2l6ZSwgdW5zaWduZWQgYnB0ciwKKwkJCSAgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKGJwdHIgKyBsZW4gPiBic2l6ZSkgeworCQl1bnNpZ25lZCB4ID0gYnNpemUgLSBicHRyOworCQltZW1zZXQoKChjaGFyICopIGJ1ZikgKyBicHRyLCBjLCB4KTsKKwkJYnB0ciA9IDA7CisJCWxlbiAtPSB4OworCX0KKwlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkiY3M0Mjk3YTogY2xlYXJfYWR2YW5jZSgpOiBtZW1zZXQgJWQgYXQgMHglLjh4IGZvciAlZCBzaXplIFxuIiwKKwkJCSh1bnNpZ25lZCljLCAodW5zaWduZWQpKChjaGFyICopIGJ1ZikgKyBicHRyLCBsZW4pKTsKKwltZW1zZXQoKChjaGFyICopIGJ1ZikgKyBicHRyLCBjLCBsZW4pOworfQorCisjaWYgQ1NERUJVRworCisvLyBERUJVRyBST1VUSU5FUworCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMIAlfU0lPV1IoJ00nLDEyMCwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTCAJX1NJT1dSKCdNJywxMjEsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSyAJX1NJT1dSKCdNJywxMjIsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSyAJX1NJT1dSKCdNJywxMjMsIGludCkKKworc3RhdGljIHZvaWQgY3NfcHJpbnRpb2N0bCh1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHZpZHg7CisJLy8gSW5kZXggb2YgbWl4dGFibGUxW10gbWVtYmVyIGlzIERldmljZSBJRCAKKwkvLyBhbmQgbXVzdCBiZSA8PSBTT1VORF9NSVhFUl9OUkRFVklDRVMuCisJLy8gVmFsdWUgb2YgYXJyYXkgbWVtYmVyIGlzIGluZGV4IGludG8gcy0+bWl4LnZvbFtdCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWl4dGFibGUxW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7CisJCVtTT1VORF9NSVhFUl9QQ01dID0gMSwJLy8gdm9pY2UgCisJCVtTT1VORF9NSVhFUl9MSU5FMV0gPSAyLAkvLyBBVVgKKwkJW1NPVU5EX01JWEVSX0NEXSA9IDMsCS8vIENEIAorCQlbU09VTkRfTUlYRVJfTElORV0gPSA0LAkvLyBMaW5lIAorCQlbU09VTkRfTUlYRVJfU1lOVEhdID0gNSwJLy8gRk0KKwkJW1NPVU5EX01JWEVSX01JQ10gPSA2LAkvLyBNaWMgCisJCVtTT1VORF9NSVhFUl9TUEVBS0VSXSA9IDcsCS8vIFNwZWFrZXIgCisJCVtTT1VORF9NSVhFUl9SRUNMRVZdID0gOCwJLy8gUmVjb3JkaW5nIGxldmVsIAorCQlbU09VTkRfTUlYRVJfVk9MVU1FXSA9IDkJLy8gTWFzdGVyIFZvbHVtZSAKKwl9OworCisJc3dpdGNoICh4KSB7CisJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJICBwcmludGsoIlNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUw6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJPU1NfR0VUVkVSU0lPTjpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NZTkM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVERVUExFWDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVENBUFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfUkVTRVQ6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1BFRUQ6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NURVJFTzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9DSEFOTkVMUzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVEZNVFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZNVDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1BPU1Q6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRUUklHR0VSOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VUVFJJR0dFUjpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT1NQQUNFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRJU1BBQ0U6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfTk9OQkxPQ0s6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9ERUxBWTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVElQVFI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRPUFRSOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUQkxLU0laRTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1VCRElWSURFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9SQVRFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX0JJVFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJICBwcmludGsoIlNPVU5EX1BDTV9XUklURV9GSUxURVI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVFNZTkNSTzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9GSUxURVI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTE6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFMTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEUyOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUzOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFNDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFNToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEU1OlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0lORk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9JTkZPOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX09MRF9NSVhFUl9JTkZPOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfT0xEX01JWEVSX0lORk86XG4iKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3dpdGNoIChfSU9DX05SKHgpKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9WT0xVTUU6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9TUEVBS0VSOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TUEVBS0VSOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDTEVWOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9SRUNMRVY6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkJICBwcmludGsoIlNPVU5EX01JWEVSX01JQzpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TWU5USDpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCQkgIHByaW50aygiU09VTkRfTUlYRVJfUkVDU1JDOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCQkgIHByaW50aygiU09VTkRfTUlYRVJfREVWTUFTSzpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkJICBwcmludGsoIlNPVU5EX01JWEVSX1JFQ01BU0s6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TVEVSRU9ERVZTOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DQVBTOlxuIikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpID0gX0lPQ19OUih4KTsKKwkJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUworCQkJICAgIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpIHsKKwkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aworCQkJCQkoIlVOS05PV04gSU9DVEw6IDB4JS44eCBOUj0lZFxuIiwKKwkJCQkJCXgsIGkpKTsKKwkJCX0gZWxzZSB7CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsKKwkJCQkJKCJTT1VORF9NSVhFUl9JT0NUTCBBQzl4OiAweCUuOHggTlI9JWRcbiIsCisJCQkJCQl4LCBpKSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgc2VyX2luaXQoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpCit7CisgICAgICAgIGludCBpOworCisgICAgICAgIENTX0RCR09VVChDU19JTklULCAyLCAKKyAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IFNldHRpbmcgdXAgc2VyaWFsIHBhcmFtZXRlcnNcbiIpKTsKKworICAgICAgICBfX3Jhd193cml0ZXEoTV9TWU5DU0VSX0NNRF9SWF9SRVNFVCB8IE1fU1lOQ1NFUl9DTURfVFhfUkVTRVQsIFNTX0NTUihSX1NFUl9DTUQpKTsKKworICAgICAgICBfX3Jhd193cml0ZXEoTV9TWU5DU0VSX01TQl9GSVJTVCwgU1NfQ1NSKFJfU0VSX01PREUpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKDMyLCBTU19DU1IoUl9TRVJfTUlORlJNX1NaKSk7CisgICAgICAgIF9fcmF3X3dyaXRlcSgzMiwgU1NfQ1NSKFJfU0VSX01BWEZSTV9TWikpOworCisgICAgICAgIF9fcmF3X3dyaXRlcSgxLCBTU19DU1IoUl9TRVJfVFhfUkRfVEhSU0gpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKDQsIFNTX0NTUihSX1NFUl9UWF9XUl9USFJTSCkpOworICAgICAgICBfX3Jhd193cml0ZXEoOCwgU1NfQ1NSKFJfU0VSX1JYX1JEX1RIUlNIKSk7CisKKyAgICAgICAgLyogVGhpcyBsb29rcyBnb29kIGZyb20gZXhwZXJpbWVudGF0aW9uICovCisgICAgICAgIF9fcmF3X3dyaXRlcSgoTV9TWU5DU0VSX1RYU1lOQ19JTlQgfCBWX1NZTkNTRVJfVFhTWU5DX0RMWSgwKSB8IE1fU1lOQ1NFUl9UWENMS19FWFQgfAorICAgICAgICAgICAgICAgTV9TWU5DU0VSX1JYU1lOQ19JTlQgfCBWX1NZTkNTRVJfUlhTWU5DX0RMWSgxKSB8IE1fU1lOQ1NFUl9SWENMS19FWFQgfCBNX1NZTkNTRVJfUlhTWU5DX0VER0UpLAorICAgICAgICAgICAgICBTU19DU1IoUl9TRVJfTElORV9NT0RFKSk7CisKKyAgICAgICAgLyogVGhpcyBsb29rcyBnb29kIGZyb20gZXhwZXJpbWVudGF0aW9uICovCisgICAgICAgIF9fcmF3X3dyaXRlcShWX1NZTkNTRVJfU0VRX0NPVU5UKDE0KSB8IE1fU1lOQ1NFUl9TRVFfRU5BQkxFIHwgTV9TWU5DU0VSX1NFUV9TVFJPQkUsCisgICAgICAgICAgICAgIFNTX1RYVEJMKDApKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoMTUpIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfCBNX1NZTkNTRVJfU0VRX0JZVEUsCisgICAgICAgICAgICAgIFNTX1RYVEJMKDEpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoMTMpIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfCBNX1NZTkNTRVJfU0VRX0JZVEUsCisgICAgICAgICAgICAgIFNTX1RYVEJMKDIpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoIDApIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfAorICAgICAgICAgICAgICBNX1NZTkNTRVJfU0VRX1NUUk9CRSB8IE1fU1lOQ1NFUl9TRVFfTEFTVCwgU1NfVFhUQkwoMykpOworCisgICAgICAgIF9fcmF3X3dyaXRlcShWX1NZTkNTRVJfU0VRX0NPVU5UKDE0KSB8IE1fU1lOQ1NFUl9TRVFfRU5BQkxFIHwgTV9TWU5DU0VSX1NFUV9TVFJPQkUsCisgICAgICAgICAgICAgIFNTX1JYVEJMKDApKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoMTUpIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfCBNX1NZTkNTRVJfU0VRX0JZVEUsCisgICAgICAgICAgICAgIFNTX1JYVEJMKDEpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoMTMpIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfCBNX1NZTkNTRVJfU0VRX0JZVEUsCisgICAgICAgICAgICAgIFNTX1JYVEJMKDIpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoIDApIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfCBNX1NZTkNTRVJfU0VRX1NUUk9CRSB8CisgICAgICAgICAgICAgIE1fU1lOQ1NFUl9TRVFfTEFTVCwgU1NfUlhUQkwoMykpOworCisgICAgICAgIGZvciAoaT00OyBpPDE2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAvKiBKdXN0IGluIGNhc2UuLi4gKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZXEoTV9TWU5DU0VSX1NFUV9MQVNULCBTU19UWFRCTChpKSk7CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVxKE1fU1lOQ1NFUl9TRVFfTEFTVCwgU1NfUlhUQkwoaSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zZXJkbWEoc2VyZG1hX3QgKmRtYSkKK3sKKyAgICAgICAgQ1NfREJHT1VUKENTX0lOSVQsIDIsCisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IGRlc2MgLSAlZCBzYnVmc2l6ZSAtICVkIGRidWZzaXplIC0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0RFU0NSLCBTQU1QTEVfQlVGX1NJWkUsIERNQV9CVUZfU0laRSkpOworCisgICAgICAgIC8qIERlc2NyaXB0b3JzICovCisgICAgICAgIGRtYS0+cmluZ3N6ID0gRE1BX0RFU0NSOworICAgICAgICBkbWEtPmRlc2NydGFiID0ga21hbGxvYyhkbWEtPnJpbmdzeiAqIHNpemVvZihzZXJkbWFfZGVzY3JfdCksIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIWRtYS0+ZGVzY3J0YWIpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IGttYWxsb2MgZGVzY3J0YWIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGRtYS0+ZGVzY3J0YWIsIDAsIGRtYS0+cmluZ3N6ICogc2l6ZW9mKHNlcmRtYV9kZXNjcl90KSk7CisgICAgICAgIGRtYS0+ZGVzY3J0YWJfZW5kID0gZG1hLT5kZXNjcnRhYiArIGRtYS0+cmluZ3N6OworCS8qIFhYWCBibG9kZHkgbWVzcywgdXNlIHByb3BlciBETUEgQVBJIGhlcmUgLi4uICAqLworCWRtYS0+ZGVzY3J0YWJfcGh5cyA9IENQSFlTQUREUigobG9uZylkbWEtPmRlc2NydGFiKTsKKyAgICAgICAgZG1hLT5kZXNjcl9hZGQgPSBkbWEtPmRlc2NyX3JlbSA9IGRtYS0+ZGVzY3J0YWI7CisKKyAgICAgICAgLyogRnJhbWUgYnVmZmVyIGFyZWEgKi8KKyAgICAgICAgZG1hLT5kbWFfYnVmID0ga21hbGxvYyhETUFfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIWRtYS0+ZG1hX2J1ZikgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YToga21hbGxvYyBkbWFfYnVmIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAga2ZyZWUoZG1hLT5kZXNjcnRhYik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1lbXNldChkbWEtPmRtYV9idWYsIDAsIERNQV9CVUZfU0laRSk7CisgICAgICAgIGRtYS0+ZG1hX2J1Zl9waHlzID0gQ1BIWVNBRERSKChsb25nKWRtYS0+ZG1hX2J1Zik7CisKKyAgICAgICAgLyogU2FtcGxlcyBidWZmZXIgYXJlYSAqLworICAgICAgICBkbWEtPnNidWZzeiA9IFNBTVBMRV9CVUZfU0laRTsKKyAgICAgICAgZG1hLT5zYW1wbGVfYnVmID0ga21hbGxvYyhkbWEtPnNidWZzeiwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmICghZG1hLT5zYW1wbGVfYnVmKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQyOTdhOiBrbWFsbG9jIHNhbXBsZV9idWYgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBrZnJlZShkbWEtPmRlc2NydGFiKTsKKyAgICAgICAgICAgICAgICBrZnJlZShkbWEtPmRtYV9idWYpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBkbWEtPnNiX3N3cHRyID0gZG1hLT5zYl9od3B0ciA9IGRtYS0+c2FtcGxlX2J1ZjsKKyAgICAgICAgZG1hLT5zYl9lbmQgPSAodTE2ICopKCh2b2lkICopZG1hLT5zYW1wbGVfYnVmICsgZG1hLT5zYnVmc3opOworICAgICAgICBkbWEtPmZyYWdzaXplID0gZG1hLT5zYnVmc3ogPj4gMTsKKworICAgICAgICBDU19EQkdPVVQoQ1NfSU5JVCwgNCwgCisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IGRlc2NydGFiIC0gJTA4eCBkbWFfYnVmIC0gJXggc2FtcGxlX2J1ZiAtICV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpZG1hLT5kZXNjcnRhYiwgKGludClkbWEtPmRtYV9idWYsIAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpZG1hLT5zYW1wbGVfYnVmKSk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2luaXQoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpCit7CisgICAgICAgIGludCBpOworCisgICAgICAgIENTX0RCR09VVChDU19JTklULCAyLCAKKyAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IFNldHRpbmcgdXAgRE1BXG4iKSk7CisKKyAgICAgICAgaWYgKGluaXRfc2VyZG1hKCZzLT5kbWFfYWRjKSB8fAorICAgICAgICAgICAgaW5pdF9zZXJkbWEoJnMtPmRtYV9kYWMpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZiAoX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0NPVU5UX1JYKSl8fAorICAgICAgICAgICAgX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0NPVU5UX1RYKSkpIHsKKyAgICAgICAgICAgICAgICBwYW5pYygiRE1BIHN0YXRlIGNvcnJ1cHRlZD8hIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIG5vdyAtIHRoZSBkZXNjci9idWZmZXIgcGFpcmluZ3Mgd2lsbCBuZXZlcgorICAgICAgICAgICBjaGFuZ2UuLi4gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8RE1BX0RFU0NSOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmRlc2NydGFiW2ldLmRlc2NyX2EgPSBNX0RNQV9TRVJSWF9TT1AgfCBWX0RNQV9EU0NSQV9BX1NJWkUoMSkgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgIChzLT5kbWFfZGFjLmRtYV9idWZfcGh5cyArIGkqRlJBTUVfQllURVMpOworICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuZGVzY3J0YWJbaV0uZGVzY3JfYiA9IFZfRE1BX0RTQ1JCX1BLVF9TSVpFKEZSQU1FX0JZVEVTKTsKKyAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLmRlc2NydGFiW2ldLmRlc2NyX2EgPSBWX0RNQV9EU0NSQV9BX1NJWkUoMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmRtYV9hZGMuZG1hX2J1Zl9waHlzICsgaSpGUkFNRV9CWVRFUyk7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5kZXNjcnRhYltpXS5kZXNjcl9iID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIF9fcmF3X3dyaXRlcSgoTV9ETUFfRU9QX0lOVF9FTiB8IFZfRE1BX0lOVF9QS1RDTlQoRE1BX0lOVF9DTlQpIHwKKyAgICAgICAgICAgICAgIFZfRE1BX1JJTkdTWihETUFfREVTQ1IpIHwgTV9ETUFfVERYX0VOKSwKKyAgICAgICAgICAgICAgU1NfQ1NSKFJfU0VSX0RNQV9DT05GSUcwX1JYKSk7CisgICAgICAgIF9fcmF3X3dyaXRlcShNX0RNQV9MMkNBLCBTU19DU1IoUl9TRVJfRE1BX0NPTkZJRzFfUlgpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKHMtPmRtYV9hZGMuZGVzY3J0YWJfcGh5cywgU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0JBU0VfUlgpKTsKKworICAgICAgICBfX3Jhd193cml0ZXEoVl9ETUFfUklOR1NaKERNQV9ERVNDUiksIFNTX0NTUihSX1NFUl9ETUFfQ09ORklHMF9UWCkpOworICAgICAgICBfX3Jhd193cml0ZXEoTV9ETUFfTDJDQSB8IE1fRE1BX05PX0RTQ1JfVVBEVCwgU1NfQ1NSKFJfU0VSX0RNQV9DT05GSUcxX1RYKSk7CisgICAgICAgIF9fcmF3X3dyaXRlcShzLT5kbWFfZGFjLmRlc2NydGFiX3BoeXMsIFNTX0NTUihSX1NFUl9ETUFfRFNDUl9CQVNFX1RYKSk7CisKKyAgICAgICAgLyogUHJlcCB0aGUgcmVjZWl2ZSBETUEgZGVzY3JpcHRvciByaW5nICovCisgICAgICAgIF9fcmF3X3dyaXRlcShETUFfREVTQ1IsIFNTX0NTUihSX1NFUl9ETUFfRFNDUl9DT1VOVF9SWCkpOworCisgICAgICAgIF9fcmF3X3dyaXRlcShNX1NZTkNTRVJfRE1BX1JYX0VOIHwgTV9TWU5DU0VSX0RNQV9UWF9FTiwgU1NfQ1NSKFJfU0VSX0RNQV9FTkFCTEUpKTsKKworICAgICAgICBfX3Jhd193cml0ZXEoKE1fU1lOQ1NFUl9SWF9TWU5DX0VSUiB8IE1fU1lOQ1NFUl9SWF9PVkVSUlVOIHwgTV9TWU5DU0VSX1JYX0VPUF9DT1VOVCksCisgICAgICAgICAgICAgIFNTX0NTUihSX1NFUl9JTlRfTUFTSykpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgcngvdHg7IGxldCB0aGUgY29kZWMgd2FybSB1cCB0byB0aGUgc3luYyBhbmQKKyAgICAgICAgICAgc3RhcnQgc2VuZGluZyBnb29kIGZyYW1lcyBiZWZvcmUgdGhlIHJlY2VpdmUgRklGTyBpcworICAgICAgICAgICBlbmFibGVkICovCisgICAgICAgIF9fcmF3X3dyaXRlcShNX1NZTkNTRVJfQ01EX1RYX0VOLCBTU19DU1IoUl9TRVJfQ01EKSk7CisgICAgICAgIHVkZWxheSgxMDAwKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKE1fU1lOQ1NFUl9DTURfUlhfRU4gfCBNX1NZTkNTRVJfQ01EX1RYX0VOLCBTU19DU1IoUl9TRVJfQ01EKSk7CisKKyAgICAgICAgLyogWFhYS1cgaXMgdGhpcyBtYWdpYz8gKHRoZSAiMSIgcGFydCkgKi8KKyAgICAgICAgd2hpbGUgKChfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfU1RBVFVTKSkgJiAweGYxKSAhPSAxKQorICAgICAgICAgICAgICAgIDsKKworICAgICAgICBDU19EQkdPVVQoQ1NfSU5JVCwgNCwgCisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBzdGF0dXM6ICUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX1NUQVRVUykpICYgMHhmZmZmZmZmZikpKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXJkbWFfcmVnX2FjY2VzcyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcywgdTY0IGRhdGEpCit7CisgICAgICAgIHNlcmRtYV90ICpkID0gJnMtPmRtYV9kYWM7CisgICAgICAgIHU2NCAqZGF0YV9wOworICAgICAgICB1bnNpZ25lZCBzd3B0cjsKKyAgICAgICAgaW50IGZsYWdzOworICAgICAgICBzZXJkbWFfZGVzY3JfdCAqZGVzY3I7CisKKyAgICAgICAgaWYgKHMtPnJlZ19yZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQyOTdhOiBhdHRlbXB0IHRvIGlzc3VlIG11bHRpcGxlIHJlZ19hY2Nlc3NcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5lbmEgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgICAgIC8qIFNpbmNlIGEgd3JpdGVyIGhhcyB0aGUgRFNQIG9wZW4sIHdlIGhhdmUgdG8gbXV4IHRoZQorICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgaW4gKi8KKyAgICAgICAgICAgICAgICBzLT5yZWdfcmVxdWVzdCA9IGRhdGE7CisgICAgICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcy0+ZG1hX2RhYy5yZWdfd2FpdCk7CisgICAgICAgICAgICAgICAgLyogWFhYS1cgaG93IGNhbiBJIGRlYWwgd2l0aCB0aGUgc3RhcnZhdGlvbiBjYXNlIHdoZXJlCisgICAgICAgICAgICAgICAgICAgdGhlIG9wZW5lciBpc24ndCB3cml0aW5nPyAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEJlIHNhZmUgd2hlbiBjaGFuZ2luZyByaW5nIHBvaW50ZXJzICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKGQtPmh3cHRyICE9IGQtPnN3cHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IHJlZyBhY2Nlc3MgZm91bmQgYm9va2tlZXBpbmcgZXJyb3IgKGh3L3N3ID0gJWQvJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+aHdwdHIsIGQtPnN3cHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dwdHIgPSBkLT5zd3B0cjsKKyAgICAgICAgICAgICAgICBkLT5od3B0ciA9IGQtPnN3cHRyID0gKGQtPnN3cHRyICsgMSkgJSBkLT5yaW5nc3o7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIGRlc2NyID0gJmQtPmRlc2NydGFiW3N3cHRyXTsKKyAgICAgICAgICAgICAgICBkYXRhX3AgPSAmZC0+ZG1hX2J1Zltzd3B0ciAqIDRdOworCQkqZGF0YV9wID0gY3B1X3RvX2JlNjQoZGF0YSk7CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVxKDEsIFNTX0NTUihSX1NFUl9ETUFfRFNDUl9DT1VOVF9UWCkpOworICAgICAgICAgICAgICAgIENTX0RCR09VVChDU19ERVNDUiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogYWRkX3R4ICAlcCAoJXggLT4gJXgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wLCBzd3B0ciwgZC0+aHdwdHIpKTsKKyAgICAgICAgfQorCisgICAgICAgIENTX0RCR09VVChDU19GVU5DVElPTiwgNiwKKyAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHNlcmRtYV9yZWdfYWNjZXNzKCktXG4iKSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gMDsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAiY3M0Mjk3YV9yZWFkX2FjOTciIC0tIFJlYWRzIGFuIEFDOTcgcmVnaXN0ZXIKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludCBjczQyOTdhX3JlYWRfYWM5NyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcywgdTMyIG9mZnNldCwKKwkJCSAgICB1MzIgKiB2YWx1ZSkKK3sKKyAgICAgICAgQ1NfREJHT1VUKENTX0FDOTcsIDEsCisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiByZWFkIHJlZyAlMnhcbiIsIG9mZnNldCkpOworICAgICAgICBpZiAoc2VyZG1hX3JlZ19hY2Nlc3MocywgKDB4Q0xMIDw8IDYwKSB8ICgxTEwgPDwgNDcpIHwgKCh1NjQpKG9mZnNldCAmIDB4N0YpIDw8IDQwKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGludGVycnVwdGlibGVfc2xlZXBfb24oJnMtPmRtYV9hZGMucmVnX3dhaXQpOworICAgICAgICAqdmFsdWUgPSBzLT5yZWFkX3ZhbHVlOworICAgICAgICBDU19EQkdPVVQoQ1NfQUM5NywgMiwKKyAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHJkciByZWcgJXggLT4gJXhcbiIsIHMtPnJlYWRfcmVnLCBzLT5yZWFkX3ZhbHVlKSk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAiY3M0Mjk3YV93cml0ZV9hYzk3KCkiLS0gd3JpdGVzIGFuIEFDOTcgcmVnaXN0ZXIKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludCBjczQyOTdhX3dyaXRlX2FjOTcoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMsIHUzMiBvZmZzZXQsCisJCQkgICAgIHUzMiB2YWx1ZSkKK3sKKyAgICAgICAgQ1NfREJHT1VUKENTX0FDOTcsIDEsCisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiB3cml0ZSByZWcgJTJ4IC0+ICUwNHhcbiIsIG9mZnNldCwgdmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIChzZXJkbWFfcmVnX2FjY2VzcyhzLCAoMHhFTEwgPDwgNjApIHwgKCh1NjQpKG9mZnNldCAmIDB4N0YpIDw8IDQwKSB8ICgodmFsdWUgJiAweGZmZmYpIDw8IDEyKSkpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUsIDMsIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHN0b3BfZGFjKCk6XG4iKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5lbmEgJj0gfkZNT0RFX1dSSVRFOworI2lmIDAKKyAgICAgICAgLyogWFhYS1cgd2hhdCBkbyBJIHJlYWxseSB3YW50IGhlcmU/ICBNeSB0aGVvcnkgZm9yIG5vdyBpcworICAgICAgICAgICB0aGF0IEkganVzdCBmbGlwIHRoZSAiZW5hIiBiaXQsIGFuZCB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAgICAgICAgICAgd2lsbCBzdG9wIHByb2Nlc3NpbmcgdGhlIHhtaXQgY2hhbm5lbCAqLworICAgICAgICBfX3Jhd193cml0ZXEoKHMtPmVuYSAmIEZNT0RFX1JFQUQpID8gTV9TWU5DU0VSX0RNQV9SWF9FTiA6IDAsCisgICAgICAgICAgICAgIFNTX0NTUihSX1NFUl9ETUFfRU5BQkxFKSk7CisjZW5kaWYKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogc3RhcnRfZGFjKCkrXG4iKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5lbmEgJiBGTU9ERV9XUklURSkgJiYgKHMtPmRtYV9kYWMubWFwcGVkIHx8CisJCQkJCShzLT5kbWFfZGFjLmNvdW50ID4gMAorCSAgICAJCQkJJiYgcy0+ZG1hX2RhYy5yZWFkeSkpKSB7CisJCXMtPmVuYSB8PSBGTU9ERV9XUklURTsKKyAgICAgICAgICAgICAgICAvKiBYWFhLVyB3aGF0IGRvIEkgcmVhbGx5IHdhbnQgaGVyZT8gIE15IHRoZW9yeSBmb3IKKyAgICAgICAgICAgICAgICAgICBub3cgaXMgdGhhdCBJIGp1c3QgZmxpcCB0aGUgImVuYSIgYml0LCBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBzdGFydCBwcm9jZXNzaW5nIHRoZSB4bWl0CisgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAqLworCisJCUNTX0RCR09VVChDU19XQVZFX1dSSVRFIHwgQ1NfUEFSTVMsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyOTdhOiBzdGFydF9kYWMoKTogc3RhcnQgZG1hXG4iKSk7CisKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBzdGFydF9kYWMoKS1cbiIpKTsKK30KKworCitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAzLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHN0b3BfYWRjKCkrXG4iKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmVuYSAmPSB+Rk1PREVfUkVBRDsKKworCWlmIChzLT5jb252ZXJzaW9uID09IDEpIHsKKwkJcy0+Y29udmVyc2lvbiA9IDA7CisJCXMtPnByb3BfYWRjLmZtdCA9IHMtPnByb3BfYWRjLmZtdF9vcmlnaW5hbDsKKwl9CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gcmVhbGx5LCBJIG5lZWQgdG8ga2VlcCB0aGUgRE1BIGdvaW5nCisgICAgICAgICAgIFhYWEtXIHdoZW4gZG8gSSBnZXQgaGVyZSwgYW5kIGlzIHRoZXJlIG1vcmUgSSBzaG91bGQgZG8/ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBzdG9wX2FkYygpLVxuIikpOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHN0YXJ0X2FkYygpK1xuIikpOworCisJaWYgKCEocy0+ZW5hICYgRk1PREVfUkVBRCkgJiYKKwkgICAgKHMtPmRtYV9hZGMubWFwcGVkIHx8IHMtPmRtYV9hZGMuY291bnQgPD0KKwkgICAgIChzaWduZWQpIChzLT5kbWFfYWRjLnNidWZzeiAtIDIgKiBzLT5kbWFfYWRjLmZyYWdzaXplKSkKKwkgICAgJiYgcy0+ZG1hX2FkYy5yZWFkeSkgeworCQlpZiAocy0+cHJvcF9hZGMuZm10ICYgQUZNVF9TOCB8fCBzLT5wcm9wX2FkYy5mbXQgJiBBRk1UX1U4KSB7CisJCQkvLyAKKwkJCS8vIG5vdyBvbmx5IHVzZSAxNiBiaXQgY2FwdHVyZSwgZHVlIHRvIHRydW5jYXRpb24gaXNzdWUKKwkJCS8vIGluIHRoZSBjaGlwLCBub3RpY2FibGUgZGlzdG9ydGlvbiBvY2N1cnMuCisJCQkvLyBhbGxvY2F0ZSBidWZmZXIgYW5kIHRoZW4gY29udmVydCBmcm9tIDE2IGJpdCB0byAKKwkJCS8vIDggYml0IGZvciB0aGUgdXNlciBidWZmZXIuCisJCQkvLworCQkJcy0+cHJvcF9hZGMuZm10X29yaWdpbmFsID0gcy0+cHJvcF9hZGMuZm10OworCQkJaWYgKHMtPnByb3BfYWRjLmZtdCAmIEFGTVRfUzgpIHsKKwkJCQlzLT5wcm9wX2FkYy5mbXQgJj0gfkFGTVRfUzg7CisJCQkJcy0+cHJvcF9hZGMuZm10IHw9IEFGTVRfUzE2X0xFOworCQkJfQorCQkJaWYgKHMtPnByb3BfYWRjLmZtdCAmIEFGTVRfVTgpIHsKKwkJCQlzLT5wcm9wX2FkYy5mbXQgJj0gfkFGTVRfVTg7CisJCQkJcy0+cHJvcF9hZGMuZm10IHw9IEFGTVRfVTE2X0xFOworCQkJfQorCQkJLy8KKwkJCS8vIHByb2dfZG1hYnVmX2FkYyBwZXJmb3JtcyBhIHN0b3BfYWRjKCkgYnV0IHRoYXQgaXMKKwkJCS8vIG9rIHNpbmNlIHdlIHJlYWxseSBoYXZlbid0IHN0YXJ0ZWQgdGhlIERNQSB5ZXQuCisJCQkvLworCQkJcHJvZ19jb2RlYyhzLCBDU19UWVBFX0FEQyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2dfZG1hYnVmX2FkYyhzKTsKKwkJCXMtPmNvbnZlcnNpb24gPSAxOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmVuYSB8PSBGTU9ERV9SRUFEOworICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gcmVhbGx5LCBJIGFtIHByb2JhYmx5IGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICBETUFpbmcuLi4gIFhYWEtXIHdoZW4gZG8gSSBnZXQgaGVyZSwgYW5kIGlzIHRoZXJlCisgICAgICAgICAgICAgICAgICAgbW9yZSBJIHNob3VsZCBkbz8gKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJCUNTX0RCR09VVChDU19QQVJNUywgNiwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyOTdhOiBzdGFydF9hZGMoKTogc3RhcnQgYWRjXG4iKSk7CisJfQorCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBzdGFydF9hZGMoKS1cbiIpKTsKKworfQorCisKKy8vIGNhbGwgd2l0aCBzcGlubG9jayBoZWxkISAKK3N0YXRpYyB2b2lkIGNzNDI5N2FfdXBkYXRlX3B0cihzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcywgaW50IGludGZsYWcpCit7CisJaW50IGdvb2RfZGlmZiwgZGlmZiwgZGlmZjI7CisgICAgICAgIHU2NCAqZGF0YV9wLCBkYXRhOworICAgICAgICB1MzIgKnNfcHRyOworCXVuc2lnbmVkIGh3cHRyOworICAgICAgICB1MzIgc3RhdHVzOworICAgICAgICBzZXJkbWFfdCAqZDsKKyAgICAgICAgc2VyZG1hX2Rlc2NyX3QgKmRlc2NyOworCisJLy8gdXBkYXRlIEFEQyBwb2ludGVyIAorICAgICAgICBzdGF0dXMgPSBpbnRmbGFnID8gX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX1NUQVRVUykpIDogMDsKKworCWlmICgocy0+ZW5hICYgRk1PREVfUkVBRCkgfHwgKHN0YXR1cyAmIChNX1NZTkNTRVJfUlhfRU9QX0NPVU5UKSkpIHsKKyAgICAgICAgICAgICAgICBkID0gJnMtPmRtYV9hZGM7CisgICAgICAgICAgICAgICAgaHdwdHIgPSAodW5zaWduZWQpICgoKF9fcmF3X3JlYWRxKFNTX0NTUihSX1NFUl9ETUFfQ1VSX0RTQ1JfQUREUl9SWCkpICYgTV9ETUFfQ1VSRFNDUl9BRERSKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+ZGVzY3J0YWJfcGh5cykgLyBzaXplb2Yoc2VyZG1hX2Rlc2NyX3QpKTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5lbmEgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHVwZF9yY3Ygc3ctPmh3LT5odyAleC8leC8leCAoaW50LSVkKW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5zd3B0ciwgZC0+aHdwdHIsIGh3cHRyLCBpbnRmbGFnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgRE1BIGJ1ZmZlcnMgYXZhaWxhYmxlIGZvciBzb2Z0d2FyZTogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYyID0gZGlmZiA9IChkLT5yaW5nc3ogKyBod3B0ciAtIGQtPmh3cHRyKSAlIGQtPnJpbmdzejsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPmh3cHRyID0gaHdwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBnb29kX2RpZmYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc19wdHIgPSAodTMyICopJihkLT5kbWFfYnVmW2QtPnN3cHRyKjRdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyID0gJmQtPmRlc2NydGFiW2QtPnN3cHRyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkaWZmMi0tKSB7CisJCQkJdTY0IGRhdGEgPSBiZTY0X3RvX2NwdSgqKHU2NCAqKXNfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IGRlc2NyX2E7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBsZWZ0LCByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JfYSA9IGRlc2NyLT5kZXNjcl9hOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZGVzY3JfYSAmPSB+TV9ETUFfU0VSUlhfU09QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRlc2NyX2EgJiBNX0RNQV9EU0NSQV9BX0FERFIpICE9IENQSFlTQUREUigobG9uZylzX3B0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IFJYIEJhZCBhZGRyZXNzIChyZWFkKVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoZGF0YSAmIDB4OTgwMDAwMDAwMDAwMDAwMCkgIT0gMHg5ODAwMDAwMDAwMDAwMDAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEoZGVzY3JfYSAmIE1fRE1BX1NFUlJYX1NPUCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR19ETUFfRFNDUkJfUEtUX1NJWkUoZGVzY3ItPmRlc2NyX2IpICE9IEZSQU1FX0JZVEVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXRzLnJ4X2JhZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJjczQyOTdhOiBSWCBCYWQgYXR0cmlidXRlcyAocmVhZClcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXRzLnJ4X2dvb2QrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkYXRhID4+IDYxKSA9PSA3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVhZF92YWx1ZSA9IChkYXRhID4+IDEyKSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZWFkX3JlZyA9IChkYXRhID4+IDQwKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FrZV91cCgmZC0+cmVnX3dhaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5jb3VudCAmJiAoZC0+c2JfaHdwdHIgPT0gZC0+c2Jfc3dwdHIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhdHMucnhfb3ZlcmZsb3crKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiY3M0Mjk3YTogUlggb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RfZGlmZisrOworCQkJCWxlZnQgPSAoKGJlMzJfdG9fY3B1KHNfcHRyWzFdKSAmIDB4ZmYpIDw8IDgpIHwKKwkJCQkgICAgICAgKChiZTMyX3RvX2NwdShzX3B0clsyXSkgPj4gMjQpICYgMHhmZik7CisJCQkJcmlnaHQgPSAoYmUzMl90b19jcHUoc19wdHJbMl0pID4+IDQpICYgMHhmZmZmOworCQkJCSpkLT5zYl9od3B0cisrID0gY3B1X3RvX2JlMTYobGVmdCk7CisJCQkJKmQtPnNiX2h3cHRyKysgPSBjcHVfdG9fYmUxNihyaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5zYl9od3B0ciA9PSBkLT5zYl9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+c2JfaHdwdHIgPSBkLT5zYW1wbGVfYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgPT0gZC0+ZGVzY3J0YWJfZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3IgPSBkLT5kZXNjcnRhYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX3B0ciA9ICh1MzIgKilzLT5kbWFfYWRjLmRtYV9idWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc19wdHIgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZC0+dG90YWxfYnl0ZXMgKz0gZ29vZF9kaWZmICogRlJBTUVfU0FNUExFX0JZVEVTOworICAgICAgICAgICAgICAgICAgICAgICAgZC0+Y291bnQgKz0gZ29vZF9kaWZmICogRlJBTUVfU0FNUExFX0JZVEVTOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQtPmNvdW50ID4gZC0+c2J1ZnN6KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YTogYm9ndXMgcmVjZWl2ZSBvdmVyZmxvdyEhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPnN3cHRyID0gKGQtPnN3cHRyICsgZGlmZikgJSBkLT5yaW5nc3o7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3Jhd193cml0ZXEoZGlmZiwgU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0NPVU5UX1JYKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC0+bWFwcGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5jb3VudCA+PSAoc2lnbmVkKSBkLT5mcmFnc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWtlX3VwKCZkLT53YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5jb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3M0Mjk3YTogdXBkYXRlIGNvdW50IC0+ICVkXG4iLCBkLT5jb3VudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdha2VfdXAoJmQtPndhaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY2VpdmUgaXMgZ29pbmcgZXZlbiBpZiBubyBvbmUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmluZyAoZm9yIHJlZ2lzdGVyIGFjY2Vzc2VzIGFuZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgRklGTyBvdmVycnVuKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZjIgPSBkaWZmID0gKGh3cHRyICsgZC0+cmluZ3N6IC0gZC0+aHdwdHIpICUgZC0+cmluZ3N6OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YTogUlggZnVsbCBvciBlbXB0eT9cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjciA9ICZkLT5kZXNjcnRhYltkLT5zd3B0cl07CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3AgPSAmZC0+ZG1hX2J1ZltkLT5zd3B0cio0XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgdGhpcyB0byBoYXBwZW4gYXQgbGVhc3Qgb25jZTsgSSBnb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgYmVjYXVzZSBvZiBhbiBpbnRlcnJ1cHQsIHNvIHRoZXJlIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgYnVmZmVyIHRvIHByb2Nlc3MuICovCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisJCQkJZGF0YSA9IGJlNjRfdG9fY3B1KCpkYXRhX3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRlc2NyLT5kZXNjcl9hICYgTV9ETUFfRFNDUkFfQV9BRERSKSAhPSBDUEhZU0FERFIoKGxvbmcpZGF0YV9wKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YTogUlggQmFkIGFkZHJlc3MgJWQgKCVsbHggJWx4KVxuIiwgZC0+c3dwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKGRlc2NyLT5kZXNjcl9hICYgTV9ETUFfRFNDUkFfQV9BRERSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpQ1BIWVNBRERSKChsb25nKWRhdGFfcCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGRhdGEgJiAoMUxMIDw8IDYzKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZGVzY3ItPmRlc2NyX2EgJiBNX0RNQV9TRVJSWF9TT1ApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR19ETUFfRFNDUkJfUEtUX1NJWkUoZGVzY3ItPmRlc2NyX2IpICE9IEZSQU1FX0JZVEVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXRzLnJ4X2JhZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJjczQyOTdhOiBSWCBCYWQgYXR0cmlidXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhdHMucnhfZ29vZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZGF0YSA+PiA2MSkgPT0gNykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVhZF92YWx1ZSA9IChkYXRhID4+IDEyKSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlYWRfcmVnID0gKGRhdGEgPj4gNDApICYgMHg3ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdha2VfdXAoJmQtPnJlZ193YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRlc2NyX2EgJj0gfk1fRE1BX1NFUlJYX1NPUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3IrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+c3dwdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciA9PSBkLT5kZXNjcnRhYl9lbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjciA9IGQtPmRlc2NydGFiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPnN3cHRyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3AgPSBkLT5kbWFfYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlcSgxLCBTU19DU1IoUl9TRVJfRE1BX0RTQ1JfQ09VTlRfUlgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tZGlmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBkLT5od3B0ciA9IGh3cHRyOworCisgICAgICAgICAgICAgICAgICAgICAgICBDU19EQkdPVVQoQ1NfREVTQ1IsIDYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IGh3L3N3ICV4LyV4XG4iLCBkLT5od3B0ciwgZC0+c3dwdHIpKTsKKyAgICAgICAgICAgICAgICB9CisKKwkJQ1NfREJHT1VUKENTX1BBUk1TLCA4LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0Mjk3YTogY3M0Mjk3YV91cGRhdGVfcHRyKCk6IHM9MHglLjh4IGh3cHRyPSVkIHRvdGFsX2J5dGVzPSVkIGNvdW50PSVkIFxuIiwKKwkJCQkodW5zaWduZWQpcywgZC0+aHdwdHIsIAorCQkJCWQtPnRvdGFsX2J5dGVzLCBkLT5jb3VudCkpOworCX0KKworICAgICAgICAvKiBYWFhLVyB3b3JyeSBhYm91dCBzLT5yZWdfcmVxdWVzdCAtLSB0aGVyZSBpcyBhIHN0YXJ2YXRpb24KKyAgICAgICAgICAgY2FzZSBpZiBzLT5lbmEgaGFzIEZNT0RFX1dSSVRFIG9uLCBidXQgdGhlIGNsaWVudCBpc24ndAorICAgICAgICAgICBkb2luZyB3cml0ZXMgKi8KKworCS8vIHVwZGF0ZSBEQUMgcG9pbnRlciAKKwkvLworCS8vIGNoZWNrIGZvciBlbmQgb2YgYnVmZmVyLCBtZWFucyB0aGF0IHdlIGFyZSBnb2luZyB0byB3YWl0IGZvciBhbm90aGVyIGludGVycnVwdAorCS8vIHRvIGFsbG93IHNpbGVuY2UgdG8gZmlsbCB0aGUgZmlmb3Mgb24gdGhlIHBhcnQsIHRvIGtlZXAgcG9wcyBkb3duIHRvIGEgbWluaW11bS4KKwkvLworCWlmIChzLT5lbmEgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgICAgIHNlcmRtYV90ICpkID0gJnMtPmRtYV9kYWM7CisgICAgICAgICAgICAgICAgaHdwdHIgPSAodW5zaWduZWQpICgoKF9fcmF3X3JlYWRxKFNTX0NTUihSX1NFUl9ETUFfQ1VSX0RTQ1JfQUREUl9UWCkpICYgTV9ETUFfQ1VSRFNDUl9BRERSKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+ZGVzY3J0YWJfcGh5cykgLyBzaXplb2Yoc2VyZG1hX2Rlc2NyX3QpKTsKKyAgICAgICAgICAgICAgICBkaWZmID0gKGQtPnJpbmdzeiArIGh3cHRyIC0gZC0+aHdwdHIpICUgZC0+cmluZ3N6OworICAgICAgICAgICAgICAgIENTX0RCR09VVChDU19XQVZFX1dSSVRFLCA0LCBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3M0Mjk3YTogY3M0Mjk3YV91cGRhdGVfcHRyKCk6IGh3L2h3L3N3ICV4LyV4LyV4IGRpZmYgJWQgY291bnQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5od3B0ciwgaHdwdHIsIGQtPnN3cHRyLCBkaWZmLCBkLT5jb3VudCkpOworICAgICAgICAgICAgICAgIGQtPmh3cHRyID0gaHdwdHI7CisgICAgICAgICAgICAgICAgLyogWFhYS1cgc3RlcmVvPyBjb252ZXJzaW9uPyBKdXN0IGFzc3VtZSAyIDE2LWJpdCBzYW1wbGVzIGZvciBub3cgKi8KKyAgICAgICAgICAgICAgICBkLT50b3RhbF9ieXRlcyArPSBkaWZmICogRlJBTUVfU0FNUExFX0JZVEVTOworCQlpZiAoZC0+bWFwcGVkKSB7CisJCQlkLT5jb3VudCArPSBkaWZmICogRlJBTUVfU0FNUExFX0JZVEVTOworCQkJaWYgKGQtPmNvdW50ID49IGQtPmZyYWdzaXplKSB7CisJCQkJZC0+d2FrZXVwID0gMTsKKwkJCQl3YWtlX3VwKCZkLT53YWl0KTsKKwkJCQlpZiAoZC0+Y291bnQgPiBkLT5zYnVmc3opCisJCQkJCWQtPmNvdW50ICY9IGQtPnNidWZzeiAtIDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkLT5jb3VudCAtPSBkaWZmICogRlJBTUVfU0FNUExFX0JZVEVTOworCQkJaWYgKGQtPmNvdW50IDw9IDApIHsKKwkJCQkvLworCQkJCS8vIGZpbGwgd2l0aCBzaWxlbmNlLCBhbmQgZG8gbm90IHNodXQgZG93biB0aGUgREFDLgorCQkJCS8vIENvbnRpbnVlIHRvIHBsYXkgc2lsZW5jZSB1bnRpbCB0aGUgX3JlbGVhc2UuCisJCQkJLy8KKwkJCQlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSwgNiwgcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiY3M0Mjk3YTogY3M0Mjk3YV91cGRhdGVfcHRyKCk6IG1lbXNldCAlZCBhdCAweCUuOHggZm9yICVkIHNpemUgXG4iLAorCQkJCQkJKHVuc2lnbmVkKShzLT5wcm9wX2RhYy5mbXQgJiAKKwkJCQkJCShBRk1UX1U4IHwgQUZNVF9VMTZfTEUpKSA/IDB4ODAgOiAwLCAKKwkJCQkJCSh1bnNpZ25lZClkLT5kbWFfYnVmLCAKKwkJCQkJCWQtPnJpbmdzeikpOworCQkJCW1lbXNldChkLT5kbWFfYnVmLCAwLCBkLT5yaW5nc3ogKiBGUkFNRV9CWVRFUyk7CisJCQkJaWYgKGQtPmNvdW50IDwgMCkgeworCQkJCQlkLT51bmRlcnJ1biA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhdHMudHhfdW5kZXJydW4rKzsKKwkJCQkJZC0+Y291bnQgPSAwOworCQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDksIHByaW50ayhLRVJOX0lORk8KKwkJCQkJICJjczQyOTdhOiBjczQyOTdhX3VwZGF0ZV9wdHIoKTogdW5kZXJydW5cbiIpKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGQtPmNvdW50IDw9CisJCQkJICAgKHNpZ25lZCkgZC0+ZnJhZ3NpemUKKwkJCQkgICAmJiAhZC0+ZW5kY2xlYXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFhLVyB3aGF0IGlzIHRoaXMgZm9yPyAqLworCQkJCWNsZWFyX2FkdmFuY2UoZC0+ZG1hX2J1ZiwKKwkJCQkJICAgICAgZC0+c2J1ZnN6LAorCQkJCQkgICAgICBkLT5zd3B0ciwKKwkJCQkJICAgICAgZC0+ZnJhZ3NpemUsCisJCQkJCSAgICAgIDApOworCQkJCWQtPmVuZGNsZWFyZWQgPSAxOworCQkJfQorCQkJaWYgKCAoZC0+Y291bnQgPD0gKHNpZ25lZCkgZC0+c2J1ZnN6LzIpIHx8IGludGZsYWcpCisJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX0RCR09VVChDU19XQVZFX1dSSVRFLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjczQyOTdhOiB1cGRhdGUgY291bnQgLT4gJWRcbiIsIGQtPmNvdW50KSk7CisJCQkJd2FrZV91cCgmZC0+d2FpdCk7CisJCQl9CisJCX0KKwkJQ1NfREJHT1VUKENTX1BBUk1TLCA4LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0Mjk3YTogY3M0Mjk3YV91cGRhdGVfcHRyKCk6IHM9MHglLjh4IGh3cHRyPSVkIHRvdGFsX2J5dGVzPSVkIGNvdW50PSVkIFxuIiwKKwkJCQkodW5zaWduZWQpIHMsIGQtPmh3cHRyLCAKKwkJCQlkLT50b3RhbF9ieXRlcywgZC0+Y291bnQpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWl4ZXJfaW9jdGwoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvLyBJbmRleCB0byBtaXhlcl9zcmNbXSBpcyB2YWx1ZSBvZiBBQzk3IElucHV0IE11eCBTZWxlY3QgUmVnLgorCS8vIFZhbHVlIG9mIGFycmF5IG1lbWJlciBpcyByZWNvcmRpbmcgc291cmNlIERldmljZSBJRCBNYXNrLgorCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWl4ZXJfc3JjWzhdID0geworCQlTT1VORF9NQVNLX01JQywgU09VTkRfTUFTS19DRCwgMCwgU09VTkRfTUFTS19MSU5FMSwKKwkJU09VTkRfTUFTS19MSU5FLCBTT1VORF9NQVNLX1ZPTFVNRSwgMCwgMAorCX07CisKKwkvLyBJbmRleCBvZiBtaXh0YWJsZTFbXSBtZW1iZXIgaXMgRGV2aWNlIElEIAorCS8vIGFuZCBtdXN0IGJlIDw9IFNPVU5EX01JWEVSX05SREVWSUNFUy4KKwkvLyBWYWx1ZSBvZiBhcnJheSBtZW1iZXIgaXMgaW5kZXggaW50byBzLT5taXgudm9sW10KKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtaXh0YWJsZTFbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9IHsKKwkJW1NPVU5EX01JWEVSX1BDTV0gPSAxLAkvLyB2b2ljZSAKKwkJW1NPVU5EX01JWEVSX0xJTkUxXSA9IDIsCS8vIEFVWAorCQlbU09VTkRfTUlYRVJfQ0RdID0gMywJLy8gQ0QgCisJCVtTT1VORF9NSVhFUl9MSU5FXSA9IDQsCS8vIExpbmUgCisJCVtTT1VORF9NSVhFUl9TWU5USF0gPSA1LAkvLyBGTQorCQlbU09VTkRfTUlYRVJfTUlDXSA9IDYsCS8vIE1pYyAKKwkJW1NPVU5EX01JWEVSX1NQRUFLRVJdID0gNywJLy8gU3BlYWtlciAKKwkJW1NPVU5EX01JWEVSX1JFQ0xFVl0gPSA4LAkvLyBSZWNvcmRpbmcgbGV2ZWwgCisJCVtTT1VORF9NSVhFUl9WT0xVTUVdID0gOQkvLyBNYXN0ZXIgVm9sdW1lIAorCX07CisKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgbWl4cmVnW10gPSB7CisJCUFDOTdfUENNT1VUX1ZPTCwKKwkJQUM5N19BVVhfVk9MLAorCQlBQzk3X0NEX1ZPTCwKKwkJQUM5N19MSU5FSU5fVk9MCisJfTsKKwl1bnNpZ25lZCBjaGFyIGwsIHIsIHJsLCByciwgdmlkeDsKKwl1bnNpZ25lZCBjaGFyIGF0dGVudGJsWzExXSA9CisJICAgIHsgNjMsIDQyLCAyNiwgMTcsIDE0LCAxMSwgOCwgNiwgNCwgMiwgMCB9OworCXVuc2lnbmVkIHRlbXAxOworCWludCBpLCB2YWw7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8KKwkJICJjczQyOTdhOiBtaXhlcl9pb2N0bCgpOiBzPTB4JS44eCBjbWQ9MHglLjh4XG4iLAorCQkJICh1bnNpZ25lZCkgcywgY21kKSk7CisjaWYgQ1NERUJVRworCWNzX3ByaW50aW9jdGwoY21kKTsKKyNlbmRpZgorI2lmIENTREVCVUdfSU5URVJGQUNFCisKKwlpZiAoKGNtZCA9PSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLKSB8fAorCSAgICAoY21kID09IFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0spIHx8CisJICAgIChjbWQgPT0gU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUwpIHx8CisJICAgIChjbWQgPT0gU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUwpKQorCXsKKwkJc3dpdGNoIChjbWQpIHsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0s6CisJCQlyZXR1cm4gcHV0X3VzZXIoY3NfZGVidWdtYXNrLAorCQkJCQkodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCisJCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUw6CisJCQlyZXR1cm4gcHV0X3VzZXIoY3NfZGVidWdsZXZlbCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgKikgYXJnKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJY3NfZGVidWdtYXNrID0gdmFsOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTDoKKwkJCWlmIChnZXRfdXNlcih2YWwsICh1bnNpZ25lZCBsb25nICopIGFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQljc19kZWJ1Z2xldmVsID0gdmFsOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8KKwkJCQkiY3M0Mjk3YTogbWl4ZXJfaW9jdGwoKTogRVJST1IgdW5rbm93biBkZWJ1ZyBjbWRcbiIpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfUFJJVkFURTIpIHsKKwkJLy8gZW5hYmxlL2Rpc2FibGUvcXVlcnkgc3BhdGlhbGl6ZXIgCisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IC0xKSB7CisJCQl0ZW1wMSA9ICh2YWwgJiAweDNmKSA+PiAyOworCQkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsIEFDOTdfM0RfQ09OVFJPTCwgdGVtcDEpOworCQkJY3M0Mjk3YV9yZWFkX2FjOTcocywgQUM5N19HRU5FUkFMX1BVUlBPU0UsCisJCQkJCSAmdGVtcDEpOworCQkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsIEFDOTdfR0VORVJBTF9QVVJQT1NFLAorCQkJCQkgIHRlbXAxIHwgMHgyMDAwKTsKKwkJfQorCQljczQyOTdhX3JlYWRfYWM5NyhzLCBBQzk3XzNEX0NPTlRST0wsICZ0ZW1wMSk7CisJCXJldHVybiBwdXRfdXNlcigodGVtcDEgPDwgMikgfCAzLCAoaW50ICopIGFyZyk7CisJfQorCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfSU5GTykgeworCQltaXhlcl9pbmZvIGluZm87CisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJc3RybGNweShpbmZvLmlkLCAiQ1M0Mjk3YSIsIHNpemVvZihpbmZvLmlkKSk7CisJCXN0cmxjcHkoaW5mby5uYW1lLCAiQ3J5c3RhbCBDUzQyOTdhIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpbmZvLm1vZGlmeV9jb3VudGVyID0gcy0+bWl4Lm1vZGNudDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CisJCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCXN0cmxjcHkoaW5mby5pZCwgIkNTNDI5N2EiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgIkNyeXN0YWwgQ1M0Mjk3YSIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IE9TU19HRVRWRVJTSU9OKQorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgKGludCAqKSBhcmcpOworCisJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdNJyB8fCBfU0lPQ19TSVpFKGNtZCkgIT0gc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gSWYgaW9jdGwgaGFzIG9ubHkgdGhlIFNJT0NfUkVBRCBiaXQoYml0IDMxKQorCS8vIG9uLCBwcm9jZXNzIHRoZSBvbmx5LXJlYWQgY29tbWFuZHMuIAorCWlmIChfU0lPQ19ESVIoY21kKSA9PSBfU0lPQ19SRUFEKSB7CisJCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgkvLyBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAKKwkJCWNzNDI5N2FfcmVhZF9hYzk3KHMsIEFDOTdfUkVDT1JEX1NFTEVDVCwKKwkJCQkJICZ0ZW1wMSk7CisJCQlyZXR1cm4gcHV0X3VzZXIobWl4ZXJfc3JjW3RlbXAxICYgN10sIChpbnQgKikgYXJnKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CS8vIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgZGV2aWNlIAorCQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKKwkJCQkJU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX1JFQ0xFViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ICopIGFyZyk7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgkvLyBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgCisJCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19WT0xVTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCAqKSBhcmcpOworCisJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoJLy8gTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gCisJCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAorCQkJCQlTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfUkVDTEVWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgKikgYXJnKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfQ0FQX0VYQ0xfSU5QVVQsIChpbnQgKikgYXJnKTsKKworCQlkZWZhdWx0OgorCQkJaSA9IF9JT0NfTlIoY21kKTsKKwkJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUworCQkJICAgIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFt2aWR4IC0gMV0sIChpbnQgKikgYXJnKTsKKwkJfQorCX0KKwkvLyBJZiBpb2N0bCBkb2Vzbid0IGhhdmUgYm90aCB0aGUgU0lPQ19SRUFEIGFuZCAKKwkvLyB0aGUgU0lPQ19XUklURSBiaXQgc2V0LCByZXR1cm4gaW52YWxpZC4KKwlpZiAoX1NJT0NfRElSKGNtZCkgIT0gKF9TSU9DX1JFQUQgfCBfU0lPQ19XUklURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvZiB2b2x1bWUgd3JpdGVzLgorCXMtPm1peC5tb2RjbnQrKzsKKworCS8vIElzb2xhdGUgdGhlIGNvbW1hbmQ7IGl0IG11c3QgYmUgYSB3cml0ZS4KKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CS8vIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlIAorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaSA9IGh3ZWlnaHQzMih2YWwpOwkvLyBpID0gIyBiaXRzIG9uIGluIHZhbC4KKwkJaWYgKGkgIT0gMSkJLy8gT25lICYgb25seSAxIGJpdCBtdXN0IGJlIG9uLgorCQkJcmV0dXJuIDA7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobWl4ZXJfc3JjKSAvIHNpemVvZihpbnQpOyBpKyspIHsKKwkJCWlmICh2YWwgPT0gbWl4ZXJfc3JjW2ldKSB7CisJCQkJdGVtcDEgPSAoaSA8PCA4KSB8IGk7CisJCQkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsCisJCQkJCQkgIEFDOTdfUkVDT1JEX1NFTEVDVCwKKwkJCQkJCSAgdGVtcDEpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOwkvLyBNYXggc291bmRjYXJkLmggdm9sIGlzIDEwMC4KKwkJaWYgKGwgPCA2KSB7CisJCQlybCA9IDYzOworCQkJbCA9IDA7CisJCX0gZWxzZQorCQkJcmwgPSBhdHRlbnRibFsoMTAgKiBsKSAvIDEwMF07CS8vIENvbnZlcnQgMC0xMDAgdm9sIHRvIDYzLTAgYXR0ZW4uCisKKwkJciA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlpZiAociA+IDEwMCkKKwkJCXIgPSAxMDA7CS8vIE1heCByaWdodCB2b2x1bWUgaXMgMTAwLCB0b28KKwkJaWYgKHIgPCA2KSB7CisJCQlyciA9IDYzOworCQkJciA9IDA7CisJCX0gZWxzZQorCQkJcnIgPSBhdHRlbnRibFsoMTAgKiByKSAvIDEwMF07CS8vIENvbnZlcnQgdm9sdW1lIHRvIGF0dGVudWF0aW9uLgorCisJCWlmICgocmwgPiA2MCkgJiYgKHJyID4gNjApKQkvLyBJZiBib3RoIGwgJiByIGFyZSAnbG93JywgICAgICAgICAgCisJCQl0ZW1wMSA9IDB4ODAwMDsJLy8gIHR1cm4gb24gdGhlIG11dGUgYml0LgorCQllbHNlCisJCQl0ZW1wMSA9IDA7CisKKwkJdGVtcDEgfD0gKHJsIDw8IDgpIHwgcnI7CisKKwkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIHRlbXAxKTsKKwkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsIEFDOTdfUEhPTkVfVk9MLCB0ZW1wMSk7CisKKyNpZmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKwkJcy0+bWl4LnZvbFs4XSA9ICgodW5zaWduZWQgaW50KSByIDw8IDgpIHwgbDsKKyNlbHNlCisJCXMtPm1peC52b2xbOF0gPSB2YWw7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbOF0sIChpbnQgKikgYXJnKTsKKworCWNhc2UgU09VTkRfTUlYRVJfU1BFQUtFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCWlmIChsIDwgMykgeworCQkJcmwgPSAwOworCQkJbCA9IDA7CisJCX0gZWxzZSB7CisJCQlybCA9IChsICogMiAtIDUpIC8gMTM7CS8vIENvbnZlcnQgMC0xMDAgcmFuZ2UgdG8gMC0xNS4KKwkJCWwgPSAocmwgKiAxMyArIDUpIC8gMjsKKwkJfQorCisJCWlmIChybCA8IDMpIHsKKwkJCXRlbXAxID0gMHg4MDAwOworCQkJcmwgPSAwOworCQl9IGVsc2UKKwkJCXRlbXAxID0gMDsKKwkJcmwgPSAxNSAtIHJsOwkvLyBDb252ZXJ0IHZvbHVtZSB0byBhdHRlbnVhdGlvbi4KKwkJdGVtcDEgfD0gcmwgPDwgMTsKKwkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsIEFDOTdfUENCRUVQX1ZPTCwgdGVtcDEpOworCisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCXMtPm1peC52b2xbNl0gPSBsIDw8IDg7CisjZWxzZQorCQlzLT5taXgudm9sWzZdID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzZdLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCXIgPSAodmFsID4+IDgpICYgMHhmZjsKKwkJaWYgKHIgPiAxMDApCisJCQlyID0gMTAwOworCQlybCA9IChsICogMiAtIDUpIC8gMTM7CS8vIENvbnZlcnQgMC0xMDAgc2NhbGUgdG8gMC0xNS4KKwkJcnIgPSAociAqIDIgLSA1KSAvIDEzOworCQlpZiAocmwgPCAzICYmIHJyIDwgMykKKwkJCXRlbXAxID0gMHg4MDAwOworCQllbHNlCisJCQl0ZW1wMSA9IDA7CisKKwkJdGVtcDEgPSB0ZW1wMSB8IChybCA8PCA4KSB8IHJyOworCQljczQyOTdhX3dyaXRlX2FjOTcocywgQUM5N19SRUNPUkRfR0FJTiwgdGVtcDEpOworCisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCXMtPm1peC52b2xbN10gPSAoKHVuc2lnbmVkIGludCkgciA8PCA4KSB8IGw7CisjZWxzZQorCQlzLT5taXgudm9sWzddID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzddLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNPVU5EX01JWEVSX01JQzoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCWlmIChsIDwgMSkgeworCQkJbCA9IDA7CisJCQlybCA9IDA7CisJCX0gZWxzZSB7CisJCQlybCA9ICgodW5zaWduZWQpIGwgKiA1IC0gNCkgLyAxNjsJLy8gQ29udmVydCAwLTEwMCByYW5nZSB0byAwLTMxLgorCQkJbCA9IChybCAqIDE2ICsgNCkgLyA1OworCQl9CisJCWNzNDI5N2FfcmVhZF9hYzk3KHMsIEFDOTdfTUlDX1ZPTCwgJnRlbXAxKTsKKwkJdGVtcDEgJj0gMHg0MDsJLy8gSXNvbGF0ZSAyMGRiIGdhaW4gYml0LgorCQlpZiAocmwgPCAzKSB7CisJCQl0ZW1wMSB8PSAweDgwMDA7CisJCQlybCA9IDA7CisJCX0KKwkJcmwgPSAzMSAtIHJsOwkvLyBDb252ZXJ0IHZvbHVtZSB0byBhdHRlbnVhdGlvbi4KKwkJdGVtcDEgfD0gcmw7CisJCWNzNDI5N2Ffd3JpdGVfYWM5NyhzLCBBQzk3X01JQ19WT0wsIHRlbXAxKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sWzVdID0gdmFsIDw8IDg7CisjZWxzZQorCQlzLT5taXgudm9sWzVdID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzVdLCAoaW50ICopIGFyZyk7CisKKworCWNhc2UgU09VTkRfTUlYRVJfU1lOVEg6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJciA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlpZiAociA+IDEwMCkKKwkJCXIgPSAxMDA7CisJCXJsID0gKGwgKiAyIC0gMTEpIC8gMzsJLy8gQ29udmVydCAwLTEwMCByYW5nZSB0byAwLTYzLgorCQlyciA9IChyICogMiAtIDExKSAvIDM7CisJCWlmIChybCA8IDMpCS8vIElmIGwgaXMgbG93LCB0dXJuIG9uCisJCQl0ZW1wMSA9IDB4MDA4MDsJLy8gIHRoZSBtdXRlIGJpdC4KKwkJZWxzZQorCQkJdGVtcDEgPSAwOworCisJCXJsID0gNjMgLSBybDsJLy8gQ29udmVydCB2b2wgdG8gYXR0ZW51YXRpb24uCisvLwkJd3JpdGVsKHRlbXAxIHwgcmwsIHMtPnBCQTAgKyBGTUxWQyk7CisJCWlmIChyciA8IDMpCS8vICBJZiByciBpcyBsb3csIHR1cm4gb24KKwkJCXRlbXAxID0gMHgwMDgwOwkvLyAgIHRoZSBtdXRlIGJpdC4KKwkJZWxzZQorCQkJdGVtcDEgPSAwOworCQlyciA9IDYzIC0gcnI7CS8vIENvbnZlcnQgdm9sIHRvIGF0dGVudWF0aW9uLgorLy8JCXdyaXRlbCh0ZW1wMSB8IHJyLCBzLT5wQkEwICsgRk1SVkMpOworCisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCXMtPm1peC52b2xbNF0gPSAociA8PCA4KSB8IGw7CisjZWxzZQorCQlzLT5taXgudm9sWzRdID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzRdLCAoaW50ICopIGFyZyk7CisKKworCWRlZmF1bHQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI5N2E6IG1peGVyX2lvY3RsKCk6IGRlZmF1bHRcbiIpKTsKKworCQlpID0gX0lPQ19OUihjbWQpOworCQlpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgISh2aWR4ID0gbWl4dGFibGUxW2ldKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbCA9IHZhbCAmIDB4ZmY7CisJCWlmIChsID4gMTAwKQorCQkJbCA9IDEwMDsKKwkJaWYgKGwgPCAxKSB7CisJCQlsID0gMDsKKwkJCXJsID0gMzE7CisJCX0gZWxzZQorCQkJcmwgPSAoYXR0ZW50YmxbKGwgKiAxMCkgLyAxMDBdKSA+PiAxOworCisJCXIgPSAodmFsID4+IDgpICYgMHhmZjsKKwkJaWYgKHIgPiAxMDApCisJCQlyID0gMTAwOworCQlpZiAociA8IDEpIHsKKwkJCXIgPSAwOworCQkJcnIgPSAzMTsKKwkJfSBlbHNlCisJCQlyciA9IChhdHRlbnRibFsociAqIDEwKSAvIDEwMF0pID4+IDE7CisJCWlmICgocmwgPiAzMCkgJiYgKHJyID4gMzApKQorCQkJdGVtcDEgPSAweDgwMDA7CisJCWVsc2UKKwkJCXRlbXAxID0gMDsKKwkJdGVtcDEgPSB0ZW1wMSB8IChybCA8PCA4KSB8IHJyOworCQljczQyOTdhX3dyaXRlX2FjOTcocywgbWl4cmVnW3ZpZHggLSAxXSwgdGVtcDEpOworCisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCXMtPm1peC52b2xbdmlkeCAtIDFdID0gKCh1bnNpZ25lZCBpbnQpIHIgPDwgOCkgfCBsOworI2Vsc2UKKwkJcy0+bWl4LnZvbFt2aWR4IC0gMV0gPSB2YWw7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbdmlkeCAtIDFdLCAoaW50ICopIGFyZyk7CisJfQorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworc3RhdGljIGludCBjczQyOTdhX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnM9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDQsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogY3M0Mjk3YV9vcGVuX21peGRldigpK1xuIikpOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDI5N2FfZGV2cykKKwl7CisJCXMgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSwgbGlzdCk7CisJCWlmKHMtPmRldl9taXhlciA9PSBtaW5vcikKKwkJCWJyZWFrOworCX0KKwlpZiAoIXMpCisJeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOIHwgQ1NfRVJST1IsIDIsCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBjczQyOTdhX29wZW5fbWl4ZGV2KCktIC1FTk9ERVZcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCA0LAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IGNzNDI5N2Ffb3Blbl9taXhkZXYoKS0gMFxuIikpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisKK3N0YXRpYyBpbnQgY3M0Mjk3YV9yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNzNDI5N2FfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBtaXhlcl9pb2N0bCgoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhLCBjbWQsCisJCQkgICBhcmcpOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gICBNaXhlciBmaWxlIG9wZXJhdGlvbnMgc3RydWN0LgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzNDI5N2FfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IGNzNDI5N2FfaW9jdGxfbWl4ZGV2LAorCS5vcGVuCQk9IGNzNDI5N2Ffb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSBjczQyOTdhX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisKK3N0YXRpYyBpbnQgZHJhaW5fYWRjKHN0cnVjdCBjczQyOTdhX3N0YXRlICpzLCBpbnQgbm9uYmxvY2spCit7CisgICAgICAgIC8qIFRoaXMgcm91dGluZSBzZXJ2ZXMgbm8gcHVycG9zZSBjdXJyZW50bHkgLSBhbnkgc2FtcGxlcworICAgICAgICAgICBzaXR0aW5nIGluIHRoZSByZWNlaXZlIHF1ZXVlIHdpbGwganVzdCBiZSBwcm9jZXNzZWQgYnkgdGhlCisgICAgICAgICAgIGJhY2tncm91bmQgY29uc3VtZXIuICBUaGlzIHdvdWxkIGJlIGRpZmZlcmVudCBpZiBETUEKKyAgICAgICAgICAgYWN0dWFsbHkgc3RvcHBlZCB3aGVuIHRoZXJlIHdlcmUgbm8gY2xpZW50cy4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICB1bnNpZ25lZCBod3B0cjsKKwl1bnNpZ25lZCB0bW87CisJaW50IGNvdW50OworCisJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKG5vbmJsb2NrKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisJYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgICAgICB3aGlsZSAoKGNvdW50ID0gX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0NPVU5UX1RYKSkpIHx8CisgICAgICAgICAgICAgICAocy0+ZG1hX2RhYy5jb3VudCA+IDApKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWEtXIGlzIHRoaXMgY2FsY3VsYXRpb24gd29ya2luZz8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtbyA9ICgoY291bnQgKiBGUkFNRV9UWF9VUykgKiBIWikgLyAxMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVfdGltZW91dCh0bW8gKyAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYS1cgZG8gSSBjYXJlIGlmIHRoZXJlIGlzIGEgc2lnbmFsIHBlbmRpbmc/ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgIC8qIFJlc2V0IHRoZSBib29ra2VlcGluZyAqLworICAgICAgICBod3B0ciA9IChpbnQpKCgoX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9DVVJfRFNDUl9BRERSX1RYKSkgJiBNX0RNQV9DVVJEU0NSX0FERFIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5kZXNjcnRhYl9waHlzKSAvIHNpemVvZihzZXJkbWFfZGVzY3JfdCkpOworICAgICAgICBzLT5kbWFfZGFjLmh3cHRyID0gcy0+ZG1hX2RhYy5zd3B0ciA9IGh3cHRyOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJldHVybiAwOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworc3RhdGljIHNzaXplX3QgY3M0Mjk3YV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCwKKwkJCSAgIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMgPQorCSAgICAoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNudCwgY291bnRfZnIsIGNudF9ieTsKKwl1bnNpZ25lZCBjb3BpZWQgPSAwOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9SRUFELCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IGNzNDI5N2FfcmVhZCgpKyAlZCBcbiIsIGNvdW50KSk7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQlyZXR1cm4gcmV0OworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisvLworLy8gImNvdW50IiBpcyB0aGUgYW1vdW50IG9mIGJ5dGVzIHRvIHJlYWQgKGZyb20gYXBwKSwgaXMgZGVjcmVtZW50ZWQgZWFjaCBsb29wCisvLyAgICAgIGJ5IHRoZSBhbW91bnQgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcmV0dXJuZWQgdG8gdGhlIHVzZXIgYnVmZmVyLgorLy8gImNudCIgaXMgdGhlIHJ1bm5pbmcgdG90YWwgb2YgZWFjaCByZWFkIGZyb20gdGhlIGJ1ZmZlciAoY2hhbmdlcyBlYWNoIGxvb3ApCisvLyAiYnVmZmVyIiBwb2ludHMgdG8gdGhlIGFwcCdzIGJ1ZmZlcgorLy8gInJldCIga2VlcHMgYSBydW5uaW5nIHRvdGFsIG9mIHRoZSBhbW91bnQgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gY29waWVkCisvLyAgICAgIHRvIHRoZSB1c2VyIGJ1ZmZlci4KKy8vICJjb3BpZWQiIGlzIHRoZSB0b3RhbCBieXRlcyBjb3BpZWQgaW50byB0aGUgdXNlciBidWZmZXIgZm9yIGVhY2ggbG9vcC4KKy8vCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPCisJCQkiX3JlYWQoKSBjb3VudD4wIGNvdW50PSVkIC5jb3VudD0lZCAuc3dwdHI9JWQgLmh3cHRyPSVkIFxuIiwKKwkJCQljb3VudCwgcy0+ZG1hX2FkYy5jb3VudCwKKwkJCQlzLT5kbWFfYWRjLnN3cHRyLCBzLT5kbWFfYWRjLmh3cHRyKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgICAgICAgICAvKiBjbnQgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBzYW1wbGVzICgxNi1iaXQKKyAgICAgICAgICAgICAgICAgICBzdGVyZW8pOyBpdCBzdGFydHMgb3V0IGFzIHRoZSBtYXhtaW11bSBjb25zZXF1ZXRpdmUKKyAgICAgICAgICAgICAgICAgICBzYW1wbGVzICovCisJCWNudCA9IChzLT5kbWFfYWRjLnNiX2VuZCAtIHMtPmRtYV9hZGMuc2Jfc3dwdHIpIC8gMjsKKyAgICAgICAgICAgICAgICBjb3VudF9mciA9IHMtPmRtYV9hZGMuY291bnQgLyBGUkFNRV9TQU1QTEVfQllURVM7CisKKwkJLy8gZG1hX2FkYy5jb3VudCBpcyB0aGUgY3VycmVudCB0b3RhbCBieXRlcyB0aGF0IGhhdmUgbm90IGJlZW4gcmVhZC4KKwkJLy8gaWYgdGhlIGFtb3VudCBvZiB1bnJlYWQgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBzdyBwb2ludGVyIHRvIHRoZQorCQkvLyBlbmQgb2YgdGhlIGJ1ZmZlciBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdG90YWwgYnl0ZXMgdGhhdAorCQkvLyBoYXZlIG5vdCBiZWVuIHJlYWQsIHRoZW4gc2V0IHRoZSAiY250IiAodW5yZWFkIGJ5dGVzKSB0byB0aGUKKwkJLy8gYW1vdW50IG9mIHVucmVhZCBieXRlcy4gIAorCisJCWlmIChjb3VudF9mciA8IGNudCkKKwkJCWNudCA9IGNvdW50X2ZyOworICAgICAgICAgICAgICAgIGNudF9ieSA9IGNudCAqIEZSQU1FX1NBTVBMRV9CWVRFUzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkvLworCQkvLyBpZiB3ZSBhcmUgY29udmVydGluZyBmcm9tIDgvMTYgdGhlbiB3ZSBuZWVkIHRvIGNvcHkKKwkJLy8gdHdpY2UgdGhlIG51bWJlciBvZiAxNiBiaXQgYnl0ZXMgdGhlbiA4IGJpdCBieXRlcy4KKwkJLy8gCisJCWlmIChzLT5jb252ZXJzaW9uKSB7CisJCQlpZiAoY250X2J5ID4gKGNvdW50ICogMikpIHsKKwkJCQljbnQgPSAoY291bnQgKiAyKSAvIEZSQU1FX1NBTVBMRV9CWVRFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250X2J5ID0gY291bnQgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9IGVsc2UgeworCQkJaWYgKGNudF9ieSA+IGNvdW50KSB7CisJCQkJY250ID0gY291bnQgLyBGUkFNRV9TQU1QTEVfQllURVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudF9ieSA9IGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisJCS8vCisJCS8vICJjbnQiIE5PVyBpcyB0aGUgc21hbGxlciBvZiB0aGUgYW1vdW50IHRoYXQgd2lsbCBiZSByZWFkLAorCQkvLyBhbmQgdGhlIGFtb3VudCB0aGF0IGlzIHJlcXVlc3RlZCBpbiB0aGlzIHJlYWQgKG9yIHBhcnRpYWwpLgorCQkvLyBpZiB0aGVyZSBhcmUgbm8gYnl0ZXMgaW4gdGhlIGJ1ZmZlciB0byByZWFkLCB0aGVuIHN0YXJ0IHRoZQorCQkvLyBBREMgYW5kIHdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byB3YWtlIHVzIHVwLgorCQkvLworCQlpZiAoY250IDw9IDApIHsKKworCQkJLy8gc3RhcnQgdXAgdGhlIGRtYSBlbmdpbmUgYW5kIHRoZW4gY29udGludWUgYmFjayB0byB0aGUgdG9wIG9mCisJCQkvLyB0aGUgbG9vcCB3aGVuIHdha2UgdXAgb2NjdXJzLgorCQkJc3RhcnRfYWRjKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcy0+ZG1hX2FkYy53YWl0KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCQkJY29udGludWU7CisJCX0KKwkJLy8gdGhlcmUgYXJlIGJ5dGVzIGluIHRoZSBidWZmZXIgdG8gcmVhZC4KKwkJLy8gY29weSBmcm9tIHRoZSBodyBidWZmZXIgb3ZlciB0byB0aGUgdXNlciBidWZmZXIuCisJCS8vIHVzZXIgYnVmZmVyIGlzIGRlc2lnbmF0ZWQgYnkgImJ1ZmZlciIKKwkJLy8gdmlydHVhbCBhZGRyZXNzIHRvIGNvcHkgZnJvbSBpcyBkbWFfYnVmK3N3cHRyCisJCS8vIHRoZSAiY250IiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisKKwkJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJIl9yZWFkKCkgY29weV90byBjbnQ9JWQgY291bnQ9JWQgIiwgY250X2J5LCBjb3VudCkpOworCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPCisJCQkgIiAuc2J1ZnN6PSVkIC5jb3VudD0lZCBidWZmZXI9MHglLjh4IHJldD0lZFxuIiwKKwkJCQkgcy0+ZG1hX2FkYy5zYnVmc3osIHMtPmRtYV9hZGMuY291bnQsCisJCQkJICh1bnNpZ25lZCkgYnVmZmVyLCByZXQpKTsKKworCQlpZiAoY29weV90b191c2VyIChidWZmZXIsICgodm9pZCAqKXMtPmRtYV9hZGMuc2Jfc3dwdHIpLCBjbnRfYnkpKQorCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgY29waWVkID0gY250X2J5OworCisgICAgICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBkZXNjcmlwdG9ycyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIENTX0RCR09VVChDU19GVU5DVElPTiwgMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHVwZF9yY3Ygc3ctPmh3ICV4LyV4XG4iLCBzLT5kbWFfYWRjLnN3cHRyLCBzLT5kbWFfYWRjLmh3cHRyKSk7CisJCXMtPmRtYV9hZGMuY291bnQgLT0gY250X2J5OworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuc2Jfc3dwdHIgKz0gY250ICogMjsKKyAgICAgICAgICAgICAgICBpZiAocy0+ZG1hX2FkYy5zYl9zd3B0ciA9PSBzLT5kbWFfYWRjLnNiX2VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuc2Jfc3dwdHIgPSBzLT5kbWFfYWRjLnNhbXBsZV9idWY7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY29waWVkOworCQlidWZmZXIgKz0gY29waWVkOworCQlyZXQgKz0gY29waWVkOworCQlzdGFydF9hZGMocyk7CisJfQorCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1dBVkVfUkVBRCwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBjczQyOTdhX3JlYWQoKS0gJWRcbiIsIHJldCkpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgY3M0Mjk3YV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0ciwgaHdwdHI7CisJaW50IGNudDsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1dBVkVfV1JJVEUsIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogY3M0Mjk3YV93cml0ZSgpKyBjb3VudD0lZFxuIiwKKwkJCSBjb3VudCkpOworCVZBTElEQVRFX1NUQVRFKHMpOworCisJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisJd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNlcmRtYV90ICpkID0gJnMtPmRtYV9kYWM7CisgICAgICAgICAgICAgICAgaW50IGNvcHlfY250OworICAgICAgICAgICAgICAgIHUzMiAqc190bXBsOworICAgICAgICAgICAgICAgIHUzMiAqdF90bXBsOworICAgICAgICAgICAgICAgIHUzMiBsZWZ0LCByaWdodDsKKyAgICAgICAgICAgICAgICBpbnQgc3dhcCA9IChzLT5wcm9wX2RhYy5mbXQgPT0gQUZNVF9TMTZfTEUpIHx8IChzLT5wcm9wX2RhYy5mbXQgPT0gQUZNVF9VMTZfTEUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIFhYWFhYWCB0aGlzIGlzIGJyb2tlbiBmb3IgQkxPQVRfRkFDVE9SICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChkLT5jb3VudCA8IDApIHsKKwkJCWQtPmNvdW50ID0gMDsKKwkJCWQtPnN3cHRyID0gZC0+aHdwdHI7CisJCX0KKwkJaWYgKGQtPnVuZGVycnVuKSB7CisJCQlkLT51bmRlcnJ1biA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBod3B0ciA9ICh1bnNpZ25lZCkgKCgoX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9DVVJfRFNDUl9BRERSX1RYKSkgJiBNX0RNQV9DVVJEU0NSX0FERFIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmRlc2NydGFiX3BoeXMpIC8gc2l6ZW9mKHNlcmRtYV9kZXNjcl90KSk7CisJCQlkLT5zd3B0ciA9IGQtPmh3cHRyID0gaHdwdHI7CisJCX0KKwkJc3dwdHIgPSBkLT5zd3B0cjsKKwkJY250ID0gZC0+c2J1ZnN6IC0gKHN3cHRyICogRlJBTUVfU0FNUExFX0JZVEVTKTsKKyAgICAgICAgICAgICAgICAvKiBXaWxsIHRoaXMgd3JpdGUgZmlsbCB1cCB0aGUgYnVmZmVyPyAqLworCQlpZiAoZC0+Y291bnQgKyBjbnQgPiBkLT5zYnVmc3opCisJCQljbnQgPSBkLT5zYnVmc3ogLSBkLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlzdGFydF9kYWMocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZkLT53YWl0KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGQtPnNhbXBsZV9idWYsIGJ1ZmZlciwgY250KSkKKwkJCXJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOworCisgICAgICAgICAgICAgICAgY29weV9jbnQgPSBjbnQ7CisgICAgICAgICAgICAgICAgc190bXBsID0gKHUzMiAqKWQtPnNhbXBsZV9idWY7CisgICAgICAgICAgICAgICAgdF90bXBsID0gKHUzMiAqKShkLT5kbWFfYnVmICsgKHN3cHRyICogNCkpOworCisgICAgICAgICAgICAgICAgLyogWFhYS1cgYXNzdW1pbmcgMTYtYml0IHN0ZXJlbyEgKi8KKyAgICAgICAgICAgICAgICBkbyB7CisJCQl1MzIgdG1wOworCisJCQl0X3RtcGxbMF0gPSBjcHVfdG9fYmUzMigweDk4MDAwMDAwKTsKKworCQkJdG1wID0gYmUzMl90b19jcHUoc190bXBsWzBdKTsKKwkJCWxlZnQgPSB0bXAgJiAweGZmZmY7CisJCQlyaWdodCA9IHRtcCA+PiAxNjsKKwkJCWlmIChzd2FwKSB7CisJCQkJbGVmdCA9IHN3YWIxNihsZWZ0KTsKKwkJCQlyaWdodCA9IHN3YWIxNihyaWdodCk7CisJCQl9CisJCQl0X3RtcGxbMV0gPSBjcHVfdG9fYmUzMihsZWZ0ID4+IDgpOworCQkJdF90bXBsWzJdID0gY3B1X3RvX2JlMzIoKChsZWZ0ICYgMHhmZikgPDwgMjQpIHwKKwkJCQkJCShyaWdodCA8PCA0KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfdG1wbCsrOworICAgICAgICAgICAgICAgICAgICAgICAgdF90bXBsICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X2NudCAtPSA0OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvcHlfY250KTsKKworICAgICAgICAgICAgICAgIC8qIE11eCBpbiBhbnkgcGVuZGluZyByZWFkL3dyaXRlIGFjY2Vzc2VzICovCisgICAgICAgICAgICAgICAgaWYgKHMtPnJlZ19yZXF1ZXN0KSB7CisJCQkqKHU2NCAqKShkLT5kbWFfYnVmICsgKHN3cHRyICogNCkpIHw9CisJCQkJY3B1X3RvX2JlNjQocy0+cmVnX3JlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVnX3JlcXVlc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2FrZV91cCgmcy0+ZG1hX2RhYy5yZWdfd2FpdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjczQyOTdhOiBjb3B5IGluICVkIHRvIHN3cHRyICV4XG4iLCBjbnQsIHN3cHRyKSk7CisKKwkJc3dwdHIgPSAoc3dwdHIgKyAoY250L0ZSQU1FX1NBTVBMRV9CWVRFUykpICUgZC0+cmluZ3N6OworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlcShjbnQvRlJBTUVfU0FNUExFX0JZVEVTLCBTU19DU1IoUl9TRVJfRE1BX0RTQ1JfQ09VTlRfVFgpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZC0+c3dwdHIgPSBzd3B0cjsKKwkJZC0+Y291bnQgKz0gY250OworCQlkLT5lbmRjbGVhcmVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCXN0YXJ0X2RhYyhzKTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9XUklURSwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBjczQyOTdhX3dyaXRlKCktICVkXG4iLCByZXQpKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3M0Mjk3YV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19XQVZFX1dSSVRFIHwgQ1NfV0FWRV9SRUFELCA0LAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IGNzNDI5N2FfcG9sbCgpK1xuIikpOworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19XQVZFX1dSSVRFIHwgQ1NfV0FWRV9SRUFELCA0LAorCQkJICBwcmludGsoS0VSTl9JTkZPCisJCQkJICJjczQyOTdhOiBjczQyOTdhX3BvbGwoKSB3YWl0IG9uIEZNT0RFX1dSSVRFXG4iKSk7CisJCWlmKCFzLT5kbWFfZGFjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYyhzKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1dBVkVfV1JJVEUgfCBDU19XQVZFX1JFQUQsIDQsCisJCQkgIHByaW50ayhLRVJOX0lORk8KKwkJCQkgImNzNDI5N2E6IGNzNDI5N2FfcG9sbCgpIHdhaXQgb24gRk1PREVfUkVBRFxuIikpOworCQlpZighcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9hZGMocykpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfYWRjLndhaXQsIHdhaXQpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWNzNDI5N2FfdXBkYXRlX3B0cihzLENTX0ZBTFNFKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA+PQorCQkJICAgIChzaWduZWQpIHMtPmRtYV9kYWMuZnJhZ3NpemUpIHsKKwkJCQlpZiAocy0+ZG1hX2RhYy53YWtldXApCisJCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCQkJZWxzZQorCQkJCQltYXNrID0gMDsKKwkJCQlzLT5kbWFfZGFjLndha2V1cCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKHNpZ25lZCkgKHMtPmRtYV9kYWMuc2J1ZnN6LzIpID49IHMtPmRtYV9kYWMuY291bnQpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0gZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpIHMtPmRtYV9hZGMuZnJhZ3NpemUpIAorCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID4gMCkKKwkJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1dBVkVfV1JJVEUgfCBDU19XQVZFX1JFQUQsIDQsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogY3M0Mjk3YV9wb2xsKCktIDB4JS44eFxuIiwKKwkJCSBtYXNrKSk7CisJcmV0dXJuIG1hc2s7Cit9CisKKworc3RhdGljIGludCBjczQyOTdhX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworICAgICAgICAvKiBYWFhLVyBjdXJyZW50bHkgbm8gbW1hcCBzdXBwb3J0ICovCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY3M0Mjk3YV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjczQyOTdhX3N0YXRlICpzID0KKwkgICAgKHN0cnVjdCBjczQyOTdhX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKwljb3VudF9pbmZvIGNpbmZvOworCWludCB2YWwsIG1hcHBlZCwgcmV0OworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OfENTX0lPQ1RMLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCSAiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBmaWxlPTB4JS44eCBjbWQ9MHglLjh4XG4iLAorCQkJICh1bnNpZ25lZCkgZmlsZSwgY21kKSk7CisjaWYgQ1NERUJVRworCWNzX3ByaW50aW9jdGwoY21kKTsKKyNlbmRpZgorCVZBTElEQVRFX1NUQVRFKHMpOworCW1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIHMtPmRtYV9kYWMubWFwcGVkKSB8fAorCSAgICAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIHMtPmRtYV9hZGMubWFwcGVkKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBTT1VORF9WRVJTSU9OPTB4JS44eFxuIiwKKwkJCQkgU09VTkRfVkVSU0lPTikpOworCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyOTdhOiBjczQyOTdhX2lvY3RsKCk6IERTUF9TWU5DXG4iKSk7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywKKwkJCQkJIDAgLypmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyAqLworCQkJCQkgKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwKKwkJCQlEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAsCisJCQkJKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBEU1BfUkVTRVRcbiIpKTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5jb3VudCA9IHMtPmRtYV9kYWMudG90YWxfYnl0ZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmJsb2NrcyA9IHMtPmRtYV9kYWMud2FrZXVwID0gMDsKKwkJCXMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfRE1BX0NVUl9EU0NSX0FERFJfVFgpKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5kZXNjcnRhYl9waHlzKSAvIHNpemVvZihzZXJkbWFfZGVzY3JfdCkpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLmJsb2NrcyA9IHMtPmRtYV9kYWMud2FrZXVwID0gMDsKKwkJCXMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfRE1BX0NVUl9EU0NSX0FERFJfUlgpKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5kZXNjcnRhYl9waHlzKSAvIHNpemVvZihzZXJkbWFfZGVzY3JfdCkpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBEU1BfU1BFRUQgdmFsPSVkIC0+IDQ4MDAwXG4iLCB2YWwpKTsKKyAgICAgICAgICAgICAgICB2YWwgPSA0ODAwMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBEU1BfU1RFUkVPIHZhbD0lZFxuIiwgdmFsKSk7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJcy0+cHJvcF9hZGMuY2hhbm5lbHMgPSB2YWwgPyAyIDogMTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IHZhbCA/IDIgOiAxOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBEU1BfQ0hBTk5FTFMgdmFsPSVkXG4iLAorCQkJCSB2YWwpKTsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJcy0+cHJvcF9hZGMuY2hhbm5lbHMgPSAyOworCQkJCWVsc2UKKwkJCQkJcy0+cHJvcF9hZGMuY2hhbm5lbHMgPSAxOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMocyk7CisJCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IDI7CisJCQkJZWxzZQorCQkJCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IDE7CisJCQl9CisJCX0KKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQl2YWwgPSBzLT5wcm9wX2RhYy5jaGFubmVsczsKKwkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXZhbCA9IHMtPnByb3BfYWRjLmNoYW5uZWxzOworCisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgkvLyBSZXR1cm5zIGEgbWFzayAKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyOTdhOiBjczQyOTdhX2lvY3RsKCk6IERTUF9HRVRGTVQgdmFsPTB4JS44eFxuIiwKKwkJCQkgQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSB8IEFGTVRfUzggfAorCQkJCSBBRk1UX1U4KSk7CisJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TOCB8CisJCQkJQUZNVF9VOCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDI5N2E6IGNzNDI5N2FfaW9jdGwoKTogRFNQX1NFVEZNVCB2YWw9MHglLjh4XG4iLAorCQkJCSB2YWwpKTsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgIT0gQUZNVF9TMTZfTEUKKwkJCQkgICAgJiYgdmFsICE9IEFGTVRfVTE2X0xFICYmIHZhbCAhPSBBRk1UX1M4CisJCQkJICAgICYmIHZhbCAhPSBBRk1UX1U4KQorCQkJCQl2YWwgPSBBRk1UX1U4OworCQkJCXMtPnByb3BfYWRjLmZtdCA9IHZhbDsKKwkJCQlzLT5wcm9wX2FkYy5mbXRfb3JpZ2luYWwgPSBzLT5wcm9wX2FkYy5mbXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsICE9IEFGTVRfUzE2X0xFCisJCQkJICAgICYmIHZhbCAhPSBBRk1UX1UxNl9MRSAmJiB2YWwgIT0gQUZNVF9TOAorCQkJCSAgICAmJiB2YWwgIT0gQUZNVF9VOCkKKwkJCQkJdmFsID0gQUZNVF9VODsKKwkJCQlzLT5wcm9wX2RhYy5mbXQgPSB2YWw7CisJCQkJcy0+cHJvcF9kYWMuZm10X29yaWdpbmFsID0gcy0+cHJvcF9kYWMuZm10OworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCXZhbCA9IHMtPnByb3BfZGFjLmZtdF9vcmlnaW5hbDsKKwkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQkJdmFsID0gcy0+cHJvcF9hZGMuZm10X29yaWdpbmFsOworCQl9CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCSAgImNzNDI5N2E6IGNzNDI5N2FfaW9jdGwoKTogRFNQX1NFVEZNVCByZXR1cm4gdmFsPTB4JS44eFxuIiwgCisJCQl2YWwpKTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyOTdhOiBjczQyOTdhX2lvY3RsKCk6IERTUF9QT1NUXG4iKSk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCXZhbCA9IDA7CisJCWlmIChmaWxlLT5mX21vZGUgJiBzLT5lbmEgJiBGTU9ERV9SRUFEKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBzLT5lbmEgJiBGTU9ERV9XUklURSkKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkKKwkJCQkgICAgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9hZGMocyk7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkKKwkJCQkgICAgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJc3RhcnRfZGFjKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9kYWMocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY3M0Mjk3YV91cGRhdGVfcHRyKHMsQ1NfRkFMU0UpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfZGFjLmZyYWdzaXplOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCQlhYmluZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLnNidWZzejsKKwkJZWxzZQorCQkJYWJpbmZvLmJ5dGVzID0KKwkJCSAgICBzLT5kbWFfZGFjLnNidWZzeiAtIHMtPmRtYV9kYWMuY291bnQ7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYy5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI5N2E6IGNzNDI5N2FfaW9jdGwoKTogR0VUT1NQQUNFIC5mcmFnc2l6ZT0lZCAuYnl0ZXM9JWQgLmZyYWdzdG90YWw9JWQgLmZyYWdtZW50cz0lZFxuIiwKKwkJCQlhYmluZm8uZnJhZ3NpemUsYWJpbmZvLmJ5dGVzLGFiaW5mby5mcmFnc3RvdGFsLAorCQkJCWFiaW5mby5mcmFnbWVudHMpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmFiaW5mbywKKwkJCQkgICAgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyOTdhX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCWlmIChzLT5jb252ZXJzaW9uKSB7CisJCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplIC8gMjsKKwkJCWFiaW5mby5ieXRlcyA9IHMtPmRtYV9hZGMuY291bnQgLyAyOworCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bWZyYWc7CisJCQlhYmluZm8uZnJhZ21lbnRzID0KKwkJCSAgICBhYmluZm8uYnl0ZXMgPj4gKHMtPmRtYV9hZGMuZnJhZ3NoaWZ0IC0gMSk7CisJCX0gZWxzZSB7CisJCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplOworCQkJYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOworCQkJYWJpbmZvLmZyYWdtZW50cyA9CisJCQkgICAgYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhYmluZm8sCisJCQkJICAgIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmKCFzLT5kbWFfZGFjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYyhzKSkKKwkJCXJldHVybiAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyOTdhX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCXZhbCA9IHMtPmRtYV9kYWMuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmKCFzLT5kbWFfYWRjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2FkYyhzKSkKKwkJCXJldHVybiAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyOTdhX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCWNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQljaW5mby5ibG9ja3MgPQorCQkJICAgIChjaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdCkgLQorCQkJICAgIHMtPmRtYV9hZGMuYmxvY2tzOworCQkJcy0+ZG1hX2FkYy5ibG9ja3MgPQorCQkJICAgIGNpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworCQl9IGVsc2UgeworCQkJaWYgKHMtPmNvbnZlcnNpb24pIHsKKwkJCQljaW5mby5ibG9ja3MgPQorCQkJCSAgICBzLT5kbWFfYWRjLmNvdW50IC8KKwkJCQkgICAgMiA+PiAocy0+ZG1hX2FkYy5mcmFnc2hpZnQgLSAxKTsKKwkJCX0gZWxzZQorCQkJCWNpbmZvLmJsb2NrcyA9CisJCQkJICAgIHMtPmRtYV9hZGMuY291bnQgPj4gcy0+ZG1hX2FkYy4KKwkJCQkgICAgZnJhZ3NoaWZ0OworCQl9CisJCWlmIChzLT5jb252ZXJzaW9uKQorCQkJY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0ciAvIDI7CisJCWVsc2UKKwkJCWNpbmZvLnB0ciA9IHMtPmRtYV9hZGMuaHdwdHI7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZSAtIDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYoIXMtPmRtYV9kYWMucmVhZHkgJiYgcHJvZ19kbWFidWZfZGFjKHMpKQorCQkJcmV0dXJuIDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNzNDI5N2FfdXBkYXRlX3B0cihzLENTX0ZBTFNFKTsKKwkJY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWNpbmZvLmJsb2NrcyA9CisJCQkgICAgKGNpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0KSAtCisJCQkgICAgcy0+ZG1hX2RhYy5ibG9ja3M7CisJCQlzLT5kbWFfZGFjLmJsb2NrcyA9CisJCQkgICAgY2luZm8uYnl0ZXMgPj4gcy0+ZG1hX2RhYy5mcmFnc2hpZnQ7CisJCX0gZWxzZSB7CisJCQljaW5mby5ibG9ja3MgPQorCQkJICAgIHMtPmRtYV9kYWMuY291bnQgPj4gcy0+ZG1hX2RhYy5mcmFnc2hpZnQ7CisJCX0KKwkJY2luZm8ucHRyID0gcy0+ZG1hX2RhYy5od3B0cjsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQkJcy0+ZG1hX2RhYy5jb3VudCAmPSBzLT5kbWFfZGFjLmZyYWdzaXplIC0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNpbmZvLCBzaXplb2YoY2luZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiB2YWw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgKGludCAqKSBhcmcpOworCQl9CisJCWlmICgodmFsID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCXJldHVybiB2YWw7CisJCWlmIChzLT5jb252ZXJzaW9uKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9hZGMuZnJhZ3NpemUgLyAyLAorCQkJCQkoaW50ICopIGFyZyk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLmZyYWdzaXplLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsJLy8gU2F5IE9LLCBidXQgZG8gbm90aGluZy4KKworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKQorCQkgICAgfHwgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFCisJCQkmJiBzLT5kbWFfZGFjLnN1YmRpdmlzaW9uKSkgcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gdmFsOworCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSB2YWw7CisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXJldHVybiBwdXRfdXNlcihzLT5wcm9wX2FkYy5yYXRlLCAoaW50ICopIGFyZyk7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPnByb3BfZGFjLnJhdGUsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPnByb3BfYWRjLmNoYW5uZWxzLCAoaW50ICopIGFyZyk7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPnByb3BfZGFjLmNoYW5uZWxzLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcmV0dXJuCisJCQkgICAgcHV0X3VzZXIoCisJCQkJICAgICAocy0+cHJvcF9hZGMuCisJCQkJICAgICAgZm10ICYgKEFGTVRfUzggfCBBRk1UX1U4KSkgPyA4IDogMTYsCisJCQkJICAgICAoaW50ICopIGFyZyk7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuCisJCQkgICAgcHV0X3VzZXIoCisJCQkJICAgICAocy0+cHJvcF9kYWMuCisJCQkJICAgICAgZm10ICYgKEFGTVRfUzggfCBBRk1UX1U4KSkgPyA4IDogMTYsCisJCQkJICAgICAoaW50ICopIGFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBtaXhlcl9pb2N0bChzLCBjbWQsIGFyZyk7Cit9CisKKworc3RhdGljIGludCBjczQyOTdhX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMgPQorCSAgICAoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCisgICAgICAgIENTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJICJjczQyOTdhOiBjczQyOTdhX3JlbGVhc2UoKTogaW5vZGU9MHglLjh4IGZpbGU9MHglLjh4IGZfbW9kZT0weCV4XG4iLAorCQkJICh1bnNpZ25lZCkgaW5vZGUsICh1bnNpZ25lZCkgZmlsZSwgZmlsZS0+Zl9tb2RlKSk7CisJVkFMSURBVEVfU1RBVEUocyk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJZHJhaW5fZGFjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJZG93bigmcy0+b3Blbl9zZW1fZGFjKTsKKwkJc3RvcF9kYWMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjKTsKKwkJcy0+b3Blbl9tb2RlICY9IH5GTU9ERV9XUklURTsKKwkJdXAoJnMtPm9wZW5fc2VtX2RhYyk7CisJCXdha2VfdXAoJnMtPm9wZW5fd2FpdF9kYWMpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlkcmFpbl9hZGMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQlkb3duKCZzLT5vcGVuX3NlbV9hZGMpOworCQlzdG9wX2FkYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9hZGMpOworCQlzLT5vcGVuX21vZGUgJj0gfkZNT0RFX1JFQUQ7CisJCXVwKCZzLT5vcGVuX3NlbV9hZGMpOworCQl3YWtlX3VwKCZzLT5vcGVuX3dhaXRfYWRjKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M0Mjk3YV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnM9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJImNzNDI5N2E6IGNzNDI5N2Ffb3BlbigpOiBpbm9kZT0weCUuOHggZmlsZT0weCUuOHggZl9tb2RlPTB4JXhcbiIsCisJCQkodW5zaWduZWQpIGlub2RlLCAodW5zaWduZWQpIGZpbGUsIGZpbGUtPmZfbW9kZSkpOworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAiY3M0Mjk3YTogc3RhdHVzID0gJTA4eFxuIiwgKGludClfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfU1RBVFVTX0RFQlVHKSkpKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQyOTdhX2RldnMpCisJeworCQlzID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzNDI5N2Ffc3RhdGUsIGxpc3QpOworCisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoZW50cnkgPT0gJmNzNDI5N2FfZGV2cykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFzKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyOTdhOiBjczQyOTdhX29wZW4oKTogRXJyb3IgLSB1bmFibGUgdG8gZmluZCBhdWRpbyBzdGF0ZSBzdHJ1Y3RcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisKKwkvLyB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4gfCBDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyOTdhOiBjczQyOTdhX29wZW4oKTogRXJyb3IgLSBtdXN0IG9wZW4gUkVBRCBhbmQvb3IgV1JJVEVcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgICAgIGlmIChfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfRE1BX0RTQ1JfQ09VTlRfVFgpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IFRYIHBpcGUgbmVlZHMgdG8gZHJhaW5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9fcmF3X3JlYWRxKFNTX0NTUihSX1NFUl9ETUFfRFNDUl9DT1VOVF9UWCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgIAorCQlkb3duKCZzLT5vcGVuX3NlbV9kYWMpOworCQl3aGlsZSAocy0+b3Blbl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXVwKCZzLT5vcGVuX3NlbV9kYWMpOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQl1cCgmcy0+b3Blbl9zZW1fZGFjKTsKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnMtPm9wZW5fd2FpdF9kYWMpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJvcGVuIC0gc2lnIHBlbmRpbmdcbiIpOworCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlkb3duKCZzLT5vcGVuX3NlbV9kYWMpOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWRvd24oJnMtPm9wZW5fc2VtX2FkYyk7CisJCXdoaWxlIChzLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQl1cCgmcy0+b3Blbl9zZW1fYWRjKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJdXAoJnMtPm9wZW5fc2VtX2FkYyk7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5vcGVuX3dhaXRfYWRjKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygib3BlbiAtIHNpZyBwZW5kaW5nXG4iKTsKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJZG93bigmcy0+b3Blbl9zZW1fYWRjKTsKKwkJfQorCX0KKwlzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcy0+cHJvcF9hZGMuZm10ID0gQUZNVF9TMTZfQkU7CisJCXMtPnByb3BfYWRjLmZtdF9vcmlnaW5hbCA9IHMtPnByb3BfYWRjLmZtdDsKKwkJcy0+cHJvcF9hZGMuY2hhbm5lbHMgPSAyOworCQlzLT5wcm9wX2FkYy5yYXRlID0gNDgwMDA7CisJCXMtPmNvbnZlcnNpb24gPSAwOworCQlzLT5lbmEgJj0gfkZNT0RFX1JFQUQ7CisJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9CisJCSAgICBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gMDsKKwkJdXAoJnMtPm9wZW5fc2VtX2FkYyk7CisKKwkJaWYgKHByb2dfZG1hYnVmX2FkYyhzKSkgeworCQkJQ1NfREJHT1VUKENTX09QRU4gfCBDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fRVJSCisJCQkJImNzNDI5N2E6IGFkYyBQcm9ncmFtIGRtYWJ1ZnMgZmFpbGVkLlxuIikpOworCQkJY3M0Mjk3YV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzLT5wcm9wX2RhYy5mbXQgPSBBRk1UX1MxNl9CRTsKKwkJcy0+cHJvcF9kYWMuZm10X29yaWdpbmFsID0gcy0+cHJvcF9kYWMuZm10OworCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IDI7CisJCXMtPnByb3BfZGFjLnJhdGUgPSA0ODAwMDsKKwkJcy0+Y29udmVyc2lvbiA9IDA7CisJCXMtPmVuYSAmPSB+Rk1PREVfV1JJVEU7CisJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9CisJCSAgICBzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gMDsKKwkJdXAoJnMtPm9wZW5fc2VtX2RhYyk7CisKKwkJaWYgKHByb2dfZG1hYnVmX2RhYyhzKSkgeworCQkJQ1NfREJHT1VUKENTX09QRU4gfCBDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fRVJSCisJCQkJImNzNDI5N2E6IGRhYyBQcm9ncmFtIGRtYWJ1ZnMgZmFpbGVkLlxuIikpOworCQkJY3M0Mjk3YV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogY3M0Mjk3YV9vcGVuKCktIDBcbiIpKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAgIFdhdmUgKGF1ZGlvKSBmaWxlIG9wZXJhdGlvbnMgc3RydWN0LgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzNDI5N2FfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gY3M0Mjk3YV9yZWFkLAorCS53cml0ZQkJPSBjczQyOTdhX3dyaXRlLAorCS5wb2xsCQk9IGNzNDI5N2FfcG9sbCwKKwkuaW9jdGwJCT0gY3M0Mjk3YV9pb2N0bCwKKwkubW1hcAkJPSBjczQyOTdhX21tYXAsCisJLm9wZW4JCT0gY3M0Mjk3YV9vcGVuLAorCS5yZWxlYXNlCT0gY3M0Mjk3YV9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgY3M0Mjk3YV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyA9IChzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqKSBkZXZfaWQ7CisgICAgICAgIHUzMiBzdGF0dXM7CisKKyAgICAgICAgc3RhdHVzID0gX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX1NUQVRVU19ERUJVRykpOworCisgICAgICAgIENTX0RCR09VVChDU19JTlRFUlJVUFQsIDYsIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgImNzNDI5N2E6IGNzNDI5N2FfaW50ZXJydXB0KCkgSElTUj0weCUuOHhcbiIsIHN0YXR1cykpOworCisjaWYgMAorICAgICAgICAvKiBYWFhLVyB3aGF0IGNoZWNrICpzaG91bGQqIGJlIGRvbmUgaGVyZT8gKi8KKyAgICAgICAgaWYgKCEoc3RhdHVzICYgKE1fU1lOQ1NFUl9SWF9FT1BfQ09VTlQgfCBNX1NZTkNTRVJfUlhfT1ZFUlJVTiB8IE1fU1lOQ1NFUl9SWF9TWU5DX0VSUikpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX1NUQVRVUykpOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YTogdW5leHBlY3RlZCBpbnRlcnJ1cHQgKHN0YXR1cyAlMDh4KVxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmIChzdGF0dXMgJiBNX1NZTkNTRVJfUlhfU1lOQ19FUlIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfU1RBVFVTKSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQyOTdhOiByeCBzeW5jIGVycm9yIChzdGF0dXMgJTA4eClcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyAmIE1fU1lOQ1NFUl9SWF9PVkVSUlVOKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld3B0ciwgaTsKKyAgICAgICAgICAgICAgICBzLT5zdGF0cy5yeF9vdnJybisrOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YTogcmVjZWl2ZSBGSUZPIG92ZXJydW5cbiIpOworCisgICAgICAgICAgICAgICAgLyogRml4IHRoaW5ncyB1cDogZ2V0IHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgcG9vbAorICAgICAgICAgICAgICAgICAgIGNsZWFuIGFuZCBnaXZlIHRoZW0gYmFjayB0byB0aGUgaGFyZHdhcmUgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0NPVU5UX1JYKSkpCisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgbmV3cHRyID0gKHVuc2lnbmVkKSAoKChfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfRE1BX0NVUl9EU0NSX0FERFJfUlgpKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuZGVzY3J0YWJfcGh5cykgLyBzaXplb2Yoc2VyZG1hX2Rlc2NyX3QpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxETUFfREVTQ1I7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5kZXNjcnRhYltpXS5kZXNjcl9hICY9IH5NX0RNQV9TRVJSWF9TT1A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0gbmV3cHRyOworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuY291bnQgPSAwOworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuc2Jfc3dwdHIgPSBzLT5kbWFfYWRjLnNiX2h3cHRyID0gcy0+ZG1hX2FkYy5zYW1wbGVfYnVmOworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlcShETUFfREVTQ1IsIFNTX0NTUihSX1NFUl9ETUFfRFNDUl9DT1VOVF9SWCkpOworICAgICAgICB9CisKKwlzcGluX2xvY2soJnMtPmxvY2spOworCWNzNDI5N2FfdXBkYXRlX3B0cihzLENTX1RSVUUpOworCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKworCUNTX0RCR09VVChDU19JTlRFUlJVUFQsIDYsIHByaW50ayhLRVJOX0lORk8KKwkJICAiY3M0Mjk3YTogY3M0Mjk3YV9pbnRlcnJ1cHQoKS1cbiIpKTsKK30KKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgaW5pdHZvbCB7CisJaW50IG1peGNoOworCWludCB2b2w7Cit9IGluaXR2b2xbXSBfX2luaXRkYXRhID0geworCisgIAl7U09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FLCAweDQwNDB9LAorICAgICAgICB7U09VTkRfTUlYRVJfV1JJVEVfUENNLCAweDQwNDB9LAorICAgICAgICB7U09VTkRfTUlYRVJfV1JJVEVfU1lOVEgsIDB4NDA0MH0sCisJe1NPVU5EX01JWEVSX1dSSVRFX0NELCAweDQwNDB9LAorCXtTT1VORF9NSVhFUl9XUklURV9MSU5FLCAweDQwNDB9LAorCXtTT1VORF9NSVhFUl9XUklURV9MSU5FMSwgMHg0MDQwfSwKKwl7U09VTkRfTUlYRVJfV1JJVEVfUkVDTEVWLCAweDAwMDB9LAorCXtTT1VORF9NSVhFUl9XUklURV9TUEVBS0VSLCAweDQwNDB9LAorCXtTT1VORF9NSVhFUl9XUklURV9NSUMsIDB4MDAwMH0KK307CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgY3M0Mjk3YV9pbml0KHZvaWQpCit7CisJc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnM7CisJdTMyIHB3ciwgaWQ7CisJbW1fc2VnbWVudF90IGZzOworCWludCBydmFsOworI2lmbmRlZiBDT05GSUdfQkNNX0NTNDI5N0FfQ1NXQVJNCisJdTY0IGNmZzsKKwlpbnQgbWRpb192YWw7CisjZW5kaWYKKworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gCisJCSJjczQyOTdhOiBjczQyOTdhX2luaXRfbW9kdWxlKCkrIFxuIikpOworCisjaWZuZGVmIENPTkZJR19CQ01fQ1M0Mjk3QV9DU1dBUk0KKyAgICAgICAgbWRpb192YWwgPSBfX3Jhd19yZWFkcShLU0VHMSArIEFfTUFDX1JFR0lTVEVSKDIsIFJfTUFDX01ESU8pKSAmCisgICAgICAgICAgICAgICAgKE1fTUFDX01ESU9fRElSfE1fTUFDX01ESU9fT1VUKTsKKworICAgICAgICAvKiBDaGVjayBzeXNjZmcgZm9yIHN5bmNocm9ub3VzIHNlcmlhbCBvbiBwb3J0IDEgKi8KKyAgICAgICAgY2ZnID0gX19yYXdfcmVhZHEoS1NFRzEgKyBBX1NDRF9TWVNURU1fQ0ZHKTsKKyAgICAgICAgaWYgKCEoY2ZnICYgTV9TWVNfU0VSMV9FTkFCTEUpKSB7CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVxKGNmZyB8IE1fU1lTX1NFUjFfRU5BQkxFLCBLU0VHMStBX1NDRF9TWVNURU1fQ0ZHKTsKKyAgICAgICAgICAgICAgICBjZmcgPSBfX3Jhd19yZWFkcShLU0VHMSArIEFfU0NEX1NZU1RFTV9DRkcpOworICAgICAgICAgICAgICAgIGlmICghKGNmZyAmIE1fU1lTX1NFUjFfRU5BQkxFKSkgeworICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogc2VyaWFsIHBvcnQgMSBub3QgY29uZmlndXJlZCBmb3Igc3luY2hyb25vdXMgb3BlcmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBzZXJpYWwgcG9ydCAxIHN3aXRjaGluZyB0byBzeW5jaHJvbm91cyBvcGVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIEZvcmNlIHRoZSBjb2RlYyAob24gU1dBUk0pIHRvIHJlc2V0IGJ5IGNsZWFyaW5nCisgICAgICAgICAgICAgICAgICAgR0VOTywgcHJlc2VydmluZyBNRElPIChubyBlZmZlY3Qgb24gQ1NXQVJNKSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlcShtZGlvX3ZhbCwgS1NFRzErQV9NQUNfUkVHSVNURVIoMiwgUl9NQUNfTURJTykpOworICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBOb3cgc2V0IEdFTk8gKi8KKyAgICAgICAgX19yYXdfd3JpdGVxKG1kaW9fdmFsIHwgTV9NQUNfR0VOQywgS1NFRzErQV9NQUNfUkVHSVNURVIoMiwgUl9NQUNfTURJTykpOworICAgICAgICAvKiBHaXZlIHRoZSBjb2RlYyBzb21lIHRpbWUgdG8gZmluaXNoIHJlc2V0dGluZyAoc3RhcnQgdGhlIGJpdCBjbG9jaykgKi8KKyAgICAgICAgdWRlbGF5KDEwMCk7CisjZW5kaWYKKworCWlmICghKHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSksIEdGUF9LRVJORUwpKSkgeworCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgorCQkgICAgICAiY3M0Mjk3YTogcHJvYmUoKSBubyBtZW1vcnkgZm9yIHN0YXRlIHN0cnVjdC5cbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBjczQyOTdhX3N0YXRlKSk7CisgICAgICAgIHMtPm1hZ2ljID0gQ1M0Mjk3YV9NQUdJQzsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfYWRjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy5yZWdfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYy5yZWdfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXRfYWRjKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXRfZGFjKTsKKwlpbml0X01VVEVYKCZzLT5vcGVuX3NlbV9hZGMpOworCWluaXRfTVVURVgoJnMtPm9wZW5fc2VtX2RhYyk7CisJc3Bpbl9sb2NrX2luaXQoJnMtPmxvY2spOworCisgICAgICAgIHMtPmlycSA9IEtfSU5UX1NFUl8xOworCisJaWYgKHJlcXVlc3RfaXJxCisJICAgIChzLT5pcnEsIGNzNDI5N2FfaW50ZXJydXB0LCAwLCAiQ3J5c3RhbCBDUzQyOTdhIiwgcykpIHsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwKKwkJCSAgcHJpbnRrKEtFUk5fRVJSICJjczQyOTdhOiBpcnEgJXUgaW4gdXNlXG4iLCBzLT5pcnEpKTsKKwkJZ290byBlcnJfaXJxOworCX0KKwlpZiAoKHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmY3M0Mjk3YV9hdWRpb19mb3BzLCAtMSkpIDwKKwkgICAgMCkgeworCQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKKwkJCSAiY3M0Mjk3YTogcHJvYmUoKSByZWdpc3Rlcl9zb3VuZF9kc3AoKSBmYWlsZWQuXG4iKSk7CisJCWdvdG8gZXJyX2RldjE7CisJfQorCWlmICgocy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmNzNDI5N2FfbWl4ZXJfZm9wcywgLTEpKSA8CisJICAgIDApIHsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI5N2E6IHByb2JlKCkgcmVnaXN0ZXJfc291bmRfbWl4ZXIoKSBmYWlsZWQuXG4iKSk7CisJCWdvdG8gZXJyX2RldjI7CisJfQorCisgICAgICAgIGlmIChzZXJfaW5pdChzKSB8fCBkbWFfaW5pdChzKSkgeworCQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKKwkJCSAiY3M0Mjk3YTogc2VyX2luaXQgZmFpbGVkLlxuIikpOworCQlnb3RvIGVycl9kZXYzOworICAgICAgICB9CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHVkZWxheSg0MDAwKTsKKyAgICAgICAgICAgICAgICBydmFsID0gY3M0Mjk3YV9yZWFkX2FjOTcocywgQUM5N19QT1dFUl9DT05UUk9MLCAmcHdyKTsKKyAgICAgICAgfSB3aGlsZSAoIXJ2YWwgJiYgKHB3ciAhPSAweGYpKTsKKworICAgICAgICBpZiAoIXJ2YWwpIHsKKwkJY2hhciAqc2IxMjUwX2R1YXJ0X3ByZXNlbnQ7CisKKyAgICAgICAgICAgICAgICBmcyA9IGdldF9mcygpOworICAgICAgICAgICAgICAgIHNldF9mcyhLRVJORUxfRFMpOworI2lmIDAKKyAgICAgICAgICAgICAgICB2YWwgPSBTT1VORF9NQVNLX0xJTkU7CisgICAgICAgICAgICAgICAgbWl4ZXJfaW9jdGwocywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLCAodW5zaWduZWQgbG9uZykgJnZhbCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihpbml0dm9sKSAvIHNpemVvZihpbml0dm9sWzBdKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBpbml0dm9sW2ldLnZvbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyX2lvY3RsKHMsIGluaXR2b2xbaV0ubWl4Y2gsICh1bnNpZ25lZCBsb25nKSAmdmFsKTsKKyAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICBjczQyOTdhX3dyaXRlX2FjOTcocywgMHgxOCwgMHgwODA4KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgY3M0Mjk3YV93cml0ZV9hYzk3KHMsIDB4NWUsIDB4MTgwKTsKKyAgICAgICAgICAgICAgICBjczQyOTdhX3dyaXRlX2FjOTcocywgMHgwMiwgMHgwODA4KTsKKyAgICAgICAgICAgICAgICBjczQyOTdhX3dyaXRlX2FjOTcocywgMHgxOCwgMHgwODA4KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHNldF9mcyhmcyk7CisKKyAgICAgICAgICAgICAgICBsaXN0X2FkZCgmcy0+bGlzdCwgJmNzNDI5N2FfZGV2cyk7CisKKyAgICAgICAgICAgICAgICBjczQyOTdhX3JlYWRfYWM5NyhzLCBBQzk3X1ZFTkRPUl9JRDEsICZpZCk7CisKKwkJc2IxMjUwX2R1YXJ0X3ByZXNlbnQgPSBzeW1ib2xfZ2V0KHNiMTI1MF9kdWFydF9wcmVzZW50KTsKKwkJaWYgKHNiMTI1MF9kdWFydF9wcmVzZW50KQorCQkJc2IxMjUwX2R1YXJ0X3ByZXNlbnRbMV0gPSAwOworCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogaW5pdGlhbGl6ZWQgKHZlbmRvciBpZCA9ICV4KVxuIiwgaWQpOworCisgICAgICAgICAgICAgICAgQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogY3M0Mjk3YV9pbml0X21vZHVsZSgpLVxuIikpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyBlcnJfZGV2MzoKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmRldl9taXhlcik7CisgZXJyX2RldjI6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKyBlcnJfZGV2MToKKwlmcmVlX2lycShzLT5pcnEsIHMpOworIGVycl9pcnE6CisJa2ZyZWUocyk7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKworICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjczQyOTdhX2NsZWFudXAodm9pZCkKK3sKKyAgICAgICAgLyoKKyAgICAgICAgICBYWFhLVyAKKyAgICAgICAgICAgZGlzYWJsZV9pcnEsIGZyZWVfaXJxCisgICAgICAgICAgIGRyYWluIERNQSBxdWV1ZQorICAgICAgICAgICBkaXNhYmxlIERNQQorICAgICAgICAgICBkaXNhYmxlIFRYL1JYCisgICAgICAgICAgIGZyZWUgbWVtb3J5CisgICAgICAgICovCisJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBjbGVhbnVwX2NzNDI5N2EoKSBmaW5pc2hlZFxuIikpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKK01PRFVMRV9BVVRIT1IoIktpcCBXYWxrZXIsIEJyb2FkY29tIENvcnAuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNpcnJ1cyBMb2dpYyBDUzQyOTdhIERyaXZlciBmb3IgQnJvYWRjb20gU1dBUk0gYm9hcmQiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCittb2R1bGVfaW5pdChjczQyOTdhX2luaXQpOworbW9kdWxlX2V4aXQoY3M0Mjk3YV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zeXNfdGltZXIuYyBiL3NvdW5kL29zcy9zeXNfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWZlMjliCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3N5c190aW1lci5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogc291bmQvc3lzX3RpbWVyLmMKKyAqCisgKiBUaGUgZGVmYXVsdCB0aW1lciBmb3IgdGhlIExldmVsIDIgc2VxdWVuY2VyIGludGVyZmFjZQorICogVXNlcyB0aGUgKDEvSFogc2VjKSB0aW1lciBvZiBrZXJuZWwuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqLworLyoKKyAqIFRob21hcyBTYWlsZXIgICA6IGlvY3RsIGNvZGUgcmV3b3JrZWQgKHZtYWxsb2MvdmZyZWUgcmVtb3ZlZCkKKyAqIEFuZHJldyBWZWxpYXRoICA6IGFkYXB0ZWQgdG1yMnRpY2tzIGZyb20gbGV2ZWwgMSBzZXF1ZW5jZXIgKGF2b2lkIG92ZXJmbG93KQorICovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworc3RhdGljIHZvbGF0aWxlIGludCBvcGVuZWQsIHRtcl9ydW5uaW5nOworc3RhdGljIHZvbGF0aWxlIHRpbWVfdCB0bXJfb2ZmcywgdG1yX2N0cjsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRpY2tzX29mZnM7CitzdGF0aWMgdm9sYXRpbGUgaW50IGN1cnJfdGVtcG8sIGN1cnJfdGltZWJhc2U7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBjdXJyX3RpY2tzOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbmV4dF9ldmVudF90aW1lOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9ldmVudF90aW1lOworCitzdGF0aWMgdm9pZCAgICAgcG9sbF9kZWZfdG1yKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRlZl90bXIgPSBUSU1FUl9JTklUSUFMSVpFUihwb2xsX2RlZl90bXIsIDAsIDApOworCitzdGF0aWMgdW5zaWduZWQgbG9uZwordG1yMnRpY2tzKGludCB0bXJfdmFsdWUpCit7CisJLyoKKwkgKiAgICBDb252ZXJ0IHRpbWVyIHRpY2tzIHRvIE1JREkgdGlja3MKKwkgKi8KKworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgc2NhbGU7CisKKwkvKiB0bXJfdmFsdWUgKHRpY2tzIHBlciBzZWMpICoKKwkgICAxMDAwMDAwICh1c2VjcyBwZXIgc2VjKSAvIEhaICh0aWNrcyBwZXIgc2VjKSAtPT4gdXNlY3MgKi8KKwl0bXAgPSB0bXJfdmFsdWUgKiAoMTAwMDAwMCAvIEhaKTsKKwlzY2FsZSA9ICg2MCAqIDEwMDAwMDApIC8gKGN1cnJfdGVtcG8gKiBjdXJyX3RpbWViYXNlKTsJLyogdXNlY3MgcGVyIE1JREkgdGljayAqLworCXJldHVybiAodG1wICsgc2NhbGUgLyAyKSAvIHNjYWxlOworfQorCitzdGF0aWMgdm9pZAorcG9sbF9kZWZfdG1yKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisKKwlpZiAob3BlbmVkKQorCSAgeworCisJCSAgeworCQkJICBkZWZfdG1yLmV4cGlyZXMgPSAoMSkgKyBqaWZmaWVzOworCQkJICBhZGRfdGltZXIoJmRlZl90bXIpOworCQkgIH07CisKKwkJICBpZiAodG1yX3J1bm5pbmcpCisJCSAgICB7CisJCQkJc3Bpbl9sb2NrKCZsb2NrKTsKKwkJCSAgICB0bXJfY3RyKys7CisJCQkgICAgY3Vycl90aWNrcyA9IHRpY2tzX29mZnMgKyB0bXIydGlja3ModG1yX2N0cik7CisKKwkJCSAgICBpZiAoY3Vycl90aWNrcyA+PSBuZXh0X2V2ZW50X3RpbWUpCisJCQkgICAgICB7CisJCQkJICAgICAgbmV4dF9ldmVudF90aW1lID0gKHVuc2lnbmVkIGxvbmcpIC0xOworCQkJCSAgICAgIHNlcXVlbmNlcl90aW1lcigwKTsKKwkJCSAgICAgIH0KKwkJCQlzcGluX3VubG9jaygmbG9jayk7CisJCSAgICB9CisJICB9Cit9CisKK3N0YXRpYyB2b2lkCit0bXJfcmVzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisJdG1yX29mZnMgPSAwOworCXRpY2tzX29mZnMgPSAwOworCXRtcl9jdHIgPSAwOworCW5leHRfZXZlbnRfdGltZSA9ICh1bnNpZ25lZCBsb25nKSAtMTsKKwlwcmV2X2V2ZW50X3RpbWUgPSAwOworCWN1cnJfdGlja3MgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitkZWZfdG1yX29wZW4oaW50IGRldiwgaW50IG1vZGUpCit7CisJaWYgKG9wZW5lZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXRtcl9yZXNldCgpOworCWN1cnJfdGVtcG8gPSA2MDsKKwljdXJyX3RpbWViYXNlID0gMTAwOworCW9wZW5lZCA9IDE7CisKKwk7CisKKwl7CisJCWRlZl90bXIuZXhwaXJlcyA9ICgxKSArIGppZmZpZXM7CisJCWFkZF90aW1lcigmZGVmX3Rtcik7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZGVmX3Rtcl9jbG9zZShpbnQgZGV2KQoreworCW9wZW5lZCA9IHRtcl9ydW5uaW5nID0gMDsKKwlkZWxfdGltZXIoJmRlZl90bXIpOworfQorCitzdGF0aWMgaW50CitkZWZfdG1yX2V2ZW50KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KQoreworCXVuc2lnbmVkIGNoYXIgICBjbWQgPSBldmVudFsxXTsKKwl1bnNpZ25lZCBsb25nICAgcGFybSA9ICooaW50ICopICZldmVudFs0XTsKKworCXN3aXRjaCAoY21kKQorCSAgeworCSAgY2FzZSBUTVJfV0FJVF9SRUw6CisJCSAgcGFybSArPSBwcmV2X2V2ZW50X3RpbWU7CisJICBjYXNlIFRNUl9XQUlUX0FCUzoKKwkJICBpZiAocGFybSA+IDApCisJCSAgICB7CisJCQkgICAgbG9uZyAgICAgICAgICAgIHRpbWU7CisKKwkJCSAgICBpZiAocGFybSA8PSBjdXJyX3RpY2tzKQkvKiBJdCdzIHRoZSB0aW1lICovCisJCQkJICAgIHJldHVybiBUSU1FUl9OT1RfQVJNRUQ7CisKKwkJCSAgICB0aW1lID0gcGFybTsKKwkJCSAgICBuZXh0X2V2ZW50X3RpbWUgPSBwcmV2X2V2ZW50X3RpbWUgPSB0aW1lOworCisJCQkgICAgcmV0dXJuIFRJTUVSX0FSTUVEOworCQkgICAgfQorCQkgIGJyZWFrOworCisJICBjYXNlIFRNUl9TVEFSVDoKKwkJICB0bXJfcmVzZXQoKTsKKwkJICB0bXJfcnVubmluZyA9IDE7CisJCSAgYnJlYWs7CisKKwkgIGNhc2UgVE1SX1NUT1A6CisJCSAgdG1yX3J1bm5pbmcgPSAwOworCQkgIGJyZWFrOworCisJICBjYXNlIFRNUl9DT05USU5VRToKKwkJICB0bXJfcnVubmluZyA9IDE7CisJCSAgYnJlYWs7CisKKwkgIGNhc2UgVE1SX1RFTVBPOgorCQkgIGlmIChwYXJtKQorCQkgICAgeworCQkJICAgIGlmIChwYXJtIDwgOCkKKwkJCQkgICAgcGFybSA9IDg7CisJCQkgICAgaWYgKHBhcm0gPiAzNjApCisJCQkJICAgIHBhcm0gPSAzNjA7CisJCQkgICAgdG1yX29mZnMgPSB0bXJfY3RyOworCQkJICAgIHRpY2tzX29mZnMgKz0gdG1yMnRpY2tzKHRtcl9jdHIpOworCQkJICAgIHRtcl9jdHIgPSAwOworCQkJICAgIGN1cnJfdGVtcG8gPSBwYXJtOworCQkgICAgfQorCQkgIGJyZWFrOworCisJICBjYXNlIFRNUl9FQ0hPOgorCQkgIHNlcV9jb3B5X3RvX2lucHV0KGV2ZW50LCA4KTsKKwkJICBicmVhazsKKworCSAgZGVmYXVsdDo7CisJICB9CisKKwlyZXR1cm4gVElNRVJfTk9UX0FSTUVEOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworZGVmX3Rtcl9nZXRfdGltZShpbnQgZGV2KQoreworCWlmICghb3BlbmVkKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBjdXJyX3RpY2tzOworfQorCisvKiBzYW1lIGFzIHNvdW5kX3RpbWVyLmM6dGltZXJfaW9jdGwhPyAqLworc3RhdGljIGludCBkZWZfdG1yX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IF9fdXNlciAqcCA9IGFyZzsKKwlpbnQgdmFsOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORENUTF9UTVJfU09VUkNFOgorCQlyZXR1cm4gX19wdXRfdXNlcihUTVJfSU5URVJOQUwsIHApOworCisJY2FzZSBTTkRDVExfVE1SX1NUQVJUOgorCQl0bXJfcmVzZXQoKTsKKwkJdG1yX3J1bm5pbmcgPSAxOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX1RNUl9TVE9QOgorCQl0bXJfcnVubmluZyA9IDA7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfVE1SX0NPTlRJTlVFOgorCQl0bXJfcnVubmluZyA9IDE7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfVE1SX1RJTUVCQVNFOgorCQlpZiAoX19nZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwpIHsKKwkJCWlmICh2YWwgPCAxKQorCQkJCXZhbCA9IDE7CisJCQlpZiAodmFsID4gMTAwMCkKKwkJCQl2YWwgPSAxMDAwOworCQkJY3Vycl90aW1lYmFzZSA9IHZhbDsKKwkJfQorCQlyZXR1cm4gX19wdXRfdXNlcihjdXJyX3RpbWViYXNlLCBwKTsKKworCWNhc2UgU05EQ1RMX1RNUl9URU1QTzoKKwkJaWYgKF9fZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsKSB7CisJCQlpZiAodmFsIDwgOCkKKwkJCQl2YWwgPSA4OworCQkJaWYgKHZhbCA+IDI1MCkKKwkJCQl2YWwgPSAyNTA7CisJCQl0bXJfb2ZmcyA9IHRtcl9jdHI7CisJCQl0aWNrc19vZmZzICs9IHRtcjJ0aWNrcyh0bXJfY3RyKTsKKwkJCXRtcl9jdHIgPSAwOworCQkJY3Vycl90ZW1wbyA9IHZhbDsKKwkJCXJlcHJvZ3JhbV90aW1lcigpOworCQl9CisJCXJldHVybiBfX3B1dF91c2VyKGN1cnJfdGVtcG8sIHApOworCisJY2FzZSBTTkRDVExfU0VRX0NUUkxSQVRFOgorCQlpZiAoX19nZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMCkJLyogQ2FuJ3QgY2hhbmdlICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdmFsID0gKChjdXJyX3RlbXBvICogY3Vycl90aW1lYmFzZSkgKyAzMCkgLyA2MDsKKwkJcmV0dXJuIF9fcHV0X3VzZXIodmFsLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfU0VRX0dFVFRJTUU6CisJCXJldHVybiBfX3B1dF91c2VyKGN1cnJfdGlja3MsIHApOworCQkKKwljYXNlIFNORENUTF9UTVJfTUVUUk9OT01FOgorCQkvKiBOT1AgKi8KKwkJYnJlYWs7CisJCQorCWRlZmF1bHQ6OworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQKK2RlZl90bXJfYXJtKGludCBkZXYsIGxvbmcgdGltZSkKK3sKKwlpZiAodGltZSA8IDApCisJCXRpbWUgPSBjdXJyX3RpY2tzICsgMTsKKwllbHNlIGlmICh0aW1lIDw9IGN1cnJfdGlja3MpCS8qIEl0J3MgdGhlIHRpbWUgKi8KKwkJcmV0dXJuOworCisJbmV4dF9ldmVudF90aW1lID0gcHJldl9ldmVudF90aW1lID0gdGltZTsKKworCXJldHVybjsKK30KKworc3RydWN0IHNvdW5kX3RpbWVyX29wZXJhdGlvbnMgZGVmYXVsdF9zb3VuZF90aW1lciA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pbmZvCQk9IHsiU3lzdGVtIGNsb2NrIiwgMH0sCisJLnByaW9yaXR5CT0gMCwJLyogUHJpb3JpdHkgKi8KKwkuZGV2bGluawk9IDAsCS8qIExvY2FsIGRldmljZSBsaW5rICovCisJLm9wZW4JCT0gZGVmX3Rtcl9vcGVuLAorCS5jbG9zZQkJPSBkZWZfdG1yX2Nsb3NlLAorCS5ldmVudAkJPSBkZWZfdG1yX2V2ZW50LAorCS5nZXRfdGltZQk9IGRlZl90bXJfZ2V0X3RpbWUsCisJLmlvY3RsCQk9IGRlZl90bXJfaW9jdGwsCisJLmFybV90aW1lcgk9IGRlZl90bXJfYXJtCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3RyaWRlbnQuYyBiL3NvdW5kL29zcy90cmlkZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1MzdmMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy90cmlkZW50LmMKQEAgLTAsMCArMSw0NjI4IEBACisvKgorICoJT1NTIGRyaXZlciBmb3IgTGludXggMi5bNDZdLnggZm9yCisgKgorICoJVHJpZGVudCA0RC1XYXZlCisgKglTaVMgNzAxOAorICoJQUxpIDU0NTEKKyAqCVR2aWEvSUdTVCBDeWJlclBybyA1MDUwCisgKgorICoJRHJpdmVyOiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqICBCdWlsdCBmcm9tOgorICoJTG93IGxldmVsIGNvZGU6IDxhdWRpb0B0cmlkZW50bWljcm8uY29tPiBmcm9tIEFMU0EKKyAqCUZyYW1ld29yazogVGhvbWFzIFNhaWxlciA8c2FpbGVyQGlmZS5lZS5ldGh6LmNoPgorICoJRXh0ZW5kZWQgYnk6IFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPiAgCisgKgorICogIEhhY2tlZCB1cCBieToKKyAqCUFhcm9uIEhvbHR6bWFuIDxhaG9sdHptYUBlc3MuZW5nci51dmljLmNhPgorICoJT2xsaWUgTGhvIDxvbGxpZUBzaXMuY29tLnR3PiBTaVMgNzAxOCBBdWRpbyBDb3JlIFN1cHBvcnQKKyAqCUNoaW5nLUxpbmcgTGVlIDxjbGluZy1saUBhbGkuY29tLnR3PiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQgCisgKglNYXR0IFd1IDxtYXR0d3VAYWNlcnNvZnRlY2guY29tLmNuPiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQKKyAqCVBldGVyIFfkY2h0bGVyIDxwd2FlY2h0bGVyQGxvZXdlLWtvbXAuZGU+IEN5YmVyUHJvNTA1MCBzdXBwb3J0CisgKiAgICAgIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAbXVsaXgub3JnPgorICoKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgSGlzdG9yeQorICogIHYwLjE0LjEwagorICogIAlKYW51YXJ5IDMgMjAwNCBFdWdlbmUgVGVvIDxldWdlbmV0ZW9AZXVnZW5ldGVvLm5ldD4KKyAqICAJbWlub3IgY2xlYW51cCB0byB1c2UgcHJfZGVidWcgaW5zdGVhZCBvZiBUUkRCRyBzaW5jZSBpdCBpcyBhbHJlYWR5CisgKiAgCWRlZmluZWQgaW4gbGludXgva2VybmVsLmguCisgKiAgdjAuMTQuMTBpCisgKiAgICAgIERlY2VtYmVyIDI5IDIwMDMgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBtdWxpeC5vcmc+CisgKiAgICAgIG1ham9yIGNsZWFudXAgZm9yIDIuNiwgZml4IGEgZmV3IGVycm9yIHBhdGNoIGJ1Z2xldHMKKyAqICAgICAgd2l0aCByZXR1cm5pbmcgd2l0aG91dCBwcm9wZXJseSBjbGVhbmluZyB1cCBmaXJzdCwKKyAqICAgICAgZ2V0IHJpZCBvZiBsb2NrX2tlcm5lbCgpLgorICogIHYwLjE0LjEwaAorICoJU2VwdCAxMCAyMDAyIFBhc2NhbCBTY2htaWR0IDxkZXIuZXJlbWl0QGVtYWlsLmRlPgorICoJYWRkZWQgc3VwcG9ydCBmb3IgQUxpIDU0NTEgam95c3RpY2sgcG9ydAorICogIHYwLjE0LjEwZworICoJU2VwdCAwNSAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKglhZGFwdCB0byBuZXcgcGNpIGpveXN0aWNrIGF0dGFjaG1lbnQgaW50ZXJmYWNlCisgKiAgdjAuMTQuMTBmCisgKiAgICAgIEp1bHkgMjQgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KKyAqICAgICAgcGF0Y2ggZnJvbSBFcmljIExlbWFyICh2aWEgSWFuIFNvYm9yb2ZmKTogaW4gc3VzcGVuZCBhbmQgcmVzdW1lLCAKKyAqICAgICAgZml4IHdyb25nIGNhc3QgZnJvbSBwY2lfZGV2KiB0byBzdHJ1Y3QgdHJpZGVudF9jYXJkKi4gCisgKiAgdjAuMTQuMTBlCisgKiAgICAgIEp1bHkgMTkgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KKyAqICAgICAgcmV3cml0ZSB0aGUgRE1BIGJ1ZmZlciBhbGxvY2F0aW9uL2RlYWxsY29hdGlvbiBmdW5jdGlvbnMsIHRvIG1ha2UgaXQgCisgKiAgICAgIG1vZHVsYXIgYW5kIGZpeCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBjYWxsIGZyZWVfcGFnZXMgb24gbWVtb3J5IAorICogICAgICBvYnRhaW5lZCB3aXRoIHBjaV9hbGxvY19jb25zaXN0ZW50LiBBbHNvIHJlbW92ZSB1bm5lY2Vzc2FyeSAjaWZkZWYgCisgKiAgICAgIENPTkZJR19QUk9DX0ZTIGFuZCB2YXJpb3VzIG90aGVyIGNsZWFudXBzLgorICogIHYwLjE0LjEwZAorICogICAgICBKdWx5IDE5IDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+CisgKiAgICAgIG1hZGUgc2V2ZXJhbCBwcmludGsoS0VSTl9OT1RJQ0UuLi4pIGludG8gVFJEQkcoLi4uKSwgdG8gYXZvaWQgc3BhbW1pbmcKKyAqICAgICAgbXkgc3lzbG9nIHdpdGggaHVuZHJlZHMgb2YgbWVzc2FnZXMuIAorICogIHYwLjE0LjEwYworICogICAgICBKdWx5IDE2IDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+CisgKiAgICAgIENsZWFuZWQgdXAgTGVpIEh1J3MgMC40LjEwIGRyaXZlciB0byBjb25mb3JtIHRvIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKKyAqICAgICAgYW5kIHRoZSBjb2Rpbmcgc3R5bGUgdXNlZCBpbiB0aGUgcmVzdCBvZiB0aGUgZmlsZS4gCisgKiAgdjAuMTQuMTBiCisgKiAgICAgIEp1bmUgMjMgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KKyAqICAgICAgYWRkIGEgbWlzc2luZyB1bmxvY2tfc2V0X2ZtdCwgcmVtb3ZlIGEgc3VwZXJmbG91cyBsb2NrL3VubG9jayBwYWlyIAorICogICAgICB3aXRoIG5vdGhpbmcgaW4gYmV0d2Vlbi4gCisgKiAgdjAuMTQuMTBhCisgKiAgICAgIEp1bmUgMjEgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4gCisgKiAgICAgIHVzZSBhIGRlYnVnIG1hY3JvIGluc3RlYWQgb2YgI2lmZGVmIENPTkZJR19ERUJVRywgdHJpbSB0byA4MCBjb2x1bW5zIAorICogICAgICBwZXIgbGluZSwgdXNlICdkbyB7fSB3aGlsZSAoMCknIGluIHN0YXRlbWVudCBtYWNyb3MuIAorICogIHYwLjE0LjEwCisgKiAgICAgIEp1bmUgNiAyMDAyIExlaSBIdSA8TGVpX2h1QGFsaS5jb20udHc+CisgKiAgICAgIHJld3JpdGUgdGhlIHBhcnQgdG8gcmVhZC93cml0ZSByZWdpc3RlcnMgb2YgYXVkaW8gY29kZWMgZm9yIEFsaTU0NTEgCisgKiAgdjAuMTQuOWUKKyAqICAgICAgSmFudWFyeSAyIDIwMDIgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAdWN3LmN6PiBhZGRlZCBnYW1lcG9ydAorICogICAgICBzdXBwb3J0IHRvIGF2b2lkIHJlc291cmNlIGNvbmZsaWN0IHdpdGggcGNpZ2FtZS5jCisgKiAgdjAuMTQuOWQKKyAqICAJT2N0b2JlciA4IDIwMDEgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKgl1c2Ugc2V0X2N1cnJlbnRfc3RhdGUsIHByb3Blcmx5IHJlbGVhc2UgcmVzb3VyY2VzIG9uIGZhaWx1cmUgaW4KKyAqCXRyaWRlbnRfcHJvYmUsIGdldCByaWQgb2YgY2hlY2tfcmVnaW9uCisgKiAgdjAuMTQuOWMKKyAqCUF1Z3VzdCAxMCAyMDAxIFBldGVyIFfkY2h0bGVyIDxwd2FlY2h0bGVyQGxvZXdlLWtvbXAuZGU+CisgKglhZGRlZCBzdXBwb3J0IGZvciBUdmlhIChmb3JtZXJseSBJbnRlZ3JhcGhpY3MvSUdTVCkgQ3liZXJQcm81MDUwCisgKgl0aGlzIGNoaXAgaXMgb2Z0ZW4gZm91bmQgaW4gc2V0dG9wIGJveGVzIChjb21iaW5lZCB2aWRlbythdWRpbykKKyAqICB2MC4xNC45YgorICoJU3dpdGNoIHRvIHN0YXRpYyBpbmxpbmUgbm90IGV4dGVybiBpbmxpbmUgKGdjYyAzKQorICogIHYwLjE0LjlhCisgKglBdWcgNiAyMDAxIEFsYW4gQ294CisgKgkwLjE0LjkgY3Jhc2hlZCBvbiBybW1vZCBkdWUgdG8gYSB0aW1lci9iaCBsZWZ0IHJ1bm5pbmcuIFNpbXBsaWZpZWQKKyAqCXRoZSBleGlzdGluZyBsb2dpYyAodGhlIEJIIGRvZXNuJ3QgaGVscCBhcyBhYzk3IGlzIGxvY2tfaXJxc2F2ZSkKKyAqCWFuZCB1c2VkIGRlbF90aW1lcl9zeW5jIHRvIGNsZWFuIHVwCisgKglGaXhlZCBhIHByb2JsZW0gd2hlcmUgdGhlIEFMaSBjaGFuZ2UgYnJva2UgbXkgZ2VuZXJpYyBjYXJkCisgKiAgdjAuMTQuOQorICoJSnVsIDEwIDIwMDEgTWF0dCBXdQorICoJQWRkIEgvVyBWb2x1bWUgQ29udHJvbAorICogIHYwLjE0LjhhCisgKglKdWx5IDcgMjAwMSBBbGFuIENveAorICoJTW92ZWQgTWF0dCBXdSdzIGFjOTcgcmVnaXN0ZXIgY2FjaGUgaW50byB0aGUgY2FyZCBzdHJ1Y3R1cmUKKyAqICB2MC4xNC44CisgKglBcHIgMzAgMjAwMSBNYXR0IFd1CisgKglTZXQgRUJVRjEgYW5kIEVCVUYyIHRvIHN0aWxsIG1vZGUKKyAqCUFkZCBkYzk3L2FjOTcgcmVzZXQgZnVuY3Rpb24KKyAqCUZpeCBwb3dlciBtYW5hZ2VtZW50OiBhbGlfcmVzdG9yZV9yZWdzCisgKiAgdW5yZWxlYXNlZCAKKyAqCU1hciAwOSAyMDAxIE1hdHQgV3UKKyAqCUFkZCBjYWNoZSBmb3IgYWM5NyBhY2Nlc3MKKyAqICB2MC4xNC43CisgKglGZWIgMDYgMjAwMSBNYXR0IFd1CisgKglGaXggYWM5NyBpbml0aWFsaXphdGlvbgorICoJRml4IGJ1ZzogYW4gZXh0cmEgdGFpbCB3aWxsIGJlIHBsYXllZCB3aGVuIHBsYXlpbmcKKyAqCUphbiAwNSAyMDAxIE1hdHQgV3UKKyAqCUltcGxlbWVudCBtdWx0aS1jaGFubmVscyBhbmQgUy9QRElGIGluIHN1cHBvcnQgZm9yIEFMaSAxNTM1KworICogIHYwLjE0LjYgCisgKglOb3YgMSAyMDAwIENoaW5nLUxpbmcgTGVlCisgKglGaXggdGhlIGJ1ZyBvZiBtZW1vcnkgbGVhayB3aGVuIHN3aXRjaGluZyA1LjEtY2hhbm5lbHMgdG8gMiBjaGFubmVscy4KKyAqCUFkZCBsb2NrIHByb3RlY3Rpb24gaW50byBkeW5hbWljIGNoYW5naW5nIGZvcm1hdCBvZiBkYXRhLgorICoJT2N0IDE4IDIwMDAgQ2hpbmctTGluZyBMZWUKKyAqCTUuMS1jaGFubmVscyBzdXBwb3J0IGZvciBBTGkKKyAqCUp1bmUgMjggMjAwMCBDaGluZy1MaW5nIExlZQorICoJUy9QRElGIG91dC9pbihwbGF5YmFjay9yZWNvcmQpIHN1cHBvcnQgZm9yIEFMaSAxNTM1KywgdXNpbmcgL3Byb2MgdG8gYmUgc2VsZWN0ZWQgYnkgdXNlcgorICoJU2ltcGxlIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBmb3IgQUxpCisgKiAgdjAuMTQuNSBNYXkgMjMgMjAwMCBPbGxpZSBMaG8KKyAqICAJTWlzYyBidWcgZml4IGZyb20gdGhlIE5ldAorICogIHYwLjE0LjQgTWF5IDIwIDIwMDAgQWFyb24gSG9sdHptYW4KKyAqICAJRml4IGtmcmVlJ2QgbWVtb3J5IGFjY2VzcyBpbiByZWxlYXNlCisgKiAgCUZpeCByYWNlIGluIG9wZW4gd2hpbGUgbG9va2luZyBmb3IgYSBmcmVlIHZpcnR1YWwgY2hhbm5lbCBzbG90CisgKiAgCXJlbW92ZSBvcGVuX3dhaXQgd3EgKHdoaWNoIGFwcGVhcnMgdG8gYmUgdW51c2VkKQorICogIHYwLjE0LjMgTWF5IDEwIDIwMDAgT2xsaWUgTGhvCisgKglmaXhlZCBhIHNtYWxsIGJ1ZyBpbiB0cmlkZW50X3VwZGF0ZV9wdHIsIHhtbXMgMS4wLjEgbm8gbG9uZ2VyIHVzZXMgMTAwJSBDUFUKKyAqICB2MC4xNC4yIE1hciAyOSAyMDAwIENoaW5nLUxpbmcgTGVlCisgKglBZGQgY2xlYXIgdG8gc2lsZW5jZSBhZHZhbmNlIGluIHRyaWRlbnRfdXBkYXRlX3B0ciAKKyAqCWZpeCBpbnZhbGlkIGRhdGEgb2YgdGhlIGVuZCBvZiB0aGUgc291bmQKKyAqICB2MC4xNC4xIE1hciAyNCAyMDAwIENoaW5nLUxpbmcgTGVlCisgKglBTGkgNTQ1MSBzdXBwb3J0IGFkZGVkLCBwbGF5YmFjayBhbmQgcmVjb3JkaW5nIE8uSy4KKyAqCUFMaSA1NDUxIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBzdHJ1Y3R1cmVkIGJhc2VkIG9uIHNvbmljdmliZXMsIGFuZAorICoJc3VnZ2VzdGVkIHRvIG1lcmdlIGludG8gdGhpcyBmaWxlIGJ5IEFsYW4gQ294LgorICogIHYwLjE0IE1hciAxNSAyMDAwIE9sbGllIExobworICoJNS4xIGNoYW5uZWwgb3V0cHV0IHN1cHBvcnQgd2l0aCBjaGFubmVsIGJpbmRpbmcuIFdoYXQncyB0aGUgTWF0cml4ID8KKyAqICB2MC4xMy4xIE1hciAxMCAyMDAwIE9sbGllIExobworICoJZmV3IG1pbm9yIGJ1Z3Mgb24gZHVhbCBjb2RlYyBzdXBwb3J0LCBuZWVkcyBtb3JlIHRlc3RpbmcKKyAqICB2MC4xMyBNYXIgMDMgMjAwMCBPbGxpZSBMaG8KKyAqCW5ldyBwY2lfKiBmb3IgMi40IGtlcm5lbCwgYmFjayBwb3J0ZWQgdG8gMi4yCisgKiAgdjAuMTIgRmViIDIzIDIwMDAgT2xsaWUgTGhvCisgKglQcmVsaW1pbmFyeSBSZWNvcmRpbmcgc3VwcG9ydAorICogIHYwLjExLjIgRmViIDE5IDIwMDAgT2xsaWUgTGhvCisgKglyZW1vdmVkIGluY29tcGxldGUgZnVsbC1kdWxwbGV4IHN1cHBvcnQKKyAqICB2MC4xMS4xIEphbiAyOCAyMDAwIE9sbGllIExobworICoJc21hbGwgYnVnIGluIHNldHRpbmcgc2FtcGxlIHJhdGUgZm9yIDRkLW54IChyZXBvcnRlZCBieSBBYXJvbikKKyAqICB2MC4xMSBKYW4gMjcgMjAwMCBPbGxpZSBMaG8KKyAqCURNQSBidWcsIHNjaGVkdWxlciBsYXRlbmN5LCBzZWNvbmQgdHJ5CisgKiAgdjAuMTAgSmFuIDI0IDIwMDAgT2xsaWUgTGhvCisgKglETUEgYnVnIGZpeGVkLCBmb3VuZCBrZXJuZWwgc2NoZWR1bGluZyBwcm9ibGVtCisgKiAgdjAuMDkgSmFuIDIwIDIwMDAgT2xsaWUgTGhvCisgKglDbGVhbiB1cCBvZiBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyByb3V0aW5lIChwcmVwYXJlIGZvciBjaGFubmVsIGJpbmRpbmcpCisgKiAgdjAuMDggSmFuIDE0IDIwMDAgT2xsaWUgTGhvCisgKglJc29sYXRpb24gb2YgQUM5NyBjb2RlYyBjb2RlCisgKiAgdjAuMDcgSmFuIDEzIDIwMDAgT2xsaWUgTGhvCisgKglHZXQgcmlkIG9mIHVnbHkgb2xkIGxvdyBsZXZlbCBhY2Nlc3Mgcm91dGluZXMgKGUuZy4gQ0hSZWdzLmxwKioqKikKKyAqICB2MC4wNiBKYW4gMTEgMjAwMCBPbGxpZSBMaG8KKyAqCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGR1YWwgKG1vcmUgPykgQUM5NyBjb2RlY3MKKyAqICB2MC4wNSBKYW4gMDggMjAwMCBMdWNhIE1vbnRlY2NoaWFuaSA8bS5sdWNhQGluYW1lLmNvbT4KKyAqCWFkYXB0IHRvIDIuMy54IG5ldyBfX3NldHVwL19faW5pdCBjYWxsCisgKiAgdjAuMDQgRGVjIDMxIDE5OTkgT2xsaWUgTGhvCisgKglNdWx0aXBsZSBPcGVuLCB1c2luZyBNaWRkbGUgTG9vcCBJbnRlcnJ1cHQgdG8gc21vb3RoIHBsYXliYWNrCisgKiAgdjAuMDMgRGVjIDI0IDE5OTkgT2xsaWUgTGhvCisgKgltZW0gbGVhayBpbiBwcm9nX2RtYWJ1ZiBhbmQgZGVhbGxvY19kbWFidWYgcmVtb3ZlZAorICogIHYwLjAyIERlYyAxNSAxOTk5IE9sbGllIExobworICoJU2lTIDcwMTggc3VwcG9ydCBhZGRlZCwgcGxheWJhY2sgTy5LLgorICogIHYwLjAxIEFsYW4gQ294IGV0LiBhbC4KKyAqCUluaXRpYWwgUmVsZWFzZSBpbiBrZXJuZWwgMi4zLjMwLCBkb2VzIG5vdCB3b3JrCisgKiAKKyAqICBUb0RvCisgKglDbGVhbiB1cCBvZiBsb3cgbGV2ZWwgY2hhbm5lbCByZWdpc3RlciBhY2Nlc3MgY29kZS4gKGRvbmUpCisgKglGaXggdGhlIGJ1ZyBvbiBkbWEgYnVmZmVyIG1hbmFnZW1lbnQgaW4gdXBkYXRlX3B0ciwgcmVhZC93cml0ZSwgZHJhaW5fZGFjIChkb25lKQorICoJRHVhbCBBQzk3IGNvZGVjcyBzdXBwb3J0IChkb25lKQorICoJUmVjb3JkaW5nIHN1cHBvcnQgKGRvbmUpCisgKglNbWFwIHN1cHBvcnQKKyAqCSJDaGFubmVsIEJpbmRpbmciIGlvY3RsIGV4dGVuc2lvbiAoZG9uZSkKKyAqCW5ldyBwY2kgZGV2aWNlIGRyaXZlciBpbnRlcmZhY2UgZm9yIDIuNCBrZXJuZWwgKGRvbmUpCisgKgorICoJTG9jayBvcmRlciAoaGlnaC0+bG93KQorICoJCWxvY2sJLQloYXJkd2FyZSBsb2NrCisgKgkJb3Blbl9zZW0gLSAJZ3VhcmQgb3BlbnMKKyAqCQlzZW0JLQlndWFyZCBkbWFidWYsIHdyaXRlIHJlLWVudHJ5IGV0YworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0FMUEhBX05BVVRJTFVTKSB8fCBkZWZpbmVkKENPTkZJR19BTFBIQV9HRU5FUklDKQorI2luY2x1ZGUgPGFzbS9od3JwYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ0cmlkZW50LmgiCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTQuMTBqLTIuNiIKKworLyogbWFnaWMgbnVtYmVycyB0byBwcm90ZWN0IG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgVFJJREVOVF9DQVJEX01BR0lDCTB4NTA3MjY5NkUJLyogIlByaW4iICovCisjZGVmaW5lIFRSSURFTlRfU1RBVEVfTUFHSUMJMHg2MzY1NzM3MwkvKiAiY2VzcyIgKi8KKworI2RlZmluZSBUUklERU5UX0RNQV9NQVNLCTB4M2ZmZmZmZmYJLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLworI2RlZmluZSBBTElfRE1BX01BU0sJCTB4N2ZmZmZmZmYJLyogQUxJIFRyaWRlbnRzIGhhdmUgMzEtYml0IERNQS4gV293LiAqLworCisjZGVmaW5lIE5SX0hXX0NICQkzMgorCisvKiBtYXhpbXVtIG51bWJlciBvZiBBQzk3IGNvZGVjcyBjb25uZWN0ZWQsIEFDOTcgMi4wIGRlZmluZWQgNCwgYnV0IDcwMTggYW5kIDRELU5YIG9ubHkKKyAgIGhhdmUgMiBTREFUQV9JTiBsaW5lcyAoY3VycmVudGx5KSAqLworI2RlZmluZSBOUl9BQzk3CQkyCisKKy8qIG1pbm9yIG51bWJlciBvZiAvZGV2L3N3bW9kZW0gKHRlbXBvcmFyeSwgZXhwZXJpbWVudGFsKSAqLworI2RlZmluZSBTTkRfREVWX1NXTU9ERU0JNworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgYWxpX211bHRpX2NoYW5uZWxzXzVfMVtdID0geworCS8qQUxJX1NVUlJfTEVGVF9DSEFOTkVMLCBBTElfU1VSUl9SSUdIVF9DSEFOTkVMLCAqLworCUFMSV9DRU5URVJfQ0hBTk5FTCwKKwlBTElfTEVGX0NIQU5ORUwsCisJQUxJX1NVUlJfTEVGVF9DSEFOTkVMLAorCUFMSV9TVVJSX1JJR0hUX0NIQU5ORUwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9tYWdpY1tdID0gS0VSTl9DUklUICJ0cmlkZW50OiBpbnZhbGlkIG1hZ2ljIHZhbHVlIGluICVzXG4iOworCitlbnVtIHsKKwlUUklERU5UXzREX0RYID0gMCwKKwlUUklERU5UXzREX05YLAorCVNJU183MDE4LAorCUFMSV81NDUxLAorCUNZQkVSNTA1MAorfTsKKworc3RhdGljIGNoYXIgKmNhcmRfbmFtZXNbXSA9IHsKKwkiVHJpZGVudCA0RFdhdmUgRFgiLAorCSJUcmlkZW50IDREV2F2ZSBOWCIsCisJIlNpUyA3MDE4IFBDSSBBdWRpbyIsCisJIkFMaSBBdWRpbyBBY2NlbGVyYXRvciIsCisJIlR2aWEvSUdTVCBDeWJlclBybyA1MDUwIgorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRyaWRlbnRfcGNpX3RibFtdID0geworCXtQQ0lfVkVORE9SX0lEX1RSSURFTlQsIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFgsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRSSURFTlRfNERfRFh9LAorCXtQQ0lfVkVORE9SX0lEX1RSSURFTlQsIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlgsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRSSURFTlRfNERfTlh9LAorCXtQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzcwMTgsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFNJU183MDE4fSwKKwl7UENJX1ZFTkRPUl9JRF9BTEksIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFMSV81NDUxfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFUkcsIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTAsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENZQkVSNTA1MH0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRyaWRlbnRfcGNpX3RibCk7CisKKy8qICJzb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AgKi8KK3N0cnVjdCB0cmlkZW50X3N0YXRlIHsKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsJLyogQ2FyZCBpbmZvICovCisKKwkvKiBmaWxlIG1vZGUgKi8KKwltb2RlX3Qgb3Blbl9tb2RlOworCisJLyogdmlydHVhbCBjaGFubmVsIG51bWJlciAqLworCWludCB2aXJ0OworCisJc3RydWN0IGRtYWJ1ZiB7CisJCS8qIHdhdmUgc2FtcGxlIHN0dWZmICovCisJCXVuc2lnbmVkIGludCByYXRlOworCQl1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlOworCisJCS8qIGhhcmR3YXJlIGNoYW5uZWwgKi8KKwkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbDsKKworCQkvKiBPU1MgYnVmZmVyIG1hbmFnZW1lbnQgc3R1ZmYgKi8KKwkJdm9pZCAqcmF3YnVmOworCQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisJCXVuc2lnbmVkIGJ1Zm9yZGVyOworCQl1bnNpZ25lZCBudW1mcmFnOworCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CisKKwkJLyogb3VyIGJ1ZmZlciBhY3RzIGxpa2UgYSBjaXJjdWxhciByaW5nICovCisJCXVuc2lnbmVkIGh3cHRyOwkvKiB3aGVyZSBkbWEgbGFzdCBzdGFydGVkLCB1cGRhdGVkIGJ5IHVwZGF0ZV9wdHIgKi8KKwkJdW5zaWduZWQgc3dwdHI7CS8qIHdoZXJlIGRyaXZlciBsYXN0IGNsZWFyL2ZpbGxlZCwgdXBkYXRlZCBieSByZWFkL3dyaXRlICovCisJCWludCBjb3VudDsJLyogYnl0ZXMgdG8gYmUgY29tc3VtZWQgb3IgYmVlbiBnZW5lcmF0ZWQgYnkgZG1hIG1hY2hpbmUgKi8KKwkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIGRtYWVkIGJ5IGhhcmR3YXJlICovCisKKwkJdW5zaWduZWQgZXJyb3I7CS8qIG51bWJlciBvZiBvdmVyL3VuZGVycnVucyAqLworICAgICAgICAgICAgICAgIC8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwkKKworCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCisJCXVuc2lnbmVkIGZyYWdzaXplOworCQl1bnNpZ25lZCBkbWFzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKworCQkvKiBPU1Mgc3R1ZmYgKi8KKwkJdW5zaWduZWQgbWFwcGVkOjE7CisJCXVuc2lnbmVkIHJlYWR5OjE7CisJCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKKwkJdW5zaWduZWQgdXBkYXRlX2ZsYWc7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKworCX0gZG1hYnVmOworCisJLyogNS4xIGNoYW5uZWxzICovCisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKm90aGVyX3N0YXRlc1s0XTsKKwlpbnQgbXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50OworCXVuc2lnbmVkIGNoYW5zX251bTsKKwl1bnNpZ25lZCBsb25nIGZtdF9mbGFnOworCS8qIEd1YXJkIGFnYWluc3QgbW1hcC93cml0ZS9yZWFkIHJhY2VzICovCisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisKK307CisKKy8qIGhhcmR3YXJlIGNoYW5uZWxzICovCitzdHJ1Y3QgdHJpZGVudF9jaGFubmVsIHsKKwlpbnQgbnVtOyAvKiBjaGFubmVsIG51bWJlciAqLworCXUzMiBsYmE7IC8qIExvb3AgQmVnaW5lIEFkZHJlc3MsIHdoZXJlIGRtYSBidWZmZXIgc3RhcnRzICovCisJdTMyIGVzbzsgLyogRW5kIFNhbXBsZSBPZmZzZXQsIHdlaHJlIGRtYSBidWZmZXIgZW5kcyAqLyAKKwkgICAgICAgICAvKiAoaW4gdGhlIHVuaXQgb2Ygc2FtcGxlcykgKi8KKwl1MzIgZGVsdGE7IC8qIGRlbHRhIHZhbHVlLCBzYW1wbGUgcmF0ZSAvIDQ4ayBmb3IgcGxheWJhY2ssICovCisJICAgICAgICAgICAvKiA0OGsvc2FtcGxlIHJhdGUgZm9yIHJlY29yZGluZyAqLworCXUxNiBhdHRyaWJ1dGU7IC8qIGNvbnRyb2wgd2hlcmUgUENNIGRhdGEgZ28gYW5kIGNvbWUgICovCisJdTE2IGZtX3ZvbDsKKwl1MzIgY29udHJvbDsgLyogc2lnbmVkL3Vuc2lnbmVkLCA4LzE2IGJpdHMsIG1vbm8vc3RlcmVvICovCit9OworCitzdHJ1Y3QgdHJpZGVudF9wY21fYmFua19hZGRyZXNzIHsKKwl1MzIgc3RhcnQ7CisJdTMyIHN0b3A7CisJdTMyIGFpbnQ7CisJdTMyIGFpbnRfZW47Cit9OworCitzdGF0aWMgc3RydWN0IHRyaWRlbnRfcGNtX2JhbmtfYWRkcmVzcyBiYW5rX2FfYWRkcnMgPSB7CisJVDREX1NUQVJUX0EsCisJVDREX1NUT1BfQSwKKwlUNERfQUlOVF9BLAorCVQ0RF9BSU5URU5fQQorfTsKKworc3RhdGljIHN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgYmFua19iX2FkZHJzID0geworCVQ0RF9TVEFSVF9CLAorCVQ0RF9TVE9QX0IsCisJVDREX0FJTlRfQiwKKwlUNERfQUlOVEVOX0IKK307CisKK3N0cnVjdCB0cmlkZW50X3BjbV9iYW5rIHsKKwkvKiByZWdpc3RlciBhZGRyZXNzZXMgdG8gY29udHJvbCBiYW5rIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFua19hZGRyZXNzICphZGRyZXNzZXM7CisJLyogZWFjaCBiYW5rIGhhcyAzMiBjaGFubmVscyAqLworCXUzMiBiaXRtYXA7CQkvKiBjaGFubmVsIGFsbG9jYXRpb24gYml0bWFwICovCisJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCBjaGFubmVsc1szMl07Cit9OworCitzdHJ1Y3QgdHJpZGVudF9jYXJkIHsKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisKKwkvKiBXZSBrZWVwIHRyaWRlbnQgY2FyZHMgaW4gYSBsaW5rZWQgbGlzdCAqLworCXN0cnVjdCB0cmlkZW50X2NhcmQgKm5leHQ7CisKKwkvKiBzaW5nbGUgb3BlbiBsb2NrIG1lY2hhbmlzbSwgb25seSB1c2VkIGZvciByZWNvcmRpbmcgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCisJLyogVGhlIHRyaWRlbnQgaGFzIGEgY2VydGFpbiBhbW91bnQgb2YgY3Jvc3MgY2hhbm5lbCBpbnRlcmFjdGlvbgorCSAgIHNvIHdlIHVzZSBhIHNpbmdsZSBwZXIgY2FyZCBsb2NrICovCisJc3BpbmxvY2tfdCBsb2NrOworCisJLyogUENJIGRldmljZSBzdHVmZiAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXUxNiBwY2lfaWQ7CisJdTggcmV2aXNpb247CisKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgZGV2X2F1ZGlvOworCisJLyogc3RydWN0dXJlcyBmb3IgYWJzdHJhY3Rpb24gb2YgaGFyZHdhcmUgZmFjaWxpdGllcywgY29kZWNzLCAqLyAKKwkvKiBiYW5rcyBhbmQgY2hhbm5lbHMgKi8KKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayBiYW5rc1tOUl9CQU5LU107CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlc1tOUl9IV19DSF07CisKKwkvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBsb25nIGlvYmFzZTsKKwl1MzIgaXJxOworCisJLyogRnVuY3Rpb24gc3VwcG9ydCAqLworCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKigqYWxsb2NfcGNtX2NoYW5uZWwpIChzdHJ1Y3QgdHJpZGVudF9jYXJkICopOworCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKigqYWxsb2NfcmVjX3BjbV9jaGFubmVsKSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKTsKKwl2b2lkICgqZnJlZV9wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKiwgdW5zaWduZWQgaW50IGNoYW4pOworCXZvaWQgKCphZGRyZXNzX2ludGVycnVwdCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKik7CisKKwkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgZm9yIHNwZGlmIGluICovCisJaW50IG11bHRpX2NoYW5uZWxfdXNlX2NvdW50OworCWludCByZWNfY2hhbm5lbF91c2VfY291bnQ7CisJdTE2IG1peGVyX3JlZ3NbNjRdW05SX0FDOTddOwkvKiBNYWRlIGNhcmQgbG9jYWwgYnkgQWxhbiAqLworCWludCBtaXhlcl9yZWdzX3JlYWR5OworCisJLyogQWRkZWQgZm9yIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sICovCisJaW50IGh3dm9sY3RsOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJLyogR2FtZSBwb3J0IHN1cHBvcnQgKi8KKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworfTsKKworZW51bSBkbWFidWZfbW9kZSB7CisJRE1fUExBWUJBQ0sgPSAwLAorCURNX1JFQ09SRAorfTsKKworLyogdGFibGUgdG8gbWFwIGZyb20gQ0hBTk5FTE1BU0sgdG8gY2hhbm5lbCBhdHRyaWJ1dGUgZm9yIFNpUyA3MDE4ICovCitzdGF0aWMgdTE2IG1hc2syYXR0cltdID0geworCVBDTV9MUiwgUENNX0xSLCBTVVJSX0xSLCBDRU5URVJfTEZFLAorCUhTRVQsIE1JQywgTU9ERU1fTElORTEsIE1PREVNX0xJTkUyLAorCUkyU19MUiwgU1BESUZfTFIKK307CisKKy8qIHRhYmxlIHRvIG1hcCBmcm9tIGNoYW5uZWwgYXR0cmlidXRlIHRvIENIQU5ORUxNQVNLIGZvciBTaVMgNzAxOCAqLworc3RhdGljIGludCBhdHRyMm1hc2tbXSA9IHsKKwlEU1BfQklORF9NT0RFTTEsIERTUF9CSU5EX01PREVNMiwgRFNQX0JJTkRfRlJPTlQsIERTUF9CSU5EX0hBTkRTRVQsCisJRFNQX0JJTkRfSTJTLCBEU1BfQklORF9DRU5URVJfTEZFLCBEU1BfQklORF9TVVJSLCBEU1BfQklORF9TUERJRgorfTsKKworLyogQWRkZWQgYnkgTWF0dCBXdSAwMS0wNS0yMDAxIGZvciBzcGRpZiBpbiAqLworc3RhdGljIGludCBhbGlfY2xvc2VfbXVsdGlfY2hhbm5lbHModm9pZCk7CitzdGF0aWMgdm9pZCBhbGlfZGVsYXkoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGludGVydmFsKTsKK3N0YXRpYyB2b2lkIGFsaV9kZXRlY3Rfc3BkaWZfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKTsKKworc3RhdGljIHZvaWQgYWxpX2FjOTdfd3JpdGUoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWwpOworc3RhdGljIHUxNiBhbGlfYWM5N19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKTsKKworc3RhdGljIHN0cnVjdCB0cmlkZW50X2NhcmQgKmRldnM7CisKK3N0YXRpYyB2b2lkIHRyaWRlbnRfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWwpOworc3RhdGljIHUxNiB0cmlkZW50X2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKTsKKworc3RhdGljIGludCB0cmlkZW50X29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdHJpZGVudF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIHZvaWQgYWxpX2FjOTdfc2V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBzZWNvbmRhcnksIHU4IHJlZywgdTE2IHZhbCk7CitzdGF0aWMgdTE2IGFsaV9hYzk3X2dldChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgc2Vjb25kYXJ5LCB1OCByZWcpOworc3RhdGljIHZvaWQgYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgcmF0ZSk7CitzdGF0aWMgdm9pZCBhbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdCk7CitzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqYWxpX2FsbG9jX3JlY19wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKTsKK3N0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICphbGlfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CitzdGF0aWMgdm9pZCBhbGlfcmVzdG9yZV9yZWdzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOworc3RhdGljIHZvaWQgYWxpX3NhdmVfcmVncyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKTsKK3N0YXRpYyBpbnQgdHJpZGVudF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCB1bnVzZWQpOworc3RhdGljIGludCB0cmlkZW50X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3N0YXRpYyB2b2lkIGFsaV9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKK3N0YXRpYyBpbnQgYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaGFuX251bXMpOworc3RhdGljIHVuc2lnbmVkIGludCBhbGlfZ2V0X3NwZGlmX2luX3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CitzdGF0aWMgdm9pZCBhbGlfc2V0dXBfc3BkaWZfaW4oc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CitzdGF0aWMgdm9pZCBhbGlfZGlzYWJsZV9zcGRpZl9pbihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKTsKK3N0YXRpYyB2b2lkIGFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgY2gpOworc3RhdGljIHZvaWQgYWxpX3NldHVwX3NwZGlmX291dChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgZmxhZyk7CitzdGF0aWMgaW50IGFsaV93cml0ZV81XzEoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLAorCQkJIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIAorCQkJIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwgCisJCQkgdW5zaWduZWQgaW50ICpzdGF0ZV9jbnQpOworc3RhdGljIGludCBhbGlfYWxsb2NhdGVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIAorCQkJCQkgICAgICAgaW50IGNoYW5fbnVtcyk7CitzdGF0aWMgdm9pZCBhbGlfZnJlZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSk7CisKKy8qIHNhdmUgcmVnaXN0ZXJzIGZvciBBTGkgUG93ZXIgTWFuYWdlbWVudCAqLworc3RhdGljIHN0cnVjdCBhbGlfc2F2ZWRfcmVnaXN0ZXJzIHsKKwl1bnNpZ25lZCBsb25nIGdsb2JhbF9yZWdzW0FMSV9HTE9CQUxfUkVHU107CisJdW5zaWduZWQgbG9uZyBjaGFubmVsX3JlZ3NbQUxJX0NIQU5ORUxTXVtBTElfQ0hBTk5FTF9SRUdTXTsKKwl1bnNpZ25lZCBtaXhlcl9yZWdzW0FMSV9NSVhFUl9SRUdTXTsKK30gYWxpX3JlZ2lzdGVyczsKKworI2RlZmluZSBzZWVrX29mZnNldChkbWFfcHRyLCBidWZmZXIsIGNudCwgb2Zmc2V0LCBjb3B5X2NvdW50KQlkbyB7IFwKKyAgICAgICAgKGRtYV9wdHIpICs9IChvZmZzZXQpOwkgIFwKKwkoYnVmZmVyKSArPSAob2Zmc2V0KTsJICBcCisgICAgICAgIChjbnQpIC09IChvZmZzZXQpOwkgIFwKKwkoY29weV9jb3VudCkgKz0gKG9mZnNldCk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGxvY2tfc2V0X2ZtdChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSogc3RhdGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnN0YXRlLT5mbXRfZmxhZykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bmxvY2tfc2V0X2ZtdChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSogc3RhdGUpCit7CisJY2xlYXJfYml0KDAsICZzdGF0ZS0+Zm10X2ZsYWcpOworfQorCitzdGF0aWMgaW50Cit0cmlkZW50X2VuYWJsZV9sb29wX2ludGVycnVwdHMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKK3sKKwl1MzIgZ2xvYmFsX2NvbnRyb2w7CisKKwlnbG9iYWxfY29udHJvbCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOworCisJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKKwkJZ2xvYmFsX2NvbnRyb2wgfD0gKEVORExQX0lFIHwgTUlETFBfSUUgfCBCQU5LX0JfRU4pOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgorCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CisJCWdsb2JhbF9jb250cm9sIHw9IChFTkRMUF9JRSB8IE1JRExQX0lFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJb3V0bChnbG9iYWxfY29udHJvbCwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKKworCXByX2RlYnVnKCJ0cmlkZW50OiBFbmFibGUgTG9vcCBJbnRlcnJ1cHRzLCBnbG9iY3RsID0gMHglMDhYXG4iLAorCQkgaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3RyaWRlbnRfZGlzYWJsZV9sb29wX2ludGVycnVwdHMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKK3sKKwl1MzIgZ2xvYmFsX2NvbnRyb2w7CisKKwlnbG9iYWxfY29udHJvbCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOworCWdsb2JhbF9jb250cm9sICY9IH4oRU5ETFBfSUUgfCBNSURMUF9JRSk7CisJb3V0bChnbG9iYWxfY29udHJvbCwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKKworCXByX2RlYnVnKCJ0cmlkZW50OiBEaXNhYmxlZCBMb29wIEludGVycnVwdHMsIGdsb2JjdGwgPSAweCUwOFhcbiIsCisJCSBnbG9iYWxfY29udHJvbCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3RyaWRlbnRfZW5hYmxlX3ZvaWNlX2lycShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOworCXUzMiByZWcsIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPmFpbnRfZW47CisKKwlyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOworCXJlZyB8PSBtYXNrOworCW91dGwocmVnLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CisKKyNpZmRlZiBERUJVRworCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CisJcHJfZGVidWcoInRyaWRlbnQ6IGVuYWJsZWQgSVJRIG9uIGNoYW5uZWwgJWQsICVzID0gMHglMDh4KGFkZHI6JVgpXG4iLAorCQkgY2hhbm5lbCwgYWRkciA9PSBUNERfQUlOVEVOX0IgPyAiQUlOVEVOX0IiIDogIkFJTlRFTl9BIiwKKwkJIHJlZywgYWRkcik7CisjZW5kaWYgLyogREVCVUcgKi8KK30KKworc3RhdGljIHZvaWQKK3RyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CisJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbmsgPSAmY2FyZC0+YmFua3NbY2hhbm5lbCA+PiA1XTsKKwl1MzIgcmVnLCBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50X2VuOworCisJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKKwlyZWcgJj0gfm1hc2s7CisJb3V0bChyZWcsIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKKworCS8qIEFjayB0aGUgY2hhbm5lbCBpbiBjYXNlIHRoZSBpbnRlcnJ1cHQgd2FzIHNldCBiZWZvcmUgd2UgZGlzYWJsZSBpdC4gKi8KKwlvdXRsKG1hc2ssIFRSSURfUkVHKGNhcmQsIGJhbmstPmFkZHJlc3Nlcy0+YWludCkpOworCisjaWZkZWYgREVCVUcKKwlyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOworCXByX2RlYnVnKCJ0cmlkZW50OiBkaXNhYmxlZCBJUlEgb24gY2hhbm5lbCAlZCwgJXMgPSAweCUwOHgoYWRkcjolWClcbiIsCisJCSBjaGFubmVsLCBhZGRyID09IFQ0RF9BSU5URU5fQiA/ICJBSU5URU5fQiIgOiAiQUlOVEVOX0EiLAorCQkgcmVnLCBhZGRyKTsKKyNlbmRpZiAvKiBERUJVRyAqLworfQorCitzdGF0aWMgdm9pZAordHJpZGVudF9zdGFydF92b2ljZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOworCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5zdGFydDsKKworI2lmZGVmIERFQlVHCisJdTMyIHJlZzsKKyNlbmRpZiAvKiBERUJVRyAqLworCisJb3V0bChtYXNrLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CisKKyNpZmRlZiBERUJVRworCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CisJcHJfZGVidWcoInRyaWRlbnQ6IHN0YXJ0IHZvaWNlIG9uIGNoYW5uZWwgJWQsICVzID0gMHglMDh4KGFkZHI6JVgpXG4iLAorCQkgY2hhbm5lbCwgYWRkciA9PSBUNERfU1RBUlRfQiA/ICJTVEFSVF9CIiA6ICJTVEFSVF9BIiwKKwkJIHJlZywgYWRkcik7CisjZW5kaWYgLyogREVCVUcgKi8KK30KKworc3RhdGljIHZvaWQKK3RyaWRlbnRfc3RvcF92b2ljZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOworCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5zdG9wOworCisjaWZkZWYgREVCVUcKKwl1MzIgcmVnOworI2VuZGlmIC8qIERFQlVHICovCisKKwlvdXRsKG1hc2ssIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKKworI2lmZGVmIERFQlVHCisJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKKwlwcl9kZWJ1ZygidHJpZGVudDogc3RvcCB2b2ljZSBvbiBjaGFubmVsICVkLCAlcyA9IDB4JTA4eChhZGRyOiVYKVxuIiwKKwkJIGNoYW5uZWwsIGFkZHIgPT0gVDREX1NUT1BfQiA/ICJTVE9QX0IiIDogIlNUT1BfQSIsCisJCSByZWcsIGFkZHIpOworI2VuZGlmIC8qIERFQlVHICovCit9CisKK3N0YXRpYyB1MzIKK3RyaWRlbnRfZ2V0X2ludGVycnVwdF9tYXNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rID0gJmNhcmQtPmJhbmtzW2NoYW5uZWxdOworCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50OworCXJldHVybiBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOworfQorCitzdGF0aWMgaW50Cit0cmlkZW50X2NoZWNrX2NoYW5uZWxfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOworCXUzMiByZWcgPSB0cmlkZW50X2dldF9pbnRlcnJ1cHRfbWFzayhjYXJkLCBjaGFubmVsID4+IDUpOworCisjaWZkZWYgREVCVUcKKwlpZiAocmVnICYgbWFzaykKKwkJcHJfZGVidWcoInRyaWRlbnQ6IGNoYW5uZWwgJWQgaGFzIGludGVycnVwdCwgJXMgPSAweCUwOHhcbiIsCisJCQkgY2hhbm5lbCwgcmVnID09IFQ0RF9BSU5UX0IgPyAiQUlOVF9CIiA6ICJBSU5UX0EiLAorCQkJIHJlZyk7CisjZW5kaWYgLyogREVCVUcgKi8KKwlyZXR1cm4gKHJlZyAmIG1hc2spID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkCit0cmlkZW50X2Fja19jaGFubmVsX2ludGVycnVwdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOworCXUzMiByZWcsIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPmFpbnQ7CisKKwlyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOworCXJlZyAmPSBtYXNrOworCW91dGwocmVnLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CisKKyNpZmRlZiBERUJVRworCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfQUlOVF9CKSk7CisJcHJfZGVidWcoInRyaWRlbnQ6IEFjayBjaGFubmVsICVkIGludGVycnVwdCwgQUlOVF9CID0gMHglMDh4XG4iLAorCQkgY2hhbm5lbCwgcmVnKTsKKyNlbmRpZiAvKiBERUJVRyAqLworfQorCitzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqCit0cmlkZW50X2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CisJaW50IGlkeDsKKworCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19CXTsKKworCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgeworCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgeworCQkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOworCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OworCQkJY2hhbm5lbC0+bnVtID0gaWR4ICsgMzI7CisJCQlyZXR1cm4gY2hhbm5lbDsKKwkJfQorCX0KKworCS8qIG5vIG1vcmUgZnJlZSBjaGFubmVscyBhdmFpbGFibGUgKi8KKwlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IG5vIG1vcmUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQi5cbiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAordHJpZGVudF9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCWludCBiYW5rOworCXVuc2lnbmVkIGNoYXIgYjsKKworCWlmIChjaGFubmVsIDwgMzEgfHwgY2hhbm5lbCA+IDYzKQorCQlyZXR1cm47CisKKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFggfHwgCisJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSB7CisJCWIgPSBpbmIoVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOworCQlpZiAoKGIgJiB+MHg4MCkgPT0gY2hhbm5lbCkKKwkJCW91dGIoMHgwLCBUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7CisJfQorCisJYmFuayA9IGNoYW5uZWwgPj4gNTsKKwljaGFubmVsID0gY2hhbm5lbCAmIDB4MWY7CisKKwljYXJkLT5iYW5rc1tiYW5rXS5iaXRtYXAgJj0gfigxIDw8IChjaGFubmVsKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICoKK2N5YmVyX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CisJaW50IGlkeDsKKworCS8qIFRoZSBjeWJlcnBybyA1MDUwIGhhcyBvbmx5IDMyIHZvaWNlcyBhbmQgb25lIGJhbmsgKi8KKwkvKiAuLiBhdCBsZWFzdCB0aGV5IGFyZSBub3QgZG9jdW1lbnRlZCAoaWYgeW91IHdhbnQgdG8gY2FsbCB0aGF0IAorCSAqIGNyYXAgZG9jdW1lbnRhdGlvbiksIHBlcmhhcHMgYnJva2VuID8gKi8KKworCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKKworCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgeworCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgeworCQkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOworCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OworCQkJY2hhbm5lbC0+bnVtID0gaWR4OworCQkJcmV0dXJuIGNoYW5uZWw7CisJCX0KKwl9CisKKwkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhaWxhYmxlICovCisJcHJpbnRrKEtFUk5fRVJSICJjeWJlcnBybzUwNTA6IG5vIG1vcmUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQS5cbiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorY3liZXJfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA+IDMxKQorCQlyZXR1cm47CisJY2FyZC0+YmFua3NbQkFOS19BXS5iaXRtYXAgJj0gfigxIDw8IChjaGFubmVsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY3liZXJfb3V0aWR4KGludCBwb3J0LCBpbnQgaWR4LCBpbnQgZGF0YSkKK3sKKwlvdXRiKGlkeCwgcG9ydCk7CisJb3V0YihkYXRhLCBwb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjeWJlcl9pbmlkeChpbnQgcG9ydCwgaW50IGlkeCkKK3sKKwlvdXRiKGlkeCwgcG9ydCk7CisJcmV0dXJuIGluYihwb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbnQKK2N5YmVyX2luaXRfcml0dWFsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJLyogc29tZSBibGFjayBtYWdpYywgdGFrZW4gZnJvbSBTREsgc2FtcGxlcyAqLworCS8qIHJlbW92ZSB0aGlzIGFuZCBub3RoaW5nIHdpbGwgd29yayAqLworCWludCBwb3J0RGF0OworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqICAgICAgS2VlcCBpbnRlcnJ1cHRzIG9mZiBmb3IgdGhlIGNvbmZpZ3VyZSAtIHdlIGRvbid0IHdhbnQgdG8KKwkgKiAgICAgIGNsYXNoIHdpdGggYW5vdGhlciBjeWJlcnBybyBjb25maWcgZXZlbnQKKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJcG9ydERhdCA9IGN5YmVyX2luaWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUpOworCS8qIGVuYWJsZSwgaWYgaXQgd2FzIGRpc2FibGVkICovCisJaWYgKChwb3J0RGF0ICYgQ1lCRVJfQk1TS19BVUVOWikgIT0gQ1lCRVJfQk1TS19BVUVOWl9FTkFCTEUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY3liZXJwcm81MDUwOiBlbmFibGluZyBhdWRpbyBjb250cm9sbGVyXG4iKTsKKwkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUsIAorCQkJICAgICBwb3J0RGF0IHwgQ1lCRVJfQk1TS19BVUVOWl9FTkFCTEUpOworCQkvKiBjaGVjayBhZ2FpbiBpZiBoYXJkd2FyZSBpcyBlbmFibGVkIG5vdyAqLworCQlwb3J0RGF0ID0gY3liZXJfaW5pZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSk7CisJfQorCWlmICgocG9ydERhdCAmIENZQkVSX0JNU0tfQVVFTlopICE9IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3liZXJwcm81MDUwOiBpbml0QXVkaW9BY2Nlc3M6IG5vIHN1Y2Nlc3NcbiIpOworCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0lSUV9FTkFCTEUsIAorCQkJICAgICBDWUJFUl9CTVNLX0FVRElPX0lOVF9FTkFCTEUpOworCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMSk7CisJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJhLCAweDIwKTsKKwkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmIsIDB4MDgpOworCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMik7CisJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGIzLCAweDA2KTsKKwkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmYsIDB4MDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyogIGNhbGxlZCB3aXRoIHNwaW4gbG9jayBoZWxkICovCisKK3N0YXRpYyBpbnQKK3RyaWRlbnRfbG9hZF9jaGFubmVsX3JlZ2lzdGVycyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1MzIgKiBkYXRhLCAKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgaTsKKworCWlmIChjaGFubmVsID4gNjMpCisJCXJldHVybiAwOworCisJLyogc2VsZWN0IGhhcmR3YXJlIGNoYW5uZWwgdG8gd3JpdGUgKi8KKwlvdXRiKGNoYW5uZWwsIFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisKKwkvKiBPdXRwdXQgdGhlIGNoYW5uZWwgcmVnaXN0ZXJzLCBidXQgZG9uJ3Qgd3JpdGUgcmVnaXN0ZXIKKwkgICB0aHJlZSB0byBhbiBBTEkgY2hpcC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ0hBTk5FTF9SRUdTOyBpKyspIHsKKwkJaWYgKGkgPT0gMyAmJiBjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkKKwkJCWNvbnRpbnVlOworCQlvdXRsKGRhdGFbaV0sIFRSSURfUkVHKGNhcmQsIENIQU5ORUxfU1RBUlQgKyA0ICogaSkpOworCX0KKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgfHwgCisJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSB7CisJCW91dGwoQUxJX0VNT0RfU3RpbGwsIFRSSURfUkVHKGNhcmQsIEFMSV9FQlVGMSkpOworCQlvdXRsKEFMSV9FTU9EX1N0aWxsLCBUUklEX1JFRyhjYXJkLCBBTElfRUJVRjIpKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIGNhbGxlZCB3aXRoIHNwaW4gbG9jayBoZWxkICovCitzdGF0aWMgaW50Cit0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXVuc2lnbmVkIGludCBkYXRhW0NIQU5ORUxfUkVHUyArIDFdOworCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWw7CisKKwljaGFubmVsID0gc3RhdGUtPmRtYWJ1Zi5jaGFubmVsOworCisJZGF0YVsxXSA9IGNoYW5uZWwtPmxiYTsKKwlkYXRhWzRdID0gY2hhbm5lbC0+Y29udHJvbDsKKworCXN3aXRjaCAoc3RhdGUtPmNhcmQtPnBjaV9pZCkgeworCWNhc2UgUENJX0RFVklDRV9JRF9BTElfNTQ1MToKKwkJZGF0YVswXSA9IDA7CS8qIEN1cnJlbnQgU2FtcGxlIE9mZnNldCAqLworCQlkYXRhWzJdID0gKGNoYW5uZWwtPmVzbyA8PCAxNikgfCAoY2hhbm5lbC0+ZGVsdGEgJiAweGZmZmYpOworCQlkYXRhWzNdID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgorCQlkYXRhWzBdID0gMDsJLyogQ3VycmVudCBTYW1wbGUgT2Zmc2V0ICovCisJCWRhdGFbMl0gPSAoY2hhbm5lbC0+ZXNvIDw8IDE2KSB8IChjaGFubmVsLT5kZWx0YSAmIDB4ZmZmZik7CisJCWRhdGFbM10gPSAoY2hhbm5lbC0+YXR0cmlidXRlIDw8IDE2KSB8IChjaGFubmVsLT5mbV92b2wgJiAweGZmZmYpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CisJCWRhdGFbMF0gPSAwOwkvKiBDdXJyZW50IFNhbXBsZSBPZmZzZXQgKi8KKwkJZGF0YVsyXSA9IChjaGFubmVsLT5lc28gPDwgMTYpIHwgKGNoYW5uZWwtPmRlbHRhICYgMHhmZmZmKTsKKwkJZGF0YVszXSA9IGNoYW5uZWwtPmZtX3ZvbCAmIDB4ZmZmZjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgorCQlkYXRhWzBdID0gKGNoYW5uZWwtPmRlbHRhIDw8IDI0KTsKKwkJZGF0YVsyXSA9ICgoY2hhbm5lbC0+ZGVsdGEgPDwgMTYpICYgMHhmZjAwMDAwMCkgfCAKKwkJCShjaGFubmVsLT5lc28gJiAweDAwZmZmZmZmKTsKKwkJZGF0YVszXSA9IGNoYW5uZWwtPmZtX3ZvbCAmIDB4ZmZmZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHRyaWRlbnRfbG9hZF9jaGFubmVsX3JlZ2lzdGVycyhzdGF0ZS0+Y2FyZCwgZGF0YSwgY2hhbm5lbC0+bnVtKTsKK30KKworc3RhdGljIGludAorY29tcHV0ZV9yYXRlX3BsYXkodTMyIHJhdGUpCit7CisJaW50IGRlbHRhOworCS8qIFdlIHNwZWNpYWwgY2FzZSA0NDEwMCBhbmQgODAwMCBzaW5jZSByb3VuZGluZyB3aXRoIHRoZSBlcXVhdGlvbgorCSAgIGRvZXMgbm90IGdpdmUgdXMgYW4gYWNjdXJhdGUgZW5vdWdoIHZhbHVlLiBGb3IgMTEwMjUgYW5kIDIyMDUwCisJICAgdGhlIGVxdWF0aW9uIGdpdmVzIHVzIHRoZSBiZXN0IGFuc3dlci4gQWxsIG90aGVyIGZyZXF1ZW5jaWVzIHdpbGwKKwkgICBhbHNvIHVzZSB0aGUgZXF1YXRpb24uIEpEVyAqLworCWlmIChyYXRlID09IDQ0MTAwKQorCQlkZWx0YSA9IDB4ZWIzOworCWVsc2UgaWYgKHJhdGUgPT0gODAwMCkKKwkJZGVsdGEgPSAweDJhYjsKKwllbHNlIGlmIChyYXRlID09IDQ4MDAwKQorCQlkZWx0YSA9IDB4MTAwMDsKKwllbHNlCisJCWRlbHRhID0gKCgocmF0ZSA8PCAxMikgKyByYXRlKSAvIDQ4MDAwKSAmIDB4MDAwMGZmZmY7CisJcmV0dXJuIGRlbHRhOworfQorCitzdGF0aWMgaW50Citjb21wdXRlX3JhdGVfcmVjKHUzMiByYXRlKQoreworCWludCBkZWx0YTsKKworCWlmIChyYXRlID09IDQ0MTAwKQorCQlkZWx0YSA9IDB4MTE2YTsKKwllbHNlIGlmIChyYXRlID09IDgwMDApCisJCWRlbHRhID0gMHg2MDAwOworCWVsc2UgaWYgKHJhdGUgPT0gNDgwMDApCisJCWRlbHRhID0gMHgxMDAwOworCWVsc2UKKwkJZGVsdGEgPSAoKDQ4MDAwIDw8IDEyKSAvIHJhdGUpICYgMHgwMDAwZmZmZjsKKworCXJldHVybiBkZWx0YTsKK30KKworLyogc2V0IHBsYXliYWNrIHNhbXBsZSByYXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50Cit0cmlkZW50X3NldF9kYWNfcmF0ZShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgNDAwMCkKKwkJcmF0ZSA9IDQwMDA7CisKKwlkbWFidWYtPnJhdGUgPSByYXRlOworCWRtYWJ1Zi0+Y2hhbm5lbC0+ZGVsdGEgPSBjb21wdXRlX3JhdGVfcGxheShyYXRlKTsKKworCXRyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyhzdGF0ZSk7CisKKwlwcl9kZWJ1ZygidHJpZGVudDogY2FsbGVkIHRyaWRlbnRfc2V0X2RhY19yYXRlIDogcmF0ZSA9ICVkXG4iLCByYXRlKTsKKworCXJldHVybiByYXRlOworfQorCisvKiBzZXQgcmVjb3JkaW5nIHNhbXBsZSByYXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50Cit0cmlkZW50X3NldF9hZGNfcmF0ZShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgNDAwMCkKKwkJcmF0ZSA9IDQwMDA7CisKKwlkbWFidWYtPnJhdGUgPSByYXRlOworCWRtYWJ1Zi0+Y2hhbm5lbC0+ZGVsdGEgPSBjb21wdXRlX3JhdGVfcmVjKHJhdGUpOworCisJdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHN0YXRlKTsKKworCXByX2RlYnVnKCJ0cmlkZW50OiBjYWxsZWQgdHJpZGVudF9zZXRfYWRjX3JhdGUgOiByYXRlID0gJWRcbiIsIHJhdGUpOworCisJcmV0dXJuIHJhdGU7Cit9CisKKy8qIHByZXBhcmUgY2hhbm5lbCBhdHRyaWJ1dGVzIGZvciBwbGF5YmFjayAqLworc3RhdGljIHZvaWQKK3RyaWRlbnRfcGxheV9zZXR1cChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9IGRtYWJ1Zi0+Y2hhbm5lbDsKKworCWNoYW5uZWwtPmxiYSA9IGRtYWJ1Zi0+ZG1hX2hhbmRsZTsKKwljaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9wbGF5KGRtYWJ1Zi0+cmF0ZSk7CisKKwljaGFubmVsLT5lc28gPSBkbWFidWYtPmRtYXNpemUgPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKKwljaGFubmVsLT5lc28gLT0gMTsKKworCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkICE9IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgeworCQljaGFubmVsLT5hdHRyaWJ1dGUgPSAwOworCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCQlpZiAoKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkgfHwgCisJCQkgICAgKGNoYW5uZWwtPm51bSA9PSBBTElfUENNX0lOX0NIQU5ORUwpKQorCQkJCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChzdGF0ZS0+Y2FyZCwgY2hhbm5lbC0+bnVtKTsKKwkJCWVsc2UgaWYgKChpbmwoVFJJRF9SRUcoc3RhdGUtPmNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpIAorCQkJCSAgJiBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkKKwkJCQkgJiYgKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfT1VUX0NIQU5ORUwpKSB7CisJCQkJYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdGF0ZS0+Y2FyZCwgCisJCQkJCQkgICAgICAgc3RhdGUtPmRtYWJ1Zi5yYXRlKTsKKwkJCQlzdGF0ZS0+ZG1hYnVmLmNoYW5uZWwtPmRlbHRhID0gMHgxMDAwOworCQkJfQorCQl9CisJfQorCisJY2hhbm5lbC0+Zm1fdm9sID0gMHgwOworCisJY2hhbm5lbC0+Y29udHJvbCA9IENIQU5ORUxfTE9PUDsKKwlpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgeworCQkvKiAxNi1iaXRzICovCisJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF8xNkJJVFM7CisJCS8qIHNpZ25lZCAqLworCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfU0lHTkVEOworCX0KKwlpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pCisJCS8qIHN0ZXJlbyAqLworCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfU1RFUkVPOworCisJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfcGxheV9zZXR1cCwgTEJBID0gMHglMDh4LCBEZWx0YSA9IDB4JTA4eCwgIgorCQkgIkVTTyA9IDB4JTA4eCwgQ29udHJvbCA9IDB4JTA4eFxuIiwgY2hhbm5lbC0+bGJhLAorCQkgY2hhbm5lbC0+ZGVsdGEsIGNoYW5uZWwtPmVzbywgY2hhbm5lbC0+Y29udHJvbCk7CisKKwl0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RhdGUpOworfQorCisvKiBwcmVwYXJlIGNoYW5uZWwgYXR0cmlidXRlcyBmb3IgcmVjb3JkaW5nICovCitzdGF0aWMgdm9pZAordHJpZGVudF9yZWNfc2V0dXAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXUxNiB3OworCXU4IGJ2YWw7CisKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9IGRtYWJ1Zi0+Y2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgcmF0ZTsKKworCS8qIEVuYWJsZSBBQy05NyBBREMgKGNhcHR1cmUpICovCisJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CisJCWFsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKHN0YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CisJCS8qIGZvciA3MDE4LCB0aGUgYWM5NyBpcyBhbHdheXMgaW4gcGxheWJhY2svcmVjb3JkIChkdXBsZXgpIG1vZGUgKi8KKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgorCQl3ID0gaW5iKFRSSURfUkVHKGNhcmQsIERYX0FDUjJfQUM5N19DT01fU1RBVCkpOworCQlvdXRiKHcgfCAweDQ4LCBUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKKwkJLyogZW5hYmxlIGFuZCBzZXQgcmVjb3JkIGNoYW5uZWwgKi8KKwkJb3V0YigweDgwIHwgY2hhbm5lbC0+bnVtLCBUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKKwkJdyA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOworCQlvdXR3KHcgfCAweDEwMDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJCS8qIGVuYWJsZSBhbmQgc2V0IHJlY29yZCBjaGFubmVsICovCisJCW91dGIoMHg4MCB8IGNoYW5uZWwtPm51bSwgVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CisJCS8qIGRvbid0IGtub3cgeWV0LCB1c2luZyBzcGVjaWFsIGNoYW5uZWwgMjIgaW4gR0MxKDB4ZDQpPyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJY2hhbm5lbC0+bGJhID0gZG1hYnVmLT5kbWFfaGFuZGxlOworCWNoYW5uZWwtPmRlbHRhID0gY29tcHV0ZV9yYXRlX3JlYyhkbWFidWYtPnJhdGUpOworCWlmICgoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpICYmIAorCSAgICAoY2hhbm5lbC0+bnVtID09IEFMSV9TUERJRl9JTl9DSEFOTkVMKSkgeworCQlyYXRlID0gYWxpX2dldF9zcGRpZl9pbl9yYXRlKGNhcmQpOworCQlpZiAocmF0ZSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBBTGkgNTQ1MSAiCisJCQkgICAgICAgIlMvUERJRiBpbnB1dCBzZXR1cCBlcnJvciFcbiIpOworCQkJcmF0ZSA9IDQ4MDAwOworCQl9CisJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKwkJaWYgKGJ2YWwgJiAweDEwKSB7CisJCQlvdXRiKGJ2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBjbGVhcmVkIEFMaSAiCisJCQkgICAgICAgIjU0NTEgUy9QRElGIHBhcml0eSBlcnJvciBmbGFnLlxuIik7CisJCX0KKworCQlpZiAocmF0ZSAhPSA0ODAwMCkKKwkJCWNoYW5uZWwtPmRlbHRhID0gKChyYXRlIDw8IDEyKSAvIGRtYWJ1Zi0+cmF0ZSkgJiAweDAwMDBmZmZmOworCX0KKworCWNoYW5uZWwtPmVzbyA9IGRtYWJ1Zi0+ZG1hc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOworCWNoYW5uZWwtPmVzbyAtPSAxOworCisJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgIT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CisJCWNoYW5uZWwtPmF0dHJpYnV0ZSA9IDA7CisJfQorCisJY2hhbm5lbC0+Zm1fdm9sID0gMHgwOworCisJY2hhbm5lbC0+Y29udHJvbCA9IENIQU5ORUxfTE9PUDsKKwlpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgeworCQkvKiAxNi1iaXRzICovCisJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF8xNkJJVFM7CisJCS8qIHNpZ25lZCAqLworCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfU0lHTkVEOworCX0KKwlpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pCisJCS8qIHN0ZXJlbyAqLworCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfU1RFUkVPOworCisJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfcmVjX3NldHVwLCBMQkEgPSAweCUwOHgsIERlbGF0ID0gMHglMDh4LCAiCisJCSAiRVNPID0gMHglMDh4LCBDb250cm9sID0gMHglMDh4XG4iLCBjaGFubmVsLT5sYmEsCisJCSBjaGFubmVsLT5kZWx0YSwgY2hhbm5lbC0+ZXNvLCBjaGFubmVsLT5jb250cm9sKTsKKworCXRyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyhzdGF0ZSk7Cit9CisKKy8qIGdldCBjdXJyZW50IHBsYXliYWNrL3JlY29yZGluZyBkbWEgYnVmZmVyIHBvaW50ZXIgKGJ5dGUgb2Zmc2V0IGZyb20gTEJBKSwKKyAgIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkCit0cmlkZW50X2dldF9kbWFfYWRkcihzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdTMyIGNzbzsKKworCWlmICghZG1hYnVmLT5lbmFibGUpCisJCXJldHVybiAwOworCisJb3V0YihkbWFidWYtPmNoYW5uZWwtPm51bSwgVFJJRF9SRUcoc3RhdGUtPmNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisKKwlzd2l0Y2ggKHN0YXRlLT5jYXJkLT5wY2lfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKKwkJLyogMTYgYml0cyBFU08sIENTTyBmb3IgNzAxOCBhbmQgRFggKi8KKwkJY3NvID0gaW53KFRSSURfUkVHKHN0YXRlLT5jYXJkLCBDSF9EWF9DU09fQUxQSEFfRk1TICsgMikpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CisJCS8qIDI0IGJpdHMgRVNPLCBDU08gZm9yIE5YICovCisJCWNzbyA9IGlubChUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgQ0hfTlhfREVMVEFfQ1NPKSkgJiAweDAwZmZmZmZmOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9nZXRfZG1hX2FkZHI6IGNoaXAgcmVwb3J0ZWQgY2hhbm5lbDogJWQsICIKKwkJICJjc28gPSAweCUwNHhcbiIsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtLCBjc28pOworCisJLyogRVNPIGFuZCBDU08gYXJlIGluIHVuaXRzIG9mIFNhbXBsZXMsIGNvbnZlcnQgdG8gYnl0ZSBvZmZzZXQgKi8KKwljc28gPDw9IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CisKKwlyZXR1cm4gKGNzbyAlIGRtYWJ1Zi0+ZG1hc2l6ZSk7Cit9CisKKy8qIFN0b3AgcmVjb3JkaW5nIChsb2NrIGhlbGQpICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fc3RvcF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGludCBjaGFuX251bSA9IGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtOworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKworCWRtYWJ1Zi0+ZW5hYmxlICY9IH5BRENfUlVOTklORzsKKwl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbl9udW0pOworCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOworfQorCitzdGF0aWMgdm9pZAorc3RvcF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlfX3N0b3BfYWRjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitzdGFydF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGludCBjaGFuX251bSA9IGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtOworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoKGRtYWJ1Zi0+bWFwcGVkIHx8IAorCSAgICAgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSkgJiYgCisJICAgIGRtYWJ1Zi0+cmVhZHkpIHsKKwkJZG1hYnVmLT5lbmFibGUgfD0gQURDX1JVTk5JTkc7CisJCXRyaWRlbnRfZW5hYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFuX251bSk7CisJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgY2hhbl9udW0pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIHN0b3AgcGxheWJhY2sgKGxvY2sgaGVsZCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19zdG9wX2RhYyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgaW50IGNoYW5fbnVtID0gZG1hYnVmLT5jaGFubmVsLT5udW07CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCisJZG1hYnVmLT5lbmFibGUgJj0gfkRBQ19SVU5OSU5HOworCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFuX251bSk7CisJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgeworCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+CisJCQkJICAgZG1hYnVmLmNoYW5uZWwtPm51bSk7CisJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT4KKwkJCQkgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKKwkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPgorCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+CisJCQkJICAgZG1hYnVmLmNoYW5uZWwtPm51bSk7CisJfQorCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOworfQorCitzdGF0aWMgdm9pZAorc3RvcF9kYWMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlfX3N0b3BfZGFjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitzdGFydF9kYWMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGludCBjaGFuX251bSA9IGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtOworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoKGRtYWJ1Zi0+bWFwcGVkIHx8IGRtYWJ1Zi0+Y291bnQgPiAwKSAmJiBkbWFidWYtPnJlYWR5KSB7CisJCWRtYWJ1Zi0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOworCQl0cmlkZW50X2VuYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOworCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIGNoYW5fbnVtKTsKKwkJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgeworCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT4KKwkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT4KKwkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT4KKwkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT4KKwkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNS1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCisvKiBhbGxvYyBhIERNQSBidWZmZXIgb2Ygd2l0aCBhIGJ1ZmZlciBvZiB0aGlzIG9yZGVyICovCitzdGF0aWMgaW50CithbGxvY19kbWFidWYoc3RydWN0IGRtYWJ1ZiAqZG1hYnVmLCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgaW50IG9yZGVyKQoreworCXZvaWQgKnJhd2J1ZiA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJaWYgKCEocmF3YnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAKKwkJCQkJICAgICZkbWFidWYtPmRtYV9oYW5kbGUpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcl9kZWJ1ZygidHJpZGVudDogYWxsb2NhdGVkICVsZCAob3JkZXIgPSAlZCkgYnl0ZXMgYXQgJXBcbiIsCisJCSBQQUdFX1NJWkUgPDwgb3JkZXIsIG9yZGVyLCByYXdidWYpOworCisJZG1hYnVmLT5yZWFkeSA9IGRtYWJ1Zi0+bWFwcGVkID0gMDsKKwlkbWFidWYtPnJhd2J1ZiA9IHJhd2J1ZjsKKwlkbWFidWYtPmJ1Zm9yZGVyID0gb3JkZXI7CisKKwkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSAqLyAKKwkvKiByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KKwlwZW5kID0gdmlydF90b19wYWdlKHJhd2J1ZiArIChQQUdFX1NJWkUgPDwgb3JkZXIpIC0gMSk7CisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb2NhdGUgdGhlIG1haW4gRE1BIGJ1ZmZlciwgcGxheWJhY2sgYW5kIHJlY29yZGluZyBidWZmZXIgc2hvdWxkIGJlICovCisvKiBhbGxvY2F0ZWQgc2VwYXJhdGVseSAqLworc3RhdGljIGludAorYWxsb2NfbWFpbl9kbWFidWYoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCBvcmRlcjsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCS8qIGFsbG9jIGFzIGJpZyBhIGNodW5rIGFzIHdlIGNhbiwgRklYTUU6IGlzIHRoaXMgbmVjZXNzYXJ5ID8/ICovCisJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkgeworCQlpZiAoIShyZXQgPSBhbGxvY19kbWFidWYoZG1hYnVmLCBzdGF0ZS0+Y2FyZC0+cGNpX2Rldiwgb3JkZXIpKSkKKwkJCXJldHVybiAwOworCQkvKiBlbHNlIHRyeSBhZ2FpbiAqLworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBkZWFsbG9jYXRlIGEgRE1BIGJ1ZmZlciAqLworc3RhdGljIHZvaWQKK2RlYWxsb2NfZG1hYnVmKHN0cnVjdCBkbWFidWYgKmRtYWJ1Ziwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJaWYgKGRtYWJ1Zi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlciwgCisJCQkJICAgIGRtYWJ1Zi0+cmF3YnVmLCBkbWFidWYtPmRtYV9oYW5kbGUpOworCQlkbWFidWYtPnJhd2J1ZiA9IE5VTEw7CisJfQorCWRtYWJ1Zi0+bWFwcGVkID0gZG1hYnVmLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2dfZG1hYnVmKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgZW51bSBkbWFidWZfbW9kZSByZWMpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgYnl0ZXBlcnNlYzsKKwlzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqcyA9IHN0YXRlOworCXVuc2lnbmVkIGJ1ZnNpemUsIGRtYV9udW1zOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCwgaSwgb3JkZXI7CisKKwlpZiAoKHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpCisJCWRtYV9udW1zID0gNTsKKwllbHNlCisJCWRtYV9udW1zID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBkbWFfbnVtczsgaSsrKSB7CisJCWlmIChpID4gMCkgeworCQkJcyA9IHN0YXRlLT5vdGhlcl9zdGF0ZXNbaSAtIDFdOworCQkJZG1hYnVmID0gJnMtPmRtYWJ1ZjsKKwkJCWRtYWJ1Zi0+Zm10ID0gc3RhdGUtPmRtYWJ1Zi5mbXQ7CisJCQlkbWFidWYtPnJhdGUgPSBzdGF0ZS0+ZG1hYnVmLnJhdGU7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlkbWFidWYtPmh3cHRyID0gZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5lcnJvciA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIGlmIG5vdCBhbGxvY2F0ZWQgeWV0ICovCisJCWlmICghZG1hYnVmLT5yYXdidWYpIHsKKwkJCWlmIChpID09IDApIHsKKwkJCQlpZiAoKHJldCA9IGFsbG9jX21haW5fZG1hYnVmKHN0YXRlKSkpIHsKKwkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOworCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlvcmRlciA9IHN0YXRlLT5kbWFidWYuYnVmb3JkZXIgLSAxOworCQkJCWlmIChvcmRlciA+PSBETUFCVUZfTUlOT1JERVIpIHsKKwkJCQkJcmV0ID0gYWxsb2NfZG1hYnVmKGRtYWJ1ZiwKKwkJCQkJCQkgICBzdGF0ZS0+Y2FyZC0+cGNpX2RldiwKKwkJCQkJCQkgICBvcmRlcik7CisJCQkJfQorCQkJCWlmIChyZXQpIHsKKwkJCQkJLyogcmVsZWFzZSB0aGUgbWFpbiBETUEgYnVmZmVyICovCisJCQkJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+ZG1hYnVmLCBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CisJCQkJCS8qIHJlbGVhc2UgdGhlIGF1eGlsaWFyeSBETUEgYnVmZmVycyAqLworCQkJCQlmb3IgKGkgLT0gMjsgaSA+PSAwOyBpLS0pCisJCQkJCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmLCAKKwkJCQkJCQkgICAgICAgc3RhdGUtPmNhcmQtPnBjaV9kZXYpOworCQkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIEZJWE1FOiBmaWd1cmUgb3V0IGFsbCB0aGlzIE9TUyBmcmFnbWVudCBzdHVmZiAqLworCQlieXRlcGVyc2VjID0gZG1hYnVmLT5yYXRlIDw8IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CisJCWJ1ZnNpemUgPSBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcjsKKwkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0KSB7CisJCQlpZiAoKDEwMDAgPDwgZG1hYnVmLT5vc3NmcmFnc2hpZnQpIDwgYnl0ZXBlcnNlYykKKwkJCQlkbWFidWYtPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjIC8gMTAwMCk7CisJCQllbHNlCisJCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSBkbWFidWYtPm9zc2ZyYWdzaGlmdDsKKwkJfSBlbHNlIHsKKwkJCS8qIGxldHMgaGFuZCBvdXQgcmVhc29uYWJsZSBiaWcgYXNzIGJ1ZmZlcnMgYnkgZGVmYXVsdCAqLworCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSAoZG1hYnVmLT5idWZvcmRlciArIFBBR0VfU0hJRlQgLSAyKTsKKwkJfQorCQlkbWFidWYtPm51bWZyYWcgPSBidWZzaXplID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQl3aGlsZSAoZG1hYnVmLT5udW1mcmFnIDwgNCAmJiBkbWFidWYtPmZyYWdzaGlmdCA+IDMpIHsKKwkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0LS07CisJCQlkbWFidWYtPm51bWZyYWcgPSBidWZzaXplID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQl9CisJCWRtYWJ1Zi0+ZnJhZ3NpemUgPSAxIDw8IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQlpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA+PSA0ICYmIGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPCBkbWFidWYtPm51bWZyYWcpCisJCQlkbWFidWYtPm51bWZyYWcgPSBkbWFidWYtPm9zc21heGZyYWdzOworCQlkbWFidWYtPmZyYWdzYW1wbGVzID0gZG1hYnVmLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOworCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcgPDwgZG1hYnVmLT5mcmFnc2hpZnQ7CisKKwkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgCisJCSAgICAgICBkbWFidWYtPmRtYXNpemUpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWlmIChyZWMgPT0gRE1fUkVDT1JEKQorCQkJdHJpZGVudF9yZWNfc2V0dXAocyk7CisJCWVsc2UgLyogRE1fUExBWUJBQ0sgKi8KKwkJCXRyaWRlbnRfcGxheV9zZXR1cChzKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJLyogc2V0IHRoZSByZWFkeSBmbGFnIGZvciB0aGUgZG1hIGJ1ZmZlciAqLworCQlkbWFidWYtPnJlYWR5ID0gMTsKKworCQlwcl9kZWJ1ZygidHJpZGVudDogcHJvZ19kbWFidWYoJWQpLCBzYW1wbGUgcmF0ZSA9ICVkLCAiCisJCQkgImZvcm1hdCA9ICVkLCBudW1mcmFnID0gJWQsIGZyYWdzaXplID0gJWQgIgorCQkJICJkbWFzaXplID0gJWRcbiIsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtLAorCQkJIGRtYWJ1Zi0+cmF0ZSwgZG1hYnVmLT5mbXQsIGRtYWJ1Zi0+bnVtZnJhZywKKwkJCSBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmRtYXNpemUpOworCX0KKwl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfcmVjb3JkKHN0cnVjdCB0cmlkZW50X3N0YXRlKiBzdGF0ZSkKK3sKKwlyZXR1cm4gcHJvZ19kbWFidWYoc3RhdGUsIERNX1JFQ09SRCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0cnVjdCB0cmlkZW50X3N0YXRlKiBzdGF0ZSkKK3sKKwlyZXR1cm4gcHJvZ19kbWFidWYoc3RhdGUsIERNX1BMQVlCQUNLKTsKK30KKworLyogd2UgYXJlIGRvaW5nIHF1YW50dW0gbWVjaGFuaWNzIGhlcmUsIHRoZSBidWZmZXIgY2FuIG9ubHkgYmUgZW1wdHksIGhhbGYgb3IgZnVsbCBmaWxsZWQgaS5lLgorICAgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18ICAgb3IgICB8eHh4eHh4eHh4eHh4fC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHh4eHh4eHh4fAorICAgYnV0IHdlIGFsbW9zdCBhbHdheXMgZ2V0IHRoaXMKKyAgIHx4eHh4eHgtLS0tLS18LS0tLS0tLS0tLS0tfCAgIG9yICAgfHh4eHh4eHh4eHh4eHx4eHh4eC0tLS0tLS18CisgICBzbyB3ZSBoYXZlIHRvIGNsZWFyIHRoZSB0YWlsIHNwYWNlIHRvICJzaWxlbmNlIgorICAgfHh4eHh4eDAwMDAwMHwtLS0tLS0tLS0tLS18ICAgb3IgICB8eHh4eHh4eHh4eHh4fHh4eHh4eDAwMDAwMHwKKyovCitzdGF0aWMgdm9pZAordHJpZGVudF9jbGVhcl90YWlsKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBzd3B0cjsKKwl1bnNpZ25lZCBjaGFyIHNpbGVuY2UgPSAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyAwIDogMHg4MDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChzd3B0ciA9PSAwIHx8IHN3cHRyID09IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIgfHwgCisJICAgIHN3cHRyID09IGRtYWJ1Zi0+ZG1hc2l6ZSkKKwkJcmV0dXJuOworCisJaWYgKHN3cHRyIDwgZG1hYnVmLT5kbWFzaXplIC8gMikKKwkJbGVuID0gZG1hYnVmLT5kbWFzaXplIC8gMiAtIHN3cHRyOworCWVsc2UKKwkJbGVuID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisKKwltZW1zZXQoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgc2lsZW5jZSwgbGVuKTsKKwlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCAhPSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlkbWFidWYtPnN3cHRyICs9IGxlbjsKKwkJZG1hYnVmLT5jb3VudCArPSBsZW47CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJfQorCisJLyogcmVzdGFydCB0aGUgZG1hIG1hY2hpbmUgaW4gY2FzZSBpdCBpcyBoYWx0ZWQgKi8KKwlzdGFydF9kYWMoc3RhdGUpOworfQorCitzdGF0aWMgaW50CitkcmFpbl9kYWMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgbm9uYmxvY2spCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHRtbzsKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgbG9uZyBkaWZmID0gMDsKKworCWlmIChkbWFidWYtPm1hcHBlZCB8fCAhZG1hYnVmLT5yZWFkeSkKKwkJcmV0dXJuIDA7CisKKwlhZGRfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CisJZm9yICg7OykgeworCQkvKiBJdCBzZWVtcyB0aGF0IHdlIGhhdmUgdG8gc2V0IHRoZSBjdXJyZW50IHN0YXRlIHRvIFRBU0tfSU5URVJSVVBUSUJMRQorCQkgICBldmVyeSB0aW1lIHRvIG1ha2UgdGhlIHByb2Nlc3MgcmVhbGx5IGdvIHRvIHNsZWVwICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCisJCWlmIChub25ibG9jaykgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBpcyBsZWZ0IGluIHRoZSBidWZmZXIsIHdlIGhhdmUgdG8gd2FpdCB1bnRpbAorCQkgICBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KKwkJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSB8fCAKKwkJICAgIHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkgeworCQkJZGlmZiA9IGRtYWJ1Zi0+c3dwdHIgLSB0cmlkZW50X2dldF9kbWFfYWRkcihzdGF0ZSkgKyBkbWFidWYtPmRtYXNpemU7CisJCQlkaWZmID0gZGlmZiAlIChkbWFidWYtPmRtYXNpemUpOworCQkJdG1vID0gKGRpZmYgKiBIWikgLyBkbWFidWYtPnJhdGU7CisJCX0gZWxzZSB7CisJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gZG1hYnVmLT5yYXRlOworCQl9CisJCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKKwkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IHRtbyA6IDEpICYmIHRtbykgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHVwZGF0ZSBidWZmZXIgbWFuYW5nZW1lbnQgcG9pbnRlcnMsIGVzcGVjaWFsbHksICovIAorLyogZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLworc3RhdGljIHZvaWQKK3RyaWRlbnRfdXBkYXRlX3B0cihzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgaHdwdHIsIHN3cHRyOworCWludCBjbGVhcl9jbnQgPSAwOworCWludCBkaWZmOworCXVuc2lnbmVkIGNoYXIgc2lsZW5jZTsKKwl1bnNpZ25lZCBoYWxmX2RtYXNpemU7CisKKwkvKiB1cGRhdGUgaGFyZHdhcmUgcG9pbnRlciAqLworCWh3cHRyID0gdHJpZGVudF9nZXRfZG1hX2FkZHIoc3RhdGUpOworCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwlkbWFidWYtPmh3cHRyID0gaHdwdHI7CisJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBkaWZmOworCisJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgQURDICovCisJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CisJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9IGVsc2UgeworCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOworCisJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgCisJCQkgICAgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgKi8gCisJCQkJLyogd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlciBpdCBoZXJlLCBqdXN0ICovIAorCQkJCS8qIHN0b3AgdGhlIG1hY2hpbmUgYW5kIGxldCB0aGUgcHJvY2VzcyAqLyAKKwkJCQkvKiBmb3JjZSBod3B0ciBhbmQgc3dwdHIgdG8gc3luYyAqLworCQkJCV9fc3RvcF9hZGMoc3RhdGUpOworCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKKwkJCX0KKwkJCWlmIChkbWFidWYtPmNvdW50IDwgKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplIC8gMikKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9CisJfQorCisJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgREFDICovCisJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IERBQ19SVU5OSU5HKSB7CisJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOworCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9IGVsc2UgeworCQkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCisJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgCisJCQkgICAgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlcgorCQkJCSAgIGl0IGhlcmUsIGp1c3Qgc3RvcCB0aGUgbWFjaGluZSBhbmQgbGV0IHRoZSBwcm9jZXNzIGZvcmNlIGh3cHRyCisJCQkJICAgYW5kIHN3cHRyIHRvIHN5bmMgKi8KKwkJCQlfX3N0b3BfZGFjKHN0YXRlKTsKKwkJCQlkbWFidWYtPmVycm9yKys7CisJCQl9IGVsc2UgaWYgKCFkbWFidWYtPmVuZGNsZWFyZWQpIHsKKwkJCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisJCQkJc2lsZW5jZSA9IChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUID8gMCA6IDB4ODApOworCQkJCWlmIChkbWFidWYtPnVwZGF0ZV9mbGFnICYgQUxJX0FERFJFU1NfSU5UX1VQREFURSkgeworCQkJCQkvKiBXZSBtdXN0IGNsZWFyIGVuZCBkYXRhIG9mIDEvMiBkbWFidWYgaWYgbmVlZGVkLgorCQkJCQkgICBBY2NvcmRpbmcgdG8gMS8yIGFsZ29yaXRobSBvZiBBZGRyZXNzIEVuZ2luZSBJbnRlcnJ1cHQsCisJCQkJCSAgIGNoZWNrIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkYXRhIG9mIGhhbGYgZG1hc2l6ZS4gKi8KKwkJCQkJaGFsZl9kbWFzaXplID0gZG1hYnVmLT5kbWFzaXplIC8gMjsKKwkJCQkJaWYgKChkaWZmID0gaHdwdHIgLSBoYWxmX2RtYXNpemUpIDwgMCkKKwkJCQkJCWRpZmYgPSBod3B0cjsKKwkJCQkJaWYgKChkbWFidWYtPmNvdW50ICsgZGlmZikgPCBoYWxmX2RtYXNpemUpIHsKKwkJCQkJCS8vdGhlcmUgaXMgaW52YWxpZCBkYXRhIGluIHRoZSBlbmQgb2YgaGFsZiBidWZmZXIKKwkJCQkJCWlmICgoY2xlYXJfY250ID0gaGFsZl9kbWFzaXplIC0gc3dwdHIpIDwgMCkKKwkJCQkJCQljbGVhcl9jbnQgKz0gaGFsZl9kbWFzaXplOworCQkJCQkJLy9jbGVhciB0aGUgaW52YWxpZCBkYXRhCisJCQkJCQltZW1zZXQoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgc2lsZW5jZSwgY2xlYXJfY250KTsKKwkJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKKwkJCQkJCQljbGVhcl9jbnQgPSBjbGVhcl9jbnQgLyAyOworCQkJCQkJCXN3cHRyID0gc3dwdHIgLyAyOworCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOworCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOworCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOworCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOworCQkJCQkJfQorCQkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoZG1hYnVmLT5jb3VudCA8IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpIHsKKwkJCQkJY2xlYXJfY250ID0gZG1hYnVmLT5mcmFnc2l6ZTsKKwkJCQkJaWYgKChzd3B0ciArIGNsZWFyX2NudCkgPiBkbWFidWYtPmRtYXNpemUpCisJCQkJCQljbGVhcl9jbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKKwkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIHNpbGVuY2UsIGNsZWFyX2NudCk7CisJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKKwkJCQkJCWNsZWFyX2NudCA9IGNsZWFyX2NudCAvIDI7CisJCQkJCQlzd3B0ciA9IHN3cHRyIC8gMjsKKwkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CisJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOworCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKKwkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CisJCQkJCX0KKwkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMTsKKwkJCQl9CisJCQl9CisJCQkvKiB0cmlkZW50X3VwZGF0ZV9wdHIgaXMgY2FsbGVkIGJ5IGludGVycnVwdCBoYW5kbGVyIG9yIGJ5IHByb2Nlc3MgdmlhCisJCQkgICBpb2N0bC9wb2xsLCB3ZSBvbmx5IHdha2UgdXAgdGhlIHdhaXRpbmcgcHJvY2VzcyB3aGVuIHdlIGhhdmUgbW9yZQorCQkJICAgdGhhbiAxLzIgYnVmZmVyIGZyZWUgKGFsd2F5cyB0cnVlIGZvciBpbnRlcnJ1cHQgaGFuZGxlcikgKi8KKwkJCWlmIChkbWFidWYtPmNvdW50IDwgKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplIC8gMikKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9CisJfQorCWRtYWJ1Zi0+dXBkYXRlX2ZsYWcgJj0gfkFMSV9BRERSRVNTX0lOVF9VUERBVEU7Cit9CisKK3N0YXRpYyB2b2lkCit0cmlkZW50X2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJaW50IGk7CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlOworCXVuc2lnbmVkIGludCBjaGFubmVsOworCisJLyogVXBkYXRlIHRoZSBwb2ludGVycyBmb3IgYWxsIGNoYW5uZWxzIHdlIGFyZSBydW5uaW5nLiAqLworCS8qIEZJWE1FOiBzaG91bGQgcmVhZCBpbnRlcnJ1cHQgc3RhdHVzIG9ubHkgb25jZSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9IV19DSDsgaSsrKSB7CisJCWNoYW5uZWwgPSA2MyAtIGk7CisJCWlmICh0cmlkZW50X2NoZWNrX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQsIGNoYW5uZWwpKSB7CisJCQl0cmlkZW50X2Fja19jaGFubmVsX2ludGVycnVwdChjYXJkLCBjaGFubmVsKTsKKwkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKKwkJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBzcHVyaW91cyBjaGFubmVsICIgCisJCQkJICAgICAgICJpcnEgJWQuXG4iLCBjaGFubmVsKTsKKwkJCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbm5lbCk7CisJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFubmVsKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2FsaV9od3ZvbF9jb250cm9sKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBvcHQpCit7CisJdTE2IGR3VGVtcCwgdm9sdW1lWzJdLCBtdXRlLCBkaWZmLCAqcFZvbFsyXTsKKworCWR3VGVtcCA9IGFsaV9hYzk3X3JlYWQoY2FyZC0+YWM5N19jb2RlY1swXSwgMHgwMik7CisJbXV0ZSA9IGR3VGVtcCAmIDB4ODAwMDsKKwl2b2x1bWVbMF0gPSBkd1RlbXAgJiAweDAwMWY7CisJdm9sdW1lWzFdID0gKGR3VGVtcCAmIDB4MWYwMCkgPj4gODsKKwlpZiAodm9sdW1lWzBdIDwgdm9sdW1lWzFdKSB7CisJCXBWb2xbMF0gPSAmdm9sdW1lWzBdOworCQlwVm9sWzFdID0gJnZvbHVtZVsxXTsKKwl9IGVsc2UgeworCQlwVm9sWzFdID0gJnZvbHVtZVswXTsKKwkJcFZvbFswXSA9ICZ2b2x1bWVbMV07CisJfQorCWRpZmYgPSAqKHBWb2xbMV0pIC0gKihwVm9sWzBdKTsKKworCWlmIChvcHQgPT0gMSkgewkJLy8gTVVURQorCQlkd1RlbXAgXj0gMHg4MDAwOworCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAKKwkJCSAgICAgICAweDAyLCBkd1RlbXApOworCX0gZWxzZSBpZiAob3B0ID09IDIpIHsJLy8gRG93bgorCQlpZiAobXV0ZSkKKwkJCXJldHVybjsKKwkJaWYgKCoocFZvbFsxXSkgPCAweDAwMWYpIHsKKwkJCSgqcFZvbFsxXSkrKzsKKwkJCSoocFZvbFswXSkgPSAqKHBWb2xbMV0pIC0gZGlmZjsKKwkJfQorCQlkd1RlbXAgJj0gMHhlMGUwOworCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOworCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCBkd1RlbXApOworCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8IAorCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKKwl9IGVsc2UgaWYgKG9wdCA9PSA0KSB7CS8vIFVwCisJCWlmIChtdXRlKQorCQkJcmV0dXJuOworCQlpZiAoKihwVm9sWzBdKSA+IDApIHsKKwkJCSgqcFZvbFswXSktLTsKKwkJCSoocFZvbFsxXSkgPSAqKHBWb2xbMF0pICsgZGlmZjsKKwkJfQorCQlkd1RlbXAgJj0gMHhlMGUwOworCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOworCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCBkd1RlbXApOworCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8IAorCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKKwl9IGVsc2UgeworCQkvKiBOb3RoaW5nIG5lZWRzIGRvaW5nICovCisJfQorfQorCisvKgorICoJUmUtZW5hYmxlIHJlcG9ydGluZyBvZiB2b2wgY2hhbmdlIGFmdGVyIDAuMSBzZWNvbmRzCisgKi8KKworc3RhdGljIHZvaWQKK2FsaV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgcHRyKQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKSBwdHI7CisJdTE2IHRlbXAgPSAwOworCisJLyogRW5hYmxlIEdQSU8gSVJRIChNSVNDSU5UIGJpdCAxOGgpICovCisJdGVtcCA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCArIDIpKTsKKwl0ZW1wIHw9IDB4MDAwNDsKKwlvdXR3KHRlbXAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOworfQorCisvKgorICoJU2V0IHVwIHRoZSB0aW1lciB0byBjbGVhciB0aGUgdm9sIGNoYW5nZSBub3RpZmljYXRpb24KKyAqLworCitzdGF0aWMgdm9pZAorYWxpX3NldF90aW1lcihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCS8qIEFkZCBUaW1lciBSb3V0aW5lIHRvIEVuYWJsZSBHUElPIElSUSAqLworCWRlbF90aW1lcigmY2FyZC0+dGltZXIpOwkvKiBOZXZlciBxdWV1ZSB0d2ljZSAqLworCWNhcmQtPnRpbWVyLmZ1bmN0aW9uID0gYWxpX3RpbWVvdXQ7CisJY2FyZC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYXJkOworCWNhcmQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKKwlhZGRfdGltZXIoJmNhcmQtPnRpbWVyKTsKK30KKworLyoKKyAqCVByb2Nlc3MgYSBHUElPIGV2ZW50CisgKi8KKworc3RhdGljIHZvaWQKK2FsaV9xdWV1ZV90YXNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBvcHQpCit7CisJdTE2IHRlbXA7CisKKwkvKiBEaXNhYmxlIEdQSU8gSVJRIChNSVNDSU5UIGJpdCAxOGgpICovCisJdGVtcCA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCArIDIpKTsKKwl0ZW1wICY9ICh1MTYpICh+MHgwMDA0KTsKKwlvdXR3KHRlbXAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOworCisJLyogQWRqdXN0IHRoZSB2b2x1bWUgKi8KKwlhbGlfaHd2b2xfY29udHJvbChjYXJkLCBvcHQpOworCisJLyogU2V0IHRoZSB0aW1lciBmb3IgMS8xMHRoIHNlYyAqLworCWFsaV9zZXRfdGltZXIoY2FyZCk7Cit9CisKK3N0YXRpYyB2b2lkCitjeWJlcl9hZGRyZXNzX2ludGVycnVwdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCWludCBpLCBpcnFfc3RhdHVzOworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKworCS8qIFVwZGF0ZSB0aGUgcG9pbnRlcnMgZm9yIGFsbCBjaGFubmVscyB3ZSBhcmUgcnVubmluZy4gKi8KKwkvKiBGSVhFRDogcmVhZCBpbnRlcnJ1cHQgc3RhdHVzIG9ubHkgb25jZSAqLworCWlycV9zdGF0dXMgPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX0FJTlRfQSkpOworCisJcHJfZGVidWcoImN5YmVyX2FkZHJlc3NfaW50ZXJydXB0OiBpcnFfc3RhdHVzIDB4JVhcbiIsIGlycV9zdGF0dXMpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJY2hhbm5lbCA9IDMxIC0gaTsKKwkJaWYgKGlycV9zdGF0dXMgJiAoMSA8PCBjaGFubmVsKSkgeworCQkJLyogY2xlYXIgYml0IGJ5IHdyaXRpbmcgYSAxLCB6ZXJvZXMgYXJlIGlnbm9yZWQgKi8KKwkJCW91dGwoKDEgPDwgY2hhbm5lbCksIFRSSURfUkVHKGNhcmQsIFQ0RF9BSU5UX0EpKTsKKworCQkJcHJfZGVidWcoImN5YmVyX2ludGVycnVwdDogY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisKKwkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKKwkJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeWJlcjUwNTA6IHNwdXJpb3VzICIgCisJCQkJICAgICAgICJjaGFubmVsIGlycSAlZC5cbiIsIGNoYW5uZWwpOworCQkJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFubmVsKTsKKwkJCQl0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5uZWwpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK3RyaWRlbnRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIGRldl9pZDsKKwl1MzIgZXZlbnQ7CisJdTMyIGdwaW87CisKKwlzcGluX2xvY2soJmNhcmQtPmxvY2spOworCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisKKwlwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9pbnRlcnJ1cHQgY2FsbGVkLCBNSVNDSU5UID0gMHglMDh4XG4iLAorCQkgZXZlbnQpOworCisJaWYgKGV2ZW50ICYgQUREUkVTU19JUlEpIHsKKwkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQoY2FyZCk7CisJfQorCisJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCS8qIEdQSU8gSVJRIChIL1cgVm9sdW1lIENvbnRyb2wpICovCisJCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJCWlmIChldmVudCAmICgxIDw8IDI1KSkgeworCQkJZ3BpbyA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfR1BJTykpOworCQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZjYXJkLT50aW1lcikpCisJCQkJYWxpX3F1ZXVlX3Rhc2soY2FyZCwgZ3BpbyAmIDB4MDcpOworCQl9CisJCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJCW91dGwoZXZlbnQgfCAoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAorCQkgICAgIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIG1hbnVhbGx5IGNsZWFyIGludGVycnVwdCBzdGF0dXMsIGJhZCBoYXJkd2FyZSBkZXNpZ24sIGJsYW1lIFReMiAqLworCW91dGwoKFNUX1RBUkdFVF9SRUFDSEVEIHwgTUlYRVJfT1ZFUkZMT1cgfCBNSVhFUl9VTkRFUkZMT1cpLCAKKwkgICAgIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgKi8gCisvKiB0byBiZSBjb3BpZWQgdG8gdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKKy8qIGRyYWluZWQgYnkgdGhpcyBsb29wLiAqLworc3RhdGljIHNzaXplX3QKK3RyaWRlbnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCisJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfcmVhZCBjYWxsZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKKworCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKKworCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnN0YXRlLT5zZW0pOworCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkpCisJCWdvdG8gb3V0OworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPiAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpIHsKKwkJCS8qIGJ1ZmZlciBvdmVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tICovIAorCQkJLyogc2xlZXBfb25fdGltZW91dCwgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciwgKi8gCisJCQkvKiBtYWtlIHByb2Nlc3MgZmx1c2ggdGhlIGJ1ZmZlciAqLworCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOworCQl9CisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisJCWlmIChkbWFidWYtPmNvdW50IDwgY250KQorCQkJY250ID0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQl1bnNpZ25lZCBsb25nIHRtbzsKKwkJCS8qIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKKwkJCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmUgcmVjb3JkZWQgKi8KKwkJCXN0YXJ0X2FkYyhzdGF0ZSk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJdXAoJnN0YXRlLT5zZW0pOworCQkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIHNwYWNlIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8gCisJCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8gCisJCQkvKiB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KKwkJCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyAoZG1hYnVmLT5yYXRlICogMik7CisJCQl0bW8gPj49IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CisJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0IHJldHVybnMsIG9uZSBpcyB3aGVuCisJCQkgICB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkKKwkJCSAgIElTUiBPTiBUSU1FLiBBbm90aGVyIGlzIHdoZW4gdGltZW91dCBpcyBleHBpcmVkLCB3aGljaCBtZWFucyB0aGF0CisJCQkgICBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdAorCQkJICAgaXMgVE9PIExBVEUgZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKHNjaGVkdWxlciBsYXRlbmN5KQorCQkJICAgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpIGJ1ZmZlciBvdmVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzCisJCQkgICBOT1RISU5HIHdlIGNhbiBkbyB0byBwcmV2ZW50IGl0LiAqLworCQkJaWYgKCFpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmRtYWJ1Zi0+d2FpdCwgdG1vKSkgeworCQkJCXByX2RlYnVnKEtFUk5fRVJSICJ0cmlkZW50OiByZWNvcmRpbmcgc2NoZWR1bGUgdGltZW91dCwgIgorCQkJCQkgImRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKKwkJCQkJIGRtYWJ1Zi0+ZG1hc2l6ZSwgZG1hYnVmLT5mcmFnc2l6ZSwgZG1hYnVmLT5jb3VudCwKKwkJCQkJIGRtYWJ1Zi0+aHdwdHIsIGRtYWJ1Zi0+c3dwdHIpOworCisJCQkJLyogYSBidWZmZXIgb3ZlcnJ1biwgd2UgZGVsYXkgdGhlIHJlY292ZXJ5IHVudGlsIG5leHQgdGltZSB0aGUKKwkJCQkgICB3aGlsZSBsb29wIGJlZ2luIGFuZCB3ZSBSRUFMTFkgaGF2ZSBzcGFjZSB0byByZWNvcmQgKi8KKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlkb3duKCZzdGF0ZS0+c2VtKTsKKwkJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRU5YSU87CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBkbWFidWYtPmRtYXNpemU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKKwkJZG1hYnVmLT5jb3VudCAtPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzdGFydF9hZGMoc3RhdGUpOworCX0KK291dDoKKwl1cCgmc3RhdGUtPnNlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgdG8gYmUgZG1hIHRvCisgICB0aGUgc291bmRjYXJkLiAgaXQgaXMgZHJhaW5lZCBieSB0aGUgZG1hIG1hY2hpbmUgYW5kIGZpbGxlZCBieSB0aGlzIGxvb3AuICovCisKK3N0YXRpYyBzc2l6ZV90Cit0cmlkZW50X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKwl1bnNpZ25lZCBpbnQgc3RhdGVfY250OworCXVuc2lnbmVkIGludCBjb3B5X2NvdW50OworCWludCBscmV0OyAvKiBmb3IgbG9ja19zZXRfZm10ICovCisKKwlwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF93cml0ZSBjYWxsZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKKworCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKKworCS8qCisJICogICAgICBHdWFyZCBhZ2FpbnN0IGFuIG1tYXAgb3IgaW9jdGwgd2hpbGUgd3JpdGluZworCSAqLworCisJZG93bigmc3RhdGUtPnNlbSk7CisKKwlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpKQorCQlnb3RvIG91dDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAwOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CisJCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gKi8gCisJCQkvKiBzbGVlcF9vbl90aW1lb3V0LCByZXN5bmMgaHdwdHIgYW5kIHN3cHRyICovCisJCQlkbWFidWYtPmNvdW50ID0gMDsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOworCQl9CisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisJCWlmIChkbWFidWYtPmNvdW50ICsgY250ID4gZG1hYnVmLT5kbWFzaXplKQorCQkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQl1bnNpZ25lZCBsb25nIHRtbzsKKwkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovIAorCQkJLyogd2FpdCBmb3IgZGF0YSB0byBiZSBwbGF5ZWQgKi8KKwkJCXN0YXJ0X2RhYyhzdGF0ZSk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCS8qIE5vIG1hdHRlciBob3cgbXVjaCBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8gCisJCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8gCisJCQkvKiB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KKwkJCWxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSAqIDIpOworCQkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOworCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOworCQkJdXAoJnN0YXRlLT5zZW0pOworCisJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0ICovIAorCQkJLyogcmV0dXJucywgb25lIGlzIHdoZW4gdGhlIGludGVycnVwdCBpcyBzZXJ2aWNlZCAqLyAKKwkJCS8qIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkgSVNSICovIAorCQkJLyogT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggKi8gCisJCQkvKiBtZWFucyB0aGF0IGVpdGhlciBpbnRlcnJ1cHQgaXMgTk9UIHNlcnZpY2VkICovIAorCQkJLyogY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQgaXMgVE9PIExBVEUgKi8gCisJCQkvKiBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAqLyAKKwkJCS8qIChzY2hlZHVsZXIgbGF0ZW5jeSkgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpICovIAorCQkJLyogYnVmZmVyIHVuZGVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzIE5PVEhJTkcgd2UgKi8gCisJCQkvKiBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KKwkJCWlmICghaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZkbWFidWYtPndhaXQsIHRtbykpIHsKKwkJCQlwcl9kZWJ1ZyhLRVJOX0VSUiAidHJpZGVudDogcGxheWJhY2sgc2NoZWR1bGUgIgorCQkJCQkgInRpbWVvdXQsIGRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSAiCisJCQkJCSAiaHdwdHIgJXUgc3dwdHIgJXVcbiIsIGRtYWJ1Zi0+ZG1hc2l6ZSwKKwkJCQkJIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+Y291bnQsCisJCQkJCSBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKKworCQkJCS8qIGEgYnVmZmVyIHVuZGVycnVuLCB3ZSBkZWxheSB0aGUgcmVjb3ZlcnkgKi8gCisJCQkJLyogdW50aWwgbmV4dCB0aW1lIHRoZSB3aGlsZSBsb29wIGJlZ2luIGFuZCAqLyAKKwkJCQkvKiB3ZSBSRUFMTFkgaGF2ZSBkYXRhIHRvIHBsYXkgKi8KKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBvdXRfbm9sb2NrOworCQkJfQorCQkJZG93bigmc3RhdGUtPnNlbSk7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVOWElPOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKChscmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKSB7CisJCQlyZXQgPSBscmV0OworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CisJCQljb3B5X2NvdW50ID0gMDsKKwkJCXN0YXRlX2NudCA9IDA7CisJCQlpZiAoYWxpX3dyaXRlXzVfMShzdGF0ZSwgYnVmZmVyLCBjbnQsICZjb3B5X2NvdW50LCAKKwkJCQkJICAmc3RhdGVfY250KSA9PSAtRUZBVUxUKSB7CisJCQkJaWYgKHN0YXRlX2NudCkgeworCQkJCQlzd3B0ciA9IChzd3B0ciArIHN0YXRlX2NudCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CisJCQkJCWRtYWJ1Zi0+Y291bnQgKz0gc3RhdGVfY250OworCQkJCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAwOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCX0KKwkJCQlyZXQgKz0gY29weV9jb3VudDsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgCisJCQkJCSAgIGJ1ZmZlciwgY250KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXN0YXRlX2NudCA9IGNudDsKKwkJfQorCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisKKwkJc3dwdHIgPSAoc3dwdHIgKyBzdGF0ZV9jbnQpICUgZG1hYnVmLT5kbWFzaXplOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CisJCWRtYWJ1Zi0+Y291bnQgKz0gc3RhdGVfY250OworCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJc3RhcnRfZGFjKHN0YXRlKTsKKwl9CitvdXQ6CisJdXAoJnN0YXRlLT5zZW0pOworb3V0X25vbG9jazoKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludAordHJpZGVudF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUoc3RhdGUpOworCisJLyoKKwkgKiAgICAgIEd1YXJkIGFnYWluc3QgYSBwYXJhbGxlbCBwb2xsIGFuZCB3cml0ZSBjYXVzaW5nIG11bHRpcGxlCisJICogICAgICBwcm9nX2RtYWJ1ZiBldmVudHMKKwkgKi8KKworCWRvd24oJnN0YXRlLT5zZW0pOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpIHsKKwkJCXVwKCZzdGF0ZS0+c2VtKTsKKwkJCXJldHVybiAwOworCQl9CisJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpIHsKKwkJCXVwKCZzdGF0ZS0+c2VtKTsKKwkJCXJldHVybiAwOworCQl9CisJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwl9CisKKwl1cCgmc3RhdGUtPnNlbSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArIAorCQkJICAgIChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQKK3RyaWRlbnRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCByZXQgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKKworCS8qCisJICogICAgICBMb2NrIGFnYWluc3QgcG9sbCByZWFkIHdyaXRlIG9yIG1tYXAgY3JlYXRpbmcgYnVmZmVycy4gQWxzbyBsb2NrCisJICogICAgICBhIHJlYWQgb3Igd3JpdGUgYWdhaW5zdCBhbiBtbWFwLgorCSAqLworCisJZG93bigmc3RhdGUtPnNlbSk7CisKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSAhPSAwKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpICE9IDApCisJCQlnb3RvIG91dDsKKwl9IGVsc2UKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAtRUlOVkFMOworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCisJCWdvdG8gb3V0OworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpKQorCQlnb3RvIG91dDsKKwlyZXQgPSAtRUFHQUlOOworCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJICAgICB2aXJ0X3RvX3BoeXMoZG1hYnVmLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQkgICAgIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJZ290byBvdXQ7CisJZG1hYnVmLT5tYXBwZWQgPSAxOworCXJldCA9IDA7CitvdXQ6CisJdXAoJnN0YXRlLT5zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3RyaWRlbnRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAorCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKwljb3VudF9pbmZvIGNpbmZvOworCWludCB2YWwsIG1hcHBlZCwgcmV0ID0gMDsKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlWQUxJREFURV9TVEFURShzdGF0ZSk7CisKKworCW1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpICYmIGRtYWJ1Zi0+bWFwcGVkKTsKKworCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X2lvY3RsLCBjb21tYW5kID0gJTJkLCBhcmcgPSAweCUwOHhcbiIsCisJCSBfSU9DX05SKGNtZCksIGFyZyA/ICpwIDogMCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldCA9IHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJLyogRklYTUU6IHNwaW5fbG9jayA/ICovCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJc3luY2hyb25pemVfaXJxKGNhcmQtPmlycSk7CisJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKKwkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJc3luY2hyb25pemVfaXJxKGNhcmQtPmlycSk7CisJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKKwkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXQgPSBkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CS8qIHNldCBzbWFwbGUgcmF0ZSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmICh2YWwgPj0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCXRyaWRlbnRfc2V0X2RhY19yYXRlKHN0YXRlLCB2YWwpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQl0cmlkZW50X3NldF9hZGNfcmF0ZShzdGF0ZSwgdmFsKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJfQorCQl9CisJCXJldCA9IHB1dF91c2VyKGRtYWJ1Zi0+cmF0ZSwgcCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoJLyogc2V0IHN0ZXJlbyBvciBtb25vIGNoYW5uZWwgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCWlmICh2YWwpCisJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOworCQkJZWxzZQorCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9TVEVSRU87CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJaWYgKHZhbCkKKwkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF9TVEVSRU87CisJCQllbHNlCisJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX1NURVJFTzsKKwkJfQorCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpKQorCQkJCXJldCA9IHZhbDsKKwkJCWVsc2UKKwkJCQlyZXQgPSBwdXRfdXNlcihkbWFidWYtPmZyYWdzaXplLCBwKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpKQorCQkJCXJldCA9IHZhbDsKKwkJCWVsc2UKKwkJCQlyZXQgPSBwdXRfdXNlcihkbWFidWYtPmZyYWdzaXplLCBwKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIG5laXRoZXIgUkVBRCBub3IgV1JJVEU/IGlzIHRoaXMgZXZlbiBwb3NzaWJsZT8gKi8KKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCAqLworCQlyZXQgPSBwdXRfdXNlcihBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TOCB8IAorCQkJICAgICAgIEFGTVRfVTgsIHApOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CS8qIFNlbGVjdCBzYW1wbGUgZm9ybWF0ICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChyZXQgPSBsb2NrX3NldF9mbXQoc3RhdGUpKSA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UXzE2QklUOworCQkJCWVsc2UKKwkJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UXzE2QklUOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKKwkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfMTZCSVQ7CisJCQkJZWxzZQorCQkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfMTZCSVQ7CisJCQl9CisJCX0KKwkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOworCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyBBRk1UX1MxNl9MRSA6IAorCQkJICAgICAgIEFGTVRfVTgsIHApOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAodmFsICE9IDApIHsKKwkJCWlmICgocmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKworCQkJCS8vcHJldmVudCBmcm9tIG1lbW9yeSBsZWFrCisJCQkJaWYgKChzdGF0ZS0+Y2hhbnNfbnVtID4gMikgJiYgKHN0YXRlLT5jaGFuc19udW0gIT0gdmFsKSkgeworCQkJCQlhbGlfZnJlZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0YXRlKTsKKwkJCQkJc3RhdGUtPmNoYW5zX251bSA9IDE7CisJCQkJfQorCisJCQkJaWYgKHZhbCA+PSAyKSB7CisKKwkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOworCQkJCQlpZiAoKHZhbCA9PSA2KSAmJiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSkgeworCQkJCQkJaWYgKGNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudCA+IDApIHsKKwkJCQkJCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IFJlY29yZCBpcyAiCisJCQkJCQkJICAgICAgICJ3b3JraW5nIG9uIHRoZSBjYXJkIVxuIik7CisJCQkJCQkJcmV0ID0gLUVCVVNZOworCQkJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJcmV0ID0gYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0YXRlLT5jYXJkLCA2KTsKKwkJCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZG93bigmc3RhdGUtPmNhcmQtPm9wZW5fc2VtKTsKKwkJCQkJCXJldCA9IGFsaV9hbGxvY2F0ZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0YXRlLCA2KTsKKwkJCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCQkJdXAoJnN0YXRlLT5jYXJkLT5vcGVuX3NlbSk7CisJCQkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJc3RhdGUtPmNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50Kys7CisJCQkJCQl1cCgmc3RhdGUtPmNhcmQtPm9wZW5fc2VtKTsKKwkJCQkJfSBlbHNlCisJCQkJCQl2YWwgPSAyOwkvKnlpZWxkIHRvIDItY2hhbm5lbHMgKi8KKwkJCQl9IGVsc2UKKwkJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX1NURVJFTzsKKwkJCQlzdGF0ZS0+Y2hhbnNfbnVtID0gdmFsOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA+PSAyKSB7CisJCQkJCWlmICghKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgCisJCQkJCSAgICAgICh2YWwgPT0gNikpKQorCQkJCQkJdmFsID0gMjsKKwkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOworCQkJCX0gZWxzZQorCQkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfU1RFUkVPOworCQkJCXN0YXRlLT5jaGFuc19udW0gPSB2YWw7CisJCQl9CisJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJCX0KKwkJcmV0ID0gcHV0X3VzZXIodmFsLCBwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJLyogQ2F1c2UgdGhlIHdvcmtpbmcgZnJhZ21lbnQgdG8gYmUgb3V0cHV0ICovCisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKGRtYWJ1Zi0+c3ViZGl2aXNpb24pIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMiAmJiB2YWwgIT0gNCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSB2YWw7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gNDsKKwkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDE1OworCQlpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA8IDQpCisJCQlkbWFidWYtPm9zc21heGZyYWdzID0gNDsKKworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSAhPSAwKSB7CisJCQlyZXQgPSB2YWw7CisJCQlicmVhazsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT5mcmFnc2l6ZTsKKwkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKwkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CisJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YgKGFiaW5mbykpID8gCisJCQktRUZBVUxUIDogMDsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkgIT0gMCkgeworCQkJcmV0ID0gdmFsOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IGRtYWJ1Zi0+ZnJhZ3NpemU7CisJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+Y291bnQ7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/IAorCQkJLUVGQVVMVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldCA9IHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfCAKKwkJCSAgICAgICBEU1BfQ0FQX01NQVAgfCBEU1BfQ0FQX0JJTkQsIHApOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIGRtYWJ1Zi0+ZW5hYmxlKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIGRtYWJ1Zi0+ZW5hYmxlKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlyZXQgPSBwdXRfdXNlcih2YWwsIHApOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAKKwkJCQkgICAgKHJldCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpKQorCQkJCQlicmVhazsKKwkJCQlzdGFydF9hZGMoc3RhdGUpOworCQkJfSBlbHNlCisJCQkJc3RvcF9hZGMoc3RhdGUpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIAorCQkJCSAgICAocmV0ID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSkKKwkJCQkJYnJlYWs7CisJCQkJc3RhcnRfZGFjKHN0YXRlKTsKKwkJCX0gZWxzZQorCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkKKwkJICAgICE9IDApIHsKKwkJCXJldCA9IHZhbDsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXM7CisJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CisJCWNpbmZvLnB0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJCWRtYWJ1Zi0+Y291bnQgJj0gZG1hYnVmLT5mcmFnc2l6ZSAtIDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/IAorCQkJLUVGQVVMVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKQorCQkgICAgIT0gMCkgeworCQkJcmV0ID0gdmFsOworCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKKwkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOworCQljaW5mby5ibG9ja3MgPSBkbWFidWYtPmNvdW50ID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCQlpZiAoZG1hYnVmLT5tYXBwZWQpCisJCQlkbWFidWYtPmNvdW50ICY9IGRtYWJ1Zi0+ZnJhZ3NpemUgLSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPyAKKwkJCS1FRkFVTFQgOiAwOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpICE9IDApIHsKKwkJCXJldCA9IHZhbDsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCQl2YWwgPSBkbWFidWYtPmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBwdXRfdXNlcih2YWwsIHApOworCQlicmVhazsKKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJcmV0ID0gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pID8gMiA6IDEsIAorCQkJICAgICAgIHApOworCQlicmVhazsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gQUZNVF9TMTZfTEUgOiAKKwkJCSAgICAgICBBRk1UX1U4LCBwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0hBTk5FTE1BU0s6CisJCXJldCA9IHB1dF91c2VyKERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUiB8IAorCQkJICAgICAgIERTUF9CSU5EX0NFTlRFUl9MRkUsICBwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfQklORF9DSEFOTkVMOgorCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCAhPSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHZhbCA9PSBEU1BfQklORF9RVUVSWSkgeworCQkJdmFsID0gZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgfCAweDNjMDA7CisJCQl2YWwgPSBhdHRyMm1hc2tbdmFsID4+IDhdOworCQl9IGVsc2UgeworCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1JFQyB8IAorCQkJCQkJCSAgICAgIFNSQ19FTkFCTEUpOworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfU1BDX1BCIHwgCisJCQkJCQkJICAgICAgU1JDX0VOQUJMRSk7CisJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSB8PSBtYXNrMmF0dHJbZmZzKHZhbCldOworCQl9CisJCXJldCA9IHB1dF91c2VyKHZhbCwgcCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordHJpZGVudF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpID0gMDsKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBkZXZzOworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IE5VTEw7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gTlVMTDsKKworCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSAqLworCS8qIFRPRE86IHRoZXJlJ3Mgc29tZSByZWR1bmRhY3kgaGVyZSB3cnQgdGhlIGNoZWNrIGJlbG93ICovCisJLyogZm9yIG11bHRpX3VzZV9jb3VudCA+IDAuIFNob3VsZCB3ZSByZXR1cm4gLUVCVVNZIG9yIGZpbmQgKi8KKwkvKiBhIGRpZmZlcmVudCBjYXJkPyBmb3Igbm93LCBkb24ndCBicmVhayBjdXJyZW50IGJlaGF2aW91ciAqLworCS8qIC0tIG11bGl4ICovCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCQlpZiAoY2FyZC0+bXVsdGlfY2hhbm5lbF91c2VfY291bnQgPiAwKQorCQkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwkvKiBmaW5kIGFuIGF2YWlsYWJsZSB2aXJ0dWFsIGNoYW5uZWwgKGluc3RhbmNlIG9mIC9kZXYvZHNwKSAqLworCXdoaWxlIChjYXJkICE9IE5VTEwpIHsKKwkJZG93bigmY2FyZC0+b3Blbl9zZW0pOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJLyogU2tpcCBvcGVucyBvbiBjYXJkcyB0aGF0IGFyZSBpbiA2IGNoYW5uZWwgbW9kZSAqLworCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID4gMCkgeworCQkJCXVwKCZjYXJkLT5vcGVuX3NlbSk7CisJCQkJY2FyZCA9IGNhcmQtPm5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJCWlmIChjYXJkLT5zdGF0ZXNbaV0gPT0gTlVMTCkgeworCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzW2ldID0ga21hbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKHN0YXRlID09IE5VTEwpIHsKKwkJCQkJdXAoJmNhcmQtPm9wZW5fc2VtKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKCpzdGF0ZSkpOworCQkJCWluaXRfTVVURVgoJnN0YXRlLT5zZW0pOworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCWdvdG8gZm91bmRfdmlydDsKKwkJCX0KKwkJfQorCQl1cCgmY2FyZC0+b3Blbl9zZW0pOworCQljYXJkID0gY2FyZC0+bmV4dDsKKwl9CisJLyogbm8gbW9yZSB2aXJ0dWFsIGNoYW5uZWwgYXZhaWFibGUgKi8KKwlpZiAoIXN0YXRlKSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKyAgICAgIGZvdW5kX3ZpcnQ6CisJLyogZm91bmQgYSBmcmVlIHZpcnR1YWwgY2hhbm5lbCwgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbHMgKi8KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKGNhcmQpOworCWVsc2UKKwkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCk7CisKKwlpZiAoZG1hYnVmLT5jaGFubmVsID09IE5VTEwpIHsKKwkJa2ZyZWUoY2FyZC0+c3RhdGVzW2ldKTsKKwkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCBjaGFubmVsICovCisJc3RhdGUtPnZpcnQgPSBpOworCXN0YXRlLT5jYXJkID0gY2FyZDsKKwlzdGF0ZS0+bWFnaWMgPSBUUklERU5UX1NUQVRFX01BR0lDOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gc3RhdGU7CisKKwkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgZm9ybWF0LiBBY2NvcmRpbmcgdG8gT1NTIFByb2dyYW1tZXIncyAqLyAKKwkvKiBHdWlkZSAgL2Rldi9kc3Agc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCAqLyAKKwkvKiB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfTUFTSzsKKwkJaWYgKChtaW5vciAmIDB4MGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF8xNkJJVDsKKwkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAwOworCQlkbWFidWYtPm9zc21heGZyYWdzID0gMDsKKwkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IDA7CisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CisJCQkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIGF0dHJpYnV0ZSB0byBub3JtYWwgcGxheWJhY2sgKi8KKwkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gQ0hBTk5FTF9QQjsKKwkJfQorCQl0cmlkZW50X3NldF9kYWNfcmF0ZShzdGF0ZSwgODAwMCk7CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJLyogRklYTUU6IFRyaWRlbnQgNGQgY2FuIG9ubHkgcmVjb3JkIGluIHNpZ25lZCAxNi1iaXRzIHN0ZXJlbywgKi8gCisJCS8qIDQ4a0h6IHNhbXBsZSwgdG8gYmUgZGVhbGVkIHdpdGggaW4gdHJpZGVudF9zZXRfYWRjX3JhdGUoKSA/PyAqLworCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfTUFTSzsKKwkJaWYgKChtaW5vciAmIDB4MGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF8xNkJJVDsKKwkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAwOworCQlkbWFidWYtPm9zc21heGZyYWdzID0gMDsKKwkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IDA7CisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CisJCQkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIGF0dHJpYnV0ZSB0byAweDhhODAsIHJlY29yZCBmcm9tCisJCQkgICBQQ00gTC9SIEZJRk8gYW5kIG1vbm8gPSAobGVmdCArIHJpZ2h0ICsgMSkvMiAqLworCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfCBQQ01fTFIgfCAKKwkJCQkJCSAgICAgIE1PTk9fTUlYKTsKKwkJfQorCQl0cmlkZW50X3NldF9hZGNfcmF0ZShzdGF0ZSwgODAwMCk7CisKKwkJLyogQWRkZWQgYnkgTWF0dCBXdSAwMS0wNS0yMDAxICovCisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkKKwkJCWNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudCsrOworCX0KKworCXN0YXRlLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJdXAoJmNhcmQtPm9wZW5fc2VtKTsKKworCXByX2RlYnVnKCJ0cmlkZW50OiBvcGVuIHZpcnR1YWwgY2hhbm5lbCAlZCwgaGFyZCBjaGFubmVsICVkXG4iLAorCQkgc3RhdGUtPnZpcnQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludAordHJpZGVudF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKworCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKKworCWNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQl0cmlkZW50X2NsZWFyX3RhaWwoc3RhdGUpOworCQlkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwl9CisKKwlwcl9kZWJ1ZygidHJpZGVudDogY2xvc2luZyB2aXJ0dWFsIGNoYW5uZWwgJWQsIGhhcmQgY2hhbm5lbCAlZFxuIiwKKwkJIHN0YXRlLT52aXJ0LCBkbWFidWYtPmNoYW5uZWwtPm51bSk7CisKKwkvKiBzdG9wIERNQSBzdGF0ZSBtYWNoaW5lIGFuZCBmcmVlIERNQSBidWZmZXJzL2NoYW5uZWxzICovCisJZG93bigmY2FyZC0+b3Blbl9zZW0pOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0b3BfZGFjKHN0YXRlKTsKKwkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5kbWFidWYsIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKKwkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKKworCQkvKiBBZGRlZCBieSBNYXR0IFd1ICovCisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgeworCQkJaWYgKHN0YXRlLT5jaGFuc19udW0gPiAyKSB7CisJCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50LS0gPCAwKQorCQkJCQljYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA9IDA7CisJCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID09IDApCisJCQkJCWFsaV9jbG9zZV9tdWx0aV9jaGFubmVscygpOworCQkJCWFsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RhdGUpOworCQkJfQorCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0b3BfYWRjKHN0YXRlKTsKKwkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5kbWFidWYsIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKKwkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKKworCQkvKiBBZGRlZCBieSBNYXR0IFd1ICovCisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgeworCQkJaWYgKGNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudC0tIDwgMCkKKwkJCQljYXJkLT5yZWNfY2hhbm5lbF91c2VfY291bnQgPSAwOworCQl9CisJfQorCisJY2FyZC0+c3RhdGVzW3N0YXRlLT52aXJ0XSA9IE5VTEw7CisJa2ZyZWUoc3RhdGUpOworCisJLyogd2UncmUgY292ZXJlZCBieSB0aGUgb3Blbl9zZW0gKi8KKwl1cCgmY2FyZC0+b3Blbl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJpZGVudF9hdWRpb19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBub19sbHNlZWssCisJLnJlYWQgPSB0cmlkZW50X3JlYWQsCisJLndyaXRlID0gdHJpZGVudF93cml0ZSwKKwkucG9sbCA9IHRyaWRlbnRfcG9sbCwKKwkuaW9jdGwgPSB0cmlkZW50X2lvY3RsLAorCS5tbWFwID0gdHJpZGVudF9tbWFwLAorCS5vcGVuID0gdHJpZGVudF9vcGVuLAorCS5yZWxlYXNlID0gdHJpZGVudF9yZWxlYXNlLAorfTsKKworLyogdHJpZGVudCBzcGVjaWZpYyBBQzk3IGZ1bmN0aW9ucyAqLworLyogV3JpdGUgQUM5NyBjb2RlYyByZWdpc3RlcnMgKi8KK3N0YXRpYyB2b2lkCit0cmlkZW50X2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsKQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2ssIGJ1c3k7CisJdW5zaWduZWQgc2hvcnQgY291bnQgPSAweGZmZmY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgZGF0YTsKKworCWRhdGEgPSAoKHUzMikgdmFsKSA8PCAxNjsKKworCXN3aXRjaCAoY2FyZC0+cGNpX2lkKSB7CisJZGVmYXVsdDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKKwkJYWRkcmVzcyA9IFNJX0FDOTdfV1JJVEU7CisJCW1hc2sgPSBTSV9BQzk3X0JVU1lfV1JJVEUgfCBTSV9BQzk3X0FVRElPX0JVU1k7CisJCWlmIChjb2RlYy0+aWQpCisJCQltYXNrIHw9IFNJX0FDOTdfU0VDT05EQVJZOworCQlidXN5ID0gU0lfQUM5N19CVVNZX1dSSVRFOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CisJCWFkZHJlc3MgPSBEWF9BQ1IwX0FDOTdfVzsKKwkJbWFzayA9IGJ1c3kgPSBEWF9BQzk3X0JVU1lfV1JJVEU7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKKwkJYWRkcmVzcyA9IE5YX0FDUjFfQUM5N19XOworCQltYXNrID0gTlhfQUM5N19CVVNZX1dSSVRFOworCQlpZiAoY29kZWMtPmlkKQorCQkJbWFzayB8PSBOWF9BQzk3X1dSSVRFX1NFQ09OREFSWTsKKwkJYnVzeSA9IE5YX0FDOTdfQlVTWV9XUklURTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgorCQlhZGRyZXNzID0gU0lfQUM5N19XUklURTsKKwkJbWFzayA9IGJ1c3kgPSBTSV9BQzk3X0JVU1lfV1JJVEU7CisJCWlmIChjb2RlYy0+aWQpCisJCQltYXNrIHw9IFNJX0FDOTdfU0VDT05EQVJZOworCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCWRvIHsKKwkJaWYgKChpbncoVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpICYgYnVzeSkgPT0gMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKGNvdW50LS0pOworCisJZGF0YSB8PSAobWFzayB8IChyZWcgJiBBQzk3X1JFR19BRERSKSk7CisKKwlpZiAoY291bnQgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IEFDOTcgQ09ERUMgd3JpdGUgdGltZWQgb3V0LlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCW91dGwoZGF0YSwgVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyogUmVhZCBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLworc3RhdGljIHUxNgordHJpZGVudF9hYzk3X2dldChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBhZGRyZXNzLCBtYXNrLCBidXN5OworCXVuc2lnbmVkIHNob3J0IGNvdW50ID0gMHhmZmZmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGRhdGE7CisKKwlzd2l0Y2ggKGNhcmQtPnBjaV9pZCkgeworCWRlZmF1bHQ6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CisJCWFkZHJlc3MgPSBTSV9BQzk3X1JFQUQ7CisJCW1hc2sgPSBTSV9BQzk3X0JVU1lfUkVBRCB8IFNJX0FDOTdfQVVESU9fQlVTWTsKKwkJaWYgKGNvZGVjLT5pZCkKKwkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CisJCWJ1c3kgPSBTSV9BQzk3X0JVU1lfUkVBRDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgorCQlhZGRyZXNzID0gRFhfQUNSMV9BQzk3X1I7CisJCW1hc2sgPSBidXN5ID0gRFhfQUM5N19CVVNZX1JFQUQ7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKKwkJaWYgKGNvZGVjLT5pZCkKKwkJCWFkZHJlc3MgPSBOWF9BQ1IzX0FDOTdfUl9TRUNPTkRBUlk7CisJCWVsc2UKKwkJCWFkZHJlc3MgPSBOWF9BQ1IyX0FDOTdfUl9QUklNQVJZOworCQltYXNrID0gTlhfQUM5N19CVVNZX1JFQUQ7CisJCWJ1c3kgPSBOWF9BQzk3X0JVU1lfUkVBRCB8IE5YX0FDOTdfQlVTWV9EQVRBOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CisJCWFkZHJlc3MgPSBTSV9BQzk3X1JFQUQ7CisJCW1hc2sgPSBidXN5ID0gU0lfQUM5N19CVVNZX1JFQUQ7CisJCWlmIChjb2RlYy0+aWQpCisJCQltYXNrIHw9IFNJX0FDOTdfU0VDT05EQVJZOworCQlicmVhazsKKwl9CisKKwlkYXRhID0gKG1hc2sgfCAocmVnICYgQUM5N19SRUdfQUREUikpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlvdXRsKGRhdGEsIFRSSURfUkVHKGNhcmQsIGFkZHJlc3MpKTsKKwlkbyB7CisJCWRhdGEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpOworCQlpZiAoKGRhdGEgJiBidXN5KSA9PSAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoY291bnQtLSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNvdW50ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBBQzk3IENPREVDIHJlYWQgdGltZWQgb3V0LlxuIik7CisJCWRhdGEgPSAwOworCX0KKwlyZXR1cm4gKCh1MTYpIChkYXRhID4+IDE2KSk7Cit9CisKKy8qIHJld3JpdGUgYWM5NyByZWFkIGFuZCB3cml0ZSBtaXhlciByZWdpc3RlciBieSBodWxlaSBmb3IgQUxJKi8KK3N0YXRpYyBpbnQKK2FjcXVpcmVjb2RlY2FjY2VzcyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXUxNiB3c2VtYW1hc2sgPSAweDYwMDA7CS8qIGJpdCAxNC4uMTMgKi8KKwl1MTYgd3NlbWFiaXRzOworCXUxNiB3Y29udHJvbDsKKwlpbnQgYmxvY2sgPSAwOworCWludCBuY291bnQgPSAyNTsKKwl3aGlsZSAoMSkgeworCQl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOworCQl3c2VtYWJpdHMgPSB3Y29udHJvbCAmIHdzZW1hbWFzazsKKworCQlpZiAod3NlbWFiaXRzID09IDB4NDAwMCkKKwkJCXJldHVybiAxOwkvKiAweDQwMDAgaXMgYXVkaW8gLHRoZW4gc3VjY2VzcyAqLworCQlpZiAobmNvdW50LS0gPCAwKQorCQkJYnJlYWs7CisJCWlmICh3c2VtYWJpdHMgPT0gMCkgeworCQkgICAgICB1bmxvY2s6CisJCQlvdXRsKCgodTMyKSAod2NvbnRyb2wgJiAweDFlZmYpIHwgMHgwMDAwNDAwMCksIAorCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOworCQkJY29udGludWU7CisJCX0KKwkJdWRlbGF5KDIwKTsKKwl9CisJaWYgKCFibG9jaykgeworCQlwcl9kZWJ1ZygiYWNjZXNzY29kZWNzZW1hcGhvcmU6IHRyeSB1bmxvY2tcbiIpOworCQlibG9jayA9IDE7CisJCWdvdG8gdW5sb2NrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3JlbGVhc2Vjb2RlY2FjY2VzcyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgd2NvbnRyb2w7CisJd2NvbnRyb2wgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKKwlvdXRsKCh3Y29udHJvbCAmIDB4ZmZmZjFlZmYpLCBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOworfQorCitzdGF0aWMgaW50Cit3YWl0Zm9yc3RpbWVydGljayhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgY2hrMSwgY2hrMjsKKwl1bnNpZ25lZCBpbnQgd2NvdW50ID0gMHhmZmZmOworCWNoazEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NUSU1FUikpOworCisJd2hpbGUgKDEpIHsKKwkJY2hrMiA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7CisJCWlmICgod2NvdW50ID4gMCkgJiYgY2hrMSAhPSBjaGsyKQorCQkJcmV0dXJuIDE7CisJCWlmICh3Y291bnQgPD0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoNTApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCBBQzk3IGNvZGVjIHJlZ2lzdGVycyBmb3IgQUxpKi8KK3N0YXRpYyB1MTYKK2FsaV9hYzk3X2dldChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgc2Vjb25kYXJ5LCB1OCByZWcpCit7CisJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2s7CisJdW5zaWduZWQgaW50IG5jb3VudDsKKwl1bnNpZ25lZCBsb25nIGF1ZF9yZWc7CisJdTMyIGRhdGE7CisJdTE2IHdjb250cm9sOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNhcmQpCisJCUJVRygpOworCisJYWRkcmVzcyA9IEFMSV9BQzk3X1JFQUQ7CisJaWYgKGNhcmQtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikgeworCQlhZGRyZXNzID0gQUxJX0FDOTdfV1JJVEU7CisJfQorCW1hc2sgPSBBTElfQUM5N19SRUFEX0FDVElPTiB8IEFMSV9BQzk3X0FVRElPX0JVU1k7CisJaWYgKHNlY29uZGFyeSkKKwkJbWFzayB8PSBBTElfQUM5N19TRUNPTkRBUlk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFhY3F1aXJlY29kZWNhY2Nlc3MoY2FyZCkpCisJCXByaW50ayhLRVJOX0VSUiAiYWNjZXNzIGNvZGVjIGZhaWxcbiIpOworCisJd2NvbnRyb2wgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKKwl3Y29udHJvbCAmPSAweGZlMDA7CisJd2NvbnRyb2wgfD0gKDB4ODAwMCB8IHJlZyk7CisJb3V0dyh3Y29udHJvbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKKworCWRhdGEgPSAobWFzayB8IChyZWcgJiBBQzk3X1JFR19BRERSKSk7CisKKwlpZiAoIXdhaXRmb3JzdGltZXJ0aWNrKGNhcmQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfcmVhZDogQklUX0NMT0NLIGlzIGRlYWRcbiIpOworCQlnb3RvIHJlbGVhc2Vjb2RlYzsKKwl9CisKKwl1ZGVsYXkoMjApOworCisJbmNvdW50ID0gMTA7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpICYgQUxJX0FDOTdfQlVTWV9SRUFEKSAKKwkJICAgICE9IDApCisJCQlicmVhazsKKwkJaWYgKG5jb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChuY291bnQtLSA9PSAxKSB7CisJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfcmVhZCA6dHJ5IGNsZWFyIGJ1c3kgZmxhZ1xuIik7CisJCQlhdWRfcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CisJCQlvdXRsKChhdWRfcmVnICYgMHhmZmZmN2ZmZiksIAorCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCisJZGF0YSA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKCh1MTYpIChkYXRhID4+IDE2KSk7CisKKyAgICAgIHJlbGVhc2Vjb2RlYzoKKwlyZWxlYXNlY29kZWNhY2Nlc3MoY2FyZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfcmVhZDogQUM5NyBDT0RFQyByZWFkIHRpbWVkIG91dC5cbiIpOworCXJldHVybiAwOworfQorCisvKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyBmb3IgaHVsZWkqLworc3RhdGljIHZvaWQKK2FsaV9hYzk3X3NldChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgc2Vjb25kYXJ5LCB1OCByZWcsIHUxNiB2YWwpCit7CisJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2s7CisJdW5zaWduZWQgaW50IG5jb3VudDsKKwl1MzIgZGF0YTsKKwl1MTYgd2NvbnRyb2w7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRhdGEgPSAoKHUzMikgdmFsKSA8PCAxNjsKKworCWlmICghY2FyZCkKKwkJQlVHKCk7CisKKwlhZGRyZXNzID0gQUxJX0FDOTdfV1JJVEU7CisJbWFzayA9IEFMSV9BQzk3X1dSSVRFX0FDVElPTiB8IEFMSV9BQzk3X0FVRElPX0JVU1k7CisJaWYgKHNlY29uZGFyeSkKKwkJbWFzayB8PSBBTElfQUM5N19TRUNPTkRBUlk7CisJaWYgKGNhcmQtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikKKwkJbWFzayB8PSBBTElfQUM5N19XUklURV9NSVhFUl9SRUdJU1RFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJaWYgKCFhY3F1aXJlY29kZWNhY2Nlc3MoY2FyZCkpCisJCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfd3JpdGU6IGFjY2VzcyBjb2RlYyBmYWlsXG4iKTsKKworCXdjb250cm9sID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CisJd2NvbnRyb2wgJj0gMHhmZjAwOworCXdjb250cm9sIHw9ICgweDgxMDAgfCByZWcpOyAvKiBiaXQgOD0xOiAoYWxpMTUzNSApcmVzZXJ2ZWQvICovIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGkxNTM1KyB3cml0ZSAqLworCW91dGwoKGRhdGEgfCB3Y29udHJvbCksIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CisKKwlpZiAoIXdhaXRmb3JzdGltZXJ0aWNrKGNhcmQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklUX0NMT0NLIGlzIGRlYWRcbiIpOworCQlnb3RvIHJlbGVhc2Vjb2RlYzsKKwl9CisKKwluY291bnQgPSAxMDsKKwl3aGlsZSAoMSkgeworCQl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOworCQlpZiAoISh3Y29udHJvbCAmIDB4ODAwMCkpCisJCQlicmVhazsKKwkJaWYgKG5jb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChuY291bnQtLSA9PSAxKSB7CisJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfc2V0IDp0cnkgY2xlYXIgYnVzeSBmbGFnISFcbiIpOworCQkJb3V0dyh3Y29udHJvbCAmIDB4N2ZmZiwgCisJCQkgICAgIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9CisKKyAgICAgIHJlbGVhc2Vjb2RlYzoKKwlyZWxlYXNlY29kZWNhY2Nlc3MoY2FyZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2FsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0KQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgc19jaGFubmVsczsKKworCXNfY2hhbm5lbHMgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJc19jaGFubmVscyB8PSAoMSA8PCBzdGF0LT5kbWFidWYuY2hhbm5lbC0+bnVtKTsKKwlvdXRsKHNfY2hhbm5lbHMsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworfQorCitzdGF0aWMgdTE2CithbGlfYWM5N19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKQoreworCWludCBpZDsKKwl1MTYgZGF0YTsKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gTlVMTDsKKworCS8qIEFkZGVkIGJ5IE1hdHQgV3UgKi8KKwlpZiAoIWNvZGVjKQorCQlCVUcoKTsKKworCWNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFjYXJkLT5taXhlcl9yZWdzX3JlYWR5KQorCQlyZXR1cm4gYWxpX2FjOTdfZ2V0KGNhcmQsIGNvZGVjLT5pZCwgcmVnKTsKKworCS8qCisJICogICAgICBGSVhNRTogbmVlZCB0byBzdG9wIHRoaXMgY2FjaGluZyBzb21lIHJlZ2lzdGVycworCSAqLworCWlmIChjb2RlYy0+aWQpCisJCWlkID0gMTsKKwllbHNlCisJCWlkID0gMDsKKworCWRhdGEgPSBjYXJkLT5taXhlcl9yZWdzW3JlZyAvIDJdW2lkXTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2FsaV9hYzk3X3dyaXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsKQoreworCWludCBpZDsKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkOworCisJLyogIEFkZGVkIGJ5IE1hdHQgV3UgKi8KKwlpZiAoIWNvZGVjKQorCQlCVUcoKTsKKworCWNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFjYXJkLT5taXhlcl9yZWdzX3JlYWR5KSB7CisJCWFsaV9hYzk3X3NldChjYXJkLCBjb2RlYy0+aWQsIHJlZywgdmFsKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjb2RlYy0+aWQpCisJCWlkID0gMTsKKwllbHNlCisJCWlkID0gMDsKKworCWNhcmQtPm1peGVyX3JlZ3NbcmVnIC8gMl1baWRdID0gdmFsOworCWFsaV9hYzk3X3NldChjYXJkLCBjb2RlYy0+aWQsIHJlZywgdmFsKTsKK30KKworLyoKK2ZsYWc6CUFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUCisJQUxJX1BDTV9UT19TUERJRl9PVVQKKyovCisKK3N0YXRpYyB2b2lkCithbGlfc2V0dXBfc3BkaWZfb3V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgc3BkaWY7CisJdW5zaWduZWQgY2hhciBjaDsKKworCWNoYXIgdGVtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisKKwlwY2lfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIAorCQkJCSAgcGNpX2Rldik7CisJaWYgKHBjaV9kZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NjEsICZ0ZW1wKTsKKwl0ZW1wIHw9IDB4NDA7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NjEsIHRlbXApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2QsICZ0ZW1wKTsKKwl0ZW1wIHw9IDB4MDE7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2QsIHRlbXApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2UsICZ0ZW1wKTsKKwl0ZW1wICY9ICh+MHgyMCk7CisJdGVtcCB8PSAweDEwOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdlLCB0ZW1wKTsKKworCWNoID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOworCW91dGIoY2ggfCBBTElfU1BESUZfT1VUX0VOQUJMRSwgVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CisJY2ggPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKwlvdXRiKGNoICYgQUxJX1NQRElGX09VVF9DSF9TVEFUVVMsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CisKKwlpZiAoZmxhZyAmIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUKSB7CisJCXNwZGlmID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCQlzcGRpZiB8PSBBTElfU1BESUZfT1VUX0NIX0VOQUJMRTsKKwkJc3BkaWYgJj0gQUxJX1NQRElGX09VVF9TRUxfU1BESUY7CisJCW91dHcoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MpKTsKKwkJaWYgKGZsYWcgJiBBTElfU1BESUZfT1VUX05PTl9QQ00pCisJCQlzcGRpZiB8PSAweDAwMDI7CisJCWVsc2UKKwkJCXNwZGlmICY9ICh+MHgwMDAyKTsKKwkJb3V0dyhzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTKSk7CisJfSBlbHNlIHsKKwkJc3BkaWYgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJCXNwZGlmIHw9IEFMSV9TUERJRl9PVVRfU0VMX1BDTTsKKwkJb3V0dyhzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaCkKK3sKKwl1bnNpZ25lZCBsb25nIHNjOworCisJc2MgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJc2MgJj0gfigxIDw8IGNoKTsKKwlvdXRsKHNjLCBUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKK30KKworc3RhdGljIHZvaWQKK2FsaV9kaXNhYmxlX3NwZGlmX2luKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBzcGRpZjsKKworCXNwZGlmID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCXNwZGlmICY9ICh+QUxJX1NQRElGX0lOX1NVUFBPUlQpOworCW91dGwoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCisJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGNhcmQsIEFMSV9TUERJRl9JTl9DSEFOTkVMKTsKK30KKworc3RhdGljIHZvaWQKK2FsaV9zZXR1cF9zcGRpZl9pbihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgc3BkaWY7CisKKwkvL1NldCBTUERJRiBJTiBTdXBwb3J0ZWQKKwlzcGRpZiA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKKwlzcGRpZiB8PSBBTElfU1BESUZfSU5fU1VQUE9SVDsKKwlvdXRsKHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKKworCS8vU2V0IFNQRElGIElOIFJlYworCXNwZGlmID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCXNwZGlmIHw9IEFMSV9TUERJRl9JTl9DSF9FTkFCTEU7CisJb3V0bChzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisKKwlzcGRpZiA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOworCXNwZGlmIHw9IEFMSV9TUERJRl9JTl9DSF9TVEFUVVM7CisJb3V0YihzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKy8qCisJc3BkaWYgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKwlzcGRpZiB8PSBBTElfU1BESUZfSU5fRlVOQ19FTkFCTEU7CisJb3V0YihzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKyovCit9CisKK3N0YXRpYyB2b2lkCithbGlfZGVsYXkoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGludGVydmFsKQoreworCXVuc2lnbmVkIGxvbmcgYmVnaW50aW1lciwgY3VycmVudHRpbWVyOworCisJYmVnaW50aW1lciA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7CisJY3VycmVudHRpbWVyID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TVElNRVIpKTsKKworCXdoaWxlIChjdXJyZW50dGltZXIgPCBiZWdpbnRpbWVyICsgaW50ZXJ2YWwpCisJCWN1cnJlbnR0aW1lciA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7Cit9CisKK3N0YXRpYyB2b2lkCithbGlfZGV0ZWN0X3NwZGlmX3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKK3sKKwl1MTYgd3ZhbCA9IDA7CisJdTE2IGNvdW50ID0gMDsKKwl1OCBidmFsID0gMCwgUjEgPSAwLCBSMiA9IDA7CisKKwlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CisJYnZhbCB8PSAweDAyOworCW91dGIoYnZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKworCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CisJYnZhbCB8PSAweDFGOworCW91dGIoYnZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CisKKwl3aGlsZSAoKChSMSA8IDB4MEIpIHx8IChSMSA+IDB4MEUpKSAmJiAoUjEgIT0gMHgxMikgJiYgCisJICAgICAgIGNvdW50IDw9IDUwMDAwKSB7CisJCWNvdW50Kys7CisKKwkJYWxpX2RlbGF5KGNhcmQsIDYpOworCisJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CisJCVIxID0gYnZhbCAmIDB4MUY7CisJfQorCisJaWYgKGNvdW50ID4gNTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogRXJyb3IgaW4gIgorCQkgICAgICAgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZSFcbiIpOworCQlyZXR1cm47CisJfQorCisJY291bnQgPSAwOworCisJd2hpbGUgKGNvdW50IDw9IDUwMDAwKSB7CisJCWNvdW50Kys7CisKKwkJYWxpX2RlbGF5KGNhcmQsIDYpOworCisJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CisJCVIyID0gYnZhbCAmIDB4MUY7CisKKwkJaWYgKFIyICE9IFIxKQorCQkJUjEgPSBSMjsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKGNvdW50ID4gNTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogRXJyb3IgaW4gIgorCQkgICAgICAgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZSFcbiIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChSMikgeworCWNhc2UgMHgwYjoKKwljYXNlIDB4MGM6CisJY2FzZSAweDBkOgorCWNhc2UgMHgwZToKKwkJd3ZhbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDIpKTsKKwkJd3ZhbCAmPSAweEUwRjA7CisJCXd2YWwgfD0gKHUxNikgMHgwOSA8PCA4IHwgKHUxNikgMHgwNTsKKwkJb3V0dyh3dmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDIpKTsKKworCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKSAmIDB4RjA7CisJCW91dGIoYnZhbCB8IDB4MDIsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTI6CisJCXd2YWwgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAyKSk7CisJCXd2YWwgJj0gMHhFMEYwOworCQl3dmFsIHw9ICh1MTYpIDB4MEUgPDwgOCB8ICh1MTYpIDB4MDg7CisJCW91dHcod3ZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAyKSk7CisKKwkJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSkgJiAweEYwOworCQlvdXRiKGJ2YWwgfCAweDAzLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2FsaV9nZXRfc3BkaWZfaW5fcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXUzMiBkd1JhdGUgPSAwOworCXU4IGJ2YWwgPSAwOworCisJYWxpX2RldGVjdF9zcGRpZl9yYXRlKGNhcmQpOworCisJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOworCWJ2YWwgJj0gMHg3RjsKKwlidmFsIHw9IDB4NDA7CisJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOworCisJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSk7CisJYnZhbCAmPSAweDBGOworCisJc3dpdGNoIChidmFsKSB7CisJY2FzZSAwOgorCQlkd1JhdGUgPSA0NDEwMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlkd1JhdGUgPSA0ODAwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkd1JhdGUgPSAzMjAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLy8gRXJyb3Igb2NjdXJzCisJCWJyZWFrOworCX0KKworCXJldHVybiBkd1JhdGU7CisKK30KKworc3RhdGljIGludAorYWxpX2Nsb3NlX211bHRpX2NoYW5uZWxzKHZvaWQpCit7CisJY2hhciB0ZW1wID0gMDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisKKwlwY2lfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIAorCQkJCSAgcGNpX2Rldik7CisJaWYgKHBjaV9kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NTksICZ0ZW1wKTsKKwl0ZW1wICY9IH4weDgwOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCB0ZW1wKTsKKworCXBjaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSwgCisJCQkJICBwY2lfZGV2KTsKKwlpZiAocGNpX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweEI4LCAmdGVtcCk7CisJdGVtcCAmPSB+MHgyMDsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHhCOCwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaGFuX251bXMpCit7CisJdW5zaWduZWQgbG9uZyBkd1ZhbHVlOworCWNoYXIgdGVtcCA9IDA7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCisJcGNpX2RldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCAKKwkJCQkgIHBjaV9kZXYpOworCWlmIChwY2lfZGV2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCAmdGVtcCk7CisJdGVtcCB8PSAweDgwOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCB0ZW1wKTsKKworCXBjaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSwgCisJCQkJICBwY2lfZGV2KTsKKwlpZiAocGNpX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgKGludCkgMHhCOCwgJnRlbXApOworCXRlbXAgfD0gMHgyMDsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgKGludCkgMHhCOCwgKHU4KSB0ZW1wKTsKKwlpZiAoY2hhbl9udW1zID09IDYpIHsKKwkJZHdWYWx1ZSA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKSB8IDB4MDAwZjAwMDA7CisJCW91dGwoZHdWYWx1ZSwgVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CisJCW1kZWxheSg0KTsKKwkJZHdWYWx1ZSA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKKwkJaWYgKGR3VmFsdWUgJiAweDIwMDAwMDApIHsKKwkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIsIDgwODApOworCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgMHgzNiwgMCk7CisJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDM4LCAwKTsKKwkJCS8qCisJCQkgKiAgICAgIE9uIGEgYm9hcmQgd2l0aCBhIHNpbmdsZSBjb2RlYyB5b3Ugd29uJ3QgZ2V0IHRoZQorCQkJICogICAgICBzdXJyb3VuZC4gT24gb3RoZXIgYm9hcmRzIGNvbmZpZ3VyZSBpdC4KKwkJCSAqLworCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbMV0gIT0gTlVMTCkgeworCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4MzYsIDApOworCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4MzgsIDApOworCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4MDIsIDB4MDYwNik7CisJCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1sxXSwgMHgxOCwgMHgwMzAzKTsKKwkJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzFdLCAweDc0LCAweDMpOworCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkCithbGlfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgYmFuazsKKworCWlmIChjaGFubmVsID4gMzEpCisJCXJldHVybjsKKworCWJhbmsgPSBjaGFubmVsID4+IDU7CisJY2hhbm5lbCA9IGNoYW5uZWwgJiAweDFmOworCisJY2FyZC0+YmFua3NbYmFua10uYml0bWFwICY9IH4oMSA8PCAoY2hhbm5lbCkpOworfQorCitzdGF0aWMgaW50CithbGlfYWxsb2NhdGVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGludCBjaGFuX251bXMpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzOworCWludCBpLCBzdGF0ZV9jb3VudCA9IDA7CisJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CisJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIG51bTsKKworCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKKworCWlmIChjaGFuX251bXMgIT0gNikKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyAoaSA8IEFMSV9DSEFOTkVMUykgJiYgKHN0YXRlX2NvdW50ICE9IDQpOyBpKyspIHsKKwkJaWYgKGNhcmQtPnN0YXRlc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOworCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBudW0pKSkgeworCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgbnVtOworCQkJY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tudW1dOworCQkJY2hhbm5lbC0+bnVtID0gbnVtOworCQl9IGVsc2UgeworCQkJc3RhdGVfY291bnQtLTsKKwkJCWZvciAoOyBzdGF0ZV9jb3VudCA+PSAwOyBzdGF0ZV9jb3VudC0tKSB7CisJCQkJa2ZyZWUoc3RhdGUtPm90aGVyX3N0YXRlc1tzdGF0ZV9jb3VudF0pOworCQkJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOworCQkJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOworCQkJfQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlzID0gY2FyZC0+c3RhdGVzW2ldID0ga21hbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcykgeworCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CisJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOworCQkJc3RhdGVfY291bnQtLTsKKwkJCWZvciAoOyBzdGF0ZV9jb3VudCA+PSAwOyBzdGF0ZV9jb3VudC0tKSB7CisJCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CisJCQkJYWxpX2ZyZWVfcGNtX2NoYW5uZWwoY2FyZCwgbnVtKTsKKwkJCQlrZnJlZShzdGF0ZS0+b3RoZXJfc3RhdGVzW3N0YXRlX2NvdW50XSk7CisJCQl9CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQocywgMCwgc2l6ZW9mKCpzdGF0ZSkpOworCisJCXMtPmRtYWJ1Zi5jaGFubmVsID0gY2hhbm5lbDsKKwkJcy0+ZG1hYnVmLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYWJ1Zi5vc3NtYXhmcmFncyA9CisJCQlzLT5kbWFidWYuc3ViZGl2aXNpb24gPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFidWYud2FpdCk7CisJCXMtPm1hZ2ljID0gY2FyZC0+bWFnaWM7CisJCXMtPmNhcmQgPSBjYXJkOworCQlzLT52aXJ0ID0gaTsKKwkJYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwocyk7CisJCXN0YXRlLT5vdGhlcl9zdGF0ZXNbc3RhdGVfY291bnQrK10gPSBzOworCX0KKworCWlmIChzdGF0ZV9jb3VudCAhPSA0KSB7CisJCXN0YXRlX2NvdW50LS07CisJCWZvciAoOyBzdGF0ZV9jb3VudCA+PSAwOyBzdGF0ZV9jb3VudC0tKSB7CisJCQlrZnJlZShzdGF0ZS0+b3RoZXJfc3RhdGVzW3N0YXRlX2NvdW50XSk7CisJCQludW0gPSBhbGlfbXVsdGlfY2hhbm5lbHNfNV8xW3N0YXRlX2NvdW50XTsKKwkJCWFsaV9mcmVlX3BjbV9jaGFubmVsKGNhcmQsIG51bSk7CisJCX0KKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithbGlfc2F2ZV9yZWdzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgajsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MmNdID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJLy9hbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjBdID0gaW5sKFRSSURfUkVHKGNhcmQsVDREX1NUQVJUX0EpKTsgICAgCisJYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1sweDIxXSA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfU1RPUF9BKSk7CisKKwkvL2Rpc2FibGUgYWxsIElSUSBiaXRzCisJb3V0bChBTElfRElTQUJMRV9BTExfSVJRLCBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOworCisJZm9yIChpID0gMTsgaSA8IEFMSV9NSVhFUl9SRUdTOyBpKyspCisJCWFsaV9yZWdpc3RlcnMubWl4ZXJfcmVnc1tpXSA9IGFsaV9hYzk3X3JlYWQoY2FyZC0+YWM5N19jb2RlY1swXSwgCisJCQkJCQkJICAgIGkgKiAyKTsKKworCWZvciAoaSA9IDA7IGkgPCBBTElfR0xPQkFMX1JFR1M7IGkrKykgeworCQlpZiAoKGkgKiA0ID09IFQ0RF9NSVNDSU5UKSB8fCAoaSAqIDQgPT0gVDREX1NUT1BfQSkpCisJCQljb250aW51ZTsKKwkJYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1tpXSA9IGlubChUUklEX1JFRyhjYXJkLCBpICogNCkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBTElfQ0hBTk5FTFM7IGkrKykgeworCQlvdXRiKGksIFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJCWZvciAoaiA9IDA7IGogPCBBTElfQ0hBTk5FTF9SRUdTOyBqKyspCisJCQlhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSA9IGlubChUUklEX1JFRyhjYXJkLCAKKwkJCQkJCQkJCWogKiA0ICsgMHhlMCkpOworCX0KKworCS8vU3RvcCBhbGwgSFcgY2hhbm5lbAorCW91dGwoQUxJX1NUT1BfQUxMX0NIQU5ORUxTLCBUUklEX1JFRyhjYXJkLCBUNERfU1RPUF9BKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCithbGlfcmVzdG9yZV9yZWdzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgajsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAxOyBpIDwgQUxJX01JWEVSX1JFR1M7IGkrKykKKwkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgaSAqIDIsIAorCQkJICAgICAgIGFsaV9yZWdpc3RlcnMubWl4ZXJfcmVnc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspIHsKKwkJb3V0YihpLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOworCQlmb3IgKGogPSAwOyBqIDwgQUxJX0NIQU5ORUxfUkVHUzsgaisrKQorCQkJb3V0bChhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSwgCisJCQkgICAgIFRSSURfUkVHKGNhcmQsIGogKiA0ICsgMHhlMCkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBTElfR0xPQkFMX1JFR1M7IGkrKykgeworCQlpZiAoKGkgKiA0ID09IFQ0RF9NSVNDSU5UKSB8fCAoaSAqIDQgPT0gVDREX1NUT1BfQSkgfHwgCisJCSAgICAoaSAqIDQgPT0gVDREX1NUQVJUX0EpKQorCQkJY29udGludWU7CisJCW91dGwoYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1tpXSwgVFJJRF9SRUcoY2FyZCwgaSAqIDQpKTsKKwl9CisKKwkvL3N0YXJ0IEhXIGNoYW5uZWwKKwlvdXRsKGFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMF0sIFRSSURfUkVHKGNhcmQsIFQ0RF9TVEFSVF9BKSk7CisJLy9yZXN0b3JlIElSUSBlbmFibGUgYml0cworCW91dGwoYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1sweDJjXSwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludAordHJpZGVudF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCB1bnVzZWQpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCWFsaV9zYXZlX3JlZ3MoY2FyZCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0cmlkZW50X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgeworCQlhbGlfcmVzdG9yZV9yZWdzKGNhcmQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKgorYWxpX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CisJaW50IGlkeDsKKworCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKKworCWlmIChpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgJiAKKwkgICAgKEFMSV9TUERJRl9PVVRfQ0hfRU5BQkxFKSkgeworCQlpZHggPSBBTElfU1BESUZfT1VUX0NIQU5ORUw7CisJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CisJCQlzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW2lkeF07CisJCQliYW5rLT5iaXRtYXAgfD0gMSA8PCBpZHg7CisJCQljaGFubmVsLT5udW0gPSBpZHg7CisJCQlyZXR1cm4gY2hhbm5lbDsKKwkJfQorCX0KKworCWZvciAoaWR4ID0gQUxJX1BDTV9PVVRfQ0hBTk5FTF9GSVJTVDsgaWR4IDw9IEFMSV9QQ01fT1VUX0NIQU5ORUxfTEFTVDsgCisJICAgICBpZHgrKykgeworCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgeworCQkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOworCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OworCQkJY2hhbm5lbC0+bnVtID0gaWR4OworCQkJcmV0dXJuIGNoYW5uZWw7CisJCX0KKwl9CisKKwkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhbGlhYmxlICovCisjaWYgMCAKKwlwcmludGsoS0VSTl9FUlIgImFsaTogbm8gbW9yZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBBLlxuIik7CisjZW5kaWYgLyogMCAqLyAKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKgorYWxpX2FsbG9jX3JlY19wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rOworCWludCBpZHg7CisKKwlpZiAoaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgQUxJX1NQRElGX0lOX1NVUFBPUlQpCisJCWlkeCA9IEFMSV9TUERJRl9JTl9DSEFOTkVMOworCWVsc2UKKwkJaWR4ID0gQUxJX1BDTV9JTl9DSEFOTkVMOworCisJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOworCisJaWYgKCEoYmFuay0+Yml0bWFwICYgKDEgPDwgaWR4KSkpIHsKKwkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOworCQliYW5rLT5iaXRtYXAgfD0gMSA8PCBpZHg7CisJCWNoYW5uZWwtPm51bSA9IGlkeDsKKwkJcmV0dXJuIGNoYW5uZWw7CisJfQorCisJLyogbm8gZnJlZSByZWNvcmRhYmxlIGNoYW5uZWxzIGF2YWxpYWJsZSAqLworI2lmIDAgCisJcHJpbnRrKEtFUk5fRVJSICJhbGk6IG5vIHJlY29yZGFibGUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQS5cbiIpOworI2VuZGlmIC8qIDAgKi8gCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCithbGlfc2V0X3NwZGlmX291dF9yYXRlKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIGNoYXIgY2hfc3Rfc2VsOworCXVuc2lnbmVkIHNob3J0IHN0YXR1c19yYXRlOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSA0NDEwMDoKKwkJc3RhdHVzX3JhdGUgPSAwOworCQlicmVhazsKKwljYXNlIDMyMDAwOgorCQlzdGF0dXNfcmF0ZSA9IDB4MzAwOworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCWRlZmF1bHQ6CisJCXN0YXR1c19yYXRlID0gMHgyMDA7CisJCWJyZWFrOworCX0KKworCS8qIHNlbGVjdCBzcGRpZl9vdXQgKi8gCisJY2hfc3Rfc2VsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSkgJiBBTElfU1BESUZfT1VUX0NIX1NUQVRVUzsKKworCWNoX3N0X3NlbCB8PSAweDgwOwkvKiBzZWxlY3QgcmlnaHQgKi8gCisJb3V0YihjaF9zdF9zZWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CisJb3V0YihzdGF0dXNfcmF0ZSB8IDB4MjAsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDIpKTsKKworCWNoX3N0X3NlbCAmPSAofjB4ODApOwkvKiBzZWxlY3QgbGVmdCAqLyAKKwlvdXRiKGNoX3N0X3NlbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKwlvdXR3KHN0YXR1c19yYXRlIHwgMHgxMCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMikpOworfQorCitzdGF0aWMgdm9pZAorYWxpX2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJaW50IGksIGNoYW5uZWw7CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlOworCXUzMiBtYXNrLCBjaGFubmVsX21hc2s7CisKKwltYXNrID0gdHJpZGVudF9nZXRfaW50ZXJydXB0X21hc2soY2FyZCwgMCk7CisJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJaWYgKChzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQljaGFubmVsID0gc3RhdGUtPmRtYWJ1Zi5jaGFubmVsLT5udW07CisJCWlmICgoY2hhbm5lbF9tYXNrID0gMSA8PCBjaGFubmVsKSAmIG1hc2spIHsKKwkJCW1hc2sgJj0gfmNoYW5uZWxfbWFzazsKKwkJCXRyaWRlbnRfYWNrX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQsIGNoYW5uZWwpOworCQkJdWRlbGF5KDEwMCk7CisJCQlzdGF0ZS0+ZG1hYnVmLnVwZGF0ZV9mbGFnIHw9IEFMSV9BRERSRVNTX0lOVF9VUERBVEU7CisJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCQl9CisJfQorCWlmIChtYXNrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBOUl9IV19DSDsgaSsrKSB7CisJCQlpZiAobWFzayAmICgxIDw8IGkpKSB7CisJCQkJcHJpbnRrKCJhbGk6IHNwdXJpb3VzIGNoYW5uZWwgaXJxICVkLlxuIiwgaSk7CisJCQkJdHJpZGVudF9hY2tfY2hhbm5lbF9pbnRlcnJ1cHQoY2FyZCwgaSk7CisJCQkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIGkpOworCQkJCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgaSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIFVwZGF0aW5nIHRoZSB2YWx1ZXMgb2YgY291bnRlcnMgb2Ygb3RoZXJfc3RhdGVzJyBETUFzIHdpdGhvdXQgbG9jayAKK3Byb3RlY3Rpb24gaXMgbm8gaGFybSBiZWNhdXNlIGFsbCBETUFzIG9mIG11bHRpLWNoYW5uZWxzIGFuZCBpbnRlcnJ1cHQKK2RlcGVuZCBvbiBhIG1hc3RlciBzdGF0ZSdzIERNQSwgYW5kIGNoYW5naW5nIHRoZSBjb3VudGVycyBvZiB0aGUgbWFzdGVyCitzdGF0ZSBETUEgaXMgcHJvdGVjdGVkIGJ5IGEgc3BpbmxvY2suCisqLworc3RhdGljIGludAorYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIAorCSAgICAgIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwgCisJICAgICAgdW5zaWduZWQgaW50ICpzdGF0ZV9jbnQpCit7CisKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWZfdGVtcDsKKwljb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyID0gYnVmOworCXVuc2lnbmVkIHN3cHRyLCBvdGhlcl9kbWFfbnVtcywgc2FtcGxlX3M7CisJdW5zaWduZWQgaW50IGksIGxvb3A7CisKKwlvdGhlcl9kbWFfbnVtcyA9IDQ7CisJc2FtcGxlX3MgPSBzYW1wbGVfc2l6ZVtkbWFidWYtPmZtdF0gPj4gMTsKKwlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisKKwlpZiAoKGkgPSBzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50KSA+IDApIHsKKwkJaWYgKGkgPT0gMSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAorCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CisJCQlpLS07CisJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CisJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50Kys7CisJCX0gZWxzZQorCQkJaSA9IGkgLSAoc3RhdGUtPmNoYW5zX251bSAtIG90aGVyX2RtYV9udW1zKTsKKwkJZm9yICg7IChpIDwgb3RoZXJfZG1hX251bXMpICYmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKTsgaSsrKSB7CisJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CisJCX0KKwkJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA9PSAwKQorCQkJc3RhdGUtPm11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudCArPSBpOworCX0KKwlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgeworCQlsb29wID0gY250X2Zvcl9tdWx0aV9jaGFubmVsIC8gKHN0YXRlLT5jaGFuc19udW0gKiBzYW1wbGVfcyk7CisJCWZvciAoaSA9IDA7IGkgPCBsb29wOyBpKyspIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIAorCQkJCQkgICBzYW1wbGVfcyAqIDIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCQkgICAgc2FtcGxlX3MgKiAyLCAqY29weV9jb3VudCk7CisJCQkoKnN0YXRlX2NudCkgKz0gKHNhbXBsZV9zICogMik7CisKKwkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1ZjsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKKworCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAorCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOworCisJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWY7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CisKKwkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1ZjsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKKwkJfQorCisJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CisJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50ID0gY250X2Zvcl9tdWx0aV9jaGFubmVsIC8gc2FtcGxlX3M7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIHNhbXBsZV9zKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CisJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CisKKwkJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAorCQkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOworCQkJCSgqc3RhdGVfY250KSArPSBzYW1wbGVfczsKKworCQkJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CisJCQkJCWludCBkaWZmID0gc3RhdGUtPmNoYW5zX251bSAtIG90aGVyX2RtYV9udW1zOworCQkJCQlsb29wID0gc3RhdGUtPm11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudCAtIGRpZmY7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBsb29wOyBpKyspIHsKKwkJCQkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZjsKKwkJCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgCisJCQkJCQkJCSAgIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQkJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQorCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIAorCQkJCQkJCSAgICBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UKKwkJCXN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQgPSAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgb3RoZXJfZG1hX251bXM7IGkrKykgeworCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7CisJCWRtYWJ1Zl90ZW1wLT5zd3B0ciA9IGRtYWJ1Zl90ZW1wLT5zd3B0ciAlIGRtYWJ1Zl90ZW1wLT5kbWFzaXplOworCX0KKwlyZXR1cm4gKnN0YXRlX2NudDsKK30KKworc3RhdGljIHZvaWQKK2FsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCWludCBpOworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwlzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqczsKKwl1bnNpZ25lZCBvdGhlcl9zdGF0ZXNfY291bnQ7CisKKwlvdGhlcl9zdGF0ZXNfY291bnQgPSBzdGF0ZS0+Y2hhbnNfbnVtIC0gMjsgLyogZXhjZXB0IFBDTSBML1IgY2hhbm5lbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgb3RoZXJfc3RhdGVzX2NvdW50OyBpKyspIHsKKwkJcyA9IHN0YXRlLT5vdGhlcl9zdGF0ZXNbaV07CisJCWRlYWxsb2NfZG1hYnVmKCZzLT5kbWFidWYsIGNhcmQtPnBjaV9kZXYpOworCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwocy0+Y2FyZCwgcy0+ZG1hYnVmLmNoYW5uZWwtPm51bSk7CisJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHMtPmNhcmQsIHMtPmRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQljYXJkLT5zdGF0ZXNbcy0+dmlydF0gPSBOVUxMOworCQlrZnJlZShzKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlczsKKworc3RhdGljIGludAorYWxpX3dyaXRlX3Byb2Moc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyIGM7CisKKwlpZiAoY291bnQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGdldF91c2VyKGMsIGJ1ZmZlcikpCisJCXJldHVybiAtRUZBVUxUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICcwJzoKKwkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfUENNX1RPX1NQRElGX09VVCk7CisJCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChjYXJkLCBBTElfU1BESUZfT1VUX0NIQU5ORUwpOworCQlicmVhazsKKwljYXNlICcxJzoKKwkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfU1BESUZfT1VUX1RPX1NQRElGX09VVCB8IAorCQkJCSAgICBBTElfU1BESUZfT1VUX1BDTSk7CisJCWJyZWFrOworCWNhc2UgJzInOgorCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUIHwgCisJCQkJICAgIEFMSV9TUERJRl9PVVRfTk9OX1BDTSk7CisJCWJyZWFrOworCWNhc2UgJzMnOgorCQlhbGlfZGlzYWJsZV9zcGRpZl9pbihjYXJkKTsJLy9kZWZhdWx0CisJCWJyZWFrOworCWNhc2UgJzQnOgorCQlhbGlfc2V0dXBfc3BkaWZfaW4oY2FyZCk7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIE9TUyAvZGV2L21peGVyIGZpbGUgb3BlcmF0aW9uIG1ldGhvZHMgKi8KK3N0YXRpYyBpbnQKK3RyaWRlbnRfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGkgPSAwOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGRldnM7CisKKwlmb3IgKGNhcmQgPSBkZXZzOyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0KQorCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQorCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJiAKKwkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQkJZ290byBtYXRjaDsKKworCWlmICghY2FyZCkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisgICAgICBtYXRjaDoKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkLT5hYzk3X2NvZGVjW2ldOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50Cit0cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgCisJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmlkZW50X21peGVyX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IG5vX2xsc2VlaywKKwkuaW9jdGwgPSB0cmlkZW50X2lvY3RsX21peGRldiwKKwkub3BlbiA9IHRyaWRlbnRfb3Blbl9taXhkZXYsCit9OworCitzdGF0aWMgaW50CithbGlfcmVzZXRfNTQ1MShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgZHdWYWw7CisJdW5zaWduZWQgc2hvcnQgd0NvdW50LCB3UmVnOworCisJcGNpX2RldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCAKKwkJCQkgIHBjaV9kZXYpOworCWlmIChwY2lfZGV2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCAmZHdWYWwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg3YywgZHdWYWwgfCAweDA4MDAwMDAwKTsKKwl1ZGVsYXkoNTAwMCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsICZkd1ZhbCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCBkd1ZhbCAmIDB4ZjdmZmZmZmYpOworCXVkZWxheSg1MDAwKTsKKworCXBjaV9kZXYgPSBjYXJkLT5wY2lfZGV2OworCWlmIChwY2lfZGV2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCAmZHdWYWwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg0NCwgZHdWYWwgfCAweDAwMGMwMDAwKTsKKwl1ZGVsYXkoNTAwKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgMHg0NCwgJmR3VmFsKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4NDQsIGR3VmFsICYgMHhmZmZiZmZmZik7CisJdWRlbGF5KDUwMDApOworCisJLyogVE9ETzogcmVjb2duaXplIGlmIHdlIGhhdmUgYSBQTSBjYXBhYmxlIGNvZGVjIGFuZCBvbmx5IGRvIHRoaXMgKi8KKwkvKiBpZiB0aGUgY29kZWMgaXMgUE0gY2FwYWJsZSAqLworCXdDb3VudCA9IDIwMDA7CisJd2hpbGUgKHdDb3VudC0tKSB7CisJCXdSZWcgPSBhbGlfYWM5N19nZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkJaWYgKCh3UmVnICYgMHgwMDBmKSA9PSAweDAwMGYpCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDUwMDApOworCX0KKwkvKiBUaGlzIGlzIG5vbiBmYXRhbCBpZiB5b3UgaGF2ZSBhIG5vbiBQTSBjYXBhYmxlIGNvZGVjLi4gKi8KKwlyZXR1cm4gMDsKK30KKworLyogQUM5NyBjb2RlYyBpbml0aWFsaXNhdGlvbi4gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0Cit0cmlkZW50X2FjOTdfaW5pdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCWludCBudW1fYWM5NyA9IDA7CisJdW5zaWduZWQgbG9uZyByZWFkeV8ybmQgPSAwOworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYzsKKwlpbnQgaSA9IDA7CisKKwkvKiBpbml0aWFsaXplIGNvbnRyb2xsZXIgc2lkZSBvZiBBQyBsaW5rLCBhbmQgZmluZCBvdXQgaWYgc2Vjb25kYXJ5IGNvZGVzCisJICAgcmVhbGx5IGV4aXN0ICovCisJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CisJCWlmIChhbGlfcmVzZXRfNTQ1MShjYXJkKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50X2FjOTdfaW5pdDogZXJyb3IgIgorCQkJICAgICAgICJyZXNldHRpbmcgNTQ1MS5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW91dGwoMHg4MDAwMDAwMSwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJCW91dGwoMHgwMDAwMDAwMCwgVFJJRF9SRUcoY2FyZCwgVDREX0FJTlRFTl9BKSk7CisJCW91dGwoMHhmZmZmZmZmZiwgVFJJRF9SRUcoY2FyZCwgVDREX0FJTlRfQSkpOworCQlvdXRsKDB4MDAwMDAwMDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NVVNJQ1ZPTF9XQVZFVk9MKSk7CisJCW91dGIoMHgxMCwgVFJJRF9SRUcoY2FyZCwgQUxJX01QVVIyKSk7CisJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKKwkJcmVhZHlfMm5kICY9IDB4M2ZmZjsKKwkJb3V0bChyZWFkeV8ybmQgfCBQQ01PVVQgfCAweDgwMDAsIFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOworCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CisJCXJlYWR5XzJuZCAmPSBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWTsKKwkJaWYgKGNhcmQtPnJldmlzaW9uIDwgQUxJXzU0NTFfVjAyKQorCQkJcmVhZHlfMm5kID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CisJCS8qIGRpc2FibGUgQUM5NyBHUElPIGludGVycnVwdCAqLworCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOworCQkvKiB3aGVuIHBvd2VyIHVwIHRoZSBBQyBsaW5rIGlzIGluIGNvbGQgcmVzZXQgbW9kZSBzbyBzdG9wIGl0ICovCisJCW91dGwoUENNT1VUIHwgU1VSUk9VVCB8IENFTlRFUk9VVCB8IExGRU9VVCB8IFNFQ09OREFSWV9JRCwgCisJCSAgICAgVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOworCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKi8gCisJCS8qIChlc3BlY2lhbGx5IHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb2RlYykgKi8KKwkJdWRlbGF5KDIwMDApOworCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOworCQlyZWFkeV8ybmQgJj0gU0lfQUM5N19TRUNPTkRBUllfUkVBRFk7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKKwkJLyogcGxheWJhY2sgb24gKi8KKwkJb3V0bChEWF9BQzk3X1BMQVlCQUNLLCBUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgorCQkvKiBlbmFibGUgQUM5NyBPdXRwdXQgU2xvdCAzLDQgKFBDTSBMZWZ0L1JpZ2h0IFBsYXliYWNrKSAqLworCQlvdXRsKE5YX0FDOTdfUENNX09VVFBVVCwgVFJJRF9SRUcoY2FyZCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSk7CisJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBOWF9BQ1IwX0FDOTdfQ09NX1NUQVQpKTsKKwkJcmVhZHlfMm5kICY9IE5YX0FDOTdfU0VDT05EQVJZX1JFQURZOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CisJCS8qIGRpc2FibGUgQUM5NyBHUElPIGludGVycnVwdCAqLworCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOworCQkvKiB3aGVuIHBvd2VyIHVwLCB0aGUgQUMgbGluayBpcyBpbiBjb2xkIHJlc2V0IG1vZGUsIHNvIHN0b3AgaXQgKi8KKwkJb3V0bChQQ01PVVQgfCBTVVJST1VUIHwgQ0VOVEVST1VUIHwgTEZFT1VULCAKKwkJICAgICBUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CisJCS8qIGl0IHRha2UgYSBsb25nIHRpbWUgdG8gcmVjb3ZlciBmcm9tIGEgY29sZCByZXNldCAoZXNwZWNpYWxseSAqLyAKKwkJLyogd2hlbiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIGNvZGVjKSAqLworCQl1ZGVsYXkoMjAwMCk7CisJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CisJCXJlYWR5XzJuZCAmPSBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWTsKKwkJYnJlYWs7CisJfQorCisJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgeworCQlpZiAoKGNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogaW5pdGlhbGl6ZSBzb21lIGJhc2ljIGNvZGVjIGluZm9ybWF0aW9uLCBvdGhlciBmaWVsZHMgKi8gCisJCS8qIHdpbGwgYmUgZmlsbGVkIGluIGFjOTdfcHJvYmVfY29kZWMgKi8KKwkJY29kZWMtPnByaXZhdGVfZGF0YSA9IGNhcmQ7CisJCWNvZGVjLT5pZCA9IG51bV9hYzk3OworCisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgeworCQkJY29kZWMtPmNvZGVjX3JlYWQgPSBhbGlfYWM5N19yZWFkOworCQkJY29kZWMtPmNvZGVjX3dyaXRlID0gYWxpX2FjOTdfd3JpdGU7CisJCX0gZWxzZSB7CisJCQljb2RlYy0+Y29kZWNfcmVhZCA9IHRyaWRlbnRfYWM5N19nZXQ7CisJCQljb2RlYy0+Y29kZWNfd3JpdGUgPSB0cmlkZW50X2FjOTdfc2V0OworCQl9CisKKwkJaWYgKGFjOTdfcHJvYmVfY29kZWMoY29kZWMpID09IDApCisJCQlicmVhazsKKworCQljb2RlYy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJnRyaWRlbnRfbWl4ZXJfZm9wcywgLTEpOworCQlpZiAoY29kZWMtPmRldl9taXhlciA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogY291bGRuJ3QgcmVnaXN0ZXIgbWl4ZXIhXG4iKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisJCQlicmVhazsKKwkJfQorCisJCWNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID0gY29kZWM7CisKKwkJLyogaWYgdGhlcmUgaXMgbm8gc2Vjb25kYXJ5IGNvZGVjIGF0IGFsbCwgZG9uJ3QgcHJvYmUgYW55IG1vcmUgKi8KKwkJaWYgKCFyZWFkeV8ybmQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKKwkJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgeworCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQkJCXUxNiByZWcgPSBhbGlfYWM5N19nZXQoY2FyZCwgbnVtX2FjOTcsIGkgKiAyKTsKKwkJCQljYXJkLT5taXhlcl9yZWdzW2ldW251bV9hYzk3XSA9IHJlZzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbnVtX2FjOTcgKyAxOworfQorCisvKiBHYW1lcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBjYXJkcyBBREMgZ2FtZXBvcnQgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK3RyaWRlbnRfZ2FtZV9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7CisJcmV0dXJuIGluYihUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9MRUcpKTsKK30KKworc3RhdGljIHZvaWQKK3RyaWRlbnRfZ2FtZV90cmlnZ2VyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7CisJb3V0YigweGZmLCBUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9MRUcpKTsKK30KKworc3RhdGljIGludAordHJpZGVudF9nYW1lX2Nvb2tlZF9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGludCAqYXhlcywgaW50ICpidXR0b25zKQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBnYW1lcG9ydC0+cG9ydF9kYXRhOworCWludCBpOworCisJKmJ1dHRvbnMgPSAofmluYihUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9MRUcpKSA+PiA0KSAmIDB4ZjsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJYXhlc1tpXSA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9BWEQpICsgaSAqIHNpemVvZiAodTE2KSk7CisJCWlmIChheGVzW2ldID09IDB4ZmZmZikKKwkJCWF4ZXNbaV0gPSAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordHJpZGVudF9nYW1lX29wZW4oc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50IG1vZGUpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEdBTUVQT1JUX01PREVfQ09PS0VEOgorCQlvdXRiKDB4ODAsIFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0NSKSk7CisJCW1zbGVlcCgyMCk7CisJCXJldHVybiAwOworCWNhc2UgR0FNRVBPUlRfTU9ERV9SQVc6CisJCW91dGIoMHgwMCwgVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfQ1IpKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAordHJpZGVudF9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CisKKwljYXJkLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOworCWlmICghZ3ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIlRyaWRlbnQgNERXYXZlIik7CisJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CisJZ3AtPnJlYWQgPSB0cmlkZW50X2dhbWVfcmVhZDsKKwlncC0+dHJpZ2dlciA9IHRyaWRlbnRfZ2FtZV90cmlnZ2VyOworCWdwLT5jb29rZWRfcmVhZCA9IHRyaWRlbnRfZ2FtZV9jb29rZWRfcmVhZDsKKwlncC0+b3BlbiA9IHRyaWRlbnRfZ2FtZV9vcGVuOworCWdwLT5mdXp6ID0gNjQ7CisJZ3AtPnBvcnRfZGF0YSA9IGNhcmQ7CisKKwlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKKworCXJldHVybiAwOworfQorCisvKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyICovIAorLyogbm93LCB0aGV5IGFyZSBkZWZlcmVkIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSAqLyAKKy8qIG9wZW4vcmVhZC93cml0ZS9pb2N0bC9tbWFwKSAqLworc3RhdGljIGludCBfX2RldmluaXQKK3RyaWRlbnRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsKKwl1OCBiaXRzOworCXU4IHJldmlzaW9uOworCWludCBpID0gMDsKKwl1MTYgdGVtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9tMTUzMyA9IE5VTEw7CisJaW50IHJjID0gLUVOT0RFVjsKKwl1NjQgZG1hX21hc2s7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCisJCWdvdG8gb3V0OworCisJaWYgKHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKQorCQlkbWFfbWFzayA9IEFMSV9ETUFfTUFTSzsKKwllbHNlCisJCWRtYV9tYXNrID0gVFJJREVOVF9ETUFfTUFTSzsKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCBkbWFfbWFzaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCIgCisJCSAgICAgICAiICVzIFBDSSBidXNtYXN0ZXIgRE1BXG4iLCAKKwkJICAgICAgIHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxID8gCisJCSAgICAgICAiMzItYml0IiA6ICIzMC1iaXQiKTsKKwkJZ290byBvdXQ7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldmlzaW9uKTsKKworCWlmIChwY2lfaWQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKQorCQlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMSk7CisJZWxzZQorCQlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgMjU2LCBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdKSkgeworCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IGNhbid0IGFsbG9jYXRlIEkvTyBzcGFjZSBhdCAiCisJCSAgICAgICAiMHglNC40bHhcbiIsIGlvYmFzZSk7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gLUVOT01FTTsKKwlpZiAoKGNhcmQgPSBrbWFsbG9jKHNpemVvZigqY2FyZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogb3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mICgqY2FyZCkpOworCisJaW5pdF90aW1lcigmY2FyZC0+dGltZXIpOworCWNhcmQtPmlvYmFzZSA9IGlvYmFzZTsKKwljYXJkLT5wY2lfZGV2ID0gcGNpX2RldjsKKwljYXJkLT5wY2lfaWQgPSBwY2lfaWQtPmRldmljZTsKKwljYXJkLT5yZXZpc2lvbiA9IHJldmlzaW9uOworCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKKwljYXJkLT5uZXh0ID0gZGV2czsKKwljYXJkLT5tYWdpYyA9IFRSSURFTlRfQ0FSRF9NQUdJQzsKKwljYXJkLT5iYW5rc1tCQU5LX0FdLmFkZHJlc3NlcyA9ICZiYW5rX2FfYWRkcnM7CisJY2FyZC0+YmFua3NbQkFOS19BXS5iaXRtYXAgPSAwVUw7CisJY2FyZC0+YmFua3NbQkFOS19CXS5hZGRyZXNzZXMgPSAmYmFua19iX2FkZHJzOworCWNhcmQtPmJhbmtzW0JBTktfQl0uYml0bWFwID0gMFVMOworCisJaW5pdF9NVVRFWCgmY2FyZC0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZjYXJkLT50aW1lcik7CisKKwlkZXZzID0gY2FyZDsKKworCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAidHJpZGVudDogJXMgZm91bmQgYXQgSU8gMHglMDRseCwgSVJRICVkXG4iLCAKKwkgICAgICAgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZC0+aW9iYXNlLCBjYXJkLT5pcnEpOworCisJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCS8qIEFMaSBjaGFubmVsIE1hbmFnZW1lbnQgKi8KKwkJY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBhbGlfYWxsb2NfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IGFsaV9hbGxvY19yZWNfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBhbGlfZnJlZV9wY21fY2hhbm5lbDsKKworCQljYXJkLT5hZGRyZXNzX2ludGVycnVwdCA9IGFsaV9hZGRyZXNzX2ludGVycnVwdDsKKworCQkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgZm9yIHNwZGlmIGluICovCisJCWNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID0gMDsKKwkJY2FyZC0+cmVjX2NoYW5uZWxfdXNlX2NvdW50ID0gMDsKKworCQkvKiBBTGkgU1BESUYgT1VUIGZ1bmN0aW9uICovCisJCWlmIChjYXJkLT5yZXZpc2lvbiA9PSBBTElfNTQ1MV9WMDIpIHsKKwkJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1BDTV9UT19TUERJRl9PVVQpOworCQkJcmVzID0gY3JlYXRlX3Byb2NfZW50cnkoIkFMaTU0NTEiLCAwLCBOVUxMKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlyZXMtPndyaXRlX3Byb2MgPSBhbGlfd3JpdGVfcHJvYzsKKwkJCQlyZXMtPmRhdGEgPSBjYXJkOworCQkJfQorCQl9CisKKwkJLyogQWRkIEgvVyBWb2x1bWUgQ29udHJvbCBCeSBNYXR0IFd1IEp1bC4gMDYsIDIwMDEgKi8KKwkJY2FyZC0+aHd2b2xjdGwgPSAwOworCQlwY2lfZGV2X20xNTMzID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIAorCQkJCQkJUENJX0RFVklDRV9JRF9BTF9NMTUzMywgCisJCQkJCQlwY2lfZGV2X20xNTMzKTsKKwkJcmMgPSAtRU5PREVWOworCQlpZiAocGNpX2Rldl9tMTUzMyA9PSBOVUxMKQorCQkJZ290byBvdXRfcHJvY19mczsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2Rldl9tMTUzMywgMHg2MywgJmJpdHMpOworCQlpZiAoYml0cyAmICgxIDw8IDUpKQorCQkJY2FyZC0+aHd2b2xjdGwgPSAxOworCQlpZiAoY2FyZC0+aHd2b2xjdGwpIHsKKwkJCS8qIENsZWFyIG0xNTMzIHBjaSBjZmcgNzhoIGJpdCAzMCB0byB6ZXJvLCB3aGljaCBtYWtlcworCQkJICAgR1BJTzExLzEyLzEzIHdvcmsgYXMgQUNHUF9VUC9ET1dOL01VVEUuICovCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2X20xNTMzLCAweDdiLCAmYml0cyk7CisJCQliaXRzICY9IDB4YmY7CS8qY2xlYXIgYml0IDYgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2X20xNTMzLCAweDdiLCBiaXRzKTsKKwkJfQorCX0gZWxzZSBpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApIHsKKwkJY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBjeWJlcl9hbGxvY19wY21fY2hhbm5lbDsKKwkJY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsID0gY3liZXJfYWxsb2NfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBjeWJlcl9mcmVlX3BjbV9jaGFubmVsOworCQljYXJkLT5hZGRyZXNzX2ludGVycnVwdCA9IGN5YmVyX2FkZHJlc3NfaW50ZXJydXB0OworCQljeWJlcl9pbml0X3JpdHVhbChjYXJkKTsKKwl9IGVsc2UgeworCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IHRyaWRlbnRfYWxsb2NfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IHRyaWRlbnRfYWxsb2NfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSB0cmlkZW50X2ZyZWVfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmFkZHJlc3NfaW50ZXJydXB0ID0gdHJpZGVudF9hZGRyZXNzX2ludGVycnVwdDsKKwl9CisKKwkvKiBjbGFpbSBvdXIgaXJxICovCisJcmMgPSAtRU5PREVWOworCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZ0cmlkZW50X2ludGVycnVwdCwgU0FfU0hJUlEsIAorCQkJY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkXG4iLCAKKwkJICAgICAgIGNhcmQtPmlycSk7CisJCWdvdG8gb3V0X3Byb2NfZnM7CisJfQorCS8qIHJlZ2lzdGVyIC9kZXYvZHNwICovCisJaWYgKChjYXJkLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJnRyaWRlbnRfYXVkaW9fZm9wcywgLTEpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjb3VsZG4ndCByZWdpc3RlciBEU1AgZGV2aWNlIVxuIik7CisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCX0KKwljYXJkLT5taXhlcl9yZWdzX3JlYWR5ID0gMDsKKwkvKiBpbml0aWFsaXplIEFDOTcgY29kZWMgYW5kIHJlZ2lzdGVyIC9kZXYvbWl4ZXIgKi8KKwlpZiAodHJpZGVudF9hYzk3X2luaXQoY2FyZCkgPD0gMCkgeworCQkvKiB1bnJlZ2lzdGVyIGF1ZGlvIGRldmljZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykgeworCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCkgeworCQkJCXN0cnVjdCBhYzk3X2NvZGVjKiBjb2RlYyA9IGNhcmQtPmFjOTdfY29kZWNbaV07CisJCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjb2RlYy0+ZGV2X21peGVyKTsKKwkJCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOworCQkJfQorCQl9CisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfc291bmRfZHNwOworCX0KKwljYXJkLT5taXhlcl9yZWdzX3JlYWR5ID0gMTsKKwlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NVVNJQ1ZPTF9XQVZFVk9MKSk7CisKKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKKwkJLyogQWRkIEgvVyBWb2x1bWUgQ29udHJvbCBCeSBNYXR0IFd1IEp1bC4gMDYsIDIwMDEgKi8KKwkJaWYgKGNhcmQtPmh3dm9sY3RsKSB7CisJCQkvKiBFbmFibGUgR1BJTyBJUlEgKE1JU0NJTlQgYml0IDE4aCkgKi8KKwkJCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7CisJCQl0ZW1wIHw9IDB4MDAwNDsKKwkJCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7CisKKwkJCS8qIEVuYWJsZSBIL1cgVm9sdW1lIENvbnRyb2wgR0xPVkFMIENPTlRST0wgYml0IDAgKi8KKwkJCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJCQl0ZW1wIHw9IDB4MDAwMTsKKwkJCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisKKwkJfQorCQlpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKQorCQkJYWxpX2Nsb3NlX211bHRpX2NoYW5uZWxzKCk7CisJCS8qIGVkaXRlZCBieSBITVNFTyBmb3IgR1Qgc291bmQgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19BTFBIQV9OQVVUSUxVUykgfHwgZGVmaW5lZChDT05GSUdfQUxQSEFfR0VORVJJQykKKwkJeworCQkJdTE2IGFjOTdfZGF0YTsKKwkJCWV4dGVybiBzdHJ1Y3QgaHdycGJfc3RydWN0ICpod3JwYjsKKworCQkJaWYgKChod3JwYi0+c3lzX3R5cGUpID09IDIwMSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6IFJ1bm5pbmcgb24gQWxwaGEgc3lzdGVtICIKKwkJCQkgICAgICAgInR5cGUgTmF1dGlsdXNcbiIpOworCQkJCWFjOTdfZGF0YSA9IGFsaV9hYzk3X2dldChjYXJkLCAwLCBBQzk3X1BPV0VSX0NPTlRST0wpOworCQkJCWFsaV9hYzk3X3NldChjYXJkLCAwLCBBQzk3X1BPV0VSX0NPTlRST0wsIAorCQkJCQkgICAgIGFjOTdfZGF0YSB8IEFMSV9FQVBEX1BPV0VSX0RPV04pOworCQkJfQorCQl9CisjZW5kaWYJCQkJLyogQ09ORklHX0FMUEhBX05BVVRJTFVTIHx8IENPTkZJR19BTFBIQV9HRU5FUklDICovCisJCS8qIGVkaXRlZCBieSBITVNFTyBmb3IgR1Qgc291bmQgKi8KKwl9CisJcmMgPSAwOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBjYXJkKTsKKworCS8qIEVuYWJsZSBBZGRyZXNzIEVuZ2luZSBJbnRlcnJ1cHRzICovCisJdHJpZGVudF9lbmFibGVfbG9vcF9pbnRlcnJ1cHRzKGNhcmQpOworCisJLyogUmVnaXN0ZXIgZ2FtZXBvcnQgKi8KKwl0cmlkZW50X3JlZ2lzdGVyX2dhbWVwb3J0KGNhcmQpOworCitvdXQ6CisJcmV0dXJuIHJjOworCitvdXRfdW5yZWdpc3Rlcl9zb3VuZF9kc3A6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworb3V0X3Byb2NfZnM6CisJaWYgKHJlcykgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiQUxpNTQ1MSIsIE5VTEwpOworCQlyZXMgPSBOVUxMOworCX0KKwlrZnJlZShjYXJkKTsKKwlkZXZzID0gTlVMTDsKK291dF9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIDI1Nik7CisJcmV0dXJuIHJjOyAKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0Cit0cmlkZW50X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCisJLyoKKwkgKiAgICAgIEtpbGwgcnVubmluZyB0aW1lcnMgYmVmb3JlIHVubG9hZC4gV2UgY2FuJ3QgaGF2ZSB0aGVtCisJICogICAgICBnb2luZyBvZmYgYWZ0ZXIgcm1tb2QhCisJICovCisJaWYgKGNhcmQtPmh3dm9sY3RsKQorCQlkZWxfdGltZXJfc3luYygmY2FyZC0+dGltZXIpOworCisJLyogQUxpIFMvUERJRiBhbmQgUG93ZXIgTWFuYWdlbWVudCAqLworCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgeworCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9QQ01fVE9fU1BESUZfT1VUKTsKKwkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGNhcmQsIEFMSV9TUERJRl9PVVRfQ0hBTk5FTCk7CisJCWFsaV9kaXNhYmxlX3NwZGlmX2luKGNhcmQpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiQUxpNTQ1MSIsIE5VTEwpOworCX0KKworCS8qIFVucmVnaXN0ZXIgZ2FtZXBvcnQgKi8KKwlpZiAoY2FyZC0+Z2FtZXBvcnQpCisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChjYXJkLT5nYW1lcG9ydCk7CisKKwkvKiBLaWxsIGludGVycnVwdHMsIGFuZCBTUC9ESUYgKi8KKwl0cmlkZW50X2Rpc2FibGVfbG9vcF9pbnRlcnJ1cHRzKGNhcmQpOworCisJLyogZnJlZSBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2KTsKKworCS8qIHVucmVnaXN0ZXIgYXVkaW8gZGV2aWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCisJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKKwkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2ldKTsKKwkJfQorCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7CisKKwlrZnJlZShjYXJkKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxhbiBDb3gsIEFhcm9uIEhvbHR6bWFuLCBPbGxpZSBMaG8sIENoaW5nIExpbmcgTGVlLCBNdWxpIEJlbi1ZZWh1ZGEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVHJpZGVudCA0RFdhdmUvU2lTIDcwMTgvQUxpIDU0NTEgYW5kIFR2aWEvSUdTVCBDeWJlclBybzUwNTAgUENJICIKKwkJICAgIkF1ZGlvIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIFRSSURFTlRfTU9EVUxFX05BTUUgInRyaWRlbnQiCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0cmlkZW50X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBUUklERU5UX01PRFVMRV9OQU1FLAorCS5pZF90YWJsZSA9IHRyaWRlbnRfcGNpX3RibCwKKwkucHJvYmUgPSB0cmlkZW50X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cmlkZW50X3JlbW92ZSksCisJLnN1c3BlbmQgPSB0cmlkZW50X3N1c3BlbmQsCisJLnJlc3VtZSA9IHRyaWRlbnRfcmVzdW1lCit9OworCitzdGF0aWMgaW50IF9faW5pdAordHJpZGVudF9pbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlRyaWRlbnQgNERXYXZlL1NpUyA3MDE4L0FMaSA1NDUxLFR2aWEgQ3liZXJQcm8gIiAKKwkgICAgICAgIjUwNTAgUENJIEF1ZGlvLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIgCisJICAgICAgIF9fREFURV9fICJcbiIpOworCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRyaWRlbnRfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAordHJpZGVudF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdHJpZGVudF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodHJpZGVudF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh0cmlkZW50X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy90cmlkZW50LmggYi9zb3VuZC9vc3MvdHJpZGVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTNiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvdHJpZGVudC5oCkBAIC0wLDAgKzEsMzU4IEBACisjaWZuZGVmIF9fVFJJRDREV0FWRV9ICisjZGVmaW5lIF9fVFJJRDREV0FWRV9ICisKKy8qCisgKiAgYXVkaW9AdHJpZGVudG1pY3JvLmNvbQorICogIEZyaSBGZWIgMTkgMTU6NTU6MjggTVNUIDE5OTkKKyAqICBEZWZpbml0aW9ucyBmb3IgVHJpZGVudCA0RFdhdmUgRFgvTlggY2hpcHMKKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisvKiBQQ0kgdmVuZG9yIGFuZCBkZXZpY2UgSUQgKi8gCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfVFJJREVOVAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RSSURFTlQJCTB4MTAyMworI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9TSQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJCQkJMHgxMDM5CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0FMSQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FMSQkJCTB4MTBiOQorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYCTB4MjAwMAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YCTB4MjAwMQorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV83MDE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzAxOAkJMHg3MDE4CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0FMSV81NDUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEJCTB4NTQ1MQorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9BTElfMTUzMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMSV8xNTMzCQkweDE1MzMKKyNlbmRpZgorCisjZGVmaW5lIENIQU5ORUxfUkVHUwk1CisjZGVmaW5lIENIQU5ORUxfU1RBUlQJMHhlMCAgIC8vIFRoZSBmaXJzdCBieXRlcyBvZiB0aGUgY29udGlndW91cyByZWdpc3RlciBzcGFjZS4KKworI2RlZmluZSBCQU5LX0EgCQkwCisjZGVmaW5lIEJBTktfQiAJCTEKKyNkZWZpbmUgTlJfQkFOS1MJCTIKKworI2RlZmluZSBUUklERU5UX0ZNVF9TVEVSRU8gICAgIDB4MDEKKyNkZWZpbmUgVFJJREVOVF9GTVRfMTZCSVQgICAgICAweDAyCisjZGVmaW5lIFRSSURFTlRfRk1UX01BU0sgICAgICAgMHgwMworCisjZGVmaW5lIERBQ19SVU5OSU5HCTB4MDEKKyNkZWZpbmUgQURDX1JVTk5JTkcJMHgwMgorCisvKiBSZWdpc3RlciBBZGRyZXNzZXMgKi8KKworLyogb3BlcmF0aW9uYWwgcmVnaXN0ZXJzIGNvbW1vbiB0byBEWCwgTlgsIDcwMTggKi8KK2VudW0gdHJpZGVudF9vcF9yZWdpc3RlcnMgeworCVQ0RF9HQU1FX0NSCT0gMHgzMCwgVDREX0dBTUVfTEVHCT0gMHgzMSwKKwlUNERfR0FNRV9BWEQJPSAweDM0LAorCVQ0RF9SRUNfQ0gJPSAweDcwLAorCVQ0RF9TVEFSVF9BICAgICA9IDB4ODAsIFQ0RF9TVE9QX0EgICAgICA9IDB4ODQsCisJVDREX0RMWV9BICAgICAgID0gMHg4OCwgVDREX1NJR05fQ1NPX0EgID0gMHg4YywKKwlUNERfQ1NQRl9BICAgICAgPSAweDkwLCBUNERfQ0VCQ19BICAgICAgPSAweDk0LAorCVQ0RF9BSU5UX0EgICAgICA9IDB4OTgsIFQ0RF9FSU5UX0EJPSAweDljLAorCVQ0RF9MRk9fR0NfQ0lSCT0gMHhhMCwgVDREX0FJTlRFTl9BICAgID0gMHhhNCwKKwlUNERfTVVTSUNWT0xfV0FWRVZPTCA9IDB4YTgsIFQ0RF9TQkRFTFRBX0RFTFRBX1IgPSAweGFjLAorCVQ0RF9NSVNDSU5UCT0gMHhiMCwgVDREX1NUQVJUX0IgICAgID0gMHhiNCwKKwlUNERfU1RPUF9CICAgICAgPSAweGI4LCBUNERfQ1NQRl9CCT0gMHhiYywKKwlUNERfU0JCTF9TQkNMCT0gMHhjMCwgVDREX1NCQ1RSTF9TQkUyUl9TQkREICAgID0gMHhjNCwKKwlUNERfU1RJTUVSCT0gMHhjOCwgVDREX0xGT19CX0kyU19ERUxUQSAgICAgID0gMHhjYywKKwlUNERfQUlOVF9CCT0gMHhkOCwgVDREX0FJTlRFTl9CCT0gMHhkYywKKwlBTElfTVBVUjIJPSAweDIyLAlBTElfR1BJTwk9IDB4N2MsCisJQUxJX0VCVUYxID0gMHhmNCwKKwlBTElfRUJVRjIgPSAweGY4Cit9OworCitlbnVtIGFsaV9vcF9yZWdpc3RlcnMgeworCUFMSV9TQ1RSTAkJPSAweDQ4LAorCUFMSV9HTE9CQUxfQ09OVFJPTAk9IDB4ZDQsCisJQUxJX1NUSU1FUgkJPSAweGM4LAorCUFMSV9TUERJRl9DUwkJPSAweDcwLAorCUFMSV9TUERJRl9DVFJMCQk9IDB4NzQKK307CisKK2VudW0gYWxpX3JlZ2lzdGVyc19udW1iZXIgeworCUFMSV9HTE9CQUxfUkVHUwkJPSA1NiwKKwlBTElfQ0hBTk5FTF9SRUdTCT0gOCwKKwlBTElfTUlYRVJfUkVHUwkJPSAyMAorfTsKKworZW51bSBhbGlfc2N0cmxfY29udHJvbF9iaXQgeworCUFMSV9TUERJRl9PVVRfRU5BQkxFCT0gMHgyMAorfTsKKworZW51bSBhbGlfZ2xvYmFsX2NvbnRyb2xfYml0IHsKKwlBTElfU1BESUZfT1VUX1NFTF9QQ00JPSAweDAwMDAwNDAwLAorCUFMSV9TUERJRl9JTl9TVVBQT1JUCT0gMHgwMDAwMDgwMCwKKwlBTElfU1BESUZfT1VUX0NIX0VOQUJMRQk9IDB4MDAwMDgwMDAsCisJQUxJX1NQRElGX0lOX0NIX0VOQUJMRQk9IDB4MDAwODAwMDAsCisJQUxJX1BDTV9JTl9ESVNBQkxFCT0gMHg3ZmZmZmZmZiwKKwlBTElfUENNX0lOX0VOQUJMRQk9IDB4ODAwMDAwMDAsCisJQUxJX1NQRElGX0lOX0NIX0RJU0FCTEUJPSAweGZmZjdmZmZmLAorCUFMSV9TUERJRl9PVVRfQ0hfRElTQUJMRSA9IDB4ZmZmZjdmZmYsCisJQUxJX1NQRElGX09VVF9TRUxfU1BESUYJPSAweGZmZmZmYmZmCisJCit9OworCitlbnVtIGFsaV9zcGRpZl9jb250cm9sX2JpdCB7CisJQUxJX1NQRElGX0lOX0ZVTkNfRU5BQkxFCT0gMHgwMiwKKwlBTElfU1BESUZfSU5fQ0hfU1RBVFVTCQk9IDB4NDAsCisJQUxJX1NQRElGX09VVF9DSF9TVEFUVVMJCT0gMHhiZgorCQorfTsKKworZW51bSBhbGlfY29udHJvbF9hbGwgeworCUFMSV9ESVNBQkxFX0FMTF9JUlEJPSAwLAorCUFMSV9DSEFOTkVMUwkJPSAzMiwKKwlBTElfU1RPUF9BTExfQ0hBTk5FTFMJPSAweGZmZmZmZmZmLAorCUFMSV9NVUxUSV9DSEFOTkVMU19TVEFSVF9TVE9QCT0gMHgwNzgwMDAwMAorfTsKKworZW51bSBhbGlfRU1PRF9jb250cm9sX2JpdCB7CisJQUxJX0VNT0RfREVDCT0gMHgwMDAwMDAwMCwKKwlBTElfRU1PRF9JTkMJPSAweDEwMDAwMDAwLAorCUFMSV9FTU9EX0RlbGF5CT0gMHgyMDAwMDAwMCwKKwlBTElfRU1PRF9TdGlsbAk9IDB4MzAwMDAwMDAKK307CisKK2VudW0gYWxpX3BjbV9pbl9jaGFubmVsX251bSB7CisJQUxJX05PUk1BTF9DSEFOTkVMCT0gMCwKKwlBTElfU1BESUZfT1VUX0NIQU5ORUwJPSAxNSwKKwlBTElfU1BESUZfSU5fQ0hBTk5FTCAgICA9IDE5LAorCUFMSV9MRUZfQ0hBTk5FTAkJPSAyMywKKwlBTElfQ0VOVEVSX0NIQU5ORUwJPSAyNCwKKwlBTElfU1VSUl9SSUdIVF9DSEFOTkVMCT0gMjUsCisJQUxJX1NVUlJfTEVGVF9DSEFOTkVMCT0gMjYsCisJQUxJX1BDTV9JTl9DSEFOTkVMCT0gMzEKK307CisKK2VudW0gYWxpX3BjbV9vdXRfY2hhbm5lbF9udW0geworCUFMSV9QQ01fT1VUX0NIQU5ORUxfRklSU1QgPSAwLAorCUFMSV9QQ01fT1VUX0NIQU5ORUxfTEFTVCA9IDMxCit9OworCitlbnVtIGFsaV9hYzk3X3Bvd2VyX2NvbnRyb2xfYml0IHsKKwlBTElfRUFQRF9QT1dFUl9ET1dOCT0gMHg4MDAwCit9OworCitlbnVtIGFsaV91cGRhdGVfcHRyX2ZsYWdzIHsKKwlBTElfQUREUkVTU19JTlRfVVBEQVRFCT0gMHgwMQorfTsKKworZW51bSBhbGlfcmV2aXNpb24geworCUFMSV81NDUxX1YwMgk9IDB4MDIKK307CisKK2VudW0gYWxpX3NwZGlmX291dF9jb250cm9sIHsKKwlBTElfUENNX1RPX1NQRElGX09VVAkJPSAwLAorCUFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUCT0gMSwKKwlBTElfU1BESUZfT1VUX1BDTQkJPSAwLAorCUFMSV9TUERJRl9PVVRfTk9OX1BDTQkJPSAyCit9OworCisvKiBTL1BESUYgT3BlcmF0aW9uYWwgUmVnaXN0ZXJzIGZvciA0RC1OWCAqLworZW51bSBueF9zcGRpZl9yZWdpc3RlcnMgeworCU5YX1NQQ1RSTF9TUENTTwk9IDB4MjQsIE5YX1NQTEJBID0gMHgyOCwKKwlOWF9TUEVTTwk9IDB4MmMsIE5YX1NQQ1NUQVRVUyA9IDB4NjQKK307CisKKy8qIE9QIHJlZ2lzdGVycyB0byBhY2Nlc3MgZWFjaCBoYXJkd2FyZSBjaGFubmVsICovCitlbnVtIGNoYW5uZWxfcmVnaXN0ZXJzIHsKKwlDSF9EWF9DU09fQUxQSEFfRk1TID0gMHhlMCwgQ0hfRFhfRVNPX0RFTFRBID0gMHhlOCwKKwlDSF9EWF9GTUNfUlZPTF9DVk9MID0gMHhlYywKKwlDSF9OWF9ERUxUQV9DU08gICAgID0gMHhlMCwgQ0hfTlhfREVMVEFfRVNPID0gMHhlOCwKKwlDSF9OWF9BTFBIQV9GTVNfRk1DX1JWT0xfQ1ZPTCA9IDB4ZWMsCisJQ0hfTEJBICAgICAgICAgICAgICA9IDB4ZTQsCisJQ0hfR1ZTRUxfUEFOX1ZPTF9DVFJMX0VDICAgICAgPSAweGYwCit9OworCisvKiByZWdpc3RlcnMgdG8gcmVhZC93cml0ZS9jb250cm9sIEFDOTcgY29kZWMgKi8KK2VudW0gZHhfYWM5N19yZWdpc3RlcnMgeworCURYX0FDUjBfQUM5N19XICAgICAgICA9IDB4NDAsIERYX0FDUjFfQUM5N19SID0gMHg0NCwKKwlEWF9BQ1IyX0FDOTdfQ09NX1NUQVQgPSAweDQ4Cit9OworCitlbnVtIG54X2FjOTdfcmVnaXN0ZXJzIHsKKwlOWF9BQ1IwX0FDOTdfQ09NX1NUQVQgID0gMHg0MCwgTlhfQUNSMV9BQzk3X1cgICAgICAgICAgID0gMHg0NCwKKwlOWF9BQ1IyX0FDOTdfUl9QUklNQVJZID0gMHg0OCwgTlhfQUNSM19BQzk3X1JfU0VDT05EQVJZCT0gMHg0YworfTsKKworZW51bSBzaV9hYzk3X3JlZ2lzdGVycyB7CisJU0lfQUM5N19XUklURSAgICAgICA9IDB4NDAsIFNJX0FDOTdfUkVBRCA9IDB4NDQsCisJU0lfU0VSSUFMX0lOVEZfQ1RSTCA9IDB4NDgsIFNJX0FDOTdfR1BJTyA9IDB4NGMKK307CisKK2VudW0gYWxpX2FjOTdfcmVnaXN0ZXJzIHsKKwlBTElfQUM5N19XUklURSAgICAgICA9IDB4NDAsIEFMSV9BQzk3X1JFQUQgPSAweDQ0Cit9OworCisvKiBCaXQgbWFzayBmb3Igb3BlcmF0aW9uYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFDOTdfUkVHX0FERFIgICAgICAweDAwMDAwMGZmCisKK2VudW0gYWxpX2FjOTdfYml0cyB7CisJQUxJX0FDOTdfQlVTWV9XUklURSA9IDB4ODAwMCwgQUxJX0FDOTdfQlVTWV9SRUFEID0gMHg4MDAwLAorCUFMSV9BQzk3X1dSSVRFX0FDVElPTiA9IDB4ODAwMCwgQUxJX0FDOTdfUkVBRF9BQ1RJT04gPSAweDgwMDAsCisJQUxJX0FDOTdfQVVESU9fQlVTWSA9IDB4NDAwMCwgQUxJX0FDOTdfU0VDT05EQVJZICA9IDB4MDA4MCwKKwlBTElfQUM5N19SRUFEX01JWEVSX1JFR0lTVEVSID0gMHhmZWZmLAorCUFMSV9BQzk3X1dSSVRFX01JWEVSX1JFR0lTVEVSID0gMHgwMTAwCit9OworCitlbnVtIHNpczcwMThfYWM5N19iaXRzIHsKKwlTSV9BQzk3X0JVU1lfV1JJVEUgPSAweDgwMDAsIFNJX0FDOTdfQlVTWV9SRUFEID0gMHg4MDAwLAorCVNJX0FDOTdfQVVESU9fQlVTWSA9IDB4NDAwMCwgU0lfQUM5N19NT0RFTV9CVVNZID0gMHgyMDAwLAorCVNJX0FDOTdfU0VDT05EQVJZICA9IDB4MDA4MAorfTsKKworZW51bSB0cmlkZW50X2R4X2FjOTdfYml0cyB7CisJRFhfQUM5N19CVVNZX1dSSVRFID0gMHg4MDAwLCBEWF9BQzk3X0JVU1lfUkVBRCA9IDB4ODAwMCwKKwlEWF9BQzk3X1JFQURZICAgICAgPSAweDAwMTAsIERYX0FDOTdfUkVDT1JEICAgID0gMHgwMDA4LAorCURYX0FDOTdfUExBWUJBQ0sgICA9IDB4MDAwMgorfTsKKworZW51bSB0cmlkZW50X254X2FjOTdfYml0cyB7CisJLyogQUNSMS0zICovCisJTlhfQUM5N19CVVNZX1dSSVRFID0gMHgwODAwLCBOWF9BQzk3X0JVU1lfUkVBRCA9IDB4MDgwMCwKKwlOWF9BQzk3X0JVU1lfREFUQSAgPSAweDA0MDAsIE5YX0FDOTdfV1JJVEVfU0VDT05EQVJZID0gMHgwMTAwLAorCS8qIEFDUjAgKi8KKwlOWF9BQzk3X1NFQ09OREFSWV9SRUFEWSA9IDB4MDA0MCwgTlhfQUM5N19TRUNPTkRBUllfUkVDT1JEID0gMHgwMDIwLAorCU5YX0FDOTdfU1VSUk9VTkRfT1VUUFVUID0gMHgwMDEwLAorCU5YX0FDOTdfUFJJTUFSWV9SRUFEWSAgID0gMHgwMDA4LCBOWF9BQzk3X1BSSU1BUllfUkVDT1JEICAgPSAweDAwMDQsCisJTlhfQUM5N19QQ01fT1VUUFVUICAgICAgPSAweDAwMDIsCisJTlhfQUM5N19XQVJNX1JFU0VUICAgICAgPSAweDAwMDEKK307CisKK2VudW0gc2VyaWFsX2ludGZfY3RybF9iaXRzIHsKKwlXQVJNX1JFU1QgICA9IDB4MDAwMDAwMDEsIENPTERfUkVTRVQgID0gMHgwMDAwMDAwMiwKKwlJMlNfQ0xPQ0sgICA9IDB4MDAwMDAwMDQsIFBDTV9TRUNfQUM5Nz0gMHgwMDAwMDAwOCwKKwlBQzk3X0RCTF9SQVRFID0gMHgwMDAwMDAxMCwgU1BESUZfRU4gID0gMHgwMDAwMDAyMCwKKwlJMlNfT1VUUFVUX0VOID0gMHgwMDAwMDA0MCwgSTJTX0lOUFVUX0VOID0gMHgwMDAwMDA4MCwKKwlQQ01JTiAgICAgICA9IDB4MDAwMDAxMDAsIExJTkUxSU4gICAgID0gMHgwMDAwMDIwMCwKKwlNSUNJTiAgICAgICA9IDB4MDAwMDA0MDAsIExJTkUySU4gICAgID0gMHgwMDAwMDgwMCwKKwlIRUFEX1NFVF9JTiA9IDB4MDAwMDEwMDAsIEdQSU9JTiAgICAgID0gMHgwMDAwMjAwMCwKKwkvKiA3MDE4IHNwZWMgc2F5cyBpZCA9IDAxIGJ1dCB0aGUgZGVtbyBib2FyZCByb3V0ZWQgdG8gMTAgCisJICAgU0VDT05EQVJZX0lEPSAweDAwMDA0MDAwLCAqLworCVNFQ09OREFSWV9JRD0gMHgwMDAwNDAwMCwKKwlQQ01PVVQgICAgICA9IDB4MDAwMTAwMDAsIFNVUlJPVVQgICAgID0gMHgwMDAyMDAwMCwKKwlDRU5URVJPVVQgICA9IDB4MDAwNDAwMDAsIExGRU9VVCAgICAgID0gMHgwMDA4MDAwMCwKKwlMSU5FMU9VVCAgICA9IDB4MDAxMDAwMDAsIExJTkUyT1VUICAgID0gMHgwMDIwMDAwMCwKKwlHUElPT1VUICAgICA9IDB4MDA0MDAwMDAsCisJU0lfQUM5N19QUklNQVJZX1JFQURZICAgPSAweDAxMDAwMDAwLAorCVNJX0FDOTdfU0VDT05EQVJZX1JFQURZID0gMHgwMjAwMDAwMCwKK307CisKK2VudW0gZ2xvYmFsX2NvbnRyb2xfYml0cyB7CisJQ0hBTk5MRV9JRFggPSAweDAwMDAwMDNmLCBQQl9SRVNFVCAgICA9IDB4MDAwMDAxMDAsCisJUEFVU0VfRU5HICAgPSAweDAwMDAwMjAwLAorCU9WRVJSVU5fSUUgID0gMHgwMDAwMDQwMCwgVU5ERVJSVU5fSUUgPSAweDAwMDAwODAwLAorCUVORExQX0lFICAgID0gMHgwMDAwMTAwMCwgTUlETFBfSUUgICAgPSAweDAwMDAyMDAwLAorCUVUT0dfSUUgICAgID0gMHgwMDAwNDAwMCwKKwlFRFJPUF9JRSAgICA9IDB4MDAwMDgwMDAsIEJBTktfQl9FTiAgID0gMHgwMDAxMDAwMAorfTsKKworZW51bSBjaGFubmVsX2NvbnRyb2xfYml0cyB7CisJQ0hBTk5FTF9MT09QICAgPSAweDAwMDAxMDAwLCBDSEFOTkVMX1NJR05FRCA9IDB4MDAwMDIwMDAsCisJQ0hBTk5FTF9TVEVSRU8gPSAweDAwMDA0MDAwLCBDSEFOTkVMXzE2QklUUyA9IDB4MDAwMDgwMDAsCit9OworCitlbnVtIGNoYW5uZWxfYXR0cmlidXRlIHsKKwkvKiBwbGF5YmFjay9yZWNvcmQgc2VsZWN0ICovCisJQ0hBTk5FTF9QQiAgICAgPSAweDAwMDAsIENIQU5ORUxfU1BDX1BCID0gMHg0MDAwLAorCUNIQU5ORUxfUkVDICAgID0gMHg4MDAwLCBDSEFOTkVMX1JFQ19QQiA9IDB4YzAwMCwKKwkvKiBwbGF5YmFjayBkZXN0aW5hdGlvbi9yZWNvcmQgc291cmNlIHNlbGVjdCAqLworCU1PREVNX0xJTkUxICAgID0gMHgwMDAwLCBNT0RFTV9MSU5FMiAgICA9IDB4MDQwMCwKKwlQQ01fTFIgICAgICAgICA9IDB4MDgwMCwgSFNFVCAgICAgICAgICAgPSAweDBjMDAsCisJSTJTX0xSICAgICAgICAgPSAweDEwMDAsIENFTlRFUl9MRkUgICAgID0gMHgxNDAwLAorCVNVUlJfTFIgICAgICAgID0gMHgxODAwLCBTUERJRl9MUiAgICAgICA9IDB4MWMwMCwKKwlNSUMgICAgICAgICAgICA9IDB4MTQwMCwKKwkvKiBtaXN0IHN0dWZmICovCisJTU9OT19MRUZUICAgICAgPSAweDAwMDAsIE1PTk9fUklHSFQgICAgID0gMHgwMTAwLAorCU1PTk9fTUlYICAgICAgID0gMHgwMjAwLCBTUkNfRU5BQkxFICAgICA9IDB4MDA4MCwKK307CisKK2VudW0gbWlzY2ludF9iaXRzIHsKKwlQQl9VTkRFUlJVTl9JUk8gPSAweDAwMDAwMDAxLCBSRUNfT1ZFUlJVTl9JUlEgPSAweDAwMDAwMDAyLAorCVNCX0lSUSAgICAgICAgICA9IDB4MDAwMDAwMDQsIE1QVTQwMV9JUlEgICAgICA9IDB4MDAwMDAwMDgsCisJT1BMM19JUlEgICAgICAgID0gMHgwMDAwMDAxMCwgQUREUkVTU19JUlEgICAgID0gMHgwMDAwMDAyMCwKKwlFTlZFTE9QRV9JUlEgICAgPSAweDAwMDAwMDQwLCBTVF9JUlEgICAgICAgICAgPSAweDAwMDAwMDgwLAorCVBCX1VOREVSUlVOICAgICA9IDB4MDAwMDAxMDAsIFJFQ19PVkVSUlVOICAgICA9IDB4MDAwMDAyMDAsCisJTUlYRVJfVU5ERVJGTE9XID0gMHgwMDAwMDQwMCwgTUlYRVJfT1ZFUkZMT1cgID0gMHgwMDAwMDgwMCwKKwlTVF9UQVJHRVRfUkVBQ0hFRCA9IDB4MDAwMDgwMDAsIFBCXzI0S19NT0RFICAgPSAweDAwMDEwMDAwLCAKKwlTVF9JUlFfRU4gICAgICAgPSAweDAwODAwMDAwLCBBQ0dQSU9fSVJRICAgICAgPSAweDAxMDAwMDAwCit9OworCisjZGVmaW5lIFRSSURfUkVHKCB0cmlkZW50LCB4ICkgKCAodHJpZGVudCkgLT4gaW9iYXNlICsgKHgpICkKKworI2RlZmluZQkJQ1lCRVJfUE9SVF9BVURJTwkJMHgzQ0UKKyNkZWZpbmUJCUNZQkVSX0lEWF9BVURJT19FTkFCTEUgICAgICAgICAgMHg3QgorI2RlZmluZQkJQ1lCRVJfQk1TS19BVURJT19JTlRfRU5BQkxFCTB4MDkKKyNkZWZpbmUJCUNZQkVSX0JNU0tfQVVFTloJCTB4MDEKKyNkZWZpbmUJCUNZQkVSX0JNU0tfQVVFTlpfRU5BQkxFCQkweDAwCisjZGVmaW5lCQlDWUJFUl9JRFhfSVJRX0VOQUJMRQkJMHgxMgorICAgICAgCisjZGVmaW5lIFZBTElEQVRFX01BR0lDKEZPTyxNQUcpCQkJCVwKKyh7CQkJCQkJICAJXAorCWlmICghKEZPTykgfHwgKEZPTyktPm1hZ2ljICE9IE1BRykgeyAJCVwKKwkJcHJpbnRrKGludmFsaWRfbWFnaWMsX19GVU5DVElPTl9fKTsJXAorCQlyZXR1cm4gLUVOWElPOwkJCSAgCVwKKwl9CQkJCQkgIAlcCit9KQorCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKGEpIFZBTElEQVRFX01BR0lDKGEsVFJJREVOVF9TVEFURV9NQUdJQykKKyNkZWZpbmUgVkFMSURBVEVfQ0FSRChhKSBWQUxJREFURV9NQUdJQyhhLFRSSURFTlRfQ0FSRF9NQUdJQykKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsZDIodW5zaWduZWQgaW50IHgpCit7CisJdW5zaWduZWQgciA9IDA7CisJCisJaWYgKHggPj0gMHgxMDAwMCkgeworCQl4ID4+PSAxNjsKKwkJciArPSAxNjsKKwl9CisJaWYgKHggPj0gMHgxMDApIHsKKwkJeCA+Pj0gODsKKwkJciArPSA4OworCX0KKwlpZiAoeCA+PSAweDEwKSB7CisJCXggPj49IDQ7CisJCXIgKz0gNDsKKwl9CisJaWYgKHggPj0gNCkgeworCQl4ID4+PSAyOworCQlyICs9IDI7CisJfQorCWlmICh4ID49IDIpCisJCXIrKzsKKwlyZXR1cm4gcjsKK30KKworI2VuZGlmIC8qIF9fVFJJRDREV0FWRV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdHJpeC5jIGIvc291bmQvb3NzL3RyaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWYxZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3RyaXguYwpAQCAtMCwwICsxLDUyNSBAQAorLyoKKyAqIHNvdW5kL3RyaXguYworICoKKyAqIExvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSBNZWRpYVRyaXggQXVkaW9Ucml4IFBybworICogKE1ULTAwMDItUEMgQ29udHJvbCBDaGlwKQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBDaGFuZ2VzCisgKglBbGFuIENveAkJTW9kdWxhcmlzYXRpb24sIGNsZWFudXAuCisgKglDaHJpc3RvcGggSGVsbHdpZwlBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKglBcm5hbGRvIEMuIGRlIE1lbG8JR290IHJpZCBvZiBhdHRhY2hfdWFydDQwMQorICovCisgCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAic2IuaCIKKyNpbmNsdWRlICJzb3VuZF9maXJtd2FyZS5oIgorCisjaW5jbHVkZSAiYWQxODQ4LmgiCisjaW5jbHVkZSAibXB1NDAxLmgiCisKKyNpbmNsdWRlICJ0cml4X2Jvb3QuaCIKKworc3RhdGljIGludCBtcHU7CisKK3N0YXRpYyBpbnQgam95c3RpY2s7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaXhfcmVhZChpbnQgYWRkcikKK3sKKwlvdXRiKCgodW5zaWduZWQgY2hhcikgYWRkciksIDB4MzkwKTsJLyogTVQtMDAwMi1QQyBBU0lDIGFkZHJlc3MgKi8KKwlyZXR1cm4gaW5iKDB4MzkxKTsJLyogTVQtMDAwMi1QQyBBU0lDIGRhdGEgKi8KK30KKworc3RhdGljIHZvaWQgdHJpeF93cml0ZShpbnQgYWRkciwgaW50IGRhdGEpCit7CisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIGFkZHIpLCAweDM5MCk7CS8qIE1ULTAwMDItUEMgQVNJQyBhZGRyZXNzICovCisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIGRhdGEpLCAweDM5MSk7CS8qIE1ULTAwMDItUEMgQVNJQyBkYXRhICovCit9CisKK3N0YXRpYyB2b2lkIGRvd25sb2FkX2Jvb3QoaW50IGJhc2UpCit7CisJaW50IGkgPSAwLCBuID0gdHJpeF9ib290X2xlbjsKKworCWlmICh0cml4X2Jvb3RfbGVuID09IDApCisJCXJldHVybjsKKworCXRyaXhfd3JpdGUoMHhmOCwgMHgwMCk7CS8qID8/Pz8/Pz8gKi8KKwlvdXRiKCgweDAxKSwgYmFzZSArIDYpOwkvKiBDbGVhciB0aGUgaW50ZXJuYWwgZGF0YSBwb2ludGVyICovCisJb3V0YigoMHgwMCksIGJhc2UgKyA2KTsJLyogUmVzdGFydCAqLworCisJLyoKKwkgICAqICBXcml0ZSB0aGUgYm9vdCBjb2RlIHRvIHRoZSBSQU0gdXBsb2FkL2Rvd25sb2FkIHJlZ2lzdGVyLgorCSAgICogIEVhY2ggd3JpdGUgaW5jcmVtZW50cyB0aGUgaW50ZXJuYWwgZGF0YSBwb2ludGVyLgorCSAqLworCW91dGIoKDB4MDEpLCBiYXNlICsgNik7CS8qIENsZWFyIHRoZSBpbnRlcm5hbCBkYXRhIHBvaW50ZXIgKi8KKwlvdXRiKCgweDFBKSwgMHgzOTApOwkvKiBTZWxlY3QgUkFNIGRvd25sb2FkL3VwbG9hZCBwb3J0ICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlvdXRiKCh0cml4X2Jvb3RbaV0pLCAweDM5MSk7CisJZm9yIChpID0gbjsgaSA8IDEwMDE2OyBpKyspCS8qIENsZWFyIHVwIHRvIGZpcnN0IDE2IGJ5dGVzIG9mIGRhdGEgUkFNICovCisJCW91dGIoKDB4MDApLCAweDM5MSk7CisJb3V0YigoMHgwMCksIGJhc2UgKyA2KTsJLyogUmVzZXQgKi8KKwlvdXRiKCgweDUwKSwgMHgzOTApOwkvKiA/Pz8/Pz8gKi8KKworfQorCitzdGF0aWMgaW50IHRyaXhfc2V0X3dzc19wb3J0KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwl1bnNpZ25lZCBjaGFyICAgYWRkcl9iaXRzOworCisJaWYgKHRyaXhfcmVhZCgweDE1KSAhPSAweDcxKQkvKiBObyBBU0lDIHNpZ25hdHVyZSAqLworCXsKKwkJTURCKHByaW50ayhLRVJOX0VSUiAiTm8gQXVkaW9Ucml4IEFTSUMgc2lnbmF0dXJlIGZvdW5kXG4iKSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogUmVzZXQgc29tZSByZWdpc3RlcnMuCisJICovCisKKwl0cml4X3dyaXRlKDB4MTMsIDApOworCXRyaXhfd3JpdGUoMHgxNCwgMCk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgQVNJQyB0byBwbGFjZSB0aGUgY29kZWMgdG8gdGhlIHByb3BlciBJL08gbG9jYXRpb24KKwkgKi8KKworCXN3aXRjaCAoaHdfY29uZmlnLT5pb19iYXNlKQorCXsKKwkJY2FzZSAweDUzMDoKKwkJCWFkZHJfYml0cyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAweDYwNDoKKwkJCWFkZHJfYml0cyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweEU4MDoKKwkJCWFkZHJfYml0cyA9IDI7CisJCQlicmVhazsKKwkJY2FzZSAweEY0MDoKKwkJCWFkZHJfYml0cyA9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KKworCXRyaXhfd3JpdGUoMHgxOSwgKHRyaXhfcmVhZCgweDE5KSAmIDB4MDMpIHwgYWRkcl9iaXRzKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqICAgIFByb2JlIGFuZCBhdHRhY2ggcm91dGluZXMgZm9yIHRoZSBXaW5kb3dzIFNvdW5kIFN5c3RlbSBtb2RlIG9mCisgKiAgICAgIEF1ZGlvVHJpeCBQcm8KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RyaXhfd3NzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBkbWFfYml0c1s0XSA9IHsKKwkJMSwgMiwgMCwgMworCX07CisJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwlpbnQgY29uZmlnX3BvcnQgPSBod19jb25maWctPmlvX2Jhc2UgKyAwOworCWludCBkbWExID0gaHdfY29uZmlnLT5kbWEsIGRtYTIgPSBod19jb25maWctPmRtYTI7CisJaW50IG9sZF9udW1fbWl4ZXJzID0gbnVtX21peGVyczsKKwl1OCBjb25maWcsIGJpdHM7CisJaW50IHJldDsKKyAKKwlzd2l0Y2goaHdfY29uZmlnLT5pcnEpIHsKKwljYXNlIDc6CisJCWJpdHMgPSA4OworCQlicmVhazsKKwljYXNlIDk6CisJCWJpdHMgPSAweDEwOworCQlicmVhazsKKwljYXNlIDEwOgorCQliaXRzID0gMHgxODsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJYml0cyA9IDB4MjA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiQXVkaW9Ucml4OiBCYWQgV1NTIElSUSAlZFxuIiwgaHdfY29uZmlnLT5pcnEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGRtYTEpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJBdWRpb1RyaXg6IEJhZCBXU1MgRE1BICVkXG4iLCBkbWExKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChkbWEyKSB7CisJY2FzZSAtMToKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJBdWRpb1RyaXg6IEJhZCBjYXB0dXJlIERNQSAlZFxuIiwgZG1hMik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIElPIHBvcnQgcmV0dXJucyB2YWxpZCBzaWduYXR1cmUuIFRoZSBvcmlnaW5hbCBNUyBTb3VuZAorCSAqIHN5c3RlbSByZXR1cm5zIDB4MDQgd2hpbGUgc29tZSBjYXJkcyAoQXVkaW9Ucml4IFBybyBmb3IgZXhhbXBsZSkKKwkgKiByZXR1cm4gMHgwMC4KKwkgKi8KKwlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSArIDQsIDQsICJhZDE4NDgiKTsKKwlpZiAoIXBvcnRzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQXVkaW9Ucml4OiBNU1MgSS9PIHBvcnQgY29uZmxpY3QgKCV4KVxuIiwgaHdfY29uZmlnLT5pb19iYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDQsICJNU1MgY29uZmlnIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBdWRpb1RyaXg6IE1TUyBJL08gcG9ydCBjb25mbGljdCAoJXgpXG4iLCBod19jb25maWctPmlvX2Jhc2UpOworCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UgKyA0LCA0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF0cml4X3NldF93c3NfcG9ydChod19jb25maWcpKQorCQlnb3RvIGZhaWw7CisKKwljb25maWcgPSBpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgMyk7CisKKwlpZiAoKGNvbmZpZyAmIDB4M2YpICE9IDB4MDApCisJeworCQlNREIocHJpbnRrKEtFUk5fRVJSICJObyBNU1Mgc2lnbmF0dXJlIGRldGVjdGVkIG9uIHBvcnQgMHgleFxuIiwgaHdfY29uZmlnLT5pb19iYXNlKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgRE1BMCBpcyBub3QgaW4gdXNlIHdpdGggYSA4IGJpdCBib2FyZC4KKwkgKi8KKworCWlmIChkbWExID09IDAgJiYgY29uZmlnICYgMHg4MCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiQXVkaW9Ucml4OiBDYW4ndCB1c2UgRE1BMCB3aXRoIGEgOCBiaXQgY2FyZCBzbG90XG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoaHdfY29uZmlnLT5pcnEgPiA5ICYmIGNvbmZpZyAmIDB4ODApCisJeworCQlwcmludGsoS0VSTl9FUlIgIkF1ZGlvVHJpeDogQ2FuJ3QgdXNlIElSUSVkIHdpdGggYSA4IGJpdCBjYXJkIHNsb3RcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IGFkMTg0OF9kZXRlY3QocG9ydHMsIE5VTEwsIGh3X2NvbmZpZy0+b3NwKTsKKwlpZiAoIXJldCkKKwkJZ290byBmYWlsOworCisJaWYgKGpveXN0aWNrPT0xKQorCQl0cml4X3dyaXRlKDB4MTUsIDB4ODApOworCisJLyoKKwkgKiBTZXQgdGhlIElSUSBhbmQgRE1BIGFkZHJlc3Nlcy4KKwkgKi8KKworCW91dGIoKGJpdHMgfCAweDQwKSwgY29uZmlnX3BvcnQpOworCisJaWYgKGRtYTIgPT0gLTEgfHwgZG1hMiA9PSBkbWExKQorCXsKKwkJICBiaXRzIHw9IGRtYV9iaXRzW2RtYTFdOworCQkgIGRtYTIgPSBkbWExOworCX0KKwllbHNlCisJeworCQl1bnNpZ25lZCBjaGFyIHRtcDsKKworCQl0bXAgPSB0cml4X3JlYWQoMHgxMykgJiB+MzA7CisJCXRyaXhfd3JpdGUoMHgxMywgdG1wIHwgMHg4MCB8IChkbWExIDw8IDQpKTsKKworCQl0bXAgPSB0cml4X3JlYWQoMHgxNCkgJiB+MzA7CisJCXRyaXhfd3JpdGUoMHgxNCwgdG1wIHwgMHg4MCB8IChkbWEyIDw8IDQpKTsKKwl9CisKKwlvdXRiKChiaXRzKSwgY29uZmlnX3BvcnQpOwkvKiBXcml0ZSBJUlErRE1BIHNldHVwICovCisKKwlod19jb25maWctPnNsb3RzWzBdID0gYWQxODQ4X2luaXQoIkF1ZGlvVHJpeCBQcm8iLCBwb3J0cywKKwkJCQkJICBod19jb25maWctPmlycSwKKwkJCQkJICBkbWExLAorCQkJCQkgIGRtYTIsCisJCQkJCSAgMCwKKwkJCQkJICBod19jb25maWctPm9zcCwKKwkJCQkJICBUSElTX01PRFVMRSk7CisKKwlpZiAobnVtX21peGVycyA+IG9sZF9udW1fbWl4ZXJzKQkvKiBNaXhlciBnb3QgaW5zdGFsbGVkICovCisJeworCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMSwgU09VTkRfTUlYRVJfTElORSk7CS8qIExpbmUgaW4gKi8KKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTIsIFNPVU5EX01JWEVSX0NEKTsKKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX1NZTlRIKTsJCS8qIE9QTDQgKi8KKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfU1BFQUtFUiwgU09VTkRfTUlYRVJfQUxUUENNKTsJLyogU0IgKi8KKwl9CisJcmV0dXJuIDE7CisKK2ZhaWw6CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UgKyA0LCA0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfdHJpeF9zYihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisKKwlpbnQgdG1wOworCXVuc2lnbmVkIGNoYXIgY29uZjsKKwlleHRlcm4gaW50IHNiX2JlX3F1aWV0OworCWludCBvbGRfcXVpZXQ7CisJc3RhdGljIHNpZ25lZCBjaGFyIGlycV90cmFuc2xhdGVbXSA9IHsKKwkJLTEsIC0xLCAtMSwgMCwgMSwgMiwgLTEsIDMKKwl9OworCisJaWYgKHRyaXhfYm9vdF9sZW4gPT0gMCkKKwkJcmV0dXJuIDA7CS8qIE5vIGJvb3QgY29kZSAtPiBubyBmdW4gKi8KKworCWlmICgoaHdfY29uZmlnLT5pb19iYXNlICYgMHhmZmZmZmY4ZikgIT0gMHgyMDApCisJCXJldHVybiAwOworCisJdG1wID0gaHdfY29uZmlnLT5pcnE7CisJaWYgKHRtcCA+IDcpCisJCXJldHVybiAwOworCWlmIChpcnFfdHJhbnNsYXRlW3RtcF0gPT0gLTEpCisJCXJldHVybiAwOworCisJdG1wID0gaHdfY29uZmlnLT5kbWE7CisJaWYgKHRtcCAhPSAxICYmIHRtcCAhPSAzKQorCQlyZXR1cm4gMDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNiwgInNvdW5kYmxhc3RlciIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQXVkaW9Ucml4OiBTQiBJL08gcG9ydCBjb25mbGljdCAoJXgpXG4iLCBod19jb25maWctPmlvX2Jhc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwljb25mID0gMHg4NDsJCS8qIERNQSBhbmQgSVJRIGVuYWJsZSAqLworCWNvbmYgfD0gaHdfY29uZmlnLT5pb19iYXNlICYgMHg3MDsJLyogSS9PIGFkZHJlc3MgYml0cyAqLworCWNvbmYgfD0gaXJxX3RyYW5zbGF0ZVtod19jb25maWctPmlycV07CisJaWYgKGh3X2NvbmZpZy0+ZG1hID09IDMpCisJCWNvbmYgfD0gMHgwODsKKwl0cml4X3dyaXRlKDB4MWIsIGNvbmYpOworCisJZG93bmxvYWRfYm9vdChod19jb25maWctPmlvX2Jhc2UpOworCisJaHdfY29uZmlnLT5uYW1lID0gIkF1ZGlvVHJpeCBTQiI7CisJaWYgKCFzYl9kc3BfZGV0ZWN0KGh3X2NvbmZpZywgMCwgMCwgTlVMTCkpIHsKKwkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNik7CisJCXJldHVybiAwOworCX0KKworCWh3X2NvbmZpZy0+ZHJpdmVyX3VzZV8xID0gU0JfTk9fTUlESSB8IFNCX05PX01JWEVSIHwgU0JfTk9fUkVDT1JESU5HOworCisJLyogUHJldmVudCBmYWxzZSBhbGFybXMgKi8KKwlvbGRfcXVpZXQgPSBzYl9iZV9xdWlldDsKKwlzYl9iZV9xdWlldCA9IDE7CisKKwlzYl9kc3BfaW5pdChod19jb25maWcsIFRISVNfTU9EVUxFKTsKKworCXNiX2JlX3F1aWV0ID0gb2xkX3F1aWV0OworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV90cml4X21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5zaWduZWQgY2hhciBjb25mOworCXN0YXRpYyBpbnQgaXJxX2JpdHNbXSA9IHsKKwkJLTEsIC0xLCAtMSwgMSwgMiwgMywgLTEsIDQsIC0xLCA1CisJfTsKKworCWlmIChod19jb25maWctPmlycSA+IDkpCisJeworCQlwcmludGsoS0VSTl9FUlIgIkF1ZGlvVHJpeDogQmFkIE1QVSBJUlEgJWRcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpcnFfYml0c1tod19jb25maWctPmlycV0gPT0gLTEpCisJeworCQlwcmludGsoS0VSTl9FUlIgIkF1ZGlvVHJpeDogQmFkIE1QVSBJUlEgJWRcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCXN3aXRjaCAoaHdfY29uZmlnLT5pb19iYXNlKQorCXsKKwkJY2FzZSAweDMzMDoKKwkJCWNvbmYgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgzNzA6CisJCQljb25mID0gMHgwNDsKKwkJCWJyZWFrOworCQljYXNlIDB4M2IwOgorCQkJY29uZiA9IDB4MDg7CisJCQlicmVhazsKKwkJY2FzZSAweDNmMDoKKwkJCWNvbmYgPSAweDBjOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsJLyogSW52YWxpZCBwb3J0ICovCisJfQorCisJY29uZiB8PSBpcnFfYml0c1tod19jb25maWctPmlycV0gPDwgNDsKKwl0cml4X3dyaXRlKDB4MTksICh0cml4X3JlYWQoMHgxOSkgJiAweDgzKSB8IGNvbmYpOworCWh3X2NvbmZpZy0+bmFtZSA9ICJBdWRpb1RyaXggUHJvIjsKKwlyZXR1cm4gcHJvYmVfdWFydDQwMShod19jb25maWcsIFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF90cml4X3dzcyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJaW50IGRtYTIgPSBod19jb25maWctPmRtYTI7CisKKwlpZiAoZG1hMiA9PSAtMSkKKwkJZG1hMiA9IGh3X2NvbmZpZy0+ZG1hOworCisJcmVsZWFzZV9yZWdpb24oMHgzOTAsIDIpOworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCk7CisKKwlhZDE4NDhfdW5sb2FkKGh3X2NvbmZpZy0+aW9fYmFzZSArIDQsCisJCSAgICAgIGh3X2NvbmZpZy0+aXJxLAorCQkgICAgICBod19jb25maWctPmRtYSwKKwkJICAgICAgZG1hMiwKKwkJICAgICAgMCk7CisJc291bmRfdW5sb2FkX2F1ZGlvZGV2KGh3X2NvbmZpZy0+c2xvdHNbMF0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF90cml4X21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5sb2FkX3VhcnQ0MDEoaHdfY29uZmlnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCB1bmxvYWRfdHJpeF9zYihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJc2JfZHNwX3VubG9hZChod19jb25maWcsIG1wdSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzI7CitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXB1OworCitzdGF0aWMgaW50IHNiOworc3RhdGljIGludCBmd19sb2FkOworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8JPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEyCT0gLTE7CS8qIFNldCB0aGlzIGZvciBtb2R1bGVzIHRoYXQgbmVlZCBpdCAqLworc3RhdGljIGludCBfX2luaXRkYXRhIHNiX2lvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgc2JfZG1hCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgc2JfaXJxCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXB1X2lvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXB1X2lycQk9IC0xOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNiX2lvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNiX2RtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzYl9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXB1X2lvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1wdV9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oam95c3RpY2ssIGJvb2wsIDApOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RyaXgodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJNZWRpYVRyaXggYXVkaW8gZHJpdmVyIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTZcbiIpOworCisJY2ZnLmlvX2Jhc2UgPSBpbzsKKwljZmcuaXJxID0gaXJxOworCWNmZy5kbWEgPSBkbWE7CisJY2ZnLmRtYTIgPSBkbWEyOworCisJY2ZnMi5pb19iYXNlID0gc2JfaW87CisJY2ZnMi5pcnEgPSBzYl9pcnE7CisJY2ZnMi5kbWEgPSBzYl9kbWE7CisKKwljZmdfbXB1LmlvX2Jhc2UgPSBtcHVfaW87CisJY2ZnX21wdS5pcnEgPSBtcHVfaXJxOworCisJaWYgKGNmZy5pb19iYXNlID09IC0xIHx8IGNmZy5kbWEgPT0gLTEgfHwgY2ZnLmlycSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9JTkZPICJJL08sIElSUSwgRE1BIGFuZCB0eXBlIGFyZSBtYW5kYXRvcnlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2ZnMi5pb19iYXNlICE9IC0xICYmIChjZmcyLmlycSA9PSAtMSB8fCBjZmcyLmRtYSA9PSAtMSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ09ORklHX1NCX0lSUSBhbmQgQ09ORklHX1NCX0RNQSBtdXN0IGJlIHNwZWNpZmllZCBpZiBTQl9JTyBpcyBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjZmdfbXB1LmlvX2Jhc2UgIT0gLTEgJiYgY2ZnX21wdS5pcnEgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ09ORklHX01QVV9JUlEgbXVzdCBiZSBzcGVjaWZpZWQgaWYgTVBVX0lPIGlzIHNldC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCF0cml4X2Jvb3QpCisJeworCQlmd19sb2FkID0gMTsKKwkJdHJpeF9ib290X2xlbiA9IG1vZF9maXJtd2FyZV9sb2FkKCIvZXRjL3NvdW5kL3RyeHByby5iaW4iLAorCQkJCQkJICAgIChjaGFyICoqKSAmdHJpeF9ib290KTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKDB4MzkwLCAyLCAiQXVkaW9Ucml4IikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBdWRpb1RyaXg6IENvbmZpZyBwb3J0IEkvTyBjb25mbGljdFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghaW5pdF90cml4X3dzcygmY2ZnKSkgeworCQlyZWxlYXNlX3JlZ2lvbigweDM5MCwgMik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCisJICogICAgV2UgbXVzdCBhdHRhY2ggaW4gdGhlIHJpZ2h0IG9yZGVyIHRvIGdldCB0aGUgZmlybXdhcmUKKwkgKiAgICAgIGxvYWRlZCB1cCBpbiB0aW1lLgorCSAqLworCisJaWYgKGNmZzIuaW9fYmFzZSAhPSAtMSkgeworCQlzYiA9IHByb2JlX3RyaXhfc2IoJmNmZzIpOworCX0KKwkKKwlpZiAoY2ZnX21wdS5pb19iYXNlICE9IC0xKQorCQltcHUgPSBwcm9iZV90cml4X21wdSgmY2ZnX21wdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfdHJpeCh2b2lkKQoreworCWlmIChmd19sb2FkICYmIHRyaXhfYm9vdCkKKwkJdmZyZWUodHJpeF9ib290KTsKKwlpZiAoc2IpCisJCXVubG9hZF90cml4X3NiKCZjZmcyKTsKKwlpZiAobXB1KQorCQl1bmxvYWRfdHJpeF9tcHUoJmNmZ19tcHUpOworCXVubG9hZF90cml4X3dzcygmY2ZnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF90cml4KTsKK21vZHVsZV9leGl0KGNsZWFudXBfdHJpeCk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF90cml4IChjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSwgZG1hLCBkbWEyLCBzYl9pbywgc2JfaXJxLCBzYl9kbWEsIG1wdV9pbywgbXB1X2lycSAqLworCWludCBpbnRzWzldOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpbwk9IGludHNbMV07CisJaXJxCT0gaW50c1syXTsKKwlkbWEJPSBpbnRzWzNdOworCWRtYTIJPSBpbnRzWzRdOworCXNiX2lvCT0gaW50c1s1XTsKKwlzYl9pcnEJPSBpbnRzWzZdOworCXNiX2RtYQk9IGludHNbNl07CisJbXB1X2lvCT0gaW50c1s3XTsKKwltcHVfaXJxCT0gaW50c1s4XTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJ0cml4PSIsIHNldHVwX3RyaXgpOworI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdHVuaW5nLmggYi9zb3VuZC9vc3MvdHVuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4ZTFmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvdHVuaW5nLmgKQEAgLTAsMCArMSwyOSBAQAorI2lmZGVmIFNFUVVFTkNFUl9DCisKK3Vuc2lnbmVkIHNob3J0IHNlbWl0b25lX3R1bmluZ1syNF0gPSAKK3sKKy8qICAgMCAqLyAxMDAwMCwgMTA1OTUsIDExMjI1LCAxMTg5MiwgMTI1OTksIDEzMzQ4LCAxNDE0MiwgMTQ5ODMsIAorLyogICA4ICovIDE1ODc0LCAxNjgxOCwgMTc4MTgsIDE4ODc3LCAyMDAwMCwgMjExODksIDIyNDQ5LCAyMzc4NCwgCisvKiAgMTYgKi8gMjUxOTgsIDI2Njk3LCAyODI4NCwgMjk5NjYsIDMxNzQ4LCAzMzYzNiwgMzU2MzYsIDM3NzU1Cit9OworCit1bnNpZ25lZCBzaG9ydCBjZW50X3R1bmluZ1sxMDBdID0KK3sKKy8qICAgMCAqLyAxMDAwMCwgMTAwMDYsIDEwMDEyLCAxMDAxNywgMTAwMjMsIDEwMDI5LCAxMDAzNSwgMTAwNDEsIAorLyogICA4ICovIDEwMDQ2LCAxMDA1MiwgMTAwNTgsIDEwMDY0LCAxMDA3MCwgMTAwNzUsIDEwMDgxLCAxMDA4NywgCisvKiAgMTYgKi8gMTAwOTMsIDEwMDk5LCAxMDEwNSwgMTAxMTAsIDEwMTE2LCAxMDEyMiwgMTAxMjgsIDEwMTM0LCAKKy8qICAyNCAqLyAxMDE0MCwgMTAxNDUsIDEwMTUxLCAxMDE1NywgMTAxNjMsIDEwMTY5LCAxMDE3NSwgMTAxODEsIAorLyogIDMyICovIDEwMTg3LCAxMDE5MiwgMTAxOTgsIDEwMjA0LCAxMDIxMCwgMTAyMTYsIDEwMjIyLCAxMDIyOCwgCisvKiAgNDAgKi8gMTAyMzQsIDEwMjQwLCAxMDI0NiwgMTAyNTEsIDEwMjU3LCAxMDI2MywgMTAyNjksIDEwMjc1LCAKKy8qICA0OCAqLyAxMDI4MSwgMTAyODcsIDEwMjkzLCAxMDI5OSwgMTAzMDUsIDEwMzExLCAxMDMxNywgMTAzMjMsIAorLyogIDU2ICovIDEwMzI5LCAxMDMzNSwgMTAzNDEsIDEwMzQ3LCAxMDM1MywgMTAzNTksIDEwMzY1LCAxMDM3MSwgCisvKiAgNjQgKi8gMTAzNzcsIDEwMzgzLCAxMDM4OSwgMTAzOTUsIDEwNDAxLCAxMDQwNywgMTA0MTMsIDEwNDE5LCAKKy8qICA3MiAqLyAxMDQyNSwgMTA0MzEsIDEwNDM3LCAxMDQ0MywgMTA0NDksIDEwNDU1LCAxMDQ2MSwgMTA0NjcsIAorLyogIDgwICovIDEwNDczLCAxMDQ3OSwgMTA0ODUsIDEwNDkxLCAxMDQ5NywgMTA1MDMsIDEwNTA5LCAxMDUxNSwgCisvKiAgODggKi8gMTA1MjEsIDEwNTI4LCAxMDUzNCwgMTA1NDAsIDEwNTQ2LCAxMDU1MiwgMTA1NTgsIDEwNTY0LCAKKy8qICA5NiAqLyAxMDU3MCwgMTA1NzYsIDEwNTgyLCAxMDU4OQorfTsKKyNlbHNlCitleHRlcm4gdW5zaWduZWQgc2hvcnQgc2VtaXRvbmVfdHVuaW5nWzI0XTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBjZW50X3R1bmluZ1sxMDBdOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdWFydDQwMS5jIGIvc291bmQvb3NzL3VhcnQ0MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Q3NWJhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3VhcnQ0MDEuYwpAQCAtMCwwICsxLDQ4MSBAQAorLyoKKyAqIHNvdW5kL3VhcnQ0MDEuYworICoKKyAqIE1QVS00MDEgVUFSVCBkcml2ZXIgKGZvcm1lcmx5IHVhcnQ0MDFfbWlkaS5jKQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBDaGFuZ2VzOgorICoJQWxhbiBDb3gJCVJlZm9ybWF0dGVkLCByZW1vdmVkIHNvdW5kX21lbSB1c2FnZSwgdXNlIG5vcm1hbCBMaW51eAorICoJCQkJaW50ZXJydXB0IGFsbG9jYXRpb24uIFByb3RlY3QgYWdhaW5zdCBib2d1cyB1bmxvYWQKKyAqCQkJCUZpeGVkIHRvIGFsbG93IElSUSA+IDE1CisgKglDaHJpc3RvcGggSGVsbHdpZwlBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKglBcm5hbGRvIEMuIGRlIE1lbG8JZ290IHJpZCBvZiBjaGVja19yZWdpb24KKyAqCisgKiBTdGF0dXM6CisgKgkJVW50ZXN0ZWQKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJtcHU0MDEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgdWFydDQwMV9kZXZjCit7CisJaW50ICAgICAgICAgICAgIGJhc2U7CisJaW50ICAgICAgICAgICAgIGlycTsKKwlpbnQgICAgICAgICAgICAqb3NwOworCXZvaWQgICAgICAgICAgICAoKm1pZGlfaW5wdXRfaW50cikgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSk7CisJaW50ICAgICAgICAgICAgIG9wZW5lZCwgZGlzYWJsZWQ7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBpbnB1dF9ieXRlOworCWludCAgICAgICAgICAgICBteV9kZXY7CisJaW50ICAgICAgICAgICAgIHNoYXJlX2lycTsKKwlzcGlubG9ja190CWxvY2s7Cit9Cit1YXJ0NDAxX2RldmM7CisKKyNkZWZpbmUJREFUQVBPUlQgICAoZGV2Yy0+YmFzZSkKKyNkZWZpbmUJQ09NRFBPUlQgICAoZGV2Yy0+YmFzZSsxKQorI2RlZmluZQlTVEFUUE9SVCAgIChkZXZjLT5iYXNlKzEpCisKK3N0YXRpYyBpbnQgdWFydDQwMV9zdGF0dXModWFydDQwMV9kZXZjICogZGV2YykKK3sKKwlyZXR1cm4gaW5iKFNUQVRQT1JUKTsKK30KKworI2RlZmluZSBpbnB1dF9hdmFpbChkZXZjKSAoISh1YXJ0NDAxX3N0YXR1cyhkZXZjKSZJTlBVVF9BVkFJTCkpCisjZGVmaW5lIG91dHB1dF9yZWFkeShkZXZjKQkoISh1YXJ0NDAxX3N0YXR1cyhkZXZjKSZPVVRQVVRfUkVBRFkpKQorCitzdGF0aWMgdm9pZCB1YXJ0NDAxX2NtZCh1YXJ0NDAxX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwlvdXRiKChjbWQpLCBDT01EUE9SVCk7Cit9CisKK3N0YXRpYyBpbnQgdWFydDQwMV9yZWFkKHVhcnQ0MDFfZGV2YyAqIGRldmMpCit7CisJcmV0dXJuIGluYihEQVRBUE9SVCk7Cit9CisKK3N0YXRpYyB2b2lkIHVhcnQ0MDFfd3JpdGUodWFydDQwMV9kZXZjICogZGV2YywgdW5zaWduZWQgY2hhciBieXRlKQoreworCW91dGIoKGJ5dGUpLCBEQVRBUE9SVCk7Cit9CisKKyNkZWZpbmUJT1VUUFVUX1JFQURZCTB4NDAKKyNkZWZpbmUJSU5QVVRfQVZBSUwJMHg4MAorI2RlZmluZQlNUFVfQUNLCQkweEZFCisjZGVmaW5lCU1QVV9SRVNFVAkweEZGCisjZGVmaW5lCVVBUlRfTU9ERV9PTgkweDNGCisKK3N0YXRpYyBpbnQgICAgICByZXNldF91YXJ0NDAxKHVhcnQ0MDFfZGV2YyAqIGRldmMpOworc3RhdGljIHZvaWQgICAgIGVudGVyX3VhcnRfbW9kZSh1YXJ0NDAxX2RldmMgKiBkZXZjKTsKKworc3RhdGljIHZvaWQgdWFydDQwMV9pbnB1dF9sb29wKHVhcnQ0MDFfZGV2YyAqIGRldmMpCit7CisJaW50IHdvcmtfbGltaXQ9MzAwMDA7CisJCisJd2hpbGUgKGlucHV0X2F2YWlsKGRldmMpICYmIC0td29ya19saW1pdCkKKwl7CisJCXVuc2lnbmVkIGNoYXIgICBjID0gdWFydDQwMV9yZWFkKGRldmMpOworCisJCWlmIChjID09IE1QVV9BQ0spCisJCQlkZXZjLT5pbnB1dF9ieXRlID0gYzsKKwkJZWxzZSBpZiAoZGV2Yy0+b3BlbmVkICYgT1BFTl9SRUFEICYmIGRldmMtPm1pZGlfaW5wdXRfaW50cikKKwkJCWRldmMtPm1pZGlfaW5wdXRfaW50cihkZXZjLT5teV9kZXYsIGMpOworCX0KKwlpZih3b3JrX2xpbWl0PT0wKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJUb28gbXVjaCB3b3JrIGluIGludGVycnVwdCBvbiB1YXJ0NDAxICgweCVYKS4gVUFSVCBqYWJiZXJpbmcgPz9cbiIsIGRldmMtPmJhc2UpOworfQorCitpcnFyZXR1cm5fdCB1YXJ0NDAxaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpkdW1teSkKK3sKKwl1YXJ0NDAxX2RldmMgKmRldmMgPSBkZXZfaWQ7CisKKwlpZiAoZGV2YyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1YXJ0NDAxOiBiYWQgZGV2Y1xuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoaW5wdXRfYXZhaWwoZGV2YykpCisJCXVhcnQ0MDFfaW5wdXRfbG9vcChkZXZjKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK3VhcnQ0MDFfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSwKKwkgICAgIHZvaWQgICAgICAgICAgICAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKKwkgICAgIHZvaWQgICAgICAgICAgICAoKm91dHB1dCkgKGludCBkZXYpCispCit7CisJdWFydDQwMV9kZXZjICpkZXZjID0gKHVhcnQ0MDFfZGV2YyAqKSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmIChkZXZjLT5vcGVuZWQpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBGbHVzaCB0aGUgVUFSVCAqLworCQorCXdoaWxlIChpbnB1dF9hdmFpbChkZXZjKSkKKwkJdWFydDQwMV9yZWFkKGRldmMpOworCisJZGV2Yy0+bWlkaV9pbnB1dF9pbnRyID0gaW5wdXQ7CisJZGV2Yy0+b3BlbmVkID0gbW9kZTsKKwllbnRlcl91YXJ0X21vZGUoZGV2Yyk7CisJZGV2Yy0+ZGlzYWJsZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVhcnQ0MDFfY2xvc2UoaW50IGRldikKK3sKKwl1YXJ0NDAxX2RldmMgKmRldmMgPSAodWFydDQwMV9kZXZjICopIG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCisJcmVzZXRfdWFydDQwMShkZXZjKTsKKwlkZXZjLT5vcGVuZWQgPSAwOworfQorCitzdGF0aWMgaW50IHVhcnQ0MDFfb3V0KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKQoreworCWludCB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWFydDQwMV9kZXZjICpkZXZjID0gKHVhcnQ0MDFfZGV2YyAqKSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmIChkZXZjLT5kaXNhYmxlZCkKKwkJcmV0dXJuIDE7CisJLyoKKwkgKiBUZXN0IGZvciBpbnB1dCBzaW5jZSBwZW5kaW5nIGlucHV0IHNlZW1zIHRvIGJsb2NrIHRoZSBvdXRwdXQuCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CQorCWlmIChpbnB1dF9hdmFpbChkZXZjKSkKKwkJdWFydDQwMV9pbnB1dF9sb29wKGRldmMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwkvKgorCSAqIFNvbWV0aW1lcyBpdCB0YWtlcyBhYm91dCAxMzAwMCBsb29wcyBiZWZvcmUgdGhlIG91dHB1dCBiZWNvbWVzIHJlYWR5CisJICogKEFmdGVyIHJlc2V0KS4gTm9ybWFsbHkgaXQgdGFrZXMganVzdCBhYm91dCAxMCBsb29wcy4KKwkgKi8KKworCWZvciAodGltZW91dCA9IDMwMDAwOyB0aW1lb3V0ID4gMCAmJiAhb3V0cHV0X3JlYWR5KGRldmMpOyB0aW1lb3V0LS0pOworCisJaWYgKCFvdXRwdXRfcmVhZHkoZGV2YykpCisJeworCQkgIHByaW50ayhLRVJOX1dBUk5JTkcgInVhcnQ0MDE6IFRpbWVvdXQgLSBEZXZpY2Ugbm90IHJlc3BvbmRpbmdcbiIpOworCQkgIGRldmMtPmRpc2FibGVkID0gMTsKKwkJICByZXNldF91YXJ0NDAxKGRldmMpOworCQkgIGVudGVyX3VhcnRfbW9kZShkZXZjKTsKKwkJICByZXR1cm4gMTsKKwl9CisJdWFydDQwMV93cml0ZShkZXZjLCBtaWRpX2J5dGUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCB1YXJ0NDAxX3N0YXJ0X3JlYWQoaW50IGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdWFydDQwMV9lbmRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWFydDQwMV9raWNrKGludCBkZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVhcnQ0MDFfYnVmZmVyX3N0YXR1cyhpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1JRElfU1lOVEhfTkFNRQkiTVBVLTQwMSBVQVJUIgorI2RlZmluZSBNSURJX1NZTlRIX0NBUFMJU1lOVEhfQ0FQX0lOUFVUCisjaW5jbHVkZSAibWlkaV9zeW50aC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pZGlfb3BlcmF0aW9ucyB1YXJ0NDAxX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7Ik1QVS00MDEgKFVBUlQpIE1JREkiLCAwLCAwLCBTTkRDQVJEX01QVTQwMX0sCisJLmNvbnZlcnRlcgk9ICZzdGRfbWlkaV9zeW50aCwKKwkuaW5faW5mbwk9IHswfSwKKwkub3BlbgkJPSB1YXJ0NDAxX29wZW4sCisJLmNsb3NlCQk9IHVhcnQ0MDFfY2xvc2UsCisJLm91dHB1dGMJPSB1YXJ0NDAxX291dCwKKwkuc3RhcnRfcmVhZAk9IHVhcnQ0MDFfc3RhcnRfcmVhZCwKKwkuZW5kX3JlYWQJPSB1YXJ0NDAxX2VuZF9yZWFkLAorCS5raWNrCQk9IHVhcnQ0MDFfa2ljaywKKwkuYnVmZmVyX3N0YXR1cwk9IHVhcnQ0MDFfYnVmZmVyX3N0YXR1cywKK307CisKK3N0YXRpYyB2b2lkIGVudGVyX3VhcnRfbW9kZSh1YXJ0NDAxX2RldmMgKiBkZXZjKQoreworCWludCBvaywgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwkKKwlmb3IgKHRpbWVvdXQgPSAzMDAwMDsgdGltZW91dCA+IDAgJiYgIW91dHB1dF9yZWFkeShkZXZjKTsgdGltZW91dC0tKTsKKworCWRldmMtPmlucHV0X2J5dGUgPSAwOworCXVhcnQ0MDFfY21kKGRldmMsIFVBUlRfTU9ERV9PTik7CisKKwlvayA9IDA7CisJZm9yICh0aW1lb3V0ID0gNTAwMDA7IHRpbWVvdXQgPiAwICYmICFvazsgdGltZW91dC0tKQorCQlpZiAoZGV2Yy0+aW5wdXRfYnl0ZSA9PSBNUFVfQUNLKQorCQkJb2sgPSAxOworCQllbHNlIGlmIChpbnB1dF9hdmFpbChkZXZjKSkKKwkJCWlmICh1YXJ0NDAxX3JlYWQoZGV2YykgPT0gTVBVX0FDSykKKwkJCQlvayA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCByZXNldF91YXJ0NDAxKHVhcnQ0MDFfZGV2YyAqIGRldmMpCit7CisJaW50IG9rLCB0aW1lb3V0LCBuOworCisJLyoKKwkgKiBTZW5kIHRoZSBSRVNFVCBjb21tYW5kLiBUcnkgYWdhaW4gaWYgbm8gc3VjY2VzcyBhdCB0aGUgZmlyc3QgdGltZS4KKwkgKi8KKworCW9rID0gMDsKKworCWZvciAobiA9IDA7IG4gPCAyICYmICFvazsgbisrKQorCXsKKwkJZm9yICh0aW1lb3V0ID0gMzAwMDA7IHRpbWVvdXQgPiAwICYmICFvdXRwdXRfcmVhZHkoZGV2Yyk7IHRpbWVvdXQtLSk7CisJCWRldmMtPmlucHV0X2J5dGUgPSAwOworCQl1YXJ0NDAxX2NtZChkZXZjLCBNUFVfUkVTRVQpOworCisJCS8qCisJCSAqIFdhaXQgYXQgbGVhc3QgMjUgbXNlYy4gVGhpcyBtZXRob2QgaXMgbm90IGFjY3VyYXRlIHNvIGxldCdzIG1ha2UgdGhlCisJCSAqIGxvb3AgYml0IGxvbmdlci4gQ2Fubm90IHNsZWVwIHNpbmNlIHRoaXMgaXMgY2FsbGVkIGR1cmluZyBib290LgorCQkgKi8KKworCQlmb3IgKHRpbWVvdXQgPSA1MDAwMDsgdGltZW91dCA+IDAgJiYgIW9rOyB0aW1lb3V0LS0pCisJCXsKKwkJCWlmIChkZXZjLT5pbnB1dF9ieXRlID09IE1QVV9BQ0spCS8qIEludGVycnVwdCAqLworCQkJCW9rID0gMTsKKwkJCWVsc2UgaWYgKGlucHV0X2F2YWlsKGRldmMpKQorCQkJeworCQkJCWlmICh1YXJ0NDAxX3JlYWQoZGV2YykgPT0gTVBVX0FDSykKKwkJCQkJb2sgPSAxOworCQkJfQorCQl9CisJfQorCisKKwlpZiAob2spCisJeworCQlERUIocHJpbnRrKCJSZXNldCBVQVJUNDAxIE9LXG4iKSk7CisJfQorCWVsc2UKKwkJRERCKHByaW50aygiUmVzZXQgVUFSVDQwMSBmYWlsZWQgLSBObyBoYXJkd2FyZSBkZXRlY3RlZC5cbiIpKTsKKworCWlmIChvaykKKwkJdWFydDQwMV9pbnB1dF9sb29wKGRldmMpOwkvKgorCQkJCQkJICogRmx1c2ggaW5wdXQgYmVmb3JlIGVuYWJsaW5nIGludGVycnVwdHMKKwkJCQkJCSAqLworCisJcmV0dXJuIG9rOworfQorCitpbnQgcHJvYmVfdWFydDQwMShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCXVhcnQ0MDFfZGV2YyAqZGV2YzsKKwljaGFyICpuYW1lID0gIk1QVS00MDEgKFVBUlQpIE1JREkiOworCWludCBvayA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUREQihwcmludGsoIkVudGVyZWQgcHJvYmVfdWFydDQwMSgpXG4iKSk7CisKKwkvKiBEZWZhdWx0IHRvICJub3QgZm91bmQiICovCisJaHdfY29uZmlnLT5zbG90c1s0XSA9IC0xOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDQsICJNUFUtNDAxIFVBUlQiKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJ1YXJ0NDAxOiBjb3VsZCBub3QgcmVxdWVzdF9yZWdpb24oJWQsIDQpXG4iLCBod19jb25maWctPmlvX2Jhc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZjID0ga21hbGxvYyhzaXplb2YodWFydDQwMV9kZXZjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZjKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInVhcnQ0MDE6IENhbid0IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWdvdG8gY2xlYW51cF9yZWdpb247CisJfQorCisJZGV2Yy0+YmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKwlkZXZjLT5pcnEgPSBod19jb25maWctPmlycTsKKwlkZXZjLT5vc3AgPSBod19jb25maWctPm9zcDsKKwlkZXZjLT5taWRpX2lucHV0X2ludHIgPSBOVUxMOworCWRldmMtPm9wZW5lZCA9IDA7CisJZGV2Yy0+aW5wdXRfYnl0ZSA9IDA7CisJZGV2Yy0+bXlfZGV2ID0gMDsKKwlkZXZjLT5zaGFyZV9pcnEgPSAwOworCXNwaW5fbG9ja19pbml0KCZkZXZjLT5sb2NrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsJCisJb2sgPSByZXNldF91YXJ0NDAxKGRldmMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCisJaWYgKCFvaykKKwkJZ290byBjbGVhbnVwX2RldmM7CisKKwlpZiAoaHdfY29uZmlnLT5uYW1lKQorCQluYW1lID0gaHdfY29uZmlnLT5uYW1lOworCisJaWYgKGRldmMtPmlycSA8IDApIHsKKwkJZGV2Yy0+c2hhcmVfaXJxID0gMTsKKwkJZGV2Yy0+aXJxICo9IC0xOworCX0gZWxzZQorCQlkZXZjLT5zaGFyZV9pcnEgPSAwOworCisJaWYgKCFkZXZjLT5zaGFyZV9pcnEpCisJCWlmIChyZXF1ZXN0X2lycShkZXZjLT5pcnEsIHVhcnQ0MDFpbnRyLCAwLCAiTVBVLTQwMSBVQVJUIiwgZGV2YykgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ1YXJ0NDAxOiBGYWlsZWQgdG8gYWxsb2NhdGUgSVJRJWRcbiIsIGRldmMtPmlycSk7CisJCQlkZXZjLT5zaGFyZV9pcnEgPSAxOworCQl9CisJZGV2Yy0+bXlfZGV2ID0gc291bmRfYWxsb2NfbWlkaWRldigpOworCWVudGVyX3VhcnRfbW9kZShkZXZjKTsKKworCWlmIChkZXZjLT5teV9kZXYgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidWFydDQwMTogVG9vIG1hbnkgbWlkaSBkZXZpY2VzIGRldGVjdGVkXG4iKTsKKwkJZ290byBjbGVhbnVwX2lycTsKKwl9CisJY29uZl9wcmludGYobmFtZSwgaHdfY29uZmlnKTsKKwltaWRpX2RldnNbZGV2Yy0+bXlfZGV2XSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1pZGlfZGV2c1tkZXZjLT5teV9kZXZdKSB7CisJCXByaW50ayhLRVJOX0VSUiAidWFydDQwMTogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWdvdG8gY2xlYW51cF91bmxvYWRfbWlkaWRldjsKKwl9CisJbWVtY3B5KG1pZGlfZGV2c1tkZXZjLT5teV9kZXZdLCAmdWFydDQwMV9vcGVyYXRpb25zLCBzaXplb2Yoc3RydWN0IG1pZGlfb3BlcmF0aW9ucykpOworCisJaWYgKG93bmVyKQorCQltaWRpX2RldnNbZGV2Yy0+bXlfZGV2XS0+b3duZXIgPSBvd25lcjsKKwkKKwltaWRpX2RldnNbZGV2Yy0+bXlfZGV2XS0+ZGV2YyA9IGRldmM7CisJbWlkaV9kZXZzW2RldmMtPm15X2Rldl0tPmNvbnZlcnRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtaWRpX2RldnNbZGV2Yy0+bXlfZGV2XS0+Y29udmVydGVyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInVhcnQ0MDE6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlnb3RvIGNsZWFudXBfbWlkaV9kZXZzOworCX0KKwltZW1jcHkobWlkaV9kZXZzW2RldmMtPm15X2Rldl0tPmNvbnZlcnRlciwgJnN0ZF9taWRpX3N5bnRoLCBzaXplb2Yoc3RydWN0IHN5bnRoX29wZXJhdGlvbnMpKTsKKwlzdHJjcHkobWlkaV9kZXZzW2RldmMtPm15X2Rldl0tPmluZm8ubmFtZSwgbmFtZSk7CisJbWlkaV9kZXZzW2RldmMtPm15X2Rldl0tPmNvbnZlcnRlci0+aWQgPSAiVUFSVDQwMSI7CisJbWlkaV9kZXZzW2RldmMtPm15X2Rldl0tPmNvbnZlcnRlci0+bWlkaV9kZXYgPSBkZXZjLT5teV9kZXY7CisKKwlpZiAob3duZXIpCisJCW1pZGlfZGV2c1tkZXZjLT5teV9kZXZdLT5jb252ZXJ0ZXItPm93bmVyID0gb3duZXI7CisKKwlod19jb25maWctPnNsb3RzWzRdID0gZGV2Yy0+bXlfZGV2OworCXNlcXVlbmNlcl9pbml0KCk7CisJZGV2Yy0+b3BlbmVkID0gMDsKKwlyZXR1cm4gMTsKK2NsZWFudXBfbWlkaV9kZXZzOgorCWtmcmVlKG1pZGlfZGV2c1tkZXZjLT5teV9kZXZdKTsKK2NsZWFudXBfdW5sb2FkX21pZGlkZXY6CisJc291bmRfdW5sb2FkX21pZGlkZXYoZGV2Yy0+bXlfZGV2KTsKK2NsZWFudXBfaXJxOgorCWlmICghZGV2Yy0+c2hhcmVfaXJxKQorCQlmcmVlX2lycShkZXZjLT5pcnEsIGRldmMpOworY2xlYW51cF9kZXZjOgorCWtmcmVlKGRldmMpOworY2xlYW51cF9yZWdpb246CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB1bmxvYWRfdWFydDQwMShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdWFydDQwMV9kZXZjICpkZXZjOworCWludCBuPWh3X2NvbmZpZy0+c2xvdHNbNF07CisJCisJLyogTm90IHNldCB1cCAqLworCWlmKG49PS0xIHx8IG1pZGlfZGV2c1tuXT09TlVMTCkKKwkJcmV0dXJuOworCQkKKwkvKiBOb3QgYWxsb2NhdGVkIChlcm0gPz8pICovCisJCisJZGV2YyA9IG1pZGlfZGV2c1tod19jb25maWctPnNsb3RzWzRdXS0+ZGV2YzsKKwlpZiAoZGV2YyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlyZXNldF91YXJ0NDAxKGRldmMpOworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCk7CisKKwlpZiAoIWRldmMtPnNoYXJlX2lycSkKKwkJZnJlZV9pcnEoZGV2Yy0+aXJxLCBkZXZjKTsKKwlpZiAoZGV2YykKKwl7CisJCWtmcmVlKG1pZGlfZGV2c1tkZXZjLT5teV9kZXZdLT5jb252ZXJ0ZXIpOworCQlrZnJlZShtaWRpX2RldnNbZGV2Yy0+bXlfZGV2XSk7CisJCWtmcmVlKGRldmMpOworCQlkZXZjID0gTlVMTDsKKwl9CisJLyogVGhpcyBraWxscyBtaWRpX2RldnNbeF0gKi8KKwlzb3VuZF91bmxvYWRfbWlkaWRldihod19jb25maWctPnNsb3RzWzRdKTsKK30KKworRVhQT1JUX1NZTUJPTChwcm9iZV91YXJ0NDAxKTsKK0VYUE9SVF9TWU1CT0wodW5sb2FkX3VhcnQ0MDEpOworRVhQT1JUX1NZTUJPTCh1YXJ0NDAxaW50cik7CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZ19tcHU7CisKK3N0YXRpYyBpbnQgaW8gPSAtMTsKK3N0YXRpYyBpbnQgaXJxID0gLTE7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMDQ0NCk7CisKKworc3RhdGljIGludCBfX2luaXQgaW5pdF91YXJ0NDAxKHZvaWQpCit7CisJY2ZnX21wdS5pcnEgPSBpcnE7CisJY2ZnX21wdS5pb19iYXNlID0gaW87CisKKwkvKiBDYW4gYmUgbG9hZGVkIGVpdGhlciBmb3IgbW9kdWxlIHVzZSBvciB0byBwcm92aWRlIGZ1bmN0aW9ucworCSAgIHRvIG90aGVycyAqLworCWlmIChjZmdfbXB1LmlvX2Jhc2UgIT0gLTEgJiYgY2ZnX21wdS5pcnEgIT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVBVLTQwMSBVQVJUIGRyaXZlciBDb3B5cmlnaHQgKEMpIEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3Iik7CisJCWlmICghcHJvYmVfdWFydDQwMSgmY2ZnX21wdSwgVEhJU19NT0RVTEUpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3VhcnQ0MDEodm9pZCkKK3sKKwlpZiAoY2ZnX21wdS5pb19iYXNlICE9IC0xICYmIGNmZ19tcHUuaXJxICE9IC0xKQorCQl1bmxvYWRfdWFydDQwMSgmY2ZnX21wdSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdWFydDQwMSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX3VhcnQ0MDEpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfdWFydDQwMShjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSAqLworCWludCBpbnRzWzNdOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpbyA9IGludHNbMV07CisJaXJxID0gaW50c1syXTsKKwkKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgidWFydDQwMT0iLCBzZXR1cF91YXJ0NDAxKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3VhcnQ2ODUwLmMgYi9zb3VuZC9vc3MvdWFydDY4NTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTAwY2YxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3VhcnQ2ODUwLmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiBzb3VuZC91YXJ0Njg1MC5jCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICogRXh0ZW5kZWQgYnkgQWxhbiBDb3ggZm9yIFJlZCBIYXQgU29mdHdhcmUuIE5vdyBhIGxvYWRhYmxlIE1JREkgZHJpdmVyLgorICogMjgvNC85NyAtIChDKSBDb3B5cmlnaHQgQWxhbiBDb3guIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgdmVyc2lvbiAyLgorICoKKyAqIEFsYW4gQ294OgkJVXBkYXRlZCBmb3IgbmV3IG1vZHVsYXIgY29kZS4gUmVtb3ZlZCBzbmRfKiBpcnEgaGFuZGxpbmcuIE5vdworICoJCQl1c2VzIG5hdGl2ZSBsaW51eCByZXNvdXJjZXMKKyAqIENocmlzdG9waCBIZWxsd2lnOglBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKiBKZWZmIEdhcnppazoJCU1hZGUgaXQgd29yayBhZ2FpbiwgaW4gdGhlb3J5CisgKgkJCUZJWE1FOiBJZiB0aGUgcmVxdWVzdF9pcnEoKSBzdWNjZWVkcywgdGhlIHByb2JlIHN1Y2NlZWRzLiBVZy4KKyAqCisgKglTdGF0dXM6IFRlc3RpbmcgcmVxdWlyZWQgKG5vIHNoaXQgLWpnYXJ6aWspCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisvKiBNb24gTm92IDIyIDIyOjM4OjM1IE1FVCAxOTkzIG1hcmNvQGRyaXEuaG9tZS51c24ubmw6CisgKiAgICAgIGFkZGVkIDY4NTAgc3VwcG9ydCwgdXNlZCB3aXRoIENPVk9YIFNvdW5kTWFzdGVyIElJIGFuZCBjdXN0b20gY2FyZHMuCisgKi8KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCitzdGF0aWMgaW50IHVhcnQ2ODUwX2Jhc2UgPSAweDMzMDsKKworc3RhdGljIGludCAqdWFydDY4NTBfb3NwOworCisjZGVmaW5lCURBVEFQT1JUICAgKHVhcnQ2ODUwX2Jhc2UpCisjZGVmaW5lCUNPTURQT1JUICAgKHVhcnQ2ODUwX2Jhc2UrMSkKKyNkZWZpbmUJU1RBVFBPUlQgICAodWFydDY4NTBfYmFzZSsxKQorCitzdGF0aWMgaW50IHVhcnQ2ODUwX3N0YXR1cyh2b2lkKQoreworCXJldHVybiBpbmIoU1RBVFBPUlQpOworfQorCisjZGVmaW5lIGlucHV0X2F2YWlsKCkJCSh1YXJ0Njg1MF9zdGF0dXMoKSZJTlBVVF9BVkFJTCkKKyNkZWZpbmUgb3V0cHV0X3JlYWR5KCkJCSh1YXJ0Njg1MF9zdGF0dXMoKSZPVVRQVVRfUkVBRFkpCisKK3N0YXRpYyB2b2lkIHVhcnQ2ODUwX2NtZCh1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwlvdXRiKGNtZCwgQ09NRFBPUlQpOworfQorCitzdGF0aWMgaW50IHVhcnQ2ODUwX3JlYWQodm9pZCkKK3sKKwlyZXR1cm4gaW5iKERBVEFQT1JUKTsKK30KKworc3RhdGljIHZvaWQgdWFydDY4NTBfd3JpdGUodW5zaWduZWQgY2hhciBieXRlKQoreworCW91dGIoYnl0ZSwgREFUQVBPUlQpOworfQorCisjZGVmaW5lCU9VVFBVVF9SRUFEWQkweDAyCS8qIE1hc2sgZm9yIGRhdGEgcmVhZHkgQml0ICovCisjZGVmaW5lCUlOUFVUX0FWQUlMCTB4MDEJLyogTWFzayBmb3IgRGF0YSBTZW5kIFJlYWR5IEJpdCAqLworCisjZGVmaW5lCVVBUlRfUkVTRVQJMHg5NQorI2RlZmluZQlVQVJUX01PREVfT04JMHgwMworCitzdGF0aWMgaW50IHVhcnQ2ODUwX29wZW5lZDsKK3N0YXRpYyBpbnQgdWFydDY4NTBfaXJxOworc3RhdGljIGludCB1YXJ0Njg1MF9kZXRlY3RlZDsKK3N0YXRpYyBpbnQgbXlfZGV2Oworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworc3RhdGljIHZvaWQgKCptaWRpX2lucHV0X2ludHIpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpOworc3RhdGljIHZvaWQgcG9sbF91YXJ0Njg1MCh1bnNpZ25lZCBsb25nIGR1bW15KTsKKworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdWFydDY4NTBfdGltZXIgPQorCQlUSU1FUl9JTklUSUFMSVpFUihwb2xsX3VhcnQ2ODUwLCAwLCAwKTsKKworc3RhdGljIHZvaWQgdWFydDY4NTBfaW5wdXRfbG9vcCh2b2lkKQoreworCWludCBjb3VudCA9IDEwOworCisJd2hpbGUgKGNvdW50KQorCXsKKwkJLyoKKwkJICogTm90IHRpbWVkIG91dAorCQkgKi8KKwkJaWYgKGlucHV0X2F2YWlsKCkpCisJCXsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9IHVhcnQ2ODUwX3JlYWQoKTsKKwkJCWNvdW50ID0gMTAwOworCQkJaWYgKHVhcnQ2ODUwX29wZW5lZCAmIE9QRU5fUkVBRCkKKwkJCQltaWRpX2lucHV0X2ludHIobXlfZGV2LCBjKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXdoaWxlICghaW5wdXRfYXZhaWwoKSAmJiBjb3VudCkKKwkJCQljb3VudC0tOworCQl9CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbTY4NTBpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KQoreworCWlmIChpbnB1dF9hdmFpbCgpKQorCQl1YXJ0Njg1MF9pbnB1dF9sb29wKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICoJSXQgbG9va3MgbGlrZSB0aGVyZSBpcyBubyBpbnB1dCBpbnRlcnJ1cHRzIGluIHRoZSBVQVJUIG1vZGUuIExldCdzIHRyeQorICoJcG9sbGluZy4KKyAqLworCitzdGF0aWMgdm9pZCBwb2xsX3VhcnQ2ODUwKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghKHVhcnQ2ODUwX29wZW5lZCAmIE9QRU5fUkVBRCkpCisJCXJldHVybjsJCS8qIERldmljZSBoYXMgYmVlbiBjbG9zZWQgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwlpZiAoaW5wdXRfYXZhaWwoKSkKKwkJdWFydDY4NTBfaW5wdXRfbG9vcCgpOworCisJdWFydDY4NTBfdGltZXIuZXhwaXJlcyA9IDEgKyBqaWZmaWVzOworCWFkZF90aW1lcigmdWFydDY4NTBfdGltZXIpOworCQorCS8qCisJICoJQ29tZSBiYWNrIGxhdGVyCisJICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCB1YXJ0Njg1MF9vcGVuKGludCBkZXYsIGludCBtb2RlLAorCSAgICAgIHZvaWQgICAgICAgICAgICAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKKwkgICAgICB2b2lkICAgICAgICAgICAgKCpvdXRwdXQpIChpbnQgZGV2KQorKQoreworCWlmICh1YXJ0Njg1MF9vcGVuZWQpCisJeworLyoJCSAgcHJpbnRrKCJNaWRpNjg1MDogTWlkaSBidXN5XG4iKTsqLworCQkgIHJldHVybiAtRUJVU1k7CisJfTsKKworCXVhcnQ2ODUwX2NtZChVQVJUX1JFU0VUKTsKKwl1YXJ0Njg1MF9pbnB1dF9sb29wKCk7CisJbWlkaV9pbnB1dF9pbnRyID0gaW5wdXQ7CisJdWFydDY4NTBfb3BlbmVkID0gbW9kZTsKKwlwb2xsX3VhcnQ2ODUwKDApOwkvKgorCQkJCSAqIEVuYWJsZSBpbnB1dCBwb2xsaW5nCisJCQkJICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdWFydDY4NTBfY2xvc2UoaW50IGRldikKK3sKKwl1YXJ0Njg1MF9jbWQoVUFSVF9NT0RFX09OKTsKKwlkZWxfdGltZXIoJnVhcnQ2ODUwX3RpbWVyKTsKKwl1YXJ0Njg1MF9vcGVuZWQgPSAwOworfQorCitzdGF0aWMgaW50IHVhcnQ2ODUwX291dChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKK3sKKwlpbnQgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBUZXN0IGZvciBpbnB1dCBzaW5jZSBwZW5kaW5nIGlucHV0IHNlZW1zIHRvIGJsb2NrIHRoZSBvdXRwdXQuCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisKKwlpZiAoaW5wdXRfYXZhaWwoKSkKKwkJdWFydDY4NTBfaW5wdXRfbG9vcCgpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisKKwkvKgorCSAqIFNvbWV0aW1lcyBpdCB0YWtlcyBhYm91dCAxMzAwMCBsb29wcyBiZWZvcmUgdGhlIG91dHB1dCBiZWNvbWVzIHJlYWR5CisJICogKEFmdGVyIHJlc2V0KS4gTm9ybWFsbHkgaXQgdGFrZXMganVzdCBhYm91dCAxMCBsb29wcy4KKwkgKi8KKworCWZvciAodGltZW91dCA9IDMwMDAwOyB0aW1lb3V0ID4gMCAmJiAhb3V0cHV0X3JlYWR5KCk7IHRpbWVvdXQtLSk7CS8qCisJCQkJCQkJCQkJICogV2FpdAorCQkJCQkJCQkJCSAqLworCWlmICghb3V0cHV0X3JlYWR5KCkpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNaWRpNjg1MDogVGltZW91dFxuIik7CisJCXJldHVybiAwOworCX0KKwl1YXJ0Njg1MF93cml0ZShtaWRpX2J5dGUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCB1YXJ0Njg1MF9jb21tYW5kKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKm1pZGlfYnl0ZSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdWFydDY4NTBfc3RhcnRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB1YXJ0Njg1MF9lbmRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWFydDY4NTBfa2ljayhpbnQgZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCB1YXJ0Njg1MF9idWZmZXJfc3RhdHVzKGludCBkZXYpCit7CisJcmV0dXJuIDA7CQkvKgorCQkJCSAqIE5vIGRhdGEgaW4gYnVmZmVycworCQkJCSAqLworfQorCisjZGVmaW5lIE1JRElfU1lOVEhfTkFNRQkiNjg1MCBVQVJUIE1pZGkiCisjZGVmaW5lIE1JRElfU1lOVEhfQ0FQUwlTWU5USF9DQVBfSU5QVVQKKyNpbmNsdWRlICJtaWRpX3N5bnRoLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIHVhcnQ2ODUwX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7IjY4NTAgVUFSVCIsIDAsIDAsIFNORENBUkRfVUFSVDY4NTB9LAorCS5jb252ZXJ0ZXIJPSAmc3RkX21pZGlfc3ludGgsCisJLmluX2luZm8JPSB7MH0sCisJLm9wZW4JCT0gdWFydDY4NTBfb3BlbiwKKwkuY2xvc2UJCT0gdWFydDY4NTBfY2xvc2UsCisJLm91dHB1dGMJPSB1YXJ0Njg1MF9vdXQsCisJLnN0YXJ0X3JlYWQJPSB1YXJ0Njg1MF9zdGFydF9yZWFkLAorCS5lbmRfcmVhZAk9IHVhcnQ2ODUwX2VuZF9yZWFkLAorCS5raWNrCQk9IHVhcnQ2ODUwX2tpY2ssCisJLmNvbW1hbmQJPSB1YXJ0Njg1MF9jb21tYW5kLAorCS5idWZmZXJfc3RhdHVzCT0gdWFydDY4NTBfYnVmZmVyX3N0YXR1cworfTsKKworCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX3VhcnQ2ODUwKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgb2ssIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJaWYgKCF1YXJ0Njg1MF9kZXRlY3RlZCkKKwkJcmV0dXJuOworCisJaWYgKChteV9kZXYgPSBzb3VuZF9hbGxvY19taWRpZGV2KCkpID09IC0xKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidWFydDY4NTA6IFRvbyBtYW55IG1pZGkgZGV2aWNlcyBkZXRlY3RlZFxuIik7CisJCXJldHVybjsKKwl9CisJdWFydDY4NTBfYmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKwl1YXJ0Njg1MF9vc3AgPSBod19jb25maWctPm9zcDsKKwl1YXJ0Njg1MF9pcnEgPSBod19jb25maWctPmlycTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKworCWZvciAodGltZW91dCA9IDMwMDAwOyB0aW1lb3V0ID4gMCAmJiAhb3V0cHV0X3JlYWR5KCk7IHRpbWVvdXQtLSk7CS8qCisJCQkJCQkJCQkJICogV2FpdAorCQkJCQkJCQkJCSAqLworCXVhcnQ2ODUwX2NtZChVQVJUX01PREVfT04pOworCW9rID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKworCWNvbmZfcHJpbnRmKCI2ODUwIE1pZGkgSW50ZXJmYWNlIiwgaHdfY29uZmlnKTsKKworCXN0ZF9taWRpX3N5bnRoLm1pZGlfZGV2ID0gbXlfZGV2OworCWh3X2NvbmZpZy0+c2xvdHNbNF0gPSBteV9kZXY7CisJbWlkaV9kZXZzW215X2Rldl0gPSAmdWFydDY4NTBfb3BlcmF0aW9uczsKKwlzZXF1ZW5jZXJfaW5pdCgpOworfQorCitzdGF0aWMgaW5saW5lIGludCByZXNldF91YXJ0Njg1MCh2b2lkKQoreworCXVhcnQ2ODUwX3JlYWQoKTsKKwlyZXR1cm4gMTsJCS8qCisJCQkJICogT0sKKwkJCQkgKi8KK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfdWFydDY4NTAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWludCBvazsKKworCXVhcnQ2ODUwX29zcCA9IGh3X2NvbmZpZy0+b3NwOworCXVhcnQ2ODUwX2Jhc2UgPSBod19jb25maWctPmlvX2Jhc2U7CisJdWFydDY4NTBfaXJxID0gaHdfY29uZmlnLT5pcnE7CisKKwlpZiAocmVxdWVzdF9pcnEodWFydDY4NTBfaXJxLCBtNjg1MGludHIsIDAsICJNSURJNjg1MCIsIE5VTEwpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlvayA9IHJlc2V0X3VhcnQ2ODUwKCk7CisJdWFydDY4NTBfZGV0ZWN0ZWQgPSBvazsKKwlyZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfdWFydDY4NTAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCBOVUxMKTsKKwlzb3VuZF91bmxvYWRfbWlkaWRldihod19jb25maWctPnNsb3RzWzRdKTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21wdTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGlvID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxID0gLTE7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdWFydDY4NTAodm9pZCkKK3sKKwljZmdfbXB1LmlvX2Jhc2UgPSBpbzsKKwljZmdfbXB1LmlycSA9IGlycTsKKworCWlmIChjZmdfbXB1LmlvX2Jhc2UgPT0gLTEgfHwgY2ZnX21wdS5pcnEgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidWFydDY4NTA6IGlycSBhbmQgaW8gbXVzdCBiZSBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHByb2JlX3VhcnQ2ODUwKCZjZmdfbXB1KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYXR0YWNoX3VhcnQ2ODUwKCZjZmdfbXB1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF91YXJ0Njg1MCh2b2lkKQoreworCXVubG9hZF91YXJ0Njg1MCgmY2ZnX21wdSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdWFydDY4NTApOworbW9kdWxlX2V4aXQoY2xlYW51cF91YXJ0Njg1MCk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF91YXJ0Njg1MChjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSAqLworCWludCBpbnRzWzNdOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisJaW8gPSBpbnRzWzFdOworCWlycSA9IGludHNbMl07CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInVhcnQ2ODUwPSIsIHNldHVwX3VhcnQ2ODUwKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3VsYXcuaCBiL3NvdW5kL29zcy91bGF3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmOGMwYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy91bGF3LmgKQEAgLTAsMCArMSw2OSBAQAorc3RhdGljIHVuc2lnbmVkIGNoYXIgdWxhd19kc3BbXSA9IHsKKyAgICAgMywgICAgNywgICAxMSwgICAxNSwgICAxOSwgICAyMywgICAyNywgICAzMSwKKyAgICAzNSwgICAzOSwgICA0MywgICA0NywgICA1MSwgICA1NSwgICA1OSwgICA2MywKKyAgICA2NiwgICA2OCwgICA3MCwgICA3MiwgICA3NCwgICA3NiwgICA3OCwgICA4MCwKKyAgICA4MiwgICA4NCwgICA4NiwgICA4OCwgICA5MCwgICA5MiwgICA5NCwgICA5NiwKKyAgICA5OCwgICA5OSwgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwKKyAgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwgIDExMiwgIDExMywKKyAgIDExMywgIDExNCwgIDExNCwgIDExNSwgIDExNSwgIDExNiwgIDExNiwgIDExNywKKyAgIDExNywgIDExOCwgIDExOCwgIDExOSwgIDExOSwgIDEyMCwgIDEyMCwgIDEyMSwKKyAgIDEyMSwgIDEyMSwgIDEyMiwgIDEyMiwgIDEyMiwgIDEyMiwgIDEyMywgIDEyMywKKyAgIDEyMywgIDEyMywgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNSwgIDEyNSwKKyAgIDEyNSwgIDEyNSwgIDEyNSwgIDEyNSwgIDEyNiwgIDEyNiwgIDEyNiwgIDEyNiwKKyAgIDEyNiwgIDEyNiwgIDEyNiwgIDEyNiwgIDEyNywgIDEyNywgIDEyNywgIDEyNywKKyAgIDEyNywgIDEyNywgIDEyNywgIDEyNywgIDEyNywgIDEyNywgIDEyNywgIDEyNywKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKKyAgIDI1MywgIDI0OSwgIDI0NSwgIDI0MSwgIDIzNywgIDIzMywgIDIyOSwgIDIyNSwKKyAgIDIyMSwgIDIxNywgIDIxMywgIDIwOSwgIDIwNSwgIDIwMSwgIDE5NywgIDE5MywKKyAgIDE5MCwgIDE4OCwgIDE4NiwgIDE4NCwgIDE4MiwgIDE4MCwgIDE3OCwgIDE3NiwKKyAgIDE3NCwgIDE3MiwgIDE3MCwgIDE2OCwgIDE2NiwgIDE2NCwgIDE2MiwgIDE2MCwKKyAgIDE1OCwgIDE1NywgIDE1NiwgIDE1NSwgIDE1NCwgIDE1MywgIDE1MiwgIDE1MSwKKyAgIDE1MCwgIDE0OSwgIDE0OCwgIDE0NywgIDE0NiwgIDE0NSwgIDE0NCwgIDE0MywKKyAgIDE0MywgIDE0MiwgIDE0MiwgIDE0MSwgIDE0MSwgIDE0MCwgIDE0MCwgIDEzOSwKKyAgIDEzOSwgIDEzOCwgIDEzOCwgIDEzNywgIDEzNywgIDEzNiwgIDEzNiwgIDEzNSwKKyAgIDEzNSwgIDEzNSwgIDEzNCwgIDEzNCwgIDEzNCwgIDEzNCwgIDEzMywgIDEzMywKKyAgIDEzMywgIDEzMywgIDEzMiwgIDEzMiwgIDEzMiwgIDEzMiwgIDEzMSwgIDEzMSwKKyAgIDEzMSwgIDEzMSwgIDEzMSwgIDEzMSwgIDEzMCwgIDEzMCwgIDEzMCwgIDEzMCwKKyAgIDEzMCwgIDEzMCwgIDEzMCwgIDEzMCwgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwKKyAgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRzcF91bGF3W10gPSB7CisgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDEsICAgIDEsICAgIDEsCisgICAgIDEsICAgIDIsICAgIDIsICAgIDIsICAgIDIsICAgIDMsICAgIDMsICAgIDMsCisgICAgIDMsICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDUsICAgIDUsICAgIDUsCisgICAgIDUsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgIDcsICAgIDcsICAgIDcsCisgICAgIDcsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDksICAgIDksICAgIDksCisgICAgIDksICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTEsICAgMTEsICAgMTEsCisgICAgMTEsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTMsICAgMTMsICAgMTMsCisgICAgMTMsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTUsICAgMTUsICAgMTUsCisgICAgMTUsICAgMTYsICAgMTYsICAgMTcsICAgMTcsICAgMTgsICAgMTgsICAgMTksCisgICAgMTksICAgMjAsICAgMjAsICAgMjEsICAgMjEsICAgMjIsICAgMjIsICAgMjMsCisgICAgMjMsICAgMjQsICAgMjQsICAgMjUsICAgMjUsICAgMjYsICAgMjYsICAgMjcsCisgICAgMjcsICAgMjgsICAgMjgsICAgMjksICAgMjksICAgMzAsICAgMzAsICAgMzEsCisgICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMzYsICAgMzcsICAgMzgsCisgICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsCisgICAgNDcsICAgNDksICAgNTEsICAgNTMsICAgNTUsICAgNTcsICAgNTksICAgNjEsCisgICAgNjMsICAgNjYsICAgNzAsICAgNzQsICAgNzgsICAgODQsICAgOTIsICAxMDQsCisgICAyNTQsICAyMzEsICAyMTksICAyMTEsICAyMDUsICAyMDEsICAxOTcsICAxOTMsCisgICAxOTAsICAxODgsICAxODYsICAxODQsICAxODIsICAxODAsICAxNzgsICAxNzYsCisgICAxNzUsICAxNzQsICAxNzMsICAxNzIsICAxNzEsICAxNzAsICAxNjksICAxNjgsCisgICAxNjcsICAxNjYsICAxNjUsICAxNjQsICAxNjMsICAxNjIsICAxNjEsICAxNjAsCisgICAxNTksICAxNTksICAxNTgsICAxNTgsICAxNTcsICAxNTcsICAxNTYsICAxNTYsCisgICAxNTUsICAxNTUsICAxNTQsICAxNTQsICAxNTMsICAxNTMsICAxNTIsICAxNTIsCisgICAxNTEsICAxNTEsICAxNTAsICAxNTAsICAxNDksICAxNDksICAxNDgsICAxNDgsCisgICAxNDcsICAxNDcsICAxNDYsICAxNDYsICAxNDUsICAxNDUsICAxNDQsICAxNDQsCisgICAxNDMsICAxNDMsICAxNDMsICAxNDMsICAxNDIsICAxNDIsICAxNDIsICAxNDIsCisgICAxNDEsICAxNDEsICAxNDEsICAxNDEsICAxNDAsICAxNDAsICAxNDAsICAxNDAsCisgICAxMzksICAxMzksICAxMzksICAxMzksICAxMzgsICAxMzgsICAxMzgsICAxMzgsCisgICAxMzcsICAxMzcsICAxMzcsICAxMzcsICAxMzYsICAxMzYsICAxMzYsICAxMzYsCisgICAxMzUsICAxMzUsICAxMzUsICAxMzUsICAxMzQsICAxMzQsICAxMzQsICAxMzQsCisgICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzIsICAxMzIsICAxMzIsICAxMzIsCisgICAxMzEsICAxMzEsICAxMzEsICAxMzEsICAxMzAsICAxMzAsICAxMzAsICAxMzAsCisgICAxMjksICAxMjksICAxMjksICAxMjksICAxMjgsICAxMjgsICAxMjgsICAxMjgsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3ZfbWlkaS5jIGIvc291bmQvb3NzL3ZfbWlkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2I3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvdl9taWRpLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBzb3VuZC92X21pZGkuYworICoKKyAqIFRoZSBsb3cgbGV2ZWwgZHJpdmVyIGZvciB0aGUgU291bmQgQmxhc3RlciBEUyBjaGlwcy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NgorICoKKyAqIFVTUy9MaXRlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKiA/PworICoKKyAqIENoYW5nZXMKKyAqCUFsYW4gQ294CQlNb2R1bGFyaXNhdGlvbiwgY2hhbmdlZCBtZW1vcnkgYWxsb2NhdGlvbnMKKyAqCUNocmlzdG9waCBIZWxsd2lnCUFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQKKyAqCisgKiBTdGF0dXMKKyAqCVVudGVzdGVkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAidl9taWRpLmgiCisKK3N0YXRpYyB2bWlkaV9kZXZjICp2X2RldmNbMl0gPSB7IE5VTEwsIE5VTEx9Oworc3RhdGljIGludCBtaWRpMSxtaWRpMjsKK3N0YXRpYyB2b2lkICptaWRpX21lbSA9IE5VTEw7CisKKy8qCisgKiBUaGUgRFNQIGNoYW5uZWwgY2FuIGJlIHVzZWQgZWl0aGVyIGZvciBpbnB1dCBvciBvdXRwdXQuIFZhcmlhYmxlCisgKiAnc2JfaXJxX21vZGUnIHdpbGwgYmUgc2V0IHdoZW4gdGhlIHByb2dyYW0gY2FsbHMgcmVhZCBvciB3cml0ZSBmaXJzdCB0aW1lCisgKiBhZnRlciBvcGVuLiBDdXJyZW50IHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IG1vZGUgY2hhbmdlcyB3aXRob3V0IGNsb3NpbmcKKyAqIGFuZCByZW9wZW5pbmcgdGhlIGRldmljZS4gU3VwcG9ydCBmb3IgdGhpcyBmZWF0dXJlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiBhCisgKiBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIGRyaXZlci4KKyAqLworCisKK3ZvaWQgICAgICAgICAgICAoKm1pZGlfaW5wdXRfaW50cikgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSk7CisKK3N0YXRpYyBpbnQgdl9taWRpX29wZW4gKGludCBkZXYsIGludCBtb2RlLAorCSAgICAgIHZvaWQgICAgICAgICAgICAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKKwkgICAgICB2b2lkICAgICAgICAgICAgKCpvdXRwdXQpIChpbnQgZGV2KQorKQoreworCXZtaWRpX2RldmMgKmRldmMgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRldmMgPT0gTlVMTCkKKwkJcmV0dXJuIC0oRU5YSU8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWlmIChkZXZjLT5vcGVuZWQpCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIC0oRUJVU1kpOworCX0KKwlkZXZjLT5vcGVuZWQgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCisJZGV2Yy0+aW50cl9hY3RpdmUgPSAxOworCisJaWYgKG1vZGUgJiBPUEVOX1JFQUQpCisJeworCQlkZXZjLT5pbnB1dF9vcGVuZWQgPSAxOworCQlkZXZjLT5taWRpX2lucHV0X2ludHIgPSBpbnB1dDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdl9taWRpX2Nsb3NlIChpbnQgZGV2KQoreworCXZtaWRpX2RldmMgKmRldmMgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRldmMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWRldmMtPmludHJfYWN0aXZlID0gMDsKKwlkZXZjLT5pbnB1dF9vcGVuZWQgPSAwOworCWRldmMtPm9wZW5lZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdl9taWRpX291dCAoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCit7CisJdm1pZGlfZGV2YyAqZGV2YyA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCXZtaWRpX2RldmMgKnBkZXZjOworCisJaWYgKGRldmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXBkZXZjID0gbWlkaV9kZXZzW2RldmMtPnBhaXJfbWlkaWRldl0tPmRldmM7CisJaWYgKHBkZXZjLT5pbnB1dF9vcGVuZWQgPiAwKXsKKwkJaWYgKE1JRElidWZfYXZhaWwocGRldmMtPm15X21pZGlkZXYpID4gNTAwKQorCQkJcmV0dXJuIDA7CisJCXBkZXZjLT5taWRpX2lucHV0X2ludHIgKHBkZXZjLT5teV9taWRpZGV2LCBtaWRpX2J5dGUpOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdl9taWRpX3N0YXJ0X3JlYWQgKGludCBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdl9taWRpX2VuZF9yZWFkIChpbnQgZGV2KQoreworCXZtaWRpX2RldmMgKmRldmMgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKwlpZiAoZGV2YyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOWElPOworCisJZGV2Yy0+aW50cl9hY3RpdmUgPSAwOworCXJldHVybiAwOworfQorCisvKiB3aHkgLUVQRVJNIGFuZCBub3QgLUVJTlZBTD8/ICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHZfbWlkaV9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXJldHVybiAtRVBFUk07Cit9CisKKworI2RlZmluZSBNSURJX1NZTlRIX05BTUUJIkxvb3BiYWNrIE1JREkiCisjZGVmaW5lIE1JRElfU1lOVEhfQ0FQUwlTWU5USF9DQVBfSU5QVVQKKworI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgdl9taWRpX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7Ikxvb3BiYWNrIE1JREkgUG9ydCAxIiwgMCwgMCwgU05EQ0FSRF9WTUlESX0sCisJLmNvbnZlcnRlcgk9ICZzdGRfbWlkaV9zeW50aCwKKwkuaW5faW5mbwk9IHswfSwKKwkub3BlbgkJPSB2X21pZGlfb3BlbiwKKwkuY2xvc2UJCT0gdl9taWRpX2Nsb3NlLAorCS5pb2N0bAkJPSB2X21pZGlfaW9jdGwsCisJLm91dHB1dGMJPSB2X21pZGlfb3V0LAorCS5zdGFydF9yZWFkCT0gdl9taWRpX3N0YXJ0X3JlYWQsCisJLmVuZF9yZWFkCT0gdl9taWRpX2VuZF9yZWFkLAorfTsKKworc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgdl9taWRpX29wZXJhdGlvbnMyID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmluZm8JCT0geyJMb29wYmFjayBNSURJIFBvcnQgMiIsIDAsIDAsIFNORENBUkRfVk1JREl9LAorCS5jb252ZXJ0ZXIJPSAmc3RkX21pZGlfc3ludGgsCisJLmluX2luZm8JPSB7MH0sCisJLm9wZW4JCT0gdl9taWRpX29wZW4sCisJLmNsb3NlCQk9IHZfbWlkaV9jbG9zZSwKKwkuaW9jdGwJCT0gdl9taWRpX2lvY3RsLAorCS5vdXRwdXRjCT0gdl9taWRpX291dCwKKwkuc3RhcnRfcmVhZAk9IHZfbWlkaV9zdGFydF9yZWFkLAorCS5lbmRfcmVhZAk9IHZfbWlkaV9lbmRfcmVhZCwKK307CisKKy8qCisgKglXZSBrbWFsbG9jIGp1c3Qgb25lIG9mIHRoZXNlIC0gaXQgbWFrZXMgbGlmZSBzaW1wbGVyIGFuZCB0aGUgY29kZQorICoJY2xlYW5lciBhbmQgdGhlIG1lbW9yeSBoYW5kbGluZyBmYXIgbW9yZSBlZmZpY2llbnQKKyAqLworIAorc3RydWN0IHZtaWRpX21lbW9yeQoreworCS8qIE11c3QgYmUgZmlyc3QgKi8KKwlzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIG1fb3BzWzJdOworCXN0cnVjdCBzeW50aF9vcGVyYXRpb25zIHNfb3BzWzJdOworCXN0cnVjdCB2bWlkaV9kZXZjIHZfb3BzWzJdOworfTsKKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF92X21pZGkgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlzdHJ1Y3Qgdm1pZGlfbWVtb3J5ICptOworCS8qIHByaW50aygiQXR0YWNoaW5nIHZfbWlkaSBkZXZpY2UuLi4uLlxuIik7ICovCisKKwltaWRpMSA9IHNvdW5kX2FsbG9jX21pZGlkZXYoKTsKKwlpZiAobWlkaTEgPT0gLTEpCisJeworCQlwcmludGsoS0VSTl9FUlIgInZfbWlkaTogVG9vIG1hbnkgbWlkaSBkZXZpY2VzIGRldGVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwkKKwltPShzdHJ1Y3Qgdm1pZGlfbWVtb3J5ICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHZtaWRpX21lbW9yeSksIEdGUF9LRVJORUwpOworCWlmIChtID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJMb29wYmFjayBNSURJOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYobWlkaTEpOworCQlyZXR1cm47CisJfQorCQorCW1pZGlfbWVtID0gbTsKKwkKKwltaWRpX2RldnNbbWlkaTFdID0gJm0tPm1fb3BzWzBdOworCQorCisJbWlkaTIgPSBzb3VuZF9hbGxvY19taWRpZGV2KCk7CisJaWYgKG1pZGkyID09IC0xKQorCXsKKwkJcHJpbnRrIChLRVJOX0VSUiAidl9taWRpOiBUb28gbWFueSBtaWRpIGRldmljZXMgZGV0ZWN0ZWRcbiIpOworCQlrZnJlZShtKTsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYobWlkaTEpOworCQlyZXR1cm47CisJfQorCisJbWlkaV9kZXZzW21pZGkyXSA9ICZtLT5tX29wc1sxXTsKKworCS8qIHByaW50aygiVk1JREkxOiAlZCAgIFZNSURJMjogJWRcbiIsbWlkaTEsbWlkaTIpOyAqLworCisJLyogZm9yIE1JREktMSAqLworCXZfZGV2Y1swXSA9ICZtLT52X29wc1swXTsKKwltZW1jcHkgKChjaGFyICopIG1pZGlfZGV2c1ttaWRpMV0sIChjaGFyICopICZ2X21pZGlfb3BlcmF0aW9ucywKKwkJc2l6ZW9mIChzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSk7CisKKwl2X2RldmNbMF0tPm15X21pZGlkZXYgPSBtaWRpMTsKKwl2X2RldmNbMF0tPnBhaXJfbWlkaWRldiA9IG1pZGkyOworCXZfZGV2Y1swXS0+b3BlbmVkID0gdl9kZXZjWzBdLT5pbnB1dF9vcGVuZWQgPSAwOworCXZfZGV2Y1swXS0+aW50cl9hY3RpdmUgPSAwOworCXZfZGV2Y1swXS0+bWlkaV9pbnB1dF9pbnRyID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmdl9kZXZjWzBdLT5sb2NrKTsKKworCW1pZGlfZGV2c1ttaWRpMV0tPmRldmMgPSB2X2RldmNbMF07CisKKwltaWRpX2RldnNbbWlkaTFdLT5jb252ZXJ0ZXIgPSAmbS0+c19vcHNbMF07CisJc3RkX21pZGlfc3ludGgubWlkaV9kZXYgPSBtaWRpMTsKKwltZW1jcHkgKChjaGFyICopIG1pZGlfZGV2c1ttaWRpMV0tPmNvbnZlcnRlciwgKGNoYXIgKikgJnN0ZF9taWRpX3N5bnRoLAorCQlzaXplb2YgKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zKSk7CisJbWlkaV9kZXZzW21pZGkxXS0+Y29udmVydGVyLT5pZCA9ICJWX01JREkgMSI7CisKKwkvKiBmb3IgTUlESS0yICovCisJdl9kZXZjWzFdID0gJm0tPnZfb3BzWzFdOworCisJbWVtY3B5ICgoY2hhciAqKSBtaWRpX2RldnNbbWlkaTJdLCAoY2hhciAqKSAmdl9taWRpX29wZXJhdGlvbnMyLAorCQlzaXplb2YgKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpKTsKKworCXZfZGV2Y1sxXS0+bXlfbWlkaWRldiA9IG1pZGkyOworCXZfZGV2Y1sxXS0+cGFpcl9taWRpZGV2ID0gbWlkaTE7CisJdl9kZXZjWzFdLT5vcGVuZWQgPSB2X2RldmNbMV0tPmlucHV0X29wZW5lZCA9IDA7CisJdl9kZXZjWzFdLT5pbnRyX2FjdGl2ZSA9IDA7CisJdl9kZXZjWzFdLT5taWRpX2lucHV0X2ludHIgPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZ2X2RldmNbMV0tPmxvY2spOworCisJbWlkaV9kZXZzW21pZGkyXS0+ZGV2YyA9IHZfZGV2Y1sxXTsKKwltaWRpX2RldnNbbWlkaTJdLT5jb252ZXJ0ZXIgPSAmbS0+c19vcHNbMV07CisKKwlzdGRfbWlkaV9zeW50aC5taWRpX2RldiA9IG1pZGkyOworCW1lbWNweSAoKGNoYXIgKikgbWlkaV9kZXZzW21pZGkyXS0+Y29udmVydGVyLCAoY2hhciAqKSAmc3RkX21pZGlfc3ludGgsCisJCXNpemVvZiAoc3RydWN0IHN5bnRoX29wZXJhdGlvbnMpKTsKKwltaWRpX2RldnNbbWlkaTJdLT5jb252ZXJ0ZXItPmlkID0gIlZfTUlESSAyIjsKKworCXNlcXVlbmNlcl9pbml0KCk7CisJLyogcHJpbnRrKCJBdHRhY2hlZCB2X21pZGkgZGV2aWNlXG4iKTsgKi8KK30KKworc3RhdGljIGlubGluZSBpbnQgX19pbml0IHByb2JlX3ZfbWlkaShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJcmV0dXJuKDEpOwkvKiBhbHdheXMgT0sgKi8KK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX3ZfbWlkaShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJc291bmRfdW5sb2FkX21pZGlkZXYobWlkaTEpOworCXNvdW5kX3VubG9hZF9taWRpZGV2KG1pZGkyKTsKKwlrZnJlZShtaWRpX21lbSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsgLyogZHVtbXkgKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF92bWlkaSh2b2lkKQoreworCXByaW50aygiTUlESSBMb29wYmFjayBkZXZpY2UgZHJpdmVyXG4iKTsKKwlpZiAoIXByb2JlX3ZfbWlkaSgmY2ZnKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYXR0YWNoX3ZfbWlkaSgmY2ZnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF92bWlkaSh2b2lkKQoreworCXVubG9hZF92X21pZGkoJmNmZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdm1pZGkpOworbW9kdWxlX2V4aXQoY2xlYW51cF92bWlkaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvdl9taWRpLmggYi9zb3VuZC9vc3Mvdl9taWRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4NmNiNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy92X21pZGkuaApAQCAtMCwwICsxLDE1IEBACit0eXBlZGVmIHN0cnVjdCB2bWlkaV9kZXZjIHsKKwkgICBpbnQgZGV2OworCisJLyogU3RhdGUgdmFyaWFibGVzICovCisgCSAgIGludCBvcGVuZWQ7CisJICAgc3BpbmxvY2tfdCBsb2NrOworCQorCS8qIE1JREkgZmllbGRzICovCisJICAgaW50IG15X21pZGlkZXY7CisJICAgaW50IHBhaXJfbWlkaWRldjsKKwkgICBpbnQgaW5wdXRfb3BlbmVkOworCSAgIGludCBpbnRyX2FjdGl2ZTsKKwkgICB2b2lkICgqbWlkaV9pbnB1dF9pbnRyKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKTsKKwl9IHZtaWRpX2RldmM7CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYyBiL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzg3ZTFlNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYwpAQCAtMCwwICsxLDM2MTUgQEAKKy8qCisgKiBTdXBwb3J0IGZvciBWSUEgODJDeHh4IEF1ZGlvIENvZGVjcworICogQ29weXJpZ2h0IDE5OTksMjAwMCBKZWZmIEdhcnppaworICoKKyAqIFVwZGF0ZWQgdG8gc3VwcG9ydCB0aGUgVklBIDgyMzMvODIzNSBhdWRpbyBzdWJzeXN0ZW0KKyAqIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+IChDKSBDb3B5cmlnaHQgMjAwMiwgMjAwMyBSZWQgSGF0IEluYworICoKKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKSBWZXJzaW9uIDIuCisgKiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZSBmb3IgbW9yZSBpbmZvLgorICogTk8gV0FSUkFOVFkKKyAqCisgKiBGb3IgYSBsaXN0IG9mIGtub3duIGJ1Z3MgKGVycmF0YSkgYW5kIGRvY3VtZW50YXRpb24sCisgKiBzZWUgdmlhLWF1ZGlvLnBkZiBpbiBEb2N1bWVudGF0aW9uL0RvY0Jvb2suCisgKiBJZiB0aGlzIGRvY3VtZW50YXRpb24gZG9lcyBub3QgZXhpc3QsIHJ1biAibWFrZSBwZGZkb2NzIi4KKyAqLworCisKKyNkZWZpbmUgVklBX1ZFUlNJT04JIjEuOS4xLWFjNC0yLjUiCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJkZXZfdGFibGUuaCIKKyNpbmNsdWRlICJtcHU0MDEuaCIKKworCisjdW5kZWYgVklBX0RFQlVHCS8qIGRlZmluZSB0byBlbmFibGUgZGVidWdnaW5nIG91dHB1dCBhbmQgY2hlY2tzICovCisjaWZkZWYgVklBX0RFQlVHCisvKiBub3RlOiBwcmludHMgZnVuY3Rpb24gbmFtZSBmb3IgeW91ICovCisjZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI3VuZGVmIFZJQV9OREVCVUcJLyogZGVmaW5lIHRvIGRpc2FibGUgbGlnaHR3ZWlnaHQgcnVudGltZSBjaGVja3MgKi8KKyNpZmRlZiBWSUFfTkRFQlVHCisjZGVmaW5lIGFzc2VydChleHByKQorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0KGV4cHIpIFwKKyAgICAgICAgaWYoIShleHByKSkgewkJCQkJXAorICAgICAgICBwcmludGsoICJBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLAlcCisgICAgICAgICNleHByLF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CQlcCisgICAgICAgIH0KKyNlbmRpZgorCisjZGVmaW5lIFZJQV9TVVBQT1JUX01NQVAgMSAvKiBidWdneSwgZm9yIG5vdy4uLiAqLworCisjZGVmaW5lIE1BWF9DQVJEUwkxCisKKyNkZWZpbmUgVklBX0NBUkRfTkFNRQkiVklBIDgyQ3h4eCBBdWRpbyBkcml2ZXIgIiBWSUFfVkVSU0lPTgorI2RlZmluZSBWSUFfTU9EVUxFX05BTUUgInZpYTgyY3h4eCIKKyNkZWZpbmUgUEZYCQlWSUFfTU9EVUxFX05BTUUgIjogIgorCisjZGVmaW5lIFZJQV9DT1VOVEVSX0xJTUlUCTEwMDAwMAorCisvKiBzaXplIG9mIERNQSBidWZmZXJzICovCisjZGVmaW5lIFZJQV9NQVhfQlVGRkVSX0RNQV9QQUdFUwkzMgorCisvKiBidWZmZXJpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gbXMgKi8KKyNkZWZpbmUgVklBX0RFRkFVTFRfRlJBR19USU1FCQkyMAorI2RlZmluZSBWSUFfREVGQVVMVF9CVUZGRVJfVElNRQkJNTAwCisKKy8qIHRoZSBoYXJkd2FyZSBoYXMgYSAyNTYgZnJhZ21lbnQgbGltaXQgKi8KKyNkZWZpbmUgVklBX01JTl9GUkFHX05VTUJFUgkJMgorI2RlZmluZSBWSUFfTUFYX0ZSQUdfTlVNQkVSCQkxMjgKKworI2RlZmluZSBWSUFfTUFYX0ZSQUdfU0laRQkJUEFHRV9TSVpFCisjZGVmaW5lIFZJQV9NSU5fRlJBR19TSVpFCQkoVklBX01BWF9CVUZGRVJfRE1BX1BBR0VTICogUEFHRV9TSVpFIC8gVklBX01BWF9GUkFHX05VTUJFUikKKworCisvKiA4MkM2ODYgZnVuY3Rpb24gNSAoYXVkaW8gY29kZWMpIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBWSUFfQUNMSU5LX1NUQVRVUwkweDQwCisjZGVmaW5lIFZJQV9BQ0xJTktfQ1RSTAkJMHg0MQorI2RlZmluZSBWSUFfRlVOQ19FTkFCTEUJCTB4NDIKKyNkZWZpbmUgVklBX1BOUF9DT05UUk9MCQkweDQzCisjZGVmaW5lIFZJQV9GTV9OTUlfQ1RSTAkJMHg0OAorCisvKgorICogY29udHJvbGxlciBiYXNlIDAgKHNjYXR0ZXItZ2F0aGVyKSByZWdpc3RlcnMKKyAqCisgKiBOT1RFOiBWaWEgZGF0YXNoZWV0IGxpc3RzIGZpcnN0IGNoYW5uZWwgYXMgInJlYWQiCisgKiBjaGFubmVsIGFuZCBzZWNvbmQgY2hhbm5lbCBhcyAid3JpdGUiIGNoYW5uZWwuCisgKiBJIGNoYW5nZWQgdGhlIG5hbWluZyBvZiB0aGUgY29uc3RhbnRzIHRvIGJlIG1vcmUKKyAqIGNsZWFyIHRoYW4gSSBmZWx0IHRoZSBkYXRhc2hlZXQgdG8gYmUuCisgKi8KKworI2RlZmluZSBWSUFfQkFTRTBfUENNX09VVF9DSEFOCTB4MDAgLyogb3V0cHV0IFBDTSB0byB1c2VyICovCisjZGVmaW5lIFZJQV9CQVNFMF9QQ01fT1VUX0NIQU5fU1RBVFVTIDB4MDAKKyNkZWZpbmUgVklBX0JBU0UwX1BDTV9PVVRfQ0hBTl9DVFJMCTB4MDEKKyNkZWZpbmUgVklBX0JBU0UwX1BDTV9PVVRfQ0hBTl9UWVBFCTB4MDIKKworI2RlZmluZSBWSUFfQkFTRTBfUENNX0lOX0NIQU4JCTB4MTAgLyogaW5wdXQgUENNIGZyb20gdXNlciAqLworI2RlZmluZSBWSUFfQkFTRTBfUENNX0lOX0NIQU5fU1RBVFVTCTB4MTAKKyNkZWZpbmUgVklBX0JBU0UwX1BDTV9JTl9DSEFOX0NUUkwJMHgxMQorI2RlZmluZSBWSUFfQkFTRTBfUENNX0lOX0NIQU5fVFlQRQkweDEyCisKKy8qIG9mZnNldHMgZnJvbSBiYXNlICovCisjZGVmaW5lIFZJQV9QQ01fU1RBVFVTCQkJMHgwMAorI2RlZmluZSBWSUFfUENNX0NPTlRST0wJCQkweDAxCisjZGVmaW5lIFZJQV9QQ01fVFlQRQkJCTB4MDIKKyNkZWZpbmUgVklBX1BDTV9MRUZUVk9MCQkJMHgwMgorI2RlZmluZSBWSUFfUENNX1JJR0hUVk9MCQkweDAzCisjZGVmaW5lIFZJQV9QQ01fVEFCTEVfQUREUgkJMHgwNAorI2RlZmluZSBWSUFfUENNX1NUT1BSQVRFCQkweDA4CS8qIDgyMzMrICovCisjZGVmaW5lIFZJQV9QQ01fQkxPQ0tfQ09VTlQJCTB4MEMKKworLyogWFhYIHVudXNlZCBETUEgY2hhbm5lbCBmb3IgRk0gUENNIGRhdGEgKi8KKyNkZWZpbmUgVklBX0JBU0UwX0ZNX09VVF9DSEFOCQkweDIwCisjZGVmaW5lIFZJQV9CQVNFMF9GTV9PVVRfQ0hBTl9TVEFUVVMJMHgyMAorI2RlZmluZSBWSUFfQkFTRTBfRk1fT1VUX0NIQU5fQ1RSTAkweDIxCisjZGVmaW5lIFZJQV9CQVNFMF9GTV9PVVRfQ0hBTl9UWVBFCTB4MjIKKworLyogU2l4IGNoYW5uZWwgYXVkaW8gb3V0cHV0IG9uIDgyMzMgKi8KKyNkZWZpbmUgVklBX0JBU0UwX01VTFRJX09VVF9DSEFOCQkweDQwCisjZGVmaW5lIFZJQV9CQVNFMF9NVUxUSV9PVVRfQ0hBTl9TVEFUVVMJCTB4NDAKKyNkZWZpbmUgVklBX0JBU0UwX01VTFRJX09VVF9DSEFOX0NUUkwJCTB4NDEKKyNkZWZpbmUgVklBX0JBU0UwX01VTFRJX09VVF9DSEFOX1RZUEUJCTB4NDIKKworI2RlZmluZSBWSUFfQkFTRTBfQUM5N19DVFJMCQkweDgwCisjZGVmaW5lIFZJQV9CQVNFMF9TR0RfU1RBVFVTX1NIQURPVwkweDg0CisjZGVmaW5lIFZJQV9CQVNFMF9HUElfSU5UX0VOQUJMRQkweDhDCisjZGVmaW5lIFZJQV9JTlRSX09VVAkJCSgoMTw8MCkgfCAgKDE8PDQpIHwgICgxPDw4KSkKKyNkZWZpbmUgVklBX0lOVFJfSU4JCQkoKDE8PDEpIHwgICgxPDw1KSB8ICAoMTw8OSkpCisjZGVmaW5lIFZJQV9JTlRSX0ZNCQkJKCgxPDwyKSB8ICAoMTw8NikgfCAoMTw8MTApKQorI2RlZmluZSBWSUFfSU5UUl9NQVNLCQkoVklBX0lOVFJfT1VUIHwgVklBX0lOVFJfSU4gfCBWSUFfSU5UUl9GTSkKKworLyogTmV3ZXIgVklBIHdlIG5lZWQgdG8gbW9uaXRvciB0aGUgbG93IDMgYml0cyBvZiBlYWNoIGNoYW5uZWwuIFRoaXMKKyAgIG1hc2sgY292ZXJzIHRoZSBjaGFubmVscyB3ZSBkb24ndCB5ZXQgdXNlIGFzIHdlbGwgCisgKi8KKyAKKyNkZWZpbmUgVklBX05FV19JTlRSX01BU0sJCTB4NzcwNzc3NzdVTAorCisvKiBWSUFfQkFTRTBfQVVESU9feHh4X0NIQU5fVFlQRSBiaXRzICovCisjZGVmaW5lIFZJQV9JUlFfT05fRkxBRwkJCSgxPDwwKQkvKiBpbnQgb24gZWFjaCBmbGFnZ2VkIHNjYXR0ZXIgYmxvY2sgKi8KKyNkZWZpbmUgVklBX0lSUV9PTl9FT0wJCQkoMTw8MSkJLyogaW50IGF0IGVuZCBvZiBzY2F0dGVyIGxpc3QgKi8KKyNkZWZpbmUgVklBX0lOVF9TRUxfUENJX0xBU1RfTElORV9SRUFECSgwKQkvKiBpbnQgYXQgUENJIHJlYWQgb2YgbGFzdCBsaW5lICovCisjZGVmaW5lIFZJQV9JTlRfU0VMX0xBU1RfU0FNUExFX1NFTlQJKDE8PDIpCS8qIGludCBhdCBsYXN0IHNhbXBsZSBzZW50ICovCisjZGVmaW5lIFZJQV9JTlRfU0VMX09ORV9MSU5FX0xFRlQJKDE8PDMpCS8qIGludCBhdCBsZXNzIHRoYW4gb25lIGxpbmUgdG8gc2VuZCAqLworI2RlZmluZSBWSUFfUENNX0ZNVF9TVEVSRU8JCSgxPDw0KQkvKiBQQ00gc3RlcmVvIGZvcm1hdCAoYml0IGNsZWFyID09IG1vbm8pICovCisjZGVmaW5lIFZJQV9QQ01fRk1UXzE2QklUCQkoMTw8NSkJLyogUENNIDE2LWJpdCBmb3JtYXQgKGJpdCBjbGVhciA9PSA4LWJpdCkgKi8KKyNkZWZpbmUgVklBX1BDTV9SRUNfRklGTwkJKDE8PDYpCS8qIFBDTSBSZWNvcmRpbmcgRklGTyAqLworI2RlZmluZSBWSUFfUkVTVEFSVF9TR0RfT05fRU9MCQkoMTw8NykJLyogcmVzdGFydCBzY2F0dGVyLWdhdGhlciBhdCBFT0wgKi8KKyNkZWZpbmUgVklBX1BDTV9GTVRfTUFTSwkJKFZJQV9QQ01fRk1UX1NURVJFT3xWSUFfUENNX0ZNVF8xNkJJVCkKKyNkZWZpbmUgVklBX0NIQU5fVFlQRV9NQVNLCQkoVklBX1JFU1RBUlRfU0dEX09OX0VPTCB8IFwKKwkJCQkJIFZJQV9JUlFfT05fRkxBRyB8IFwKKwkJCQkJIFZJQV9JUlFfT05fRU9MKQorI2RlZmluZSBWSUFfQ0hBTl9UWVBFX0lOVF9TRUxFQ1QJKFZJQV9JTlRfU0VMX0xBU1RfU0FNUExFX1NFTlQpCisKKy8qIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJpdHMgYW5kIG1hc2tzICovCisjZGVmaW5lIFZJQV9DUjQwX0FDOTdfUkVBRFkJMHgwMQorI2RlZmluZSBWSUFfQ1I0MF9BQzk3X0xPV19QT1dFUgkweDAyCisjZGVmaW5lIFZJQV9DUjQwX1NFQ09OREFSWV9SRUFEWSAweDA0CisKKyNkZWZpbmUgVklBX0NSNDFfQUM5N19FTkFCTEUJMHg4MCAvKiBlbmFibGUgQUM5NyBjb2RlYyAqLworI2RlZmluZSBWSUFfQ1I0MV9BQzk3X1JFU0VUCTB4NDAgLyogY2xlYXIgYml0IHRvIHJlc2V0IEFDOTcgKi8KKyNkZWZpbmUgVklBX0NSNDFfQUM5N19XQUtFVVAJMHgyMCAvKiB3YWtlIHVwIGZyb20gcG93ZXItZG93biBtb2RlICovCisjZGVmaW5lIFZJQV9DUjQxX0FDOTdfU0RPCTB4MTAgLyogZm9yY2UgU2VyaWFsIERhdGEgT3V0IChTRE8pIGhpZ2ggKi8KKyNkZWZpbmUgVklBX0NSNDFfVlJBCQkweDA4IC8qIGVuYWJsZSB2YXJpYWJsZSBzYW1wbGUgcmF0ZSAqLworI2RlZmluZSBWSUFfQ1I0MV9QQ01fRU5BQkxFCTB4MDQgLyogQUMgTGluayBTR0QgUmVhZCBDaGFubmVsIFBDTSBEYXRhIE91dHB1dCAqLworI2RlZmluZSBWSUFfQ1I0MV9GTV9QQ01fRU5BQkxFCTB4MDIgLyogQUMgTGluayBGTSBDaGFubmVsIFBDTSBEYXRhIE91dCAqLworI2RlZmluZSBWSUFfQ1I0MV9TQl9QQ01fRU5BQkxFCTB4MDEgLyogQUMgTGluayBTQiBQQ00gRGF0YSBPdXRwdXQgKi8KKyNkZWZpbmUgVklBX0NSNDFfQk9PVF9NQVNLCShWSUFfQ1I0MV9BQzk3X0VOQUJMRSB8IFwKKwkJCQkgVklBX0NSNDFfQUM5N19XQUtFVVAgfCBcCisJCQkJIFZJQV9DUjQxX0FDOTdfU0RPKQorI2RlZmluZSBWSUFfQ1I0MV9SVU5fTUFTSwkoVklBX0NSNDFfQUM5N19FTkFCTEUgfCBcCisJCQkJIFZJQV9DUjQxX0FDOTdfUkVTRVQgfCBcCisJCQkJIFZJQV9DUjQxX1ZSQSB8IFwKKwkJCQkgVklBX0NSNDFfUENNX0VOQUJMRSkKKworI2RlZmluZSBWSUFfQ1I0Ml9TQl9FTkFCTEUJMHgwMQorI2RlZmluZSBWSUFfQ1I0Ml9NSURJX0VOQUJMRQkweDAyCisjZGVmaW5lIFZJQV9DUjQyX0ZNX0VOQUJMRQkweDA0CisjZGVmaW5lIFZJQV9DUjQyX0dBTUVfRU5BQkxFCTB4MDgKKyNkZWZpbmUgVklBX0NSNDJfTUlESV9JUlFNQVNLICAgMHg0MAorI2RlZmluZSBWSUFfQ1I0Ml9NSURJX1BOUAkweDgwCisKKyNkZWZpbmUgVklBX0NSNDRfU0VDT05EX0NPREVDX1NVUFBPUlQJKDEgPDwgNikKKyNkZWZpbmUgVklBX0NSNDRfQUNfTElOS19BQ0NFU1MJCSgxIDw8IDcpCisKKyNkZWZpbmUgVklBX0NSNDhfRk1fVFJBUF9UT19OTUkJCSgxIDw8IDIpCisKKy8qIGNvbnRyb2xsZXIgYmFzZSAwIHJlZ2lzdGVyIGJpdG1hc2tzICovCisjZGVmaW5lIFZJQV9JTlRfRElTQUJMRV9NQVNLCQkofigweDAxfDB4MDIpKQorI2RlZmluZSBWSUFfU0dEX1NUT1BQRUQJCQkoMSA8PCAyKQorI2RlZmluZSBWSUFfU0dEX1BBVVNFRAkJCSgxIDw8IDYpCisjZGVmaW5lIFZJQV9TR0RfQUNUSVZFCQkJKDEgPDwgNykKKyNkZWZpbmUgVklBX1NHRF9URVJNSU5BVEUJCSgxIDw8IDYpCisjZGVmaW5lIFZJQV9TR0RfRkxBRwkJCSgxIDw8IDApCisjZGVmaW5lIFZJQV9TR0RfRU9MCQkJKDEgPDwgMSkKKyNkZWZpbmUgVklBX1NHRF9TVEFSVAkJCSgxIDw8IDcpCisKKyNkZWZpbmUgVklBX0NSODBfRklSU1RfQ09ERUMJCTAKKyNkZWZpbmUgVklBX0NSODBfU0VDT05EX0NPREVDCQkoMSA8PCAzMCkKKyNkZWZpbmUgVklBX0NSODBfRklSU1RfQ09ERUNfVkFMSUQJKDEgPDwgMjUpCisjZGVmaW5lIFZJQV9DUjgwX1ZBTElECQkJKDEgPDwgMjUpCisjZGVmaW5lIFZJQV9DUjgwX1NFQ09ORF9DT0RFQ19WQUxJRAkoMSA8PCAyNykKKyNkZWZpbmUgVklBX0NSODBfQlVTWQkJCSgxIDw8IDI0KQorI2RlZmluZSBWSUFfQ1I4M19CVVNZCQkJKDEpCisjZGVmaW5lIFZJQV9DUjgzX0ZJUlNUX0NPREVDX1ZBTElECSgxIDw8IDEpCisjZGVmaW5lIFZJQV9DUjgwX1JFQUQJCQkoMSA8PCAyMykKKyNkZWZpbmUgVklBX0NSODBfV1JJVEVfTU9ERQkJMAorI2RlZmluZSBWSUFfQ1I4MF9SRUdfSURYKGlkeCkJCSgoKChpZHgpICYgMHhGRikgPj4gMSkgPDwgMTYpCisKKy8qIGNhcGFiaWxpdGllcyB3ZSBhbm5vdW5jZSAqLworI2lmZGVmIFZJQV9TVVBQT1JUX01NQVAKKyNkZWZpbmUgVklBX0RTUF9DQVAgKERTUF9DQVBfUkVWSVNJT04gfCBEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfTU1BUCB8IFwKKwkJICAgICBEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX1JFQUxUSU1FKQorI2Vsc2UKKyNkZWZpbmUgVklBX0RTUF9DQVAgKERTUF9DQVBfUkVWSVNJT04gfCBEU1BfQ0FQX0RVUExFWCB8IFwKKwkJICAgICBEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX1JFQUxUSU1FKQorI2VuZGlmCisKKy8qIHNjYXR0ZXItZ2F0aGVyIERNQSB0YWJsZSBlbnRyeSwgZXhhY3RseSBhcyBwYXNzZWQgdG8gaGFyZHdhcmUgKi8KK3N0cnVjdCB2aWFfc2dkX3RhYmxlIHsKKwl1MzIgYWRkcjsKKwl1MzIgY291bnQ7CS8qIGluY2x1ZGVzIGFkZGl0aW9uYWwgVklBX3h4eCBiaXRzIGFsc28gKi8KK307CisKKyNkZWZpbmUgVklBX0VPTCAoMSA8PCAzMSkKKyNkZWZpbmUgVklBX0ZMQUcgKDEgPDwgMzApCisjZGVmaW5lIFZJQV9TVE9QICgxIDw8IDI5KQorCisKK2VudW0gdmlhX2NoYW5uZWxfc3RhdGVzIHsKKwlzZ2Rfc3RvcHBlZCA9IDAsCisJc2dkX2luX3Byb2dyZXNzID0gMSwKK307CisKKworc3RydWN0IHZpYV9idWZmZXJfcGd0YmwgeworCWRtYV9hZGRyX3QgaGFuZGxlOworCXZvaWQgKmNwdWFkZHI7Cit9OworCisKK3N0cnVjdCB2aWFfY2hhbm5lbCB7CisJYXRvbWljX3Qgbl9mcmFnczsKKwlhdG9taWNfdCBod19wdHI7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKworCXVuc2lnbmVkIGludCBzd19wdHI7CisJdW5zaWduZWQgaW50IHNsb3BfbGVuOworCXVuc2lnbmVkIGludCBuX2lycXM7CisJaW50IGJ5dGVzOworCisJdW5zaWduZWQgaXNfYWN0aXZlIDogMTsKKwl1bnNpZ25lZCBpc19yZWNvcmQgOiAxOworCXVuc2lnbmVkIGlzX21hcHBlZCA6IDE7CisJdW5zaWduZWQgaXNfZW5hYmxlZCA6IDE7CisJdW5zaWduZWQgaXNfbXVsdGk6IDE7CS8qIDgyMzMgNiBjaGFubmVsICovCisJdTggcGNtX2ZtdDsJCS8qIFZJQV9QQ01fRk1UX3h4eCAqLworCXU4IGNoYW5uZWxzOwkJLyogQ2hhbm5lbCBjb3VudCAqLworCisJdW5zaWduZWQgcmF0ZTsJCS8qIHNhbXBsZSByYXRlICovCisJdW5zaWduZWQgaW50IGZyYWdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJhZ19udW1iZXI7CisJCisJdW5zaWduZWQgY2hhciBpbnRtYXNrOworCisJdm9sYXRpbGUgc3RydWN0IHZpYV9zZ2RfdGFibGUgKnNndGFibGU7CisJZG1hX2FkZHJfdCBzZ3RfaGFuZGxlOworCisJdW5zaWduZWQgaW50IHBhZ2VfbnVtYmVyOworCXN0cnVjdCB2aWFfYnVmZmVyX3BndGJsIHBndGJsW1ZJQV9NQVhfQlVGRkVSX0RNQV9QQUdFU107CisKKwlsb25nIGlvYmFzZTsKKworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCisKKy8qIGRhdGEgc3RvcmVkIGZvciBlYWNoIGNoaXAgKi8KK3N0cnVjdCB2aWFfaW5mbyB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJbG9uZyBiYXNlYWRkcjsKKworCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3OworCXNwaW5sb2NrX3QgYWM5N19sb2NrOworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgY2FyZF9udW07CQkvKiB1bmlxdWUgY2FyZCBudW1iZXIsIGZyb20gMCAqLworCisJaW50IGRldl9kc3A7CQkvKiAvZGV2L2RzcCBpbmRleCBmcm9tIHJlZ2lzdGVyX3NvdW5kX2RzcCgpICovCisKKwl1bnNpZ25lZCByZXZfaCA6IDE7CisJdW5zaWduZWQgbGVnYWN5OiAxOwkvKiBIYXMgbGVnYWN5IHBvcnRzICovCisJdW5zaWduZWQgaW50bWFzazogMTsJLyogTmVlZHMgaW50IGJpdHMgKi8KKwl1bnNpZ25lZCBzaXhjaGFubmVsOiAxOwkvKiA4MjMzLzM1IHdpdGggNiBjaGFubmVsIHN1cHBvcnQgKi8KKwl1bnNpZ25lZCB2b2x1bWU6IDE7CisKKwlpbnQgbG9ja2VkX3JhdGUgOiAxOworCQorCWludCBtaXhlcl92b2w7CQkvKiA4MjMzLzM1IHZvbHVtZSAgLSBub3QgeWV0IGltcGxlbWVudGVkICovCisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHN5c2NhbGxfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW07CisKKwkvKiBUaGUgODIzMy84MjM1IGhhdmUgNCBEWCBhdWRpbyBjaGFubmVscywgdHdvIHJlY29yZCBhbmQKKwkgICBvbmUgc2l4IGNoYW5uZWwgb3V0LiBXZSBiaW5kIGNoX2luIHRvIERYIDEsIGNoX291dCB0byBtdWx0aWNoYW5uZWwKKwkgICBhbmQgY2hfZm0gdG8gRFggMi4gRFggMyBhbmQgUkVDMC9SRUMxIGFyZSB1bnVzZWQgYXQgdGhlCisJICAgbW9tZW50ICovCisJICAgCisJc3RydWN0IHZpYV9jaGFubmVsIGNoX2luOworCXN0cnVjdCB2aWFfY2hhbm5lbCBjaF9vdXQ7CisJc3RydWN0IHZpYV9jaGFubmVsIGNoX2ZtOworCisjaWZkZWYgQ09ORklHX01JRElfVklBODJDWFhYCisgICAgICAgIHZvaWQgKm1pZGlfZGV2YzsKKyAgICAgICAgc3RydWN0IGFkZHJlc3NfaW5mbyBtaWRpX2luZm87CisjZW5kaWYKK307CisKKworLyogbnVtYmVyIG9mIGNhcmRzLCB1c2VkIGZvciBhc3NpZ25pbmcgdW5pcXVlIG51bWJlcnMgdG8gY2FyZHMgKi8KK3N0YXRpYyB1bnNpZ25lZCB2aWFfbnVtX2NhcmRzOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwcm90b3R5cGVzCisgKgorICoKKyAqLworCitzdGF0aWMgaW50IHZpYV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2aWFfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCitzdGF0aWMgc3NpemVfdCB2aWFfZHNwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IHZpYV9kc3Bfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlhX2RzcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpOworc3RhdGljIGludCB2aWFfZHNwX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCB2aWFfZHNwX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdmlhX2RzcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdmlhX2RzcF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKK3N0YXRpYyB1MTYgdmlhX2FjOTdfcmVhZF9yZWcgKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKTsKK3N0YXRpYyB2b2lkIHZpYV9hYzk3X3dyaXRlX3JlZyAoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWx1ZSk7CitzdGF0aWMgdTggdmlhX2FjOTdfd2FpdF9pZGxlIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQpOworCitzdGF0aWMgdm9pZCB2aWFfY2hhbl9mcmVlIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbik7CitzdGF0aWMgdm9pZCB2aWFfY2hhbl9jbGVhciAoc3RydWN0IHZpYV9pbmZvICpjYXJkLCBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4pOworc3RhdGljIHZvaWQgdmlhX2NoYW5fcGNtX2ZtdCAoc3RydWN0IHZpYV9jaGFubmVsICpjaGFuLCBpbnQgcmVzZXQpOworc3RhdGljIHZvaWQgdmlhX2NoYW5fYnVmZmVyX2ZyZWUgKHN0cnVjdCB2aWFfaW5mbyAqY2FyZCwgc3RydWN0IHZpYV9jaGFubmVsICpjaGFuKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFZhcmlvdXMgZGF0YSB0aGUgZHJpdmVyIG5lZWRzCisgKgorICoKKyAqLworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2aWFfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzY4Nl81LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzM181LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMX0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksdmlhX3BjaV90YmwpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2aWFfZHJpdmVyID0geworCS5uYW1lCQk9IFZJQV9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSB2aWFfcGNpX3RibCwKKwkucHJvYmUJCT0gdmlhX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodmlhX3JlbW92ZV9vbmUpLAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIExvdy1sZXZlbCBiYXNlIDAgcmVnaXN0ZXIgcmVhZC93cml0ZSBoZWxwZXJzCisgKgorICoKKyAqLworCisvKioKKyAqCXZpYV9jaGFuX3N0b3AgLSBUZXJtaW5hdGUgRE1BIG9uIHNwZWNpZmllZCBQQ00gY2hhbm5lbAorICoJQGlvYmFzZTogUENJIGJhc2UgYWRkcmVzcyBmb3IgU0dEIGNoYW5uZWwgcmVnaXN0ZXJzCisgKgorICoJVGVybWluYXRlIHNjYXR0ZXItZ2F0aGVyIERNQSBvcGVyYXRpb24gZm9yIGdpdmVuCisgKgljaGFubmVsIChkZXJpdmVkIGZyb20gQGlvYmFzZSksIGlmIERNQSBpcyBhY3RpdmUuCisgKgorICoJTm90ZSB0aGF0IEBpb2Jhc2UgaXMgbm90IHRoZSBQQ0kgYmFzZSBhZGRyZXNzLAorICoJYnV0IHRoZSBQQ0kgYmFzZSBhZGRyZXNzIHBsdXMgYW4gb2Zmc2V0IHRvCisgKglvbmUgb2YgdGhyZWUgUENNIGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGUgY2hpcC4KKyAqCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHZpYV9jaGFuX3N0b3AgKGxvbmcgaW9iYXNlKQoreworCWlmIChpbmIgKGlvYmFzZSArIFZJQV9QQ01fU1RBVFVTKSAmIFZJQV9TR0RfQUNUSVZFKQorCQlvdXRiIChWSUFfU0dEX1RFUk1JTkFURSwgaW9iYXNlICsgVklBX1BDTV9DT05UUk9MKTsKK30KKworCisvKioKKyAqCXZpYV9jaGFuX3N0YXR1c19jbGVhciAtIENsZWFyIHN0YXR1cyBmbGFncyBvbiBzcGVjaWZpZWQgRE1BIGNoYW5uZWwKKyAqCUBpb2Jhc2U6IFBDSSBiYXNlIGFkZHJlc3MgZm9yIFNHRCBjaGFubmVsIHJlZ2lzdGVycworICoKKyAqCUNsZWFyIGFueSBwZW5kaW5nIHN0YXR1cyBmbGFncyBmb3IgdGhlIGdpdmVuCisgKglETUEgY2hhbm5lbCAoZGVyaXZlZCBmcm9tIEBpb2Jhc2UpLCBpZiBhbnkKKyAqCWZsYWdzIGFyZSBhc3NlcnRlZC4KKyAqCisgKglOb3RlIHRoYXQgQGlvYmFzZSBpcyBub3QgdGhlIFBDSSBiYXNlIGFkZHJlc3MsCisgKglidXQgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcGx1cyBhbiBvZmZzZXQgdG8KKyAqCW9uZSBvZiB0aHJlZSBQQ00gY2hhbm5lbHMgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwLgorICoKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdmlhX2NoYW5fc3RhdHVzX2NsZWFyIChsb25nIGlvYmFzZSkKK3sKKwl1OCB0bXAgPSBpbmIgKGlvYmFzZSArIFZJQV9QQ01fU1RBVFVTKTsKKworCWlmICh0bXAgIT0gMCkKKwkJb3V0YiAodG1wLCBpb2Jhc2UgKyBWSUFfUENNX1NUQVRVUyk7Cit9CisKKworLyoqCisgKglzZ19iZWdpbiAtIEJlZ2luIHJlY29yZGluZyBvciBwbGF5YmFjayBvbiBhIFBDTSBjaGFubmVsCisgKglAY2hhbjogQ2hhbm5lbCBmb3Igd2hpY2ggRE1BIG9wZXJhdGlvbiBzaGFsbCBiZWdpbgorICoKKyAqCVN0YXJ0IHNjYXR0ZXItZ2F0aGVyIERNQSBmb3IgdGhlIGdpdmVuIGNoYW5uZWwuCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZ19iZWdpbiAoc3RydWN0IHZpYV9jaGFubmVsICpjaGFuKQoreworCURQUklOVEsoIlN0YXJ0IHdpdGggaW50bWFzayAlZFxuIiwgY2hhbi0+aW50bWFzayk7CisJRFBSSU5USygiQWJvdXQgdG8gc3RhcnQgZnJvbSAlZCB0byAlZFxuIiwgCisJCWlubChjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX0JMT0NLX0NPVU5UKSwKKwkJaW5iKGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUgKyAzKSk7CisJb3V0YiAoVklBX1NHRF9TVEFSVHxjaGFuLT5pbnRtYXNrLCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX0NPTlRST0wpOworCURQUklOVEsoIlN0YXR1cyBpcyBub3cgJTAyWFxuIiwgaW5iKGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RBVFVTKSk7CisJRFBSSU5USygiQ29udHJvbCBpcyBub3cgJTAyWFxuIiwgaW5iKGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fQ09OVFJPTCkpOworfQorCisKK3N0YXRpYyBpbnQgc2dfYWN0aXZlIChsb25nIGlvYmFzZSkKK3sKKwl1OCB0bXAgPSBpbmIgKGlvYmFzZSArIFZJQV9QQ01fU1RBVFVTKTsKKwlpZiAoKHRtcCAmIFZJQV9TR0RfU1RPUFBFRCkgfHwgKHRtcCAmIFZJQV9TR0RfUEFVU0VEKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2aWE4MmN4eHggd2FybmluZzogU0cgc3RvcHBlZCBvciBwYXVzZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHRtcCAmIFZJQV9TR0RfQUNUSVZFKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFfc2dfb2Zmc2V0KHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwlyZXR1cm4gaW5sIChjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX0JMT0NLX0NPVU5UKSAmIDB4MDBGRkZGRkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWlzY2VsbGFuZW91cyBkZWJyaXMKKyAqCisgKgorICovCisKKworLyoqCisgKgl2aWFfc3lzY2FsbF9kb3duIC0gZG93biB0aGUgY2FyZC1zcGVjaWZpYyBzeXNjZWxsIHNlbWFwaG9yZQorICoJQGNhcmQ6IFByaXZhdGUgaW5mbyBmb3Igc3BlY2lmaWVkIGJvYXJkCisgKglAbm9uYmxvY2s6IGJvb2xlYW4sIG5vbi16ZXJvIGlmIE9fTk9OQkxPQ0sgaXMgc2V0CisgKgorICoJRW5jYXBzdWxhdGVzIHN0YW5kYXJkIG1ldGhvZCBvZiBhY3F1aXJpbmcgdGhlIHN5c2NhbGwgc2VtLgorICoKKyAqCVJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gZm9yIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdmlhX3N5c2NhbGxfZG93biAoc3RydWN0IHZpYV9pbmZvICpjYXJkLCBpbnQgbm9uYmxvY2spCit7CisJLyogVGhvbWFzIFNhaWxlcjoKKwkgKiBFQUdBSU4gaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpZiBJTyBpcyBwZW5kaW5nLAorCSAqIG5vdCBpZiB0aGVyZSBpcyBjb250ZW50aW9uIG9uIHNvbWUgaW50ZXJuYWwKKwkgKiBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlIHdoaWNoIHNob3VsZCBiZQorCSAqIGhlbGQgb25seSBmb3IgYSBzaG9ydCB0aW1lIGFueXdheQorCSAqLworCW5vbmJsb2NrID0gMDsKKworCWlmIChub25ibG9jaykgeworCQlpZiAoZG93bl90cnlsb2NrICgmY2FyZC0+c3lzY2FsbF9zZW0pKQorCQkJcmV0dXJuIC1FQUdBSU47CisJfSBlbHNlIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmNhcmQtPnN5c2NhbGxfc2VtKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKgl2aWFfc3RvcF9ldmVyeXRoaW5nIC0gU3RvcCBhbGwgYXVkaW8gb3BlcmF0aW9ucworICoJQGNhcmQ6IFByaXZhdGUgaW5mbyBmb3Igc3BlY2lmaWVkIGJvYXJkCisgKgorICoJU3RvcHMgYWxsIERNQSBvcGVyYXRpb25zIGFuZCBpbnRlcnJ1cHRzLCBhbmQgY2xlYXIKKyAqCWFueSBwZW5kaW5nIHN0YXR1cyBiaXRzIHJlc3VsdGluZyBmcm9tIHRob3NlIG9wZXJhdGlvbnMuCisgKi8KKworc3RhdGljIHZvaWQgdmlhX3N0b3BfZXZlcnl0aGluZyAoc3RydWN0IHZpYV9pbmZvICpjYXJkKQoreworCXU4IHRtcCwgbmV3X3RtcDsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwkvKgorCSAqIHRlcm1pbmF0ZSBhbnkgZXhpc3Rpbmcgb3BlcmF0aW9ucyBvbiBhdWRpbyByZWFkL3dyaXRlIGNoYW5uZWxzCisJICovCisJdmlhX2NoYW5fc3RvcCAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX09VVF9DSEFOKTsKKwl2aWFfY2hhbl9zdG9wIChjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9QQ01fSU5fQ0hBTik7CisJdmlhX2NoYW5fc3RvcCAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfRk1fT1VUX0NIQU4pOworCWlmKGNhcmQtPnNpeGNoYW5uZWwpCisJCXZpYV9jaGFuX3N0b3AgKGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX01VTFRJX09VVF9DSEFOKTsKKworCS8qCisJICogY2xlYXIgYW55IGV4aXN0aW5nIHN0b3BzIC8gZmxhZ3MgKHNhbml0eSBjaGVjayBtYWlubHkpCisJICovCisJdmlhX2NoYW5fc3RhdHVzX2NsZWFyIChjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9QQ01fT1VUX0NIQU4pOworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX0lOX0NIQU4pOworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfRk1fT1VUX0NIQU4pOworCWlmKGNhcmQtPnNpeGNoYW5uZWwpCisJCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfTVVMVElfT1VUX0NIQU4pOworCisJLyoKKwkgKiBjbGVhciBhbnkgZW5hYmxlZCBpbnRlcnJ1cHQgYml0cworCSAqLworCXRtcCA9IGluYiAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX09VVF9DSEFOX1RZUEUpOworCW5ld190bXAgPSB0bXAgJiB+KFZJQV9JUlFfT05fRkxBR3xWSUFfSVJRX09OX0VPTHxWSUFfUkVTVEFSVF9TR0RfT05fRU9MKTsKKwlpZiAodG1wICE9IG5ld190bXApCisJCW91dGIgKDAsIGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX1BDTV9PVVRfQ0hBTl9UWVBFKTsKKworCXRtcCA9IGluYiAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX0lOX0NIQU5fVFlQRSk7CisJbmV3X3RtcCA9IHRtcCAmIH4oVklBX0lSUV9PTl9GTEFHfFZJQV9JUlFfT05fRU9MfFZJQV9SRVNUQVJUX1NHRF9PTl9FT0wpOworCWlmICh0bXAgIT0gbmV3X3RtcCkKKwkJb3V0YiAoMCwgY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX0lOX0NIQU5fVFlQRSk7CisKKwl0bXAgPSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX0ZNX09VVF9DSEFOX1RZUEUpOworCW5ld190bXAgPSB0bXAgJiB+KFZJQV9JUlFfT05fRkxBR3xWSUFfSVJRX09OX0VPTHxWSUFfUkVTVEFSVF9TR0RfT05fRU9MKTsKKwlpZiAodG1wICE9IG5ld190bXApCisJCW91dGIgKDAsIGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX0ZNX09VVF9DSEFOX1RZUEUpOworCisJaWYoY2FyZC0+c2l4Y2hhbm5lbCkKKwl7CisJCXRtcCA9IGluYiAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfTVVMVElfT1VUX0NIQU5fVFlQRSk7CisJCW5ld190bXAgPSB0bXAgJiB+KFZJQV9JUlFfT05fRkxBR3xWSUFfSVJRX09OX0VPTHxWSUFfUkVTVEFSVF9TR0RfT05fRU9MKTsKKwkJaWYgKHRtcCAhPSBuZXdfdG1wKQorCQkJb3V0YiAoMCwgY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfTVVMVElfT1VUX0NIQU5fVFlQRSk7CisJfQorCisJdWRlbGF5KDEwKTsKKworCS8qCisJICogY2xlYXIgYW55IGV4aXN0aW5nIGZsYWdzCisJICovCisJdmlhX2NoYW5fc3RhdHVzX2NsZWFyIChjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9QQ01fT1VUX0NIQU4pOworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX0lOX0NIQU4pOworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfRk1fT1VUX0NIQU4pOworCisJRFBSSU5USyAoIkVYSVRcbiIpOworfQorCisKKy8qKgorICoJdmlhX3NldF9yYXRlIC0gU2V0IFBDTSByYXRlIGZvciBnaXZlbiBjaGFubmVsCisgKglAYWM5NzogUG9pbnRlciB0byBnZW5lcmljIGNvZGVjIGluZm8gc3RydWN0CisgKglAY2hhbjogUHJpdmF0ZSBpbmZvIGZvciBzcGVjaWZpZWQgY2hhbm5lbAorICoJQHJhdGU6IERlc2lyZWQgUENNIHNhbXBsZSByYXRlLCBpbiBLaHoKKyAqCisgKglTZXRzIHRoZSBQQ00gc2FtcGxlIHJhdGUgZm9yIGEgY2hhbm5lbC4KKyAqCisgKglWYWx1ZXMgZm9yIEByYXRlIGFyZSBjbGFtcGVkIHRvIGEgcmFuZ2Ugb2YgNDAwMCBLaHogdGhyb3VnaCA0ODAwMCBLaHosCisgKglkdWUgdG8gaGFyZHdhcmUgY29uc3RyYWludHMuCisgKi8KKworc3RhdGljIGludCB2aWFfc2V0X3JhdGUgKHN0cnVjdCBhYzk3X2NvZGVjICphYzk3LAorCQkJIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgcmF0ZSkKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJaW50IHJhdGVfcmVnOworCXUzMiBkYWNwOworCXUzMiBtYXN0X3ZvbCwgcGhvbmVfdm9sLCBtb25vX3ZvbCwgcGNtX3ZvbDsKKwl1MzIgbXV0ZV92b2wgPSAweDgwMDA7CS8qIFRoZSBtdXRlIHZvbHVtZT8gLS0gU2VlbXMgdG8gd29yayEgKi8KKworCURQUklOVEsgKCJFTlRFUiwgcmF0ZSA9ICVkXG4iLCByYXRlKTsKKworCWlmIChjaGFuLT5yYXRlID09IHJhdGUpCisJCWdvdG8gb3V0OworCWlmIChjYXJkLT5sb2NrZWRfcmF0ZSkgeworCQljaGFuLT5yYXRlID0gNDgwMDA7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChyYXRlID4gNDgwMDApCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA0MDAwKSAJCXJhdGUgPSA0MDAwOworCisJcmF0ZV9yZWcgPSBjaGFuLT5pc19yZWNvcmQgPyBBQzk3X1BDTV9MUl9BRENfUkFURSA6CisJCQkgICAgQUM5N19QQ01fRlJPTlRfREFDX1JBVEU7CisKKwkvKiBTYXZlIGN1cnJlbnQgc3RhdGUgKi8KKwlkYWNwPXZpYV9hYzk3X3JlYWRfcmVnKGFjOTcsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJbWFzdF92b2wgPSB2aWFfYWM5N19yZWFkX3JlZyhhYzk3LCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPKTsKKwltb25vX3ZvbCA9IHZpYV9hYzk3X3JlYWRfcmVnKGFjOTcsIEFDOTdfTUFTVEVSX1ZPTF9NT05PKTsKKwlwaG9uZV92b2wgPSB2aWFfYWM5N19yZWFkX3JlZyhhYzk3LCBBQzk3X0hFQURQSE9ORV9WT0wpOworCXBjbV92b2wgPSB2aWFfYWM5N19yZWFkX3JlZyhhYzk3LCBBQzk3X1BDTU9VVF9WT0wpOworCS8qIE11dGUgLSBsYXJnZWx5IHJlZHVjZXMgcG9wcGluZyAqLworCXZpYV9hYzk3X3dyaXRlX3JlZyhhYzk3LCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCBtdXRlX3ZvbCk7CisJdmlhX2FjOTdfd3JpdGVfcmVnKGFjOTcsIEFDOTdfTUFTVEVSX1ZPTF9NT05PLCBtdXRlX3ZvbCk7CisJdmlhX2FjOTdfd3JpdGVfcmVnKGFjOTcsIEFDOTdfSEVBRFBIT05FX1ZPTCwgbXV0ZV92b2wpOworICAgICAgIAl2aWFfYWM5N193cml0ZV9yZWcoYWM5NywgQUM5N19QQ01PVVRfVk9MLCBtdXRlX3ZvbCk7CisJLyogUG93ZXIgZG93biB0aGUgREFDICovCisJdmlhX2FjOTdfd3JpdGVfcmVnKGFjOTcsIEFDOTdfUE9XRVJfQ09OVFJPTCwgZGFjcHwweDAyMDApOworCisgICAgICAgIC8qIFNldCBuZXcgcmF0ZSAqLworCXZpYV9hYzk3X3dyaXRlX3JlZyAoYWM5NywgcmF0ZV9yZWcsIHJhdGUpOworCisJLyogUG93ZXIgREFDIGJhY2sgdXAgKi8KKwl2aWFfYWM5N193cml0ZV9yZWcoYWM5NywgQUM5N19QT1dFUl9DT05UUk9MLCBkYWNwKTsKKwl1ZGVsYXkgKDIwMCk7IC8qIHJlZHVjZXMgcG9wcGluZyAqLworCisJLyogUmVzdG9yZSB2b2x1bWVzICovCisJdmlhX2FjOTdfd3JpdGVfcmVnKGFjOTcsIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIG1hc3Rfdm9sKTsKKwl2aWFfYWM5N193cml0ZV9yZWcoYWM5NywgQUM5N19NQVNURVJfVk9MX01PTk8sIG1vbm9fdm9sKTsKKwl2aWFfYWM5N193cml0ZV9yZWcoYWM5NywgQUM5N19IRUFEUEhPTkVfVk9MLCBwaG9uZV92b2wpOworCXZpYV9hYzk3X3dyaXRlX3JlZyhhYzk3LCBBQzk3X1BDTU9VVF9WT0wsIHBjbV92b2wpOworCisJLyogdGhlIGhhcmR3YXJlIG1pZ2h0IHJldHVybiBhIHZhbHVlIGRpZmZlcmVudCB0aGFuIHdoYXQgd2UKKwkgKiBwYXNzZWQgdG8gaXQsIHNvIHJlYWQgdGhlIHJhdGUgdmFsdWUgYmFjayBmcm9tIGhhcmR3YXJlCisJICogdG8gc2VlIHdoYXQgd2UgY2FtZSB1cCB3aXRoCisJICovCisJY2hhbi0+cmF0ZSA9IHZpYV9hYzk3X3JlYWRfcmVnIChhYzk3LCByYXRlX3JlZyk7CisKKwlpZiAoY2hhbi0+cmF0ZSA9PSAwKSB7CisJCWNhcmQtPmxvY2tlZF9yYXRlID0gMTsKKwkJY2hhbi0+cmF0ZSA9IDQ4MDAwOworCQlwcmludGsgKEtFUk5fV0FSTklORyBQRlggIkNvZGVjIHJhdGUgbG9ja2VkIGF0IDQ4S2h6XG4iKTsKKwl9CisKK291dDoKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIHJhdGUgJWQgSHpcbiIsIGNoYW4tPnJhdGUpOworCXJldHVybiBjaGFuLT5yYXRlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hhbm5lbC1zcGVjaWZpYyBvcGVyYXRpb25zCisgKgorICoKKyAqLworCisKKy8qKgorICoJdmlhX2NoYW5faW5pdF9kZWZhdWx0cyAtIEluaXRpYWxpemUgYSBzdHJ1Y3QgdmlhX2NoYW5uZWwKKyAqCUBjYXJkOiBQcml2YXRlIGF1ZGlvIGNoaXAgaW5mbworICoJQGNoYW46IENoYW5uZWwgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqCisgKglaZXJvIEBjaGFuLCBhbmQgdGhlbiBzZXQgYWxsIHN0YXRpYyBkZWZhdWx0cyBmb3IgdGhlIHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgdm9pZCB2aWFfY2hhbl9pbml0X2RlZmF1bHRzIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwltZW1zZXQgKGNoYW4sIDAsIHNpemVvZiAoKmNoYW4pKTsKKworCWlmKGNhcmQtPmludG1hc2spCisJCWNoYW4tPmludG1hc2sgPSAweDIzOwkvKiBUdXJuIG9uIHRoZSBJUlEgYml0cyAqLworCQkKKwlpZiAoY2hhbiA9PSAmY2FyZC0+Y2hfb3V0KSB7CisJCWNoYW4tPm5hbWUgPSAiUENNLU9VVCI7CisJCWlmKGNhcmQtPnNpeGNoYW5uZWwpCisJCXsKKwkJCWNoYW4tPmlvYmFzZSA9IGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX01VTFRJX09VVF9DSEFOOworCQkJY2hhbi0+aXNfbXVsdGkgPSAxOworCQkJRFBSSU5USygiVXNpbmcgbXVsdGljaGFubmVsIGZvciBwY20gb3V0XG4iKTsKKwkJfQorCQllbHNlCisJCQljaGFuLT5pb2Jhc2UgPSBjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9QQ01fT1VUX0NIQU47CisJfSBlbHNlIGlmIChjaGFuID09ICZjYXJkLT5jaF9pbikgeworCQljaGFuLT5uYW1lID0gIlBDTS1JTiI7CisJCWNoYW4tPmlvYmFzZSA9IGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX1BDTV9JTl9DSEFOOworCQljaGFuLT5pc19yZWNvcmQgPSAxOworCX0gZWxzZSBpZiAoY2hhbiA9PSAmY2FyZC0+Y2hfZm0pIHsKKwkJY2hhbi0+bmFtZSA9ICJQQ00tT1VULUZNIjsKKwkJY2hhbi0+aW9iYXNlID0gY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfRk1fT1VUX0NIQU47CisJfSBlbHNlIHsKKwkJQlVHKCk7CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCAoJmNoYW4tPndhaXQpOworCisJY2hhbi0+cGNtX2ZtdCA9IFZJQV9QQ01fRk1UX01BU0s7CisJY2hhbi0+aXNfZW5hYmxlZCA9IDE7CisKKwljaGFuLT5mcmFnX251bWJlciA9IDA7CisgICAgICAgIGNoYW4tPmZyYWdfc2l6ZSA9IDA7CisJYXRvbWljX3NldCgmY2hhbi0+bl9mcmFncywgMCk7CisJYXRvbWljX3NldCAoJmNoYW4tPmh3X3B0ciwgMCk7Cit9CisKKy8qKgorICogICAgICB2aWFfY2hhbl9pbml0IC0gSW5pdGlhbGl6ZSBQQ00gY2hhbm5lbAorICogICAgICBAY2FyZDogUHJpdmF0ZSBhdWRpbyBjaGlwIGluZm8KKyAqICAgICAgQGNoYW46IENoYW5uZWwgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqCisgKiAgICAgIFBlcmZvcm1zIHNvbWUgb2YgdGhlIHByZXBhcmF0aW9ucyBuZWNlc3NhcnkgdG8gYmVnaW4KKyAqICAgICAgdXNpbmcgYSBQQ00gY2hhbm5lbC4KKyAqCisgKiAgICAgIEN1cnJlbnRseSB0aGUgcHJlcGFyYXRpb25zIGNvbnNpc3Qgb2YKKyAqICAgICAgc2V0dGluZyB0aGUgUENNIGNoYW5uZWwgdG8gYSBrbm93biBzdGF0ZS4KKyAqLworCisKK3N0YXRpYyB2b2lkIHZpYV9jaGFuX2luaXQgKHN0cnVjdCB2aWFfaW5mbyAqY2FyZCwgc3RydWN0IHZpYV9jaGFubmVsICpjaGFuKQoreworCisgICAgICAgIERQUklOVEsgKCJFTlRFUlxuIik7CisKKwkvKiBiemVybyBjaGFubmVsIHN0cnVjdHVyZSwgYW5kIGluaXQgbWVtYmVycyB0byBkZWZhdWx0cyAqLworICAgICAgICB2aWFfY2hhbl9pbml0X2RlZmF1bHRzIChjYXJkLCBjaGFuKTsKKworICAgICAgICAvKiBzdG9wIGFueSBleGlzdGluZyBjaGFubmVsIG91dHB1dCAqLworICAgICAgICB2aWFfY2hhbl9jbGVhciAoY2FyZCwgY2hhbik7CisgICAgICAgIHZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2hhbi0+aW9iYXNlKTsKKyAgICAgICAgdmlhX2NoYW5fcGNtX2ZtdCAoY2hhbiwgMSk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKy8qKgorICoJdmlhX2NoYW5fYnVmZmVyX2luaXQgLSBJbml0aWFsaXplIFBDTSBjaGFubmVsIGJ1ZmZlcgorICoJQGNhcmQ6IFByaXZhdGUgYXVkaW8gY2hpcCBpbmZvCisgKglAY2hhbjogQ2hhbm5lbCB0byBiZSBpbml0aWFsaXplZAorICoKKyAqCVBlcmZvcm1zIHNvbWUgb2YgdGhlIHByZXBhcmF0aW9ucyBuZWNlc3NhcnkgdG8gYmVnaW4KKyAqCXVzaW5nIGEgUENNIGNoYW5uZWwuCisgKgorICoJQ3VycmVudGx5IHRoZSBwcmVwYXJhdGlvbnMgaW5jbHVkZSBhbGxvY2F0aW5nIHRoZQorICoJc2NhdHRlci1nYXRoZXIgRE1BIHRhYmxlIGFuZCBidWZmZXJzLAorICoJYW5kIHBhc3NpbmcgdGhlCisgKglhZGRyZXNzIG9mIHRoZSBETUEgdGFibGUgdG8gdGhlIGhhcmR3YXJlLgorICoKKyAqCU5vdGUgdGhhdCBzcGVjaWFsIGNhcmUgaXMgdGFrZW4gd2hlbiBwYXNzaW5nIHRoZQorICoJRE1BIHRhYmxlIGFkZHJlc3MgdG8gaGFyZHdhcmUsIGJlY2F1c2UgaXQgd2FzIGZvdW5kCisgKglkdXJpbmcgZHJpdmVyIGRldmVsb3BtZW50IHRoYXQgdGhlIGhhcmR3YXJlIGRpZCBub3QKKyAqCWFsd2F5cyAidGFrZSIgdGhlIGFkZHJlc3MuCisgKi8KKworc3RhdGljIGludCB2aWFfY2hhbl9idWZmZXJfaW5pdCAoc3RydWN0IHZpYV9pbmZvICpjYXJkLCBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4pCit7CisJaW50IHBhZ2UsIG9mZnNldDsKKwlpbnQgaTsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKworCWNoYW4tPmludG1hc2sgPSAwOworCWlmKGNhcmQtPmludG1hc2spCisJCWNoYW4tPmludG1hc2sgPSAweDIzOwkvKiBUdXJuIG9uIHRoZSBJUlEgYml0cyAqLworCQkKKwlpZiAoY2hhbi0+c2d0YWJsZSAhPSBOVUxMKSB7CisJCURQUklOVEsgKCJFWElUXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogYWxsb2MgRE1BLWFibGUgbWVtb3J5IGZvciBzY2F0dGVyLWdhdGhlciB0YWJsZSAqLworCWNoYW4tPnNndGFibGUgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAoY2FyZC0+cGRldiwKKwkJKHNpemVvZiAoc3RydWN0IHZpYV9zZ2RfdGFibGUpICogY2hhbi0+ZnJhZ19udW1iZXIpLAorCQkmY2hhbi0+c2d0X2hhbmRsZSk7CisJaWYgKCFjaGFuLT5zZ3RhYmxlKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJETUEgdGFibGUgYWxsb2MgZmFpbCwgYWJvcnRpbmdcbiIpOworCQlEUFJJTlRLICgiRVhJVFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldCAoKHZvaWQqKWNoYW4tPnNndGFibGUsIDAsCisJCShzaXplb2YgKHN0cnVjdCB2aWFfc2dkX3RhYmxlKSAqIGNoYW4tPmZyYWdfbnVtYmVyKSk7CisKKwkvKiBhbGxvYyBETUEtYWJsZSBtZW1vcnkgZm9yIHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgKi8KKworCWNoYW4tPnBhZ2VfbnVtYmVyID0gKGNoYW4tPmZyYWdfbnVtYmVyICogY2hhbi0+ZnJhZ19zaXplKSAvIFBBR0VfU0laRSArCisJCQkgICAgKCgoY2hhbi0+ZnJhZ19udW1iZXIgKiBjaGFuLT5mcmFnX3NpemUpICUgUEFHRV9TSVpFKSA/IDEgOiAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFuLT5wYWdlX251bWJlcjsgaSsrKSB7CisJCWNoYW4tPnBndGJsW2ldLmNwdWFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAoY2FyZC0+cGRldiwgUEFHRV9TSVpFLAorCQkJCQkgICAgICAmY2hhbi0+cGd0YmxbaV0uaGFuZGxlKTsKKworCQlpZiAoIWNoYW4tPnBndGJsW2ldLmNwdWFkZHIpIHsKKwkJCWNoYW4tPnBhZ2VfbnVtYmVyID0gaTsKKwkJCWdvdG8gZXJyX291dF9ub21lbTsKKwkJfQorCisjaWZuZGVmIFZJQV9OREVCVUcKKyAgICAgICAgICAgICAgICBtZW1zZXQgKGNoYW4tPnBndGJsW2ldLmNwdWFkZHIsIDB4QkMsIGNoYW4tPmZyYWdfc2l6ZSk7CisjZW5kaWYKKworI2lmIDEKKyAgICAgICAgICAgICAgICBEUFJJTlRLICgiZG1hYnVmX3BnICMlZCAoaD0lbHgsIHYycD0lbHgsIGE9JXApXG4iLAorCQkJaSwgKGxvbmcpY2hhbi0+cGd0YmxbaV0uaGFuZGxlLAorCQkJdmlydF90b19waHlzKGNoYW4tPnBndGJsW2ldLmNwdWFkZHIpLAorCQkJY2hhbi0+cGd0YmxbaV0uY3B1YWRkcik7CisjZW5kaWYKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hhbi0+ZnJhZ19udW1iZXI7IGkrKykgeworCisJCXBhZ2UgPSBpIC8gKFBBR0VfU0laRSAvIGNoYW4tPmZyYWdfc2l6ZSk7CisJCW9mZnNldCA9IChpICUgKFBBR0VfU0laRSAvIGNoYW4tPmZyYWdfc2l6ZSkpICogY2hhbi0+ZnJhZ19zaXplOworCisJCWNoYW4tPnNndGFibGVbaV0uY291bnQgPSBjcHVfdG9fbGUzMiAoY2hhbi0+ZnJhZ19zaXplIHwgVklBX0ZMQUcpOworCQljaGFuLT5zZ3RhYmxlW2ldLmFkZHIgPSBjcHVfdG9fbGUzMiAoY2hhbi0+cGd0YmxbcGFnZV0uaGFuZGxlICsgb2Zmc2V0KTsKKworI2lmIDEKKwkJRFBSSU5USyAoImRtYWJ1ZiAjJWQgKDMyKGgpPSVseClcbiIsCisJCQkgaSwKKwkJCSAobG9uZyljaGFuLT5zZ3RhYmxlW2ldLmFkZHIpOworI2VuZGlmCisJfQorCisJLyogb3ZlcndyaXRlIHRoZSBsYXN0IGJ1ZmZlciBpbmZvcm1hdGlvbiAqLworCWNoYW4tPnNndGFibGVbY2hhbi0+ZnJhZ19udW1iZXIgLSAxXS5jb3VudCA9IGNwdV90b19sZTMyIChjaGFuLT5mcmFnX3NpemUgfCBWSUFfRU9MKTsKKworCS8qIHNldCBsb2NhdGlvbiBvZiBETUEtYWJsZSBzY2F0dGVyLWdhdGhlciBpbmZvIHRhYmxlICovCisJRFBSSU5USyAoIm91dGwgKDB4JVgsIDB4JTA0bFgpXG4iLAorCQljaGFuLT5zZ3RfaGFuZGxlLCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX1RBQkxFX0FERFIpOworCisJdmlhX2FjOTdfd2FpdF9pZGxlIChjYXJkKTsKKwlvdXRsIChjaGFuLT5zZ3RfaGFuZGxlLCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX1RBQkxFX0FERFIpOworCXVkZWxheSAoMjApOworCXZpYV9hYzk3X3dhaXRfaWRsZSAoY2FyZCk7CisJLyogbG9hZCBubyByYXRlIGFkYXB0aW9uLCBzdGVyZW8gMTZiaXQsIHNldCB1cCByaW5nIHNsb3RzICovCisJaWYoY2FyZC0+c2l4Y2hhbm5lbCkKKwl7CisJCWlmKCFjaGFuLT5pc19tdWx0aSkKKwkJeworCQkJb3V0bCAoMHhGRkZGRiB8ICgweDMgPDwgMjApIHwgKGNoYW4tPmZyYWdfbnVtYmVyIDw8IDI0KSwgY2hhbi0+aW9iYXNlICsgVklBX1BDTV9TVE9QUkFURSk7CisJCQl1ZGVsYXkgKDIwKTsKKwkJCXZpYV9hYzk3X3dhaXRfaWRsZSAoY2FyZCk7CisJCX0KKwl9CisKKwlEUFJJTlRLICgiaW5sICgweCVsWCkgPSAleFxuIiwKKwkJY2hhbi0+aW9iYXNlICsgVklBX1BDTV9UQUJMRV9BRERSLAorCQlpbmwoY2hhbi0+aW9iYXNlICsgVklBX1BDTV9UQUJMRV9BRERSKSk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfbm9tZW06CisJcHJpbnRrIChLRVJOX0VSUiBQRlggIkRNQSBidWZmZXIgYWxsb2MgZmFpbCwgYWJvcnRpbmdcbiIpOworCXZpYV9jaGFuX2J1ZmZlcl9mcmVlIChjYXJkLCBjaGFuKTsKKwlEUFJJTlRLICgiRVhJVFxuIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKworLyoqCisgKgl2aWFfY2hhbl9mcmVlIC0gUmVsZWFzZSBhIFBDTSBjaGFubmVsCisgKglAY2FyZDogUHJpdmF0ZSBhdWRpbyBjaGlwIGluZm8KKyAqCUBjaGFuOiBDaGFubmVsIHRvIGJlIHJlbGVhc2VkCisgKgorICoJUGVyZm9ybXMgYWxsIHRoZSBmdW5jdGlvbnMgbmVjZXNzYXJ5IHRvIGNsZWFuIHVwCisgKglhbiBpbml0aWFsaXplZCBjaGFubmVsLgorICoKKyAqCUN1cnJlbnRseSB0aGVzZSBmdW5jdGlvbnMgaW5jbHVkZSBkaXNhYmxlZCBhbnkKKyAqCWFjdGl2ZSBETUEgb3BlcmF0aW9ucywgc2V0dGluZyB0aGUgUENNIGNoYW5uZWwKKyAqCWJhY2sgdG8gYSBrbm93biBzdGF0ZSwgYW5kIHJlbGVhc2luZyBhbnkgYWxsb2NhdGVkCisgKglzb3VuZCBidWZmZXJzLgorICovCisKK3N0YXRpYyB2b2lkIHZpYV9jaGFuX2ZyZWUgKHN0cnVjdCB2aWFfaW5mbyAqY2FyZCwgc3RydWN0IHZpYV9jaGFubmVsICpjaGFuKQoreworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlzcGluX2xvY2tfaXJxICgmY2FyZC0+bG9jayk7CisKKwkvKiBzdG9wIGFueSBleGlzdGluZyBjaGFubmVsIG91dHB1dCAqLworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2hhbi0+aW9iYXNlKTsKKwl2aWFfY2hhbl9zdG9wIChjaGFuLT5pb2Jhc2UpOworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2hhbi0+aW9iYXNlKTsKKworCXNwaW5fdW5sb2NrX2lycSAoJmNhcmQtPmxvY2spOworCisJc3luY2hyb25pemVfaXJxKGNhcmQtPnBkZXYtPmlycSk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHZpYV9jaGFuX2J1ZmZlcl9mcmVlIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwlpbnQgaTsKKworICAgICAgICBEUFJJTlRLICgiRU5URVJcbiIpOworCisJLyogemVybyBsb2NhdGlvbiBvZiBETUEtYWJsZSBzY2F0dGVyLWdhdGhlciBpbmZvIHRhYmxlICovCisJdmlhX2FjOTdfd2FpdF9pZGxlKGNhcmQpOworCW91dGwgKDAsIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fVEFCTEVfQUREUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hhbi0+cGFnZV9udW1iZXI7IGkrKykKKwkJaWYgKGNoYW4tPnBndGJsW2ldLmNwdWFkZHIpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQgKGNhcmQtPnBkZXYsIFBBR0VfU0laRSwKKwkJCQkJICAgICBjaGFuLT5wZ3RibFtpXS5jcHVhZGRyLAorCQkJCQkgICAgIGNoYW4tPnBndGJsW2ldLmhhbmRsZSk7CisJCQljaGFuLT5wZ3RibFtpXS5jcHVhZGRyID0gTlVMTDsKKwkJCWNoYW4tPnBndGJsW2ldLmhhbmRsZSA9IDA7CisJCX0KKworCWNoYW4tPnBhZ2VfbnVtYmVyID0gMDsKKworCWlmIChjaGFuLT5zZ3RhYmxlKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQgKGNhcmQtPnBkZXYsCisJCQkoc2l6ZW9mIChzdHJ1Y3QgdmlhX3NnZF90YWJsZSkgKiBjaGFuLT5mcmFnX251bWJlciksCisJCQkodm9pZCopY2hhbi0+c2d0YWJsZSwgY2hhbi0+c2d0X2hhbmRsZSk7CisJCWNoYW4tPnNndGFibGUgPSBOVUxMOworCX0KKworCURQUklOVEsgKCJFWElUXG4iKTsKK30KKworCisvKioKKyAqCXZpYV9jaGFuX3BjbV9mbXQgLSBVcGRhdGUgUENNIGNoYW5uZWwgc2V0dGluZ3MKKyAqCUBjaGFuOiBDaGFubmVsIHRvIGJlIHVwZGF0ZWQKKyAqCUByZXNldDogQm9vbGVhbi4gIElmIG5vbi16ZXJvLCBjaGFubmVsIHdpbGwgYmUgcmVzZXQKKyAqCQl0byA4LWJpdCBtb25vIG1vZGUuCisgKgorICoJU3RvcmVzIHRoZSBzZXR0aW5ncyBvZiB0aGUgY3VycmVudCBQQ00gZm9ybWF0LAorICoJOC1iaXQgb3IgMTYtYml0LCBhbmQgbW9uby9zdGVyZW8sIGludG8gdGhlCisgKgloYXJkd2FyZSBzZXR0aW5ncyBmb3IgdGhlIHNwZWNpZmllZCBjaGFubmVsLgorICoJSWYgQHJlc2V0IGlzIG5vbi16ZXJvLCB0aGUgY2hhbm5lbCBpcyByZXNldAorICoJdG8gOC1iaXQgbW9ubyBtb2RlLiAgT3RoZXJ3aXNlLCB0aGUgY2hhbm5lbAorICoJaXMgc2V0IHRvIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBjaGFubmVsCisgKglpbmZvcm1hdGlvbiBzdHJ1Y3QgQGNoYW4uCisgKi8KKworc3RhdGljIHZvaWQgdmlhX2NoYW5fcGNtX2ZtdCAoc3RydWN0IHZpYV9jaGFubmVsICpjaGFuLCBpbnQgcmVzZXQpCit7CisJRFBSSU5USyAoIkVOVEVSLCBwY21fZm10PTB4JTAyWCwgcmVzZXQ9JXNcbiIsCisJCSBjaGFuLT5wY21fZm10LCByZXNldCA/ICJ5ZXMiIDogIm5vIik7CisKKwlhc3NlcnQgKGNoYW4gIT0gTlVMTCk7CisKKwlpZiAocmVzZXQpCisJeworCQkvKiByZXNldCB0byA4LWJpdCBtb25vIG1vZGUgKi8KKwkJY2hhbi0+cGNtX2ZtdCA9IDA7CisJCWNoYW4tPmNoYW5uZWxzID0gMTsKKwl9CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyBvbiBGTEFHIGFuZCBFT0wgKi8KKwljaGFuLT5wY21fZm10IHw9IFZJQV9DSEFOX1RZUEVfTUFTSzsKKworCS8qIGlmIHdlIGFyZSByZWNvcmRpbmcsIGVuYWJsZSByZWNvcmRpbmcgZmlmbyBiaXQgKi8KKwlpZiAoY2hhbi0+aXNfcmVjb3JkKQorCQljaGFuLT5wY21fZm10IHw9IFZJQV9QQ01fUkVDX0ZJRk87CisJLyogc2V0IGludGVycnVwdCBzZWxlY3QgYml0cyB3aGVyZSBhcHBsaWNhYmxlIChQQ00gaW4gJiBvdXQgY2hhbm5lbHMpICovCisJaWYgKCFjaGFuLT5pc19yZWNvcmQpCisJCWNoYW4tPnBjbV9mbXQgfD0gVklBX0NIQU5fVFlQRV9JTlRfU0VMRUNUOworCQorCURQUklOVEsoIlNFVCBGTVQgLSAlMDJ4ICUwMnhcbiIsIGNoYW4tPmludG1hc2sgLCBjaGFuLT5pc19tdWx0aSk7CisJCisJaWYoY2hhbi0+aW50bWFzaykKKwl7CisJCXUzMiBtOworCisJCS8qCisJCSAqCUNoYW5uZWwgMHg0IGlzIHVwIHRvIDYgeCAxNmJpdCBhbmQgaGFzIHRvIGJlCisJCSAqCXByb2dyYW1tZWQgZGlmZmVyZW50bHkgCisJCSAqLworCQkgCQkKKwkJaWYoY2hhbi0+aXNfbXVsdGkpCisJCXsKKwkJCXU4IGMgPSAwOworCQkJCisJCQkvKgorCQkJICoJTG9hZCB0aGUgdHlwZSBiaXQgZm9yIG51bSBjaGFubmVscworCQkJICoJYW5kIDgvMTZiaXQKKwkJCSAqLworCQkJIAorCQkJaWYoY2hhbi0+cGNtX2ZtdCAmIFZJQV9QQ01fRk1UXzE2QklUKQorCQkJCWMgPSAxIDw8IDc7CisJCQlpZihjaGFuLT5wY21fZm10ICYgVklBX1BDTV9GTVRfU1RFUkVPKQorCQkJCWMgfD0gKDI8PDQpOworCQkJZWxzZQorCQkJCWMgfD0gKDE8PDQpOworCQkJCQorCQkJb3V0YihjLCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX1RZUEUpOworCQkJCisJCQkvKgorCQkJICoJU2V0IHRoZSBjaGFubmVsIHN0ZWVyaW5nCisJCQkgKglNb25vCisJCQkgKgkJQ2hhbm5lbCAwIHRvIHNsb3QgMworCQkJICoJCUNoYW5uZWwgMCB0byBzbG90IDQKKwkJCSAqCVN0ZXJlbworCQkJICoJCUNoYW5uZWwgMCB0byBzbG90IDMKKwkJCSAqCQlDaGFubmVsIDEgdG8gc2xvdCA0CisJCQkgKi8KKwkJCSAKKwkJCXN3aXRjaChjaGFuLT5jaGFubmVscykKKwkJCXsKKwkJCQljYXNlIDE6CisJCQkJCW91dGwoMHhGRjAwMDAwMCB8ICgxPDwwKSB8ICgxPDw0KSAsIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCW91dGwoMHhGRjAwMDAwMCB8ICgxPDwwKSB8ICgyPDw0KSAsIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCW91dGwoMHhGRjAwMDAwMCB8ICgxPDwwKSB8ICgyPDw0KSB8ICgzPDw4KSB8ICg0PDwxMiksIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDY6CisJCQkJCW91dGwoMHhGRjAwMDAwMCB8ICgxPDwwKSB8ICgyPDw0KSB8ICg1PDw4KSB8ICg2PDwxMikgfCAoMzw8MTYpIHwgKDQ8PDIwKSwgY2hhbi0+aW9iYXNlICsgVklBX1BDTV9TVE9QUkFURSk7CisJCQkJCWJyZWFrOworCQkJfQkJCQkKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qCisJCQkgKglOZXcgc3R5bGUsIHR1cm4gb2ZmIGNoYW5uZWwgdm9sdW1lCisJCQkgKgljb250cm9sLCBzZXQgYml0cyBpbiB0aGUgcmlnaHQgcmVnaXN0ZXIKKwkJCSAqLwkKKwkJCW91dGIoMHgwLCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX0xFRlRWT0wpOworCQkJb3V0YigweDAsIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fUklHSFRWT0wpOworCisJCQltID0gaW5sKGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUpOworCQkJbSAmPSB+KDM8PDIwKTsKKwkJCWlmKGNoYW4tPnBjbV9mbXQgJiBWSUFfUENNX0ZNVF9TVEVSRU8pCisJCQkJbSB8PSAoMSA8PCAyMCk7CisJCQlpZihjaGFuLT5wY21fZm10ICYgVklBX1BDTV9GTVRfMTZCSVQpCisJCQkJbSB8PSAoMSA8PCAyMSk7CisJCQlvdXRsKG0sIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUpOworCQl9CQkKKwl9CisJZWxzZQorCQlvdXRiIChjaGFuLT5wY21fZm10LCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX1RZUEUpOworCisKKwlEUFJJTlRLICgiRVhJVCwgcGNtX2ZtdCA9IDB4JTAyWCwgcmVnID0gMHglMDJYXG4iLAorCQkgY2hhbi0+cGNtX2ZtdCwKKwkJIGluYiAoY2hhbi0+aW9iYXNlICsgVklBX1BDTV9UWVBFKSk7Cit9CisKKworLyoqCisgKgl2aWFfY2hhbl9jbGVhciAtIFN0b3AgRE1BIGNoYW5uZWwgb3BlcmF0aW9uLCBhbmQgcmVzZXQgcG9pbnRlcnMKKyAqCUBjYXJkOiB0aGUgY2hpcCB0byBhY2Nlc3NlZAorICoJQGNoYW46IENoYW5uZWwgdG8gYmUgY2xlYXJlZAorICoKKyAqCUNhbGwgdmlhX2NoYW5fc3RvcCB0byBoYWx0IERNQSBvcGVyYXRpb25zLCBhbmQgdGhlbiByZXNldHMKKyAqCWFsbCBzb2Z0d2FyZSBwb2ludGVycyB3aGljaCB0cmFjayBETUEgb3BlcmF0aW9uLgorICovCisKK3N0YXRpYyB2b2lkIHZpYV9jaGFuX2NsZWFyIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCXZpYV9jaGFuX3N0b3AgKGNoYW4tPmlvYmFzZSk7CisJdmlhX2NoYW5fYnVmZmVyX2ZyZWUoY2FyZCwgY2hhbik7CisJY2hhbi0+aXNfYWN0aXZlID0gMDsKKwljaGFuLT5pc19tYXBwZWQgPSAwOworCWNoYW4tPmlzX2VuYWJsZWQgPSAxOworCWNoYW4tPnNsb3BfbGVuID0gMDsKKwljaGFuLT5zd19wdHIgPSAwOworCWNoYW4tPm5faXJxcyA9IDA7CisJYXRvbWljX3NldCAoJmNoYW4tPmh3X3B0ciwgMCk7CisJRFBSSU5USyAoIkVYSVRcbiIpOworfQorCisKKy8qKgorICoJdmlhX2NoYW5fc2V0X3NwZWVkIC0gU2V0IFBDTSBzYW1wbGUgcmF0ZSBmb3IgZ2l2ZW4gY2hhbm5lbAorICoJQGNhcmQ6IFByaXZhdGUgaW5mbyBmb3Igc3BlY2lmaWVkIGJvYXJkCisgKglAY2hhbjogQ2hhbm5lbCB3aG9zZSBzYW1wbGUgcmF0ZSB3aWxsIGJlIGFkanVzdGVkCisgKglAdmFsOiBOZXcgc2FtcGxlIHJhdGUsIGluIEtoegorICoKKyAqCUhlbHBlciBmdW5jdGlvbiBmb3IgdGhlICVTTkRDVExfRFNQX1NQRUVEIGlvY3RsLiAgT1NTIHNlbWFudGljcworICoJZGVtYW5kIHRoYXQgYWxsIGF1ZGlvIG9wZXJhdGlvbnMgaGFsdCAoaWYgdGhleSBhcmUgbm90IGFscmVhZHkKKyAqCWhhbHRlZCkgd2hlbiB0aGUgJVNORENUTF9EU1BfU1BFRUQgaXMgZ2l2ZW4uCisgKgorICoJVGhpcyBmdW5jdGlvbiBoYWx0cyBhbGwgYXVkaW8gb3BlcmF0aW9ucyBmb3IgdGhlIGdpdmVuIGNoYW5uZWwKKyAqCUBjaGFuLCBhbmQgdGhlbiBjYWxscyB2aWFfc2V0X3JhdGUgdG8gc2V0IHRoZSBhdWRpbyBoYXJkd2FyZQorICoJdG8gdGhlIG5ldyByYXRlLgorICovCisKK3N0YXRpYyBpbnQgdmlhX2NoYW5fc2V0X3NwZWVkIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsCisJCQkgICAgICAgc3RydWN0IHZpYV9jaGFubmVsICpjaGFuLCBpbnQgdmFsKQoreworCURQUklOVEsgKCJFTlRFUiwgcmVxdWVzdGVkIHJhdGUgPSAlZFxuIiwgdmFsKTsKKworCXZpYV9jaGFuX2NsZWFyIChjYXJkLCBjaGFuKTsKKworCXZhbCA9IHZpYV9zZXRfcmF0ZSAoY2FyZC0+YWM5NywgY2hhbiwgdmFsKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWRcbiIsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworCisvKioKKyAqCXZpYV9jaGFuX3NldF9mbXQgLSBTZXQgUENNIHNhbXBsZSBzaXplIGZvciBnaXZlbiBjaGFubmVsCisgKglAY2FyZDogUHJpdmF0ZSBpbmZvIGZvciBzcGVjaWZpZWQgYm9hcmQKKyAqCUBjaGFuOiBDaGFubmVsIHdob3NlIHNhbXBsZSBzaXplIHdpbGwgYmUgYWRqdXN0ZWQKKyAqCUB2YWw6IE5ldyBzYW1wbGUgc2l6ZSwgdXNlIHRoZSAlQUZNVF94eHggY29uc3RhbnRzCisgKgorICoJSGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgJVNORENUTF9EU1BfU0VURk1UIGlvY3RsLiAgT1NTIHNlbWFudGljcworICoJZGVtYW5kIHRoYXQgYWxsIGF1ZGlvIG9wZXJhdGlvbnMgaGFsdCAoaWYgdGhleSBhcmUgbm90IGFscmVhZHkKKyAqCWhhbHRlZCkgd2hlbiB0aGUgJVNORENUTF9EU1BfU0VURk1UIGlzIGdpdmVuLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gaGFsdHMgYWxsIGF1ZGlvIG9wZXJhdGlvbnMgZm9yIHRoZSBnaXZlbiBjaGFubmVsCisgKglAY2hhbiwgYW5kIHRoZW4gY2FsbHMgdmlhX2NoYW5fcGNtX2ZtdCB0byBzZXQgdGhlIGF1ZGlvIGhhcmR3YXJlCisgKgl0byB0aGUgbmV3IHNhbXBsZSBzaXplLCBlaXRoZXIgOC1iaXQgb3IgMTYtYml0LgorICovCisKK3N0YXRpYyBpbnQgdmlhX2NoYW5fc2V0X2ZtdCAoc3RydWN0IHZpYV9pbmZvICpjYXJkLAorCQkJICAgICBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4sIGludCB2YWwpCit7CisJRFBSSU5USyAoIkVOVEVSLCB2YWw9JXNcbiIsCisJCSB2YWwgPT0gQUZNVF9VOCA/ICJBRk1UX1U4IiA6CisJIAkgdmFsID09IEFGTVRfUzE2X0xFID8gIkFGTVRfUzE2X0xFIiA6CisJCSAidW5rbm93biIpOworCisJdmlhX2NoYW5fY2xlYXIgKGNhcmQsIGNoYW4pOworCisJYXNzZXJ0ICh2YWwgIT0gQUZNVF9RVUVSWSk7IC8qIHRoaXMgY2FzZSBpcyBoYW5kbGVkIGVsc2V3aGVyZSAqLworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIEFGTVRfUzE2X0xFOgorCQlpZiAoKGNoYW4tPnBjbV9mbXQgJiBWSUFfUENNX0ZNVF8xNkJJVCkgPT0gMCkgeworCQkJY2hhbi0+cGNtX2ZtdCB8PSBWSUFfUENNX0ZNVF8xNkJJVDsKKwkJCXZpYV9jaGFuX3BjbV9mbXQgKGNoYW4sIDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBRk1UX1U4OgorCQlpZiAoY2hhbi0+cGNtX2ZtdCAmIFZJQV9QQ01fRk1UXzE2QklUKSB7CisJCQljaGFuLT5wY21fZm10ICY9IH5WSUFfUENNX0ZNVF8xNkJJVDsKKwkJCXZpYV9jaGFuX3BjbV9mbXQgKGNoYW4sIDApOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFBSSU5USyAoInVua25vd24gQUZNVDogMHglWFxuIiwgdmFsKTsKKwkJdmFsID0gQUZNVF9TMTZfTEU7CisJfQorCisJRFBSSU5USyAoIkVYSVRcbiIpOworCXJldHVybiB2YWw7Cit9CisKKworLyoqCisgKgl2aWFfY2hhbl9zZXRfc3RlcmVvIC0gRW5hYmxlIG9yIGRpc2FibGUgc3RlcmVvIGZvciBhIERNQSBjaGFubmVsCisgKglAY2FyZDogUHJpdmF0ZSBpbmZvIGZvciBzcGVjaWZpZWQgYm9hcmQKKyAqCUBjaGFuOiBDaGFubmVsIHdob3NlIHN0ZXJlbyBzZXR0aW5nIHdpbGwgYmUgYWRqdXN0ZWQKKyAqCUB2YWw6IE5ldyBzYW1wbGUgc2l6ZSwgdXNlIHRoZSAlQUZNVF94eHggY29uc3RhbnRzCisgKgorICoJSGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgJVNORENUTF9EU1BfQ0hBTk5FTFMgYW5kICVTTkRDVExfRFNQX1NURVJFTyBpb2N0bHMuICBPU1Mgc2VtYW50aWNzCisgKglkZW1hbmQgdGhhdCBhbGwgYXVkaW8gb3BlcmF0aW9ucyBoYWx0IChpZiB0aGV5IGFyZSBub3QgYWxyZWFkeQorICoJaGFsdGVkKSB3aGVuICVTTkRDVExfRFNQX0NIQU5ORUxTIG9yIFNORENUTF9EU1BfU1RFUkVPIGlzIGdpdmVuLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gaGFsdHMgYWxsIGF1ZGlvIG9wZXJhdGlvbnMgZm9yIHRoZSBnaXZlbiBjaGFubmVsCisgKglAY2hhbiwgYW5kIHRoZW4gY2FsbHMgdmlhX2NoYW5fcGNtX2ZtdCB0byBzZXQgdGhlIGF1ZGlvIGhhcmR3YXJlCisgKgl0byBlbmFibGUgb3IgZGlzYWJsZSBzdGVyZW8uCisgKi8KKworc3RhdGljIGludCB2aWFfY2hhbl9zZXRfc3RlcmVvIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsCisJCQkgICAgICAgIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiwgaW50IHZhbCkKK3sKKwlEUFJJTlRLICgiRU5URVIsIGNoYW5uZWxzID0gJWRcbiIsIHZhbCk7CisKKwl2aWFfY2hhbl9jbGVhciAoY2FyZCwgY2hhbik7CisKKwlzd2l0Y2ggKHZhbCkgeworCisJLyogbW9ubyAqLworCWNhc2UgMToKKwkJY2hhbi0+cGNtX2ZtdCAmPSB+VklBX1BDTV9GTVRfU1RFUkVPOworCQljaGFuLT5jaGFubmVscyA9IDE7CisJCXZpYV9jaGFuX3BjbV9mbXQgKGNoYW4sIDApOworCQlicmVhazsKKworCS8qIHN0ZXJlbyAqLworCWNhc2UgMjoKKwkJY2hhbi0+cGNtX2ZtdCB8PSBWSUFfUENNX0ZNVF9TVEVSRU87CisJCWNoYW4tPmNoYW5uZWxzID0gMjsKKwkJdmlhX2NoYW5fcGNtX2ZtdCAoY2hhbiwgMCk7CisJCWJyZWFrOworCisJY2FzZSA0OgorCWNhc2UgNjoKKwkJaWYoY2hhbi0+aXNfbXVsdGkpCisJCXsKKwkJCWNoYW4tPnBjbV9mbXQgfD0gVklBX1BDTV9GTVRfU1RFUkVPOworCQkJY2hhbi0+Y2hhbm5lbHMgPSB2YWw7CisJCQlicmVhazsKKwkJfQorCS8qIHVua25vd24gKi8KKwlkZWZhdWx0OgorCQl2YWwgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2NoYW5fc2V0X2J1ZmZlcmluZyAoc3RydWN0IHZpYV9pbmZvICpjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4sIGludCB2YWwpCit7CisJaW50IHNoaWZ0OworCisgICAgICAgIERQUklOVEsgKCJFTlRFUlxuIik7CisKKwkvKiBpbiBib3RoIGNhc2VzIHRoZSBidWZmZXIgY2Fubm90IGJlIGNoYW5nZWQgKi8KKwlpZiAoY2hhbi0+aXNfYWN0aXZlIHx8IGNoYW4tPmlzX21hcHBlZCkgeworCQlEUFJJTlRLICgiRVhJVFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNhbGxlZCBvdXRzaWRlIFNFVEZSQUdNRU5UICovCisJLyogc2V0IGRlZmF1bHRzIG9yIGRvIG5vdGhpbmcgKi8KKwlpZiAodmFsIDwgMCkgeworCisJCWlmIChjaGFuLT5mcmFnX3NpemUgJiYgY2hhbi0+ZnJhZ19udW1iZXIpCisJCQlnb3RvIG91dDsKKworCQlEUFJJTlRLICgiXG4iKTsKKworCQljaGFuLT5mcmFnX3NpemUgPSAoVklBX0RFRkFVTFRfRlJBR19USU1FICogY2hhbi0+cmF0ZSAqIGNoYW4tPmNoYW5uZWxzCisJCQkJICAgKiAoKGNoYW4tPnBjbV9mbXQgJiBWSUFfUENNX0ZNVF8xNkJJVCkgPyAyIDogMSkpIC8gMTAwMCAtIDE7CisKKwkJc2hpZnQgPSAwOworCQl3aGlsZSAoY2hhbi0+ZnJhZ19zaXplKSB7CisJCQljaGFuLT5mcmFnX3NpemUgPj49IDE7CisJCQlzaGlmdCsrOworCQl9CisJCWNoYW4tPmZyYWdfc2l6ZSA9IDEgPDwgc2hpZnQ7CisKKwkJY2hhbi0+ZnJhZ19udW1iZXIgPSAoVklBX0RFRkFVTFRfQlVGRkVSX1RJTUUgLyBWSUFfREVGQVVMVF9GUkFHX1RJTUUpOworCisJCURQUklOVEsgKCJzZXR0aW5nIGRlZmF1bHQgdmFsdWVzICVkICVkXG4iLCBjaGFuLT5mcmFnX3NpemUsIGNoYW4tPmZyYWdfbnVtYmVyKTsKKwl9IGVsc2UgeworCQljaGFuLT5mcmFnX3NpemUgPSAxIDw8ICh2YWwgJiAweEZGRkYpOworCQljaGFuLT5mcmFnX251bWJlciA9ICh2YWwgPj4gMTYpICYgMHhGRkZGOworCisJCURQUklOVEsgKCJ1c2luZyB1c2VyIHZhbHVlcyAlZCAlZFxuIiwgY2hhbi0+ZnJhZ19zaXplLCBjaGFuLT5mcmFnX251bWJlcik7CisJfQorCisJLyogcXVha2UzIHdhbnRzIGZyYWdfbnVtYmVyIHRvIGJlIGEgcG93ZXIgb2YgdHdvICovCisJc2hpZnQgPSAwOworCXdoaWxlIChjaGFuLT5mcmFnX251bWJlcikgeworCQljaGFuLT5mcmFnX251bWJlciA+Pj0gMTsKKwkJc2hpZnQrKzsKKwl9CisJY2hhbi0+ZnJhZ19udW1iZXIgPSAxIDw8IHNoaWZ0OworCisJaWYgKGNoYW4tPmZyYWdfc2l6ZSA+IFZJQV9NQVhfRlJBR19TSVpFKQorCQljaGFuLT5mcmFnX3NpemUgPSBWSUFfTUFYX0ZSQUdfU0laRTsKKwllbHNlIGlmIChjaGFuLT5mcmFnX3NpemUgPCBWSUFfTUlOX0ZSQUdfU0laRSkKKwkJY2hhbi0+ZnJhZ19zaXplID0gVklBX01JTl9GUkFHX1NJWkU7CisKKwlpZiAoY2hhbi0+ZnJhZ19udW1iZXIgPCBWSUFfTUlOX0ZSQUdfTlVNQkVSKQorICAgICAgICAgICAgICAgIGNoYW4tPmZyYWdfbnVtYmVyID0gVklBX01JTl9GUkFHX05VTUJFUjsKKyAgICAgICAgaWYgKGNoYW4tPmZyYWdfbnVtYmVyID4gVklBX01BWF9GUkFHX05VTUJFUikKKyAgICAgICAgCWNoYW4tPmZyYWdfbnVtYmVyID0gVklBX01BWF9GUkFHX05VTUJFUjsKKworCWlmICgoY2hhbi0+ZnJhZ19udW1iZXIgKiBjaGFuLT5mcmFnX3NpemUpIC8gUEFHRV9TSVpFID4gVklBX01BWF9CVUZGRVJfRE1BX1BBR0VTKQorCQljaGFuLT5mcmFnX251bWJlciA9IChWSUFfTUFYX0JVRkZFUl9ETUFfUEFHRVMgKiBQQUdFX1NJWkUpIC8gY2hhbi0+ZnJhZ19zaXplOworCitvdXQ6CisJaWYgKGNoYW4tPmlzX3JlY29yZCkKKwkJYXRvbWljX3NldCAoJmNoYW4tPm5fZnJhZ3MsIDApOworCWVsc2UKKwkJYXRvbWljX3NldCAoJmNoYW4tPm5fZnJhZ3MsIGNoYW4tPmZyYWdfbnVtYmVyKTsKKworCURQUklOVEsgKCJFWElUXG4iKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgVklBX0NIQU5fRFVNUF9CVUZTCisvKioKKyAqCXZpYV9jaGFuX2R1bXBfYnVmcyAtIERpc3BsYXkgRE1BIHRhYmxlIGNvbnRlbnRzCisgKglAY2hhbjogQ2hhbm5lbCB3aG9zZSBETUEgdGFibGUgd2lsbCBiZSBkaXNwbGF5ZWQKKyAqCisgKglEZWJ1Z2dpbmcgZnVuY3Rpb24gd2hpY2ggZGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZQorICoJc2NhdHRlci1nYXRoZXIgRE1BIHRhYmxlIGZvciB0aGUgZ2l2ZW4gY2hhbm5lbCBAY2hhbi4KKyAqLworCitzdGF0aWMgdm9pZCB2aWFfY2hhbl9kdW1wX2J1ZnMgKHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFuLT5mcmFnX251bWJlcjsgaSsrKSB7CisJCURQUklOVEsgKCIjJTAyZDogYWRkcj0leCwgY291bnQ9JXUsIGZsYWc9JWQsIGVvbD0lZFxuIiwKKwkJCSBpLCBjaGFuLT5zZ3RhYmxlW2ldLmFkZHIsCisJCQkgY2hhbi0+c2d0YWJsZVtpXS5jb3VudCAmIDB4MDBGRkZGRkYsCisJCQkgY2hhbi0+c2d0YWJsZVtpXS5jb3VudCAmIFZJQV9GTEFHID8gMSA6IDAsCisJCQkgY2hhbi0+c2d0YWJsZVtpXS5jb3VudCAmIFZJQV9FT0wgPyAxIDogMCk7CisJfQorCURQUklOVEsgKCJidWZfaW5fdXNlID0gJWQsIG5leHRidWYgPSAlZFxuIiwKKwkJIGF0b21pY19yZWFkICgmY2hhbi0+YnVmX2luX3VzZSksCisJCSBhdG9taWNfcmVhZCAoJmNoYW4tPnN3X3B0cikpOworfQorI2VuZGlmIC8qIFZJQV9DSEFOX0RVTVBfQlVGUyAqLworCisKKy8qKgorICoJdmlhX2NoYW5fZmx1c2hfZnJhZyAtIEZsdXNoIHBhcnRpYWxseS1mdWxsIHBsYXliYWNrIGJ1ZmZlciB0byBoYXJkd2FyZQorICoJQGNoYW46IENoYW5uZWwgd2hvc2UgRE1BIHRhYmxlIHdpbGwgYmUgZmx1c2hlZAorICoKKyAqCUZsdXNoZXMgcGFydGlhbGx5LWZ1bGwgcGxheWJhY2sgYnVmZmVyIHRvIGhhcmR3YXJlLgorICovCisKK3N0YXRpYyB2b2lkIHZpYV9jaGFuX2ZsdXNoX2ZyYWcgKHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0IChjaGFuLT5zbG9wX2xlbiA+IDApOworCisJaWYgKGNoYW4tPnN3X3B0ciA9PSAoY2hhbi0+ZnJhZ19udW1iZXIgLSAxKSkKKwkJY2hhbi0+c3dfcHRyID0gMDsKKwllbHNlCisJCWNoYW4tPnN3X3B0cisrOworCisJY2hhbi0+c2xvcF9sZW4gPSAwOworCisJYXNzZXJ0IChhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpID4gMCk7CisJYXRvbWljX2RlYyAoJmNoYW4tPm5fZnJhZ3MpOworCisJRFBSSU5USyAoIkVYSVRcbiIpOworfQorCisKKworLyoqCisgKgl2aWFfY2hhbl9tYXliZV9zdGFydCAtIEluaXRpYXRlIGF1ZGlvIGhhcmR3YXJlIERNQSBvcGVyYXRpb24KKyAqCUBjaGFuOiBDaGFubmVsIHdob3NlIERNQSBpcyB0byBiZSBzdGFydGVkCisgKgorICoJSW5pdGlhdGUgRE1BIG9wZXJhdGlvbiwgaWYgdGhlIERNQSBlbmdpbmUgZm9yIHRoZSBnaXZlbgorICoJY2hhbm5lbCBAY2hhbiBpcyBub3QgYWxyZWFkeSBhY3RpdmUuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHZpYV9jaGFuX21heWJlX3N0YXJ0IChzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4pCit7CisJYXNzZXJ0IChjaGFuLT5pc19hY3RpdmUgPT0gc2dfYWN0aXZlKGNoYW4tPmlvYmFzZSkpOworCisJRFBSSU5USyAoIk1BWUJFIFNUQVJUICVzXG4iLCBjaGFuLT5uYW1lKTsKKwlpZiAoIWNoYW4tPmlzX2FjdGl2ZSAmJiBjaGFuLT5pc19lbmFibGVkKSB7CisJCWNoYW4tPmlzX2FjdGl2ZSA9IDE7CisJCXNnX2JlZ2luIChjaGFuKTsKKwkJRFBSSU5USyAoInN0YXJ0aW5nIGNoYW5uZWwgJXNcbiIsIGNoYW4tPm5hbWUpOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEludGVyZmFjZSB0byBhYzk3LWNvZGVjIG1vZHVsZQorICoKKyAqCisgKi8KKworLyoqCisgKgl2aWFfYWM5N193YWl0X2lkbGUgLSBXYWl0IHVudGlsIEFDOTcgY29kZWMgaXMgbm90IGJ1c3kKKyAqCUBjYXJkOiBQcml2YXRlIGluZm8gZm9yIHNwZWNpZmllZCBib2FyZAorICoKKyAqCVNsZWVwIHVudGlsIHRoZSBBQzk3IGNvZGVjIGlzIG5vIGxvbmdlciBidXN5LgorICoJUmV0dXJucyB0aGUgZmluYWwgdmFsdWUgcmVhZCBmcm9tIHRoZSBTR0QKKyAqCXJlZ2lzdGVyIGJlaW5nIHBvbGxlZC4KKyAqLworCitzdGF0aWMgdTggdmlhX2FjOTdfd2FpdF9pZGxlIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQpCit7CisJdTggdG1wODsKKwlpbnQgY291bnRlciA9IFZJQV9DT1VOVEVSX0xJTUlUOworCisJRFBSSU5USyAoIkVOVEVSL0VYSVRcbiIpOworCisJYXNzZXJ0IChjYXJkICE9IE5VTEwpOworCWFzc2VydCAoY2FyZC0+cGRldiAhPSBOVUxMKTsKKworCWRvIHsKKwkJdWRlbGF5ICgxNSk7CisKKwkJdG1wOCA9IGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDgzKTsKKwl9IHdoaWxlICgodG1wOCAmIFZJQV9DUjgzX0JVU1kpICYmIChjb3VudGVyLS0gPiAwKSk7CisKKwlpZiAodG1wOCAmIFZJQV9DUjgzX0JVU1kpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HIFBGWCAidGltZW91dCB3YWl0aW5nIG9uIEFDOTcgY29kZWNcbiIpOworCXJldHVybiB0bXA4OworfQorCisKKy8qKgorICoJdmlhX2FjOTdfcmVhZF9yZWcgLSBSZWFkIEFDOTcgc3RhbmRhcmQgcmVnaXN0ZXIKKyAqCUBjb2RlYzogUG9pbnRlciB0byBnZW5lcmljIEFDOTcgY29kZWMgaW5mbworICoJQHJlZzogSW5kZXggb2YgQUM5NyByZWdpc3RlciB0byBiZSByZWFkCisgKgorICoJUmVhZCB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgQUM5NyBjb2RlYyByZWdpc3RlciwKKyAqCWFzIGRlZmluZWQgYnkgdGhlIEludGVsIEFDOTcgc3BlY2lmaWNhdGlvbi4KKyAqCisgKglEZWZpbmVzIHRoZSBzdGFuZGFyZCBBQzk3IHJlYWQtcmVnaXN0ZXIgb3BlcmF0aW9uCisgKglyZXF1aXJlZCBieSB0aGUga2VybmVsJ3MgYWM5N19jb2RlYyBpbnRlcmZhY2UuCisgKgorICoJUmV0dXJucyB0aGUgMTYtYml0IHZhbHVlIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkCisgKglyZWdpc3Rlci4KKyAqLworCitzdGF0aWMgdTE2IHZpYV9hYzk3X3JlYWRfcmVnIChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJc3RydWN0IHZpYV9pbmZvICpjYXJkOworCWludCBjb3VudGVyOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAoY29kZWMgIT0gTlVMTCk7CisJYXNzZXJ0IChjb2RlYy0+cHJpdmF0ZV9kYXRhICE9IE5VTEwpOworCisJY2FyZCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJCisJc3Bpbl9sb2NrKCZjYXJkLT5hYzk3X2xvY2spOworCisJLyogRXZlcnkgdGltZSB3ZSB3cml0ZSB0byByZWdpc3RlciA4MCB3ZSBjYXVzZSBhIHRyYW5zYWN0aW9uLgorCSAgIFRoZSBvbmx5IHNhZmUgd2F5IHRvIGNsZWFyIHRoZSB2YWxpZCBiaXQgaXMgdG8gd3JpdGUgaXQgYXQKKwkgICB0aGUgc2FtZSB0aW1lIGFzIHRoZSBjb21tYW5kICovCisJZGF0YSA9IChyZWcgPDwgMTYpIHwgVklBX0NSODBfUkVBRCB8IFZJQV9DUjgwX1ZBTElEOworCisJb3V0bCAoZGF0YSwgY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfQUM5N19DVFJMKTsKKwl1ZGVsYXkgKDIwKTsKKworCWZvciAoY291bnRlciA9IFZJQV9DT1VOVEVSX0xJTUlUOyBjb3VudGVyID4gMDsgY291bnRlci0tKSB7CisJCXVkZWxheSAoMSk7CisJCWlmICgoKChkYXRhID0gaW5sKGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX0FDOTdfQ1RSTCkpICYKKwkJICAgICAgKFZJQV9DUjgwX1ZBTElEfFZJQV9DUjgwX0JVU1kpKSA9PSBWSUFfQ1I4MF9WQUxJRCkpCisJCQlnb3RvIG91dDsKKwl9CisKKwlwcmludGsgKEtFUk5fV0FSTklORyBQRlggInRpbWVvdXQgd2hpbGUgcmVhZGluZyBBQzk3IGNvZGVjICgweCVsWClcbiIsIGRhdGEpOworCWdvdG8gZXJyX291dDsKKworb3V0OgorCS8qIE9uY2UgdGhlIHZhbGlkIGJpdCBoYXMgYmVjb21lIHNldCwgd2UgbXVzdCB3YWl0IGEgY29tcGxldGUgQUM5NworCSAgIGZyYW1lIGJlZm9yZSB0aGUgZGF0YSBoYXMgc2V0dGxlZC4gKi8KKwl1ZGVsYXkoMjUpOworCWRhdGEgPSAodW5zaWduZWQgbG9uZykgaW5sIChjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9BQzk3X0NUUkwpOworCisJb3V0YiAoMHgwMiwgY2FyZC0+YmFzZWFkZHIgKyAweDgzKTsKKworCWlmICgoKGRhdGEgJiAweDAwN0YwMDAwKSA+PiAxNikgPT0gcmVnKSB7CisJCURQUklOVEsgKCJFWElULCBzdWNjZXNzLCBkYXRhPTB4JWx4LCByZXR2YWw9MHglbHhcbiIsCisJCQkgZGF0YSwgZGF0YSAmIDB4MDAwMEZGRkYpOworCQlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwkJcmV0dXJuIGRhdGEgJiAweDAwMDBGRkZGOworCX0KKworCXByaW50ayAoS0VSTl9XQVJOSU5HICJ2aWE4MmN4eHhfYXVkaW86IG5vdCBvdXIgaW5kZXg6IHJlZz0weCV4LCBuZXdyZWc9MHglbHhcbiIsCisJCXJlZywgKChkYXRhICYgMHgwMDdGMDAwMCkgPj4gMTYpKTsKKworZXJyX291dDoKKwlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworfQorCisKKy8qKgorICoJdmlhX2FjOTdfd3JpdGVfcmVnIC0gV3JpdGUgQUM5NyBzdGFuZGFyZCByZWdpc3RlcgorICoJQGNvZGVjOiBQb2ludGVyIHRvIGdlbmVyaWMgQUM5NyBjb2RlYyBpbmZvCisgKglAcmVnOiBJbmRleCBvZiBBQzk3IHJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqCUB2YWx1ZTogVmFsdWUgdG8gYmUgd3JpdHRlbiB0byBBQzk3IHJlZ2lzdGVyCisgKgorICoJV3JpdGUgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIEFDOTcgY29kZWMgcmVnaXN0ZXIsCisgKglhcyBkZWZpbmVkIGJ5IHRoZSBJbnRlbCBBQzk3IHNwZWNpZmljYXRpb24uCisgKgorICoJRGVmaW5lcyB0aGUgc3RhbmRhcmQgQUM5NyB3cml0ZS1yZWdpc3RlciBvcGVyYXRpb24KKyAqCXJlcXVpcmVkIGJ5IHRoZSBrZXJuZWwncyBhYzk3X2NvZGVjIGludGVyZmFjZS4KKyAqLworCitzdGF0aWMgdm9pZCB2aWFfYWM5N193cml0ZV9yZWcgKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsdWUpCit7CisJdTMyIGRhdGE7CisJc3RydWN0IHZpYV9pbmZvICpjYXJkOworCWludCBjb3VudGVyOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAoY29kZWMgIT0gTlVMTCk7CisJYXNzZXJ0IChjb2RlYy0+cHJpdmF0ZV9kYXRhICE9IE5VTEwpOworCisJY2FyZCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJCisJZGF0YSA9IChyZWcgPDwgMTYpICsgdmFsdWU7CisJb3V0bCAoZGF0YSwgY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfQUM5N19DVFJMKTsKKwl1ZGVsYXkgKDEwKTsKKworCWZvciAoY291bnRlciA9IFZJQV9DT1VOVEVSX0xJTUlUOyBjb3VudGVyID4gMDsgY291bnRlci0tKSB7CisJCWlmICgoaW5iIChjYXJkLT5iYXNlYWRkciArIDB4ODMpICYgVklBX0NSODNfQlVTWSkgPT0gMCkKKwkJCWdvdG8gb3V0OworCisJCXVkZWxheSAoMTUpOworCX0KKworCXByaW50ayAoS0VSTl9XQVJOSU5HIFBGWCAidGltZW91dCBhZnRlciBBQzk3IGNvZGVjIHdyaXRlICgweCVYLCAweCVYKVxuIiwgcmVnLCB2YWx1ZSk7CisKK291dDoKKwlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworc3RhdGljIGludCB2aWFfbWl4ZXJfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnZyOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCXdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwZGV2KSkgIT0gTlVMTCkgeworCQlkcnZyID0gcGNpX2Rldl9kcml2ZXIgKHBkZXYpOworCQlpZiAoZHJ2ciA9PSAmdmlhX2RyaXZlcikgeworCQkJYXNzZXJ0IChwY2lfZ2V0X2RydmRhdGEgKHBkZXYpICE9IE5VTEwpOworCisJCQljYXJkID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwkJCWlmIChjYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQkJZ290byBtYXRjaDsKKwkJfQorCX0KKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVOT0RFVlxuIik7CisJcmV0dXJuIC1FTk9ERVY7CisKK21hdGNoOgorCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQtPmFjOTc7CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCB2aWFfbWl4ZXJfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisJaW50IG5vbmJsb2NrID0gKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlpbnQgcmM7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0IChjb2RlYyAhPSBOVUxMKTsKKwljYXJkID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlyYyA9IHZpYV9zeXNjYWxsX2Rvd24gKGNhcmQsIG5vbmJsb2NrKTsKKwlpZiAocmMpIGdvdG8gb3V0OworCQorI2lmIDAKKwkvKgorCSAqCUludGVyY2VwdCB2b2x1bWUgY29udHJvbCBvbiA4MjMzIGFuZCA4MjM1CisJICovCisJaWYoY2FyZC0+dm9sdW1lKQorCXsKKwkJc3dpdGNoKGNtZCkKKwkJeworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1ZPTFVNRToKKwkJCQlyZXR1cm4gY2FyZC0+bWl4ZXJfdm9sOworCQkJY2FzZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUU6CisJCQl7CisJCQkJaW50IHY7CisJCQkJaWYoZ2V0X3VzZXIodiwgKGludCAqKWFyZykpCisJCQkJeworCQkJCQlyYyA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQljYXJkLT5taXhlcl92b2wgPSB2OworCQkJfQorCQl9CisJfQkJCisjZW5kaWYKKwlyYyA9IGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworCisJdXAgKCZjYXJkLT5zeXNjYWxsX3NlbSk7CisKK291dDoKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpYV9taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB2aWFfbWl4ZXJfb3BlbiwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gdmlhX21peGVyX2lvY3RsLAorfTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWFfYWM5N19yZXNldCAoc3RydWN0IHZpYV9pbmZvICpjYXJkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY2FyZC0+cGRldjsKKwl1OCB0bXA4OworCXUxNiB0bXAxNjsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKHBkZXYgIT0gTlVMTCk7CisKKyNpZm5kZWYgTkRFQlVHCisJeworCQl1OCByNDAscjQxLHI0MixyNDMscjQ0LHI0ODsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDAsICZyNDApOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0MSwgJnI0MSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQyLCAmcjQyKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDMsICZyNDMpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0NCwgJnI0NCk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQ4LCAmcjQ4KTsKKwkJRFBSSU5USyAoIlBDSSBjb25maWc6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJcjQwLHI0MSxyNDIscjQzLHI0NCxyNDgpOworCisJCXNwaW5fbG9ja19pcnEgKCZjYXJkLT5sb2NrKTsKKwkJRFBSSU5USyAoInJlZ3M9PSUwMlggJTAyWCAlMDJYICUwOFggJTA4WCAlMDhYICUwOFhcbiIsCisJCQkgaW5iIChjYXJkLT5iYXNlYWRkciArIDB4MDApLAorCQkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAxKSwKKwkJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMiksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4MDQpLAorCQkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDBDKSwKKwkJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHg4MCksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4ODQpKTsKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2FyZC0+bG9jayk7CisKKwl9CisjZW5kaWYKKworICAgICAgICAvKgorICAgICAgICAgKiBSZXNldCBBQzk3IGNvbnRyb2xsZXI6IGVuYWJsZSwgZGlzYWJsZSwgZW5hYmxlLAorICAgICAgICAgKiBwYXVzaW5nIGFmdGVyIGVhY2ggY29tbWFuZCBmb3IgZ29vZCBsdWNrLiAgT25seQorCSAqIGRvIHRoaXMgaWYgdGhlIGNvZGVjIGlzIG5vdCByZWFkeSwgYmVjYXVzZSBpdCBjYXVzZXMKKwkgKiBsb3VkIHBvcHMgYW5kIHN1Y2ggZHVlIHRvIHN1Y2ggYSBoYXJkIGNvZGVjIHJlc2V0LgorICAgICAgICAgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZSAocGRldiwgVklBX0FDTElOS19TVEFUVVMsICZ0bXA4KTsKKwlpZiAoKHRtcDggJiBWSUFfQ1I0MF9BQzk3X1JFQURZKSA9PSAwKSB7CisgICAgICAgIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUgKHBkZXYsIFZJQV9BQ0xJTktfQ1RSTCwKKwkJCQkgICAgICAgVklBX0NSNDFfQUM5N19FTkFCTEUgfAorICAgICAgICAgICAgICAgIAkJICAgICAgIFZJQV9DUjQxX0FDOTdfUkVTRVQgfAorCQkJCSAgICAgICBWSUFfQ1I0MV9BQzk3X1dBS0VVUCk7CisgICAgICAgIAl1ZGVsYXkgKDEwMCk7CisKKyAgICAgICAgCXBjaV93cml0ZV9jb25maWdfYnl0ZSAocGRldiwgVklBX0FDTElOS19DVFJMLCAwKTsKKyAgICAgICAgCXVkZWxheSAoMTAwKTsKKworICAgICAgICAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChwZGV2LCBWSUFfQUNMSU5LX0NUUkwsCisJCQkJICAgICAgIFZJQV9DUjQxX0FDOTdfRU5BQkxFIHwKKwkJCQkgICAgICAgVklBX0NSNDFfUENNX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgCQkgICAgICAgVklBX0NSNDFfVlJBIHwgVklBX0NSNDFfQUM5N19SRVNFVCk7CisgICAgICAgIAl1ZGVsYXkgKDEwMCk7CisJfQorCisJLyogTWFrZSBzdXJlIFZSQSBpcyBlbmFibGVkLCBpbiBjYXNlIHdlIGRpZG4ndCBkbyBhCisJICogY29tcGxldGUgY29kZWMgcmVzZXQsIGFib3ZlCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUgKHBkZXYsIFZJQV9BQ0xJTktfQ1RSTCwgJnRtcDgpOworCWlmICgoKHRtcDggJiBWSUFfQ1I0MV9WUkEpID09IDApIHx8CisJICAgICgodG1wOCAmIFZJQV9DUjQxX0FDOTdfRU5BQkxFKSA9PSAwKSB8fAorCSAgICAoKHRtcDggJiBWSUFfQ1I0MV9QQ01fRU5BQkxFKSA9PSAwKSB8fAorCSAgICAoKHRtcDggJiBWSUFfQ1I0MV9BQzk3X1JFU0VUKSA9PSAwKSkgeworICAgICAgICAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChwZGV2LCBWSUFfQUNMSU5LX0NUUkwsCisJCQkJICAgICAgIFZJQV9DUjQxX0FDOTdfRU5BQkxFIHwKKwkJCQkgICAgICAgVklBX0NSNDFfUENNX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgCQkgICAgICAgVklBX0NSNDFfVlJBIHwgVklBX0NSNDFfQUM5N19SRVNFVCk7CisgICAgICAgIAl1ZGVsYXkgKDEwMCk7CisJfQorCisJaWYoY2FyZC0+bGVnYWN5KQorCXsKKyNpZiAwIC8qIHRoaXMgYnJlYWtzIG9uIEs3TSAqLworCQkvKiBkaXNhYmxlIGxlZ2FjeSBzdHVmZiAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUgKHBkZXYsIDB4NDIsIDB4MDApOworCQl1ZGVsYXkoMTApOworI2VuZGlmCisKKwkJLyogcm91dGUgRk0gdHJhcCB0byBJUlEsIGRpc2FibGUgRk0gdHJhcCAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUgKHBkZXYsIDB4NDgsIDB4MDUpOworCQl1ZGVsYXkoMTApOworCX0KKwkKKwkvKiBkaXNhYmxlIGFsbCBjb2RlYyBHUEkgaW50ZXJydXB0cyAqLworCW91dGwgKDAsIHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCkgKyAweDhDKTsKKworCS8qIFdBUk5JTkc6IHRoaXMgbGluZSBpcyBtYWdpYy4gIFJlbW92ZSB0aGlzCisJICogYW5kIHRoaW5ncyBicmVhay4gKi8KKwkvKiBlbmFibGUgdmFyaWFibGUgcmF0ZSAqLworIAl0bXAxNiA9IHZpYV9hYzk3X3JlYWRfcmVnIChjYXJkLT5hYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisgCWlmICgodG1wMTYgJiAxKSA9PSAwKQorIAkJdmlhX2FjOTdfd3JpdGVfcmVnIChjYXJkLT5hYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgdG1wMTYgfCAxKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgdmlhX2FjOTdfY29kZWNfd2FpdCAoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCWFzc2VydCAoY29kZWMtPnByaXZhdGVfZGF0YSAhPSBOVUxMKTsKKwl2aWFfYWM5N193YWl0X2lkbGUgKGNvZGVjLT5wcml2YXRlX2RhdGEpOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZpYV9hYzk3X2luaXQgKHN0cnVjdCB2aWFfaW5mbyAqY2FyZCkKK3sKKwlpbnQgcmM7CisJdTE2IHRtcDE2OworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAoY2FyZCAhPSBOVUxMKTsKKworCWNhcmQtPmFjOTcgPSBhYzk3X2FsbG9jX2NvZGVjKCk7CisJaWYoY2FyZC0+YWM5NyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwkJCisJY2FyZC0+YWM5Ny0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKwljYXJkLT5hYzk3LT5jb2RlY19yZWFkID0gdmlhX2FjOTdfcmVhZF9yZWc7CisJY2FyZC0+YWM5Ny0+Y29kZWNfd3JpdGUgPSB2aWFfYWM5N193cml0ZV9yZWc7CisJY2FyZC0+YWM5Ny0+Y29kZWNfd2FpdCA9IHZpYV9hYzk3X2NvZGVjX3dhaXQ7CisKKwljYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlciAoJnZpYV9taXhlcl9mb3BzLCAtMSk7CisJaWYgKGNhcmQtPmFjOTctPmRldl9taXhlciA8IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byByZWdpc3RlciBBQzk3IG1peGVyLCBhYm9ydGluZ1xuIik7CisJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVJT1xuIik7CisJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmMgPSB2aWFfYWM5N19yZXNldCAoY2FyZCk7CisJaWYgKHJjKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gcmVzZXQgQUM5NyBjb2RlYywgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCQorCW1kZWxheSgxMCk7CisJCisJaWYgKGFjOTdfcHJvYmVfY29kZWMgKGNhcmQtPmFjOTcpID09IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byBwcm9iZSBBQzk3IGNvZGVjLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIGVuYWJsZSB2YXJpYWJsZSByYXRlICovCisJdG1wMTYgPSB2aWFfYWM5N19yZWFkX3JlZyAoY2FyZC0+YWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCXZpYV9hYzk3X3dyaXRlX3JlZyAoY2FyZC0+YWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIHRtcDE2IHwgMSk7CisKKyAJLyoKKyAJICogSWYgd2UgY2Fubm90IGVuYWJsZSBWUkEsIHdlIGhhdmUgYSBsb2NrZWQtcmF0ZSBjb2RlYy4KKyAJICogV2UgdHJ5IGFnYWluIHRvIGVuYWJsZSBWUkEgYmVmb3JlIGFzc3VtaW5nIHNvLCBob3dldmVyLgorIAkgKi8KKyAJdG1wMTYgPSB2aWFfYWM5N19yZWFkX3JlZyAoY2FyZC0+YWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworIAlpZiAoKHRtcDE2ICYgMSkgPT0gMCkgeworIAkJdmlhX2FjOTdfd3JpdGVfcmVnIChjYXJkLT5hYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgdG1wMTYgfCAxKTsKKyAJCXRtcDE2ID0gdmlhX2FjOTdfcmVhZF9yZWcgKGNhcmQtPmFjOTcsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKyAJCWlmICgodG1wMTYgJiAxKSA9PSAwKSB7CisgCQkJY2FyZC0+bG9ja2VkX3JhdGUgPSAxOworIAkJCXByaW50ayAoS0VSTl9XQVJOSU5HIFBGWCAiQ29kZWMgcmF0ZSBsb2NrZWQgYXQgNDhLaHpcbiIpOworIAkJfQorIAl9CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworCitlcnJfb3V0OgorCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIgKGNhcmQtPmFjOTctPmRldl9taXhlcik7CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOworCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3KTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgdmlhX2FjOTdfY2xlYW51cCAoc3RydWN0IHZpYV9pbmZvICpjYXJkKQoreworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisJYXNzZXJ0IChjYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPj0gMCk7CisKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyIChjYXJkLT5hYzk3LT5kZXZfbWl4ZXIpOworCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3KTsKKworCURQUklOVEsgKCJFWElUXG4iKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW50ZXJydXB0LXJlbGF0ZWQgY29kZQorICoKKyAqLworCisvKioKKyAqCXZpYV9pbnRyX2NoYW5uZWwgLSBoYW5kbGUgYW4gaW50ZXJydXB0IGZvciBhIHNpbmdsZSBjaGFubmVsCisgKiAgICAgIEBjYXJkOiB1bnVzZWQKKyAqCUBjaGFuOiBoYW5kbGUgaW50ZXJydXB0IGZvciB0aGlzIGNoYW5uZWwKKyAqCisgKglUaGlzIGlzIHRoZSAibWVhdCIgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLAorICoJY29udGFpbmluZyB0aGUgYWN0aW9ucyB0YWtlbiBlYWNoIHRpbWUgYW4gaW50ZXJydXB0CisgKglvY2N1cnMuICBBbGwgY29tbXVuaWNhdGlvbiBhbmQgY29vcmRpbmF0aW9uIHdpdGgKKyAqCXVzZXJzcGFjZSB0YWtlcyBwbGFjZSBoZXJlLgorICoKKyAqCUxvY2tpbmc6IGluc2lkZSBjYXJkLT5sb2NrCisgKi8KKworc3RhdGljIHZvaWQgdmlhX2ludHJfY2hhbm5lbCAoc3RydWN0IHZpYV9pbmZvICpjYXJkLCBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4pCit7CisJdTggc3RhdHVzOworCWludCBuOworCQorCS8qIGNoZWNrIHBlcnRpbmVudCBiaXRzIG9mIHN0YXR1cyByZWdpc3RlciBmb3IgYWN0aW9uIGJpdHMgKi8KKwlzdGF0dXMgPSBpbmIgKGNoYW4tPmlvYmFzZSkgJiAoVklBX1NHRF9GTEFHIHwgVklBX1NHRF9FT0wgfCBWSUFfU0dEX1NUT1BQRUQpOworCWlmICghc3RhdHVzKQorCQlyZXR1cm47CisKKwkvKiBhY2tub3dsZWRnZSBhbnkgZmxhZ2dlZCBiaXRzIEFTQVAgKi8KKwlvdXRiIChzdGF0dXMsIGNoYW4tPmlvYmFzZSk7CisKKwlpZiAoIWNoYW4tPnNndGFibGUpIC8qIFhYWDogdGVtcG9yYXJ5IHNvbHV0aW9uICovCisJCXJldHVybjsKKworCS8qIGdyYWIgY3VycmVudCBoL3cgcHRyIHZhbHVlICovCisJbiA9IGF0b21pY19yZWFkICgmY2hhbi0+aHdfcHRyKTsKKworCS8qIHNhbml0eSBjaGVjazogbWFrZSBzdXJlIG91ciBoL3cgcHRyIGRvZXNuJ3QgaGF2ZSBhIHdlaXJkIHZhbHVlICovCisJYXNzZXJ0IChuID49IDApOworCWFzc2VydCAobiA8IGNoYW4tPmZyYWdfbnVtYmVyKTsKKworCQorCS8qIHJlc2V0IFNHRCBkYXRhIHN0cnVjdHVyZSBpbiBtZW1vcnkgdG8gcmVmbGVjdCBhIGZ1bGwgYnVmZmVyLAorCSAqIGFuZCBhZHZhbmNlIHRoZSBoL3cgcHRyLCB3cmFwcGluZyBhcm91bmQgdG8gemVybyBpZiBuZWVkZWQKKwkgKi8KKwlpZiAobiA9PSAoY2hhbi0+ZnJhZ19udW1iZXIgLSAxKSkgeworCQljaGFuLT5zZ3RhYmxlW25dLmNvdW50ID0gY3B1X3RvX2xlMzIoY2hhbi0+ZnJhZ19zaXplIHwgVklBX0VPTCk7CisJCWF0b21pY19zZXQgKCZjaGFuLT5od19wdHIsIDApOworCX0gZWxzZSB7CisJCWNoYW4tPnNndGFibGVbbl0uY291bnQgPSBjcHVfdG9fbGUzMihjaGFuLT5mcmFnX3NpemUgfCBWSUFfRkxBRyk7CisJCWF0b21pY19pbmMgKCZjaGFuLT5od19wdHIpOworCX0KKworCS8qIGFjY291bnRpbmcgY3JhcCBmb3IgU05EQ1RMX0RTUF9HRVR4UFRSICovCisJY2hhbi0+bl9pcnFzKys7CisJY2hhbi0+Ynl0ZXMgKz0gY2hhbi0+ZnJhZ19zaXplOworCS8qIEZJWE1FIC0gc2lnbmVkIG92ZXJmbG93IGlzIHVuZGVmaW5lZCAqLworCWlmIChjaGFuLT5ieXRlcyA8IDApIC8qIGhhbmRsZSBvdmVyZmxvdyBvZiAzMS1iaXQgdmFsdWUgKi8KKwkJY2hhbi0+Ynl0ZXMgPSBjaGFuLT5mcmFnX3NpemU7CisJLyogYWxsIGZvbGxvd2luZyBjaGVja3Mgb25seSBvY2N1ciB3aGVuIG5vdCBpbiBtbWFwKDIpIG1vZGUgKi8KKwlpZiAoIWNoYW4tPmlzX21hcHBlZCkKKwl7CisJCS8qIElmIHdlIGFyZSByZWNvcmRpbmcsIHRoZW4gbl9mcmFncyByZXByZXNlbnRzIHRoZSBudW1iZXIKKwkJICogb2YgZnJhZ21lbnRzIHdhaXRpbmcgdG8gYmUgaGFuZGxlZCBieSB1c2Vyc3BhY2UuCisJCSAqIElmIHdlIGFyZSBwbGF5YmFjaywgdGhlbiBuX2ZyYWdzIHJlcHJlc2VudHMgdGhlIG51bWJlcgorCQkgKiBvZiBmcmFnbWVudHMgcmVtYWluaW5nIHRvIGJlIGZpbGxlZCBieSB1c2Vyc3BhY2UuCisJCSAqIFdlIGluY3JlbWVudCBoZXJlLiAgSWYgd2UgcmVhY2ggbWF4IG51bWJlciBvZiBmcmFnbWVudHMsCisJCSAqIHRoaXMgaW5kaWNhdGVzIGFuIHVuZGVycnVuL292ZXJydW4uICBGb3IgdGhpcyBjYXNlIHVuZGVyIE9TUywKKwkJICogd2Ugc3RvcCB0aGUgcmVjb3JkL3BsYXliYWNrIHByb2Nlc3MuCisJCSAqLworCQlpZiAoYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKSA8IGNoYW4tPmZyYWdfbnVtYmVyKQorCQkJYXRvbWljX2luYyAoJmNoYW4tPm5fZnJhZ3MpOworCQlhc3NlcnQgKGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykgPD0gY2hhbi0+ZnJhZ19udW1iZXIpOworCQlpZiAoYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKSA9PSBjaGFuLT5mcmFnX251bWJlcikgeworCQkJY2hhbi0+aXNfYWN0aXZlID0gMDsKKwkJCXZpYV9jaGFuX3N0b3AgKGNoYW4tPmlvYmFzZSk7CisJCX0KKwl9CisJLyogd2FrZSB1cCBhbnlvbmUgbGlzdGVuaW5nIHRvIHNlZSB3aGVuIGludGVycnVwdHMgb2NjdXIgKi8KKwl3YWtlX3VwX2FsbCAoJmNoYW4tPndhaXQpOworCisJRFBSSU5USyAoIiVzIGludHIsIHN0YXR1cz0weCUwMlgsIGh3cHRyPTB4JWxYLCBjaGFuLT5od19wdHI9JWRcbiIsCisJCSBjaGFuLT5uYW1lLCBzdGF0dXMsIChsb25nKSBpbmwgKGNoYW4tPmlvYmFzZSArIDB4MDQpLAorCQkgYXRvbWljX3JlYWQgKCZjaGFuLT5od19wdHIpKTsKKworCURQUklOVEsgKCIlcyBpbnRyLCBjaGFubmVsIG5fZnJhZ3MgPT0gJWQsIG1pc3NlZCAlZFxuIiwgY2hhbi0+bmFtZSwKKwkJIGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncyksIG1pc3NlZCk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90ICB2aWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHZpYV9pbmZvICpjYXJkID0gZGV2X2lkOworCXUzMiBzdGF0dXMzMjsKKworCS8qIHRvIG1pbmltaXplIGludGVycnVwdCBzaGFyaW5nIGNvc3RzLCB3ZSB1c2UgdGhlIFNHRCBzdGF0dXMKKwkgKiBzaGFkb3cgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhbGwgaW5wdXRzIGFuZAorCSAqIG91dHB1dHMgd2l0aCBhIHNpbmdsZSAzMi1iaXQgYnVzIHJlYWQuICBJZiBubyBpbnRlcnJ1cHQKKwkgKiBjb25kaXRpb25zIGFyZSBmbGFnZ2VkLCB3ZSBleGl0IGltbWVkaWF0ZWx5CisJICovCisJc3RhdHVzMzIgPSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX1NHRF9TVEFUVVNfU0hBRE9XKTsKKwlpZiAoIShzdGF0dXMzMiAmIFZJQV9JTlRSX01BU0spKQorICAgICAgICB7CisjaWZkZWYgQ09ORklHX01JRElfVklBODJDWFhYCisJICAgIAkgaWYgKGNhcmQtPm1pZGlfZGV2YykKKyAgICAgICAgICAgICAgICAgICAgCXVhcnQ0MDFpbnRyKGlycSwgY2FyZC0+bWlkaV9kZXZjLCByZWdzKTsKKyNlbmRpZgorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgCX0KKwlEUFJJTlRLICgiaW50ciwgc3RhdHVzMzIgPT0gMHglMDhYXG4iLCBzdGF0dXMzMik7CisKKwkvKiBzeW5jaHJvbml6ZSBpbnRlcnJ1cHQgaGFuZGxpbmcgdW5kZXIgU01QLiAgdGhpcyBzcGlubG9jaworCSAqIGdvZXMgYXdheSBjb21wbGV0ZWx5IG9uIFVQCisJICovCisJc3Bpbl9sb2NrICgmY2FyZC0+bG9jayk7CisKKwlpZiAoc3RhdHVzMzIgJiBWSUFfSU5UUl9PVVQpCisJCXZpYV9pbnRyX2NoYW5uZWwgKGNhcmQsICZjYXJkLT5jaF9vdXQpOworCWlmIChzdGF0dXMzMiAmIFZJQV9JTlRSX0lOKQorCQl2aWFfaW50cl9jaGFubmVsIChjYXJkLCAmY2FyZC0+Y2hfaW4pOworCWlmIChzdGF0dXMzMiAmIFZJQV9JTlRSX0ZNKQorCQl2aWFfaW50cl9jaGFubmVsIChjYXJkLCAmY2FyZC0+Y2hfZm0pOworCisJc3Bpbl91bmxvY2sgKCZjYXJkLT5sb2NrKTsKKwkKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2aWFfbmV3X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB2aWFfaW5mbyAqY2FyZCA9IGRldl9pZDsKKwl1MzIgc3RhdHVzMzI7CisKKwkvKiB0byBtaW5pbWl6ZSBpbnRlcnJ1cHQgc2hhcmluZyBjb3N0cywgd2UgdXNlIHRoZSBTR0Qgc3RhdHVzCisJICogc2hhZG93IHJlZ2lzdGVyIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYWxsIGlucHV0cyBhbmQKKwkgKiBvdXRwdXRzIHdpdGggYSBzaW5nbGUgMzItYml0IGJ1cyByZWFkLiAgSWYgbm8gaW50ZXJydXB0CisJICogY29uZGl0aW9ucyBhcmUgZmxhZ2dlZCwgd2UgZXhpdCBpbW1lZGlhdGVseQorCSAqLworCXN0YXR1czMyID0gaW5sIChjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9TR0RfU1RBVFVTX1NIQURPVyk7CisJaWYgKCEoc3RhdHVzMzIgJiBWSUFfTkVXX0lOVFJfTUFTSykpCisJCXJldHVybiBJUlFfTk9ORTsKKwkvKgorCSAqIGdvZXMgYXdheSBjb21wbGV0ZWx5IG9uIFVQCisJICovCisJc3Bpbl9sb2NrICgmY2FyZC0+bG9jayk7CisKKwl2aWFfaW50cl9jaGFubmVsIChjYXJkLCAmY2FyZC0+Y2hfb3V0KTsKKwl2aWFfaW50cl9jaGFubmVsIChjYXJkLCAmY2FyZC0+Y2hfaW4pOworCXZpYV9pbnRyX2NoYW5uZWwgKGNhcmQsICZjYXJkLT5jaF9mbSk7CisKKwlzcGluX3VubG9jayAoJmNhcmQtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioKKyAqCXZpYV9pbnRlcnJ1cHRfaW5pdCAtIEluaXRpYWxpemUgaW50ZXJydXB0IGhhbmRsaW5nCisgKglAY2FyZDogUHJpdmF0ZSBpbmZvIGZvciBzcGVjaWZpZWQgYm9hcmQKKyAqCisgKglPYnRhaW4gYW5kIHJlc2VydmUgSVJRIGZvciB1c2luZyBpbiBoYW5kbGluZyBhdWRpbyBldmVudHMuCisgKglBbHNvLCBkaXNhYmxlIGFueSBJUlEtZ2VuZXJhdGluZyByZXNvdXJjZXMsIHRvIG1ha2Ugc3VyZQorICoJd2UgZG9uJ3QgZ2V0IGludGVycnVwdHMgYmVmb3JlIHdlIHdhbnQgdGhlbS4KKyAqLworCitzdGF0aWMgaW50IHZpYV9pbnRlcnJ1cHRfaW5pdCAoc3RydWN0IHZpYV9pbmZvICpjYXJkKQoreworCXU4IHRtcDg7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0IChjYXJkICE9IE5VTEwpOworCWFzc2VydCAoY2FyZC0+cGRldiAhPSBOVUxMKTsKKworCS8qIGNoZWNrIGZvciBzYW5lIElSUSBudW1iZXIuIGNhbiB0aGlzIGV2ZXIgaGFwcGVuPyAqLworCWlmIChjYXJkLT5wZGV2LT5pcnEgPCAyKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJpbnNhbmUgSVJRICVkLCBhYm9ydGluZ1xuIiwKKwkJCWNhcmQtPnBkZXYtPmlycSk7CisJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVJT1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFZJQSByZXF1aXJlcyB0aGlzIGlzIGRvbmUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2FyZC0+cGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBjYXJkLT5wZGV2LT5pcnEpOworCQorCWlmKGNhcmQtPmxlZ2FjeSkKKwl7CisJCS8qIG1ha2Ugc3VyZSBGTSBpcnEgaXMgbm90IHJvdXRlZCB0byB1cyAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgVklBX0ZNX05NSV9DVFJMLCAmdG1wOCk7CisJCWlmICgodG1wOCAmIFZJQV9DUjQ4X0ZNX1RSQVBfVE9fTk1JKSA9PSAwKSB7CisJCQl0bXA4IHw9IFZJQV9DUjQ4X0ZNX1RSQVBfVE9fTk1JOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCBWSUFfRk1fTk1JX0NUUkwsIHRtcDgpOworCQl9CisJCWlmIChyZXF1ZXN0X2lycSAoY2FyZC0+cGRldi0+aXJxLCB2aWFfaW50ZXJydXB0LCBTQV9TSElSUSwgVklBX01PRFVMRV9OQU1FLCBjYXJkKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byBvYnRhaW4gSVJRICVkLCBhYm9ydGluZ1xuIiwKKwkJCQljYXJkLT5wZGV2LT5pcnEpOworCQkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAtRUJVU1lcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwllbHNlIAorCXsKKwkJaWYgKHJlcXVlc3RfaXJxIChjYXJkLT5wZGV2LT5pcnEsIHZpYV9uZXdfaW50ZXJydXB0LCBTQV9TSElSUSwgVklBX01PRFVMRV9OQU1FLCBjYXJkKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byBvYnRhaW4gSVJRICVkLCBhYm9ydGluZ1xuIiwKKwkJCQljYXJkLT5wZGV2LT5pcnEpOworCQkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAtRUJVU1lcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPU1MgRFNQIGRldmljZQorICoKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aWFfZHNwX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHZpYV9kc3Bfb3BlbiwKKwkucmVsZWFzZQk9IHZpYV9kc3BfcmVsZWFzZSwKKwkucmVhZAkJPSB2aWFfZHNwX3JlYWQsCisJLndyaXRlCQk9IHZpYV9kc3Bfd3JpdGUsCisJLnBvbGwJCT0gdmlhX2RzcF9wb2xsLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSB2aWFfZHNwX2lvY3RsLAorCS5tbWFwCQk9IHZpYV9kc3BfbW1hcCwKK307CisKKworc3RhdGljIGludCBfX2RldmluaXQgdmlhX2RzcF9pbml0IChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQpCit7CisJdTggdG1wODsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlpZihjYXJkLT5sZWdhY3kpCisJeworCQkvKiB0dXJuIG9mZiBsZWdhY3kgZmVhdHVyZXMsIGlmIG5vdCBhbHJlYWR5ICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCBWSUFfRlVOQ19FTkFCTEUsICZ0bXA4KTsKKwkJaWYgKHRtcDggJiAoVklBX0NSNDJfU0JfRU5BQkxFIHwgIFZJQV9DUjQyX0ZNX0VOQUJMRSkpIHsKKwkJCXRtcDggJj0gfihWSUFfQ1I0Ml9TQl9FTkFCTEUgfCBWSUFfQ1I0Ml9GTV9FTkFCTEUpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCBWSUFfRlVOQ19FTkFCTEUsIHRtcDgpOworCQl9CisJfQorCisJdmlhX3N0b3BfZXZlcnl0aGluZyAoY2FyZCk7CisKKwljYXJkLT5kZXZfZHNwID0gcmVnaXN0ZXJfc291bmRfZHNwICgmdmlhX2RzcF9mb3BzLCAtMSk7CisJaWYgKGNhcmQtPmRldl9kc3AgPCAwKSB7CisJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVOT0RFVlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHZpYV9kc3BfY2xlYW51cCAoc3RydWN0IHZpYV9pbmZvICpjYXJkKQoreworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisJYXNzZXJ0IChjYXJkLT5kZXZfZHNwID49IDApOworCisJdmlhX3N0b3BfZXZlcnl0aGluZyAoY2FyZCk7CisKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcCAoY2FyZC0+ZGV2X2RzcCk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwYWdlICogdmlhX21tX25vcGFnZSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCAqdHlwZSkKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4gPSAmY2FyZC0+Y2hfb3V0OworCXN0cnVjdCBwYWdlICpkbWFwYWdlOworCXVuc2lnbmVkIGxvbmcgcGdvZmY7CisJaW50IHJkLCB3cjsKKworCURQUklOVEsgKCJFTlRFUiwgc3RhcnQgJWxYaCwgb2ZzICVsWGgsIHBnb2ZmICVsZCwgYWRkciAlbFhoXG4iLAorCQkgdm1hLT52bV9zdGFydCwKKwkJIGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0LAorCQkgKGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZULAorCQkgYWRkcmVzcyk7CisKKyAgICAgICAgaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkgeworCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIE5PUEFHRV9TSUdCVVNcbiIpOworCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsgLyogRGlzYWxsb3cgbXJlbWFwICovCisJfQorICAgICAgICBpZiAoIWNhcmQpIHsKKwkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyBOT1BBR0VfT09NXG4iKTsKKwkJcmV0dXJuIE5PUEFHRV9PT007CS8qIE5vdGhpbmcgYWxsb2NhdGVkICovCisJfQorCisJcGdvZmYgPSB2bWEtPnZtX3Bnb2ZmICsgKChhZGRyZXNzIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCk7CisJcmQgPSBjYXJkLT5jaF9pbi5pc19tYXBwZWQ7CisJd3IgPSBjYXJkLT5jaF9vdXQuaXNfbWFwcGVkOworCisjaWZuZGVmIFZJQV9OREVCVUcKKwl7CisJdW5zaWduZWQgbG9uZyBtYXhfYnVmcyA9IGNoYW4tPmZyYWdfbnVtYmVyOworCWlmIChyZCAmJiB3cikgbWF4X2J1ZnMgKj0gMjsKKwkvKiB2aWFfZHNwX21tYXAoKSBzaG91bGQgZW5zdXJlIHRoaXMgKi8KKwlhc3NlcnQgKHBnb2ZmIDwgbWF4X2J1ZnMpOworCX0KKyNlbmRpZgorCisJLyogaWYgZnVsbC1kdXBsZXggKHJlYWQrd3JpdGUpIGFuZCB3ZSBoYXZlIHR3byBzZXRzIG9mIGJ1ZnMsCisJICogdGhlbiB0aGUgcGxheWJhY2sgYnVmZmVycyBjb21lIGZpcnN0LCBzZXogc291bmRjYXJkLmMgKi8KKwlpZiAocGdvZmYgPj0gY2hhbi0+cGFnZV9udW1iZXIpIHsKKwkJcGdvZmYgLT0gY2hhbi0+cGFnZV9udW1iZXI7CisJCWNoYW4gPSAmY2FyZC0+Y2hfaW47CisJfSBlbHNlIGlmICghd3IpCisJCWNoYW4gPSAmY2FyZC0+Y2hfaW47CisKKwlhc3NlcnQgKCgoKHVuc2lnbmVkIGxvbmcpY2hhbi0+cGd0YmxbcGdvZmZdLmNwdWFkZHIpICUgUEFHRV9TSVpFKSA9PSAwKTsKKworCWRtYXBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKGNoYW4tPnBndGJsW3Bnb2ZmXS5jcHVhZGRyKTsKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIHBhZ2UgJXAgZm9yIGNwdWFkZHIgJWxYaFxuIiwKKwkJIGRtYXBhZ2UsICh1bnNpZ25lZCBsb25nKSBjaGFuLT5wZ3RibFtwZ29mZl0uY3B1YWRkcik7CisJZ2V0X3BhZ2UgKGRtYXBhZ2UpOworCWlmICh0eXBlKQorCQkqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCXJldHVybiBkbWFwYWdlOworfQorCisKKyNpZm5kZWYgVk1fUkVTRVJWRUQKK3N0YXRpYyBpbnQgdmlhX21tX3N3YXBvdXQgKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBWTV9SRVNFUlZFRCAqLworCisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgdmlhX21tX29wcyA9IHsKKwkubm9wYWdlCQk9IHZpYV9tbV9ub3BhZ2UsCisKKyNpZm5kZWYgVk1fUkVTRVJWRUQKKwkuc3dhcG91dAk9IHZpYV9tbV9zd2Fwb3V0LAorI2VuZGlmCit9OworCisKK3N0YXRpYyBpbnQgdmlhX2RzcF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisJaW50IG5vbmJsb2NrID0gKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlpbnQgcmMgPSAtRUlOVkFMLCByZD0wLCB3cj0wOworCXVuc2lnbmVkIGxvbmcgbWF4X3NpemUsIHNpemUsIHN0YXJ0LCBvZmZzZXQ7CisKKwlhc3NlcnQgKGZpbGUgIT0gTlVMTCk7CisJYXNzZXJ0ICh2bWEgIT0gTlVMTCk7CisJY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlEUFJJTlRLICgiRU5URVIsIHN0YXJ0ICVsWGgsIHNpemUgJWxkLCBwZ29mZiAlbGRcbiIsCisJCSB2bWEtPnZtX3N0YXJ0LAorCQkgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkgdm1hLT52bV9wZ29mZik7CisKKwltYXhfc2l6ZSA9IDA7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCXJkID0gMTsKKwkJdmlhX2NoYW5fc2V0X2J1ZmZlcmluZyhjYXJkLCAmY2FyZC0+Y2hfaW4sIC0xKTsKKwkJdmlhX2NoYW5fYnVmZmVyX2luaXQgKGNhcmQsICZjYXJkLT5jaF9pbik7CisJCW1heF9zaXplICs9IGNhcmQtPmNoX2luLnBhZ2VfbnVtYmVyIDw8IFBBR0VfU0hJRlQ7CisJfQorCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJd3IgPSAxOworCQl2aWFfY2hhbl9zZXRfYnVmZmVyaW5nKGNhcmQsICZjYXJkLT5jaF9vdXQsIC0xKTsKKwkJdmlhX2NoYW5fYnVmZmVyX2luaXQgKGNhcmQsICZjYXJkLT5jaF9vdXQpOworCQltYXhfc2l6ZSArPSBjYXJkLT5jaF9vdXQucGFnZV9udW1iZXIgPDwgUEFHRV9TSElGVDsKKwl9CisKKwlzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJb2Zmc2V0ID0gKHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCk7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworCS8qIHNvbWUgYmFzaWMgc2l6ZS9vZmZzZXQgc2FuaXR5IGNoZWNrcyAqLworCWlmIChzaXplID4gbWF4X3NpemUpCisJCWdvdG8gb3V0OworCWlmIChvZmZzZXQgPiBtYXhfc2l6ZSAtIHNpemUpCisJCWdvdG8gb3V0OworCisJcmMgPSB2aWFfc3lzY2FsbF9kb3duIChjYXJkLCBub25ibG9jayk7CisJaWYgKHJjKSBnb3RvIG91dDsKKworCXZtYS0+dm1fb3BzID0gJnZpYV9tbV9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBjYXJkOworCisjaWZkZWYgVk1fUkVTRVJWRUQKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOworI2VuZGlmCisKKwlpZiAocmQpCisJCWNhcmQtPmNoX2luLmlzX21hcHBlZCA9IDE7CisJaWYgKHdyKQorCQljYXJkLT5jaF9vdXQuaXNfbWFwcGVkID0gMTsKKworCXVwICgmY2FyZC0+c3lzY2FsbF9zZW0pOworCXJjID0gMDsKKworb3V0OgorCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHNzaXplX3QgdmlhX2RzcF9kb19yZWFkIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsCisJCQkJY2hhciBfX3VzZXIgKnVzZXJidWYsIHNpemVfdCBjb3VudCwKKwkJCQlpbnQgbm9uYmxvY2spCit7CisgICAgICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWNvbnN0IGNoYXIgX191c2VyICpvcmlnX3VzZXJidWYgPSB1c2VyYnVmOworCXN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiA9ICZjYXJkLT5jaF9pbjsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgbiwgdG1wOworCXNzaXplX3QgcmV0ID0gMDsKKworCS8qIGlmIFNHRCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQsIHN0YXJ0IGl0ICovCisJdmlhX2NoYW5fbWF5YmVfc3RhcnQgKGNoYW4pOworCitoYW5kbGVfb25lX2Jsb2NrOgorCS8qIGp1c3QgdG8gYmUgYSBuaWNlIG5laWdoYm9yICovCisJLyogVGhvbWFzIFNhaWxlcjoKKwkgKiBCdXQgYWxzbyB0byBvdXJzZWx2ZXMsIHJlbGVhc2Ugc2VtYXBob3JlIGlmIHdlIGRvIHNvICovCisJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCXVwKCZjYXJkLT5zeXNjYWxsX3NlbSk7CisJCXNjaGVkdWxlICgpOworCQlyZXQgPSB2aWFfc3lzY2FsbF9kb3duIChjYXJkLCBub25ibG9jayk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBncmFiIGN1cnJlbnQgY2hhbm5lbCBzb2Z0d2FyZSBwb2ludGVyLiAgSW4gdGhlIGNhc2Ugb2YKKwkgKiByZWNvcmRpbmcsIHRoaXMgaXMgcG9pbnRpbmcgdG8gdGhlIG5leHQgYnVmZmVyIHRoYXQKKwkgKiB3aWxsIHJlY2VpdmUgZGF0YSBmcm9tIHRoZSBhdWRpbyBoYXJkd2FyZS4KKwkgKi8KKwluID0gY2hhbi0+c3dfcHRyOworCisJLyogbl9mcmFncyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIHdhaXRpbmcKKwkgKiB0byBiZSBjb3BpZWQgdG8gdXNlcmxhbmQuICBzbGVlcCB1bnRpbCBhdCBsZWFzdAorCSAqIG9uZSBidWZmZXIgaGFzIGJlZW4gcmVhZCBmcm9tIHRoZSBhdWRpbyBoYXJkd2FyZS4KKwkgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2hhbi0+d2FpdCwgJndhaXQpOworCWZvciAoOzspIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl0bXAgPSBhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpOworCQlhc3NlcnQgKHRtcCA+PSAwKTsKKwkJYXNzZXJ0ICh0bXAgPD0gY2hhbi0+ZnJhZ19udW1iZXIpOworCQlpZiAodG1wKQorCQkJYnJlYWs7CisJCWlmIChub25ibG9jayB8fCAhY2hhbi0+aXNfYWN0aXZlKSB7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQl1cCgmY2FyZC0+c3lzY2FsbF9zZW0pOworCisJCURQUklOVEsgKCJTbGVlcGluZyBvbiBibG9jayAlZFxuIiwgbik7CisJCXNjaGVkdWxlKCk7CisKKwkJcmV0ID0gdmlhX3N5c2NhbGxfZG93biAoY2FyZCwgbm9uYmxvY2spOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+d2FpdCwgJndhaXQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogTm93IHRoYXQgd2UgaGF2ZSBhIGJ1ZmZlciB3ZSBjYW4gcmVhZCBmcm9tLCBzZW5kCisJICogYXMgbXVjaCBhcyBzYW1wbGUgZGF0YSBwb3NzaWJsZSB0byB1c2Vyc3BhY2UuCisJICovCisJd2hpbGUgKChjb3VudCA+IDApICYmIChjaGFuLT5zbG9wX2xlbiA8IGNoYW4tPmZyYWdfc2l6ZSkpIHsKKwkJc2l6ZV90IHNsb3BfbGVmdCA9IGNoYW4tPmZyYWdfc2l6ZSAtIGNoYW4tPnNsb3BfbGVuOworCQl2b2lkICpiYXNlID0gY2hhbi0+cGd0YmxbbiAvIChQQUdFX1NJWkUgLyBjaGFuLT5mcmFnX3NpemUpXS5jcHVhZGRyOworCQl1bnNpZ25lZCBvZnMgPSAobiAlIChQQUdFX1NJWkUgLyBjaGFuLT5mcmFnX3NpemUpKSAqIGNoYW4tPmZyYWdfc2l6ZTsKKworCQlzaXplID0gKGNvdW50IDwgc2xvcF9sZWZ0KSA/IGNvdW50IDogc2xvcF9sZWZ0OworCQlpZiAoY29weV90b191c2VyICh1c2VyYnVmLAorCQkJCSAgYmFzZSArIG9mcyArIGNoYW4tPnNsb3BfbGVuLAorCQkJCSAgc2l6ZSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWNvdW50IC09IHNpemU7CisJCWNoYW4tPnNsb3BfbGVuICs9IHNpemU7CisJCXVzZXJidWYgKz0gc2l6ZTsKKwl9CisKKwkvKiBJZiB3ZSBkaWRuJ3QgY29weSB0aGUgYnVmZmVyIGNvbXBsZXRlbHkgdG8gdXNlcnNwYWNlLAorCSAqIHN0b3Agbm93LgorCSAqLworCWlmIChjaGFuLT5zbG9wX2xlbiA8IGNoYW4tPmZyYWdfc2l6ZSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHdlIGdldCB0byB0aGlzIHBvaW50LCB3ZSBjb3BpZWQgb25lIGJ1ZmZlciBjb21wbGV0ZWx5CisJICogdG8gdXNlcnNwYWNlLCBnaXZlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgaGFyZHdhcmUuCisJICovCisKKwkvKiBhZHZhbmNlIGNoYW5uZWwgc29mdHdhcmUgcG9pbnRlciB0byBwb2ludCB0bworCSAqIHRoZSBuZXh0IGJ1ZmZlciBmcm9tIHdoaWNoIHdlIHdpbGwgY29weQorCSAqLworCWlmIChjaGFuLT5zd19wdHIgPT0gKGNoYW4tPmZyYWdfbnVtYmVyIC0gMSkpCisJCWNoYW4tPnN3X3B0ciA9IDA7CisJZWxzZQorCQljaGFuLT5zd19wdHIrKzsKKworCS8qIG1hcmsgb25lIGxlc3MgYnVmZmVyIHdhaXRpbmcgdG8gYmUgcHJvY2Vzc2VkICovCisJYXNzZXJ0IChhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpID4gMCk7CisJYXRvbWljX2RlYyAoJmNoYW4tPm5fZnJhZ3MpOworCisJLyogd2UgYXJlIGF0IGEgYmxvY2sgYm91bmRhcnksIHRoZXJlIGlzIG5vIGZyYWdtZW50IGRhdGEgKi8KKwljaGFuLT5zbG9wX2xlbiA9IDA7CisKKwlEUFJJTlRLICgiRmx1c2hlZCBibG9jayAldSwgc3dfcHRyIG5vdyAldSwgbl9mcmFncyBub3cgJWRcbiIsCisJCW4sIGNoYW4tPnN3X3B0ciwgYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKSk7CisKKwlEUFJJTlRLICgicmVncz09JTAyWCAlMDJYICUwMlggJTA4WCAlMDhYICUwOFggJTA4WFxuIiwKKwkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAwKSwKKwkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAxKSwKKwkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAyKSwKKwkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDA0KSwKKwkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDBDKSwKKwkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDgwKSwKKwkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDg0KSk7CisKKwlpZiAoY291bnQgPiAwKQorCQlnb3RvIGhhbmRsZV9vbmVfYmxvY2s7CisKK291dDoKKwlyZXR1cm4gKHVzZXJidWYgIT0gb3JpZ191c2VyYnVmKSA/ICh1c2VyYnVmIC0gb3JpZ191c2VyYnVmKSA6IHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCB2aWFfZHNwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2aWFfaW5mbyAqY2FyZDsKKwlpbnQgbm9uYmxvY2sgPSAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWludCByYzsKKworCURQUklOVEsgKCJFTlRFUiwgZmlsZT0lcCwgYnVmZmVyPSVwLCBjb3VudD0ldSwgcHBvcz0lbHVcbiIsCisJCSBmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zID8gKCh1bnNpZ25lZCBsb25nKSpwcG9zKSA6IDApOworCisJYXNzZXJ0IChmaWxlICE9IE5VTEwpOworCWNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJYXNzZXJ0IChjYXJkICE9IE5VTEwpOworCisJcmMgPSB2aWFfc3lzY2FsbF9kb3duIChjYXJkLCBub25ibG9jayk7CisJaWYgKHJjKSBnb3RvIG91dDsKKworCWlmIChjYXJkLT5jaF9pbi5pc19tYXBwZWQpIHsKKwkJcmMgPSAtRU5YSU87CisJCWdvdG8gb3V0X3VwOworCX0KKworCXZpYV9jaGFuX3NldF9idWZmZXJpbmcoY2FyZCwgJmNhcmQtPmNoX2luLCAtMSk7CisgICAgICAgIHJjID0gdmlhX2NoYW5fYnVmZmVyX2luaXQgKGNhcmQsICZjYXJkLT5jaF9pbik7CisKKwlpZiAocmMpCisJCWdvdG8gb3V0X3VwOworCisJcmMgPSB2aWFfZHNwX2RvX3JlYWQgKGNhcmQsIGJ1ZmZlciwgY291bnQsIG5vbmJsb2NrKTsKKworb3V0X3VwOgorCXVwICgmY2FyZC0+c3lzY2FsbF9zZW0pOworb3V0OgorCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWxkXG4iLChsb25nKSByYyk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHZpYV9kc3BfZG9fd3JpdGUgKHN0cnVjdCB2aWFfaW5mbyAqY2FyZCwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsIHNpemVfdCBjb3VudCwKKwkJCQkgaW50IG5vbmJsb2NrKQoreworICAgICAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwljb25zdCBjaGFyIF9fdXNlciAqb3JpZ191c2VyYnVmID0gdXNlcmJ1ZjsKKwlzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4gPSAmY2FyZC0+Y2hfb3V0OworCXZvbGF0aWxlIHN0cnVjdCB2aWFfc2dkX3RhYmxlICpzZ3RhYmxlID0gY2hhbi0+c2d0YWJsZTsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgbiwgdG1wOworCXNzaXplX3QgcmV0ID0gMDsKKworaGFuZGxlX29uZV9ibG9jazoKKwkvKiBqdXN0IHRvIGJlIGEgbmljZSBuZWlnaGJvciAqLworCS8qIFRob21hcyBTYWlsZXI6CisJICogQnV0IGFsc28gdG8gb3Vyc2VsdmVzLCByZWxlYXNlIHNlbWFwaG9yZSBpZiB3ZSBkbyBzbyAqLworCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQl1cCgmY2FyZC0+c3lzY2FsbF9zZW0pOworCQlzY2hlZHVsZSAoKTsKKwkJcmV0ID0gdmlhX3N5c2NhbGxfZG93biAoY2FyZCwgbm9uYmxvY2spOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJLyogZ3JhYiBjdXJyZW50IGNoYW5uZWwgZnJhZ21lbnQgcG9pbnRlci4gIEluIHRoZSBjYXNlIG9mCisJICogcGxheWJhY2ssIHRoaXMgaXMgcG9pbnRpbmcgdG8gdGhlIG5leHQgZnJhZ21lbnQgdGhhdAorCSAqIHNob3VsZCByZWNlaXZlIGRhdGEgZnJvbSB1c2VybGFuZC4KKwkgKi8KKwluID0gY2hhbi0+c3dfcHRyOworCisJLyogbl9mcmFncyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIHJlbWFpbmluZworCSAqIHRvIGJlIGZpbGxlZCBieSB1c2Vyc3BhY2UuICBTbGVlcCB1bnRpbAorCSAqIGF0IGxlYXN0IG9uZSBmcmFnbWVudCBpcyBhdmFpbGFibGUgZm9yIG91ciB1c2UuCisJICovCisJYWRkX3dhaXRfcXVldWUoJmNoYW4tPndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdG1wID0gYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKTsKKwkJYXNzZXJ0ICh0bXAgPj0gMCk7CisJCWFzc2VydCAodG1wIDw9IGNoYW4tPmZyYWdfbnVtYmVyKTsKKwkJaWYgKHRtcCkKKwkJCWJyZWFrOworCQlpZiAobm9uYmxvY2sgfHwgIWNoYW4tPmlzX2FjdGl2ZSkgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJdXAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKKworCQlEUFJJTlRLICgiU2xlZXBpbmcgb24gcGFnZSAlZCwgdG1wPT0lZCwgaXI9PSVkXG4iLCBuLCB0bXAsIGNoYW4tPmlzX3JlY29yZCk7CisJCXNjaGVkdWxlKCk7CisKKwkJcmV0ID0gdmlhX3N5c2NhbGxfZG93biAoY2FyZCwgbm9uYmxvY2spOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+d2FpdCwgJndhaXQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogTm93IHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgZnJhZ21lbnQgd2UgY2FuIHdyaXRlIHRvLCBmaWxsIHRoZSBidWZmZXIKKwkgKiBhcyBtdWNoIGFzIHBvc3NpYmxlIHdpdGggZGF0YSBmcm9tIHVzZXJzcGFjZS4KKwkgKi8KKwl3aGlsZSAoKGNvdW50ID4gMCkgJiYgKGNoYW4tPnNsb3BfbGVuIDwgY2hhbi0+ZnJhZ19zaXplKSkgeworCQlzaXplX3Qgc2xvcF9sZWZ0ID0gY2hhbi0+ZnJhZ19zaXplIC0gY2hhbi0+c2xvcF9sZW47CisKKwkJc2l6ZSA9IChjb3VudCA8IHNsb3BfbGVmdCkgPyBjb3VudCA6IHNsb3BfbGVmdDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyIChjaGFuLT5wZ3RibFtuIC8gKFBBR0VfU0laRSAvIGNoYW4tPmZyYWdfc2l6ZSldLmNwdWFkZHIgKyAobiAlIChQQUdFX1NJWkUgLyBjaGFuLT5mcmFnX3NpemUpKSAqIGNoYW4tPmZyYWdfc2l6ZSArIGNoYW4tPnNsb3BfbGVuLAorCQkJCSAgICB1c2VyYnVmLCBzaXplKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJY291bnQgLT0gc2l6ZTsKKwkJY2hhbi0+c2xvcF9sZW4gKz0gc2l6ZTsKKwkJdXNlcmJ1ZiArPSBzaXplOworCX0KKworCS8qIElmIHdlIGRpZG4ndCBmaWxsIHVwIHRoZSBidWZmZXIgd2l0aCBkYXRhLCBzdG9wIG5vdy4KKyAgICAgICAgICogUHV0IGEgJ3N0b3AnIG1hcmtlciBpbiB0aGUgRE1BIHRhYmxlIHRvbywgdG8gdGVsbCB0aGUKKyAgICAgICAgICogYXVkaW8gaGFyZHdhcmUgdG8gc3RvcCBpZiBpdCBnZXRzIGhlcmUuCisgICAgICAgICAqLworCWlmIChjaGFuLT5zbG9wX2xlbiA8IGNoYW4tPmZyYWdfc2l6ZSkgeworCQlzZ3RhYmxlW25dLmNvdW50ID0gY3B1X3RvX2xlMzIgKGNoYW4tPnNsb3BfbGVuIHwgVklBX0VPTCB8IFZJQV9TVE9QKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKyAgICAgICAgICogSWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHdlIGhhdmUgZmlsbGVkIGEgYnVmZmVyIHdpdGgKKyAgICAgICAgICogYXVkaW8gZGF0YSwgZmx1c2ggdGhlIGJ1ZmZlciB0byBhdWRpbyBoYXJkd2FyZS4KKyAgICAgICAgICovCisKKwkvKiBSZWNvcmQgdGhlIHRydWUgc2l6ZSBmb3IgdGhlIGF1ZGlvIGhhcmR3YXJlIHRvIG5vdGljZSAqLworICAgICAgICBpZiAobiA9PSAoY2hhbi0+ZnJhZ19udW1iZXIgLSAxKSkKKyAgICAgICAgICAgICAgICBzZ3RhYmxlW25dLmNvdW50ID0gY3B1X3RvX2xlMzIgKGNoYW4tPmZyYWdfc2l6ZSB8IFZJQV9FT0wpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2d0YWJsZVtuXS5jb3VudCA9IGNwdV90b19sZTMyIChjaGFuLT5mcmFnX3NpemUgfCBWSUFfRkxBRyk7CisKKwkvKiBhZHZhbmNlIGNoYW5uZWwgc29mdHdhcmUgcG9pbnRlciB0byBwb2ludCB0bworCSAqIHRoZSBuZXh0IGJ1ZmZlciB3ZSB3aWxsIGZpbGwgd2l0aCBkYXRhCisJICovCisJaWYgKGNoYW4tPnN3X3B0ciA9PSAoY2hhbi0+ZnJhZ19udW1iZXIgLSAxKSkKKwkJY2hhbi0+c3dfcHRyID0gMDsKKwllbHNlCisJCWNoYW4tPnN3X3B0cisrOworCisJLyogbWFyayBvbmUgbGVzcyBidWZmZXIgYXMgYmVpbmcgYXZhaWxhYmxlIGZvciB1c2Vyc3BhY2UgY29uc3VtcHRpb24gKi8KKwlhc3NlcnQgKGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykgPiAwKTsKKwlhdG9taWNfZGVjICgmY2hhbi0+bl9mcmFncyk7CisKKwkvKiB3ZSBhcmUgYXQgYSBibG9jayBib3VuZGFyeSwgdGhlcmUgaXMgbm8gZnJhZ21lbnQgZGF0YSAqLworCWNoYW4tPnNsb3BfbGVuID0gMDsKKworCS8qIGlmIFNHRCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQsIHN0YXJ0IGl0ICovCisJdmlhX2NoYW5fbWF5YmVfc3RhcnQgKGNoYW4pOworCisJRFBSSU5USyAoIkZsdXNoZWQgYmxvY2sgJXUsIHN3X3B0ciBub3cgJXUsIG5fZnJhZ3Mgbm93ICVkXG4iLAorCQluLCBjaGFuLT5zd19wdHIsIGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykpOworCisJRFBSSU5USyAoInJlZ3M9PVM9JTAyWCBDPSUwMlggVFA9JTAyWCBCUD0lMDhYIFJUPSUwOFggU0c9JTA4WCBDQz0lMDhYIFNTPSUwOFhcbiIsCisJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMCksCisJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMSksCisJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMiksCisJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHgwNCksCisJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHgwOCksCisJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHgwQyksCisJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHg4MCksCisJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHg4NCkpOworCisJaWYgKGNvdW50ID4gMCkKKwkJZ290byBoYW5kbGVfb25lX2Jsb2NrOworCitvdXQ6CisJaWYgKHVzZXJidWYgLSBvcmlnX3VzZXJidWYpCisJCXJldHVybiB1c2VyYnVmIC0gb3JpZ191c2VyYnVmOworCWVsc2UKKwkJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCB2aWFfZHNwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisJc3NpemVfdCByYzsKKwlpbnQgbm9uYmxvY2sgPSAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCisJRFBSSU5USyAoIkVOVEVSLCBmaWxlPSVwLCBidWZmZXI9JXAsIGNvdW50PSV1LCBwcG9zPSVsdVxuIiwKKwkJIGZpbGUsIGJ1ZmZlciwgY291bnQsIHBwb3MgPyAoKHVuc2lnbmVkIGxvbmcpKnBwb3MpIDogMCk7CisKKwlhc3NlcnQgKGZpbGUgIT0gTlVMTCk7CisJY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlyYyA9IHZpYV9zeXNjYWxsX2Rvd24gKGNhcmQsIG5vbmJsb2NrKTsKKwlpZiAocmMpIGdvdG8gb3V0OworCisJaWYgKGNhcmQtPmNoX291dC5pc19tYXBwZWQpIHsKKwkJcmMgPSAtRU5YSU87CisJCWdvdG8gb3V0X3VwOworCX0KKworCXZpYV9jaGFuX3NldF9idWZmZXJpbmcoY2FyZCwgJmNhcmQtPmNoX291dCwgLTEpOworCXJjID0gdmlhX2NoYW5fYnVmZmVyX2luaXQgKGNhcmQsICZjYXJkLT5jaF9vdXQpOworCisJaWYgKHJjKQorCQlnb3RvIG91dF91cDsKKworCXJjID0gdmlhX2RzcF9kb193cml0ZSAoY2FyZCwgYnVmZmVyLCBjb3VudCwgbm9uYmxvY2spOworCitvdXRfdXA6CisJdXAgKCZjYXJkLT5zeXNjYWxsX3NlbSk7CitvdXQ6CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlbGRcbiIsKGxvbmcpIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCB2aWFfZHNwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisJc3RydWN0IHZpYV9jaGFubmVsICpjaGFuOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKGZpbGUgIT0gTlVMTCk7CisJY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQljaGFuID0gJmNhcmQtPmNoX2luOworCQlpZiAoc2dfYWN0aXZlIChjaGFuLT5pb2Jhc2UpKQorCSAgICAgICAgICAgICAgICBwb2xsX3dhaXQoZmlsZSwgJmNoYW4tPndhaXQsIHdhaXQpOworCQlpZiAoYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKSA+IDApCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWNoYW4gPSAmY2FyZC0+Y2hfb3V0OworCQlpZiAoc2dfYWN0aXZlIChjaGFuLT5pb2Jhc2UpKQorCSAgICAgICAgICAgICAgICBwb2xsX3dhaXQoZmlsZSwgJmNoYW4tPndhaXQsIHdhaXQpOworCQlpZiAoYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKSA+IDApCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJXVcbiIsIG1hc2spOworCXJldHVybiBtYXNrOworfQorCisKKy8qKgorICoJdmlhX2RzcF9kcmFpbl9wbGF5YmFjayAtIHNsZWVwIHVudGlsIGFsbCBwbGF5YmFjayBzYW1wbGVzIGFyZSBmbHVzaGVkCisgKglAY2FyZDogUHJpdmF0ZSBpbmZvIGZvciBzcGVjaWZpZWQgYm9hcmQKKyAqCUBjaGFuOiBDaGFubmVsIHRvIGRyYWluCisgKglAbm9uYmxvY2s6IGJvb2xlYW4sIG5vbi16ZXJvIGlmIE9fTk9OQkxPQ0sgaXMgc2V0CisgKgorICoJU2xlZXBzIHVudGlsIGFsbCBwbGF5YmFjayBoYXMgYmVlbiBmbHVzaGVkIHRvIHRoZSBhdWRpbworICoJaGFyZHdhcmUuCisgKgorICoJTG9ja2luZzogaW5zaWRlIGNhcmQtPnN5c2NhbGxfc2VtCisgKi8KKworc3RhdGljIGludCB2aWFfZHNwX2RyYWluX3BsYXliYWNrIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsCisJCQkJICAgc3RydWN0IHZpYV9jaGFubmVsICpjaGFuLCBpbnQgbm9uYmxvY2spCit7CisgICAgICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCByZXQgPSAwOworCisJRFBSSU5USyAoIkVOVEVSLCBub25ibG9jayA9ICVkXG4iLCBub25ibG9jayk7CisKKwlpZiAoY2hhbi0+c2xvcF9sZW4gPiAwKQorCQl2aWFfY2hhbl9mbHVzaF9mcmFnIChjaGFuKTsKKworCWlmIChhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpID09IGNoYW4tPmZyYWdfbnVtYmVyKQorCQlnb3RvIG91dDsKKworCXZpYV9jaGFuX21heWJlX3N0YXJ0IChjaGFuKTsKKworCWFkZF93YWl0X3F1ZXVlKCZjaGFuLT53YWl0LCAmd2FpdCk7CisJZm9yICg7OykgeworCQlEUFJJTlRLICgiRlJBR1MgJWQgRlJBR05VTSAlZFxuIiwgYXRvbWljX3JlYWQoJmNoYW4tPm5fZnJhZ3MpLCBjaGFuLT5mcmFnX251bWJlcik7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykgPj0gY2hhbi0+ZnJhZ19udW1iZXIpCisJCQlicmVhazsKKworCQlpZiAobm9uYmxvY2spIHsKKwkJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVBR0FJTlxuIik7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworI2lmZGVmIFZJQV9ERUJVRworCQl7CisJCXU4IHI0MCxyNDEscjQyLHI0MyxyNDQscjQ4OworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0MCwgJnI0MCk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQxLCAmcjQxKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDIsICZyNDIpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0MywgJnI0Myk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQ0LCAmcjQ0KTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDgsICZyNDgpOworCQlEUFJJTlRLICgiUENJIGNvbmZpZzogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlyNDAscjQxLHI0MixyNDMscjQ0LHI0OCk7CisKKwkJRFBSSU5USyAoInJlZ3M9PSUwMlggJTAyWCAlMDJYICUwOFggJTA4WCAlMDhYICUwOFhcbiIsCisJCQkgaW5iIChjYXJkLT5iYXNlYWRkciArIDB4MDApLAorCQkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAxKSwKKwkJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMiksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4MDQpLAorCQkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDBDKSwKKwkJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHg4MCksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4ODQpKTsKKwkJfQorCisJCWlmICghY2hhbi0+aXNfYWN0aXZlKQorCQkJcHJpbnRrIChLRVJOX0VSUiAic2xlZXBpbmcgYnV0IG5vdCBhY3RpdmVcbiIpOworI2VuZGlmCisKKwkJdXAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKKworCQlEUFJJTlRLICgic2xlZXBpbmcsIG5idWZzPSVkXG4iLCBhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpKTsKKwkJc2NoZWR1bGUoKTsKKworCQlpZiAoKHJldCA9IHZpYV9zeXNjYWxsX2Rvd24gKGNhcmQsIG5vbmJsb2NrKSkpCisJCQlicmVhazsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisJCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIC1FUkVTVEFSVFNZU1xuIik7CisJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGFuLT53YWl0LCAmd2FpdCk7CisKKyNpZmRlZiBWSUFfREVCVUcKKwl7CisJCXU4IHI0MCxyNDEscjQyLHI0MyxyNDQscjQ4OworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0MCwgJnI0MCk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQxLCAmcjQxKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDIsICZyNDIpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0MywgJnI0Myk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQ0LCAmcjQ0KTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDgsICZyNDgpOworCQlEUFJJTlRLICgiUENJIGNvbmZpZzogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlyNDAscjQxLHI0MixyNDMscjQ0LHI0OCk7CisKKwkJRFBSSU5USyAoInJlZ3M9PSUwMlggJTAyWCAlMDJYICUwOFggJTA4WCAlMDhYICUwOFhcbiIsCisJCQkgaW5iIChjYXJkLT5iYXNlYWRkciArIDB4MDApLAorCQkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAxKSwKKwkJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMiksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4MDQpLAorCQkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDBDKSwKKwkJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHg4MCksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4ODQpKTsKKworCQlEUFJJTlRLICgiZmluYWwgbmJ1ZnM9JWRcbiIsIGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykpOworCX0KKyNlbmRpZgorCitvdXQ6CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICoJdmlhX2RzcF9pb2N0bF9zcGFjZSAtIGdldCBpbmZvcm1hdGlvbiBhYm91dCBjaGFubmVsIGJ1ZmZlcmluZworICoJQGNhcmQ6IFByaXZhdGUgaW5mbyBmb3Igc3BlY2lmaWVkIGJvYXJkCisgKglAY2hhbjogcG9pbnRlciB0byBjaGFubmVsLXNwZWNpZmljIGluZm8KKyAqCUBhcmc6IHVzZXIgYnVmZmVyIGZvciByZXR1cm5lZCBpbmZvcm1hdGlvbgorICoKKyAqCUhhbmRsZXMgU05EQ1RMX0RTUF9HRVRJU1BBQ0UgYW5kIFNORENUTF9EU1BfR0VUT1NQQUNFLgorICoKKyAqCUxvY2tpbmc6IGluc2lkZSBjYXJkLT5zeXNjYWxsX3NlbQorICovCisKK3N0YXRpYyBpbnQgdmlhX2RzcF9pb2N0bF9zcGFjZSAoc3RydWN0IHZpYV9pbmZvICpjYXJkLAorCQkJCXN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiwKKwkJCQl2b2lkIF9fdXNlciAqYXJnKQoreworCWF1ZGlvX2J1Zl9pbmZvIGluZm87CisKKwl2aWFfY2hhbl9zZXRfYnVmZmVyaW5nKGNhcmQsIGNoYW4sIC0xKTsKKworCWluZm8uZnJhZ3N0b3RhbCA9IGNoYW4tPmZyYWdfbnVtYmVyOworCWluZm8uZnJhZ3NpemUgPSBjaGFuLT5mcmFnX3NpemU7CisKKwkvKiBudW1iZXIgb2YgZnVsbCBmcmFnbWVudHMgd2UgY2FuIHJlYWQvd3JpdGUgd2l0aG91dCBibG9ja2luZyAqLworCWluZm8uZnJhZ21lbnRzID0gYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKTsKKworCWlmICgoY2hhbi0+c2xvcF9sZW4gJSBjaGFuLT5mcmFnX3NpemUgPiAwKSAmJiAoaW5mby5mcmFnbWVudHMgPiAwKSkKKwkJaW5mby5mcmFnbWVudHMtLTsKKworCS8qIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIG9yIHdyaXR0ZW4gaW1tZWRpYXRlbHkKKwkgKiB3aXRob3V0IGJsb2NraW5nLgorCSAqLworCWluZm8uYnl0ZXMgPSAoaW5mby5mcmFnbWVudHMgKiBjaGFuLT5mcmFnX3NpemUpOworCWlmIChjaGFuLT5zbG9wX2xlbiAlIGNoYW4tPmZyYWdfc2l6ZSA+IDApCisJCWluZm8uYnl0ZXMgKz0gY2hhbi0+ZnJhZ19zaXplIC0gKGNoYW4tPnNsb3BfbGVuICUgY2hhbi0+ZnJhZ19zaXplKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgZnJhZ3N0b3RhbD0lZCwgZnJhZ3NpemU9JWQsIGZyYWdtZW50cz0lZCwgYnl0ZXM9JWRcbiIsCisJCWluZm8uZnJhZ3N0b3RhbCwKKwkJaW5mby5mcmFnc2l6ZSwKKwkJaW5mby5mcmFnbWVudHMsCisJCWluZm8uYnl0ZXMpOworCisJcmV0dXJuIGNvcHlfdG9fdXNlciAoYXJnLCAmaW5mbywgc2l6ZW9mIChpbmZvKSk/LUVGQVVMVDowOworfQorCisKKy8qKgorICoJdmlhX2RzcF9pb2N0bF9wdHIgLSBnZXQgaW5mb3JtYXRpb24gYWJvdXQgaGFyZHdhcmUgYnVmZmVyIHB0cgorICoJQGNhcmQ6IFByaXZhdGUgaW5mbyBmb3Igc3BlY2lmaWVkIGJvYXJkCisgKglAY2hhbjogcG9pbnRlciB0byBjaGFubmVsLXNwZWNpZmljIGluZm8KKyAqCUBhcmc6IHVzZXIgYnVmZmVyIGZvciByZXR1cm5lZCBpbmZvcm1hdGlvbgorICoKKyAqCUhhbmRsZXMgU05EQ1RMX0RTUF9HRVRJUFRSIGFuZCBTTkRDVExfRFNQX0dFVE9QVFIuCisgKgorICoJTG9ja2luZzogaW5zaWRlIGNhcmQtPnN5c2NhbGxfc2VtCisgKi8KKworc3RhdGljIGludCB2aWFfZHNwX2lvY3RsX3B0ciAoc3RydWN0IHZpYV9pbmZvICpjYXJkLAorCQkJCXN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiwKKwkJCQl2b2lkIF9fdXNlciAqYXJnKQoreworCWNvdW50X2luZm8gaW5mbzsKKworCXNwaW5fbG9ja19pcnEgKCZjYXJkLT5sb2NrKTsKKworCWluZm8uYnl0ZXMgPSBjaGFuLT5ieXRlczsKKwlpbmZvLmJsb2NrcyA9IGNoYW4tPm5faXJxczsKKwljaGFuLT5uX2lycXMgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxICgmY2FyZC0+bG9jayk7CisKKwlpZiAoY2hhbi0+aXNfYWN0aXZlKSB7CisJCXVuc2lnbmVkIGxvbmcgZXh0cmE7CisJCWluZm8ucHRyID0gYXRvbWljX3JlYWQgKCZjaGFuLT5od19wdHIpICogY2hhbi0+ZnJhZ19zaXplOworCQlleHRyYSA9IGNoYW4tPmZyYWdfc2l6ZSAtIHZpYV9zZ19vZmZzZXQoY2hhbik7CisJCWluZm8ucHRyICs9IGV4dHJhOworCQlpbmZvLmJ5dGVzICs9IGV4dHJhOworCX0gZWxzZSB7CisJCWluZm8ucHRyID0gMDsKKwl9CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIGJ5dGVzPSVkLCBibG9ja3M9JWQsIHB0cj0lZFxuIiwKKwkJaW5mby5ieXRlcywKKwkJaW5mby5ibG9ja3MsCisJCWluZm8ucHRyKTsKKworCXJldHVybiBjb3B5X3RvX3VzZXIgKGFyZywgJmluZm8sIHNpemVvZiAoaW5mbykpPy1FRkFVTFQ6MDsKK30KKworCitzdGF0aWMgaW50IHZpYV9kc3BfaW9jdGxfdHJpZ2dlciAoc3RydWN0IHZpYV9jaGFubmVsICpjaGFuLCBpbnQgdmFsKQoreworCWludCBlbmFibGUsIGRvX3NvbWV0aGluZzsKKworCWlmIChjaGFuLT5pc19yZWNvcmQpCisJCWVuYWJsZSA9ICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKTsKKwllbHNlCisJCWVuYWJsZSA9ICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCk7CisKKwlpZiAoIWNoYW4tPmlzX2VuYWJsZWQgJiYgZW5hYmxlKSB7CisJCWRvX3NvbWV0aGluZyA9IDE7CisJfSBlbHNlIGlmIChjaGFuLT5pc19lbmFibGVkICYmICFlbmFibGUpIHsKKwkJZG9fc29tZXRoaW5nID0gLTE7CisJfSBlbHNlIHsKKwkJZG9fc29tZXRoaW5nID0gMDsKKwl9CisKKwlEUFJJTlRLICgiZW5hYmxlPSVkLCBkb19zb21ldGhpbmc9JWRcbiIsCisJCSBlbmFibGUsIGRvX3NvbWV0aGluZyk7CisKKwlpZiAoY2hhbi0+aXNfYWN0aXZlICYmIGRvX3NvbWV0aGluZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZG9fc29tZXRoaW5nID09IDEpIHsKKwkJY2hhbi0+aXNfZW5hYmxlZCA9IDE7CisJCXZpYV9jaGFuX21heWJlX3N0YXJ0IChjaGFuKTsKKwkJRFBSSU5USyAoIlRyaWdnZXJpbmcgaW5wdXRcbiIpOworCX0KKworCWVsc2UgaWYgKGRvX3NvbWV0aGluZyA9PSAtMSkgeworCQljaGFuLT5pc19lbmFibGVkID0gMDsKKwkJRFBSSU5USyAoIlNldHVwIGlucHV0IHRyaWdnZXJcbiIpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdmlhX2RzcF9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByYywgcmQ9MCwgd3I9MCwgdmFsPTA7CisJc3RydWN0IHZpYV9pbmZvICpjYXJkOworCXN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbjsKKwlpbnQgbm9uYmxvY2sgPSAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWludCBfX3VzZXIgKmlwID0gKGludCBfX3VzZXIgKilhcmc7CisJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlhc3NlcnQgKGZpbGUgIT0gTlVMTCk7CisJY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXdyID0gMTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJcmQgPSAxOworCisJcmMgPSB2aWFfc3lzY2FsbF9kb3duIChjYXJkLCBub25ibG9jayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcmMgPSAtRUlOVkFMOworCisJc3dpdGNoIChjbWQpIHsKKworCS8qIE9TUyBBUEkgdmVyc2lvbi4gIFhYWCB1bnZlcmlmaWVkICovCisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJRFBSSU5USyAoImlvY3RsIE9TU19HRVRWRVJTSU9OLCBFWElULCByZXR1cm5pbmcgU09VTkRfVkVSU0lPTlxuIik7CisJCXJjID0gcHV0X3VzZXIgKFNPVU5EX1ZFUlNJT04sIGlwKTsKKwkJYnJlYWs7CisKKwkvKiBsaXN0IG9mIHN1cHBvcnRlZCBQQ00gZGF0YSBmb3JtYXRzICovCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CisJCURQUklOVEsgKCJEU1BfR0VURk1UUywgRVhJVCwgcmV0dXJuaW5nIEFGTVQgVTh8UzE2X0xFXG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IHB1dF91c2VyIChBRk1UX1U4IHwgQUZNVF9TMTZfTEUsIGlwKTsKKwkJYnJlYWs7CisKKwkvKiBxdWVyeSBvciBzZXQgY3VycmVudCBjaGFubmVsJ3MgUENNIGRhdGEgZm9ybWF0ICovCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgaXApKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlEUFJJTlRLICgiRFNQX1NFVEZNVCwgdmFsPT0lZFxuIiwgdmFsKTsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlyYyA9IDA7CisKKwkJCWlmIChyZCkKKwkJCQlyYyA9IHZpYV9jaGFuX3NldF9mbXQgKGNhcmQsICZjYXJkLT5jaF9pbiwgdmFsKTsKKworCQkJaWYgKHJjID49IDAgJiYgd3IpCisJCQkJcmMgPSB2aWFfY2hhbl9zZXRfZm10IChjYXJkLCAmY2FyZC0+Y2hfb3V0LCB2YWwpOworCisJCQlpZiAocmMgPCAwKQorCQkJCWJyZWFrOworCisJCQl2YWwgPSByYzsKKwkJfSBlbHNlIHsKKwkJCWlmICgocmQgJiYgKGNhcmQtPmNoX2luLnBjbV9mbXQgJiBWSUFfUENNX0ZNVF8xNkJJVCkpIHx8CisJCQkgICAgKHdyICYmIChjYXJkLT5jaF9vdXQucGNtX2ZtdCAmIFZJQV9QQ01fRk1UXzE2QklUKSkpCisJCQkJdmFsID0gQUZNVF9TMTZfTEU7CisJCQllbHNlCisJCQkJdmFsID0gQUZNVF9VODsKKwkJfQorCQlEUFJJTlRLICgiU0VURk1UIEVYSVQsIHJldHVybmluZyAlZFxuIiwgdmFsKTsKKyAgICAgICAgICAgICAgICByYyA9IHB1dF91c2VyICh2YWwsIGlwKTsKKwkJYnJlYWs7CisKKwkvKiBxdWVyeSBvciBzZXQgbnVtYmVyIG9mIGNoYW5uZWxzICgxPW1vbm8sIDI9c3RlcmVvLCA0LzYgZm9yIG11bHRpY2hhbm5lbCkgKi8KKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBpcCkpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCURQUklOVEsgKCJEU1BfQ0hBTk5FTFMsIHZhbD09JWRcbiIsIHZhbCk7CisJCWlmICh2YWwgIT0gMCkgeworCQkJcmMgPSAwOworCisJCQlpZiAocmQpCisJCQkJcmMgPSB2aWFfY2hhbl9zZXRfc3RlcmVvIChjYXJkLCAmY2FyZC0+Y2hfaW4sIHZhbCk7CisKKwkJCWlmIChyYyA+PSAwICYmIHdyKQorCQkJCXJjID0gdmlhX2NoYW5fc2V0X3N0ZXJlbyAoY2FyZCwgJmNhcmQtPmNoX291dCwgdmFsKTsKKworCQkJaWYgKHJjIDwgMCkKKwkJCQlicmVhazsKKworCQkJdmFsID0gcmM7CisJCX0gZWxzZSB7CisJCQlpZiAocmQpCisJCQkJdmFsID0gY2FyZC0+Y2hfaW4uY2hhbm5lbHM7CisJCQllbHNlCisJCQkJdmFsID0gY2FyZC0+Y2hfb3V0LmNoYW5uZWxzOworCQl9CisJCURQUklOVEsgKCJDSEFOTkVMUyBFWElULCByZXR1cm5pbmcgJWRcbiIsIHZhbCk7CisgICAgICAgICAgICAgICAgcmMgPSBwdXRfdXNlciAodmFsLCBpcCk7CisJCWJyZWFrOworCisJLyogZW5hYmxlICh2YWwgaXMgbm90IHplcm8pIG9yIGRpc2FibGUgKHZhbCA9PSAwKSBzdGVyZW8gKi8KKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgaXApKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlEUFJJTlRLICgiRFNQX1NURVJFTywgdmFsPT0lZFxuIiwgdmFsKTsKKwkJcmMgPSAwOworCisJCWlmIChyZCkKKwkJCXJjID0gdmlhX2NoYW5fc2V0X3N0ZXJlbyAoY2FyZCwgJmNhcmQtPmNoX2luLCB2YWwgPyAyIDogMSk7CisJCWlmIChyYyA+PSAwICYmIHdyKQorCQkJcmMgPSB2aWFfY2hhbl9zZXRfc3RlcmVvIChjYXJkLCAmY2FyZC0+Y2hfb3V0LCB2YWwgPyAyIDogMSk7CisKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCisJCXZhbCA9IHJjIC0gMTsKKworCQlEUFJJTlRLICgiU1RFUkVPIEVYSVQsIHJldHVybmluZyAlZFxuIiwgdmFsKTsKKwkJcmMgPSBwdXRfdXNlcih2YWwsIGlwKTsKKwkJYnJlYWs7CisKKwkvKiBxdWVyeSBvciBzZXQgc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCWlmIChnZXRfdXNlcih2YWwsIGlwKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJRFBSSU5USyAoIkRTUF9TUEVFRCwgdmFsPT0lZFxuIiwgdmFsKTsKKwkJaWYgKHZhbCA8IDApIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICh2YWwgPiAwKSB7CisJCQlyYyA9IDA7CisKKwkJCWlmIChyZCkKKwkJCQlyYyA9IHZpYV9jaGFuX3NldF9zcGVlZCAoY2FyZCwgJmNhcmQtPmNoX2luLCB2YWwpOworCQkJaWYgKHJjID49IDAgJiYgd3IpCisJCQkJcmMgPSB2aWFfY2hhbl9zZXRfc3BlZWQgKGNhcmQsICZjYXJkLT5jaF9vdXQsIHZhbCk7CisKKwkJCWlmIChyYyA8IDApCisJCQkJYnJlYWs7CisKKwkJCXZhbCA9IHJjOworCQl9IGVsc2UgeworCQkJaWYgKHJkKQorCQkJCXZhbCA9IGNhcmQtPmNoX2luLnJhdGU7CisJCQllbHNlIGlmICh3cikKKwkJCQl2YWwgPSBjYXJkLT5jaF9vdXQucmF0ZTsKKwkJCWVsc2UKKwkJCQl2YWwgPSAwOworCQl9CisJCURQUklOVEsgKCJTUEVFRCBFWElULCByZXR1cm5pbmcgJWRcbiIsIHZhbCk7CisgICAgICAgICAgICAgICAgcmMgPSBwdXRfdXNlciAodmFsLCBpcCk7CisJCWJyZWFrOworCisJLyogd2FpdCB1bnRpbCBhbGwgYnVmZmVycyBoYXZlIGJlZW4gcGxheWVkLCBhbmQgdGhlbiBzdG9wIGRldmljZSAqLworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlEUFJJTlRLICgiRFNQX1NZTkNcbiIpOworCQlyYyA9IDA7CisJCWlmICh3cikgeworCQkJRFBSSU5USyAoIlNZTkMgRVhJVCAoYWZ0ZXIgY2FsbGluZyB2aWFfZHNwX2RyYWluX3BsYXliYWNrKVxuIik7CisJCQlyYyA9IHZpYV9kc3BfZHJhaW5fcGxheWJhY2sgKGNhcmQsICZjYXJkLT5jaF9vdXQsIG5vbmJsb2NrKTsKKwkJfQorCQlicmVhazsKKworCS8qIHN0b3AgcmVjb3JkaW5nL3BsYXliYWNrIGltbWVkaWF0ZWx5ICovCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJRFBSSU5USyAoIkRTUF9SRVNFVFxuIik7CisJCWlmIChyZCkgeworCQkJdmlhX2NoYW5fY2xlYXIgKGNhcmQsICZjYXJkLT5jaF9pbik7CisJCQljYXJkLT5jaF9pbi5mcmFnX251bWJlciA9IDA7CisJCQljYXJkLT5jaF9pbi5mcmFnX3NpemUgPSAwOworCQkJYXRvbWljX3NldCgmY2FyZC0+Y2hfaW4ubl9mcmFncywgMCk7CisJCX0KKworCQlpZiAod3IpIHsKKwkJCXZpYV9jaGFuX2NsZWFyIChjYXJkLCAmY2FyZC0+Y2hfb3V0KTsKKwkJCWNhcmQtPmNoX291dC5mcmFnX251bWJlciA9IDA7CisJCQljYXJkLT5jaF9vdXQuZnJhZ19zaXplID0gMDsKKwkJCWF0b21pY19zZXQoJmNhcmQtPmNoX291dC5uX2ZyYWdzLCAwKTsKKwkJfQorCisJCXJjID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmMgPSAwOworCQlicmVhazsKKworCS8qIG9idGFpbiBiaXRtYXNrIG9mIGRldmljZSBjYXBhYmlsaXRpZXMsIHN1Y2ggYXMgbW1hcCwgZnVsbCBkdXBsZXgsIGV0Yy4gKi8KKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJRFBSSU5USyAoIkRTUF9HRVRDQVBTXG4iKTsKKwkJcmMgPSBwdXRfdXNlcihWSUFfRFNQX0NBUCwgaXApOworCQlicmVhazsKKworCS8qIG9idGFpbiBidWZmZXIgZnJhZ21lbnQgc2l6ZSAqLworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlEUFJJTlRLICgiRFNQX0dFVEJMS1NJWkVcbiIpOworCisJCWlmIChyZCkgeworCQkJdmlhX2NoYW5fc2V0X2J1ZmZlcmluZyhjYXJkLCAmY2FyZC0+Y2hfaW4sIC0xKTsKKwkJCXJjID0gcHV0X3VzZXIoY2FyZC0+Y2hfaW4uZnJhZ19zaXplLCBpcCk7CisJCX0gZWxzZSBpZiAod3IpIHsKKwkJCXZpYV9jaGFuX3NldF9idWZmZXJpbmcoY2FyZCwgJmNhcmQtPmNoX291dCwgLTEpOworCQkJcmMgPSBwdXRfdXNlcihjYXJkLT5jaF9vdXQuZnJhZ19zaXplLCBpcCk7CisJCX0KKwkJYnJlYWs7CisKKwkvKiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgaW5wdXQgYnVmZmVyaW5nICovCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJRFBSSU5USyAoIkRTUF9HRVRJU1BBQ0VcbiIpOworCQlpZiAocmQpCisJCQlyYyA9IHZpYV9kc3BfaW9jdGxfc3BhY2UgKGNhcmQsICZjYXJkLT5jaF9pbiwgcCk7CisJCWJyZWFrOworCisJLyogb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IG91dHB1dCBidWZmZXJpbmcgKi8KKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlEUFJJTlRLICgiRFNQX0dFVE9TUEFDRVxuIik7CisJCWlmICh3cikKKwkJCXJjID0gdmlhX2RzcF9pb2N0bF9zcGFjZSAoY2FyZCwgJmNhcmQtPmNoX291dCwgcCk7CisJCWJyZWFrOworCisJLyogb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IGlucHV0IGhhcmR3YXJlIHBvaW50ZXIgKi8KKwljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJRFBSSU5USyAoIkRTUF9HRVRJUFRSXG4iKTsKKwkJaWYgKHJkKQorCQkJcmMgPSB2aWFfZHNwX2lvY3RsX3B0ciAoY2FyZCwgJmNhcmQtPmNoX2luLCBwKTsKKwkJYnJlYWs7CisKKwkvKiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgb3V0cHV0IGhhcmR3YXJlIHBvaW50ZXIgKi8KKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJRFBSSU5USyAoIkRTUF9HRVRPUFRSXG4iKTsKKwkJaWYgKHdyKQorCQkJcmMgPSB2aWFfZHNwX2lvY3RsX3B0ciAoY2FyZCwgJmNhcmQtPmNoX291dCwgcCk7CisJCWJyZWFrOworCisJLyogcmV0dXJuIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgcGxheWVkIGJ5IERNQSBlbmdpbmUgKi8KKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQl7CisJCURQUklOVEsgKCJEU1BfR0VUT0RFTEFZXG4iKTsKKworCQljaGFuID0gJmNhcmQtPmNoX291dDsKKworCQlpZiAoIXdyKQorCQkJYnJlYWs7CisKKwkJaWYgKGNoYW4tPmlzX2FjdGl2ZSkgeworCisJCQl2YWwgPSBjaGFuLT5mcmFnX251bWJlciAtIGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncyk7CisKKwkJCWFzc2VydCh2YWwgPj0gMCk7CisJCQkJCisJCQlpZiAodmFsID4gMCkgeworCQkJCXZhbCAqPSBjaGFuLT5mcmFnX3NpemU7CisJCQkJdmFsIC09IGNoYW4tPmZyYWdfc2l6ZSAtIHZpYV9zZ19vZmZzZXQoY2hhbik7CisJCQl9CisJCQl2YWwgKz0gY2hhbi0+c2xvcF9sZW4gJSBjaGFuLT5mcmFnX3NpemU7CisJCX0gZWxzZQorCQkJdmFsID0gMDsKKworCQlhc3NlcnQgKHZhbCA8PSAoY2hhbi0+ZnJhZ19zaXplICogY2hhbi0+ZnJhZ19udW1iZXIpKTsKKworCQlEUFJJTlRLICgiR0VUT0RFTEFZIEVYSVQsIHZhbCA9ICVkIGJ5dGVzXG4iLCB2YWwpOworICAgICAgICAgICAgICAgIHJjID0gcHV0X3VzZXIgKHZhbCwgaXApOworCQlicmVhazsKKwkJfQorCisJLyogaGFuZGxlIHRoZSBxdWljay1zdGFydCBvZiBhIGNoYW5uZWwsCisJICogb3IgdGhlIG5vdGlmaWNhdGlvbiB0aGF0IGEgcXVpY2stc3RhcnQgd2lsbAorCSAqIG9jY3VyIGluIHRoZSBmdXR1cmUKKwkgKi8KKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgaXApKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlEUFJJTlRLICgiRFNQX1NFVFRSSUdHRVIsIHJkPSVkLCB3cj0lZCwgYWN0PSVkLyVkLCBlbj0lZC8lZFxuIiwKKwkJCXJkLCB3ciwgY2FyZC0+Y2hfaW4uaXNfYWN0aXZlLCBjYXJkLT5jaF9vdXQuaXNfYWN0aXZlLAorCQkJY2FyZC0+Y2hfaW4uaXNfZW5hYmxlZCwgY2FyZC0+Y2hfb3V0LmlzX2VuYWJsZWQpOworCisJCXJjID0gMDsKKworCQlpZiAocmQpCisJCQlyYyA9IHZpYV9kc3BfaW9jdGxfdHJpZ2dlciAoJmNhcmQtPmNoX2luLCB2YWwpOworCisJCWlmICghcmMgJiYgd3IpCisJCQlyYyA9IHZpYV9kc3BfaW9jdGxfdHJpZ2dlciAoJmNhcmQtPmNoX291dCwgdmFsKTsKKworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIGNhcmQtPmNoX2luLmlzX2VuYWJsZWQpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgY2FyZC0+Y2hfb3V0LmlzX2VuYWJsZWQpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCXJjID0gcHV0X3VzZXIodmFsLCBpcCk7CisJCWJyZWFrOworCisJLyogRW5hYmxlIGZ1bGwgZHVwbGV4LiAgU2luY2Ugd2UgZG8gdGhpcyBhcyBzb29uIGFzIHdlIGFyZSBvcGVuZWQKKwkgKiB3aXRoIE9fUkRXUiwgdGhpcyBpcyBtYWlubHkgYSBuby1vcCB0aGF0IGFsd2F5cyByZXR1cm5zIHN1Y2Nlc3MuCisJICovCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJRFBSSU5USyAoIkRTUF9TRVREVVBMRVhcbiIpOworCQlpZiAoIXJkIHx8ICF3cikKKwkJCWJyZWFrOworCQlyYyA9IDA7CisJCWJyZWFrOworCisJLyogc2V0IGZyYWdtZW50IHNpemUuICBpbXBsZW1lbnRlZCBhcyBhIHN1Y2Nlc3NmdWwgbm8tb3AgZm9yIG5vdyAqLworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgaXApKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlEUFJJTlRLICgiRFNQX1NFVEZSQUdNRU5ULCB2YWw9PSVkXG4iLCB2YWwpOworCisJCWlmIChyZCkKKwkJCXJjID0gdmlhX2NoYW5fc2V0X2J1ZmZlcmluZyhjYXJkLCAmY2FyZC0+Y2hfaW4sIHZhbCk7CisKKwkJaWYgKHdyKQorCQkJcmMgPSB2aWFfY2hhbl9zZXRfYnVmZmVyaW5nKGNhcmQsICZjYXJkLT5jaF9vdXQsIHZhbCk7CisKKwkJRFBSSU5USyAoIlNORENUTF9EU1BfU0VURlJBR01FTlQgKGZyYWdzaGlmdD09MHglMDRYICglZCksIG1heGZyYWdzPT0weCUwNFggKCVkKSlcbiIsCisJCQkgdmFsICYgMHhGRkZGLAorCQkJIHZhbCAmIDB4RkZGRiwKKwkJCSAodmFsID4+IDE2KSAmIDB4RkZGRiwKKwkJCSAodmFsID4+IDE2KSAmIDB4RkZGRik7CisKKwkJcmMgPSAwOworCQlicmVhazsKKworCS8qIGluZm9ybSBkZXZpY2Ugb2YgYW4gdXBjb21pbmcgcGF1c2UgaW4gaW5wdXQgKG9yIG91dHB1dCkuICovCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCURQUklOVEsgKCJEU1BfUE9TVFxuIik7CisJCWlmICh3cikgeworCQkJaWYgKGNhcmQtPmNoX291dC5zbG9wX2xlbiA+IDApCisJCQkJdmlhX2NoYW5fZmx1c2hfZnJhZyAoJmNhcmQtPmNoX291dCk7CisJCQl2aWFfY2hhbl9tYXliZV9zdGFydCAoJmNhcmQtPmNoX291dCk7CisJCX0KKworCQlyYyA9IDA7CisJCWJyZWFrOworCisJLyogbm90IGltcGxlbWVudGVkICovCisJZGVmYXVsdDoKKwkJRFBSSU5USyAoInVuaGFuZGxlZCBpb2N0bCwgY21kPT0ldSwgYXJnPT0lcFxuIiwKKwkJCSBjbWQsIHApOworCQlicmVhazsKKwl9CisKKwl1cCAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgdmlhX2RzcF9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCB2aWFfaW5mbyAqY2FyZDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJc3RydWN0IHZpYV9jaGFubmVsICpjaGFuOworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnZyOworCWludCBub25ibG9jayA9IChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisKKwlEUFJJTlRLICgiRU5URVIsIG1pbm9yPSVkLCBmaWxlLT5mX21vZGU9MHgleFxuIiwgbWlub3IsIGZpbGUtPmZfbW9kZSk7CisKKwlpZiAoIShmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkpIHsKKwkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAtRUlOVkFMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2FyZCA9IE5VTEw7CisJd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBkZXYpKSAhPSBOVUxMKSB7CisJCWRydnIgPSBwY2lfZGV2X2RyaXZlciAocGRldik7CisJCWlmIChkcnZyID09ICZ2aWFfZHJpdmVyKSB7CisJCQlhc3NlcnQgKHBjaV9nZXRfZHJ2ZGF0YSAocGRldikgIT0gTlVMTCk7CisKKwkJCWNhcmQgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCQkJRFBSSU5USyAoImRldl9kc3AgPSAlZCwgbWlub3IgPSAlZCwgYXNzbiA9ICVkXG4iLAorCQkJCSBjYXJkLT5kZXZfZHNwLCBtaW5vciwKKwkJCQkgKGNhcmQtPmRldl9kc3AgXiBtaW5vcikgJiB+MHhmKTsKKworCQkJaWYgKCgoY2FyZC0+ZGV2X2RzcCBeIG1pbm9yKSAmIH4weGYpID09IDApCisJCQkJZ290byBtYXRjaDsKKwkJfQorCX0KKworCURQUklOVEsgKCJubyBtYXRjaGluZyAlcyBmb3VuZFxuIiwgY2FyZCA/ICJtaW5vciIgOiAiZHJpdmVyIik7CisJcmV0dXJuIC1FTk9ERVY7CisKK21hdGNoOgorCWlmIChub25ibG9jaykgeworCQlpZiAoZG93bl90cnlsb2NrICgmY2FyZC0+b3Blbl9zZW0pKSB7CisJCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIC1FQUdBSU5cbiIpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmY2FyZC0+b3Blbl9zZW0pKSB7CisJCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIC1FUkVTVEFSVFNZU1xuIik7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKwlEUFJJTlRLICgiZmlsZS0+Zl9tb2RlID09IDB4JXhcbiIsIGZpbGUtPmZfbW9kZSk7CisKKwkvKiBoYW5kbGUgaW5wdXQgZnJvbSBhbmFsb2cgc291cmNlICovCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJY2hhbiA9ICZjYXJkLT5jaF9pbjsKKworCQl2aWFfY2hhbl9pbml0IChjYXJkLCBjaGFuKTsKKworCQkvKiB3aHkgaXMgdGhpcyBmb3JjZWQgdG8gMTYtYml0IHN0ZXJlbyBpbiBhbGwgZHJpdmVycz8gKi8KKwkJY2hhbi0+cGNtX2ZtdCA9IFZJQV9QQ01fRk1UXzE2QklUIHwgVklBX1BDTV9GTVRfU1RFUkVPOworCQljaGFuLT5jaGFubmVscyA9IDI7CisKKwkJLy8gVE8gRE8gLSB1c2UgRklGTzogdmlhX2NhcHR1cmVfZmlmbyhjYXJkLCAxKTsKKwkJdmlhX2NoYW5fcGNtX2ZtdCAoY2hhbiwgMCk7CisJCXZpYV9zZXRfcmF0ZSAoY2FyZC0+YWM5NywgY2hhbiwgNDQxMDApOworCX0KKworCS8qIGhhbmRsZSBvdXRwdXQgdG8gYW5hbG9nIHNvdXJjZSAqLworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQljaGFuID0gJmNhcmQtPmNoX291dDsKKworCQl2aWFfY2hhbl9pbml0IChjYXJkLCBjaGFuKTsKKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJLyogaWYgaW4gZHVwbGV4IG1vZGUgbWFrZSB0aGUgcmVjb3JkaW5nIGFuZCBwbGF5YmFjayBjaGFubmVscworCQkJICAgaGF2ZSB0aGUgc2FtZSBzZXR0aW5ncyAqLworCQkJY2hhbi0+cGNtX2ZtdCA9IFZJQV9QQ01fRk1UXzE2QklUIHwgVklBX1BDTV9GTVRfU1RFUkVPOworCQkJY2hhbi0+Y2hhbm5lbHMgPSAyOworCQkJdmlhX2NoYW5fcGNtX2ZtdCAoY2hhbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWFfc2V0X3JhdGUgKGNhcmQtPmFjOTcsIGNoYW4sIDQ0MTAwKTsKKwkJfSBlbHNlIHsKKwkJCSBpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KSB7CisJCQkJY2hhbi0+cGNtX2ZtdCA9IFZJQV9QQ01fRk1UXzE2QklUOworCQkJCXZpYV9jaGFuX3BjbV9mbXQgKGNoYW4sIDApOworCQkJCXZpYV9zZXRfcmF0ZSAoY2FyZC0+YWM5NywgY2hhbiwgNDQxMDApOworCQkJfSBlbHNlIHsKKwkJCQl2aWFfY2hhbl9wY21fZm10IChjaGFuLCAxKTsKKwkJCQl2aWFfc2V0X3JhdGUgKGNhcmQtPmFjOTcsIGNoYW4sIDgwMDApOworCQkJfQorCQl9CisJfQorCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAwXG4iKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKworc3RhdGljIGludCB2aWFfZHNwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpYV9pbmZvICpjYXJkOworCWludCBub25ibG9jayA9IChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJaW50IHJjOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAoZmlsZSAhPSBOVUxMKTsKKwljYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWFzc2VydCAoY2FyZCAhPSBOVUxMKTsKKworCXJjID0gdmlhX3N5c2NhbGxfZG93biAoY2FyZCwgbm9uYmxvY2spOworCWlmIChyYykgeworCQlEUFJJTlRLICgiRVhJVCAoc3lzY2FsbF9kb3duIGVycm9yKSwgcmM9JWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlyYyA9IHZpYV9kc3BfZHJhaW5fcGxheWJhY2sgKGNhcmQsICZjYXJkLT5jaF9vdXQsIG5vbmJsb2NrKTsKKwkJaWYgKHJjICYmIHJjICE9IC1FUkVTVEFSVFNZUykJLyogTm9ib2R5IG5lZWRzIHRvIGtub3cgYWJvdXQgXkMgKi8KKwkJCXByaW50ayAoS0VSTl9ERUJVRyAidmlhX2F1ZGlvOiBpZ25vcmluZyBkcmFpbiBwbGF5YmFjayBlcnJvciAlZFxuIiwgcmMpOworCisJCXZpYV9jaGFuX2ZyZWUgKGNhcmQsICZjYXJkLT5jaF9vdXQpOworCQl2aWFfY2hhbl9idWZmZXJfZnJlZShjYXJkLCAmY2FyZC0+Y2hfb3V0KTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQl2aWFfY2hhbl9mcmVlIChjYXJkLCAmY2FyZC0+Y2hfaW4pOworCQl2aWFfY2hhbl9idWZmZXJfZnJlZSAoY2FyZCwgJmNhcmQtPmNoX2luKTsKKwl9CisKKwl1cCAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKKwl1cCAoJmNhcmQtPm9wZW5fc2VtKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGlwIHNldHVwIGFuZCBrZXJuZWwgcmVnaXN0cmF0aW9uCisgKgorICoKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisjaWZkZWYgQ09ORklHX01JRElfVklBODJDWFhYCisJdTggcjQyOworI2VuZGlmCisJaW50IHJjOworCXN0cnVjdCB2aWFfaW5mbyAqY2FyZDsKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlpZiAocHJpbnRlZF92ZXJzaW9uKysgPT0gMCkKKwkJcHJpbnRrIChLRVJOX0lORk8gIlZpYSA2ODZhLzgyMzMvODIzNSBhdWRpbyBkcml2ZXIgIiBWSUFfVkVSU0lPTiAiXG4iKTsKKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UgKHBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zIChwZGV2LCAidmlhODJjeHh4X2F1ZGlvIik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmVUxMKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZXM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVzOworCisJY2FyZCA9IGttYWxsb2MgKHNpemVvZiAoKmNhcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcmQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIm91dCBvZiBtZW1vcnksIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YSAocGRldiwgY2FyZCk7CisKKwltZW1zZXQgKGNhcmQsIDAsIHNpemVvZiAoKmNhcmQpKTsKKwljYXJkLT5wZGV2ID0gcGRldjsKKwljYXJkLT5iYXNlYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisJY2FyZC0+Y2FyZF9udW0gPSB2aWFfbnVtX2NhcmRzKys7CisJc3Bpbl9sb2NrX2luaXQgKCZjYXJkLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCAoJmNhcmQtPmFjOTdfbG9jayk7CisJaW5pdF9NVVRFWCAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKKwlpbml0X01VVEVYICgmY2FyZC0+b3Blbl9zZW0pOworCisJLyogd2UgbXVzdCBpbml0IHRoZXNlIG5vdywgaW4gY2FzZSB0aGUgaW50ciBoYW5kbGVyIG5lZWRzIHRoZW0gKi8KKwl2aWFfY2hhbl9pbml0X2RlZmF1bHRzIChjYXJkLCAmY2FyZC0+Y2hfb3V0KTsKKwl2aWFfY2hhbl9pbml0X2RlZmF1bHRzIChjYXJkLCAmY2FyZC0+Y2hfaW4pOworCXZpYV9jaGFuX2luaXRfZGVmYXVsdHMgKGNhcmQsICZjYXJkLT5jaF9mbSk7CisKKwkvKiBpZiBCQVIgMiBpcyBwcmVzZW50LCBjaGlwIGlzIFJldiBIIG9yIGxhdGVyLAorCSAqIHdoaWNoIG1lYW5zIGl0IGhhcyBhIGZldyBleHRyYSBmZWF0dXJlcyAqLworCWlmIChwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDIpID4gMCkKKwkJY2FyZC0+cmV2X2ggPSAxOworCQkKKwkvKiBPdmVya2lsbCBmb3Igbm93LCBidXQgbW9yZSBmbGV4aWJsZSBkb25lIHJpZ2h0ICovCisJCisJY2FyZC0+aW50bWFzayA9IGlkLT5kcml2ZXJfZGF0YTsKKwljYXJkLT5sZWdhY3kgPSAhY2FyZC0+aW50bWFzazsKKwljYXJkLT5zaXhjaGFubmVsID0gaWQtPmRyaXZlcl9kYXRhOworCQorCWlmKGNhcmQtPnNpeGNoYW5uZWwpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJTaXggY2hhbm5lbCBhdWRpbyBhdmFpbGFibGVcbiIpOworCWlmIChwZGV2LT5pcnEgPCAxKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJpbnZhbGlkIFBDSSBJUlEgJWQsIGFib3J0aW5nXG4iLCBwZGV2LT5pcnEpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9rZnJlZTsKKwl9CisKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDApICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byBsb2NhdGUgSS9PIHJlc291cmNlcywgYWJvcnRpbmdcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9rZnJlZTsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkKKwkvKgorCSAqIGluaXQgQUM5NyBtaXhlciBhbmQgY29kZWMKKwkgKi8KKwlyYyA9IHZpYV9hYzk3X2luaXQgKGNhcmQpOworCWlmIChyYykgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiQUM5NyBpbml0IGZhaWxlZCwgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVycl9vdXRfa2ZyZWU7CisJfQorCisJLyoKKwkgKiBpbml0IERTUCBkZXZpY2UKKwkgKi8KKwlyYyA9IHZpYV9kc3BfaW5pdCAoY2FyZCk7CisJaWYgKHJjKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJEU1AgZGV2aWNlIGluaXQgZmFpbGVkLCBhYm9ydGluZ1xuIik7CisJCWdvdG8gZXJyX291dF9oYXZlX21peGVyOworCX0KKworCS8qCisJICogaW5pdCBhbmQgdHVybiBvbiBpbnRlcnJ1cHRzLCBhcyB0aGUgbGFzdCB0aGluZyB3ZSBkbworCSAqLworCXJjID0gdmlhX2ludGVycnVwdF9pbml0IChjYXJkKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImludGVycnVwdCBpbml0IGZhaWxlZCwgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVycl9vdXRfaGF2ZV9kc3A7CisJfQorCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJib2FyZCAjJWQgYXQgMHglMDRsWCwgSVJRICVkXG4iLAorCQljYXJkLT5jYXJkX251bSArIDEsIGNhcmQtPmJhc2VhZGRyLCBwZGV2LT5pcnEpOworCisjaWZkZWYgQ09ORklHX01JRElfVklBODJDWFhYCisJLyogRGlzYWJsZSBieSBkZWZhdWx0ICovCisJY2FyZC0+bWlkaV9pbmZvLmlvX2Jhc2UgPSAwOworCisJaWYoY2FyZC0+bGVnYWN5KQorCXsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKHBkZXYsIDB4NDIsICZyNDIpOworCQkvKiBEaXNhYmxlIE1JREkgaW50ZXJydXB0ICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZSAocGRldiwgMHg0MiwgcjQyIHwgVklBX0NSNDJfTUlESV9JUlFNQVNLKTsKKwkJaWYgKHI0MiAmIFZJQV9DUjQyX01JRElfRU5BQkxFKQorCQl7CisJCQlpZiAocjQyICYgVklBX0NSNDJfTUlESV9QTlApIC8qIEFkZHJlc3Mgc2VsZWN0ZWQgYnkgaW9iYXNlIDIgLSBub3QgdGVzdGVkICovCisJCQkJY2FyZC0+bWlkaV9pbmZvLmlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDIpOworCQkJZWxzZSAvKiBBZGRyZXNzIHNlbGVjdGVkIGJ5IGJ5dGUgMHg0MyAqLworCQkJeworCQkJCXU4IHI0MzsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAocGRldiwgMHg0MywgJnI0Myk7CisJCQkJY2FyZC0+bWlkaV9pbmZvLmlvX2Jhc2UgPSAweDMwMCArICgocjQzICYgMHgwYykgPDwgMik7CisJCQl9CisKKwkJCWNhcmQtPm1pZGlfaW5mby5pcnEgPSAtcGRldi0+aXJxOworCQkJaWYgKHByb2JlX3VhcnQ0MDEoJiBjYXJkLT5taWRpX2luZm8sIFRISVNfTU9EVUxFKSkKKwkJCXsKKwkJCQljYXJkLT5taWRpX2RldmM9bWlkaV9kZXZzW2NhcmQtPm1pZGlfaW5mby5zbG90c1s0XV0tPmRldmM7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDIsIHI0MiAmIH5WSUFfQ1I0Ml9NSURJX0lSUU1BU0spOworCQkJCXByaW50aygiRW5hYmxlZCBWaWEgTUlESVxuIik7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaGF2ZV9kc3A6CisJdmlhX2RzcF9jbGVhbnVwIChjYXJkKTsKKworZXJyX291dF9oYXZlX21peGVyOgorCXZpYV9hYzk3X2NsZWFudXAgKGNhcmQpOworCitlcnJfb3V0X2tmcmVlOgorI2lmbmRlZiBWSUFfTkRFQlVHCisJbWVtc2V0IChjYXJkLCAweEFCLCBzaXplb2YgKCpjYXJkKSk7IC8qIHBvaXNvbiBtZW1vcnkgKi8KKyNlbmRpZgorCWtmcmVlIChjYXJkKTsKKworZXJyX291dF9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyAocGRldik7CisKK2Vycl9vdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworCitlcnJfb3V0OgorCXBjaV9zZXRfZHJ2ZGF0YSAocGRldiwgTlVMTCk7CisJRFBSSU5USyAoIkVYSVQgLSByZXR1cm5pbmcgJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHZpYV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0IChwZGV2ICE9IE5VTEwpOworCWNhcmQgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCWFzc2VydCAoY2FyZCAhPSBOVUxMKTsKKworI2lmZGVmIENPTkZJR19NSURJX1ZJQTgyQ1hYWAorCWlmIChjYXJkLT5taWRpX2luZm8uaW9fYmFzZSkKKwkJdW5sb2FkX3VhcnQ0MDEoJmNhcmQtPm1pZGlfaW5mbyk7CisjZW5kaWYKKworCWZyZWVfaXJxIChjYXJkLT5wZGV2LT5pcnEsIGNhcmQpOworCXZpYV9kc3BfY2xlYW51cCAoY2FyZCk7CisJdmlhX2FjOTdfY2xlYW51cCAoY2FyZCk7CisKKyNpZm5kZWYgVklBX05ERUJVRworCW1lbXNldCAoY2FyZCwgMHhBQiwgc2l6ZW9mICgqY2FyZCkpOyAvKiBwb2lzb24gbWVtb3J5ICovCisjZW5kaWYKKwlrZnJlZSAoY2FyZCk7CisKKwlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIE5VTEwpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyAocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlIChwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlIChwZGV2LCAzKTsgLyogLi4uenp6enp6ICovCisKKwlEUFJJTlRLICgiRVhJVFxuIik7CisJcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRHJpdmVyIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwCisgKgorICoKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3ZpYTgyY3h4eF9hdWRpbyh2b2lkKQoreworCWludCByYzsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlyYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIgKCZ2aWFfZHJpdmVyKTsKKwlpZiAocmMpIHsKKwkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAwXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF92aWE4MmN4eHhfYXVkaW8odm9pZCkKK3sKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmdmlhX2RyaXZlcik7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworbW9kdWxlX2luaXQoaW5pdF92aWE4MmN4eHhfYXVkaW8pOworbW9kdWxlX2V4aXQoY2xlYW51cF92aWE4MmN4eHhfYXVkaW8pOworCitNT0RVTEVfQVVUSE9SKCJKZWZmIEdhcnppayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEU1AgYXVkaW8gYW5kIG1peGVyIGRyaXZlciBmb3IgVmlhIDgyQ3h4eCBhdWRpbyBkZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92aWRjLmMgYi9zb3VuZC9vc3MvdmlkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZmU1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvdmlkYy5jCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvc291bmQvdmlkYy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIGJ5IFJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVklEQzIwIGF1ZGlvIGRyaXZlci4KKyAqCisgKiBUaGUgVklEQzIwIHNvdW5kIGhhcmR3YXJlIGNvbnNpc3RzIG9mIHRoZSBWSURDMjAgaXRzZWxmLCBhIERBQyBhbmQgYSBETUEKKyAqIGVuZ2luZS4gIFRoZSBETUEgdHJhbnNmZXJzIGZpeGVkLWZvcm1hdCAoMTYtYml0IGxpdHRsZS1lbmRpYW4gbGluZWFyKQorICogc2FtcGxlcyB0byB0aGUgVklEQzIwLCB3aGljaCB0aGVuIHRyYW5zZmVycyB0aGlzIGRhdGEgc2VyaWFsbHkgdG8gdGhlCisgKiBEQUNzLiAgVGhlIHNhbXBsZXJhdGUgaXMgY29udHJvbGxlZCBieSB0aGUgVklEQy4KKyAqCisgKiBXZSBjdXJyZW50bHkgc3VwcG9ydCBhIG1peGVyIGRldmljZSwgYnV0IGl0IGlzIGN1cnJlbnRseSBub24tZnVuY3Rpb25hbC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb21kLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInZpZGMuaCIKKworI2lmbmRlZiBfU0lPQ19UWVBFCisjZGVmaW5lIF9TSU9DX1RZUEUoeCkJX0lPQ19UWVBFKHgpCisjZW5kaWYKKyNpZm5kZWYgX1NJT0NfTlIKKyNkZWZpbmUgX1NJT0NfTlIoeCkJX0lPQ19OUih4KQorI2VuZGlmCisKKyNkZWZpbmUgVklEQ19TT1VORF9DTE9DSwkoMjUwMDAwKQorI2RlZmluZSBWSURDX1NPVU5EX0NMT0NLX0VYVAkoMTc2NDAwKQorCisvKgorICogV2hlbiB1c2luZyBTRVJJQUwgU09VTkQgbW9kZSAoZXh0ZXJuYWwgREFDKSwgdGhlIG51bWJlciBvZiBwaHlzaWNhbAorICogY2hhbm5lbHMgaXMgZml4ZWQgYXQgMi4KKyAqLworc3RhdGljIGludAkJdmlkY19idXN5Oworc3RhdGljIGludAkJdmlkY19hZGV2Oworc3RhdGljIGludAkJdmlkY19hdWRpb19yYXRlOworc3RhdGljIGNoYXIJCXZpZGNfYXVkaW9fZm9ybWF0Oworc3RhdGljIGNoYXIJCXZpZGNfYXVkaW9fY2hhbm5lbHM7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCXZpZGNfbGV2ZWxfbFtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCTg1LAkJLyogbWFzdGVyCSovCisJNTAsCQkvKiBiYXNzCQkqLworCTUwLAkJLyogdHJlYmxlCSovCisJMCwJCS8qIHN5bnRoCSovCisJNzUsCQkvKiBwY20JCSovCisJMCwJCS8qIHNwZWFrZXIJKi8KKwkxMDAsCQkvKiBleHQgbGluZQkqLworCTAsCQkvKiBtaWMJCSovCisJMTAwLAkJLyogQ0QJCSovCisJMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCXZpZGNfbGV2ZWxfcltTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCTg1LAkJLyogbWFzdGVyCSovCisJNTAsCQkvKiBiYXNzCQkqLworCTUwLAkJLyogdHJlYmxlCSovCisJMCwJCS8qIHN5bnRoCSovCisJNzUsCQkvKiBwY20JCSovCisJMCwJCS8qIHNwZWFrZXIJKi8KKwkxMDAsCQkvKiBleHQgbGluZQkqLworCTAsCQkvKiBtaWMJCSovCisJMTAwLAkJLyogQ0QJCSovCisJMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQJdmlkY19hdWRpb192b2x1bWVfbDsJLyogbGVmdCBQQ00gdm9sLCAwIC0gNjU1MzYgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJdmlkY19hdWRpb192b2x1bWVfcjsJLyogcmlnaHQgUENNIHZvbCwgMCAtIDY1NTM2ICovCisKK2V4dGVybiB2b2lkCXZpZGNfdXBkYXRlX2ZpbGxlcihpbnQgYml0cywgaW50IGNoYW5uZWxzKTsKK2V4dGVybiBpbnQJc29mdG9zc19kZXY7CisKK3N0YXRpYyB2b2lkCit2aWRjX21peGVyX3NldChpbnQgbWRldiwgdW5zaWduZWQgaW50IGxldmVsKQoreworCXVuc2lnbmVkIGludCBsZXZfbCA9IGxldmVsICYgMHgwMDdmOworCXVuc2lnbmVkIGludCBsZXZfciA9IChsZXZlbCAmIDB4N2YwMCkgPj4gODsKKwl1bnNpZ25lZCBpbnQgbWxldl9sLCBtbGV2X3I7CisKKwlpZiAobGV2X2wgPiAxMDApCisJCWxldl9sID0gMTAwOworCWlmIChsZXZfciA+IDEwMCkKKwkJbGV2X3IgPSAxMDA7CisKKyNkZWZpbmUgU0NBTEUobGV2LG1hc3RlcikJKChsZXYpICogKG1hc3RlcikgKiA2NTUzNiAvIDEwMDAwKQorCisJbWxldl9sID0gdmlkY19sZXZlbF9sW1NPVU5EX01JWEVSX1ZPTFVNRV07CisJbWxldl9yID0gdmlkY19sZXZlbF9yW1NPVU5EX01JWEVSX1ZPTFVNRV07CisKKwlzd2l0Y2ggKG1kZXYpIHsKKwljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwkJdmlkY19sZXZlbF9sW21kZXZdID0gbGV2X2w7CisJCXZpZGNfbGV2ZWxfclttZGV2XSA9IGxldl9yOworCisJCXZpZGNfYXVkaW9fdm9sdW1lX2wgPSBTQ0FMRShsZXZfbCwgbWxldl9sKTsKKwkJdmlkY19hdWRpb192b2x1bWVfciA9IFNDQUxFKGxldl9yLCBtbGV2X3IpOworLypwcmludGsoIlZJREM6IFBDTSB2b2wgJTA1WCAlMDVYXG4iLCB2aWRjX2F1ZGlvX3ZvbHVtZV9sLCB2aWRjX2F1ZGlvX3ZvbHVtZV9yKTsqLworCQlicmVhazsKKwl9CisjdW5kZWYgU0NBTEUKK30KKworc3RhdGljIGludCB2aWRjX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBpbnQgbWRldjsKKworCWlmIChfU0lPQ19UWVBFKGNtZCkgIT0gJ00nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1kZXYgPSBfU0lPQ19OUihjbWQpOworCisJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpIHsKKwkJaWYgKGdldF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG1kZXYgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMpCisJCQl2aWRjX21peGVyX3NldChtZGV2LCB2YWwpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFJldHVybiBwYXJhbWV0ZXJzCisJICovCisJc3dpdGNoIChtZGV2KSB7CisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQl2YWwgPSBTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19TWU5USDsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6CisJCXZhbCA9IFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX1NZTlRIOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKG1kZXYgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMpCisJCQl2YWwgPSB2aWRjX2xldmVsX2xbbWRldl0gfCB2aWRjX2xldmVsX3JbbWRldl0gPDwgODsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHB1dF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlkY19hdWRpb19zZXRfZm9ybWF0KGludCBkZXYsIHVuc2lnbmVkIGludCBmbXQpCit7CisJc3dpdGNoIChmbXQpIHsKKwlkZWZhdWx0OgorCQlmbXQgPSBBRk1UX1MxNl9MRTsKKwljYXNlIEFGTVRfVTg6CisJY2FzZSBBRk1UX1M4OgorCWNhc2UgQUZNVF9TMTZfTEU6CisJCXZpZGNfYXVkaW9fZm9ybWF0ID0gZm10OworCQl2aWRjX3VwZGF0ZV9maWxsZXIodmlkY19hdWRpb19mb3JtYXQsIHZpZGNfYXVkaW9fY2hhbm5lbHMpOworCWNhc2UgQUZNVF9RVUVSWToKKwkJYnJlYWs7CisJfQorCXJldHVybiB2aWRjX2F1ZGlvX2Zvcm1hdDsKK30KKworI2RlZmluZSBteV9hYnMoaSkgKChpKTwwID8gLShpKSA6IChpKSkKKworc3RhdGljIGludCB2aWRjX2F1ZGlvX3NldF9zcGVlZChpbnQgZGV2LCBpbnQgcmF0ZSkKK3sKKwlpZiAocmF0ZSkgeworCQl1bnNpZ25lZCBpbnQgaHdjdHJsLCBod3JhdGUsIGh3cmF0ZV9leHQsIHJhdGVfaW50LCByYXRlX2V4dDsKKwkJdW5zaWduZWQgaW50IGRpZmZfaW50LCBkaWZmX2V4dDsKKwkJdW5zaWduZWQgaW50IG5ld3NpemUsIG5ldzJzaXplOworCisJCWh3Y3RybCA9IDB4MDAwMDAwMDM7CisKKwkJLyogVXNpbmcgaW50ZXJuYWwgY2xvY2sgKi8KKwkJaHdyYXRlID0gKCgoVklEQ19TT1VORF9DTE9DSyAqIDIpIC8gcmF0ZSkgKyAxKSA+PiAxOworCQlpZiAoaHdyYXRlIDwgMykKKwkJCWh3cmF0ZSA9IDM7CisJCWlmIChod3JhdGUgPiAyNTUpCisJCQlod3JhdGUgPSAyNTU7CisKKwkJLyogVXNpbmcgZXhlcm5hbCBjbG9jayAqLworCQlod3JhdGVfZXh0ID0gKCgoVklEQ19TT1VORF9DTE9DS19FWFQgKiAyKSAvIHJhdGUpICsgMSkgPj4gMTsKKwkJaWYgKGh3cmF0ZV9leHQgPCAzKQorCQkJaHdyYXRlX2V4dCA9IDM7CisJCWlmIChod3JhdGVfZXh0ID4gMjU1KQorCQkJaHdyYXRlX2V4dCA9IDI1NTsKKworCQlyYXRlX2ludCA9IFZJRENfU09VTkRfQ0xPQ0sgLyBod3JhdGU7CisJCXJhdGVfZXh0ID0gVklEQ19TT1VORF9DTE9DS19FWFQgLyBod3JhdGVfZXh0OworCisJCS8qIENob3NlIGJldHdlZW4gZXh0ZXJuYWwgYW5kIGludGVybmFsIGNsb2NrICovCisJCWRpZmZfaW50ID0gbXlfYWJzKHJhdGVfZXh0LXJhdGUpOworCQlkaWZmX2V4dCA9IG15X2FicyhyYXRlX2ludC1yYXRlKTsKKwkJaWYgKGRpZmZfZXh0IDwgZGlmZl9pbnQpIHsKKwkJCS8qcHJpbnRrKCJWSURDOiBleHRlcm5hbCAlZCAlZCAlZFxuIiwgcmF0ZSwgcmF0ZV9leHQsIGh3cmF0ZV9leHQpOyovCisJCQlod3JhdGU9aHdyYXRlX2V4dDsKKwkJCWh3Y3RybD0weDAwMDAwMDAyOworCQkJLyogQWxsb3cgcm91Z2hseSAwLjQlIHRvbGVyYW5jZSAqLworCQkJaWYgKGRpZmZfZXh0ID4gKHJhdGUvMjU2KSkKKwkJCQlyYXRlPXJhdGVfZXh0OworCQl9IGVsc2UgeworCQkJLypwcmludGsoIlZJREM6IGludGVybmFsICVkICVkICVkXG4iLCByYXRlLCByYXRlX2ludCwgaHdyYXRlKTsqLworCQkJaHdjdHJsPTB4MDAwMDAwMDM7CisJCQkvKiBBbGxvdyByb3VnbHkgMC40JSB0b2xlcmFuY2UgKi8KKwkJCWlmIChkaWZmX2ludCA+IChyYXRlLzI1NikpCisJCQkJcmF0ZT1yYXRlX2ludDsKKwkJfQorCisJCXZpZGNfd3JpdGVsKDB4YjAwMDAwMDAgfCAoaHdyYXRlIC0gMikpOworCQl2aWRjX3dyaXRlbCgweGIxMDAwMDAwIHwgaHdjdHJsKTsKKworCQluZXdzaXplID0gKDEwMDAwIC8gaHdyYXRlKSAmIH4zOworCQlpZiAobmV3c2l6ZSA8IDIwOCkKKwkJCW5ld3NpemUgPSAyMDg7CisJCWlmIChuZXdzaXplID4gNDA5NikKKwkJCW5ld3NpemUgPSA0MDk2OworCQlmb3IgKG5ldzJzaXplID0gMTI4OyBuZXcyc2l6ZSA8IG5ld3NpemU7IG5ldzJzaXplIDw8PSAxKTsKKwkJaWYgKG5ldzJzaXplIC0gbmV3c2l6ZSA+IG5ld3NpemUgLSAobmV3MnNpemUgPj4gMSkpCisJCQluZXcyc2l6ZSA+Pj0gMTsKKwkJaWYgKG5ldzJzaXplID4gNDA5NikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWSURDOiBlcnJvcjogZG1hIGJ1ZmZlciAoJWQpICVkID4gNEtcbiIsCisJCQkJbmV3c2l6ZSwgbmV3MnNpemUpOworCQkJbmV3MnNpemUgPSA0MDk2OworCQl9CisJCS8qcHJpbnRrKCJWSURDOiBkbWEgc2l6ZSAlZFxuIiwgbmV3MnNpemUpOyovCisJCWRtYV9idWZzaXplID0gbmV3MnNpemU7CisJCXZpZGNfYXVkaW9fcmF0ZSA9IHJhdGU7CisJfQorCXJldHVybiB2aWRjX2F1ZGlvX3JhdGU7Cit9CisKK3N0YXRpYyBzaG9ydCB2aWRjX2F1ZGlvX3NldF9jaGFubmVscyhpbnQgZGV2LCBzaG9ydCBjaGFubmVscykKK3sKKwlzd2l0Y2ggKGNoYW5uZWxzKSB7CisJZGVmYXVsdDoKKwkJY2hhbm5lbHMgPSAyOworCWNhc2UgMToKKwljYXNlIDI6CisJCXZpZGNfYXVkaW9fY2hhbm5lbHMgPSBjaGFubmVsczsKKwkJdmlkY191cGRhdGVfZmlsbGVyKHZpZGNfYXVkaW9fZm9ybWF0LCB2aWRjX2F1ZGlvX2NoYW5uZWxzKTsKKwljYXNlIDA6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmlkY19hdWRpb19jaGFubmVsczsKK30KKworLyoKKyAqIE9wZW4gdGhlIGRldmljZQorICovCitzdGF0aWMgaW50IHZpZGNfYXVkaW9fb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwkvKiBUaGlzIGF1ZGlvIGRldmljZSBkb2VzIG5vdCBoYXZlIHJlY29yZGluZyBjYXBhYmlsaXR5ICovCisJaWYgKG1vZGUgPT0gT1BFTl9SRUFEKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHZpZGNfYnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXZpZGNfYnVzeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbG9zZSB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHZpZGNfYXVkaW9fY2xvc2UoaW50IGRldikKK3sKKwl2aWRjX2J1c3kgPSAwOworfQorCisvKgorICogT3V0cHV0IGEgYmxvY2sgdmlhIERNQSB0byBzb3VuZCBkZXZpY2UuCisgKgorICogV2UganVzdCBzZXQgdGhlIERNQSBzdGFydCBhbmQgY291bnQ7IHRoZSBETUEgaW50ZXJydXB0IHJvdXRpbmUKKyAqIHdpbGwgdGFrZSBjYXJlIG9mIGZvcm1hdHRpbmcgdGhlIHNhbXBsZXMgKHZpYSB0aGUgYXBwcm9wcmlhdGUKKyAqIHZpZGNfZmlsbGVyIHJvdXRpbmUpLCBhbmQgZmxhZyB2aWEgdmlkY19hdWRpb19kbWFfaW50ZXJydXB0IHdoZW4KKyAqIG1vcmUgZGF0YSBpcyByZXF1aXJlZC4KKyAqLworc3RhdGljIHZvaWQKK3ZpZGNfYXVkaW9fb3V0cHV0X2Jsb2NrKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgdG90YWxfY291bnQsIGludCBvbmUpCit7CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZG1hX3N0YXJ0ID0gYnVmIC0gKHVuc2lnbmVkIGxvbmcpZG1hcC0+cmF3X2J1Zl9waHlzICsgKHVuc2lnbmVkIGxvbmcpZG1hcC0+cmF3X2J1ZjsKKwlkbWFfY291bnQgPSB0b3RhbF9jb3VudDsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCit2aWRjX2F1ZGlvX3N0YXJ0X2lucHV0KGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgY291bnQsIGludCBpbnRyZmxhZykKK3sKK30KKworc3RhdGljIGludCB2aWRjX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZpZGNfYXVkaW9fZG1hX2ludGVycnVwdCh2b2lkKQoreworCURNQWJ1Zl9vdXRwdXRpbnRyKHZpZGNfYWRldiwgMSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogUHJlcGFyZSBmb3Igb3V0cHV0dGluZyBzYW1wbGVzLgorICoKKyAqIEVhY2ggYnVmZmVyIHRoYXQgd2lsbCBiZSBwYXNzZWQgd2lsbCBiZSBgYnNpemUnIGJ5dGVzIGxvbmcsCisgKiB3aXRoIGEgdG90YWwgb2YgYGJjb3VudCcgYnVmZmVycy4KKyAqLworc3RhdGljIGludCB2aWRjX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisKKwlkbWFfaW50ZXJydXB0ID0gTlVMTDsKKwlhZGV2LT5kbWFwX291dC0+ZmxhZ3MgfD0gRE1BX05PRE1BOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdG9wIG91ciBjdXJyZW50IG9wZXJhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgdmlkY19hdWRpb19yZXNldChpbnQgZGV2KQoreworCWRtYV9pbnRlcnJ1cHQgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHZpZGNfYXVkaW9fbG9jYWxfcWxlbihpbnQgZGV2KQoreworCXJldHVybiAvKmRtYV9jb3VudCAhPSovIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZpZGNfYXVkaW9fdHJpZ2dlcihpbnQgZGV2LCBpbnQgZW5hYmxlX2JpdHMpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisKKwlpZiAoZW5hYmxlX2JpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkgeworCQlpZiAoIShhZGV2LT5mbGFncyAmIERNQV9BQ1RJVkUpKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkJCS8qIHByZXZlbnQgcmVjdXNpb24gKi8KKwkJCWFkZXYtPmZsYWdzIHw9IERNQV9BQ1RJVkU7CisKKwkJCWRtYV9pbnRlcnJ1cHQgPSB2aWRjX2F1ZGlvX2RtYV9pbnRlcnJ1cHQ7CisJCQl2aWRjX3NvdW5kX2RtYV9pcnEoMCwgTlVMTCwgTlVMTCk7CisJCQlpb21kX3dyaXRlYihETUFfQ1JfRSB8IDB4MTAsIElPTURfU0QwQ1IpOworCisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIHZpZGNfYXVkaW9fZHJpdmVyID0KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSB2aWRjX2F1ZGlvX29wZW4sCisJLmNsb3NlCQkJPSB2aWRjX2F1ZGlvX2Nsb3NlLAorCS5vdXRwdXRfYmxvY2sJCT0gdmlkY19hdWRpb19vdXRwdXRfYmxvY2ssCisJLnN0YXJ0X2lucHV0CQk9IHZpZGNfYXVkaW9fc3RhcnRfaW5wdXQsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gdmlkY19hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dCwKKwkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gdmlkY19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQsCisJLmhhbHRfaW8JCT0gdmlkY19hdWRpb19yZXNldCwKKwkubG9jYWxfcWxlbgkJPSB2aWRjX2F1ZGlvX2xvY2FsX3FsZW4sCisJLnRyaWdnZXIJCT0gdmlkY19hdWRpb190cmlnZ2VyLAorCS5zZXRfc3BlZWQJCT0gdmlkY19hdWRpb19zZXRfc3BlZWQsCisJLnNldF9iaXRzCQk9IHZpZGNfYXVkaW9fc2V0X2Zvcm1hdCwKKwkuc2V0X2NoYW5uZWxzCQk9IHZpZGNfYXVkaW9fc2V0X2NoYW5uZWxzCit9OworCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgdmlkY19taXhlcl9vcGVyYXRpb25zID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaWQJCT0gIlZJREMiLAorCS5uYW1lCQk9ICJWSURDc291bmQiLAorCS5pb2N0bAkJPSB2aWRjX21peGVyX2lvY3RsCit9OworCit2b2lkIHZpZGNfdXBkYXRlX2ZpbGxlcihpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbHMpCit7CisjZGVmaW5lIFRZUEUoZm10LGNoKSAoKChmbXQpPDwyKSB8ICgoY2gpJjMpKQorCisJc3dpdGNoIChUWVBFKGZvcm1hdCwgY2hhbm5lbHMpKSB7CisJZGVmYXVsdDoKKwljYXNlIFRZUEUoQUZNVF9VOCwgMSk6CisJCXZpZGNfZmlsbGVyID0gdmlkY19maWxsXzF4OF91OworCQlicmVhazsKKworCWNhc2UgVFlQRShBRk1UX1U4LCAyKToKKwkJdmlkY19maWxsZXIgPSB2aWRjX2ZpbGxfMng4X3U7CisJCWJyZWFrOworCisJY2FzZSBUWVBFKEFGTVRfUzgsIDEpOgorCQl2aWRjX2ZpbGxlciA9IHZpZGNfZmlsbF8xeDhfczsKKwkJYnJlYWs7CisKKwljYXNlIFRZUEUoQUZNVF9TOCwgMik6CisJCXZpZGNfZmlsbGVyID0gdmlkY19maWxsXzJ4OF9zOworCQlicmVhazsKKworCWNhc2UgVFlQRShBRk1UX1MxNl9MRSwgMSk6CisJCXZpZGNfZmlsbGVyID0gdmlkY19maWxsXzF4MTZfczsKKwkJYnJlYWs7CisKKwljYXNlIFRZUEUoQUZNVF9TMTZfTEUsIDIpOgorCQl2aWRjX2ZpbGxlciA9IHZpZGNfZmlsbF8yeDE2X3M7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF92aWRjKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwljaGFyIG5hbWVbMzJdOworCWludCBpLCBhZGV2OworCisJc3ByaW50ZihuYW1lLCAiVklEQyAlZC1iaXQgc291bmQiLCBod19jb25maWctPmNhcmRfc3VidHlwZSk7CisJY29uZl9wcmludGYobmFtZSwgaHdfY29uZmlnKTsKKwltZW1zZXQoZG1hX2J1ZiwgMCwgc2l6ZW9mKGRtYV9idWYpKTsKKworCWFkZXYgPSBzb3VuZF9pbnN0YWxsX2F1ZGlvZHJ2KEFVRElPX0RSSVZFUl9WRVJTSU9OLCBuYW1lLAorCQkJJnZpZGNfYXVkaW9fZHJpdmVyLCBzaXplb2YodmlkY19hdWRpb19kcml2ZXIpLAorCQkJRE1BX0FVVE9NT0RFLCBBRk1UX1U4IHwgQUZNVF9TOCB8IEFGTVRfUzE2X0xFLAorCQkJTlVMTCwgaHdfY29uZmlnLT5kbWEsIGh3X2NvbmZpZy0+ZG1hMik7CisKKwlpZiAoYWRldiA8IDApCisJCWdvdG8gYXVkaW9fZmFpbGVkOworCisJLyoKKwkgKiAxMDI0IGJ5dGVzID0+IDY0IGJ1ZmZlcnMKKwkgKi8KKwlhdWRpb19kZXZzW2FkZXZdLT5taW5fZnJhZ21lbnQgPSAxMDsKKwlhdWRpb19kZXZzW2FkZXZdLT5taXhlcl9kZXYgPSBudW1fbWl4ZXJzOworCisJYXVkaW9fZGV2c1thZGV2XS0+bWl4ZXJfZGV2ID0KKwkJc291bmRfaW5zdGFsbF9taXhlcihNSVhFUl9EUklWRVJfVkVSU0lPTiwKKwkJCQluYW1lLCAmdmlkY19taXhlcl9vcGVyYXRpb25zLAorCQkJCXNpemVvZih2aWRjX21peGVyX29wZXJhdGlvbnMpLCBOVUxMKTsKKworCWlmIChhdWRpb19kZXZzW2FkZXZdLT5taXhlcl9kZXYgPCAwKQorCQlnb3RvIG1peGVyX2ZhaWxlZDsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZG1hX2J1ZltpXSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFkbWFfYnVmW2ldKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBhbGxvY2F0ZSByZXF1aXJlZCBidWZmZXJzXG4iLAorCQkJCW5hbWUpOworCQkJZ290byBtZW1fZmFpbGVkOworCQl9CisJCWRtYV9wYnVmW2ldID0gdmlydF90b19waHlzKCh2b2lkICopZG1hX2J1ZltpXSk7CisJfQorCisJaWYgKHNvdW5kX2FsbG9jX2RtYShod19jb25maWctPmRtYSwgaHdfY29uZmlnLT5uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBETUEgJWQgaXMgaW4gIHVzZVxuIiwgbmFtZSwgaHdfY29uZmlnLT5kbWEpOworCQlnb3RvIGRtYV9mYWlsZWQ7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGh3X2NvbmZpZy0+aXJxLCB2aWRjX3NvdW5kX2RtYV9pcnEsIDAsCisJCQlod19jb25maWctPm5hbWUsICZkbWFfc3RhcnQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IElSUSAlZCBpcyBpbiB1c2VcbiIsIG5hbWUsIGh3X2NvbmZpZy0+aXJxKTsKKwkJZ290byBpcnFfZmFpbGVkOworCX0KKwl2aWRjX2FkZXYgPSBhZGV2OworCXZpZGNfbWl4ZXJfc2V0KFNPVU5EX01JWEVSX1ZPTFVNRSwgKDg1IHwgODUgPDwgOCkpOworCisjaWYgZGVmaW5lZChDT05GSUdfU09VTkRfU09GVE9TUykgfHwgZGVmaW5lZChDT05GSUdfU09VTkRfU09GVE9TU19NT0RVTEUpCisJc29mdG9zc19kZXYgPSBhZGV2OworI2VuZGlmCisJcmV0dXJuOworCitpcnFfZmFpbGVkOgorCXNvdW5kX2ZyZWVfZG1hKGh3X2NvbmZpZy0+ZG1hKTsKK2RtYV9mYWlsZWQ6CittZW1fZmFpbGVkOgorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWZyZWVfcGFnZShkbWFfYnVmW2ldKTsKKwlzb3VuZF91bmxvYWRfbWl4ZXJkZXYoYXVkaW9fZGV2c1thZGV2XS0+bWl4ZXJfZGV2KTsKK21peGVyX2ZhaWxlZDoKKwlzb3VuZF91bmxvYWRfYXVkaW9kZXYoYWRldik7CithdWRpb19mYWlsZWQ6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV92aWRjKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlod19jb25maWctPmlycQkJPSBJUlFfRE1BUzA7CisJaHdfY29uZmlnLT5kbWEJCT0gRE1BX1ZJUlRVQUxfU09VTkQ7CisJaHdfY29uZmlnLT5kbWEyCQk9IC0xOworCWh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlCT0gMTY7CisJaHdfY29uZmlnLT5uYW1lCQk9ICJWSURDMjAiOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX3ZpZGMoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWludCBpLCBhZGV2ID0gdmlkY19hZGV2OworCisJdmlkY19hZGV2ID0gLTE7CisKKwlmcmVlX2lycShod19jb25maWctPmlycSwgJmRtYV9zdGFydCk7CisJc291bmRfZnJlZV9kbWEoaHdfY29uZmlnLT5kbWEpOworCisJaWYgKGFkZXYgPj0gMCkgeworCQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYoYXVkaW9fZGV2c1thZGV2XS0+bWl4ZXJfZGV2KTsKKwkJc291bmRfdW5sb2FkX2F1ZGlvZGV2KGFkZXYpOworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJZnJlZV9wYWdlKGRtYV9idWZbaV0pOworCX0KK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3ZpZGModm9pZCkKK3sKKwlpZiAocHJvYmVfdmlkYygmY2ZnKSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWF0dGFjaF92aWRjKCZjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3ZpZGModm9pZCkKK3sKKwl1bmxvYWRfdmlkYygmY2ZnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF92aWRjKTsKK21vZHVsZV9leGl0KGNsZWFudXBfdmlkYyk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWSURDMjAgYXVkaW8gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdmlkYy5oIGIvc291bmQvb3NzL3ZpZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWI3MDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3ZpZGMuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvc291bmQvdmlkYy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFZJREMgc291bmQgZnVuY3Rpb24gcHJvdG90eXBlcworICovCisKKy8qIHZpZGMuYyAqLworCitleHRlcm4gaW50IHZpZGNfYnVzeTsKKworLyogdmlkY19maWxsLlMgKi8KKworLyoKKyAqIEZpbGxlciByb3V0aW5lcyBmb3IgZGlmZmVyZW50IGNoYW5uZWxzIGFuZCBzYW1wbGUgc2l6ZXMKKyAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyB2aWRjX2ZpbGxfMXg4X3UodW5zaWduZWQgbG9uZyBpYnVmLCB1bnNpZ25lZCBsb25nIGllbmQsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG9idWYsIGludCBtYXNrKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZpZGNfZmlsbF8yeDhfdSh1bnNpZ25lZCBsb25nIGlidWYsIHVuc2lnbmVkIGxvbmcgaWVuZCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2J1ZiwgaW50IG1hc2spOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdmlkY19maWxsXzF4OF9zKHVuc2lnbmVkIGxvbmcgaWJ1ZiwgdW5zaWduZWQgbG9uZyBpZW5kLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvYnVmLCBpbnQgbWFzayk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB2aWRjX2ZpbGxfMng4X3ModW5zaWduZWQgbG9uZyBpYnVmLCB1bnNpZ25lZCBsb25nIGllbmQsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG9idWYsIGludCBtYXNrKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZpZGNfZmlsbF8xeDE2X3ModW5zaWduZWQgbG9uZyBpYnVmLCB1bnNpZ25lZCBsb25nIGllbmQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvYnVmLCBpbnQgbWFzayk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB2aWRjX2ZpbGxfMngxNl9zKHVuc2lnbmVkIGxvbmcgaWJ1ZiwgdW5zaWduZWQgbG9uZyBpZW5kLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2J1ZiwgaW50IG1hc2spOworCisvKgorICogRE1BIEludGVycnVwdCBoYW5kbGVyCisgKi8KKworZXh0ZXJuIGlycXJldHVybl90IHZpZGNfc291bmRfZG1hX2lycShpbnQgaXJxbnIsIHZvaWQgKnJlZiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKgorICogRmlsbGVyIHJvdXRpbmUgcG9pbnRlcgorICovCisKK2V4dGVybiB1bnNpZ25lZCBsb25nICgqdmlkY19maWxsZXIpICh1bnNpZ25lZCBsb25nIGlidWYsIHVuc2lnbmVkIGxvbmcgaWVuZCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2J1ZiwgaW50IG1hc2spOworCisvKgorICogVmlydHVhbCBETUEgYnVmZmVyIGV4aGF1c3RlZAorICovCisKK2V4dGVybiBpcnFyZXR1cm5fdCAoKmRtYV9pbnRlcnJ1cHQpICh2b2lkKTsKKworLyoKKyAqIFZpcnR1YWwgRE1BIGJ1ZmZlciBhZGRyZXNzZXMKKyAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyBkbWFfc3RhcnQsIGRtYV9jb3VudCwgZG1hX2J1ZnNpemU7CitleHRlcm4gdW5zaWduZWQgbG9uZyBkbWFfYnVmWzJdLCBkbWFfcGJ1ZlsyXTsKKworLyogdmlkY19zeW50aC5jICovCisKK2V4dGVybiB2b2lkICAgICB2aWRjX3N5bnRoX2luaXQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKTsKK2V4dGVybiB2b2lkCXZpZGNfc3ludGhfZXhpdChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOworZXh0ZXJuIGludCAgICAgIHZpZGNfc3ludGhfZ2V0X3ZvbHVtZSh2b2lkKTsKK2V4dGVybiBpbnQgICAgICB2aWRjX3N5bnRoX3NldF92b2x1bWUoaW50IHZvbCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdmlkY19maWxsLlMgYi9zb3VuZC9vc3MvdmlkY19maWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjY2MwNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy92aWRjX2ZpbGwuUwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL3NvdW5kL3ZpZGNfZmlsbC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBGaWxsZXIgcm91dGluZXMgZm9yIERNQSBidWZmZXJzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb21kLmg+CisKKwkJLnRleHQKKworRU5UUlkodmlkY19maWxsXzF4OF91KQorCQltb3YJaXAsICMweGZmMDAKKzE6CQljbXAJcjAsIHIxCisJCWJnZQl2aWRjX2NsZWFyCisJCWxkcmIJcjQsIFtyMF0sICMxCisJCWVvcglyNCwgcjQsICMweDgwCisJCWFuZAlyNCwgaXAsIHI0LCBsc2wgIzgKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJc3RyCXI0LCBbcjJdLCAjNAorCQljbXAJcjIsIHIzCisJCWJsdAkxYgorCQltb3YJcGMsIGxyCisKK0VOVFJZKHZpZGNfZmlsbF8yeDhfdSkKKwkJbW92CWlwLCAjMHhmZjAwCisxOgkJY21wCXIwLCByMQorCQliZ2UJdmlkY19jbGVhcgorCQlsZHIJcjQsIFtyMF0sICMyCisJCWFuZAlyNSwgcjQsIGlwCisJCWFuZAlyNCwgaXAsIHI0LCBsc2wgIzgKKwkJb3JyCXI0LCByNCwgcjUsIGxzbCAjMTYKKwkJb3JyCXI0LCByNCwgcjQsIGxzciAjOAorCQlzdHIJcjQsIFtyMl0sICM0CisJCWNtcAlyMiwgcjMKKwkJYmx0CTFiCisJCW1vdglwYywgbHIKKworRU5UUlkodmlkY19maWxsXzF4OF9zKQorCQltb3YJaXAsICMweGZmMDAKKzE6CQljbXAJcjAsIHIxCisJCWJnZQl2aWRjX2NsZWFyCisJCWxkcmIJcjQsIFtyMF0sICMxCisJCWFuZAlyNCwgaXAsIHI0LCBsc2wgIzgKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJc3RyCXI0LCBbcjJdLCAjNAorCQljbXAJcjIsIHIzCisJCWJsdAkxYgorCQltb3YJcGMsIGxyCisKK0VOVFJZKHZpZGNfZmlsbF8yeDhfcykKKwkJbW92CWlwLCAjMHhmZjAwCisxOgkJY21wCXIwLCByMQorCQliZ2UJdmlkY19jbGVhcgorCQlsZHIJcjQsIFtyMF0sICMyCisJCWFuZAlyNSwgcjQsIGlwCisJCWFuZAlyNCwgaXAsIHI0LCBsc2wgIzgKKwkJb3JyCXI0LCByNCwgcjUsIGxzbCAjMTYKKwkJb3JyCXI0LCByNCwgcjQsIGxzciAjOAorCQlzdHIJcjQsIFtyMl0sICM0CisJCWNtcAlyMiwgcjMKKwkJYmx0CTFiCisJCW1vdglwYywgbHIKKworRU5UUlkodmlkY19maWxsXzF4MTZfcykKKwkJbW92CWlwLCAjMHhmZjAwCisJCW9ycglpcCwgaXAsIGlwLCBsc3IgIzgKKzE6CQljbXAJcjAsIHIxCisJCWJnZQl2aWRjX2NsZWFyCisJCWxkcglyNSwgW3IwXSwgIzIKKwkJYW5kCXI0LCByNSwgaXAKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJc3RyCXI0LCBbcjJdLCAjNAorCQljbXAJcjAsIHIxCisJCWFkZGx0CXIwLCByMCwgIzIKKwkJYW5kbHQJcjQsIHI1LCBpcCwgbHNsICMxNgorCQlvcnJsdAlyNCwgcjQsIHI0LCBsc3IgIzE2CisJCXN0cmx0CXI0LCBbcjJdLCAjNAorCQljbXAJcjIsIHIzCisJCWJsdAkxYgorCQltb3YJcGMsIGxyCisKK0VOVFJZKHZpZGNfZmlsbF8yeDE2X3MpCisJCW1vdglpcCwgIzB4ZmYwMAorCQlvcnIJaXAsIGlwLCBpcCwgbHNyICM4CisxOgkJY21wCXIwLCByMQorCQliZ2UJdmlkY19jbGVhcgorCQlsZHIJcjQsIFtyMF0sICM0CisJCXN0cglyNCwgW3IyXSwgIzQKKwkJY21wCXIwLCByMQorCQlsZHJsdAlyNCwgW3IwXSwgIzQKKwkJc3RybHQJcjQsIFtyMl0sICM0CisJCWNtcAlyMiwgcjMKKwkJYmx0CTFiCisJCW1vdglwYywgbHIKKworRU5UUlkodmlkY19maWxsX25vYXVkaW8pCisJCW1vdglyMCwgIzAKKwkJbW92CXIxLCAjMAorMjoJCW1vdglyNCwgIzAKKwkJbW92CXI1LCAjMAorMToJCWNtcAlyMiwgcjMKKwkJc3RtbHRpYQlyMiEsIHtyMCwgcjEsIHI0LCByNX0KKwkJYmx0CTFiCisJCW1vdglwYywgbHIKKworRU5UUlkodmlkY19jbGVhcikKKwkJbW92CXIwLCAjMAorCQltb3YJcjEsICMwCisJCXRzdAlyMiwgIzQKKwkJc3RyCXIwLCBbcjJdLCAjNAorCQl0c3QJcjIsICM4CisJCXN0bWlhCXIyISwge3IwLCByMX0KKwkJYgkyYgorCisvKgorICogQ2FsbCBmaWxsZXIgcm91dGluZXMgd2l0aDoKKyAqICByMCA9IHBoeXMgYWRkcmVzcworICogIHIxID0gcGh5cyBlbmQKKyAqICByMiA9IGJ1ZmZlcgorICogUmV0dXJuczoKKyAqICByMCA9IG5ldyBidWZmZXIgYWRkcmVzcworICogIHIyID0gbmV3IGJ1ZmZlciBmaW5pc2gKKyAqICByNCA9IGNvcnJ1cHRlZAorICogIHI1ID0gY29ycnVwdGVkCisgKiAgaXAgPSBjb3JydXB0ZWQKKyAqLworCitFTlRSWSh2aWRjX3NvdW5kX2RtYV9pcnEpCisJCXN0bWZkCXNwISwge3I0IC0gcjgsIGxyfQorCQlsZHIJcjgsID1kbWFfc3RhcnQKKwkJbGRtaWEJcjgsIHtyMCwgcjEsIHIyLCByMywgcjQsIHI1fQorCQl0ZXEJcjEsICMwCisJCWFkcmVxCXI0LCB2aWRjX2ZpbGxfbm9hdWRpbworCQltb3ZlcQlyNywgIzEgPDwgMzEKKwkJbW92bmUJcjcsICMwCisJCW1vdglpcCwgI0lPTURfQkFTRSAmIDB4ZmYwMDAwMDAKKwkJb3JyCWlwLCBpcCwgI0lPTURfQkFTRSAmIDB4MDBmZjAwMDAKKwkJbGRyYglyNiwgW2lwLCAjSU9NRF9TRDBTVF0KKwkJdHN0CXI2LCAjRE1BX1NUX09GTAkJCUAgQ2hlY2sgZm9yIG92ZXJydW4KKwkJZW9ybmUJcjYsIHI2LCAjRE1BX1NUX0FCCisJCXRzdAlyNiwgI0RNQV9TVF9BQgorCQltb3ZlcQlyMiwgcjMJCQkJQCBETUFpbmcgQSwgdXBkYXRlIEIKKwkJYWRkCXIzLCByMiwgcjUJCQlAIEVuZCBvZiBETUEgYnVmZmVyCisJCWFkZAlyMSwgcjEsIHIwCQkJQCBFbmQgb2YgdmlydHVhbCBETUEgYnVmZmVyCisJCW1vdglsciwgcGMKKwkJbW92CXBjLCByNAkJCQlAIENhbGwgZmlsbCByb3V0aW5lICh1c2VzIHI0LCBpcCkKKwkJc3ViCXIxLCByMSwgcjAJCQlAIFJlbWFpbmluZyBsZW5ndGgKKwkJc3RtaWEJcjgsIHtyMCwgcjF9CisJCW1vdglyMCwgIzAKKwkJdHN0CXIyLCAjNAkJCQlAIFJvdW5kIGJ1ZmZlciB1cCB0byA0IHdvcmRzCisJCXN0cm5lCXIwLCBbcjJdLCAjNAorCQl0c3QJcjIsICM4CisJCXN0cm5lCXIwLCBbcjJdLCAjNAorCQlzdHJuZQlyMCwgW3IyXSwgIzQKKwkJc3ViCXIyLCByMiwgIzE2CisJCW1vdglyMiwgcjIsIGxzbCAjMjAKKwkJbW92cwlyMiwgcjIsIGxzciAjMjAKKwkJb3JyZXEJcjIsIHIyLCAjMSA8PCAzMAkJQCBTZXQgTCBiaXQKKwkJb3JyCXIyLCByMiwgcjcKKwkJbGRtZGIJcjgsIHtyMywgcjQsIHI1fQorCQl0c3QJcjYsICNETUFfU1RfQUIKKwkJbW92CWlwLCAjSU9NRF9CQVNFICYgMHhmZjAwMDAwMAorCQlvcnIJaXAsIGlwLCAjSU9NRF9CQVNFICYgMHgwMGZmMDAwMAorCQlzdHJlcQlyNCwgW2lwLCAjSU9NRF9TRDBDVVJCXQorCQlzdHJuZQlyNSwgW2lwLCAjSU9NRF9TRDBDVVJBXQorCQlzdHJlcQlyMiwgW2lwLCAjSU9NRF9TRDBFTkRCXQorCQlzdHJuZQlyMiwgW2lwLCAjSU9NRF9TRDBFTkRBXQorCQlsZHIJbHIsIFtpcCwgI0lPTURfU0QwU1RdCisJCXRzdAlsciwgI0RNQV9TVF9PRkwKKwkJYm5lCTFmCisJCXRzdAlyNiwgI0RNQV9TVF9BQgorCQlzdHJuZQlyNCwgW2lwLCAjSU9NRF9TRDBDVVJCXQorCQlzdHJlcQlyNSwgW2lwLCAjSU9NRF9TRDBDVVJBXQorCQlzdHJuZQlyMiwgW2lwLCAjSU9NRF9TRDBFTkRCXQorCQlzdHJlcQlyMiwgW2lwLCAjSU9NRF9TRDBFTkRBXQorMToJCXRlcQlyNywgIzAKKwkJbW92CXIwLCAjMHgxMAorCQlzdHJuZWIJcjAsIFtpcCwgI0lPTURfU0QwQ1JdCisJCWxkbWZkCXNwISwge3I0IC0gcjgsIGxyfQorCQltb3YJcjAsICMxCQkJCUAgSVJRX0hBTkRMRUQKKwkJdGVxCXIxLCAjMAkJCQlAIElmIHdlIGhhdmUgbm8gbW9yZQorCQltb3ZuZQlwYywgbHIKKwkJdGVxCXIzLCAjMAorCQltb3ZuZQlwYywgcjMJCQkJQCBDYWxsIGludGVycnVwdCByb3V0aW5lCisJCW1vdglwYywgbHIKKworCQkuZGF0YQorCQkuZ2xvYmwJZG1hX2ludGVycnVwdAorZG1hX2ludGVycnVwdDoKKwkJLmxvbmcJMAkJCQlAIHIzCisJCS5nbG9ibAlkbWFfcGJ1ZgorZG1hX3BidWY6CisJCS5sb25nCTAJCQkJQCByNAorCQkubG9uZwkwCQkJCUAgcjUKKwkJLmdsb2JsCWRtYV9zdGFydAorZG1hX3N0YXJ0OgorCQkubG9uZwkwCQkJCUAgcjAKKwkJLmdsb2JsCWRtYV9jb3VudAorZG1hX2NvdW50OgorCQkubG9uZwkwCQkJCUAgcjEKKwkJLmdsb2JsCWRtYV9idWYKK2RtYV9idWY6CisJCS5sb25nCTAJCQkJQCByMgorCQkubG9uZwkwCQkJCUAgcjMKKwkJLmdsb2JsCXZpZGNfZmlsbGVyCit2aWRjX2ZpbGxlcjoKKwkJLmxvbmcJdmlkY19maWxsX25vYXVkaW8JCUAgcjQKKwkJLmdsb2JsCWRtYV9idWZzaXplCitkbWFfYnVmc2l6ZToKKwkJLmxvbmcJMHgxMDAwCQkJCUAgcjUKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92d3NuZC5jIGIvc291bmQvb3NzL3Z3c25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1NDIzMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy92d3NuZC5jCkBAIC0wLDAgKzEsMzQ4NiBAQAorLyoKKyAqIFNvdW5kIGRyaXZlciBmb3IgU2lsaWNvbiBHcmFwaGljcyAzMjAgYW5kIDU0MCBWaXN1YWwgV29ya3N0YXRpb25zJworICogb25ib2FyZCBhdWRpby4gIFNlZSBub3RlcyBpbiBEb2N1bWVudGF0aW9uL3NvdW5kL29zcy92d3NuZCAuCisgKgorICogQ29weXJpZ2h0IDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjdW5kZWYgVldTTkRfREVCVUcJCQkvKiBkZWZpbmUgZm9yIGRlYnVnZ2luZyAqLworCisvKgorICogWFhYIHRvIGRvIC0KKyAqCisgKglFeHRlcm5hbCBzeW5jLgorICoJUmVuYW1lIHN3YnVmLCBod2J1ZiwgdSZpLCBod3B0ciZzd3B0ciB0byBzb21ldGhpbmcgcmF0aW9uYWwuCisgKglCdWcgLSBpZiBzZWxlY3QoKSBjYWxsZWQgYmVmb3JlIHJlYWQoKSwgcGNtX3NldHVwKCkgbm90IGNhbGxlZC4KKyAqCUJ1ZyAtIG91dHB1dCBkb2Vzbid0IHN0b3Agc29vbiBlbm91Z2ggaWYgcHJvY2VzcyBraWxsZWQuCisgKi8KKworLyoKKyAqIFRoaW5ncyB0byB0ZXN0IC0KKyAqCisgKglXaWxsIHJlYWR2L3dyaXRldiB3b3JrPyAgV3JpdGUgYSB0ZXN0LgorICoKKyAqCWluc21vZC9ybW1vZCAxMDAgbWlsbGlvbiB0aW1lcy4KKyAqCisgKglSdW4gSS9PIHVudGlsIGludCBwdHJzIHdyYXAgYXJvdW5kIChyb3VnaGx5IDYuMiBob3VycyBAIERBVAorICoJcmF0ZSkuCisgKgorICoJQ29uY3VycmVudCB0aHJlYWRzIGJhbmdpbmcgb24gbWl4ZXIgc2ltdWx0YW5lb3VzbHksIGJvdGggVVAKKyAqCWFuZCBTTVAga2VybmVscy4gIEVzcGVjaWFsbHksIHdhdGNoIGZvciB0aHJlYWQgQSBjaGFuZ2luZworICoJT1VUU1JDIHdoaWxlIHRocmVhZCBCIGNoYW5nZXMgZ2FpbiAtLSBib3RoIHdyaXRlIHRvIHRoZSBzYW1lCisgKglhZDE4NDMgcmVnaXN0ZXIuCisgKgorICoJV2hhdCBoYXBwZW5zIGlmIGEgY2xpZW50IG9wZW5zIC9kZXYvYXVkaW8gdGhlbiBmb3Jrcz8KKyAqCURvIHR3byBwcm9jcyBoYXZlIC9kZXYvYXVkaW8gb3Blbj8gIFRlc3QuCisgKgorICoJUHVtcCBhdWRpbyB0aHJvdWdoIHRoZSBDRCwgTUlDIGFuZCBsaW5lIGlucHV0cyBhbmQgdmVyaWZ5IHRoYXQKKyAqCXRoZXkgbWl4L211dGUgaW50byB0aGUgb3V0cHV0LgorICoKKyAqCUFwcHM6CisgKgkJYW1wCisgKgkJbXBnMTIzCisgKgkJeDExYW1wCisgKgkJbXh2CisgKgkJa21lZGlhCisgKgkJZXNvdW5kCisgKgkJbmVlZCBtb3JlIGlucHV0IGFwcHMKKyAqCisgKglSdW4gdGVzdHMgd2hpbGUgYm9tYmFyZGluZyB3aXRoIHNpZ25hbHMuICBzZXRpdGltZXIoMikgd2lsbCBkbyBpdC4uLiAgKi8KKworLyoKKyAqIFRoaXMgZHJpdmVyIGlzIG9yZ2FuaXplZCBpbiBuaW5lIHNlY3Rpb25zLgorICogVGhlIG5pbmUgc2VjdGlvbnMgYXJlOgorICoKKyAqCWRlYnVnIHN0dWZmCisgKiAJbG93IGxldmVsIGxpdGhpdW0gYWNjZXNzCisgKgloaWdoIGxldmVsIGxpdGhpdW0gYWNjZXNzCisgKglBRDE4NDMgYWNjZXNzCisgKglQQ00gSS9PCisgKglhdWRpbyBkcml2ZXIKKyAqCW1peGVyIGRyaXZlcgorICoJcHJvYmUvYXR0YWNoL3VubG9hZAorICoJaW5pdGlhbGl6YXRpb24gYW5kIGxvYWRhYmxlIGtlcm5lbCBtb2R1bGUgaW50ZXJmYWNlCisgKgorICogVGhhdCBpcyByb3VnaGx5IHRoZSBvcmRlciBvZiBpbmNyZWFzaW5nIGFic3RyYWN0aW9uLCBzbyBmb3J3YXJkCisgKiBkZXBlbmRlbmNpZXMgYXJlIG1pbmltYWwuCisgKi8KKworLyoKKyAqIExvY2tpbmcgTm90ZXMKKyAqCisgKglJTkNfVVNFX0NPVU5UIGFuZCBERUNfVVNFX0NPVU5UIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZgorICoJb3BlbiBkZXNjcmlwdG9ycyB0byB0aGlzIGRyaXZlci4gVGhleSBzdG9yZSBpdCBpbiB2d3NuZF91c2VfY291bnQuCisgKiAJVGhlIGdsb2JhbCBkZXZpY2UgbGlzdCwgdndzbmRfZGV2X2xpc3QsCWlzIGltbXV0YWJsZSB3aGVuIHRoZSBJTl9VU0UKKyAqCWlzIHRydWUuCisgKgorICoJZGV2Yy0+b3Blbl9sb2NrIGlzIGEgc2VtYXBob3JlIHRoYXQgaXMgdXNlZCB0byBlbmZvcmNlIHRoZQorICoJc2luZ2xlIHJlYWRlci9zaW5nbGUgd3JpdGVyIHJ1bGUgZm9yIC9kZXYvYXVkaW8uICBUaGUgcnVsZSBpcworICoJdGhhdCBlYWNoIGRldmljZSBtYXkgaGF2ZSBhdCBtb3N0IG9uZSByZWFkZXIgYW5kIG9uZSB3cml0ZXIuCisgKglPcGVuIHdpbGwgYmxvY2sgdW50aWwgdGhlIHByZXZpb3VzIGNsaWVudCBoYXMgY2xvc2VkIHRoZQorICoJZGV2aWNlLCB1bmxlc3MgT19OT05CTE9DSyBpcyBzcGVjaWZpZWQuCisgKgorICoJVGhlIHNlbWFwaG9yZSBkZXZjLT5pb19zZW1hIHNlcmlhbGl6ZXMgUENNIEkvTyBzeXNjYWxscy4gIFRoaXMKKyAqCWlzIHVubmVjZXNzYXJ5IGluIExpbnV4IDIuMiwgYmVjYXVzZSB0aGUga2VybmVsIGxvY2sKKyAqCXNlcmlhbGl6ZXMgcmVhZCwgd3JpdGUsIGFuZCBpb2N0bCBnbG9iYWxseSwgYnV0IGl0J3MgdGhlcmUsCisgKglyZWFkeSBmb3IgdGhlIGJyYXZlLCBuZXcgcG9zdC1rZXJuZWwtbG9jayB3b3JsZC4KKyAqCisgKglMb2NraW5nIGJldHdlZW4gaW50ZXJydXB0IGFuZCBiYXNlbGV2ZWwgaXMgaGFuZGxlZCBieSB0aGUKKyAqCSJsb2NrIiBzcGlubG9jayBpbiB2d3NuZF9wb3J0IChvbmUgbG9jayBlYWNoIGZvciByZWFkIGFuZAorICoJd3JpdGUpLiAgRWFjaCBoYWxmIGhvbGRzIHRoZSBsb2NrIGp1c3QgbG9uZyBlbm91Z2ggdG8gc2VlIHdoYXQKKyAqCWFyZWEgaXQgb3ducyBhbmQgdXBkYXRlIGl0cyBwb2ludGVycy4gIFNlZSBwY21fb3V0cHV0KCkgYW5kCisgKglwY21faW5wdXQoKSBmb3IgbW9zdCBvZiB0aGUgZ29yeSBzdHVmZi4KKyAqCisgKglkZXZjLT5taXhfc2VtYSBzZXJpYWxpemVzIGFsbCBtaXhlciBpb2N0bHMuICBUaGlzIGlzIGFsc28KKyAqCXJlZHVuZGFudCBiZWNhdXNlIG9mIHRoZSBrZXJuZWwgbG9jay4KKyAqCisgKglUaGUgbG93ZXN0IGxldmVsIGxvY2sgaXMgbGl0aC0+bGl0aGl1bV9sb2NrLiAgSXQgaXMgYQorICoJc3BpbmxvY2sgd2hpY2ggaXMgaGVsZCBkdXJpbmcgdGhlIHR3by1yZWdpc3RlciB0YW5nbyBvZgorICoJcmVhZGluZy93cml0aW5nIGFuIEFEMTg0MyByZWdpc3Rlci4gIFNlZQorICoJbGlfe3JlYWQsd3JpdGV9X2FkMTg0M19yZWcoKS4KKyAqLworCisvKgorICogU2FtcGxlIEZvcm1hdCBOb3RlcworICoKKyAqCUxpdGhpdW0ncyBETUEgZW5naW5lIGhhcyB0d28gZm9ybWF0czogMTYtYml0IDIncyBjb21wbGVtZW50CisgKglhbmQgOC1iaXQgdW5zaWduZWQgLiAgMTYtYml0IHRyYW5zZmVycyB0aGUgZGF0YSB1bm1vZGlmaWVkLCAyCisgKglieXRlcyBwZXIgc2FtcGxlLiAgOC1iaXQgdW5zaWduZWQgdHJhbnNmZXJzIDEgYnl0ZSBwZXIgc2FtcGxlCisgKglhbmQgWE9ScyBlYWNoIGJ5dGUgd2l0aCAweDgwLiAgTGl0aGl1bSBjYW4gaW5wdXQgb3Igb3V0cHV0CisgKgllaXRoZXIgbW9ubyBvciBzdGVyZW8gaW4gZWl0aGVyIGZvcm1hdC4KKyAqCisgKglUaGUgQUQxODQzIGhhcyBmb3VyIGZvcm1hdHM6IDE2LWJpdCAyJ3MgY29tcGxlbWVudCwgOC1iaXQKKyAqCXVuc2lnbmVkLCA4LWJpdCBtdS1MYXcgYW5kIDgtYml0IEEtTGF3LgorICoKKyAqCVRoaXMgZHJpdmVyIHN1cHBvcnRzIGZpdmUgZm9ybWF0czogQUZNVF9TOCwgQUZNVF9VOCwKKyAqCUFGTVRfTVVfTEFXLCBBRk1UX0FfTEFXLCBhbmQgQUZNVF9TMTZfTEUuCisgKgorICoJRm9yIEFGTVRfVTggb3V0cHV0LCB3ZSBrZWVwIHRoZSBBRDE4NDMgaW4gMTYtYml0IG1vZGUsIGFuZAorICoJcmVseSBvbiBMaXRoaXVtJ3MgWE9SIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIFU4IGFuZCBTOC4KKyAqCisgKglGb3IgQUZNVF9TOCwgQUZNVF9NVV9MQVcgYW5kIEFGTVRfQV9MQVcgb3V0cHV0LCB3ZSBoYXZlIHRvIFhPUgorICoJdGhlIDB4ODAgYml0IGluIHNvZnR3YXJlIHRvIGNvbXBlbnNhdGUgZm9yIExpdGhpdW0ncyBYT1IuCisgKglUaGlzIGhhcHBlbnMgaW4gcGNtX2NvcHlfe2luLG91dH0oKS4KKyAqCisgKiBDaGFuZ2VzOgorICogMTEtMTAtMjAwMAlCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxia3pAbGludXgtaWRlLm9yZz4KKyAqCQlBZGRlZCBzb21lIF9faW5pdC9fX2V4aXQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdmlzd3MvY29iYWx0Lmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGVidWcgc3R1ZmYgKi8KKworI2lmZGVmIFZXU05EX0RFQlVHCisKK3N0YXRpYyBpbnQgc2h1dF91cCA9IDE7CisKKy8qCisgKiBkYmdhc3NlcnQgLSBjYWxsZWQgd2hlbiBhbiBhc3NlcnRpb24gZmFpbHMuCisgKi8KKworc3RhdGljIHZvaWQgZGJnYXNzZXJ0KGNvbnN0IGNoYXIgKmZjbiwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmV4cHIpCit7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlwYW5pYygiQVNTRVJUSU9OIEZBSUxFRCBJTiBJTlRFUlJVUFQsICVzOiVzOiVkICVzXG4iLAorCQkgICAgICBfX0ZJTEVfXywgZmNuLCBsaW5lLCBleHByKTsKKwllbHNlIHsKKwkJaW50IHg7CisJCXByaW50ayhLRVJOX0VSUiAiQVNTRVJUSU9OIEZBSUxFRCwgJXM6JXM6JWQgJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgZmNuLCBsaW5lLCBleHByKTsKKwkJeCA9ICogKHZvbGF0aWxlIGludCAqKSAwOyAvKiBmb3JjZSBwcm9jIHRvIGV4aXQgKi8KKwl9Cit9CisKKy8qCisgKiBCdW5jaCBvZiB1c2VmdWwgZGVidWcgbWFjcm9zOgorICoKKyAqCUFTU0VSVAktIHByaW50IHVubGVzcyBlIG5vbnplcm8gKHBhbmljIGlmIGluIGludGVycnVwdCkKKyAqCURCR0RPCS0gaW5jbHVkZSBhcmJpdHJhcnkgY29kZSBpZiBkZWJ1Z2dpbmcKKyAqCURCR1gJLSBkZWJ1ZyBwcmludCByYXcgKHcvbyBmdW5jdGlvbiBuYW1lKQorICoJREJHUAktIGRlYnVnIHByaW50IHcvIGZ1bmN0aW9uIG5hbWUKKyAqCURCR0UJLSBkZWJ1ZyBwcmludCBmdW5jdGlvbiBlbnRyeQorICoJREJHQwktIGRlYnVnIHByaW50IGZ1bmN0aW9uIGNhbGwKKyAqCURCR1IJLSBkZWJ1ZyBwcmludCBmdW5jdGlvbiByZXR1cm4KKyAqCURCR1hWCS0gZGVidWcgcHJpbnQgcmF3IHdoZW4gdmVyYm9zZQorICoJREJHUFYJLSBkZWJ1ZyBwcmludCB3aGVuIHZlcmJvc2UKKyAqCURCR0VWCS0gZGVidWcgcHJpbnQgZnVuY3Rpb24gZW50cnkgd2hlbiB2ZXJib3NlCisgKglEQkdSVgktIGRlYnVnIHByaW50IGZ1bmN0aW9uIHJldHVybiB3aGVuIHZlcmJvc2UKKyAqLworCisjZGVmaW5lIEFTU0VSVChlKSAgICAgICgoZSkgPyAodm9pZCkgMCA6IGRiZ2Fzc2VydChfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjZSkpCisjZGVmaW5lIERCR0RPKHgpICAgICAgICAgICAgeAorI2RlZmluZSBEQkdYKGZtdCwgYXJncy4uLikgIChpbl9pbnRlcnJ1cHQoKSA/IDAgOiBwcmludGsoS0VSTl9FUlIgZm10LCAjI2FyZ3MpKQorI2RlZmluZSBEQkdQKGZtdCwgYXJncy4uLikgIChEQkdYKCIlczogIiBmbXQsIF9fRlVOQ1RJT05fXyAsICMjYXJncykpCisjZGVmaW5lIERCR0UoZm10LCBhcmdzLi4uKSAgKERCR1goIiVzIiBmbXQsIF9fRlVOQ1RJT05fXyAsICMjYXJncykpCisjZGVmaW5lIERCR0MocnRuKSAgICAgICAgICAgKERCR1AoImNhbGxpbmcgJXNcbiIsIHJ0bikpCisjZGVmaW5lIERCR1IoKSAgICAgICAgICAgICAgKERCR1AoInJldHVybmluZ1xuIikpCisjZGVmaW5lIERCR1hWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHWChmbXQsICMjYXJncykpCisjZGVmaW5lIERCR1BWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHUChmbXQsICMjYXJncykpCisjZGVmaW5lIERCR0VWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHRShmbXQsICMjYXJncykpCisjZGVmaW5lIERCR0NWKHJ0bikgICAgICAgICAgKHNodXRfdXAgPyAwIDogREJHQyhydG4pKQorI2RlZmluZSBEQkdSVigpICAgICAgICAgICAgIChzaHV0X3VwID8gMCA6IERCR1IoKSkKKworI2Vsc2UgLyogIVZXU05EX0RFQlVHICovCisKKyNkZWZpbmUgQVNTRVJUKGUpICAgICAgICAgICAoKHZvaWQpIDApCisjZGVmaW5lIERCR0RPKHgpICAgICAgICAgICAgLyogZG9uJ3QgKi8KKyNkZWZpbmUgREJHWChmbXQsIGFyZ3MuLi4pICAoKHZvaWQpIDApCisjZGVmaW5lIERCR1AoZm10LCBhcmdzLi4uKSAgKCh2b2lkKSAwKQorI2RlZmluZSBEQkdFKGZtdCwgYXJncy4uLikgICgodm9pZCkgMCkKKyNkZWZpbmUgREJHQyhydG4pICAgICAgICAgICAoKHZvaWQpIDApCisjZGVmaW5lIERCR1IoKSAgICAgICAgICAgICAgKCh2b2lkKSAwKQorI2RlZmluZSBEQkdQVihmbXQsIGFyZ3MuLi4pICgodm9pZCkgMCkKKyNkZWZpbmUgREJHWFYoZm10LCBhcmdzLi4uKSAoKHZvaWQpIDApCisjZGVmaW5lIERCR0VWKGZtdCwgYXJncy4uLikgKCh2b2lkKSAwKQorI2RlZmluZSBEQkdDVihydG4pICAgICAgICAgICgodm9pZCkgMCkKKyNkZWZpbmUgREJHUlYoKSAgICAgICAgICAgICAoKHZvaWQpIDApCisKKyNlbmRpZiAvKiAhVldTTkRfREVCVUcgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbG93IGxldmVsIGxpdGhpdW0gYWNjZXNzICovCisKKy8qCisgKiBXZSBuZWVkIHRvIHRhbGsgdG8gTGl0aGl1bSByZWdpc3RlcnMgb24gdGhyZWUgcGFnZXMuICBIZXJlIGFyZQorICogdGhlIHBhZ2VzJyBvZmZzZXRzIGZyb20gdGhlIGJhc2UgYWRkcmVzcyAoMHhGRjAwMTAwMCkuCisgKi8KKworZW51bSB7CisJTElfUEFHRTBfT0ZGU0VUID0gMHgwMTAwMCAtIDB4MTAwMCwgLyogRkYwMDEwMDAgKi8KKwlMSV9QQUdFMV9PRkZTRVQgPSAweDBGMDAwIC0gMHgxMDAwLCAvKiBGRjAwRjAwMCAqLworCUxJX1BBR0UyX09GRlNFVCA9IDB4MTAwMDAgLSAweDEwMDAsIC8qIEZGMDEwMDAwICovCit9OworCisvKiBsb3ctbGV2ZWwgbGl0aGl1bSBkYXRhICovCisKK3R5cGVkZWYgc3RydWN0IGxpdGhpdW0geworCXZvaWQgKgkJcGFnZTA7CQkvKiB2aXJ0dWFsIGFkZHJlc3NlcyAqLworCXZvaWQgKgkJcGFnZTE7CisJdm9pZCAqCQlwYWdlMjsKKwlzcGlubG9ja190CWxvY2s7CQkvKiBwcm90ZWN0cyBjb2RlYyBhbmQgVVNUL01TQyBhY2Nlc3MgKi8KK30gbGl0aGl1bV90OworCisvKgorICogbGlfY3JlYXRlIGluaXRpYWxpemVzIHRoZSBsaXRoaXVtX3Qgc3RydWN0dXJlIGFuZCBzZXRzIHVwIHZtIG1hcHBpbmdzCisgKiB0byBhY2Nlc3MgdGhlIHJlZ2lzdGVycy4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBsaV9jcmVhdGUobGl0aGl1bV90ICpsaXRoLCB1bnNpZ25lZCBsb25nIGJhc2VhZGRyKQoreworCXN0YXRpYyB2b2lkIGxpX2Rlc3Ryb3kobGl0aGl1bV90ICopOworCisJc3Bpbl9sb2NrX2luaXQoJmxpdGgtPmxvY2spOworCWxpdGgtPnBhZ2UwID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTBfT0ZGU0VULCBQQUdFX1NJWkUpOworCWxpdGgtPnBhZ2UxID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTFfT0ZGU0VULCBQQUdFX1NJWkUpOworCWxpdGgtPnBhZ2UyID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTJfT0ZGU0VULCBQQUdFX1NJWkUpOworCWlmICghbGl0aC0+cGFnZTAgfHwgIWxpdGgtPnBhZ2UxIHx8ICFsaXRoLT5wYWdlMikgeworCQlsaV9kZXN0cm95KGxpdGgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsaV9kZXN0cm95IGRlc3Ryb3lzIHRoZSBsaXRoaXVtX3Qgc3RydWN0dXJlIGFuZCB2bSBtYXBwaW5ncy4KKyAqLworCitzdGF0aWMgdm9pZCBsaV9kZXN0cm95KGxpdGhpdW1fdCAqbGl0aCkKK3sKKwlpZiAobGl0aC0+cGFnZTApIHsKKwkJaW91bm1hcChsaXRoLT5wYWdlMCk7CisJCWxpdGgtPnBhZ2UwID0gTlVMTDsKKwl9CisJaWYgKGxpdGgtPnBhZ2UxKSB7CisJCWlvdW5tYXAobGl0aC0+cGFnZTEpOworCQlsaXRoLT5wYWdlMSA9IE5VTEw7CisJfQorCWlmIChsaXRoLT5wYWdlMikgeworCQlpb3VubWFwKGxpdGgtPnBhZ2UyKTsKKwkJbGl0aC0+cGFnZTIgPSBOVUxMOworCX0KK30KKworLyoKKyAqIGJhc2ljIHJlZ2lzdGVyIGFjY2Vzc29ycyAtIHJlYWQvd3JpdGUgbG9uZy9ieXRlCisgKi8KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsaV9yZWFkbChsaXRoaXVtX3QgKmxpdGgsIGludCBvZmYpCit7CisJcmV0dXJuICogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgtPnBhZ2UwICsgb2ZmKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBsaV9yZWFkYihsaXRoaXVtX3QgKmxpdGgsIGludCBvZmYpCit7CisJcmV0dXJuICogKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKGxpdGgtPnBhZ2UwICsgb2ZmKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBsaV93cml0ZWwobGl0aGl1bV90ICpsaXRoLCBpbnQgb2ZmLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwkqICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChsaXRoLT5wYWdlMCArIG9mZikgPSB2YWw7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlfd3JpdGViKGxpdGhpdW1fdCAqbGl0aCwgaW50IG9mZiwgdW5zaWduZWQgY2hhciB2YWwpCit7CisJKiAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAobGl0aC0+cGFnZTAgKyBvZmYpID0gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBIaWdoIExldmVsIExpdGhpdW0gQWNjZXNzICovCisKKy8qCisgKiBMaXRoaXVtIERNQSBOb3RlcworICoKKyAqIExpdGhpdW0gaGFzIHR3byBkZWRpY2F0ZWQgRE1BIGNoYW5uZWxzIGZvciBhdWRpby4gIFRoZXkgYXJlIGtub3duCisgKiBhcyBjb21tMSBhbmQgY29tbTIgKGNvbW11bmljYXRpb24gYXJlYXMgMSBhbmQgMikuICBDb21tMSBpcyBmb3IKKyAqIGlucHV0LCBhbmQgY29tbTIgaXMgZm9yIG91dHB1dC4gIEVhY2ggaXMgY29udHJvbGxlZCBieSB0aHJlZQorICogcmVnaXN0ZXJzOiBCQVNFIChiYXNlIGFkZHJlc3MpLCBDRkcgKGNvbmZpZykgYW5kIENDVEwKKyAqIChjb25maWcvY29udHJvbCkuCisgKgorICogRWFjaCBETUEgY2hhbm5lbCBwb2ludHMgdG8gYSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgcmluZyBidWZmZXIgaW4KKyAqIG1haW4gbWVtb3J5IG9mIHVwIHRvIDggS2J5dGVzLiAgKFRoaXMgZHJpdmVyIGFsd2F5cyB1c2VzIDggS2IuKQorICogVGhlcmUgYXJlIHRocmVlIHBvaW50ZXJzIGludG8gdGhlIHJpbmcgYnVmZmVyOiByZWFkLCB3cml0ZSwgYW5kCisgKiB0cmlnZ2VyLiAgVGhlIHBvaW50ZXJzIGFyZSA4IGJpdHMgZWFjaC4gIEVhY2ggcG9pbnRlciBwb2ludHMgdG8KKyAqIDMyLWJ5dGUgImNodW5rcyIgb2YgZGF0YS4gIFRoZSBETUEgZW5naW5lIG1vdmVzIDMyIGJ5dGVzIGF0IGEgdGltZSwKKyAqIHNvIHRoZXJlIGlzIG5vIGZpbmVyLWdyYW51bGFyaXR5IGNvbnRyb2wuCisgKgorICogSW4gY29tbTEsIHRoZSBoYXJkd2FyZSB1cGRhdGVzIHRoZSB3cml0ZSBwdHIsIGFuZCBzb2Z0d2FyZSB1cGRhdGVzCisgKiB0aGUgcmVhZCBwdHIuICBJbiBjb21tMiwgaXQncyB0aGUgb3Bwb3NpdGU6IGhhcmR3YXJlIHVwZGF0ZXMgdGhlCisgKiByZWFkIHB0ciwgYW5kIHNvZnR3YXJlIHVwZGF0ZXMgdGhlIHdyaXRlIHB0ci4gIEkgZGVzaWduYXRlIHRoZQorICogaGFyZHdhcmUtdXBkYXRlZCBwdHIgYXMgdGhlIGh3cHRyLCBhbmQgdGhlIHNvZnR3YXJlLXVwZGF0ZWQgcHRyIGFzCisgKiB0aGUgc3dwdHIuCisgKgorICogVGhlIHRyaWdnZXIgcHRyIGFuZCB0cmlnZ2VyIG1hc2sgYXJlIHVzZWQgdG8gdHJpZ2dlciBpbnRlcnJ1cHRzLgorICogRnJvbSB0aGUgTGl0aGl1bSBzcGVjLCBzZWN0aW9uIDUuNi44LCByZXZpc2lvbiBvZiAxMi8xNS8xOTk4OgorICoKKyAqCVRyaWdnZXIgTWFzayBWYWx1ZQorICoKKyAqCUEgdGhyZWUgYml0IHdpZGUgZmllbGQgdGhhdCByZXByZXNlbnRzIGEgcG93ZXIgb2YgdHdvIG1hc2sKKyAqCXRoYXQgaXMgdXNlZCB3aGVuZXZlciB0aGUgdHJpZ2dlciBwb2ludGVyIGlzIGNvbXBhcmVkIHRvIGl0cworICoJcmVzcGVjdGl2ZSByZWFkIG9yIHdyaXRlIHBvaW50ZXIuICBBIHZhbHVlIG9mIHplcm8gaGVyZQorICoJaW1wbGllcyBhIG1hc2sgb2YgMHhGRiBhbmQgYSB2YWx1ZSBvZiBzZXZlbiBpbXBsaWVzIGEgbWFzaworICoJMHgwMS4gIFRoaXMgdmFsdWUgY2FuIGJlIHVzZWQgdG8gc3ViLWRpdmlkZSB0aGUgcmluZyBidWZmZXIKKyAqCWludG8gcGllIHNlY3Rpb25zIHNvIHRoYXQgaW50ZXJydXB0cyBtb25pdG9yIHRoZSBwcm9ncmVzcyBvZgorICoJaGFyZHdhcmUgZnJvbSBzZWN0aW9uIHRvIHNlY3Rpb24uCisgKgorICogTXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCBpcywgd2hlbmV2ZXIgdGhlIGh3IHB0ciBpcyB1cGRhdGVkLCBpdCBpcworICogY29tcGFyZWQgd2l0aCB0aGUgdHJpZ2dlciBwdHIsIGFuZCB0aGUgcmVzdWx0IGlzIG1hc2tlZCBieSB0aGUKKyAqIHRyaWdnZXIgbWFzay4gIChBY3R1YWxseSwgYnkgdGhlIGNvbXBsZW1lbnQgb2YgdGhlIHRyaWdnZXIgbWFzay4pCisgKiBJZiB0aGUgcmVzdWx0IGlzIHplcm8sIGFuIGludGVycnVwdCBpcyB0cmlnZ2VyZWQuICBJLmUuLCBpbnRlcnJ1cHQKKyAqIGlmICgoaHdwdHIgJiB+bWFzaykgPT0gKHRycHRyICYgfm1hc2spKS4gIFRoZSBtYXNrIGlzIGZvcm1lZCBmcm9tCisgKiB0aGUgdHJpZ2dlciByZWdpc3RlciB2YWx1ZSBhcyBtYXNrID0gKDEgPDwgKDggLSB0bXJlZykpIC0gMS4KKyAqCisgKiBJbiB5ZXQgZGlmZmVyZW50IHdvcmRzLCBzZXR0aW5nIHRtcmVnIHRvIDAgY2F1c2VzIGFuIGludGVycnVwdCBhZnRlcgorICogZXZlcnkgMjU2IERNQSBjaHVua3MgKDgxOTIgYnl0ZXMpIG9yIG9uY2UgcGVyIHRyYXZlcnNhbCBvZiB0aGUKKyAqIHJpbmcgYnVmZmVyLiAgU2V0dGluZyBpdCB0byA3IGNhdWVzIGFuIGludGVycnVwdCBldmVyeSAyIERNQSBjaHVua3MKKyAqICg2NCBieXRlcykgb3IgMTI4IHRpbWVzIHBlciB0cmF2ZXJzYWwgb2YgdGhlIHJpbmcgYnVmZmVyLgorICovCisKKy8qIExpdGhpdW0gcmVnaXN0ZXIgb2Zmc2V0cyBhbmQgYml0IGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgTElfSE9TVF9DT05UUk9MTEVSCTB4MDAwCisjIGRlZmluZSBMSV9IQ19SRVNFVAkJIDB4MDAwMDgwMDAKKyMgZGVmaW5lIExJX0hDX0xJTktfRU5BQkxFCSAweDAwMDA0MDAwCisjIGRlZmluZSBMSV9IQ19MSU5LX0ZBSUxVUkUJIDB4MDAwMDAwMDQKKyMgZGVmaW5lIExJX0hDX0xJTktfQ09ERUMJIDB4MDAwMDAwMDIKKyMgZGVmaW5lIExJX0hDX0xJTktfUkVBRFkJIDB4MDAwMDAwMDEKKworI2RlZmluZSBMSV9JTlRSX1NUQVRVUwkJMHgwMTAKKyNkZWZpbmUgTElfSU5UUl9NQVNLCQkweDAxNAorIyBkZWZpbmUgTElfSU5UUl9MSU5LX0VSUgkgMHgwMDAwODAwMAorIyBkZWZpbmUgTElfSU5UUl9DT01NMl9UUklHCSAweDAwMDAwMDA4CisjIGRlZmluZSBMSV9JTlRSX0NPTU0yX1VOREVSRkxPVyAweDAwMDAwMDA0CisjIGRlZmluZSBMSV9JTlRSX0NPTU0xX1RSSUcJIDB4MDAwMDAwMDIKKyMgZGVmaW5lIExJX0lOVFJfQ09NTTFfT1ZFUkZMT1cgIDB4MDAwMDAwMDEKKworI2RlZmluZSBMSV9DT0RFQ19DT01NQU5ECTB4MDE4CisjIGRlZmluZSBMSV9DQ19CVVNZCQkgMHgwMDAwODAwMAorIyBkZWZpbmUgTElfQ0NfRElSCQkgMHgwMDAwMDA4MAorIyAgZGVmaW5lIExJX0NDX0RJUl9SRAkJICBMSV9DQ19ESVIKKyMgIGRlZmluZSBMSV9DQ19ESVJfV1IJCSghTElfQ0NfRElSKQorIyBkZWZpbmUgTElfQ0NfQUREUl9NQVNLCSAweDAwMDAwMDdGCisKKyNkZWZpbmUgTElfQ09ERUNfREFUQQkJMHgwMUMKKworI2RlZmluZSBMSV9DT01NMV9CQVNFCQkweDEwMAorI2RlZmluZSBMSV9DT01NMV9DVEwJCTB4MTA0CisjIGRlZmluZSBMSV9DQ1RMX1JFU0VUCQkgMHg4MDAwMDAwMAorIyBkZWZpbmUgTElfQ0NUTF9TSVpFCQkgMHg3MDAwMDAwMAorIyBkZWZpbmUgTElfQ0NUTF9ETUFfRU5BQkxFCSAweDA4MDAwMDAwCisjIGRlZmluZSBMSV9DQ1RMX1RNQVNLCQkgMHgwNzAwMDAwMCAvKiB0cmlnZ2VyIG1hc2sgKi8KKyMgZGVmaW5lIExJX0NDVExfVFBUUgkJIDB4MDBGRjAwMDAgLyogdHJpZ2dlciBwb2ludGVyICovCisjIGRlZmluZSBMSV9DQ1RMX1JQVFIJCSAweDAwMDBGRjAwCisjIGRlZmluZSBMSV9DQ1RMX1dQVFIJCSAweDAwMDAwMEZGCisjZGVmaW5lIExJX0NPTU0xX0NGRwkJMHgxMDgKKyMgZGVmaW5lIExJX0NDRkdfTE9DSwkJIDB4MDAwMDgwMDAKKyMgZGVmaW5lIExJX0NDRkdfU0xPVAkJIDB4MDAwMDAwNzAKKyMgZGVmaW5lIExJX0NDRkdfRElSRUNUSU9OCSAweDAwMDAwMDA4CisjICBkZWZpbmUgTElfQ0NGR19ESVJfSU4JKCFMSV9DQ0ZHX0RJUkVDVElPTikKKyMgIGRlZmluZSBMSV9DQ0ZHX0RJUl9PVVQJICBMSV9DQ0ZHX0RJUkVDVElPTgorIyBkZWZpbmUgTElfQ0NGR19NT0RFCQkgMHgwMDAwMDAwNAorIyAgZGVmaW5lIExJX0NDRkdfTU9ERV9NT05PCSghTElfQ0NGR19NT0RFKQorIyAgZGVmaW5lIExJX0NDRkdfTU9ERV9TVEVSRU8JICBMSV9DQ0ZHX01PREUKKyMgZGVmaW5lIExJX0NDRkdfRk9STUFUCQkgMHgwMDAwMDAwMworIyAgZGVmaW5lIExJX0NDRkdfRk1UXzhCSVQJICAweDAwMDAwMDAwCisjICBkZWZpbmUgTElfQ0NGR19GTVRfMTZCSVQJICAweDAwMDAwMDAxCisjZGVmaW5lIExJX0NPTU0yX0JBU0UJCTB4MTBDCisjZGVmaW5lIExJX0NPTU0yX0NUTAkJMHgxMTAKKyAvKiBiaXQgZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lIGFzIExJX0NPTU0xX0NUTCAqLworI2RlZmluZSBMSV9DT01NMl9DRkcJCTB4MTE0CisgLyogYml0IGRlZmluaXRpb25zIGFyZSB0aGUgc2FtZSBhcyBMSV9DT01NMV9DRkcgKi8KKworI2RlZmluZSBMSV9VU1RfTE9XCQkweDIwMAkvKiA2NC1iaXQgVW5hZGp1c3RlZCBTeXN0ZW0gVGltZSBpcyAqLworI2RlZmluZSBMSV9VU1RfSElHSAkJMHgyMDQJLyogbWljcm9zZWNvbmRzIHNpbmNlIGJvb3QgKi8KKworI2RlZmluZSBMSV9BVURJTzFfVVNUCQkweDMwMAkvKiBVU1QtTVNDIHBhaXJzICovCisjZGVmaW5lIExJX0FVRElPMV9NU0MJCTB4MzA0CS8qIE1TQyAoTWVkaWEgU3RyZWFtIENvdW50ZXIpICovCisjZGVmaW5lIExJX0FVRElPMl9VU1QJCTB4MzA4CS8qIGNvdW50cyBzYW1wbGVzIGFjdHVhbGx5ICovCisjZGVmaW5lIExJX0FVRElPMl9NU0MJCTB4MzBDCS8qIHByb2Nlc3NlZCBhcyBvZiB0aW1lIFVTVCAqLworCisvKiAKKyAqIExpdGhpdW0ncyBETUEgZW5naW5lIG9wZXJhdGVzIG9uIGNodW5rcyBvZiAzMiBieXRlcy4gIFdlIGNhbGwgdGhhdAorICogYSBETUFDSFVOSy4KKyAqLworCisjZGVmaW5lIERNQUNIVU5LX1NISUZUIDUKKyNkZWZpbmUgRE1BQ0hVTktfU0laRSAoMSA8PCBETUFDSFVOS19TSElGVCkKKyNkZWZpbmUgQllURVNfVE9fQ0hVTktTKGJ5dGVzKSAoKGJ5dGVzKSA+PiBETUFDSFVOS19TSElGVCkKKyNkZWZpbmUgQ0hVTktTX1RPX0JZVEVTKGNodW5rcykgKChjaHVua3MpIDw8IERNQUNIVU5LX1NISUZUKQorCisvKgorICogVHdvIGNvbnZlbmllbnQgbWFjcm9zIHRvIHNoaWZ0IGJpdGZpZWxkcyBpbnRvL291dCBvZiBwb3NpdGlvbi4KKyAqCisgKiBPYnNlcnZlIHRoYXQgKG1hc2sgJiAtbWFzaykgaXMgKDEgPDwgbG93X3NldF9iaXRfb2YobWFzaykpLgorICogQXMgbG9uZyBhcyBtYXNrIGlzIGNvbnN0YW50LCB3ZSB0cnVzdCB0aGUgY29tcGlsZXIgd2lsbCBjaGFuZ2UgdGhlCisgKiBtdWx0aXB5IGFuZCBkaXZpZGUgaW50byBzaGlmdHMuCisgKi8KKworI2RlZmluZSBTSElGVF9GSUVMRCh2YWwsIG1hc2spICgoKHZhbCkgKiAoKG1hc2spICYgLShtYXNrKSkpICYgKG1hc2spKQorI2RlZmluZSBVTlNISUZUX0ZJRUxEKHZhbCwgbWFzaykgKCgodmFsKSAmIChtYXNrKSkgLyAoKG1hc2spICYgLShtYXNrKSkpCisKKy8qCisgKiBkbWFfY2hhbl9kZXNjIGlzIGludmFyaWFudCBpbmZvcm1hdGlvbiBhYm91dCBhIExpdGhpdW0KKyAqIERNQSBjaGFubmVsLiAgVGhlcmUgYXJlIHR3byBpbnN0YW5jZXMsIGxpX2NvbW0xIGFuZCBsaV9jb21tMi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIENDVEwgcmVnaXN0ZXIgZmllbGRzIGFyZSB3cml0ZSBwdHIgYW5kIHJlYWQgcHRyLCBidXQgd2hhdAorICogd2UgY2FyZSBhYm91dCBhcmUgd2hpY2ggcG9pbnRlciBpcyB1cGRhdGVkIGJ5IHNvZnR3YXJlIGFuZCB3aGljaCBieQorICogaGFyZHdhcmUuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZG1hX2NoYW5fZGVzYyB7CisJaW50IGJhc2VyZWc7CisJaW50IGNmZ3JlZzsKKwlpbnQgY3RscmVnOworCWludCBod3B0cnJlZzsKKwlpbnQgc3dwdHJyZWc7CisJaW50IHVzdHJlZzsKKwlpbnQgbXNjcmVnOworCXVuc2lnbmVkIGxvbmcgc3dwdHJtYXNrOworCWludCBhZDE4NDNfc2xvdDsKKwlpbnQgZGlyZWN0aW9uOwkJCS8qIExJX0NDVExfRElSX0lOL09VVCAqLworfSBkbWFfY2hhbl9kZXNjX3Q7CisKK3N0YXRpYyBjb25zdCBkbWFfY2hhbl9kZXNjX3QgbGlfY29tbTEgPSB7CisJTElfQ09NTTFfQkFTRSwJCQkvKiBiYXNlIHJlZ2lzdGVyIG9mZnNldCAqLworCUxJX0NPTU0xX0NGRywJCQkvKiBjb25maWcgcmVnaXN0ZXIgb2Zmc2V0ICovCisJTElfQ09NTTFfQ1RMLAkJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgb2Zmc2V0ICovCisJTElfQ09NTTFfQ1RMICsgMCwJCS8qIGh3IHB0ciByZWcgb2Zmc2V0ICh3cml0ZSBwdHIpICovCisJTElfQ09NTTFfQ1RMICsgMSwJCS8qIHN3IHB0ciByZWcgb2Zmc2V0IChyZWFkIHB0cikgKi8KKwlMSV9BVURJTzFfVVNULAkJCS8qIHVzdCByZWcgb2Zmc2V0ICovCisJTElfQVVESU8xX01TQywJCQkvKiBtc2MgcmVnIG9mZnNldCAqLworCUxJX0NDVExfUlBUUiwJCQkvKiBzdyBwdHIgYml0bWFzayBpbiBjdGx2YWwgKi8KKwkyLAkJCQkvKiBhZDE4NDMgc2VyaWFsIHNsb3QgKi8KKwlMSV9DQ0ZHX0RJUl9JTgkJCS8qIGRpcmVjdGlvbiAqLworfTsKKworc3RhdGljIGNvbnN0IGRtYV9jaGFuX2Rlc2NfdCBsaV9jb21tMiA9IHsKKwlMSV9DT01NMl9CQVNFLAkJCS8qIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0ICovCisJTElfQ09NTTJfQ0ZHLAkJCS8qIGNvbmZpZyByZWdpc3RlciBvZmZzZXQgKi8KKwlMSV9DT01NMl9DVEwsCQkJLyogY29udHJvbCByZWdpc3RlciBvZmZzZXQgKi8KKwlMSV9DT01NMl9DVEwgKyAxLAkJLyogaHcgcHRyIHJlZyBvZmZzZXQgKHJlYWQgcHRyKSAqLworCUxJX0NPTU0yX0NUTCArIDAsCQkvKiBzdyBwdHIgcmVnIG9mZnNldCAod3JpdHIgcHRyKSAqLworCUxJX0FVRElPMl9VU1QsCQkJLyogdXN0IHJlZyBvZmZzZXQgKi8KKwlMSV9BVURJTzJfTVNDLAkJCS8qIG1zYyByZWcgb2Zmc2V0ICovCisJTElfQ0NUTF9XUFRSLAkJCS8qIHN3IHB0ciBiaXRtYXNrIGluIGN0bHZhbCAqLworCTIsCQkJCS8qIGFkMTg0MyBzZXJpYWwgc2xvdCAqLworCUxJX0NDRkdfRElSX09VVAkJCS8qIGRpcmVjdGlvbiAqLworfTsKKworLyoKKyAqIGRtYV9jaGFuIGlzIHZhcmlhYmxlIGluZm9ybWF0aW9uIGFib3V0IGEgTGl0aGl1bSBETUEgY2hhbm5lbC4KKyAqCisgKiBUaGUgZGVzYyBmaWVsZCBwb2ludHMgdG8gaW52YXJpYW50IGluZm9ybWF0aW9uLgorICogVGhlIGxpdGggZmllbGQgcG9pbnRzIHRvIGEgbGl0aGl1bV90IHdoaWNoIGlzIHBhc3NlZAorICogdG8gbGlfcmVhZCogYW5kIGxpX3dyaXRlKiB0byBhY2Nlc3MgdGhlIHJlZ2lzdGVycy4KKyAqIFRoZSAqdmFsIGZpZWxkcyBzaGFkb3cgdGhlIGxpdGhpdW0gcmVnaXN0ZXJzJyBjb250ZW50cy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBkbWFfY2hhbiB7CisJY29uc3QgZG1hX2NoYW5fZGVzY190ICpkZXNjOworCWxpdGhpdW1fdCAgICAgICpsaXRoOworCXVuc2lnbmVkIGxvbmcgICBiYXNldmFsOworCXVuc2lnbmVkIGxvbmcJY2ZndmFsOworCXVuc2lnbmVkIGxvbmcJY3RsdmFsOworfSBkbWFfY2hhbl90OworCisvKgorICogdXN0bXNjIGlzIGEgVVNUL01TQyBwYWlyIChVbmFkanVzdGVkIFN5c3RlbSBUaW1lL01lZGlhIFN0cmVhbSBDb3VudGVyKS4KKyAqIFVTVCBpcyB0aW1lIGluIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgc3lzdGVtIGJvb3RlZCwgYW5kIE1TQyBpcyBhCisgKiBjb3VudGVyIHRoYXQgaW5jcmVtZW50cyB3aXRoIGV2ZXJ5IGF1ZGlvIHNhbXBsZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB1c3Rtc2MgeworCXVuc2lnbmVkIGxvbmcgbG9uZyB1c3Q7CisJdW5zaWduZWQgbG9uZyBtc2M7Cit9IHVzdG1zY190OworCisvKgorICogbGlfYWQxODQzX3dhaXQgd2FpdHMgdW50aWwgbGl0aGl1bSBzYXlzIHRoZSBBRDE4NDMgcmVnaXN0ZXIKKyAqIGV4Y2hhbmdlIGlzIG5vdCBidXN5LiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FQlVTWSBvbiB0aW1lb3V0LgorICoKKyAqIExvY2tpbmc6IG11c3QgYmUgY2FsbGVkIHdpdGggbGl0aGl1bV9sb2NrIGhlbGQuCisgKi8KKworc3RhdGljIGludCBsaV9hZDE4NDNfd2FpdChsaXRoaXVtX3QgKmxpdGgpCit7CisJdW5zaWduZWQgbG9uZyBsYXRlciA9IGppZmZpZXMgKyAyOworCXdoaWxlIChsaV9yZWFkbChsaXRoLCBMSV9DT0RFQ19DT01NQU5EKSAmIExJX0NDX0JVU1kpCisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGxhdGVyKSkKKwkJCXJldHVybiAtRUJVU1k7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsaV9yZWFkX2FkMTg0M19yZWcgcmV0dXJucyB0aGUgY3VycmVudCBjb250ZW50cyBvZiBhIDE2IGJpdCBBRDE4NDMgcmVnaXN0ZXIuCisgKgorICogUmV0dXJucyB1bnNpZ25lZCByZWdpc3RlciB2YWx1ZSBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IGxpX3JlYWRfYWQxODQzX3JlZyhsaXRoaXVtX3QgKmxpdGgsIGludCByZWcpCit7CisJaW50IHZhbDsKKworCUFTU0VSVCghaW5faW50ZXJydXB0KCkpOworCXNwaW5fbG9jaygmbGl0aC0+bG9jayk7CisJeworCQl2YWwgPSBsaV9hZDE4NDNfd2FpdChsaXRoKTsKKwkJaWYgKHZhbCA9PSAwKSB7CisJCQlsaV93cml0ZWwobGl0aCwgTElfQ09ERUNfQ09NTUFORCwgTElfQ0NfRElSX1JEIHwgcmVnKTsKKwkJCXZhbCA9IGxpX2FkMTg0M193YWl0KGxpdGgpOworCQl9CisJCWlmICh2YWwgPT0gMCkKKwkJCXZhbCA9IGxpX3JlYWRsKGxpdGgsIExJX0NPREVDX0RBVEEpOworCX0KKwlzcGluX3VubG9jaygmbGl0aC0+bG9jayk7CisKKwlEQkdYVigibGlfcmVhZF9hZDE4NDNfcmVnKGxpdGg9MHglcCwgcmVnPSVkKSByZXR1cm5zIDB4JTA0eFxuIiwKKwkgICAgICBsaXRoLCByZWcsIHZhbCk7CisKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogbGlfd3JpdGVfYWQxODQzX3JlZyB3cml0ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIDE2IGJpdCBBRDE4NDMgcmVnaXN0ZXIuCisgKi8KKworc3RhdGljIHZvaWQgbGlfd3JpdGVfYWQxODQzX3JlZyhsaXRoaXVtX3QgKmxpdGgsIGludCByZWcsIGludCBuZXd2YWwpCit7CisJc3Bpbl9sb2NrKCZsaXRoLT5sb2NrKTsKKwl7CisJCWlmIChsaV9hZDE4NDNfd2FpdChsaXRoKSA9PSAwKSB7CisJCQlsaV93cml0ZWwobGl0aCwgTElfQ09ERUNfREFUQSwgbmV3dmFsKTsKKwkJCWxpX3dyaXRlbChsaXRoLCBMSV9DT0RFQ19DT01NQU5ELCBMSV9DQ19ESVJfV1IgfCByZWcpOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZsaXRoLT5sb2NrKTsKK30KKworLyoKKyAqIGxpX3NldHVwX2RtYSBjYWxjdWxhdGVzIGFsbCB0aGUgcmVnaXN0ZXIgc2V0dGluZ3MgZm9yIERNQSBpbiBhIHBhcnRpY3VsYXIKKyAqIG1vZGUuICBJdCB0YWtlcyB0b28gbWFueSBhcmd1bWVudHMuCisgKi8KKworc3RhdGljIHZvaWQgbGlfc2V0dXBfZG1hKGRtYV9jaGFuX3QgKmNoYW4sCisJCQkgY29uc3QgZG1hX2NoYW5fZGVzY190ICpkZXNjLAorCQkJIGxpdGhpdW1fdCAqbGl0aCwKKwkJCSB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9wYWRkciwKKwkJCSBpbnQgYnVmc2hpZnQsCisJCQkgaW50IGZyYWdzaGlmdCwKKwkJCSBpbnQgY2hhbm5lbHMsCisJCQkgaW50IHNhbXBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbW9kZSwgZm9ybWF0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdG1hc2s7CisKKwlEQkdFVigiKGNoYW49MHglcCwgZGVzYz0weCVwLCBsaXRoPTB4JXAsIGJ1ZmZlcl9wYWRkcj0weCVseCwgIgorCSAgICAgImJ1ZnNoaWZ0PSVkLCBmcmFnc2hpZnQ9JWQsIGNoYW5uZWxzPSVkLCBzYW1wc2l6ZT0lZClcbiIsCisJICAgICBjaGFuLCBkZXNjLCBsaXRoLCBidWZmZXJfcGFkZHIsCisJICAgICBidWZzaGlmdCwgZnJhZ3NoaWZ0LCBjaGFubmVscywgc2FtcHNpemUpOworCisJLyogUmVzZXQgdGhlIGNoYW5uZWwgZmlyc3QuICovCisKKwlsaV93cml0ZWwobGl0aCwgZGVzYy0+Y3RscmVnLCBMSV9DQ1RMX1JFU0VUKTsKKworCUFTU0VSVChjaGFubmVscyA9PSAxIHx8IGNoYW5uZWxzID09IDIpOworCWlmIChjaGFubmVscyA9PSAyKQorCQltb2RlID0gTElfQ0NGR19NT0RFX1NURVJFTzsKKwllbHNlCisJCW1vZGUgPSBMSV9DQ0ZHX01PREVfTU9OTzsKKwlBU1NFUlQoc2FtcHNpemUgPT0gMSB8fCBzYW1wc2l6ZSA9PSAyKTsKKwlpZiAoc2FtcHNpemUgPT0gMikKKwkJZm9ybWF0ID0gTElfQ0NGR19GTVRfMTZCSVQ7CisJZWxzZQorCQlmb3JtYXQgPSBMSV9DQ0ZHX0ZNVF84QklUOworCWNoYW4tPmRlc2MgPSBkZXNjOworCWNoYW4tPmxpdGggPSBsaXRoOworCisJLyoKKwkgKiBMaXRoaXVtIERNQSBhZGRyZXNzIHJlZ2lzdGVyIHRha2VzIGEgNDAtYml0IHBoeXNpY2FsCisJICogYWRkcmVzcywgcmlnaHQtc2hpZnRlZCBieSA4IHNvIGl0IGZpdHMgaW4gMzIgYml0cy4gIEJpdCAzNworCSAqIG11c3QgYmUgc2V0IC0tIGl0IGVuYWJsZXMgY2FjaGUgY29oZXJlbmNlLgorCSAqLworCisJQVNTRVJUKCEoYnVmZmVyX3BhZGRyICYgMHhGRikpOworCWNoYW4tPmJhc2V2YWwgPSAoYnVmZmVyX3BhZGRyID4+IDgpIHwgMSA8PCAoMzcgLSA4KTsKKworCWNoYW4tPmNmZ3ZhbCA9ICghTElfQ0NGR19MT0NLIHwKKwkJCVNISUZUX0ZJRUxEKGRlc2MtPmFkMTg0M19zbG90LCBMSV9DQ0ZHX1NMT1QpIHwKKwkJCWRlc2MtPmRpcmVjdGlvbiB8CisJCQltb2RlIHwKKwkJCWZvcm1hdCk7CisKKwlzaXplID0gYnVmc2hpZnQgLSA2OworCXRtYXNrID0gMTMgLSBmcmFnc2hpZnQ7CQkvKiBTZWUgTGl0aGl1bSBETUEgTm90ZXMgYWJvdmUuICovCisJQVNTRVJUKHNpemUgPj0gMiAmJiBzaXplIDw9IDcpOworCUFTU0VSVCh0bWFzayA+PSAxICYmIHRtYXNrIDw9IDcpOworCWNoYW4tPmN0bHZhbCA9ICghTElfQ0NUTF9SRVNFVCB8CisJCQlTSElGVF9GSUVMRChzaXplLCBMSV9DQ1RMX1NJWkUpIHwKKwkJCSFMSV9DQ1RMX0RNQV9FTkFCTEUgfAorCQkJU0hJRlRfRklFTEQodG1hc2ssIExJX0NDVExfVE1BU0spIHwKKwkJCVNISUZUX0ZJRUxEKDAsIExJX0NDVExfVFBUUikpOworCisJREJHUFYoImJhc2VyZWcgMHgleCA9IDB4JWx4XG4iLCBkZXNjLT5iYXNlcmVnLCBjaGFuLT5iYXNldmFsKTsKKwlEQkdQVigiY2ZncmVnIDB4JXggPSAweCVseFxuIiwgZGVzYy0+Y2ZncmVnLCBjaGFuLT5jZmd2YWwpOworCURCR1BWKCJjdGxyZWcgMHgleCA9IDB4JWx4XG4iLCBkZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7CisKKwlsaV93cml0ZWwobGl0aCwgZGVzYy0+YmFzZXJlZywgY2hhbi0+YmFzZXZhbCk7CisJbGlfd3JpdGVsKGxpdGgsIGRlc2MtPmNmZ3JlZywgY2hhbi0+Y2ZndmFsKTsKKwlsaV93cml0ZWwobGl0aCwgZGVzYy0+Y3RscmVnLCBjaGFuLT5jdGx2YWwpOworCisJREJHUlYoKTsKK30KKworc3RhdGljIHZvaWQgbGlfc2h1dGRvd25fZG1hKGRtYV9jaGFuX3QgKmNoYW4pCit7CisJbGl0aGl1bV90ICpsaXRoID0gY2hhbi0+bGl0aDsKKwl2b2lkICogbGl0aDEgPSBsaXRoLT5wYWdlMTsKKworCURCR0VWKCIoY2hhbj0weCVwKVxuIiwgY2hhbik7CisJCisJY2hhbi0+Y3RsdmFsICY9IH5MSV9DQ1RMX0RNQV9FTkFCTEU7CisJREJHUFYoImN0bHJlZyAweCV4ID0gMHglbHhcbiIsIGNoYW4tPmRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKKwlsaV93cml0ZWwobGl0aCwgY2hhbi0+ZGVzYy0+Y3RscmVnLCBjaGFuLT5jdGx2YWwpOworCisJLyoKKwkgKiBPZmZzZXQgMHg1MDAgb24gTGl0aGl1bSBwYWdlIDEgaXMgYW4gdW5kb2N1bWVudGVkLAorCSAqIHVuc3VwcG9ydGVkIHJlZ2lzdGVyIHRoYXQgaG9sZHMgdGhlIHplcm8gc2FtcGxlIHZhbHVlLgorCSAqIExpdGhpdW0gaXMgc3VwcG9zZWQgdG8gb3V0cHV0IHplcm8gc2FtcGxlcyB3aGVuIERNQSBpcworCSAqIGluYWN0aXZlLCBhbmQgcmVwZWF0IHRoZSBsYXN0IHNhbXBsZSB3aGVuIERNQSB1bmRlcmZsb3dzLgorCSAqIEJ1dCBpdCBoYXMgYSBidWcsIHdoZXJlLCBhZnRlciB1bmRlcmZsb3cgb2NjdXJzLCB0aGUgemVybworCSAqIHNhbXBsZSBpcyBub3QgcmVzZXQuCisJICoKKwkgKiBJIGV4cGVjdCB0aGlzIHRvIGJyZWFrIGluIGEgZnV0dXJlIHJldiBvZiBMaXRoaXVtLgorCSAqLworCisJaWYgKGxpdGgxICYmIGNoYW4tPmRlc2MtPmRpcmVjdGlvbiA9PSBMSV9DQ0ZHX0RJUl9PVVQpCisJCSogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgxICsgMHg1MDApID0gMDsKK30KKworLyoKKyAqIGxpX2FjdGl2YXRlX2RtYSBhbHdheXMgc3RhcnRzIGRtYSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuCisgKgorICogTi5CLiwgdGhlc2UgbWF5IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdC4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGxpX2FjdGl2YXRlX2RtYShkbWFfY2hhbl90ICpjaGFuKQoreworCWNoYW4tPmN0bHZhbCB8PSBMSV9DQ1RMX0RNQV9FTkFCTEU7CisJREJHUFYoImN0bHZhbCA9IDB4JWx4XG4iLCBjaGFuLT5jdGx2YWwpOworCWxpX3dyaXRlbChjaGFuLT5saXRoLCBjaGFuLT5kZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGxpX2RlYWN0aXZhdGVfZG1hKGRtYV9jaGFuX3QgKmNoYW4pCit7CisJbGl0aGl1bV90ICpsaXRoID0gY2hhbi0+bGl0aDsKKwl2b2lkICogbGl0aDIgPSBsaXRoLT5wYWdlMjsKKworCWNoYW4tPmN0bHZhbCAmPSB+KExJX0NDVExfRE1BX0VOQUJMRSB8IExJX0NDVExfUlBUUiB8IExJX0NDVExfV1BUUik7CisJREJHUFYoImN0bHZhbCA9IDB4JWx4XG4iLCBjaGFuLT5jdGx2YWwpOworCURCR1BWKCJjdGxyZWcgMHgleCA9IDB4JWx4XG4iLCBjaGFuLT5kZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7CisJbGlfd3JpdGVsKGxpdGgsIGNoYW4tPmRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKKworCS8qCisJICogT2Zmc2V0cyAweDk4IGFuZCAweDlDIG9uIExpdGhpdW0gcGFnZSAyIGFyZSB1bmRvY3VtZW50ZWQsCisJICogdW5zdXBwb3J0ZWQgcmVnaXN0ZXJzIHRoYXQgYXJlIGludGVybmFsIGNvcGllcyBvZiB0aGUgRE1BCisJICogcmVhZCBhbmQgd3JpdGUgcG9pbnRlcnMuICBCZWNhdXNlIG9mIGEgTGl0aGl1bSBidWcsIHRoZXNlCisJICogcmVnaXN0ZXJzIGFyZW4ndCB6ZXJvZWQgY29ycmVjdGx5IHdoZW4gRE1BIGlzIHNodXQgb2ZmLiAgU28KKwkgKiB3ZSB3aGFjayB0aGVtIGRpcmVjdGx5LgorCSAqCisJICogSSBleHBlY3QgdGhpcyB0byBicmVhayBpbiBhIGZ1dHVyZSByZXYgb2YgTGl0aGl1bS4KKwkgKi8KKworCWlmIChsaXRoMiAmJiBjaGFuLT5kZXNjLT5kaXJlY3Rpb24gPT0gTElfQ0NGR19ESVJfT1VUKSB7CisJCSogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgyICsgMHg5OCkgPSAwOworCQkqICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChsaXRoMiArIDB4OUMpID0gMDsKKwl9Cit9CisKKy8qCisgKiByZWFkL3dyaXRlIHRoZSByaW5nIGJ1ZmZlciBwb2ludGVycy4gIFRoZXNlIHJvdXRpbmVzJyBhcmd1bWVudHMgYW5kIHJlc3VsdHMKKyAqIGFyZSBieXRlIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByaW5nIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbGlfcmVhZF9zd3B0cihkbWFfY2hhbl90ICpjaGFuKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWFzayA9IGNoYW4tPmRlc2MtPnN3cHRybWFzazsKKworCXJldHVybiBDSFVOS1NfVE9fQllURVMoVU5TSElGVF9GSUVMRChjaGFuLT5jdGx2YWwsIG1hc2spKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGxpX3JlYWRfaHdwdHIoZG1hX2NoYW5fdCAqY2hhbikKK3sKKwlyZXR1cm4gQ0hVTktTX1RPX0JZVEVTKGxpX3JlYWRiKGNoYW4tPmxpdGgsIGNoYW4tPmRlc2MtPmh3cHRycmVnKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlfd3JpdGVfc3dwdHIoZG1hX2NoYW5fdCAqY2hhbiwgaW50IHZhbCkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nIG1hc2sgPSBjaGFuLT5kZXNjLT5zd3B0cm1hc2s7CisKKwlBU1NFUlQoISh2YWwgJiB+Q0hVTktTX1RPX0JZVEVTKDB4RkYpKSk7CisJdmFsID0gQllURVNfVE9fQ0hVTktTKHZhbCk7CisJY2hhbi0+Y3RsdmFsID0gKGNoYW4tPmN0bHZhbCAmIH5tYXNrKSB8IFNISUZUX0ZJRUxEKHZhbCwgbWFzayk7CisJbGlfd3JpdGViKGNoYW4tPmxpdGgsIGNoYW4tPmRlc2MtPnN3cHRycmVnLCB2YWwpOworfQorCisvKiBsaV9yZWFkX1VTVE1TQygpIHJldHVybnMgYSBVU1QvTVNDIHBhaXIgZm9yIHRoZSBnaXZlbiBjaGFubmVsLiAqLworCitzdGF0aWMgdm9pZCBsaV9yZWFkX1VTVE1TQyhkbWFfY2hhbl90ICpjaGFuLCB1c3Rtc2NfdCAqdXN0bXNjKQoreworCWxpdGhpdW1fdCAqbGl0aCA9IGNoYW4tPmxpdGg7CisJY29uc3QgZG1hX2NoYW5fZGVzY190ICpkZXNjID0gY2hhbi0+ZGVzYzsKKwl1bnNpZ25lZCBsb25nIG5vd19sb3csIG5vd19oaWdoMCwgbm93X2hpZ2gxLCBjaGFuX3VzdDsKKworCXNwaW5fbG9jaygmbGl0aC0+bG9jayk7CisJeworCQkvKgorCQkgKiByZXRyeSB1bnRpbCB3ZSBkbyBhbGwgZml2ZSByZWFkcyB3aXRob3V0IHRoZQorCQkgKiBoaWdoIHdvcmQgY2hhbmdpbmcuICAoSGlnaCB3b3JkIGluY3JlbWVudHMKKwkJICogZXZlcnkgMl4zMiBtaWNyb3NlY29uZHMsIGkuZS4sIG5vdCBvZnRlbikKKwkJICovCisJCWRvIHsKKwkJCW5vd19oaWdoMCA9IGxpX3JlYWRsKGxpdGgsIExJX1VTVF9ISUdIKTsKKwkJCW5vd19sb3cgPSBsaV9yZWFkbChsaXRoLCBMSV9VU1RfTE9XKTsKKworCQkJLyoKKwkJCSAqIExpdGhpdW0gZ3VhcmFudGVlcyB0aGVzZSB0d28gcmVhZHMgd2lsbCBiZQorCQkJICogYXRvbWljIC0tIHVzdCB3aWxsIG5vdCBpbmNyZW1lbnQgYWZ0ZXIgbXNjCisJCQkgKiBpcyByZWFkLgorCQkJICovCisKKwkJCXVzdG1zYy0+bXNjID0gbGlfcmVhZGwobGl0aCwgZGVzYy0+bXNjcmVnKTsKKwkJCWNoYW5fdXN0ID0gbGlfcmVhZGwobGl0aCwgZGVzYy0+dXN0cmVnKTsKKworCQkJbm93X2hpZ2gxID0gbGlfcmVhZGwobGl0aCwgTElfVVNUX0hJR0gpOworCQl9IHdoaWxlIChub3dfaGlnaDAgIT0gbm93X2hpZ2gxKTsKKwl9CQorCXNwaW5fdW5sb2NrKCZsaXRoLT5sb2NrKTsKKwl1c3Rtc2MtPnVzdCA9ICgodW5zaWduZWQgbG9uZyBsb25nKSBub3dfaGlnaDAgPDwgMzIgfCBjaGFuX3VzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGxpX2VuYWJsZV9pbnRlcnJ1cHRzKGxpdGhpdW1fdCAqbGl0aCwgdW5zaWduZWQgaW50IG1hc2spCit7CisJREJHRVYoIihsaXRoPTB4JXAsIG1hc2s9MHgleClcbiIsIGxpdGgsIG1hc2spOworCisJLyogY2xlYXIgYW55IGFscmVhZHktcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCisJbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfU1RBVFVTLCBtYXNrKTsKKworCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0cy4gKi8KKworCW1hc2sgfD0gbGlfcmVhZGwobGl0aCwgTElfSU5UUl9NQVNLKTsKKwlsaV93cml0ZWwobGl0aCwgTElfSU5UUl9NQVNLLCBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgbGlfZGlzYWJsZV9pbnRlcnJ1cHRzKGxpdGhpdW1fdCAqbGl0aCwgdW5zaWduZWQgaW50IG1hc2spCit7CisJdW5zaWduZWQgaW50IGtlZXBtYXNrOworCisJREJHRVYoIihsaXRoPTB4JXAsIG1hc2s9MHgleClcbiIsIGxpdGgsIG1hc2spOworCisJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0cyAqLworCisJa2VlcG1hc2sgPSBsaV9yZWFkbChsaXRoLCBMSV9JTlRSX01BU0spICYgfm1hc2s7CisJbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfTUFTSywga2VlcG1hc2spOworCisJLyogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKworCWxpX3dyaXRlbChsaXRoLCBMSV9JTlRSX1NUQVRVUywgbWFzayk7Cit9CisKKy8qIEdldCB0aGUgaW50ZXJydXB0IHN0YXR1cyBhbmQgY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBsaV9nZXRfY2xlYXJfaW50cl9zdGF0dXMobGl0aGl1bV90ICpsaXRoKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBsaV9yZWFkbChsaXRoLCBMSV9JTlRSX1NUQVRVUyk7CisJbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfU1RBVFVTLCB+MCk7CisJcmV0dXJuIHN0YXR1cyAmIGxpX3JlYWRsKGxpdGgsIExJX0lOVFJfTUFTSyk7Cit9CisKK3N0YXRpYyBpbnQgbGlfaW5pdChsaXRoaXVtX3QgKmxpdGgpCit7CisJLyogMS4gU3lzdGVtIHBvd2VyIHN1cHBsaWVzIHN0YWJpbGl6ZS4gKi8KKworCS8qIDIuIEFzc2VydCB0aGUgflJFU0VUIHNpZ25hbC4gKi8KKworCWxpX3dyaXRlbChsaXRoLCBMSV9IT1NUX0NPTlRST0xMRVIsIExJX0hDX1JFU0VUKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiAzLiBEZWFzc2VydCB0aGUgflJFU0VUIHNpZ25hbCBhbmQgZW50ZXIgYSB3YWl0IHBlcmlvZCB0byBhbGxvdworCSAgIHRoZSBBRDE4NDMgaW50ZXJuYWwgY2xvY2tzIGFuZCB0aGUgZXh0ZXJuYWwgY3J5c3RhbCBvc2NpbGxhdG9yCisJICAgdG8gc3RhYmlsaXplLiAqLworCisJbGlfd3JpdGVsKGxpdGgsIExJX0hPU1RfQ09OVFJPTExFUiwgTElfSENfTElOS19FTkFCTEUpOworCXVkZWxheSgxKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBRDE4NDMgYWNjZXNzICovCisKKy8qCisgKiBBRDE4NDMgYml0ZmllbGQgZGVmaW5pdGlvbnMuICBBbGwgYXJlIG5hbWVkIGFzIGluIHRoZSBBRDE4NDMgZGF0YQorICogc2hlZXQsIHdpdGggYWQxODQzXyBwcmVwZW5kZWQgYW5kIGluZGl2aWR1YWwgYml0IG51bWJlcnMgcmVtb3ZlZC4KKyAqCisgKiBFLmcuLCBiaXRzIExTUzAgdGhyb3VnaCBMU1MyIGJlY29tZSBhZDE4NDNfTFNTLgorICoKKyAqIE9ubHkgdGhlIGJpdGZpZWxkcyB3ZSBuZWVkIGFyZSBkZWZpbmVkLgorICovCisKK3R5cGVkZWYgc3RydWN0IGFkMTg0M19iaXRmaWVsZCB7CisJY2hhciByZWc7CisJY2hhciBsb19iaXQ7CisJY2hhciBuYml0czsKK30gYWQxODQzX2JpdGZpZWxkX3Q7CisKK3N0YXRpYyBjb25zdCBhZDE4NDNfYml0ZmllbGRfdAorCWFkMTg0M19QRE5PICAgPSB7ICAwLCAxNCwgIDEgfSwJLyogQ29udmVydGVyIFBvd2VyLURvd24gRmxhZyAqLworCWFkMTg0M19JTklUICAgPSB7ICAwLCAxNSwgIDEgfSwJLyogQ2xvY2sgSW5pdGlhbGl6YXRpb24gRmxhZyAqLworCWFkMTg0M19SSUcgICAgPSB7ICAyLCAgMCwgIDQgfSwJLyogUmlnaHQgQURDIElucHV0IEdhaW4gKi8KKwlhZDE4NDNfUk1HRSAgID0geyAgMiwgIDQsICAxIH0sCS8qIFJpZ2h0IEFEQyBNaWMgR2FpbiBFbmFibGUgKi8KKwlhZDE4NDNfUlNTICAgID0geyAgMiwgIDUsICAzIH0sCS8qIFJpZ2h0IEFEQyBTb3VyY2UgU2VsZWN0ICovCisJYWQxODQzX0xJRyAgICA9IHsgIDIsICA4LCAgNCB9LAkvKiBMZWZ0IEFEQyBJbnB1dCBHYWluICovCisJYWQxODQzX0xNR0UgICA9IHsgIDIsIDEyLCAgMSB9LAkvKiBMZWZ0IEFEQyBNaWMgR2FpbiBFbmFibGUgKi8KKwlhZDE4NDNfTFNTICAgID0geyAgMiwgMTMsICAzIH0sCS8qIExlZnQgQURDIFNvdXJjZSBTZWxlY3QgKi8KKwlhZDE4NDNfUlgxTSAgID0geyAgNCwgIDAsICA1IH0sCS8qIFJpZ2h0IEF1eCAxIE1peCBHYWluL0F0dGVuICovCisJYWQxODQzX1JYMU1NICA9IHsgIDQsICA3LCAgMSB9LAkvKiBSaWdodCBBdXggMSBNaXggTXV0ZSAqLworCWFkMTg0M19MWDFNICAgPSB7ICA0LCAgOCwgIDUgfSwJLyogTGVmdCBBdXggMSBNaXggR2Fpbi9BdHRlbiAqLworCWFkMTg0M19MWDFNTSAgPSB7ICA0LCAxNSwgIDEgfSwJLyogTGVmdCBBdXggMSBNaXggTXV0ZSAqLworCWFkMTg0M19SWDJNICAgPSB7ICA1LCAgMCwgIDUgfSwJLyogUmlnaHQgQXV4IDIgTWl4IEdhaW4vQXR0ZW4gKi8KKwlhZDE4NDNfUlgyTU0gID0geyAgNSwgIDcsICAxIH0sCS8qIFJpZ2h0IEF1eCAyIE1peCBNdXRlICovCisJYWQxODQzX0xYMk0gICA9IHsgIDUsICA4LCAgNSB9LAkvKiBMZWZ0IEF1eCAyIE1peCBHYWluL0F0dGVuICovCisJYWQxODQzX0xYMk1NICA9IHsgIDUsIDE1LCAgMSB9LAkvKiBMZWZ0IEF1eCAyIE1peCBNdXRlICovCisJYWQxODQzX1JNQ00gICA9IHsgIDcsICAwLCAgNSB9LAkvKiBSaWdodCBNaWMgTWl4IEdhaW4vQXR0ZW4gKi8KKwlhZDE4NDNfUk1DTU0gID0geyAgNywgIDcsICAxIH0sCS8qIFJpZ2h0IE1pYyBNaXggTXV0ZSAqLworCWFkMTg0M19MTUNNICAgPSB7ICA3LCAgOCwgIDUgfSwJLyogTGVmdCBNaWMgTWl4IEdhaW4vQXR0ZW4gKi8KKwlhZDE4NDNfTE1DTU0gID0geyAgNywgMTUsICAxIH0sCS8qIExlZnQgTWljIE1peCBNdXRlICovCisJYWQxODQzX0hQT1MgICA9IHsgIDgsICA0LCAgMSB9LAkvKiBIZWFkcGhvbmUgT3V0cHV0IFZvbHRhZ2UgU3dpbmcgKi8KKwlhZDE4NDNfSFBPTSAgID0geyAgOCwgIDUsICAxIH0sCS8qIEhlYWRwaG9uZSBPdXRwdXQgTXV0ZSAqLworCWFkMTg0M19SREExRyAgPSB7ICA5LCAgMCwgIDYgfSwJLyogUmlnaHQgREFDMSBBbmFsb2cvRGlnaXRhbCBHYWluICovCisJYWQxODQzX1JEQTFHTSA9IHsgIDksICA3LCAgMSB9LAkvKiBSaWdodCBEQUMxIEFuYWxvZyBNdXRlICovCisJYWQxODQzX0xEQTFHICA9IHsgIDksICA4LCAgNiB9LAkvKiBMZWZ0IERBQzEgQW5hbG9nL0RpZ2l0YWwgR2FpbiAqLworCWFkMTg0M19MREExR00gPSB7ICA5LCAxNSwgIDEgfSwJLyogTGVmdCBEQUMxIEFuYWxvZyBNdXRlICovCisJYWQxODQzX1JEQTFBTSA9IHsgMTEsICA3LCAgMSB9LAkvKiBSaWdodCBEQUMxIERpZ2l0YWwgTXV0ZSAqLworCWFkMTg0M19MREExQU0gPSB7IDExLCAxNSwgIDEgfSwJLyogTGVmdCBEQUMxIERpZ2l0YWwgTXV0ZSAqLworCWFkMTg0M19BRExDICAgPSB7IDE1LCAgMCwgIDIgfSwJLyogQURDIExlZnQgU2FtcGxlIFJhdGUgU291cmNlICovCisJYWQxODQzX0FEUkMgICA9IHsgMTUsICAyLCAgMiB9LAkvKiBBREMgUmlnaHQgU2FtcGxlIFJhdGUgU291cmNlICovCisJYWQxODQzX0RBMUMgICA9IHsgMTUsICA4LCAgMiB9LAkvKiBEQUMxIFNhbXBsZSBSYXRlIFNvdXJjZSAqLworCWFkMTg0M19DMUMgICAgPSB7IDE3LCAgMCwgMTYgfSwJLyogQ2xvY2sgMSBTYW1wbGUgUmF0ZSBTZWxlY3QgKi8KKwlhZDE4NDNfQzJDICAgID0geyAyMCwgIDAsIDE2IH0sCS8qIENsb2NrIDEgU2FtcGxlIFJhdGUgU2VsZWN0ICovCisJYWQxODQzX0RBQURMICA9IHsgMjUsICA0LCAgMiB9LAkvKiBEaWdpdGFsIEFEQyBMZWZ0IFNvdXJjZSBTZWxlY3QgKi8KKwlhZDE4NDNfREFBRFIgID0geyAyNSwgIDYsICAyIH0sCS8qIERpZ2l0YWwgQURDIFJpZ2h0IFNvdXJjZSBTZWxlY3QgKi8KKwlhZDE4NDNfRFJTRkxUID0geyAyNSwgMTUsICAxIH0sCS8qIERpZ2l0YWwgUmVhbXBsZXIgRmlsdGVyIE1vZGUgKi8KKwlhZDE4NDNfQURMRiAgID0geyAyNiwgIDAsICAyIH0sIC8qIEFEQyBMZWZ0IENoYW5uZWwgRGF0YSBGb3JtYXQgKi8KKwlhZDE4NDNfQURSRiAgID0geyAyNiwgIDIsICAyIH0sIC8qIEFEQyBSaWdodCBDaGFubmVsIERhdGEgRm9ybWF0ICovCisJYWQxODQzX0FEVExLICA9IHsgMjYsICA0LCAgMSB9LAkvKiBBREMgVHJhbnNtaXQgTG9jayBNb2RlIFNlbGVjdCAqLworCWFkMTg0M19TQ0YgICAgPSB7IDI2LCAgNywgIDEgfSwJLyogU0NMSyBGcmVxdWVuY3kgU2VsZWN0ICovCisJYWQxODQzX0RBMUYgICA9IHsgMjYsICA4LCAgMiB9LAkvKiBEQUMxIERhdGEgRm9ybWF0IFNlbGVjdCAqLworCWFkMTg0M19EQTFTTSAgPSB7IDI2LCAxNCwgIDEgfSwJLyogREFDMSBTdGVyZW8vTW9ubyBNb2RlIFNlbGVjdCAqLworCWFkMTg0M19BRExFTiAgPSB7IDI3LCAgMCwgIDEgfSwJLyogQURDIExlZnQgQ2hhbm5lbCBFbmFibGUgKi8KKwlhZDE4NDNfQURSRU4gID0geyAyNywgIDEsICAxIH0sCS8qIEFEQyBSaWdodCBDaGFubmVsIEVuYWJsZSAqLworCWFkMTg0M19BQU1FTiAgPSB7IDI3LCAgNCwgIDEgfSwJLyogQW5hbG9nIHRvIEFuYWxvZyBNaXggRW5hYmxlICovCisJYWQxODQzX0FOQUVOICA9IHsgMjcsICA3LCAgMSB9LAkvKiBBbmFsb2cgQ2hhbm5lbCBFbmFibGUgKi8KKwlhZDE4NDNfREExRU4gID0geyAyNywgIDgsICAxIH0sCS8qIERBQzEgRW5hYmxlICovCisJYWQxODQzX0RBMkVOICA9IHsgMjcsICA5LCAgMSB9LAkvKiBEQUMyIEVuYWJsZSAqLworCWFkMTg0M19DMUVOICAgPSB7IDI4LCAxMSwgIDEgfSwJLyogQ2xvY2sgR2VuZXJhdG9yIDEgRW5hYmxlICovCisJYWQxODQzX0MyRU4gICA9IHsgMjgsIDEyLCAgMSB9LAkvKiBDbG9jayBHZW5lcmF0b3IgMiBFbmFibGUgKi8KKwlhZDE4NDNfUEROSSAgID0geyAyOCwgMTUsICAxIH07CS8qIENvbnZlcnRlciBQb3dlciBEb3duICovCisKKy8qCisgKiBUaGUgdmFyaW91cyByZWdpc3RlcnMgb2YgdGhlIEFEMTg0MyB1c2UgdGhyZWUgZGlmZmVyZW50IGZvcm1hdHMgZm9yCisgKiBzcGVjaWZ5aW5nIGdhaW4uICBUaGUgYWQxODQzX2dhaW4gc3RydWN0dXJlIHBhcmFtZXRlcml6ZXMgdGhlCisgKiBmb3JtYXRzLgorICovCisKK3R5cGVkZWYgc3RydWN0IGFkMTg0M19nYWluIHsKKworCWludAluZWdhdGl2ZTsJCS8qIG5vbnplcm8gaWYgZ2FpbiBpcyBuZWdhdGl2ZS4gKi8KKwljb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqbGZpZWxkOworCWNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICpyZmllbGQ7CisKK30gYWQxODQzX2dhaW5fdDsKKworc3RhdGljIGNvbnN0IGFkMTg0M19nYWluX3QgYWQxODQzX2dhaW5fUkVDTEVWCisJCQkJPSB7IDAsICZhZDE4NDNfTElHLCAgICZhZDE4NDNfUklHIH07CitzdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9MSU5FCisJCQkJPSB7IDEsICZhZDE4NDNfTFgxTSwgICZhZDE4NDNfUlgxTSB9Oworc3RhdGljIGNvbnN0IGFkMTg0M19nYWluX3QgYWQxODQzX2dhaW5fQ0QKKwkJCQk9IHsgMSwgJmFkMTg0M19MWDJNLCAgJmFkMTg0M19SWDJNIH07CitzdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9NSUMKKwkJCQk9IHsgMSwgJmFkMTg0M19MTUNNLCAgJmFkMTg0M19STUNNIH07CitzdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9QQ00KKwkJCQk9IHsgMSwgJmFkMTg0M19MREExRywgJmFkMTg0M19SREExRyB9OworCisvKiByZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFuIEFEMTg0MyBiaXRmaWVsZC4gKi8KKworc3RhdGljIGludCBhZDE4NDNfcmVhZF9iaXRzKGxpdGhpdW1fdCAqbGl0aCwgY29uc3QgYWQxODQzX2JpdGZpZWxkX3QgKmZpZWxkKQoreworCWludCB3ID0gbGlfcmVhZF9hZDE4NDNfcmVnKGxpdGgsIGZpZWxkLT5yZWcpOworCWludCB2YWwgPSB3ID4+IGZpZWxkLT5sb19iaXQgJiAoKDEgPDwgZmllbGQtPm5iaXRzKSAtIDEpOworCisJREJHWFYoImFkMTg0M19yZWFkX2JpdHMobGl0aD0weCVwLCBmaWVsZC0+eyVkICVkICVkfSkgcmV0dXJucyAweCV4XG4iLAorCSAgICAgIGxpdGgsIGZpZWxkLT5yZWcsIGZpZWxkLT5sb19iaXQsIGZpZWxkLT5uYml0cywgdmFsKTsKKworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiB3cml0ZSBhIG5ldyB2YWx1ZSB0byBhbiBBRDE4NDMgYml0ZmllbGQgYW5kIHJldHVybiB0aGUgb2xkIHZhbHVlLgorICovCisKK3N0YXRpYyBpbnQgYWQxODQzX3dyaXRlX2JpdHMobGl0aGl1bV90ICpsaXRoLAorCQkJICAgICBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZmllbGQsCisJCQkgICAgIGludCBuZXd2YWwpCit7CisJaW50IHcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgZmllbGQtPnJlZyk7CisJaW50IG1hc2sgPSAoKDEgPDwgZmllbGQtPm5iaXRzKSAtIDEpIDw8IGZpZWxkLT5sb19iaXQ7CisJaW50IG9sZHZhbCA9ICh3ICYgbWFzaykgPj4gZmllbGQtPmxvX2JpdDsKKwlpbnQgbmV3Yml0cyA9IChuZXd2YWwgPDwgZmllbGQtPmxvX2JpdCkgJiBtYXNrOworCXcgPSAodyAmIH5tYXNrKSB8IG5ld2JpdHM7CisJKHZvaWQpIGxpX3dyaXRlX2FkMTg0M19yZWcobGl0aCwgZmllbGQtPnJlZywgdyk7CisKKwlEQkdYVigiYWQxODQzX3dyaXRlX2JpdHMobGl0aD0weCVwLCBmaWVsZC0+eyVkICVkICVkfSwgdmFsPTB4JXgpICIKKwkgICAgICAicmV0dXJucyAweCV4XG4iLAorCSAgICAgIGxpdGgsIGZpZWxkLT5yZWcsIGZpZWxkLT5sb19iaXQsIGZpZWxkLT5uYml0cywgbmV3dmFsLAorCSAgICAgIG9sZHZhbCk7CisKKwlyZXR1cm4gb2xkdmFsOworfQorCisvKgorICogYWQxODQzX3JlYWRfbXVsdGkgcmVhZHMgbXVsdGlwbGUgYml0ZmllbGRzIGZyb20gdGhlIHNhbWUgQUQxODQzCisgKiByZWdpc3Rlci4gIEl0IHVzZXMgYSBzaW5nbGUgcmVhZCBjeWNsZSB0byBkbyBpdC4gIChSZWFkaW5nIHRoZQorICogYWQxODQzIHJlcXVpcmVzIDI1NiBiaXQgdGltZXMgYXQgMTIuMjg4IE1Ieiwgb3IgbmVhcmx5IDIwCisgKiBtaWNyb3NlY29uZHMuKQorICoKKyAqIENhbGxlZCBpa2UgdGhpcy4KKyAqCisgKiAgYWQxODQzX3JlYWRfbXVsdGkobGl0aCwgbmZpZWxkcywKKyAqCQkgICAgICAmYWQxODQzX0ZJRUxEMSwgJnZhbDEsCisgKgkJICAgICAgJmFkMTg0M19GSUVMRDIsICZ2YWwyLCAuLi4pOworICovCisKK3N0YXRpYyB2b2lkIGFkMTg0M19yZWFkX211bHRpKGxpdGhpdW1fdCAqbGl0aCwgaW50IGFyZ2NvdW50LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwljb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZnA7CisJaW50IHcgPSAwLCBtYXNrLCAqdmFsdWUsIHJlZyA9IC0xOworCisJdmFfc3RhcnQoYXAsIGFyZ2NvdW50KTsKKwl3aGlsZSAoLS1hcmdjb3VudCA+PSAwKSB7CisJCWZwID0gdmFfYXJnKGFwLCBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqKTsKKwkJdmFsdWUgPSB2YV9hcmcoYXAsIGludCAqKTsKKwkJaWYgKHJlZyA9PSAtMSkgeworCQkJcmVnID0gZnAtPnJlZzsKKwkJCXcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgcmVnKTsKKwkJfQorCQlBU1NFUlQocmVnID09IGZwLT5yZWcpOworCQltYXNrID0gKDEgPDwgZnAtPm5iaXRzKSAtIDE7CisJCSp2YWx1ZSA9IHcgPj4gZnAtPmxvX2JpdCAmIG1hc2s7CisJfQorCXZhX2VuZChhcCk7Cit9CisKKy8qCisgKiBhZDE4NDNfd3JpdGVfbXVsdGkgc3RvcmVzIG11bHRpcGxlIGJpdGZpZWxkcyBpbnRvIHRoZSBzYW1lIEFEMTg0MworICogcmVnaXN0ZXIuICBJdCB1c2VzIG9uZSByZWFkIGFuZCBvbmUgd3JpdGUgY3ljbGUgdG8gZG8gaXQuCisgKgorICogQ2FsbGVkIGxpa2UgdGhpcy4KKyAqCisgKiAgYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIG5maWVsZHMsCisgKgkJICAgICAgICZhZDE4NDNfRklFTEQxLCB2YWwxLAorICoJCSAgICAgICAmYWQxODQzX0ZJRUxGMiwgdmFsMiwgLi4uKTsKKyAqLworCitzdGF0aWMgdm9pZCBhZDE4NDNfd3JpdGVfbXVsdGkobGl0aGl1bV90ICpsaXRoLCBpbnQgYXJnY291bnQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByZWc7CisJY29uc3QgYWQxODQzX2JpdGZpZWxkX3QgKmZwOworCWludCB2YWx1ZTsKKwlpbnQgdywgbSwgbWFzaywgYml0czsKKworCW1hc2sgPSAwOworCWJpdHMgPSAwOworCXJlZyA9IC0xOworCisJdmFfc3RhcnQoYXAsIGFyZ2NvdW50KTsKKwl3aGlsZSAoLS1hcmdjb3VudCA+PSAwKSB7CisJCWZwID0gdmFfYXJnKGFwLCBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqKTsKKwkJdmFsdWUgPSB2YV9hcmcoYXAsIGludCk7CisJCWlmIChyZWcgPT0gLTEpCisJCQlyZWcgPSBmcC0+cmVnOworCQlBU1NFUlQoZnAtPnJlZyA9PSByZWcpOworCQltID0gKCgxIDw8IGZwLT5uYml0cykgLSAxKSA8PCBmcC0+bG9fYml0OworCQltYXNrIHw9IG07CisJCWJpdHMgfD0gKHZhbHVlIDw8IGZwLT5sb19iaXQpICYgbTsKKwl9CisJdmFfZW5kKGFwKTsKKwlBU1NFUlQoIShiaXRzICYgfm1hc2spKTsKKwlpZiAofm1hc2sgJiAweEZGRkYpCisJCXcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgcmVnKTsKKwllbHNlCisJCXcgPSAwOworCXcgPSAodyAmIH5tYXNrKSB8IGJpdHM7CisJKHZvaWQpIGxpX3dyaXRlX2FkMTg0M19yZWcobGl0aCwgcmVnLCB3KTsKK30KKworLyoKKyAqIGFkMTg0M19nZXRfZ2FpbiByZWFkcyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGFuZCBleHRyYWN0cyB0aGUgZ2FpbiB2YWx1ZQorICogdXNpbmcgdGhlIHN1cHBsaWVkIGdhaW4gdHlwZS4gIEl0IHJldHVybnMgdGhlIGdhaW4gaW4gT1NTIGZvcm1hdC4KKyAqLworCitzdGF0aWMgaW50IGFkMTg0M19nZXRfZ2FpbihsaXRoaXVtX3QgKmxpdGgsIGNvbnN0IGFkMTg0M19nYWluX3QgKmdwKQoreworCWludCBsZywgcmc7CisJdW5zaWduZWQgc2hvcnQgbWFzayA9ICgxIDw8IGdwLT5sZmllbGQtPm5iaXRzKSAtIDE7CisKKwlhZDE4NDNfcmVhZF9tdWx0aShsaXRoLCAyLCBncC0+bGZpZWxkLCAmbGcsIGdwLT5yZmllbGQsICZyZyk7CisJaWYgKGdwLT5uZWdhdGl2ZSkgeworCQlsZyA9IG1hc2sgLSBsZzsKKwkJcmcgPSBtYXNrIC0gcmc7CisJfQorCWxnID0gKGxnICogMTAwICsgKG1hc2sgPj4gMSkpIC8gbWFzazsKKwlyZyA9IChyZyAqIDEwMCArIChtYXNrID4+IDEpKSAvIG1hc2s7CisJcmV0dXJuIGxnIDw8IDAgfCByZyA8PCA4OworfQorCisvKgorICogU2V0IGFuIGF1ZGlvIGNoYW5uZWwncyBnYWluLiBDb252ZXJ0cyBmcm9tIE9TUyBmb3JtYXQgdG8gQUQxODQzJ3MKKyAqIGZvcm1hdC4KKyAqCisgKiBSZXR1cm5zIHRoZSBuZXcgZ2Fpbiwgd2hpY2ggbWF5IGJlIGxvd2VyIHRoYW4gdGhlIG9sZCBnYWluLgorICovCisKK3N0YXRpYyBpbnQgYWQxODQzX3NldF9nYWluKGxpdGhpdW1fdCAqbGl0aCwKKwkJCSAgIGNvbnN0IGFkMTg0M19nYWluX3QgKmdwLAorCQkJICAgaW50IG5ld3ZhbCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBtYXNrID0gKDEgPDwgZ3AtPmxmaWVsZC0+bmJpdHMpIC0gMTsKKworCWludCBsZyA9IG5ld3ZhbCA+PiAwICYgMHhGRjsKKwlpbnQgcmcgPSBuZXd2YWwgPj4gODsKKwlpZiAobGcgPCAwIHx8IGxnID4gMTAwIHx8IHJnIDwgMCB8fCByZyA+IDEwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbGcgPSAobGcgKiBtYXNrICsgKG1hc2sgPj4gMSkpIC8gMTAwOworCXJnID0gKHJnICogbWFzayArIChtYXNrID4+IDEpKSAvIDEwMDsKKwlpZiAoZ3AtPm5lZ2F0aXZlKSB7CisJCWxnID0gbWFzayAtIGxnOworCQlyZyA9IG1hc2sgLSByZzsKKwl9CisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsIGdwLT5sZmllbGQsIGxnLCBncC0+cmZpZWxkLCByZyk7CisJcmV0dXJuIGFkMTg0M19nZXRfZ2FpbihsaXRoLCBncCk7Cit9CisKKy8qIFJldHVybnMgdGhlIGN1cnJlbnQgcmVjb3JkaW5nIHNvdXJjZSwgaW4gT1NTIGZvcm1hdC4gKi8KKworc3RhdGljIGludCBhZDE4NDNfZ2V0X3JlY3NyYyhsaXRoaXVtX3QgKmxpdGgpCit7CisJaW50IGxzID0gYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX0xTUyk7CisKKwlzd2l0Y2ggKGxzKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gU09VTkRfTUFTS19NSUM7CisJY2FzZSAyOgorCQlyZXR1cm4gU09VTkRfTUFTS19MSU5FOworCWNhc2UgMzoKKwkJcmV0dXJuIFNPVU5EX01BU0tfQ0Q7CisJY2FzZSA2OgorCQlyZXR1cm4gU09VTkRfTUFTS19QQ007CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gLTE7CisJfQorfQorCisvKgorICogRW5hYmxlL2Rpc2FibGUgZGlnaXRhbCByZXNhbXBsZSBtb2RlIGluIHRoZSBBRDE4NDMuCisgKgorICogVGhlIEFEMTg0MyByZXF1aXJlcyB0aGF0IEFETCwgQURSLCBEQTEgYW5kIERBMiBiZSBwb3dlcmVkIGRvd24KKyAqIHdoaWxlIHN3aXRjaGluZyBtb2Rlcy4gIFNvIHdlIHNhdmUgREExJ3Mgc3RhdGUgKERBMidzIHN0YXRlIGlzIG5vdAorICogaW50ZXJlc3RpbmcpLCBwb3dlciB0aGVtIGRvd24sIHN3aXRjaCBpbnRvL291dCBvZiByZXNhbXBsZSBtb2RlLAorICogcG93ZXIgdGhlbSB1cCwgYW5kIHJlc3RvcmUgc3RhdGUuCisgKgorICogVGhpcyB3aWxsIGNhdXNlIGF1ZGlibGUgZ2xpdGNoZXMgaWYgRC9BIG9yIEEvRCBpcyBnb2luZyBvbiwgc28gdGhlCisgKiBkcml2ZXIgZGlzYWxsb3dzIHRoYXQgKGluIG1peGVyX3dyaXRlX2lvY3RsKCkpLgorICoKKyAqIFRoZSBvcGVuIHF1ZXN0aW9uIGlzLCBpcyB0aGlzIHdvcnRoIGRvaW5nPyAgSSdtIGxlYXZpbmcgaXQgaW4sCisgKiBiZWNhdXNlIGl0J3Mgd3JpdHRlbiwgYnV0Li4uCisgKi8KKworc3RhdGljIHZvaWQgYWQxODQzX3NldF9yZXNhbXBsZV9tb2RlKGxpdGhpdW1fdCAqbGl0aCwgaW50IG9ub2ZmKQoreworCS8qIFNhdmUgREExIG11dGUgYW5kIGdhaW4gKGFkZHIgOSBpcyBEQTEgYW5hbG9nIGdhaW4vYXR0ZW51YXRpb24pICovCisJaW50IHNhdmVfZGExID0gbGlfcmVhZF9hZDE4NDNfcmVnKGxpdGgsIDkpOworCisJLyogUG93ZXIgZG93biBBL0QgYW5kIEQvQS4gKi8KKwlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgNCwKKwkJCSAgICZhZDE4NDNfREExRU4sIDAsCisJCQkgICAmYWQxODQzX0RBMkVOLCAwLAorCQkJICAgJmFkMTg0M19BRExFTiwgMCwKKwkJCSAgICZhZDE4NDNfQURSRU4sIDApOworCisJLyogU3dpdGNoIG1vZGUgKi8KKwlBU1NFUlQob25vZmYgPT0gMCB8fCBvbm9mZiA9PSAxKTsKKwlhZDE4NDNfd3JpdGVfYml0cyhsaXRoLCAmYWQxODQzX0RSU0ZMVCwgb25vZmYpOworCisgCS8qIFBvd2VyIHVwIEEvRCBhbmQgRC9BLiAqLworCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAzLAorCQkJICAgJmFkMTg0M19EQTFFTiwgMSwKKwkJCSAgICZhZDE4NDNfQURMRU4sIDEsCisJCQkgICAmYWQxODQzX0FEUkVOLCAxKTsKKworCS8qIFJlc3RvcmUgREExIG11dGUgYW5kIGdhaW4uICovCisJbGlfd3JpdGVfYWQxODQzX3JlZyhsaXRoLCA5LCBzYXZlX2RhMSk7Cit9CisKKy8qCisgKiBTZXQgcmVjb3JkaW5nIHNvdXJjZS4gIEFyZyBuZXdzcmMgc3BlY2lmaWVzIGFuIE9TUyBjaGFubmVsIG1hc2suCisgKgorICogVGhlIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHdoZW4gd2Ugc3dpdGNoIGludG8vb3V0IG9mIGxvb3BiYWNrIG1vZGUKKyAqIChpLmUuLCBzcmMgPSBTT1VORF9NQVNLX1BDTSksIHdlIGNoYW5nZSB0aGUgQUQxODQzIGludG8vb3V0IG9mCisgKiBkaWdpdGFsIHJlc2FtcGxpbmcgbW9kZS4KKyAqCisgKiBSZXR1cm5zIG5ld3NyYyBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IGFkMTg0M19zZXRfcmVjc3JjKGxpdGhpdW1fdCAqbGl0aCwgaW50IG5ld3NyYykKK3sKKwlpbnQgYml0czsKKwlpbnQgb2xkYml0czsKKworCXN3aXRjaCAobmV3c3JjKSB7CisJY2FzZSBTT1VORF9NQVNLX1BDTToKKwkJYml0cyA9IDY7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NQVNLX01JQzoKKwkJYml0cyA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NQVNLX0xJTkU6CisJCWJpdHMgPSAyOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUFTS19DRDoKKwkJYml0cyA9IDM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW9sZGJpdHMgPSBhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfTFNTKTsKKwlpZiAobmV3c3JjID09IFNPVU5EX01BU0tfUENNICYmIG9sZGJpdHMgIT0gNikgeworCQlEQkdQKCJlbmFibGluZyBkaWdpdGFsIHJlc2FtcGxlIG1vZGVcbiIpOworCQlhZDE4NDNfc2V0X3Jlc2FtcGxlX21vZGUobGl0aCwgMSk7CisJCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLAorCQkJCSAgICZhZDE4NDNfREFBREwsIDIsCisJCQkJICAgJmFkMTg0M19EQUFEUiwgMik7CisJfSBlbHNlIGlmIChuZXdzcmMgIT0gU09VTkRfTUFTS19QQ00gJiYgb2xkYml0cyA9PSA2KSB7CisJCURCR1AoImRpc2FibGluZyBkaWdpdGFsIHJlc2FtcGxlIG1vZGVcbiIpOworCQlhZDE4NDNfc2V0X3Jlc2FtcGxlX21vZGUobGl0aCwgMCk7CisJCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLAorCQkJCSAgICZhZDE4NDNfREFBREwsIDAsCisJCQkJICAgJmFkMTg0M19EQUFEUiwgMCk7CisJfQorCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xTUywgYml0cywgJmFkMTg0M19SU1MsIGJpdHMpOworCXJldHVybiBuZXdzcmM7Cit9CisKKy8qCisgKiBSZXR1cm4gY3VycmVudCBvdXRwdXQgc291cmNlcywgaW4gT1NTIGZvcm1hdC4KKyAqLworCitzdGF0aWMgaW50IGFkMTg0M19nZXRfb3V0c3JjKGxpdGhpdW1fdCAqbGl0aCkKK3sKKwlpbnQgcGNtLCBsaW5lLCBtaWMsIGNkOworCisJcGNtICA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MREExR00pID8gMCA6IFNPVU5EX01BU0tfUENNOworCWxpbmUgPSBhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfTFgxTU0pICA/IDAgOiBTT1VORF9NQVNLX0xJTkU7CisJY2QgICA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MWDJNTSkgID8gMCA6IFNPVU5EX01BU0tfQ0Q7CisJbWljICA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MTUNNTSkgID8gMCA6IFNPVU5EX01BU0tfTUlDOworCisJcmV0dXJuIHBjbSB8IGxpbmUgfCBjZCB8IG1pYzsKK30KKworLyoKKyAqIFNldCBvdXRwdXQgc291cmNlcy4gIEFyZyBpcyBhIG1hc2sgb2YgYWN0aXZlIHNvdXJjZXMgaW4gT1NTIGZvcm1hdC4KKyAqCisgKiBSZXR1cm5zIHNvdXJjZSBtYXNrIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgYWQxODQzX3NldF9vdXRzcmMobGl0aGl1bV90ICpsaXRoLCBpbnQgbWFzaykKK3sKKwlpbnQgcGNtLCBsaW5lLCBtaWMsIGNkOworCisJaWYgKG1hc2sgJiB+KFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKKwkJICAgICBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19NSUMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwY20gID0gKG1hc2sgJiBTT1VORF9NQVNLX1BDTSkgID8gMCA6IDE7CisJbGluZSA9IChtYXNrICYgU09VTkRfTUFTS19MSU5FKSA/IDAgOiAxOworCW1pYyAgPSAobWFzayAmIFNPVU5EX01BU0tfTUlDKSAgPyAwIDogMTsKKwljZCAgID0gKG1hc2sgJiBTT1VORF9NQVNLX0NEKSAgID8gMCA6IDE7CisKKwlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MREExR00sIHBjbSwgJmFkMTg0M19SREExR00sIHBjbSk7CisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfTFgxTU0sIGxpbmUsICZhZDE4NDNfUlgxTU0sIGxpbmUpOworCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xYMk1NLCBjZCwgICAmYWQxODQzX1JYMk1NLCBjZCk7CisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfTE1DTU0sIG1pYywgICZhZDE4NDNfUk1DTU0sIG1pYyk7CisKKwlyZXR1cm4gbWFzazsKK30KKworLyogU2V0dXAgYWQxODQzIGZvciBEL0EgY29udmVyc2lvbi4gKi8KKworc3RhdGljIHZvaWQgYWQxODQzX3NldHVwX2RhYyhsaXRoaXVtX3QgKmxpdGgsCisJCQkgICAgIGludCBmcmFtZXJhdGUsCisJCQkgICAgIGludCBmbXQsCisJCQkgICAgIGludCBjaGFubmVscykKK3sKKwlpbnQgYWRfZm10ID0gMCwgYWRfbW9kZSA9IDA7CisKKwlEQkdFVigiKGxpdGg9MHglcCwgZnJhbWVyYXRlPSVkLCBmbXQ9JWQsIGNoYW5uZWxzPSVkKVxuIiwKKwkgICAgICBsaXRoLCBmcmFtZXJhdGUsIGZtdCwgY2hhbm5lbHMpOworCisJc3dpdGNoIChmbXQpIHsKKwljYXNlIEFGTVRfUzg6CQlhZF9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfVTg6CQlhZF9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfUzE2X0xFOglhZF9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfTVVfTEFXOglhZF9mbXQgPSAyOyBicmVhazsKKwljYXNlIEFGTVRfQV9MQVc6CWFkX2ZtdCA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CQlBU1NFUlQoMCk7CisJfQorCisJc3dpdGNoIChjaGFubmVscykgeworCWNhc2UgMjoJCQlhZF9tb2RlID0gMDsgYnJlYWs7CisJY2FzZSAxOgkJCWFkX21vZGUgPSAxOyBicmVhazsKKwlkZWZhdWx0OgkJQVNTRVJUKDApOworCX0KKwkJCisJREJHUFYoImFkX21vZGUgPSAlZCwgYWRfZm10ID0gJWRcbiIsIGFkX21vZGUsIGFkX2ZtdCk7CisJQVNTRVJUKGZyYW1lcmF0ZSA+PSA0MDAwICYmIGZyYW1lcmF0ZSA8PSA0OTAwMCk7CisJYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19DMUMsIGZyYW1lcmF0ZSk7CisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsCisJCQkgICAmYWQxODQzX0RBMVNNLCBhZF9tb2RlLCAmYWQxODQzX0RBMUYsIGFkX2ZtdCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0M19zaHV0ZG93bl9kYWMobGl0aGl1bV90ICpsaXRoKQoreworCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfREExRiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0M19zZXR1cF9hZGMobGl0aGl1bV90ICpsaXRoLCBpbnQgZnJhbWVyYXRlLCBpbnQgZm10LCBpbnQgY2hhbm5lbHMpCit7CisJaW50IGRhX2ZtdCA9IDA7CisKKwlEQkdFVigiKGxpdGg9MHglcCwgZnJhbWVyYXRlPSVkLCBmbXQ9JWQsIGNoYW5uZWxzPSVkKVxuIiwKKwkgICAgICBsaXRoLCBmcmFtZXJhdGUsIGZtdCwgY2hhbm5lbHMpOworCisJc3dpdGNoIChmbXQpIHsKKwljYXNlIEFGTVRfUzg6CQlkYV9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfVTg6CQlkYV9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfUzE2X0xFOglkYV9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfTVVfTEFXOglkYV9mbXQgPSAyOyBicmVhazsKKwljYXNlIEFGTVRfQV9MQVc6CWRhX2ZtdCA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CQlBU1NFUlQoMCk7CisJfQorCisJREJHUFYoImRhX2ZtdCA9ICVkXG4iLCBkYV9mbXQpOworCUFTU0VSVChmcmFtZXJhdGUgPj0gNDAwMCAmJiBmcmFtZXJhdGUgPD0gNDkwMDApOworCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfQzJDLCBmcmFtZXJhdGUpOworCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLAorCQkJICAgJmFkMTg0M19BRExGLCBkYV9mbXQsICZhZDE4NDNfQURSRiwgZGFfZm10KTsKK30KKworc3RhdGljIHZvaWQgYWQxODQzX3NodXRkb3duX2FkYyhsaXRoaXVtX3QgKmxpdGgpCit7CisJLyogbm90aGluZyB0byBkbyAqLworfQorCisvKgorICogRnVsbHkgaW5pdGlhbGl6ZSB0aGUgYWQxODQzLiAgQXMgZGVzY3JpYmVkIGluIHRoZSBBRDE4NDMgZGF0YQorICogc2hlZXQsIHNlY3Rpb24gIlNUQVJULVVQIFNFUVVFTkNFIi4gIFRoZSBudW1iZXJlZCBjb21tZW50cyBhcmUKKyAqIHN1YnNlY3Rpb24gaGVhZGluZ3MgZnJvbSB0aGUgZGF0YSBzaGVldC4gIFNlZSB0aGUgZGF0YSBzaGVldCwgcGFnZXMKKyAqIDUyLTU0LCBmb3IgbW9yZSBpbmZvLgorICoKKyAqIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLiAgKi8KKworc3RhdGljIGludCBfX2luaXQgYWQxODQzX2luaXQobGl0aGl1bV90ICpsaXRoKQoreworCXVuc2lnbmVkIGxvbmcgbGF0ZXI7CisJaW50IGVycjsKKworCWVyciA9IGxpX2luaXQobGl0aCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfSU5JVCkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInZ3c25kIHNvdW5kOiBBRDE4NDMgd29uJ3QgaW5pdGlhbGl6ZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfU0NGLCAxKTsKKworCS8qIDQuIFB1dCB0aGUgY29udmVyc2lvbiByZXNvdXJjZXMgaW50byBzdGFuZGJ5LiAqLworCisJYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19QRE5JLCAwKTsKKwlsYXRlciA9IGppZmZpZXMgKyBIWiAvIDI7CS8qIHJvdWdobHkgaGFsZiBhIHNlY29uZCAqLworCURCR0RPKHNodXRfdXArKyk7CisJd2hpbGUgKGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19QRE5PKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXRlcikpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJ2d3NuZCBhdWRpbzogQUQxODQzIHdvbid0IHBvd2VyIHVwXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCURCR0RPKHNodXRfdXAtLSk7CisKKwkvKiA1LiBQb3dlciB1cCB0aGUgY2xvY2sgZ2VuZXJhdG9ycyBhbmQgZW5hYmxlIGNsb2NrIG91dHB1dCBwaW5zLiAqLworCisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfQzFFTiwgMSwgJmFkMTg0M19DMkVOLCAxKTsKKworCS8qIDYuIENvbmZpZ3VyZSBjb252ZXJzaW9uIHJlc291cmNlcyB3aGlsZSB0aGV5IGFyZSBpbiBzdGFuZGJ5LiAqLworCisgCS8qIERBQzEgdXNlcyBjbG9jayAxIGFzIHNvdXJjZSwgQURDIHVzZXMgY2xvY2sgMi4gIEFsd2F5cy4gKi8KKworCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAzLAorCQkJICAgJmFkMTg0M19EQTFDLCAxLAorCQkJICAgJmFkMTg0M19BRExDLCAyLAorCQkJICAgJmFkMTg0M19BRFJDLCAyKTsKKworCS8qIDcuIEVuYWJsZSBjb252ZXJzaW9uIHJlc291cmNlcy4gKi8KKworCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfQURUTEssIDEpOworCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCA1LAorCQkJICAgJmFkMTg0M19BTkFFTiwgMSwKKwkJCSAgICZhZDE4NDNfQUFNRU4sIDEsCisJCQkgICAmYWQxODQzX0RBMUVOLCAxLAorCQkJICAgJmFkMTg0M19BRExFTiwgMSwKKwkJCSAgICZhZDE4NDNfQURSRU4sIDEpOworCisJLyogOC4gQ29uZmlndXJlIGNvbnZlcnNpb24gcmVzb3VyY2VzIHdoaWxlIHRoZXkgYXJlIGVuYWJsZWQuICovCisKKwlhZDE4NDNfd3JpdGVfYml0cyhsaXRoLCAmYWQxODQzX0RBMUMsIDEpOworCisJLyogVW5tdXRlIGFsbCBjaGFubmVscy4gKi8KKworCWFkMTg0M19zZXRfb3V0c3JjKGxpdGgsCisJCQkgIChTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8CisJCQkgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QpKTsKKwlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MREExQU0sIDAsICZhZDE4NDNfUkRBMUFNLCAwKTsKKworCS8qIFNldCBkZWZhdWx0IHJlY29yZGluZyBzb3VyY2UgdG8gTGluZSBJbiBhbmQgc2V0CisJICogbWljIGdhaW4gdG8gKzIwIGRCLgorCSAqLworCisJYWQxODQzX3NldF9yZWNzcmMobGl0aCwgU09VTkRfTUFTS19MSU5FKTsKKwlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MTUdFLCAxLCAmYWQxODQzX1JNR0UsIDEpOworCisJLyogU2V0IFNwZWFrZXIgT3V0IGxldmVsIHRvICsvLSA0ViBhbmQgdW5tdXRlIGl0LiAqLworCisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfSFBPUywgMSwgJmFkMTg0M19IUE9NLCAwKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ00gSS9PICovCisKKyNkZWZpbmUgUkVBRF9JTlRSX01BU0sgIChMSV9JTlRSX0NPTU0xX1RSSUcgfCBMSV9JTlRSX0NPTU0xX09WRVJGTE9XKQorI2RlZmluZSBXUklURV9JTlRSX01BU0sgKExJX0lOVFJfQ09NTTJfVFJJRyB8IExJX0lOVFJfQ09NTTJfVU5ERVJGTE9XKQorCit0eXBlZGVmIGVudW0gdndzbmRfcG9ydF9zd3N0YXRlIHsJLyogc29mdHdhcmUgc3RhdGUgKi8KKwlTV19PRkYsCisJU1dfSU5JVElBTCwKKwlTV19SVU4sCisJU1dfRFJBSU4sCit9IHZ3c25kX3BvcnRfc3dzdGF0ZV90OworCit0eXBlZGVmIGVudW0gdndzbmRfcG9ydF9od3N0YXRlIHsJLyogaGFyZHdhcmUgc3RhdGUgKi8KKwlIV19TVE9QUEVELAorCUhXX1JVTk5JTkcsCit9IHZ3c25kX3BvcnRfaHdzdGF0ZV90OworCisvKgorICogVGhlc2UgZmxhZ3MgYXJlIHJlYWQgYnkgSVNSLCBidXQgb25seSB3cml0dGVuIGF0IGJhc2VsaW5lLgorICovCisKK3R5cGVkZWYgZW51bSB2d3NuZF9wb3J0X2ZsYWdzIHsKKwlESVNBQkxFRCA9IDEgPDwgMCwKKwlFUkZMT1dOICA9IDEgPDwgMSwJCS8qIG92ZXJmbG93biBvciB1bmRlcmZsb3duICovCisJSFdfQlVTWSAgPSAxIDw8IDIsCit9IHZ3c25kX3BvcnRfZmxhZ3NfdDsKKworLyoKKyAqIHZ3c25kX3BvcnQgaXMgdGhlIHBlci1wb3J0IGRhdGEgc3RydWN0dXJlLiAgRWFjaCBkZXZpY2UgaGFzIHR3bworICogcG9ydHMsIG9uZSBmb3IgaW5wdXQgYW5kIG9uZSBmb3Igb3V0cHV0LgorICoKKyAqIExvY2tpbmc6CisgKgorICoJcG9ydC0+bG9jayBwcm90ZWN0czogaHdzdGF0ZSwgZmxhZ3MsIHN3Yl9baXVdX2F2YWlsLgorICoKKyAqCWRldmMtPmlvX3NlbWEgcHJvdGVjdHM6IHN3c3RhdGUsIHN3XyosIHN3Yl9baXVdX2lkeC4KKyAqCisgKglldmVyeXRoaW5nIGVsc2UgaXMgb25seSB3cml0dGVuIGJ5IG9wZW4vcmVsZWFzZSBvcgorICoJcGNtX3tzZXR1cCxzaHV0ZG93bn0oKSwgd2hpY2ggYXJlIHNlcmlhbGl6ZWQgYnkgYQorICoJY29tYmluYXRpb24gb2YgZGV2Yy0+b3Blbl9zZW1hIGFuZCBkZXZjLT5pb19zZW1hLgorICovCisKK3R5cGVkZWYgc3RydWN0IHZ3c25kX3BvcnQgeworCisJc3BpbmxvY2tfdAlsb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOworCXZ3c25kX3BvcnRfc3dzdGF0ZV90IHN3c3RhdGU7CisJdndzbmRfcG9ydF9od3N0YXRlX3QgaHdzdGF0ZTsKKwl2d3NuZF9wb3J0X2ZsYWdzX3QgZmxhZ3M7CisKKwlpbnQJCXN3X2NoYW5uZWxzOworCWludAkJc3dfc2FtcGxlZm10OworCWludAkJc3dfZnJhbWVyYXRlOworCWludAkJc2FtcGxlX3NpemU7CisJaW50CQlmcmFtZV9zaXplOworCXVuc2lnbmVkIGludAl6ZXJvX3dvcmQ7CS8qIHplcm8gZm9yIHRoZSBzYW1wbGUgZm9ybWF0ICovCisKKwlpbnQJCXN3X2ZyYWdzaGlmdDsKKwlpbnQJCXN3X2ZyYWdjb3VudDsKKwlpbnQJCXN3X3N1YmRpdnNoaWZ0OworCisJdW5zaWduZWQgaW50CWh3X2ZyYWdzaGlmdDsKKwl1bnNpZ25lZCBpbnQJaHdfZnJhZ3NpemU7CisJdW5zaWduZWQgaW50CWh3X2ZyYWdjb3VudDsKKworCWludAkJaHdidWZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCWh3YnVmX3BhZGRyOworCXVuc2lnbmVkIGxvbmcJaHdidWZfdmFkZHI7CisJdm9pZCAqCQlod2J1ZjsJCS8qIGh3YnVmID09IGh3YnVmX3ZhZGRyICovCisJaW50CQlod2J1Zl9tYXg7CS8qIG1heCBieXRlcyB0byBwcmVsb2FkICovCisKKwl2b2lkICoJCXN3YnVmOworCXVuc2lnbmVkIGludAlzd2J1Zl9zaXplOwkvKiBzaXplIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50CXN3Yl91X2lkeDsJLyogaW5kZXggb2YgbmV4dCB1c2VyIGJ5dGUgKi8KKwl1bnNpZ25lZCBpbnQJc3diX2lfaWR4OwkvKiBpbmRleCBvZiBuZXh0IGludHIgYnl0ZSAqLworCXVuc2lnbmVkIGludAlzd2JfdV9hdmFpbDsJLyogIyBieXRlcyBhdmFpbCB0byB1c2VyICovCisJdW5zaWduZWQgaW50CXN3Yl9pX2F2YWlsOwkvKiAjIGJ5dGVzIGF2YWlsIHRvIGludHIgKi8KKworCWRtYV9jaGFuX3QJY2hhbjsKKworCS8qIEFjY291bnRpbmcgKi8KKworCWludAkJYnl0ZV9jb3VudDsKKwlpbnQJCWZyYWdfY291bnQ7CisJaW50CQlNU0Nfb2Zmc2V0OworCit9IHZ3c25kX3BvcnRfdDsKKworLyogdndzbmRfZGV2IGlzIHRoZSBwZXItZGV2aWNlIGRhdGEgc3RydWN0dXJlLiAqLworCit0eXBlZGVmIHN0cnVjdCB2d3NuZF9kZXYgeworCXN0cnVjdCB2d3NuZF9kZXYgKm5leHRfZGV2OworCWludAkJYXVkaW9fbWlub3I7CS8qIG1pbm9yIG51bWJlciBvZiBhdWRpbyBkZXZpY2UgKi8KKwlpbnQJCW1peGVyX21pbm9yOwkvKiBtaW5vciBudW1iZXIgb2YgbWl4ZXIgZGV2aWNlICovCisKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtYTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGlvX3NlbWE7CisJc3RydWN0IHNlbWFwaG9yZSBtaXhfc2VtYTsKKwltb2RlX3QJCW9wZW5fbW9kZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwlsaXRoaXVtX3QJbGl0aDsKKworCXZ3c25kX3BvcnRfdAlycG9ydDsKKwl2d3NuZF9wb3J0X3QJd3BvcnQ7Cit9IHZ3c25kX2Rldl90OworCitzdGF0aWMgdndzbmRfZGV2X3QgKnZ3c25kX2Rldl9saXN0OwkvKiBsaW5rZWQgbGlzdCBvZiBhbGwgZGV2aWNlcyAqLworCitzdGF0aWMgYXRvbWljX3QgdndzbmRfdXNlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CisKKyMgZGVmaW5lIElOQ19VU0VfQ09VTlQgKGF0b21pY19pbmMoJnZ3c25kX3VzZV9jb3VudCkpCisjIGRlZmluZSBERUNfVVNFX0NPVU5UIChhdG9taWNfZGVjKCZ2d3NuZF91c2VfY291bnQpKQorIyBkZWZpbmUgSU5fVVNFICAgICAgICAoYXRvbWljX3JlYWQoJnZ3c25kX3VzZV9jb3VudCkgIT0gMCkKKworLyoKKyAqIExpdGhpdW0gY2FuIG9ubHkgRE1BIG11bHRpcGxlcyBvZiAzMiBieXRlcy4gIEl0cyBETUEgYnVmZmVyIG1heQorICogYmUgdXAgdG8gOCBLYi4gIFRoaXMgZHJpdmVyIGFsd2F5cyB1c2VzIDggS2IuCisgKgorICogTWVtb3J5IGJ1ZyB3b3JrYXJvdW5kIC0tIEknbSBub3Qgc3VyZSB3aGF0J3MgZ29pbmcgb24gaGVyZSwgYnV0CisgKiBzb21laG93IHBjbV9jb3B5X291dCgpIHdhcyB0cmlnZ2VyaW5nIHNlZ3YncyBnb2luZyBvbiB0byB0aGUgbmV4dAorICogcGFnZSBvZiB0aGUgaHcgYnVmZmVyLiAgU28sIEkgbWFrZSB0aGUgaHcgYnVmZmVyIG9uZSBzaXplIGJpZ2dlcgorICogdGhhbiB3ZSBhY3R1YWxseSB1c2UuICBUaGF0IHdheSwgdGhlIGZvbGxvd2luZyBwYWdlIGlzIGFsbG9jYXRlZAorICogYW5kIG1hcHBlZCwgYW5kIG5vIGVycm9yLiAgSSBzdXNwZWN0IHRoYXQgc29tZXRoaW5nIGlzIGJyb2tlbgorICogaW4gQ29iYWx0LCBidXQgaGF2ZW4ndCByZWFsbHkgaW52ZXN0aWdhdGVkLiAgSEJPIGlzIHRoZSBhY3R1YWwKKyAqIHNpemUgb2YgdGhlIGJ1ZmZlciwgYW5kIEhXQlVGX09SREVSIGlzIHdoYXQgd2UgYWxsb2NhdGUuCisgKi8KKworI2RlZmluZSBIV0JVRl9TSElGVCAxMworI2RlZmluZSBIV0JVRl9TSVpFICgxIDw8IEhXQlVGX1NISUZUKQorIyBkZWZpbmUgSEJPICAgICAgICAgKEhXQlVGX1NISUZUID4gUEFHRV9TSElGVCA/IEhXQlVGX1NISUZUIC0gUEFHRV9TSElGVCA6IDApCisjIGRlZmluZSBIV0JVRl9PUkRFUiAoSEJPICsgMSkJCS8qIG5leHQgc2l6ZSBiaWdnZXIgKi8KKyNkZWZpbmUgTUlOX1NQRUVEIDQwMDAKKyNkZWZpbmUgTUFYX1NQRUVEIDQ5MDAwCisKKyNkZWZpbmUgTUlOX0ZSQUdTSElGVAkJCShETUFDSFVOS19TSElGVCArIDEpCisjZGVmaW5lIE1BWF9GUkFHU0hJRlQJCQkoUEFHRV9TSElGVCkKKyNkZWZpbmUgTUlOX0ZSQUdTSVpFCQkJKDEgPDwgTUlOX0ZSQUdTSElGVCkKKyNkZWZpbmUgTUFYX0ZSQUdTSVpFCQkJKDEgPDwgTUFYX0ZSQUdTSElGVCkKKyNkZWZpbmUgTUlOX0ZSQUdDT1VOVChmcmFnc2l6ZSkJCTMKKyNkZWZpbmUgTUFYX0ZSQUdDT1VOVChmcmFnc2l6ZSkJCSgzMiAqIFBBR0VfU0laRSAvIChmcmFnc2l6ZSkpCisjZGVmaW5lIERFRkFVTFRfRlJBR1NISUZUCQkxMgorI2RlZmluZSBERUZBVUxUX0ZSQUdDT1VOVAkJMTYKKyNkZWZpbmUgREVGQVVMVF9TVUJESVZTSElGVAkJMAorCisvKgorICogVGhlIHNvZnR3YXJlIGJ1ZmZlciAoc3didWYpIGlzIGEgcmluZyBidWZmZXIgc2hhcmVkIGJldHdlZW4gdXNlcgorICogbGV2ZWwgYW5kIGludGVycnVwdCBsZXZlbC4gIEVhY2ggbGV2ZWwgb3ducyBzb21lIG9mIHRoZSBieXRlcyBpbgorICogdGhlIGJ1ZmZlciwgYW5kIG1heSBnaXZlIGJ5dGVzIGF3YXkgYnkgY2FsbGluZyBzd2JfaW5jX3t1LGl9KCkuCisgKiBVc2VyIGxldmVsIGNhbGxzIF91IGZvciB1c2VyLCBhbmQgaW50ZXJydXB0IGxldmVsIGNhbGxzIF9pIGZvcgorICogaW50ZXJydXB0LgorICoKKyAqIHBvcnQtPnN3Yl97dSxpfV9hdmFpbCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSB0byB0aGF0IGxldmVsLgorICoKKyAqIHBvcnQtPnN3Yl97dSxpfV9pZHggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhdmFpbGFibGUgYnl0ZSBpbiB0aGUKKyAqIGJ1ZmZlci4KKyAqCisgKiBFYWNoIGxldmVsIGNhbGxzIHN3Yl9pbmNfe3UsaX0oKSB0byBhdG9taWNhbGx5IGluY3JlbWVudCBpdHMgaW5kZXgsCisgKiByZWNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgYm90aCBzaWRlcywgYW5kCisgKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuICBTaW5jZSBlYWNoIHNpZGUgY2FuIG9ubHkKKyAqIGdpdmUgYXdheSBieXRlcywgdGhlIG90aGVyIHNpZGUgY2FuIG9ubHkgaW5jcmVhc2UgdGhlIG51bWJlciBvZgorICogYnl0ZXMgYXZhaWxhYmxlIHRvIHRoaXMgc2lkZS4gIEVhY2ggc2lkZSB1cGRhdGVzIGl0cyBvd24gaW5kZXgKKyAqIHZhcmlhYmxlLCBzd2Jfe3UsaX1faWR4LCBzbyBubyBsb2NrIGlzIG5lZWRlZCB0byByZWFkIGl0LgorICoKKyAqIFRvIHF1ZXJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCBjYWxsIHN3Yl9pbmNfe3UsaX0gd2l0aCBhbgorICogaW5jcmVtZW50IG9mIHplcm8uCisgKi8KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fc3diX2luY191KHZ3c25kX3BvcnRfdCAqcG9ydCwgaW50IGluYykKK3sKKwlpZiAoaW5jKSB7CisJCXBvcnQtPnN3Yl91X2lkeCArPSBpbmM7CisJCXBvcnQtPnN3Yl91X2lkeCAlPSBwb3J0LT5zd2J1Zl9zaXplOworCQlwb3J0LT5zd2JfdV9hdmFpbCAtPSBpbmM7CisJCXBvcnQtPnN3Yl9pX2F2YWlsICs9IGluYzsKKwl9CisJcmV0dXJuIHBvcnQtPnN3Yl91X2F2YWlsOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgc3diX2luY191KHZ3c25kX3BvcnRfdCAqcG9ydCwgaW50IGluYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXsKKwkJcmV0ID0gX19zd2JfaW5jX3UocG9ydCwgaW5jKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX3N3Yl9pbmNfaSh2d3NuZF9wb3J0X3QgKnBvcnQsIGludCBpbmMpCit7CisJaWYgKGluYykgeworCQlwb3J0LT5zd2JfaV9pZHggKz0gaW5jOworCQlwb3J0LT5zd2JfaV9pZHggJT0gcG9ydC0+c3didWZfc2l6ZTsKKwkJcG9ydC0+c3diX2lfYXZhaWwgLT0gaW5jOworCQlwb3J0LT5zd2JfdV9hdmFpbCArPSBpbmM7CisJfQorCXJldHVybiBwb3J0LT5zd2JfaV9hdmFpbDsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IHN3Yl9pbmNfaSh2d3NuZF9wb3J0X3QgKnBvcnQsIGludCBpbmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwl7CisJCXJldCA9IF9fc3diX2luY19pKHBvcnQsIGluYyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcGNtX3NldHVwIC0gdGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGFsbCBwb3J0IHN0YXRlIGFmdGVyCisgKiBtb2RlLXNldHRpbmcgaW9jdGxzIGhhdmUgYmVlbiBkb25lLCBidXQgYmVmb3JlIHRoZSBmaXJzdCBJL08gaXMKKyAqIGRvbmUuCisgKgorICogTG9ja2luZzogY2FsbGVkIHdpdGggZGV2Yy0+aW9fc2VtYSBoZWxkLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHBjbV9zZXR1cCh2d3NuZF9kZXZfdCAqZGV2YywKKwkJICAgICB2d3NuZF9wb3J0X3QgKnJwb3J0LAorCQkgICAgIHZ3c25kX3BvcnRfdCAqd3BvcnQpCit7CisJdndzbmRfcG9ydF90ICphcG9ydCA9IHJwb3J0ID8gcnBvcnQgOiB3cG9ydDsKKwlpbnQgc2FtcGxlX3NpemU7CisJdW5zaWduZWQgaW50IHplcm9fd29yZDsKKworCURCR0VWKCIoZGV2Yz0weCVwLCBycG9ydD0weCVwLCB3cG9ydD0weCVwKVxuIiwgZGV2YywgcnBvcnQsIHdwb3J0KTsKKworCUFTU0VSVChhcG9ydCAhPSBOVUxMKTsKKwlpZiAoYXBvcnQtPnN3YnVmICE9IE5VTEwpCisJCXJldHVybiAwOworCXN3aXRjaCAoYXBvcnQtPnN3X3NhbXBsZWZtdCkgeworCWNhc2UgQUZNVF9NVV9MQVc6CisJCXNhbXBsZV9zaXplID0gMTsKKwkJemVyb193b3JkID0gMHhGRkZGRkZGRiBeIDB4ODA4MDgwODA7CisJCWJyZWFrOworCisJY2FzZSBBRk1UX0FfTEFXOgorCQlzYW1wbGVfc2l6ZSA9IDE7CisJCXplcm9fd29yZCA9IDB4RDVENUQ1RDUgXiAweDgwODA4MDgwOworCQlicmVhazsKKworCWNhc2UgQUZNVF9VODoKKwkJc2FtcGxlX3NpemUgPSAxOworCQl6ZXJvX3dvcmQgPSAweDgwODA4MDgwOworCQlicmVhazsKKworCWNhc2UgQUZNVF9TODoKKwkJc2FtcGxlX3NpemUgPSAxOworCQl6ZXJvX3dvcmQgPSAweDAwMDAwMDAwOworCQlicmVhazsKKworCWNhc2UgQUZNVF9TMTZfTEU6CisJCXNhbXBsZV9zaXplID0gMjsKKwkJemVyb193b3JkID0gMHgwMDAwMDAwMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzYW1wbGVfc2l6ZSA9IDA7CS8qIHByZXZlbnQgY29tcGlsZXIgd2FybmluZyAqLworCQl6ZXJvX3dvcmQgPSAwOworCQlBU1NFUlQoMCk7CisJfQorCWFwb3J0LT5zYW1wbGVfc2l6ZSAgPSBzYW1wbGVfc2l6ZTsKKwlhcG9ydC0+emVyb193b3JkICAgID0gemVyb193b3JkOworCWFwb3J0LT5mcmFtZV9zaXplICAgPSBhcG9ydC0+c3dfY2hhbm5lbHMgKiBhcG9ydC0+c2FtcGxlX3NpemU7CisJYXBvcnQtPmh3X2ZyYWdzaGlmdCA9IGFwb3J0LT5zd19mcmFnc2hpZnQgLSBhcG9ydC0+c3dfc3ViZGl2c2hpZnQ7CisJYXBvcnQtPmh3X2ZyYWdzaXplICA9IDEgPDwgYXBvcnQtPmh3X2ZyYWdzaGlmdDsKKwlhcG9ydC0+aHdfZnJhZ2NvdW50ID0gYXBvcnQtPnN3X2ZyYWdjb3VudCA8PCBhcG9ydC0+c3dfc3ViZGl2c2hpZnQ7CisJQVNTRVJUKGFwb3J0LT5od19mcmFnc2l6ZSA+PSBNSU5fRlJBR1NJWkUpOworCUFTU0VSVChhcG9ydC0+aHdfZnJhZ3NpemUgPD0gTUFYX0ZSQUdTSVpFKTsKKwlBU1NFUlQoYXBvcnQtPmh3X2ZyYWdjb3VudCA+PSBNSU5fRlJBR0NPVU5UKGFwb3J0LT5od19mcmFnc2l6ZSkpOworCUFTU0VSVChhcG9ydC0+aHdfZnJhZ2NvdW50IDw9IE1BWF9GUkFHQ09VTlQoYXBvcnQtPmh3X2ZyYWdzaXplKSk7CisJaWYgKHJwb3J0KSB7CisJCWludCBod2ZyYWdzLCBzd2ZyYWdzOworCQlycG9ydC0+aHdidWZfbWF4ID0gYXBvcnQtPmh3YnVmX3NpemUgLSBETUFDSFVOS19TSVpFOworCQlod2ZyYWdzID0gcnBvcnQtPmh3YnVmX21heCA+PiBhcG9ydC0+aHdfZnJhZ3NoaWZ0OworCQlzd2ZyYWdzID0gYXBvcnQtPmh3X2ZyYWdjb3VudCAtIGh3ZnJhZ3M7CisJCWlmIChzd2ZyYWdzIDwgMikKKwkJCXN3ZnJhZ3MgPSAyOworCQlycG9ydC0+c3didWZfc2l6ZSA9IHN3ZnJhZ3MgKiBhcG9ydC0+aHdfZnJhZ3NpemU7CisJCURCR1BWKCJod2ZyYWdzID0gJWQsIHN3ZnJhZ3MgPSAlZFxuIiwgaHdmcmFncywgc3dmcmFncyk7CisJCURCR1BWKCJyZWFkIGh3YnVmX21heCA9ICVkLCBzd2J1Zl9zaXplID0gJWRcbiIsCisJCSAgICAgcnBvcnQtPmh3YnVmX21heCwgcnBvcnQtPnN3YnVmX3NpemUpOworCX0KKwlpZiAod3BvcnQpIHsKKwkJaW50IGh3ZnJhZ3MsIHN3ZnJhZ3M7CisJCWludCB0b3RhbF9ieXRlcyA9IGFwb3J0LT5od19mcmFnY291bnQgKiBhcG9ydC0+aHdfZnJhZ3NpemU7CisJCXdwb3J0LT5od2J1Zl9tYXggPSBhcG9ydC0+aHdidWZfc2l6ZSAtIERNQUNIVU5LX1NJWkU7CisJCWlmICh3cG9ydC0+aHdidWZfbWF4ID4gdG90YWxfYnl0ZXMpCisJCQl3cG9ydC0+aHdidWZfbWF4ID0gdG90YWxfYnl0ZXM7CisJCWh3ZnJhZ3MgPSB3cG9ydC0+aHdidWZfbWF4ID4+IGFwb3J0LT5od19mcmFnc2hpZnQ7CisJCURCR1BWKCJod2ZyYWdzID0gJWRcbiIsIGh3ZnJhZ3MpOworCQlzd2ZyYWdzID0gYXBvcnQtPmh3X2ZyYWdjb3VudCAtIGh3ZnJhZ3M7CisJCWlmIChzd2ZyYWdzIDwgMikKKwkJCXN3ZnJhZ3MgPSAyOworCQl3cG9ydC0+c3didWZfc2l6ZSA9IHN3ZnJhZ3MgKiBhcG9ydC0+aHdfZnJhZ3NpemU7CisJCURCR1BWKCJod2ZyYWdzID0gJWQsIHN3ZnJhZ3MgPSAlZFxuIiwgaHdmcmFncywgc3dmcmFncyk7CisJCURCR1BWKCJ3cml0ZSBod2J1Zl9tYXggPSAlZCwgc3didWZfc2l6ZSA9ICVkXG4iLAorCQkgICAgIHdwb3J0LT5od2J1Zl9tYXgsIHdwb3J0LT5zd2J1Zl9zaXplKTsKKwl9CisKKwlhcG9ydC0+c3diX3VfaWR4ICAgID0gMDsKKwlhcG9ydC0+c3diX2lfaWR4ICAgID0gMDsKKwlhcG9ydC0+Ynl0ZV9jb3VudCAgID0gMDsKKworCS8qCisJICogSXMgdGhpcyBhIENvYmFsdCBidWc/ICBXZSBuZWVkIHRvIG1ha2UgdGhpcyBidWZmZXIgZXh0ZW5kCisJICogb25lIHBhZ2UgZnVydGhlciB0aGFuIHdlIGFjdHVhbGx5IHVzZSAtLSBzb21laG93IG1lbWNweQorCSAqIGNhdXNlcyBhbiBleGNlcHRvaW4gb3RoZXJ3aXNlLiAgSSBzdXNwZWN0IHRoZXJlJ3MgYSBidWcgaW4KKwkgKiBDb2JhbHQgKG9yIHNvbWV3aGVyZSkgd2hlcmUgaXQncyBnZW5lcmF0aW5nIGEgZmF1bHQgb24gYQorCSAqIHNwZWN1bGF0aXZlIGxvYWQgb3Igc29tZXRoaW5nLiAgT2J2aW91c2x5LCBJIGhhdmVuJ3QgdGFrZW4KKwkgKiB0aGUgdGltZSB0byB0cmFjayBpdCBkb3duLgorCSAqLworCisJYXBvcnQtPnN3YnVmICAgICAgICA9IHZtYWxsb2MoYXBvcnQtPnN3YnVmX3NpemUgKyBQQUdFX1NJWkUpOworCWlmICghYXBvcnQtPnN3YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAocnBvcnQgJiYgd3BvcnQpIHsKKwkJQVNTRVJUKGFwb3J0ID09IHJwb3J0KTsKKwkJQVNTRVJUKHdwb3J0LT5zd2J1ZiA9PSBOVUxMKTsKKwkJLyogT25lIGV4dHJhIHBhZ2UgLSBzZWUgY29tbWVudCBhYm92ZS4gKi8KKwkJd3BvcnQtPnN3YnVmID0gdm1hbGxvYyhhcG9ydC0+c3didWZfc2l6ZSArIFBBR0VfU0laRSk7CisJCWlmICghd3BvcnQtPnN3YnVmKSB7CisJCQl2ZnJlZShhcG9ydC0+c3didWYpOworCQkJYXBvcnQtPnN3YnVmID0gTlVMTDsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXdwb3J0LT5zYW1wbGVfc2l6ZSAgPSBycG9ydC0+c2FtcGxlX3NpemU7CisJCXdwb3J0LT56ZXJvX3dvcmQgICAgPSBycG9ydC0+emVyb193b3JkOworCQl3cG9ydC0+ZnJhbWVfc2l6ZSAgID0gcnBvcnQtPmZyYW1lX3NpemU7CisJCXdwb3J0LT5od19mcmFnc2hpZnQgPSBycG9ydC0+aHdfZnJhZ3NoaWZ0OworCQl3cG9ydC0+aHdfZnJhZ3NpemUgID0gcnBvcnQtPmh3X2ZyYWdzaXplOworCQl3cG9ydC0+aHdfZnJhZ2NvdW50ID0gcnBvcnQtPmh3X2ZyYWdjb3VudDsKKwkJd3BvcnQtPnN3YnVmX3NpemUgICA9IHJwb3J0LT5zd2J1Zl9zaXplOworCQl3cG9ydC0+aHdidWZfbWF4ICAgID0gcnBvcnQtPmh3YnVmX21heDsKKwkJd3BvcnQtPnN3Yl91X2lkeCAgICA9IHJwb3J0LT5zd2JfdV9pZHg7CisJCXdwb3J0LT5zd2JfaV9pZHggICAgPSBycG9ydC0+c3diX2lfaWR4OworCQl3cG9ydC0+Ynl0ZV9jb3VudCAgID0gcnBvcnQtPmJ5dGVfY291bnQ7CisJfQorCWlmIChycG9ydCkgeworCQlycG9ydC0+c3diX3VfYXZhaWwgPSAwOworCQlycG9ydC0+c3diX2lfYXZhaWwgPSBycG9ydC0+c3didWZfc2l6ZTsKKwkJcnBvcnQtPnN3c3RhdGUgPSBTV19SVU47CisJCWxpX3NldHVwX2RtYSgmcnBvcnQtPmNoYW4sCisJCQkgICAgICZsaV9jb21tMSwKKwkJCSAgICAgJmRldmMtPmxpdGgsCisJCQkgICAgIHJwb3J0LT5od2J1Zl9wYWRkciwKKwkJCSAgICAgSFdCVUZfU0hJRlQsCisJCQkgICAgIHJwb3J0LT5od19mcmFnc2hpZnQsCisJCQkgICAgIHJwb3J0LT5zd19jaGFubmVscywKKwkJCSAgICAgcnBvcnQtPnNhbXBsZV9zaXplKTsKKwkJYWQxODQzX3NldHVwX2FkYygmZGV2Yy0+bGl0aCwKKwkJCQkgcnBvcnQtPnN3X2ZyYW1lcmF0ZSwKKwkJCQkgcnBvcnQtPnN3X3NhbXBsZWZtdCwKKwkJCQkgcnBvcnQtPnN3X2NoYW5uZWxzKTsKKwkJbGlfZW5hYmxlX2ludGVycnVwdHMoJmRldmMtPmxpdGgsIFJFQURfSU5UUl9NQVNLKTsKKwkJaWYgKCEocnBvcnQtPmZsYWdzICYgRElTQUJMRUQpKSB7CisJCQl1c3Rtc2NfdCB1c3Rtc2M7CisJCQlycG9ydC0+aHdzdGF0ZSA9IEhXX1JVTk5JTkc7CisJCQlsaV9hY3RpdmF0ZV9kbWEoJnJwb3J0LT5jaGFuKTsKKwkJCWxpX3JlYWRfVVNUTVNDKCZycG9ydC0+Y2hhbiwgJnVzdG1zYyk7CisJCQlycG9ydC0+TVNDX29mZnNldCA9IHVzdG1zYy5tc2M7CisJCX0KKwl9CisJaWYgKHdwb3J0KSB7CisJCWlmICh3cG9ydC0+aHdidWZfbWF4ID4gd3BvcnQtPnN3YnVmX3NpemUpCisJCQl3cG9ydC0+aHdidWZfbWF4ID0gd3BvcnQtPnN3YnVmX3NpemU7CisJCXdwb3J0LT5mbGFncyAmPSB+RVJGTE9XTjsKKwkJd3BvcnQtPnN3Yl91X2F2YWlsID0gd3BvcnQtPnN3YnVmX3NpemU7CisJCXdwb3J0LT5zd2JfaV9hdmFpbCA9IDA7CisJCXdwb3J0LT5zd3N0YXRlID0gU1dfUlVOOworCQlsaV9zZXR1cF9kbWEoJndwb3J0LT5jaGFuLAorCQkJICAgICAmbGlfY29tbTIsCisJCQkgICAgICZkZXZjLT5saXRoLAorCQkJICAgICB3cG9ydC0+aHdidWZfcGFkZHIsCisJCQkgICAgIEhXQlVGX1NISUZULAorCQkJICAgICB3cG9ydC0+aHdfZnJhZ3NoaWZ0LAorCQkJICAgICB3cG9ydC0+c3dfY2hhbm5lbHMsCisJCQkgICAgIHdwb3J0LT5zYW1wbGVfc2l6ZSk7CisJCWFkMTg0M19zZXR1cF9kYWMoJmRldmMtPmxpdGgsCisJCQkJIHdwb3J0LT5zd19mcmFtZXJhdGUsCisJCQkJIHdwb3J0LT5zd19zYW1wbGVmbXQsCisJCQkJIHdwb3J0LT5zd19jaGFubmVscyk7CisJCWxpX2VuYWJsZV9pbnRlcnJ1cHRzKCZkZXZjLT5saXRoLCBXUklURV9JTlRSX01BU0spOworCX0KKwlEQkdSVigpOworCXJldHVybiAwOworfQorCisvKgorICogcGNtX3NodXRkb3duX3BvcnQgLSBzaHV0IGRvd24gb25lIHBvcnQgKGRpcmVjdGlvbikgZm9yIFBDTSBJL08uCisgKiBPbmx5IGNhbGxlZCBmcm9tIHBjbV9zaHV0ZG93bi4KKyAqLworCitzdGF0aWMgdm9pZCBwY21fc2h1dGRvd25fcG9ydCh2d3NuZF9kZXZfdCAqZGV2YywKKwkJCSAgICAgIHZ3c25kX3BvcnRfdCAqYXBvcnQsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZ3c25kX3BvcnRfaHdzdGF0ZV90IGh3c3RhdGU7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhcG9ydC0+c3dzdGF0ZSA9IFNXX0lOSVRJQUw7CisJYWRkX3dhaXRfcXVldWUoJmFwb3J0LT5xdWV1ZSwgJndhaXQpOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFwb3J0LT5sb2NrLCBmbGFncyk7CisJCXsKKwkJCWh3c3RhdGUgPSBhcG9ydC0+aHdzdGF0ZTsKKwkJfQkJCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwb3J0LT5sb2NrLCBmbGFncyk7CisJCWlmIChod3N0YXRlID09IEhXX1NUT1BQRUQpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmFwb3J0LT5xdWV1ZSwgJndhaXQpOworCWxpX2Rpc2FibGVfaW50ZXJydXB0cygmZGV2Yy0+bGl0aCwgbWFzayk7CisJaWYgKGFwb3J0ID09ICZkZXZjLT5ycG9ydCkKKwkJYWQxODQzX3NodXRkb3duX2FkYygmZGV2Yy0+bGl0aCk7CisJZWxzZSAvKiBhcG9ydCA9PSAmZGV2Yy0+d3BvcnQpICovCisJCWFkMTg0M19zaHV0ZG93bl9kYWMoJmRldmMtPmxpdGgpOworCWxpX3NodXRkb3duX2RtYSgmYXBvcnQtPmNoYW4pOworCXZmcmVlKGFwb3J0LT5zd2J1Zik7CisJYXBvcnQtPnN3YnVmID0gTlVMTDsKKwlhcG9ydC0+Ynl0ZV9jb3VudCA9IDA7Cit9CisKKy8qCisgKiBwY21fc2h1dGRvd24gdW5kb2VzIHdoYXQgcGNtX3NldHVwIGRpZC4KKyAqIEFsc28gc2V0cyB0aGUgcG9ydHMnIHN3c3RhdGUgdG8gbmV3c3RhdGUuCisgKi8KKworc3RhdGljIHZvaWQgcGNtX3NodXRkb3duKHZ3c25kX2Rldl90ICpkZXZjLAorCQkJIHZ3c25kX3BvcnRfdCAqcnBvcnQsCisJCQkgdndzbmRfcG9ydF90ICp3cG9ydCkKK3sKKwlEQkdFVigiKGRldmM9MHglcCwgcnBvcnQ9MHglcCwgd3BvcnQ9MHglcClcbiIsIGRldmMsIHJwb3J0LCB3cG9ydCk7CisKKwlpZiAocnBvcnQgJiYgcnBvcnQtPnN3YnVmKSB7CisJCURCR1BWKCJzaHV0dGluZyBkb3duIHJwb3J0XG4iKTsKKwkJcGNtX3NodXRkb3duX3BvcnQoZGV2YywgcnBvcnQsIFJFQURfSU5UUl9NQVNLKTsKKwl9CisJaWYgKHdwb3J0ICYmIHdwb3J0LT5zd2J1ZikgeworCQlEQkdQVigic2h1dHRpbmcgZG93biB3cG9ydFxuIik7CisJCXBjbV9zaHV0ZG93bl9wb3J0KGRldmMsIHdwb3J0LCBXUklURV9JTlRSX01BU0spOworCX0KKwlEQkdSVigpOworfQorCitzdGF0aWMgdm9pZCBwY21fY29weV9pbih2d3NuZF9wb3J0X3QgKnJwb3J0LCBpbnQgc3dpZHgsIGludCBod2lkeCwgaW50IG5iKQoreworCWNoYXIgKnNyYyA9IHJwb3J0LT5od2J1ZiArIGh3aWR4OworCWNoYXIgKmRzdCA9IHJwb3J0LT5zd2J1ZiArIHN3aWR4OworCWludCBmbXQgPSBycG9ydC0+c3dfc2FtcGxlZm10OworCisJREJHUFYoInN3aWR4ID0gJWQsIGh3aWR4ID0gJWRcbiIsIHN3aWR4LCBod2lkeCk7CisJQVNTRVJUKHJwb3J0LT5od2J1ZiAhPSBOVUxMKTsKKwlBU1NFUlQocnBvcnQtPnN3YnVmICE9IE5VTEwpOworCUFTU0VSVChuYiA+IDAgJiYgKG5iICUgMzIpID09IDApOworCUFTU0VSVChzd2lkeCAlIDMyID09IDAgJiYgaHdpZHggJSAzMiA9PSAwKTsKKwlBU1NFUlQoc3dpZHggPj0gMCAmJiBzd2lkeCArIG5iIDw9IHJwb3J0LT5zd2J1Zl9zaXplKTsKKwlBU1NFUlQoaHdpZHggPj0gMCAmJiBod2lkeCArIG5iIDw9IHJwb3J0LT5od2J1Zl9zaXplKTsKKworCWlmIChmbXQgPT0gQUZNVF9NVV9MQVcgfHwgZm10ID09IEFGTVRfQV9MQVcgfHwgZm10ID09IEFGTVRfUzgpIHsKKworCQkvKiBTZWUgU2FtcGxlIEZvcm1hdCBOb3RlcyBhYm92ZS4gKi8KKworCQljaGFyICplbmQgPSBzcmMgKyBuYjsKKwkJd2hpbGUgKHNyYyA8IGVuZCkKKwkJCSpkc3QrKyA9ICpzcmMrKyBeIDB4ODA7CisJfSBlbHNlCisJCW1lbWNweShkc3QsIHNyYywgbmIpOworfQorCitzdGF0aWMgdm9pZCBwY21fY29weV9vdXQodndzbmRfcG9ydF90ICp3cG9ydCwgaW50IHN3aWR4LCBpbnQgaHdpZHgsIGludCBuYikKK3sKKwljaGFyICpzcmMgPSB3cG9ydC0+c3didWYgKyBzd2lkeDsKKwljaGFyICpkc3QgPSB3cG9ydC0+aHdidWYgKyBod2lkeDsKKwlpbnQgZm10ID0gd3BvcnQtPnN3X3NhbXBsZWZtdDsKKworCUFTU0VSVChuYiA+IDAgJiYgKG5iICUgMzIpID09IDApOworCUFTU0VSVCh3cG9ydC0+aHdidWYgIT0gTlVMTCk7CisJQVNTRVJUKHdwb3J0LT5zd2J1ZiAhPSBOVUxMKTsKKwlBU1NFUlQoc3dpZHggJSAzMiA9PSAwICYmIGh3aWR4ICUgMzIgPT0gMCk7CisJQVNTRVJUKHN3aWR4ID49IDAgJiYgc3dpZHggKyBuYiA8PSB3cG9ydC0+c3didWZfc2l6ZSk7CisJQVNTRVJUKGh3aWR4ID49IDAgJiYgaHdpZHggKyBuYiA8PSB3cG9ydC0+aHdidWZfc2l6ZSk7CisJaWYgKGZtdCA9PSBBRk1UX01VX0xBVyB8fCBmbXQgPT0gQUZNVF9BX0xBVyB8fCBmbXQgPT0gQUZNVF9TOCkgeworCisJCS8qIFNlZSBTYW1wbGUgRm9ybWF0IE5vdGVzIGFib3ZlLiAqLworCisJCWNoYXIgKmVuZCA9IHNyYyArIG5iOworCQl3aGlsZSAoc3JjIDwgZW5kKQorCQkJKmRzdCsrID0gKnNyYysrIF4gMHg4MDsKKwl9IGVsc2UKKwkJbWVtY3B5KGRzdCwgc3JjLCBuYik7Cit9CisKKy8qCisgKiBwY21fb3V0cHV0KCkgaXMgY2FsbGVkIGJvdGggZnJvbSBiYXNlbGV2ZWwgYW5kIGZyb20gaW50ZXJydXB0IGxldmVsLgorICogVGhpcyBpcyB3aGVyZSBhdWRpbyBmcmFtZXMgYXJlIGNvcGllZCBpbnRvIHRoZSBoYXJkd2FyZS1hY2Nlc3NpYmxlCisgKiByaW5nIGJ1ZmZlci4KKyAqCisgKiBMb2NraW5nIG5vdGU6IFRoZSBwYXJ0IG9mIHRoaXMgcm91dGluZSB0aGF0IGZpZ3VyZXMgb3V0IHdoYXQgdG8gZG8KKyAqIGhvbGRzIHdwb3J0LT5sb2NrLiAgVGhlIGxvbmdlciBwYXJ0IHJlbGVhc2VzIHdwb3J0LT5sb2NrLCBidXQgc2V0cworICogd3BvcnQtPmZsYWdzICYgSFdfQlVTWS4gIEFmdGVyd2FyZCwgaXQgcmVhY3F1aXJlcyB3cG9ydC0+bG9jaywgYW5kCisgKiBjaGVja3MgZm9yIG1vcmUgd29yayB0byBkby4KKyAqCisgKiBJZiBhbm90aGVyIHRocmVhZCBjYWxscyBwY21fb3V0cHV0KCkgd2hpbGUgSFdfQlVTWSBpcyBzZXQsIGl0CisgKiByZXR1cm5zIGltbWVkaWF0ZWx5LCBrbm93aW5nIHRoYXQgdGhlIHRocmVhZCB0aGF0IHNldCBIV19CVVNZIHdpbGwKKyAqIGxvb2sgZm9yIG1vcmUgd29yayB0byBkbyBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBwb3J0LT5sb2NrIGlzIGhlbGQgZm9yIHNldmVyYWwgc2hvcnQKKyAqIHBlcmlvZHMgaW5zdGVhZCBvZiBvbmUgbG9uZyBwZXJpb2QuICBBbHNvLCB3aGVuIHBjbV9vdXRwdXQgaXMKKyAqIGNhbGxlZCBmcm9tIGJhc2UgbGV2ZWwsIGl0IHJlZW5hYmxlcyBpbnRlcnJ1cHRzLgorICovCisKK3N0YXRpYyB2b2lkIHBjbV9vdXRwdXQodndzbmRfZGV2X3QgKmRldmMsIGludCBlcmZsb3duLCBpbnQgbmIpCit7CisJdndzbmRfcG9ydF90ICp3cG9ydCA9ICZkZXZjLT53cG9ydDsKKwljb25zdCBpbnQgaHdtYXggID0gd3BvcnQtPmh3YnVmX21heDsKKwljb25zdCBpbnQgaHdzaXplID0gd3BvcnQtPmh3YnVmX3NpemU7CisJY29uc3QgaW50IHN3c2l6ZSA9IHdwb3J0LT5zd2J1Zl9zaXplOworCWNvbnN0IGludCBmcmFnc2l6ZSA9IHdwb3J0LT5od19mcmFnc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKworCURCR0VWKCIoZGV2Yz0weCVwLCBlcmZsb3duPSVkLCBuYj0lZClcbiIsIGRldmMsIGVyZmxvd24sIG5iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGlmbGFncyk7CisJaWYgKGVyZmxvd24pCisJCXdwb3J0LT5mbGFncyB8PSBFUkZMT1dOOworCSh2b2lkKSBfX3N3Yl9pbmNfdSh3cG9ydCwgbmIpOworCWlmICh3cG9ydC0+ZmxhZ3MgJiBIV19CVVNZKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOworCQlEQkdQVigicmV0dXJuaW5nOiBIVyBCVVNZXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAod3BvcnQtPmZsYWdzICYgRElTQUJMRUQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGlmbGFncyk7CisJCURCR1BWKCJyZXR1cm5pbmc6IERJU0FCTEVEXG4iKTsKKwkJcmV0dXJuOworCX0KKwl3cG9ydC0+ZmxhZ3MgfD0gSFdfQlVTWTsKKwl3aGlsZSAoMSkgeworCQlpbnQgc3dwdHIsIGh3cHRyLCBod19hdmFpbCwgc3dfYXZhaWwsIHN3aWR4OworCQl2d3NuZF9wb3J0X2h3c3RhdGVfdCBod3N0YXRlID0gd3BvcnQtPmh3c3RhdGU7CisJCXZ3c25kX3BvcnRfc3dzdGF0ZV90IHN3c3RhdGUgPSB3cG9ydC0+c3dzdGF0ZTsKKwkJaW50IGh3X3VuYXZhaWw7CisJCXVzdG1zY190IHVzdG1zYzsKKworCQlod3B0ciA9IGxpX3JlYWRfaHdwdHIoJndwb3J0LT5jaGFuKTsKKwkJc3dwdHIgPSBsaV9yZWFkX3N3cHRyKCZ3cG9ydC0+Y2hhbik7CisJCWh3X3VuYXZhaWwgPSAoc3dwdHIgLSBod3B0ciArIGh3c2l6ZSkgJSBod3NpemU7CisJCWh3X2F2YWlsID0gKGh3bWF4IC0gaHdfdW5hdmFpbCkgJiAtZnJhZ3NpemU7CisJCXN3X2F2YWlsID0gd3BvcnQtPnN3Yl9pX2F2YWlsICYgLWZyYWdzaXplOworCQlpZiAoc3dfYXZhaWwgJiYgc3dzdGF0ZSA9PSBTV19SVU4pIHsKKwkJCWlmICh3cG9ydC0+ZmxhZ3MgJiBFUkZMT1dOKSB7CisJCQkJd3BvcnQtPmZsYWdzICY9IH5FUkZMT1dOOworCQkJfQorCQl9IGVsc2UgaWYgKHN3c3RhdGUgPT0gU1dfSU5JVElBTCB8fAorCQkJIHN3c3RhdGUgPT0gU1dfT0ZGIHx8CisJCQkgKHN3c3RhdGUgPT0gU1dfRFJBSU4gJiYKKwkJCSAgIXN3X2F2YWlsICYmCisJCQkgICh3cG9ydC0+ZmxhZ3MgJiBFUkZMT1dOKSkpIHsKKwkJCURCR1AoInN0b3BwaW5nLiAgaHdzdGF0ZSA9ICVkXG4iLCBod3N0YXRlKTsKKwkJCWlmIChod3N0YXRlICE9IEhXX1NUT1BQRUQpIHsKKwkJCQlsaV9kZWFjdGl2YXRlX2RtYSgmd3BvcnQtPmNoYW4pOworCQkJCXdwb3J0LT5od3N0YXRlID0gSFdfU1RPUFBFRDsKKwkJCX0KKwkJCXdha2VfdXAoJndwb3J0LT5xdWV1ZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN3X2F2YWlsIHx8ICFod19hdmFpbCkKKwkJCWJyZWFrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgaWZsYWdzKTsKKworCQkvKgorCQkgKiBXZSBnYXZlIHVwIHRoZSBwb3J0IGxvY2ssIGJ1dCB3ZSBoYXZlIHRoZSBIV19CVVNZIGZsYWcuCisJCSAqIFByb2NlZWQgd2l0aG91dCBhY2Nlc3NpbmcgYW55IG5vbmxvY2FsIHN0YXRlLgorCQkgKiBEbyBub3QgZXhpdCB0aGUgbG9vcCAtLSBtdXN0IGNoZWNrIGZvciBtb3JlIHdvcmsuCisJCSAqLworCisJCXN3aWR4ID0gd3BvcnQtPnN3Yl9pX2lkeDsKKwkJbmIgPSBod19hdmFpbDsKKwkJaWYgKG5iID4gc3dfYXZhaWwpCisJCQluYiA9IHN3X2F2YWlsOworCQlpZiAobmIgPiBod3NpemUgLSBzd3B0cikKKwkJCW5iID0gaHdzaXplIC0gc3dwdHI7IC8qIGRvbid0IG92ZXJmbG93IGh3YnVmICovCisJCWlmIChuYiA+IHN3c2l6ZSAtIHN3aWR4KQorCQkJbmIgPSBzd3NpemUgLSBzd2lkeDsgLyogZG9uJ3Qgb3ZlcmZsb3cgc3didWYgKi8KKwkJQVNTRVJUKG5iID4gMCk7CisJCWlmIChuYiAlIGZyYWdzaXplKSB7CisJCQlEQkdQKCJuYiA9ICVkLCBmcmFnc2l6ZSA9ICVkXG4iLCBuYiwgZnJhZ3NpemUpOworCQkJREJHUCgiaHdfYXZhaWwgPSAlZFxuIiwgaHdfYXZhaWwpOworCQkJREJHUCgic3dfYXZhaWwgPSAlZFxuIiwgc3dfYXZhaWwpOworCQkJREJHUCgiaHdzaXplID0gJWQsIHN3cHRyID0gJWRcbiIsIGh3c2l6ZSwgc3dwdHIpOworCQkJREJHUCgic3dzaXplID0gJWQsIHN3aWR4ID0gJWRcbiIsIHN3c2l6ZSwgc3dpZHgpOworCQl9CisJCUFTU0VSVCghKG5iICUgZnJhZ3NpemUpKTsKKwkJREJHUFYoImNvcHlpbmcgc3diWyVkLi4lZF0gdG8gaHdiWyVkLi4lZF1cbiIsCisJCSAgICAgIHN3aWR4LCBzd2lkeCArIG5iLCBzd3B0ciwgc3dwdHIgKyBuYik7CisJCXBjbV9jb3B5X291dCh3cG9ydCwgc3dpZHgsIHN3cHRyLCBuYik7CisJCWxpX3dyaXRlX3N3cHRyKCZ3cG9ydC0+Y2hhbiwgKHN3cHRyICsgbmIpICUgaHdzaXplKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOworCQlpZiAoaHdzdGF0ZSA9PSBIV19TVE9QUEVEKSB7CisJCQlEQkdQVigic3RhcnRpbmdcbiIpOworCQkJbGlfYWN0aXZhdGVfZG1hKCZ3cG9ydC0+Y2hhbik7CisJCQl3cG9ydC0+aHdzdGF0ZSA9IEhXX1JVTk5JTkc7CisJCQlsaV9yZWFkX1VTVE1TQygmd3BvcnQtPmNoYW4sICZ1c3Rtc2MpOworCQkJQVNTRVJUKHdwb3J0LT5ieXRlX2NvdW50ICUgd3BvcnQtPmZyYW1lX3NpemUgPT0gMCk7CisJCQl3cG9ydC0+TVNDX29mZnNldCA9IHVzdG1zYy5tc2MgLSB3cG9ydC0+Ynl0ZV9jb3VudCAvIHdwb3J0LT5mcmFtZV9zaXplOworCQl9CisJCV9fc3diX2luY19pKHdwb3J0LCBuYik7CisJCXdwb3J0LT5ieXRlX2NvdW50ICs9IG5iOworCQl3cG9ydC0+ZnJhZ19jb3VudCArPSBuYiAvIGZyYWdzaXplOworCQlBU1NFUlQobmIgJSBmcmFnc2l6ZSA9PSAwKTsKKwkJd2FrZV91cCgmd3BvcnQtPnF1ZXVlKTsKKwl9CisJd3BvcnQtPmZsYWdzICY9IH5IV19CVVNZOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOworCURCR1JWKCk7Cit9CisKKy8qCisgKiBwY21faW5wdXQoKSBpcyBjYWxsZWQgYm90aCBmcm9tIGJhc2VsZXZlbCBhbmQgZnJvbSBpbnRlcnJ1cHQgbGV2ZWwuCisgKiBUaGlzIGlzIHdoZXJlIGF1ZGlvIGZyYW1lcyBhcmUgY29waWVkIG91dCBvZiB0aGUgaGFyZHdhcmUtYWNjZXNzaWJsZQorICogcmluZyBidWZmZXIuCisgKgorICogTG9ja2luZyBub3RlOiBUaGUgcGFydCBvZiB0aGlzIHJvdXRpbmUgdGhhdCBmaWd1cmVzIG91dCB3aGF0IHRvIGRvCisgKiBob2xkcyBycG9ydC0+bG9jay4gIFRoZSBsb25nZXIgcGFydCByZWxlYXNlcyBycG9ydC0+bG9jaywgYnV0IHNldHMKKyAqIHJwb3J0LT5mbGFncyAmIEhXX0JVU1kuICBBZnRlcndhcmQsIGl0IHJlYWNxdWlyZXMgcnBvcnQtPmxvY2ssIGFuZAorICogY2hlY2tzIGZvciBtb3JlIHdvcmsgdG8gZG8uCisgKgorICogSWYgYW5vdGhlciB0aHJlYWQgY2FsbHMgcGNtX2lucHV0KCkgd2hpbGUgSFdfQlVTWSBpcyBzZXQsIGl0CisgKiByZXR1cm5zIGltbWVkaWF0ZWx5LCBrbm93aW5nIHRoYXQgdGhlIHRocmVhZCB0aGF0IHNldCBIV19CVVNZIHdpbGwKKyAqIGxvb2sgZm9yIG1vcmUgd29yayB0byBkbyBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBwb3J0LT5sb2NrIGlzIGhlbGQgZm9yIHNldmVyYWwgc2hvcnQKKyAqIHBlcmlvZHMgaW5zdGVhZCBvZiBvbmUgbG9uZyBwZXJpb2QuICBBbHNvLCB3aGVuIHBjbV9pbnB1dCBpcworICogY2FsbGVkIGZyb20gYmFzZSBsZXZlbCwgaXQgcmVlbmFibGVzIGludGVycnVwdHMuCisgKi8KKworc3RhdGljIHZvaWQgcGNtX2lucHV0KHZ3c25kX2Rldl90ICpkZXZjLCBpbnQgZXJmbG93biwgaW50IG5iKQoreworCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAmZGV2Yy0+cnBvcnQ7CisJY29uc3QgaW50IGh3bWF4ICA9IHJwb3J0LT5od2J1Zl9tYXg7CisJY29uc3QgaW50IGh3c2l6ZSA9IHJwb3J0LT5od2J1Zl9zaXplOworCWNvbnN0IGludCBzd3NpemUgPSBycG9ydC0+c3didWZfc2l6ZTsKKwljb25zdCBpbnQgZnJhZ3NpemUgPSBycG9ydC0+aHdfZnJhZ3NpemU7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisKKwlEQkdFVigiKGRldmM9MHglcCwgZXJmbG93bj0lZCwgbmI9JWQpXG4iLCBkZXZjLCBlcmZsb3duLCBuYik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7CisJaWYgKGVyZmxvd24pCisJCXJwb3J0LT5mbGFncyB8PSBFUkZMT1dOOworCSh2b2lkKSBfX3N3Yl9pbmNfdShycG9ydCwgbmIpOworCWlmIChycG9ydC0+ZmxhZ3MgJiBIV19CVVNZIHx8ICFycG9ydC0+c3didWYpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7CisJCURCR1BWKCJyZXR1cm5pbmc6IEhXIEJVU1kgb3IgIXN3YnVmXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocnBvcnQtPmZsYWdzICYgRElTQUJMRUQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7CisJCURCR1BWKCJyZXR1cm5pbmc6IERJU0FCTEVEXG4iKTsKKwkJcmV0dXJuOworCX0KKwlycG9ydC0+ZmxhZ3MgfD0gSFdfQlVTWTsKKwl3aGlsZSAoMSkgeworCQlpbnQgc3dwdHIsIGh3cHRyLCBod19hdmFpbCwgc3dfYXZhaWwsIHN3aWR4OworCQl2d3NuZF9wb3J0X2h3c3RhdGVfdCBod3N0YXRlID0gcnBvcnQtPmh3c3RhdGU7CisJCXZ3c25kX3BvcnRfc3dzdGF0ZV90IHN3c3RhdGUgPSBycG9ydC0+c3dzdGF0ZTsKKworCQlod3B0ciA9IGxpX3JlYWRfaHdwdHIoJnJwb3J0LT5jaGFuKTsKKwkJc3dwdHIgPSBsaV9yZWFkX3N3cHRyKCZycG9ydC0+Y2hhbik7CisJCWh3X2F2YWlsID0gKGh3cHRyIC0gc3dwdHIgKyBod3NpemUpICUgaHdzaXplICYgLWZyYWdzaXplOworCQlpZiAoaHdfYXZhaWwgPiBod21heCkKKwkJCWh3X2F2YWlsID0gaHdtYXg7CisJCXN3X2F2YWlsID0gcnBvcnQtPnN3Yl9pX2F2YWlsICYgLWZyYWdzaXplOworCQlpZiAoc3dzdGF0ZSAhPSBTV19SVU4pIHsKKwkJCURCR1AoInN0b3BwaW5nLiAgaHdzdGF0ZSA9ICVkXG4iLCBod3N0YXRlKTsKKwkJCWlmIChod3N0YXRlICE9IEhXX1NUT1BQRUQpIHsKKwkJCQlsaV9kZWFjdGl2YXRlX2RtYSgmcnBvcnQtPmNoYW4pOworCQkJCXJwb3J0LT5od3N0YXRlID0gSFdfU1RPUFBFRDsKKwkJCX0KKwkJCXdha2VfdXAoJnJwb3J0LT5xdWV1ZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN3X2F2YWlsIHx8ICFod19hdmFpbCkKKwkJCWJyZWFrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgaWZsYWdzKTsKKworCQkvKgorCQkgKiBXZSBnYXZlIHVwIHRoZSBwb3J0IGxvY2ssIGJ1dCB3ZSBoYXZlIHRoZSBIV19CVVNZIGZsYWcuCisJCSAqIFByb2NlZWQgd2l0aG91dCBhY2Nlc3NpbmcgYW55IG5vbmxvY2FsIHN0YXRlLgorCQkgKiBEbyBub3QgZXhpdCB0aGUgbG9vcCAtLSBtdXN0IGNoZWNrIGZvciBtb3JlIHdvcmsuCisJCSAqLworCisJCXN3aWR4ID0gcnBvcnQtPnN3Yl9pX2lkeDsKKwkJbmIgPSBod19hdmFpbDsKKwkJaWYgKG5iID4gc3dfYXZhaWwpCisJCQluYiA9IHN3X2F2YWlsOworCQlpZiAobmIgPiBod3NpemUgLSBzd3B0cikKKwkJCW5iID0gaHdzaXplIC0gc3dwdHI7IC8qIGRvbid0IG92ZXJmbG93IGh3YnVmICovCisJCWlmIChuYiA+IHN3c2l6ZSAtIHN3aWR4KQorCQkJbmIgPSBzd3NpemUgLSBzd2lkeDsgLyogZG9uJ3Qgb3ZlcmZsb3cgc3didWYgKi8KKwkJQVNTRVJUKG5iID4gMCk7CisJCWlmIChuYiAlIGZyYWdzaXplKSB7CisJCQlEQkdQKCJuYiA9ICVkLCBmcmFnc2l6ZSA9ICVkXG4iLCBuYiwgZnJhZ3NpemUpOworCQkJREJHUCgiaHdfYXZhaWwgPSAlZFxuIiwgaHdfYXZhaWwpOworCQkJREJHUCgic3dfYXZhaWwgPSAlZFxuIiwgc3dfYXZhaWwpOworCQkJREJHUCgiaHdzaXplID0gJWQsIHN3cHRyID0gJWRcbiIsIGh3c2l6ZSwgc3dwdHIpOworCQkJREJHUCgic3dzaXplID0gJWQsIHN3aWR4ID0gJWRcbiIsIHN3c2l6ZSwgc3dpZHgpOworCQl9CisJCUFTU0VSVCghKG5iICUgZnJhZ3NpemUpKTsKKwkJREJHUFYoImNvcHlpbmcgaHdiWyVkLi4lZF0gdG8gc3diWyVkLi4lZF1cbiIsCisJCSAgICAgIHN3cHRyLCBzd3B0ciArIG5iLCBzd2lkeCwgc3dpZHggKyBuYik7CisJCXBjbV9jb3B5X2luKHJwb3J0LCBzd2lkeCwgc3dwdHIsIG5iKTsKKwkJbGlfd3JpdGVfc3dwdHIoJnJwb3J0LT5jaGFuLCAoc3dwdHIgKyBuYikgJSBod3NpemUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7CisJCV9fc3diX2luY19pKHJwb3J0LCBuYik7CisJCXJwb3J0LT5ieXRlX2NvdW50ICs9IG5iOworCQlycG9ydC0+ZnJhZ19jb3VudCArPSBuYiAvIGZyYWdzaXplOworCQlBU1NFUlQobmIgJSBmcmFnc2l6ZSA9PSAwKTsKKwkJd2FrZV91cCgmcnBvcnQtPnF1ZXVlKTsKKwl9CisJcnBvcnQtPmZsYWdzICY9IH5IV19CVVNZOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOworCURCR1JWKCk7Cit9CisKKy8qCisgKiBwY21fZmx1c2hfZnJhZygpIHdyaXRlcyB6ZXJvIHNhbXBsZXMgdG8gZmlsbCB0aGUgY3VycmVudCBmcmFnbWVudCwKKyAqIHRoZW4gZmx1c2hlcyBpdCB0byB0aGUgaGFyZHdhcmUuCisgKgorICogSXQgaXMgb25seSBtZWFuaW5nZnVsIHRvIGZsdXNoIG91dHB1dCwgbm90IGlucHV0LgorICovCisKK3N0YXRpYyB2b2lkIHBjbV9mbHVzaF9mcmFnKHZ3c25kX2Rldl90ICpkZXZjKQoreworCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAmZGV2Yy0+d3BvcnQ7CisKKwlEQkdQVigic3dzdGF0ZSA9ICVkXG4iLCB3cG9ydC0+c3dzdGF0ZSk7CisJaWYgKHdwb3J0LT5zd3N0YXRlID09IFNXX1JVTikgeworCQlpbnQgaWR4ID0gd3BvcnQtPnN3Yl91X2lkeDsKKwkJaW50IGVuZCA9IChpZHggKyB3cG9ydC0+aHdfZnJhZ3NpemUgLSAxKQorCQkJPj4gd3BvcnQtPmh3X2ZyYWdzaGlmdAorCQkJPDwgd3BvcnQtPmh3X2ZyYWdzaGlmdDsKKwkJaW50IG5iID0gZW5kIC0gaWR4OworCQlEQkdQVigiY2xlYXJpbmcgJWQgYnl0ZXNcbiIsIG5iKTsKKwkJaWYgKG5iKQorCQkJbWVtc2V0KHdwb3J0LT5zd2J1ZiArIGlkeCwKKwkJCSAgICAgICAoY2hhcikgd3BvcnQtPnplcm9fd29yZCwKKwkJCSAgICAgICBuYik7CisJCXdwb3J0LT5zd3N0YXRlID0gU1dfRFJBSU47CisJCXBjbV9vdXRwdXQoZGV2YywgMCwgbmIpOworCX0KKwlEQkdSVigpOworfQorCisvKgorICogV2FpdCBmb3Igb3V0cHV0IHRvIGRyYWluLiAgVGhpcyBzbGVlcHMgdW5pbnRlcnJ1cHRpYmx5IGJlY2F1c2UKKyAqIHRoZXJlIGlzIG5vdGhpbmcgaW50ZWxsaWdlbnQgd2UgY2FuIGRvIGlmIGludGVycnVwdGVkLiAgVGhpcworICogbWVhbnMgdGhlIHByb2Nlc3Mgd2lsbCBiZSBkZWxheWVkIGluIHJlc3BvbmRpbmcgdG8gdGhlIHNpZ25hbC4KKyAqLworCitzdGF0aWMgdm9pZCBwY21fd3JpdGVfc3luYyh2d3NuZF9kZXZfdCAqZGV2YykKK3sKKwl2d3NuZF9wb3J0X3QgKndwb3J0ID0gJmRldmMtPndwb3J0OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdndzbmRfcG9ydF9od3N0YXRlX3QgaHdzdGF0ZTsKKworCURCR0VWKCIoZGV2Yz0weCVwKVxuIiwgZGV2Yyk7CisJYWRkX3dhaXRfcXVldWUoJndwb3J0LT5xdWV1ZSwgJndhaXQpOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndwb3J0LT5sb2NrLCBmbGFncyk7CisJCXsKKwkJCWh3c3RhdGUgPSB3cG9ydC0+aHdzdGF0ZTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQlpZiAoaHdzdGF0ZSA9PSBIV19TVE9QUEVEKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKKwlEQkdQVigic3dzdGF0ZSA9ICVkLCBod3N0YXRlID0gJWRcbiIsIHdwb3J0LT5zd3N0YXRlLCB3cG9ydC0+aHdzdGF0ZSk7CisJREJHUlYoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYXVkaW8gZHJpdmVyICovCisKKy8qCisgKiBzZWVrIG9uIGFuIGF1ZGlvIGRldmljZSBhbHdheXMgZmFpbHMuCisgKi8KKworc3RhdGljIHZvaWQgdndzbmRfYXVkaW9fcmVhZF9pbnRyKHZ3c25kX2Rldl90ICpkZXZjLCB1bnNpZ25lZCBpbnQgc3RhdHVzKQoreworCWludCBvdmVyZmxvd24gPSBzdGF0dXMgJiBMSV9JTlRSX0NPTU0xX09WRVJGTE9XOworCisJaWYgKHN0YXR1cyAmIFJFQURfSU5UUl9NQVNLKQorCQlwY21faW5wdXQoZGV2Yywgb3ZlcmZsb3duLCAwKTsKK30KKworc3RhdGljIHZvaWQgdndzbmRfYXVkaW9fd3JpdGVfaW50cih2d3NuZF9kZXZfdCAqZGV2YywgdW5zaWduZWQgaW50IHN0YXR1cykKK3sKKwlpbnQgdW5kZXJmbG93biA9IHN0YXR1cyAmIExJX0lOVFJfQ09NTTJfVU5ERVJGTE9XOworCisJaWYgKHN0YXR1cyAmIFdSSVRFX0lOVFJfTUFTSykKKwkJcGNtX291dHB1dChkZXZjLCB1bmRlcmZsb3duLCAwKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHZ3c25kX2F1ZGlvX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCURCR0VWKCIoaXJxPSVkLCBkZXZfaWQ9MHglcCwgcmVncz0weCVwKVxuIiwgaXJxLCBkZXZfaWQsIHJlZ3MpOworCisJc3RhdHVzID0gbGlfZ2V0X2NsZWFyX2ludHJfc3RhdHVzKCZkZXZjLT5saXRoKTsKKwl2d3NuZF9hdWRpb19yZWFkX2ludHIoZGV2Yywgc3RhdHVzKTsKKwl2d3NuZF9hdWRpb193cml0ZV9pbnRyKGRldmMsIHN0YXR1cyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3NpemVfdCB2d3NuZF9hdWRpb19kb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgIGNoYXIgKmJ1ZmZlciwKKwkJCQkgICBzaXplX3QgY291bnQsCisJCQkJICAgbG9mZl90ICpwcG9zKQoreworCXZ3c25kX2Rldl90ICpkZXZjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KKwkJCSAgICAgICAmZGV2Yy0+cnBvcnQgOiBOVUxMKTsKKwlpbnQgcmV0LCBuYjsKKworCURCR0VWKCIoZmlsZT0weCVwLCBidWZmZXI9MHglcCwgY291bnQ9JWQsIHBwb3M9MHglcClcbiIsCisJICAgICBmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKKworCWlmICghcnBvcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJwb3J0LT5zd2J1ZiA9PSBOVUxMKSB7CisJCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8KKwkJCSZkZXZjLT53cG9ydCA6IE5VTEw7CisJCXJldCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSAwOworCXdoaWxlIChjb3VudCkgeworCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwkJYWRkX3dhaXRfcXVldWUoJnJwb3J0LT5xdWV1ZSwgJndhaXQpOworCQl3aGlsZSAoKG5iID0gc3diX2luY191KHJwb3J0LCAwKSkgPT0gMCkgeworCQkJREJHUFYoImJsb2NraW5nXG4iKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAocnBvcnQtPmZsYWdzICYgRElTQUJMRUQgfHwKKwkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZycG9ydC0+cXVldWUsICZ3YWl0KTsKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcnBvcnQtPnF1ZXVlLCAmd2FpdCk7CisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKKwkJCX0KKwkJfQorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnJwb3J0LT5xdWV1ZSwgJndhaXQpOworCQlwY21faW5wdXQoZGV2YywgMCwgMCk7CisJCS8qIG5iIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdXNlcmJ1Zi4gKi8KKwkJaWYgKG5iID4gY291bnQpCisJCQluYiA9IGNvdW50OworCQlEQkdQVigibmIgPSAlZFxuIiwgbmIpOworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcnBvcnQtPnN3YnVmICsgcnBvcnQtPnN3Yl91X2lkeCwgbmIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCSh2b2lkKSBzd2JfaW5jX3UocnBvcnQsIG5iKTsKKwkJYnVmZmVyICs9IG5iOworCQljb3VudCAtPSBuYjsKKwkJcmV0ICs9IG5iOworCX0KKwlEQkdQVigicmV0dXJuaW5nICVkXG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZ3c25kX2F1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJY2hhciAqYnVmZmVyLAorCQkJCXNpemVfdCBjb3VudCwKKwkJCQlsb2ZmX3QgKnBwb3MpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisKKwlkb3duKCZkZXZjLT5pb19zZW1hKTsKKwlyZXQgPSB2d3NuZF9hdWRpb19kb19yZWFkKGZpbGUsIGJ1ZmZlciwgY291bnQsIHBwb3MpOworCXVwKCZkZXZjLT5pb19zZW1hKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCB2d3NuZF9hdWRpb19kb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJCSAgICBzaXplX3QgY291bnQsCisJCQkJICAgIGxvZmZfdCAqcHBvcykKK3sKKwl2d3NuZF9kZXZfdCAqZGV2YyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl2d3NuZF9wb3J0X3QgKndwb3J0ID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgPworCQkJICAgICAgICZkZXZjLT53cG9ydCA6IE5VTEwpOworCWludCByZXQsIG5iOworCisJREJHRVYoIihmaWxlPTB4JXAsIGJ1ZmZlcj0weCVwLCBjb3VudD0lZCwgcHBvcz0weCVwKVxuIiwKKwkgICAgICBmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKKworCWlmICghd3BvcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdwb3J0LT5zd2J1ZiA9PSBOVUxMKSB7CisJCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPworCQkJJmRldmMtPnJwb3J0IDogTlVMTDsKKwkJcmV0ID0gcGNtX3NldHVwKGRldmMsIHJwb3J0LCB3cG9ydCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKwl3aGlsZSAoY291bnQpIHsKKwkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJCWFkZF93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKKwkJd2hpbGUgKChuYiA9IHN3Yl9pbmNfdSh3cG9ydCwgMCkpID09IDApIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAod3BvcnQtPmZsYWdzICYgRElTQUJMRUQgfHwKKwkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmd3BvcnQtPnF1ZXVlLCAmd2FpdCk7CisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKKwkJCX0KKwkJfQorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJndwb3J0LT5xdWV1ZSwgJndhaXQpOworCQkvKiBuYiBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHVzZXJidWYuICovCisJCWlmIChuYiA+IGNvdW50KQorCQkJbmIgPSBjb3VudDsKKwkJREJHUFYoIm5iID0gJWRcbiIsIG5iKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHdwb3J0LT5zd2J1ZiArIHdwb3J0LT5zd2JfdV9pZHgsIGJ1ZmZlciwgbmIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXBjbV9vdXRwdXQoZGV2YywgMCwgbmIpOworCQlidWZmZXIgKz0gbmI7CisJCWNvdW50IC09IG5iOworCQlyZXQgKz0gbmI7CisJfQorCURCR1BWKCJyZXR1cm5pbmcgJWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdndzbmRfYXVkaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGNvdW50LAorCQkJCSBsb2ZmX3QgKnBwb3MpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisKKwlkb3duKCZkZXZjLT5pb19zZW1hKTsKKwlyZXQgPSB2d3NuZF9hdWRpb19kb193cml0ZShmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKKwl1cCgmZGV2Yy0+aW9fc2VtYSk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZ3c25kX2F1ZGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPworCQkmZGV2Yy0+cnBvcnQgOiBOVUxMOworCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8KKwkJJmRldmMtPndwb3J0IDogTlVMTDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlEQkdFVigiKGZpbGU9MHglcCwgd2FpdD0weCVwKVxuIiwgZmlsZSwgd2FpdCk7CisKKwlBU1NFUlQocnBvcnQgfHwgd3BvcnQpOworCWlmIChycG9ydCkgeworCQlwb2xsX3dhaXQoZmlsZSwgJnJwb3J0LT5xdWV1ZSwgd2FpdCk7CisJCWlmIChzd2JfaW5jX3UocnBvcnQsIDApKQorCQkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7CisJfQorCWlmICh3cG9ydCkgeworCQlwb2xsX3dhaXQoZmlsZSwgJndwb3J0LT5xdWV1ZSwgd2FpdCk7CisJCWlmICh3cG9ydC0+c3didWYgPT0gTlVMTCB8fCBzd2JfaW5jX3Uod3BvcnQsIDApKQorCQkJbWFzayB8PSAoUE9MTE9VVCB8IFBPTExXUk5PUk0pOworCX0KKworCURCR1BWKCJyZXR1cm5pbmcgMHgleFxuIiwgbWFzayk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgdndzbmRfYXVkaW9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZ3c25kX2Rldl90ICpkZXZjID0gKHZ3c25kX2Rldl90ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl2d3NuZF9wb3J0X3QgKnJwb3J0ID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KKwkJJmRldmMtPnJwb3J0IDogTlVMTDsKKwl2d3NuZF9wb3J0X3QgKndwb3J0ID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSA/CisJCSZkZXZjLT53cG9ydCA6IE5VTEw7CisJdndzbmRfcG9ydF90ICphcG9ydCA9IHJwb3J0ID8gcnBvcnQgOiB3cG9ydDsKKwlzdHJ1Y3QgYXVkaW9fYnVmX2luZm8gYnVmX2luZm87CisJc3RydWN0IGNvdW50X2luZm8gaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpdmFsOworCisJCisJREJHRVYoIihpbm9kZT0weCVwLCBmaWxlPTB4JXAsIGNtZD0weCV4LCBhcmc9MHglbHgpXG4iLAorCSAgICAgIGlub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgkJLyogX1NJT1IgKCdNJywgMTE4LCBpbnQpICovCisJCURCR1goIk9TU19HRVRWRVJTSU9OXG4iKTsKKwkJaXZhbCA9IFNPVU5EX1ZFUlNJT047CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoJLyogX1NJT1IgKCdQJywxNSwgaW50KSAqLworCQlEQkdYKCJTTkRDVExfRFNQX0dFVENBUFNcbiIpOworCQlpdmFsID0gRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CS8qIF9TSU9SICgnUCcsMTEsIGludCkgKi8KKwkJREJHWCgiU05EQ1RMX0RTUF9HRVRGTVRTXG4iKTsKKwkJaXZhbCA9IChBRk1UX1MxNl9MRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVyB8CisJCQlBRk1UX1U4IHwgQUZNVF9TOCk7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgkvKiBfU0lPUiAoJ1AnLCAyLCBpbnQpICovCisJCURCR1goIlNPVU5EX1BDTV9SRUFEX1JBVEVcbiIpOworCQlpdmFsID0gYXBvcnQtPnN3X2ZyYW1lcmF0ZTsKKwkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CS8qIF9TSU9SICgnUCcsIDYsIGludCkgKi8KKwkJREJHWCgiU09VTkRfUENNX1JFQURfQ0hBTk5FTFNcbiIpOworCQlpdmFsID0gYXBvcnQtPnN3X2NoYW5uZWxzOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgkJLyogX1NJT1dSKCdQJywgMiwgaW50KSAqLworCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURCR1goIlNORENUTF9EU1BfU1BFRUQgJWRcbiIsIGl2YWwpOworCQlpZiAoaXZhbCkgeworCQkJaWYgKGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpIHsKKwkJCQlEQkdYKCJTTkRDVExfRFNQX1NQRUVEIGZhaWxlZDogc3dzdGF0ZSA9ICVkXG4iLAorCQkJCSAgICAgYXBvcnQtPnN3c3RhdGUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKGl2YWwgPCBNSU5fU1BFRUQpCisJCQkJaXZhbCA9IE1JTl9TUEVFRDsKKwkJCWlmIChpdmFsID4gTUFYX1NQRUVEKQorCQkJCWl2YWwgPSBNQVhfU1BFRUQ7CisJCQlpZiAocnBvcnQpCisJCQkJcnBvcnQtPnN3X2ZyYW1lcmF0ZSA9IGl2YWw7CisJCQlpZiAod3BvcnQpCisJCQkJd3BvcnQtPnN3X2ZyYW1lcmF0ZSA9IGl2YWw7CisJCX0gZWxzZQorCQkJaXZhbCA9IGFwb3J0LT5zd19mcmFtZXJhdGU7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOgkJLyogX1NJT1dSKCdQJywgMywgaW50KSAqLworCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURCR1goIlNORENUTF9EU1BfU1RFUkVPICVkXG4iLCBpdmFsKTsKKwkJaWYgKGl2YWwgIT0gMCAmJiBpdmFsICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHJwb3J0KQorCQkJcnBvcnQtPnN3X2NoYW5uZWxzID0gaXZhbCArIDE7CisJCWlmICh3cG9ydCkKKwkJCXdwb3J0LT5zd19jaGFubmVscyA9IGl2YWwgKyAxOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgkvKiBfU0lPV1IoJ1AnLCA2LCBpbnQpICovCisJCWlmIChnZXRfdXNlcihpdmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJREJHWCgiU05EQ1RMX0RTUF9DSEFOTkVMUyAlZFxuIiwgaXZhbCk7CisJCWlmIChpdmFsICE9IDEgJiYgaXZhbCAhPSAyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChycG9ydCkKKwkJCXJwb3J0LT5zd19jaGFubmVscyA9IGl2YWw7CisJCWlmICh3cG9ydCkKKwkJCXdwb3J0LT5zd19jaGFubmVscyA9IGl2YWw7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToJLyogX1NJT1dSKCdQJywgNCwgaW50KSAqLworCQlpdmFsID0gcGNtX3NldHVwKGRldmMsIHJwb3J0LCB3cG9ydCk7CisJCWlmIChpdmFsIDwgMCkgeworCQkJREJHWCgiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIGZhaWxlZCwgZXJybm8gJWRcbiIsIGl2YWwpOworCQkJcmV0dXJuIGl2YWw7CisJCX0KKwkJaXZhbCA9IDEgPDwgYXBvcnQtPnN3X2ZyYWdzaGlmdDsKKwkJREJHWCgiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIHJldHVybmluZyAlZFxuIiwgaXZhbCk7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CS8qIF9TSU9XUignUCcsMTAsIGludCkgKi8KKwkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlEQkdYKCJTTkRDVExfRFNQX1NFVEZSQUdNRU5UICVkOiVkXG4iLAorCQkgICAgIGl2YWwgPj4gMTYsIGl2YWwgJiAweEZGRkYpOworCQlpZiAoYXBvcnQtPnN3c3RhdGUgIT0gU1dfSU5JVElBTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQl7CisJCQlpbnQgc3dfZnJhZ3NoaWZ0ID0gaXZhbCAmIDB4RkZGRjsKKwkJCWludCBzd19zdWJkaXZzaGlmdCA9IGFwb3J0LT5zd19zdWJkaXZzaGlmdDsKKwkJCWludCBod19mcmFnc2hpZnQgPSBzd19mcmFnc2hpZnQgLSBzd19zdWJkaXZzaGlmdDsKKwkJCWludCBzd19mcmFnY291bnQgPSAoaXZhbCA+PiAxNikgJiAweEZGRkY7CisJCQlpbnQgaHdfZnJhZ3NpemU7CisJCQlpZiAoaHdfZnJhZ3NoaWZ0IDwgTUlOX0ZSQUdTSElGVCkKKwkJCQlod19mcmFnc2hpZnQgPSBNSU5fRlJBR1NISUZUOworCQkJaWYgKGh3X2ZyYWdzaGlmdCA+IE1BWF9GUkFHU0hJRlQpCisJCQkJaHdfZnJhZ3NoaWZ0ID0gTUFYX0ZSQUdTSElGVDsKKwkJCXN3X2ZyYWdzaGlmdCA9IGh3X2ZyYWdzaGlmdCArIGFwb3J0LT5zd19zdWJkaXZzaGlmdDsKKwkJCWh3X2ZyYWdzaXplID0gMSA8PCBod19mcmFnc2hpZnQ7CisJCQlpZiAoc3dfZnJhZ2NvdW50IDwgTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkpCisJCQkJc3dfZnJhZ2NvdW50ID0gTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSk7CisJCQlpZiAoc3dfZnJhZ2NvdW50ID4gTUFYX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkpCisJCQkJc3dfZnJhZ2NvdW50ID0gTUFYX0ZSQUdDT1VOVChod19mcmFnc2l6ZSk7CisJCQlEQkdQVigic3dfZnJhZ3NoaWZ0ID0gJWRcbiIsIHN3X2ZyYWdzaGlmdCk7CisJCQlEQkdQVigicnBvcnQgPSAweCVwLCB3cG9ydCA9IDB4JXBcbiIsIHJwb3J0LCB3cG9ydCk7CisJCQlpZiAocnBvcnQpIHsKKwkJCQlycG9ydC0+c3dfZnJhZ3NoaWZ0ID0gc3dfZnJhZ3NoaWZ0OworCQkJCXJwb3J0LT5zd19mcmFnY291bnQgPSBzd19mcmFnY291bnQ7CisJCQl9CisJCQlpZiAod3BvcnQpIHsKKwkJCQl3cG9ydC0+c3dfZnJhZ3NoaWZ0ID0gc3dfZnJhZ3NoaWZ0OworCQkJCXdwb3J0LT5zd19mcmFnY291bnQgPSBzd19mcmFnY291bnQ7CisJCQl9CisJCQlpdmFsID0gc3dfZnJhZ2NvdW50IDw8IDE2IHwgc3dfZnJhZ3NoaWZ0OworCQl9CisJCURCR1goIlNORENUTF9EU1BfU0VURlJBR01FTlQgcmV0dXJucyAlZDolZFxuIiwKKwkJICAgICAgaXZhbCA+PiAxNiwgaXZhbCAmIDB4RkZGRik7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgkvKiBfU0lPV1IoJ1AnLCA5LCBpbnQpICovCisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlEQkdYKCJTTkRDVExfRFNQX1NVQkRJVklERSAlZFxuIiwgaXZhbCk7CisJCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXsKKwkJCWludCBzdWJkaXZzaGlmdDsKKwkJCWludCBod19mcmFnc2hpZnQsIGh3X2ZyYWdzaXplLCBod19mcmFnY291bnQ7CisJCQlzd2l0Y2ggKGl2YWwpIHsKKwkJCWNhc2UgMTogc3ViZGl2c2hpZnQgPSAwOyBicmVhazsKKwkJCWNhc2UgMjogc3ViZGl2c2hpZnQgPSAxOyBicmVhazsKKwkJCWNhc2UgNDogc3ViZGl2c2hpZnQgPSAyOyBicmVhazsKKwkJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaHdfZnJhZ3NoaWZ0ID0gYXBvcnQtPnN3X2ZyYWdzaGlmdCAtIHN1YmRpdnNoaWZ0OworCQkJaWYgKGh3X2ZyYWdzaGlmdCA8IE1JTl9GUkFHU0hJRlQgfHwKKwkJCSAgICBod19mcmFnc2hpZnQgPiBNQVhfRlJBR1NISUZUKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaHdfZnJhZ3NpemUgPSAxIDw8IGh3X2ZyYWdzaGlmdDsKKwkJCWh3X2ZyYWdjb3VudCA9IGFwb3J0LT5zd19mcmFnY291bnQgPj4gc3ViZGl2c2hpZnQ7CisJCQlpZiAoaHdfZnJhZ2NvdW50IDwgTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkgfHwKKwkJCSAgICBod19mcmFnY291bnQgPiBNQVhfRlJBR0NPVU5UKGh3X2ZyYWdzaXplKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChycG9ydCkKKwkJCQlycG9ydC0+c3dfc3ViZGl2c2hpZnQgPSBzdWJkaXZzaGlmdDsKKwkJCWlmICh3cG9ydCkKKwkJCQl3cG9ydC0+c3dfc3ViZGl2c2hpZnQgPSBzdWJkaXZzaGlmdDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CQkvKiBfU0lPV1IoJ1AnLDUsIGludCkgKi8KKwkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlEQkdYKCJTTkRDVExfRFNQX1NFVEZNVCAlZFxuIiwgaXZhbCk7CisJCWlmIChpdmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKSB7CisJCQkJREJHUCgiU0VURk1UIGZhaWxlZCwgc3dzdGF0ZSA9ICVkXG4iLAorCQkJCSAgICAgYXBvcnQtPnN3c3RhdGUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJc3dpdGNoIChpdmFsKSB7CisJCQljYXNlIEFGTVRfTVVfTEFXOgorCQkJY2FzZSBBRk1UX0FfTEFXOgorCQkJY2FzZSBBRk1UX1U4OgorCQkJY2FzZSBBRk1UX1M4OgorCQkJY2FzZSBBRk1UX1MxNl9MRToKKwkJCQlpZiAocnBvcnQpCisJCQkJCXJwb3J0LT5zd19zYW1wbGVmbXQgPSBpdmFsOworCQkJCWlmICh3cG9ydCkKKwkJCQkJd3BvcnQtPnN3X3NhbXBsZWZtdCA9IGl2YWw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCWl2YWwgPSBhcG9ydC0+c3dfc2FtcGxlZm10OworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToJLyogX1NJT1IgKCdQJywxMiwgYXVkaW9fYnVmX2luZm8pICovCisJCURCR1hWKCJTTkRDVExfRFNQX0dFVE9TUEFDRVxuIik7CisJCWlmICghd3BvcnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaXZhbCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOworCQlpZiAoaXZhbCA8IDApCisJCQlyZXR1cm4gaXZhbDsKKwkJaXZhbCA9IHN3Yl9pbmNfdSh3cG9ydCwgMCk7CisJCWJ1Zl9pbmZvLmZyYWdtZW50cyA9IGl2YWwgPj4gd3BvcnQtPnN3X2ZyYWdzaGlmdDsKKwkJYnVmX2luZm8uZnJhZ3N0b3RhbCA9IHdwb3J0LT5zd19mcmFnY291bnQ7CisJCWJ1Zl9pbmZvLmZyYWdzaXplID0gMSA8PCB3cG9ydC0+c3dfZnJhZ3NoaWZ0OworCQlidWZfaW5mby5ieXRlcyA9IGl2YWw7CisJCURCR1hWKCJTTkRDVExfRFNQX0dFVE9TUEFDRSByZXR1cm5zIHsgJWQgJWQgJWQgJWQgfVxuIiwKKwkJICAgICBidWZfaW5mby5mcmFnbWVudHMsIGJ1Zl9pbmZvLmZyYWdzdG90YWwsCisJCSAgICAgYnVmX2luZm8uZnJhZ3NpemUsIGJ1Zl9pbmZvLmJ5dGVzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZidWZfaW5mbywgc2l6ZW9mIGJ1Zl9pbmZvKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CS8qIF9TSU9SICgnUCcsMTMsIGF1ZGlvX2J1Zl9pbmZvKSAqLworCQlEQkdYKCJTTkRDVExfRFNQX0dFVElTUEFDRVxuIik7CisJCWlmICghcnBvcnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaXZhbCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOworCQlpZiAoaXZhbCA8IDApCisJCQlyZXR1cm4gaXZhbDsKKwkJaXZhbCA9IHN3Yl9pbmNfdShycG9ydCwgMCk7CisJCWJ1Zl9pbmZvLmZyYWdtZW50cyA9IGl2YWwgPj4gcnBvcnQtPnN3X2ZyYWdzaGlmdDsKKwkJYnVmX2luZm8uZnJhZ3N0b3RhbCA9IHJwb3J0LT5zd19mcmFnY291bnQ7CisJCWJ1Zl9pbmZvLmZyYWdzaXplID0gMSA8PCBycG9ydC0+c3dfZnJhZ3NoaWZ0OworCQlidWZfaW5mby5ieXRlcyA9IGl2YWw7CisJCURCR1goIlNORENUTF9EU1BfR0VUSVNQQUNFIHJldHVybnMgeyAlZCAlZCAlZCAlZCB9XG4iLAorCQkgICAgIGJ1Zl9pbmZvLmZyYWdtZW50cywgYnVmX2luZm8uZnJhZ3N0b3RhbCwKKwkJICAgICBidWZfaW5mby5mcmFnc2l6ZSwgYnVmX2luZm8uYnl0ZXMpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmJ1Zl9pbmZvLCBzaXplb2YgYnVmX2luZm8pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgkvKiBfU0lPICAoJ1AnLDE0KSAqLworCQlEQkdYKCJTTkRDVExfRFNQX05PTkJMT0NLXG4iKTsKKwkJZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoJCS8qIF9TSU8gICgnUCcsIDApICovCisJCURCR1goIlNORENUTF9EU1BfUkVTRVRcbiIpOworCQkvKgorCQkgKiBOb3RoaW5nIHNwZWNpYWwgbmVlZHMgdG8gYmUgZG9uZSBmb3IgaW5wdXQuICBJbnB1dAorCQkgKiBzYW1wbGVzIHNpdCBpbiBzd2J1ZiwgYnV0IGl0IHdpbGwgYmUgcmVpbml0aWFsaXplZAorCQkgKiB0byBlbXB0eSB3aGVuIHBjbV9zZXR1cCgpIGlzIGNhbGxlZC4KKwkJICovCisJCWlmICh3cG9ydCAmJiB3cG9ydC0+c3didWYpIHsKKwkJCXdwb3J0LT5zd3N0YXRlID0gU1dfSU5JVElBTDsKKwkJCXBjbV9vdXRwdXQoZGV2YywgMCwgMCk7CisJCQlwY21fd3JpdGVfc3luYyhkZXZjKTsKKwkJfQorCQlwY21fc2h1dGRvd24oZGV2YywgcnBvcnQsIHdwb3J0KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoJCS8qIF9TSU8gICgnUCcsIDEpICovCisJCURCR1goIlNORENUTF9EU1BfU1lOQ1xuIik7CisJCWlmICh3cG9ydCkgeworCQkJcGNtX2ZsdXNoX2ZyYWcoZGV2Yyk7CisJCQlwY21fd3JpdGVfc3luYyhkZXZjKTsKKwkJfQorCQlwY21fc2h1dGRvd24oZGV2YywgcnBvcnQsIHdwb3J0KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDoJCS8qIF9TSU8gICgnUCcsIDgpICovCisJCURCR1goIlNORENUTF9EU1BfUE9TVFxuIik7CisJCWlmICghd3BvcnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcGNtX2ZsdXNoX2ZyYWcoZGV2Yyk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CS8qIF9TSU9SICgnUCcsIDE3LCBjb3VudF9pbmZvKSAqLworCQlEQkdYKCJTTkRDVExfRFNQX0dFVElQVFJcbiIpOworCQlpZiAoIXJwb3J0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZycG9ydC0+bG9jaywgZmxhZ3MpOworCQl7CisJCQl1c3Rtc2NfdCB1c3Rtc2M7CisJCQlpZiAocnBvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgeworCQkJCUFTU0VSVChycG9ydC0+c3dzdGF0ZSA9PSBTV19SVU4pOworCQkJCWxpX3JlYWRfVVNUTVNDKCZycG9ydC0+Y2hhbiwgJnVzdG1zYyk7CisJCQkJaW5mby5ieXRlcyA9IHVzdG1zYy5tc2MgLSBycG9ydC0+TVNDX29mZnNldDsKKwkJCQlpbmZvLmJ5dGVzICo9IHJwb3J0LT5mcmFtZV9zaXplOworCQkJfSBlbHNlIHsKKwkJCQlpbmZvLmJ5dGVzID0gcnBvcnQtPmJ5dGVfY291bnQ7CisJCQl9CisJCQlpbmZvLmJsb2NrcyA9IHJwb3J0LT5mcmFnX2NvdW50OworCQkJaW5mby5wdHIgPSAwOwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwkJCXJwb3J0LT5mcmFnX2NvdW50ID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmluZm8sIHNpemVvZiBpbmZvKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgkvKiBfU0lPUiAoJ1AnLDE4LCBjb3VudF9pbmZvKSAqLworCQlEQkdYKCJTTkRDVExfRFNQX0dFVE9QVFJcbiIpOworCQlpZiAoIXdwb3J0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQl7CisJCQl1c3Rtc2NfdCB1c3Rtc2M7CisJCQlpZiAod3BvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgeworCQkJCUFTU0VSVCh3cG9ydC0+c3dzdGF0ZSA9PSBTV19SVU4pOworCQkJCWxpX3JlYWRfVVNUTVNDKCZ3cG9ydC0+Y2hhbiwgJnVzdG1zYyk7CisJCQkJaW5mby5ieXRlcyA9IHVzdG1zYy5tc2MgLSB3cG9ydC0+TVNDX29mZnNldDsKKwkJCQlpbmZvLmJ5dGVzICo9IHdwb3J0LT5mcmFtZV9zaXplOworCQkJfSBlbHNlIHsKKwkJCQlpbmZvLmJ5dGVzID0gd3BvcnQtPmJ5dGVfY291bnQ7CisJCQl9CisJCQlpbmZvLmJsb2NrcyA9IHdwb3J0LT5mcmFnX2NvdW50OworCQkJaW5mby5wdHIgPSAwOwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwkJCXdwb3J0LT5mcmFnX2NvdW50ID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmluZm8sIHNpemVvZiBpbmZvKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CS8qIF9TSU9SICgnUCcsIDIzLCBpbnQpICovCisJCURCR1goIlNORENUTF9EU1BfR0VUT0RFTEFZXG4iKTsKKwkJaWYgKCF3cG9ydCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKKwkJeworCQkJaW50IGZzaXplID0gd3BvcnQtPmZyYW1lX3NpemU7CisJCQlpdmFsID0gd3BvcnQtPnN3Yl9pX2F2YWlsIC8gZnNpemU7CisJCQlpZiAod3BvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgeworCQkJCWludCBzd3B0ciwgaHdwdHIsIGh3ZnJhbWVzLCBod2J5dGVzLCBod3NpemU7CisJCQkJaW50IHRvdGFsaHdieXRlczsKKwkJCQl1c3Rtc2NfdCB1c3Rtc2M7CisKKwkJCQlod3NpemUgPSB3cG9ydC0+aHdidWZfc2l6ZTsKKwkJCQlzd3B0ciA9IGxpX3JlYWRfc3dwdHIoJndwb3J0LT5jaGFuKTsKKwkJCQlsaV9yZWFkX1VTVE1TQygmd3BvcnQtPmNoYW4sICZ1c3Rtc2MpOworCQkJCWh3ZnJhbWVzID0gdXN0bXNjLm1zYyAtIHdwb3J0LT5NU0Nfb2Zmc2V0OworCQkJCXRvdGFsaHdieXRlcyA9IGh3ZnJhbWVzICogZnNpemU7CisJCQkJaHdwdHIgPSB0b3RhbGh3Ynl0ZXMgJSBod3NpemU7CisJCQkJaHdieXRlcyA9IChzd3B0ciAtIGh3cHRyICsgaHdzaXplKSAlIGh3c2l6ZTsKKwkJCQlpdmFsICs9IGh3Ynl0ZXMgLyBmc2l6ZTsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1BST0ZJTEU6CS8qIF9TSU9XICgnUCcsIDIzLCBpbnQpICovCisJCURCR1goIlNORENUTF9EU1BfUFJPRklMRVxuIik7CisKKwkJLyoKKwkJICogVGhvbWFzIFNhaWxlciBleHBsYWlucyBTTkRDVExfRFNQX1BST0ZJTEUKKwkJICogKHByaXZhdGUgZW1haWwsIE1hcmNoIDI0LCAxOTk5KToKKwkJICoKKwkJICogICAgIFRoaXMgZ2l2ZXMgdGhlIHNvdW5kIGRyaXZlciBhIGhpbnQgb24gd2hhdCBpdAorCQkgKiAgICAgc2hvdWxkIGRvIHdpdGggcGFydGlhbCBmcmFnbWVudHMKKwkJICogICAgIChpLmUuIGZyYWdtZW50cyBwYXJ0aWFsbHkgZmlsbGVkIHdpdGggd3JpdGUpLgorCQkgKiAgICAgVGhpcyBjYW4gZGlyZWN0IHRoZSBkcml2ZXIgdG8gemVybyB0aGVtIG9yCisJCSAqICAgICBsZWF2ZSB0aGVtIGFsb25lLiAgQnV0IGRvbid0IGFzayBtZSB3aGF0IHRoaXMKKwkJICogICAgIGlzIGdvb2QgZm9yLCBteSBkcml2ZXIganVzdCB6ZXJvZXMgdGhlIGxhc3QKKwkJICogICAgIGZyYWdtZW50IGJlZm9yZSB0aGUgcmVjZWl2ZXIgc3RvcHMsIG5vIGlkZWEKKwkJICogICAgIHdoYXQgZ29vZCBmb3IgYW55IG90aGVyIGJlaGF2aW91ciBjb3VsZAorCQkgKiAgICAgYmUuIEltcGxlbWVudGluZyBpdCBhcyBOT1Agc2VlbXMgc2FmZS4KKwkJICovCisKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoJLyogX1NJT1IgKCdQJywxNiwgaW50KSAqLworCQlEQkdYKCJTTkRDVExfRFNQX0dFVFRSSUdHRVJcbiIpOworCQlpdmFsID0gMDsKKwkJaWYgKHJwb3J0KSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCXsKKwkJCQlpZiAoIShycG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkpCisJCQkJCWl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBmbGFncyk7CisJCX0KKwkJaWYgKHdwb3J0KSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCXsKKwkJCQlpZiAoISh3cG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkpCisJCQkJCWl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQl9CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoJLyogX1NJT1cgKCdQJywxNiwgaW50KSAqLworCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURCR1goIlNORENUTF9EU1BfU0VUVFJJR0dFUiAlZFxuIiwgaXZhbCk7CisKKwkJLyoKKwkJICogSWYgdXNlciBpcyBkaXNhYmxpbmcgSS9PIGFuZCBwb3J0IGlzIG5vdCBpbiBpbml0aWFsCisJCSAqIHN0YXRlLCBmYWlsIHdpdGggRUlOVkFMLgorCQkgKi8KKworCQlpZiAoKChycG9ydCAmJiAhKGl2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSkgfHwKKwkJICAgICAod3BvcnQgJiYgIShpdmFsICYgUENNX0VOQUJMRV9PVVRQVVQpKSkgJiYKKwkJICAgIGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAocnBvcnQpIHsKKwkJCXZ3c25kX3BvcnRfaHdzdGF0ZV90IGh3c3RhdGU7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCXsKKwkJCQlod3N0YXRlID0gcnBvcnQtPmh3c3RhdGU7CisJCQkJaWYgKGl2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQkJCQlycG9ydC0+ZmxhZ3MgJj0gfkRJU0FCTEVEOworCQkJCWVsc2UKKwkJCQkJcnBvcnQtPmZsYWdzIHw9IERJU0FCTEVEOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChod3N0YXRlICE9IEhXX1JVTk5JTkcgJiYgaXZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKworCQkJCWlmIChycG9ydC0+c3dzdGF0ZSA9PSBTV19JTklUSUFMKQorCQkJCQlwY21fc2V0dXAoZGV2YywgcnBvcnQsIHdwb3J0KTsKKwkJCQllbHNlCisJCQkJCWxpX2FjdGl2YXRlX2RtYSgmcnBvcnQtPmNoYW4pOworCQkJfQorCQl9CisJCWlmICh3cG9ydCkgeworCQkJdndzbmRfcG9ydF9mbGFnc190IHBmbGFnczsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQkJeworCQkJCXBmbGFncyA9IHdwb3J0LT5mbGFnczsKKwkJCQlpZiAoaXZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKQorCQkJCQl3cG9ydC0+ZmxhZ3MgJj0gfkRJU0FCTEVEOworCQkJCWVsc2UKKwkJCQkJd3BvcnQtPmZsYWdzIHw9IERJU0FCTEVEOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChwZmxhZ3MgJiBESVNBQkxFRCAmJiBpdmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAod3BvcnQtPnN3c3RhdGUgPT0gU1dfUlVOKQorCQkJCQlwY21fb3V0cHV0KGRldmMsIDAsIDApOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJREJHUCgidW5rbm93biBpb2N0bCAweCV4XG4iLCBjbWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJREJHUCgidW5pbXBsZW1lbnRlZCBpb2N0bCAweCV4XG4iLCBjbWQpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZ3c25kX2F1ZGlvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCWRvd24oJmRldmMtPmlvX3NlbWEpOworCXJldCA9IHZ3c25kX2F1ZGlvX2RvX2lvY3RsKGlub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJdXAoJmRldmMtPmlvX3NlbWEpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIG1tYXAuICovCisKK3N0YXRpYyBpbnQgdndzbmRfYXVkaW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJREJHRSgiKGZpbGU9MHglcCwgdm1hPTB4JXApXG4iLCBmaWxlLCB2bWEpOworCXJldHVybiAtRU5PREVWOworfQorCisvKgorICogT3BlbiB0aGUgYXVkaW8gZGV2aWNlIGZvciByZWFkIGFuZC9vciB3cml0ZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCB2d3NuZF9hdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXZ3c25kX2Rldl90ICpkZXZjOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50IHN3X3NhbXBsZWZtdDsKKworCURCR0UoIihpbm9kZT0weCVwLCBmaWxlPTB4JXApXG4iLCBpbm9kZSwgZmlsZSk7CisKKwlJTkNfVVNFX0NPVU5UOworCWZvciAoZGV2YyA9IHZ3c25kX2Rldl9saXN0OyBkZXZjOyBkZXZjID0gZGV2Yy0+bmV4dF9kZXYpCisJCWlmICgoZGV2Yy0+YXVkaW9fbWlub3IgJiB+MHgwRikgPT0gKG1pbm9yICYgfjB4MEYpKQorCQkJYnJlYWs7CisKKwlpZiAoZGV2YyA9PSBOVUxMKSB7CisJCURFQ19VU0VfQ09VTlQ7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRvd24oJmRldmMtPm9wZW5fc2VtYSk7CisJd2hpbGUgKGRldmMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCQl1cCgmZGV2Yy0+b3Blbl9zZW1hKTsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlERUNfVVNFX0NPVU5UOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZkZXZjLT5vcGVuX3dhaXQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCURFQ19VU0VfQ09VTlQ7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJCWRvd24oJmRldmMtPm9wZW5fc2VtYSk7CisJfQorCWRldmMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKwl1cCgmZGV2Yy0+b3Blbl9zZW1hKTsKKworCS8qIGdldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQgZnJvbSBtaW5vciBudW1iZXIuICovCisKKwlzd19zYW1wbGVmbXQgPSAwOworCWlmICgobWlub3IgJiAweEYpID09IFNORF9ERVZfRFNQKQorCQlzd19zYW1wbGVmbXQgPSBBRk1UX1U4OworCWVsc2UgaWYgKChtaW5vciAmIDB4RikgPT0gU05EX0RFVl9BVURJTykKKwkJc3dfc2FtcGxlZm10ID0gQUZNVF9NVV9MQVc7CisJZWxzZSBpZiAoKG1pbm9yICYgMHhGKSA9PSBTTkRfREVWX0RTUDE2KQorCQlzd19zYW1wbGVmbXQgPSBBRk1UX1MxNl9MRTsKKwllbHNlCisJCUFTU0VSVCgwKTsKKworCS8qIEluaXRpYWxpemUgdndzbmRfcG9ydHMuICovCisKKwlkb3duKCZkZXZjLT5pb19zZW1hKTsKKwl7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlkZXZjLT5ycG9ydC5zd3N0YXRlICAgICAgICA9IFNXX0lOSVRJQUw7CisJCQlkZXZjLT5ycG9ydC5mbGFncyAgICAgICAgICA9IDA7CisJCQlkZXZjLT5ycG9ydC5zd19jaGFubmVscyAgICA9IDE7CisJCQlkZXZjLT5ycG9ydC5zd19zYW1wbGVmbXQgICA9IHN3X3NhbXBsZWZtdDsKKwkJCWRldmMtPnJwb3J0LnN3X2ZyYW1lcmF0ZSAgID0gODAwMDsKKwkJCWRldmMtPnJwb3J0LnN3X2ZyYWdzaGlmdCAgID0gREVGQVVMVF9GUkFHU0hJRlQ7CisJCQlkZXZjLT5ycG9ydC5zd19mcmFnY291bnQgICA9IERFRkFVTFRfRlJBR0NPVU5UOworCQkJZGV2Yy0+cnBvcnQuc3dfc3ViZGl2c2hpZnQgPSBERUZBVUxUX1NVQkRJVlNISUZUOworCQkJZGV2Yy0+cnBvcnQuYnl0ZV9jb3VudCAgICAgPSAwOworCQkJZGV2Yy0+cnBvcnQuZnJhZ19jb3VudCAgICAgPSAwOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJZGV2Yy0+d3BvcnQuc3dzdGF0ZSAgICAgICAgPSBTV19JTklUSUFMOworCQkJZGV2Yy0+d3BvcnQuZmxhZ3MgICAgICAgICAgPSAwOworCQkJZGV2Yy0+d3BvcnQuc3dfY2hhbm5lbHMgICAgPSAxOworCQkJZGV2Yy0+d3BvcnQuc3dfc2FtcGxlZm10ICAgPSBzd19zYW1wbGVmbXQ7CisJCQlkZXZjLT53cG9ydC5zd19mcmFtZXJhdGUgICA9IDgwMDA7CisJCQlkZXZjLT53cG9ydC5zd19mcmFnc2hpZnQgICA9IERFRkFVTFRfRlJBR1NISUZUOworCQkJZGV2Yy0+d3BvcnQuc3dfZnJhZ2NvdW50ICAgPSBERUZBVUxUX0ZSQUdDT1VOVDsKKwkJCWRldmMtPndwb3J0LnN3X3N1YmRpdnNoaWZ0ID0gREVGQVVMVF9TVUJESVZTSElGVDsKKwkJCWRldmMtPndwb3J0LmJ5dGVfY291bnQgICAgID0gMDsKKwkJCWRldmMtPndwb3J0LmZyYWdfY291bnQgICAgID0gMDsKKwkJfQorCX0KKwl1cCgmZGV2Yy0+aW9fc2VtYSk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXZjOworCURCR1JWKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWxlYXNlIChjbG9zZSkgdGhlIGF1ZGlvIGRldmljZS4KKyAqLworCitzdGF0aWMgaW50IHZ3c25kX2F1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSBOVUxMLCAqcnBvcnQgPSBOVUxMOworCWludCBlcnIgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKwlkb3duKCZkZXZjLT5pb19zZW1hKTsKKwl7CisJCURCR0VWKCIoaW5vZGU9MHglcCwgZmlsZT0weCVwKVxuIiwgaW5vZGUsIGZpbGUpOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcnBvcnQgPSAmZGV2Yy0+cnBvcnQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJd3BvcnQgPSAmZGV2Yy0+d3BvcnQ7CisJCQlwY21fZmx1c2hfZnJhZyhkZXZjKTsKKwkJCXBjbV93cml0ZV9zeW5jKGRldmMpOworCQl9CisJCXBjbV9zaHV0ZG93bihkZXZjLCBycG9ydCwgd3BvcnQpOworCQlpZiAocnBvcnQpCisJCQlycG9ydC0+c3dzdGF0ZSA9IFNXX09GRjsKKwkJaWYgKHdwb3J0KQorCQkJd3BvcnQtPnN3c3RhdGUgPSBTV19PRkY7CisJfQorCXVwKCZkZXZjLT5pb19zZW1hKTsKKworCWRvd24oJmRldmMtPm9wZW5fc2VtYSk7CisJeworCQlkZXZjLT5vcGVuX21vZGUgJj0gfmZpbGUtPmZfbW9kZTsKKwl9CisJdXAoJmRldmMtPm9wZW5fc2VtYSk7CisJd2FrZV91cCgmZGV2Yy0+b3Blbl93YWl0KTsKKwlERUNfVVNFX0NPVU5UOworCURCR1IoKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdndzbmRfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubGxzZWVrID0Jbm9fbGxzZWVrLAorCS5yZWFkID0JCXZ3c25kX2F1ZGlvX3JlYWQsCisJLndyaXRlID0JdndzbmRfYXVkaW9fd3JpdGUsCisJLnBvbGwgPQkJdndzbmRfYXVkaW9fcG9sbCwKKwkuaW9jdGwgPQl2d3NuZF9hdWRpb19pb2N0bCwKKwkubW1hcCA9CQl2d3NuZF9hdWRpb19tbWFwLAorCS5vcGVuID0JCXZ3c25kX2F1ZGlvX29wZW4sCisJLnJlbGVhc2UgPQl2d3NuZF9hdWRpb19yZWxlYXNlLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbWl4ZXIgZHJpdmVyICovCisKKy8qIG9wZW4gdGhlIG1peGVyIGRldmljZS4gKi8KKworc3RhdGljIGludCB2d3NuZF9taXhlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXZ3c25kX2Rldl90ICpkZXZjOworCisJREJHRVYoIihpbm9kZT0weCVwLCBmaWxlPTB4JXApXG4iLCBpbm9kZSwgZmlsZSk7CisKKwlJTkNfVVNFX0NPVU5UOworCWZvciAoZGV2YyA9IHZ3c25kX2Rldl9saXN0OyBkZXZjOyBkZXZjID0gZGV2Yy0+bmV4dF9kZXYpCisJCWlmIChkZXZjLT5taXhlcl9taW5vciA9PSBpbWlub3IoaW5vZGUpKQorCQkJYnJlYWs7CisKKwlpZiAoZGV2YyA9PSBOVUxMKSB7CisJCURFQ19VU0VfQ09VTlQ7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXZjOworCXJldHVybiAwOworfQorCisvKiByZWxlYXNlIChjbG9zZSkgdGhlIG1peGVyIGRldmljZS4gKi8KKworc3RhdGljIGludCB2d3NuZF9taXhlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCURCR0VWKCIoaW5vZGU9MHglcCwgZmlsZT0weCVwKVxuIiwgaW5vZGUsIGZpbGUpOworCURFQ19VU0VfQ09VTlQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIG1peGVyX3JlYWRfaW9jdGwgaGFuZGxlcyBhbGwgcmVhZCBpb2N0bHMgb24gdGhlIG1peGVyIGRldmljZS4gKi8KKworc3RhdGljIGludCBtaXhlcl9yZWFkX2lvY3RsKHZ3c25kX2Rldl90ICpkZXZjLCB1bnNpZ25lZCBpbnQgbnIsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHZhbCA9IC0xOworCisJREJHRVYoIihkZXZjPTB4JXAsIG5yPTB4JXgsIGFyZz0weCVwKVxuIiwgZGV2YywgbnIsIGFyZyk7CisKKwlzd2l0Y2ggKG5yKSB7CisJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQl2YWwgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCXZhbCA9IChTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8CisJCSAgICAgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX1JFQ0xFVik7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQl2YWwgPSAoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAorCQkgICAgICAgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19SRUNMRVYpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfT1VUTUFTSzoKKwkJdmFsID0gKFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKKwkJICAgICAgIFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRCk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgorCQl2YWwgPSAoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAorCQkgICAgICAgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0NEKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwkJdmFsID0gYWQxODQzX2dldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fUENNKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX0xJTkU6CisJCXZhbCA9IGFkMTg0M19nZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX0xJTkUpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQl2YWwgPSBhZDE4NDNfZ2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9NSUMpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfQ0Q6CisJCXZhbCA9IGFkMTg0M19nZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX0NEKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKKwkJdmFsID0gYWQxODQzX2dldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fUkVDTEVWKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJdmFsID0gYWQxODQzX2dldF9yZWNzcmMoJmRldmMtPmxpdGgpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOgorCQl2YWwgPSBhZDE4NDNfZ2V0X291dHNyYygmZGV2Yy0+bGl0aCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZyk7Cit9CisKKy8qIG1peGVyX3dyaXRlX2lvY3RsIGhhbmRsZXMgYWxsIHdyaXRlIGlvY3RscyBvbiB0aGUgbWl4ZXIgZGV2aWNlLiAqLworCitzdGF0aWMgaW50IG1peGVyX3dyaXRlX2lvY3RsKHZ3c25kX2Rldl90ICpkZXZjLCB1bnNpZ25lZCBpbnQgbnIsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHZhbDsKKwlpbnQgZXJyOworCisJREJHRVYoIihkZXZjPTB4JXAsIG5yPTB4JXgsIGFyZz0weCVwKVxuIiwgZGV2YywgbnIsIGFyZyk7CisKKwllcnIgPSBnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3dpdGNoIChucikgeworCWNhc2UgU09VTkRfTUlYRVJfUENNOgorCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9QQ00sIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9MSU5FOgorCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9MSU5FLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9NSUMsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9DRDoKKwkJdmFsID0gYWQxODQzX3NldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fQ0QsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9SRUNMRVY6CisJCXZhbCA9IGFkMTg0M19zZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX1JFQ0xFViwgdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJaWYgKGRldmMtPnJwb3J0LnN3YnVmIHx8IGRldmMtPndwb3J0LnN3YnVmKQorCQkJcmV0dXJuIC1FQlVTWTsJLyogY2FuJ3QgY2hhbmdlIHJlY3NyYyB3aGlsZSBydW5uaW5nICovCisJCXZhbCA9IGFkMTg0M19zZXRfcmVjc3JjKCZkZXZjLT5saXRoLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOgorCQl2YWwgPSBhZDE4NDNfc2V0X291dHNyYygmZGV2Yy0+bGl0aCwgdmFsKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHZhbCA8IDApCisJCXJldHVybiB2YWw7CisJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKTsKK30KKworLyogVGhpcyBpcyB0aGUgaW9jdGwgZW50cnkgdG8gdGhlIG1peGVyIGRyaXZlci4gKi8KKworc3RhdGljIGludCB2d3NuZF9taXhlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlvY3RsLAorCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHVuc2lnbmVkIGludCBucm1hc2sgPSBfSU9DX05STUFTSyA8PCBfSU9DX05SU0hJRlQ7CisJY29uc3QgdW5zaWduZWQgaW50IG5yID0gKGNtZCAmIG5ybWFzaykgPj4gX0lPQ19OUlNISUZUOworCWludCByZXR2YWw7CisKKwlEQkdFVigiKGRldmM9MHglcCwgY21kPTB4JXgsIGFyZz0weCVseClcbiIsIGRldmMsIGNtZCwgYXJnKTsKKworCWRvd24oJmRldmMtPm1peF9zZW1hKTsKKwl7CisJCWlmICgoY21kICYgfm5ybWFzaykgPT0gTUlYRVJfUkVBRCgwKSkKKwkJCXJldHZhbCA9IG1peGVyX3JlYWRfaW9jdGwoZGV2YywgbnIsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQllbHNlIGlmICgoY21kICYgfm5ybWFzaykgPT0gTUlYRVJfV1JJVEUoMCkpCisJCQlyZXR2YWwgPSBtaXhlcl93cml0ZV9pb2N0bChkZXZjLCBuciwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWVsc2UKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJfQorCXVwKCZkZXZjLT5taXhfc2VtYSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdndzbmRfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubGxzZWVrID0Jbm9fbGxzZWVrLAorCS5pb2N0bCA9CXZ3c25kX21peGVyX2lvY3RsLAorCS5vcGVuID0JCXZ3c25kX21peGVyX29wZW4sCisJLnJlbGVhc2UgPQl2d3NuZF9taXhlcl9yZWxlYXNlLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogcHJvYmUvYXR0YWNoL3VubG9hZCAqLworCisvKiBkcml2ZXIgcHJvYmUgcm91dGluZS4gIFJldHVybiBub256ZXJvIGlmIGhhcmR3YXJlIGlzIGZvdW5kLiAqLworCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJbGl0aGl1bV90IGxpdGg7CisJaW50IHc7CisJdW5zaWduZWQgbG9uZyBsYXRlcjsKKworCURCR0VWKCIoaHdfY29uZmlnPTB4JXApXG4iLCBod19jb25maWcpOworCisJLyogWFhYIHZlcmlmeSBsaXRoaXVtIHByZXNlbnQgKHRvIHByZXZlbnQgY3Jhc2ggb24gbm9uLXZ3KSAqLworCisJaWYgKGxpX2NyZWF0ZSgmbGl0aCwgaHdfY29uZmlnLT5pb19iYXNlKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInByb2JlX3Z3c25kOiBjYW4ndCBtYXAgbGl0aGl1bVxuIik7CisJCXJldHVybiAwOworCX0KKwlsYXRlciA9IGppZmZpZXMgKyAyOworCWxpX3dyaXRlbCgmbGl0aCwgTElfSE9TVF9DT05UUk9MTEVSLCBMSV9IQ19MSU5LX0VOQUJMRSk7CisJZG8geworCQl3ID0gbGlfcmVhZGwoJmxpdGgsIExJX0hPU1RfQ09OVFJPTExFUik7CisJfSB3aGlsZSAodyA9PSBMSV9IQ19MSU5LX0VOQUJMRSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBsYXRlcikpOworCQorCWxpX2Rlc3Ryb3koJmxpdGgpOworCisJREJHUFYoIkhDID0gMHglMDR4XG4iLCB3KTsKKworCWlmICgodyA9PSBMSV9IQ19MSU5LX0VOQUJMRSkgfHwgKHcgJiBMSV9IQ19MSU5LX0NPREVDKSkgeworCisJCS8qIFRoaXMgbWF5IGluZGljYXRlIGEgYmV0YSBtYWNoaW5lIHdpdGggbm8gYXVkaW8sCisJCSAqIG9yIGEgZnV0dXJlIG1hY2hpbmUgd2l0aCBkaWZmZXJlbnQgYXVkaW8uCisJCSAqIE9uIGJldGEtcmVsZWFzZSAzMjAgdy8gbm8gYXVkaW8sIEhDID09IDB4NDAwMCAqLworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInByb2JlX3Z3c25kOiBhdWRpbyBjb2RlYyBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodyAmIExJX0hDX0xJTktfRkFJTFVSRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwcm9iZV92d3NuZDogY2FuJ3QgaW5pdCBhdWRpbyBjb2RlY1xuIik7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0lORk8gInZ3c25kOiBsaXRoaXVtIGF1ZGlvIGF0IG1taW8gJSN4IGlycSAlZFxuIiwKKwkJaHdfY29uZmlnLT5pb19iYXNlLCBod19jb25maWctPmlycSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGRyaXZlciBhdHRhY2ggcm91dGluZS4gIEluaXRpYWxpemUgZHJpdmVyIGRhdGEgc3RydWN0dXJlcyBhbmQKKyAqIGluaXRpYWxpemUgaGFyZHdhcmUuICBBIG5ldyB2d3NuZF9kZXZfdCBpcyBhbGxvY2F0ZWQgYW5kIHB1dAorICogb250byB0aGUgZ2xvYmFsIGxpc3QsIHZ3c25kX2Rldl9saXN0LgorICoKKyAqIFJldHVybiArbWlub3JfZGV2IG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGF0dGFjaF92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSBOVUxMOworCWludCBlcnIgPSAtRU5PTUVNOworCisJREJHRVYoIihod19jb25maWc9MHglcClcbiIsIGh3X2NvbmZpZyk7CisKKwlkZXZjID0ga21hbGxvYyhzaXplb2YgKHZ3c25kX2Rldl90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldmMgPT0gTlVMTCkKKwkJZ290byBmYWlsMDsKKworCWVyciA9IGxpX2NyZWF0ZSgmZGV2Yy0+bGl0aCwgaHdfY29uZmlnLT5pb19iYXNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwxOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+b3Blbl93YWl0KTsKKworCWRldmMtPnJwb3J0Lmh3YnVmX3NpemUgPSBIV0JVRl9TSVpFOworCWRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBIV0JVRl9PUkRFUik7CisJaWYgKCFkZXZjLT5ycG9ydC5od2J1Zl92YWRkcikKKwkJZ290byBmYWlsMjsKKwlkZXZjLT5ycG9ydC5od2J1ZiA9ICh2b2lkICopIGRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyOworCWRldmMtPnJwb3J0Lmh3YnVmX3BhZGRyID0gdmlydF90b19waHlzKGRldmMtPnJwb3J0Lmh3YnVmKTsKKworCS8qCisJICogUXVvdGUgZnJvbSB0aGUgTlQgZHJpdmVyOgorCSAqCisJICogLy8gV0FSTklORyEhISBIQUNLIHRvIHNldHVwIG91dHB1dCBkbWEhISEKKwkgKiAvLyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgZXZlbiBvbiBvdXRwdXQgdGhlcmUgaXMgc29tZSBkYXRhCisJICogLy8gdHJpY2tsaW5nIGludG8gdGhlIGlucHV0IERNQSBjaGFubmVsLiAgVGhpcyBpcyBhIGJ1ZyBpbiB0aGUKKwkgKiAvLyBMaXRoaXVtIG1pY3JvY29kZS4KKwkgKiAvLyAtLXNkZQorCSAqCisJICogV2Ugc2V0IHRoZSBpbnB1dCBzaWRlJ3MgRE1BIGJhc2UgYWRkcmVzcyBoZXJlLiAgSXQgd2lsbCByZW1haW4KKwkgKiB2YWxpZCB1bnRpbCB0aGUgZHJpdmVyIGlzIHVubG9hZGVkLgorCSAqLworCisJbGlfd3JpdGVsKCZkZXZjLT5saXRoLCBMSV9DT01NMV9CQVNFLAorCQkgIGRldmMtPnJwb3J0Lmh3YnVmX3BhZGRyID4+IDggfCAxIDw8ICgzNyAtIDgpKTsKKworCWRldmMtPndwb3J0Lmh3YnVmX3NpemUgPSBIV0JVRl9TSVpFOworCWRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBIV0JVRl9PUkRFUik7CisJaWYgKCFkZXZjLT53cG9ydC5od2J1Zl92YWRkcikKKwkJZ290byBmYWlsMzsKKwlkZXZjLT53cG9ydC5od2J1ZiA9ICh2b2lkICopIGRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyOworCWRldmMtPndwb3J0Lmh3YnVmX3BhZGRyID0gdmlydF90b19waHlzKGRldmMtPndwb3J0Lmh3YnVmKTsKKwlEQkdQKCJ3cG9ydCBod2J1ZiA9IDB4JXBcbiIsIGRldmMtPndwb3J0Lmh3YnVmKTsKKworCURCR0RPKHNodXRfdXArKyk7CisJZXJyID0gYWQxODQzX2luaXQoJmRldmMtPmxpdGgpOworCURCR0RPKHNodXRfdXAtLSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsNDsKKworCS8qIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIgKi8KKworCWVyciA9IHJlcXVlc3RfaXJxKGh3X2NvbmZpZy0+aXJxLCB2d3NuZF9hdWRpb19pbnRyLCAwLCAidndzbmQiLCBkZXZjKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw1OworCisJLyogcmVnaXN0ZXIgdGhpcyBkZXZpY2UncyBkcml2ZXJzLiAqLworCisJZGV2Yy0+YXVkaW9fbWlub3IgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJnZ3c25kX2F1ZGlvX2ZvcHMsIC0xKTsKKwlpZiAoKGVyciA9IGRldmMtPmF1ZGlvX21pbm9yKSA8IDApIHsKKwkJREJHRE8ocHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAiYXR0YWNoX3Z3c25kOiByZWdpc3Rlcl9zb3VuZF9kc3AgZXJyb3IgJWRcbiIsCisJCQkgICAgIGVycikpOworCQlnb3RvIGZhaWw2OworCX0KKwlkZXZjLT5taXhlcl9taW5vciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZ2d3NuZF9taXhlcl9mb3BzLAorCQkJCQkJIGRldmMtPmF1ZGlvX21pbm9yID4+IDQpOworCWlmICgoZXJyID0gZGV2Yy0+bWl4ZXJfbWlub3IpIDwgMCkgeworCQlEQkdETyhwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICJhdHRhY2hfdndzbmQ6IHJlZ2lzdGVyX3NvdW5kX21peGVyIGVycm9yICVkXG4iLAorCQkJICAgICBlcnIpKTsKKwkJZ290byBmYWlsNzsKKwl9CisKKwkvKiBTcXVpcnJlbCBhd2F5IGRldmljZSBpbmRpY2VzIGZvciB1bmxvYWQgcm91dGluZS4gKi8KKworCWh3X2NvbmZpZy0+c2xvdHNbMF0gPSBkZXZjLT5hdWRpb19taW5vcjsKKworCS8qIEluaXRpYWxpemUgYXMgbXVjaCBvZiAqZGV2YyBhcyBwb3NzaWJsZSAqLworCisJaW5pdF9NVVRFWCgmZGV2Yy0+b3Blbl9zZW1hKTsKKwlpbml0X01VVEVYKCZkZXZjLT5pb19zZW1hKTsKKwlpbml0X01VVEVYKCZkZXZjLT5taXhfc2VtYSk7CisJZGV2Yy0+b3Blbl9tb2RlID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+cnBvcnQubG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+cnBvcnQucXVldWUpOworCWRldmMtPnJwb3J0LnN3c3RhdGUgPSBTV19PRkY7CisJZGV2Yy0+cnBvcnQuaHdzdGF0ZSA9IEhXX1NUT1BQRUQ7CisJZGV2Yy0+cnBvcnQuZmxhZ3MgPSAwOworCWRldmMtPnJwb3J0LnN3YnVmID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+d3BvcnQubG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+d3BvcnQucXVldWUpOworCWRldmMtPndwb3J0LnN3c3RhdGUgPSBTV19PRkY7CisJZGV2Yy0+d3BvcnQuaHdzdGF0ZSA9IEhXX1NUT1BQRUQ7CisJZGV2Yy0+d3BvcnQuZmxhZ3MgPSAwOworCWRldmMtPndwb3J0LnN3YnVmID0gTlVMTDsKKworCS8qIFN1Y2Nlc3MuICBMaW5rIHVzIG9udG8gdGhlIGxvY2FsIGRldmljZSBsaXN0LiAqLworCisJZGV2Yy0+bmV4dF9kZXYgPSB2d3NuZF9kZXZfbGlzdDsKKwl2d3NuZF9kZXZfbGlzdCA9IGRldmM7CisJcmV0dXJuIGRldmMtPmF1ZGlvX21pbm9yOworCisJLyogU28gbWFueSB3YXlzIHRvIGZhaWwuICBVbmRvIHdoYXQgd2UgZGlkLiAqLworCisgZmFpbDc6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2Yy0+YXVkaW9fbWlub3IpOworIGZhaWw2OgorCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCBkZXZjKTsKKyBmYWlsNToKKyBmYWlsNDoKKwlmcmVlX3BhZ2VzKGRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyLCBIV0JVRl9PUkRFUik7CisgZmFpbDM6CisJZnJlZV9wYWdlcyhkZXZjLT5ycG9ydC5od2J1Zl92YWRkciwgSFdCVUZfT1JERVIpOworIGZhaWwyOgorCWxpX2Rlc3Ryb3koJmRldmMtPmxpdGgpOworIGZhaWwxOgorCWtmcmVlKGRldmMpOworIGZhaWwwOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHVubG9hZF92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdndzbmRfZGV2X3QgKmRldmMsICoqZGV2Y3A7CisKKwlEQkdFKCIoKVxuIik7CisKKwlkZXZjcCA9ICZ2d3NuZF9kZXZfbGlzdDsKKwl3aGlsZSAoKGRldmMgPSAqZGV2Y3ApKSB7CisJCWlmIChkZXZjLT5hdWRpb19taW5vciA9PSBod19jb25maWctPnNsb3RzWzBdKSB7CisJCQkqZGV2Y3AgPSBkZXZjLT5uZXh0X2RldjsKKwkJCWJyZWFrOworCQl9CisJCWRldmNwID0gJmRldmMtPm5leHRfZGV2OworCX0KKworCWlmICghZGV2YykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGRldmMtPm1peGVyX21pbm9yKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChkZXZjLT5hdWRpb19taW5vcik7CisJZnJlZV9pcnEoaHdfY29uZmlnLT5pcnEsIGRldmMpOworCWZyZWVfcGFnZXMoZGV2Yy0+d3BvcnQuaHdidWZfdmFkZHIsIEhXQlVGX09SREVSKTsKKwlmcmVlX3BhZ2VzKGRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyLCBIV0JVRl9PUkRFUik7CisJbGlfZGVzdHJveSgmZGV2Yy0+bGl0aCk7CisJa2ZyZWUoZGV2Yyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaW5pdGlhbGl6YXRpb24gYW5kIGxvYWRhYmxlIGtlcm5lbCBtb2R1bGUgaW50ZXJmYWNlICovCisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIHRoZV9od19jb25maWcgPSB7CisJMHhGRjAwMTAwMCwJCQkvKiBsaXRoaXVtIHBoeXMgYWRkciAgKi8KKwlDT19JUlEoQ09fQVBJQ19MSV9BVURJTykJLyogaXJxICovCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBWaXN1YWwgV29ya3N0YXRpb24gc291bmQgbW9kdWxlIik7CitNT0RVTEVfQVVUSE9SKCJCb2IgTWlsbGVyIDxrYm9iQHNnaS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdndzbmQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJREJHWFYoIlxuIik7CisJREJHWFYoInNvdW5kOjp2d3NuZDo6aW5pdF9tb2R1bGUoKVxuIik7CisKKwlpZiAoIXByb2JlX3Z3c25kKCZ0aGVfaHdfY29uZmlnKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllcnIgPSBhdHRhY2hfdndzbmQoJnRoZV9od19jb25maWcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF92d3NuZCh2b2lkKQoreworCURCR1goInNvdW5kOjp2d3NuZDo6Y2xlYW51cF9tb2R1bGUoKVxuIik7CisKKwl1bmxvYWRfdndzbmQoJnRoZV9od19jb25maWcpOworfQorCittb2R1bGVfaW5pdChpbml0X3Z3c25kKTsKK21vZHVsZV9leGl0KGNsZWFudXBfdndzbmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3dhdmVhcnRpc3QuYyBiL3NvdW5kL29zcy93YXZlYXJ0aXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkMDRhZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy93YXZlYXJ0aXN0LmMKQEAgLTAsMCArMSwyMDM1IEBACisvKgorICogbGludXgvZHJpdmVycy9zb3VuZC93YXZlYXJ0aXN0LmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgdGhlIFJXQTAxMCBSb2Nrd2VsbCBXYXZlIEFydGlzdAorICogY29kZWMgY2hpcCB1c2VkIGluIHRoZSBSZWJlbC5jb20gTmV0V2luZGVyLgorICoKKyAqIENsZWFuZWQgdXAgYW5kIGludGVncmF0ZWQgaW50byAyLjEgYnkgUnVzc2VsbCBLaW5nIChybWtAYXJtLmxpbnV4Lm9yZy51aykKKyAqIGFuZCBQYXQgQmVpcm5lIChwYXRiQGNvcmVsLmNhKQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IFJlYmVsLmNvbSAxOTk4LTE5OTkKKyAqCisgKiBSV0EwMTAgc3BlY3MgcmVjZWl2ZWQgdW5kZXIgTkRBIGZyb20gUm9ja3dlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBDaGFuZ2VzOgorICogMTEtMTAtMjAwMAlCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxia3pAbGludXgtaWRlLm9yZz4KKyAqCQlBZGRlZCBfX2luaXQgdG8gd2F2ZWFydGlzdF9pbml0KCkKKyAqLworCisvKiBEZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgREVCVUdfQ01ECTEKKyNkZWZpbmUgREVCVUdfT1VUCTIKKyNkZWZpbmUgREVCVUdfSU4JNAorI2RlZmluZSBERUJVR19JTlRSCTgKKyNkZWZpbmUgREVCVUdfTUlYRVIJMTYKKyNkZWZpbmUgREVCVUdfVFJJR0dFUgkzMgorCisjZGVmaW5lIGRlYnVnX2ZsZyAoMCkKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgIndhdmVhcnRpc3QuaCIKKworI2lmZGVmIENPTkZJR19BUk0KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2VuZGlmCisKKyNpZm5kZWYgTk9fRE1BCisjZGVmaW5lIE5PX0RNQQkyNTUKKyNlbmRpZgorCisjZGVmaW5lIFNVUFBPUlRFRF9NSVhFUl9ERVZJQ0VTCQkoU09VTkRfTUFTS19TWU5USCAgICAgIHxcCisJCQkJCSBTT1VORF9NQVNLX1BDTSAgICAgICAgfFwKKwkJCQkJIFNPVU5EX01BU0tfTElORSAgICAgICB8XAorCQkJCQkgU09VTkRfTUFTS19NSUMgICAgICAgIHxcCisJCQkJCSBTT1VORF9NQVNLX0xJTkUxICAgICAgfFwKKwkJCQkJIFNPVU5EX01BU0tfUkVDTEVWICAgICB8XAorCQkJCQkgU09VTkRfTUFTS19WT0xVTUUgICAgIHxcCisJCQkJCSBTT1VORF9NQVNLX0lNSVgpCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBsZXZlbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9IHsKKwkweDU1NTUsCQkvKiBNYXN0ZXIgVm9sdW1lCSAqLworCTB4MDAwMCwJCS8qIEJhc3MJCQkgKi8KKwkweDAwMDAsCQkvKiBUcmVibGUJCSAqLworCTB4MjMyMywJCS8qIFN5bnRoIChGTSkJCSAqLworCTB4NGI0YiwJCS8qIFBDTQkJCSAqLworCTB4NjQ2NCwJCS8qIFBDIFNwZWFrZXIJCSAqLworCTB4MDAwMCwJCS8qIEV4dCBMaW5lCQkgKi8KKwkweDAwMDAsCQkvKiBNaWMJCQkgKi8KKwkweDAwMDAsCQkvKiBDRAkJCSAqLworCTB4NjQ2NCwJCS8qIFJlY29yZGluZyBtb25pdG9yCSAqLworCTB4MDAwMCwJCS8qIFNCIFBDTSAoQUxUIFBDTSkJICovCisJMHgwMDAwLAkJLyogUmVjb3JkaW5nIGxldmVsCSAqLworCTB4NjQ2NCwJCS8qIElucHV0IGdhaW4JCSAqLworCTB4NjQ2NCwJCS8qIE91dHB1dCBnYWluCQkgKi8KKwkweDAwMDAsCQkvKiBMaW5lMSAoQXV4MSkJCSAqLworCTB4MDAwMCwJCS8qIExpbmUyIChBdXgyKQkJICovCisJMHgwMDAwLAkJLyogTGluZTMgKEF1eDMpCQkgKi8KKwkweDAwMDAsCQkvKiBEaWdpdGFsMQkJICovCisJMHgwMDAwLAkJLyogRGlnaXRhbDIJCSAqLworCTB4MDAwMCwJCS8qIERpZ2l0YWwzCQkgKi8KKwkweDAwMDAsCQkvKiBQaG9uZSBJbgkJICovCisJMHg2NDY0LAkJLyogUGhvbmUgT3V0CQkgKi8KKwkweDAwMDAsCQkvKiBWaWRlbwkJICovCisJMHgwMDAwLAkJLyogUmFkaW8JCSAqLworCTB4MDAwMAkJLyogTW9uaXRvcgkJICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IGFkZHJlc3NfaW5mbyAgaHc7CS8qIGhhcmR3YXJlICovCisJY2hhcgkJKmNoaXBfbmFtZTsKKworCWludAkJeGZlcl9jb3VudDsKKwlpbnQJCWF1ZGlvX21vZGU7CisJaW50CQlvcGVuX21vZGU7CisJaW50CQlhdWRpb19mbGFnczsKKwlpbnQJCXJlY29yZF9kZXY7CisJaW50CQlwbGF5YmFja19kZXY7CisJaW50CQlkZXZfbm87CisKKwkvKiBNaXhlciBwYXJhbWV0ZXJzICovCisJY29uc3Qgc3RydWN0IHdhdmVhcnRpc3RfbWl4ZXJfaW5mbyAqbWl4OworCisJdW5zaWduZWQgc2hvcnQJKmxldmVsczsJICAgLyogY2FjaGUgb2Ygdm9sdW1lIHNldHRpbmdzICAgKi8KKwlpbnQJCXJlY21hc2s7CSAgIC8qIGN1cnJlbnRseSBlbmFibGVkIHJlY29yZGluZyBkZXZpY2UhICovCisKKyNpZmRlZiBDT05GSUdfQVJDSF9ORVRXSU5ERVIKKwlzaWduZWQgaW50CXNsaWRlcl92b2w7CSAgIC8qIGhhcmR3YXJlIHNsaWRlciB2b2x1bWUgICAgICovCisJdW5zaWduZWQgaW50CWhhbmRzZXRfZGV0ZWN0CToxOworCXVuc2lnbmVkIGludAl0ZWxlcGhvbmVfZGV0ZWN0OjE7CisJdW5zaWduZWQgaW50CW5vX2F1dG9zZWxlY3QJOjE7LyogaGFuZHNldC90ZWxlcGhvbmUgYXV0b3NlbGVjdHMgYSBwYXRoICovCisJdW5zaWduZWQgaW50CXNwa3JfbXV0ZV9zdGF0ZQk6MTsvKiBzZXQgYnkgaW9jdGwgb3IgYXV0b3NlbGVjdCAqLworCXVuc2lnbmVkIGludAlsaW5lX211dGVfc3RhdGUJOjE7Lyogc2V0IGJ5IGlvY3RsIG9yIGF1dG9zZWxlY3QgKi8KKwl1bnNpZ25lZCBpbnQJdXNlX3NsaWRlcgk6MTsvKiB1c2Ugc2xpZGVyIHNldHRpbmcgZm9yIG8vcCB2b2wgKi8KKyNlbmRpZgorfSB3YXZuY19pbmZvOworCisvKgorICogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgbWl4ZXIgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCB3YXZlYXJ0aXN0X21peGVyX2luZm8geworCXVuc2lnbmVkIGludAlzdXBwb3J0ZWRfZGV2czsJICAgLyogU3VwcG9ydGVkIGRldmljZXMgKi8KKwl1bnNpZ25lZCBpbnQJcmVjb3JkaW5nX2RldnM7CSAgIC8qIFJlY29yZGFibGUgZGV2aWVzICovCisJdW5zaWduZWQgaW50CXN0ZXJlb19kZXZzOwkgICAvKiBTdGVyZW8gZGV2aWNlcwkqLworCisJdW5zaWduZWQgaW50CSgqc2VsZWN0X2lucHV0KSh3YXZuY19pbmZvICosIHVuc2lnbmVkIGludCwKKwkJCQkJdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopOworCWludAkJKCpkZWNvZGVfbWl4ZXIpKHdhdm5jX2luZm8gKiwgaW50LAorCQkJCQl1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyKTsKKwlpbnQJCSgqZ2V0X21peGVyKSh3YXZuY19pbmZvICosIGludCk7Cit9OworCit0eXBlZGVmIHN0cnVjdCB3YXZuY19wb3J0X2luZm8geworCWludAkJb3Blbl9tb2RlOworCWludAkJc3BlZWQ7CisJaW50CQljaGFubmVsczsKKwlpbnQJCWF1ZGlvX2Zvcm1hdDsKK30gd2F2bmNfcG9ydF9pbmZvOworCitzdGF0aWMgaW50CQlucl93YXZlYXJ0aXN0X2RldnM7CitzdGF0aWMgd2F2bmNfaW5mbwlhZGV2X2luZm9bTUFYX0FVRElPX0RFVl07CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHdhdmVhcnRpc3RfbG9jayk7CisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfTkVUV0lOREVSCisjZGVmaW5lIG1hY2hpbmVfaXNfbmV0d2luZGVyKCkgMAorI2Vsc2UKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB2bmNfdGltZXI7CitzdGF0aWMgdm9pZCB2bmNfY29uZmlndXJlX21peGVyKHdhdm5jX2luZm8gKmRldmMsIHVuc2lnbmVkIGludCBpbnB1dF9tYXNrKTsKK3N0YXRpYyBpbnQgdm5jX3ByaXZhdGVfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgaW50IF9fdXNlciAqYXJnKTsKK3N0YXRpYyB2b2lkIHZuY19zbGlkZXJfdGljayh1bnNpZ25lZCBsb25nIGRhdGEpOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZAord2F2ZWFydGlzdF9zZXRfY3RscihzdHJ1Y3QgYWRkcmVzc19pbmZvICpodywgdW5zaWduZWQgY2hhciBjbGVhciwgdW5zaWduZWQgY2hhciBzZXQpCit7CisJdW5zaWduZWQgaW50IGN0bHJfcG9ydCA9IGh3LT5pb19iYXNlICsgQ1RMUjsKKworCWNsZWFyID0gfmNsZWFyICYgaW5iKGN0bHJfcG9ydCk7CisKKwlvdXRiKGNsZWFyIHwgc2V0LCBjdGxyX3BvcnQpOworfQorCisvKiBUb2dnbGUgSVJRIGFja25vd2xlZGdlIGxpbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3YXZlYXJ0aXN0X2lhY2sod2F2bmNfaW5mbyAqZGV2YykKK3sKKwl1bnNpZ25lZCBpbnQgY3Rscl9wb3J0ID0gZGV2Yy0+aHcuaW9fYmFzZSArIENUTFI7CisJaW50IG9sZF9jdGxyOworCisJb2xkX2N0bHIgPSBpbmIoY3Rscl9wb3J0KSAmIH5JUlFfQUNLOworCisJb3V0YihvbGRfY3RsciB8IElSUV9BQ0ssIGN0bHJfcG9ydCk7CisJb3V0YihvbGRfY3RsciwgY3Rscl9wb3J0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3dhdmVhcnRpc3Rfc2xlZXAoaW50IHRpbWVvdXRfbXMpCit7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSB0aW1lb3V0X21zICogMTAgKiBIWiAvIDEwMDsKKworCWRvIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJfSB3aGlsZSAodGltZW91dCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord2F2ZWFydGlzdF9yZXNldCh3YXZuY19pbmZvICpkZXZjKQoreworCXN0cnVjdCBhZGRyZXNzX2luZm8gKmh3ID0gJmRldmMtPmh3OworCXVuc2lnbmVkIGludCB0aW1lb3V0LCByZXMgPSAtMTsKKworCXdhdmVhcnRpc3Rfc2V0X2N0bHIoaHcsIC0xLCBSRVNFVCk7CisJd2F2ZWFydGlzdF9zbGVlcCgyKTsKKwl3YXZlYXJ0aXN0X3NldF9jdGxyKGh3LCBSRVNFVCwgMCk7CisKKwl0aW1lb3V0ID0gNTAwOworCWRvIHsKKwkJbWRlbGF5KDIpOworCisJCWlmIChpbmIoaHctPmlvX2Jhc2UgKyBTVEFUUikgJiBDTURfUkYpIHsKKwkJCXJlcyA9IGludyhody0+aW9fYmFzZSArIENNRFIpOworCQkJaWYgKHJlcyA9PSAweDU1YWEpCisJCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCisJaWYgKHRpbWVvdXQgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXZlQXJ0aXN0OiByZXNldCB0aW1lb3V0ICIpOworCQlpZiAocmVzICE9ICh1bnNpZ25lZCBpbnQpLTEpCisJCQlwcmludGsoIihyZXM9JTA0WCkiLCByZXMpOworCQlwcmludGsoIlxuIik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIHNlbmQgYW5kIHJlY2VpdmUgd29yZHMKKyAqIGZyb20gV2F2ZUFydGlzdC4gIEl0IGhhbmRsZXMgYWxsIHRoZSBoYW5kc2hha2luZworICogYW5kIGNhbiBzZW5kIG9yIHJlY2VpdmUgbXVsdGlwbGUgd29yZHMuCisgKi8KK3N0YXRpYyBpbnQKK3dhdmVhcnRpc3RfY21kKHdhdm5jX2luZm8gKmRldmMsCisJCWludCBucl9jbWQsIHVuc2lnbmVkIGludCAqY21kLAorCQlpbnQgbnJfcmVzcCwgdW5zaWduZWQgaW50ICpyZXNwKQoreworCXVuc2lnbmVkIGludCBpb19iYXNlID0gZGV2Yy0+aHcuaW9fYmFzZTsKKwl1bnNpZ25lZCBpbnQgdGltZWRfb3V0ID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChkZWJ1Z19mbGcgJiBERUJVR19DTUQpIHsKKwkJcHJpbnRrKCJ3YXZlYXJ0aXN0X2NtZDogY21kPSIpOworCisJCWZvciAoaSA9IDA7IGkgPCBucl9jbWQ7IGkrKykKKwkJCXByaW50aygiJTA0WCAiLCBjbWRbaV0pOworCisJCXByaW50aygiXG4iKTsKKwl9CisKKwlpZiAoaW5iKGlvX2Jhc2UgKyBTVEFUUikgJiBDTURfUkYpIHsKKwkJaW50IG9sZF9kYXRhOworCisJCS8qIGZsdXNoIHRoZSBwb3J0CisJCSAqLworCisJCW9sZF9kYXRhID0gaW53KGlvX2Jhc2UgKyBDTURSKTsKKworCQlpZiAoZGVidWdfZmxnICYgREVCVUdfQ01EKQorCQkJcHJpbnRrKCJmbHVzaGVkICUwNFguLi4iLCBvbGRfZGF0YSk7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyAhdGltZWRfb3V0ICYmIGkgPCBucl9jbWQ7IGkrKykgeworCQlpbnQgY291bnQ7CisKKwkJZm9yIChjb3VudCA9IDUwMDA7IGNvdW50OyBjb3VudC0tKQorCQkJaWYgKGluYihpb19iYXNlICsgU1RBVFIpICYgQ01EX1dFKQorCQkJCWJyZWFrOworCisJCWlmICghY291bnQpCisJCQl0aW1lZF9vdXQgPSAxOworCQllbHNlCisJCQlvdXR3KGNtZFtpXSwgaW9fYmFzZSArIENNRFIpOworCX0KKworCWZvciAoaSA9IDA7ICF0aW1lZF9vdXQgJiYgaSA8IG5yX3Jlc3A7IGkrKykgeworCQlpbnQgY291bnQ7CisKKwkJZm9yIChjb3VudCA9IDUwMDA7IGNvdW50OyBjb3VudC0tKQorCQkJaWYgKGluYihpb19iYXNlICsgU1RBVFIpICYgQ01EX1JGKQorCQkJCWJyZWFrOworCisJCWlmICghY291bnQpCisJCQl0aW1lZF9vdXQgPSAxOworCQllbHNlCisJCQlyZXNwW2ldID0gaW53KGlvX2Jhc2UgKyBDTURSKTsKKwl9CisKKwlpZiAoZGVidWdfZmxnICYgREVCVUdfQ01EKSB7CisJCWlmICghdGltZWRfb3V0KSB7CisJCQlwcmludGsoIndhdmVhcnRpc3RfY21kOiByZXNwPSIpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbnJfcmVzcDsgaSsrKQorCQkJCXByaW50aygiJTA0WCAiLCByZXNwW2ldKTsKKworCQkJcHJpbnRrKCJcbiIpOworCQl9IGVsc2UKKwkJCXByaW50aygid2F2ZWFydGlzdF9jbWQ6IHRpbWVkIG91dFxuIik7CisJfQorCisJcmV0dXJuIHRpbWVkX291dCA/IDEgOiAwOworfQorCisvKgorICogU2VuZCBvbmUgY29tbWFuZCB3b3JkCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit3YXZlYXJ0aXN0X2NtZDEod2F2bmNfaW5mbyAqZGV2YywgdW5zaWduZWQgaW50IGNtZCkKK3sKKwlyZXR1cm4gd2F2ZWFydGlzdF9jbWQoZGV2YywgMSwgJmNtZCwgMCwgTlVMTCk7Cit9CisKKy8qCisgKiBTZW5kIG9uZSBjb21tYW5kLCByZWNlaXZlIG9uZSB3b3JkCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Cit3YXZlYXJ0aXN0X2NtZDFfcih3YXZuY19pbmZvICpkZXZjLCB1bnNpZ25lZCBpbnQgY21kKQoreworCXVuc2lnbmVkIGludCByZXQ7CisKKwl3YXZlYXJ0aXN0X2NtZChkZXZjLCAxLCAmY21kLCAxLCAmcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTZW5kIGEgZG91YmxlIGNvbW1hbmQsIHJlY2VpdmUgb25lCisgKiB3b3JkIChhbmQgdGhyb3cgaXQgYXdheSkKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3dhdmVhcnRpc3RfY21kMih3YXZuY19pbmZvICpkZXZjLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgYXJnKQoreworCXVuc2lnbmVkIGludCB2YWxzWzJdOworCisJdmFsc1swXSA9IGNtZDsKKwl2YWxzWzFdID0gYXJnOworCisJcmV0dXJuIHdhdmVhcnRpc3RfY21kKGRldmMsIDIsIHZhbHMsIDEsIHZhbHMpOworfQorCisvKgorICogU2VuZCBhIHRyaXBsZSBjb21tYW5kCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit3YXZlYXJ0aXN0X2NtZDMod2F2bmNfaW5mbyAqZGV2YywgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgaW50IGFyZzEsIHVuc2lnbmVkIGludCBhcmcyKQoreworCXVuc2lnbmVkIGludCB2YWxzWzNdOworCisJdmFsc1swXSA9IGNtZDsKKwl2YWxzWzFdID0gYXJnMTsKKwl2YWxzWzJdID0gYXJnMjsKKworCXJldHVybiB3YXZlYXJ0aXN0X2NtZChkZXZjLCAzLCB2YWxzLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludAord2F2ZWFydGlzdF9nZXRyZXYod2F2bmNfaW5mbyAqZGV2YywgY2hhciAqcmV2KQoreworCXVuc2lnbmVkIGludCB0ZW1wWzJdOworCXVuc2lnbmVkIGludCBjbWQgPSBXQUNNRF9HRVRSRVY7CisKKwl3YXZlYXJ0aXN0X2NtZChkZXZjLCAxLCAmY21kLCAyLCB0ZW1wKTsKKworCXJldlswXSA9IHRlbXBbMF0gPj4gODsKKwlyZXZbMV0gPSB0ZW1wWzBdICYgMjU1OworCXJldlsyXSA9ICdcMCc7CisKKwlyZXR1cm4gdGVtcFswXTsKK30KKworc3RhdGljIHZvaWQgd2F2ZWFydGlzdF9oYWx0X291dHB1dChpbnQgZGV2KTsKK3N0YXRpYyB2b2lkIHdhdmVhcnRpc3RfaGFsdF9pbnB1dChpbnQgZGV2KTsKK3N0YXRpYyB2b2lkIHdhdmVhcnRpc3RfaGFsdChpbnQgZGV2KTsKK3N0YXRpYyB2b2lkIHdhdmVhcnRpc3RfdHJpZ2dlcihpbnQgZGV2LCBpbnQgc3RhdGUpOworCitzdGF0aWMgaW50Cit3YXZlYXJ0aXN0X29wZW4oaW50IGRldiwgaW50IG1vZGUpCit7CisJd2F2bmNfaW5mbwkqZGV2YzsKKwl3YXZuY19wb3J0X2luZm8JKnBvcnRjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX2F1ZGlvZGV2cykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRldmMgID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXBvcnRjID0gKHdhdm5jX3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndhdmVhcnRpc3RfbG9jaywgZmxhZ3MpOworCWlmIChwb3J0Yy0+b3Blbl9tb2RlIHx8IChkZXZjLT5vcGVuX21vZGUgJiBtb2RlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlkZXZjLT5hdWRpb19tb2RlICA9IDA7CisJZGV2Yy0+b3Blbl9tb2RlICB8PSBtb2RlOworCXBvcnRjLT5vcGVuX21vZGUgID0gbW9kZTsKKwl3YXZlYXJ0aXN0X3RyaWdnZXIoZGV2LCAwKTsKKworCWlmIChtb2RlICYgT1BFTl9SRUFEKQorCQlkZXZjLT5yZWNvcmRfZGV2ID0gZGV2OworCWlmIChtb2RlICYgT1BFTl9XUklURSkKKwkJZGV2Yy0+cGxheWJhY2tfZGV2ID0gZGV2OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndhdmVhcnRpc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X2Nsb3NlKGludCBkZXYpCit7CisJd2F2bmNfaW5mbwkqZGV2YyA9ICh3YXZuY19pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl3YXZuY19wb3J0X2luZm8JKnBvcnRjID0gKHdhdm5jX3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisKKwl3YXZlYXJ0aXN0X2hhbHQoZGV2KTsKKworCWRldmMtPmF1ZGlvX21vZGUgPSAwOworCWRldmMtPm9wZW5fbW9kZSAmPSB+cG9ydGMtPm9wZW5fbW9kZTsKKwlwb3J0Yy0+b3Blbl9tb2RlID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndhdmVhcnRpc3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAord2F2ZWFydGlzdF9vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBfX2NvdW50LCBpbnQgaW50cmZsYWcpCit7CisJd2F2bmNfcG9ydF9pbmZvCSpwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKwl3YXZuY19pbmZvCSpkZXZjID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgaW50CWNvdW50ID0gX19jb3VudDsgCisKKwlpZiAoZGVidWdfZmxnICYgREVCVUdfT1VUKQorCQlwcmludGsoIndhdmVhcnRpc3Q6IG91dHB1dCBibG9jaywgYnVmPTB4JWx4LCBjb3VudD0weCV4Li4uXG4iLAorCQkJYnVmLCBjb3VudCk7CisJLyoKKwkgKiAxNiBiaXQgZGF0YQorCSAqLworCWlmIChwb3J0Yy0+YXVkaW9fZm9ybWF0ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9TMTZfQkUpKQorCQljb3VudCA+Pj0gMTsKKworCWlmIChwb3J0Yy0+Y2hhbm5lbHMgPiAxKQorCQljb3VudCA+Pj0gMTsKKworCWNvdW50IC09IDE7CisKKwlpZiAoZGV2Yy0+YXVkaW9fbW9kZSAmIFBDTV9FTkFCTEVfT1VUUFVUICYmCisJICAgIGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfQVVUT01PREUgJiYKKwkgICAgaW50cmZsYWcgJiYKKwkgICAgY291bnQgPT0gZGV2Yy0+eGZlcl9jb3VudCkgeworCQlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlyZXR1cm47CS8qCisJCQkgKiBBdXRvIERNQSBtb2RlIG9uLiBObyBuZWVkIHRvIHJlYWN0CisJCQkgKi8KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIHNldCBzYW1wbGUgY291bnQKKwkgKi8KKwl3YXZlYXJ0aXN0X2NtZDIoZGV2YywgV0FDTURfT1VUUFVUU0laRSwgY291bnQpOworCisJZGV2Yy0+eGZlcl9jb3VudCA9IGNvdW50OworCWRldmMtPmF1ZGlvX21vZGUgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK3dhdmVhcnRpc3Rfc3RhcnRfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBfX2NvdW50LCBpbnQgaW50cmZsYWcpCit7CisJd2F2bmNfcG9ydF9pbmZvICpwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKwl3YXZuY19pbmZvCSpkZXZjID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgaW50CWNvdW50ID0gX19jb3VudDsKKworCWlmIChkZWJ1Z19mbGcgJiBERUJVR19JTikKKwkJcHJpbnRrKCJ3YXZlYXJ0aXN0OiBzdGFydCBpbnB1dCwgYnVmPTB4JWx4LCBjb3VudD0weCV4Li4uXG4iLAorCQkJYnVmLCBjb3VudCk7CisKKwlpZiAocG9ydGMtPmF1ZGlvX2Zvcm1hdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfUzE2X0JFKSkJLyogMTYgYml0IGRhdGEgKi8KKwkJY291bnQgPj49IDE7CisKKwlpZiAocG9ydGMtPmNoYW5uZWxzID4gMSkKKwkJY291bnQgPj49IDE7CisKKwljb3VudCAtPSAxOworCisJaWYgKGRldmMtPmF1ZGlvX21vZGUgJiBQQ01fRU5BQkxFX0lOUFVUICYmCisJICAgIGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfQVVUT01PREUgJiYKKwkgICAgaW50cmZsYWcgJiYKKwkgICAgY291bnQgPT0gZGV2Yy0+eGZlcl9jb3VudCkgeworCQlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCXJldHVybjsJLyoKKwkJCSAqIEF1dG8gRE1BIG1vZGUgb24uIE5vIG5lZWQgdG8gcmVhY3QKKwkJCSAqLworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogc2V0IHNhbXBsZSBjb3VudAorCSAqLworCXdhdmVhcnRpc3RfY21kMihkZXZjLCBXQUNNRF9JTlBVVFNJWkUsIGNvdW50KTsKKworCWRldmMtPnhmZXJfY291bnQgPSBjb3VudDsKKwlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludAord2F2ZWFydGlzdF9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAord2F2ZWFydGlzdF9nZXRfc3BlZWQod2F2bmNfcG9ydF9pbmZvICpwb3J0YykKK3sKKwl1bnNpZ25lZCBpbnQgc3BlZWQ7CisKKwkvKgorCSAqIHByb2dyYW0gdGhlIHNwZWVkLCBjaGFubmVscywgYml0cworCSAqLworCWlmIChwb3J0Yy0+c3BlZWQgPT0gODAwMCkKKwkJc3BlZWQgPSAweDJFNzE7CisJZWxzZSBpZiAocG9ydGMtPnNwZWVkID09IDExMDI1KQorCQlzcGVlZCA9IDB4NDAwMDsKKwllbHNlIGlmIChwb3J0Yy0+c3BlZWQgPT0gMjIwNTApCisJCXNwZWVkID0gMHg4MDAwOworCWVsc2UgaWYgKHBvcnRjLT5zcGVlZCA9PSA0NDEwMCkKKwkJc3BlZWQgPSAweDA7CisJZWxzZSB7CisJCS8qCisJCSAqIG5vbi1zdGFuZGFyZCAtIGp1c3QgY2FsY3VsYXRlCisJCSAqLworCQlzcGVlZCA9IHBvcnRjLT5zcGVlZCA8PCAxNjsKKworCQlzcGVlZCA9IChzcGVlZCAvIDQ0MTAwKSAmIDY1NTM1OworCX0KKworCXJldHVybiBzcGVlZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAord2F2ZWFydGlzdF9nZXRfYml0cyh3YXZuY19wb3J0X2luZm8gKnBvcnRjKQoreworCXVuc2lnbmVkIGludCBiaXRzOworCisJaWYgKHBvcnRjLT5hdWRpb19mb3JtYXQgPT0gQUZNVF9TMTZfTEUpCisJCWJpdHMgPSAxOworCWVsc2UgaWYgKHBvcnRjLT5hdWRpb19mb3JtYXQgPT0gQUZNVF9TOCkKKwkJYml0cyA9IDA7CisJZWxzZQorCQliaXRzID0gMjsJLy9kZWZhdWx0IEFGTVRfVTgKKworCXJldHVybiBiaXRzOworfQorCitzdGF0aWMgaW50Cit3YXZlYXJ0aXN0X3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXdhdm5jX2luZm8JKmRldmMgPSAod2F2bmNfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJd2F2bmNfcG9ydF9pbmZvCSpwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKwl1bnNpZ25lZCBpbnQJc3BlZWQsIGJpdHM7CisKKwlpZiAoZGV2Yy0+YXVkaW9fbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlzcGVlZCA9IHdhdmVhcnRpc3RfZ2V0X3NwZWVkKHBvcnRjKTsKKwliaXRzICA9IHdhdmVhcnRpc3RfZ2V0X2JpdHMocG9ydGMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndhdmVhcnRpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHdhdmVhcnRpc3RfY21kMihkZXZjLCBXQUNNRF9JTlBVVEZPUk1BVCwgYml0cykpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVhcnRpc3Q6IGVycm9yIHNldHRpbmcgdGhlICIKKwkJICAgICAgICJyZWNvcmQgZm9ybWF0IHRvICVkXG4iLCBwb3J0Yy0+YXVkaW9fZm9ybWF0KTsKKworCWlmICh3YXZlYXJ0aXN0X2NtZDIoZGV2YywgV0FDTURfSU5QVVRDSEFOTkVMUywgcG9ydGMtPmNoYW5uZWxzKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2F2ZWFydGlzdDogZXJyb3Igc2V0dGluZyByZWNvcmQgIgorCQkgICAgICAgInRvICVkIGNoYW5uZWxzXG4iLCBwb3J0Yy0+Y2hhbm5lbHMpOworCisJLyoKKwkgKiB3cml0ZSBjbWQgU2V0U2FtcGxlU3BlZWRUaW1lQ29uc3RhbnQKKwkgKi8KKwlpZiAod2F2ZWFydGlzdF9jbWQyKGRldmMsIFdBQ01EX0lOUFVUU1BFRUQsIHNwZWVkKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2F2ZWFydGlzdDogZXJyb3Igc2V0dGluZyB0aGUgcmVjb3JkICIKKwkJICAgICAgICJzcGVlZCB0byAlZEh6LlxuIiwgcG9ydGMtPnNwZWVkKTsKKworCWlmICh3YXZlYXJ0aXN0X2NtZDIoZGV2YywgV0FDTURfSU5QVVRETUEsIDEpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiBlcnJvciBzZXR0aW5nIHRoZSByZWNvcmQgIgorCQkgICAgICAgImRhdGEgcGF0aCB0byAweCVYXG4iLCAxKTsKKworCWlmICh3YXZlYXJ0aXN0X2NtZDIoZGV2YywgV0FDTURfSU5QVVRGT1JNQVQsIGJpdHMpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiBlcnJvciBzZXR0aW5nIHRoZSByZWNvcmQgIgorCQkgICAgICAgImZvcm1hdCB0byAlZFxuIiwgcG9ydGMtPmF1ZGlvX2Zvcm1hdCk7CisKKwlkZXZjLT54ZmVyX2NvdW50ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKwl3YXZlYXJ0aXN0X2hhbHRfaW5wdXQoZGV2KTsKKworCWlmIChkZWJ1Z19mbGcgJiBERUJVR19JTlRSKSB7CisJCXByaW50aygiV0EgQ1RMUiByZWc6IDB4JTAyWC5cbiIsCisJCSAgICAgICBpbmIoZGV2Yy0+aHcuaW9fYmFzZSArIENUTFIpKTsKKwkJcHJpbnRrKCJXQSBTVEFUIHJlZzogMHglMDJYLlxuIiwKKwkJICAgICAgIGluYihkZXZjLT5ody5pb19iYXNlICsgU1RBVFIpKTsKKwkJcHJpbnRrKCJXQSBJUlFTIHJlZzogMHglMDJYLlxuIiwKKwkJICAgICAgIGluYihkZXZjLT5ody5pb19iYXNlICsgSVJRU1RBVCkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3YXZlYXJ0aXN0X3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl3YXZuY19pbmZvCSpkZXZjID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXdhdm5jX3BvcnRfaW5mbwkqcG9ydGMgPSAod2F2bmNfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisJdW5zaWduZWQgaW50CXNwZWVkLCBiaXRzOworCisJLyoKKwkgKiBwcm9ncmFtIHRoZSBzcGVlZCwgY2hhbm5lbHMsIGJpdHMKKwkgKi8KKwlzcGVlZCA9IHdhdmVhcnRpc3RfZ2V0X3NwZWVkKHBvcnRjKTsKKwliaXRzICA9IHdhdmVhcnRpc3RfZ2V0X2JpdHMocG9ydGMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndhdmVhcnRpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHdhdmVhcnRpc3RfY21kMihkZXZjLCBXQUNNRF9PVVRQVVRTUEVFRCwgc3BlZWQpICYmCisJICAgIHdhdmVhcnRpc3RfY21kMihkZXZjLCBXQUNNRF9PVVRQVVRTUEVFRCwgc3BlZWQpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiBlcnJvciBzZXR0aW5nIHRoZSBwbGF5YmFjayAiCisJCSAgICAgICAic3BlZWQgdG8gJWRIei5cbiIsIHBvcnRjLT5zcGVlZCk7CisKKwlpZiAod2F2ZWFydGlzdF9jbWQyKGRldmMsIFdBQ01EX09VVFBVVENIQU5ORUxTLCBwb3J0Yy0+Y2hhbm5lbHMpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiBlcnJvciBzZXR0aW5nIHRoZSBwbGF5YmFjayAiCisJCSAgICAgICAidG8gJWQgY2hhbm5lbHNcbiIsIHBvcnRjLT5jaGFubmVscyk7CisKKwlpZiAod2F2ZWFydGlzdF9jbWQyKGRldmMsIFdBQ01EX09VVFBVVERNQSwgMCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVhcnRpc3Q6IGVycm9yIHNldHRpbmcgdGhlIHBsYXliYWNrICIKKwkJICAgICAgICJkYXRhIHBhdGggdG8gMHglWFxuIiwgMCk7CisKKwlpZiAod2F2ZWFydGlzdF9jbWQyKGRldmMsIFdBQ01EX09VVFBVVEZPUk1BVCwgYml0cykpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVhcnRpc3Q6IGVycm9yIHNldHRpbmcgdGhlIHBsYXliYWNrICIKKwkJICAgICAgICJmb3JtYXQgdG8gJWRcbiIsIHBvcnRjLT5hdWRpb19mb3JtYXQpOworCisJZGV2Yy0+eGZlcl9jb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisJd2F2ZWFydGlzdF9oYWx0X291dHB1dChkZXYpOworCisJaWYgKGRlYnVnX2ZsZyAmIERFQlVHX0lOVFIpIHsKKwkJcHJpbnRrKCJXQSBDVExSIHJlZzogMHglMDJYLlxuIixpbmIoZGV2Yy0+aHcuaW9fYmFzZSArIENUTFIpKTsKKwkJcHJpbnRrKCJXQSBTVEFUIHJlZzogMHglMDJYLlxuIixpbmIoZGV2Yy0+aHcuaW9fYmFzZSArIFNUQVRSKSk7CisJCXByaW50aygiV0EgSVJRUyByZWc6IDB4JTAyWC5cbiIsaW5iKGRldmMtPmh3LmlvX2Jhc2UgKyBJUlFTVEFUKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X2hhbHQoaW50IGRldikKK3sKKwl3YXZuY19wb3J0X2luZm8JKnBvcnRjID0gKHdhdm5jX3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCXdhdm5jX2luZm8JKmRldmM7CisKKwlpZiAocG9ydGMtPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpCisJCXdhdmVhcnRpc3RfaGFsdF9vdXRwdXQoZGV2KTsKKworCWlmIChwb3J0Yy0+b3Blbl9tb2RlICYgT1BFTl9SRUFEKQorCQl3YXZlYXJ0aXN0X2hhbHRfaW5wdXQoZGV2KTsKKworCWRldmMgPSAod2F2bmNfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJZGV2Yy0+YXVkaW9fbW9kZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X2hhbHRfaW5wdXQoaW50IGRldikKK3sKKwl3YXZuY19pbmZvCSpkZXZjID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFN0b3AgY2FwdHVyZQorCSAqLworCXdhdmVhcnRpc3RfY21kMShkZXZjLCBXQUNNRF9JTlBVVFNUT1ApOworCisJZGV2Yy0+YXVkaW9fbW9kZSAmPSB+UENNX0VOQUJMRV9JTlBVVDsKKworCS8qCisJICogQ2xlYXIgaW50ZXJydXB0IGJ5IHRvZ2dsaW5nCisJICogdGhlIElSUV9BQ0sgYml0IGluIENUUkwKKwkgKi8KKwlpZiAoaW5iKGRldmMtPmh3LmlvX2Jhc2UgKyBTVEFUUikgJiBJUlFfUkVRKQorCQl3YXZlYXJ0aXN0X2lhY2soZGV2Yyk7CisKKy8vCWRldmMtPmF1ZGlvX21vZGUgJj0gflBDTV9FTkFCTEVfSU5QVVQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK3dhdmVhcnRpc3RfaGFsdF9vdXRwdXQoaW50IGRldikKK3sKKwl3YXZuY19pbmZvCSpkZXZjID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisKKwl3YXZlYXJ0aXN0X2NtZDEoZGV2YywgV0FDTURfT1VUUFVUU1RPUCk7CisKKwlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKKworCS8qCisJICogQ2xlYXIgaW50ZXJydXB0IGJ5IHRvZ2dsaW5nCisJICogdGhlIElSUV9BQ0sgYml0IGluIENUUkwKKwkgKi8KKwlpZiAoaW5iKGRldmMtPmh3LmlvX2Jhc2UgKyBTVEFUUikgJiBJUlFfUkVRKQorCQl3YXZlYXJ0aXN0X2lhY2soZGV2Yyk7CisKKy8vCWRldmMtPmF1ZGlvX21vZGUgJj0gflBDTV9FTkFCTEVfT1VUUFVUOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X3RyaWdnZXIoaW50IGRldiwgaW50IHN0YXRlKQoreworCXdhdm5jX2luZm8JKmRldmMgPSAod2F2bmNfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJd2F2bmNfcG9ydF9pbmZvCSpwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaWYgKGRlYnVnX2ZsZyAmIERFQlVHX1RSSUdHRVIpIHsKKwkJcHJpbnRrKCJ3YXZuYzogYXVkaW8gdHJpZ2dlciAiKTsKKwkJaWYgKHN0YXRlICYgUENNX0VOQUJMRV9JTlBVVCkKKwkJCXByaW50aygiaW4gIik7CisJCWlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfT1VUUFVUKQorCQkJcHJpbnRrKCJvdXQiKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKworCXN0YXRlICY9IGRldmMtPmF1ZGlvX21vZGU7CisKKwlpZiAocG9ydGMtPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCAmJgorCSAgICBzdGF0ZSAmIFBDTV9FTkFCTEVfSU5QVVQpCisJCS8qCisJCSAqIGVuYWJsZSBBREMgRGF0YSBUcmFuc2ZlciB0byBQQworCQkgKi8KKwkJd2F2ZWFydGlzdF9jbWQxKGRldmMsIFdBQ01EX0lOUFVUU1RBUlQpOworCisJaWYgKHBvcnRjLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFICYmCisJICAgIHN0YXRlICYgUENNX0VOQUJMRV9PVVRQVVQpCisJCS8qCisJCSAqIGVuYWJsZSBEQUMgZGF0YSB0cmFuc2ZlciBmcm9tIFBDCisJCSAqLworCQl3YXZlYXJ0aXN0X2NtZDEoZGV2YywgV0FDTURfT1VUUFVUU1RBUlQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVhcnRpc3Rfc2V0X3NwZWVkKGludCBkZXYsIGludCBhcmcpCit7CisJd2F2bmNfcG9ydF9pbmZvICpwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKworCWlmIChhcmcgPD0gMCkKKwkJcmV0dXJuIHBvcnRjLT5zcGVlZDsKKworCWlmIChhcmcgPCA1MDAwKQorCQlhcmcgPSA1MDAwOworCWlmIChhcmcgPiA0NDEwMCkKKwkJYXJnID0gNDQxMDA7CisKKwlwb3J0Yy0+c3BlZWQgPSBhcmc7CisJcmV0dXJuIHBvcnRjLT5zcGVlZDsKKworfQorCitzdGF0aWMgc2hvcnQKK3dhdmVhcnRpc3Rfc2V0X2NoYW5uZWxzKGludCBkZXYsIHNob3J0IGFyZykKK3sKKwl3YXZuY19wb3J0X2luZm8gKnBvcnRjID0gKHdhdm5jX3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCisJaWYgKGFyZyAhPSAxICYmIGFyZyAhPSAyKQorCQlyZXR1cm4gcG9ydGMtPmNoYW5uZWxzOworCisJcG9ydGMtPmNoYW5uZWxzID0gYXJnOworCXJldHVybiBhcmc7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3dhdmVhcnRpc3Rfc2V0X2JpdHMoaW50IGRldiwgdW5zaWduZWQgaW50IGFyZykKK3sKKwl3YXZuY19wb3J0X2luZm8gKnBvcnRjID0gKHdhdm5jX3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCisJaWYgKGFyZyA9PSAwKQorCQlyZXR1cm4gcG9ydGMtPmF1ZGlvX2Zvcm1hdDsKKworCWlmICgoYXJnICE9IEFGTVRfVTgpICYmIChhcmcgIT0gQUZNVF9TMTZfTEUpICYmIChhcmcgIT0gQUZNVF9TOCkpCisJCWFyZyA9IEFGTVRfVTg7CisKKwlwb3J0Yy0+YXVkaW9fZm9ybWF0ID0gYXJnOworCisJcmV0dXJuIGFyZzsKK30KKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgd2F2ZWFydGlzdF9hdWRpb19kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gd2F2ZWFydGlzdF9vcGVuLAorCS5jbG9zZQkJCT0gd2F2ZWFydGlzdF9jbG9zZSwKKwkub3V0cHV0X2Jsb2NrCQk9IHdhdmVhcnRpc3Rfb3V0cHV0X2Jsb2NrLAorCS5zdGFydF9pbnB1dAkJPSB3YXZlYXJ0aXN0X3N0YXJ0X2lucHV0LAorCS5pb2N0bAkJCT0gd2F2ZWFydGlzdF9pb2N0bCwKKwkucHJlcGFyZV9mb3JfaW5wdXQJPSB3YXZlYXJ0aXN0X3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSB3YXZlYXJ0aXN0X3ByZXBhcmVfZm9yX291dHB1dCwKKwkuaGFsdF9pbwkJPSB3YXZlYXJ0aXN0X2hhbHQsCisJLmhhbHRfaW5wdXQJCT0gd2F2ZWFydGlzdF9oYWx0X2lucHV0LAorCS5oYWx0X291dHB1dAkJPSB3YXZlYXJ0aXN0X2hhbHRfb3V0cHV0LAorCS50cmlnZ2VyCQk9IHdhdmVhcnRpc3RfdHJpZ2dlciwKKwkuc2V0X3NwZWVkCQk9IHdhdmVhcnRpc3Rfc2V0X3NwZWVkLAorCS5zZXRfYml0cwkJPSB3YXZlYXJ0aXN0X3NldF9iaXRzLAorCS5zZXRfY2hhbm5lbHMJCT0gd2F2ZWFydGlzdF9zZXRfY2hhbm5lbHMKK307CisKKworc3RhdGljIGlycXJldHVybl90Cit3YXZlYXJ0aXN0X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl3YXZuY19pbmZvICpkZXZjID0gKHdhdm5jX2luZm8gKilkZXZfaWQ7CisJaW50CSAgIGlycXN0YXR1cywgc3RhdHVzOworCisJc3Bpbl9sb2NrKCZ3YXZlYXJ0aXN0X2xvY2spOworCWlycXN0YXR1cyA9IGluYihkZXZjLT5ody5pb19iYXNlICsgSVJRU1RBVCk7CisJc3RhdHVzICAgID0gaW5iKGRldmMtPmh3LmlvX2Jhc2UgKyBTVEFUUik7CisKKwlpZiAoZGVidWdfZmxnICYgREVCVUdfSU5UUikKKwkJcHJpbnRrKCJ3YXZlYXJ0aXN0X2ludHI6IHN0YXQ9JTAyeCwgaXJxc3RhdD0lMDJ4XG4iLAorCQkgICAgICAgc3RhdHVzLCBpcnFzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIElSUV9SRVEpCS8qIENsZWFyIGludGVycnVwdCAqLworCQl3YXZlYXJ0aXN0X2lhY2soZGV2Yyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiB1bmV4cGVjdGVkIGludGVycnVwdFxuIik7CisKKwlpZiAoaXJxc3RhdHVzICYgMHgwMSkgeworCQlpbnQgdGVtcCA9IDE7CisKKwkJLyogUENNIGJ1ZmZlciBkb25lCisJCSAqLworCQlpZiAoKHN0YXR1cyAmIERNQTApICYmIChkZXZjLT5hdWRpb19tb2RlICYgUENNX0VOQUJMRV9PVVRQVVQpKSB7CisJCQlETUFidWZfb3V0cHV0aW50cihkZXZjLT5wbGF5YmFja19kZXYsIDEpOworCQkJdGVtcCA9IDA7CisJCX0KKwkJaWYgKChzdGF0dXMgJiBETUExKSAmJiAoZGV2Yy0+YXVkaW9fbW9kZSAmIFBDTV9FTkFCTEVfSU5QVVQpKSB7CisJCQlETUFidWZfaW5wdXRpbnRyKGRldmMtPnJlY29yZF9kZXYpOworCQkJdGVtcCA9IDA7CisJCX0KKwkJaWYgKHRlbXApCS8vZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVhcnRpc3Q6IFVua25vd24gaW50ZXJydXB0XG4iKTsKKwl9CisJaWYgKGlycXN0YXR1cyAmIDB4MikKKwkJLy8gV2UgZG8gbm90IHVzZSBTQiBtb2RlIG5hdGl2ZWx5Li4uCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVhcnRpc3Q6IFVuZXhwZWN0ZWQgU0IgaW50ZXJydXB0Li4uXG4iKTsKKwlzcGluX3VubG9jaygmd2F2ZWFydGlzdF9sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1peGVyIHN0dWZmCisgKi8KK3N0cnVjdCBtaXhfZW50IHsKKwl1bnNpZ25lZCBjaGFyCXJlZ19sOworCXVuc2lnbmVkIGNoYXIJcmVnX3I7CisJdW5zaWduZWQgY2hhcglzaGlmdDsKKwl1bnNpZ25lZCBjaGFyCW1heDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWl4X2VudCBtaXhfZGV2c1tTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCXsgMiwgNiwgMSwgIDcgfSwgLyogU09VTkRfTUlYRVJfVk9MVU1FICAgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX0JBU1MgICAgICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9UUkVCTEUgICAqLworCXsgMCwgMCwgMCwgIDAgfSwgLyogU09VTkRfTUlYRVJfU1lOVEggICAgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX1BDTSAgICAgICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9TUEVBS0VSICAqLworCXsgMCwgNCwgNiwgMzEgfSwgLyogU09VTkRfTUlYRVJfTElORSAgICAgKi8KKwl7IDIsIDYsIDQsICAzIH0sIC8qIFNPVU5EX01JWEVSX01JQyAgICAgICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9DRCAgICAgICAqLworCXsgMCwgMCwgMCwgIDAgfSwgLyogU09VTkRfTUlYRVJfSU1JWCAgICAgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX0FMVFBDTSAgICovCisjaWYgMAorCXsgMywgNywgMCwgMTAgfSwgLyogU09VTkRfTUlYRVJfUkVDTEVWICAgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX0lHQUlOICAgICovCisjZWxzZQorCXsgMCwgMCwgMCwgIDAgfSwgLyogU09VTkRfTUlYRVJfUkVDTEVWICAgKi8KKwl7IDMsIDcsIDAsICA3IH0sIC8qIFNPVU5EX01JWEVSX0lHQUlOICAgICovCisjZW5kaWYKKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX09HQUlOICAgICovCisJeyAwLCA0LCAxLCAzMSB9LCAvKiBTT1VORF9NSVhFUl9MSU5FMSAgICAqLworCXsgMSwgNSwgNiwgMzEgfSwgLyogU09VTkRfTUlYRVJfTElORTIgICAgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX0xJTkUzICAgICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9ESUdJVEFMMSAqLworCXsgMCwgMCwgMCwgIDAgfSwgLyogU09VTkRfTUlYRVJfRElHSVRBTDIgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX0RJR0lUQUwzICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9QSE9ORUlOICAqLworCXsgMCwgMCwgMCwgIDAgfSwgLyogU09VTkRfTUlYRVJfUEhPTkVPVVQgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX1ZJREVPICAgICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9SQURJTyAgICAqLworCXsgMCwgMCwgMCwgIDAgfSAgLyogU09VTkRfTUlYRVJfTU9OSVRPUiAgKi8KK307CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X21peGVyX3VwZGF0ZSh3YXZuY19pbmZvICpkZXZjLCBpbnQgd2hpY2hEZXYpCit7CisJdW5zaWduZWQgaW50IGxldl9sZWZ0LCBsZXZfcmlnaHQ7CisKKwlsZXZfbGVmdCAgPSBkZXZjLT5sZXZlbHNbd2hpY2hEZXZdICYgMHhmZjsKKwlsZXZfcmlnaHQgPSBkZXZjLT5sZXZlbHNbd2hpY2hEZXZdID4+IDg7CisKKwlpZiAobGV2X2xlZnQgPiAxMDApCisJCWxldl9sZWZ0ID0gMTAwOworCWlmIChsZXZfcmlnaHQgPiAxMDApCisJCWxldl9yaWdodCA9IDEwMDsKKworI2RlZmluZSBTQ0FMRShsZXYsbWF4KQkoKGxldikgKiAobWF4KSAvIDEwMCkKKworCWlmIChtYWNoaW5lX2lzX25ldHdpbmRlcigpICYmIHdoaWNoRGV2ID09IFNPVU5EX01JWEVSX1BIT05FT1VUKQorCQl3aGljaERldiA9IFNPVU5EX01JWEVSX1ZPTFVNRTsKKworCWlmIChtaXhfZGV2c1t3aGljaERldl0ucmVnX2wgfHwgbWl4X2RldnNbd2hpY2hEZXZdLnJlZ19yKSB7CisJCWNvbnN0IHN0cnVjdCBtaXhfZW50ICptaXggPSBtaXhfZGV2cyArIHdoaWNoRGV2OworCQl1bnNpZ25lZCBpbnQgbWFzaywgbGVmdCwgcmlnaHQ7CisKKwkJbWFzayA9IG1peC0+bWF4IDw8IG1peC0+c2hpZnQ7CisJCWxldl9sZWZ0ICA9IFNDQUxFKGxldl9sZWZ0LCAgbWl4LT5tYXgpIDw8IG1peC0+c2hpZnQ7CisJCWxldl9yaWdodCA9IFNDQUxFKGxldl9yaWdodCwgbWl4LT5tYXgpIDw8IG1peC0+c2hpZnQ7CisKKwkJLyogcmVhZCBsZWZ0IHNldHRpbmcgKi8KKwkJbGVmdCAgPSB3YXZlYXJ0aXN0X2NtZDFfcihkZXZjLCBXQUNNRF9HRVRfTEVWRUwgfAorCQkJCQkgICAgICAgbWl4LT5yZWdfbCA8PCA4KTsKKworCQkvKiByZWFkIHJpZ2h0IHNldHRpbmcgKi8KKwkJcmlnaHQgPSB3YXZlYXJ0aXN0X2NtZDFfcihkZXZjLCBXQUNNRF9HRVRfTEVWRUwgfAorCQkJCQkJbWl4LT5yZWdfciA8PCA4KTsKKworCQlsZWZ0ICA9IChsZWZ0ICAmIH5tYXNrKSB8IChsZXZfbGVmdCAgJiBtYXNrKTsKKwkJcmlnaHQgPSAocmlnaHQgJiB+bWFzaykgfCAobGV2X3JpZ2h0ICYgbWFzayk7CisKKwkJLyogd3JpdGUgbGVmdCxyaWdodCBiYWNrICovCisJCXdhdmVhcnRpc3RfY21kMyhkZXZjLCBXQUNNRF9TRVRfTUlYRVIsIGxlZnQsIHJpZ2h0KTsKKwl9IGVsc2UgeworCQlzd2l0Y2god2hpY2hEZXYpIHsKKwkJY2FzZSBTT1VORF9NSVhFUl9QQ006CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX0xFVkVMLAorCQkJCQlTQ0FMRShsZXZfbGVmdCwgIDMyNzY3KSwKKwkJCQkJU0NBTEUobGV2X3JpZ2h0LCAzMjc2NykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKKwkJCXdhdmVhcnRpc3RfY21kMyhkZXZjLCAweDAxMDAgfCBXQUNNRF9TRVRfTEVWRUwsCisJCQkJCVNDQUxFKGxldl9sZWZ0LCAgMzI3NjcpLAorCQkJCQlTQ0FMRShsZXZfcmlnaHQsIDMyNzY3KSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIFNldCB0aGUgQURDIE1VWCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlcy4gIFdlIGRvIE5PVCBkbyBhbnkKKyAqIGNoZWNraW5nIG9mIHRoZSB2YWx1ZXMgcGFzc2VkLCBzaW5jZSB3ZSBhc3N1bWUgdGhhdCB0aGUKKyAqIHJlbGV2YW50ICpfc2VsZWN0X2lucHV0IGZ1bmN0aW9uIGhhcyBkb25lIHRoYXQgZm9yIHVzLgorICovCitzdGF0aWMgdm9pZAord2F2ZWFydGlzdF9zZXRfYWRjX211eCh3YXZuY19pbmZvICpkZXZjLCBjaGFyIGxlZnRfZGV2LCBjaGFyIHJpZ2h0X2RldikKK3sKKwl1bnNpZ25lZCBpbnQgcmVnXzA4LCByZWdfMDk7CisKKwlyZWdfMDggPSB3YXZlYXJ0aXN0X2NtZDFfcihkZXZjLCBXQUNNRF9HRVRfTEVWRUwgfCAweDA4MDApOworCXJlZ18wOSA9IHdhdmVhcnRpc3RfY21kMV9yKGRldmMsIFdBQ01EX0dFVF9MRVZFTCB8IDB4MDkwMCk7CisKKwlyZWdfMDggPSAocmVnXzA4ICYgfjB4M2YpIHwgcmlnaHRfZGV2IDw8IDMgfCBsZWZ0X2RldjsKKworCXdhdmVhcnRpc3RfY21kMyhkZXZjLCBXQUNNRF9TRVRfTUlYRVIsIHJlZ18wOCwgcmVnXzA5KTsKK30KKworLyoKKyAqIERlY29kZSBhIHJlY29yZGluZyBtYXNrIGludG8gYSBtaXhlciBzZWxlY3Rpb24gYXMgZm9sbG93czoKKyAqCisgKiAgICAgT1NTIFNvdXJjZQlXQSBTb3VyY2UJQWN0dWFsIHNvdXJjZQorICogIFNPVU5EX01BU0tfSU1JWAlNaXhlcgkJTWl4ZXIgb3V0cHV0IChzYW1lIGFzIEFEMTg0OCkKKyAqICBTT1VORF9NQVNLX0xJTkUJTGluZQkJTGluZSBpbgorICogIFNPVU5EX01BU0tfTElORTEJQXV4IDEJCUF1eCAxIGluCisgKiAgU09VTkRfTUFTS19MSU5FMglBdXggMgkJQXV4IDIgaW4KKyAqICBTT1VORF9NQVNLX01JQwlNaWMJCU1pY3JvcGhvbmUKKyAqLworc3RhdGljIHVuc2lnbmVkIGludAord2F2ZWFydGlzdF9zZWxlY3RfaW5wdXQod2F2bmNfaW5mbyAqZGV2YywgdW5zaWduZWQgaW50IHJlY21hc2ssCisJCQl1bnNpZ25lZCBjaGFyICpkZXZfbCwgdW5zaWduZWQgY2hhciAqZGV2X3IpCit7CisJdW5zaWduZWQgaW50IHJlY2RldiA9IEFEQ19NVVhfTk9ORTsKKworCWlmIChyZWNtYXNrICYgU09VTkRfTUFTS19JTUlYKSB7CisJCXJlY21hc2sgPSBTT1VORF9NQVNLX0lNSVg7CisJCXJlY2RldiA9IEFEQ19NVVhfTUlYRVI7CisJfSBlbHNlIGlmIChyZWNtYXNrICYgU09VTkRfTUFTS19MSU5FMikgeworCQlyZWNtYXNrID0gU09VTkRfTUFTS19MSU5FMjsKKwkJcmVjZGV2ID0gQURDX01VWF9BVVgyOworCX0gZWxzZSBpZiAocmVjbWFzayAmIFNPVU5EX01BU0tfTElORTEpIHsKKwkJcmVjbWFzayA9IFNPVU5EX01BU0tfTElORTE7CisJCXJlY2RldiA9IEFEQ19NVVhfQVVYMTsKKwl9IGVsc2UgaWYgKHJlY21hc2sgJiBTT1VORF9NQVNLX0xJTkUpIHsKKwkJcmVjbWFzayA9IFNPVU5EX01BU0tfTElORTsKKwkJcmVjZGV2ID0gQURDX01VWF9MSU5FOworCX0gZWxzZSBpZiAocmVjbWFzayAmIFNPVU5EX01BU0tfTUlDKSB7CisJCXJlY21hc2sgPSBTT1VORF9NQVNLX01JQzsKKwkJcmVjZGV2ID0gQURDX01VWF9NSUM7CisJfQorCisJKmRldl9sID0gKmRldl9yID0gcmVjZGV2OworCisJcmV0dXJuIHJlY21hc2s7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVhcnRpc3RfZGVjb2RlX21peGVyKHdhdm5jX2luZm8gKmRldmMsIGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbGV2X2wsCisJCQl1bnNpZ25lZCBjaGFyIGxldl9yKQoreworCXN3aXRjaCAoZGV2KSB7CisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwljYXNlIFNPVU5EX01JWEVSX0xJTkU6CisJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJY2FzZSBTT1VORF9NSVhFUl9JR0FJTjoKKwljYXNlIFNPVU5EX01JWEVSX0xJTkUxOgorCWNhc2UgU09VTkRfTUlYRVJfTElORTI6CisJCWRldmMtPmxldmVsc1tkZXZdID0gbGV2X2wgfCBsZXZfciA8PCA4OworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfSU1JWDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXYgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW50IHdhdmVhcnRpc3RfZ2V0X21peGVyKHdhdm5jX2luZm8gKmRldmMsIGludCBkZXYpCit7CisJcmV0dXJuIGRldmMtPmxldmVsc1tkZXZdOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdmVhcnRpc3RfbWl4ZXJfaW5mbyB3YXZlYXJ0aXN0X21peGVyID0geworCS5zdXBwb3J0ZWRfZGV2cwk9IFNVUFBPUlRFRF9NSVhFUl9ERVZJQ0VTIHwgU09VTkRfTUFTS19JR0FJTiwKKwkucmVjb3JkaW5nX2RldnMJPSBTT1VORF9NQVNLX0xJTkUgIHwgU09VTkRfTUFTS19NSUMgICB8CisJCQlTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19MSU5FMiB8CisJCQlTT1VORF9NQVNLX0lNSVgsCisJLnN0ZXJlb19kZXZzCT0gKFNVUFBPUlRFRF9NSVhFUl9ERVZJQ0VTIHwgU09VTkRfTUFTS19JR0FJTikgJiB+CisJCQkoU09VTkRfTUFTS19TUEVBS0VSIHwgU09VTkRfTUFTS19JTUlYKSwKKwkuc2VsZWN0X2lucHV0CT0gd2F2ZWFydGlzdF9zZWxlY3RfaW5wdXQsCisJLmRlY29kZV9taXhlcgk9IHdhdmVhcnRpc3RfZGVjb2RlX21peGVyLAorCS5nZXRfbWl4ZXIJPSB3YXZlYXJ0aXN0X2dldF9taXhlciwKK307CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X3NldF9yZWNtYXNrKHdhdm5jX2luZm8gKmRldmMsIHVuc2lnbmVkIGludCByZWNtYXNrKQoreworCXVuc2lnbmVkIGNoYXIgZGV2X2wsIGRldl9yOworCisJcmVjbWFzayAmPSBkZXZjLT5taXgtPnJlY29yZGluZ19kZXZzOworCisJLyoKKwkgKiBJZiBtb3JlIHRoYW4gb25lIHJlY29yZGluZyBkZXZpY2Ugc2VsZWN0ZWQsCisJICogZGlzYWJsZSB0aGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IGluIHVzZS4KKwkgKi8KKwlpZiAoaHdlaWdodDMyKHJlY21hc2spID4gMSkKKwkJcmVjbWFzayAmPSB+ZGV2Yy0+cmVjbWFzazsKKworCS8qCisJICogVHJhbnNsYXRlIHRoZSByZWNvcmRpbmcgZGV2aWNlIG1hc2sgaW50bworCSAqIHRoZSBBREMgbXVsdGlwbGV4ZXIgc2V0dGluZ3MuCisJICovCisJZGV2Yy0+cmVjbWFzayA9IGRldmMtPm1peC0+c2VsZWN0X2lucHV0KGRldmMsIHJlY21hc2ssCisJCQkJCQkmZGV2X2wsICZkZXZfcik7CisKKwl3YXZlYXJ0aXN0X3NldF9hZGNfbXV4KGRldmMsIGRldl9sLCBkZXZfcik7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVhcnRpc3Rfc2V0X21peGVyKHdhdm5jX2luZm8gKmRldmMsIGludCBkZXYsIHVuc2lnbmVkIGludCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBpbnQgbGV2X2xlZnQgID0gbGV2ZWwgJiAweDAwZmY7CisJdW5zaWduZWQgaW50IGxldl9yaWdodCA9IChsZXZlbCAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChsZXZfbGVmdCA+IDEwMCkKKwkJbGV2X2xlZnQgPSAxMDA7CisJaWYgKGxldl9yaWdodCA+IDEwMCkKKwkJbGV2X3JpZ2h0ID0gMTAwOworCisJLyoKKwkgKiBNb25vIGRldmljZXMgaGF2ZSB0aGVpciByaWdodCB2b2x1bWUgZm9yY2VkIHRvIHRoZWlyCisJICogbGVmdCB2b2x1bWUuICAoZnJvbSBBTFNBIGRyaXZlciBPU1MgZW11bGF0aW9uKS4KKwkgKi8KKwlpZiAoIShkZXZjLT5taXgtPnN0ZXJlb19kZXZzICYgKDEgPDwgZGV2KSkpCisJCWxldl9yaWdodCA9IGxldl9sZWZ0OworCisJZGV2ID0gZGV2Yy0+bWl4LT5kZWNvZGVfbWl4ZXIoZGV2YywgZGV2LCBsZXZfbGVmdCwgbGV2X3JpZ2h0KTsKKworCWlmIChkZXYgPj0gMCkKKwkJd2F2ZWFydGlzdF9taXhlcl91cGRhdGUoZGV2YywgZGV2KTsKKworCXJldHVybiBkZXYgPCAwID8gZGV2IDogMDsKK30KKworc3RhdGljIGludAord2F2ZWFydGlzdF9taXhlcl9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKK3sKKwl3YXZuY19pbmZvICpkZXZjID0gKHdhdm5jX2luZm8gKilhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJaW50IHJldCA9IDAsIHZhbCwgbnI7CisKKwkvKgorCSAqIEFsbCBTT1VORF9NSVhFUl8qIGlvY3RscyB1c2UgdHlwZSAnTScKKwkgKi8KKwlpZiAoKChjbWQgPj4gOCkgJiAyNTUpICE9ICdNJykKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworI2lmZGVmIENPTkZJR19BUkNIX05FVFdJTkRFUgorCWlmIChtYWNoaW5lX2lzX25ldHdpbmRlcigpKSB7CisJCXJldCA9IHZuY19wcml2YXRlX2lvY3RsKGRldiwgY21kLCBhcmcpOworCQlpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkKKwkJCXJldHVybiByZXQ7CisJCWVsc2UKKwkJCXJldCA9IDA7CisJfQorI2VuZGlmCisKKwluciA9IGNtZCAmIDB4ZmY7CisKKwlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkgeworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzd2l0Y2ggKG5yKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJd2F2ZWFydGlzdF9zZXRfcmVjbWFzayhkZXZjLCB2YWwpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlpZiAobnIgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMgJiYKKwkJCSAgICBkZXZjLT5taXgtPnN1cHBvcnRlZF9kZXZzICYgKDEgPDwgbnIpKQorCQkJCXJldCA9IHdhdmVhcnRpc3Rfc2V0X21peGVyKGRldmMsIG5yLCB2YWwpOworCQl9CisJfQorCisJaWYgKHJldCA9PSAwICYmIF9TSU9DX0RJUihjbWQpICYgX1NJT0NfUkVBRCkgeworCQlyZXQgPSAtRUlOVkFMOworCisJCXN3aXRjaCAobnIpIHsKKwkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQlyZXQgPSBkZXZjLT5yZWNtYXNrOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJcmV0ID0gZGV2Yy0+bWl4LT5zdXBwb3J0ZWRfZGV2czsKKwkJCWJyZWFrOworCisJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoKKwkJCXJldCA9IGRldmMtPm1peC0+c3RlcmVvX2RldnM7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQlyZXQgPSBkZXZjLT5taXgtPnJlY29yZGluZ19kZXZzOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJcmV0ID0gU09VTkRfQ0FQX0VYQ0xfSU5QVVQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaWYgKG5yIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTKQorCQkJCXJldCA9IGRldmMtPm1peC0+Z2V0X21peGVyKGRldmMsIG5yKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKWFyZykgPyAtRUZBVUxUIDogMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgd2F2ZWFydGlzdF9taXhlcl9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWQJPSAiV2F2ZUFydGlzdCIsCisJLm5hbWUJPSAiV2F2ZUFydGlzdCIsCisJLmlvY3RsCT0gd2F2ZWFydGlzdF9taXhlcl9pb2N0bAorfTsKKworc3RhdGljIHZvaWQKK3dhdmVhcnRpc3RfbWl4ZXJfcmVzZXQod2F2bmNfaW5mbyAqZGV2YykKK3sKKwlpbnQgaTsKKworCWlmIChkZWJ1Z19mbGcgJiBERUJVR19NSVhFUikKKwkJcHJpbnRrKCIlczogbWl4ZXJfcmVzZXRcbiIsIGRldmMtPmh3Lm5hbWUpOworCisJLyoKKwkgKiByZXNldCBtaXhlciBjbWQKKwkgKi8KKwl3YXZlYXJ0aXN0X2NtZDEoZGV2YywgV0FDTURfUlNUX01JWEVSKTsKKworCS8qCisJICogc2V0IGlucHV0IGZvciBBREMgdG8gY29tZSBmcm9tICdxdWlldCcKKwkgKiB0dXJuIG9uIGRlZmF1bHQgbW9kZXMKKwkgKi8KKwl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCAweDk4MDAsIDB4YTgzNik7CisKKwkvKgorCSAqIHNldCBtaXhlciBpbnB1dCBzZWxlY3QgdG8gbm9uZSwgUlggZmlsdGVyIGdhaW5zIDAgZEIKKwkgKi8KKwl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCAweDRjMDAsIDB4OGMwMCk7CisKKwkvKgorCSAqIHNldCBiaXQgMCByZWcgMiB0byAxIC0gdW5tdXRlIE1vbm9PdXQKKwkgKi8KKwl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCAweDI4MDEsIDB4NjgwMCk7CisKKwkvKiBzZXQgZGVmYXVsdCBpbnB1dCBkZXZpY2UgPSBpbnRlcm5hbCBtaWMKKwkgKiBjdXJyZW50IHJlY29yZGluZyBkZXZpY2UgPSBub25lCisJICovCisJd2F2ZWFydGlzdF9zZXRfcmVjbWFzayhkZXZjLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJd2F2ZWFydGlzdF9taXhlcl91cGRhdGUoZGV2YywgaSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHdhdmVhcnRpc3RfaW5pdCh3YXZuY19pbmZvICpkZXZjKQoreworCXdhdm5jX3BvcnRfaW5mbyAqcG9ydGM7CisJY2hhciByZXZbM10sIGRldl9uYW1lWzY0XTsKKwlpbnQgbXlfZGV2OworCisJaWYgKHdhdmVhcnRpc3RfcmVzZXQoZGV2YykpCisJCXJldHVybiAtRU5PREVWOworCisJc3ByaW50ZihkZXZfbmFtZSwgIiVzICglcyIsIGRldmMtPmh3Lm5hbWUsIGRldmMtPmNoaXBfbmFtZSk7CisKKwlpZiAod2F2ZWFydGlzdF9nZXRyZXYoZGV2YywgcmV2KSkgeworCQlzdHJjYXQoZGV2X25hbWUsICIgcmV2LiAiKTsKKwkJc3RyY2F0KGRldl9uYW1lLCByZXYpOworCX0KKwlzdHJjYXQoZGV2X25hbWUsICIpIik7CisKKwljb25mX3ByaW50ZjIoZGV2X25hbWUsIGRldmMtPmh3LmlvX2Jhc2UsIGRldmMtPmh3LmlycSwKKwkJICAgICBkZXZjLT5ody5kbWEsIGRldmMtPmh3LmRtYTIpOworCisJcG9ydGMgPSAod2F2bmNfcG9ydF9pbmZvICopa21hbGxvYyhzaXplb2Yod2F2bmNfcG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBvcnRjID09IE5VTEwpCisJCWdvdG8gbm9tZW07CisKKwltZW1zZXQocG9ydGMsIDAsIHNpemVvZih3YXZuY19wb3J0X2luZm8pKTsKKworCW15X2RldiA9IHNvdW5kX2luc3RhbGxfYXVkaW9kcnYoQVVESU9fRFJJVkVSX1ZFUlNJT04sIGRldl9uYW1lLAorCQkJJndhdmVhcnRpc3RfYXVkaW9fZHJpdmVyLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2RyaXZlciksCisJCQlkZXZjLT5hdWRpb19mbGFncywgQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9TOCwKKwkJCWRldmMsIGRldmMtPmh3LmRtYSwgZGV2Yy0+aHcuZG1hMik7CisKKwlpZiAobXlfZGV2IDwgMCkKKwkJZ290byBmcmVlOworCisJYXVkaW9fZGV2c1tteV9kZXZdLT5wb3J0YyA9IHBvcnRjOworCisJd2F2ZWFydGlzdF9taXhlcl9yZXNldChkZXZjKTsKKworCS8qCisJICogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0CisJICovCisJd2F2ZWFydGlzdF9pYWNrKGRldmMpOworCisJaWYgKHJlcXVlc3RfaXJxKGRldmMtPmh3LmlycSwgd2F2ZWFydGlzdF9pbnRyLCAwLCBkZXZjLT5ody5uYW1lLCBkZXZjKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIGluIHVzZVxuIiwKKwkJCWRldmMtPmh3Lm5hbWUsIGRldmMtPmh3LmlycSk7CisJCWdvdG8gdW5pbnN0YWxsOworCX0KKworCWlmIChzb3VuZF9hbGxvY19kbWEoZGV2Yy0+aHcuZG1hLCBkZXZjLT5ody5uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBhbGxvY2F0ZSBETUElZFxuIiwKKwkJCWRldmMtPmh3Lm5hbWUsIGRldmMtPmh3LmRtYSk7CisJCWdvdG8gdW5pbnN0YWxsX2lycTsKKwl9CisKKwlpZiAoZGV2Yy0+aHcuZG1hICE9IGRldmMtPmh3LmRtYTIgJiYgZGV2Yy0+aHcuZG1hMiAhPSBOT19ETUEpCisJCWlmIChzb3VuZF9hbGxvY19kbWEoZGV2Yy0+aHcuZG1hMiwgZGV2Yy0+aHcubmFtZSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGFsbG9jYXRlIERNQSVkXG4iLAorCQkJCWRldmMtPmh3Lm5hbWUsIGRldmMtPmh3LmRtYTIpOworCQkJZ290byB1bmluc3RhbGxfZG1hOworCQl9CisKKwl3YXZlYXJ0aXN0X3NldF9jdGxyKCZkZXZjLT5odywgMCwgRE1BMV9JRSB8IERNQTBfSUUpOworCisJYXVkaW9fZGV2c1tteV9kZXZdLT5taXhlcl9kZXYgPQorCQlzb3VuZF9pbnN0YWxsX21peGVyKE1JWEVSX0RSSVZFUl9WRVJTSU9OLAorCQkJCWRldl9uYW1lLAorCQkJCSZ3YXZlYXJ0aXN0X21peGVyX29wZXJhdGlvbnMsCisJCQkJc2l6ZW9mKHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKSwKKwkJCQlkZXZjKTsKKworCXJldHVybiBteV9kZXY7CisKK3VuaW5zdGFsbF9kbWE6CisJc291bmRfZnJlZV9kbWEoZGV2Yy0+aHcuZG1hKTsKKwordW5pbnN0YWxsX2lycToKKwlmcmVlX2lycShkZXZjLT5ody5pcnEsIGRldmMpOworCit1bmluc3RhbGw6CisJc291bmRfdW5sb2FkX2F1ZGlvZGV2KG15X2Rldik7CisKK2ZyZWU6CisJa2ZyZWUocG9ydGMpOworCitub21lbToKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX3dhdmVhcnRpc3Qoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXdhdm5jX2luZm8gKmRldmMgPSAmYWRldl9pbmZvW25yX3dhdmVhcnRpc3RfZGV2c107CisKKwlpZiAobnJfd2F2ZWFydGlzdF9kZXZzID49IE1BWF9BVURJT19ERVYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2F2ZWFydGlzdDogdG9vIG1hbnkgYXVkaW8gZGV2aWNlc1xuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNSwgaHdfY29uZmlnLT5uYW1lKSkgIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2F2ZUFydGlzdDogSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaHdfY29uZmlnLT5pcnEgPiAxNSB8fCBod19jb25maWctPmlycSA8IDApIHsKKwkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhdmVBcnRpc3Q6IEJhZCBJUlEgJWRcbiIsCisJCSAgICAgICBod19jb25maWctPmlycSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChod19jb25maWctPmRtYSAhPSAzKSB7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMTUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXZlQXJ0aXN0OiBCYWQgRE1BICVkXG4iLAorCQkgICAgICAgaHdfY29uZmlnLT5kbWEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlod19jb25maWctPm5hbWUgPSAiV2F2ZUFydGlzdCI7CisJZGV2Yy0+aHcgPSAqaHdfY29uZmlnOworCWRldmMtPm9wZW5fbW9kZSA9IDA7CisJZGV2Yy0+Y2hpcF9uYW1lID0gIlJXQS0wMTAiOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorYXR0YWNoX3dhdmVhcnRpc3Qoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHcsIGNvbnN0IHN0cnVjdCB3YXZlYXJ0aXN0X21peGVyX2luZm8gKm1peCkKK3sKKwl3YXZuY19pbmZvICpkZXZjID0gJmFkZXZfaW5mb1tucl93YXZlYXJ0aXN0X2RldnNdOworCisJLyoKKwkgKiBOT1RFISBJZiBpcnEgPCAwLCB0aGVyZSBpcyBhbm90aGVyIGRyaXZlciB3aGljaCBoYXMgYWxsb2NhdGVkIHRoZQorCSAqICAgSVJRIHNvIHRoYXQgdGhpcyBkcml2ZXIgZG9lc24ndCBuZWVkIHRvIGFsbG9jYXRlL2RlYWxsb2NhdGUgaXQuCisJICogICBUaGUgYWN0dWFsbHkgdXNlZCBJUlEgaXMgQUJTKGlycSkuCisJICovCisJZGV2Yy0+aHcgPSAqaHc7CisJZGV2Yy0+aHcuaXJxID0gKGh3LT5pcnEgPiAwKSA/IGh3LT5pcnEgOiAwOworCWRldmMtPm9wZW5fbW9kZSA9IDA7CisJZGV2Yy0+cGxheWJhY2tfZGV2ID0gMDsKKwlkZXZjLT5yZWNvcmRfZGV2ID0gMDsKKwlkZXZjLT5hdWRpb19mbGFncyA9IERNQV9BVVRPTU9ERTsKKwlkZXZjLT5sZXZlbHMgPSBsZXZlbHM7CisKKwlpZiAoaHctPmRtYSAhPSBody0+ZG1hMiAmJiBody0+ZG1hMiAhPSBOT19ETUEpCisJCWRldmMtPmF1ZGlvX2ZsYWdzIHw9IERNQV9EVVBMRVg7CisKKwlkZXZjLT5taXggPSBtaXg7CisJZGV2Yy0+ZGV2X25vID0gd2F2ZWFydGlzdF9pbml0KGRldmMpOworCisJaWYgKGRldmMtPmRldl9ubyA8IDApCisJCXJlbGVhc2VfcmVnaW9uKGh3LT5pb19iYXNlLCAxNSk7CisJZWxzZSB7CisjaWZkZWYgQ09ORklHX0FSQ0hfTkVUV0lOREVSCisJCWlmIChtYWNoaW5lX2lzX25ldHdpbmRlcigpKSB7CisJCQlpbml0X3RpbWVyKCZ2bmNfdGltZXIpOworCQkJdm5jX3RpbWVyLmZ1bmN0aW9uID0gdm5jX3NsaWRlcl90aWNrOworCQkJdm5jX3RpbWVyLmV4cGlyZXMgID0gamlmZmllczsKKwkJCXZuY190aW1lci5kYXRhICAgICA9IG5yX3dhdmVhcnRpc3RfZGV2czsKKwkJCWFkZF90aW1lcigmdm5jX3RpbWVyKTsKKworCQkJdm5jX2NvbmZpZ3VyZV9taXhlcihkZXZjLCAwKTsKKworCQkJZGV2Yy0+bm9fYXV0b3NlbGVjdCA9IDE7CisJCX0KKyNlbmRpZgorCQlucl93YXZlYXJ0aXN0X2RldnMgKz0gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfd2F2ZWFydGlzdChzdHJ1Y3QgYWRkcmVzc19pbmZvICpodykKK3sKKwl3YXZuY19pbmZvICpkZXZjID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucl93YXZlYXJ0aXN0X2RldnM7IGkrKykKKwkJaWYgKGh3LT5pb19iYXNlID09IGFkZXZfaW5mb1tpXS5ody5pb19iYXNlKSB7CisJCQlkZXZjID0gYWRldl9pbmZvICsgaTsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoZGV2YyAhPSBOVUxMKSB7CisJCWludCBtaXhlcjsKKworI2lmZGVmIENPTkZJR19BUkNIX05FVFdJTkRFUgorCQlpZiAobWFjaGluZV9pc19uZXR3aW5kZXIoKSkKKwkJCWRlbF90aW1lcigmdm5jX3RpbWVyKTsKKyNlbmRpZgorCisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmh3LmlvX2Jhc2UsIDE1KTsKKworCQl3YXZlYXJ0aXN0X3NldF9jdGxyKCZkZXZjLT5odywgRE1BMV9JRXxETUEwX0lFLCAwKTsKKworCQlpZiAoZGV2Yy0+aHcuaXJxID49IDApCisJCQlmcmVlX2lycShkZXZjLT5ody5pcnEsIGRldmMpOworCisJCXNvdW5kX2ZyZWVfZG1hKGRldmMtPmh3LmRtYSk7CisKKwkJaWYgKGRldmMtPmh3LmRtYSAhPSBkZXZjLT5ody5kbWEyICYmCisJCSAgICBkZXZjLT5ody5kbWEyICE9IE5PX0RNQSkKKwkJCXNvdW5kX2ZyZWVfZG1hKGRldmMtPmh3LmRtYTIpOworCisJCW1peGVyID0gYXVkaW9fZGV2c1tkZXZjLT5kZXZfbm9dLT5taXhlcl9kZXY7CisKKwkJaWYgKG1peGVyID49IDApCisJCQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYobWl4ZXIpOworCisJCWlmIChkZXZjLT5kZXZfbm8gPj0gMCkKKwkJCXNvdW5kX3VubG9hZF9hdWRpb2RldihkZXZjLT5kZXZfbm8pOworCisJCW5yX3dhdmVhcnRpc3RfZGV2cyAtPSAxOworCisJCWZvciAoOyBpIDwgbnJfd2F2ZWFydGlzdF9kZXZzOyBpKyspCisJCQlhZGV2X2luZm9baV0gPSBhZGV2X2luZm9baSArIDFdOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiBjYW4ndCBmaW5kIGRldmljZSAiCisJCSAgICAgICAidG8gdW5sb2FkXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19BUkNIX05FVFdJTkRFUgorCisvKgorICogUmViZWwuY29tIE5ldHdpbmRlciBzcGVjaWZpY3MuLi4KKyAqLworCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CisgCisjZGVmaW5lCVZOQ19USU1FUl9QRVJJT0QgKEhaLzQpCS8vY2hlY2sgc2xpZGVyIDQgdGltZXMvc2VjCisKKyNkZWZpbmUJTUlYRVJfUFJJVkFURTNfUkVTRVQJMHg1MzU3MDAwMAorI2RlZmluZQlNSVhFUl9QUklWQVRFM19SRUFECTB4NTM1NzAwMDEKKyNkZWZpbmUJTUlYRVJfUFJJVkFURTNfV1JJVEUJMHg1MzU3MDAwMgorCisjZGVmaW5lCVZOQ19NVVRFX0lOVEVSTkFMX1NQS1IJMHgwMQkvL3RoZSBzdyBtdXRlIG9uL29mZiBjb250cm9sIGJpdAorI2RlZmluZQlWTkNfTVVURV9MSU5FX09VVAkweDEwCisjZGVmaW5lIFZOQ19QSE9ORV9ERVRFQ1QJMHgyMAorI2RlZmluZSBWTkNfSEFORFNFVF9ERVRFQ1QJMHg0MAorI2RlZmluZSBWTkNfRElTQUJMRV9BVVRPU1dJVENICTB4ODAKKworZXh0ZXJuIHNwaW5sb2NrX3QgZ3Bpb19sb2NrOworCitzdGF0aWMgaW5saW5lIHZvaWQKK3ZuY19tdXRlX3Nwa3Iod2F2bmNfaW5mbyAqZGV2YykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCWNwbGRfbW9kaWZ5KENQTERfVU5NVVRFLCBkZXZjLT5zcGtyX211dGVfc3RhdGUgPyAwIDogQ1BMRF9VTk1VVEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAordm5jX211dGVfbG91dCh3YXZuY19pbmZvICpkZXZjKQoreworCXVuc2lnbmVkIGludCBsZWZ0LCByaWdodDsKKworCWxlZnQgID0gd2F2ZWFydGlzdF9jbWQxX3IoZGV2YywgV0FDTURfR0VUX0xFVkVMKTsKKwlyaWdodCA9IHdhdmVhcnRpc3RfY21kMV9yKGRldmMsIFdBQ01EX0dFVF9MRVZFTCB8IDB4NDAwKTsKKworCWlmIChkZXZjLT5saW5lX211dGVfc3RhdGUpIHsKKwkJbGVmdCAmPSB+MTsKKwkJcmlnaHQgJj0gfjE7CisJfSBlbHNlIHsKKwkJbGVmdCB8PSAxOworCQlyaWdodCB8PSAxOworCX0KKwl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBsZWZ0LCByaWdodCk7CisJCQorfQorCitzdGF0aWMgaW50Cit2bmNfdm9sdW1lX3NsaWRlcih3YXZuY19pbmZvICpkZXZjKQoreworCXN0YXRpYyBzaWduZWQgaW50IG9sZF9zbGlkZXJfdm9sdW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2lnbmVkIGludCB2b2x1bWUgPSAyNTU7CisKKwkqQ1NSX1RJTUVSMV9MT0FEID0gMHgwMGZmZmZmZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKworCW91dGIoMHhGRiwgMHgyMDEpOworCSpDU1JfVElNRVIxX0NOVEwgPSBUSU1FUl9DTlRMX0VOQUJMRSB8IFRJTUVSX0NOVExfRElWMTsKKworCXdoaWxlICh2b2x1bWUgJiYgKGluYigweDIwMSkgJiAweDAxKSkKKwkJdm9sdW1lLS07CisKKwkqQ1NSX1RJTUVSMV9DTlRMID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndhdmVhcnRpc3RfbG9jayxmbGFncyk7CisJCisJdm9sdW1lID0gMHgwMGZmZmZmZiAtICpDU1JfVElNRVIxX1ZBTFVFOworCisKKyNpZm5kZWYgUkVWRVJTRQorCXZvbHVtZSA9IDE1MCAtICh2b2x1bWUgPj4gNSk7CisjZWxzZQorCXZvbHVtZSA9ICh2b2x1bWUgPj4gNikgLSAyNTsKKyNlbmRpZgorCisJaWYgKHZvbHVtZSA8IDApCisJCXZvbHVtZSA9IDA7CisKKwlpZiAodm9sdW1lID4gMTAwKQorCQl2b2x1bWUgPSAxMDA7CisKKwkvKgorCSAqIHNsaWRlciBxdWl0ZSBvZnRlbiByZWFkcyArLTgsIHNvIGRlYm91bmNlIHRoaXMgcmFuZG9tIG5vaXNlCisJICovCisJaWYgKGFicyh2b2x1bWUgLSBvbGRfc2xpZGVyX3ZvbHVtZSkgPiA3KSB7CisJCW9sZF9zbGlkZXJfdm9sdW1lID0gdm9sdW1lOworCisJCWlmIChkZWJ1Z19mbGcgJiBERUJVR19NSVhFUikKKwkJCXByaW50ayhLRVJOX0RFQlVHICJTbGlkZXIgdm9sdW1lOiAlZC5cbiIsIHZvbHVtZSk7CisJfQorCisJcmV0dXJuIG9sZF9zbGlkZXJfdm9sdW1lOworfQorCisvKgorICogRGVjb2RlIGEgcmVjb3JkaW5nIG1hc2sgaW50byBhIG1peGVyIHNlbGVjdGlvbiBvbiB0aGUgTmV0V2luZGVyCisgKiBhcyBmb2xsb3dzOgorICoKKyAqICAgICBPU1MgU291cmNlCVdBIFNvdXJjZQlBY3R1YWwgc291cmNlCisgKiAgU09VTkRfTUFTS19JTUlYCU1peGVyCQlNaXhlciBvdXRwdXQgKHNhbWUgYXMgQUQxODQ4KQorICogIFNPVU5EX01BU0tfTElORQlMaW5lCQlMaW5lIGluCisgKiAgU09VTkRfTUFTS19MSU5FMQlMZWZ0IE1pYwlIYW5kc2V0CisgKiAgU09VTkRfTUFTS19QSE9ORUlOCUxlZnQgQXV4CVRlbGVwaG9uZSBtaWNyb3Bob25lCisgKiAgU09VTkRfTUFTS19NSUMJUmlnaHQgTWljCUJ1aWx0aW4gbWljcm9waG9uZQorICovCitzdGF0aWMgdW5zaWduZWQgaW50CituZXR3aW5kZXJfc2VsZWN0X2lucHV0KHdhdm5jX2luZm8gKmRldmMsIHVuc2lnbmVkIGludCByZWNtYXNrLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGV2X2wsIHVuc2lnbmVkIGNoYXIgKmRldl9yKQoreworCXVuc2lnbmVkIGludCByZWNkZXZfbCA9IEFEQ19NVVhfTk9ORSwgcmVjZGV2X3IgPSBBRENfTVVYX05PTkU7CisKKwlpZiAocmVjbWFzayAmIFNPVU5EX01BU0tfSU1JWCkgeworCQlyZWNtYXNrID0gU09VTkRfTUFTS19JTUlYOworCQlyZWNkZXZfbCA9IEFEQ19NVVhfTUlYRVI7CisJCXJlY2Rldl9yID0gQURDX01VWF9NSVhFUjsKKwl9IGVsc2UgaWYgKHJlY21hc2sgJiBTT1VORF9NQVNLX0xJTkUpIHsKKwkJcmVjbWFzayA9IFNPVU5EX01BU0tfTElORTsKKwkJcmVjZGV2X2wgPSBBRENfTVVYX0xJTkU7CisJCXJlY2Rldl9yID0gQURDX01VWF9MSU5FOworCX0gZWxzZSBpZiAocmVjbWFzayAmIFNPVU5EX01BU0tfTElORTEpIHsKKwkJcmVjbWFzayA9IFNPVU5EX01BU0tfTElORTE7CisJCXdhdmVhcnRpc3RfY21kMShkZXZjLCBXQUNNRF9TRVRfTU9OTyk7IC8qIGxlZnQgKi8KKwkJcmVjZGV2X2wgPSBBRENfTVVYX01JQzsKKwkJcmVjZGV2X3IgPSBBRENfTVVYX05PTkU7CisJfSBlbHNlIGlmIChyZWNtYXNrICYgU09VTkRfTUFTS19QSE9ORUlOKSB7CisJCXJlY21hc2sgPSBTT1VORF9NQVNLX1BIT05FSU47CisJCXdhdmVhcnRpc3RfY21kMShkZXZjLCBXQUNNRF9TRVRfTU9OTyk7IC8qIGxlZnQgKi8KKwkJcmVjZGV2X2wgPSBBRENfTVVYX0FVWDE7CisJCXJlY2Rldl9yID0gQURDX01VWF9OT05FOworCX0gZWxzZSBpZiAocmVjbWFzayAmIFNPVU5EX01BU0tfTUlDKSB7CisJCXJlY21hc2sgPSBTT1VORF9NQVNLX01JQzsKKwkJd2F2ZWFydGlzdF9jbWQxKGRldmMsIFdBQ01EX1NFVF9NT05PIHwgMHgxMDApOwkvKiByaWdodCAqLworCQlyZWNkZXZfbCA9IEFEQ19NVVhfTk9ORTsKKwkJcmVjZGV2X3IgPSBBRENfTVVYX01JQzsKKwl9CisKKwkqZGV2X2wgPSByZWNkZXZfbDsKKwkqZGV2X3IgPSByZWNkZXZfcjsKKworCXJldHVybiByZWNtYXNrOworfQorCitzdGF0aWMgaW50CituZXR3aW5kZXJfZGVjb2RlX21peGVyKHdhdm5jX2luZm8gKmRldmMsIGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbGV2X2wsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyIGxldl9yKQoreworCXN3aXRjaCAoZGV2KSB7CisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwljYXNlIFNPVU5EX01JWEVSX0xJTkU6CisJY2FzZSBTT1VORF9NSVhFUl9JR0FJTjoKKwkJZGV2Yy0+bGV2ZWxzW2Rldl0gPSBsZXZfbCB8IGxldl9yIDw8IDg7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9NSUM6CQkvKiByaWdodCBtaWMgb25seSAqLworCQlkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTUlDXSAmPSAweGZmOworCQlkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTUlDXSB8PSBsZXZfbCA8PCA4OworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfTElORTE6CQkvKiBsZWZ0IG1pYyBvbmx5ICAqLworCQlkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTUlDXSAmPSAweGZmMDA7CisJCWRldmMtPmxldmVsc1tTT1VORF9NSVhFUl9NSUNdIHw9IGxldl9sOworCQlkZXYgPSBTT1VORF9NSVhFUl9NSUM7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9QSE9ORUlOOgkvKiBsZWZ0IGF1eCBvbmx5ICAqLworCQlkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTElORTFdID0gbGV2X2w7CisJCWRldiA9IFNPVU5EX01JWEVSX0xJTkUxOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfSU1JWDoKKwljYXNlIFNPVU5EX01JWEVSX1BIT05FT1VUOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldiA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW50IG5ldHdpbmRlcl9nZXRfbWl4ZXIod2F2bmNfaW5mbyAqZGV2YywgaW50IGRldikKK3sKKwlpbnQgbGV2ZWxzOworCisJc3dpdGNoIChkZXYpIHsKKwljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCWNhc2UgU09VTkRfTUlYRVJfUENNOgorCWNhc2UgU09VTkRfTUlYRVJfTElORToKKwljYXNlIFNPVU5EX01JWEVSX0lHQUlOOgorCQlsZXZlbHMgPSBkZXZjLT5sZXZlbHNbZGV2XTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX01JQzoJCS8qIGJ1aWx0aW4gbWljOiByaWdodCBtaWMgb25seSAqLworCQlsZXZlbHMgPSBkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTUlDXSA+PiA4OworCQlsZXZlbHMgfD0gbGV2ZWxzIDw8IDg7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9MSU5FMToJCS8qIGhhbmRzZXQgbWljOiBsZWZ0IG1pYyBvbmx5ICovCisJCWxldmVscyA9IGRldmMtPmxldmVsc1tTT1VORF9NSVhFUl9NSUNdICYgMHhmZjsKKwkJbGV2ZWxzIHw9IGxldmVscyA8PCA4OworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfUEhPTkVJTjoJLyogcGhvbmUgbWljOiBsZWZ0IGF1eDEgb25seSAqLworCQlsZXZlbHMgPSBkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTElORTFdICYgMHhmZjsKKwkJbGV2ZWxzIHw9IGxldmVscyA8PCA4OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWxldmVscyA9IDA7CisJfQorCisJcmV0dXJuIGxldmVsczsKK30KKworLyoKKyAqIFdhdmVhcnRpc3Qgc3BlY2lmaWMgbWl4ZXIgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F2ZWFydGlzdF9taXhlcl9pbmZvIG5ldHdpbmRlcl9taXhlciA9IHsKKwkuc3VwcG9ydGVkX2RldnMJPSBTT1VORF9NQVNLX1ZPTFVNRSAgfCBTT1VORF9NQVNLX1NZTlRIICAgfAorCQkJU09VTkRfTUFTS19QQ00gICAgIHwgU09VTkRfTUFTS19TUEVBS0VSIHwKKwkJCVNPVU5EX01BU0tfTElORSAgICB8IFNPVU5EX01BU0tfTUlDICAgICB8CisJCQlTT1VORF9NQVNLX0lNSVggICAgfCBTT1VORF9NQVNLX0xJTkUxICAgfAorCQkJU09VTkRfTUFTS19QSE9ORUlOIHwgU09VTkRfTUFTS19QSE9ORU9VVHwKKwkJCVNPVU5EX01BU0tfSUdBSU4sCisKKwkucmVjb3JkaW5nX2RldnMJPSBTT1VORF9NQVNLX0xJTkUgICAgfCBTT1VORF9NQVNLX01JQyAgICAgfAorCQkJU09VTkRfTUFTS19JTUlYICAgIHwgU09VTkRfTUFTS19MSU5FMSAgIHwKKwkJCVNPVU5EX01BU0tfUEhPTkVJTiwKKworCS5zdGVyZW9fZGV2cwk9IFNPVU5EX01BU0tfVk9MVU1FICB8IFNPVU5EX01BU0tfU1lOVEggICB8CisJCQlTT1VORF9NQVNLX1BDTSAgICAgfCBTT1VORF9NQVNLX0xJTkUgICAgfAorCQkJU09VTkRfTUFTS19JTUlYICAgIHwgU09VTkRfTUFTS19JR0FJTiwKKworCS5zZWxlY3RfaW5wdXQJPSBuZXR3aW5kZXJfc2VsZWN0X2lucHV0LAorCS5kZWNvZGVfbWl4ZXIJPSBuZXR3aW5kZXJfZGVjb2RlX21peGVyLAorCS5nZXRfbWl4ZXIJPSBuZXR3aW5kZXJfZ2V0X21peGVyLAorfTsKKworc3RhdGljIHZvaWQKK3ZuY19jb25maWd1cmVfbWl4ZXIod2F2bmNfaW5mbyAqZGV2YywgdW5zaWduZWQgaW50IHJlY21hc2spCit7CisJaWYgKCFkZXZjLT5ub19hdXRvc2VsZWN0KSB7CisJCWlmIChkZXZjLT5oYW5kc2V0X2RldGVjdCkgeworCQkJcmVjbWFzayA9IFNPVU5EX01BU0tfTElORTE7CisJCQlkZXZjLT5zcGtyX211dGVfc3RhdGUgPSBkZXZjLT5saW5lX211dGVfc3RhdGUgPSAxOworCQl9IGVsc2UgaWYgKGRldmMtPnRlbGVwaG9uZV9kZXRlY3QpIHsKKwkJCXJlY21hc2sgPSBTT1VORF9NQVNLX1BIT05FSU47CisJCQlkZXZjLT5zcGtyX211dGVfc3RhdGUgPSBkZXZjLT5saW5lX211dGVfc3RhdGUgPSAxOworCQl9IGVsc2UgeworCQkJLyogdW5sZXNzIHNvbWVvbmUgaGFzIGFza2VkIGZvciBMSU5FLUlOLAorCQkJICogd2UgZGVmYXVsdCB0byBNSUMKKwkJCSAqLworCQkJaWYgKChkZXZjLT5yZWNtYXNrICYgU09VTkRfTUFTS19MSU5FKSA9PSAwKQorCQkJCWRldmMtPnJlY21hc2sgPSBTT1VORF9NQVNLX01JQzsKKwkJCWRldmMtPnNwa3JfbXV0ZV9zdGF0ZSA9IGRldmMtPmxpbmVfbXV0ZV9zdGF0ZSA9IDA7CisJCX0KKwkJdm5jX211dGVfc3BrcihkZXZjKTsKKwkJdm5jX211dGVfbG91dChkZXZjKTsKKworCQlpZiAocmVjbWFzayAhPSBkZXZjLT5yZWNtYXNrKQorCQkJd2F2ZWFydGlzdF9zZXRfcmVjbWFzayhkZXZjLCByZWNtYXNrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3ZuY19zbGlkZXIod2F2bmNfaW5mbyAqZGV2YykKK3sKKwlzaWduZWQgaW50IHNsaWRlcl92b2x1bWU7CisJdW5zaWduZWQgaW50IHRlbXAsIG9sZF9ocywgb2xkX3RkOworCisJLyoKKwkgKiByZWFkIHRoZSAiYnV0dG9ucyIgc3RhdGUuCisJICogIEJpdCA0ID0gMCBtZWFucyBoYW5kc2V0IHByZXNlbnQKKwkgKiAgQml0IDUgPSAxIG1lYW5zIHBob25lIG9mZmhvb2sKKwkgKi8KKwl0ZW1wID0gaW5iKDB4MjAxKTsKKworCW9sZF9ocyA9IGRldmMtPmhhbmRzZXRfZGV0ZWN0OworCW9sZF90ZCA9IGRldmMtPnRlbGVwaG9uZV9kZXRlY3Q7CisKKwlkZXZjLT5oYW5kc2V0X2RldGVjdCA9ICEodGVtcCAmIDB4MTApOworCWRldmMtPnRlbGVwaG9uZV9kZXRlY3QgPSAhISh0ZW1wICYgMHgyMCk7CisKKwlpZiAoIWRldmMtPm5vX2F1dG9zZWxlY3QgJiYKKwkgICAgKG9sZF9ocyAhPSBkZXZjLT5oYW5kc2V0X2RldGVjdCB8fAorCSAgICAgb2xkX3RkICE9IGRldmMtPnRlbGVwaG9uZV9kZXRlY3QpKQorCQl2bmNfY29uZmlndXJlX21peGVyKGRldmMsIGRldmMtPnJlY21hc2spOworCisJc2xpZGVyX3ZvbHVtZSA9IHZuY192b2x1bWVfc2xpZGVyKGRldmMpOworCisJLyoKKwkgKiBJZiB3ZSdyZSB1c2luZyBzb2Z0d2FyZSBjb250cm9sbGVkIHZvbHVtZSwgYW5kCisJICogdGhlIHNsaWRlciBtb3ZlcyBieSBtb3JlIHRoYW4gMjAlLCB0aGVuIHdlCisJICogc3dpdGNoIGJhY2sgdG8gc2xpZGVyIGNvbnRyb2xsZWQgdm9sdW1lLgorCSAqLworCWlmIChhYnMoZGV2Yy0+c2xpZGVyX3ZvbCAtIHNsaWRlcl92b2x1bWUpID4gMjApCisJCWRldmMtPnVzZV9zbGlkZXIgPSAxOworCisJLyoKKwkgKiB1c2Ugb25seSBsZWZ0IGNoYW5uZWwKKwkgKi8KKwl0ZW1wID0gbGV2ZWxzW1NPVU5EX01JWEVSX1ZPTFVNRV0gJiAweEZGOworCisJaWYgKHNsaWRlcl92b2x1bWUgIT0gdGVtcCAmJiBkZXZjLT51c2Vfc2xpZGVyKSB7CisJCWRldmMtPnNsaWRlcl92b2wgPSBzbGlkZXJfdm9sdW1lOworCisJCXdhdmVhcnRpc3Rfc2V0X21peGVyKGRldmMsIFNPVU5EX01JWEVSX1ZPTFVNRSwKKwkJCXNsaWRlcl92b2x1bWUgfCBzbGlkZXJfdm9sdW1lIDw8IDgpOworCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordm5jX3NsaWRlcl90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpbnQgbmV4dF90aW1lb3V0OworCisJaWYgKHZuY19zbGlkZXIoYWRldl9pbmZvICsgZGF0YSkpCisJCW5leHRfdGltZW91dCA9IDU7CS8vIG1peGVyIHJlcG9ydGVkIGNoYW5nZQorCWVsc2UKKwkJbmV4dF90aW1lb3V0ID0gVk5DX1RJTUVSX1BFUklPRDsKKworCW1vZF90aW1lcigmdm5jX3RpbWVyLCBqaWZmaWVzICsgbmV4dF90aW1lb3V0KTsKK30KKworc3RhdGljIGludAordm5jX3ByaXZhdGVfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgaW50IF9fdXNlciAqIGFyZykKK3sKKwl3YXZuY19pbmZvICpkZXZjID0gKHdhdm5jX2luZm8gKilhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJaW50IHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMToKKwl7CisJCXVfaW50IHByZXZfc3Brcl9tdXRlLCBwcmV2X2xpbmVfbXV0ZSwgcHJldl9hdXRvX3N0YXRlOworCQlpbnQgdmFsOworCisJCWlmIChnZXRfdXNlcih2YWwsIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBjaGVjayBpZiBwYXJhbWV0ZXIgaXMgbG9naWNhbCAqLworCQlpZiAodmFsICYgfihWTkNfTVVURV9JTlRFUk5BTF9TUEtSIHwKKwkJCSAgICBWTkNfTVVURV9MSU5FX09VVCB8CisJCQkgICAgVk5DX0RJU0FCTEVfQVVUT1NXSVRDSCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcmV2X2F1dG9fc3RhdGUgPSBkZXZjLT5ub19hdXRvc2VsZWN0OworCQlwcmV2X3Nwa3JfbXV0ZSAgPSBkZXZjLT5zcGtyX211dGVfc3RhdGU7CisJCXByZXZfbGluZV9tdXRlICA9IGRldmMtPmxpbmVfbXV0ZV9zdGF0ZTsKKworCQlkZXZjLT5ub19hdXRvc2VsZWN0ICAgPSAodmFsICYgVk5DX0RJU0FCTEVfQVVUT1NXSVRDSCkgPyAxIDogMDsKKwkJZGV2Yy0+c3Brcl9tdXRlX3N0YXRlID0gKHZhbCAmIFZOQ19NVVRFX0lOVEVSTkFMX1NQS1IpID8gMSA6IDA7CisJCWRldmMtPmxpbmVfbXV0ZV9zdGF0ZSA9ICh2YWwgJiBWTkNfTVVURV9MSU5FX09VVCkgPyAxIDogMDsKKworCQlpZiAocHJldl9zcGtyX211dGUgIT0gZGV2Yy0+c3Brcl9tdXRlX3N0YXRlKQorCQkJdm5jX211dGVfc3BrcihkZXZjKTsKKworCQlpZiAocHJldl9saW5lX211dGUgIT0gZGV2Yy0+bGluZV9tdXRlX3N0YXRlKQorCQkJdm5jX211dGVfbG91dChkZXZjKTsKKworCQlpZiAocHJldl9hdXRvX3N0YXRlICE9IGRldmMtPm5vX2F1dG9zZWxlY3QpCisJCQl2bmNfY29uZmlndXJlX21peGVyKGRldmMsIGRldmMtPnJlY21hc2spOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTI6CisJCWlmIChnZXRfdXNlcih2YWwsIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzd2l0Y2ggKHZhbCkgeworI2RlZmluZSBWTkNfU09VTkRfUEFVU0UgICAgICAgICAweDUzICAgIC8vdG8gcGF1c2UgdGhlIERTUAorI2RlZmluZSBWTkNfU09VTkRfUkVTVU1FICAgICAgICAweDU3ICAgIC8vdG8gdW5wYXVzZSB0aGUgRFNQCisJCWNhc2UgVk5DX1NPVU5EX1BBVVNFOgorCQkJd2F2ZWFydGlzdF9jbWQxKGRldmMsIDB4MTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBWTkNfU09VTkRfUkVTVU1FOgorCQkJd2F2ZWFydGlzdF9jbWQxKGRldmMsIDB4MTgpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCisJLyogcHJpdmF0ZSBpb2N0bCB0byBhbGxvdyBidWxrIGFjY2VzcyB0byB3YXZlYXJ0aXN0ICovCisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMzoKKwl7CisJCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJCWludAkJbWl4ZXJfcmVnWzE1XSwgaSwgdmFsOworCisJCWlmIChnZXRfdXNlcih2YWwsIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKG1peGVyX3JlZywgKHZvaWQgKil2YWwsIHNpemVvZihtaXhlcl9yZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXN3aXRjaCAobWl4ZXJfcmVnWzE0XSkgeworCQljYXNlIE1JWEVSX1BSSVZBVEUzX1JFU0VUOgorCQkJd2F2ZWFydGlzdF9taXhlcl9yZXNldChkZXZjKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUlYRVJfUFJJVkFURTNfV1JJVEU6CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBtaXhlcl9yZWdbMF0sIG1peGVyX3JlZ1s0XSk7CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBtaXhlcl9yZWdbMV0sIG1peGVyX3JlZ1s1XSk7CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBtaXhlcl9yZWdbMl0sIG1peGVyX3JlZ1s2XSk7CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBtaXhlcl9yZWdbM10sIG1peGVyX3JlZ1s3XSk7CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBtaXhlcl9yZWdbOF0sIG1peGVyX3JlZ1s5XSk7CisKKwkJCXdhdmVhcnRpc3RfY21kMyhkZXZjLCBXQUNNRF9TRVRfTEVWRUwsIG1peGVyX3JlZ1sxMF0sIG1peGVyX3JlZ1sxMV0pOworCQkJd2F2ZWFydGlzdF9jbWQzKGRldmMsIFdBQ01EX1NFVF9MRVZFTCwgbWl4ZXJfcmVnWzEyXSwgbWl4ZXJfcmVnWzEzXSk7CisJCQlicmVhazsKKworCQljYXNlIE1JWEVSX1BSSVZBVEUzX1JFQUQ6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisKKwkJCWZvciAoaSA9IDB4MzA7IGkgPCAxNCA8PCA4OyBpICs9IDEgPDwgOCkKKwkJCQl3YXZlYXJ0aXN0X2NtZChkZXZjLCAxLCAmaSwgMSwgbWl4ZXJfcmVnICsgKGkgPj4gOCkpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKXZhbCwgbWl4ZXJfcmVnLCBzaXplb2YobWl4ZXJfcmVnKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogcmVhZCBiYWNrIHRoZSBzdGF0ZSBmcm9tIFBSSVZBVEUxICovCisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFNDoKKwkJdmFsID0gKGRldmMtPnNwa3JfbXV0ZV9zdGF0ZSAgPyBWTkNfTVVURV9JTlRFUk5BTF9TUEtSIDogMCkgfAorCQkgICAgICAoZGV2Yy0+bGluZV9tdXRlX3N0YXRlICA/IFZOQ19NVVRFX0xJTkVfT1VUICAgICAgOiAwKSB8CisJCSAgICAgIChkZXZjLT5oYW5kc2V0X2RldGVjdCAgID8gVk5DX0hBTkRTRVRfREVURUNUICAgICA6IDApIHwKKwkJICAgICAgKGRldmMtPnRlbGVwaG9uZV9kZXRlY3QgPyBWTkNfUEhPTkVfREVURUNUICAgICAgIDogMCkgfAorCQkgICAgICAoZGV2Yy0+bm9fYXV0b3NlbGVjdCAgICA/IFZOQ19ESVNBQkxFX0FVVE9TV0lUQ0ggOiAwKTsKKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBhcmcpID8gLUVGQVVMVCA6IDA7CisJfQorCisJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpIHsKKwkJLyoKKwkJICogc3BlY2lhbCBjYXNlIGZvciBtYXN0ZXIgdm9sdW1lOiBpZiB3ZQorCQkgKiByZWNlaXZlZCB0aGlzIGNhbGwgLSBzd2l0Y2ggZnJvbSBodworCQkgKiB2b2x1bWUgY29udHJvbCB0byBhIHNvZnR3YXJlIHZvbHVtZQorCQkgKiBjb250cm9sLCB0aWxsIHRoZSBodyB2b2x1bWUgaXMgbW9kaWZpZWQKKwkJICogdG8gc2lnbmFsIHRoYXQgdXNlciB3YW50cyB0byBiZSBiYWNrIGluCisJCSAqIGhhcmR3YXJlLi4uCisJCSAqLworCQlpZiAoKGNtZCAmIDB4ZmYpID09IFNPVU5EX01JWEVSX1ZPTFVNRSkKKwkJCWRldmMtPnVzZV9zbGlkZXIgPSAwOworCisJCS8qIHNwZWFrZXIgb3V0cHV0ICAgICAgICAgICAgKi8KKwkJaWYgKChjbWQgJiAweGZmKSA9PSBTT1VORF9NSVhFUl9TUEVBS0VSKSB7CisJCQl1bnNpZ25lZCBpbnQgdmFsLCBsLCByOworCisJCQlpZiAoZ2V0X3VzZXIodmFsLCBhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlsID0gdmFsICYgMHg3ZjsKKwkJCXIgPSAodmFsICYgMHg3ZjAwKSA+PiA4OworCQkJdmFsID0gKGwgKyByKSAvIDI7CisJCQlkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfU1BFQUtFUl0gPSB2YWwgfCAodmFsIDw8IDgpOworCQkJZGV2Yy0+c3Brcl9tdXRlX3N0YXRlID0gKHZhbCA8PSA1MCk7CisJCQl2bmNfbXV0ZV9zcGtyKGRldmMpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworCitzdGF0aWMgaW50IGF0dGFjaGVkOworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8gPSAwOworc3RhdGljIGludCBfX2luaXRkYXRhIGlycSA9IDA7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hID0gMDsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEyID0gMDsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3dhdmVhcnRpc3Qodm9pZCkKK3sKKwljb25zdCBzdHJ1Y3Qgd2F2ZWFydGlzdF9taXhlcl9pbmZvICptaXg7CisKKwlpZiAoIWlvICYmIG1hY2hpbmVfaXNfbmV0d2luZGVyKCkpIHsKKwkJLyoKKwkJICogVGhlIE5ldFdpbmRlciBXYXZlQXJ0aXN0IGlzIGF0IGEgZml4ZWQgYWRkcmVzcy4KKwkJICogSWYgdGhlIHVzZXIgZG9lcyBub3Qgc3VwcGx5IGFuIGFkZHJlc3MsIHVzZSB0aGUKKwkJICogd2VsbC1rbm93biBwYXJhbWV0ZXJzLgorCQkgKi8KKwkJaW8gICA9IDB4MjUwOworCQlpcnEgID0gMTI7CisJCWRtYSAgPSAzOworCQlkbWEyID0gNzsKKwl9CisKKwltaXggPSAmd2F2ZWFydGlzdF9taXhlcjsKKyNpZmRlZiBDT05GSUdfQVJDSF9ORVRXSU5ERVIKKwlpZiAobWFjaGluZV9pc19uZXR3aW5kZXIoKSkKKwkJbWl4ID0gJm5ldHdpbmRlcl9taXhlcjsKKyNlbmRpZgorCisJY2ZnLmlvX2Jhc2UgPSBpbzsKKwljZmcuaXJxID0gaXJxOworCWNmZy5kbWEgPSBkbWE7CisJY2ZnLmRtYTIgPSBkbWEyOworCisJaWYgKCFwcm9iZV93YXZlYXJ0aXN0KCZjZmcpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWF0dGFjaF93YXZlYXJ0aXN0KCZjZmcsIG1peCk7CisJYXR0YWNoZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3dhdmVhcnRpc3Qodm9pZCkKK3sKKwlpZiAoYXR0YWNoZWQpCisJCXVubG9hZF93YXZlYXJ0aXN0KCZjZmcpOworfQorCittb2R1bGVfaW5pdChpbml0X3dhdmVhcnRpc3QpOworbW9kdWxlX2V4aXQoY2xlYW51cF93YXZlYXJ0aXN0KTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3dhdmVhcnRpc3QoY2hhciAqc3RyKQoreworCS8qIGlvLCBpcnEsIGRtYSwgZG1hMiAqLworCWludCBpbnRzWzVdOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisJaW8JPSBpbnRzWzFdOworCWlycQk9IGludHNbMl07CisJZG1hCT0gaW50c1szXTsKKwlkbWEyCT0gaW50c1s0XTsKKworCXJldHVybiAxOworfQorX19zZXR1cCgid2F2ZWFydGlzdD0iLCBzZXR1cF93YXZlYXJ0aXN0KTsKKyNlbmRpZgorCitNT0RVTEVfREVTQ1JJUFRJT04oIlJvY2t3ZWxsIFdhdmVBcnRpc3QgUldBLTAxMCBzb3VuZCBkcml2ZXIiKTsKK01PRFVMRV9QQVJNKGlvLCAiaSIpOwkJLyogSU8gYmFzZSAqLworTU9EVUxFX1BBUk0oaXJxLCAiaSIpOwkJLyogSVJRICovCitNT0RVTEVfUEFSTShkbWEsICJpIik7CQkvKiBETUEgKi8KK01PRFVMRV9QQVJNKGRtYTIsICJpIik7CQkvKiBETUEyICovCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvd2F2ZWFydGlzdC5oIGIvc291bmQvb3NzL3dhdmVhcnRpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDMzZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3dhdmVhcnRpc3QuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogbGludXgvZHJpdmVycy9zb3VuZC93YXZlYXJ0aXN0LmgKKyAqCisgKiBkZWYgZmlsZSBmb3IgUm9ja3dlbGwgUldBMDEwIGNoaXAgc2V0LCBhcyBpbnN0YWxsZWQgaW4gUmViZWwuY29tIE5ldFdpbmRlcgorICovCisKKy8vcmVnaXN0ZXJzCisjZGVmaW5lIENNRFIJMAorI2RlZmluZSBEQVRSCTIKKyNkZWZpbmUgQ1RMUgk0CisjZGVmaW5lCVNUQVRSCTUKKyNkZWZpbmUJSVJRU1RBVAkxMgorCisvL2JpdCBkZWZzCisvL3JlZyBTVEFUUgorI2RlZmluZQlDTURfV0UJMHg4MAorI2RlZmluZQlDTURfUkYJMHg0MAorI2RlZmluZQlEQVRfV0UJMHgyMAorI2RlZmluZQlEQVRfUkYJMHgxMAorCisjZGVmaW5lCUlSUV9SRVEJMHgwOAorI2RlZmluZQlETUExCTB4MDQKKyNkZWZpbmUJRE1BMAkweDAyCisKKy8vYml0IGRlZnMKKy8vcmVnIENUTFIKKyNkZWZpbmUJQ01EX1dFSUUJMHg4MAorI2RlZmluZQlDTURfUkZJRQkweDQwCisjZGVmaW5lCURBVF9XRUlFCTB4MjAKKyNkZWZpbmUJREFUX1JGSUUJMHgxMAorCisjZGVmaW5lCVJFU0VUCTB4MDgKKyNkZWZpbmUJRE1BMV9JRQkweDA0CisjZGVmaW5lCURNQTBfSUUJMHgwMgorI2RlZmluZQlJUlFfQUNLCTB4MDEKKworLy9jb21tYW5kcworCisjZGVmaW5lCVdBQ01EX1NZU1RFTUlECQkweDAwCisjZGVmaW5lIFdBQ01EX0dFVFJFVgkJMHgwMAorI2RlZmluZQlXQUNNRF9JTlBVVEZPUk1BVAkweDEwCS8vMC04UywgMS0xNlMsIDItOFUKKyNkZWZpbmUJV0FDTURfSU5QVVRDSEFOTkVMUwkweDExCS8vMS1Nb25vLCAyLVN0ZXJlbworI2RlZmluZQlXQUNNRF9JTlBVVFNQRUVECTB4MTIJLy9zYW1wbGluZyByYXRlCisjZGVmaW5lCVdBQ01EX0lOUFVURE1BCQkweDEzCS8vMC04Yml0LCAxLTE2Yml0LCAyLVBJTworI2RlZmluZQlXQUNNRF9JTlBVVFNJWkUJCTB4MTQJLy9zYW1wbGVzIHRvIGludGVycnVwdAorI2RlZmluZQlXQUNNRF9JTlBVVFNUQVJUCTB4MTUJLy9zdGFydCBBREMKKyNkZWZpbmUJV0FDTURfSU5QVVRQQVVTRQkweDE2CS8vcGF1c2UgQURDCisjZGVmaW5lCVdBQ01EX0lOUFVUU1RPUAkJMHgxNwkvL3N0b3AgQURDCisjZGVmaW5lCVdBQ01EX0lOUFVUUkVTVU1FCTB4MTgJLy9yZXN1bWUgQURDCisjZGVmaW5lCVdBQ01EX0lOUFVUUElPCQkweDE5CS8vUElPIEFEQworCisjZGVmaW5lCVdBQ01EX09VVFBVVEZPUk1BVAkweDIwCS8vMC04UywgMS0xNlMsIDItOFUKKyNkZWZpbmUJV0FDTURfT1VUUFVUQ0hBTk5FTFMJMHgyMQkvLzEtTW9ubywgMi1TdGVyZW8KKyNkZWZpbmUJV0FDTURfT1VUUFVUU1BFRUQJMHgyMgkvL3NhbXBsaW5nIHJhdGUKKyNkZWZpbmUJV0FDTURfT1VUUFVURE1BCQkweDIzCS8vMC04Yml0LCAxLTE2Yml0LCAyLVBJTworI2RlZmluZQlXQUNNRF9PVVRQVVRTSVpFCTB4MjQJLy9zYW1wbGVzIHRvIGludGVycnVwdAorI2RlZmluZQlXQUNNRF9PVVRQVVRTVEFSVAkweDI1CS8vc3RhcnQgQURDCisjZGVmaW5lCVdBQ01EX09VVFBVVFBBVVNFCTB4MjYJLy9wYXVzZSBBREMKKyNkZWZpbmUJV0FDTURfT1VUUFVUU1RPUAkweDI3CS8vc3RvcCBBREMKKyNkZWZpbmUJV0FDTURfT1VUUFVUUkVTVU1FCTB4MjgJLy9yZXN1bWUgQURDCisjZGVmaW5lCVdBQ01EX09VVFBVVFBJTwkJMHgyOQkvL1BJTyBBREMKKworI2RlZmluZQlXQUNNRF9HRVRfTEVWRUwJCTB4MzAKKyNkZWZpbmUJV0FDTURfU0VUX0xFVkVMCQkweDMxCisjZGVmaW5lCVdBQ01EX1NFVF9NSVhFUgkJMHgzMgorI2RlZmluZQlXQUNNRF9SU1RfTUlYRVIJCTB4MzMKKyNkZWZpbmUJV0FDTURfU0VUX01PTk8JCTB4MzQKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBsZWZ0L3JpZ2h0IHJlY29yZGluZyBpbnB1dCBtdXgKKyAqLworI2RlZmluZSBBRENfTVVYX05PTkUJMAorI2RlZmluZSBBRENfTVVYX01JWEVSCTEKKyNkZWZpbmUgQURDX01VWF9MSU5FCTIKKyNkZWZpbmUgQURDX01VWF9BVVgyCTMKKyNkZWZpbmUgQURDX01VWF9BVVgxCTQKKyNkZWZpbmUgQURDX01VWF9NSUMJNQorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIG1peGVyIGdhaW4gc2V0dGluZ3MKKyAqLworI2RlZmluZSBNSVhfR0FJTl9MSU5FCTAJLyogbGluZSBpbgkgKi8KKyNkZWZpbmUgTUlYX0dBSU5fQVVYMQkxCS8qIGF1eDEJCSAqLworI2RlZmluZSBNSVhfR0FJTl9BVVgyCTIJLyogYXV4MgkJICovCisjZGVmaW5lIE1JWF9HQUlOX1hNSUMJMwkvKiBjcm9zc292ZXIgbWljICovCisjZGVmaW5lIE1JWF9HQUlOX01JQwk0CS8qIG5vcm1hbCBtaWMJICovCisjZGVmaW5lIE1JWF9HQUlOX1BSRU1JQwk1CS8qIHByZWFtcCBtaWMJICovCisjZGVmaW5lIE1JWF9HQUlOX09VVAk2CS8qIG91dHB1dAkgKi8KKyNkZWZpbmUgTUlYX0dBSU5fTU9OTwk3CS8qIG1vbm8gaW4JICovCisKK2ludCB3YV9zZW5kY21kKHVuc2lnbmVkIGludCBjbWQpOworaW50IHdhX3dyaXRlY21kKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGludCBhcmcpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3dhdmZyb250LmMgYi9zb3VuZC9vc3Mvd2F2ZnJvbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2UxMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3dhdmZyb250LmMKQEAgLTAsMCArMSwzNTM4IEBACisvKiAgLSotIGxpbnV4LWMgLSotCisgKgorICogc291bmQvd2F2ZnJvbnQuYworICoKKyAqIEEgTGludXggZHJpdmVyIGZvciBUdXJ0bGUgQmVhY2ggV2F2ZUZyb250IFNlcmllcyAoTWF1aSwgVHJvcGV6LCBUcm9wZXogUGx1cykKKyAqCisgKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgb25ib2FyZCB3YXZldGFibGUgc3ludGhlc2l6ZXIgKGFuIElDUzIxMTUpLAorICogaW5jbHVkaW5nIHBhdGNoLCBzYW1wbGUgYW5kIHByb2dyYW0gbG9hZGluZyBhbmQgdW5sb2FkaW5nLCBjb252ZXJzaW9uCisgKiBvZiBHVVMgcGF0Y2hlcyBkdXJpbmcgbG9hZGluZywgYW5kIGZ1bGwgdXNlci1sZXZlbCBhY2Nlc3MgdG8gYWxsCisgKiBXYXZlRnJvbnQgY29tbWFuZHMuIEl0IHRyaWVzIHRvIHByb3ZpZGUgc2VtaS1pbnRlbGxpZ2VudCBwYXRjaCBhbmQKKyAqIHNhbXBsZSBtYW5hZ2VtZW50IGFzIHdlbGwuCisgKgorICogSXQgYWxzbyBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgSUNTIGVtdWxhdGlvbiBvZiBhbiBNUFUtNDAxLiAgRnVsbAorICogc3VwcG9ydCBmb3IgdGhlIElDUyBlbXVsYXRpb24ncyAidmlydHVhbCBNSURJIG1vZGUiIGlzIHByb3ZpZGVkIGluCisgKiB3Zl9taWRpLmMuCisgKgorICogU3VwcG9ydCBpcyBhbHNvIHByb3ZpZGVkIGZvciB0aGUgVHJvcGV6IFBsdXMnIG9uYm9hcmQgRlggcHJvY2Vzc29yLAorICogYSBZYW1haGEgWVNTMjI1LiBDdXJyZW50bHksIGNvZGUgZXhpc3RzIHRvIGNvbmZpZ3VyZSB0aGUgWVNTMjI1LAorICogYW5kIHRoZXJlIGlzIGFuIGludGVyZmFjZSBhbGxvd2luZyB0d2Vha2luZyBvZiBhbnkgb2YgaXRzIG1lbW9yeQorICogYWRkcmVzc2VzLiBIb3dldmVyLCBJIGhhdmUgYmVlbiB1bmFibGUgdG8gZGVjaXBoZXIgdGhlIGxvZ2ljYWwKKyAqIHBvc2l0aW9uaW5nIG9mIHRoZSBjb25maWd1cmF0aW9uIGluZm8gZm9yIHZhcmlvdXMgZWZmZWN0cywgc28gZm9yCisgKiBub3csIHlvdSBqdXN0IGdldCB0aGUgWVNTMjI1IGluIHRoZSBzYW1lIHN0YXRlIGFzIFR1cnRsZSBCZWFjaCdzCisgKiAiU0VUVVBTTkQuRVhFIiB1dGlsaXR5IGxlYXZlcyBpdC4KKyAqCisgKiBUaGUgYm9hcmRzJyBEQUMvQURDIChhIENyeXN0YWwgQ1M0MjMyKSBpcyBzdXBwb3J0ZWQgYnkgY3M0MjMyLltjb10sCisgKiBUaGlzIGNoaXAgYWxzbyBjb250cm9scyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY2FyZDogdGhlIHdhdmVmcm9udAorICogc3ludGggaXMgbG9naWNhbCB1bml0IDQuCisgKgorICoKKyAqIFN1cHBvcnRlZCBkZXZpY2VzOgorICoKKyAqICAgL2Rldi9kc3AgICAgICAgICAgICAgICAgICAgICAgLSB1c2luZyBjczQyMzIrYWQxODQ4IG1vZHVsZXMsIE9TUyBjb21wYXRpYmxlCisgKiAgIC9kZXYvbWlkaU5OIGFuZCAvZGV2L21pZGlOTisxIC0gdXNpbmcgd2ZfbWlkaSBjb2RlLCBPU1MgY29tcGF0aWJsZQorICogICAvZGV2L3N5bnRoMDAgICAgICAgICAgICAgICAgICAtIHJhdyBzeW50aCBpbnRlcmZhY2UKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IFBhdWwgQmFydG9uLURhdmlzIDE5OTgKKyAqCisgKiBTb21lIHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgdGFrZW4gZnJvbSB3b3JrIHRoYXQgaXMKKyAqIGNvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTYKKyAqCisgKiBBbHRob3VnaCB0aGUgcmVsZXZhbnQgY29kZSBoZXJlIGlzIGFsbCBuZXcsIHRoZSBoYW5kbGluZyBvZgorICogc2FtcGxlL2FsaWFzL211bHRpLSBzYW1wbGVzIGlzIGVudGlyZWx5IGJhc2VkIG9uIGEgZHJpdmVyIGJ5IE1hdHQKKyAqIE1hcnRpbiBhbmQgUnV0Z2VyIE5pamx1bnNpbmcgd2hpY2ggZGVtb25zdHJhdGVkIGhvdyB0byBnZXQgdGhpbmdzCisgKiB0byB3b3JrIGNvcnJlY3RseS4gVGhlIEdVUyBwYXRjaCBsb2FkaW5nIGNvZGUgaGFzIGJlZW4gYWxtb3N0CisgKiB1bmFsdGVyZWQgYnkgbWUsIGV4Y2VwdCB0byBmaXQgZm9ybWF0dGluZyBhbmQgZnVuY3Rpb24gbmFtZXMgaW4gdGhlCisgKiByZXN0IG9mIHRoZSBmaWxlLiBNYW55IHRoYW5rcyB0byB0aGVtLgorICoKKyAqIEFwcHJlY2lhdGlvbiBhbmQgdGhhbmtzIHRvIEhhbm51IFNhdm9sYWluZW4gZm9yIGhpcyBlYXJseSB3b3JrIG9uIHRoZSBNYXVpCisgKiBkcml2ZXIsIGFuZCBhbnN3ZXJpbmcgYSBmZXcgcXVlc3Rpb25zIHdoaWxlIHRoaXMgb25lIHdhcyBkZXZlbG9wZWQuCisgKgorICogQWJzb2x1dGVseSBOTyB0aGFua3MgdG8gVHVydGxlIEJlYWNoL1ZveWV0cmEgYW5kIFlhbWFoYSBmb3IgdGhlaXIKKyAqIGNvbXBsZXRlIGxhY2sgb2YgaGVscCBpbiBkZXZlbG9waW5nIHRoaXMgZHJpdmVyLCBhbmQgaW4gcGFydGljdWxhcgorICogZm9yIHRoZWlyIHV0dGVyIHNpbGVuY2UgaW4gcmVzcG9uc2UgdG8gcXVlc3Rpb25zIGFib3V0IHVuZG9jdW1lbnRlZAorICogYXNwZWN0cyBvZiBjb25maWd1cmluZyBhIFdhdmVGcm9udCBzb3VuZGNhcmQsIHBhcnRpY3VsYXJseSB0aGUKKyAqIGVmZmVjdHMgcHJvY2Vzc29yLgorICoKKyAqICRJZDogd2F2ZnJvbnQuYyx2IDAuNyAxOTk4LzA5LzA5IDE1OjQ3OjM2IHBiZCBFeHAgJAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICogQ2hhbmdlczoKKyAqIDExLTEwLTIwMDAJQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Ymt6QGxpbnV4LWlkZS5vcmc+CisgKgkJQWRkZWQgc29tZSBfX2luaXQgYW5kIF9faW5pdGRhdGEgdG8gZW50cmllcyBpbiB5c3MyMjUuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPiAgICAKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8bGludXgvd2F2ZWZyb250Lmg+CisKKyNkZWZpbmUgX01JRElfU1lOVEhfQ18KKyNkZWZpbmUgTUlESV9TWU5USF9OQU1FCSJXYXZlRnJvbnQgTUlESSIKKyNkZWZpbmUgTUlESV9TWU5USF9DQVBTCVNZTlRIX0NBUF9JTlBVVAorI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworLyogQ29tcGlsZS10aW1lIGNvbnRyb2wgb2YgdGhlIGV4dGVudCB0byB3aGljaCBPU1MgaXMgc3VwcG9ydGVkLgorCisgICBJIGNvbnNpZGVyIC9kZXYvc2VxdWVuY2VyIHRvIGJlIGFuIGFuYWNocm9uaXNtLCBidXQgZ2l2ZW4gaXRzCisgICB3aWRlc3ByZWFkIHVzYWdlIGJ5IHZhcmlvdXMgTGludXggTUlESSBzb2Z0d2FyZSwgaXQgc2VlbXMgd29ydGgKKyAgIG9mZmVyaW5nIHN1cHBvcnQgdG8gaXQgaWYgaXQncyBub3QgdG9vIHBhaW5mdWwuIEluc3RlYWQgb2YgdXNpbmcKKyAgIC9kZXYvc2VxdWVuY2VyLCBJIHJlY29tbWVuZDoKKworICAgICBmb3Igc3ludGggcHJvZ3JhbW1pbmcgYW5kIHBhdGNoIGxvYWRpbmc6IC9kZXYvc3ludGhOTgorICAgICBmb3Iga2VybmVsLXN5bmNocm9uaXplZCBNSURJIHNlcXVlbmNpbmc6IHRoZSBBTFNBIHNlcXVlbmNlcgorICAgICBmb3IgZGlyZWN0IE1JREkgY29udHJvbDogL2Rldi9taWRpTk4KKworICAgSSBoYXZlIG5ldmVyIHRyaWVkIHN0YXRpYyBjb21waWxhdGlvbiBpbnRvIHRoZSBrZXJuZWwuIFRoZSAjaWYncworICAgZm9yIHRoaXMgYXJlIHJlYWxseSBqdXN0IG5vdGVzIHRvIG15c2VsZiBhYm91dCB3aGF0IHRoZSBjb2RlIGlzCisgICBmb3IuCisqLworCisjZGVmaW5lIE9TU19TVVBQT1JUX1NFUSAgICAgICAgICAgIDB4MSAgLyogdXNlIG9mIC9kZXYvc2VxdWVuY2VyICovCisjZGVmaW5lIE9TU19TVVBQT1JUX1NUQVRJQ19JTlNUQUxMIDB4MiAgLyogc3RhdGljIGNvbXBpbGF0aW9uIGludG8ga2VybmVsICovCisKKyNkZWZpbmUgT1NTX1NVUFBPUlRfTEVWRUwgICAgICAgICAgMHgxICAvKiBqdXN0IC9kZXYvc2VxdWVuY2VyIGZvciBub3cgKi8KKworI2lmICAgIE9TU19TVVBQT1JUX0xFVkVMICYgT1NTX1NVUFBPUlRfU0VRCitzdGF0aWMgaW50ICgqbWlkaV9sb2FkX3BhdGNoKSAoaW50IGRldm5vLCBpbnQgZm9ybWF0LCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwKKwkJCSAgICAgICBpbnQgb2ZmcywgaW50IGNvdW50LCBpbnQgcG1ncl9mbGFnKSA9IE5VTEw7CisjZW5kaWYgLyogT1NTX1NVUFBPUlRfU0VRICovCisKKy8qIGlmIFdGX0RFQlVHIG5vdCBkZWZpbmVkLCBubyBydW4tdGltZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2lsbAorICAgYmUgYXZhaWxhYmxlIHZpYSB0aGUgZGVidWcgZmxhZyBzZXR0aW5nLiBHaXZlbiB0aGUgY3VycmVudAorICAgYmV0YSBzdGF0ZSBvZiB0aGUgZHJpdmVyLCB0aGlzIHdpbGwgcmVtYWluIHNldCB1bnRpbCBhIGZ1dHVyZSAKKyAgIHZlcnNpb24uCisqLworCisjZGVmaW5lIFdGX0RFQlVHIDEKKworI2lmZGVmIFdGX0RFQlVHCisKKy8qIFRoYW5rIGdvb2RuZXNzIGZvciBnY2MncyBwcmVwcm9jZXNzb3IgLi4uICovCisKKyNkZWZpbmUgRFBSSU5UKGNvbmQsIGZvcm1hdCwgYXJncy4uLikgXAorICAgICAgIGlmICgoZGV2LmRlYnVnICYgKGNvbmQpKSA9PSAoY29uZCkpIHsgXAorCSAgICAgcHJpbnRrIChLRVJOX0RFQlVHIExPR05BTUUgZm9ybWF0LCAjIyBhcmdzKTsgXAorICAgICAgIH0KKyNlbHNlCisjZGVmaW5lIERQUklOVChjb25kLCBmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBMT0dOQU1FICJXYXZlRnJvbnQ6ICIKKworLyogYml0bWFza3MgZm9yIFdhdmVGcm9udCBzdGF0dXMgcG9ydCB2YWx1ZSAqLworCisjZGVmaW5lIFNUQVRfUklOVFJfRU5BQkxFRAkweDAxCisjZGVmaW5lIFNUQVRfQ0FOX1JFQUQJCTB4MDIKKyNkZWZpbmUgU1RBVF9JTlRSX1JFQUQJCTB4MDQKKyNkZWZpbmUgU1RBVF9XSU5UUl9FTkFCTEVECTB4MTAKKyNkZWZpbmUgU1RBVF9DQU5fV1JJVEUJCTB4MjAKKyNkZWZpbmUgU1RBVF9JTlRSX1dSSVRFCQkweDQwCisKKy8qKiogTW9kdWxlLWFjY2Vzc2libGUgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCB3Zl9yYXc7ICAgICAvKiB3ZSBub3JtYWxseSBjaGVjayBmb3IgInJhdyBzdGF0ZSIgdG8gZmlybXdhcmUKKwkJICAgbG9hZGluZy4gaWYgc2V0LCB0aGVuIGR1cmluZyBkcml2ZXIgbG9hZGluZywgdGhlCisJCSAgIHN0YXRlIG9mIHRoZSBib2FyZCBpcyBpZ25vcmVkLCBhbmQgd2UgcmVzZXQgdGhlCisJCSAgIGJvYXJkIGFuZCBsb2FkIHRoZSBmaXJtd2FyZSBhbnl3YXkuCisJCSovCisJCSAgIAorc3RhdGljIGludCBmeF9yYXcgPSAxOyAvKiBpZiB0aGlzIGlzIHplcm8sIHdlJ2xsIGxlYXZlIHRoZSBGWCBwcm9jZXNzb3IgaW4KKwkJICAgICAgICAgIHdoYXRldmVyIHN0YXRlIGl0IGlzIHdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQuCisJCSAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byBkb3dubG9hZCB0aGUgbWljcm9wcm9ncmFtIGFuZAorCQkgICAgICAgICAgYXNzb2NpYXRlZCBjb2VmZmljaWVudHMgdG8gc2V0IGl0IHVwIGZvciAiZGVmYXVsdCIKKwkJICAgICAgICAgIG9wZXJhdGlvbiwgd2hhdGV2ZXIgdGhhdCBtZWFucy4KKwkJICAgICAgICovCisKK3N0YXRpYyBpbnQgZGVidWdfZGVmYXVsdDsgIC8qIHlvdSBjYW4gc2V0IHRoaXMgdG8gY29udHJvbCBkZWJ1Z2dpbmcKKwkJCSAgICAgIGR1cmluZyBkcml2ZXIgbG9hZGluZy4gaXQgdGFrZXMgYW55IGNvbWJpbmF0aW9uCisJCQkgICAgICBvZiB0aGUgV0ZfREVCVUdfKiBmbGFncyBkZWZpbmVkIGluCisJCQkgICAgICB3YXZlZnJvbnQuaAorCQkJICAgKi8KKworLyogWFhYIHRoaXMgbmVlZHMgdG8gYmUgbWFkZSBmaXJtd2FyZSBhbmQgaGFyZHdhcmUgdmVyc2lvbiBkZXBlbmRlbnQgKi8KKworc3RhdGljIGNoYXIgKm9zcGF0aCA9ICIvZXRjL3NvdW5kL3dhdmVmcm9udC5vcyI7IC8qIHdoZXJlIHRvIGZpbmQgYSBwcm9jZXNzZWQKKwkJCQkJICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgV2F2ZUZyb250IE9TCisJCQkJCSAgICAgICAgICAqLworCitzdGF0aWMgaW50IHdhaXRfcG9sbHMgPSAyMDAwOyAvKiBUaGlzIGlzIGEgbnVtYmVyIG9mIHRyaWVzIHdlIHBvbGwgdGhlCisJCQkJIHN0YXR1cyByZWdpc3RlciBiZWZvcmUgcmVzb3J0aW5nIHRvIHNsZWVwaW5nLgorCQkJCSBXYXZlRnJvbnQgYmVpbmcgYW4gSVNBIGNhcmQgZWFjaCBwb2xsIHRha2VzCisJCQkJIGFib3V0IDEuMnVzLiBTbyBiZWZvcmUgZ29pbmcgdG8KKwkJCSAgICAgICAgIHNsZWVwIHdlIHdhaXQgdXAgdG8gMi40bXMgaW4gYSBsb29wLgorCQkJICAgICAqLworCitzdGF0aWMgaW50IHNsZWVwX2xlbmd0aCA9IEhaLzEwMDsgLyogVGhpcyBzYXlzIGhvdyBsb25nIHdlJ3JlIGdvaW5nIHRvCisJCQkJICAgICBzbGVlcCBiZXR3ZWVuIHBvbGxzLgorCQkJICAgICAgICAgICAgIDEwbXMgc291bmRzIHJlYXNvbmFibGUgZm9yIGZhc3QgcmVzcG9uc2UuCisJCQkgICAgICAgICAgKi8KKworc3RhdGljIGludCBzbGVlcF90cmllcyA9IDUwOyAgICAgICAvKiBXYWl0IGZvciBzdGF0dXMgMC41IHNlY29uZHMgdG90YWwuICovCisKK3N0YXRpYyBpbnQgcmVzZXRfdGltZSA9IDI7IC8qIGh1bmRyZXRocyBvZiBhIHNlY29uZCB3ZSB3YWl0IGFmdGVyIGEgSFcgcmVzZXQgZm9yCisJCQkgICAgICB0aGUgZXhwZWN0ZWQgaW50ZXJydXB0LgorCQkJICAgKi8KKworc3RhdGljIGludCByYW1jaGVja190aW1lID0gMjA7ICAgIC8qIHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IHdoaWxlIFJPTSBjb2RlCisJCQkgICAgICAgICAgICAgY2hlY2tzIG9uLWJvYXJkIFJBTS4KKwkJCSAgICAgICAgICAqLworCitzdGF0aWMgaW50IG9zcnVuX3RpbWUgPSAxMDsgIC8qIHRpbWUgaW4gc2Vjb25kcyB3ZSB3YWl0IGZvciB0aGUgT1MgdG8KKwkJCSAgICAgICAgc3RhcnQgcnVubmluZy4KKwkJCSAgICAgKi8KKworbW9kdWxlX3BhcmFtKHdmX3JhdywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShmeF9yYXcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWdfZGVmYXVsdCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh3YWl0X3BvbGxzLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNsZWVwX2xlbmd0aCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzbGVlcF90cmllcywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShvc3BhdGgsIGNoYXJwLCAwKTsKK21vZHVsZV9wYXJhbShyZXNldF90aW1lLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJhbWNoZWNrX3RpbWUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ob3NydW5fdGltZSwgaW50LCAwKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTm90ZTogYmVjYXVzZSB0aGlzIG1vZHVsZSBkb2Vzbid0IGV4cG9ydCBhbnkgc3ltYm9scywgdGhpcyByZWFsbHkgaXNuJ3QKKyAgIGEgZ2xvYmFsIHZhcmlhYmxlLCBldmVuIGlmIGl0IGxvb2tzIGxpa2Ugb25lLiBJIHdhcyBxdWl0ZSBjb25mdXNlZCBieQorICAgdGhpcyB3aGVuIEkgc3RhcnRlZCB3cml0aW5nIHRoaXMgYXMgYSAobmV3ZXIpIG1vZHVsZSAtLSBwYmQuCisqLworCitzdHJ1Y3Qgd2ZfY29uZmlnIHsKKwlpbnQgZGV2bm87ICAgICAgICAgICAgLyogZGV2aWNlIG51bWJlciBmcm9tIGtlcm5lbCAqLworCWludCBpcnE7ICAgICAgICAgICAgICAvKiAieW91IHdlcmUgb25lLCBvbmUgb2YgdGhlIGZldyAuLi4iICovCisJaW50IGJhc2U7ICAgICAgICAgICAgIC8qIGxvdyBpL28gcG9ydCBhZGRyZXNzICovCisKKyNkZWZpbmUgbXB1X2RhdGFfcG9ydCAgICBiYXNlIAorI2RlZmluZSBtcHVfY29tbWFuZF9wb3J0IGJhc2UgKyAxIC8qIHdyaXRlIHNlbWFudGljcyAqLworI2RlZmluZSBtcHVfc3RhdHVzX3BvcnQgIGJhc2UgKyAxIC8qIHJlYWQgc2VtYW50aWNzICovCisjZGVmaW5lIGRhdGFfcG9ydCAgICAgICAgYmFzZSArIDIgCisjZGVmaW5lIHN0YXR1c19wb3J0ICAgICAgYmFzZSArIDMgLyogcmVhZCBzZW1hbnRpY3MgKi8KKyNkZWZpbmUgY29udHJvbF9wb3J0ICAgICBiYXNlICsgMyAvKiB3cml0ZSBzZW1hbnRpY3MgICovCisjZGVmaW5lIGJsb2NrX3BvcnQgICAgICAgYmFzZSArIDQgLyogMTYgYml0LCB3cml0ZW9ubHkgKi8KKyNkZWZpbmUgbGFzdF9ibG9ja19wb3J0ICBiYXNlICsgNiAvKiAxNiBiaXQsIHdyaXRlb25seSAqLworCisJLyogRlggcG9ydHMuIFRoZXNlIGFyZSBtYXBwZWQgdGhyb3VnaCB0aGUgSUNTMjExNSB0byB0aGUgWVMyMjUuCisJICAgVGhlIElDUzIxMTUgdGFrZXMgY2FyZSBvZiBmbGlwcGluZyB0aGUgcmVsZXZhbnQgcGlucyBvbiB0aGUKKwkgICBZUzIyNSBzbyB0aGF0IGFjY2VzcyB0byBlYWNoIG9mIHRoZXNlIHBvcnRzIGRvZXMgdGhlIHJpZ2h0CisJICAgdGhpbmcuIE5vdGU6IHRoZXNlIGFyZSBOT1QgZG9jdW1lbnRlZCBieSBUdXJ0bGUgQmVhY2guCisJKi8KKworI2RlZmluZSBmeF9zdGF0dXMgICAgICAgYmFzZSArIDggCisjZGVmaW5lIGZ4X29wICAgICAgICAgICBiYXNlICsgOCAKKyNkZWZpbmUgZnhfbGNyICAgICAgICAgIGJhc2UgKyA5IAorI2RlZmluZSBmeF9kc3BfYWRkciAgICAgYmFzZSArIDB4YQorI2RlZmluZSBmeF9kc3BfcGFnZSAgICAgYmFzZSArIDB4YiAKKyNkZWZpbmUgZnhfZHNwX2xzYiAgICAgIGJhc2UgKyAweGMgCisjZGVmaW5lIGZ4X2RzcF9tc2IgICAgICBiYXNlICsgMHhkIAorI2RlZmluZSBmeF9tb2RfYWRkciAgICAgYmFzZSArIDB4ZQorI2RlZmluZSBmeF9tb2RfZGF0YSAgICAgYmFzZSArIDB4ZiAKKworCXZvbGF0aWxlIGludCBpcnFfb2s7ICAgICAgICAgICAgICAgLyogc2V0IGJ5IGludGVycnVwdCBoYW5kbGVyICovCisgICAgICAgIHZvbGF0aWxlIGludCBpcnFfY250OyAgICAgICAgICAgICAgLyogZGl0dG8gKi8KKwlpbnQgb3BlbmVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcsIGhvbGRzIG9wZW4oMikgbW9kZSAqLworCWNoYXIgZGVidWc7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVidWdnaW5nIGZsYWdzICovCisJaW50IGZyZWVtZW07ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnN0YWxsZWQgUkFNLCBpbiBieXRlcyAqLyAKKworCWludCBzeW50aF9kZXY7ICAgICAgICAgICAgICAgICAgICAgLyogZGV2bm8gZm9yICJyYXciIHN5bnRoICovCisJaW50IG1pZGlkZXY7ICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXZubyBmb3IgaW50ZXJuYWwgTUlESSAqLworCWludCBleHRfbWlkaWRldjsgICAgICAgICAgICAgICAgICAgLyogZGV2bm8gZm9yIGV4dGVybmFsIE1JREkgKi8gCisgICAgICAgIGludCBmeF9taWRpZGV2OyAgICAgICAgICAgICAgICAgICAgLyogZGV2bm8gZm9yIEZYIE1JREkgaW50ZXJmYWNlICovCisjaWYgT1NTX1NVUFBPUlRfTEVWRUwgJiBPU1NfU1VQUE9SVF9TRVEKKwlpbnQgb3NzX2RldjsgICAgICAgICAgICAgICAgICAgICAgLyogZGV2bm8gZm9yIE9TUyBzZXF1ZW5jZXIgc3ludGggKi8KKyNlbmRpZiAvKiBPU1NfU1VQUE9SVF9TRVEgKi8KKworCWNoYXIgZndfdmVyc2lvblsyXTsgICAgICAgICAgICAgICAgLyogbWFqb3IgPSBbMF0sIG1pbm9yID0gWzFdICovCisJY2hhciBod192ZXJzaW9uWzJdOyAgICAgICAgICAgICAgICAvKiBtYWpvciA9IFswXSwgbWlub3IgPSBbMV0gKi8KKwljaGFyIGlzcmF3OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWRzIE1vdG9yb2xhIG1pY3JvY29kZSAqLworCWNoYXIgaGFzX2Z4OyAgICAgICAgICAgICAgICAgICAgICAgLyogaGFzIEZYIHByb2Nlc3NvciAoVHJvcGV6KykgKi8KKwljaGFyIHByb2dfc3RhdHVzW1dGX01BWF9QUk9HUkFNXTsgIC8qIFdGX1NMT1RfKiAqLworCWNoYXIgcGF0Y2hfc3RhdHVzW1dGX01BWF9QQVRDSF07ICAgLyogV0ZfU0xPVF8qICovCisJY2hhciBzYW1wbGVfc3RhdHVzW1dGX01BWF9TQU1QTEVdOyAvKiBXRl9TVF8qIHwgV0ZfU0xPVF8qICovCisJaW50IHNhbXBsZXNfdXNlZDsgICAgICAgICAgICAgICAgICAvKiBob3cgbWFueSAqLworCWNoYXIgaW50ZXJydXB0c19vbjsgICAgICAgICAgICAgICAgLyogaC93IE1QVSBpbnRlcnJ1cHRzIGVuYWJsZWQgPyAqLworCWNoYXIgcm9tX3NhbXBsZXNfcmRvbmx5OyAgICAgICAgICAgLyogY2FuIHdlIHdyaXRlIG9uIFJPTSBzYW1wbGVzICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgaW50ZXJydXB0X3NsZWVwZXI7IAorfSBkZXY7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CitzdGF0aWMgaW50ICBkZXRlY3Rfd2ZmeCh2b2lkKTsKK3N0YXRpYyBpbnQgIHdmZnhfaW9jdGwgKHdhdmVmcm9udF9meF9pbmZvICopOworc3RhdGljIGludCAgd2ZmeF9pbml0ICh2b2lkKTsKKworc3RhdGljIGludCB3YXZlZnJvbnRfZGVsZXRlX3NhbXBsZSAoaW50IHNhbXBudW0pOworc3RhdGljIGludCB3YXZlZnJvbnRfZmluZF9mcmVlX3NhbXBsZSAodm9pZCk7CisKKy8qIEZyb20gd2ZfbWlkaS5jICovCisKK2V4dGVybiBpbnQgIHZpcnR1YWxfbWlkaV9lbmFibGUgICh2b2lkKTsKK2V4dGVybiBpbnQgIHZpcnR1YWxfbWlkaV9kaXNhYmxlICh2b2lkKTsKK2V4dGVybiBpbnQgIGRldGVjdF93Zl9tcHUgKGludCwgaW50KTsKK2V4dGVybiBpbnQgIGluc3RhbGxfd2ZfbXB1ICh2b2lkKTsKK2V4dGVybiBpbnQgIHVuaW5zdGFsbF93Zl9tcHUgKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGNtZDsKKwljaGFyICphY3Rpb247CisJdW5zaWduZWQgaW50IHJlYWRfY250OworCXVuc2lnbmVkIGludCB3cml0ZV9jbnQ7CisJaW50IG5lZWRfYWNrOworfSB3YXZlZnJvbnRfY29tbWFuZDsKKworc3RhdGljIHN0cnVjdCB7CisJaW50IGVycm5vOworCWNvbnN0IGNoYXIgKmVycnN0cjsKK30gd2F2ZWZyb250X2Vycm9yc1tdID0geworCXsgMHgwMSwgIkJhZCBzYW1wbGUgbnVtYmVyIiB9LAorCXsgMHgwMiwgIk91dCBvZiBzYW1wbGUgbWVtb3J5IiB9LAorCXsgMHgwMywgIkJhZCBwYXRjaCBudW1iZXIiIH0sCisJeyAweDA0LCAiRXJyb3IgaW4gbnVtYmVyIG9mIHZvaWNlcyIgfSwKKwl7IDB4MDYsICJTYW1wbGUgbG9hZCBhbHJlYWR5IGluIHByb2dyZXNzIiB9LAorCXsgMHgwQiwgIk5vIHNhbXBsZSBsb2FkIHJlcXVlc3QgcGVuZGluZyIgfSwKKwl7IDB4MEUsICJCYWQgTUlESSBjaGFubmVsIG51bWJlciIgfSwKKwl7IDB4MTAsICJEb3dubG9hZCBSZWNvcmQgRXJyb3IiIH0sCisJeyAweDgwLCAiU3VjY2VzcyIgfSwKKwl7IDAgfQorfTsKKworI2RlZmluZSBORUVEU19BQ0sgMQorCitzdGF0aWMgd2F2ZWZyb250X2NvbW1hbmQgd2F2ZWZyb250X2NvbW1hbmRzW10gPSB7CisJeyBXRkNfU0VUX1NZTlRIVk9MLCAic2V0IHN5bnRoZXNpemVyIHZvbHVtZSIsIDAsIDEsIE5FRURTX0FDSyB9LAorCXsgV0ZDX0dFVF9TWU5USFZPTCwgImdldCBzeW50aGVzaXplciB2b2x1bWUiLCAxLCAwLCAwfSwKKwl7IFdGQ19TRVRfTlZPSUNFUywgInNldCBudW1iZXIgb2Ygdm9pY2VzIiwgMCwgMSwgTkVFRFNfQUNLIH0sCisJeyBXRkNfR0VUX05WT0lDRVMsICJnZXQgbnVtYmVyIG9mIHZvaWNlcyIsIDEsIDAsIDAgfSwKKwl7IFdGQ19TRVRfVFVOSU5HLCAic2V0IHN5bnRoZXNpemVyIHR1bmluZyIsIDAsIDIsIE5FRURTX0FDSyB9LAorCXsgV0ZDX0dFVF9UVU5JTkcsICJnZXQgc3ludGhlc2l6ZXIgdHVuaW5nIiwgMiwgMCwgMCB9LAorCXsgV0ZDX0RJU0FCTEVfQ0hBTk5FTCwgImRpc2FibGUgc3ludGggY2hhbm5lbCIsIDAsIDEsIE5FRURTX0FDSyB9LAorCXsgV0ZDX0VOQUJMRV9DSEFOTkVMLCAiZW5hYmxlIHN5bnRoIGNoYW5uZWwiLCAwLCAxLCBORUVEU19BQ0sgfSwKKwl7IFdGQ19HRVRfQ0hBTk5FTF9TVEFUVVMsICJnZXQgc3ludGggY2hhbm5lbCBzdGF0dXMiLCAzLCAwLCAwIH0sCisJeyBXRkNfTUlTWU5USF9PRkYsICJkaXNhYmxlIG1pZGktaW4gdG8gc3ludGgiLCAwLCAwLCBORUVEU19BQ0sgfSwKKwl7IFdGQ19NSVNZTlRIX09OLCAiZW5hYmxlIG1pZGktaW4gdG8gc3ludGgiLCAwLCAwLCBORUVEU19BQ0sgfSwKKwl7IFdGQ19WTUlESV9PTiwgImVuYWJsZSB2aXJ0dWFsIG1pZGkgbW9kZSIsIDAsIDAsIE5FRURTX0FDSyB9LAorCXsgV0ZDX1ZNSURJX09GRiwgImRpc2FibGUgdmlydHVhbCBtaWRpIG1vZGUiLCAwLCAwLCBORUVEU19BQ0sgfSwKKwl7IFdGQ19NSURJX1NUQVRVUywgInJlcG9ydCBtaWRpIHN0YXR1cyIsIDEsIDAsIDAgfSwKKwl7IFdGQ19GSVJNV0FSRV9WRVJTSU9OLCAicmVwb3J0IGZpcm13YXJlIHZlcnNpb24iLCAyLCAwLCAwIH0sCisJeyBXRkNfSEFSRFdBUkVfVkVSU0lPTiwgInJlcG9ydCBoYXJkd2FyZSB2ZXJzaW9uIiwgMiwgMCwgMCB9LAorCXsgV0ZDX0dFVF9OU0FNUExFUywgInJlcG9ydCBudW1iZXIgb2Ygc2FtcGxlcyIsIDIsIDAsIDAgfSwKKwl7IFdGQ19JTlNUT1VUX0xFVkVMUywgInJlcG9ydCBpbnN0YW50YW5lb3VzIG91dHB1dCBsZXZlbHMiLCA3LCAwLCAwIH0sCisJeyBXRkNfUEVBS09VVF9MRVZFTFMsICJyZXBvcnQgcGVhayBvdXRwdXQgbGV2ZWxzIiwgNywgMCwgMCB9LAorCXsgV0ZDX0RPV05MT0FEX1NBTVBMRSwgImRvd25sb2FkIHNhbXBsZSIsCisJICAwLCBXRl9TQU1QTEVfQllURVMsIE5FRURTX0FDSyB9LAorCXsgV0ZDX0RPV05MT0FEX0JMT0NLLCAiZG93bmxvYWQgYmxvY2siLCAwLCAwLCBORUVEU19BQ0t9LAorCXsgV0ZDX0RPV05MT0FEX1NBTVBMRV9IRUFERVIsICJkb3dubG9hZCBzYW1wbGUgaGVhZGVyIiwKKwkgIDAsIFdGX1NBTVBMRV9IRFJfQllURVMsIE5FRURTX0FDSyB9LAorCXsgV0ZDX1VQTE9BRF9TQU1QTEVfSEVBREVSLCAidXBsb2FkIHNhbXBsZSBoZWFkZXIiLCAxMywgMiwgMCB9LAorCisJLyogVGhpcyBjb21tYW5kIHJlcXVpcmVzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCisJICAgVGhlcmUgaXMgYSBoYWNrIGluIHdhdmVmcm9udF9jbWQoKSB0byBzdXBwb3J0IHRoaXMuIFRoZSBhY3R1YWwKKwkgICBjb3VudCBpcyBwYXNzZWQgaW4gYXMgdGhlIHJlYWQgYnVmZmVyIHB0ciwgY2FzdCBhcHByb3ByaWF0ZWx5LgorCSAgIFVnaC4KKwkqLworCisJeyBXRkNfRE9XTkxPQURfTVVMVElTQU1QTEUsICJkb3dubG9hZCBtdWx0aXNhbXBsZSIsIDAsIDAsIE5FRURTX0FDSyB9LAorCisJLyogVGhpcyBvbmUgaXMgYSBoYWNrIGFzIHdlbGwuIFdlIGp1c3QgcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKKwkgICByZXNwb25zZSwgZG9uJ3QgZmV0Y2ggYW4gQUNLLCBhbmQgbGVhdmUgdGhlIHJlc3QgdG8gdGhlIAorCSAgIGNhbGxpbmcgZnVuY3Rpb24uIFVnbHksIHVnbHksIHVnbHkuCisJKi8KKworCXsgV0ZDX1VQTE9BRF9NVUxUSVNBTVBMRSwgInVwbG9hZCBtdWx0aXNhbXBsZSIsIDIsIDEsIDAgfSwKKwl7IFdGQ19ET1dOTE9BRF9TQU1QTEVfQUxJQVMsICJkb3dubG9hZCBzYW1wbGUgYWxpYXMiLAorCSAgMCwgV0ZfQUxJQVNfQllURVMsIE5FRURTX0FDSyB9LAorCXsgV0ZDX1VQTE9BRF9TQU1QTEVfQUxJQVMsICJ1cGxvYWQgc2FtcGxlIGFsaWFzIiwgV0ZfQUxJQVNfQllURVMsIDIsIDB9LAorCXsgV0ZDX0RFTEVURV9TQU1QTEUsICJkZWxldGUgc2FtcGxlIiwgMCwgMiwgTkVFRFNfQUNLIH0sCisJeyBXRkNfSURFTlRJRllfU0FNUExFX1RZUEUsICJpZGVudGlmeSBzYW1wbGUgdHlwZSIsIDUsIDIsIDAgfSwKKwl7IFdGQ19VUExPQURfU0FNUExFX1BBUkFNUywgInVwbG9hZCBzYW1wbGUgcGFyYW1ldGVycyIgfSwKKwl7IFdGQ19SRVBPUlRfRlJFRV9NRU1PUlksICJyZXBvcnQgZnJlZSBtZW1vcnkiLCA0LCAwLCAwIH0sCisJeyBXRkNfRE9XTkxPQURfUEFUQ0gsICJkb3dubG9hZCBwYXRjaCIsIDAsIDEzNCwgTkVFRFNfQUNLIH0sCisJeyBXRkNfVVBMT0FEX1BBVENILCAidXBsb2FkIHBhdGNoIiwgMTMyLCAyLCAwIH0sCisJeyBXRkNfRE9XTkxPQURfUFJPR1JBTSwgImRvd25sb2FkIHByb2dyYW0iLCAwLCAzMywgTkVFRFNfQUNLIH0sCisJeyBXRkNfVVBMT0FEX1BST0dSQU0sICJ1cGxvYWQgcHJvZ3JhbSIsIDMyLCAxLCAwIH0sCisJeyBXRkNfRE9XTkxPQURfRURSVU1fUFJPR1JBTSwgImRvd25sb2FkIGVuaGFuY2VkIGRydW0gcHJvZ3JhbSIsIDAsIDksCisJICBORUVEU19BQ0t9LAorCXsgV0ZDX1VQTE9BRF9FRFJVTV9QUk9HUkFNLCAidXBsb2FkIGVuaGFuY2VkIGRydW0gcHJvZ3JhbSIsIDgsIDEsIDB9LAorCXsgV0ZDX1NFVF9FRFJVTV9DSEFOTkVMLCAic2V0IGVuaGFuY2VkIGRydW0gcHJvZ3JhbSBjaGFubmVsIiwKKwkgIDAsIDEsIE5FRURTX0FDSyB9LAorCXsgV0ZDX0RJU0FCTEVfRFJVTV9QUk9HUkFNLCAiZGlzYWJsZSBkcnVtIHByb2dyYW0iLCAwLCAxLCBORUVEU19BQ0sgfSwKKwl7IFdGQ19SRVBPUlRfQ0hBTk5FTF9QUk9HUkFNUywgInJlcG9ydCBjaGFubmVsIHByb2dyYW0gbnVtYmVycyIsCisJICAzMiwgMCwgMCB9LAorCXsgV0ZDX05PT1AsICJ0aGUgbm8tb3AgY29tbWFuZCIsIDAsIDAsIE5FRURTX0FDSyB9LAorCXsgMHgwMCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqCit3YXZlZnJvbnRfZXJyb3JzdHIgKGludCBlcnJudW0pCisKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHdhdmVmcm9udF9lcnJvcnNbaV0uZXJyc3RyOyBpKyspIHsKKwkJaWYgKHdhdmVmcm9udF9lcnJvcnNbaV0uZXJybm8gPT0gZXJybnVtKSB7CisJCQlyZXR1cm4gd2F2ZWZyb250X2Vycm9yc1tpXS5lcnJzdHI7CisJCX0KKwl9CisKKwlyZXR1cm4gIlVua25vd24gV2F2ZUZyb250IGVycm9yIjsKK30KKworc3RhdGljIHdhdmVmcm9udF9jb21tYW5kICoKK3dhdmVmcm9udF9nZXRfY29tbWFuZCAoaW50IGNtZCkgCisKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHdhdmVmcm9udF9jb21tYW5kc1tpXS5jbWQgIT0gMDsgaSsrKSB7CisJCWlmIChjbWQgPT0gd2F2ZWZyb250X2NvbW1hbmRzW2ldLmNtZCkgeworCQkJcmV0dXJuICZ3YXZlZnJvbnRfY29tbWFuZHNbaV07CisJCX0KKwl9CisKKwlyZXR1cm4gKHdhdmVmcm9udF9jb21tYW5kICopIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit3YXZlZnJvbnRfc3RhdHVzICh2b2lkKSAKKworeworCXJldHVybiBpbmIgKGRldi5zdGF0dXNfcG9ydCk7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF93YWl0IChpbnQgbWFzaykKKworeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHdhaXRfcG9sbHM7IGkrKykKKwkJaWYgKHdhdmVmcm9udF9zdGF0dXMoKSAmIG1hc2spCisJCQlyZXR1cm4gMTsKKworCWZvciAoaSA9IDA7IGkgPCBzbGVlcF90cmllczsgaSsrKSB7CisKKwkJaWYgKHdhdmVmcm9udF9zdGF0dXMoKSAmIG1hc2spIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoc2xlZXBfbGVuZ3RoKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X3JlYWQgKHZvaWQpCisKK3sKKwlpZiAod2F2ZWZyb250X3dhaXQgKFNUQVRfQ0FOX1JFQUQpKQorCQlyZXR1cm4gaW5iIChkZXYuZGF0YV9wb3J0KTsKKworCURQUklOVCAoV0ZfREVCVUdfREFUQSwgInJlYWQgdGltZW91dC5cbiIpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfd3JpdGUgKHVuc2lnbmVkIGNoYXIgZGF0YSkKKworeworCWlmICh3YXZlZnJvbnRfd2FpdCAoU1RBVF9DQU5fV1JJVEUpKSB7CisJCW91dGIgKGRhdGEsIGRldi5kYXRhX3BvcnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEUFJJTlQgKFdGX0RFQlVHX0RBVEEsICJ3cml0ZSB0aW1lb3V0LlxuIik7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9jbWQgKGludCBjbWQsIHVuc2lnbmVkIGNoYXIgKnJidWYsIHVuc2lnbmVkIGNoYXIgKndidWYpCisKK3sKKwlpbnQgYWNrOworCWludCBpOworCWludCBjOworCXdhdmVmcm9udF9jb21tYW5kICp3ZmNtZDsKKworCWlmICgod2ZjbWQgPSB3YXZlZnJvbnRfZ2V0X2NvbW1hbmQgKGNtZCkpID09ICh3YXZlZnJvbnRfY29tbWFuZCAqKSAwKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImNvbW1hbmQgMHgleCBub3Qgc3VwcG9ydGVkLlxuIiwKKwkJCWNtZCk7CisJCXJldHVybiAxOworCX0KKworCS8qIEhhY2sgdG8gaGFuZGxlIHRoZSBvbmUgdmFyaWFibGUtc2l6ZSB3cml0ZSBjb21tYW5kLiBTZWUKKwkgICB3YXZlZnJvbnRfc2VuZF9tdWx0aXNhbXBsZSgpIGZvciB0aGUgb3RoZXIgaGFsZiBvZiB0aGlzCisJICAgZ3Jvc3MgYW5kIHVnbHkgc3RyYXRlZ3kuCisJKi8KKworCWlmIChjbWQgPT0gV0ZDX0RPV05MT0FEX01VTFRJU0FNUExFKSB7CisJCXdmY21kLT53cml0ZV9jbnQgPSAodW5zaWduZWQgaW50KSByYnVmOworCQlyYnVmID0gTlVMTDsKKwl9CisKKwlEUFJJTlQgKFdGX0RFQlVHX0NNRCwgIjB4JXggWyVzXSAoJWQsJWQsJWQpXG4iLAorCQkJICAgICAgIGNtZCwgd2ZjbWQtPmFjdGlvbiwgd2ZjbWQtPnJlYWRfY250LAorCQkJICAgICAgIHdmY21kLT53cml0ZV9jbnQsIHdmY21kLT5uZWVkX2Fjayk7CisgICAgCisJaWYgKHdhdmVmcm9udF93cml0ZSAoY21kKSkgeyAKKwkJRFBSSU5UICgoV0ZfREVCVUdfSU98V0ZfREVCVUdfQ01EKSwgImNhbm5vdCByZXF1ZXN0ICIKKwkJCQkJCSAgICAgIjB4JXggWyVzXS5cbiIsCisJCQkJCQkgICAgIGNtZCwgd2ZjbWQtPmFjdGlvbik7CisJCXJldHVybiAxOworCX0gCisKKwlpZiAod2ZjbWQtPndyaXRlX2NudCA+IDApIHsKKwkJRFBSSU5UIChXRl9ERUJVR19EQVRBLCAid3JpdGluZyAlZCBieXRlcyAiCisJCQkJCSJmb3IgMHgleFxuIiwKKwkJCQkJd2ZjbWQtPndyaXRlX2NudCwgY21kKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgd2ZjbWQtPndyaXRlX2NudDsgaSsrKSB7CisJCQlpZiAod2F2ZWZyb250X3dyaXRlICh3YnVmW2ldKSkgeworCQkJCURQUklOVCAoV0ZfREVCVUdfSU8sICJiYWQgd3JpdGUgZm9yIGJ5dGUgIgorCQkJCQkJICAgICAgIiVkIG9mIDB4JXggWyVzXS5cbiIsCisJCQkJCQkgICAgICBpLCBjbWQsIHdmY21kLT5hY3Rpb24pOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQlEUFJJTlQgKFdGX0RFQlVHX0RBVEEsICJ3cml0ZVslZF0gPSAweCV4XG4iLAorCQkJCQkJaSwgd2J1ZltpXSk7CisJCX0KKwl9CisKKwlpZiAod2ZjbWQtPnJlYWRfY250ID4gMCkgeworCQlEUFJJTlQgKFdGX0RFQlVHX0RBVEEsICJyZWFkaW5nICVkIGludHMgIgorCQkJCQkiZm9yIDB4JXhcbiIsCisJCQkJCXdmY21kLT5yZWFkX2NudCwgY21kKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgd2ZjbWQtPnJlYWRfY250OyBpKyspIHsKKworCQkJaWYgKChjID0gd2F2ZWZyb250X3JlYWQoKSkgPT0gLTEpIHsKKwkJCQlEUFJJTlQgKFdGX0RFQlVHX0lPLCAiYmFkIHJlYWQgZm9yIGJ5dGUgIgorCQkJCQkJICAgICAgIiVkIG9mIDB4JXggWyVzXS5cbiIsCisJCQkJCQkgICAgICBpLCBjbWQsIHdmY21kLT5hY3Rpb24pOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQkvKiBOb3cgaGFuZGxlIGVycm9ycy4gTG90cyBvZiBzcGVjaWFsIGNhc2VzIGhlcmUgKi8KKwkgICAgCisJCQlpZiAoYyA9PSAweGZmKSB7IAorCQkJCWlmICgoYyA9IHdhdmVmcm9udF9yZWFkICgpKSA9PSAtMSkgeworCQkJCQlEUFJJTlQgKFdGX0RFQlVHX0lPLCAiYmFkIHJlYWQgZm9yICIKKwkJCQkJCQkgICAgICAiZXJyb3IgYnl0ZSBhdCAiCisJCQkJCQkJICAgICAgInJlYWQgYnl0ZSAlZCAiCisJCQkJCQkJICAgICAgIm9mIDB4JXggWyVzXS5cbiIsCisJCQkJCQkJICAgICAgaSwgY21kLAorCQkJCQkJCSAgICAgIHdmY21kLT5hY3Rpb24pOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisKKwkJCQkvKiBDYW4geW91IGJlbGlldmUgdGhpcyBtYWRuZXNzID8gKi8KKworCQkJCWlmIChjID09IDEgJiYKKwkJCQkgICAgd2ZjbWQtPmNtZCA9PSBXRkNfSURFTlRJRllfU0FNUExFX1RZUEUpIHsKKwkJCQkJcmJ1ZlswXSA9IFdGX1NUX0VNUFRZOworCQkJCQlyZXR1cm4gKDApOworCisJCQkJfSBlbHNlIGlmIChjID09IDMgJiYKKwkJCQkJICAgd2ZjbWQtPmNtZCA9PSBXRkNfVVBMT0FEX1BBVENIKSB7CisKKwkJCQkJcmV0dXJuIDM7CisKKwkJCQl9IGVsc2UgaWYgKGMgPT0gMSAmJgorCQkJCQkgICB3ZmNtZC0+Y21kID09IFdGQ19VUExPQURfUFJPR1JBTSkgeworCisJCQkJCXJldHVybiAxOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlEUFJJTlQgKFdGX0RFQlVHX0lPLCAiZXJyb3IgJWQgKCVzKSAiCisJCQkJCQkJICAgICAgImR1cmluZyAiCisJCQkJCQkJICAgICAgInJlYWQgZm9yIGJ5dGUgIgorCQkJCQkJCSAgICAgICIlZCBvZiAweCV4ICIKKwkJCQkJCQkgICAgICAiWyVzXS5cbiIsCisJCQkJCQkJICAgICAgYywKKwkJCQkJCQkgICAgICB3YXZlZnJvbnRfZXJyb3JzdHIgKGMpLAorCQkJCQkJCSAgICAgIGksIGNtZCwKKwkJCQkJCQkgICAgICB3ZmNtZC0+YWN0aW9uKTsKKwkJCQkJcmV0dXJuIDE7CisKKwkJCQl9CisJCQorCQl9IGVsc2UgeworCQkJCXJidWZbaV0gPSBjOworCQkJfQorCQkJCisJCQlEUFJJTlQgKFdGX0RFQlVHX0RBVEEsICJyZWFkWyVkXSA9IDB4JXhcbiIsaSwgcmJ1ZltpXSk7CisJCX0KKwl9CisJCisJaWYgKCh3ZmNtZC0+cmVhZF9jbnQgPT0gMCAmJiB3ZmNtZC0+d3JpdGVfY250ID09IDApIHx8IHdmY21kLT5uZWVkX2FjaykgeworCisJCURQUklOVCAoV0ZfREVCVUdfQ01ELCAicmVhZGluZyBBQ0sgZm9yIDB4JXhcbiIsIGNtZCk7CisKKwkJLyogU29tZSBjb21tYW5kcyBuZWVkIGFuIEFDSywgYnV0IHJldHVybiB6ZXJvIGluc3RlYWQKKwkJICAgb2YgdGhlIHN0YW5kYXJkIHZhbHVlLgorCQkqLworCSAgICAKKwkJaWYgKChhY2sgPSB3YXZlZnJvbnRfcmVhZCgpKSA9PSAwKSB7CisJCQlhY2sgPSBXRl9BQ0s7CisJCX0KKwkKKwkJaWYgKGFjayAhPSBXRl9BQ0spIHsKKwkJCWlmIChhY2sgPT0gLTEpIHsKKwkJCQlEUFJJTlQgKFdGX0RFQlVHX0lPLCAiY2Fubm90IHJlYWQgYWNrIGZvciAiCisJCQkJCQkgICAgICAiMHgleCBbJXNdLlxuIiwKKwkJCQkJCSAgICAgIGNtZCwgd2ZjbWQtPmFjdGlvbik7CisJCQkJcmV0dXJuIDE7CisJCQorCQkJfSBlbHNlIHsKKwkJCQlpbnQgZXJyID0gLTE7IC8qIHNvbWV0aGluZyB1bmtub3duICovCisKKwkJCQlpZiAoYWNrID09IDB4ZmYpIHsgLyogZXhwbGljaXQgZXJyb3IgKi8KKwkJICAgIAorCQkJCQlpZiAoKGVyciA9IHdhdmVmcm9udF9yZWFkICgpKSA9PSAtMSkgeworCQkJCQkJRFBSSU5UIChXRl9ERUJVR19EQVRBLAorCQkJCQkJCSJjYW5ub3QgcmVhZCBlcnIgIgorCQkJCQkJCSJmb3IgMHgleCBbJXNdLlxuIiwKKwkJCQkJCQljbWQsIHdmY21kLT5hY3Rpb24pOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCURQUklOVCAoV0ZfREVCVUdfSU8sICIweCV4IFslc10gIgorCQkJCQkiZmFpbGVkICgweCV4LCAweCV4LCAlcylcbiIsCisJCQkJCWNtZCwgd2ZjbWQtPmFjdGlvbiwgYWNrLCBlcnIsCisJCQkJCXdhdmVmcm9udF9lcnJvcnN0ciAoZXJyKSk7CisJCQkJCisJCQkJcmV0dXJuIC1lcnI7CisJCQl9CisJCX0KKwkJCisJCURQUklOVCAoV0ZfREVCVUdfREFUQSwgImFjayByZWNlaXZlZCAiCisJCQkJCSJmb3IgMHgleCBbJXNdXG4iLAorCQkJCQljbWQsIHdmY21kLT5hY3Rpb24pOworCX0gZWxzZSB7CisKKwkJRFBSSU5UIChXRl9ERUJVR19DTUQsICIweCV4IFslc10gZG9lcyBub3QgbmVlZCAiCisJCQkJICAgICAgICJBQ0sgKCVkLCVkLCVkKVxuIiwKKwkJCQkgICAgICAgY21kLCB3ZmNtZC0+YWN0aW9uLCB3ZmNtZC0+cmVhZF9jbnQsCisJCQkJICAgICAgIHdmY21kLT53cml0ZV9jbnQsIHdmY21kLT5uZWVkX2Fjayk7CisJfQorCisJcmV0dXJuIDA7CisJCit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1dhdmVGcm9udDogZGF0YSBtdW5naW5nICAgCisKK1RoaW5ncyBoZXJlIGFyZSB3ZWlyZC4gQWxsIGRhdGEgd3JpdHRlbiB0byB0aGUgYm9hcmQgY2Fubm90IAoraGF2ZSBpdHMgbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0LiBBbnkgZGF0YSBpdGVtIHdpdGggdmFsdWVzIAorcG90ZW50aWFsbHkgPiAweDdGICgxMjcpIG11c3QgYmUgc3BsaXQgYWNyb3NzIG11bHRpcGxlIGJ5dGVzLgorCitTb21ldGltZXMsIHdlIG5lZWQgdG8gbXVuZ2UgbnVtZXJpYyB2YWx1ZXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgb24KK3RoZSB4ODYgc2lkZSBhcyA4LTMyIGJpdCB2YWx1ZXMuIFNvbWV0aW1lcywgd2UgbmVlZCB0byBtdW5nZSBkYXRhCit0aGF0IGlzIHJlcHJlc2VudGVkIG9uIHRoZSB4ODYgc2lkZSBhcyBhbiBhcnJheSBvZiBieXRlcy4gVGhlIG1vc3QKK2VmZmljaWVudCBhcHByb2FjaCB0byBoYW5kbGluZyBib3RoIGNhc2VzIHNlZW1zIHRvIGJlIHRvIHVzZSAyCitkaWZmZXJlbnQgZnVuY3Rpb25zIGZvciBtdW5naW5nIGFuZCAyIGZvciBkZS1tdW5naW5nLiBUaGlzIGF2b2lkcword2VpcmQgY2FzdGluZyBhbmQgd29ycnlpbmcgYWJvdXQgYml0LWxldmVsIG9mZnNldHMuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyAKK3Vuc2lnbmVkIGNoYXIgKgorbXVuZ2VfaW50MzIgKHVuc2lnbmVkIGludCBzcmMsCisJICAgICB1bnNpZ25lZCBjaGFyICpkc3QsCisJICAgICB1bnNpZ25lZCBpbnQgZHN0X3NpemUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwO2kgPCBkc3Rfc2l6ZTsgaSsrKSB7CisJCSpkc3QgPSBzcmMgJiAweDdGOyAgLyogTWFzayBoaWdoIGJpdCBvZiBMU0IgKi8KKwkJc3JjID0gc3JjID4+IDc7ICAgICAvKiBSb3RhdGUgUmlnaHQgNyBiaXRzICAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3RlOiB3ZSBsZWF2ZSB0aGUgdXBwZXIgYml0cyBpbiBwbGFjZSAqLyAKKworCQlkc3QrKzsKKyAJfTsKKwlyZXR1cm4gZHN0OworfTsKKworc3RhdGljIGludCAKK2RlbXVuZ2VfaW50MzIgKHVuc2lnbmVkIGNoYXIqIHNyYywgaW50IHNyY19zaXplKQorCit7CisJaW50IGk7CisgCWludCBvdXR2YWwgPSAwOworCQorIAlmb3IgKGkgPSBzcmNfc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCW91dHZhbD0ob3V0dmFsPDw3KStzcmNbaV07CisJfQorCisJcmV0dXJuIG91dHZhbDsKK307CisKK3N0YXRpYyAKK3Vuc2lnbmVkIGNoYXIgKgorbXVuZ2VfYnVmICh1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGRzdF9zaXplKQorCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGxhc3QgPSBkc3Rfc2l6ZSAvIDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7CisJCSpkc3QrKyA9IHNyY1tpXSAmIDB4N2Y7CisJCSpkc3QrKyA9IHNyY1tpXSA+PiA3OworCX0KKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgCit1bnNpZ25lZCBjaGFyICoKK2RlbXVuZ2VfYnVmICh1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IHNyY19ieXRlcykKKworeworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKmVuZCA9IHNyYyArIHNyY19ieXRlczsKKyAgICAKKwllbmQgPSBzcmMgKyBzcmNfYnl0ZXM7CisKKwkvKiBOT1RFOiBzcmMgYW5kIGRzdCAqQ0FOKiBwb2ludCB0byB0aGUgc2FtZSBhZGRyZXNzICovCisKKwlmb3IgKGkgPSAwOyBzcmMgIT0gZW5kOyBpKyspIHsKKwkJZHN0W2ldID0gKnNyYysrOworCQlkc3RbaV0gfD0gKCpzcmMrKyk8PDc7CisJfQorCisJcmV0dXJuIGRzdDsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorV2F2ZUZyb250OiBzYW1wbGUsIHBhdGNoIGFuZCBwcm9ncmFtIG1hbmFnZW1lbnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAord2F2ZWZyb250X2RlbGV0ZV9zYW1wbGUgKGludCBzYW1wbGVfbnVtKQorCit7CisJdW5zaWduZWQgY2hhciB3YnVmWzJdOworCWludCB4OworCisJd2J1ZlswXSA9IHNhbXBsZV9udW0gJiAweDdmOworCXdidWZbMV0gPSBzYW1wbGVfbnVtID4+IDc7CisKKwlpZiAoKHggPSB3YXZlZnJvbnRfY21kIChXRkNfREVMRVRFX1NBTVBMRSwgTlVMTCwgd2J1ZikpID09IDApIHsKKwkJZGV2LnNhbXBsZV9zdGF0dXNbc2FtcGxlX251bV0gPSBXRl9TVF9FTVBUWTsKKwl9CisKKwlyZXR1cm4geDsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X2dldF9zYW1wbGVfc3RhdHVzIChpbnQgYXNzdW1lX3JvbSkKKworeworCWludCBpOworCXVuc2lnbmVkIGNoYXIgcmJ1ZlszMl0sIHdidWZbMzJdOworCXVuc2lnbmVkIGludCAgICBzY19yZWFsLCBzY19hbGlhcywgc2NfbXVsdGk7CisKKwkvKiBjaGVjayBzYW1wbGUgc3RhdHVzICovCisgICAgCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19HRVRfTlNBTVBMRVMsIHJidWYsIHdidWYpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImNhbm5vdCByZXF1ZXN0IHNhbXBsZSBjb3VudC5cbiIpOworCQlyZXR1cm4gLTE7CisJfSAKKyAgICAKKwlzY19yZWFsID0gc2NfYWxpYXMgPSBzY19tdWx0aSA9IGRldi5zYW1wbGVzX3VzZWQgPSAwOworICAgIAorCWZvciAoaSA9IDA7IGkgPCBXRl9NQVhfU0FNUExFOyBpKyspIHsKKwkKKwkJd2J1ZlswXSA9IGkgJiAweDdmOworCQl3YnVmWzFdID0gaSA+PiA3OworCisJCWlmICh3YXZlZnJvbnRfY21kIChXRkNfSURFTlRJRllfU0FNUExFX1RZUEUsIHJidWYsIHdidWYpKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FCisJCQkJImNhbm5vdCBpZGVudGlmeSBzYW1wbGUgIgorCQkJCSJ0eXBlIG9mIHNsb3QgJWRcbiIsIGkpOworCQkJZGV2LnNhbXBsZV9zdGF0dXNbaV0gPSBXRl9TVF9FTVBUWTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGV2LnNhbXBsZV9zdGF0dXNbaV0gPSAoV0ZfU0xPVF9GSUxMRUR8cmJ1ZlswXSk7CisKKwkJaWYgKGFzc3VtZV9yb20pIHsKKwkJCWRldi5zYW1wbGVfc3RhdHVzW2ldIHw9IFdGX1NMT1RfUk9NOworCQl9CisKKwkJc3dpdGNoIChyYnVmWzBdICYgV0ZfU1RfTUFTSykgeworCQljYXNlIFdGX1NUX1NBTVBMRToKKwkJCXNjX3JlYWwrKzsKKwkJCWJyZWFrOworCQljYXNlIFdGX1NUX01VTFRJU0FNUExFOgorCQkJc2NfbXVsdGkrKzsKKwkJCWJyZWFrOworCQljYXNlIFdGX1NUX0FMSUFTOgorCQkJc2NfYWxpYXMrKzsKKwkJCWJyZWFrOworCQljYXNlIFdGX1NUX0VNUFRZOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgInVua25vd24gc2FtcGxlIHR5cGUgZm9yICIKKwkJCQkic2xvdCAlZCAoMHgleClcbiIsIAorCQkJCWksIHJidWZbMF0pOworCQl9CisKKwkJaWYgKHJidWZbMF0gIT0gV0ZfU1RfRU1QVFkpIHsKKwkJCWRldi5zYW1wbGVzX3VzZWQrKzsKKwkJfSAKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FCisJCSIlZCBzYW1wbGVzIHVzZWQgKCVkIHJlYWwsICVkIGFsaWFzZXMsICVkIG11bHRpKSwgIgorCQkiJWQgZW1wdHlcbiIsIGRldi5zYW1wbGVzX3VzZWQsIHNjX3JlYWwsIHNjX2FsaWFzLCBzY19tdWx0aSwKKwkJV0ZfTUFYX1NBTVBMRSAtIGRldi5zYW1wbGVzX3VzZWQpOworCisKKwlyZXR1cm4gKDApOworCit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9nZXRfcGF0Y2hfc3RhdHVzICh2b2lkKQorCit7CisJdW5zaWduZWQgY2hhciBwYXRjaGJ1ZltXRl9QQVRDSF9CWVRFU107CisJdW5zaWduZWQgY2hhciBwYXRjaG51bVsyXTsKKwl3YXZlZnJvbnRfcGF0Y2ggKnA7CisJaW50IGksIHgsIGNudCwgY250MjsKKworCWZvciAoaSA9IDA7IGkgPCBXRl9NQVhfUEFUQ0g7IGkrKykgeworCQlwYXRjaG51bVswXSA9IGkgJiAweDdmOworCQlwYXRjaG51bVsxXSA9IGkgPj4gNzsKKworCQlpZiAoKHggPSB3YXZlZnJvbnRfY21kIChXRkNfVVBMT0FEX1BBVENILCBwYXRjaGJ1ZiwKKwkJCQkJcGF0Y2hudW0pKSA9PSAwKSB7CisKKwkJCWRldi5wYXRjaF9zdGF0dXNbaV0gfD0gV0ZfU0xPVF9GSUxMRUQ7CisJCQlwID0gKHdhdmVmcm9udF9wYXRjaCAqKSBwYXRjaGJ1ZjsKKwkJCWRldi5zYW1wbGVfc3RhdHVzCisJCQkJW3AtPnNhbXBsZV9udW1iZXJ8KHAtPnNhbXBsZV9tc2I8PDcpXSB8PQorCQkJCVdGX1NMT1RfVVNFRDsKKwkgICAgCisJCX0gZWxzZSBpZiAoeCA9PSAzKSB7IC8qIEJhZCBwYXRjaCBudW1iZXIgKi8KKwkJCWRldi5wYXRjaF9zdGF0dXNbaV0gPSAwOworCQl9IGVsc2UgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ1cGxvYWQgcGF0Y2ggIgorCQkJCSJlcnJvciAweCV4XG4iLCB4KTsKKwkJCWRldi5wYXRjaF9zdGF0dXNbaV0gPSAwOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiBwcm9ncmFtIHN0YXR1cyBoYXMgYWxyZWFkeSBmaWxsZWQgaW4gc2xvdF91c2VkIGJpdHMgKi8KKworCWZvciAoaSA9IDAsIGNudCA9IDAsIGNudDIgPSAwOyBpIDwgV0ZfTUFYX1BBVENIOyBpKyspIHsKKwkJaWYgKGRldi5wYXRjaF9zdGF0dXNbaV0gJiBXRl9TTE9UX0ZJTExFRCkgeworCQkJY250Kys7CisJCX0KKwkJaWYgKGRldi5wYXRjaF9zdGF0dXNbaV0gJiBXRl9TTE9UX1VTRUQpIHsKKwkJCWNudDIrKzsKKwkJfQorCQorCX0KKwlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FCisJCSIlZCBwYXRjaCBzbG90cyBmaWxsZWQsICVkIGluIHVzZVxuIiwgY250LCBjbnQyKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9nZXRfcHJvZ3JhbV9zdGF0dXMgKHZvaWQpCisKK3sKKwl1bnNpZ25lZCBjaGFyIHByb2didWZbV0ZfUFJPR1JBTV9CWVRFU107CisJd2F2ZWZyb250X3Byb2dyYW0gcHJvZzsKKwl1bnNpZ25lZCBjaGFyIHByb2dudW07CisJaW50IGksIHgsIGwsIGNudDsKKworCWZvciAoaSA9IDA7IGkgPCBXRl9NQVhfUFJPR1JBTTsgaSsrKSB7CisJCXByb2dudW0gPSBpOworCisJCWlmICgoeCA9IHdhdmVmcm9udF9jbWQgKFdGQ19VUExPQURfUFJPR1JBTSwgcHJvZ2J1ZiwKKwkJCQkJJnByb2dudW0pKSA9PSAwKSB7CisKKwkJCWRldi5wcm9nX3N0YXR1c1tpXSB8PSBXRl9TTE9UX1VTRUQ7CisKKwkJCWRlbXVuZ2VfYnVmIChwcm9nYnVmLCAodW5zaWduZWQgY2hhciAqKSAmcHJvZywKKwkJCQkgICAgIFdGX1BST0dSQU1fQllURVMpOworCisJCQlmb3IgKGwgPSAwOyBsIDwgV0ZfTlVNX0xBWUVSUzsgbCsrKSB7CisJCQkJaWYgKHByb2cubGF5ZXJbbF0ubXV0ZSkgeworCQkJCQlkZXYucGF0Y2hfc3RhdHVzCisJCQkJCQlbcHJvZy5sYXllcltsXS5wYXRjaF9udW1iZXJdIHw9CisJCQkJCQlXRl9TTE9UX1VTRUQ7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKHggPT0gMSkgeyAvKiBCYWQgcHJvZ3JhbSBudW1iZXIgKi8KKwkJCWRldi5wcm9nX3N0YXR1c1tpXSA9IDA7CisJCX0gZWxzZSB7CisJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgInVwbG9hZCBwcm9ncmFtICIKKwkJCQkiZXJyb3IgMHgleFxuIiwgeCk7CisJCQlkZXYucHJvZ19zdGF0dXNbaV0gPSAwOworCQl9CisJfQorCisJZm9yIChpID0gMCwgY250ID0gMDsgaSA8IFdGX01BWF9QUk9HUkFNOyBpKyspIHsKKwkJaWYgKGRldi5wcm9nX3N0YXR1c1tpXSkgeworCQkJY250Kys7CisJCX0KKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FICIlZCBwcm9ncmFtcyBzbG90cyBpbiB1c2VcbiIsIGNudCk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfc2VuZF9wYXRjaCAod2F2ZWZyb250X3BhdGNoX2luZm8gKmhlYWRlcikKKworeworCXVuc2lnbmVkIGNoYXIgYnVmW1dGX1BBVENIX0JZVEVTKzJdOworCXVuc2lnbmVkIGNoYXIgKmJwdHI7CisKKwlEUFJJTlQgKFdGX0RFQlVHX0xPQURfUEFUQ0gsICJkb3dubG9hZGluZyBwYXRjaCAlZFxuIiwKKwkJCQkgICAgICBoZWFkZXItPm51bWJlcik7CisKKwlkZXYucGF0Y2hfc3RhdHVzW2hlYWRlci0+bnVtYmVyXSB8PSBXRl9TTE9UX0ZJTExFRDsKKworCWJwdHIgPSBidWY7CisJYnB0ciA9IG11bmdlX2ludDMyIChoZWFkZXItPm51bWJlciwgYnVmLCAyKTsKKwltdW5nZV9idWYgKCh1bnNpZ25lZCBjaGFyICopJmhlYWRlci0+aGRyLnAsIGJwdHIsIFdGX1BBVENIX0JZVEVTKTsKKyAgICAKKwlpZiAod2F2ZWZyb250X2NtZCAoV0ZDX0RPV05MT0FEX1BBVENILCBOVUxMLCBidWYpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiZG93bmxvYWQgcGF0Y2ggZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0oRUlPKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfc2VuZF9wcm9ncmFtICh3YXZlZnJvbnRfcGF0Y2hfaW5mbyAqaGVhZGVyKQorCit7CisJdW5zaWduZWQgY2hhciBidWZbV0ZfUFJPR1JBTV9CWVRFUysxXTsKKwlpbnQgaTsKKworCURQUklOVCAoV0ZfREVCVUdfTE9BRF9QQVRDSCwgImRvd25sb2FkaW5nIHByb2dyYW0gJWRcbiIsCisJCWhlYWRlci0+bnVtYmVyKTsKKworCWRldi5wcm9nX3N0YXR1c1toZWFkZXItPm51bWJlcl0gPSBXRl9TTE9UX1VTRUQ7CisKKwkvKiBYWFggbmVlZCB0byB6ZXJvIGV4aXN0aW5nIFNMT1RfVVNFRCBiaXQgZm9yIHByb2dyYW1fc3RhdHVzW2ldCisJICAgd2hlcmUgYGknIGlzIHRoZSBwcm9ncmFtIHRoYXQncyBiZWluZyAocG90ZW50aWFsbHkpIG92ZXJ3cml0dGVuLgorCSovCisgICAgCisJZm9yIChpID0gMDsgaSA8IFdGX05VTV9MQVlFUlM7IGkrKykgeworCQlpZiAoaGVhZGVyLT5oZHIucHIubGF5ZXJbaV0ubXV0ZSkgeworCQkJZGV2LnBhdGNoX3N0YXR1c1toZWFkZXItPmhkci5wci5sYXllcltpXS5wYXRjaF9udW1iZXJdIHw9CisJCQkJV0ZfU0xPVF9VU0VEOworCisJCQkvKiBYWFggbmVlZCB0byBtYXJrIFNMT1RfVVNFRCBmb3Igc2FtcGxlIHVzZWQgYnkKKwkJCSAgIHBhdGNoX251bWJlciwgYnV0IHRoaXMgbWVhbnMgd2UgaGF2ZSB0byBsb2FkIGl0LiBJY2suCisJCQkqLworCQl9CisJfQorCisJYnVmWzBdID0gaGVhZGVyLT5udW1iZXI7CisJbXVuZ2VfYnVmICgodW5zaWduZWQgY2hhciAqKSZoZWFkZXItPmhkci5wciwgJmJ1ZlsxXSwgV0ZfUFJPR1JBTV9CWVRFUyk7CisgICAgCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19ET1dOTE9BRF9QUk9HUkFNLCBOVUxMLCBidWYpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImRvd25sb2FkIHBhdGNoIGZhaWxlZFxuIik7CQorCQlyZXR1cm4gLShFSU8pOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9mcmVlbWVtICh2b2lkKQorCit7CisJY2hhciByYnVmWzhdOworCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19SRVBPUlRfRlJFRV9NRU1PUlksIHJidWYsIE5VTEwpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImNhbid0IGdldCBtZW1vcnkgc3RhdHMuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCXJldHVybiBkZW11bmdlX2ludDMyIChyYnVmLCA0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9zZW5kX3NhbXBsZSAod2F2ZWZyb250X3BhdGNoX2luZm8gKmhlYWRlciwKKwkJICAgICAgIFVJTlQxNiBfX3VzZXIgKmRhdGFwdHIsCisJCSAgICAgICBpbnQgZGF0YV9pc191bnNpZ25lZCkKKworeworCS8qIHNhbXBsZXMgYXJlIGRvd25sb2FkZWQgdmlhIGEgMTYtYml0IHdpZGUgaS9vIHBvcnQKKwkgICAoeW91IGNvdWxkIHRoaW5rIG9mIGl0IGFzIDIgYWRqYWNlbnQgOC1iaXQgd2lkZSBwb3J0cworCSAgIGJ1dCBpdHMgbGVzcyBlZmZpY2llbnQgdGhhdCB3YXkpLiB0aGVyZWZvcmUsIGFsbAorCSAgIHRoZSBibG9ja3NpemVzIGFuZCBzbyBmb3J0aCBsaXN0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24sCisJICAgYW5kIHVzZWQgY29udmVudGlvbmFsbHkgdG8gcmVmZXIgdG8gc2FtcGxlIHNpemVzLAorCSAgIHdoaWNoIGFyZSBnaXZlbiBpbiA4LWJpdCB1bml0cyAoYnl0ZXMpLCBuZWVkIHRvIGJlCisJICAgZGl2aWRlZCBieSAyLgorICAgICAgICAqLworCisJVUlOVDE2IHNhbXBsZV9zaG9ydDsKKwlVSU5UMzIgbGVuZ3RoOworCVVJTlQxNiBfX3VzZXIgKmRhdGFfZW5kID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBpbnQgbWF4X2Jsa3NpemUgPSA0MDk2LzI7CisJdW5zaWduZWQgaW50IHdyaXR0ZW47CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZTsKKwlpbnQgZG1hX2FjazsKKwlpbnQgYmxvY2tudW07CisJdW5zaWduZWQgY2hhciBzYW1wbGVfaGRyW1dGX1NBTVBMRV9IRFJfQllURVNdOworCXVuc2lnbmVkIGNoYXIgKnNocHRyOworCWludCBza2lwID0gMDsKKwlpbnQgaW5pdGlhbF9za2lwID0gMDsKKworCURQUklOVCAoV0ZfREVCVUdfTE9BRF9QQVRDSCwgInNhbXBsZSAlc2Rvd25sb2FkIGZvciBzbG90ICVkLCAiCisJCQkJICAgICAgInR5cGUgJWQsICVkIGJ5dGVzIGZyb20gJXBcbiIsCisJCQkJICAgICAgaGVhZGVyLT5zaXplID8gIiIgOiAiaGVhZGVyICIsIAorCQkJCSAgICAgIGhlYWRlci0+bnVtYmVyLCBoZWFkZXItPnN1YmtleSwKKwkJCQkgICAgICBoZWFkZXItPnNpemUsCisJCQkJICAgICAgaGVhZGVyLT5kYXRhcHRyKTsKKworCWlmIChoZWFkZXItPm51bWJlciA9PSBXQVZFRlJPTlRfRklORF9GUkVFX1NBTVBMRV9TTE9UKSB7CisJCWludCB4OworCisJCWlmICgoeCA9IHdhdmVmcm9udF9maW5kX2ZyZWVfc2FtcGxlICgpKSA8IDApIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXByaW50ayAoS0VSTl9ERUJVRyBMT0dOQU1FICJ1bnNwZWNpZmllZCBzYW1wbGUgPT4gJWRcbiIsIHgpOworCQloZWFkZXItPm51bWJlciA9IHg7CisJfQorCisJaWYgKGhlYWRlci0+c2l6ZSkgeworCisJCS8qIFhYWCBpdCdzIGEgZGViYXRhYmxlIHBvaW50IHdoZXRoZXIgb3Igbm90IFJET05MWSBzZW1hbnRpY3MKKwkJICAgb24gdGhlIFJPTSBzYW1wbGVzIHNob3VsZCBjb3ZlciBqdXN0IHRoZSBzYW1wbGUgZGF0YSBvcgorCQkgICB0aGUgc2FtcGxlIGhlYWRlci4gRm9yIG5vdywgaXQgb25seSBjb3ZlcnMgdGhlIHNhbXBsZSBkYXRhLAorCQkgICBzbyBhbnlvbmUgaXMgZnJlZSBhdCBhbGwgdGltZXMgdG8gcmV3cml0ZSBzYW1wbGUgaGVhZGVycy4KKworCQkgICBNeSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB3ZSBoYXZlIHRoZSBzYW1wbGUgaGVhZGVycworCQkgICBhdmFpbGFibGUgaW4gdGhlIFdGQiBmaWxlIGZvciBHZW5lcmFsIE1JREksIGFuZCBzbyB0aGVzZQorCQkgICBjYW4gYWx3YXlzIGJlIHJlc2V0IGlmIG5lZWRlZC4gVGhlIHNhbXBsZSBkYXRhLCBob3dldmVyLAorCQkgICBjYW5ub3QgYmUgcmVjb3ZlcmVkIHdpdGhvdXQgYSBjb21wbGV0ZSByZXNldCBhbmQgZmlybXdhcmUKKwkJICAgcmVsb2FkIG9mIHRoZSBJQ1MyMTE1LCB3aGljaCBpcyBhIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbi4KKworCQkgICBTbywgZG9pbmcgdGhpbmdzIHRoaXMgd2F5IGFsbG93cyB1cyB0byBob25vciB0aGUgbm90aW9uIG9mCisJCSAgICJSRVNFVFNBTVBMRVMiIHJlYXNvbmFibHkgY2hlYXBseS4gTm90ZSBob3dldmVyLCB0aGF0IHRoaXMKKwkJICAgaXMgZG9uZSBwdXJlbHkgYXQgdXNlciBsZXZlbDogdGhlcmUgaXMgbm8gV0ZCIHBhcnNlciBpbgorCQkgICB0aGlzIGRyaXZlciwgYW5kIHNvIGEgY29tcGxldGUgcmVzZXQgKGJhY2sgdG8gR2VuZXJhbCBNSURJLAorCQkgICBvciB0aGVvcmV0aWNhbGx5IHNvbWUgb3RoZXIgY29uZmlndXJhdGlvbikgaXMgdGhlCisJCSAgIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIGxldmVsIGxpYnJhcnkuIAorCisJCSAgIFRvIHRyeSB0byBkbyB0aGlzIGluIHRoZSBrZXJuZWwgd291bGQgYmUgYSBsaXR0bGUKKwkJICAgY3Jhenk6IHdlJ2QgbmVlZCAxNThLIG9mIGtlcm5lbCBzcGFjZSBqdXN0IHRvIGhvbGQKKwkJICAgYSBjb3B5IG9mIHRoZSBwYXRjaC9wcm9ncmFtL3NhbXBsZSBoZWFkZXIgZGF0YS4KKwkJKi8KKworCQlpZiAoZGV2LnJvbV9zYW1wbGVzX3Jkb25seSkgeworCQkJaWYgKGRldi5zYW1wbGVfc3RhdHVzW2hlYWRlci0+bnVtYmVyXSAmIFdGX1NMT1RfUk9NKSB7CisJCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJzYW1wbGUgc2xvdCAlZCAiCisJCQkJCSJ3cml0ZSBwcm90ZWN0ZWRcbiIsCisJCQkJCWhlYWRlci0+bnVtYmVyKTsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCX0KKwkJfQorCisJCXdhdmVmcm9udF9kZWxldGVfc2FtcGxlIChoZWFkZXItPm51bWJlcik7CisJfQorCisJaWYgKGhlYWRlci0+c2l6ZSkgeworCQlkZXYuZnJlZW1lbSA9IHdhdmVmcm9udF9mcmVlbWVtICgpOworCisJCWlmIChkZXYuZnJlZW1lbSA8IGhlYWRlci0+c2l6ZSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FCisJCQkJImluc3VmZmljaWVudCBtZW1vcnkgdG8gIgorCQkJCSJsb2FkICVkIGJ5dGUgc2FtcGxlLlxuIiwKKwkJCQloZWFkZXItPnNpemUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkKKwl9CisKKwlza2lwID0gV0ZfR0VUX0NIQU5ORUwoJmhlYWRlci0+aGRyLnMpOworCisJaWYgKHNraXAgPiAwICYmIGhlYWRlci0+aGRyLnMuU2FtcGxlUmVzb2x1dGlvbiAhPSBMSU5FQVJfMTZCSVQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJjaGFubmVsIHNlbGVjdGlvbiBvbmx5ICIKKwkJCSJwb3NzaWJsZSBvbiAxNi1iaXQgc2FtcGxlcyIpOworCQlyZXR1cm4gLShFSU5WQUwpOworCX0KKworCXN3aXRjaCAoc2tpcCkgeworCWNhc2UgMDoKKwkJaW5pdGlhbF9za2lwID0gMDsKKwkJc2tpcCA9IDE7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaW5pdGlhbF9za2lwID0gMDsKKwkJc2tpcCA9IDI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaW5pdGlhbF9za2lwID0gMTsKKwkJc2tpcCA9IDI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaW5pdGlhbF9za2lwID0gMjsKKwkJc2tpcCA9IDM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaW5pdGlhbF9za2lwID0gMzsKKwkJc2tpcCA9IDQ7CisJCWJyZWFrOworCWNhc2UgNToKKwkJaW5pdGlhbF9za2lwID0gNDsKKwkJc2tpcCA9IDU7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJaW5pdGlhbF9za2lwID0gNTsKKwkJc2tpcCA9IDY7CisJCWJyZWFrOworCX0KKworCURQUklOVCAoV0ZfREVCVUdfTE9BRF9QQVRDSCwgImNoYW5uZWwgc2VsZWN0aW9uOiAlZCA9PiAiCisJCQkJICAgICAgImluaXRpYWwgc2tpcCA9ICVkLCBza2lwID0gJWRcbiIsCisJCQkJICAgICAgV0ZfR0VUX0NIQU5ORUwgKCZoZWFkZXItPmhkci5zKSwKKwkJCQkgICAgICBpbml0aWFsX3NraXAsIHNraXApOworICAgIAorCS8qIEJlIHNhZmUsIGFuZCB6ZXJvIHRoZSAiVW51c2VkIiBiaXRzIC4uLiAqLworCisJV0ZfU0VUX0NIQU5ORUwoJmhlYWRlci0+aGRyLnMsIDApOworCisJLyogYWRqdXN0IHNpemUgZm9yIDE2IGJpdCBzYW1wbGVzIGJ5IGRpdmlkaW5nIGJ5IHR3by4gIFdlIGFsd2F5cworCSAgIHNlbmQgMTYgYml0cyBwZXIgd3JpdGUsIGV2ZW4gZm9yIDggYml0IHNhbXBsZXMsIHNvIHRoZSBsZW5ndGgKKwkgICBpcyBhbHdheXMgaGFsZiB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGRhdGEgaW4gYnl0ZXMuCisJKi8KKworCWxlbmd0aCA9IGhlYWRlci0+c2l6ZSAvIDI7CisKKwkvKiB0aGUgZGF0YSB3ZSdyZSBzZW50IGhhcyBub3QgYmVlbiBtdW5nZWQsIGFuZCBpbiBmYWN0LCB0aGUKKwkgICBoZWFkZXIgd2UgaGF2ZSB0byBzZW5kIGlzbid0IGp1c3QgYSBtdW5nZWQgY29weSBlaXRoZXIuCisJICAgc28sIGJ1aWxkIHRoZSBzYW1wbGUgaGVhZGVyIHJpZ2h0IGhlcmUuCisJKi8KKworCXNocHRyID0gJnNhbXBsZV9oZHJbMF07CisKKwlzaHB0ciA9IG11bmdlX2ludDMyIChoZWFkZXItPm51bWJlciwgc2hwdHIsIDIpOworCisJaWYgKGhlYWRlci0+c2l6ZSkgeworCQlzaHB0ciA9IG11bmdlX2ludDMyIChsZW5ndGgsIHNocHRyLCA0KTsKKwl9CisKKwkvKiBZZXMsIGEgNCBieXRlIHJlc3VsdCBkb2Vzbid0IGNvbnRhaW4gYWxsIG9mIHRoZSBvZmZzZXQgYml0cywKKwkgICBidXQgdGhlIG9mZnNldCBvbmx5IHVzZXMgMjQgYml0cy4KKwkqLworCisJc2hwdHIgPSBtdW5nZV9pbnQzMiAoKigoVUlOVDMyICopICZoZWFkZXItPmhkci5zLnNhbXBsZVN0YXJ0T2Zmc2V0KSwKKwkJCSAgICAgc2hwdHIsIDQpOworCXNocHRyID0gbXVuZ2VfaW50MzIgKCooKFVJTlQzMiAqKSAmaGVhZGVyLT5oZHIucy5sb29wU3RhcnRPZmZzZXQpLAorCQkJICAgICBzaHB0ciwgNCk7CisJc2hwdHIgPSBtdW5nZV9pbnQzMiAoKigoVUlOVDMyICopICZoZWFkZXItPmhkci5zLmxvb3BFbmRPZmZzZXQpLAorCQkJICAgICBzaHB0ciwgNCk7CisJc2hwdHIgPSBtdW5nZV9pbnQzMiAoKigoVUlOVDMyICopICZoZWFkZXItPmhkci5zLnNhbXBsZUVuZE9mZnNldCksCisJCQkgICAgIHNocHRyLCA0KTsKKwkKKwkvKiBUaGlzIG9uZSBpcyB0cnVseSB3ZWlyZC4gV2hhdCBraW5kIG9mIHdlaXJkbyBkZWNpZGVkIHRoYXQgaW4KKwkgICBhIHN5c3RlbSBkb21pbmF0ZWQgYnkgMTYgYW5kIDMyIGJpdCBpbnRlZ2VycywgdGhleSB3b3VsZCB1c2UKKwkgICBhIGp1c3QgMTIgYml0cyA/CisJKi8KKwkKKwlzaHB0ciA9IG11bmdlX2ludDMyIChoZWFkZXItPmhkci5zLkZyZXF1ZW5jeUJpYXMsIHNocHRyLCAzKTsKKwkKKwkvKiBXaHkgaXMgdGhpcyBueWJibGlmaWVkLCB3aGVuIHRoZSBNU0IgaXMgKmFsd2F5cyogemVybyA/IAorCSAgIEFueXdheSwgd2UgY2FuJ3QgdGFrZSBhZGRyZXNzIG9mIGJpdGZpZWxkLCBzbyBtYWtlIGEKKwkgICBnb29kLWZhaXRoIGd1ZXNzIGF0IHdoZXJlIGl0IHN0YXJ0cy4KKwkqLworCQorCXNocHRyID0gbXVuZ2VfaW50MzIgKCooJmhlYWRlci0+aGRyLnMuRnJlcXVlbmN5QmlhcysxKSwKKwkJCSAgICAgc2hwdHIsIDIpOworCisJaWYgKHdhdmVmcm9udF9jbWQgKGhlYWRlci0+c2l6ZSA/CisJCQkgICBXRkNfRE9XTkxPQURfU0FNUExFIDogV0ZDX0RPV05MT0FEX1NBTVBMRV9IRUFERVIsCisJCQkgICBOVUxMLCBzYW1wbGVfaGRyKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJzYW1wbGUgJXNkb3dubG9hZCByZWZ1c2VkLlxuIiwKKwkJCWhlYWRlci0+c2l6ZSA/ICIiIDogImhlYWRlciAiKTsKKwkJcmV0dXJuIC0oRUlPKTsKKwl9CisKKwlpZiAoaGVhZGVyLT5zaXplID09IDApIHsKKwkJZ290byBzZW50OyAvKiBTb3JyeS4gSnVzdCBoYWQgdG8gaGF2ZSBvbmUgc29tZXdoZXJlICovCisJfQorICAgIAorCWRhdGFfZW5kID0gZGF0YXB0ciArIGxlbmd0aDsKKworCS8qIERvIGFueSBpbml0aWFsIHNraXAgb3ZlciBhbiB1bnVzZWQgY2hhbm5lbCdzIGRhdGEgKi8KKworCWRhdGFwdHIgKz0gaW5pdGlhbF9za2lwOworICAgIAorCWZvciAod3JpdHRlbiA9IDAsIGJsb2NrbnVtID0gMDsKKwkgICAgIHdyaXR0ZW4gPCBsZW5ndGg7IHdyaXR0ZW4gKz0gbWF4X2Jsa3NpemUsIGJsb2NrbnVtKyspIHsKKwkKKwkJaWYgKChsZW5ndGggLSB3cml0dGVuKSA+IG1heF9ibGtzaXplKSB7CisJCQlibG9ja3NpemUgPSBtYXhfYmxrc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJvdW5kIHRvIG5lYXJlc3QgMTYtYnl0ZSB2YWx1ZSAqLworCQkJYmxvY2tzaXplID0gKChsZW5ndGgtd3JpdHRlbis3KSZ+MHg3KTsKKwkJfQorCisJCWlmICh3YXZlZnJvbnRfY21kIChXRkNfRE9XTkxPQURfQkxPQ0ssIE5VTEwsIE5VTEwpKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJkb3dubG9hZCBibG9jayAiCisJCQkJInJlcXVlc3QgcmVmdXNlZC5cbiIpOworCQkJcmV0dXJuIC0oRUlPKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBibG9ja3NpemU7IGkrKykgeworCisJCQlpZiAoZGF0YXB0ciA8IGRhdGFfZW5kKSB7CisJCQorCQkJCV9fZ2V0X3VzZXIgKHNhbXBsZV9zaG9ydCwgZGF0YXB0cik7CisJCQkJZGF0YXB0ciArPSBza2lwOworCQkKKwkJCQlpZiAoZGF0YV9pc191bnNpZ25lZCkgeyAvKiBHVVMgPyAqLworCisJCQkJCWlmIChXRl9TQU1QTEVfSVNfOEJJVCgmaGVhZGVyLT5oZHIucykpIHsKKwkJCQorCQkJCQkJLyogOCBiaXQgc2FtcGxlCisJCQkJCQkgcmVzb2x1dGlvbiwgc2lnbgorCQkJCQkJIGV4dGVuZCBib3RoIGJ5dGVzLgorCQkJCQkJKi8KKwkJCQorCQkJCQkJKCh1bnNpZ25lZCBjaGFyKikKKwkJCQkJCSAmc2FtcGxlX3Nob3J0KVswXSArPSAweDdmOworCQkJCQkJKCh1bnNpZ25lZCBjaGFyKikKKwkJCQkJCSAmc2FtcGxlX3Nob3J0KVsxXSArPSAweDdmOworCQkJCisJCQkJCX0gZWxzZSB7CisJCQkKKwkJCQkJCS8qIDE2IGJpdCBzYW1wbGUKKwkJCQkJCSByZXNvbHV0aW9uLCBzaWduCisJCQkJCQkgZXh0ZW5kIHRoZSBNU0IuCisJCQkJCQkqLworCQkJCisJCQkJCQlzYW1wbGVfc2hvcnQgKz0gMHg3ZmZmOworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJLyogSW4gcGFkZGluZyBzZWN0aW9uIG9mIGZpbmFsIGJsb2NrOgorCisJCQkJICAgRG9uJ3QgZmV0Y2ggdW5zdXBwbGllZCBkYXRhIGZyb20KKwkJCQkgICB1c2VyIHNwYWNlLCBqdXN0IGNvbnRpbnVlIHdpdGgKKwkJCQkgICB3aGF0ZXZlciB0aGUgZmluYWwgdmFsdWUgd2FzLgorCQkJCSovCisJCQl9CisJICAgIAorCQkJaWYgKGkgPCBibG9ja3NpemUgLSAxKSB7CisJCQkJb3V0dyAoc2FtcGxlX3Nob3J0LCBkZXYuYmxvY2tfcG9ydCk7CisJCQl9IGVsc2UgeworCQkJCW91dHcgKHNhbXBsZV9zaG9ydCwgZGV2Lmxhc3RfYmxvY2tfcG9ydCk7CisJCQl9CisJCX0KKworCQkvKiBHZXQgIkRNQSBwYWdlIGFja25vd2xlZGdlIiwgZXZlbiB0aG91Z2ggaXRzIHJlYWxseQorCQkgICBub3RoaW5nIHRvIGRvIHdpdGggRE1BIGF0IGFsbC4KKwkJKi8KKwkKKwkJaWYgKChkbWFfYWNrID0gd2F2ZWZyb250X3JlYWQgKCkpICE9IFdGX0RNQV9BQ0spIHsKKwkJCWlmIChkbWFfYWNrID09IC0xKSB7CisJCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ1cGxvYWQgc2FtcGxlICIKKwkJCQkJIkRNQSBhY2sgdGltZW91dFxuIik7CisJCQkJcmV0dXJuIC0oRUlPKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ1cGxvYWQgc2FtcGxlICIKKwkJCQkJIkRNQSBhY2sgZXJyb3IgMHgleFxuIiwKKwkJCQkJZG1hX2Fjayk7CisJCQkJcmV0dXJuIC0oRUlPKTsKKwkJCX0KKwkJfQorCX0KKworCWRldi5zYW1wbGVfc3RhdHVzW2hlYWRlci0+bnVtYmVyXSA9IChXRl9TTE9UX0ZJTExFRHxXRl9TVF9TQU1QTEUpOworCisJLyogTm90ZSwgbGFiZWwgaXMgaGVyZSBiZWNhdXNlIHNlbmRpbmcgdGhlIHNhbXBsZSBoZWFkZXIgc2hvdWxkbid0CisJICAgYWx0ZXIgdGhlIHNhbXBsZV9zdGF0dXMgaW5mbyBhdCBhbGwuCisJKi8KKworIHNlbnQ6CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X3NlbmRfYWxpYXMgKHdhdmVmcm9udF9wYXRjaF9pbmZvICpoZWFkZXIpCisKK3sKKwl1bnNpZ25lZCBjaGFyIGFsaWFzX2hkcltXRl9BTElBU19CWVRFU107CisKKwlEUFJJTlQgKFdGX0RFQlVHX0xPQURfUEFUQ0gsICJkb3dubG9hZCBhbGlhcywgJWQgaXMgIgorCQkJCSAgICAgICJhbGlhcyBmb3IgJWRcbiIsCisJCQkJICAgICAgaGVhZGVyLT5udW1iZXIsCisJCQkJICAgICAgaGVhZGVyLT5oZHIuYS5PcmlnaW5hbFNhbXBsZSk7CisgICAgCisJbXVuZ2VfaW50MzIgKGhlYWRlci0+bnVtYmVyLCAmYWxpYXNfaGRyWzBdLCAyKTsKKwltdW5nZV9pbnQzMiAoaGVhZGVyLT5oZHIuYS5PcmlnaW5hbFNhbXBsZSwgJmFsaWFzX2hkclsyXSwgMik7CisJbXVuZ2VfaW50MzIgKCooKHVuc2lnbmVkIGludCAqKSZoZWFkZXItPmhkci5hLnNhbXBsZVN0YXJ0T2Zmc2V0KSwKKwkJICAgICAmYWxpYXNfaGRyWzRdLCA0KTsKKwltdW5nZV9pbnQzMiAoKigodW5zaWduZWQgaW50ICopJmhlYWRlci0+aGRyLmEubG9vcFN0YXJ0T2Zmc2V0KSwKKwkJICAgICAmYWxpYXNfaGRyWzhdLCA0KTsKKwltdW5nZV9pbnQzMiAoKigodW5zaWduZWQgaW50ICopJmhlYWRlci0+aGRyLmEubG9vcEVuZE9mZnNldCksCisJCSAgICAgJmFsaWFzX2hkclsxMl0sIDQpOworCW11bmdlX2ludDMyICgqKCh1bnNpZ25lZCBpbnQgKikmaGVhZGVyLT5oZHIuYS5zYW1wbGVFbmRPZmZzZXQpLAorCQkgICAgICZhbGlhc19oZHJbMTZdLCA0KTsKKwltdW5nZV9pbnQzMiAoaGVhZGVyLT5oZHIuYS5GcmVxdWVuY3lCaWFzLCAmYWxpYXNfaGRyWzIwXSwgMyk7CisJbXVuZ2VfaW50MzIgKCooJmhlYWRlci0+aGRyLmEuRnJlcXVlbmN5QmlhcysxKSwgJmFsaWFzX2hkclsyM10sIDIpOworCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19ET1dOTE9BRF9TQU1QTEVfQUxJQVMsIE5VTEwsIGFsaWFzX2hkcikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJkb3dubG9hZCBhbGlhcyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0oRUlPKTsKKwl9CisKKwlkZXYuc2FtcGxlX3N0YXR1c1toZWFkZXItPm51bWJlcl0gPSAoV0ZfU0xPVF9GSUxMRUR8V0ZfU1RfQUxJQVMpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X3NlbmRfbXVsdGlzYW1wbGUgKHdhdmVmcm9udF9wYXRjaF9pbmZvICpoZWFkZXIpCit7CisJaW50IGk7CisJaW50IG51bV9zYW1wbGVzOworCXVuc2lnbmVkIGNoYXIgbXNhbXBsZV9oZHJbV0ZfTVNBTVBMRV9CWVRFU107CisKKwltdW5nZV9pbnQzMiAoaGVhZGVyLT5udW1iZXIsICZtc2FtcGxlX2hkclswXSwgMik7CisKKwkvKiBZb3UnbGwgcmVjYWxsIGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgIm51bWJlciBvZiBzYW1wbGVzIiB2YWx1ZQorCSAgIGluIGEgd2F2ZWZyb250X211bHRpc2FtcGxlIHN0cnVjdCBpcyBhY3R1YWxseSB0aGUgbG9nMiBvZiB0aGUKKwkgICByZWFsIG51bWJlciBvZiBzYW1wbGVzLgorCSovCisKKwludW1fc2FtcGxlcyA9ICgxPDwoaGVhZGVyLT5oZHIubXMuTnVtYmVyT2ZTYW1wbGVzJjcpKTsKKwltc2FtcGxlX2hkclsyXSA9ICh1bnNpZ25lZCBjaGFyKSBoZWFkZXItPmhkci5tcy5OdW1iZXJPZlNhbXBsZXM7CisKKwlEUFJJTlQgKFdGX0RFQlVHX0xPQURfUEFUQ0gsICJtdWx0aSAlZCB3aXRoICVkPSVkIHNhbXBsZXNcbiIsCisJCQkJICAgICAgaGVhZGVyLT5udW1iZXIsCisJCQkJICAgICAgaGVhZGVyLT5oZHIubXMuTnVtYmVyT2ZTYW1wbGVzLAorCQkJCSAgICAgIG51bV9zYW1wbGVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgaSsrKSB7CisJCURQUklOVChXRl9ERUJVR19MT0FEX1BBVENIfFdGX0RFQlVHX0RBVEEsICJzYW1wbGVbJWRdID0gJWRcbiIsCisJCSAgICAgICBpLCBoZWFkZXItPmhkci5tcy5TYW1wbGVOdW1iZXJbaV0pOworCQltdW5nZV9pbnQzMiAoaGVhZGVyLT5oZHIubXMuU2FtcGxlTnVtYmVyW2ldLAorCQkgICAgICZtc2FtcGxlX2hkclszKyhpKjIpXSwgMik7CisJfQorICAgIAorCS8qIE5lZWQgYSBoYWNrIGhlcmUgdG8gcGFzcyBpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisJICAgdG8gYmUgd3JpdHRlbiB0byB0aGUgc3ludGguIFRoaXMgaXMgdWdseSwgYW5kIHBlcmhhcHMKKwkgICBvbmUgZGF5LCBJJ2xsIGZpeCBpdC4KKwkqLworCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19ET1dOTE9BRF9NVUxUSVNBTVBMRSwgCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAoKG51bV9zYW1wbGVzKjIpKzMpLAorCQkJICAgbXNhbXBsZV9oZHIpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiZG93bmxvYWQgb2YgbXVsdGlzYW1wbGUgZmFpbGVkLlxuIik7CisJCXJldHVybiAtKEVJTyk7CisJfQorCisJZGV2LnNhbXBsZV9zdGF0dXNbaGVhZGVyLT5udW1iZXJdID0gKFdGX1NMT1RfRklMTEVEfFdGX1NUX01VTFRJU0FNUExFKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9mZXRjaF9tdWx0aXNhbXBsZSAod2F2ZWZyb250X3BhdGNoX2luZm8gKmhlYWRlcikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGxvZ19uc1sxXTsKKwl1bnNpZ25lZCBjaGFyIG51bWJlclsyXTsKKwlpbnQgbnVtX3NhbXBsZXM7CisKKwltdW5nZV9pbnQzMiAoaGVhZGVyLT5udW1iZXIsIG51bWJlciwgMik7CisgICAgCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19VUExPQURfTVVMVElTQU1QTEUsIGxvZ19ucywgbnVtYmVyKSkgeworCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgInVwbG9hZCBtdWx0aXNhbXBsZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0oRUlPKTsKKwl9CisgICAgCisJRFBSSU5UIChXRl9ERUJVR19EQVRBLCAibXNhbXBsZSAlZCBoYXMgJWQgc2FtcGxlc1xuIiwKKwkJCQloZWFkZXItPm51bWJlciwgbG9nX25zWzBdKTsKKworCWhlYWRlci0+aGRyLm1zLk51bWJlck9mU2FtcGxlcyA9IGxvZ19uc1swXTsKKworCS8qIGdldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgLi4uICovCisKKwludW1fc2FtcGxlcyA9ICgxIDw8IGxvZ19uc1swXSk7CisgICAgCisJZm9yIChpID0gMDsgaSA8IG51bV9zYW1wbGVzOyBpKyspIHsKKwkJczggZFsyXTsKKwkKKwkJaWYgKChkWzBdID0gd2F2ZWZyb250X3JlYWQgKCkpID09IC0xKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgInVwbG9hZCBtdWx0aXNhbXBsZSBmYWlsZWQgIgorCQkJCSJkdXJpbmcgc2FtcGxlIGxvb3AuXG4iKTsKKwkJCXJldHVybiAtKEVJTyk7CisJCX0KKworCQlpZiAoKGRbMV0gPSB3YXZlZnJvbnRfcmVhZCAoKSkgPT0gLTEpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAidXBsb2FkIG11bHRpc2FtcGxlIGZhaWxlZCAiCisJCQkJImR1cmluZyBzYW1wbGUgbG9vcC5cbiIpOworCQkJcmV0dXJuIC0oRUlPKTsKKwkJfQorCQorCQloZWFkZXItPmhkci5tcy5TYW1wbGVOdW1iZXJbaV0gPQorCQkJZGVtdW5nZV9pbnQzMiAoKHVuc2lnbmVkIGNoYXIgKikgZCwgMik7CisJCisJCURQUklOVCAoV0ZfREVCVUdfREFUQSwgIm1zYW1wbGUgc2FtcGxlWyVkXSA9ICVkXG4iLAorCQkJCQlpLCBoZWFkZXItPmhkci5tcy5TYW1wbGVOdW1iZXJbaV0pOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKworc3RhdGljIGludAord2F2ZWZyb250X3NlbmRfZHJ1bSAod2F2ZWZyb250X3BhdGNoX2luZm8gKmhlYWRlcikKKworeworCXVuc2lnbmVkIGNoYXIgZHJ1bWJ1ZltXRl9EUlVNX0JZVEVTXTsKKwl3YXZlZnJvbnRfZHJ1bSAqZHJ1bSA9ICZoZWFkZXItPmhkci5kOworCWludCBpOworCisJRFBSSU5UIChXRl9ERUJVR19MT0FEX1BBVENILCAiZG93bmxvYWRpbmcgZWRydW0gZm9yIE1JREkgIgorCQkibm90ZSAlZCwgcGF0Y2ggPSAlZFxuIiwgCisJCWhlYWRlci0+bnVtYmVyLCBkcnVtLT5QYXRjaE51bWJlcik7CisKKwlkcnVtYnVmWzBdID0gaGVhZGVyLT5udW1iZXIgJiAweDdmOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQltdW5nZV9pbnQzMiAoKCh1bnNpZ25lZCBjaGFyICopZHJ1bSlbaV0sICZkcnVtYnVmWzErKGkqMildLCAyKTsKKwl9CisKKwlpZiAod2F2ZWZyb250X2NtZCAoV0ZDX0RPV05MT0FEX0VEUlVNX1BST0dSQU0sIE5VTEwsIGRydW1idWYpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiZG93bmxvYWQgZHJ1bSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0oRUlPKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IAord2F2ZWZyb250X2ZpbmRfZnJlZV9zYW1wbGUgKHZvaWQpCisKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBXRl9NQVhfU0FNUExFOyBpKyspIHsKKwkJaWYgKCEoZGV2LnNhbXBsZV9zdGF0dXNbaV0gJiBXRl9TTE9UX0ZJTExFRCkpIHsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgIm5vIGZyZWUgc2FtcGxlIHNsb3RzIVxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IAord2F2ZWZyb250X2ZpbmRfZnJlZV9wYXRjaCAodm9pZCkKKworeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFdGX01BWF9QQVRDSDsgaSsrKSB7CisJCWlmICghKGRldi5wYXRjaF9zdGF0dXNbaV0gJiBXRl9TTE9UX0ZJTExFRCkpIHsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgIm5vIGZyZWUgcGF0Y2ggc2xvdHMhXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgCitsb2cyXzIwNDgoaW50IG4pCisKK3sKKwlpbnQgdGJsW109ezAsIDAsIDIwNDgsIDMyNDYsIDQwOTYsIDQ3NTUsIDUyOTQsIDU3NDksIDYxNDMsCisJCSAgIDY0OTIsIDY4MDMsIDcwODQsIDczNDIsIDc1NzgsIDc3OTcsIDgwMDEsIDgxOTIsCisJCSAgIDgzNzEsIDg1NDAsIDg2OTksIDg4NTEsIDg5OTUsIDkxMzIsIDkyNjQsIDkzOTAsCisJCSAgIDk1MTAsIDk2MjYsIDk3MzgsIDk4NDUsIDk5NDksIDEwMDQ5LCAxMDE0Nn07CisJaW50IGk7CisKKwkvKiBSZXR1cm5zIDIwNDgqbG9nMihuKSAqLworCisJLyogRklYTUU6IHRoaXMgaXMgbGlrZSBkb2luZyBpbnRlZ2VyIG1hdGgKKwkgICBvbiBxdWFudHVtIHBhcnRpY2xlcyAoUnVOKSAqLworCisJaT0wOworCXdoaWxlKG4+PTMyKjI1NikgeworCQluPj49ODsKKwkJaSs9MjA0OCo4OworCX0KKwl3aGlsZShuPj0zMikgeworCQluPj49MTsKKwkJaSs9MjA0ODsKKwl9CisJaSs9dGJsW25dOworCXJldHVybihpKTsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X2xvYWRfZ3VzX3BhdGNoIChpbnQgZGV2bm8sIGludCBmb3JtYXQsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLAorCQkJICBpbnQgb2ZmcywgaW50IGNvdW50LCBpbnQgcG1ncl9mbGFnKQoreworCXN0cnVjdCBwYXRjaF9pbmZvIGd1c3BhdGNoOworCXdhdmVmcm9udF9wYXRjaF9pbmZvICpzYW1wLCAqcGF0LCAqcHJvZzsKKwl3YXZlZnJvbnRfcGF0Y2ggKnBhdHA7CisJd2F2ZWZyb250X3NhbXBsZSAqc2FtcHA7CisJd2F2ZWZyb250X3Byb2dyYW0gKnByb2dwOworCisJaW50IGksYmFzZV9ub3RlOworCWxvbmcgc2l6ZW9mX3BhdGNoOworCWludCByYyA9IC1FTk9NRU07CisKKwlzYW1wID0ga21hbGxvYygzICogc2l6ZW9mKHdhdmVmcm9udF9wYXRjaF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYW1wKQorCQlnb3RvIGZyZWVfZmFpbDsKKwlwYXQgPSBzYW1wICsgMTsKKwlwcm9nID0gcGF0ICsgMTsKKworCS8qIENvcHkgaW4gdGhlIGhlYWRlciBvZiB0aGUgR1VTIHBhdGNoICovCisKKwlzaXplb2ZfcGF0Y2ggPSAobG9uZykgJmd1c3BhdGNoLmRhdGFbMF0gLSAobG9uZykgJmd1c3BhdGNoOyAKKwlpZiAoY29weV9mcm9tX3VzZXIoJigoY2hhciAqKSAmZ3VzcGF0Y2gpW29mZnNdLAorCQkJICAgJihhZGRyKVtvZmZzXSwgc2l6ZW9mX3BhdGNoIC0gb2ZmcykpIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGZyZWVfZmFpbDsKKwl9CisKKwlpZiAoKGkgPSB3YXZlZnJvbnRfZmluZF9mcmVlX3BhdGNoICgpKSA9PSAtMSkgeworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBmcmVlX2ZhaWw7CisJfQorCXBhdC0+bnVtYmVyID0gaTsKKwlwYXQtPnN1YmtleSA9IFdGX1NUX1BBVENIOworCXBhdHAgPSAmcGF0LT5oZHIucDsKKworCWlmICgoaSA9IHdhdmVmcm9udF9maW5kX2ZyZWVfc2FtcGxlICgpKSA9PSAtMSkgeworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBmcmVlX2ZhaWw7CisJfQorCXNhbXAtPm51bWJlciA9IGk7CisJc2FtcC0+c3Via2V5ID0gV0ZfU1RfU0FNUExFOworCXNhbXAtPnNpemUgPSBndXNwYXRjaC5sZW47CisJc2FtcHAgPSAmc2FtcC0+aGRyLnM7CisKKwlwcm9nLT5udW1iZXIgPSBndXNwYXRjaC5pbnN0cl9ubzsKKwlwcm9ncCA9ICZwcm9nLT5oZHIucHI7CisKKwkvKiBTZXR1cCB0aGUgcGF0Y2ggc3RydWN0dXJlICovCisKKwlwYXRwLT5hbXBsaXR1ZGVfYmlhcz1ndXNwYXRjaC52b2x1bWU7CisJcGF0cC0+cG9ydGFtZW50bz0wOworCXBhdHAtPnNhbXBsZV9udW1iZXI9IHNhbXAtPm51bWJlciAmIDB4ZmY7CisJcGF0cC0+c2FtcGxlX21zYj0gc2FtcC0+bnVtYmVyID4+IDg7CisJcGF0cC0+cGl0Y2hfYmVuZD0gLyoxMiovIDA7CisJcGF0cC0+bW9ubz0xOworCXBhdHAtPnJldHJpZ2dlcj0xOworCXBhdHAtPm5vaG9sZD0oZ3VzcGF0Y2gubW9kZSAmIFdBVkVfU1VTVEFJTl9PTikgPyAwOjE7CisJcGF0cC0+ZnJlcXVlbmN5X2JpYXM9MDsKKwlwYXRwLT5yZXN0YXJ0PTA7CisJcGF0cC0+cmV1c2U9MDsKKwlwYXRwLT5yZXNldF9sZm89MTsKKwlwYXRwLT5mbV9zcmMyPTA7CisJcGF0cC0+Zm1fc3JjMT1XRl9NT0RfTU9EX1dIRUVMOworCXBhdHAtPmFtX3NyYz1XRl9NT0RfUFJFU1NVUkU7CisJcGF0cC0+YW1fYW1vdW50PTEyNzsKKwlwYXRwLT5mYzFfbW9kX2Ftb3VudD0wOworCXBhdHAtPmZjMl9tb2RfYW1vdW50PTA7IAorCXBhdHAtPmZtX2Ftb3VudDE9MDsKKwlwYXRwLT5mbV9hbW91bnQyPTA7CisJcGF0cC0+ZW52ZWxvcGUxLmF0dGFja19sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUxLmRlY2F5MV9sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUxLmRlY2F5Ml9sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUxLnN1c3RhaW5fbGV2ZWw9MTI3OworCXBhdHAtPmVudmVsb3BlMS5yZWxlYXNlX2xldmVsPTA7CisJcGF0cC0+ZW52ZWxvcGUyLmF0dGFja192ZWxvY2l0eT0xMjc7CisJcGF0cC0+ZW52ZWxvcGUyLmF0dGFja19sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUyLmRlY2F5MV9sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUyLmRlY2F5Ml9sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUyLnN1c3RhaW5fbGV2ZWw9MTI3OworCXBhdHAtPmVudmVsb3BlMi5yZWxlYXNlX2xldmVsPTA7CisJcGF0cC0+ZW52ZWxvcGUyLmF0dGFja192ZWxvY2l0eT0xMjc7CisJcGF0cC0+cmFuZG9taXplcj0wOworCisJLyogUHJvZ3JhbSBmb3IgdGhpcyBwYXRjaCAqLworCisJcHJvZ3AtPmxheWVyWzBdLnBhdGNoX251bWJlcj0gcGF0LT5udW1iZXI7IC8qIFhYWCBpcyB0aGlzIHJpZ2h0ID8gKi8KKwlwcm9ncC0+bGF5ZXJbMF0ubXV0ZT0xOworCXByb2dwLT5sYXllclswXS5wYW5fb3JfbW9kPTE7CisJcHJvZ3AtPmxheWVyWzBdLnBhbj03OworCXByb2dwLT5sYXllclswXS5taXhfbGV2ZWw9MTI3ICAvKiBndXNwYXRjaC52b2x1bWUgKi87CisJcHJvZ3AtPmxheWVyWzBdLnNwbGl0X3R5cGU9MDsKKwlwcm9ncC0+bGF5ZXJbMF0uc3BsaXRfcG9pbnQ9MDsKKwlwcm9ncC0+bGF5ZXJbMF0ucGxheV9iZWxvdz0wOworCisJZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworCQlwcm9ncC0+bGF5ZXJbaV0ubXV0ZT0wOworCX0KKworCS8qIFNhbXBsZSBkYXRhICovCisKKwlzYW1wcC0+U2FtcGxlUmVzb2x1dGlvbj0oKH5ndXNwYXRjaC5tb2RlICYgV0FWRV8xNl9CSVRTKTw8MSk7CisKKwlmb3IgKGJhc2Vfbm90ZT0wOworCSAgICAgbm90ZV90b19mcmVxIChiYXNlX25vdGUpIDwgZ3VzcGF0Y2guYmFzZV9ub3RlOworCSAgICAgYmFzZV9ub3RlKyspOworCisJaWYgKChndXNwYXRjaC5iYXNlX25vdGUtbm90ZV90b19mcmVxKGJhc2Vfbm90ZSkpCisJICAgID4obm90ZV90b19mcmVxKGJhc2Vfbm90ZSktZ3VzcGF0Y2guYmFzZV9ub3RlKSkKKwkJYmFzZV9ub3RlKys7CisKKwlwcmludGsoS0VSTl9ERUJVRyAicmVmIGZyZXE9JWQsYmFzZSBub3RlPSVkXG4iLAorCSAgICAgICBndXNwYXRjaC5iYXNlX2ZyZXEsCisJICAgICAgIGJhc2Vfbm90ZSk7CisKKwlzYW1wcC0+RnJlcXVlbmN5QmlhcyA9ICgyOTU1MCAtIGxvZzJfMjA0OChndXNwYXRjaC5iYXNlX2ZyZXEpCisJCQkJKyBiYXNlX25vdGUqMTcxKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiRnJlcSBCaWFzIGlzICVkXG4iLCBzYW1wcC0+RnJlcXVlbmN5Qmlhcyk7CisJc2FtcHAtPkxvb3A9KGd1c3BhdGNoLm1vZGUgJiBXQVZFX0xPT1BJTkcpID8gMTowOworCXNhbXBwLT5zYW1wbGVTdGFydE9mZnNldC5GcmFjdGlvbj0wOworCXNhbXBwLT5zYW1wbGVTdGFydE9mZnNldC5JbnRlZ2VyPTA7CisJc2FtcHAtPmxvb3BTdGFydE9mZnNldC5GcmFjdGlvbj0wOworCXNhbXBwLT5sb29wU3RhcnRPZmZzZXQuSW50ZWdlcj1ndXNwYXRjaC5sb29wX3N0YXJ0CisJCT4+KChndXNwYXRjaC5tb2RlJldBVkVfMTZfQklUUykgPyAxOjApOworCXNhbXBwLT5sb29wRW5kT2Zmc2V0LkZyYWN0aW9uPTA7CisJc2FtcHAtPmxvb3BFbmRPZmZzZXQuSW50ZWdlcj1ndXNwYXRjaC5sb29wX2VuZAorCQk+PigoZ3VzcGF0Y2gubW9kZSZXQVZFXzE2X0JJVFMpID8gMTowKTsKKwlzYW1wcC0+c2FtcGxlRW5kT2Zmc2V0LkZyYWN0aW9uPTA7CisJc2FtcHAtPnNhbXBsZUVuZE9mZnNldC5JbnRlZ2VyPWd1c3BhdGNoLmxlbiA+PiAoZ3VzcGF0Y2gubW9kZSYxKTsKKwlzYW1wcC0+QmlkaXJlY3Rpb25hbD0oZ3VzcGF0Y2gubW9kZSZXQVZFX0JJRElSX0xPT1ApID8gMTowOworCXNhbXBwLT5SZXZlcnNlPShndXNwYXRjaC5tb2RlJldBVkVfTE9PUF9CQUNLKSA/IDE6MDsKKworCS8qIE5vdyBzaGlwIGl0IGRvd24gKi8KKworCXdhdmVmcm9udF9zZW5kX3NhbXBsZSAoc2FtcCwKKwkJCSAgICAgICAodW5zaWduZWQgc2hvcnQgX191c2VyICopICYoYWRkcilbc2l6ZW9mX3BhdGNoXSwKKwkJCSAgICAgICAoZ3VzcGF0Y2gubW9kZSAmIFdBVkVfVU5TSUdORUQpID8gMTowKTsKKwl3YXZlZnJvbnRfc2VuZF9wYXRjaCAocGF0KTsKKwl3YXZlZnJvbnRfc2VuZF9wcm9ncmFtIChwcm9nKTsKKworCS8qIE5vdyBwYW4gYXMgYmVzdCB3ZSBjYW4gLi4uIHVzZSB0aGUgc2xhdmUvaW50ZXJuYWwgTUlESSBkZXZpY2UKKwkgICBudW1iZXIgaWYgaXQgZXhpc3RzIChzaW5jZSBpdCB0YWxrcyB0byB0aGUgV2F2ZUZyb250KSwgb3IgdGhlCisJICAgbWFzdGVyIG90aGVyd2lzZS4KKwkqLworCisJaWYgKGRldi5taWRpZGV2ID4gMCkgeworCQltaWRpX3N5bnRoX2NvbnRyb2xsZXIgKGRldi5taWRpZGV2LCBndXNwYXRjaC5pbnN0cl9ubywgMTAsCisJCQkJICAgICAgICgoZ3VzcGF0Y2gucGFubmluZyA8PCA0KSA+IDEyNykgPworCQkJCSAgICAgICAxMjcgOiAoZ3VzcGF0Y2gucGFubmluZyA8PCA0KSk7CisJfQorCXJjID0gMDsKKworZnJlZV9mYWlsOgorCWtmcmVlKHNhbXApOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X2xvYWRfcGF0Y2ggKGNvbnN0IGNoYXIgX191c2VyICphZGRyKQorCisKK3sKKwl3YXZlZnJvbnRfcGF0Y2hfaW5mbyBoZWFkZXI7CisJCisJaWYgKGNvcHlfZnJvbV91c2VyICgmaGVhZGVyLCBhZGRyLCBzaXplb2Yod2F2ZWZyb250X3BhdGNoX2luZm8pIC0KKwkJCSAgICBzaXplb2Yod2F2ZWZyb250X2FueSkpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImJhZCBhZGRyZXNzIGZvciBsb2FkIHBhdGNoLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCURQUklOVCAoV0ZfREVCVUdfTE9BRF9QQVRDSCwgImRvd25sb2FkICIKKwkJCQkgICAgICAiU2FtcGxlIHR5cGU6ICVkICIKKwkJCQkgICAgICAiU2FtcGxlIG51bWJlcjogJWQgIgorCQkJCSAgICAgICJTYW1wbGUgc2l6ZTogJWRcbiIsCisJCQkJICAgICAgaGVhZGVyLnN1YmtleSwKKwkJCQkgICAgICBoZWFkZXIubnVtYmVyLAorCQkJCSAgICAgIGhlYWRlci5zaXplKTsKKworCXN3aXRjaCAoaGVhZGVyLnN1YmtleSkgeworCWNhc2UgV0ZfU1RfU0FNUExFOiAgLyogc2FtcGxlIG9yIHNhbXBsZV9oZWFkZXIsIGJhc2VkIG9uIHBhdGNoLT5zaXplICovCisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCh1bnNpZ25lZCBjaGFyICopICZoZWFkZXIuaGRyLnMsCisJCQkJICAgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIGhlYWRlci5oZHJwdHIsCisJCQkJICAgc2l6ZW9mICh3YXZlZnJvbnRfc2FtcGxlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gd2F2ZWZyb250X3NlbmRfc2FtcGxlICgmaGVhZGVyLCBoZWFkZXIuZGF0YXB0ciwgMCk7CisKKwljYXNlIFdGX1NUX01VTFRJU0FNUExFOgorCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGVhZGVyLmhkci5zLCBoZWFkZXIuaGRycHRyLAorCQkJCSAgIHNpemVvZih3YXZlZnJvbnRfbXVsdGlzYW1wbGUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiB3YXZlZnJvbnRfc2VuZF9tdWx0aXNhbXBsZSAoJmhlYWRlcik7CisKKworCWNhc2UgV0ZfU1RfQUxJQVM6CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZoZWFkZXIuaGRyLmEsIGhlYWRlci5oZHJwdHIsCisJCQkJICAgc2l6ZW9mICh3YXZlZnJvbnRfYWxpYXMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiB3YXZlZnJvbnRfc2VuZF9hbGlhcyAoJmhlYWRlcik7CisKKwljYXNlIFdGX1NUX0RSVU06CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGVhZGVyLmhkci5kLCBoZWFkZXIuaGRycHRyLAorCQkJCSAgIHNpemVvZiAod2F2ZWZyb250X2RydW0pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiB3YXZlZnJvbnRfc2VuZF9kcnVtICgmaGVhZGVyKTsKKworCWNhc2UgV0ZfU1RfUEFUQ0g6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGVhZGVyLmhkci5wLCBoZWFkZXIuaGRycHRyLAorCQkJCSAgIHNpemVvZiAod2F2ZWZyb250X3BhdGNoKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gd2F2ZWZyb250X3NlbmRfcGF0Y2ggKCZoZWFkZXIpOworCisJY2FzZSBXRl9TVF9QUk9HUkFNOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmhlYWRlci5oZHIucHIsIGhlYWRlci5oZHJwdHIsCisJCQkJICAgc2l6ZW9mICh3YXZlZnJvbnRfcHJvZ3JhbSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIHdhdmVmcm9udF9zZW5kX3Byb2dyYW0gKCZoZWFkZXIpOworCisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ1bmtub3duIHBhdGNoIHR5cGUgJWQuXG4iLAorCQkJaGVhZGVyLnN1YmtleSk7CisJCXJldHVybiAtKEVJTlZBTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1dhdmVGcm9udDogL2Rldi9zZXF1ZW5jZXJ7LDJ9IGFuZCBvdGhlciBoYXJkd2FyZS1kZXBlbmRlbnQgaW50ZXJmYWNlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX3NhbXBsZV9oZHIgKFVDSEFSOCAqYnVmKQorCit7CisJd2F2ZWZyb250X3NhbXBsZSBzOworCVVDSEFSOCAqcHRyOworCisJcHRyID0gYnVmOworCisJLyogVGhlIGJvYXJkIGRvZXNuJ3Qgc2VuZCB1cyBhbiBleGFjdCBjb3B5IG9mIGEgIndhdmVmcm9udF9zYW1wbGUiCisJICAgaW4gcmVzcG9uc2UgdG8gYW4gVXBsb2FkIFNhbXBsZSBIZWFkZXIgY29tbWFuZC4gSW5zdGVhZCwgd2UgCisJICAgaGF2ZSB0byBjb252ZXJ0IHRoZSBkYXRhIGZvcm1hdCBiYWNrIGludG8gb3VyIGRhdGEgc3RydWN0dXJlLAorCSAgIGp1c3QgYXMgaW4gdGhlIERvd25sb2FkIFNhbXBsZSBjb21tYW5kLCB3aGVyZSB3ZSBoYXZlIHRvIGRvCisJICAgc29tZXRoaW5nIHZlcnkgc2ltaWxhciBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24uCisJKi8KKworCSooKFVJTlQzMiAqKSAmcy5zYW1wbGVTdGFydE9mZnNldCkgPSBkZW11bmdlX2ludDMyIChwdHIsIDQpOyBwdHIgKz0gNDsKKwkqKChVSU5UMzIgKikgJnMubG9vcFN0YXJ0T2Zmc2V0KSA9IGRlbXVuZ2VfaW50MzIgKHB0ciwgNCk7IHB0ciArPSA0OworCSooKFVJTlQzMiAqKSAmcy5sb29wRW5kT2Zmc2V0KSA9IGRlbXVuZ2VfaW50MzIgKHB0ciwgNCk7IHB0ciArPSA0OworCSooKFVJTlQzMiAqKSAmcy5zYW1wbGVFbmRPZmZzZXQpID0gZGVtdW5nZV9pbnQzMiAocHRyLCA0KTsgcHRyICs9IDQ7CisJKigoVUlOVDMyICopICZzLkZyZXF1ZW5jeUJpYXMpID0gZGVtdW5nZV9pbnQzMiAocHRyLCAzKTsgcHRyICs9IDM7CisKKwlzLlNhbXBsZVJlc29sdXRpb24gPSAqcHRyICYgMHgzOworCXMuTG9vcCA9ICpwdHIgJiAweDg7CisJcy5CaWRpcmVjdGlvbmFsID0gKnB0ciAmIDB4MTA7CisJcy5SZXZlcnNlID0gKnB0ciAmIDB4NDA7CisKKwkvKiBOb3cgY29weSBpdCBiYWNrIHRvIHdoZXJlIGl0IGNhbWUgZnJvbSAqLworCisJbWVtY3B5IChidWYsICh1bnNpZ25lZCBjaGFyICopICZzLCBzaXplb2YgKHdhdmVmcm9udF9zYW1wbGUpKTsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X3N5bnRoX2NvbnRyb2wgKGludCBjbWQsIHdhdmVmcm9udF9jb250cm9sICp3YykKKworeworCXVuc2lnbmVkIGNoYXIgcGF0Y2hudW1idWZbMl07CisJaW50IGk7CisKKwlEUFJJTlQgKFdGX0RFQlVHX0NNRCwgInN5bnRoIGNvbnRyb2wgd2l0aCAiCisJCSJjbWQgMHgleFxuIiwgd2MtPmNtZCk7CisKKwkvKiBQcmUtaGFuZGxpbmcgb2Ygb3IgZm9yIHZhcmlvdXMgY29tbWFuZHMgKi8KKworCXN3aXRjaCAod2MtPmNtZCkgeworCWNhc2UgV0ZDX0RJU0FCTEVfSU5URVJSVVBUUzoKKwkJcHJpbnRrIChLRVJOX0lORk8gTE9HTkFNRSAiaW50ZXJydXB0cyBkaXNhYmxlZC5cbiIpOworCQlvdXRiICgweDgwfDB4MjAsIGRldi5jb250cm9sX3BvcnQpOworCQlkZXYuaW50ZXJydXB0c19vbiA9IDA7CisJCXJldHVybiAwOworCisJY2FzZSBXRkNfRU5BQkxFX0lOVEVSUlVQVFM6CisJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUgImludGVycnVwdHMgZW5hYmxlZC5cbiIpOworCQlvdXRiICgweDgwfDB4NDB8MHgyMCwgZGV2LmNvbnRyb2xfcG9ydCk7CisJCWRldi5pbnRlcnJ1cHRzX29uID0gMTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdGQ19JTlRFUlJVUFRfU1RBVFVTOgorCQl3Yy0+cmJ1ZlswXSA9IGRldi5pbnRlcnJ1cHRzX29uOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0ZDX1JPTVNBTVBMRVNfUkRPTkxZOgorCQlkZXYucm9tX3NhbXBsZXNfcmRvbmx5ID0gd2MtPndidWZbMF07CisJCXdjLT5zdGF0dXMgPSAwOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0ZDX0lERU5USUZZX1NMT1RfVFlQRToKKwkJaSA9IHdjLT53YnVmWzBdIHwgKHdjLT53YnVmWzFdIDw8IDcpOworCQlpZiAoaSA8MCB8fCBpID49IFdGX01BWF9TQU1QTEUpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImludmFsaWQgc2xvdCBJRCAlZFxuIiwKKwkJCQlpKTsKKwkJCXdjLT5zdGF0dXMgPSBFSU5WQUw7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl3Yy0+cmJ1ZlswXSA9IGRldi5zYW1wbGVfc3RhdHVzW2ldOworCQl3Yy0+c3RhdHVzID0gMDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdGQ19ERUJVR19EUklWRVI6CisJCWRldi5kZWJ1ZyA9IHdjLT53YnVmWzBdOworCQlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FICJkZWJ1ZyA9IDB4JXhcbiIsIGRldi5kZWJ1Zyk7CisJCXJldHVybiAwOworCisJY2FzZSBXRkNfRlhfSU9DVEw6CisJCXdmZnhfaW9jdGwgKCh3YXZlZnJvbnRfZnhfaW5mbyAqKSAmd2MtPndidWZbMF0pOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0ZDX1VQTE9BRF9QQVRDSDoKKwkJbXVuZ2VfaW50MzIgKCooKFVJTlQzMiAqKSB3Yy0+d2J1ZiksIHBhdGNobnVtYnVmLCAyKTsKKwkJbWVtY3B5ICh3Yy0+d2J1ZiwgcGF0Y2hudW1idWYsIDIpOworCQlicmVhazsKKworCWNhc2UgV0ZDX1VQTE9BRF9NVUxUSVNBTVBMRToKKwkJLyogbXVsdGlzYW1wbGVzIGhhdmUgdG8gYmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYW5kCisJCSAgIGNhbm5vdCBiZSBkZWFsdCB3aXRoIHByb3Blcmx5IGJ5IHdhdmVmcm9udF9jbWQoKSBhbG9uZS4KKwkJKi8KKwkJd2MtPnN0YXR1cyA9IHdhdmVmcm9udF9mZXRjaF9tdWx0aXNhbXBsZQorCQkJKCh3YXZlZnJvbnRfcGF0Y2hfaW5mbyAqKSB3Yy0+cmJ1Zik7CisJCXJldHVybiAwOworCisJY2FzZSBXRkNfVVBMT0FEX1NBTVBMRV9BTElBUzoKKwkJcHJpbnRrIChLRVJOX0lORk8gTE9HTkFNRSAic3VwcG9ydCBmb3Igc2FtcGxlIGFsaWFzIHVwbG9hZCAiCisJCQkiYmVpbmcgY29uc2lkZXJlZC5cbiIpOworCQl3Yy0+c3RhdHVzID0gRUlOVkFMOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3Yy0+c3RhdHVzID0gd2F2ZWZyb250X2NtZCAod2MtPmNtZCwgd2MtPnJidWYsIHdjLT53YnVmKTsKKworCS8qIFBvc3QtaGFuZGxpbmcgb2YgY2VydGFpbiBjb21tYW5kcy4KKworCSAgIEluIHBhcnRpY3VsYXIsIGlmIHRoZSBjb21tYW5kIHdhcyBhbiB1cGxvYWQsIGRlbXVuZ2UgdGhlIGRhdGEKKwkgICBzbyB0aGF0IHRoZSB1c2VyLWxldmVsIGRvZXNuJ3QgaGF2ZSB0byB0aGluayBhYm91dCBpdC4KKwkqLworCisJaWYgKHdjLT5zdGF0dXMgPT0gMCkgeworCQlzd2l0Y2ggKHdjLT5jbWQpIHsKKwkJCS8qIGludGVyY2VwdCBhbnkgZnJlZW1lbSByZXF1ZXN0cyBzbyB0aGF0IHdlIGtub3cKKwkJCSAgIHdlIGFyZSBhbHdheXMgY3VycmVudCB3aXRoIHRoZSB1c2VyLWxldmVsIHZpZXcKKwkJCSAgIG9mIHRoaW5ncy4KKwkJCSovCisKKwkJY2FzZSBXRkNfUkVQT1JUX0ZSRUVfTUVNT1JZOgorCQkJZGV2LmZyZWVtZW0gPSBkZW11bmdlX2ludDMyICh3Yy0+cmJ1ZiwgNCk7CisJCQlicmVhazsKKworCQljYXNlIFdGQ19VUExPQURfUEFUQ0g6CisJCQlkZW11bmdlX2J1ZiAod2MtPnJidWYsIHdjLT5yYnVmLCBXRl9QQVRDSF9CWVRFUyk7CisJCQlicmVhazsKKworCQljYXNlIFdGQ19VUExPQURfUFJPR1JBTToKKwkJCWRlbXVuZ2VfYnVmICh3Yy0+cmJ1Ziwgd2MtPnJidWYsIFdGX1BST0dSQU1fQllURVMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXRkNfVVBMT0FEX0VEUlVNX1BST0dSQU06CisJCQlkZW11bmdlX2J1ZiAod2MtPnJidWYsIHdjLT5yYnVmLCBXRl9EUlVNX0JZVEVTIC0gMSk7CisJCQlicmVhazsKKworCQljYXNlIFdGQ19VUExPQURfU0FNUExFX0hFQURFUjoKKwkJCXByb2Nlc3Nfc2FtcGxlX2hkciAod2MtPnJidWYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXRkNfVVBMT0FEX1NBTVBMRV9BTElBUzoKKwkJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUgInN1cHBvcnQgZm9yICIKKwkJCQkic2FtcGxlIGFsaWFzZXMgc3RpbGwgIgorCQkJCSJiZWluZyBjb25zaWRlcmVkLlxuIik7CisJCQlicmVhazsKKworCQljYXNlIFdGQ19WTUlESV9PRkY6CisJCQlpZiAodmlydHVhbF9taWRpX2Rpc2FibGUgKCkgPCAwKSB7CisJCQkJcmV0dXJuIC0oRUlPKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgV0ZDX1ZNSURJX09OOgorCQkJaWYgKHZpcnR1YWxfbWlkaV9lbmFibGUgKCkgPCAwKSB7CisJCQkJcmV0dXJuIC0oRUlPKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdhdmVGcm9udDogTGludXggZmlsZSBzeXN0ZW0gaW50ZXJmYWNlIChmb3IgYWNjZXNzIHZpYSByYXcgc3ludGgpICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgCit3YXZlZnJvbnRfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogWFhYIGZpeCBtZSAqLworCWRldi5vcGVuZWQgPSBmaWxlLT5mX2ZsYWdzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlsb2NrX2tlcm5lbCgpOworCWRldi5vcGVuZWQgPSAwOworCWRldi5kZWJ1ZyA9IDA7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXdhdmVmcm9udF9jb250cm9sIHdjOworCWludCBlcnI7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBXRkNUTF9XRkNNRDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ3YywgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mICh3YykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCQlpZiAoKGVyciA9IHdhdmVmcm9udF9zeW50aF9jb250cm9sIChjbWQsICZ3YykpID09IDApIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIgKCh2b2lkIF9fdXNlciAqKSBhcmcsICZ3Yywgc2l6ZW9mICh3YykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmV0dXJuIGVycjsKKwkJCisJY2FzZSBXRkNUTF9MT0FEX1NQUDoKKwkJcmV0dXJuIHdhdmVmcm9udF9sb2FkX3BhdGNoICgoY29uc3QgY2hhciBfX3VzZXIgKikgYXJnKTsKKwkJCisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAiaW52YWxpZCBpb2N0bCAlI3hcbiIsIGNtZCk7CisJCXJldHVybiAtKEVJTlZBTCk7CisKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3YXZlZnJvbnRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IHdhdmVmcm9udF9pb2N0bCwKKwkub3BlbgkJPSB3YXZlZnJvbnRfb3BlbiwKKwkucmVsZWFzZQk9IHdhdmVmcm9udF9yZWxlYXNlLAorfTsKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV2F2ZUZyb250OiBPU1MgaW5zdGFsbGF0aW9uIGFuZCBzdXBwb3J0IGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgT1NTX1NVUFBPUlRfTEVWRUwgJiBPU1NfU1VQUE9SVF9TRVEKKworc3RhdGljIHN0cnVjdCBzeW50aF9pbmZvIHdhdmVmcm9udF9pbmZvID0KK3siVHVydGxlIEJlYWNoIFdhdmVGcm9udCIsIDAsIFNZTlRIX1RZUEVfU0FNUExFLCBTQU1QTEVfVFlQRV9XQVZFRlJPTlQsCisgMCwgMzIsIDAsIDAsIFNZTlRIX0NBUF9JTlBVVH07CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9vc3Nfb3BlbiAoaW50IGRldm5vLCBpbnQgbW9kZSkKKworeworCWRldi5vcGVuZWQgPSBtb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAord2F2ZWZyb250X29zc19jbG9zZSAoaW50IGRldm5vKQorCit7CisJZGV2Lm9wZW5lZCA9IDA7CisJZGV2LmRlYnVnID0gMDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9vc3NfaW9jdGwgKGludCBkZXZubywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCisKK3sKKwl3YXZlZnJvbnRfY29udHJvbCB3YzsKKwlpbnQgZXJyOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORENUTF9TWU5USF9JTkZPOgorCQlpZihjb3B5X3RvX3VzZXIoYXJnLCAmd2F2ZWZyb250X2luZm8sIHNpemVvZiAod2F2ZWZyb250X2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX1NFUV9SRVNFVFNBTVBMRVM6CisvLwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAiZHJpdmVyIGNhbm5vdCByZXNldCBzYW1wbGVzLlxuIik7CisJCXJldHVybiAwOyAvKiBkb24ndCBmb3JjZSBhbiBlcnJvciAqLworCisJY2FzZSBTTkRDVExfU0VRX1BFUkNNT0RFOgorCQlyZXR1cm4gMDsgLyogZG9uJ3QgZm9yY2UgYW4gZXJyb3IgKi8KKworCWNhc2UgU05EQ1RMX1NZTlRIX01FTUFWTDoKKwkJaWYgKChkZXYuZnJlZW1lbSA9IHdhdmVmcm9udF9mcmVlbWVtICgpKSA8IDApIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiY2Fubm90IGdldCBtZW1vcnkgc2l6ZVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBkZXYuZnJlZW1lbTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX1NZTlRIX0NPTlRST0w6CisJCWlmKGNvcHlfZnJvbV91c2VyICgmd2MsIGFyZywgc2l6ZW9mICh3YykpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJZWxzZSBpZiAoKGVyciA9IHdhdmVmcm9udF9zeW50aF9jb250cm9sIChjbWQsICZ3YykpID09IDApIHsKKwkJCWlmKGNvcHlfdG9fdXNlciAoYXJnLCAmd2MsIHNpemVvZiAod2MpKSkKKwkJCQllcnIgPSAtRUZBVUxUOworCQl9CisKKwkJcmV0dXJuIGVycjsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtKEVJTlZBTCk7CisJfQorfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfb3NzX2xvYWRfcGF0Y2ggKGludCBkZXZubywgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJCQkgIGludCBvZmZzLCBpbnQgY291bnQsIGludCBwbWdyX2ZsYWcpCit7CisKKwlpZiAoZm9ybWF0ID09IFNZU0VYX1BBVENIKSB7CS8qIEhhbmRsZWQgYnkgbWlkaV9zeW50aC5jICovCisJCWlmIChtaWRpX2xvYWRfcGF0Y2ggPT0gTlVMTCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FCisJCQkJIlNZU0VYIG5vdCBsb2FkYWJsZTogIgorCQkJCSJubyBtaWRpIHBhdGNoIGxvYWRlciFcbiIpOworCQkJcmV0dXJuIC0oRUlOVkFMKTsKKwkJfQorCisJCXJldHVybiBtaWRpX2xvYWRfcGF0Y2ggKGRldm5vLCBmb3JtYXQsIGFkZHIsCisJCQkJCW9mZnMsIGNvdW50LCBwbWdyX2ZsYWcpOworCisJfSBlbHNlIGlmIChmb3JtYXQgPT0gR1VTX1BBVENIKSB7CisJCXJldHVybiB3YXZlZnJvbnRfbG9hZF9ndXNfcGF0Y2ggKGRldm5vLCBmb3JtYXQsCisJCQkJCQkgYWRkciwgb2ZmcywgY291bnQsIHBtZ3JfZmxhZyk7CisKKwl9IGVsc2UgaWYgKGZvcm1hdCAhPSBXQVZFRlJPTlRfUEFUQ0gpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ1bmtub3duIHBhdGNoIGZvcm1hdCAlZFxuIiwgZm9ybWF0KTsKKwkJcmV0dXJuIC0oRUlOVkFMKTsKKwl9CisKKwlpZiAoY291bnQgPCBzaXplb2YgKHdhdmVmcm9udF9wYXRjaF9pbmZvKSkgeworCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgInNhbXBsZSBoZWFkZXIgdG9vIHNob3J0XG4iKTsKKwkJcmV0dXJuIC0oRUlOVkFMKTsKKwl9CisKKwkvKiAiYWRkciIgcG9pbnRzIHRvIGEgdXNlci1zcGFjZSB3YXZlZnJvbnRfcGF0Y2hfaW5mbyAqLworCisJcmV0dXJuIHdhdmVmcm9udF9sb2FkX3BhdGNoIChhZGRyKTsKK30JCisKK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyB3YXZlZnJvbnRfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pZAkJPSAiV2F2ZUZyb250IiwKKwkuaW5mbwkJPSAmd2F2ZWZyb250X2luZm8sCisJLm1pZGlfZGV2CT0gMCwKKwkuc3ludGhfdHlwZQk9IFNZTlRIX1RZUEVfU0FNUExFLAorCS5zeW50aF9zdWJ0eXBlCT0gU0FNUExFX1RZUEVfV0FWRUZST05ULAorCS5vcGVuCQk9IHdhdmVmcm9udF9vc3Nfb3BlbiwKKwkuY2xvc2UJCT0gd2F2ZWZyb250X29zc19jbG9zZSwKKwkuaW9jdGwJCT0gd2F2ZWZyb250X29zc19pb2N0bCwKKwkua2lsbF9ub3RlCT0gbWlkaV9zeW50aF9raWxsX25vdGUsCisJLnN0YXJ0X25vdGUJPSBtaWRpX3N5bnRoX3N0YXJ0X25vdGUsCisJLnNldF9pbnN0cgk9IG1pZGlfc3ludGhfc2V0X2luc3RyLAorCS5yZXNldAkJPSBtaWRpX3N5bnRoX3Jlc2V0LAorCS5sb2FkX3BhdGNoCT0gbWlkaV9zeW50aF9sb2FkX3BhdGNoLAorCS5hZnRlcnRvdWNoCT0gbWlkaV9zeW50aF9hZnRlcnRvdWNoLAorCS5jb250cm9sbGVyCT0gbWlkaV9zeW50aF9jb250cm9sbGVyLAorCS5wYW5uaW5nCT0gbWlkaV9zeW50aF9wYW5uaW5nLAorCS5iZW5kZXIJCT0gbWlkaV9zeW50aF9iZW5kZXIsCisJLnNldHVwX3ZvaWNlCT0gbWlkaV9zeW50aF9zZXR1cF92b2ljZQorfTsKKyNlbmRpZiAvKiBPU1NfU1VQUE9SVF9TRVEgKi8KKworI2lmIE9TU19TVVBQT1JUX0xFVkVMICYgT1NTX1NVUFBPUlRfU1RBVElDX0lOU1RBTEwKKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF93YXZlZnJvbnQgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKyAgICAodm9pZCkgaW5zdGFsbF93YXZlZnJvbnQgKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX3dhdmVmcm9udCAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworICAgIHJldHVybiAhZGV0ZWN0X3dhdmVmcm9udCAoaHdfY29uZmlnLT5pcnEsIGh3X2NvbmZpZy0+aW9fYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfd2F2ZWZyb250IChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpIAoreworICAgICh2b2lkKSB1bmluc3RhbGxfd2F2ZWZyb250ICgpOworfQorCisjZW5kaWYgLyogT1NTX1NVUFBPUlRfU1RBVElDX0lOU1RBTEwgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV2F2ZUZyb250OiBMaW51eCBtb2R1bGFyIHNvdW5kIGtlcm5lbCBpbnN0YWxsYXRpb24gaW50ZXJmYWNlICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK3dhdmVmcm9udGludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpCit7CisJc3RydWN0IHdmX2NvbmZpZyAqaHcgPSBkZXZfaWQ7CisKKwkvKgorCSAgIFNvbWUgY29tbWVudHMgb24gaW50ZXJydXB0cy4gSSBhdHRlbXB0ZWQgYSB2ZXJzaW9uIG9mIHRoaXMKKwkgICBkcml2ZXIgdGhhdCB1c2VkIGludGVycnVwdHMgdGhyb3VnaG91dCB0aGUgY29kZSBpbnN0ZWFkIG9mCisJICAgZG9pbmcgYnVzeSBhbmQvb3Igc2xlZXAtd2FpdGluZy4gQWxhcywgaXQgYXBwZWFycyB0aGF0IG9uY2UKKwkgICB0aGUgTW90b3JvbGEgZmlybXdhcmUgaXMgZG93bmxvYWRlZCwgdGhlIGNhcmQgKm5ldmVyKgorCSAgIGdlbmVyYXRlcyBhbiBSWCBpbnRlcnJ1cHQuIFRoZXNlIGFyZSBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkCisJICAgZHVyaW5nIGZpcm13YXJlIGxvYWRpbmcsIGFuZCBhZnRlciB0aGF0IHdhdmVmcm9udF9zdGF0dXMoKQorCSAgIHJlcG9ydHMgdGhhdCBhbiBpbnRlcnJ1cHQgaXMgcGVuZGluZyBvbiB0aGUgY2FyZCBmcm9tIHRpbWUKKwkgICB0byB0aW1lLCBidXQgaXQgbmV2ZXIgc2VlbXMgdG8gYmUgZGVsaXZlcmVkIHRvIHRoaXMKKwkgICBkcml2ZXIuIE5vdGUgYWxzbyB0aGF0IHdhdmVmcm9udF9zdGF0dXMoKSBjb250aW51ZXMgdG8KKwkgICByZXBvcnQgdGhhdCBSWCBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLCBzdWdnZXN0aW5nIHRoYXQgSQorCSAgIGRpZG4ndCBnb29mIHVwIGFuZCBkaXNhYmxlIHRoZW0gYnkgbWlzdGFrZS4KKworCSAgIFRodXMsIEkgc3RlcHBlZCBiYWNrIHRvIGEgcHJpb3IgdmVyc2lvbiBvZgorCSAgIHdhdmVmcm9udF93YWl0KCksIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHRoaXMgcmVhbGx5CisJICAgbWF0dGVycy4gSXRzIHNhZCwgYnV0IEkndmUgbG9va2VkIHRocm91Z2ggdGhlIGNvZGUgdG8gY2hlY2sKKwkgICBvbiB0aGluZ3MsIGFuZCBJIHJlYWxseSBmZWVsIGNlcnRhaW4gdGhhdCB0aGUgTW90b3JvbGEKKwkgICBmaXJtd2FyZSBwcmV2ZW50cyBSWC1yZWFkeSBpbnRlcnJ1cHRzLgorCSovCisKKwlpZiAoKHdhdmVmcm9udF9zdGF0dXMoKSAmIChTVEFUX0lOVFJfUkVBRHxTVEFUX0lOVFJfV1JJVEUpKSA9PSAwKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlody0+aXJxX29rID0gMTsKKwlody0+aXJxX2NudCsrOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJmh3LT5pbnRlcnJ1cHRfc2xlZXBlcik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBTVEFUVVMgUkVHSVNURVIgCisKKzAgSG9zdCBSeCBJbnRlcnJ1cHQgRW5hYmxlICgxPUVuYWJsZWQpCisxIEhvc3QgUnggUmVnaXN0ZXIgRnVsbCAoMT1GdWxsKQorMiBIb3N0IFJ4IEludGVycnVwdCBQZW5kaW5nICgxPUludGVycnVwdCkKKzMgVW51c2VkCis0IEhvc3QgVHggSW50ZXJydXB0ICgxPUVuYWJsZWQpCis1IEhvc3QgVHggUmVnaXN0ZXIgZW1wdHkgKDE9RW1wdHkpCis2IEhvc3QgVHggSW50ZXJydXB0IFBlbmRpbmcgKDE9SW50ZXJydXB0KQorNyBVbnVzZWQKKyovCisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9pbnRlcnJ1cHRfYml0cyAoaW50IGlycSkKKworeworCWludCBiaXRzOworCisJc3dpdGNoIChpcnEpIHsKKwljYXNlIDk6CisJCWJpdHMgPSAweDAwOworCQlicmVhazsKKwljYXNlIDU6CisJCWJpdHMgPSAweDA4OworCQlicmVhazsKKwljYXNlIDEyOgorCQliaXRzID0gMHgxMDsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJYml0cyA9IDB4MTg7CisJCWJyZWFrOworCQorCWRlZmF1bHQ6CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImludmFsaWQgSVJRICVkXG4iLCBpcnEpOworCQliaXRzID0gLTE7CisJfQorCisJcmV0dXJuIGJpdHM7Cit9CisKK3N0YXRpYyB2b2lkCit3YXZlZnJvbnRfc2hvdWxkX2NhdXNlX2ludGVycnVwdCAoaW50IHZhbCwgaW50IHBvcnQsIGludCB0aW1lb3V0KQorCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHRoaXMgd2lsbCBub3QgaGVscCBvbiBTTVAgLSBidXQgYXQgbGVhc3QgaXQgY29tcGlsZXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCWRldi5pcnFfb2sgPSAwOworCW91dGIgKHZhbCxwb3J0KTsKKwlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQgKCZkZXYuaW50ZXJydXB0X3NsZWVwZXIsIHRpbWVvdXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB3YXZlZnJvbnRfaHdfcmVzZXQgKHZvaWQpCit7CisJaW50IGJpdHM7CisJaW50IGh3dlsyXTsKKwl1bnNpZ25lZCBsb25nIGlycV9tYXNrOworCXNob3J0IHJlcG9ydGVkX2lycTsKKworCS8qIElSUSBhbHJlYWR5IGNoZWNrZWQgaW4gaW5pdF9tb2R1bGUoKSAqLworCisJYml0cyA9IHdhdmVmcm9udF9pbnRlcnJ1cHRfYml0cyAoZGV2LmlycSk7CisKKwlwcmludGsgKEtFUk5fREVCVUcgTE9HTkFNRSAiYXV0b2RldGVjdGluZyBXYXZlRnJvbnQgSVJRXG4iKTsKKworCWlycV9tYXNrID0gcHJvYmVfaXJxX29uICgpOworCisJb3V0YiAoMHgwLCBkZXYuY29udHJvbF9wb3J0KTsgCisJb3V0YiAoMHg4MCB8IDB4NDAgfCBiaXRzLCBkZXYuZGF0YV9wb3J0KTsJCisJd2F2ZWZyb250X3Nob3VsZF9jYXVzZV9pbnRlcnJ1cHQoMHg4MHwweDQwfDB4MTB8MHgxLAorCQkJCQkgZGV2LmNvbnRyb2xfcG9ydCwKKwkJCQkJIChyZXNldF90aW1lKkhaKS8xMDApOworCisJcmVwb3J0ZWRfaXJxID0gcHJvYmVfaXJxX29mZiAoaXJxX21hc2spOworCisJaWYgKHJlcG9ydGVkX2lycSAhPSBkZXYuaXJxKSB7CisJCWlmIChyZXBvcnRlZF9pcnEgPT0gMCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FCisJCQkJIk5vIHVuYXNzaWduZWQgaW50ZXJydXB0cyBkZXRlY3RlZCAiCisJCQkJImFmdGVyIGgvdyByZXNldFxuIik7CisJCX0gZWxzZSBpZiAocmVwb3J0ZWRfaXJxIDwgMCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FCisJCQkJIk11bHRpcGxlIHVuYXNzaWduZWQgaW50ZXJydXB0cyBkZXRlY3RlZCAiCisJCQkJImFmdGVyIGgvdyByZXNldFxuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgImF1dG9kZXRlY3RlZCBJUlEgJWQgbm90IHRoZSAiCisJCQkJInZhbHVlIHByb3ZpZGVkICglZClcbiIsIHJlcG9ydGVkX2lycSwKKwkJCQlkZXYuaXJxKTsKKwkJfQorCQlkZXYuaXJxID0gLTE7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUgImF1dG9kZXRlY3RlZCBJUlEgYXQgJWRcbiIsCisJCQlyZXBvcnRlZF9pcnEpOworCX0KKworCWlmIChyZXF1ZXN0X2lycSAoZGV2LmlycSwgd2F2ZWZyb250aW50ciwKKwkJCSBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsCisJCQkgIndhdmVmcm9udCBzeW50aCIsICZkZXYpIDwgMCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJJUlEgJWQgbm90IGF2YWlsYWJsZSFcbiIsCisJCQlkZXYuaXJxKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogdHJ5IHJlc2V0IG9mIHBvcnQgKi8KKyAgICAgIAorCW91dGIgKDB4MCwgZGV2LmNvbnRyb2xfcG9ydCk7IAorICAKKwkvKiBBdCB0aGlzIHBvaW50LCB0aGUgYm9hcmQgaXMgaW4gcmVzZXQsIGFuZCB0aGUgSC9XIGluaXRpYWxpemF0aW9uCisJICAgcmVnaXN0ZXIgaXMgYWNjZXNzZWQgYXQgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgZGF0YSBwb3J0LgorICAgICAKKwkgICBCaXQgNyAtIEVuYWJsZSBJUlEgRHJpdmVyCQorCSAgIDAgLSBUcmktc3RhdGUgdGhlIFdhdmUtQm9hcmQgZHJpdmVycyBmb3IgdGhlIFBDIEJ1cyBJUlFzCisJICAgMSAtIEVuYWJsZSBJUlEgc2VsZWN0ZWQgYnkgYml0cyA1OjMgdG8gYmUgZHJpdmVuIG9udG8gdGhlIFBDIEJ1cy4KKyAgICAgCisJICAgQml0IDYgLSBNSURJIEludGVyZmFjZSBTZWxlY3QKKworCSAgIDAgLSBVc2UgdGhlIE1JREkgSW5wdXQgZnJvbSB0aGUgMjYtcGluIFdhdmVCbGFzdGVyCisJICAgY29tcGF0aWJsZSBoZWFkZXIgYXMgdGhlIHNlcmlhbCBNSURJIHNvdXJjZQorCSAgIDEgLSBVc2UgdGhlIE1JREkgSW5wdXQgZnJvbSB0aGUgOS1waW4gRCBjb25uZWN0b3IgYXMgdGhlCisJICAgc2VyaWFsIE1JREkgc291cmNlLgorICAgICAKKwkgICBCaXRzIDU6MyAtIElSUSBTZWxlY3Rpb24KKwkgICAwIDAgMCAtIElSUSAyLzkKKwkgICAwIDAgMSAtIElSUSA1CisJICAgMCAxIDAgLSBJUlEgMTIKKwkgICAwIDEgMSAtIElSUSAxNQorCSAgIDEgMCAwIC0gUmVzZXJ2ZWQKKwkgICAxIDAgMSAtIFJlc2VydmVkCisJICAgMSAxIDAgLSBSZXNlcnZlZAorCSAgIDEgMSAxIC0gUmVzZXJ2ZWQKKyAgICAgCisJICAgQml0cyAyOjEgLSBSZXNlcnZlZAorCSAgIEJpdCAwIC0gRGlzYWJsZSBCb290IFJPTQorCSAgIDAgLSBtZW1vcnkgYWNjZXNzZXMgdG8gMDNGQzMwLTAzRkZGRkggdXRpbGl6ZSB0aGUgaW50ZXJuYWwgQm9vdCBST00KKwkgICAxIC0gbWVtb3J5IGFjY2Vzc2VzIHRvIDAzRkMzMC0wM0ZGRkZIIGFyZSBkaXJlY3RlZCB0byBleHRlcm5hbCAKKwkgICBzdG9yYWdlLgorICAgICAKKwkqLworCisJLyogY29uZmlndXJlIGhhcmR3YXJlOiBJUlEsIGVuYWJsZSBpbnRlcnJ1cHRzLCAKKwkgICBwbHVzIGV4dGVybmFsIDktcGluIE1JREkgaW50ZXJmYWNlIHNlbGVjdGVkCisJKi8KKworCW91dGIgKDB4ODAgfCAweDQwIHwgYml0cywgZGV2LmRhdGFfcG9ydCk7CQorICAKKwkvKiBDT05UUk9MIFJFR0lTVEVSCisKKwkgICAwIEhvc3QgUnggSW50ZXJydXB0IEVuYWJsZSAoMT1FbmFibGVkKSAgICAgIDB4MQorCSAgIDEgVW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisJICAgMiBVbnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKwkgICAzIFVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorCSAgIDQgSG9zdCBUeCBJbnRlcnJ1cHQgRW5hYmxlICAgICAgICAgICAgICAgICAweDEwCisJICAgNSBNdXRlICgwPU11dGU7IDE9UGxheSkgICAgICAgICAgICAgICAgICAgIDB4MjAKKwkgICA2IE1hc3RlciBJbnRlcnJ1cHQgRW5hYmxlICgxPUVuYWJsZWQpICAgICAgMHg0MAorCSAgIDcgTWFzdGVyIFJlc2V0ICgwPVJlc2V0OyAxPVJ1bikgICAgICAgICAgICAweDgwCisKKwkgICBUYWtlIHVzIG91dCBvZiByZXNldCwgbXV0ZSBvdXRwdXQsIG1hc3RlciArIFRYICsgUlggaW50ZXJydXB0cyBvbi4KKwkgICAKKwkgICBXZSdsbCBnZXQgYW4gaW50ZXJydXB0IHByZXN1bWFibHkgdG8gdGVsbCB1cyB0aGF0IHRoZSBUWAorCSAgIHJlZ2lzdGVyIGlzIGNsZWFyLgorCSovCisKKwl3YXZlZnJvbnRfc2hvdWxkX2NhdXNlX2ludGVycnVwdCgweDgwfDB4NDB8MHgxMHwweDEsCisJCQkJCSBkZXYuY29udHJvbF9wb3J0LAorCQkJCQkgKHJlc2V0X3RpbWUqSFopLzEwMCk7CisKKwkvKiBOb3RlOiBkYXRhIHBvcnQgaXMgbm93IHRoZSBkYXRhIHBvcnQsIG5vdCB0aGUgaC93IGluaXRpYWxpemF0aW9uCisJICAgcG9ydC4KKwkgKi8KKworCWlmICghZGV2LmlycV9vaykgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FCisJCQkiaW50ciBub3QgcmVjZWl2ZWQgYWZ0ZXIgaC93IHVuLXJlc2V0LlxuIik7CisJCWdvdG8gZ29uZV9iYWQ7CisJfSAKKworCWRldi5pbnRlcnJ1cHRzX29uID0gMTsKKwkKKwkvKiBOb3RlOiBkYXRhIHBvcnQgaXMgbm93IHRoZSBkYXRhIHBvcnQsIG5vdCB0aGUgaC93IGluaXRpYWxpemF0aW9uCisJICAgcG9ydC4KKworCSAgIEF0IHRoaXMgcG9pbnQsIG9ubHkgIkhXIFZFUlNJT04iIG9yICJET1dOTE9BRCBPUyIgY29tbWFuZHMKKwkgICB3aWxsIHdvcmsuIFNvLCBpc3N1ZSBvbmUgb2YgdGhlbSwgYW5kIHdhaXQgZm9yIFRYCisJICAgaW50ZXJydXB0LiBUaGlzIGNhbiB0YWtlIGEgKmxvbmcqIHRpbWUgYWZ0ZXIgYSBjb2xkIGJvb3QsCisJICAgd2hpbGUgdGhlIElTQyBST00gZG9lcyBpdHMgUkFNIHRlc3QuIFRoZSBTREsgc2F5cyB1cCB0byA0CisJICAgc2Vjb25kcyAtIHdpdGggMTJNQiBvZiBSQU0gb24gYSBUcm9wZXorLCBpdCB0YWtlcyBhIGxvdAorCSAgIGxvbmdlciB0aGFuIHRoYXQgKH4xNnNlY3MpLiBOb3RlIHRoYXQgdGhlIGNhcmQgdW5kZXJzdGFuZHMKKwkgICB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgd2FybSBhbmQgYSBjb2xkIGJvb3QsIHNvCisJICAgc3Vic2VxdWVudCBJU0MyMTE1IHJlYm9vdHMgKHNheSwgY2F1c2VkIGJ5IG1vZHVsZQorCSAgIHJlbG9hZGluZykgd2lsbCBnZXQgdGhyb3VnaCB0aGlzIG11Y2ggZmFzdGVyLgorCisJICAgWFhYIEludGVyZXN0aW5nIHF1ZXN0aW9uOiB3aHkgaXMgbm8gUlggaW50ZXJydXB0IHJlY2VpdmVkIGZpcnN0ID8KKwkqLworCisJd2F2ZWZyb250X3Nob3VsZF9jYXVzZV9pbnRlcnJ1cHQoV0ZDX0hBUkRXQVJFX1ZFUlNJT04sIAorCQkJCQkgZGV2LmRhdGFfcG9ydCwgcmFtY2hlY2tfdGltZSpIWik7CisKKwlpZiAoIWRldi5pcnFfb2spIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJInBvc3QtUkFNLWNoZWNrIGludGVycnVwdCBub3QgcmVjZWl2ZWQuXG4iKTsKKwkJZ290byBnb25lX2JhZDsKKwl9IAorCisJaWYgKCF3YXZlZnJvbnRfd2FpdCAoU1RBVF9DQU5fUkVBRCkpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJIm5vIHJlc3BvbnNlIHRvIEhXIHZlcnNpb24gY21kLlxuIik7CisJCWdvdG8gZ29uZV9iYWQ7CisJfQorCQorCWlmICgoaHd2WzBdID0gd2F2ZWZyb250X3JlYWQgKCkpID09IC0xKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUKKwkJCSJib2FyZCBub3QgcmVzcG9uZGluZyBjb3JyZWN0bHkuXG4iKTsKKwkJZ290byBnb25lX2JhZDsKKwl9CisKKwlpZiAoaHd2WzBdID09IDB4RkYpIHsgLyogTkFLICovCisKKwkJLyogQm9hcmQncyBSQU0gdGVzdCBmYWlsZWQuIFRyeSB0byByZWFkIGVycm9yIGNvZGUsCisJCSAgIGFuZCB0ZWxsIHVzIGFib3V0IGl0IGVpdGhlciB3YXkuCisJCSovCisJCQorCQlpZiAoKGh3dlswXSA9IHdhdmVmcm9udF9yZWFkICgpKSA9PSAtMSkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAib24tYm9hcmQgUkFNIHRlc3QgZmFpbGVkICIKKwkJCQkiKGJhZCBlcnJvciBjb2RlKS5cbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAib24tYm9hcmQgUkFNIHRlc3QgZmFpbGVkICIKKwkJCQkiKGVycm9yIGNvZGU6IDB4JXgpLlxuIiwKKwkJCQlod3ZbMF0pOworCQl9CisJCWdvdG8gZ29uZV9iYWQ7CisJfQorCisJLyogV2UncmUgT0ssIGp1c3QgZ2V0IHRoZSBuZXh0IGJ5dGUgb2YgdGhlIEhXIHZlcnNpb24gcmVzcG9uc2UgKi8KKworCWlmICgoaHd2WzFdID0gd2F2ZWZyb250X3JlYWQgKCkpID09IC0xKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImluY29ycmVjdCBoL3cgcmVzcG9uc2UuXG4iKTsKKwkJZ290byBnb25lX2JhZDsKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FICJoYXJkd2FyZSB2ZXJzaW9uICVkLiVkXG4iLAorCQlod3ZbMF0sIGh3dlsxXSk7CisKKwlyZXR1cm4gMDsKKworCisgICAgIGdvbmVfYmFkOgorCWlmIChkZXYuaXJxID49IDApIHsKKwkJZnJlZV9pcnEgKGRldi5pcnEsICZkZXYpOworCQlkZXYuaXJxID0gLTE7CisJfQorCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRldGVjdF93YXZlZnJvbnQgKGludCBpcnEsIGludCBpb19iYXNlKQoreworCXVuc2lnbmVkIGNoYXIgICByYnVmWzRdLCB3YnVmWzRdOworCisJLyogVEIgZG9jcyBzYXkgdGhlIGRldmljZSB0YWtlcyB1cCA4IHBvcnRzLCBidXQgd2Uga25vdyB0aGF0CisJICAgaWYgdGhlcmUgaXMgYW4gRlggZGV2aWNlIHByZXNlbnQgKGkuZS4gYSBUcm9wZXorKSBpdCByZWFsbHkKKwkgICBjb25zdW1lcyAxNi4KKwkqLworCisJaWYgKGNoZWNrX3JlZ2lvbiAoaW9fYmFzZSwgMTYpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiSU8gYWRkcmVzcyByYW5nZSAweCV4IC0gMHgleCAiCisJCQkiYWxyZWFkeSBpbiB1c2UgLSBpZ25vcmVkXG4iLCBkZXYuYmFzZSwKKwkJCWRldi5iYXNlKzE1KTsKKwkJcmV0dXJuIC0xOworCX0KKyAgCisJZGV2LmlycSA9IGlycTsKKwlkZXYuYmFzZSA9IGlvX2Jhc2U7CisJZGV2LmlzcmF3ID0gMDsKKwlkZXYuZGVidWcgPSBkZWJ1Z19kZWZhdWx0OworCWRldi5pbnRlcnJ1cHRzX29uID0gMDsKKwlkZXYuaXJxX2NudCA9IDA7CisJZGV2LnJvbV9zYW1wbGVzX3Jkb25seSA9IDE7IC8qIFhYWCBkZWZhdWx0IGxvY2sgb24gUk9NIHNhbXBsZSBzbG90cyAqLworCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19GSVJNV0FSRV9WRVJTSU9OLCByYnVmLCB3YnVmKSA9PSAwKSB7CisKKwkJZGV2LmZ3X3ZlcnNpb25bMF0gPSByYnVmWzBdOworCQlkZXYuZndfdmVyc2lvblsxXSA9IHJidWZbMV07CisJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUKKwkJCSJmaXJtd2FyZSAlZC4lZCBhbHJlYWR5IGxvYWRlZC5cbiIsCisJCQlyYnVmWzBdLCByYnVmWzFdKTsKKworCQkvKiBjaGVjayB0aGF0IGEgY29tbWFuZCBhY3R1YWxseSB3b3JrcyAqLworICAgICAgCisJCWlmICh3YXZlZnJvbnRfY21kIChXRkNfSEFSRFdBUkVfVkVSU0lPTiwKKwkJCQkgICByYnVmLCB3YnVmKSA9PSAwKSB7CisJCQlkZXYuaHdfdmVyc2lvblswXSA9IHJidWZbMF07CisJCQlkZXYuaHdfdmVyc2lvblsxXSA9IHJidWZbMV07CisJCX0gZWxzZSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJub3QgcmF3LCBidXQgbm8gIgorCQkJCSJoYXJkd2FyZSB2ZXJzaW9uIVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghd2ZfcmF3KSB7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUKKwkJCQkicmVsb2FkaW5nIGZpcm13YXJlIGFueXdheS5cbiIpOworCQkJZGV2LmlzcmF3ID0gMTsKKwkJfQorCisJfSBlbHNlIHsKKworCQlkZXYuaXNyYXcgPSAxOworCQlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FCisJCQkibm8gcmVzcG9uc2UgdG8gZmlybXdhcmUgcHJvYmUsIGFzc3VtZSByYXcuXG4iKTsKKworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZkZXYuaW50ZXJydXB0X3NsZWVwZXIpOworCisJaWYgKHdhdmVmcm9udF9od19yZXNldCAoKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJoYXJkd2FyZSByZXNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBmb3IgRlggZGV2aWNlLCBwcmVzZW50IG9ubHkgb24gVHJvcGV6KyAqLworCisJZGV2Lmhhc19meCA9IChkZXRlY3Rfd2ZmeCAoKSA9PSAwKTsKKworCXJldHVybiAxOworfQorCisjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKworc3RhdGljIGludAord2F2ZWZyb250X2Rvd25sb2FkX2Zpcm13YXJlIChjaGFyICpwYXRoKQorCit7CisJdW5zaWduZWQgY2hhciBzZWN0aW9uW1dGX1NFQ1RJT05fTUFYXTsKKwljaGFyIHNlY3Rpb25fbGVuZ3RoOyAvKiB5ZXMsIGp1c3QgYSBjaGFyOyBtYXggdmFsdWUgaXMgV0ZfU0VDVElPTl9NQVggKi8KKwlpbnQgc2VjdGlvbl9jbnRfZG93bmxvYWRlZCA9IDA7CisJaW50IGZkOworCWludCBjOworCWludCBpOworCW1tX3NlZ21lbnRfdCBmczsKKworCS8qIFRoaXMgdHJpZXMgdG8gYmUgYSBiaXQgY2xldmVyZXIgdGhhbiB0aGUgc3R1ZmYgQWxhbiBDb3ggZGlkIGZvcgorCSAgIHRoZSBnZW5lcmljIHNvdW5kIGZpcm13YXJlLCBpbiB0aGF0IGl0IGFjdHVhbGx5IGtub3dzCisJICAgc29tZXRoaW5nIGFib3V0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE1vdG9yb2xhIGZpcm13YXJlLiBJbgorCSAgIHBhcnRpY3VsYXIsIGl0IHVzZXMgYSB2ZXJzaW9uIHRoYXQgaGFzIGJlZW4gc3RyaXBwZWQgb2YgdGhlCisJICAgMjBLIG9mIHVzZWxlc3MgaGVhZGVyIGluZm9ybWF0aW9uLCBhbmQgaGFkIHNlY3Rpb24gbGVuZ3RocworCSAgIGFkZGVkLCBtYWtpbmcgaXQgcG9zc2libGUgdG8gbG9hZCB0aGUgZW50aXJlIE9TIHdpdGhvdXQgYW55CisJICAgW2t2XW1hbGxvYygpIGFjdGl2aXR5LCBzaW5jZSB0aGUgbG9uZ2VzdCBlbnRpdHkgd2UgZXZlciByZWFkIGlzCisJICAgNDIgYnl0ZXMgKHdlbGwsIFdGX1NFQ1RJT05fTUFYKSBsb25nLgorCSovCisKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyAoZ2V0X2RzKCkpOworCisJaWYgKChmZCA9IHN5c19vcGVuIChwYXRoLCAwLCAwKSkgPCAwKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgIlVuYWJsZSB0byBsb2FkIFwiJXNcIi5cbiIsCisJCQlwYXRoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaW50IHg7CisKKwkJaWYgKCh4ID0gc3lzX3JlYWQgKGZkLCAmc2VjdGlvbl9sZW5ndGgsIHNpemVvZiAoc2VjdGlvbl9sZW5ndGgpKSkgIT0KKwkJICAgIHNpemVvZiAoc2VjdGlvbl9sZW5ndGgpKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgImZpcm13YXJlIHJlYWQgZXJyb3IuXG4iKTsKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfQorCisJCWlmIChzZWN0aW9uX2xlbmd0aCA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzeXNfcmVhZCAoZmQsIHNlY3Rpb24sIHNlY3Rpb25fbGVuZ3RoKSAhPSBzZWN0aW9uX2xlbmd0aCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJmaXJtd2FyZSBzZWN0aW9uICIKKwkJCQkicmVhZCBlcnJvci5cbiIpOworCQkJZ290byBmYWlsdXJlOworCQl9CisKKwkJLyogU2VuZCBjb21tYW5kICovCisJCisJCWlmICh3YXZlZnJvbnRfd3JpdGUgKFdGQ19ET1dOTE9BRF9PUykpIHsKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfQorCQorCQlmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbl9sZW5ndGg7IGkrKykgeworCQkJaWYgKHdhdmVmcm9udF93cml0ZSAoc2VjdGlvbltpXSkpIHsKKwkJCQlnb3RvIGZhaWx1cmU7CisJCQl9CisJCX0KKwkKKwkJLyogZ2V0IEFDSyAqLworCQorCQlpZiAod2F2ZWZyb250X3dhaXQgKFNUQVRfQ0FOX1JFQUQpKSB7CisKKwkJCWlmICgoYyA9IGluYiAoZGV2LmRhdGFfcG9ydCkpICE9IFdGX0FDSykgeworCisJCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJkb3dubG9hZCAiCisJCQkJCSJvZiBzZWN0aW9uICMlZCBub3QgIgorCQkJCQkiYWNrbm93bGVkZ2VkLCBhY2sgPSAweCV4XG4iLAorCQkJCQlzZWN0aW9uX2NudF9kb3dubG9hZGVkICsgMSwgYyk7CisJCQkJZ290byBmYWlsdXJlOworCQkKKwkJCX0KKworCQl9IGVsc2UgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ0aW1lIG91dCBmb3IgZmlybXdhcmUgQUNLLlxuIik7CisJCQlnb3RvIGZhaWx1cmU7CisJCX0KKworCX0KKworCXN5c19jbG9zZSAoZmQpOworCXNldF9mcyAoZnMpOworCXJldHVybiAwOworCisgZmFpbHVyZToKKwlzeXNfY2xvc2UgKGZkKTsKKwlzZXRfZnMgKGZzKTsKKwlwcmludGsgKEtFUk5fRVJSICJcbldhdmVGcm9udDogZmlybXdhcmUgZG93bmxvYWQgZmFpbGVkISEhXG4iKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgd2F2ZWZyb250X2NvbmZpZ19taWRpICh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgcmJ1Zls0XSwgd2J1Zls0XTsKKyAgICAKKwlpZiAoZGV0ZWN0X3dmX21wdSAoZGV2LmlycSwgZGV2LmJhc2UpIDwgMCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FCisJCQkiY291bGQgbm90IGZpbmQgd29ya2luZyBNSURJIGRldmljZVxuIik7CisJCXJldHVybiAtMTsKKwl9IAorCisJaWYgKChkZXYubWlkaWRldiA9IGluc3RhbGxfd2ZfbXB1ICgpKSA8IDApIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJIk1JREkgaW50ZXJmYWNlcyBub3QgY29uZmlndXJlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBSb3V0ZSBleHRlcm5hbCBNSURJIHRvIFdhdmVGcm9udCBzeW50aCAoYnkgZGVmYXVsdCkgKi8KKyAgICAKKwlpZiAod2F2ZWZyb250X2NtZCAoV0ZDX01JU1lOVEhfT04sIHJidWYsIHdidWYpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUKKwkJCSJjYW5ub3QgZW5hYmxlIE1JREktSU4gdG8gc3ludGggcm91dGluZy5cbiIpOworCQkvKiBYWFggZXJyb3IgPyAqLworCX0KKworCisjaWYgT1NTX1NVUFBPUlRfTEVWRUwgJiBPU1NfU1VQUE9SVF9TRVEKKwkvKiBHZXQgdGhlIHJlZ3VsYXIgTUlESSBwYXRjaCBsb2FkaW5nIGZ1bmN0aW9uLCBzbyB3ZSBjYW4KKwkgICB1c2UgaXQgaWYgd2UgZXZlciBnZXQgaGFuZGVkIGEgU1lTRVggcGF0Y2guIFRoaXMgaXMKKwkgICB1bmxpa2VseSwgYmVjYXVzZSBpdHMgc28gZGFtbiBzbG93LCBidXQgd2UgbWF5IGFzIHdlbGwKKwkgICBsZWF2ZSB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSBtYXVpLmMgYmVoaW5kLCBzaW5jZSBpdAorCSAgIGNvdWxkIGJlIHVzZWZ1bCBmb3Igc2VxdWVuY2VyIGFwcGxpY2F0aW9ucyB0aGF0IGNhbgorCSAgIG9ubHkgdXNlIE1JREkgdG8gZG8gcGF0Y2ggbG9hZGluZy4KKwkqLworCisJaWYgKG1pZGlfZGV2c1tkZXYubWlkaWRldl0tPmNvbnZlcnRlciAhPSBOVUxMKSB7CisJCW1pZGlfbG9hZF9wYXRjaCA9IG1pZGlfZGV2c1tkZXYubWlkaWRldl0tPmNvbnZlcnRlci0+bG9hZF9wYXRjaDsKKwkJbWlkaV9kZXZzW2Rldi5taWRpZGV2XS0+Y29udmVydGVyLT5sb2FkX3BhdGNoID0KKwkJICAgICZ3YXZlZnJvbnRfb3NzX2xvYWRfcGF0Y2g7CisJfQorCisjZW5kaWYgLyogT1NTX1NVUFBPUlRfU0VRICovCisJCisJLyogVHVybiBvbiBWaXJ0dWFsIE1JREksIGJ1dCBmaXJzdCAqYWx3YXlzKiB0dXJuIGl0IG9mZiwKKwkgICBzaW5jZSBvdGhlcndpc2UgY29uc2VjdHV0aXZlIHJlbG9hZHMgb2YgdGhlIGRyaXZlciB3aWxsCisJICAgbmV2ZXIgY2F1c2UgdGhlIGhhcmR3YXJlIHRvIGdlbmVyYXRlIHRoZSBpbml0aWFsICJpbnRlcm5hbCIgb3IgCisJICAgImV4dGVybmFsIiBzb3VyY2UgYnl0ZXMgaW4gdGhlIE1JREkgZGF0YSBzdHJlYW0uIFRoaXMKKwkgICBpcyBwcmV0dHkgaW1wb3J0YW50LCBzaW5jZSB0aGUgaW50ZXJuYWwgaGFyZHdhcmUgZ2VuZXJhbGx5IHdpbGwKKwkgICBiZSB1c2VkIHRvIGdlbmVyYXRlIG5vbmUgb3IgdmVyeSBsaXR0bGUgTUlESSBvdXRwdXQsIGFuZAorCSAgIHRodXMgdGhlIG9ubHkgc291cmNlIG9mIE1JREkgZGF0YSBpcyBhY3R1YWxseSBleHRlcm5hbC4gV2l0aG91dAorCSAgIHRoZSBzd2l0Y2ggYnl0ZXMsIHRoZSBkcml2ZXIgd2lsbCB0aGluayBpdCBhbGwgY29tZXMgZnJvbQorCSAgIHRoZSBpbnRlcm5hbCBpbnRlcmZhY2UuIER1aC4KKwkqLworCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19WTUlESV9PRkYsIHJidWYsIHdidWYpKSB7IAorCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FCisJCQkidmlydHVhbCBNSURJIG1vZGUgbm90IGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIDA7IC8qIFdlJ3JlIE9LLCBidXQgbWlzc2luZyB0aGUgZXh0ZXJuYWwgTUlESSBkZXYgKi8KKwl9CisKKwlpZiAoKGRldi5leHRfbWlkaWRldiA9IHZpcnR1YWxfbWlkaV9lbmFibGUgKCkpIDwgMCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJubyB2aXJ0dWFsIE1JREkgYWNjZXNzLlxuIik7CisJfSBlbHNlIHsKKwkJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19WTUlESV9PTiwgcmJ1Ziwgd2J1ZikpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUKKwkJCQkiY2Fubm90IGVuYWJsZSB2aXJ0dWFsIE1JREkgbW9kZS5cbiIpOworCQkJdmlydHVhbF9taWRpX2Rpc2FibGUgKCk7CisJCX0gCisJfQorICAgIAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB3YXZlZnJvbnRfZG9fcmVzZXQgKGludCBhdGJvb3QpCit7CisJY2hhciB2b2ljZXNbMV07CisKKwlpZiAoIWF0Ym9vdCAmJiB3YXZlZnJvbnRfaHdfcmVzZXQgKCkpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAiaHcgcmVzZXQgZmFpbGVkLlxuIik7CisJCWdvdG8gZ29uZV9iYWQ7CisJfQorCisJaWYgKGRldi5pc3JhdykgeworCQlpZiAod2F2ZWZyb250X2Rvd25sb2FkX2Zpcm13YXJlIChvc3BhdGgpKSB7CisJCQlnb3RvIGdvbmVfYmFkOworCQl9CisKKwkJZGV2LmlzcmF3ID0gMDsKKworCQkvKiBXYWl0IGZvciB0aGUgT1MgdG8gZ2V0IHJ1bm5pbmcuIFRoZSBwcm90b2NvbCBmb3IKKwkJICAgdGhpcyBpcyBub24tb2J2aW91cywgYW5kIHdhcyBkZXRlcm1pbmVkIGJ5CisJCSAgIHVzaW5nIHBvcnQtSU8gdHJhY2luZyBpbiBET1NlbXUgYW5kIHNvbWUKKwkJICAgZXhwZXJpbWVudGF0aW9uIGhlcmUuCisJCSAgIAorCQkgICBSYXRoZXIgdGhhbiB1c2luZyB0aW1lZCB3YWl0cywgdXNlIGludGVycnVwdHMgY3JlYXRpdmVseS4KKwkJKi8KKworCQl3YXZlZnJvbnRfc2hvdWxkX2NhdXNlX2ludGVycnVwdCAoV0ZDX05PT1AsCisJCQkJCQkgIGRldi5kYXRhX3BvcnQsCisJCQkJCQkgIChvc3J1bl90aW1lKkhaKSk7CisKKwkJaWYgKCFkZXYuaXJxX29rKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FCisJCQkJIm5vIHBvc3QtT1MgaW50ZXJydXB0LlxuIik7CisJCQlnb3RvIGdvbmVfYmFkOworCQl9CisJCQorCQkvKiBOb3csIGRvIGl0IGFnYWluICEgKi8KKwkJCisJCXdhdmVmcm9udF9zaG91bGRfY2F1c2VfaW50ZXJydXB0IChXRkNfTk9PUCwKKwkJCQkJCSAgZGV2LmRhdGFfcG9ydCwgKDEwKkhaKSk7CisJCQorCQlpZiAoIWRldi5pcnFfb2spIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUKKwkJCQkibm8gcG9zdC1PUyBpbnRlcnJ1cHQoMikuXG4iKTsKKwkJCWdvdG8gZ29uZV9iYWQ7CisJCX0KKworCQkvKiBPSywgbm8gKFJYL1RYKSBpbnRlcnJ1cHRzIGFueSBtb3JlLCBidXQgbGVhdmUgbXV0ZQorCQkgICBpbiBlZmZlY3QuIAorCQkqLworCQkKKwkJb3V0YiAoMHg4MHwweDQwLCBkZXYuY29udHJvbF9wb3J0KTsgCisKKwkJLyogTm8gbmVlZCBmb3IgdGhlIElSUSBhbnltb3JlICovCisJCQorCQlmcmVlX2lycSAoZGV2LmlycSwgJmRldik7CisKKwl9CisKKwlpZiAoZGV2Lmhhc19meCAmJiBmeF9yYXcpIHsKKwkJd2ZmeF9pbml0ICgpOworCX0KKworCS8qIFNFVFVQU05ELkVYRSBhc2tzIGZvciBzYW1wbGUgbWVtb3J5IGNvbmZpZyBoZXJlLCBidXQgc2luY2UgaQorCSAgIGhhdmUgbm8gaWRlYSBob3cgdG8gaW50ZXJwcmV0IHRoZSByZXN1bHQsIHdlJ2xsIGZvcmdldAorCSAgIGFib3V0IGl0LgorCSovCisJCisJaWYgKChkZXYuZnJlZW1lbSA9IHdhdmVmcm9udF9mcmVlbWVtICgpKSA8IDApIHsKKwkJZ290byBnb25lX2JhZDsKKwl9CisJCQorCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUgImF2YWlsYWJsZSBEUkFNICVka1xuIiwgZGV2LmZyZWVtZW0gLyAxMDI0KTsKKworCWlmICh3YXZlZnJvbnRfd3JpdGUgKDB4ZjApIHx8CisJICAgIHdhdmVmcm9udF93cml0ZSAoMSkgfHwKKwkgICAgKHdhdmVmcm9udF9yZWFkICgpIDwgMCkpIHsKKwkJZGV2LmRlYnVnID0gMDsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAiTVBVIGVtdWxhdGlvbiBtb2RlIG5vdCBzZXQuXG4iKTsKKwkJZ290byBnb25lX2JhZDsKKwl9CisKKwl2b2ljZXNbMF0gPSAzMjsKKworCWlmICh3YXZlZnJvbnRfY21kIChXRkNfU0VUX05WT0lDRVMsIE5VTEwsIHZvaWNlcykpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJImNhbm5vdCBzZXQgbnVtYmVyIG9mIHZvaWNlcyB0byAzMi5cbiIpOworCQlnb3RvIGdvbmVfYmFkOworCX0KKworCisJcmV0dXJuIDA7CisKKyBnb25lX2JhZDoKKwkvKiByZXNldCB0aGF0IHN1Y2tlciBzbyB0aGF0IGl0IGRvZXNuJ3QgYm90aGVyIHVzLiAqLworCisJb3V0YiAoMHgwLCBkZXYuY29udHJvbF9wb3J0KTsKKwlkZXYuaW50ZXJydXB0c19vbiA9IDA7CisJaWYgKGRldi5pcnEgPj0gMCkgeworCQlmcmVlX2lycSAoZGV2LmlycSwgJmRldik7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCB3YXZlZnJvbnRfaW5pdCAoaW50IGF0Ym9vdCkKK3sKKwlpbnQgc2FtcGxlc19hcmVfZnJvbV9yb207CisKKwlpZiAoZGV2LmlzcmF3KSB7CisJCXNhbXBsZXNfYXJlX2Zyb21fcm9tID0gMTsKKwl9IGVsc2UgeworCQkvKiBYWFggaXMgdGhpcyBhbHdheXMgdHJ1ZSA/ICovCisJCXNhbXBsZXNfYXJlX2Zyb21fcm9tID0gMDsKKwl9CisKKwlpZiAoZGV2LmlzcmF3IHx8IGZ4X3JhdykgeworCQlpZiAod2F2ZWZyb250X2RvX3Jlc2V0IChhdGJvb3QpKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl3YXZlZnJvbnRfZ2V0X3NhbXBsZV9zdGF0dXMgKHNhbXBsZXNfYXJlX2Zyb21fcm9tKTsKKwl3YXZlZnJvbnRfZ2V0X3Byb2dyYW1fc3RhdHVzICgpOworCXdhdmVmcm9udF9nZXRfcGF0Y2hfc3RhdHVzICgpOworCisJLyogU3RhcnQgbm9ybWFsIG9wZXJhdGlvbjogdW5yZXNldCwgbWFzdGVyIGludGVycnVwdCBlbmFibGVkLCBubyBtdXRlCisJKi8KKworCW91dGIgKDB4ODB8MHg0MHwweDIwLCBkZXYuY29udHJvbF9wb3J0KTsgCisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbnN0YWxsX3dhdmVmcm9udCAodm9pZCkKKworeworCWlmICgoZGV2LnN5bnRoX2RldiA9IHJlZ2lzdGVyX3NvdW5kX3N5bnRoICgmd2F2ZWZyb250X2ZvcHMsIC0xKSkgPCAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiY2Fubm90IHJlZ2lzdGVyIHJhdyBzeW50aFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZiBPU1NfU1VQUE9SVF9MRVZFTCAmIE9TU19TVVBQT1JUX1NFUQorCWlmICgoZGV2Lm9zc19kZXYgPSBzb3VuZF9hbGxvY19zeW50aGRldigpKSA9PSAtMSkgeworCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgIlRvbyBtYW55IHNlcXVlbmNlcnNcbiIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJc3ludGhfZGV2c1tkZXYub3NzX2Rldl0gPSAmd2F2ZWZyb250X29wZXJhdGlvbnM7CisJfQorI2VuZGlmIC8qIE9TU19TVVBQT1JUX1NFUSAqLworCisJaWYgKHdhdmVmcm9udF9pbml0ICgxKSA8IDApIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAiaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisKKyNpZiBPU1NfU1VQUE9SVF9MRVZFTCAmIE9TU19TVVBQT1JUX1NFUQorCQlzb3VuZF91bmxvYWRfc3ludGhkZXYgKGRldi5vc3NfZGV2KTsKKyNlbmRpZiAvKiBPU1NfU1VQUE9SVF9TRVEgKi8gCisKKwkJcmV0dXJuIC0xOworCX0KKyAgICAKKwlyZXF1ZXN0X3JlZ2lvbiAoZGV2LmJhc2UrMiwgNiwgIndhdmVmcm9udCBzeW50aCIpOworCisJaWYgKGRldi5oYXNfZngpIHsKKwkJcmVxdWVzdF9yZWdpb24gKGRldi5iYXNlKzgsIDgsICJ3YXZlZnJvbnQgZngiKTsKKwl9CisKKwlpZiAod2F2ZWZyb250X2NvbmZpZ19taWRpICgpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImNvdWxkIG5vdCBpbml0aWFsaXplIE1JREkuXG4iKTsKKwl9CisKKwlyZXR1cm4gZGV2Lm9zc19kZXY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmluc3RhbGxfd2F2ZWZyb250ICh2b2lkKQoreworCS8qIHRoZSBmaXJzdCB0d28gaS9vIGFkZHJlc3NlcyBhcmUgZnJlZWQgYnkgdGhlIHdmX21wdSBjb2RlICovCisJcmVsZWFzZV9yZWdpb24gKGRldi5iYXNlKzIsIDYpOworCisJaWYgKGRldi5oYXNfZngpIHsKKwkJcmVsZWFzZV9yZWdpb24gKGRldi5iYXNlKzgsIDgpOworCX0KKworCXVucmVnaXN0ZXJfc291bmRfc3ludGggKGRldi5zeW50aF9kZXYpOworCisjaWYgT1NTX1NVUFBPUlRfTEVWRUwgJiBPU1NfU1VQUE9SVF9TRVEKKwlzb3VuZF91bmxvYWRfc3ludGhkZXYgKGRldi5vc3NfZGV2KTsKKyNlbmRpZiAvKiBPU1NfU1VQUE9SVF9TRVEgKi8gCisJdW5pbnN0YWxsX3dmX21wdSAoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICBXYXZlRnJvbnQgRlggY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAieXNzMjI1LmgiCisKKy8qIENvbnRyb2wgYml0cyBmb3IgdGhlIExvYWQgQ29udHJvbCBSZWdpc3RlcgorICovCisKKyNkZWZpbmUgRlhfTFNCX1RSQU5TRkVSIDB4MDEgICAgLyogdHJhbnNmZXIgYWZ0ZXIgRFNQIExTQiBieXRlIHdyaXR0ZW4gKi8KKyNkZWZpbmUgRlhfTVNCX1RSQU5TRkVSIDB4MDIgICAgLyogdHJhbnNmZXIgYWZ0ZXIgRFNQIE1TQiBieXRlIHdyaXR0ZW4gKi8KKyNkZWZpbmUgRlhfQVVUT19JTkNSICAgIDB4MDQgICAgLyogYXV0by1pbmNyZW1lbnQgRFNQIGFkZHJlc3MgYWZ0ZXIgdHJhbnNmZXIgKi8KKworc3RhdGljIGludAord2ZmeF9pZGxlICh2b2lkKSAKKyAgICAKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgeCA9IDB4ODA7CisgICAgCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQl4ID0gaW5iIChkZXYuZnhfc3RhdHVzKTsKKwkJaWYgKCh4ICYgMHg4MCkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisgICAgCisJaWYgKHggJiAweDgwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiRlggZGV2aWNlIG5ldmVyIGlkbGUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorICAgIAorCXJldHVybiAoMSk7Cit9CisKK2ludCBfX2luaXQgZGV0ZWN0X3dmZnggKHZvaWQpCit7CisJLyogVGhpcyBpcyBhIGNydWRlIGNoZWNrLCBidXQgaXRzIHRoZSBiZXN0IG9uZSBJIGhhdmUgZm9yIG5vdy4KKwkgICBDZXJ0YWlubHkgb24gdGhlIE1hdWkgYW5kIHRoZSBUcm9wZXosIHdmZnhfaWRsZSgpIHdpbGwKKwkgICByZXBvcnQgIm5ldmVyIGlkbGUiLCB3aGljaCBzdWdnZXN0cyB0aGF0IHRoaXMgdGVzdCBzaG91bGQKKwkgICB3b3JrIE9LLgorCSovCisKKwlpZiAoaW5iIChkZXYuZnhfc3RhdHVzKSAmIDB4ODApIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gTE9HTkFNRSAiSG1tLCBwcm9iYWJseSBhIE1hdWkgb3IgVHJvcGV6LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30JCisKK3ZvaWQKK3dmZnhfbXV0ZSAoaW50IG9ub2ZmKQorICAgIAoreworCWlmICghd2ZmeF9pZGxlKCkpIHsKKwkJcmV0dXJuOworCX0KKyAgICAKKwlvdXRiIChvbm9mZiA/IDB4MDIgOiAweDAwLCBkZXYuZnhfb3ApOworfQorCitzdGF0aWMgaW50Cit3ZmZ4X21lbXNldCAoaW50IHBhZ2UsCisJICAgICBpbnQgYWRkciwgaW50IGNudCwgdW5zaWduZWQgc2hvcnQgKmRhdGEpCit7CisJaWYgKHBhZ2UgPCAwIHx8IHBhZ2UgPiA3KSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiRlggbWVtc2V0OiAiCisJCQkicGFnZSBtdXN0IGJlID49IDAgYW5kIDw9IDdcbiIpOworCQlyZXR1cm4gLShFSU5WQUwpOworCX0KKworCWlmIChhZGRyIDwgMCB8fCBhZGRyID4gMHg3ZikgeworCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgIkZYIG1lbXNldDogIgorCQkJImFkZHIgbXVzdCBiZSA+PSAwIGFuZCA8PSA3ZlxuIik7CisJCXJldHVybiAtKEVJTlZBTCk7CisJfQorCisJaWYgKGNudCA9PSAxKSB7CisKKwkJb3V0YiAoRlhfTFNCX1RSQU5TRkVSLCBkZXYuZnhfbGNyKTsKKwkJb3V0YiAocGFnZSwgZGV2LmZ4X2RzcF9wYWdlKTsKKwkJb3V0YiAoYWRkciwgZGV2LmZ4X2RzcF9hZGRyKTsKKwkJb3V0YiAoKGRhdGFbMF0gPj4gOCksIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAoKGRhdGFbMF0gJiAweGZmKSwgZGV2LmZ4X2RzcF9sc2IpOworCisJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUgIkZYOiBhZGRyICVkOiV4IHNldCB0byAweCV4XG4iLAorCQkJcGFnZSwgYWRkciwgZGF0YVswXSk7CisJCisJfSBlbHNlIHsKKwkJaW50IGk7CisKKwkJb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJCW91dGIgKHBhZ2UsIGRldi5meF9kc3BfcGFnZSk7CisJCW91dGIgKGFkZHIsIGRldi5meF9kc3BfYWRkcik7CisKKwkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCQlvdXRiICgoZGF0YVtpXSA+PiA4KSwgZGV2LmZ4X2RzcF9tc2IpOworCQkJb3V0YiAoKGRhdGFbaV0gJiAweGZmKSwgZGV2LmZ4X2RzcF9sc2IpOworCQkJaWYgKCF3ZmZ4X2lkbGUgKCkpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpICE9IGNudCkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJCSJGWCBtZW1zZXQgIgorCQkJCSIoMHgleCwgMHgleCwgJXAsICVkKSBpbmNvbXBsZXRlXG4iLAorCQkJCXBhZ2UsIGFkZHIsIGRhdGEsIGNudCk7CisJCQlyZXR1cm4gLShFSU8pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dmZnhfaW9jdGwgKHdhdmVmcm9udF9meF9pbmZvICpyKQorCit7CisJdW5zaWduZWQgc2hvcnQgcGFnZV9kYXRhWzI1Nl07CisJdW5zaWduZWQgc2hvcnQgKnBkOworCisJc3dpdGNoIChyLT5yZXF1ZXN0KSB7CisJY2FzZSBXRkZYX01VVEU6CisJCXdmZnhfbXV0ZSAoci0+ZGF0YVswXSk7CisJCXJldHVybiAwOworCisJY2FzZSBXRkZYX01FTVNFVDoKKworCQlpZiAoci0+ZGF0YVsyXSA8PSAwKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgImNhbm5vdCB3cml0ZSAiCisJCQkJIjw9IDAgYnl0ZXMgdG8gRlhcbiIpOworCQkJcmV0dXJuIC0oRUlOVkFMKTsKKwkJfSBlbHNlIGlmIChyLT5kYXRhWzJdID09IDEpIHsKKwkJCXBkID0gKHVuc2lnbmVkIHNob3J0ICopICZyLT5kYXRhWzNdOworCQl9IGVsc2UgeworCQkJaWYgKHItPmRhdGFbMl0gPiBzaXplb2YgKHBhZ2VfZGF0YSkpIHsKKwkJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgImNhbm5vdCB3cml0ZSAiCisJCQkJCSI+IDI1NSBieXRlcyB0byBGWFxuIik7CisJCQkJcmV0dXJuIC0oRUlOVkFMKTsKKwkJCX0KKwkJCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlX2RhdGEsCisJCQkJCSAgICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKXItPmRhdGFbM10sCisJCQkJCSAgIHItPmRhdGFbMl0pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcGQgPSBwYWdlX2RhdGE7CisJCX0KKworCQlyZXR1cm4gd2ZmeF9tZW1zZXQgKHItPmRhdGFbMF0sIC8qIHBhZ2UgKi8KKwkJCQkgICAgci0+ZGF0YVsxXSwgLyogYWRkciAqLworCQkJCSAgICByLT5kYXRhWzJdLCAvKiBjbnQgKi8KKwkJCQkgICAgcGQpOworCisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJIkZYOiBpb2N0bCAlZCBub3QgeWV0IHN1cHBvcnRlZFxuIiwKKwkJCXItPnJlcXVlc3QpOworCQlyZXR1cm4gLShFSU5WQUwpOworCX0KK30KKworLyogWVNTMjI1IGluaXRpYWxpemF0aW9uLgorCisgICBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCB1c2luZyBET1NFTVUuIFRoZSBUdXJ0bGUgQmVhY2ggU0VUVVBTTkQKKyAgIHV0aWxpdHkgd2FzIHJ1biB3aXRoIEkvTyB0cmFjaW5nIGluIERPU0VNVSBlbmFibGVkLCBhbmQgYSByZWNvbnN0cnVjdGlvbgorICAgb2YgdGhlIHBvcnQgSS9PIGRvbmUsIHVzaW5nIHRoZSBZYW1haGEgZmF4YmFjayBkb2N1bWVudCBhcyBhIGd1aWRlCisgICB0byBhZGQgbW9yZSBsb2dpYyB0byB0aGUgY29kZS4gSXRzIHJlYWxseSBwcmV0dHkgd2VpcmQuCisKKyAgIFRoZXJlIHdhcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBvZiBqdXN0IGR1bXBpbmcgdGhlIHdob2xlIEkvTworICAgc2VxdWVuY2UgYXMgYSBzZXJpZXMgb2YgcG9ydC92YWx1ZSBwYWlycyBhbmQgYSBzaW1wbGUgbG9vcAorICAgdGhhdCBvdXRwdXQgaXQuIEhvd2V2ZXIsIEkgaG9wZSB0aGF0IGV2ZW50dWFsbHkgSSdsbCBnZXQgbW9yZQorICAgY29udHJvbCBvdmVyIHdoYXQgdGhpcyBjb2RlIGRvZXMsIGFuZCBzbyBJIHRyaWVkIHRvIHN0aWNrIHdpdGgKKyAgIGEgc29tZXdoYXQgImFsZ29yaXRobWljIiBhcHByb2FjaC4KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IHdmZnhfaW5pdCAodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgajsKKworCS8qIFNldCBhbGwgYml0cyBmb3IgYWxsIGNoYW5uZWxzIG9uIHRoZSBNT0QgdW5pdCB0byB6ZXJvICovCisJLyogWFhYIEJ1dCB3aHkgZG8gdGhpcyB0d2ljZSA/ICovCisKKwlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCWZvciAoaSA9IDB4MTA7IGkgPD0gMHhmZjsgaSsrKSB7CisJICAgIAorCQkJaWYgKCF3ZmZ4X2lkbGUgKCkpIHsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkgICAgCisJCQlvdXRiIChpLCBkZXYuZnhfbW9kX2FkZHIpOworCQkJb3V0YiAoMHgwLCBkZXYuZnhfbW9kX2RhdGEpOworCQl9CisJfQorCisJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJb3V0YiAoMHgwMiwgZGV2LmZ4X29wKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXRlIG9uICovCisKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDQsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDIsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDMsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4N2MsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4N2UsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDYsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDksIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDcsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NGEsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKworCS8qIGVpdGhlciBiZWNhdXNlIG9mIHN0dXBpZGl0eSBieSBUQidzIHByb2dyYW1tZXJzLCBvciBiZWNhdXNlIGl0CisJICAgYWN0dWFsbHkgZG9lcyBzb21ldGhpbmcsIHJlemVybyB0aGUgTU9EIHBhZ2UuCisJKi8KKwlmb3IgKGkgPSAweDEwOyBpIDw9IDB4ZmY7IGkrKykgeworCQorCQlpZiAoIXdmZnhfaWRsZSAoKSkgeworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgwLCBkZXYuZnhfbW9kX2RhdGEpOworCX0KKwkvKiBsb2FkIHBhZ2UgemVybyAqLworCisJb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9wYWdlKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV96ZXJvKTsgaSArPSAyKSB7CisJCW91dGIgKHBhZ2VfemVyb1tpXSwgZGV2LmZ4X2RzcF9tc2IpOworCQlvdXRiIChwYWdlX3plcm9baSsxXSwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwkvKiBOb3cgbG9hZCBwYWdlIG9uZSAqLworCisJb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJb3V0YiAoMHgwMSwgZGV2LmZ4X2RzcF9wYWdlKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV9vbmUpOyBpICs9IDIpIHsKKwkJb3V0YiAocGFnZV9vbmVbaV0sIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAocGFnZV9vbmVbaSsxXSwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisgICAgCisJb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJb3V0YiAoMHgwMiwgZGV2LmZ4X2RzcF9wYWdlKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV90d28pOyBpKyspIHsKKwkJb3V0YiAocGFnZV90d29baV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOworCW91dGIgKDB4MDMsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfdGhyZWUpOyBpKyspIHsKKwkJb3V0YiAocGFnZV90aHJlZVtpXSwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisgICAgCisJb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJb3V0YiAoMHgwNCwgZGV2LmZ4X2RzcF9wYWdlKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV9mb3VyKTsgaSsrKSB7CisJCW91dGIgKHBhZ2VfZm91cltpXSwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwkvKiBMb2FkIG1lbW9yeSBhcmVhIChwYWdlIHNpeCkgKi8KKyAgICAKKwlvdXRiIChGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOyAKKwlvdXRiICgweDA2LCBkZXYuZnhfZHNwX3BhZ2UpOyAKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2Vfc2l4KTsgaSArPSAzKSB7CisJCW91dGIgKHBhZ2Vfc2l4W2ldLCBkZXYuZnhfZHNwX2FkZHIpOworCQlvdXRiIChwYWdlX3NpeFtpKzFdLCBkZXYuZnhfZHNwX21zYik7CisJCW91dGIgKHBhZ2Vfc2l4W2krMl0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2Vfc2V2ZW4pOyBpICs9IDIpIHsKKwkJb3V0YiAocGFnZV9zZXZlbltpXSwgZGV2LmZ4X2RzcF9tc2IpOworCQlvdXRiIChwYWdlX3NldmVuW2krMV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJLyogTm93IHNldHVwIHRoZSBNT0QgYXJlYS4gV2UgZG8gdGhpcyBhbGdvcml0aG1pY2FsbHkgaW4gb3JkZXIgdG8KKwkgICBzYXZlIGEgbGl0dGxlIGRhdGEgc3BhY2UuIEl0IGNvdWxkIGJlIGRvbmUgaW4gdGhlIHNhbWUgZmFzaGlvbgorCSAgIGFzIHRoZSAicGFnZXMiLgorCSovCisKKwlmb3IgKGkgPSAweDAwOyBpIDw9IDB4MGY7IGkrKykgeworCQlvdXRiICgweDAxLCBkZXYuZnhfbW9kX2FkZHIpOworCQlvdXRiIChpLCBkZXYuZnhfbW9kX2RhdGEpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwkJb3V0YiAoMHgwMiwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgwMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJZm9yIChpID0gMHhiMDsgaSA8PSAweGJmOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgyMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJZm9yIChpID0gMHhmMDsgaSA8PSAweGZmOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgyMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJZm9yIChpID0gMHgxMDsgaSA8PSAweDFkOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHhmZiwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJb3V0YiAoMHgxZSwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDQwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJZm9yIChpID0gMHgxZjsgaSA8PSAweDJkOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHhmZiwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJb3V0YiAoMHgyZSwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJZm9yIChpID0gMHgyZjsgaSA8PSAweDNlOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgwMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJb3V0YiAoMHgzZiwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDIwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJZm9yIChpID0gMHg0MDsgaSA8PSAweDRkOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgwMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJb3V0YiAoMHg0ZSwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDBlLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4NGYsIGRldi5meF9tb2RfYWRkcik7CisJb3V0YiAoMHgwZSwgZGV2LmZ4X21vZF9kYXRhKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKworCisJZm9yIChpID0gMHg1MDsgaSA8PSAweDZiOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgwMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJb3V0YiAoMHg2YywgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDQwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJb3V0YiAoMHg2ZCwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJb3V0YiAoMHg2ZSwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDQwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJb3V0YiAoMHg2ZiwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDQwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJZm9yIChpID0gMHg3MDsgaSA8PSAweDdmOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHhjMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCWZvciAoaSA9IDB4ODA7IGkgPD0gMHhhZjsgaSsrKSB7CisJCW91dGIgKGksIGRldi5meF9tb2RfYWRkcik7CisJCW91dGIgKDB4MDAsIGRldi5meF9tb2RfZGF0YSk7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKworCWZvciAoaSA9IDB4YzA7IGkgPD0gMHhkZDsgaSsrKSB7CisJCW91dGIgKGksIGRldi5meF9tb2RfYWRkcik7CisJCW91dGIgKDB4MDAsIGRldi5meF9tb2RfZGF0YSk7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKworCW91dGIgKDB4ZGUsIGRldi5meF9tb2RfYWRkcik7CisJb3V0YiAoMHgxMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweGRmLCBkZXYuZnhfbW9kX2FkZHIpOworCW91dGIgKDB4MTAsIGRldi5meF9tb2RfZGF0YSk7CisJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisKKwlmb3IgKGkgPSAweGUwOyBpIDw9IDB4ZWY7IGkrKykgeworCQlvdXRiIChpLCBkZXYuZnhfbW9kX2FkZHIpOworCQlvdXRiICgweDAwLCBkZXYuZnhfbW9kX2RhdGEpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwlmb3IgKGkgPSAweDAwOyBpIDw9IDB4MGY7IGkrKykgeworCQlvdXRiICgweDAxLCBkZXYuZnhfbW9kX2FkZHIpOworCQlvdXRiIChpLCBkZXYuZnhfbW9kX2RhdGEpOworCQlvdXRiICgweDAyLCBkZXYuZnhfbW9kX2FkZHIpOworCQlvdXRiICgweDAxLCBkZXYuZnhfbW9kX2RhdGEpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwlvdXRiICgweDAyLCBkZXYuZnhfb3ApOyAvKiBtdXRlIG9uICovCisKKwkvKiBOb3cgc2V0IHRoZSBjb2VmZmljaWVudHMgYW5kIHNvIGZvcnRoIGZvciB0aGUgcHJvZ3JhbXMgYWJvdmUgKi8KKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvZWZmaWNpZW50cyk7IGkgKz0gNCkgeworCQlvdXRiIChjb2VmZmljaWVudHNbaV0sIGRldi5meF9kc3BfcGFnZSk7CisJCW91dGIgKGNvZWZmaWNpZW50c1tpKzFdLCBkZXYuZnhfZHNwX2FkZHIpOworCQlvdXRiIChjb2VmZmljaWVudHNbaSsyXSwgZGV2LmZ4X2RzcF9tc2IpOworCQlvdXRiIChjb2VmZmljaWVudHNbaSszXSwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwkvKiBTb21lIHNldHRpbmdzICg/KSB0aGF0IGFyZSB0b28gc21hbGwgdG8gYnVuZGxlIGludG8gbG9vcHMgKi8KKworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MWUsIGRldi5meF9tb2RfYWRkcik7CisJb3V0YiAoMHgxNCwgZGV2LmZ4X21vZF9kYXRhKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweGRlLCBkZXYuZnhfbW9kX2FkZHIpOworCW91dGIgKDB4MjAsIGRldi5meF9tb2RfZGF0YSk7CisJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJb3V0YiAoMHhkZiwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDIwLCBkZXYuZnhfbW9kX2RhdGEpOworICAgIAorCS8qIHNvbWUgbW9yZSBjb2VmZmljaWVudHMgKi8KKworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDYsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHg3OCwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHg0MCwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwMywgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDBmLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHhmZiwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwYiwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDBmLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHhmZiwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwMiwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwYSwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHg0NiwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHg0OSwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9sc2IpOworICAgIAorCS8qIE5vdywgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIGxldHMgcmVsb2FkIGV2ZXJ5IHBhZ2UKKwkgICBhbmQgYWxsIHRoZSBjb2VmZmljaWVudHMgb3ZlciBhZ2Fpbi4gSSBoYXZlICpOTyogaWRlYQorCSAgIHdoeSB0aGlzIGlzIGRvbmUuIEkgZG8ga25vdyB0aGF0IG5vIHNvdW5kIGlzIHByb2R1Y2VkCisJICAgaXMgdGhpcyBwaGFzZSBpcyBvbWl0dGVkLgorCSovCisKKwlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYuZnhfbGNyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX3BhZ2UpOyAgCisJb3V0YiAoMHgxMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfemVyb192Mik7IGkgKz0gMikgeworCQlvdXRiIChwYWdlX3plcm9fdjJbaV0sIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAocGFnZV96ZXJvX3YyW2krMV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOworCW91dGIgKDB4MDEsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgxMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2Vfb25lX3YyKTsgaSArPSAyKSB7CisJCW91dGIgKHBhZ2Vfb25lX3YyW2ldLCBkZXYuZnhfZHNwX21zYik7CisJCW91dGIgKHBhZ2Vfb25lX3YyW2krMV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworICAgIAorCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOworCW91dGIgKDB4MDIsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgxMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfdHdvX3YyKTsgaSsrKSB7CisJCW91dGIgKHBhZ2VfdHdvX3YyW2ldLCBkZXYuZnhfZHNwX2xzYik7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKwlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYuZnhfbGNyKTsKKwlvdXRiICgweDAzLCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4MTAsIGRldi5meF9kc3BfYWRkcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX3RocmVlX3YyKTsgaSsrKSB7CisJCW91dGIgKHBhZ2VfdGhyZWVfdjJbaV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOworCW91dGIgKDB4MDQsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgxMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfZm91cl92Mik7IGkrKykgeworCQlvdXRiIChwYWdlX2ZvdXJfdjJbaV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCW91dGIgKEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJb3V0YiAoMHgwNiwgZGV2LmZ4X2RzcF9wYWdlKTsKKworCS8qIFBhZ2Ugc2l4IHYuMiBpcyBhbGdvcml0aG1pYyAqLworICAgIAorCWZvciAoaSA9IDB4MTA7IGkgPD0gMHgzZTsgaSArPSAyKSB7CisJCW91dGIgKGksIGRldi5meF9kc3BfYWRkcik7CisJCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYuZnhfbGNyKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4MTAsIGRldi5meF9kc3BfYWRkcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX3NldmVuX3YyKTsgaSArPSAyKSB7CisJCW91dGIgKHBhZ2Vfc2V2ZW5fdjJbaV0sIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAocGFnZV9zZXZlbl92MltpKzFdLCBkZXYuZnhfZHNwX2xzYik7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKworCWZvciAoaSA9IDB4MDA7IGkgPCBzaXplb2YobW9kX3YyKTsgaSArPSAyKSB7CisJCW91dGIgKG1vZF92MltpXSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAobW9kX3YyW2krMV0sIGRldi5meF9tb2RfZGF0YSk7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvZWZmaWNpZW50czIpOyBpICs9IDQpIHsKKwkJb3V0YiAoY29lZmZpY2llbnRzMltpXSwgZGV2LmZ4X2RzcF9wYWdlKTsKKwkJb3V0YiAoY29lZmZpY2llbnRzMltpKzFdLCBkZXYuZnhfZHNwX2FkZHIpOworCQlvdXRiIChjb2VmZmljaWVudHMyW2krMl0sIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAoY29lZmZpY2llbnRzMltpKzNdLCBkZXYuZnhfZHNwX2xzYik7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvZWZmaWNpZW50czMpOyBpICs9IDIpIHsKKwkJaW50IHg7CisKKwkJb3V0YiAoMHgwNywgZGV2LmZ4X2RzcF9wYWdlKTsKKwkJeCA9IChpICUgNCkgPyAweDRlIDogMHg0YzsKKwkJb3V0YiAoeCwgZGV2LmZ4X2RzcF9hZGRyKTsKKwkJb3V0YiAoY29lZmZpY2llbnRzM1tpXSwgZGV2LmZ4X2RzcF9tc2IpOworCQlvdXRiIChjb2VmZmljaWVudHMzW2krMV0sIGRldi5meF9kc3BfbHNiKTsKKwl9CisKKwlvdXRiICgweDAwLCBkZXYuZnhfb3ApOyAvKiBtdXRlIG9mZiAqLworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBpbyA9IC0xOworc3RhdGljIGludCBpcnEgPSAtMTsKKworTU9EVUxFX0FVVEhPUiAgICAgICgiUGF1bCBCYXJ0b24tRGF2aXMgPHBiZEBvcC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJUdXJ0bGUgQmVhY2ggV2F2ZUZyb250IExpbnV4IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtICAgICAgIChpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSAgICAgICAoaXJxLCBpbnQsIDApOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3dhdmZyb250ICh2b2lkKQoreworCXByaW50ayAoIlR1cnRsZSBCZWFjaCBXYXZlRnJvbnQgRHJpdmVyXG4iCisJCSJDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNvbHZhaW5lbiwgIgorCQkiUGF1bCBCYXJ0b24tRGF2aXMgMTk5My0xOTk4LlxuIik7CisKKwkvKiBYWFggdCd3b3VsZCBiZSBsb3ZlbHkgdG8gYXNrIHRoZSBDUzQyMzIgZm9yIHRoZXNlIHZhbHVlcywgZWggPyAqLworCisJaWYgKGlvID09IC0xIHx8IGlycSA9PSAtMSkgeworCQlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FICJpcnEgYW5kIGlvIG9wdGlvbnMgbXVzdCBiZSBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdhdmVmcm9udF9pbnRlcnJ1cHRfYml0cyAoaXJxKSA8IDApIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gTE9HTkFNRQorCQkJIklSUSBtdXN0IGJlIDksIDUsIDEyIG9yIDE1IChub3QgJWQpXG4iLCBpcnEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoZGV0ZWN0X3dhdmVmcm9udCAoaXJxLCBpbykgPCAwKSB7CisJCXJldHVybiAtRU5PREVWOworCX0gCisKKwlpZiAoaW5zdGFsbF93YXZlZnJvbnQgKCkgPCAwKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF93YXZmcm9udCAodm9pZCkKK3sKKwl1bmluc3RhbGxfd2F2ZWZyb250ICgpOworfQorCittb2R1bGVfaW5pdChpbml0X3dhdmZyb250KTsKK21vZHVsZV9leGl0KGNsZWFudXBfd2F2ZnJvbnQpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3dmX21pZGkuYyBiL3NvdW5kL29zcy93Zl9taWRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxNjdiNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy93Zl9taWRpLmMKQEAgLTAsMCArMSw4ODAgQEAKKy8qCisgKiBzb3VuZC93Zl9taWRpLmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgdGhlIFdhdmVGcm9udCBJQ1MyMTE1IE1JREkgaW50ZXJmYWNlKHMpCisgKiBOb3RlIHRoYXQgdGhlcmUgaXMgYWxzbyBhbiBNUFUtNDAxIGVtdWxhdGlvbiAoYWN0dWFsbHksIGEgVUFSVC00MDEKKyAqIGVtdWxhdGlvbikgb24gdGhlIENTNDIzMiBvbiB0aGUgVHJvcGV6IFBsdXMuIFRoaXMgY29kZSBoYXMgbm90aGluZworICogdG8gZG8gd2l0aCB0aGF0IGludGVyZmFjZSBhdCBhbGwuCisgKgorICogVGhlIGludGVyZmFjZSBpcyBlc3NlbnRpYWxseSBqdXN0IGEgVUFSVC00MDEsIGJ1dCBpcyBoYXMgdGhlCisgKiBpbnRlcmVzdGluZyBwcm9wZXJ0eSBvZiBzdXBwb3J0aW5nIHdoYXQgVHVydGxlIEJlYWNoIGNhbGxlZAorICogIlZpcnR1YWwgTUlESSIgbW9kZS4gSW4gdGhpcyBtb2RlLCB0aGVyZSBhcmUgZWZmZWN0aXZlbHkgKnR3byoKKyAqIE1JREkgYnVzZXMgYWNjZXNzaWJsZSB2aWEgdGhlIGludGVyZmFjZSwgb25lIHRoYXQgaXMgcm91dGVkCisgKiBzb2xlbHkgdG8vZnJvbSB0aGUgZXh0ZXJuYWwgV2F2ZUZyb250IHN5bnRoZXNpemVyIGFuZCB0aGUgb3RoZXIKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpbi9zb2NrZXQgY29ubmVjdG9yIHVzZWQgdG8gbGluayBleHRlcm5hbAorICogTUlESSBkZXZpY2VzIHRvIHRoZSBib2FyZC4KKyAqCisgKiBUaGlzIGRyaXZlciBmdWxseSBzdXBwb3J0cyB0aGlzIG1vZGUsIGFsbG93aW5nIHR3byBkaXN0aW5jdAorICogbWlkaSBkZXZpY2VzICgvZGV2L21pZGlOTiBhbmQgL2Rldi9taWRpTk4rMSkgdG8gYmUgdXNlZAorICogY29tcGxldGVseSBpbmRlcGVuZGVudGx5LCBnaXZpbmcgMzIgY2hhbm5lbHMgb2YgTUlESSByb3V0aW5nLAorICogMTYgdG8gdGhlIFdhdmVGcm9udCBzeW50aCBhbmQgMTYgdG8gdGhlIGV4dGVybmFsIE1JREkgYnVzLgorICoKKyAqIFN3aXRjaGluZyBiZXR3ZWVuIHRoZSB0d28gaXMgYWNjb21wbGlzaGVkIGV4dGVybmFsbHkgYnkgdGhlIGRyaXZlcgorICogdXNpbmcgdGhlIHR3byBvdGhlcndpc2UgdW51c2VkIE1JREkgYnl0ZXMuIFNlZSB0aGUgY29kZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE5PVEU6IFZJUlRVQUwgTUlESSBNT0RFIElTIE9OIEJZIERFRkFVTFQgKHNlZSB3YXZlZnJvbnQuYykKKyAqCisgKiBUaGUgbWFpbiByZWFzb24gdG8gdHVybiBvZmYgVmlydHVhbCBNSURJIG1vZGUgaXMgd2hlbiB5b3Ugd2FudCB0bworICogdGlnaHRseSBjb3VwbGUgdGhlIFdhdmVGcm9udCBzeW50aCB3aXRoIGFuIGV4dGVybmFsIE1JREkKKyAqIGRldmljZS4gWW91IHdvbid0IGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggdGhlIHNvdXJjZSBvZiBhbnkgTUlESQorICogZGF0YSBleGNlcHQgdmlhIFN5c0V4IElELCBidXQgdGhhdHMgcHJvYmFibHkgT0ssIHNpbmNlIGZvciB0aGUgbW9zdAorICogcGFydCwgdGhlIFdhdmVGcm9udCB3b24ndCBiZSBzZW5kaW5nIGFueSBNSURJIGRhdGEgYXQgYWxsLgorICogIAorICogVGhlIG1haW4gcmVhc29uIHRvIHR1cm4gb24gVmlydHVhbCBNSURJIE1vZGUgaXMgdG8gcHJvdmlkZSB0d28KKyAqIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgMTYtY2hhbm5lbCBNSURJIGJ1c2VzLCBvbmUgdG8gdGhlCisgKiBXYXZlRnJvbnQgYW5kIG9uZSB0byBhbnkgZXh0ZXJuYWwgTUlESSBkZXZpY2VzLiBHaXZlbiB0aGUgMzIKKyAqIHZvaWNlIG5hdHVyZSBvZiB0aGUgV2F2ZUZyb250LCBpdHMgcHJldHR5IGVhc3kgdG8gZmluZCBhIHVzZQorICogZm9yIGFsbCAxNiBjaGFubmVscyBkcml2aW5nIGp1c3QgdGhhdCBzeW50aC4KKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgUGF1bCBCYXJ0b24tRGF2aXMgMTk5OAorICogU29tZSBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB3b3JrIHRoYXQgaXM6CisgKgorICogICAgQ29weXJpR2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NgorICoKKyAqIFVTUy9MaXRlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8bGludXgvd2F2ZWZyb250Lmg+CisKKyNpZmRlZiBNT0RVTEUKKworc3RydWN0IHdmX21wdV9jb25maWcgeworCWludCAgICAgICAgICAgICBiYXNlOworI2RlZmluZQlEQVRBUE9SVChkKSAgIChkKS0+YmFzZQorI2RlZmluZQlDT01EUE9SVChkKSAgIChkKS0+YmFzZSsxCisjZGVmaW5lCVNUQVRQT1JUKGQpICAgKGQpLT5iYXNlKzEKKworCWludCAgICAgICAgICAgICBpcnE7CisJaW50ICAgICAgICAgICAgIG9wZW5lZDsKKwlpbnQgICAgICAgICAgICAgZGV2bm87CisJaW50ICAgICAgICAgICAgIHN5bnRobm87CisJaW50ICAgICAgICAgICAgIG1vZGU7CisjZGVmaW5lIE1PREVfTUlESQkxCisjZGVmaW5lIE1PREVfU1lOVEgJMgorCisJdm9pZCAgICAgICAgICAgICgqaW5wdXRpbnRyKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKTsKKwljaGFyIGlzdmlydHVhbDsgICAgICAgICAgICAgICAgLyogZG8gdmlydHVhbCBJL08gc3R1ZmYgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAgZGV2c1syXTsKK3N0YXRpYyBzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAqcGh5c19kZXYgPSAmZGV2c1swXTsKK3N0YXRpYyBzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAqdmlydF9kZXYgPSAmZGV2c1sxXTsKKworc3RhdGljIHZvaWQgc3RhcnRfdWFydF9tb2RlICh2b2lkKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKKyNkZWZpbmUJT1VUUFVUX1JFQURZCTB4NDAKKyNkZWZpbmUJSU5QVVRfQVZBSUwJMHg4MAorI2RlZmluZQlNUFVfQUNLCQkweEZFCisjZGVmaW5lCVVBUlRfTU9ERV9PTgkweDNGCisKK3N0YXRpYyBpbmxpbmUgaW50IHdmX21wdV9zdGF0dXMgKHZvaWQpCit7CisJcmV0dXJuIGluYiAoU1RBVFBPUlQgKHBoeXNfZGV2KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlucHV0X2F2YWlsICh2b2lkKQoreworCXJldHVybiAhKHdmX21wdV9zdGF0dXMoKSAmIElOUFVUX0FWQUlMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X3JlYWR5ICh2b2lkKQoreworCXJldHVybiAhKHdmX21wdV9zdGF0dXMoKSAmIE9VVFBVVF9SRUFEWSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50ICByZWFkX2RhdGEgKHZvaWQpCit7CisJcmV0dXJuIGluYiAoREFUQVBPUlQgKHBoeXNfZGV2KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9kYXRhICh1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJb3V0YiAoYnl0ZSwgREFUQVBPUlQgKHBoeXNfZGV2KSk7Cit9CisKKy8qCisgKiBTdGF0ZXMgZm9yIHRoZSBpbnB1dCBzY2FubmVyIChzaG91bGQgYmUgaW4gZGV2X3RhYmxlLmgpCisgKi8KKworI2RlZmluZSBNU1RfU1lTTVNHCQkxMDAJLyogU3lzdGVtIG1lc3NhZ2UgKHN5c3ggZXRjKS4gKi8KKyNkZWZpbmUgTVNUX01UQwkJCTEwMgkvKiBNaWRpIFRpbWUgQ29kZSAoTVRDKSBxZnJhbWUgbXNnICovCisjZGVmaW5lIE1TVF9TT05HU0VMCQkxMDMJLyogU29uZyBzZWxlY3QgKi8KKyNkZWZpbmUgTVNUX1NPTkdQT1MJCTEwNAkvKiBTb25nIHBvc2l0aW9uIHBvaW50ZXIgKi8KKyNkZWZpbmUgTVNUX1RJTUVECQkxMDUJLyogTGVhZGluZyB0aW1pbmcgYnl0ZSByY3ZkICovCisKKy8qIGJ1ZmZlciBzcGFjZSBjaGVjayBmb3IgaW5wdXQgc2Nhbm5lciAqLworCisjZGVmaW5lIEJVRlRFU1QobWkpIGlmIChtaS0+bV9wdHIgPj0gTUlfTUFYIHx8IG1pLT5tX3B0ciA8IDApIFwKK3twcmludGsoS0VSTl9FUlIgIldGLU1QVTogSW52YWxpZCBidWZmZXIgcG9pbnRlciAlZC8lZCwgcz0lZFxuIiwgXAorCW1pLT5tX3B0ciwgbWktPm1fbGVmdCwgbWktPm1fc3RhdGUpO21pLT5tX3B0ci0tO30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVuX3RhYltdID0JLyogIyBvZiBkYXRhIGJ5dGVzIGZvbGxvd2luZyBhIHN0YXR1cworCQkJCQkgKi8KK3sKKwkyLAkJCQkvKiA4eCAqLworCTIsCQkJCS8qIDl4ICovCisJMiwJCQkJLyogQXggKi8KKwkyLAkJCQkvKiBCeCAqLworCTEsCQkJCS8qIEN4ICovCisJMSwJCQkJLyogRHggKi8KKwkyLAkJCQkvKiBFeCAqLworCTAJCQkJLyogRnggKi8KK307CisKK3N0YXRpYyBpbnQKK3dmX21wdV9pbnB1dF9zY2FubmVyIChpbnQgZGV2bm8sIGludCBzeW50aGRldiwgdW5zaWduZWQgY2hhciBtaWRpYykKKworeworCXN0cnVjdCBtaWRpX2lucHV0X2luZm8gKm1pID0gJm1pZGlfZGV2c1tkZXZub10tPmluX2luZm87CisKKwlzd2l0Y2ggKG1pLT5tX3N0YXRlKSB7CisJY2FzZSBNU1RfSU5JVDoKKwkJc3dpdGNoIChtaWRpYykgeworCQljYXNlIDB4Zjg6CisJCQkvKiBUaW1lciBvdmVyZmxvdyAqLworCQkJYnJlYWs7CisJCQorCQljYXNlIDB4ZmM6CisJCQlicmVhazsKKwkJCisJCWNhc2UgMHhmZDoKKwkJCS8qIFhYWCBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhpcy4gSWYgdGhlcmUgaXMKKwkJCSAgIGFuIGV4dGVybmFsIE1JREkgdGltZXIgKGUuZy4gYSBoYXJkd2FyZSBzZXF1ZW5jZXIsCisJCQkgICBhIHVzZWZ1bCB0aW1lciBjYW4gYmUgZGVyaXZlZCAuLi4KKwkJICAgCisJCQkgICBGb3Igbm93LCBubyB0aW1lciBzdXBwb3J0LgorCQkJKi8KKwkJCWJyZWFrOworCQkKKwkJY2FzZSAweGZlOgorCQkJcmV0dXJuIE1QVV9BQ0s7CisJCQlicmVhazsKKwkJCisJCWNhc2UgMHhmMDoKKwkJY2FzZSAweGYxOgorCQljYXNlIDB4ZjI6CisJCWNhc2UgMHhmMzoKKwkJY2FzZSAweGY0OgorCQljYXNlIDB4ZjU6CisJCWNhc2UgMHhmNjoKKwkJY2FzZSAweGY3OgorCQkJYnJlYWs7CisJCQorCQljYXNlIDB4Zjk6CisJCQlicmVhazsKKwkJCisJCWNhc2UgMHhmZjoKKwkJCW1pLT5tX3N0YXRlID0gTVNUX1NZU01TRzsKKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCWlmIChtaWRpYyA8PSAweGVmKSB7CisJCQkJbWktPm1fc3RhdGUgPSBNU1RfVElNRUQ7CisJCQl9CisJCQllbHNlCisJCQkJcHJpbnRrIChLRVJOX0VSUiAiPE1QVTogVW5rbm93biBldmVudCAlMDJ4PiAiLAorCQkJCQltaWRpYyk7CisJCX0KKwkJYnJlYWs7CisJICAKKwljYXNlIE1TVF9USU1FRDoKKwl7CisJCWludCAgICAgICAgICAgICBtc2cgPSAoKGludCkgKG1pZGljICYgMHhmMCkgPj4gNCk7CisJICAKKwkJbWktPm1fc3RhdGUgPSBNU1RfREFUQTsKKwkgIAorCQlpZiAobXNnIDwgOCkgewkvKiBEYXRhIGJ5dGUgKi8KKwkgICAgICAKKwkJCW1zZyA9ICgoaW50KSAobWktPm1fcHJldl9zdGF0dXMgJiAweGYwKSA+PiA0KTsKKwkJCW1zZyAtPSA4OworCQkJbWktPm1fbGVmdCA9IGxlbl90YWJbbXNnXSAtIDE7CisJICAgICAgCisJCQltaS0+bV9wdHIgPSAyOworCQkJbWktPm1fYnVmWzBdID0gbWktPm1fcHJldl9zdGF0dXM7CisJCQltaS0+bV9idWZbMV0gPSBtaWRpYzsKKworCQkJaWYgKG1pLT5tX2xlZnQgPD0gMCkgeworCQkJCW1pLT5tX3N0YXRlID0gTVNUX0lOSVQ7CisJCQkJZG9fbWlkaV9tc2cgKHN5bnRoZGV2LCBtaS0+bV9idWYsIG1pLT5tX3B0cik7CisJCQkJbWktPm1fcHRyID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChtc2cgPT0gMHhmKSB7CS8qIE1QVSBNQVJLICovCisJICAgICAgCisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCisJCQlzd2l0Y2ggKG1pZGljKSB7CisJCQljYXNlIDB4Zjg6CisJCQkJYnJlYWs7CisJCSAgICAKKwkJCWNhc2UgMHhmOToKKwkJCQlicmVhazsKKwkJICAgIAorCQkJY2FzZSAweGZjOgorCQkJCWJyZWFrOworCQkgICAgCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJbWktPm1fcHJldl9zdGF0dXMgPSBtaWRpYzsKKwkJCW1zZyAtPSA4OworCQkJbWktPm1fbGVmdCA9IGxlbl90YWJbbXNnXTsKKwkgICAgICAKKwkJCW1pLT5tX3B0ciA9IDE7CisJCQltaS0+bV9idWZbMF0gPSBtaWRpYzsKKwkgICAgICAKKwkJCWlmIChtaS0+bV9sZWZ0IDw9IDApIHsKKwkJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJCWRvX21pZGlfbXNnIChzeW50aGRldiwgbWktPm1fYnVmLCBtaS0+bV9wdHIpOworCQkJCW1pLT5tX3B0ciA9IDA7CisJCQl9CisJCX0KKwl9CisJYnJlYWs7CisKKwljYXNlIE1TVF9TWVNNU0c6CisJCXN3aXRjaCAobWlkaWMpIHsKKwkJY2FzZSAweGYwOgorCQkJbWktPm1fc3RhdGUgPSBNU1RfU1lTRVg7CisJCQlicmVhazsKKwkgICAgCisJCWNhc2UgMHhmMToKKwkJCW1pLT5tX3N0YXRlID0gTVNUX01UQzsKKwkJCWJyZWFrOworCisJCWNhc2UgMHhmMjoKKwkJCW1pLT5tX3N0YXRlID0gTVNUX1NPTkdQT1M7CisJCQltaS0+bV9wdHIgPSAwOworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4ZjM6CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9TT05HU0VMOworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4ZjY6CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCSAgICAKKwkJCS8qCisJCQkgKiAgICBSZWFsIHRpbWUgbWVzc2FnZXMKKwkJCSAqLworCQljYXNlIDB4Zjg6CisJCQkvKiBtaWRpIGNsb2NrICovCisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJLyogWFhYIG5lZWQgZXh0IE1JREkgdGltZXIgc3VwcG9ydCAqLworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4ZkE6CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJLyogWFhYIG5lZWQgZXh0IE1JREkgdGltZXIgc3VwcG9ydCAqLworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4RkI6CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJLyogWFhYIG5lZWQgZXh0IE1JREkgdGltZXIgc3VwcG9ydCAqLworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4RkM6CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJLyogWFhYIG5lZWQgZXh0IE1JREkgdGltZXIgc3VwcG9ydCAqLworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4RkU6CisJCQkvKiBhY3RpdmUgc2Vuc2luZyAqLworCQkJbWktPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJCWJyZWFrOworCSAgICAKKwkJY2FzZSAweGZmOgorCQkJbWktPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsgKEtFUk5fRVJSICJ1bmtub3duIE1JREkgc3lzbXNnICUweFxuIiwgbWlkaWMpOworCQkJbWktPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTVNUX01UQzoKKwkJbWktPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJYnJlYWs7CisKKwljYXNlIE1TVF9TWVNFWDoKKwkJaWYgKG1pZGljID09IDB4ZjcpIHsKKwkJCW1pLT5tX3N0YXRlID0gTVNUX0lOSVQ7CisJCX0gZWxzZSB7CisJCQkvKiBYWFggZml4IG1lICovCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1TVF9TT05HUE9TOgorCQlCVUZURVNUIChtaSk7CisJCW1pLT5tX2J1ZlttaS0+bV9wdHIrK10gPSBtaWRpYzsKKwkJaWYgKG1pLT5tX3B0ciA9PSAyKSB7CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJbWktPm1fcHRyID0gMDsKKwkJCS8qIFhYWCBuZWVkIGV4dCBNSURJIHRpbWVyIHN1cHBvcnQgKi8KKwkJfQorCQlicmVhazsKKworCWNhc2UgTVNUX0RBVEE6CisJCUJVRlRFU1QgKG1pKTsKKwkJbWktPm1fYnVmW21pLT5tX3B0cisrXSA9IG1pZGljOworCQlpZiAoKC0tbWktPm1fbGVmdCkgPD0gMCkgeworCQkJbWktPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJCWRvX21pZGlfbXNnIChzeW50aGRldiwgbWktPm1fYnVmLCBtaS0+bV9wdHIpOworCQkJbWktPm1fcHRyID0gMDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayAoS0VSTl9FUlIgIkJhZCBzdGF0ZSAlZCAiLCBtaS0+bV9zdGF0ZSk7CisJCW1pLT5tX3N0YXRlID0gTVNUX0lOSVQ7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAord2ZfbXB1aW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpkdW1teSkKKworeworCXN0cnVjdCB3Zl9tcHVfY29uZmlnICpwaHlzaWNhbF9kZXYgPSBkZXZfaWQ7CisJc3RhdGljIHN0cnVjdCB3Zl9tcHVfY29uZmlnICppbnB1dF9kZXY7CisJc3RydWN0IG1pZGlfaW5wdXRfaW5mbyAqbWkgPSAmbWlkaV9kZXZzW3BoeXNpY2FsX2Rldi0+ZGV2bm9dLT5pbl9pbmZvOworCWludCBuOworCisJaWYgKCFpbnB1dF9hdmFpbCgpKSB7IC8qIG5vdCBmb3IgdXMgKi8KKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChtaS0+bV9idXN5KQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJc3Bpbl9sb2NrKCZsb2NrKTsKKwltaS0+bV9idXN5ID0gMTsKKworCWlmICghaW5wdXRfZGV2KSB7CisJCWlucHV0X2RldiA9IHBoeXNpY2FsX2RldjsKKwl9CisKKwluID0gNTA7IC8qIFhYWCB3aHkgPyAqLworCisJZG8geworCQl1bnNpZ25lZCBjaGFyIGMgPSByZWFkX2RhdGEgKCk7CisgICAgICAKKwkJaWYgKHBoeXNfZGV2LT5pc3ZpcnR1YWwpIHsKKworCQkJaWYgKGMgPT0gV0ZfRVhURVJOQUxfU1dJVENIKSB7CisJCQkJaW5wdXRfZGV2ID0gdmlydF9kZXY7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKGMgPT0gV0ZfSU5URVJOQUxfU1dJVENIKSB7IAorCQkJCWlucHV0X2RldiA9IHBoeXNfZGV2OworCQkJCWNvbnRpbnVlOworCQkJfSAvKiBlbHNlIGp1c3QgbGVhdmUgaXQgYXMgaXQgaXMgKi8KKworCQl9IGVsc2UgeworCQkJaW5wdXRfZGV2ID0gcGh5c19kZXY7CisJCX0KKworCQlpZiAoaW5wdXRfZGV2LT5tb2RlID09IE1PREVfU1lOVEgpIHsKKwkgIAorCQkJd2ZfbXB1X2lucHV0X3NjYW5uZXIgKGlucHV0X2Rldi0+ZGV2bm8sCisJCQkJCSAgICAgIGlucHV0X2Rldi0+c3ludGhubywgYyk7CisJICAKKwkJfSBlbHNlIGlmIChpbnB1dF9kZXYtPm9wZW5lZCAmIE9QRU5fUkVBRCkgeworCSAgCisJCQlpZiAoaW5wdXRfZGV2LT5pbnB1dGludHIpIHsKKwkJCQlpbnB1dF9kZXYtPmlucHV0aW50ciAoaW5wdXRfZGV2LT5kZXZubywgYyk7CisJCQl9IAorCQl9CisKKwl9IHdoaWxlIChpbnB1dF9hdmFpbCgpICYmIG4tLSA+IDApOworCisJbWktPm1fYnVzeSA9IDA7CisJc3Bpbl91bmxvY2soJmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludAord2ZfbXB1X29wZW4gKGludCBkZXYsIGludCBtb2RlLAorCSAgICAgdm9pZCAgICAgICAgICAgICgqaW5wdXQpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpLAorCSAgICAgdm9pZCAgICAgICAgICAgICgqb3V0cHV0KSAoaW50IGRldikKKwkpCit7CisJc3RydWN0IHdmX21wdV9jb25maWcgKmRldmM7CisKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX21pZGlzIHx8IG1pZGlfZGV2c1tkZXZdPT1OVUxMKQorCQlyZXR1cm4gLShFTlhJTyk7CisKKwlpZiAocGh5c19kZXYtPmRldm5vID09IGRldikgeworCQlkZXZjID0gcGh5c19kZXY7CisJfSBlbHNlIGlmIChwaHlzX2Rldi0+aXN2aXJ0dWFsICYmIHZpcnRfZGV2LT5kZXZubyA9PSBkZXYpIHsKKwkJZGV2YyA9IHZpcnRfZGV2OworCX0gZWxzZSB7CisJCXByaW50ayAoS0VSTl9FUlIgIldGLU1QVTogdW5rbm93biBkZXZpY2UgbnVtYmVyICVkXG4iLCBkZXYpOworCQlyZXR1cm4gLShFSU5WQUwpOworCX0KKworCWlmIChkZXZjLT5vcGVuZWQpIHsKKwkJcmV0dXJuIC0oRUJVU1kpOworCX0KKworCWRldmMtPm1vZGUgPSBNT0RFX01JREk7CisJZGV2Yy0+b3BlbmVkID0gbW9kZTsKKwlkZXZjLT5zeW50aG5vID0gMDsKKworCWRldmMtPmlucHV0aW50ciA9IGlucHV0OworCXJldHVybiAwOworfQorIAorc3RhdGljIHZvaWQKK3dmX21wdV9jbG9zZSAoaW50IGRldikKK3sKKwlzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAqZGV2YzsKKworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBudW1fbWlkaXMgfHwgbWlkaV9kZXZzW2Rldl09PU5VTEwpCisJCXJldHVybjsKKworCWlmIChwaHlzX2Rldi0+ZGV2bm8gPT0gZGV2KSB7CisJCWRldmMgPSBwaHlzX2RldjsKKwl9IGVsc2UgaWYgKHBoeXNfZGV2LT5pc3ZpcnR1YWwgJiYgdmlydF9kZXYtPmRldm5vID09IGRldikgeworCQlkZXZjID0gdmlydF9kZXY7CisJfSBlbHNlIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiV0YtTVBVOiB1bmtub3duIGRldmljZSBudW1iZXIgJWRcbiIsIGRldik7CisJCXJldHVybjsKKwl9CisKKwlkZXZjLT5tb2RlID0gMDsKKwlkZXZjLT5pbnB1dGludHIgPSBOVUxMOworCWRldmMtPm9wZW5lZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3dmX21wdV9vdXQgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKQoreworCWludCAgICAgICAgICAgICB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlzdGF0aWMgaW50IGxhc3RvdXRkZXYgPSAtMTsKKwl1bnNpZ25lZCBjaGFyIHN3aXRjaGNoOworCisJaWYgKHBoeXNfZGV2LT5pc3ZpcnR1YWwgJiYgbGFzdG91dGRldiAhPSBkZXYpIHsKKyAgICAgIAorCQlpZiAoZGV2ID09IHBoeXNfZGV2LT5kZXZubykgeyAKKwkJCXN3aXRjaGNoID0gV0ZfSU5URVJOQUxfU1dJVENIOworCQl9IGVsc2UgaWYgKGRldiA9PSB2aXJ0X2Rldi0+ZGV2bm8pIHsgCisJCQlzd2l0Y2hjaCA9IFdGX0VYVEVSTkFMX1NXSVRDSDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIldGLU1QVTogYmFkIGRldmljZSBudW1iZXIgJWQiLCBkZXYpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCS8qIFhYWCBmaXggbWUgKi8KKyAgICAgIAorCQlmb3IgKHRpbWVvdXQgPSAzMDAwMDsgdGltZW91dCA+IDAgJiYgIW91dHB1dF9yZWFkeSAoKTsKKwkJICAgICB0aW1lb3V0LS0pOworICAgICAgCisJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKyAgICAgIAorCQlpZiAoIW91dHB1dF9yZWFkeSAoKSkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIldGLU1QVTogU2VuZCBzd2l0Y2ggIgorCQkJCSJieXRlIHRpbWVvdXRcbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorICAgICAgCisJCXdyaXRlX2RhdGEgKHN3aXRjaGNoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJfSAKKworCWxhc3RvdXRkZXYgPSBkZXY7CisKKwkvKgorCSAqIFNvbWV0aW1lcyBpdCB0YWtlcyBhYm91dCAzMDAwMCBsb29wcyBiZWZvcmUgdGhlIG91dHB1dCBiZWNvbWVzIHJlYWR5CisJICogKEFmdGVyIHJlc2V0KS4gTm9ybWFsbHkgaXQgdGFrZXMganVzdCBhYm91dCAxMCBsb29wcy4KKwkgKi8KKworCS8qIFhYWCBmaXggbWUgKi8KKworCWZvciAodGltZW91dCA9IDMwMDAwOyB0aW1lb3V0ID4gMCAmJiAhb3V0cHV0X3JlYWR5ICgpOyB0aW1lb3V0LS0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCWlmICghb3V0cHV0X3JlYWR5ICgpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQlwcmludGsgKEtFUk5fV0FSTklORyAiV0YtTVBVOiBTZW5kIGRhdGEgdGltZW91dFxuIik7CisJCXJldHVybiAwOworCX0KKworCXdyaXRlX2RhdGEgKG1pZGlfYnl0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2ZfbXB1X3N0YXJ0X3JlYWQgKGludCBkZXYpIHsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2ZfbXB1X2VuZF9yZWFkIChpbnQgZGV2KSB7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2ZfbXB1X2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJIldGLU1QVTogSW50ZWxsaWdlbnQgbW9kZSBub3Qgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlLlxuIik7CisJcmV0dXJuIC0oRUlOVkFMKTsKK30KKworc3RhdGljIGludCB3Zl9tcHVfYnVmZmVyX3N0YXR1cyAoaW50IGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeW50aF9vcGVyYXRpb25zIHdmX21wdV9zeW50aF9vcGVyYXRpb25zWzJdOworc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgIHdmX21wdV9taWRpX29wZXJhdGlvbnNbMl07CisKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIHdmX21wdV9taWRpX3Byb3RvID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmluZm8JCT0geyJXRi1NUFUgTUlESSIsIDAsIE1JRElfQ0FQX01QVTQwMSwgU05EQ0FSRF9NUFU0MDF9LAorCS5pbl9pbmZvCT0gezB9LCAgIC8qIGluX2luZm8gKi8KKwkub3BlbgkJPSB3Zl9tcHVfb3BlbiwKKwkuY2xvc2UJCT0gd2ZfbXB1X2Nsb3NlLAorCS5pb2N0bAkJPSB3Zl9tcHVfaW9jdGwsCisJLm91dHB1dGMJPSB3Zl9tcHVfb3V0LAorCS5zdGFydF9yZWFkCT0gd2ZfbXB1X3N0YXJ0X3JlYWQsCisJLmVuZF9yZWFkCT0gd2ZfbXB1X2VuZF9yZWFkLAorCS5idWZmZXJfc3RhdHVzCT0gd2ZfbXB1X2J1ZmZlcl9zdGF0dXMsCit9OworCitzdGF0aWMgc3RydWN0IHN5bnRoX2luZm8gd2ZfbXB1X3N5bnRoX2luZm9fcHJvdG8gPQoreyJXYXZlRnJvbnQgTVBVLTQwMSBpbnRlcmZhY2UiLCAwLAorIFNZTlRIX1RZUEVfTUlESSwgTUlESV9UWVBFX01QVTQwMSwgMCwgMTI4LCAwLCAxMjgsIFNZTlRIX0NBUF9JTlBVVH07CisKK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfaW5mbyB3Zl9tcHVfc3ludGhfaW5mb1syXTsKKworc3RhdGljIGludAord2ZfbXB1X3N5bnRoX2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWludCAgICAgICAgICAgICBtaWRpX2RldjsKKwlpbnQgaW5kZXg7CisKKwltaWRpX2RldiA9IHN5bnRoX2RldnNbZGV2XS0+bWlkaV9kZXY7CisKKwlpZiAobWlkaV9kZXYgPCAwIHx8IG1pZGlfZGV2ID4gbnVtX21pZGlzIHx8IG1pZGlfZGV2c1ttaWRpX2Rldl09PU5VTEwpCisJCXJldHVybiAtKEVOWElPKTsKKworCWlmIChtaWRpX2RldiA9PSBwaHlzX2Rldi0+ZGV2bm8pIHsKKwkJaW5kZXggPSAwOworCX0gZWxzZSBpZiAocGh5c19kZXYtPmlzdmlydHVhbCAmJiBtaWRpX2RldiA9PSB2aXJ0X2Rldi0+ZGV2bm8pIHsKKwkJaW5kZXggPSAxOworCX0gZWxzZSB7CisJCXJldHVybiAtKEVJTlZBTCk7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgU05EQ1RMX1NZTlRIX0lORk86CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLAorCQkJICAgICAgJndmX21wdV9zeW50aF9pbmZvW2luZGV4XSwKKwkJCSAgICAgIHNpemVvZiAoc3RydWN0IHN5bnRoX2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwkKKwljYXNlIFNORENUTF9TWU5USF9NRU1BVkw6CisJCXJldHVybiAweDdmZmZmZmZmOworCQorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludAord2ZfbXB1X3N5bnRoX29wZW4gKGludCBkZXYsIGludCBtb2RlKQoreworCWludCAgICAgICAgICAgICBtaWRpX2RldjsKKwlzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAqZGV2YzsKKworCW1pZGlfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKworCWlmIChtaWRpX2RldiA8IDAgfHwgbWlkaV9kZXYgPiBudW1fbWlkaXMgfHwgbWlkaV9kZXZzW21pZGlfZGV2XT09TlVMTCkgeworCQlyZXR1cm4gLShFTlhJTyk7CisJfQorICAKKwlpZiAocGh5c19kZXYtPmRldm5vID09IG1pZGlfZGV2KSB7CisJCWRldmMgPSBwaHlzX2RldjsKKwl9IGVsc2UgaWYgKHBoeXNfZGV2LT5pc3ZpcnR1YWwgJiYgdmlydF9kZXYtPmRldm5vID09IG1pZGlfZGV2KSB7CisJCWRldmMgPSB2aXJ0X2RldjsKKwl9IGVsc2UgeworCQlwcmludGsgKEtFUk5fRVJSICJXRi1NUFU6IHVua25vd24gZGV2aWNlIG51bWJlciAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIC0oRUlOVkFMKTsKKwl9CisKKwlpZiAoZGV2Yy0+b3BlbmVkKSB7CisJCXJldHVybiAtKEVCVVNZKTsKKwl9CisgIAorCWRldmMtPm1vZGUgPSBNT0RFX1NZTlRIOworCWRldmMtPnN5bnRobm8gPSBkZXY7CisJZGV2Yy0+b3BlbmVkID0gbW9kZTsKKwlkZXZjLT5pbnB1dGludHIgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAord2ZfbXB1X3N5bnRoX2Nsb3NlIChpbnQgZGV2KQoreworCWludCAgICAgICAgICAgICBtaWRpX2RldjsKKwlzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAqZGV2YzsKKworCW1pZGlfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKworCWlmIChwaHlzX2Rldi0+ZGV2bm8gPT0gbWlkaV9kZXYpIHsKKwkJZGV2YyA9IHBoeXNfZGV2OworCX0gZWxzZSBpZiAocGh5c19kZXYtPmlzdmlydHVhbCAmJiB2aXJ0X2Rldi0+ZGV2bm8gPT0gbWlkaV9kZXYpIHsKKwkJZGV2YyA9IHZpcnRfZGV2OworCX0gZWxzZSB7CisJCXByaW50ayAoS0VSTl9FUlIgIldGLU1QVTogdW5rbm93biBkZXZpY2UgbnVtYmVyICVkXG4iLCBkZXYpOworCQlyZXR1cm47CisJfQorCisJZGV2Yy0+aW5wdXRpbnRyID0gTlVMTDsKKwlkZXZjLT5vcGVuZWQgPSAwOworCWRldmMtPm1vZGUgPSAwOworfQorCisjZGVmaW5lIF9NSURJX1NZTlRIX0NfCisjZGVmaW5lIE1JRElfU1lOVEhfTkFNRQkiV2F2ZUZyb250IChNSURJKSIKKyNkZWZpbmUgTUlESV9TWU5USF9DQVBTCVNZTlRIX0NBUF9JTlBVVAorI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworc3RhdGljIHN0cnVjdCBzeW50aF9vcGVyYXRpb25zIHdmX21wdV9zeW50aF9wcm90byA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pZAkJPSAiV2F2ZUZyb250IChJQ1MyMTE1KSIsCisJLmluZm8JCT0gTlVMTCwgIC8qIGluZm8gZmllbGQsIGZpbGxlZCBpbiBkdXJpbmcgY29uZmlndXJhdGlvbiAqLworCS5taWRpX2Rldgk9IDAsICAgICAvKiBNSURJIGRldiBYWFggc2hvdWxkIHRoaXMgYmUgLTEgPyAqLworCS5zeW50aF90eXBlCT0gU1lOVEhfVFlQRV9NSURJLAorCS5zeW50aF9zdWJ0eXBlCT0gU0FNUExFX1RZUEVfV0FWRUZST05ULAorCS5vcGVuCQk9IHdmX21wdV9zeW50aF9vcGVuLAorCS5jbG9zZQkJPSB3Zl9tcHVfc3ludGhfY2xvc2UsCisJLmlvY3RsCQk9IHdmX21wdV9zeW50aF9pb2N0bCwKKwkua2lsbF9ub3RlCT0gbWlkaV9zeW50aF9raWxsX25vdGUsCisJLnN0YXJ0X25vdGUJPSBtaWRpX3N5bnRoX3N0YXJ0X25vdGUsCisJLnNldF9pbnN0cgk9IG1pZGlfc3ludGhfc2V0X2luc3RyLAorCS5yZXNldAkJPSBtaWRpX3N5bnRoX3Jlc2V0LAorCS5od19jb250cm9sCT0gbWlkaV9zeW50aF9od19jb250cm9sLAorCS5sb2FkX3BhdGNoCT0gbWlkaV9zeW50aF9sb2FkX3BhdGNoLAorCS5hZnRlcnRvdWNoCT0gbWlkaV9zeW50aF9hZnRlcnRvdWNoLAorCS5jb250cm9sbGVyCT0gbWlkaV9zeW50aF9jb250cm9sbGVyLAorCS5wYW5uaW5nCT0gbWlkaV9zeW50aF9wYW5uaW5nLAorCS5iZW5kZXIJCT0gbWlkaV9zeW50aF9iZW5kZXIsCisJLnNldHVwX3ZvaWNlCT0gbWlkaV9zeW50aF9zZXR1cF92b2ljZSwKKwkuc2VuZF9zeXNleAk9IG1pZGlfc3ludGhfc2VuZF9zeXNleAorfTsKKworc3RhdGljIGludAorY29uZmlnX3dmX21wdSAoc3RydWN0IHdmX21wdV9jb25maWcgKmRldikKKworeworCWludCBpc19leHRlcm5hbDsKKwljaGFyICpuYW1lOworCWludCBpbmRleDsKKworCWlmIChkZXYgPT0gcGh5c19kZXYpIHsKKwkJbmFtZSA9ICJXYXZlRnJvbnQgaW50ZXJuYWwgTUlESSI7CisJCWlzX2V4dGVybmFsID0gMDsKKwkJaW5kZXggPSAwOworCQltZW1jcHkgKChjaGFyICopICZ3Zl9tcHVfc3ludGhfb3BlcmF0aW9uc1tpbmRleF0sCisJCQkoY2hhciAqKSAmd2ZfbXB1X3N5bnRoX3Byb3RvLAorCQkJc2l6ZW9mIChzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucykpOworCX0gZWxzZSB7CisJCW5hbWUgPSAiV2F2ZUZyb250IGV4dGVybmFsIE1JREkiOworCQlpc19leHRlcm5hbCA9IDE7CisJCWluZGV4ID0gMTsKKwkJLyogbm8gc3ludGggb3BlcmF0aW9ucyBmb3IgYW4gZXh0ZXJuYWwgTUlESSBpbnRlcmZhY2UgKi8KKwl9CisKKwltZW1jcHkgKChjaGFyICopICZ3Zl9tcHVfc3ludGhfaW5mb1tkZXYtPmRldm5vXSwKKwkJKGNoYXIgKikgJndmX21wdV9zeW50aF9pbmZvX3Byb3RvLAorCQlzaXplb2YgKHN0cnVjdCBzeW50aF9pbmZvKSk7CisKKwlzdHJjcHkgKHdmX21wdV9zeW50aF9pbmZvW2luZGV4XS5uYW1lLCBuYW1lKTsKKworCXdmX21wdV9zeW50aF9vcGVyYXRpb25zW2luZGV4XS5taWRpX2RldiA9IGRldi0+ZGV2bm87CisJd2ZfbXB1X3N5bnRoX29wZXJhdGlvbnNbaW5kZXhdLmluZm8gPSAmd2ZfbXB1X3N5bnRoX2luZm9baW5kZXhdOworCisJbWVtY3B5ICgoY2hhciAqKSAmd2ZfbXB1X21pZGlfb3BlcmF0aW9uc1tpbmRleF0sCisJCShjaGFyICopICZ3Zl9tcHVfbWlkaV9wcm90bywKKwkJc2l6ZW9mIChzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSk7CisgIAorCWlmIChpc19leHRlcm5hbCkgeworCQl3Zl9tcHVfbWlkaV9vcGVyYXRpb25zW2luZGV4XS5jb252ZXJ0ZXIgPSBOVUxMOworCX0gZWxzZSB7CisJCXdmX21wdV9taWRpX29wZXJhdGlvbnNbaW5kZXhdLmNvbnZlcnRlciA9CisJCQkmd2ZfbXB1X3N5bnRoX29wZXJhdGlvbnNbaW5kZXhdOworCX0KKworCXN0cmNweSAod2ZfbXB1X21pZGlfb3BlcmF0aW9uc1tpbmRleF0uaW5mby5uYW1lLCBuYW1lKTsKKworCW1pZGlfZGV2c1tkZXYtPmRldm5vXSA9ICZ3Zl9tcHVfbWlkaV9vcGVyYXRpb25zW2luZGV4XTsKKwltaWRpX2RldnNbZGV2LT5kZXZub10tPmluX2luZm8ubV9idXN5ID0gMDsKKwltaWRpX2RldnNbZGV2LT5kZXZub10tPmluX2luZm8ubV9zdGF0ZSA9IE1TVF9JTklUOworCW1pZGlfZGV2c1tkZXYtPmRldm5vXS0+aW5faW5mby5tX3B0ciA9IDA7CisJbWlkaV9kZXZzW2Rldi0+ZGV2bm9dLT5pbl9pbmZvLm1fbGVmdCA9IDA7CisJbWlkaV9kZXZzW2Rldi0+ZGV2bm9dLT5pbl9pbmZvLm1fcHJldl9zdGF0dXMgPSAwOworCisJZGV2c1tpbmRleF0ub3BlbmVkID0gMDsKKwlkZXZzW2luZGV4XS5tb2RlID0gMDsKKworCXJldHVybiAoMCk7Cit9CisKK2ludCB2aXJ0dWFsX21pZGlfZW5hYmxlICh2b2lkKQorCit7CisJaWYgKCh2aXJ0X2Rldi0+ZGV2bm8gPCAwKSAmJgorCSAgICAodmlydF9kZXYtPmRldm5vID0gc291bmRfYWxsb2NfbWlkaWRldigpKSA9PSAtMSkgeworCQlwcmludGsgKEtFUk5fRVJSCisJCQkiV0YtTVBVOiB0b28gbWFueSBtaWRpIGRldmljZXMgZGV0ZWN0ZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY29uZmlnX3dmX21wdSAodmlydF9kZXYpOworCisJcGh5c19kZXYtPmlzdmlydHVhbCA9IDE7CisJcmV0dXJuIHZpcnRfZGV2LT5kZXZubzsKK30KKworaW50Cit2aXJ0dWFsX21pZGlfZGlzYWJsZSAodm9pZCkKKworeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisKKwl3Zl9tcHVfY2xvc2UgKHZpcnRfZGV2LT5kZXZubyk7CisJLyogbm8gc3ludGggb24gdmlydF9kZXYsIHNvIG5vIG5lZWQgdG8gY2FsbCB3Zl9tcHVfc3ludGhfY2xvc2UoKSAqLworCXBoeXNfZGV2LT5pc3ZpcnR1YWwgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBkZXRlY3Rfd2ZfbXB1IChpbnQgaXJxLCBpbnQgaW9fYmFzZSkKK3sKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvX2Jhc2UsIDIsICJ3YXZlZnJvbnQgbWlkaSIpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJXRi1NUFU6IEkvTyBwb3J0ICV4IGFscmVhZHkgaW4gdXNlLlxuIiwKKwkJCWlvX2Jhc2UpOworCQlyZXR1cm4gLTE7CisJfQorCisJcGh5c19kZXYtPmJhc2UgPSBpb19iYXNlOworCXBoeXNfZGV2LT5pcnEgPSBpcnE7CisJcGh5c19kZXYtPmRldm5vID0gLTE7CisJdmlydF9kZXYtPmRldm5vID0gLTE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBpbnN0YWxsX3dmX21wdSAodm9pZCkKK3sKKwlpZiAoKHBoeXNfZGV2LT5kZXZubyA9IHNvdW5kX2FsbG9jX21pZGlkZXYoKSkgPCAwKXsKKworCQlwcmludGsgKEtFUk5fRVJSICJXRi1NUFU6IFRvbyBtYW55IE1JREkgZGV2aWNlcyBkZXRlY3RlZC5cbiIpOworCQlyZWxlYXNlX3JlZ2lvbihwaHlzX2Rldi0+YmFzZSwgMik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwaHlzX2Rldi0+aXN2aXJ0dWFsID0gMDsKKworCWlmIChjb25maWdfd2ZfbXB1IChwaHlzX2RldikpIHsKKworCQlwcmludGsgKEtFUk5fV0FSTklORworCQkJIldGLU1QVTogY29uZmlndXJhdGlvbiBmb3IgTUlESSBkZXZpY2UgJWQgZmFpbGVkXG4iLAorCQkJcGh5c19kZXYtPmRldm5vKTsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYgKHBoeXNfZGV2LT5kZXZubyk7CisKKwl9CisKKwkvKiBPSywgbm93IHdlJ3JlIGNvbmZpZ3VyZWQgdG8gaGFuZGxlIGFuIGludGVycnVwdCAuLi4gKi8KKworCWlmIChyZXF1ZXN0X2lycSAocGh5c19kZXYtPmlycSwgd2ZfbXB1aW50ciwgU0FfSU5URVJSVVBUfFNBX1NISVJRLAorCQkJICJ3YXZlZnJvbnQgbWlkaSIsIHBoeXNfZGV2KSA8IDApIHsKKworCQlwcmludGsgKEtFUk5fRVJSICJXRi1NUFU6IEZhaWxlZCB0byBhbGxvY2F0ZSBJUlElZFxuIiwKKwkJCXBoeXNfZGV2LT5pcnEpOworCQlyZXR1cm4gLTE7CisKKwl9CisKKwkvKiBUaGlzIGJlaW5nIGEgV2F2ZUZyb250IChJQ1MtMjExNSkgZW11bGF0ZWQgTVBVLTQwMSwgd2UgaGF2ZQorCSAgIHRvIHN3aXRjaCBpdCBpbnRvIFVBUlQgKGR1bWIpIG1vZGUsIGJlY2F1c2Ugb3RoZXJ3aXNlLCBpdAorCSAgIHdvbid0IGRvIGFueXRoaW5nIGF0IGFsbC4KKwkqLworICAKKwlzdGFydF91YXJ0X21vZGUgKCk7CisKKwlyZXR1cm4gcGh5c19kZXYtPmRldm5vOworfQorIAordm9pZAordW5pbnN0YWxsX3dmX21wdSAodm9pZCkKKworeworCXJlbGVhc2VfcmVnaW9uIChwaHlzX2Rldi0+YmFzZSwgMik7IAorCWZyZWVfaXJxIChwaHlzX2Rldi0+aXJxLCBwaHlzX2Rldik7CisJc291bmRfdW5sb2FkX21pZGlkZXYgKHBoeXNfZGV2LT5kZXZubyk7CisKKwlpZiAodmlydF9kZXYtPmRldm5vID49IDApIHsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYgKHZpcnRfZGV2LT5kZXZubyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc3RhcnRfdWFydF9tb2RlICh2b2lkKQorCit7CisJaW50ICAgICAgICAgICAgIG9rLCBpOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKworCS8qIFhYWCBmaXggbWUgKi8KKworCWZvciAoaSA9IDA7IGkgPCAzMDAwMCAmJiAhb3V0cHV0X3JlYWR5ICgpOyBpKyspOworCisJb3V0YiAoVUFSVF9NT0RFX09OLCBDT01EUE9SVChwaHlzX2RldikpOworCisJZm9yIChvayA9IDAsIGkgPSA1MDAwMDsgaSA+IDAgJiYgIW9rOyBpLS0pIHsKKwkJaWYgKGlucHV0X2F2YWlsICgpKSB7CisJCQlpZiAocmVhZF9kYXRhICgpID09IE1QVV9BQ0spIHsKKwkJCQlvayA9IDE7CisJCQl9CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3ltZnBjaS5jIGIvc291bmQvb3NzL3ltZnBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjAzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MveW1mcGNpLmMKQEAgLTAsMCArMSwyNjkxIEBACisvKgorICogIENvcHlyaWdodCAxOTk5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgMjAwMCBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogIENvcHlyaWdodCAyMDAxIEthaSBHZXJtYXNjaGV3c2tpIDxrYWlAdHAxLnJ1aHItdW5pLWJvY2h1bS5kZT4KKyAqICBDb3B5cmlnaHQgMjAwMiBQZXRlIFphaXRjZXYgPHphaXRjZXZAeWFob28uY29tPgorICoKKyAqICBZYW1haGEgWU1GN3h4IGRyaXZlci4KKyAqCisgKiAgVGhpcyBjb2RlIGlzIGEgcmVzdWx0IG9mIGhpZ2gtc3BlZWQgY29sbGlzaW9uCisgKiAgYmV0d2VlbiB5bWZwY2kuYyBvZiBBTFNBIGFuZCBjczQ2eHguYyBvZiBMaW51eC4KKyAqICAtLSBQZXRlIFphaXRjZXYgPHphaXRjZXZAeWFob28uY29tPjsgMjAwMC8wOS8xOAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBUT0RPOgorICogIC0gVXNlIFA0NFNsb3QgZm9yIDQ0LjEgcGxheWJhY2sgKGJld2FyZSBvZiBpZGxlIGJ1enppbmcgaW4gUDQ0U2xvdCkuCisgKiAgLSA5NktIeiBwbGF5YmFjayBmb3IgRFZEIC0gdXNlIHBpdGNoIG9mIDIuMC4KKyAqICAtIFJldGFpbiBETUEgYnVmZmVyIG9uIGNsb3NlLCBkbyBub3Qgd2FpdCB0aGUgZW5kIG9mIGZyYW1lLgorICogIC0gUmVzb2x2ZSBYWFggdGFnZ2VkIHF1ZXN0aW9ucy4KKyAqICAtIENhbm5vdCBwbGF5IDUxMzNIei4KKyAqICAtIDIwMDEvMDEvMDcgQ29uc2lkZXIgaWYgd2UgY2FuIHJlbW92ZSB2b2ljZV9sb2NrLCBsaWtlIHNvOgorICogICAgIDogQWxsb2NhdGUvZGVhbGxvY2F0ZSB2b2ljZXMgaW4gb3Blbi9jbG9zZSB1bmRlciBzZW1hZm9yZS4KKyAqICAgICA6IFdlIGFjY2VzcyB2b2ljZXMgaW4gaW50ZXJydXB0LCB0aGF0IG9ubHkgZm9yIHBjbXMgdGhhdCBvcGVuLgorICogICAgdm9pY2VfbG9jayBhcm91bmQgcGxheWJhY2tfcHJlcGFyZSBjbG9zZXMgaW50ZXJydXB0cyBmb3IgaW5zYW5lIGR1cmF0aW9uLgorICogIC0gUmV2aXNpdCB0aGUgd2F5IHZvaWNlX2FsbG9jIGlzIGRvbmUgLSB0b28gY29uZnVzaW5nLCBvdmVyY29tcGxpY2F0ZWQuCisgKiAgICBTaG91bGQgc3VwcG9ydCB2YXJpb3VzIGNoYW5uZWwgdHlwZXMsIGhvd2V2ZXIuCisgKiAgLSBSZW1vdmUgcHJvZ19kbWFidWYgZnJvbSByZWFkL3dyaXRlLCBsZWF2ZSBpdCBpbiBvcGVuLgorICogIC0gMjAwMS8wMS8wNyBSZXBsYWNlIHRoZSBPUEwzIHBhcnQgb2YgQ09ORklHX1NPVU5EX1lNRlBDSV9MRUdBQ1kgY29kZSB3aXRoCisgKiAgICBuYXRpdmUgc3ludGhlc2l6ZXIgdGhyb3VnaCBhIHBsYXliYWNrIHNsb3QuCisgKiAgLSAyMDAxLzExLzI5IGFjOTdfc2F2ZV9zdGF0ZQorICogICAgVGFsayB0byBLYWkgdG8gcmVtb3ZlIGFjOTdfc2F2ZV9zdGF0ZSBiZWZvcmUgaXQncyB0b28gbGF0ZSEKKyAqICAtIFNlY29uZCBBQzk3CisgKiAgLSBSZXN0b3JlIFMvUERJRiAtIFRvc2hpYmFzIGhhdmUgaXQuCisgKgorICogS2FpIHVzZWQgcGNpX2FsbG9jX2NvbnNpc3RlbnQgZm9yIERNQSBidWZmZXIsIHdoaWNoIHNvdW5kcyBhIGxpdHRsZQorICogdW5jb252ZW50aW9uYWwuIEhvd2V2ZXIsIGdpdmVuIGhvdyBzbWFsbCBvdXIgZnJhZ21lbnRzIGNhbiBiZSwKKyAqIGEgbGl0dGxlIHVuY2FjaGVkIGFjY2VzcyBpcyBwZXJoYXBzIGJldHRlciB0aGFuIGVuZGxlc3MgZmx1c2hpbmcuCisgKiBPbiBpMzg2IGFuZCBvdGhlciBJL08tY29oZXJlbnQgYXJjaGl0ZWN0dXJlcyBwY2lfYWxsb2NfY29uc2lzdGVudAorICogaXMgZW50aXJlbHkgaGFybWxlc3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19TT1VORF9ZTUZQQ0lfTEVHQUNZCisjIGluY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorIyBpbmNsdWRlICJtcHU0MDEuaCIKKyNlbmRpZgorI2luY2x1ZGUgInltZnBjaS5oIgorCisvKgorICogSSBkbyBub3QgYmVsaWV2ZSBpbiBkZWJ1ZyBsZXZlbHMgYXMgSSBuZXZlciBjYW4gZ3Vlc3Mgd2hhdAorICogcGFydCBvZiB0aGUgY29kZSBpcyBnb2luZyB0byBiZSBwcm9ibGVtYXRpYyBpbiB0aGUgZnV0dXJlLgorICogRG9uJ3QgZm9yZ2V0IHRvIHJ1biB5b3VyIGtsb2dkIHdpdGggLWMgOC4KKyAqCisgKiBFeGFtcGxlIChkbyBub3QgcmVtb3ZlKToKKyAqICNkZWZpbmUgWU1GREJHKGZtdCwgYXJnLi4uKSAgZG97IHByaW50ayhLRVJOX0RFQlVHIGZtdCwgIyNhcmcpOyB9d2hpbGUoMCkKKyAqLworI2RlZmluZSBZTUZEQkdXKGZtdCwgYXJnLi4uKSAgLyogKi8JLyogd3JpdGUgY291bnRzICovCisjZGVmaW5lIFlNRkRCR0koZm10LCBhcmcuLi4pICAvKiAqLwkvKiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFlNRkRCR1goZm10LCBhcmcuLi4pICAvKiAqLwkvKiBpb2N0bCAqLworCitzdGF0aWMgaW50IHltZl9wbGF5YmFja190cmlnZ2VyKHltZnBjaV90ICp1bml0LCBzdHJ1Y3QgeW1mX3BjbSAqeXBjbSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCB5bWZfY2FwdHVyZV90cmlnZ2VyKHltZnBjaV90ICp1bml0LCBzdHJ1Y3QgeW1mX3BjbSAqeXBjbSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCB5bWZwY2lfdm9pY2VfZnJlZSh5bWZwY2lfdCAqdW5pdCwgeW1mcGNpX3ZvaWNlX3QgKnB2b2ljZSk7CitzdGF0aWMgaW50IHltZl9jYXB0dXJlX2FsbG9jKHN0cnVjdCB5bWZfdW5pdCAqdW5pdCwgaW50ICpwYmFuayk7CitzdGF0aWMgaW50IHltZl9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBpbnQgeW1mX2NhcHR1cmVfcHJlcGFyZShzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZSk7CitzdGF0aWMgc3RydWN0IHltZl9zdGF0ZSAqeW1mX3N0YXRlX2FsbG9jKHltZnBjaV90ICp1bml0KTsKKworc3RhdGljIHZvaWQgeW1mcGNpX2FjbGlua19yZXNldChzdHJ1Y3QgcGNpX2RldiAqIHBjaSk7CitzdGF0aWMgdm9pZCB5bWZwY2lfZGlzYWJsZV9kc3AoeW1mcGNpX3QgKnVuaXQpOworc3RhdGljIHZvaWQgeW1mcGNpX2Rvd25sb2FkX2ltYWdlKHltZnBjaV90ICpjb2RlYyk7CitzdGF0aWMgdm9pZCB5bWZfbWVtbG9hZCh5bWZwY2lfdCAqdW5pdCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soeW1mX2RldnNfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKHltZl9kZXZzKTsKKworLyoKKyAqICBjb25zdGFudHMKKyAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgeW1mX2lkX3RibFtdID0geworI2RlZmluZSBERVYodiwgZCwgZGF0YSkgXAorICB7IFBDSV9WRU5ET1JfSURfIyN2LCBQQ0lfREVWSUNFX0lEXyMjdiMjXyMjZCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpZGF0YSB9CisJREVWIChZQU1BSEEsIDcyNCwgICJZTUY3MjQiKSwKKwlERVYgKFlBTUFIQSwgNzI0RiwgIllNRjcyNEYiKSwKKwlERVYgKFlBTUFIQSwgNzQwLCAgIllNRjc0MCIpLAorCURFViAoWUFNQUhBLCA3NDBDLCAiWU1GNzQwQyIpLAorCURFViAoWUFNQUhBLCA3NDQsICAiWU1GNzQ0IiksCisJREVWIChZQU1BSEEsIDc1NCwgICJZTUY3NTQiKSwKKyN1bmRlZiBERVYKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgeW1mX2lkX3RibCk7CisKKy8qCisgKiAgY29tbW9uIEkvTyByb3V0aW5lcworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5bWZwY2lfd3JpdGViKHltZnBjaV90ICpjb2RlYywgdTMyIG9mZnNldCwgdTggdmFsKQoreworCXdyaXRlYih2YWwsIGNvZGVjLT5yZWdfYXJlYV92aXJ0ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1MTYgeW1mcGNpX3JlYWR3KHltZnBjaV90ICpjb2RlYywgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZHcoY29kZWMtPnJlZ19hcmVhX3ZpcnQgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeW1mcGNpX3dyaXRldyh5bWZwY2lfdCAqY29kZWMsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCit7CisJd3JpdGV3KHZhbCwgY29kZWMtPnJlZ19hcmVhX3ZpcnQgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB5bWZwY2lfcmVhZGwoeW1mcGNpX3QgKmNvZGVjLCB1MzIgb2Zmc2V0KQoreworCXJldHVybiByZWFkbChjb2RlYy0+cmVnX2FyZWFfdmlydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5bWZwY2lfd3JpdGVsKHltZnBjaV90ICpjb2RlYywgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBjb2RlYy0+cmVnX2FyZWFfdmlydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgeW1mcGNpX2NvZGVjX3JlYWR5KHltZnBjaV90ICpjb2RlYywgaW50IHNlY29uZGFyeSwgaW50IHNjaGVkKQoreworCXNpZ25lZCBsb25nIGVuZF90aW1lOworCXUzMiByZWcgPSBzZWNvbmRhcnkgPyBZRFNYR1JfU0VDU1RBVFVTQURSIDogWURTWEdSX1BSSVNUQVRVU0FEUjsKKwkKKwllbmRfdGltZSA9IGppZmZpZXMgKyAzICogKEhaIC8gNCk7CisJZG8geworCQlpZiAoKHltZnBjaV9yZWFkdyhjb2RlYywgcmVnKSAmIDB4ODAwMCkgPT0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoc2NoZWQpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0KKwl9IHdoaWxlIChlbmRfdGltZSAtIChzaWduZWQgbG9uZylqaWZmaWVzID49IDApOworCXByaW50ayhLRVJOX0VSUiAieW1mcGNpX2NvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAorCSAgICBzZWNvbmRhcnksIHltZnBjaV9yZWFkdyhjb2RlYywgcmVnKSk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIHZvaWQgeW1mcGNpX2NvZGVjX3dyaXRlKHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZywgdTE2IHZhbCkKK3sKKwl5bWZwY2lfdCAqY29kZWMgPSBkZXYtPnByaXZhdGVfZGF0YTsKKwl1MzIgY21kOworCisJc3Bpbl9sb2NrKCZjb2RlYy0+YWM5N19sb2NrKTsKKwkvKiBYWFggRG8gbWFrZSB1c2Ugb2YgZGV2LT5pZCAqLworCXltZnBjaV9jb2RlY19yZWFkeShjb2RlYywgMCwgMCk7CisJY21kID0gKChZRFNYR19BQzk3V1JJVEVDTUQgfCByZWcpIDw8IDE2KSB8IHZhbDsKKwl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfQUM5N0NNRERBVEEsIGNtZCk7CisJc3Bpbl91bmxvY2soJmNvZGVjLT5hYzk3X2xvY2spOworfQorCitzdGF0aWMgdTE2IF95bWZwY2lfY29kZWNfcmVhZCh5bWZwY2lfdCAqdW5pdCwgdTggcmVnKQoreworCWludCBpOworCisJaWYgKHltZnBjaV9jb2RlY19yZWFkeSh1bml0LCAwLCAwKSkKKwkJcmV0dXJuIH4wOworCXltZnBjaV93cml0ZXcodW5pdCwgWURTWEdSX0FDOTdDTURBRFIsIFlEU1hHX0FDOTdSRUFEQ01EIHwgcmVnKTsKKwlpZiAoeW1mcGNpX2NvZGVjX3JlYWR5KHVuaXQsIDAsIDApKQorCQlyZXR1cm4gfjA7CisJaWYgKHVuaXQtPnBjaS0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0NCAmJiB1bml0LT5yZXYgPCAyKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2MDA7IGkrKykKKwkJCXltZnBjaV9yZWFkdyh1bml0LCBZRFNYR1JfUFJJU1RBVFVTREFUQSk7CisJfQorCXJldHVybiB5bWZwY2lfcmVhZHcodW5pdCwgWURTWEdSX1BSSVNUQVRVU0RBVEEpOworfQorCitzdGF0aWMgdTE2IHltZnBjaV9jb2RlY19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZykKK3sKKwl5bWZwY2lfdCAqdW5pdCA9IGRldi0+cHJpdmF0ZV9kYXRhOworCXUxNiByZXQ7CisJCisJc3Bpbl9sb2NrKCZ1bml0LT5hYzk3X2xvY2spOworCXJldCA9IF95bWZwY2lfY29kZWNfcmVhZCh1bml0LCByZWcpOworCXNwaW5fdW5sb2NrKCZ1bml0LT5hYzk3X2xvY2spOworCQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgTWlzYyByb3V0aW5lcworICovCisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCBzYW1wbGluZyByYXRlIHJlbGF0ZXRpdmVseSB0byB0aGUgYmFzZSBjbG9jayAoNDhrSHopLgorICovCitzdGF0aWMgdTMyIHltZnBjaV9jYWxjX2RlbHRhKHUzMiByYXRlKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgODAwMDoJcmV0dXJuIDB4MDJhYWFiMDA7CisJY2FzZSAxMTAyNToJcmV0dXJuIDB4MDNhY2NkMDA7CisJY2FzZSAxNjAwMDoJcmV0dXJuIDB4MDU1NTU1MDA7CisJY2FzZSAyMjA1MDoJcmV0dXJuIDB4MDc1OTlhMDA7CisJY2FzZSAzMjAwMDoJcmV0dXJuIDB4MGFhYWFiMDA7CisJY2FzZSA0NDEwMDoJcmV0dXJuIDB4MGViMzMzMDA7CisJZGVmYXVsdDoJcmV0dXJuICgocmF0ZSA8PCAxNikgLyA0ODAwMCkgPDwgMTI7CisJfQorfQorCitzdGF0aWMgdTMyIGRlZl9yYXRlWzhdID0geworCTEwMCwgMjAwMCwgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMzIwMDAsIDQ4MDAwCit9OworCitzdGF0aWMgdTMyIHltZnBjaV9jYWxjX2xwZksodTMyIHJhdGUpCit7CisJdTMyIGk7CisJc3RhdGljIHUzMiB2YWxbOF0gPSB7CisJCTB4MDA1NzAwMDAsIDB4MDZBQTAwMDAsIDB4MThCMjAwMDAsIDB4MjA5MzAwMDAsCisJCTB4MkI5QTAwMDAsIDB4MzVBMTAwMDAsIDB4M0VBQTAwMDAsIDB4NDAwMDAwMDAKKwl9OworCQorCWlmIChyYXRlID09IDQ0MTAwKQorCQlyZXR1cm4gMHg0MDAwMDAwMDsJLyogRklYTUU6IFdoYXQncyB0aGUgcmlnaHQgdmFsdWU/ICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJaWYgKHJhdGUgPD0gZGVmX3JhdGVbaV0pCisJCQlyZXR1cm4gdmFsW2ldOworCXJldHVybiB2YWxbMF07Cit9CisKK3N0YXRpYyB1MzIgeW1mcGNpX2NhbGNfbHBmUSh1MzIgcmF0ZSkKK3sKKwl1MzIgaTsKKwlzdGF0aWMgdTMyIHZhbFs4XSA9IHsKKwkJMHgzNTI4MDAwMCwgMHgzNEE3MDAwMCwgMHgzMjAyMDAwMCwgMHgzMTc3MDAwMCwKKwkJMHgzMTM5MDAwMCwgMHgzMUM5MDAwMCwgMHgzM0QwMDAwMCwgMHg0MDAwMDAwMAorCX07CisJCisJaWYgKHJhdGUgPT0gNDQxMDApCisJCXJldHVybiAweDM3MEEwMDAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWlmIChyYXRlIDw9IGRlZl9yYXRlW2ldKQorCQkJcmV0dXJuIHZhbFtpXTsKKwlyZXR1cm4gdmFsWzBdOworfQorCitzdGF0aWMgdTMyIHltZl9jYWxjX2xlbmQodTMyIHJhdGUpCit7CisJcmV0dXJuIChyYXRlICogWU1GX1NBTVBGKSAvIDQ4MDAwOworfQorCisvKgorICogV2UgZXZlciBhbGxvdyBvbmx5IGEgZmV3IGZvcm1hdHMsIGJ1dCBsZXQncyBiZSBnZW5lcmljLCBmb3Igc21hbGxlciBzdXJwcmlzZS4KKyAqLworc3RhdGljIGludCB5bWZfcGNtX2Zvcm1hdF93aWR0aChpbnQgZm9ybWF0KQoreworCXN0YXRpYyBpbnQgbWFzazE2ID0gQUZNVF9TMTZfTEV8QUZNVF9TMTZfQkV8QUZNVF9VMTZfTEV8QUZNVF9VMTZfQkU7CisKKwlpZiAoKGZvcm1hdCAmIChmb3JtYXQtMSkpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IGZvcm1hdCAweCV4IGlzIG5vdCBhIHBvd2VyIG9mIDJcbiIsIGZvcm1hdCk7CisJCXJldHVybiA4OworCX0KKworCWlmIChmb3JtYXQgPT0gQUZNVF9JTUFfQURQQ00pIHJldHVybiA0OworCWlmICgoZm9ybWF0ICYgbWFzazE2KSAhPSAwKSByZXR1cm4gMTY7CisJcmV0dXJuIDg7Cit9CisKK3N0YXRpYyB2b2lkIHltZl9wY21fdXBkYXRlX3NoaWZ0KHN0cnVjdCB5bWZfcGNtX2Zvcm1hdCAqZikKK3sKKwlmLT5zaGlmdCA9IDA7CisJaWYgKGYtPnZvaWNlcyA9PSAyKQorCQlmLT5zaGlmdCsrOworCWlmICh5bWZfcGNtX2Zvcm1hdF93aWR0aChmLT5mb3JtYXQpID09IDE2KQorCQlmLT5zaGlmdCsrOworfQorCisvKiBBcmUgeW91IHN1cmUgMzJLIGlzIG5vdCB0b28gbXVjaD8gU2VlIGlmIG1wZzEyMyBza2lwcyBvbiBsb2FkZWQgc3lzdGVtcy4gKi8KKyNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAoMTUtUEFHRV9TSElGVCkKKyNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKKworLyoKKyAqIEFsbG9jYXRlIERNQSBidWZmZXIKKyAqLworc3RhdGljIGludCBhbGxvY19kbWFidWYoeW1mcGNpX3QgKnVuaXQsIHN0cnVjdCB5bWZfZG1hYnVmICpkbWFidWYpCit7CisJdm9pZCAqcmF3YnVmID0gTlVMTDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCWludCBvcmRlcjsKKwlzdHJ1Y3QgcGFnZSAqbWFwLCAqbWFwZW5kOworCisJLyogYWxsb2MgYXMgYmlnIGEgY2h1bmsgYXMgd2UgY2FuICovCisJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkgeworCQlyYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh1bml0LT5wY2ksIFBBR0VfU0laRSA8PCBvcmRlciwgJmRtYV9hZGRyKTsKKwkJaWYgKHJhd2J1ZikKKwkJCWJyZWFrOworCX0KKwlpZiAoIXJhd2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgInltZnBjaTogYWxsb2NhdGVkICVsZCAob3JkZXIgPSAlZCkgYnl0ZXMgYXQgJXBcbiIsCisJICAgICAgIFBBR0VfU0laRSA8PCBvcmRlciwgb3JkZXIsIHJhd2J1Zik7CisjZW5kaWYKKworCWRtYWJ1Zi0+cmVhZHkgID0gZG1hYnVmLT5tYXBwZWQgPSAwOworCWRtYWJ1Zi0+cmF3YnVmID0gcmF3YnVmOworCWRtYWJ1Zi0+ZG1hX2FkZHIgPSBkbWFfYWRkcjsKKwlkbWFidWYtPmJ1Zm9yZGVyID0gb3JkZXI7CisKKwkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KKwltYXBlbmQgPSB2aXJ0X3RvX3BhZ2UocmF3YnVmICsgKFBBR0VfU0laRSA8PCBvcmRlcikgLSAxKTsKKwlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShyYXdidWYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKKwkJc2V0X2JpdChQR19yZXNlcnZlZCwgJm1hcC0+ZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGcmVlIERNQSBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgZGVhbGxvY19kbWFidWYoeW1mcGNpX3QgKnVuaXQsIHN0cnVjdCB5bWZfZG1hYnVmICpkbWFidWYpCit7CisJc3RydWN0IHBhZ2UgKm1hcCwgKm1hcGVuZDsKKworCWlmIChkbWFidWYtPnJhd2J1ZikgeworCQkvKiB1bmRvIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkICovCisJCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKKwkJCWNsZWFyX2JpdChQR19yZXNlcnZlZCwgJm1hcC0+ZmxhZ3MpOworCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQodW5pdC0+cGNpLCBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlciwKKwkJICAgIGRtYWJ1Zi0+cmF3YnVmLCBkbWFidWYtPmRtYV9hZGRyKTsKKwl9CisJZG1hYnVmLT5yYXdidWYgPSBOVUxMOworCWRtYWJ1Zi0+bWFwcGVkID0gZG1hYnVmLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUsIGludCByZWMpCit7CisJc3RydWN0IHltZl9kbWFidWYgKmRtYWJ1ZjsKKwlpbnQgd18xNjsKKwl1bnNpZ25lZCBidWZzaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlZHpvbmUsIHJlZGZyYWdzOworCWludCByZXQ7CisKKwl3XzE2ID0geW1mX3BjbV9mb3JtYXRfd2lkdGgoc3RhdGUtPmZvcm1hdC5mb3JtYXQpID09IDE2OworCWRtYWJ1ZiA9IHJlYyA/ICZzdGF0ZS0+cnBjbS5kbWFidWYgOiAmc3RhdGUtPndwY20uZG1hYnVmOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCWRtYWJ1Zi0+aHdwdHIgPSBkbWFidWYtPnN3cHRyID0gMDsKKwlkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwlkbWFidWYtPmNvdW50ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KKwlpZiAoIWRtYWJ1Zi0+cmF3YnVmKQorCQlpZiAoKHJldCA9IGFsbG9jX2RtYWJ1ZihzdGF0ZS0+dW5pdCwgZG1hYnVmKSkpCisJCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBDcmVhdGUgZmFrZSBmcmFnbWVudCBzaXplcyBhbmQgbnVtYmVycyBmb3IgT1NTIGlvY3Rscy4KKwkgKiBJbXBvcnQgd2hhdCBEb29tIG1pZ2h0IGhhdmUgc2V0IHdpdGggU05EQ1RMX0RTUF9TRVRGUkFHTUVOVC4KKwkgKi8KKwlidWZzaXplID0gUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXI7CisJLyogQnkgZGVmYXVsdCB3ZSBnaXZlIDQgYmlnIGJ1ZmZlcnMuICovCisJZG1hYnVmLT5mcmFnc2hpZnQgPSAoZG1hYnVmLT5idWZvcmRlciArIFBBR0VfU0hJRlQgLSAyKTsKKwlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQgPiAzICYmCisJICAgIGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0IDwgZG1hYnVmLT5mcmFnc2hpZnQpIHsKKwkJLyogSWYgT1NTIHNldCBzbWFsbGVyIGZyYWdtZW50cywgZ2l2ZSBtb3JlIHNtYWxsZXIgYnVmZmVycy4gKi8KKwkJZG1hYnVmLT5mcmFnc2hpZnQgPSBkbWFidWYtPm9zc2ZyYWdzaGlmdDsKKwl9CisJZG1hYnVmLT5mcmFnc2l6ZSA9IDEgPDwgZG1hYnVmLT5mcmFnc2hpZnQ7CisKKwlkbWFidWYtPm51bWZyYWcgPSBidWZzaXplID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCWRtYWJ1Zi0+ZG1hc2l6ZSA9IGRtYWJ1Zi0+bnVtZnJhZyA8PCBkbWFidWYtPmZyYWdzaGlmdDsKKworCWlmIChkbWFidWYtPm9zc21heGZyYWdzID49IDIpIHsKKwkJcmVkem9uZSA9IHltZl9jYWxjX2xlbmQoc3RhdGUtPmZvcm1hdC5yYXRlKTsKKwkJcmVkem9uZSA8PD0gc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwkJcmVkem9uZSAqPSAzOworCQlyZWRmcmFncyA9IChyZWR6b25lICsgZG1hYnVmLT5mcmFnc2l6ZS0xKSA+PiBkbWFidWYtPmZyYWdzaGlmdDsKKworCQlpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyArIHJlZGZyYWdzIDwgZG1hYnVmLT5udW1mcmFnKSB7CisJCQlkbWFidWYtPm51bWZyYWcgPSBkbWFidWYtPm9zc21heGZyYWdzICsgcmVkZnJhZ3M7CisJCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcgPDwgZG1hYnVmLT5mcmFnc2hpZnQ7CisJCX0KKwl9CisKKwltZW1zZXQoZG1hYnVmLT5yYXdidWYsIHdfMTYgPyAwIDogMHg4MCwgZG1hYnVmLT5kbWFzaXplKTsKKworCS8qCisJICoJTm93IHNldCB1cCB0aGUgcmluZyAKKwkgKi8KKworCS8qIFhYWCAgIHJldCA9IHJlYz8gY2FwX3ByZSgpOiBwYmtfcHJlKCk7ICAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+dm9pY2VfbG9jaywgZmxhZ3MpOworCWlmIChyZWMpIHsKKwkJaWYgKChyZXQgPSB5bWZfY2FwdHVyZV9wcmVwYXJlKHN0YXRlKSkgIT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHJldCA9IHltZl9wbGF5YmFja19wcmVwYXJlKHN0YXRlKSkgIT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKworCS8qIHNldCB0aGUgcmVhZHkgZmxhZyBmb3IgdGhlIGRtYSBidWZmZXIgKHRoaXMgY29tbWVudCBpcyBub3Qgc3R1cGlkKSAqLworCWRtYWJ1Zi0+cmVhZHkgPSAxOworCisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJwcm9nX2RtYWJ1ZjogcmF0ZSAlZCBmb3JtYXQgMHgleCwiCisJICAgICIgbnVtZnJhZyAlZCBmcmFnc2l6ZSAlZCBkbWFzaXplICVkXG4iLAorCSAgICAgICBzdGF0ZS0+Zm9ybWF0LnJhdGUsIHN0YXRlLT5mb3JtYXQuZm9ybWF0LCBkbWFidWYtPm51bWZyYWcsCisJICAgICAgIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+ZG1hc2l6ZSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5bWZfc3RhcnRfZGFjKHN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlKQoreworCXltZl9wbGF5YmFja190cmlnZ2VyKHN0YXRlLT51bml0LCAmc3RhdGUtPndwY20sIDEpOworfQorCisvLyBzdGF0aWMgdm9pZCB5bWZfc3RhcnRfYWRjKHN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlKQorLy8geworLy8gCXltZl9jYXB0dXJlX3RyaWdnZXIoc3RhdGUtPnVuaXQsICZzdGF0ZS0+cnBjbSwgMSk7CisvLyB9CisKKy8qCisgKiBXYWl0IHVudGlsIG91dHB1dCBpcyBkcmFpbmVkLgorICogVGhpcyBkb2VzIG5vdCBraWxsIHRoZSBoYXJkd2FyZSBmb3IgdGhlIHNha2Ugb2YgaW9jdGxzLgorICovCitzdGF0aWMgdm9pZCB5bWZfd2FpdF9kYWMoc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHltZl91bml0ICp1bml0ID0gc3RhdGUtPnVuaXQ7CisJc3RydWN0IHltZl9wY20gKnlwY20gPSAmc3RhdGUtPndwY207CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdGEsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhZGRfd2FpdF9xdWV1ZSgmeXBjbS0+ZG1hYnVmLndhaXQsICZ3YWl0YSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAoeXBjbS0+ZG1hYnVmLmNvdW50ICE9IDAgJiYgIXlwY20tPnJ1bm5pbmcpIHsKKwkJeW1mX3BsYXliYWNrX3RyaWdnZXIodW5pdCwgeXBjbSwgMSk7CisJfQorCisjaWYgMAorCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkvKgorCQkgKiBYWFggT3VyICBtaXN0YWtlIGlzIHRvIGF0dGFjaCBETUEgYnVmZmVyIHRvIHN0YXRlCisJCSAqIHJhdGhlciB0aGFuIHRvIHNvbWUgcGVyLWRldmljZSBzdHJ1Y3R1cmUuCisJCSAqIENhbm5vdCBza2lwIHdhaXRpbmcsIGNhbiBvbmx5IG1ha2UgaXQgc2hvcnRlci4KKwkJICovCisJfQorI2VuZGlmCisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJd2hpbGUgKHlwY20tPnJ1bm5pbmcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnlwY20tPmRtYWJ1Zi53YWl0LCAmd2FpdGEpOworCisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIG1heSB0YWtlIHVwIHRvIDQgc2Vjb25kcyB0byByZWFjaCB0aGlzIHBvaW50CisJICogKDMySyBjaXJjdWxhciBidWZmZXIsIDgwMDAgSHopLiBVc2VyIG5vdGljZXMuCisJICovCit9CisKKy8qIENhbiBqdXN0IHN0b3AsIHdpdGhvdXQgd2FpdC4gT3IgY2FuIHdlPyAqLworc3RhdGljIHZvaWQgeW1mX3N0b3BfYWRjKHN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCB5bWZfdW5pdCAqdW5pdCA9IHN0YXRlLT51bml0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl5bWZfY2FwdHVyZV90cmlnZ2VyKHVuaXQsICZzdGF0ZS0+cnBjbSwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqICBIYXJkd2FyZSBzdGFydCBtYW5hZ2VtZW50CisgKi8KKworc3RhdGljIHZvaWQgeW1mcGNpX2h3X3N0YXJ0KHltZnBjaV90ICp1bml0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAodW5pdC0+c3RhcnRfY291bnQrKyA9PSAwKSB7CisJCXltZnBjaV93cml0ZWwodW5pdCwgWURTWEdSX01PREUsCisJCSAgICB5bWZwY2lfcmVhZGwodW5pdCwgWURTWEdSX01PREUpIHwgMyk7CisJCXVuaXQtPmFjdGl2ZV9iYW5rID0geW1mcGNpX3JlYWRsKHVuaXQsIFlEU1hHUl9DVFJMU0VMRUNUKSAmIDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHltZnBjaV9od19zdG9wKHltZnBjaV90ICp1bml0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyB0aW1lb3V0ID0gMTAwMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCWlmICgtLXVuaXQtPnN0YXJ0X2NvdW50ID09IDApIHsKKwkJeW1mcGNpX3dyaXRlbCh1bml0LCBZRFNYR1JfTU9ERSwKKwkJICAgIHltZnBjaV9yZWFkbCh1bml0LCBZRFNYR1JfTU9ERSkgJiB+Myk7CisJCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCQlpZiAoKHltZnBjaV9yZWFkbCh1bml0LCBZRFNYR1JfU1RBVFVTKSAmIDIpID09IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqICBQbGF5YmFjayB2b2ljZSBtYW5hZ2VtZW50CisgKi8KKworc3RhdGljIGludCB2b2ljZV9hbGxvYyh5bWZwY2lfdCAqY29kZWMsIHltZnBjaV92b2ljZV90eXBlX3QgdHlwZSwgaW50IHBhaXIsIHltZnBjaV92b2ljZV90ICpydm9pY2VbXSkKK3sKKwl5bWZwY2lfdm9pY2VfdCAqdm9pY2UsICp2b2ljZTI7CisJaW50IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgWURTWEdfUExBWUJBQ0tfVk9JQ0VTOyBpZHggKz0gcGFpciA/IDIgOiAxKSB7CisJCXZvaWNlID0gJmNvZGVjLT52b2ljZXNbaWR4XTsKKwkJdm9pY2UyID0gcGFpciA/ICZjb2RlYy0+dm9pY2VzW2lkeCsxXSA6IE5VTEw7CisJCWlmICh2b2ljZS0+dXNlIHx8ICh2b2ljZTIgJiYgdm9pY2UyLT51c2UpKQorCQkJY29udGludWU7CisJCXZvaWNlLT51c2UgPSAxOworCQlpZiAodm9pY2UyKQorCQkJdm9pY2UyLT51c2UgPSAxOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBZTUZQQ0lfUENNOgorCQkJdm9pY2UtPnBjbSA9IDE7CisJCQlpZiAodm9pY2UyKQorCQkJCXZvaWNlMi0+cGNtID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFlNRlBDSV9TWU5USDoKKwkJCXZvaWNlLT5zeW50aCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBZTUZQQ0lfTUlESToKKwkJCXZvaWNlLT5taWRpID0gMTsKKwkJCWJyZWFrOworCQl9CisJCXltZnBjaV9od19zdGFydChjb2RlYyk7CisJCXJ2b2ljZVswXSA9IHZvaWNlOworCQlpZiAodm9pY2UyKSB7CisJCQl5bWZwY2lfaHdfc3RhcnQoY29kZWMpOworCQkJcnZvaWNlWzFdID0gdm9pY2UyOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVCVVNZOwkvKiBZb3VyIGF1ZGlvIGNoYW5uZWwgaXMgb3BlbiBieSBzb21lb25lIGVsc2UuICovCit9CisKK3N0YXRpYyB2b2lkIHltZnBjaV92b2ljZV9mcmVlKHltZnBjaV90ICp1bml0LCB5bWZwY2lfdm9pY2VfdCAqcHZvaWNlKQoreworCXltZnBjaV9od19zdG9wKHVuaXQpOworCXB2b2ljZS0+dXNlID0gcHZvaWNlLT5wY20gPSBwdm9pY2UtPnN5bnRoID0gcHZvaWNlLT5taWRpID0gMDsKKwlwdm9pY2UtPnlwY20gPSBOVUxMOworfQorCisvKgorICovCisKK3N0YXRpYyB2b2lkIHltZl9wY21faW50ZXJydXB0KHltZnBjaV90ICpjb2RlYywgeW1mcGNpX3ZvaWNlX3QgKnZvaWNlKQoreworCXN0cnVjdCB5bWZfcGNtICp5cGNtOworCWludCByZWR6b25lOworCWludCBwb3MsIGRlbHRhLCBzd3B0cjsKKwlpbnQgcGxheWVkLCBkaXN0YW5jZTsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiAqZG1hYnVmOworCWNoYXIgc2lsZW5jZTsKKworCWlmICgoeXBjbSA9IHZvaWNlLT55cGNtKSA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisJaWYgKChzdGF0ZSA9IHlwY20tPnN0YXRlKSA9PSBOVUxMKSB7CisJCXlwY20tPnJ1bm5pbmcgPSAwOwkvLyBsb2NrIGl0CisJCXJldHVybjsKKwl9CisJZG1hYnVmID0gJnlwY20tPmRtYWJ1ZjsKKwlzcGluX2xvY2soJmNvZGVjLT5yZWdfbG9jayk7CisJaWYgKHlwY20tPnJ1bm5pbmcpIHsKKwkJWU1GREJHSSgieW1mcGNpOiAlZCwgaW50ciBiYW5rICVkIGNvdW50ICVkIHN0YXJ0IDB4JXg6JXhcbiIsCisJCSAgIHZvaWNlLT5udW1iZXIsIGNvZGVjLT5hY3RpdmVfYmFuaywgZG1hYnVmLT5jb3VudCwKKwkJICAgbGUzMl90b19jcHUodm9pY2UtPmJhbmtbMF0uc3RhcnQpLAorCQkgICBsZTMyX3RvX2NwdSh2b2ljZS0+YmFua1sxXS5zdGFydCkpOworCQlzaWxlbmNlID0gKHltZl9wY21fZm9ybWF0X3dpZHRoKHN0YXRlLT5mb3JtYXQuZm9ybWF0KSA9PSAxNikgPworCQkgICAgMCA6IDB4ODA7CisJCS8qIFdlIG5lZWQgYWN0dWFsIGxlZnQtaGFuZC1zaWRlIHJlZHpvbmUgc2l6ZSBoZXJlLiAqLworCQlyZWR6b25lID0geW1mX2NhbGNfbGVuZChzdGF0ZS0+Zm9ybWF0LnJhdGUpOworCQlyZWR6b25lIDw8PSAoc3RhdGUtPmZvcm1hdC5zaGlmdCArIDEpOworCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisKKwkJcG9zID0gbGUzMl90b19jcHUodm9pY2UtPmJhbmtbY29kZWMtPmFjdGl2ZV9iYW5rXS5zdGFydCk7CisJCXBvcyA8PD0gc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwkJaWYgKHBvcyA8IDAgfHwgcG9zID49IGRtYWJ1Zi0+ZG1hc2l6ZSkgewkvKiB1Y29kZSBidWcgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAieW1mcGNpJWQ6IHJ1bmF3YXkgdm9pY2UgJWQ6IGh3cHRyICVkPT4lZCBkbWFzaXplICVkXG4iLAorCQkJICAgIGNvZGVjLT5kZXZfYXVkaW8sIHZvaWNlLT5udW1iZXIsCisJCQkgICAgZG1hYnVmLT5od3B0ciwgcG9zLCBkbWFidWYtPmRtYXNpemUpOworCQkJcG9zID0gMDsKKwkJfQorCQlpZiAocG9zIDwgZG1hYnVmLT5od3B0cikgeworCQkJZGVsdGEgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmh3cHRyOworCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgZG1hYnVmLT5od3B0ciwgc2lsZW5jZSwgZGVsdGEpOworCQkJZGVsdGEgKz0gcG9zOworCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCBzaWxlbmNlLCBwb3MpOworCQl9IGVsc2UgeworCQkJZGVsdGEgPSBwb3MgLSBkbWFidWYtPmh3cHRyOworCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgZG1hYnVmLT5od3B0ciwgc2lsZW5jZSwgZGVsdGEpOworCQl9CisJCWRtYWJ1Zi0+aHdwdHIgPSBwb3M7CisKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2klZDogJWQ6IHN0cmFpbjogaHdwdHIgJWRcbiIsCisJCQkgICAgY29kZWMtPmRldl9hdWRpbywgdm9pY2UtPm51bWJlciwgZG1hYnVmLT5od3B0cik7CisJCQl5bWZfcGxheWJhY2tfdHJpZ2dlcihjb2RlYywgeXBjbSwgMCk7CisJCX0KKworCQlpZiAoc3dwdHIgPD0gcG9zKSB7CisJCQlkaXN0YW5jZSA9IHBvcyAtIHN3cHRyOworCQl9IGVsc2UgeworCQkJZGlzdGFuY2UgPSBkbWFidWYtPmRtYXNpemUgLSAoc3dwdHIgLSBwb3MpOworCQl9CisJCWlmIChkaXN0YW5jZSA8IHJlZHpvbmUpIHsKKwkJCS8qCisJCQkgKiBod3B0ciBpbnNpZGUgcmVkem9uZSA9PiBETUEgcmFuIG91dCBvZiBzYW1wbGVzLgorCQkJICovCisJCQlpZiAoZGVsdGEgPCBkbWFidWYtPmNvdW50KSB7CisJCQkJLyoKKwkJCQkgKiBMb3N0IGludGVycnVwdCBvciBvdGhlciBzY3Jld2FnZS4KKwkJCQkgKi8KKwkJCQlwcmludGsoS0VSTl9FUlIgInltZnBjaSVkOiAlZDogbG9zdDogZGVsdGEgJWQiCisJCQkJICAgICIgaHdwdHIgJWQgc3dwdHIgJWQgZGlzdGFuY2UgJWQgY291bnQgJWRcbiIsCisJCQkJICAgIGNvZGVjLT5kZXZfYXVkaW8sIHZvaWNlLT5udW1iZXIsIGRlbHRhLAorCQkJCSAgICBkbWFidWYtPmh3cHRyLCBzd3B0ciwgZGlzdGFuY2UsIGRtYWJ1Zi0+Y291bnQpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIE5vcm1hbCBlbmQgb2YgRE1BLgorCQkJCSAqLworCQkJCVlNRkRCR0koInltZnBjaSVkOiAlZDogZG9uZTogZGVsdGEgJWQiCisJCQkJICAgICIgaHdwdHIgJWQgc3dwdHIgJWQgZGlzdGFuY2UgJWQgY291bnQgJWRcbiIsCisJCQkJICAgIGNvZGVjLT5kZXZfYXVkaW8sIHZvaWNlLT5udW1iZXIsIGRlbHRhLAorCQkJCSAgICBkbWFidWYtPmh3cHRyLCBzd3B0ciwgZGlzdGFuY2UsIGRtYWJ1Zi0+Y291bnQpOworCQkJfQorCQkJcGxheWVkID0gZG1hYnVmLT5jb3VudDsKKwkJCWlmICh5cGNtLT5ydW5uaW5nKSB7CisJCQkJeW1mX3BsYXliYWNrX3RyaWdnZXIoY29kZWMsIHlwY20sIDApOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGh3cHRyIGlzIGNoaXBwaW5nIGF3YXkgdG93YXJkcyBhIHJlbW90ZSBzd3B0ci4KKwkJCSAqIENhbGN1bGF0ZSBvdGhlciBkaXN0YW5jZSBhbmQgYXBwbHkgaXQgdG8gY291bnQuCisJCQkgKi8KKwkJCWlmIChzd3B0ciA+PSBwb3MpIHsKKwkJCQlkaXN0YW5jZSA9IHN3cHRyIC0gcG9zOworCQkJfSBlbHNlIHsKKwkJCQlkaXN0YW5jZSA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIChwb3MgLSBzd3B0cik7CisJCQl9CisJCQlpZiAoZGlzdGFuY2UgPCBkbWFidWYtPmNvdW50KSB7CisJCQkJcGxheWVkID0gZG1hYnVmLT5jb3VudCAtIGRpc3RhbmNlOworCQkJfSBlbHNlIHsKKwkJCQlwbGF5ZWQgPSAwOworCQkJfQorCQl9CisKKwkJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBwbGF5ZWQ7CisJCWRtYWJ1Zi0+Y291bnQgLT0gcGxheWVkOworCQlpZiAoZG1hYnVmLT5jb3VudCA8IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIpIHsKKwkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmNvZGVjLT5yZWdfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHltZl9jYXBfaW50ZXJydXB0KHltZnBjaV90ICp1bml0LCBzdHJ1Y3QgeW1mX2NhcHR1cmUgKmNhcCkKK3sKKwlzdHJ1Y3QgeW1mX3BjbSAqeXBjbTsKKwlpbnQgcmVkem9uZTsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiAqZG1hYnVmOworCWludCBwb3MsIGRlbHRhOworCWludCBjbnQ7CisKKwlpZiAoKHlwY20gPSBjYXAtPnlwY20pID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHN0YXRlID0geXBjbS0+c3RhdGUpID09IE5VTEwpIHsKKwkJeXBjbS0+cnVubmluZyA9IDA7CS8vIGxvY2sgaXQKKwkJcmV0dXJuOworCX0KKwlkbWFidWYgPSAmeXBjbS0+ZG1hYnVmOworCXNwaW5fbG9jaygmdW5pdC0+cmVnX2xvY2spOworCWlmICh5cGNtLT5ydW5uaW5nKSB7CisJCXJlZHpvbmUgPSB5bWZfY2FsY19sZW5kKHN0YXRlLT5mb3JtYXQucmF0ZSk7CisJCXJlZHpvbmUgPDw9IChzdGF0ZS0+Zm9ybWF0LnNoaWZ0ICsgMSk7CisKKwkJcG9zID0gbGUzMl90b19jcHUoY2FwLT5iYW5rW3VuaXQtPmFjdGl2ZV9iYW5rXS5zdGFydCk7CisJCS8vIHBvcyA8PD0gc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwkJaWYgKHBvcyA8IDAgfHwgcG9zID49IGRtYWJ1Zi0+ZG1hc2l6ZSkgewkvKiB1Y29kZSBidWcgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAieW1mcGNpJWQ6IHJ1bmF3YXkgY2FwdHVyZSAlZDogaHdwdHIgJWQ9PiVkIGRtYXNpemUgJWRcbiIsCisJCQkgICAgdW5pdC0+ZGV2X2F1ZGlvLCB5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyLAorCQkJICAgIGRtYWJ1Zi0+aHdwdHIsIHBvcywgZG1hYnVmLT5kbWFzaXplKTsKKwkJCXBvcyA9IDA7CisJCX0KKwkJaWYgKHBvcyA8IGRtYWJ1Zi0+aHdwdHIpIHsKKwkJCWRlbHRhID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5od3B0cjsKKwkJCWRlbHRhICs9IHBvczsKKwkJfSBlbHNlIHsKKwkJCWRlbHRhID0gcG9zIC0gZG1hYnVmLT5od3B0cjsKKwkJfQorCQlkbWFidWYtPmh3cHRyID0gcG9zOworCisJCWNudCA9IGRtYWJ1Zi0+Y291bnQ7CisJCWNudCArPSBkZWx0YTsKKwkJaWYgKGNudCArIHJlZHpvbmUgPiBkbWFidWYtPmRtYXNpemUpIHsKKwkJCS8qIE92ZXJmbG93IC0gYnVtcCBzd3B0ciAqLworCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHJlZHpvbmU7CisJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciArIHJlZHpvbmU7CisJCQlpZiAoZG1hYnVmLT5zd3B0ciA+PSBkbWFidWYtPmRtYXNpemUpIHsKKwkJCQlkbWFidWYtPnN3cHRyIC09IGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRtYWJ1Zi0+Y291bnQgPSBjbnQ7CisJCX0KKworCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRlbHRhOworCQlpZiAoZG1hYnVmLT5jb3VudCkgewkJLyogJiYgaXNfc2xlZXBpbmcgIFhYWCAqLworCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmdW5pdC0+cmVnX2xvY2spOworfQorCitzdGF0aWMgaW50IHltZl9wbGF5YmFja190cmlnZ2VyKHltZnBjaV90ICpjb2RlYywgc3RydWN0IHltZl9wY20gKnlwY20sIGludCBjbWQpCit7CisKKwlpZiAoeXBjbS0+dm9pY2VzWzBdID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjbWQgIT0gMCkgeworCQljb2RlYy0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMF0tPm51bWJlciArIDFdID0KKwkJICAgIGNwdV90b19sZTMyKHlwY20tPnZvaWNlc1swXS0+YmFua19iYSk7CisJCWlmICh5cGNtLT52b2ljZXNbMV0gIT0gTlVMTCkKKwkJCWNvZGVjLT5jdHJsX3BsYXliYWNrW3lwY20tPnZvaWNlc1sxXS0+bnVtYmVyICsgMV0gPQorCQkJICAgIGNwdV90b19sZTMyKHlwY20tPnZvaWNlc1sxXS0+YmFua19iYSk7CisJCXlwY20tPnJ1bm5pbmcgPSAxOworCX0gZWxzZSB7CisJCWNvZGVjLT5jdHJsX3BsYXliYWNrW3lwY20tPnZvaWNlc1swXS0+bnVtYmVyICsgMV0gPSAwOworCQlpZiAoeXBjbS0+dm9pY2VzWzFdICE9IE5VTEwpCisJCQljb2RlYy0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMV0tPm51bWJlciArIDFdID0gMDsKKwkJeXBjbS0+cnVubmluZyA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5bWZfY2FwdHVyZV90cmlnZ2VyKHltZnBjaV90ICpjb2RlYywgc3RydWN0IHltZl9wY20gKnlwY20sIGludCBjbWQpCit7CisJdTMyIHRtcDsKKworCWlmIChjbWQgIT0gMCkgeworCQl0bXAgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9NQVBPRlJFQykgfCAoMSA8PCB5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyKTsKKwkJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX01BUE9GUkVDLCB0bXApOworCQl5cGNtLT5ydW5uaW5nID0gMTsKKwl9IGVsc2UgeworCQl0bXAgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9NQVBPRlJFQykgJiB+KDEgPDwgeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlcik7CisJCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9NQVBPRlJFQywgdG1wKTsKKwkJeXBjbS0+cnVubmluZyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHltZnBjaV9wY21fdm9pY2VfYWxsb2Moc3RydWN0IHltZl9wY20gKnlwY20sIGludCB2b2ljZXMpCit7CisJc3RydWN0IHltZl91bml0ICp1bml0OworCWludCBlcnI7CisKKwl1bml0ID0geXBjbS0+c3RhdGUtPnVuaXQ7CisJaWYgKHlwY20tPnZvaWNlc1sxXSAhPSBOVUxMICYmIHZvaWNlcyA8IDIpIHsKKwkJeW1mcGNpX3ZvaWNlX2ZyZWUodW5pdCwgeXBjbS0+dm9pY2VzWzFdKTsKKwkJeXBjbS0+dm9pY2VzWzFdID0gTlVMTDsKKwl9CisJaWYgKHZvaWNlcyA9PSAxICYmIHlwY20tPnZvaWNlc1swXSAhPSBOVUxMKQorCQlyZXR1cm4gMDsJCS8qIGFscmVhZHkgYWxsb2NhdGVkICovCisJaWYgKHZvaWNlcyA9PSAyICYmIHlwY20tPnZvaWNlc1swXSAhPSBOVUxMICYmIHlwY20tPnZvaWNlc1sxXSAhPSBOVUxMKQorCQlyZXR1cm4gMDsJCS8qIGFscmVhZHkgYWxsb2NhdGVkICovCisJaWYgKHZvaWNlcyA+IDEpIHsKKwkJaWYgKHlwY20tPnZvaWNlc1swXSAhPSBOVUxMICYmIHlwY20tPnZvaWNlc1sxXSA9PSBOVUxMKSB7CisJCQl5bWZwY2lfdm9pY2VfZnJlZSh1bml0LCB5cGNtLT52b2ljZXNbMF0pOworCQkJeXBjbS0+dm9pY2VzWzBdID0gTlVMTDsKKwkJfQkJCisJCWlmICgoZXJyID0gdm9pY2VfYWxsb2ModW5pdCwgWU1GUENJX1BDTSwgMSwgeXBjbS0+dm9pY2VzKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJeXBjbS0+dm9pY2VzWzBdLT55cGNtID0geXBjbTsKKwkJeXBjbS0+dm9pY2VzWzFdLT55cGNtID0geXBjbTsKKwl9IGVsc2UgeworCQlpZiAoKGVyciA9IHZvaWNlX2FsbG9jKHVuaXQsIFlNRlBDSV9QQ00sIDAsIHlwY20tPnZvaWNlcykpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXlwY20tPnZvaWNlc1swXS0+eXBjbSA9IHlwY207CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5bWZfcGNtX2luaXRfdm9pY2UoeW1mcGNpX3ZvaWNlX3QgKnZvaWNlLCBpbnQgc3RlcmVvLAorICAgIGludCByYXRlLCBpbnQgd18xNiwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZW5kLCBpbnQgc3BkaWYpCit7CisJdTMyIGZvcm1hdDsKKwl1MzIgZGVsdGEgPSB5bWZwY2lfY2FsY19kZWx0YShyYXRlKTsKKwl1MzIgbHBmUSA9IHltZnBjaV9jYWxjX2xwZlEocmF0ZSk7CisJdTMyIGxwZksgPSB5bWZwY2lfY2FsY19scGZLKHJhdGUpOworCXltZnBjaV9wbGF5YmFja19iYW5rX3QgKmJhbms7CisJaW50IG5iYW5rOworCisJLyoKKwkgKiBUaGUgZ2FpbiBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gQWNjb3JkaW5nIHRvIHRoZSBtYW51YWwsCisJICogYml0IDMxIGluZGljYXRlcyBhIHNpZ24gYml0LCBiaXQgMzAgaW5kaWNhdGVzIGFuIGludGVnZXIgcGFydCwKKwkgKiBhbmQgYml0cyBbMjk6MTVdIGluZGljYXRlIGEgZGVjaW1hbCBmcmFjdGlvbiBwYXJ0LiBUaHVzLAorCSAqIGZvciBhIGdhaW4gb2YgMS4wIHRoZSBjb25zdGFudCBvZiAweDQwMDAwMDAwIGlzIGxvYWRlZC4KKwkgKi8KKwl1bnNpZ25lZCBkZWZhdWx0X2dhaW4gPSBjcHVfdG9fbGUzMigweDQwMDAwMDAwKTsKKworCWZvcm1hdCA9IChzdGVyZW8gPyAweDAwMDEwMDAwIDogMCkgfCAod18xNiA/IDAgOiAweDgwMDAwMDAwKTsKKwlpZiAoc3RlcmVvKQorCQllbmQgPj49IDE7CisJaWYgKHdfMTYpCisJCWVuZCA+Pj0gMTsKKwlmb3IgKG5iYW5rID0gMDsgbmJhbmsgPCAyOyBuYmFuaysrKSB7CisJCWJhbmsgPSAmdm9pY2UtPmJhbmtbbmJhbmtdOworCQliYW5rLT5mb3JtYXQgPSBjcHVfdG9fbGUzMihmb3JtYXQpOworCQliYW5rLT5sb29wX2RlZmF1bHQgPSAwOwkvKiAwLWxvb3BzIGZvcmV2ZXIsIG90aGVyd2lzZSBjb3VudCAqLworCQliYW5rLT5iYXNlID0gY3B1X3RvX2xlMzIoYWRkcik7CisJCWJhbmstPmxvb3Bfc3RhcnQgPSAwOworCQliYW5rLT5sb29wX2VuZCA9IGNwdV90b19sZTMyKGVuZCk7CisJCWJhbmstPmxvb3BfZnJhYyA9IDA7CisJCWJhbmstPmVnX2dhaW5fZW5kID0gZGVmYXVsdF9nYWluOworCQliYW5rLT5scGZRID0gY3B1X3RvX2xlMzIobHBmUSk7CisJCWJhbmstPnN0YXR1cyA9IDA7CisJCWJhbmstPm51bV9vZl9mcmFtZXMgPSAwOworCQliYW5rLT5sb29wX2NvdW50ID0gMDsKKwkJYmFuay0+c3RhcnQgPSAwOworCQliYW5rLT5zdGFydF9mcmFjID0gMDsKKwkJYmFuay0+ZGVsdGEgPQorCQliYW5rLT5kZWx0YV9lbmQgPSBjcHVfdG9fbGUzMihkZWx0YSk7CisJCWJhbmstPmxwZksgPQorCQliYW5rLT5scGZLX2VuZCA9IGNwdV90b19sZTMyKGxwZkspOworCQliYW5rLT5lZ19nYWluID0gZGVmYXVsdF9nYWluOworCQliYW5rLT5scGZEMSA9CisJCWJhbmstPmxwZkQyID0gMDsKKworCQliYW5rLT5sZWZ0X2dhaW4gPSAKKwkJYmFuay0+cmlnaHRfZ2FpbiA9CisJCWJhbmstPmxlZnRfZ2Fpbl9lbmQgPQorCQliYW5rLT5yaWdodF9nYWluX2VuZCA9CisJCWJhbmstPmVmZjFfZ2FpbiA9CisJCWJhbmstPmVmZjJfZ2FpbiA9CisJCWJhbmstPmVmZjNfZ2FpbiA9CisJCWJhbmstPmVmZjFfZ2Fpbl9lbmQgPQorCQliYW5rLT5lZmYyX2dhaW5fZW5kID0KKwkJYmFuay0+ZWZmM19nYWluX2VuZCA9IDA7CisKKwkJaWYgKCFzdGVyZW8pIHsKKwkJCWlmICghc3BkaWYpIHsKKwkJCQliYW5rLT5sZWZ0X2dhaW4gPSAKKwkJCQliYW5rLT5yaWdodF9nYWluID0KKwkJCQliYW5rLT5sZWZ0X2dhaW5fZW5kID0KKwkJCQliYW5rLT5yaWdodF9nYWluX2VuZCA9IGRlZmF1bHRfZ2FpbjsKKwkJCX0gZWxzZSB7CisJCQkJYmFuay0+ZWZmMl9nYWluID0KKwkJCQliYW5rLT5lZmYyX2dhaW5fZW5kID0KKwkJCQliYW5rLT5lZmYzX2dhaW4gPQorCQkJCWJhbmstPmVmZjNfZ2Fpbl9lbmQgPSBkZWZhdWx0X2dhaW47CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIXNwZGlmKSB7CisJCQkJaWYgKCh2b2ljZS0+bnVtYmVyICYgMSkgPT0gMCkgeworCQkJCQliYW5rLT5sZWZ0X2dhaW4gPQorCQkJCQliYW5rLT5sZWZ0X2dhaW5fZW5kID0gZGVmYXVsdF9nYWluOworCQkJCX0gZWxzZSB7CisJCQkJCWJhbmstPmZvcm1hdCB8PSBjcHVfdG9fbGUzMigxKTsKKwkJCQkJYmFuay0+cmlnaHRfZ2FpbiA9CisJCQkJCWJhbmstPnJpZ2h0X2dhaW5fZW5kID0gZGVmYXVsdF9nYWluOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCh2b2ljZS0+bnVtYmVyICYgMSkgPT0gMCkgeworCQkJCQliYW5rLT5lZmYyX2dhaW4gPQorCQkJCQliYW5rLT5lZmYyX2dhaW5fZW5kID0gZGVmYXVsdF9nYWluOworCQkJCX0gZWxzZSB7CisJCQkJCWJhbmstPmZvcm1hdCB8PSBjcHVfdG9fbGUzMigxKTsKKwkJCQkJYmFuay0+ZWZmM19nYWluID0KKwkJCQkJYmFuay0+ZWZmM19nYWluX2VuZCA9IGRlZmF1bHRfZ2FpbjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBYWFggQ2FwdHVyZSBjaGFubmVsIGFsbG9jYXRpb24gaXMgZW50aXJlbHkgZmFrZSBhdCB0aGUgbW9tZW50LgorICogV2UgdXNlIG9ubHkgb25lIGNoYW5uZWwgYW5kIG1hcmsgaXQgYnVzeSBhcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGludCB5bWZfY2FwdHVyZV9hbGxvYyhzdHJ1Y3QgeW1mX3VuaXQgKnVuaXQsIGludCAqcGJhbmspCit7CisJc3RydWN0IHltZl9jYXB0dXJlICpjYXA7CisJaW50IGNiYW5rOworCisJY2JhbmsgPSAxOwkJLyogT25seSBBREMgc2xvdCBpcyB1c2VkIGZvciBub3cuICovCisJY2FwID0gJnVuaXQtPmNhcHR1cmVbY2JhbmtdOworCWlmIChjYXAtPnVzZSkKKwkJcmV0dXJuIC1FQlVTWTsKKwljYXAtPnVzZSA9IDE7CisJKnBiYW5rID0gY2Jhbms7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeW1mX3BsYXliYWNrX3ByZXBhcmUoc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHltZl9wY20gKnlwY20gPSAmc3RhdGUtPndwY207CisJaW50IGVyciwgbnZvaWNlOworCisJaWYgKChlcnIgPSB5bWZwY2lfcGNtX3ZvaWNlX2FsbG9jKHlwY20sIHN0YXRlLT5mb3JtYXQudm9pY2VzKSkgPCAwKSB7CisJCS8qIFNvbWVib2R5IHN0YXJ0ZWQgMzIgbXBnMTIzJ3MgaW4gcGFyYWxsZWw/ICovCisJCXByaW50ayhLRVJOX0lORk8gInltZnBjaSVkOiBjYW5ub3QgYWxsb2NhdGUgdm9pY2VcbiIsCisJCSAgICBzdGF0ZS0+dW5pdC0+ZGV2X2F1ZGlvKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmb3IgKG52b2ljZSA9IDA7IG52b2ljZSA8IHN0YXRlLT5mb3JtYXQudm9pY2VzOyBudm9pY2UrKykgeworCQl5bWZfcGNtX2luaXRfdm9pY2UoeXBjbS0+dm9pY2VzW252b2ljZV0sCisJCSAgICBzdGF0ZS0+Zm9ybWF0LnZvaWNlcyA9PSAyLCBzdGF0ZS0+Zm9ybWF0LnJhdGUsCisJCSAgICB5bWZfcGNtX2Zvcm1hdF93aWR0aChzdGF0ZS0+Zm9ybWF0LmZvcm1hdCkgPT0gMTYsCisJCSAgICB5cGNtLT5kbWFidWYuZG1hX2FkZHIsIHlwY20tPmRtYWJ1Zi5kbWFzaXplLAorCQkgICAgeXBjbS0+c3BkaWYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB5bWZfY2FwdHVyZV9wcmVwYXJlKHN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlKQoreworCXltZnBjaV90ICp1bml0ID0gc3RhdGUtPnVuaXQ7CisJc3RydWN0IHltZl9wY20gKnlwY20gPSAmc3RhdGUtPnJwY207CisJeW1mcGNpX2NhcHR1cmVfYmFua190ICogYmFuazsKKwkvKiBYWFggVGhpcyBpcyBjb25mdXNpbmcsIGdvdHRhIHJlbmFtZSBvbmUgb2YgdGhlbSBiYW5rcy4uLiAqLworCWludCBuYmFuazsJCS8qIGZsaXAtZmxvcCBiYW5rICovCisJaW50IGNiYW5rOwkJLyogaW5wdXQgW3N1cGVyLV1iYW5rICovCisJc3RydWN0IHltZl9jYXB0dXJlICpjYXA7CisJdTMyIHJhdGUsIGZvcm1hdDsKKworCWlmICh5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyID09IC0xKSB7CisJCWlmICh5bWZfY2FwdHVyZV9hbGxvYyh1bml0LCAmY2JhbmspICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCXlwY20tPmNhcHR1cmVfYmFua19udW1iZXIgPSBjYmFuazsKKworCQljYXAgPSAmdW5pdC0+Y2FwdHVyZVtjYmFua107CisJCWNhcC0+YmFuayA9IHVuaXQtPmJhbmtfY2FwdHVyZVtjYmFua11bMF07CisJCWNhcC0+eXBjbSA9IHlwY207CisJCXltZnBjaV9od19zdGFydCh1bml0KTsKKwl9CisKKwkvLyB5cGNtLT5mcmFnX3NpemUgPSBzbmRfcGNtX2xpYl90cmFuc2Zlcl9mcmFnbWVudChzdWJzdHJlYW0pOworCS8vIGZyYWdfc2l6ZSBpcyByZXBsYWNlZCB3aXRoIG5vbmZyYWdnZWQgYnl0ZS1hbGlnbmVkIHJvbGxpbmcgYnVmZmVyCisJcmF0ZSA9ICgoNDgwMDAgKiA0MDk2KSAvIHN0YXRlLT5mb3JtYXQucmF0ZSkgLSAxOworCWZvcm1hdCA9IDA7CisJaWYgKHN0YXRlLT5mb3JtYXQudm9pY2VzID09IDIpCisJCWZvcm1hdCB8PSAyOworCWlmICh5bWZfcGNtX2Zvcm1hdF93aWR0aChzdGF0ZS0+Zm9ybWF0LmZvcm1hdCkgPT0gOCkKKwkJZm9ybWF0IHw9IDE7CisJc3dpdGNoICh5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyKSB7CisJY2FzZSAwOgorCQl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9SRUNGT1JNQVQsIGZvcm1hdCk7CisJCXltZnBjaV93cml0ZWwodW5pdCwgWURTWEdSX1JFQ1NMT1RTUiwgcmF0ZSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJeW1mcGNpX3dyaXRlbCh1bml0LCBZRFNYR1JfQURDRk9STUFULCBmb3JtYXQpOworCQl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9BRENTTE9UU1IsIHJhdGUpOworCQlicmVhazsKKwl9CisJZm9yIChuYmFuayA9IDA7IG5iYW5rIDwgMjsgbmJhbmsrKykgeworCQliYW5rID0gdW5pdC0+YmFua19jYXB0dXJlW3lwY20tPmNhcHR1cmVfYmFua19udW1iZXJdW25iYW5rXTsKKwkJYmFuay0+YmFzZSA9IGNwdV90b19sZTMyKHlwY20tPmRtYWJ1Zi5kbWFfYWRkcik7CisJCS8vIGJhbmstPmxvb3BfZW5kID0geXBjbS0+ZG1hYnVmLmRtYXNpemUgPj4gc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwkJYmFuay0+bG9vcF9lbmQgPSBjcHVfdG9fbGUzMih5cGNtLT5kbWFidWYuZG1hc2l6ZSk7CisJCWJhbmstPnN0YXJ0ID0gMDsKKwkJYmFuay0+bnVtX29mX2xvb3BzID0gMDsKKwl9CisjaWYgMCAvKiBzL3BkaWYgKi8KKwlpZiAoc3RhdGUtPmRpZ2l0YWwuZGlnX3ZhbGlkKQorCQkvKnN0YXRlLT5kaWdpdGFsLnR5cGUgPT0gU05EX1BDTV9ESUdfQUVTX0lFQzk1OCovCisJCXltZnBjaV93cml0ZXcoY29kZWMsIFlEU1hHUl9TUERJRk9VVFNUQVRVUywKKwkJICAgIHN0YXRlLT5kaWdpdGFsLmRpZ19zdGF0dXNbMF0gfCAoc3RhdGUtPmRpZ2l0YWwuZGlnX3N0YXR1c1sxXSA8PCA4KSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHltZl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl5bWZwY2lfdCAqY29kZWMgPSBkZXZfaWQ7CisJdTMyIHN0YXR1cywgbnZvaWNlLCBtb2RlOworCXN0cnVjdCB5bWZfdm9pY2UgKnZvaWNlOworCXN0cnVjdCB5bWZfY2FwdHVyZSAqY2FwOworCisJc3RhdHVzID0geW1mcGNpX3JlYWRsKGNvZGVjLCBZRFNYR1JfU1RBVFVTKTsKKwlpZiAoc3RhdHVzICYgMHg4MDAwMDAwMCkgeworCQljb2RlYy0+YWN0aXZlX2JhbmsgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9DVFJMU0VMRUNUKSAmIDE7CisJCXNwaW5fbG9jaygmY29kZWMtPnZvaWNlX2xvY2spOworCQlmb3IgKG52b2ljZSA9IDA7IG52b2ljZSA8IFlEU1hHX1BMQVlCQUNLX1ZPSUNFUzsgbnZvaWNlKyspIHsKKwkJCXZvaWNlID0gJmNvZGVjLT52b2ljZXNbbnZvaWNlXTsKKwkJCWlmICh2b2ljZS0+dXNlKQorCQkJCXltZl9wY21faW50ZXJydXB0KGNvZGVjLCB2b2ljZSk7CisJCX0KKwkJZm9yIChudm9pY2UgPSAwOyBudm9pY2UgPCBZRFNYR19DQVBUVVJFX1ZPSUNFUzsgbnZvaWNlKyspIHsKKwkJCWNhcCA9ICZjb2RlYy0+Y2FwdHVyZVtudm9pY2VdOworCQkJaWYgKGNhcC0+dXNlKQorCQkJCXltZl9jYXBfaW50ZXJydXB0KGNvZGVjLCBjYXApOworCQl9CisJCXNwaW5fdW5sb2NrKCZjb2RlYy0+dm9pY2VfbG9jayk7CisJCXNwaW5fbG9jaygmY29kZWMtPnJlZ19sb2NrKTsKKwkJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX1NUQVRVUywgMHg4MDAwMDAwMCk7CisJCW1vZGUgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9NT0RFKSB8IDI7CisJCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9NT0RFLCBtb2RlKTsKKwkJc3Bpbl91bmxvY2soJmNvZGVjLT5yZWdfbG9jayk7CisJfQorCisJc3RhdHVzID0geW1mcGNpX3JlYWRsKGNvZGVjLCBZRFNYR1JfSU5URkxBRyk7CisJaWYgKHN0YXR1cyAmIDEpIHsKKwkJLyogdGltZXIgaGFuZGxlciAqLworCQl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfSU5URkxBRywgfjApOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHltZl9wY21fZnJlZV9zdWJzdHJlYW0oc3RydWN0IHltZl9wY20gKnlwY20pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgeW1mX3VuaXQgKnVuaXQ7CisKKwl1bml0ID0geXBjbS0+c3RhdGUtPnVuaXQ7CisKKwlpZiAoeXBjbS0+dHlwZSA9PSBQTEFZQkFDS19WT0lDRSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+dm9pY2VfbG9jaywgZmxhZ3MpOworCQlpZiAoeXBjbS0+dm9pY2VzWzFdKQorCQkJeW1mcGNpX3ZvaWNlX2ZyZWUodW5pdCwgeXBjbS0+dm9pY2VzWzFdKTsKKwkJaWYgKHlwY20tPnZvaWNlc1swXSkKKwkJCXltZnBjaV92b2ljZV9mcmVlKHVuaXQsIHlwY20tPnZvaWNlc1swXSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlpZiAoeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlciAhPSAtMSkgeworCQkJdW5pdC0+Y2FwdHVyZVt5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyXS51c2UgPSAwOworCQkJeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlciA9IC0xOworCQkJeW1mcGNpX2h3X3N0b3AodW5pdCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeW1mX3N0YXRlICp5bWZfc3RhdGVfYWxsb2MoeW1mcGNpX3QgKnVuaXQpCit7CisJc3RydWN0IHltZl9wY20gKnlwY207CisJc3RydWN0IHltZl9zdGF0ZSAqc3RhdGU7CisKKwlpZiAoKHN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHltZl9zdGF0ZSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCWdvdG8gb3V0MDsKKwl9CisJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RydWN0IHltZl9zdGF0ZSkpOworCisJeXBjbSA9ICZzdGF0ZS0+d3BjbTsKKwl5cGNtLT5zdGF0ZSA9IHN0YXRlOworCXlwY20tPnR5cGUgPSBQTEFZQkFDS19WT0lDRTsKKwl5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyID0gLTE7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmeXBjbS0+ZG1hYnVmLndhaXQpOworCisJeXBjbSA9ICZzdGF0ZS0+cnBjbTsKKwl5cGNtLT5zdGF0ZSA9IHN0YXRlOworCXlwY20tPnR5cGUgPSBDQVBUVVJFX0FDOTc7CisJeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlciA9IC0xOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnlwY20tPmRtYWJ1Zi53YWl0KTsKKworCXN0YXRlLT51bml0ID0gdW5pdDsKKworCXN0YXRlLT5mb3JtYXQuZm9ybWF0ID0gQUZNVF9VODsKKwlzdGF0ZS0+Zm9ybWF0LnJhdGUgPSA4MDAwOworCXN0YXRlLT5mb3JtYXQudm9pY2VzID0gMTsKKwl5bWZfcGNtX3VwZGF0ZV9zaGlmdCgmc3RhdGUtPmZvcm1hdCk7CisKKwlyZXR1cm4gc3RhdGU7CisKK291dDA6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEFFUy9JRUM5NTggY2hhbm5lbCBzdGF0dXMgYml0cyAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPRkVTU0lPTkFMCSgxPDwwKQkvKiAwID0gY29uc3VtZXIsIDEgPSBwcm9mZXNzaW9uYWwgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMwX05PTkFVRElPCQkoMTw8MSkJLyogMCA9IGF1ZGlvLCAxID0gbm9uLWF1ZGlvICovCisjZGVmaW5lIFNORF9QQ01fQUVTMF9QUk9fRU1QSEFTSVMJKDc8PDIpCS8qIG1hc2sgLSBlbXBoYXNpcyAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPX0VNUEhBU0lTX05PVElECSgwPDwyKQkvKiBlbXBoYXNpcyBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIFNORF9QQ01fQUVTMF9QUk9fRU1QSEFTSVNfTk9ORQkoMTw8MikJLyogbm9uZSBlbXBoYXNpcyAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPX0VNUEhBU0lTXzUwMTUJKDM8PDIpCS8qIDUwLzE1dXMgZW1waGFzaXMgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMwX1BST19FTVBIQVNJU19DQ0lUVAkoNzw8MikJLyogQ0NJVFQgSi4xNyBlbXBoYXNpcyAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPX0ZSRVFfVU5MT0NLRUQJKDE8PDUpCS8qIHNvdXJjZSBzYW1wbGUgZnJlcXVlbmN5OiAwID0gbG9ja2VkLCAxID0gdW5sb2NrZWQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMwX1BST19GUwkJKDM8PDYpCS8qIG1hc2sgLSBzYW1wbGUgZnJlcXVlbmN5ICovCisjZGVmaW5lIFNORF9QQ01fQUVTMF9QUk9fRlNfTk9USUQJKDA8PDYpCS8qIGZzIG5vdCBpbmRpY2F0ZWQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMwX1BST19GU180NDEwMAkoMTw8NikJLyogNDQuMWtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPX0ZTXzQ4MDAwCSgyPDw2KQkvKiA0OGtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPX0ZTXzMyMDAwCSgzPDw2KQkvKiAzMmtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfQ09OX05PVF9DT1BZUklHSFQJKDE8PDIpCS8qIDAgPSBjb3B5cmlnaHQsIDEgPSBub3QgY29weXJpZ2h0ICovCisjZGVmaW5lIFNORF9QQ01fQUVTMF9DT05fRU1QSEFTSVMJKDc8PDMpCS8qIG1hc2sgLSBlbXBoYXNpcyAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfQ09OX0VNUEhBU0lTX05PTkUJKDA8PDMpCS8qIG5vbmUgZW1waGFzaXMgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMwX0NPTl9FTVBIQVNJU181MDE1CSgxPDwzKQkvKiA1MC8xNXVzIGVtcGhhc2lzICovCisjZGVmaW5lIFNORF9QQ01fQUVTMF9DT05fTU9ERQkJKDM8PDYpCS8qIG1hc2sgLSBtb2RlICovCisjZGVmaW5lIFNORF9QQ01fQUVTMV9QUk9fTU9ERQkJKDE1PDwwKQkvKiBtYXNrIC0gY2hhbm5lbCBtb2RlICovCisjZGVmaW5lIFNORF9QQ01fQUVTMV9QUk9fTU9ERV9OT1RJRAkoMDw8MCkJLyogbm90IGluZGljYXRlZCAqLworI2RlZmluZSBTTkRfUENNX0FFUzFfUFJPX01PREVfU1RFUkVPUEhPTklDICgyPDwwKSAvKiBzdGVyZW9waG9uaWMgLSBjaCBBIGlzIGxlZnQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMxX1BST19NT0RFX1NJTkdMRQkoNDw8MCkJLyogc2luZ2xlIGNoYW5uZWwgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMxX1BST19NT0RFX1RXTwkoODw8MCkJLyogdHdvIGNoYW5uZWxzICovCisjZGVmaW5lIFNORF9QQ01fQUVTMV9QUk9fTU9ERV9QUklNQVJZCSgxMjw8MCkJLyogcHJpbWFyeS9zZWNvbmRhcnkgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMxX1BST19NT0RFX0JZVEUzCSgxNTw8MCkJLyogdmVjdG9yIHRvIGJ5dGUgMyAqLworI2RlZmluZSBTTkRfUENNX0FFUzFfUFJPX1VTRVJCSVRTCSgxNTw8NCkJLyogbWFzayAtIHVzZXIgYml0cyAqLworI2RlZmluZSBTTkRfUENNX0FFUzFfUFJPX1VTRVJCSVRTX05PVElECSgwPDw0KQkvKiBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIFNORF9QQ01fQUVTMV9QUk9fVVNFUkJJVFNfMTkyCSg4PDw0KQkvKiAxOTItYml0IHN0cnVjdHVyZSAqLworI2RlZmluZSBTTkRfUENNX0FFUzFfUFJPX1VTRVJCSVRTX1VERUYJKDEyPDw0KQkvKiB1c2VyIGRlZmluZWQgYXBwbGljYXRpb24gKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9DQVRFR09SWQkweDdmCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fR0VORVJBTAkweDAwCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fRVhQRVJJTUVOVEFMCTB4NDAKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9TT0xJRE1FTV9NQVNLCTB4MGYKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9TT0xJRE1FTV9JRAkweDA4CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fQlJPQURDQVNUMV9NQVNLIDB4MDcKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9CUk9BRENBU1QxX0lECTB4MDQKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9ESUdESUdDT05WX01BU0sgMHgwNworI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX0RJR0RJR0NPTlZfSUQJMHgwMgorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfTUFTSyAweDFmCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fQURDX0NPUFlSSUdIVF9JRCAweDA2CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fQURDX01BU0sJMHgxZgorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX0FEQ19JRAkJMHgxNgorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX0JST0FEQ0FTVDJfTUFTSyAweDBmCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fQlJPQURDQVNUMl9JRAkweDBlCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fTEFTRVJPUFRfTUFTSwkweDA3CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fTEFTRVJPUFRfSUQJMHgwMQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX01VU0lDQUxfTUFTSwkweDA3CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fTVVTSUNBTF9JRAkweDA1CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fTUFHTkVUSUNfTUFTSwkweDA3CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fTUFHTkVUSUNfSUQJMHgwMworI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX0lFQzkwOF9DRAkoU05EX1BDTV9BRVMxX0NPTl9MQVNFUk9QVF9JRHwweDAwKQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX05PTl9JRUM5MDhfQ0QJKFNORF9QQ01fQUVTMV9DT05fTEFTRVJPUFRfSUR8MHgwOCkKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9QQ01fQ09ERVIJKFNORF9QQ01fQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDAwKQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX1NBTVBMRVIJKFNORF9QQ01fQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDIwKQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX01JWEVSCQkoU05EX1BDTV9BRVMxX0NPTl9ESUdESUdDT05WX0lEfDB4MTApCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fUkFURV9DT05WRVJURVIJKFNORF9QQ01fQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDE4KQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX1NZTlRIRVNJWkVSCShTTkRfUENNX0FFUzFfQ09OX01VU0lDQUxfSUR8MHgwMCkKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9NSUNST1BIT05FCShTTkRfUENNX0FFUzFfQ09OX01VU0lDQUxfSUR8MHgwOCkKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9EQVQJCShTTkRfUENNX0FFUzFfQ09OX01BR05FVElDX0lEfDB4MDApCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fVkNSCQkoU05EX1BDTV9BRVMxX0NPTl9NQUdORVRJQ19JRHwweDA4KQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX09SSUdJTkFMCSgxPDw3KQkvKiB0aGlzIGJpdHMgZGVwZW5kcyBvbiB0aGUgY2F0ZWdvcnkgY29kZSAqLworI2RlZmluZSBTTkRfUENNX0FFUzJfUFJPX1NCSVRTCQkoNzw8MCkJLyogbWFzayAtIHNhbXBsZSBiaXRzICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9QUk9fU0JJVFNfMjAJKDI8PDApCS8qIDIwLWJpdCAtIGNvb3JkaW5hdGlvbiAqLworI2RlZmluZSBTTkRfUENNX0FFUzJfUFJPX1NCSVRTXzI0CSg0PDwwKQkvKiAyNC1iaXQgLSBtYWluIGF1ZGlvICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9QUk9fU0JJVFNfVURFRgkoNjw8MCkJLyogdXNlciBkZWZpbmVkIGFwcGxpY2F0aW9uICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9QUk9fV09SRExFTgkoNzw8MykJLyogbWFzayAtIHNvdXJjZSB3b3JkIGxlbmd0aCAqLworI2RlZmluZSBTTkRfUENNX0FFUzJfUFJPX1dPUkRMRU5fTk9USUQJKDA8PDMpCS8qIG5vdCBpbmRpY2F0ZWQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMyX1BST19XT1JETEVOXzIyXzE4CSgyPDwzKQkvKiAyMi1iaXQgb3IgMTgtYml0ICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9QUk9fV09SRExFTl8yM18xOQkoNDw8MykJLyogMjMtYml0IG9yIDE5LWJpdCAqLworI2RlZmluZSBTTkRfUENNX0FFUzJfUFJPX1dPUkRMRU5fMjRfMjAJKDU8PDMpCS8qIDI0LWJpdCBvciAyMC1iaXQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMyX1BST19XT1JETEVOXzIwXzE2CSg2PDwzKQkvKiAyMC1iaXQgb3IgMTYtYml0ICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9DT05fU09VUkNFCQkoMTU8PDApCS8qIG1hc2sgLSBzb3VyY2UgbnVtYmVyICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9DT05fU09VUkNFX1VOU1BFQwkoMDw8MCkJLyogdW5zcGVjaWZpZWQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMyX0NPTl9DSEFOTkVMCSgxNTw8NCkJLyogbWFzayAtIGNoYW5uZWwgbnVtYmVyICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9DT05fQ0hBTk5FTF9VTlNQRUMJKDA8PDQpCS8qIHVuc3BlY2lmaWVkICovCisjZGVmaW5lIFNORF9QQ01fQUVTM19DT05fRlMJCSgxNTw8MCkJLyogbWFzayAtIHNhbXBsZSBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMzX0NPTl9GU180NDEwMAkoMDw8MCkJLyogNDQuMWtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzNfQ09OX0ZTXzQ4MDAwCSgyPDwwKQkvKiA0OGtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzNfQ09OX0ZTXzMyMDAwCSgzPDwwKQkvKiAzMmtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzNfQ09OX0NMT0NLCQkoMzw8NCkJLyogbWFzayAtIGNsb2NrIGFjY3VyYWN5ICovCisjZGVmaW5lIFNORF9QQ01fQUVTM19DT05fQ0xPQ0tfMTAwMFBQTQkoMDw8NCkJLyogMTAwMCBwcG0gKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMzX0NPTl9DTE9DS181MFBQTQkoMTw8NCkJLyogNTAgcHBtICovCisjZGVmaW5lIFNORF9QQ01fQUVTM19DT05fQ0xPQ0tfVkFSSUFCTEUJKDI8PDQpCS8qIHZhcmlhYmxlIHBpdGNoICovCisKKy8qCisgKiBVc2VyIGludGVyZmFjZQorICovCisKKy8qCisgKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMKKyAqIHdhaXRpbmcgdG8gYmUgY29waWVkIHRvIHRoZSB1c2VyJ3MgYnVmZmVyLiAgaXQgaXMgZmlsbGVkIGJ5IHRoZSBkbWEKKyAqIG1hY2hpbmUgYW5kIGRyYWluZWQgYnkgdGhpcyBsb29wLgorICovCitzdGF0aWMgc3NpemVfdAoreW1mX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB5bWZfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHltZl9kbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+cnBjbS5kbWFidWY7CisJc3RydWN0IHltZl91bml0ICp1bml0ID0gc3RhdGUtPnVuaXQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdGEsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN3cHRyOworCWludCBjbnQ7CQkJLyogVGhpcyBtYW55IHRvIGdvIGluIHRoaXMgcmV2b2x1dGlvbiAqLworCisJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDEpKSkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSAwOworCisJYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXRhKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCWlmICh1bml0LT5zdXNwZW5kZWQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KSByZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJc3dwdHIgPSBkbWFidWYtPnN3cHRyOworCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCBjbnQpCisJCQljbnQgPSBkbWFidWYtPmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCXVuc2lnbmVkIGxvbmcgdG1vOworCQkJLyogYnVmZmVyIGlzIGVtcHR5LCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kIHdhaXQgZm9yIGRhdGEgdG8gYmUKKwkJCSAgIHJlY29yZGVkICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQlpZiAoIXN0YXRlLT5ycGNtLnJ1bm5pbmcpIHsKKwkJCQl5bWZfY2FwdHVyZV90cmlnZ2VyKHN0YXRlLT51bml0LCAmc3RhdGUtPnJwY20sIDEpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkgcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFRoaXMgaXNudCBzdHJpY3RseSByaWdodCBmb3IgdGhlIDgxMCAgYnV0IGl0J2xsIGRvICovCisJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gKHN0YXRlLT5mb3JtYXQucmF0ZSAqIDIpOworCQkJdG1vID4+PSBzdGF0ZS0+Zm9ybWF0LnNoaWZ0OworCQkJLyogVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zIHdoZW4gc2xlZXBfb25fdGltZW91dCByZXR1cm5zLCBvbmUgaXMgd2hlbgorCQkJICAgdGhlIGludGVycnVwdCBpcyBzZXJ2aWNlZCBjb3JyZWN0bHkgYW5kIHRoZSBwcm9jZXNzIGlzIHdha2VkIHVwIGJ5CisJCQkgICBJU1IgT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggbWVhbnMgdGhhdAorCQkJICAgZWl0aGVyIGludGVycnVwdCBpcyBOT1Qgc2VydmljZWQgY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQKKwkJCSAgIGlzIFRPTyBMQVRFIGZvciB0aGUgcHJvY2VzcyB0byBiZSBzY2hlZHVsZWQgdG8gcnVuIChzY2hlZHVsZXIgbGF0ZW5jeSkKKwkJCSAgIHdoaWNoIHJlc3VsdHMgaW4gYSAocG90ZW50aWFsKSBidWZmZXIgb3ZlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcworCQkJICAgTk9USElORyB3ZSBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KKwkJCXRtbyA9IHNjaGVkdWxlX3RpbWVvdXQodG1vKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAodG1vID09IDAgJiYgZG1hYnVmLT5jb3VudCA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2klZDogcmVjb3JkaW5nIHNjaGVkdWxlIHRpbWVvdXQsICIKKwkJCQkgICAgImRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKKwkJCQkgICAgc3RhdGUtPnVuaXQtPmRldl9hdWRpbywKKwkJCQkgICAgZG1hYnVmLT5kbWFzaXplLCBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmNvdW50LAorCQkJCSAgICBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpIHJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIGNudCkpIHsKKwkJCWlmICghcmV0KSByZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBkbWFidWYtPmRtYXNpemU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCWlmICh1bml0LT5zdXNwZW5kZWQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKKwkJZG1hYnVmLT5jb3VudCAtPSBjbnQ7CisJCS8vIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQkvLyBzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCFzdGF0ZS0+cnBjbS5ydW5uaW5nKSB7CisJCQl5bWZfY2FwdHVyZV90cmlnZ2VyKHVuaXQsICZzdGF0ZS0+cnBjbSwgMSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK3ltZl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHltZl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwlzdHJ1Y3QgeW1mX3VuaXQgKnVuaXQgPSBzdGF0ZS0+dW5pdDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0YSwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgc3dwdHI7CisJaW50IGNudDsJCQkvKiBUaGlzIG1hbnkgdG8gZ28gaW4gdGhpcyByZXZvbHV0aW9uICovCisJaW50IHJlZHpvbmU7CisJaW50IGRlbGF5OworCisJWU1GREJHVygieW1mX3dyaXRlOiBjb3VudCAlZFxuIiwgY291bnQpOworCisJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSAwOworCisJLyoKKwkgKiBBbGFuJ3MgY3M0Nnh4IHdvcmtzIHdpdGhvdXQgYSByZWQgem9uZSAtIG1hcnZlbCBvZiBpbmdlbnVpdHkuCisJICogV2UgYXJlIG5vdCBzbyBicmlsbGlhbnQuLi4gUmVkIHpvbmUgZG9lcyB0d28gdGhpbmdzOgorCSAqICAxLiBhbGxvd3MgZm9yIHNhZmUgc3RhcnQgYWZ0ZXIgYSBwYXVzZSBhcyB3ZSBoYXZlIG5vIHdheQorCSAqICAgICB0byBrbm93IHdoYXQgdGhlIGFjdHVhbCwgcmVsZW50bGVzc2x5IGFkdmFuY2luZywgaHdwdHIgaXMuCisJICogIDIuIG1ha2VzIGNvbXB1dGF0aW9ucyBpbiB5bWZfcGNtX2ludGVycnVwdCBzaW1wbGVyLgorCSAqLworCXJlZHpvbmUgPSB5bWZfY2FsY19sZW5kKHN0YXRlLT5mb3JtYXQucmF0ZSkgPDwgc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwlyZWR6b25lICo9IDM7CS8qIDIgcmVkem9uZSArIDEgcG9zc2libGUgdW5jZXJ0YWludHkgcmVzZXJ2ZS4gKi8KKworCWFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0YSk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQlpZiAodW5pdC0+c3VzcGVuZGVkKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJc2NoZWR1bGUoKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkgcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChkbWFidWYtPmNvdW50IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAieW1mX3dyaXRlOiBjb3VudCAlZCwgd2FzIGxlZ2FsIGluIGNzNDZ4eFxuIiwKKwkJCSAgICBkbWFidWYtPmNvdW50KTsKKwkJCWRtYWJ1Zi0+Y291bnQgPSAwOworCQl9CisJCWlmIChkbWFidWYtPmNvdW50ID09IDApIHsKKwkJCXN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwkJCWlmIChzdGF0ZS0+d3BjbS5ydW5uaW5nKSB7CisJCQkJLyoKKwkJCQkgKiBBZGQgdW5jZXJ0YWludHkgcmVzZXJ2ZS4KKwkJCQkgKi8KKwkJCQljbnQgPSB5bWZfY2FsY19sZW5kKHN0YXRlLT5mb3JtYXQucmF0ZSk7CisJCQkJY250IDw8PSBzdGF0ZS0+Zm9ybWF0LnNoaWZ0OworCQkJCWlmICgoc3dwdHIgKz0gY250KSA+PSBkbWFidWYtPmRtYXNpemUpIHsKKwkJCQkJc3dwdHIgLT0gZG1hYnVmLT5kbWFzaXplOworCQkJCX0KKwkJCX0KKwkJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBYWFggVGhpcyBpcyBub3QgcmlnaHQgaWYgZG1hYnVmLT5jb3VudCBpcyBzbWFsbCAtCisJCQkgKiBhYm91dCAyKnggZnJhbWUgc2l6ZSBvciBsZXNzLiBXZSBjYW5ub3QgY291bnQgb24KKwkJCSAqIG9uIGFwcGVuZGluZyBhbmQgbm90IGNhdXNpbmcgYW4gYXJ0ZWZhY3QuCisJCQkgKiBTaG91bGQgdXNlIGEgdmFyaWF0aW9uIG9mIHRoZSBjb3VudD09MCBjYXNlIGFib3ZlLgorCQkJICovCisJCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisJCX0KKwkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisJCWlmIChkbWFidWYtPmNvdW50ICsgY250ID4gZG1hYnVmLT5kbWFzaXplIC0gcmVkem9uZSkKKwkJCWNudCA9IChkbWFidWYtPmRtYXNpemUgLSByZWR6b25lKSAtIGRtYWJ1Zi0+Y291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJWU1GREJHVygieW1mX3dyaXRlOiBmdWxsLCBjb3VudCAlZCBzd3B0ciAlZFxuIiwKKwkJCSAgIGRtYWJ1Zi0+Y291bnQsIGRtYWJ1Zi0+c3dwdHIpOworCQkJLyoKKwkJCSAqIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kCisJCQkgKiB3YWl0IGZvciBkYXRhIHRvIGJlIHBsYXllZAorCQkJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCWlmICghc3RhdGUtPndwY20ucnVubmluZykgeworCQkJCXltZl9wbGF5YmFja190cmlnZ2VyKHVuaXQsICZzdGF0ZS0+d3BjbSwgMSk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpIHJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KSByZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkgcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChzd3B0ciArPSBjbnQpID49IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQkJc3dwdHIgLT0gZG1hYnVmLT5kbWFzaXplOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCWlmICh1bml0LT5zdXNwZW5kZWQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CisJCWRtYWJ1Zi0+Y291bnQgKz0gY250OworCisJCS8qCisJCSAqIFN0YXJ0IGhlcmUgaXMgYSBiYWQgaWRlYSAtIG1heSBjYXVzZSBzdGFydHVwIGNsaWNrCisJCSAqIGluIC9iaW4vcGxheSB3aGVuIGRtYWJ1ZiBpcyBub3QgZnVsbCB5ZXQuCisJCSAqIEhvd2V2ZXIsIHNvbWUgYnJva2VuIGFwcGxpY2F0aW9ucyBkbyBub3QgbWFrZQorCQkgKiBhbnkgdXNlIG9mIFNORENUTF9EU1BfU1lOQyAoRG9vbSBpcyB0aGUgd29yc3QpLgorCQkgKiBPbmUgZnJhbWUgaXMgYWJvdXQgNS4zbXMsIERvb20gd3JpdGUgc2l6ZSBpcyA0Nm1zLgorCQkgKi8KKwkJZGVsYXkgPSBzdGF0ZS0+Zm9ybWF0LnJhdGUgLyAyMDsJLyogNTBtcyAqLworCQlkZWxheSA8PD0gc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gZGVsYXkgJiYgIXN0YXRlLT53cGNtLnJ1bm5pbmcpIHsKKwkJCXltZl9wbGF5YmFja190cmlnZ2VyKHVuaXQsICZzdGF0ZS0+d3BjbSwgMSk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0YSk7CisKKwlZTUZEQkdXKCJ5bWZfd3JpdGU6IHJldCAlZCBkbWFidWYuY291bnQgJWRcbiIsIHJldCwgZG1hYnVmLT5jb3VudCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB5bWZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB5bWZfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHltZl9kbWFidWYgKmRtYWJ1ZjsKKwlpbnQgcmVkem9uZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcG9sbF93YWl0KGZpbGUsICZzdGF0ZS0+d3BjbS5kbWFidWYud2FpdCwgd2FpdCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXBvbGxfd2FpdChmaWxlLCAmc3RhdGUtPnJwY20uZG1hYnVmLndhaXQsIHdhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWRtYWJ1ZiA9ICZzdGF0ZS0+cnBjbS5kbWFidWY7CisJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXJlZHpvbmUgPSB5bWZfY2FsY19sZW5kKHN0YXRlLT5mb3JtYXQucmF0ZSk7CisJCXJlZHpvbmUgPDw9IHN0YXRlLT5mb3JtYXQuc2hpZnQ7CisJCXJlZHpvbmUgKj0gMzsKKworCQlkbWFidWYgPSAmc3RhdGUtPndwY20uZG1hYnVmOworCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIERvbid0IHNlbGVjdCB1bmxlc3MgYSBmdWxsIGZyYWdtZW50IGlzIGF2YWlsYWJsZS4KKwkJCSAqIE90aGVyd2lzZSBhcnRzZCBkb2VzIEdFVE9TUEFDRSwgc2VlcyAwLCBhbmQgbG9vcHMuCisJCQkgKi8KKwkJCWlmIChkbWFidWYtPmNvdW50ICsgcmVkem9uZSArIGRtYWJ1Zi0+ZnJhZ3NpemUKKwkJCSAgICAgPD0gZG1hYnVmLT5kbWFzaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCB5bWZfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHltZl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpICE9IDApCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpICE9IDApCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodm1hLT52bV9wZ29mZiAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZpcnRfdG9fcGh5cyhkbWFidWYtPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlkbWFidWYtPm1hcHBlZCA9IDE7CisKKy8qIFAzICovIHByaW50ayhLRVJOX0lORk8gInltZnBjaTogdXNpbmcgbWVtb3J5IG1hcHBlZCBzb3VuZCwgdW50ZXN0ZWQhXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB5bWZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHltZl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiAqZG1hYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYXVkaW9fYnVmX2luZm8gYWJpbmZvOworCWNvdW50X2luZm8gY2luZm87CisJaW50IHJlZHpvbmU7CisJaW50IHZhbDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChHRVRWRVIpIGFyZyAweCVseFxuIiwgY21kLCBhcmcpOworCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoUkVTRVQpXG4iLCBjbWQpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXltZl93YWl0X2RhYyhzdGF0ZSk7CisJCQlkbWFidWYgPSAmc3RhdGUtPndwY20uZG1hYnVmOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQl5bWZfc3RvcF9hZGMoc3RhdGUpOworCQkJZG1hYnVmID0gJnN0YXRlLT5ycGNtLmRtYWJ1ZjsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KFNZTkMpXG4iLCBjbWQpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+d3BjbS5kbWFidWY7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJaWYgKGRtYWJ1Zi0+Y291bnQgIT0gMCAmJiAhc3RhdGUtPndwY20ucnVubmluZykgeworCQkJCQl5bWZfc3RhcnRfZGFjKHN0YXRlKTsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQl9IGVsc2UgeworCQkJCXltZl93YWl0X2RhYyhzdGF0ZSk7CisJCQl9CisJCX0KKwkJLyogWFhYIFdoYXQgZG9lcyB0aGlzIGRvIGZvciByZWFkaW5nPyBkbWFidWYtPmNvdW50PTA7ID8gKi8KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6IC8qIHNldCBzbWFwbGUgcmF0ZSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KFNQRUVEKSBzcCAlZFxuIiwgY21kLCB2YWwpOworCQlpZiAodmFsID49IDgwMDAgJiYgdmFsIDw9IDQ4MDAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQl5bWZfd2FpdF9kYWMoc3RhdGUpOworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+d3BjbS5kbWFidWY7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCXN0YXRlLT5mb3JtYXQucmF0ZSA9IHZhbDsKKwkJCQl5bWZfcGNtX3VwZGF0ZV9zaGlmdCgmc3RhdGUtPmZvcm1hdCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXltZl9zdG9wX2FkYyhzdGF0ZSk7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5ycGNtLmRtYWJ1ZjsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJc3RhdGUtPmZvcm1hdC5yYXRlID0gdmFsOworCQkJCXltZl9wY21fdXBkYXRlX3NoaWZ0KCZzdGF0ZS0+Zm9ybWF0KTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoc3RhdGUtPmZvcm1hdC5yYXRlLCBwKTsKKworCS8qCisJICogT1NTIG1hbnVhbCBkb2VzIG5vdCBtZW50aW9uIFNORENUTF9EU1BfU1RFUkVPIGF0IGFsbC4KKwkgKiBBbGwgY2hhbm5lbHMgYXJlIG1vbm8gYW5kIGlmIHlvdSB3YW50IHN0ZXJlbywgeW91CisJICogcGxheSBpbnRvIHR3byBjaGFubmVscyB3aXRoIFNORENUTF9EU1BfQ0hBTk5FTFMuCisJICogSG93ZXZlciwgbXBnMTIzIGNhbGxzIGl0LiBJIHdvbmRlciwgd2h5IE1pY2hhZWwgSGlwcCB1c2VkIGl0LgorCSAqLworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86IC8qIHNldCBzdGVyZW8gb3IgbW9ubyBjaGFubmVsICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoU1RFUkVPKSBzdCAlZFxuIiwgY21kLCB2YWwpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXltZl93YWl0X2RhYyhzdGF0ZSk7IAorCQkJZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJc3RhdGUtPmZvcm1hdC52b2ljZXMgPSB2YWwgPyAyIDogMTsKKwkJCXltZl9wY21fdXBkYXRlX3NoaWZ0KCZzdGF0ZS0+Zm9ybWF0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQl5bWZfc3RvcF9hZGMoc3RhdGUpOworCQkJZG1hYnVmID0gJnN0YXRlLT5ycGNtLmRtYWJ1ZjsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJc3RhdGUtPmZvcm1hdC52b2ljZXMgPSB2YWwgPyAyIDogMTsKKwkJCXltZl9wY21fdXBkYXRlX3NoaWZ0KCZzdGF0ZS0+Zm9ybWF0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoR0VUQkxLKVxuIiwgY21kKTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkpCisJCQkJcmV0dXJuIHZhbDsKKwkJCXZhbCA9IHN0YXRlLT53cGNtLmRtYWJ1Zi5mcmFnc2l6ZTsKKwkJCVlNRkRCR1goInltZl9pb2N0bDogR0VUQkxLIHcgJWRcbiIsIHZhbCk7CisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpKQorCQkJCXJldHVybiB2YWw7CisJCQl2YWwgPSBzdGF0ZS0+cnBjbS5kbWFidWYuZnJhZ3NpemU7CisJCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IEdFVEJMSyByICVkXG4iLCB2YWwpOworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgb2Ygc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQqLworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KEdFVEZNVFMpXG4iLCBjbWQpOworCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9VOCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3Qgc2FtcGxlIGZvcm1hdCAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KFNFVEZNVCkgZm10ICVkXG4iLCBjbWQsIHZhbCk7CisJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUgfHwgdmFsID09IEFGTVRfVTgpIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXltZl93YWl0X2RhYyhzdGF0ZSk7CisJCQkJZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJc3RhdGUtPmZvcm1hdC5mb3JtYXQgPSB2YWw7CisJCQkJeW1mX3BjbV91cGRhdGVfc2hpZnQoJnN0YXRlLT5mb3JtYXQpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQl5bWZfc3RvcF9hZGMoc3RhdGUpOworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+cnBjbS5kbWFidWY7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCXN0YXRlLT5mb3JtYXQuZm9ybWF0ID0gdmFsOworCQkJCXltZl9wY21fdXBkYXRlX3NoaWZ0KCZzdGF0ZS0+Zm9ybWF0KTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoc3RhdGUtPmZvcm1hdC5mb3JtYXQsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KENIQU4pIGNoICVkXG4iLCBjbWQsIHZhbCk7CisJCWlmICh2YWwgIT0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJeW1mX3dhaXRfZGFjKHN0YXRlKTsKKwkJCQlpZiAodmFsID09IDEgfHwgdmFsID09IDIpIHsKKwkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJCQlkbWFidWYgPSAmc3RhdGUtPndwY20uZG1hYnVmOworCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQkJc3RhdGUtPmZvcm1hdC52b2ljZXMgPSB2YWw7CisJCQkJCXltZl9wY21fdXBkYXRlX3NoaWZ0KCZzdGF0ZS0+Zm9ybWF0KTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJfQorCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQl5bWZfc3RvcF9hZGMoc3RhdGUpOworCQkJCWlmICh2YWwgPT0gMSB8fCB2YWwgPT0gMikgeworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+cnBjbS5kbWFidWY7CisJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCQlzdGF0ZS0+Zm9ybWF0LnZvaWNlcyA9IHZhbDsKKwkJCQkJeW1mX3BjbV91cGRhdGVfc2hpZnQoJnN0YXRlLT5mb3JtYXQpOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHN0YXRlLT5mb3JtYXQudm9pY2VzLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KFBPU1QpXG4iLCBjbWQpOworCQkvKgorCQkgKiBRdW90aW5nIE9TUyBQRzoKKwkJICogICAgVGhlIGlvY3RsIFNORENUTF9EU1BfUE9TVCBpcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gb2YKKwkJICogICAgU05EQ1RMX0RTUF9TWU5DLiBJdCBqdXN0IHRlbGxzIHRvIHRoZSBkcml2ZXIgdGhhdCB0aGVyZQorCQkgKiAgICBpcyBsaWtlbHkgdG8gYmUgYSBwYXVzZSBpbiB0aGUgb3V0cHV0LiBUaGlzIG1ha2VzIGl0CisJCSAqICAgIHBvc3NpYmxlIGZvciB0aGUgZGV2aWNlIHRvIGhhbmRsZSB0aGUgcGF1c2UgbW9yZQorCQkgKiAgICBpbnRlbGxpZ2VudGx5LiBUaGlzIGlvY3RsIGRvZXNuJ3QgYmxvY2sgdGhlIGFwcGxpY2F0aW9uLgorCQkgKgorCQkgKiBUaGUgcGFyYWdyYXBoIGFib3ZlIGlzIGEgY2x1bXN5IHdheSB0byBzYXkgImZsdXNoIGlvY3RsIi4KKwkJICogVGhpcyBpb2N0bCBpcyB1c2VkIGJ5IG1wZzEyMy4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHN0YXRlLT53cGNtLmRtYWJ1Zi5jb3VudCAhPSAwICYmICFzdGF0ZS0+d3BjbS5ydW5uaW5nKSB7CisJCQl5bWZfc3RhcnRfZGFjKHN0YXRlKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoU0VURlJBRykgZnIgMHglMDR4OiUwNHgoJWQ6JWQpXG4iLAorCQkgICAgY21kLAorCQkgICAgKHZhbCA+PiAxNikgJiAweEZGRkYsIHZhbCAmIDB4RkZGRiwKKwkJICAgICh2YWwgPj4gMTYpICYgMHhGRkZGLCB2YWwgJiAweEZGRkYpOworCQlkbWFidWYgPSAmc3RhdGUtPndwY20uZG1hYnVmOworCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJZG1hYnVmLT5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQgPCA0KQorCQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSA0OworCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMTU7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChHRVRPU1BBQ0UpXG4iLCBjbWQpOworCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlyZWR6b25lID0geW1mX2NhbGNfbGVuZChzdGF0ZS0+Zm9ybWF0LnJhdGUpOworCQlyZWR6b25lIDw8PSBzdGF0ZS0+Zm9ybWF0LnNoaWZ0OworCQlyZWR6b25lICo9IDM7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT5mcmFnc2l6ZTsKKwkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudCAtIHJlZHpvbmU7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoR0VUSVNQQUNFKVxuIiwgY21kKTsKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG1hYnVmID0gJnN0YXRlLT5ycGNtLmRtYWJ1ZjsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IGRtYWJ1Zi0+ZnJhZ3NpemU7CisJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+Y291bnQ7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChOT05CTE9DSylcbiIsIGNtZCk7CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChHRVRDQVBTKVxuIiwgY21kKTsKKwkJLyogcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUV8RFNQX0NBUF9UUklHR0VSfERTUF9DQVBfTU1BUCwKKwkJCSAgICBwKTsgKi8KKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoR0VUSVBUUilcbiIsIGNtZCk7CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRtYWJ1ZiA9ICZzdGF0ZS0+cnBjbS5kbWFidWY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOworCQljaW5mby5ibG9ja3MgPSBkbWFidWYtPmNvdW50ID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBHRVRJUFRSIHB0ciAlZCBieXRlcyAlZFxuIiwKKwkJICAgIGNpbmZvLnB0ciwgY2luZm8uYnl0ZXMpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KEdFVE9QVFIpXG4iLCBjbWQpOworCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXM7CisJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CisJCWNpbmZvLnB0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IEdFVE9QVFIgcHRyICVkIGJ5dGVzICVkXG4iLAorCQkgICAgY2luZm8ucHRyLCBjaW5mby5ieXRlcyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChTRVREVVBMRVgpXG4iLCBjbWQpOworCQlyZXR1cm4gMDsJCS8qIEFsd2F5cyBkdXBsZXggKi8KKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChSRUFEX1JBVEUpXG4iLCBjbWQpOworCQlyZXR1cm4gcHV0X3VzZXIoc3RhdGUtPmZvcm1hdC5yYXRlLCBwKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoUkVBRF9DSClcbiIsIGNtZCk7CisJCXJldHVybiBwdXRfdXNlcihzdGF0ZS0+Zm9ybWF0LnZvaWNlcywgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoUkVBRF9CSVRTKVxuIiwgY21kKTsKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKKwljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4IHVuc3VwcG9ydGVkXG4iLCBjbWQpOworCQlyZXR1cm4gLUVOT1RUWTsKKworCWRlZmF1bHQ6CisJCS8qCisJCSAqIFNvbWUgcHJvZ3JhbXMgbWl4IHVwIGF1ZGlvIGRldmljZXMgYW5kIGlvY3RscworCQkgKiBvciBwZXJoYXBzIHRoZXkgZXhwZWN0ICJ1bml2ZXJzYWwiIGlvY3RscywKKwkJICogZm9yIGluc3RhbmNlIHdlIGdldCBTTkRDVExfVE1SX0NPTlRJTlVFIGhlcmUuCisJCSAqIChtcGcxMjMgLWcgMTAwIGVuZHMgaGVyZSB0b28gLSB0byBiZSBmaXhlZC4pCisJCSAqLworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4IHVua25vd25cbiIsIGNtZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVOT1RUWTsKK30KKworLyoKKyAqIG9wZW4oMikKKyAqIFdlIHVzZSB1cHBlciBwYXJ0IG9mIHRoZSBtaW5vciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHNvdW5kY2FyZHMuCisgKiBDaGFubmVscyBhcmUgb3BlbmVkIHdpdGggYSBjbG9uZSBvcGVuLgorICovCitzdGF0aWMgaW50IHltZl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJeW1mcGNpX3QgKnVuaXQgPSBOVUxMOworCWludCBtaW5vcjsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKwlpbnQgZXJyOworCisJbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWlmICgobWlub3IgJiAweDBGKSA9PSAzKSB7CS8qIC9kZXYvZHNwTiAqLworCQk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwl1bml0ID0gTlVMTDsJLyogZ2NjIHdhcm5zICovCisJc3Bpbl9sb2NrKCZ5bWZfZGV2c19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZ5bWZfZGV2cykgeworCQl1bml0ID0gbGlzdF9lbnRyeShsaXN0LCB5bWZwY2lfdCwgeW1mX2RldnMpOworCQlpZiAoKCh1bml0LT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHgwRikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmeW1mX2RldnNfbG9jayk7CisJaWYgKHVuaXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkb3duKCZ1bml0LT5vcGVuX3NlbSk7CisKKwlpZiAoKHN0YXRlID0geW1mX3N0YXRlX2FsbG9jKHVuaXQpKSA9PSBOVUxMKSB7CisJCXVwKCZ1bml0LT5vcGVuX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlsaXN0X2FkZF90YWlsKCZzdGF0ZS0+Y2hhaW4sICZ1bml0LT5zdGF0ZXMpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gc3RhdGU7CisKKwkvKgorCSAqIHltZl9yZWFkIGFuZCB5bWZfd3JpdGUgdGhhdCB3ZSBib3Jyb3dlZCBmcm9tIGNzNDZ4eAorCSAqIGFsbG9jYXRlIGJ1ZmZlcnMgd2l0aCBwcm9nX2RtYWJ1ZigpLiBXZSBjYWxsIHByb2dfZG1hYnVmCisJICogaGVyZSBzbyB0aGF0IGluIGNhc2Ugb2YgRE1BIG1lbW9yeSBleGhhdXN0aW9uIG9wZW4KKwkgKiBmYWlscyByYXRoZXIgdGhhbiB3cml0ZS4KKwkgKgorCSAqIFhYWCBwcm9nX2RtYWJ1ZiBhbGxvY2F0ZXMgdm9pY2UuIFNob3VsZCBhbGxvY2F0ZSBleHBsaWNpdGx5LCBhYm92ZS4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCFzdGF0ZS0+d3BjbS5kbWFidWYucmVhZHkpIHsKKwkJCWlmICgoZXJyID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSAhPSAwKSB7CisJCQkJZ290byBvdXRfbm9kbWE7CisJCQl9CisJCX0KKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFzdGF0ZS0+cnBjbS5kbWFidWYucmVhZHkpIHsKKwkJCWlmICgoZXJyID0gcHJvZ19kbWFidWYoc3RhdGUsIDEpKSAhPSAwKSB7CisJCQkJZ290byBvdXRfbm9kbWE7CisJCQl9CisJCX0KKwl9CisKKyNpZiAwIC8qIHRlc3QgaWYgaW50ZXJydXB0cyB3b3JrICovCisJeW1mcGNpX3dyaXRldyh1bml0LCBZRFNYR1JfVElNRVJDT1VOVCwgMHhmZmZlKTsJLyogfiA2ODBtcyAqLworCXltZnBjaV93cml0ZWIodW5pdCwgWURTWEdSX1RJTUVSQ1RSTCwKKwkgICAgKFlEU1hHUl9USU1FUkNUUkxfVEVOfFlEU1hHUl9USU1FUkNUUkxfVElFTikpOworI2VuZGlmCisJdXAoJnVuaXQtPm9wZW5fc2VtKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKworb3V0X25vZG1hOgorCS8qCisJICogWFhYIEJyb2tlbiBjdXN0b206ICJnb3RvIG91dF94eHgiIGluIG90aGVyIHBsYWNlIGlzCisJICogYSBuZXN0YWJsZSBleGNlcHRpb24sIGJ1dCBoZXJlIGl0IGlzIG5vdCBuZXN0YWJsZSBkdWUgdG8gc2VtYXBob3JlLgorCSAqIFhYWCBEb3VidGZ1bCB0ZWNobmlxdWUgb2Ygc2VsZi1kZXNjcmliaW5nIG9iamVjdHMuLi4uCisJICovCisJZGVhbGxvY19kbWFidWYodW5pdCwgJnN0YXRlLT53cGNtLmRtYWJ1Zik7CisJZGVhbGxvY19kbWFidWYodW5pdCwgJnN0YXRlLT5ycGNtLmRtYWJ1Zik7CisJeW1mX3BjbV9mcmVlX3N1YnN0cmVhbSgmc3RhdGUtPndwY20pOworCXltZl9wY21fZnJlZV9zdWJzdHJlYW0oJnN0YXRlLT5ycGNtKTsKKworCWxpc3RfZGVsKCZzdGF0ZS0+Y2hhaW4pOworCWtmcmVlKHN0YXRlKTsKKworCXVwKCZ1bml0LT5vcGVuX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB5bWZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgeW1mX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXltZnBjaV90ICp1bml0ID0gc3RhdGUtPnVuaXQ7CisKKyNpZiAwIC8qIHRlc3QgaWYgaW50ZXJydXB0cyB3b3JrICovCisJeW1mcGNpX3dyaXRlYih1bml0LCBZRFNYR1JfVElNRVJDVFJMLCAwKTsKKyNlbmRpZgorCisJZG93bigmdW5pdC0+b3Blbl9zZW0pOworCisJLyoKKwkgKiBYWFggU29sdmUgdGhlIGNhc2Ugb2YgT19OT05CTE9DSyBjbG9zZSAtIGRvbid0IGRlYWxsb2NhdGUgaGVyZS4KKwkgKiBEZWFsbG9jYXRlIHdoZW4gdW5sb2FkaW5nIHRoZSBkcml2ZXIgYW5kIHdlIGNhbiB3YWl0LgorCSAqLworCXltZl93YWl0X2RhYyhzdGF0ZSk7CisJeW1mX3N0b3BfYWRjKHN0YXRlKTsJCS8qIGZvcnR1bmF0ZWx5LCBpdCdzIGltbWVkaWF0ZSAqLworCWRlYWxsb2NfZG1hYnVmKHVuaXQsICZzdGF0ZS0+d3BjbS5kbWFidWYpOworCWRlYWxsb2NfZG1hYnVmKHVuaXQsICZzdGF0ZS0+cnBjbS5kbWFidWYpOworCXltZl9wY21fZnJlZV9zdWJzdHJlYW0oJnN0YXRlLT53cGNtKTsKKwl5bWZfcGNtX2ZyZWVfc3Vic3RyZWFtKCZzdGF0ZS0+cnBjbSk7CisKKwlsaXN0X2RlbCgmc3RhdGUtPmNoYWluKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwkvKiBDYW4geW91IHRlbGwgSSBwcm9ncmFtbWVkIFNvbGFyaXMgKi8KKwlrZnJlZShzdGF0ZSk7CisKKwl1cCgmdW5pdC0+b3Blbl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNaXhlciBvcGVyYXRpb25zIGFyZSBiYXNlZCBvbiBjczQ2eHguCisgKi8KK3N0YXRpYyBpbnQgeW1mX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwl5bWZwY2lfdCAqdW5pdDsKKwlpbnQgaTsKKworCXNwaW5fbG9jaygmeW1mX2RldnNfbG9jayk7CisJbGlzdF9mb3JfZWFjaChsaXN0LCAmeW1mX2RldnMpIHsKKwkJdW5pdCA9IGxpc3RfZW50cnkobGlzdCwgeW1mcGNpX3QsIHltZl9kZXZzKTsKKwkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykgeworCQkJaWYgKHVuaXQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJgorCQkJICAgIHVuaXQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlciA9PSBtaW5vcikgeworCQkJCXNwaW5fdW5sb2NrKCZ5bWZfZGV2c19sb2NrKTsKKwkJCQlnb3RvIG1hdGNoOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ5bWZfZGV2c19sb2NrKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworIG1hdGNoOgorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHVuaXQtPmFjOTdfY29kZWNbaV07CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgeW1mX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgeW1mX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeW1mX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHltZl9yZWFkLAorCS53cml0ZQkJPSB5bWZfd3JpdGUsCisJLnBvbGwJCT0geW1mX3BvbGwsCisJLmlvY3RsCQk9IHltZl9pb2N0bCwKKwkubW1hcAkJPSB5bWZfbW1hcCwKKwkub3BlbgkJPSB5bWZfb3BlbiwKKwkucmVsZWFzZQk9IHltZl9yZWxlYXNlLAorfTsKKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHltZl9taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0geW1mX2lvY3RsX21peGRldiwKKwkub3BlbgkJPSB5bWZfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSB5bWZfcmVsZWFzZV9taXhkZXYsCit9OworCisvKgorICovCisKK3N0YXRpYyBpbnQgeW1mX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgcG1fbWVzc2FnZV90IHVudXNlZCkKK3sKKwlzdHJ1Y3QgeW1mX3VuaXQgKnVuaXQgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB5bWZfZG1hYnVmICpkbWFidWY7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXVuaXQtPnN1c3BlbmRlZCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKSB7CisJCWlmICgoY29kZWMgPSB1bml0LT5hYzk3X2NvZGVjW2ldKSAhPSBOVUxMKQorCQkJYWM5N19zYXZlX3N0YXRlKGNvZGVjKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZ1bml0LT5zdGF0ZXMpIHsKKwkJc3RhdGUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB5bWZfc3RhdGUsIGNoYWluKTsKKworCQlkbWFidWYgPSAmc3RhdGUtPndwY20uZG1hYnVmOworCQlkbWFidWYtPmh3cHRyID0gZG1hYnVmLT5zd3B0ciA9IDA7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCQlkbWFidWYtPmNvdW50ID0gMDsKKworCQlkbWFidWYgPSAmc3RhdGUtPnJwY20uZG1hYnVmOworCQlkbWFidWYtPmh3cHRyID0gZG1hYnVmLT5zd3B0ciA9IDA7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCQlkbWFidWYtPmNvdW50ID0gMDsKKwl9CisKKwl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9OQVRJVkVEQUNPVVRWT0wsIDApOworCXltZnBjaV9kaXNhYmxlX2RzcCh1bml0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeW1mX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCXN0cnVjdCB5bWZfdW5pdCAqdW5pdCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CisJaW50IGk7CisKKwl5bWZwY2lfYWNsaW5rX3Jlc2V0KHVuaXQtPnBjaSk7CisJeW1mcGNpX2NvZGVjX3JlYWR5KHVuaXQsIDAsIDEpOwkJLyogcHJpbnRzIGRpYWcgaWYgbm90IHJlYWR5LiAqLworCisjaWZkZWYgQ09ORklHX1NPVU5EX1lNRlBDSV9MRUdBQ1kKKwkvKiBYWFggQXQgdGhpcyB0aW1lIHRoZSBsZWdhY3kgcmVnaXN0ZXJzIGFyZSBwcm9iYWJseSBkZXByb2dyYW1tZWQuICovCisjZW5kaWYKKworCXltZnBjaV9kb3dubG9hZF9pbWFnZSh1bml0KTsKKworCXltZl9tZW1sb2FkKHVuaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlpZiAodW5pdC0+c3RhcnRfY291bnQpIHsKKwkJeW1mcGNpX3dyaXRlbCh1bml0LCBZRFNYR1JfTU9ERSwgMyk7CisJCXVuaXQtPmFjdGl2ZV9iYW5rID0geW1mcGNpX3JlYWRsKHVuaXQsIFlEU1hHUl9DVFJMU0VMRUNUKSAmIDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykgeworCQlpZiAoKGNvZGVjID0gdW5pdC0+YWM5N19jb2RlY1tpXSkgIT0gTlVMTCkKKwkJCWFjOTdfcmVzdG9yZV9zdGF0ZShjb2RlYyk7CisJfQorCisJdW5pdC0+c3VzcGVuZGVkID0gMDsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ1bml0LT5zdGF0ZXMpIHsKKwkJc3RhdGUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB5bWZfc3RhdGUsIGNoYWluKTsKKwkJd2FrZV91cCgmc3RhdGUtPndwY20uZG1hYnVmLndhaXQpOworCQl3YWtlX3VwKCZzdGF0ZS0+cnBjbS5kbWFidWYud2FpdCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBpbml0aWFsaXphdGlvbiByb3V0aW5lcworICovCisKKyNpZmRlZiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWQorCitzdGF0aWMgaW50IHltZnBjaV9zZXR1cF9sZWdhY3koeW1mcGNpX3QgKnVuaXQsIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJaW50IHY7CisJaW50IG1wdWlvID0gLTEsIG9wbGlvID0gLTE7CisKKwlzd2l0Y2ggKHVuaXQtPmlvbWlkaSkgeworCWNhc2UgMHgzMzA6CisJCW1wdWlvID0gMDsKKwkJYnJlYWs7CisJY2FzZSAweDMwMDoKKwkJbXB1aW8gPSAxOworCQlicmVhazsKKwljYXNlIDB4MzMyOgorCQltcHVpbyA9IDI7CisJCWJyZWFrOworCWNhc2UgMHgzMzQ6CisJCW1wdWlvID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDogOworCX0KKworCXN3aXRjaCAodW5pdC0+aW9zeW50aCkgeworCWNhc2UgMHgzODg6CisJCW9wbGlvID0gMDsKKwkJYnJlYWs7CisJY2FzZSAweDM5ODoKKwkJb3BsaW8gPSAxOworCQlicmVhazsKKwljYXNlIDB4M2EwOgorCQlvcGxpbyA9IDI7CisJCWJyZWFrOworCWNhc2UgMHgzYTg6CisJCW9wbGlvID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDogOworCX0KKworCWlmIChtcHVpbyA+PSAwIHx8IG9wbGlvID49IDApIHsKKwkJLyogMHgwMDIwOiAxIC0gMTAgYml0cyBvZiBJL08gYWRkcmVzcyBkZWNvZGVkLCAwIC0gMTYgYml0cy4gKi8KKwkJdiA9IDB4MDAxZTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgUENJUl9MRUdDVFJMLCB2KTsKKworCQlzd2l0Y2ggKHBjaWRldi0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzI0OgorCQljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0MDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83MjRGOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0MEM6CisJCQl2ID0gMHg4ODAwOworCQkJaWYgKG1wdWlvID49IDApIHsgdiB8PSBtcHVpbzw8NDsgfQorCQkJaWYgKG9wbGlvID49IDApIHsgdiB8PSBvcGxpbzsgfQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgUENJUl9FTEVHQ1RSTCwgdik7CisJCQlicmVhazsKKworCQljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0NDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NTQ6CisJCQl2ID0gMHg4ODAwOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgUENJUl9FTEVHQ1RSTCwgdik7CisJCQlpZiAob3BsaW8gPj0gMCkgeworCQkJCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIFBDSVJfT1BMQURSLCB1bml0LT5pb3N5bnRoKTsKKwkJCX0KKwkJCWlmIChtcHVpbyA+PSAwKSB7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgUENJUl9NUFVBRFIsIHVuaXQtPmlvbWlkaSk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IFVua25vd24gZGV2aWNlIElEOiAweCV4XG4iLAorCQkJICAgIHBjaWRldi0+ZGV2aWNlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1NPVU5EX1lNRlBDSV9MRUdBQ1kgKi8KKworc3RhdGljIHZvaWQgeW1mcGNpX2FjbGlua19yZXNldChzdHJ1Y3QgcGNpX2RldiAqIHBjaSkKK3sKKwl1OCBjbWQ7CisKKwkvKgorCSAqIEluIHRoZSA3NDQsIDc1NCBvbmx5IDB4MDEgZXhpc3RzLCAweDAyIGlzIHVuZGVmaW5lZC4KKwkgKiBJdCBkb2VzIG5vdCBzZWVtIHRvIGh1cnQgdG8gdHJpcCBib3RoIHJlZ2FyZGxlc3Mgb2YgcmV2aXNpb24uCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lSX0RTWEdDVFJMLCAmY21kKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCBQQ0lSX0RTWEdDVFJMLCBjbWQgJiAweGZjKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCBQQ0lSX0RTWEdDVFJMLCBjbWQgfCAweDAzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCBQQ0lSX0RTWEdDVFJMLCBjbWQgJiAweGZjKTsKKworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIFBDSVJfRFNYUFdSQ1RSTDEsIDApOworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIFBDSVJfRFNYUFdSQ1RSTDIsIDApOworfQorCitzdGF0aWMgdm9pZCB5bWZwY2lfZW5hYmxlX2RzcCh5bWZwY2lfdCAqY29kZWMpCit7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX0NPTkZJRywgMHgwMDAwMDAwMSk7Cit9CisKK3N0YXRpYyB2b2lkIHltZnBjaV9kaXNhYmxlX2RzcCh5bWZwY2lfdCAqY29kZWMpCit7CisJdTMyIHZhbDsKKwlpbnQgdGltZW91dCA9IDEwMDA7CisKKwl2YWwgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9DT05GSUcpOworCWlmICh2YWwpCisJCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9DT05GSUcsIDB4MDAwMDAwMDApOworCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCXZhbCA9IHltZnBjaV9yZWFkbChjb2RlYywgWURTWEdSX1NUQVRVUyk7CisJCWlmICgodmFsICYgMHgwMDAwMDAwMikgPT0gMCkKKwkJCWJyZWFrOworCX0KK30KKworI2luY2x1ZGUgInltZnBjaV9pbWFnZS5oIgorCitzdGF0aWMgdm9pZCB5bWZwY2lfZG93bmxvYWRfaW1hZ2UoeW1mcGNpX3QgKmNvZGVjKQoreworCWludCBpLCB2ZXJfMWU7CisJdTE2IGN0cmw7CisKKwl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfTkFUSVZFREFDT1VUVk9MLCAweDAwMDAwMDAwKTsKKwl5bWZwY2lfZGlzYWJsZV9kc3AoY29kZWMpOworCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9NT0RFLCAweDAwMDEwMDAwKTsKKwl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfTU9ERSwgMHgwMDAwMDAwMCk7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX01BUE9GUkVDLCAweDAwMDAwMDAwKTsKKwl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfTUFQT0ZFRkZFQ1QsIDB4MDAwMDAwMDApOworCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9QTEFZQ1RSTEJBU0UsIDB4MDAwMDAwMDApOworCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9SRUNDVFJMQkFTRSwgMHgwMDAwMDAwMCk7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX0VGRkNUUkxCQVNFLCAweDAwMDAwMDAwKTsKKwljdHJsID0geW1mcGNpX3JlYWR3KGNvZGVjLCBZRFNYR1JfR0xPQkFMQ1RSTCk7CisJeW1mcGNpX3dyaXRldyhjb2RlYywgWURTWEdSX0dMT0JBTENUUkwsIGN0cmwgJiB+MHgwMDA3KTsKKworCS8qIHNldHVwIERTUCBpbnN0cnVjdGlvbiBjb2RlICovCisJZm9yIChpID0gMDsgaSA8IFlEU1hHX0RTUExFTkdUSCAvIDQ7IGkrKykKKwkJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX0RTUElOU1RSQU0gKyAoaSA8PCAyKSwgRHNwSW5zdFtpXSk7CisKKwlzd2l0Y2ggKGNvZGVjLT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzI0RjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0MEM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NDQ6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NTQ6CisJCXZlcl8xZSA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZlcl8xZSA9IDA7CisJfQorCisJaWYgKHZlcl8xZSkgeworCQkvKiBzZXR1cCBjb250cm9sIGluc3RydWN0aW9uIGNvZGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IFlEU1hHX0NUUkxMRU5HVEggLyA0OyBpKyspCisJCQl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfQ1RSTElOU1RSQU0gKyAoaSA8PCAyKSwgQ250cmxJbnN0MUVbaV0pOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBZRFNYR19DVFJMTEVOR1RIIC8gNDsgaSsrKQorCQkJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX0NUUkxJTlNUUkFNICsgKGkgPDwgMiksIENudHJsSW5zdFtpXSk7CisJfQorCisJeW1mcGNpX2VuYWJsZV9kc3AoY29kZWMpOworCisJLyogMC4wMnMgc291bmRzIG5vdCB0b28gYmFkLCB3ZSBtYXkgZG8gc2NoZWR1bGVfdGltZW91dCgpIGxhdGVyLiAqLworCW1kZWxheSgyMCk7IC8qIHNlZW1zIHdlIG5lZWQgc29tZSBkZWxheSBhZnRlciBkb3dubG9hZGluZyBpbWFnZS4uICovCit9CisKK3N0YXRpYyBpbnQgeW1mcGNpX21lbWFsbG9jKHltZnBjaV90ICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcGxheWJhY2tfY3RybF9zaXplOworCXVuc2lnbmVkIGludCBiYW5rX3NpemVfcGxheWJhY2s7CisJdW5zaWduZWQgaW50IGJhbmtfc2l6ZV9jYXB0dXJlOworCXVuc2lnbmVkIGludCBiYW5rX3NpemVfZWZmZWN0OworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBvZmY7CisJY2hhciAqcHRyOworCWRtYV9hZGRyX3QgcGJhOworCWludCB2b2ljZSwgYmFuazsKKworCXBsYXliYWNrX2N0cmxfc2l6ZSA9IDQgKyA0ICogWURTWEdfUExBWUJBQ0tfVk9JQ0VTOworCWJhbmtfc2l6ZV9wbGF5YmFjayA9IHltZnBjaV9yZWFkbChjb2RlYywgWURTWEdSX1BMQVlDVFJMU0laRSkgPDwgMjsKKwliYW5rX3NpemVfY2FwdHVyZSA9IHltZnBjaV9yZWFkbChjb2RlYywgWURTWEdSX1JFQ0NUUkxTSVpFKSA8PCAyOworCWJhbmtfc2l6ZV9lZmZlY3QgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9FRkZDVFJMU0laRSkgPDwgMjsKKwljb2RlYy0+d29ya19zaXplID0gWURTWEdfREVGQVVMVF9XT1JLX1NJWkU7CisKKwlzaXplID0gKChwbGF5YmFja19jdHJsX3NpemUgKyAweDAwZmYpICYgfjB4MDBmZikgKworCSAgICAoKGJhbmtfc2l6ZV9wbGF5YmFjayAqIDIgKiBZRFNYR19QTEFZQkFDS19WT0lDRVMgKyAweGZmKSAmIH4weGZmKSArCisJICAgICgoYmFua19zaXplX2NhcHR1cmUgKiAyICogWURTWEdfQ0FQVFVSRV9WT0lDRVMgKyAweGZmKSAmIH4weGZmKSArCisJICAgICgoYmFua19zaXplX2VmZmVjdCAqIDIgKiBZRFNYR19FRkZFQ1RfVk9JQ0VTICsgMHhmZikgJiB+MHhmZikgKworCSAgICBjb2RlYy0+d29ya19zaXplOworCisJcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY29kZWMtPnBjaSwgc2l6ZSArIDB4ZmYsICZwYmEpOworCWlmIChwdHIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY29kZWMtPmRtYV9hcmVhX3ZhID0gcHRyOworCWNvZGVjLT5kbWFfYXJlYV9iYSA9IHBiYTsKKwljb2RlYy0+ZG1hX2FyZWFfc2l6ZSA9IHNpemUgKyAweGZmOworCisJb2ZmID0gKHVuc2lnbmVkIGxvbmcpcHRyICYgMHhmZjsKKwlpZiAob2ZmKSB7CisJCXB0ciArPSAweDEwMCAtIG9mZjsKKwkJcGJhICs9IDB4MTAwIC0gb2ZmOworCX0KKworCS8qCisJICogSGFyZHdhcmUgcmVxdWlyZXMgb25seSBwdHJbcGxheWJhY2tfY3RybF9zaXplXSB6ZXJvZWQsCisJICogYnV0IGluIG91ciBqdWRnZW1lbnQgaXQgaXMgYSB3cm9uZyBraW5kIG9mIHNhdmluZ3MsIHNvIGNsZWFyIGl0IGFsbC4KKwkgKi8KKwltZW1zZXQocHRyLCAwLCBzaXplKTsKKworCWNvZGVjLT5jdHJsX3BsYXliYWNrID0gKHUzMiAqKXB0cjsKKwljb2RlYy0+Y3RybF9wbGF5YmFja19iYSA9IHBiYTsKKwljb2RlYy0+Y3RybF9wbGF5YmFja1swXSA9IGNwdV90b19sZTMyKFlEU1hHX1BMQVlCQUNLX1ZPSUNFUyk7CisJcHRyICs9IChwbGF5YmFja19jdHJsX3NpemUgKyAweDAwZmYpICYgfjB4MDBmZjsKKwlwYmEgKz0gKHBsYXliYWNrX2N0cmxfc2l6ZSArIDB4MDBmZikgJiB+MHgwMGZmOworCisJb2ZmID0gMDsKKwlmb3IgKHZvaWNlID0gMDsgdm9pY2UgPCBZRFNYR19QTEFZQkFDS19WT0lDRVM7IHZvaWNlKyspIHsKKwkJY29kZWMtPnZvaWNlc1t2b2ljZV0ubnVtYmVyID0gdm9pY2U7CisJCWNvZGVjLT52b2ljZXNbdm9pY2VdLmJhbmsgPQorCQkgICAgKHltZnBjaV9wbGF5YmFja19iYW5rX3QgKikgKHB0ciArIG9mZik7CisJCWNvZGVjLT52b2ljZXNbdm9pY2VdLmJhbmtfYmEgPSBwYmEgKyBvZmY7CisJCW9mZiArPSAyICogYmFua19zaXplX3BsYXliYWNrOwkJLyogMiBiYW5rcyAqLworCX0KKwlvZmYgPSAob2ZmICsgMHhmZikgJiB+MHhmZjsKKwlwdHIgKz0gb2ZmOworCXBiYSArPSBvZmY7CisKKwlvZmYgPSAwOworCWNvZGVjLT5iYW5rX2Jhc2VfY2FwdHVyZSA9IHBiYTsKKwlmb3IgKHZvaWNlID0gMDsgdm9pY2UgPCBZRFNYR19DQVBUVVJFX1ZPSUNFUzsgdm9pY2UrKykKKwkJZm9yIChiYW5rID0gMDsgYmFuayA8IDI7IGJhbmsrKykgeworCQkJY29kZWMtPmJhbmtfY2FwdHVyZVt2b2ljZV1bYmFua10gPQorCQkJICAgICh5bWZwY2lfY2FwdHVyZV9iYW5rX3QgKikgKHB0ciArIG9mZik7CisJCQlvZmYgKz0gYmFua19zaXplX2NhcHR1cmU7CisJCX0KKwlvZmYgPSAob2ZmICsgMHhmZikgJiB+MHhmZjsKKwlwdHIgKz0gb2ZmOworCXBiYSArPSBvZmY7CisKKwlvZmYgPSAwOworCWNvZGVjLT5iYW5rX2Jhc2VfZWZmZWN0ID0gcGJhOworCWZvciAodm9pY2UgPSAwOyB2b2ljZSA8IFlEU1hHX0VGRkVDVF9WT0lDRVM7IHZvaWNlKyspCisJCWZvciAoYmFuayA9IDA7IGJhbmsgPCAyOyBiYW5rKyspIHsKKwkJCWNvZGVjLT5iYW5rX2VmZmVjdFt2b2ljZV1bYmFua10gPQorCQkJICAgICh5bWZwY2lfZWZmZWN0X2JhbmtfdCAqKSAocHRyICsgb2ZmKTsKKwkJCW9mZiArPSBiYW5rX3NpemVfZWZmZWN0OworCQl9CisJb2ZmID0gKG9mZiArIDB4ZmYpICYgfjB4ZmY7CisJcHRyICs9IG9mZjsKKwlwYmEgKz0gb2ZmOworCisJY29kZWMtPndvcmtfYmFzZSA9IHBiYTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5bWZwY2lfbWVtZnJlZSh5bWZwY2lfdCAqY29kZWMpCit7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX1BMQVlDVFJMQkFTRSwgMCk7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX1JFQ0NUUkxCQVNFLCAwKTsKKwl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfRUZGQ1RSTEJBU0UsIDApOworCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9XT1JLQkFTRSwgMCk7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX1dPUktTSVpFLCAwKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGNvZGVjLT5wY2ksCisJICAgIGNvZGVjLT5kbWFfYXJlYV9zaXplLCBjb2RlYy0+ZG1hX2FyZWFfdmEsIGNvZGVjLT5kbWFfYXJlYV9iYSk7Cit9CisKK3N0YXRpYyB2b2lkIHltZl9tZW1sb2FkKHltZnBjaV90ICp1bml0KQoreworCisJeW1mcGNpX3dyaXRlbCh1bml0LCBZRFNYR1JfUExBWUNUUkxCQVNFLCB1bml0LT5jdHJsX3BsYXliYWNrX2JhKTsKKwl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9SRUNDVFJMQkFTRSwgdW5pdC0+YmFua19iYXNlX2NhcHR1cmUpOworCXltZnBjaV93cml0ZWwodW5pdCwgWURTWEdSX0VGRkNUUkxCQVNFLCB1bml0LT5iYW5rX2Jhc2VfZWZmZWN0KTsKKwl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9XT1JLQkFTRSwgdW5pdC0+d29ya19iYXNlKTsKKwl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9XT1JLU0laRSwgdW5pdC0+d29ya19zaXplID4+IDIpOworCisJLyogUy9QRElGIG91dHB1dCBpbml0aWFsaXphdGlvbiAqLworCXltZnBjaV93cml0ZXcodW5pdCwgWURTWEdSX1NQRElGT1VUQ1RSTCwgMCk7CisJeW1mcGNpX3dyaXRldyh1bml0LCBZRFNYR1JfU1BESUZPVVRTVEFUVVMsCisJCVNORF9QQ01fQUVTMF9DT05fRU1QSEFTSVNfTk9ORSB8CisJCShTTkRfUENNX0FFUzFfQ09OX09SSUdJTkFMIDw8IDgpIHwKKwkJKFNORF9QQ01fQUVTMV9DT05fUENNX0NPREVSIDw8IDgpKTsKKworCS8qIFMvUERJRiBpbnB1dCBpbml0aWFsaXphdGlvbiAqLworCXltZnBjaV93cml0ZXcodW5pdCwgWURTWEdSX1NQRElGSU5DVFJMLCAwKTsKKworCS8qIG1vdmUgdGhpcyB2b2x1bWUgc2V0dXAgdG8gbWl4ZXIgKi8KKwl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9OQVRJVkVEQUNPVVRWT0wsIDB4M2ZmZjNmZmYpOworCXltZnBjaV93cml0ZWwodW5pdCwgWURTWEdSX0JVRjQ0MU9VVFZPTCwgMCk7CisJeW1mcGNpX3dyaXRlbCh1bml0LCBZRFNYR1JfTkFUSVZFQURDSU5WT0wsIDB4M2ZmZjNmZmYpOworCXltZnBjaV93cml0ZWwodW5pdCwgWURTWEdSX05BVElWRURBQ0lOVk9MLCAweDNmZmYzZmZmKTsKK30KKworc3RhdGljIGludCB5bWZfYWM5N19pbml0KHltZnBjaV90ICp1bml0LCBpbnQgbnVtX2FjOTcpCit7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCXUxNiBlaWQ7CisKKwlpZiAoKGNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGluaXRpYWxpemUgc29tZSBiYXNpYyBjb2RlYyBpbmZvcm1hdGlvbiwgb3RoZXIgZmllbGRzIHdpbGwgYmUgZmlsbGVkCisJICAgaW4gYWM5N19wcm9iZV9jb2RlYyAqLworCWNvZGVjLT5wcml2YXRlX2RhdGEgPSB1bml0OworCWNvZGVjLT5pZCA9IG51bV9hYzk3OworCisJY29kZWMtPmNvZGVjX3JlYWQgPSB5bWZwY2lfY29kZWNfcmVhZDsKKwljb2RlYy0+Y29kZWNfd3JpdGUgPSB5bWZwY2lfY29kZWNfd3JpdGU7CisKKwlpZiAoYWM5N19wcm9iZV9jb2RlYyhjb2RlYykgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogYWM5N19wcm9iZV9jb2RlYyBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9rZnJlZTsKKwl9CisKKwllaWQgPSB5bWZwY2lfY29kZWNfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCk7CisJaWYgKGVpZD09MHhGRkZGKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInltZnBjaTogbm8gY29kZWMgYXR0YWNoZWQgP1xuIik7CisJCWdvdG8gb3V0X2tmcmVlOworCX0KKworCXVuaXQtPmFjOTdfZmVhdHVyZXMgPSBlaWQ7CisKKwlpZiAoKGNvZGVjLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmeW1mX21peGVyX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOworCQlnb3RvIG91dF9rZnJlZTsKKwl9CisKKwl1bml0LT5hYzk3X2NvZGVjW251bV9hYzk3XSA9IGNvZGVjOworCisJcmV0dXJuIDA7Cisgb3V0X2tmcmVlOgorCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKyNpZmRlZiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWQorIyBpZmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgbXB1X2lvOworc3RhdGljIGludCBzeW50aF9pbzsKK21vZHVsZV9wYXJhbShtcHVfaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3ludGhfaW8sIGludCwgMCk7CisjIGVsc2UKK3N0YXRpYyBpbnQgbXB1X2lvICAgICA9IDB4MzMwOworc3RhdGljIGludCBzeW50aF9pbyAgID0gMHgzODg7CisjIGVuZGlmCitzdGF0aWMgaW50IGFzc2lnbmVkOworI2VuZGlmIC8qIENPTkZJR19TT1VORF9ZTUZQQ0lfTEVHQUNZICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHltZl9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwl1MTYgY3RybDsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJeW1mcGNpX3QgKmNvZGVjOworCisJaW50IGVycjsKKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOworCisJaWYgKChjb2RlYyA9IGttYWxsb2Moc2l6ZW9mKHltZnBjaV90KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IG5vIGNvcmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGNvZGVjLCAwLCBzaXplb2YoKmNvZGVjKSk7CisKKwlzcGluX2xvY2tfaW5pdCgmY29kZWMtPnJlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY29kZWMtPnZvaWNlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjb2RlYy0+YWM5N19sb2NrKTsKKwlpbml0X01VVEVYKCZjb2RlYy0+b3Blbl9zZW0pOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+c3RhdGVzKTsKKwljb2RlYy0+cGNpID0gcGNpZGV2OworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZjb2RlYy0+cmV2KTsKKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oYmFzZSwgMHg4MDAwLCAieW1mcGNpIikgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogdW5hYmxlIHRvIHJlcXVlc3QgbWVtIHJlZ2lvblxuIik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJaWYgKChjb2RlYy0+cmVnX2FyZWFfdmlydCA9IGlvcmVtYXAoYmFzZSwgMHg4MDAwKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogdW5hYmxlIHRvIG1hcCByZWdpc3RlcnNcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwY2lkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAieW1mcGNpOiAlcyBhdCAweCVseCBJUlEgJWRcbiIsCisJICAgIChjaGFyICopZW50LT5kcml2ZXJfZGF0YSwgYmFzZSwgcGNpZGV2LT5pcnEpOworCisJeW1mcGNpX2FjbGlua19yZXNldChwY2lkZXYpOworCWlmICh5bWZwY2lfY29kZWNfcmVhZHkoY29kZWMsIDAsIDEpIDwgMCkKKwkJZ290byBvdXRfdW5tYXA7CisKKyNpZmRlZiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWQorCWlmIChhc3NpZ25lZCA9PSAwKSB7CisJCWNvZGVjLT5pb21pZGkgPSBtcHVfaW87CisJCWNvZGVjLT5pb3N5bnRoID0gc3ludGhfaW87CisJCWlmICh5bWZwY2lfc2V0dXBfbGVnYWN5KGNvZGVjLCBwY2lkZXYpIDwgMCkKKwkJCWdvdG8gb3V0X3VubWFwOworCQlhc3NpZ25lZCA9IDE7CisJfQorI2VuZGlmCisKKwl5bWZwY2lfZG93bmxvYWRfaW1hZ2UoY29kZWMpOworCisJaWYgKHltZnBjaV9tZW1hbGxvYyhjb2RlYykgPCAwKQorCQlnb3RvIG91dF9kaXNhYmxlX2RzcDsKKwl5bWZfbWVtbG9hZChjb2RlYyk7CisKKwlpZiAocmVxdWVzdF9pcnEocGNpZGV2LT5pcnEsIHltZl9pbnRlcnJ1cHQsIFNBX1NISVJRLCAieW1mcGNpIiwgY29kZWMpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IHVuYWJsZSB0byByZXF1ZXN0IElSUSAlZFxuIiwKKwkJICAgIHBjaWRldi0+aXJxKTsKKwkJZ290byBvdXRfbWVtZnJlZTsKKwl9CisKKwkvKiByZWdpc3RlciAvZGV2L2RzcCAqLworCWlmICgoY29kZWMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmeW1mX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiB1bmFibGUgdG8gcmVnaXN0ZXIgZHNwXG4iKTsKKwkJZ290byBvdXRfZnJlZV9pcnE7CisJfQorCisJLyoKKwkgKiBQb2tlIGp1c3QgdGhlIHByaW1hcnkgZm9yIHRoZSBtb21lbnQuCisJICovCisJaWYgKChlcnIgPSB5bWZfYWM5N19pbml0KGNvZGVjLCAwKSkgIT0gMCkKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9zb3VuZF9kc3A7CisKKyNpZmRlZiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWQorCWNvZGVjLT5vcGwzX2RhdGEubmFtZSA9ICJ5bWZwY2kiOworCWNvZGVjLT5tcHVfZGF0YS5uYW1lICA9ICJ5bWZwY2kiOworCisJY29kZWMtPm9wbDNfZGF0YS5pb19iYXNlID0gY29kZWMtPmlvc3ludGg7CisJY29kZWMtPm9wbDNfZGF0YS5pcnEgICAgID0gLTE7CisKKwljb2RlYy0+bXB1X2RhdGEuaW9fYmFzZSAgPSBjb2RlYy0+aW9taWRpOworCWNvZGVjLT5tcHVfZGF0YS5pcnEgICAgICA9IC0xOwkvKiBNYXkgYmUgZGlmZmVyZW50IGZyb20gb3VyIFBDSSBJUlEuICovCisKKwlpZiAoY29kZWMtPmlvbWlkaSkgeworCQlpZiAoIXByb2JlX3VhcnQ0MDEoJmNvZGVjLT5tcHVfZGF0YSwgVEhJU19NT0RVTEUpKSB7CisJCQljb2RlYy0+aW9taWRpID0gMDsJLyogWFhYIGtsdWRnZSAqLworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19TT1VORF9ZTUZQQ0lfTEVHQUNZICovCisKKwkvKiBwdXQgaXQgaW50byBkcml2ZXIgbGlzdCAqLworCXNwaW5fbG9jaygmeW1mX2RldnNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY29kZWMtPnltZl9kZXZzLCAmeW1mX2RldnMpOworCXNwaW5fdW5sb2NrKCZ5bWZfZGV2c19sb2NrKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBjb2RlYyk7CisKKwlyZXR1cm4gMDsKKworIG91dF91bnJlZ2lzdGVyX3NvdW5kX2RzcDoKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChjb2RlYy0+ZGV2X2F1ZGlvKTsKKyBvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEocGNpZGV2LT5pcnEsIGNvZGVjKTsKKyBvdXRfbWVtZnJlZToKKwl5bWZwY2lfbWVtZnJlZShjb2RlYyk7Cisgb3V0X2Rpc2FibGVfZHNwOgorCXltZnBjaV9kaXNhYmxlX2RzcChjb2RlYyk7CisJY3RybCA9IHltZnBjaV9yZWFkdyhjb2RlYywgWURTWEdSX0dMT0JBTENUUkwpOworCXltZnBjaV93cml0ZXcoY29kZWMsIFlEU1hHUl9HTE9CQUxDVFJMLCBjdHJsICYgfjB4MDAwNyk7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX1NUQVRVUywgfjApOworIG91dF91bm1hcDoKKwlpb3VubWFwKGNvZGVjLT5yZWdfYXJlYV92aXJ0KTsKKyBvdXRfcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApLCAweDgwMDApOworIG91dF9mcmVlOgorCWlmIChjb2RlYy0+YWM5N19jb2RlY1swXSkKKwkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjLT5hYzk3X2NvZGVjWzBdKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHltZl9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJX191MTYgY3RybDsKKwl5bWZwY2lfdCAqY29kZWMgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKKworCS8qIHJlbW92ZSBmcm9tIGxpc3Qgb2YgZGV2aWNlcyAqLworCXNwaW5fbG9jaygmeW1mX2RldnNfbG9jayk7CisJbGlzdF9kZWwoJmNvZGVjLT55bWZfZGV2cyk7CisJc3Bpbl91bmxvY2soJnltZl9kZXZzX2xvY2spOworCisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjb2RlYy0+YWM5N19jb2RlY1swXS0+ZGV2X21peGVyKTsKKwlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMtPmFjOTdfY29kZWNbMF0pOworCXVucmVnaXN0ZXJfc291bmRfZHNwKGNvZGVjLT5kZXZfYXVkaW8pOworCWZyZWVfaXJxKHBjaWRldi0+aXJxLCBjb2RlYyk7CisJeW1mcGNpX21lbWZyZWUoY29kZWMpOworCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9TVEFUVVMsIH4wKTsKKwl5bWZwY2lfZGlzYWJsZV9kc3AoY29kZWMpOworCWN0cmwgPSB5bWZwY2lfcmVhZHcoY29kZWMsIFlEU1hHUl9HTE9CQUxDVFJMKTsKKwl5bWZwY2lfd3JpdGV3KGNvZGVjLCBZRFNYR1JfR0xPQkFMQ1RSTCwgY3RybCAmIH4weDAwMDcpOworCWlvdW5tYXAoY29kZWMtPnJlZ19hcmVhX3ZpcnQpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKSwgMHg4MDAwKTsKKyNpZmRlZiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWQorCWlmIChjb2RlYy0+aW9taWRpKSB7CisJCXVubG9hZF91YXJ0NDAxKCZjb2RlYy0+bXB1X2RhdGEpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWSAqLworfQorCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiWWFtYWhhIFlNRjd4eCBQQ0kgQXVkaW8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHltZnBjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInltZnBjaSIsCisJLmlkX3RhYmxlCT0geW1mX2lkX3RibCwKKwkucHJvYmUJCT0geW1mX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHltZl9yZW1vdmVfb25lKSwKKwkuc3VzcGVuZAk9IHltZl9zdXNwZW5kLAorCS5yZXN1bWUJCT0geW1mX3Jlc3VtZQorfTsKKworc3RhdGljIGludCBfX2luaXQgeW1mX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmeW1mcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB5bWZfY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ5bWZwY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoeW1mX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHltZl9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MveW1mcGNpLmggYi9zb3VuZC9vc3MveW1mcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxMGExMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy95bWZwY2kuaApAQCAtMCwwICsxLDM2MCBAQAorI2lmbmRlZiBfX1lNRlBDSV9ICisjZGVmaW5lIF9fWU1GUENJX0gKKworLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICBEZWZpbml0aW9ucyBmb3IgWWFoYW1hIFlNRjcyNC83NDAvNzQ0Lzc1NCBjaGlwcworICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCisgKiAgRGlyZWN0IHJlZ2lzdGVycworICovCisKKy8qICNkZWZpbmUgWU1GUkVHKGNvZGVjLCByZWcpCQkoY29kZWMtPnBvcnQgKyBZRFNYR1JfIyNyZWcpICovCisKKyNkZWZpbmUJWURTWEdSX0lOVEZMQUcJCQkweDAwMDQKKyNkZWZpbmUJWURTWEdSX0FDVElWSVRZCQkJMHgwMDA2CisjZGVmaW5lCVlEU1hHUl9HTE9CQUxDVFJMCQkweDAwMDgKKyNkZWZpbmUJWURTWEdSX1pWQ1RSTAkJCTB4MDAwQQorI2RlZmluZQlZRFNYR1JfVElNRVJDVFJMCQkweDAwMTAKKyNkZWZpbmUJWURTWEdSX1RJTUVSQ1RSTF9URU4JCSAweDAwMDEKKyNkZWZpbmUJWURTWEdSX1RJTUVSQ1RSTF9USUVOCQkgMHgwMDAyCisjZGVmaW5lCVlEU1hHUl9USU1FUkNPVU5UCQkweDAwMTIKKyNkZWZpbmUJWURTWEdSX1NQRElGT1VUQ1RSTAkJMHgwMDE4CisjZGVmaW5lCVlEU1hHUl9TUERJRk9VVFNUQVRVUwkJMHgwMDFDCisjZGVmaW5lCVlEU1hHUl9FRVBST01DVFJMCQkweDAwMjAKKyNkZWZpbmUJWURTWEdSX1NQRElGSU5DVFJMCQkweDAwMzQKKyNkZWZpbmUJWURTWEdSX1NQRElGSU5TVEFUVVMJCTB4MDAzOAorI2RlZmluZQlZRFNYR1JfRFNQUFJPR1JBTURMCQkweDAwNDgKKyNkZWZpbmUJWURTWEdSX0RMQ05UUkwJCQkweDAwNEMKKyNkZWZpbmUJWURTWEdSX0dQSU9JTklOVEZMQUcJCTB4MDA1MAorI2RlZmluZQlZRFNYR1JfR1BJT0lOSU5URU5BQkxFCQkweDAwNTIKKyNkZWZpbmUJWURTWEdSX0dQSU9JTlNUQVRVUwkJMHgwMDU0CisjZGVmaW5lCVlEU1hHUl9HUElPT1VUQ1RSTAkJMHgwMDU2CisjZGVmaW5lCVlEU1hHUl9HUElPRlVOQ0VOQUJMRQkJMHgwMDU4CisjZGVmaW5lCVlEU1hHUl9HUElPVFlQRUNPTkZJRwkJMHgwMDVBCisjZGVmaW5lCVlEU1hHUl9BQzk3Q01EREFUQQkJMHgwMDYwCisjZGVmaW5lCVlEU1hHUl9BQzk3Q01EQURSCQkweDAwNjIKKyNkZWZpbmUJWURTWEdSX1BSSVNUQVRVU0RBVEEJCTB4MDA2NAorI2RlZmluZQlZRFNYR1JfUFJJU1RBVFVTQURSCQkweDAwNjYKKyNkZWZpbmUJWURTWEdSX1NFQ1NUQVRVU0RBVEEJCTB4MDA2OAorI2RlZmluZQlZRFNYR1JfU0VDU1RBVFVTQURSCQkweDAwNkEKKyNkZWZpbmUJWURTWEdSX1NFQ0NPTkZJRwkJMHgwMDcwCisjZGVmaW5lCVlEU1hHUl9MRUdBQ1lPVVRWT0wJCTB4MDA4MAorI2RlZmluZQlZRFNYR1JfTEVHQUNZT1VUVk9MTAkJMHgwMDgwCisjZGVmaW5lCVlEU1hHUl9MRUdBQ1lPVVRWT0xSCQkweDAwODIKKyNkZWZpbmUJWURTWEdSX05BVElWRURBQ09VVFZPTAkJMHgwMDg0CisjZGVmaW5lCVlEU1hHUl9OQVRJVkVEQUNPVVRWT0xMCQkweDAwODQKKyNkZWZpbmUJWURTWEdSX05BVElWRURBQ09VVFZPTFIJCTB4MDA4NgorI2RlZmluZQlZRFNYR1JfU1BESUZPVVRWT0wJCTB4MDA4OAorI2RlZmluZQlZRFNYR1JfU1BESUZPVVRWT0xMCQkweDAwODgKKyNkZWZpbmUJWURTWEdSX1NQRElGT1VUVk9MUgkJMHgwMDhBCisjZGVmaW5lCVlEU1hHUl9BQzNPVVRWT0wJCTB4MDA4QworI2RlZmluZQlZRFNYR1JfQUMzT1VUVk9MTAkJMHgwMDhDCisjZGVmaW5lCVlEU1hHUl9BQzNPVVRWT0xSCQkweDAwOEUKKyNkZWZpbmUJWURTWEdSX1BSSUFEQ09VVFZPTAkJMHgwMDkwCisjZGVmaW5lCVlEU1hHUl9QUklBRENPVVRWT0xMCQkweDAwOTAKKyNkZWZpbmUJWURTWEdSX1BSSUFEQ09VVFZPTFIJCTB4MDA5MgorI2RlZmluZQlZRFNYR1JfTEVHQUNZTE9PUFZPTAkJMHgwMDk0CisjZGVmaW5lCVlEU1hHUl9MRUdBQ1lMT09QVk9MTAkJMHgwMDk0CisjZGVmaW5lCVlEU1hHUl9MRUdBQ1lMT09QVk9MUgkJMHgwMDk2CisjZGVmaW5lCVlEU1hHUl9OQVRJVkVEQUNMT09QVk9MCQkweDAwOTgKKyNkZWZpbmUJWURTWEdSX05BVElWRURBQ0xPT1BWT0xMCTB4MDA5OAorI2RlZmluZQlZRFNYR1JfTkFUSVZFREFDTE9PUFZPTFIJMHgwMDlBCisjZGVmaW5lCVlEU1hHUl9TUERJRkxPT1BWT0wJCTB4MDA5QworI2RlZmluZQlZRFNYR1JfU1BESUZMT09QVk9MTAkJMHgwMDlFCisjZGVmaW5lCVlEU1hHUl9TUERJRkxPT1BWT0xSCQkweDAwOUUKKyNkZWZpbmUJWURTWEdSX0FDM0xPT1BWT0wJCTB4MDBBMAorI2RlZmluZQlZRFNYR1JfQUMzTE9PUFZPTEwJCTB4MDBBMAorI2RlZmluZQlZRFNYR1JfQUMzTE9PUFZPTFIJCTB4MDBBMgorI2RlZmluZQlZRFNYR1JfUFJJQURDTE9PUFZPTAkJMHgwMEE0CisjZGVmaW5lCVlEU1hHUl9QUklBRENMT09QVk9MTAkJMHgwMEE0CisjZGVmaW5lCVlEU1hHUl9QUklBRENMT09QVk9MUgkJMHgwMEE2CisjZGVmaW5lCVlEU1hHUl9OQVRJVkVBRENJTlZPTAkJMHgwMEE4CisjZGVmaW5lCVlEU1hHUl9OQVRJVkVBRENJTlZPTEwJCTB4MDBBOAorI2RlZmluZQlZRFNYR1JfTkFUSVZFQURDSU5WT0xSCQkweDAwQUEKKyNkZWZpbmUJWURTWEdSX05BVElWRURBQ0lOVk9MCQkweDAwQUMKKyNkZWZpbmUJWURTWEdSX05BVElWRURBQ0lOVk9MTAkJMHgwMEFDCisjZGVmaW5lCVlEU1hHUl9OQVRJVkVEQUNJTlZPTFIJCTB4MDBBRQorI2RlZmluZQlZRFNYR1JfQlVGNDQxT1VUVk9MCQkweDAwQjAKKyNkZWZpbmUJWURTWEdSX0JVRjQ0MU9VVFZPTEwJCTB4MDBCMAorI2RlZmluZQlZRFNYR1JfQlVGNDQxT1VUVk9MUgkJMHgwMEIyCisjZGVmaW5lCVlEU1hHUl9CVUY0NDFMT09QVk9MCQkweDAwQjQKKyNkZWZpbmUJWURTWEdSX0JVRjQ0MUxPT1BWT0xMCQkweDAwQjQKKyNkZWZpbmUJWURTWEdSX0JVRjQ0MUxPT1BWT0xSCQkweDAwQjYKKyNkZWZpbmUJWURTWEdSX1NQRElGT1VUVk9MMgkJMHgwMEI4CisjZGVmaW5lCVlEU1hHUl9TUERJRk9VVFZPTDJMCQkweDAwQjgKKyNkZWZpbmUJWURTWEdSX1NQRElGT1VUVk9MMlIJCTB4MDBCQQorI2RlZmluZQlZRFNYR1JfU1BESUZMT09QVk9MMgkJMHgwMEJDCisjZGVmaW5lCVlEU1hHUl9TUERJRkxPT1BWT0wyTAkJMHgwMEJDCisjZGVmaW5lCVlEU1hHUl9TUERJRkxPT1BWT0wyUgkJMHgwMEJFCisjZGVmaW5lCVlEU1hHUl9BRENTTE9UU1IJCTB4MDBDMAorI2RlZmluZQlZRFNYR1JfUkVDU0xPVFNSCQkweDAwQzQKKyNkZWZpbmUJWURTWEdSX0FEQ0ZPUk1BVAkJMHgwMEM4CisjZGVmaW5lCVlEU1hHUl9SRUNGT1JNQVQJCTB4MDBDQworI2RlZmluZQlZRFNYR1JfUDQ0U0xPVFNSCQkweDAwRDAKKyNkZWZpbmUJWURTWEdSX1NUQVRVUwkJCTB4MDEwMAorI2RlZmluZQlZRFNYR1JfQ1RSTFNFTEVDVAkJMHgwMTA0CisjZGVmaW5lCVlEU1hHUl9NT0RFCQkJMHgwMTA4CisjZGVmaW5lCVlEU1hHUl9TQU1QTEVDT1VOVAkJMHgwMTBDCisjZGVmaW5lCVlEU1hHUl9OVU1PRlNBTVBMRVMJCTB4MDExMAorI2RlZmluZQlZRFNYR1JfQ09ORklHCQkJMHgwMTE0CisjZGVmaW5lCVlEU1hHUl9QTEFZQ1RSTFNJWkUJCTB4MDE0MAorI2RlZmluZQlZRFNYR1JfUkVDQ1RSTFNJWkUJCTB4MDE0NAorI2RlZmluZQlZRFNYR1JfRUZGQ1RSTFNJWkUJCTB4MDE0OAorI2RlZmluZQlZRFNYR1JfV09SS1NJWkUJCQkweDAxNEMKKyNkZWZpbmUJWURTWEdSX01BUE9GUkVDCQkJMHgwMTUwCisjZGVmaW5lCVlEU1hHUl9NQVBPRkVGRkVDVAkJMHgwMTU0CisjZGVmaW5lCVlEU1hHUl9QTEFZQ1RSTEJBU0UJCTB4MDE1OAorI2RlZmluZQlZRFNYR1JfUkVDQ1RSTEJBU0UJCTB4MDE1QworI2RlZmluZQlZRFNYR1JfRUZGQ1RSTEJBU0UJCTB4MDE2MAorI2RlZmluZQlZRFNYR1JfV09SS0JBU0UJCQkweDAxNjQKKyNkZWZpbmUJWURTWEdSX0RTUElOU1RSQU0JCTB4MTAwMAorI2RlZmluZQlZRFNYR1JfQ1RSTElOU1RSQU0JCTB4NDAwMAorCisjZGVmaW5lIFlEU1hHX0FDOTdSRUFEQ01ECQkweDgwMDAKKyNkZWZpbmUgWURTWEdfQUM5N1dSSVRFQ01ECQkweDAwMDAKKworI2RlZmluZSBQQ0lSX0xFR0NUUkwJCQkweDQwCisjZGVmaW5lIFBDSVJfRUxFR0NUUkwJCQkweDQyCisjZGVmaW5lIFBDSVJfRFNYR0NUUkwJCQkweDQ4CisjZGVmaW5lIFBDSVJfRFNYUFdSQ1RSTDEJCTB4NGEKKyNkZWZpbmUgUENJUl9EU1hQV1JDVFJMMgkJMHg0ZQorI2RlZmluZSBQQ0lSX09QTEFEUgkJCTB4NjAKKyNkZWZpbmUgUENJUl9TQkFEUgkJCTB4NjIKKyNkZWZpbmUgUENJUl9NUFVBRFIJCQkweDY0CisKKyNkZWZpbmUgWURTWEdfRFNQTEVOR1RICQkJMHgwMDgwCisjZGVmaW5lIFlEU1hHX0NUUkxMRU5HVEgJCTB4MzAwMAorCisjZGVmaW5lIFlEU1hHX0RFRkFVTFRfV09SS19TSVpFCQkweDA0MDAKKworI2RlZmluZSBZRFNYR19QTEFZQkFDS19WT0lDRVMJCTY0CisjZGVmaW5lIFlEU1hHX0NBUFRVUkVfVk9JQ0VTCQkyCisjZGVmaW5lIFlEU1hHX0VGRkVDVF9WT0lDRVMJCTUKKworLyogbWF4aW51bSBudW1iZXIgb2YgQUM5NyBjb2RlY3MgY29ubmVjdGVkLCBBQzk3IDIuMCBkZWZpbmVkIDQgKi8KKyNkZWZpbmUgTlJfQUM5NwkJMgorCisjZGVmaW5lIFlNRl9TQU1QRgkJCTI1NgkvKiBTYW1wbGVzIHBlciBmcmFtZSBANDgwMDAgKi8KKworLyoKKyAqIFRoZSBzbG90L3ZvaWNlIGNvbnRyb2wgYmFuayAoMiBvZiB0aGVzZSBwZXIgdm9pY2UpCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc3RydV95bWZwY2lfcGxheWJhY2tfYmFuayB7CisJdTMyIGZvcm1hdDsKKwl1MzIgbG9vcF9kZWZhdWx0OworCXUzMiBiYXNlOwkJCS8qIDMyLWJpdCBhZGRyZXNzICovCisJdTMyIGxvb3Bfc3RhcnQ7CQkJLyogMzItYml0IG9mZnNldCAqLworCXUzMiBsb29wX2VuZDsJCQkvKiAzMi1iaXQgb2Zmc2V0ICovCisJdTMyIGxvb3BfZnJhYzsJCQkvKiA4LWJpdCBmcmFjdGlvbiAtIGxvb3Bfc3RhcnQgKi8KKwl1MzIgZGVsdGFfZW5kOwkJCS8qIHBpdGNoIGRlbHRhIGVuZCAqLworCXUzMiBscGZLX2VuZDsKKwl1MzIgZWdfZ2Fpbl9lbmQ7CisJdTMyIGxlZnRfZ2Fpbl9lbmQ7CisJdTMyIHJpZ2h0X2dhaW5fZW5kOworCXUzMiBlZmYxX2dhaW5fZW5kOworCXUzMiBlZmYyX2dhaW5fZW5kOworCXUzMiBlZmYzX2dhaW5fZW5kOworCXUzMiBscGZROworCXUzMiBzdGF0dXM7CQkvKiBQMzogQWx3YXlzIDAgZm9yIHNvbWUgcmVhc29uLiAqLworCXUzMiBudW1fb2ZfZnJhbWVzOworCXUzMiBsb29wX2NvdW50OworCXUzMiBzdGFydDsJCS8qIFAzOiBKLiByZWFkcyB0aGlzIHRvIGtub3cgd2hlcmUgY2hpcCBpcy4gKi8KKwl1MzIgc3RhcnRfZnJhYzsKKwl1MzIgZGVsdGE7CisJdTMyIGxwZks7CisJdTMyIGVnX2dhaW47CisJdTMyIGxlZnRfZ2FpbjsKKwl1MzIgcmlnaHRfZ2FpbjsKKwl1MzIgZWZmMV9nYWluOworCXUzMiBlZmYyX2dhaW47CisJdTMyIGVmZjNfZ2FpbjsKKwl1MzIgbHBmRDE7CisJdTMyIGxwZkQyOworfSB5bWZwY2lfcGxheWJhY2tfYmFua190OworCit0eXBlZGVmIHN0cnVjdCBzdHJ1X3ltZnBjaV9jYXB0dXJlX2JhbmsgeworCXUzMiBiYXNlOwkJCS8qIDMyLWJpdCBhZGRyZXNzIChhbGlnbmVkIGF0IDQpICovCisJdTMyIGxvb3BfZW5kOwkJCS8qIHNpemUgaW4gQllURVMgKGFsaWduZWQgYXQgNCkgKi8KKwl1MzIgc3RhcnQ7CQkJLyogMzItYml0IG9mZnNldCAqLworCXUzMiBudW1fb2ZfbG9vcHM7CQkvKiBjb3VudGVyICovCit9IHltZnBjaV9jYXB0dXJlX2JhbmtfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc3RydV95bWZwY2lfZWZmZWN0X2JhbmsgeworCXUzMiBiYXNlOwkJCS8qIDMyLWJpdCBhZGRyZXNzICovCisJdTMyIGxvb3BfZW5kOwkJCS8qIDMyLWJpdCBvZmZzZXQgKi8KKwl1MzIgc3RhcnQ7CQkJLyogMzItYml0IG9mZnNldCAqLworCXUzMiB0ZW1wOworfSB5bWZwY2lfZWZmZWN0X2JhbmtfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeW1mX3ZvaWNlIHltZnBjaV92b2ljZV90OworLyoKKyAqIFRocm91Z2hvdXQgdGhlIGNvZGUgWWFyb3NsYXYgbmFtZXMgWU1GIHVuaXQgcG9pbnRlciAiY29kZWMiCisgKiBldmVuIHRob3VnaCBpdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueSBjb2RlYy4gTXVzdCBiZSBoaXN0b3JpYy4KKyAqIFdlIHJlcGxhY2UgaXQgd2l0aCAidW5pdCIgb3ZlciB0aW1lLgorICogQUM5NyBwYXJ0cyB1c2UgImNvZGVjIiB0byBkZW5vdGUgYSBjb2RlYywgbmF0dXJhbGx5LgorICovCit0eXBlZGVmIHN0cnVjdCB5bWZfdW5pdCB5bWZwY2lfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlZTUZQQ0lfUENNLAorCVlNRlBDSV9TWU5USCwKKwlZTUZQQ0lfTUlESQorfSB5bWZwY2lfdm9pY2VfdHlwZV90OworCitzdHJ1Y3QgeW1mX3ZvaWNlIHsKKwkvLyB5bWZwY2lfdCAqY29kZWM7CisJaW50IG51bWJlcjsKKwljaGFyIHVzZSwgcGNtLCBzeW50aCwgbWlkaTsJLy8gYm9vbAorCXltZnBjaV9wbGF5YmFja19iYW5rX3QgKmJhbms7CisJc3RydWN0IHltZl9wY20gKnlwY207CisJZG1hX2FkZHJfdCBiYW5rX2JhOworfTsKKworc3RydWN0IHltZl9jYXB0dXJlIHsKKwkvLyBzdHJ1Y3QgeW1mX3VuaXQgKnVuaXQ7CisJaW50IHVzZTsKKwl5bWZwY2lfY2FwdHVyZV9iYW5rX3QgKmJhbms7CisJc3RydWN0IHltZl9wY20gKnlwY207Cit9OworCitzdHJ1Y3QgeW1mX3VuaXQgeworCXU4IHJldjsJCQkJLyogUENJIHJldmlzaW9uICovCisJdm9pZCBfX2lvbWVtICpyZWdfYXJlYV92aXJ0OworCXZvaWQgKmRtYV9hcmVhX3ZhOworCWRtYV9hZGRyX3QgZG1hX2FyZWFfYmE7CisJdW5zaWduZWQgaW50IGRtYV9hcmVhX3NpemU7CisKKwlkbWFfYWRkcl90IGJhbmtfYmFzZV9jYXB0dXJlOworCWRtYV9hZGRyX3QgYmFua19iYXNlX2VmZmVjdDsKKwlkbWFfYWRkcl90IHdvcmtfYmFzZTsKKwl1bnNpZ25lZCBpbnQgd29ya19zaXplOworCisJdTMyICpjdHJsX3BsYXliYWNrOworCWRtYV9hZGRyX3QgY3RybF9wbGF5YmFja19iYTsKKwl5bWZwY2lfcGxheWJhY2tfYmFua190ICpiYW5rX3BsYXliYWNrW1lEU1hHX1BMQVlCQUNLX1ZPSUNFU11bMl07CisJeW1mcGNpX2NhcHR1cmVfYmFua190ICpiYW5rX2NhcHR1cmVbWURTWEdfQ0FQVFVSRV9WT0lDRVNdWzJdOworCXltZnBjaV9lZmZlY3RfYmFua190ICpiYW5rX2VmZmVjdFtZRFNYR19FRkZFQ1RfVk9JQ0VTXVsyXTsKKworCWludCBzdGFydF9jb3VudDsKKwlpbnQgc3VzcGVuZGVkOworCisJdTMyIGFjdGl2ZV9iYW5rOworCXN0cnVjdCB5bWZfdm9pY2Ugdm9pY2VzW1lEU1hHX1BMQVlCQUNLX1ZPSUNFU107CisJc3RydWN0IHltZl9jYXB0dXJlIGNhcHR1cmVbWURTWEdfQ0FQVFVSRV9WT0lDRVNdOworCisJc3RydWN0IGFjOTdfY29kZWMgKmFjOTdfY29kZWNbTlJfQUM5N107CisJdTE2IGFjOTdfZmVhdHVyZXM7CisKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpOworCisjaWZkZWYgQ09ORklHX1NPVU5EX1lNRlBDSV9MRUdBQ1kKKwkvKiBsZWdhY3kgaGFyZHdhcmUgcmVzb3VyY2VzICovCisJdW5zaWduZWQgaW50IGlvc3ludGgsIGlvbWlkaTsKKwlzdHJ1Y3QgYWRkcmVzc19pbmZvIG9wbDNfZGF0YSwgbXB1X2RhdGE7CisjZW5kaWYKKworCXNwaW5sb2NrX3QgcmVnX2xvY2s7CisJc3BpbmxvY2tfdCB2b2ljZV9sb2NrOworCXNwaW5sb2NrX3QgYWM5N19sb2NrOworCisJLyogc291bmRjb3JlIHN0dWZmICovCisJaW50IGRldl9hdWRpbzsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCisJc3RydWN0IGxpc3RfaGVhZCB5bWZfZGV2czsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0YXRlczsJLyogTGlzdCBvZiBzdGF0ZXMgZm9yIHRoaXMgdW5pdCAqLworfTsKKworc3RydWN0IHltZl9kbWFidWYgeworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdm9pZCAqcmF3YnVmOworCXVuc2lnbmVkIGJ1Zm9yZGVyOworCisJLyogT1NTIGJ1ZmZlciBtYW5hZ2VtZW50IHN0dWZmICovCisJdW5zaWduZWQgbnVtZnJhZzsKKwl1bnNpZ25lZCBmcmFnc2hpZnQ7CisKKwkvKiBvdXIgYnVmZmVyIGFjdHMgbGlrZSBhIGNpcmN1bGFyIHJpbmcgKi8KKwl1bnNpZ25lZCBod3B0cjsJCS8qIHdoZXJlIGRtYSBsYXN0IHN0YXJ0ZWQgKi8KKwl1bnNpZ25lZCBzd3B0cjsJCS8qIHdoZXJlIGRyaXZlciBsYXN0IGNsZWFyL2ZpbGxlZCAqLworCWludCBjb3VudDsJCS8qIGZpbGwgY291bnQgKi8KKwl1bnNpZ25lZCB0b3RhbF9ieXRlczsJLyogdG90YWwgYnl0ZXMgZG1hZWQgYnkgaGFyZHdhcmUgKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CS8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLworCisJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCXVuc2lnbmVkIGZyYWdzaXplOworCXVuc2lnbmVkIGRtYXNpemU7CS8qIFRvdGFsIHJhd2J1ZltdIHNpemUgKi8KKworCS8qIE9TUyBzdHVmZiAqLworCXVuc2lnbmVkIG1hcHBlZDoxOworCXVuc2lnbmVkIHJlYWR5OjE7CisJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OworCWludCBvc3NtYXhmcmFnczsKKwl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKK307CisKK3N0cnVjdCB5bWZfcGNtX2Zvcm1hdCB7CisJaW50IGZvcm1hdDsJCQkvKiBPU1MgZm9ybWF0ICovCisJaW50IHJhdGU7CQkJLyogcmF0ZSBpbiBIeiAqLworCWludCB2b2ljZXM7CQkJLyogbnVtYmVyIG9mIHZvaWNlcyAqLworCWludCBzaGlmdDsJCQkvKiByZWR1bmRhbnQsIGNvbXB1dGVkIGZyb20gdGhlIGFib3ZlICovCit9OworCit0eXBlZGVmIGVudW0geworCVBMQVlCQUNLX1ZPSUNFLAorCUNBUFRVUkVfUkVDLAorCUNBUFRVUkVfQUM5NywKKwlFRkZFQ1RfRFJZX0xFRlQsCisJRUZGRUNUX0RSWV9SSUdIVCwKKwlFRkZFQ1RfRUZGMSwKKwlFRkZFQ1RfRUZGMiwKKwlFRkZFQ1RfRUZGMworfSB5bWZwY2lfcGNtX3R5cGVfdDsKKworLyogVGhpcyBpcyB2YXJpYW50IHJlY29yZCwgYnV0IHdlIGhhdGUgdW5pb25zLiBMaXR0bGUgd2FzdGUgb24gcG9pbnRlcnMgW10uICovCitzdHJ1Y3QgeW1mX3BjbSB7CisJeW1mcGNpX3BjbV90eXBlX3QgdHlwZTsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKworCXltZnBjaV92b2ljZV90ICp2b2ljZXNbMl07CisJaW50IGNhcHR1cmVfYmFua19udW1iZXI7CisKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiBkbWFidWY7CisJaW50IHJ1bm5pbmc7CisJaW50IHNwZGlmOworfTsKKworLyoKKyAqICJTb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AuCisgKiBJdCBtYXkgaGF2ZSB0d28gcGh5c2ljYWwgY2hhbm5lbHMgKHBjbXMpIGZvciBkdXBsZXggb3BlcmF0aW9ucy4KKyAqLworCitzdHJ1Y3QgeW1mX3N0YXRlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoYWluOworCXN0cnVjdCB5bWZfdW5pdCAqdW5pdDsJCQkvKiBiYWNrcG9pbnRlciAqLworCXN0cnVjdCB5bWZfcGNtIHJwY20sIHdwY207CisJc3RydWN0IHltZl9wY21fZm9ybWF0IGZvcm1hdDsKK307CisKKyNlbmRpZgkJCQkvKiBfX1lNRlBDSV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MveW1mcGNpX2ltYWdlLmggYi9zb3VuZC9vc3MveW1mcGNpX2ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyZjJmZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy95bWZwY2lfaW1hZ2UuaApAQCAtMCwwICsxLDE1NjUgQEAKKyNpZm5kZWYgX0hXTUNPREVfCisjZGVmaW5lIF9IV01DT0RFXworCitzdGF0aWMgdTMyIERzcEluc3RbWURTWEdfRFNQTEVOR1RIIC8gNF0gPSB7CisJMHgwMDAwMDA4MSwgMHgwMDAwMDFhNCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAyZiwKKwkweDAwMDgwMjUzLCAweDAxODAwMzE3LCAweDAwMDA0MDdiLCAweDAwMDA4NDNmLAorCTB4MDAwMTQ4M2MsIDB4MDAwMTk0M2MsIDB4MDAwNWQ4M2MsIDB4MDAwMDFjM2MsCisJMHgwMDAwYzA3YiwgMHgwMDA1MGMzZiwgMHgwMTIxNTAzYywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwCit9OworCitzdGF0aWMgdTMyIENudHJsSW5zdFtZRFNYR19DVFJMTEVOR1RIIC8gNF0gPSB7CisJMHgwMDAwMDcsIDB4MjQwMDA3LCAweDBDMDAwNywgMHgxQzAwMDcsCisJMHgwNjAwMDcsIDB4NzAwMDAyLCAweDAwMDAyMCwgMHgwMzAwNDAsCisJMHgwMDcxMDQsIDB4MDA0Mjg2LCAweDAzMDA0MCwgMHgwMDBGMEQsCisJMHgwMDA4MTAsIDB4MjAwNDNBLCAweDAwMDI4MiwgMHgwMDAyMEQsCisJMHgwMDA4MTAsIDB4MjAwNDNBLCAweDAwMTI4MiwgMHgyMDBFODIsCisJMHgwMDFBODIsIDB4MDMyRDBELCAweDAwMDgxMCwgMHgxMDA0M0EsCisJMHgwMkQzOEQsIDB4MDAwODEwLCAweDE4MDQzQSwgMHgwMDAxMEQsCisJMHgwMjAwMTUsIDB4MDAwMEZELCAweDAwMDAyMCwgMHgwMzg4NjAsCisJMHgwMzkwNjAsIDB4MDM4MDYwLCAweDAzODA0MCwgMHgwMzgwNDAsCisJMHgwMzgwNDAsIDB4MDE4MDQwLCAweDAwMEE3RCwgMHgwMzgwNDAsCisJMHgwMzgwNDAsIDB4MDE4MDQwLCAweDIwMDQwMiwgMHgwMDA4ODIsCisJMHgwODAwMUEsIDB4MDAwOTA0LCAweDAxNTk4NiwgMHgwMDAwMDcsCisJMHgyNjAwMDcsIDB4MDAwMDA3LCAweDAwMDAwNywgMHgwMThBMDYsCisJMHgwMDAwMDcsIDB4MDMwQzhELCAweDAwMDgxMCwgMHgxODA0M0EsCisJMHgyNjAwMDcsIDB4MDAwODdELCAweDAxODA0MiwgMHgwMDE2MEEsCisJMHgwNEEyMDYsIDB4MDAwMDA3LCAweDAwMjE4RCwgMHgwMDA4MTAsCisJMHgwODA0M0EsIDB4MjFDMjA2LCAweDAwMDAwNywgMHgwMDA3RkQsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgwMjkzODYsCisJMHgwMDAxOTUsIDB4MDkwRDA0LCAweDAwMDAwNywgMHgwMDA4MjAsCisJMHgwMDAwRjUsIDB4MDAwQjdELCAweDAxRjA2MCwgMHgwMDAwRkQsCisJMHgwMzIyMDYsIDB4MDE4MDQwLCAweDAwMEE3RCwgMHgwMzgwNDIsCisJMHgxMzgwNEEsIDB4MTgwMDBBLCAweDAwMTgyMCwgMHgwNTkwNjAsCisJMHgwNTg4NjAsIDB4MDE4MDQwLCAweDAwMDBGRCwgMHgwMTgwNDIsCisJMHg3MDAwMEEsIDB4MDAwMTE1LCAweDA3MTE0NCwgMHgwMzIzODYsCisJMHgwMzAwMDAsIDB4MDA3MDIwLCAweDAzNEEwNiwgMHgwMTgwNDAsCisJMHgwMDM0OEQsIDB4MDAwODEwLCAweDA4MDQzQSwgMHgyMUVBMDYsCisJMHgwMDAwMDcsIDB4MDJEMzhELCAweDAwMDgxMCwgMHgxODA0M0EsCisJMHgwMTgyMDYsIDB4MDAwMDA3LCAweDI0MDAwNywgMHgwMDBGOEQsCisJMHgwMDA4MTAsIDB4MDAxNjNBLCAweDAwMjQwMiwgMHgwMDVDMDIsCisJMHgwMDI4RkQsIDB4MDAwMDIwLCAweDAxODA0MCwgMHgwODAwMEQsCisJMHgwMDA4MTUsIDB4NTEwOTg0LCAweDAwMDAwNywgMHgwMDAwNEQsCisJMHgwMDBFNUQsIDB4MDAwRTAyLCAweDAwNDE4RCwgMHgwMDA4MTAsCisJMHgwODA0M0EsIDB4MkM4QTA2LCAweDAwMDAwNywgMHgwMDAwOEQsCisJMHgwMDA5MjQsIDB4MDAwRjAyLCAweDAwNDU4RCwgMHgwMDA4MTAsCisJMHgwODA0M0EsIDB4MkM4QTA2LCAweDAwMDAwNywgMHgwMDM4N0QsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMTAxNSwgMHgwMTA5ODQsCisJMHgwMTgzODYsIDB4MDAwMDA3LCAweDAxQUEwNiwgMHgwMDAwMDcsCisJMHgwMDA4RkQsIDB4MDE4MDQyLCAweDE4MDAwQSwgMHgwMDE5MDQsCisJMHgyMTgwODYsIDB4MjgwMDA3LCAweDAwMTgxMCwgMHgyODA0M0EsCisJMHgyODBDMDIsIDB4MDAwMDBELCAweDAwMDgxMCwgMHgyODE0M0EsCisJMHgwODgwOEQsIDB4MDAwODIwLCAweDAwMDJGRCwgMHgwMTgwNDAsCisJMHgyMDAwMDcsIDB4MDAwMjBELCAweDE4OTkwNCwgMHgwMDAwMDcsCisJMHgwMDQwMkQsIDB4MDAwMEJELCAweDAwMDJGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDA1NUE4NiwgMHgwMDAwMDcsCisJMHgwMDAxMDAsIDB4MDAwQTIwLCAweDAwMDQ3RCwgMHgwMTgwNDAsCisJMHgwMTgwNDIsIDB4MjAwMDBBLCAweDAwMzAxNSwgMHgwMTIxNDQsCisJMHgwMzQ5ODYsIDB4MDAwMDA3LCAweDAwMjEwNCwgMHgwMzQ5ODYsCisJMHgwMDAwMDcsIDB4MDAwRjhELCAweDAwMDgxMCwgMHgyODBDM0EsCisJMHgwMjM5NDQsIDB4MDZDOTg2LCAweDAwMDAwNywgMHgwMDE4MTAsCisJMHgyODA0M0EsIDB4MDg4MTBELCAweDAwMDgyMCwgMHgwMDAyRkQsCisJMHgwMTgwNDAsIDB4MjAwMDA3LCAweDAwMjgxMCwgMHg3ODAwM0EsCisJMHgwMDY4OEQsIDB4MDAwODEwLCAweDA4MDQzQSwgMHgyODhBMDYsCisJMHgwMDAwMDcsIDB4MDA0MDBELCAweDAwMTAxNSwgMHgxODk5MDQsCisJMHgyOTI5MDQsIDB4MzkzOTA0LCAweDAwMDAwNywgMHgwNjAyMDYsCisJMHgwMDAwMDcsIDB4MDAwNEY1LCAweDAwMDA3RCwgMHgwMDAwMjAsCisJMHgwMDAwOEQsIDB4MDEwODYwLCAweDAxODA0MCwgMHgwMDA0N0QsCisJMHgwMzgwNDIsIDB4MjE4MDRBLCAweDE4MDAwQSwgMHgwMjE5NDQsCisJMHgyMTU4ODYsIDB4MDAwMDA3LCAweDAwNDA3NSwgMHg3MUYxMDQsCisJMHgwMDAwMDcsIDB4MDEwMDQyLCAweDI4MDAwQSwgMHgwMDI5MDQsCisJMHgyMTIwODYsIDB4MDAwMDA3LCAweDAwM0MwRCwgMHgzMEE5MDQsCisJMHgwMDAwMDcsIDB4MDAwNzdELCAweDAxODA0MiwgMHgwODAwMEEsCisJMHgwMDA5MDQsIDB4MDdEQTg2LCAweDAwMDU3RCwgMHgwMDI4MjAsCisJMHgwM0IwNjAsIDB4MDdGMjA2LCAweDAxODA0MCwgMHgwMDMwMjAsCisJMHgwM0E4NjAsIDB4MDE4MDQwLCAweDAwMDJGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDA3RkE4NiwgMHgwMDAwMDcsCisJMHgwMDA1N0QsIDB4MDE4MDQyLCAweDI4MDQwQSwgMHgwMDBFOEQsCisJMHgwMDA4MTAsIDB4MjgwQzNBLCAweDAwMDAwRCwgMHgwMDA4MTAsCisJMHgyODE0M0EsIDB4MDkwMDBELCAweDAwMDgyMCwgMHgwMDAyRkQsCisJMHgwMTgwNDAsIDB4MjAwMDA3LCAweDAwM0RGRCwgMHgwMDAwMjAsCisJMHgwMTgwNDAsIDB4MDAxMDdELCAweDAwOEQ4RCwgMHgwMDA4MTAsCisJMHgwODA0M0EsIDB4Mjg4QTA2LCAweDAwMDAwNywgMHgwMDA4MTUsCisJMHgwODAwMUEsIDB4MDEwOTg0LCAweDA5NTE4NiwgMHgwMDEzN0QsCisJMHgyMDA1MDAsIDB4MjgwRjIwLCAweDMzOEY2MCwgMHgzQjhGNjAsCisJMHg0MzhGNjAsIDB4NEI4RjYwLCAweDUzOEY2MCwgMHg1QjhGNjAsCisJMHgwMzhBNjAsIDB4MDE4MDQwLCAweDAwN0ZCRCwgMHgzODNEQzQsCisJMHgwMDAwMDcsIDB4MDAxQTdELCAweDAwMTM3NSwgMHgwMTgwNDIsCisJMHgwOTAwNEEsIDB4MTAwMDBBLCAweDBCOEQwNCwgMHgxMzk1MDQsCisJMHgwMDAwMDcsIDB4MDAwODIwLCAweDAxOTA2MCwgMHgwMDExMDQsCisJMHgyMTIwODYsIDB4MDEwMDQwLCAweDAwMTdGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDIxMjI4NiwgMHgwMDAwMDcsCisJMHgwMDE5N0QsIDB4MDM4MDQyLCAweDA5ODA0QSwgMHgxMDAwMEEsCisJMHgwMDA5MjQsIDB4MDAxNjY0LCAweDAwMTFGRCwgMHgwMzgwNDIsCisJMHgyQjgwNEEsIDB4MTk4MDRBLCAweDAwMDA4RCwgMHgyMTg5NDQsCisJMHgwMDAwMDcsIDB4MDAyMjQ0LCAweDBBRTE4NiwgMHgwMDAwMDcsCisJMHgwMDFBNjQsIDB4MDAyQTI0LCAweDAwMTk3RCwgMHgwODAxMDIsCisJMHgxMDAxMjIsIDB4MDAwODIwLCAweDAzOTA2MCwgMHgwMTgwNDAsCisJMHgwMDNERkQsIDB4MDAwMDhELCAweDAwMDgyMCwgMHgwMTgwNDAsCisJMHgwMDEzNzUsIDB4MDAxQTdELCAweDAxMDA0MiwgMHgwOTgwNEEsCisJMHgxMDAwMEEsIDB4MDAwMjFELCAweDAxODlFNCwgMHgyOTkyRTQsCisJMHgzMDkxNDQsIDB4MDAwMDA3LCAweDAwMDYwRCwgMHgwMDBBMTUsCisJMHgwMDBDMUQsIDB4MDAxMDI1LCAweDAwQTlFNCwgMHgwMTJCRTQsCisJMHgwMDA0NjQsIDB4MDFCM0U0LCAweDAyMzJFNCwgMHgwMDA0NjQsCisJMHgwMDA0NjQsIDB4MDAwNDY0LCAweDAwMDQ2NCwgMHgwMDA0MEQsCisJMHgwOEIxQzQsIDB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMDBCRjUsCisJMHgwMzAwNDAsIDB4MDAxOTdELCAweDAzODA0MiwgMHgwOTgwNEEsCisJMHgwMDBBMjQsIDB4MDgwMDBBLCAweDA4MEU2NCwgMHgwMDAwMDcsCisJMHgxMDAxMjIsIDB4MDAwODIwLCAweDAzMTA2MCwgMHgwMTAwNDAsCisJMHgwMDY0QUMsIDB4MDAwMjdELCAweDAwMDAyMCwgMHgwMTgwNDAsCisJMHgwMDEwN0QsIDB4MDE4MDQyLCAweDAwMTFGRCwgMHgzQjgwNEEsCisJMHgwOTgwNEEsIDB4MjAwMDBBLCAweDAwMDA5NSwgMHgxQTExNDQsCisJMHgwMEExNDQsIDB4MEQyMDg2LCAweDAwMDQwRCwgMHgwMEI5ODQsCisJMHgwRDIxODYsIDB4MDAxOEZELCAweDAxODA0MiwgMHgwMDEwRkQsCisJMHgwOTgwNEEsIDB4MjgwMDBBLCAweDAwMDA5NSwgMHgwMTA5MjQsCisJMHgwMDJBNjQsIDB4MEQxMTg2LCAweDAwMDAwNywgMHgwMDI5MDQsCisJMHgwRDIyODYsIDB4MDAwMDA3LCAweDBEMkEwNiwgMHgwODAwMDIsCisJMHgwMDAwOEQsIDB4MDAzODdELCAweDAwMDgyMCwgMHgwMTgwNDAsCisJMHgwMDEyN0QsIDB4MDE4MDQyLCAweDEwMDAwQSwgMHgwMDM5MDQsCisJMHgwREQxODYsIDB4MDAwODBELCAweDdGRkZCNSwgMHgwMEI5ODQsCisJMHgwREExODYsIDB4MDAwMDI1LCAweDBFN0EwNiwgMHgwMDAwMkQsCisJMHgwMDAwMTUsIDB4MDAwODJELCAweDAyQzc4RCwgMHgwMDA4MjAsCisJMHgwRUMyMDYsIDB4MDAwMDBELCAweDdGODAzNSwgMHgwMEI5ODQsCisJMHgwRTcxODYsIDB4NDAwMDI1LCAweDAwMDA4RCwgMHgxMTA5NDQsCisJMHgwMDAwMDcsIDB4MDAwMThELCAweDEwOTUwNCwgMHgwMDAwMDcsCisJMHgwMDkxNjQsIDB4MDAwNDI0LCAweDAwMDQyNCwgMHgwMDA0MjQsCisJMHgxMDAxMDIsIDB4MjgwMDAyLCAweDAyQzY4RCwgMHgwMDA4MjAsCisJMHgwRUMyMDYsIDB4MDAwMThELCAweDAwMDQyRCwgMHgwMDAwOEQsCisJMHgxMDk1MDQsIDB4MDAwMDA3LCAweDAwMDIwRCwgMHgxMDkxODQsCisJMHgwMDAwMDcsIDB4MDJDNzBELCAweDAwMDgyMCwgMHgwMDAwOEQsCisJMHgwMDM4RkQsIDB4MDE4MDQwLCAweDAwM0JGRCwgMHgwMDEwMjAsCisJMHgwM0E4NjAsIDB4MDAwODE1LCAweDMxMzE4NCwgMHgyMTIxODQsCisJMHgwMDAwMDcsIDB4MDNCMDYwLCAweDAzQTA2MCwgMHgwMTgwNDAsCisJMHgwMDIyRkQsIDB4MDAwMDk1LCAweDAxMDkyNCwgMHgwMDA0MjQsCisJMHgwMDA0MjQsIDB4MDAxMjY0LCAweDEwMDEwMiwgMHgwMDA4MjAsCisJMHgwMzkwNjAsIDB4MDE4MDQwLCAweDAwMTkyNCwgMHgwMEZCOEQsCisJMHgwMDM5N0QsIDB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsCisJMHgwOTg0NEEsIDB4MDAwNjA2LCAweDA4MDQwQSwgMHgwMDA0MjQsCisJMHgwMDA0MjQsIDB4MDAxMTdELCAweDAxODA0MiwgMHgwODAwMEEsCisJMHgwMDBBMjQsIDB4MjgwNTAyLCAweDI4MEMwMiwgMHgwOTgwMEQsCisJMHgwMDA4MjAsIDB4MDAwMkZELCAweDAxODA0MCwgMHgyMDAwMDcsCisJMHgwMDIyRkQsIDB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDAwOTUsCisJMHgyODBEQzQsIDB4MDExOTI0LCAweDAwMTk3RCwgMHgwMTgwNDIsCisJMHgwMDExRkQsIDB4MDk4MDRBLCAweDEwMDAwQSwgMHgwMDAwQjUsCisJMHgxMTMxNDQsIDB4MEE4RDA0LCAweDAwMDAwNywgMHgwODBBNDQsCisJMHgxMjk1MDQsIDB4MDAwMDA3LCAweDAwMjNGRCwgMHgwMDEwMjAsCisJMHgwMzgwNDAsIDB4MTAxMjQ0LCAweDAwMDAwNywgMHgwMDA4MjAsCisJMHgwMzkwNjAsIDB4MDE4MDQwLCAweDAwMDJGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDEwRkE4NiwgMHgwMDAwMDcsCisJMHgwMDNCRkQsIDB4MDAwMTAwLCAweDAwMEExMCwgMHgwQjgwN0EsCisJMHgxMzgwNEEsIDB4MDkwOTg0LCAweDAwMDAwNywgMHgwMDAwOTUsCisJMHgwMTNEMDQsIDB4MTE4MDg2LCAweDEwMDAwQSwgMHgxMDAwMDIsCisJMHgwOTA5ODQsIDB4MDAwMDA3LCAweDAzODA0MiwgMHgxMTgwNEEsCisJMHgwOTBEMDQsIDB4MDAwMDA3LCAweDEwMDAwQSwgMHgwOTBEODQsCisJMHgwMDAwMDcsIDB4MDAyNTdELCAweDAwMDgyMCwgMHgwMTgwNDAsCisJMHgwMDAxMEQsIDB4MDAwODEwLCAweDI4MTQzQSwgMHgwMDEyN0QsCisJMHgwMTgwNDIsIDB4MjAwMDBBLCAweDAwMTk3RCwgMHgwMTgwNDIsCisJMHgwMDExN0QsIDB4MzE4MDRBLCAweDEwMDAwQSwgMHgwMDMxMjQsCisJMHgwMTI4MEQsIDB4MDAzOTdELCAweDAwMDgyMCwgMHgwNTgwNDAsCisJMHgwMzgwNDIsIDB4MDk4NDRBLCAweDAwMDYwNiwgMHgwODA0MEEsCisJMHgzMDAxMDIsIDB4MDAzMTI0LCAweDAwMDQyNCwgMHgwMDA0MjQsCisJMHgwMDEyMjQsIDB4MjgwNTAyLCAweDAwMUE0QywgMHgxMzAxODYsCisJMHg3MDAwMDIsIDB4MDAwMDJELCAweDAzMDAwMCwgMHgwMDM4N0QsCisJMHgwMTgwNDIsIDB4MTAwMDBBLCAweDEzMkEwNiwgMHgwMDIxMjQsCisJMHgwMDAwQUQsIDB4MTAwMDAyLCAweDAwMDEwRCwgMHgwMDA5MjQsCisJMHgwMDZCMjQsIDB4MDEzNjhELCAweDAwMzk3RCwgMHgwMDA4MjAsCisJMHgwNTgwNDAsIDB4MDM4MDQyLCAweDA5ODQ0QSwgMHgwMDA2MDYsCisJMHgwODA0MEEsIDB4MDAzMjY0LCAweDAwMDA4RCwgMHgwMDBBMjQsCisJMHgwMDEwMjAsIDB4MDAyMjdELCAweDAxODA0MCwgMHgwMTNDMEQsCisJMHgwMDA4MTAsIDB4MDgwNDNBLCAweDI5RDIwNiwgMHgwMDAwMDcsCisJMHgwMDI4MjAsIDB4MDAyMDdELCAweDAxODA0MCwgMHgwMDExN0QsCisJMHgwMzgwNDIsIDB4MTM4MDRBLCAweDMzODAwQSwgMHgwMDM4N0QsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgxNjNBODYsCisJMHgwMDAwMDcsIDB4MDAwMDhELCAweDAzMDk2NCwgMHgwMTQ3OEQsCisJMHgwMDM5N0QsIDB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsCisJMHgwOTg0NEEsIDB4MDAwNjA2LCAweDA4MDQwQSwgMHgzODAxMDIsCisJMHgwMDA0MjQsIDB4MDAwNDI0LCAweDAwMTIyNCwgMHgwMDAyRkQsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgxNEEyODYsCisJMHgwMDAwMDcsIDB4MjgwNTAyLCAweDAwMUE0QywgMHgxNjM5ODYsCisJMHgwMDAwMDcsIDB4MDMyMTY0LCAweDAwNjMyQywgMHgwMDNERkQsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDA5NSwgMHgwOTA5MDQsCisJMHgwMDAwMDcsIDB4MDAwODIwLCAweDAwMUE0QywgMHgxNTYxODYsCisJMHgwMTgwNDAsIDB4MDMwMDAwLCAweDE1N0EwNiwgMHgwMDIxMjQsCisJMHgwMDAxMEQsIDB4MDAwOTI0LCAweDAwNkIyNCwgMHgwMTVCOEQsCisJMHgwMDM5N0QsIDB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsCisJMHgwOTg0NEEsIDB4MDAwNjA2LCAweDA4MDQwQSwgMHgwMDNBNjQsCisJMHgwMDAwOTUsIDB4MDAxMjI0LCAweDAwMDJGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDE1REE4NiwgMHgwMDAwMDcsCisJMHgwMTYyOEQsIDB4MDAwODEwLCAweDA4MDQzQSwgMHgyOUQyMDYsCisJMHgwMDAwMDcsIDB4MTREMjA2LCAweDAwMDAwNywgMHgwMDcwMjAsCisJMHgwODAxMEEsIDB4MTAwMTJBLCAweDAwMjBGRCwgMHgwMzg4NjAsCisJMHgwMzkwNjAsIDB4MDE4MDQwLCAweDAwMjI3RCwgMHgwMTgwNDIsCisJMHgwMDNERkQsIDB4MDgwMDBBLCAweDMxODQ0QSwgMHgwMDA5MDQsCisJMHgxNkQ4ODYsIDB4MTgwMDhCLCAweDAwMDA4RCwgMHgxODk5MDQsCisJMHgwMDMxMkMsIDB4MTdBQTA2LCAweDAwMDAwNywgMHgwMDMyNEMsCisJMHgxNzMzODYsIDB4MDAwMDA3LCAweDAwMTkwNCwgMHgxNzMwODYsCisJMHgwMDAwMDcsIDB4MDAwMDk1LCAweDE5OTE0NCwgMHgwMDIyMkMsCisJMHgwMDMxMjQsIDB4MDA2MzZDLCAweDAwMEUzRCwgMHgwMDEzNzUsCisJMHgwMDBCRkQsIDB4MDEwMDQyLCAweDA5ODA0QSwgMHgxMDAwMEEsCisJMHgwMzhBRUMsIDB4MDM5M0VDLCAweDAwMjI0QywgMHgxN0E5ODYsCisJMHgwMDAwMDcsIDB4MDAwMDhELCAweDE4OTkwNCwgMHgwMDIyNkMsCisJMHgwMDMyMkMsIDB4MzAwNTBBLCAweDMwMURBQiwgMHgwMDIwODMsCisJMHgwMDE4RkQsIDB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMTg5MjQsCisJMHgzMDA1MDIsIDB4MDAxMDgzLCAweDAwMTg3NSwgMHgwMTAwNDIsCisJMHgxMDAwMEEsIDB4MDAwMDhELCAweDAxMDkyNCwgMHgwMDEzNzUsCisJMHgzMzA1NDIsIDB4MzMwQ0NCLCAweDMzMkNDQiwgMHgzMzM0Q0IsCisJMHgzMzNDQ0IsIDB4MzM0NENCLCAweDMzNENDQiwgMHgzMzU0Q0IsCisJMHgzMDVDOEIsIDB4MDA2MDgzLCAweDAwMDJGNSwgMHgwMTAwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDE4N0E4NiwgMHgwMDAwMDcsCisJMHgwMDFFMkQsIDB4MDAwNUZELCAweDAxODA0MiwgMHgwODAwMEEsCisJMHgwMjg5MjQsIDB4MjgwNTAyLCAweDAwMDYwRCwgMHgwMDA4MTAsCisJMHgyODBDM0EsIDB4MDAwMDhELCAweDAwMDgxMCwgMHgyODE0M0EsCisJMHgwQTgwOEQsIDB4MDAwODIwLCAweDAwMDJGNSwgMHgwMTAwNDAsCisJMHgyMjAwMDcsIDB4MDAxMjc1LCAweDAzMDA0MiwgMHgyMTAwNEEsCisJMHgwMDAwOEQsIDB4MUEwOTQ0LCAweDAwMDAwNywgMHgwMTk4MEQsCisJMHgwMDA4MTAsIDB4MDgwNDNBLCAweDJCMjIwNiwgMHgwMDAwMDcsCisJMHgwMDAxRjUsIDB4MDMwMDQyLCAweDBEMDA0QSwgMHgxMDAwMEEsCisJMHgwODkxNDQsIDB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTAwNDAsCisJMHgwMDI1RjUsIDB4MEEzMTQ0LCAweDAwMDAwNywgMHgwMDA4MjAsCisJMHgwMzI4NjAsIDB4MDMwMDQwLCAweDAwMjE3RCwgMHgwMzgwNDIsCisJMHgwQjgwNEEsIDB4MTAwMDBBLCAweDAwMDgyMCwgMHgwMzEwNjAsCisJMHgwMzAwNDAsIDB4MDAwMDhELCAweDAwMDEyNCwgMHgwMDAxMkMsCisJMHgwMDBFNjQsIDB4MDAxQTY0LCAweDAwNjM2QywgMHgwODAxMEEsCisJMHgxMDAxMkEsIDB4MDAwODIwLCAweDAzMTA2MCwgMHgwMzAwNDAsCisJMHgwMDIwRkQsIDB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDIyN0QsCisJMHgwMTgwNDIsIDB4MTAwMDBBLCAweDAwMDgyMCwgMHgwMzEwNjAsCisJMHgwMzAwNDAsIDB4MDAxOTdELCAweDAxODA0MiwgMHgwODAwMEEsCisJMHgwMDIyRkQsIDB4MDM4MDQyLCAweDEwMDAwQSwgMHgwMDA4MjAsCisJMHgwMzEwNjAsIDB4MDMwMDQwLCAweDA5MEQwNCwgMHgwMDAwMDcsCisJMHgwMDA4MjAsIDB4MDMwMDQwLCAweDAzODA0MiwgMHgwQjgwNEEsCisJMHgxMDAwMEEsIDB4MDAwODIwLCAweDAzMTA2MCwgMHgwMzAwNDAsCisJMHgwMzgwNDIsIDB4MTM4MDRBLCAweDE5ODA0QSwgMHgxMTBEMDQsCisJMHgxOThEMDQsIDB4MDAwMDA3LCAweDA4MDAwQSwgMHgwMDEwMjAsCisJMHgwMzE4NjAsIDB4MDMwODYwLCAweDAzMDA0MCwgMHgwMDAwOEQsCisJMHgwQjA5NDQsIDB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTAwNDAsCisJMHgwMDA1RjUsIDB4MDMwMDQyLCAweDA4MDAwQSwgMHgwMDA4MjAsCisJMHgwMTAwNDAsIDB4MDAwMEY1LCAweDAxMDA0MiwgMHgwODAwMEEsCisJMHgwMDA5MDQsIDB4MUM2MDg2LCAweDAwMUU3NSwgMHgwMzAwNDIsCisJMHgwMTA0NEEsIDB4MDAwQzBBLCAweDFDNzIwNiwgMHgwMDAwMDcsCisJMHgwMDA0MDIsIDB4MDAwQzAyLCAweDAwMTc3RCwgMHgwMDFBRjUsCisJMHgwMTgwNDIsIDB4MDMxNDRBLCAweDAzMUM0QSwgMHgwMzI0NEEsCisJMHgwMzJDNEEsIDB4MDMzNDRBLCAweDAzM0M0QSwgMHgwMzQ0NEEsCisJMHgwMDRDMEEsIDB4MDAwNDNELCAweDAwMTNGNSwgMHgwMDFBRkQsCisJMHgwMzAwNDIsIDB4MEIwMDRBLCAweDFCODA0QSwgMHgxMzgwNEEsCisJMHgyMDAwMEEsIDB4MDg5MTQ0LCAweDE5QTE0NCwgMHgwMzg5RTQsCisJMHgwMzk5RUMsIDB4MDA1NTAyLCAweDAwNUQwQSwgMHgwMzAwNDIsCisJMHgwQjAwNEEsIDB4MUI4MDRBLCAweDEzODA0QSwgMHgyMDAwMEEsCisJMHgwODkxNDQsIDB4MTlBMTQ0LCAweDAzODlFNCwgMHgwMzk5RUMsCisJMHgwMDY1MDIsIDB4MDA2RDBBLCAweDAzMDA0MiwgMHgwQjAwNEEsCisJMHgxOTAwNEEsIDB4MkI4MDRBLCAweDEzODA0QSwgMHgyMTgwNEEsCisJMHgzMDAwMEEsIDB4MDg5MTQ0LCAweDE5QTE0NCwgMHgyQUIxNDQsCisJMHgwMzg5RTQsIDB4MDM5OUVDLCAweDAwNzUwMiwgMHgwMDdEMEEsCisJMHgwM0E5RTQsIDB4MDAwNzAyLCAweDAwMTA3RCwgMHgwMDA0MTUsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAxMDlFNCwgMHgwMDBGMDIsCisJMHgwMDJBRjUsIDB4MDAxOUZELCAweDAxMDA0MiwgMHgwOTgwNEEsCisJMHgxMDAwMEEsIDB4MDAwOTM0LCAweDAwMTY3NCwgMHgwMDI5RjUsCisJMHgwMTAwNDIsIDB4MTAwMDBBLCAweDAwOTE3QywgMHgwMDIwNzUsCisJMHgwMTAwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgxRUQyODYsCisJMHgwMDI2RjUsIDB4MDAyN0Y1LCAweDAzMDA0MiwgMHgwOTAwNEEsCisJMHgxMDAwMEEsIDB4MDAwQTNDLCAweDAwMTY3QywgMHgwMDFBNzUsCisJMHgwMDBCRkQsIDB4MDEwMDQyLCAweDUxODA0QSwgMHg0ODAwMEEsCisJMHgxNjAwMDcsIDB4MDAxMDc1LCAweDAxMDA0MiwgMHgyODJDMEEsCisJMHgyODFEMTIsIDB4MjgyNTEyLCAweDAwMUYzMiwgMHgxRTAwMDcsCisJMHgwRTAwMDcsIDB4MDAxOTc1LCAweDAxMDA0MiwgMHgwMDJERjUsCisJMHgwRDAwNEEsIDB4MTAwMDBBLCAweDAwOTE0NCwgMHgxRkIyODYsCisJMHgwMTAwNDIsIDB4MjgzNDBBLCAweDAwMEU1RCwgMHgwMDAwOEQsCisJMHgwMDAzNzUsIDB4MDAwODIwLCAweDAxMDA0MCwgMHgwNUQyRjQsCisJMHg1NEQxMDQsIDB4MDA3MzVDLCAweDIwNTM4NiwgMHgwMDAwMDcsCisJMHgwQzAwMDcsIDB4MDgwMDA3LCAweDBBMDAwNywgMHgwMjA0MEQsCisJMHgwMDA4MTAsIDB4MDgwNDNBLCAweDMzMjIwNiwgMHgwMDAwMDcsCisJMHgyMDVBMDYsIDB4MDAwMDA3LCAweDA4MDAwNywgMHgwMDIyNzUsCisJMHgwMTAwNDIsIDB4MjAwMDBBLCAweDAwMjEwNCwgMHgyMTIwODYsCisJMHgwMDFFMkQsIDB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsCisJMHgwMDA5MDQsIDB4MjA5Mjg2LCAweDAwMDAwNywgMHgwMDIwMTAsCisJMHgzMDA0M0EsIDB4MDAwNTdELCAweDAxODBDMywgMHgwODAwMEEsCisJMHgwMjg5MjQsIDB4MjgwNTAyLCAweDI4MEMwMiwgMHgwQTgxMEQsCisJMHgwMDA4MjAsIDB4MDAwMkY1LCAweDAxMDA0MCwgMHgyMjAwMDcsCisJMHgwMDA0RkQsIDB4MDE4MDQyLCAweDcwMDAwQSwgMHgwMzAwMDAsCisJMHgwMDcwMjAsIDB4MDZGQTA2LCAweDAxODA0MCwgMHgwMjE4MEQsCisJMHgwMDA4MTAsIDB4MDgwNDNBLCAweDJCMjIwNiwgMHgwMDAwMDcsCisJMHgwMDAyRkQsIDB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsCisJMHgyMThBODYsIDB4MDAwMDA3LCAweDAxRjIwNiwgMHgwMDAwMDcsCisJMHgwMDA4NzUsIDB4MDAwOUZELCAweDAwMDEwRCwgMHgyMjBBMDYsCisJMHgwMDAyOTUsIDB4MDAwQjc1LCAweDAwMDk3RCwgMHgwMDAwMEQsCisJMHgwMDA1MTUsIDB4MDEwMDQyLCAweDE4MDAwQSwgMHgwMDE5MDQsCisJMHgyODc4ODYsIDB4MDAwNkY1LCAweDAwMTAyMCwgMHgwMTAwNDAsCisJMHgwMDA0RjUsIDB4MDAwODIwLCAweDAxMDA0MCwgMHgwMDA3NzUsCisJMHgwMTAwNDIsIDB4MDk4MDRBLCAweDEwMDAwQSwgMHgwMDExMjQsCisJMHgwMDA5MDQsIDB4MjJCQTg2LCAweDAwMDgxNSwgMHgwODAxMDIsCisJMHgxMDEyMDQsIDB4MjJEQTA2LCAweDAwMDU3NSwgMHgwODEyMDQsCisJMHgwMDAwMDcsIDB4MTAwMTAyLCAweDAwMDU3NSwgMHgwMDA0MjUsCisJMHgwMjExMjQsIDB4MTAwMTAyLCAweDAwMDgyMCwgMHgwMzEwNjAsCisJMHgwMTAwNDAsIDB4MDAxOTI0LCAweDI4Nzg4NiwgMHgwMDAwOEQsCisJMHgwMDA0NjQsIDB4MDA5RDA0LCAweDI3ODg4NiwgMHgxODAxMDIsCisJMHgwMDA1NzUsIDB4MDEwMDQyLCAweDI4MDQwQSwgMHgwMDAxOEQsCisJMHgwMDA5MjQsIDB4MjgwRDAyLCAweDAwMDAwRCwgMHgwMDA5MjQsCisJMHgyODE1MDIsIDB4MTAwMDBELCAweDAwMDgyMCwgMHgwMDAyRjUsCisJMHgwMTAwNDAsIDB4MjAwMDA3LCAweDAwMTE3NSwgMHgwMDAyRkQsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgyM0MyODYsCisJMHgwMDAwMDcsIDB4MDAwMTAwLCAweDA4MEIyMCwgMHgxMzBCNjAsCisJMHgxQjBCNjAsIDB4MDMwQTYwLCAweDAxMDA0MCwgMHgwNTAwNDIsCisJMHgzRDAwNEEsIDB4MzUwMDRBLCAweDJEMDA0QSwgMHgyMDAwMEEsCisJMHgwMDA2RjUsIDB4MDEwMDQyLCAweDI4MTQwQSwgMHgwMDA0RjUsCisJMHgwMTAwNDIsIDB4MDgwMDBBLCAweDAwMDMxNSwgMHgwMTBEMDQsCisJMHgyNENBODYsIDB4MDA0MDE1LCAweDAwMDA5NSwgMHgwMTBEMDQsCisJMHgyNEI4ODYsIDB4MTAwMDIyLCAweDEwMDAyQSwgMHgyNEUyMDYsCisJMHgwMDAwMDcsIDB4MzMzMTA0LCAweDJBQTkwNCwgMHgwMDAwMDcsCisJMHgwMzIxMjQsIDB4MjgwNTAyLCAweDAwMTEyNCwgMHgwMDA0MjQsCisJMHgwMDA0MjQsIDB4MDAzMjI0LCAweDAwMjkyQywgMHgwMDYzNkMsCisJMHgyNUYzODYsIDB4MDAwMDA3LCAweDAyQjE2NCwgMHgwMDA0NjQsCisJMHgwMDA0NjQsIDB4MDAwMDhELCAweDAwMEE2NCwgMHgyODBEMDIsCisJMHgxMDAwOEQsIDB4MDAwODIwLCAweDAwMDJGNSwgMHgwMTAwNDAsCisJMHgyMjAwMDcsIDB4MDAwMDhELCAweDM4QjkwNCwgMHgwMDAwMDcsCisJMHgwMzI5NkMsIDB4MzAwMTBBLCAweDAwMDJGNSwgMHgwMTAwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDI1QkE4NiwgMHgwMDAwMDcsCisJMHgwMjMxMkMsIDB4MjgwNTBBLCAweDAwMDA4RCwgMHgwMTA5NkMsCisJMHgyODBEMEEsIDB4MTAwMTBELCAweDAwMDgyMCwgMHgwMDAyRjUsCisJMHgwMTAwNDAsIDB4MjIwMDA3LCAweDAwMTEyNCwgMHgwMDA0MjQsCisJMHgwMDA0MjQsIDB4MDAzMjI0LCAweDMwMDEwMiwgMHgwMzI5NDQsCisJMHgyNjdBODYsIDB4MDAwMDA3LCAweDMwMDAwMiwgMHgwMDA0RjUsCisJMHgwMTAwNDIsIDB4MDgwMDBBLCAweDAwMDMxNSwgMHgwMTBEMDQsCisJMHgyNkMwODYsIDB4MDAzMTI0LCAweDAwMDQ2NCwgMHgzMDAxMDIsCisJMHgwMDAyRjUsIDB4MDEwMDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsCisJMHgyNkNBODYsIDB4MDAwMDA3LCAweDAwMzEyNCwgMHgzMDA1MDIsCisJMHgwMDM5MjQsIDB4MzAwNTgzLCAweDAwMDg4MywgMHgwMDA1RjUsCisJMHgwMTAwNDIsIDB4MjgwNDBBLCAweDAwMDA4RCwgMHgwMDgxMjQsCisJMHgyODBEMDIsIDB4MDAwMDhELCAweDAwODEyNCwgMHgyODE1MDIsCisJMHgxMDAxOEQsIDB4MDAwODIwLCAweDAwMDJGNSwgMHgwMTAwNDAsCisJMHgyMjAwMDcsIDB4MDAxMDI1LCAweDAwMDU3NSwgMHgwMzAwNDIsCisJMHgwOTAwNEEsIDB4MTAwMDBBLCAweDBBMDkwNCwgMHgxMjExMDQsCisJMHgwMDAwMDcsIDB4MDAxMDIwLCAweDA1MDg2MCwgMHgwNTAwNDAsCisJMHgwMDA2RkQsIDB4MDE4MDQyLCAweDA5MDA0QSwgMHgxMDAwMEEsCisJMHgwMDAwQTUsIDB4MEEwOTA0LCAweDEyMTEwNCwgMHgwMDAwMDcsCisJMHgwMDA4MjAsIDB4MDE5MDYwLCAweDAxMDA0MCwgMHgwMDAyRjUsCisJMHgwMTAwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgyODQyODYsCisJMHgwMDAwMDcsIDB4MjMwQTA2LCAweDAwMDAwNywgMHgwMDA2MDYsCisJMHgwMDAwMDcsIDB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsCisJMHgwMDA5MDQsIDB4Mjg5Mjg2LCAweDAwMDAwNywgMHgwMDAxMDAsCisJMHgwODBCMjAsIDB4MTM4QjYwLCAweDFCOEI2MCwgMHgyMzhCNjAsCisJMHgyQjhCNjAsIDB4MzM4QjYwLCAweDNCOEI2MCwgMHg0MzhCNjAsCisJMHg0QjhCNjAsIDB4NTM4QjYwLCAweDVCOEI2MCwgMHg2MzhCNjAsCisJMHg2QjhCNjAsIDB4NzM4QjYwLCAweDdCOEI2MCwgMHgwMzhGNjAsCisJMHgwQjhGNjAsIDB4MTM4RjYwLCAweDFCOEY2MCwgMHgyMzhGNjAsCisJMHgyQjhGNjAsIDB4MzM4RjYwLCAweDNCOEY2MCwgMHg0MzhGNjAsCisJMHg0QjhGNjAsIDB4NTM4RjYwLCAweDVCOEY2MCwgMHg2MzhGNjAsCisJMHg2QjhGNjAsIDB4NzM4RjYwLCAweDdCOEY2MCwgMHgwMzhBNjAsCisJMHgwMDA2MDYsIDB4MDE4MDQwLCAweDAwMDA4RCwgMHgwMDBBNjQsCisJMHgyODBEMDIsIDB4MDAwQTI0LCAweDAwMDI3RCwgMHgwMTgwNDIsCisJMHgxMDAwMEEsIDB4MDAxMjI0LCAweDAwMDNGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDJBODI4NiwgMHgwMDAwMDcsCisJMHgwMDAxOEQsIDB4MDAwQTI0LCAweDAwMDQ2NCwgMHgwMDA0NjQsCisJMHgwODAxMDIsIDB4MDAwOTI0LCAweDAwMDQyNCwgMHgwMDA0MjQsCisJMHgxMDAxMDIsIDB4MDIwMDBELCAweDAwOTE0NCwgMHgyQUQ5ODYsCisJMHgwMDAwMDcsIDB4MDAwMUZELCAweDAxODA0MiwgMHgwODAwMEEsCisJMHgwMDBBNDQsIDB4MkFCQjg2LCAweDAxODA0MiwgMHgwQTAwMEQsCisJMHgwMDA4MjAsIDB4MDAwMkZELCAweDAxODA0MCwgMHgyMDAwMDcsCisJMHgwMDAyN0QsIDB4MDAxMDIwLCAweDAwMDYwNiwgMHgwMTgwNDAsCisJMHgwMDAyRjUsIDB4MDEwMDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsCisJMHgyQjJBODYsIDB4MDAwMDA3LCAweDAwMDM3RCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDJCNUE4NiwgMHgwMDAwMDcsCisJMHgwMDAwNzUsIDB4MDAyRTdELCAweDAxMDA0MiwgMHgwQjgwNEEsCisJMHgwMDAwMjAsIDB4MDAwOTA0LCAweDAwMDY4NiwgMHgwMTAwNDAsCisJMHgzMTg0NEEsIDB4MzAwNDhCLCAweDAwMDg4MywgMHgwMDAwOEQsCisJMHgwMDA4MTAsIDB4MjgxNDNBLCAweDAwMDA4RCwgMHgwMDA4MTAsCisJMHgyODBDM0EsIDB4MDAwNjc1LCAweDAxMDA0MiwgMHgwODAwMEEsCisJMHgwMDM4MTUsIDB4MDEwOTI0LCAweDI4MDUwMiwgMHgwQjAwMEQsCisJMHgwMDA4MjAsIDB4MDAwMkY1LCAweDAxMDA0MCwgMHgwMDA2MDYsCisJMHgyMjAwMDcsIDB4MDAwNDY0LCAweDAwMDQ2NCwgMHgwMDA2MDYsCisJMHgwMDAwMDcsIDB4MDAwMTM0LCAweDAwN0Y4RCwgMHgwMDA5M0MsCisJMHgyODFEMTIsIDB4MjgyNTEyLCAweDAwMUYzMiwgMHgwRTAwMDcsCisJMHgwMDAxMEQsIDB4MDAwMzdELCAweDAwMDgyMCwgMHgwMTgwNDAsCisJMHgwNUQyRjQsIDB4MDAwMDA3LCAweDA4MDAwNywgMHgwMDAzN0QsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgyRDAyODYsCisJMHgwMDAwMDcsIDB4MDAwNjA2LCAweDAwMDAwNywgMHgwMDAwMDcsCisJMHgwMDAwMTIsIDB4MTAwMDA3LCAweDMyMDAwNywgMHg2MDAwMDcsCisJMHgxMDAwODAsIDB4NDgwMDFBLCAweDAwNDkwNCwgMHgyRDYxODYsCisJMHgwMDAwMDcsIDB4MDAxMjEwLCAweDU4MDAzQSwgMHgwMDAxNDUsCisJMHg1QzVEMDQsIDB4MDAwMDA3LCAweDAwMDA4MCwgMHg0ODAwMUEsCisJMHgwMDQ5MDQsIDB4MkRCMTg2LCAweDAwMDAwNywgMHgwMDEyMTAsCisJMHg1MDAwM0EsIDB4MDA1OTA0LCAweDJFMDg4NiwgMHgwMDAwNDUsCisJMHgwMDAwQzUsIDB4N0ZGRkY1LCAweDdGRkY3RCwgMHgwN0Q1MjQsCisJMHgwMDQyMjQsIDB4NTAwMTAyLCAweDIwMDUwMiwgMHgwMDAwODIsCisJMHg0MDAwMUEsIDB4MDA0MTA0LCAweDJFMzk4NiwgMHgwMDAwMDcsCisJMHgwMDM4NjUsIDB4NDAwMDFBLCAweDAwNDAyMCwgMHgwMDEwNEQsCisJMHgwNEMxODQsIDB4MzAxQjg2LCAweDAwMDA0MCwgMHgwNDAwMDcsCisJMHgwMDAxNjUsIDB4MDAwMTQ1LCAweDAwNDAyMCwgMHgwMDAwNDAsCisJMHgwMDA3NjUsIDB4MDgwMDgwLCAweDQwMDAxQSwgMHgwMDQxMDQsCisJMHgyRUM5ODYsIDB4MDAwMDA3LCAweDAwMTIxMCwgMHg0MDAwM0EsCisJMHgwMDQxMDQsIDB4MkYyMjg2LCAweDAwMDA0RCwgMHgwMDAwQ0QsCisJMHgwMDQ4MTAsIDB4MjAwNDNBLCAweDAwMDg4MiwgMHg0MDAwMUEsCisJMHgwMDQxMDQsIDB4MkYzMTg2LCAweDAwMDAwNywgMHgwMDQ4MjAsCisJMHgwMDU5MDQsIDB4MzAwODg2LCAweDAwMDA0MCwgMHgwMDA3RTUsCisJMHgyMDA0ODAsIDB4MjgxNkEwLCAweDMyMTZFMCwgMHgzQTE2RTAsCisJMHg0MjE2RTAsIDB4MDIxMjYwLCAweDAwMDA0MCwgMHgwMDAwMzIsCisJMHg0MDAwNzUsIDB4MDAwMDdELCAweDA3RDU3NCwgMHgyMDA1MTIsCisJMHgwMDAwODIsIDB4NDAwMDFBLCAweDAwNDEwNCwgMHgyRkUxODYsCisJMHgwMDAwMDcsIDB4MDM3MjA2LCAweDY0MDAwNywgMHgwNjAwMDcsCisJMHgwMDAwRTUsIDB4MDAwMDIwLCAweDAwMDA0MCwgMHgwMDBBNjUsCisJMHgwMDAwMjAsIDB4MDIwMDQwLCAweDAyMDA0MCwgMHgwMDAwNDAsCisJMHgwMDAxNjUsIDB4MDAwMDQyLCAweDcwMDAwQSwgMHgwMDcxMDQsCisJMHgzMEEyODYsIDB4MDAwMDA3LCAweDAxODIwNiwgMHg2NDAwMDcsCisJMHgwNTAwMDAsIDB4MDA3MDIwLCAweDAwMDA0MCwgMHgwMzcyMDYsCisJMHg2NDAwMDcsIDB4MDAwMDA3LCAweDAwMzA2RCwgMHgwMjg4NjAsCisJMHgwMjkwNjAsIDB4MDgwMDBBLCAweDAyODg2MCwgMHgwMDgwNDAsCisJMHgxMDAwMTIsIDB4MDAxMDBELCAweDAwOTE4NCwgMHgzMTQxODYsCisJMHgwMDBFMEQsIDB4MDA5MTg0LCAweDMyNTE4NiwgMHgwMDAwMDcsCisJMHgzMDAwMDcsIDB4MDAxMDIwLCAweDAwM0I2RCwgMHgwMDgwNDAsCisJMHgwMDAwODAsIDB4MDgwMDFBLCAweDAwMDkwNCwgMHgzMTYxODYsCisJMHgwMDAwMDcsIDB4MDAxMjIwLCAweDAwMERFRCwgMHgwMDgwNDAsCisJMHgwMDgwNDIsIDB4MTAwMDBBLCAweDQwMDAwRCwgMHgxMDk1NDQsCisJMHgwMDAwMDcsIDB4MDAxMDIwLCAweDAwMERFRCwgMHgwMDgwNDAsCisJMHgwMDgwNDIsIDB4MjAwNDBBLCAweDAwMDA4MiwgMHgwODAwMUEsCisJMHgwMDA5MDQsIDB4MzFGMTg2LCAweDAwMDAwNywgMHgwMDNCNkQsCisJMHgwMDgwNDIsIDB4MDgwMDBBLCAweDAwMEUxNSwgMHgwMTA5ODQsCisJMHgzMjlCODYsIDB4NjAwMDA3LCAweDA4MDAxQSwgMHgwMDBDMTUsCisJMHgwMTA5ODQsIDB4MzI4Mzg2LCAweDAwMDAyMCwgMHgxQTAwMDcsCisJMHgwMDAyRUQsIDB4MDA4MDQwLCAweDYyMDAwNywgMHgwMDMwNkQsCisJMHgwMjgwNDIsIDB4MEE4MDRBLCAweDAwMDgyMCwgMHgwQTgwNEEsCisJMHgwMDA2MDYsIDB4MTA4MDRBLCAweDAwMDAwNywgMHgyODI1MTIsCisJMHgwMDFGMzIsIDB4MDVEMkY0LCAweDU0RDEwNCwgMHgwMDczNUMsCisJMHgwMDA3ODYsIDB4MDAwMDA3LCAweDBDMDAwNywgMHgwQTAwMDcsCisJMHgxQzAwMDcsIDB4MDAzNDY1LCAweDAyMDA0MCwgMHgwMDQ4MjAsCisJMHgwMjUwNjAsIDB4NDAwMDBBLCAweDAyNDA2MCwgMHgwMDAwNDAsCisJMHg0NTQ5NDQsIDB4MDAwMDA3LCAweDAwNDAyMCwgMHgwMDNBRTUsCisJMHgwMDAwNDAsIDB4MDAyOEU1LCAweDAwMDA0MiwgMHg0ODAwMEEsCisJMHgwMDQ5MDQsIDB4Mzg2ODg2LCAweDAwMkM2NSwgMHgwMDAwNDIsCisJMHg0MDAwMEEsIDB4MDAwMEQ1LCAweDQ1NDEwNCwgMHgwMDAwMDcsCisJMHgwMDA2NTUsIDB4MDU0NTA0LCAweDM0RjI4NiwgMHgwMDAxRDUsCisJMHgwNTQ1MDQsIDB4MzRGMDg2LCAweDAwMkI2NSwgMHgwMDAwNDIsCisJMHgwMDNBRTUsIDB4NTAwMDRBLCAweDQwMDAwQSwgMHg0NUMzRDQsCisJMHgwMDAwMDcsIDB4NDU0NTA0LCAweDAwMDAwNywgMHgwMDAwQ0QsCisJMHg0NDQ5NDQsIDB4MDAwMDA3LCAweDQ1NDUwNCwgMHgwMDAwMDcsCisJMHgwMDAxNEQsIDB4NTU0OTQ0LCAweDAwMDAwNywgMHgwNDUxNDQsCisJMHgzNEU5ODYsIDB4MDAyQzY1LCAweDAwMDA0MiwgMHg0ODAwMEEsCisJMHg0Q0QxMDQsIDB4MDAwMDA3LCAweDA0QzE0NCwgMHgzNEYzODYsCisJMHgwMDAwMDcsIDB4MTYwMDA3LCAweDAwMkNFNSwgMHgwNDAwNDIsCisJMHg0MDAwMEEsIDB4MDA0MDIwLCAweDAwMDA0MCwgMHgwMDI5NjUsCisJMHgwMDAwNDIsIDB4NDAwMDBBLCAweDAwNDEwNCwgMHgzNTYwODYsCisJMHgwMDAwMDcsIDB4MDAyNDAyLCAweDM2QTIwNiwgMHgwMDVDMDIsCisJMHgwMDI1RTUsIDB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQyNzQsCisJMHgwMDJBRTUsIDB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQyNzQsCisJMHg1MDAxMTIsIDB4MDAyOUU1LCAweDAwMDA0MiwgMHg0MDAwMEEsCisJMHgwMDQyMzQsIDB4NDU0MTA0LCAweDAwMDAwNywgMHgwMDQwMjAsCisJMHgwMDAwNDAsIDB4MDAzRUU1LCAweDAwMDAyMCwgMHgwMDAwNDAsCisJMHgwMDJERTUsIDB4NDAwMTUyLCAweDUwMDAwQSwgMHgwNDUxNDQsCisJMHgzNjRBODYsIDB4MDAwMEM1LCAweDAwM0VFNSwgMHgwMDQwMjAsCisJMHgwMDAwNDAsIDB4MDAyQkU1LCAweDAwMDA0MiwgMHg0MDAwMEEsCisJMHg0MDQyNTQsIDB4MDAwMDA3LCAweDAwMkFFNSwgMHgwMDQwMjAsCisJMHgwMDAwNDAsIDB4NTAwMTMyLCAweDA0MDEzNCwgMHgwMDU2NzQsCisJMHgwMDI5RTUsIDB4MDIwMDQyLCAweDQyMDAwQSwgMHgwMDAwNDIsCisJMHg1MDAwMEEsIDB4MDU0MTdDLCAweDAwMjhFNSwgMHgwMDAwNDIsCisJMHg0ODAwMEEsIDB4MDAwMEM1LCAweDRDQzE0NCwgMHgzNzEwODYsCisJMHgwMDI2RTUsIDB4MDAyN0U1LCAweDAyMDA0MiwgMHg0MDAwNEEsCisJMHg1MDAwMEEsIDB4MDA0MjNDLCAweDAwNTY3QywgMHgwMDI4RTUsCisJMHgwMDQ4MjAsIDB4MDAwMDQwLCAweDI4MUQxMiwgMHgyODI1MTIsCisJMHgwMDFGNzIsIDB4MDAyOTY1LCAweDAwMDA0MiwgMHg0MDAwMEEsCisJMHgwMDQxMDQsIDB4MzdBQTg2LCAweDBFMDAwNywgMHgxNjAwMDcsCisJMHgxRTAwMDcsIDB4MDAzRUU1LCAweDAwMDA0MiwgMHg0MDAwMEEsCisJMHgwMDQxMDQsIDB4MzdFODg2LCAweDAwMkQ2NSwgMHgwMDAwNDIsCisJMHgyODM0MEEsIDB4MDAzNDY1LCAweDAyMDA0MiwgMHg0MjAwNEEsCisJMHgwMDQwMjAsIDB4NEEwMDRBLCAweDUwMDA0QSwgMHgwNUQyRjQsCisJMHg1NEQxMDQsIDB4MDA3MzVDLCAweDM4NTE4NiwgMHgwMDAwMDcsCisJMHgwMDA2MDYsIDB4MDgwMDA3LCAweDBDMDAwNywgMHgwODAwMDcsCisJMHgwQTAwMDcsIDB4MDAwMUU1LCAweDAyMDA0NSwgMHgwMDQwMjAsCisJMHgwMDAwNjAsIDB4MDAwMzY1LCAweDAwMDA0MCwgMHgwMDJFNjUsCisJMHgwMDFBMjAsIDB4MEExQTYwLCAweDAwMDA0MCwgMHgwMDM0NjUsCisJMHgwMjAwNDIsIDB4NDIwMDRBLCAweDAwNDAyMCwgMHg0QTAwNEEsCisJMHgwMDA2MDYsIDB4NTAwMDRBLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRFMtMUUgQ29udHJvbGxlciBJbnN0cnVjdGlvblJBTSBDb2RlCisvLwkxOTk5LzA2LzIxCisvLwlCdWY0NDEgc2xvdCBpcyBFbmFibGVkLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDA0LzA5ICBjcmVhdAorLy8gMDQvMTIgIHN0b3AgbmlzZSBmaXgKKy8vIDA2LzIxICBXb3JraW5nT2ZmIHRpbW1pbmcKK3N0YXRpYyB1MzIgQ250cmxJbnN0MUVbWURTWEdfQ1RSTExFTkdUSCAvIDRdID0geworCTB4MDAwMDA3LCAweDI0MDAwNywgMHgwQzAwMDcsIDB4MUMwMDA3LAorCTB4MDYwMDA3LCAweDcwMDAwMiwgMHgwMDAwMjAsIDB4MDMwMDQwLAorCTB4MDA3MTA0LCAweDAwNDI4NiwgMHgwMzAwNDAsIDB4MDAwRjBELAorCTB4MDAwODEwLCAweDIwMDQzQSwgMHgwMDAyODIsIDB4MDAwMjBELAorCTB4MDAwODEwLCAweDIwMDQzQSwgMHgwMDEyODIsIDB4MjAwRTgyLAorCTB4MDA4MDBELCAweDAwMDgxMCwgMHgyMDA0M0EsIDB4MDAxQTgyLAorCTB4MDM0NjBELCAweDAwMDgxMCwgMHgxMDA0M0EsIDB4MDJFQzBELAorCTB4MDAwODEwLCAweDE4MDQzQSwgMHgwMDAxMEQsIDB4MDIwMDE1LAorCTB4MDAwMEZELCAweDAwMDAyMCwgMHgwMzg4NjAsIDB4MDM5MDYwLAorCTB4MDM4MDYwLCAweDAzODA0MCwgMHgwMzgwNDAsIDB4MDM4MDQwLAorCTB4MDE4MDQwLCAweDAwMEE3RCwgMHgwMzgwNDAsIDB4MDM4MDQwLAorCTB4MDE4MDQwLCAweDIwMDQwMiwgMHgwMDA4ODIsIDB4MDgwMDFBLAorCTB4MDAwOTA0LCAweDAxNzE4NiwgMHgwMDAwMDcsIDB4MjYwMDA3LAorCTB4NDAwMDA3LCAweDAwMDAwNywgMHgwMzI1OEQsIDB4MDAwODEwLAorCTB4MTgwNDNBLCAweDI2MDAwNywgMHgyODQ0MDIsIDB4MDAwODdELAorCTB4MDE4MDQyLCAweDAwMTYwQSwgMHgwNUEyMDYsIDB4MDAwMDA3LAorCTB4NDQwMDA3LCAweDAwMjMwRCwgMHgwMDA4MTAsIDB4MDgwNDNBLAorCTB4MjJGQTA2LCAweDAwMDAwNywgMHgwMDA3RkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgwMkFCODYsIDB4MDAwMTk1LAorCTB4MDkwRDA0LCAweDAwMDAwNywgMHgwMDA4MjAsIDB4MDAwMEY1LAorCTB4MDAwQjdELCAweDAxRjA2MCwgMHgwMDAwRkQsIDB4MDMzQTA2LAorCTB4MDE4MDQwLCAweDAwMEE3RCwgMHgwMzgwNDIsIDB4MTM4MDRBLAorCTB4MTgwMDBBLCAweDAwMTgyMCwgMHgwNTkwNjAsIDB4MDU4ODYwLAorCTB4MDE4MDQwLCAweDAwMDBGRCwgMHgwMTgwNDIsIDB4NzAwMDBBLAorCTB4MDAwMTE1LCAweDA3MTE0NCwgMHgwMzNCODYsIDB4MDMwMDAwLAorCTB4MDA3MDIwLCAweDAzNjIwNiwgMHgwMTgwNDAsIDB4MDAzNjBELAorCTB4MDAwODEwLCAweDA4MDQzQSwgMHgyMzIyMDYsIDB4MDAwMDA3LAorCTB4MDJFQzBELCAweDAwMDgxMCwgMHgxODA0M0EsIDB4MDE5QTA2LAorCTB4MDAwMDA3LCAweDI0MDAwNywgMHgwMDBGOEQsIDB4MDAwODEwLAorCTB4MDAxNjNBLCAweDAwMjQwMiwgMHgwMDVDMDIsIDB4MDAyOEZELAorCTB4MDAwMDIwLCAweDAxODA0MCwgMHgwODAwMEQsIDB4MDAwODE1LAorCTB4NTEwOTg0LCAweDAwMDAwNywgMHgwMDAwNEQsIDB4MDAwRTVELAorCTB4MDAwRTAyLCAweDAwNDMwRCwgMHgwMDA4MTAsIDB4MDgwNDNBLAorCTB4MkUxMjA2LCAweDAwMDAwNywgMHgwMDAwOEQsIDB4MDAwOTI0LAorCTB4MDAwRjAyLCAweDAwNDcwRCwgMHgwMDA4MTAsIDB4MDgwNDNBLAorCTB4MkUxMjA2LCAweDAwMDAwNywgMHg0ODA0ODAsIDB4MDAxMjEwLAorCTB4MjgwNDNBLCAweDAwNzc4RCwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MDAwNjhELCAweDAwMDgxMCwgMHgyODE0M0EsIDB4Mjg0NDAyLAorCTB4MDMyNThELCAweDAwMDgxMCwgMHgxODA0M0EsIDB4MDdGRjhELAorCTB4MDAwODIwLCAweDAwMDJGRCwgMHgwMTgwNDAsIDB4MjYwMDA3LAorCTB4MjAwMDA3LCAweDAwMDJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDA1MTI4NiwgMHgwMDAwMDcsIDB4MjQwMDA3LAorCTB4MDJFQzBELCAweDAwMDgxMCwgMHgxODA0M0EsIDB4MDAzODdELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDEwMTUsIDB4MDEwOTg0LAorCTB4MDE5Qjg2LCAweDAwMDAwNywgMHgwMUIyMDYsIDB4MDAwMDA3LAorCTB4MDAwOEZELCAweDAxODA0MiwgMHgxODAwMEEsIDB4MDAxOTA0LAorCTB4MjJCODg2LCAweDI4MDAwNywgMHgwMDE4MTAsIDB4MjgwNDNBLAorCTB4MjgwQzAyLCAweDAwMDAwRCwgMHgwMDA4MTAsIDB4MjgxNDNBLAorCTB4MDg4MDhELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwMDIwRCwgMHgxODk5MDQsIDB4MDAwMDA3LAorCTB4MDA0MDJELCAweDAwMDBCRCwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgwNjVBODYsIDB4MDAwMDA3LAorCTB4MDAwMTAwLCAweDAwMEEyMCwgMHgwMDA0N0QsIDB4MDE4MDQwLAorCTB4MDE4MDQyLCAweDIwMDAwQSwgMHgwMDMwMTUsIDB4MDEyMTQ0LAorCTB4MDM2MTg2LCAweDAwMDAwNywgMHgwMDIxMDQsIDB4MDM2MTg2LAorCTB4MDAwMDA3LCAweDAwMEY4RCwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MDIzOTQ0LCAweDA3Qzk4NiwgMHgwMDAwMDcsIDB4MDAxODEwLAorCTB4MjgwNDNBLCAweDA4ODEwRCwgMHgwMDA4MjAsIDB4MDAwMkZELAorCTB4MDE4MDQwLCAweDIwMDAwNywgMHgwMDI4MTAsIDB4NzgwMDNBLAorCTB4MDA3ODhELCAweDAwMDgxMCwgMHgwODA0M0EsIDB4MkExMjA2LAorCTB4MDAwMDA3LCAweDAwNDAwRCwgMHgwMDEwMTUsIDB4MTg5OTA0LAorCTB4MjkyOTA0LCAweDM5MzkwNCwgMHgwMDAwMDcsIDB4MDcwMjA2LAorCTB4MDAwMDA3LCAweDAwMDRGNSwgMHgwMDAwN0QsIDB4MDAwMDIwLAorCTB4MDAwMDhELCAweDAxMDg2MCwgMHgwMTgwNDAsIDB4MDAwNDdELAorCTB4MDM4MDQyLCAweDIxODA0QSwgMHgxODAwMEEsIDB4MDIxOTQ0LAorCTB4MjI5MDg2LCAweDAwMDAwNywgMHgwMDQwNzUsIDB4NzFGMTA0LAorCTB4MDAwMDA3LCAweDAxMDA0MiwgMHgyODAwMEEsIDB4MDAyOTA0LAorCTB4MjI1ODg2LCAweDAwMDAwNywgMHgwMDNDMEQsIDB4MzBBOTA0LAorCTB4MDAwMDA3LCAweDAwMDc3RCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDA4REE4NiwgMHgwMDA1N0QsIDB4MDAyODIwLAorCTB4MDNCMDYwLCAweDA4RjIwNiwgMHgwMTgwNDAsIDB4MDAzMDIwLAorCTB4MDNBODYwLCAweDAxODA0MCwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgwOEZBODYsIDB4MDAwMDA3LAorCTB4MDAwNTdELCAweDAxODA0MiwgMHgyODA0MEEsIDB4MDAwRThELAorCTB4MDAwODEwLCAweDI4MEMzQSwgMHgwMDAwMEQsIDB4MDAwODEwLAorCTB4MjgxNDNBLCAweDA5MDAwRCwgMHgwMDA4MjAsIDB4MDAwMkZELAorCTB4MDE4MDQwLCAweDIwMDAwNywgMHgwMDNERkQsIDB4MDAwMDIwLAorCTB4MDE4MDQwLCAweDAwMTA3RCwgMHgwMDlEOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJBMTIwNiwgMHgwMDAwMDcsIDB4MDAwODE1LAorCTB4MDgwMDFBLCAweDAxMDk4NCwgMHgwQTUxODYsIDB4MDAxMzdELAorCTB4MjAwNTAwLCAweDI4MEYyMCwgMHgzMzhGNjAsIDB4M0I4RjYwLAorCTB4NDM4RjYwLCAweDRCOEY2MCwgMHg1MzhGNjAsIDB4NUI4RjYwLAorCTB4MDM4QTYwLCAweDAxODA0MCwgMHgwMDEwN0QsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDIxNSwgMHgwMTA5ODQsIDB4M0E4MTg2LAorCTB4MDAwMDA3LCAweDAwN0ZCRCwgMHgzODNEQzQsIDB4MDAwMDA3LAorCTB4MDAxQTdELCAweDAwMTM3NSwgMHgwMTgwNDIsIDB4MDkwMDRBLAorCTB4MTAwMDBBLCAweDBCOEQwNCwgMHgxMzk1MDQsIDB4MDAwMDA3LAorCTB4MDAwODIwLCAweDAxOTA2MCwgMHgwMDExMDQsIDB4MjI1ODg2LAorCTB4MDEwMDQwLCAweDAwMTdGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDIyNUE4NiwgMHgwMDAwMDcsIDB4MDAxOTdELAorCTB4MDM4MDQyLCAweDA5ODA0QSwgMHgxMDAwMEEsIDB4MDAwOTI0LAorCTB4MDAxNjY0LCAweDAwMTFGRCwgMHgwMzgwNDIsIDB4MkI4MDRBLAorCTB4MTk4MDRBLCAweDAwMDA4RCwgMHgyMTg5NDQsIDB4MDAwMDA3LAorCTB4MDAyMjQ0LCAweDBDMTk4NiwgMHgwMDAwMDcsIDB4MDAxQTY0LAorCTB4MDAyQTI0LCAweDAwMTk3RCwgMHgwODAxMDIsIDB4MTAwMTIyLAorCTB4MDAwODIwLCAweDAzOTA2MCwgMHgwMTgwNDAsIDB4MDAzREZELAorCTB4MDAwMDhELCAweDAwMDgyMCwgMHgwMTgwNDAsIDB4MDAxMzc1LAorCTB4MDAxQTdELCAweDAxMDA0MiwgMHgwOTgwNEEsIDB4MTAwMDBBLAorCTB4MDAwMjFELCAweDAxODlFNCwgMHgyOTkyRTQsIDB4MzA5MTQ0LAorCTB4MDAwMDA3LCAweDAwMDYwRCwgMHgwMDBBMTUsIDB4MDAwQzFELAorCTB4MDAxMDI1LCAweDAwQTlFNCwgMHgwMTJCRTQsIDB4MDAwNDY0LAorCTB4MDFCM0U0LCAweDAyMzJFNCwgMHgwMDA0NjQsIDB4MDAwNDY0LAorCTB4MDAwNDY0LCAweDAwMDQ2NCwgMHgwMDA0MEQsIDB4MDhCMUM0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMDBCRjUsIDB4MDMwMDQwLAorCTB4MDAxOTdELCAweDAzODA0MiwgMHgwOTgwNEEsIDB4MDAwQTI0LAorCTB4MDgwMDBBLCAweDA4MEU2NCwgMHgwMDAwMDcsIDB4MTAwMTIyLAorCTB4MDAwODIwLCAweDAzMTA2MCwgMHgwMTAwNDAsIDB4MDA2NEFDLAorCTB4MDAwMjdELCAweDAwMDAyMCwgMHgwMTgwNDAsIDB4MDAxMDdELAorCTB4MDE4MDQyLCAweDAwMTFGRCwgMHgzQjgwNEEsIDB4MDk4MDRBLAorCTB4MjAwMDBBLCAweDAwMDA5NSwgMHgxQTExNDQsIDB4MDBBMTQ0LAorCTB4MEU1ODg2LCAweDAwMDQwRCwgMHgwMEI5ODQsIDB4MEU1OTg2LAorCTB4MDAxOEZELCAweDAxODA0MiwgMHgwMDEwRkQsIDB4MDk4MDRBLAorCTB4MjgwMDBBLCAweDAwMDA5NSwgMHgwMTA5MjQsIDB4MDAyQTY0LAorCTB4MEU0OTg2LCAweDAwMDAwNywgMHgwMDI5MDQsIDB4MEU1QTg2LAorCTB4MDAwMDA3LCAweDBFNjIwNiwgMHgwODAwMDIsIDB4MDAwMDhELAorCTB4MDAzODdELCAweDAwMDgyMCwgMHgwMTgwNDAsIDB4MDAxMjdELAorCTB4MDE4MDQyLCAweDEwMDAwQSwgMHgwMDM5MDQsIDB4MEYwOTg2LAorCTB4MDAwODBELCAweDdGRkZCNSwgMHgwMEI5ODQsIDB4MEVEOTg2LAorCTB4MDAwMDI1LCAweDBGQjIwNiwgMHgwMDAwMkQsIDB4MDAwMDE1LAorCTB4MDAwODJELCAweDAyRTAwRCwgMHgwMDA4MjAsIDB4MEZGQTA2LAorCTB4MDAwMDBELCAweDdGODAzNSwgMHgwMEI5ODQsIDB4MEZBOTg2LAorCTB4NDAwMDI1LCAweDAwMDA4RCwgMHgxMTA5NDQsIDB4MDAwMDA3LAorCTB4MDAwMThELCAweDEwOTUwNCwgMHgwMDAwMDcsIDB4MDA5MTY0LAorCTB4MDAwNDI0LCAweDAwMDQyNCwgMHgwMDA0MjQsIDB4MTAwMTAyLAorCTB4MjgwMDAyLCAweDAyREYwRCwgMHgwMDA4MjAsIDB4MEZGQTA2LAorCTB4MDAwMThELCAweDAwMDQyRCwgMHgwMDAwOEQsIDB4MTA5NTA0LAorCTB4MDAwMDA3LCAweDAwMDIwRCwgMHgxMDkxODQsIDB4MDAwMDA3LAorCTB4MDJERjhELCAweDAwMDgyMCwgMHgwMDAwOEQsIDB4MDAzOEZELAorCTB4MDE4MDQwLCAweDAwM0JGRCwgMHgwMDEwMjAsIDB4MDNBODYwLAorCTB4MDAwODE1LCAweDMxMzE4NCwgMHgyMTIxODQsIDB4MDAwMDA3LAorCTB4MDNCMDYwLCAweDAzQTA2MCwgMHgwMTgwNDAsIDB4MDAyMkZELAorCTB4MDAwMDk1LCAweDAxMDkyNCwgMHgwMDA0MjQsIDB4MDAwNDI0LAorCTB4MDAxMjY0LCAweDEwMDEwMiwgMHgwMDA4MjAsIDB4MDM5MDYwLAorCTB4MDE4MDQwLCAweDAwMTkyNCwgMHgwMTBGMEQsIDB4MDAzOTdELAorCTB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsIDB4MDk4NDRBLAorCTB4MDAwNjA2LCAweDA4MDQwQSwgMHgwMDA0MjQsIDB4MDAwNDI0LAorCTB4MDAxMTdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwQTI0LAorCTB4MjgwNTAyLCAweDI4MEMwMiwgMHgwOTgwMEQsIDB4MDAwODIwLAorCTB4MDAwMkZELCAweDAxODA0MCwgMHgyMDAwMDcsIDB4MDAyMkZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDAwOTUsIDB4MjgwREM0LAorCTB4MDExOTI0LCAweDAwMTk3RCwgMHgwMTgwNDIsIDB4MDAxMUZELAorCTB4MDk4MDRBLCAweDEwMDAwQSwgMHgwMDAwQjUsIDB4MTEzMTQ0LAorCTB4MEE4RDA0LCAweDAwMDAwNywgMHgwODBBNDQsIDB4MTI5NTA0LAorCTB4MDAwMDA3LCAweDAwMjNGRCwgMHgwMDEwMjAsIDB4MDM4MDQwLAorCTB4MTAxMjQ0LCAweDAwMDAwNywgMHgwMDA4MjAsIDB4MDM5MDYwLAorCTB4MDE4MDQwLCAweDAwMDJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDEyMzI4NiwgMHgwMDAwMDcsIDB4MDAzQkZELAorCTB4MDAwMTAwLCAweDAwMEExMCwgMHgwQjgwN0EsIDB4MTM4MDRBLAorCTB4MDkwOTg0LCAweDAwMDAwNywgMHgwMDAwOTUsIDB4MDEzRDA0LAorCTB4MTJCODg2LCAweDEwMDAwQSwgMHgxMDAwMDIsIDB4MDkwOTg0LAorCTB4MDAwMDA3LCAweDAzODA0MiwgMHgxMTgwNEEsIDB4MDkwRDA0LAorCTB4MDAwMDA3LCAweDEwMDAwQSwgMHgwOTBEODQsIDB4MDAwMDA3LAorCTB4MDAyNTdELCAweDAwMDgyMCwgMHgwMTgwNDAsIDB4MDAwMTBELAorCTB4MDAwODEwLCAweDI4MTQzQSwgMHgwMDEyN0QsIDB4MDE4MDQyLAorCTB4MjAwMDBBLCAweDAwMTk3RCwgMHgwMTgwNDIsIDB4MDAxMTdELAorCTB4MzE4MDRBLCAweDEwMDAwQSwgMHgwMDMxMjQsIDB4MDEzQjhELAorCTB4MDAzOTdELCAweDAwMDgyMCwgMHgwNTgwNDAsIDB4MDM4MDQyLAorCTB4MDk4NDRBLCAweDAwMDYwNiwgMHgwODA0MEEsIDB4MzAwMTAyLAorCTB4MDAzMTI0LCAweDAwMDQyNCwgMHgwMDA0MjQsIDB4MDAxMjI0LAorCTB4MjgwNTAyLCAweDAwMUE0QywgMHgxNDM5ODYsIDB4NzAwMDAyLAorCTB4MDAwMDJELCAweDAzMDAwMCwgMHgwMDM4N0QsIDB4MDE4MDQyLAorCTB4MTAwMDBBLCAweDE0NjIwNiwgMHgwMDIxMjQsIDB4MDAwMEFELAorCTB4MTAwMDAyLCAweDAwMDEwRCwgMHgwMDA5MjQsIDB4MDA2QjI0LAorCTB4MDE0QTBELCAweDAwMzk3RCwgMHgwMDA4MjAsIDB4MDU4MDQwLAorCTB4MDM4MDQyLCAweDA5ODQ0QSwgMHgwMDA2MDYsIDB4MDgwNDBBLAorCTB4MDAzMjY0LCAweDAwMDA4RCwgMHgwMDBBMjQsIDB4MDAxMDIwLAorCTB4MDAyMjdELCAweDAxODA0MCwgMHgwMTRGOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJCNUEwNiwgMHgwMDAwMDcsIDB4MDAyODIwLAorCTB4MDAyMDdELCAweDAxODA0MCwgMHgwMDExN0QsIDB4MDM4MDQyLAorCTB4MTM4MDRBLCAweDMzODAwQSwgMHgwMDM4N0QsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgxNzcyODYsIDB4MDAwMDA3LAorCTB4MDAwMDhELCAweDAzMDk2NCwgMHgwMTVCMEQsIDB4MDAzOTdELAorCTB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsIDB4MDk4NDRBLAorCTB4MDAwNjA2LCAweDA4MDQwQSwgMHgzODAxMDIsIDB4MDAwNDI0LAorCTB4MDAwNDI0LCAweDAwMTIyNCwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgxNURBODYsIDB4MDAwMDA3LAorCTB4MjgwNTAyLCAweDAwMUE0QywgMHgxNzcxODYsIDB4MDAwMDA3LAorCTB4MDMyMTY0LCAweDAwNjMyQywgMHgwMDNERkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDA5NSwgMHgwOTA5MDQsIDB4MDAwMDA3LAorCTB4MDAwODIwLCAweDAwMUE0QywgMHgxNjk5ODYsIDB4MDE4MDQwLAorCTB4MDMwMDAwLCAweDE2QjIwNiwgMHgwMDIxMjQsIDB4MDAwMTBELAorCTB4MDAwOTI0LCAweDAwNkIyNCwgMHgwMTZGMEQsIDB4MDAzOTdELAorCTB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsIDB4MDk4NDRBLAorCTB4MDAwNjA2LCAweDA4MDQwQSwgMHgwMDNBNjQsIDB4MDAwMDk1LAorCTB4MDAxMjI0LCAweDAwMDJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDE3MTI4NiwgMHgwMDAwMDcsIDB4MDE3NjBELAorCTB4MDAwODEwLCAweDA4MDQzQSwgMHgyQjVBMDYsIDB4MDAwMDA3LAorCTB4MTYwQTA2LCAweDAwMDAwNywgMHgwMDcwMjAsIDB4MDgwMTBBLAorCTB4MTAwMTJBLCAweDAwMjBGRCwgMHgwMzg4NjAsIDB4MDM5MDYwLAorCTB4MDE4MDQwLCAweDAwMjI3RCwgMHgwMTgwNDIsIDB4MDAzREZELAorCTB4MDgwMDBBLCAweDMxODQ0QSwgMHgwMDA5MDQsIDB4MTgxMDg2LAorCTB4MTgwMDhCLCAweDAwMDA4RCwgMHgxODk5MDQsIDB4MDAzMTJDLAorCTB4MThFMjA2LCAweDAwMDAwNywgMHgwMDMyNEMsIDB4MTg2Qjg2LAorCTB4MDAwMDA3LCAweDAwMTkwNCwgMHgxODY4ODYsIDB4MDAwMDA3LAorCTB4MDAwMDk1LCAweDE5OTE0NCwgMHgwMDIyMkMsIDB4MDAzMTI0LAorCTB4MDA2MzZDLCAweDAwMEUzRCwgMHgwMDEzNzUsIDB4MDAwQkZELAorCTB4MDEwMDQyLCAweDA5ODA0QSwgMHgxMDAwMEEsIDB4MDM4QUVDLAorCTB4MDM5M0VDLCAweDAwMjI0QywgMHgxOEUxODYsIDB4MDAwMDA3LAorCTB4MDAwMDhELCAweDE4OTkwNCwgMHgwMDIyNkMsIDB4MDAzMjJDLAorCTB4MzAwNTBBLCAweDMwMURBQiwgMHgwMDIwODMsIDB4MDAxOEZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMTg5MjQsIDB4MzAwNTAyLAorCTB4MDAxMDgzLCAweDAwMTg3NSwgMHgwMTAwNDIsIDB4MTAwMDBBLAorCTB4MDAwMDhELCAweDAxMDkyNCwgMHgwMDEzNzUsIDB4MzMwNTQyLAorCTB4MzMwQ0NCLCAweDMzMkNDQiwgMHgzMzM0Q0IsIDB4MzMzQ0NCLAorCTB4MzM0NENCLCAweDMzNENDQiwgMHgzMzU0Q0IsIDB4MzA1QzhCLAorCTB4MDA2MDgzLCAweDAwMDJGNSwgMHgwMTAwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDE5QjI4NiwgMHgwMDAwMDcsIDB4MDAxRTJELAorCTB4MDAwNUZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDI4OTI0LAorCTB4MjgwNTAyLCAweDAwMDYwRCwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MDAwMDhELCAweDAwMDgxMCwgMHgyODE0M0EsIDB4MEE4MDhELAorCTB4MDAwODIwLCAweDAwMDJGNSwgMHgwMTAwNDAsIDB4MjIwMDA3LAorCTB4MDAxMjc1LCAweDAzMDA0MiwgMHgyMTAwNEEsIDB4MDAwMDhELAorCTB4MUEwOTQ0LCAweDAwMDAwNywgMHgwMUFCOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJDQUEwNiwgMHgwMDAwMDcsIDB4MDAwMUY1LAorCTB4MDMwMDQyLCAweDBEMDA0QSwgMHgxMDAwMEEsIDB4MDg5MTQ0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTAwNDAsIDB4MDAyNUY1LAorCTB4MEEzMTQ0LCAweDAwMDAwNywgMHgwMDA4MjAsIDB4MDMyODYwLAorCTB4MDMwMDQwLCAweDAwMjE3RCwgMHgwMzgwNDIsIDB4MEI4MDRBLAorCTB4MTAwMDBBLCAweDAwMDgyMCwgMHgwMzEwNjAsIDB4MDMwMDQwLAorCTB4MDAwMDhELCAweDAwMDEyNCwgMHgwMDAxMkMsIDB4MDAwRTY0LAorCTB4MDAxQTY0LCAweDAwNjM2QywgMHgwODAxMEEsIDB4MTAwMTJBLAorCTB4MDAwODIwLCAweDAzMTA2MCwgMHgwMzAwNDAsIDB4MDAyMEZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDIyN0QsIDB4MDE4MDQyLAorCTB4MTAwMDBBLCAweDAwMDgyMCwgMHgwMzEwNjAsIDB4MDMwMDQwLAorCTB4MDAxOTdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAyMkZELAorCTB4MDM4MDQyLCAweDEwMDAwQSwgMHgwMDA4MjAsIDB4MDMxMDYwLAorCTB4MDMwMDQwLCAweDA5MEQwNCwgMHgwMDAwMDcsIDB4MDAwODIwLAorCTB4MDMwMDQwLCAweDAzODA0MiwgMHgwQjgwNEEsIDB4MTAwMDBBLAorCTB4MDAwODIwLCAweDAzMTA2MCwgMHgwMzAwNDAsIDB4MDM4MDQyLAorCTB4MTM4MDRBLCAweDE5ODA0QSwgMHgxMTBEMDQsIDB4MTk4RDA0LAorCTB4MDAwMDA3LCAweDA4MDAwQSwgMHgwMDEwMjAsIDB4MDMxODYwLAorCTB4MDMwODYwLCAweDAzMDA0MCwgMHgwMDAwOEQsIDB4MEIwOTQ0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTAwNDAsIDB4MDAwNUY1LAorCTB4MDMwMDQyLCAweDA4MDAwQSwgMHgwMDA4MjAsIDB4MDEwMDQwLAorCTB4MDAwMEY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MUQ5ODg2LCAweDAwMUU3NSwgMHgwMzAwNDIsIDB4MDEwNDRBLAorCTB4MDAwQzBBLCAweDFEQUEwNiwgMHgwMDAwMDcsIDB4MDAwNDAyLAorCTB4MDAwQzAyLCAweDAwMTc3RCwgMHgwMDFBRjUsIDB4MDE4MDQyLAorCTB4MDMxNDRBLCAweDAzMUM0QSwgMHgwMzI0NEEsIDB4MDMyQzRBLAorCTB4MDMzNDRBLCAweDAzM0M0QSwgMHgwMzQ0NEEsIDB4MDA0QzBBLAorCTB4MDAwNDNELCAweDAwMTNGNSwgMHgwMDFBRkQsIDB4MDMwMDQyLAorCTB4MEIwMDRBLCAweDFCODA0QSwgMHgxMzgwNEEsIDB4MjAwMDBBLAorCTB4MDg5MTQ0LCAweDE5QTE0NCwgMHgwMzg5RTQsIDB4MDM5OUVDLAorCTB4MDA1NTAyLCAweDAwNUQwQSwgMHgwMzAwNDIsIDB4MEIwMDRBLAorCTB4MUI4MDRBLCAweDEzODA0QSwgMHgyMDAwMEEsIDB4MDg5MTQ0LAorCTB4MTlBMTQ0LCAweDAzODlFNCwgMHgwMzk5RUMsIDB4MDA2NTAyLAorCTB4MDA2RDBBLCAweDAzMDA0MiwgMHgwQjAwNEEsIDB4MTkwMDRBLAorCTB4MkI4MDRBLCAweDEzODA0QSwgMHgyMTgwNEEsIDB4MzAwMDBBLAorCTB4MDg5MTQ0LCAweDE5QTE0NCwgMHgyQUIxNDQsIDB4MDM4OUU0LAorCTB4MDM5OUVDLCAweDAwNzUwMiwgMHgwMDdEMEEsIDB4MDNBOUU0LAorCTB4MDAwNzAyLCAweDAwMTA3RCwgMHgwMDA0MTUsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAxMDlFNCwgMHgwMDBGMDIsIDB4MDAyQUY1LAorCTB4MDAxOUZELCAweDAxMDA0MiwgMHgwOTgwNEEsIDB4MTAwMDBBLAorCTB4MDAwOTM0LCAweDAwMTY3NCwgMHgwMDI5RjUsIDB4MDEwMDQyLAorCTB4MTAwMDBBLCAweDAwOTE3QywgMHgwMDIwNzUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgyMDBBODYsIDB4MDAyNkY1LAorCTB4MDAyN0Y1LCAweDAzMDA0MiwgMHgwOTAwNEEsIDB4MTAwMDBBLAorCTB4MDAwQTNDLCAweDAwMTY3QywgMHgwMDFBNzUsIDB4MDAwQkZELAorCTB4MDEwMDQyLCAweDUxODA0QSwgMHg0ODAwMEEsIDB4MTYwMDA3LAorCTB4MDAxMDc1LCAweDAxMDA0MiwgMHgyODJDMEEsIDB4MjgxRDEyLAorCTB4MjgyNTEyLCAweDAwMUYzMiwgMHgxRTAwMDcsIDB4MEUwMDA3LAorCTB4MDAxOTc1LCAweDAxMDA0MiwgMHgwMDJERjUsIDB4MEQwMDRBLAorCTB4MTAwMDBBLCAweDAwOTE0NCwgMHgyMEVBODYsIDB4MDEwMDQyLAorCTB4MjgzNDBBLCAweDAwMEU1RCwgMHgwMDAwOEQsIDB4MDAwMzc1LAorCTB4MDAwODIwLCAweDAxMDA0MCwgMHgwNUQyRjQsIDB4NTREMTA0LAorCTB4MDA3MzVDLCAweDIxOEI4NiwgMHgwMDAwMDcsIDB4MEMwMDA3LAorCTB4MDgwMDA3LCAweDBBMDAwNywgMHgwMjE3OEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDM0QjIwNiwgMHgwMDAwMDcsIDB4MjE5MjA2LAorCTB4MDAwMDA3LCAweDA4MDAwNywgMHgwMDIyNzUsIDB4MDEwMDQyLAorCTB4MjAwMDBBLCAweDAwMjEwNCwgMHgyMjU4ODYsIDB4MDAxRTJELAorCTB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MjFDQTg2LCAweDAwMDAwNywgMHgwMDIwMTAsIDB4MzAwNDNBLAorCTB4MDAwNTdELCAweDAxODBDMywgMHgwODAwMEEsIDB4MDI4OTI0LAorCTB4MjgwNTAyLCAweDI4MEMwMiwgMHgwQTgxMEQsIDB4MDAwODIwLAorCTB4MDAwMkY1LCAweDAxMDA0MCwgMHgyMjAwMDcsIDB4MDAwNEZELAorCTB4MDE4MDQyLCAweDcwMDAwQSwgMHgwMzAwMDAsIDB4MDA3MDIwLAorCTB4MDdGQTA2LCAweDAxODA0MCwgMHgwMjJCOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJDQUEwNiwgMHgwMDAwMDcsIDB4MDAwMkZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MjJDMjg2LAorCTB4MDAwMDA3LCAweDAyMDIwNiwgMHgwMDAwMDcsIDB4MDAwODc1LAorCTB4MDAwOUZELCAweDAwMDEwRCwgMHgyMzQyMDYsIDB4MDAwMjk1LAorCTB4MDAwQjc1LCAweDAwMDk3RCwgMHgwMDAwMEQsIDB4MDAwNTE1LAorCTB4MDEwMDQyLCAweDE4MDAwQSwgMHgwMDE5MDQsIDB4MkEwMDg2LAorCTB4MDAwNkY1LCAweDAwMTAyMCwgMHgwMTAwNDAsIDB4MDAwNEY1LAorCTB4MDAwODIwLCAweDAxMDA0MCwgMHgwMDA3NzUsIDB4MDEwMDQyLAorCTB4MDk4MDRBLCAweDEwMDAwQSwgMHgwMDExMjQsIDB4MDAwOTA0LAorCTB4MjNGMjg2LCAweDAwMDgxNSwgMHgwODAxMDIsIDB4MTAxMjA0LAorCTB4MjQxMjA2LCAweDAwMDU3NSwgMHgwODEyMDQsIDB4MDAwMDA3LAorCTB4MTAwMTAyLCAweDAwMDU3NSwgMHgwMDA0MjUsIDB4MDIxMTI0LAorCTB4MTAwMTAyLCAweDAwMDgyMCwgMHgwMzEwNjAsIDB4MDEwMDQwLAorCTB4MDAxOTI0LCAweDJBMDA4NiwgMHgwMDAwOEQsIDB4MDAwNDY0LAorCTB4MDA5RDA0LCAweDI5MTA4NiwgMHgxODAxMDIsIDB4MDAwNTc1LAorCTB4MDEwMDQyLCAweDI4MDQwQSwgMHgwMDAxOEQsIDB4MDAwOTI0LAorCTB4MjgwRDAyLCAweDAwMDAwRCwgMHgwMDA5MjQsIDB4MjgxNTAyLAorCTB4MTAwMDBELCAweDAwMDgyMCwgMHgwMDAyRjUsIDB4MDEwMDQwLAorCTB4MjAwMDA3LCAweDAwMTE3NSwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgyNEZBODYsIDB4MDAwMDA3LAorCTB4MDAwMTAwLCAweDA4MEIyMCwgMHgxMzBCNjAsIDB4MUIwQjYwLAorCTB4MDMwQTYwLCAweDAxMDA0MCwgMHgwNTAwNDIsIDB4M0QwMDRBLAorCTB4MzUwMDRBLCAweDJEMDA0QSwgMHgyMDAwMEEsIDB4MDAwNkY1LAorCTB4MDEwMDQyLCAweDI4MTQwQSwgMHgwMDA0RjUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMDMxNSwgMHgwMTBEMDQsIDB4MjYwMjg2LAorCTB4MDA0MDE1LCAweDAwMDA5NSwgMHgwMTBEMDQsIDB4MjVGMDg2LAorCTB4MTAwMDIyLCAweDEwMDAyQSwgMHgyNjFBMDYsIDB4MDAwMDA3LAorCTB4MzMzMTA0LCAweDJBQTkwNCwgMHgwMDAwMDcsIDB4MDMyMTI0LAorCTB4MjgwNTAyLCAweDI4NDQwMiwgMHgwMDExMjQsIDB4NDAwMTAyLAorCTB4MDAwNDI0LCAweDAwMDQyNCwgMHgwMDMyMjQsIDB4MDAyOTJDLAorCTB4MDA2MzZDLCAweDI3NzM4NiwgMHgwMDAwMDcsIDB4MDJCMTY0LAorCTB4MDAwNDY0LCAweDAwMDQ2NCwgMHgwMDAwOEQsIDB4MDAwQTY0LAorCTB4MjgwRDAyLCAweDEwMDA4RCwgMHgwMDA4MjAsIDB4MDAwMkY1LAorCTB4MDEwMDQwLCAweDIyMDAwNywgMHgwMDAwOEQsIDB4MzhCOTA0LAorCTB4MDAwMDA3LCAweDAzMjk2QywgMHgzMDAxMEEsIDB4MDAwMkY1LAorCTB4MDEwMDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MjcwMjg2LAorCTB4MDAwMDA3LCAweDAwMjEyQywgMHgyODA1MEEsIDB4MDAzMTZDLAorCTB4MDAwNDZDLCAweDAwMDQ2QywgMHgyODQ1MEEsIDB4MDAxMTI0LAorCTB4MDA2QjY0LCAweDEwMDEwMiwgMHgwMDAwOEQsIDB4MDEwOTZDLAorCTB4MjgwRDBBLCAweDEwMDEwRCwgMHgwMDA4MjAsIDB4MDAwMkY1LAorCTB4MDEwMDQwLCAweDIyMDAwNywgMHgwMDQxMjQsIDB4MDAwNDI0LAorCTB4MDAwNDI0LCAweDAwMzIyNCwgMHgzMDAxMDIsIDB4MDMyOTQ0LAorCTB4MjdGQTg2LCAweDAwMDAwNywgMHgzMDAwMDIsIDB4MDAwNEY1LAorCTB4MDEwMDQyLCAweDA4MDAwQSwgMHgwMDAzMTUsIDB4MDEwRDA0LAorCTB4Mjg0MDg2LCAweDAwMzEyNCwgMHgwMDA0NjQsIDB4MzAwMTAyLAorCTB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4Mjg0QTg2LCAweDAwMDAwNywgMHgyODQ0MDIsIDB4MDAzMTI0LAorCTB4MzAwNTAyLCAweDAwMzkyNCwgMHgzMDA1ODMsIDB4MDAwODgzLAorCTB4MDAwNUY1LCAweDAxMDA0MiwgMHgyODA0MEEsIDB4MDAwMDhELAorCTB4MDA4MTI0LCAweDI4MEQwMiwgMHgwMDAwOEQsIDB4MDA4MTI0LAorCTB4MjgxNTAyLCAweDEwMDE4RCwgMHgwMDA4MjAsIDB4MDAwMkY1LAorCTB4MDEwMDQwLCAweDIyMDAwNywgMHgwMDEwMjUsIDB4MDAwNTc1LAorCTB4MDMwMDQyLCAweDA5MDA0QSwgMHgxMDAwMEEsIDB4MEEwOTA0LAorCTB4MTIxMTA0LCAweDAwMDAwNywgMHgwMDEwMjAsIDB4MDUwODYwLAorCTB4MDUwMDQwLCAweDAwMDZGRCwgMHgwMTgwNDIsIDB4MDkwMDRBLAorCTB4MTAwMDBBLCAweDAwMDBBNSwgMHgwQTA5MDQsIDB4MTIxMTA0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTkwNjAsIDB4MDEwMDQwLAorCTB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MjlDQTg2LCAweDAwMDAwNywgMHgyNDQyMDYsIDB4MDAwMDA3LAorCTB4MDAwNjA2LCAweDAwMDAwNywgMHgwMDAyRjUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgyQTFBODYsIDB4MDAwMDA3LAorCTB4MDAwMTAwLCAweDA4MEIyMCwgMHgxMzhCNjAsIDB4MUI4QjYwLAorCTB4MjM4QjYwLCAweDJCOEI2MCwgMHgzMzhCNjAsIDB4M0I4QjYwLAorCTB4NDM4QjYwLCAweDRCOEI2MCwgMHg1MzhCNjAsIDB4NUI4QjYwLAorCTB4NjM4QjYwLCAweDZCOEI2MCwgMHg3MzhCNjAsIDB4N0I4QjYwLAorCTB4MDM4RjYwLCAweDBCOEY2MCwgMHgxMzhGNjAsIDB4MUI4RjYwLAorCTB4MjM4RjYwLCAweDJCOEY2MCwgMHgzMzhGNjAsIDB4M0I4RjYwLAorCTB4NDM4RjYwLCAweDRCOEY2MCwgMHg1MzhGNjAsIDB4NUI4RjYwLAorCTB4NjM4RjYwLCAweDZCOEY2MCwgMHg3MzhGNjAsIDB4N0I4RjYwLAorCTB4MDM4QTYwLCAweDAwMDYwNiwgMHgwMTgwNDAsIDB4MDAwMDhELAorCTB4MDAwQTY0LCAweDI4MEQwMiwgMHgwMDBBMjQsIDB4MDAwMjdELAorCTB4MDE4MDQyLCAweDEwMDAwQSwgMHgwMDEyMjQsIDB4MDAwM0ZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MkMwQTg2LAorCTB4MDAwMDA3LCAweDAwMDE4RCwgMHgwMDBBMjQsIDB4MDAwNDY0LAorCTB4MDAwNDY0LCAweDA4MDEwMiwgMHgwMDA5MjQsIDB4MDAwNDI0LAorCTB4MDAwNDI0LCAweDEwMDEwMiwgMHgwMjAwMEQsIDB4MDA5MTQ0LAorCTB4MkM2MTg2LCAweDAwMDAwNywgMHgwMDAxRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMEE0NCwgMHgyQzQzODYsIDB4MDE4MDQyLAorCTB4MEEwMDBELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwMDI3RCwgMHgwMDEwMjAsIDB4MDAwNjA2LAorCTB4MDE4MDQwLCAweDAwMDJGNSwgMHgwMTAwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDJDQjI4NiwgMHgwMDAwMDcsIDB4MDAwMzdELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MkNFMjg2LAorCTB4MDAwMDA3LCAweDAwMDA3NSwgMHgwMDJFN0QsIDB4MDEwMDQyLAorCTB4MEI4MDRBLCAweDAwMDAyMCwgMHgwMDA5MDQsIDB4MDAwNjg2LAorCTB4MDEwMDQwLCAweDMxODQ0QSwgMHgzMDA0OEIsIDB4MDAwODgzLAorCTB4MDAwMDhELCAweDAwMDgxMCwgMHgyODE0M0EsIDB4MDAwMDhELAorCTB4MDAwODEwLCAweDI4MEMzQSwgMHgwMDA2NzUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMzgxNSwgMHgwMTA5MjQsIDB4MjgwNTAyLAorCTB4MEIwMDBELCAweDAwMDgyMCwgMHgwMDAyRjUsIDB4MDEwMDQwLAorCTB4MDAwNjA2LCAweDIyMDAwNywgMHgwMDA0NjQsIDB4MDAwNDY0LAorCTB4MDAwNjA2LCAweDAwMDAwNywgMHgwMDAxMzQsIDB4MDA3RjhELAorCTB4MDAwOTNDLCAweDI4MUQxMiwgMHgyODI1MTIsIDB4MDAxRjMyLAorCTB4MEUwMDA3LCAweDAwMDEwRCwgMHgwMDAzN0QsIDB4MDAwODIwLAorCTB4MDE4MDQwLCAweDA1RDJGNCwgMHgwMDAwMDcsIDB4MDgwMDA3LAorCTB4MDAwMzdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MkU4QTg2LCAweDAwMDAwNywgMHgwMDA2MDYsIDB4MDAwMDA3LAorCTB4MDAwMDA3LCAweDAwMDAxMiwgMHgxMDAwMDcsIDB4MzIwMDA3LAorCTB4NjAwMDA3LCAweDQ2MDAwNywgMHgxMDAwODAsIDB4NDgwMDFBLAorCTB4MDA0OTA0LCAweDJFRjE4NiwgMHgwMDAwMDcsIDB4MDAxMjEwLAorCTB4NTgwMDNBLCAweDAwMDE0NSwgMHg1QzVEMDQsIDB4MDAwMDA3LAorCTB4MDAwMDgwLCAweDQ4MDAxQSwgMHgwMDQ5MDQsIDB4MkY0MTg2LAorCTB4MDAwMDA3LCAweDAwMTIxMCwgMHg1MDAwM0EsIDB4MDA1OTA0LAorCTB4MkY5ODg2LCAweDAwMDA0NSwgMHgwMDAwQzUsIDB4N0ZGRkY1LAorCTB4N0ZGRjdELCAweDA3RDUyNCwgMHgwMDQyMjQsIDB4NTAwMTAyLAorCTB4MjAwNTAyLCAweDAwMDA4MiwgMHg0MDAwMUEsIDB4MDA0MTA0LAorCTB4MkZDOTg2LCAweDAwMDAwNywgMHgwMDM4NjUsIDB4NDAwMDFBLAorCTB4MDA0MDIwLCAweDAwMTA0RCwgMHgwNEMxODQsIDB4MzFBQjg2LAorCTB4MDAwMDQwLCAweDA0MDAwNywgMHgwMDAxNjUsIDB4MDAwMTQ1LAorCTB4MDA0MDIwLCAweDAwMDA0MCwgMHgwMDA3NjUsIDB4MDgwMDgwLAorCTB4NDAwMDFBLCAweDAwNDEwNCwgMHgzMDU5ODYsIDB4MDAwMDA3LAorCTB4MDAxMjEwLCAweDQwMDAzQSwgMHgwMDQxMDQsIDB4MzBCMjg2LAorCTB4MDAwMDRELCAweDAwMDBDRCwgMHgwMDQ4MTAsIDB4MjAwNDNBLAorCTB4MDAwODgyLCAweDQwMDAxQSwgMHgwMDQxMDQsIDB4MzBDMTg2LAorCTB4MDAwMDA3LCAweDAwNDgyMCwgMHgwMDU5MDQsIDB4MzE5ODg2LAorCTB4MDAwMDQwLCAweDAwMDdFNSwgMHgyMDA0ODAsIDB4MjgxNkEwLAorCTB4MzIxNkUwLCAweDNBMTZFMCwgMHg0MjE2RTAsIDB4MDIxMjYwLAorCTB4MDAwMDQwLCAweDAwMDAzMiwgMHg0MDAwNzUsIDB4MDAwMDdELAorCTB4MDdENTc0LCAweDIwMDUxMiwgMHgwMDAwODIsIDB4NDAwMDFBLAorCTB4MDA0MTA0LCAweDMxNzE4NiwgMHgwMDAwMDcsIDB4MDM4QTA2LAorCTB4NjQwMDA3LCAweDAwMDBFNSwgMHgwMDAwMjAsIDB4MDAwMDQwLAorCTB4MDAwQTY1LCAweDAwMDAyMCwgMHgwMjAwNDAsIDB4MDIwMDQwLAorCTB4MDAwMDQwLCAweDAwMDE2NSwgMHgwMDAwNDIsIDB4NzAwMDBBLAorCTB4MDA3MTA0LCAweDMyMzI4NiwgMHgwMDAwMDcsIDB4MDYwMDA3LAorCTB4MDE5QTA2LCAweDY0MDAwNywgMHgwNTAwMDAsIDB4MDA3MDIwLAorCTB4MDAwMDQwLCAweDAzOEEwNiwgMHg2NDAwMDcsIDB4MDAwMDA3LAorCTB4MDAzMDZELCAweDAyODg2MCwgMHgwMjkwNjAsIDB4MDgwMDBBLAorCTB4MDI4ODYwLCAweDAwODA0MCwgMHgxMDAwMTIsIDB4MDAxMDBELAorCTB4MDA5MTg0LCAweDMyRDE4NiwgMHgwMDBFMEQsIDB4MDA5MTg0LAorCTB4MzNFMTg2LCAweDAwMDAwNywgMHgzMDAwMDcsIDB4MDAxMDIwLAorCTB4MDAzQjZELCAweDAwODA0MCwgMHgwMDAwODAsIDB4MDgwMDFBLAorCTB4MDAwOTA0LCAweDMyRjE4NiwgMHgwMDAwMDcsIDB4MDAxMjIwLAorCTB4MDAwREVELCAweDAwODA0MCwgMHgwMDgwNDIsIDB4MTAwMDBBLAorCTB4NDAwMDBELCAweDEwOTU0NCwgMHgwMDAwMDcsIDB4MDAxMDIwLAorCTB4MDAwREVELCAweDAwODA0MCwgMHgwMDgwNDIsIDB4MjAwNDBBLAorCTB4MDAwMDgyLCAweDA4MDAxQSwgMHgwMDA5MDQsIDB4MzM4MTg2LAorCTB4MDAwMDA3LCAweDAwM0I2RCwgMHgwMDgwNDIsIDB4MDgwMDBBLAorCTB4MDAwRTE1LCAweDAxMDk4NCwgMHgzNDJCODYsIDB4NjAwMDA3LAorCTB4MDgwMDFBLCAweDAwMEMxNSwgMHgwMTA5ODQsIDB4MzQxMzg2LAorCTB4MDAwMDIwLCAweDFBMDAwNywgMHgwMDAyRUQsIDB4MDA4MDQwLAorCTB4NjIwMDA3LCAweDAwMzA2RCwgMHgwMjgwNDIsIDB4MEE4MDRBLAorCTB4MDAwODIwLCAweDBBODA0QSwgMHgwMDA2MDYsIDB4MTA4MDRBLAorCTB4MDAwMDA3LCAweDI4MjUxMiwgMHgwMDFGMzIsIDB4MDVEMkY0LAorCTB4NTREMTA0LCAweDAwNzM1QywgMHgwMDA3ODYsIDB4MDAwMDA3LAorCTB4MEMwMDA3LCAweDBBMDAwNywgMHgxQzAwMDcsIDB4MDAzNDY1LAorCTB4MDIwMDQwLCAweDAwNDgyMCwgMHgwMjUwNjAsIDB4NDAwMDBBLAorCTB4MDI0MDYwLCAweDAwMDA0MCwgMHg0NTQ5NDQsIDB4MDAwMDA3LAorCTB4MDA0MDIwLCAweDAwM0FFNSwgMHgwMDAwNDAsIDB4MDAyOEU1LAorCTB4MDAwMDQyLCAweDQ4MDAwQSwgMHgwMDQ5MDQsIDB4MzlGODg2LAorCTB4MDAyQzY1LCAweDAwMDA0MiwgMHg0MDAwMEEsIDB4MDAwMEQ1LAorCTB4NDU0MTA0LCAweDAwMDAwNywgMHgwMDA2NTUsIDB4MDU0NTA0LAorCTB4MzY4Mjg2LCAweDAwMDFENSwgMHgwNTQ1MDQsIDB4MzY4MDg2LAorCTB4MDAyQjY1LCAweDAwMDA0MiwgMHgwMDNBRTUsIDB4NTAwMDRBLAorCTB4NDAwMDBBLCAweDQ1QzNENCwgMHgwMDAwMDcsIDB4NDU0NTA0LAorCTB4MDAwMDA3LCAweDAwMDBDRCwgMHg0NDQ5NDQsIDB4MDAwMDA3LAorCTB4NDU0NTA0LCAweDAwMDAwNywgMHgwMDAxNEQsIDB4NTU0OTQ0LAorCTB4MDAwMDA3LCAweDA0NTE0NCwgMHgzNjc5ODYsIDB4MDAyQzY1LAorCTB4MDAwMDQyLCAweDQ4MDAwQSwgMHg0Q0QxMDQsIDB4MDAwMDA3LAorCTB4MDRDMTQ0LCAweDM2ODM4NiwgMHgwMDAwMDcsIDB4MTYwMDA3LAorCTB4MDAyQ0U1LCAweDA0MDA0MiwgMHg0MDAwMEEsIDB4MDA0MDIwLAorCTB4MDAwMDQwLCAweDAwMjk2NSwgMHgwMDAwNDIsIDB4NDAwMDBBLAorCTB4MDA0MTA0LCAweDM2RjA4NiwgMHgwMDAwMDcsIDB4MDAyNDAyLAorCTB4MzgzMjA2LCAweDAwNUMwMiwgMHgwMDI1RTUsIDB4MDAwMDQyLAorCTB4NDAwMDBBLCAweDAwNDI3NCwgMHgwMDJBRTUsIDB4MDAwMDQyLAorCTB4NDAwMDBBLCAweDAwNDI3NCwgMHg1MDAxMTIsIDB4MDAyOUU1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQyMzQsIDB4NDU0MTA0LAorCTB4MDAwMDA3LCAweDAwNDAyMCwgMHgwMDAwNDAsIDB4MDAzRUU1LAorCTB4MDAwMDIwLCAweDAwMDA0MCwgMHgwMDJERTUsIDB4NDAwMTUyLAorCTB4NTAwMDBBLCAweDA0NTE0NCwgMHgzN0RBODYsIDB4MDAwMEM1LAorCTB4MDAzRUU1LCAweDAwNDAyMCwgMHgwMDAwNDAsIDB4MDAyQkU1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHg0MDQyNTQsIDB4MDAwMDA3LAorCTB4MDAyQUU1LCAweDAwNDAyMCwgMHgwMDAwNDAsIDB4NTAwMTMyLAorCTB4MDQwMTM0LCAweDAwNTY3NCwgMHgwMDI5RTUsIDB4MDIwMDQyLAorCTB4NDIwMDBBLCAweDAwMDA0MiwgMHg1MDAwMEEsIDB4MDU0MTdDLAorCTB4MDAyOEU1LCAweDAwMDA0MiwgMHg0ODAwMEEsIDB4MDAwMEM1LAorCTB4NENDMTQ0LCAweDM4QTA4NiwgMHgwMDI2RTUsIDB4MDAyN0U1LAorCTB4MDIwMDQyLCAweDQwMDA0QSwgMHg1MDAwMEEsIDB4MDA0MjNDLAorCTB4MDA1NjdDLCAweDAwMjhFNSwgMHgwMDQ4MjAsIDB4MDAwMDQwLAorCTB4MjgxRDEyLCAweDI4MjUxMiwgMHgwMDFGNzIsIDB4MDAyOTY1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQxMDQsIDB4MzkzQTg2LAorCTB4MEUwMDA3LCAweDE2MDAwNywgMHgxRTAwMDcsIDB4MDAzRUU1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQxMDQsIDB4Mzk3ODg2LAorCTB4MDAyRDY1LCAweDAwMDA0MiwgMHgyODM0MEEsIDB4MDAzNDY1LAorCTB4MDIwMDQyLCAweDQyMDA0QSwgMHgwMDQwMjAsIDB4NEEwMDRBLAorCTB4NTAwMDRBLCAweDA1RDJGNCwgMHg1NEQxMDQsIDB4MDA3MzVDLAorCTB4MzlFMTg2LCAweDAwMDAwNywgMHgwMDA2MDYsIDB4MDgwMDA3LAorCTB4MEMwMDA3LCAweDA4MDAwNywgMHgwQTAwMDcsIDB4MDAwMUU1LAorCTB4MDIwMDQ1LCAweDAwNDAyMCwgMHgwMDAwNjAsIDB4MDAwMzY1LAorCTB4MDAwMDQwLCAweDAwMkU2NSwgMHgwMDFBMjAsIDB4MEExQTYwLAorCTB4MDAwMDQwLCAweDAwMzQ2NSwgMHgwMjAwNDIsIDB4NDIwMDRBLAorCTB4MDA0MDIwLCAweDRBMDA0QSwgMHgwMDA2MDYsIDB4NTAwMDRBLAorCTB4MDAxN0ZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MjI1QTg2LCAweDAwMDAwNywgMHgwMDEwN0QsIDB4MDE4MDQyLAorCTB4MDAxMUZELCAweDMzODA0QSwgMHgxOTgwNEEsIDB4MjAwMDBBLAorCTB4MDAwMDk1LCAweDJBMTE0NCwgMHgwMUExNDQsIDB4M0I5MDg2LAorCTB4MDAwNDBELCAweDAwQjE4NCwgMHgzQjkxODYsIDB4MDAxOEZELAorCTB4MDE4MDQyLCAweDAwMTBGRCwgMHgwOTgwNEEsIDB4MzgwMDBBLAorCTB4MDAwMDk1LCAweDAxMDkyNCwgMHgwMDNBNjQsIDB4M0I4MTg2LAorCTB4MDAwMDA3LCAweDAwMzkwNCwgMHgzQjkyODYsIDB4MDAwMDA3LAorCTB4M0I5QTA2LCAweDAwMDAwRCwgMHgwMDAwOEQsIDB4MDAwODIwLAorCTB4MDAzODdELCAweDAxODA0MCwgMHg3MDAwMDIsIDB4MDAxMTdELAorCTB4MDE4MDQyLCAweDAwMTk3RCwgMHgyOTgwNEEsIDB4MzAwMDBBLAorCTB4MzgwMDAyLCAweDAwMzEyNCwgMHgwMDA0MjQsIDB4MDAwNDI0LAorCTB4MDAyQTI0LCAweDI4MDUwMiwgMHgwMDA2OEQsIDB4MDAwODEwLAorCTB4MjgxNDNBLCAweDAwNzUwRCwgMHgwMEIxMjQsIDB4MDAyMjY0LAorCTB4M0QwMzg2LCAweDI4NDQwMiwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MEI4MDBELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwNzU4RCwgMHgwMEIxMjQsIDB4MTAwMTAyLAorCTB4MDEyMTQ0LCAweDNFNDk4NiwgMHgwMDE4MTAsIDB4MTAwMDNBLAorCTB4MDAzODdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4M0U0ODg2LCAweDAzMDAwMCwgMHgzRTRBMDYsIDB4MDAwMEJELAorCTB4MDAwMDhELCAweDAyMzE2NCwgMHgwMDBBNjQsIDB4MjgwRDAyLAorCTB4MEI4MDhELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwMzg3RCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDNFMzI4NiwgMHgwMzAwMDAsIDB4MDAwMkZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4M0Q4Mjg2LAorCTB4MDAwMDA3LCAweDAwMjgxMCwgMHgyODA0M0EsIDB4MDA3NTBELAorCTB4MDMwOTI0LCAweDAwMjI2NCwgMHgyODBEMDIsIDB4MDIzMTZDLAorCTB4Mjg0NTBBLCAweDBCODEwRCwgMHgwMDA4MjAsIDB4MDAwMkZELAorCTB4MDE4MDQwLCAweDIwMDAwNywgMHgwMDAwOEQsIDB4MDAwQTI0LAorCTB4M0U0QTA2LCAweDEwMDEwMiwgMHgwMDE4MTAsIDB4MTAwMDNBLAorCTB4MDAwMEJELCAweDAwMzgxMCwgMHgzMDA0M0EsIDB4MDAxODdELAorCTB4MDE4MDQyLCAweDAwMThGRCwgMHgwOTgwNEEsIDB4MjAwMDBBLAorCTB4MDAwMEFELCAweDAyODkyNCwgMHgwNzIxMkMsIDB4MDAxMDEwLAorCTB4MzAwNTgzLCAweDMwMEQ4QiwgMHgzMDE0QkIsIDB4MzAxQzgzLAorCTB4MDAyMDgzLCAweDAwMTM3RCwgMHgwMzgwNDIsIDB4MzM4NDRBLAorCTB4MzNBQ0NCLCAweDMzQjRDQiwgMHgzM0JDQ0IsIDB4MzNDNENCLAorCTB4MzNDQ0NCLCAweDMzRDRDQiwgMHgzMDVDOEIsIDB4MDA2MDgzLAorCTB4MDAxRTBELCAweDAwMDVGRCwgMHgwMTgwNDIsIDB4MjAwMDBBLAorCTB4MDIwOTI0LCAweDAwMDY4RCwgMHgwMEE5NkMsIDB4MDAwMDlELAorCTB4MDAwMkZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4M0Y2QTg2LCAweDAwMDAwNywgMHgyODA1MDIsIDB4MjgwRDBBLAorCTB4Mjg0NDAyLCAweDAwMTgxMCwgMHgyODE0M0EsIDB4MEMwMDhELAorCTB4MDAwODIwLCAweDAwMDJGRCwgMHgwMTgwNDAsIDB4MjIwMDA3LAorCTB4MDAzOTA0LCAweDIyNTg4NiwgMHgwMDFFMEQsIDB4MDAwNTdELAorCTB4MDE4MDQyLCAweDIwMDAwQSwgMHgwMjA5MjQsIDB4MDAwMEE1LAorCTB4MDAwMkZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4NDAyQTg2LCAweDAwMDAwNywgMHgyODA1MDIsIDB4MjgwQzAyLAorCTB4MDAyMDEwLCAweDI4MTQzQSwgMHgwQzAxMEQsIDB4MDAwODIwLAorCTB4MDAwMkZELCAweDAxODA0MCwgMHgyMjVBMDYsIDB4MjIwMDA3LAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwCit9OworCisjZW5kaWYJLy9fSFdNQ09ERV8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy95c3MyMjUuYyBiL3NvdW5kL29zcy95c3MyMjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzAwNDAwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3lzczIyNS5jCkBAIC0wLDAgKzEsMzE5IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCit1bnNpZ25lZCBjaGFyIHBhZ2VfemVyb1tdIF9faW5pdGRhdGEgPSB7CisweDAxLCAweDdjLCAweDAwLCAweDFlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY1LCAweDAwLAorMHgxMSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgzMiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgxMywgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MTQsIDB4MDIsIDB4NzYsIDB4MDAsIDB4NjAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MTksCisweDAxLCAweDFhLCAweDAxLCAweDIwLCAweDAxLCAweDQwLCAweDAxLCAweDE3LCAweDAwLCAweDAwLCAweDAxLAorMHg4MCwgMHgwMSwgMHgyMCwgMHgwMCwgMHgxMCwgMHgwMSwgMHhhMCwgMHgwMywgMHhkMSwgMHgwMCwgMHgwMCwKKzB4MDEsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjQsIDB4MDIsCisweGUwLCAweDAwLCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDE3LAorMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsCisweDAwLCAweDkyLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweGIzLCAweDAyLAorMHgwMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4ZjUsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4YTAsIDB4MDIsCisweDExLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLAorMHgwMiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgxNywgMHgwMCwgMHgxYiwgMHgwMCwKKzB4MWQsIDB4MDIsIDB4ZGYKK307ICAgIAorCit1bnNpZ25lZCBjaGFyIHBhZ2Vfb25lW10gX19pbml0ZGF0YSA9IHsKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTksIDB4MDAsCisweDFmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweGQ4LCAweDAwLCAweDAwLAorMHgwMiwgMHgyMCwgMHgwMCwgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMSwKKzB4YzAsIDB4MDEsIDB4ZmEsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHg0MCwgMHgwMiwgMHg2MCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4YzAsIDB4MDIsIDB4ODAsIDB4MDAsCisweDAwLCAweDAyLCAweGZiLCAweDAyLCAweGEwLCAweDAwLCAweDAwLCAweDAwLCAweDFiLCAweDAyLCAweGQ3LAorMHgwMCwgMHgwMCwgMHgwMiwgMHhmNywgMHgwMywgMHgyMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MWMsIDB4MDMsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDMsIDB4M2YsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YzAsCisweDAwLCAweDAwLCAweDAzLCAweGRmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDVkLCAweDAwLAorMHgwMCwgMHgwMywgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg3ZCwgMHgwMCwgMHgwMCwgMHgwMywgMHhjMCwKKzB4MDAsIDB4MDAsIDB4MDMsIDB4OWUsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDMsCisweGJlLCAweDAwLCAweDAwLCAweDAzLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwKKzB4ZGIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4ZGIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4ZTAsIDB4MDAsIDB4MDAsCisweDAyLCAweGZiLCAweDAwLCAweDAwLCAweDAyLCAweGMwLCAweDAyLCAweDQwLCAweDAyLCAweGZiLCAweDAyLAorMHg2MCwgMHgwMCwgMHgxYgorfTsKKwordW5zaWduZWQgY2hhciBwYWdlX3R3b1tdIF9faW5pdGRhdGEgPSB7CisweGM0LCAweDAwLCAweDQ0LCAweDA3LCAweDQ0LCAweDAwLCAweDQwLCAweDI1LCAweDAxLCAweDA2LCAweGM0LAorMHgwNywgMHg0MCwgMHgyNSwgMHgwMSwgMHgwMCwgMHg0NiwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDYsIDB4MDcsCisweDA1LCAweDA1LCAweDA1LCAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA3LCAweDA1LCAweDQ0LCAweDQ2LAorMHg0NCwgMHg0NiwgMHg0NiwgMHgwNywgMHgwNSwgMHg0NCwgMHg0NiwgMHgwNSwgMHg0NiwgMHgwNSwgMHg0NiwKKzB4MDUsIDB4NDYsIDB4MDUsIDB4NDQsIDB4NDYsIDB4MDUsIDB4MDcsIDB4NDQsIDB4NDYsIDB4MDUsIDB4MDcsCisweDQ0LCAweDQ2LCAweDA1LCAweDA3LCAweDQ0LCAweDQ2LCAweDA1LCAweDA3LCAweDQ0LCAweDA1LCAweDA1LAorMHgwNSwgMHg0NCwgMHgwNSwgMHgwNSwgMHgwNSwgMHg0NiwgMHgwNSwgMHg0NiwgMHgwNSwgMHg0NiwgMHgwNSwKKzB4NDYsIDB4MDUsIDB4NDYsIDB4MDcsIDB4NDYsIDB4MDcsIDB4NDQKK307CisKK3Vuc2lnbmVkIGNoYXIgcGFnZV90aHJlZVtdIF9faW5pdGRhdGEgPSB7CisweDA3LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDAwLCAweDQwLCAweDAwLCAweDQwLCAweDA2LAorMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsCisweGMwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDQwLCAweDAwLAorMHg2MCwgMHgwMCwgMHg3MCwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MiwgMHgwMCwgMHg0MCwKKzB4MDAsIDB4MDIsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLAorMHgwMCwgMHg0MiwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKKzB4MDIsIDB4MDAsIDB4NDIsIDB4MDAsIDB4YzAsIDB4MDAsIDB4NDAKK307CisKK3Vuc2lnbmVkIGNoYXIgcGFnZV9mb3VyW10gX19pbml0ZGF0YSA9IHsKKzB4NjMsIDB4MDMsIDB4MjYsIDB4MDIsIDB4MmMsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MmUsIDB4MDIsIDB4MDIsCisweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKKzB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsCisweDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDYwLCAweDAwLAorMHgyMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg2MCwKKzB4MDAsIDB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDAsCisweDIwLCAweDAwLCAweDIyLCAweDAyLCAweDIyLCAweDAyLCAweDIwLCAweDAwLCAweDYwLCAweDAwLCAweDIyLAorMHgwMiwgMHg2MiwgMHgwMiwgMHgyMCwgMHgwMSwgMHgyMSwgMHgwMQorfTsKKwordW5zaWduZWQgY2hhciBwYWdlX3NpeFtdIF9faW5pdGRhdGEgPSB7CisweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDA2LCAweDAwLAorMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwZSwKKzB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsCisweDE2LCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDFhLCAweDAwLCAweDAwLCAweDFjLCAweDAwLAorMHgwMCwgMHgxZSwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgwMCwgMHgyNCwKKzB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MmEsIDB4MDAsIDB4MDAsCisweDJjLCAweDAwLCAweDAwLCAweDJlLCAweDAwLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDMyLCAweDAwLAorMHgwMCwgMHgzNCwgMHgwMCwgMHgwMCwgMHgzNiwgMHgwMCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgzYSwKKzB4MDAsIDB4MDAsIDB4M2MsIDB4MDAsIDB4MDAsIDB4M2UsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsCisweDQyLCAweDAzLCAweDAwLCAweDQ0LCAweDAxLCAweDAwLCAweDQ2LCAweDBhLCAweDIxLCAweDQ4LCAweDBkLAorMHgyMywgMHg0YSwgMHgyMywgMHgxYiwgMHg0YywgMHgzNywgMHg4ZiwgMHg0ZSwgMHg0NSwgMHg3NywgMHg1MCwKKzB4NTIsIDB4ZTIsIDB4NTIsIDB4MWMsIDB4OTIsIDB4NTQsIDB4MWMsIDB4NTIsIDB4NTYsIDB4MDcsIDB4MDAsCisweDU4LCAweDJmLCAweGM2LCAweDVhLCAweDBiLCAweDAwLCAweDVjLCAweDMwLCAweDA2LCAweDVlLCAweDE3LAorMHgwMCwgMHg2MCwgMHgzZCwgMHhkYSwgMHg2MiwgMHgyOSwgMHgwMCwgMHg2NCwgMHgzZSwgMHg0MSwgMHg2NiwKKzB4MzksIDB4MDAsIDB4NjgsIDB4NGMsIDB4NDgsIDB4NmEsIDB4NDksIDB4MDAsIDB4NmMsIDB4NGMsIDB4NmMsCisweDZlLCAweDExLCAweGQyLCAweDcwLCAweDE2LCAweDBjLCAweDcyLCAweDAwLCAweDAwLCAweDc0LCAweDAwLAorMHg4MCwgMHg3NiwgMHgwZiwgMHgwMCwgMHg3OCwgMHgwMCwgMHg4MCwgMHg3YSwgMHgxMywgMHgwMCwgMHg3YywKKzB4ODAsIDB4MDAsIDB4N2UsIDB4ODAsIDB4ODAKK307CisKK3Vuc2lnbmVkIGNoYXIgcGFnZV9zZXZlbltdIF9faW5pdGRhdGEgPSB7CisweDBmLCAweGZmLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDAyLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwKKzB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsCisweGZmLCAweDBmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHhmZiwgMHgwZiwgMHhmZiwKKzB4MGYsIDB4ZmYsIDB4MGYsIDB4ZmYsIDB4MDIsIDB4ZTksIDB4MDYsIDB4OGMsIDB4MDYsIDB4OGMsIDB4MGYsCisweGZmLCAweDFhLCAweDc1LCAweDBkLCAweDhiLCAweDA0LCAweGU5LCAweDBiLCAweDE2LCAweDFhLCAweDM4LAorMHgwZCwgMHhjOCwgMHgwNCwgMHg2ZiwgMHgwYiwgMHg5MSwgMHgwZiwgMHhmZiwgMHgwNiwgMHg0MCwgMHgwNiwKKzB4NDAsIDB4MDIsIDB4OGYsIDB4MGYsIDB4ZmYsIDB4MDYsIDB4NjIsIDB4MDYsIDB4NjIsIDB4MDIsIDB4N2IsCisweDBmLCAweGZmLCAweDA2LCAweDk3LCAweDA2LCAweDk3LCAweDAyLCAweDUyLCAweDBmLCAweGZmLCAweDA2LAorMHhmNiwgMHgwNiwgMHhmNiwgMHgwMiwgMHgxOSwgMHgwNSwgMHg1NSwgMHgwNSwgMHg1NSwgMHgwNSwgMHg1NSwKKzB4MDUsIDB4NTUsIDB4MDUsIDB4NTUsIDB4MDUsIDB4NTUsIDB4MDUsIDB4NTUsIDB4MDUsIDB4NTUsIDB4MTQsCisweGRhLCAweDBkLCAweDkzLCAweDA0LCAweGRhLCAweDA1LCAweDkzLCAweDE0LCAweGRhLCAweDBkLCAweDkzLAorMHgwNCwgMHhkYSwgMHgwNSwgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDIsIDB4MDAKK307CisKK3Vuc2lnbmVkIGNoYXIgcGFnZV96ZXJvX3YyW10gX19pbml0ZGF0YSA9IHsKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKwordW5zaWduZWQgY2hhciBwYWdlX29uZV92MltdIF9faW5pdGRhdGEgPSB7CisweDAxLCAweGMwLCAweDAxLCAweGZhLCAweDAwLCAweDFhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3Vuc2lnbmVkIGNoYXIgcGFnZV90d29fdjJbXSBfX2luaXRkYXRhID0geworMHg0NiwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307Cit1bnNpZ25lZCBjaGFyIHBhZ2VfdGhyZWVfdjJbXSBfX2luaXRkYXRhID0geworMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307Cit1bnNpZ25lZCBjaGFyIHBhZ2VfZm91cl92MltdIF9faW5pdGRhdGEgPSB7CisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKwordW5zaWduZWQgY2hhciBwYWdlX3NldmVuX3YyW10gX19pbml0ZGF0YSA9IHsKKzB4MGYsIDB4ZmYsIDB4MGYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKK3Vuc2lnbmVkIGNoYXIgbW9kX3YyW10gX19pbml0ZGF0YSA9IHsKKzB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDIsCisweDAwLCAweDAxLCAweDAzLCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDAyLCAweDAwLCAweDAxLCAweDA1LAorMHgwMiwgMHgwMCwgMHgwMSwgMHgwNiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwNywgMHgwMiwgMHgwMCwgMHhiMCwKKzB4MjAsIDB4YjEsIDB4MjAsIDB4YjIsIDB4MjAsIDB4YjMsIDB4MjAsIDB4YjQsIDB4MjAsIDB4YjUsIDB4MjAsCisweGI2LCAweDIwLCAweGI3LCAweDIwLCAweGYwLCAweDIwLCAweGYxLCAweDIwLCAweGYyLCAweDIwLCAweGYzLAorMHgyMCwgMHhmNCwgMHgyMCwgMHhmNSwgMHgyMCwgMHhmNiwgMHgyMCwgMHhmNywgMHgyMCwgMHgxMCwgMHhmZiwKKzB4MTEsIDB4ZmYsIDB4MTIsIDB4ZmYsIDB4MTMsIDB4ZmYsIDB4MTQsIDB4ZmYsIDB4MTUsIDB4ZmYsIDB4MTYsCisweGZmLCAweDE3LCAweGZmLCAweDIwLCAweGZmLCAweDIxLCAweGZmLCAweDIyLCAweGZmLCAweDIzLCAweGZmLAorMHgyNCwgMHhmZiwgMHgyNSwgMHhmZiwgMHgyNiwgMHhmZiwgMHgyNywgMHhmZiwgMHgzMCwgMHgwMCwgMHgzMSwKKzB4MDAsIDB4MzIsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsCisweDM3LCAweDAwLCAweDQwLCAweDAwLCAweDQxLCAweDAwLCAweDQyLCAweDAwLCAweDQzLCAweDAwLCAweDQ0LAorMHgwMCwgMHg0NSwgMHgwMCwgMHg0NiwgMHgwMCwgMHg0NywgMHgwMCwgMHg1MCwgMHgwMCwgMHg1MSwgMHgwMCwKKzB4NTIsIDB4MDAsIDB4NTMsIDB4MDAsIDB4NTQsIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTYsIDB4MDAsIDB4NTcsCisweDAwLCAweDYwLCAweDAwLCAweDYxLCAweDAwLCAweDYyLCAweDAwLCAweDYzLCAweDAwLCAweDY0LCAweDAwLAorMHg2NSwgMHgwMCwgMHg2NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg3MCwgMHhjMCwgMHg3MSwgMHhjMCwgMHg3MiwKKzB4YzAsIDB4NzMsIDB4YzAsIDB4NzQsIDB4YzAsIDB4NzUsIDB4YzAsIDB4NzYsIDB4YzAsIDB4NzcsIDB4YzAsCisweDgwLCAweDAwLCAweDgxLCAweDAwLCAweDgyLCAweDAwLCAweDgzLCAweDAwLCAweDg0LCAweDAwLCAweDg1LAorMHgwMCwgMHg4NiwgMHgwMCwgMHg4NywgMHgwMCwgMHg5MCwgMHgwMCwgMHg5MSwgMHgwMCwgMHg5MiwgMHgwMCwKKzB4OTMsIDB4MDAsIDB4OTQsIDB4MDAsIDB4OTUsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTcsIDB4MDAsIDB4YTAsCisweDAwLCAweGExLCAweDAwLCAweGEyLCAweDAwLCAweGEzLCAweDAwLCAweGE0LCAweDAwLCAweGE1LCAweDAwLAorMHhhNiwgMHgwMCwgMHhhNywgMHgwMCwgMHhjMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHhjMiwgMHgwMCwgMHhjMywKKzB4MDAsIDB4YzQsIDB4MDAsIDB4YzUsIDB4MDAsIDB4YzYsIDB4MDAsIDB4YzcsIDB4MDAsIDB4ZDAsIDB4MDAsCisweGQxLCAweDAwLCAweGQyLCAweDAwLCAweGQzLCAweDAwLCAweGQ0LCAweDAwLCAweGQ1LCAweDAwLCAweGQ2LAorMHgwMCwgMHhkNywgMHgwMCwgMHhlMCwgMHgwMCwgMHhlMSwgMHgwMCwgMHhlMiwgMHgwMCwgMHhlMywgMHgwMCwKKzB4ZTQsIDB4MDAsIDB4ZTUsIDB4MDAsIDB4ZTYsIDB4MDAsIDB4ZTcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsCisweDAxLCAweDAxLCAweDAxLCAweDAyLCAweDAxLCAweDAxLCAweDAyLCAweDAyLCAweDAxLCAweDAxLCAweDAzLAorMHgwMiwgMHgwMSwgMHgwMSwgMHgwNCwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwNSwgMHgwMiwgMHgwMSwgMHgwMSwKKzB4MDYsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDcsIDB4MDIsIDB4MDEKK307Cit1bnNpZ25lZCBjaGFyIGNvZWZmaWNpZW50c1tdIF9faW5pdGRhdGEgPSB7CisweDA3LCAweDQ2LCAweDAwLCAweDAwLCAweDA3LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDRiLCAweDAzLAorMHgxMSwgMHgwMCwgMHg0ZCwgMHgwMSwgMHgzMiwgMHgwNywgMHg0NiwgMHgwMCwgMHgwMCwgMHgwNywgMHg0OSwKKzB4MDAsIDB4MDAsIDB4MDcsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDEsCisweDQwLCAweDAyLCAweDQwLCAweDAxLCAweDQxLCAweDAyLCAweDYwLCAweDA3LCAweDQwLCAweDAwLCAweDAwLAorMHgwNywgMHg0MSwgMHgwMCwgMHgwMCwgMHgwNywgMHg0NywgMHgwMCwgMHgwMCwgMHgwNywgMHg0YSwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4NDcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NGEsIDB4MDEsIDB4MjAsIDB4MDcsIDB4NDcsCisweDAwLCAweDAwLCAweDA3LCAweDRhLCAweDAwLCAweDAwLCAweDA3LCAweDdjLCAweDAwLCAweDAwLCAweDA3LAorMHg3ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgxYywgMHgwNywgMHg3YywgMHgwMCwgMHgwMCwKKzB4MDcsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MDEsCisweDAwLCAweDA3LCAweDQ0LCAweDAwLCAweDAwLCAweDA3LCAweDQyLCAweDAwLCAweDAwLCAweDA3LCAweDQzLAorMHgwMCwgMHgwMCwgMHgwMCwgMHg0MiwgMHgwMSwgMHgxYSwgMHgwMCwgMHg0MywgMHgwMSwgMHgyMCwgMHgwNywKKzB4NDIsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDAsIDB4MDAsIDB4MDAsCisweDA3LCAweDQxLCAweDAwLCAweDAwLCAweDAxLCAweDQwLCAweDAyLCAweDQwLCAweDAxLCAweDQxLCAweDAyLAorMHg2MCwgMHgwNywgMHg0MCwgMHgwMCwgMHgwMCwgMHgwNywgMHg0MSwgMHgwMCwgMHgwMCwgMHgwNywgMHg0NCwKKzB4MGYsIDB4ZmYsIDB4MDcsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDcsCisweDQwLCAweDAwLCAweDAwLCAweDA3LCAweDQxLCAweDAwLCAweDAwLCAweDA3LCAweDUxLCAweDA2LCAweDQwLAorMHgwNywgMHg1MCwgMHgwNiwgMHg0MCwgMHgwNywgMHg0ZiwgMHgwMywgMHg4MSwgMHgwNywgMHg1MywgMHgxYSwKKzB4NzYsIDB4MDcsIDB4NTQsIDB4MGQsIDB4OGIsIDB4MDcsIDB4NTUsIDB4MDQsIDB4ZTksIDB4MDcsIDB4NTYsCisweDBiLCAweDE3LCAweDA3LCAweDU3LCAweDFhLCAweDM4LCAweDA3LCAweDU4LCAweDBkLCAweGM5LCAweDA3LAorMHg1OSwgMHgwNCwgMHg2ZiwgMHgwNywgMHg1YSwgMHgwYiwgMHg5MSwgMHgwNywgMHg3MywgMHgxNCwgMHhkYSwKKzB4MDcsIDB4NzQsIDB4MGQsIDB4OTMsIDB4MDcsIDB4NzUsIDB4MDQsIDB4ZDksIDB4MDcsIDB4NzYsIDB4MDUsCisweDkzLCAweDA3LCAweDc3LCAweDE0LCAweGRhLCAweDA3LCAweDc4LCAweDBkLCAweDkzLCAweDA3LCAweDc5LAorMHgwNCwgMHhkOSwgMHgwNywgMHg3YSwgMHgwNSwgMHg5MywgMHgwNywgMHg1ZSwgMHgwMywgMHg2OCwgMHgwNywKKzB4NWMsIDB4MDQsIDB4MzEsIDB4MDcsIDB4NWQsIDB4MDQsIDB4MzEsIDB4MDcsIDB4NjIsIDB4MDMsIDB4NTIsCisweDA3LCAweDYwLCAweDA0LCAweDc2LCAweDA3LCAweDYxLCAweDA0LCAweDc2LCAweDA3LCAweDY2LCAweDAzLAorMHgyZSwgMHgwNywgMHg2NCwgMHgwNCwgMHhkYSwgMHgwNywgMHg2NSwgMHgwNCwgMHhkYSwgMHgwNywgMHg2YSwKKzB4MDIsIDB4ZjYsIDB4MDcsIDB4NjgsIDB4MDUsIDB4NjIsIDB4MDcsIDB4NjksIDB4MDUsIDB4NjIsIDB4MDYsCisweDQ2LCAweDBhLCAweDIyLCAweDA2LCAweDQ4LCAweDBkLCAweDI0LCAweDA2LCAweDZlLCAweDExLCAweGQzLAorMHgwNiwgMHg3MCwgMHgxNSwgMHhjYiwgMHgwNiwgMHg1MiwgMHgyMCwgMHg5MywgMHgwNiwgMHg1NCwgMHgyMCwKKzB4NTQsIDB4MDYsIDB4NGEsIDB4MjcsIDB4MWQsIDB4MDYsIDB4NTgsIDB4MmYsIDB4YzgsIDB4MDYsIDB4NWMsCisweDMwLCAweDA3LCAweDA2LCAweDRjLCAweDM3LCAweDkwLCAweDA2LCAweDYwLCAweDNkLCAweGRiLCAweDA2LAorMHg2NCwgMHgzZSwgMHg0MiwgMHgwNiwgMHg0ZSwgMHg0NSwgMHg3OCwgMHgwNiwgMHg2OCwgMHg0YywgMHg0OCwKKzB4MDYsIDB4NmMsIDB4NGMsIDB4NmMsIDB4MDYsIDB4NTAsIDB4NTIsIDB4ZTIsIDB4MDYsIDB4NDIsIDB4MDIsCisweGJhCit9OwordW5zaWduZWQgY2hhciBjb2VmZmljaWVudHMyW10gX19pbml0ZGF0YSA9IHsKKzB4MDcsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDUsIDB4MGYsCisweGZmLCAweDA3LCAweDQ4LCAweDBmLCAweGZmLCAweDA3LCAweDdiLCAweDA0LCAweGNjLCAweDA3LCAweDdkLAorMHgwNCwgMHhjYywgMHgwNywgMHg3YywgMHgwMCwgMHgwMCwgMHgwNywgMHg3ZSwgMHgwMCwgMHgwMCwgMHgwNywKKzB4NDYsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDcsIDB4MDAsIDB4MDAsCisweDA3LCAweDRhLCAweDAwLCAweDAwLCAweDA3LCAweDRjLCAweDAwLCAweDAwLCAweDA3LCAweDRlLCAweDAwLCAweDAwCit9OwordW5zaWduZWQgY2hhciBjb2VmZmljaWVudHMzW10gX19pbml0ZGF0YSA9IHsgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDI4LCAweDAwLCAweDUxLCAweDAwLAorMHg1MSwgMHgwMCwgMHg3YSwgMHgwMCwgMHg3YSwgMHgwMCwgMHhhMywgMHgwMCwgMHhhMywgMHgwMCwgMHhjYywKKzB4MDAsIDB4Y2MsIDB4MDAsIDB4ZjUsIDB4MDAsIDB4ZjUsIDB4MDEsIDB4MWUsIDB4MDEsIDB4MWUsIDB4MDEsCisweDQ3LCAweDAxLCAweDQ3LCAweDAxLCAweDcwLCAweDAxLCAweDcwLCAweDAxLCAweDk5LCAweDAxLCAweDk5LAorMHgwMSwgMHhjMiwgMHgwMSwgMHhjMiwgMHgwMSwgMHhlYiwgMHgwMSwgMHhlYiwgMHgwMiwgMHgxNCwgMHgwMiwKKzB4MTQsIDB4MDIsIDB4M2QsIDB4MDIsIDB4M2QsIDB4MDIsIDB4NjYsIDB4MDIsIDB4NjYsIDB4MDIsIDB4OGYsCisweDAyLCAweDhmLCAweDAyLCAweGI4LCAweDAyLCAweGI4LCAweDAyLCAweGUxLCAweDAyLCAweGUxLCAweDAzLAorMHgwYSwgMHgwMywgMHgwYSwgMHgwMywgMHgzMywgMHgwMywgMHgzMywgMHgwMywgMHg1YywgMHgwMywgMHg1YywKKzB4MDMsIDB4ODUsIDB4MDMsIDB4ODUsIDB4MDMsIDB4YWUsIDB4MDMsIDB4YWUsIDB4MDMsIDB4ZDcsIDB4MDMsCisweGQ3LCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDI4LCAweDA0LCAweDI4LCAweDA0LCAweDUxLAorMHgwNCwgMHg1MSwgMHgwNCwgMHg3YSwgMHgwNCwgMHg3YSwgMHgwNCwgMHhhMywgMHgwNCwgMHhhMywgMHgwNCwKKzB4Y2MsIDB4MDQsIDB4Y2MsIDB4MDQsIDB4ZjUsIDB4MDQsIDB4ZjUsIDB4MDUsIDB4MWUsIDB4MDUsIDB4MWUsCisweDA1LCAweDQ3LCAweDA1LCAweDQ3LCAweDA1LCAweDcwLCAweDA1LCAweDcwLCAweDA1LCAweDk5LCAweDA1LAorMHg5OSwgMHgwNSwgMHhjMiwgMHgwNSwgMHhjMiwgMHgwNSwgMHhlYiwgMHgwNSwgMHhlYiwgMHgwNiwgMHgxNCwKKzB4MDYsIDB4MTQsIDB4MDYsIDB4M2QsIDB4MDYsIDB4M2QsIDB4MDYsIDB4NjYsIDB4MDYsIDB4NjYsIDB4MDYsCisweDhmLCAweDA2LCAweDhmLCAweDA2LCAweGI4LCAweDA2LCAweGI4LCAweDA2LCAweGUxLCAweDA2LCAweGUxLAorMHgwNywgMHgwYSwgMHgwNywgMHgwYSwgMHgwNywgMHgzMywgMHgwNywgMHgzMywgMHgwNywgMHg1YywgMHgwNywKKzB4NWMsIDB4MDcsIDB4ODUsIDB4MDcsIDB4ODUsIDB4MDcsIDB4YWUsIDB4MDcsIDB4YWUsIDB4MDcsIDB4ZDcsCisweDA3LCAweGQ3LCAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDA4LCAweDI4LCAweDA4LCAweDI4LCAweDA4LAorMHg1MSwgMHgwOCwgMHg1MSwgMHgwOCwgMHg3YSwgMHgwOCwgMHg3YSwgMHgwOCwgMHhhMywgMHgwOCwgMHhhMywKKzB4MDgsIDB4Y2MsIDB4MDgsIDB4Y2MsIDB4MDgsIDB4ZjUsIDB4MDgsIDB4ZjUsIDB4MDksIDB4MWUsIDB4MDksCisweDFlLCAweDA5LCAweDQ3LCAweDA5LCAweDQ3LCAweDA5LCAweDcwLCAweDA5LCAweDcwLCAweDA5LCAweDk5LAorMHgwOSwgMHg5OSwgMHgwOSwgMHhjMiwgMHgwOSwgMHhjMiwgMHgwOSwgMHhlYiwgMHgwOSwgMHhlYiwgMHgwYSwKKzB4MTQsIDB4MGEsIDB4MTQsIDB4MGEsIDB4M2QsIDB4MGEsIDB4M2QsIDB4MGEsIDB4NjYsIDB4MGEsIDB4NjYsCisweDBhLCAweDhmLCAweDBhLCAweDhmLCAweDBhLCAweGI4LCAweDBhLCAweGI4LCAweDBhLCAweGUxLCAweDBhLAorMHhlMSwgMHgwYiwgMHgwYSwgMHgwYiwgMHgwYSwgMHgwYiwgMHgzMywgMHgwYiwgMHgzMywgMHgwYiwgMHg1YywKKzB4MGIsIDB4NWMsIDB4MGIsIDB4ODUsIDB4MGIsIDB4ODUsIDB4MGIsIDB4YWUsIDB4MGIsIDB4YWUsIDB4MGIsCisweGQ3LCAweDBiLCAweGQ3LCAweDBjLCAweDAwLCAweDBjLCAweDAwLCAweDBjLCAweDI4LCAweDBjLCAweDI4LAorMHgwYywgMHg1MSwgMHgwYywgMHg1MSwgMHgwYywgMHg3YSwgMHgwYywgMHg3YSwgMHgwYywgMHhhMywgMHgwYywKKzB4YTMsIDB4MGMsIDB4Y2MsIDB4MGMsIDB4Y2MsIDB4MGMsIDB4ZjUsIDB4MGMsIDB4ZjUsIDB4MGQsIDB4MWUsCisweDBkLCAweDFlLCAweDBkLCAweDQ3LCAweDBkLCAweDQ3LCAweDBkLCAweDcwLCAweDBkLCAweDcwLCAweDBkLAorMHg5OSwgMHgwZCwgMHg5OSwgMHgwZCwgMHhjMiwgMHgwZCwgMHhjMiwgMHgwZCwgMHhlYiwgMHgwZCwgMHhlYiwKKzB4MGUsIDB4MTQsIDB4MGUsIDB4MTQsIDB4MGUsIDB4M2QsIDB4MGUsIDB4M2QsIDB4MGUsIDB4NjYsIDB4MGUsCisweDY2LCAweDBlLCAweDhmLCAweDBlLCAweDhmLCAweDBlLCAweGI4LCAweDBlLCAweGI4LCAweDBlLCAweGUxLAorMHgwZSwgMHhlMSwgMHgwZiwgMHgwYSwgMHgwZiwgMHgwYSwgMHgwZiwgMHgzMywgMHgwZiwgMHgzMywgMHgwZiwKKzB4NWMsIDB4MGYsIDB4NWMsIDB4MGYsIDB4ODUsIDB4MGYsIDB4ODUsIDB4MGYsIDB4YWUsIDB4MGYsIDB4YWUsCisweDBmLCAweGQ3LCAweDBmLCAweGQ3LCAweDBmLCAweGZmLCAweDBmLCAweGZmCit9OworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MveXNzMjI1LmggYi9zb3VuZC9vc3MveXNzMjI1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkOGI2YgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy95c3MyMjUuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9feXNzMjU1X2hfXworI2RlZmluZSBfX3lzczI1NV9oX18KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcGFnZV96ZXJvWzI1Nl07CitleHRlcm4gdW5zaWduZWQgY2hhciBwYWdlX29uZVsyNTZdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcGFnZV90d29bMTI4XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBhZ2VfdGhyZWVbMTI4XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBhZ2VfZm91clsxMjhdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcGFnZV9zaXhbMTkyXTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBhZ2Vfc2V2ZW5bMjU2XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBhZ2VfemVyb192Mls5Nl07CitleHRlcm4gdW5zaWduZWQgY2hhciBwYWdlX29uZV92Mls5Nl07CitleHRlcm4gdW5zaWduZWQgY2hhciBwYWdlX3R3b192Mls0OF07CitleHRlcm4gdW5zaWduZWQgY2hhciBwYWdlX3RocmVlX3YyWzQ4XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBhZ2VfZm91cl92Mls0OF07CitleHRlcm4gdW5zaWduZWQgY2hhciBwYWdlX3NldmVuX3YyWzk2XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIG1vZF92MlszMDRdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY29lZmZpY2llbnRzWzM2NF07CitleHRlcm4gdW5zaWduZWQgY2hhciBjb2VmZmljaWVudHMyWzU2XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGNvZWZmaWNpZW50czNbNDA0XTsKKworCisjZW5kaWYgLyogX195czIyNV9oX18gKi8KKwo=